官方uboot2013.10版本的移植流程图(包括有道云笔记地址)
- uboot官方版本下载地址:ftp://ftp.denx.de/pub/u-boot/
- uboot下载版本:u-boot-2013.10.tar.bz2
一.选择官方原版uboot
1、官方原版uboot的版本
(2)新版和旧版的差别。uboot的架构很早就定下来了,然后里面普遍公用的东西(common目录下、drivers目录下、fs目录下等···)在各个版本之间几乎是完全一样的。差别最大的是board和cpu目录,这两个目录正是单板(开发板)相关的。越新的uboot版本支持越多的开发板(CPU),所以越新的uboot越庞大。
2、注意:实践工作中一般是从SoC厂商的uboot出发移植的
(1)在工作中一般是不需要从uboot官方版本出发去做移植的,而是从SoC厂商提供的开发板配套的uboot去做移植的。
3.先初步浏览官方原版uboot
工程项目文件和工程中管理的源代码文件目录可以不同,但是我一般习惯放在一起。放在:E:\Linux\winshare\u-boot-2013.10\u-boot-2013.10\SI_Proj
4、主Makefile浏览及boards.cfg文件
(1)2013.10版本的uboot的Makefile中使用了boards.cfg文件,因此在配置uboot时make xxx_config,这个xxx要到boards.cfg文件中查找。
(2)其实就相当于把以前的版本的uboot中各种开发板的配置部分规则抽离出来写到了Makefile中,然后把配置信息部分写到了一个独立文件boards.cfg。
cpu: u-boot-2013.10\arch\arm\cpu\armv7
board: u-boot-2013.10\board\samsung\goni
拷贝UBOOT官方修改后的u-boot-2013.10.zip到ubuntu
原因是因为对只有一个压缩内容的文件来解压的时候才用tar, 而如果压缩包里有多个文件被压缩了,tar命令不能继续工作。可以采用unzip命令去解压。
使用命令:unzip u-boot-2013.10.zip ,解压成功
二、主mkconfig脚本分析
1、脚本功能浏览
(1)首先我们在命令行配置uboot时,是:make s5p_goni_config,对应Makefile中的一个目标。其中 make s5p_goni_config是 s5pc1xx这个单板的一个目标名称
(要针对某个单板进行配置,需要执行: makeNAME_config,其中 NAME 在 boards.cfg 中列出。)
%_config:: unconfig
从这里分析得出结论,实际配置时是调用mkconfig脚本,然后传参2个:-A和s5p_goni
到了mkconfig脚本中,如果参数个数等于 2,而且第 1 个参数等于“ -A”,则执行:
line=`awk '($0 !~ /^#/ && $7 ~ /^'"$2"'$/) { print $1, $2, $3, $4, $5, $6, $7, $8 }' $srctree/boards.cfg`
awk 是一个非常强大的文本处理工具, $srctree 被替换为 u-boot-2014.04,即 u-boot 源码树目录, awk
会读取 u-boot-2014.04/boards.cfg 中的每一行,如果和前面的表达式($0 !~ /^#/ && $7 ~ /^'"$2"'$/)相匹配,
则执行{ print $1, $2, $3, $4, $5, $6, $7, $8 }。
Active arm armv7 s5pc1xx samsung smdkc100 smdkc100 - Minkyu Kang <mk7.kang@samsung.com>
awk 在执行过程中, $0 代表当前整行, 同时将第一个字段存入$1,将第 2 个字段存入$2, 依此类推,
若果当前行不以#开头,而且第 7 个字段和 mkconfig 传进来的第 2 个参数( s5p_goni) 相等,则分别将字段 1~字段 8 输出到 line 中保存,最终得到:
(4)注意在解析完boards.cfg之后,$1到$8就有了新的值。
${7%_config}表示去掉${7}的后缀_config,这里${7}=s5p_goni ,得到
然后在ubuntu中,make s5p_goni_config
(1)include/asm -> arch/arm/include/asm
(1)官方原版的uboot中CROSS_COMPLIE是没有定义的,需要自己去定义。如果没定义就直接去编译,就会用gcc编译。
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
三.先解决官方版本uboot的烧录运行
1.在linux下用烧录脚本来烧录(实质是dd命令进行sd卡扇区写入)
(1)移植原来的版本的uboot中的sd_fusing文件夹到官方uboot版本中,使用这个文件夹中的sd_fusing.sh脚本来进行烧录。烧录启动开发板,串口显示如下
2、分析:为什么烧录运行不正确?
(1)串口接串口2,串口有输出。但是这个串口输出不是uboot输出的,而是内部iROM中的BL0运行时输出的。
第一个SD checksum Error:是第一顺序启动设备SD0(iNand)启动时校验和失败打印出来的;
第二个SD checksum Error:是第二顺序启动设备SD2(外部SD卡)启动时校验和失败打印出来的;
总结:从两个SD checksum Error,可以看出:外部SD卡校验和失败了。
3、解决方案分析
(1)为什么SD卡烧录会出错?可能原因:烧录方法错误、烧录原材料错误。
(2)经过分析,sd_fusing这个文件夹下的mkbl1这个程序肯定没错,上一层目录下的u-boot.bin是存在的,校验和失败不失败和u-boot.bin无关。
(3)经过分析和查找,发现是mkbl1程序和start.S中前16个字节校验和的处理上面不匹配造成的,解决方法是在start.S最前面加上16个字节的占位。(查看之前移植三星uboot文件中的start.S中是有16个字节的占位的这里拷贝到我们的源码中即可)