《Android驱动开发全过程》

所需积分/C币:17 2019-01-17 18:40:44 441KB PDF

来自于百度下载的一篇文档,Android驱动开发全过程(有图有真相),看了感觉简洁精炼,分享上来
自学精品系列—一驱动篇 访问寄存器va|的,dev成员变量是一个内嵌的字符设备,这个Lnux驱动程序自定义字符设备结构体的标 准方法。 在hell目录中増加hell.c文件,这是驱动程序的实现部分ε驱动程序的功能主要是向上层提供访冋设 备的寄存器的值, 包括读和写。这里,提供了三种访间设备寄存器的方法,一是通过po文件系统来访问,二是通过传统的 设备文件的方法来 访问,三是通过devs文件系统来访问。下面分段描述该驱动稈序的实现。 首先是包含必实的头文件和定义三种访问设备的方法 1. #include <linux/init h> 2. #include <linux/module. h> 3. #include <linux types 4. #include <linux/fs. h> 5.#include <linux/proc_ fs. h> 6. #include <linux/device. h> 7. #include <asm/access. h 9.#include hello, h 11/“主设备和从设备号变量* 12. static int hello major =0 13.static int hello minor =0 14 15/x设备类别和设备变量* 16. static struct class k hello class null: 17.static struct hello android dev hello dev= null: 19/传统的设备文件操作方法* 20. static int hello open(struct inode*inode, struct file* filp); 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/x设备文件操作方法表* 26. static struct file operations hello fops=( 2/.owner= THIS MODUlE 28. open hello open 29., release= hello release 30.. read hello read 31. write hello write 32小}; 33 34/*定义设备属性* 65.static DEVICE_ ATTR(val, S_IRUGO IS_IWUSR, hello_ val_ show, hello_val_store); 36 自学精品系列—一驱动篇 37/*访问设置属性方法*/ 38. static ssize t hello val show(struct device* dev struct device attribute* attr char* buf); 39. static ssize t hello val store(struct device*dev, struct device attribute*attr, const char* buf, size t count 定义传统的设备文 件访问方法,主要是定义hel_open、 hello release、 hello read和 hello write这四个打开、释放、读和写 设备文件的方法 1/*打开设备方法* 2. static int hello open(struct inode* inode, struct file* filp)i 3, struct hello android devdev 4 5./*将自定义设备结枃体保存在文件指针的私有数据域中,以便访问设备时拿来用* 6. dev container of(inode->i cdev, struct hello android dev dev) 7. filp->private data=dev 8. 9. return O 10. 11 12,/设备文件释放时调用,空实现* 13. static int hello release(struct inode* inode struct file* filp)i 14. return 0 15} 17,/读取设备的寄存器va的值* 18. static ssize t hello read struct file filp char user *buf, size t count loff t*f pos 19. ssize terr=0: 20. struct hello android dev' dev filp->private data 21 22./*同步访问* 23. if(down interruptible(&(dev->sem)))i 24. return-ERESTARTSYS: 27. if(count sizeof(dev->valt 28. goto out 29.} 30 31./*将寄存器val的值拷贝到用户提供的缓冲区* 32. if( copy to user( buf, &(dev->val), sizeof(dev->val))) 33. err =-EFAULT; 34. goto out; 3 err= sizeof(dev->val); 38 自学精品系列—一驱动篇 out 40 up&(dev->sem)); 41. return err. 42↓} 43 44/写设备的寄存器值va|*/ 45. static ssize t hello write (struct file* filp const char user *buf, size t count, loff t* f pos)( 46 struct hello android dev' dev filp->private data 47. ssize terr=o 48 49./*同步访问* 50. if(down interruptible (&(dev- >sem) 51. return -ERESTARTSYS 52 53 4. if(count sizeof(dev->va)) 55. goto out 58./*将用户提供的缓冲区的值写到设备寄存器去*/ 59. if(copy_ from user(&(dev->val), buf, count))( 60. err=-EFAULT: 61. goto out 62 64. err= sizeof(dev->val) 66out 67 up(&(dev->sem)) 68. return err 定义通过文件系统访问方法,这里把设备的奇存器看成是设备的一个属性,通过读写这个属性来 对设备进行访问 主要是实现 和 两个方法,同时定义了两个内部使用的访问值的方法 和 读取寄存器的值到缓冲区中,内部使用 同步访问 自学精品系列—一驱动篇 把缓冲区的值写到设备寄存器中去,内部使用 将字符串转换成数字 同步访问 读取设备属性 写设备属性 定义通过文件系统访问方法,主要实现了 两个方法,同时定义 了在文件系统 创建和删除文件的方法 和 读取设备寄存器的值,保存在缓冲区中 自学精品系列—一驱动篇 把缓冲区的值俣存到设备寄存器中去 先把用户提供的缓冲区值拷贝到內核缓冲区中去 自学精品系列—一驱动篇 删除 文件 最后,定义模块加载和卸载方法,这里只要是执行设备注册和初始化操作: 1/初始化设备* 2.static int hello setup dev(struct hello android dev dev i Int err; 4. dev t devo=MKDEv(hello_ major hello_ minor) 6. memset(dev 0, sizeof(struct hello android dev)) 7. 8. cdev init(&(dev->dev), &hello fops); 9. dey->dev owner= THIS MODULE: 10. dev->dev ops=&hello fops 11 12./*注册字符设备×/ 13. err= cdev add(&(dev->dev), devo, 1); 14.if(er){ 15. return err. 16.} 17 18./*初始化信号量和寄存器va|的值* 19 init MUTEX(&(dev->sem)); 20. dev->val=0 21 22. return 0: 23 24 25./“模块加较方法* 26.static int init hello init/void) 27. int err=-1: 28. dey t dev=o 29 struct device* temp= NULL 30 31. printk(KERN ALERT"Initializing hello device /n ") 32. 自学精品系列—一驱动篇 33./*动态分配主设备和从设备号*/ 34. err alloc chrdev region (&dev o, 1, HELLO DEVICE NODE NAME) 35.f(err<0){ 36. printk(KERN ALERT"Failed to alloc char dev region /n") 37. goto fail 38.} 40. hello major = MAjOR(dev) 41. hello minor = Minor(dev) 42 43./*分配hela设备结构休变量* 44. hello dev kmalloc(sizeof(struct hello android dev), GFP KERNEL); 45. if(! hello dev)i 46. err=-ENOMEM: 47 printk(KERN ALERT"Failed to alloc hello dev /n ) oto unregister 49.} 51./+初始化设备* 52. err= hello setup dev hello dev): 53. if(err) 54 printk(KERN_ ALERT"Failed to setup dev: %d /n", err) 65. goto cl 56.} 57 58./*在/sys/cas5目录下创建设备类别目录hell* 59. hello class class create(THIS MODULE, HELLO DEVICE CLASS NAME) 60. if(Is erR(hello class))t 61. err= PtR ERR(hello class 62. printk(KERN_ ALERT"Failed to create hello class /n 63. goto destroy_cdev; 65 66./*在/ev/日录和/sys/cass/helo日录下分别创建设备文件heo*/ 67 temp= device create hello class, NULL, dev, Ds" HELLO DEVICE_ FILE_ NAME) 68. if(IS ERR(temp))i 69. err=PTR ERR(temp) 70. printk(KERN_ ALERT" Failed to create hello device. ") 71. goto destroy class; 74./*在/sys/cass/hll/helo日录下创建属性文件val*/ 75. err= device create file(temp &dev attr val); 76.ferr<0){ 自学精品系列—一驱动篇 77 printk (KERN ALeRT"Failed to create attribute val. ) 78. goto destroy de 79.} 81. dev_set drvdata(temp, hello dev a 82 /*创建/proc/heo文什* lo create_ proco); 85 86 printk(KERN ALERT"Succedded to initialize hello device /n 87. return o 89.d e 90 device destroy (hello class, dev) 91 92. destroy cl 93. class destroy (hello class) 94. 95.destroy cde 96 cdev del(&(hello dev->dev)); 97 98. cleanup 99. kfree(hello dev 101 unregister 102. unregister chrdev region(MKDEV(hello major, hello minor), 1) 104.fail 105. return err 106 107 108/艹模块卸载方法* 109. static void exit hello exit(void 110. dev t devo mkdev(hello major, hello minor) 111 112 printk(KERN_ ALERT" Destroy hello device / n ) 113 114./*删除/proc/helo文件* 115. hello remove_ proco 116 117./*销毀设各类别和设备* 118. if(hello class)i 119 device_ destroy(hello_ class, MKDEV(hello_major, hello_ _minor); 120. class destroy (hello class);

...展开详情
试读 30P 《Android驱动开发全过程》
img
ryan_hc

关注 私信 TA的资源

上传资源赚积分,得勋章
    最新推荐
    《Android驱动开发全过程》 17积分/C币 立即下载
    1/30
    《Android驱动开发全过程》第1页
    《Android驱动开发全过程》第2页
    《Android驱动开发全过程》第3页
    《Android驱动开发全过程》第4页
    《Android驱动开发全过程》第5页
    《Android驱动开发全过程》第6页
    《Android驱动开发全过程》第7页
    《Android驱动开发全过程》第8页
    《Android驱动开发全过程》第9页

    试读已结束,剩余21页未读...

    17积分/C币 立即下载 >