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