mini2440系统移植篇之u-boot分析

发布者:BlissfulJoy最新更新时间:2016-12-01 来源: eefocus关键字:mini2440  系统移植  u-boot 手机看文章 扫描二维码
随时随地手机看文章

1. Bootloader概念

系统上电后,需要一段程序来初始化重要的硬件,有些程序是固化在固件firmwware上的,如PC的BIOS。然后是Bootloader,如PC上的GRUB。对于嵌入式系统来说,一般只有Bootloader,它负责初始化内核运行的硬件环境,如内存,然后调用操作系统内核。一般最终产品它只需要启动内核就足够了,为了方便开发,还可以增强Bootloader功能,比如网络功能,通过网络下载文件,烧写文件到Flash中。


2. 嵌入式系统结构

嵌入式系统一般包含4部分。

1、引导加载程序,包括固化在固件的boot代码(可选)和Bootloader。

2、Linux内核

3、文件系统,包括根文件系统和其他挂载的文件系统。从某方面说,Android也属于嵌入式,只是它的文件系统比较庞大,比QT漂亮而已。

4、用户应用程序,就是如计数器之类的应用。


3. U-Boot

U-Boot全称Universal Boot Loader,即通用Bootloader。确实,现在很多公司的bootloader都采用u-boot,基本上成为标准。u-boot可以看成是一个大型的裸机程序,它的优点是集成了很多好用的工具,命令,支持很多平台。


4. U-Boot配置

4.1. Makefile

u-boot要经过配置、编译、连接过程。先说配置,从readme文件可以知道,要使用开发板board/,要先make _config。比如我的2440开发板,make hyq2440_config。首先要修改makefile,增加编译选项

hyq2440_config:unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t hyq2440 samsung s3c24x0

unconfig是一些清理事情,不重要,根据makefile目标依赖命令的原理,分析一下@$(MKCONFIG) $(@:_config=) arm arm920t hyq2440 samsung s3c24x0

做了什么事情。makefile的前面定义了MKCONFIG := $(SRCTREE)/mkconfig,STRTREE就是当前目录,所以MKCONFIG就是源码根目录下的mkconfig。$(@:_config=) 展开就是hyq2440_config。所以就变成

mkconfig hyq2440 arm arm920t hyq2440 samsung s3c24x0

$0   $1     $2   $3      $4       $5      $6


4.2. mkconfig

进入mkconfig看看干了什么事情。


4.2.1. 确定开发板名称BOARD_NAME

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"。定义了BOARD_NAME = hyq2440。


4.2.2. 创建平台相关的头文件链接

ln -s ${SRCTREE}/include/asm-$2 asm。创建链接ln -s asm-arm asm。

ln -s ${LNPREFIX}arch-$6 asm-$2/arch。创建链接ln -s arch-s3c24x0 asm-arm/arch


4.2.3. 创建顶层makefile包含的文件include/config.mk

echo "ARCH   = $2" >  config.mk

echo "CPU    = $3" >> config.mk

echo "BOARD  = $4" >> config.mk

则config.mk配置文件内容为:

ARCH = arm

CPU = arm920t

BOARD = hyq2440

VENDOR = samsung

SOC = s3c24x0


4.2.4. 创建开发板相关头文件config.h

echo "#include " >>config.h

echo "#include " >>config.h

> config.h 表示新建文件

/* Automatically generated - do not edit */

#include 

#include 

从配置中可以知道,如果在board新建一个开发板,则在include/configs目录下要建一个.h的头文件。


4.3. 配置文件

1、这个文件主要用来定制u-boot的功能,比如:

/*----------------------------------体系配置----------------------------------*/

#define CONFIG_ARM920T 1 /* This is an ARM920T Core */

#define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2440 SoC  */

#define CONFIG_HYQ2440 1 /* in a HYQ2440 Board  */

 

/*---------------------------------内存配置--------------------------------------*/

#define CONFIG_NR_DRAM_BANKS  1    /* we have 1 bank of DRAM */

#define PHYS_SDRAM_1     0x30000000 /* SDRAM Bank #1 */

#define PHYS_SDRAM_1_SIZE     0x04000000 /* 64 MB */

 

/*--------------------------------Nor Flash驱动配置-----------------------------*/

#define PHYS_FLASH_1         0x00000000 /* Flash Bank #1 */

#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1

#define CONFIG_SYS_MAX_FLASH_BANKS 1 /* max number of memory banks */

#define CONFIG_AMD_LV160B         1

#define PHYS_FLASH_SIZE         0x00200000 /* 2MB */

#define CONFIG_SYS_MAX_FLASH_SECT (35) /* max number of sectors on one chip */

#define CONFIG_SYS_FLASH_ERASE_TOUT (5*CONFIG_SYS_HZ) /* Timeout for Flash Erase */

