返回顶部
首页 > 资讯 > 操作系统 >linux nand flash驱动编写
  • 843
分享到

linux nand flash驱动编写

linuxnandflash驱动linuxnandflashnandflash驱动 2022-06-04 22:06:59 843人浏览 安东尼
摘要

很长一段时间,nand flash都是嵌入式的标配产品。nand flash价格便宜,存储量大,适用于很多的场景。现在很普及的ssd,上面的存储模块其实也是由一块一块nand flash构成的。对于linux嵌入式来说,

很长一段时间,nand flash都是嵌入式的标配产品。nand flash价格便宜,存储量大,适用于很多的场景。现在很普及的ssd,上面的存储模块其实也是由一块一块nand flash构成的。对于linux嵌入式来说,开始uboot的加载是硬件完成的,中期的kernel加载是由uboot中的nand flash驱动完成的,而后期的rootfs加载,这就要靠kernel自己来完成了。当然,这次还是以三星s3c芯片为例进行说明。

1、nand flash驱动在什么地方,可以从drviers/mtd/Makefile来看


obj-y    += chips/ lpddr/ maps/ devices/ nand/ onenand/ tests/ 

2、nand在mtd下面,是作为一个单独目录保存的,这时应该查看nand下的Kconfig


config MTD_NAND_S3C2410 
  tristate "NAND Flash support for Samsung S3C SoCs" 
  depends on ARCH_S3C24XX || ARCH_S3C64XX 
  help 
   This enables the NAND flash controller on the S3C24xx and S3C64xx 
   SoCs 
 
   No board specific support is done by this driver, each board 
   must advertise a platfORM_device for the driver to attach. 
 
config MTD_NAND_S3C2410_DEBUG 
  bool "Samsung S3C NAND driver debug" 
  deaYZEUPlUpends on MTD_NAND_S3C2410 
  help 
   Enable debugging of the S3C NAND driver 
 
config MTD_NAND_S3C2410_CLKSTOP 
  bool "Samsung S3C NAND IDLE clock stop" 
  depends on MTD_NAND_S3C2410 
  default n 
  help 
   Stop the clock to the NAND controller when there is no chip 
   selected to save power. This will mean there is a small delay 
   when the is NAND chip selected or released, but will save 
   approximately 5mA of power when there is nothing happening. 

3、不难发现,MTD_NAND_S3C2410才是那个真正的Macro,尝试在Makefile找文件


obj-$(CONFIG_MTD_NAND_S3C2410)   += s3c2410.o 

4、查看s3c2410.c文件,看看基本结构构成


static struct platform_driver s3c24xx_nand_driver = { 
  .probe   = s3c24xx_nand_probe, 
  .remove   = s3c24xx_nand_remove, 
  .suspend  = s3c24xx_nand_suspend, 
  .resume   = s3c24xx_nand_resume, 
  .id_table  = s3c24xx_driver_ids, 
  .driver   = { 
    .name  = "s3c24xx-nand", 
    .of_match_table = s3c24xx_nand_dt_ids, 
  }, 
}; 
 
module_platform_driver(s3c24xx_nand_driver); 

5、继续分析s3c24xx_nand_probe函数


s3c2410_nand_init_chip(info, nmtd, sets); 

6、之所以从中摘出了s3c2410_nand_init_chip这个函数,是因为里面进行了函数注册

类似的函数还有s3c2410_nand_update_chip函数


