MINI2440 LED驱动程序.doc_第1页
MINI2440 LED驱动程序.doc_第2页
MINI2440 LED驱动程序.doc_第3页
MINI2440 LED驱动程序.doc_第4页
MINI2440 LED驱动程序.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MINI2440 LED 驱动程序驱动程序 app led 1 回车灯全亮 app led 0 回车 灯全熄了 真是太令我激动 这可是在 linux 下的操作 Linux 下的驱动程序 呵呵 以前我学单片机的时候 郭天祥讲的第一个实验 就是点灯实验 那个时候也很激动 感觉真是神奇几句程序就能控制灯的亮 熄 就是从 单片机的这个点灯实验开始 我也算是入了单片机的门 后面在电子设计大赛中 和帮别 人做的一些东西中 获得了一些成就感 随后我又在 arm7 那块板子上做了裸板的流水灯 实验 今天终于在传说中的 linux 中实现了点灯的实验 到现在我都搞了近一年的嵌入式 学习了 今天算了感觉有了点门道 为什么这么说呢 以前是有例程 但是不知道环境怎 么搭建 也就没法做实验 学习当然就没有进步 而今天这个环境被搭建起来了 虽然说 只是一个点灯实验 但是以后的大量的实验都可以做了 总算有了可以走的路了 一 看效果 这个实验基于昨天搭建好的环境 minicom linux 内核 NFS 起根文件系统 这个环境的 搭建也一件相当痛苦的事情 现在在学习驱动程序就不过多的去关注这个东西 这个还得 专门作为一个话题来学习 总之现在的环境就是 minicom 中是开发板上面的 linux 系统 这里的文件系统是通过 NFS 起根文件系统 也就是说这个路径是可以和宿主机的进行共享 的 在宿舍机上写的程序利用交叉编译工具编译 然后拷贝到 NFS 根文件系统 就可以在 开发板上 linux 中运行 也就可以去控制开发板了 这里对内核所做的一小点修改就是内 核配置时去掉 驱动程序 字符设备驱动 LED Support for Mini2440 QQ2440 GPIO LEDs 免得它和我写的冲突 写好的驱动程序 和相应的应用测试程序位于宿主机的 home 532 526 下直接 make 得 mini2440 leds misc ko 驱动模块 然后 arm linux gcc app led c o app led 生成 app led 的应用程序 将 mini2440 leds misc ko 和 app led 拷贝到 NFS 起根文 件系统的 tmp 目录下 然后换到 minicom 中的 linux ls tmp 就可以看到刚才拷贝过去 的两个文件 执行 insmod mini2440 leds misc ko 按以前还得创建设备文件但是这 个程序为我们自动创建了设备文件 dev leds 然后 app led 1 回车灯全亮 app led 0 回车 灯全熄了 二 点灯实验代码分析 1 所用到的知识 首先来看一下这个驱动程序中所用到一些知识 A IOCTL 方法 这个在前面已经学习过了 它的实现主要分为两步 定义命令 实现命令 定义命令放在了 memdev h 这个头文件中 如下代码 定义幻数 define MEMDEV IOC MAGIC k 定义命令 define MEMDEV IOCON IO MEMDEV IOC MAGIC 1 define MEMDEV IOCOFF IO MEMDEV IOC MAGIC 2 define MEMDEV IOC MAXNR 2 由上面可知定义了两个命令 这也是这个驱动程序的整体功能 四个灯的全亮 和全灭 实现命令如下 static int sbc2440 leds ioctl struct inode inode struct file file unsigned int cmd unsigned long arg int i 0 检测命令的有效性 if IOC TYPE cmd MEMDEV IOC MAGIC return EINVAL if IOC NR cmd MEMDEV IOC MAXNR return EINVAL 根据命令 执行相应的操作 switch cmd case MEMDEV IOCOFF 灯全灭 cmd 1 for i 0 i 4 i s3c2410 gpio setpin led table i cmd return 0 case MEMDEV IOCON 灯全亮 for i 0 i 4 i s3c2410 gpio setpin led table i cmd return 0 default return EINVAL 这里就是将定义的两个操作实现了 文件操作结构体 static struct file operations dev fops owner THIS MODULE ioctl sbc2440 leds ioctl 然后将实现的操作赋值给 file operations 的成员 ioctl B 混杂字符设备 所有的驱动程序都应该对应一个具体的设备 这个 LED 驱动当然设备应该是 LED 但是 linux 将它分成了一类叫做混杂设备 这类设备共享一个主设备号 但次设备号不同 所有混杂设备形成一个链表 要访问一个设备时根据次设备号来查找相应的 miscdevice linux 中用 struct miscdevice 来描述一个混杂设备 struct miscdevice int minor 次设备号 const char name 设备名 const struct file operations fops 文件操作集 struct list head list struct device parent struct device this device int misc register struct miscdevice 注册一个混杂设备 C 关于 LED 的一些操作 在这个驱动程序当中对 led 的操作就用到了两个函数 int i 设置 GPIO 控制寄存器 GPIO 设置为输出模式 默认下灯全灭 for i 0 i 4 i s3c2410 gpio cfgpin led table i led cfg table i s3c2410 gpio setpin led table i 1 led table 和 led cfg table 定义如下 static unsigned long led table S3C2410 GPB5 S3C2410 GPB6 S3C2410 GPB7 S3C2410 GPB8 static unsigned int led cfg table S3C2410 GPB5 OUTP S3C2410 GPB6 OUTP S3C2410 GPB7 OUTP S3C2410 GPB8 OUTP s3c2410 gpio cfgpin led table i led cfg table i s3c2410 gpio setpin led table i 1 这两个函数的意思也很明显 cfg 就是将相应的管脚设置为输出功能 set 就是设置相应管 脚的值是 0 还是 1 这样就能控制灯的亮还是灭 2 代码注释 memdev h 中的代码 ifndef MEMDEV H define MEMDEV H include 定义幻数 define MEMDEV IOC MAGIC k 定义命令 define MEMDEV IOCON IO MEMDEV IOC MAGIC 1 define MEMDEV IOCOFF IO MEMDEV IOC MAGIC 2 define MEMDEV IOC MAXNR 2 endif MEMDEV H 在这个 memdev h 中就定义了 ioctl 的两个命令 mini2440 leds misc c include include include include include include include include include include include include include include include include include include include include include include include include include include 前面这一大堆的头文件真是有点令人头疼 include memdev h define DEVICE NAME leds static unsigned long led table S3C2410 GPB5 S3C2410 GPB6 S3C2410 GPB7 S3C2410 GPB8 上面查看原理图这是四个灯所接的芯片管脚 下面的功能控制都整成了宏 看起来很方便 static unsigned int led cfg table S3C2410 GPB5 OUTP S3C2410 GPB6 OUTP S3C2410 GPB7 OUTP S3C2410 GPB8 OUTP 下面是我前面分析过的控制函数 还是比较简单 当应用层的 ioctl fd cmd arg 被调用 时 系统将处理它能识别的命令 static int sbc2440 leds ioctl struct inode inode struct file file unsigned int cmd unsigned long arg int i 0 检测命令的有效性 if IOC TYPE cmd MEMDEV IOC MAGIC return EINVAL if IOC NR cmd MEMDEV IOC MAXNR return EINVAL 根据命令 执行相应的操作 switch cmd case MEMDEV IOCOFF 灯全灭 cmd 1 for i 0 i 4 i s3c2410 gpio setpin led table i cmd return 0 case MEMDEV IOCON 灯全亮 for i 0 i 4 i s3c2410 gpio setpin led table i cmd return 0 default return EINVAL 文件操作结构体 static struct file operations dev fops owner THIS MODULE ioctl sbc2440 leds ioctl 将上面的 ioctl 操作传给 file operations static struct miscdevice misc minor MISC DYNAMIC MINOR name DEVICE NAME fops static int init dev init void int ret int i 设置 GPIO 控制寄存器 GPIO 设置为输出模式 默认下灯全灭 for i 0 i 4 i s3c2410 gpio cfgpin led table i led cfg table i s3c2410 gpio setpin led table i 1 注册混杂型字符设备驱动 ret misc register printk DEVICE NAME tinitialized n return ret static void exit dev exit void 注销混杂型字符设备驱动 misc deregister module init dev init module exit dev exit MODULE AUTHOR David Xie MODULE LICENSE GPL 三 深入分析 s3c2410 gpio cfgpin led table i led cfg table i s3c2410 gpio setpin led table i 1 对 led 的操作就是通过这两个函数完成了 那肯定得去看看这两个函数是具体怎么实现的 记得以前做单片机的时候 或是做裸板程序的时候 先是看原理图 看 led 灯和哪个管脚 相连 然后看那个管脚相关的寄存器 有数据寄存器和控制寄存器 将那个管脚通过设置 控制寄存器配置成为输出端口 然后去往数据寄存器里面写 0 或 1 就开始控制灯的亮灭了 我相信这

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论