电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

9页
  • 卖家[上传人]:安****
  • 文档编号:201854973
  • 上传时间:2021-10-12
  • 文档格式:DOCX
  • 文档大小:299.30KB
  • / 9 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、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列举出了所有的已经注册的设备/

      2、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指针创建一个设备文件:/创建一

      3、个设备文件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_c

      4、reate调用之后到返回值/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

      5、) (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,

      6、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

      7、 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等以一秒的间隔亮灭

      《字符设备驱动——申请、创建、应用》由会员安****分享,可在线阅读,更多相关《字符设备驱动——申请、创建、应用》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.