1+ /*
2+ * Copyright (c) 2024 Arduino SA
3+ *
4+ * SPDX-License-Identifier: Apache-2.0
5+ */
6+
7+ // Make PluggableUSB link happy
8+ #include " api/PluggableUSB.h"
9+
10+ static uint8_t _epBuffer[1 ];
11+ void * epBuffer (unsigned int n) {
12+ return &_epBuffer[n];
13+ };
14+
15+ arduino::PluggableUSB_::PluggableUSB_ () {}
16+
17+ #include < zephyr/devicetree.h>
18+ #include < zephyr/drivers/uart.h>
19+ #include < zephyr/drivers/uart/cdc_acm.h>
20+ #include < zephyr/usb/usb_device.h>
21+ #include < SerialUSB.h>
22+
23+ #if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), cdc_acm)
24+ const struct device *const usb_dev = DEVICE_DT_GET(DT_PHANDLE_BY_IDX(DT_PATH(zephyr_user), cdc_acm, 0 ));
25+
26+ void usb_status_cb (enum usb_dc_status_code cb_status, const uint8_t *param) {
27+ if (cb_status == USB_DC_CONFIGURED) {
28+
29+ }
30+ }
31+
32+ void __attribute__ ((weak)) _on_1200_bps() {
33+ NVIC_SystemReset ();
34+ }
35+
36+ void arduino::SerialUSB_::_baudChangeHandler ()
37+ {
38+ uart_line_ctrl_get (uart, UART_LINE_CTRL_BAUD_RATE, &baudrate);
39+ if (baudrate == 1200 ) {
40+ usb_disable ();
41+ _on_1200_bps ();
42+ }
43+ }
44+
45+ static void _baudChangeHandler (const struct device *dev, uint32_t rate)
46+ {
47+ if (rate == 1200 ) {
48+ usb_disable ();
49+ _on_1200_bps ();
50+ }
51+ }
52+
53+ void arduino::SerialUSB_::_baudChangeDispatch (struct k_timer *timer) {
54+ arduino::SerialUSB_* dev = (arduino::SerialUSB_*)k_timer_user_data_get (timer);
55+ dev->_baudChangeHandler ();
56+ }
57+
58+
59+ void arduino::SerialUSB_::begin (unsigned long baudrate, uint16_t config) {
60+ if (!started) {
61+ usb_enable (NULL );
62+ #ifndef CONFIG_CDC_ACM_DTE_RATE_CALLBACK_SUPPORT
63+ k_timer_init (&baud_timer, SerialUSB_::_baudChangeDispatch, NULL );
64+ k_timer_user_data_set (&baud_timer, this );
65+ k_timer_start (&baud_timer, K_MSEC (100 ), K_MSEC (100 ));
66+ #else
67+ cdc_acm_dte_rate_callback_set (usb_dev, ::_baudChangeHandler);
68+ #endif
69+ ZephyrSerial::begin (baudrate, config);
70+ started = true ;
71+ }
72+ }
73+
74+ arduino::SerialUSB_::operator bool () {
75+ uart_line_ctrl_get (uart, UART_LINE_CTRL_DTR, &dtr);
76+ return dtr;
77+ }
78+
79+ arduino::SerialUSB_ Serial (usb_dev);
80+ #endif
0 commit comments