fix issue with ftdi host driver with status bytes

add workflow_dispatch to all ci workflow
This commit is contained in:
hathach 2023-05-25 16:53:32 +07:00
parent 625c27ca58
commit 26d05d7fc9
No known key found for this signature in database
GPG Key ID: F5D50C6D51D17CBA
11 changed files with 37 additions and 25 deletions

View File

@ -1,6 +1,7 @@
name: Build AArch64 name: Build AArch64
on: on:
workflow_dispatch:
push: push:
paths: paths:
- 'src/**' - 'src/**'

View File

@ -1,6 +1,7 @@
name: Build ARM name: Build ARM
on: on:
workflow_dispatch:
push: push:
paths: paths:
- 'src/**' - 'src/**'

View File

@ -1,6 +1,7 @@
name: Build ESP name: Build ESP
on: on:
workflow_dispatch:
push: push:
paths: paths:
- 'src/**' - 'src/**'

View File

@ -1,6 +1,7 @@
name: Build IAR name: Build IAR
on: on:
workflow_dispatch:
push: push:
paths: paths:
- 'src/**' - 'src/**'

View File

@ -1,6 +1,7 @@
name: Build MSP430 name: Build MSP430
on: on:
workflow_dispatch:
push: push:
paths: paths:
- 'src/**' - 'src/**'

View File

@ -1,6 +1,7 @@
name: Build Renesas name: Build Renesas
on: on:
workflow_dispatch:
push: push:
paths: paths:
- 'src/**' - 'src/**'

View File

@ -1,6 +1,7 @@
name: Build RISC-V name: Build RISC-V
on: on:
workflow_dispatch:
push: push:
paths: paths:
- 'src/**' - 'src/**'

View File

@ -1,6 +1,7 @@
name: Build Windows/MacOS name: Build Windows/MacOS
on: on:
workflow_dispatch:
push: push:
paths: paths:
- 'src/**' - 'src/**'

View File

@ -1,5 +1,6 @@
name: CIFuzz name: CIFuzz
on: on:
workflow_dispatch:
pull_request: pull_request:
branches: branches:
- master - master

View File

