参考 mini2440用户手册.pdf(我的在P19)可以知道板子上的 LED1~4是由 GPB5~8 控制的。
参考 s3c2440A User Manual.pdf (我的在P284)可以看到控制 GPB的3个寄存器 con data up分别在
0x56000010 0x56000014 0x56000018。
参考 mini2440原理图.pdf,可见LED不是必须上拉电阻配合才能工作。
下面是软件考虑:
1. 禁掉 watch dog。
2. 设置 GPBcon 的 5~8。
3. 设置 GPBdata 的 5~8。
4. 进入死循环。
.text
.global _start
_start:
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0] @ disable watch dog
ldr r0, =0x56000010 @ GPB con
ldr r1, =0x15400 @ set GPBcon 5~8
str r1, [r0], #4
ldr r1, =0 @ all GPBdata pins output 0
str r1, [r0], #4
_end:
b _end
编译参数取决于硬件设置,如果硬件设置从 nand 启动,那么片内ram地址在0x0000000,故编译命令为:
arm-linux-gcc -g -c -o led.o led.s
arm-linux-ld -Ttext 0x00000000 -g led.o -o led.elf
如果硬件设置从 nor 启动,片内地址在0x40000000,故编译命令为:
arm-linux-gcc -g -c -o led.o led.s
arm-linux-ld -Ttext 0x40000000 -g led.o -o led.elf
如果编译方式和硬件启动设置不匹配,那么在gdb load 时不会提示错误但作 c 后实际是按硬件设置方式运行的。例如硬件设置nor启动,片内ram在0x40000000但编译却指定 -Ttext 0x00000000,那么 gdb load 会看到
Loading section .text, size 0x24 lma 0x0
Start address 0x0, load size 36
硬件上此时0x00000000 是在nGCS0即 nor 控制中的并无片内ram可用,实际上加载是失败了,c 之后会运行 nor 里的原住程序。
有了以上准备工作和上一篇《mini2440 + jlink 第一步》介绍的 OpenOCD 调试技巧后就可以玩第一个简单程序 -- 点灯了:
1. openocd (已经配置好 jlink.cfg 和 mini2440.cfg)
2. telnet 127.0.0.1 4444 -> reset halt
3. arm-linux-gdb led.elf -> target remote 127.0.0.1:3333 -> load -> c
上述 1 2 3 是在3个不同控制台下完成的,-> 代表新一行的开始。如果看见4个LED 都亮了,而且板子没有1s后重启,恭喜你:随便改改,接着玩吧。