- 博客(51)
- 收藏
- 关注
原创 platform总线下的管理
platform_device结构体:(include\linux\platform_device.h)对于任何一种Linux设备驱动模型下的总线都由两个部分组成:描述设备相关的结构体和描述驱动相关的结构体。1.两个结构体platform_device和platform_driver。
2025-02-16 10:59:46
42
原创 平台总线模型
平台总线会维护**两条链表,分别管理设备和驱动**。当一个**设备被注册到总线上**的时候,总线会**根据其名字搜索对应的驱动**,如果**找到就将设备信息导入驱动程序并执行驱动**:当**一个驱动被注册到平台总线**的时候,**总线也会搜索设备**。为了解除驱动代码(方法)和设备信息(数据)耦合的问题,Linux提出了platform bus(平台总线)的概念,**即使用虚拟总线将设备信息和驱动程序进行分离**。总之,**平台总线负责将设备信息和驱动代码匹配,这样就可以做到驱动和设备信息的分离**。
2025-02-16 10:59:02
55
原创 **DTS和DTSI**
dtsi的使用方法,类似于C语言的头文件,在dts文件中需要进行include *.dtsi文件。dtsi本身也支持include另一个dtsi文件。一种ASCII文本对设备树的描述,放置在内核的/arch/arm/boot/dts目录。一般而言,一个.dts文件对应一个ARM的machine。由于一个SOC可能有多个不同的电路板,而每个电路板拥有一个 .dts文件。这些dts势必会存在许多共同部分。为了减少代码的冗余,设备树将这些共同部分提炼保存在.dtsi文件中,供不同的dts共同使用。
2025-02-16 10:58:31
32
原创 设备树的组成
设备树包含DTC(device tree compiler),DTS/DTSI(device tree source)和DTB(device tree blob)。,dtc将dts文件为转换可由Linux内核解析的。
2025-02-16 10:57:30
42
原创 CPU的数量和类别
使用设备树的优势 对于同一SOC的不同主板,只需更换设备树文件.dtb即可实现不同主板的无差异支持,而无需更换内核文件。无冗余代码,修改引脚时只需要修改 dts 文件并编译得到 dtb 文件,把它传。代码稍微复杂,但是易于扩展。无需重新编译内核/驱动。
2025-02-16 10:56:54
42
原创 嵌入式LINUX驱动开发(一)之hello驱动(基于IMX6ULL-MINI开发板)
比如驱动程序中这样包含头文件: #include <asm/io.h>, 其中的asm是一个链接文件,指向asm-arm或asm-mips,这需要先配置、编译内核才会生成asm这个链接文件。开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译的,这两个内核不一致时会导致- -些问题。库可以和系统内核相连接,我们写了一个驱动程序,就需要告诉内核,这个过程叫做注册。其实应用程序到库是比较容易理解的,比如我们刚学习C语言的时候,使用了printf,scanf等等这些函数。而这些函数就在库中。
2025-02-10 16:36:45
1135
原创 CAN通信
CAN总线使用不同的电压电平来表示0和1,并通过差分信号传输来抗干扰。,适用于需要高实时性和高可靠性的系统。CAN通信的特点之一是支持多节点之间的。
2025-02-09 16:00:32
192
原创 IIC通信及设备驱动
AP3216C 是红外、光强、距离三合一的传感器。以读出光强、距离值为例。⚫ 复位:往寄存器 0 写入 0x4 ⚫ 使能:往寄存器 0 写入 0x3 ⚫ 读光强:读寄存器 0xC、 0xD 得到 2 字节的光强 ⚫ 读距离:读寄存器 0xE、 0xF 得到 2 字节的距离值 注意,AP3216C 的设备地址是 0x1E,假设节在 I2C BUS0 上,操作命令如下: 这里我们使用的是i2c-tools在开发板上进行测试,不知道这个工具的可以自行百度。
2025-02-09 16:00:04
1083
原创 SPI通信及设备驱动
SPI 主机驱动就是 SOC (System on Chip,系统级芯片或片上系统)的 SPI 控制器驱动,类似 I2C 驱动里面的适配器驱动。..............................第 41 行:transfer 函数,和 i2c_algorithm 中的 master_xfer 函数一样,控制器数据传输函数。
2025-02-09 15:56:41
1518
原创 串口通信必须要了解的基础知识概念
使用DMA方式,外部设备在数据准备好之后只需向DMA控制器发送一个命令,把数据的地址和大小传送过去,由DMA控制器负责把数据从外部设备直接存放到内存。外部设备准备好之后,向CPU发送中断信号,CPU收到中断信号后停止当前的工作,会根据中断信号指定的设备号处理相应的设备。全双工通信允许数据同时在两个方向上传输,即有两个信道,因此允许同时进行双向传输。数据位在导线中同时传输,下图显示了二进制(01000011)中字母“C”的并行传输: 当时钟线为高电平时,8个数据位同时接受数据,高电平为1,低电平为0。
2025-02-09 15:48:15
1052
原创 select、poll、epoll三者的优缺点
用户可以注册多个socket,然后调用select函数读取被激活的socket,从而实现在同一个线程内同时处理多个IO请求,在这点上select函数与同步阻塞模型不同,因为在同步阻塞模型中需要通过多线程才能达到这个目的。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。epoll使用一个文件描述符管理多个描述符,它将文件描述符的事件放入内核的一个事件表中,从而在用户空间和内核空间的复制操作只用实行一次即可。
2025-01-19 23:01:41
647
原创 基于select实现并发处理
待检测集合(第2、3、4个参数)需要频繁的在用户区和内核区之间进行数据的拷贝,效率低内核对于select传递进来的待检测集合的检测方式是线性的如果集合内待检测的文件描述符很多,检测效率会比较低如果集合内待检测的文件描述符相对较少,检测效率会比较高使用select能够检测的最大文件描述符个数有上限,默认是1024,这是在内核中被写死了的。5.循环调用select(),周期性的对所有的文件描述符进行检测6.select()解除阻塞返回,得到内核传出的满足条件的就绪的文件描述符集合。
2025-01-19 22:57:26
722
原创 IO多路复用详解-select&poll&epoll
epoll全称eventpoll,是linux内核实现IO多路转接/复用(IOmultiplexing)的一个实现。IO多路转接的意思是在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效。对于待检测集合select和poll是基于线性方式处理的,epoll是基于红黑树来管理待检测集合的。
2025-01-19 22:53:02
1377
原创 Keil下载芯片包时找不到根目录的办法
2.重新安装的时候,一定要记住默认路径的格式(Keil_v5,,,,千万不要写为Keil5,不然识别不出来)经过三次的安装发现,在安装选择路径的时候,一定要按照默认的格式,不要瞎改,不然根本识别不出来!问题得以解决,最后附上网盘下载链接(Keil 5.39版本)
2024-12-02 19:27:34
692
原创 代码随想录之字符串刷题总结
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]示例 2:输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a","H"]
2024-11-07 21:05:03
829
原创 C++面向对象三大特性之继承
有些类与类之间存在着特殊的关系,定义类的时候,下级别的成员除了拥有上一级的共性,还有自己的特性。总结:同名静态成员处理方式与非静态处理方式一样,只不过有两种访问的方式(通过对象和类名)1.羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。问题:子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?3.当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以。语法:class 子类 :继承方式 父类1 , 继承方式 父类2...
2024-11-01 09:45:17
784
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人