
linux 驱动
文章平均质量分 73
linux 包括 u-boot,busybox 和 kernel 等环境搭建,
字符设备驱动,并发与竞争,IO,timer,驱动,INPUT 驱动等等,使用 linux 6.5.7+ 版本内核。
本系列所有文章均基于 qemu ,无需开发板。
优惠券已抵扣
余额抵扣
还需支付
¥99.90
¥299.90
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
tyustli
不抛弃,不放弃
展开
-
I2C ——驱动
sys/bus/i2c/devices 目录下存放着所有的 I2C 设备,如果设备树正确编译的话可以看到。文件中描述了 I2C 总线的相关信息,以及 I2C 总线下的设备节点信息。器件地址,进入该目录,并打印设备名字如下。可以看到 i2c 设备驱动已经成功匹配。就是 i2c1,下面有一个节点。原创 2024-06-12 20:20:37 · 548 阅读 · 0 评论 -
I2C——读写时序
I2C 基本的读写时序原创 2020-03-07 22:28:04 · 12074 阅读 · 2 评论 -
I2C——基本原理
IIC通信协议(Inter-Integrated Circuit)是由PHILIPS公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART、CAN等通讯协议的外部收发设备,现在多用于系统内多个IC间的通讯。IIC物理层:1、它是一个支持多设备的总线。“总线”是指多个设备公用的信号线。在一个IIC通讯总线中,可连接多个IIC通讯设备,支持多个通讯主机和多个通讯从机。2、...原创 2018-10-22 12:28:49 · 7844 阅读 · 1 评论 -
input 驱动
Linux input 驱动原创 2024-05-21 21:24:12 · 364 阅读 · 0 评论 -
timer 驱动
linux timer 驱动原创 2024-05-14 20:51:12 · 352 阅读 · 0 评论 -
platform 总线(设备树)驱动
使用设备树实现 platform driver原创 2024-05-16 18:38:58 · 272 阅读 · 0 评论 -
platform 总线驱动
platform device 和 platform driver原创 2024-01-13 18:57:19 · 612 阅读 · 0 评论 -
设备树常用 of 函数
Linux 驱动学习笔记 - 设备树常用 OF 函数(五)查找节点Linux 内核中使用 device_node 结构体来描述一个节点,此结构体定义在文件 include/linux/of.h 中,定义如下:struct device_node { const char *name; /* 节点名字 */ const char *type; ...原创 2020-04-10 23:23:25 · 3666 阅读 · 1 评论 -
设备树(dts)
Linux 内核启动的时候会解析设备树中各个节点的信息,并且在根文件系统的 /proc/device-tree 目录下根据节点名字创建不同的文件夹。内部 aips3 域下的 rngb 外设控制器,寄存器起始地址为 0x022840000,大小为 0x022840000。内部 aips2 域下的 usbotg1 外设控制器,寄存器起始地址为 0x02184000,大小为 0x4000。内部 aips1 域下的 ecspi1 外设控制器,寄存器起始地址为 0x02080000,大小为 0x4000。原创 2020-04-10 22:28:21 · 351 阅读 · 1 评论 -
驱动私有数据
前面的程序中,都只申请了一个从设备号,这里使用。分配两个设备号,这两个设备共用。原创 2023-12-21 08:39:19 · 723 阅读 · 0 评论 -
杂项设备驱动
在 linux 中,将无法归类的设备定义为杂项设备。相对于字符设备来说,杂项设备的主设备号固定为 10,而字符设备不管是动态分配还是静态分配设备号,都会消耗一个主设备号,比较浪费主设备号。杂项设备会自己调用和来自动创建设备节点。所以可以将杂项设备看成是字符设备的一种。但是比平时写的字符设备降低了难度并节约了主设备号。杂项设备的次设备号 minor 一般使用宏,表示自动分配次设备号。杂项设备主要依赖次设备号来管理不同的杂项设备。杂项设备的头文件为。原创 2023-12-20 21:27:26 · 562 阅读 · 0 评论 -
并发与竞争——互斥锁
f互斥锁的实现。原创 2020-04-13 22:56:56 · 391 阅读 · 1 评论 -
并发与竞争——信号量
在中断服务例程中,它会读取 console 设备的数据,并把读得的数据放入 UART buffer 中进行缓冲,而后释放信号量,释放信号量的操作将唤醒 shell 线程。在中断服务例程运行完毕后,如果系统中没有比 shell 线程优先级更高的就绪线程存在时,shell 线程将持有信号量并运行,从 UART buffer 缓冲区中获取输入的数据。从结果中可以看到,第二次申请信号量使得线程休眠,待第一个线程释放信号量之后,第二个线程才得到执行。原创 2020-04-13 22:47:51 · 407 阅读 · 1 评论 -
并发与竞争——自旋锁
自旋锁原创 2020-04-13 22:30:15 · 396 阅读 · 1 评论 -
并发与竞争——原子操作
Linux 内核定义了叫做atomic_t的结构体来完成整型数据的原操作,在使用是使用原子变量来代替整型变量。此结构体定义在也可以在定义原子变量的时候给原子变量赋初值,如下所示相应的也提供了 64 位原子变量的操作 API 函数,和上表用法一样,只是将 atomic_ 前缀换为 atomic64_ 将 int 换为 long long。如果使用的是 64 位的 SOC,那么就要使用 64 位的原子操作函数。原创 2023-11-22 21:47:49 · 346 阅读 · 0 评论 -
IO——poll 函数
在单个线程中,select 函数能够监视的文件描述符数量有最大的限制,一般为 1024,可以修改内核将监视的文件描述符数量改大,但是这样会降低效率!这个时候就可以使用 poll 函数,poll 函数本质上和 select 没有太大的差别,但是 poll 函数没有最大文件描述符限制,虽然poll解决了select中监听fd的上限,但是poll中还是要遍历所有的FD,且如果fd监听过多会导致性能下降。要监视的文件描述符集合以及要监视的事件,为一个数组,数组元素都是结构体。poll 函数要监视的文件描述符数量。原创 2023-12-22 20:15:00 · 602 阅读 · 0 评论 -
IO——select 函数
在调用 select 函数后,可以通过检查 readfds,writefds 和 exceptfds 集合的状态,以确定哪些文件描述符准备好进行 I/O 操作。然后,程序可以根据文件描述符的状态来执行相应的读、写或异常处理操作。它们都是由 fd_set 类型表示的位图结构。原创 2023-12-22 12:51:48 · 736 阅读 · 0 评论 -
IO——非阻塞 IO(NIO)
程序使用时,阻塞 IO 和非阻塞 IO 的区别在于文件打开的时候是否使用了。所以驱动中需要判断文件打开标志是否支持非阻塞方式。文件打卡时,文件打开标志存放在文件结构体。,使用等待队列头实现了阻塞 IO。如果文件读取失败,循环读取。原创 2023-12-22 08:39:00 · 1014 阅读 · 0 评论 -
IO——阻塞 IO(BIO)
等待队列以循环链表为基础结构,链表头和链表项分别为。等待队列是内核实现阻塞和唤醒的内核机制。宏一次性完成等待队列头的定义和初始化。整个等待队列由等待队列头进行管理。等待队列头的初始化有两种方法。等待队列头使用结构体。等待队列项使用结构体。原创 2023-12-21 21:42:31 · 598 阅读 · 0 评论 -
字符设备驱动——将模块编译进内核
前面两节介绍的驱动都是以模块的形式,需要手动加载,本节介绍如何将模块编译进内核。将上一节中的模块源码拷贝到。原创 2023-11-06 21:31:10 · 624 阅读 · 0 评论 -
字符设备驱动——自动生成设备节点文件
linux 自动创建设备节点之后,就不用手动创建了,可以直接查看 /dev 目录下已经生成了设备节点文件。dev 目录下的节点不是由驱动本身生成的,是由文件系统中的工具 mdev 生成的;当系统启动后,加载完内核再去加载文件系统,执行文件系统中的脚本,脚本会执行。文件保存了每个驱动的主设备号、次设备号,以及驱动名。配置 linux 内核使之自动创建设备节点文件。这里文件是有的,这个时候执行。可以看到设备节点文件自动创建了。下的所有文件,寻找所有名为。生成设备节点的依赖有两个。程序),该命令会去遍历。原创 2023-11-05 21:59:31 · 671 阅读 · 0 评论 -
字符设备驱动——自动生成设备节点相关函数
如果没有指定设备号的话,那么就需要申请设备号。该函数用于申请设备号,函数原型参数含义dev保存申请到的设备号baseminor次设备号的起始地址count要申请的设备号数量name设备名字。原创 2020-04-01 22:57:01 · 913 阅读 · 1 评论 -
字符设备驱动
创建设备节点起始就是在 /dev 目录下创建一个文件,这样。就可以访问这个文件了。创建完成以后就会存在。查看模块文件是否存在。查看当前系统中的设备。原创 2023-11-05 11:15:03 · 279 阅读 · 0 评论 -
【kernel】——宏 list_entry/container_of
而 ptr 又是宏 container_of 的一个参数,它是指向 type 结构体中成员 member 的一个指针,所以 __pmtr 也指向 type 结构体成员 member。typeof 是 GNU C 编译器的特有关键字(C 语言中是看不到的),注意 typeof 只在编译期生效,用于得到变量的类型。({ }) 是 GNU C 的语法扩展(C 语言中也是看不到的),它的用法和逗号表达式类似,结果为最后一个语句的值。它的作用是用于计算 TYPE 结构体中成员 MEMBER 的偏移量。原创 2020-01-09 15:13:55 · 578 阅读 · 0 评论 -
【kernel】——linux 模块安装与卸载
网卡没有处于 AP 模式,处于 Managed 模式的无线网卡没有足够多的信息做网桥,只能转换成。解决方法就是在内核顶层的 Makefile 直接定义这两个变量(有点粗暴),这样直接将编译的 ko 放到网络文件系统中,直接启动内核即可。之后,将生成的 ko 文件拷贝到根文件目录下,然后重新打包。这个有点复杂,超出了研究 linux driver 的目的。模块编译好之后,最好的方法就是将 rootfs 设置为。的形式,如果想让 qemu 联网,需要建立网桥,但是。脚本传进去的,编译模块的时候又没有指定这些。原创 2023-10-29 11:30:03 · 971 阅读 · 0 评论 -
【kernel】——VScode clangd 插件浏览 linux 源码
VScode clangd 插件浏览代码却决于文件生成该文件有很多种方法这里只介绍 bear 和 linux 内核脚本。原创 2023-10-30 20:43:28 · 1907 阅读 · 0 评论 -
【kernel】——VScode 调试 linux内核
VScode 调试 linux 内核,这里调试的 linux 内核是通过运行的内核。原创 2023-10-28 21:33:41 · 1435 阅读 · 0 评论 -
【kernel】——u-boot 通过 SD 卡启动 Linux
将 kernel + dtb + rootfs 打包到一个 SD 卡镜像中。可以看到分区 1 为 kernel + dtb。分区2 为 rootfs。前面几节中,分别介绍了。原创 2023-10-25 21:33:38 · 1256 阅读 · 0 评论 -
【kernel】——Linux+SD卡(busybox rootfs)
镜像中就包含了 rootfs 目录下的所有内容,此时linux的根文件系统就已经制作完成,下一步就是使用这个 rootfs.ext3 镜像来启动 linux 内核。上述步骤执行完后在 busybox 根目录生成了一个 _install 文件夹。busybox 下载链接 https://busybox.net/随便找一个目录,来创建 linux 的根文件系统。这里比之前多指定了一个 sd 镜像。上面的步骤执行完后,linux 启动文件。linux 启动日志。原创 2023-10-16 22:13:08 · 1566 阅读 · 0 评论 -
【kernel】——qemu 直接运行 linux 内核
从日志中可以看到,挂载 VFS 文件系统失败,导致内核 panic。下节将介绍 rootfs。可以在浏览器中点击下载,也可以使用命令行下载。在根目录 linux-6.5.7 执行。在根目录 linux-6.5.7 执行。在根目录 linux-6.5.7 执行。linux 内核下载地址。原创 2023-10-15 21:04:04 · 695 阅读 · 0 评论 -
【u-boot】——VSCode 调试 u-boot
VSCode 调试 u-boot原创 2023-10-15 16:04:47 · 1165 阅读 · 2 评论 -
【u-boot】——编译与运行
u-boot 编译与 qemu 运行原创 2023-10-12 21:59:46 · 401 阅读 · 0 评论