mirror of
https://github.com/hathach/tinyusb.git
synced 2025-02-19 15:40:41 +00:00
Merge pull request #181 from pigrew/ST_FSDEV_EP0
ST FSDEV EP0 left in stall
This commit is contained in:
commit
d84a31fd5f
@ -1,9 +1,10 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import visa
|
import visa
|
||||||
import time
|
import time
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def test_idn():
|
def test_idn():
|
||||||
idn = inst.query("*idn?");
|
idn = inst.query("*idn?");
|
||||||
assert (idn == "TinyUSB,ModelNumber,SerialNumber,FirmwareVer123456\r\n")
|
assert (idn == "TinyUSB,ModelNumber,SerialNumber,FirmwareVer123456\r\n")
|
||||||
@ -129,6 +130,18 @@ def test_multi_read():
|
|||||||
assert (x + "\r\n" == y)
|
assert (x + "\r\n" == y)
|
||||||
#inst.chunk_size = old_chunk_size
|
#inst.chunk_size = old_chunk_size
|
||||||
|
|
||||||
|
def test_stall_ep0():
|
||||||
|
usb_iface = inst.get_visa_attribute(visa.constants.VI_ATTR_USB_INTFC_NUM)
|
||||||
|
inst.read_stb()
|
||||||
|
# This is an invalid request, should create stall.
|
||||||
|
try:
|
||||||
|
retv = inst.control_in(request_type_bitmap_field=0xA1, request_id=60, request_value=0x0000, index=usb_iface, length=0x0001)
|
||||||
|
assert false
|
||||||
|
except visa.VisaIOError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
assert (inst.read_stb() == 0)
|
||||||
|
|
||||||
|
|
||||||
rm = visa.ResourceManager("/c/Windows/system32/visa64.dll")
|
rm = visa.ResourceManager("/c/Windows/system32/visa64.dll")
|
||||||
reslist = rm.list_resources("USB?::?*::INSTR")
|
reslist = rm.list_resources("USB?::?*::INSTR")
|
||||||
@ -171,6 +184,9 @@ test_echo(165,170)
|
|||||||
print("+ Read timeout (no MAV)")
|
print("+ Read timeout (no MAV)")
|
||||||
test_read_timeout()
|
test_read_timeout()
|
||||||
|
|
||||||
|
print("+ Test EP0 stall recovery")
|
||||||
|
test_stall_ep0()
|
||||||
|
|
||||||
print("+ MAV")
|
print("+ MAV")
|
||||||
test_mav()
|
test_mav()
|
||||||
|
|
||||||
|
@ -252,7 +252,9 @@ void dcd_init (uint8_t rhport)
|
|||||||
void dcd_int_enable (uint8_t rhport)
|
void dcd_int_enable (uint8_t rhport)
|
||||||
{
|
{
|
||||||
(void)rhport;
|
(void)rhport;
|
||||||
|
// Member here forces write to RAM before allowing ISR to execute
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
#if CFG_TUSB_MCU == OPT_MCU_STM32F0 || CFG_TUSB_MCU == OPT_MCU_STM32L0
|
#if CFG_TUSB_MCU == OPT_MCU_STM32F0 || CFG_TUSB_MCU == OPT_MCU_STM32L0
|
||||||
NVIC_EnableIRQ(USB_IRQn);
|
NVIC_EnableIRQ(USB_IRQn);
|
||||||
#elif CFG_TUSB_MCU == OPT_MCU_STM32F3
|
#elif CFG_TUSB_MCU == OPT_MCU_STM32F3
|
||||||
@ -276,10 +278,7 @@ void dcd_int_disable(uint8_t rhport)
|
|||||||
#else
|
#else
|
||||||
#error Unknown arch in USB driver
|
#error Unknown arch in USB driver
|
||||||
#endif
|
#endif
|
||||||
// I'm not convinced that memory synchronization is completely necessary, but
|
// CMSIS has a membar after disabling interrupts
|
||||||
// it isn't a bad idea.
|
|
||||||
__DSB();
|
|
||||||
__ISB();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Receive Set Address request, mcu port must also include status IN response
|
// Receive Set Address request, mcu port must also include status IN response
|
||||||
@ -419,10 +418,15 @@ static uint16_t dcd_ep_ctr_handler(void)
|
|||||||
uint8_t userMemBuf[8];
|
uint8_t userMemBuf[8];
|
||||||
/* Get SETUP Packet*/
|
/* Get SETUP Packet*/
|
||||||
count = pcd_get_ep_rx_cnt(USB, EPindex);
|
count = pcd_get_ep_rx_cnt(USB, EPindex);
|
||||||
//TU_ASSERT_ERR(count == 8);
|
if(count == 8) // Setup packet should always be 8 bytes. If not, ignore it, and try again.
|
||||||
dcd_read_packet_memory(userMemBuf, *pcd_ep_rx_address_ptr(USB,EPindex), 8);
|
{
|
||||||
|
// Must reset EP to NAK (in case it had been stalling) (though, maybe too late here)
|
||||||
|
pcd_set_ep_rx_status(USB,0u,USB_EP_RX_NAK);
|
||||||
|
pcd_set_ep_tx_status(USB,0u,USB_EP_TX_NAK);
|
||||||
|
dcd_read_packet_memory(userMemBuf, *pcd_ep_rx_address_ptr(USB,EPindex), 8);
|
||||||
|
dcd_event_setup_received(0, (uint8_t*)userMemBuf, true);
|
||||||
|
}
|
||||||
/* SETUP bit kept frozen while CTR_RX = 1*/
|
/* SETUP bit kept frozen while CTR_RX = 1*/
|
||||||
dcd_event_setup_received(0, (uint8_t*)userMemBuf, true);
|
|
||||||
pcd_clear_rx_ep_ctr(USB, EPindex);
|
pcd_clear_rx_ep_ctr(USB, EPindex);
|
||||||
}
|
}
|
||||||
else if ((wEPVal & USB_EP_CTR_RX) != 0U) // OUT
|
else if ((wEPVal & USB_EP_CTR_RX) != 0U) // OUT
|
||||||
@ -440,10 +444,6 @@ static uint16_t dcd_ep_ctr_handler(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Process Control Data OUT status Packet*/
|
/* Process Control Data OUT status Packet*/
|
||||||
if(EPindex == 0u && xfer->total_len == 0u)
|
|
||||||
{
|
|
||||||
pcd_clear_ep_kind(USB,0); // Good, so allow non-zero length packets now.
|
|
||||||
}
|
|
||||||
dcd_event_xfer_complete(0, EPindex, xfer->total_len, XFER_RESULT_SUCCESS, true);
|
dcd_event_xfer_complete(0, EPindex, xfer->total_len, XFER_RESULT_SUCCESS, true);
|
||||||
|
|
||||||
pcd_set_ep_rx_cnt(USB, EPindex, CFG_TUD_ENDPOINT0_SIZE);
|
pcd_set_ep_rx_cnt(USB, EPindex, CFG_TUD_ENDPOINT0_SIZE);
|
||||||
@ -627,7 +627,9 @@ bool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc
|
|||||||
}
|
}
|
||||||
|
|
||||||
pcd_set_ep_address(USB, epnum, epnum);
|
pcd_set_ep_address(USB, epnum, epnum);
|
||||||
pcd_clear_ep_kind(USB,0); // Be normal, for now, instead of only accepting zero-byte packets
|
// Be normal, for now, instead of only accepting zero-byte packets (on control endpoint)
|
||||||
|
// or being double-buffered (bulk endpoints)
|
||||||
|
pcd_clear_ep_kind(USB,0);
|
||||||
|
|
||||||
if(dir == TUSB_DIR_IN)
|
if(dir == TUSB_DIR_IN)
|
||||||
{
|
{
|
||||||
@ -688,7 +690,6 @@ bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t
|
|||||||
if (epnum == 0 && buffer == NULL)
|
if (epnum == 0 && buffer == NULL)
|
||||||
{
|
{
|
||||||
xfer->buffer = (uint8_t*)_setup_packet;
|
xfer->buffer = (uint8_t*)_setup_packet;
|
||||||
pcd_set_ep_kind(USB,0); // Expect a zero-byte INPUT
|
|
||||||
}
|
}
|
||||||
if(total_bytes > xfer->max_packet_size)
|
if(total_bytes > xfer->max_packet_size)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user