野火driver笔记
文章平均质量分 73
你板子冒烟了
这个作者很懒,什么都没留下…
展开
-
164 输入(input)子系统实验
一、通用输入设备(evdev.c)识别通用事件处理器(drivers/input/evdev.c),使用最多。此事件处理器创建的设备文件范例 如下:/dev/input/event0/dev/input/event1…二、shell指令:查看输入设备名和event对应关系cat /proc/bus/input/devices三、BIT_MASK宏include/asm-generic/bitops/non-atomic.h指定1左移多少位#define BIT_MASK(nr) (原创 2021-11-06 17:10:43 · 220 阅读 · 0 评论 -
163 输入(input)子系统基础概念
一、统一管理外部输入设备,如:按键键盘鼠标触摸屏…用户空间接口/dev/input/event0/1/2/…/dev/input/mouse0/1/2/…(鼠标)/dev/input/sj0/1/2/……分层模型核心层创建input设备类根据输入设备种类、分发事件到不同事件处理器事件处理层包括各种事件处理器提供具体设备的操作接口,为输入设备(input_dev结构体)创建具体设备文件。因此不需要我们再去为这些输入设备创建设备文件,事件处理层的对应的事件处理器会为我原创 2021-11-06 12:15:29 · 1166 阅读 · 0 评论 -
162 工作队列实验
文章目录一、tasklet机制二、工作队列机制三、创建工作队列1、alloc_workqueue() 宏四、使用工作队列1、work_struct结构体2、INIT_WORK 宏3、schedule_work()函数五、例程1、驱动源文件2、测试app源文件一、tasklet机制软中断环境下执行:不允许休眠、降低系统实时性但是可以调用mdelay,不能调用sleep,因为sleep会引起进程调度二、工作队列机制类似于 kthread_worker把中断下半部要处理的函数放在内核线程里面执行。原创 2021-11-06 10:06:50 · 329 阅读 · 0 评论 -
160 软中断和tasklet基础概念
文章目录一、中断函数1、设计原则2、根源二、中断上下半部机制1、上半部2、下半部三、软中断1、softirq_action 结构体softirq_vec数组NR_SOFTIRQS变量2、软中断相关的api(1)open_softirq()函数(2)raise_softirq()函数四、tasklet 机制1、softirq_init()函数tasklet_struct 结构体tasklet相关的apitasklet_init()函数tasklet_schedule()函数tasklet_kill()函数一原创 2021-11-05 16:57:17 · 460 阅读 · 0 评论 -
159 Linux按键中断实验
文章目录一、硬件原理图二、添加设备树节点1、iomuxc子节点2、自定义按键节点3、irq_of_parse_and_map()函数三、源文件1、按二添加设备树节点2、驱动源文件3、测试app源文件一、硬件原理图二、添加设备树节点1、iomuxc子节点pinctrl_button: button{ fsl,pins = < MX6UL_PAD_SNVS_TAMPER1__GPIO5_IO01 0x000110A1 >; };2、自定义按键节原创 2021-11-05 00:37:07 · 763 阅读 · 0 评论 -
158 Linux中断基础概念
文章目录一、回顾二、设备树中GIC中断控制器节点三、外设中断控制器节点三、其他设备使用中断节点1、中断类型四、常用函数1、request_irq()函数(1)irq_handler_tirqreturn_t(2)flags2、free_irq()函数3、enable_irq()函数4、disable_irq()函数5、disable_irq_nosync()函数6、local_irq_disable()宏7、local_irq_enable()宏一、回顾裸机开发中:通用中断控制器(GIC)中断类原创 2021-11-04 23:41:24 · 672 阅读 · 0 评论 -
157 spi 应用层例程
如何利用spidev.c万能驱动来实现一个简单的iic通信。#include <sys/ioctl.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <stdint.h>#include <stdlib.h>#include &l原创 2021-11-04 22:24:36 · 763 阅读 · 0 评论 -
154 spidev:SPI“万能”驱动
文章目录一、总结二、两个数据类型1、spidev_data结构体2、spi_ioc_transfer结构体三、设备树节点1、pinctrl子节点2、spidev子节点四、spidev_init()函数spidev_fops文件操作接口(1) spidev_read()函数spidev_sync_read()函数spidev_sync()函数(2) spidev_ioctl()函数spidev_message()函数应用层对应的ioctl()函数SPI_MODE_MASK宏spidev_get_ioc_mes原创 2021-11-03 12:18:23 · 4049 阅读 · 0 评论 -
153 SPI数据传输剖析:同步、异步
文章目录spi_register_master() 宏spi_register_controller()函数spi_controller_initialize_queue()函数spi_init_queue()函数spi_start_queue()函数spi_pump_messages()函数__spi_pump_messages()函数spi_transfer_one_message()函数spi_finalize_current_message()函数spi_sync()函数__spi_sync()函数原创 2021-11-03 01:52:48 · 5395 阅读 · 0 评论 -
152 SPI主控制器驱动和核心函数
文章目录一、spi_controller 结构体框图二、spi_imx_probe()函数spi_bitbang_start()函数三、核心函数1、spi_setup()函数2、spi_imx_setup()函数spi_imx_chipselect()函数3、spi_message_init()函数spi_message结构体spi_message_init_no_memset()函数4、spi_message_add_tail()函数spi_transfer结构体5、spi_sync()函数6、spi_a原创 2021-11-02 23:33:21 · 1107 阅读 · 0 评论 -
151 SPI驱动框架简介
SPI框架图SPI核心层提供SPI控制器驱动和设备驱动的注册方法、注销方法、SPI通信硬件无关接口SPI主机驱动主要包含SPI硬件体系结构中适配器(spi控制器)的控制,用于产生SPI 读写时序主要数据结构:spi_master(spi_controller)SPI设备驱动通过SPI主机驱动中的各种回调函数与CPU交换数据主要数据结构:spi_device 和 spi_driver发送数据时不是spi设备自己来发送,而是交给内核线程来完成核心数据结构spi_mas原创 2021-11-02 16:30:24 · 1020 阅读 · 0 评论 -
150 SPI物理总线
文章目录一、信号线(4根)二、spi时序三、spi通信模式四、案例五、四大模式六、常见spi设备一、信号线(4根)SCK时钟线,数据收发同步MOSI数据线,主设备数据发送、从设备数据接收MISO数据线,从设备数据发送,主设备数据接收NSS、CS片选信号线,确定哪个从机有效支持一主多从(因此主设备需要片选线来区分从机)全双工通信,有两根数据线,负责双向传递最大速率可达上百MHzi2c只支持单双工,速率也比不过spi二、spi时序起始信号NSS 信号线原创 2021-11-02 14:57:47 · 249 阅读 · 1 评论 -
149 彻底掌握kthread_worker队列化机制
init_kthread_worker()宏include/linux/kthread.h初始化 kthread_worker 结构体#define init_kthread_worker(worker) \ do { \ static struct lock_class_key __key; \ __init_kthread_worker((worker), "("#worker")->lock", &__key); \ } while (0)原创 2021-11-01 00:16:50 · 1025 阅读 · 0 评论 -
148 kthread_worker:怎么把内核线程当工人?
文章目录一、前言驱动传输数据的两种方式1、同步传输2、异步传输二、kthread_worker结构体三、kthread_work结构体kthread_work_func_t数据类型定义四、kthread_flush_work结构体五、如何使用上面的数据结构1、初始化kthread_workerkthread_init_worker函数2、为kthread_worker创建内核线程3、初始化kthread_work4、启动工作5、FLUSH工作队列6、停止内核线程一、前言可以通过此结构体让内核为我们创建一原创 2021-10-30 20:44:22 · 524 阅读 · 0 评论 -
147 completion机制基本概念
文章目录一、总结完成量和(信号量&互斥量)的差异二、completion结构体三、初始化completion1、init_completion() 宏2、__init_completion()函数三、静态定义并初始化1、DECLARE_COMPLETION宏COMPLETION_INITIALIZER宏四、completion休眠1、wait_for_completion()函数2、wait_for_completion_timeout()函数3、wait_for_completion_interr原创 2021-10-30 12:31:29 · 1423 阅读 · 0 评论 -
内核调试方法
1、执行 imx6ull_alientek_emmc.sh内核编译成功时,一般有如下log(最后几行):...OBJCOPY arch/arm/boot/zImageKernel: arch/arm/boot/zImage is ready若需要重新编译设备树:make dtbs ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-2、将内核镜像zImage和设备树文件dtb拷贝到tftp目录下cp arch/arm/boot/zImage ../../原创 2021-10-29 23:26:07 · 204 阅读 · 0 评论 -
146 彻底掌握POLL机制:动手设计一个POLL实验
实验设计App应用程序调用poll函数检测 /dev/dtsled 设备文件的可写事件无可写事件,进程一直休眠(poll)有可写事件,写入字符 ‘1’,点亮ledfile_operations->poll:监视write_data全局变量值值为0,无事件发生值为1,返回可写事件指定唤醒App进程的等待队列头poll_wait(唤醒操作)file_operations->write:判断write_data全局变量值值为0,点亮rgb红灯值为1,唤醒pol原创 2021-10-28 14:01:08 · 177 阅读 · 0 评论 -
144 POLL底层机制剖析
系统调用接口sys_pollfs/select.c// 此宏是如何一步一步推导到sys_poll见下SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds,int, timeout_msecs){ struct timespec64 end_time, *to = NULL; int ret; if (timeout_msecs >= 0) { to = &end_time; poll原创 2021-10-28 12:35:39 · 461 阅读 · 0 评论 -
143 POLL机制基本概念
1、poll机制的底层实现原理就是基于等待队列来实现的。2、poll()函数,用户空间可以调用之file_operations->poll,最终会调用操作接口的这个指针应用层poll()函数异步阻塞型IO同步阻塞应用层调用一个(read/write)对一个文件进行读写操作时,read/write 可能使当前的进程或者线程进入一个休眠态,就是进程/线程阻塞在一个文件的读写操作上(read\write),陷入休眠态的进程/线程只能通过对应的文件设备驱动唤醒自己异步阻塞在应用层调用p原创 2021-10-27 23:28:51 · 278 阅读 · 0 评论 -
142 设备驱动的阻塞IO:等待队列
文章目录等待队列头初始化等待队列头init_waitqueue_head()静态定义并初始化等待队列元素初始化静态队列静态定义并初始化添加等待队列移除等待队列等待事件等待唤醒请求数据没有准备好时,让该进程睡眠直到数据准备好为止等待队列主要用来配合阻塞io来使用。等待队列头include/linux/wait.hstruct wait_queue_head{ // 自旋锁 spinlock_t lock; // 链表节点类型 struct list_head head;};// 起别原创 2021-10-27 11:13:37 · 308 阅读 · 0 评论 -
141 设备驱动的非阻塞IO:O_NONBLOCK
文章目录一、IO操作两个阶段二、阻塞操作三、非阻塞操作O_NONBLOCK四、例程1、驱动源文件 test.c2、测试源文件 app.c3、执行结果一、IO操作就是在用户空间进行:数据读取/发送方式:glibc的文件操作接口,linux开放的系统调用两个阶段用户空间 <=> 内核空间:用户空间调用glbc的文件操作接口或者系统调用,陷入内核态执行。内核空间 <=> file_operation:在内核空间会找到这个文件对应的fops,回调执行对应的函数指针。二、阻塞操作原创 2021-10-27 10:50:17 · 1156 阅读 · 0 评论 -
139 IIC驱动实验:读取mpu6050数据
MPU6050空间运动传感器芯片此芯片固定在运动物体上,可以根据芯片返回的数据确定运动物体的姿态。主要包括6个数据:(三轴就是x,y,z)3轴加速度3轴角速度硬件原理图设备树节点iomuxc子节点设备树文件中添加新的引脚组pinctrl_i2c1: i2c1grp { // 添加i2c控制器的两个引脚,对应的pin复用为i2c1控制器的相关引脚 fsl,pins = < MX6UL_PAD_UART4_TX_DATA__I2C原创 2021-10-24 10:56:19 · 840 阅读 · 0 评论 -
137 IIC核心函数与“万能”驱动
i2c_add_adapter()函数drivers/i2c/i2c-core-base.c注册一个i2c适配器// 由kernel分配适配器的编号int i2c_add_adapter(struct i2c_adapter *adapter)// 自己指定适配器的编号int i2c_add_numbered_adapter(struct i2c_adapter *adapter)adapter->nr:适配器的编号参数:adapter:i2c物理控制器对应的适配器,对应一个结构原创 2021-10-22 23:46:59 · 793 阅读 · 0 评论 -
136 IIC驱动框架简介
iic物理总线SCL:时钟线,数据收发同步SDA:数据线,具体数据支持一主多从,一个主机可以和多个从机通信,主机通过设备地址来区分从机。各设备地址独立,标准模式传输速率为100kbit/s,快速模式为400kbit/s常见iic设备eeprom触摸芯片温湿度传感器mpu6050(姿态传感器)…框架图I2C核心提供I2C总线驱动和设备驱动的注册方法、注销方法、I2C通信硬件无关代码I2C 总线驱动主要包含I2C硬件体系结构中适配器(iic控制器)原创 2021-10-22 22:20:41 · 678 阅读 · 0 评论 -
135 十面埋伏的并发(四):互斥锁
一、互斥锁与信号量:同步还是独占?1、互斥锁强调互斥机制独占共享资源获取互斥锁失败,也会触发上下文调度2、信号量强调信号机制 (同步)生产者–消费者模型获取信号量失败,触发上下文调度3、互斥锁和信号量之间作出选择服务于多个线程间的执行的逻辑顺序,选信号量服务于共享资源,选互斥锁二、自旋锁与互斥锁:休眠还是“忙等待”?1、自旋锁加锁成本低,不释放cpu使用权不会引起上下文调度,不存在此方面的开销2、互斥锁会引起进程/线程切换加锁成本更高(上下文切换耗时在几十纳秒到几微秒之间原创 2021-10-21 18:51:12 · 144 阅读 · 0 评论 -
134 十面埋伏的并发(三):信号量
文章目录一、本质二、特点三、信号量相关API1、定义信号量2、初始化信号量3、获取信号量4、尝试获取信号量5、释放信号量一、本质计数器,用来控制对公共资源的访问二、特点主要用于长时期的资源占用的场合,而自旋锁用于短时间的资源占用。获取信号量失败,触发上下文调度,当前进程(线程)陷入休眠,系统开销(进程/线程调度)大三、信号量相关API1、定义信号量struct semaphore sem;2、初始化信号量// sem:指定要初始化的信号量指针// val:信号量的初始值原创 2021-10-21 17:09:30 · 125 阅读 · 0 评论 -
133 十面埋伏的并发(二):自旋锁
一、原子操作的特点优点:简单易用缺点:只能作计数操作,保护的东西太少二、自旋锁主要用于多核处理器短时间的轻量级加锁加锁失败时,原地打转、忙等待(在等待的过程中依然占用处理机资源)自旋锁的优点:避免上下文调度、系统开销较小其他类型的锁可能引起进程、线程休眠,进程调度和线程调度也会有开销。若等待时间不长,调度反而不划算,死等划算。加锁步骤:查看锁的状态,如果锁是空闲的将锁设置为当前线程持有存在问题在没有 CAS 函数前,多个线程同时执行这 2 个步骤是会出原创 2021-10-21 14:44:56 · 429 阅读 · 0 评论 -
132 十面埋伏的并发(一):硬件同步原语
文章目录1 并发的根源2 并发对程序的不良影响3 硬件同步原语4 案例5 原子整型操作接口(1) 原子整型变量(2) ATOMIC_INIT()(3) atomic_set()(4) atomic_read()(5) atomic_add()/atomic_sub()(6) atomic_inc() / atomic_dec()(7) 位原子操作函数11 set_bit()22 clear_bit()33 change_bit()1 并发的根源多线程、多进程调度各种中断2 并发对程序的不良影响原创 2021-10-19 23:06:09 · 151 阅读 · 0 评论 -
130,gpio1节点:GPIO子系统初窥
GPIO1控制器的寄存器基地址类似的还有gpio2~5gpio1节点imx6ull.dtsigpio1: gpio@209c000 { // 用于和gpio子系统平台驱动做匹配 compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio"; //对照数据手册,gpio1寄存器组的起始地址即为0x209c000,第二个值表示范围 reg = <0x209c000 0x4000>; //描述中断相关的内容..原创 2021-10-11 23:39:51 · 2220 阅读 · 4 评论 -
117 imx_pinctrl和pinctrl_dev:引脚名字和编号该存在哪里?
pinctrl子系统预先确定引脚的数量和名字为每个引脚的配置信息分配内存管理每个引脚的使用状态imx6ul_pinctrl_probe()函数drivers/pinctrl/freescale/pinctrl-imx6ul.cstatic int imx6ul_pinctrl_probe(struct platform_device *pdev){ const struct imx_pinctrl_soc_info *pinctrl_info; const struct of_devic原创 2021-08-16 21:48:13 · 579 阅读 · 0 评论 -
116 iomuxc节点:pinctrl子系统初窥
1、iomuxc节点汇总所需引脚的配置信息pinctrl子系统预存iomux节点信息相当于一个寄存器配置器的集合。所有pin的控制器都属于这一节点。imx6ull.dtsi/*节点标签:节点完整的名字*/iomuxc: iomuxc@20e0000 { /*由此属性匹配pinctrl子系统驱动*/ compatible = "fsl,imx6ul-iomuxc"; reg = <0x20e0000 0x4000>;};compatible:用来与pinctrl子原创 2021-08-14 18:05:05 · 994 阅读 · 0 评论 -
114 Device Tree Overlays:”插件“设备树
传统设备树批量管理硬件资源,机制僵化”插件“设备树模块化管理硬件资源,灵活定制使用前提内核配置CONFIG_OF_OVERLAY = yCONFIG_OF_CONFIGFS = y挂载ConfigFSmount x /sys/kernel/config -t configfs案例说明设备树:foo.dts / { compatible = "corp,foo"; /* On chip peripherals */ ocp: ocp { /*原创 2021-08-12 22:42:58 · 941 阅读 · 0 评论 -
112 获取 DTS 属性信息
文章目录一、节点表示二、查节点1、根据路径找到节点2、根据设备类型(“device_type“属性)来查找节点3、根据节点名字("name"属性)来查找节点4、根据 conpatible属性值 来查找节点三、查节点的属性值1、根据节点的属性名字来查找属性值案例:2、读取一个数据类型32位无符号整数的属性值3、读取数据类型为32位无符号整数数组的属性值4、读取数据类型为字符串的属性值四、驱动源码1、首先要找到 所查属性 所在的节点2、查节点的属性值一、节点表示dts文件经过dtc工具编译后,才能被ub原创 2021-07-28 21:56:55 · 1006 阅读 · 0 评论 -
111 DTS:硬件资源的说明书2
文章目录一、设备树基本语法二、常见节点属性1、compatible属性2、model属性3、status属性4、reg属性5、#address-cells 和 #size-cells属性三、linux系统中查看设备树一、设备树基本语法从上到下头文件主体子节点追加内容从外到内属性其他子节点属性其他子节点…二、常见节点属性1、compatible属性属性值类型:字符串主要用来:匹配驱动设备树中的节点,若是有 compatile 属性,内核会为其生成一个原创 2021-07-27 21:39:25 · 225 阅读 · 0 评论 -
110 DTS:硬件资源的说明书1
文章目录一、诞生背景二、设备树简介1、设备树使用设备树源文件 dts二进制设备树设备树编译工具 dtc2、设备树框架头文件:主体:子节点追加内容3、节点命令基本方法节点标签别名子节点一、诞生背景硬件设备中种类逐年递增,板级platform平台设备文件越来越多二、设备树简介如下图,设备树由 根节点 开始,可以包含若干个 子节点;每个 子节点 又可以包含若干个 子节点…DTS(device tree source):设备树源文件,ASCII 格式DTC(device tree compile原创 2021-07-26 21:35:56 · 293 阅读 · 0 评论 -
109 设备驱动模型实验2
1、platform_device.c#include <linux/init.h>#include <linux/module.h>#include <linux/mod_devicetable.h>#include <linux/platform_device.h>#define CCM_CCGR1 0x020C406C //时钟控制寄存器#define IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 0x原创 2021-07-25 12:30:54 · 148 阅读 · 0 评论 -
107 xbus:打造自属的驱动总线
驱动总线软件代码 与 硬件代码 分离提高程序的复用性struct device关联硬件代码struct device_driver关联软件代码struct bus_type统一管理 struct device 和 struct device_driver ,其成员函数match 定义匹配规则。在 struct bus_type 里面设置1个链表头,将要管理的一系列 struct device 通过一个链表串连起来。在 struct bus_type 里面设置另1个链表头,将要原创 2021-07-24 11:30:35 · 551 阅读 · 4 评论 -
108 platform:虚拟的平台总线
platform_device:继承device,关联硬件代码platform_driver:继承device_driver,重设probe函数指针platform(bus_type):统一管理、设置match匹配规则平台总线注册drivers/base/platform.c/sys/bus/platformplatform_bus_init()函数struct bus_type platform_bus_type = { .name = "platform", .dev..原创 2021-07-03 14:22:37 · 228 阅读 · 0 评论 -
106 class:设备管理
class:设备的大管家硬件设备分类管理与 udev 协作,自动创建设备文件上图中:classes_init() 在系统启动时在 sysfs根目录 /sys 下创建 /class 。class_create() 在 /sys/class 目录下创建子目录。/sys/class/xxx 代表某一类设备。device_create() 进一步创建 /sys/class/xxx/yyy, 不只创建了 yyy 目录项,也为 yyy 创建了属性文件,此属性文件记录了这个硬件设备的的设备号。kobj原创 2021-06-21 21:37:37 · 187 阅读 · 0 评论 -
105 uevent:内核消息的快递包
uevent机制kobject对象可以通过uevent机制往用户空间发送信息kobject_uevent:内核消息发送接口广播方式发送NETLINK:特殊的网络通信,本地主机使用。mdev / udev 负责监控此连接,有消息就获取。传统做法是内核执行 hotplug 程序 进行消息通知(效率低、不优雅)udev/mdev:用户空间守护进程,监听广播信息默认开机启动,systemdudevadm monitor:打印uevent事件。shell下输入此指令,udev原创 2021-06-18 23:08:59 · 345 阅读 · 0 评论