/*---------------------------------------------------------------------------*/ static void do_work(void) { unsigned int events; events = usb_get_global_events(); if(events & USB_EVENT_CONFIG) { /* Configure EPs. Don't enable them yet, until the CDC line is up */ usb_setup_bulk_endpoint(EPIN); usb_setup_bulk_endpoint(EPOUT); queue_rx_urb(); } if(events & USB_EVENT_RESET) { enabled = 0; } events = usb_cdc_acm_get_events(); if(events & USB_CDC_ACM_LINE_STATE) { uint8_t line_state = usb_cdc_acm_get_line_state(); PRINTF("CDC-ACM event 0x%04x, Line State = %u\n", events, line_state); if(line_state & USB_CDC_ACM_DTE) { enabled = 1; } else { enabled = 0; } } if(!enabled) { return; } events = usb_get_ep_events(EPOUT); if((events & USB_EP_EVENT_NOTIFICATION) && !(data_rx_urb.flags & USB_BUFFER_SUBMITTED)) { if(!(data_rx_urb.flags & USB_BUFFER_FAILED)) { if(input_handler) { uint8_t len; uint8_t i; len = RX_BUFFER_SIZE - data_rx_urb.left; for(i = 0; i < len; i++) { input_handler(usb_rx_data[i]); } } } queue_rx_urb(); } }
PROCESS_THREAD(usb_eth_process, ev , data) { PROCESS_BEGIN(); usb_register_request_handler(&cdc_eth_request_hook); usb_setup(); usb_set_ep_event_process(DATA_OUT, process_current); usb_set_global_event_process(process_current); uip_fw_default(&usbethif); uip_setethaddr(default_uip_ethaddr); uip_arp_init(); while(1) { PROCESS_WAIT_EVENT(); if (ev == PROCESS_EVENT_EXIT) break; if (ev == PROCESS_EVENT_POLL) { unsigned int events = usb_get_global_events(); if (events) { if (events & USB_EVENT_CONFIG) { if (usb_get_current_configuration() != 0) { printf("Configured\n"); usb_setup_bulk_endpoint(DATA_IN); usb_setup_bulk_endpoint(DATA_OUT); usb_setup_interrupt_endpoint(INTERRUPT_IN); init_recv_buffer(); usb_submit_recv_buffer(DATA_OUT, &recv_buffer); #if 0 { static const uint8_t foo[4] = {0x12,0x34,0x56,0x78}; xmit_buffer[0].next = NULL; xmit_buffer[0].left = sizeof(foo); xmit_buffer[0].flags = USB_BUFFER_SHORT_END; xmit_buffer[0].data = &foo; usb_submit_xmit_buffer(DATA_IN, &xmit_buffer[0]); } #endif } else { usb_disable_endpoint(DATA_IN); usb_disable_endpoint(DATA_OUT); usb_disable_endpoint(INTERRUPT_IN); } } } events = usb_get_ep_events(DATA_OUT); if (events & USB_EP_EVENT_NOTIFICATION) { uip_len = sizeof(recv_data) - recv_buffer.left; /* printf("Received: %d bytes\n", uip_len); */ memcpy(uip_buf, recv_data, uip_len); #if UIP_CONF_IPV6 if(BUF->type == uip_htons(UIP_ETHTYPE_IPV6)) { uip_neighbor_add(&IPBUF->srcipaddr, &BUF->src); tcpip_input(); } else #endif /* UIP_CONF_IPV6 */ if(BUF->type == uip_htons(UIP_ETHTYPE_IP)) { uip_len -= sizeof(struct uip_eth_hdr); tcpip_input(); } else if(BUF->type == uip_htons(UIP_ETHTYPE_ARP)) { uip_arp_arpin(); /* If the above function invocation resulted in data that should be sent out on the network, the global variable uip_len is set to a value > 0. */ if (uip_len > 0) { memcpy(xmit_data, uip_buf, uip_len); xmit_buffer[0].next = NULL; xmit_buffer[0].data = xmit_data; xmit_buffer[0].left = uip_len; xmit_buffer[0].flags = USB_BUFFER_SHORT_END; usb_submit_xmit_buffer(DATA_IN, &xmit_buffer[0]); /* printf("Sent: %d bytes\n", uip_len); */ } } init_recv_buffer(); usb_submit_recv_buffer(DATA_OUT, &recv_buffer); } } } PROCESS_END(); }
PROCESS_THREAD(eriks_process, ev , data) { static struct etimer timer; uip_ipaddr_t myaddr; uip_ipaddr_t hostaddr; uip_ipaddr_t netmask; #if 0 struct dhcps_client_lease dhleases[3]; struct dhcps_config dhconfig; #endif PROCESS_BEGIN(); printf("Eriks super process\n\r"); uip_init(); #if 0 dhconfig.leases = &dhleases[0]; dhconfig.num_leases = 3; dhconfig.default_lease_time = 3600; uip_ipaddr(&dhconfig.netmask, 255,255,255,255); uip_ipaddr(&dhconfig.dnsaddr, 1,2,3,4); uip_ipaddr(&dhconfig.dnsaddr, 1,0,0,1); dhconfig.flags = DHCP_CONF_NETMASK | DHCP_CONF_DEFAULT_ROUTER; #endif /* usb_set_user_process(process_current); */ uip_ipaddr(&myaddr, 10,0,0,2); uip_sethostaddr(&hostaddr); uip_ipaddr(&netmask, 255,0,0,0); uip_sethostaddr(&hostaddr); uip_ipaddr(&myaddr, 10,0,0,1); uip_ipaddr(&netmask, 255,255,0,0); usb_setup(); #if 0 usb_cdc_eth_set_ifaddr(&myaddr); usb_cdc_eth_setup(); dhcps_init(&dhconfig); while(ev != PROCESS_EVENT_EXIT) { PROCESS_WAIT_EVENT(); printf("EVENT\n\r"); } #else usb_cdc_acm_setup(); while(ev != PROCESS_EVENT_EXIT) { PROCESS_WAIT_EVENT(); if (ev == PROCESS_EVENT_TIMER) { leds_toggle(LEDS_YELLOW); /* printf("FIFOP: %d\n", FIFOP_IS_1); */ etimer_restart(&timer); } else if (ev == PROCESS_EVENT_MSG) { const struct usb_user_msg * const msg = data; switch(msg->type) { case USB_USER_MSG_TYPE_CONFIG: printf("User config\n"); if (msg->data.config != 0) { #if 0 usb_setup_bulk_endpoint(DEV_TO_HOST, input_buffer, sizeof(input_buffer)); usb_setup_bulk_endpoint(HOST_TO_DEV, output_buffer, sizeof(output_buffer)); usb_setup_interrupt_endpoint(0x83,interrupt_buffer, sizeof(interrupt_buffer)); etimer_set(&timer, CLOCK_SECOND); #endif } else { #if 0 etimer_stop(&timer); usb_disable_endpoint(DEV_TO_HOST); usb_disable_endpoint(HOST_TO_DEV); usb_disable_endpoint(0x83); #endif } break; case USB_USER_MSG_TYPE_EP_OUT(2): { #if 0 /*unsigned int len = msg->data.length; printf("Received %d:\n", len); */ { unsigned char ch; unsigned int xfer; /* while((xfer = usb_recv_data(HOST_TO_DEV, &ch, 1)) > 0) { printf(" %02x",ch); */ /* if (slip_input_byte(ch)) break; */ } #endif /* printf("\n"); */ } break; } } } #endif printf("Exiting USB process\n\r"); PROCESS_END(); }
PROCESS_THREAD(gateway_process, ev , data) { static struct etimer timer; PROCESS_BEGIN(); usb_set_user_process(process_current); usb_setup(); usb_cdc_acm_setup(); uip_fw_default(&slipif); uip_over_mesh_set_gateway_netif(&slipif); process_start(&slip_process, NULL); set_gateway(); while(ev != PROCESS_EVENT_EXIT) { PROCESS_WAIT_EVENT(); if (ev == PROCESS_EVENT_TIMER) { leds_toggle(LEDS_YELLOW); /* printf("FIFOP: %d\n", FIFOP_IS_1); */ etimer_restart(&timer); } else if (ev == PROCESS_EVENT_MSG) { const struct usb_user_msg * const msg = data; switch(msg->type) { case USB_USER_MSG_TYPE_CONFIG: printf("User config\n"); if (msg->data.config != 0) { usb_setup_bulk_endpoint(DEV_TO_HOST, input_buffer, sizeof(input_buffer)); usb_setup_bulk_endpoint(HOST_TO_DEV, output_buffer, sizeof(output_buffer)); usb_setup_interrupt_endpoint(0x83,interrupt_buffer, sizeof(interrupt_buffer)); etimer_set(&timer, CLOCK_SECOND); } else { etimer_stop(&timer); usb_disable_endpoint(DEV_TO_HOST); usb_disable_endpoint(HOST_TO_DEV); usb_disable_endpoint(0x83); } break; case USB_USER_MSG_TYPE_EP_OUT(2): { /*unsigned int len = msg->data.length; printf("Received %d:\n", len); */ { unsigned char ch; unsigned int xfer; while((xfer = usb_recv_data(HOST_TO_DEV, &ch, 1)) > 0) { /* printf(" %02x",ch); */ if (slip_input_byte(ch)) break; } /* printf("\n"); */ } } break; } } } printf("USB test process exited\n"); PROCESS_END(); }