Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4524648
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-04-16 13:46:12

参考资料:

移植u-boot2009.08到OK2440V3开发板(2)---在SDRAM中运行 

u-boot-2011.03在TQ2440上的移植(2)--初始化时钟嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一)

1环境说明:

主机:ubuntu10.10
     交叉编译:arm-linux-gcc 4.5.1
     开发板文件系统:root-2.6.33-qt.tar.bz2 打包好的
     开发板内核    :linux-2.6.33-qt.tar.bz2
     开发板:TQ2440 nandflash 256MB 东华3.5寸屏
     uboot源码:   u-boot-2010.06-rc1.tar.bz2

     CPU:            S3C2440
     SDRAM:          48LC16M16A    64MB
     NOR FLASH       EN29LV160AB   2MB
     FLASH           K9F2G08UDA    256MB




2.

u-bootstage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;

                     arch/arm/cpu/arm920t/start.S

u-bootstage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。
                     board/samsung/smdk2440/smdk2440.c
                    
3、在include/configs/smdk2440.h头文件中添加CONFIG_S3C2440宏
vi include/configs/smdk2440.h 在第40行添加
#define CONFIG_S3C2440 1

4、增加对S3C2440的支持 修改 SDRAM配置
gedit board/sumsung/smdk2440/lowlevel_init.S 在文件54行

#define B1_BWSCON        (DW16)//(DW32) IDE
#define B2_BWSCON        (DW16)
#define B3_BWSCON        (DW16 + WAIT + UBLB)
#define B4_BWSCON        (DW16)
#define B5_BWSCON        (DW8)//(DW16)
#define B6_BWSCON        (DW32)
#define B7_BWSCON        (DW32)

修改 lowlevel_init.S 文件第 126 行,设置为100MHZ

#define REFCNT            0x4F4  //100MHZ
                          //1113    /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */

5、stage1阶段的硬件设备初始化。
vi arch/arm/cpu/arm920t/start.S
去掉117,118行点亮AT91RM9200DK系列LED的代码
/*
bl coloured_LED_init
bl red_LED_on
*/
 这里也可以加入 自己 LED支持 参考:http://www.cublog.cn/u3/101649/showart.php?id=2105215

  1. 接下来,加入自己的LED 支持

  2.    /*bl coloured_LED_init //这两行是AT91RM9200DK开发板的LED初始化,注释掉
  3.     bl red_LED_on*/

  4.   添加如下:

  5. #if defined(CONFIG_S3C2440) //区别与其他开发板

  6. //根据TQ2440原理图可知LED分别由S3C2440的PB5、6、7、8口来控制,以下是PB端口寄存器基地址(查2440的DataSheet得知)
  7. #define GPBCON 0x56000010
  8. #define GPBDAT 0x56000014
  9. #define GPBUP 0x56000018

  10.     //以下对寄存器的操作参照S3C2440的DataSheet进行操作
  11.     ldr r0, =GPBUP
  12.     ldr r1, =0x7FF //即:二进制11111111111,关闭PB口上拉
  13.     str r1, [r0]

  14.     ldr r0, =GPBCON //配置PB5、6、7、8为输出口,对应PBCON寄存器的第10-17位
  15.     ldr r1, =0x154FD //即:二进制010101010011111101
  16.     str r1, [r0]

  17.     ldr r0, =GPBDAT
  18.     ldr r1, =0x1C0 //即:二进制111000000,PB5设为低电平,6、7、8为高电平
  19.     str r1, [r0]

  20. #endif

  21. //此段代码使u-boot启动后,点亮开发板上的LED1,LED2、LED3、LED4不亮


6、在u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设置部分
这里参考:http://www.52rd.com/blog/Detail_RD.Blog_liweikui_22249.html
arch/arm/cpu/arm920t/start.S           我把修改过的start.S  start.rar  

  1. #ifdef CONFIG_S3C24X0
  2.     /* turn off the watchdog */

  3. # if defined(CONFIG_S3C2400)
  4. # define pWTCON    0x15300000
  5. # define INTMSK    0x14400008    /* Interupt-Controller base addresses */
  6. # define CLKDIVN    0x14800014    /* clock divisor register */
  7. #else
  8. /*2410 和 2440 的寄存器地址是一致的,所以不需要修改*/
  9. # define pWTCON    0x53000000
  10. # define INTMSK    0x4A000008    /* Interupt-Controller base addresses */
  11. # define INTSUBMSK    0x4A00001C
  12. # define CLKDIVN    0x4C000014    /* clock divisor register */
  13. # endif

  14.     ldr    r0, =pWTCON
  15.     mov    r1, #0x0
  16.     str    r1, [r0]

  17.     /*
  18.      * mask all IRQs by setting all bits in the INTMR - default
  19.      */
  20.     mov    r1, #0xffffffff
  21.     ldr    r0, =INTMSK
  22.     str    r1, [r0]
  23. # if defined(CONFIG_S3C2410)
  24.     ldr    r1, =0x3ff
  25.     ldr    r0, =INTSUBMSK
  26.     str    r1, [r0]
  27. # endif
  28. # if defined(CONFIG_S3C2440)//添加s3c2440的中断禁止部分
  29.     ldr r1, =0x7fff //根据2440芯片手册,INTSUBMSK寄存器有15位可用

  30.     ldr r0, =INTSUBMSK
  31.     str r1, [r0]
  32. # endif

  33. # if defined(CONFIG_S3C2440) //添加s3c2440的时钟部分
  34. # define LOCKTIME 0x4C000000
  35. #define MPLLCON 0x4C000004 //系统主频配置寄存器基地址

  36. #define UPLLCON 0x4C000008 //USB时钟频率配置寄存器基地址
  37. # define CAMDIVN 0x4C000018
  38.    //locktime用来在正常运行时更改时钟的时候保护时钟  ####注意这里
  39.        ldr r0,=LOCKTIME
  40.        mov r1,#0xffffff
  41.        str r1,[r0]

  42.          //清除摄像头分频寄存器值,这个值会影响HCLK
  43.        ldr r0,=CAMDIVN
  44.        mov r1,#0
  45.        str r1,[r0]
  46. /***************/
              
  1.     ldr r0, =CLKDIVN //设置分频系数FCLK:HCLK:PCLK = 1:4:8
  2.     mov r1, #5
  3.     str r1, [r0]

  4.  //在2440的手册中写着若HDIVN不为0,则需要下面几句
  5.        mrc p15, 0, r1, c1, c0, 0 //read ctrl register
  6.        orr r1, r1, #0xc0000000 //Asynchronous
  7.        mcr p15, 0, r1, c1, c0, 0 //write ctrl register

  1.  
  2.    ldr r0, =UPLLCON //设置USB时钟频率为48MHz

  3.     ldr r1, =0x38022 //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分

  4.     str r1, [r0]

  5. //arm920t为5级流水线,延迟几个周期,使指令生效
  6.        nop
  7.        nop
  8.        nop
  9.        nop
  10.        nop
  11.        nop
  12.        nop
  13.        nop
  14.                             //大于 400 MHZ 容易死机
  15.     ldr r0, =MPLLCON //设置系统主频为400MHz   我自己设置主频 为 400MHZ  

  16.     ldr r1, =0x5C011 //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分

  17.     str r1, [r0]



  18.  

  19. # else

  20.     /* FCLK:HCLK:PCLK = 1:2:4 */
  21.     /* default FCLK is 120 MHz ! */
  22.     ldr    r0, =CLKDIVN
  23.     mov    r1, #3
  24.     str    r1, [r0]
  25. #endif         注意这里还有一个 #endif

  26. #endif    /* CONFIG_S3C24X0 */



 
