近期工作小结(nand-b/c的驱动)

本文记录了NAND闪存驱动的开发过程,包括添加结构体、修改函数等步骤,并解决了识别Flash ID的问题。同时介绍了YAFFS2文件系统的编译集成及调试方法。


在NANDXX-A的driver搞定之后,开始add sth for NANDXXX-B/C,同时也修正之前的问题。

Phase1:
1) 添加struct nand_ecclayout stnand_oob_64;
2) 添加omap_nand_command_lp();
3) 修改probe()函数;
4) 添加struct nand_platform_data osk5912_nand_data;
如果要更改nand flash类型,需要更改如下两处macro:
    osk-nand-flash.c中“#define ST_NAND_SP”
    board-osk.c中“#define ST_NAND_SP”
Result: 此时可以识别Flash ID。
Note: 516批次的nand的manfactureID输出有问题,0x20在最后一个byte输出,不能识别;
Question:
    1) 使用mtd util执行r/w/e时候经常出错,不稳定;
    2) jffs2的坏块管理可能有问题——对一个坏块也要读oob的0x1985,不能mount之后测试;

Phase2:
1) 调试driver:
    a) 修改nfc_init();
    b) 去除dev_ready函数赋值;
    c) 自己写test case操作flash;
    然后发现nand操作ok,把a,b改回也正常,难道是mtd util的问题?但现在起码使用flash_eraseall是可以的,怀疑有其他工具(例如nanddump)操作会让nand内部时序乱了。
2) 编译yaffs2到linux内核中:
    a) 从http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/下载最新的yaffs2 src code;
    b) 根据readme.patch把yaffs2 patch到linux kernel中;
    c) 在make menuconfig时候把yaffs2选中,更具体的信息参考http://www.edacn.net/html/83/38783_itemid_7409.html;
    d) 编译时候遇到问题,不知道为什么能post上来?估计再有更新,这些问题就该fix掉了:
        1. Missing file  yaffs_mtdif1.h
         You can write a header file  yaffs_mtdif1.h with reference to  yaffs_mtdif2.h
        2. Replace qsort( ... ) in yaffs_guts.c with yaffs_qsort(...)
        3. Modify Makefile from
        --------------------------------------------------
         yaffs-y += yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o
         yaffs-y += yaffs_tagscompat.o yaffs_tagsvalidity.o
         yaffs-y += yaffs_mtdif.o yaffs_mtdif2.o
        --------------------------------------------------
        to
        --------------------------------------------------
         yaffs-y += yaffs_packedtags1.o yaffs_packedtags2.o yaffs_nand.o yaffs_qsort.o
         yaffs-y += yaffs_tagscompat.o yaffs_tagsvalidity.o
         yaffs-y += yaffs_mtdif.o yaffs_mtdif1.o yaffs_mtdif2.o
        --------------------------------------------------
3) 把nand相关的内核选项设置为M,省得如果想加debug信息就得重编译内核;
4)使用nand flash:
    a) 编译kernel结束后,cp nand_ecc.ko nand_ids.ko ST_512byte_ECC.ko nand.ko osk-nand-flash.ko /data/rootfs2.6/root/;
    b) 在osk console下依次insmod them;
    c) 如果要一个干净的flash,执行./flash_eraseall /dev/mtd4;
    d) mount -t yaffs2 /dev/mtdblock4 /mnt;

Phase 3:
1) 完成nandxxx-c的driver,在yaffs2下测试r/w文件通过。
    a) 在board-osk.c中添加一个NAND_ST_MLC_OPTIONS赋值;
    b) osk-nand-flash.c中“#define ST_NAND_MLC”和board-osk.c中“#define ST_NAND_MLC”;
    c) NFC_Init()中频率由0改为1;
2) nand_ids.c中LP_OPTIONS改为0——反正我们要的option都定义过了;

其他:
============================
修正之前对OOB_PLACE作出的修改;
    不必修正,read/read_oob就该返回整个oob的内容,nftl知道哪些位置(ecc pos)对它无用。

