在Linux设备驱动开发中,有许多常用的API,这些API提供了与内核和其他驱动程序交互的功能。以下是一些常见的Linux设备驱动开发API:
1. 设备注册与注销
- register_chrdev_region(): 注册一个字符设备号范围。
- alloc_chrdev_region(): 动态分配一个字符设备号范围。
- register_chrdev(): 旧式的字符设备注册方法(已被cdev接口替代)。
- cdev_init(): 初始化cdev结构体。
- cdev_add(): 添加字符设备到系统。
- cdev_del(): 从系统中移除字符设备。
- unregister_chrdev_region(): 注销已注册的字符设备号范围。
2. 文件操作
- file_operations 结构体:包含如open(), release(), read(), write(), ioctl()等函数的指针,这些函数定义了对设备的操作。
3. 内存管理
- kmalloc(): 分配内核内存。
- kfree(): 释放内核内存。
- vmalloc(): 分配虚拟地址空间中的内存(可用于大块内存分配)。
- vfree(): 释放vmalloc()分配的内存。
4. 中断处理
- request_irq(): 请求一个中断。
- free_irq(): 释放一个中断。
- 中断处理函数:定义当特定中断发生时应该执行的代码。
5. I/O端口和内存操作
- ioremap(): 将I/O内存地址映射到内核虚拟地址空间。
- iounmap(): 取消I/O内存的映射。
- inb(), outb(), inl(), outl(): 读取和写入I/O端口。
6. DMA操作
- 依赖于硬件和总线类型,但通常涉及DMA通道的初始化、数据传输和完成处理。
7. 锁和同步
- spin_lock(), spin_unlock(): 自旋锁,用于保护共享资源。
- mutex_lock(), mutex_unlock(): 互斥锁,允许线程睡眠。
- semaphore_init(), down(), up(): 信号量,用于同步和计数。
- completion 结构体:用于线程间的通知和同步。
8. 消息队列、管道和信号
- 这些通常用于内核和用户空间之间的通信,但在某些情况下,驱动程序之间或驱动程序和内核其他部分之间也可能使用它们。
9. 设备树(Device Tree)和ACPI
- 用于描述硬件的层次结构和属性,驱动程序可以从中读取配置信息。
10. 电源管理和热插拔
- pm_runtime_get(), pm_runtime_put(): 运行时电源管理。
- 通知函数:如device_add(), device_remove()等,用于处理设备的热插拔事件。
11. 调试和日志
- printk(): 用于在内核日志中打印消息。
- dev_dbg(), dev_err(), dev_info(), dev_warn(): 特定于设备的日志函数。
12. 其他
- class_create(), device_create(), class_destroy(), device_destroy(): 用于创建和销毁设备类和设备。
- sysfs_create_group(), sysfs_remove_group(): 在sysfs文件系统中创建和删除属性组。
- 特定于总线的API,如PCI、USB、SPI等。