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

📄 6410_otgmon.c

📁 s3c6410基于USB OTG下载内核至NORFLASH的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************************
* 
*	Project Name : S3C6410 Validation
*
*	Copyright 2006 by Samsung Electronics, Inc.
*	All rights reserved.
*
*	Project Description :
*		This software is only for validating functions of the S3C6410.
*		Anybody can use this software without our permission.
*  
*--------------------------------------------------------------------------------------
* 
*	File Name : 6410_main.c
*  
*	File Description : This file implements the monitor program using USB OTG.
*
*	Author : Haksoo,Kim
*	Dept. : AP Development Team
*	Created Date : 2007/01/23
*	Version : 0.1 
* 
*	History
*	- Created(Haksoo,Kim 2007/01/23)
*  
**************************************************************************************/


#include <stdio.h>

#include "option.h"
#include "library.h"
#include "sfr6410.h"
#include "system.h"
#include "sysc.h"
#include "intc.h"
#include "otg_dev.h"
#include "gpio.h"
#include "timer.h"
#include "nand.h"
#include "am29f800.h"

USB_OPMODE eOpMode = USB_DMA;
USB_SPEED eSpeed = USB_HIGH;
bool download_run=false;
u32 tempDownloadAddress;
void (*run)(void);
bool bStop_Download_Run=false;
bool g_bSuspendResume=false;

//////////
// Function Name : Isr_UsbOtg
// Function Description : USB OTG ISR
// Input : NONE
// Output : NONE
// Version : 
static void __irq Isr_UsbOtg(void)
{
	INTC_Disable(NUM_OTG);
	
	OTGDEV_HandleEvent();
	
	INTC_Enable(NUM_OTG);
	
	INTC_ClearVectAddr();
}

