AM3359 GPIO 驅動設計

AM3359 GPIO 驅動設計
開發板:英蓓特科技有限公司的Mini8600B
處理器:TI 公司的AM3359
操作系統:Linux 3.2.0
一、GPIO 資源簡介
AM3359 包含四組GPIO 引腳,GPIO0~GPIO3,每組32 根線,共128 根GPIO 引腳。
GPIO0 寄存器基地址:0x44E0_7000
GPIO1 寄存器基地址:0x4804_C000
GPIO2 寄存器基地址:0x481A_C000
GPIO3 寄存器基地址:0x481A_E000
二、配置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[] = {
{"gpmc_csn1.gpio1_30", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
{"gpmc_csn2.gpio1_31", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
{"gpmc_csn3.gpio2_0", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
{"gpmc_clk.gpio2_1", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
{"lcd_vsync.gpio2_22", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
{"lcd_pclk.gpio2_24", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
{NULL, 0},
};
2、添加初始化函數fifo_init(),調用setup_pin_mux()使引腳配置生效:
static void fifo_init(int evm_id, int profile)
{
setup_pin_mux(fifo_pin_mux);
return;
}
3、在結構體evm_dev_cfg sbc8600_dev_cfg[]中添加
{fifo_init, DEV_ON_BASEBOARD, PROFILE_ALL},
系統初始化的時候會調用下面的函數:
_configure_device(EVM_SK, sbc8600_dev_cfg, PROFILE_NONE);
4、注意事項
引腳配置不應有衝突,即不應有兩個或以上的驅動配置相同的引腳,同一個引腳不應被
配置兩次或多次不同的數值。
5、編譯內核,生成uImage 文件,下載到開發板上。
三、驅動設計
1、除一般驅動所要的頭文件外,還需包含的頭文件
#include <asm/gpio.h> // gpio operation
#include <asm/io.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
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)
{
// your code
return IRQ_HANDLED;
}
中斷類型IRQF_DISABLED 表示此中斷處理函數調用時,屏蔽所有中斷,更多信息可
在頭文件<linux/interrupt.h> 與<linux/irq.h>中找到。
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
app:
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 的代碼,如果有衝突,還是要修改裏面的代碼,重新編譯內核。


http://blog.chinaunix.NET/uid-28818752-id-3624349.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章