-
Notifications
You must be signed in to change notification settings - Fork 139
/
bl2_main.c
108 lines (86 loc) · 2.88 KB
/
bl2_main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <debug.h>
#include <console.h>
#include <platform.h>
#include <bl2.h>
#include <string.h>
#include <delay_timer.h>
#ifdef RTOS_ENABLE_FREERTOS
int init_comm_info(int ret)
{
struct transfer_config_t *transfer_config = (struct transfer_config_t *)MAILBOX_FIELD;
struct transfer_config_t transfer_config_s;
unsigned char *ptr = (unsigned char *)&transfer_config_s;
unsigned short checksum = 0;
/* mailbox field is 4 byte write access, and can not access byte by byte.
* so init parameters and copy all to mailbox field together.
*/
transfer_config_s.conf_magic = RTOS_MAGIC_HEADER;
transfer_config_s.conf_size = ((uint64_t)&transfer_config_s.checksum - (uint64_t)&transfer_config_s.conf_magic);
transfer_config_s.isp_buffer_addr = CVIMMAP_ISP_MEM_BASE_ADDR;
transfer_config_s.isp_buffer_size = CVIMMAP_ISP_MEM_BASE_SIZE;
transfer_config_s.encode_img_addr = CVIMMAP_H26X_BITSTREAM_ADDR;
transfer_config_s.encode_img_size = CVIMMAP_H26X_BITSTREAM_SIZE;
transfer_config_s.encode_buf_addr = CVIMMAP_H26X_ENC_BUFF_ADDR;
transfer_config_s.encode_buf_size = CVIMMAP_H26X_ENC_BUFF_SIZE;
transfer_config_s.dump_print_enable = RTOS_DUMP_PRINT_ENABLE;
transfer_config_s.dump_print_size_idx = RTOS_DUMP_PRINT_SZ_IDX;
transfer_config_s.image_type = RTOS_FAST_IMAGE_TYPE;
transfer_config_s.mcu_status = MCU_STATUS_NONOS_DONE;
for (int i = 0; i < transfer_config_s.conf_size; i++) {
checksum += ptr[i];
}
transfer_config_s.checksum = checksum;
memcpy(transfer_config, &transfer_config_s, sizeof(struct transfer_config_t));
return ret;
}
#endif
#if !FSBL_SECURE_BOOT_SUPPORT
int dec_verify_image(const void *image, size_t size, size_t dec_skip, struct fip_param1 *fip_param1)
{
return 0;
}
#endif
// Start of addition
#define UART_DLL 0x04140000
#define UART_DLH 0x04140004
#define UART_LCR 0x0414000C
void set_baudrate()
{
// 14 for 115200, 13 for 128000
int baud_divisor = 14;
// set DLAB to 1 to set dll and dlh
*(volatile uint32_t*)(UART_LCR) |= (uint32_t)0x80;
// set divisor
*(volatile uint32_t*)(UART_DLL) = (uint32_t)(baud_divisor & 0xff);
*(volatile uint32_t*)(UART_DLH) = (uint32_t)((baud_divisor >> 8) & 0xff);
// set DLAB back to 0
*(volatile uint32_t*)(UART_LCR) &= (uint32_t)(~0x80);
}
// End of addition
void bl2_main(void)
{
// Start of addition
set_baudrate();
// End of addition
ATF_STATE = ATF_STATE_BL2_MAIN;
time_records->fsbl_start = read_time_ms();
NOTICE("\nFSBL %s:%s\n", version_string, build_message);
INFO("sw_info=0x%x\n", get_sw_info()->value);
INFO("fip_param1: param_cksum=0x%x param2_loadaddr=0x%x\n", fip_param1->param_cksum,
fip_param1->param2_loadaddr);
INFO("CP_STATE_REG=0x%x\n", mmio_read_32(0x0E000018));
// print_sram_log();
lock_efuse_chipsn();
setup_dl_flag();
switch_rtc_mode_1st_stage();
set_rtc_en_registers();
load_ddr();
#ifdef OD_CLK_SEL
load_rest_od_sel();
#else
load_rest();
#endif
NOTICE("BL2 end.\n");
while (1)
;
}