📄 usb_transaction_layer.c
字号:
RETURN VALUE: IMPORTANT NOTES: ==================================================================================================*/usb_status_ttl_send_data(usb_buffer_descriptor_t* bd){ usb_status_t status = USB_FAILURE; U8 i,endpoint = 0x0;#ifndef SIMULATOR_TESTING /* Check if Bus Reset Received */ if(ipl_check_bus_reset() == TRUE) { /* Handle Bus Reset and return Failure*/ tl_handle_bus_reset(); } /* Check if set up token Received */ else if(ipl_check_setup_token() == TRUE) { /* Handle the setup token*/ tl_handle_setup_phase(); }#endif /* Check the State of USB . If It is in configured state than send data */ if ( g_usb_dev_state == USB_DEV_CONFIGURED_STATE ) { /* buffer pointer should not be NULL */ if( bd->buffer != NULL ) { /* Get the endpoint number which is configured for IN */ for ( i = 0 ; i< g_number_of_endpoints ; i++) { if(g_end_pt_info[i].direction == IN) { endpoint = g_end_pt_info[i].end_pt_no; break; } } /* Check for endpoint number */ if(endpoint) { /* Send Data */ status = (usb_status_t )ipl_send_data(endpoint,bd,FALSE); } else { status = USB_INVALID; /* If no endpoint is configured */ } } else { status = USB_INVALID; /* if the buffer pointer is NULL */ } } return(status);}/*==================================================================================================FUNCTION: tl_receive_dataDESCRIPTION: This Function Handles the received request on usb busARGUMENTS PASSED: usb_buffer_descriptor_t* bd RETURN VALUE: IMPORTANT NOTES: ==================================================================================================*/usb_status_ttl_receive_data(usb_buffer_descriptor_t* bd){ usb_status_t status = USB_FAILURE; U8 i,endpoint = 0x0;#ifndef SIMULATOR_TESTING /* Check if Bus Reset Received */ if(ipl_check_bus_reset() == TRUE) { /* Handle Bus Reset and return Failure */ tl_handle_bus_reset(); } /* Check if set up token Received. */ else if(ipl_check_setup_token() == TRUE) { /* Handle the setup token */ tl_handle_setup_phase(); }#endif /* Check the State of USB . If It is in configured state than receive data */ if ( g_usb_dev_state == USB_DEV_CONFIGURED_STATE ) { /* buffer pointer should not be NULL */ if( bd->buffer != NULL ) { /* Get the endpoint number which is configured for OUT */ for ( i = 0 ; i< g_number_of_endpoints ; i++) { if(g_end_pt_info[i].direction == OUT) { endpoint = g_end_pt_info[i].end_pt_no; break; } } /* endpoint number should not be EP0 */ if(endpoint) { /* Receive data */ status = (usb_status_t )ipl_receive_data(endpoint,bd); } else { status = USB_INVALID; /* If no endpoint is configured */ } } else { status = USB_INVALID; /* if the buffer pointer is NULL */ } } return(status);}/*==================================================================================================FUNCTION: tl_handle_setup_phaseDESCRIPTION: This function Handle the Setup Token from USB HostARGUMENTS PASSED: None RETURN VALUE: None IMPORTANT NOTES: ==================================================================================================*/void tl_handle_setup_phase(void){ usb_buffer_descriptor_t bd ; usb_status_t status; /* Receive the SetUp Data */ bd.buffer = (P_U32)g_usb_setup_data; bd.size = 0; status = ipl_receive_setup_data(&bd); if( status == USB_SUCCESS) { /* Parser the Setup Request Type */ switch (g_usb_setup_data[BREQUEST]) { case USB_GET_DESCRIPTOR: /* Handle the GET DESCRIPTOR Request */ tl_handle_get_descriptor(); break; case USB_SET_ADDRESS: /* Handle the SET ADDRESS Request */ tl_handle_set_addrs(); break; case USB_SET_CONFIGURATION: /* Handle the SET CONFIGURATION Request */ if ((g_usb_setup_data[WINDEX_LOWBYTE] == 0) && (g_usb_setup_data[WINDEX_HIGHBYTE] == 0) && (g_usb_setup_data[WLENGTH_LOWBYTE] == 0) && (g_usb_setup_data[WLENGTH_HIGHBYTE] == 0) && (g_usb_setup_data[WVALUE_HIGHBYTE] == 0)) { tl_handle_set_configuration(); } else { /* Send STALL Handshake */ ipl_send_stall_handshake(EP0,OUT); } break; case USB_GET_CONFIGURATION: /* GET CONFIGURATION request handler */ tl_handle_get_configuration(); default: /* Send STALL Handshake */ ipl_send_stall_handshake(EP0,OUT); break; } /* service watch dog */ //HAPI_WATCHDOG_service ( ); *(volatile U16 *)(WDOG_WSR) = 0x5555; *(volatile U16 *)(WDOG_WSR) = 0xAAAA; } }/*==================================================================================================FUNCTION: tl_handle_get_descriptorDESCRIPTION: This function Handle the GET DESCRIPTOR requestARGUMENTS PASSED: None RETURN VALUE: None IMPORTANT NOTES: None ==================================================================================================*/void tl_handle_get_descriptor(){ switch (g_usb_setup_data[WVALUE_HIGHBYTE]) { case DEVICE_DESC: /* device descriptor*/ tl_handle_get_device_desc(); break; case CONF_DESC: /* configuration descriptor*/ tl_handle_get_config_desc(); break; case STRING_DESC: /* string descriptor*/ tl_handle_get_string_desc(); break; default: /* Send STALL Handshake */ ipl_send_stall_handshake(EP0,OUT); break; }}/*==================================================================================================FUNCTION: tl_handle_set_configurationDESCRIPTION: This function Handle the SET CONFIGURATION requestARGUMENTS PASSED: None RETURN VALUE: None IMPORTANT NOTES: None ==================================================================================================*/void tl_handle_set_configuration(){#ifndef SIMULATOR_TESTING usb_end_pt_info_t config_data ; U32 i; #endif switch (g_usb_dev_state) { case USB_DEV_ADDRESSED_STATE : if (g_usb_setup_data[WVALUE_LOWBYTE] == USB_DEV_VALUE_OF_UNCONFIG) { /* Send Ack to Host*/ tl_status_phase(IN); } /* Check if the configuration value received request is same as in Config descriptor */ else if(g_usb_setup_data[WVALUE_LOWBYTE] == g_usb_desc.config_desc->configuration_value) {#ifndef SIMULATOR_TESTING /* Configure endpoints */ for ( i = 0 ; i< g_number_of_endpoints ; i++) { config_data.end_pt_no = g_end_pt_info[i].end_pt_no; config_data.direction = g_end_pt_info[i].direction; config_data.transfer_type = g_end_pt_info[i].transfer_type; config_data.max_pkt_size = g_end_pt_info[i].max_pkt_size; ipl_set_configuration(&config_data); }#endif /* Send Ack to Host*/ tl_status_phase(IN); g_usb_dev_state = USB_DEV_CONFIGURED_STATE ; } else { /* Invalid configuration value. Send STALL Handshake */ ipl_send_stall_handshake(EP0,OUT); } break; case USB_DEV_CONFIGURED_STATE : if(g_usb_setup_data[WVALUE_LOWBYTE] == USB_DEV_CONFIG_DESC_CONFIG_VALUE) { /* Send Ack to Host*/ tl_status_phase(IN); } else if (g_usb_setup_data[WVALUE_LOWBYTE] == USB_DEV_VALUE_OF_UNCONFIG) { /* Send Ack to Host*/ tl_status_phase(IN); /* Change USB State to Addressed State */ g_usb_dev_state = USB_DEV_ADDRESSED_STATE; } break; default : /* Send STALL Handshake */ ipl_send_stall_handshake(EP0,OUT); break; }}/*==================================================================================================FUNCTION: tl_handle_get_configurationDESCRIPTION: This function Handle the GET CONFIGURATION requestARGUMENTS PASSED: None RETURN VALUE: None IMPORTANT NOTES: None ==================================================================================================*/void tl_handle_get_configuration(void){ usb_buffer_descriptor_t bd; U32 buffer_addrs; U32* buffer_ptr; if((g_usb_setup_data[WINDEX_LOWBYTE] == 0) && (g_usb_setup_data[WINDEX_HIGHBYTE] == 0) && (g_usb_setup_data[WVALUE_LOWBYTE] == 0) && (g_usb_setup_data[WVALUE_HIGHBYTE] == 0) && (g_usb_setup_data[WLENGTH_LOWBYTE] == LEN_OF_CONFIG_VALUE) && (g_usb_setup_data[WLENGTH_HIGHBYTE] == 0)) { switch(g_usb_dev_state) { case USB_DEV_DEFAULT_STATE : /* Send STALL Handshake */ ipl_send_stall_handshake(EP0,OUT); break; case USB_DEV_ADDRESSED_STATE: /* If the Device is in Address state then return 0x0 : See USB2.0 Spec */ buffer_addrs = ipl_get_ep0_rxtx_buffer(); buffer_ptr = (U32 *)buffer_addrs; *buffer_ptr = 0x0; bd.buffer = buffer_ptr; bd.size=LEN_OF_CONFIG_VALUE; ipl_send_data(EP0,&bd,FALSE); /* Receive Ack from Host*/ tl_status_phase(OUT); break; case USB_DEV_CONFIGURED_STATE: buffer_addrs = ipl_get_ep0_rxtx_buffer(); buffer_ptr = (U32 *)buffer_addrs; *buffer_ptr = (UINT32 )g_usb_desc.config_desc->configuration_value; bd.buffer = buffer_ptr; bd.size=LEN_OF_CONFIG_VALUE; ipl_send_data(EP0,&bd,FALSE); /* Receive Ack from Host*/ tl_status_phase(OUT); break; default: /* Send STALL Handshake */ ipl_send_stall_handshake(EP0,OUT); } } }/*==================================================================================================FUNCTION: tl_handle_set_addrsDESCRIPTION: This function Handle the SET ADDRESS Request from USB HostARGUMENTS PASSED: None RETURN VALUE: None IMPORTANT NOTES: ==================================================================================================*/void tl_handle_set_addrs(){ U16 device_addrs; /* Get the Device Address to be SET from the Setup Data */ device_addrs = g_usb_setup_data[WVALUE_LOWBYTE] + (g_usb_setup_data[WVALUE_HIGHBYTE]<<8); if ((g_usb_setup_data[WINDEX_LOWBYTE] == 0) && (g_usb_setup_data[WINDEX_HIGHBYTE] == 0) && (g_usb_setup_data[WLENGTH_LOWBYTE] == 0) && (g_usb_setup_data[WLENGTH_HIGHBYTE] == 0) && (device_addrs <= USB_MAX_DEVICE_ADDR)) { switch(g_usb_dev_state) { case USB_DEV_DEFAULT_STATE : /* Send Ack to Host */ tl_status_phase(IN); if (device_addrs == USB_DEFAULT_ADDR) { /* no handling needed */ } else { /* Set the Device Address */ ipl_set_device_address(device_addrs); /* Change state to ADDRESSED STATE */ g_usb_dev_state = USB_DEV_ADDRESSED_STATE; } break; case USB_DEV_ADDRESSED_STATE : /* Send Ack to Host */ tl_status_phase(IN); if ( device_addrs == USB_DEFAULT_ADDR ) { /* Set the Device Address */ ipl_set_device_address(USB_DEFAULT_ADDR); /* Change state to ADDRESSED STATE */ g_usb_dev_state = USB_DEV_DEFAULT_STATE; } else { /* Set the Device Address */ ipl_set_device_address(device_addrs); } break; case USB_DEV_CONFIGURED_STATE : /* Send Ack to Host */ tl_status_phase(IN); if ( device_addrs == USB_DEFAULT_ADDR) { /* Set the Device Address */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -