tusb6010.c 25 KB

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