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