温馨提示×

Linux C++如何配置驱动

小樊
35
2026-08-16 01:13:45
栏目: 编程语言

在 Linux 下用 C++ 配置/使用驱动,通常分为 三种场景。不同场景做法差别很大,下面我按「最常见 → 较高级」给你一个清晰、可落地的说明。


一、最常见:用户态 C++ 程序配置/使用已有驱动(推荐)

90% 情况你只需要这样做

1️⃣ 理解基本模型

Linux 驱动通常:

  • /dev/ 下生成设备文件
  • 或通过 /sys/ 提供配置接口
  • 用户态程序通过 文件 IO 与驱动交互
C++ 程序
   ↓
open / read / write / ioctl
   ↓
/dev/xxx 或 /sys/xxx
   ↓
内核驱动

2️⃣ 使用 /dev 设备(字符设备驱动)

驱动示例(假设已存在)

ls /dev/mydev

C++ 使用示例

#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;
}

这是最标准的“配置驱动”方式


3️⃣ 使用 ioctl(驱动配置最常见)

驱动定义(内核侧)

#define MY_IOCTL_SET _IOW('m', 1, int)
#define MY_IOCTL_GET _IOR('m', 2, int)

C++ 用户态

#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


4️⃣ 使用 /sys 接口(非常常见)

很多驱动提供:

/sys/class/mydev/mode
/sys/class/mydev/enable

C++ 操作

#include <fstream>

std::ofstream("/sys/class/mydev/enable") << "1";

简单、安全、推荐


二、进阶:自己写 Linux 驱动(内核模块)

⚠️ 只有当你 没有现成驱动做底层开发 才需要

1️⃣ 最小字符设备驱动示例

驱动代码(mydev.c)

#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");

2️⃣ 编译驱动(Makefile)

obj-m += mydev.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
make
sudo insmod mydev.ko

3️⃣ 创建设备节点

sudo mknod /dev/mydev c 240 0

然后用 第一部分 C++ 程序 使用它 ✅


三、特殊场景:SPI / I2C / GPIO 驱动配置

1️⃣ GPIO(用户态)

#include <gpiod.h>

2️⃣ I2C

open("/dev/i2c-1", O_RDWR);
ioctl(fd, I2C_SLAVE, 0x50);

3️⃣ SPI

open("/dev/spidev0.0", O_RDWR);
ioctl(fd, SPI_IOC_MESSAGE(1), &tr);

四、推荐学习路径(很重要)

不要一上来就写驱动

建议顺序:

  1. 学会用 /dev/sys
  2. 学会 ioctl
  3. 再学内核模块
  4. 最后碰硬件寄存器

五、我可以继续帮你

你可以直接告诉我:

  • ✅ 是 什么设备(网卡 / GPIO / I2C / USB / 自定义硬件)
  • ✅ 是 配置驱动 还是 写驱动
  • ✅ 用的是 哪个 Linux(Ubuntu / 嵌入式 / Yocto)
  • ✅ 是否已有 /dev/sys 节点

我可以给你 针对你硬件的完整 C++ 示例代码

0