嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(五)

Nand Flash Yaffs系统大量写入数据失败问题的解决方法。 <br />一个朋友的问题,我们共同分析后搞定。其实以前也遇到过同样问题,时间长了,没总结。<br /> <br />事发:在Nand Flash上使用2.6.14的linux kernel,三星2440的板子,连续写入文件,到一定大小限制就删除,文件写入没有超过flash保留10%的空闲,应该说还差很多。<br /> <br />第一步,不适用syslog写,换做自己写代码写入,出现几率降低;<br />第二步,fwrite换成write,几率增加,很快就坏。<br /> <br />坏的时候提示:yaf 阅读详情
嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。

一、移植环境

二、移植步骤

上接:u-boot-2009.08在2440上的移植详解(四)

9)实现u-boot对yaffs/yaffs2文件系统下载的支持。
 
    注意:此篇对Nand的操作是基于MTD架构方式,在“u-boot-2009.08在2440上的移植详解(三)”中讲到过。
 
    通常一个Nnad Flash存储设备由若干块组成,1个块由若干页组成。一般128MB以下容量的Nand Flash芯片,一页大小为528B,被依次分为2个256B的主数据区和16B的额外空间;128MB以上容量的Nand Flash芯片,一页大小通常为2KB。由于Nand Flash出现位反转的概率较大,一般在读写时需要使用ECC进行错误检验和恢复。
 
    Yaffs/yaffs2文件系统的设计充分考虑到Nand Flash以页为存取单位等的特点,将文件组织成固定大小的段(Chunk)。以528B的页为例,Yaffs/yaffs2文件系统使用前512B存储数据和16B的额外空间存放数据的ECC和文件系统的组织信息等(称为OOB数据)。通过OOB数据,不但能实现错误检测和坏块处理,同时还可以避免加载时对整个存储介质的扫描,加快了文件系统的加载速度。以下是Yaffs/yaffs2文件系统页的结构说明:

           Yaffs页结构说明
==============================================
   字节                   用途
==============================================
 0 - 511                存储数据(分为两个半部)
512 - 515               系统信息
   516                  数据状态字
   517                  块状态字
518 - 519               系统信息
520 - 522               后半部256字节的ECC
523 - 524               系统信息
525 - 527               前半部256字节的ECC
==============================================


    好了,在了解Nand Flash组成和Yaffs/yaffs2文件系统结构后,我们再回到u-boot中。目前,在u-boot中已经有对Cramfs、Jffs2等文件系统的读写支持,但与带有数据校验等功能的OOB区的Yaffs/Yaffs2文件系统相比,他们是将所有文件数据简单的以线性表形式组织的。所以,我们只要在此基础上通过修改u-boot的Nand Flash读写命令,增加处理00B区域数据的功能,即可以实现对Yaffs/Yaffs2文件系统的读写支持。

实现对Yaffs或者Yaffs2文件系统的读写支持步骤如下:
①、 在include/configs/my2440.h头文件中定义一个管理对Yaffs2支持的宏和开启u-boot中对Nand Flash默认分区的宏,如下:

#gedit include/configs/my2440.h  //添加到文件末尾即可

#define CONFIG_MTD_NAND_YAFFS2   1 //定义一个管理对Yaffs2支持的宏

//开启Nand Flash默认分区,注意此处的分区要和你的内核中的分区保持一致
#define MTDIDS_DEFAULT "nand0=nandflash0"
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:192k(bootloader)," \
                     "64k(params)," \
                     "2m(kernel)," \
                    
"-(root)"

②、在原来对Nand操作的命令集列表中添加Yaffs2对Nand的写命令,如下:

#gedit common/cmd_nand.c   //在U_BOOT_CMD中添加

U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1, do_nand,
    "NAND sub-system",
    "info - show available NAND devices\n"
    "nand device [dev] - show or set current device\n"
    "nand read - addr off|partition size\n"
    "nand write - addr off|partition size\n"
    " read/write 'size' bytes starting at offset 'off'\n"
    " to/from memory address 'addr', skipping bad blocks.\n"

//注意:这里只添加了yaffs2的写命令,因为我们只用u-boot下载(即写)功能,所以我们没有添加yaffs2读的命令
#if defined(CONFIG_MTD_NAND_YAFFS2)
    "nand write[.yaffs2] - addr off|partition size - write `size' byte yaffs image\n"
    " starting at offset off' from memory address addr' (.yaffs2 for 512+16 NAND)\n"
