📄 6410_otgmon.c
字号:
/**************************************************************************************
*
* 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 + -