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

📄 44bmon.c

📁 ARM 44b0x培训教程完整源代码下载
💻 C
字号:
#include <string.h>
#include "..\inc\option.h"
#include "..\inc\def.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\lcd.h"

//99.5.14 : Lcd_Init(), non-cacheable region is added.
//99.5.26 : link address: 0x1800000->0x0
//99.6.30(Ver 0.2): supports 64M DRAM(GCS6)
//99.8.10 : filesize counter: 6digit->7digit 
//99.8.27 : support Power Down mode
//00.4.20 : modify for S3C44BOX

#define DOWNLOAD_ADDRESS _RAM_STARTADDRESS

void (*restart)(void)=(void (*)(void))0x0;
void (*run)(void)=(void (*)(void))DOWNLOAD_ADDRESS;

#define START_LOGO_ADDRESS 0x8000 
#define START_ASCII_ADDRESS 0x8400

unsigned int (*frameBuffer)[10];

volatile unsigned char *downPt;
char *date[8] = {"","SUN","MON","TUE","WED","THU","FRI","SAT"};

void displaylcd(void);
void messageprint(char *,unsigned int ,unsigned int );
void print_logo(int ,int );
void clrscreen(void);
void Time_Rtc_Set(void);
unsigned ToLittle(unsigned );

void Isr_Init(void);
void Lcd_Init(void);
void Lcd_MonoInit(void);

void __irq Uart0_RxInt(void);
void __irq Uerror(void);
volatile unsigned int err=0;

/*
static union Toch8{

	struct {
		unsigned ch1:4;
		unsigned ch2:4;
		unsigned ch3:4;
		unsigned ch4:4;
		unsigned ch5:4;
		unsigned ch6:4;
		unsigned ch7:4;
		unsigned ch8:4;
	}Lch8;
	unsigned int Lch32;
};

*/

			

static union uni{
		unsigned int L32Bbit;
		struct {
		unsigned S1Bbit0:1;
		unsigned S1Bbit1:1;
		unsigned S1Bbit2:1;
		unsigned S1Bbit3:1;
		unsigned S1Bbit4:1;
		unsigned S1Bbit5:1;
		unsigned S1Bbit6:1;
		unsigned S1Bbit7:1;
		unsigned S1Bbit8:1;
		unsigned S1Bbit9:1;
		unsigned S1Bbit10:1;
		unsigned S1Bbit11:1;
		unsigned S1Bbit12:1;
		unsigned S1Bbit13:1;
		unsigned S1Bbit14:1;
		unsigned S1Bbit15:1;
		unsigned S1Bbit16:1;
		unsigned S1Bbit17:1;
		unsigned S1Bbit18:1;
		unsigned S1Bbit19:1;
		unsigned S1Bbit20:1;
		unsigned S1Bbit21:1;
		unsigned S1Bbit22:1;
		unsigned S1Bbit23:1;
		unsigned S1Bbit24:1;
		unsigned S1Bbit25:1;
		unsigned S1Bbit26:1;
		unsigned S1Bbit27:1;
		unsigned S1Bbit28:1;
		unsigned S1Bbit29:1;
		unsigned S1Bbit30:1;
		unsigned S1Bbit31:1;
		}L1Bbit;
		};



