📄 2410bios.c
字号:
#include "def.h"
#include "2410addr.h"
#include "2410lib.h"
#include "2410slib.h"
#include "mmu.h"
#include "uart.h"
#include "timer.h"
#include "39vf160.h"
#include "LCD_LTS350Q1_PE1.h"
U32 Console_Uart = 0;
U32 Console_Baud = 115200;
char boot_params[256];
static short DsAutoBoot;
static short NorFlashSupport;
//======================================================
void HaltUndef(void)
{
puts("Undefined instruction exception!!!\n");
// printf("Undefined instruction at 0x%08x!!!\n", addr);
// printf("0x%08x, 0x%08x\n", rSRCPND, rINTPND);
while(1);
}
void HaltSwi(void)
{
puts("SWI exception!!!\n");
while(1);
}
void HaltPabort(void)
{
puts("Pabort exception!!!\n");
while(1);
}
void HaltDabort(void)
{
puts("Dabort exception!!!\n");
while(1);
}
void Isr_Init(void)
{
pISR_UNDEF = (U32)HaltUndef;
pISR_SWI = (U32)HaltSwi;
pISR_PABORT = (U32)HaltPabort;
pISR_DABORT = (U32)HaltDabort;
rINTMOD = 0x0; // All=IRQ mode
rINTMSK = BIT_ALLMSK; // All interrupt is masked.
}
//==========================================================
extern U32 downloadAddress, downloadFileSize;
void call_linux(U32 a0, U32 a1, U32 a2);
void Test_Lcd_Tft_TX06D18(void);
void UsbMain(void);
void comdownload(void);
void NandWrite(void);
void NandLoadRun(void);
void NandErase(void);
void GetBootParam(void)
{
U16 cmd_cnt = 0;
char tmp[256] = {0};
puts("Set boot params, press Enter to finish, Esc to abort\n");
while(1) {
char c = getch();
if(c==0x1b)
return;
if(c==0xd)
break;
if((c==0x8)&&(cmd_cnt)) {
cmd_cnt -= 1;
tmp[cmd_cnt] = 0;
putch(c);
putch(' ');
putch(c);
}
else {
if(cmd_cnt<255) {
putch(c);
tmp[cmd_cnt++] = c;
tmp[cmd_cnt] = 0;
}
}
}
for(cmd_cnt=0; tmp[cmd_cnt]; cmd_cnt++)
boot_params[cmd_cnt] = tmp[cmd_cnt];
boot_params[cmd_cnt] = 0;
}
static __inline int RtcAlmWake(void)
{
return ((rBCDHOUR==rALMHOUR)&&(rBCDMIN==rALMMIN));
}
//inv-off时,CMPB为0时占空比最小,但仍有1个,与CNTB相等时则全输出0,比CNTB小1时占空比最大
//mode=0时,lvl为亮度百分比, mode=1时,lvl=1则亮度加10%,lvl=0则亮度减10%
void LcdBackLightCtl(U8 mode, U8 lvl)
{
/* static int BackLightVal = 101;
int r;
if(mode) {
r = BackLightVal;
r += lvl?10:-10;
} else
r = lvl;
if(r>100)
r = 100;
if(r<0)
r = 0;
if(r==BackLightVal)
return;
BackLightVal = r;
if(r==100)
r = 99; //most 990
if(r==0)
r = 100; //least 1000
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 2;
rTCFG0 &= ~0xff;
rTCFG0 |= 15; //prescaler = 15+1
rTCFG1 &= ~0xf;
rTCFG1 |= 2; //mux = 1/8
rTCNTB0 = 1000;
rTCMPB0 = r*10; //10 multiple
rTCON &= ~0x1f;
rTCON |= 0xb; //disable deadzone, auto-reload, inv-off, update TCNTB0&TCMPB0, start timer 0
rTCON &= ~2; //clear manual update bit
*/
rGPBCON &= ~3; //set GPB0 as tout0, pwm output
rGPBCON |= 1;
rGPBDAT &= ~1;
}
void LcdBackLightOff(void)
{
LcdBackLightCtl(0, 0);
rGPBCON &= ~3;
rGPBCON |= 1; //set GPB0 as output
rGPBDAT &= ~1; //output 0;
}
static int __inline PwrKeyWake(void)
{
int ret;
ret = rEINTPEND&(1<<11); //check if EINT15 is pending
rEINTPEND = ret; //clear pending
return ret;
}
static void PwrKeyChkInit(void)
{
/* rGPGCON &= ~0xfcf0;
rGPGCON |= 0xa000; //set GPG7 as EINT15, GPG2,3,5,6 as input
rGPGUP &= ~0x80; //GPG7 pull-up enable
rGPGUP |= 0x6c; //GPG2,3,5,6 pull-up disable
rGPBCON &= ~0xf000; //set GPB6,7 as input
rGPBUP |= 0xc0; //GPG6,7 pull-up disable
rGPECON &= ~0xfc00000;
rGPECON |= 0x4000000; //set GPE11,12 as input, GPE13 as output
rGPEUP |= 0x1800; //GPE11,12 pull-up disable
rGPEDAT &= ~0x2000; //GPE13 output lo*/
rGPGCON &= ~((3<<12)|(3<<4)|(3<<22)|(3<<6));
rGPGCON |= 2<<6; //set GPG3 as eint11
rGPGUP |= (1<<6)|(1<<2)|(1<<3); //GPG6,2,3 input, pull-up disable
rGPGUP &= ~(1<<3); //GPG3 input, pull-up enable
rGPECON &= ~((3<<26)|(3<<22));
rGPECON |= (1<<22); //GPE11 output
rGPEUP |= 1<<13; //GPE13 input pull-up disable
rGPEDAT &= ~(1<<13); //GPE11 output 0
rGPFCON &= ~((3<<4)|3);
rGPFUP |= (1<<2)|1;
}
static volatile int PwrKeyChkEnd;
//每10ms检测一次,每次读10次键,共测750ms,第一次跳过.
static void PwrKeyChk(U32 i)
{
static U16 chk_times = 75;
U32 cnt;
if(chk_times!=75) {
for(cnt=0; cnt<10; cnt++)
if(rGPGDAT&(1<<3)) {
PwrKeyChkEnd = -1;
return;
}
}
chk_times--;
if(!chk_times) {
PwrKeyChkEnd = 0;
ReleaseBiosTimerEvent(i);
}
}
//关闭所有IO口控制的电源,将不用的IO口设置为输入并禁止上拉
static void ConfigPowerOffGPIO(void)
{
//CAUTION:Follow the configuration order for setting the ports.
// 1) setting value(GPnDAT)
// 2) setting control register (GPnCON)
// 3) configure pull-up resistor(GPnUP)
//32bit data bus configuration
//*** PORT A GROUP
//Ports : GPA22 GPA21 GPA20 GPA19 GPA18 GPA17 GPA16 GPA15 GPA14 GPA13 GPA12
//Signal : nFCE nRSTOUT nFRE nFWE ALE CLE nGCS5 nGCS4 nGCS3 nGCS2 nGCS1
//Binary : 1 0 1 , 1 1 1 1 , 1 1 1 1
//Ports : GPA11 GPA10 GPA9 GPA8 GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
//Signal : ADDR26 ADDR25 ADDR24 ADDR23 ADDR22 ADDR21 ADDR20 ADDR19 ADDR18 ADDR17 ADDR16 ADDR0
//Binary : 1 1 1 1 , 1 1 1 1 , 1 1 1 0
rGPACON = 0x7fffff;
//**** PORT B GROUP
//Ports : GPB10 GPB9 GPB8 GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0
//Signal : nXDREQ0 nXDACK0 nXDREQ1 nXDACK1 nSS_KBD nDIS_OFF L3CLOCK L3DATA L3MODE nIrDATXDEN Keyboard
//Setting: INPUT OUTPUT INPUT OUTPUT INPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT OUTPUT
//Binary : 00 , 01 00 , 01 00 , 01 01 , 01 01 , 01 01
rGPBCON = 0x0;
rGPBUP = 0x7ff; // The pull up function is disabled GPB[10:0]
//*** PORT C GROUP
//Ports : GPC15 GPC14 GPC13 GPC12 GPC11 GPC10 GPC9 GPC8 GPC7 GPC6 GPC5 GPC4 GPC3 GPC2 GPC1 GPC0
//Signal : VD7 VD6 VD5 VD4 VD3 VD2 VD1 VD0 LCDVF2 LCDVF1 LCDVF0 VM VFRAME VLINE VCLK LEND
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10
rGPCCON = 0x0;
rGPCUP = 0xffff; // The pull up function is disabled GPC[15:0]
//*** PORT D GROUP
//Ports : GPD15 GPD14 GPD13 GPD12 GPD11 GPD10 GPD9 GPD8 GPD7 GPD6 GPD5 GPD4 GPD3 GPD2 GPD1 GPD0
//Signal : VD23 VD22 VD21 VD20 VD19 VD18 VD17 VD16 VD15 VD14 VD13 VD12 VD11 VD10 VD9 VD8
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 ,10 10
rGPDCON = 0x0;
rGPDUP = 0xffff; // The pull up function is disabled GPD[15:0]
//*** PORT E GROUP
//Ports : GPE15 GPE14 GPE13 GPE12 GPE11 GPE10 GPE9 GPE8 GPE7 GPE6 GPE5 GPE4
//Signal : IICSDA IICSCL SPICLK SPIMOSI SPIMISO SDDATA3 SDDATA2 SDDATA1 SDDATA0 SDCMD SDCLK I2SSDO
//Binary : 10 10 , 10 10 , 10 10 , 10 10 , 10 10 , 10 10 ,
//-------------------------------------------------------------------------------------------------------
//Ports : GPE3 GPE2 GPE1 GPE0
//Signal : I2SSDI CDCLK I2SSCLK I2SLRCK
//Binary : 10 10 , 10 10
rGPECON = 0x0;
rGPEUP = 0xffff; // The pull up function is disabled GPE[15:0]
//*** PORT F GROUP
//Ports : GPF7 GPF6 GPF5 GPF4 GPF3 GPF2 GPF1 GPF0
//Signal : nLED_8 nLED_4 nLED_2 nLED_1 nIRQ_PCMCIA EINT2 KBDINT EINT0
//Setting: Output Output Output Output EINT3 EINT2 EINT1 EINT0
//Binary : 01 01 , 01 01 , 10 10 , 10 10
rGPFCON = 0x0;
rGPFUP = 0xff; // The pull up function is disabled GPF[7:0]
//*** PORT G GROUP
//Ports : GPG15 GPG14 GPG13 GPG12 GPG11 GPG10 GPG9 GPG8 GPG7 GPG6
//Signal : nYPON YMON nXPON XMON EINT19 DMAMODE1 DMAMODE0 DMASTART KBDSPICLK KBDSPIMOSI
//Setting: nYPON YMON nXPON XMON EINT19 Output Output Output SPICLK1 SPIMOSI1
//Binary : 11 11 , 11 11 , 10 01 , 01 01 , 11 11
//-----------------------------------------------------------------------------------------
//Ports : GPG5 GPG4 GPG3 GPG2 GPG1 GPG0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -