User LED电路图
User LED CPU管脚接线图
从电路图文档中可以看出,LED是通过GPIO的M端口实现的,其中分别用到了GPM0/1/2/3管脚。根据LED的接线图可以看出只有在NLED0/1/2/3为低电平时,才会导通点亮。M端口有6个管脚,三个对应的寄存器:
GPMCON是控制寄存器,控制管脚的功能:用作输入,输出等。
GPMDAT是数据寄存器,内容与管脚电平相一致,也即GPM0为高电平那么对应的0b1为1.
GPMPUD是用来控制功率输出的,通常在电平输出不符合要求是,实现电平的上拉和下拉。
相关寄存器文档(芯片手册300 pg.)
Bootloader中对应GPM初始化的代码位于board/samsung/smdk6410/lowlevel_init.S
- /* LED on only #8 */
- ldr r0, =ELFIN_GPIO_BASE
- ldr r1, =0x00111111
- str r1, [r0, #GPMCON_OFFSET]
-
- ldr r1, =0x00000555
- str r1, [r0, #GPMPUD_OFFSET]
-
- ldr r1, =0x002a
- str r1, [r0, #GPMDAT_OFFSET]
相关寄存器定义在include/s3c6410.h
- #define ELFIN_GPIO_BASE 0x7f008000
- #define GPMCON_OFFSET 0x820
- #define GPMDAT_OFFSET 0x824
- #define GPMPUD_OFFSET 0x828
ldr指令用来将立即数装载如寄存器,str将r1中的值写入间址GPMDAT_OFFSET+r0。ELFIN_GPIO_BASE定义的就是实际的物理地址,不难看出bootloader是实地址寻址的。
前3行写入0x00111111到GPMCON寄存器,也即配置GPM0-5为输出。
接着2行写入0x00000555到GPMPUD寄存器,配置GPM0-5内部电阻下拉使能。这是因为如果要点亮LED,那么需要低电平,下拉可以保证下拉电阻接地产生低电平。
最后2行写入0x002a到GPMDATA寄存器,也即0b101010,所以对应的GPM0/2/4是低电平,GPM1/3/5是高电平,与此相连的LED1/3点亮,LED2/4熄灭,这也就是为何开发板上电后LED1/3点亮的原因。
http://blog.chinaunix.net/space.php?uid=20608849&do=blog&id=2141924