tusb6010.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. /*
  2. * Texas Instruments TUSB6010 emulation.
  3. * Based on reverse-engineering of a linux driver.
  4. *
  5. * Copyright (C) 2008 Nokia Corporation
  6. * Written by Andrzej Zaborowski <andrew@openedhand.com>
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License as
  10. * published by the Free Software Foundation; either version 2 or
  11. * (at your option) version 3 of the License.
  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 along
  19. * with this program; if not, write to the Free Software Foundation, Inc.,
  20. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  21. */
  22. #include "qemu-common.h"
  23. #include "qemu-timer.h"
  24. #include "usb.h"
  25. #include "omap.h"
  26. #include "irq.h"
  27. #include "devices.h"
  28. struct tusb_s {
  29. int iomemtype[2];
  30. qemu_irq irq;
  31. struct musb_s *musb;
  32. QEMUTimer *otg_timer;
  33. QEMUTimer *pwr_timer;
  34. int power;
  35. uint32_t scratch;
  36. uint16_t test_reset;
  37. uint32_t prcm_config;
  38. uint32_t prcm_mngmt;
  39. uint16_t otg_status;
  40. uint32_t dev_config;
  41. int host_mode;
  42. uint32_t intr;
  43. uint32_t intr_ok;
  44. uint32_t mask;
  45. uint32_t usbip_intr;
  46. uint32_t usbip_mask;
  47. uint32_t gpio_intr;
  48. uint32_t gpio_mask;
  49. uint32_t gpio_config;
  50. uint32_t dma_intr;
  51. uint32_t dma_mask;
  52. uint32_t dma_map;
  53. uint32_t dma_config;
  54. uint32_t ep0_config;
  55. uint32_t rx_config[15];
  56. uint32_t tx_config[15];
  57. uint32_t wkup_mask;
  58. uint32_t pullup[2];
  59. uint32_t control_config;
  60. uint32_t otg_timer_val;
  61. };
  62. #define TUSB_DEVCLOCK 60000000 /* 60 MHz */
  63. #define TUSB_VLYNQ_CTRL 0x004
  64. /* Mentor Graphics OTG core registers. */
  65. #define TUSB_BASE_OFFSET 0x400
  66. /* FIFO registers, 32-bit. */
  67. #define TUSB_FIFO_BASE 0x600
  68. /* Device System & Control registers, 32-bit. */
  69. #define TUSB_SYS_REG_BASE 0x800
  70. #define TUSB_DEV_CONF (TUSB_SYS_REG_BASE + 0x000)
  71. #define TUSB_DEV_CONF_USB_HOST_MODE (1 << 16)
  72. #define TUSB_DEV_CONF_PROD_TEST_MODE (1 << 15)
  73. #define TUSB_DEV_CONF_SOFT_ID (1 << 1)
  74. #define TUSB_DEV_CONF_ID_SEL (1 << 0)
  75. #define TUSB_PHY_OTG_CTRL_ENABLE (TUSB_SYS_REG_BASE + 0x004)
  76. #define TUSB_PHY_OTG_CTRL (TUSB_SYS_REG_BASE + 0x008)
  77. #define TUSB_PHY_OTG_CTRL_WRPROTECT (0xa5 << 24)
  78. #define TUSB_PHY_OTG_CTRL_O_ID_PULLUP (1 << 23)
  79. #define TUSB_PHY_OTG_CTRL_O_VBUS_DET_EN (1 << 19)
  80. #define TUSB_PHY_OTG_CTRL_O_SESS_END_EN (1 << 18)
  81. #define TUSB_PHY_OTG_CTRL_TESTM2 (1 << 17)
  82. #define TUSB_PHY_OTG_CTRL_TESTM1 (1 << 16)
  83. #define TUSB_PHY_OTG_CTRL_TESTM0 (1 << 15)
  84. #define TUSB_PHY_OTG_CTRL_TX_DATA2 (1 << 14)
  85. #define TUSB_PHY_OTG_CTRL_TX_GZ2 (1 << 13)
  86. #define TUSB_PHY_OTG_CTRL_TX_ENABLE2 (1 << 12)
  87. #define TUSB_PHY_OTG_CTRL_DM_PULLDOWN (1 << 11)
  88. #define TUSB_PHY_OTG_CTRL_DP_PULLDOWN (1 << 10)
  89. #define TUSB_PHY_OTG_CTRL_OSC_EN (1 << 9)
  90. #define TUSB_PHY_OTG_CTRL_PHYREF_CLK(v) (((v) & 3) << 7)
  91. #define TUSB_PHY_OTG_CTRL_PD (1 << 6)
  92. #define TUSB_PHY_OTG_CTRL_PLL_ON (1 << 5)
  93. #define TUSB_PHY_OTG_CTRL_EXT_RPU (1 << 4)
  94. #define TUSB_PHY_OTG_CTRL_PWR_GOOD (1 << 3)
  95. #define TUSB_PHY_OTG_CTRL_RESET (1 << 2)
  96. #define TUSB_PHY_OTG_CTRL_SUSPENDM (1 << 1)
  97. #define TUSB_PHY_OTG_CTRL_CLK_MODE (1 << 0)
  98. /* OTG status register */
  99. #define TUSB_DEV_OTG_STAT (TUSB_SYS_REG_BASE + 0x00c)
  100. #define TUSB_DEV_OTG_STAT_PWR_CLK_GOOD (1 << 8)
  101. #define TUSB_DEV_OTG_STAT_SESS_END (1 << 7)
  102. #define TUSB_DEV_OTG_STAT_SESS_VALID (1 << 6)
  103. #define TUSB_DEV_OTG_STAT_VBUS_VALID (1 << 5)
  104. #define TUSB_DEV_OTG_STAT_VBUS_SENSE (1 << 4)
  105. #define TUSB_DEV_OTG_STAT_ID_STATUS (1 << 3)
  106. #define TUSB_DEV_OTG_STAT_HOST_DISCON (1 << 2)
  107. #define TUSB_DEV_OTG_STAT_LINE_STATE (3 << 0)
  108. #define TUSB_DEV_OTG_STAT_DP_ENABLE (1 << 1)
  109. #define TUSB_DEV_OTG_STAT_DM_ENABLE (1 << 0)
  110. #define TUSB_DEV_OTG_TIMER (TUSB_SYS_REG_BASE + 0x010)
  111. #define TUSB_DEV_OTG_TIMER_ENABLE (1 << 31)
  112. #define TUSB_DEV_OTG_TIMER_VAL(v) ((v) & 0x07ffffff)
  113. #define TUSB_PRCM_REV (TUSB_SYS_REG_BASE + 0x014)
  114. /* PRCM configuration register */
  115. #define TUSB_PRCM_CONF (TUSB_SYS_REG_BASE + 0x018)
  116. #define TUSB_PRCM_CONF_SFW_CPEN (1 << 24)
  117. #define TUSB_PRCM_CONF_SYS_CLKSEL(v) (((v) & 3) << 16)
  118. /* PRCM management register */
  119. #define TUSB_PRCM_MNGMT (TUSB_SYS_REG_BASE + 0x01c)
  120. #define TUSB_PRCM_MNGMT_SRP_FIX_TMR(v) (((v) & 0xf) << 25)
  121. #define TUSB_PRCM_MNGMT_SRP_FIX_EN (1 << 24)
  122. #define TUSB_PRCM_MNGMT_VBUS_VAL_TMR(v) (((v) & 0xf) << 20)
  123. #define TUSB_PRCM_MNGMT_VBUS_VAL_FLT_EN (1 << 19)
  124. #define TUSB_PRCM_MNGMT_DFT_CLK_DIS (1 << 18)
  125. #define TUSB_PRCM_MNGMT_VLYNQ_CLK_DIS (1 << 17)
  126. #define TUSB_PRCM_MNGMT_OTG_SESS_END_EN (1 << 10)
  127. #define TUSB_PRCM_MNGMT_OTG_VBUS_DET_EN (1 << 9)
  128. #define TUSB_PRCM_MNGMT_OTG_ID_PULLUP (1 << 8)
  129. #define TUSB_PRCM_MNGMT_15_SW_EN (1 << 4)
  130. #define TUSB_PRCM_MNGMT_33_SW_EN (1 << 3)
  131. #define TUSB_PRCM_MNGMT_5V_CPEN (1 << 2)
  132. #define TUSB_PRCM_MNGMT_PM_IDLE (1 << 1)
  133. #define TUSB_PRCM_MNGMT_DEV_IDLE (1 << 0)
  134. /* Wake-up source clear and mask registers */
  135. #define TUSB_PRCM_WAKEUP_SOURCE (TUSB_SYS_REG_BASE + 0x020)
  136. #define TUSB_PRCM_WAKEUP_CLEAR (TUSB_SYS_REG_BASE + 0x028)
  137. #define TUSB_PRCM_WAKEUP_MASK (TUSB_SYS_REG_BASE + 0x02c)
  138. #define TUSB_PRCM_WAKEUP_RESERVED_BITS (0xffffe << 13)
  139. #define TUSB_PRCM_WGPIO_7 (1 << 12)
  140. #define TUSB_PRCM_WGPIO_6 (1 << 11)
  141. #define TUSB_PRCM_WGPIO_5 (1 << 10)
  142. #define TUSB_PRCM_WGPIO_4 (1 << 9)
  143. #define TUSB_PRCM_WGPIO_3 (1 << 8)
  144. #define TUSB_PRCM_WGPIO_2 (1 << 7)
  145. #define TUSB_PRCM_WGPIO_1 (1 << 6)
  146. #define TUSB_PRCM_WGPIO_0 (1 << 5)
  147. #define TUSB_PRCM_WHOSTDISCON (1 << 4) /* Host disconnect */
  148. #define TUSB_PRCM_WBUS (1 << 3) /* USB bus resume */
  149. #define TUSB_PRCM_WNORCS (1 << 2) /* NOR chip select */
  150. #define TUSB_PRCM_WVBUS (1 << 1) /* OTG PHY VBUS */
  151. #define TUSB_PRCM_WID (1 << 0) /* OTG PHY ID detect */
  152. #define TUSB_PULLUP_1_CTRL (TUSB_SYS_REG_BASE + 0x030)
  153. #define TUSB_PULLUP_2_CTRL (TUSB_SYS_REG_BASE + 0x034)
  154. #define TUSB_INT_CTRL_REV (TUSB_SYS_REG_BASE + 0x038)
  155. #define TUSB_INT_CTRL_CONF (TUSB_SYS_REG_BASE + 0x03c)
  156. #define TUSB_USBIP_INT_SRC (TUSB_SYS_REG_BASE + 0x040)
  157. #define TUSB_USBIP_INT_SET (TUSB_SYS_REG_BASE + 0x044)
  158. #define TUSB_USBIP_INT_CLEAR (TUSB_SYS_REG_BASE + 0x048)
  159. #define TUSB_USBIP_INT_MASK (TUSB_SYS_REG_BASE + 0x04c)
  160. #define TUSB_DMA_INT_SRC (TUSB_SYS_REG_BASE + 0x050)
  161. #define TUSB_DMA_INT_SET (TUSB_SYS_REG_BASE + 0x054)
  162. #define TUSB_DMA_INT_CLEAR (TUSB_SYS_REG_BASE + 0x058)
  163. #define TUSB_DMA_INT_MASK (TUSB_SYS_REG_BASE + 0x05c)
  164. #define TUSB_GPIO_INT_SRC (TUSB_SYS_REG_BASE + 0x060)
  165. #define TUSB_GPIO_INT_SET (TUSB_SYS_REG_BASE + 0x064)
  166. #define TUSB_GPIO_INT_CLEAR (TUSB_SYS_REG_BASE + 0x068)
  167. #define TUSB_GPIO_INT_MASK (TUSB_SYS_REG_BASE + 0x06c)
  168. /* NOR flash interrupt source registers */
  169. #define TUSB_INT_SRC (TUSB_SYS_REG_BASE + 0x070)
  170. #define TUSB_INT_SRC_SET (TUSB_SYS_REG_BASE + 0x074)
  171. #define TUSB_INT_SRC_CLEAR (TUSB_SYS_REG_BASE + 0x078)
  172. #define TUSB_INT_MASK (TUSB_SYS_REG_BASE + 0x07c)
  173. #define TUSB_INT_SRC_TXRX_DMA_DONE (1 << 24)
  174. #define TUSB_INT_SRC_USB_IP_CORE (1 << 17)
  175. #define TUSB_INT_SRC_OTG_TIMEOUT (1 << 16)
  176. #define TUSB_INT_SRC_VBUS_SENSE_CHNG (1 << 15)
  177. #define TUSB_INT_SRC_ID_STATUS_CHNG (1 << 14)
  178. #define TUSB_INT_SRC_DEV_WAKEUP (1 << 13)
  179. #define TUSB_INT_SRC_DEV_READY (1 << 12)
  180. #define TUSB_INT_SRC_USB_IP_TX (1 << 9)
  181. #define TUSB_INT_SRC_USB_IP_RX (1 << 8)
  182. #define TUSB_INT_SRC_USB_IP_VBUS_ERR (1 << 7)
  183. #define TUSB_INT_SRC_USB_IP_VBUS_REQ (1 << 6)
  184. #define TUSB_INT_SRC_USB_IP_DISCON (1 << 5)
  185. #define TUSB_INT_SRC_USB_IP_CONN (1 << 4)
  186. #define TUSB_INT_SRC_USB_IP_SOF (1 << 3)
  187. #define TUSB_INT_SRC_USB_IP_RST_BABBLE (1 << 2)
  188. #define TUSB_INT_SRC_USB_IP_RESUME (1 << 1)
  189. #define TUSB_INT_SRC_USB_IP_SUSPEND (1 << 0)
  190. #define TUSB_GPIO_REV (TUSB_SYS_REG_BASE + 0x080)
  191. #define TUSB_GPIO_CONF (TUSB_SYS_REG_BASE + 0x084)
  192. #define TUSB_DMA_CTRL_REV (TUSB_SYS_REG_BASE + 0x100)
  193. #define TUSB_DMA_REQ_CONF (TUSB_SYS_REG_BASE + 0x104)
  194. #define TUSB_EP0_CONF (TUSB_SYS_REG_BASE + 0x108)
  195. #define TUSB_EP_IN_SIZE (TUSB_SYS_REG_BASE + 0x10c)
  196. #define TUSB_DMA_EP_MAP (TUSB_SYS_REG_BASE + 0x148)
  197. #define TUSB_EP_OUT_SIZE (TUSB_SYS_REG_BASE + 0x14c)
  198. #define TUSB_EP_MAX_PACKET_SIZE_OFFSET (TUSB_SYS_REG_BASE + 0x188)
  199. #define TUSB_SCRATCH_PAD (TUSB_SYS_REG_BASE + 0x1c4)
  200. #define TUSB_WAIT_COUNT (TUSB_SYS_REG_BASE + 0x1c8)
  201. #define TUSB_PROD_TEST_RESET (TUSB_SYS_REG_BASE + 0x1d8)
  202. #define TUSB_DIDR1_LO (TUSB_SYS_REG_BASE + 0x1f8)
  203. #define TUSB_DIDR1_HI (TUSB_SYS_REG_BASE + 0x1fc)
  204. /* Device System & Control register bitfields */
  205. #define TUSB_INT_CTRL_CONF_INT_RLCYC(v) (((v) & 0x7) << 18)
  206. #define TUSB_INT_CTRL_CONF_INT_POLARITY (1 << 17)
  207. #define TUSB_INT_CTRL_CONF_INT_MODE (1 << 16)
  208. #define TUSB_GPIO_CONF_DMAREQ(v) (((v) & 0x3f) << 24)
  209. #define TUSB_DMA_REQ_CONF_BURST_SIZE(v) (((v) & 3) << 26)
  210. #define TUSB_DMA_REQ_CONF_DMA_RQ_EN(v) (((v) & 0x3f) << 20)
  211. #define TUSB_DMA_REQ_CONF_DMA_RQ_ASR(v) (((v) & 0xf) << 16)
  212. #define TUSB_EP0_CONFIG_SW_EN (1 << 8)
  213. #define TUSB_EP0_CONFIG_DIR_TX (1 << 7)
  214. #define TUSB_EP0_CONFIG_XFR_SIZE(v) ((v) & 0x7f)
  215. #define TUSB_EP_CONFIG_SW_EN (1 << 31)
  216. #define TUSB_EP_CONFIG_XFR_SIZE(v) ((v) & 0x7fffffff)
  217. #define TUSB_PROD_TEST_RESET_VAL 0xa596
  218. int tusb6010_sync_io(struct tusb_s *s)
  219. {
  220. return s->iomemtype[0];
  221. }
  222. int tusb6010_async_io(struct tusb_s *s)
  223. {
  224. return s->iomemtype[1];
  225. }
  226. static void tusb_intr_update(struct tusb_s *s)
  227. {
  228. if (s->control_config & TUSB_INT_CTRL_CONF_INT_POLARITY)
  229. qemu_set_irq(s->irq, s->intr & ~s->mask & s->intr_ok);
  230. else
  231. qemu_set_irq(s->irq, (!(s->intr & ~s->mask)) & s->intr_ok);
  232. }
  233. static void tusb_usbip_intr_update(struct tusb_s *s)
  234. {
  235. /* TX interrupt in the MUSB */
  236. if (s->usbip_intr & 0x0000ffff & ~s->usbip_mask)
  237. s->intr |= TUSB_INT_SRC_USB_IP_TX;
  238. else
  239. s->intr &= ~TUSB_INT_SRC_USB_IP_TX;
  240. /* RX interrupt in the MUSB */
  241. if (s->usbip_intr & 0xffff0000 & ~s->usbip_mask)
  242. s->intr |= TUSB_INT_SRC_USB_IP_RX;
  243. else
  244. s->intr &= ~TUSB_INT_SRC_USB_IP_RX;
  245. /* XXX: What about TUSB_INT_SRC_USB_IP_CORE? */
  246. tusb_intr_update(s);
  247. }
  248. static void tusb_dma_intr_update(struct tusb_s *s)
  249. {
  250. if (s->dma_intr & ~s->dma_mask)
  251. s->intr |= TUSB_INT_SRC_TXRX_DMA_DONE;
  252. else
  253. s->intr &= ~TUSB_INT_SRC_TXRX_DMA_DONE;
  254. tusb_intr_update(s);
  255. }
  256. static void tusb_gpio_intr_update(struct tusb_s *s)
  257. {
  258. /* TODO: How is this signalled? */
  259. }
  260. extern CPUReadMemoryFunc *musb_read[];
  261. extern CPUWriteMemoryFunc *musb_write[];
  262. static uint32_t tusb_async_readb(void *opaque, target_phys_addr_t addr)
  263. {
  264. struct tusb_s *s = (struct tusb_s *) opaque;
  265. switch (addr & 0xfff) {
  266. case TUSB_BASE_OFFSET ... (TUSB_BASE_OFFSET | 0x1ff):
  267. return musb_read[0](s->musb, addr & 0x1ff);
  268. case TUSB_FIFO_BASE ... (TUSB_FIFO_BASE | 0x1ff):
  269. return musb_read[0](s->musb, 0x20 + ((addr >> 3) & 0x3c));
  270. }
  271. printf("%s: unknown register at %03x\n",
  272. __FUNCTION__, (int) (addr & 0xfff));
  273. return 0;
  274. }
  275. static uint32_t tusb_async_readh(void *opaque, target_phys_addr_t addr)
  276. {
  277. struct tusb_s *s = (struct tusb_s *) opaque;
  278. switch (addr & 0xfff) {
  279. case TUSB_BASE_OFFSET ... (TUSB_BASE_OFFSET | 0x1ff):
  280. return musb_read[1](s->musb, addr & 0x1ff);
  281. case TUSB_FIFO_BASE ... (TUSB_FIFO_BASE | 0x1ff):
  282. return musb_read[1](s->musb, 0x20 + ((addr >> 3) & 0x3c));
  283. }
  284. printf("%s: unknown register at %03x\n",
  285. __FUNCTION__, (int) (addr & 0xfff));
  286. return 0;
  287. }
  288. static uint32_t tusb_async_readw(void *opaque, target_phys_addr_t addr)
  289. {
  290. struct tusb_s *s = (struct tusb_s *) opaque;
  291. int offset = addr & 0xfff;
  292. int epnum;
  293. uint32_t ret;
  294. switch (offset) {
  295. case TUSB_DEV_CONF:
  296. return s->dev_config;
  297. case TUSB_BASE_OFFSET ... (TUSB_BASE_OFFSET | 0x1ff):
  298. return musb_read[2](s->musb, offset & 0x1ff);
  299. case TUSB_FIFO_BASE ... (TUSB_FIFO_BASE | 0x1ff):
  300. return musb_read[2](s->musb, 0x20 + ((addr >> 3) & 0x3c));
  301. case TUSB_PHY_OTG_CTRL_ENABLE:
  302. case TUSB_PHY_OTG_CTRL:
  303. return 0x00; /* TODO */
  304. case TUSB_DEV_OTG_STAT:
  305. ret = s->otg_status;
  306. #if 0
  307. if (!(s->prcm_mngmt & TUSB_PRCM_MNGMT_OTG_VBUS_DET_EN))
  308. ret &= ~TUSB_DEV_OTG_STAT_VBUS_VALID;
  309. #endif
  310. return ret;
  311. case TUSB_DEV_OTG_TIMER:
  312. return s->otg_timer_val;
  313. case TUSB_PRCM_REV:
  314. return 0x20;
  315. case TUSB_PRCM_CONF:
  316. return s->prcm_config;
  317. case TUSB_PRCM_MNGMT:
  318. return s->prcm_mngmt;
  319. case TUSB_PRCM_WAKEUP_SOURCE:
  320. case TUSB_PRCM_WAKEUP_CLEAR: /* TODO: What does this one return? */
  321. return 0x00000000;
  322. case TUSB_PRCM_WAKEUP_MASK:
  323. return s->wkup_mask;
  324. case TUSB_PULLUP_1_CTRL:
  325. return s->pullup[0];
  326. case TUSB_PULLUP_2_CTRL:
  327. return s->pullup[1];
  328. case TUSB_INT_CTRL_REV:
  329. return 0x20;
  330. case TUSB_INT_CTRL_CONF:
  331. return s->control_config;
  332. case TUSB_USBIP_INT_SRC:
  333. case TUSB_USBIP_INT_SET: /* TODO: What do these two return? */
  334. case TUSB_USBIP_INT_CLEAR:
  335. return s->usbip_intr;
  336. case TUSB_USBIP_INT_MASK:
  337. return s->usbip_mask;
  338. case TUSB_DMA_INT_SRC:
  339. case TUSB_DMA_INT_SET: /* TODO: What do these two return? */
  340. case TUSB_DMA_INT_CLEAR:
  341. return s->dma_intr;
  342. case TUSB_DMA_INT_MASK:
  343. return s->dma_mask;
  344. case TUSB_GPIO_INT_SRC: /* TODO: What do these two return? */
  345. case TUSB_GPIO_INT_SET:
  346. case TUSB_GPIO_INT_CLEAR:
  347. return s->gpio_intr;
  348. case TUSB_GPIO_INT_MASK:
  349. return s->gpio_mask;
  350. case TUSB_INT_SRC:
  351. case TUSB_INT_SRC_SET: /* TODO: What do these two return? */
  352. case TUSB_INT_SRC_CLEAR:
  353. return s->intr;
  354. case TUSB_INT_MASK:
  355. return s->mask;
  356. case TUSB_GPIO_REV:
  357. return 0x30;
  358. case TUSB_GPIO_CONF:
  359. return s->gpio_config;
  360. case TUSB_DMA_CTRL_REV:
  361. return 0x30;
  362. case TUSB_DMA_REQ_CONF:
  363. return s->dma_config;
  364. case TUSB_EP0_CONF:
  365. return s->ep0_config;
  366. case TUSB_EP_IN_SIZE ... (TUSB_EP_IN_SIZE + 0x3b):
  367. epnum = (offset - TUSB_EP_IN_SIZE) >> 2;
  368. return s->tx_config[epnum];
  369. case TUSB_DMA_EP_MAP:
  370. return s->dma_map;
  371. case TUSB_EP_OUT_SIZE ... (TUSB_EP_OUT_SIZE + 0x3b):
  372. epnum = (offset - TUSB_EP_OUT_SIZE) >> 2;
  373. return s->rx_config[epnum];
  374. case TUSB_EP_MAX_PACKET_SIZE_OFFSET ...
  375. (TUSB_EP_MAX_PACKET_SIZE_OFFSET + 0x3b):
  376. epnum = (offset - TUSB_EP_MAX_PACKET_SIZE_OFFSET) >> 2;
  377. return 0x00000000; /* TODO */
  378. case TUSB_WAIT_COUNT:
  379. return 0x00; /* TODO */
  380. case TUSB_SCRATCH_PAD:
  381. return s->scratch;
  382. case TUSB_PROD_TEST_RESET:
  383. return s->test_reset;
  384. /* DIE IDs */
  385. case TUSB_DIDR1_LO:
  386. return 0xa9453c59;
  387. case TUSB_DIDR1_HI:
  388. return 0x54059adf;
  389. }
  390. printf("%s: unknown register at %03x\n", __FUNCTION__, offset);
  391. return 0;
  392. }
  393. static void tusb_async_writeb(void *opaque, target_phys_addr_t addr,
  394. uint32_t value)
  395. {
  396. struct tusb_s *s = (struct tusb_s *) opaque;
  397. switch (addr & 0xfff) {
  398. case TUSB_BASE_OFFSET ... (TUSB_BASE_OFFSET | 0x1ff):
  399. musb_write[0](s->musb, addr & 0x1ff, value);
  400. break;
  401. case TUSB_FIFO_BASE ... (TUSB_FIFO_BASE | 0x1ff):
  402. musb_write[0](s->musb, 0x20 + ((addr >> 3) & 0x3c), value);
  403. break;
  404. default:
  405. printf("%s: unknown register at %03x\n",
  406. __FUNCTION__, (int) (addr & 0xfff));
  407. return;
  408. }
  409. }
  410. static void tusb_async_writeh(void *opaque, target_phys_addr_t addr,
  411. uint32_t value)
  412. {
  413. struct tusb_s *s = (struct tusb_s *) opaque;
  414. switch (addr & 0xfff) {
  415. case TUSB_BASE_OFFSET ... (TUSB_BASE_OFFSET | 0x1ff):
  416. musb_write[1](s->musb, addr & 0x1ff, value);
  417. break;
  418. case TUSB_FIFO_BASE ... (TUSB_FIFO_BASE | 0x1ff):
  419. musb_write[1](s->musb, 0x20 + ((addr >> 3) & 0x3c), value);
  420. break;
  421. default:
  422. printf("%s: unknown register at %03x\n",
  423. __FUNCTION__, (int) (addr & 0xfff));
  424. return;
  425. }
  426. }
  427. static void tusb_async_writew(void *opaque, target_phys_addr_t addr,
  428. uint32_t value)
  429. {
  430. struct tusb_s *s = (struct tusb_s *) opaque;
  431. int offset = addr & 0xfff;
  432. int epnum;
  433. switch (offset) {
  434. case TUSB_VLYNQ_CTRL:
  435. break;
  436. case TUSB_BASE_OFFSET ... (TUSB_BASE_OFFSET | 0x1ff):
  437. musb_write[2](s->musb, offset & 0x1ff, value);
  438. break;
  439. case TUSB_FIFO_BASE ... (TUSB_FIFO_BASE | 0x1ff):
  440. musb_write[2](s->musb, 0x20 + ((addr >> 3) & 0x3c), value);
  441. break;
  442. case TUSB_DEV_CONF:
  443. s->dev_config = value;
  444. s->host_mode = (value & TUSB_DEV_CONF_USB_HOST_MODE);
  445. if (value & TUSB_DEV_CONF_PROD_TEST_MODE)
  446. cpu_abort(cpu_single_env, "%s: Product Test mode not allowed\n",
  447. __FUNCTION__);
  448. break;
  449. case TUSB_PHY_OTG_CTRL_ENABLE:
  450. case TUSB_PHY_OTG_CTRL:
  451. return; /* TODO */
  452. case TUSB_DEV_OTG_TIMER:
  453. s->otg_timer_val = value;
  454. if (value & TUSB_DEV_OTG_TIMER_ENABLE)
  455. qemu_mod_timer(s->otg_timer, qemu_get_clock(vm_clock) +
  456. muldiv64(TUSB_DEV_OTG_TIMER_VAL(value),
  457. ticks_per_sec, TUSB_DEVCLOCK));
  458. else
  459. qemu_del_timer(s->otg_timer);
  460. break;
  461. case TUSB_PRCM_CONF:
  462. s->prcm_config = value;
  463. break;
  464. case TUSB_PRCM_MNGMT:
  465. s->prcm_mngmt = value;
  466. break;
  467. case TUSB_PRCM_WAKEUP_CLEAR:
  468. break;
  469. case TUSB_PRCM_WAKEUP_MASK:
  470. s->wkup_mask = value;
  471. break;
  472. case TUSB_PULLUP_1_CTRL:
  473. s->pullup[0] = value;
  474. break;
  475. case TUSB_PULLUP_2_CTRL:
  476. s->pullup[1] = value;
  477. break;
  478. case TUSB_INT_CTRL_CONF:
  479. s->control_config = value;
  480. tusb_intr_update(s);
  481. break;
  482. case TUSB_USBIP_INT_SET:
  483. s->usbip_intr |= value;
  484. tusb_usbip_intr_update(s);
  485. break;
  486. case TUSB_USBIP_INT_CLEAR:
  487. s->usbip_intr &= ~value;
  488. tusb_usbip_intr_update(s);
  489. musb_core_intr_clear(s->musb, ~value);
  490. break;
  491. case TUSB_USBIP_INT_MASK:
  492. s->usbip_mask = value;
  493. tusb_usbip_intr_update(s);
  494. break;
  495. case TUSB_DMA_INT_SET:
  496. s->dma_intr |= value;
  497. tusb_dma_intr_update(s);
  498. break;
  499. case TUSB_DMA_INT_CLEAR:
  500. s->dma_intr &= ~value;
  501. tusb_dma_intr_update(s);
  502. break;
  503. case TUSB_DMA_INT_MASK:
  504. s->dma_mask = value;
  505. tusb_dma_intr_update(s);
  506. break;
  507. case TUSB_GPIO_INT_SET:
  508. s->gpio_intr |= value;
  509. tusb_gpio_intr_update(s);
  510. break;
  511. case TUSB_GPIO_INT_CLEAR:
  512. s->gpio_intr &= ~value;
  513. tusb_gpio_intr_update(s);
  514. break;
  515. case TUSB_GPIO_INT_MASK:
  516. s->gpio_mask = value;
  517. tusb_gpio_intr_update(s);
  518. break;
  519. case TUSB_INT_SRC_SET:
  520. s->intr |= value;
  521. tusb_intr_update(s);
  522. break;
  523. case TUSB_INT_SRC_CLEAR:
  524. s->intr &= ~value;
  525. tusb_intr_update(s);
  526. break;
  527. case TUSB_INT_MASK:
  528. s->mask = value;
  529. tusb_intr_update(s);
  530. break;
  531. case TUSB_GPIO_CONF:
  532. s->gpio_config = value;
  533. break;
  534. case TUSB_DMA_REQ_CONF:
  535. s->dma_config = value;
  536. break;
  537. case TUSB_EP0_CONF:
  538. s->ep0_config = value & 0x1ff;
  539. musb_set_size(s->musb, 0, TUSB_EP0_CONFIG_XFR_SIZE(value),
  540. value & TUSB_EP0_CONFIG_DIR_TX);
  541. break;
  542. case TUSB_EP_IN_SIZE ... (TUSB_EP_IN_SIZE + 0x3b):
  543. epnum = (offset - TUSB_EP_IN_SIZE) >> 2;
  544. s->tx_config[epnum] = value;
  545. musb_set_size(s->musb, epnum + 1, TUSB_EP_CONFIG_XFR_SIZE(value), 1);
  546. break;
  547. case TUSB_DMA_EP_MAP:
  548. s->dma_map = value;
  549. break;
  550. case TUSB_EP_OUT_SIZE ... (TUSB_EP_OUT_SIZE + 0x3b):
  551. epnum = (offset - TUSB_EP_OUT_SIZE) >> 2;
  552. s->rx_config[epnum] = value;
  553. musb_set_size(s->musb, epnum + 1, TUSB_EP_CONFIG_XFR_SIZE(value), 0);
  554. break;
  555. case TUSB_EP_MAX_PACKET_SIZE_OFFSET ...
  556. (TUSB_EP_MAX_PACKET_SIZE_OFFSET + 0x3b):
  557. epnum = (offset - TUSB_EP_MAX_PACKET_SIZE_OFFSET) >> 2;
  558. return; /* TODO */
  559. case TUSB_WAIT_COUNT:
  560. return; /* TODO */
  561. case TUSB_SCRATCH_PAD:
  562. s->scratch = value;
  563. break;
  564. case TUSB_PROD_TEST_RESET:
  565. s->test_reset = value;
  566. break;
  567. default:
  568. printf("%s: unknown register at %03x\n", __FUNCTION__, offset);
  569. return;
  570. }
  571. }
  572. static CPUReadMemoryFunc *tusb_async_readfn[] = {
  573. tusb_async_readb,
  574. tusb_async_readh,
  575. tusb_async_readw,
  576. };
  577. static CPUWriteMemoryFunc *tusb_async_writefn[] = {
  578. tusb_async_writeb,
  579. tusb_async_writeh,
  580. tusb_async_writew,
  581. };
  582. static void tusb_otg_tick(void *opaque)
  583. {
  584. struct tusb_s *s = (struct tusb_s *) opaque;
  585. s->otg_timer_val = 0;
  586. s->intr |= TUSB_INT_SRC_OTG_TIMEOUT;
  587. tusb_intr_update(s);
  588. }
  589. static void tusb_power_tick(void *opaque)
  590. {
  591. struct tusb_s *s = (struct tusb_s *) opaque;
  592. if (s->power) {
  593. s->intr_ok = ~0;
  594. tusb_intr_update(s);
  595. }
  596. }
  597. static void tusb_musb_core_intr(void *opaque, int source, int level)
  598. {
  599. struct tusb_s *s = (struct tusb_s *) opaque;
  600. uint16_t otg_status = s->otg_status;
  601. switch (source) {
  602. case musb_set_vbus:
  603. if (level)
  604. otg_status |= TUSB_DEV_OTG_STAT_VBUS_VALID;
  605. else
  606. otg_status &= ~TUSB_DEV_OTG_STAT_VBUS_VALID;
  607. /* XXX: only if TUSB_PHY_OTG_CTRL_OTG_VBUS_DET_EN set? */
  608. /* XXX: only if TUSB_PRCM_MNGMT_OTG_VBUS_DET_EN set? */
  609. if (s->otg_status != otg_status) {
  610. s->otg_status = otg_status;
  611. s->intr |= TUSB_INT_SRC_VBUS_SENSE_CHNG;
  612. tusb_intr_update(s);
  613. }
  614. break;
  615. case musb_set_session:
  616. /* XXX: only if TUSB_PHY_OTG_CTRL_OTG_SESS_END_EN set? */
  617. /* XXX: only if TUSB_PRCM_MNGMT_OTG_SESS_END_EN set? */
  618. if (level) {
  619. s->otg_status |= TUSB_DEV_OTG_STAT_SESS_VALID;
  620. s->otg_status &= ~TUSB_DEV_OTG_STAT_SESS_END;
  621. } else {
  622. s->otg_status &= ~TUSB_DEV_OTG_STAT_SESS_VALID;
  623. s->otg_status |= TUSB_DEV_OTG_STAT_SESS_END;
  624. }
  625. /* XXX: some IRQ or anything? */
  626. break;
  627. case musb_irq_tx:
  628. case musb_irq_rx:
  629. s->usbip_intr = musb_core_intr_get(s->musb);
  630. /* Fall through. */
  631. default:
  632. if (level)
  633. s->intr |= 1 << source;
  634. else
  635. s->intr &= ~(1 << source);
  636. tusb_intr_update(s);
  637. break;
  638. }
  639. }
  640. struct tusb_s *tusb6010_init(qemu_irq intr)
  641. {
  642. struct tusb_s *s = qemu_mallocz(sizeof(*s));
  643. s->test_reset = TUSB_PROD_TEST_RESET_VAL;
  644. s->host_mode = 0;
  645. s->dev_config = 0;
  646. s->otg_status = 0; /* !TUSB_DEV_OTG_STAT_ID_STATUS means host mode */
  647. s->power = 0;
  648. s->mask = 0xffffffff;
  649. s->intr = 0x00000000;
  650. s->otg_timer_val = 0;
  651. s->iomemtype[1] = cpu_register_io_memory(0, tusb_async_readfn,
  652. tusb_async_writefn, s);
  653. s->irq = intr;
  654. s->otg_timer = qemu_new_timer(vm_clock, tusb_otg_tick, s);
  655. s->pwr_timer = qemu_new_timer(vm_clock, tusb_power_tick, s);
  656. s->musb = musb_init(qemu_allocate_irqs(tusb_musb_core_intr, s,
  657. __musb_irq_max));
  658. return s;
  659. }
  660. void tusb6010_power(struct tusb_s *s, int on)
  661. {
  662. if (!on)
  663. s->power = 0;
  664. else if (!s->power && on) {
  665. s->power = 1;
  666. /* Pull the interrupt down after TUSB6010 comes up. */
  667. s->intr_ok = 0;
  668. tusb_intr_update(s);
  669. qemu_mod_timer(s->pwr_timer,
  670. qemu_get_clock(vm_clock) + ticks_per_sec / 2);
  671. }
  672. }