--------------------------------------------------------

在“<2012 10 02> FL2440开发板的U-boot-2010.09版本移植(一)”的文章里,只是初步建立了一块开发板(With S3C2440 SoC)的U-boot框架,并且能够被gcc编译成功。但现在这个框架还不能下载到开发板上运行,因为还需要修改一些SoC最必须的参数,它们包括:寄存器地址、中断、CPU频率&PLL、RAM控制器、一些头文件包含、以及底层串口信息打印输出。

经过本文的修改,U-boot就能在FL2440开发板上运行了。具体下载到开发板的方法还需要有Jlink的支持(Notebook Without 并口)。

--------------------------------------------------------

添加fl2440中S3C2440片上系统的支持。

一、汇编文件修改,这部分主要集中修改修改cpu/arm920t/start.S文件。

1、删除AT91RM9200使用的LED代码,117、118行,关闭LED代码。

[cpp] view plaincopy
  1. // bl coloured_LED_init
  2. // bl red_LED_on

2、修改编译条件支持s3c2440,修改寄存器地址定义,修改 CPU频率初始化设置

[plain] view plaincopy
  1. # if defined(CONFIG_S3C2400)
  2. #  define pWTCON    0x15300000
  3. #  define INTMSK    0x14400008  /* Interupt-Controller base addresses */
  4. #  define CLKDIVN   0x14800014  /* clock divisor register */
  5. #else
  6. #  define pWTCON    0x53000000
  7. #  define INTMSK    0x4A000008  /* Interupt-Controller base addresses */
  8. #  define INTSUBMSK 0x4A00001C
  9. #  define CLKDIVN   0x4C000014  /* clock divisor register */
  10. # endif
  11. 添加
  12. #  define CLK_CTL_BASE  0x4C000000
  13. #  define MDIV_405      0x7f<<12
  14. #  define PSDIV_405     0x21            /*set s3c2440 MPLL 405MHZ*/
  15. #  define MDIV_200      0xa1<<12
  16. #  define PSDIV_200     0x31            /*set s3c2410 MPLL 200MHZ*/

3、修改中断禁止部分

[plain] view plaincopy
  1. # if defined(CONFIG_S3C2410)
  2. //ldr r1, =0x3ff
  3. ldr r1, =0x7ff  /*uboot error*/
  4. ldr r0, =INTSUBMSK
  5. str r1, [r0]
  6. # endif
  7. 后添加
  8. #if defined(CONFIG_S3C2440)
  9. ldr     r1, =0x7ff
  10. ldr     r0, =INTSUBMSK
  11. str     r1, [r0]
  12. /*INTSUBMSK 关闭中断 S3C2440有15位*/
  13. # endif

★★★★★★Important★★★★★★

yanghao提供的代码中        ldr     r1, =0x7ff   写成了        ldr     r1, =0x7fff

需要更正!

★★★★★★Important★★★★★★

4、修改时钟设置(2440的主频为405MHz),紧接着上面一步,在其后添加和修改为:

