Linux驱动/内核编程
文章平均质量分 77
Embedded-Xin
沪漂-嵌入式软件开发工程师
正在逐步把之前的笔记整理到博客上,做到稳定的输入与输出!
展开
-
Linux内核(3)-内核模块结构详解
lsmod:查看已加载模块ls /sys/module :查看内核已加载模块如果有tree命令,也可以用tree -a以树状查看,其中refcnt是模块引用计数cat /proc/kallsyms:查看内核符号表inmod:加载驱动模块modprobe:加载驱动模块,并加载驱动所依赖其他模块modprobe -r: 卸载驱动模块modinfo:查看驱动信息2.1 模块加载及卸载函数当内核模块被加载时,执行模块加载函数,当内核模块被卸载时,执行模块卸载函数内核驱动加载分为模块动态加载和直接编原创 2024-07-20 23:38:38 · 687 阅读 · 0 评论 -
Linux驱动调试——使用DEVICE_ATTR实现cat、echo指令调试驱动
DEVICE_ATTR宏定义在kernel/include/linux/device.h文件中。struct__ATTR作用:定义一个device_attribute结构体,之后device_create_file使用。_name:名称,在/sys/device/virtual中的名称,##name代表将name的字段直接替换到##_name处,所以假设_name为ap3216c_test,那这边定义的结构体名就是dev_attr_ap3216c_test_mode。原创 2024-06-22 12:35:47 · 1035 阅读 · 0 评论 -
I2C总线驱动——ap3216c光感传感器从寄存器手册开始入手的实战版(附思维导图)
IIC驱动框架,也是一个标准的platform驱动,其中分为I2C总线驱动和I2C设备驱动I2C总线驱动:( 适配器驱动 )一般是原厂维护,主要是提供读写等APII2C设备驱动:是针对具体I2C设备所编写的驱动IIC总线驱动也遵循驱动、设备、总线的匹配规则,设备和驱动匹配成功后,probe函数便会执行,probe函数在i2c_driver中,我们主要需要实现的也是driver这部分。其中i2c_device_match完成IIC总线的设备和驱动匹配。i2c_client:描述设备信息。原创 2024-06-17 12:34:20 · 1057 阅读 · 0 评论 -
块设备驱动(1)-什么是块设备驱动?块设备驱动概念总结
块设备驱动是针对存储设备,例如SD卡、EMMC、NAND FLASH、NOR FLSASH。块设备驱动,当发生写入操作时,并不会立马操作硬盘,因为写之前要擦除,擦写频繁影响flash寿命。对于flash设备而言,,所以对于不对存储设备,Linux里有实现不同的I/O调度算法。而字符设备。借鉴一张在网上找到的图片,框架图当然是学习中必不可备的东西,一眼便能有个清晰的认识其中块设备驱动请求有两种形式,使用requeset_queue请求队列,以及不使用请求队列的。原创 2024-03-10 20:27:33 · 1219 阅读 · 0 评论 -
platfor设备驱动(1)-什么是platform设备驱动?platform设备驱动基础总结
Linux系统内核使用bus_type结构体表示总线,该结构体定义在文其中的match函数用于总线完成设备和驱动之间匹配 dev为设备,drv为驱动,所以每一条总线都必须实现这个函数。platform总线是bus_type的一个示例,在其中使用进行驱动和设备之间的匹配。return!return 1;return 1;= NULL;:设备树的匹配方式,通过compatible属性在OF表匹配,匹配后执行probe函数。原创 2024-02-28 16:31:04 · 1361 阅读 · 0 评论 -
Linux中的并发与竞争(1)并发是如何发生的以及原子操作介绍
A、B、C任务,同时对共享数据段S进行访问A任务对S写入3000个字符"a",B任务对S写入3000个字符"b",C任务负责读取所有数据,当执行顺序如下时,A将数据从用户态拷贝完成后,还未累加当前访问下标,B便对数据进行了访问,此后C获取数据,获取到的数据并不是3000个字符"a",而是3000个字符"b"。原创 2024-02-22 23:55:56 · 388 阅读 · 0 评论 -
Linux中的并发与竞争(2)最简单的自旋锁概念及范例
当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取。:如果持有锁的线程能在短时间内释放锁资源,那么竞争锁就不需要做内核态和用户态之间的切换,只需要等到持有锁的线程释放锁,避免了用户进程和内核切换的消耗。:为读和写提供了不同的锁,当没有写操作时,允许多个线程使用读锁,进行并发的读取操作。更适用于读取场合更多的情况。在进入临界区时,线程A获取到锁,并且保存中断状态,禁止了中断,防止被中断服务打断而造成死锁现象。原创 2024-02-22 23:59:07 · 500 阅读 · 0 评论 -
pinctrl/gpio子系统(1)-pinctrl子系统介绍及驱动源码分析
在如今的驱动开发工作中,实际上已经很少去对着寄存器手册进行驱动开发了,一般板子拿到手,已经有原厂的驱动开发工程师,在gpio子系统、pinctrl子系统中将自家芯片的引脚适配好了。我们直接基于设备树已配置好的寄存器值,去使用子系统对应的API函数,就能快速完成驱动开发,不需要再那么关心IO寄存器的值,借助这种驱动分层的思想,快速完成驱动开发。其中配置一个GPIO最重要的几点就是配置:从设备树中获取,PIN 可复用为 I2C、SPI、GPIO,当复用为gpio的时候,就需要用到gpio子系统。原创 2024-01-31 17:24:18 · 1123 阅读 · 0 评论 -
设备树(2)-设备树在Linux系统的具体体现及内核解析设备树文件过程
哈喽~我是Embedded-Xin,沪漂嵌入式开发工程师一枚,立志成为嵌入式全栈开发工程师,成为优秀博客创作者,共同学习进步。这里先不深度去跟踪整个解析流程,能看懂设备树,遇到问题能有解决思路,待之后实际用到遇到问题了,再开始来逐步学习,加强记忆。内核启动时解析dtb文件, 后在/proc/device-tree 目录 生成设备树节点文件,过程大概如下。这里先关注结果,不关注过程,之后实际用到了再来捋这个过程~进入soc节点,soc节点下所有子节点和属性如下。这样的话,可以使用spi0访问节点。原创 2024-01-23 17:21:27 · 744 阅读 · 0 评论 -
设备树(1)-设备树是什么?设备树基础概念及语法
设备树源码文件,采用树形结构描述板级信息,例如IIC、SPI等接口接了哪些设备:设备树头文件,描述SOC级信息,例如几个CPU、主频多少、各个外设控制信息等:DTS编译后得到的二进制文件:设备树工具。原创 2024-01-19 16:32:46 · 1104 阅读 · 0 评论 -
Linux内核(2)-Makefile详解,必须要掌握的编译参数
查看变量V的来源,如果来源于command line,且KBUILD_VERBOSE 赋值为V的值,如果V=1 则quiet=quiet_和Q=@。(MAKEFLAGS)),就是匹配MAKEFLAGS中的s或者-s开头的字符串,如果匹配到的结果不为空,则quiet=silent_启用静默输出。在Makefile中,如果命令前用@,则代表不将命令内容输出,例如@rm -rf $(output)O的来源于 command line,则KBUILD_OUTPUT赋值为变量O的值。%:通配符,匹配任何字符。原创 2024-01-06 16:01:35 · 574 阅读 · 0 评论 -
Linux内核(1)-内核目录介绍,每个人都应该了解的内核目录结构
不同平台的默认配置文件,例如xxx_defconfig。:编译出的Image和zImage Linux镜像文件。:架构相关目录,例如arm、arm64。: 相应平台的驱动和初始化文件。原创 2024-01-06 16:00:09 · 410 阅读 · 0 评论 -
Linux驱动开发(1)-最简单的字符设备驱动开发例子
按照字节流进行读写操作的设备,例如点灯、按键、IIC、SPI、LCD。Linux系统中一切皆文件,驱动加载成功,就会在/dev目录生成文件,对文件操作,则可实现对硬件操作。应用程序运行在用户空间,驱动运行在内核空间,用户空间不能直接对内核操作,因此借助系统调用实现。原创 2024-01-06 16:04:12 · 1074 阅读 · 0 评论 -
裸机开发(2)-裸机实战
Cortex-A内核CPU的所有外部中断都属于IRQ中断,任意外部中断发生都会出发IRQ中断,在中断服务函数中需要判断到底是哪个中断发生。①、复位中断(Rest),CPU 复位以后就会进入复位中断,我们可以在复位中断服务函数里面做一些初始化工作,比如初始化 SP 指针、DDR 等等。②、未定义指令中断(Undefined Instruction),如果指令不能识别的话就会产生此中断。原创 2023-12-22 17:52:11 · 1540 阅读 · 0 评论 -
裸机开发(1)-汇编基础
函数发生调用时,需要进行线程保护,简单来说,就是先进行压栈操作,将调用函数参数、返回值等存到R0-15寄存器中,在执行完毕后,需要将数据内容从寄存器读出,进行出栈操作,而这一系列操作需要SP指针。芯片上电后SP指针(堆栈指针寄存器)还未初始化完毕,无法执行C代码,所以必须要用汇编设置好C语言环境。原创 2023-12-22 17:42:02 · 1154 阅读 · 0 评论 -
内核_设备树_文件系统_uboot
操作系统内核运行前的一段小程序,负责初始化硬件设备(如CPU、SDRAM、Flash、串口),加载内核、设备树文件到内存中并执行内核代码。:是一种描述硬件的数据结构,用于管理各种设备的树状结构,在操作系统引导阶段,将数据结构中的硬件信息传递给操作系统。初学一个东西,还是决定将名词全都熟悉一遍啦,不用了解的太仔细,看到的时候能知道大概是什么东西!:嵌入式Linux系统的核心,负责进程管理、内存管理、文件系统管理、网络和设备驱动等功能模块。:一个开源、轻量级的软件工具/命令集合。原创 2023-12-22 17:23:32 · 391 阅读 · 0 评论 -
uboot学习(1)-uboot目录详解
uboot学习原创 2023-12-17 19:55:07 · 544 阅读 · 0 评论 -
uboot学习(3)-uboot环境变量
uboot环境变量默认值:include/env_default.h。原创 2023-12-17 19:58:58 · 480 阅读 · 0 评论 -
uboot学习(4)-uboot移植
bak等等,并在这些结果中排除RCS_FIND_IGNORE变量值中代表的文件和文件夹(因为RCS_FIND_IGNORE变量值代表的文件和文件夹是不执行删除操作的),随后进行删除操作,完成清理编译文件的目的。总结原因,主要是因为ubuntu未安装对exFAT格式的支持,导致SD卡插上后,并未真正挂载上,而是一个虚假的设备节点,在安装文件系统格式支持后,成功解决该问题~可以看到当前SD卡中,无分区,可直接输入n创建一个新分区,分区的具体参数,可以直接回车选择默认。原创 2023-12-17 20:01:46 · 820 阅读 · 0 评论 -
uboot学习(2)-uboot常用命令
uboot全称Universal Boot Loader。作用:简单来说就是,初始化DDR等外设,将Linux内核从flash中拷贝到DDR中,最后启动Linux内核。原创 2023-12-17 19:54:10 · 392 阅读 · 0 评论 -
栈的向上增长及向下增长解析
所以平时在计算栈偏移地址时,需要注意不同芯片平台栈的增长方向可能不同。1、向下增长,就是从高地址向低地址增长。栈顶即为&arr[254]。2、向上增长,就是从低地址向高地址增长。栈顶即为&arr[0]。压栈操作是从栈顶压向栈底。假设堆栈为数组arr。原创 2023-08-15 23:46:13 · 1315 阅读 · 1 评论