Skip to content

Commit 309b9ae

Browse files
committed
USBHOST TARGET_STM : changes for hub support
1 parent c860377 commit 309b9ae

File tree

2 files changed

+194
-103
lines changed

2 files changed

+194
-103
lines changed

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

Lines changed: 62 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,13 @@ 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+
MBED_ASSERT(HAL_HCD_HC_Init((HCD_HandleTypeDef*)hced->hhcd,hced->ch_num, address, addr, hcd_speed, type, size)!=HAL_BUSY);
6278
this->device_address = addr;
63-
HAL_HCD_HC_Init((HCD_HandleTypeDef*)hced->hhcd,hced->ch_num, address, addr, HCD_SPEED_FULL, type, size);
79+
6480
}
6581

6682
void USBEndpoint::setSpeed(uint8_t speed)
@@ -70,58 +86,82 @@ void USBEndpoint::setSpeed(uint8_t speed)
7086

7187

7288

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

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

81121

82122
extern uint32_t HAL_HCD_HC_GetMaxPacket(HCD_HandleTypeDef *hhcd, uint8_t chn_num);
83123
extern uint32_t HAL_HCD_HC_GetType(HCD_HandleTypeDef *hhcd, uint8_t chn_num);
84124

85-
125+
86126
USB_TYPE USBEndpoint::queueTransfer()
87127
{
88128
HCD_HandleTypeDef *hhcd = (HCD_HandleTypeDef*)hced->hhcd;
89129
uint32_t *addr = &((uint32_t *)hhcd->pData)[hced->ch_num];
90130
uint32_t type = HAL_HCD_HC_GetType(hhcd, hced->ch_num);
91131
uint32_t max_size = HAL_HCD_HC_GetMaxPacket(hhcd, hced->ch_num);
92132
/* 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;
133+
if (state == USB_TYPE_FREE) {
134+
td_current->state = USB_TYPE_FREE;
135+
return USB_TYPE_FREE;
97136
}
137+
ep_queue.get(0);
98138
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-
}
139+
transfer_len = td_current->size <= max_size ? td_current->size : max_size;
107140
buf_start = (uint8_t *)td_current->currBufPtr;
108141

109142
//Now add this free TD at this end of the queue
110143
state = USB_TYPE_PROCESSING;
111144
/* one request */
112145
td_current->nextTD = (hcTd*)0;
113-
146+
#if defined(MAX_NYET_RETRY)
147+
td_current->retry = 0;
148+
#endif
149+
td_current->setup = setup;
114150
*addr = (uint32_t)td_current;
115151
/* dir /setup is inverted for ST */
116152
/* token is useful only ctrl endpoint */
117153
/* last parameter is ping ? */
118154
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);
155+
HAL_HCD_EnableInt((HCD_HandleTypeDef*)hced->hhcd, hced->ch_num);
156+
119157
return USB_TYPE_PROCESSING;
120158
}
121159

122160
void USBEndpoint::unqueueTransfer(volatile HCTD * td)
123161
{
124-
162+
if (state==USB_TYPE_FREE) {
163+
return;
164+
}
125165
uint32_t *addr = &((uint32_t *)((HCD_HandleTypeDef*)hced->hhcd)->pData)[hced->ch_num];
126166
td->state=0;
127167
td->currBufPtr=0;

0 commit comments

Comments
 (0)