1
- /* Copyright (c) 2016 mbed.org, MIT License
1
+ /* Copyright (c) 2017 mbed.org, MIT License
2
2
*
3
3
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
4
4
* and associated documentation files (the "Software"), to deal in the Software without
15
15
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16
16
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
17
17
*/
18
- #ifndef USBHAL_STM32F103RB
19
- #define USBHAL_STM32F103RB
18
+ #ifndef USBHAL_IP_DEVICE_H
19
+ #define USBHAL_IP_DEVICE_H
20
20
21
+ #if defined(TARGET_NUCLEO_F303ZE )
22
+ #define USBHAL_IRQn USB_LP_CAN_RX0_IRQn
23
+
24
+ #elif defined(TARGET_NUCLEO_F103RB )
21
25
#define USBHAL_IRQn USB_LP_CAN1_RX0_IRQn
22
26
27
+ #elif defined(TARGET_DISCO_L072CZ_LRWAN1 ) || \
28
+ defined(TARGET_DISCO_L053C8 )
29
+ #define USBHAL_IRQn USB_IRQn
30
+
31
+ #else
32
+ #error "USB IRQ is not configured !"
33
+ #endif
34
+
35
+ #define NB_ENDPOINT 8 // Must be a multiple of 4 bytes
23
36
24
- #define NB_ENDPOINT 8
25
- /* must be multiple of 4 bytes */
26
37
#define MAXTRANSFER_SIZE 0x200
27
- #define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
38
+
39
+ #define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE + MAX_PACKET_SIZE_EP0 + MAX_PACKET_SIZE_EP1 + MAX_PACKET_SIZE_EP2 + MAX_PACKET_SIZE_EP3)
40
+
28
41
#if (FIFO_USB_RAM_SIZE > 0x500 )
29
42
#error "FIFO dimensioning incorrect"
30
43
#endif
31
44
32
45
typedef struct
33
46
{
34
47
USBHAL * inst ;
48
+
35
49
void (USBHAL ::* bus_reset )(void );
36
50
void (USBHAL ::* sof )(int frame );
37
- void (USBHAL ::* connect_change )(unsigned int connected );
51
+ void (USBHAL ::* connect_change )(unsigned int connected );
38
52
void (USBHAL ::* suspend_change )(unsigned int suspended );
39
53
void (USBHAL ::* ep0_setup )(void );
40
54
void (USBHAL ::* ep0_in )(void );
41
55
void (USBHAL ::* ep0_out )(void );
42
56
void (USBHAL ::* ep0_read )(void );
43
57
bool (USBHAL ::* ep_realise )(uint8_t endpoint , uint32_t maxPacket , uint32_t flags );
44
- bool (USBHAL ::* epCallback [2 * NB_ENDPOINT - 2 ])(void );
45
- uint8_t epComplete [8 ];
46
- /* memorize dummy buffer used for reception */
47
- uint32_t pBufRx [MAXTRANSFER_SIZE >>2 ];
48
- uint32_t pBufRx0 [MAX_PACKET_SIZE_EP0 >>2 ];
49
- gpio_t usb_switch ;
50
- }USBHAL_Private_t ;
58
+ bool (USBHAL ::* epCallback [(2 * NB_ENDPOINT ) - 2 ])(void );
51
59
52
- void HAL_PCDEx_SetConnectionState (PCD_HandleTypeDef * hpcd , uint8_t state )
53
- {
54
- USBHAL_Private_t * priv = ((USBHAL_Private_t * )(hpcd -> pData ));
55
- gpio_write (& (priv -> usb_switch ),!state );
56
- }
60
+ uint8_t epComplete [2 * NB_ENDPOINT ];
61
+
62
+ /* Memorize dummy buffer used for reception */
63
+ uint32_t pBufRx [MAXTRANSFER_SIZE >> 2 ];
64
+ uint32_t pBufRx0 [MAX_PACKET_SIZE_EP0 >> 2 ];
65
+
66
+ gpio_t usb_switch ;
67
+ } USBHAL_Private_t ;
57
68
58
69
uint32_t HAL_PCDEx_GetTxFiFo (PCD_HandleTypeDef * hpcd , uint8_t fifo )
59
70
{
60
71
return 1024 ;
61
72
}
62
- void HAL_PCD_SOFCallback (PCD_HandleTypeDef * hpcd )
73
+
74
+ void HAL_PCD_SOFCallback (PCD_HandleTypeDef * hpcd )
63
75
{
64
76
USBHAL_Private_t * priv = ((USBHAL_Private_t * )(hpcd -> pData ));
65
77
USBHAL * obj = priv -> inst ;
@@ -68,24 +80,31 @@ void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
68
80
(obj -> * func )(sofnum );
69
81
}
70
82
71
- USBHAL * USBHAL ::instance ;
72
-
73
- USBHAL ::USBHAL (void )
83
+ void HAL_PCDEx_SetConnectionState (PCD_HandleTypeDef * hpcd , uint8_t state )
74
84
{
75
- /* init parameter */
85
+ USBHAL_Private_t * priv = ((USBHAL_Private_t * )(hpcd -> pData ));
86
+ #if defined(TARGET_NUCLEO_F103RB )
87
+ gpio_write (& (priv -> usb_switch ), !state );
88
+ #else
89
+ gpio_write (& (priv -> usb_switch ), state );
90
+ #endif
91
+ }
92
+
93
+ USBHAL * USBHAL ::instance ;
94
+
95
+ USBHAL ::USBHAL (void ) {
76
96
USBHAL_Private_t * HALPriv = new (USBHAL_Private_t );
77
- /* initialized all field of init including 0 field */
78
- /* constructor does not fill with zero */
97
+
79
98
hpcd .Instance = USB ;
80
- /* initialized all field of init including 0 field */
81
- /* constructor does not fill with zero */
99
+
82
100
memset (& hpcd .Init , 0 , sizeof (hpcd .Init ));
83
101
hpcd .Init .dev_endpoints = NB_ENDPOINT ;
84
- hpcd .Init .ep0_mps = MAX_PACKET_SIZE_EP0 ;
102
+ hpcd .Init .ep0_mps = MAX_PACKET_SIZE_EP0 ;
85
103
hpcd .Init .phy_itface = PCD_PHY_EMBEDDED ;
86
104
hpcd .Init .Sof_enable = 1 ;
87
105
hpcd .Init .speed = PCD_SPEED_FULL ;
88
- /* pass instance for usage inside call back */
106
+
107
+ // Pass instance for usage inside call back
89
108
HALPriv -> inst = this ;
90
109
HALPriv -> bus_reset = & USBHAL ::busReset ;
91
110
HALPriv -> suspend_change = & USBHAL ::suspendStateChanged ;
@@ -96,7 +115,6 @@ USBHAL::USBHAL(void)
96
115
HALPriv -> ep0_in = & USBHAL ::EP0in ;
97
116
HALPriv -> ep0_out = & USBHAL ::EP0out ;
98
117
HALPriv -> ep0_read = & USBHAL ::EP0read ;
99
- hpcd .pData = (void * )HALPriv ;
100
118
HALPriv -> epCallback [0 ] = & USBHAL ::EP1_OUT_callback ;
101
119
HALPriv -> epCallback [1 ] = & USBHAL ::EP1_IN_callback ;
102
120
HALPriv -> epCallback [2 ] = & USBHAL ::EP2_OUT_callback ;
@@ -105,43 +123,56 @@ USBHAL::USBHAL(void)
105
123
HALPriv -> epCallback [5 ] = & USBHAL ::EP3_IN_callback ;
106
124
instance = this ;
107
125
126
+ // Configure USB pins and other clocks
127
+ #if defined(TARGET_NUCLEO_F303ZE )
128
+ __HAL_RCC_GPIOA_CLK_ENABLE ();
129
+ pin_function (PA_11 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_NOPULL , GPIO_AF14_USB )); // DM
130
+ pin_function (PA_12 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_NOPULL , GPIO_AF14_USB )); // DP
131
+ __HAL_RCC_GPIOG_CLK_ENABLE ();
132
+ gpio_init_out (& HALPriv -> usb_switch , PG_6 );
133
+
134
+ #elif defined(TARGET_NUCLEO_F103RB )
135
+ // Make sure to connect a 1.5K resistor between USB-DP PA12 pin and +3.3V
136
+ __HAL_RCC_GPIOA_CLK_ENABLE ();
137
+ pin_function (PA_11 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_MODE_AF_INPUT )); // DM
138
+ pin_function (PA_12 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_MODE_AF_INPUT )); // DP
139
+
140
+ #elif defined(TARGET_DISCO_L072CZ_LRWAN1 ) || \
141
+ defined(TARGET_DISCO_L053C8 )
142
+ __HAL_RCC_GPIOA_CLK_ENABLE ();
143
+ pin_function (PA_11 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_NOPULL , GPIO_AF2_USB )); // DM
144
+ pin_function (PA_12 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_NOPULL , GPIO_AF2_USB )); // DP
108
145
109
- /* Configure USB VBUS GPIO */
110
- gpio_init_out (& HALPriv -> usb_switch ,PB_14 );
111
- gpio_mode (& HALPriv -> usb_switch ,OpenDrain );
112
- /* Configure USB FS GPIOs */
113
-
114
- /* Configure DM DP Pins
115
- * - USB-DP (D+ of the USB connector) <======> PA12 (Nucleo board)
116
- * Make sure to connect a 1.5KOhm pull up to USB-DP PA12 pin
117
- * (permanent pull-up)
118
- - USB-DM (D- of the USB connector) <======> PA11 (Nucleo board)
119
- */
120
-
121
- pin_function (PA_11 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_MODE_AF_INPUT ));
122
- pin_function (PA_12 , STM_PIN_DATA (STM_MODE_AF_PP , GPIO_PULLUP , GPIO_MODE_AF_INPUT ));
146
+ #else
147
+ #error "USB pins are not configured !"
148
+ #endif
123
149
124
150
__HAL_RCC_USB_CLK_ENABLE ();
151
+ __HAL_RCC_SYSCFG_CLK_ENABLE ();
125
152
153
+ // Configure PCD and FIFOs
154
+ hpcd .pData = (void * )HALPriv ;
126
155
hpcd .State = HAL_PCD_STATE_RESET ;
127
-
128
156
HAL_PCD_Init (& hpcd );
129
- /* hardcoded size of FIFO according definition*/
130
- HAL_PCDEx_PMAConfig (& hpcd , 0x00 , PCD_SNG_BUF , 0x30 );
131
- HAL_PCDEx_PMAConfig (& hpcd , 0x80 , PCD_SNG_BUF , 0x70 );
132
- HAL_PCDEx_PMAConfig (& hpcd , 0x01 , PCD_SNG_BUF , 0x90 );
133
- HAL_PCDEx_PMAConfig (& hpcd , 0x81 , PCD_SNG_BUF , 0xb0 );
134
- #if 0
135
- HAL_PCDEx_PMAConfig (& hpcd , 0x2 , PCD_DBL_BUF , 0x018000b0 );
136
- #else
137
- HAL_PCDEx_PMAConfig (& hpcd , 0x2 , PCD_SNG_BUF , 0x100 );
138
- #endif
139
- HAL_PCDEx_PMAConfig (& hpcd , 0x82 , PCD_SNG_BUF , 0x120 );
140
157
141
- NVIC_SetVector (USBHAL_IRQn ,(uint32_t )& _usbisr );
142
- NVIC_SetPriority ( USBHAL_IRQn , 1 );
158
+ // EP0
159
+ HAL_PCDEx_PMAConfig (& hpcd , 0x00 , PCD_SNG_BUF , 0x30 );
160
+ HAL_PCDEx_PMAConfig (& hpcd , 0x80 , PCD_SNG_BUF , 0x70 );
161
+ // EP1
162
+ HAL_PCDEx_PMAConfig (& hpcd , 0x01 , PCD_SNG_BUF , 0x90 );
163
+ HAL_PCDEx_PMAConfig (& hpcd , 0x81 , PCD_SNG_BUF , 0xb0 );
164
+ // EP2
165
+ HAL_PCDEx_PMAConfig (& hpcd , 0x02 , PCD_SNG_BUF , 0x100 );
166
+ HAL_PCDEx_PMAConfig (& hpcd , 0x82 , PCD_SNG_BUF , 0x120 );
167
+ // EP3
168
+ HAL_PCDEx_PMAConfig (& hpcd , 0x03 , PCD_DBL_BUF , 0x018000b0 );
169
+ HAL_PCDEx_PMAConfig (& hpcd , 0x83 , PCD_SNG_BUF , 0xb0 );
170
+
171
+ // Configure interrupt vector
172
+ NVIC_SetVector (USBHAL_IRQn , (uint32_t )& _usbisr );
173
+ NVIC_SetPriority (USBHAL_IRQn , 1 );
143
174
144
175
HAL_PCD_Start (& hpcd );
145
176
}
146
177
147
- #endif
178
+ #endif // USBHAL_IP_DEVICE_H
0 commit comments