s3c2440支持nand flash硬件ecc(u-boot+linux)

2024-04-21 13:48

本文主要是介绍s3c2440支持nand flash硬件ecc(u-boot+linux),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

平台:
    硬件: s3c2440 + 64MB(SDRAM) + 256MB(nand flash-> K9F2G08U0C)
    软件: u-boot-2011.12 + linux-3.1.6

要支持硬件ecc就必须保证u-boot和linux内核的ecc校验模式、算法一样。由于内核已经做好了2440硬件ecc的支持,所以以内核为标准修改u-boot。

1、linux内核部分
打开2440硬件ecc支持.
内核关键源文件:/drivers/mtd/nand/s3c2410.c,注意红色部分
关键函数:
static void s3c2410_nand_update_chip(struct s3c2410_nand_info *info,
                     struct s3c2410_nand_mtd *nmtd)
{
    struct nand_chip *chip = &nmtd->chip;

    dev_dbg(info->device, "chip %p => page shift %d\n",
        chip, chip->page_shift);

    if (chip->ecc.mode != NAND_ECC_HW)
        return;

        /* change the behaviour depending on wether we are using
         * the large or small page nand device */

    if (chip->page_shift > 10) {
        chip->ecc.size        = 256;
        chip->ecc.bytes        = 3;

    } else {
        chip->ecc.size        = 512;
        chip->ecc.bytes        = 3;
        chip->ecc.layout    = &nand_hw_eccoob;
    }
}

2、u-boot部分
据此修改u-boot源码
在u-boot全局配置头文件,我的是include/configs/dhole2440.h添加如下宏
#define CONFIG_S3C2440_NAND_HWECC    /*打开nand flash硬件ecc支持*/
#ifdef CONFIG_S3C2440_NAND_HWECC
    #define CONFIG_SYS_NAND_ECCSIZE     256    /*每次ecc数据块大小,对应内核的 chip->ecc.size*/
    #define CONFIG_SYS_NAND_ECCBYTES    3    /*校验结果为3个字节,对应内核的 chip->ecc.bytes*/
#endif

修改drivers/mtd/nand/s3c2440_nand.c源文件的硬件ecc部分代码,因为u-boot默认没提供对s3c2440的支持。
void s3c2440_nand_enable_hwecc(struct mtd_info *mtd, int mode)
{
    struct s3c2440_nand *nand = s3c2440_get_base_nand();
    writel(readl(&nand->nfcont) | S3C2440_NFCONT_INITECC, &nand->nfcont);
}

static int s3c2440_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
                      u_char *ecc_code)
{
    struct s3c2440_nand *nand = s3c2440_get_base_nand();
    unsigned long ecc = readl(&nand->nfmecc0);

    ecc_code[0] = ecc;
    ecc_code[1] = ecc >> 8;
    ecc_code[2] = ecc >> 16;

    return 0;
}

static int s3c2440_nand_correct_data(struct mtd_info *mtd, u_char *dat,
                     u_char *read_ecc, u_char *calc_ecc)
{
    if (read_ecc[0] == calc_ecc[0] &&
        read_ecc[1] == calc_ecc[1] &&
        read_ecc[2] == calc_ecc[2])
        return 0;

    return -1;
}
可以发现只提供了3字节ecc支持,这是为了兼容linux内核的ecc.
重新编译u-boot和linux内核就ok了。
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>
阅读(1228) | 评论(0) | 转发(1) |
0

上一篇:调试工具

下一篇:使用rmmod会出现 No such file or directory

相关热门文章
  • linux 常见服务端口
  • 【ROOTFS搭建】busybox的httpd...
  • 什么是shell
  • linux socket的bug??
  • linux的线程是否受到了保护?...
  • 修改默认端口为222,centos自...
  • 用PHP做一个ftp登录页面...
  • Toad for Oracle工具,为什么在...
  • 本地win7安装vmw9系统winserv...
  • powermt config是所什么用的...
给主人留下些什么吧!~~
评论热议

这篇关于s3c2440支持nand flash硬件ecc(u-boot+linux)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/923238

相关文章

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

Spring Boot 整合 SSE的高级实践(Server-Sent Events)

《SpringBoot整合SSE的高级实践(Server-SentEvents)》SSE(Server-SentEvents)是一种基于HTTP协议的单向通信机制,允许服务器向浏览器持续发送实... 目录1、简述2、Spring Boot 中的SSE实现2.1 添加依赖2.2 实现后端接口2.3 配置超时时

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at