历史上的今天
今天是:2024年12月15日(星期日)
2021年12月15日 | Exynos4412 Uboot 移植(一)—— Uboot 编译流程分析
2021-12-15 来源:eefocus
Uboot 所用版本 u-boot-2013.01
u-boot-2013.01 中有上千文件,要想了解对于某款开发板,使用哪些文件、哪些文件首先执行、可执行文件占用内存的情况,最好的方法就是阅读它的Makefile。
根据顶层Readme文件的说明:
可以知道如果使用开发板board/ U-Boot.bin:二进制可执行文件,它就是可以直接烧入eMMC中的文件。 U-Boot : ELF格式的可执行文件。 U-Boot.srec : 摩托罗拉格式的可执行文件。 对于Exynos4412开发板,这里用的其实是Fs4412,执行“make fs4412_config"、“make all"后生成的u-boot-fs4412.bin可以烧入eMMC中执行。 一、U-Boot 配置过程 1、在顶层Makefile中可以看到如下代码: 假定在u-boot-2013.01的根目录下编译,则其中的MKCONFIG 就是根目录下的mkconfig文件(mkconfig是shell脚本文件)。 %_config是GUNmake语法层,表示的是所有以".config"结尾的文件。$(@:_config=)的结果就是将“fs4412"中的“——config”去掉,结果为fs4412。 MKCONFIG 就是执行mkconfig。 所以 “make fs4412_config"实际上就是执行如下命令: ./mkconfig fs4412 arm armv7 fs4412 samsung exynos 2、mkconfig 的作用 前面已经提到,mkconfig就是一shell脚本, 具体作用如下: a -- 解析boards.cfg fs4412相关数据 这是我们自行添加的.确定开发板名称BOARD_NAME。 b -- 针对平台作了一系列链接,创建到平台、开发板相关的头文件的链接。 c --创建顶层Makefile包含的文件 include/ config.mk inlucde / config.mk 内容如下: d -- 创建开发板相关的头文件inlucde/config.h Include/config.h导出结果如下: U-Boot 还没有类似Linux一样的可视化配置界面(比如使用 make menuconfig 来配置),要手动修改配置文件 inlucde/config/ 配置文件中有以下两类宏。 1) 一类是选项(Options),前缀为“CONFIG”,它们用于选择CPU、SOC、开发板类型,设置系统时钟、选择设备驱动等。 2)另一类是参数(Setting),前缀为“CFG_”,它们用于设置malloc缓冲池的大小、U-Boot 下载文件时的默认加载地址、Flash的起始地址等。 uboot 执行通过宏来判断:宏在头文件中定义。 #ifdef CONFIG_TEST run_test(); #endif 某头文件 #define CONFIG_TEST 可以这样认为,“CONFIG_”除了设置一些参数外,主要用来设置U-Boot的功能、选择使用文件中的哪一部分;而“CFG_”用来 设置更细节的参数。 二、U-Boot 的编译、链接过程 配uboot 编译通过Makefile来判断: obj-y += xx.o xx.o 在编译时,只编译obj-y obj-$(CONFIG_XX) = xx.o xx.o 如果CONFIG_XX为y,则此文件会被编译进u-boot.bin置完后,执行“make all” 即可编译: 找第一个目标all: 上面代码是对u-boot进行格式转换,变成二进制bin格式之后,再加一些校验与4412开如平台加密信息。 依赖u-boot: 先总结一下U-Boot 的编译流程: a -- 首先编译 cpu /$(CPU)/start.S,对于不同的CPU,还可能编译 cpu/$(CPU)下的其他文件; b -- 然后,对于平台/开发板相关的每个目录、每个通用目录都使用它们个字的Makefile生成相应的库; c -- 将a、b 步骤生成的.o .a文件按照 board / $(BOARDDIR)/config.mk文件中指定的代码段起始地址、board/$(BOARDDIR)/config.mk文件中指定的代码段起始地址、board/$(BOARDDIR)/U-Boot.lds链接脚本进行链接。 d -- 第c步得到的是ELF格式的U-Boot,后面的Makefile还会将它转换成二进制格式、S-Record格式。









史海拾趣
|
CPU是STM32F103CB,无操作系统。 通过UART1接受GPRS发来的数据,在中断函数中 USART1_IRQHandler 中进行处理 unsigned char a_GPRSData[500]; unsigned int g_DataLength; void USART1_IRQHandler(void) ...… 查看全部问答> |
|
是一个U盘感染的病毒,在D盘中出现一个autorun.inf文件,同时点D盘右健会多一个\"浏览\"项,而这个文件的内容是: [autorun] open=.\\recycled\\info.exe shell\\1=浏览 shell\\1\\Command=.\\recycled\\info.exe shellexecute=.\\recycled\\info. ...… 查看全部问答> |
|
#include sbit ds=P3^7; //0-F数码管显示(共阴) unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-9数码管的显示,共阴带小数点 unsigned char code tabledot[]={ ...… 查看全部问答> |
|
使用的是ep2s180f1020i4的片子,配置芯片epcs64,用flash programmer 进行烧写,从状态栏来看 烧写成功了,但是上电后没有任何反应,不止nios没跑起来,连逻辑都没烧进去,但是在线运行时是正常的,单独烧写逻辑从新上电也是可以起来的,就是用nios ...… 查看全部问答> |
|
经过再三调试,我人生的第一版开关电源诞生了,激动ing,不过也仍有很多问题没有解决!希望高手指教!这里好像不能传附件啊,详细过程在下面链接里面了,有兴趣的亲可以看看,多多指教!… 查看全部问答> |








