制作A20蜂鸟开发板干净系统[修复NAND驱动A]

觉得这个板子最大的优点是什么,肯定是NAND了,这样可以不运行卡上的系统,稳定性也得到很大的提升,用卡做系统就像树莓派完全胜任,价格也不高[最讨厌这样的了,把好板子价格做烂掉].

根本基本习惯,去看看dts上有没有配置,找不到NAND相关的字段,那么看看menuconfig,发现这个配置是N的,所以,要先打开之:

sunxi-nand-tristate

然后查看一下文档,可见目录在Documentation/mtd/nand下找.发现这个驱动没什么特别,那就到配置方法找,目录在Documentation/devicetree/bindings/mtd/sunxi-nand.txt.发现这个字段还是挺复杂的,如下:

Allwinner NAND Flash Controller (NFC)
Required properties:
- compatible : "allwinner,sun4i-a10-nand".
- reg : shall contain registers location and length for data and reg.
- interrupts : shall define the nand controller interrupt.
- #address-cells: shall be set to 1. Encode the nand CS.
- #size-cells : shall be set to 0.
- clocks : shall reference nand controller clocks.
- clock-names : nand controller internal clock names. Shall contain :
    * "ahb" : AHB gating clock
    * "mod" : nand controller clock
Optional children nodes:
Children nodes represent the available nand chips.
Optional properties:
- allwinner,rb : shall contain the native Ready/Busy ids.
 or
- rb-gpios : shall contain the gpios used as R/B pins.
- nand-ecc-mode : one of the supported ECC modes ("hw", "hw_syndrome", "soft",
  "soft_bch" or "none")
see Documentation/devicetree/mtd/nand.txt for generic bindings.
Examples:
nfc: nand@01c03000 {
	compatible = "allwinner,sun4i-a10-nand";
	reg = <0x01c03000 0x1000>;
	interrupts = <0 37 1>;
	clocks = <&ahb_gates 13>, <&nand_clk>;
	clock-names = "ahb", "mod";
	#address-cells = <1>;
	#size-cells = <0>;
	pinctrl-names = "default";
	pinctrl-0 = <&nand_pins_a &nand_cs0_pins_a &nand_rb0_pins_a>;
	status = "okay";
	nand@0 {
		reg = <0>;
		allwinner,rb = <0>;
		nand-ecc-mode = "soft_bch";
	};
};

可见配置一个字段,然后还要配置nand_pins_a等等,烦人啊.不过这样,就要看原理图了这个是蜂鸟开发板的:

蜂鸟开发板NAND

这个是CubieTruck的:

CubieTruck_NAND

对于CubieTruck用的是K9G8G08U0A,而蜂鸟开发板是H27UBG8T2BTR,他们不尽相同,但都是单片选单状态的.引脚上调整也是比较少的,这样估计就时序改改就好了.另外根据官方Wiki说要保持NAND可用要使用3.4内核,我是不太信的,反正试试看.不行就改驱动.

首先编辑arch/arm/boot/dts/sun7i-a20.dtsi,添加A20通用NAND驱动.

		nfc: nand @ 01c03000 {
			compatible = "allwinner,sun4i-nand";
			reg = <0x01c03000 0x1000>;
			interrupts = <0 37 4>;
			clocks = <&ahb_gates 13>, <&nand_clk>;
			clock-names = "ahb_clk", "sclk";
			#address-cells = <1>;
			#size-cells = <0>;
			status = "disabled";
		};

在同一个文件,再添加引脚绑定:

     			nand_pins_a: nand_base0 @ 0 {
     				allwinner,pins = "PC0", "PC1", "PC2",
     						"PC5", "PC8", "PC9", "PC10",
     						"PC11", "PC12", "PC13", "PC14",
     						"PC15", "PC16",
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};
     			nand_cs0_pins_a: nand_cs @ 0 {
     				allwinner,pins = "PC4";
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};
     			nand_cs1_pins_a: nand_cs @ 1 {
     				allwinner,pins = "PC3";
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};
     			nand_cs2_pins_a: nand_cs @ 2 {
     				allwinner,pins = "PC17";
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};
     			nand_cs3_pins_a: nand_cs @ 3 {
     				allwinner,pins = "PC18";
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};
     			nand_cs4_pins_a: nand_cs @ 4 {
     				allwinner,pins = "PC19";
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};
     			nand_cs5_pins_a: nand_cs @ 5 {
     				allwinner,pins = "PC20";
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};
     			nand_cs6_pins_a: nand_cs @ 6 {
     				allwinner,pins = "PC21";
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};
     			nand_cs7_pins_a: nand_cs @ 7 {
     				allwinner,pins = "PC22";
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};
     			nand_rb0_pins_a: nand_rb @ 0 {
     				allwinner,pins = "PC6";
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};
     			nand_rb1_pins_a: nand_rb @ 1 {
     				allwinner,pins = "PC7";
     				allwinner,function = "nand0";
     				allwinner,drive = <0>;
     				allwinner,pull = <0>;
     			};

然后到设备相关的文件处,arch/arm/boot/dts/sun7i-a20-hummingbird.dts添加驱动绑定:

		nfc: nand @ 01c03000 {
			pinctrl-names = "default";
			pinctrl-0 = <&nand_pins_a &nand_cs0_pins_a &nand_rb0_pins_a>;
			status = "okay";
			nand at 0 {
				#address-cells = <2>;
				#size-cells = <2>;
				reg = <0>;
				allwinner,rb = <0>;
				nand-ecc-mode = "hw";
				onfi,nand-timing-mode = <0x1f>;
				nand-ecc-strength = <40>;
				nand-ecc-step-size = <1024>;
			};
		};

然后编译,替换uImage[打开NAND],还有dtb文件,发现什么反应都没有:

root@Tater-ARM:~# dmesg | grep mtd
root@Tater-ARM:~# dmesg | grep nand
root@Tater-ARM:~#

的确让人很无语,为什么按照文档就不行,无奈只有查sunxi_nand.c驱动,发现1411 – 1414行定义如下:

sunxi-nand_ids

难怪不行,原来名字改了,是sun4i-a10-nand不是sun4i-nand,编译并替换重启,看到如下信息:

[    0.909397] sunxi_nand 1c03000.nand: failed to retrieve mod clk
[    0.915422] sunxi_nand: probe of 1c03000.nand failed with error -2

总算有设备,只是出错罢了,好像是无法检查到MOD Clk,究竟MOD Clk是什么呢?出错代码位置:

        nfc->mod_clk = devm_clk_get(dev, "mod");
        if (IS_ERR(nfc->mod_clk)) {
                dev_err(dev, "failed to retrieve mod clk
");
                ret = PTR_ERR(nfc->mod_clk);
                goto out_ahb_clk_unprepare;
        }

现在看来是时钟问题,这个留给下回分解吧.

发表评论

电子邮件地址不会被公开。 必填项已用*标注