am3359 gpio 驅動設計
開發板:英蓓特科技****的mini8600b
處理器:ti 公司的am3359
作業系統:linux 3.2.0
一、gpio 資源簡介
am3359 包含四組gpio 引腳,gpio0~gpio3,每組32 根線,共128 根gpio 引腳。
二、配置gpio 引腳
在以下檔案linux-3.2.0-psp04.06.00.08.sdk/arch/arm/mach-omap2/board-am335xevm.c
中配置:
1、新增如下引腳配置**
/*pin mux for fifo writing*/
static struct pinmux_config fifo_pin_mux = ,,,
,,,,
};2、新增初始化函式fifo_init(),呼叫setup_pin_mux()使引腳配置生效:
static void fifo_init(int evm_id, int profile)
3、在結構體evm_dev_cfg sbc8600_dev_cfg中新增
,系統初始化的時候會呼叫下面的函式:
_configure_device(evm_sk, sbc8600_dev_cfg, profile_none);
4、注意事項
引腳配置不應有衝突,即不應有兩個或以上的驅動配置相同的引腳,同乙個引腳不應被
配置兩次或多次不同的數值。
三、驅動設計
1、除一般驅動所要的標頭檔案外,還需包含的標頭檔案
#include // gpio operation
#include
#include
#include
2、gpio 引腳定義
#define gpio_to_pin(bank, gpio) ((32 * (bank)) + (gpio))
#define gpmc_csn1_reset gpio_to_pin(1, 30) /*fifo reset*/
#define gpmc_csn2_ef gpio_to_pin(1, 31) /*fifo empty flag*/
#define gpmc_csn3_irq gpio_to_pin(2, 0) /*中斷訊號*/
#define gpmc_clk_irq gpio_to_pin(2, 1) /*中斷訊號*/
#define lcd_vsync_trmode gpio_to_pin(2, 22)/*傳輸狀態位*/
#define lcd_pclk_trmode gpio_to_pin(2, 24)/*傳輸狀態位*/
3、申請gpio 引腳
在裝置開啟時申請,即在驅動的open()函式中呼叫gpio_request(gpio_pin,)申請gpio 引
腳,第乙個引數是gpio 引腳號,第二個引數是引腳名字,由自己定。
4、設定gpio 引腳的功能
在裝置開啟時設定,
gpio_direction_input(gpio_pin)設定引腳為輸入模式,
gpio_direction_output(gpio_pin, value)設定引腳為輸出模式,同時通過第二個引數可置引
腳的電平高低
5、設定/獲得gpio 引腳電平
gpio_set_value(gpio_pin, value)設定gpio 引腳電平;
value = gpio_get_value(gpio_pin) 獲取gpio 引腳電平;
6、中斷
gpio 引腳號轉換為中斷號: irq_num = gpio_to_irq(gpio_pin);
設定中斷出發方式為下降沿觸發irq_set_irq_type(irq_num, irqf_trigger_falling);
申請中斷:
request_irq(irq_num, irq_proc, irqf_disabled, gpio_device_name, null);
中斷處理函式:
static irqreturn_t irq_proc(int irq, void *dev_id)
中斷型別irqf_disabled 表示此中斷處理函式呼叫時,遮蔽所有中斷,更多資訊可
在標頭檔案與中找到。
7、釋放gpio 資源
gpio_free(gpio_pin);
8、釋放中斷資源
free_irq(irq_num, null);
9、驅動源程式
見附件四、makefile
arch=arm
cross_compile=/opt/arm-2009q1/bin/arm-none-linux-gnueabi-
kerneldir := /home/linfan/linux-3.2.0-psp04.06.00.08.sdk
obj-m := gpio_read.o
pwd := $(shell pwd)
default:
$(make) -c $(kerneldir) m=$(pwd) arch=$(arch)
cross_compile=$(cross_compile) modules
arm-none-linux-gnueabi-gcc test_read.c -o read
clean:
rm -rf *.o *.ko *.mod.c write *.symvers *.order
五、使用者空間應用程式
見附件六、總結
am3359 的驅動設計要在board-am335xevm.c 中定義裝置和配置引腳,然後再編譯
核心,生成映像檔案,頗有不便之處。我在編寫這個gpio 引腳的驅動時,大部分時間
花在修改核心原始碼及編譯核心之上。曾試圖將裝置定義及引腳配置都轉移出來,放到自
己的驅動中實現,但編譯驅動時error 一大堆。引腳配置呼叫函式setup_pin_mux,而該
函式實際上呼叫omap_mux_init_signal 來實現,按照error 提示#include 了所需的標頭檔案
後,編譯又提示相關的函式undefined。最終還是沒能實現在自己的驅動中定義裝置和
配置引腳,這個問題留待以後有時間再研究。
後來看了am3359 的datasheet,發現引腳模式的配置是通過control module 來實現
的,即配置control_module registers。一種可行的辦法是,查到相關暫存器的物理
位址,用ioremap 函式轉換為虛擬位址,然後往該位址中寫配置data,就可以將引腳配置
為你想要的模式了。但這種操作是不安全的,因為你不知道你的linux 系統中有沒有驅動用
掉了你配置的那些引腳,一旦有引腳配置的衝突,結果是不可預知的。只有在確保你想配
置的引腳未被使用,未與其他驅動發生衝突時,才建議用這種方法。這樣一來,還是要查
看board-am335xevm.c 的**,如果有衝突,還是要修改裡面的**,重新編譯核心。
AM3359 GPIO 驅動設計
am3359 gpio 驅動設計 開發板 英蓓特科技 的mini8600b 處理器 ti 公司的am3359 作業系統 linux 3.2.0 一 gpio 資源簡介 am3359 包含四組gpio 引腳,gpio0 gpio3,每組32 根線,共128 根gpio 引腳。二 配置gpio 引腳 在...