JZ2440移植uboot

发布者:SereneSoul55最新更新时间:2020-04-05 来源: eefocus关键字:JZ2440  移植  uboot 手机看文章 扫描二维码
随时随地手机看文章

开发板:JZ2440V3


U-Boot版本:u-boot-2012.04.01


1.首先下载源码,上传到服务器,解压缩。


tar -jxvf u-boot-2012.04.01.tar.bz2


2.新建一个项目,这个版本的uboot自带的有smdk2410项目的,通过阅读源码根目录下的README文件发现,新建一个项目主需要以下几步:

(1)在根目录下的boards.cfg文件中,仿照smdk2410项目,添加下面这段话:

jz2440 arm arm920t jz2440 samsung s3c24x0

(2)在board/samsung/目录先新建文件夹jz2440;

cp -fr smdk2410 jz2440

(3)在include/configs/配置文件目录下新建项目的配置文件jz2440.h;

cp smdk2410.h jz2440.h


3.编译之前的配置

make jz2440_config


4.进行编译

make


注意:这个版本的uboot使用3.4.5的编译工具会发生段错误,需要使用4.3.2版本的arm-linux-gcc工具。


将生产的u-boot.bin文件烧写进Nor Flash中,发现串口没有任何的输出。我们现在来分析源码是什么原因导致的?


我们先来看编译链接的过程:


arm-linux-ld  -pie -T u-boot.lds -Bstatic -Ttext 0x0 $UNDEF_SYM arch/arm/cpu/arm920t/start.o

--start-group api/libapi.o arch/arm/cpu/arm920t/libarm920t.o arch/arm/cpu/arm920t/s3c24x0/libs3c24x0.o 

arch/arm/lib/libarm.o common/libcommon.o disk/libdisk.o drivers/bios_emulator/libatibiosemu.o 

drivers/block/libblock.o drivers/dma/libdma.o drivers/fpga/libfpga.o drivers/gpio/libgpio.o 

drivers/hwmon/libhwmon.o drivers/i2c/libi2c.o drivers/input/libinput.o drivers/misc/libmisc.o 

drivers/mmc/libmmc.o drivers/mtd/libmtd.o drivers/mtd/nand/libnand.o drivers/mtd/onenand/libonenand.o 

drivers/mtd/spi/libspi_flash.o drivers/mtd/ubi/libubi.o drivers/net/libnet.o drivers/net/phy/libphy.o 

drivers/pci/libpci.o drivers/pcmcia/libpcmcia.o drivers/power/libpower.o drivers/rtc/librtc.o 

drivers/serial/libserial.o drivers/spi/libspi.o drivers/twserial/libtws.o drivers/usb/eth/libusb_eth.o 

drivers/usb/gadget/libusb_gadget.o drivers/usb/host/libusb_host.o drivers/usb/musb/libusb_musb.o 

drivers/usb/phy/libusb_phy.o drivers/usb/ulpi/libusb_ulpi.o drivers/video/libvideo.o drivers/watchdog/libwatchdog.o 

fs/cramfs/libcramfs.o fs/ext2/libext2fs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o 

fs/reiserfs/libreiserfs.o fs/ubifs/libubifs.o fs/yaffs2/libyaffs2.o lib/libfdt/libfdt.o lib/libgeneric.o 

lib/lzma/liblzma.o lib/lzo/liblzo.o lib/zlib/libz.o net/libnet.o post/libpost.o 

board/samsung/jz2440/libjz2440.o 

--end-group 


从编译链接过程可以得知,链接脚本时u-boot.lds;我们来看这个文件的内容,看看链接地址定的是多少?


OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

 . = 0x00000000;            #链接地址

 . = ALIGN(4);

 .text :

 {

  __image_copy_start = .;

  arch/arm/cpu/arm920t/start.o (.text)

  *(.text)

 }

 . = ALIGN(4);

 .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }

 . = ALIGN(4);

 .data : {

  *(.data)

 }

 . = ALIGN(4);

 . = .;

 __u_boot_cmd_start = .;

 .u_boot_cmd : { *(.u_boot_cmd) }

 __u_boot_cmd_end = .;

 . = ALIGN(4);

 __image_copy_end = .;

 .rel.dyn : {

  __rel_dyn_start = .;

  *(.rel*)

  __rel_dyn_end = .;

 }

 .dynsym : {

  __dynsym_start = .;

  *(.dynsym)

 }

 _end = .;

 . = ALIGN(4096);

 .mmutable : {

  *(.mmutable)

 }

 .bss __rel_dyn_start (OVERLAY) : {

  __bss_start = .;

  *(.bss)

   . = ALIGN(4);

  __bss_end__ = .;

 }

 /DISCARD/ : { *(.dynstr*) }

 /DISCARD/ : { *(.dynamic*) }

 /DISCARD/ : { *(.plt*) }

 /DISCARD/ : { *(.interp*) }

 /DISCARD/ : { *(.gnu*) }

}


从链接脚本可以知道,默认的链接地址是0x00000000;所以,默认只支持Nor Flash启动。从编译链接过程可以得知开发板一上电首先执行的是"arch/arm/cpu/arm920t/start.S"文件。我们现在来分析这个文件,查找为什么在Nor Flash启动时串口没有任何的输出。


记录start.S文件做了哪些事情:


1.set the cpu to SVC32 mode

2.turn off the watchdog

3.mask all IRQs by setting all bits in the INTMR

4.设置时钟比例;FCLK:HCLK:PCLK = 1:2:4

5.flush v4 I/D caches和disable MMU stuff and caches,跳转到lowlevel_init处,设置内存控制器

6.设置栈,并调用board_init_f函数;

6.1.设置R8寄存器指向的指针gd,并将其指向的内存空间清零;

6.2.调用init_sequence数组中的函数指针指向的各个函数;

6.3.设置系统时钟,设置过GPIO端口;

6.4.最后是重定位代码;relocate_code(addr_sp, id, addr);

分析到这里发现有问题了,默认的是先设置时钟预分频系数,然后初始化内存,然后再C代码中初始化时钟。


而我们设置SDRAM控制器是有严格时序要求的,并不清楚时钟那个HCLK下设置的,所有极有可能出错。


为什么在最后才开始重定位代码呢?


是由于uboot的代码很大,后面的C代码有可能使用全局或静态变量,而全局或静态遍历在链接时的地址是其链接脚本中的地址规定的;在运行时就会去链接地址处寻找这些变量,而开发板的内存地址是从0X30000000地址开始的,所以需要进行重定位。而Nand启动时内部SRAM只有4K的大小,uboot.bin文件要远大于4K;所以要将uboot.bin文件重定位SDRAM中去执行。


这个版本的uboot默认支持Nor启动,为什么将代码重定位之后,还能执行呢?

可以将uboot复制到内存中的任意位置,复制之后为什么还能够执行,程序会自动修改代码;修改变量和函数的地址。假如原来变量的地址是0x100,将代码复制到0x32000000地址处,在访问这个变量的时候就要使用新地址0x32000100了。那么是修改的时候怎么知道原来的地址呢?这就需要在链接的时候添加"-pie"选项。pie选项的含义是:Create a position independent executable。创建位置无关的可执行程序。


当加上pie选项之后,就会在uboot中生成:

.rel.dyn : {

__rel_dyn_start = .;

*(.rel*)

__rel_dyn_end = .;

}

.dynsym : {

__dynsym_start = .;

*(.dynsym)

}


这两个段。程序在运行时可以根据这个两个段来修改变量和函数的地址。注意,有这两个段之后编译出来的bin文件会大很多。

关键字:JZ2440  移植  uboot 引用地址:JZ2440移植uboot

上一篇:ARM体系结构(1)- 工作模式与工作状态
下一篇:UART协议介绍及编程

推荐阅读最新更新时间:2024-11-13 06:48

S3C6410移植u-boot-2010.3(3)正常化配置
  一、网卡的正常化配置   1、修改头文件调用关系   在原配的smdk6400.h中(因为是复制过来的),网卡配置为CS8900,而手头开发板上的网卡为DM9000,所以第一步来修改网卡驱动程序。   修改/include/configs/smdk6410.h   找到如下字段,更改如下 /* * Hardware drivers */ #define CONFIG_NET_MULTI //#define CONFIG_CS8900 /* we have a CS8900 on-board */ //#define CONFIG_CS8900_BASE 0x18800300
