1、  devicetree配置

devicetree中涉及到QSPI FLASH的部分如下:

spi@e000d000 {

clock-names= "ref_clk", "pclk";

clocks= <0x1 0xa 0x1 0x2b>;

compatible ="xlnx,zynq-qspi-1.0";

status= "okay";

interrupt-parent= <0x3>;

interrupts= <0x0 0x13 0x4>;

reg= <0xe000d000 0x1000>;

#address-cells= <0x1>;

#size-cells= <0x0>;

is-dual = <0x0>;

num-cs = <0x1>;

flash@0{

compatible ="n25q256a13";

reg= <0x0>;

spi-tx-bus-width= <0x1>;

spi-rx-bus-width= <0x4>;

spi-max-frequency= <0x2faf080>;

#address-cells= <0x1>;

#size-cells= <0x1>;

partition@qspi-fsbl-uboot{

label= "qspi-fsbl-uboot";

reg= <0x0 0x100000>;

};

partition@qspi-linux{

label= "qspi-linux";

reg= <0x100000 0x500000>;

};

partition@qspi-device-tree{

label= "qspi-device-tree";

reg= <0x600000 0x20000>;

};

partition@qspi-rootfs{

label= "qspi-rootfs";

reg= <0x620000 0x5e0000>;

};

partition@qspi-bitstream{

label= "qspi-bitstream";

reg= <0xc00000 0x400000>;

};

};

};

一般qspi flash被区分为五个分区,配置时需要注意下面几点:

Is_dual表示并行模式,如果不是并行设置为0(Set if parallel. Reset if single or stacked.)

Num_cs表示flash芯片数量,目前zynq把qspi flash当成一个芯片,即使板子上贴了两块芯片,zynq也只是当成一片使用

配置完devicetree后在xilinx_zynq_defconfig中也需要配置MTD分区

CONFIG_CMDLINE="

console=ttyPS0,115200n8

root=/dev/ram rw

initrd=0x00800000,16M

earlyprintk

mtdparts=physmap-flash.0:512K(nor-fsbl),512K(nor-u-boot),5M(nor-linux),9M(nor-user),1M(nor-scratch),-(nor-rootfs)"

通过对比devicetree中的分区和defconfig中的分区可以发现共同点:

fsbl和u-boot位于前1M(nor-fsbl+nor-u-boot)分区

linux内核位于接下来的5M(nor-linux)分区

devicetree,rootfs,bitstream中位于后面9M(nor-user)中(实际只占用6M)

2、  kernel配置

配置完devicetree后需要对kernel进行配置,在编译产生kernel时将相应的驱动加入kernel。

b198f190f408f84bb2147d056ca24bff.png

上图中需要将boot选项设置为采用bootloader内核参数。

499325aa73591ede5be7b0e206c7b01d.png

将zynq QSPI控制器添加到内核中

3、  qspi flash测试

启动linux,在启动过程中能找到如下打印,当前linux kernel版本为3.14

5e65ee9690e45685ab1a3684dab3d059.png

从这里可以看出启动分区信息。

1)文件读写测试

当linux启动完成后,可以通过

#cat /proc/mtd

列出所有的分区

c65acf4ba6853eae9fb1af3f2902a672.png

很显然,两个分区信息一致。

接下来进行flash文件读写,首先在本地创建一个文件(大小4M)

#ddif=/dev/urandom of=./sample.bin bs=1024 count=4096

拷贝到mtd3中

#flashcp-v ./sample.bin /dev/mtd3

3c3f8b94949705b3858e9e1b5a98ee12.png

2)文件系统测试

除了对flash进行文件读写测试外,Qspiflash中也可以挂载文件系统进行测试 首先列出所有分区信息

#cat/proc/mtd

对要挂载文件系统的分区进行擦除操作

#flash_eraseall -j /dev/mtd3

b43a2871c517b86f09e38846034d9c0f.png

创建目录

#mkdirqspi_flash0

将分区挂载到qspi_flash0

#mount-t jffs2 /dev/mtdblock3 /qspi_flash0

创建要写入flash的文件

#ddif=/dev/urandom of=./sample.bin bs=1024 count=4096

将文件写入flash

#cp./sample.bin /qspi_flash0/

列出文件系统中文件

ls/qspi_flash0

d10dc1f6ed40552f4f3ebf1fd182bd3f.png

卸载文件系统

#umount qspi_flash0

再次挂载文件系统

#mount-t jffs2 /dev/mtdblock3 /qspi_flash0

比较之前产生的文件与文件系统中的文件是否一致,一致证明文件系统有效

#diff./sample.bin /qspi_flash0/sample.bin

再次卸载文件系统

#umountqspi_flash0

cab965760afd505ad4a5354c252c28b0.png

只要不擦除flash,Sample.bin将一直存在flash中,这样就验证了文件系统的正确性。

更多推荐