TI中文支持网
TI专业的中文技术问题搜集分享网站

Devicetree nandflash 相关

各位好,现在想要在原有板子基础上增加一片nandflash,使用片选csn1,原nand使用csn0不变,两片nand型号都一样。现在尝试着编写的Devicetree如下:

 

&gpmc {
	status = "okay";
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&nandflash_pins_default>;
	pinctrl-1 = <&nandflash_pins_sleep>;
	ranges = <0 0 0x08000000 0x10000000>,<1 0 0x18000000 0x10000000>;	/* CS0: NAND */ /*CS1: NAND*/
	nand@0,0 {
		reg = <0 0 0>; /* CS0, offset 0 */
		ti,nand-ecc-opt = "bch8";
		ti,elm-id = <&elm>;
		nand-bus-width = <8>;
		gpmc,device-width = <1>;
		gpmc,sync-clk-ps = <0>;
		gpmc,cs-on-ns = <0>;
		gpmc,cs-rd-off-ns = <44>;
		gpmc,cs-wr-off-ns = <44>;
		gpmc,adv-on-ns = <6>;
		gpmc,adv-rd-off-ns = <34>;
		gpmc,adv-wr-off-ns = <44>;
		gpmc,we-on-ns = <0>;
		gpmc,we-off-ns = <40>;
		gpmc,oe-on-ns = <0>;
		gpmc,oe-off-ns = <54>;
		gpmc,access-ns = <64>;
		gpmc,rd-cycle-ns = <82>;
		gpmc,wr-cycle-ns = <82>;
		gpmc,wait-on-read = "true";
		gpmc,wait-on-write = "true";
		gpmc,bus-turnaround-ns = <0>;
		gpmc,cycle2cycle-delay-ns = <0>;
		gpmc,clk-activation-ns = <0>;
		gpmc,wait-monitoring-ns = <0>;
		gpmc,wr-access-ns = <40>;
		gpmc,wr-data-mux-bus-ns = <0>;
		/* MTD partition table */
		/* All SPL-* partitions are sized to minimal length* which can be independently programmable. For* NAND flash this is equal to size of erase-block */
		#address-cells = <1>;
		#size-cells = <1>;
		partition@0 {
			label = "NAND.SPL";
			reg = <0x00000000 0x000020000>;
		};
		partition@1 {
			label = "NAND.SPL.backup1";
			reg = <0x00020000 0x00020000>;
		};
		partition@2 {
			label = "NAND.SPL.backup2";
			reg = <0x00040000 0x00020000>;
		};
		partition@3 {
			label = "NAND.SPL.backup3";
			reg = <0x00060000 0x00020000>;
		};
		partition@4 {
			label = "NAND.u-boot-spl-os";
			reg = <0x00080000 0x00040000>;
		};
		partition@5 {
			label = "NAND.u-boot";
			reg = <0x000C0000 0x00100000>;
		};
		partition@6 {
			label = "NAND.u-boot-env";
			reg = <0x001C0000 0x00020000>;
		};
		partition@7 {
			label = "NAND.u-boot-env.backup1";
			reg = <0x001E0000 0x00020000>;
		};
		partition@8 {
			label = "NAND.kernel";
			reg = <0x00200000 0x00800000>;
		};
		partition@9 {
			label = "NAND.file-system";
			reg = <0x00A00000 0x0F600000>;
		};
	};
	
	nand@1,0 {
		reg = <1 0 0>; /* CS1, offset 0 */
		ti,nand-ecc-opt = "bch8";
		ti,elm-id = <&elm>;
		nand-bus-width = <8>;
		gpmc,device-width = <1>;
		gpmc,sync-clk-ps = <0>;
		gpmc,cs-on-ns = <0>;
		gpmc,cs-rd-off-ns = <44>;
		gpmc,cs-wr-off-ns = <44>;
		gpmc,adv-on-ns = <6>;
		gpmc,adv-rd-off-ns = <34>;
		gpmc,adv-wr-off-ns = <44>;
		gpmc,we-on-ns = <0>;
		gpmc,we-off-ns = <40>;
		gpmc,oe-on-ns = <0>;
		gpmc,oe-off-ns = <54>;
		gpmc,access-ns = <64>;
		gpmc,rd-cycle-ns = <82>;
		gpmc,wr-cycle-ns = <82>;
		gpmc,wait-on-read = "true";
		gpmc,wait-on-write = "true";
		gpmc,bus-turnaround-ns = <0>;
		gpmc,cycle2cycle-delay-ns = <0>;
		gpmc,clk-activation-ns = <0>;
		gpmc,wait-monitoring-ns = <0>;
		gpmc,wr-access-ns = <40>;
		gpmc,wr-data-mux-bus-ns = <0>;
		/* MTD partition table */
		/* All SPL-* partitions are sized to minimal length* which can be independently programmable. For* NAND flash this is equal to size of erase-block */
		#address-cells = <1>;
		#size-cells = <1>;
		partition@0 {
			label = "NAND.file-system";
			reg = <0x00000000 0x10000000>;
		};
	};
};