[单片机]
S3C6410<font color='red'>移植</font>u-boot-2010.3(3)正常化配置
如何将lua移植到arm平台的linux内核
将脚本移植到内核是一件很酷的事情,lua已经被移植到NetBSD的内核中,也有一个叫lunatik的项目把lua移植到了linux内核,只可惜只支持x86,不支持arm,在网上搜索了下,没有找到现成的,于是自己研究了下,现将它分享出来。 移植到arm平台,主要是要重新实现setjmp和longjmp两个函数,网上相关的资料很少,最后终于找到一个klibc的项目,里面有setmp和longjmp的arm平台的实现,于是直接拿来用了,不用说,当看到脚本在内核中执行并打印出 hello,world 的时候,还是很exciting的。这里讲下使用的方法,具体的代码可以去下面的位置下载: https://github.com/
[单片机]
ARMLinux驱动移植Watch Dog Timer(看门狗)驱动移植
硬件平台:FL2440 (S3C2440) 内核版本:2.6.28 软件平台:Ubuntu 11.04 内核版本:2.6.39 交叉编译器:arm-linux-gcc 3.4.1 原创作品,转载请标明出处 1、加载看门狗驱动 insmod wdt.ko wdt.ko为驱动文件名,不加任何参数如果不喂狗,则计数器到0时执行中断函数(设置LED的状态,然后喂狗,重新设置WTCNT的值) 可选的参数 module_param(tmr_margin, int, 0); module_param(tmr_atboot, int, 0); module_param(nowayout, int, 0); module_para
[单片机]
ARMLinux驱动<font color='red'>移植</font>Watch Dog Timer(看门狗)驱动<font color='red'>移植</font>
013_STM32程序移植之_DS18B20
1. 测试环境:STM32C8T6 2. 测试模块:DS18B20模块 3. 测试接口: 1. DS18B20模块接口: DS18B20引脚 单片机引脚 VCC--------------------5V GND-------------------GND DATA------------------PB12 2. 串口使用串口一,波特率9600 单片机引脚 CH340引脚 VCC--------------------VCC GND-------------------GND PA9--------------------RXD PA10-------------------TXD 移植测试 测试串口一程序
[单片机]
013_STM32程序<font color='red'>移植</font>之_DS18B20
s3c2440移植openharmony
s3c2440移植openharmony。OpenHarmony是开放原子开源基金会的一个孵化项目,OpenHarmony完全开源开放,OpenHarmony轻量和小型系统比较适合内存小的IOT设备。 OpenHarmony同时提供许多可选的系统组件,设备开发者能够按需配置。系统能够把这些能够选择的组件合成一个系列的系统能力让设备开发者更好的理解和开发。 想对OpenHarmony进行开发、编译、烧录、调测能够使用DevEco Device Tool。 现在的openharmony轻量和小型系统搭建系统环境Windows版本不支持在Windows平台编译,Hi3861除外,其它的只能在Ubuntu平台下编译。
[单片机]
jz2440恢复出厂设置
烧写u-boot 假设这个开发板已经变成了一块砖头,那么我们只能通过op或者eop进行烧写 首先复制u-boot的路径 打开cmd进入路径 接上eop,开发板上电 依次选择,这次烧写到Nor中 烧写完成后断电 拔掉eop的连线 刚刚烧的是Nor Flash,就选择Nor启动 接着把串口打开,倒数到0之前按空格键进去u-boot界面 接好另一条usb的线 下面就可以使用usb进行下载烧写了 烧写kernel 使用u-boot进行烧写 在u-boot界面输入k,选择烧写内核 确定好usb状态后,将需要的文件写进去 串口也会有调试信息 烧写文件系统 使用u-boot进行烧写 在u-boot
[单片机]
<font color='red'>jz2440</font>恢复出厂设置
u-boot-2016.09移植(8)-合并tq210-spl.bin与u-boot.bin
为了方便烧录,我们直接将u-boot.bin追加到tq210-spl.bin后面,组成一个文件。 修改Makefile,定义合并规则: combine: u-boot.bin spl/u-boot-spl.bin FORCE cp $(objtree)/spl/tq210-spl.bin $(objtree)/tmp.bin truncate $(objtree)/tmp.bin -c -s 16K cat $(objtree)/u-boot.bin $(objtree)/tmp.bin cp $(objtree)/tmp.bin $(objtree)/ky-uboot.bin chmod 777 k
[单片机]
u-boot-2016.09<font color='red'>移植</font>(8)-合并tq210-spl.bin与u-boot.bin
基于TMS320DM3730的H.264编码器移植与优化方法研究
H.264/AVC是ISO/IEC和ITU-T联合推出的新一代的视频编码标准。其具有高压缩率、高图像质量、良好的网络亲和性等优点,被广泛的应用于各个视频相关产业中。在相同的图像质量的前提下,和传统的视频标准MPEG-4相比,H.264的码率只有MPEG-4的1/3。但是,H.2 64算法非常复杂,要实现实时编码是比较困难的。因此,如何将H.264编码器进行移植和优化,使其用于实际产品中成为了研究的热点。 DSP芯片技术的快速发展为实现嵌入式多媒体技术提供了可能。TMS320DM3730(简称DM3730)作为TI公司2010年推出的高性能芯片,以其ARM+DSP结构体系、运算速度快、众多多媒体接口等优点成为进行嵌入式系统开发
[单片机]
基于TMS320DM3730的H.264编码器<font color='red'>移植</font>与优化方法研究
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved