26 PCIE
PCIE拓扑结构PCIE并不是像IIC/PCI那样的共享并行总线式结构,它是点对点通信的串行总线 点对点通信:不存在总线仲裁、广播冲突等问题 串行通信:一个bit一个bit的发送数据 设备的连接呈树形结构: 12345678CPU └── Root Complex └── Root Port(bridge) └── Switch(bridge) ├── Downstream Port(bridge) │ └── Endpoint(设备) └── Downstream Port(bridge) └── Endpoint 在PCIE的拓扑中,有以下这些十分重要的概念: Root ComplexRoot Complex是CPU/SoC内部的PCIE控制器,是整个PCIE拓扑的起点,它有以下作用: 发起所有PCIe访问 管理PCIe地址空间 枚举所有PCIE设备 Root...
25 IIO子系统
IIO子系统IIO(Industrial I/O)子系统是Linux中对于类ADC传感器(温湿度、电压、电流、IMU…)数据采集所提供的一个框架 总览在Linux内核中,IIO同样遵循着“驱动”分层的理念,一个完整的IIO设备的驱动可以分为以下几层 iio-core: 提供统一的用户空间接口(/sys/bus/iio/iio:deviceX/和字符设备) 管理IIO子系统的初始化和退出 实现IIO设备的注册与注销机制 定义标准的IIO操作数据结构(iio_info, iio_dev等) iio device driver:这一层直接与硬件交互,是驱动开发者的工作重点 实现iio_info结构体中的回调函数(read_raw, write_raw,...
07 pinctrl子系统
pinctrl子系统pinctrl子系统的作用 获取设备树中 pin 的信息 设置 pin 的复用功能(在6ULL由IOUMXC寄存器控制) 设置 pin 的电气特性,比如上/下拉、速度、驱动能力等 (在6ULL由PAD寄存器控制) 相关寄存器对于引脚的配置,不同平台通常不一样: IMX6ULL使用IOMUXC(Input/Output Muliplexing Controller),和IOMUXC-SNVS寄存器实现引脚复用功能的设置、使用每个GPIO的PAD寄存器进行引脚电气属性的设置 IOMUXC和IOMUXC-SNVS的区别主要在于配置的引脚所属的电源域,前者控制主电源域的引脚,而后者控制SNVS这个独立的电源域的引脚(该电源域用于在系统休眠时维持部分功能) 同一个引脚只能由一个引脚配置模块来配置 使用方法pinctrl子系统的使用通常遵循以下步骤: 1.定义引脚控制组:节点的名字一般以grp结尾 1234567&iomuxc { // LED的引脚控制组 pinctrl_led: ledgrp { //...
18 SPI子系统
...
00 Linux内核模块
Linux内核模块Linux内核本身非常庞大,包含了很多东西,这带了一些问题: 许多功能我们可能并不需要,如果每次都把所有东西一起编译了,十分耗时且编译出来的镜像会很大 因此,Linux内核引入了“模块”机制,对于一些功能,它本身不直接编译进内核,而是以模块(.ko)的形式存在内核之外,一旦需要这些功能,可以动态将其加载进内核。一旦被加载,他们就和内核中其他部分没有区别 所以Linux的开发有2种方式: 1.将新功能直接编译进内核,这样当Linux内核启动时将自动运行设备驱动程序 2.将新功能编译成内核模块.ko文件,在Linux内核启动后使用相应命令加载驱动模块 通常在调试的时候使用第2种方式,这样在修改驱动时只需要修改驱动的代码,而不用重新编译整个内核并重启 内核模块程序结构12345678910111213141516#include <linux/module.h>#include <linux/fs.h>static int __init mydriver_init(void) { printk(KERN_INFO...
01 驱动开发概述
Linux驱动开发概述简介Linux驱动开发是设备驱动模型、驱动子系统、内核基础设施三者的深度整合: 设备驱动模型提供通用框架,实现驱动与设备的匹配 各个子系统实现垂直领域优化(如输入、存储、网络) 内核设施与硬件操作解决并发、内存、中断等底层问题 驱动开发子系统定义 子系统是指针对特定功能领域或硬件类型设计的软件框架。其核心目标是解耦硬件差异,提供统一的API,使得驱动开发者无需直接操作底层寄存器或硬件细节,而是通过标准化API完成功能开发 所有的驱动子系统的实现均遵循分层架构原则 用户接口层:通过sysfs或/dev节点提供控制接口 核心层:实现事件队列、资源分配等通用逻辑 硬件驱动层:厂商实现具体寄存器操作 123456789 用户空间 │ ▼ 用户口层(如VFS、sysfs) │ ▼ 子系统核心层(标准API) ↗ ↖ ↖设备驱动层A 驱动层B ...
24 网卡驱动移植
网卡驱动移植型号确认及模式设置在移植网卡驱动前,首先得知道它的型号。如果是USB网卡的话,可以通过lsusb命令查看 12345lsusb ...Bus 001 Device 003: ID 0bda:1a2b Realtek Semiconductor Corp. RTL8188GU 802.11n WLAN Adapter (Driver CDROM Mode... 很多网卡在未使用时,可能被初始化成U盘的模式,这时还需要我们将其转成网卡模式 这里RTL8188GU并不是真正的型号,因为它此时不是真正的网卡模式,RTL8188GU是Realtek常用“老型号马甲” 可以通过以下的指令,将USB网卡切换到真正的网卡模式 12345sudo apt install usb-modeswitch usb-modeswitch-datasudo usb_modeswitch \ -v 0bda -p 1a2b \ -M...
02 Linux设备驱动模型
Linux设备驱动模型简介Linux设备驱动模型是内核中用于统一管理硬件设备、驱动程序和总线关系的核心框架。它通过一系列抽象结构(如struct device、struct device_driver、struct class、struct bus_type等)构建了一个层次化的设备拓扑,使内核能够动态管理设备的生命周期(如热插拔、电源管理),并为用户空间(通过 /sys)提供标准化的设备信息接口。 设备驱动框架和设备驱动模型不是一个东西,前者指的是GPIO、Input、Pinctl等子系统,而后者主要是Linux内核对于驱动开发中的一种设计模式 Linux设备驱动模型的核心思想是把我们编写的驱动代码进行分层解耦: 设备:提供硬件资源 驱动:使用设备提供的硬件资源进行初始化等操作 总线:将设备和驱动匹配起来 任何设备都挂在在某个总线上,即使物理上没有总线,也要虚拟出来个总线(platform) 核心目标 统一管理硬件:无论设备是 PCI、USB、I2C...
22 HDMI
HDMI定义HDMI(高清晰度多媒体接口)主要用来传输视频、音频信号,它有type-a/b/c 3种形式的物理接口,最常用的是type-a的,包含19个引脚 引脚号 信号名称 功能描述 1 TMDS Data2+ 视频/音频数据通道2(差分对正极) 2 TMDS Data2- 视频/音频数据通道2(差分对负极) 3 TMDS Data1+ 视频/音频数据通道1(差分对正极) 4 TMDS Data1- 视频/音频数据通道1(差分对负极) 5 TMDS Data0+ 视频/音频数据通道0(差分对正极) 6 TMDS Data0- 视频/音频数据通道0(差分对负极) 7 TMDS Clock+ 像素时钟信号(差分对正极) 8 TMDS Clock- 像素时钟信号(差分对负极) 9 CEC 消费电子控制信号(设备联动控制) 10 HPD (Hot...
12 内存与IO空间的访问
内存与IO空间的访问内存和IO的硬件机制内存空间和IO空间 IO空间:x86架构CPU中的一个概念,代表了外设寄存器地址空间,通过特定指令访问 内存空间:大多数嵌入式CPU并没有IO空间,仅存在内存空间。可以直接通过地址、指针访问 不同CPU的地址空间一般都是从0x000000开始的,但是哪个外设对应哪一部分,一般都是不确定的,比如Imx6ull中,DDR的地址空间是从0x80000000开始的 内存管理单元内存管理单元(MMU)是CPU的非常重要的一个组件,用于辅助OS进行内存管理,它的功能如下: 提供虚拟地址到物理地址的映射 内存访问权限保护 缓存控制:通过PTE的某些字段来控制缓存的行为,比如是否允许缓存、缓存写回策略… 转换旁路缓存转换旁路缓存(Translation Lookaside Buffer,TLB)是MMU的核心部件,它缓存少量的虚拟地址与物理地址的转换关系,是转换表的Cache,因此也经常被称为“快表” 转换表漫游转换表漫游(Translation Table...






