U-boot-2014.04移植到MINI2440(1) 初步探索移植

发布者:闪耀之星最新更新时间:2022-06-21 来源: eefocus关键字:U-boot  移植  MINI2440 手机看文章 扫描二维码
随时随地手机看文章

友善之臂给出了一份移植U-BOOT-2010-03的移植手册,之前也跟着做了,这次带着分析源码的目的再次移植一遍,整个过程借鉴友善之臂提供的手册,韦东山老师书籍的视频,同时参考了其他一些作者的博客,在此对他们表示感谢。


开发环境:VMWARE—Fedora14


开发板:MINI2440(64M RAM,256M NAND FLASH,2M NOR FLASH)


编译器:arm-linux-gcc-4.3.2


U-Boot版本:U-Boot-2014.04 下载地址:ftp://ftp.denx.de/pub/u-boot/


我移植的U-boot属于版本比较新的了,友善之臂和网上很多帖子都是移植的U-boot-2010的版本,现在最新的U-BOOT已经支持类似linux make menuconfig这样的功能,代码结构和安排也越来越向LINUX看齐,那么移植之前我想先弄清楚一个:什么是U-boot,它的作用是什么?


U-BOOT是一段引导加载程序,是由德国的DENX软件工程中心开发和维护,当前市面上有太多种类的平台和处理器,要想开发一种通用的bootloader几乎是不可能的,但是U-BOOT是一个主流,源码开放,灵活性很强,现在已经被附加了很多的功能,其实它最主要也是最重要的一个作用就是引导加载内核,因为加载内核的时候,内核需要知道Machine ID,知道参数在RAM中的位置,必须关中断,MMU之类的,所以内核启动并不是简单地知道自己在哪里这么简单。我们客户在使用一款嵌入式产品的时候,是不需要和U-BOOT进行交互的,之所以给U-BOOT加入这么多的功能是为了更加方便的我们去观察运行结果,做开发。


U-BOOT-2014.04共有20个子目录,12个文件,其中各个子目录和重要文件功能见下表:

image.png


image.png

image.png

下面开始正式移植步骤:


(1)   修改顶层Makefile添加开发板配置选项


因为我们编译出来的u-boot是要在arm平台上运行的,所以要定义交叉编译工具arm-linux-gcc,使用vim Makefile后,可以使用/CROSS_COMPILE来搜索定位到该处,修改如下。


# set default to nothing for native builds


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


CROSS_COMPILE ?=


 endif


CROSS_COMPILE = arm-linux-


# SHELL used by kbuild


U-BOOT-2010中顶层Makefile可以看到smdk2440a_config,在u-boot2014-04中已经没有了,使用命令grep “smdk24*” * -nR,结果如下:

可以看到在2014下,开发板的配置选项已经更改到了顶层目录下的boards.cfg下,这时我们进去添加mini2440的开发板配置选项


更改如下:

(2)   在/board中建立mini2440的目录和文件,拷贝配置头文件


我们移植以smdk2410为蓝本,拷贝board/samsung/smdk2410目录到board/mini2440,在顶层目录下:


cp –a board /samsung/smdk2410/ board/mini2440/mini2440


然后进入board/mini2440目录下进行修改,以smdk2410.c为蓝本移植:


mv smdk2410.c mini2440.c


接下来拷贝配置头文件:


cp include/configs/smdk2410.h include/configs/mini2440.h


(3)   配置时钟


2410和2440时钟的初始化参数不一样,这里需要做出修改,根据arch/arm/cpu/u-boot.lds文件可知执行的第一个文件是arch/arm/cpu/arm920t/start.S,


其中关于时钟频率的代码如下,我做了注释,修改的话就是在这里:


   ldr    r0,=pWTCON  //将pWTCON变量的地址放到r0中


       mov       r1,#0x0    //把立即数0放到r1中


str     r1, [r0]       //将R1中的值放到以r0为地址的存储单元中去,意思就//是设置寄存器的值来关闭看门狗


       /*


        *mask all IRQs by setting all bits in the INTMR - default


        */


       mov       r1,#0xffffffff


       ldr   r0,=INTMSK


       str   r1,[r0]      //关中断


