嵌入式Linux移植8.OK335xd,AM335x,GPIO移植,添加GPIO(按鍵,LED)

環境:

Windows10

vmware+Ubuntu12.04
OK335xd+am3354(forlinx家的板子)

DIY目標:

使用無線遙控一輛運行有Linux控制的小車,小車執行部件算總共2個電機,一個控制方向,一個控制動力,每個都需要實現正反轉,所以需要4個IO配合4路繼電器來實現(手頭就這種硬件條件)

近日移植IO,操作目的是添加自己的按鍵,LED,也就是通用IO的輸入輸出,爲了用於,但是文章侷限於系統底層,未用應用程序測試,只用shell驗證了一下GPIO添加成功,使用的是gpio的sysfs模式

坑點:

飛凌給的應用手冊和官方論壇知識庫中有GPIO的添加方法,但是是錯的,不應該在board-am335xevm.c操作,而是在board-am335xevm-xd.c這個板級文件中修改,按照手冊等試了1天多近兩天沒有任何結果,接近崩潰之際突然想起一個細節,將board-am335xevm.c刪了也會編譯通過,而且改了其中的按鍵名稱運行完也不變,但是使用patch文件給board-am335xevm.c打補丁後程序運行出不同結果。。被這種假象干擾了好久,其實也是補丁修改了別的文件導致的變化。。。最終死馬當活馬醫改了下board-am335xevm-xd.c。。。。。頓時通開。。。第二個巨坑

收穫:

1.必須搞明白kernel編譯的機制

2.必須熟悉各種常用指令echo ,cat ,patch等,,,之前一直以爲遇到再學發現不行,很浪費時間最好先學一下

3.差不多搞明白了patch打包的流程

4.Linux調試和以前硬件調試思路很不同,細節很重要,得形成自己的調試思路

添加按鍵(輸入IO)的步驟:

1.查看手冊,原理圖找到可以使用的通用IO

2.修改板級文件board-am335xevm-xd.c

/* pinmux for gpio based key */
static struct pinmux_config gpio_keys_pin_mux_forlinx[] = {
#if defined(CONFIG_OK335XD) 
    {"gpmc_a4.gpio1_20", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a5.gpio1_21", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a6.gpio1_22", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a7.gpio1_23", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a8.gpio1_24", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a9.gpio1_25", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

    {"gpmc_ad14.gpio1_14", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},//仿照上面添加自己的按鍵IO

 

static struct pinmux_config gpio_led_mux[] = {
#if defined(CONFIG_OK335XD)
    {"gpmc_a0.gpio1_16", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a1.gpio1_17", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    {"gpmc_a2.gpio1_18", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

    {"gpmc_a3.gpio1_19", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},//添加自己的LEDIO
    {"emu1.gpio3_8", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},

3.註釋掉別的用我們添的IO的地方

4.保存,編譯內核,重啓板子運行內核

5.執行指令(引腳號不對應,隨便舉個例子)

注意:按鍵和LED的IO號註冊需要滿足條件


舉個栗子(具體 GPIO 需要參考數據手冊),如果使想用 GPIO1_20,那麼引腳編號就可能等於 1 x 32 + 20 = 54

引腳讀數計算方法
一般可以這樣計算 GPIOn_IOx = n*32 + x

 

gpio1_14   按鍵控制步驟
echo 46 > /sys/class/gpio/export
cat /sys/kernel/debug/gpio
cat /sys/class/gpio/gpio46/value   / /此句的作用就是讀取引腳的電平值,輸出0或1

gpio1_15   LED控制步驟
echo 47 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio47/direction 
echo 1 > /sys/class/gpio/gpio47/value
echo 0 > /sys/class/gpio/gpio47/value  

附按鍵執行結果,LED的直接量電壓就可以了

備註:雖然沒用到,記錄一下patch相關指令

patch -bp1 < xxx.patch  打補丁,要打補丁的文件放到一起到要打補丁文件

patch -p1 < xxx.patch     打補丁,可以針對文件夾打補丁

patch -Rp1 < xxx.patch  撤銷補丁

注意事項,打補丁時原文件必須是補丁裏規定的原版,不能手動改動原文件之後再打補丁或者撤銷補丁

 

至此,Linux遙控小車的電機舵機齊了,下一步就是建立通信,移植一下串口通信

 

 


 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章