📄 system.c
字号:
#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 + -