有几点疑问如下:

1.其中 ranges 属性第一个字段1表示csn1片选,第二个字段为固定值0,第三个字段为物理地址0x18000000,第四个字段为nand大小512MB。

不知理解是否正确,还有就是这样的写法是否正确?

 2.其中 <a href="mailto:nand@1,0">nand@1,0</a> 子节点这样写是否正确?说明文档 ti-gpmc.txt 中有这样描述 #address-cells: Must be set to 2 to allow memory address translation 此处中address必须为2,那么片选为csn1的nand地址应该是1,0还是0,1呢?

 3.<span style="color: rgb(255, 0, 0);">reg = <1 0 0>; /* CS1, offset 0 */ 这个reg是否正确?能否解释下这个offset??

 4.<span style="color: rgb(255, 0, 0);">partition@0 { label = "NAND.file-system"; reg = <0x00000000 0x10000000>; }; </span> 这样分区行不行?

 

注:突然发现问题有点多,好像还有点弱弱的感觉。。。实在是汗。。。各位看着回复一点两点的就好,谢谢了。另外板子还没到,所以还没试。

Jinfang Deng:

上面的问题由于排版什么的有点问题,这里重新整理一下:

1.其中第6行中: ranges 属性第一个字段1表示csn1片选,第二个字段为固定值0,第三个字段为物理地址0x18000000,第四个字段为nand大小512MB。

不知理解是否正确,还有就是这样的写法是否正确?

2.其中第83行中:nand@1,0  子节点这样写是否正确?说明文档 ti-gpmc.txt 中有这样描述

#address-cells: Must be set to 2 to allow memory address translation

此处中address必须为2,那么片选为csn1的nand地址应该是1,0还是0,1呢?

3.第84行中:reg = <1 0 0>; /* CS1, offset 0 */   这个reg是否正确?能否解释下这个offset??

4.第117行中:partition@0 { label = "NAND.file-system"; reg = <0x00000000 0x10000000>; };    这样分区行不行?

Jinfang Deng:

好几个问题,其实最想问的就是,gpmc是否可以支持两块512MB的nand,其中csn0片选nand0,csn1片选nand1?因为看到Memory Map中GPMC的地址范围为 0x0000_0000 到 0x1FFF_FFFF 共512MB,是否说明gpmc模式下最多只能支持512MB大小?而且一个片选最多支持256MB大小?

Gary Wu:

回复 Jinfang Deng:

关于NAND FLASH的dts配置,可以参考SDK08.00/arch/arm/boot/dts下的am335x-evm.dts中的相关配置。

同时,想了解的,为什么要使用两片NAND flash?是因为容量的关系吗?

NAND flash在设计时是通过8bit或16bit连接的,并没有size的限制。所以你可以在一个片选上接一片大容量的NAND FLASH。

由于你接的是CS1,所以应该不考虑NAND FLASH启动的问题。(考虑NAND flash启动时,有其他一些注意事项)

Jinfang Deng:

回复 Gary Wu:

感谢Gary Wu的回复,刚才测试了一下csn0挂载512MB的nandflash,确实是没有问题的。

关于两片nand的问题,我也比较纠结。。。客户就非要这样搞。。。没办法啊。

发现自己脑袋有点拧巴了,越看越糊涂,因为看到TRM中描述说是片选支持最大的内存是256MB,如下图:

 

另外还看到一篇文章(http://blog.csdn.net/swallow71701/article/details/22793191)说是要把nand映射到gpmc所属的物理地址0x0000_0000~0x1FFF_FFFF范围中,cpu会通过映射的地址不同自动去使能相应片选。

所以越想越是搞不明白,也不知道是走到了什么误区了。。。还在纠结中。

Steven Liu1:

回复 Jinfang Deng:

NAND flash没有地址线,和NOR flash不一样,不能地址线寻址的,通过stream mode的方式进行通信,没有地址映射的这么概念。

你看到的这个地址映射,是针对于NOR flash这种带有地址线的设备所做出的规划。

回到NAND的容量这个话题上面来,这个容量目前我们支持到的可以支持启动的NAND大小都已经到了64Gb了(参考TRM手册的26.1.7.4NAND章节),够你用的了吧?

Jinfang Deng:

回复 Steven Liu1:

感谢Steven Liu的回复,原来是不需要映射的啊,好吧,那就根本不存在这些问题了。

另外想问个细节问题:am335x-evm.dts中nand相关如下:

这个0x08000000表示的是什么啊?如果想要在此基础上,csn1再添加一块nand,这里需要写成多少呢?

感谢回复

赞(0)
未经允许不得转载:TI中文支持网 » Devicetree nandflash 相关
分享到: 更多 (0)