数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 6817|回复: 43

[外设] USB邮箱灯折腾手记:定位驱动、重写高层并实现编译指示灯(原创)

  [复制链接]
发表于 2021-6-21 01:26:25 | 显示全部楼层 |阅读模式
某宝剁手的时候入了几个 USB 邮箱灯,外形颇为精致。原单是外贸货,店家并未折腾成功,故无资料。
本想买来拆外壳玩,不料居然在 Win10 下成功驱动了起来,特来分享之。

【剁手】

USB 邮箱灯是个邮箱形状的红色小灯,一端有 USB 插头,尺寸非常迷你:


原本设计的是用来提醒新邮件的,插在 USB 口上由 PC 软件控制:


但也许是时间过于久远,店家这批邮箱灯配套的 CD、驱动软件都已丢失,于是廉价处理。
入手后这包装也是满满的小清新风格,仿佛要把整张图纸都画上一样:



【分析驱动:USB-HID】

虽然从最开始就已做好拆壳准备,但还是在笔记本上插了一下,结果 Win10 x64 居然成功安装了驱动:



不得不说 Win10 自带的 USB 驱动是真的很全,这么偏的硬件居然可以免驱运行。
为了安全起见(例如防止硬件内部短路),我把邮箱灯插在了外供电集线器上,这样一来想要找到新增硬件也略微费劲。

Usb Device Viewer 搞起来,很快就在 USB 树下找到了设备,信息如下:



从 Device Information 报告来看,设备在 USB 物理传输层没毛病,可以正确向 PC 报告设备自身信息。
再仔细分析设备信息 Open_Pipe=1,Interface=HID,基本可以确认邮箱灯使用了单传输通道的 HID 协议。
难怪可以在 PC 层直接免驱运行,HID 协议(常用于鼠标键盘)也算是 Windows 着重关照的一类设备。

虽说可以直接使用 libusb 之类开源库重编写驱动,但由于并不知道高层控制协议,只得求助网络。
这一查不要紧,原来老外早就有了开源项目,已完整破解了高层控制协议,并有直接 C# 编写的控制台驱动。

分享来开源驱动包的项目地址:
http://www.java2s.com/Open-Sourc ... d_Stress_Button.htm

为防止网址被墙,C# 源码驱动包也转来:

直接运行代码包中可执行文件,提示需要使用控制台脚本加参数,同时居然提示找不到设备:



查看源码发现,默认邮箱灯访问的是 Vid/Pid=0x1d34/0x0004,而设备报告的是 Vid/Pid=0x1d34/0x000a.
想来是山寨厂家修改了 PID 来做独立驱动,结果最后厂子也黄了,产品也被处理给了剁手怪....

还好驱动已经考虑到了这种情况,直接指定 device 参数即可设定。编写了一个简单的 bat 脚本果然成功驱动:

  1. DreamCheekyLED.exe  device="0x1D34,0x000A,0"  testblink
  2. pause
复制代码


另存 bat 文件后,放在 DreamCheekyLED.exe 目录运行脚本效果如下:



附上几个写好的 bat 脚本,可直接运行:


【重写高层:监视编译器】

至此获得了一只可控的硬件 LED,但仍缺少高层事件源。原设计是通过 PowerShell 脚本接收新邮件通知,但如今邮箱用的太少故作罢。
不过既然外形这么可爱,不指示点啥实在浪费颜值,思前想后决定做一个 CPU 负担指示器。

经常写高层、HDL层程序的各位,可能经常会被慢如老牛的编译器折腾到崩溃,如果拿此灯指示编译进行中,想来比较新鲜。
至于原理也并不复杂:后台监控 CPU 负担,当负担达到了设定的阈值即亮灯,待负载降下来再熄灭。MFC走起来:



简单获取 CPU 负担,并与现有设定阈值比较,超负荷后使用 WinExec 调用 C# 写好的底层驱动,界面外观如下:



调整下阈值,就可以灵敏地监测编译器工作了。例如监视 Quartus 编译过程(编译中亮灯,完成后熄灭):



附上可执行文件及源码:

这个 USB 邮箱灯说白了就是个自定义 HID 协议的双色硬件灯,可以通过 HID 驱动或者现成 C# 驱动控制。
至于高层的事件源,可以是原新邮件通知,也可以使用 PC 本地数据。编写不同的事件捕获器,即可实现任意门通知。

--------------------------------------------------------

以上,剁手了一批 USB 接口的邮箱指示灯,通过分析 USB 报告配合网上开源代码,实现了 HID 层的点灯驱动。
顺手写了一个 CPU 负担监控器,负担超限后点亮邮箱灯,可用于监控编译器工作状态,终得物尽其用。

最后祝大家折腾愉快!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x

打赏

参与人数 9家元 +161 收起 理由
snowrose2000 + 20 謝謝分享
兔包公 + 20 膜拜大婶
kkdkj + 20 謝謝分享
jf201006 + 20 原創內容
hfsp + 20 謝謝分享
aacyxjz + 20 優秀文章
miqi328 + 20 謝謝分享
chenzoutie + 1 原創內容
azzajazz + 20

查看全部打赏

 楼主| 发表于 2021-8-17 18:42:33 来自手机浏览器 | 显示全部楼层
bearxu 发表于 2021-8-17 17:04
把 led 接个继电器模块,是不是就能控制220v 设备了?