chip->write_buf  = s3c2410_nand_write_buf; 
chip->read_buf   = s3c2410_nand_read_buf; 
chip->select_chip = s3c2410_nand_select_chip; 
chip->chip_delay  = 50; 
nand_set_controller_data(chip, nmtd); 
chip->options    = set->options; 
chip->controller  = &info->controller;  
switch (info->cpu_type) { 
case TYPE_S3C2410: 
  chip->IO_ADDR_W = regs + S3C2410_NFDATA; 
  info->sel_reg  = regs + S3C2410_NFCONF; 
  info->sel_bit  = S3C2410_NFCONF_nFCE; 
  chip->cmd_ctrl = s3c2410_nand_hwcontrol; 
  chip->dev_ready = s3c2410_nand_devready; 
  break; 
 
case TYPE_S3C2440: 
  chip->IO_ADDR_W = regs + S3C2440_NFDATA; 
  info->sel_reg  = regs + S3C2440_NFCONT; 
  info->sel_bit  = S3C2440_NFCONT_nFCE; 
  chip->cmd_ctrl = s3c2440_nand_hwcontrol; 
  chip->dev_ready = s3c2440_nand_devready; 
  chip->read_buf = s3c2440_nand_read_buf; 
  chip->write_buf = s3c2440_nand_write_buf; 
  break;  
case TYPE_S3C2412: 
  chip->IO_ADDR_W = regs + S3C2440_NFDATA; 
  info->sel_reg  = regs + S3C2440_NFCONT; 
  info->sel_bit  = S3C2412_NFCONT_nFCE0; 
  chip->cmd_ctrl = s3c2440_nand_hwcontrol; 
  chip->dev_ready = s3c2412_nand_devready;  
  if (readl(regs + S3C2410_NFCONF) & S3C2412_NFCONF_NANDBOOT) 
    dev_info(info->device, "System booted from NAND\n");  
  break; 
} 

7、抓住了函数接口,就找到了基本逻辑。

对于框架来说,它不关心你的代码如何实现。只要你按照它的接口写,就能让上层正常获得数据。platform、usb、pci这都是一种接口形式,具体实现还要按照各个具体功能模块来实现才行。

8、为什么我们都用s3c芯片进行举例

因为它用的场景最多,学习资料最全,对于新手来说,这会少很多麻烦。

9、这个驱动依赖的kernel版本是什么

这里最有的代码都是按照最新4.16的版本进行分析的,大家可以直接查看这里的地址。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

--结束END--

本文标题: linux nand flash驱动编写

