NanoPC裸机LED操作

这个寒假准备认真研究一下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的内容也需要做响应的改写。

原文地址:https://www.cnblogs.com/brep/p/5132486.html