没有合适的资源?快使用搜索试试~ 我知道了~
USB学习笔记-Linux中的USB驱动.pdf
需积分: 5 1 下载量 29 浏览量
2023-10-26
15:40:44
上传
评论
收藏 372KB PDF 举报
温馨提示
试读
19页
USB学习笔记_Linux中的USB驱动.pdf
资源推荐
资源详情
资源评论
Linux 下 USB 驱动之 skeleton 分析
1.结构体
内核其实就是一坨坨的数据结构,加上一根根链表。
对于初学者,如果直接看 USB 驱动代码,大概会被那些名字相近的结构体弄得
晕头转向,比如 usb_host_interface 和 usb_interface,看着看着就把两个混淆了。所
以,在学习 USB 驱动之前,建议把相关结构体都拎出来看一下,其实,也就那么几
个结构体在那装神弄鬼。USB skeleton 驱动中用到的主要字段已用蓝色标出:
endpoint:
struct usb_host_endpoint {
struct usb_endpoint_descriptor desc;
struct list_head urb_list;
void *hcpriv;
unsigned char *extra;
int extralen;
};
struct usb_endpoint_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bEndpointAddress;
__u8 bmAttributes;
__le16 wMaxPacketSize;
__u8 bInterval;
__u8 bRefresh;
__u8 bSynchAddress;
} __attribute__ ((packed));
bEndpointAddress,最高位用来判断传输方向:
#define USB_ENDPOINT_NUMBER_MASK 0x0f
#define USB_ENDPOINT_DIR_MASK 0x80
#define USB_DIR_OUT 0
#define USB_DIR_IN 0x80
bmAttributes,表示 endpoint 的类型:
#define USB_ENDPOINT_XFERTYPE_MASK 0x03
#define USB_ENDPOINT_XFER_CONTROL 0
#define USB_ENDPOINT_XFER_ISOC 1
#define USB_ENDPOINT_XFER_BULK 2
#define USB_ENDPOINT_XFER_INT 3
bInterval,如果该 endpoint 是 interrupt 类型的(USB 鼠标驱动就是该类型),
那么 bInterval 就表示中断时间间隔,单位毫秒。
interface:
struct usb_interface {
struct usb_host_interface *altsetting;
struct usb_host_interface *cur_altsetting;
unsigned num_altsetting;
int minor;
enum usb_interface_condition condition;
struct device dev;
struct class_device *class_dev;
};
struct usb_host_interface {
struct usb_interface_descriptor desc;
struct usb_host_endpoint *endpoint;
char *string;
unsigned char *extra;
int extralen;
};
struct usb_interface_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__u8 bInterfaceNumber;
__u8 bAlternateSetting;
__u8 bNumEndpoints;
__u8 bInterfaceClass;
__u8 bInterfaceSubClass;
__u8 bInterfaceProtocol;
__u8 iInterface;
剩余18页未读,继续阅读
资源评论
antion182
- 粉丝: 1
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功