【嵌入式】从零开始移植U-boot到mini2440(一)——U-boot编译篇

发布者:HeavenlyMelody最新更新时间:2022-06-20 来源: eefocus关键字:移植  U-boot  mini2440 手机看文章 扫描二维码
随时随地手机看文章

U-boot版本:2020/5/2

编译环境:Ubuntu 16.04

arm-none-eabi-gcc version 4.9.3 20150529 (prerelease) (15:4.9.3+svn231177-1)

运行环境:mini2440(s3c2440,arm920t)

代码仓库:git@github.com:JingyeLi/u-boot_2440.git

commit hash:45516b370859b022b9bf2c9fb87318b1fa2d34a3


GitHub上下载最新的u-boot

git@github.com:u-boot/u-boot.git

实际上最新的u-boot(好像是从2017年开始),已经删除了对s3c系列的支持,虽然说基于新版本移植更加吃力,但是从一个芯片BSP开发的角度,这样更接近于将U-boot移植到一颗新芯片上,更有实践价值。


从Makefile下手

使用crosscompile

Makefile中有一处地方可以设置gcc,这里我们使用arm公版的cross compile,可以从arm官网下载得到。

diff --git a/Makefile b/Makefile

index 6bb9cf5..ceaad9a 100644

--- a/Makefile

+++ b/Makefile

@@ -259,8 +259,10 @@ export     HOSTARCH HOSTOS

 #########################################################################

 

 # set default to nothing for native builds

-ifeq ($(HOSTARCH),$(ARCH))

-CROSS_COMPILE ?=

+$(warning "HOSTARCH $(HOSTARCH), ARCH $(ARCH)")

+ifneq ($(HOSTARCH),$(ARCH))

+CROSS_COMPILE ?= arm-none-eabi-

+$(warning "CROSS_COMPILE $(CROSS_COMPILE)")

 endif 


跳过gcc版本检查

不知道为什么,Makefile中有一个对gcc版本的检查,我已经用的是最新的arm-gcc,依然不过

diff --git a/arch/arm/config.mk b/arch/arm/config.mk

index f256031..0be83d2 100644

--- a/arch/arm/config.mk

+++ b/arch/arm/config.mk

@@ -63,11 +63,11 @@ archprepare: checkgcc6

 endif

 

 checkgcc6:

-       @if test "$(call cc-name)" = "gcc" -a

-                       "$(call cc-version)" -lt "0600"; then

-               echo '*** Your GCC is older than 6.0 and is not supported';

-               false;

-       fi

+#      @if test "$(call cc-name)" = "gcc" -a

+#                      "$(call cc-version)" -lt "0600"; then

+#              echo '*** Your GCC is older than 6.0 and is not supported';

+#              false;

+#      fi


为U-boot提供BSP

对于一个新版子来说,U-boot需要我们提供和芯片或者开发板相关的底层代码,这些代码一般就把它称为BSP。


芯片Boot up的代码(arch/arm/cpu/arm920t)(arch/arm/include/asm/arch-s3c24x0/)

这部分是U-boot最开始load在SRAM里面的,包括一些寄存器,中断开关,看门狗等芯片最基本的设置,以及把真正把U-boot搬运到内存中的实现。


开发板支持包(board/samsung/mini2440/)

这部分涉及到开发板上除了Soc之外的硬件支持代码,是一些外设的配置,包括设置板载RAM。


设备树(如果CONFIG_OF_CONTROL=n可以不需要,可参考doc/README.fdt-control)

阐述SOC的外设配置及对应寄存器(arch/arm/dts/s3c2440.dts)


设置配置文件

在U-boot编译前,会读取输出目录中的”.config”文件,类似于Linux kernel,同时也有make_menuconfig。但是这样子调整参数或者做裁剪的时候不方便,于是又提供了可以针对某个具体硬件的configuration文件。

可以看到在Makefile中相关的编译项:


%config: scripts_basic outputmakefile FORCE

        $(Q)$(MAKE) $(build)=scripts/kconfig $@


跳转到scripts/kconfig下的Makefile:


%_defconfig: $(obj)/conf

        $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

# Added for U-Boot (backward compatibility)

%_config: %_defconfig

        @:


所以我们可以在代码目录下configs里面创建自己的configuration文件。

这里我的策略是,找一个最类似的SOC进行参考,所有的选项能不开就不开,第一步的目标是先让U-boot可以跑起来并通过串口打印。

在arch/arm/arm920t里面翻了一下,选择了imx,参考它的imx6ul_isiot_nand_defconfig。

