<一>U-boot源码结构

图片来自韦东山的《嵌入式linux应用开发完全手册》

U-boot下载地址:ftp://ftp.denx.de/pub/u-boot/

交叉编译工具链  3.3.2



<二>U-boot移植

1.新建一个fl2440开发板目录和文件

①在board目录下新建fl2440目录,讲smdk2410目录下的文件复制到fl2440目录下,并将board/fl2440/smdk2410.c重命名为fl2440.c

②修改u-boot-1.1.6目录下Makefile文件

smdk2410_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

后面加上

fl2410_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t fl2410 NULL s3c24x0

然后在board/fl2440/Makefile中修改

COBJS := smdk2410.o flash.o    为   COBJS := fl2440.o flash.o

2.修改SDRAM的配置

①修改board/fl2440/lowlevel_init.s文件中的126行

#define REFCNT    0x4f4

修改board/fl2440/fl2440.c中的board_init函数,即替换掉整个函数board_init包括它本身的所有语句。

#define S3C2440_MPLL_400MHZ ((0x7f<<12)|(0x02<<4)|(0x01))

#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))

#define S3C2440_CLKDIV 0x05

#define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00))

#define S3C2410_UPLL_48MHZ ((0x28<<12)|(0x01<<4)|(0x02))

#define S3C2410_CLKDIV 0x03

int board_init (void)

{

S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

gpio->GPACON = 0x007FFFFF;

gpio->GPBCON = 0x00044555;

gpio->GPBUP = 0x000007FF;

gpio->GPCCON = 0xAAAAAAAA;

gpio->GPCUP = 0x0000FFFF;

gpio->GPDCON = 0xAAAAAAAA;

gpio->GPDUP = 0x0000FFFF;

gpio->GPECON = 0xAAAAAAAA;

gpio->GPEUP = 0x0000FFFF;

gpio->GPFCON = 0x000055AA;

gpio->GPFUP = 0x000000FF;

gpio->GPGCON = 0xFF95FFBA;

gpio->GPGUP = 0x0000FFFF;

gpio->GPHCON = 0x002AFAAA;

gpio->GPHUP = 0x000007FF;

if ((gpio->GSTATUS1 == 0x32410000) || (gpio->GSTATUS1 == 0x32410002))

{

clk_power->CLKDIVN = S3C2410_CLKDIV;

__asm__( "mrc p15, 0, r1, c1, c0, 0\n"

"orr r1, r1, #0xc0000000\n"

"mcr p15, 0, r1, c1, c0, 0\n"

:::"r1"

);

clk_power->LOCKTIME = 0xFFFFFF;

clk_power->MPLLCON = S3C2410_MPLL_200MHZ;

delay (4000);

clk_power->UPLLCON = S3C2410_UPLL_48MHZ;

delay (8000);

gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;

}

else

{

clk_power->CLKDIVN = S3C2440_CLKDIV;

__asm__( "mrc p15, 0, r1, c1, c0, 0\n"

"orr r1, r1, #0xc0000000\n"

"mcr p15, 0, r1, c1, c0, 0\n"

:::"r1"

);

clk_power->LOCKTIME = 0xFFFFFF;

clk_power->MPLLCON = S3C2440_MPLL_400MHZ;

delay (4000);

clk_power->UPLLCON = S3C2440_UPLL_48MHZ;

delay (8000);

gd->bd->bi_arch_number = MACH_TYPE_S3C2440;

}

gd->bd->bi_boot_params = 0x30000100;

icache_enable();

dcache_enable();

return 0;

}

③S3C2410和S3C2440的MPLL,UPLL计算公式不一样,所以get_PLLCLK函数也需要修改

在cpu/arm920t/s3c24X0/speed.c中修改:

修改get_PLLCLK函数:

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 (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)

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

else

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

}

即在get_PLLCLK函数下加入上面的红色字体。

修改get_HCLK, get_PCLK(直接粘贴下面代码,来把这个两个函数覆盖掉):

#define S3C2440_CLKDIVN_PDIVN (1<<0)

#define S3C2440_CLKDIVN_HDIVN_MASK (3<<1)

#define S3C2440_CLKDIVN_HDIVN_1 (0<<1)

#define S3C2440_CLKDIVN_HDIVN_2 (1<<1)

#define S3C2440_CLKDIVN_HDIVN_4_8 (2<<1)

#define S3C2440_CLKDIVN_HDIVN_3_6 (3<<1)

#define S3C2440_CLKDIVN_ LK (1<<3)

#define S3C2440_CAMDIVN_CAMCLK_MASK (0xf<<0)

#define S3C2440_CAMDIVN_CAMCLK_SEL (1<<4)

#define S3C2440_CAMDIVN_HCLK3_HALF (1<<8)

#define S3C2440_CAMDIVN_HCLK4_HALF (1<<9)

#define S3C2440_CAMDIVN_DVSEN (1<<12)

ulong get_HCLK(void)

{

S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

unsigned long clkdiv;

unsigned long camdiv;

int hdiv = 1;

if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)

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

else

{

clkdiv = clk_power->CLKDIVN;

camdiv = clk_power->CAMDIVN;

switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {

case S3C2440_CLKDIVN_HDIVN_1:

hdiv = 1;

break;

case S3C2440_CLKDIVN_HDIVN_2:

hdiv = 2;

break;

case S3C2440_CLKDIVN_HDIVN_4_8:

hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;

break;

case S3C2440_CLKDIVN_HDIVN_3_6:

hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;

break;

}

return get_FCLK() / hdiv;

}

}

