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

📄 u2440mon.c

📁 这是三星2440潜入式系统上USB的驱动下载程序,比较精简.
💻 C
📖 第 1 页 / 共 3 页
字号:
			Uart_Printf("\n");

			progSize+=PAGES_PER_BLOCK*SECTOR_SIZE;//0x4000;
			if(progSize>=downloadFileSize)
			    break;	// Exit while loop
			blockIndex++;
		}
	}
}
extern int PrintToTerminal;
int SERAfterRcvFirstDataPacket()
{
	U32 i;
	U32 j;
	U16 cs;
	U32 temp;
	U16 dnCS;
	float time;
	char buf[64];
	int posx,posy;
	U32 systime;
//	Timer_InitEx();	  
//	Timer_StartEx();  
	systime=OSTimeGet ();
	OSSchedLock();
	PrintToTerminal=0;
	Uart_Printf("\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n",
			downloadAddress,downloadFileSize);
//	sprintf(buf,"RECEIVED FILE SIZE:%8d",0);
//	posx=GUI_GetDispPosX();
//	posy=GUI_GetDispPosY();
//	GUI_DispStringAt(buf,posx,posy);
	Uart_Printf("RECEIVED FILE SIZE:%8d",0);
//    GUI_Exec();

	j=0x10000;

	while(((U32)downPt-downloadAddress)<(downloadFileSize-4))
	{
	if( ((U32)downPt-downloadAddress)>=j)
	{
	//	Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
		Uart_SendByte('p');
   		j+=0x10000;
//		GUI_Exec();
	}
	}

	time = OSTimeGet();
	OSSchedUnlock();
	Uart_Printf("\b\b\b\b\b\b\b\b%8d",downloadFileSize);	
//	sprintf(buf,"RECEIVED FILE SIZE:%8d",j);
//		GUI_DispStringAt(buf,posx,posy);
	Uart_Printf("\n(%5.1fKB/S,%3.1fS)\n",(float)(downloadFileSize/((time-systime)/OS_TICKS_PER_SEC)/1000.),(time-systime)/OS_TICKS_PER_SEC);
	
	//checkSum was calculated including dnCS. So, dnCS should be subtracted.
	checkSum=checkSum - *((unsigned char *)(downloadAddress+downloadFileSize-4-2))
		 - *( (unsigned char *)(downloadAddress+downloadFileSize-4-1) );	
	
	dnCS=*((unsigned char *)(downloadAddress+downloadFileSize-4-2))+
	(*( (unsigned char *)(downloadAddress+downloadFileSize-4-1) )<<8);

	if(checkSum!=dnCS)
	{
	Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
//	GUI_Exec();
//	return -1;
	}

	Uart_Printf("Download O.K.\n\n");
	while(!(rUTRSTAT1 & 0x4)); //Wait until tx shifter is empty.
	Init_Uart0 ();
	PrintToTerminal=1;
//	MMU_Init();	
//	Uart_Printf("EnableDCache:\n");
//	GUI_Exec();
	return 0;
}