void Main(void)
{
    int i,j;
    int memError=0;
    int downdly;	
    unsigned int fileSize;
    unsigned short int checkSum=0,dnCS;
//    volatile unsigned *pt;

    rSYSCFG=CACHECFG;

    downPt=(unsigned char *)DOWNLOAD_ADDRESS;

    pISR_SWI=(_ISR_STARTADDRESS+0xf0);	  //for pSOS

    Port_Init();
    Led_Display(0x0);
    Isr_Init();
    Uart_Init(0,115200);

    Lcd_Init();     //to avoid LCD damage.

    Delay(0);
    Uart_Select(0); //Select UART0

    Uart_Printf("\n\n44bMON Ver 0.01 for S3C44B0X May,2000\n");
    Uart_Printf("COM:115.2kbps,8Bit,NP,UART0 <n+6>(4)+(n)+CS(2)\n");
    Uart_Printf("DOWNADDR:%x ISR_ADDR:%x SYSCFG:%x \n",DOWNLOAD_ADDRESS,_ISR_STARTADDRESS,rSYSCFG );
    Uart_Printf("E-mail:kwtark@sec.samsung.com\n\n");

    Uart_Printf("Memory Test(%xh-%xh):WR",
	_RAM_STARTADDRESS,(_ISR_STARTADDRESS&0xfff0000));
    
	
    for(i=_RAM_STARTADDRESS;i<(_ISR_STARTADDRESS&0xfff0000);i+=4)
    {
	*((volatile unsigned *)i)=i;
	}
    
    Uart_Printf("\b\bRD");

    for(i=_RAM_STARTADDRESS;i<(_ISR_STARTADDRESS&0xfff0000);i+=4)
    {
	j=*((volatile unsigned *)i);
	if(j!=i)memError=1;
    }

    if(memError==0)
	Uart_Printf("\b\bO.K.\n");
    else 
	Uart_Printf("\b\bFAIL\n");

    while(( (unsigned int)downPt-DOWNLOAD_ADDRESS )<4)
    {
    Time_Rtc_Set();//RTC DISPLAY ON LCD
	Led_Display(0xf);
	Delay(1000);
	Led_Display(0x0);
	Delay(1000);
    }

    clrscreen();	
    print_logo(3,40);
              messageprint(" **************",7,1);
              messageprint(" *    NOW     *",8,1);
              messageprint(" *DOWNLOADING.*",9,1);	
              messageprint(" **************",10,1);




    fileSize=*((unsigned char *)(DOWNLOAD_ADDRESS+0))+
	(*((unsigned char *)(DOWNLOAD_ADDRESS+1))<<8)+
	(*((unsigned char *)(DOWNLOAD_ADDRESS+2))<<16)+
	(*((unsigned char *)(DOWNLOAD_ADDRESS+3))<<24);

    Uart_Printf("\nNow, Downloading... [FILESIZE:%7d(      0)",fileSize);

    while(((int)downPt-DOWNLOAD_ADDRESS)<fileSize)
    {
	Uart_Printf("\b\b\b\b\b\b\b\b%7d)",(int)downPt-DOWNLOAD_ADDRESS);
//	Uart_Printf("error=%d\n",err);


      if (   (  (downdly++)%30)<20      )
      {
              messageprint(" *    NOW     *",8,1);
              messageprint(" *DOWNLOADING.*",9,1);	
      }
      else
      {
              messageprint(" *            *",8,1);
              messageprint(" *            *",9,1); 
      }

    }
    Uart_Printf("\b\b\b\b\b\b\b\b%7d)\n",(int)downPt-DOWNLOAD_ADDRESS);

    for(i=4;i<(fileSize-2);i++)
    {
	checkSum+=*((unsigned char *)(i+DOWNLOAD_ADDRESS));
    }
    dnCS=*((unsigned char *)(DOWNLOAD_ADDRESS+fileSize-2))+
	(*( (unsigned char *)(DOWNLOAD_ADDRESS+fileSize-1) )<<8);

    if(checkSum!=dnCS)
    {
	Uart_Printf("Checksum Error!!! MEM:%x DN:%x\n",checkSum,dnCS);
	restart();
    }

    Uart_Printf("\nDownload O.K.\n");

    messageprint(" *     OK!    *",9,1);
    messageprint(" *  DOWNLOAD  *",8,1); 

    for(i=4;i<(fileSize-2);i++) //Move the program from 0x1000004~ to 0x1000000~
    {
	*((unsigned char *)(i+DOWNLOAD_ADDRESS-4))
	    =*((unsigned char *)(i+DOWNLOAD_ADDRESS));
    }

    run();
}


void Isr_Init(void)
{
    rINTCON=0x5;	      //Non-vectored,IRQ enable,FIQ disable 
    rINTMOD=0x0;	      //All=IRQ mode
    rINTMSK=~( BIT_URXD0 | BIT_GLOBAL);	//Default value=0x7ffffff
//    rINTMSK=~( BIT_UERR01 | BIT_URXD0 | BIT_GLOBAL);	//Default value=0x7ffffff
    
    /*pISR_FIQ,pISR_IRQ must be initialized*/
    pISR_URXD0=(unsigned)Uart0_RxInt;
//    pISR_UERR01=(unsigned)Uerror;
}


void __irq Uart0_RxInt(void)
{
    rI_ISPC=BIT_URXD0 ;   //clear pending bits,Default value=0x0000000
    //rI_ISPC;		  //is needed only when cache=on & wrbuf=on & BSFRD=0
    *downPt++=RdURXH0();
}

