硬件说明
按键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...