Skip to content

Commit 8d6bc45

Browse files
committed
usb: refactor USBD_NEXT and implement 1200bps touch
1 parent 99504de commit 8d6bc45

File tree

3 files changed

+37
-49
lines changed

3 files changed

+37
-49
lines changed

cores/arduino/SerialUSB.h

+13-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88

99
#include <zephyrSerial.h>
1010

11+
#if defined(CONFIG_USB_DEVICE_STACK_NEXT)
12+
#include <zephyr/usb/usbd.h>
13+
extern "C" struct usbd_context *usbd_init_device(usbd_msg_cb_t msg_cb);
14+
#endif
15+
1116
namespace arduino {
1217

1318
class SerialUSB_ : public ZephyrSerial {
@@ -22,12 +27,18 @@ class SerialUSB_ : public ZephyrSerial {
2227
protected:
2328
uint32_t dtr = 0;
2429
uint32_t baudrate;
25-
void _baudChangeHandler();
2630
static void _baudChangeDispatch(struct k_timer *timer);
31+
static void _baudChangeHandler(const struct device *dev, uint32_t rate);
2732

2833
private:
29-
struct k_timer baud_timer;
3034
bool started = false;
35+
36+
#if defined(CONFIG_USB_DEVICE_STACK_NEXT)
37+
struct usbd_context *_usbd;
38+
int enable_usb_device_next();
39+
static void usbd_next_cb(struct usbd_context *const ctx, const struct usbd_msg *msg);
40+
static int usb_disable();
41+
#endif
3142
};
3243
} // namespace arduino
3344

cores/arduino/USB.cpp

+23-46
Original file line numberDiff line numberDiff line change
@@ -23,61 +23,46 @@ void __attribute__((weak)) _on_1200_bps() {
2323
NVIC_SystemReset();
2424
}
2525

26-
void arduino::SerialUSB_::_baudChangeHandler()
27-
{
28-
uart_line_ctrl_get(uart, UART_LINE_CTRL_BAUD_RATE, &baudrate);
29-
if (baudrate == 1200) {
30-
usb_disable();
31-
_on_1200_bps();
32-
}
33-
}
34-
35-
static void _baudChangeHandler(const struct device *dev, uint32_t rate)
26+
void arduino::SerialUSB_::_baudChangeHandler(const struct device *dev, uint32_t rate)
3627
{
3728
if (rate == 1200) {
29+
k_sleep(K_MSEC(100));
3830
usb_disable();
31+
k_sleep(K_MSEC(10));
3932
_on_1200_bps();
4033
}
4134
}
4235

4336
#if defined(CONFIG_USB_DEVICE_STACK_NEXT)
4437

45-
extern "C" {
46-
#include <zephyr/usb/usbd.h>
47-
struct usbd_context *usbd_init_device(usbd_msg_cb_t msg_cb);
38+
int arduino::SerialUSB_::usb_disable() {
39+
return usbd_disable(Serial._usbd);
4840
}
4941

50-
struct usbd_context *_usbd;
51-
52-
int usb_disable() {
53-
return usbd_disable(_usbd);
54-
}
55-
56-
static void usbd_next_cb(struct usbd_context *const ctx, const struct usbd_msg *msg)
42+
void arduino::SerialUSB_::usbd_next_cb(struct usbd_context *const ctx, const struct usbd_msg *msg)
5743
{
58-
if (usbd_can_detect_vbus(ctx)) {
59-
if (msg->type == USBD_MSG_VBUS_READY) {
60-
usbd_enable(ctx);
61-
}
62-
63-
if (msg->type == USBD_MSG_VBUS_REMOVED) {
64-
usbd_disable(ctx);
65-
}
66-
}
44+
if (usbd_can_detect_vbus(ctx)) {
45+
if (msg->type == USBD_MSG_VBUS_READY) {
46+
usbd_enable(ctx);
47+
}
48+
49+
if (msg->type == USBD_MSG_VBUS_REMOVED) {
50+
usbd_disable(ctx);
51+
}
52+
}
6753

68-
if (msg->type == USBD_MSG_CDC_ACM_LINE_CODING) {
54+
if (msg->type == USBD_MSG_CDC_ACM_LINE_CODING) {
6955
uint32_t baudrate;
70-
uart_line_ctrl_get(ctx->dev, UART_LINE_CTRL_BAUD_RATE, &baudrate);
71-
_baudChangeHandler(nullptr, baudrate);
72-
}
56+
uart_line_ctrl_get(Serial.uart, UART_LINE_CTRL_BAUD_RATE, &baudrate);
57+
Serial._baudChangeHandler(nullptr, baudrate);
58+
}
7359
}
7460

75-
static int enable_usb_device_next(void)
61+
int arduino::SerialUSB_::enable_usb_device_next(void)
7662
{
7763
int err;
7864

79-
//_usbd = usbd_init_device(usbd_next_cb);
80-
_usbd = usbd_init_device(nullptr);
65+
_usbd = usbd_init_device(arduino::SerialUSB_::usbd_next_cb);
8166
if (_usbd == NULL) {
8267
return -ENODEV;
8368
}
@@ -92,22 +77,14 @@ static int enable_usb_device_next(void)
9277
}
9378
#endif /* defined(CONFIG_USB_DEVICE_STACK_NEXT) */
9479

95-
void arduino::SerialUSB_::_baudChangeDispatch(struct k_timer *timer) {
96-
arduino::SerialUSB_* dev = (arduino::SerialUSB_*)k_timer_user_data_get(timer);
97-
dev->_baudChangeHandler();
98-
}
99-
100-
10180
void arduino::SerialUSB_::begin(unsigned long baudrate, uint16_t config) {
10281
if (!started) {
10382
#ifndef CONFIG_USB_DEVICE_STACK_NEXT
10483
usb_enable(NULL);
10584
#ifndef CONFIG_CDC_ACM_DTE_RATE_CALLBACK_SUPPORT
106-
k_timer_init(&baud_timer, SerialUSB_::_baudChangeDispatch, NULL);
107-
k_timer_user_data_set(&baud_timer, this);
108-
k_timer_start(&baud_timer, K_MSEC(100), K_MSEC(100));
85+
#warning "Can't read CDC baud change, please enable CONFIG_CDC_ACM_DTE_RATE_CALLBACK_SUPPORT"
10986
#else
110-
cdc_acm_dte_rate_callback_set(usb_dev, ::_baudChangeHandler);
87+
cdc_acm_dte_rate_callback_set(usb_dev, SerialUSB_::_baudChangeHandler);
11188
#endif
11289
#else
11390
enable_usb_device_next();

cores/arduino/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ void __attribute__((weak))initVariant(void) {
2323

2424

2525
int main(void) {
26-
#if (DT_NODE_HAS_PROP(DT_PATH(zephyr_user), cdc_acm) && CONFIG_USB_CDC_ACM)
26+
#if (DT_NODE_HAS_PROP(DT_PATH(zephyr_user), cdc_acm) && (CONFIG_USB_CDC_ACM || CONFIG_USBD_CDC_ACM_CLASS))
2727
Serial.begin(115200);
2828
#endif
2929

0 commit comments

Comments
 (0)