这里我提供一些必要的配置,及说明。(注意:有些属于自定义宏,需要同时在Kconfig里面增加这些选项,否则不会自动写入.config)


#在初始化的很多地方都用到,arm同时提供了一个common的lib,所以这个宏很重要

CONFIG_ARM=y

#某些driver会用到

CONFIG_CPU_ARM920T=y

#在arm920t的bringup代码中S3C24x0区别的部分

CONFIG_S3C24X0=y

#S3C2440与S3C24x0区别的部分(时钟等)

CONFIG_S3C2440=y

#S3C2440的GPIO驱动部分暂时可以不用

CONFIG_S3C2440_GPIO=n

#定义target,虽然代码里没有对mini2440特殊初始化的地方,但不定义的话,default target会使编译出错

CONFIG_TARGET_MINI2440=y

#u-boot relocate的TEXT BASE

CONFIG_SYS_TEXT_BASE=0x000

#这里的env指的是U-boot引导前未进入系统时的env,具体作用还未深究

CONFIG_ENV_SIZE=0x10000

CONFIG_ENV_OFFSET=0x3FC000

CONFIG_ENV_SECT_SIZE=0x4000

#DRAM BANK数量,应根据板子上的实际情况而定

CONFIG_NR_DRAM_BANKS=1

#这个MALLOC POOL size指的是在relocate前用于初始化的malloc pool size

CONFIG_SYS_MALLOC_F=y

CONFIG_SYS_MALLOC_F_LEN=0x2000

#U-boot SPL,可以不适用

CONFIG_SPL=n

CONFIG_SPL_BUILD=n

#IDENT字符串,照抄的……

CONFIG_IDENT_STRING="for MINI2440"

#暂时还没研究

CONFIG_SILENT_CONSOLE=y

#当为y的时候会include s3c2440的pin脚,相当于一个mutex

CONFIG_CONSOLE_MUX=y

#console 前缀

CONFIG_SYS_PROMPT="MINI2440 # "

#定义errno具体的error string

CONFIG_ERRNO_STR=y

#现在的u-boot引入Linux类似的device tree,mini2440我们暂时可以不需要

CONFIG_OF_CONTROL=n

#一些板子特定的设定,mini2440似乎并不要

CONFIG_OF_BOARD_SETUP=n


移植serial 驱动

可以先从老的u-boot里s3c24x0的串口驱动复制过来,先把编译通过了再针对性修改。


在做完以上步骤后,就可以编译出uboot.bin,但是代码大多是复用老的u-boot版本针对smdk2410的代码,所以大概率是跑不起来的,这也是为什么我没有做太多的代码说明。因为框架大体上已经写好了,接下来我打算是在这个代码的基础上,逐步修改,让板子跑起来。

关键字:移植  U-boot  mini2440 引用地址:【嵌入式】从零开始移植U-boot到mini2440(一)——U-boot编译篇

上一篇:【嵌入式】从零开始移植U-boot到mini2440(二)——烧录篇
下一篇:U-boot移植到mini2440上

推荐阅读最新更新时间:2024-11-04 22:15

