通过gadget命令行生成hid设备
下面xxx自己根据需要修改,例如VID,PID,产品名称
const char *INSTALL_GADGET_CMDS[] = {
"modprobe libcomposite",
"mkdir /sys/kernel/config/usb_gadget/g1",
"echo 'xxx' > /sys/kernel/config/usb_gadget/g1/idVendor",
"echo 'xxx' > /sys/kernel/config/usb_gadget/g1/idProduct",
"mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409", // 设备信息目录
"echo 'xxx' > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber", // 产品序列号
"echo 'xxx' > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer", // 产品制造商
"echo 'xxx' > /sys/kernel/config/usb_gadget/g1/strings/0x409/product", // 产品名字
"mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1", // 配置目录
"mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409",
"echo 'config' > /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409/configuration",
"echo 0x80 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes",
"echo 100 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower",
// 下面这些functions下的目配置都是接口描述符配置,一个目录是一个接口
// Touchscreen
"mkdir -p /sys/kernel/config/usb_gadget/g1/functions/hid.usb0", // 功能描述
"echo 1 > /sys/kernel/config/usb_gadget/g1/functions/hid.usb0/subclass",
"echo 0 > /sys/kernel/config/usb_gadget/g1/functions/hid.usb0/protocol",
"echo 12 > /sys/kernel/config/usb_gadget/g1/functions/hid.usb0/report_length", // hid report max size
"echo '050d0904a1018501050d0922a102050d9501750609511500253f810209422501750195018102750195018103050195017510550e65110930260040350046a6148142093126004046a40b8142c0050d0922a102050d9501750609511500253f810209422501750195018102750195018103050195017510550e65110930260040350046a6148142093126004046a40b8142c0050d0954257f95017508810285020955250a75089501b102c0' | xxd " XXD_ARGS " > /sys/kernel/config/usb_gadget/g1/functions/hid.usb0/report_desc", // hid desc
"ln -s /sys/kernel/config/usb_gadget/g1/functions/hid.usb0 /sys/kernel/config/usb_gadget/g1/configs/c.1", // 关联配置和功能文件
"ls /sys/class/udc > /sys/kernel/config/usb_gadget/g1/UDC", // 启动设备
};
const char *UNINSTALL_GADGET_CMDS[] = {
"echo '' > /sys/kernel/config/usb_gadget/g1/UDC",
"rm /sys/kernel/config/usb_gadget/g1/configs/c.1/hid.usb0",
"rmdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409",
"rmdir /sys/kernel/config/usb_gadget/g1/configs/c.1",
"rmdir /sys/kernel/config/usb_gadget/g1/functions/hid.usb0",
"rmdir /sys/kernel/config/usb_gadget/g1/strings/0x409",
"rmdir /sys/kernel/config/usb_gadget/g1",
};
里面很长的那个字符串,是hid报告描述符,下面详细讲。
hid报告描述符
把上面hid报告描述符贴到 https://www.usbzh.com/tool/usb.html,可以分析出结构,我已经在关键位置加了注释。
0x05, 0x0D, // Usage Page (Digitizer)
0x09, 0x04, // Usage (Touch Screen) //触控屏
0xA1, 0x01, // Collection (Application) //每一个collection相当于c++里面的花括号,里面是一个集合
0x85, 0x01, // Report ID (1)
0x05, 0x0D, // Usage Page (Digitizer)
0x09, 0x22, // Usage (Finger)
//下面是一个触控点的数据包,也就是第一个手指
0xA1, 0x02, // Collection (Logical) //这里主要描述到时候上报数据的数据格式,例如触控id/坐标xy,占用几个bit这些信息
0x05, 0x0D,

最低0.47元/天 解锁文章
1011

被折叠的 条评论
为什么被折叠?



