UBOOT-1.1.6在S3C2410上的移植(基于GEC2410)

发布者:BlissfulHeart最新更新时间:2022-04-20 来源: eefocus关键字:UBOOT  S3C2410  移植 手机看文章 扫描二维码
随时随地手机看文章

之前做过u-boot-1.1.6在AT91RM9200的移植,虽然2410和9200这两款ARM9芯片都是ARM920T核的,但还是有不少区别的,特别是启动方式(当然前者是工业级后者是民用级不必说)。at91rm9200内部本身有128k的片内rom,其固化了一个bootloader和uploader, 用来支持程序的下载和引导,而且其内部固化的程序提供了很多内部服务接口(Internel Service)供我们来使用,例如Xmodem;而S3C2410启动是把nandflash的前4K代码自动搬到Steppintstone中去运行,而Steppingstone使用的物理地是从0号位置开始的。(当然如果是Nor Flash启动,两者是相同的)


1.开发环境

宿主机:FC11 

交叉编译器: 

之前编译的arm-linux-gcc-3.4.5-softfloat,请参见:

http://blog.csdn.net/shevsten/archive/2007/07/14/1691197.aspx

开发板: GEC2410 NAND Flash:64M K9F1208, NOR Flash:2M SST39VF1601 SDRAM 64M, CS8900A


2.下载u-boot-1.1.6源码

u-boot的源码可以从以下网址下载:

ftp://ftp.denx.de/pub/u-boot/


解压放到指定目录:

# tar -xvjf u-boot-1.1.6.tar.bz2


3.建立自己GEC2410开发板的配置

复制smdk2410的开发板配置,然后在做相应修改,由于Uboot1.1.6对SMDK2410板的NAND Flash初始化部分没有写,主要移植内容为Nand Flash部分.

复制smdk2410目录及对应头文件,并改名为gec2410:

1)# cp –r board/smdk2410 board/gec2410   

2)# cp include/configs/smdk2410.h include/configs/gec2410.h


4.修改顶层Makefile

(1)增加gec2410配置

找到Line 1879:

smdk2410_config    :    unconfig

    @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

在其后面添加:

gec2410_config    :    unconfig

    @$(MKCONFIG) $(@:_config=) arm arm920t gec2410 NULL s3c24x0

各项的意思如下:

arm:        CPU的架构(ARCH)

arm920t:    CPU的类型(CPU),其对应于cpu/arm920t子目录。

fs2410:    开发板的型号(BOARD),对应于board/fs2410目录。

NULL:       开发者/或经销商(vender)。

s3c24x0:    片上系统(SOC)。


这样在执行make gec2410_config命令后就把环境变量设置好了

(2)设置编译器路径(Line 127)

ifeq ($(ARCH),arm)

CROSS_COMPILE = /home/GEC2410/toolchain/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-


5.修改u-boot的命令行提示符

include/configs/gec2410.h第111行:

修改:

# define   CFG_PROMPT     "SMDK2410 #"

为:

# define   CFG_PROMPT     "GEC2410 #"

这是u-boot的命令行提示符。


6.修改board/gec2410/Makefile

将:

COBJS    := smdk2410.o flash.o

改为:

COBJS     := gec2410.o flash.o

gec2410下的smdk2410.c改成gec2410.c;


7.修改board/gec2410/lowlevel_init.S文件

参考GEC2410开发板自带BIOS里的配置参数,主要是SDRAM时序参数的配置.


/* BWSCON */

#define DW8    (0x0)

#define DW16    (0x1)

#define DW32    (0x2)

#define WAIT    (0x1<<2)

#define UBLB    (0x1<<3)


//#define B1_BWSCON    (DW32)

#define B1_BWSCON    (DW16)

#define B2_BWSCON    (DW16)

#define B3_BWSCON    (DW16 + WAIT + UBLB)

#define B4_BWSCON    (DW16)

#define B5_BWSCON    (DW16)

#define B6_BWSCON    (DW32)

#define B7_BWSCON    (DW32)


/* BANK0CON */

#define B0_Tacs    0x3 /*0x0  0clk */

#define B0_Tcos    0x3 /*0x0  0clk */

