Chinaunix首页 | 论坛 | 博客
  • 博客访问: 131380
  • 博文数量: 36
  • 博客积分: 2092
  • 博客等级: 大尉
  • 技术积分: 390
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-04 17:33
文章分类
文章存档

2011年(18)

2010年(18)

我的朋友

分类: LINUX

2010-05-16 16:25:19

一.准备
linux-2.6.28               #内核包文件
cvs-root.tar.gz            #yaffs 文件补丁
arm-linux-gcc-4.1.1        #交叉编译器
mkimage(yaffs制作工具)     #生成uImage 文件   复制到/usr/bin 目录下  修改权限777
busybox-1.13.0.tar.tar     #文件系统制作
yaffs 文件补丁 
由于没有mkimage 就上网下载了uboot-mkimage 
#tar zxvf uboot-mkimage.tar.gz        #解压
#make                                 #编译 Makefile
#cp mkimage /usr/bin                  # 复制
 
二.配置
1.修改源代码顶层Makefile 文件。   198行
ARCH            ?= $(SUBARCH)
CROSS_COMPILE   ?=
改为:
ARCH            ?= arm
CROSS_COMPILE   ?= /opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-
linux-gnu/bin/arm-9tdmi-linux-gnu-
保存。
 
2.生成默认配置2440
cp arch/arm/configs/s3c2410_defconfig ./.config #把默认配置复制到源代码中

make menuconfig                                #菜单,
Load an Alternate Configuration File           #读入默认配置
save an Alternate Configuration File           #保存。
make config --- 基于文本的最为传统的配置界面,不推荐使用
make menuconfig --- 基于文本选单的配置界面,字符终端下推荐使用
make xconfig --- 基于图形窗口模式的配置界面,Xwindow下推荐使用
 
3.修改时钟.LINUX默认为16M,而2440 是12M.  不修改超级终端中会出现乱码
  修改Arch/arm/mach-s3c2440/mach-smdk2440.c        163行
S3c24xx_init_clocks(16934400);
改为:
S3c24xx_init_clocks(12000000);
 
4.修改机器码CPU ID 。不修改将会出现无法进入内核由于CPU mach_type 不对应
,找不到对应的CPU。修改arch/arm/tools/mach-types ,让内核找到相应的CPU  
379行
我的机器码是5244
s3c2440              ARCH_S3C2440          S3C2440             5244
 
5.修改MTD分区--nand flash 分区
修改arch/arm/plat-s3c24xx/common-smdk.c   109行。
可能通过查看(参考)开发板自带的内核。
 
有的文章介绍说这个文件还要修改smdk_nand_info如下:
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls              = 0,        //default is 20
.twrph0          = 30,       //default is 60
.twrph1          = 0,        //defualt is 20 changed by yangdk
.nr_sets   = ARRAY_SIZE(smdk_nand_sets),
.sets        = smdk_nand_sets,
};
 
6.内核增加yaffs2支持
下载的yaffs补丁文件,然后解压到某位置(/user).
 cd /user/yaffs   #进入/user/yaffs