void __irq Uerror(void)
{
    rI_ISPC=BIT_UERR01 ;   //clear pending bits,Default value=0x0000000
    err++;
//    Uart_Printf("UERSTAT=%x\n", rUERSTAT0);
}

void Display_4Gray160x240(void)
{
    int i,j;

    for(j=0;j<100;j++)
        for(i=2;i<10;i++)
        {
            frameBuffer4[j][i]=0x55aa55aa;
        }

    for(j=0;j<100;j++)
    {
        frameBuffer4[j][9]=0x5555ffff;
    }


    for(j=100;j<240;j++)
        for(i=2;i<10;i++)
            frameBuffer4[j][i]=0x0;
            
   
    for(i=2;i<10;i++)
        frameBuffer4[100][i]=0xffffffff;
    for(i=2;i<10;i++)
        frameBuffer4[0][i]=0xffffffff;
}

void Lcd_Init(void)
{
 
  Lcd_MonoInit();
  displaylcd();
}




void Lcd_MonoInit(void)
{
    //320x240 1bit/1pixel LCD
    int i,j;
    
    if((U32)frameBuffer1==0)
    {
        frameBuffer1=(unsigned int (*)[SCR_XSIZE/32])malloc(ARRAY_SIZE_MONO); 
    }

    rLCDCON1=(0)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MONO<<12);
    // disable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,
    rLCDCON2=(LINEVAL)|(HOZVAL<<10)|(10<<21);  
    //LINEBLANK=10 (without any calculation) 
    rLCDSADDR1= (0x0<<27) | ( ((U32)frameBuffer1>>22)<<21 ) | M5D((U32)frameBuffer1>>1);
    // monochrome, LCDBANK, LCDBASEU
    rLCDSADDR2= M5D( (((U32)frameBuffer1+(SCR_XSIZE*LCD_YSIZE/8))>>1) ) | (MVAL<<21);
    rLCDSADDR3= (LCD_XSIZE/16) | ( ((SCR_XSIZE-LCD_XSIZE)/16)<<9 );

    rLCDCON1=(1)|(1<<5)|(MVAL_USED<<7)|(0x3<<8)|(0x3<<10)|(CLKVAL_MONO<<12);
    // enable,4B_SNGL_SCAN,WDLY=8clk,WLH=8clk,


}





void displaylcd(void)

{
   
    clrscreen();
    
    print_logo(3,60);
    //messageprint Y(0~15):(240)ADDRESS , X(0~9):(320)-ADDRESS
    //                          技肺  啊肺鉴辑
    messageprint("ASCII FONT ADDRESS",1,0);
	messageprint("=0x7400 IN BOOTROM",2,0);
    //messageprint("E-MAIL:",9,1);
    //messageprint("punaamu@hitel.net",10,1);
    messageprint(" MERITECH HOMEPAGE:",10,0);
    messageprint(" www.meritech.co.kr",11,0);

}

void messageprint(char *pmessage,unsigned int j,unsigned int i)
{

    char togle=0;
    unsigned int framebuff[15],dr;
    unsigned short *Startadd;
    j*=16;
    while (*pmessage!='\0')
    {
     togle=~togle;
     Startadd=(unsigned short*)(START_ASCII_ADDRESS+0x20*(*pmessage++-' '));
  
     if (togle){
		for (dr=0;dr<16;dr++)	framebuff[dr] = *Startadd++;
	 }
	 else{
		 for (dr=0;dr<16;dr++){
				framebuff[dr] |= ((*Startadd++)<<16);
				frameBuffer1[j++][i]= ToLittle(framebuff[dr]);
		 }
     j-=16;
	 i++;
	 }

    }
	if (togle){
		 
		 for (dr=0;dr<16;dr++)frameBuffer1[j++][i]= ToLittle(framebuff[dr]);
	}

}
//RTC 免仿 钎矫 风凭
void Time_Rtc_Set(void)
{
    char togle=0;
    int hour,min,sec,i,j;
    int tdata[8];
    unsigned int framebuff[15],dr,dr1;
    unsigned short *Startadd;

	

    rRTCCON = 0x01;    // R/W enable, 1/32768, Normal(merge), No reset
    while(1)
    {
    hour=rBCDHOUR;
	min=rBCDMIN;
	sec=rBCDSEC;
	break;
	//if(sec!=0)break;
    }	 
   rRTCCON = 0x00;    // R/W disable, 1/32768, Normal(merge), No reset

	i=6;
	j=0;			//j绰 技肺 	i绰 啊肺
	tdata[0]=(hour>>4);
    	tdata[1]=(hour&0x00f);
    	tdata[2]=10;		//     <==捞巴捞 郴啊父电 迄飘 狼 ':'钎矫捞促.

	tdata[3]=(min>>4);
    	tdata[4]=(min&0x00f);
	tdata[5]=10;
    	
	tdata[6]=(sec>>4);
    	tdata[7]=(sec&0x00f);
    

    for (dr1=0;dr1<8;dr1++)
    {
     togle=~togle;
     Startadd=(unsigned short*)(START_ASCII_ADDRESS+0x20*(tdata[dr1]+0x10));
  
     if (togle){
		for (dr=0;dr<16;dr++)	framebuff[dr] = *Startadd++;
	 }
	 else{
		 for (dr=0;dr<16;dr++){
				framebuff[dr] |= ((*Startadd++)<<16);
				frameBuffer1[j++][i]= ToLittle(framebuff[dr]);
		 }
     j-=16;
	 i++;
	 }

    }
	if (togle){
		 
		 for (dr=0;dr<16;dr++)frameBuffer1[j++][i]= ToLittle(framebuff[dr]);
	}

   
}


