分享
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
获课:keyouit.xyz/4869/
基于 i.MX6ULL 开发板和《韦东山嵌入式 Linux 驱动大全》教程的核心知识点梳理,按模块分类整理,便于系统学习和复习:
1. 嵌入式 Linux 驱动开发基础
驱动模型:
Linux 设备驱动的三层架构:设备驱动层、设备模型核心层、用户空间接口层。
总线-设备-驱动(BDD)模型:总线(如 Platform、I2C、SPI)管理设备与驱动的匹配。
Kobject 和 Kset:内核对象机制,用于设备模型的底层实现。
字符设备驱动:
注册与注销:alloc_chrdev_region()、cdev_init()、cdev_add()。
文件操作结构体 struct file_operations:open()、read()、write()、ioctl() 等。
设备号管理:主设备号(标识驱动)、次设备号(标识设备实例)。
阻塞与非阻塞 I/O:
阻塞:使用 wait_queue_head_t 和 wait_event_interruptible()。
非阻塞:检查 FMODE_NONBLOCK 标志,返回 -EAGAIN。
2. i.MX6ULL 硬件平台特性
SoC 架构:
ARM Cortex-A7 内核,支持 Linux 操作系统。
关键外设:UART、GPIO、I2C、SPI、PWM、LCD 控制器、SD/MMC、Ethernet 等。
启动流程:
BootROM → U-Boot → Linux Kernel → RootFS。
关键文件:u-boot.bin、zImage、dtb(设备树文件)、rootfs。
设备树(Device Tree):
DTS/DTB 文件:描述硬件配置(CPU、内存、外设地址等),替代传统硬编码。
节点定义:compatible 属性匹配驱动,reg 定义寄存器地址,interrupts 定义中断号。
驱动与设备树绑定:通过 of_match_table 和 compatible 字符串匹配。
3. 关键外设驱动开发
3.1 GPIO 驱动
操作接口:
导出 GPIO:gpio_request()、gpio_free()。
设置方向:gpio_direction_input()、gpio_direction_output()。
读写操作:gpio_get_value()、gpio_set_value()。
示例:按键输入、LED 控制。
3.2 中断处理
注册中断:
request_irq():绑定中断号、处理函数、触发方式(上升沿/下降沿等)。
共享中断:设置 IRQF_SHARED 标志。
中断下半部:
软中断(Softirq):如 TASKLET 和 Workqueue。
线程化中断:request_threaded_irq()。
3.3 I2C/SPI 驱动
I2C 驱动:
主控制器驱动:由 SoC 实现(如 i.MX6ULL 的 I2C 模块)。
从设备驱动:
实现 struct i2c_driver,注册 i2c_add_driver()。
使用 i2c_transfer() 或 i2c_smbus_*() 通信。
SPI 驱动:
类似 I2C,使用 struct spi_driver 和 spi_setup() 配置时钟极性/相位。
3.4 PWM 驱动
配置流程:
设置周期(period_ns)和占空比(duty_ns)。
启用 PWM 通道:pwm_enable()。
应用:LED 呼吸灯、电机调速。
3.5 LCD 驱动
帧缓冲(FrameBuffer):
注册 struct fb_info,分配显存缓冲区。
实现 fb_ops 中的 fb_fillrect()、fb_copyarea() 等函数。
设备树配置:
定义 display-timings 节点,设置分辨率、时序参数。
4. 高级驱动技术
并发控制:
自旋锁(Spinlock):用于原子操作,不可睡眠。
互斥锁(Mutex):用于可睡眠上下文。
信号量(Semaphore):限制资源访问数量。
内存管理:
DMA 缓冲区:dma_alloc_coherent() 分配连续物理内存。
一致性映射:确保 CPU 和 DMA 访问的缓存一致性。
内核调试:
printk:分级日志(KERN_DEBUG、KERN_ERR)。
动态调试:config DYNAMIC_DEBUG 启用 pr_debug() 输出。
JTAG/OpenOCD:硬件级调试。
5. 实战项目整合
综合案例:
按键控制 LED:通过 GPIO + 中断实现。
温湿度传感器(如 DHT11):通过 GPIO 定时采样 + 协议解析。
OLED 显示:I2C 接口驱动 + 帧缓冲更新。
网络通信:基于 LWIP 或 Linux 网络栈的 Socket 编程。
性能优化:
减少内核-用户空间拷贝(如 splice()、sendfile())。
使用 mmap() 共享内存加速 I/O。
6. 学习建议
理论结合实践:先理解驱动模型,再通过代码验证(如修改设备树、调试中断)。
调试工具:
dmesg:查看内核日志。
devmem2:直接读写物理地址(用于验证寄存器配置)。
strace:跟踪用户空间系统调用。
扩展阅读:
《Linux Device Drivers》(LDD3)。
i.MX6ULL 官方参考手册(IMX6ULLRM.pdf)。
通过以上知识点的系统梳理,可以快速掌握 i.MX6ULL 平台下 Linux 驱动开发的核心技术,并应用于实际项目开发。
有疑问加站长微信联系(非本文作者))
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信304 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传