📄 usb_transaction_layer.c
字号:
ipl_set_device_address(device_addrs); /* Change state to ADDRESSED STATE */ g_usb_dev_state = USB_DEV_DEFAULT_STATE; } else { /* Send STALL Handshake */ ipl_send_stall_handshake(EP0,OUT); } default : break; } } else { /* Send STALL Handshake */ ipl_send_stall_handshake(EP0,OUT); } }/*==================================================================================================FUNCTION: tl_handle_get_device_descDESCRIPTION: This function Handle the GET DEVICE DESCRIPTOR requestARGUMENTS PASSED: None RETURN VALUE: None IMPORTANT NOTES: None ==================================================================================================*/void tl_handle_get_device_desc(void){ usb_buffer_descriptor_t bd ; U32 buffer_addrs; U16 desc_length = 0x0; BOOL zlt = FALSE; /* get the buffer address for data transfer over EP0 */ buffer_addrs = ipl_get_ep0_rxtx_buffer(); /* Fill the buffer with the descriptor data */ tl_fill_buffer_ep0in(FILL_DEVICE_DESC,buffer_addrs); /* Get the length of descriptor requested */ desc_length = g_usb_setup_data[WLENGTH_LOWBYTE]; desc_length |= ( g_usb_setup_data[WLENGTH_HIGHBYTE] <<0x8); /* If requested length of descriptor is lesser than actual length of descriptor then send * requested length of descroptor only else send the actual length of descriptor*/#ifdef SIMULATOR_TESTING if(desc_length <= g_usb_desc.device_desc->length) { bd.size = desc_length; } else { bd.size = g_usb_desc.device_desc->length; if ( bd.size > 8) { zlt = TRUE; } }#else if( g_usb_dev_state == USB_DEV_DEFAULT_STATE ) { bd.size = MPS_8; } else { bd.size = USB_DEV_DESC_LEN; }#endif /* Send descriptor */ ipl_send_data(EP0,&bd,zlt); /* Status Phase -- OUT */ tl_status_phase(OUT); }/*==================================================================================================FUNCTION: tl_handle_get_config_descDESCRIPTION: This function Handle the GET CONFIGURATION DESCRIPTOR requestARGUMENTS PASSED:RETURN VALUE: None IMPORTANT NOTES: None ==================================================================================================*/void tl_handle_get_config_desc(void){ usb_buffer_descriptor_t bd; U32 buffer_addrs; U16 desc_length_req = 0x0; U16 desc_length = 0x0; BOOL zlt = FALSE; /* get the buffer address for data transfer over EP0 */ buffer_addrs = ipl_get_ep0_rxtx_buffer(); /* Fill the buffer with the descriptor data */ tl_fill_buffer_ep0in(FILL_CONF_DESC, buffer_addrs); /* total length of descriptor */ desc_length = ((g_usb_desc.config_desc->total_length_l) | ( g_usb_desc.config_desc->total_length_h << 0x8 )); /* Get the length of descriptor requested */ desc_length_req = g_usb_setup_data[WLENGTH_LOWBYTE]; desc_length_req |= ( g_usb_setup_data[WLENGTH_HIGHBYTE] <<0x8); /* If requested length of descriptor is lesser than actual length of descriotor then send * requested length of descroptor only else send the actual length of descriptor*/ if(desc_length_req <= desc_length) { bd.size = desc_length_req; } else { bd.size = desc_length; if ( bd.size > MPS_64) { zlt = TRUE; } } ipl_send_data(EP0,&bd,zlt); /* Status Phase -- OUT */ tl_status_phase(OUT); }/*==================================================================================================FUNCTION: tl_handle_get_string_descDESCRIPTION: This function Handle the GET STRING DESCRIPTOR requestARGUMENTS PASSED: NoneRETURN VALUE: None IMPORTANT NOTES: None ==================================================================================================*/void tl_handle_get_string_desc(void){ usb_buffer_descriptor_t bd; U32 buffer_addrs; U16 desc_length_req = 0x0; U16 length_of_desc = 0x0; BOOL zlt = FALSE; /* Get Buufer to fill the data to be received/transmitted. */ buffer_addrs = ipl_get_ep0_rxtx_buffer(); /* Get the length of descriptor requested */ desc_length_req = g_usb_setup_data[WLENGTH_LOWBYTE]; desc_length_req |= ( g_usb_setup_data[WLENGTH_HIGHBYTE] <<0x8); switch (g_usb_setup_data[WVALUE_LOWBYTE]) { case STR_DES0: tl_fill_buffer_ep0in(FILL_STR_DES0,buffer_addrs); /* If requested length of descriptor is lesser than actual length of descriotor then send * requested length of descroptor only else send the actual length of descriptor*/ if(desc_length_req <= g_usb_desc.str_desc0->length ) { bd.size = desc_length_req; } else { bd.size = g_usb_desc.str_desc0->length; if ( bd.size > MPS_64) { zlt = TRUE; } } /* Data Phase -- IN */ ipl_send_data(EP0,&bd,zlt); /* Status Phase -- OUT */ tl_status_phase(OUT); break; case STR_DES1: /*iManufacturer */ tl_fill_buffer_ep0in(FILL_STR_DES1,buffer_addrs); /* If requested length of descriptor is lesser than actual length of descriotor then send * requested length of descroptor only else send the actual length of descriptor*/ if(desc_length_req <= g_usb_desc.str_desc1->length ) { bd.size = desc_length_req; } else { bd.size = g_usb_desc.str_desc1->length; if ( bd.size > MPS_64) { zlt = TRUE; } } /* Data Phase -- IN */ ipl_send_data(EP0,&bd,zlt); /* Status Phase -- OUT */ tl_status_phase(OUT); break; case STR_DES2: /*iProduct */ tl_fill_buffer_ep0in(FILL_STR_DES2,buffer_addrs ); length_of_desc = g_usb_desc.str_desc2->length; /* If requested length of descriptor is lesser than actual length of descriotor then send * requested length of descroptor only else send the actual length of descriptor*/ if(desc_length_req <= length_of_desc ) { bd.size = desc_length_req; } else { bd.size = length_of_desc; if ( bd.size > MPS_64) { zlt = TRUE; } } /* Data Phase -- IN */ ipl_send_data(EP0,&bd,zlt); /* Status Phase -- OUT */ tl_status_phase(OUT); break; case STR_DES3: /* send zero length data */ tl_status_phase(IN); /* Status Phase -- OUT */ tl_status_phase(OUT); break; case STR_DES4: /*iSerialNumber */ case STR_DES5: /*iSerialNumber */ tl_fill_buffer_ep0in(FILL_STR_DES3,buffer_addrs ); /* If requested length of descriptor is lesser than actual length of descriotor then send * requested length of descroptor only else send the actual length of descriptor*/ if(desc_length_req <= g_usb_desc.str_desc3->length ) { bd.size = desc_length_req; } else { bd.size = g_usb_desc.str_desc3->length; if ( bd.size > MPS_64) { zlt = TRUE; } } /* Data Phase -- IN */ ipl_send_data(EP0,&bd,zlt); /* Status Phase -- OUT */ tl_status_phase(OUT); break; default: /* Send STALL Handshake */ ipl_send_stall_handshake(EP0,OUT); break; }}/*==================================================================================================FUNCTION: tl_fill_buffer_ep0inDESCRIPTION: This function is used to fill the corresponding response for the data phase of SETUP TransferARGUMENTS PASSED: U8 type: type of descriptor U32 buffer_addrs - buffer pointer to be filled RETURN VALUE: None IMPORTANT NOTES: None==================================================================================================*/void tl_fill_buffer_ep0in(U8 type, U32 buffer_addrs){ const U8 *data=0; U32 *buffer_page = (P_U32)buffer_addrs; int k = 0; switch (type) { case FILL_DEVICE_DESC: /*5*32 bit */ data = (U8 *)g_usb_desc.device_desc; break; case FILL_CONF_DESC: /*8*32 bit */ data = (U8 *)g_usb_desc.config_desc; break; case FILL_STR_DES0: /*1*32 bit */ data = (U8 *)g_usb_desc.str_desc0; break; case FILL_STR_DES1: /*7*32 bit */ data =(U8 *)g_usb_desc.str_desc1; break; case FILL_STR_DES2: /*7*32 bit */ data = (U8 *)g_usb_desc.str_desc2; break; case FILL_STR_DES3: /*6*32 bit */ data = (U8 *)g_usb_desc.str_desc3; break; } for (k=0; k<(MPS_64/sizeof(U32)); k++) { #ifdef SIMULATOR_TESTING #if (ENDIANESS == b) *buffer_page = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24); #else *buffer_page = data[3] + (data[2] << 8) + (data[1] << 16) + (data[0] << 24); #endif #else *buffer_page = data[0] + (data[1] << 8) + (data[2] << 16) + (data[3] << 24); #endif buffer_page++; data += 4; }}/*==================================================================================================FUNCTION: tl_status_phaseDESCRIPTION: This function Send/Receive the Status to/from Host.ARGUMENTS PASSED: U8 direction OUT Receive Status Command From Host IN Send Status Command to Host RETURN VALUE: None IMPORTANT NOTES: ==================================================================================================*/void tl_status_phase(U8 direction){ usb_buffer_descriptor_t bd ; /* Buffer pointer is not used for EP0 */ bd.buffer = (U32 *) 0xFFFFFFFF; bd.size = 0x0; switch ( direction ) { case OUT : /* Receive ZERO length Length Data */ ipl_receive_data(EP0,&bd); break; case IN : /* Send ZERO length Length Data */ ipl_send_data(EP0,&bd,FALSE); break; }}/*==================================================================================================FUNCTION: tl_handle_bus_resetDESCRIPTION: This function Handle the USB Bus Reset Event ARGUMENTS PASSED: None RETURN VALUE: None IMPORTANT NOTES: ==================================================================================================*/void tl_handle_bus_reset(){ /* Change USB State to Default */ g_usb_dev_state = USB_DEV_DEFAULT_STATE; /* Initialise the IP Layer */ ipl_handle_bus_reset();}/*==================================================================================================FUNCTION: tl_check_for_bus_activityDESCRIPTION: This function Check for Bus Reset Event ARGUMENTS PASSED: None RETURN VALUE: BOOL rtn : return TRUE is BUS RESET event detected else return FALSE. IMPORTANT NOTES: ==================================================================================================*/BOOL tl_check_for_bus_activity(void){ BOOL rtn = FALSE; /* Check if Bus Reset Received */ if(ipl_check_bus_reset() == TRUE) { rtn = TRUE; } return rtn;}#ifdef SIMULATOR_TESTINGvoid test_stub_set_config(void){ U8 i; usb_end_pt_info_t config_data ; /* 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -