?? init.c
字號(hào):
#include <s3c2410.h>#include <init.h>#include <mmu.h>/* SDRAM 13個(gè)寄存器的值 */ unsigned long const mem_cfg_val[]={ 0x22111110, //BWSCON 0x00000700, //BANKCON0 0x00000700, //BANKCON1 0x00000700, //BANKCON2 0x00000700, //BANKCON3 0x00000700, //BANKCON4 0x00000700, //BANKCON5 0x00018005, //BANKCON6 0x00018005, //BANKCON7 0x008e04f4, //REFRESH,HCLK=12MHz:0x008e07a3,HCLK=100MHz:0x008e04f4 0x000000b2, //BANKSIZE 0x00000030, //MRSRB6 0x00000030, //MRSRB7};/*上電后,WATCH DOG默認(rèn)是開(kāi)著的,要把它關(guān)掉 */void disable_watch_dog(void){ WTCON = 0;}/************************************************************************** * 設(shè)置控制SDRAM的13個(gè)寄存器* 含有數(shù)組的代碼,不是位置無(wú)關(guān)的,所以memsetup只能在連接位置執(zhí)行* 如果要使用位置無(wú)關(guān)代碼,請(qǐng)使用memsetup_2**************************************************************************/ void memsetup(void){ int i = 0; unsigned long *p = (unsigned long *)MEM_CTL_BASE; for(; i < 13; i++) p[i] = mem_cfg_val[i];}void memsetup_2(void){ unsigned long *p = (unsigned long *)MEM_CTL_BASE; p[0] = 0x22111110; //BWSCON p[1] = 0x00000700; //BANKCON0 p[2] = 0x00000700; //BANKCON1 p[3] = 0x00000700; //BANKCON2 p[4] = 0x00000700; //BANKCON3 p[5] = 0x00000700; //BANKCON4 p[6] = 0x00000700; //BANKCON5 p[7] = 0x00018005; //BANKCON6 p[8] = 0x00018005; //BANKCON7 p[9] = 0x008e04f4; //REFRESH,HCLK=12MHz:0x008e07a3,HCLK=100MHz:0x008e04f4 p[10] = 0x000000b2; //BANKSIZE p[11] = 0x00000030; //MRSRB6 p[12] = 0x00000030; //MRSRB7}/* 在第一次實(shí)用NAND Flash前,復(fù)位一下NAND Flash */void reset_nand(void){ int i=0; NFCONF &= ~0x800; for(; i<10; i++); NFCMD = 0xff; //reset command wait_idle();}/* 初始化NAND Flash */void init_nand(void){ NFCONF = 0xf830; reset_nand();}/************************************************************************** 以下讀NAND Flash的代碼來(lái)自mizi公司的bootloader vivi*************************************************************************/#define BUSY 1inline void wait_idle(void) { int i; while(!(NFSTAT & BUSY)) for(i=0; i<10; i++);}#define NAND_SECTOR_SIZE 512#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)/* low level nand read function */void nand_read_ll(unsigned char *buf, unsigned long start_addr, int size){ int i, j; if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) { return ; /* invalid alignment */ } /* chip Enable */ NFCONF &= ~0x800; for(i=0; i<10; i++); for(i=start_addr; i < (start_addr + size);) { /* READ0 */ NFCMD = 0; /* Write Address */ NFADDR = i & 0xff; NFADDR = (i >> 9) & 0xff; NFADDR = (i >> 17) & 0xff; NFADDR = (i >> 25) & 0xff; wait_idle(); for(j=0; j < NAND_SECTOR_SIZE; j++, i++) { *buf = (NFDATA & 0xff); buf++; } } /* chip Disable */ NFCONF |= 0x800; /* chip disable */ return ;}/**************************************************************************** 中斷向量起始虛擬地址為0xffff0000,段是1M對(duì)齊的,所以0xfff00000虛擬地址對(duì)應(yīng)* 0x33f00000(VECTORS_PHY_BASE),而虛擬地址0xffff0000則對(duì)應(yīng)0x33f00000+0xf0000***************************************************************************/void copy_vectors_from_nand_to_sdram(void){ nand_read_ll((unsigned char*)(VECTORS_PHY_BASE+0xf0000), 0x0, 512); }void copy_process_from_nand_to_sdram(void){ nand_read_ll((unsigned char*)PROCESS0_BASE, 0x0, 0x100000-16*1024);//進(jìn)程0空間為1M-16K頁(yè)表// nand_read_ll((unsigned char*)(0x30100000), 15*1024, 1024);// nand_read_ll((unsigned char*)PROCESS2_BASE, 0x8000, 1024); }#define EINT1 (2<<(1*2))#define EINT2 (2<<(2*2))#define EINT3 (2<<(3*2))#define EINT7 (2<<(7*2))void init_irq(void){// GPFCON |= EINT1 | EINT2 | EINT3 | EINT7;// GPFUP |= (1<<1) | (1<<2) | (1<<3) | (1<<7); // EINTMASK &= (~0x80); //EINT7使能// INTMSK &= (~0x1e); //EINT1-3、EINT7使能 INTMSK &= (~(1<<10)); //INT_TIMER0使能 // PRIORITY &= (~0x03); //設(shè)定優(yōu)先級(jí)}#define MPLL_200MHz (0x5c << 12)|(0x04 << 4)|(0x00)/**************************************************************************** 對(duì)于MPLLCON寄存器,[19:12]為MDIV,[9:4]為PDIV,[1:0]為SDIV* 有如下計(jì)算公式:* MPLL(FCLK) = (m * Fin)/(p * 2^s)* 其中: m = MDIV + 8, p = PDIV + 2* 對(duì)于本開(kāi)發(fā)板,F(xiàn)in = 12MHz,MPLLCON設(shè)為MPLL_200MHz,可以計(jì)算出FCLK=200MHz***************************************************************************/void clock_init(void){ LOCKTIME = 0x00ffffff; CLKDIVN = 0x03; /*FCLK:HCLK:PCLK=1:2:4, HDIVN1=0,HDIVN=1,PDIVN=1 */ /*If HDIVN = 1,the CPU bus mode has to be changed from the fast bus mode to the asynchronous bus mod using following instructions.*/__asm__( "mrc p15, 0, r1, c1, c0, 0\n" /* read ctrl register */ "orr r1, r1, #0xc0000000\n" /* Asynchronous */ "mcr p15, 0, r1, c1, c0, 0\n" /* write ctrl register */ ); MPLLCON = MPLL_200MHz; /*現(xiàn)在,F(xiàn)CLK=200MHz,HCLK=100MHz,PCLK=50MHz*/ }/************************************************************************** Timer input clock Frequency = PCLK / {prescaler value+1} / {divider value}* {prescaler value} = 0~255* {divider value} = 2, 4, 8, 16* 本實(shí)驗(yàn)的Timer0的時(shí)鐘頻率=50MHz/(49+1)/(16)=62500Hz* 設(shè)置Timer0 10ms觸發(fā)一次中斷:TCNTB0[15:0]=625*************************************************************************/void Timer0_init(void){ TCFG0 = 49; //Prescaler0 = 49 TCFG1 = 0x03; //Select MUX input for PWM Timer0:divider=16// TCNTB0 = 62; //1ms觸發(fā)一次中斷 TCNTB0 = 625; //10ms觸發(fā)一次中斷// TCNTB0 = 62500; //1s觸發(fā)一次中斷,用于調(diào)試 TCON |= (1<<1); //Timer 0 manual update TCON = 0x09; /*Timer 0 auto reload on Timer 0 output inverter off 清"Timer 0 manual update" Timer 0 start */}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -