⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb_isr.c

📁 基于C8051单片机的USB Device driver
💻 C
📖 第 1 页 / 共 2 页
字号:
                  }
                  else
                  {
                     gEp0Status.pData = (BYTE *)&ZERO_PACKET;
                     gEp0Status.uNumBytes = 2;
                  }
               }
               else
               {
                  ForceStall();
               }
            }
         }
         break;

      default:
         ForceStall();
         break;
   }

   if (gEp0Status.bEpState != EP_STALL)
   {
      WRITE_REGISTER(E0CSR, rbSOPRDY);
      gEp0Status.bEpState = EP_TX;
   }
}

void ClearFeature(void)
{
   if ((gDeviceStatus.bDevState != DEV_CONFIGURED)  ||
   (gSetup.bmRequestType == IN_DEVICE)                  ||
   (gSetup.bmRequestType == IN_INTERFACE)             ||
   gSetup.wValue.c[MSB] || gSetup.wIndex.c[MSB]     ||
   gSetup.wLength.c[MSB] || gSetup.wLength.c[LSB])
   {
      ForceStall();
   }
   else
   {
      if ((gSetup.bmRequestType == IN_ENDPOINT) &&
      (gSetup.wValue.c[LSB] == ENDPOINT_HALT) &&
      ((gSetup.wIndex.c[LSB] == IN_EP1) ||
      (gSetup.wIndex.c[LSB] == OUT_EP2)))
      {
         if (gSetup.wIndex.c[LSB] == IN_EP1)
         {
            WRITE_REGISTER(INDEX, EP1_IN_IDX);
            WRITE_REGISTER(EINCSRL, rbInCLRDT);
            gEp1InStatus.bEpState = EP_IDLE;
         }
         else
         {
            WRITE_REGISTER(INDEX, EP2_OUT_IDX);
            WRITE_REGISTER(EINCSRL, rbInCLRDT);
            gEp2OutStatus.bEpState = EP_IDLE;
         }
      }
      else
      {
         ForceStall();
      }
   }

   WRITE_REGISTER(INDEX, EP0_IDX);
   if (gEp0Status.bEpState != EP_STALL)
   {
      WRITE_REGISTER(E0CSR, (rbSOPRDY |rbDATAEND));
   }
}

void SetFeature(void)
{
   if ((gDeviceStatus.bDevState != DEV_CONFIGURED)  ||
   (gSetup.bmRequestType == IN_DEVICE)                  ||
   (gSetup.bmRequestType == IN_INTERFACE)             ||
   gSetup.wValue.c[MSB] || gSetup.wIndex.c[MSB]     ||
   gSetup.wLength.c[MSB] || gSetup.wLength.c[LSB])
   {
      ForceStall();
   }
   else
   {
      if ((gSetup.bmRequestType == IN_ENDPOINT) &&
      (gSetup.wValue.c[LSB] == ENDPOINT_HALT) &&
      ((gSetup.wIndex.c[LSB] == IN_EP1) ||
      (gSetup.wIndex.c[LSB] == OUT_EP2)))
      {
         if (gSetup.wIndex.c[LSB] == IN_EP1)
         {
            WRITE_REGISTER(INDEX, EP1_IN_IDX);
            WRITE_REGISTER(EINCSRL, rbInSDSTL);
            gEp1InStatus.bEpState = EP_HALT;
         }
         else
         {
            WRITE_REGISTER(INDEX, EP2_OUT_IDX);
            WRITE_REGISTER(EINCSRL, rbOutSDSTL);
            gEp2OutStatus.bEpState = EP_HALT;
         }
      }
      else
      {
         ForceStall();
      }
   }

   WRITE_REGISTER(INDEX, EP0_IDX);
   if (gEp0Status.bEpState != EP_STALL)
   {
      WRITE_REGISTER(E0CSR, (rbSOPRDY |rbDATAEND));
   }
}

