libusb数据结构说明

  1. 设备描述符结构
struct libusb_device_descriptor{
u_int8_t blength;
u_int8_t bDescriptorType;
u_int16_t bcdUSB;
u_int8_t  bDeviceClass;
u_int8_t  bDeviceSubClass;
u_int8_t  bDeviceProtocol;
u_int8_t  bMaxPacketSize0;
u_int16_t idVendor;
u_int16_t idProduct;
u_int16_t bcdDevice;
u_int8_t  iManufacturer;
u_int8_t  iProduct;
u_int8_t  iSerialNumber;
u_int8_t  bNumConfigurations;
};
bLength : 描述符大小.固定为0x12.
bDescriptorType : 设备描述符类型.固定为0x01 LIBUSB_DT_DEVICE.
bcdUSB : USB 规范的版本号.表示了本设备能适用于那种协议,如2.0=0200,1.1=0110等.
bDeviceClass : 类型代码(由USB指定)。当它的值是0时,表示所有接口在配置描述符里,并且所有接口是独立的。当它的值是1到FEH时,表示不同的接口关联的。当它的值是0xFF时,它是厂商自己定义的.
bDeviceSubClass : 子类型代码(由USB分配).如果bDeviceClass值是0,一定要设置为0.其它情况就跟据USB-IF组织定义的编码.
bDeviceProtocol : 协议代码(由USB分配).如果使用USB-IF组织定义的协议,就需要设置这里的值,否则直接设置为0。如果厂商自己定义的可以设置为0xFF.
bMaxPacketSize0 : 端点0最大分组大小(只有8,16,32,64有效).
idVendor : 供应商ID(由USB分配).
idProduct : 产品ID(由厂商分配).由供应商ID和产品ID,就可以让操作系统加载不同的驱动程序.
bcdDevice : 设备出产编码.由厂家自行设置.
iManufacturer : 厂商描述符字符串索引.索引到对应的字符串描述符. 为0则表示没有.
iProduct : :产品描述符字符串索引.同上.
iSerialNumber : 设备序列号字符串索引.同上.
bNumConfigurations : 可能的配置数.指配置字符串的个数
USB class CODE 详细说明如下:
Class code             用途           详细说明
00h                    Device         表示CLASS的信息在接口的描述符中定义
01h                    Interface      Audio   音频设备
02h                    Both           Communications and CDC Control通信设备
03h                    Interface      HID (Human Interface Device) 人机接口设备
05h                    Interface      Physical 物理设备
06h                    Interface      Image 图像设备
07h                    Interface      Printer 打印机
08h                    Interface      Mass Storage 大容量存储
09h                    Device         Hub
0Ah                    Interface      CDC-Data 通信设备
0Bh                    Interface      Smart Card 智能卡
0Dh                    Interface      Content Security 内容安全设备
0Eh                    Interface      Video 视频设备 
0Fh                    Interface      Personal Healthcare  个人健康设备
10h   Interface      Audio/Video Devices 音频/视频设备
DCh                    Both           Diagnostic Device 诊断设备
E0h                    Interface      Wireless Controller 无线控制器(蓝牙设备等)
EFh                    Both           Miscellaneous 杂项(ActiveSync,PalmSync,各种协会等)
FEh                    Interface      Application Specific 应用专有规范(固件升级,红外,USB测试与测量等)
FFh                    Both           Vendor Specific 供应商自定义规范
注:各类设备的class subclass protocol的详细定义可以参考http://www.usb.org/developers/defined_class

2. 配置描述符

struct libusb_config_descriptor{
u_int8_t blength;
u_int8_t bDescriptorType;
u_int16_t wTotalLength;
u_int8_t bNumInterfaces;
u_int8_t bConfigurationValue;
u_int8_t iConfiguration;
u_int_t bmAttributes;
 u_int8_t MaxPower;

const struct libusb_interface *interface;

const unsigned char *extra;
int extralen;
};

bLength:描述符大小,固定为0x09.
bDescriptorType:配置描述符类型,固定为0x02 LIBUSB_DT_CONFIG.
wTotalLength:返回整个数据的长度,指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小.
bNumInterfaces:配置所支持的接口数,指改配置配备的接口数量,也表示该配置下接口描述符数量.
bConfigurationValue:作为Set Configuration的一个参数选择配置值.
iConfiguration:用于描述该配置字符串描述符的索引
bmAttributes:供电模式选择,Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒。
MaxPower:总线供电的USB设备的最大消耗电流,以2mA为单位。

