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

📄 host2131.c

📁 CYPRESS公司SL811HS芯片 USB主机和USB设备的实现
💻 C
📖 第 1 页 / 共 2 页
字号:
			DescBufLen = pStr->bLength; // set string length			
            if(!GetDesc(EpAddr,(WORD)(0x02<<8)|STRING,0x0904,pStr->bLength,DBUF)) 		
              DescBufLen = 0;
          }
		}

		addr = DBUF;
		len = (DescBufLen<ReqLen) ? DescBufLen : ReqLen;
		if(SETUPDAT[0] == 0xC0)         // if (DIR=IN)
		{
			while(len)					// Move requested data through EP0IN one packet at a time.
			{
				if(len < EP0BUFF_SIZE)
					bc = len;
				else
					bc = EP0BUFF_SIZE;

				for(i=0; i<bc; i++)
						*(IN0BUF+i) = *((BYTE xdata *)addr+i);
				IN0BC = (BYTE)bc;       // Arm endpoint
				addr += bc;
				len -= bc;
				while(EP0CS & 0x04);    // Wait for INBSY to clear
			}
            IN0BC = 0x00;             // arm endp, # bytes to xfr
            EP0CS |= bmBIT1;          // ack handshake phase of device request
		}
		break;
    }
    case SL_REFRESH:
	{
		addr = DBUF;
	    len = GetDevInfo(DBUF);

		if(SETUPDAT[0] == 0xC0)         // if (DIR=IN)
		{
			while(len)					// Move requested data through EP0IN one packet at a time.
			{
				if(len < EP0BUFF_SIZE)
					bc = len;
				else
					bc = EP0BUFF_SIZE;

				for(i=0; i<bc; i++)
						*(IN0BUF+i) = *((BYTE xdata *)addr+i);
				IN0BC = (BYTE)bc;       // Arm endpoint
				addr += bc;
				len -= bc;
				while(EP0CS & 0x04);    // Wait for INBSY to clear
			}
            IN0BC = 0x00;             // arm endp, # bytes to xfr
            EP0CS |= bmBIT1;          // ack handshake phase of device request
		}
      break;
    }

    case SL_DATA_XFER_START:                  // Data Transfer with ds Dev
	{
		EpAddr = SETUPDAT[2];		// Get address and length
		EpIdx = SETUPDAT[4];
		len = SETUPDAT[6];

		addr = OUT_DATA;
		if(SETUPDAT[0] == 0xC0)         // if (DIR=IN)
		{
	        retDataRW = DataRW(EpAddr,EpIdx,64,len,OUT_DATA);
            if((remainder) && (remainder < len))
              len -= remainder;
			if(!retDataRW)
			{
				bc = 0;
				IN0BC = (BYTE)bc;       // Arm endpoint
				while(EP0CS & 0x04);    // Wait for INBSY to clear
				break;
			}
			while(len)					// Move requested data through EP0IN 
			{							// one packet at a time.

				if(len < EP0BUFF_SIZE)
					bc = len;
				else
					bc = EP0BUFF_SIZE;

					for(i=0; i<bc; i++)
						*(IN0BUF+i) = *((BYTE xdata *)addr+i);

				IN0BC = (BYTE)bc;       // Arm endpoint

				addr += bc;
				len -= bc;

				while(EP0CS & 0x04);    // Wait for INBSY to clear
			}
		}
		else if(SETUPDAT[0] == 0x40)    // if (DIR=OUT)
		{
			while(len)					// Move new data through EP0OUT 
			{							// one packet at a time.
				OUT0BC = 0;  // Clear bytecount to allow new data in; also stops NAKing

				while(EP0CS & 0x08);

				bc = OUT0BC; // Get the new bytecount

					for(i=0; i<bc; i++)
						 *((BYTE xdata *)addr+i) = *(OUT0BUF+i);

				addr += bc;
				len -= bc;
			}
	       retDataRW = DataRW(EpAddr,EpIdx,64,bc,OUT_DATA);
		}
		break;
    }
    case SL_TOGGLE_DS_REFRESH:
	{
	  dsPoll = !dsPoll;         // toggle downstream poll
      *IN0BUF = SETUPDAT[1];    // return command type
      IN0BC = 0x01;             // arm endp, # bytes to xfr
      EP0CS |= bmBIT1;          // ack handshake phase of device request
      break;
    }

    case SL_SHOW_REGS:
	{
		addr = REGBUFF;
		len = 16;
		for(RegAddr=0; RegAddr<len; RegAddr++)
          REGBUFF[RegAddr] = SL811Read(RegAddr);

		if(SETUPDAT[0] == 0xC0)         // if (DIR=IN)
		{
			while(len)					// Move requested data through EP0IN one packet at a time.
			{
				if(len < EP0BUFF_SIZE)
					bc = len;
				else
					bc = EP0BUFF_SIZE;

				for(i=0; i<bc; i++)
						*(IN0BUF+i) = *((BYTE xdata *)addr+i);
				IN0BC = (BYTE)bc;       // Arm endpoint
				addr += bc;
				len -= bc;
				while(EP0CS & 0x04);    // Wait for INBSY to clear
			}
            IN0BC = 0x00;             // arm endp, # bytes to xfr
            EP0CS |= bmBIT1;          // ack handshake phase of device request
		}
        break;
    }


    default:
    {
      break;
    }
  }
  return( FALSE );              // no errors, cmd handled okay
}

