zynq100 linux移植,Linux3.6.7在OK6410平台的移植(四)搭建YAFFS2根文件系统

1. 内核加入YAFFS2文件系统,编译

2. make menuconfig 配置如下:

2.1Device Drivers配置

2.1.1. Generic Driver Options选择

[*] Maintain a devtmpfs filesystem to mount at /dev

[*] Automount devtmpfs at /dev, after the kernel mounted the ....

2.1.2 MTD-->Caching block device access to MTD devices

2.2File Systems 配置

取消 Second extended fs support 和 Ext3 journalling file system support

[*] Miscellaneous filesystems --->选择

2.3 Boot options配置

输入"noinitrd root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200"

3.制作mkyaffs2image工具

进入yaffs2源码目录下utils目录,修改mkyaff2image.c:

#define chunkSize 2048

#define spareSize 64

#define pagesPerBlock 64

改为

#define chunkSize 4096

#define spareSize 218

#define pagesPerBlock 128

进入yaffs2源码目录下direct目录,修改yportenv.h

增加#define CONFIG_YAFFS_DEFINES_TYPES

保存后make,这时就在utils目录生产mkyaffs2image文件,把这个文件拷贝到/usr/bin目录下

4.制作根文件系统

下面写的过程大部分是参考这篇文章:http://blog.csdn.net/longtian635241/article/details/8036099

4.1解压busybox1.20.2,修改Makefile

CROSS_COMPILE ?=/usr/local/arm/4.5.1/bin/arm-linux-

ARCH ?= arm

4.2配置busybox菜单如下:

a、make defconfig(默认配置)

b、make menuconfig

Busybox Settings --->Build Options --->(/usr/local/arm/4.5.1/bin/arm-linux-) Cross Compiler prefix

Busybox Settings --->General Configuration --->[*] Don't use /usr

4.3  编译、安装

a、make

b、make install(由于前面没设置安装位置将默认安装在本文件夹的_install文件夹下)

4.4 进入_install建立其他根文件系统文件夹.我写了个脚本creat_initramfs.sh

#!/bin/sh

echo "--------Create root,dev......"

mkdir root dev etc bin sbin mnt sys proc lib home tmp var usr

mkdir usr/sbin usr/bin usr/lib usr/modules usr/etc

mkdir mnt/usb mnt/nfs mnt/etc mnt/etc/init.d

mkdir lib/modules

chmod 1777 tmp

sudo mknod -m 600 dev/console c 5 1

sudo mknod -m 666 dev/null c 1 3

echo "-------make direction done---------"

然后保存脚本修改权限:chmod +x creat_initramfs.sh

运行脚本!

4.5建立相关文件

4.5.1在 etc目录下创建profile文件,内容如下

# Ash profile

# vim: syntax=sh

# No core files by default

ulimit -S -c 0 > /dev/null 2>&1

USER="`id -un`"

LOGNAME=$USER

PS1='[\u@\h \W]\# '

PATH=$PATH

HOSTNAME=`/bin/hostname`

export USER LOGNAME PS1 PATH

4.5.2在 etc目录下创建init.d文件夹,进入这个文件夹创建rcS文件,内容如下

#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:

runlevel=S

prevlevel=N

umask 022

export PATH runlevel prevlevel

#

# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.

#

trap ":" INT QUIT TSTP

/bin/hostname hcm

/bin/mount -n -t proc none /proc

/bin/mount -n -t sysfs none /sys

/bin/mount -n -t usbfs none /proc/bus/usb

/bin/mount -t ramfs none /dev

echo /sbin/mdev > /proc/sys/kernel/hotplug

/sbin/mdev -s

/bin/hotplug

# mounting file system specified in /etc/fstab

mkdir -p /dev/pts

mkdir -p /dev/shm

/bin/mount -n -t devpts none /dev/pts -o mode=0622

/bin/mount -n -t tmpfs tmpfs /dev/shm

/bin/mount -n -t ramfs none /tmp

/bin/mount -n -t ramfs none /var

mkdir -p /var/empty

mkdir -p /var/log

mkdir -p /var/lock

mkdir -p /var/run

mkdir -p /var/tmp

/sbin/hwclock -s -f /dev/rtc

syslogd

/etc/rc.d/init.d/netd start

echo " " > /dev/tty1

echo "Starting networking..." > /dev/tty1

#sleep 1

#/etc/rc.d/init.d/httpd start

#echo " " > /dev/tty1

#echo "Starting web server..." > /dev/tty1

#sleep 1

#/etc/rc.d/init.d/leds start

#echo " " > /dev/tty1

#echo "Starting leds service..." > /dev/tty1

#echo " "

#sleep 1

echo "*************************************"

echo " Welcome to Root FileSystem! "

echo " "

echo " http://write.blog.csdn.net/postlist "

echo "*************************************"

mkdir /mnt/disk

mount -t yaffs2 /dev/mtdblock3 /mnt/disk

mount -t vfat /dev/mmcblk0p1 /home/

mount -t yaffs2 /dev/mtdblock3 /mnt/

cd /mnt/

tar zxvf /home/urbetter-rootfs-qt-2.2.0.tgz

sync

cd /

umount /mnt/

umount /home/

/sbin/ifconfig lo 127.0.0.1

chmod +x etc/init.d/ifconfig-eth0

/etc/init.d/ifconfig-eth0

/bin/qtopia &

echo " " > /dev/tty1

echo "Starting Qtopia, please waiting..." > /dev/tty1

echo " "

echo "Starting Qtopia, please waiting..."

注意修改这个文件权限:chmod +x /etc/init.d/rcS

4.5.3在 etc目录下创建fstab文件,内容如下

proc /proc proc defaults 0 0

none /tmp ramfs defaults 0 0

none /var ramfs defaults 0 0

mdev /dev ramfs defaults 0 0

sysfs /sys sysfs defaults 0 0

4.5.4在 etc目录下创建inittab文件,内容如下/

::sysinit:/etc/init.d/rcS

::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount -a -r

::shutdown:/bin umount -a -r

::shutdown:/sbin/swapoff -a

4.5.5 在usr/etc/目录下创建init文件,内容如下

#!/bin/sh

ifconfig eth0 192.168.3.111 up

ifconfig lo 127.0.0.1

注意修改权限:chmod +x usr/etc/init

4.5.6创建 mdev.conf(空文件)

4.6 拷贝相应工具链中的库文件到lib当中

hcm@hcm-desktop:~/hcm/busybox-1.20.2/_install$ cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/*so* lib

5. 用mkyaffs2image工具制作根文件系统

root@ubuntu:/home/my/busybox-1.20.2# mkyaffs2image _install rootfs.yaffs

这样就做好了根文件系统。

6.u-boot 2012.10修改yaffs2下载。

经过试验,尽管前面已经做好了u-boot.bin 、uImage和rootfs.yaffs,但烧写进入后从NAND启动结果最后都会出现这个:

VFS: Mounted root (yaffs2 filesystem) on device 31:2.

devtmpfs: error mounting -2

Freeing init memory: 92K

Failed to execute /linuxrc. Attempting defaults...

Kernel panic - not syncing: No init found. Try passing init= option to kernel.

这个是反复比较后确定是u-boot 2012.10写yaffs时出了错,估计是个bug吧。

主要在这里:u-boot 2012.10源码中nand_util.c文件有个nand_write_skip_bad()函数,错误在这个地方

need_skip = check_skip_len(nand, offset, *length);

if (need_skip < 0) {

printf ("Attempt to write outside the flash area\n");

*length = 0;

return -EINVAL;

}

if (!need_skip && !(flags & WITH_DROP_FFS))

{

/*zxd bug do not call 'nand_write' below when we use write.yaffs option*/

if(flags & WITH_YAFFS_OOB)

{

printf ("NAND write to offset= %llx \n",offset);

}

else

{

rval = nand_write (nand, offset, length, buffer);

if (rval == 0)

return 0;

*length = 0;

printf ("NAND write to offset %llx failed %d\n",

offset, rval);

return rval;

}

}

红色部分是我后面加上去的。修改后把这三个文件写到NAND中,启动后运行如下:

## Booting kernel from Legacy Image at 50008000 ...

Image Name: Linux-3.6.7

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 1410288 Bytes = 1.3 MiB

Load Address: 50008000

Entry Point: 50008040

Verifying Checksum ... OK

XIP Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Booting Linux on physical CPU 0

Linux version 3.6.7 (root@ubuntu) (gcc version 4.5.1 (ctng-1.8.1-FA) ) #17 Mon Dec 3 00:30:47 CST 2012

CPU: ARMv6-compatible processor [410fb766] revision 6 (ARMv7), cr=00c5387d

CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache

Machine: OK6410

Memory policy: ECC disabled, Data cache writeback

CPU S3C6410 (id 0x36410101)

