由于NandFlash硬件升级比较快,公司去年一直在使用三星的K9GAG08U0D,现在MLC NandFlash 升级到了第二代,K9GAG08U0D 很快就会处在停产的状态,未雨绸缪,公司选型了K9GAG08U0E 来替代原有的NandFlash芯片。起初。本以为把新Nandflash ID信息增加到Uboot 和 Linux内核的NandFlash ID 列表文件中即可,也就是Uboot 和Linux源码中的nand_ids.c 文件中,但是仔细看了 K9GAG08U0E 的DataSheet,发现自己的想法错了。

下面记录了NandFlash更换时面临的几个问题,及解决方法:

第一个问题:ID 冲突

K9GAG08U0E 的 Product ID与 K9GAG08U0D 的Product ID 是相同的,都是 0xd5,而在Uboot 代码和Linux内核代码中,是根据ID信息来获取或者计算NandFlash的页大小和块大小这些关键信息的。

现在这两款的 Flash ID相同,而Page,OOB ,Block大小都是不同的。 K9GAG08U0D  Page,OOB,Block 关键参数:

而K9GAG08U0E 的 Page,OOB,Block  关键参数:


可见他们是不同的,U0E 每页大小是U0D的两倍。

针对相同ID的两款不同Flash是怎样区分的呢?仔细看DataSheet,发现了可以快速区分两种设备的方法:

U0D Page=4K,U0D Page=8K,我们只需判断Read第四个字节的第0位和第1位即可。

下面列出关键代码段:

     //这里必须有下面两行代码,因为U0E的DataSheet要求系统上电后第一条指令必须是NAND_CMD_RESET,而U0D没有这要求,如果不发送这条指令是无法读取到NandFlash的任何信息的,因为这个问题查找了很长时间,在这里提醒给大家。

     // K9GAG08U0E must add below codes     

       {
          s3c_nand_hwcontrol(0, NAND_CMD_RESET, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
          s3c_nand_device_ready(0);
        }

s3c_nand_hwcontrol(0, NAND_CMD_READID, NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
        s3c_nand_hwcontrol(0, 0x00, NAND_CTRL_CHANGE | NAND_NCE | NAND_ALE);
        s3c_nand_hwcontrol(0, 0x00, NAND_NCE | NAND_ALE);
        s3c_nand_hwcontrol(0, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);

s3c_nand_device_ready(0);
       tmp = readb(nand->IO_ADDR_R); /* Maf. ID */

//  printf("Manufactor ID:%x\n",tmp);
       tmp = dev_id = readb(nand->IO_ADDR_R); /* Device ID */

//printf("dev_id ID:%x \n",dev_id);
     for (i = 0; nand_flash_ids[i].name != NULL; i++)

{
        if (tmp == nand_flash_ids[i].id) {
        type = &nand_flash_ids[i];
       break;
    }

nand->cellinfo = readb(nand->IO_ADDR_R);/* 3rd byte */
     tmp = readb(nand->IO_ADDR_R);/* 4th byte */

  int childType=tmp & 0x03; //Page size
     //  printf("dev_id=%x,childType=%x \n",dev_id,childType);

    if(dev_id == 0xd5 && childType==0x01) //U0D

    {   

    }else  if(dev_id == 0xd5 && childType==0x02) //U0E

   {


    }

这样针对不同的NandFlash做不同的初始化了,以上代码来自uboot1.1.6/cpu/s3c64xx/nand.c 文件中的void board_nand_init(struct nand_chip *nand) 函数。

s3c6410 开发板Linux系统支持 K9GAG08U0E的方法(第一篇)相关推荐

  1. s3c6410 开发板Linux系统支持 K9GAG08U0E的方法

    由于NandFlash硬件升级比较快,公司去年一直在使用三星的K9GAG08U0D,现在MLC NandFlash 升级到了第二代,K9GAG08U0D 很快就会处在停产的状态,未雨绸缪,公司选型了K ...

  2. NUC980开发板Linux系统EC20模块 移植 串口 PPP拨号

    NUC980开发板Linux系统EC20模块 移植 串口 PPP拨号 1. EC20模块连接 2. Linux内核配置 3. 交叉编译PPP 4. 拨号脚本 5. 进行拨号 1. EC20模块连接 在 ...

  3. 基于全志A33开发板linux系统移植学习记录(Boot0)

    基于全志A33开发板linux系统移植学习记录 第一章 Boot0基于ARMGCC的编译与修改 文章目录 基于全志A33开发板linux系统移植学习记录 前言 一.全志A33简介以及上电引导流程 二. ...

  4. OK6410开发板linux系统下的SPI驱动和测试

    OK6410下的SPI驱动是可以用的,但是飞凌把它作为其它用途了,我们修改一些代码才能在/dev目录下创建SPI的设备节点文件 Step1:打开arch/arm/mach_s3c64XX/mach_m ...

  5. 迅为RK3399开发板Linux系统TFTP传输文件服务器测试

    本机测试:在/var/tftpboot 下面建立一个文件 test,在里面输入 hello world,然后保存该文件,如下图 再启动另一个终端,然后输入 tftp 127.0.0.1,如下图. 输入 ...

  6. linux imx6 书籍,迅为iMX6开发板-Linux系统-TFTP使用文档

    TFTP(Trivial File Transfer Protocol,简单文件传输协议),是一个基于 UDP 协议实 现的用于在客户机和服务器之间进行简单文件传输的协议,适合于开销不大.不复杂的应用 ...

  7. linux开发板 wifi配置,iTOP-4412开发板Linux系统下使用wifi模块配置

    精英版在 linux 下使用 wifi,需要进行下面的配置: 首先用户在拿到光盘资料以后查看下光盘里面的"linux"->"root_xxxxxxxx.tar.gz ...

  8. 编译linux系统到开发板,Linux系统有关交叉编译和移植到6410开发板上的简单过程...

    在进行移植之前,要检查一下目标机(这里指6410开发板)与宿主机之间的接线问题,即串口线.网线是否正确连接,目标机的电源是否插好!在接线问题解决后,才能保证交叉编译正常进行! 个人理解,移植的主要思想 ...

  9. Firefly-rk3288 开发板Linux系统编译

    前言 手上的一块Firefly-RK3288开发板,看了下Firefly提供的SDK,压缩包就有15个多G,直接吓退.还好最近看到了韦东山老师提供的教学资料.记下学习步骤及遇到的问题解决办法. 1.开 ...

  10. 使用xilinx最新工具vitis2019.2,定制zc702开发板linux系统

    目录 需要的工具 定制自己的zc702包 vivado定制znyq7020板级描述 petalinux定制linux发行版 zc702启动自定制的linux系统 小结和后续工作 需要的工具 2019年 ...

最新文章

  1. 根据ip获取用户地址-百度
  2. 一个快速、完善的Android开发框架整合实践(QuickAndroid)
  3. git push origin master和git push有什么区别?
  4. 8.1 概述-机器学习笔记-斯坦福吴恩达教授
  5. [导入]php 安全基础 附录C. 加密
  6. VTK:PolyData之MergeSelections
  7. 隐藏apache版本号的方法
  8. python 列表 mysql in_关于mysql:内嵌要在python MySQLDB IN子句中使用的列表
  9. rsync算法原理及使用
  10. a 标签中 rel=“noopener noreferrer“属性的含义和功能
  11. 用女朋友动态图做微信二维码,小白都会
  12. d).关于steal lock
  13. Tilera--100核cpu
  14. 南京周边城市两日游方案
  15. NTCUTTER BD-1002013年新包装通知
  16. SSO: Basic-Auth OAuth2 SAML OpeanID
  17. 电脑定时关机、取消定时关机、滑动关机
  18. Eggjs笔记:egg-mongoose插件的集成,crud操作, 多表关联查询
  19. ELO-Merchant-Category-Recommendation(上篇)
  20. 开发定位功能时如何检测手机是否开启虚拟定位?

热门文章

  1. 什么是 PaaS?“平台即服务“ 简介
  2. 一天一个小算法——最小生成树(kru Prm)
  3. CANoe.Diva之cdd文件配置
  4. 熊啸锋:在线生成个人网站,如何建立个人网站教程
  5. 力扣刷题篇——摩尔投票算法
  6. 《数据清洗》 第六章 数据转换
  7. oracle 币种符号,Oracle用户密码使用特殊符号,例如(AND)、$(Dollar)、#(Pound)、*(Star)等...
  8. 有了雀巢智能咖啡机,单身狗离“秀恩爱”还会远吗?
  9. SAP SEGW 事物码里的 ABAP 类型和 EDM 类型映射的一个具体例子
  10. gst 笔记1:信号、消息、事件、状态