📄 usbdown.c
字号:
/****************************************************************
NAME: u24amon.c
DESC: u24amon entry point,menu,download
HISTORY:
****************************************************************/
#include <stdlib.h>
#include <string.h>
#include "..\include\def.h"
#include "..\include\option.h"
#include "..\include\24a0addr.h"
#include "..\include\24a0lib.h"
#include "..\include\24a0slib.h"
#include "..\include\mmu.h"
#include "..\include\profile.h"
//#include "memtest.h"
#include "..\include\usbmain.h"
#include "..\include\usbout.h"
#include "..\include\usblib.h"
#include "..\include\24a0usb.h"
void WaitDownload(void);
void MPEG_WaitDownload(void);
void Menu(void);
void Isr_Init1(void);
volatile U32 downloadAddress_u;
volatile unsigned char *downPt;
volatile U32 downloadFileSize;
volatile U16 checkSum;
volatile unsigned int err=0;
volatile U32 totalDmaCount;
volatile int isUsbdSetConfiguration;
int download_run=0;
int download_end;
U32 tempdownloadAddress;
int menuUsed=0;
// UsbdMain();
void USB_Download(void)
{
Isr_Init1();
rINTMSK&=~(BIT_USBD);
download_end=0;
//Uart_Printf(" USB download.\n");
while(1)
{
WaitDownload();
if(download_end==1) break;
}
rINTMSK |= (BIT_USBD);
}
// for MPEG4
void MPEG_Download(void)
{
Isr_Init1();
rINTMSK&=~(BIT_USBD);
download_end=0;
Uart_Printf("/----MPEG raw data download.----/\n");
while(1)
{
MPEG_WaitDownload();
if(download_end==1) break;
}
rINTMSK |= (BIT_USBD);
}
void MPEG_WaitDownload(void)
{
U32 i;
U32 j;
U16 cs;
U32 temp;
U16 dnCS;
int first=1;
float time;
U8 tempMem[16];
U8 key;
checkSum=0;
downloadAddress_u=(U32)tempMem; //_RAM_STARTADDRESS;
downPt=(unsigned char *)downloadAddress_u;
//This address is used for receiving first 8 byte.
downloadFileSize=0;
/*******************************/
/* Test program download */
/*******************************/
j=0;
//Uart_Printf("Enter a new temporary download address(0x12000100):");
//tempdownloadAddress=Uart_GetIntNum();
tempdownloadAddress=0x12000100;
download_run=0;
//Uart_Printf("The temporary download address is 0x%x.\n\n",tempdownloadAddress);
Uart_Printf("Download file ./bmp/mobile_20frame_3Qp.cif using the TRANSMIT of USB port\n");
Uart_Printf("Wait for download!\n");
while(downloadFileSize==0)
{
if(j%0x50000==0)Led_Display(0x6);
if(j%0x50000==0x28000)Led_Display(0x9);
j++;
}
//Uart_Printf(" download address: 0x%x, download file size: 0x%x\n\n",downloadAddress_u, downloadFileSize);
Timer_InitEx();
Timer_StartEx();
#if USBDMA
rINTMSK&=~(BIT_DMA);
rINTSUBMSK&=~(BIT_SUB_DMA2);
ClearEp3OutPktReady();
// indicate the first packit is processed.
// has been delayed for DMA2 cofiguration.
if(downloadFileSize>EP3_PKT_SIZE)
{
if(downloadFileSize<=(0x80000))
{
ConfigEp3DmaMode(downloadAddress_u+EP3_PKT_SIZE-8,downloadFileSize-EP3_PKT_SIZE);
//wait until DMA reload occurs.
while((rDSTAT2&0xfffff)==0);
//will not be used.
rDIDST2=(downloadAddress_u+downloadFileSize-EP3_PKT_SIZE);
rDIDSTC2=(0<<1)|(0<<0);
rDCON2=rDCON2&~(0xfffff)|(0);
}
else
{
ConfigEp3DmaMode(downloadAddress_u+EP3_PKT_SIZE-8,0x80000-EP3_PKT_SIZE);
//wait until DMA reload occurs.
while((rDSTAT2&0xfffff)==0);
if(downloadFileSize>(0x80000*2))//for 1st autoreload
{
rDIDST2=(downloadAddress_u+0x80000-8); //for 1st autoreload.
rDIDSTC2=(0<<1)|(0<<0);
rDCON2=rDCON2&~(0xfffff)|(0x80000);
while(rEP3_DMA_TTC<0xfffff)
{
rEP3_DMA_TTC_L=0xff;
rEP3_DMA_TTC_M=0xff;
rEP3_DMA_TTC_H=0xf;
}
}
else
{
rDIDST2=(downloadAddress_u+0x80000-8); //for 1st autoreload.
rDIDSTC2=(0<<1)|(0<<0);
rDCON2=rDCON2&~(0xfffff)|(downloadFileSize-0x80000);
while(rEP3_DMA_TTC<0xfffff)
{
rEP3_DMA_TTC_L=0xff;
rEP3_DMA_TTC_M=0xff;
rEP3_DMA_TTC_H=0xf;
}
}
}
totalDmaCount=0;
}
else
{
totalDmaCount=downloadFileSize;
}
#endif
//Uart_Printf("\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n",
// downloadAddress_u,downloadFileSize);
//Uart_Printf("RECEIVED FILE SIZE:%8d",0);
#if USBDMA
j=0x10000;
while(1)
{
if( (rDCDST2-(U32)downloadAddress_u+8)>=j)
{
Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
j+=0x10000;
}
if(totalDmaCount>=downloadFileSize)break;
}
#else
j=0x10000;
while(((U32)downPt-downloadAddress_u)<(downloadFileSize-8))
{
if( ((U32)downPt-downloadAddress_u)>=j)
{
Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
j+=0x10000;
}
}
#endif
time=Timer_StopEx();
Uart_Printf("\b\b\b\b\b\b\b\b%8d",downloadFileSize);
Uart_Printf("(%5.1fKB/S,%3.1fS)\n",(float)(downloadFileSize/time/1000.),time);
#if USBDMA
/*******************************/
/* Verify check sum */
/*******************************/
Uart_Printf("Now, Checksum calculation\n");
cs=0;
i=(downloadAddress_u);
j=(downloadAddress_u+downloadFileSize-10)&0xfffffffc;
while(i<j)
{
temp=*((U32 *)i);
i+=4;
cs+=(U16)(temp&0xff);
cs+=(U16)((temp&0xff00)>>8);
cs+=(U16)((temp&0xff0000)>>16);
cs+=(U16)((temp&0xff000000)>>24);
}
i=(downloadAddress_u+downloadFileSize-10)&0xfffffffc;
j=(downloadAddress_u+downloadFileSize-10);
while(i<j)
{
cs+=*((U8 *)i++);
}
checkSum=cs;
#else
//checkSum was calculated including dnCS. So, dnCS should be subtracted.
checkSum=checkSum - *((unsigned char *)(downloadAddress_u+downloadFileSize-8-2))
- *( (unsigned char *)(downloadAddress_u+downloadFileSize-8-1) );
#endif
dnCS=*((unsigned char *)(downloadAddress_u+downloadFileSize-8-2))+
(*( (unsigned char *)(downloadAddress_u+downloadFileSize-8-1) )<<8);
download_end=1;
if(checkSum!=dnCS)
{
Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
return;
}
Uart_Printf("Download O.K.\n\n");
// Uart_TxEmpty(consoleNum);
}
void WaitDownload(void)
{
U32 i;
U32 j;
U16 cs;
U32 temp;
U16 dnCS;
int first=1;
float time;
U8 tempMem[16];
U8 key;
checkSum=0;
downloadAddress_u=(U32)tempMem; //_RAM_STARTADDRESS;
downPt=(unsigned char *)downloadAddress_u;
//This address is used for receiving first 8 byte.
downloadFileSize=0;
/*******************************/
/* Test program download */
/*******************************/
j=0;
Uart_Printf("Enter a new temporary download address(0x1...):");
tempdownloadAddress=Uart_GetIntNum();
download_run=0;
//Uart_Printf("The temporary download address is 0x%x.\n\n",tempdownloadAddress);
Uart_Printf(" Waiting a download.\n");
while(downloadFileSize==0)
{
if(j%0x50000==0)Led_Display(0x6);
if(j%0x50000==0x28000)Led_Display(0x9);
j++;
}
Uart_Printf(" download address: 0x%x, download file size: 0x%x\n\n",downloadAddress_u, downloadFileSize-0x0a);
Timer_InitEx();
Timer_StartEx();
#if USBDMA
rINTMSK&=~(BIT_DMA);
rINTSUBMSK&=~(BIT_SUB_DMA2);
ClearEp3OutPktReady();
// indicate the first packit is processed.
// has been delayed for DMA2 cofiguration.
if(downloadFileSize>EP3_PKT_SIZE)
{
if(downloadFileSize<=(0x80000))
{
ConfigEp3DmaMode(downloadAddress_u+EP3_PKT_SIZE-8,downloadFileSize-EP3_PKT_SIZE);
//wait until DMA reload occurs.
while((rDSTAT2&0xfffff)==0);
//will not be used.
rDIDST2=(downloadAddress_u+downloadFileSize-EP3_PKT_SIZE);
rDIDSTC2=(0<<1)|(0<<0);
rDCON2=rDCON2&~(0xfffff)|(0);
}
else
{
ConfigEp3DmaMode(downloadAddress_u+EP3_PKT_SIZE-8,0x80000-EP3_PKT_SIZE);
//wait until DMA reload occurs.
while((rDSTAT2&0xfffff)==0);
if(downloadFileSize>(0x80000*2))//for 1st autoreload
{
rDIDST2=(downloadAddress_u+0x80000-8); //for 1st autoreload.
rDIDSTC2=(0<<1)|(0<<0);
rDCON2=rDCON2&~(0xfffff)|(0x80000);
while(rEP3_DMA_TTC<0xfffff)
{
rEP3_DMA_TTC_L=0xff;
rEP3_DMA_TTC_M=0xff;
rEP3_DMA_TTC_H=0xf;
}
}
else
{
rDIDST2=(downloadAddress_u+0x80000-8); //for 1st autoreload.
rDIDSTC2=(0<<1)|(0<<0);
rDCON2=rDCON2&~(0xfffff)|(downloadFileSize-0x80000);
while(rEP3_DMA_TTC<0xfffff)
{
rEP3_DMA_TTC_L=0xff;
rEP3_DMA_TTC_M=0xff;
rEP3_DMA_TTC_H=0xf;
}
}
}
totalDmaCount=0;
}
else
{
totalDmaCount=downloadFileSize;
}
#endif
Uart_Printf("\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n",
downloadAddress_u,downloadFileSize);
Uart_Printf("RECEIVED FILE SIZE:%8d",0);
#if USBDMA
j=0x10000;
while(1)
{
if( (rDCDST2-(U32)downloadAddress_u+8)>=j)
{
Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
j+=0x10000;
}
if(totalDmaCount>=downloadFileSize)break;
}
#else
j=0x10000;
while(((U32)downPt-downloadAddress_u)<(downloadFileSize-8))
{
if( ((U32)downPt-downloadAddress_u)>=j)
{
Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
j+=0x10000;
}
}
#endif
time=Timer_StopEx();
Uart_Printf("\b\b\b\b\b\b\b\b%8d",downloadFileSize);
Uart_Printf("(%5.1fKB/S,%3.1fS)\n",(float)(downloadFileSize/time/1000.),time);
#if USBDMA
/*******************************/
/* Verify check sum */
/*******************************/
Uart_Printf("Now, Checksum calculation\n");
cs=0;
i=(downloadAddress_u);
j=(downloadAddress_u+downloadFileSize-10)&0xfffffffc;
while(i<j)
{
temp=*((U32 *)i);
i+=4;
cs+=(U16)(temp&0xff);
cs+=(U16)((temp&0xff00)>>8);
cs+=(U16)((temp&0xff0000)>>16);
cs+=(U16)((temp&0xff000000)>>24);
}
i=(downloadAddress_u+downloadFileSize-10)&0xfffffffc;
j=(downloadAddress_u+downloadFileSize-10);
while(i<j)
{
cs+=*((U8 *)i++);
}
checkSum=cs;
#else
//checkSum was calculated including dnCS. So, dnCS should be subtracted.
checkSum=checkSum - *((unsigned char *)(downloadAddress_u+downloadFileSize-8-2))
- *( (unsigned char *)(downloadAddress_u+downloadFileSize-8-1) );
#endif
dnCS=*((unsigned char *)(downloadAddress_u+downloadFileSize-8-2))+
(*( (unsigned char *)(downloadAddress_u+downloadFileSize-8-1) )<<8);
download_end=1;
if(checkSum!=dnCS)
{
Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
return;
}
Uart_Printf("Download O.K.\n\n");
// Uart_TxEmpty(consoleNum);
}
void Isr_Init1(void)
{
// pISR_UNDEF=(unsigned)HaltUndef;
// pISR_SWI =(unsigned)HaltSwi;
// pISR_PABORT=(unsigned)HaltPabort;
// pISR_DABORT=(unsigned)HaltDabort;
rINTMOD=0x0; // All=IRQ mode
rINTMSK=BIT_ALLMSK; // All interrupt is masked.
//pISR_URXD0=(unsigned)Uart0_RxInt;
//rINTMSK=~(BIT_URXD0); //enable UART0 RX Default value=0xffffffff
#if 1
pISR_USBD =(unsigned)IsrUsbd;
pISR_DMA =(unsigned)IsrDma2;
#else
pISR_IRQ =(unsigned)IsrUsbd;
//Why doesn't it receive the big file if use this. (???)
//It always stops when 327680 bytes are received.
#endif
ClearPending(BIT_DMA);
ClearPending(BIT_USBD);
//rINTMSK&=~(BIT_USBD);
//pISR_FIQ,pISR_IRQ must be initialized
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -