📄 usb.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 + -