#define CONFIG_SYS_FLASH_WRITE_TOUT (5*CONFIG_SYS_HZ) /* Timeout for Flash Write */

需要哪些代码有效,就开启响应的宏。


5. U-Boot编译链接

先编译u-boot,从编译的log反过来看u-boot编译链接过程。

cd /home/share/hyq-u-boot-2009.11/trunk/hyq-u-boot 

&& 

arm-linux-ld -Bstatic -T u-boot.lds  -Ttext 0x33f80000 

$UNDEF_SYM cpu/arm920t/start.o 

--start-group 

lib_generic/libgeneric.a 

lib_generic/lzma/liblzma.a 

lib_generic/lzo/liblzo.a 

cpu/arm920t/libarm920t.a 

cpu/arm920t/s3c24x0/libs3c24x0.a 

lib_arm/libarm.a fs/cramfs/libcramfs.a 

fs/fat/libfat.a fs/fdos/libfdos.a 

fs/jffs2/libjffs2.a 

fs/reiserfs/libreiserfs.a 

fs/ext2/libext2fs.a 

fs/yaffs2/libyaffs2.a 

fs/ubifs/libubifs.a 

net/libnet.a 

disk/libdisk.a 

drivers/bios_emulator/libatibiosemu.a 

drivers/block/libblock.a 

drivers/dma/libdma.a 

drivers/fpga/libfpga.a 

drivers/gpio/libgpio.a 

drivers/hwmon/libhwmon.a 

drivers/i2c/libi2c.a 

drivers/input/libinput.a 

drivers/misc/libmisc.a 

drivers/mmc/libmmc.a drivers/mtd/libmtd.a 

drivers/mtd/nand/libnand.a 

drivers/mtd/onenand/libonenand.a 

drivers/mtd/ubi/libubi.a 

drivers/mtd/spi/libspi_flash.a 

drivers/net/libnet.a 

drivers/net/phy/libphy.a 

drivers/net/sk98lin/libsk98lin.a 

drivers/pci/libpci.a 

drivers/pcmcia/libpcmcia.a 

drivers/power/libpower.a 

drivers/spi/libspi.a 

drivers/rtc/librtc.a 

drivers/serial/libserial.a 

drivers/twserial/libtws.a 

drivers/usb/gadget/libusb_gadget.a 

drivers/usb/host/libusb_host.a 

drivers/usb/musb/libusb_musb.a 

drivers/usb/slave/libusb_slave.a 

drivers/video/libvideo.a 

drivers/watchdog/libwatchdog.a 

common/libcommon.a 

libfdt/libfdt.a 

api/libapi.a 

post/libpost.a 

board/samsung/hyq2440/libhyq2440.a 

 

--end-group /home/share/hyq-u-boot-2009.11/trunk/hyq-u-boot/lib_arm/eabi_compat.o 

-L /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t 

-lgcc -Map u-boot.map -o u-boot

arm-linux-objcopy -O srec u-boot u-boot.srec

arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin

从编译log看出,使用链接脚本u-boot.lds来编译,最后生成的起始地址是0x33f80000,把各个平台和驱动下面的libxxx.a链接进来,最后生成u-boot.bin二进制文件。链接脚本对应的是cpu体系下各自的u-boot.lds,

5.1. 链接脚本

SECTIONS

{

. = 0x00000000;

 

. = ALIGN(4);

.text :

{

cpu/arm920t/start.o (.text)

board/samsung/hyq2440/lowlevel_init.o (.text)

board/samsung/hyq2440/nand_read.o (.text)

*(.text)

}

 

. = ALIGN(4);

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

 

. = ALIGN(4);

.data : { *(.data) }

 

. = ALIGN(4);

.got : { *(.got) }

 

. = .;

__u_boot_cmd_start = .;

.u_boot_cmd : { *(.u_boot_cmd) }

__u_boot_cmd_end = .;

 

. = ALIGN(4);

__bss_start = .;

.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }

_end = .;

}

链接脚本指定镜像中代码段text,只读数据段rodata,全局初始化数据区data,u-boot命令和全局未初始化数据区bss的排列位置。并且知道,第一段代码是cpu/arm920t/start.o,对应目录下的汇编文件start.S。


关键字:mini2440  系统移植  u-boot 引用地址:mini2440系统移植篇之u-boot分析

上一篇:mini2440系统移植篇之kernel启动流程
下一篇:S3C2440上触摸屏驱动

推荐阅读最新更新时间:2024-03-16 15:22

