📄 2443mon_u_jcs.cpp
字号:
/**
* Project Name : S3C2443 verification project
*
* Copyright 2006 by Samsung Electronics, Inc.
* All rights reserved.
*
* Project Description :
* This software is only for verifying functions of the S3C2443.
* Anybody can use this code without our permission.
*/
/**
* File Name : 2443mon.cpp
* Description : S3C2443 USB monitor main code
* Author : Cha gyu hwan
* Dept : Mobile solution, AP
* Created Date : 2006.06.16
* Version : 0.0
* History
* R0.0 (2006.06.): Cha gyu hwan draft
*/
#include <stdio.h>
#include <stdlib.h>
#include "Option.h"
#include "System.h"
#include "Console.h"
#include "MMUCache.h"
#include "Exception.h"
#include "2443addr.h"
#include "memtest.h"
#include "pll.h"
#include "profile.h"
/*
#include "usbmain.h"
#include "usbout.h"
#include "usblib.h"
*/
#include "usbdev.h"
#include "uartdown.h" // add 060626
void Lcd_Off(void);
void WaitDownload(void);
void Menu(void);
void ClearMemory(void);
void UsbMon(void);
void Clk0_Enable(int clock_sel);
void Clk1_Enable(int clock_sel);
void Clk0_Disable(void);
void Clk1_Disable(void);
void TestDownLoading(void);
static USBDEV oUdev;
//#define OS_START_ADDR_OFFSET (0x01000000)
//#define DOWNLOAD_ADDRESS (_RAM_STARTADDRESS+OS_START_ADDR_OFFSET)
volatile U32 downloadAddress; //=DOWNLOAD_ADDRESS;
void (*restart)(void)=(void (*)(void))0x0;
void (*run)(void);
volatile unsigned char *downPt;
volatile U32 downloadFileSize;
volatile U16 checkSum;
volatile unsigned int err=0;
volatile U32 totalDmaCount;
int download_run=0;
U32 tempDownloadAddress;
int menuUsed=0;
extern char Image$$RW$$Limit[];
U32 *pMagicNum=(U32 *)Image$$RW$$Limit;
int consoleNum;
//static USB_OP eOpMode = USB_CPU;
static USB_OP eOpMode = USB_DMA;
static void __irq Isr_Usb(void)
{
// printf(".");
// oIntc.Mask(INT_USBDEV);
rINTMSK|=BIT_USBD;
// Delay(100);
oUdev.HandleEvent();
ClearPending(BIT_USBD);
// oIntc.ClearPending(INT_USBDEV);
// oIntc.Unmask(INT_USBDEV);
rINTMSK&=~(BIT_USBD);
}
void WhichMemory(void)
{
if(rBANKCFG & 0x4)
{
printf("mSDR\n");
}else{
printf("mDDR\n");
}
}
void Reset_Status_Check(void)
{
printf("reset status register = %08x\n", rRSTSTAT);
if( rRSTSTAT & (1<<0) )
{
printf("Power-on Reset\n");
}
else if( rRSTSTAT & (1<<2) )
{
printf("\nWatch-dog Reset\n\n");
run=(void (*)(void))0x30000000;
run();
}
else if( rRSTSTAT & (1<<3) )//Sleep mode wake-up
{
printf("\nSLEEP mode Wake-up\n\n");
run=(void (*)(void))0x30000000;
run();
}
else if( rRSTSTAT & (1<<4) )
{
printf("\nEsleep mode Wake-up\n\n");
run=(void (*)(void))0x30000000;
run();
}
else if( rRSTSTAT & (1<<5) )
{
printf("\nSoft Reset\n\n");
run=(void (*)(void))0x30000000;
run();
}
}
int main(void)
{
SystemCLK(0);
Console();
Isr_Init();
UsbMon();
}
void UsbMon(void)
{
if (rRSTSTAT&0x8) rRSTCON|=(1<<16); //if reset by sleep wakeup, control the retention I/O cell
//USB Port is Normal mode
rMISCCR=rMISCCR&~(1<<12); // USBD is 0 ,normal mode ,1 is suspend mode /
rPWRCFG |= (0x1<<4); // phy power enable
//USB device 2.0 must reset like bellow , 1st phy reset and after at least 10us, func_reset & host reset
//phy reset can reset bellow registers.
rUSB_RSTCON = (0x0<<2)|(0x0<<1)|(0x1<<0);//Function 2.0 S/W reset, Host 1.1 S/W reset,PHY 2.0 S/W reset
Delay(1); // phy reset must be asserted for at 10us
rUSB_RSTCON = (0x1<<2)|(0x1<<1)|(0x0<<0);//Function 2.0 S/W reset, Host 1.1 S/W reset,PHY 2.0 S/W reset
rUSB_RSTCON = (0x0<<2)|(0x0<<1)|(0x0<<0);//Function 2.0 S/W reset, Host 1.1 S/W reset,PHY 2.0 S/W reset
rUSB_PHYCTRL =(0x00<<3)|(0x0<<2)|(0x1<<1)|(0x0<<0); //48Mhz,Oscillator,External X-tal,device
rUSB_PHYPWR = (0x1<<31)|(0x0<<4)|(0x0<<3)|(0x0<<2)|(0x0<<1)|(0x0<<0);
//48Mhz clock on ,PHY2.0 analog block power on,XO block power on,XO block power in suspend mode,PHY 2.0 Pll power on ,suspend signal for save mode disable
rUSB_CLKCON = (0x0<<31)|(0x1<<2)|(0x0<<1)|(0x1<<0); // vbus detect enable...
//D+ pull up , USB2.0 Function clock Enable, USB1.1 HOST disable,USB2.0 PHY test enable
//rHCLKCON &= ~(0x1<<12); //
// rCLKDIV1|=0x1<<4; // for test clk enable
#if 1
pISR_USBD =(unsigned)Isr_Usb;
// pISR_DMA =(unsigned)IsrDma2;
#else
pISR_IRQ =(unsigned)Isr_Usb;
//Why doesn't it receive the big file if use this. (???)
//It always stops when 327680 bytes are received.
#endif
#if 0
UsbdMain();
MMU_Init(); //MMU should be reconfigured or turned off for the debugger,
//After downloading, MMU should be turned off for the MMU based program,such as WinCE.
#else
MMU_EnableICache();
UsbdMain();
#endif
// ClearPending(BIT_DMA);
ClearPending(BIT_USBD);
rINTMSK&=~(BIT_USBD); // usb interrupt enable
Delay(0); //calibrate Delay()
// printf("3!!!\n");
// pISR_SWI=(_ISR_STARTADDRESS+0xf0); //??????for pSOS
Led_Display(0x6);
rUSB_CLKCON = (0x1<<31)|(0x1<<2)|(0x0<<1)|(0x1<<0); // vbus detect enable...
//D+ pull up , USB2.0 Function clock Enable, USB1.1 HOST disable,USB2.0 PHY test enable
// CLKOUT0/1 select.
printf("CLKOUT0:MPLL in, CLKOUT1:RTC clock.\n");
Clk0_Enable(1); // 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0
Clk1_Enable(2); // 0:MPLLout, 1:UPLL, 2:RTC, 3:HCLK, 4:PCLK, 5:DCLK1
Clk0_Disable();
Clk1_Disable();
printf("\n\n");
printf("+-----------------------------------------------+\n");
printf("| S3C2443X USB Downloader ver R0.0 +\n");
printf("+-----------------------------------------------+\n");
WhichMemory();
printf("MPLL=%.2fMHz, ARMCLK=%.2fMHz (%d:%d:%d), HCLK=%.2fMHz, PCLK=%.2fMHz\n\n",
(float)MPLL/1000000,(float)ARMCLK/1000000,ARMCLKdiv+1,(ARMCLKdiv+1)*(HCLKdiv+1),(ARMCLKdiv+1)*(HCLKdiv+1)*(PCLKdiv+1),(float)HCLK/1000000,(float)PCLK/1000000);
printf("USB: IN_ENDPOINT:1 OUT_ENDPOINT:3\n");
printf("FORMAT: <ADDR(DATA):4>+<SIZE(n+10):4>+<DATA:n>+<CS:2>\n");
printf("NOTE: 1. Power off/on or press the reset button for 1 sec\n");
printf(" in order to get a valid USB device address.\n");
printf(" 2. For additional menu, Press any key. \n");
printf("\n");
download_run=1; //The default menu is the Download & Run mode.
Reset_Status_Check();
// rUSB_TESTTI = 0x0400;
while(1)
{
if(menuUsed==1)Menu();
WaitDownload();
}
}
void UsbdMain(void)
{
oUdev.SetOpMode(eOpMode);
oUdev.Init();
}
void Menu(void)
{
U8 key;
menuUsed=1;
while(1)
{
printf("\n###### Select Menu ######\n");
printf(" [0] Download & Run\n");
printf(" [1] Download Only\n");
printf(" [2] Test SDRAM \n");
printf(" [3] Clear SDRAM \n");
printf(" [4] Change The Console UART Ch.\n");
printf(" [5] Download with UART\n");
key=getchar();
switch(key)
{
case '0':
printf("\nDownload&Run is selected.\n\n");
download_run=1;
return;
case '1':
printf("\nDownload Only is selected.\n");
printf("Enter a new temporary download address(0x3...):");
tempDownloadAddress=GetIntNum();
download_run=0;
printf("The temporary download address is 0x%x.\n\n",tempDownloadAddress);
return;
case '2':
printf("\nMemory Test is selected.\n");
MemoryTest();
Menu();
return;
case '3':
printf("\nMemory Clear is selected.\n");
ClearMemory();
Menu();
return;
//break;
case '4':
printf("\nWhich UART channel do you want to use for the console?[0/1]\n");
if(getchar()!='1')
{
*pMagicNum=0x0;
printf("UART ch.0 will be used for console at next boot.\n");
}
else
{
*pMagicNum=0x12345678;
printf("UART ch.1 will be used for console at next boot.\n");
printf("UART ch.0 will be used after long power-off.\n");
}
printf("System is waiting for a reset. Please, Reboot!!!\n");
while(1);
//break;
case '5': // add 060626
printf("\nDownload with UART\n");
UartMON();
return;
//break;
default:
break;
}
}
}
void WaitDownload(void)
{
U32 i;
U32 j;
U16 cs;
U32 temp;
U16 dnCS;
int first=1;
float time;
U8 tempMem[16];
U8 key;
U32 uDownAddr, uDownFileSize;
checkSum=0;
downloadAddress=(U32)tempMem; //_RAM_STARTADDRESS;
downPt=(unsigned char *)downloadAddress;
//This address is used for receiving first 8 byte.
oUdev.m_uDownloadFileSize=0;
#if 0
MMU_DisableICache();
//For multi-ICE.
//If ICache is not turned-off, debugging is started with ICache-on.
#endif
/*******************************/
/* Test program download */
/*******************************/
j=0;
if(oUdev.IsEnumerationDone()==false)
{
printf("USB host is not connected yet.\n");
}
// oUdev.GetDownFileInfo(uDownAddr, uDownFileSize); // only for debug
// downloadFileSize=uDownFileSize;
// printf("downloadAddress = %x\n",downloadAddress);
// printf("downloadFileSize = %x\n",downloadFileSize);
// downloadAddress=uDownAddr;
//while(downloadFileSize==0)
while(oUdev.m_uDownloadFileSize==0)
{
if(first==1 && oUdev.IsEnumerationDone()==true)
{
printf("USB host is connected. Waiting a download.\n");
first=0;
}
if(j%0x50000==0)Led_Display(0x6);
if(j%0x50000==0x28000)Led_Display(0x9);
j++;
key=Uart_GetKey();
if(key!=0)
{
Menu();
first=1; //To display the message,"USB host ...."
}
}
StartStopwatch();
/*
#if (eOpMode != USB_CPU)
// rINTMSK&=~(BIT_DMA);
// 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.
// rDIDST2=(downloadAddress+downloadFileSize-EP3_PKT_SIZE);
// rDIDSTC2=(0<<1)|(0<<0);
// rDCON2=rDCON2&~(0xfffff)|(0);
//
}
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
*/
printf("\nNow, Downloading [ADDRESS:%xh,TOTAL:%d]\n",
downloadAddress,downloadFileSize);
printf("RECEIVED FILE SIZE:%8d",0);
if(oUdev.m_eOpMode!= USB_CPU)
{
j=0x10000;
//printf("USB DMA mode \n");
while(1)
{
// if( (rMCAR-(U32)downloadAddress+8)>=j)
// {
/// printf("\b\b\b\b\b\b\b\b%8d",j);
//printf("%x\n",rMCAR);
// j+=0x10000;
// }
if((rDTTCR1==0)&&(rDTTCR2==1))break;
}
}
else
{
j=0x10000;
printf("*");
//while(1)
while(((U32)oUdev.m_pDownPt-downloadAddress)<(downloadFileSize-8))
{
if( ((U32)oUdev.m_pDownPt-downloadAddress)>=j)
{
printf("\b\b\b\b\b\b\b\b%8d",j);
j+=0x10000;
}
}
}
time=EndStopwatch();
printf("\b\b\b\b\b\b\b\b%8d",downloadFileSize);
printf("\n(%5.1fKB/S,%3.1fS)\n",(float)(downloadFileSize/time*1000.),time/1000000);
/*******************************/
/* Verify check sum */
/*******************************/
/*
#if (eOpMode != USB_CPU)
printf("Now, Checksum calculation\n");
cs=0;
i=(downloadAddress);
j=(downloadAddress+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+downloadFileSize-10)&0xfffffffc;
j=(downloadAddress+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+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)
{
printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
return;
}
printf("Download O.K.\n\n");
//Uart_TxEmpty(consoleNum);
*/
printf("RECEIVE FILE DONE !! \n");
if (oUdev.VerifyChecksum())
printf("\nChecksum O.K.\n\n");
else
printf("\nChecksum failed.\n\n");
if(download_run==1)
{
rINTMSK=BIT_ALLMSK;
run=(void (*)(void))downloadAddress;
run();
}
}
void Clk0_Enable(int clock_sel)
{ // 0:MPLLin, 1:UPLL, 2:FCLK, 3:HCLK, 4:PCLK, 5:DCLK0 6:OSC To PLL INPUT Clock
rMISCCR = rMISCCR&~(7<<4) | (clock_sel<<4);
rGPHCON = rGPHCON&~(3<<26) | (2<<26);
}
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<<28) | (2<<28);
}
void Clk0_Disable(void)
{
rGPHCON = rGPHCON&~(3<<26); // GPH13 Input
}
void Clk1_Disable(void)
{
rGPHCON = rGPHCON&~(3<<28); // GPH14 Input
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -