AM335X Nand Flash 启动调试

Nand 调试成功了。

具体修改下面描述:

  1. 硬件修改:

根据原理图发现 AM335X 目前默认是 SD 卡启动,所以需要配置一下 SYSBOOT 从NAND启动,官方文档:
 http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User%27s_Guide
这里对 SYSBOOT 的配置有详细的介绍,结合 AM335X Technical Reference.pdf 和 原理图找到对应的 电阻,修改掉就可以从 NAND 启动了。

  1. Uboot 配置:

根据  http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User%27s_Guide 文档中介绍的 Nand Flash 的 NAND Layout,描述 UBOOT , KERNEL , ROOTFS ,MLO ,DT(device tree)的空间分布,烧写到对应的 NAND Flash上。

但这份文档比较老(基于 SDK 6.0),我们使用的是 SDK 8.0,所以需要根据 am335x-evm.h 中的 NAND Layout 来烧写:
在Uboot中敲打两条命令:

U-Boot# mtdparts default
U-Boot# mtdparts 

device nand0 , # parts = 10
 #: name		size		offset		mask_flags
 0: NAND.SPL            0x00020000	0x00000000	0
 1: NAND.SPL.backup1    0x00020000	0x00020000	0
 2: NAND.SPL.backup2    0x00020000	0x00040000	0
 3: NAND.SPL.backup3    0x00020000	0x00060000	0
 4: NAND.u-boot-spl-os  0x00040000	0x00080000	0
 5: NAND.u-boot         0x00100000	0x000c0000	0
 6: NAND.u-boot-env     0x00020000	0x001c0000	0
 7: NAND.u-boot-env.backup10x00020000	0x001e0000	0
 8: NAND.kernel         0x00800000	0x00200000	0
 9: NAND.file-system    0x0f600000	0x00a00000	0

active partition: nand0,0 - (NAND.SPL) 0x00020000 @ 0x00000000

defaults:
mtdids  : nand0=nand.0
mtdparts: mtdparts=nand.0:128k(NAND.SPL),128k(NAND.SPL.backup1),128k(NAND.SPL.backup2),128k(NAND.SPL.backup3),256k(NAND.u-boot-spl-os),1m(NAND.u-boot),128k(NAND.u-boot-env),128k(NAND.u-boot-env.backup1),8m(NAND.kernel),-(NAND.file-system)
U-Boot# 

可以查看NAND 的 Layout。一共分了10个区,描述见上面。

Nand 的 Pinmux 也是必须要配置的:
在 mux.c 中 配置:

                else if (board_is_evm_sk(header)) {
		/* Starter Kit EVM */
		puts("Starter Kit EVM\n");
		enable_uart0_pin_mux();
		enable_uart1_pin_mux();
		configure_module_pin_mux(i2c1_pin_mux);
		configure_module_pin_mux(gpio0_7_pin_mux);
		configure_module_pin_mux(rgmii1_pin_mux);
		configure_module_pin_mux(mmc0_pin_mux_sk_evm);
		configure_module_pin_mux(nand_pin_mux);
	} 

依然使用了官方的 Kernel(在SDK中携带的),而非自己编译的,理由是还没确定原因是什么,自己编译的KERNEL 认不到 USB 。

此时 Uboot 能够正常引导 Kernel,但是Uboot 无法支持/操作 UBIFS(不是必须)。

还需要在 am335x-evm.h 中配置:
 http://www.deyisupport.com/cfs-file.ashx/__key/telligent-evolution-components-attachments/00-25-00-00-00-05-99-21/Ubifs_8765F64EFB7CDF7E847636525C4F8C542F54A852_.pdf
根据文档中描述,需要配置下面几个宏(可有可无,在Uboot使用 ubi write 会导致 Kernel无法正常挂载文件系统,没有细究原因,直接使用 nand write即可):

#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_UBI
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS
#define CONFIG_LZO			/* needed for UBI */
#define CONFIG_RBTREE			/* needed for UBI */
#define CONFIG_FIT

此时能够支持Uboot中的所有 UBI 操作,但意义不大,此项可有可无。

ECC 配置:
AM335X 支持 硬件 ECC : BCH8 ,需要在 am335x-evm.h 中配置(默认应该打开了):

#define CONFIG_NAND_OMAP_ECCSCHEME	OMAP_ECC_BCH8_CODE_HW

Device Tree配置:
因为 AM335X 支持NAND Flash 的硬件 bch ECC , 所以需要配置Device Tree,让Kernel能够正常的认到 ECC 固件,并对其进行操作/利用其校验。
am335x-evmsk.dts: 在对应的地方加入以下配置(附件会携带 devicetree)

