# 驱动设备 **Repository Path**: Mu-lnz/m_driver ## Basic Information - **Project Name**: 驱动设备 - **Description**: 一个硬件驱动库,供学习使用 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-15 - **Last Updated**: 2026-07-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # m_driver 驱动设备 [![平台](https://img.shields.io/badge/platform-IMX6ULL-blue)](https://gitee.com/Mu-lnz/m_driver) [![内核](https://img.shields.io/badge/kernel-Linux-brightgreen)](https://www.kernel.org/) [m_driver](https://gitee.com/Mu-lnz/m_driver) 是一个专注于嵌入式 Linux 设备驱动学习和实践的开源项目,持续更新中。项目覆盖了多种常见硬件(GPIO、I²C、SPI、IIO 等)的驱动编写方法,配合对应的测试应用,适合在 ARM 开发板(如 IMX6ULL)上实验。 ## 项目简介 本项目提供完整的字符设备驱动源码、测试程序以及必要的 Makefile,帮助开发者从零开始学习 Linux 驱动开发的核心技术。内容涵盖: - 基础的文件 I/O 操作 - 网络编程(套接字) - GPIO 控制与中断处理 - 设备树(DTS)驱动的配置方式 - I²C 总线设备驱动(AT24C02 EEPROM) - SPI 总线设备驱动(DAC、ADXL345 加速度计) - IIO 子系统驱动(DHT11 传感器) 所有示例均带有对应的用户态测试代码,便于直接编译、加载和验证。 ## 软件架构 ``` code_std/ ├── 01_io_file/ # CSV 文件读写 — 基础文件 I/O 练习 │ ├── include/ # 头文件 │ └── src/ # 源代码 ├── 02_net_socket/ # 网络套接字编程 ├── 03_gpio/ # GPIO 驱动(字符设备形式) │ ├── 1_std/ # LED 驱动 │ ├── 2_sr501/ # 人体红外传感器(SR501)驱动 │ ├── 3_sr04/ # 超声波测距模块(HC‑SR04)驱动 │ ├── 4_motor/ # 步进电机(28BYJ‑48)驱动 │ ├── 5_dht11/ # 温湿度传感器(DHT11)驱动 │ ├── 6_ds18b20/ # 数字温度传感器(DS18B20)驱动 │ └── 7_irda/ # 红外遥控接收驱动 ├── 04_gpio_dts/ # 基于设备树的驱动 │ ├── 1_motor/ # 设备树电机驱动 │ ├── 2_irda/ # 设备树红外驱动 │ └── 3_dht11/ # 设备树温湿度驱动 ├── 05_i2c/ # I²C 总线驱动 │ └── at24c02/ # AT24C02 EEPROM 驱动 ├── 06_spi/ # SPI 总线驱动 │ ├── adxl345/ # ADXL345 加速度计驱动 │ └── dac/ # SPI DAC 驱动 ├── 07_iio/ # IIO 子系统驱动 │ ├── dht11_iio_src/ # DHT11 IIO 原始驱动 │ ├── dht11_iio_buffer/ # DHT11 IIO 缓冲区驱动 │ ├── dht11_iio_trigger/ # DHT11 IIO 触发驱动 │ └── dht11_iio_event/ # DHT11 IIO 事件驱动 └── tool/ # 辅助工具程序 ``` ## 功能特性 - **字符设备驱动**:实现标准的 `file_operations`,提供 `open/read/write/ioctl` 接口 - **中断处理**:GPIO 中断服务例程(ISR),支持外部触发 - **同步机制**:支持 `poll`、`select`、`fasync` 等多路复用方案 - **环形缓冲区**:实现生产者–消费者模型的安全队列 - **设备树(Device Tree)**:基于 DTS 的属性解析和平台总线驱动框架 - **I²C 总线驱动**:适配常见的 I²C 从设备(如 AT24C02) - **SPI 总线驱动**:实现 SPI 主从模式的数据收发 - **IIO 子系统**:支持工业 I/O 框架,提供缓冲区、触发器和事件支持 ## 硬件支持 | 模块 | 说明 | |------|------| | LED | 普通 LED 灯控制 | | SR501 | 人体红外感应模块 | | HC‑SR04 | 超声波测距模块 | | 28BYJ‑48 | 步进电机 | | DHT11 | 温湿度传感器 | | DS18B20 | 数字温度传感器 | | 红外接收头 | 红外遥控信号解码 | | AT24C02 | I²C EEPROM(2Kbit) | | ADXL345 | SPI 三轴加速度计 | | MCP4725 / DAC | SPI 数模转换器 | ## 编译说明 > 所有驱动均为可加载内核模块(`.ko`),请在交叉编译环境或开发板上进行编译。 ### 编译驱动模块 ```bash cd code_std/03_gpio/1_std make ``` 产物为 `gpio_led.ko`。 ### 编译测试程序 同一个目录下提供了配套的用户态测试代码,使用 `-f Makefile.build` 进行统一构建: ```bash make -f Makefile.build ``` 生成可执行文件(如 `led_test`)。 ### 加载驱动 ```bash insmod xxx.ko ``` > 加载前请确保系统已匹配对应的内核版本,且具备相应的设备树节点(如使用设备树驱动)。 ### 查看设备节点 驱动加载成功后会在 `/dev/` 下自动创建对应节点(取决于代码中 `class` 与 `device` 的创建逻辑)。可通过下列命令检查: ```bash ls -l /dev/xxx ``` 如果没有自动创建,可手动使用 `mknod` 或编写 udev 规则。 ## 使用说明 1. 根据目标硬件选择相应目录并完成编译(驱动 + 测试程序)。 2. 将生成的 `.ko` 文件拷贝到开发板,执行 `insmod xxx.ko` 加载驱动。 3. 运行对应的测试程序 `./xxx`(如 `./led_test`)。 4. 通过 `/dev/xxx` 设备节点与内核驱动进行交互,完成功能验证。 ## 学习路线 > 建议按顺序逐步深入,每阶段均配合对应的实验代码。 1. **01_io_file** —— 掌握基础文件操作(`open/read/write/close/ioctl`) 2. **02_net_socket** —— 网络编程入门(TCP/UDP 套接字) 3. **03_gpio** —— 字符设备驱动的完整实现(GPIO 控制、按键中断、轮询、异步通知) 4. **04_gpio_dts** —— 设备树驱动的注册与属性解析 5. **05_i2c** —— I²C 总线驱动的适配与读写流程 6. **06_spi** —— SPI 总线驱动(包括 DMA 方式的可选实现) 7. **07_iio** —— IIO 子系统框架(缓冲区、触发器、事件) 每个子目录均提供独立的 Makefile,便于单独编译和调试。 ## 注意事项 - 本项目主要用于 **学习交流**,在实际产品中使用请务必进行充分的可靠性测试 - 加载内核模块前请确认开发板内核源码与驱动版本的兼容性(如内核 API 是否有变化) - 涉及外设接线时,请先查阅原理图并正确配置引脚复用,避免硬件损坏 - 若使用设备树驱动,需要在对应的 `.dts` 文件中添加节点并重新编译设备树镜像 - 详细资料可点击[跳转](https://gitee.com/Mu-lnz/linux_embed_book) ## 参与贡献 欢迎提交 Issue 与 Pull Request 共建本项目! 1. **Fork** 本仓库 2. 创建新分支:`feat_xxx` / `fix_xxx` 3. 完成代码编写并提交 4. 在 Gitee 上发起 Pull Request 请确保提交信息清晰说明改动内容与动机,便于审核合并。 ## 许可证 本项目使用 [MIT](LICENSE) 许可证开源。