新聞中心

dm6441的gpio驅(qū)動(dòng)

作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò) 收藏
這是我進(jìn)入嵌入式行業(yè)進(jìn)公司做的第一個(gè)驅(qū)動(dòng),

平臺(tái):Tidm6441linu2.6.18

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

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

對(duì)mux_cfg.c的分析

對(duì)MUX_CFG()的參數(shù)解釋
第一個(gè)是描述(和數(shù)據(jù)手冊(cè)p72上要對(duì)應(yīng)),第二個(gè)是pinmux0還是1,第三個(gè)是寄存器偏移。最后一個(gè)和調(diào)試有關(guān)的,
倒數(shù)第二個(gè)就是你需要給pinmux寄存器相應(yīng)位設(shè)置的值,倒數(shù)第三個(gè)就是pinmux相應(yīng)位全為1的值(掩碼值),
倒數(shù)第四個(gè)就是pinmux相應(yīng)位偏移值。如果你要改變引腳的模式,把對(duì)應(yīng)引腳設(shè)置成0,再把其他功能設(shè)為1。
(這是我的理解,參考下面的I2C和GPIO43_44設(shè)置)。
#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)
};

內(nèi)核里提供的接口在linux-2.6.18_pro500/arch/arm/mach-davinci目錄下的gpio.c,這個(gè)是寄存器級(jí)的驅(qū)動(dòng)。對(duì)這個(gè)文件的相關(guān)操作
見(jiàn)http://blog.csdn.net/langxing0508/archive/2008/12/25/3604043.aspx達(dá)芬奇DM644X平臺(tái)(ARM9, Linux-2.6.10)BSP之gpio.c淺析
說(shuō)得不錯(cuò),這里表示感謝。

下面是我的gpio驅(qū)動(dòng)程序

#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;
}


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: dm6441gpio驅(qū)

評(píng)論


技術(shù)專區(qū)

關(guān)閉