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

📄 usb.c

📁 Embest EudKit-II教学系统配Samsung S3C44B0处理器的部分测试程序。
💻 C
📖 第 1 页 / 共 3 页
字号:
		    	stall3=0;
		    	break;

		  	case 4:
		    	stall4=0;
		    	break;

		  	case 5:
		    	stall5=0;
		    	break;

		  	case 6:
		    	stall6=0;
		    	break;

		  	default:
		    	break;
		}
	      	break;

	    	default:
	      	break;
	}
}
/***************************************************************************
【功能说明】设置特性
****************************************************************************/
void setfeature(void)
{
	switch(usb_buf[0]&0x03)              /*find request target     */
	{
	    	case 0:                      /*DEVICE                  */
	      	break;

	    	case 1:                      /*INTERFACE               */
	      	break;

	    	case 2:                      /*ENDPOINT                */
	      	switch(usb_buf[4]&0x0F)      /*find specific endpoint  */
		    {                            /*  (strip off dir. bit)  */
			case 0:
		    	stall0 = 1;
		    	break;

		  	case 1:
		    	stall1 = 1;
		    	break;

		  	case 2:
		    	stall2 = 1;
		    	break;

		  	case 3:
		    	stall3 = 1;
		    	break;

		  	case 4:
		    	stall4 = 1;
		    	break;

		  	case 5:
		    	stall5 = 1;
		    	break;

		  	case 6:
		    	stall6 = 1;
		    	break;

		  	default:
		    	break;
		}
	      	break;

	    	default:
	      	break;
	}
}
/***************************************************************************
【功能说明】设置配置值
****************************************************************************/
void setconfiguration(void)
{
	usb_cfg=usb_buf[2];              /*set the configuration # */
	if(usb_cfg!=0)
	{
		dtapid_TGL0PID=0;
	    	dtapid_TGL1PID=0;
	    	dtapid_TGL3PID=0;

	    	stall0=stall1=stall2=0;
	    	stall3=stall4=stall5=0;
	    	stall6=0;

	    	FLUSHTX1;
	    	write_usb(EPC1,EP_EN+01);       /*enable EP1 at adr 1     */

	    	FLUSHRX1;
	    	write_usb(EPC2,EP_EN+02);       /*enable EP2 at adr 2     */

	    	FLUSHTX2;
	    	write_usb(EPC3,EP_EN+03);       /*enable EP3 at adr 3     */

	    	FLUSHRX2;
	    	write_usb(EPC4,EP_EN+04);       /*enable EP4 at adr 4     */

	    	FLUSHTX3;
	    	write_usb(EPC5,EP_EN+05);       /*enable EP5 at adr 5     */

	    	FLUSHRX3;
	    	write_usb(EPC6,EP_EN+06);       /*enable EP6 at adr 6     */

	    	write_usb(RXC1,RX_EN);
		write_usb(RXC3,RX_EN);
	}
	else                        /*unconfigure the device  */
	{
	    write_usb(EPC1,0);      /*disable EP1             */
	    write_usb(EPC2,0);      /*disable EP2             */
	    write_usb(EPC3,0);      /*disable EP3             */
	    write_usb(EPC4,0);      /*disable EP4             */
	    write_usb(EPC5,0);      /*disable EP5             */
	    write_usb(EPC6,0);      /*disable EP6             */
	}
}
/***************************************************************************
【功能说明】This subroutine handles OUT NAK events for FIFO0 (endpoint 0)
****************************************************************************/
void nak0(void)
{
	if(status_GETDESC)
	{
		status_GETDESC=0;        /*exit multi-packet mode  */
	  	FLUSHTX0;                /*flush TX0 and disable   */
	  	write_usb(RXC0,RX_EN);   /*re-enable the receiver  */
	}
}

void usb_alt(void)
{
	evnt=read_usb(ALTEV);         /*check the events        */
	if(evnt&RESET_A)              /*reset event             */
	{
	    write_usb(NFSR,RST_ST);   /*enter reset state       */
	    write_usb(FAR,AD_EN+0);   /*set default address     */
	    write_usb(EPC0, 0x00);    /*enable EP0 only         */
	    FLUSHTX0;                 /*flush TX0 and disable   */
	    write_usb(RXC0,RX_EN);    /*enable the receiver     */
	    write_usb(ALTMSK,SD3+RESET_A);/*adjust interrupts       */
	    write_usb(NFSR,OPR_ST);   /*go operational          */
	}

	else if(evnt&SD3)             /*suspend event           */
	{
	  write_usb(ALTMSK,RESUME_A+RESET_A);
	  write_usb(NFSR,SUS_ST);     /*enter suspend state     */
	}

	else if(evnt&RESUME_A)        /*resume  event           */
	{
	  write_usb(ALTMSK,SD3+RESET_A);
	  write_usb(NFSR,OPR_ST);     /*go operational          */
	}

	else 
	{
	}
}


