分类: LINUX
2010-04-16 14:02:00
飞凌OK-2440-III文件系统移植-------busybox+mdev
编译busybox的组合:
busybox-
busybox-1.1.3 arm-linux-gcc-3.3.2
buxybox-1.7.3 arm-linux-gcc-3.4.1
目标板:飞凌OK-2440-III
编译平台:redhat9
一、配置安装busybox
交叉编译工具:arm-linux-gcc-
Busybox-
Gcc-
配置busybox:
#make menuconfig
Busybox Settings >
General Configuration >
[*] Support for devfs
Init Utilities >
[*] init
[*] Support reading an inittab file /* init读取/etc/inittab配置文件,不知道怎么回事,这个和他的意思是反的,选上之后反倒不支持inittab文件了,不选才支持,你可以自己试试。 */
[*] Be _extra_ quiet on boot
[*] Support running init from within an initrd (not initramfs)
[*] poweroff, halt, and reboot
[*] mesg
Shells >
Choose your default shell (ash) >
/* (X) ash 选中ash,这样生成的时候才会生成bin/sh文件
* 看看我们前头的linuxrc脚本的头一句:
* #!/bin/sh 是由bin/sh来解释执行的
*/ (我开始就因为在这里没选上,结果就造成启动不起来 )
[*] ash
添加历史记录、自动补全、删除字符的功能:
Shells --->
--- Bourne Shell Options
[ ] Hide message on interactive shell startup
[ ] Standalone shell
[*] command line editing
[*] vi-style line editing commands
(15) history size
[*] history saving
[*] tab completion
[*] username completion
[ ] Fancy shell prompts
Coreutils >
[*] cp
[*] cat
[*] ls ls里关于颜色的一定不能选,不然在DNW里打开了是乱码
[*] mkdir
[*] echo (basic SuSv3 version taking no options)
[*] env
[*] mv
[*] pwd
[*] rm
[*] touch
Miscellaneous Utilities --->
[] taskset要去掉
Editors >
[*] vi
Linux System Utilities >
[*] mount
[*] umount
[*] Support loopback mounts
[*] Support for the old /etc/mtab file
Linux Module Utilities --->
[*] insmod
[*] rmmod
[*] lsmod
[*] lsmod pretty output for 2.6.x Linux kernels
[*] modprobe
[*] Multiple options parsing
--- Options common to multiple modutils
[*] Support tainted module checking with new kernels
[ ] Support version 2.2.x to 2.4.x Linux kernels //此项一定不要选!!!
[*] Support version 2.6.x Linux kernels
Networking Utilities >
[*] ifconfig
[*] ping
Archival Utilities --->
[*] tar
[*] Enable archive creation (NEW)
[*] Enable -j option to handle .tar.bz2 files
Linux Module Utilities --->
[]Support version 2.2.x to 2.4.x Linux kernels 要去掉
保存之后,执行:make ARCH=arm CROSS_COMPILE=/usr/local/arm/
如果编译通过,执行make install安装,安装完成之后在busybox-
2、创建根文件系统目录
要创建的目录有:bin sbin dev etc lib home root usr var proc mnt tmp sys
可以先创建一个目录比如/home/ok2440,然后cd /home/ok2440 执行:mkdir bin sbin dev etc lib home root usr var proc mnt tmp sys命令,目录创建好之后把busybox生成的_install目录里那些都复制过来。。。。。。
。。。。。。开始创建文件。。。。。。。。
我们在etc下面要写两个文件fstab inittab 和一个文件夹init.d
(a) fstab的内容是:
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
(b) fstab文件的作用
文 件/etc/fstab存放的是系统中的文件系统信息。当正确的设置了该文件,则可以通过"mount /directoryname"命令来加载一个文 件系统,每种文件系统都对应一个独立的行,每行中的字段都有空格或tab键分开。同时fsck、mount、umount的等命令都利用该程序。
inittab的内容是:
#/etc/inittab
::sysinit:/etc/init.d/rcS
s
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
(c) init.d\rcS文件的内容:
#!/bin/sh
ifconfig eth0 192.168.1.17
mount -t tmpfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mount -t sysfs sysfs /sys
mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev –s
echo gugugu9999
(d)记的要将rcS文件的属性改成可执行的,这一步很重要,必须改。
改变其属性:chmod 775 etc/init.d/rcS
(e)我在配置busybox的时候用的是动态库,所以要把/usr/local/arm/
或者cp ld* /s3c2410/root/lib
cp *.so* /s
cp libcrypt* /s
(f)在/filesystem_install/dev下建立设备节点:
Console null
。。。。。。。。其他的不用建,因为使用了mdev,会在/dev目录下生成所有的设备。。。。。。。。。。
另外, mdev需要改写/dev和/sys两个目录。所以必须保证这两个目录是可写的(一般会用到sysfs,tmpfs。所以要重新编译内核)。
linux-
File systems --->
Pseudo filesystems --->
sysfs file system support 选上
Virtual memory file system support (former shm fs) 选上
Tmpfs POSIX Access Control Lists 选上
用这样的命令建立:
sudo mknod console c 5 1
sudo mknod null c 1 3
。。。。。。。必要的文件都建立好了。。需要说明的是,想制作yaffs或yaffs2的文件系统,必须要有相应的编译工具,光盘里有个mkyaffs2image,将它复制到虚拟机linux的/bin目录下就可以了,或者自己制作它,下面说说制作步骤(使用光盘提供的mkyaffs2image的话可以直接跳过去):
三.修改制作yaffs映象文件的工具
在 yaffs 源码中有个 utils 目录,里面是工具 mkyaffsimage 和 mkyaffs2image的源代码,前者用来制作 yaffs1 映象文件,后者用来制作 yaffs2 映象文件。目前 mkyaffsimage 工具只能生成老格式的yaffs1 映象文件,需要修改才能支持新格式。
(1)下载的yaffs2解压出来是这样的一个目录/Development下面有两个文件夹:yaffs yaffs2,我们需要进入yaffs2,然后再进入utils,这个下面有3个文件,我们需要加两个文件,nand-ecc.c yaffs_packedtags1.c ,yaffs_packedtags1.c这个文件是从上一节目录拷贝过来的,nand-ecc.c的原码如下:
#include
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
static const u_char nand_ecc_precalc_table[] = {
0x00, 0x55, 0x56, 0x03, 0x59, 0x
0x65, 0x30, 0x33, 0x66, 0x
0x66, 0x33, 0x30, 0x65, 0x
0x03, 0x56, 0x55, 0x00, 0x
0x69, 0x
0x
0x
0x
0x
0x
0x
0x69, 0x
0x03, 0x56, 0x55, 0x00, 0x
0x66, 0x33, 0x30, 0x65, 0x
0x65, 0x30, 0x33, 0x66, 0x
0x00, 0x55, 0x56, 0x03, 0x59, 0x
};
int nand_calculate_ecc(const u_char *dat, u_char *ecc_code)
{
uint8_t idx, reg1, reg2, reg3, tmp1, tmp2;
int i;
reg1 = reg2 = reg3 = 0;
for(i = 0; i < 256; i++) {
idx = nand_ecc_precalc_table[*dat++];
reg1 ^= (idx & 0x
if (idx & 0x40) {
reg3 ^= (uint8_t) i;
reg2 ^= ~((uint8_t) i);
}
}
tmp1 = (reg3 & 0x80) >> 0;
tmp1 |= (reg2 & 0x80) >> 1;
tmp1 |= (reg3 & 0x40) >> 1;
tmp1 |= (reg2 & 0x40) >> 2;
tmp1 |= (reg3 & 0x20) >> 2;
tmp1 |= (reg2 & 0x20) >> 3;
tmp1 |= (reg3 & 0x10) >> 3;
tmp1 |= (reg2 & 0x10) >> 4;
tmp2 = (reg3 & 0x08) << 4;
tmp2 |= (reg2 & 0x08) << 3;
tmp2 |= (reg3 & 0x04) << 3;
tmp2 |= (reg2 & 0x04) << 2;
tmp2 |= (reg3 & 0x02) << 2;
tmp2 |= (reg2 & 0x02) << 1;
tmp2 |= (reg3 & 0x01) << 1;
tmp2 |= (reg2 & 0x01) << 0;
#ifdef CONFIG_MTD_NAND_ECC_SMC
ecc_code[0] = ~tmp2;
ecc_code[1] = ~tmp1;
#else
ecc_code[0] = ~tmp1;
ecc_code[1] = ~tmp2;
#endif
ecc_code[2] = ((~reg1) << 2) | 0x03;
return 0;
}
EXPORT_SYMBOL(nand_calculate_ecc);
static inline int countbits(uint32_t byte)
{
int res = 0;
for (;byte; byte >>= 1)
res += byte & 0x01;
return res;
}
int nand_correct_data(u_char *dat, u_char *read_ecc, u_char *calc_ecc)
{
uint8_t s0, s1, s2;
#ifdef CONFIG_MTD_NAND_ECC_SMC
s0 = calc_ecc[0] ^ read_ecc[0];
s1 = calc_ecc[1] ^ read_ecc[1];
s2 = calc_ecc[2] ^ read_ecc[2];
#else
s1 = calc_ecc[0] ^ read_ecc[0];
s0 = calc_ecc[1] ^ read_ecc[1];
s2 = calc_ecc[2] ^ read_ecc[2];
#endif
if ((s0 | s1 | s2) == 0)
return 0;
if( ((s0 ^ (s0 >> 1)) & 0x55) == 0x55 &&
((s1 ^ (s1 >> 1)) & 0x55) == 0x55 &&
((s2 ^ (s2 >> 1)) & 0x54) == 0x54) {
uint32_t byteoffs, bitnum;
byteoffs = (s1 << 0) & 0x80;
byteoffs |= (s1 << 1) & 0x40;
byteoffs |= (s1 << 2) & 0x20;
byteoffs |= (s1 << 3) & 0x10;
byteoffs |= (s0 >> 4) & 0x08;
byteoffs |= (s0 >> 3) & 0x04;
byteoffs |= (s0 >> 2) & 0x02;
byteoffs |= (s0 >> 1) & 0x01;
bitnum = (s2 >> 5) & 0x04;
bitnum |= (s2 >> 4) & 0x02;
bitnum |= (s2 >> 3) & 0x01;
dat[byteoffs] ^= (1 << bitnum);
return 1;
}
if(countbits(s0 | ((uint32_t)s1 << 8) | ((uint32_t)s2 <<16)) == 1)
return 1;
return -1;
}
在mkyaffsimage.c里边修改原码为:
加这个头文件:#include "yaffs_packedtags1.h"
static int write_chunk(__u8 *data, __u32 objId, __u32 chunkId, __u32 nBytes)
{
#ifdef CONFIG_YAFFS_9BYTE_TAGS
yaffs_Tags t;
yaffs_Spare s;
error = write(outFile,data,512);
if(error < 0) return error;
memset(&t,0xff,sizeof (yaffs_Tags));
memset(&s,0xff,sizeof (yaffs_Spare));
t.chunkId = chunkId;
t.serialNumber = 0;
t.byteCount = nBytes;
t.objectId = objId;
if (convert_endian)
{
little_to_big_endian(&t);
}
yaffs_CalcTagsECC(&t);
yaffs_LoadTagsIntoSpare(&s,&t);
yaffs_CalcECC(data,&s);
nPages++;
return write(outFile,&s,sizeof(yaffs_Spare));
#else
yaffs_PackedTags
yaffs_ExtendedTags etags;
__u8 ecc_code[6];
__u8 oobbuf[16];
error = write(outFile,data,512);
if(error < 0) return error;
etags.chunkId = chunkId;
etags.serialNumber = 0;
etags.byteCount = nBytes;
etags.objectId = objId;
etags.chunkDeleted = 0;
yaffs_PackTags1(&pt1, &etags);
yaffs_CalcTagsECC((yaffs_Tags *)&pt1);
memset(oobbuf, 0xff, 16);
memcpy(oobbuf+8, &pt1, 8);
nand_calculate_ecc(data, &ecc_code[0]);
nand_calculate_ecc(data+256, &ecc_code[3]);
oobbuf[0] = ecc_code[0];
oobbuf[1] = ecc_code[1];
oobbuf[2] = ecc_code[2];
oobbuf[3] = ecc_code[3];
oobbuf[6] = ecc_code[4];
oobbuf[7] = ecc_code[5];
nPages++;
return write(outFile, oobbuf, 16);
#endif
}
修改Makefile文件:
MKYAFFSSOURCES = mkyaffsimage.c yaffs_packedtags1.c nand-ecc.c
yaffs_packedtags1.c和nand-ecc.c是我们加上去的
这样我们就可以用make命令来生成工具文件了:mkyaffsimage 和mkyaffs2image
。。。。。。。。。。。以上是自己制作mkyaffsimage工具的步骤。。。。。。。。。。很繁琐,还是用光盘里的mkyaffs2image省事。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
接下来就是制作文件系统镜像了。
转到咱们建立的那个/ok2440目录的上一级,也就是/home目录,然后执行:mkyaffs2image ok2440 ok2440.yaffs 就可以生成文件系统镜像了,将ok2440.yaffs烧进板子,看看能不能正常挂载吧。。。。。。。。。。(当看到gugugu9999 Please press Enter to activate this console.就表明你成功了!!!)
原创文章 转载请注明转自 gugugu9999.cublog.cn