硬件说明
按键KEYINT3 练到s3c6410的GPN2脚,且键按下时,GPN2脚为低电平。
GPN配置寄存器GPNCON的地址为0x7F008830, 且[5:4] 位配置为00时,表示GPN2脚用于输入功能。
GPN数据寄存器GPNDAT的地址为0x7F008834,且读取[2]位就能得到GPN2脚的电平状态。
GPN上拉控制寄存器GPNPUD 的地址为0x7F008838。
代码文件key.S
- .text
- .global main
- main:
- stmfd sp!, {r0-r12, lr}
- ldr r0, =0
- ldr r1, GPNCON
- str r0, [r1]
- check:
- ldr r1, GPNDAT
- ldr r0, [r1]
- and r0, r0, #(1 << 1)
- cmp r0, #0
- bne check
- ldr r0, =mystr
- mov lr, pc
- ldr pc, printf
- bl delay
- b check
- ldmfd sp!, {r0-r12, pc}
- .global delay
- delay:
- stmfd sp!, {lr}
- ldr r2, =0xffffff
- dloop:
- subs r2, r2, #1
- bne dloop
- ldmfd sp!, {pc}
- GPNCON:
- .word 0x7F008830
- GPNDAT:
- .word 0x7F008834
- GPNPUD:
- .word 0X7F008838
- printf:
- .word 0x57e11df8
- mystr:
- .string "key pressed...\n"
- .align 4
把u-boot编译为nandflash启动,然后运行下面命令
输出结果
- # arm-none-linux-gnueabi-nm u-boot | grep printf
可知道printf函数在nandflash的地址为0x57e11df8,我们可以通过汇编直接调用它。
- 57e11d68 T fprintf
- 57e11df8 T printf
- 57e11fdc T serial_printf
- 57e1917c T sprintf
- 57e11dcc T vprintf
- 57e18d78 T vsprintf
连接脚本key.lds
获得lds脚本模板
修改为
- # arm-none-linux-gnueabi-ld --verbose > key.lds
- OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
- "elf32-littlearm")
- OUTPUT_ARCH(arm)
- ENTRY(main)
- SECTIONS
- {
- . = 0x50008000 ;
- .text :
- {
- *(.text) ;
- }
- .align = 4 ;
- }
编译程序
- # arm-none-linux-gnueabi-gcc -c key.S -o key.o
- # arm-none-linux-gnueabi-ld -T key.lds key.o -o key
- # arm-none-linux-gnueabi-objcopy -O binary key /tftpboot/key.bin
运行程序
在u-boot命令状态
- $ tftp 0x50008000 key.bin
- $ go 0x50008000
运行结果
按下按键,则打印
- key pressed...
- key pressed...
- key pressed...
- key pressed...