ARMBoot-1.1.0 在 mini2440 开发板上的移植

发布者:Meshulun最新更新时间:2024-06-28 来源: elecfans关键字:mini2440  移植 手机看文章 扫描二维码
随时随地手机看文章

作为U-boot的鼻祖-ARMboot以其小巧玲珑(代码压缩包仅有400K多),但又麻雀虽小,五脏俱全,不失为研究U-boot的第一步,而且在ARMboot中处处还能看到U-boot的影子。好啦,开始我们的移植之旅吧。

移植目标:      驱动串口;驱动网络芯片dm9000;实现内核的下载(uImage);实现启动 Linux kernel(zImage),实现Nand Flash启动
移植版本:        ARMboot-1.1.0
ARMboot在哪:   http://www.sourceforge.net/projects/armboot
交叉编译器:    arm-linux-gcc 2.95.3 (在该版本下可以一次编译成功,所以采用该版本的交叉编译器)
开发板配置:    RAM:64MB,Nor:2MB,Nand:64MB,Processor:Samsung S3C2440网卡芯片:dm9000
操作系统环境:  RedHat Linux 9.0

环境查看:
编译器:
[root@www.linuxidc.com root]# arm-linux-gcc -v
Reading specs from /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)

源代码包:
[root@www.linuxidc.com arms]# ls -l
total 428
-rw-r--r--    1 root     root       431099 Feb 25  2007 armboot-1.1.0.tgz

解压源码包:
[root@www.linuxidc.com arms]# tar zxvf armboot-1.1.0.tgz

进入源码目录:(之后的所用工作均在该目录下完成)
[root@www.linuxidc.com arms]# cd armboot-1.1.0
[root@www.linuxidc.com armboot-1.1.0]#

armboot-1.1.0已经支持smdk2410开发板,该开发板和mini2440有一定的相似性,我们在
在SMDK2410开发板的基础上进行移植。

测试smdk2410是否能通过编译:
[root@www.linuxidc.com armboot-1.1.0]# make distclean; make smdk2410_config ; make all

通过编译,查看生成的文件如下:
[root@www.linuxidc.com armboot-1.1.0]# ls -altr
-rwxr-xr-x    1 root     root       224812 May 24 08:43 armboot.srec
-rw-r--r--    1 root     root        28391 May 24 08:43 armboot.map
-rw-r--r--    1 root     root       210779 May 24 08:43 armboot.hex
-rwxr-xr-x    1 root     root        74916 May 24 08:43 armboot.bin
-rwxr-xr-x    1 root     root        91185 May 24 08:43 armboot

其中的armboot.bin即为最终的可以烧写到NandFlash的文件,由于代码还需修改,现在这个文件还不能适应mini2440的开发板环境,
上面的过程只是验证了smdk2410的配置即程序文件可以在arm-linux-gcc 2.95.3顺利编译通过,我们还需对代码做进一步的修改使得
其可以运行在到MINI2440上。

下面开始进行MINI2440的移植,为便于查看,将所涉及到的代码的行首都加了行号标示。
*************************************************************************************************************************************************
** 初步移植,复制关于SMDK2410的全部文件,并做相应地修改,在smdk2410的基础上构建MINI2440的代码环境
*************************************************************************************************************************************************
0)    清除上面的编译结果:
[root@www.linuxidc.com armboot-1.1.0]# make distclean

1)    复制smdk2410_config的配置文件(注:所有板子的配置文件均在include/configs下)
[root@www.linuxidc.com armboot-1.1.0]# cp include/configs/config_smdk2410.h  include/configs/config_mini2440.h

复制完成后在config_mini2440.h做一个简单的修改标记-该变提示符:(建议:修改时先做做备份-即注释掉原来的代码,而后改成新的),
可用如下的sed 命令直接修改(用sed脚本修改只可执行1遍,切勿多次执行!)
[root@www.linuxidc.com armboot-1.1.0]# sed -i'~'  -e '/^(#definetCFG_PROMPT..*)/ {N; s/(..*)n///1 // snallie, `date +%F_%H%M%S_%a`n1 // snallie, `date +%F_%H%M%S_%a`n/g; s/SMDK2410/ARMboot@MINI2440/2 }'  include/configs/config_mini2440.h

或者用vi进行全屏幕编辑修改:
[root@www.linuxidc.com armboot-1.1.0]# vi +99 include/configs/config_mini2440.h

具体修改的位置为:

    99 #define CFG_PROMPT  'SMDK2410 # '   /* Monitor Command Prompt       */
为:
    99  //#define       CFG_PROMPT              'SMDK2410 # '   /* Monitor Command Prompt       */ // snallie, 2011-05-24_090111_Tue
   100  #define CFG_PROMPT              'ARMboot@MINI2440 # '   /* Monitor Command Prompt       */ // snallie, 2011-05-24_090111_Tue