裸机程序在mini2440上的运行
你还在傻乎乎的用这种方法来运行裸机程序吗? 开发板用norflash启动,通过norflash里的supervivi辅助软件将led.bin裸机程序烧写进nandflash里面,然后运行它?这种办法耗时,而且nandflash里面的东西都会被擦除掉!鸡肋的办法,但是培训机构或网上的视频教程都是这样不辞辛劳的下载裸机程序! 这种方法的详细步骤: 1.从nor flash启动 2.通过supervivi的d命令用v命令是把程序下载到SDRAM就是内存的起始地址0x3000000中 其实v命令的过程是通过虚拟机的DNW先把程序下载到SDRAM中,然后执行了nand写操作,把0x30000000开始的那段代码复制到 了
[单片机]
手机成功模式难移植 小米电视藏隐忧
小米科技在利用网路行销及高规低价策略于智慧手机市场窜红后,近期更进一步以人民币2,999元的超杀价格进军智慧电视市场,试图复制手机产品的成功模式。不过,由于现阶段小米电视内容仍缺乏独特性,恐难吸引消费者持续埋单。 小米科技自2010年4月成立至今不到4年的时间,其智慧型手机以高性价比优势抢进市场,一举挤入全球前二十大智慧型手机品牌大厂,其创新又独树一格的经营方式,再加上销售成绩亮眼,使小米科技成为大中华区受瞩目之新兴企业。 2013年小米科技相继发布「小米盒子」与「小米电视」,正式进军电视市场,期复制小米手机之成功模式,除抢占客厅娱乐中心要角外,未来甚至可望扩展至智慧家庭应用,为小米开创下一波成长动能。 2013年
[手机便携]
S3C2416裸机开发系列十七_GCC下Fatfs的移植
对于固态存储器,其存储容量可以很大,往往需要一款文件系统对存储器用户数据进行组织文件的管理。它对文件存储器空间进行组织和分配,负责文件的存储并对存入的文件进行保护和检索。在嵌入式系统中,往往需要采用windows兼容的文件系统,像相机的照片、视频监控、语音产品等,很多都需要从windows计算机上提取资源或在windows计算机上进一步处理。Fatfs由于其开源免费,支持fat32,受到了广泛的应用,笔者此处就s3c2416移植Fatfs,对sd卡进行读写访问作一个简单的介绍。 1. Fatfs概述 Fatfs是由日本工程师ChaN所编写的fat文件系统模块,从06年发布第一个Fatfs版本开始,作者就从未停止维护和更新。Fat
[单片机]
基于ADSP—BF533的μClinux嵌入式系统移植与开发
Blackfin处理器是基于由美国模拟器件公司(ADI)和Intel公司联合开发的微信号架构(MSA)的首款第4代DSP产品,它是ADI公司16 位产品的一个大系列。这一新产品是专为通信和互联网应用而设计的通用DSP芯片,适合处理广泛用于互联网中的大量图像、声音、文本和数据流,也可应用于汽车电子可视系统、宽带无线系统、消费类多媒体电子、数字摄像机、多通道VoIP、安全和监督、机顶盒和视频电话会议等方面。本文所用到的ADSP一 BF533是Blackfin系列处理器的典型代表。 l μClinux简介 μClinux从Linux 2.0/2.4内核派生而来,沿袭主流Linux的绝大部分特性。它是专门针对没有MMU的CPU,并
[单片机]
基于ADSP—BF533的μClinux嵌入式系统<font color='red'>移植</font>与开发
u-boot-2011.03在mini2440/micro2440上的移植 支持DM9000
3.1 include/configs/micro2440.h 删除 #define CONFIG_CS8900 /* we have a CS8900 on-board */ #define CONFIG_CS8900_BASE 0x19000300 #define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */ #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 10.0.0.110 #define CONFIG_SERVERIP 10.0.0.1 添加 #defi
[单片机]
u-boot-2011.03在<font color='red'>mini2440</font>/micro2440上的<font color='red'>移植</font> 支持DM9000
基于S3C2440的U-BOOT的start.S分析
在了解了ARM相关的汇编指令后,同时结合网上各位大虾的提点开始阅读u-boot的启动代码,现将分析过程记录如下 可执行文件及内存映射 我们可以把可执行文件分为2种情况:存放态和运行态 1.存放态:可执行文件经过烧到存储介质上(flash或磁盘)的分布,此时可执行文件通常有2部分组成,代码段和数据段,代码段又分为可执行代码段 (.text)和只读数据段(.rodata),数据段可以分为初始化数据段(.data)和未初始化代码段(.bss),如下: +-------------+----------- | .bss | (ZI) +-------------+-- 数据段 | .data | (RW) +-----------
[单片机]
STM32Fxxx 上移植 Huawei LiteOS
1、LiteOS 简介 华为的 LiteOS 以轻量级(内核小于10k)、低功耗(1节5号电池最多可以工作5年),快速启动,互联互通,安全等关键能力,为开发者提供 一站式 完整软件平台,有效降低开发门槛、缩短开发周期。 华为提出 1+2+1战略,即一个物联网操作系统,两种接入方式,一个平台,从而实现其使能万物智能的目标。 示意图如下: 操作系统特点及框架如下图所示: 2、建立工程 源码下载:github.com/liteos/liteos 工程可分为三个文件夹 Libraries,Project 和 User。 Libraries存放的是stm32的标准库文件,包括源文件和头文件,下载方
[单片机]
STM32Fxxx 上<font color='red'>移植</font> Huawei LiteOS
STM32下uIP移植问题
就我个人认为在uIP的移植中除了驱动之处有以下几点需要注意: 1.uip_timer 时钟要加入到中断中去。 2.各种appcall实现。如在tcp_client_demo.c 有如下语句 if(uip_len 199) { ((u8*)uip_appdata) =0; } strcpy((char*)tcp_client_databuf,uip_appdata); 这样在处理数据长时都是以tcp_client_databuf 数组的长来处理,这样不灵活,client从网络中接收到的数据长本来就是用一个全局变量uip_len来存储的。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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