📄 hc_simple.h
字号:
/*-------------------------------------------------------------------------*//* list of all controllers using this driver * */ static LIST_HEAD (hci_hcd_list);/* URB states (urb_state) */ /* isoc, interrupt single state *//* bulk transfer main state and 0-length packet */#define US_BULK 0 #define US_BULK0 1/* three setup states */#define US_CTRL_SETUP 2#define US_CTRL_DATA 1#define US_CTRL_ACK 0/*-------------------------------------------------------------------------*//* HC private part of a device descriptor * */#define NUM_EDS 32typedef struct epd { urb_t * pipe_head; struct list_head urb_queue;// int urb_state; struct timer_list timeout; int last_iso; /* timestamp of last queued ISOC transfer */} epd_t;struct hci_device { epd_t ed [NUM_EDS];};/*-------------------------------------------------------------------------*//* Virtual Root HUB * */#define usb_to_hci(usb) ((struct hci_device *)(usb)->hcpriv)struct virt_root_hub { int devnum; /* Address of Root Hub endpoint */ void * urb; /* interrupt URB of root hub */ int send; /* active flag */ int interval; /* intervall of roothub interrupt transfers */ struct timer_list rh_int_timer; /* intervall timer for rh interrupt EP */};#if 1/* USB HUB CONSTANTS (not OHCI-specific; see hub.h and USB spec) */ /* destination of request */#define RH_INTERFACE 0x01#define RH_ENDPOINT 0x02#define RH_OTHER 0x03#define RH_CLASS 0x20#define RH_VENDOR 0x40/* Requests: bRequest << 8 | bmRequestType */#define RH_GET_STATUS 0x0080#define RH_CLEAR_FEATURE 0x0100#define RH_SET_FEATURE 0x0300#define RH_SET_ADDRESS 0x0500#define RH_GET_DESCRIPTOR 0x0680#define RH_SET_DESCRIPTOR 0x0700#define RH_GET_CONFIGURATION 0x0880#define RH_SET_CONFIGURATION 0x0900#define RH_GET_STATE 0x0280#define RH_GET_INTERFACE 0x0A80#define RH_SET_INTERFACE 0x0B00#define RH_SYNC_FRAME 0x0C80/* Our Vendor Specific Request */#define RH_SET_EP 0x2000/* Hub port features */#define RH_PORT_CONNECTION 0x00#define RH_PORT_ENABLE 0x01#define RH_PORT_SUSPEND 0x02#define RH_PORT_OVER_CURRENT 0x03#define RH_PORT_RESET 0x04#define RH_PORT_POWER 0x08#define RH_PORT_LOW_SPEED 0x09#define RH_C_PORT_CONNECTION 0x10#define RH_C_PORT_ENABLE 0x11#define RH_C_PORT_SUSPEND 0x12#define RH_C_PORT_OVER_CURRENT 0x13#define RH_C_PORT_RESET 0x14 /* Hub features */#define RH_C_HUB_LOCAL_POWER 0x00#define RH_C_HUB_OVER_CURRENT 0x01#define RH_DEVICE_REMOTE_WAKEUP 0x00#define RH_ENDPOINT_STALL 0x01#endif/*-------------------------------------------------------------------------*//* struct for each HC * */#define MAX_TRANS 32typedef struct td { urb_t * urb; __u16 len; __u16 iso_index;} td_t;typedef struct td_array { int len; td_t td [MAX_TRANS];} td_array_t;typedef struct hci { struct virt_root_hub rh; /* roothub */ wait_queue_head_t waitq; /* deletion of URBs and devices needs a waitqueue */ int active; /* HC is operating */ struct list_head ctrl_list; /* set of ctrl endpoints */ struct list_head bulk_list; /* set of bulk endpoints */ struct list_head iso_list; /* set of isoc endpoints */ struct list_head intr_list; /* ordered (tree) set of int endpoints */ struct list_head del_list; /* set of entpoints to be deleted */ td_array_t * td_array; td_array_t a_td_array; td_array_t i_td_array [2]; struct list_head hci_hcd_list; /* list of all hci_hcd */ struct usb_bus * bus; /* our bus */// int trans; /* number of transactions pending */ int active_urbs; int frame_number; /* frame number */ hcipriv_t hp; /* individual part of hc type */} hci_t;/*-------------------------------------------------------------------------*//* condition (error) CC codes and mapping OHCI like * */ #define TD_CC_NOERROR 0x00#define TD_CC_CRC 0x01#define TD_CC_BITSTUFFING 0x02#define TD_CC_DATATOGGLEM 0x03#define TD_CC_STALL 0x04#define TD_DEVNOTRESP 0x05#define TD_PIDCHECKFAIL 0x06#define TD_UNEXPECTEDPID 0x07#define TD_DATAOVERRUN 0x08#define TD_DATAUNDERRUN 0x09#define TD_BUFFEROVERRUN 0x0C#define TD_BUFFERUNDERRUN 0x0D#define TD_NOTACCESSED 0x0Fstatic int cc_to_error[16] = { /* mapping of the OHCI CC status to error codes */ /* No Error */ USB_ST_NOERROR, /* CRC Error */ USB_ST_CRC, /* Bit Stuff */ USB_ST_BITSTUFF, /* Data Togg */ USB_ST_CRC, /* Stall */ USB_ST_STALL, /* DevNotResp */ USB_ST_NORESPONSE, /* PIDCheck */ USB_ST_BITSTUFF, /* UnExpPID */ USB_ST_BITSTUFF, /* DataOver */ USB_ST_DATAOVERRUN, /* DataUnder */ USB_ST_DATAUNDERRUN, /* reservd */ USB_ST_NORESPONSE, /* reservd */ USB_ST_NORESPONSE, /* BufferOver */ USB_ST_BUFFEROVERRUN, /* BuffUnder */ USB_ST_BUFFERUNDERRUN, /* Not Access */ USB_ST_NORESPONSE, /* Not Access */ USB_ST_NORESPONSE };/*-------------------------------------------------------------------------*//* PID - packet ID * */ #define PID_SETUP 0#define PID_OUT 1#define PID_IN 2/*-------------------------------------------------------------------------*//* misc * */#define min(a,b) (((a)<(b))?(a):(b)) // #define GET_FRAME_NUMBER(hci) (hci)->frame_number/*-------------------------------------------------------------------------*//* functions * */ /* urb interface functions */static int hci_get_current_frame_number (struct usb_device *usb_dev);static int hci_unlink_urb (urb_t * urb);static int qu_queue_urb (hci_t * hci, urb_t * urb);/* root hub */static int rh_init_int_timer (urb_t * urb);static int rh_submit_urb (urb_t *urb);static int rh_unlink_urb (urb_t *urb);/* schedule functions */static int sh_add_packet (hci_t * hci, urb_t * urb);/* hc specific functions */static inline void hc_flush_data_cache (hci_t * hci, void * data, int len);static inline int hc_parse_trans (hci_t * hci, int * actbytes, void * data, int * cc, int * toggle, int length);// static inline void start_trans (hci_t * hci);static inline int hc_add_trans (hci_t * hci, int len, void * data, int toggle, int maxps, int slow, int endpoint, int address, int pid, int format);static void hc_start_int (hci_t * hci);static void hc_stop_int (hci_t * hci);/* debug| print the main components of an URB * small: 0) header + data packets 1) just header */static void urb_print (urb_t * urb, char * str, int small){ unsigned int pipe= urb->pipe; int i, len; if (!urb->dev || !urb->dev->bus) { dbg("%s URB: no dev", str); return; } printk("%s URB:[%4x] dev:%2d,ep:%2d-%c,type:%s,flags:%4x,len:%d/%d,stat:%d(%x)\n", str, hci_get_current_frame_number (urb->dev), usb_pipedevice (pipe), usb_pipeendpoint (pipe), usb_pipeout (pipe)? 'O': 'I', usb_pipetype (pipe) < 2? (usb_pipeint (pipe)? "INTR": "ISOC"): (usb_pipecontrol (pipe)? "CTRL": "BULK"), urb->transfer_flags, urb->actual_length, urb->transfer_buffer_length, urb->status, urb->status); if (!small) { if (usb_pipecontrol (pipe)) { printk ( __FILE__ ": cmd(8):"); for (i = 0; i < 8 ; i++) printk (" %02x", ((__u8 *) urb->setup_packet) [i]); printk ("\n"); } if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) { printk ( __FILE__ ": data(%d/%d):", urb->actual_length, urb->transfer_buffer_length); len = usb_pipeout (pipe)? urb->transfer_buffer_length: urb->actual_length; for (i = 0; i < 2096 && i < len; i++) printk (" %02x", ((__u8 *) urb->transfer_buffer) [i]); printk ("%s stat:%d\n", i < len? "...": "", urb->status); } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -