📄 usb_kbd_enum.c
字号:
pbuffer = &(usb_serial_number.bLength);
break;
}
default:
{
Usb_clear_rx_setup();
Usb_set_stall_request();
while ((!(Usb_stall_sent())) && (Usb_setup_received()));
Usb_clear_stalled();
Usb_clear_stall_request();
Usb_clear_DIR();
return;
}
}
break;
}
default:
{
Usb_clear_rx_setup();
Usb_set_stall_request();
while ((!(Usb_stall_sent())) && (Usb_setup_received()));
Usb_clear_stalled();
Usb_clear_stall_request();
Usb_clear_DIR();
return;
}
}
ACC = Usb_read_byte(); /* don't care of wIndex field */
ACC = Usb_read_byte();
((Uchar*)&wLength)[1] = Usb_read_byte(); /* read wLength */
((Uchar*)&wLength)[0] = Usb_read_byte();
if (wLength > data_to_transfer)
{
if ((data_to_transfer % EP_CONTROL_LENGTH) == 0) { zlp = TRUE; }
else { zlp = FALSE; } /* no need of zero length packet */
}
else
{
data_to_transfer = (Uchar)wLength; /* send only requested number of data */
}
Usb_clear_rx_setup() ; /* clear the receive setup flag */
Usb_set_DIR(); /* set out on EP0 */
while (data_to_transfer > EP_CONTROL_LENGTH)
{
pbuffer = usb_send_ep0_packet(pbuffer, EP_CONTROL_LENGTH);
data_to_transfer -= EP_CONTROL_LENGTH;
while ((!(Usb_rx_complete())) && (!(Usb_tx_complete())));
Usb_clear_tx_complete();
if ((Usb_rx_complete())) /* if cancel from USB Host */
{
Usb_clear_tx_ready();
Usb_clear_rx();
return;
}
}
/* send last data packet */
pbuffer = usb_send_ep0_packet(pbuffer, data_to_transfer);
data_to_transfer = 0;
while ((!(Usb_rx_complete())) && (!(Usb_tx_complete())));
Usb_clear_tx_complete();
if ((Usb_rx_complete())) /* if cancel from USB Host */
{
Usb_clear_tx_ready();
Usb_clear_rx();
return;
}
if (zlp == TRUE)
{
usb_send_ep0_packet(pbuffer, 0);
while ((!(Usb_rx_complete())) && (!(Usb_tx_complete())));
Usb_clear_tx_complete();
if ((Usb_rx_complete())) /* if cancel from USB Host */
{
Usb_clear_tx_ready();
Usb_clear_rx();
return;
}
}
while ((!(Usb_rx_complete())) && (!(Usb_setup_received())));
if (Usb_setup_received())
{
return;
}
if (Usb_rx_complete())
{
Usb_clear_DIR(); /* set in on EP0 */
Usb_clear_rx();
}
}
/*F**************************************************************************
* NAME: usb_get_configuration
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* This function manages the GET_CONFIGURATION request.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void usb_get_configuration (void)
{
Usb_clear_rx_setup();
Usb_set_DIR();
/* if (Usb_get_usb_configured()) { Usb_write_byte(1); }
else { Usb_write_byte(0); }
*/
Usb_write_byte(usb_configuration_nb);
Usb_set_tx_ready();
while (!(Usb_tx_complete()));
Usb_clear_tx_complete();
while (!(Usb_rx_complete()));
Usb_clear_rx();
Usb_clear_DIR();
}
/*F**************************************************************************
* NAME: usb_get_interface
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* This function manages the GET_INTERFACE request.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void usb_get_interface (void)
{
Usb_clear_rx_setup();
Usb_set_DIR();
Usb_set_stall_request();
while (!Usb_stall_sent());
Usb_clear_stall_request();
Usb_clear_stalled();
Usb_clear_DIR();
}
/*F**************************************************************************
* NAME: usb_get_status
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* This function manages the GET_STATUS request.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void usb_get_status (void)
{
Uchar wIndex;
ACC = Usb_read_byte(); /* dummy read */
ACC = Usb_read_byte(); /* dummy read */
wIndex = Usb_read_byte();
Usb_clear_rx_setup();
Usb_set_DIR();
switch(bmRequestType)
{
case REQUEST_DEVICE_STATUS: Usb_write_byte(SELF_POWERED); break;
case REQUEST_INTERFACE_STATUS: Usb_write_byte(0x00); break;
case REQUEST_ENDPOINT_STATUS: wIndex = wIndex & MSK_EP_DIR;
Usb_write_byte(endpoint_status[wIndex]);
break;
}
Usb_write_byte(0x00);
Usb_set_tx_ready();
while ((!(Usb_tx_complete())) || (Usb_setup_received()));
Usb_clear_tx_complete();
while ((!(Usb_rx_complete())) || (Usb_setup_received()));
Usb_clear_rx();
Usb_clear_DIR();
}
/*F**************************************************************************
* NAME: usb_set_feature
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* This function manages the SET_FEATURE request.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void usb_set_feature (void)
{
if (bmRequestType == ZERO_TYPE)
{
Usb_clear_rx_setup();
Usb_set_stall_request();
while (!(Usb_stall_sent()));
Usb_clear_stall_request();
}
if (bmRequestType == INTERFACE_TYPE)
{
Usb_clear_rx_setup();
Usb_set_stall_request();
while (!(Usb_stall_sent()));
Usb_clear_stall_request();
}
if (bmRequestType == ENDPOINT_TYPE)
{
if (Usb_read_byte() == 0x00)
{
ACC = Usb_read_byte(); /* dummy read */
switch (Usb_read_byte()) /* check wIndex */
{
case ENDPOINT_1:
{
Usb_select_ep(EP_IN);
Usb_set_stall_request();
Usb_select_ep(EP_CONTROL);
endpoint_status[EP_IN] = 0x01;
Usb_clear_rx_setup();
Usb_set_tx_ready();
while (!(Usb_tx_complete()));
Usb_clear_tx_complete();
break;
}
default:
{
Usb_clear_rx_setup();
Usb_set_stall_request();
while (!(Usb_stall_sent()));
Usb_clear_stall_request();
Usb_clear_stalled();
break;
}
}
}
}
}
/*F**************************************************************************
* NAME: usb_clear_feature
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* This function manages the SET_FEATURE request.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void usb_clear_feature (void)
{
if (bmRequestType == ZERO_TYPE)
{
Usb_clear_rx_setup();
Usb_set_stall_request();
while (!(Usb_stall_sent()));
Usb_clear_stall_request();
}
if (bmRequestType == INTERFACE_TYPE)
{
Usb_clear_rx_setup();
Usb_set_stall_request();
while (!(Usb_stall_sent()));
Usb_clear_stall_request();
}
if (bmRequestType == ENDPOINT_TYPE)
{
if (Usb_read_byte() == 0x00)
{
ACC = Usb_read_byte(); /* dummy read */
switch (Usb_read_byte()) /* check wIndex */
{
case ENDPOINT_1:
{
Usb_select_ep(EP_IN);
Usb_clear_stall_request();
usb_reset_endpoint(EP_IN);
Usb_select_ep(EP_CONTROL);
endpoint_status[EP_IN] = 0x00;
Usb_clear_rx_setup();
Usb_set_tx_ready();
while (!(Usb_tx_complete()));
Usb_clear_tx_complete();
break;
}
case ENDPOINT_0:
{
Usb_clear_rx_setup();
Usb_set_tx_ready();
while (!(Usb_tx_complete()));
Usb_clear_tx_complete();
break;
}
default:
{
Usb_clear_rx_setup();
Usb_set_stall_request();
while (!(Usb_stall_sent()));
Usb_clear_stall_request();
break;
}
}
}
}
}
/*F**************************************************************************
* NAME: usb_hid_set_report
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* This function manages the SET_REPORT request (HID Class)
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void usb_hid_set_report (void)
{
Usb_clear_rx_setup();
while(!Usb_rx_complete() );
Usb_clear_rx();
Usb_set_tx_ready(); /* send a ZLP for STATUS phase */
while(!(Usb_tx_complete()));
Usb_clear_tx_complete();
}
/*F**************************************************************************
* NAME: usb_hid_set_idle
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* This function manages the HID_SET_IDLE request.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void usb_hid_set_idle (void)
{
ACC = Usb_read_byte();
hid_idle_duration = Usb_read_byte(); /* wValue contains the duration */
Usb_clear_rx_setup();
Usb_set_tx_ready(); /* send a ZLP for STATUS phase */
while(!(Usb_tx_complete()));
Usb_clear_tx_complete();
}
/*F**************************************************************************
* NAME: usb_hid_get_idle
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
* This function manages the GET_IDLE request.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void usb_hid_get_idle (void)
{
Usb_clear_rx_setup();
Usb_set_DIR();
Usb_write_byte(hid_idle_duration);
Usb_set_tx_ready(); /* send a ZLP for STATUS phase */
while(!(Usb_tx_complete()));
Usb_clear_tx_complete();
while (!(Usb_rx_complete()));
Usb_clear_rx();
Usb_clear_DIR();
}
/*_____ E N D O F F I L E _________________________________________________*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -