在 Linux 下做驱动选型(选择或设计合适的驱动模型/框架),通常要从硬件类型、系统架构、kernel 版本、性能需求、维护成本几个维度来考虑。下面给你一个比较实用的选型思路和常见场景对照。
一、先明确:你要“选”的是什么?
Linux 驱动选型通常不是“写不写驱动”,而是选:
- 是否使用现有子系统框架
- 字符设备 / 块设备 / 网络设备
- Input / I2C / SPI / USB / PCI / GPU / ALSA / V4L2 等
- 是否走标准总线框架
- Platform / Device Tree
- IIO / Regmap / GPIO / Pinctrl
- 用户态交互方式
- 字符设备节点
- sysfs / procfs
- netlink / ioctl
- UIO / VFIO(用户态驱动)
二、按硬件类型快速选型
1️⃣ 简单 GPIO / 寄存器控制类
典型:LED、按键、继电器、简单传感器
✅ 推荐:
platform_driver + device tree
- 用
gpio, sysfs, leds 子系统
❌ 不推荐:
2️⃣ 传感器(温度、加速度、ADC)
典型:I2C / SPI 传感器
✅ 推荐:
- I2C / SPI 框架
- IIO 子系统(工业 IO)
- 使用
regmap
3️⃣ 输入设备(按键、触摸屏、鼠标)
✅ 推荐:
4️⃣ 音视频设备
- 音频 → ALSA (ASoC)
- 摄像头 → V4L2
5️⃣ 网络设备
- 有线 / 无线 →
net_device
- 不要用字符设备模拟网络
6️⃣ 高速 DMA / 大数据吞吐
典型:FPGA、采集卡、AI 加速
✅ 推荐:
PCIe / DMA
UIO(简单)
VFIO(安全、隔离)
- 或标准子系统(如果适用)
7️⃣ USB 设备
- 已有类设备 → 用标准 USB 类驱动
- 自定义协议 →
usb_driver
三、关键选型因素
✅ 1. 是否有标准 Linux 子系统
优先用内核已有框架
✅ 2. Kernel 版本 & Device Tree
- 新项目 → 必须 DT
- 老 kernel(< 3.10)→ 谨慎选型
✅ 3. 实时性要求
- 硬实时 → PREEMPT_RT + 内核驱动
- 软实时 → 用户态 + UIO
✅ 4. 维护与升级
- 自研字符设备 → 维护成本高
- 标准子系统 → 长期更优
四、常见错误选型 ❌
- 所有设备都写
miscdevice
- 用 ioctl 代替标准接口
- 用户态
mmap 寄存器
- 不用 Device Tree
- 重复造轮子(已有 IIO/Input 不用)
五、选型决策表(简化)
| 场景 |
推荐方案 |
| GPIO 控制 |
platform + gpio |
| I2C 传感器 |
IIO |
| 触摸屏 |
input |
| 音频 |
ASoC |
| 摄像头 |
V4L2 |
| 高速 DMA |
PCIe + UIO/VFIO |
| 自定义协议 |
标准总线 + 私有协议 |
如果你愿意,可以告诉我:
- 硬件类型(I2C? PCIe? FPGA?)
- Linux 内核版本
- 实时性 / 性能要求
我可以直接给你具体驱动框架和代码结构建议。