uhci.h
上传用户:poi891205
上传日期:2013-07-15
资源大小:9745k
文件大小:14k
源码类别:

DVD

开发平台:

C/C++

  1. #ifndef _UHCI_H_
  2. #define _UHCI_H_
  3. #include "types.h"
  4. /*
  5.  * Universal Host Controller Interface data structures and defines.
  6.  *
  7.  * Created by Hou-Yi Wu 11/20/2003
  8.  */
  9. #if  defined(SUPPORT_USB)&&defined(HOST_UHCI) 
  10. //--------------------------------------------------------------------------------------
  11. // New TD/QH-structure
  12. //-------------------------------------------------------------------------------------- 
  13. // Here TD_TYPE = 0, QH_TYPE = 1;   
  14. typedef enum {
  15. TD_TYPE, QH_TYPE
  16. } uhci_desc_type;
  17. /*
  18.  * This uhci_qh structure must be aligned by 16 bytes becuase the last 4 bits of each link pointer is not used.
  19.  */
  20. typedef struct {
  21. /* Hardware fields */
  22. UINT32 nextQHLinkPointer; // Next queue header link pointer.
  23. UINT32 elementLinkPointer; // Element link pointer.
  24. UINT32 dumy1; // This dumy is used for memory aligned. Why? In UHCI hardware the
  25. UINT32 dumy2; // address of QH is available for its left 28 bits. That means the right
  26. // 4 bit of data is useless for it address. But These right most 4 bits
  27. // can point to 16 bytes of data, but each QH has only 8 bytes of data
  28. // In order to align the memory, we add two 4bytes of data into QH structure
  29. // so that each time we increment the address of qh by 1, it will increment 16 bytes.
  30. }uhci_qh, *puhci_qh;//__attribute__((aligned(16)));
  31. typedef struct {
  32. UINT32 linkPointer;
  33. UINT32 controlStatus;
  34. UINT32 token;
  35. UINT32 buffer;
  36. } uhci_td, *puhci_td;
  37. /*
  38. typedef struct {
  39. union {
  40. puhci_td pTD;
  41. puhci_qh pQH;
  42. }hw;
  43. } uhci_qh_to_td_chain, *puhci_qh_to_td_chain;
  44. */
  45. typedef struct {
  46. uhci_qh *control_chain;
  47. uhci_qh *bulk_chain;
  48. // UINT32 *lastCtrTDAddr;
  49. // UINT32 *lastBlkTDAddr;
  50. // UINT32 *frameList;
  51. // uhci_qh control_chain;
  52. // uhci_qh bulk_chain;
  53. UINT32 lastCtrTDAddr;
  54. UINT32 lastBlkTDAddr;
  55. UINT32 frameList;
  56. } uhci_qh_list, *puhci_qh_list;
  57. //-------------------------------------------------------------------------------------------------
  58. //  IO_SPACE command registers 
  59. //-------------------------------------------------------------------------------------------------
  60. #define CLEAN 0x0000  // Used as clean variable to clean register.
  61. /* (00h) USBCMD*/
  62. #define USBCMD 0  /* The start address of USBCMD is 0 with size of 2 bytes.*/
  63. #define USBCMD_RS 0x0001  /* Run/Stop: 1 = Run. 0 = Stop.*/
  64. #define USBCMD_HCRESET 0x0002  /* Host Contrl Reset */
  65. #define USBCMD_GRESET 0x0004  /* 0 = This bit is reset by the software after a minimum of 10ms has elapsed.
  66.     1 = Global reset*/
  67. #define USBCMD_EGSM 0x0008  /* Enter Global Suspend Mode: 0 = Software resets this bit to 0 to come out of Global Suspend mode.
  68.     1 = Host Controller enters the Global Suspend mode. No USB transaction occur during this times. */       
  69. #define USBCMD_FGR 0x0010  /* Force Global Resume:
  70.     0 = Software resets this bit to 0 after 20ms has elapsed to stop sending the Global resume signal.
  71.     1 = Host Controller sends the Global Resume signal on the USB and set this bit to 1 when a resume event is detected
  72.         while in global suspend mode. */
  73. #define USBCMD_CF 0x0040  /* Configure Flag: This bit has no effect on the hardware. It is provided only as a semaphore service for software.
  74.        0 = Indicates that software has not comleted host controller configuration.
  75.        1 = HCD software sets this bit as the last action in its process of configuring the Host Contrller. */
  76. #define USBCMD_MAXP_64 0x0080  /* MAX PACKET:[7,6]: 01 = 64 bytes. */                    
  77. #define USBCMD_MAXP_32 0x0000  /* MAX PACKET:[7,6]: 00 = 32 bytes. */
  78. /* (02h) USBSTS */
  79. #define USBSTS 2
  80. #define USBSTS_INT 0x0001  /* 0 = Software resets this bit to 0 by writing a 1 to the bit position. 
  81.    1 = The Host Controller sets this bit when the cause of an interrupt is a completion */
  82. #define USBSTS_ERRINT 0x0002  /* 0 = Software resets this bit to 0 by writing a 1 to the bit position.
  83.    1 = Completion of a USB transaction resulted in an error condition. */
  84. #define USBSTS_HCHalted 0x0020  /* 0 = Software resets this bit to 0 by writing a 1 to the bit positiion.
  85.            1 = The Host Controller has stopped executing as a result of the Run/Stop bit being set to 0 */
  86. /* (04h) USBINTR */
  87. #define USBINTR 4
  88. #define USBINTR_IOC 0x0004  /* Interrupt on Complete (IOC) Enable:
  89.    0 = Disabled. 1 = Enabled. */                    
  90. #define USBINTR_SPINTR 0X0008  /* Short Packet Interrupt Enable:
  91.    0 = Disabled. 1 = Enabled. */
  92. /* (08h) USBFRNUM */
  93. #define USBFRNUM 8
  94. //#define USBFRNUM_FLINDEX
  95. /* (0Ah) USBFLBASEADDR */
  96. #define USBFLBASEADDR  10
  97. /* (10h) portsc */
  98. #define USBPORTSC 16
  99. #define USBPORTSC_CCS 0x0001 /* Current Connect Status: This value reflects the current state of the port.
  100.   0 = No device is present. 1 = Device is present on port. */
  101. #define USBPORTSC_CSC 0x0002 /* Connect Status Change: Indicates that a change has occurred in the port's Current Connect Status (bit0).
  102.   0 =  No change. 1 = Change in Current Connect Status. */
  103. #define USBPORTSC_PORT_EN 0x0004 /* Port Enabled/Disabled: Port can be enabled by host software only. Port can be disabled only by host software or fault condition.
  104.   0 = Disable. 1 = Enabled. */
  105. #define USBPORTSC_PORT_EN_CHAN  0x0008 /* Port Enable/ Disalbe Change:  For root hub, this bit gets set only when a port is disabled due to disconnect on that port.
  106.   0 = No change. Software clears this bit by writing a 1 to the bit location.
  107.   1 = Port enable/disabled status has changed. */
  108. #define USBPORTSC_RSM_DET 0x0040 /* Resume Detect (RSM_SET):
  109.   0 = No resume detected/driven on port.
  110.   1 = Resume detected/driven on port. */
  111. #define USBPORTSC_LS 0x0100 /* Low Speed Device Attached (LS) -- RO. Write have no effect.
  112.   0 = Full speed device is attached.
  113.   1 = Low speed device is attached to this port. */        
  114. #define USBPORTSC_PORT_RESET 0x0200 /* Port Reset:
  115.   0 = Port is not in Reset.
  116.   1 = Port is in Reset. When set, the port is disabled and sends the USB Reset signaling. */            
  117. #define USBPORTSC_SUSP 0x1000    /* Suspend: This bit should not be written to a 1 if global suspend is active */   
  118. #define UHCI_MAXNUM_FRAMES 1024      // There are 1024 frame pointer in UHCI frame list table.
  119. //-------------------------------------------------------------------------------------------------
  120. // For TD structure mask:
  121. //-------------------------------------------------------------------------------------------------
  122. #define TD_LINKPOINTER_MASK 0xFFF0
  123. #define TD_LINKPOINTER_DEPTH_BREADTH_SE 0x04
  124. #define TD_LINKPOINTER_QH_TD_SEL 0x02
  125. #define TD_LINKPOINTER_TERMINATE 0x01
  126. #define TD_CTRL_SPD (1<<29) // SHORT PACKET DETECT
  127. #define TD_CTRL_C_ERR (3<<27) // ERROR COUNTER BITS
  128. #define TD_CTRL_LS (1<<26) // LOW SPEED DEVICE
  129. #define TD_CTRL_ISO (1<<25) // ISOCHRONOUS SELECT
  130. #define TD_CTRL_IOC (1<<24) // INTERRUPT ON COMPLETE
  131. #define TD_CTRL_STATUS_ACTIVE    (1<<23) // ACTIVE BIT IN STATUS
  132. #define TD_CTRL_STATUS_STALLED   (1<<22) // STALL BIT IN STATUS
  133. #define TD_CTRL_STATUS_BUFFERR   (1<<21) // DATA BUFFER ERROR BIT IN STATUS
  134. #define TD_CTRL_STATUS_BABBLE    (1<<20) // BABBLE DETECTED BIT IN STATUS
  135. #define TD_CTRL_STATUS_NAK (1<<19) // NAK RECEIVED BIT IN STATUS
  136. #define TD_CTRL_STATUS_CRCTIMEOUTERR    (1<<18) // CRC/TIME OUT ERROR
  137. #define TD_CTRL_STATUS_BITSTUFFERR (1<<17) // BITSTUFF ERROR 
  138. #define TD_CTRL_STATUS_ACTLEN  0x7FF // ACTUAL LENGTH
  139. #define TD_CTRL_ANY_ERROR (TD_CTRL_STATUS_STALLED | TD_CTRL_STATUS_DBUFFERR | TD_CTRL_STATUS_BABBLE | 
  140.  TD_CTRL_STATUS_CRCTIMEOUTERR | TD_CTRL_STATUS_BITSTUFFERR)
  141. #define TD_TOKEN_MAXLEN 0x7FF // Maximum Length
  142. #define TD_TOKEN_DATA_TOGGLE (1<<19) // Data toggle
  143. #define TD_TOKEN_ENDPOINT (0x0F<<15) // Endpoint
  144. #define TD_TOKEN_DEVICE_ADDRESS (0x7F<<8) // Device Address
  145. #define TD_TOKEN_PID 0xFF // PID
  146. //-------------------------------------------------------------------------------------------------
  147. //  Queue Header Mask
  148. //-------------------------------------------------------------------------------------------------
  149. #define QH_LINK_POINT 0xFFF0 // Queue Header link pointer
  150. #define QH_LINK_POINT_QH_TD_SEL (1<<1) // QH and TD select in Queue Header link pointer
  151. #define QH_LINK_POINT_TERMINATE 0x01 // Terminate.
  152. #define QH_ELEMENT_POINT 0XFFF0 // QUEUE ELEMENT LINK PONITER.
  153. #define QH_ELEMENT_POINT_QH_TD_SEL (1<<1) // QH AND TD SELECTION IN QUEUE ELEMENT LINK POINTER.
  154. #define QH_ELEMENT_POINT_TERMINATE 0x01 // Terminate.
  155. //-------------------------------------------------------------------------------------------------
  156. // DEFINED ERROR MESSAGE
  157. //-------------------------------------------------------------------------------------------------
  158. #define SUCCESS 1
  159. #define INSERT_TD_FAIL 2000
  160. #define UNAVAILABLE_TD_TYPE  2001
  161. #define USB_STALL_ERR 1000
  162. #define USB_PLUG_OUT_ERROR      0xFF
  163. //-------------------------------------------------------------------------------------------------
  164. // Memory space define
  165. //-------------------------------------------------------------------------------------------------
  166. //#define USB_FRAME_LIST_BUF_ADDR 0x80800000 // Start address for frame list table in sdram.
  167. //#define USB_FRAME_LIST_BUF_ADDR_PHY 0x00800000  // Physical address
  168. #define USB_FRAME_LIST_BUF_ADDR                 (SDRAM_BASE_CACHED + USB_YA*1024)  //0x802ae000 - 0x802aefff
  169. #define USB_FRAME_LIST_BUF_ADDR_PHY             (USB_YA*1024)
  170. #define USB_FRAME_LIST_BUF_SIZE 0x00001000  // 4k
  171. #define USB_TD_BUF_START_ADDR (USB_FRAME_LIST_BUF_ADDR + USB_FRAME_LIST_BUF_SIZE)     // Start address in sdram where TDs are located. 0x802af000 - 0x802af7ff
  172. // 0x80801000
  173. #define USB_TD_BUF_START_ADDR_PHY (USB_FRAME_LIST_BUF_ADDR_PHY + USB_FRAME_LIST_BUF_SIZE) // Start address in sdram where TDs are located. 
  174. // 0x00801000
  175. #define USB_TD_BUF_SIZE 0x00000900 // 2k+256 byte //wthsin,20040528
  176. #define USB_TD_BUF_END_ADDR (USB_TD_BUF_START_ADDR +  USB_TD_BUF_SIZE - 1) // End address in sdram where TDs are located. 
  177. // 0x808017ff 
  178. #define USB_QH_BUF_START_ADDR (USB_TD_BUF_START_ADDR + USB_TD_BUF_SIZE) // Start address in sdram where qh are located. 0xa02af800 - 0x802a84f
  179. // 0x80801800
  180. #define USB_QH_BUF_START_ADDR_PHY (USB_TD_BUF_START_ADDR_PHY + USB_TD_BUF_SIZE) // Physical start address in sdram where qh are located.
  181. // 0x00801800
  182. #define USB_QH_BUF_SIZE 0x00000050 // 80 bytes.
  183. #define USB_SCSI_CMD_BUF_POINTER (USB_QH_BUF_START_ADDR + USB_QH_BUF_SIZE) 
  184. //0x80801850
  185. #define USB_SCSI_CMD_BUF_POINTER_PHY (USB_QH_BUF_START_ADR_PHY + USB_QH_BUF_SIZE)
  186. //0x00801850
  187. #define USB_SCSI_CMD_BUF_SIZE 0x00000020
  188. #define USB_CSW_BUF_POINTER (USB_SCSI_CMD_BUF_POINTER + USB_SCSI_CMD_BUF_SIZE)
  189. #define USB_CSW_BUF_POINTER_PHY     (USB_SCSI_CMD_BUF_POINTER_PHY + USB_SCSI_CMD_BUF_SIZE)
  190. #define USB_CSW_BUF_SIZE 0X00000010 
  191. //-------------------------------------------------------------------------------------------------
  192. // Global variables declaration
  193. //-------------------------------------------------------------------------------------------------
  194. #define CONTROL_TD 100 // This kind of TD will be inserted under control QH.
  195. #define BULK_TD 101 // This kind of TD will be inserted under bulk QH.
  196. #define PID_SETUP 0x0d // Setup token: 1101b.
  197. #define PID_OUT 0x01 // Out token:0001b.
  198. #define PID_IN 0x09 // IN token:1001b.
  199. // Create QH list and assigne physical address 0x00500000 to it.
  200. extern puhci_qh_list puhciQHList; // control_QH-->bulk_QH list
  201. extern UINT32 *curTDFreeBufAddr; 
  202. extern BYTE    *curFreeBufPointer;
  203. extern UINT32  ACK;
  204. extern UINT32   BulkInEpAddr;   //bulk in endpoint address
  205. extern UINT32   BulkInEpMaxP;   //bulk in endpoint maxpackage
  206. extern UINT32   BulkOutEpAddr;
  207. extern UINT32   BulkOutEpMaxP;
  208. extern UINT32   BulkInToggle;
  209. extern UINT32   BulkOutToggle;
  210.  
  211. //-------------------------------------------------------------------------------------------------
  212. //  SDRAM MEMORY MAP
  213. //-------------------------------------------------------------------------------------------------
  214. //UINT32 *frameListTablePhy = 0x00400000; // physical base address for frame list table.
  215. //UINT32 *qHtDdAtaPhy       = 0x00500000; // physical base address for QH, TD, Data structure.
  216. //extern UINT32 *UHCI_IO_BASE;
  217. //extern UINT32 *UHCI_CFG_BASE;
  218. #define UHCI_IO_BASE_VIR 0xbc020000;
  219. #define UHCI_CFG_BASE_VIR   0xbc030000;
  220. #define UHCI_IO_BASE_PHY 0x1c020000;
  221. #define UHCI_CFG_BASE_PHY   0x1c030000;
  222. //-------------------------------------------------------------------------------------------------
  223. // Local function declaration
  224. //-------------------------------------------------------------------------------------------------
  225. UINT32 uhci_bulkXfer (BYTE usbaddr, BYTE endpoint, BYTE pid, BYTE sectorNum, BYTE *CBWBuffer, BYTE *InOutBuffer, BYTE *CSWBuffer);
  226. UINT32  usbXfer (BYTE usbaddr, BYTE endpoint, BYTE pid, BYTE iso, BYTE payload, WORD wLen, BYTE *buffer);
  227. void  uhci_cleanSdramUnit4Bytes (UINT32 *startAddr, UINT32 bufferSize, UINT32 defaultValue);
  228. UINT32  uhci_QHInit();
  229. void  uhci_HardwareInit();
  230. UINT32  uhci_memAllocForBufPointer(UINT32 bufferSize);
  231. UINT32  uhci_memAllocForTD ();
  232. puhci_td  uhci_createTD (UINT32 tdTYPE, UINT32 maxLen, BYTE toggleBit, BYTE endPoint, BYTE deviceAddr, BYTE pid);//, UINT32 *ErrMsg)
  233. UINT32  uhci_insertTD (unsigned char TDTYPE, uhci_td *pTD);
  234. BYTE  uhci_getNewPidWithCheckSum (BYTE pid);
  235. void  uhci_memoryCopy (BYTE *bufferAddr, BYTE* sourceBufAddr, WORD wLen);
  236. void  uhci_FrameListInit();
  237. void  uhci_killTD(BYTE tdType, UINT32 tdNum, UINT32 bufferPointerSize);
  238. UINT32  uhci_slaveDetect(void);
  239. UINT32          uhci_PlugInOutDetect(void);
  240. extern  void uhci_flush_TD_BUFF();
  241. extern  void uhci_reset();
  242. void uhci_ErrorProcess(void);
  243. #endif
  244.  
  245. extern void  uhci_USBISR (void);
  246.  
  247. #endif