【DAY39】Linux 驱动开发关键技术研究:设备树、Input 子系统与 I2C 通信

内核中,互斥锁的使用

驱动初始化流程

  • 申请自定义beep结构体空间
    *
  • 构建新的CDEV设备
  • 注册新申请的设备编号
  • 设置新的cdev操作方法
  • 将cdev加入链表中
    *
  • 初始化锁资源
    *
  • 映射物理地址空间
  • 操作寄存器
  • 创建sys文件系统中的设备类文件
  • 创建新的设备文件
    *
  • 构建调试节点

我们可以简化2、4部分流程,使用系统的混杂设备

思想

1.设备和驱动分离

驱动:保留相同操作;不同硬件设备信息单独分离出来

1.设备树

|------|--------------|
| dts | 设备树源文件 |
| dtsi | 设备树头文件 |
| dtb | 编译好的二进制设备树文件 |
| DTC | 编译工具 |

节点名 {

属性1 = ;

属性2 = ;

}

2.驱动分层

1.pinctrl方案定义

pinctrl_puteled : puteled {

fsl,pins = <宏名 电气属性寄存器的值>;

};

2.pinctrl方案使用

设备树节点{

pinctrl-name = " 名称(一般为default)"

pinctrl-0 = <&pinctrl方案定义名>;

};

3.gpio子系统

设备树节点 {

gpio-名称 = <&gpio1 5 0>;(最后一位:外设使能的逻辑电平)

};

阻塞

中断

中断中执行速度快,不允许睡眠、延时

中断中不能加互斥锁(阻塞等待),互斥锁加锁和解锁之间,可以切换调度任务

中断中可以加自旋锁(忙等待),自旋锁 中间不会切换调度任务

中断子系统

GPIO按键驱动改造为标准的input设备

对比了传统混杂设备(misc)与input子系统的差异,并详细演示了如何将一个GPIO按键驱动改造为标准的input设备。

1. 输入设备框架概述

  • 输入设备(如按键、鼠标、触摸屏)应使用Linux input子系统,而非misc混杂设备,以获得更规范的事件上报机制和统一的用户空间接口。
  • input设备支持多种连接方式(GPIO、USB、I2C等),并通过事件类型(type)、编码(code)和值(value)三元组上报事件。

2. input设备驱动实现步骤

  • 申请设备 :使用input_allocate_device()分配input_device结构体。
  • 配置能力 :通过set_bit()设置支持的事件类型(如EV_KEY)和按键编码(如KEY_0)。
  • 注册设备 :调用input_register_device()将设备注册到系统。
  • 中断处理 :在中断服务程序中调用input_event()上报按键按下/抬起事件,并以input_sync()结束事件包。

3. 应用层交互与设备节点

  • input设备自动在/dev/input/eventX下创建节点,无需手动mknod。
  • 应用层通过读取/dev/input/eventX获取input_event结构体数据,解析type、code、value即可识别按键事件。

4. 补充说明

  • 按键抖动需在驱动或应用层通过定时器消抖处理。

总线

功能

将设备与驱动进行匹配

匹配规则

  1. 设备树节点device中的overdrive与驱动名一致
  2. 设备树节点中compatible选项与驱动of_match_table一致
  3. x86架构中设备树与驱动匹配(x)
  4. device设备树中的设备名与驱动中id_tables一致
  5. 设备名称与驱动名称一致

注册设备

  • misc_register
  • input_register
  • fd_register
  • v412_register
  • iio_register

虚拟平台总线

像蜂鸣器之类的设备没有总线连接,可以使用虚拟平台总线
Probe函数在驱动加载时被调用,主要完成以下几项关键工作:

  • 设备匹配校验 :通过 of_match_device 再次确认设备树节点与驱动的匹配关系,若不匹配则直接退出,确保安全性09:13。
  • 获取设备数据 :从匹配到的设备树节点中提取配置信息(如 match_data),并转换为驱动内部使用的结构体09:41。
  • 内存资源映射 :从设备树中获取寄存器基地址和大小,调用 devm_ioremap 进行物理地址到虚拟地址的映射11:34。
  • 申请并初始化私有数据:为引脚控制所需的结构体分配内存空间,并初始化寄存器默认值(如将配置寄存器设为 -1)10:10。
  • 注册操作接口 :设置 pinctrl_ops 操作结构体,注册到内核的 pinctrl 子系统中,完成设备注册

I2C子系统

通信协议

主机接收数据:start信号-> 从机地址+w -> ACK -> 寄存器地址

相关推荐
LCG元11 小时前
STM32实战:基于STM32F103的智能手环(计步+心率+OLED)
stm32·单片机·嵌入式硬件
ACP广源盛1392462567311 小时前
磐石 100 :IX6012 :ASM1812@ACP#国产 PCIe 2.0 交换芯片,轻量级算力扩展应用分享
大数据·linux·运维·网络·人工智能·嵌入式硬件·电脑
振浩微433射频芯片13 小时前
智能门锁常用的国产NFC芯片方案解析:从VRC522到433MHz的选型思考
单片机·嵌入式硬件
踏着七彩祥云的小丑15 小时前
嵌入式测试学习第3天:电容、电感、二极管、三极管、MOS管
单片机·嵌入式硬件
雅斯驰1 天前
AES-128加密+滚动码认证:ATA5702W如何防御中继攻击与信号重放
运维·单片机·嵌入式硬件·物联网·自动化
iCxhust1 天前
微机原理课程设计大综合---计数器
汇编·单片机·嵌入式硬件·课程设计·微机原理
搁浅小泽1 天前
PCBA焊点的检测方法
单片机·嵌入式硬件·可靠性工程师
Deitymoon1 天前
STM32——PWM控制舵机
stm32·单片机·嵌入式硬件
菜鸟的日志1 天前
【嵌入系统】嵌入式学习笔记(一)
windows·笔记·嵌入式硬件·学习·ubuntu·操作系统
电子科技圈1 天前
四大“门派”围攻边缘及端侧AI SoC市场“光明顶”
人工智能·嵌入式硬件·mcu·物联网·网络安全·音视频·语音识别