45 #include "usb/common/usb-api.h"
46 #include "usb/common/cdc-acm/cdc-acm.h"
47 #include "usb/common/usb.h"
48 #include "usb/common/usb-arch.h"
54 } lang_id = {
sizeof(lang_id), 3, 0x0409 };
60 } string_serial_nr = {
61 sizeof(string_serial_nr),
63 'A',
'A',
'A',
'A',
'A',
'A',
'A',
'A',
64 'A',
'A',
'A',
'A',
'A',
'A',
'A',
'A'
72 } string_manufacturer = {
73 sizeof(string_manufacturer),
76 'T',
'e',
'x',
'a',
's',
' ',
77 'I',
'n',
's',
't',
'r',
'u',
'm',
'e',
'n',
't',
's'
86 sizeof(string_product),
88 'C',
'C',
'2',
'5',
'3',
'1',
' ',
89 'U',
'S',
'B',
' ',
'D',
'o',
'n',
'g',
'l',
'e'
96 #define BUFFER_SIZE USB_EP2_SIZE
98 static USBBuffer data_rx_urb;
99 static USBBuffer data_tx_urb;
100 static uint8_t usb_rx_data[BUFFER_SIZE];
101 static uint8_t enabled = 0;
103 #if USB_SERIAL_CONF_BUFFERED
104 #define SLIP_END 0300
105 static uint8_t usb_tx_data[BUFFER_SIZE];
106 static uint8_t buffered_data = 0;
110 static int (* input_handler)(
unsigned char c);
113 usb_class_get_string_descriptor(uint16_t lang, uint8_t
string)
117 return (uint8_t *)&lang_id;
119 return (uint8_t *)&string_manufacturer;
121 return (uint8_t *)&string_product;
123 return (uint8_t *)&string_serial_nr;
130 set_serial_number(
void)
133 uint8_t *ieee = &X_IEEE_ADDR;
137 for(i = 0; i < 8; i++) {
138 lown = ieee[i] & 0x0F;
139 highn = ieee[i] >> 4;
140 c = lown > 9 ?
'A' + lown - 0xA : lown +
'0';
141 string_serial_nr.string[14 - i * 2 + 1] = c;
142 c = highn > 9 ?
'A' + highn - 0xA : highn +
'0';
143 string_serial_nr.string[14 - i * 2] = c;
150 data_rx_urb.flags = USB_BUFFER_PACKET_END;
151 data_rx_urb.flags |= USB_BUFFER_NOTIFY;
152 data_rx_urb.data = usb_rx_data;
153 data_rx_urb.left = BUFFER_SIZE;
154 data_rx_urb.next =
NULL;
155 usb_submit_recv_buffer(EPOUT, &data_rx_urb);
163 events = usb_get_global_events();
164 if(events & USB_EVENT_CONFIG) {
167 usb_setup_bulk_endpoint(EPIN);
168 usb_setup_bulk_endpoint(EPOUT);
172 if(events & USB_EVENT_RESET) {
176 events = usb_cdc_acm_get_events();
177 if(events & USB_CDC_ACM_LINE_STATE) {
178 uint8_t line_state = usb_cdc_acm_get_line_state();
179 if(line_state & USB_CDC_ACM_DTE) {
190 events = usb_get_ep_events(EPOUT);
191 if((events & USB_EP_EVENT_NOTIFICATION)
192 && !(data_rx_urb.flags & USB_BUFFER_SUBMITTED)) {
193 if(!(data_rx_urb.flags & USB_BUFFER_FAILED)) {
198 len = BUFFER_SIZE - data_rx_urb.left;
199 for(i = 0; i < len; i++) {
200 input_handler(usb_rx_data[i]);
208 #if USB_SERIAL_CONF_BUFFERED
212 if(buffered_data == BUFFER_SIZE) {
213 data_tx_urb.flags = 0;
215 data_tx_urb.flags = USB_BUFFER_SHORT_END;
217 data_tx_urb.flags |= USB_BUFFER_NOTIFY;
218 data_tx_urb.next =
NULL;
219 data_tx_urb.data = usb_tx_data;
220 data_tx_urb.left = buffered_data;
222 usb_submit_xmit_buffer(EPIN, &data_tx_urb);
233 usb_tx_data[buffered_data] = b;
236 if(buffered_data == BUFFER_SIZE || b == SLIP_END || b ==
'\n') {
249 data_tx_urb.flags = USB_BUFFER_SHORT_END;
250 data_tx_urb.flags |= USB_BUFFER_NOTIFY;
251 data_tx_urb.next =
NULL;
252 data_tx_urb.data = &b;
253 data_tx_urb.left = 1;
254 usb_submit_xmit_buffer(EPIN, &data_tx_urb);
258 PROCESS(usb_serial_process,
"USB-Serial process");
269 usb_set_global_event_process(&usb_serial_process);
270 usb_cdc_acm_set_event_process(&usb_serial_process);
271 usb_set_ep_event_process(EPIN, &usb_serial_process);
272 usb_set_ep_event_process(EPOUT, &usb_serial_process);
276 if(ev == PROCESS_EVENT_EXIT) {
279 if(ev == PROCESS_EVENT_POLL) {
290 input_handler = input;
#define PROCESS_BEGIN()
Define the beginning of a process.
void usb_serial_set_input(int(*input)(unsigned char c))
Set an input hook for bytes received over USB.
#define NULL
The null pointer.
#define PROCESS_THREAD(name, ev, data)
Define the body of a process.
#define PROCESS_END()
Define the end of a process.
void usb_serial_init()
Initialise the Serial-over-USB process.
#define PROCESS_WAIT_EVENT()
Wait for an event to be posted to the process.
#define PROCESS(name, strname)
Declare a process.
void process_start(struct process *p, process_data_t data)
Start a process.
void usb_serial_flush()
Immediately transmit the content of Serial-over-USB TX buffers.
Header file for the Contiki process interface.
void usb_serial_writeb(uint8_t b)
Write a byte over USB.