x210-2023-03-20

发布者:TranquilSmile最新更新时间:2025-01-13 来源: cnblogs关键字:移植  uboot 手机看文章 扫描二维码
随时随地手机看文章

1、先前移植好的uboot由于是从uboot官网下载一步一步改出来的,所以第一个问题会发现无法保存ENV(通过测试setenv和saveenv bootdelay参数即可知道,saveenv失败,不过MMC0还是能识别到的),另一个问题是没有把DM9000网卡驱动做进去(传输kernel得用tftp服务,后面移植根文件系统大概率需要使用到nfs,用于边改边看挂载点的变化,不过这点就需要开启内核的nfs支持才可以了反倒和uboot关系不太大),其余问题像需要修改默认400MHz时钟至1000MHz、没有打印各时钟频率具体信息等,这次针对的是第一个问题,主要完成MMC驱动移植并能实现ENV参数保存(后面移植发现还需要做多一步保存ENV到特定扇区17,这个相对简单不赘述),芯片平台为S5PV210,uboot源码是2012.10版本的,移植用到的源文件譬如mmc.c、s3c_hsmmc.c等取自三星android_uboot_smdkv210.tar.bz2(其实可以直接从三星评估板所用uboot开始而不必从裸uboot开始,但是由于前面学习过程已经从裸uboot开始并得到了半成品所以选择补充未完成功能然后继续使用)。

首先是第一次移植,结果是没有移植成功,总结来看,问题出在,一次把多个移植步骤都做了(因为网上参考的文章大多数是一些网友已经移植过后的总结,所以他们的文章往往会告诉你后续步骤,所以自然而然地多做了),导致出的错误多,并且有些错误属于连环扣,其实可以不用处理,但是必须要找到真正的错误点入手改正,其余相连的错误也能一起消除,但是由于前面提的原因,导致众多错误混杂在一起,可能结果是改不完,或者改的时候发现有些错误就是死胡同(譬如提示有个系统头文件出了错,但是这个头文件明明都没改动过而且是源码本身自带的,怎么可能有错,但编译之后的确就指向这个文件有一堆错误)。

