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,...
05 Kbuild
KbuildKbuild(Kernel Build...
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...
06 开机自启动
Linux初始化系统 想要设置开发板的某程序开机时自启动,有多种方式,本质上是使用了Linux的初始化系统。在linux内核启动后期会尝试加载用户空间的init程序,init程序是由内核启动的第一个用户空间程序(PID为1),该程序负责启动用户空间的服务和程序 init程序由初始化系统提供,可以通过以下方法查看系统的init进程到底是谁: 法1: 法2:pstree -p BusyboxBusyBox 是一个高度集成的嵌入式Linux工具集,它既是一个轻量级初始化系统,也是一个精简版的Unix命令集合。它的核心设计目标是用最小的空间提供完整的Linux系统功能 BusyBox 提供了一个简化的init程序,用于替代传统的 SysVinit或 systemd,它的init程序有2种实现形式: (1) 传统 SysVinit 风格 配置文件:/etc/inittab 启动流程: 内核启动后执行 /sbin/init(通常是 BusyBox 的符号链接) BusyBox 读取 /etc/inittab,定义运行级别和启动脚本 执行 /etc/init.d/中的脚本(如...
00 常用路径总结
常用路径总结在Linux中,我们如果用apt之类的包管理工具安装些第三方库,他们放置的位置都出奇的一致,下面来总结一下 头文件编译时默认头文件查找目录 /usr/include /usr/include/x86_64-linux-gnu(架构相关的子目录) /usr/local/include(大部分发行版是默认的,但也有的不是) 搜索规则 编译器只维护一组搜索根目录列表 不会递归扫描子目录 会将#include中写出的相对路径与搜索根目录拼接后匹配 例如:#include <foo/bar.h> 会依次尝试: 123/usr/include/foo/bar.h/usr/include/x86_64-linux-gnu/foo/bar.h/usr/local/include/foo/bar.h(如果该路径在默认列表中) 第三方库头文件的组织方式 第三方库通常在搜索根目录下创建以库名命名的子目录 12/usr/include/x86_64-linux-gnu/opencv4/usr/local/include/mylib 使用方式为:#include...
11 查看配置信息
查看配置信息 有的时候,我们在使用其它人编译的内核的时候,可能希望知道某些配置项的设置,可以通过下面的方法进行查看 uboot启动参数1cat /proc/cmdline 内核编译配置1zcat /proc/config.gz 这个命令会显示当前正在运行的内核配置,所有的配置项(例如启用的驱动程序、内核功能等)都将以 CONFIG_* 形式列出。通过这些配置项,可以了解到该内核的编译参数。 内核版本可以通过以下命令查看当前系统的内核版本和其他相关信息: 1uname -r 或者详细一点: 1uname -a 这将输出内核版本、系统架构、主机名等信息。 磁盘分区信息查看磁盘和分区信息: 1lsblk 或者: 1fdisk -l 这将列出所有磁盘和分区的详细信息








