Davinci DM6446开发攻略——LINUX GPIO驱动源码移植
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-04-16
一、 DM6446 GPIO的介绍 说到LINUX 驱动移植,没有移植过的朋友,或刚刚进入LINUX领域的朋友,最好去看看《LINUX 设备驱动程序》第三版,有个理论或感性的认识.该版本是基于2.6.10的基础上描述的,经典读物,网上有电子版,但是建议花几十元买本书是值得的. GPIO是嵌入式系统最简单、最常用的资源了,比如点亮LED,控制蜂鸣器,输出高低电平,检测按键,等等.GPIO分输入和输出,在Montavista linux-2.6.18中,有关GPIO的最底层的寄存器驱动,是在linux-2.6.18_pro500\arch\arm\mach-davinci目录下的gpio.c,这个是寄存器级的驱动,搞过单片机MCU的朋友应该比较熟悉寄存器级的驱动.根据DM6446的芯片DATASHEET,DM6446的GPIO分为3组BANK,BANK01组包括GPIO0~GPIO31,BANK23组包括GPIO32~GPIO63,BANK45组包括GPIO64~GPIO70,硬件资源的原因,DM6446并不是GPIO管脚就是纯粹的GPIO脚,GPIO管脚和其他一些标准接口复用相同的引脚,比如SPI和GPIO复用,I2C和GPIO复用等,到底是使用GPIO还是其他接口,在初始化的时候,都需要对PINMUX0和PINMUX1两个寄存器进行设置(见DM6446的芯片DATASHEET第3章),而软件设置则在Montavista linux-2.6.18_pro500\arch\arm\mach-davinci目录下mux_cfg.c和对应的mux.h里.本人这里使用GPIO10、GPIO12、GPIO28,分别对应控制BUZZER、LED1、LED0,不需要对mux_cfg.c和mux.h进行修改.我们把这些GPIO应用归入linux字符设备来移植. 二、GPIO源码移植分析 /* drivers/char/davinci_dm644x_gpios.c*/ #include <linux/device.h> #include <linux/fs.h> #include <linux/module.h> #include <linux/errno.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/platform_device.h> #include <linux/types.h> #include <linux/cdev.h> #include <asm/uaccess.h> #include <asm/io.h> #include <asm/arch/hardware.h> #include <asm/arch/gpio.h> #define DEVICE_NAME "dm644x_gpios" /*定义设备驱动的名字,或设备节点名称*/ #define GPIO_MAJOR 199 /*使用 cat /proc/devices查看不要和存在的char节点重复*/ /*my app gpio define*/ #define DM644X_GPIO_BUZZER 10 /*GPIO10*/ #define DM644X_GPIO_LED1 12 /*GPIO10*/ #define DM644X_GPIO_LED0 28 /*GPIO10*/ static int davinci_dm644x_gpio_open(struct inode *inode, struct file *file) { return 0;/*该函数可以什么都不做,也可以加入类似初始化的设置*/ } static int davinci_dm644x_gpio_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { switch(cmd) /*cmd 表示应用程序传入的led动作,是on 还是off*/ { case 0: //gpio = 0 if(0==arg) /*arg由自己硬件电路决定使用那些GPIO*/ { gpio_direction_output(DM644X_GPIO_LED0, 0);/*调用TI linux-2.6.18寄存器驱动*/ } else if(1==arg) { gpio_direction_output(DM644X_GPIO_LED1, 0); } else if(2==arg) { gpio_direction_output(DM644X_GPIO_BUZZER, 0); } else { return -EINVAL; } break; |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: linux 更改用户权限下一篇: 无法进入init 3 字符界面
关于Davinci DM6446开发攻略——LINUX GPIO驱动源码移植的所有评论