这个寒假准备认真研究一下NanoPC,我的开发环境:
- 开发板:NanoPC-T1
- 宿主机:VirtualBox for Mac, ubuntukylin-15.10-desktop-i386(32位)
- 交叉编译工具:arm-linux-gcc-4.5.1
一、硬件原理说明
NanoPC上有两个LED,位置如下图所示:
在原理图中搜索“LED”,查看相关电路:
由原理图可知,NanoPC上的两个LED灯,分别由GPM4_0和GPM4_1控制,当GPIO引脚为高电平时,LED灯熄灭,当GPIO的引脚为低电平时LED点亮。我们要做的就是编写程序,将GPM4_0和GPM4_1设置为输出功能,通过控制输出电平即可控制LED灯。
二、编写程序
查Exynos4412手册,可知GPM4的控制寄存器为GPM4CON,地址为0x11000000+0x2E0,GPM4_0由GPM4CON[3:0]控制,GPM4_1由GPM4CON[7:4]控制,要想将端口设置为输出,只需将0x1写入响应控制位即可。GPM4的数据寄存器为GPM4DAT,地址为0x11000000+0x2E4,欲点亮LED1只需将GPM4DAT的bit[0]设为0,欲点亮LED2只需将GPM4DAT的bit[1]设为0。
.text .global _start _start: /* set GPM4 as output */ ldr r0, =0x110002E0 /* address of GPM4CON */ ldr r1, [r0] /* read the value of GPM4CON to r1 */ bic r1, r1, #0xff /* clear bit[7:0] */ orr r1, r1, #0x11 @ set bit[7:0] = 0b00010001 str r1, [r0] @ write back to GPM4CON @ set GPM4DAT[0] and GPM4DAT[1] to low turn on the leds @ set GPM4DAT[0] and GPM4DAT[1] to high turn off the leds ldr r0, =0x110002E4 @ address of GPM4DAT ldr r1, [r0] @ read out the data loop: bic r1, r1, #0x3 @ light on the two leds str r1, [r0] @ write back to GPM4DAT ldr r2, =0xffffff bl delay bic r1, r1, #0x3 orr r1, r1, #1 @ set bit[0]=0 turn on LED1 str r1, [r0] ldr r2, =0xffffff bl delay bic r1, r1, #0x3 orr r1, r1, #2 @ set bit[1]=0 turn on LED2 str r1, [r0] ldr r2, =0xffffff bl delay orr r1, r1, #0x3 str r1, [r0] @ turn off the two leds ldr r2, =0xffffff bl delay b loop delay: sub r2, r2, #1 cmp r2, #0x0 bne delay mov pc, lr
Makefile:
led.bin: led.s arm-linux-gcc -c -o led.o led.s arm-linux-ld -Tled.lds -N led.o -o led.elf arm-linux-objcopy -O binary -S led.elf led.bin arm-linux-objdump -D -m arm led.elf > led.dis clean: rm -f *.dis *.bin *.elf *.o
链接脚本led.lds:
SECTIONS { . = 0x02023400; .text : { *(.text) } .rodata ALIGN(4) : { *(.rodata*) } .data ALIGN(4) : { *(.data*) } .bss ALIGN(4) : { *(.bss) *(COMMON) } }
BL1把BL2(用mkbl2工具把我们的led.bin处理成BL2)复制到0x02023400处,然后执行它。
mkbl2由V310-EVT1-mkbl2.c编译而成,因为我们的程序比较短,需要对这个文件进行改写,注释掉其中的长度检查部分。
用sd_fusing将BL1,BL2烧写在SD卡上,NanoPC上电后从SD卡启动,可以看到“双灯亮、LED1亮、LED2亮、双灯灭”不断循环。
sd_fusing的内容也需要做响应的改写。