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