相关软件下载地址:http://pan.baidu.com/s/16yo8Y

适用于fsc100开发板

交叉编译器arm-cortex_a8-linux-gnueabi-gcc

u-boot-2010.03

一、建立自己的平台

1、 下载源码

我们可以在下面这个网站上下载最新的和以前任一版本的uboot

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

2、 解压uboot源码并进入目录

$ tar  xvf  u-boot-2010.03.tar.gz

$ cd  u-boot-2010.03

3、 添加fsc100平台信息

我们关心的板级相关文件或目录

u-boot-2010.03/Makefile

u-boot- 2010.03/include/configs/smdkc100.h

u-boot- 2010.03 /cpu/arm_cortexa8/start.S

u-boot- 2010.03 /board/samsung/smdkc100

u-boot- 2010.03 /lib_arm

smdkc100是使用s5pc100芯片的参考板,我们在其基础之上移植fsc100

$ cd  board/samsung/

$ cp  –a  smdkc100  fsc100

$ cd  fsc100

$ mv  smdkc100.c  fsc100.c

$ vim  Makefile

修改

COBJS-y := smdkc100.o

COBJS-y := fsc100.o

$ cd  include/configs

$ cp  smdkc100.h  fsc100.h

修改u-boot顶层目录下的Makefile,指定交叉工具链

$ vim  Makefile

