已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android 驱动例子 驱动例子 LED 灯控制 灯控制 本例子 讲述在 Android2 1 上完全自已开发一个驱动去控制硬件口并写应用测试该驱动 通过这样一个 例子 解析 android 下的驱动开发流程的应用调用流程 可以说是很好的入门引导 要达到的效果要达到的效果 通过 Android 的应用 调用驱动程序 在开发板上控制 4 个 LED 的亮灭 一 硬件原理一 硬件原理 如上图 通过 4 个 IO 口控制这 LED 低电平 LED 亮 这 4 个 IO 口分别是 GPM1 GPM2 GPM3 GPM4 二 驱动程序二 驱动程序 1 在 kernel 文件夹下的 driver 目录 新键驱动文件夹 cd kernel Android 2 6 28 6 drivers 进到开发板的 kernel 目录 建驱动文件夹 mkdir ledtest 2 在 driver ledtest 目录下 新建 leddriver c leddriver h Kconfig Makefile 等 4 个文件 leddriver c leddriver c 1 include 2 include 3 include 4 include For init exit 5 include 6 include 7 include 8 include 9 include 10 include 11 include 12 include 13 include 14 include 15 include 16 include 17 include for register chrdev 18 include 19 include 20 include leddriver h 21 include For MODULE ALIAS MISCDEV 22 WATCHDOG MINOR 23 include For the watchdog specific items 24 include For file operations 25 define Viberator MAJOR 97 o 26 define SCULL NR DEVS 4 27 define SCULL QUANTUM 4000 28 define SCULL QSET 1000 29 do as the GIO driver 30 define DEVCOUNT 4 31 define GIO MINOR 2 GIO minor no 32 static dev t dev o 33 static struct cdev cdev p 34 static int openCnt 35 36 int VIB major 97 we asigment it for test 37 int VIB minor 0 38 int VIB nr devs SCULL NR DEVS 39 int VIB quantum SCULL QUANTUM 40 int VIB qset SCULL QSET 41 42 static struct class vib dev class 43 define GPNCON S3C64XX GPNCON 44 define GPNDAT S3C64XX GPNDAT 45 define GPNPUD S3C64XX GPNPUD 46 define GPMCON S3C64XX GPMCON 47 define GPMDAT S3C64XX GPMDAT 48 define GPMPUD S3C64XX GPMPUD 49 50 define VIB ON 0 x11 51 defineVIB OFF 0 x22 52 static const struct file operations GPIO Viberator ctl ops 53 owner THIS MODULE 54 open GPIO VIB open 55 read GPIO VIB read 56 write GPIO VIB write 57 ioctl GPIO VIB ioctl 58 release GPIO VIB release 59 60 ssize t GPIO VIB read struct file file char buf size t count loff t f op s 61 62 printk GPIO VIB read r n 63 gpio direction output S3C64XX GPM 3 0 64 return count 65 66 ssize t GPIO VIB write struct file file const char buf size t count loff t f ops 67 68 printk GPIO VIB write r n 69 gpio direction output S3C64XX GPM 3 1 70 return count 71 72 73 ssize t GPIO VIB ioctl struct inode inode struct file file unsigned int cmd long data 74 static int GPIO VIB ioctl struct inode inode struct file file unsigned int cmd unsigned long arg 75 76 printk KERN ERR VIB GPIO VIB ioctl CMD x n cmd 77 switch cmd 78 79 case VIB ON 80 gpio direction output S3C64XX GPM 1 0 81 gpio direction output S3C64XX GPM 2 0 82 gpio direction output S3C64XX GPM 3 0 83 gpio direction output S3C64XX GPM 4 1 84 printk KERN ERR VIB GPIO VIB ioctl VIB ON n 85 break 86 case VIB OFF 87 88 printk KERN ERR VIB GPIO VIB ioctl VIB OFF n 89 gpio direction output S3C64XX GPM 1 1 90 gpio direction output S3C64XX GPM 2 1 91 gpio direction output S3C64XX GPM 3 1 92 gpio direction output S3C64XX GPM 4 0 93 break 94 95 default break 96 97 98 gpio free S3C64XX GPN 7 99 100 ssize t GPIO VIB open struct inode inode struct file file 101 102 y 103 MOD INC USE COUNT 104 printk GPIO VIB open n 105 return 0 106 107 ssize t GPIO VIB release struct inode inode struct file file 108 109 MOD DEC USE COUNT y 110 printk GPIO VIB release n 111 return 0 112 113 static int GPIO VIB CTL init void 114 115 int ret ENODEV 116 int error 117 printk r n 118 3 119 s3c gpio cfgpin S3C64XX GPM 1 S3C GPIO SFN 1 GPM1 output 120 s3c gpio cfgpin S3C64XX GPM 2 S3C GPIO SFN 1 GPM2 output 121 s3c gpio cfgpin S3C64XX GPM 3 S3C GPIO SFN 1 GPM3 output 122 s3c gpio cfgpin S3C64XX GPM 4 S3C GPIO SFN 1 GPM4 output 123 if 1 2 2 y 124 ret register chrdev Viberator MAJOR viberator 125 if ret 0 126 printk KERN ERR VIB unable to get major d n ret 127 return ret 128 129 uc1class 130 vib dev class class create THIS MODULE viberator 131 if IS ERR vib dev class 132 unregister chrdev Viberator MAJOR capi20 133 return PTR ERR vib dev class 134 135 136 device create vib dev class NULL MKDEV Viberator MAJOR 0 NULL vi b 137 create a point under dev class vib 138 1y a 2 y o dev class 3 uc1vib 3 D 2 t 2 a 1y uc1open write read o y2 o y3 D 139 return 0 140 endif 141 if 0 2 142 if error alloc chrdev region 152 error cdev add cdev p dev DEVCOUNT 153 if error 154 printk KERN ERR 155 VIB Couldn t cdev add error d n error 156 return 1 157 158 159 vib dev class class create THIS MODULE vib dev 160 if IS ERR vib dev class 161 res PTR ERR vib dev class 162 goto out unreg class 163 164 return 0 165 endif 166 out unreg class 167 class destroy vib dev class 168 return 1 169 170 171 static int init S3C6410 VIB init void 172 173 int ret ENODEV 174 o y 175 printk KERN ERR Auly S3C6410 VIB init n 176 ret GPIO VIB CTL init 177 if ret 178 179 printk KERN ERR Auly S3C6410 VIB init Fail n 180 return ret 181 182 return 0 183 184 static void exit cleanup GPIO VIB void 185 186 187 devfs unregister chrdev Viberator MAJOR gpio vib ctl 188 if 0 189 cdev del cdev p 190 unregister chrdev region dev DEVCOUNT 191 class destroy vib dev class 192 endif 193 device destroy vib dev class MKDEV Viberator MAJOR 0 194 class destroy vib dev class 195 unregister chrdev Viberator MAJOR viberator 196 197 MODULE LICENSE GPL 198 MODULE DESCRIPTION Peter first driver 199 MODULE ALIAS CHARDEV Viberator MAJOR 0 200 201 module init S3C6410 VIB init 202 module exit cleanup GPIO VIB leddriver h 文件文件 leddriver h 文件文件 1 ssize t GPIO VIB read struct file file char buf size t count loff t f op s 2 ssize t GPIO VIB write struct file file const char buf size t count loff t f ops 3 static int GPIO VIB ioctl struct inode inode struct file file unsigned int cmd unsigned long arg 4 ssize t GPIO VIB open struct inode inode struct file file 5 ssize t GPIO VIB release struct inode inode struct file file 6 static int GPIO VIB CTL init void Kconfig 文件文件 Kconfig 文件文件 1 config LEDTEST 2 tristate LED test for ARMeasy 3 default n 4 help 5 this is a LED driver for ARMEASY with S3C6410 Makefile 文件文件 Makefile 文件文件 1 obj CONFIG LEDTEST leddriver o 3 在内核配置里菜单里加入本驱动的配置项 在内核配置里菜单里加入本驱动的配置项 达到的效果是 可以通过内核配置来选择是否把本驱动编译进内核里 也就是出现在 make menuconfig 后出来的界面里 可以参考 9 8 章 1 在 arch arm Kconfig 文件里 menu Device Drivers 与 endmenu 之间添加 1 source drivers ledtest Kconfig 2 在 drivers Kconfig menu Device Drivers 和 endmenu 之间添加 1 source drivers ledtest Kconfig 3 修改 drivers Makefile 文件 1 Obj CONFIG LEDTEST ledtest 4 编译驱动 在 kernel 目录下 终端输入 1 make menuconfig Device Drivers 下面会看到 LED test for ARMeasy 选择它 保存并退出 1 make 这样 就会在 drivers ledtest 目录下得到 leddrivr ko 文件 它就是驱动目标文件 已级编译进了 zImage 里了 只要用这个 kernel 烧录到开发板 开机就会自动加载本驱动 PS 如果发现如上编译 没有在 ledtest 目录下生成 leddriver ko 文件 也就是本根没有去编译本驱动 那就把 ledtest 目录入到 drivers misc 目录下 相应的修改 misc 下面 然后 在 makefile 里 不用选直接 写成 obj y leddriver o 这样强制的包含进去编译 三 三 应用程序 测试驱动 应用程序 测试驱动 用 C 语言写一个应用 测试上面写的驱动是否工作正常 这是一般的驱动开发流程 主要有两个文件 Android mk 和 ledtest c 1 在 YOUR Android external LEDTEST 目录编写 ledtest c 文件 ledtest c ledtest c 1 include 2 include 3 include contact the open close read write and so on 4 define DEVICE NAME dev vib device point 5 define LED ON 0 x11 6 define LED OFF 0 x22 7 int main int argc char argv 8 9 int fd 10 int ret 11 char i 12 printf n start gpio led driver test r n 13 fd open DEVICE NAME O RDWR Open device get the handle 14 printf fd d n fd 15 if fd 1 open fail 16 17 printf open device s error n DEVICE NAME 18 19 else 20 21 while 1 22 23 ioctl fd LED OFF call the output function to off LEDs 24 sleep 1 wait 1 second 25 ioctl fd LED ON 26 sleep 1 27 28 ret close fd close device 29 printf ret d n ret 30 printf close gpio led test n 31 32 return 0 33 2 在 YOUR Android external LEDTEST 目录编写 Android mk 文件 这是 Android Makefile 的标准 命名 不要更改 Android mk 文件的格式和内容可以参考其他已有的 Android mk 文件的写法 针对 hell oworld 程序的 Android mk 文件内容如下 Android mk 1 2 LOCAL PATH call my dir 3 include CLEAR VARS 4 LOCAL SRC FILES par hello c 5 LOCAL MODULE ledtestapp 6 include BUILD EXECUTABLE 注意上面 LOCAL SRC FILES 用来指定源文件 LOCAL MODULE 指定要编译的模块的名字 下一步骤编译时就要用到 include BUILD EXECUTABLE 表示要编译成一个可执行文件 如果想编译成动态库则可用 BUILD SHAR ED LIBRARY 这些可以在 YOUR Android build core config mk 查到 3 回到 Android 源代码顶层目录进行编译 cd YOUR Android make ledtestapp 例如我这里的实际操作是 cd Android2 1 make ledtestapp 注意 make ledtestapp 中的目标名 ledtestapp 就是上面 Android mk 文件中由 LOCAL MODULE 指定的模 块名 编译结果如下 make ledtestapp PLATFORM VERSION CODENAME REL PLATFORM VERSION 2 1 update1 TARGET PRODUCT generic TARGET BUILD VARIANT eng TARGET SIMULATOR TARGET BUILD TYPE release TARGET ARCH arm HOST ARCH x86 HOST OS linux HOST BUILD TYPE release BUILD ID ECLAIR bin bash line 0 cd sdk layoutopt app src resources No such file or directory target thumb C ledte
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学《数据科学-编程语言(PythonR)》考试备考题库及答案解析
- 2025年大学《金融学-金融市场学进阶》考试备考试题及答案解析
- 2025年光伏电站运维工程师考试模拟试卷及答案
- 2025年大学《生态学-生态学研究方法》考试模拟试题及答案解析
- 2025年医疗废物管理制度试题及答案
- 2025年环卫垃圾桶转运专项考核冲刺试卷及答案
- 江西省港口集团有限公司2025年校园招聘笔试历年参考题库附带答案
- 2025年大学《农学-作物遗传学》考试备考题库及答案解析
- 2025年大学《交通工程-交通仿真技术》考试备考题库及答案解析
- 2025年大学《新闻学-新闻编辑》考试模拟试题及答案解析
- 静脉留置针堵管预防策略与护理质量提升实践
- DB11-T 1860-2021 电子信息产品碳足迹核算指南
- 苏教版五年级上学期科学知识点
- 配电网工程施工规划与实施方案
- 兄弟同意卖房协议书
- (2025年)消防安全知识竞赛试题(附答案)
- 2025年特种设备作业人员考试题库及答案流动式起重机Q2
- 2025年共青团入团考试题库及完整答案
- 职业技术学校云计算技术应用《数据分析与可视化》课程标准
- 【IMT】5G承载网数字孪生技术与应用方案完整版
- 中国人民大学校园建设中心招聘7人考试参考试题及答案解析
评论
0/150
提交评论