/****************************************************************************
* 名称:
*		USB_Init()
* 功能:
*		初始化 USB 设备 (9603).
* 参数:
* 返回:
*		int 类型, 如果初始化成功返回非0, 失败返回0.
* 注释:
*		在对USB设备进行读写前, 需对USB设备进行初始化.
* 修改:
****************************************************************************/
int USB_Init(void)
{
	/* 关中断 */
	rINTMSK |= BIT_GLOBAL;
	/* 初始化USB中断 */
	Isr_Init();
	/* 初始化9603 */
	Init_9603();

	COMfront[0] = 0;
	COMfront[1] = 0;
	COMfront[2] = 0;

	COMtail[0] = 0;
	COMtail[1] = 0;
	COMtail[2] = 0;
	/* 开中断 */
	rINTMSK &= ~(BIT_GLOBAL);			//GLOBAL有效
	rINTMSK &= ~(BIT_EINT1);

	return 1;
}

/****************************************************************************
* 名称:
*		USB_Purge()
* 功能:
*		清除输入缓冲区.
* 参数:
*		channel		---输入,通道ID, (0-2)
* 返回:
*		int 类型, 成功返回1, 否则返回0 (通常是channel参数不正确).
* 注释:
* 修改:
****************************************************************************/
int USB_Purge(unsigned int channel)
{
	if(channel > 2)
		return 0;
	/* 关中断 */
	rINTMSK |= BIT_EINT1;

	COMtail[channel] = COMfront[channel] = 0;
	/* 开中断 */
	rINTMSK &= ~(BIT_EINT1);
	return 1;
}

/****************************************************************************
* 名称:
*	USB_Read()
* 功能:
*		从指定USB通道,接收指定的字节数到接收缓冲区.
* 参数:
*		channel		---输入,通道ID, (0-2)
*		rev_buf		---输出,接收数据的缓冲区指针
*		count		---输入,准备接收数据的大小,字节为单位
* 返回:
*		int 类型, 返回实际接收的数据大小,字节为单位, 错误返回-1.
* 注释:
*		USB_Read阻塞读取USB通道数据, 直到数据到达缓冲区.
* 修改:
****************************************************************************/
int USB_Read(unsigned channel, char *rev_buf, unsigned int count)
{
	unsigned int i=0;

	if(channel > 2)
		return -1;
	if(count == 0)
		return 0;
	while(COMtail[channel] == COMfront[channel]);

	/* 关中断 */
	rINTMSK |= BIT_EINT1;
	do
	{
		rev_buf[i++] = COMbuf[channel][COMtail[channel]++];
		if(COMtail[channel] > 64)
			COMtail[channel] = 0;
	} while(i < count && COMtail[channel] != COMfront[channel]);
	/* 开中断 */
	rINTMSK &= ~(BIT_EINT1);

	return i;
}
				
/****************************************************************************
* 名称:
*	USB_Write()
* 功能:
*		从指定USB通道发送指定的字节数的数据.
* 参数:
*		channel		---输入,通道ID, (0-2)
*		snd_buf		---输入,待发送的数据的缓冲区指针
*		length		---输入,准备发送数据的大小,字节为单位
* 返回:
*		int 类型, 返回实际发送的数据大小,字节为单位, 错误返回-1.
* 注释:
*		USB_Write阻塞发送USB通道数据, 直到发送完指定长度的数据.
* 修改:
****************************************************************************/
int USB_Write(unsigned channel, const char *snd_buf, unsigned int length)
{
	unsigned int i = 0, j;
	unsigned char count;

	if(channel > 2)
		return -1;
	if(length == 0)
		return 0;

	switch(channel)
	{
	case 0:
	case 1:
	case 2:
		while(i < length)
		{
			/* 关中断 */
			rINTMSK |= BIT_EINT1;
			FLUSHTX3
			do
			{
				(*(volatile unsigned char *)0x02000002) = TXS3;
				count = *(volatile unsigned char *)0x02000000;
				count &= 0x1f;
				(*(volatile unsigned char *)0x02000002)=TXD3;
				for(j=0; j<count && i<length; j++)
				{
					(*(volatile unsigned char *)0x02000000) = snd_buf[i++];
				}
			}while(count==0x1f && i<length);

			TXEN3_PID
			/* 开中断 */
			rINTMSK &= ~(BIT_EINT1);
 		}
   		break;
   	}
   	return i;
}

⌨️ 快捷键说明

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