首页 > 代码库 > (一)建立项目 修改时钟

(一)建立项目 修改时钟

一、启动流程

技术分享 

 二、建立项目 

        解压源码,进入目录:

#tar xjvf u-boot-2010.06.tar.bz2
#cd u-boot-2010.06/board/samsung/

建立mini2440 文件夹:

#mkdir mini2440
2440 和2410 的模板复制
#cp -rf smdk2410/* mini2440 <—将2410 下所有的代码复制到2440 下
#cd mini2440
#mv smdk2410.c mini2440.c < 改名mini2440.c
  修改mini2440 下Makefile 的第28 行
COBJS := mini2440.o flash.o <改名为mni2440.o
  建立mini2440 头文件
#cd ../../../include/configs
#cp -rf smdk2410.h mini2440.h
  修改U-BOOT 根目录下的Makefile 文件:
修改第159行为:
CROSS_COMPILE ?=arm-linux- <—指定交叉编译器
第3053行添加: 
mini2440_config :  unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0
arm:CPU的架构(ARCH)
arm920t:CPU的类型
TX2440 :对应在board目录下建立新的开发板项目的目录
samsung: 新开发板项目的上级目录, 如直接在board下建立新的开发板项目, 则这里应为NULL
s3c24x0:CPU型号
注意:编译选项格式的第二行要用Tab

 

测试编译新建的mini2440 开发板项目:
#make mini2440_config
如果出现Configuring for mini2440 board...则表示设置正确
#make
编译后在根目录下会出现u-boot.bin文件,则u-boot移植的第一步就算完成了

 

三、修改时钟和中断

u-boot 第一个要运行的程序arch/arm/cpu/arm920t/start.S  

 1、 屏蔽AT91RM9200使用的LED代码

  1. mrs r0, cpsr  
  2. bic r0, r0, #0x1f  
  3. orr r0, r0, #0xd3  
  4. msr cpsr, r0  
  5. /*bl coloured_LED_init  
  6. bl red_LED_on*/

 2、 添加CPU频率初始化设置

  1. # define pWTCON 0x53000000  
  2. # define INTMSK  0x4A000008  /* Interupt-Controller base addresses */  
  3. # define INTSUBMSK  0x4A00001C  
  4. # define CLKDIVN 0x4C000014 /* clock divisor register */  
  5. # endif  
  6. #define CLK_CTL_BASE  0x4C000000  
  7. #define MDIV_405 0x7f << 12  
  8. #define PSDIV_405 0x21  
  9. #define MDIV_200 0xa1 << 12  
  10. #define PSDIV_200 0x3 

 3、 添加中断禁止部分:

  1. # if defined(CONFIG_S3C2410)  
  2. ldr r1, =0x3ff  
  3. ldr r0, =INTSUBMSK  
  4. str r1, [r0]  
  5. # endif  
  6. # if defined(CONFIG_S3C2440)  
  7. ldr r1, =0x7fff  
  8. ldr r0, =INTSUBMSK  
  9. str r1, [r0]  
  10. # endif 

 4、 修改时钟设置(2440的主频为405MHz)

  1. #if defined(CONFIG_S3C2440)  
  2. /* FCLK:HCLK:PCLK = 1:4:8 */  
  3. ldr r0, =CLKDIVN  
  4. mov  r1, #5  
  5. str r1, [r0]  

  6. mrc p15, 0, r1, c1, c0, 0  
  7. orr r1, r1, #0xc0000000  
  8. mcr p15, 0, r1, c1, c0, 0 
  9.  
  10. mov  r1, #CLK_CTL_BASE   
  11. mov  r2, #MDIV_405  
  12. add r2, r2, #PSDIV_405  
  13. str r2, [r1, #0x04]  /* MPLLCON */  
  14. #else  
  15. /* FCLK:HCLK:PCLK = 1:2:4 */  
  16. /* default FCLK is 120 MHz ! */  
  17. ldr r0, =CLKDIVN  
  18. mov  r1, #3  
  19. str r1, [r0]  
  20. mrc p15, 0, r1, c1, c0, 0  
  21. orr r1, r1, #0xc0000000  
  22. mcr p15, 0, r1, c1, c0, 0  
  23. mov  r1, #CLK_CTL_BASE   
  24. mov  r2, #MDIV_200  
  25. add r2, r2, #PSDIV_200  
  26. str r2, [r1, #0x04]  
  27. #endif  
  28. #endif /* CONFIG_S3C24X0 */
说明:mrc p15, 0, r1, c1, c0, 0 、orr r1, r1, #0xc0000000 、mcr  p15, 0, r1, c1, c0, 0 这3句程序非常重要,对于S3C2440 ,CLKDIVN 的第【2:1 】位为HDIVN,如果HDIVN 非0 ,CPU总线模式应该从“总线模式应该从“fast bus mode ”转换为“asynchronous bus mode ”, 可以通过上面的3 句程序实现。否则CPU 的工作频率将自动变成HCLK ,不再是FCLK 。这对SDRAM 的初始化至关重要

 修改/arch/arm/cpu/arm920t/s3c24x0/ speed.c

第66行添加代码: 

  1. #if defined(CONFIG_S3C2440)  
  2. if(pllreg == MPLL)  
  3. {  
  4. return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));  
  5. }  
  6. #endif  
  7. return (CONFIG_SYS_CLK_FREQ * m) / (p << s);  

 第87行添加代码:

  1. ulong get_HCLK(void)  
  2. {  
  3. struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();  
  4. #if defined(CONFIG_S3C2440)  
  5. return(get_FCLK()/4);  
  6. #endif  
  7. return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();  

 修改board/Samsung/mini2440/mini2440.c

 从34行开始修改代码如下

  1. #define FCLK_SPEED 2 /*设置默认等于2,*/  
  2. #if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */  
  3. #define M_MDIV  0xC3  
  4. #define M_PDIV  0x4  
  5. #define M_SDIV  0x1  
  6. #elif FCLK_SPEED==1 /* Fout = 202.8MHz */  
  7. #define M_MDIV  0xA1  
  8. #define M_PDIV  0x3  
  9. #define M_SDIV  0x1  
  10. #elif FCLK_SPEED==2 /* Fout = 405MHz */  
  11. #define M_MDIV 0x7F   
  12. #define M_PDIV 0x2  
  13. #define M_SDIV 0x1  
  14. #endif  
  15. #define USB_CLOCK 2 /*设置默认等于2,*/  
  16. #if USB_CLOCK==0  
  17. #define U_M_MDIV  0xA1  
  18. #define U_M_PDIV 0x3  
  19. #define U_M_SDIV 0x1  
  20. #elif USB_CLOCK==1  
  21. #define U_M_MDIV  0x48  
  22. #define U_M_PDIV 0x3  
  23. #define U_M_SDIV 0x2  
  24. #elif USB_CLOCK==2 /* Fout = 48MHz */  
  25. #define U_M_MDIV 0x38  
  26. #define U_M_PDIV 0x2  
  27. #define U_M_SDIV 0x2  
  28. #endif  
  29. board_init (void)函数修改代码如下:  
  30. /* arch number of SMDK2410-Board */  
  31. gd->bd->bi_arch_number = MACH_TYPE_S3C2440;  
  32. /* adress of boot parameters */  
  33. gd->bd->bi_boot_params = 0x30000100;  
  34. icache_enable();  
  35. dcache_enable();  
  36. return 0;  
  37. }
  在include/configs/mini2440.h 头文件中添加之前用到的CONFIG_S3C2440 宏
第40行添加代码如下:
  1. #define CONFIG_S3C2440 1 /* on a mini2440 Board * 

 

(一)建立项目 修改时钟