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

📄 platform.c

📁 思创S3C44B0黄金开发板一个简化版本的BOOTLOADER
💻 C
字号:
#include <stdarg.h>
#include "inc\44b.h"
#include "platform.h"
#include "common.h"

void ChangePllValue(int mdiv,int pdiv,int sdiv)
{
  rPLLCON = (mdiv << 12) | (pdiv << 4) | sdiv;
}

void Reset()
{
  typedef (*FUNC)(void);
  FUNC fp;
  fp=(FUNC)0x0;
  fp();
}

void Delay(int time)
{
  static int DelayLoopCount = 400;
  int i,adjust=0;
  if(time==0)
  {
    time=200;
    adjust=1;
    DelayLoopCount=400;
    rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
    rWTDAT=0xffff;    rWTCNT=0xffff;   
    rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5);
  }
  for(;time>0;time--)
    for(i=0;i<DelayLoopCount;i++);
  if(adjust==1)
  {
    rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
    i=0xffff-rWTCNT;
    DelayLoopCount=8000000/(i*64);
  }
}

//***************************************************************************
#define MVAL_USED (0)  
#define MVAL    (13)    
#define INVCLK    (0) 
#define INVFRAME  (0) 
#define INVLINE   (0)   
#define CLKVAL_SL (8)   //VCLK=MCLK/(CLKVAL*2)    (CLKVAL >= 2)
#define M5D(n) ((n) & 0x1fffff)
unsigned char Bmp[9600];    

void LcdInit(void)
{
  int i;
  for (i=0;i<sizeof(Bmp);i++) Bmp[i]=0xF0;
  rPCOND=0xaaaa;
  rLCDCON1=(2)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(1<<5)|(MVAL_USED<<7)|(1<<8)|(1<<10)|(CLKVAL_SL<<12);
    //下降沿装载视频数据,禁止视频输出,LCD FIFO清空;行、帧信号取反;
    //4位单扫描模式;WDLY=8clk,WLH=8clk,CLKVAL_SL=38
  rLCDCON2=(239)|(79<<10)|(10<<21);
    //垂直点数为240,水平点数320=(80字),LINEBLANK=10
  rLCDSADDR1= (0x0<<27) | ( ((uint)Bmp>>22)<<21 ) | M5D((uint)Bmp>>1);
    // 黑白模式, LCDBANK, LCDBASEU
  rLCDSADDR2= (1<<29) | (M5D((uint)Bmp + ((320/8)*(240)))>>1) | (MVAL<<21);
  rLCDSADDR3= (320/16) | ( 0<<9 );   
  rLCDCON1=(3)|(INVFRAME<<2)|(INVLINE<<3)|(INVCLK<<4)|(1<<5)|(MVAL_USED<<7)|(1<<8)|(1<<10)|(CLKVAL_SL<<12);
}

void PortInit(void)
{
  //  PORT A GROUP
  /*  BIT   9   8   7   6   5   4   3   2   1   0 */
  /*  A24   A23 A22 A21 A20 A19 A18 A17 A16 A0  */        
  /*  0   1 1 1 1 1 1 1 1 1 */
  rPCONA = 0x0ff; 
  rPDATA = 0x0ff;

  // PORT B GROUP
  /*  BIT 10  9   8   7   6   5   4   3   2   1   0   */
  /*  /CS5  /CS4  /CS3  /CS2  /CS1  nWBE3 nWBE2 /SRAS /SCAS SCLK  SCKE  */
  /*  EXT   NIC   USB   IDE   SMC   NC    NC    Sdram Sdram Sdram Sdram */
  /*      0,        0,   0,   0,    1,    0,       0,     1,    1,    1,   1          */
  rPDATB = 0x7ff;
  rPCONB = 0x7ff;

         //改动 by yang 2003.5
  //PORT C GROUP
  //BUSWIDTH=16                         */
  /*  PC15    14    13    12    11    10    9   8 */
  /*  o   o   RXD1  TXD1  o   o   o   o */
  /*  NC    NC    Uart1 Uart1 NC    NC    NC    NC  */
  /*   11   11    11    11    11    11    01    00  */

  /*  PC7   6   5   4   3   2   1   0 */
  /*   o    o   o   o   o   o   o   o */
  /*   NC   NC    NC    NC    SMCALE  SMCCLE  SMCCE SMCRB*/
  /*   01   01    01    01    01    01    01    01  */
  rPDATC = 0x0000;  //All IO is low
  rPCONC = 0xfff45555;  
  rPUPC  = 0xFC00;  //PULL UP RESISTOR should be enabled to I/O

  //PORT D GROUP
  /*  PORT D GROUP(I/O OR LCD)                    */
  /*  BIT7    6   5   4   3   2   1   0 */
  /*      VF    VM    VLINE VCLK  VD3   VD2   VD1   VD0 */
  /*     01   01    01    01    01    01    01    01  */
  rPDATD= 0x55;
  rPCOND= 0xaaaa; 
  rPUPD = 0x00;
  //These pins must be set only after CPU's internal LCD controller is enable
///////////////////////////////////////////////////// 
  //PORT E GROUP 
  /*  Bit 8   7   6   5   4   3   2   1   0   */
  /*    ENDLAN  LED3  LED2  LED1  LED0  BEEP  RXD0  TXD0  CLKOUT  */ 
  /*      00    01    01    01    01    01    10    10    00    */
  rPDATE  = 0x157;
  rPCONE  = 0x5528; 
  rPUPE = 0xff;
  
 //PORT F GROUP
  /*  Bit8    7   6   5    4    3   2   1   0   */   
  /*  IISCLK  IISDI IISDO IISLRCK Input Input Input IICSDA  IICSCL  */
  /*  100   100   100   100   00    01    01    10    10    */
  rPDATF = 0x0;
  rPCONF = 0x24915a;
  rPUPF  = 0x1E3;

  //PORT G GROUP
  /*  BIT7    6   5   4   3   2   1   0  */
  /*  INT7    INT6    INT5    INT4    INT3    INT2    INT1    INT0  */
  /*    S3    S4    S5    S6    NIC   EXT   IDE   USB */
  /*      11      11      11      11      11      11      11      11       */
  rPDATG = 0xFF;
  rPCONG = 0xFFFF;
  rPUPG  = 0x00;  //should be enabled  

  rSPUCR=0x7;  //D15-D0 pull-up disable

  /*定义非Cache区*/
  rNCACHBE0 = 0xc0002000; 

  /*所有的外部硬件中断为低电平触发*/
  rEXTINT=0x0044;
}

void IsrInit(void)
{
  rINTCON=0x5;        //Non-vectored,IRQ enable,FIQ disable //
  rINTMOD=0x0;        //All=IRQ mode//
  rINTMSK=~(BIT_GLOBAL);  //Default value=0x7ffffff//
}

void Uart0Init(int mclk,int baud)
{
  if(mclk == 0) mclk = MCLK;

  rUFCON0 = 0x00;     //禁止使用FIFO
  rUMCON0 = 0x0;     //禁止使用FIFO
  rULCON0 = 0x3;     //正常无奇偶校验,一个停止位,8个数据位
  rUCON0 = 0x245;    
   
  //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
  rUBRDIV0 = ( (int)(mclk/16./baud + 0.5) -1 );
  //UBRDIVn = ((int)(MCLK/16/baud + 0.5) -1)  波特率与系统主时钟计算公式
  Delay(1);   //延时若干个100us
}


void Uart1Init(int mclk,int baud)
{
  if(mclk == 0) mclk = MCLK;

  rUFCON1 = 0x0;     //禁止使用FIFO
  rUMCON1 = 0x0;     //禁止使用FIFO
  rULCON1 = 0x3;     //正常无奇偶校验,一个停止位,8个数据位
  rUCON1 = 0x245;
   
  //rx=edge,tx=level,disable timeout int.,enable rx error int.,normal,interrupt or polling
  rUBRDIV1 = ( (int)(mclk/16./baud + 0.5) -1 );
  //UBRDIVn = ((int)(MCLK/16/baud + 0.5) -1)  波特率与系统主时钟计算公式
 Delay(1);   //延时若干个100us
}

char GetChar(uint8 ch)
{
    if(ch == 0)
    {     
    while(!(rUTRSTAT0 & 0x1));    //等待直到接受到一个数据
    return rURXH0;
    }
    else
    {
    while(!(rUTRSTAT1 & 0x1));    //等待直到接受到一个数据
    return  rURXH1;
    }
}
//***************************************************************************

/****************************************************************************
【功能说明】检查串行口是否收到字符并返回,ch为0从UART0收取,ch为1从UART1收取
****************************************************************************/
char GetKey(uint8 ch)
{
    if(ch == 0)
    {     
    if(rUTRSTAT0 & 0x1)   //如果收到字符就返回该字符
          return rURXH0;
    else  return 0;   //如果没有收到字符就返回0
    }
    else
    {
    if(rUTRSTAT1 & 0x1)   //如果收到字符就返回该字符
        return rURXH1;
    else  return 0;   //如果没有收到字符就返回0
    }
}

void LedOut(uint8 ch, uint8 flag)
{
    char chmod1[]={0x48,0xeb,0x52, 0x62,0xe1,0x64,0x44,0xea,0x40,0x60,0xC0,0x45,0x5c,0x43,0x54,0xd4};
    unsigned short   value;
    volatile short *p = (volatile short *)0x6080000;

    if (flag) {
      value = chmod1[ch/16];
      value <<= 8;
      value |= chmod1[ch%16];
    
    } else {
      if (ch>99) ch = ch % 100;
      value = chmod1[ch/10];
      value <<= 8;
      value |= chmod1[ch%10];
    }

    *p = value;
}

void PutChar (uint8 ch,uint8 data)
{
  if(ch == 0)
  {
    if(data == '\n')
    {
      while(!(rUTRSTAT0 & 0x2));
      
      //改动延时时间1--10
      Delay(10);    //由于超级终端反应较慢,有一个微小延迟
      WrUTXH0('\r');
    }
    while(!(rUTRSTAT0 & 0x2));    //等待知道THR变空
    //改动延时时间1--10
    Delay(10);
    rUTXH0 = data;
  } else  {
    if(data == '\n')
    {
      while(!(rUTRSTAT1 & 0x2));
      //改动延时时间1--10
      Delay(10);    //由于超级终端反应较慢,有一个微小延迟
      rUTXH1 = '\r';
    }
    while(!(rUTRSTAT1 & 0x2));    //等待知道THR变空
    //改动延时时间1--10
    Delay(10);
    rUTXH1 = data;
    } 
}

void PutStr(uint8 ch,char *pt)
{
    while(*pt)  PutChar(ch,*pt++);
}

void FlashNonCache(int n)
{
    static uint oldvalue;
    if (n) {
      oldvalue  = rNCACHBE0;
      rNCACHBE0 = 0x20000000;
    } else {
      rNCACHBE0 = oldvalue;
    }
}

void OutPut(uint8 ch,char *fmt,...)
{
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);


    PutStr(ch,string);
    va_end(ap);
}


void Output(char *fmt,...)
{
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    PutStr(UART,string);
    va_end(ap);
}


int NetInit()
{
  //
  // Reset MAC
  //
  *CPLDREG1 |= 0x20;
  Delay(500);
  *CPLDREG1 &= 0xDF;
  
  Delay(100);
  *(NETBASE+0x1e) = *(NETBASE+0x1e + 0x20);
  Delay(100);

  // Page 3 Set power status & msic
  //
  *(NETBASE+0x00) = 0xc1;
  *(NETBASE+0x20) = 0xc0;
  *(NETBASE+0x04) = 0x80;
  *(NETBASE+0x24) = 0x00;
  *(NETBASE+0x06) = 0x70;
  *(NETBASE+0x26) = 0xFF;


  //
  // Page 0 Write MAC 
  //
  *(NETBASE+0x00) = 0x21;

  *(NETBASE+0x20) = 0;
  *(NETBASE+0x02) = 0;
  *(NETBASE+0x22) = 0;
  *(NETBASE+0x04) = 0;
  *(NETBASE+0x24) = 0;
  *(NETBASE+0x06) = 0;
  *(NETBASE+0x26) = 0;
  *(NETBASE+0x08) = 0;
  *(NETBASE+0x28) = 0;
  *(NETBASE+0x0a) = 0;
  *(NETBASE+0x2a) = 0;
  *(NETBASE+0x0c) = 0xC4;
  *(NETBASE+0x2c) = 0xE0;
  *(NETBASE+0x0e) = 0xBC;
  *(NETBASE+0x2e) = 0x80;

  //
  // Page 1 Write MAC 
  //
  *(NETBASE+0x00) = 0x41;

  *(NETBASE+0x20) = ' ';
  *(NETBASE+0x02) = '4';
  *(NETBASE+0x22) = '4';
  *(NETBASE+0x04) = 'B';
  *(NETBASE+0x24) = '0';
  *(NETBASE+0x06) = 'X';

  *(NETBASE+0x26) = 0;

  *(NETBASE+0x08) = 0;
  *(NETBASE+0x28) = 0;
  *(NETBASE+0x0a) = 0;
  *(NETBASE+0x2a) = 0;
  *(NETBASE+0x0c) = 0;
  *(NETBASE+0x2c) = 0;
  *(NETBASE+0x0e) = 0;
  *(NETBASE+0x2e) = 0;

  *(NETBASE+0x00) = 0x22;
  return 1;
}

void BoardInit (void)
{   
  LedOut(0x10,1);
  rSYSCFG   = CACHECFG;      //8K  cache
  rNCACHBE0 = 0xc0002000;    //Disable I/O cache  
  ChangePllValue(PLLM, PLLP, PLLS);
  
  LedOut(0x11,1);
  PortInit();
  
  LedOut(0x12,1);
  IsrInit();
  
  LedOut(0x13,1);
  Uart0Init(0,115200);   
  Uart1Init(0,115200); 

  LedOut(0x14,1);
  LcdInit();

  LedOut(0x15,1);
  NetInit();
   
  LedOut(0x80,1);
}

void entercritical (void)
{
}

void exitcritical  (void)
{
}

⌨️ 快捷键说明

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