# ifdefined(CONFIG_S3C2410)


       ldr   r1,=0x3ff


       ldr   r0,=INTSUBMSK


       str   r1,[r0]                               //屏蔽子中断


# endif


 


       /* FCLK:HCLK:PCLK = 1:2:4 */


       /* default FCLK is 120 MHz ! */


       ldr   r0,=CLKDIVN


       mov       r1,#3


       str   r1,[r0]               //设置分频系数,默认1:2:4


#endif    /* CONFIG_S3C24X0 */


经过修改的代码如下,可以上下对比看有哪些地方不同,红色为改动部分,标注出来了:


       ldr   r0,=pWTCON


       mov       r1,#0x0


       str   r1,[r0]


 


       /*


        *mask all IRQs by setting all bits in the INTMR - default


        */


       mov       r1,#0xffffffff


       ldr   r0,=INTMSK


       str   r1,[r0]


# ifdefined(CONFIG_S3C2410)


       ldr   r1,=0x3ff


       ldr   r0,=INTSUBMSK


       str   r1,[r0]


# endif


#ifdefined(CONFIG_S3C2440)


       ldr   r1,=0x7fff


       ldr   r0,=INTSUBMSK


       str   r1,[r0]


#endif/*CONFIG_S3C2440*/


#ifdefined(CONFIG_S3C2440)


#defineMPLLCON 0x4c000004 //系统主频的配置寄存器


#defineUPLLCON 0x4c000008 //usb频率配置寄存器


#defineCAMDIVN 0x4c000018 //照相机时钟分频寄存器


       ldr r0,=CAMDIVN


       mov r1,#0


       str r1,[r0]


 


       ldr r0,=CLKDIVN


       mov r1,#0x05


       str r1,[r0]


             


       /*如果HDIVN不等于0,则设置CPU为异步纵向模式,所谓异步总线就是各部件和设备不采用统一时钟,


       彼此间通信采用握手信号,总线时序不固定,可以兼容多种设备*/


      


       mrc p15,0,r0,c1,c0,0 /*参看ARM的数据手册,这是一个协处理器的操作指令,此处为将协处理器p15的寄存器中的数据传送到ARM处理器的寄存器r0中,其中1是协处理器操作码1,0是协处理器操作码2,c1存放第一个操作数的协处理器寄存器,c0存放第二个操作数的协处理器寄存器*/


       orr r1,r1,#0xc0000000 /*让CPU的总线从fast变为asynchronous,orr的是一个逻辑或指令*/


       mcr p15,0,r0,c1,c0,0


      


ldr r0,=UPLLCON


       ldr r1,=0x38022//USB的48MHZ时钟


       str r1,[r0]


       nop


       nop


       nop


       nop


       nop


       nop


       nop


       ldr r0,=MPLLCON


       ldr r1,=0x5c011 //CPU时钟400MHZ


       str r1,[r0]


      


#else


 


       /* FCLK:HCLK:PCLK = 1:2:4 */


       /* default FCLK is 120 MHz ! */


       ldr   r0,=CLKDIVN


       mov       r1,#3


       str   r1,[r0]


#endif  /*CONFIG_S3C1440*/


#endif    /* CONFIG_S3C24X0 */


由于在mini2440.c中也对时钟做了初始化,在此处需要将其去掉,在函数board_early_init_f()中,如下:

(4)修改配置头文件


在include/configs/mini2440.h中,主要是添加命令行的自动补全功能,还有命令提示符,再将一些暂时不用的功能去掉。

去掉2410增加2440,增加命令行自动补全

去掉CS8900网卡部分支持

去掉USB部分的支持,包括键盘,USB存储等等

去掉部分命令的支持


(5)下载u-boot到ram中运行


修改配置文件mini2440.h


#define CONFIG_SYS_TEXT_BASE0x30008000


这是代码的加载地址,编译好之后,我们就把u-boot下载到这个地址里面去,这个地址正好是mini2440的SDRAM起始地址,由于在lowlevel_init中对底层做了初始化,因此在mini2440.h中在加入以下宏以取消对内存数据代码的破坏


       #define CONFIG_SKIP_LOWLEVEL_INIT


修改好后,在顶层目录下,执行make mini2440_config


会提示:Configuring for mini2440 board…


接着make


不出问题会生成一个u-boot.bin,这个u-boot只是最初的,还不能使用,后面还会加入很多东西。

然后chmod 777 u-boot.bin更改权限,再cp u-boot.bin /tftpboot/将生成的u-boot拷贝到tftp传输的目录下,连接开发板网线,连接串口,在开发板里面要有一个能够运行的u-boot ,我用的是之前自己移植的u-boot-2010,启动后输入指令tftp 0x30008000 u-boot.bin,下载到RAM中,然后go 0x30008000就可以看到串口输出以下信息,说明我们初步的移植成功了。

后期还有很多工作要做,打算按照友善之臂的思路,根据执行流程进一步移植,下一篇翻译讨论U-BOOT的README,这样便于移植过程的理解和掌握。

关键字:U-boot  移植  MINI2440 引用地址:U-boot-2014.04移植到MINI2440(1) 初步探索移植

上一篇:U-boot-2014.04移植到MINI2440(6) DM9000网卡移植
下一篇:U-boot-2014.04移植到MINI2440(4) 第一启动阶段start.S等详细分析

推荐阅读最新更新时间:2024-11-04 17:06

