您的位置 首页 ADAS

dm6441的gpio驱动

这是我进入嵌入式行业进公司做的第一个驱动,平台:Tidm6441linu2618GPIO是嵌入式系统最简单、最常用的资源了,比如点亮LED,控制蜂鸣器

这是我进入嵌入式职业进公司做的第一个驱动,

渠道:Tidm6441linu2.6.18

GPIO是嵌入式体系最简略、最常用的资源了,比方点亮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;
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/258372.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部