void SetAddress(void)
{
   if ((gSetup.bmRequestType != IN_DEVICE)           ||
   gSetup.wIndex.c[MSB] || gSetup.wIndex.c[LSB]   ||
   gSetup.wLength.c[MSB] || gSetup.wLength.c[LSB] ||
   gSetup.wValue.c[MSB] || (gSetup.wValue.c[LSB] & 0x80))
   {
      ForceStall();
   }

   gEp0Status.bEpState = EP_ADDRESS;
   if (gSetup.wValue.c[LSB] != 0)
   {
      gDeviceStatus.bDevState = DEV_ADDRESS;
   }
   else
   {
      gDeviceStatus.bDevState = DEV_DEFAULT;
   }

   if (gEp0Status.bEpState != EP_STALL)
   {
      WRITE_REGISTER(E0CSR, (rbSOPRDY | rbDATAEND));
   }
}

void GetDescriptor(void)
{
   switch(gSetup.wValue.c[MSB])
   {
      case DSC_DEVICE:
         gEp0Status.pData = (BYTE *)&gDevice_Desc;
         gEp0Status.uNumBytes = gDevice_Desc.bLength;
         break;

      case DSC_CONFIG:
         gEp0Status.pData = (BYTE *)&gConfig_Desc;
         gEp0Status.uNumBytes = gConfig_Desc.wTotalLength.c[MSB] + 256*gConfig_Desc.wTotalLength.c[LSB];
         break;

      case DSC_INTERFACE:
         gEp0Status.pData = (BYTE *)&gInterface_Desc;
         gEp0Status.uNumBytes = gInterface_Desc.bLength;

      case DSC_ENDPOINT:
         if ((gSetup.wValue.c[LSB] == IN_EP1) ||
         (gSetup.wValue.c[LSB] == OUT_EP2))
         {
            if (gSetup.wValue.c[LSB] == IN_EP1)
            {
               gEp0Status.pData = (BYTE *)&gEndpoint1_Desc;
               gEp0Status.uNumBytes = gEndpoint1_Desc.bLength;
            }
            else
            {
               gEp0Status.pData = (BYTE *)&gEndpoint2_Desc;
               gEp0Status.uNumBytes = gEndpoint2_Desc.bLength;
            }
         }
         else
         {
            ForceStall();
         }
         break;

      default:
         ForceStall();
         break;
   }

   if (gSetup.wValue.c[MSB] == DSC_DEVICE ||
   gSetup.wValue.c[MSB] == DSC_CONFIG     ||
   gSetup.wValue.c[MSB] == DSC_INTERFACE ||
   gSetup.wValue.c[MSB] == DSC_ENDPOINT)
   {
      if ((gSetup.wLength.c[LSB] < gEp0Status.uNumBytes) &&
      (gSetup.wLength.c[MSB] == 0))
      {
         gEp0Status.uNumBytes = gSetup.wLength.i;
      }
   }

   if (gEp0Status.bEpState != EP_STALL)
   {
      WRITE_REGISTER(E0CSR, rbSOPRDY);
      gEp0Status.bEpState = EP_TX;
   }
}

void GetConfiguration(void)
{
   if ((gSetup.bmRequestType != OUT_DEVICE)      ||
   gSetup.wValue.c[MSB] || gSetup.wValue.c[LSB] ||
   gSetup.wIndex.c[MSB] || gSetup.wIndex.c[LSB] ||
   gSetup.wLength.c[MSB] || (gSetup.wLength.c[LSB] != 1))
   {
      ForceStall();
   }
   else
   {
      if (gDeviceStatus.bDevState == DEV_CONFIGURED)
      {
         gEp0Status.pData = (BYTE *)&ONES_PACKET;
         gEp0Status.uNumBytes = 1;
      }

      if (gDeviceStatus.bDevState == DEV_ADDRESS)
      {
         gEp0Status.pData = (BYTE *)&ZERO_PACKET;
         gEp0Status.uNumBytes = 1;
      }
   }

   if (gEp0Status.bEpState != EP_STALL)
   {
      WRITE_REGISTER(E0CSR, rbSOPRDY);
      gEp0Status.bEpState = EP_TX;
   }
}

