cmem7_usb.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. /**
  2. *****************************************************************************
  3. * @file cmem7_usb.c
  4. *
  5. * @brief CMEM7 USB source file
  6. *
  7. *
  8. * @version V1.0
  9. * @date 3. September 2013
  10. *
  11. * @note
  12. *
  13. *****************************************************************************
  14. * @attention
  15. *
  16. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  17. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  18. * TIME. AS A RESULT, CAPITAL-MICRO SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
  19. * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  20. * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  21. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  22. *
  23. * <h2><center>&copy; COPYRIGHT 2013 Capital-micro </center></h2>
  24. *****************************************************************************
  25. */
  26. #include "cmem7_usb.h"
  27. static void USB_SET_REG_HPRT(const USB_REG_HPRT *clr, const USB_REG_HPRT *set)
  28. {
  29. USB_REG_HPRT hprt;
  30. hprt.HPRT = USB->__HPRT; // @0x41300440
  31. hprt.HPRT_b.POC = hprt.HPRT_b.PEDC = hprt.HPRT_b.PE = hprt.HPRT_b.PCD = 0;
  32. if (clr)
  33. hprt.HPRT &= (~clr->HPRT);
  34. if (set)
  35. hprt.HPRT |= (set->HPRT);
  36. USB->__HPRT = hprt.HPRT;
  37. }
  38. void USB_coreInit(uint32_t type)
  39. {
  40. USB->GINTEN = 0;
  41. USB->GINTSTS = ~0;
  42. GLOBAL_CTRL->USB_PHY_CTRL_b.CKISEL = 0; // Crystal
  43. // core initialization
  44. // choose PHY and soft reset
  45. USB->GUSBCFG_b.PHY_IF = 0; // 60MHz, 8bit
  46. USB->GUSBCFG_b.ULPI_UTMI_SEL = 0; // UTMI
  47. USB->GUSBCFG_b.PHY_SEL = 0; // USB 2.0 HS UTMI+
  48. USB->GRSTCTL_b.CORE_SOFT_RST = 1;
  49. while (USB->GRSTCTL_b.CORE_SOFT_RST == 1) ;
  50. while (USB->GRSTCTL_b.AHB_IDLE == 0) ;
  51. USB->GAHBCFG_b.DMA_EN = 1;
  52. USB->GAHBCFG_b.GLBL_INTR_EN = 1;
  53. USB->GAHBCFG_b.BST_LEN = 0x1; // INCR
  54. USB->GINTEN_b.RFNE = FALSE;
  55. USB->GUSBCFG_b.USB_TRD_TIM = 0x9; // 8-bit UTMI+
  56. USB->GUSBCFG_b.SRP_CAP = (type & 0x10) ? 1 : 0;
  57. USB->GUSBCFG_b.HNP_CAP = (type & 0x20) ? 1 : 0;
  58. if (type & 0x1) {
  59. USB->GUSBCFG_b.FORCE_HOST_MODE = 1;
  60. USB->GUSBCFG_b.FORCE_DEVICE_MODE = 0;
  61. } else if (type & 0x2) {
  62. USB->GUSBCFG_b.FORCE_DEVICE_MODE = 1;
  63. USB->GUSBCFG_b.FORCE_HOST_MODE = 0;
  64. }
  65. udelay(50000);
  66. }
  67. void USB_EnableInt(BOOL enable)
  68. {
  69. USB->GAHBCFG_b.GLBL_INTR_EN = enable;
  70. }
  71. void USB_FlushFIFO(uint32_t num)
  72. {
  73. if (num < 0x10) {
  74. USB->GRSTCTL_b.TX_FIFO_FLUSH_NUM = num;
  75. USB->GRSTCTL_b.TX_FIFO_FLUSH = 1;
  76. while (USB->GRSTCTL_b.TX_FIFO_FLUSH);
  77. } else if (num > 0x10) {
  78. USB->GRSTCTL_b.RX_FIFO_FLUSH = 1;
  79. while (USB->GRSTCTL_b.RX_FIFO_FLUSH);
  80. } else {
  81. USB->GRSTCTL_b.TX_FIFO_FLUSH_NUM = 0;
  82. USB->GRSTCTL_b.TX_FIFO_ALL = 1;
  83. USB->GRSTCTL_b.TX_FIFO_FLUSH = 1;
  84. while (USB->GRSTCTL_b.TX_FIFO_FLUSH);
  85. }
  86. }
  87. BOOL USB_ogtIsBdevID()
  88. {
  89. return USB->GOTGCTL_b.CON_ID_STS ? TRUE : FALSE;
  90. }
  91. BOOL USB_hostVBus(uint32_t opt)
  92. {
  93. if (opt & 0x2) {
  94. USB_REG_HPRT hprt;
  95. hprt.HPRT = 0;
  96. hprt.HPRT_b.PP = 1;
  97. if (opt & 0x1)
  98. USB_SET_REG_HPRT(NULL, &hprt);
  99. else
  100. USB_SET_REG_HPRT(&hprt, NULL);
  101. }
  102. return USB->__HPRT_b.PP ? TRUE : FALSE;
  103. }
  104. void USB_hostInit()
  105. {
  106. USB_REG_HPRT hprt;
  107. // HOST MODE
  108. USB->HCFG_b.FS_LS_PCS = 0x0; // PHY clock is running at 30/60 MHz
  109. USB->HCFG_b.FS_LS_SUPPORT = 0x0; // HS/FS/LS
  110. USB->HCFG_b.EN_SG_DMA = 0x1; // Enable Scatter/Gather DMA
  111. hprt.HPRT = 0;
  112. hprt.HPRT_b.PP = 1;
  113. USB_SET_REG_HPRT(NULL, &hprt);
  114. }
  115. void USB_HostResetPort(BOOL rst)
  116. {
  117. USB_REG_HPRT hprt;
  118. hprt.HPRT = 0;
  119. hprt.HPRT_b.PRESET = 1;
  120. if (rst)
  121. USB_SET_REG_HPRT(NULL, &hprt);
  122. else
  123. USB_SET_REG_HPRT(&hprt, NULL);
  124. }
  125. uint16_t USB_HostGetCurFrame()
  126. {
  127. return USB->HFNUM_b.FN;
  128. }
  129. void USB_HostSuspendPort()
  130. {
  131. USB_REG_HPRT hprt;
  132. hprt.HPRT = 0;
  133. hprt.HPRT_b.PS = 1;
  134. USB_SET_REG_HPRT(NULL, &hprt);
  135. }
  136. USB_ENUM_SPEED USB_hostGetEnumSpd()
  137. {
  138. return (USB_ENUM_SPEED)USB->__HPRT_b.SPEED;
  139. }
  140. BOOL USB_hostPrtConn()
  141. {
  142. return USB->__HPRT_b.PCS ? TRUE : FALSE;
  143. }
  144. void USB_hostCH0(uint32_t devaddr, OTG_DESCRIPTOR *desc, uint32_t ctd, uint32_t ntd, BOOL ping, uint32_t pid, uint32_t mps, uint32_t epnum, BOOL in, USB_EP_TYPE eptype, USB_ENUM_SPEED speed)
  145. {
  146. USB->HCDMA0_b.ADDR = SET_HCDMA_DESC_ADDR(desc);
  147. USB->HCDMA0_b.CTD = ctd;
  148. USB->HCTSIZ0_b.PING = ping ? 1 : 0;
  149. USB->HCTSIZ0_b.NTD = ntd;
  150. USB->HCTSIZ0_b.PID = pid;
  151. USB->HCC0_b.MPS = mps;
  152. USB->HCC0_b.EP_NUM = epnum;
  153. USB->HCC0_b.EP_DIR = in ? 1 : 0;
  154. USB->HCC0_b.LSD = (USB_ENUM_SPEED_LS == speed) ? 1 : 0;
  155. USB->HCC0_b.EP_TYPE = eptype;
  156. USB->HCC0_b.EC = 0;
  157. USB->HCC0_b.DA = devaddr;
  158. USB->HCC0_b.CE = 1;
  159. }
  160. void USB_hostCH1(uint32_t devaddr, OTG_DESCRIPTOR *desc, uint32_t ctd, uint32_t ntd, BOOL ping, uint32_t pid, uint32_t mps, uint32_t epnum, BOOL in, USB_EP_TYPE eptype, USB_ENUM_SPEED speed)
  161. {
  162. USB->HCDMA1_b.ADDR = SET_HCDMA_DESC_ADDR(desc);
  163. USB->HCDMA1_b.CTD = ctd;
  164. USB->HCTSIZ1_b.PING = ping ? 1 : 0;
  165. USB->HCTSIZ1_b.NTD = ntd;
  166. USB->HCTSIZ1_b.PID = pid;
  167. USB->HCC1_b.MPS = mps;
  168. USB->HCC1_b.EP_NUM = epnum;
  169. USB->HCC1_b.EP_DIR = in ? 1 : 0;
  170. USB->HCC1_b.LSD = (USB_ENUM_SPEED_LS == speed) ? 1 : 0;
  171. USB->HCC1_b.EP_TYPE = eptype;
  172. USB->HCC1_b.EC = 0;
  173. USB->HCC1_b.DA = devaddr;
  174. USB->HCC1_b.CE = 1;
  175. }
  176. void USB_hostCH2(uint32_t devaddr, OTG_DESCRIPTOR *desc, uint32_t ctd, uint32_t ntd, BOOL ping, uint32_t pid, uint32_t mps, uint32_t epnum, BOOL in, USB_EP_TYPE eptype, USB_ENUM_SPEED speed)
  177. {
  178. USB->HCDMA2_b.ADDR = SET_HCDMA_DESC_ADDR(desc);
  179. USB->HCDMA2_b.CTD = ctd;
  180. USB->HCTSIZ2_b.PING = ping ? 1 : 0;
  181. USB->HCTSIZ2_b.NTD = ntd;
  182. USB->HCTSIZ2_b.PID = pid;
  183. USB->HCC2_b.MPS = mps;
  184. USB->HCC2_b.EP_NUM = epnum;
  185. USB->HCC2_b.EP_DIR = in ? 1 : 0;
  186. USB->HCC2_b.LSD = (USB_ENUM_SPEED_LS == speed) ? 1 : 0;
  187. USB->HCC2_b.EP_TYPE = eptype;
  188. USB->HCC2_b.EC = 0;
  189. USB->HCC2_b.DA = devaddr;
  190. USB->HCC2_b.CE = 1;
  191. }
  192. int USB_hostCHn(uint32_t ch, uint32_t devaddr, OTG_DESCRIPTOR *desc, uint32_t ctd, uint32_t ntd, BOOL ping, uint32_t pid, uint32_t mps, uint32_t epnum, BOOL in, USB_EP_TYPE eptype, USB_ENUM_SPEED speed)
  193. {
  194. USB_Type *USBn = (USB_Type *)(((char *)USB) + (ch * 0x20));
  195. if (ch > 15)
  196. return -1;
  197. USBn->HCDMA0_b.ADDR = SET_HCDMA_DESC_ADDR(desc);
  198. USBn->HCDMA0_b.CTD = ctd;
  199. USBn->HCTSIZ0_b.PING = ping ? 1 : 0;
  200. USBn->HCTSIZ0_b.NTD = ntd;
  201. USBn->HCTSIZ0_b.PID = pid;
  202. USBn->HCC0_b.MPS = mps;
  203. USBn->HCC0_b.EP_NUM = epnum;
  204. USBn->HCC0_b.EP_DIR = in ? 1 : 0;
  205. USBn->HCC0_b.LSD = (USB_ENUM_SPEED_LS == speed) ? 1 : 0;
  206. USBn->HCC0_b.EP_TYPE = eptype;
  207. USBn->HCC0_b.EC = 0;
  208. USBn->HCC0_b.DA = devaddr;
  209. USBn->HCC0_b.CE = 1;
  210. return 0;
  211. }
  212. int USB_hostCHnHalt(uint32_t ch)
  213. {
  214. uint32_t hcchar;
  215. USB_Type *USBn = (USB_Type *)(((char *)USB) + (ch * 0x20));
  216. if (ch > 15)
  217. return -1;
  218. hcchar = USBn->HCC0;
  219. hcchar |= (0x3 << 30);
  220. USBn->HCC0 = hcchar;
  221. return 0;
  222. }
  223. BOOL USB_hostPortDisable(BOOL dis)
  224. {
  225. if (dis) {
  226. USB_REG_HPRT hprt;
  227. hprt.HPRT = 0;
  228. hprt.HPRT_b.PE = 1;
  229. USB_SET_REG_HPRT(&hprt, NULL);
  230. }
  231. return USB->__HPRT_b.PE ? FALSE : TRUE;
  232. }
  233. BOOL USB_roleIsHost()
  234. {
  235. return USB->GINTSTS_b.CUR_MOD ? TRUE : FALSE;
  236. }
  237. void USB_hostINT_enConn(BOOL en)
  238. {
  239. USB->GINTEN_b.HP = en;
  240. }
  241. BOOL USB_hostINT_isConn()
  242. {
  243. return USB->GINTSTS_b.HP ? TRUE : FALSE;
  244. }
  245. BOOL USB_hostINT_isPCD()
  246. {
  247. return USB->__HPRT_b.PCD ? TRUE : FALSE;
  248. }
  249. void USB_hostINT_clrPCD()
  250. {
  251. USB_REG_HPRT hprt;
  252. hprt.HPRT = 0;
  253. hprt.HPRT_b.PCD = 1;
  254. USB_SET_REG_HPRT(NULL, &hprt);
  255. }
  256. BOOL USB_hostINT_isPEDC()
  257. {
  258. return USB->__HPRT_b.PEDC ? TRUE : FALSE;
  259. }
  260. void USB_hostINT_clrPEDC()
  261. {
  262. USB_REG_HPRT hprt;
  263. hprt.HPRT = 0;
  264. hprt.HPRT_b.PEDC = 1;
  265. USB_SET_REG_HPRT(NULL, &hprt);
  266. }
  267. int USB_hostINT_enDone(uint32_t ch, BOOL en)
  268. {
  269. USB_Type *USBn = (USB_Type *)(((char *)USB) + (ch * 0x20));
  270. if (ch > 15)
  271. return -1;
  272. if (en) {
  273. USB->GINTEN_b.HC = 1;
  274. USB->HAINT_EN_b.EN |= BIT(ch);
  275. } else
  276. USB->HAINT_EN_b.EN &= ~BIT(ch);
  277. USBn->HCINT_EN0_b.TC = USBn->HCINT_EN0_b.CH_HALT = USBn->HCINT_EN0_b.BNA = en ? 1 : 0;
  278. return 0;
  279. }
  280. uint32_t USB_hostINT_isDone(uint32_t ch)
  281. {
  282. uint32_t retval = 0;
  283. if (ch > 15)
  284. return 0;
  285. if ((USB->GINTSTS_b.HC) && ((USB->HAINT & BIT(ch)))) {
  286. USB_Type *USBn = (USB_Type *)(((char *)USB) + (ch * 0x20));
  287. if (USBn->HCINT0_b.TC) {
  288. USBn->HCINT0 = BIT(0);
  289. retval |= 0x1;
  290. }
  291. if (USBn->HCINT0_b.BNA) {
  292. USBn->HCINT0 = BIT(11);
  293. retval |= 0x2;
  294. }
  295. if (USBn->HCINT0_b.CH_HALT) {
  296. USBn->HCINT0 = BIT(1);
  297. retval |= 0x4;
  298. }
  299. if (USBn->HCINT0_b.ETE) {
  300. USBn->HCINT0 = BIT(12);
  301. retval |= 0x8;
  302. }
  303. }
  304. return retval;
  305. }
  306. uint32_t USB_hostINT_isPend(uint32_t ch)
  307. {
  308. uint32_t retval = 0;
  309. if (ch > 15)
  310. return 0;
  311. if ((USB->GINTSTS_b.HC) && ((USB->HAINT & BIT(ch)))) {
  312. USB_Type *USBn = (USB_Type *)(((char *)USB) + (ch * 0x20));
  313. retval = USBn->HCINT0;
  314. USBn->HCINT0 = retval;
  315. }
  316. return retval;
  317. }
  318. void USB_devInit()
  319. {
  320. // If still has some int needed to be enable
  321. USB->GINTEN_b.MODE_MIS = TRUE;
  322. USB->GINTEN_b.OTG_INT = TRUE;
  323. // DEVICE MODE
  324. USB->GINTEN_b.RFNE = FALSE; // REG_CS(0x018/*GINTMSK*/, BIT(5)/*NPTxFEmpMsk*/ | BIT(4)/*RxFLvlMsk*/, 0);
  325. USB->GINTEN_b.NPTFE = FALSE;
  326. USB->DCFG_b.DSPEED = 0; // HS DEV
  327. USB->DCFG_b.NZLSOH = 0; // REG_CS(0x800/*DCFG*/, BIT(2)/*NZStsOUTHShk*/ | BIT(1) | BIT(0)/*DevSpd: HS*/, BIT(23)/*DescDMA*/ | BIT(13)/*EnDevOutNak*/);
  328. USB->DCFG_b.EN_SG_DMA = 1;
  329. USB->DCFG_b.EDON = 1;
  330. USB->DCTL_b.SD = 0;
  331. }
  332. USB_ENUM_SPEED USB_devGetEnumSpd()
  333. {
  334. return (USB_ENUM_SPEED)USB->DSTS_b.SPEED;
  335. }
  336. void USB_devSetAddress(uint32_t addr)
  337. {
  338. USB->DCFG_b.DEVICE_ADDR = addr;
  339. }
  340. void USB_devEP0out(uint32_t size, uint32_t pktcnt, uint32_t stpcnt, void *desc, BOOL snoop)
  341. {
  342. USB->DOEPTSIZ0_b.SIZE = size;
  343. USB->DOEPTSIZ0_b.PACKET_CNT = pktcnt;
  344. USB->DOEPTSIZ0_b.SETUP_CNT = stpcnt;
  345. USB->DOEPDMA0 = (uint32_t)(desc);
  346. USB->DOEPCTL0_b.SNOOP = snoop;
  347. USB->DOEPCTL0_b.CNAK = 1;
  348. USB->DOEPCTL0_b.EPE = 1; // REG_CS(0xB00/*DOEPCTL0*/, 0, BIT(31)/*EPEna*/);
  349. }
  350. BOOL USB_devEP0in(uint32_t size, uint32_t pktcnt, void *desc, uint32_t mps/*8,16,32,64-byte*/)
  351. {
  352. switch (mps) {
  353. case 64: mps = 0x0; break;
  354. case 32: mps = 0x1; break;
  355. case 16: mps = 0x2; break;
  356. case 8: mps = 0x3; break;
  357. default: return FALSE;
  358. }
  359. USB->DIEPTSIZ0_b.SIZE = size;
  360. USB->DIEPTSIZ0_b.PACKET_CNT = pktcnt;
  361. USB->DIEPDMA0 = (uint32_t)(desc);
  362. USB->DIEPCTL0_b.MPS = mps;
  363. USB->DIEPCTL0_b.TX_FIFO_NUM = 0;
  364. USB->DIEPCTL0_b.CNAK = 1;
  365. USB->DIEPCTL0_b.EPE = 1; // REG_CS(0xB00/*DOEPCTL0*/, 0, BIT(31)/*EPEna*/);
  366. return TRUE;
  367. }
  368. void USB_devActEP1(const BOOL in, const uint32_t mps, USB_EP_TYPE type)
  369. {
  370. if (in) {
  371. USB->DIEPCTL1_b.MPS = mps;
  372. USB->DIEPCTL1_b.EP_TYPE = type;
  373. USB->DIEPCTL1_b.UAE = (mps != 0) ? 1 : 0;
  374. } else {
  375. USB->DOEPCTL1_b.MPS = mps;
  376. USB->DOEPCTL1_b.EP_TYPE = type;
  377. USB->DOEPCTL1_b.UAE = (mps != 0) ? 1 : 0;
  378. }
  379. }
  380. void USB_devActEP2(const BOOL in, const uint32_t mps, USB_EP_TYPE type)
  381. {
  382. if (in) {
  383. USB->DIEPCTL2_b.MPS = mps;
  384. USB->DIEPCTL2_b.EP_TYPE = type;
  385. USB->DIEPCTL2_b.UAE = (mps != 0) ? 1 : 0;
  386. } else {
  387. USB->DOEPCTL2_b.MPS = mps;
  388. USB->DOEPCTL2_b.EP_TYPE = type;
  389. USB->DOEPCTL2_b.UAE = (mps != 0) ? 1 : 0;
  390. }
  391. }
  392. void USB_devEP1in(uint32_t size, uint32_t pktcnt, uint32_t pid, void *desc)
  393. {
  394. USB->DIEPTSIZ1_b.SIZE = size;
  395. USB->DIEPTSIZ1_b.PACKET_CNT = pktcnt;
  396. USB->DIEPDMA1 = (uint32_t)(desc);
  397. USB->DIEPCTL1_b.CNAK = 1;
  398. USB->DIEPCTL1_b.SET_D0_PID = (pid >> 0) & 0x1;
  399. USB->DIEPCTL1_b.SET_D1_PID = (pid >> 1) & 0x1;
  400. USB->DIEPCTL1_b.EPE = 1;
  401. }
  402. void USB_devEP1out(uint32_t size, uint32_t pktcnt, uint32_t pid, uint32_t stpcnt, void *desc, BOOL snoop)
  403. {
  404. USB->DOEPTSIZ1_b.SIZE = size;
  405. USB->DOEPTSIZ1_b.PACKET_CNT = pktcnt;
  406. USB->DOEPTSIZ1_b.SETUPCNT_PID = stpcnt;
  407. USB->DOEPDMA1 = (uint32_t)(desc);
  408. USB->DOEPCTL1_b.EC = snoop;
  409. USB->DOEPCTL1_b.CNAK = 1;
  410. USB->DOEPCTL1_b.SET_D0_PID = (pid >> 0) & 0x1;
  411. USB->DOEPCTL1_b.SET_D1_PID = (pid >> 1) & 0x1;
  412. USB->DOEPCTL1_b.EPE = 1;
  413. }
  414. void USB_devEP2in(uint32_t size, uint32_t pktcnt, uint32_t pid, void *desc)
  415. {
  416. USB->DIEPTSIZ2_b.SIZE = size;
  417. USB->DIEPTSIZ2_b.PACKET_CNT = pktcnt;
  418. USB->DIEPDMA2 = (uint32_t)(desc);
  419. USB->DIEPCTL2_b.CNAK = 1;
  420. USB->DIEPCTL2_b.SET_D0_PID = (pid >> 0) & 0x1;
  421. USB->DIEPCTL2_b.SET_D1_PID = (pid >> 1) & 0x1;
  422. USB->DIEPCTL2_b.EPE = 1;
  423. }
  424. void USB_devEP2out(uint32_t size, uint32_t pktcnt, uint32_t pid, uint32_t stpcnt, void *desc, BOOL snoop)
  425. {
  426. USB->DOEPTSIZ2_b.SIZE = size;
  427. USB->DOEPTSIZ2_b.PACKET_CNT = pktcnt;
  428. USB->DOEPTSIZ2_b.SETUPCNT_PID = stpcnt;
  429. USB->DOEPDMA2 = (uint32_t)(desc);
  430. USB->DOEPCTL2_b.EC = snoop;
  431. USB->DOEPCTL2_b.CNAK = 1;
  432. USB->DOEPCTL2_b.SET_D0_PID = (pid >> 0) & 0x1;
  433. USB->DOEPCTL2_b.SET_D1_PID = (pid >> 1) & 0x1;
  434. USB->DOEPCTL2_b.EPE = 1;
  435. }
  436. void USB_devNAKhandshake(uint32_t ep, BOOL in, BOOL en)
  437. {
  438. switch (ep) {
  439. case 0:
  440. if (in) {
  441. if (en) USB->DIEPCTL0_b.SNAK = 1; else USB->DIEPCTL0_b.CNAK = 1;
  442. } else {
  443. if (en) USB->DOEPCTL0_b.SNAK = 1; else USB->DOEPCTL0_b.CNAK = 1;
  444. }
  445. break;
  446. case 1:
  447. if (in) {
  448. if (en) USB->DIEPCTL1_b.SNAK = 1; else USB->DIEPCTL1_b.CNAK = 1;
  449. } else {
  450. if (en) USB->DOEPCTL1_b.SNAK = 1; else USB->DOEPCTL1_b.CNAK = 1;
  451. }
  452. break;
  453. case 2:
  454. if (in) {
  455. if (en) USB->DIEPCTL2_b.SNAK = 1; else USB->DIEPCTL2_b.CNAK = 1;
  456. } else {
  457. if (en) USB->DOEPCTL2_b.SNAK = 1; else USB->DOEPCTL2_b.CNAK = 1;
  458. }
  459. break;
  460. default:
  461. break;
  462. }
  463. }
  464. BOOL USB_devSTALLhandshake(uint32_t ep, BOOL in, BOOL en)
  465. {
  466. BOOL retval = FALSE;
  467. switch (ep) {
  468. case 0:
  469. if (in) {
  470. retval = USB->DIEPCTL0_b.STALL;
  471. USB->DIEPCTL0_b.STALL = en ? 1 : 0;
  472. } else {
  473. retval = USB->DOEPCTL0_b.STALL;
  474. USB->DOEPCTL0_b.STALL = en ? 1 : 0;
  475. }
  476. break;
  477. case 1:
  478. if (in) {
  479. retval = USB->DIEPCTL1_b.STALL;
  480. USB->DIEPCTL1_b.STALL = en ? 1 : 0;
  481. } else {
  482. retval = USB->DOEPCTL1_b.STALL;
  483. USB->DOEPCTL1_b.STALL = en ? 1 : 0;
  484. }
  485. break;
  486. case 2:
  487. if (in) {
  488. retval = USB->DIEPCTL2_b.STALL;
  489. USB->DIEPCTL2_b.STALL = en ? 1 : 0;
  490. } else {
  491. retval = USB->DOEPCTL2_b.STALL;
  492. USB->DOEPCTL2_b.STALL = en ? 1 : 0;
  493. }
  494. break;
  495. default:
  496. break;
  497. }
  498. return retval;
  499. }
  500. void USB_devINT_enDone(uint32_t ep, BOOL in, BOOL en)
  501. {
  502. if (in) {
  503. USB->DIEPEN_b.TIMEOUT = en ? 1 : 0;
  504. USB->DIEPEN_b.TC = en ? 1 : 0;
  505. if (en) {
  506. USB->GINTEN_b.IEP_INT = 1;
  507. USB->DAINT_EN_b.IN_EN |= BIT(ep);
  508. } else
  509. USB->DAINT_EN_b.IN_EN &= ~BIT(ep);
  510. } else {
  511. USB->DOEPEN_b.SPD = en ? 1 : 0;
  512. USB->DOEPEN_b.TC = en ? 1 : 0;
  513. if (en) {
  514. USB->GINTEN_b.OEP_INT = 1;
  515. USB->DAINT_EN_b.OUT_EN |= BIT(ep);
  516. } else
  517. USB->DAINT_EN_b.OUT_EN &= ~BIT(ep);
  518. }
  519. }
  520. uint32_t USB_devINT_isDone(uint32_t ep, BOOL in)
  521. {
  522. int32_t retval = 0;
  523. if (in) {
  524. if (USB->GINTSTS_b.IEP_INT)
  525. switch (ep) {
  526. case 0:
  527. if (USB->DIEPINT0_b.TC) {
  528. retval |= 0x1;
  529. USB->DIEPINT0 = BIT(0);
  530. }
  531. if (USB->DIEPINT0_b.BNA) {
  532. retval |= 0x2;
  533. USB->DIEPINT0 = BIT(9);
  534. }
  535. break;
  536. case 1:
  537. if (USB->DIEPINT1_b.TC) {
  538. retval |= 0x1;
  539. USB->DIEPINT1 = BIT(0);
  540. }
  541. if (USB->DIEPINT1_b.BNA) {
  542. retval |= 0x2;
  543. USB->DIEPINT1 = BIT(9);
  544. }
  545. break;
  546. case 2:
  547. if (USB->DIEPINT2_b.TC) {
  548. retval |= 0x1;
  549. USB->DIEPINT2 = BIT(0);
  550. }
  551. if (USB->DIEPINT2_b.BNA) {
  552. retval |= 0x2;
  553. USB->DIEPINT2 = BIT(9);
  554. }
  555. default:
  556. break;
  557. }
  558. } else {
  559. if (USB->GINTSTS_b.OEP_INT)
  560. switch (ep) {
  561. case 0:
  562. if (USB->DOEPINT0_b.TC) {
  563. retval |= 0x1;
  564. USB->DOEPINT0 = BIT(0);
  565. }
  566. if (USB->DOEPINT0_b.SETUP) {
  567. retval |= 0x4;
  568. USB->DOEPINT0 = BIT(3);
  569. }
  570. break;
  571. case 1:
  572. if (USB->DOEPINT1_b.TC) {
  573. retval |= 0x1;
  574. USB->DOEPINT1 = BIT(0);
  575. }
  576. if (USB->DOEPINT1_b.BNA) {
  577. retval |= 0x2;
  578. USB->DOEPINT1 = BIT(9);
  579. }
  580. break;
  581. case 2:
  582. if (USB->DOEPINT2_b.TC) {
  583. retval |= 0x1;
  584. USB->DOEPINT2 = BIT(0);
  585. }
  586. if (USB->DOEPINT2_b.BNA) {
  587. retval |= 0x2;
  588. USB->DOEPINT2 = BIT(9);
  589. }
  590. break;
  591. default:
  592. break;
  593. }
  594. }
  595. return retval;
  596. }
  597. void USB_INT_enOTG(BOOL en)
  598. {
  599. USB->GINTEN_b.OTG_INT = en;
  600. }
  601. BOOL USB_INT_isOTG()
  602. {
  603. return USB->GINTSTS_b.OTG_INT ? TRUE : FALSE;
  604. }
  605. BOOL USB_INT_isOTGon(USB_INT_OTG otg)
  606. {
  607. switch (otg) {
  608. case USB_INT_OTG_SESEND:
  609. return USB->GOTGINT_b.SES_END_DET ? TRUE : FALSE;
  610. break;
  611. case USB_INT_OTG_STANDAUP:
  612. return USB->GOTGINT_b.A_DEV_TOUT_CHG ? TRUE : FALSE;
  613. break;
  614. case USB_INT_OTG_HNDETECT:
  615. return USB->GOTGINT_b.HST_NEG_DET ? TRUE : FALSE;
  616. break;
  617. case USB_INT_OTG_HNSUCCHG:
  618. return USB->GOTGINT_b.HST_NEG_SUC_STS_CHNG ? TRUE : FALSE;
  619. break;
  620. case USB_INT_OTG_KEEPAPP:
  621. return USB->GOTGINT_b.DBNCE_DONE ? TRUE : FALSE;
  622. break;
  623. default:
  624. break;
  625. }
  626. return FALSE;
  627. }
  628. void USB_INT_clrOTGon(USB_INT_OTG otg)
  629. {
  630. switch (otg) {
  631. case USB_INT_OTG_SESEND:
  632. USB->GOTGINT = BIT(2);
  633. break;
  634. case USB_INT_OTG_STANDAUP:
  635. USB->GOTGINT = BIT(18);
  636. break;
  637. case USB_INT_OTG_HNDETECT:
  638. USB->GOTGINT = BIT(17);
  639. break;
  640. case USB_INT_OTG_HNSUCCHG:
  641. USB->GOTGINT = BIT(9);
  642. break;
  643. case USB_INT_OTG_KEEPAPP:
  644. USB->GOTGINT = BIT(19);
  645. break;
  646. default:
  647. break;
  648. }
  649. }
  650. void USB_INT_enGP(USB_INT_GP name, BOOL en)
  651. {
  652. switch (name) {
  653. case USB_INT_GP_HOST_DISC:
  654. USB->GINTEN_b.DD = en ? 1 : 0;
  655. break;
  656. case USB_INT_GP_DEV_RESET:
  657. USB->GINTEN_b.USB_RST = en ? 1 : 0;
  658. break;
  659. case USB_INT_GP_DEV_ENUMDONE:
  660. USB->GINTEN_b.ENUM_DONE = en ? 1 : 0;
  661. break;
  662. case USB_INT_GP_DEV_SUSP:
  663. USB->GINTEN_b.USB_SUS = en ? 1 : 0;
  664. break;
  665. case USB_INT_GP_DEV_EARLY:
  666. USB->GINTEN_b.EARLY_SUS = en ? 1 : 0;
  667. break;
  668. case USB_INT_GP_SOF:
  669. USB->GINTEN_b.SOF = en ? 1 : 0;
  670. break;
  671. case USB_INT_GP_MIS:
  672. USB->GINTEN_b.MODE_MIS = en ? 1 : 0;
  673. break;
  674. case USB_INT_GP_IDCHG:
  675. USB->GINTEN_b.CIDSC = en ? 1 : 0;
  676. break;
  677. case USB_INT_GP_SESSREQ:
  678. USB->GINTEN_b.SR = en ? 1 : 0;
  679. break;
  680. default:
  681. break;
  682. }
  683. }
  684. BOOL USB_INT_isGP(USB_INT_GP name)
  685. {
  686. switch (name) {
  687. case USB_INT_GP_HOST_DISC:
  688. return USB->GINTSTS_b.DD ? TRUE : FALSE;
  689. break;
  690. case USB_INT_GP_DEV_RESET:
  691. return USB->GINTSTS_b.USB_RST ? TRUE : FALSE;
  692. break;
  693. case USB_INT_GP_DEV_ENUMDONE:
  694. return USB->GINTSTS_b.ENUM_DONE ? TRUE : FALSE;
  695. break;
  696. case USB_INT_GP_DEV_SUSP:
  697. return USB->GINTSTS_b.USB_SUS ? TRUE : FALSE;
  698. break;
  699. case USB_INT_GP_DEV_EARLY:
  700. return USB->GINTSTS_b.EARLY_SUS ? TRUE : FALSE;
  701. break;
  702. case USB_INT_GP_SOF:
  703. return USB->GINTSTS_b.SOF ? TRUE : FALSE;
  704. break;
  705. case USB_INT_GP_MIS:
  706. return USB->GINTSTS_b.MODE_MIS ? TRUE : FALSE;
  707. break;
  708. case USB_INT_GP_IDCHG:
  709. return USB->GINTSTS_b.CIDSC ? TRUE : FALSE;
  710. break;
  711. case USB_INT_GP_SESSREQ:
  712. return USB->GINTSTS_b.SR ? TRUE : FALSE;
  713. break;
  714. default:
  715. break;
  716. }
  717. return FALSE;
  718. }
  719. void USB_INT_clrGP(USB_INT_GP name)
  720. {
  721. switch (name) {
  722. case USB_INT_GP_HOST_DISC:
  723. USB->GINTSTS = BIT(29);
  724. break;
  725. case USB_INT_GP_DEV_RESET:
  726. USB->GINTSTS = BIT(12);
  727. break;
  728. case USB_INT_GP_DEV_ENUMDONE:
  729. USB->GINTSTS = BIT(13);
  730. break;
  731. case USB_INT_GP_DEV_SUSP:
  732. USB->GINTSTS = BIT(11);
  733. break;
  734. case USB_INT_GP_DEV_EARLY:
  735. USB->GINTSTS = BIT(10);
  736. break;
  737. case USB_INT_GP_SOF:
  738. USB->GINTSTS = BIT(3);
  739. break;
  740. case USB_INT_GP_MIS:
  741. USB->GINTSTS = BIT(1);
  742. break;
  743. case USB_INT_GP_IDCHG:
  744. USB->GINTSTS = BIT(28);
  745. break;
  746. case USB_INT_GP_SESSREQ:
  747. USB->GINTSTS = BIT(30);
  748. break;
  749. default:
  750. break;
  751. }
  752. }
  753. BOOL USB_otgControl(USB_OTG_CTL ctl, BOOL val)
  754. {
  755. BOOL retval = FALSE;
  756. switch (ctl) {
  757. case USB_OTG_DEV_HNSUCC:
  758. retval = USB->GOTGCTL_b.HST_NEG_SCS ? TRUE : FALSE;
  759. break;
  760. case USB_OTG_DEV_HNPREQ:
  761. retval = USB->GOTGCTL_b.HNP_REQ ? TRUE : FALSE;
  762. USB->GOTGCTL_b.HNP_REQ = val ? 1 : 0;
  763. break;
  764. case USB_OTG_HST_HNPENABLE:
  765. retval = USB->GOTGCTL_b.HST_SET_HNP_EN ? TRUE : FALSE;
  766. USB->GOTGCTL_b.HST_SET_HNP_EN = val ? 1 : 0;
  767. break;
  768. case USB_OTG_DEV_HNPENABLE:
  769. retval = USB->GOTGCTL_b.DEV_HNP_EN ? TRUE : FALSE;
  770. USB->GOTGCTL_b.DEV_HNP_EN = val ? 1 : 0;
  771. break;
  772. default:
  773. break;
  774. }
  775. return retval;
  776. }