歡迎您光臨本站 註冊首頁

u盤驅動學習(三)代碼分析之變態結構體

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
在linux內核中,U盤驅動的代碼大部分都放在 drivers/usb/storage 目錄下,主程序名稱為usb.c,在這裡我們先不看源代碼,先介紹一個貫穿整個始終的變態結構體,us_data. 結構體定義在 usb.h 這個文件當中. struct us_data {
/* The device we're working with
* It's important to note:
* (o) you must hold dev_semaphore to change pusb_dev
*/
struct semaphore dev_semaphore; /* 互斥信號量,用於保護 pusb_dev */
struct usb_device *pusb_dev; /* 標識每一個設備this usb_device */
struct usb_interface *pusb_intf; /* 標識一個介面this interface */
struct us_unusual_dev *unusual_dev; /* 設備信息的指針device-filter entry */
unsigned long flags; /* from filter initially */
unsigned int send_bulk_pipe; /* cached pipe values */
unsigned int recv_bulk_pipe;
unsigned int send_ctrl_pipe;
unsigned int recv_ctrl_pipe;
unsigned int recv_intr_pipe; /* information about the device */
char vendor[USB_STOR_STRING_LEN]; /* 廠家信息 */
char product[USB_STOR_STRING_LEN]; /* 產品信息 */
char serial[USB_STOR_STRING_LEN];
char *transport_name;
char *protocol_name; /* 協議類型 */
u8 subclass;
u8 protocol;
u8 max_lun; u8 ifnum; /* interface number */
u8 ep_bInterval; /* interrupt interval */ /* function pointers for this device */
trans_cmnd transport; /* transport function */
trans_reset transport_reset; /* transport device reset */


proto_cmnd proto_handler; /* protocol handler */ /* SCSI interfaces */
struct Scsi_Host *host; /* our dummy host data */
struct scsi_cmnd *srb; /* current srb */ /* thread information */
int pid; /* control thread */ /* control and bulk communications data */
struct urb *current_urb; /* USB requests */
struct usb_ctrlrequest *cr; /* control requests */
struct usb_sg_request current_sg; /* scatter-gather req. */
unsigned char *iobuf; /* I/O buffer */
dma_addr_t cr_dma; /* buffer DMA addresses */
dma_addr_t iobuf_dma; /* mutual exclusion and synchronization structures */
struct semaphore sema; /* to sleep thread on */
struct completion notify; /* thread begin/end */
wait_queue_head_t dev_reset_wait; /* wait during reset */
wait_queue_head_t scsi_scan_wait; /* wait before scanning */
struct completion scsi_scan_done; /* scan thread end */ /* subdriver information */
void *extra; /* Any extra data */
extra_data_destructor extra_destructor;/* extra data destructor */
}; 對於每個u盤設備來說,us data一旦分配完成,在整個程序中就是唯一的.


[火星人 ] u盤驅動學習(三)代碼分析之變態結構體已經有344次圍觀

http://coctec.com/docs/linux/show-post-49690.html