u-boot 2008.10 移植手记

 

u-boot 2008.10 移植手记

 

0步、建立自己的开发板配置文件。

1、打开u-boot主上目录下的Makefile , 找到smdk2410_config, 在其下,加入如下语句

smdk2410_config    :        unconfig

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

 

yc2410_config          :        unconfig

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

 

各项的意思如下:

arm: CPU的架构(ARCH

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

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

NULL:开发者/或经销商(vender),我这里选空

S3c24x0:片上系统(SOC

 

2、修改CROSS_COMPILE为自己的arm gcc编译器:

……

CROSS_COMPILE = /usr/local/arm/4.1.1/arm-linux/bin/arm-linux-   //这是我的所使用编译器

//的位置

ifndef CROSS_COMPILE

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

……

3、在board子目录下建立自己的开发板yc2410目录,然后,将smdk2410目录下的文件拷入此目录中,然后,将yc2410目录下的smdk2410.c改为yc2410.c,同时还得修改board/yc2410/Makefile文件。

……

COBJS       := yc2410.o flash.o

……

4、在include/configs/下建立yc2410.h配置头文件

smdk2410的相应头文件复制一份在相同目录下,并改名为yc2410.h

 

5、测试编译能否成功

1)配置

[chinajszcw@localhost u-boot-2008.10]$ make yc2410_config

Configuring for yc2410 board...

 

2)测试编译

[chinajszcw@localhost u-boot-2008.10]$ make

测试通过,则说明开发板配置平台搭建没问题,可以进行下一步工作。

 

1步、修改相关文件,使u-boot能从nand中启动

1、修改cpu/arm920t/start.S

         #include <config.h>

         #include <version.h>

         #ifdef CONFIG_AT91RM9200DK

         #include <status_led.h>  /*这是针对AT91RM9200DK开发板的,我们注释掉。*/

         #endif

         …………

 

start_code:

         /*

          * set the cpu to SVC32 mode

          */

         mrs  r0,cpsr

         bic    r0,r0,#0x1f

         orr    r0,r0,#0xd3

         msr  cpsr,r0

 

#ifdef CONFIG_AT91RM9200DK

         bl coloured_LED_init  /*这是针对AT91RM9200DK开发板的。*/

         bl red_LED_on

#endif

 

1)修改中断禁止部分

/*

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

          */

         mov r1, #0xffffffff

         ldr    r0, =INTMSK

         str    r1, [r0]

# if defined(CONFIG_S3C2410)

         ldr    r1, =0x7ff     //根据2410芯片手册,INTSUBMSK11位可用

//应该为0x7ff,可U-Boot一直为0x3ff

         ldr    r0, =INTSUBMSK

         str    r1, [r0]

# endif

 

(2)修改时钟设置(可以不修改,因为后面的board_init函数也会设置时钟)

 

# if defined(CONFIG_S3C2400)

#  define pWTCON                   0x15300000

#  define INTMSK            0x14400008     /* Interupt-Controller base addresses */

#  define CLKDIVN 0x14800014     /* clock divisor register */

#else

#  define pWTCON                   0x53000000

#  define INTMSK            0x4A000008     /* Interupt-Controller base addresses */

#  define INTSUBMSK    0x4A00001C

#  define CLKDIVN 0x4C000014     /* clock divisor register */

# endif

 

#       define CLK_CTL_BASE      0x4C000000

#       define MDIV_200              (0xa1 << 12)

#       define PSDIV_200             0x31

 

#ifdef CONFIG_S3C2410

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

         /* default FCLK is 120 MHz ! */

         ldr    r0, =CLKDIVN

         mov r1, #3

         str    r1, [r0]

 

         mrc  p15, 0, r1, c1, c0, 0 /* read ctrl register */

         orr    r1, r1, #0xc0000000                  /* Asynchronous */

         mcr  p15, 0, r1, c1, c0, 0 /* write ctrl register */

 

         /* now , CPU Clock is 202.8 MHz */

         mov r1, #CLK_CTL_BASE

         mov r2, #MDIV_200                                    /* mpll_200MHz */

         add          r2, r2, #PSDIV_200

         str    r2, [r1, #0x04]                    /* MPLLCON */

 

#endif

 

3)将u-bootNor Flash启动改成从NAND Flash启动

 

#if defined(CONFIG_S3C2410_NAND_BOOT)

@ 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

nand1:

         add  r3, r3, #0x1

         cmp r3, #0xa

         blt    nand1

nand2:

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

         tst    r2, #0x1

         beq  nand2

         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 U-Boot to RAM

         ldr    r0, =TEXT_BASE

         mov   r1, #0x0

         mov r2, #UBOOT_LENGTH

         bl      nand_read_ll

 

         tst    r0, #0x0

         beq  ok_nand_read

 

