usb驱动相关

设备描述符:

    struct usb_device_descriptor
{
	_ _u8 bLength; //描述符长度
	_ _u8 bDescriptorType; //描述符类型编号
	_ _le16 bcdUSB; //USB版本号
	_ _u8 bDeviceClass; //USB分配的设备类code
	_ _u8 bDeviceSubClass;// USB分配的子类code
	_ _u8 bDeviceProtocol; //USB分配的协议code
	_ _u8 bMaxPacketSize0; //endpoint0最大包大小
	_ _le16 idVendor; //厂商编号
	_ _le16 idProduct; //产品编号
	_ _le16 bcdDevice; //设备出厂编号
	_ _u8 iManufacturer; //描述厂商字符串的索引
	_ _u8 iProduct; //描述产品字符串的索引
	_ _u8 iSerialNumber; //描述设备序列号字符串的索引
	_ _u8 bNumConfigurations; //可能的配置数量
} ;

配置描述符

struct usb_config_descriptor
{
	_ _le16 wTotalLength; //配置所返回的所有数据的大小
	_ _u8 bNumInterfaces; // 配置所支持的接口数
	_ _u8 bConfigurationValue; //Set_Configuration命令需要的参数值
	_ _u8 iConfiguration; //描述该配置的字符串的索引值
	_ _u8 bmAttributes; //供电模式的选择
	_ _u8 bMaxPower; //设备从总线提取的最大电流
};

接口描述符

struct usb_interface_descriptor
{
	_ _u8 bInterfaceNumber;   // 接口的编号
	_ _u8 bAlternateSetting; //备用的接口描述符编号
	_ _u8 bNumEndpoints;      //该接口使用的端点数,不包括端点0
	_ _u8 bInterfaceClass;    //接口类型
	_ _u8 bInterfaceSubClass; //接口子类型
	_ _u8 bInterfaceProtocol; //接口所遵循的协议
	 _ _u8 iInterface; //描述该接口的字符串索引值
};

端点描述符

struct usb_endpoint_descriptor
{
	  _ _u8 bEndpointAddress; //端点地址:0~3位是端点号,第7位是方向(0-OUT,1-IN)
	  _ _u8 bmAttributes; //端点属性:bit[0:1] 的值为00表示控制,为01表示同步,为02表示批量,为03表示中断
	  _ _le16 wMaxPacketSize;  本端点接收或发送的最大信息包的大小
	_ _u8 bInterval;//轮询数据传送端点的时间间隔
	                   //对于批量传送的端点以及控制传送的端点,此域忽略
	                    //对于同步传送的端点,此域必须为1
	_ _u8 bRefresh;
	_ _u8 bSynchAddress;
};

字符串描述符

       struct usb_string_descriptor
{
	_ _u8 bLength; //描述符长度
	_ _u8 bDescriptorType; //描述符类型	
	_ _le16 wData[1];
};
struct usb_interface
{        
   struct usb_host_interface *xxx;
};
struct usb_host_interface 
{
      struct usb_interface_descriptor desc; //usb描述符
      struct usb_host_endpoint *endpoint;//端点
};
//接口描述符放在表示接口设置的struct usb_host_interface结构
struct usb_host_endpoint 
{
      struct usb_endpoint_descriptor desc;
      struct list_head urb_list;//usb通信先创建urb,端点处理urb队列,通过usb core找host controller,从而进行数据传输
};
struct usb_device {
};
struct usb_host_config {
	struct usb_config_descriptor desc;     
	struct usb_interface *interface[USB_MAXINTERFACES];     
	struct usb_interface_cache *xxx[USB_MAXINTERFACES];  //usb接口缓存
};

一个 urb 循环:
创建、分配给一个特定 USB 设备的特定端点、给 USB 核心、USB 主机控制器驱动、传送到设备、USB主机控制器驱动通知 USB 设备驱动。

struct urb
{
	struct kref xxx; /*urb引用计数 */
	u8 reject; /* 传输将失败*/
	struct list_head urb_list; /* 链表头*/
	dma_addr_t transfer_dma; /*用来以dma方式向设备传输数据的缓冲区 */
	usb_complete_t complete; /* 当urb被完全传输或发生错误时,被调用 */
};

创建urb:

usb_alloc_urb

释放urb:

usb_free_urb

初始化urb:

static inline void usb_fill_int_urb(struct urb *urb,                                                                                                       
                 struct usb_device *dev,
                 unsigned int pipe,
                 void *transfer_buffer,
                 int buffer_length,
                 usb_complete_t complete_fn,
                 void *context,
                 int interval);
static inline void usb_fill_bulk_urb( );
static inline void usb_fill_control_urb(); 

//void *context :指向一个小数据块的指针, 被添加到 urb 结构中,以便被结束处理例程函数获取使用.
//函数不设置 urb 中的 transfer_flags 变量, 因此对这个成员的修改必须由驱动手动完成

/等时 urb 没有初始化函数,必须手动初始化/

urb->dev = dev;
urb->context = uvd;
urb->pipe = usb_rcvisocpipe(dev, uvd->video_endp-1);
urb->interval = 1;
urb->transfer_flags = URB_ISO_ASAP;
urb->transfer_buffer = cam->sts_buf[i];
urb->complete = konicawc_isoc_irq;
urb->number_of_packets = FRAMES_PER_DESC;
urb->transfer_buffer_length = FRAMES_PER_DESC;
for (j=0; j < FRAMES_PER_DESC; j++) {
        urb->iso_frame_desc[j].offset = j;
        urb->iso_frame_desc[j].length = 1;
}

提交urb:

usb_submit_urb

取消urb:

void usb_kill_urb(struct urb *urb);
int usb_unlink_urb(struct urb *urb);

Linux系统中USB子系统的主要数据结构

    Linux系统中,USBD通过定义一组宏、数据结构和函数来抽象出所有硬件或是设备具有依赖关系的部分。

USBD中主要有四个数据结构,分别是:
1.usb_device 设备的信息,包括设备地址,设备描述符,配置描述符等。
2.usb_bus 总线系统的信息,包括总线上设备地址信息,根集线器,带宽使用情况等。一个USB总线系统至少有一个主机控制器和一个根集线器,Linux系统支持多USB总线系统。
3.usb_driver驱动信息,包括驱动名称,驱动提供给USB内核使用的函数指针等。
4.urb(Universal Request Block)是进行USB通信的数据结构,USBD通过URB在USB设备类驱动和USBD、USBD和HCD间进行数据传输。

bEndpointAddress包含端点号和输出方向,bits0-bits3表示的是端点号
bmAttributes 表示该端点的类型

转自:https://blog.csdn.net/zqixiao_09/article/details/51114818

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值