//! @brief This function manages the HOST mass storage application //! void host_ms_task(void) { if( Is_host_ready() ) { // Here, Enumeration successfull, device is operationnal if(Is_new_device_connection_event()) { // Update MS driver in case of if( host_mem_install() ) { #if (HOST_UPGRADE_MODE==ENABLE) b_new_msc_connected = TRUE; #endif Led1_on(); } } #if (HOST_SYNC_MODE==ENABLE) // Sync operating mode(if available) if( 0 != host_mem_get_lun() ) { if(Is_joy_right()) // Sync device to host stream { Led0_on(); sync_on_going=1; copy_dir( (U8 code *)dir_usb_out_name, (U8 code *)dir_local_in_name, 1 ); sync_on_going=0; Led3_off(); Led0_off(); } if(Is_joy_left()) // Sync host to device stream { Led0_on(); sync_on_going=1; copy_dir( (U8 code *)dir_local_out_name, (U8 code *)dir_usb_in_name, 1 ); sync_on_going=0; Led0_off(); Led3_off(); } } #endif #if (HOST_UPGRADE_MODE==ENABLE) if( b_new_msc_connected ) { // A new MSC is connected then start upgrade routine b_new_msc_connected = FALSE; firm_upgrade_run(); } #endif } // Device disconnection... if( Is_device_disconnection_event() ) { // Update MS driver in case of host_mem_uninstall(); Led1_off(); } }
//! Task which links mouse events with the USB HID mouse device //! void mouse_task(void) { if(Is_usb_vbus_low()) { Setup_power_down_mode(); Sleep_instruction(); } if(!Is_device_enumerated()) return; // Device not ready #if (USB_LOW_SPEED_DEVICE==DISABLE) // The SOF is used to schedule the task at the same frequency that Endpoint Interrupt frequency // This check allow to win a CPU time if(g_u8_cpt_sof<NB_IDLE_POLLING_SOF) return; // Wait a delay g_u8_cpt_sof=0; #endif if(!g_b_send_report) { // No report sending on going, then check mouse event to eventualy fill a new report if(is_mouse_event()) { // Enable sending of report g_b_send_report = TRUE; } } if((!g_b_send_report)&&(!g_b_send_ack_report)) return; // No report and ack to send //** A report or ack must be send Usb_select_endpoint(EP_MOUSE_IN); if(!Is_usb_write_enabled()) return; // Endpoint no free Led0_on(); if( g_b_send_report ) { g_b_send_report = FALSE; // Send an ack after a "clic" report only g_b_send_ack_report = (0!=g_hid_mouse_report[0]); } else { Hid_mouse_report_reset(); // Reset report to have a ack report g_b_send_ack_report = FALSE; } // Send report Usb_write_byte(g_hid_mouse_report[0]); Usb_write_byte(g_hid_mouse_report[1]); Usb_write_byte(g_hid_mouse_report[2]); Usb_write_byte(g_hid_mouse_report[3]); Usb_ack_in_ready(); Led0_off(); }
uint8_t cdc_ecm_process(void) { static uint8_t doInit = 1; Usb_select_endpoint(RX_EP); if(!Is_usb_endpoint_enabled()) { return 0; } if (doInit) { #ifdef USB_ETH_HOOK_INIT USB_ETH_HOOK_INIT(); #endif cdc_ecm_notify_network_connection(1); cdc_ecm_notify_connection_speed_change(250000,250000); doInit = 0; if(usb_ecm_packet_filter & PACKET_TYPE_PROMISCUOUS) { #if RF230BB rf230_set_promiscuous_mode(true); #else radio_set_trx_state(RX_ON); #endif } // Select again, just to make sure. Usb_select_endpoint(RX_EP); } if(!usb_eth_is_active) { // If we aren't active, just eat the packets. if(Is_usb_read_enabled()) { Usb_ack_receive_out(); } return 0; } //Connected! Led0_on(); if(Is_usb_read_enabled()) { uint16_t bytecounter; uint16_t bytes_received = 0; U8 * buffer = uip_buf; if(!usb_eth_ready_for_next_packet()) { // Since we aren't ready for a packet yet, // just return. goto bail; } #ifdef USB_ETH_HOOK_RX_START USB_ETH_HOOK_RX_START(); #endif while((bytecounter=Usb_byte_counter_8())==CDC_ECM_DATA_ENDPOINT_SIZE) { while((bytes_received<USB_ETH_MTU) && (bytecounter--)) { *buffer++ = Usb_read_byte(); bytes_received++; } bytes_received+=bytecounter+1; //ACK previous data Usb_ack_receive_out(); //Wait for new data if(usb_endpoint_wait_for_read_enabled()!=0) { USB_ETH_HOOK_RX_ERROR("Timeout: read enabled"); goto bail; } } bytecounter = Usb_byte_counter_8(); while((bytes_received<USB_ETH_MTU) && (bytecounter--)) { *buffer++ = Usb_read_byte(); bytes_received++; } bytes_received+=bytecounter+1; //Ack final data packet Usb_ack_receive_out(); //PRINTF_P(PSTR("cdc_ecm: Got packet %d bytes long\n"),bytes_received); #ifdef USB_ETH_HOOK_RX_END USB_ETH_HOOK_RX_END(); #endif //Send data over RF or to local stack if(bytes_received<=USB_ETH_MTU) { USB_ETH_HOOK_HANDLE_INBOUND_PACKET(uip_buf,bytes_received); } else { USB_ETH_HOOK_RX_ERROR("Oversized packet"); } } bail: return 1; }