龙芯处理器 nand 使用教程
nand分为:nand接口与spi接口,spi接口分spi norflash和spi nandflash
以LS2K为例,描述pmon和内核下的使用例程
一、PMON下使用教程
1、ls2k pmon源码获取路径
http://ftp.loongnix.org/embedd/ls2k/pmon-loongson3.tar.gz
2、pmon源码与nand相关文件
a、sys/dev/nand/ls2k-nand.c
b、sys/dev/nand/spinand_lld.c
c、Targets/LS2K/dev/spi_w.c
d、sys/dev/nand/m25p80.c
e、Targets/LS2K/conf/ls2k
f、Targets/LS2K/ls2k/tgt_machdep.c
g、Targets/LS2K/include/pmon_target.h
3、 pmon配置文件(Targets/LS2K/conf/ls2k)中选nand应类型
a、如果使用的是nand接口nand选项为:
Select nand
Option CONFIG_LS2K_NAND
b、如使用的是spi接口nand选项为:
Select nand
Select spinand_mt29f
c、如使用的是spi接口的nor flash选项为:
Select m25p80
4、 pmon下nand分区
1、修改源码调整分区
Targets/LS2K/include/pmon_target.h
#define TGT_DEFENV {"mtdparts","nand-flash:30M@0(kernel),-(rootfs);spinand_flash:30M@0(kernel),-(rootfs)",0,&mtd_rescan}, \
{"bootdelay","3",0,0}
2、pmon命令行下,命令修改
set mtdparts "nand-flash:30M@0(kernel),-(rootfs);spinand_flash:30M@0(kernel),-(rootfs)"
备注:pmon与内核分区要保持一致!!!
5、 pmon下使用
a、擦除
mtd_erase /dev/mtd0r 备注:0代表分区,r后缀代表擦除不跳过坏快
b、写数据
devcp tftp://server-ip/vmlinux /dev/mtd0 备注:将内核镜像写入0分区内
devcp tftp://server-ip/roofs-yaffs2.img /dev/mtd1y 备注:y后缀代表以yaffs2格式写入
c、读取
load /dev/mtd0 备注:从0分区读取数据到内存
二、内核下使用教程
1、ls2k内核源码获取路径
http://ftp.loongnix.org/embedd/ls2k/linux-3.10.tar.gz
2、内核源码与nand相关文件
a、drivers/mtd/nand/ls-nand.c
b、drivers/mtd/nand/spinand_lld.c
c、drivers/mtd/devices/m25p80.c
3、 内核配置(make menuconfig ARCH=mips)时选nand类型
a、如果使用的是nand接口nand选项为:
CONFIG_MTD_NAND_LS
b、如使用的是spi接口nand选项为:
CONFIG_MTD_SNAND_MT29F
c、如使用的是spi接口的nor flash选项为:
CONFIG_MTD_M25P80
4、 内核下nand分区
a、1号处理器,ls1b为例,内核下nand分区在arch/mips/loongson/ls1b/platform.c里
1、nand接口
static struct mtd_partition ls1b_nand_partitions[]={
[0] = {
.name ="kernel", 备注:分区名称
.offset =0, 备注:分区偏移
.size =0x40000000, 备注:分区大小
},
[1] = {
.name ="swap",
.offset = 0x40000000,
.size = 0,
},
};
2、spi接口
同上
b、2、3号处理器,内核下nand分区是按照设备树分区,设备树默认用pmon下的(Targets/LS2K/conf/LS2K.dts)
1、nand接口
nand@0x1fe06040 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "loongson,ls-nand";
reg = <0x1fe06040 0x0
0x1fe06000 0x20>;
interrupt-parent = <&icu>;
interrupts = <52>;
interrupt-names = "nand_irq";
dmas = <&dma0 1>;
dma-names = "nand_rw";
dma-mask = <0xffffffff 0xffffffff>;
number-of-parts = <0x2>; 备注:分区个数
partition@0 {
label = "kernel_partition"; 备注:分区名称
reg = <0x0000000 0x01e00000>; 备注:分区大小(<偏移,大小>)
};
partition@0x01400000 {
label = "os_partition";
reg = <0x01e00000 0x0>;
};
};
2、spi接口
spi0: spi@1fff0220{
compatible = "loongson,ls-spi";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x1fff0220 0x10>;
spidev@3{
compatible = "rohm,dh2228fv";
spi-max-frequency = <100000000>;
reg = <3>;
};
spidev@0{
compatible = "m25p80";
spi-max-frequency = <40000000>;
reg = <0>;
};
spidev@1{
compatible = "mt29f";
spi-max-frequency = <20000000>;
reg = <1>; 备注:spi片选
number-of-parts = <0x2>; 备注:分区个数
partition@0 {
label = "kernel_partition"; 备注:分区名称
reg = <0x0000000 0x01e00000>; 备注:分区大小(<偏移,大小>)
};
partition@0x01400000 {
label ="os_partition";
reg = <0x01e00000 0x0>;
};
};
};
备注:pmon与内核分区要保持一致!!!
5、 内核下使用
a、mount –t yaffs2 /dev/mtdblok1 /mnt 备注:将分区mtdblock1分区挂载到mnt目录上
b、cat /proc/mtd 备注:查看分区情况
三、ecc 纠错算法
支持 soft ecc 和 bch 纠错算法
a、不是用ecc在驱动中设置:
this->ecc.mode = NAND_ECC_NONE
b、使用 soft ecc 算法在驱动中设置:
this->ecc.mode = NAND_ECC_SOFT;
c、使用 bch 算法在驱动中设置:
this->ecc.mode = NAND_ECC_SOFT_BCH;
备注:pmon配置文件下需要打开 select nand_bch
四、nand调试常见问题
a、发现不了nand
检查nand片选是否正确
查看nand_ids.c文件里是否包含所用的nand型号
b、能发现nand,但不能使用
pmon与内核分区大小不一致
pmon与内核ecc模式不一致