int AfterRcvFirstDataPacket()
{
	U32 i;
	U32 j;
	U16 cs;
	U32 temp;
	U16 dnCS;
	float time;
	char buf[64];
	int posx,posy;
	U32 systime;
//	Timer_InitEx();	  
//	Timer_StartEx();  
	systime=OSTimeGet ();
	OSSchedLock();
#if USBDMA	
//	WM_SelectWindow(0);
//	if(download_run == 1)
//		WM_DeleteWindow(_usbhFrameWin);
//	GUI_SetBkColor(GUI_BLUE);
//	GUI_Clear();
	rINTMSK&=~(BIT_DMA2);  

	ClearEp3OutPktReady(); 
		// indicate the first packit is processed.
		// has been delayed for DMA2 cofiguration.

	if(downloadFileSize>EP3_PKT_SIZE)
	{
		if(downloadFileSize<=(0x80000))
		{
	  		ConfigEp3DmaMode(downloadAddress+EP3_PKT_SIZE-8,downloadFileSize-EP3_PKT_SIZE);	
 
	  		//will not be used.
		}
	  	else
	  	{
	  		ConfigEp3DmaMode(downloadAddress+EP3_PKT_SIZE-8,0x80000-EP3_PKT_SIZE);
	   		
			if(downloadFileSize>(0x80000*2))//for 1st autoreload
			{
				rDIDST2=(downloadAddress+0x80000-8);  //for 1st autoreload.
			 rDIDSTC2=(1<<2)|(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+0x80000-8);  //for 1st autoreload.
	  			rDIDSTC2=(1<<2)|(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,downloadFileSize);
//	sprintf(buf,"RECEIVED FILE SIZE:%8d",0);
//	posx=GUI_GetDispPosX();
//	posy=GUI_GetDispPosY();
//	GUI_DispStringAt(buf,posx,posy);
	Uart_Printf("RECEIVED FILE SIZE:%8d",0);
    GUI_Exec();
#if USBDMA	
	j=0x10000;

	while(1)
	{
		if( (rDCDST2-(U32)downloadAddress+8)>=j)
	{
	//	sprintf(buf,"RECEIVED FILE SIZE:%8d",j);
	//	GUI_DispStringAt(buf,posx,posy);
		Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
   		j+=0x10000;
   		GUI_Exec();
		}
	if(totalDmaCount>=downloadFileSize)break;
	}

#else
	j=0x10000;

	while(((U32)downPt-downloadAddress)<(downloadFileSize-8))
	{
	if( ((U32)downPt-downloadAddress)>=j)
	{
		Uart_Printf("\b\b\b\b\b\b\b\b%8d",j);
   		j+=0x10000;
	}
	}
#endif
//	for(j=0;j<1000000;j++);
//	time=Timer_StopEx();
	time = OSTimeGet();
	OSSchedUnlock();
	Uart_Printf("\b\b\b\b\b\b\b\b%8d",downloadFileSize);	
//	sprintf(buf,"RECEIVED FILE SIZE:%8d",j);
//		GUI_DispStringAt(buf,posx,posy);
	Uart_Printf("\n(%5.1fKB/S,%3.1fS)\n",(float)(downloadFileSize/((time-systime)/OS_TICKS_PER_SEC)/1000.),(time-systime)/OS_TICKS_PER_SEC);
	
#if USBDMA	
	/*******************************/
	/*	 Verify check sum		*/
	/*******************************/

	Uart_Printf("Now, Checksum calculation\n");
//	GUI_Exec();
	cs=0;	
	i=(downloadAddress);
	j=(downloadAddress+downloadFileSize-10)&0xfffffffc;
//	for(;i<j;i++)
//		cs+=*((U8 *)i++);
	#if 1
	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+downloadFileSize-10)&0xfffffffc;
	j=(downloadAddress+downloadFileSize-10);
	while(i<j)
	{
  	cs+=*((U8 *)i++);
	}
	#endif
	checkSum=cs;
#else
	//checkSum was calculated including dnCS. So, dnCS should be subtracted.
	checkSum=checkSum - *((unsigned char *)(downloadAddress+downloadFileSize-8-2))
		 - *( (unsigned char *)(downloadAddress+downloadFileSize-8-1) );	
#endif	  

	dnCS=*((unsigned char *)(downloadAddress+downloadFileSize-8-2))+
	(*( (unsigned char *)(downloadAddress+downloadFileSize-8-1) )<<8);

	if(checkSum!=dnCS)
	{
	Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
//	GUI_Exec();
	return -1;
	}

	Uart_Printf("Download O.K.\n\n");
	while(!(rUTRSTAT1 & 0x4)); //Wait until tx shifter is empty.
//	MMU_Init();	
//	Uart_Printf("EnableDCache:\n");
//	GUI_Exec();
	return 0;
}


void Isr_Init(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_DMA2 =(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_DMA2);
	ClearPending(BIT_USBD);
	//rINTMSK&=~(BIT_USBD);  
   
	//pISR_FIQ,pISR_IRQ must be initialized
}


void HaltUndef(void)
{
	Uart_Printf("Undefined instruction exception!!!\n");
	while(1);
}

void HaltSwi(void)
{
	Uart_Printf("SWI exception!!!\n");
	while(1);
}

void HaltPabort(void)
{
	Uart_Printf("Pabort exception!!!\n");
	while(1);
}

void HaltDabort(void)
{
	Uart_Printf("Dabort exception!!!\n");
	while(1);
}


void ClearMemory(void)
{
	int i;
	U32 data;
	int memError=0;
	U32 *pt;
	
	//
	// memory clear
	//
	Uart_Printf("Clear Memory (%xh-%xh):WR",_RAM_STARTADDRESS,HEAPEND);

	pt=(U32 *)_RAM_STARTADDRESS;
	while((U32)pt < HEAPEND)
	{
		*pt=(U32)0x0;
		pt++;
	}
	
	if(memError==0)Uart_Printf("\b\bO.K.\n");
}

void Clk0_Enable(int clock_sel)	
{	// 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0
	rMISCCR = rMISCCR&~(7<<4) | (clock_sel<<4);
	rGPHCON = rGPHCON&~(3<<18) | (2<<18);
}
void Clk1_Enable(int clock_sel)
{	// 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1	
	rMISCCR = rMISCCR&~(7<<8) | (clock_sel<<8);
	rGPHCON = rGPHCON&~(3<<20) | (2<<20);
}
void Clk0_Disable(void)
{
	rGPHCON = rGPHCON&~(3<<18);	// GPH9 Input
}
void Clk1_Disable(void)
{
	rGPHCON = rGPHCON&~(3<<20);	// GPH10 Input
}

BOOL UbootReadData(DWORD cbData, LPBYTE pbData)
{
	unsigned int temp;
	int i;
	int old_isUsbdSetConfiguration = isUsbdSetConfiguration;
Loop:
	if ( downPtIndex > readPtIndex + cbData )
	{
		memcpy(pbData, (void*)readPtIndex, cbData);
		readPtIndex += cbData;
	}
	else if (downPtIndex == DMABUFFER)
	{
		downloadFileSize=0;
//		Uart_Printf("DisableDCache:\n");
		MMU_DeInit();
		#if 0
		ChangeMPllValue(68,1,1);

	Calc_Clock(1);
	UPDATE_REFRESH(Hclk);
	#endif
//	Uart_Init(Pclk, 115200);
		if(isUsbdSetConfiguration == 0)
			Uart_Printf("USB host is not connected now,please reconnect the USB Cable.\n");
	while(downloadFileSize == 0){
		if((isUsbdSetConfiguration == 0) && (old_isUsbdSetConfiguration != 0))
		{
			Uart_Printf("USB host is not connected now,please reconnect the USB Cable.\n");
			old_isUsbdSetConfiguration = 0;
		}
		if((isUsbdSetConfiguration != 0) && (old_isUsbdSetConfiguration == 0))
		{
			Uart_Printf("USB host is connected. Waiting a download.\n");
			old_isUsbdSetConfiguration = isUsbdSetConfiguration;
		}
//		GUI_Exec();
	};
	if(AfterRcvFirstDataPacket()== 0)
	{
		downPtIndex += downloadFileSize;
		#if 0
		ChangeMPllValue(127,2,1);

		Calc_Clock(1);
		UPDATE_REFRESH(Hclk);
		#endif
		
//		MMU_Init();
//		Delay(10);	
	}
	else
		return FALSE;
	//	while (downPtIndex == DMABUFFER) {};	// first 64 bytes, get interrupt mode.
		{
			downPt = (unsigned char*)DMABUFFER;
			Uart_Printf("Dump the first packet:downPt=%x\n",downPt);
			for(i=0;i<64;i+=8)
			{
				Uart_Printf("%02X %02X %02X %02X %02X %02X %02X %02X\n",
					*(downPt+i),*(downPt+i+1),*(downPt+i+2),*(downPt+i+3),*(downPt+i+4),*(downPt+i+5),*(downPt+i+6),*(downPt+i+7));	
			}
		}
		if ( readPtIndex == DMABUFFER )
		{
			memcpy(pbData, (void*)readPtIndex, cbData);
			readPtIndex += cbData;
		}
	#if 0
		rSRCPND  = BIT_USBD;
		if (rINTPND & BIT_USBD) rINTPND = BIT_USBD;
		rINTMSK |= BIT_USBD;		// USB Interrupt disable.

		// read data with DMA operation.
		rSRCPND  = BIT_DMA2;
		if (rINTPND & BIT_DMA2) rINTPND = BIT_DMA2;
		rINTMSK &= ~BIT_DMA2;		// DMA Interrupt enable.

		rINDEX_REG=3;
		ClearEp3OutPktReady(); 

		ConfigEp3DmaMode(downPtIndex,0x80000);

		rDIDST2=(downPtIndex+0x80000);	//for 1st autoreload.
		rDIDSTC2=(1<<2)|(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 = 0x0f;
		}
		#endif
	}
	else
	{
		temp = rEP3_DMA_TTC;
		for (i = 0; i < 60000; i++ )
		{
		}
		if ( temp == rEP3_DMA_TTC )
		{
			Uart_Printf("INFO : UbootReadData : downPtIndex(0x%x) - readPtIndex(0x%x) = 0x%x\r\n", downPtIndex, readPtIndex, downPtIndex - readPtIndex);
			downPtIndex += ((unsigned int)0xfffff - (unsigned int)rEP3_DMA_TTC);
			Uart_Printf("INFO : UbootReadData : rEP3_DMA_TTC = 0x%x\r\n", rEP3_DMA_TTC);
		}

		goto Loop;
	}

	return TRUE;
}

⌨️ 快捷键说明

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