U-BOOT分析(smdk2410.c)

 

 

#include

#include

 

DECLARE_GLOBAL_DATA_PTR;

 

#define FCLK_SPEED 1

 

#if FCLK_SPEED==0          /* Fout = 203MHz, Fin = 12MHz for Audio */

#define M_MDIV   0xC3

#define M_PDIV    0x4

#define M_SDIV    0x1

#elif FCLK_SPEED==1              /* Fout = 202.8MHz */

#define M_MDIV   0xA1

#define M_PDIV    0x3

#define M_SDIV    0x1

#endif

 

#define USB_CLOCK 1

 

#if USB_CLOCK==0

#define U_M_MDIV     0xA1

#define U_M_PDIV      0x3

#define U_M_SDIV      0x1

#elif USB_CLOCK==1

#define U_M_MDIV     0x48

#define U_M_PDIV      0x3

#define U_M_SDIV      0x2

#endif

*******************************************************************************

向MDIV、PDIV和SDIV三个寄存器分别装值,设置分频系数,不同的频率对应不同的数值

 

*******************************************************************************

 

static inline void delay (unsigned long loops)

{

       __asm__ volatile ("1:\n"

         "subs %0, %1, #1\n"

         "bne 1b":"=r" (loops):"0" (loops));

}

 

/*

 * Miscellaneous platform dependent initialisations

 */

 

int board_init (void)

{

       S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

       S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

*******************************************************************************

将时间相关的寄存器定义为结构体S3C24X0_CLOCK_POWER,S3C24X0_GPIO也是一样

 

*******************************************************************************

 

       /* to reduce PLL lock time, adjust the LOCKTIME register */

       clk_power->LOCKTIME = 0xFFFFFF; 重新启动PLL的LOCKTIME

 

       /* configure MPLL */

       clk_power->MPLLCON = ((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV);

 

       /* some delay between MPLL and UPLL */

       delay (4000);

 

       /* configure UPLL */

       clk_power->UPLLCON = ((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV);

 

       /* some delay between MPLL and UPLL */

       delay (8000);

*******************************************************************************

设置 CPU时钟

 

*******************************************************************************

 

       /* set up the I/O ports设置GPIO */

       gpio->GPACON = 0x007FFFFF;

       gpio->GPBCON = 0x00044555;

       gpio->GPBUP = 0x000007FF;

       gpio->GPCCON = 0xAAAAAAAA;

       gpio->GPCUP = 0x0000FFFF;

       gpio->GPDCON = 0xAAAAAAAA;

       gpio->GPDUP = 0x0000FFFF;

       gpio->GPECON = 0xAAAAAAAA;

       gpio->GPEUP = 0x0000FFFF;

       gpio->GPFCON = 0x000055AA;

       gpio->GPFUP = 0x000000FF;

       gpio->GPGCON = 0xFF95FFBA;

       gpio->GPGUP = 0x0000FFFF;

       gpio->GPHCON = 0x002AFAAA;

       gpio->GPHUP = 0x000007FF;

 

       /* arch number of SMDK2410-Board */

       gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

 

       /* adress of boot parameters */

       gd->bd->bi_boot_params = 0x30000100;

*******************************************************************************

 ;初始化bd结构体中的bi_arch_number和bi_boot_params

 

*******************************************************************************

       icache_enable();

       dcache_enable();

*******************************************************************************

 ;启用指令和数据cache
 ;通过对协处理器的操作了实现cache的使能

*******************************************************************************

 

       return 0;

}

 

int dram_init (void)      动态随机存储器初始化

{

       gd->bd->bi_dram[0].start = PHYS_SDRAM_1;

       gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE;

 

       return 0;

}

 

 

你可能感兴趣的:(嵌入式,Bootloader)