ulong get_PCLK(void)

{

S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

unsigned long clkdiv;

unsigned long camdiv;

int hdiv = 1;

if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)

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

else

{

clkdiv = clk_power->CLKDIVN;

camdiv = clk_power->CAMDIVN;

switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {

case S3C2440_CLKDIVN_HDIVN_1:

hdiv = 1;

break;

case S3C2440_CLKDIVN_HDIVN_2:

hdiv = 2;

break;

case S3C2440_CLKDIVN_HDIVN_4_8:

hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;

break;

case S3C2440_CLKDIVN_HDIVN_3_6:

hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;

break;

}

return get_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2:1);

}

}

重新执行make fl2440_config make all 生成u-boot.bin,由于还没有增加NAND Flash的支持,所以可烧入NOR Flash中运行

在make all时会出现错误:没有CAMDIVN

这个要在include/s3c24x0.h头文件中定义,在129行S3C24X0_CLOCK_POWER结构体中增加:S3C24X0_REG32 CAMDIVN;

现在执行 make fl2440_config 和 make all生成U-Boot.bin就可以烧入norflash了。

U-Boot在FL2440上移植(一)----修改系统时钟的更多相关文章

  1. linux驱动调试--修改系统时钟终端来定位僵死问题【转】

    本文转载自:http://blog.chinaunix.net/uid-20671208-id-4940381.html 原文地址:linux驱动调试--修改系统时钟终端来定位僵死问题 作者:枫露清愁 ...

  2. U-Boot在FL2440上移植(二)----支持NOR Flash

    <一>选择NOR flash型号 我的开发板上的nor flash芯片是Intel的JS28F320(4MB)(1device=32blocks,1block=128MB fl2440默认 ...

  3. U-Boot在FL2440上移植(三)----支持NAND Flash

    <一>支持NAND Flash 1. 首先在配置文件 include/config/fl2440.h 的宏 CONFIG_COMMANDS 中增加 CFG_CMD_NAND, #defin ...

  4. U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统

    <一>支持网卡芯片DM9000 在driver下,有网卡驱动DM9000x.c 和 DM9000x.h DM9000接在BANK4,位宽16 在include/configs/TX2440 ...

  5. 在STM32F401上移植uC/OS的一个小问题 [原创]

    STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...

  6. linux 修改系统时间 同步网络时间

    一.date命令 date -s time  修改系统时钟时间为time 设置时间和日期 例如:将系统日期设定成2018年6月8日的命令 命令 : "date -s 06/08/2018&q ...

  7. zedboard上移植OPENCV库

    zedboard上移植OPENCV库 之前做了很多移植OPENCV库的工作,但是需要包含的各种库,需要交叉编译,X264 ,JPGE ,FFMPGE等等 注意:在<嵌入式系统软硬件协同设计实战指 ...

  8. 【Spring Boot】关于上传文件例子的剖析

    目录 Spring Boot 上传文件 功能实现 增加ControllerFileUploadController 增加ServiceStorageService 增加一个Thymeleaf页面 修改 ...

  9. 在HI3531上移植和运行QT4.8.6

    在HI3531上移植和运行QT4.8.6 1.            前言: 近段有点时间,想把QT移植到HI3531上,在网上查找了很多资料,但都不是很全面,有些有问题也没有得到很好的体现. 2.  ...

随机推荐

  1. Codeforces 353D Queue(构造法)

    [题目链接] http://codeforces.com/contest/353/problem/D [题目大意] 10^6个男女排队,每一秒,如果男生在女生前面,即pos[i]是男生,pos[i+1 ...

  2. iso-开发基础知识-5-适配器

    个人学习总结仅供参考:欢迎拍砖 1.适配器:用于连接两种不同种类的对象. 2.分为2种:类适配,对象适配. 3.委托(Delegate)模式属于对象适配器: 4.何时使用适配器模式 书中的这幅图更好的 ...

  3. javascript的this指向

    JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发现JavaScript其实很难掌握,有 ...

  4. linux下curl编程

    LibCurl是免费的客户端URL传输库,支持FTP,FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE ,LDAP等协议,其主页是http: ...

  5. AngularJs 简单入门

    1.AngularJs 是什么以及应用程序组成的三部分 AngularJS是一个开发动态Web应用的框架.它让你可以使用HTML作为模板语言并且可以通过扩展的HTML语法来使应用组件更加清晰和简洁.它 ...

  6. Echarts数据图表插件--开源、大气、强大

    个人觉得不错,分享给大家. 教程地址:http://echarts.baidu.com/, 开源项目:https://github.com/ecomfe/echarts

  7. Python 3 学习笔记2

    教程链接:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 高级特性 切片 取一个l ...

  8. 有关spring-servlet.xml 和 application.xml的配置信息讲解(这两个配置信息的区别在哪里)

    在使用springmvc时需要配置得信息有两个,一个是spring-servlet.xml和applcation.xml: 首先两个文件的的存放位置就有一点的不同(见下图),application.x ...

  9. 我们在 web 应用开发过程中经常遇到输出某种编码的字 符, 如 iso8859-1 等, 如何输出一个某种编码的字符串?

    public String translate (String str) { String tempStr = ""; try { tempStr = new String(str ...

  10. VS2010使用DX报错 VS报错之混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

    更改项目的app.config内容为以下内容 目的是开启对低版本的NETFWK支持 其实出现混合模式集的问题不只是在V1.1.4322这个版本上,在查询解决方案时发现,但凡程序集版本发生改变时,都有可 ...