Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4534534
  • 博文数量: 252
  • 博客积分: 5347
  • 博客等级: 大校
  • 技术积分: 13838
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-30 10:13
文章分类
文章存档

2022年(12)

2017年(11)

2016年(7)

2015年(14)

2014年(20)

2012年(9)

2011年(20)

2010年(153)

2009年(6)

分类: 嵌入式

2010-04-01 21:14:21

   这次的移植修改主要增加对xmodem协议的支持。xmodem 协议是一种文件传输协议,因其简单性和较好的性能而被广泛应用。xmodem 协议通过console 口传输文件,支持128 字节和1k 字节两种类型的数据包,并且支持一般校验和、crc 两种校验方式,在出现数据包错误的情况下支持多次重传(一般为10 次)。
    xmodem 协议传输由接收程序和发送程序完成。先由接收程序发送协商字符,协商校验方式,协商通过之后发送程序就开始发送数据包,接收程序接收到完整的一个数据包之 后按照协商的方式对数据包进行校验。校验通过之后发送确认字符,然后发送程序继续发送下一包;如果校验失败,则发送否认字符,发送程序重传此数据包。
    我们主要是依照loady的实现过来编写代码。首先使用U_BOOT_CMD宏来增加loadx命令。修改文件common/cmd_load.c文件。在大约1166行附近的位置,仿照loadx的代码,编写。
 

#if defined(CONFIG_CMD_LOADBX)
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
U_BOOT_CMD(
    loady, 3, 0,    do_load_serial_bin,
    "load binary file over serial line (ymodem mode)",
    "[ off ] [ baud ]\n"
    " - load binary file over serial line"
    " with offset 'off' and baudrate 'baud'"
);

   然后,在do_load_serial_bin函数中增加对loadx命令的处理分支。也是按照Loady的实现来修改。在477行附近的位置。添加下面的代码。

#if defined CONFIG_CMD_LOADBX
        if(strcmp(argv[0],"loadx")==0)
        {
     printf("## Read 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){
#else
    else if (strcmp(argv[0],"loady")==0) {
#endif
        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);

最后一步就是添加 load_serial_xmodem()函数。先在36行附近添加声明。

#if defined(CONFIG_CMD_LOADB)
static ulong load_serial_ymodem (ulong offset);
static ulong load_serial_xmodem (ulong offset);
#endif

   最后在995行,仿照load_serial_ymodem()函数,编写load_serial_ymodem()函数。

//这里主要就将局部数组ymodemBuf改名为xmodemBuf,并在后面使用到的地方统一修改,

info.mode的值从xyzModem_ymodem改为xyzModem_xmodem.

#if defined CONFIG_CMD_LOADBX
static ulong load_serial_xmodem(ulong offset)
{
int size;
    char buf[32];
    int err;
    int res;
    connection_info_t info;
    char xmodemBuf[1024];
    ulong store_addr = ~0;
    ulong addr = 0;

    size = 0;
    info.mode = 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 CONFIG_SYS_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;
}
#endif

  最后,不要忘了在mini2440.h文件中定义 CONFIG_CMD_LOADBX 宏。重新编译,下载到NANDFlash中,就可以使用loadx命令,利用串口来下载文件了。效率要比JTAG 高很多。
阅读(2325) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~