//伙己肺绊 免仿 风凭
void print_logo(int i,int j)//肺绊 免仿 矫累 函荐 i,j
{
 
 int dr,dr1;
 unsigned int *plogo;
 
 plogo=(unsigned int*)START_LOGO_ADDRESS;

     for (dr1=0;dr1<4;dr1++)
     {
      for (dr=0;dr<64;dr++)
	{
	       	   frameBuffer1[j++][i]=ToLittle(*plogo);
               plogo+=2;
	 }

            ++i;j-=64;
      if(dr1%2)plogo--;
	else plogo-=64*2-1;

      }
}

unsigned ToLittle(unsigned temp1)
{
	union uni temp;
	unsigned logo;
    temp.L32Bbit= temp1;

	         logo=(temp.L1Bbit.S1Bbit28 << 07 ) | (temp.L1Bbit.S1Bbit29 << 06 ) | (temp.L1Bbit.S1Bbit30 << 05 ) | (temp.L1Bbit.S1Bbit31 << 04 );
			logo|=(temp.L1Bbit.S1Bbit24 << 03 ) | (temp.L1Bbit.S1Bbit25 << 02 ) | (temp.L1Bbit.S1Bbit26 << 01 ) | (temp.L1Bbit.S1Bbit27 << 00 );
			logo|=(temp.L1Bbit.S1Bbit20 << 15 ) | (temp.L1Bbit.S1Bbit21 << 14 ) | (temp.L1Bbit.S1Bbit22 << 13 ) | (temp.L1Bbit.S1Bbit23 << 12 );
			logo|=(temp.L1Bbit.S1Bbit16 << 11 ) | (temp.L1Bbit.S1Bbit17 << 10 ) | (temp.L1Bbit.S1Bbit18 <<  9 ) | (temp.L1Bbit.S1Bbit19 <<  8 );

			logo|=(temp.L1Bbit.S1Bbit12 << 23 ) | (temp.L1Bbit.S1Bbit13 << 22 ) | (temp.L1Bbit.S1Bbit14 << 21 ) | (temp.L1Bbit.S1Bbit15 << 20 );
			logo|=(temp.L1Bbit.S1Bbit8  << 19 ) | (temp.L1Bbit.S1Bbit9  << 18 ) | (temp.L1Bbit.S1Bbit10 << 17 ) | (temp.L1Bbit.S1Bbit11 << 16 );
			logo|=(temp.L1Bbit.S1Bbit4  << 31 ) | (temp.L1Bbit.S1Bbit5  << 30 ) | (temp.L1Bbit.S1Bbit6  << 29 ) | (temp.L1Bbit.S1Bbit7  << 28 );
			logo|=(temp.L1Bbit.S1Bbit0  << 27 ) | (temp.L1Bbit.S1Bbit1  << 26 ) | (temp.L1Bbit.S1Bbit2  << 25 ) | (temp.L1Bbit.S1Bbit3  << 24 );

    return (logo);
}



void clrscreen(void)
{
  int i,j;

 for (i=0;i<10;i++)
     for (j=0;j<320;j++)
   {
     frameBuffer1[j][i]=0;//(0x0FFFFFFFF);  
   }


}

⌨️ 快捷键说明

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