2)    拷贝smdk2410的板级的程序文件为mini2440
[root@www.linuxidc.com armboot-1.1.0]# cp -a board/smdk2410/  board/mini2440

3)    修改mini2440的板级的Makefile,文件位置在 board/mini2440/Makefile

    28 OBJS    := smdk2410.o flash.o env.o
为:
    28  # OBJS  := smdk2410.o flash.o env.o # snallie, 2011-05-24_091150_Tue
    29  OBJS    := mini2440.o flash.o env.o # snallie, 2011-05-24_091150_Tue

可用如下的sed 命令直接修改:(用sed脚本修改只可执行1遍,切勿多次执行!)
[root@www.linuxidc.com armboot-1.1.0]# sed -i'~' -e '/^(OBJSt:= smdk2410.o..*)/ {N; s/(..*)n/# 1 # snallie, `date +%F_%H%M%S_%a`n1 # snallie, `date +%F_%H%M%S_%a`n/g; s/smdk2410/mini2440/2 }' board/mini2440/Makefile

或者用vi进行全屏幕编辑修改:
[root@www.linuxidc.com armboot-1.1.0]# vi +28 board/mini2440/Makefile

4)    修改mini2440的板级的文件名,涉及文件为 board/mini2440/smdk2410.c
[root@www.linuxidc.com armboot-1.1.0]#  mv board/mini2440/smdk2410.c board/mini2440/mini2440.c

5)    修改顶层的Makefile:找到smdk2410_config,仿照smdk2410_config,添加mini2440_config,如下:

   200  smdk2410_config :       unconfig
   201          @echo 'Configuring for $(@:_config=) Board...' ;
   202          cd include ;
   203          echo 'ARCH  = arm'      > config.mk ;  
   204          echo 'BOARD = smdk2410' >>config.mk ;  
   205          echo 'CPU   = arm920t'  >>config.mk ;  
   206          echo '#include ' >config.h
   207
   208  # snallie, 2011-05-24_091758_Tue
   209  mini2440_config :       unconfig
   210          @echo 'Configuring for $(@:_config=) Board...' ;
   211          cd include ;
   212          echo 'ARCH  = arm'      > config.mk ;  
   213          echo 'BOARD = mini2440' >>config.mk ;  
   214          echo 'CPU   = arm920t'  >>config.mk ;  
   215          echo '#include ' >config.h
   216

可用如下的sed 命令直接修改:(用sed脚本修改只可执行1遍,切勿多次执行!)
[root@www.linuxidc.com armboot-1.1.0]# sed -i'~'  -e '/smdk2410/,+7 {N;N;N;N;N;N;N; s/(..*)n(..*)n(..*)n(..*)n(..*)n(..*)n(..*)n/&n# snallie, `date +%F_%H%M%S_%a`n1n2n3n4n5n6n7n/g;s/smdk2410/mini2440/3;s/smdk2410/mini2440/3 } ' -e '/backup/,/gtar/ {N;N;N; s/(..*)n(..*)n(..*)n/#1n#2n#3nn# snallie, `date +%F_%H%M%S_%a`n1n2n3n/g; s/'([^n]*)(.tar.gz)/'+$$F-gk-%Y%m%d_%H%M%S2/2 } ' -e '/^armboot.bin/ {N;N;N; s/(..*)n(..*)n(..*)n/1n2n# snallie, `date +%F_%H%M%S_%a`n#3n/g }' Makefile

或者用vi进行全屏幕编辑修改:
[root@www.linuxidc.com armboot-1.1.0]# vi +200 Makefile

注意:用vi手工修改时候,Makefile中的新添的210~215行的行首为制表符(TAB键),而不是空格,若输入的是空格,则编译出错

6)    程序的版本号有误,修改:include/version.h
改:
    28  #define ARMBOOT_VERSION 'ARMboot 1.0.2'
为:
    28  //#define       ARMBOOT_VERSION 'ARMboot 1.0.2'
    29    #define ARMBOOT_VERSION 'ARMboot 1.1.0' // snallie, 2011-05-24_093229_Tue

可用如下的sed 命令直接修改:(用sed脚本修改只可执行1遍,切勿多次执行!)
[root@www.linuxidc.com armboot-1.1.0]# sed -i'~' -e '/1.0.2/ {N; s/(..*)n///1n1/g; s/1.0.2'/1.1.0't// snallie, `date +%F_%H%M%S_%a`n/2;}' include/version.h

或者用vi进行全屏幕编辑修改
[root@www.linuxidc.com armboot-1.1.0]# vi +28 include/version.h

7)    关于SMDK2410的全部文件复制完成,编译测试:
[root@www.linuxidc.com armboot-1.1.0]# make distclean; make mini2440_config; make all

通过编译!