#endif


    "nand erase [clean] [off size] - erase 'size' bytes from\n"
    " offset 'off' (entire device if not specified)\n"
    "nand bad - show bad blocks\n"
    "nand dump[.oob] off - dump page\n"
    "nand scrub - really clean NAND erasing bad blocks (UNSAFE)\n"
    "nand markbad off [...] - mark bad block(s) at offset (UNSAFE)\n"
    "nand biterr off - make a bit error at offset (UNSAFE)"
#ifdef CONFIG_CMD_NAND_LOCK_UNLOCK
    "\n"
    "nand lock [tight] [status]\n"
    " bring nand to lock state or display locked pages\n"
    "nand unlock [offset] [size] - unlock section"
#endif
);


接着,在该文件中对nand操作的do_nand函数中添加yaffs2对nand的操作,如下:

    if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0)
    {
        int read;

        if (argc < 4)
            goto usage;

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

        read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */
        printf("\nNAND %s: ", read ? "read" : "write");
        if (arg_off_size(argc - 3, argv + 3, nand, &off, &size) != 0)
            return 1;

        s = strchr(cmd, '.');
        if (!s || !strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i"))
        {
            if (read)
                ret = nand_read_skip_bad(nand, off, &size, (u_char *)addr);
            else
                ret = nand_write_skip_bad(nand, off, &size, (u_char *)addr);
        }

//添加yaffs2相关操作,注意该处又关联到nand_write_skip_bad函数

#if defined(CONFIG_MTD_NAND_YAFFS2)
        else if (s != NULL && (!strcmp(s, ".yaffs2")))
        {
            nand->rw_oob = 1;
            nand->skipfirstblk = 1;
            ret = nand_write_skip_bad(nand,off,&size,(u_char *)addr);
            nand->skipfirstblk = 0;
            nand->rw_oob = 0;
        }
#endif

        else if (!strcmp(s, ".oob"))
        {
            /* out-of-band data */
            mtd_oob_ops_t ops =
            {
                .oobbuf = (u8 *)addr,
                .ooblen = size,
                .mode = MTD_OOB_RAW
            };

            if (read)
                ret = nand->read_oob(nand, off, &ops);
            else
                ret = nand->write_oob(nand, off, &ops);
        }
        else
        {
            printf("Unknown nand command suffix '%s'.\n", s);
            return 1;
        }

        printf(" %zu bytes %s: %s\n", size, read ? "read" : "written", ret ? "ERROR" : "OK");

        return ret == 0 ? 0 : 1;
    }


③、 在include/linux/mtd/mtd.h头文件的mtd_info结构体中添加上面用到rw_oob和skipfirstblk数据成员,如下:

#gedit include/linux/mtd/mtd.h   //在mtd_info结构体中添加

#if defined(CONFIG_MTD_NAND_YAFFS2)
    u_char rw_oob;
    u_char skipfirstblk;
#endif


④、 在第二步关联的nand_write_skip_bad函数中添加对Nand OOB的相关操作,如下:

#gedit drivers/mtd/nand/nand_util.c  //在nand_write_skip_bad函数中添加

int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, u_char *buffer)
{
    int rval;
    size_t left_to_write = *length;
    size_t len_incl_bad;
    u_char *p_buffer = buffer;

#if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
    if(nand->rw_oob==1)   
    {
        size_t oobsize = nand->oobsize;
        size_t datasize = nand->writesize;
        int datapages = 0;

        if (((*length)%(nand->oobsize+nand->writesize)) != 0)
        {
         printf ("Attempt to write error length data!\n");
         return -EINVAL;
     }

        datapages = *length/(datasize+oobsize);
        *length = datapages*datasize;
        left_to_write = *length;
    }
#endif

    /* Reject writes, which are not page aligned */
    if ((offset & (nand->writesize - 1)) != 0 ||
     (*length & (nand->writesize - 1)) != 0) {
        printf ("Attempt to write non page aligned data\n");
        return -EINVAL;
    }

    len_incl_bad = get_len_incl_bad (nand, offset, *length);

    if ((offset + len_incl_bad) >= nand->size) {
        printf ("Attempt to write outside the flash area\n");
        return -EINVAL;
    }

#if !defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
    if (len_incl_bad == *length) {
        rval = nand_write (nand, offset, length, buffer);
        if (rval != 0)
            printf ("NAND write to offset %llx failed %d\n",
                offset, rval);

        return rval;
    }
#endif

    while (left_to_write > 0) {
        size_t block_offset = offset & (nand->erasesize - 1);
        size_t write_size;

        WATCHDOG_RESET ();

        if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) {
            printf ("Skip bad block 0x%08llx\n",
                offset & ~(nand->erasesize - 1));
            offset += nand->erasesize - block_offset;
            continue;
        }

#if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
        if(nand->skipfirstblk==1)   
        {
            nand->skipfirstblk=0;
            printf ("Skip the first good block %llx\n", offset & ~(nand->erasesize - 1));
            offset += nand->erasesize - block_offset;
            continue;
        }
#endif

        if (left_to_write < (nand->erasesize - block_offset))
            write_size = left_to_write;
        else
            write_size = nand->erasesize - block_offset;

        printf("\rWriting at 0x%llx -- ",offset); //add yaffs2 file system support


        rval = nand_write (nand, offset, &write_size, p_buffer);
        if (rval != 0) {
            printf ("NAND write to offset %llx failed %d\n",
                offset, rval);
            *length -= left_to_write;
            return rval;
        }

        left_to_write -= write_size;
        printf("%d%% is complete.",100-(left_to_write/(*length/100)));
        offset += write_size;

#if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support
        if(nand->rw_oob==1)   
        {
            p_buffer += write_size+(write_size/nand->writesize*nand->oobsize);
        }
        else   
        {
            p_buffer += write_size;
        }
#else
        p_buffer += write_size;
#endif

    }

    return 0;
}