S3C24XX Clocks, Copyright 2004 Simtec Electronics

camera: no parent clock specified

S3C64XX: PLL settings, A=533000000, M=533000000, E=24000000

S3C64XX: HCLK2=266500000, HCLK=133250000, PCLK=66625000

mout_apll: source is fout_apll (1), rate is 533000000

mout_epll: source is epll (1), rate is 24000000

mout_mpll: source is mpll (1), rate is 533000000

usb-bus-host: source is clk_48m (0), rate is 48000000

audio-bus: source is mout_epll (0), rate is 24000000

audio-bus: source is mout_epll (0), rate is 24000000

audio-bus: source is mout_epll (0), rate is 24000000

irda-bus: source is mout_epll (0), rate is 24000000

camera: no parent clock specified

CPU: found DTCM0 8k @ 00000000, not enabled

CPU: moved DTCM0 8k to fffe8000, enabled

CPU: found DTCM1 8k @ 00000000, not enabled

CPU: moved DTCM1 8k to fffea000, enabled

CPU: found ITCM0 8k @ 00000000, not enabled

CPU: moved ITCM0 8k to fffe0000, enabled

CPU: found ITCM1 8k @ 00000000, not enabled

CPU: moved ITCM1 8k to fffe2000, enabled

Built 1 zonelists in Zone order, mobility grouping on. Total pages: 65024

Kernel command line: noinitrd root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200

PID hash table entries: 1024 (order: 0, 4096 bytes)

Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)

Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)

Memory: 256MB = 256MB total

Memory: 256892k/256892k available, 5252k reserved, 0K highmem

Virtual kernel memory layout:

vector : 0xffff0000 - 0xffff1000 ( 4 kB)

DTCM : 0xfffe8000 - 0xfffec000 ( 16 kB)

ITCM : 0xfffe0000 - 0xfffe4000 ( 16 kB)

fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)

vmalloc : 0xd0800000 - 0xff000000 ( 744 MB)

lowmem : 0xc0000000 - 0xd0000000 ( 256 MB)

modules : 0xbf000000 - 0xc0000000 ( 16 MB)

.text : 0xc0008000 - 0xc02671f4 (2429 kB)

.init : 0xc0268000 - 0xc027f0cc ( 93 kB)

.data : 0xc0280000 - 0xc02ac780 ( 178 kB)

.bss : 0xc02ad024 - 0xc02de0cc ( 197 kB)

NR_IRQS:246

VIC @f6000000: id 0x00041192, vendor 0x41

VIC @f6010000: id 0x00041192, vendor 0x41

sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 4294967286ms

Console: colour dummy device 80x30

Calibrating delay loop... 353.89 BogoMIPS (lpj=1769472)

pid_max: default: 32768 minimum: 301

Mount-cache hash table entries: 512

CPU: Testing write buffer coherency: ok

Setting up static identity map for 0x501c7130 - 0x501c718c

devtmpfs: initialized

DMA: preallocated 256 KiB pool for atomic coherent allocations

OK6410: Option string ok6410=0

OK6410: selected LCD display is 480x272

s3c64xx_dma_init: Registering DMA channels

PL080: IRQ 73, at d0846000, channels 0..8

PL080: IRQ 74, at d0848000, channels 8..16

S3C6410: Initialising architecture

bio: create slab at 0

usbcore: registered new interface driver usbfs

usbcore: registered new interface driver hub

usbcore: registered new device driver usb

ROMFS MTD (C) 2007 Red Hat, Inc.

io scheduler noop registered

io scheduler deadline registered

io scheduler cfq registered (default)

start plist test

end plist test

s3c-fb s3c-fb: window 0: fb

Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled

s3c6400-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 69) is a S3C6400/10

console [ttySAC0] enabled

s3c6400-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 70) is a S3C6400/10

s3c6400-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 71) is a S3C6400/10

s3c6400-uart.3: ttySAC3 at MMIO 0x7f005c00 (irq = 72) is a S3C6400/10

brd: module loaded

loop: module loaded

S3C NAND Driver, (c) 2008 Samsung Electronics

NandFlash is busying.........

forlinx nandflash dev_id=d5

forlinx****Nandflash:ChipType= MLC ChipName=samsung-K9GAG08U0D************

S3C NAND Driver is using hardware ECC.

NAND device: Manufacturer ID: 0xec, Chip ID: 0xd5 (Samsung NAND 2GiB 3,3V 8-bit), page size: 4096, OOB size: 218

