开发板用户手册加快研发速度
更新内容包括开发环境搭建、系统编译与编程、pmon基础知识、启动流程分析、网络加载系统、对nand的编程系统、新的pmon移植教程、新增pmon下操作GPIO的章节以及pmon下使用Ejtag的章节。等待。
pmon支持nand flash的两种接口类型,一种是nand控制器接口,另一种是spi接口。龙芯核心板配备了NAND控制器接口闪存。
9.9.11.1 配置pmon
首先我们需要在pmon中添加对nand的支持,那么我们需要配置什么呢?这要从pmon的启动过程说起。当pmon启动时,它会调用Targets/LS2K/ls2k/tgt_machdep.c中的ls2k_nand_init()函数来初始化nand。如果我们要调用ls2k_nand_init()函数,我们需要定义一个宏。定义NNADN和CONFIG_LS2K_NAND,其中NNADN的值在Targets/LS2K/compile/ls2k/m25p80.h中定义为1,
所以我们只需要在Targets/LS2K/conf/ls2k文件中添加代码选项CONFIG_LS2K_NAND即可。这里我们将其添加到第269行,
pmon的默认bsp中,默认添加了代码select nand,所以这里我们不需要添加代码select nand,select指定选择后面的参数nand。选择nand参数后,在conf/files文件中使用file指定的c文件即可编译成pmon。因为file指定的文件是否编译取决于后面的参数是否选择,所以needs-flag的意思是为该文件生成头文件。
不过我们回过头来看看这部分条件编译的代码,
如果我们定义了NNAND和CONFIG_LS2K_NAND,我们执行*(volatile int *)0xbfe10420 |=(19)代码将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 中默认的ECC 是NAND_ECC_SOFT 和NAND_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 中定义。
如果环境变量mtdparts中设置了分区信息,则调用add_mtd_device指定分区。 sys/dev/nand/ls2k-nand.c中的代码如下:
我们如何设置环境变量mtdparts中的值?
这里环境变量的设置必须和pmon中的设备树一致。打开Targets/LS2K/conf/LS2K.dts设备树文件并找到nand节点。 nand节点的子分区节点代表分区信息,如下图所示。展示:
在:
兼容='龙芯,ls-nand';意味着匹配驱动程序使用的属性。
reg=0x1fe060400x00x1fe060000x20;表示控制寄存器的地址和长度,其中0x1fe06040是
NAND_DMA_ADDR_REG 的地址。地址0x1fe06000是NAND_CMD的地址。长度为0x20。
中断父=icu;中断控制器是icu
中断=52;分配中断号52
中断名称='nand_irq';中断名称
DMA=DMA0 1;表示使用dma0控制器,通道数为1
dma-名称='nand_rw'; DMA 控制器名称
dma 掩码=0xffffffff0xffffffff;表示设备的DMA能力。如果设备只有32 位dma 能力,则应配置为
0x00xffffffff,如果设备有64位DMA能力,则应配置为0xffffffff0xffffffff
零件数=0x2;表示分区数,这里设置为两个分区
分区@0 {
标签='内核分区';
reg=0x00000000x01e00000;
};
分区0,分区名称为kernel_partition,分区起始地址为0x0000000,分区长度为0x01e00000。
分区@0x01400000 {
标签='os_partition';
reg=0x01e000000x0;
};
分区1,分区名称为os_partition,分区起始地址为0x01e00000,分区长度为全部剩余空间。
这里我们需要修改partition@0和partition@0x01400000子节点。这里我们将内核分区大小设置为30M,剩余482M用于文件系统。
接下来我们需要添加片选信息。一般来说,根据硬件设计规范,Flash的片选会连接到cs0。从原理图中我们可以确认片选引脚连接到了cs0,如下图所示:
但是我们如何编写设备树呢?这就需要我们看一下驱动源码。我们打开内核源代码。
对于drivers/mtd/nand/ls-nand.c下的nand控制器驱动,在第637行我们可以看到它通过nand-cs获取片选信息。
所以我们添加属性nand-cs=0x00;设备树中,添加完成如下图:
这样我们pmon下的设备树就搭建好了,然后我们回去设置环境变量mtdparts。必须和我们在设备树中设置的一致。修改完成如下图:
这样pmon对nand的设置就完成了。