bad_nand_read:

loop2:       b       loop2                  @ infinite loop

        

ok_nand_read:

         @ verify

         mov r0, #0

         ldr    r1, =TEXT_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  stack_setup    

         bne  go_next

 

notmatch:

loop3: b loop3  @ infinite loop

 

#elif !defined(CONFIG_AT91RM9200) && !defined(CONFIG_SKIP_RELOCATE_UBOOT)

 

//#ifndef  CONFIG_AT91RM9200

 

//#ifndef CONFIG_SKIP_RELOCATE_UBOOT

relocate:                              /* relocate U-Boot to RAM          */

         adr   r0, _start          /* r0 <- current position of code   */

         ldr    r1, _TEXT_BASE                 /* test if we run from flash or RAM */

         cmp     r0, r1                  /* don't reloc during debug         */

         beq     stack_setup

 

         ldr    r2, _armboot_start

         ldr    r3, _bss_start

         sub   r2, r3, r2           /* r2 <- size of armboot            */

         add  r2, r0, r2           /* r2 <- source end address         */

 

copy_loop:

         ldmia        r0!, {r3-r10}               /* copy from source address [r0]    */

         stmia        r1!, {r3-r10}               /* copy to   target address [r1]    */

         cmp r0, r2                           /* until source end addreee [r2]    */

         ble    copy_loop

//#endif    /* CONFIG_SKIP_RELOCATE_UBOOT */

//#endif

#endif   /* Boot Select */

 

在“_start_armboot:      .word start_armboot”后加入

 

#if defined(CONFIG_S3C2410_NAND_BOOT)

.align 2

DW_STACK_START:         .word STACK_BASE+STACK_SIZE-4

#endif

 

此步骤中cpu/arm920t/start.S修改完毕。

2、在board/yc2410 目录中添加Nand Flash读函数文件,直接复制vivi中的nand_read.c文件到board/yc2410/目录下,并修改board/yc2410/Makefile

……

COBJS := yc2410.o nand_read.o flash.o

……

3、修改include/configs/yc2410.h 添加相关宏定义。

NAND_CTL_BASEoNFCONF……等宏定义在

 

……

#define CONFIG_ARM920T              1       /* This is an ARM920T Core    */

#define     CONFIG_S3C2410             1       /* in a SAMSUNG S3C2410 SoC     */

#define CONFIG_YC2410                   1       /* on a SAMSUNG YC2410 Board  */

……

 

……

#define     CONFIG_S3C2410_NAND_BOOT 1

#define     STACK_BASE    0x33f00000

#define     STACK_SIZE      0x10000

 

#ifdef        CONFIG_S3C2410_NAND_BOOT

 

#define   UBOOT_LENGTH 0x40000  /* U-Boot Size 256K */

 

#define     NAND_CTL_BASE    0x4E000000

#define     oNFCONF 0x00

#define     oNFCMD  0x04

#define     oNFADDR          0x08

#define     oNFDATA 0x0c

#define     oNFSTAT   0x10

#define     oNFECC    0x14

#endif

 

 

4、修改board/yc2410/lowlevel_init.S文件

对于S3C2410/S3C2440,通过在start.S中调用lowlevel_init函数来设置存储控制器,使得外接的SDRAM可用。代码在board/yc2410/lowlevel_init.S文件中。注意:lowlevel_init.S文件是开发板相关的,这表示如果外接的设备不一样,可以修改lowlevel_init.S文件中的相关宏。

 

根据开发板的内存区的配置情况,修改board/yc2410/lowlevel_init.S文件。

 

因为我所使用的YC2410的内存配置跟SMDK2410相似,修改的地方并不多。

 

 

#include <config.h>

#include <version.h>

 

 

/* some parameters for the board */

 

/*

 *

 * Taken from linux/arch/arm/boot/compressed/head-s3c2410.S

 *

 * Copyright (C) 2002 Samsung Electronics SW.LEE  <hitchcar@sec.samsung.com>

 *

 */

 

#define BWSCON     0x48000000

 

/* BWSCON */

#define DW8                      (0x0)

#define DW16                    (0x1)

#define DW32                    (0x2)

#define WAIT                      (0x1<<2)

#define UBLB                     (0x1<<3)

 

#define B1_BWSCON                (DW32)

#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                         0x0   /*  0clk */

#define B0_Tcos                         0x0   /*  0clk */

#define B0_Tacc                         0x7   /* 14clk */

#define B0_Tcoh                         0x0   /*  0clk */

#define B0_Tah                           0x0   /*  0clk */

#define B0_Tacp                         0x0

#define B0_PMC                         0x0   /* normal */

 

/* BANK1CON */

#define B1_Tacs                         0x0   /*  0clk */

#define B1_Tcos                         0x0   /*  0clk */

#define B1_Tacc                         0x7   /* 14clk */

#define B1_Tcoh                         0x0   /*  0clk */

#define B1_Tah                           0x0   /*  0clk */

#define B1_Tacp                         0x0

#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 */

 

#define B4_Tacs                         0x0   /*  0clk */

#define B4_Tcos                         0x0   /*  0clk */

#define B4_Tacc                         0x7   /* 14clk */

#define B4_Tcoh                         0x0   /*  0clk */

#define B4_Tah                           0x0   /*  0clk */

#define B4_Tacp                         0x0

#define B4_PMC                         0x0   /* normal */

 

#define B5_Tacs                         0x0   /*  0clk */

#define B5_Tcos                         0x0   /*  0clk */

#define B5_Tacc                         0x7   /* 14clk */

#define B5_Tcoh                         0x0   /*  0clk */

#define B5_Tah                           0x0   /*  0clk */

#define B5_Tacp                         0x0

#define B5_PMC                         0x0   /* normal */

 

#define B6_MT                           0x3   /* SDRAM */

#define B6_Trcd                          0x1

#define B6_SCAN                       0x1   /* 9bit */

 

#define B7_MT                           0x3   /* SDRAM */

#define B7_Trcd                          0x1   /* 3clk */

#define B7_SCAN                       0x1   /* 9bit */

 

/* REFRESH parameter */

#define REFEN                   0x1   /* Refresh enable */

#define TREFMD                         0x0   /* CBR(CAS before RAS)/Auto refresh */

#define Trp                          0x0   /* 2clk */

#define Trc                          0x3   /* 7clk */

#define Tchr                        0x2   /* 3clk */

#define REFCNT                 0x4f4        /* period=7.8125us, HCLK=100MHz, (2048+1-7.8125*100) */

//#define REFCNT                       1113         /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60)

// 因为YC2410板载的是HY57V561620CT-H,它的刷新周期是 64ms/8192 = 7.8125uS

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

 

_TEXT_BASE:

         .word        TEXT_BASE

 

.globl lowlevel_init

lowlevel_init:

         /* memory control configuration */

         /* make r0 relative the current location so that it */

         /* reads SMRDATA out of FLASH rather than memory ! */

         ldr     r0, =SMRDATA

         ldr    r1, _TEXT_BASE

         sub   r0, r0, r1

         ldr    r1, =BWSCON  /* Bus Width Status Controller */

         add     r2, r0, #13*4

0:

         ldr     r3, [r0], #4

         str     r3, [r1], #4

         cmp     r2, r0

         bne     0b

 

         /* everything is fine now */

         mov pc, lr

 

         .ltorg

/* the literal pools origin */

 

SMRDATA:

    .word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))

    .word ((B0_Tacs<<13)+(B0_dTcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))

    .word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))

    .word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))

    .word ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))

    .word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))

    .word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))

    .word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))

    .word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))

    .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)

.word 0xb2                      

.word 0x30

    .word 0x30

 

5、修改 cpu/arm920t/s3c24x0/interrupts.c 使用原来SMDK2410使用的代码也包含进来。

……

#elif defined(CONFIG_SBC2410X) || /

    defined(CONFIG_SMDK2410) || /

         defined(CONFIG_YC2410) || /

    defined(CONFIG_VCMA9)

         tbclk = CFG_HZ;

#else

……

6、第1步骤后记:

         理论上来说。现在把编译好的u-boot.bin写入Nand Flash后,应该就可以了。不过,我移植的时候发现,u-boot老是死在 lowlevel_init.S中,经过反复测试,先排除了移植过程中的人为因素,仔细比对后,发现死在lowlevel_init.S的调用过程中。查看System.map发现编译后的,lowlevel_init函数在地址33f8d34c中,即33f8d34c - 33f80000 = 0xd34c

33f8d34c T lowlevel_init

 

0xd34c已经超出来,S3C2410/S3C24404K steppingstone代码,怪不得要卡死呢?郁闷非常~~~

 

后来在网上查得。修改一下u-boot主目录下的Makefile文件即可。

 

#__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))

__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))

 

再次查看System.map

33f80524 T lowlevel_init

 

呵呵,4K之内,OK了。可是就是不知道为什么这么改,想想就是奇怪,同样是人,为什么其它兄弟能知道,我就不知道的呢?

 

 

2步骤:Nand Flash 支持

u-boot2008.10中对NAND Flash的支持有新旧两套代码,新代码在drivers/mtd/nand目录下,旧代码在drivers/mtd/nand_legacy目录下。文档doc/README.nand对这两套代码有所说明:使用旧代码需要定义更多的宏,而新代码移植自Linux内核2.6.12,它更加智能,可以自动识别更多型号的NAND Flash。目前之所以还保留旧的代码,是因为两个目标板NETTANETTA_ISDN使用JFFS文件系统,它们还依赖于旧代码。当相关功能移植到新代码之后,旧的代码将从U-Boot中去除。

要让U-Boot支持NAND Flash,首先在配置文件include/configs/yc2410.h中,增加CONFIG_CMD_NAND,如下:

/*

 * Command line configuration.

 */

#include <config_cmd_default.h>

 

#define CONFIG_CMD_CACHE

#define CONFIG_CMD_DATE

#define CONFIG_CMD_ELF

#define CONFIG_CMD_NAND

……

然后选择使用哪套代码:在配置文件中定义宏CONFIG_NAND_LEGACY则使用旧代码,否则使用新代码。不过好像Legacy已经不能用在S3C2410中了,当定义了CONFIG_NAND_LEGACY时,编译时会出现如下错误:

error: #error "U-Boot legacy NAND support not available for S3C2410"

make[1]: *** [nand.o] 错误 1

 

所以我们这里使用新代码,即:不定义CONFIG_NAND_LEGACY

Nand 的初始化顺序为:

lib_arm/board.c start_armboot() à drivers/mtd/nand/nand.cnand_init() à  nand_init_chip() àcpu/arm920t/s3c24x0/nand.cboard_nand_init() 以完成Nand Flash的初始化。

 

drivers/mtd/nand/nand.cnand_init() à drivers/mtd/nand/nand_base.cnand_scan() à nand_scan_ident() à nand_set_defaults()

 

nand_scan_ident() à nand_get_flash_type()

drivers/mtd/nand/nand_base.cnand_scan() à nand_scan_tail()

 

nand_scan_ident() :Nand Flash设备扫描。

nand_scan_tail() :这是在nand_scan()中调用,它用于填充所有的初始化函数指针和扫描坏块表是否适当。

 

移植过程如下:

 

 

1、修改include/configs/yc2410.h,增加u-bootNAND的支持(使用非LEGACY方式):

 

/*

 * Command line configuration.

 */

#include <config_cmd_default.h>

 

#define CONFIG_CMD_CACHE

#define CONFIG_CMD_DATE

#define CONFIG_CMD_ELF

#define CONFIG_CMD_NAND

……

/*-----------------------------------------------------------------------

 * NAND flash settings

 */

#if defined(CONFIG_CMD_NAND)

#define CFG_MAX_NAND_DEVICE 1       /* 最大nand flash设备数 */

#define SECTORSIZE 512         /* 1页的大小 */

 

#define ADDR_COLUMN 1   /* Column地址为1个字节 */

#define ADDR_PAGE 3      /* 页块地址为3个字节 */

#define ADDR_COLUMN_PAGE 4  /* 总地址为4字节 */

 

#define NAND_ChipID_UNKNOWN         0x00  /* 未知芯片的ID */

#define NAND_MAX_FLOORS 1     /* nand 最大层数 */

#define NAND_MAX_CHIPS 1       /* nand flash芯片数*/

 

#define CFG_NAND_BASE       0x4E000000     /* NAND控制器基地址*/

#define CONFIG_MTD_NAND_VERIFY_WRITE 1 

#endif       /* CONFIG_CMD_NAND */

 

 

2、修改 drivers/mtd/nand/nand_base.c文件,使u-boot能够显示Nand Flash 型号

/*     MTDDEBUG (MTD_DEBUG_LEVEL0, "NAND device: Manufacturer ID:"

                   " 0x%02x, Chip ID: 0x%02x (%s %s)/n", *maf_id, dev_id,

                   nand_manuf_ids[maf_idx].name, type->name);*/

         printf ("NAND device: Manufacturer ID:"

                   " 0x%02x, Chip ID: 0x%02x (%s %s)/n", *maf_id, dev_id,

                   nand_manuf_ids[maf_idx].name, type->name);

 

 

3、在Nand Flash中保存 u-boot 参数

 

/*

 * Command line configuration.

 */

#include <config_cmd_default.h>

 

#define CONFIG_CMD_CACHE

#define CONFIG_CMD_DATE

#define CONFIG_CMD_ELF

#define CONFIG_CMD_PING

#define CONFIG_CMD_NAND

#define CONFIG_CMD_ENV       /* 添加saveenv命令的支持 */

……

/*#define CONFIG_ENV_IS_IN_FLASH 1 */

#define CONFIG_ENV_IS_IN_NAND        1

#define CONFIG_ENV_OFFSET         0x30000  /* 参数在Nand Flash中的起始位置 */

#define CONFIG_ENV_SIZE               0x10000   /* Total Size of Environment Sector */

 

我的Nand flash分区是

名称

Offset

Size

u-boot

0x00000000

0x00030000

Param

0x00030000

0x00010000

Kernel

0x00040000

0x002C0000

……

……

……

 

4、支持烧写yaffs文件系统映像(暂缺,因为目前没用到,以后再添加)

 

第三步骤、支持串口xmodem协议

为了方便在Windows下开发,现在修改代码,以增加对xmodem的支持,即增加一个命令loadx

1、依照loady的实现来编写代码,修改 common/cmd_load.c。首先使用U_BOOT_CMD宏来增加loadx命令:

……

U_BOOT_CMD(

         loady, 3, 0,        do_load_serial_bin,

         "loady   - load binary file over serial line (ymodem mode)/n",

         "[ off ] [ baud ]/n"

         "    - load binary file over serial line"

         " with offset 'off' and baudrate 'baud'/n"

);

 

U_BOOT_CMD(

         loadx, 3, 0,       do_load_serial_bin,

         "loadx       - load binary file over serial line       (xmodem mode)/n",

         "[ off ] [ baud ]/n"

         "    - load binary file over serial line"

         " with offset 'off' and baudrate 'baud'/n"

);

 

#endif

……

 

2、在do_load_serial_bin函数中增加对loadx命令的处理分支。也是依照loady来实现:

 

……

         if (strcmp(argv[0],"loadx")==0) {

                   printf ("## Readx for binary (xmodem) download "

                            "to 0x%08lX at %d bps.../n",

                            offset,

                            load_baudrate);

 

                   addr = load_serial_xmodem (offset);

 

         } else if (strcmp(argv[0],"loady")==0) {

                   printf ("## Ready for binary (ymodem) download "

                            "to 0x%08lX at %d bps.../n",

                            offset,

                            load_baudrate);

 

                   addr = load_serial_ymodem (offset);

 

         } else {

 

                   printf ("## Ready for binary (kermit) download "

                            "to 0x%08lX at %d bps.../n",

                            offset,

                            load_baudrate);

                   addr = load_serial_bin (offset);

……

3、定义load_serial_xmodem函数,来实现xmodem数据传输。它是依照load_serial_ymodem实现的一个新函数。

 

……

#if defined(CONFIG_CMD_LOADB)

static ulong load_serial_xmodem (ulong offset);    //添加声明

static ulong load_serial_ymodem (ulong offset);

#endif

……

 

复制load_serial_ymodem函数为load_serial_xmodem,稍作修改:

 

static ulong load_serial_xmodem (ulong offset)

{

         int size;

         char buf[32];

         int err;

         int res;

         connection_info_t info;

       char xmodemBuf[1024];    //将局部数组ymodemBuf改名为xmodemBuf,并在后面使

//用到的地方全部修改。这只是为了与函数名称一致。

         ulong store_addr = ~0;

         ulong addr = 0;

 

         size = 0;

         info.mode = xyzModem_xmodem;      //info.mode的值从xyzModem_ymodem

//改为xyzModem_xmodem

         res = xyzModem_stream_open (&info, &err);

         if (!res) {

 

                   while ((res =

                            xyzModem_stream_read (xmodemBuf, 1024, &err)) > 0) {

                            store_addr = addr + offset;

                            size += res;

                            addr += res;

#ifndef CFG_NO_FLASH

                            if (addr2info (store_addr)) {

                                     int rc;

 

                                     rc = flash_write ((char *) xmodemBuf,

                                                          store_addr, res);

                                     if (rc != 0) {

                                               flash_perror (rc);

                                               return (~0);

                                     }

                            } else

#endif

                            {

                                     memcpy ((char *) (store_addr), xmodemBuf,

                                               res);

                            }

 

                   }

         } else {

                   printf ("%s/n", xyzModem_error (err));

         }

 

         xyzModem_stream_close (&err);

         xyzModem_stream_terminate (false, &getcxmodem);

 

 

         flush_cache (offset, size);

 

         printf ("## Total Size      = 0x%08x = %d Bytes/n", size, size);

         sprintf (buf, "%X", size);

         setenv ("filesize", buf);

 

         return offset;

}

重新编译、烧写u-boot.bin后,就可以使用loadx命令下载文件了。

其它功能用到时再添加吧~~~~~

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值