#include "s3c2440.h" #include "option.h" #include "memcfg.h" extern unsigned long _sidata; extern unsigned long _sdata; extern unsigned long _edata; extern unsigned long _sbss; extern unsigned long _ebss; extern unsigned long _eheap; static int handler_stack[64]; #define STACK_TOP ((void*)handler_stack + sizeof(handler_stack)) register void *stack_pointer asm("sp"); void _start(void) __attribute__((noreturn, naked)); void _start(void) { register unsigned long *src, *dst; WTCON = 0; // watch dog disable INTMSK = 0xFFFFFFFF; // all interrupt disable INTSUBMSK = 0x7FFF; // all sub interrupt disable GPBCON = 0x15400; // outputs on LED pins, GPB[8:5] GPBUP = 0x7FF; // pullups disabled, GPB10..0 GPBDAT = 0x1E0; // LEDs off GPHCON = 0x00AAA0; // RXD2, TXD2, RXD1, TXD1, RXD0, TXD0 GPHUP = 0x7FF; // pullups disabled, GPH10..0 // To reduce PLL lock time, adjust the LOCKTIME register LOCKTIME = 0xFFFFFF; CLKDIVN = CLKDIV_VALUE(0, 2, 1); // udiv, hdiv, pdiv // if hdiv != 0 #if 1 asm( "mrc p15,0,r0,c1,c0,0\n" "orr r0,r0,#0xC0000000\n" "mcr p15,0,r0,c1,c0,0\n" ); #else asm( "mrc p15,0,r0,c1,c0,0\n" "bic r0,r0,#0xC0000000\n" "mcr p15,0,r0,c1,c0,0\n" ); #endif UPLLCON = PLL_VALUE(56, 2, 2); // 48MHz output with 12MHz input asm("nop\nnop\nnop\nnop\nnop\nnop\nnop\n"); MPLLCON = PLL_VALUE(M_MDIV, M_PDIV, M_SDIV); BWSCON = (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28)); BANKCON0 = ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC)); BANKCON1 = ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC)); BANKCON2 = ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC)); BANKCON3 = ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC)); BANKCON4 = ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC)); BANKCON5 = ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC)); BANKCON6 = ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)); BANKCON7 = ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)); REFRESH = ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+(Tchr<<16)+REFCNT); BANKSIZE = 0x32; //SCLK power saving mode, BANKSIZE 128M/128M MRSRB6 = 0x30; //MRSR6 CL=3clk MRSRB7 = 0x30; //MRSR7 CL=3clk src = &_sidata; dst = &_sdata; if(src != dst) while(dst < &_edata) *(dst++) = *(src++); dst = &_sbss; while(dst < &_ebss) *(dst++) = 0; stack_pointer = STACK_TOP; handler_stack[0] = handler_stack[1] = 0xDEADBEEF; unsigned long *block_start = &_ebss; *block_start++ = 0xDEADBEEF; *block_start++ = 0xDEADBEEF; unsigned long block_size = &_eheap - block_start; // add_malloc_block(block_start, block_size); main(); } void delay(unsigned long n) { volatile unsigned long x = n; while(x--) ; } void Uart_Init(int pclk,int baud) { int i; // if(pclk == 0) // pclk = PCLK; UFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disable UFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disable UFCON2 = 0x0; //UART channel 2 FIFO control register, FIFO disable UMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disable UMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable //UART0 ULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bits // [10] [9] [8] [7] [6] [5] [4] [3:2] [1:0] // Clock Sel, Tx Int, Rx Int, Rx Time Out, Rx err, Loop-back, Send break, Transmit Mode, Receive Mode // 0 1 0 , 0 1 0 0 , 01 01 // PCLK Level Pulse Disable Generate Normal Normal Interrupt or Polling UCON0 = 0x245; // Control register UBRDIV0=( (int)(pclk/8/baud +1) / 2 -1 ); //Baud rate divisior register 0 //UART1 ULCON1 = 0x3; UCON1 = 0x245; UBRDIV1=( (int)(pclk/8/baud +1) / 2 -1 ); //UART2 ULCON2 = 0x3; UCON2 = 0x245; UBRDIV2=( (int)(pclk/8/baud +1) / 2 -1 ); for(i=0;i<100;i++); } int main(void) { register unsigned int data; Uart_Init( 0,115200 ); data = 0x66; // GPBCON = 0x015550; // 0000 0001 0101 0101 0101 0000 GPBCON = 0x15400; // 0001 0101 0100 0000 0000 GPBUP = 0x7ff; // The pull up function is disabled GPB[10:0] // nLED1 GPB5 // nLED2 GPB6 // nLED3 GPB7 // nLED4 GPB8 data = 0; char *mode; int i; unsigned char key; unsigned long mpll_val = 0 ; //U32 divn_upll = 0 ; #if ADS10 // __rt_lib_init(); //for ADS 1.0 #endif // Port_Init(); // Isr_Init(); //400 key = 14; mpll_val = (92<<12)|(1<<4)|(1); //init FCLK=400M, so change MPLL first // ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3); // ChangeClockDivider(key, 12); // cal_cpu_bus_clk(); x: // GPBDAT = (GPBDAT & ~(0xf<<5)) | ((~data & 0xf)<<5); GPBDAT = 0x1E0; GPBDAT = 0x0; y: GPBDAT = ((data++)<<5) & 0x1E0; delay(4000); goto y; goto x; } void _exit(int x) { for(;;); }