本文链接: https://lsjlt.com/news/19499.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • linux nand flash驱动编写
    很长一段时间,nand flash都是嵌入式的标配产品。nand flash价格便宜,存储量大,适用于很多的场景。现在很普及的ssd,上面的存储模块其实也是由一块一块nand flash构成的。对于linux嵌入式来说,...
    99+
    2022-06-04
    linux nand flash驱动 linux nand flash nand flash驱动
  • 详解linux 驱动编写(sd卡驱动)
    随着sd卡的流行,sd卡在嵌入式设备上使用的场景也越来越多。那下面我们可以看一下,linux驱动框架上是怎么处理sd卡驱动的? 1、代码目录地址 drivers/mmc 2、基本结构 从mmc的代码结构可以看得出...
    99+
    2022-06-04
    linux sd卡驱动 linux驱动编写 linux sd卡
  • 详解linux pwm驱动编写
    pwm方波可以用来控制很多的设备,比如它可以被用来控制电机。简单来说,就是单位时间内的方波越多,那么电机的转速就会越快;反之就越慢。通过这个特性,soc就可以轻松地利用pwm对外设进行自动控制。所以,今天的主题就是pwm...
    99+
    2022-06-04
    linux pwm驱动 linux驱动编写 linux pwm
  • 详解linux lcd驱动编写
    有些嵌入式设备是不需要lcd的,比如路由器。但是,还有些设备是需要lcd显示内容的,比如游戏机、测试仪、智能手表等等。所以,今天我们就看看lcd驱动在linux上是怎么进行的。 1、代码目录 drivers/vide...
    99+
    2022-06-04
    linux lcd驱动 linux lcd驱动框架
  • 详解linux dma驱动编写
    linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见。dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率。 1、dma驱动在什么地方...
    99+
    2022-06-04
    linux dma驱动
  • linux 触摸屏驱动编写
    早在诺基亚手机还比较流行的时候,那时候触摸屏用的还不多。但是随着触摸屏手机、即智能手机的流行,触摸屏基本成了手机的标配。所以,今天可以看看触摸屏驱动在linux上是如何进行的。 1、驱动目录 drivers/inpu...
    99+
    2022-06-04
    linux 触摸屏驱动 linux 触摸屏 linux驱动编写
  • 详解linux驱动编写(入门)
    在我离职之前,工作内容几乎不涉及到驱动方面的知识。我所要做的内容就是把客户对设备的请求拆分成一个一个的接口,调用驱动的设置进行配置就可以了。当然,至于驱动下面是怎么实现那就要根据具体情况而定了。比如说,有的驱动是芯片厂商...
    99+
    2022-06-04
    linux驱动编写 linux驱动
  • 详解linux 摄像头驱动编写
    对于现代嵌入式设备,特别是手机来说,摄像头是很重要的一个设备。很多同学买手机,一看颜值,第二就看摄像头拍照如何。所以,从某个角度来说,摄像头是各个厂家主打的应用功能。那么,linux是如何支持摄像头的,我们可以来看一下?...
    99+
    2022-06-04
    linux 摄像头驱动
  • Linux 块设备驱动代码编写
    按照ldd的说法,linux的设备驱动包括了char,block,net三种设备。char设备是比较简单的,只要分配了major、minor号,就可以进行读写处理了。相对而言,block和net要稍微复杂些。net设备姑...
    99+
    2022-06-04
    Linux 块设备驱动 linux 块设备
  • 详解linux 看门狗驱动编写
    看门狗是linux驱动的一个重要环节。某些特殊的设备,有时候需要放在一些环境恶劣的地方,比如电信设备。但是,任何软件都不可能100%没有bug。如何保证软件在遇到严重bug、死机的时候也能正常运行呢,那么看门狗就是有效的...
    99+
    2022-06-04
    linux 看门狗驱动 linux 看门狗
  • 详解linux usb host驱动编写入门
    usb协议是一个复杂的协议,目前涉及到的版本就有usb1.0, usb2.0, usb3.0。大家如果打开kernel usb host目录,就会发现下面包含了ohci,uhci,ehci,xhci,whci等多种形式的...
    99+
    2022-06-04
    linux usb host驱动 linux usb驱动 linux usb host
  • 详解linux电源管理驱动编写
    对于嵌入式设备来说,合适的电源管理,不仅可以延长电池的寿命,而且可以省电,延长设备运行时间,在提高用户体验方面有很大的好处。所以,各个soc厂家在这方面花了很多的功夫。下面,我们可以看看linux是如何处理电源管理驱动的...
    99+
    2022-06-04
    linux 电源管理驱动 linux 电源管理 命令 linux 电源管理
  • Linux中PCI设备驱动程序怎么编写
    编写Linux中的PCI设备驱动程序涉及以下几个步骤:1. 确定PCI设备的ID:使用`lspci`命令或者在`/sys/bus/p...
    99+
    2023-09-22
    Linux
  • Android 驱动编写LED-NDK程序
    1. 首先编写LINUX内核模块LED #include <linux/kernel.h> #include <linux/module.h> #in...
    99+
    2022-06-06
    ndk Android
  • 怎么用rust编写windows驱动
    要使用Rust编写Windows驱动,你需要使用Rust的开发工具链和一些额外的工具。 以下是编写Windows驱动的一般步骤: ...
    99+
    2023-10-26
    rust windows
  • Linux如何编译声卡驱动
    Linux如何编译声卡驱动,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。关于Linux编译声卡驱动:惠普笔记本刚买来时,安装Debian 5,通常会遇到两个问题。一个是无线...
    99+
    2023-06-16
  • linux怎么编译驱动程序
    编译Linux驱动程序通常需要以下步骤: 下载并安装适当的Linux内核源代码。您可以从Linux官方网站上下载所需的内核源代码...
    99+
    2024-03-06
    linux
  • windows硬件驱动程序怎么编写
    编写Windows硬件驱动程序可以分为以下步骤: 了解硬件设备:首先需要了解要编写驱动程序的硬件设备的技术规范和特性,包括硬件接...
    99+
    2023-10-24
    windows
  • linux驱动-gpio
    最近处理es8336声卡问题,最后排查是spk_ctl_gpio和hp_det_gpio这两个gpio导致的,所以恶补了一下gpio相关的知识,现在总结一下。 源代码使用的是飞腾的gitee上开源的内...
    99+
    2023-09-01
    linux 运维 服务器
  • Linux网卡驱动怎么编译安装
    这篇文章主要讲解了“Linux网卡驱动怎么编译安装”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux网卡驱动怎么编译安装”吧!以D-Link530的网卡进行模块的编译.由于Linux的...
    99+
    2023-06-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作