⑤、 在第四步nand_write_skip_bad函数中我们看到又对nand_write函数进行了访问,所以这一步是到nand_write函数中添加对yaffs2的支持,如下:

#gedit drivers/mtd/nand/nand_base.c  //在nand_write函数中添加

static int nand_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const uint8_t *buf)
{
    struct nand_chip *chip = mtd->priv;
    int ret;

 

#if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support

    int oldopsmode = 0;

    if(mtd->rw_oob==1)   
    {
        int i = 0;
        int datapages = 0;

        size_t oobsize = mtd->oobsize;
        size_t datasize = mtd->writesize;

        uint8_t oobtemp[oobsize];
        datapages = len / (datasize);

        for(i = 0; i < (datapages); i++)   
        {
            memcpy((void *)oobtemp, (void *)(buf + datasize * (i + 1)), oobsize);
            memmove((void *)(buf + datasize * (i + 1)), (void *)(buf + datasize * (i + 1) + oobsize), (datapages - (i + 1)) * (datasize) + (datapages - 1) * oobsize);
            memcpy((void *)(buf+(datapages) * (datasize + oobsize) - oobsize), (void *)(oobtemp), oobsize);
        }
    }
#endif

 

    /* Do not allow reads past end of device */
    if ((to + len) > mtd->size)
        return -EINVAL;
    if (!len)
        return 0;

    nand_get_device(chip, mtd, FL_WRITING);

    chip->ops.len = len;
    chip->ops.datbuf = (uint8_t *)buf;

 

#if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support

    if(mtd->rw_oob!=1)   
    {
        chip->ops.oobbuf = NULL;
    }
    else   
    {
        chip->ops.oobbuf = (uint8_t *)(buf + len);
        chip->ops.ooblen = mtd->oobsize;
        oldopsmode = chip->ops.mode;
        chip->ops.mode = MTD_OOB_RAW;
    }
#else
    chip->ops.oobbuf = NULL;
#endif

 

    ret = nand_do_write_ops(mtd, to, &chip->ops);

    *retlen = chip->ops.retlen;

    nand_release_device(mtd);

 

#if defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support

    chip->ops.mode = oldopsmode;
#endif

 

    return ret;
}


OK,对yaffs2支持的代码已修改完毕,重新编译u-boot并下载到nand中,启动开发板,在u-boot的命令行输入:nand help查看nand的命令,可以看到多了一个 nand write[.yaffs2]的命令,这个就是用来下载yaffs2文件系统到nand中的命令了。

⑥、使用nand write[.yaffs2]命令把事前制作好的yaffs2文件系统下载到Nand Flash中(yaffs2文件系统的制作请参考:Linux-2.6.30.4在2440上的移植之文件系统),下载操作步骤和效果图如下:

tftp 0x30000000 root-2.6.30.4.bin //用tftp将yaffs2文件系统下载到内存的0x30000000位置

nand erase 0x250000 0x3dac000 //擦除Nand的文件系统分区

nand write.yaffs2 0x30000000 0x250000 0x658170 //将内存中的yaffs2文件系统写入Nand的文件系统分区,注意这里的0x658170是yaffs2文件系统的实际大小(可以在tftp传送完后可以看到),要写正确,否则会形成假坏块




⑦、结合u-boot和内核来测试启动下载的yaffs2文件系统
设置u-boot启动参数bootargs,注意:这一长串参数要与内核配置里面的Boot options-->Default kernel command string的设置要一致。特别是mtdblock3要根据内核具体的分区来设,在上一篇中讲到了内核中Nand的分区情况,u-boot属于mtdblock0,param属于mtdblock1,kernel属于mtdblock2,root就属于mtdblock3,所以这里要设置成root=/dev/mtdblock3,否则文件系统无法启动成功,会出现一些什么I/O之类的错误

好了,最后重启开发板,内核引导成功,yaffs2文件系统也挂载成功,效果图如下:


扬创2440 uboot移植(1)--基于《嵌入式Linux之我行--u-boot-2009.08在2440上的移植详解》 原文出处 http://hbhuanggang.cublog.cn 一、移植环境 主  机:VMWare--UBUNTU 10.04开发板:UTU2440--64MB Nand(K9F1208U0C),Kernel:2.6.13编译器:arm-linux-gcc-4.3.2.tgzu-boot:u-boot-2009.11.tar.bz2 二、 阅读详情

相关推荐

扬创2440开发板WINCE5.0开发手册

扬创2440开发板WINCE5.0开发手册

扬创uboot移植(2)--基于《嵌入式Linux之我行--u-boot-2009.08在2440上的移植详解》

9)实现u-boot对yaffs/yaffs2文件系统下载的支持。       注意:此篇对Nand的操作是基于MTD架构方式,在“u-boot-2009.08在2440上的移植详解(三)”中讲到过。       通常一个Nnad Flash存储设备由若干块组成,1个块由若干页组成。一般128MB以下容量的Nand Flash芯片,一页大小为528B,被依次分为2个256B的主数据区和16

OUYANG_LINUX007的专栏 2752

OCR开发实战:如何用PaddleOCR C++版实现本地文字识别(附模型文件处理技巧)

本文详细介绍了如何使用PaddleOCR C++版实现本地文字识别,包括环境搭建、工程编译、运行时优化等全流程。重点讲解了在VS2019/VS2022环境下配置PaddleOCR的CPU推理性能优化技巧,以及模型文件处理的实际应用方法,帮助开发者高效完成OCR本地化部署。

devops8pract的博客 334

yaffs tragedy: Bad object type 错误

当系统挂在USERDATA 分区时,会出现下面的错误(后边的log信息)。如果分区不跨地址0x10000000,就不会有这样的错误。 Log如下:[   22.660522] yaffs: dev is 32505871 name is "mtdblock15"[   22.665771] yaffs: passed flags ""[   22.669128] y

fengyuyaoye1980的专栏 3447

多GPU时代的虚拟内存革命:CUDA VMM API的跨设备协同设计哲学

本文深入探讨了NVIDIA CUDA VMM API在多GPU系统中的虚拟内存管理革命,解决了传统Peer Access的显存碎片化和同步开销问题。通过地址-内存解耦、按需映射和精细权限控制,VMM API为分布式训练提供了高效的内存协同方案,显著提升大模型训练性能。

weixin_29251337的博客 534

基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践

本文详细介绍了基于MATLAB/Simulink与WSL2的ROS2实时联合仿真实践。通过环境配置、PX4仿真环境搭建、自定义消息生成、Simulink通信实现及实时优化等步骤,提供了完整的无人机位置控制案例,帮助开发者实现高精度的实时联合仿真。

red88的博客 203

yaffs文件系统核心代码解析

函数yaffs_GutsInitialise(),在yaffs_guts.c中。字面上理解,gut是内脏的意思,所以该函数差不多就是初始化yaffs的各个基本函数吧。yaffs_GutsInitialise()初始化完yaffs_Device结构的各项参数后,就进行yaffs_scan()了,这真是个恼人的函数啊。下面是关

Larry的专栏 1155

TSMC65nm工艺下Virtuoso仿真gm-id曲线的保姆级教程(含ADE设置详解)

本文提供了一份在TSMC 65nm工艺下使用Cadence Virtuoso绘制gm-id曲线的详细教程。内容涵盖从理解gm/id方法学、搭建仿真环境、深度解析ADE设置,到运行DC仿真、提取数据并生成对数坐标曲线的完整流程。教程重点解析了Virtuoso ADE中的关键设置与常见避坑点,旨在帮助模拟集成电路设计初学者快速掌握这一核心设计工具,为高性能电路设计奠定基础。

grpc6streamer的博客 1172

linux内核移植 I

根据tx2440的文档, 目标也比较简单, 先编译成功, 再烧录, 根文件系统, busybox 这些. A. 准备 1. 解压tar, 修改根Makefile ARCH ?= arm CROSS_COMPILE ?= arm-linux- 2. 修改时钟 arch/arm/mach-s3c2440/mach-smdk2440.c s3c24xx_init_clock...

235

计量经济学——事件研究法/事件分析法

计量经济学——事件研究法/事件分析法

weixin_46189461的博客 6752

PHP服务端 苹果支付(IAP)处理

公司做的app需要做IAP订阅支付,开始觉得和微信的支付流程差不多,做起来还是有点麻烦,主要是网上的文章很少,不能拿来主义。自己做完总结一下,希望对小伙伴们有帮助我就很欣慰了。代码写的不好 不要喷我。。。 首先讲一下我的业务逻辑,也就是php服务端需要做什么事情。 先上图: 下面我详细的讲一下每...

山水的博客 1万+

嵌入式linux之我行,嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(五)...

原标题:嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(五)一、移植环境主 机:VMWare--Fedora 9开发板:Mini--64MB Nand,Kernel:2.6.30.4编译器:-linux-gcc-4.3.2.tgz:u-boot-2009.08.tar.bz2二、移植步骤9)实现u-boot对yaffs/yaffs2文件系统下载的支持。注意:此篇对Na...

weixin_39594103的博客 170

【自动驾驶】控制算法(十)深度解析车辆纵向控制 | Carsim 油门刹车标定表的制作...

写在前面: ???? 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。???? ???? 人生如戏,我们并非能选择舞台和剧本,但我们可以选择如何演绎 ????感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行~~~文章目录引言一、油门标定原理1.1 油门与速度、加速度的关系1.2 油门控制曲面模型的构建二、油门标定表的制作流程...

qq_35485206的博客 2139

移植u-boot-2009.08到mini2440(一)基础配置篇

该博客主要记录和总结我在工作中遇到的问题和积累的经验。如有错误之处,谢请指正。 共享资源,欢迎转载:http://blog.csdn.net/fzu_dianzi 一、环境 目标板:mini2440 u-boot版本:u-boot-2009.08 交叉编译器:arm-linux-gcc-4.3.2 操作系统:Linux(Ubuntu-11.10) 二、目的 搭建mini2440

知识为王 3274

【AUTOSAR-E2E】-1.4-详述E2E Transformer解决方案

共13页精讲 目录 1“Data Transformation”介绍 1.1 基于SOME/IP Transformer 1.2 基于COM Based Transformer 2 ComXf(COM Based Transformer)介绍 2.1 ComXf(COM Based Transformer)功能规范 2.2 ComXf(COM Based Transformer)提供的服务 2.3 配置注意事项 3 E2EXf(E2E Transformer)介绍 3.1 E2EX...

「汽车电子助手」的博客 4700

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

嵌入式linux u boot,嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一)

原标题:嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一)一、移植环境主 机:VMWare--Fedora 9开发板:Mini--64MB Nand,Kernel:2.6.30.4编译器:-linux-gcc-4.3.2.tgz:u-boot-2009.08.tar.bz2二、移植步骤本次移植的功能特点包括:支持Nand Flash读写支持从Nor/Nand Fla...

weixin_34198817的博客 153

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(六)

嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。<br /><br />一、移植环境主  机:VMWare--Fedora 9开发板:Mini2440--64MB Nand,Kernel:2.6.30.4编译器:arm-linux-gcc-4.3.2.tgzu-boot:u-boot-2009.08.tar.bz2<br />二、移植步骤<br />上接:u-boot-2009.08在244

qt_girl的专栏 742

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

嵌入式linux之我行,嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(四)...

嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤。一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便。如有错误之处,谢请指正。一、移植环境二、移植步骤上接:u-boot-2009.08在2440上的移植详解(三)在这一篇中,我们首先让开发板对CS8900或者DM9000X网卡的支持,然后再分析实现u-boot怎样来引导Linux内核启动。因为测试u-boot...

weixin_42467573的博客 236

u-boot-2009.11移植到mini2440(一)

      由于平时没有做笔记的习惯,造成很多以前遇到并解决了的问题再次遇到后,又得花很多时间去解决,所以决定把现在移植的过程记录下来以供以后查看。 操作系统:ubuntu 9.0.4 (linux-2.6.28)开发板:友善之臂mini2440交叉编译器:arm-linux-gcc-4.3.2 with EABI 下载u-b

笑看红尘的专栏 1123
上一篇: 嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(四)
下一篇: 嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(六)
hwmt2012
博客等级 码龄14年 14粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值