Contiki 2.6
|
00001 #include <cdc-acm.h> 00002 #include <cdc.h> 00003 #include <usb-api.h> 00004 #include <usb-core.h> 00005 #include <stdio.h> 00006 00007 static uint8_t usb_ctrl_data_buffer[32]; 00008 00009 static void 00010 encapsulated_command(uint8_t *data, unsigned int length) 00011 { 00012 printf("Got CDC command: length %d\n", length); 00013 usb_send_ctrl_status(); 00014 } 00015 static void 00016 set_line_encoding(uint8_t *data, unsigned int length) 00017 { 00018 if (length == 7) { 00019 static const char parity_char[] = {'N', 'O', 'E', 'M', 'S'}; 00020 static const char *stop_bits_str[] = {"1","1.5","2"}; 00021 const struct usb_cdc_line_coding *coding = 00022 (const struct usb_cdc_line_coding *)usb_ctrl_data_buffer; 00023 char parity = ((coding->bParityType > 4) 00024 ? '?' : parity_char[coding->bParityType]); 00025 const char *stop_bits = ((coding->bCharFormat > 2) 00026 ? "?" : stop_bits_str[coding->bCharFormat]); 00027 printf("Got CDC line coding: %ld/%d/%c/%s\n", 00028 coding->dwDTERate, coding->bDataBits, parity, stop_bits); 00029 usb_send_ctrl_status(); 00030 } else { 00031 usb_error_stall(); 00032 } 00033 } 00034 00035 static unsigned int 00036 handle_cdc_acm_requests() 00037 { 00038 printf("CDC request %02x %02x\n", usb_setup_buffer.bmRequestType, usb_setup_buffer.bRequest); 00039 switch(usb_setup_buffer.bmRequestType) { 00040 case 0x21: /* CDC interface OUT requests */ 00041 /* Check if it's the right interface */ 00042 if (usb_setup_buffer.wIndex != 0) return 0; 00043 switch(usb_setup_buffer.bRequest) { 00044 case SET_CONTROL_LINE_STATE: 00045 if (usb_setup_buffer.wValue & 0x02) { 00046 puts("Carrier on"); 00047 } else { 00048 puts("Carrier off"); 00049 } 00050 if (usb_setup_buffer.wValue & 0x01) { 00051 puts("DTE on"); 00052 } else { 00053 puts("DTE off"); 00054 } 00055 usb_send_ctrl_status(); 00056 return 1; 00057 00058 case SEND_ENCAPSULATED_COMMAND: 00059 { 00060 unsigned int len = usb_setup_buffer.wLength; 00061 if (len > sizeof(usb_ctrl_data_buffer)) 00062 len = sizeof(usb_ctrl_data_buffer); 00063 usb_get_ctrl_data(usb_ctrl_data_buffer, len, 00064 encapsulated_command); 00065 } 00066 00067 return 1; 00068 00069 00070 case SET_LINE_CODING: 00071 { 00072 unsigned int len = usb_setup_buffer.wLength; 00073 if (len > sizeof(usb_ctrl_data_buffer)) 00074 len = sizeof(usb_ctrl_data_buffer); 00075 usb_get_ctrl_data(usb_ctrl_data_buffer, len, 00076 set_line_encoding); 00077 } 00078 return 1; 00079 } 00080 break; 00081 case 0xa1: /* CDC interface IN requests */ 00082 if (usb_setup_buffer.wIndex != 0) return 0; 00083 switch(usb_setup_buffer.bRequest) { 00084 case GET_ENCAPSULATED_RESPONSE: 00085 printf("CDC response"); 00086 usb_send_ctrl_status(); 00087 return 1; 00088 } 00089 } 00090 return 0; 00091 } 00092 00093 static const struct USBRequestHandler cdc_acm_request_handler = 00094 { 00095 0x21, 0x7f, 00096 0x00, 0x00, 00097 handle_cdc_acm_requests 00098 }; 00099 00100 static struct USBRequestHandlerHook cdc_acm_request_hook = 00101 { 00102 NULL, 00103 &cdc_acm_request_handler 00104 }; 00105 00106 void 00107 usb_cdc_acm_setup() 00108 { 00109 usb_register_request_handler(&cdc_acm_request_hook); 00110 }