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

📄 usb.c

📁 基于HMS7202的波形发生器源程序
💻 C
字号:
#include "usb.h"
#include "hms7202lib.h"

int usb_main(int addr, int *retsize)
{

    int val,ret;
    int address, endAddr;
    int i,k;
    int cksum;
    int txoffset,rxoffset;
    USL_PACKET_t cmdp, ReplyPkt;
	USL_PKT_STRUCT_t *pPkt, *pReplyPkt;
    USlaveBlock_t *uslb;

	uslb = uslave7202_setup(O_US_PACKET, O_US_HEARTBEAT);
	
	if(uslb == NULL)
	{
	    ser_printf("Fail at usb setup!\n");
	    return OK;
	}
	
	uslb->start(uslb);
	
	pReplyPkt = &ReplyPkt.u.pkt;
	pPkt = &cmdp.u.pkt;
	int done = 0;
	
	uslb->state = USL_INIT_STATE;
	
	do
	{
	    switch(uslb->state)
	    {
	    case USL_INIT_STATE:
	        ser_printf("init...\n");
	        uslb->state = USL_CMD_STATE;
	        rxoffset = 0;
	        txoffset = 0;
	        break;
	        
	    case USL_CMD_STATE:
	    	ser_printf("Cmd...\n");
	    	uslb->receive(uslb, (int *)&cmdp, (US_FIFO_SIZE-1)<<2);
	    	//从接收循环队列中取出7字内容,放入cmdp中
	    	
	    	uslb->state = USL_DECODE_STATE;
	    	break;
	    	
	    case USL_DECODE_STATE:
	        ser_printf("Decode Cmd...\n");
	        memset(pReplyPkt, 0, sizeof(*pReplyPkt));
	        
	    	pReplyPkt->Cmd = USLCMD_STATUS;
			pReplyPkt->nCmd = ~USLCMD_STATUS;
			cksum = 0;
			for(i=0;i<US_FIFO_SIZE-2; i++)
			cksum += cmdp.u.buffer[i];//将接收循环队列中取出的前6字内容相加???
			
			if ( ((pPkt->Cmd ^ pPkt->nCmd)&0x0ffff) != 0x0ffff)
			{
				ser_printf("Packet error...\n");	
				pReplyPkt->Status = USL_STATUS_FAIL;
			}//若主机发过来的第1半字和第二半字不是按位互反的情况,则说明接收出错了???
			else if ( cksum != pPkt->Chksum4Cmd )
			{
				ser_printf("ERROR Cksum\n");
			}//若前6字内容之和不等于第7字内容,则出错
			else
			{
				ser_printf("  Cmd = 0x%x(%d)\n", pPkt->Cmd, pPkt->Cmd);
				if (pPkt->Cmd == USLCMD_RECV)
				{
					pReplyPkt->Status = USL_STATUS_OK;
					uslb->state = USL_RECV_STATE;
				}
				else if (pPkt->Cmd == USLCMD_RECV_NOCKSUM)
				{
					pReplyPkt->Status = USL_STATUS_OK;
					uslb->state = USL_RECV_STATE;							
				}
				else if (pPkt->Cmd  == USLCMD_SEND)
				{
					pReplyPkt->Status = USL_STATUS_OK;
					uslb->state = USL_SEND_STATE;
				}
				else if (pPkt->Cmd  == USLCMD_FLASH)
				{
					pReplyPkt->Status = USL_STATUS_OK;
					uslb->state = USL_FLASH_STATE;						
				}
				else if (pPkt->Cmd  == USLCMD_ECHO)
				{
					pReplyPkt->Status = USL_STATUS_OK;
					uslb->state = USL_ECHO_STATE;
					continue;
																				
				}
				else if (pPkt->Cmd  == USLCMD_GETINFO)
				{
					pReplyPkt->Status = USL_STATUS_OK;
					uslb->state = USL_GETINFO_STATE;
					continue;
																				
				}
				else if (pPkt->Cmd  == USLCMD_RESET )
				{
					uslb->reset(uslb);
					uslb->state = USL_EXIT_STATE;						
					continue;
				}
				else if ( pPkt->Cmd == USLCMD_END )
				{
					pReplyPkt->Status = USL_STATUS_OK;
					uslb->state = USL_EXIT_STATE;						
					continue;
				}
				else
				{	
					ser_printf("Error : Unknown Command 0x%04x\n", pPkt->Cmd);	
					pReplyPkt->Status = USL_STATUS_FAIL;
				}
			}
			
		case USL_SEND_STATE:
			ser_printf("Sending ...\n");
			address = pPkt->Addr;
			ser_printf(" Address = 0x%08x\n", address);
			ser_printf(" Size = 0x%08x\n", pPkt->Size);
			
			pPkt->Size = ((val=pPkt->Size % 28) == 0)?  (pPkt->Size) : (pPkt->Size)+(28 - val);
			//将大小调整为28的整数倍
			
#if 1
			address = pPkt->Addr;
			uslb->send(uslb, (int *)(address), pPkt->Size);
#endif	    
            uslb->state = USL_CMD_STATE;
			break;
			
		case USL_ECHO_STATE:
			ser_printf("ECHO ...\n");
			memset(pReplyPkt, 0, sizeof(ReplyPkt));
			
			pReplyPkt->Cmd = USLCMD_STATUS;
			pReplyPkt->nCmd = ~USLCMD_STATUS;
			
			pReplyPkt->Status = USL_STATUS_ECHO;
			
			// -- checksum : command --				
			for(i=0; i<US_FIFO_SIZE-2; i++)
			pReplyPkt->Chksum4Cmd += ReplyPkt.u.buffer[i];
			
			ser_printf(" Delay size = %d \n", pPkt->Size);
			// -- delay  "pPkt->Size" -- 
			delay(pPkt->Size);
			
			// -- transmit data --	
			ret = uslb->send(uslb,(int *) &ReplyPkt, sizeof(ReplyPkt));
			
			// -- goto Init
			uslb->state = USL_CMD_STATE;
			break;
			
		case USL_GETINFO_STATE:
			ser_printf("GETINFO ...\n");
			memset(pReplyPkt, 0, sizeof(ReplyPkt));
			
			pReplyPkt->Cmd = USLCMD_STATUS;
			pReplyPkt->nCmd = ~USLCMD_STATUS;
			
			pReplyPkt->Status = USL_STATUS_OK;
			pReplyPkt->Addr = addr;
			
			// -- checksum : command --				
			for(i=0; i<US_FIFO_SIZE-2; i++)
				pReplyPkt->Chksum4Cmd += ReplyPkt.u.buffer[i];
			// -- transmit data --	
			ret = uslb->send(uslb,(int *) &ReplyPkt, sizeof(ReplyPkt));
			
			// -- goto Init
			uslb->state = USL_CMD_STATE;
			break;
			
		case USL_FLASH_STATE:
			ser_printf("Flash Write...\n");
			ser_printf(" Flash Address = 0x%08x\n", pPkt->Addr);
			ser_printf(" Size = 0x%08x\n", pPkt->Size);
			ser_printf(" SDRAM Address = 0x%08x\n", pPkt->Status);
			
			/***   put code here    *****/
			
			uslb->state = USL_CMD_STATE;
			break;
			
		case USL_REPLY_CMD_STATE:
			ser_printf("REPLY STATUS ...\n");
			pReplyPkt->Cmd = USLCMD_STATUS;
			pReplyPkt->nCmd = ~USLCMD_STATUS;
			pReplyPkt->Status = USL_STATUS_OK;
			
			// -- Size error check --
			if (pPkt->Cmd == USLCMD_RECV || pPkt->Cmd == USLCMD_SEND)
			{
				if ( pPkt->Size > MAX_BUFFER_SIZE )
				{
					ser_printf("ERROR Too Big Size to handle: 0x%x(%d)...\n", 
					pPkt->Size, pPkt->Size);
					pReplyPkt->Status = USL_STATUS_FAIL;
					uslb->state = USL_CMD_STATE;
				}
			}
			
			// -- checksum : Data  When SEND state --	
			if (pPkt->Cmd == USLCMD_SEND)
			{	
				pReplyPkt->Chksum4All = 0;				
				address = pPkt->Addr;

				k = pPkt->Size/4;
				if(pPkt->Size % 4 != 0)
					k ++;

				for(i=0;i<k;i++)
				{
					pReplyPkt->Chksum4All += *(int *)address;
					address += 4;
				}
			}
			
			// -- checksum : command --
			pReplyPkt->Chksum4Cmd = 0;
			for(i=0; i<US_FIFO_SIZE-2; i++)
				pReplyPkt->Chksum4Cmd += ReplyPkt.u.buffer[i];
				
			// -- transmit data --	
			ret = uslb->send(uslb,(int *) &ReplyPkt, sizeof(ReplyPkt));
			//assert(ret == MON_OK);
			// -- uslb->state is fixed in USL_DECODE_STATE

			break;
			
		case USL_REPLY_DAT_STATE:
			ser_printf("Reply to Data...\n");
			memset(pReplyPkt, 0, sizeof(*pReplyPkt));
			
			pReplyPkt->Cmd = USLCMD_STATUS;
			pReplyPkt->nCmd = ~USLCMD_STATUS;
			
			address = pPkt->Addr;		// needed in Delphi appl.
			// -- checksum : data --
			{
				cksum = 0;
				k = pPkt->Size/4;
				if(pPkt->Size % 4 != 0)
					k ++;

				for(i=0;i<k;i++)
				{
					cksum += *(int *)address;
					address += 4;
				}
			}
			
			if (pPkt->Cmd == USLCMD_RECV)
			{

				// -- In case of USLCMD_RECV, ECHO,	FLASH --
				if( cksum == pPkt->Chksum4All )
				{
					pReplyPkt->Status = USL_STATUS_OK;
				}
				else
				{
					ser_printf("Checksum error for Received Data!\n");
					pReplyPkt->Status = USL_STATUS_FAIL;
				}
		
			} 
			else
			{
				pReplyPkt->Status = USL_STATUS_OK;
			}
				
			
			// -- checksum : command --
			for(i=0; i<US_FIFO_SIZE-2; i++)
				pReplyPkt->Chksum4Cmd += ReplyPkt.u.buffer[i];
			// -- transmit data --
//			ret = uslb->send(uslb, (int *)&ReplyPkt, sizeof(ReplyPkt));
			ret = uslb->send(uslb, (int *)pReplyPkt, sizeof(*pReplyPkt));
			//assert(ret == MON_OK);
			// -- wait next command --				
			uslb->state = USL_CMD_STATE;	
			break;
			
		case USL_EXIT_STATE:
			ser_printf("\nExit ...\n");
			
			*retsize = endAddr - addr;
			done = 1;
			break;
	    }
	    
	}while(done == 0);
	
	uslb->stop(uslb);
	
	return ret;
}

⌨️ 快捷键说明

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