新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > dm6441的gpio驅動

dm6441的gpio驅動

作者: 時間:2016-11-26 來源:網絡 收藏
這是我進入嵌入式行業(yè)進公司做的第一個驅動,

平臺:Tidm6441linu2.6.18

本文引用地址:http://butianyuan.cn/article/201611/321880.htm

GPIO是嵌入式系統(tǒng)最簡單、最常用的資源了,比如點亮LED,控制蜂鳴器,輸出高低電平,檢測按鍵,等等。
由于硬件資源的原因,DM6441并不是GPIO管腳就是純粹的GPIO腳,GPIO管腳和其他一些標準接口復用相同的引腳,
比如SPI和GPIO復用,I2C和GPIO復用等,到底是使用GPIO還是其他接口,在初始化的時候,都需要對PINMUX0和PINMUX1
兩個寄存器進行設置(見DM6441的芯片p72),而軟件設置則在Montavista linux-2.6.18_pro500/arch/arm/mach-davinci
目錄下mux_cfg.c和對應的include/asm/arch-davinci/mux.h里。由數據手冊知道gpio5,6,7默認是gpio功能。

對mux_cfg.c的分析

對MUX_CFG()的參數解釋
第一個是描述(和數據手冊p72上要對應),第二個是pinmux0還是1,第三個是寄存器偏移。最后一個和調試有關的,
倒數第二個就是你需要給pinmux寄存器相應位設置的值,倒數第三個就是pinmux相應位全為1的值(掩碼值),
倒數第四個就是pinmux相應位偏移值。如果你要改變引腳的模式,把對應引腳設置成0,再把其他功能設為1。
(這是我的理解,參考下面的I2C和GPIO43_44設置)。
#include
#include

#include

#include
#include

#ifdef CONFIG_DAVINCI_MUX

struct pin_config __initdata_or_module davinci_dm644x_pins[] = {

MUX_CFG("HDIREN",0,16,1,1,1)
MUX_CFG("ATAEN",0,17,1,1,1)

MUX_CFG("MSTK",1,9,1,0,0)

MUX_CFG("I2C",1,7,1,1,0)

MUX_CFG("MCBSP",1,10,1,1,0)

MUX_CFG("PWM0",1,4,1,1,0)

MUX_CFG("PWM1",1,5,1,1,0)

MUX_CFG("PWM2",1,6,1,1,0)

MUX_CFG("VLINQEN",0,15,1,1,0)
MUX_CFG("VLINQWD",0,12,3,3,0)//pinmux上面是2位在表示所以0x11=33位就是111=7

MUX_CFG("EMACEN",0,31,1,1,1)

MUX_CFG("GPIO3V",0,31,1,0,1)

MUX_CFG("GPIO0",0,24,1,0,1)
MUX_CFG("GPIO3",0,25,1,0,0)
MUX_CFG("GPIO43_44",1,7,1,0,0)
MUX_CFG("GPIO46_47",0,22,1,0,1)

MUX_CFG("RGB666",0,22,1,1,1)

MUX_CFG("LOEEN",0,24,1,1,1)
MUX_CFG("LFLDEN",0,25,1,1,0)
};

內核里提供的接口在linux-2.6.18_pro500/arch/arm/mach-davinci目錄下的gpio.c,這個是寄存器級的驅動。對這個文件的相關操作
見http://blog.csdn.net/langxing0508/archive/2008/12/25/3604043.aspx達芬奇DM644X平臺(ARM9, Linux-2.6.10)BSP之gpio.c淺析
說得不錯,這里表示感謝。

下面是我的gpio驅動程序

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include

#include
#include
#include
#include
//#include
#define DEVICE_NAME "dm644x_gpios"
#define GPIO_MAJOR 199


#define ZX_GPIO55
#define ZX_GPIO66
#define ZX_GPIO77

static int davinci_dm644x_gpio_open(struct inode *inode, struct file *file)
{
printk("open gpio,here is driver/n");
const char *tag = NULL;
int gpio5_value;
int gpio6_value;
int gpio7_value;

//gpio_request(ZX_GPIO6, tag);
//gpio_set_value(ZX_GPIO6, 0);
//__gpio_set(ZX_GPIO6, 0);
//printk("%s/n", tag);
gpio_direction_output(ZX_GPIO5, 0);
gpio_direction_output(ZX_GPIO6, 0);
gpio_direction_output(ZX_GPIO7, 0);
gpio5_value = gpio_get_value(ZX_GPIO5);
gpio6_value = gpio_get_value(ZX_GPIO6);
gpio7_value = gpio_get_value(ZX_GPIO7);

printk("gpio5_value = %d, gpio6_value =%d , gpio7_value = %d/n", gpio5_value, gpio6_value, gpio7_value);
return 0;
}

static int gpio_release(struct inode *inode,struct file *filp)
{
return 0;
}


上一頁 1 2 下一頁

關鍵詞: dm6441gpio驅

評論


技術專區(qū)

關閉