NFTL中由它自己管理BBM,那么lld中对bad block的操作就该被屏蔽;
    如果不想让mtd管理bbm,而是nftl自己管理,那么:
    a) 在osk-flash.c中给chip->block_bad和chip->block_markbad赋值,内容do nothing;
    b) oob_layout中badblock position应当是free的;
    c) 不要用ubi提供的bbt;
    坏处:这样在nand底层操作中无法识别/标记badblk,因为返回都不是坏块。

NFTL中对MLC的BBM处理不符合标准的;
eeloplus@ubuntu:/mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9$ find /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/ -name "*nand*" -type d /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/Documentation/mtd/nand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/drivers/mtd/aw-spinand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/drivers/mtd/nand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/drivers/mtd/nand/brcmnand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/drivers/mtd/nand/gpmi-nand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/drivers/mtd/onenand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/drivers/staging/mt29f_spinand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand/common1/phy-nand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand/common1/phy-nand/nand-partition /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand/common1/phy-nand/nand-partition2 /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand/common1/phy-nand/rawnand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand/common1/phy-nand/spinand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand/sun8iw15p1/phy-nand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand/sun8iw15p1/phy-nand/physic/spinand0 /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand/sun8iw15p1/phy-nand/physic/spinand1 /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand/sun8iw15p1/phy-nand/physic/spinand2 /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand/sun8iw15p1/phy-nand/physic/spinand3 /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/test/dragonboard/src/testcases/nandtester meeloplus@ubuntu:/mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9$ find /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/ -name "nand" -type d /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/Documentation/mtd/nand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/drivers/mtd/nand /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel/linux-4.9/modules/nand
最新发布
09-05
<think> 我们首先需要理解用户的问题:在Linux 4.9内核中,根据指定的目录路径(/mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/)下查找的NAND相关目录信息,修改内核配置禁用NAND驱动的后果及具体操作方法。 用户之前已经询问过禁用NAND驱动的后果,现在结合提供的引用和目录信息,用户可能想了解如何具体操作(基于该目录结构)以及更具体的后果。 注意:用户提供了引用[1]-[4],这些引用涉及NAND驱动的编写、移植、坏块管理和具体驱动分析。同时,用户提到在指定目录下查找了包含“nand”的目录以及名为“nand”的目录的结果(虽然结果没有给出,但我们可以推测这些目录包含NAND驱动的源代码和配置文件)。 因此,我们需要: 1. 说明在该目录结构下禁用NAND驱动的具体操作步骤(如何修改内核配置)。 2. 结合之前的后果分析,补充说明在该特定平台(H313/H616/A10)上禁用NAND驱动的具体影响。 步骤: 1. 定位内核配置:在该目录下,内核配置通常位于`kernel`子目录中,配置文件可能是`.config`或通过`make menuconfig`生成的配置。 2. 找到NAND驱动的配置选项:根据引用[2]和[4],配置选项通常为`CONFIG_MTD_NAND_xxx`,其中`xxx`是具体的驱动名称(如`s3c`、`hisi504`等)。在Linux 4.9中,NAND驱动的配置选项通常在`Device Drivers -> Memory Technology Device (MTD) support -> NAND Device Support`下。 3. 禁用驱动:将对应的配置选项设置为`n`(即不编译)。 后果(针对该平台): 根据引用[1][3][4],我们可以详细说明: - 该平台(如H313/H616/A10)的NAND控制器驱动将被禁用,导致无法访问NAND Flash- 如果系统从NAND启动,则系统将无法启动(变砖)。 - 如果系统从其他介质(如SD卡)启动,但使用NAND作为根文件系统,则系统启动后无法挂载根文件系统,导致内核恐慌(panic)。 - 坏块管理功能将不可用(引用[3]),可能导致数据损坏。 - MTD子系统将无法创建对应的设备节点(如`/dev/mtd0`),任何依赖于这些设备的应用程序将失败。 具体操作方法(基于提供的目录): 假设该目录为Longan SDK的根目录,内核源代码位于`longan/kernel`子目录。 步骤1:进入内核配置界面 ```bash cd /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel make menuconfig ARCH=arm ``` 步骤2:找到NAND驱动配置选项 导航路径: Device Drivers ---> Memory Technology Device (MTD) support ---> NAND Device Support ---> <*> NAND support for Allwinner SoC # 例如,这里可能是全志的NAND驱动 步骤3:禁用驱动 使用空格键将选项前的`<*>`(编译进内核)或`<M>`(编译为模块)改为`< >`(不选中)。 步骤4:保存并退出 保存配置文件为`.config`。 步骤5:重新编译内核 ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 ``` 步骤6:更新内核映像 将编译生成的内核映像(如`arch/arm/boot/zImage`)烧写到设备。 注意:在操作前,必须确认系统是否从NAND启动。如果系统从NAND启动,则禁用NAND驱动将使系统无法启动,因此此操作仅适用于系统从其他存储介质启动且不需要使用NAND Flash的情况。 根据引用[1][4],在驱动中,禁用NAND驱动会导致以下代码不被编译: - `nand_chip`结构体的初始化(引用[1]) - 控制器的初始化(引用[4]) - ECC配置(引用[4]) - MTD设备的注册(引用[4]) 因此,在系统启动时,将不会看到NAND初始化的相关日志(如引用[4]中的识别NAND Flash的日志)。 最后,生成相关问题。 </think> ### 在Linux 4.9内核中禁用NAND驱动的具体操作及后果分析 #### **一、禁用NAND驱动的具体操作方法** 根据您提供的目录结构 `/mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/`,操作步骤如下: 1. **定位内核配置** ```bash cd /mnt/hgfs/winshare/H313_H616_A10_V1.12/longan/kernel # 进入内核目录 make menuconfig ARCH=arm # 启动配置界面(假设目标架构为ARM) ``` 2. **禁用NAND相关选项** 在配置界面导航至: ``` Device Drivers → Memory Technology Device (MTD) support → NAND Device Support ``` 取消勾选以下关键选项: - `CONFIG_MTD_NAND`(核心NAND支持) - `CONFIG_MTD_NAND_S3C`(三星控制器驱动,参考引用[2]) - 其他平台专用驱动(如 `CONFIG_MTD_NAND_ALLWINNER` 等) 3. **保存并编译** ```bash make savedefconfig # 保存配置变更 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 # 重新编译内核 ``` --- #### **二、禁用NAND驱动的具体后果** 结合目录结构和引用内容,具体影响如下: | **影响领域** | **具体表现** | **引用依据** | |--------------------|------------------------------------------------------------------------------------------------|-------------| | **硬件识别失效** | NAND控制器初始化被跳过(如引用[4]的 `hisi504_nand.c` 控制器初始化代码不执行),芯片ID无法识别[^1][^4] | [^1][^4] | | **存储功能丢失** | MTD子系统无法注册(引用[4]的 `mtd结构体` 初始化失败),导致 `/dev/mtd*` 设备节点消失 | [^4] | | **启动异常** | 若系统从NAND启动:内核因无法加载根文件系统而卡死(错误日志含 `VFS: Unable to mount root fs`) | - | | **坏块管理失效** | 坏块表(BBT)扫描逻辑(引用[3]的 `scan_bbt`)被跳过,可能导致数据写入坏块引| [^3] | | **功耗管理异常** | 平台设备电源管理(如`suspend/resume`)因驱动移除而中断,可能触发内核警告 | [^4] | > 💡 **目录结构分析**:在 `longan/` 目录下,`drivers/mtd/nand/` 中的驱动源码将不再被编译,导致: > - 平台专用驱动(如 `s3c_nand.c`)失效(参考引用[2][4]) > - NAND核心组件(`nand_base.c`, `nand_bbt.c`)功能丢失(参考引用[1][3]) --- #### **三、风险规避建议** 1. **启动介质检查** 通过 `dmesg | grep "Command line"` 确认启动参数: - 若含 `root=/dev/mtdblockX`:**绝对不可禁用**(否则系统变砖) - 若从SD/USB启动:可安全禁用,但需确保无应用依赖NAND 2. **渐进式禁用**(推荐) ```bash # 先编译为模块而非完全禁用 make menuconfig ARCH=arm # 将选项改为 <M> 而非直接取消 ``` 然后通过 `rmmod` 动态卸载模块验证影响: ```bash rmmod s3c_nand # 卸载三星NAND驱动(参考引用[2]) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值