lh7a40x_udc.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. /*
  2. * linux/drivers/usb/gadget/lh7a40x_udc.h
  3. * Sharp LH7A40x on-chip full speed USB device controllers
  4. *
  5. * Copyright (C) 2004 Mikko Lahteenmaki, Nordic ID
  6. * Copyright (C) 2004 Bo Henriksen, Nordic ID
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. *
  22. */
  23. #ifndef __LH7A40X_H_
  24. #define __LH7A40X_H_
  25. #include <linux/config.h>
  26. #include <linux/module.h>
  27. #include <linux/kernel.h>
  28. #include <linux/ioport.h>
  29. #include <linux/types.h>
  30. #include <linux/version.h>
  31. #include <linux/errno.h>
  32. #include <linux/delay.h>
  33. #include <linux/sched.h>
  34. #include <linux/slab.h>
  35. #include <linux/init.h>
  36. #include <linux/timer.h>
  37. #include <linux/list.h>
  38. #include <linux/interrupt.h>
  39. #include <linux/proc_fs.h>
  40. #include <linux/mm.h>
  41. #include <linux/device.h>
  42. #include <linux/dma-mapping.h>
  43. #include <asm/byteorder.h>
  44. #include <asm/dma.h>
  45. #include <asm/io.h>
  46. #include <asm/irq.h>
  47. #include <asm/system.h>
  48. #include <asm/unaligned.h>
  49. #include <asm/hardware.h>
  50. #include <linux/usb_ch9.h>
  51. #include <linux/usb_gadget.h>
  52. /*
  53. * Memory map
  54. */
  55. #define USB_FA 0x80000200 // function address register
  56. #define USB_PM 0x80000204 // power management register
  57. #define USB_IN_INT 0x80000208 // IN interrupt register bank (EP0-EP3)
  58. #define USB_OUT_INT 0x80000210 // OUT interrupt register bank (EP2)
  59. #define USB_INT 0x80000218 // interrupt register bank
  60. #define USB_IN_INT_EN 0x8000021C // IN interrupt enable register bank
  61. #define USB_OUT_INT_EN 0x80000224 // OUT interrupt enable register bank
  62. #define USB_INT_EN 0x8000022C // USB interrupt enable register bank
  63. #define USB_FRM_NUM1 0x80000230 // Frame number1 register
  64. #define USB_FRM_NUM2 0x80000234 // Frame number2 register
  65. #define USB_INDEX 0x80000238 // index register
  66. #define USB_IN_MAXP 0x80000240 // IN MAXP register
  67. #define USB_IN_CSR1 0x80000244 // IN CSR1 register/EP0 CSR register
  68. #define USB_EP0_CSR 0x80000244 // IN CSR1 register/EP0 CSR register
  69. #define USB_IN_CSR2 0x80000248 // IN CSR2 register
  70. #define USB_OUT_MAXP 0x8000024C // OUT MAXP register
  71. #define USB_OUT_CSR1 0x80000250 // OUT CSR1 register
  72. #define USB_OUT_CSR2 0x80000254 // OUT CSR2 register
  73. #define USB_OUT_FIFO_WC1 0x80000258 // OUT FIFO write count1 register
  74. #define USB_OUT_FIFO_WC2 0x8000025C // OUT FIFO write count2 register
  75. #define USB_RESET 0x8000044C // USB reset register
  76. #define USB_EP0_FIFO 0x80000280
  77. #define USB_EP1_FIFO 0x80000284
  78. #define USB_EP2_FIFO 0x80000288
  79. #define USB_EP3_FIFO 0x8000028c
  80. /*
  81. * USB reset register
  82. */
  83. #define USB_RESET_APB (1<<1) //resets USB APB control side WRITE
  84. #define USB_RESET_IO (1<<0) //resets USB IO side WRITE
  85. /*
  86. * USB function address register
  87. */
  88. #define USB_FA_ADDR_UPDATE (1<<7)
  89. #define USB_FA_FUNCTION_ADDR (0x7F)
  90. /*
  91. * Power Management register
  92. */
  93. #define PM_USB_DCP (1<<5)
  94. #define PM_USB_ENABLE (1<<4)
  95. #define PM_USB_RESET (1<<3)
  96. #define PM_UC_RESUME (1<<2)
  97. #define PM_SUSPEND_MODE (1<<1)
  98. #define PM_ENABLE_SUSPEND (1<<0)
  99. /*
  100. * IN interrupt register
  101. */
  102. #define USB_IN_INT_EP3 (1<<3)
  103. #define USB_IN_INT_EP1 (1<<1)
  104. #define USB_IN_INT_EP0 (1<<0)
  105. /*
  106. * OUT interrupt register
  107. */
  108. #define USB_OUT_INT_EP2 (1<<2)
  109. /*
  110. * USB interrupt register
  111. */
  112. #define USB_INT_RESET_INT (1<<2)
  113. #define USB_INT_RESUME_INT (1<<1)
  114. #define USB_INT_SUSPEND_INT (1<<0)
  115. /*
  116. * USB interrupt enable register
  117. */
  118. #define USB_INT_EN_USB_RESET_INTER (1<<2)
  119. #define USB_INT_EN_RESUME_INTER (1<<1)
  120. #define USB_INT_EN_SUSPEND_INTER (1<<0)
  121. /*
  122. * INCSR1 register
  123. */
  124. #define USB_IN_CSR1_CLR_DATA_TOGGLE (1<<6)
  125. #define USB_IN_CSR1_SENT_STALL (1<<5)
  126. #define USB_IN_CSR1_SEND_STALL (1<<4)
  127. #define USB_IN_CSR1_FIFO_FLUSH (1<<3)
  128. #define USB_IN_CSR1_FIFO_NOT_EMPTY (1<<1)
  129. #define USB_IN_CSR1_IN_PKT_RDY (1<<0)
  130. /*
  131. * INCSR2 register
  132. */
  133. #define USB_IN_CSR2_AUTO_SET (1<<7)
  134. #define USB_IN_CSR2_USB_DMA_EN (1<<4)
  135. /*
  136. * OUT CSR1 register
  137. */
  138. #define USB_OUT_CSR1_CLR_DATA_REG (1<<7)
  139. #define USB_OUT_CSR1_SENT_STALL (1<<6)
  140. #define USB_OUT_CSR1_SEND_STALL (1<<5)
  141. #define USB_OUT_CSR1_FIFO_FLUSH (1<<4)
  142. #define USB_OUT_CSR1_FIFO_FULL (1<<1)
  143. #define USB_OUT_CSR1_OUT_PKT_RDY (1<<0)
  144. /*
  145. * OUT CSR2 register
  146. */
  147. #define USB_OUT_CSR2_AUTO_CLR (1<<7)
  148. #define USB_OUT_CSR2_USB_DMA_EN (1<<4)
  149. /*
  150. * EP0 CSR
  151. */
  152. #define EP0_CLR_SETUP_END (1<<7) /* Clear "Setup Ends" Bit (w) */
  153. #define EP0_CLR_OUT (1<<6) /* Clear "Out packet ready" Bit (w) */
  154. #define EP0_SEND_STALL (1<<5) /* Send STALL Handshake (rw) */
  155. #define EP0_SETUP_END (1<<4) /* Setup Ends (r) */
  156. #define EP0_DATA_END (1<<3) /* Data end (rw) */
  157. #define EP0_SENT_STALL (1<<2) /* Sent Stall Handshake (r) */
  158. #define EP0_IN_PKT_RDY (1<<1) /* In packet ready (rw) */
  159. #define EP0_OUT_PKT_RDY (1<<0) /* Out packet ready (r) */
  160. /* general CSR */
  161. #define OUT_PKT_RDY (1<<0)
  162. #define IN_PKT_RDY (1<<0)
  163. /*
  164. * IN/OUT MAXP register
  165. */
  166. #define USB_OUT_MAXP_MAXP (0xF)
  167. #define USB_IN_MAXP_MAXP (0xF)
  168. // Max packet size
  169. //#define EP0_PACKETSIZE 0x10
  170. #define EP0_PACKETSIZE 0x8
  171. #define EP0_MAXPACKETSIZE 0x10
  172. #define UDC_MAX_ENDPOINTS 4
  173. #define WAIT_FOR_SETUP 0
  174. #define DATA_STATE_XMIT 1
  175. #define DATA_STATE_NEED_ZLP 2
  176. #define WAIT_FOR_OUT_STATUS 3
  177. #define DATA_STATE_RECV 4
  178. /* ********************************************************************************************* */
  179. /* IO
  180. */
  181. typedef enum ep_type {
  182. ep_control, ep_bulk_in, ep_bulk_out, ep_interrupt
  183. } ep_type_t;
  184. struct lh7a40x_ep {
  185. struct usb_ep ep;
  186. struct lh7a40x_udc *dev;
  187. const struct usb_endpoint_descriptor *desc;
  188. struct list_head queue;
  189. unsigned long pio_irqs;
  190. u8 stopped;
  191. u8 bEndpointAddress;
  192. u8 bmAttributes;
  193. ep_type_t ep_type;
  194. u32 fifo;
  195. u32 csr1;
  196. u32 csr2;
  197. };
  198. struct lh7a40x_request {
  199. struct usb_request req;
  200. struct list_head queue;
  201. };
  202. struct lh7a40x_udc {
  203. struct usb_gadget gadget;
  204. struct usb_gadget_driver *driver;
  205. struct device *dev;
  206. spinlock_t lock;
  207. int ep0state;
  208. struct lh7a40x_ep ep[UDC_MAX_ENDPOINTS];
  209. unsigned char usb_address;
  210. unsigned req_pending:1, req_std:1, req_config:1;
  211. };
  212. extern struct lh7a40x_udc *the_controller;
  213. #define ep_is_in(EP) (((EP)->bEndpointAddress&USB_DIR_IN)==USB_DIR_IN)
  214. #define ep_index(EP) ((EP)->bEndpointAddress&0xF)
  215. #define ep_maxpacket(EP) ((EP)->ep.maxpacket)
  216. #endif