![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
朱老师 5linux驱动开发
文章平均质量分 67
大漠飞鹰6666
这个作者很懒,什么都没留下…
展开
-
《5.linux驱动开发-第4部分-5.4.驱动框架入门之LED》真正的驱动开发 从 今天的 课程开始!!!5.4.1.何谓驱动框架 subsys_initcall led_class_attrs
真正的驱动开发 从 今天的 课程开始!!!(1)驱动开发工程师内核开发者 预留一些 驱动开发的接口,让我们来使用合作(2)内核维护者5.4.1.2、驱动编程协作要求(1)接口标准化(2)尽量降低驱动开发者难度5.4.1.3、到底什么是驱动框架驱动框架:部分厂家相同的一部分内核维护者已经写好了,再把不同的部分预留好接口,让驱动开发工程师来写。原创 2023-09-15 20:53:21 · 239 阅读 · 0 评论 -
5.3.11.动态映射结构体方式操作寄存器 结果体指针 5.3.12.内核提供的读写寄存器接口 writel和readl , iowrite32和ioread32
(1)2个寄存器分开独立映射 5.2.17(2) 2 个寄存器 一起映射:5.3.11.1、问题描述(1)仿效真实驱动中,5.3.11.2、实践编码5.3.11.3、分析和总结。原创 2023-08-11 22:24:16 · 387 阅读 · 0 评论 -
5.3.10.静态映射表建立过程分析
这个结构体数组所记录的几个映射关系被iotable_init所使用,该函数负责将这个结构体数组格式的表建立成MMU所能识别的页表映射关系,这样在开机后可以直接使用相对应的虚拟地址来访问对应的物理地址。在kernel/arch/arm/mach-s5pv210/mach-smdkc110.c中的smdkc110_map_io函数。该函数负责由(1)中的映射表来建立linux内核的页表映射关系。结论:经过分析,真正的内核移植时给定的静态映射表在arch/arm/plat-s5p/cpu.c中的。原创 2023-08-10 07:30:08 · 160 阅读 · 0 评论 -
5.3.7.自动创建字符设备驱动的设备文件 class_create device_create
驱动注册和注销时信息会被传给udev,由udev在应用层进行设备文件的创建和删除。(2)内核驱动和应用层udev之间有一套信息传输机制(netlink协议)5.3.7.2、解决方案:udev是PC机(嵌入式中用的是mdev)(3)/sys/class/xxx/中的文件的作用。(3)应用层启用udev,内核驱动中使用相应接口。(1)什么是udev?(2)使用mknod创建设备文件的缺点。5.3.7.3、内核驱动设备类相关函数。5.3.8.设备类相关代码分析1。(1)sys文件系统的设计思想。原创 2023-08-09 21:51:27 · 303 阅读 · 0 评论 -
5.3.4.注册字符设备驱动新接口4 : cdev_alloc
全局变量: .data数据段 ,程序在加载时去执行,程序关闭就没有了,灵活性不够。(4)再次感叹C语言的博大精深,好好去看《4.C语言高级专题》用的时候自动分配,用完自动释放,太灵活。(2)从内存角度体会cdev_alloc用与不用的差别。用时需要申请,用完需要释放。(3)这就是非面向对象的语言和面向对象的代码。5.3.4.1、使用cdev_alloc。5.3.4.2、cdev_init的替代。(2)不使用cdev_init时的编程。(1)cdev_alloc的编程实践。(1)cdev_init源码分析。原创 2023-08-08 20:59:20 · 66 阅读 · 0 评论 -
5.3.3.注册字符设备驱动新接口3 : alloc_chrdev_region 更简便、更智能的方法是让内核给我们自动分配一个主设备号5.3.2.3、中途出错的倒影式错误处理方法
(1)内核中很多函数中包含了很多个操作,这些操作每一步都有可能出错,而且出错后后面的步骤就没有进行下去的必要性了。我们 程序在 设计时 应该 在 某一个 函数出错后, 释放掉 锁占用 的内存 什么的 什么的。(1)使用MAJOR宏和MINOR宏从dev_t得到major和minor。(2)反过来使用MKDEV宏从major和minor得到dev_t。(2)更简便、更智能的方法是让内核给我们自动分配一个主设备号,5.3.2.2、得到分配的主设备号和次设备号。5.3.2.3、中途出错的倒影式错误处理方法。原创 2023-08-01 21:46:15 · 1933 阅读 · 0 评论 -
《5.linux驱动开发--5.3.字符设备驱动高级》5.3.1.-2注册字符设备驱动新接口1 :register_chrdev_region注册主次设备号cdev_init 初始化,cdev_add
(1)使用register_chrdev_region + cdev_init + cdev_add进行字符设备驱动注册。(2)新接口:register_chrdev_region/alloc_chrdev_region + cdev。(2)相关函数:cdev_alloc、cdev_init、cdev_add、cdev_del。1.register_chrdev_region : 注册设备驱动 号。早期只有 主设备号,主设备号 类似 身份证号,主设备号 就是 数组 的下标!为什么有主设备号和次设备号?原创 2023-08-01 20:11:59 · 204 阅读 · 0 评论 -
5.2.17.动态映射操作LED request_mem_region 和 ioremap ;iounmap 解除映射 和 release_mem_region 释放申请的内存
1. 驱动文件 module_test.c 只在 驱动文件:装载和卸载函数 里编写代码测试,就不在app.c里编写代码了。(2)release_mem_region 释放申请的内存。使用完要解除映射时要先解除映射再释放申请的内存。:映射建立时,是要先申请再映射;(1)iounmap 解除映射。5.2.17.1、如何建立动态映射。5.2.17.2、如何销毁动态映射。5.2.17.动态映射操作LED。(1)2个寄存器分开独立映射。5.2.17.3、代码实践。(2)2个寄存器在一起映射。原创 2023-07-31 21:23:30 · 346 阅读 · 0 评论 -
5.2.16.静态映射操作LED3
(1)先定义好应用和驱动之间的控制接口,这个是由自己来定义的。譬如定义为:应用向驱动写"on"则驱动让LED亮,应用向驱动写"off",驱动就让LED灭。譬如定义为:应用写"1"(字符串)表示灯亮,写"0"表示让灯灭。应用和驱动的接口定义做的尽量简单,譬如用1个字目来表示。1. 驱动文件 module_test.c。1. 驱动文件 module_test.c。2. app.c(Mkfile无更改)5.2.16.1、添加驱动中的写函数。5.2.16.静态映射操作LED3。3.(Mkfile无更改)原创 2023-07-31 20:15:30 · 134 阅读 · 0 评论 -
5.2.13.驱动中如何操控硬件 5.2.14.静态映射操作LED1 5.2.15.静态映射操作LED2 内核映射表的使用,裸机操作真实物理地址, 驱动是 操作 虚拟地址
物理地址和虚拟地址 基地址不一样,但是偏移量是一样的!!!!1.主映射表位于:arch/arm/plat-s5p/include/plat/map-s5p.h#define S5P_VA_GPIO S3C_ADDR(0x00500000) /* 所有GPIO 基地址 虚拟地址 FD500000 */所以 S5P_VA_GPIO 就等于 虚拟地址 FD5000003)GPIO相关的主映射表位于:arch/arm/mach-s5pv210/include/mach/regs-gpio.h。原创 2023-07-29 17:04:50 · 107 阅读 · 0 评论 -
5.2.12.读写接口实践 copy_from_user copy_to_user
(1)copy_from_user函数的返回值定义,和常规有点不同。返回值如果成功复制则返回0,如果 不成功复制则返回尚未成功复制剩下的字节数。5.2.12.1、完成write和read函数。(1)目前为止应用已经能够读写驱动(中的内存)1. module_test.c 驱动编写。3. Makefile 文件 无更改。(2)后续工作:添加硬件操作代码。下一节 开始 操控 硬件!5.2.12.2、读写回环测试。2. app.c 应用编写。5.2.12.读写接口实践。5.2.12.3、总结。原创 2023-07-29 14:22:11 · 866 阅读 · 0 评论 -
5.2.11.添加读写接口
3. module_test.c 添加 .write = test_chrdev_write,(1)copy_from_user,用来将数据从 用户空间复制到内核空间。(2)copy_to_user 从内核空间 复制 到 用户空间。2. Makefile 文件 没有改动 只是增加了 删除 app。注意:复制 是和 mmap的映射相对应去区分的。5.2.11.4、应用和驱动之间的数据交换。5.2.11.1、在驱动中添加。5.2.11.2、在应用中添加。5.2.11.3、测试。原创 2023-07-25 22:29:46 · 125 阅读 · 0 评论 -
5.2.10.应用程序如何调用驱动 mknod /dev/test c 250 0 创建设备文件,应用app 程序 调用 我们 驱动 壳子
(2)设备文件的关键信息是:设备号 = 主设备号 + 次设备号,使用ls -l去查看设备文件,就可以得到这个设备文件对应的主次设备号。4颗LED不可能 都占用 主设备号,设备号 = 主设备号 + 次设备号。使用mknod创建设备文件:mknod /dev/xxx c 主设备号 次设备号。主设备号: 我们这里是 250;(2)open、write、read、close等。5.2.10.1、驱动设备文件的创建。5.2.10.2、写应用来测试驱动。(1)整体流程梳理、注意分层。(2)后续工作:添加读写接口。原创 2023-07-25 20:51:23 · 313 阅读 · 0 评论 -
5.2.6-9.字符设备驱动工作原理1 file_iperations register_chrdev
(2)register_chrdev内部将我们要注册的驱动的信息(主要是 )存储在数组中相应的位置。(3)cat /proc/devices查看内核中已经注册过的字符设备驱动(和块设备驱动)(3)驱动源码中提供真正的open、read、write、close等函数实体。(2)核心工作量:file_operations及其元素填充、注册驱动。(1)作用,驱动向内核注册自己的file_operations。(3)设备驱动向内核注册时提供该结构体类型的变量。(2)每个设备驱动都需要一个该结构体类型的变量。原创 2023-07-24 22:56:31 · 128 阅读 · 0 评论 -
《5.linux驱动开发-第2部分-5.2.字符设备驱动基础》5.2.5.用开发板来调试模块
这个是把 我们在 ubuntu下编译好的module_test.o 放到 我们提前制作好的 根文件系统的目录下。5.2.5.1、设置bootcmd使开发板通过tftp下载自己建立的内核源码树编译得到的zImage。KERN_DIR = /root/driver/kernel 我们编译的 内核 x210 路径。把 开发板 的 网线 插到了 路由器上,没有 做其他的更改,tftp 启动内核成功。这个 Makefile 是最终的运行效果。3. 提前 制作好了 根文件系统(2022年做的,早就忘记 怎么做了)原创 2023-07-19 22:34:38 · 87 阅读 · 0 评论 -
《5.linux驱动开发-第2部分-5.2.字符设备驱动基础》最简单的模块源码分析 lsmod insmod modinfo rmmod dmesg
(2)fastboot将第1步中得到的zImage烧录到开发板中去启动(或者将zImage丢到tftp的共享目录,uboot启动时tftp下载启动),将来驱动编译好后,就可以在这个内核中去测试。在ubuntu中使用。(4)rmmod(remove module,卸载模块),功能是从当前内核中卸载一个已经安装了的模块,用法是rmmod xxx(注意卸载模块时只需要输入模块名即可,(2)insmod(install module,安装模块),功能是向当前内核中去安装一个模块,用法是insmod xxx.ko。原创 2023-07-18 21:19:16 · 529 阅读 · 0 评论