*************************************************************************************************************************************************
** 进一步的移植,完成目标中的全部工作:驱动串口;驱动网络芯片dm9000;实现内核的下载(uImage);实现启动 Linux kernel(zImage),实现Nand Flash启动
*************************************************************************************************************************************************
mini2440板配置初步完成,下面进行具体的移植工作,由于SMDK2410 的代码和MINI2440板子略有出入,SMDK2410代码认为程序是直接在NOR或RAM中运行,
而我们的代码最终是烧写到NandFlash中的,可NandFlash不具有片上执行代码的能力,所以程序启动的第一步就是要将整个的程序从NandFlash中搬移到RAM中,
即TEXT_BASE(配置在board/mini2440/config.mk文件中)的起始地址上去。另外SAMSUNG的S3C2440的处理器在系统启动时候会自动将NandFlash的前4K的代码
移动到内部的4K大小的称为Steppingstone的SRAM中运行,所以搬移用的代码必须放到程序映像的头部的4K的范围内,否则不能正常启动。综上所述,对SMDK2410
代码的改造主要为:实现代码的搬移工作,并将搬移用的代码放到程序映像的头部的4K的范围内;而后要驱动串口,这样我们才能获取到程序的运行时的输出状态
信息,串口驱动不起来等于是瞎子一样,所以串口驱动很重要,有了串口还可通过串口下载小体积的代码;在这之后再驱动网络芯片,实现网络下载代码,启动内核等等。

查看SMDK2410的代码,知道和CPU相关的代码通过在include/configs/config_smdk2410.h的宏定义CONFIG_S3C2410进行控制,和开发板SMDK2410相关的代码通过
在include/configs/config_smdk2410.h的宏定义CONFIG_SMDK2410进行控制,如下所示:

#define CONFIG_S3C2410          1       /* in a SAMSUNG S3C2410 SoC     */
#define CONFIG_SMDK2410         1       /* on an SAMSUNG SMDK2410 Board */

顺着这个线索,我们看看在原有的SMDK2410的代码有那些和CONFIG_S3C2410和CONFIG_SMDK2410的代码,以及它们分布在那些文件中:

和CONFIG_S3C2410相关的:
[root@www.linuxidc.com armboot-1.1.0]# grep -rHn CONFIG_S3C2410 *
cpu/arm920t/interrupts.c:36:#elif defined(CONFIG_S3C2410)
cpu/arm920t/serial.c:25:#elif defined(CONFIG_S3C2410)
cpu/arm920t/start.S:134:#elif defined(CONFIG_S3C2410)
cpu/arm920t/start.S:153:#if defined(CONFIG_S3C2410)
include/configs/config_smdk2410.h:43:#define    CONFIG_S3C2410          1       /* in a SAMSUNG S3C2410 SoC     */

[1] [2] [3] [4]
关键字:mini2440  移植 引用地址:ARMBoot-1.1.0 在 mini2440 开发板上的移植

上一篇:解决mini2440声卡全双工问题 实现同时录音及播放
下一篇:mini2440上移植sqlite3.7.6.2

推荐阅读最新更新时间:2024-11-14 01:19

VR硬件Q1销量出炉:Gear大卖 高端产品潜力难释放
  据外媒报道,手机、平板和智能穿戴设备等产品第一季销量出炉后,又轮到 VR 头戴设备了。由于缺乏丰富的内容支持,高端 VR 头戴设备的潜力依然没能得到有效释放。下面就随嵌入式小编一起来了解一下相关内容吧。   市场研究机构SuperData Research的最新数据显示,三星 Gear   VR 依然固守VR硬件市场销量王宝座,2017年第一季度, Gear  VR共卖出78.2万台,遥遥领先于其他对手。   其他主要的VR头戴设备第一季销量如下:   PlayStation VR:37.5万台   谷歌Daydream:17万台   HTC Vive:9.5万台   Oculus Rift:6.4万台    Gear  V
[嵌入式]
采用纤巧 4A 降压型µModule稳压器 完整解决方案的占板面积不足1cm2
 加利福尼亚州米尔皮塔斯 (MILPITAS, CA) – 2013 年 8 月 19 日 – 凌力尔特公司 (Linear Technology Corporation) 推出 14V、4A 降压型µModule® (微型模块) 稳压器LTM4624。该器件采用 6.25 x 6.25 x 5.01mm BGA 封装,连同一些无源器件,其在采用单面 PCB 时的占板面积在 1cm2内,而采用双面 PCB 时则不超过0.5cm2。类似于其他 µModule 稳压器,LTM4624 在一个封装中内置了 DC/DC 控制器、功率开关、电感器和补偿组件,仅需外置两个陶瓷电容器 (1206 尺寸) 和一个电阻器 (0603 或更小的尺寸)
