📄 obj_usbdesc.c
字号:
else
pUsbDesc->GetStatus(recipient, pSetup->wIndex, pUsbDesc->pPrivateStandardData);
}
/* =================== Default state ================= */
else
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
/* ************************************ */
/* AT91F_UsbDescSetAddress */
/* */
/* Arguments: */
/* pSetup: pointer to setup datas */
/* Return: */
/* Nothing */
/* Description: */
/* This request sets the device */
/* address for all device accesses */
/* ************************************ */
void AT91F_UsbDescSetAddress(
AT91PS_UsbDesc const pUsbDesc, /* pointer to a AT91S_UsbDesc structure */
AT91PS_UsbSetup pSetup) /* USB setup data Cf USB spec rev 1.1 */
{
u_int usbState = AT91F_UdpGetState(pUsbDesc->pUdp);
/* Check request arguments */
if ((pSetup->wValue >= 127) || pSetup->wIndex != 0 || pSetup->wLength != 0)
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
/* ================ Configured state ================= */
else if ( (usbState & UDP_CONFG) )
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
/* ============ Address or Default state ============= */
else {
/* Enter the address state if the value != 0 */
//AT91F_UdpEpEow(pUsbDesc->pUdp, pUsbDesc->epId);
// Wait for TX Complete
if (pUsbDesc->SetAddress)
pUsbDesc->SetAddress(pSetup->wValue, pUsbDesc->pPrivateStandardData);
}
}
/* ************************************ */
/* AT91F_UsbDescSetConfiguration */
/* */
/* Arguments: */
/* pSetup: pointer to setup datas */
/* Return: */
/* Nothing */
/* Description: */
/* This request sets the device */
/* configuration */
/* ************************************ */
void AT91F_UsbDescSetConfiguration(
AT91PS_UsbDesc const pUsbDesc, /* pointer to a AT91S_UsbDesc structure */
AT91PS_UsbSetup pSetup) /* USB setup data Cf USB spec rev 1.1 */
{
u_int usbState = AT91F_UdpGetState(pUsbDesc->pUdp);
/* Check request arguments */
if ((pSetup->wValue & 0xFF00) || pSetup->wIndex != 0 || pSetup->wLength != 0)
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
/* ================ Configured state ================= */
else if ( (usbState & UDP_CONFG) ) {
if (pSetup->wValue == 0) {
/* Device enters Address State */
AT91F_UdpSetState(pUsbDesc->pUdp, UDP_FADDEN);
AT91F_UdpEpEow(pUsbDesc->pUdp, pUsbDesc->epId);
}
else {
if (pUsbDesc->SetConfiguration)
pUsbDesc->SetConfiguration(pSetup->wValue, pUsbDesc->pPrivateStandardData);
else
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
}
/* =================== Address state ================= */
else if ( (usbState & UDP_FADDEN) ) {
if (pSetup->wValue == 0)
/* Device remains in Address State */
AT91F_UdpEpEow(pUsbDesc->pUdp, pUsbDesc->epId);
else {
if (pUsbDesc->SetConfiguration)
pUsbDesc->SetConfiguration(pSetup->wValue, pUsbDesc->pPrivateStandardData);
else
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
}
/* =================== Default state ================= */
else
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
/* ************************************ */
/* AT91F_UsbDescSetDescriptor */
/* */
/* Arguments: */
/* pSetup: pointer to setup datas */
/* Return: */
/* Nothing */
/* Description: */
/* This request may be used to */
/* update existing descripotrs or */
/* new descriptors may be added */
/* ************************************ */
void AT91F_UsbDescSetDescriptor(
AT91PS_UsbDesc const pUsbDesc, /* pointer to a AT91S_UsbDesc structure */
AT91PS_UsbSetup pSetup) /* USB setup data Cf USB spec rev 1.1 */
{
u_int usbState = AT91F_UdpGetState(pUsbDesc->pUdp);
/* ================ Configured or Address state ================= */
if ( ((usbState & UDP_CONFG) || (usbState & UDP_FADDEN))) {
if (pUsbDesc->SetDescriptor)
pUsbDesc->SetDescriptor (
(pSetup->wValue >> 8), /* Descriptor type */
(pSetup->wValue & 0xFF), /* Descriptor index */
pSetup->wIndex, /* Language ID */
pSetup->wLength, /* Desriptor length */
pUsbDesc->pPrivateStandardData);
else
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
/* =================== Default state ================= */
else
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
/* ************************************ */
/* AT91F_UsbDescSetFeature */
/* */
/* Arguments: */
/* pSetup: pointer to setup datas */
/* Return: */
/* Nothing */
/* Description: */
/* This request is used to set or */
/* enable a specific feature */
/* ************************************ */
void AT91F_UsbDescSetFeature(
AT91PS_UsbDesc const pUsbDesc, /* pointer to a AT91S_UsbDesc structure */
AT91PS_UsbSetup pSetup) /* USB setup data Cf USB spec rev 1.1 */
{
u_int usbState = AT91F_UdpGetState(pUsbDesc->pUdp);
u_int recipient = (pSetup->bmRequestType & 0x1F);
/* Check request arguments */
if (recipient > 2 || pSetup->wLength != 0)
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
/* ================ Configured state ================= */
else if ( (usbState & UDP_CONFG) ) {
if (pUsbDesc->SetFeature)
pUsbDesc->SetFeature (recipient, pSetup->wIndex, pSetup->wValue, pUsbDesc->pPrivateStandardData);
else
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
/* =================== Address state ================= */
else if ( (usbState & UDP_FADDEN) ) {
/* This request is valid in Address State only when reference endpoint 0 */
if (recipient != 2 || pSetup->wIndex != 0)
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
else {
if (pUsbDesc->SetFeature)
pUsbDesc->SetFeature (recipient, pSetup->wIndex, pSetup->wValue, pUsbDesc->pPrivateStandardData);
else
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
}
/* =================== Default state ================= */
else
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
/* ************************************ */
/* AT91F_UsbDescSetInterface */
/* */
/* Arguments: */
/* pSetup: pointer to setup datas */
/* Return: */
/* Nothing */
/* Description: */
/* This request allows the host to */
/* select an alternate setting for */
/* the specified interface */
/* ************************************ */
void AT91F_UsbDescSetInterface(
AT91PS_UsbDesc const pUsbDesc, /* pointer to a AT91S_UsbDesc structure */
AT91PS_UsbSetup pSetup) /* USB setup data Cf USB spec rev 1.1 */
{
u_int usbState = AT91F_UdpGetState(pUsbDesc->pUdp);
/* Check request arguments */
if (pSetup->wLength != 0)
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
/* ================ Configured state ================= */
else if ( (usbState & UDP_CONFG) ) {
if (pUsbDesc->SetInterface)
pUsbDesc->SetInterface (pSetup->wIndex, pSetup->wValue, pUsbDesc->pPrivateStandardData);
else
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
/* =================== Address state ================= */
else if ( (usbState & UDP_FADDEN) )
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
/* =================== Default state ================= */
else
/* Device behavior not specified */
AT91F_UdpEpEow(pUsbDesc->pUdp, pUsbDesc->epId);
}
/* ************************************ */
/* AT91F_UsbDescSynchFrame */
/* */
/* Arguments: */
/* pSetup: pointer to setup datas */
/* Return: */
/* Nothing */
/* Description: */
/* This request is used to set and */
/* then report an ep's synch.frame. */
/* ************************************ */
void AT91F_UsbDescSynchFrame(
AT91PS_UsbDesc const pUsbDesc, /* pointer to a AT91S_UsbDesc structure */
AT91PS_UsbSetup pSetup) /* USB setup data Cf USB spec rev 1.1 */
{
u_int usbState = AT91F_UdpGetState(pUsbDesc->pUdp);
/* Check request arguments */
if (pSetup->wValue != 0 || pSetup->wLength != 2)
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
/* ================ Configured state ================= */
else if ( (usbState & UDP_CONFG) ) {
if (pUsbDesc->SynchFrame)
pUsbDesc->SynchFrame (pSetup->wIndex, pUsbDesc->pPrivateStandardData);
else
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
/* =================== Address state ================= */
else if ( (usbState & UDP_FADDEN) )
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
/* =================== Default state ================= */
else
/* Device behavior not specified */
AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
}
/* ************************************ */
/* AT91F_UdpConfigure */
/* */
/* Arguments: */
/* pEp: pointer to endpoint */
/* standard USB descriptor */
/* Return: */
/* Nothing */
/* Description: */
/* Configure USB endpoints according*/
/* to the endpoint descriptor */
/* ************************************ */
void AT91F_UdpConfigure(
AT91PS_UsbDesc const pUsbDesc, /* pointer to a AT91S_UsbDesc structure */
AT91PS_UsbEndpoint const pEp)
{
if (pEp->bEndpointAddress & (1 << 7)) {
/* IN endpoint */
switch (pEp->bmAttributes & 0x03) {
case 0: AT91F_UdpEpConfigure(pUsbDesc->pUdp, pUsbDesc->epId, UDP_EPDS | UDP_CONTROL); break;
case 1: AT91F_UdpEpConfigure(pUsbDesc->pUdp, pUsbDesc->epId, UDP_EPDS | UDP_ISOCHRONOUS_IN); break;
case 2: AT91F_UdpEpConfigure(pUsbDesc->pUdp, pUsbDesc->epId, UDP_EPDS | UDP_BULK_IN); break;
default: AT91F_UdpEpConfigure(pUsbDesc->pUdp, pUsbDesc->epId, UDP_EPDS | UDP_INTERRUPT_IN); break;
}
}
else {
/* OUT endpoint */
switch (pEp->bmAttributes & 0x03) {
case 0: AT91F_UdpEpConfigure(pUsbDesc->pUdp, pUsbDesc->epId, UDP_EPDS | UDP_CONTROL); break;
case 1: AT91F_UdpEpConfigure(pUsbDesc->pUdp, pUsbDesc->epId, UDP_EPDS | UDP_ISOCHRONOUS_OUT); break;
case 2: AT91F_UdpEpConfigure(pUsbDesc->pUdp, pUsbDesc->epId, UDP_EPDS | UDP_BULK_OUT); break;
default: AT91F_UdpEpConfigure(pUsbDesc->pUdp, pUsbDesc->epId, UDP_EPDS | UDP_INTERRUPT_OUT); break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -