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

📄 system.c

📁 An complete pmp solution for mattel juicebox player. Using crossworks for arm.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "system.h"


#define DISPOFF    8
#define LCDOFF    13
#define PORT_LCD  *pdatc

/*===========================================================*/
/*-----                     System                      -----*/
void wCPUInit()
{
    /* Set clock rate to 66.428MHz, just in case the JB has
       it set wrong 0x00034031
    */
    
   *pllcon = 0x00036031;//
   //*pllcon=0x0003A041;

    /* Be sure we're in cacheable memory
       Can the framebuffer be in cache too?
 */
  
  *((long*) 0x01c00000)= 0x0000000E;
  *((long*) 0x01c00004)= 0xC0000020;
  *((long*) 0x01c00008)= 0xC140C000;
  *((long*) 0x01c40000)= 0x80001B1B;
  *((long*) 0x01c80000)= 0x11000002;
  *((long*) 0x01c80004)= 0x00000600;
  *((long*) 0x01c8001c)= 0x00018000;
  *((long*) 0x01c80020)= 0x00018000;
  *((long*) 0x01c80024)= 0x0082062B;
  *((long*) 0x01c80028)= 0x00000016;
  *((long*) 0x01c8002c)= 0x00000020;
  *((long*) 0x01c80030)= 0x00000020;
  

    *ncachbe0=0x80002000;
    *ncachbe1=0x00000000;

    *pcona = 0x000003FF;
    *pconb = 0x000007FF;
    *pconc = 0xF555FFCF;
    PORT_LCD |= (1 << LCDOFF);
    *pupc = 0x00000600;
    *pcond = 0x0000AAAA;
    *pupd = 0x000000FF;
    *pcone = 0x0002AA80;
    *pupe = 0x000000F8;
    *pconf = 0x001B6CE5;
	*pdatf &= 0xFFFFFFFC;
	//*pdatf |= 0x00000003;
    *pupf = 0x000001E3;
    *pcong = 0x0000FFFF;
    *pupg = 0x00000000;
    *spucr = 0x00000007;

    *intcon = 0x00000000;
    *wtcon = 0x00000000;
    
    *tcon = 0x00000000;
    *tcfg0 = 0x00020202;
    *tcfg1 = 0x00111111;
    

    *tcntb1 = 0x00000A00;
    *tcntb2 = 0x00000A00;
    *tcmpb1 = 0x000009FF;
    *tcmpb2 = 0x00000003;
    
    *tcon = 0x00002200;
    *tcon = 0x00009900;
    wMallocInit(uCRamSize, uCRamStart);
    FatFs = wMalloc(sizeof(FATFS));
}
//-------------------------------------------------------------
void wDelayMs(u32 delay)
{
    /* Delay hand tuned for use with 66.428MHz clock
       (PLLCON = 0x55051, PLL reference of 10MHz).
       Assumes code is running from cached memory.
       fixme: use a hardware timer instead.
    */

    u32 ms;
    u32 i;
    for (ms=0; ms<delay; ms++)
        for (i=13000; i>0; i--)
            asm("NOP");
}
//-------------------------------------------------------------
void wDelayCycles(u32 delay)
{
  u32 i;
  for (i = 0; i<delay/4; i++);
  
}
/*===========================================================*/
/*-----                   Interrupts                    -----*/

void wInterruptInit()
{
  *intcon = 0x00000006;
  *intmsk = 0x03FFFFFF;
}
//------------------------------------------------------------
void wInterruptHandlerInit (u32 uxInterrupt, void *vFunction)
{
  switch (uxInterrupt)
    {
    case portIntADC:      	{ HandlerADC = vFunction; return; }       
    case portIntRTC:		{ HandlerRTC = vFunction; return; }   
    case portIntUTXD1:    	{ HandlerUTXD1 = vFunction; return; }    
    case portIntUTXD0:     	{ HandlerUTXD0 = vFunction; return; }     
    case portIntSIO:       	{ HandlerSIO = vFunction; return; }       
    case portIntIIC:       	{ HandlerIIC = vFunction; return; }       
    case portIntURXD1:     	{ HandlerURXD1 = vFunction; return; }     
    case portIntURXD0:     	{ HandlerURXD0 = vFunction; return; }     
    case portIntTIMER5:    	{ HandlerTIMER5 = vFunction; return; }    
    case portIntTIMER4:    	{ HandlerTIMER4 = vFunction; return; }    
    case portIntTIMER3:    	{ HandlerTIMER3 = vFunction; return; }    
    case portIntTIMER2:    	{ HandlerTIMER2 = vFunction; return; }    
    case portIntTIMER1:    	{ HandlerTIMER1 = vFunction; return; }    
    case portIntTIMER0:    	{ HandlerTIMER0 = vFunction; return; }    
    case portIntUERR01:    	{ HandlerUERR01 = vFunction; return; }    
    case portIntWDT:       	{ HandlerWDT = vFunction; return; }       
    case portIntBDMA1:     	{ HandlerBDMA1 = vFunction; return; }     
    case portIntBDMA0:     	{ HandlerBDMA0 = vFunction; return; }     
    case portIntZDMA1:     	{ HandlerZDMA1 = vFunction; return; }     
    case portIntZDMA0:     	{ HandlerZDMA0 = vFunction; return; }     
    case portIntTICK:     	{ HandlerTICK = vFunction; return; }     
    case portIntEINT4567:  	{ HandlerEINT4567 = vFunction; return; }  
    case portIntEINT3:     	{ HandlerEINT3 = vFunction; return; }     
    case portIntEINT2:     	{ HandlerEINT2 = vFunction; return; }     
    case portIntEINT1:     	{ HandlerEINT1 = vFunction; return; }     
    case portIntEINT0:	    { HandlerEINT0 = vFunction; return; }
    
    }
}
//--------------------------------------------------------------
void wInterruptGenericHandlerInit (u32 uxInterrupt, void *vFunction)
{
  switch (uxInterrupt)
    {
    case portIntSWI:      	{ aHandlerSWI = vFunction; return; }       
    case portIntIRQ:		{ aHandlerIRQ = vFunction; return; }   
    case portIntFIQ:    	{ aHandlerFIQ = vFunction; return; }    
    }
}
/*===========================================================*/
/*-----                 Timers                          -----*/


//-----------------------------------------------------------------------

void wTimersInit (u32 ulPrescaler01, u32 ulPrescaler23, u32 ulPrescaler45, u32 ulDeadzone)
{
  *tcon = 0x00000000;
  ulPrescaler01 |= (ulPrescaler23 << 8) | (ulPrescaler45 << 16) | (ulDeadzone << 24);
  *tcfg0 = ulPrescaler01;
}

//-----------------------------------------------------------------------

void wTimerConf (xTPortHardware xTimer, u32 ulSource, u32 ulCount, u32 ulCompare)
{
  u32 ulShift = 4 * xTimer;
  dwConfigReg (tcfg1, ulSource, ulShift, 4);
  ulShift *= 3;
  *(tcntb0 + ulShift) = ulCount;
  if (xTimer != portTimer5)
    *(tcmpb0 + ulShift) = ulCompare;
}

//-----------------------------------------------------------------------

void wTimerRun (xTPortHardware xTimer, u32 uxSettings)
{
  u32 ulShift;
  if (xTimer != portTimer0) ulShift = xTimer*4 + 4;
    else ulShift = 0;
  if ((uxSettings&0x70) != 0x70)
    dwConfigReg ( tcon, uxSettings>>4, 24, 3);  
  dwConfigReg ( tcon, 0x2, ulShift, 4);
  dwConfigReg ( tcon, 0x1| (uxSettings <<2), ulShift, 5);
}

//-----------------------------------------------------------------------

void wTimerStop (xTPortHardware xTimer)
{
  u32 ulShift;
  if (xTimer != portTimer0) ulShift = xTimer*4 + 4;
    else ulShift = 0;
  dwConfigReg ( tcon, 0x0, ulShift, 2);
}

/*===========================================================*/
/*-----                     DMA                         -----*/

xTPortHardware wZDMARun (void *pvSrc, void *pvDest, u32 uxSettings, void *pvInterrupt)
{
  u32 ulShift;
  {
  if       ((*zdcon0 & 0x30) == 0x00) ulShift = 0;
  else if ((*zdcon1 & 0x30) == 0x00) ulShift = 0x20>>2;
  else return portNoHW;
  }
  
  u32 ulCountReg = 0xA0C00000;
  if ((uxSettings & 0xC0000000) == 0xC0000000)
    {
    uxSettings &= 0xBFFFFFFF;
    ulCountReg |= 0x08000000;
    }
    else ulCountReg |= 0x04000000;
  
  *(zdicnt0 + ulShift) = 0xA0000000 | (uxSettings & 0x002FFFFF);
  *(zdisrc0 + ulShift) = (uxSettings & 0xF0000000) | (u32)pvSrc;
  *(zdides0 + ulShift) = 0xA0000000 | ((uxSettings & 0x0C000000) << 2) | (u32)pvDest;
  
  if (pvInterrupt)
    {
    if (ulShift) 
      { 
      wInterruptHandlerInit (portIntZDMA1, pvInterrupt); 
      dwInterruptEnable (portIntZDMA1);
      }
     else
      { 
      wInterruptHandlerInit (portIntZDMA0, pvInterrupt); 
      dwInterruptEnable (portIntZDMA0);
      }
    }
  *(zdicnt0 + ulShift) |= 0x00100000;
  *(zdcon0 + ulShift) |= 0x01;
  if (ulShift) return portZDMA1;
         else return portZDMA0;
}

/*

  uxSettings:
        |         ZDMA              |        BDMA             |
==============================================================
31-30   |  Data size:
        |  00:byte; 
        |  01:half; 
        |  10:word; 
        |  11:4-word block          |  Unused
--------------------------------------------------------------
29-28   |  Load direction: 
        |  01: increment; 
        |  10: decrement;
        |  11: fixed
--------------------------------------------------------------
27-26   |  Store direction:
        |  01: increment; 
        |  10: decrement;
        |  11: fixed
--------------------------------------------------------------
25-24   |  Unused                   |  Request source
--------------------------------------------------------------
....
--------------------------------------------------------------
21      |  Unused (Auto reload)     |  Auto reload
--------------------------------------------------------------
....

⌨️ 快捷键说明

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