各位好,现在想要在原有板子基础上增加一片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,这里需要写成多少呢?
感谢回复