基于龙芯2K1000移植uboot之NAND

  • 移植环境
  • 开始移植
    • 利用原生驱动(不成功)
    • 利用PMON驱动移植(成功)

移植环境

CPU:LS2K1000
NAND:MT29F16G08
编译环境:Ubuntu16.04+gcc-4.9.3-64-gnu
GCC来源:GCC
uboot来源:uboot
工具:龙芯的EJTAG调试工具。
硬件平台采用了单片NAND芯片,原理图如下:

开始移植

这里主要记录主要是记录移植过程。

利用原生驱动(不成功)

首先也不知道这里面驱动可能用,看了一下目录drivers/mtd/nand/raw/只有1系列的驱动,那就选择ls1x-nand.c移植试试看。
先选中参数:

  CONFIG_MTD_RAW_NAND=y CONFIG_NAND_LS1X=y

编译报错:
报错:

cmd/built-in.o: In function `nand_block_isbad':
/home/loongson/ls2k/u-boot-ls2k/include/nand.h:61: undefined reference to `mtd_block_isbad'
cmd/built-in.o: In function `nand_dump':
/home/loongson//ls2k/u-boot-ls2k/cmd/nand.c:78: undefined reference to `mtd_read_oob'
cmd/built-in.o: In function `do_nand':
/home/loongson/ls2k/u-boot-ls2k/cmd/nand.c:641: undefined reference to `mtd_read_oob'
cmd/built-in.o: In function `nand_block_isbad':
/home/loongson/ls2k/u-boot-ls2k/include/nand.h:61: undefined reference to `mtd_block_isbad'

mtd_block_isbad这个函数定义在mtdcore.c中,但是这个文件没有被编译,查看drivers/mtd/Makefile:

mtd-$(CONFIG_MTD) += mtdcore.o mtd_uboot.o

选中参数:Device Drivers > MTD Support > Enable MTD layer
报错:

 /home/loongson/ls2k/u-boot-ls2k/drivers/mtd/nand/raw/ls1x-nand.c:503: undefined reference to `SPARE_ADDRH'
/home/loongson/ls2k/u-boot-ls2k/drivers/mtd/nand/raw/ls1x-nand.c:504: undefined reference to `SPARE_ADDRL'
/home/loongson/ls2k/u-boot-ls2k/drivers/mtd/nand/raw/ls1x-nand.c:602: undefined reference to `NO_SPARE_ADDRH'
/home/loongson/ls2k/u-boot-ls2k/drivers/mtd/nand/raw/ls1x-nand.c:603: undefined reference to `NO_SPARE_ADDRL'
/home/loongson/ls2k/u-boot-ls2k/drivers/mtd/nand/raw/ls1x-nand.c:550: undefined reference to `SPARE_ADDRH'
/home/loongson/ls2k/u-boot-ls2k/drivers/mtd/nand/raw/ls1x-nand.c:551: undefined reference to `SPARE_ADDRL'
/home/loongson/ls2k/u-boot-ls2k/drivers/mtd/nand/raw/ls1x-nand.c:470: undefined reference to `SPARE_ADDRH'
/home/loongson/ls2k/u-boot-ls2k/drivers/mtd/nand/raw/ls1x-nand.c:471: undefined reference to `SPARE_ADDRL'
drivers/built-in.o: In function `dma_alloc_coherent':
/home/loongson/ls2k/u-boot-ls2k/drivers/mtd/nand/raw/ls1x-nand.c:240: undefined reference to `__phys_to_dma'
drivers/built-in.o: In function `dma_alloc_noncoherent':
/home/loongson/ls2k/u-boot-ls2k/drivers/mtd/nand/raw/ls1x-nand.c:251: undefined reference to `__phys_to_dma'

解决:找到对应的变量和函数移至这个文件中ls1x-nand.c中。
编译通过后烧写启动后,报错log:

NAND:  Failed to initialize ls1x NAND controller. (error -96)
0 MiB

这是驱动没有被调用,查看设备树中NAND节点引用的驱动为loongson,ls-nand,在ls1x-nand.c中的ls1x_nand_dt_ids,添加以下:

{.compatible = "loongson,ls-nand",},

驱动加载成功后报以下错误:

NAND:
nand_base: No NAND device found
failed to scan nand
Failed to initialize ls2k NAND controller. (error -6)

也就是找不到NAND,首先追溯uboot里打印No NAND device found的地方:

nand_scan_ident ----------drivers/mtd/nand/raw/nand_base.c:4651
nand_get_flash_type(mtd, chip, &nand_maf_id, &nand_dev_id, table);if (!type->name) //在此处出错return ERR_PTR(-ENODEV);

也就是没有获取到NAND的型号。
可以两个方面排查,第一,因为这个驱动用的LS1X的驱动,不能保证适用与2K1000的NAND接口,而且进一步定位打印了nand_readid_op(chip, 0, id_data, 8)返回的id_data值是0,事后证明id_data为0是证明接口NAND接口没通。

利用PMON驱动移植(成功)

为了节约时间,直接进行把PMON的NAND驱动ls2k-nand.c移植过来。
drivers/mtd/nand/raw/Kconfig添加以下代码:

config NAND_LS2Kbool "loongson2k NAND support"depends on TARGET_LS2Kselect SYS_NAND_SELF_INITimply CMD_NANDimply NAND_SUPPORThelpThis enables the NAND driver for the NAND flash controller on the

drivers/mtd/nand/raw/Makefile添加以下代码:

obj-$(CONFIG_NAND_LS2K) += ls2k-nand.o

include/configs/ls2k.h添加以下代码:

#ifdef CONFIG_MTD_RAW_NAND
#define CONFIG_SYS_MAX_NAND_DEVICE  1
#endif

选中参数:

CONFIG_CMD_MTD=y
CONFIG_MTD=y
CONFIG_DM_MTD=y
CONFIG_MTD_RAW_NAND=y
CONFIG_NAND_LS2K=y
CONFIG_BCH=y

移植源码见:移植源码

启动后log如下:

id_l: 48002689, id_h:00e0002c
id_l: 48002689, id_h:00e0002c
id_l: 48002689, id_h:00e0002c
nand_base: No NAND device found
failed to scan nand
Failed to initialize ls2k NAND controller. (error -6)

还是找不到NAND,但是呢,启动log看到ID能正常读到,nand_readid_op(chip, 0, id_data, 8)函数过后打印的id_data也是和log一致,说明NAND硬件接口通了。

进一步排查:
nand_get_flash_type在读到NAND的ID之后,会在nand_flash_ids数组中有个查表的操作。事实证明,我们贴的这个NAND的信息没有添加到到这个数组里,所以校验失败。

很重要的一点来了:
在nand_flash_ids中添加以下一行:
EXTENDED_ID_NAND(“NAND 2GiB 3,3V 16-bit”, 0x48, 2048, LP_OPTIONS16),
改为:EXTENDED_ID_NAND(“NAND 2GiB 3,3V 8-bit”, 0x48, 2048, LP_OPTIONS),
启动之后打印:

NAND:
nand_base: device found, Manufacturer ID: 0x2c, Chip ID: 0x48
nand_base: Micron NAND 2GiB 3,3V 16-bit
nand_base: Micron NAND 2GiB 3,3V 16-bit
nand_base: 2048 MiB, SLC, erase size: 256 KiB, page size: 4096, OOB size: 128
0 MiB

还是有问题,这个应该是2048MB才对。
对比ls1x-nand.c的驱动,probe中少了个:

ret = nand_register(0, mtd);

启动之后,查看nand信息:

 # mtd  list
List of MTD devices:
* nand0- type: NAND flash- block size: 0x40000 bytes- min I/O: 0x1000 bytes- OOB size: 128 bytes- OOB available: 78 bytes- ECC strength: 1 bits- ECC step size: 256 bytes- bitflip threshold: 1 bits- 0x000000000000-0x000080000000 : "nand0"

恩?nand没有划分区,接下来怎么划分区呢?

首先呢,我们看到之前添加的这个函数ret = nand_register(0, mtd);中的add_mtd_device就有添加分区的功能。

