You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下用C语言操作USB HID设备设置AMOLED屏幕亮度的方法

Linux下C语言操作USB HID调节AMOLED屏幕亮度的问题解答

需求背景

我使用一款AMOLED屏幕,厂商将亮度控制功能通过USB HID接口暴露,仅提供了Chrome浏览器使用navigator.hid API的网页示例。阅读示例JS代码后,明确需要完成以下操作:

  • 查找供应商ID(VID)为1810、产品ID(PID)为10的USB HID设备
  • 每次调节亮度时,发送报告ID为9且包含4字节格式化亮度值的报告

疑问解答

1. /dev/hidraw0与/dev/usb/hiddev0的区别及选择

  • /dev/hidrawX:属于HID原始设备节点,直接和HID设备的原始报告交互,不经过协议解析层,能直接读写自定义的报告字节流,适合需要精准控制报告格式的场景。
  • /dev/usb/hiddevX:由hiddev驱动提供,会将HID报告解析为结构化的控件数据,更适合标准HID设备的通用交互,但对于自定义报告的发送,灵活性不如hidraw。

选择建议:你需要发送指定报告ID和4字节亮度值的自定义报告,优先选/dev/hidraw0,它能直接处理原始报告数据,避免解析层的干扰。

2. USB HID设备操作方法及相关头文件

获取设备VID和PID

有两种常用方式:

  • 读取sysfs属性:对应/dev/hidraw0的sysfs路径通常为/sys/class/hidraw/hidraw0/device/,读取该路径下的idVendor和idProduct文件即可获取VID、PID。
  • 使用ioctl命令:打开hidraw设备后,通过HIDIOCGRAWINFO命令获取设备信息,需要配合<linux/hidraw.h>中定义的struct hidraw_devinfo结构体。

发送带报告ID的报告

打开/dev/hidraw0后,直接构造报告字节数组(第一个字节为报告ID,后续为亮度数据),调用write()函数写入设备即可。

相关头文件与ioctl标志

操作hidraw需要包含<linux/hidraw.h>头文件,常用ioctl命令如下:

  • HIDIOCGRAWINFO:获取HID设备的VID、PID等基础信息
  • HIDIOCGRDESCSIZE:获取报告描述符的大小
  • HIDIOCGRDESC:获取报告描述符内容

示例代码片段

#include <fcntl.h>
#include <unistd.h>
#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <errno.h>

int main() {
    int fd = open("/dev/hidraw0", O_RDWR);
    if (fd < 0) {
        perror("打开设备失败");
        return errno;
    }

    // 获取设备VID和PID
    struct hidraw_devinfo dev_info;
    if (ioctl(fd, HIDIOCGRAWINFO, &dev_info) < 0) {
        perror("获取设备信息失败");
        close(fd);
        return errno;
    }
    printf("VID: 0x%04x, PID: 0x%04x\n", dev_info.vendor, dev_info.product);

    // 构造亮度报告:报告ID=9,后续4字节为亮度值(字节序需与厂商示例一致)
    unsigned char brightness_report[5] = {9, 0x00, 0x00, 0x00, 0x80}; // 示例值,按需调整
    ssize_t write_len = write(fd, brightness_report, sizeof(brightness_report));
    if (write_len < 0) {
        perror("发送报告失败");
        close(fd);
        return errno;
    }
    printf("成功发送 %zd 字节数据\n", write_len);

    close(fd);
    return 0;
}

注意:字节序需与厂商网页示例中的格式一致,若JS中采用小端序,C代码中也要对应调整亮度值的字节排列。

内容的提问来源于stack exchange,提问作者jiandingzhe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:44:55