📄 usb_host_enum.c
字号:
*
* @param interface the interface nb to look for offset descriptor
* @param alt the interface alt setting number
*
* @return T_DESC_OFFSET offset in data_stage[]
*/
T_DESC_OFFSET get_interface_descriptor_offset(U8 interface, U8 alt)
{
U8 nb_interface;
T_DESC_OFFSET descriptor_offset;
nb_interface = data_stage[OFFSET_FIELD_NB_INTERFACE]; // Detects the number of interfaces in this configuration
descriptor_offset = data_stage[OFFSET_DESCRIPTOR_LENGHT]; // now pointing on next descriptor
while(descriptor_offset < SIZEOF_DATA_STAGE) // Look in all interfaces declared in the configuration
{
while (data_stage[descriptor_offset+OFFSET_FIELD_DESCRIPTOR_TYPE] != INTERFACE_DESCRIPTOR)
{
descriptor_offset += data_stage[descriptor_offset];
if(descriptor_offset > SIZEOF_DATA_STAGE)
{ return HOST_FALSE; }
}
if (data_stage[descriptor_offset+OFFSET_FIELD_INTERFACE_NB]==interface
&& data_stage[descriptor_offset+OFFSET_FIELD_ALT]==alt)
{
return descriptor_offset;
}
descriptor_offset += data_stage[descriptor_offset];
}
return descriptor_offset;
}
/**
* @brief This function returns the physical pipe number linked to a logical
* endpoint address.
*
* @param ep_addr
*
* @return physical_pipe_number
*
* @note the function returns 0 if no ep_addr is found in the look up table.
*/
U8 host_get_hwd_pipe_nb(U8 ep_addr)
{
U8 i;
for(i=0;i<MAX_EP_NB;i++)
{
if(ep_table[i]==ep_addr)
{ return i; }
}
return 0;
}
/**
* host_send_control.
*
* @brief This function is the generic Pipe 0 management function
* This function is used to send and receive control request over pipe 0
*
* @todo Fix all timeout errors and disconnection in active wait loop
*
* @param data_pointer
*
* @return status
*
* @note This function uses the usb_request global structure as parameter.
* Thus this structure should be filled before calling this function.
*
*/
U8 host_send_control(U8* data_pointer)
{
U16 data_length;
U8 sav_int_sof_enable;
U8 c;
Usb_ack_event(EVT_HOST_SOF);
sav_int_sof_enable=Is_host_sof_interrupt_enabled();
Host_enable_sof_interrupt(); // SOF software detection is in interrupt sub-routine
while(Is_not_usb_event(EVT_HOST_SOF)) // Wait 1 sof
{
if (Is_host_emergency_exit())
{
c=CONTROL_TIMEOUT;
Host_freeze_pipe();
Host_reset_pipe(0);
goto host_send_control_end;
}
}
if (sav_int_sof_enable==FALSE)
{
Host_disable_sof_interrupt();
}
Host_select_pipe(0);
Host_set_token_setup();
Host_ack_setup();
Host_unfreeze_pipe();
// Build the setup request fields
Host_write_byte(usb_request.bmRequestType);
Host_write_byte(usb_request.bRequest);
Host_write_byte(LSB(usb_request.wValue));
Host_write_byte(MSB(usb_request.wValue));
Host_write_byte(LSB(usb_request.wIndex));
Host_write_byte(MSB(usb_request.wIndex));
Host_write_byte(LSB(usb_request.wLength));
Host_write_byte(MSB(usb_request.wLength));
Host_send_setup();
while(Is_host_setup_sent() == FALSE) // wait for SETUP ack
{
if (Is_host_emergency_exit())
{
c=CONTROL_TIMEOUT;
Host_freeze_pipe();
Host_reset_pipe(0);
goto host_send_control_end;
}
if(Is_host_pipe_error()) // Any error ?
{
c = Host_error_status();
Host_ack_all_errors();
goto host_send_control_end; // Send error status
}
}
// Setup token sent now send In or OUT token
// Before just wait one SOF
Usb_ack_event(EVT_HOST_SOF);
sav_int_sof_enable=Is_host_sof_interrupt_enabled();
Host_enable_sof_interrupt();
Host_freeze_pipe();
data_length = usb_request.wLength;
while(Is_not_usb_event(EVT_HOST_SOF)) // Wait 1 sof
{
if (Is_host_emergency_exit())
{
c=CONTROL_TIMEOUT;
Host_freeze_pipe();
Host_reset_pipe(0);
goto host_send_control_end;
}
}
if (sav_int_sof_enable==FALSE)
{ Host_disable_sof_interrupt(); } // Restore SOF interrupt enable
// IN request management ---------------------------------------------
if(usb_request.bmRequestType & 0x80) // bmRequestType : Data stage IN (bmRequestType==1)
{
Host_standard_in_mode();
Host_set_token_in();
while(data_length != 0)
{
Host_unfreeze_pipe();
while(!Is_host_control_in_received())
{
if (Is_host_emergency_exit())
{
c=CONTROL_TIMEOUT;
Host_freeze_pipe();
Host_reset_pipe(0);
goto host_send_control_end;
}
if(Is_host_pipe_error())
{
c = Host_error_status();
Host_ack_all_errors();
goto host_send_control_end;
}
if(Is_host_stall())
{
c=CONTROL_STALL;
Host_ack_stall();
goto host_send_control_end;
}
}
c = Host_data_length_U8();
if (c == Host_get_pipe_length())
{
data_length -= c;
if (usb_request.uncomplete_read == TRUE) // uncomplete_read
{
data_length = 0;
}
}
else
{
data_length = 0;
}
while (c!=0)
{
*data_pointer = Host_read_byte();
data_pointer++;
c--;
}
Host_freeze_pipe();
Host_ack_control_in();
Host_send_control_in();
} // end of IN data stage
Host_set_token_out();
Host_unfreeze_pipe();
Host_ack_control_out();
Host_send_control_out();
while(!Is_host_control_out_sent())
{
if (Is_host_emergency_exit())
{
c=CONTROL_TIMEOUT;
Host_freeze_pipe();
Host_reset_pipe(0);
goto host_send_control_end;
}
if(Is_host_pipe_error())
{
c = Host_error_status();
Host_ack_all_errors();
goto host_send_control_end;
}
if(Is_host_stall())
{
c=CONTROL_STALL;
Host_ack_stall();
goto host_send_control_end;
}
}
Host_ack_control_out();
c=(CONTROL_GOOD);
goto host_send_control_end;
}
// OUT request management ---------------------------------------------
else // Data stage OUT (bmRequestType==0)
{
Host_set_token_out();
Host_ack_control_out();
while(data_length != 0)
{
Host_unfreeze_pipe();
c = Host_get_pipe_length();
if ( (U16)c > data_length)
{
c = (U8)data_length;
data_length = 0;
}
else
{
data_length -= c;
}
while (c!=0)
{
Host_write_byte(*data_pointer);
data_pointer++;
c--;
}
Host_send_control_out();
while (!Is_host_control_out_sent())
{
if (Is_host_emergency_exit())
{
c=CONTROL_TIMEOUT;
Host_freeze_pipe();
Host_reset_pipe(0);
goto host_send_control_end;
}
if(Is_host_pipe_error())
{
c = Host_error_status();
Host_ack_all_errors();
goto host_send_control_end;
}
if(Is_host_stall())
{
c=CONTROL_STALL;
Host_ack_stall();
goto host_send_control_end;
}
}
Host_ack_control_out();
} // end of OUT data stage
Host_freeze_pipe();
Host_set_token_in();
Host_unfreeze_pipe();
while(!Is_host_control_in_received())
{
if (Is_host_emergency_exit())
{
c=CONTROL_TIMEOUT;
Host_freeze_pipe();
Host_reset_pipe(0);
goto host_send_control_end;
}
if(Is_host_pipe_error())
{
c = Host_error_status();
Host_ack_all_errors();
goto host_send_control_end;
}
if(Is_host_stall())
{
c=CONTROL_STALL;
Host_ack_stall();
goto host_send_control_end;
}
}
Host_ack_control_in();
Host_freeze_pipe();
Host_send_control_in();
c=(CONTROL_GOOD);
goto host_send_control_end;
}
host_send_control_end:
return ((U8)c);
}
#endif //(USB_HOST_FEATURE == ENABLED)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -