Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3183
  • 博文数量: 6
  • 博客积分: 165
  • 博客等级: 入伍新兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-15 22:26
文章分类

全部博文(6)

文章存档

2011年(6)

我的朋友
最近访客

分类: 嵌入式

2011-10-23 15:51:22

    u-boot-1.1.6源码学习主要讲述和总结了本人在学习u-boot中的每个步骤,由于水平有限,难免有误,欢迎指正。
 
 
 (3)interrupt_init cpu/arm920t/s3c24x0/interrupt.c
 
      int interrupt_init (void)
     {
            S3C24X0_TIMERS * const timers = S3C24X0_GetBase_TIMERS();
 
                        /* use PWM Timer 4 because it has no output */
                        /* prescaler for Timer 4 is 16 */

            timers->TCFG0 = 0x0f00;
            if (timer_load_val == 0)         //  timer_load_val 在cpu/arm920t/s3c24x0/interrupt.c
           {
                               /*
                                   * for 10 ms clock period @ PCLK with 4 bit divider = 1/2
                                   * (default) and prescaler = 16. Should be 10390
                                  * @33.25MHz and 15625 @ 50 MHz
                             */

                 timer_load_val = get_PCLK()/(2 * 16 * 100);
           }
                       /* load value for 10 ms timeout */
           lastdec = timers->TCNTB4 = timer_load_val;
                          /* auto load, manual update of Timer 4 */
           timers->TCON = (timers->TCON & ~0x0700000) | 0x600000;
                          /* auto load, start Timer 4 */
           timers->TCON = (timers->TCON & ~0x0700000) | 0x500000;
           timestamp = 0;
           return (0);
     }
 
         对着datasheet来看这个函数, 实际上这个函数使用timer4来作为系统clock, 即时钟滴答,10ms一次,到点就产生一个中断,但由于此时中断还没打开所以这个中断不会响应。
 
    <1> 结构体S3C24X0_CLOCK_POWER定义在include/s3c24x0.h
    typedef struct {
         S3C24X0_REG32 TCFG0;
         S3C24X0_REG32 TCFG1;
         S3C24X0_REG32 TCON;
         S3C24X0_TIMER ch[4];
         S3C24X0_REG32 TCNTB4;
         S3C24X0_REG32 TCNTO4;
     } S3C24X0_TIMERS;
 
 
     <2> 函数S3C24X0_GetBase_TIMERS() include/s3c2410.h中定义

static inline S3C24X0_TIMERS * const S3C24X0_GetBase_TIMERS(void)
{
 return (S3C24X0_TIMERS * const)S3C24X0_TIMER_BASE;
}

     S3C24X0_TIMER_BASE 也在 include/s3c2410.h中定义

     #define S3C24X0_TIMER_BASE  0x51000000

 

    <3>函数 get_PCLK()cpu/arm920t/s3c24x0/speed.c

static ulong get_PLLCLK(int  pllreg)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    ulong r, m, p, s;

    if (pllreg == MPLL)
               r = clk_power->MPLLCON;
    else if (pllreg == UPLL)
              r = clk_power->UPLLCON;
    else
              hang();           //执行失败就down,实际上就是一个死循环

    m = ((r & 0xFF000) >> 12) + 8;
    p = ((r & 0x003F0) >> 4) + 2;
    s = r & 0x3;

    return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
}

            /* return FCLK frequency */
ulong get_FCLK(void)
{
    return(get_PLLCLK(MPLL));
}

                /* return HCLK frequency */
ulong get_HCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

    return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
}

                     /* return PCLK frequency */
ulong get_PCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

    return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK());
}

                      /* return UCLK frequency */
ulong get_UCLK(void)
{
    return(get_PLLCLK(UPLL));
}

 

   <4>函数 hang() lib_arm/board.c

void hang (void)
{
 puts ("### ERROR ### Please RESET the board ###\n");
 for (;;);
}

 

(4)env_init common/env_flash.c

int  env_init(void)
{
#ifdef CONFIG_OMAP2420H4
      int flash_probe(void);

      if(flash_probe() == 0)
              goto bad_flash;

#endif
   if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc)
{
            gd->env_addr  = (ulong)&(env_ptr->data);
            gd->env_valid = 1;
            return(0);
 }
#ifdef CONFIG_OMAP2420H4
           bad_flash:
#endif
 gd->env_addr  = (ulong)&default_environment[0];
 gd->env_valid = 0;
 return (0);
}

          这个函数主要是在gd里保存环境变量的存放地址。一般使用默认的环境变量值即default_environment数组

  <1> crc32()

阅读(117) | 评论(0) | 转发(0) |
0

上一篇:u-boot-1.1.6源码学习(5)

下一篇:没有了

给主人留下些什么吧!~~