问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何编写Linux下Nand Flash驱动

发布网友 发布时间:2022-04-22 07:33

我来回答

1个回答

热心网友 时间:2022-04-12 11:24

  Linux驱动原理
  具体内部很多实现,已经包含在drivers/mtd/nand/nand_base.c中了
  【nand flash驱动加载识别nand类型过程】
  在驱动加载的时候,会去调用:
  nand_get_flash_type()
  其中,就会对nand的类型和其他相关参数进行检查。
  1) 选中对应设备,如果此时只有一个nand 芯片,则此步可以省略
  /* Select the device */
  chip->select_chip(mtd, 0);
  x
  2) 发读命令,去读取设备类型代码
  /* Send the command for reading device ID */
  chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
  3) 判断是哪个厂商的,哪个类型的flash
  /* Read manufacturer and device IDs */
  *maf_id = chip->read_byte(mtd);
  dev_id = chip->read_byte(mtd);
  
  4) 在事先已经定义好的nand flash类型中查找属于何种厂商和型号
  /* Lookup the flash id */
  for (i = 0; nand_flash_ids[i].name != NULL; i++) {
  if (dev_id == nand_flash_ids[i].id) {
  type = &nand_flash_ids[i];
  break;
  }
  }
  
  5) 继续判断具体nand flash的各个参数,包括
  芯片信息,Pagesize页大小,oobsize即oob的大小,blocksize块大小,buswidth总线宽度是8位还是16位。
  
  如果页大小不是之前老的nand的512B,而是新的nand的2K或更大,则后面对应的发送给nand flash命令的的时候,调用的函数就由nand_command()变成nand_command_lp()了。
  后者主要比前者多一发个命令:
  chip->cmd_ctrl(mtd, column >> 8, ctrl);
  即,多发一个列地址命令。
  因为大页面(>2KB)的寻址需要2次column,而小页面(512B)只需要1次的列地址。
  具体可以参考nand flash的datasheet。
  
  6) 接着会做一些其他初始化操作,包括最后调用nand_set_defaults()去实现的默认函数的挂载,如果你的nand flash驱动没有实现的话,就是挂载默认的了。
  
  
  【模块加载原理】
  这个内容太大,此处只是简单说说。
  驱动加载的功能主要是probe函数实现的,主要去识别设备的类型和各个参数,并且为设备的使用进行正常的初始化。
  对应卸载时候执行的remove函数,施放对应的,之前申请的一些资源。
  
  【MTD设备】
  在Linux下,将nand Flash等设备归属到MTD设备下进行统一管理。
  Mtd,即memory technology deveice,即将nand看出是存储设备来管理。
  之所以会这么说和这么做,是因为前面提高的nand flash和普通硬盘等设备的特殊性:
  IO接口,最小单位是页,写前需擦除等,导致了,不能像平常对待硬盘等操作一样去操作nand flash,只能采取一些特殊方法,这就诞生了mtd设备的统一抽象层,将nand flash,nor flash和其他类型的flash等设备,统一抽象成mtd设备来管理,根据这些设备的特点,上层实现了常见的操作函数封装,底层具体的内部实现,就需要驱动设计者自己来实现了。
  1. 了解硬件的nand flash的各个参数和工作原理
  具体参考nand flash的datasheet,主要包括,自己nand flash的厂商,型号等。
  Nand flash的页大小,oob大小,块大小,位宽8bit还是16bit。
  工作原理,上面已经做了一定描述,不清楚的,可以参考datasheet,多看看,就会明白很多。
  
  2. 按照linux下驱动编写规范编写nand flash驱动,
  可以参考其他已经有的驱动,比如内核源码中已经有的
  drivers/mtd/nand/s3c2410.c
  就是个很好的例子。
  自己以其为模板,实现自己板子的nand flash驱动。
  其实主要工作就是,实现
  static struct platform_driver s3c2410_nand_driver = {
  .probe = s3c2410_nand_probe,
  .remove = s3c2410_nand_remove,
  .suspend = s3c24xx_nand_suspend,
  .resume = s3c24xx_nand_resume,
  .driver = {
  .name = "s3c2410-nand",
  .owner = THIS_MODULE,
  },
  };
  中的
  XXX_nand_probe函数
  XXX_nand_remove函数
  XXX_nand_enable_hwecc,如果支持硬件ecc的话。
  对nand flash的读写,这两个函数,实现了对nand的具体操作。
  
  【Linux下Nand Flash驱动编写简单步骤】
  软件和硬件知识,都已经了解的话,由于上层的linux的 mtd框架中,已经完全封装好了,对nand flash的write page,write oob等相关函数的实现,那么剩下的只是相对来说已经是很少量的,关于nand 驱动具体内部操作方面的工作:
  1.初始化
  先是在nand 芯片初始化的时候,对其
  XXX_nand_init_chip()
  给对应的芯片chip赋给对应的
  XXX_nand_read_buf和XXX_nand_write_buf等函数:
  chip->cmd_ctrl = XXX_nand_hwcontrol;
  chip->dev_ready = XXX_nand_devready;
  chip->read_buf = XXX_nand_read_buf;
  chip->write_buf = XXX_nand_write_buf;
  以实现后续的对nand芯片的操作。
  
  然后根据ecc类型,赋给对应的ecc的校验与纠错函数:
  chip->ecc.hwctl = XXX_nand_enable_hwecc;
  chip->ecc.calculate = XXX _nand_calculate_ecc;
  
  3. 实现上面提到的对应的各个函数,关于如何实现,参考一下其他nand驱动,就会理解很多了。
  4. 驱动测试,参考具体的 ldd3(Linux Device Driver version 3)的测试相关部分内容。
  转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
