电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本
换一换
首页 金锄头文库 > 资源分类 > DOCX文档下载
分享到微信 分享到微博 分享到QQ空间

字符设备驱动——申请、创建、应用

  • 资源ID:201855340       资源大小:299.30KB        全文页数:9页
  • 资源格式: DOCX        下载积分:0金贝
快捷下载 游客一键下载
账号登录下载
微信登录下载
三方登录下载: 微信开放平台登录   支付宝登录   QQ登录  
二维码
微信扫一扫登录
下载资源需要0金贝
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
1、金锄头文库是“C2C”交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时联系右侧客服;
2、如你看到网页展示的文档有jinchutou.com水印,是因预览和防盗链等技术需要对部份页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有jinchutou.com水印标识,下载后原文更清晰;
3、所有的PPT和DOC文档都被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;下载前须认真查看,确认无误后再购买;
4、文档大部份都是可以预览的,金锄头文库作为内容存储提供商,无法对各卖家所售文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;
5、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据;
6、如果您还有什么不清楚的或需要我们协助,可以点击右侧栏的客服。
下载须知 | 常见问题汇总

字符设备驱动——申请、创建、应用

1、申请设备号/ 1、注册获取设备号/ 2、初始化设备/ 3、操作设备 file_operations open release read write ioctl/ 4、两个宏定义 module_init module_exit / 5、注册设备号 register_chrdev_region/ 6、cdev_init 初始化字符设备/ 7、cdev_add 添加字符设备到系统1)向系统申请主设备号int register_chrdev(unsigned int major, const char * name, const struct file_operations * fops)/参数:/1、major:主设备号/ 设备号(32bitdev_t)=主设备号(高12bit) + 次设备号(低20bit)/ 主设备号:表示一类设备(如:camera)/ 次设备号: 表示一类设备中某一个(如:前置camera/后置camera)/ 0 ->动态分配 ; 250 -> 给定整数,静态指定/2、name: 描述设备信息,可自定义/ 在目录/proc/devices列举出了所有的已经注册的设备/3、fops: 文件操作对象/ 提供open, read,write/返回值:成功-0,失败-负数2)释放设备号void unregister_chrdev(unsigned int major, const char * name)3)例:主设备号的申请chr_drv.c加载驱动前:加载驱动后:2、创建设备节点1)手动创建缺点/dev/目录中文件都是在内存中,断电后/dev/文件就会消失 mknod /dev/设备名 类型 主设备号 次设备号 (主设备号要和驱动中申请的主设备号保持一致) 比如: mknod /dev/chr0 c 250 0 eg: rootfarsight drv_module# ls /dev/chr0 -l crw-r-r- 1 0 0 250, 0 Jan 1 00:33 /dev/chr02)自动创建通过udev/mdev机制struct class *class_create(owner, name)/创建一个类/参数:/1、owner:THIS_MODULE/2、name :字符串名字,自定义/返回:/ 返回一个class指针创建一个设备文件:/创建一个设备文件struct device *device_create(struct class * class, struct device * parent, dev_t devt, void * drvdata, const char * fmt,.)/参数:/1、class结构体,class_create调用之后的返回值/2、表示父亲,一般直接填NULL/3、设备号类型 dev_t/4、私有数据,一般直接填NULL/5/6、表示可变参数,字符串,表示设备节点名字设备号类型:dev_t devt #define MAJOR(dev) (unsigned int) (dev) >> MINORBITS) /获取主设备号 #define MINOR(dev) (unsigned int) (dev) & MINORMASK) /获取次设备号 #define MKDEV(ma,mi) (ma) << MINORBITS) | (mi) /生成设备号销毁设备文件:void device_destroy(devcls, MKDEV(dev_major, 0);/参数:/1、class结构体,class_create调用之后到返回值/2、设备号类型 dev_tvoid class_destroy(devcls);/参数:class结构体,class_create调用之后到返回值3)示例:chr_drv.c3、实现文件IO接口-fops1)驱动中实现文件io操作接口:struct file_operations 1 struct file_operations 2 struct module *owner; 3 loff_t (*llseek) (struct file *, loff_t, int); 4 ssize_t (*read) (struct file *, char _user *, size_t, loff_t *); 5 ssize_t (*write) (struct file *, const char _user *, size_t, loff_t *); 6 ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); 7 ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); 8 int (*iterate) (struct file *, struct dir_context *); 9 unsigned int (*poll) (struct file *, struct poll_table_struct *);10 long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);11 long (*compat_ioctl) (struct file *, unsigned int, unsigned long);12 int (*mmap) (struct file *, struct vm_area_struct *);13 int (*open) (struct inode *, struct file *);14 .16 long (*fallocate)(struct file *file, int mode, loff_t offset, loff_t len);17 int (*show_fdinfo)(struct seq_file *m, struct file *f);18 ; /函数指针的集合,其实就是接口,我们写驱动到时候需要去实现19 20 const struct file_operations my_fops = 21 .open = chr_drv_open,22 .read = chr_drv_read,23 .write = chr_drv_write,24 .release = chr_drv_close,25 ;示例:chr_drv1.c实现了底层的fops成员函数,再实现应用程序的调用2)应用程序调用文件IO控制驱动 :open、read.chr_drv1.cchr_test.cMakefile测试结果;4、应用程序控制驱动应用程序要控制驱动,就涉及用户空间与内核空间的数据交互,如何实现?通过以下函数:1)copy_to_user1 /将数据从内核空间拷贝到用户空间,一般是在驱动中chr_drv_read()用2 int copy_to_user(void _user * to, const void * from, unsigned long n)3 /参数:4 /1:应用驱动中的一个buffer5 /2:内核空间到一个buffer6 /3:个数7 /返回值:大于0,表示出错,剩下多少个没有拷贝成功等于0,表示正确2)copy_from_user1 /将数据从用户空间拷贝到内核空间,一般是在驱动中chr_drv_write()用2 int copy_from_user(void * to, const void _user * from, unsigned long n)3 /参数:4 /1:内核驱动中的一个buffer5 /2:应用空间到一个buffer6 /3:个数示例:chr_drv1.cchr_test.c测试:5、驱动程序控制外设之前我们了解了应用程序如何与内核空间进行数据交互,那么内核驱动与外设间的控制是怎么样的?写过裸机程序的都知道,可以通过修改外设对应的控制寄存器来控制外设,即向寄存器的地址写入数据,这个地址就是物理地址,且物理地址是已知的,有硬件设计决定。在内核中,同样也是操作地址控制外设,但是内核中的地址,是经过MMU映射后的虚拟地址,而且CPU通常并没有为这些已知的外设I/O内存资源的物理地址预定义虚拟地址范围,驱动程序并不能直接通过物理地址访问I/O内存资源,而必须将它们映射到核心虚地址空间内,然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。Linux在io.h头文件中声明了函数ioremap(),用来将I/O内存资源的物理地址映射到核心虚地址空间中ioremap的函数如下:1 /映射虚拟地址2 void *ioremap(cookie, size)3 /参数:4 /1、cookie:物理地址5 /2、size:长度(连续映射一定长度的地址空间)6 /返回值:虚拟地址解除映射:1 /去映射-解除映射2 void iounmap(void _iomem *addr)3 /参数:映射后的虚拟地址实例:通过驱动控制LED灯LED GPX2_7 GPX2CON 0x11000C40 GPX2DAT 0x11000C44 将0x11000c40映射为虚拟地址chr_drv1.cchr_test.c测试:执行app后,可以看到LED等以一秒的间隔亮灭

注意事项

本文(字符设备驱动——申请、创建、应用)为本站会员(安****)主动上传,金锄头文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即阅读金锄头文库的“版权提示”【网址:https://www.jinchutou.com/h-59.html】,按提示上传提交保证函及证明材料,经审查核实后我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。

分享当前资源【字符设备驱动——申请、创建、应用】到朋友圈,您即可以免费下载此资源!
微信扫一扫分享到朋友圈
二维码
操作提示:任选上面一个二维码,打开微信,点击“发现”使用“扫一扫”,即可将选择的网页分享到朋友圈
您可能感兴趣的------------------------------------------------------------------------------------------------------



关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.