#define B0_Tacc    0x7 /* 14clk */

#define B0_Tcoh    0x3 /*0x0  0clk */

#define B0_Tah    0x3 /*0x0  0clk */

#define B0_Tacp    0x1

#define B0_PMC    0x0 /* normal */


/* BANK1CON */

#define B1_Tacs    0x3 /* 4clk */ /*0x0  0clk */

#define B1_Tcos    0x3 /* 4clk */ /*0x0  0clk */

#define B1_Tacc    0x7 /* 14clk */

#define B1_Tcoh    0x3 /* 4clk */ /*0x0  0clk */

#define B1_Tah    0x3 /* 4clk */ /*0x0  0clk */

#define B1_Tacp    0x3

#define B1_PMC    0x0


#define B2_Tacs    0x0

#define B2_Tcos    0x0

#define B2_Tacc    0x7

#define B2_Tcoh    0x0

#define B2_Tah    0x0

#define B2_Tacp    0x0

#define B2_PMC    0x0


#define B3_Tacs    0x0 /*  0clk */

#define B3_Tcos    0x3 /*  4clk */

#define B3_Tacc    0x7 /* 14clk */

#define B3_Tcoh    0x1 /*  1clk */

#define B3_Tah    0x0 /*  0clk */

#define B3_Tacp    0x3     /*  6clk */

#define B3_PMC    0x0 /* normal */


这时候可以测试下编译是否成功

#make gec2410_config

#make

u-boot-bin目录下会出现u-boot.bin


8.board/fs2410加入NAND Flash读函数,建立nand_read.c(从开发板提供的u-boot-1.1.4中复制board/gec2410/nand_read.c,实际上就是从vivi中拷贝过来的)代码比较简单,实际上就一个读NAND的函数,代码如下:

具体对NAND的操作可参考CE下NAND驱动分析:

http://blog.csdn.net/shevsten/archive/2010/04/27/5533400.aspx


/*

 * nand_read.c: Simple NAND read functions for booting from NAND

 *

 * Copyright (C) 2002 MIZI Research, Inc.

 *

 * Author: Hwang, Chideok

 * Date  : $Date: 2002/08/14 10:26:47 $

 *

 * $Revision: 1.6 $

 * $Id: param.c,v 1.9 2002/07/11 06:17:20 nandy Exp

 *

 *

 */


#include


#define __REGb(x)    (*(volatile unsigned char *)(x))

#define __REGi(x)    (*(volatile unsigned int *)(x))

#define NF_BASE        0x4e000000

#define NFCONF        __REGi(NF_BASE + 0x0)

#define NFCMD        __REGb(NF_BASE + 0x4)

#define NFADDR        __REGb(NF_BASE + 0x8)

#define NFDATA        __REGb(NF_BASE + 0xc)

#define NFSTAT        __REGb(NF_BASE + 0x10)


#define BUSY 1

inline void wait_idle(void) {

    int i;


    while(!(NFSTAT & BUSY))

      for(i=0; i<10; i++);

}


#define NAND_SECTOR_SIZE    512

#define NAND_BLOCK_MASK        (NAND_SECTOR_SIZE - 1)


/* low level nand read function */

int

nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)

{

    int i, j;

    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) {

        return -1;    /* invalid alignment */

    }


    /* chip Enable */

    NFCONF &= ~0x800;

    for(i=0; i<10; i++);


    for(i=start_addr; i < (start_addr + size);) {

      /* READ0 */

      NFCMD = 0;


      /* Write Address */

      NFADDR = i & 0xff;

      NFADDR = (i >> 9) & 0xff;

      NFADDR = (i >> 17) & 0xff;

      NFADDR = (i >> 25) & 0xff;


      wait_idle();


      for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {

    *buf = (NFDATA & 0xff);

    buf++;

      }

    }


    /* chip Disable */

    NFCONF |= 0x800;    /* chip disable */


    return 0;

}


接着修改board/gec2410/makefile,增加对nand_read.c的编译

第28行:

COBJS     := gec2410.o flash.o nand_read.o


9.修改cpu/arm920t/start.S文件

