
野火i.mx 6ull内核驱动进阶
文章平均质量分 89
在野火i.mx 6ull开发板进阶内核驱动
Couvrir洪荒猛兽
大家都在努力不是吗 不止你 还有我
梦想成为嵌入式大牛
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
21.SPI万能驱动
spi支持全双工,可使用unlocked_ioctl接口可以支持半双工、全双工(switch的default选择)收发消息。32bit系统对应fops中的unlocked_ioctl接口,即spidev_ioctl。可用来设置spi的通信参数,但很少用,用户空间编程也会用到此结构体。存放在内核/drivers/spi/spidev.c文件。内核集成spidev驱动模块,开机后会中的加载此模块。全双工收发信息,本质上还是调用一些spi核心层的函数。内核开放的通用版本的spi驱动。支持修改多种spi通信参数。原创 2023-09-04 17:22:05 · 926 阅读 · 0 评论 -
20.SPI深入剖析
该函数存放在内核/include/linux/spi/spi.h文件。该函数存放在内核/drivers/spi/spi-imx.c文件。该函数存放在内核/drivers/spi/spi.c文件。该函数存放在内核/include/linux/spi/spi.h文件。该函数存放在内核/drivers/spi/spi.c文件。该函数存放在内核/drivers/spi/spi.c文件。该函数存放在内核/drivers/spi/spi-bitbang.c文件。保存spi寄存器起始地址,填充spi控制器回调函数。原创 2023-09-04 15:36:20 · 474 阅读 · 0 评论 -
19.SPI核心框架简介
SPI核心层提供SPI控制器驱动和设备驱动的注册方法、注销方法、SPI通信硬件无关接口SPI主机驱动主要包含SPI硬件体系结构中适配器(spi控制器)的控制,用于产生SPI读写时序主要数据结构:spi_master(spi_controller)SPI设备驱动通过SPI主机驱动与CPU交换数据主要数据结构:spi_device和spi_driver.match = spi_match_device, // 设备和驱动匹配规则return 1;return 1;return!!原创 2023-09-04 12:42:26 · 599 阅读 · 0 评论 -
18.kthread_worker:内核线程异步传输
把内核线程抽象为流水线工人,按序处理其他线程 / 进程交付的批量工作。可以通过kthread_worker结构体让内核创建一个线程,在线程里完成一件事情。缺点:传输效率低,同步传输会造成当前线程阻塞,影响用户空间应用程序执行效率。该结构体存放在内核/include/linux/kthread.h文件。该结构体存放在内核/include/linux/kthread.h文件。该结构体存放在内核/kernel/kthread.c文件。高速数据:驱动交给内核来异步传输。表示等待内核线程处理的具体工作。原创 2023-09-01 12:49:54 · 944 阅读 · 0 评论 -
17.completion机制
完成量用于进程 / 线程同步,与信号量 / 互斥量类似。该结构体存放在内核/include/linux/completion.h文件。静态定义并初始化函数存放在内核/kernel/sched/completion.c文件。可能会使进程 / 线程一直休眠,休眠时进程 / 线程不接收中断信息。wait_for_completion_timeout()函数限定了进程 / 线程的休眠时间,休眠时进程 / 线程不接收中断信息。wait_for_completion_interru原创 2023-09-01 11:22:18 · 547 阅读 · 0 评论 -
16.poll机制
应用层调用一个 read / write 对一个文件进行读写操作时, read / write可能使当前的进程或线程进入一个休眠态(进程 / 线程阻塞在一个文件的读写操作上),陷入休眠态的进程 / 线程只能通过对应的文件设备驱动唤醒自己。当调用poll()函数的时候,会找到对应的file_operations的成员变量poll,最终会调用poll成员变量指向的函数指针。poll()函数文件操作涉及多个文件的轮询,所以poll()函数引起的进程 / 线程休眠,可以会被多个设备驱动唤醒。原创 2023-08-31 11:27:24 · 869 阅读 · 0 评论 -
15.设备驱动的IO(阻塞/非阻塞)
内核空间《=》file_operation:在内核空间找到文件对应的fops,回调执行对应的函数指针。用户空间《=》内核空间:用户空间调用glibc库的文件操作接口或者系统调用函数,陷入内核态执行。方式:glibc库的文件操作接口,linux内核开放的系统调用接口。请求的资源没有准备好时,直接返回错误信息。请求的资源没有准备好时,进程/线程睡眠等待,直到数据准备完毕。在用户空间进行数据发送/读取。原创 2023-08-30 15:06:08 · 607 阅读 · 0 评论 -
14.IIC核心函数与万能驱动
该函数存放在内核/drivers/i2c/i2c-core-base.c文件。该函数存放在内核/drivers/i2c/i2c-core-base.c文件。该函数存放在内核/drivers/i2c/i2c-core-base.c文件。该函数存放在内核/include/linux/i2c.h文件。该函数存放在内核/include/linux/i2c.h文件。该函数存放在内核/include/linux/i2c.h文件。其实最终调用的还是i2c_transfer()。文件存放于内核/drivers/i2c/。原创 2023-08-29 17:58:25 · 1068 阅读 · 0 评论 -
13.IIC驱动框架简介
IIC框架原创 2023-08-29 16:40:14 · 1116 阅读 · 0 评论 -
12.并发:信号量、互斥锁
参数获取一次信号量,获取成功返回0,获取失败返回非0值。App.c文件照旧照旧虚拟机:开发板(在挂载目录下执行):原创 2023-08-29 10:57:58 · 591 阅读 · 0 评论 -
11.并发:自旋锁
在没有CAS函数前,多个线程同时执行这两个步骤会出错。CAS函数把这两个步骤合并为一条硬件级指令。第1步的比较锁状态和第2步的锁变量赋值,将变为不可分割的原子指令(硬件同步原语)自旋锁使用CPU提供的CAS(Compare And Swap)函数,在用户态代码中完成加锁与解锁操作。自旋锁并不一直忙等待,会与CPU紧密耦合,它通过CPU提供的PAUSE指令,减少循环等待时的耗电量;对于单核CPU,忙等待并没有意义,此时它会主动把线程休眠。自旋锁伪代码尝试获取一次,获取成功返回“true原创 2023-08-28 18:02:47 · 688 阅读 · 0 评论 -
10.并发:硬件同步原语
硬件同步原语:由计算机硬件提供的一组原子操作,具有不可分割性,避免并行运算执行错误。同步、死锁、数据竞争、系统调度开销等。原创 2023-08-28 17:32:27 · 216 阅读 · 0 评论 -
9.GPIO子系统
替代旧的二进制设备树:sudo cp /mnt/imx6ull-mmc-npi.dtb /usr/lib/linux-image-4.19.35-imx6/imx6ull-mmc-npi.dtb。然后拷贝到共享文件夹:sudo cp 内核/arch/arm/boot/dts/imx6ull-mmc-npi.dtb /home/couvrir/桌面/sharedir。打开内核/arch/arm/boot/dts/imx6ull-mmc-npi.dts,在/内修改用户加入内容。同步缓冲区:sync。原创 2023-08-28 16:13:14 · 467 阅读 · 0 评论 -
8.pinctrl子系统:iomuxc
iomuxc定义存放在内核/arch/arm/boot/dts/imx6ull.dtsi文件中。compatible:与pinctrl子系统的平台驱动做匹配。reg:引脚配置寄存器的基地址以及长度。后面的mux reg、conf reg、input reg都是相对于基地址来说。pinctrl-names:定义引脚状态。pinctrl-0:定义第0种状态需要使用的引脚(可引用其它节点标签)pinctrl-1:定义第1种状态需要使用的引脚(依次类推)原创 2023-08-25 12:15:56 · 787 阅读 · 0 评论 -
7.linux设备驱动模型:传统设备树与“插件”设备树
替代旧的二进制设备树:sudo cp /mnt/imx6ull-mmc-npi.dtb /boot/dtbs/4.19.71-imx-r1/imx6ull-mmc-npi.dtb。然后拷贝到共享文件夹:sudo cp 内核/arch/arm/boot/dts/imx6ull-mmc-npi.dtb /home/couvrir/桌面/sharedir。查看设备树:ls /sys/firmware/devicetree/base 或 ls /proc/device-tree ,是否有rgb_led目录项。原创 2023-08-23 18:39:31 · 595 阅读 · 0 评论 -
6.linux设备驱动模型:设备树基础概念
设备树诞生背景:硬件设备中种类逐年递增,板级platform平台设备文件越来越多。设备树由根节点开始,可以包含若干个子节点;每个子节点又可以包含若干个子节点。DTS(device tree source):设备树源文件,ASCII格式。DTC(device tree compiler):设备树编译工具,将dts文件编译成dtb文件。DTB(device tree blob):二进制设备树。原创 2023-08-22 17:56:27 · 1020 阅读 · 0 评论 -
5.linux设备驱动模型:xbus、platform
在struct bus_type里面设置另1个链表头,将要管理的一系列struct device_driver通过一个链表串联起来。bus_type:统一管理struct device和struct device_driver、设置match匹配规则。在struct bus_type里面设置1个链表头,将要管理的一系列struct device通过一个链表串联起来。内核启动默认执行,存放在内核/sys/bus中。driver_devices:关联软件代码。软件和硬件的代码分离,提高程序的复用性。原创 2023-08-21 12:46:35 · 1014 阅读 · 0 评论 -
4.linux设备驱动模型:kset、uevent、class
这个函数动态地创建一个kset结构并将其注册到sysfs中。当您完成这个结构时,调用kset_unregister(),当不再使用该结构时,它将被动态释放。功能:函数存放在内核/lib/kobject.c。查看/sys/kset_example文件夹,存在led_kobject的目录项。查看/sys/kset_example/led_kobject目录下的的属性文件。查看/sys/文件夹,存在kset_example的目录项。kobject的容器,体现设备驱动的层次关系。(用于控制LED)。原创 2023-08-20 20:15:18 · 811 阅读 · 0 评论 -
3.linux设备驱动模型:kobject、kobj_type
当任一kobject需要上报uevent时,都要调用它所属的kset的uevent_ops,添加环境变量,或者过滤uevent(kset可以决定哪些uevent可以上报)。kobject的核心功能是:保持一个引用计数,当该引用计数减为0时,自动释放kobject所占的内存空间(这决定了kobject必须是动态分配)。kset如果没有指定的parent,则会把kset作为parent(kset是一个特殊的kobject)。:sysfs的一个目录,常用来管理kobject,允许发送消息到用户空间。原创 2023-08-19 23:44:14 · 1014 阅读 · 2 评论 -
2.linux字符设备
用于跟踪和管理进程打开的文件。主设备为0时,需要动态分配设备号(优先使用255~234,其次使用511~384),函数会从字符设备哈希表中找到一个空闲的位置,分配主设备号,并将该主设备号保存到字符设备的数据结构中。内核是希望一个设备驱动(file_operation)可以独自占有一个主设备号和多个次设备号,而通常一个设备文件绑定一个主设备号和一个次设备号,所以设备驱动与设备文件是一对一或者一对多的关系。如果遍历过程中,主设备号和传入的主设备号冲突或次设备号范围与传入的次设备号范围有重叠,函数会返回错误。原创 2023-08-19 23:30:51 · 1037 阅读 · 4 评论 -
1.linux内核模块
关键功能(基本功能,不可裁剪、扩展)和服务功能(如文件系统、设备驱动、网络服务等,可裁剪、扩展)均在内核空间提供。运行效率高。扩展性较差。system call(系统调用)能够先入内核态来使用内核提供的服务。内核空间只提供关键功能,服务功能在用户空间提供。运行效率较低。安全性、扩展性较高。在Linux内核源码中有超过50%的代码都与设备驱动相关。Linux为宏内核架构(windows、鸿蒙等为微内核架构),如果开启所有的功能,内核就会变得十分臃肿。原创 2023-08-19 23:09:58 · 345 阅读 · 0 评论 -
0.野火i.mx 6ull上手
终端输入sudo fire-config(打开野火配置工具),选择Network--WiFi config--Onboard Enable/Disable the on board WiFi of npi-Pro board--Enable--Finish--Yes(重启)。//记录事件的具体值,比如按键输入类型事件里,1--按键被按下,0--按键被弹起。1--高电平,0--低电平。key按键的设备文件:/dev/input/by-path/platform-gpio-keys-event。原创 2023-08-19 22:41:35 · 912 阅读 · 0 评论