AM3359 GPIO 驅動設計

2021-06-18 12:02:47 字數 3432 閱讀 5335

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 引腳 在...