class
[TOC] 介绍drivers/base/class.c 是Linux内核设备模型中一个至关重要的部分,它实现了类(Class)的概念。与根据物理连接对设备进行分组的总线(Bus)不同,类的作用是根据设备的功能对它们进行逻辑上的分组,并为用户空间提供一个统一、简洁的视图,同时它还是自动化创建设备文件(/dev 节点)的核心机制。 历史与背景这项技术是为了解决什么特定问题而诞生的? 在统一设备模型出现之前,Linux系统管理面临几个难题: 设备发现困难:用户或管理员很难找到所有功能相同的设备。例如,要列出系统中所有的硬盘,需要去检查不同总线(IDE, SCSI, USB)下的设备,没有统一的入口。 静态的 /dev 目录:系统中的设备文件(如 /dev/hda, /dev/ttyS0)通常是通过一个静态的 MAKEDEV 脚本在安装时创建的。这意味着无论硬件是否存在,设备文件都在那里,这造成了 /dev 目录的臃肿和混乱。对于U盘这种即插即用设备,这种方式完全无法工作。 主/次设备号管理:驱动程序需要手动管理和分配主设备号(Major Number),容易产生冲突。 ...
clk-bulk
[toc] drivers/clk/clk-bulk.c 批量时钟控制(Bulk Clock Control) 简化多路时钟管理历史与背景这项技术是为了解决什么特定问题而诞生的?drivers/clk/clk-bulk.c 文件实现了一套批量时钟控制的辅助API。这项技术并非一个独立的框架,而是对通用时钟框架(Common Clock Framework, CCF)的一个重要补充和优化。它的诞生是为了解决设备驱动程序中管理多个时钟资源时的代码冗余、逻辑复杂和易于出错的问题。 许多现代SoC中的复杂外设(如显示控制器、GPU、视频处理器)往往不只依赖一个时钟,而是需要一组时钟(例如,一个像素时钟、一个总线接口时钟、一个寄存器访问时钟)同时被使能才能正常工作。在没有clk-bulk API之前,驱动程序必须: 逐个调用devm_clk_get()来获取每一个时钟的句柄。 编写一个循环来逐个调用clk_prepare_enable()来使能这些时钟。 最关键也是最麻烦的是,必须编写复杂的错误处理代码。如果在使能第五个时钟时失败了,驱动程序必须手动地、按相反的顺序去...
tty
[TOC] drivers/tty TTY子系统(TTY Subsystem) Linux终端和串口的核心框架历史与背景这项技术是为了解决什么特定问题而诞生的?TTY子系统是Linux/Unix系统中历史最悠久、最核心的子系统之一。它的诞生是为了解决一个根本性的问题:如何为用户进程与各种文本输入/输出设备(即“终端”)之间提供一个统一、抽象的交互接口。 它主要解决了以下几个核心问题: 硬件的抽象:早期的计算机通过物理的电传打字机(Teletypewriter, TTY)进行交互。后来出现了各种串行终端(Serial Terminal)。TTY子系统将这些五花八门的硬件抽象成一个标准的字符设备,使得用户进程可以用同样的方式(read, write)与它们交互。 输入处理与行编辑:用户在终端上输入时,难免会打错字。TTY子系统引入了“线路规程”(Line Discipline)的概念,提供了一套通用的输入处理逻辑,包括行缓冲、退格(Backspace)删除、擦除整行(Ctrl+U)等编辑功能。这使得应用程序(如Shell)无需自己实现这些复杂的编辑逻辑...
clk
[TOC] drivers/clk 时钟管理框架(Common Clock Framework) SoC时钟资源的统一抽象历史与背景这项技术是为了解决什么特定问题而诞生的?drivers/clk 目录中的代码实现了Linux内核的“通用时钟框架”(Common Clock Framework, CCF)。这项技术的诞生是为了解决在现代片上系统(SoC)中一个极其复杂且普遍存在的问题:时钟资源的管理混乱、缺乏统一抽象和代码不可移植。 一个现代SoC内部包含着一个庞大而复杂的时钟树,里面有成百上千个独立的时钟源,用于驱动不同的硬件模块(CPU核、GPU、内存控制器、UART、I2C、SPI、显示引擎等)。在CCF出现之前: ** vendor特定实现**:每个SoC厂商(如TI, NXP, Samsung, Rockchip)都在其BSP(板级支持包)中实现一套自己独有的、非标准的API来管理时钟。 驱动不可移植:一个为TI芯片编写的UART驱动,如果想移植到NXP的芯片上,其所有与时钟相关的代码(如何使能时钟、如何设置波特率所需的时钟频率)都必须完全重写。 电源管理困难...
serial
[toc] drivers/serial 串行驱动核心(Serial Driver Core) 内核与UART硬件通信的统一框架历史与背景这项技术是为了解决什么特定问题而诞生的?Serial(串行)驱动框架的诞生是为了解决一个在计算机历史上长期存在的核心问题:如何为各种不同的UART(通用异步收发器)硬件提供一个统一、标准、可移植的软件接口。 UART是实现串行通信(如RS-232标准)的基础硬件,但不同厂商、不同年代的UART芯片,其寄存器布局、功能特性(如FIFO深度)和编程方式都存在差异。如果没有一个统一的框架: 驱动代码无法复用:内核开发者需要为每一种新的UART芯片编写一个完全独立的、从头到尾的驱动程序。 上层接口不统一:每个驱动可能会向上层(TTY子系统)暴露不同的行为,或者需要上层进行特殊的处理。 设备驱动与硬件强耦合:应用程序或内核的其他部分会与特定的硬件实现绑定,降低了整个系统的可移植性。 Serial驱动框架的核心目标就是创建一个抽象层,将这些硬件差异隐藏起来。它定义了一套标准的接口和数据结构,使得具体的UART硬件驱动(如经典的8250...
tmc_study
grblconfig Inc\my_machine.h中取消注释进行配置开启如下配置进行学习 12345678910111213141516171819202122#define BOARD_BTT_SKR_20 // F407 based 3D Printer board#define TRINAMIC_ENABLE 5160 // Trinamic TMC5160 stepper driver support.#define N_AXIS 6#define TRINAMIC_DYNAMIC_CURRENT#define TRINAMIC_EXTENDED_SETTINGS#define TRINAMIC_POLL_STATUS// 这些选项需要自行配置,不配做使用默认值#define TMC_DRVCONF#define TMC_COOLCONF_SEMIN#define TMC_COOLCONF_SEMAX#define TMC_COOLCONF_SEDN#define TMC_COOLCONF_SEUP#define TMC_COOLCONF_SE...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub. Quick StartCreate a new post1$ hexo new "My New Post" More info: Writing Run server1$ hexo server More info: Server Generate static files1$ hexo generate More info: Generating Deploy to remote sites1$ hexo deploy More info: Deployment