10 #define PRINTF(...) printf(__VA_ARGS__) 15 static uint8_t usb_ctrl_data_buffer[32];
17 static struct usb_cdc_line_coding usb_line_coding = { 9600, 0x00, 0x00, 0x08 };
18 static uint8_t line_state;
19 static uint8_t events;
20 static struct process *cdc_event_process = NULL;
23 notify_user(uint8_t e)
26 if(cdc_event_process) {
32 encapsulated_command(uint8_t *data,
unsigned int length)
34 PRINTF(
"Got CDC command: length %d\n", length);
35 usb_send_ctrl_status();
38 set_line_encoding(uint8_t *data,
unsigned int length)
42 static const char parity_char[] = {
'N',
'O',
'E',
'M',
'S' };
43 static const char *stop_bits_str[] = {
"1",
"1.5",
"2" };
44 const struct usb_cdc_line_coding *coding =
45 (
const struct usb_cdc_line_coding *)usb_ctrl_data_buffer;
46 char parity = ((coding->bParityType > 4)
47 ?
'?' : parity_char[coding->bParityType]);
49 const char *stop_bits = ((coding->bCharFormat > 2)
50 ?
"?" : stop_bits_str[coding->bCharFormat]);
52 PRINTF(
"Got CDC line coding: %ld/%d/%c/%s\n",
53 coding->dwDTERate, coding->bDataBits, parity, stop_bits);
55 memcpy(&usb_line_coding, data,
sizeof(usb_line_coding));
56 notify_user(USB_CDC_ACM_LINE_CODING);
57 usb_send_ctrl_status();
64 handle_cdc_acm_requests()
66 PRINTF(
"CDC request %02x %02x\n", usb_setup_buffer.bmRequestType,
67 usb_setup_buffer.bRequest);
68 switch (usb_setup_buffer.bmRequestType) {
71 if(usb_setup_buffer.wIndex != 0)
73 switch (usb_setup_buffer.bRequest) {
74 case SET_CONTROL_LINE_STATE:
75 line_state = usb_setup_buffer.wValue;
76 notify_user(USB_CDC_ACM_LINE_STATE);
77 usb_send_ctrl_status();
80 case SEND_ENCAPSULATED_COMMAND:
82 unsigned int len = usb_setup_buffer.wLength;
83 if(len >
sizeof(usb_ctrl_data_buffer))
84 len =
sizeof(usb_ctrl_data_buffer);
85 usb_get_ctrl_data(usb_ctrl_data_buffer, len, encapsulated_command);
93 unsigned int len = usb_setup_buffer.wLength;
94 if(len >
sizeof(usb_ctrl_data_buffer))
95 len =
sizeof(usb_ctrl_data_buffer);
96 usb_get_ctrl_data(usb_ctrl_data_buffer, len, set_line_encoding);
102 if(usb_setup_buffer.wIndex != 0)
104 switch (usb_setup_buffer.bRequest) {
105 case GET_ENCAPSULATED_RESPONSE:
106 PRINTF(
"CDC response");
107 usb_send_ctrl_status();
109 case GET_LINE_CODING:
110 usb_send_ctrl_response((uint8_t *) & usb_line_coding, 7);
117 static const struct USBRequestHandler cdc_acm_request_handler = {
120 handle_cdc_acm_requests
123 static struct USBRequestHandlerHook cdc_acm_request_hook = {
125 &cdc_acm_request_handler
131 usb_register_request_handler(&cdc_acm_request_hook);
135 usb_cdc_acm_get_events(
void)
143 usb_cdc_acm_get_line_state(
void)
148 const struct usb_cdc_line_coding *
149 usb_cdc_acm_get_line_coding(
void)
151 return &usb_line_coding;
155 usb_cdc_acm_set_event_process(
struct process *p)
157 cdc_event_process = p;
void process_poll(struct process *p)
Request a process to be polled.