]> git.sur5r.net Git - freertos/blob
c3f57acc0d03f7d522e9416d8274e0c987cf51d0
[freertos] /
1 /*\r
2  * @brief HAL USB functions for the LPC17xx microcontrollers\r
3  *\r
4  * @note\r
5  * Copyright(C) NXP Semiconductors, 2012\r
6  * All rights reserved.\r
7  *\r
8  * @par\r
9  * Software that is described herein is for illustrative purposes only\r
10  * which provides customers with programming information regarding the\r
11  * LPC products.  This software is supplied "AS IS" without any warranties of\r
12  * any kind, and NXP Semiconductors and its licensor disclaim any and\r
13  * all warranties, express or implied, including all implied warranties of\r
14  * merchantability, fitness for a particular purpose and non-infringement of\r
15  * intellectual property rights.  NXP Semiconductors assumes no responsibility\r
16  * or liability for the use of the software, conveys no license or rights under any\r
17  * patent, copyright, mask work right, or any other intellectual property rights in\r
18  * or to any products. NXP Semiconductors reserves the right to make changes\r
19  * in the software without notification. NXP Semiconductors also makes no\r
20  * representation or warranty that such application will be suitable for the\r
21  * specified use without further testing or modification.\r
22  *\r
23  * @par\r
24  * Permission to use, copy, modify, and distribute this software and its\r
25  * documentation is hereby granted, under NXP Semiconductors' and its\r
26  * licensor's relevant copyrights in the software, without fee, provided that it\r
27  * is used in conjunction with NXP Semiconductors microcontrollers.  This\r
28  * copyright, permission, and disclaimer notice must appear in all copies of\r
29  * this code.\r
30  */\r
31 \r
32 #if defined(__LPC175X_6X__) || defined(__LPC177X_8X__) || defined(__LPC407X_8X__)\r
33 \r
34 #include "../HAL.h"\r
35 #include "../../USBTask.h"\r
36 \r
37 void HAL_USBInit(uint8_t corenum)\r
38 {\r
39         /* Enable PLL1 for 48MHz output */\r
40         Chip_Clock_EnablePLL(SYSCTL_USB_PLL, SYSCTL_PLL_ENABLE);\r
41 #if defined(__LPC175X_6X__)\r
42         while ((Chip_Clock_GetPLLStatus(SYSCTL_USB_PLL) & SYSCTL_PLL1STS_LOCKED) == 0);\r
43 #else\r
44         while ((Chip_Clock_GetPLLStatus(SYSCTL_USB_PLL) & SYSCTL_PLLSTS_LOCKED) == 0);\r
45 #endif\r
46 \r
47         Chip_IOCON_PinMux(LPC_IOCON, 0, 29, IOCON_MODE_INACT, IOCON_FUNC1);     /* P0.29 D1+, P0.30 D1- */\r
48         Chip_IOCON_PinMux(LPC_IOCON, 0, 30, IOCON_MODE_INACT, IOCON_FUNC1);\r
49 \r
50         #if defined(USB_CAN_BE_HOST)\r
51         Chip_IOCON_PinMux(LPC_IOCON, 1, 19, IOCON_MODE_INACT, IOCON_FUNC2);     /* USB_Power switch */\r
52 #endif\r
53         \r
54 #if defined(USB_CAN_BE_DEVICE)\r
55         Chip_IOCON_PinMux(LPC_IOCON, 2, 9, IOCON_MODE_INACT, IOCON_FUNC1);      /* USB_SoftConnect */\r
56 #endif\r
57         \r
58         LPC_SYSCTL->PCONP |= (1UL << 31);                                       /* USB PCLK -> enable USB Per.*/\r
59 \r
60 #if defined(USB_CAN_BE_DEVICE)\r
61         LPC_USB->USBClkCtrl = 0x12;                                     /* Dev, PortSel, AHB clock enable */\r
62         while ((LPC_USB->USBClkSt & 0x12) != 0x12) ;\r
63 \r
64         HAL_Reset(corenum);\r
65 #endif\r
66 }\r
67 \r
68 void HAL_USBDeInit(uint8_t corenum, uint8_t mode)\r
69 {\r
70         NVIC_DisableIRQ(USB_IRQn);                                                                                                      /* disable USB interrupt */\r
71         LPC_SYSCTL->PCONP &= (~(1UL << 31));                                                            /* disable USB Per.      */     \r
72         Chip_IOCON_PinMux(LPC_IOCON, 0, 29, IOCON_MODE_INACT, IOCON_FUNC0);     /* P0.29 D+, P0.30 D- reset to GPIO function */\r
73         Chip_IOCON_PinMux(LPC_IOCON, 0, 30, IOCON_MODE_INACT, IOCON_FUNC0);\r
74         /* Disable PLL1 to save power */\r
75         Chip_Clock_DisablePLL(SYSCTL_USB_PLL, SYSCTL_PLL_ENABLE);\r
76 }\r
77 \r
78 void HAL_EnableUSBInterrupt(uint8_t corenum)\r
79 {\r
80         NVIC_EnableIRQ(USB_IRQn);                                       /* enable USB interrupt */\r
81 }\r
82 \r
83 void HAL_DisableUSBInterrupt(uint8_t corenum)\r
84 {\r
85         NVIC_DisableIRQ(USB_IRQn);                                      /* enable USB interrupt */\r
86 }\r
87 \r
88 void HAL_USBConnect(uint8_t corenum, uint32_t con)\r
89 {\r
90         if (USB_CurrentMode[corenum] == USB_MODE_Device) {\r
91 #if defined(USB_CAN_BE_DEVICE)\r
92                 HAL17XX_USBConnect(con);\r
93 #endif\r
94         }\r
95 }\r
96 \r
97 // TODO moving stuff to approriate places\r
98 extern void DcdIrqHandler (uint8_t DeviceID);\r
99 \r
100 void USB_IRQHandler(void)\r
101 {\r
102         if (USB_CurrentMode[0] == USB_MODE_Host) {\r
103                 #if defined(USB_CAN_BE_HOST)\r
104                 HcdIrqHandler(0);\r
105                 #endif\r
106         }\r
107 \r
108         if (USB_CurrentMode[0] == USB_MODE_Device) {\r
109                 #if defined(USB_CAN_BE_DEVICE)\r
110                 DcdIrqHandler(0);\r
111                 #endif\r
112         }\r
113 }\r
114 \r
115 #endif /*__LPC17XX__ || __LPC40XX__*/\r