Skip to content

Commit d98da40

Browse files
authored
Merge pull request #4231 from jamike/USBH0ST_TARGET_STM_HUB_SUPPORT
USBHOST hub support for TARGET_STM
2 parents 444ff09 + c4a0497 commit d98da40

File tree

17 files changed

+775
-476
lines changed

17 files changed

+775
-476
lines changed

features/unsupported/USBHost/USBHost/TARGET_STM/USBEndpoint_STM.cpp

Lines changed: 65 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,17 @@
1919
#include "USBEndpoint.h"
2020
extern uint32_t HAL_HCD_HC_GetMaxPacket(HCD_HandleTypeDef *hhcd, uint8_t chn_num);
2121
extern uint32_t HAL_HCD_HC_GetType(HCD_HandleTypeDef *hhcd, uint8_t chn_num);
22+
extern void HAL_HCD_DisableInt(HCD_HandleTypeDef* hhcd, uint8_t chn_num);
23+
extern void HAL_HCD_EnableInt(HCD_HandleTypeDef* hhcd, uint8_t chn_num);
24+
25+
2226

2327

2428
void USBEndpoint::init(HCED * hced_, ENDPOINT_TYPE type_, ENDPOINT_DIRECTION dir_, uint32_t size, uint8_t ep_number, HCTD* td_list_[2])
2529
{
30+
HCD_HandleTypeDef *hhcd;
31+
uint32_t *addr;
32+
2633
hced = hced_;
2734
type = type_;
2835
dir = dir_;
@@ -46,10 +53,14 @@ void USBEndpoint::init(HCED * hced_, ENDPOINT_TYPE type_, ENDPOINT_DIRECTION dir
4653

4754
td_current = td_list[0];
4855
td_next = td_list[1];
49-
56+
/* remove potential post pending from previous endpoint */
57+
ep_queue.get(0);
5058
intf_nb = 0;
51-
59+
hhcd = (HCD_HandleTypeDef*)hced->hhcd;
60+
addr = &((uint32_t *)hhcd->pData)[hced->ch_num];
61+
*addr = 0;
5262
state = USB_TYPE_IDLE;
63+
speed =false;
5364
}
5465
void USBEndpoint::setSize(uint32_t size)
5566
{
@@ -59,8 +70,16 @@ void USBEndpoint::setSize(uint32_t size)
5970

6071
void USBEndpoint::setDeviceAddress(uint8_t addr)
6172
{
73+
HCD_HandleTypeDef *hhcd;
74+
uint8_t hcd_speed = HCD_SPEED_FULL;
75+
/* fix me : small speed device with hub not supported
76+
if (this->speed) hcd_speed = HCD_SPEED_LOW; */
77+
if (this->speed) {
78+
USB_WARN("small speed device on hub not supported");
79+
}
80+
MBED_ASSERT(HAL_HCD_HC_Init((HCD_HandleTypeDef*)hced->hhcd,hced->ch_num, address, addr, hcd_speed, type, size)!=HAL_BUSY);
6281
this->device_address = addr;
63-
HAL_HCD_HC_Init((HCD_HandleTypeDef*)hced->hhcd,hced->ch_num, address, addr, HCD_SPEED_FULL, type, size);
82+
6483
}
6584

6685
void USBEndpoint::setSpeed(uint8_t speed)
@@ -70,58 +89,82 @@ void USBEndpoint::setSpeed(uint8_t speed)
7089

7190

7291

73-
void USBEndpoint::setState(uint8_t st) {
74-
if (st > 18)
92+
void USBEndpoint::setState(USB_TYPE st)
93+
{
94+
/* modify this state is possible only with a plug */
95+
if (state == USB_TYPE_FREE) {
7596
return;
76-
if (state == USB_TYPE_FREE) HAL_HCD_HC_Halt((HCD_HandleTypeDef*)hced->hhcd, hced->ch_num);
97+
}
98+
99+
state = st;
100+
if (st == USB_TYPE_FREE) {
101+
HCD_HandleTypeDef *hhcd = (HCD_HandleTypeDef*)hced->hhcd;
102+
uint32_t *addr = &((uint32_t *)hhcd->pData)[hced->ch_num];
103+
if ((*addr) && (type != INTERRUPT_ENDPOINT)) {
104+
this->ep_queue.put((uint8_t*)1);
105+
}
106+
MBED_ASSERT(HAL_HCD_HC_Halt((HCD_HandleTypeDef*)hced->hhcd, hced->ch_num)!=HAL_BUSY);
107+
HAL_HCD_DisableInt((HCD_HandleTypeDef*)hced->hhcd, hced->ch_num);
108+
*addr = 0;
77109

78-
state = (USB_TYPE)st;
110+
}
111+
if (st == USB_TYPE_ERROR) {
112+
MBED_ASSERT(HAL_HCD_HC_Halt((HCD_HandleTypeDef*)hced->hhcd, hced->ch_num)!=HAL_BUSY);
113+
HAL_HCD_DisableInt((HCD_HandleTypeDef*)hced->hhcd, hced->ch_num);
114+
115+
}
116+
if (st == USB_TYPE_ERROR) {
117+
uint8_t hcd_speed = HCD_SPEED_FULL;
118+
/* small speed device with hub not supported
119+
if (this->speed) hcd_speed = HCD_SPEED_LOW;*/
120+
MBED_ASSERT(HAL_HCD_HC_Init((HCD_HandleTypeDef*)hced->hhcd,hced->ch_num, address, 0, hcd_speed, type, size)!=HAL_BUSY);
121+
}
79122
}
80123

81124

82125
extern uint32_t HAL_HCD_HC_GetMaxPacket(HCD_HandleTypeDef *hhcd, uint8_t chn_num);
83126
extern uint32_t HAL_HCD_HC_GetType(HCD_HandleTypeDef *hhcd, uint8_t chn_num);
84127

85-
128+
86129
USB_TYPE USBEndpoint::queueTransfer()
87130
{
88131
HCD_HandleTypeDef *hhcd = (HCD_HandleTypeDef*)hced->hhcd;
89132
uint32_t *addr = &((uint32_t *)hhcd->pData)[hced->ch_num];
90133
uint32_t type = HAL_HCD_HC_GetType(hhcd, hced->ch_num);
91134
uint32_t max_size = HAL_HCD_HC_GetMaxPacket(hhcd, hced->ch_num);
92135
/* if a packet is queue on disconnected ; no solution for now */
93-
if(*addr == (uint32_t) -1) {
94-
/* set td as disconnected */
95-
td_current->state = USB_TYPE_DISCONNECTED;
96-
return USB_TYPE_DISCONNECTED;
136+
if (state == USB_TYPE_FREE) {
137+
td_current->state = USB_TYPE_FREE;
138+
return USB_TYPE_FREE;
97139
}
140+
ep_queue.get(0);
98141
MBED_ASSERT(*addr ==0);
99-
if ((type == EP_TYPE_BULK) || (type== EP_TYPE_CTRL)) {
100-
transfer_len = td_current->size <= max_size ? td_current->size : max_size;
101-
transferred = td_current->size;
102-
} else {
103-
transfer_len = td_current->size;
104-
transferred = td_current->size;
105-
MBED_ASSERT(transferred <= (int)max_size);
106-
}
142+
transfer_len = td_current->size <= max_size ? td_current->size : max_size;
107143
buf_start = (uint8_t *)td_current->currBufPtr;
108144

109145
//Now add this free TD at this end of the queue
110146
state = USB_TYPE_PROCESSING;
111147
/* one request */
112148
td_current->nextTD = (hcTd*)0;
113-
149+
#if defined(MAX_NYET_RETRY)
150+
td_current->retry = 0;
151+
#endif
152+
td_current->setup = setup;
114153
*addr = (uint32_t)td_current;
115154
/* dir /setup is inverted for ST */
116155
/* token is useful only ctrl endpoint */
117156
/* last parameter is ping ? */
118157
MBED_ASSERT(HAL_HCD_HC_SubmitRequest((HCD_HandleTypeDef*)hced->hhcd, hced->ch_num, dir-1, type,!setup,(uint8_t*) td_current->currBufPtr, transfer_len, 0)==HAL_OK);
158+
HAL_HCD_EnableInt((HCD_HandleTypeDef*)hced->hhcd, hced->ch_num);
159+
119160
return USB_TYPE_PROCESSING;
120161
}
121162

122163
void USBEndpoint::unqueueTransfer(volatile HCTD * td)
123164
{
124-
165+
if (state==USB_TYPE_FREE) {
166+
return;
167+
}
125168
uint32_t *addr = &((uint32_t *)((HCD_HandleTypeDef*)hced->hhcd)->pData)[hced->ch_num];
126169
td->state=0;
127170
td->currBufPtr=0;

0 commit comments

Comments
 (0)