Driver must set ecc.strength when using hardware ECC

Creating 4 MTD partitions on "NAND 2GiB 3,3V 8-bit":

0x000000000000-0x000000200000 : "Bootloader"

0x000000200000-0x000000700000 : "Kernel"

0x000000700000-0x00000cf00000 : "File System"

0x00000cf00000-0x000080000000 : "User"

ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver

s3c2410-ohci s3c2410-ohci: S3C24XX OHCI

s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1

s3c2410-ohci s3c2410-ohci: irq 79, io mem 0x74300000

s3c2410-ohci s3c2410-ohci: init err (00000000 0000)

s3c2410-ohci s3c2410-ohci: can't start s3c24xx

s3c2410-ohci s3c2410-ohci: startup error -75

s3c2410-ohci s3c2410-ohci: USB bus 1 deregistered

s3c2410-ohci: probe of s3c2410-ohci failed with error -75

mousedev: PS/2 mouse device common for all mice

i2c /dev entries driver

sdhci: Secure Digital Host Controller Interface driver

sdhci: Copyright(c) Pierre Ossman

s3c-sdhci s3c-sdhci.0: clock source 0: mmc_busclk.0 (133250000 Hz)

s3c-sdhci s3c-sdhci.0: clock source 2: mmc_busclk.2 (24000000 Hz)

mmc0: SDHCI controller on samsung-hsmmc [s3c-sdhci.0] using ADMA

s3c-sdhci s3c-sdhci.1: clock source 0: mmc_busclk.0 (133250000 Hz)

s3c-sdhci s3c-sdhci.1: clock source 2: mmc_busclk.2 (24000000 Hz)

mmc0: mmc_rescan_try_freq: trying to init card at 400000 Hz

mmc0: mmc_rescan_try_freq: trying to init card at 300000 Hz

mmc1: SDHCI controller on samsung-hsmmc [s3c-sdhci.1] using ADMA

mmc0: mmc_rescan_try_freq: trying to init card at 200000 Hz

usbcore: registered new interface driver usbhid

usbhid: USB HID core driver

VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5

drivers/rtc/hctosys.c: unable to open rtc device (rtc0)

yaffs: dev is 32505858 name is "mtdblock2" rw

yaffs: passed flags ""

mmc0: mmc_rescan_try_freq: trying to init card at 100000 Hz

mmc1: mmc_rescan_try_freq: trying to init card at 400000 Hz

mmc1: mmc_rescan_try_freq: trying to init card at 300000 Hz

VFS: Mounted root (yaffs2 filesystem) on device 31:2.

devtmpfs: mounted the root filesystem.

Freeing init memory: 92K

mmc1: mmc_rescan_try_freq: trying to init card at 200000 Hz

mmc1: mmc_rescan_try_freq: trying to init card at 100000 Hz

mount: mounting none on /proc/bus/usb failed: No such file or directory

/etc/init.d/rcS: line 21: /bin/hotplug: not found

hwclock: can't open '/dev/rtc': No such file or directory

/etc/init.d/rcS: line 38: /etc/rc.d/init.d/netd: not found

*************************************

Welcome to Root FileSystem!

http://write.blog.csdn.net/postlist

*************************************

yaffs: dev is 32505859 name is "mtdblock3" rw

yaffs: passed flags ""

mount: mounting /dev/mmcblk0p1 on /home/ failed: No such device

tar: can't open '/home/urbetter-rootfs-qt-2.2.0.tgz': No such file or directory

umount: can't umount /home/: Invalid argument

ifconfig: socket: Function not implemented

chmod: etc/init.d/ifconfig-eth0: No such file or directory

/etc/init.d/rcS: line 74: /etc/init.d/ifconfig-eth0: not found

Starting Qtopia, please waiting...

/etc/init.d/rcS: line 76: /bin/qtopia: not found

Please press Enter to activate this console.

[root@hcm /]# ls

[1;34mbin[0m [1;32mfs.sh[0m [1;36mlinuxrc[0m [1;34mmnt[0m [1;34msbin[0m [1;34musr[0m

[1;34mdev[0m [1;34mhome[0m [1;34mlost+found[0m [1;34mproc[0m [1;34msys[0m [1;34mvar[0m

[1;34metc[0m [1;34mlib[0m [0;0mmdev.conf[0m [1;34mroot[0m [1;34mtmp[0m

[root@hcm /]#

终于看到梦想中的shell界面啦!~~

文件下载地址:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值