下载  >  移动开发  >  Android  > android设备驱动步骤实例------重要0

android设备驱动步骤实例------重要0 评分:

android设备驱动步骤实例 FrameworkServer JNI NDK 内核驱动文件
21.static int hello release(struct inode" inode struct file" filp) 22.static ssize t hello read(struct file* filp char user buf, size t count loff t* f_pos 23. static ssize t hello write(struct file* filp const char user*buf, size t count, loff t* f_ pos); 24. 25/*设备文件操作方法表*/ 26. static struct file operations hello fops =[ 27..owner= THIS MODULE open= hello open release s hello release 30 read hello read .write hello write, 32} 33 34/+定义设备属性* 35. static DEVICE_ATTR(val, S IRUGO ISIWUSR, hello_val_ show, hello_ val_ store) 37/*访问设置属性方法* 38.static ssize t hello val show(struct device* dev, struct device attribute*attr, char* buf) 39 tatic ssize t hello val store(struct device*dev, struct device attribute+ attr const char* buf size t count);定义传统的设备文 件访问方法,主要是定义helo_open、 hello release、 hello read和 hello write这四个打开、释放、读和写设备文件的方法: 1/“打开设备方法*/ 2. static int hello_ppem struct inode* inode, struct file* filp)[ 3. struct hello android dev dev 5./*将自定义设备结构体保存在文件指针的私有数据域中,以便访问设备时拿来用* dev= container of(inode->i cdev, struct hello android dev, dev) 6789 filp->private data = dev return 10; 10} 11 12./*设备文件释放时调用,空实现* 13. static int hello release struct inode* inode, struct file* filp)t return 0: 16 17/*读取设备的寄存器va的值* 8.static ssize_t hello read struct file*filp, char__user*but, size_t count, loff_t*f_pos)t ssize t err =0; 20. struct hello android dev dev= filp->private _data 21. 22./*同步访问* 23. if( down_interruptible(&(dev->sem)t return -ERESTARTSYS 25 26. if(count sizeof(dev->vall goto out; 29 31./*将寄存器va的值拷贝到用户提供的缓冲区* 32. if( copy_ to user( buf, &(dev->val), sizeof( dev->va)) err=-EFAUL 34 goto out 35.} 37. err= sizeof(dev->val) 38. 39out up(&(dev->sem)) return err: 42} 44/*写设备的寄存器值val* 45.static ssize_t hello struct file* filp, const char_user"buf, size_t count, loff_t*f_pos)t 46. struct hello android dev* dev filp->private_ data 47. ssize terr=0: 49./*同步访问* if(down_interruptible(&(dev->sem)))I return -ERESTARTSYS: 53. if(count != sizeof(dev->val))i oto out 57 58./*将用户提供的缓冲区的值写到设备寄存器去* if( copy from user( &(dev->val), buf, count))I 60 err=-EFAULT goto out 64. err= sizeof(dev->val) 65 66out. 67. up(&(dev->sem 58 return err 59} 定义通过devs文件系统访问方法,这里把设条的寄存器va看成是设备的一个属性,通过读写这个属性来对设备进行访问, 主要是实现 hello val show和 hello val store两个方法,同时定义了两个内部使用的访问va值的方法 hello get val和 hello set val 1./*读取寄存器va的值到缓冲区buf中,内部使用*/ 2. static ssize_ t hello get_ val(struct hello android dev* dev chark buff 3 int val= o 5./x同步访问* 6 if(down_interruptible(&(dev->sem)t 7, return-ERESTARTSYS 10. val= dey->val 11. up(&(dev->sem)) 13. return snprintf(buf, PAGE_ SIZE, %d/n vali 14.} 15 16./*把缓冲区bu的值写到设备寄存器val中去,内部使用* 17. static ssize t hello set val(struct hello android dev* dev const char* buf, size t count)t 18, int val= 0: 19. 20./将字符串转换成数字*/ 21. val simple_ strtol(buf, NULL, 10); 22 23./同步访问*/ 24. if(down_interruptible( &(dev->sem)t return-ERESTARTSYS 26.} 28. dev->val val 29. up(&(dev->sem)) 31. return count. 34./*读取设备属性va*/ 35. static ssize t hello val show struct device* dev struct device attribute*attr, chark buf) 36. struct hello_ android dev* hdev =(struct hello_androiddev*dev_get_drvdata(dev) 38. return hello_ _get_val(dev, buf): 39 40 41./*写设备属性va* 42. static ssize t hello val store( struct device* dev, struct device_ attribute* attr, const char* buf, size_ t coun t){ 3. struct hello android dev* hev =(struct hello android dev*)dev get drvdata dev) +5. return_hello_set_val(dev, buf, count) 46.} 定义通过pc文件系统访问方法,主要实现了 hello proc read和 hello proc write两个方法,同时定义了在poc文件系统 创建和删除文件的方法helo_ create_poc和 hello remove_proo: 1./*读取设备寄存器va的值,保存在page缓冲区中* 2. static ssize_t hello_proc_read (char page, char ** start off_t off, int count, int* eof, void datat if(off>0t 4 5 return o 8 return lo_get _val (hello_ _dev, page); 10 11./*把缓冲区的值buf保存到设备寄存器val中去*/ 12. static ssize t hello proc write(struct file* filp, const char user buff, unsigned long len void datai 13. int err=0: 14. char page NULL 15 16. if(len PAGE_SIZEt 17 printk (KERn aLert The buff is too large: %lu. n",len; 18. return-EFAULTI 19. 21. page =(char )get_free_page(GFP_KERNEL); 22. if( page)i printk(KERN_ ALERT Failed to alloc page / n) return -ENOMEM 26 27./先把用户提供的缓冲区值拷贝到内核缓冲区中去*/ 28. if(copy_from_user(page, buff, len)t 29 printk(KERN_ ALerT Failed to copy buff from user /n") err =-EFAULT 31 goto out 33 34. err= hello set val (hello dev, page, len) 36, out 37. free_page( (unsigned long)page) 38. return err 39, 41./*创建/proc/heo文件x 42. static void hello_create_proc(void)i 43. struct proc_ dir_entry entry: entry create_proc_entry (HELLO_DEVICE_PROC_NAME,O, NULD): 46. if(entry entry->owner THIS MODULE 48 entry->read_proc hello_ proc_read entry->write proc hello proc write 50.} 51.} 52. 53./*删除/proc/heo文件x/ 54. static void hello_remove_proc(void)f 55. remove_proc_entry (HELLO_DEVICE_PROC_NAME, NULL) 最后,定义模央加载和卸载方法,这旦只要是执行设备注册和初始化操作: 1/初始化设备* 2. static int hello setup dev struct hello Android dev dev)t int err; 4. dev t devo mkdev(hello major hello minor); 6. memset(dev, 0 sizeof(struct hello Android dev); 8. cdev init(&(dev->dev), &hello fops); 9. dev- >dev owner THIS MODULE. 10. dev->dev ops =&hello_ tops 11 12./*注册字符设备* err= cdev add(&(dev->dev), devo, 1) ferr) 15 return err 18./*初始化信号量和寄存器val的值* 19. init MUTEX(&(dev->sem)); 0 return 0; 23. 24. 25,/*模块加载方法* 26.static int init hello init(void int err=-1: dey t dev=o struct device* temp= NULL 30 31. printk (KERN ALERT"Initializing hello device. n") 2 33./*动态分配主设备和从设备号* 34. err= alloc chrdev region (&dev, 0, 1, HELLO DEVICE_ NODE_ NAME; 35.if(er<0) printk(KERN ALERT" Failed to alloc char dev region /n 37 goto fail, 40. hello major=MAJOR(dev): 41. hello minor MINOR(dev) 42 43./*分配helo设备结构体变量* 44. hello dev= kmalloc(sizeof(struct hello android dev), GFP KerneL); 45. if( hello dev)i err =-ENOMEM; printk( KERN ALERT"Failed to alloc hello dev. n") goto unregister, 51./*初始化设备*/ err=hello setup dev(hello dev); 53. if(err) 54 printk( KERN ALERT Failed to setup dev: %d /n", err); goto cleanup 56.} 57. 58./*在/sy/cas5/目录下创建设备类别目录 hello 59. hello class class create ( THIS MODULE, HELLO DEVICE CLASS NAME 50. if(s err(hello class) 61 err=PtR ERR(hello class) printk (KERN ALERT"Failed to create hello class /n" ); goto destroy cdev 64 55 66./*在/dev/目求和/sys/ class he‖o目录下分别创建设备文什helo*/ temp= device create(hello class, NULL, dev, %s" HELLO DEVICE FILE NAME) 68. if(IS ERR(temp)) 69 err=PTR ERR(temp) printk( KERN ALERT"Failed to create hello device. goto destroy class 74./*在/sys/ class/hello/helo目录下创建属性文件va|*/ 75. err= device create file(temp, &dev attr val); 76. if(err <0 printk(KERN ALERT Failed to create attribute val goto destroy device 81. dev set drvdata(temp hello dev: 82 83./*创建/poc/heo文件*/ 84. hello create _proc( 85 86. printk(KERN ALERT"Succedded to initialize hello device n" return 0 8 89.destroy_ device 90. device destroy(hello class, dev) 92. destroy class 93 class destroyhello class 5. destroy cdev cdev del(& hello dev->dev)) 97 98. cleanup: 100 101. unregister: 02. unregister chrdev region(MKDEV(hello major hello minor),1); 104fa 105. return err. 106} 108/*模块卸载方法* 109. static void exit hello exit(void)i 110. dev t devo= mKdev(hello major, hello minor); 112. printk(KERN_ ALERT"Destroy hello device /n ) 113 114./删除/proc/heo文件*/ hello remove_proc0; 116 117./*销毁设备类别和设备* 118 if(hello class) 119 device destroyhello class, MKDEV(hello major, hello minor)); 120 class destroy hello class); 121.} 122. 123./*删除字符设备和释放设备内存* if(hello dev t 125 cdev del hello dev-dev; 126 kfree(hello dev) 127 129./*放设备号* 130 unregister chrdev region(devo, 1) 131 132 133 MODULE LICENSE(GPL); 134 MODULE DESCRIPTION( First Android Driver"); 135 136. module init(hello init); 137. module exit(hello exit) 五在heo目录中新增 Kconfig和 Makefile两个文件,其中 Kconfig是在编译前执行配置命令 make menuconfig时用到的,而 Makefile是执行编译命令make是用到的 Kconfig文件的内容 config hello tristate first android driver default n help This is the first android driver Makefile文件的内容 obj-S(CONFIG HELLO)+= hello.o 在 Config文件中, tristate表示编译选项HELo攴持在编译内核时,hel模攴持以模坎、内建和不编译三种编译方 法,默认是不编译,因此,在编译内核前,我们还需要执行 make meη config命令来配置编译选项,使得helo叮以以模块或 者内建的方法进行编译。 在 Makefile文件中,根据选项 HELLO的值,执行不同的编译方法。 六.修改arch/armn/ /Kconfig和 drivers/ kconfig两个文件,在menu" Device drivers"和 end menu之间添加一行

...展开详情
2013-02-22 上传 大小:876KB
举报 收藏
分享

评论 下载该资源后可以进行评论 共1条

knight_ysq 这个资源确实很好,而且楼主不要资源分,真是好人啊~~ 不得不赞一个!~~~
2014-03-25
回复
android设备驱动步骤实例

详细讲解如何在android 上添加设备驱动的步骤,实例示范,手把手教会你。

立即下载
Android常用设备驱动

Android常用设备驱动是一本现在很流行的书籍,也是很实用的,

立即下载
android设备驱动步骤实例------重要0

android设备驱动步骤实例 FrameworkServer JNI NDK 内核驱动文件

立即下载
Android手机驱动

Android手机驱动Android手机驱动Android手机驱动Android手机驱动Android手机驱动Android手机驱动Android手机驱动Android手机驱动Android手机驱动Android手机驱动Android手机驱动Android手机驱动

立即下载
android usb驱动

android usb驱动

立即下载
Android内核驱动

Android内核驱动,该书主要介绍android内核驱动以及电源管理,内存管理

立即下载
android设备adb通用驱动安装包

有些电脑插上安卓设备时会提示ADB Interface驱动未安装,adb driver(32/64位)是安卓手机通用的adb驱动程序

立即下载
android 万能驱动

32位android万能驱动

立即下载
Android专用驱动

Android专用驱动构成了Android运行时的基石。从技术上来讲,Android专用驱动也是整个Android系统的亮点,特别是Binder驱动。Binder是一种进程间通信机制(IPC),它与传统的IPC机制对比,最大的特点是高效,因为通信数据在两个进程之间只需要执行一次拷贝即可。Binder在Android系统里面使用得非常广泛以及频繁。在涉及到比较大的通信数据时,Binder通常还结合另外一个驱动Ashmem来使用。Ashmem是一个共享内存驱动,它与传统的共享内存相比,最大的特点是它是通过文件描述符来描述的,并且可以动态地进行分块管理。动态分块管理的目的是可以将部分不再使用了的内存

立即下载
android usb 驱动

android usb 驱动程序,可以直接使用!

立即下载
Android_音频设备驱动全分析

这篇文档是linux android 做音频驱动的必备文档,,我觉得非常的不错,,里面讲到android 应用层怎样去调用音频芯片,,我做驱动开发都是用这篇文档的,,,

立即下载
android 按键驱动

android 按键驱动 mini2440所用到的按键资源

立即下载
android联机驱动

android联机驱动,支持中兴小米,通用型

立即下载
Android Phone驱动

适合Android Phone驱动。。winxp 。win7等系统

立即下载