[模拟电子]
采用纤巧 4A 降压型µModule稳压器 完整解决方案的占板面积不足<font color='red'>1</font>cm2
STM32移植cJson和FreeRTOS时,cjson解析和创建失败问题
一,环境:STM32+cJson+FreeRTOS+Heap_4.c 二,FREERTOS的内存:Heap_4 FreeRTOS8.0.1内存管理的最后一个堆模型Heap_4,貌似是在这一个版本才有的。所以找到的说明几乎没有。代码的开头注释也只是简单地说了一下实现了pvPortMalloc()和vPortFree()两个函数,并且能够对回收的内存块进行合并,减少碎片的出现。(A sample implementation of pvPortMalloc() and vPortFree() that combines (coalescences) adjacent memory blocks as they are free
[单片机]
STM32<font color='red'>移植</font>cJson和FreeRTOS时,cjson解析和创建失败问题
【单片机】【学习日志】51单片机学习日志[Day1、2022.1.09]
第一部分 一、单片机介绍: 1、基础知识 单片机,英文Micro Controller Unit,简称MCU; 内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能 单片机的任务:信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(例如电机,LED等)的控制 单片机跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。 在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用; 同时,学习使用单片机是了解计算机原理与结构的最佳选择 2、单片机的应用领域 单片机的使用领域已十分广泛,如智能仪表、实时工控、通讯设备、
[单片机]
【单片机】【学习日志】51单片机学习日志[Day<font color='red'>1</font>、2022.1.09]
瑞萨利用新型RZ/N1解决方案套件加快工业以太网应用的开发
电子网消息,全球领先的半导体解决方案供应商瑞萨电子株式会社宣布,推出新型RZ/N1微处理器(MPU)解决方案套件,以支持各种工业网络应用,包括可编程逻辑控制器(PLC)、智能网络交换机、网关、操作员终端和远程I/O解决方案。 新型RZ/N1解决方案套件是一个包括软硬件在内的完整开发包,可加快对领先工业以太网协议的样机开发,包括EtherCAT®、EtherNet/IP™、ETHERNET Powerlink、PROFINET®、Sercos®和CANopen®等,从而加速开发、将工业网络协议整合到客户应用中的工作周期缩短六个月。 新套件包含基于RZ/N1S MPU的CPU开发板。此外,综合软件包内包括所有驱动程序和中间件、
[半导体设计/制造]
51单片机实验——用定时器0实现流水灯,要求每个led轮流显示1s
1.实验题目: 用定时器0实现流水灯,要求每个led轮流显示1s。 2.KEIL代码 #include reg51.h void main() { TMOD &=0X0F; TMOD |=0x01; TH0 = (65536 - 50000)/256;//高四位初值 TL0 = (65536 - 50000)%256;//低四位初值,每隔50ms溢出 EA = 1; //开总中断 ET0 = 1; //T1开时定时器溢出 TR0 = 1; //开启定时器 P1=0xff; while(1); } void Time0(void) interrupt 1 //定时中断 {
[单片机]
51单片机实验——用定时器0实现流水灯,要求每个led轮流显示<font color='red'>1</font>s
s3c2440 LCD及触摸屏的学习笔记(1)
所用的LCD为TopPoly-TD035STED4(TFT)型号,240*320的 其VCLK为6.39MHz。 根据s3c2440手册s3c2440处理LCD的时钟源是HCLK,通过寄存器LCDCON1中的CLKVAL可以调整VCLK频率大小,它的公式为:VCLK=HCLK÷ ,程序的内部分频为FCLK=400MHz、HCLK=100MHz、PCLK=50MHz(MPLLCON=(92 12)|(1 4)|1;),因此得到CLKVAL取整为6。 注:(LCD一般需要三个时序信号:VSYNC、HSYNC和VCLK。VSYNC是垂直同步信号,在每进行一个帧(即一个屏)的扫描之前,该信号就有效一次,由该信号可以确定LCD的场频,即
[单片机]
s3c2440 LCD及触摸屏的学习笔记(<font color='red'>1</font>)
UCGUI在STM32平台移植经验(无操作系统)
ucgui 移植的前提是已经具备了LCD驱动函数,已经能够实现点亮LCD屏幕,并实现画点以及获取指定点颜色值的功能。一般的显示屏供应商会提供对应的驱动函数。主要有初始化函数void LCD_Init(),屏幕画点函数 Void LCD_DrawPoint(u16 x,u16 y,u16 color),以及获取指定点颜色值的U16 LCD_ReadPoint(u16 x,u16 y)函数。移植的关键在于把这三个函数与ucgui提供的接口函数匹配。 打开GUILCDDriver中的LCDDummy.c文件,找到int LCD_L0_Init(void)初始化函数,LCD_L0_SetPixelIndex(int x, int y,
[单片机]
UCGUI在STM32平台<font color='red'>移植</font>经验(无操作系统)
热门资源推荐
热门放大器推荐
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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