9 #define PRINTF(...) printf(__VA_ARGS__)
14 static uint8_t usb_ctrl_data_buffer[32];
16 static struct usb_cdc_line_coding usb_line_coding = { 9600, 0x00, 0x00, 0x08 };
17 static uint8_t line_state;
18 static uint8_t events;
19 static struct process *cdc_event_process =
NULL;
22 notify_user(uint8_t e)
25 if(cdc_event_process) {
31 encapsulated_command(uint8_t *data,
unsigned int length)
33 PRINTF(
"Got CDC command: length %d\n", length);
34 usb_send_ctrl_status();
37 set_line_encoding(uint8_t *data,
unsigned int length)
41 static const char parity_char[] = {
'N',
'O',
'E',
'M',
'S' };
42 static const char *stop_bits_str[] = {
"1",
"1.5",
"2" };
43 const struct usb_cdc_line_coding *coding =
44 (
const struct usb_cdc_line_coding *)usb_ctrl_data_buffer;
45 char parity = ((coding->bParityType > 4)
46 ?
'?' : parity_char[coding->bParityType]);
48 const char *stop_bits = ((coding->bCharFormat > 2)
49 ?
"?" : stop_bits_str[coding->bCharFormat]);
51 PRINTF(
"Got CDC line coding: %ld/%d/%c/%s\n",
52 coding->dwDTERate, coding->bDataBits, parity, stop_bits);
54 memcpy(&usb_line_coding, data,
sizeof(usb_line_coding));
55 notify_user(USB_CDC_ACM_LINE_CODING);
56 usb_send_ctrl_status();
63 handle_cdc_acm_requests()
65 PRINTF(
"CDC request %02x %02x\n", usb_setup_buffer.bmRequestType,
66 usb_setup_buffer.bRequest);
67 switch (usb_setup_buffer.bmRequestType) {
70 if(usb_setup_buffer.wIndex != 0)
72 switch (usb_setup_buffer.bRequest) {
73 case SET_CONTROL_LINE_STATE:
74 line_state = usb_setup_buffer.wValue;
75 notify_user(USB_CDC_ACM_LINE_STATE);
76 usb_send_ctrl_status();
79 case SEND_ENCAPSULATED_COMMAND:
81 unsigned int len = usb_setup_buffer.wLength;
82 if(len >
sizeof(usb_ctrl_data_buffer))
83 len =
sizeof(usb_ctrl_data_buffer);
84 usb_get_ctrl_data(usb_ctrl_data_buffer, len, encapsulated_command);
92 unsigned int len = usb_setup_buffer.wLength;
93 if(len >
sizeof(usb_ctrl_data_buffer))
94 len =
sizeof(usb_ctrl_data_buffer);
95 usb_get_ctrl_data(usb_ctrl_data_buffer, len, set_line_encoding);
101 if(usb_setup_buffer.wIndex != 0)
103 switch (usb_setup_buffer.bRequest) {
104 case GET_ENCAPSULATED_RESPONSE:
105 PRINTF(
"CDC response");
106 usb_send_ctrl_status();
108 case GET_LINE_CODING:
109 usb_send_ctrl_response((uint8_t *) & usb_line_coding, 7);
116 static const struct USBRequestHandler cdc_acm_request_handler = {
119 handle_cdc_acm_requests
122 static struct USBRequestHandlerHook cdc_acm_request_hook = {
124 &cdc_acm_request_handler
130 usb_register_request_handler(&cdc_acm_request_hook);
134 usb_cdc_acm_get_events(
void)
142 usb_cdc_acm_get_line_state(
void)
147 const struct usb_cdc_line_coding *
148 usb_cdc_acm_get_line_coding(
void)
150 return &usb_line_coding;
154 usb_cdc_acm_set_event_process(
struct process *p)
156 cdc_event_process = p;
void process_poll(struct process *p)
Request a process to be polled.
#define NULL
The null pointer.