[cpp] view plaincopy
  1. #if defined(CONFIG_S3C2440)
  2. /* FCLK:HCLK:PCLK = 1:4:8 */
  3. /* default FCLK is 405 MHz ! */
  4. ldr r0, =CLKDIVN
  5. mov r1, #5
  6. str r1, [r0]
  7. mrc     p15, 0, r1, c1, c0, 0
  8. orr     r1, r1, #0xc0000000 //asynchronous
  9. mcr     p15, 0, r1, c1, c0, 0
  10. /*上面这段代码见s3c2440a手册p215,HDIVN != 0 叫做异步总线模式*/
  11. /* cpu clock FCLK = 405MHZ 通常我们叫400MHZ,实际是405MHZ,见S3C2440手册(英文版)chapt7,P227要习惯用英文手册:-)*/
  12. /*根据表中的数据设置MDIV,PDIV,SDIV*/
  13. mov     r1, #CLK_CTL_BASE
  14. mov     r2, #MDIV_405
  15. add     r2, r2, #PSDIV_405
  16. str     r2, [r1, #0x04] //写入MPLLCON
  17. #else
  18. /* FCLK:HCLK:PCLK = 1:2:4 */
  19. /* default FCLK is 120 MHz ! */
  20. ldr r0, =CLKDIVN
  21. mov r1, #3
  22. str r1, [r0]
  23. mrc     p15, 0, r1, c1, c0, 0
  24. orr     r1, r1, #0xc0000000 //asynchronous
  25. mcr     p15, 0, r1, c1, c0, 0
  26. /* cpu clock is 200MHZ*/
  27. mov     r1, #CLK_CTL_BASE
  28. mov     r2, #MDIV_200
  29. add     r2, r2, #PSDIV_200
  30. str     r2, [r1, #0x04] //MPLLCON
  31. #endif

5、修改SDRAM的REFRESH刷新周期,修改board/fl2440/lowlevel_init.S文件

[cpp] view plaincopy
  1. #define REFCNT   1259
  2. /*在SDRAM手册上P3上有64ms refresh period (8K Cycle)*/
  3. /*结合fl2440开发板 preiod =64ms/8129=7.8125us,取7.9的话REFCNT的值为 (2048+1-7.9us*100Mhz)=1259*/
  4. #define Trp   0x0 /* 2clk */
  5. /*RAS precharge Time SDRAM数据手册P10 tRP(min)=20ns 或者18ns(由型号决定)我们知道我们的HCLK=405/4Mhz 故可设成2clk(20ns),有些移植手册设为4clk 再次充电时间设大点问题也不大吧 */
  6. #define Trc   0x3 /* 7clk */
  7. /*SDRAM ROW cycle time: Trc=Tsrc+Trp SDRAM数据手册p10 tRC(min)=65ns 或者60ns(由型号决定) 设为7即为70ns */
  8. #define Tchr   0x2 /* 3clk */
  9. /*为找到Tchr相关定义,在SMRDATA:后面设置REFRESH寄存器时(Tchr<<16),而实际上该寄存器(11~17)位为保留位,这里设置并没有意义(可能这个值在其他ARM体系中有用吧,但至少在S3C2440中是无效的)*/

二、补充对S3C2440的支持。

6、修改S3C2440在C语言中要使用的寄存器,修改include/asm/arch-s3c24x0/s3c24x0.h文件的第81、91、95、106、144、400行:
将“#ifdef CONFIG_S3C2410”改为 #if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
顺便在其中加入S3C2440的NAND FLASH 寄存器定义(第154行附近)和CAMDIVN定义(第124行附近):

[cpp] view plaincopy
  1. /* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */
  2. /*                          (see S3C2410 manual chapter 7) */
  3. struct s3c24x0_clock_power {
  4. u32  LOCKTIME;
  5. u32  MPLLCON;
  6. u32  UPLLCON;
  7. u32  CLKCON;
  8. u32  CLKSLOW;
  9. u32  CLKDIVN;
  10. #if defined (CONFIG_S3C2440)
  11. u32  CAMDIVN;
  12. #endif
  13. };
  14. #if defined(CONFIG_S3C2410)
  15. /* NAND FLASH (see S3C2410 manual chapter 6) */
  16. struct s3c2410_nand {
  17. u32 NFCONF;
  18. u32 NFCMD;
  19. u32 NFADDR;
  20. u32 NFDATA;
  21. u32 NFSTAT;
  22. u32 NFECC;
  23. };
  24. #endif
  25. #if defined(CONFIG_S3C2440)
  26. /* NAND FLASH (see S3C2440 manual chapter 6) */
  27. struct s3c2410_nand {
  28. u32  NFCONF;
  29. u32  NFCONT;
  30. u32  NFCMD;
  31. u32  NFADDR;
  32. u32  NFDATA;
  33. u32  NFMECCD0;
  34. u32  NFMECCD1;
  35. u32  NFSECCD;
  36. u32  NFSTAT;
  37. u32  NFESTAT0;
  38. u32  NFESTAT1;
  39. u32  NFMECC0;
  40. u32  NFMECC1;
  41. u32  NFSECC;
  42. u32  NFSBLK;
  43. u32  NFEBLK;
  44. };
  45. #endif

7、include/asm/arch/s3c24x0_cpu.h,这个文件使添加对2440的支持的头文件的工作量少了很多。文件的第23行
#if defined(CONFIG_S3C2400)
    #include <s3c2400.h>
  #elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
  #include <s3c2410.h>

8、arch/arm/cpu/arm920t/s3c24x0/timer.c文件的在184行添加     
  defined(CONFIG_VCMA9)    || \
      defined(CONFIG_FL2440)

9、arch/arm/cpu/arm920t/s3c24x0/speed.c
由于S3C2410和S3C2440的MPLL、UPLL计算公式不一样,所以get_PLLCLK函数也需要修改,在66行添加

[cpp] view plaincopy
  1. #if defined(CONFIG_S3C2440)
  2. if(pllreg == MPLL)
  3. return (CONFIG_SYS_CLK_FREQ * m * 2) / (p << s);
  4. else if(pllreg == UPLL)
  5. #endif
  6. return (CONFIG_SYS_CLK_FREQ * m) / (p << s);

由于S3C2410和S3C2440的设置方法也不一样,所以get_HCLK函数也需要修改,80行/* return HCLK frequency */

[cpp] view plaincopy
  1. ulong get_HCLK(void)
  2. {
  3. struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
  4. #if defined(CONFIG_S3C2440)
  5. if (readl(&clk_power->CLKDIVN) & 0x6)
  6. {
  7. if ((readl(&clk_power->CLKDIVN) & 0x6)==2) return(get_FCLK()/2);
  8. if ((readl(&clk_power->CLKDIVN) & 0x6)==6) return((readl(&clk_power->CAMDIVN) & 0x100) ? get_FCLK()/6 : get_FCLK()/3);
  9. if ((readl(&clk_power->CLKDIVN) & 0x6)==4) return((readl(&clk_power->CAMDIVN) & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
  10. return(get_FCLK());
  11. }
  12. else return(get_FCLK());
  13. #else
  14. return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();
  15. #endif
  16. }

10、修改drivers/i2c/s3c24x0_i2c.c文件,其原来的位置/cpu/arm920t/s3c24x0/i2c.c

第60、79、131、140、166行:
将“#ifdef CONFIG_S3C2410”改为 #if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

11、串口相关修改,修改common/serial.c文件,71行将#elif defined(CONFIG_S3C2410) 改为#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440),160行    改为#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

修改include/serial.h 在49行添加
#if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

12、修改include/configs/fl2440.h文件中第38行,39行的

[cpp] view plaincopy
  1. #define CONFIG_S3C2410 1 /* specifically a SAMSUNG S3C2410 SoC */
  2. #define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board  */
  3. #define CONFIG_S3C2440 1 /* specifically a SAMSUNG S3C2440 SoC */
  4. #define CONFIG_FL2440 1 /* on a SAMSUNG FL2440 Board  */

然后我们再执行make,这时可以成功编译出来的u-boot.bin。

------------------------------------------------

如果跳过U-boot第一阶段的初始化,直接进行高层功能(这在裸板烧写Bootloader时会用到):

如果我们在include/configs/fl2440.h文件中添加

#define  CONFIG_SKIP_LOWLEVEL_INIT     1 //用来支持uboot在内存中直接运行

然后再编译出u-boot.bin,这时的镜像文件就可以通过J-Link下载到内存0x33f80000处运行。

  不懂U-boot基本架构的,移步 http://www.cnblogs.com/andrew-wang/archive/2012/11/04/2753972.html

  不懂裸板烧写bootloader的,移步 http://www.cnblogs.com/andrew-wang/archive/2012/12/03/2799237.html

本文source http://blog.csdn.net/yanghao23/article/details/7688019

转载于:https://www.cnblogs.com/andrew-wang/archive/2012/12/03/2799218.html

2012 12 02 FL2440开发板的U-boot-2010.09版本移植(二)片上系统SoC初始化移植相关推荐

  1. fl2440开发板之u-boot移植

    **************************************************************************************************** ...

  2. 备忘录 - FL2440 开发板操作要点及注意事项

    以下内容仅仅针对于FL2440开发板,对其他开发板仅能做参考. 文章导航: 1. 通过DMW 下载 2. FL2440 自带BOOT 3. 空板下载 BOOTLOADER 4. BOOTLOADER ...

  3. 正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植

    正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植 正点原子官方CSDN 4.3 寸多点电容触摸屏测试问题 正点原子gt9xx系列linux驱动移植 1. ...

  4. 【学习分享】2、创龙 TMS320C6748开发板程序加载和烧写(二)

    此部分由于篇幅过长,将分为五个小点进行叙述,此处主讲基于串口的程序加载和烧写,所用器件为创龙TMS320C6748开发板.需要注意的点已在备注中进行说明. 如果需要从头开始进行本使用手册的阅读,欢迎阅 ...

  5. linux下I2C驱动体系结构及在FL2440开发板上的具体实现

    最近一段时间,我在网上看了一些关于linux下i2c的文档,对i2c有了一些较浅层次了解.写这篇博客,主要是对现在已经掌握知识的巩固. Linux下I2C驱动体系结构 Linux下I2C驱动体系结构由 ...

  6. 基于MT7688模块的开发笔记12——给MT7688开发板添加WiFi功能

    使用原厂的SDK,生成的内核镜像没有WiFi,需要自己动手添加WiFi驱动. 网卡驱动文件: MT7628_LinuxAP_V4.0.1.3_DPA_20150216.tar.bz2 下载地址: ht ...

  7. Linux 开发板4G转WiFi热点 手机连接热点上网(三 WiFi模块的移植及AP的建立)

    这里对WiFi模块的驱动就不做详细介绍,本篇文章可能会涉及两款WiFi模块,一个是USB接口的WiFi模块,一个是SDIO接口的wifi模块,即AP6212,平台可能涉及爱特梅尔和三星的4418两个平 ...

  8. 全网最便宜的OpenHarmony开发板和模组Neptune问世(基于联盛德W800的SoC),9.9元带蓝牙和wifi功能还包邮

    这是我见过的全网最便宜的开发板.功能一点儿也不弱,带蓝牙和wifi功能,竟只要9.9元还包邮,果断的买了块儿研究研究.它还支持HarmonyOS和freeRTOS嵌入式操作系统,也可以接入鸿蒙生态. ...

  9. (二)arm-a上华为iot云,移植虚拟机的文件到开发板,全网首发

    上一篇文章已经在虚拟机上可以用华为的sdk连接到iot云端 我已经造好轮子,也不收费,希望大家多交流,每次下载点东西,一个两个都要金币的,很难受 我造好的轮子 现在我们把文件移植到开发板上 进行文件的 ...

最新文章

  1. 最强markdown编辑器typora图床教程-七牛版
  2. android功耗iphone,是心目中的安卓小屏旗舰吗?iPhone 8尺寸大小,4000mAh电池容量...
  3. 设置行间距_word打印技巧:几个节省纸张的打印设置方法
  4. 项目如何开始:怎样和客户一起搞定需求
  5. 在图论中,网络流(Network Flow)
  6. MongoDB健壮集群——用副本集做分片
  7. 如何使用Git SVN工具 -- TortoiseGit(小乌龟)将本地项目上传至GitEE?【超详细教程】
  8. (转)原始图像数据和PDF中的图像数据
  9. 【FXCG】美联储加息之际,新兴市场加息周期却接近尾声
  10. 远程登陆Win10自带子系统Ubuntu-22.04
  11. 编写MTK6737平台的GPIO驱动例程(三)
  12. 字节的按位逆序 Reverse Bits
  13. Vue 2.x折腾记 - (15) 捣鼓一个中规中矩loading组件
  14. 前端笔记(11) Vue3 Router 编程式导航 router.push router.replace
  15. B1/B2签证的有效期——对于B1/B2签证,停留期最长不超过183天
  16. CS224n 深度自然语言处理(四) Note - Backpropagation and computation graphs
  17. vue的html自动刷新,vue项目刷新当前页面的方法
  18. TP与laravel简介
  19. Simulink入门——RLC串联动态电路
  20. 阿里python认证_集成阿里云滑动验证(python)

热门文章

  1. mysql的bigint类型_php mysql bigint 类型
  2. 自动拼写检查---jazzy简介
  3. linux windows文件映射,WINDOWS的共享文件夹映射到linux上
  4. 华为p30支持html吗,华为p30支持5g吗
  5. Linux下Java程序中文乱码问题
  6. Java基础常见转义字符(完整归纳)
  7. JMockit学习教程
  8. 中文版MathType如何批量修改公式的字体大小
  9. c++智能指针与lamda表达式
  10. 用python画桃花_武大樱花又盛开,用Python画一棵樱花树