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); }