I-mx257
u-boot-2009.08/cpu/arm926ejs
u-boot-2009.08/board/freescale
u-boot-2009.08/board/freescale/mx25_3stack
(1)、分析Makefile
首先我们分析Makefile,很容易发现在3210-3214行中,新增加了:
mx25_3stack_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm926ejs mx25_3stack freescale mx25
mx28_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm926ejs mx28 freescale mx28 |
mx25_3stack_config 是针对 IMX25x 系列的开发板
è ./mkconfig mx25_3stack arm arm926ejs mx25_3stack freescale mx25
mx28_config 是针对 IMX28x 系列的开发板
è ./mkconfig mx28 arm arm926ejs mx28 freescale mx28
当我们运行makefile时,实际上运行的是上面的命令,下面我们来分析一下mkconfig。
./mkconfig mx25_3stack arm arm926ejs mx25_3stack freescale mx25
(2)、分析mkconfig
然后,我们来分析配置过程mkconfig,去掉它跟我们无关的代码:
#./mkconfig mx25_3stack arm arm926ejs mx25_3stack freescale mx25 # $0 $1 $2 $3 $4 $5 $6
APPEND=no # Default: Create new config file BOARD_NAME='' # Name to print in make output
[ '${BOARD_NAME}' ] || BOARD_NAME='$1' #=> 单板的名字:BOARD_NAME = mx25_3stack
echo 'Configuring for ${BOARD_NAME} board...' #=> 接下来会打印这句话
# Create link to architecture specific headers cd ./include rm -f asm ln -s asm-$2 asm #=> ln -s asm-arm asm # 在include下生成一个指向asm-arm的链接文件
rm -f asm-$2/arch #=> rm -f asm-arm arch
ln -s ${LNPREFIX}arch-$6 asm-$2/arch #=> ln -s arch-mx25 asm-arm/arch # 在include/asm-arm 下生成一个指向arch-mx25的链接文件
if [ '$2' = 'arm' ] ; then rm -f asm-$2/proc ln -s ${LNPREFIX}proc-armv asm-$2/proc #=> ln -s arch-mx25 asm-arm/arch # 在include/asm-arm 下生成一个指向asm-arm/proc的链接文件 fi
# # Create include file for Make # echo 'ARCH = $2' > config.mk echo 'CPU = $3' >> config.mk echo 'BOARD = $4' >> config.mk # 生成config.mk 文件 内容如下: # ARCH = arm # CPU = arm926ejs # BOARD = mx25_3stack
[ '$5' ] && [ '$5' != 'NULL' ] && echo 'VENDOR = $5' >> config.mk # $5 = freescale 在config.mk中添加 # VENDOR = freescale
[ '$6' ] && [ '$6' != 'NULL' ] && echo 'SOC = $6' >> config.mk # $6 = mx25 在config.mk中添加 # SOC = mx25
# Create board specific header file > config.h # Create new config file
echo '/* Automatically generated - do not edit */' >>config.h echo '#include echo '#include ' >>config.h
#新建一个config.h文件,并添加以上信息
exit 0 |
从上面的mkconfig简化代码,我们得知,mkconfig中主要功能就是:
定义一些链接文件,生成config.mk、config.h内容如下:
可以看出,config.mk 和config.h 文件中的代码和我们分析的一模一样。
(3)、分析编译过程
分析编译过程 ,我们还是分析Makefile
157 # load ARCH, BOARD, and CPU configuration 158 include $(obj)include/config.mk 159 export ARCH CPU BOARD VENDOR SOC #紧跟上面的配置过程,这里mkconfig.mk就是上一步生成的一些开发板的相关信息
172 OBJS = cpu/$(CPU)/start.o # OBJS = cpu/arm926ejs/start.o
186 LIBS = lib_generic/libgeneric.a
191 LIBS += cpu/$(CPU)/lib$(CPU).a # LIBS += cpu/ arm926ejs/lib arm926ejs.a
254 LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).a 255 LIBBOARD := $(addprefix $(obj),$(LIBBOARD)) # LIBBOARD = board/ freescale /mx25_3stack/libmx25_3stack.a
295 ALL += $(obj)u-boot.srec $(obj)u-boot.bin $ (obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) 296 all: $(ALL)
280 U_BOOT_NAND = $(obj)u-boot-nand.bin 285 U_BOOT_ONENAND = $(obj)u-boot-onenand.bin
302 $(obj)u-boot.srec: $(obj)u-boot 303 $(OBJCOPY) -O srec $< $@
305 $(obj)u-boot.bin: $(obj)u-boot 306 $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@ #这个u-boot是一个elf格式 的可执行文件
450 $(obj)System.map: $(obj)u-boot 451 @$(call SYSTEM_MAP,$<) > $(obj)System.map
|
在boardfreescalemx25_3stack的u-boot.lsd链接脚本中,定义了,所有数据在内存中的排放方式
在config.mk中定义了数据排放的地址
LDSCRIPT := $(SRCTREE)/board/$(VENDOR)/$(BOARD)/u-boot.lds
TEXT_BASE = 0x83F00000 |
在 u-boot.lsd中定义了排放顺序
. = 0x00000000; #从config.mk知,下面的数据从TEXT_BASE = 0x83F00000开始排放
. = ALIGN(4); .text : { #代码段排放顺序 board/freescale/mx25_3stack/dcdheader.o (.text) cpu/arm926ejs/start.o (.text) *(.text) } #所有文件的只读数据段 . = ALIGN(4); .rodata : { *(.rodata) } #所有文件的数据段 . = ALIGN(4); .data : { *(.data) }
. = ALIGN(4); .got : { *(.got) }
. = .; __u_boot_cmd_start = .; #所有文件的u_boot_cmd段,u-boot自定义的段 .u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd_end = .;
. = ALIGN(4); __bss_start = .; .bss : { *(.bss) } _end = .; |
从上面得知,我们的代码将会从
我们代码的运行顺序是 dcdheader.s => start.s => *
所以我们,从dcdheader.s 和 start.s 开始分析
(4)、分析第一阶段start.s分析
第一阶段:dcdheader.s和start.s分析
cdcheader.s中主要是对开发板的一些内存MDDR,DDR2等的一些初始化,看不懂可以跳过
.extern reset
#define DCDGEN(i,type, addr, data) dcd_##i: ; .long type ; .long addr ; .long data
.globl _initheader _initheader: b reset .org 0x400 app_code_jump_v: .long reset app_code_barker: .long 0xB1 app_code_csf: .long 0 hwcfg_ptr_ptr: .long hwcfg_ptr super_root_key: .long 0 hwcfg_ptr: .long dcd_data app_dest_ptr: .long TEXT_BASE dcd_data: .long 0xB17219E9
#ifdef MXC_MEMORY_MDDR dcd_len: .long 12*15 #else dcd_len: .long 12*24 #endif
/* WEIM config-CS5 init -- CPLD */ DCDGEN( 1, 4, 0xB8002050, 0x0000D843) /* CS5_CSCRU */ DCDGEN( 2, 4, 0xB8002054, 0x22252521) /* CS5_CSCRL */ DCDGEN( 3, 4, 0xB8002058, 0x22220A00) /* CS5_CSCRA */ #ifdef MXC_MEMORY_MDDR /* MDDR init */ DCDGEN( 4, 4, 0xB8001010, 0x00000004) /* enable mDDR */ DCDGEN( 5, 4, 0xB8001000, 0x92100000) /* precharge command */ DCDGEN( 6, 1, 0x80000400, 0x12344321) /* precharge all dummy write */ DCDGEN( 7, 4, 0xB8001000, 0xA2100000) /* auto-refresh command */ DCDGEN( 8, 4, 0x80000000, 0x12344321) /* dummy write for refresh */ DCDGEN( 9, 4, 0x80000000, 0x12344321) /* dummy write for refresh */ DCDGEN(10, 4, 0xB8001000, 0xB2100000) /* Load Mode Reg command - cas=3 bl=8 */ DCDGEN(11, 1, 0x80000033, 0xda) /* dummy write -- address has the mode bits */ DCDGEN(12, 1, 0x81000000, 0xff) /* dummy write -- address has the mode bits */ DCDGEN(13, 4, 0xB8001000, 0x82216880) DCDGEN(14, 4, 0xB8001004, 0x00295729) #else /* DDR2 init */ DCDGEN( 4, 4, 0xB8001004, 0x0076E83A) /* initial value for ESDCFG0 */ DCDGEN( 5, 4, 0xB8001010, 0x00000204) /* ESD_MISC */ DCDGEN( 6, 4, 0xB8001000, 0x92210000) /* CS0 precharge command */ DCDGEN( 7, 4, 0x80000f00, 0x12344321) /* precharge all dummy write */ DCDGEN( 8, 4, 0xB8001000, 0xB2210000) /* Load Mode Register command */ DCDGEN( 9, 1, 0x82000000, 0xda) /* dummy write Load EMR2 */ DCDGEN(10, 1, 0x83000000, 0xda) /* dummy write Load EMR3 */ DCDGEN(11, 1, 0x81000400, 0xda) /* dummy write Load EMR1; enable DLL */ DCDGEN(12, 1, 0x80000333, 0xda) /* dummy write Load MR; reset DLL */
DCDGEN(13, 4, 0xB8001000, 0x92210000) /* CS0 precharge command */ DCDGEN(14, 1, 0x80000400, 0x12345678) /* precharge all dummy write */
DCDGEN(15, 4, 0xB8001000, 0xA2210000) /* select manual refresh mode */ DCDGEN(16, 4, 0x80000000, 0x87654321) /* manual refresh */ DCDGEN(17, 4, 0x80000000, 0x87654321) /* manual refresh twice */
DCDGEN(18, 4, 0xB8001000, 0xB2210000) /* Load Mode Register command */ DCDGEN(19, 1, 0x80000233, 0xda) /* Load MR; CL=3, BL=8, end DLL reset */ DCDGEN(20, 1, 0x81000780, 0xda) /* Load EMR1; OCD default */ DCDGEN(21, 1, 0x81000400, 0xda) /* Load EMR1; OCD exit */ DCDGEN(22, 4, 0xB8001000, 0x82216080) /* normal mode */ DCDGEN(23, 4, 0x43FAC454, 0x00001000) /* IOMUXC_SW_PAD_CTL_GRP_DDRTYPE(1-5) */ #endif
DCDGEN(99, 4, 0x53F80008, 0x20034000) /* CLKCTL ARM=400 AHB=133 */ card_cfg: .long UBOOT_IMAGE_SIZE |
start.s主要的功能就是:
关闭看门狗,初始化时钟,初始化SDRAM,设置栈,读出内核,跳到内核启动的C函数开始启动内核。
.globl reset reset: /** set the cpu to SVC32 mode 设置为SVC32管理模式*/
[1] [2]
关键字:U-Boot
引用地址:EasyARM-iMX257_U-Boot源代码移植分析
声明:本文内容及配图由平台用户或入驻媒体撰写。文章观点仅代表作者本人,不代表EEWorld网站立场。文章及其配图仅供工程师学习之用,如有内容侵权或违规,请联系本站处理,邮箱地址:bbs_service@eeworld.com.cn
上一篇:IMX257实现GPIO-查询按键驱动程序
0
推荐阅读最新更新时间:2024-08-26 17:00
TQ2440之uboot---5.jlink 在线调试 u-boot
1. 首先修改u-boot源码的两个文件 1.1 将u-boot根目录下的config.mk, #DBGFLAGS= -g 改成:DBGFLAGS= -gdwarf-2 1.2 将 u-boot/cpu/arm920t/config.mk 中的 PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) 改成: PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(call cc-option,-mabi=apcs-gnu),) 附录中有解释。 改好后 make Embed
[单片机]
基于S3C2440A的嵌入式U-BOOT千兆网络功能设计
U—BooT支持网络功能,在下载操作系统内核和大的文件系统时,比其它不支持网络的引导加载程序速度更快、更方便。目前U—BOOT仅支持10M/100M的网络功能,随着科学技术发展,千兆网络功能必将大量应用在嵌入式系统中。本文介绍了一种让U—BOOT支持千兆网络功能的方法,可以使U—BOOT功能更加强大,使用更加方便。 U—BOOT简介 U—BOOT的全称是Universal Boot Loader,它遵循GPL条款的开放源码项目,支持多种处理器,如ARM、PowerPC、MIPS等,也支持Linux、VxWorks、QNX、RTEMS、ARTOS、LynxOS等嵌入式操作系统。 U-BOOT包含两种不同的工作模式:启动加载模式和
[单片机]
U-Boot在S3C2410上的移植
引言
U-Boot是用于初始化目标板硬件,为嵌入式操作系统提供目标板硬件配置信息,完成嵌入式操作系统装载、引导和运行的固件程序。它能够将系统的软硬件紧密衔接在一起。S3C2410是三星公司的一款基于ARM920T核的嵌入式通用处理器。本文将详细介绍U-Boot在S3C2410开发板上的移植与运行。
U-BOOT简介
U-Boot支持ARM、 PowerPC等多种架构的处理器,也支持Linux、NetBSD和VxWorks等多种操作系统。它提供启动加载和下载两种工作模式。启动加载模式也称自主模式,一般是将存储在目标板Flash中的内核和文件系统的镜像装载到SDRAM中,整个过程无需用户的介入。在使用嵌入式产品时,一
[嵌入式]
移植u-boot-1.1.6之mtdparts分区
和u-boot高版本不同,mtdparts命令没有cmd_mtdparts这么一个单独的文件来实现。 不过,搜索uboot可以在cmd_jffs2.c里面看到如下代码: 1 U_BOOT_CMD( 2 mtdparts, 6, 0, do_jffs2_mtdparts, 3 mtdparts- define flash/nand partitionsn , 4 n 5 - list partition tablen 6 mtdparts delalln 7 - delete all partitionsn 8 mtdparts del part-idn 9
[单片机]
I.MX6Q(TQIMX6Q/TQE9)学习笔记——U-Boot移植
其实Freescale的BSP移植文档已经将u-boot的移植步骤讲述的非常详细了,但为了以后方便查阅,还是按照自己的理解记录在这里。 获取源码 根据前一篇文章搭建好LTIB环境后就可以非常方便的导出u-boot源码了。切换到ltib目录,并运行如下指令: ./ltib -m prep -p u-boot 该指令执行需要一些时间,指令执行完成后Freescale维护的u-boot-2009.8就会出现在rpm/BUILD目录下。 添加单板 为TQIMX6Q开发板创建相应的单板目录,可以参考sabresd相关的目录进行,下面是具体的步骤。 Step1. 创建board目录 创建board目录需要以下几步:
[单片机]
基于S3C2410开发板的U-BOOT移植解决方案
引言 随着嵌入式系统的日趋复杂,它对大容量数据存储的需求越来越紧迫。而嵌入式设备低功耗、小体积以及低成本的要求,使硬盘无法得到广泛的应用。NAND闪存设备就是为了满足这种需求而迅速发展起来的。目前关于U-BOOT的移植解决方案主要面向的是微处理器中的NOR 闪存,如果能在微处理器上的NAND 闪存中实现U-BOOT的启动,则会给实际应用带来极大的方便。 U-BOOT简介 U-BOOT 支持ARM、 PowerPC等多种架构的处理器,也支持Linux、NetBSD和VxWorks等多种操作系统,主要用来开发嵌入式系统初始化代码bootloader。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操
[单片机]
第一章、Tiny4412 U-BOOT移植一 说明
一、移植前说明: 1、 特别声明:此文档是我的学习文档,里面肯定有错误地方,仅供参考! 2、移植平台:友善之臂Tiny4412SDK1306平台。 3、移植系统:Ubuntu12.04 4、移植原始CODE:平台光盘中由Samsung提供的U-Boot-samsung-dev.tar.bz2。为什么用这个,只能说因为我也菜鸟,我找了u-boot官网最新的代码看了一下,我没有在boardsamsung目录下找到与Exynos4412芯片很相关的平台目录,估计是有的,只是由于我很菜,不清楚是那一个,为了省自学时间,还是用三星提供的U-Boot源码。 5、参考文档:各相关手册,主要手册是Exynos4412 RISC Microproc
[单片机]
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
[单片机]
猜您喜欢
更多
小广播
添点儿料... 无论热点新闻、行业分析、技术干货…… 发布文章
推荐内容
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐
最新单片机文章
何立民专栏
单片机及嵌入式宝典
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。
更多精选电路图
换一换
更多
相关热搜器件
更多热门文章
更多每日新闻
更多往期活动
08月27日历史上的今天
厂商技术中心
最能打国产芯 TI 培训 Qorvo 电源技术站 Vicor技术站
随便看看
|