2012 12 02 FL2440开发板的U-boot-2010.09版本移植(二)片上系统SoC初始化移植
--------------------------------------------------------
在“<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代码。
- // bl coloured_LED_init
- // bl red_LED_on
2、修改编译条件支持s3c2440,修改寄存器地址定义,修改 CPU频率初始化设置
- # if defined(CONFIG_S3C2400)
- # define pWTCON 0x15300000
- # define INTMSK 0x14400008 /* Interupt-Controller base addresses */
- # define CLKDIVN 0x14800014 /* clock divisor register */
- #else
- # define pWTCON 0x53000000
- # define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
- # define INTSUBMSK 0x4A00001C
- # define CLKDIVN 0x4C000014 /* clock divisor register */
- # endif
- 添加
- # define CLK_CTL_BASE 0x4C000000
- # define MDIV_405 0x7f<<12
- # define PSDIV_405 0x21 /*set s3c2440 MPLL 405MHZ*/
- # define MDIV_200 0xa1<<12
- # define PSDIV_200 0x31 /*set s3c2410 MPLL 200MHZ*/
3、修改中断禁止部分
- # if defined(CONFIG_S3C2410)
- //ldr r1, =0x3ff
- ldr r1, =0x7ff /*uboot error*/
- ldr r0, =INTSUBMSK
- str r1, [r0]
- # endif
- 后添加
- #if defined(CONFIG_S3C2440)
- ldr r1, =0x7ff
- ldr r0, =INTSUBMSK
- str r1, [r0]
- /*INTSUBMSK 关闭中断 S3C2440有15位*/
- # endif
★★★★★★Important★★★★★★
yanghao提供的代码中 ldr r1, =0x7ff 写成了 ldr r1, =0x7fff
需要更正!
★★★★★★Important★★★★★★
4、修改时钟设置(2440的主频为405MHz),紧接着上面一步,在其后添加和修改为:
- #if defined(CONFIG_S3C2440)
- /* FCLK:HCLK:PCLK = 1:4:8 */
- /* default FCLK is 405 MHz ! */
- ldr r0, =CLKDIVN
- mov r1, #5
- str r1, [r0]
- mrc p15, 0, r1, c1, c0, 0
- orr r1, r1, #0xc0000000 //asynchronous
- mcr p15, 0, r1, c1, c0, 0
- /*上面这段代码见s3c2440a手册p215,HDIVN != 0 叫做异步总线模式*/
- /* cpu clock FCLK = 405MHZ 通常我们叫400MHZ,实际是405MHZ,见S3C2440手册(英文版)chapt7,P227要习惯用英文手册:-)*/
- /*根据表中的数据设置MDIV,PDIV,SDIV*/
- mov r1, #CLK_CTL_BASE
- mov r2, #MDIV_405
- add r2, r2, #PSDIV_405
- str r2, [r1, #0x04] //写入MPLLCON
- #else
- /* FCLK:HCLK:PCLK = 1:2:4 */
- /* default FCLK is 120 MHz ! */
- ldr r0, =CLKDIVN
- mov r1, #3
- str r1, [r0]
- mrc p15, 0, r1, c1, c0, 0
- orr r1, r1, #0xc0000000 //asynchronous
- mcr p15, 0, r1, c1, c0, 0
- /* cpu clock is 200MHZ*/
- mov r1, #CLK_CTL_BASE
- mov r2, #MDIV_200
- add r2, r2, #PSDIV_200
- str r2, [r1, #0x04] //MPLLCON
- #endif
5、修改SDRAM的REFRESH刷新周期,修改board/fl2440/lowlevel_init.S文件
- #define REFCNT 1259
- /*在SDRAM手册上P3上有64ms refresh period (8K Cycle)*/
- /*结合fl2440开发板 preiod =64ms/8129=7.8125us,取7.9的话REFCNT的值为 (2048+1-7.9us*100Mhz)=1259*/
- #define Trp 0x0 /* 2clk */
- /*RAS precharge Time SDRAM数据手册P10 tRP(min)=20ns 或者18ns(由型号决定)我们知道我们的HCLK=405/4Mhz 故可设成2clk(20ns),有些移植手册设为4clk 再次充电时间设大点问题也不大吧 */
- #define Trc 0x3 /* 7clk */
- /*SDRAM ROW cycle time: Trc=Tsrc+Trp SDRAM数据手册p10 tRC(min)=65ns 或者60ns(由型号决定) 设为7即为70ns */
- #define Tchr 0x2 /* 3clk */
- /*为找到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行附近):
- /* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */
- /* (see S3C2410 manual chapter 7) */
- struct s3c24x0_clock_power {
- u32 LOCKTIME;
- u32 MPLLCON;
- u32 UPLLCON;
- u32 CLKCON;
- u32 CLKSLOW;
- u32 CLKDIVN;
- #if defined (CONFIG_S3C2440)
- u32 CAMDIVN;
- #endif
- };
- #if defined(CONFIG_S3C2410)
- /* NAND FLASH (see S3C2410 manual chapter 6) */
- struct s3c2410_nand {
- u32 NFCONF;
- u32 NFCMD;
- u32 NFADDR;
- u32 NFDATA;
- u32 NFSTAT;
- u32 NFECC;
- };
- #endif
- #if defined(CONFIG_S3C2440)
- /* NAND FLASH (see S3C2440 manual chapter 6) */
- struct s3c2410_nand {
- u32 NFCONF;
- u32 NFCONT;
- u32 NFCMD;
- u32 NFADDR;
- u32 NFDATA;
- u32 NFMECCD0;
- u32 NFMECCD1;
- u32 NFSECCD;
- u32 NFSTAT;
- u32 NFESTAT0;
- u32 NFESTAT1;
- u32 NFMECC0;
- u32 NFMECC1;
- u32 NFSECC;
- u32 NFSBLK;
- u32 NFEBLK;
- };
- #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行添加
- #if defined(CONFIG_S3C2440)
- if(pllreg == MPLL)
- return (CONFIG_SYS_CLK_FREQ * m * 2) / (p << s);
- else if(pllreg == UPLL)
- #endif
- return (CONFIG_SYS_CLK_FREQ * m) / (p << s);
由于S3C2410和S3C2440的设置方法也不一样,所以get_HCLK函数也需要修改,80行/* return HCLK frequency */
- ulong get_HCLK(void)
- {
- struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
- #if defined(CONFIG_S3C2440)
- if (readl(&clk_power->CLKDIVN) & 0x6)
- {
- if ((readl(&clk_power->CLKDIVN) & 0x6)==2) return(get_FCLK()/2);
- if ((readl(&clk_power->CLKDIVN) & 0x6)==6) return((readl(&clk_power->CAMDIVN) & 0x100) ? get_FCLK()/6 : get_FCLK()/3);
- if ((readl(&clk_power->CLKDIVN) & 0x6)==4) return((readl(&clk_power->CAMDIVN) & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
- return(get_FCLK());
- }
- else return(get_FCLK());
- #else
- return (readl(&clk_power->CLKDIVN) & 2) ? get_FCLK() / 2 : get_FCLK();
- #endif
- }
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行的
- #define CONFIG_S3C2410 1 /* specifically a SAMSUNG S3C2410 SoC */
- #define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board */
- 为
- #define CONFIG_S3C2440 1 /* specifically a SAMSUNG S3C2440 SoC */
- #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初始化移植相关推荐
- fl2440开发板之u-boot移植
**************************************************************************************************** ...
- 备忘录 - FL2440 开发板操作要点及注意事项
以下内容仅仅针对于FL2440开发板,对其他开发板仅能做参考. 文章导航: 1. 通过DMW 下载 2. FL2440 自带BOOT 3. 空板下载 BOOTLOADER 4. BOOTLOADER ...
- 正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植
正点原子Linux阿尔法开发板4.3 寸多点电容触摸屏测试问题和gt9xx系列linux驱动移植 正点原子官方CSDN 4.3 寸多点电容触摸屏测试问题 正点原子gt9xx系列linux驱动移植 1. ...
- 【学习分享】2、创龙 TMS320C6748开发板程序加载和烧写(二)
此部分由于篇幅过长,将分为五个小点进行叙述,此处主讲基于串口的程序加载和烧写,所用器件为创龙TMS320C6748开发板.需要注意的点已在备注中进行说明. 如果需要从头开始进行本使用手册的阅读,欢迎阅 ...
- linux下I2C驱动体系结构及在FL2440开发板上的具体实现
最近一段时间,我在网上看了一些关于linux下i2c的文档,对i2c有了一些较浅层次了解.写这篇博客,主要是对现在已经掌握知识的巩固. Linux下I2C驱动体系结构 Linux下I2C驱动体系结构由 ...
- 基于MT7688模块的开发笔记12——给MT7688开发板添加WiFi功能
使用原厂的SDK,生成的内核镜像没有WiFi,需要自己动手添加WiFi驱动. 网卡驱动文件: MT7628_LinuxAP_V4.0.1.3_DPA_20150216.tar.bz2 下载地址: ht ...
- Linux 开发板4G转WiFi热点 手机连接热点上网(三 WiFi模块的移植及AP的建立)
这里对WiFi模块的驱动就不做详细介绍,本篇文章可能会涉及两款WiFi模块,一个是USB接口的WiFi模块,一个是SDIO接口的wifi模块,即AP6212,平台可能涉及爱特梅尔和三星的4418两个平 ...
- 全网最便宜的OpenHarmony开发板和模组Neptune问世(基于联盛德W800的SoC),9.9元带蓝牙和wifi功能还包邮
这是我见过的全网最便宜的开发板.功能一点儿也不弱,带蓝牙和wifi功能,竟只要9.9元还包邮,果断的买了块儿研究研究.它还支持HarmonyOS和freeRTOS嵌入式操作系统,也可以接入鸿蒙生态. ...
- (二)arm-a上华为iot云,移植虚拟机的文件到开发板,全网首发
上一篇文章已经在虚拟机上可以用华为的sdk连接到iot云端 我已经造好轮子,也不收费,希望大家多交流,每次下载点东西,一个两个都要金币的,很难受 我造好的轮子 现在我们把文件移植到开发板上 进行文件的 ...
最新文章
- 最强markdown编辑器typora图床教程-七牛版
- android功耗iphone,是心目中的安卓小屏旗舰吗?iPhone 8尺寸大小,4000mAh电池容量...
- 设置行间距_word打印技巧:几个节省纸张的打印设置方法
- 项目如何开始:怎样和客户一起搞定需求
- 在图论中,网络流(Network Flow)
- MongoDB健壮集群——用副本集做分片
- 如何使用Git SVN工具 -- TortoiseGit(小乌龟)将本地项目上传至GitEE?【超详细教程】
- (转)原始图像数据和PDF中的图像数据
- 【FXCG】美联储加息之际,新兴市场加息周期却接近尾声
- 远程登陆Win10自带子系统Ubuntu-22.04
- 编写MTK6737平台的GPIO驱动例程(三)
- 字节的按位逆序 Reverse Bits
- Vue 2.x折腾记 - (15) 捣鼓一个中规中矩loading组件
- 前端笔记(11) Vue3 Router 编程式导航 router.push router.replace
- B1/B2签证的有效期——对于B1/B2签证,停留期最长不超过183天
- CS224n 深度自然语言处理(四) Note - Backpropagation and computation graphs
- vue的html自动刷新,vue项目刷新当前页面的方法
- TP与laravel简介
- Simulink入门——RLC串联动态电路
- 阿里python认证_集成阿里云滑动验证(python)