ocp {

  gpmc: gpmc@50000000 {
      status = "okay";
      pinctrl-names = "default";
      pinctrl-0 = <&nandflash_pins_s0>;
      ranges = <0 0 0x08000000 0x10000000>; /* CS0: NAND */
      nand@0,0 {
          reg = <0 0 0>; /* CS0, offset 0 */
          nand-bus-width = <8>;
          ti,nand-ecc-opt = "bch8";
          gpmc,device-nand = "true";
          gpmc,device-width = <1>;
          gpmc,sync-clk-ps = <0>;
          gpmc,cs-on-ns = <0>;
          gpmc,cs-rd-off-ns = <30>;
          gpmc,cs-wr-off-ns = <30>;
          gpmc,adv-on-ns = <0>;
          gpmc,adv-rd-off-ns = <30>;
          gpmc,adv-wr-off-ns = <30>;
          gpmc,we-on-ns = <0>;
          gpmc,we-off-ns = <20>;
          gpmc,oe-on-ns = <10>;
          gpmc,oe-off-ns = <30>;
          gpmc,access-ns = <30>;
          gpmc,rd-cycle-ns = <30>;
          gpmc,wr-cycle-ns = <30>;
          gpmc,wait-on-read = "true";
          gpmc,wait-on-write = "true";
          gpmc,bus-turnaround-ns = <0>;
          gpmc,cycle2cycle-delay-ns = <50>;
          gpmc,clk-activation-ns = <0>;
          gpmc,wait-monitoring-ns = <0>;
          gpmc,wr-access-ns = <30>;
          gpmc,wr-data-mux-bus-ns = <0>;

          #address-cells = <1>;
          #size-cells = <1>;
          elm_id = <&elm>;

          /* MTD partition table */
          partition@0 {
            label = "SPL";
            reg = <0x00000000 0x000020000>;
          };

          partition@1 {
            label = "SPL_backup1";
            reg = <0x00020000 0x00020000>;
          };

          partition@2 {
            label = "SPL_backup2";
            reg = <0x00040000 0x00020000>;
          };

          partition@3 {
            label = "SPL_backup3";
            reg = <0x00060000 0x00020000>;
          };
          partition@4 {
            label = "dtb";
            reg = <0x00080000 0x00040000>;
          };

          partition@5 {
            label = "U-boot";
            reg = <0x000c0000 0x00100000>;
          };

          partition@6 {
            label = "env";
            reg = <0x001c0000 0x00020000>;
          };
          partition@7 {
            label = "env_backup1";
            reg = <0x001e0000 0x00020000>;
          };

          partition@8 {
            label = "Kernel";
            reg = <0x00200000 0x00800000>;
          };

          partition@9 {
            label = "File-System";
            reg = <0x00a00000 0x0f600000>;
          };
        };
    };
};

*
*
*
*

&elm {
     status = "okay";
};

这三行必须加上,因为根据官方文档,elm 默认是 disable的,需要确认打开。
&elm {

status = "okay";

};
官方文档:
 http://processors.wiki.ti.com/index.php/Linux_Core_NAND_User%27s_Guide
其中对 elm 的描述值得仔细看看。

文件系统制作:
 http://www.deyisupport.com/cfs-file.ashx/__key/telligent-evolution-components-attachments/00-25-00-00-00-05-99-21/Ubifs_8765F64EFB7CDF7E847636525C4F8C542F54A852_.pdf
官方文档需要用到 mtd util ,mtd util 如果要编译成功,需要下载一些依赖库进行编译,有些麻烦,如果用的是 Fedora,直接用yum 安装就行了,我的做法和官方文档不太一样,但能够正常工作和节省时间:
下载代码:
git clone  git://git.infradead.org/mtd-utils.git

yum install liblzo2-devel
yum install libzlib-devel
yum install libuuid-devel

编译:
WITHOUT_XATTR=1 make

宗旨是缺什么安装什么。

文件系统制作:

mkfs.ubifs -F -q -r ./filesystem/ -m 2048 -e 126976 -c 2047 -o ubifs.img
ubinize -v -o root.ubi -m 2048 -p 128KiB -s 2048 ./ubifs

注意几个点:
 http://www.360doc.com/content/14/1018/14/18578054_417913216.shtml
这里描述了几个可能的错误。其中命令的各个命令参数代表的意义都有说明,注意一下就行。

我遇到的错误就比如:

  1. mkfs.ubifs -e 126976 ,这样的算法:-e:LEB size,对于 AM335x 的 NAND driver,为 block size-2x(page size),如果这里算错,会有Kernel Panic.
  2. ubinize 中的 -s 选项,需要和 Uboot 给 KERNEL 的启动参数一致: nandroot=ubi0:rootfs rw ubi.mtd=9,2048,最后一个参数是 2048 , 所以需要匹配上。

注意给KERNEL 的参数 ubi.mtd=9, 表示 mtd9 号,对应的就是 File-system 分区,默认是 ubi.mtd=NAND.rootfs。改一下


后来找到了一个快速调试Nand的方法:
首先SD卡启动,这个更换 uboot ,kernel ,文件系统都非常方便,从SD卡的启动Uboot之后。烧写 NAND, 弄完了,直接在uboot中敲打命令:run nandboot. 而不需要担心Nand烧坏了,焊接那么麻烦。

你可能感兴趣的:(Linux,C/C++)