基本概念:
1.GPIO--通用IO口,通過晶片針腳來控制或讀取外設的資料。
2.GPIO口的使用原理,通過設定GPXXCON, GPXXDAT, GPXXPUL等寄存器來設定GPIO口的狀态。
原理圖:
跟硬體相關的部分,一定要閱讀原理圖,然後通過查找SoC的使用者手冊來查找相應的寄存器設定即可。
底闆電路圖:

核心闆電路圖:
可知在OK6410上4個LED燈是通過GPM這一組的GPIO口控制的,分别是GPM0-GPM3四組。
然後打開S3C6410X User's Manual,查找GPM相關的寄存器:
通過上面内容找到:
GPMCON 位址 0x7F008820
GPMDAT 位址 0x7F008824
由于LED連接配接着GPM0-GPM3,是以通過上面的内容可以知道,GPMCON設定的值應該為0x00001111,意思是将GPM0-GPM3設定為輸出,這樣通過設定GPMDAT[5:0]來控制響應針腳的高低電平,使LED亮或滅。
代碼:(以下代碼參考了友善之臂Tiny6410的彙編代碼,并非原創)
彙編代碼:
start.S
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 [email protected] $< -c
7
8 %.o : %.c
9 arm-linux-gcc -o [email protected] $< -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這樣的位址,否則無法使用。