./patch-ker.sh c /opt/linux-2.6.28/    #给内核文件打补丁,以让它支持yaffs此时,内核源码的"fs"目录下新添加一个名为"yaffs2"的目录,也同时fs目录下的makefile kconfig文件也添加了yaffs2的配置和编译条件,它们都相应改变了。
补丁完成下面二件事情 (之前以为是手动的下面事情)
1)命令及步骤如下:

  cp /opt/yaffs2/*.h  /linux-2.6.30.4/fs/yaffs2/
  cp /opt/yaffs2/*.c  /linux-2.6.30.4/fs/yaffs2/
  cp /opt/yaffs2/Makefile.kernel  /linux-2.6.30.4/fs/yaffs2/Makefile
  cp /opt/yaffs2/Kconfig  /linux-2.6.30.4/fs/yaffs2/Kconfig
2)进入源代码fs/yaffs2 文件,给内核配置菜单增加yaffs2的选项菜单.
  修改linux-2.6.30.4/fs/Kconfig.
    在文件中的source “fs/ext4/kconfig”的一行下面添加类似的一行内容:
              source “fs/yaffs2/kconfig”
  修改linux-2.6.30.4/fs/Makefile
     在文件中的obj-$(CONFIG_EXT4_FS) += ext4/这一行下面增加类似的一行:
               obj-$(CONFIG_YAFFS_FS) += yaffs2/
在内核根目录下执行:
#make menuconfig 配置yaffs2文件支持
File systems   --->
Miscellaneous filesystems --->
    <*>YAFFS2 file system support
 
7.关闭ECC校验
修改文件在driver/mtd/nand/s3c2410.c中找到s3c2410_nand_init_chip()函数,
将:                       752行
chip->ecc.mode=NAND_ECC_SOFT;
改成
chip->ecc.mode=NAND_ECC_NONE; ”
 
8.编译内核。
完成上面yaffs文件移植支持,配置后,
make menuconfig #可以再次进行配置。
make clean   #如果之前有编译过。否则直接
make uImage   #生成uImage
 
内核编译基本命令:
make mrproper --- 清理全部文件,包括.config和一些备份文件
make clean --- 清理生成文件,但会保留.config和一些模块文件。
make defconfig --- 生成包含全部默认选项的.config文件。这里用make s3c2410_defconfig替代
make oldconfig --- 在旧的.config基础上生成新的.config。如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦接下来将用busybox 来制作文件系统。
 
9.完成上面工作后。编译的得出uImage
arch/arm/boot/uImage
下载在内存中运行linux测试 :
u-boot(2440)=>tftp 30008000 zImage
u-boot(2440)=>go 30008000

u-boot(2440)=> tftp 30008000 uImage
u-boot(2440)=> bootm
uboot目前只能支持uImage启动,不支持zImage.所以用uImage
 
10.接来下。我们将用busybox 制作文件系统。
 
1)把下载好的busybox 解压与配置
#tar zxvf busybox-1.13.0.tar.tar -C /user/
#cd busybox-1.13.0
#vi Makefile
进入编辑状态,修改Makefile文件,指定平台与编译工具。
 
大概164行改成
CROSS_COMPILE = /opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-9tdmi-linux-
gnu/bin/arm-9tdmi-linux-gnu-

189行改成
ARCH = arm
 
保存,进入配置:
#make menuconfig
然后进入配置(可以采用默认,也可以根据自己的需要添加。)
保存.编译时调用的是.config文件.
 
2)编译并安装Busybox
#make
#make install
安装完后会在busybox-1.13.0/_install/目录下生成:bin、linuxrc、sbin、usr
我们就可以进行文件系统的构建了。
 
#mkdir rootfs     //建立一个文件系统目录
#cp -rf /user/busybox-1.13.0/_install/* /user/rootfs

将busybox 编译生成_install 目录下的文件复制到rootfs
 
#cd rootfs
#mkdir dev etc lib mnt proc sbin sys root
#mkdir /etc/var
#mkdir /etc/tmp
#ln -s /etc/var /var
#ln -s /etc/var /tmp
 
3)创建设备文件系统
#mknod console c 5 1
#mknod null c 1 3
 
4)建立动态运行库
#cp -rfd /usr/local/arm/3.4.5/arm-linux/lib/*so* /user/rootfs/lib –a

#cp -rfd /usr/local/arm/3.4.5/arm-linux/lib/* /user/rootfs/lib
拷贝经过交叉编译的库文件,参数-d,保持库文件的链接关系。
这里拷贝了常用的库文件,如果需要特殊的库,需要再从相应的位置复制过来。
 
5).创建etc目录下文件
“etc”目录
用来存放系统的配置文件。
在“etc”目录下面有如下常用的文件:
fstab:指明需要挂载的文件系统;
group:用户组;
inittab:init 进程的配置文件;
passwd:密码文件;
profile:用户环境配置文件;
mdev.conf:因为2.6.18 版本开始linux 放弃使用devfs 而采用udev(mdev 是udev 的简化版本),这里的
mdev.conf 文件可以是空,也可以按照一定规则来编写,这里我采用了为空;
resolv.conf:存放DNS 信息的文件,访问外网时需要DNS 的信息。
常用的目录有:
init.d 目录:启动文件目录,该目录下面有个“rcS”的文件,里面存放了系统启动时配置以及自启动加载的进程等;
sysconfig 目录:在我们的文件系统里面,该目录下面存放了名为“HOSTNAME”的文件,该文件内容为:
Embed_hitechman,这句话就是我们在文件系统里面看到那个“[root@Embed_hitechman /]” rc.d 目录:在我们的文件系统里面用来存放一些自启动所要调用的脚步等;
boa 目录:我们的文件系统特有的目录,用来存放web 服务器的配置脚本。
 
下面分别列出“etc”下面各个文件的内容。
【fstab】:
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
 
【group】:
root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*:5:
disk:*:6:
lp:*:7:lp
mail:*:8:
:
uucp:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floppy:*:25:
tape:*:26:
sudo:*:27:
audio:*:29:
ppp:x:99:
500:x:500:hitechman
501:x:501:hitechman
 
【inittab】:参考busybox 源码下面的“examples/inittab”文件
# /etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
注意:上面红色部分在busybox 的参考文件中是ttySAC0,而在s3c24xx 系列芯片的串口驱动里面我们用了s3c2410_serial 做为设备名(在内核源码的“drivers/serial/s3c2410.c”文件的949 行),然后我们又是用的串口0 作为控制台的,所以这里我们使用s3c2410_serial0。
 
【passwd】:
root::0:0:root:/:/bin/sh
ftp::14:50:FTP User:/var/ftp:
bin:*:1:1:bin:/bin:
daemon:*:2:2:daemon:/sbin:
nobody:*:99:99:Nobody:/:
hitechman:*:502:502:LinuxUser,,,:/home/hitechman:/bin/sh
 
【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
 
【mdev.conf】:
暂时空
 
【resolv.conf】:
nameserver 202.96.128.166
 
【init.d/rcS】:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
/bin/hostname -F /etc/sysconfig/HOSTNAME
注意:在上面红色部分是关于mdev 的使用,请参考busybox 的“docs/mdev.txt”文件。

最后还要改变它的属性使它能够执行。chmod +x etc/init.d/rcS
 
【rc.d/init.d/httpd】:
#!/bin/sh
base=boa
# See how we were called.
case "$1" in
start)
/sbin/$base
;;
stop)
pid=`/bin/pidof $base`
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit 0
 
【boa/boa.conf】:
 
【sysconfig/HOSTNAME】:
Embed_hitechman
“home”目录
存放用户文件的目录,在这里,我建立了一个名为“jiajintao”的目录,前面的passwd 文里面有个用户名就是对应jiajintao这个目录
“lib”目录
常用的库文件,获取库文件的方法:----方法是上面 4)建立动态运行库
“mnt”目录
我们一般用来挂载的U 盘之类的外设,这里建立两个目录“udisk”和“sd”,分别用来挂载U 盘和SD卡。
“opt”目录

“proc”目录
提供一些目录和虚拟文件系统。
“root”目录
超级用户的目录。
“sys”目录
“tmp”目录
存放临时文件的目录。
“var”目录
存放临时文件的目录。
“web”目录
存放web 服务器的相关文件的目录,建议直接从以前制做好的文件系统中拷贝过来。
 
6).使用mkyaffsimgae命令生成yaffs映像文件
找到yaffs制作工具mkyaffsimage,将其拷贝到/bin目录下,以便于利用系统环境变量能找到,然后用下面的命令:
 
#mkyaffsimage rootfs rootfs.yaffs    就可以filesystem目录制作成一个名叫rootfs.yaffs的映像。
 
#chmod 755 rootfs.yaffs
#/etc/init.d/xinetd restart

将制作好的yaffs文件系统映像拷贝到/tftpboot下,修改其权限至少为755, 然后重新启动 xinetd 服务。
 
7).通过uboot将内核映像uImage和rootfs.yaffs下载到开发板上
 
 

 
阅读(2801) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~