linux驱动开发
文章平均质量分 73
@seven@
加油,未来可期
展开
-
驱动开发之定时器
Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱 动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后 就周期性的产生定时中断,系统使用定时中断来计时。, 也叫做节拍率(tick rate)(有的资料也叫系统频率),比如 1000Hz,100Hz 等等说的就是系统节拍 率。原创 2024-06-07 18:31:51 · 1129 阅读 · 0 评论 -
驱动开发MISC 杂项驱动
所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。随着 Linux 字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号,MISC 设备驱动就用于解 决此问题。MISC 设备会自动创建 cdev,不需要像我们以前那样手动创建,因此采用 MISC 设 备驱动可以简化字符设备驱动的编写。int minor;/* 子设备号 *//* 设备名字 *//* 设备操作集 */定义一个 MISC 设备(miscdevice 类型)以后我们需要设置。原创 2024-06-06 18:01:38 · 721 阅读 · 0 评论 -
驱动开发之pinctrl 和 gpio 子系统
pinctrl子系统主要是解决上面1~3步这些工作,而且还可以解决pin 功能冲突问题,也就是配置过了,想再配置会有问题。pinctrl 子系统主要工作内容如下:①、获取设备树中 pin 信息。②、根据获取到的 pin 信息来设置 pin 的复用功能③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等是的,没错,pinctrl子系统需要借助设备树完成自动配置GPIO管脚的功能。原创 2024-06-06 10:15:21 · 1258 阅读 · 0 评论 -
设备树接口函数
在前一篇博客里面,写设备树语法介绍和接口函数的时候,写到一半发现csdn有篇幅限制,现在在此篇进行补充。之前的文章路径如下。原创 2024-06-04 09:36:34 · 847 阅读 · 0 评论 -
驱动开发之设备树语法
通过前面platform实验,使用platform总线,device与driver需要匹配才可以,device主要是存储一些硬件信息的,传递给driver使用。原创 2024-06-02 18:04:59 · 612 阅读 · 0 评论 -
驱动开发学习之新旧字符设备接口,自动创建设备的点灯
学习过单片机的兄弟都知道,点灯有以下步骤:(1)开启相应的GPIO时钟(2)如果需要配置复用,就配置一下复用寄存器(3)设置一下电气属性(4)设置一下GPIO口的输入输出方向(5)设置或者读取数据按照这些步骤依次配置寄存器就可。(驱动里面直接操作寄存器是不是感觉有点low,没事,后面会介绍设备树的写法)在linux里面,是不能直接操作寄存器的物理地址的,操作的都是虚拟地址,因为linux里面有mmu这个器件,这是linux和单片机最大的一个区别所在了。MMU 全称叫做。原创 2024-05-28 09:32:56 · 1005 阅读 · 0 评论 -
驱动开发的分离与分层
分层就是将一个复杂的工作分成了多层, 分而做之,降低难度。在驱动里面,每一层只专注于自己的事情, 系统已经将其中的核心层和事件处理层写好了,我们只需要来写硬件相关的驱动层代码即可。可能驱动里面大家都不是很熟悉,比如说网络吧,网络里面分了很多层,7层模型或者4层模型等等,这些分层都有自己的任务,提供接口给每一个层使用,完成某一些工作;例如IP层,会将IP报文解析,解析完了的数据会给到网络层的协议栈,TCP/UDP等等。这样的好处就是,层与层之间相对独立,每一层的变动或者优化,对其他层影响都不大。原创 2024-05-28 09:32:26 · 1035 阅读 · 0 评论 -
驱动开发之新字符设备驱动开发
在Linux下通过udev来实现设备文件的创建与删除,udev可以检 测系统中硬件设备状态,可以根据系统中硬件设备状态来创建或者删除设备文件。比如使用 modprobe 命令成功加载驱动模块以后就自动在/dev目录下创建对应的设备节点文件使用 rmmod 命令卸载驱动模块以后就删除掉/dev目录下的设备节点文件。使用busybox构建根文件 系统的时候,busybox会创建一个udev的简化版本—mdev。4.2.创建和删除类。原创 2024-05-26 22:01:55 · 728 阅读 · 0 评论 -
驱动开发执行应用层时报ELF: not found,syntax error: unexpected “(“错误
解决办法:arm-linux-gnueabihf-gcc test_01_normal.c -o test_01_normal就可以正常使用了。出问题之前使用的是gcc test_01_normal.c -o test_01_normal生成的文件,导致,执行时报ELF这种问题。原因:在跨平台的时候注意我们使用的编译器,我是因为没有没有交叉编译导致的。原创 2024-05-26 18:29:31 · 338 阅读 · 0 评论 -
驱动命令之insmod & depmod & modprobe & rmmod & modinfo & lsmod
insmod需指定所需加载模块的路径,且只加载所指定的模块,如果所指定的模块依赖于其他模块,insmod语法insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]原创 2024-05-26 10:30:10 · 725 阅读 · 0 评论 -
驱动编译时报WARNING: “show“ [/home/drivcelearn/test/02_export_sysbol/b/b.ko] undefined
原因是:a模块导出两个符号给b模块使用,但是b模块编译优先于a模块(或者a模块的符号表Module.symvers被删除),导致找不到 这个符号表,编译告警。因此,编译顺序要正确。原创 2024-05-25 22:37:20 · 120 阅读 · 0 评论 -
Linux驱动学习之模块化,参数传递,符号导出
加载驱动可以传递参数如:(insmod 01_module_test.ko string="seven" var=10),这里初始化的时候不设置参数,通过修改 /sys/module/01_module_test/parameters/变量名 这个文件去修改对应的值,然后卸载程序的时候打印出来看看。:当通过rmmod命令卸载模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能;模块参数(可选):模块参数是模块被加载的时候可以被传递给他的值,它本身对应模块内部的全局变量;原创 2024-05-25 22:32:06 · 1241 阅读 · 0 评论 -
驱动执行报“Attribute var: Invalid permissions 0665”
问题分析:查看 fs/sysfs/group.c:61的代码,发现是我设置 module_param(var,uint,0665);其他所有者权限设置有问题,不通过校验。虽然不影响使用,但是告警还是得该,所以将所有者权限修改为4,1,0中的一个即可。问题:执行驱动的时候会报下面这个错误。原创 2024-05-25 22:07:30 · 330 阅读 · 0 评论 -
驱动编译报error: negative width in bit-field ‘<anonymous>’错误
在Linux中,文件权限由读(r)、写(w)、执行(x)权限组成,分别对应数值4、2、1。所以只需要将最后一个参数不设置成第2位为1(也就是2)就可以了。如:module_param(var,uint,0665);问题点:module_param的其他用户的权限参数上。原创 2024-05-25 21:44:02 · 235 阅读 · 0 评论 -
ESP8266三种工作模式以及TCP/UDP服务
三种工作模式(STA、AP、STA+AP),以及与TCP服务器,TCP客户端,UDP服务器,UDP客户端的关系,下面将梳理清除这些点。原创 2022-11-26 09:08:05 · 3469 阅读 · 0 评论 -
linux驱动开发(2)开发流程
驱动其实就是获取外设数据或者控制外设,将数据给应用层,应用层进行处理,显示等等操作。驱动写好了,注入到内核之后,我们还需要去写简单的测试应用程序去检测程序是否正确。裸机开发,驱动和测试是写在一起的,这里有可以体现出驱动开发和裸机开发的不同之处了。驱动程序表现为就是一个/dev/xx文件,这个文件就是控制外设的文件。比如led ,通过write写入1,点亮,写0关闭。原创 2022-09-12 22:29:28 · 1243 阅读 · 0 评论 -
linux驱动开发(1)前言
底层和寄存器打交道对寄存器进行操作,配置外设,让外设进行工作。或者使用一些库,对寄存器进行操作。比如stm32里面,我们需要配置时钟,开启io端口,配置外设,让外设进行工作。或者在FPGA开发板里面也是如此,我们要根据外设协议,去配置时钟,以及外设寄存器的值,让外设安装我们设定的值去工作,这个过程很是复杂,开发难度加大。写linux驱动文件和裸机程序有很大的不同,虽然都是操作硬件设备,但是由于写裸机程序的时候是我们直接写代码操作硬件设备,这只有一个层次;原创 2022-08-21 09:09:04 · 291 阅读 · 0 评论