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