在 Linux 下用 C++ 配置/使用驱动,通常分为 三种场景。不同场景做法差别很大,下面我按「最常见 → 较高级」给你一个清晰、可落地的说明。
✅ 90% 情况你只需要这样做
Linux 驱动通常:
/dev/ 下生成设备文件/sys/ 提供配置接口C++ 程序
↓
open / read / write / ioctl
↓
/dev/xxx 或 /sys/xxx
↓
内核驱动
/dev 设备(字符设备驱动)ls /dev/mydev
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
int main() {
int fd = open("/dev/mydev", O_RDWR);
if (fd < 0) {
perror("open");
return 1;
}
write(fd, "config data", 11);
char buf[128] = {0};
read(fd, buf, sizeof(buf));
close(fd);
return 0;
}
✅ 这是最标准的“配置驱动”方式
ioctl(驱动配置最常见)#define MY_IOCTL_SET _IOW('m', 1, int)
#define MY_IOCTL_GET _IOR('m', 2, int)
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#define MY_IOCTL_SET _IOW('m', 1, int)
int main() {
int fd = open("/dev/mydev", O_RDWR);
int value = 100;
ioctl(fd, MY_IOCTL_SET, &value);
close(fd);
}
✅ 配置寄存器、参数、模式,几乎都用 ioctl
/sys 接口(非常常见)很多驱动提供:
/sys/class/mydev/mode
/sys/class/mydev/enable
#include <fstream>
std::ofstream("/sys/class/mydev/enable") << "1";
✅ 简单、安全、推荐
⚠️ 只有当你 没有现成驱动 或 做底层开发 才需要
#include <linux/module.h>
#include <linux/fs.h>
static int my_open(struct inode *inode, struct file *file) {
return 0;
}
static struct file_operations fops = {
.open = my_open,
};
static int __init my_init(void) {
register_chrdev(240, "mydev", &fops);
return 0;
}
static void __exit my_exit(void) {
unregister_chrdev(240, "mydev");
}
module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("GPL");
obj-m += mydev.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
make
sudo insmod mydev.ko
sudo mknod /dev/mydev c 240 0
然后用 第一部分 C++ 程序 使用它 ✅
#include <gpiod.h>
open("/dev/i2c-1", O_RDWR);
ioctl(fd, I2C_SLAVE, 0x50);
open("/dev/spidev0.0", O_RDWR);
ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
✅ 不要一上来就写驱动
建议顺序:
/dev 和 /sysioctl你可以直接告诉我:
/dev 或 /sys 节点我可以给你 针对你硬件的完整 C++ 示例代码。