OK6410A 开发板 (三) 2 u-boot-2018.09 ethernet 解析
u-boot-2018.09(源码基于https://download.csdn.net/download/Golden_Chen/11998917) 现状 1. 检查当前局域网可用ip $ nmap -sP 10.10.11.* 2. 设置 u-boot ip 相关变量 setenv gatewayip 10.10.11.254 setenv ipaddr 10.10.11.120 setenv serverip 10.10.11.57 setenv netmask 255.255.255.0 3. ping 局域网主机 OK6410 # ping 10.10.11.57 Unknown command 'ping
[单片机]
NIOS软核处理器的Linux引导程序U-boot设计
摘要:针对将cClinux向Nios处理器移植过程中的启动加载程序U-boot bootloader进行研究。首先介绍移植的步骤,然后利用bootloader的设计思想,着重讨论U-boot在Nios中的设计与实现,最后对U-boot在基于Linux的嵌入式系统 中的运用作了探索和展望。 关键词:U-boot bootloader uClinux Nios软核 1 概述 1.1 Nios简介 Nios是Altera公司以RISC为基础的可配置、可裁减软核处理器。它具有16位指令集和16/32位数据通路,通过将包括16或32位高性能处理器在内的移种应用模块嵌入到通用FPGA/CPLD内,实现完全可配置的嵌入式系统。其开发套件
[应用]
uboot-2011.12移植到S3C2440(一)—— 简单修改使u-boot能够编译
交叉编译环境为Fedora14和友善之臂做的交叉编译工具链 1、修改boards.cfg,添加红色的一行 smdk2400 arm arm920t - samsung s3c24x0 smdk2410 arm arm920t - samsung s3c24x0 smdk2440 arm arm920t - samsung s3c24x0 2、在$(SOURCEDIR)/u-boot-2011.06/board/samsung下,复
[单片机]
U-Boot在FL2440上移植(二)----支持NOR Flash
一 选择NOR flash型号 我的开发板上的nor flash芯片是Intel的JS28F320(4MB)(1device=32blocks,1block=128MB fl2440默认是nandflash启动,norflash启动只需将跳线帽J5拔掉就可以了 1. 把开发板的配置文件fl2440.h(/include/configs/fl2440.h)中关于flash的配置部分都删掉,换成下面的配置: #define CONFIG_NR_DRAM_BANKS 1 #define PHYS_SDRAM_1 0x30000000 #define PHYS_SDRAM_1_SIZE 0x040
[单片机]
U-boot-2014.04移植到MINI2440(3) Makefile分析
上一篇帖子翻译和分析了下README,这篇帖子打算分析一下Makefile,分析过程参照韦东山的视频,以及网上一些帖子,在此对他们的工作表示感谢。 首先,什么是Makefile?我们知道u-boot下面有很多的目录和文件,最终生成一个u-boot.bin需要编译进去很多的文件,哪些先编译,哪些后编译,用什么编译器等等,我们在编译的时候只输入了make这个指令,但其实做了很多事,这些事是谁做的,就是Makefile,它这些文件有序的串联起来,组织它们之间的关系,替我们管理了它们。Makefile有自己的语法规则,就像C和C++一样,可以极大的提高软件的开发效率。下面开始具体分析。 版本:U-BOOT-2014.04 编译
[单片机]
U-boot-2014.04移植到<font color='red'>MINI2440</font>(3) Makefile分析
基于mini2440的按键中断控制LED(裸机代码)
#define GLOBAL_CLK //相当于定义了FCLK,HCLK,PCLK,UCLK #include def.h #include option.h #include mmu.h #include 2440addr.h #define LED1_on rGPBDAT = ((0xf 5)^(1 5)) //GPB5=0 #define LED2_on rGPBDAT = ((0xf 5)^(1 6)) //GPB6=0 #define LED3_on rGPBDAT = ((0xf 5)^(1 7)) //GPB7=0 #define LED4_on rGPBDAT = ((0xf 5)^(1 8))
[单片机]
mini2440采用minitools工具烧写系统或裸机程序方法
(1)、先使用Jlink软件烧写Superboot2440.bin文件到NOR FLASH中,此时S2开关拨在NOR位置。 a、 加载工程:File - Open project - 选择s3c2440a_embedclub.jflash(类似的也行) b、加载文件:File - Open data File - 选择Superboot2440.bin - 地址为0 c、连接和下载:Target - Connect - (连接成功后) - Auto - (完成下载)- Disconnect (2)、拔掉Jlink线,然后接上USB,如果是第一次使用会提示安装USB驱动(如果没反应,就重启一下开发板),第二次之
[单片机]
<font color='red'>mini2440</font>采用minitools工具烧写系统或裸机程序方法
Mini2440开发板:U-boot-2008-10之支持nand flash驱动K9F1G08U0B
U-Boot版本:U-boot 2008.10 目标板:Mini2440 Nandflash型号: K9F1G08U0B 256M 修改include/configs/mini2440.h。 1)添加命令支持: #define CONFIG_CMD_ELF #define CONFIG_CMD_NAND 2)添加nand flash 参数设置: /*nand flashsettings******************************************************************************************/ #define CFG_NA
[单片机]
<font color='red'>Mini2440</font>开发板:U-boot-2008-10之支持nand flash驱动K9F1G08U0B
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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