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

📄 main.c

📁 这是S3C44B0的BIOS或BOOT LOADER 程序中详细介绍了启动代码和FLASH 的读写 这很容易移植到其它ARM芯片
💻 C
字号:
#include "..\inc\44b.h"

#include "..\44blibs\catch.h"
#include "..\44blibs\io_port.h"
#include "..\44blibs\sst39vf160.h"
#include "..\44blibs\intserve.h"
#include "..\44blibs\lcd.h"
#include "..\44blibs\sysloader.h"
#include "..\44blibs\iic.h"



void __LoadSYS();
void (*__SYS)(void);


unsigned int __SYS_WAIT_Count = 0;
unsigned int __SYS_WAIT_COM;

unsigned int __T_BAS = 0;
unsigned int __SYS_T_BAS = 0;
unsigned int __SYS_LED = 0;

//========================
void Com_Proc();
unsigned int C_sum(unsigned char *pBuf,unsigned int PL);

unsigned int COM_MARK = 0;
unsigned int COM_TIME = 0;
//========================
void __irq Uart1_TxInt();
void __irq Uart1_RxInt();
unsigned char TX_BUF[256];
unsigned int TXP = 0;
unsigned int TXLEN = 0;
unsigned int isTXing = 0;

void TX(char *pBuf,unsigned int TL);
//========================
unsigned int DC[240][320/32];

int Main(int argc, char **argv)
{
    unsigned int p,q;

    /*初始化Cache*/
    Cache_Init();
    /*初始化IO*/
    IO_PortInit();
    IO_PortSetLed(LEDOFF);

    /*初始化IIC*/
    Iic_Init();

    /*初始化串口*/
    //Uart_Init(1,115200);

    rULCON1 = 0x03;
    rUCON1 = 0x02C5;
    rUFCON1 = 0x17;
    rUMCON1 = 0x00;

    rUBRDIV1 = (int)( 66000000/(115200*16) + 0.5 ) - 1;

    /* ====================================== */
    IntServe_Reg((unsigned int)ISR_UTXD1,(unsigned int)Uart1_TxInt);
    IntServe_Reg((unsigned int)ISR_URXD1,(unsigned int)Uart1_RxInt);

    rINTMSK = ~( (~rINTMSK) | BIT_URXD1 );

    /*初始化LCD 单色320*240*/
    Lcd_Init(&DC);


    /*打开中断*/
    rINTCON = 0x01;
    rINTMSK = ~( (~rINTMSK) | BIT_GLOBAL );

    /*系统开始*/
    TX("COM2: BOOT!",11);

    //===============
    Sst_Start();
    

    __SYS = (void(*)())0x0c002000;

    __SYS_WAIT_COM = 1;
    //__SYS_WAIT_COM = 0;
    while(1)
    {
        //===================
        if( __SYS_WAIT_COM ) __SYS_WAIT_Count++;
         
        if(__SYS_WAIT_Count > 0x2000)
        {
            Sst_End();
            IO_PortSetLed(LEDOFF);
            __LoadSYS();
            (*__SYS)();
        }else
        {
            //===================
            __T_BAS++;
            if( __T_BAS > 0x1500 )
            {
                __T_BAS = 0;

                __SYS_T_BAS++;
                __SYS_LED++;

                //==========
                if( COM_MARK )
                {
                    COM_TIME++;
                }
            }
            //===================
            if( __SYS_LED > 3 && !__SYS_WAIT_COM )
            {
                IO_PortSetLed(LEDON);
            }
            
            if( __SYS_LED > 6 && !__SYS_WAIT_COM )
            {
                IO_PortSetLed(LEDOFF);
                __SYS_LED = 0;
            }

            Com_Proc();
        }


    }
    return 0;
}     

//=====================
//
//=====================
unsigned char RX_BUF[1024];
unsigned short W_BUF[256];

unsigned int RX_COUNT = 0;
unsigned int RX_PLEN = 0;
unsigned int RX_HP = 0;

unsigned int SA,EA;
unsigned char *pStr;