struct libusb_interface_descriptor {
u_int8_t  bLength;
u_int8_t  bDescriptorType;
u_int8_t  bInterfaceNumber;
u_int8_t  bAlternateSetting;
u_int8_t  bNumEndpoints;
u_int8_t  bInterfaceClass;
u_int8_t  bInterfaceSubClass;
u_int8_t  bInterfaceProtocol;
u_int8_t  iInterface;

const struct libusb_endpoint_descriptor *endpoint;


const unsigned char *extra;
int extralen;
};
bLength : 描述符大小.固定为0x09.
bDescriptorType : 接口描述符类型.固定为0x04 LIBUSB_DT_INTERFACE.
bInterfaceNumber: 该接口的编号.
bAlternateSetting : 用于为上一个字段选择可供替换的位置.即备用的接口描述符标号.
bNumEndpoint : 使用的端点数目.端点0除外.
bInterfaceClass : 类型代码(由USB分配).
bInterfaceSunClass : 子类型代码(由USB分配).
bInterfaceProtocol : 协议代码(由USB分配).
iInterface : 字符串描述符的索引
 3. 接口描述符
     接口描述符说明了接口所提供的配置,一个配置所拥有的接口数量通过配置描述符的bNumInterfaces决定


 struct libusb_endpoint_descriptor {
u_int8_t  bLength;
u_int8_t  bDescriptorType;
u_int8_t  bEndpointAddress;
u_int8_t  bmAttributes;
u_int16_t wMaxPacketSize;
u_int8_t  bInterval;
u_int8_t  bRefresh;
u_int8_t  bSynchAddress;


unsigned char *extra;
/* Extra descriptors */
int extra_length;
};

bLength : 描述符大小.固定为0x07.
bDescriptorType : 接口描述符类型.固定为0x05 LIBUSB_DT_ENDPOINT.
bEndpointAddress : USB设备的端点地址.Bit7,方向,对于控制端点可以忽略,1/0:IN/OUT.Bit6-4,保留.BIt3-0:端点号.
bmAttributes : 端点属性.Bit7-2,保留.BIt1-0:00控制,01同步,02批量,03中断.
wMaxPacketSize : 本端点接收或发送的最大信息包大小.
bInterval : 轮询数据传送端点的时间间隔.对于批量传送和控制传送的端点忽略.对于同步传送的端点,必须为1,对于中断传送的端点,范围为1-255.

Endpoint 按属性分有四种类型:
1)控制端点(Control Endpoint):
通常用于 配置设备、获取设备信息、发送命令到设备、获取设备的状态报告等,即传输控制信息。
2)中断端点(Interrupt Endpoint):
当 USB 主机要求设备传输数据时,中断端点就以一个固定的速率来传送少量的数据。(USB键鼠即是此方式)
3)批量端点(Bulk Endpoint):
传输大批量数据,确保不丢失数据,但不保证特定时间内完成。(打印机、网络设备多用此方式)
4)同步端点(Isochronous Endpoint):
传输大批量数据,不保证数据是否到达,对传送延迟非常敏感,可保持一个恒定速率收发实时信息。(音视频设备多用此方式)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libusb 是一个开源的用户空间USB设备库,它提供了一个编程接口,允许开发者通过USB接口与USB设备进行通信。要使用libusb发送数据,需要按照以下步骤进行操作: 1. 初始化libusb:在使用libusb之前,需要先初始化libusb库。这可以通过调用libusb_init函数来实现。 2. 打开设备:在初始化libusb之后,需要打开要通信的USB设备。这可以通过调用libusb_open_device_with_vid_pid函数,并传入设备的供应商ID(Vendor ID)和产品ID(Product ID)来实现。 3. 规定端点USB设备通常会有多个端点(endpoint),端点定义了数据传输的方式和方向。需要使用libusb_set_configuration函数设置设备的配置,并使用libusb_claim_interface函数来声明接口,并将其设置为活动状态。 4. 发送数据:一旦设备配置和接口设置完成,就可以使用libusb_bulk_transfer或libusb_interrupt_transfer函数来发送数据到设备。这两个函数分别用于批量传输和断传输数据。 5. 清理资源:在通信完成后,需要释放已经打开的设备,可以使用libusb_release_interface和libusb_close函数来关闭设备和接口。 需要注意的是,使用libusb进行USB通信需要具备对USB设备的底层了解,包括设备的规格和协议等。同时,由于不同的操作系统对USB设备的支持有所差异,使用libusb时可能需要考虑到操作系统的兼容性和驱动的安装等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值