73 lines
1.9 KiB
C
73 lines
1.9 KiB
C
typedef unsigned int uint32_t;
|
||
typedef unsigned char uint8_t;
|
||
typedef void (*rom_t)(unsigned char fboot);
|
||
|
||
int main(int argc, char *argv[])
|
||
{
|
||
(void)argv;
|
||
uint32_t timer_start;
|
||
uint32_t cur_pc = (uint32_t)argc;
|
||
rom_t rom = (rom_t)0x20000;
|
||
uint8_t *uart_fifo = (uint8_t*)0x44001000;
|
||
uint32_t *gtmr_reg = (uint32_t *)0x40020000;
|
||
char flag = '3';
|
||
|
||
/* kl1 0x00fc1000, kl2 0x0ffd9000, kl3 0x10000800*/
|
||
if (0 == cur_pc >> 24) {
|
||
rom = (rom_t)0x30000;
|
||
uart_fifo = (uint8_t*)0x44001000;
|
||
gtmr_reg = (uint32_t*)0x44003000;
|
||
flag = '1';
|
||
|
||
/* apb enable */
|
||
*((uint32_t*)0x44000004) |= 0x1 << 2;
|
||
gtmr_reg[2] = 0xffffffff;
|
||
gtmr_reg[1] |= 0x1 << 4;
|
||
gtmr_reg[1] |= 0x1 << 1;
|
||
} else if (0xf == cur_pc >> 24) {
|
||
rom = (rom_t)0x30000;
|
||
uart_fifo = (uint8_t*)0x44001000;
|
||
gtmr_reg = (uint32_t*)0x44003000;
|
||
flag = '2';
|
||
|
||
gtmr_reg[2] = 0xffffffff;
|
||
gtmr_reg[1] |= 0x1 << 4;
|
||
gtmr_reg[1] |= 0x1 << 1;
|
||
} else if (0x10 == cur_pc >> 24) {
|
||
rom = (rom_t)0x20000;
|
||
uart_fifo = (uint8_t*)0x40010000;
|
||
gtmr_reg = (uint32_t*)0x40020000;
|
||
flag = '3';
|
||
} else {
|
||
/* 无法判断时,默认kl3 */
|
||
rom = (rom_t)0x20000;
|
||
uart_fifo = (uint8_t*)0x40010000;
|
||
gtmr_reg = (uint32_t*)0x40020000;
|
||
flag = '3';
|
||
}
|
||
|
||
timer_start = gtmr_reg[4];
|
||
while(1000 * 1000 > gtmr_reg[4] - timer_start);
|
||
|
||
/* 串口发送数据 */
|
||
uart_fifo[0] = '\r';
|
||
uart_fifo[0] = '\n';
|
||
uart_fifo[0] = 'K';
|
||
uart_fifo[0] = 'L';
|
||
uart_fifo[0] = flag;
|
||
|
||
/* version */
|
||
uart_fifo[0] = '-';
|
||
uart_fifo[0] = 'V';
|
||
uart_fifo[0] = '1';
|
||
uart_fifo[0] = '.';
|
||
uart_fifo[0] = '0';
|
||
|
||
/* 等待串口发送完成 */
|
||
timer_start = gtmr_reg[4];
|
||
while(1000 * 1000 > gtmr_reg[4] - timer_start);
|
||
|
||
rom(0);
|
||
}
|
||
|