@ -550,8 +550,7 @@ void cdch_close(uint8_t daddr)
} }
} }
bool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes) bool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes) {
{
// TODO handle stall response, retry failed transfer ... // TODO handle stall response, retry failed transfer ...
TU_ASSERT(event == XFER_RESULT_SUCCESS); TU_ASSERT(event == XFER_RESULT_SUCCESS);
@ -559,41 +558,40 @@ bool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t
cdch_interface_t * p_cdc = get_itf(idx); cdch_interface_t * p_cdc = get_itf(idx);
TU_ASSERT(p_cdc); TU_ASSERT(p_cdc);
if ( ep_addr == p_cdc->stream.tx.ep_addr ) if ( ep_addr == p_cdc->stream.tx.ep_addr ) {
{
// invoke tx complete callback to possibly refill tx fifo // invoke tx complete callback to possibly refill tx fifo
if (tuh_cdc_tx_complete_cb) tuh_cdc_tx_complete_cb(idx); if (tuh_cdc_tx_complete_cb) tuh_cdc_tx_complete_cb(idx);
if ( 0 == tu_edpt_stream_write_xfer(&p_cdc->stream.tx) ) if ( 0 == tu_edpt_stream_write_xfer(&p_cdc->stream.tx) ) {
{
// If there is no data left, a ZLP should be sent if: // If there is no data left, a ZLP should be sent if:
// - xferred_bytes is multiple of EP Packet size and not zero // - xferred_bytes is multiple of EP Packet size and not zero
tu_edpt_stream_write_zlp_if_needed(&p_cdc->stream.tx, xferred_bytes); tu_edpt_stream_write_zlp_if_needed(&p_cdc->stream.tx, xferred_bytes);
} }
} }
else if ( ep_addr == p_cdc->stream.rx.ep_addr ) else if ( ep_addr == p_cdc->stream.rx.ep_addr ) {
{
tu_edpt_stream_read_xfer_complete(&p_cdc->stream.rx, xferred_bytes);
#if CFG_TUH_CDC_FTDI #if CFG_TUH_CDC_FTDI
// FTDI reserve 2 bytes for status
if (p_cdc->serial_drid == SERIAL_DRIVER_FTDI) { if (p_cdc->serial_drid == SERIAL_DRIVER_FTDI) {
uint8_t status[2]; // FTDI reserve 2 bytes for status
tu_edpt_stream_read(&p_cdc->stream.rx, status, 2); // FTDI status
(void) status; // TODO handle status // uint8_t status[2] = {
} // p_cdc->stream.rx.ep_buf[0],
// p_cdc->stream.rx.ep_buf[1]
// };
tu_edpt_stream_read_xfer_complete_offset(&p_cdc->stream.rx, xferred_bytes, 2);
}else
#endif #endif
{
tu_edpt_stream_read_xfer_complete(&p_cdc->stream.rx, xferred_bytes);
}
// invoke receive callback // invoke receive callback
if (tuh_cdc_rx_cb) tuh_cdc_rx_cb(idx); if (tuh_cdc_rx_cb) tuh_cdc_rx_cb(idx);
// prepare for next transfer if needed // prepare for next transfer if needed
tu_edpt_stream_read_xfer(&p_cdc->stream.rx); tu_edpt_stream_read_xfer(&p_cdc->stream.rx);
}else if ( ep_addr == p_cdc->ep_notif ) }else if ( ep_addr == p_cdc->ep_notif ) {
{
// TODO handle notification endpoint // TODO handle notification endpoint
}else }else {
{
TU_ASSERT(false); TU_ASSERT(false);
} }

View File

@ -148,21 +148,26 @@ uint32_t tu_edpt_stream_read_xfer(tu_edpt_stream_t* s);
// Must be called in the transfer complete callback // Must be called in the transfer complete callback
TU_ATTR_ALWAYS_INLINE static inline TU_ATTR_ALWAYS_INLINE static inline
void tu_edpt_stream_read_xfer_complete(tu_edpt_stream_t* s, uint32_t xferred_bytes) void tu_edpt_stream_read_xfer_complete(tu_edpt_stream_t* s, uint32_t xferred_bytes) {
{
tu_fifo_write_n(&s->ff, s->ep_buf, (uint16_t) xferred_bytes); tu_fifo_write_n(&s->ff, s->ep_buf, (uint16_t) xferred_bytes);
} }
// Same as tu_edpt_stream_read_xfer_complete but skip the first n bytes
TU_ATTR_ALWAYS_INLINE static inline
void tu_edpt_stream_read_xfer_complete_offset(tu_edpt_stream_t* s, uint32_t xferred_bytes, uint32_t skip_offset) {
if (skip_offset < xferred_bytes) {
tu_fifo_write_n(&s->ff, s->ep_buf + skip_offset, (uint16_t) (xferred_bytes - skip_offset));
}
}
// Get the number of bytes available for reading // Get the number of bytes available for reading
TU_ATTR_ALWAYS_INLINE static inline TU_ATTR_ALWAYS_INLINE static inline
uint32_t tu_edpt_stream_read_available(tu_edpt_stream_t* s) uint32_t tu_edpt_stream_read_available(tu_edpt_stream_t* s) {
{
return (uint32_t) tu_fifo_count(&s->ff); return (uint32_t) tu_fifo_count(&s->ff);
} }
TU_ATTR_ALWAYS_INLINE static inline TU_ATTR_ALWAYS_INLINE static inline
bool tu_edpt_stream_peek(tu_edpt_stream_t* s, uint8_t* ch) bool tu_edpt_stream_peek(tu_edpt_stream_t* s, uint8_t* ch) {
{
return tu_fifo_peek(&s->ff, ch); return tu_fifo_peek(&s->ff, ch);
} }