//////////
// Function Name : WKUP_Check();
// Function Description : 
// Input : NONE
// Output : NONE
// Version : 
static void WKUP_Check(void)
{
	u32 uRegVal;
	u32 uRegRst;
	
	uRegVal = Inp32SYSC(0x908);
	uRegRst = Inp32SYSC(0x904);
	switch(uRegVal&0xfff)
	{
		case 0x0:
			if(!(uRegRst&(1<<7)))
				Assert(0);
			break;
		case 0x1:
			Disp("Wake-up by External Interrupt[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<0);
			Outp32SYSC(0x908, uRegVal);
			break;
		case 0x2:
			Disp("Wake-up by RTC Alarm[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<1);
			Outp32SYSC(0x908, uRegVal);			
			break;
		case 0x4:
			Disp("Wake-up by RTC Tick[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<2);
			Outp32SYSC(0x908, uRegVal);			
			break;
		case 0x8:
			Disp("Wake-up by Touch[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<3);
			Outp32SYSC(0x908, uRegVal);			
			break;
		case 0x10:
			Disp("Wake-up by Keypad[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<4);
			Outp32SYSC(0x908, uRegVal);			
			break;
		case 0x20:
			Disp("Wake-up by Modem I/F[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<5);
			Outp32SYSC(0x908, uRegVal);		
			break;															
		case 0x40:
			Disp("Wake-up by Battery Fault[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<6);
			Outp32SYSC(0x908, uRegVal);			
			break;			
		case 0x80:
			Disp("Wake-up by WRESET[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<7);
			Outp32SYSC(0x908, uRegVal);			
			break;			
		case 0x100:
			Disp("Wake-up by HSI[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<8);
			Outp32SYSC(0x908, uRegVal);			
			break;									
		case 0x200:
			Disp("Wake-up by MMC0[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<9);
			Outp32SYSC(0x908, uRegVal);			
			break;
		case 0x400:
			Disp("Wake-up by MMC1[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<10);
			Outp32SYSC(0x908, uRegVal);			
			break;
		case 0x800:
			Disp("Wake-up by MMC2[WKUPSTAT:0x%x]\n", uRegVal);
			uRegVal=(1<<11);
			Outp32SYSC(0x908, uRegVal);			
			break;									
		default:
			if(!(uRegRst&(1<<7)))
			Assert(0);
			break;			
	}
}



//////////
// Function Name : PM_Check();
// Function Description : 
// Input : NONE
// Output : NONE
// Version : 
static void PM_Check(void)
{
	u32 uRegVal;
	uRegVal = Inp32SYSC(0x904);
	switch(uRegVal&0x7f)
	{
		case 0:
			Assert(0);
			break;
		case 1:
			Disp("Reset by XnRESET[RSTSTAT:0x%x]\n", uRegVal);
			break;
		case 2:
			Disp("Reset by XnWRESET[RSTSTAT:0x%x]\n", uRegVal);
			break;
		case 4:
			Disp("Reset by WatchDog[RSTSTAT:0x%x]\n", uRegVal);
			break;
		case 8:
			Disp("Reset by Sleep Wake-up[RSTSTAT:0x%x]\n", uRegVal);
			WKUP_Check();			
			break;
		case 16:
			Disp("Reset by E-Sleep Wake-up[RSTSTAT:0x%x]\n", uRegVal);
			WKUP_Check();			
			break;
		case 32:
			Disp("Reset by SWRESET[RSTSTAT:0x%x]\n", uRegVal);
			break;															
		case 64:
			Disp("Reset by Deep Stop Wake-up[RSTSTAT:0x%x]\n", uRegVal);
			break;			
		default:
			Disp("[RSTSTAT:0x%x]\n", uRegVal);
			Assert(0);
			break;			
	}
}



//////////
// Function Name : Download_Only
// Function Description : This function downloads a image file thru DNW.
//						You can configure the address to downlad in DNW "Configuration-Options" menu.
// Input : NONE
// Output : NONE
// Version : 
static void Download_Only(void)
{
	u32 uDownAddr, uDownFileSize, pDownPt, i;
	u32 uLapseTime=0;

	OTGDEV_ClearDownFileInfo();

	OTGDEV_SetOpMode(eOpMode); 
	
	if(download_run==false)
	{	
	    Disp("Enter a new temporary download address(0x...):");
	    tempDownloadAddress=(u32)GetIntNum();
	    if(tempDownloadAddress==0xffffffff)
	    {
	    	tempDownloadAddress=DefaultDownloadAddress;
	    }
	    Disp("The temporary download address is 0x%x.\n\n",tempDownloadAddress);		
	}

	Disp("Select a file to download in DNW\n");
	Disp("If you want to quit, press any key\n");

	i = 0;

	do
	{
		OTGDEV_GetDownFileInfo(&uDownAddr, &uDownFileSize, &pDownPt);
		
		if(GetKey() != 0)
		{
			if (download_run==true)
				bStop_Download_Run = true;
			
			return;
		}      
       
		if(i%0x100000==0)
			DisplayLED(0x6);
		if(i%0x100000==0x80000)
			DisplayLED(0x9);
		i++;		
	}while((uDownAddr == 0) ||(uDownFileSize == 0));

	StartTimer();
	
	Disp("\n[ADDRESS:%xh,TOTAL:%d(0x%x)]\n", uDownAddr, uDownFileSize, (uDownFileSize-10));

	do
	{
		OTGDEV_GetDownFileInfo(&uDownAddr, &uDownFileSize, &pDownPt);

		if(GetKey() == 'x')
		{
			if (download_run==true)
				bStop_Download_Run = true;
			
			return;
		} 
	}while((pDownPt - uDownAddr)<(uDownFileSize - 8));

	uLapseTime = StopTimer();
	
	if(uLapseTime == 0)
	{
		uLapseTime = 1;
	}
	
	if(eSpeed == USB_FULL)
	{
		Disp("(%3.3fKB/s,%3.3fs)\n",((float)uDownFileSize/uLapseTime*1000000/1024.),((float)uLapseTime/1000000));
	}
	else
	{
		Disp("(%3.3fMB/s,%3.3fs)\n",((float)uDownFileSize/uLapseTime*1000000/1024/1024.),((float)uLapseTime/1000000));
	}

	OTGDEV_VerifyChecksum();
	
	download_run=false;
	
}

//////////
// Function Name : Download_Run
// Function Description : This function downloads a image file thru DNW 
//						and then jumps to the start address of the downloaded image
// Input : NONE
// Output : NONE
// Version : 
void Download_Run(void)
{
	u32 uDownAddr, uDownFileSize, pDownPt, i;
	
	download_run=true;

	Download_Only();
	
	if(bStop_Download_Run==true)
		return;
	
	OTGDEV_GetDownFileInfo(&uDownAddr, &uDownFileSize, &pDownPt);

	run=(void (*)(void))uDownAddr;

	for(i=0;i<INT_LIMIT;i++)
	{
		INTC_Disable(i);
	}
    
#if (ONLY_ICACHE_ENABLED == TRUE)
	SYSTEM_DisableICache();
#else    
    SYSTEM_DisableICache();
    SYSTEM_DisableDCache();

	SYSTEM_InvalidateEntireICache();
	SYSTEM_CleanInvalidateEntireDCache();

	SYSTEM_DisableMMU();
	SYSTEM_InvalidateTLB();
#endif

	run();	
		
}

//////////
// Function Name : Upload_Only
// Function Description : This function uploads a image file thru DNW
//						You can configure the address and the size to upload in DNW "Configuration-Options" menu.
// Input : NONE
// Output : NONE
// Version : 
void Upload_Only()
{
	u32 uUpAddr, uUpFileSize, pUpPt, i;
	u32 uLapseTime=0;

	OTGDEV_ClearDownFileInfo();
	OTGDEV_ClearUpFileInfo();

	OTGDEV_SetOpMode(eOpMode); 

	Disp("\nConfigure the address and the size of the file to upload in DNW\n");
	Disp("If you want to quit, press any key\n");

	i = 0;

	do
	{
		OTGDEV_GetUpFileInfo(&uUpAddr, &uUpFileSize, &pUpPt);
	
		if(GetKey() != 0)
		{
			return;
		}      
       
		if(i%0x100000==0)
			DisplayLED(0x6);
		if(i%0x100000==0x80000)
			DisplayLED(0x9);
		i++;		
	}while((uUpAddr == 0) || (uUpFileSize == 0));

	StartTimer();
	
	Disp("\n[ADDRESS:%xh,TOTAL:%d]\n", uUpAddr, uUpFileSize);

	do
	{
		OTGDEV_GetUpFileInfo(&uUpAddr, &uUpFileSize, &pUpPt);

		if(GetKey() == 'x')
		{
			return;
		} 
	}while((pUpPt - uUpAddr)<uUpFileSize);

	uLapseTime = StopTimer();
	
	if(uLapseTime == 0)
	{
		uLapseTime = 1;
	}
	
	if(eSpeed == USB_FULL)
	{
		Disp("(%3.3fKB/s,%3.3fs)\n",((float)uUpFileSize/uLapseTime*1000000/1024.),((float)uLapseTime/1000000));
	}
	else
	{
		Disp("(%3.3fMB/s,%3.3fs)\n",((float)uUpFileSize/uLapseTime*1000000/1024/1024.),((float)uLapseTime/1000000));
	}	
}

⌨️ 快捷键说明

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