驱动开发
常用函数
kmalloc 和 dev_kzalloc 分配内存
kmalloc : 需要手动清理, 收到释放 ; 但是 dev_kzalloc可以自动管理内存
devm系列的函数可以自动释放资源
kzalloc : 分配需要初始化为零的内存块
module_platform_driver 和 platform_driver_register区别
module_platform_driver 和 platform_driver_register 是 Linux 内核中用于注册平台驱动的两种不同方式。这两种方式都用于注册一个平台设备驱动程序,但在使用上有一些细微的区别。
module_platform_driver : 不需要显示地调用注册函数(module_init module_exit)
platform_driver_register : 需要显示地调用注册函数
设计器初始化
允许在初始化结构体时显式指定某个字段的值。
.field_name = value, |
.field_name: 结构体的字段名。
value: 要赋给该字段的值。
dma
一般框架
一个典型的 DMA 驱动包含以下模块:
模块初始化与卸载
注册字符设备、创建设备节点。
初始化 DMA 控制器硬件。设备探测与资源分配
获取设备树(Device Tree)中的硬件信息(如寄存器地址、中断号)。
映射寄存器内存空间(ioremap)。DMA 缓冲区管理
分配 DMA 可用的物理连续内存(dma_alloc_coherent)。文件操作接口
实现 open、release、ioctl、read、write 等文件操作函数。DMA 传输控制
配置 DMA 传输源地址、目标地址、传输长度。
启动/停止 DMA 传输。中断处理
注册中断处理函数,处理 DMA 传输完成或错误中断。同步与并发控制
使用自旋锁(spinlock)或互斥锁(mutex)保护共享数据。
驱动匹配流程
- 内核启动时解析设备树,遍历所有节点。
- 当发现节点包含 compatible = “xlnx,dmaraw_chrdev” 时,搜索匹配的驱动。
- 若驱动注册了相同的 compatible 值,则调用其 probe 函数。
SysMonPSU
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 雷子集中营!