曼昆经济学曼昆经济学术语表 无锡清名桥景区酒店推荐,无锡清名桥景区酒店推荐 材料可以分哪些种类 通常材料有哪些分类 材料都有哪些分类 什么是三门对冲 请问“开门之法事如何,对直三门便不宜,纵对宜偏长闭塞,免来灾祸是兼... 购买珍珠首饰时有什么注意事项? 国债基金属于什么基金 什么叫国债基金 linux驱动和android有区别吗 如何自学linux驱动开发,做驱动开发需要哪些方面的... Linux内核开发与Linux驱动开发有什么关系? 为什么都说喝可口可乐会腐蚀牙齿? 可乐会腐蚀牙齿吗? 知道的人来解答下啊? 可乐腐蚀牙齿吗?腐蚀的严重吗 怎样才能让眉毛不长 牙齿很黄怎么办?可乐有腐蚀性,用可乐擦拭牙齿行吗? 眉毛怎样才能不长 怎么把多余的眉毛去掉让它不长 解释一下linux驱动程序结构框架及工作原理 可乐对牙齿有害吗? 有什么办法使眉毛不再长 Linux网络设备驱动的具体结构? 眉毛为什么长不长 Linux网络设备驱动的结构? 一个月了,眉毛怎么不长? 怎么让眉毛不长出来? 怎样修眉眉毛不会再长 眉毛,眉毛,怎么才能让眉毛不长呢? 红霉素可以涂嘴唇起泡 嘴角上火起的泡破了,可以用红霉素软膏涂吗 上嘴唇起泡了该怎么办? 嘴角上火起泡了,用罗红霉素眼膏管用吗 嘴唇长水泡有点痛有点痒能用红霉素软膏吗 嘴角长泡用红霉素软膏有用吗? 嘴唇长泡涂红霉素软膏一天涂多少次 嘴角起泡用红霉素眼膏有效果吗 嘴唇上起泡涂红霉素眼膏还是涂红霉素软膏好? 嘴上上火起泡是用红霉素眼膏 还是红霉素软膏? 嘴角起泡,不敢碰,怎么才能快速消除? 嘴唇水泡涂什么药膏 嘴上起泡怎么快速消除红霉素软膏 嘴上起泡怎么快速消除 自己家种了很多洋葱,洋葱的营养和功效是怎样的? 洋葱的功效与营养价值有哪些 国产全金属机身手机有哪些 小米手环3nfc怎么开不开机 铝合金的手机有哪些机型? 小米手环3nfc怎么开机