summaryrefslogtreecommitdiff
path: root/src/class/cdc/cdc_device.c
diff options
context:
space:
mode:
authorHiFiPhile <[email protected]>2024-04-12 01:15:46 +0200
committerHiFiPhile <[email protected]>2024-04-26 00:17:50 +0200
commit67f32da1b9a460262e028784ffb0386edd507612 (patch)
treea464e630789afcac8697757c001dec071528d004 /src/class/cdc/cdc_device.c
parent8b4ca69e56860e12596e2bef63fc155f8dce338c (diff)
cdc: add uart status notification support.
Diffstat (limited to 'src/class/cdc/cdc_device.c')
-rw-r--r--src/class/cdc/cdc_device.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/class/cdc/cdc_device.c b/src/class/cdc/cdc_device.c
index e856963f5..5057805e2 100644
--- a/src/class/cdc/cdc_device.c
+++ b/src/class/cdc/cdc_device.c
@@ -71,6 +71,7 @@ typedef struct
OSAL_MUTEX_DEF(tx_ff_mutex);
// Endpoint Transfer buffer
+ CFG_TUSB_MEM_ALIGN cdc_notif_serial_state_t serial_state_buf;
CFG_TUSB_MEM_ALIGN uint8_t epout_buf[CFG_TUD_CDC_EP_BUFSIZE];
CFG_TUSB_MEM_ALIGN uint8_t epin_buf[CFG_TUD_CDC_EP_BUFSIZE];
@@ -130,6 +131,27 @@ void tud_cdc_n_get_line_coding (uint8_t itf, cdc_line_coding_t* coding)
(*coding) = _cdcd_itf[itf].line_coding;
}
+bool tud_cdc_n_send_uart_state (uint8_t itf, cdc_uart_state_t state)
+{
+ cdcd_interface_t* p_cdc = &_cdcd_itf[itf];
+
+ // Skip if usb is not ready yet
+ TU_VERIFY( tud_ready(), 0 );
+
+ // claim endpoint
+ TU_VERIFY(usbd_edpt_claim(p_cdc->rhport, p_cdc->ep_notif));
+
+ p_cdc->serial_state_buf.bmRequestType = CDC_REQ_TYPE_NOTIF;
+ p_cdc->serial_state_buf.bNotification = CDC_NOTIF_SERIAL_STATE;
+ p_cdc->serial_state_buf.wValue = 0;
+ p_cdc->serial_state_buf.wIndex = p_cdc->itf_num;
+ p_cdc->serial_state_buf.wLength = 2;
+ p_cdc->serial_state_buf.bmUartState = state;
+
+ // transfer
+ return usbd_edpt_xfer(p_cdc->rhport, p_cdc->ep_notif, (uint8_t *)&p_cdc->serial_state_buf, sizeof(p_cdc->serial_state_buf));
+}
+
void tud_cdc_n_set_wanted_char (uint8_t itf, char wanted)
{
_cdcd_itf[itf].wanted_char = wanted;
@@ -457,7 +479,7 @@ bool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_
for (itf = 0; itf < CFG_TUD_CDC; itf++)
{
p_cdc = &_cdcd_itf[itf];
- if ( ( ep_addr == p_cdc->ep_out ) || ( ep_addr == p_cdc->ep_in ) ) break;
+ if ( ( ep_addr == p_cdc->ep_out ) || ( ep_addr == p_cdc->ep_in ) || ( ep_addr == p_cdc->ep_notif )) break;
}
TU_ASSERT(itf < CFG_TUD_CDC);