这里我们只需要开启两个配置:

CONFIG_CMD_MTDPARTS=y
CONFIG_MTDIDS_DEFAULT="nand0=ls2k-nand"   //这个很重要,如果不设置,或者设错是划不成功的。这个需与驱动中设置的名字一致
CONFIG_MTDPARTS_DEFAULT="ls2k-nand:14m(kernel),460m(root),1m(logo),-(user)"

nand0是nand_register函数中mtd->name = dev_name[devnum]生成的名字。

U_BOOT_DRIVER(ls2k_nand) = {.name = "ls2k-nand",.id = UCLASS_MTD,.of_match = ls2k_nand_dt_ids,.probe = ls2k_nand_probe,.priv_auto_alloc_size = sizeof(struct ls2k_nand_info),
};

调试过程中出现问题:

==>mtd list
Scanning device for bad blocks
Bad eraseblock 0 at 0x000000000000
nand dma timeout!
Bad eraseblock 1 at 0x000000040000
nand dma timeout!

在命令行模式下执行:nand erase.chip 是没有用的
必须执行:nand scrub.chip 也没用
仔细看以下开机启动log:

nand_base: 2048 MiB, SLC, erase size: 256 KiB, page size: 4096, OOB size: 128

这个erase size: 256 KiB其实是不对的,修改nand_flash_ids中的参数:
EXTENDED_ID_NAND(“NAND 2GiB 3,3V 16-bit”, 0x48, 2048, LP_OPTIONS16),
改成EXTENDED_ID_NAND(“NAND 2GiB 3,3V 16-bit”, 0x48, 2048, LP_OPTIONS),
改成{ .name = “NAND 2GiB 3,3V 8-bit”, .dev_id = 0x48, .pagesize = 4096 , .chipsize = 2048, .erasesize = SZ_512K, .options = SP_OPTIONS },

chipsize:整个NAND FLASH 的大小,单位为MB
pagesize:一页的大小,单位为字节Byte
erasesize:最小擦除大小,单位为字节Byte
这些数据来源芯片手册:

启动之后这样的信息才是对的:

==> nand info
Device 0: nand0, sector size 512 KiBPage size       4096 bOOB size         128 bErase size    524288 bsubpagesize     1024 boptions     0x40005108bbt options 0x00000000

分区也划分完毕:

==>mtdparts device nand0 <ls2k-nand>, # parts = 4
#: name                size            offset          mask_flags
0: kernel              0x00e00000      0x00000000      0
1: root                0x1cc00000      0x00e00000      0
2: logo                0x00100000      0x1da00000      0
3: user                0x62500000      0x1db00000      0active partition: nand0,0 - (kernel) 0x00e00000 @ 0x00000000defaults:
mtdids  : nand0=ls2k-nand
mtdparts: ls2k-nand:14m(kernel),460m(root),1m(logo),-(user)

