http://www.linux-usb.org/gadget/usb.cに例がありますが、私にはあまりありません。gadgetfs にディスクリプタを書きたいのですが、いつも間違っています。ディスクリプタまたは gadgetfs に対する私の考えが間違っていることに気付きました。もっとドキュメントや例が必要です! 本当に本当にありがとう!!
記述子を生成するコード。パラメータ 'dev' は USB デバイスからのものです。
int gen_gadget_descriptor(char* descriptor,struct libusb_device* dev){
char* ptr = descriptor;
//前四字节为0
ptr[0] = ptr[1] = ptr[2] = ptr[3] = 0;
ptr += 4;
struct libusb_device_descriptor devDesc;
libusb_get_device_descriptor(dev, &devDesc);
struct libusb_config_descriptor* confDesc;
libusb_get_config_descriptor(dev,0,&confDesc);
for (int l = 0; l < devDesc.bNumConfigurations; l++) {
//加入配置描述符
memcpy(ptr, &confDesc[l], confDesc->bLength);
ptr += confDesc[l].bLength;
//遍历配置描述符中的接口结构体的数量
int nbIfaces = confDesc->bNumInterfaces;
for (int i = 0; i<nbIfaces; i++) {
//遍历该接口结构体下的接口描述符
for (int j = 0; j<confDesc->interface[i].num_altsetting; j++) {
//加入接口描述符
memcpy(ptr, &confDesc->interface[i].altsetting[j], confDesc->interface[i].altsetting[j].bLength);
ptr += confDesc->interface[i].altsetting->bLength;
//遍历接口描述符下的端点描述符
for (int k = 0; k<confDesc->interface[i].altsetting[j].bNumEndpoints; k++) {
memcpy(ptr, &confDesc->interface[i].altsetting[j].endpoint[k],
confDesc->interface[i].altsetting[j].endpoint[k].bLength);
ptr += confDesc->interface[i].altsetting[j].endpoint[k].bLength;
}
}
}
libusb_free_config_descriptor(confDesc);
}
//加入设备描述符
printf("devDesc.length=%d\n",devDesc.bLength);
memcpy(ptr, (char*)&devDesc,sizeof(struct usb_device_descriptor));
ptr += sizeof(struct usb_device_descriptor);
int descriptorLen = ptr - descriptor;
return descriptorLen;
}