void Com_Proc()
{
    unsigned int i,Len,ret;
    unsigned char IPBuf[8],Buf,Mark;
    
    //check data
    if( RX_HP )
    {
        if( C_sum(RX_BUF,RX_PLEN) )
        {
            //联机
            if( RX_BUF[4] == 'L' && RX_BUF[5] == 'L' )
            {
                __SYS_WAIT_COM = 0;
                TX( "Y",1);
                __SYS_WAIT_Count = 0;

                /*初始化字库*/
                Sysloader_LoadFont0816(); // 8*16 ASCII 字库
                Sysloader_LoadFont1616(); //16*16 国标字库
                /*初始化LCD 单色320*240*/
                Lcd_Init(&DC);

                Lcd_printf(&DC,"联机成功。\n");

            }

            //擦除 Flash
            if( RX_BUF[4] == 'E' && RX_BUF[5] == 'E' )
            {
                pStr = (unsigned char*)&SA;
                pStr[0] = RX_BUF[6];
                pStr[1] = RX_BUF[7];
                pStr[2] = RX_BUF[8];
                pStr[3] = RX_BUF[9];

                pStr = (unsigned char*)&EA;
                pStr[0] = RX_BUF[10];
                pStr[1] = RX_BUF[11];
                pStr[2] = RX_BUF[12];
                pStr[3] = RX_BUF[13];

                Lcd_printf(&DC,"擦除中。。。。。\n");

                rINTMSK = rINTMSK | BIT_GLOBAL ;
                ret = Sst_Erase( SA, EA);
                rINTMSK = ~( (~rINTMSK) | BIT_GLOBAL );
                if( ret)
                { 
                    TX( "Y" , 1);
                    Lcd_printf(&DC,"擦除成功。\n");
                }else
                {
                    Lcd_printf(&DC,"擦除失败。\n");
                }
                
            }

            //编程
            if( RX_BUF[4] == 'P' && RX_BUF[5] == 'P' )
            {
                
                pStr = (unsigned char*)&SA;
                pStr[0] = RX_BUF[6];
                pStr[1] = RX_BUF[7];
                pStr[2] = RX_BUF[8];
                pStr[3] = RX_BUF[9];

                pStr = (unsigned char*)&EA;
                pStr[0] = RX_BUF[10];
                pStr[1] = RX_BUF[11];
                pStr[2] = RX_BUF[12];
                pStr[3] = RX_BUF[13];

                Len = ( RX_PLEN -10 + 1)/2;
                
                pStr = (unsigned char*)W_BUF;
                for( i = 0 ; i < RX_PLEN -10 ; i++ ) pStr[i] = RX_BUF[14 + i]; 
                
                rINTMSK = rINTMSK | BIT_GLOBAL ;
                ret = Sst_Program(SA , W_BUF, Len);
                rINTMSK = ~( (~rINTMSK) | BIT_GLOBAL );
                if( ret)
                { 
                    TX( "Y" , 1);
                    Lcd_printf(&DC,"[%08XH]--[%08XH]编程成功。\n",SA,EA+1);
                }else
                {
                    Lcd_printf(&DC,"[%08XH]--[%08XH]编程失败。\n",SA,EA+1);
                }
                
            }
            
            //设置IP
            if( RX_BUF[4] == 'I' && RX_BUF[5] == 'S' )
            {
               for( i = 0 ; i < 4 ; i++ )
               {
                  Wr24LCxx(0xA0,4+i,RX_BUF[6+i]);
               }

               Mark = 0;
               for( i = 0 ; i < 4 ; i++ )
               {
                   Rd24LCxx(0xA0,4+i,&Buf);
                   if(Buf != RX_BUF[6+i] ) Mark = 1;
               }

               if( !Mark )
               {
                  TX( "Y" , 1); 
                  Lcd_printf(&DC,"IP设置成功。\n");
               }else
               {
                  Lcd_printf(&DC,"IP设置失败。\n");
               }
            }

            //读取IP
            if( RX_BUF[4] == 'I' && RX_BUF[5] == 'R' )
            {
               for( i = 0 ; i < 4 ; i++ )
               {
                   Rd24LCxx(0xA0,4+i,IPBuf + 1 + i);
               }
               IPBuf[0] = 'Y';
               TX( (char*)IPBuf , 5); 
               Lcd_printf(&DC,"IP读取成功。\n");
            }

            //设置网卡地址
            if( RX_BUF[4] == 'N' && RX_BUF[5] == 'S' )
            {
               for( i = 0 ; i < 3 ; i++ )
               {
                  Wr24LCxx(0xA0,i,RX_BUF[6+i]);
               }

               Mark = 0;
               for( i = 0 ; i < 3 ; i++ )
               {
                   Rd24LCxx(0xA0,i,&Buf);
                   if(Buf != RX_BUF[6+i] ) Mark = 1;
               }

               if( !Mark )
               {
                  TX( "Y" , 1); 
                  Lcd_printf(&DC,"网卡地址设置成功。\n");
               }else
               {
                  Lcd_printf(&DC,"网卡地址设置失败。\n");
               }
            }

            //读取网卡地址
            if( RX_BUF[4] == 'N' && RX_BUF[5] == 'R' )
            {
               for( i = 0 ; i < 3 ; i++ )
               {
                   Rd24LCxx(0xA0,i,IPBuf + 1 + i);
               }
               IPBuf[0] = 'Y';
               TX( (char*)IPBuf , 4); 
               Lcd_printf(&DC,"网卡地址读取成功。\n");
            }

        }

        RX_COUNT = 0;
        COM_MARK = 0;
        COM_TIME = 0;
        RX_HP = 0;

    }

    //time out
    if( COM_TIME > 38 )
    {
        RX_COUNT = 0;
        COM_MARK = 0;
        COM_TIME = 0;
        RX_HP = 0;
    }

}

