论坛» 综合技术» 工业控制与自动化

国产软硬件龙芯系列迅为2K1000开发板配置nandflash

菜鸟
2022-04-12 14:15 1楼

开发板使用手册让研发速度快上加快

更新包含了开发环境搭建、系统编译与烧写和pmon基础知识、启动流程分析、网络加载系统、烧写系统到nand以及新增pmon移植教程、新增pmon下操作GPIO章节和pmonEjtag使用章节等。


pmon支持俩种接口类型的nand flash,一个是nand控制器接口,一个是spi接口。龙芯核心板上板载了一个nand控制器接口的flash

9.9.11.1配置pmon

首先我们需要在pmon里面添加对nand的支持,那么我们都要配置哪些内容呢?这个要从pmon 的启动流程入手,pmon在启动的时候是在Targets/LS2K/ls2k/tgt_machdep.c里调用ls2k_nand_init()函数对nand进行初始化的,如果我们要调用ls2k_nand_init()函数,就需要定义宏定义NNADNCONFIG_LS2K_NAND其中NNADN的值在Targets/LS2K/compile/ls2k/m25p80.h中定义为1,

所以我们只需要在Targets/LS2K/conf/ls2k文件中添加代码option CONFIG_LS2K_NAND即可,这里我们添加到第269 行,

pmon默认的bsp中,默认添加了代码select nand,所以这里我们不必要在添加代码select nand,而select指定的是后面的参数nand被选中,选中了nand参数以后,在conf/files文件中使用file指定的c文件就可以被编译到pmon里面。因为file 指定的文件编译与否取决于后面的参数有没有被选中,needs-flag 表示为该文件生成头文件。

然我们回过头再来看条件编译的这部分代码,

如果我们定义了NNANDCONFIG_LS2K_NAND,就是执行*(volatile int *)0xbfe10420 |= (1<<9) 代码将GPIO的管教复用设置为NAND,,如果没用定义这俩个宏定义,就将复用关系设置为GPIO,如下图所示:

如果定义了这俩个宏定义,接着就会调用ls2k_nand_init函数来初始化nand,我们跳转到ls2k_nand_init函数定义的sys/dev/nand/ls2k-nand.c驱动文件,通过阅读代码我们可以找到对mtd结构初始化的驱动函数为ls2k_nand_init_mtd,通过访问mtd就可以访问nand 控制器,

ls2k_nand_init_mtd函数中,最关键的是对ECC的选择,在pmon中默认的ECCNAND_ECC_SOFTNAND_ECC_SOFT_BCH 俩种。BCH校验比ECC校验有更强的纠错能力,龙芯BSP里面默认使用的是ECC校验,代码如下:

如果我们需要使用BCH校验,需要在在Targets/LS2K/conf/ls2k中定义select nand_bch,,这个我们选择BCH校验,如下图所示:

9.9.11.2配置分区

nand初始化最后的步骤会建立分区信息,建立分区信息的逻辑是先会调用nand_flash_add_parts

数对环境变量mtdparts 进行判断,mtdparts环境变量在Targets/LS2K/include/pmon_target.h 中定义,

mtdpartsadd_mtd_devicesys/dev/nand/ls2k-nand.c 中代码如下:

环境变量mtdparts中的值我们要怎么设置呢?

这里环境变量的设置我们要和pmon里面设备树的保持一致,打开Targets/LS2K/conf/LS2K.dts设备树文件,找到nand节点,其中nand节点的子partition节点表示的是分区信息,如下图所示:

其中:

compatible = "loongson,ls-nand";表示匹配驱动所使用的属性。

reg = <0x1fe06040 0x0 0x1fe06000 0x20>;表示控制寄存器的地址和长度,其中0x1fe06040

NAND_DMA_ADDR_REG的地址。地址0x1fe06000NAND_CMD的地址。长度均为0x20

interrupt-parent = <&icu>;中断控制器是icu

interrupts = <52>;分配中断号为52

interrupt-names = "nand_irq";中断名称

dmas = <&dma0 1>;表示使用dma0控制器,通道数为1

dma-names = "nand_rw"; dma控制器名称

dma-mask = <0xffffffff 0xffffffff>;表示设备dma能力,如果设备只有32dma能力,则应该配置成

0x00xffffffff,如果设备有64dma能力,则应该配置成0xffffffff 0xffffffff

number-of-parts = <0x2>;表示分区数量,这里设置成俩个分区

partition@0 {

label = "kernel_partition";

reg = <0x0000000 0x01e00000>;

};

分区0,分区名称为kernel_partition,其中分区起始地址为0x0000000,分区长度为0x01e00000

partition@0x01400000 {

label = "os_partition";

reg = <0x01e00000 0x0>;

};

分区1,分区名称为os_partition,其中分区起始地址为0x01e00000,分区长度为剩余所有空间。

这里我们需要修改partition@0partition@0x01400000子节点。这里我们把内核的分区大小设置30M,剩余的482M 给文件系统。

接着我们需要添加片选信息。一般情况下根据硬件设计规范,Flash的片选会接到cs0上,通过原理图我们可以确定,片选引脚连接到了cs0 上,如下图所示:

但是设备树我们要怎么写呢?这个就需要我们去看驱动源码了,我们打开内核源码

drivers/mtd/nand/ls-nand.c下的nand控制器的驱动,在第637行我们可以看到他是通过nand-cs 来获取的片选信息,

所以我们在设备树中添加属性nand-cs=<0x00>;,添加完成如下图所示:

这样,pmon下的设备树我们就设置好了,然后我们回过头在来设置环境变量mtdparts,要与设备树中我们设置的保持一致,修改完成如下图所示:

这样pmonnand 的设置就已经完成了。


高工
2022-04-12 15:43 2楼

感谢楼主的分享,很实用了。

工程师
2022-04-12 21:57 3楼

学习

高工
2022-04-12 23:15 4楼

是款不错的产品

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]