2410从Nand Flash启动时,NAND FLASH的前4KB(地址为0x00000000,OM[1:0]=0)将被装载到SDRAM中被称为Setppingstone的地址中,然后开始执行这段代码.启动以后,这4KB的空间可以做其他用途,在start.S加入搬运代码.

主要工作开始初始化NAND控制器,然后调用nand_read.c中的nand_read_ll函数来复制u-boot自身代码到RAM中,最后跳转到RAM中运行.汇编代码如下:


#ifdef CONFIG_S3C2410_NAND_BOOT

    bl    copy_myself

 

      @ jump to ram

    ldr   r1, =on_the_ram

    add  pc, r1, #0

    nop

    nop

    1:    b     1b          @ infinite loop

 

on_the_ram:

#endif


/* Set up the stack     */

stack_setup:

#..............

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

ldr pc, _start_armboot


_start_armboot: .word start_armboot


#ifdef CONFIG_S3C2410_NAND_BOOT

copy_myself:

    mov r10, lr

@ reset NAND

    mov r1, #NAND_CTL_BASE

     ldr   r2, =0xf830           @ initial value

    str   r2, [r1, #oNFCONF]

    ldr   r2, [r1, #oNFCONF]

    bic  r2, r2, #0x800              @ enable chip

    str   r2, [r1, #oNFCONF]

    mov r2, #0xff         @ RESET command

    strb r2, [r1, #oNFCMD]

    mov r3, #0                   @ wait


1:add  r3, r3, #0x1

    cmp r3, #0xa

    blt   1b

2:ldr   r2, [r1, #oNFSTAT]      @ wait ready

    tst    r2, #0x1

    beq  2b

    ldr   r2, [r1, #oNFCONF]

    orr  r2, r2, #0x800              @ disable chip

    str   r2, [r1, #oNFCONF]


@ get read to call C functions (for nand_read())

    ldr   sp, DW_STACK_START       @ setup stack pointer

    mov fp, #0                    @ no previous frame, so fp=0


@ copy vivi to RAM

    ldr   r0, =UBOOT_RAM_BASE

    mov     r1, #0x0

    mov r2, #0x20000

    bl    nand_read_ll

    tst    r0, #0x0

    beq  ok_nand_read


#ifdef CONFIG_DEBUG_LL

    bad_nand_read:

    ldr   r0, STR_FAIL

    ldr   r1, SerBase

    bl    PrintWord

1:b     1b          @ infinite loop

#endif


ok_nand_read:

#ifdef CONFIG_DEBUG_LL

    ldr   r0, STR_OK

    ldr   r1, SerBase

    bl    PrintWord

#endif


@ verify

    mov r0, #0

    ldr   r1, =UBOOT_RAM_BASE

    mov r2, #0x400     @ 4 bytes * 1024 = 4K-bytes

go_next:

    ldr   r3, [r0], #4

    ldr   r4, [r1], #4

    teq   r3, r4

    bne  notmatch

    subs r2, r2, #4

    beq  done_nand_read

    bne  go_next


notmatch:

#ifdef CONFIG_DEBUG_LL

    sub  r0, r0, #4

    ldr   r1, SerBase

    bl    PrintHexWord

    ldr   r0, STR_FAIL

    ldr   r1, SerBase

    mov r2, #0

     mov r3, r2

    mov r4, r2

    mov r5, r2

    mov r6, r2

    mov r7, r2

[1] [2]
关键字:UBOOT  S3C2410  移植 引用地址:UBOOT-1.1.6在S3C2410上的移植(基于GEC2410)

上一篇:linux 2.6.24.4在S3C2410上的移植(内核配置)(基于GEC2410)
下一篇:AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17

推荐阅读最新更新时间:2024-11-16 20:16

【GD32 MCU 移植教程】5、GD32E230 系列移植到 GD32F330 系列
1.前言 GD32E230 系列是 GD 的 Cortex_M23 系列产品,GD32F330 系列是 GD 的 Cortex_M4 系列产品,这两个系列的兼容度非常高。客户会有从 GD32E230 系列移植到 GD32F330 系列的需求,本文档专门针对既有的 GD32E230 代码如何移植到 GD32F330 做一个详细的介绍; 2.硬件差异 GD32E230 系列的封装类型有:TSSOP20、LGA20、QFN28、QFN32、LQFP32、LQFP48,GD32F330系列的封装类型有:TSSOP20、QFN28、QFN32、LQFP48、LQFP64,两个系列相同封装的芯片引脚是兼容的。 注意: 1. TSSOP20
[单片机]
【GD32 MCU <font color='red'>移植</font>教程】5、GD32E230 系列<font color='red'>移植</font>到 GD32F330 系列
基于Linux的kfifo移植到STM32(支持os的互斥访问)
关于kfifo kfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现;它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只有一个入队线程和一个出队线程的场情时,两个线程可以并发操作,而不需要任何加锁行为,就可以保证kfifo的线程安全。 具体什么是环形缓冲区,请看我以前的文章 说明 关于kfifo的相关概念我不会介绍,有兴趣可以看他的相关文档,我只将其实现过程移植重写,移植到适用stm32开发板上,并且按照我个人习惯重新命名,RingBuff- 意为环形缓冲区 RingBuff_t 环形缓冲区的结构体成员变量,具体含义看注释。 buff
[单片机]
S5PV210开发 -- QT4.8 移植
今天应网友要求给他,生成一下nand平台的根文件系统。由此简单的来讲解一下。 一、安装交叉编译器 前面讲过了,参看:S5PV210开发 -- 交叉编译器 二、安装 QT4.8 源码包 将光盘中的 QT4.8 源码包 qt_x210v3s_160307.tar.bz2 拷贝到 ubuntu 的用户目录并解压: tar -xvf qt_x210v3s_160307.tar.bz2 接下来分为 Nand和iNand平台编译方式不一样的。 三、nand 平台移植 (1)编译uboot 执行如下指令编译: ./mk -un 在 release 目录下生成 uboot.bin (2)编译内核 执行如
[单片机]
S5PV210开发 -- QT4.8 <font color='red'>移植</font>
S3C2440移植uboot之支持DM9000
上一节S3C2440移植uboot之支持NANDFLASH操作移植了uboot 支持了NANDFLASH的操作,这一节修改uboot支持DM9000。 目录 通过Makefile把dm9000x编译进uboot 编译报错 DM9000_DATA 修改内存控制器时序 网卡的初始化的流程 支持DM9000C的初始化 编译测试 TFTP下载测试 通过Makefile把dm9000x编译进uboot cd drivers/net vi Makefile 需要在文件中添加以下宏 在smdk2440.h中修改文件支持DM9000 #if 0 #define CONFIG_CS8900 /* we have a CS8
[单片机]
S3C2440<font color='red'>移植</font><font color='red'>uboot</font>之支持DM9000
OK6410A 开发板 (六) 1 OK6410A linux-4.0 移植
增加 arch/arm/configs/forlinx6410_defconfig 增加 firmware/sd8686.bin 增加 firmware/sd8686_helper.bin 用下面的编译器 $ arm-none-linux-gnueabi-gcc --version arm-none-linux-gnueabi-gcc (Sourcery CodeBench Lite 2014.05-29) 4.8.3 20140320 (prerelease) Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the
[单片机]
linux-3.0内核移植到fl2440开发板(以MINI2440为模板)
我们的fl2440开发板使用的是s3c2440的芯片,与MINI2440十分相似,因此需要改动的地方不多,移植也比较容易。 1. $ sudo tar -xjf linux-3.0.tar.bz2 2. 进入 linux-3.0,修改顶层Makefile 配置CPU类型和交叉编译器(195,196行) ARCH ?= arm CROSS_COMPILE ?= /opt/buildroot-2011.11/arm920t/usr/bin/arm-linux- 添加zImage头制作(559行后面) cp arch/arm/boot/zImage . -f /home/weishusheng/kernel/linux-3
[单片机]
S3C2410下mplayer音视频播放器移植
一、s3c2410移植ALSA及相关工具使用 相关源码文件 ncurses-5.6.tar.gz alsa-lib-1.0.17.tar.bz2 alsa-utils-1.0.17.tar.bz2 1. 设置环境变量 export MEDIA_INSTALL_DIR=/home/linux/driver/mplay/media_install 2. 编译ncurses tar zxvf ncurses-5.6.tar.gz cd ncurses-5.6 ./configure --host=arm-linux --target=arm-linux --build=i686-linux --with-softfloat --pre
[单片机]
详细讲解 移植Uboot到ARMer9开发系统上
首先了解ARMer9开发系统硬件设计上和三星原装SMDK2410之间的区别。让uboot在ARMer9开发系统上跑起来,目前只需要关注如下的硬件区别,解决了下面这个问题,uboot就可以在ARMer9开发系统上正常地从串口输出,进入提示符。很多命令都可以使用,当然有些命令需要做修改。 SMDK2410 : nor flash 是AMD的1M的; ARMer9: 是Intel E28F128J3A, 两片并联,一共32M Bytes. 下载一个uboot-1.1.1.tar.bz2.; tar jxvf uboot-1.1.1.tar.bz2; 在uboot 目录board/smdk2410 下的flash.
[单片机]

推荐帖子

Altium Designer 6。6绘制原理图,制作PCB
感觉很好用,我这还有配套的封装库!!!想要得留下邮箱把!AltiumDesigner6。6绘制原理图,制作PCB好。文件有多大?请发到公共信箱吧,让大家都去下载,不麻烦你一个个发了,呵呵。。回复:AltiumDesigner6。6绘制原理图,制作PCB楼主我只要封装库,麻烦发给我一下,pxy94@163.com回复:AltiumDesigner6。6绘制原理图,制作PCB原帖由qufuybj于2007-8-308:57:00发表好。文件有多大?请发到公
歹匕示申 PCB设计
求教vxworks的调试方法
本人使用VxWorks时遇到问题,描述如下:1.系统什么应用程序都没有,只有个VXwroks系统和定时器、串口、网口驱动。2.在ping开发板网络时出现了系统复位!!!!!请问大神:vxwork下有哪些有效的调试方法能够定位这个问题,或者vxworks下有哪些通用的调试方法,求大神传授调试经验,万分感谢!小弟也有vxworks的部分资料,如果有需要可以提供!!!求教vxworks的调试方法
whwshiyuan1984 实时操作系统RTOS
求AD画PCB版图教程
新手报到!求大神指点AD画PCB版图教程,谢谢!求AD画PCB版图教程先去下载资料看看吧下载中心,输入AltiumDesigner教程
DickDragon PCB设计
5v怎么转到6v求大神给个电路图做参考
5v怎么转到6v求大神给个电路图做参考5v怎么转到6v求大神给个电路图做参考5v怎么转到6v求大神给个电路图做参考5v怎么转到6v求大神给个电路图做参考需要多大电流?电流不太大的话,可以考虑使用MC34063A。此芯片性能并不好,但比较便宜。比较容易实现的可以用LM2577,静态电流比较大,输出功率也大,如果想要效率高体积小那就得找专业芯片了 毕设的时候用过这个芯片:)电路挺简单的电流要说清楚,关系到功率的不考虑功率的话,随便找个升压ic就行。 给stm32供电用的,
PCB学徒 模拟与混合信号
基于msp430单片机1602 DS1802温度显示
最近调好了DS1802温度传感器,用的是430G2553单片机,温度保留两位小数。把源代码分享给大家。  /*****************************************  msp430g2553实现1602温度显示  来源:汪中原的博客  ******************************************/  #include  #defineucharunsignedchar  #defineuintunsignedint  
fish001 微控制器 MCU
中国标准的电波钟信号模拟器
调试电波钟很方便,使用标准的esp32开发板,直接在io脚上连接了一个汽车无钥匙进入用的125k发射天线(频率误差极大,正确的应该是68.5k),所以效率会很低,实际测试能在2米内可靠干扰电波钟的时间,如果使用频率匹配的天线io驱动应该不够,需要加一级驱动电路,比较合适的是mos门级驱动芯片使用pwm生成载波误差还不算大,偏差7hz左右,效果算是很好的了中国标准的电波钟信号模拟器附件资料是个什么格式68.5k自己用铜线绕一个大线圈效果能好点。学习了,内容非常清晰,非
wangshujun72 MicroPython开源版块
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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