ifeq ($(HOSTARCH, $(ARCH))

CROSS_COMPILE ?=

endif

下添加:

ifeq (arm, $(ARCH))

CROSS_COMPILE ?= arm-cortex_a8-linux-gnueabi-

endif

在u-boot顶层目录下的Makefile中添加fsc100配置信息

$ vim  Makefile

smdkc100_config: unconfig

@$(MKCONFIG)  $(@:_config=)  arm  arm_cortexa8  smdkc100  samsung s5pc1xx

下添加:

fsc100_config: unconfig

@$(MKCONFIG)  $(@:_config=)  arm  arm_cortexa8  fsc100  samsung  s5pc1xx

1、 编译u-boot-2010.03

$ make  distclean

$ make  fsc100_config

$ make

编译完成后生成的u-boot.bin就是可执行的镜像文件。但是该文件只能在smdkc100平台上运行,我们需要对u-boot源代码进行相应的修改。

二、针对我们的fsc100平台进行相应的移植

1、 修改include/configs/fsc100.h

修改内存基址

#define  CONFIG_SYS_SDRAM_BASE   0x30000000

#define  CONFIG_SYS_SDRAM_BASE   0x20000000

#undef   CONFIG_CMD_NAND

改成

#define  CONFIG_CMD_NAND

#undef   CONFIG_CMD_NET

改成

#define  CONFIG_CMD_NET

#define   CONFIG_CMD_NAND

后添加

#define  CONFIG_SYS_ICACHE_OFF          1

注释以下内容

#define  CONFIG_CMD_ONENAND

注释以下内容

#define  MTDIDS_DEFAULT  “onenand…”

……

#define  CONFIG_UPDATEB  “updateb=……”

注释以下内容

#define  CONFIG_EXTRA_ENV_SETTINGS          \

……

“ubi=enabled”

修改提示符

#define  CONFIG_SYS_PROMPT             “SMDKC100  #  ”

#define  CONFIG_SYS_PROMPT          FSC100  #  ”

修改

#define  CONFIG_SYS_MEMTEST_END      (CONFIG_SYS_SDRAM_BASE+0x5e00000)

#define  CONFIG_SYS_MEMTEST_END      (CONFIG_SYS_SDRAM_BASE+0x10000000)

修改内核加载地址

#define  CONFIG_SYS_LOAD_ADDR              CONFIG_SYS_SDRAM_BASE

#define  CONFIG_SYS_LOAD_ADDR        (CONFIG_SYS_SDRAM_BASE+0x8000)

修改内存容量

#define  PHYS_SDRAM_1_SIZE        (128 << 20)

#define  PHYS_SDRAM_1_SIZE             (256 << 20)

修改环境变量存放位置

#define   CONFIG_ENV_IS_IN_ONENAND           1

#define  CONFIG_ENV_IS_IN_NAND            1

注释以下内容

#define   CONFIG_USE_ONENAND_BOARD_INIT

#define  CONFIG_SYS_ONENAND_BASE              0xE7100000

#define  CONFIG_DOS_PARTITION            1

下面添加如下信息

添加NAND信息

#define  CONFIG_SYS_MAX_NAND_DEVICE            1

#define  CONFIG_SYS_NAND_MAX_CHIPS        1

#define  CONFIG_SYS_NAND_BASE            0xE7200000

#define  CONFIG_NAND_S5PC100         1

#define  CONFIG_NAND_BL1_8BIT_ECC            1

#define  CFG_NAND_HWECC         1

 

#define  NAND_ENABLE_CE() (NFCONT_REG &= ~(1<<1))

#define  NAND_DISABLE_CE() (NFCONT_REG |= (1<<1))

#define  NF_TRANSRnB()    do {while (! (NFSTAT_REG  & (1<<0)) );} while(0)

添加网卡信息

#ifdef  CONFIG_CMD_NET

#define  CONFIG_NET_MULTI

#define  CONFIG_CMD_PING         1

#define  CONFIG_DRIVER_DM9000             1

#define  CONFIG_DM9000_BASE           0x88000000

#define  DM9000_IO   CONFIG_DM9000_BASE

#define  DM9000_DATA   (CONFIG_DM9000_BASE  +  4)

#define  CONFIG_DM9000_USE_16BIT

#define  CONFIG_DM9000_NO_SROM         1

#define  CONFIG_ETHADDR   11:22:33:44:55:66

#define  CONFIG_IPADDR          192.168.1.200

#define  CONFIG_SERVERIP          192.168.1.100

#define  CONFIG_GATEWAYIP     192.168.1.1

#define  CONFIG_NETMASK   255.255.255.0

#endif

1、 复制lowlevel_init.S  mem_setup.Sboard/samsung/fsc100

上述代码专门针对fsc100使用的内存进行初始化,可参考相关芯片手册

2、 复制fsc100.cboard/smsung/fsc100 覆盖原来的fsc100.c

fsc100.c 包含的是板级初始化函数

3、 board/samsung/fsc100/目录下添加nand_cp.c

#include  <common.h>

#ifdef  CONFIG_S5PC1XX

#include  <asm/io.h>

#include  <linux/mtd/nand.h>

#define  _REG__(x)          (*(volatile  unsigned  long  *)(x))

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

#define  NFCONT_REG           _REG__(0xE7200004)

#define  NFCMD_REG          _REG__(0xE7200008)

#define  NFADDR_REG        _REG__(0xE720000C)

#define  NFDATA8_REG      _REGb__(0xE7200010)

#define  NFSTAT_REG         _REG__(0xE7200028)

#define  NAND_CONTROL_ENABLE()      (NFCONT_REG |= (1 << 0))

static  int  nandll_read_page (uchar  *buf,  ulong  addr,  int  large_block)

{

int  i;

int  page_size = 512;

if  (large_block)   page_size = 2048;

NAND_ENABLE_CE();

NFCMD_REG = NAND_CMD_READ0;

/*  Write  Address  */

NFADDR_REG = 0;

if  (large_block)   NFADDR_REG  =  0;

NFADDR_REG = (addr) & 0xff;

NFADDR_REG = (addr >> 8) & 0xff;

NFADDR_REG = (addr >> 16) & 0xff;

if  (large_block)   NFCMD_REG = NAND_CMD_READSTART;

NF_TRANSRnB();

for (i=0; i<page_size; i++) {

*buf++ = NFDATA8_REG;

}

NAND_DISABLE_CE();

return  0;

}

static  int  nandll_read_blocks (ulong  dst_addr,  ulong  size,  int  large_block)

{

uchar  *buf = (uchar *)dst_addr;

int  i, pages;

uint  page_shift = 9;

if  (large_block)  page_shift = 11;

pages  =  size >> page_shift;

for (i=0;  i<pages; i++)  {

nandll_read_page(buf,  i,  large_block);

buf  +=  (1 << page_shift);

}

return  0;

}

int  copy_uboot_to_ram (void)

{

int  i, large_block = 0;

vu_char  id;

NAND_CONTROL_ENABLE();

NAND_ENABLE_CE();

NFCMD_REG = NAND_CMD_READID;

NFADDR_REG = 0x0;

/*   wait  for a  while  */

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

id  =  NFDATA8_REG;

id  =  NFDATA8_REG;

if  (id  >  0x80)   large_block  =  1;

return  nandll_read_blocks(0x2ff80000,  0x40000,  large_block);

}

#endif

1、 修改board/samsung/fsc100/Makefile

SOBJS     :=  lowlevel_init.o

改成

SOBJS     :=  lowlevel_init.o  mem_setup.o

 

COBJS-y  :=  fsc100.o

改成

COBJS-y :=  fsc100.o  nand_cp.o

2、 修改board/samsun/fsc100/config.mk

TEXT_BASE  =  0x34800000

改成

TEXT_BASE  =  0x2FF80000

3、 修改cpu/arm_cortexa8/start.S

#ifndef  CONFIG_SKIP_LOWLEVEL_INIT

bl   cpu_init_crit

#endif

之后添加如下代码

/*  判断uboot是否在内存中运行 */

ldr   r0,  =_TEXT_BASE

adr  r1,  _TEXT_BASE

cmp  r0,  r1

beq   stack_setup

 

ldr  sp,  =(0x22000000)

bl  copy_uboot_to_ram

b   stack_setup

4、 链接文件的修改

修改cpu/arm_cortexa8/u-boot.lds为:

……

.text   :

{

cpu/arm_cortexa8/start.o       (.text)

          board/samsung/fsc100/lowlevel_init.o

board/samsung/fsc100/mem_setup.o

          board/samsung/fsc100/nand_cp.o

*(.text)

}

……

5、 复制s5pc100.h  s5pc1x0.h  hardware.h   include/asm-arm/arch-s5pc1xx/

 

6、 复制s5p_nand.cdrivers/mtd/nand/

 

7、 修改drivers/mtd/nand/Makefile

COBJS-$(CONFIG_NAND_S3C64XX)  +=  s3c64xx.o

后面添加

COBJS-$(CONFIG_NAND_S5PC100)  += s5p_nand.o

8、 修改include/linux/mtd/mtd-abi.h

struct  nand_ecclayout  {

……

struct  nand_oobfree  oobfree[MTD_MAX_OOBFREE_ENTRIES];

uint32_t  useecc;

uint32_t  reserved;

};

9、 lib_arm/board.c中添加网卡初始化代码

eth_initialize(gd->bd);

后面添加

eth_init(gd->bd);

10、 修改网卡驱动drivers/net/dm9xxx.c

在函数dm9000_init中,

DM9000_iow(DM9000_IMR, IMR_PAR);

之后的内容都注释掉,直到该函数结束(return  0之前)

 

11、 修改include/net.h

static inline  int  is_multicast_ether_addr(const u8 *addr)

{

return  (0x01  ==  addr[0]);

}

 

12、 修改net/net.c

在 int  NetArpWaitTry; 后添加如下代码

ulong  timer_clk;

 

void  ArpTimeoutCheck(void)

{

……

t  =   get_timer(0);

改成

t  =  get_timer(0)  /  (timer_clk / CONFIG_SYS_HZ);

}

extern unsigned  long  (*get_pclk)(void);

int  NetLoop(proto_t  protocol)

{

bd_t  *bd  =  gd->bd;

添加如下代码:

timer_clk  =  get_pclk()  /  (16 * 2);

      ……

注释以下代码

eth_halt();

eth_set_current();

if  (eth_init(bd)  <  0)  {

       eth_halt();

       return  -1;

}

     

if  (timeHandler  && ( … > timeDelta) {

改成

ulong  t;

      t  =  get_timer(0) / (timer_clk  /  CONFIG_SYS_HZ);

      if  (timeHandler  && (t  -  timeStart)  > timeDelta)  {

      ……

}

void  NetSetTimeout(ulong  iv,  thand_f  *f)

{

timeStart  =  get_timer(0);

改成

timeStart  =  get_timer(0)  /  (timer_clk  /  CONFIG_SYS_HZ);

}

int  NetSendUDPPacket(uchar *ether,  IPaddr_t  dest,  int  dport,  int  sport,  int  len)

{

……

NetArpWaitTimerStart  =  get_timer(0);

改成

NetArpWaitTimerStart  =  get_timer(0)  /  (timer_clk  /  CONFIG_SYS_HZ);

……

}

int  PingSend(void)

{

……

NetArpWaitTimerStart  =  get_timer(0);

改成

NetArpWaitTimerStart  =  get_timer(0)  /  (timer_clk  /  CONFIG_SYS_HZ);

……

}

注释该文件中所有的eth_halt()

1、 go命令的优化

修改该common/cmd_boot.c

int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])

{

ulong   addr, rc;

int    rcode = 0;

if  (argc < 2) {

return  cmd_usage(cmdtp);

}

/**************** added by farsight 2011-12-18 *****************/

char *cmdline  =  getenv("bootargs");

struct param_struct *kernel_params=(struct param_struct *)0x20000100;

printf("setup linux parameters at 0x20000100\n");

memset(kernel_params, 0, sizeof(struct  param_struct));

kernel_params->u1.s.page_size=4096;

kernel_params->u1.s.nr_pages=0x10000000>>12;

memcpy(kernel_params->commandline, cmdline, strlen(cmdline)+1);

printf("linux command line is: \"%s\"\n",cmdline);

/***************************************************************/

addr = simple_strtoul(argv[1], NULL, 16);

printf ("## Starting application at 0x%08lX ...\n", addr);

/******************* added by farsight 2011-12-18 ******************/

__asm__(

"ldr  r1, =1826\n"

"mov        ip, #0\n"

"mcr        p15, 0, ip, c8, c7, 0\n"

"mcr        p15, 0, ip, c7, c5, 0\n"

"mcr        p15, 0, ip, c7, c5, 6\n"

"mcr        p15, 0, ip, c7, c10, 4\n"

"mcr        p15, 0, ip, c7, c5, 4\n"

"mrc        p15, 0, ip, c1, c0, 0\n"

"bic        ip, ip, #0x00002000\n"

"bic        ip, ip, #0x00000007\n"

"orr        ip, ip, #0x00000002\n"

"orr        ip, ip, #0x00000800\n"

"bic        ip, ip, #0x00001000\n"

"mcr        p15, 0, ip, c1, c0, 0\n"

"mov pc, %0\n"

"nop\n"

:

:"r"(addr)

);

/***************************************************************/

rc = do_go_exec ((void *)addr, argc - 1, argv + 1);

if (rc != 0) rcode = 1;

printf ("## Application terminated, rc = 0x%lX\n", rc);

return rcode;

}

三、重新编译

$ make  distclean

$ make  fsc100_config

$ make

这样我们就得到能够在fsc100平台上使用的u-boot.bin

s5pc100开发板uboot移植的更多相关文章

  1. 【分享】iTOP4412开发板-Bluetooth移植文档

    [分享]iTOP4412开发板-Bluetooth移植文档 最近须要把Bluetooth移植到iTOP-4412 开发平台.查阅了相关资料,经过一段时间的研究.调试,最终成功的将蓝牙功能移植到了开发板 ...

  2. 在秉火STM32F429挑战者开发板上移植Huawei LiteOS指南

    昨天在B站上突然看到了一个短视频,是在正点原子的战舰V3开发板上移植华为的Huawei LiteOS操作系统,就是这个视频:看完鸿蒙OS发布会,试用华为的物联网操作系统Lite OS(B站),于是呢, ...

  3. ARM开发板系统移植-----u-boot的编译

    本文和另外两篇姊妹篇都是为了说明如何裁剪出适合在mini2440 开发板上运行的Linux系统,以记录自己的学习成果.其中本文先介绍了嵌入式系统的软件组成部分,然后介绍编译出适合在mini2440开发 ...

  4. s5pc100开发板网卡驱动的移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y fsc100开发板 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc 平台代码修改 vim   ...

  5. s5pc100开发板Nand flash移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y fsc100开发板 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc Ÿ   添加针对我们平台 ...

  6. s5pc100开发板linux内核移植

    相关软件下载地址:http://pan.baidu.com/s/16yo8Y 应用于FSC100开发板 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc linux-2.6 ...

  7. u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统

    http://www.linuxidc.com/Linux/2012-09/70510.htm  来源:Linux社区  作者:赵春江 uboot最主要的功能就是能够引导内核启动.本文就介绍如何实现该 ...

  8. ARM开发板系统移植-----rootfs的制作

    前面两篇文章分别介绍了mini2440开发板上运行的bootloader和kernel,到这里系统启动后其实是停留在一个“僵死”的状态---无法挂载根文件系统. 这里将介绍如何制作一个根文件系统,并且 ...

  9. ARM开发板系统移植-----kernel的编译

    前面一篇文章http://www.cnblogs.com/linzizhang/p/4817336.html介绍了开发板上系统软件的第一部分--bootloader的编译方法. 背景:把bootloa ...

随机推荐

  1. 关于页面跳转之后获取不到session数据的问题

    暂时的解决方法有两种,亲测有效: 方法一:  将页面跳转方式由a标签改为请求转发request.getRequestDispatcher("stu_list.jsp").forwa ...

  2. 查看 Secret【转】

    可以通过 kubectl get secret 查看存在的 secret. 显示有两个数据条目,kubectl describe secret 查看条目的 Key: 如果还想查看 Value,可以用  ...

  3. 洛谷 P1929 迷之阶梯

    题目传送门 解题思路: f[i]表示跳到第i层的最少移动次数,如果可以从下面一级跳上来,那么直接跳上来,如果跳不上来,那就往后退,退到不能退或能跳上第i层 AC代码: #include<iost ...

  4. 039、Java中逻辑运算之普通与运算“&”

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  5. 认识json,详解JsonConfig

    说到json 初学者很迷茫,不知json怎么为何物,以及怎么用.我简单说下我的了解 既然用了json 我们就要知其然也知其所以然.下面有几个疑问 1.为什么要用json?也就是json 的优势 2.我 ...

  6. MapReduce On Yarn的执行流程

    1.概述 Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序. Yarn的架构如下图所示: ...

  7. DevOps - 为什么

    章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...

  8. python -- 相对路径、绝对路径、以及路径的获取

    1.定义 绝对路径:就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件.   相对路径:就是以当前文件为基准进行一级级目录指向被引用的资源文件. ../ 表示当前文件所在 ...

  9. 用JS改变embed标签的src属性

    思路: A.先隐藏embed标签 B.清除embed元素 C.为embed重新赋值,加入Html页面中 1.html代码 <object id="forfun" classi ...

  10. 文本编辑器vim/vi——模式切换及输入模式

    vim一共有三种模式:命令模式.输入模式.末行模式 要从命令模式切换到输入模式:a,i,o a——append 属于在后面追加内容:i——insert 属于插入,在前面插入内容:o——other 属于 ...