为什么要使用LED?
(bootloader,kernel)开发初期,由于串口等硬件尚未被初始化,因此调试手段相当有限,这时通常会采用LED来做为程序调试的重要手段。
LED驱动设计:
1、设置GPIO控制寄存器,把引脚设置为输出功能
2、根据原理图设置GPIO数据寄存器,点亮LED
.text .global _start _start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq _undefined_instruction: .word undefined_instruction _software_interrupt:.word software_interrupt _prefetch_abort:.word prefetch_abort _data_abort:.word data_abort _not_used:.word not_used _irq:.word irq _fiq:.word reset undefined_instruction: nop software_interrupt: nop prefetch_abort: nop data_abort: nop not_used: nop irq: nop fiq: nop reset: bl set_svc bl disable_watchdog bl disable_interrupt bl disable_mmu bl light_led set_svc: mrs r0, cpsr bic r0, r0, #0x1f orr r0, r0, #0xd3 msr cpsr, r0 mov pc, lr #define pwTCON 0x53000000 disable_watchdog: ldr r0, =pwTCON mov r1, #0x0 str r1, [r0] mov pc, lr disable_interrupt: mvn r1, #0x0 ldr r0, =0x4a000008 str r1,[r0] mov pc, lr disable_mmu: mcr p15,0,r0,c7,c7,0 mrc p15,0,r0,c1,c0,0 bic r0,r0,#0x00000007 mcr p15,0,r0,c1,c0,0 mov pc, lr #define GPBCON 0x56000010 #define GPBDAT 0x56000014 light_led: ldr r0, =GPBCON ldr r1, =0x15400 str r1,[r0] ldr r0, =GPBDAT ldr r1, =0x6bf str r1, [r0] mov pc, lr
黄色部分就是点亮LED的程序,我之前学51、K60、stm32的时候,发现这些设置寄存器是惊人的相似,都是先选择模式,在选择怎么输出。
6410的LED就是这样,但是如果把这个代码下载到开发板里面去,发现不行,这是因为我之前有一篇博客讲的是bootloader架构设计中讲到
#define GPBCON 0x7f008800 #define GPBDAT 0x7f008808 light_led: ldr r0, =GPBCON ldr r1, =0x11110000 str r1,[r0] ldr r0, =GPBDAT ldr r1, =0xa0 str r1, [r0] mov pc, lr
6410还需要外设基地址初始化,CP15寄存器里面有管理外设基地址的寄存器。
外设基地址是0x70000000,这个在6410手册里面搜索70000000就行
对于210开发板,还需要一个加头程序,程序链接:https://pan.baidu.com/s/1gfVTFgf 密码:44ry 用的话就在Linux下执行这个程序 ./mkv210 gboot goot-210
这样就生成了含有加头代码的gboot