- 博客(212)
- 收藏
- 关注
原创 39 pinctrol(五)pinctrl client于pinctrl driver联系
前言整体结构1. pinctrl dirver于pinctrl clientplatform_driver与platform_device在匹配的过程中会调用really_probe在really_prebe中调用pinctrl_bind_pins(下图为pinctrl_bind_pins的大体实际框架)主要实现一下三个方面的功能pinctrl_map的创建或索引(bind pi...
2023-08-20 21:09:00
144
原创 38 pinctrl(四)pinctrl driver
前言一些使用技巧查看设备支持的pinctrlls /sys/kernel/debug/pinctrl/查看pinctrl中支持的引脚、组、functioncat /sys/kernel/debug/pinctrl/20e0000.iomuxc/pinscat /sys/kernel/debug/pinctrl/20e0000.iomuxc/pingroupscat /sy...
2023-08-13 15:35:00
138
原创 37 pinctrl(三)数据结构
1. pinctrl在device tree中的定义和使用2. pinctrl driver init3. 常用数据结构pinctrl驱动的注册主要实现函数struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc, struct device *dev, void *driver_data)...
2023-07-30 14:05:00
84
原创 35 pinctrl(一)简介.md
1. 简介 pinctrl: 即pin controller引脚控制。对应设备的iomux和config模块2. pinctrol作用引脚的枚举和命名列出所以的设备的引脚,并对其进行命名引脚复用指定引脚复用情况。复用为GPIO还是IIC或者其他引脚配置配置引脚的基本属性。上拉,下拉,开漏等3. pinctrol学习方向pinctrol学习一般而言可以从一下方...
2023-07-23 14:07:00
56
原创 34 IIC(十二)IIC Adapter 源码分析
1. device tree100ask_imx6ull-14x14.dtsiic adapter注册pinctrl_i2c1: i2c1grp { fsl,pins = < MX6UL_PAD_UART4_TX_DATA__I2C1_SCL 0x4001b8b0 MX6UL_PAD_UART...
2023-07-23 13:55:00
62
原创 33 IIC(十一)IIC Control Register
1. IIC 控制器通用结构对于IIC Control器而言一般结构如下,不同设备会存在个体差异,但整体差别不大control_register设置SCL的clock的frequencytx_register将数据写入tx_register,数据会被shift_register(移位寄存器)一位一位通过SDA发送出去。数据发送完成之后,设备会产生一个中断rx_regi...
2023-07-23 13:54:00
83
原创 32 IIC(十)I2C GPIO
源码1. 设备树gpio模拟iici2c_gpio: i2c-gpio { /* gpio模拟iiccompatiable必须为i2c-gpio */ compatible = "i2c-gpio"; /* 指定子节点的reg addr为1个32为表示, 没有size */ #address-cells = &...
2023-06-25 21:51:00
228
原创 31 IIC(九)iic adapter
代码1 iic adapter驱动架构i2c adapter设备是挂载于platform bus整体重点架构如下分配struct i2c_adapter *adap = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL);设置adapter->owner = THIS_MODULE;adapter->algo = &...
2023-06-24 15:29:00
86
原创 30 IIC(八)iic client
源码1. iic client创建方法1.1 通过设备树直接创建只需要在对应i2c总线下指定设备信息即可示例:需要注意这里i2c1就是I2C BUS01.2 通过用户空间直接去生成i2c client创建i2c clientecho name addr > /sys/bus/i2c/devices/i2c-n/new_devicei2c-n: i2c adapter删除...
2023-06-18 14:35:00
95
原创 29 IIC(七)AP3216C
1. 简介AP3216C集成了光强(Ambilent Light Sensor,ALS)、距离(Proximity Sensor,PS)和红外传感器(Infrared Radiation LED,IR)。该芯片通过IIC接口与主控芯片交互实物图内部结构VDD: 3.3VSLC: IIC ClockGND:LEDA: 3.3VLEDC: 一般接LDRLDR: LED...
2023-06-18 13:54:00
700
原创 28 IIC(六)i2c-dev.c
1. 简介i2c-dev可以看做一个通用的i2c设备驱动,不过对它而言它是虚拟的。相当于i2c-dev文件实现了一个通用的i2c_driver功能。当然具体的细节就需要放到应用态去实现了。需要注意的是i2c-dev.c文件中实现的read、write一般而言只能实现单条信息发送。对于两条及其以上信息的发送需要使用ioctl2 IIC dev 分析2.1 i2c_dev_init初始化之...
2023-06-03 15:27:00
262
原创 27 IIC(五)i2c体系结构
1. I2C体系结构组成在linux中i2c驱动由三部分组成:i2c-core(i2c核心)、i2c总线驱动、i2c设备驱动结合上图描述可知应用态访问内核态可以使用特定的I2C driver,也可以使用通用的i2c_devi2c_dev.c文件内部实现的是基本的通用的i2c驱动程序。它对外只提供基本的i2c操作,相当于把部分驱动操作放到了应用层去实现i2c设备驱动通过i2c...
2023-05-23 22:36:00
199
原创 26 IIC(四)AT24C02 EEPROM
代码1. AT24C02简介设备使用AT24C02芯片(EEPROM)1.1 原理图1.2 引脚描述1.3 寻址AT24C02使用7bit表示设备地址,其中高四位固定为1010。结果原理图可知EEPROM的地址为0x501.4 读写操作需要注意一点EEPROM在接受到一帧写数据后会进入一段时间(twr)的内部写周期。此时间段内不响应主机。twr的时间1.4.1 写...
2023-05-14 14:28:00
78
原创 25 IIC(三)I2C_Tools
i2c-tools1. 编译i2c-tools从官网下载相关源码包设置交叉编译工具链export ARCH=armexport CROSS_COMPILE=arm-linux-gnueabihf-export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_a...
2023-05-14 14:24:00
84
原创 24 IIC(二)SMBus协议
SMBus协议:http://www.smbus.org/specs/1. SMBus简介SMBus:System Manage Bus,系统管理总线SMBus是基于IIC协议发展而来,SMBus要求比IIC更加严格,是其子集2. SMBus与IIC的区别VDD的极限值不一样IIC:范围广SMBus:1.8v-5v时钟频率和clock stretingIIC:无限制...
2023-05-07 13:13:00
590
原创 23 IIC(一)IIC协议简介
1 硬件连接IIC硬件接线一般如下所示。从主控芯片引出两根线SCL和SDA。外加一个上拉电阻2 数据传输格式2.1 写操作主控芯片发出start信号主控芯片发出一字节的数据。前7bit为设备地址,最后一bit为方向:0表示写,1表示读主设备等待从设备应答主设备接到从设备的应答后开始发送数据,每次发送一字节一字节数据发送完后主设备等待从设备应答后继续相关操作主设备发送停止信...
2023-05-03 14:32:00
82
原创 22 同步与互斥(八)总结
1 实现的基础同步与互斥的基本操作:spinlock;semaphore;mutex而实现上述操作的基本是基于:原子操作;中断屏蔽;抢占屏蔽来实现的对于spinlock;semaphore;mutex等相关的操作,基本实现都是lock时,放回成功表示上锁成功。否则就需要等待对应unlock后才能返回成功,进入临界区2 彼此的关联与区别2.1 spinlock与semaphore mu...
2023-05-01 15:59:00
52
原创 21 同步与互斥(七)互斥量
1 简介mutex相对于semaphore更加高效。mutex在面对SMP时,如果mutex在别的CPU上运行,而“我”是唯一在等待这个mutex的进程。此时“我”是不会去休眠的,而是原地spin2 mutex的结构和API2.1 mutex结构struct mutex my_mutex;struct mutex { /* 1: unlocked, 0: locked, negat...
2023-05-01 14:42:00
46
原创 20 同步与互斥(六)semaphore
1 简介semaphore信号量;需要注意的是信号量不是信号。信号量是一种同步、互斥机制2 semaphore的结构和API2.1 semaphore结构struct semaphore sem;struct semaphore { raw_spinlock_t lock; // semaphore借助与spinlock实现 unsigned int count; ...
2023-04-29 20:28:00
39
原创 19 同步与互斥(五)自旋锁
1 简介自旋锁:通俗的说就是自己在原地打转,一直等待资源可用。不会休眠对临界资源的访问时,因为自旋锁的存在,某段临界资源被占用后。其他事件将无法访问,即进行所谓的自旋,“原地打转”注意:在自旋锁的临界区不能使用可能引起进程调度的函数(因为抢占已经被禁止了)。示例: copy_to_user、copy_from_user、kmalloc、msleep等可能会导致内核崩溃sp...
2023-04-29 17:11:00
44
原创 18 同步与异常(四) 原子操作
1 简介原子操作此操作是不会被打断的2 ldrex、strex、teqldrex相对ldr而言此命令多了ex(exclude排除),意为独占eg: 将会对ldr r0, r1命令中的r1标记为独占strex相较于str基本功能而言多出清除独占标记eg: strex r2, r0, r1将r0写入r1,并清除r1的独占标记。成功将r2设为0,如果r1已经被清掉了独占择将r...
2023-04-19 22:15:00
41
原创 17 同步与互斥(三) 中断屏蔽
中断处理流程1 简介中断屏蔽是一种可以防止并发导致竞态的方法。在进入临界区之前屏蔽系统中断可以保证正在执行的内核路径不被打断(进程调度也依赖于中断)。不过在驱动编程中此方法并不值得推荐。因为驱动并不一定运行在单核上,面对SMP系统中断屏蔽并不能屏蔽掉别的CPU的中断操作,此时使用中断屏蔽也就不能实现我们预期的结果了。2 常用APIlocal_irq_disable禁止中断#d...
2023-04-06 21:21:00
73
原创 16 同步与互斥(二) 内联汇编
汇编参考GCC工具链使用1 引入内联汇编即在C函数中使用汇编去实现某些功能。为什么需要在C代码中引入汇编?C语言在大多数的时候效率都很高,但在某些情况下直接使用汇编效率会更加高效部分功能通过C语言很难实现,这部分代码就需要使用汇编去实现(实现某些功能)在C文件中使用汇编存在两种方法在.s文件去实现某个功能函数,在C文件中去调用(缺点:需要另外建一个文件)在C文件中直接使用汇...
2023-04-02 16:34:00
61
原创 15 同步于互斥(一) 并发、竞态和编译乱序、执行乱序
1 并发和竞态 1.1 简介设备在运行的过程中存在多个进程对资源的并发访问多个执行单元同时,并行的执行。并发事件对共享资源的访问(硬件资源,全局变量,静态变量等),很容易导致设备出现竞态。竞态的出现会导致设备出现异常1.2 单核和多核(SMP)并发下的竞态1.3 总结关于共享资源的这部分临界区我们需要保护起来防止多个进程同时操作;可以采用的途径为:中断屏蔽、原子操作、自旋锁、信...
2023-03-30 23:52:00
42
原创 14 mmap
代码编程指南确定物理地址确定是否使用cache、buffer建立映射关系1 引入应用程序与驱动程序之间进行数据传递时常使用read,write此实现方法本质上是在用户态的buffer与内核态的buffer之间进行了一次copy。此方法本质上没有什么问题,不过在数据量比较大的时候效率就会显的太低。此时引入mmap可以直接使读去内核态中的buffer,把内核的buffer直接映射...
2023-03-26 17:49:00
120
原创 13 中断线程
代码1 概述避免workqueue中存在多个work会导致后面的work执行存在受前面工作的影响在中断下半部专门申请一个内核线程来处理这个事件,这个内核线程专门用于此中断1.1 内部机制设备发生中断时内核会调用handler处理中断事件(如果中断函数存在)。中断处理完成后,如果有需要的中断线程需要处理则调用中断函数返回IRQ_WAKE_THREAD,用于唤醒中断线程;如果没有中断线程...
2023-03-19 16:49:00
34
原创 12 workqueue
代码编程指南构造workqueue将workqueue放入队列,开始调度1 工作机制内核线程(while(1))中对去判定是否存在workqueue;如果不存在择休眠;如果存在workqueue则等待wake up事件唤醒workqueue,然后执行workqueue中的fun1.1 内核线程的创建每一个CPU将会创建两个worker_pool;一个普通优先级,一个高优先级...
2023-03-19 16:46:00
32
原创 11 tasklet
代码1 tasklet调度机制中断上半部执行完后,使能调度下半部;中断下半部softirq_init中会调用asklet_action,在此函数中会去遍历链表检测符合条件的tasklet选出执行 2 常用API和数据结构2.1 tasklet_structstruct tasklet_struct{ struct tasklet_struct *next; unsigned l...
2023-03-19 16:41:00
29
原创 10 定时器
第6课.定时器代码1 定时器的时间单位在内核中.config文件中CONFIG_HZ配置为每秒linux的时钟滴答次数,没发生一次全局变量jiffies便会增加1在日常使用中使用HZ表示一秒2 常用函数及其数据结构struct timer_list *timer (timer_list结构体)struct timer_list { /* * All fields that ...
2023-03-12 15:15:00
49
原创 09 阻塞与非阻塞
1. 阻塞与非阻塞的实现和使用1.1 openopen文件的时候选择0_NONBLOCK使用非阻塞方式打开文件;默认为阻塞1.2 fcntl通过fcntl直接修改文件的flag为阻塞或非阻塞注意:对于普通文件、块设备非阻塞不请作用对于字符设备非阻塞起作用的前提是驱动中实现了相关功能...
2023-03-12 14:09:00
31
原创 08 异步通知
第5课.异步通知代码编程指南应用态在应用态使用signal函数处理应用态需要打开对应的驱动将进程ID传递给驱动(getpid)驱动记录pid使能file中f_flags为FASYNC事件触发时通过kill_fasync发出信号1. 异步通知原理应用程序不休眠,不阻塞。事件触发了才会去处理。驱动程序向应用程序发送信号;常用信号类型SIGIO表示有IO时间触发引用百...
2023-03-09 22:04:00
31
原创 07 poll
第4课.poll机制代码1 poll工作机制poll允许进程对一个或多个文件做非阻塞的读取或者写入。引用百问网的图片需要注意的是步骤四与五,应用程序调用poll函数在文件系统层sys_poll调用驱动的poll接口:将线程挂入wait队列,并返回poll的事件类型。sys_poll会根据事件的类型去觉得是否休眠,如果休眠时间到了就会返回应用态timeout因为在sysfs层会循环去...
2023-03-05 17:53:00
29
原创 06 休眠唤醒
第3课.Linux异常处理体系结构源码 编程指南需要定义一个等待队列(DECLARE_WAITQ_UEUE_HEAD)将wait_event线程放入queue 1.休眠唤醒 1.1 休眠函数文件路径include\linux\wait.h函数说明wait_event_interrupt(wq, condition)休眠一直到condition为真才退出 ...
2023-03-05 13:14:00
37
原创 05 Linux对中断的处理
代码示例第3课.Linux异常处理体系结构 1.Linux中中断的定义Linux中将中断划分为为硬件中断和软件中断CPU在处理中断时,CPU是不能进行调度的。即A中断尚未处理完之前CPU是不会响应B中断的,即使B中断的优先级比A高中断处理原则:不能嵌套(因为中断会存在上下文的保存和还原)越快越好中断也分未上半部和下半部上半部处理紧急的事情,此时会关中断。无法处理其他中断...
2023-02-14 22:26:00
43
原创 03-02 KEY IMXULL 寄存器
1 原理图KEY1 <---> GPIO5_1KEY2 <---> GPIO4_142 寄存器操作指南使能GPIO5和GPIO4的时钟(imx6ull默认使能)查询寄存器可知,GPIO5_CLK_ENABLE使用CCGR1[CG15];GPIO4_CLK_ENABLE使用CCGR3[CG6]配置GPIO功能复用为GPIO(IOMUXC)...
2022-11-20 16:09:00
40
原创 04 Pincontrl子系统和GPIO子系统
LED模块代码Official DocumentDocumentation\devicetree\bindings\gpio\gpio.txtDocumentation\gpio\Pinctrl-bindings.txtDocumentation\devicetree\bindings\Pinctrl\Pinctrl-bindings.txt修改示例1. Pincontrol ...
2022-11-20 15:54:00
63
原创 04 设备树的处理流程
1.内核对设备树的处理每个节点都会转化为一个device_node部分device_node会转化为platform_deviceof_platform.h文件中会把device_node转化为platform_device,实际使用的时候一般是去读device_node获取参数根节点保存在of_root中,从of_node可以访问到任何节点(of: open firmware)...
2022-10-19 18:12:00
44
原创 03 设备树的编译和使用
1. 编译设置完ARCH、CROSS_COMPILE、PATH后可直接make dts文件编译过程,首先调用arm-linux-gnueabihf-gcc对dts文件进行预处理。将include文件包含进来使用scripts/dtc/dtc 命令编译生成dtb文件注意:dtc不支持#include,所以依赖arm-linux-gnueabihf-gcc。它只支持/include...
2022-10-19 17:47:00
104
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人