- 博客(174)
- 收藏
- 关注
原创 驱动开发之定时器
Linux 内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱 动编写者来说最常用的定时器。硬件定时器提供时钟源,时钟源的频率可以设置, 设置好以后 就周期性的产生定时中断,系统使用定时中断来计时。, 也叫做节拍率(tick rate)(有的资料也叫系统频率),比如 1000Hz,100Hz 等等说的就是系统节拍 率。
2024-06-07 18:31:51
1273
原创 驱动开发之 input 子系统
input 就是输入的意思,input 子系统就是管理输入的子系统,和 pinctrl、gpio 子系统 一样,都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等 等这些都属于输入设备,不同的输入设备所代表的含义不同,按键和键盘就是代表按键信息, 鼠标和触摸屏代表坐标信息,因此在应用层的处理就不同,。为此 input 子系统分为 input 驱动 层、input 核心层、input 事件处理层,最终给用户空间提供可访问的设备节点,input 子系统框。
2024-06-07 14:19:23
1337
原创 驱动开发MISC 杂项驱动
所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。随着 Linux 字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号,MISC 设备驱动就用于解 决此问题。MISC 设备会自动创建 cdev,不需要像我们以前那样手动创建,因此采用 MISC 设 备驱动可以简化字符设备驱动的编写。int minor;/* 子设备号 *//* 设备名字 *//* 设备操作集 */定义一个 MISC 设备(miscdevice 类型)以后我们需要设置。
2024-06-06 18:01:38
839
原创 驱动开发之pinctrl 和 gpio 子系统
pinctrl子系统主要是解决上面1~3步这些工作,而且还可以解决pin 功能冲突问题,也就是配置过了,想再配置会有问题。pinctrl 子系统主要工作内容如下:①、获取设备树中 pin 信息。②、根据获取到的 pin 信息来设置 pin 的复用功能③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等是的,没错,pinctrl子系统需要借助设备树完成自动配置GPIO管脚的功能。
2024-06-06 10:15:21
1402
原创 驱动开发之设备树语法
通过前面platform实验,使用platform总线,device与driver需要匹配才可以,device主要是存储一些硬件信息的,传递给driver使用。
2024-06-02 18:04:59
723
原创 驱动开发之platform总线
此结构体定义在文件 include/linux/device.h/* 总线名字 *//* 总线属性 *//* 设备属性 *//* 驱动属性 */match 函数,就是完成设备和驱动之间匹配的,总线就是使用 match 函数来根据注册的设备来查找对应的驱 动,或者根据注册的驱动来查找相应的设备,因此每一条总线都必须实现此函数match 函数有 两个参数:dev 和 drv,这两个参数分别为 device 和 device_driver 类型,也就是设备和驱动。
2024-06-02 17:36:44
1599
原创 驱动开发学习之新旧字符设备接口,自动创建设备的点灯
学习过单片机的兄弟都知道,点灯有以下步骤:(1)开启相应的GPIO时钟(2)如果需要配置复用,就配置一下复用寄存器(3)设置一下电气属性(4)设置一下GPIO口的输入输出方向(5)设置或者读取数据按照这些步骤依次配置寄存器就可。(驱动里面直接操作寄存器是不是感觉有点low,没事,后面会介绍设备树的写法)在linux里面,是不能直接操作寄存器的物理地址的,操作的都是虚拟地址,因为linux里面有mmu这个器件,这是linux和单片机最大的一个区别所在了。MMU 全称叫做。
2024-05-28 09:32:56
1068
原创 驱动开发的分离与分层
分层就是将一个复杂的工作分成了多层, 分而做之,降低难度。在驱动里面,每一层只专注于自己的事情, 系统已经将其中的核心层和事件处理层写好了,我们只需要来写硬件相关的驱动层代码即可。可能驱动里面大家都不是很熟悉,比如说网络吧,网络里面分了很多层,7层模型或者4层模型等等,这些分层都有自己的任务,提供接口给每一个层使用,完成某一些工作;例如IP层,会将IP报文解析,解析完了的数据会给到网络层的协议栈,TCP/UDP等等。这样的好处就是,层与层之间相对独立,每一层的变动或者优化,对其他层影响都不大。
2024-05-28 09:32:26
1254
原创 驱动开发之新字符设备驱动开发
在Linux下通过udev来实现设备文件的创建与删除,udev可以检 测系统中硬件设备状态,可以根据系统中硬件设备状态来创建或者删除设备文件。比如使用 modprobe 命令成功加载驱动模块以后就自动在/dev目录下创建对应的设备节点文件使用 rmmod 命令卸载驱动模块以后就删除掉/dev目录下的设备节点文件。使用busybox构建根文件 系统的时候,busybox会创建一个udev的简化版本—mdev。4.2.创建和删除类。
2024-05-26 22:01:55
800
原创 驱动开发之字符设备开发
字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节 流进行读写操作的设备,读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI, LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。在 Linux 中一切皆为文件,驱动加载成功以后会在“/dev”目录下生成一个相应的文件,应 用程序通过对这个名为“/dev/xxx”(xxx 是具体的驱动文件名字)的文件进行相应的操作即可实 现对硬件的操作。
2024-05-26 18:50:14
1090
原创 驱动开发执行应用层时报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
700
原创 驱动命令之insmod & depmod & modprobe & rmmod & modinfo & lsmod
insmod需指定所需加载模块的路径,且只加载所指定的模块,如果所指定的模块依赖于其他模块,insmod语法insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]
2024-05-26 10:30:10
1194
原创 驱动编译时报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
176
原创 Linux驱动学习之模块化,参数传递,符号导出
加载驱动可以传递参数如:(insmod 01_module_test.ko string="seven" var=10),这里初始化的时候不设置参数,通过修改 /sys/module/01_module_test/parameters/变量名 这个文件去修改对应的值,然后卸载程序的时候打印出来看看。:当通过rmmod命令卸载模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能;模块参数(可选):模块参数是模块被加载的时候可以被传递给他的值,它本身对应模块内部的全局变量;
2024-05-25 22:32:06
1372
原创 驱动执行报“Attribute var: Invalid permissions 0665”
问题分析:查看 fs/sysfs/group.c:61的代码,发现是我设置 module_param(var,uint,0665);其他所有者权限设置有问题,不通过校验。虽然不影响使用,但是告警还是得该,所以将所有者权限修改为4,1,0中的一个即可。问题:执行驱动的时候会报下面这个错误。
2024-05-25 22:07:30
419
原创 驱动编译报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
566
原创 modbus-tcp协议详解
本文参考:Modbus协议中文版【完整版】.pdf,加上自己的理解的记录,该文章主要讲modbus-TCP协议。(文档下载链接:【免费】modbus协议中文详细解释文档资源-优快云文库)本系列文章分为三章:1.modbus-tcp协议解释2.modbus-tcp:功能码具体详细解释3.modbus协议栈源码详细解读:libmodbus协议栈后续会更新完.....如有问题欢迎评论区或者私信交流目录1 引言 2.modbus报文帧2.1.报文格式2.1.1.ADU报文长度2.2.报文字段含义2.3.MODB
2024-02-25 20:25:26
8563
原创 代码命名规则
单字之间不以空格断开或连接号(-)、底线(_)连结,第一个单字首字母采用大写字母;每一个单字的首字母都采用大写字母的命名格式,被称为“Pascal命名法”,也有人称之为。下划线命名法(UnderScoreCase)与帕斯卡(Pascal)及驼峰命名法(Camel)区别就是逻辑断点(单词)用的是下划线隔开,还是比较容易区分的。驼峰法的意思是:除第一个单词之外,其他单词首字母大写。相比小驼峰法,大驼峰法(即帕斯卡命名法)把第一个单词的首字母也大写了。//驼峰命名法分为:小驼峰式 和 大驼峰式。
2023-03-28 15:22:59
1222
原创 Linux定时服务
sudo crontab -e 【选择2】进入进行配置【需要按下 i 】#sh /home/xx/crontabsh/test.sh的意思是,让sh解释器调用test.sh脚本,到达定时执行任务的效果# 每一分钟执行一次#重新启动。
2023-03-28 13:55:52
836
原创 git 命令使用--工作中常用
git stash apply 0(将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除)//新的仓库,需要repo重新拉一遍大过程的代码,才会有git仓库,然后在git仓库里面进行拉起代码,不然无法找到仓库。git stash pop (将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。git push --set-upstream origin gqw_merge(远程分支名字)git stash list (查看当前stash中的内容)
2023-03-07 20:30:03
341
原创 qt tableWidget背景透明化,字体颜色,圆角等等样式
font-family:'黑体';height:35;font-family:'黑体'}"\。
2023-01-25 22:21:08
2655
原创 linux内存屏障
它的开销是四种屏障中最大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功能。在每个volatile写操作前插入StoreStore屏障,在写操作后插入StoreLoad屏障;在每个volatile读操作前插入LoadLoad屏障,在读操作后插入LoadStore屏障;
2023-01-25 20:29:57
746
原创 linux并发控制详解
对于arm来说,单条汇编指令都是原子的,多核smp也是,因为有总线仲裁所以cpu可以单独占用总线直到指令结束,多核系统中的原子操作通常使用内存栅障(memory barrier)来实现,即一个CPU核在执行原子操作时,其他CPU核必须停止对内存操作或者不对指定的内存进行操作,这样才能避免数据竞争问题。这样, 在CPU0上, 无论是进程上下文, 还是中断上下文获得了自旋锁, 此后, 如果CPU1无论是进程上下文, 还是中断上下文, 想获得同一自旋锁, 都必须忙等待, 这避免一切核间并发的可能性。
2023-01-25 12:03:34
2048
原创 linux 内存管理
1.了解Linux内存的管理机制(分段分页)2.了解虚拟内存和物理内存的映射方式3.了解操作系统内存与磁盘的交互(分页机制---》缺页重读机制,用时拷贝机制)4.应用程序如何高效使用内存和高级程序的设计方法。
2023-01-24 21:44:09
1571
原创 linux inode详解
操作系统的文件数据除了实际内容之外,通常含有非常多的属性,例如Linux操作系统的文件权限与文件属性。文件系统通常会将这两部分内容分别存放在inode和block中。文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区sector,每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块block。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block。
2023-01-23 21:28:05
2118
原创 linux内核信号
用户产生信号,sys_call收到是系统调用,根据eax设置的值,去sys_calll_table里面查找到相应的系统调用函数(sys_signal),然后去调用do_signal函数去处理信号,do_signal函数比较有意思,这个函数是运行在内核态,将信号处理函数放到用户态的栈里面,当do_signal返回的时候,就会返回到用户态,用户态进行弹栈,就会执行信号处理函数。内核态设置栈 , 用户态执行。
2023-01-23 12:47:57
107
原创 linux内核怎么认识开发板
结构体machine desc,uboot会在启动的时候传递一个cpu版本id给内核,内核会检索该内核版本支不支持该板子。machine desc结构体,用于Linux做设备板子的识别结构体,这些结构体被限定在了内存的某一片区域。1.通过UBoot传过来的参数进行该结构体的配置(通过检索taglist的方式来设置)3.并且在之后的启动或其他函数中对该结构体的变量进行调用。结构体的变量进行赋值,进行适配,让内核可以知道这个板子。所以该结构体的变量需要修改,不然有可能内核驱动不起来。
2023-01-22 09:54:07
176
原创 linux引导和启动程序
一上电,硬件强制让cpu的cs:ip寄存器指向bios程序的位置,从bios程序开始执行,由pc机的BIOS (0xFFFFO是BIOs存储的总线地址)把bootsect从某个固定的地址拿到了内存中的某个固定地址(0x90000),并且进行了一系列的硬件初始化和参数设置----bois可以存储着大量的硬件参数。
2023-01-18 13:05:39
789
原创 linux进程管理
在init进程创建之前,就会先切换到用户态,进程创建,进程切换都是通过系统调用完成的。init进程是1号进程,一开始的程序没有进程编号,0号进程是所有进程的父进程。在init进程里面,创建2号进程,会运行shell程序。其他:信号以及信号位图,阻塞状态,运行时间,打开文件数量,以及进程会话,父进程等等信息。(3)如果当前要销毁的进程有子进程(销毁父进程),那么就让1号进程作为新的父进程(init进程)进程在操作系统里面就是一个结构体task_struct,这个结构体就是进程的身份证id,存储着进程的信息。
2023-01-16 23:19:17
477
原创 进程调度模块
在进程模块里面,我们知道了进程就是一个task_struct的结构体,里面含有进程的各种信息。进程存放在进程数组task_struct的数组里面。
2023-01-16 22:22:06
569
原创 硬件中断 ,软件中断 &中断,异常的区别
所以对于两种不同叫法的区别就出来了,中断名词很多,弄清楚就可以了,资料只是简单阐述一下中断里面一些名词的区别,如果想对这些名词有更加深的理解,可以看看下面两个博客。(5条消息) linux 0.11内核源码之中断_linux 0.11中断解析_@seven@的博客-优快云博客(5条消息) x86 - 操作系统:中断、陷阱、异常、故障、终止_嗷大墨的博客-优快云博客_操作系统 陷阱。
2023-01-14 16:45:35
1557
原创 逻辑右移,逻辑左移,算术右移,算术左移
逻辑左移与算数左移一样,右边统一添0逻辑右移,左边统一添0算数右移,左边添加的数和符号有关c语言中的移位操作符,在左移时执行的是逻辑移位,在右移时执行的是算术移位。那怎么用>>实现右移操作呢?无符号数的移位操作都是执行的逻辑移位。那么要想用>>实现逻辑右移就可以将操作数强制类型转化为unsigned类型。
2023-01-04 15:21:14
975
1
原创 ARM指令
基本格式一共6部分其中,内的项是必须的,{}内的项是可选的,如是指令助记符,是必须的,而{}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。opcode 指令助记符,如LDR,STR 等cond 执行条件,如EQ,NE 等S 是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响Rd 目标寄存器Rn 第一个操作数的寄存器operand2 第二个操作数。
2023-01-04 13:49:19
710
原创 用户态线程,内核态线程
线程是什么?很多人都说是OS里面的最小运行单位,这个很官方,晦涩难懂。个人理解是,就是一个函数,一个可以被调度的函数而已。
2023-01-04 09:59:01
425
原创 ARM寄存器
在所有的运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途,因此,在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,可能会造成寄存器中数据的破坏,这一点在进行程序设计时应引起注意。,异常时,保存CPSR值,异常退出时,将该值恢复到CPSR,以保证程序的正常运行,每一中异常运行模式(除usr和sys)有各自的物理寄存器。主动切换:通过软件改变,即软件设置寄存器来经行arm的模式切换,应为arm的工作模式都是可以通过相应寄存器的赋值来切换的。
2023-01-04 08:41:51
2312
原创 MCU(单片机) ,MCU,CPU, SOC
不用把soc想得这么高端神秘,soc可以简单理解为有某些特地功能的MCU/MPU/CPU,比如4G模块,软解码模块这些等,写得比较简单,只是为了记录学习。
2023-01-03 14:15:26
1141
原创 各大芯片设计生产与架构的厂商
如果把芯片比作一幅画,ARM就是一张纸,台积电就是一支笔,而芯片设计公司就是那个绘画的人,没有设计公司的想法和设计,一张纸和一支笔放在那里,怎么能成画呢?目前主流的电脑都是采用x86架构处理器,比如 Intel/AMD处理器。手机平板电脑等设备都采用了ARM架构处理器,比如高通,苹果等。这里只是记录一下学习,有写的不多的地方,欢迎各位大佬多多指点。意法半导体(ST)----MCU领域占据绝对统治地位。5.三星的猎户座Exynos移动平台。恩智浦(NXP)----汽车领域。4.华为的海思麒麟移动平台。
2023-01-03 13:40:12
1372
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人