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
相关产品推荐
相关产品推荐

