08 pkg config
pkg-configpkg-config是一个命令行工具,使用它可以快速查看当前环境中安装了哪些第三方库,方便在一个库没提供.cmake文件时链接该库 核心用法12345678910pkg-config --list-all # 列出所有库pkg-config --modversion 库名 # 查看版本pkg-config --cflags 库名 # 查看编译标志pkg-config --libs 库名 # 查看链接标志pkg-config --variable=libdir 库名 # 库文件目录pkg-config --variable=includedir 库名 # 头文件目录pkg-config --variable pc_path pkg-config 注意事项 不是所有库都注册了 pkg-config 信息,有些库可能没有 .pc 文件,但是使用apt安装的带-dev的包一般都带.pc文件 如果找不到某个库,可能是因为: 库确实没有安装 库没有提供 .pc 文件 .pc 文件不在 pkg-config...
10 包管理工具
包管理工具在Linux系统中,包管理工具是软件安装、升级、卸载和维护的核心组成部分,它们极大地简化了软件管理过程。不同的Linux发行版采用了不同的包管理体系,比如Debian系用的是apt、RetHat系用的是yun… dpkg dpkg是Debian系列发行版中最底层的包管理工具,它直接面向本地.deb格式的软件包 dpkg的主要职责是对单个软件包进行操作,例如安装、卸载、查看包信息等 它本身并不具备自动解决依赖关系的能力,因此在使用dpkg安装软件时,如果该软件依赖的其他库或组件尚未安装,dpkg只会报错并终止操作,需要用户手动处理依赖问题 123456789101112131415161718192021222324# 安装本地的.deb软件包,如果依赖缺失会报错但不会自动解决dpkg -i package.deb# 卸载已安装的软件包(但不删除/etc下的配置文件,适合以后重新安装)dpkg -r package_name# 完全卸载软件包(同时删除配置文件)dpkg -P package_name#...
02 计算机体系结构
计算机体系结构什么是体系结构 在讨论计算机设计时,有几个概念经常被混在一起。实际上,它们对应的是从不同抽象层次、不同视角去看同一台计算机。自上而下来看,可以大致分为以下几个层级。 1.体系结构(Architecture)/ 指令集架构(ISA) 体系结构 = 软件眼里的CPU 这一层是从软件视角来看计算机,ISA的内容包括: 指令集:属于RISC还是CISC、支持的指令(如 ADD、MOV)、指令格式、操作数类型 寄存器结构:通用寄存器、状态寄存器(如 x86 的 EFLAGS、ARM 的 CPSR),各寄存器宽度 内存管理:虚拟内存映射,地址空间、对齐要求、内存访问语义、字节序 中断与异常模型:异常类型(如缺页、非法指令)、处理流程 特权级别:定义特权模式(如 x86 的 Ring 0-3、ARM 的...
05 外设总线协议
外设总线协议UART总线概述定义: UART(Universal Asynchronous Receiver/Transmitter)通用异步收发器:异步、串行、全双工通信 USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步收发器:同步或者异步、串行、全双工通信 异步时靠波特率进行数据同步 同步时需要额外的CLK线 UART和USART不是总线,是点对点通信 特点: 点对点通信 传输距离较远(可达几十米) 硬件简单,成本低 硬件结构 信号线 作用 TX 发送数据线 RX 接收数据线 GND 共地线 UART原始输出是TTL电平,可通过PHY芯片转成别的电平,比如RS232、RS485、USB 通信时序数据帧格式 起始位:1位低电平 数据位:5-9位(通常8位) 校验位:可选(奇校验/偶校验/无校验) 停止位:1-2位高电平 波特率 双方必须约定相同的波特率(如9600,...
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...
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 =...






