基本概念:linux
1.GPIO--通用IO口,经过芯片针脚来控制或读取外设的数据。ide
2.GPIO口的使用原理,经过设置GPXXCON, GPXXDAT, GPXXPUL等寄存器来设置GPIO口的状态。oop
原理图:spa
跟硬件相关的部分,必定要阅读原理图,而后经过查找SoC的用户手册来查找相应的寄存器设置便可。code
底板电路图:blog
核心板电路图:内存
可知在OK6410上4个LED灯是经过GPM这一组的GPIO口控制的,分别是GPM0-GPM3四组。开发
而后打开S3C6410X User's Manual,查找GPM相关的寄存器:event
经过上面内容找到:class
GPMCON 地址 0x7F008820
GPMDAT 地址 0x7F008824
因为LED链接着GPM0-GPM3,因此经过上面的内容能够知道,GPMCON设置的值应该为0x00001111,意思是将GPM0-GPM3设置为输出,这样经过设置GPMDAT[5:0]来控制响应针脚的高低电平,使LED亮或灭。
代码:(如下代码参考了友善之臂Tiny6410的汇编代码,并不是原创)
汇编代码:
1 .global _start 2 3 _start: 4 // 把外设的基地址告诉CPU 5 ldr r0, =0x70000000//对于6410来讲,内存(0x000000000x60000000),外设(0x70000000-0x7fffffff) 6 orr r0, r0, #0x13 //外设大小:256M 7 mcr p15,0,r0,c15,c2,4 //把r0的值(包括了外设基地址+外设大小)告诉cpu 8 9 // 关看门狗 10 ldr r0, =0x7E004000 11 mov r1, #0 12 str r1, [r0] 13 14 // 设置GPMCON0 15 ldr r1, =0x7F008820 16 ldr r0, =0x00001111 17 str r0, [r1] 18 19 mov r2, #0x1000 20 led_blink: 21 // 设置GPMDAT,使GPM_0/1/2/3引脚输出低电平,LED亮 22 ldr r1, =0x7F008824 23 mov r0, #0 24 str r0, [r1] 25 26 // 延时 27 bl delay 28 29 // 设置GPMDAT,使GPM_0/1/2/3引脚输出高电平,LED灭 30 ldr r1, =0x7F008824 31 mov r0, #0x0f 32 str r0, [r1] 33 34 // 延时 35 bl delay 36 37 sub r2, r2, #1 38 cmp r2,#0 39 bne led_blink 40 41 halt: 42 b halt 43 44 45 delay: 46 mov r0, #0x1000000 47 delay_loop: 48 cmp r0, #0 49 sub r0, r0, #1 50 bne delay_loop 51 mov pc, lr
Makefile:
1 led.bin: start.o 2 arm-linux-ld -Ttext 0x50008000 -o led.elf $^ 3 arm-linux-objcopy -O binary led.elf led.bin 4 arm-linux-objdump -D led.elf > led_elf.dis 5 %.o : %.S 6 arm-linux-gcc -o $@ $< -c 7 8 %.o : %.c 9 arm-linux-gcc -o $@ $< -c 10 11 clean: 12 rm *.o *.elf *.bin *.dis -rf
而后make,能够获得led.bin,经过tftp下载到开发板中:
而后就能够看到OK6410板上的四个LED灯开始一块儿闪烁。
总结:
1.GPIO口的使用实际上是SoC外设控制中最简单的,只要抓住GPIO的几个寄存器,将他们的值设置正确,就能够完成相应的控制功能。
2.必定要学会查看SoC的User's Manual的方法,这样当SoC换成其余品牌时,能够以不变应万变。
3.使用ld来连接.o文件时,通常会指定-Ttext选项,表示该代码会在内存的哪一个地址加载,经过查看User's Manual,你能够决定这个地址的范围,以下图,0x50000000-0x6FFFFFFF地址区间映射到DRAM上,因此绝大部分的资料中,S3C6410中的内存地址都是0x5xxxxxxx相似的地址。也有一些0xcxxxxxxx相似的地址,这是打开SoC中的MMU后进行物理地址和虚拟地址映射后的结果,若是打开了MMU,就可使用0xcxxxxxxx这样的地址,不然没法使用。