开发者务必遵循 Linux 的代码规范,否则多人协作时代码不好维护。 Linux 内核代码风格 — The Linux Kernel documentation 缩进和空格 制表符 缩进的制表符为 8 个字符,并非我们常用的 4 个字符。大一点的缩进更容易分辨代码块。 不要使用空格来代替制表符。
选择原则: 不允许睡眠的上下文需要采用忙等待类,可以睡眠的上下文可以采用阻塞类。在异常上下文中访问的竞争资源一定采用忙等待类。 临界区操作较长的应用建议采用阻塞类,临界区很短的操作建议采用忙等待类。 中断屏蔽仅在有与中断上下文共享资源时使用。 共享资源仅是一个简单整型量时用原子变量。 原子变量
关于 Linux 的中断: 进入中断服务程序时,硬件会自动关闭当前 CPU 的可屏蔽中断 IRQ,但不会影响其他 CPU 的中断处理。FIQ 中断不受影响,但是 Linux 内核不使用 FIQ。虽然可以在 ISR 中手动调用 local_irq_enable() 重新开启本地中断,但内核出于防止重入
杂项设备 主设备号默认规定为10,用户无须关心主设备号 可以作为拓展设备驱动数量的一种手段 依然是一个字符设备驱动 是字符设备驱动的另一种更加简单的注册方式
printk 是内核提供的日志打印函数,和C语言的 printf 差不多,但是不支持浮点数据。 日志级别: printk的用法和printf类似,printf用于用户空间,printk用于内核空间。 用printk函数时,内核会根据打印的日志级别,决定是否把打印的信息输出到控制台上。 消息正常输出的
设备树节点 imx6ull 上作为屏幕背光 pinctrl_pwm1: pwm1grp { fsl,pins = < MX6UL_PAD_GPIO1_IO08__PWM1_OUT 0x110b0 >; }; &pwm1 { pinctrl-names = "defau
时钟中断 硬件有一个时钟装置,该装置每隔一定时间发出一个时钟中断(称为一次时钟嘀嗒(tick)),对应的中断处理程序就将全局变量jiffies_64加1 jiffies_64 是一个全局64位整型, jiffies全局变量为其低32位的全局变量,程序中一般用jiffies HZ:可配置的宏,表示1秒
I2C 和 SPI 很相似,放在一起讲。 I2C 和 SPI 都是 SOC 上的外设,厂商已经实现好了主机控制器驱动,所以无论换什么芯片,驱动的写法都是一样的。 总线架构 I2C 功能架构: S
GPIO 和 Pinctrl 子系统是为了更方便的初始化和使用引脚。 GPIO 子系统提供操作引脚的函数。 Pinctrl 子系统用于设置引脚复用和电气属性。 pinctrl 子系统 参考文档: pinctrl 子系统源码目录为 drivers/pinctrl 内核\Documentation\de
proc 是伪文件系统,不在磁盘中,只存在于内存中。 挂载在 /proc 目录下,内核运行时动态生成里面的内容,为用户空间程序提供了一个动态查看和修改内核运行时信息的窗口。 如何使用 proc 手动浏览:使用 ls和 cat是最直接的方式。 编程读取:应用程序可以像打开普通文件一样 open()、r
好的,我们来深入讲解 sysfs 文件系统。它与 proc文件系统密切相关,但在设计目的和使用方式上有显著区别。 简单来说,sysfs是一个基于内存的虚拟文件系统,它在用户空间和内核空间之间提供了一个结构化的、清晰的接口,主要用于导出内核设备模型的各个部分——即系统中的总线、设备、驱动以及它们的相互
设备和驱动匹配方式: 设备树匹配(现代使用) id 匹配(老,淘汰) name 匹配(远古,淘汰) ACPI 匹配(x86 使用) 匹配优先级:设备树匹配 > id 匹配 > name 匹配 Linux 设备驱动模型 驱动和设备写在一起的缺点: 设
设备树简介 早期 Linux 内核源码包含大量的与特定硬件平台相关的代码,代码重复度高且杂乱无章,内核维护工作量大。 后来引入设备树,这是一个描述硬件信息的数据结构,将硬件配置从 Linux 内核源码中提取出来,提高了移植性,更方便维护。 小故事:Linux 之父 Linus Torvalds 闲来
设备文件位于 /dev 下。 设备文件和普通文件的区别: 设备号 设备号共 32 位: 主设备号:占高12位,标识一个类型的设备,全局唯一。 次设备号:占低20位,标识一个类型下的不同设备,每个主设备号下的次设备号互不干扰,不会冲突。 // 拼接成设备号 dev_t devno = MKDEV(