2
0

tusb6010.c 25 KB

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