基于AT91SAM9261EK的嵌入式Linux移植_基于UBI根文件系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//后面的那
个 0x7ff800 为 ubifs.img 的实际大小,十六进制的。
uboot->reset
//或是断电重上电,都可以重新运行整个系统了。
我的启动信息如下: RomBOOT
AT91Bootstrap 3.8.2 (Tue Feb 23 22:43:35 CST 2016)
NAND: ONFI not supported NAND: Manufacturer ID: 0xec Chip ID: 0xf1 WARNING: Fail to disable On-Die ECC NAND: Using Software ECC NAND: Image: Copy 0x80000 bytes from 0x40000 to 0x21f00000 NAND: Done to load image
uboot->tftp 0x22000000 ubifs.img
//0x22000000 为内
存的位置。ubifs.img 为 mkfs.ubifs 生成的,而不是 ubinize 处理
过的。
uboot->ubi create rootfs
//创建 UBI
volume
uboot->ubi write 0x22000000 rootfs 0x7ff800
三:Linux 内核的启动传递参数设置:UBI 根文件系统
#else /* CONFIG_SYS_USE_NANDFLASH */
/* bootstrap + u-boot + env + linux in nandflash */ #define CONFIG_ENV_IS_IN_NAND #define CONFIG_ENV_OFFSET 0xc0000 #define CONFIG_ENV_OFFSET_REDUND 0x100000 #define CONFIG_ENV_SIZE 0x20000 /* 1 sector = 128 kB */ #define CONFIG_BOOTCOMMAND "nand read 0x22000000 0x200000 0x300000; bootm" #define CONFIG_BOOTARGS \ "mem=64M console=ttyS0,115200 " \ "ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs init=/linuxrc " #endif
NAND: 128 MiB
*** Warning - bad CRC, using default environment
In: serial Out: serial Err: serial Net: dm9000 Hit any key to stop autoboot: 0
NAND read: device 0 offset 0x200000, size 0x300000 3145728 bytes read: OK ## Booting kernel from Legacy Image at 22000000 ...
#define MTD_ACTIVE_PART "nand0,2" #define MTDIDS_DEFAULT "nand0=nand0"
注意:新点的版本,如 Uboot 2014.04 是支持 UBI 文件系统的相关命令 的,但是,需要添加相关的宏才能打开这些命令,如上。注意 Linux 内核 NandFlahs 分区。我这里分了三个分区,2M boot 6M Kernel 余下的为: rootfs 根文件系统。
Starting kernel ...
Uncompressing Linux....................................................................................................... done, booting the kernel. Linux version 2.6.32.2 (root@zhangsz) (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29) )
制作 UBI 根文件系统,这里有时间再整理一下,因为使用的 NandFlash 不 一样(大小不一样,命令的参数不一样)。我这里的为:128MB 的 NandFlash, 制作的命令如下:
mkfs.ubifs -r rootfs -m 2048 -e 126KiB -o ubifs.img -c 800
硬件平台为:AT91sam9261EK 的开发板,不过 NandFlash 为:128MB 的,虽 然 256MB 换成 128MB 应该也没有什么大的修改,但是在文件系统移植上,问题 多出在 128MB NandFlash 上。使用 Atmel SAM-BA 2.15 下载文件系统,总是提 示挂载失败!后来转为用 Uboot tftp 下载,终于成功。
U-Boot 2014.04 (Feb 28 2016 - 15:53:00)
CPU: AT91SAM9261
Crystal frequency: 18.432 MHz
CPU clock
: 198.656 MHz
Master clock : 99.328 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Uboot 需要设置为支持 UBI 命令,方法是更改相应的开发板头文件:位置 在 include/configs/at91sam9261ek.h,不同的开发板或是自己的板子,需要 更改相应的 xxxx.h 文件。
我这里使用的是:Uboot 2014.04,修改与添加如下:
一:网络支持部分:DM9000 支持,用于 tftp,设置好后,就不用在 uboot 命令 行里设置了。
二:添加 UBI 工具命令的支持 /* * Command for UBI. */ #define CONFIG_CMD_UBI /* UBI Support */ #define CONFIG_CMD_UBIFS /* UBIFS Support */ #define CONFIG_MTD_DEVICE #define CONFIG_MTD_PARTITIONS #define CONFIG_CMD_MTDPARTS #define CONFIG_RBTREE #define CONFIG_LZO #define MTDPARTS_DEFAULT "mtdparts=nand0:2m(boot)," \ "6m(kernel)," \ "-(rootfs)"
生成:ubifs.img 文件(这个可以直接由 uboot 烧写,ubi write)。如 果想直接 nand write 烧写,还需要 ubinize 再处理一下,因为 ubinize 处理 后,烧写后总是挂载不成功,因此不走那条路,使用 uboot tftp 烧写,速度 快,方便。
烧写的步骤如下:(先全部擦除整个 NandFlash,烧写 Bootstrap 与 Uboot,烧写好 Kernel)。
/* * NAND flash */
static struct mtd_partition __initdata ek_nand_partition[] = { { .name = "boot", .offset = 0, .size = SZ_2M, },
{ .name = "kernel", .offset = 0x200000, .size = SZ_4M+SZ_2M, }, { .name = "rootfs", .offset = 0x800000, .size = MTDPART_SIZ_FULL, }, };
#define CONFIG_BOOTDELAY 2 点:2 秒。
//等待时间改为短
直接添加如下的网络参数:注意 IP 设置要与自己的 PC 主机在一个网段 #define CONFIG_ETHADDR 08:00:3e:26:0a:5b #define CONFIG_NETMASK 255.255.255.0 #define CONFIG_IPADDR 192.168.9.210 #define CONFIG_SERVERIP 192.168.9.106
uboot->mtdparts default
uboot->nand erase 0x800000 0x6400000
//格式化 roΒιβλιοθήκη Baidutfs
分区(此步骤可以不用,前面已经全部擦除过)。
uboot->ubi part rootfs
//rootfs 分
区作为 ubi 文件系统,此步骤出错,需要重新擦除整个 NandFlash
以上为 Uboot 的主要修改,我这里使用的是 NandFlash 启动,虽然 NandFlash 存放启动文件与根文件系统,不太好,但是,一般 boot kernel 文 件一旦烧写成功后,以后只是读,读 NandFlash,对 NandFlash 没有太大的影 响!!因此,在一起,更方便,省了其他的存储芯片。
Image Name: Linux-2.6.32.2 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1644632 Bytes = 1.6 MiB Load Address: 20008000 Entry Point: 20008000 Verifying Checksum ... OK Loading Kernel Image ... OK
我使用的是 Linux 2.6.32 的内核,感觉这个比较稳定一点吧,支持 UBI 文 件系统(好像 2.6.30 之后的 UBI 都支持的不错了)。修改的主要位置为: linux-2.6.32.2/arch/arm/mach-at91/board-sam9261ek.c 修改 NandFlash 分区:这个需要与 Uboot 那边的对应起来,如下:
#4 Sun Feb 28 15:50:52 CST 2016 CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177 CPU: VIVT data cache, VIVT instruction cache Machine: Atmel AT91SAM9261-EK Memory policy: ECC disabled, Data cache writeback Clocks: CPU 198 MHz, master 99 MHz, main 18.432 MHz Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256 Kernel command line: mem=64M console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs init=/linuxrc PID hash table entries: 256 (order: -2, 1024 bytes) Dentry cache hash table entries: 8192 (order: 3, 32768 bytes) Inode-cache hash table entries: 4096 (order: 2, 16384 bytes) Memory: 64MB = 64MB total Memory: 61560KB available (2840K code, 247K data, 124K init, 0K highmem) Hierarchical RCU implementation. NR_IRQS:192 AT91: 96 gpio irqs in 3 banks Console: colour dummy device 80x30 console [ttyS0] enabled
基于 AT91SAM9261EK 的嵌入式 Linux+UBI 根文件系统移植
目前较优秀的 NandFlash 文件系统为:UBI 文件系统,但是,近两周来, 移植 UBI 文件系统一直有问题,挂载总是失败!但是,经过不断的尝试与分 析,不断的更换 linux 内核,uboot 启动参数,烧写方式,终于跑起来了。