2
0

tusb6010.c 23 KB

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