Lu Blog

分类 Hack 下的文章

Electron 更新app.asar

开发Electron时发现app.asar无法在运行时修改,搜索了一圈,不是重新安装就是更新没打包过的单个文件,似乎没有能更新app.asar的。
研究了一下,发现通过修改底层的加载代码还是可以做到的。
app.asar在electron.asar\browser\init.js中被加载,所以只需要在调用app.asar之前加几行代码检测处理即可。



阅读更多

{Nrf24lu1p开发} USB HID

USB HID描述符的体系结构
USB HID描述符的体系结构
设备描述符
一个设备只有一个设备描述符

typedef struct {
   uint8_t  bLength;            // 描述符大小,固定为0x12
   uint8_t  bDescriptorType;    // 设备描述符类型,固定为0x0
   uint16_t bcdUSB;             // USB规范发布号
   uint8_t  bDeviceClass;
   uint8_t  bDeviceSubClass;
   uint8_t  bDeviceProtocol;
   uint8_t  bMaxPacketSize0;    // 端点0最大包大小 (8,16,32,64)
   uint16_t idVendor;           // 供应商ID
   uint16_t idProduct;          // 产品ID
   uint16_t bcdDevice;          // 设备版本号
   uint8_t  iManufacturer;      // 制造商字符串索引位置
   uint8_t  iProduct;           // 产品名称字符串索引位置
   uint8_t  iSerialNumber;
   uint8_t  bNumConfigurations; // 可能的配置数量,指配置字符串的个数
} device_descriptor_t;

片段:

__code const device_descriptor_t device_descriptor = 
{
  .bLength            = 18,     // 0x12
  .bDescriptorType    = DEVICE_DESCRIPTOR, // 0x0
  .bcdUSB             = 0x0200, // 使用USB 2.0
  .bDeviceClass       = 0xFF,
  .bDeviceSubClass    = 0xFF,
  .bDeviceProtocol    = 0xFF,
  .bMaxPacketSize0    = 64,
  .idVendor           = 0x1915, // Nordic Semiconductor
  .idProduct          = 0x0102, // Nordic bootloader product ID incremebted by 1
  .bcdDevice          = 0x0001, 
  .iManufacturer      = STRING_DESCRIPTOR_MANUFACTURER,// 1
  .iProduct           = STRING_DESCRIPTOR_PRODUCT,// 2
  .iSerialNumber      = 0,
  .bNumConfigurations = 1,
};

配置描述符
配置描述符定义了设备的配置信息,一个设备可以有多个配置描述符

typedef struct {
  uint8_t  bLength;              // 描述符大小,固定0x09
  uint8_t  bDescriptorType;      // 配置描述符类型,固定为0x02
  uint16_t wTotalLength;         // 返回整个数据的长度,返回配置描述符,接口描述符以及端点描述符的全部大小
  uint8_t  bNumInterfaces;       // 配置所支持的接口数,指该配置配备的接口数量,也表示该配置下接口描述符数量
  uint8_t  bConfigurationValue;  // 配置标识符
  uint8_t  iConfiguration;
  uint8_t  bmAttributes; 
  uint8_t  bMaxPower; 
  interface_descriptor_t interface_descriptor; 
  endpoint_descriptor_t endpoint_descriptor;
  ...
} configuration_descriptor_t;

参考

阅读更多