理论上可以,实际可能会因为干扰导致usb掉线。

真要控制220,用8266更简单明了
回复 支持 反对

使用道具 举报

发表于 2021-8-17 17:04:56 | 显示全部楼层
把 led 接个继电器模块,是不是就能控制220v 设备了?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-16 23:14:02 | 显示全部楼层
digital2Fox 发表于 2021-7-11 10:04
有意思的小玩意
经过思想斗争,管住了手没买

我第一次见到的时候管住了,结果后来又有第二次第三次,就有了这个帖子
回复 支持 反对

使用道具 举报

发表于 2021-7-11 10:04:25 | 显示全部楼层
有意思的小玩意
经过思想斗争,管住了手没买
回复 支持 反对

使用道具 举报

发表于 2021-7-10 09:05:50 来自手机浏览器 | 显示全部楼层
:lol:有点意思!!不过实用性就:titter::giggle:创意是不错的。每次都能在这里看到很多新奇的玩意!不错!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-10 02:07:50 | 显示全部楼层
hc605 发表于 2021-7-9 22:25
好像已经买不到了

搜索“邮件提醒器”就有了,三块多那个就是

打赏

参与人数 1家元 +20 收起 理由
hc605 + 20 感谢分享!找到了

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2021-7-9 22:25:00 | 显示全部楼层
好像已经买不到了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-2 01:55:55 | 显示全部楼层
hackerfgd 发表于 2021-7-1 17:23
这小玩意儿看起来还真有点意思。

需要比较无聊的老外,才能搞出此等物件
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-2 01:54:48 | 显示全部楼层
轻烟 发表于 2021-6-25 11:41
竟然还有这种小灯,楼主也很能折腾,不过就是感觉不太实用,提醒邮件的软件比较多 ...

想起来关于 CapsLock 硬件指示灯的两个派别。

一派主张 CapsLock 按键上必须有硬件 LED,一派主张大小写你屏幕还看不出么....
回复 支持 反对

使用道具 举报

发表于 2021-7-1 17:23:49 | 显示全部楼层
这小玩意儿看起来还真有点意思。

回复 支持 反对

使用道具 举报

发表于 2021-7-1 12:03:22 | 显示全部楼层
好文章,好技术,能申精
回复 支持 反对

使用道具 举报

发表于 2021-7-1 12:02:34 | 显示全部楼层
好文章,好技术,能申精
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-25 21:03:16 | 显示全部楼层
garyjohnson 发表于 2021-6-25 20:35
能改成硬盘指示灯就好了,现在的新本都没有硬盘灯,卡死的时候也不知道真死假死 ...

理论上读取到磁盘 I/O 性能数据就有了,实际操作还没找到相应的 API;

绕个道,如果用 AIDA 之类软件,可以向指定 IP端口广播,也就有了磁盘速度了
回复 支持 反对

使用道具 举报

发表于 2021-6-25 20:35:57 | 显示全部楼层
能改成硬盘指示灯就好了,现在的新本都没有硬盘灯,卡死的时候也不知道真死假死
回复 支持 反对

使用道具 举报

发表于 2021-6-25 11:41:12 | 显示全部楼层
竟然还有这种小灯,楼主也很能折腾,不过就是感觉不太实用,提醒邮件的软件比较多

打赏

参与人数 1家元 +20 收起 理由
ljlun + 20 熱心會員

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-25 00:28:36 | 显示全部楼层
wywa123 发表于 2021-6-22 19:20
几乎可以说,不管是啥库,windows上打开设备,最后都会落到Win32 API上;
见 HidLibrary\NativeMethods.cs ...

难怪在 dll 层几乎是跨语言的,原来底层都是 C-API 一样的东西
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-25 00:27:49 | 显示全部楼层
sonichy 发表于 2021-6-23 22:38
直接LED改到电源上,做长亮灯,简单粗暴。

那就损失了牛屎芯片折腾的精髓
回复 支持 反对

使用道具 举报

发表于 2021-6-23 22:38:18 | 显示全部楼层
直接LED改到电源上,做长亮灯,简单粗暴。
回复 支持 反对

使用道具 举报

发表于 2021-6-22 19:20:46 | 显示全部楼层
几乎可以说,不管是啥库,windows上打开设备,最后都会落到Win32 API上;
见 HidLibrary\NativeMethods.cs:

       [DllImport("kernel32.dll")]
       static internal extern int CancelIo(int hFile);

       [DllImport("kernel32.dll", SetLastError = true)]
       static internal extern bool CloseHandle(IntPtr hObject);

       [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
       static internal extern IntPtr CreateEvent(ref SECURITY_ATTRIBUTES securityAttributes, int bManualReset, int bInitialState, string lpName);

       [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
       static internal extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, ref SECURITY_ATTRIBUTES lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);

        [DllImport("kernel32.dll", SetLastError = true)]
        static internal extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, [In] ref System.Threading.NativeOverlapped lpOverlapped);

       [DllImport("kernel32.dll")]
       static internal extern uint WaitForSingleObject(IntPtr hHandle, int dwMilliseconds);

        [DllImport("kernel32.dll")]
        static internal extern bool WriteFile(IntPtr hFile, byte[] lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, [In] ref System.Threading.NativeOverlapped lpOverlapped);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-22 15:26 , Processed in 0.296400 second(s), 17 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表