📄 obj_usbdesc.c
字号:
//*----------------------------------------------------------------------------//* ATMEL Microcontroller Software Support - ROUSSET -//*----------------------------------------------------------------------------//* The software is delivered "AS IS" without warranty or condition of any//* kind, either express, implied or statutory. This includes without//* limitation any warranty or condition with respect to merchantability or//* fitness for any particular purpose, or against the infringements of//* intellectual property rights of others.//*----------------------------------------------------------------------------//* File Name : obj_udpdesc.c//* Object : USB peripheral library.//*//* 1.0 07/23/01 ODi : Creation//*----------------------------------------------------------------------------#include "services/obj_usbdesc.h"/* ************************************ *//* AT91F_OpenUsbDesc *//* *//* Arguments: *//* Return: *//* Pointer toAT91PS_UsbDesc object *//* Description: *//* ************************************ */AT91PS_UsbDesc AT91F_OpenUsbDesc( AT91PS_UsbDesc pUsbDesc, /* pointer to a AT91S_UsbDesc structure */ AT91PS_UDP pUdp, /* Uregister structure */ char epId) /* endpoint number */{ pUsbDesc->DispatchRequest = AT91F_UsbDescDispatchRequest; //pUsbDesc->DispatchClassRequest = (AT91PF_DispatchClassRequest) 0; //pUsbDesc->DispatchVendorRequest = (AT91PF_DispatchVendorRequest) 0; //pUsbDesc->ClearFeature = (AT91PF_ClearFeature) 0; //pUsbDesc->GetConfiguration = (AT91PF_GetConfiguration) 0; //pUsbDesc->GetDescriptor = (AT91PF_GetDescriptor) 0; //pUsbDesc->GetInterface = (AT91PF_GetInterface) 0; //pUsbDesc->GetStatus = (AT91PF_GetStatus) 0; //pUsbDesc->SetAddress = (AT91PF_SetAddress) 0; //pUsbDesc->SetConfiguration = (AT91PF_SetConfiguration) 0; //pUsbDesc->SetDescriptor = (AT91PF_SetDescriptor) 0; //pUsbDesc->SetFeature = (AT91PF_SetFeature) 0; //pUsbDesc->SetInterface = (AT91PF_SetInterface) 0; //pUsbDesc->SynchFrame = (AT91PF_SynchFrame) 0; pUsbDesc->pUdp = pUdp; pUsbDesc->epId = epId; return pUsbDesc;}/* ************************************ *//* usbDescDispatchRequest *//* *//* Arguments: *//* pSetup: pointer to setup datas *//* Return: *//* Nothing *//* Description: *//* This request handle standard *//* request or call *//* usbDescDispatchClassRequest *//* usbDescDispatchVendorRequest *//* ************************************ */void AT91F_UsbDescDispatchRequest( AT91PS_UsbDesc const pDesc, /* pointer to a AT91S_UsbDesc structure */ AT91PS_UsbSetup pSetup) /* USB setup data Cf USB spec rev 1.1 */{ switch ((pSetup->bmRequestType & (0x60)) >> 5) { case 0: /* Standard request */ switch (pSetup->bRequest) { case USB_CLEAR_FEATURE: AT91F_UsbDescClearFeature (pDesc, pSetup); break; case USB_GET_CONFIGURATION: AT91F_UsbDescGetConfiguration(pDesc, pSetup); break; case USB_GET_DESCRIPTOR: AT91F_UsbDescGetDescriptor (pDesc, pSetup); break; case USB_GET_INTERFACE: AT91F_UsbDescGetInterface (pDesc, pSetup); break; case USB_GET_STATUS: AT91F_UsbDescGetStatus (pDesc, pSetup); break; case USB_SET_ADDRESS: AT91F_UsbDescSetAddress (pDesc, pSetup); break; case USB_SET_CONFIGURATION: AT91F_UsbDescSetConfiguration(pDesc, pSetup); break; case USB_SET_DESCRIPTOR: AT91F_UsbDescSetDescriptor (pDesc, pSetup); break; case USB_SET_FEATURE: AT91F_UsbDescSetFeature (pDesc, pSetup); break; case USB_SET_INTERFACE: AT91F_UsbDescSetInterface (pDesc, pSetup); break; case USB_SYNCH_FRAME: AT91F_UsbDescSynchFrame (pDesc, pSetup); break; default: AT91F_UdpEpStall (pDesc->pUdp, pDesc->epId); break; } break; case 1: /* Class request */ if (pDesc->DispatchClassRequest) pDesc->DispatchClassRequest(pSetup, pDesc->pPrivateClassData); break; case 2: /* Vendor request */ if (pDesc->DispatchVendorRequest) pDesc->DispatchVendorRequest(pSetup, pDesc->pPrivateVendorData); break; default: /* Reserved */ AT91F_UdpEpStall(pDesc->pUdp, pDesc->epId); break; } return;}/* ************************************ *//* AT91F_UsbDescClearFeature *//* *//* Arguments: *//* pSetup: pointer to setup datas *//* Return: *//* Nothing *//* Description: *//* This request is used to clear or *//* disable a specific feature *//* ************************************ */void AT91F_UsbDescClearFeature( 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 an application handler exists, transmit the request */ if (pUsbDesc->ClearFeature) pUsbDesc->ClearFeature(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 != 0 && pSetup->wIndex != 0) AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId); else { /* If an application handler exists, transmit the request */ if (pUsbDesc->ClearFeature ) pUsbDesc->ClearFeature(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_UsbDescGetConfiguration *//* *//* Arguments: *//* pSetup: pointer to setup datas *//* Return: *//* Nothing *//* Description: *//* This request returns the current *//* device configuration value *//* ************************************ */void AT91F_UsbDescGetConfiguration( 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->wIndex != 0 || pSetup->wLength != 1) /* Device behavior not specified */ AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId); /* ================ Configured state ================= */ else if ( (usbState & UDP_CONFG) ) { /* If an application handler exists, transmit the request */ if (pUsbDesc->GetConfiguration ) pUsbDesc->GetConfiguration(pUsbDesc->pPrivateStandardData); else AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId); } /* =================== Address state ================= */ else if ( (usbState & UDP_FADDEN) ) { /* Return a 0 value */ AT91F_UdpEpWrite(pUsbDesc->pUdp, pUsbDesc->epId, "\0x00", 1); AT91F_UdpEpEow(pUsbDesc->pUdp, pUsbDesc->epId); } /* =================== Default state ================= */ else /* Device behavior not specified */ AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);}/* ************************************ *//* AT91F_UsbDescGetDescriptor *//* *//* Arguments: *//* pSetup: pointer to setup datas *//* Return: *//* Nothing *//* Description: *//* This request returns the *//* specified descriptor if the *//* descriptor exists *//* ************************************ */void AT91F_UsbDescGetDescriptor( AT91PS_UsbDesc const pUsbDesc, /* pointer to a AT91S_UsbDesc structure */ AT91PS_UsbSetup pSetup) /* USB setup data Cf USB spec rev 1.1 */{ /* This request is valid in all states */ if (pUsbDesc->GetDescriptor) pUsbDesc->GetDescriptor ( ((pSetup->wValue) >> 8), /* Descriptor type */ ((pSetup->wValue) & 0xFF), /* Descriptor Index */ pSetup->wIndex, /* Language ID */ pSetup->wLength, /* Descripotr Length */ pUsbDesc->pPrivateStandardData); else AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);}/* ************************************ *//* AT91F_UsbDescGetInterface *//* *//* Arguments: *//* pSetup: pointer to setup datas *//* Return: *//* Nothing *//* Description: *//* This request returns the *//* selected alternate setting for *//* the specified interface *//* ************************************ */void AT91F_UsbDescGetInterface( 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 != 1) /* Device behavior not specified */ AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId); /* ================ Configured state ================= */ else if ( (usbState & UDP_CONFG) ) { /* If an application handler exists, transmit the request */ if (pUsbDesc->GetInterface) pUsbDesc->GetInterface(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_UsbDescGetStatus *//* *//* Arguments: *//* pSetup: pointer to setup datas *//* Return: *//* Nothing *//* Description: *//* This request returns status for *//* the specified endpoint *//* ************************************ */void AT91F_UsbDescGetStatus( 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->wValue != 0 || pSetup->wLength != 2) /* Device behavior not specified */ AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId); else if (recipient == 0 && pSetup->wIndex != 0) /* Device behavior not specified */ AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId); /* ================ Configured state ================= */ else if ( (usbState & UDP_CONFG) ) { if (pUsbDesc->GetStatus) pUsbDesc->GetStatus(recipient, pSetup->wIndex, pUsbDesc->pPrivateStandardData); else AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId); } /* =================== Address state ================= */ else if ( (usbState & UDP_FADDEN) ) { if (pSetup->wIndex != 0 || !(pUsbDesc->GetStatus)) AT91F_UdpEpStall(pUsbDesc->pUdp, pUsbDesc->epId);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -