uboot在s3c2440上的移植(5)

发布者:HarmonySpirit最新更新时间:2024-07-22 来源: cnblogs关键字:uboot  s3c2440  移植 手机看文章 扫描二维码
随时随地手机看文章

一、移植环境

主  机:VMWare--Fedora 9

开发板:Mini2440--64MB Nand,Kernel:2.6.30.4

编译器:arm-linux-gcc-4.3.2.tgz

u-boot:u-boot-2009.08.tar.bz2


二、移植步骤

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的写命令,如下:


接着,在该文件中对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: %sn', 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 datan');

        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 arean');

        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 %dn',

                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%08llxn',

                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 %llxn', 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 %dn',

                offset, rval);

            *length -= left_to_write;

            return rval;

        }


        left_to_write -= write_size;

        printf('%d%% is complete.',100-(left_to_write/(*length/100)));

[1] [2]
关键字:uboot  s3c2440  移植 引用地址:uboot在s3c2440上的移植(5)

上一篇:linux-2.6.24.3下移植SD/MMC到S3C2440上的全历程
下一篇:wince 6 s3c2440 io port opearation

推荐阅读最新更新时间:2024-11-11 17:24

S3C2440如何设置系统时钟
时钟控制逻辑给整个芯片提供3种时钟:FLCK用于CPU核;HCLK用于AHB总线上的设备(如:CPU核、存储控制器、中断控制器、LCD控制器、DMA等);PCLK用于APB总线上的设备(如:WATCHDOG、IIS、I2C、PWM定时器、MMC接口、ADC、UART、GPIO、RTC、SPI等)。 S3C2440 CPU主频可达400MHz,开发板上的外接晶振为12M,通过时钟控制逻辑的PLL(锁相环电路)来倍频这个系统时钟。 SC2440上有两个PLL,分别是MPLL,UPLL,UPLL专用于USB设备,常用频率为48MHz和96MHz;MPLL用于设置FCLK、HCLK、PLCK。 上电时,PLL并没有被启动,F
[单片机]
linux-2.6.22.1在s3c2410移植全过程
这两天一直致力于linux 2.6.22.1 的移植工作,虽然遇到过很多困难浪费过很多时间,但是昨晚终于出来了。现将其移植的详细过程贴出来供大家参考,如果按我说的做没有成功,可能与你的开发板以及电脑配置有关系。我还列出了我在移植过程只能中遇到的种种问题及解决方案,希望对有相同爱好兴趣的你有所帮助。 一.各种开发环境介绍 bootloader编译环境: vivi版本:0.1.4 交叉编译器(CROSS-COMPILE)版本:2.95.3 操作系统:Fedora 6(在VMware 6.0.0 安装的,其实和直接安装没什么区别) linux内核编译环境: 内核版本:linux2.6.22.1 (下载地址: 交叉编译器(CROSS-
[单片机]
[单片机框架] main文件的实现和RTX移植
一、 新建工程 选择芯片型号 选择中间件,勾选RTX 选择完毕后,ok解锁。 main文件内容如下,由于我对RTX函数,再封装了一层,是为了方便切换其他OS。 /******************************************************************************** * @file main.c * @author jianqiang.xue * @Version V1.0.0 * @Date 2021-04-03 * @brief 无 ************************************************************
[单片机]
[单片机框架] main文件的实现和RTX<font color='red'>移植</font>
Linux-2.6.32.2内核在mini2440上的移植(十三)---移植UDA1341音频驱动
移植环境 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gnueabi-gcc v4.5.1。 4,开发板:mini2440,2M nor flash,128M nand flash。 5,u-boot版本:u-boot-2009.08 6,linux 版本:linux-2.6.32.2 7,参考文章: 嵌入式linux应用开发完全手册,韦东山,编著。 Mini2440 之Linux 移植开发实战指南 【1】在初始化文件中加入UDA1341 设备结构 Linux-2.6.32.2 已经
[单片机]
Linux-2.6.32.2内核在mini2440上的<font color='red'>移植</font>(十三)---<font color='red'>移植</font>UDA1341音频驱动
S3C2440时钟和电源管理
一、时钟 1.系统架构 时钟源:为了减少外界环境对开发板电磁干扰,降低制作成本,通常开发板的外部晶振时钟频率都很低,TX2440开发板由12MHz的晶振来提供时钟源,要想让CPU运行在更高的频率就要通过时钟控制逻辑单元PLL(锁相环)来提高主频。 S3C2440里有两个PLL:MPLL和UPLL,MPLL用来产生FCLK的高频工作时钟(而HCLK和PCLK通过FCLK分频获取),UPLL用来为USB提供工作频率。 FCLK为ARM920T内核提供时钟,详见下图 HCLK主要为S3C2440 AHB总线(Advanced High performance Bus)上挂接硬件提供工作频率,AHB总线主要挂接有内存
[单片机]
<font color='red'>S3C2440</font>时钟和电源管理
S3C2440内存控制详解
软件可编程的大小端模式; 地址空间:每个BANK可寻址128MB(总共8个BANK 1GB空间); 可编程的访问位宽:BANK0为16或32位,其他BANK为8或16或32位; 8个存储器BANK,其中6个用于ROM或者SRAM,2个用于ROM、SRAM或者SDRAM; BANK0~BANK6的起始地址固定; BANK7的起始地址和大小可编程; 所有存储器BANK的访问周期可编程; 外部wait信号可延长总线周期; 支持SDRAM的自刷新和掉电模式。 BANK0总线宽度由OM 引脚决定,当OM =01时,booting ROM datawidth是16位,
[单片机]
minis3c2440移植之文件系统移植
说在前头:linux重要的常见系统文件都含有以下的文件,我们所做的就是要编译生成这些文件。 bin 普通文件目录(里面是普通的shell脚本命令二进制文件) sbin 系统文件目录(里面是系统文件的shell脚本命令二进制文件) dev 设备文件目录(里面是对一些外设的驱动配置如:网卡驱动) etc 配置文件目录 lib 库文件目录(里面是系统调用时一些常用到的静态和动态库) proc 内存文件目录(一般作为内存映射) mnt 外部设备挂目录(常见的CD/DVD,USB外设都会挂在次目录下) tmp 对于我们现在来说的动作就具体的编译生成这些文件,首先用的是busybox- 1.13.1编译工具直接生成bin和sbin这两
[单片机]
【GD32 MCU 移植教程】6、从GD32F1x0和GD32F3x0移植到GD32E230
1.简介 GD32E230 系列是 GD 最新推出的 Cortex_M23 系列产品,该系列资源上与既有的 GD32F1x0以及 GD32F3x0 兼容度非常高。由于 GD32E230 系列主打低功耗和低成本,所以在存量客户中可能会有越来越多的客户会有从 GD32F1x0 和 GD32F3x0 移植到 GD32E230 系列的需求,本文档专门针对既有的 GD32F1x0 和 GD32F3x0 代码如何移植到 GD32E230 做一个详细的介绍; 2.硬件资源对比 1. TSSOP20 和 QFN28PIN 的封装兼容,但 E230 系列 PA9、PA10 可以映射为 PA11、PA12; 2. LQFP32、QFN32 封
[单片机]
【GD32 MCU <font color='red'>移植</font>教程】6、从GD32F1x0和GD32F3x0<font color='red'>移植</font>到GD32E230
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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