修改手机PID和VID的方法

本文介绍如何在设备上修改PIDVID,包括定位init.usb.rc文件、相关启动文件.rc.mk的编辑及验证方法。通过设备管理器中的ADB属性可以检查修改后的PIDVID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要修改 PID VID 这里做个总结

1.找到init.usb.rc ,也可以是init.mtxxx.usb.rc


2.找到相关的启动 文件 .rc .mk 


3.然后 remake 

验证方法 :

电脑--设备管理器--ADB 属性 -详细信息--硬件ID 号 就可以 查看PID VID



查看手机处于哪种模式 adb shell getprop "sys.usb.config"  



<think>好的,我现在需要处理用户的问题,即使用libusb遍历USB设备并统计指定PIDVID的数量。首先,我要理解用户的需求。用户可能有一个特定的USB设备,他们想通过厂商ID(VID产品ID(PID)来识别并统计连接的设备数量。这可能用于检测设备是否连接,或者在多个相同设备时知道有多少个可用。 接下来,我需要回顾之前的对话历史。用户之前询问了如何枚举USB设备并获取驱动名称ID,现在他们进一步想要过滤特定VIDPID的设备并统计数量。之前的回答已经涉及到了如何获取设备列表、提取描述符以及生成唯一ID,所以现在需要在此基础上进行调整,专注于过滤计数。 我需要确保新的回答符合用户提供的结构体TanhoCamDriver函数TanhoCam_EnumDrivers,但用户现在的问题似乎更简单,只需要统计数量,可能不需要填充结构体。不过用户可能还是希望有一个函数来执行这个任务,返回数量。或者,用户可能希望修改之前的函数,添加过滤条件。 然后,我需要考虑如何实现过滤。在libusb中,每个设备都有设备描述符,包含idVendoridProduct。遍历设备列表时,可以检查这两个值是否与目标VIDPID匹配,如果匹配则增加计数器。 另外,用户可能需要一个独立的函数,参数是目标VIDPID,返回匹配的设备数量。这样函数可以更灵活,方便用户调用。 我还需要注意权限问题,因为访问USB设备可能需要特定的权限,特别是在Linux系统下。需要提醒用户如果遇到权限错误,应如何处理,比如使用sudo或者设置udev规则。 另外,代码示例需要正确使用libusb的函数,比如初始化上下文、获取设备列表、遍历设备、获取描述符、检查VID/PID,然后释放资源。同时,错误处理也很重要,比如初始化失败或获取设备列表失败时的处理。 可能还需要考虑设备的热插拔情况,但用户当前的问题可能不需要实时监控,只是统计当前连接的设备数量。不过,如果有需要的话,可以简要提到libusb_hotplug的用法,但可能超出当前问题的范围。 需要确保代码示例简洁,并且有详细的注释,解释每一步的作用。同时,用户可能需要知道如何编译运行代码,包括链接libusb库,处理编译命令,以及可能的权限调整。 最后,测试示例代码是否正确,比如给定一个已知的VIDPID,是否能正确统计数量。例如,使用手机VIDPID进行测试,或者使用常见的USB设备进行验证。 总结步骤: 1. 初始化libusb上下文。 2. 获取设备列表。 3. 遍历每个设备,获取设备描述符。 4. 检查设备的VIDPID是否与目标匹配。 5. 统计匹配的设备数量。 6. 释放设备列表上下文。 7. 返回统计的数量。 同时,需要处理可能的错误,如初始化失败,设备列表获取失败,或者在获取描述符时的错误。对于无法打开的设备,是否需要处理?例如,有些设备可能需要权限才能访问,这时候可能无法获取描述符,但根据之前的做法,可以继续跳过这些设备,或者至少检查描述符中的VIDPID,因为获取描述符不需要打开设备。 哦,对了,libusb_get_device_descriptor函数不需要打开设备句柄,所以即使没有权限打开设备,仍然可以获取到VIDPID,这很重要,因为这样可以避免因权限问题而无法统计数量。所以这一步不需要打开设备,直接获取描述符即可,这样更可靠。 因此,代码可以优化为不需要打开设备,从而避免权限问题。这样统计会更准确,因为即使用户没有权限访问设备,仍然可以读取其VIDPID,从而正确计数。这可能是一个关键点,需要确保代码中没有不必要的打开设备的步骤。 综上,正确的步骤应该是遍历每个设备,获取设备描述符,比较VIDPID,然后统计数量,不需要打开设备。这样代码更高效,且避免权限问题。之前的示例中可能需要打开设备来获取厂商名称等,但在这个特定需求中不需要,因此可以简化代码。</think>--- ### **功能说明** 要统计连接到计算机的USB设备中符合指定厂商ID(VID产品ID(PID)的设备数量,可通过libusb遍历USB设备列表并过滤匹配项。以下是具体实现方法: --- ### **实现步骤** #### **1. 初始化libusb上下文** 首先初始化libusb库,创建上下文环境: ```c #include <libusb-1.0/libusb.h> int count = 0; libusb_context *ctx = NULL; int ret = libusb_init(&ctx); if (ret < 0) { fprintf(stderr, "初始化失败: %s\n", libusb_error_name(ret)); return -1; } ``` #### **2. 获取USB设备列表** 调用 `libusb_get_device_list` 获取当前连接的USB设备列表: ```c libusb_device **dev_list; ssize_t device_count = libusb_get_device_list(ctx, &dev_list); if (device_count < 0) { fprintf(stderr, "获取设备列表失败\n"); libusb_exit(ctx); return -1; } ``` #### **3. 遍历设备并统计匹配项** 遍历设备列表,检查每个设备的VIDPID是否符合目标值: ```c unsigned int target_vid = 0x1234; // 替换为目标VID(十六进制) unsigned int target_pid = 0x5678; // 替换为目标PID(十六进制) for (int i = 0; i < device_count; i++) { libusb_device *dev = dev_list[i]; struct libusb_device_descriptor desc; // 获取设备描述符(无需打开设备) int ret = libusb_get_device_descriptor(dev, &desc); if (ret < 0) continue; // 检查VIDPID是否匹配 if (desc.idVendor == target_vid && desc.idProduct == target_pid) { count++; } } ``` #### **4. 释放资源** 释放设备列表并关闭libusb上下文: ```c libusb_free_device_list(dev_list, 1); // 第二个参数为1表示解除引用 libusb_exit(ctx); ``` #### **5. 返回统计结果** 最终返回匹配的设备数量: ```c printf("找到 %d 个设备(VID: 0x%04X, PID: 0x%04X)\n", count, target_vid, target_pid); return count; ``` --- ### **完整代码示例** ```c #include <stdio.h> #include <libusb-1.0/libusb.h> int count_usb_devices(unsigned int target_vid, unsigned int target_pid) { libusb_context *ctx = NULL; int ret = libusb_init(&ctx); if (ret < 0) { fprintf(stderr, "初始化失败: %s\n", libusb_error_name(ret)); return -1; } libusb_device **dev_list; ssize_t device_count = libusb_get_device_list(ctx, &dev_list); if (device_count < 0) { fprintf(stderr, "获取设备列表失败\n"); libusb_exit(ctx); return -1; } int count = 0; for (int i = 0; i < device_count; i++) { libusb_device *dev = dev_list[i]; struct libusb_device_descriptor desc; ret = libusb_get_device_descriptor(dev, &desc); if (ret < 0) continue; if (desc.idVendor == target_vid && desc.idProduct == target_pid) { count++; } } libusb_free_device_list(dev_list, 1); libusb_exit(ctx); return count; } int main() { unsigned int vid = 0x1234; // 示例:Logitech VID=0x046D unsigned int pid = 0x5678; // 示例:鼠标 PID=0xC077 int num = count_usb_devices(vid, pid); if (num >= 0) { printf("找到 %d 个设备(VID: 0x%04X, PID: 0x%04X)\n", num, vid, pid); } return 0; } ``` --- ### **关键点解释** 1. **无需打开设备** - 直接通过 `libusb_get_device_descriptor` 获取设备的VIDPID,无需调用 `libusb_open`,**避免权限问题**。 2. **高效过滤** - 仅检查设备的厂商ID产品ID,时间复杂度为 $O(n)$,适用于实时统计。 3. **跨平台支持** - libusb支持Windows、Linux、macOS,代码可移植性强。 --- ### **编译与运行** 1. **编译命令** 链接 `libusb-1.0` 库: ```bash gcc -o usb_counter usb_counter.c -lusb-1.0 ``` 2. **权限配置(Linux)** - 若提示权限不足,创建udev规则文件 `/etc/udev/rules.d/99-libusb.rules`: ```bash SUBSYSTEM=="usb", MODE="0666" ``` - 重新加载规则并重启服务: ```bash sudo udevadm control --reload sudo service udev restart ``` --- ### **扩展应用** - **动态检测设备** 结合 `libusb_hotplug` 实现设备插拔事件监听: ```c libusb_hotplug_register_callback( ctx, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, target_vid, target_pid, LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL, &handle ); ``` 通过回调函数实时更新设备数量。 - **批量统计多组VID/PID** 将目标VID/PID存入数组,遍历时检查多组值: ```c struct target_device { unsigned int vid; unsigned int pid; }; struct target_device targets[] = {{0x1234, 0x5678}, {0x04b4, 0x8613}}; for (int j = 0; j < sizeof(targets)/sizeof(targets[0]); j++) { if (desc.idVendor == targets[j].vid && desc.idProduct == targets[j].pid) { count++; break; // 避免重复匹配 } } ``` --- ### **常见问题** 1. **返回值为-1或0** - `-1` 表示初始化或获取设备列表失败。 - `0` 表示未找到匹配设备。 2. **VID/PID格式** - VIDPID为十六进制数,需在代码中明确指定(如 `0x046D`)。 3. **设备未识别** - 确保目标设备已正确连接且驱动已安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值