Redboot mini2440 qemu 增加LCD功能
在ecos中增加lcd_support功能,和之前对emwin的移植略有不同 这次移植探究了如何从ram中留出一段空间作为framebuffer来用, Linux, WinCE都是这样做的。 1.开始是一样的,我们需要先找模板 参考arm9下面的aaed2000,再结合我们之前的LCD Driver部分就可以了。 2.预留内存给Framebuffer 我们主要看如何预留内存,首先需要改内存配置的h文件,增加lcd的REGION,别忘记修改heap的大小 // eCos memory layout - Fri Oct 20 05:43:59 2000 // This is a generated file - do not edit
[单片机]
Redboot <font color='red'>mini2440</font> qemu 增加LCD功能
mini2440串口模块总结
一.串口工作原理: 1.由上面的串口电路可知具体流程如下: 发送:写数据——》buffer—》shifter—》TXDn-- RSTXDn--- PC 接收:PC---》RSRXDn---》RXDn--- shifter-- buffer--- 取数据 2.由上图可知, buffer有两种模式,FIFO模式 和 Non-FIFO模式。 如果使用FIFO模式,则需要配置FIFO Register,具有64 字节的缓存可用。 如果使用Non-FIFO模式,则不需要配置FIFO Register,但是只具有一个字节的缓存可用。 3.做串口模块的具体流程: 1 .从串口电路图中可以知道,我们首先应
[单片机]
<font color='red'>mini2440</font>串口模块总结
Adeno完成 .NET Micro Framework到AT91SAM9微控制器的移植
Adeno完成 .NET Micro Framework到AT91SAM9微控制器的移植 充分展示其在软件工程领域的专业技术 Adeneo公司在刚于美国东岸举行的嵌入式系统会议 (Embedded Systems Conference East) 上展示了在爱特梅尔基于ARM9的 AT91SAM9微控制器移植 .NET Micro Framework的成果。 这项移植表明Adeneo能够为那些想在 .NET Micro Framework上构建产品的OEM厂商,提供强而有力的技术支持和工程服务。Adeneo是微软 Windows 嵌入式伙伴服务计划的金级会员,在欧洲和美国均拥有研发设施。 .NET Micro Framewor
[焦点新闻]
mini2440驱动分析之TouchScreen
mini2440驱动分析之触摸屏 mini2440触摸屏驱动对应的文件为mini2440_ts.c,他是作为输入设备注册到内核的,功能实现是通过输入子系统来完成的,现在分析触摸屏的实现。以后再分析输入子系统。 一. 分析一个驱动首先看它的模块初始化函数,下面是mini2440_ts.c的模块初始化函数: static struct clk *adc_clock; //这个时钟结构体代表时钟 static int __init s3c2410ts_init(void) { struct input_dev *input_dev; adc_clock = clk_get(NULL, adc ); //获得时钟结
[单片机]
<font color='red'>mini2440</font>驱动分析之TouchScreen
4G无线移植向灵活的下一代高性能无线网络发展
近期,苹果公司iPhone和智能手机等新型移动产品以及低成本笔记本、上网本的推出,大大扩展了无线数据的用途。因此,市场对增强型服务的需求不断攀升,促使大批用户从简单的语音设备需求向丰富媒体和位置感知服务方向转型。 增强型服务的发展为创新技术领先公司和用户都带来了巨大机遇,当然在这些机遇的背后还同时伴随着大量技术挑战。部署和维护基础设施的挑战使资本支出和运营开支不断增加,这会降低运营商的投资回报率。其实,相关技术从2G到3G网络转型时就发生过这种问题,这种情况非常不利于运营商升级基础设施。随着3G向数据传输速率可达到50 Mb/s乃至100 Mb/s的长期演进(LTE)技术转型,上述问题仍将继续存在。因此我们非常有必要
[网络通信]
米尔基于NXP iMX.93开发板的网卡驱动移植指南
NXP i.MX93处理器有两个以太网控制器,其中eqos是TSN网络控制器。 另外一个Fec以太网外围设备使设备能够在以太网上传输和接收符合IEEE 802.3-2002标准的数据,提供了一个可配置的、灵活的外设,以满足各种应用程序和客户的需求。一般情况CPU集成MAC,PHY采用独立芯片;CPU不集成MAC,MAC和PHY采用集成芯片。MAC和PHY工作在OSI模型的数据链路层和物理层。i.MX93的MAC集成在cpu内部,所以还需要外接phy芯片。 MYD-LMX9X开发板(米尔基于NXP i.MX93开发板)外接了两个YT8531SH千兆PHY芯片,ENET1原理图如图4-7: 图4-7. ENET1原理图
[嵌入式]
米尔基于NXP iMX.93开发板的网卡驱动<font color='red'>移植</font>指南
基于STM32MP157的Linux操作系统移植 —Trusted Firmware-A移植
嵌入式高速发展的今天,大量的嵌入式设备使用了arm为核心的芯片。我们会接触到越来越多的嵌入式设备,一个问题油然而生:数量如此巨大的嵌入式设备的安全性如何?目前针对嵌入式安全的技术和标准可谓千姿百态,除了必要的硬件安全技术,与之配套的安全软件也是必不可少的一部分。我们今天要介绍的是基于arm的可信固件Trusted Firmware-A,简称TF-A。它是一个开源软件,运行在一个硬件隔离的安全环境中并提供安全服务。 实验目的 完成TF-A的基本功能实现TF-A引导u-boot启动。 实验平台 华清远见开发环境,FS-MP1A平台 实验步骤 本实验基于tf-a-stm32mp-2.2版本,然后添加意法半导体提供的补丁文件。 导入代
[单片机]
17.U-boot的工作流程分析-6410
6410开发板: 1.uboot的入口: 要看uboot工程的入口,首先打开顶层目录的Makefile: Uboot所支持的开发板,在顶层的Makefile中都会有一个配置选项。比如6410,在Makefile中的配置选项是make forlinx_nand_ram256_config:在vim的命令模式按下/,然后输入make forlinx_nand_ram256_config回车会定位到这里: 这是Makefile里的一个目标。这是来配置6410开发板的。看到上图第二行的smdk6410,这个参数决定了开发板的名称。这个名称是有作用的。接下来看看他的作用。 首先是找一下目录: 可以看到这里有很多smdk的子目录,
[单片机]
17.U-boot的工作流程分析-6410
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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