void SetConfiguration(void)
{
   if ((gDeviceStatus.bDevState == DEV_DEFAULT)      ||
   (gSetup.bmRequestType != IN_DEVICE)                   ||
   gSetup.wIndex.c[MSB] || gSetup.wIndex.c[LSB]      ||
   gSetup.wLength.c[MSB] || gSetup.wLength.c[LSB]    ||
   gSetup.wValue.c[MSB] || (gSetup.wValue.c[LSB] > 1))
   {
      ForceStall();
   }
   else
   {
      if (gSetup.wValue.c[LSB] > 0)
      {
         gDeviceStatus.bDevState = DEV_CONFIGURED;
         gEp1InStatus.bEpState = EP_IDLE;
         gEp2OutStatus.bEpState = EP_IDLE;
         WRITE_REGISTER(INDEX, EP1_IN_IDX);
         WRITE_REGISTER(EINCSRH, rbInDIRSEL);
         WRITE_REGISTER(INDEX, EP0_IDX);
      }
      else
      {
         gDeviceStatus.bDevState = DEV_ADDRESS;
         gEp1InStatus.bEpState = EP_HALT;
         gEp2OutStatus.bEpState = EP_HALT;
      }
   }

   if (gEp0Status.bEpState != EP_STALL)
   {
      WRITE_REGISTER(E0CSR, (rbSOPRDY | rbDATAEND));
   }
}

void GetInterface(void)
{
   if ((gDeviceStatus.bDevState != DEV_CONFIGURED)   ||
   (gSetup.bmRequestType != OUT_INTERFACE)              ||
   gSetup.wValue.c[MSB] || gSetup.wValue.c[LSB]          ||
   gSetup.wIndex.c[MSB] || gSetup.wIndex.c[LSB]         ||
   gSetup.wLength.c[MSB] || (gSetup.wLength.c[LSB] != 1))
   {
      ForceStall();
   }
   else
   {
      gEp0Status.pData = (BYTE *)&ZERO_PACKET;
      gEp0Status.uNumBytes = 1;
   }

   if (gEp0Status.bEpState != EP_STALL)
   {
      WRITE_REGISTER(E0CSR, rbSOPRDY);
      gEp0Status.bEpState = EP_TX;
   }
}

void SetInterface(void)
{
   if ((gSetup.bmRequestType != IN_INTERFACE)         ||
   gSetup.wLength.c[MSB] || gSetup.wLength.c[LSB]   ||
   gSetup.wValue.c[MSB] || gSetup.wValue.c[LSB]      ||
   gSetup.wIndex.c[MSB] || gSetup.wIndex.c[LSB])
   {
      ForceStall();
   }

   if (gEp0Status.bEpState != EP_STALL)
   {
      WRITE_REGISTER(E0CSR, (rbSOPRDY | rbDATAEND));
   }
}

void ForceStall(void)
{
   WRITE_REGISTER(INDEX, EP0_IDX);
   WRITE_REGISTER(E0CSR, rbSDSTL);
   gEp0Status.bEpState = EP_STALL;
}

//----------------------------------------------------
//Low-level FIFO function
//----------------------------------------------------
void FIFORead(BYTE bEp, UINT uNumBytes, BYTE * pData)
{
   BYTE bTargetReg;
   UINT i;

   if (uNumBytes)
   {
      bTargetReg = bEp;

      USB0ADR = (bTargetReg & 0x3F);
      USB0ADR |= 0xC0;                       // auto read and initiate

      for (i=0; i<(uNumBytes-1); i++)
      {
         while(USB0ADR & 0x80);
         pData[i] = USB0DAT;
      }

      USB0ADR = (bTargetReg & 0xBF);  // clear auto-read
      while(USB0ADR & 0x80);
      pData[i] = USB0DAT;             // read the last byte
   }
}

void FIFOWrite(BYTE bEp, UINT uNumBytes, BYTE * pData)
{
   BYTE bTargetReg;
   UINT i;

   if (uNumBytes)
   {
      bTargetReg = bEp;

      while(USB0ADR & 0x80);

      USB0ADR = (bTargetReg & 0x3F);

      for (i=0; i<uNumBytes; i++)
      {
         while(USB0ADR & 0x80);
         USB0DAT = pData[i];
      }
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -