Nand 调试成功了。
具体修改下面描述:
根据原理图发现 AM335X 目前默认是 SD 卡启动,所以需要配置一下 SYSBOOT 从NAND启动,官方文档:
http://processors.wiki.ti.com/index.php/AM335x_U-Boot_User%27s_Guide
这里对 SYSBOOT 的配置有详细的介绍,结合 AM335X Technical Reference.pdf 和 原理图找到对应的 电阻,修改掉就可以从 NAND 启动了。
根据 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
这里描述了几个可能的错误。其中命令的各个命令参数代表的意义都有说明,注意一下就行。
我遇到的错误就比如:
注意给KERNEL 的参数 ubi.mtd=9, 表示 mtd9 号,对应的就是 File-system 分区,默认是 ubi.mtd=NAND.rootfs。改一下
后来找到了一个快速调试Nand的方法:
首先SD卡启动,这个更换 uboot ,kernel ,文件系统都非常方便,从SD卡的启动Uboot之后。烧写 NAND, 弄完了,直接在uboot中敲打命令:run nandboot. 而不需要担心Nand烧坏了,焊接那么麻烦。