usb_descriptors.c
//Serial Number string descriptor
ram struct{BYTE bLength;BYTE bDscType;WORD string[8];}sd003={
sizeof(sd003),USB_DESCRIPTOR_STRING,
{'d','e','a','d','b','e','e','f'}
};
//Array of string descriptors
BYTE *USB_SD_Ptr[]=
{
(BYTE *)&sd000,
(BYTE *)&sd001,
(BYTE *)&sd002,
(BYTE *)&sd003
};
main.c
This is where the values are loaded from the EEProm.
void InitializeSystem(void)
{
struct dscinfo {
BYTE bLength;
BYTE bDscType;
WORD string[8];
};
struct dscinfo *ptr;
int i;
ptr = (struct dscinfo *)USB_SD_Ptr[3];
EECON1bits.CFGS = 0;
EECON1bits.EEPGD = 0;
for (i=0;i<8;i++) {
EEADR = 0x00 + i;
EECON1bits.RD = 1;
ptr->string[i] = EEDATA;
}
...
usb_device.c
void USBStdGetDscHandler(void)
{
if(SetupPkt.bmRequestType == 0x80)
{
inPipes[0].info.Val = USB_INPIPES_ROM | USB_INPIPES_BUSY | USB_INPIPES_INCLUDE_ZERO;
switch(SetupPkt.bDescriptorType)
{
case USB_DESCRIPTOR_DEVICE:
#if !defined(USB_USER_DEVICE_DESCRIPTOR)
inPipes[0].pSrc.bRom = (ROM BYTE*)&device_dsc;
#else
inPipes[0].pSrc.bRom = (ROM BYTE*)USB_USER_DEVICE_DESCRIPTOR;
#endif
inPipes[0].wCount.Val = sizeof(device_dsc);
break;
case USB_DESCRIPTOR_CONFIGURATION:
#if !defined(USB_USER_CONFIG_DESCRIPTOR)
inPipes[0].pSrc.bRom = *(USB_CD_Ptr+SetupPkt.bDscIndex);
#else
inPipes[0].pSrc.bRom = *(USB_USER_CONFIG_DESCRIPTOR+SetupPkt.bDscIndex);
#endif
inPipes[0].wCount.Val = *(inPipes[0].pSrc.wRom+1); // Set data count
break;
case USB_DESCRIPTOR_STRING:
inPipes[0].info.Val = USB_INPIPES_RAM | USB_INPIPES_BUSY | USB_INPIPES_INCLUDE_ZERO;
inPipes[0].pSrc.bRam = *(USB_SD_Ptr+SetupPkt.bDscIndex);
inPipes[0].wCount.Val = *inPipes[0].pSrc.bRam; // Set data count
break;
default:
inPipes[0].info.Val = 0;
break;
}//end switch
}//end if
}//end USBStdGetDscHandler
usb_device.h
//Array of string descriptors extern BYTE *USB_SD_Ptr[];
No comments:
Post a Comment