02 Linux设备驱动模型
Linux设备驱动模型简介Linux设备驱动模型是内核中用于统一管理硬件设备、驱动程序和总线关系的核心框架。它通过一系列抽象结构(如struct device、struct device_driver、struct class、struct bus_type等)构建了一个层次化的设备拓扑,使内核能够动态管理设备的生命周期(如热插拔、电源管理),并为用户空间(通过 /sys)提供标准化的设备信息接口。 设备驱动框架和设备驱动模型不是一个东西,前者指的是GPIO、Input、Pinctl等子系统,而后者主要是Linux内核对于驱动开发中的一种设计模式 Linux设备驱动模型的核心思想是把我们编写的驱动代码进行分层解耦: 设备:提供硬件资源 驱动:使用设备提供的硬件资源进行初始化等操作 总线:将设备和驱动匹配起来 任何设备都挂在在某个总线上,即使物理上没有总线,也要虚拟出来个总线(platform) 核心目标 统一管理硬件:无论设备是 PCI、USB、I2C...
06 操作系统
操作系统内存管理1.介绍下Linux的内存子系统 虚拟内存管理:地址空间、页表、内存布局 物理内存管理:struct page、Zone区、伙伴系统、SLAB分配器 页缓存、回收、换页机制:通过页缓存加速 I/O;当内存紧张时,kswapd 回收不常用页、OOM-Killer...
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...
001 安卓概述
安卓概述系统架构安卓是基于Linux内核的一种在移动设备中非常常用的操作系统,从整体来看它分为以下几层: Linux内核层 提供硬件驱动(显示、摄像头、蓝牙等)和OS的基本功能(进程调度、内存管理、电源管理、安全、网络协议栈…等) 基于开源Linux内核,在此基础上添加了部分安卓专用的驱动 安卓对于Linux内核的改动1.出于效率,安卓没有使用glibc,而是采用了google开发的Bionic Libc 2.没有完全照搬Linux内核,除了修正一些Bug外,还加了不少内容,比如补充了一些文件系统 3.没有本地基于X服务的窗口系统 4.对Linux的驱动框架进行了增强,比如Binder、电源管理、USB… 硬件抽象层(HAL)作用:标准化硬件接口(如相机、传感器),允许厂商定制驱动而不影响上层框架。保护了硬件厂商的知识产权,隐藏特定平台的硬件接口细节 实现形式: 传统 HAL(Android 8 之前):直接通过 动态库(.so) 调用驱动 现代 HAL(Android 8+):通过...
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...
05 字符设备驱动框架
字符设备驱动框架简介Linux的字符设备驱动框架是以struct cdev为核心的一套API,通过向内核注册cdev,从而向用户空间提供对设备进行IO操作的接口 注意:Linux字符设备驱动框架主要用于封装设备的IO操作,有别于Linux的设备驱动模型,并不负责设备与驱动的匹配之类的,所以2者通常同时出现 而且不是所有字符设备的驱动都需要用到这个框架,比如一个用了input子系统的按键,它不需要向用户提供IO操作的接口,所以就不需要(其实这是驱动分层的结果,input子系统的核心层会用到该框架来提供用户对/dev/input/eventXIO操作的能力,但我们自己写的驱动层不需要用) 核心组件 cdev12345678910111213141516struct cdev { struct kobject kobj; struct module *owner; const struct file_operations *ops; struct list_head list; dev_t dev; unsigned int...
08 GPIO子系统
GPIO子系统GPIO子系统是 Linux 内核中用于管理和控制通用输入/输出引脚的核心框架,它为开发者提供了统一的接口来操作硬件上的 GPIO 引脚,使用前需要用pinctrl将该引脚的复用配置成GPIO 驱动架构GPIO子系统的驱动同样遵循着“主机驱动和设备驱动分离”和“驱动分层”的思想,分为主机驱动层、核心层、设备驱动层 主机驱动层主机(GPIO控制器)驱动一般由原厂提供,且也作为设备树中的一个节点 SoC内部对于GPIO一般都有专门的控制器外设,它直接位于SoC的内存空间,通过配置该外设的寄存器,从而控制某个具体的GPIO 12345678910111213141516/{ soc{ aips1{ gpio1: gpio@0209c000 { compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio"; reg = <0x0209c000 0x4000>; interrupts =...
04 设备树
...
16 I2C子系统
...