//===================
void TX(char *pBuf,unsigned int TL)
{
    unsigned int i;

    if( TL > 256 ) TL = 256;

    while( isTXing );

    for( i = 0 ; i < TL ; i++ )TX_BUF[i] = pBuf[i];
    TXLEN = TL;
    TXP = 0;
    isTXing = 1;
    rINTMSK = ~( (~rINTMSK) | BIT_UTXD1 );
}

void __irq Uart1_TxInt()
{
    while( !(rUFSTAT1 & 0x200) && ( TXP < TXLEN ) )   //until tx fifo full or end of string
    {
        rUTXH1 = TX_BUF[TXP];
        TXP++;
    }

    rI_ISPC = BIT_UTXD1;        
    if( TXP >= TXLEN )
    { 
        TXP = 0;
        TXLEN = 0;
        isTXing = 0;
        rINTMSK = rINTMSK | BIT_UTXD1 ;
    }
}

void __irq Uart1_RxInt()
{
    unsigned char rd;
    rI_ISPC = BIT_URXD1;
    

        if( !RX_HP )
        {
            RX_BUF[RX_COUNT] = rURXH1;
            if( RX_COUNT == 0 ) COM_MARK = 1;
            RX_COUNT++;
        }else
        {
            rd = rURXH1;
        }

        if( RX_COUNT > 1023 ) RX_COUNT = 1023;

        if( RX_COUNT == 1 )
        {
            if( RX_BUF[0] != 0x55 ) RX_COUNT = 0;
        }

        if( RX_COUNT == 2 )
        {
            if( RX_BUF[0] != 0x55 || RX_BUF[1] != 0xAA ) RX_COUNT = 0;
        }

        if( RX_COUNT == 4 )
        {
            RX_PLEN = RX_BUF[2]*256 + RX_BUF[3];
        }

        if( RX_COUNT >= RX_PLEN + 6 ) RX_HP = 1;



    while( (rUFSTAT1&0xf) >0 )
    {
        if( !RX_HP )
        {
            RX_BUF[RX_COUNT] = rURXH1;
            if( RX_COUNT == 0 ) COM_MARK = 1;
            RX_COUNT++;
        }else
        {
            rd = rURXH1;
        }

        if( RX_COUNT > 1023 ) RX_COUNT = 1023;

        if( RX_COUNT == 1 )
        {
            if( RX_BUF[0] != 0x55 ) RX_COUNT = 0;
        }

        if( RX_COUNT == 2 )
        {
            if( RX_BUF[0] != 0x55 || RX_BUF[1] != 0xAA ) RX_COUNT = 0;
        }

        if( RX_COUNT == 4 )
        {
            RX_PLEN = RX_BUF[2]*256 + RX_BUF[3];
        }

        if( RX_COUNT >= RX_PLEN + 6 ) RX_HP = 1;
    }

}
//======================

unsigned int C_sum(unsigned char *pBuf,unsigned int PL)
{
    unsigned int i,sum = 0;
    
    for( i = 0; i < PL + 4 ; i++ )
    {
        sum = sum + RX_BUF[i];
    }
    
    if( RX_BUF[i] == ((sum & 0xFFFF) >> 8) && RX_BUF[i+1] == (sum & 0xFF) ) return 1;
    return 0;

}

void __LoadSYS()
{
    unsigned int *pLen;
    unsigned int Len;
    
    unsigned int *pS , *pD;
    
    
    pLen = (unsigned int *)0xF000;
    Len = (*pLen) + 16 + 0x0c002000;
    
    pS = (unsigned int *)0x00010000;
    pD = (unsigned int *)0x0c002000;

    while( (unsigned int)pD < Len )
    {
        *pD++ = *pS++;
    }

}

⌨️ 快捷键说明

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