//-----------------------------------------------------------------------------
// USB Interrupt Handlers
//	The following functions are called by the USB interrupt jump table.
//-----------------------------------------------------------------------------

// Setup Data Available Interrupt Handler
void ISR_Sudav(void) interrupt 0
{
	GotSUD = TRUE;				// Set flag
	EZUSB_IRQ_CLEAR();
	USBIRQ = bmSUDAV;			// Clear SUDAV IRQ
}

// Setup Token Interrupt Handler
void ISR_Sutok(void) interrupt 0
{
	EZUSB_IRQ_CLEAR();
	USBIRQ = bmSUTOK;			// Clear SUTOK IRQ
}

void ISR_Sof(void) interrupt 0
{
	EZUSB_IRQ_CLEAR();
	USBIRQ = bmSOF;				// Clear SOF IRQ
}

void ISR_Ures(void) interrupt 0
{
	EZUSB_IRQ_CLEAR();
	USBIRQ = bmURES;			// Clear URES IRQ
}

void ISR_IBN(void) interrupt 0
{
}

void ISR_Susp(void) interrupt 0
{
	Sleep = TRUE;
	EZUSB_IRQ_CLEAR();
	USBIRQ = bmSUSP;
}

void ISR_Ep0in(void) interrupt 0
{
}

void ISR_Ep0out(void) interrupt 0
{
}

void ISR_Ep1in(void) interrupt 0
{
}

void ISR_Ep1out(void) interrupt 0
{
	int i;

	for(i=0;i<OUT1BC;i++)
		HOSTCMD[i] = OUT1BUF[i];

	OUT1BC = 0;
	BULK_OUT_DONE = TRUE;
 	EZUSB_IRQ_CLEAR();
   	OUT07IRQ = bmEP1;
}

void ISR_Ep2in(void) interrupt 0
{
}

void ISR_Ep2out(void) interrupt 0
{
}

void ISR_Ep3in(void) interrupt 0
{
}

void ISR_Ep3out(void) interrupt 0
{
}

void ISR_Ep4in(void) interrupt 0
{
}

void ISR_Ep4out(void) interrupt 0
{
}

void ISR_Ep5in(void) interrupt 0
{
}

void ISR_Ep5out(void) interrupt 0
{
}

void ISR_Ep6in(void) interrupt 0
{
}

void ISR_Ep6out(void) interrupt 0
{
}

void ISR_Ep7in(void) interrupt 0
{
}

void ISR_Ep7out(void) interrupt 0
{
}

⌨️ 快捷键说明

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