7、S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/smdk2440/smdk2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下:
vi board/samsung/smdk2440/smdk2440.c
时钟部分修改第34行和在45行添加如下红色部分
#define FCLK_SPEED 2       //设置默认等于2,即下面红色代码部分有效
#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
#elif FCLK_SPEED==2        /* Fout = 400MHz */
#define M_MDIV    0x5C     //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define M_PDIV    0x1
#define M_SDIV    0x1

#endif
 
USB时钟部分修改第51行和在61行添加如下红色部分
#define USB_CLOCK 2        //设置默认等于2,即下面红色代码部分有效
#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
#elif USB_CLOCK==2         /* Fout = 48MHz */
#define U_M_MDIV    0x38   //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define U_M_PDIV    0x2
#define U_M_SDIV    0x2
#endif
8、vi arch/arm/cpu/arm920t/s3c24x0/speed.c //根据设置的分频系数FCLK:HCLK:PCLK = 1:4:8修改获取时钟频率的函数

get_PLLCLK函数修改第66行如下
 
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();
    m = ((r & 0xFF000) >> 12) + 8;
    p = ((r & 0x003F0) >> 4) + 2;
    s = r & 0x3;

#if defined(CONFIG_S3C2440)
    if(pllreg == MPLL)
    {   //参考S3C2440芯片手册上的公式:PLL=(2 * m * Fin)/(p * 2s)
        return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
    }
#endif

    return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
}
 
修改84行get_HCLK函数为

/* return HCLK frequency */
ulong get_HCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
#if defined(CONFIG_S3C2440)
    return(get_FCLK()/4);
#endif
    return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
}

9.
此,对s3c2440的支持(时钟配置部分)就算做好了,为了方便调试,可以利用开发板自带的u-boot文件烧写到内存中运行,此时还要修改一些配置:

修改arch/arm/cpu/arm920t/start.S文件的177行如下:

gedit  arch/arm/cpu/arm920t/start.S

177行:

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

         /* bl  cpu_init_crit */

#endif


10.修改 0x33000000 
  gedit board/samsung/smdk2440/config.mk
为了调试方便
     TEXT_BASE = 0x33000000   修改为红色的
     #TEXT_BASE = 0x33F80000
而且,使用DNW下载时,将地址设置为 0x33000000

  错误:在处理过程中,我设置
TEXT_BASE = 0x30000000 ,经 DNW的地址也设置为 0x30000000,但是最后出错了,我把它修改为 0x33000000 ,就可以了。?????



10.
make mrproper
make smdk2440_config
make all

11.
  1. [7] Download Program (uCOS-II or TQ2440_Test) to SDRAM and Run it
  2. [8] Boot the system
  3. [9] Format the Nand Flash
  4. [0] Set the boot parameters
  5. [a] Download User Program (eg: uCOS-II or TQ2440_Test)
  6. [b] Download LOGO Picture (.bin) to Nand Flash
  7. [l] Set LCD Parameters
  8. [o] Download u-boot to Nor Flash
  9. [r] Reboot u-boot
  10. [t] Test Linux Image (zImage)
  11. [q] quit from menu
  12. Enter your selection: 7
  13. USB host is connected. Waiting a download.

  14. Now, Downloading [ADDRESS:33000000h,TOTAL:98790]
  15. RECEIVED FILE SIZE: 98790 (96KB/S, 1S)
  16. ## Starting application at 0x33000000 ...

  17. U-Boot 2010.06-rc1 ( 4鏈?16 2011 - 13:24:25)

  18. DRAM: 64 MiB
  19. Flash: 512 KiB
  20. *** Warning - bad CRC, using default environment

  21. In: serial
  22. Out: serial
  23. Err: serial
  24. Net: CS8900-0
  25. SMDK2410 #







                   
阅读(1475) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~