接着是第二次移植,这次的思路是先找出最基本的init入口函数(一般仅由几个函数构成),然后从第一个函数开始找其所在源文件,然后拿过来放到需要被调用的文件同层文件夹中,根据编译提示逐个解决然后再进行下一个函数或者文件的移植,经过第一次移植的摸索,除了要在配置文件开启或定义宏内容之外,会发现必须要注意到有些源文件会有头文件(有头文件的需要一起配套移植,不过一般需要放到源码包顶层目录底下的include文件夹,而不是放到被调用的文件同层文件夹,查看是否有配套头文件可以在sourceinsight的project file list中看),而有些文件譬如cmd_mcc.c则是没有配套头文件,那么拿过来之后只需要在Makefile中添加好.o依赖确保文件能被编译进工程即可;另外,sourceinsight这次通过relation window查看函数的被调用树依赖变得比较逊色了,因为一个同名内容有很多个文件或板子都包括有(并且sourceinsight中根据提示错误字符串搜索时要注意,还原通配符内容才有可能搜索得到错误的出处,譬如raise:Signal #8 caught就要写成raise:Signal #%d caught才能放进搜索框),而通过ubuntu的uboot源码包grep -nr查找反而更方便,下图是根据cpu_mmc_init()移植完之后的现象。

2、移植完mmc.c后,如下图所示,当然期间也已经处理完了cmd_mmc.c的移植,但是会发现在MMC部分的打印信息多了raise:Signal #8 caught,网上查了基本说是timer或者时钟配置部分的问题(也就是被除数不能为零需要修改timer.c或者可能没有配置成最佳的时钟频率等),改过timer.c发现不行,所以接下来就是配置成1000MHz,看能不能解决问题,但是尝试过移植三星评估板源码包里的system_clock_init,会发现需要删改,因为有一部分内容是相同的只是针对的板子不同而已,而且有些宏需要自己手动展开放到汇编代码里头去,要不然就只能包含所依赖的头文件,但是无论是自动展开还是通过包含头文件的方式都相对麻烦,再一种方式就是用网上整理好的汇编文件,直接.global把标号声明到外部然后调用,但是结果都是到UART和DDR初始化信息打印完就没再继续往下跑。

 3、由于前面尝试无果,所以使用自带的system_clock_init调用,先测试800MHz确实能跑下来,然后改成1000MHz的,但是实际显示现象就是和原来没有变化,所以应该不是时钟问题导致的;再接下来,补充了缺少的MMC相关宏到s5p_goni.h主配置文件,因为一开始追踪代码没查到是哪的问题,后面实在没思路了于是去搜索MMC驱动移植这几个关键字,通过看文章获得的思路提示到其实自己移植过程中有些宏没定义上(恰好移植编译的过程并没有出错提示这方面的信息,所以比较难发现少定义了),譬如USE_MMC0、MMC_MAX_CHANNEL等,添加好以后再编译烧录就得到下图所示。

 4、EXT_CSD问题的解决办法网上有,解决完发现已经可以保存参数了,不过可以看见在没有进行第一次参数保存设置会有一个bad CRC警告,当经过第一次参数保存设置之后这句警告就再没出现了。

 

5、最后,要补充说一些内容,就是解决s3c_hsmmc.c和setup_hsmmc.c移植过程,会发现从三星评估板移植过来的文件用到了一个和现在uboot某个相同名字的头文件,也就是头文件冲突,但是打开发现其实这个头文件hardware.h只是名字相同但存放路径在uboot下并没有,所以只需要在uboot下创建好路径并放进去即可;使用saveenv能保存ENV参数以后需要多尝试几次看是否也能保存;还有就是每次在对一个文件或者一个特定问题进行解决、修改之前,一定要复制备份好一份再开始。


关键字:移植  uboot 引用地址:x210-2023-03-20

上一篇:x210-2023-03-23
下一篇:x210-2023-03-15

推荐阅读最新更新时间:2026-03-25 17:38

2.1 linux中uboot移植
(一)友善之臂介绍: README for FriendlyARM Tiny4412 说明:本u-boot源代码由三星原厂提供,并由友善之臂修改移植,以适用于Tiny4412开发板平台。 仅供嵌入式爱好者学习研究之用,友善之臂不对此提供任何技术支持和维护。 ----------------------------------------------------- 1. Build uboot a) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz)并设置好 环境变量PATH,保证可以正常使用。 b) 解压 uboot_tiny4412-20130729.tgz 并进入相应的
[单片机]
2.1 linux中<font color='red'>uboot</font><font color='red'>移植</font>
uboot在s3c2440上的移植(4)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 在这一篇中,我们首先让开发板对CS8900或者DM9000X网卡的支持,然后再分析实现u-boot怎样来引导Linux内核启动。因为测试u-boot引导内核我们要用到网络下载功能。 7)u-boot对CS8900或者DM9000X网卡的支持。 u-boot-2009.08版本已经对CS8900和DM9000X网卡有比较完善的代码支持(代码在drivers/ne
[单片机]
<font color='red'>uboot</font>在s3c2440上的<font color='red'>移植</font>(4)
uboot-2011.12移植到S3C2440(序二)—— binutils二进制工具集与u-boot
概述 binutils是一组二进制工具集,它包括addr2line、ar、gprof、nm、objcopy、objdumpr、ranlib、size、strings、strip等。 ar软件 ar用于建立、修改、提取库文件。ar至少需要两个参数才能运行,比如: $ ar rv libtest.a add.o minus.o 是指将add.o、minus.o做成库文件libtest.a。其中r是指将文件列表插入归档文件,v是指得到操作版本号。 这样我们引用库文件的时候就可以使用: $ gcc -o test test.c -ltest nm软件 nm软件的作用是现实目标文件的信息和属性,比如: $ nm test.o
[单片机]
uboot-2011.12移植到S3C2440(序四)—— uboot.lds分析与解析
OUTPUT_FORMAT( elf32-littlearm , elf32-littlearm , elf32-littlearm ) ;指定输出可执行文件是elf格式,32位ARM指令,小端 OUTPUT_ARCH(arm) ;指定输出可执行文件的平台为ARM ENTRY(_start) ;指定输出可执行文件的起始代码段为_start. SECTIONS { . = 0x00000000 ; 指明目标代码的起始地址从0x0位置开始, . 代表的是当前位置 . = ALIGN(4) ; 代码以4字节对齐 .text : ;指定代码段 { cpu/arm920t/start
[单片机]
uboot-2011.12移植到S3C2440(序五)——ARM寄存器说明
参考《ARM应用系统开发详解》 ARM体系结构的寄存器R0~R15主要有三类: @未分组寄存器R0~R7 @分组寄存器R8~R14 @PC寄存器R15 未分组寄存器 同一个寄存器名在ARM微处理器内部只有一个独立的物理寄存器与之对应。 分组寄存器 每一个物理寄存器分别与不同的处理器模式相对应。对于R8~R12来说,每个寄存器对应两个不同的物理寄存器,当使用fiq模式时,访问寄存器R8_fiq~R12_fiq;当使用除fiq模式以外的其他模式时,访问寄存器R8_usr~R12_usr。对于于R13、R14来说,每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行
[单片机]
移植u-boot-2010.09到S3C2440(四)——通过BSS段和_start判断uboot大小
BSS(百度百科) 是“Block Started by Symbol”的缩写,意为“以符号开始的块”。 BSS是Unix链接器产生的未初始化数据段。其他的段分别是包含程序代码的“text”段和包含已初始化数据的“data”段。BSS段的变量只有名称和大小却没有值。此名后来被许多文件格式使用,包括PE。“以符号开始的块”指的是编译器处理未初始化数据的地方。BSS节不包含任何数据,只是简单的维护开始和结束的地址,以便内存区能在运行时被有效地清零。BSS节在应用程序的二进制映象文件中并不存在。 uboot代码块占用存储空间大小 查看u-boot.lds,其将BSS放在所有代码段的最后,又从上述得知BSS不占用存储空间,这样,将
[单片机]
uboot-2011.12移植到S3C2440(二)——点亮LED灯,the very beginning。
一般的,在初始的时候,u-boot没有任何调试手段。为了得到u-boot的内部运行状态,使能LED是一个最好的选择。这里不包括使用仿真器。 ldr r0, =GPBUP #设置为上拉 ldr r1, orr r1, r1, #0xe0 str r1, ldr r0, =GPBCON #设置为IO功能 ldr r1, orr r1, r1, #0x5400 str r1, ldr r0, =GPBDAT #输出全部为1 ldr r1, =0xffffffff str r1,
[单片机]
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下,复
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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