基于龙芯2K1000移植uboot之NAND相关推荐

  1. 基于龙芯2K1000移植uboot之DDR

    基于龙芯2K1000移植uboot之DDR 移植环境 开始移植 额外说明 移植环境 CPU:LS2K1000 DDR:SCB13H8G162BF-13KI 编译环境:Ubuntu16.04+gcc-4 ...

  2. 基于龙芯2K1000平台CL1606AD760-8驱动调试总结

    历经两周终于将设计的AD采集板驱动起来,并且读取电流值成功,唯不是一个突破!由硬件设计再到驱动,一步步设计改变:到设备树添加驱动并加载,总结主要分为两方面,一个驱动调试和硬件调试.细节如下: 驱动调试 ...

  3. 基于龙芯 2K1000 的嵌入式 Linux 系统移植和驱动程序设计(二)

    第 3 章 嵌入式软件系统移植 本课题中嵌入式系统正常工作的前提是嵌入式软件系统完整且能正常工作, 以便为之后的软件开发提供一个能够正常工作的平台.引导程序 PMON 需要完成 内核引导,嵌入式 Li ...

  4. 基于龙芯2K1000适配WIFI模块(型号:Intel 8265NGW)

    硬件平台:龙芯2K1000 evb开发板 + Intel 8265NGW 开发环境:Ubuntu16.04+gcc-4.9.3-64-gnu 平台环境1:PMON+linux3.10+loongnix ...

  5. 基于龙芯2K1000的3U CPCI主板

    产品图片 技术信息 处理器与系统 CPU 龙芯LS2K1000 内存 板载4片 DDR3内存颗粒,总容量2GB BIOS 龙芯PMON PICMG标准 PICMG 2.0 CompactPCI R3. ...

  6. 编译移植龙芯2K1000平台下的qt-5.13

    编译移植龙芯2K1000平台下的qt-5.13 本文记录对龙芯2K进行qt5.13.1版本的移植. 本文中对于tslib的安装不做讲解,使用了QT4进行核心板开发的童鞋一般情况下,应该已经安装好了ts ...

  7. 迅为龙芯2K1000开发板PMON开发之配置nand flash之配置pmon

    pmon 支持俩种接口类型的 nand flash,一个是 nand 控制器接口,一个是 spi 接口.龙芯核心板上板载了一个 nand 控制器接口的 flash. 1 配置 pmon 首先我们需要在 ...

  8. 龙芯2K1000开发板资料1.2版更新了

    叮,今日更新已送达. 本次指南更新新增了pmon下操作GPIO章节和pmon下Ejtag使用章节,感兴趣的快来看看吧~ 更新重点 1.新增了9.6 pmon下操作GPIO章节 2.新增了9.7 pmo ...

  9. 迅为龙芯2K1000开发板国产处理器操作系统

    1.硬件配置 国产龙芯处理器,双核64位系统,板载2GDDR3内存,流畅运行Busybox.Buildroot.Loognix.QT5.12 系统! 2.接口全 板载4路USB HOST.2路千兆以太 ...

最新文章

  1. 广联达2018模板算量步骤_老师傅带你学造价,广联达GTJ2018图文详解,小白也能学会的软件...
  2. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用nfactors参数指定抽取的因子的个数、fa函数因子分析结果解读(Extracting common facto
  3. 学会python之后-python学会后做什么
  4. 深入理解cookie和session
  5. IDEA中SVN未提交代码,更新时有冲突接受其它怎么办
  6. Python学习笔记:面向对象编程(4)
  7. lcd和服务器同时显示温度,51单片机LCD1602如何同时显示温度和时间
  8. 用Python写一个将Python2代码转换成Python3代码的批处理工具
  9. 我用Python抓取了【S11全球总决赛】直播评论,EDG nb
  10. 如何利用UltraISO将系统镜像刻录到U盘上
  11. HTML用来显示计算机代码的标签 pre 预定义格式标签
  12. 计算机平面设计考试试题及答案,最新国家开放大学电大专科《计算机平面设计(1)》网络课形考任务1及任务2答案...
  13. notepad拼心形_Excel心形函数v1.0 免费版
  14. PS制作五彩抽象人像
  15. 新款戴尔取消开盖自动开机办法,以戴尔7591为例子如下
  16. 一键安装java程序_一键配置java环境工具
  17. JAVA修炼之路的开启
  18. Mac下搭建EPS8266开发环境Mongoose OS 篇
  19. 在微软Azure的服务器上创建Windows虚拟机的教程
  20. 利用css绘制三条横线的菜单图标

热门文章

  1. 玩转微信 为您推荐十大生活服务类微信公众号
  2. 使用 Java 对图像进行各种处理
  3. 数学建模|主成分分析原理(PCA)
  4. amd处理器,锐龙5800H联想小新pro16,VMware安装win10,CentOS7蓝屏
  5. 推荐!国外程序员整理的机器学习资源大全
  6. java sts_Spring Tool Suite(STS)安装
  7. 盛世昊通正式投资入股棋煜网络,携手共绘企业微信板块蓝图
  8. 物流管理考研需要考计算机吗,物流管理考研要考哪些
  9. 自我勉励——《山月记》
  10. 模拟IIC的时钟延展问题(Clock Stretching)