tusb6010.c 24 KB

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