04 内核移植及分析
...
01 驱动开发概述
Linux驱动开发概述简介Linux驱动开发是设备驱动模型、驱动子系统、内核基础设施三者的深度整合: 设备驱动模型提供通用框架,实现驱动与设备的匹配 各个子系统实现垂直领域优化(如输入、存储、网络) 内核设施与硬件操作解决并发、内存、中断等底层问题 驱动开发子系统定义 子系统是指针对特定功能领域或硬件类型设计的软件框架。其核心目标是解耦硬件差异,提供统一的API,使得驱动开发者无需直接操作底层寄存器或硬件细节,而是通过标准化API完成功能开发 所有的驱动子系统的实现均遵循分层架构原则 用户接口层:通过sysfs或/dev节点提供控制接口 核心层:实现事件队列、资源分配等通用逻辑 硬件驱动层:厂商实现具体寄存器操作 123456789 用户空间 │ ▼ 用户口层(如VFS、sysfs) │ ▼ 子系统核心层(标准API) ↗ ↖ ↖设备驱动层A 驱动层B ...
08 进不去系统
进不去系统 在做BSP开发时,难免会因为设置了什么东西,导致启动参数之类的错误,而无法正常进入系统了,这个文档记录一下自己遇到的问题和解决方法 extlinux.conf错误这个问题出现在调试地平线板子的时候,因为修改错误了/boot/extlinux/extlinux.conf,导致开发板在uboot引导kernel的时候错误,只能进入initramfs 解决思路其实很简单,就是再启动内核前把/boot/extlinux/extlinux.conf改回去。但是这其实还是比较困难的,因为在uboot或者initramfs中是没有直接挂载Linux的/boot目录的,所以没法直接访问 解决办法: 首先得知道/boot在哪个分区 12345678910111213141516171819202122sunrise@ubuntu:/media$ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSmmcblk0 179:0 0 59.6G 0 disk├─mmcblk0p1 179:1 0 1M...
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...
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 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...







