2023年12月1日发(作者:)
lysysjw QQ:29581992
根文件系统制作
FL2440在移植完linux内核后,需要移植根文件系统才能正常的启动开发板上面
的Linux系统。下面介绍一下如何制作根文件系统。
首先要明确几个问题,首先,为什么要制作根文件系统?根文件系统是什么?文
件系统又是什么?如何制作根文件系统?这里介绍的是制作方法,所以下面只回
答最后一个问题。至于其他问题,网上的资料以及相关的书籍上都有很详细的介
绍,并且不是一句两句就能回答出来的,这里不多罗嗦。
开发板:FL2440
SDRAM:64M NAND FLASH:256M
环境:虚拟机vmware7.1.2.14247绿色版(网上到处是)、红帽企业版5
交叉编译链:arm-linux-gcc-4.3.2(这里选择这个,低版本的比如3.4.1的等,在
编译的过程中可能会提示很多错误)
使用的工具:2
这里先改正一下错误,上次的linux-2.6.28.7内核移植到FL2440开发板时的触屏
驱动有问题,需要改正几个错误,否则校正3.5寸的屏幕时可能会出现错误,
FL2440光盘中的linux-2.6.28的触屏驱动也存在此问题。
触屏校正有问题,校正不过去,需要修改源码中的触屏驱动才能解决。
文件:drivers/input/touchscreen/s3c2410_ts.c
static irqreturn_t stylus_updown(int irq, void *dev_id)//172行
函数中的data0 = readl(base_addr+S3C2410_ADCDAT0);//178行
data1 = readl(base_addr+S3C2410_ADCDAT1);//179行
修改为:
data1 = readl(base_addr+S3C2410_ADCDAT0);//lysysjw
data0 = readl(base_addr+S3C2410_ADCDAT1);//lysysjw
1
lysysjw QQ:29581992
static irqreturn_t stylus_action(int irq, void *dev_id)//194行
函数中的data1 = readl(base_addr+S3C2410_ADCDAT0);//199行
data0 = readl(base_addr+S3C2410_ADCDAT1);//200行
修改为
data1 = readl(base_addr+S3C2410_ADCDAT0);//lysysjw
data0 = readl(base_addr+S3C2410_ADCDAT1);//lysysjw
下面开始介绍根文件系统制作过程。制作步骤如下:
大体来说,有两大步骤,第一步是移植Busybox,第二步是构建根文件系统。下
面首先说第一步。
1、下载2,并解压
首先,创建目录,用如下命令
mkdir /arm
进入这个目录
cd /arm
下载2,地址是
/downloads/
或者
/downloads/
busybox官网为
/
下载完后,将2复制到arm目录下,然后解压缩,如下命令
jar –jxvf 2
这样在/arm目录下就会出现busybox-1.19.0目录,进入这个目录
cd busybox-1.19.0
2
lysysjw QQ:29581992
2、配置Busybox
首先编辑改源码目录中的Makefile文件,
vim Makefile
将下面的两个变量修改
CROSS_COMPILE ?=
ARCH ?=
改后的值为
CROSS_COMPILE ?=arm-linux-
ARCH ?=arm
当然上面的交叉编译链是要创建到环境变量中的。否则添加上绝对地址,不过有
时候添加上绝对地址后可能会有错误。
执行下面命令进行配置
make menuconfig
这里做的修改如下,其他没提到的可以不修改(这里直接以飞凌官方论坛的为例,
地址为/?tid=6292&highlight
=)
Busybox Settings --->
Build Options --->
• Build Busybox as a static binary(no shared libs)
• Build with Large File Support (for accessing files >
2GB)
Installation Options --->
(./_install) Busybox installation prefix <—进入这个选
项,输入busybox的安装路径,如:../rootfs
Busybox Library Tuning --->
• vi-style line editing commands
3
lysysjw QQ:29581992
• Fancy shell prompts <—要选择这个选项:“Fancy shell
prompts”,否则挂载文件系统后,无法正常显示命令提示符:“[u@h
W]#”
这样就基本可以了,不过下面的几个配置选项需要注意一下。
如果只配置到此,那么构建的根文件系统在dnw串口软件上面启动来的Linux
在串口打印中会出现乱码的现象,类似于下图
其实这也不是大问题,用超级终端就可以正常显示了。原因在于dnw是不支持
彩色的。这个是由于在编译busybox时将文件利用颜色来区别这个选项选择上
了。为了在dnw也能正常显示,可以将按下面修改(默认是选择上的,这里我
们不选择)
Coreutils --->下找到ls相关的
Allow use of color to identify file types 和 Produce colored ls output by default,
如下图
将Allow use of color to identify file types这一项不选择就可以了。不过这里推荐
选择,因为在开发时比较直观。
FL2440开发板官方给的文件系统是不能用Tab键补齐的,而其他的板子比如
mini2440、TQ2440都是可以利用TAB键补齐的,刚开始接触时可能会纳闷,其
4
lysysjw QQ:29581992
实原因就在飞凌配置busybox时有一项给去掉了的原因。这一项是
Busybox Settings--------------à
Busybox Library Tuning------à
Tab completion
如下图
还有很多参数,这里不再多介绍。下面给出一个示例,部分内容有出入
5
lysysjw QQ:29581992
3、编译
用如下命令进行编译
make
6
lysysjw QQ:29581992
用如下命令进行安装
make install
命令执行完毕,就会在在/arm目录下多出一个rootfs目录,里面存放了如下文件
第二步,制作根文件系统。制作根文件系统,到底制作了什么?制作了那些东西?
其实说白了,就是制作了目录,目录里面制作一些文件,这些文件有的与启动有
关,有的是各种命令等等。
0、制作必要的目录
进入/arm目录,创建目录root-2.6目录,进入该目录,创建如下目录
bin、etc、dev、home、lib、mnt、opt、proc、root、sbin、sys、tmp、usr、var
这里介绍一下主要的几个目录的功能:
bin:保存busybox制作出来的可执行的文件以及自己所创建的各种可执行文件或
者shell程序。
etc:这里面放置了各种启动过程中所用到的配置文件,主要的有inittab文件(init
进程的配置文件),fstab文件(用于指明需要挂载的文件系统)、profile文件(用
于配置用户环境变量)、init.d目录下的rcS文件(启动时用到的配置以及自启动
的进程等在这里要写入到这个文件下)、sysconfig目录下的HOSTNAME文件(与
终端显示信息有关系),group文件(用户组文件)、passwd文件(密码文件)、
shadow文件(与创建密码有关系)。其他的诸如文件(与设备文件系
统有关)、文件(与DNS有关)、rc.d文件(与自启动有关)、boa目
录(与web服务器的配置相关)这里不多介绍,可以查阅相关资料。
lib:放置了各种库文件(这一目录下需要根据实际需要进行删减的,要不然制作
的文件系统会很大)
sbin:和bin目录差不多
usr
7
lysysjw QQ:29581992
下面详细介绍一下制作过程。
命令如下
cd /arm
mkdir root-2.6
cd root-2.6
mkdir bin etc dev home lib mnt opt proc root sbin sys tmp usr var
创建完毕,将第一步生成的rootfs目录中的所有文件复制到root-2.6目录下。命
令如下
cp –rf ../rootfs/* ./
注意:以下提到的所有的shell脚本文件的权限最少是可执行的。否则启动会不
正常。
1、linuxrc的作用
在bootloader交接给内核的一些参数中,有一个是init=/linuxrc,这个是内核启动
的过程中第一个启动的程序,我们可以使用默认的,既busybox编译出来的,也
可以自己创建的shell脚本文件,其中fl2440所配的官方根文件系统就是用的脚
本文件。
脚本的内容可以自己编写
下面给出示例
#!/bin/sh
/bin/mount -t proc proc /proc
/bin/mount -t sysfs sysfs /sys
/sbin/mdev -s
exec /sbin/init
不过推荐使用默认的linuxrc
2、制作必要的文件
这里的工作目录是/arm/root-2.6。
2.1首先,进入dev目录下,创建两个设备节点
8
lysysjw QQ:29581992
cd dev
#mknod console c 5 1
#mknod null c 1 3
这里简要介绍一下原因。虽然这两个设备文件在内核挂载完文件系统后,系统会
利用mdev自动创建,可是在此之前,即在内核挂载文件系统之前,init进程会
用到这两个设备文件。如果没有这两个设备文件 ,会提示如下一些信息
Warning: unable to open an initial console.
2.2然后进入etc目录中,按下面进行操作
cd etc
2.2.1制作必要的文件。
拷贝Busybox-1.15.2/examples/bootfloopy/etc/* 到当前目录下
[root@localhost etc]# cp -r /arm/busybox-1.19.0/examples/bootfloppy/etc/* ./
包括的文件:fstab、init.d、inittab、profile。
2.2.2制作密码、用户相关的文件。
拷贝/etc/passwd、/etc/group、/etc/shadow到当前目录下。
# cp /etc/passwd ./
# cp /etc/group ./
# cp /etc/shadow ./
把passwd文件中的第一行:root:x:0:0:root:/root:/bin/bash中的/bin/bash,改成
/bin/ash,因为文件系统的bin目录下没有bash这个命令,而是用ash代替bash,
所以在用用户名密码登录的时候(如telnet),会出现“cannot run /bin/bash: No such
fileor directory”的错误。
2.2.3修改inittab文件(该文件可以不用创建,使用默认值即可)
Linux的init进程是根据/etc/inittab文件来创建其他子进程的。所以我们要修改
inittab文件, 内容如下:
console::sysinit:/etc/init.d/rcS
ttyS0::respawn:-/bin/sh
9
lysysjw QQ:29581992
s3c2410_serial0::askfirst:-/bin/sh
:: once:/usr/sbin/telnetd -l /bin/login
上面内容的意思根据我的理解加上资料中的介绍,上面总共是四个进程,第一个
进程是用到了在dev目录下创建的console这个设备,系统启动后最先执行,并
且只执行一次,执行的是/etc/init.d/rcS这个脚本文件,至于做了什么,下面介绍。
第二个进程是启动shell,以串口/dev/ttyS0作为控制台。在启动的过程中,我们
可以在最后阶段看到一句话“Please press Enter to activate this console.”这个就是
由于第三句的原因,而这里是以s3c2410_serial0串口作为控制台,启动shell。
至于为什么这么改,根据是什么,如果英文好,可以参考busybox源码中的
example目录下的inittab文件,如果不够好,参考韦东山的嵌入式Linux应用开
发完全手册把,第17章就是讲这个的,页数为345。这里简单的介绍一下
版权问题这里不摘录,可以自己去查看
2.2.4修改fstab文件。改文件是用于控制所要挂载的文件系统。
内容如下:
#device mount-point type options dump fsck order
proc /proc 0 proc defaults 0
0 tmpfs /tmp tmpfs defaults 0
0 sysfs /sys sysfs defaults 0
tmpfs /dev 0 tmpfs defaults 0
var 0 tmpfs defaults 0 /dev
以上内容的写法,这里引自韦东山的《嵌入式Linux应用开发完全手册》中相关
内容
版权问题这里不摘录,可以自己去查看
2.2.5修改init.d/rcS文件。这是一个脚本文件,在这里我们可以添加自动执行的
命令,常用于配置ip地址,挂载文件系统等
内容如下:
10
lysysjw QQ:29581992
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a #挂载fstab文件指定的文件系统
mkdir /dev/pts #
mount -t devpts devpts /dev/pts #devpts用于支持外部网络连接(telnet)的虚拟
终端
echo /sbin/mdev > /proc/sys/kernel/hotplug #设置内核,当有设备插拔时调用
/sbin/mdev程序
mdev -s #在/dev目录下生成内核支持的所有设备的结点
mkdir -p /var/lock
qtopia & #启动qtopia脚本
ifconfig eth0 192.168.0.15 up #配置ip地址
/bin/hostname -F /etc/sysconfig/HOSTNAME
2.2.6修改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]# ' #用于显示[root@FL2440 /]#
PATH=$PATH
HOSTNAME=`/bin/hostname`
11
lysysjw QQ:29581992
echo " Processing / "
echo "Done"
export USER LOGNAME PS1 PATH
2.2.7新建sysconfig文件夹,在里面新建HOSTNAME文件,内容为:FL2440
这里之所以创建该文件和相关内容,是为了在开机启动后,在控制台中可以看到
类似的信息
图中“root@FL2440”中FL2440就是这个文件中的内容。
2.2.8复制文件到etc目录下,并修改部分内容
修改的办法是根据实际应用的触屏驱动来改写。若修改不正确,会提示如下面的
错误
selected device is not a touchscreen I understand
如果是fl2440的内核可以参考如下图所示
12
lysysjw QQ:29581992
2.3拷贝库文件: (完成)
进入lib目录,拷贝交叉编译器的库文件到lib目录下
#cp -f -a /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/*.so* ./
由于交叉编译器的库文件比较多,体积较大,所以需要裁剪一下库文件,只保留
常用的库文
件。
rm –f libwv* libuniconf*
这两个库文件一般很少用到,并且占用的大约8M的空间,为了节省内存,所以
删掉。
由于这里用到了图形界面和触屏,所以要添加一些库文件到这里。
从qtopia-2.2.0/tslib-1.4.1/__install/lib/下拷贝ts/目录到 这里的lib/目录下,
cp –r –a /usr/qtopia-2.2.0/ tslib-1.4.1/__install/lib/ts ./
2.4对usr/目录的修改(完成)
由于这里要制作含有qtopia的根文件系统,而qtopia在第一次启动的时候需要设
置一下参数,其中时区的设置就要用到开发板中的/usr/share/zoneinfo/下的一些文
13
lysysjw QQ:29581992
件,这些文件是在交叉编译好的qtopia-2.2.0/qtopia/etc目录下拷贝过来,文件在
qtopia-2.2.0/qtopia/etc下的zoneinfo文件夹下,这里要将整个文件下拷贝到
usr/share下面。命令如下
cp –r –a /usr/qtopia-2.2.0/qtopia/etc/zoneinfo usr/share/
上面的工作目录是在root-2.6
如果没有上面的目录的话,或者路径不对的话,是不能设置时区的。
2.5 sbin目录的修改(完成)
由于用到了触屏和图形界面,所以这里需要将触屏校正程序ts_calibrate拷贝到
sbin目录下。
ts_calibrate文件在qtopia-2.2.0/qtopia/tslib-1.4.1/__install/bin/下。
cp –r –a /usr/qtopia-2.2.0/qtopia/tslib-1.4.1/__install/bin/ts_calibrate sbin/
2.6 bin目录的修改(完成)
在该目录下新建一个qtopia文件,用于启动图形界面。内容如下
#!/bin/sh
echo Start Qtopia-2.2.0 > /dev/s3c2410_serial0 #打印提示信息
export HOME=/root #这里设置的HOME用于触屏的配置完的文件存放的位
置,第一次启动配置完后,该目录下面会多出相应的一些目录,每个目录用于存
放相关的配置文件。如果想重新配置,那么删除该目录下所以的文件,然后重启
就可以进行重新设置。
export QTDIR=/opt/Qtopia #Qtopia所在的目录,该行必须
export QPEDIR=/opt/Qtopia #Qtopia所在的目录,该行必须
export KDEDIR=/opt/kde #kde所在的目录,不过可以忽略本行
export QWS_KEYBOARD="TTY:/dev/tty1" #该行的作用还不明确,不过在这
里可以忽略本行
export LD_LIBRARY_PATH=/lib
14
lysysjw QQ:29581992
export TSLIB_TSDEVICE=/dev/ts0 #触屏设备节点,该行必须
export TSLIB_TSEVENTTYPE=H3600
export TSLIB_CONFFILE=/etc/ #触屏的配置文件所在处,这个文件要根
据实际的触屏驱动进行修改。修改放到下面。该行必须
export TSLIB_PLUGINDIR=/lib/ts #触屏的库文件所在处,该行必须
export TSLIB_CALIBFILE=/etc/pointercal #触屏校正后产生的文件,这里可以不
用设置该处
export set QWS_MOUSE_PROTO="TPanel:/dev/ts0" # USB:/dev/mouse0" #该行必
须,加上后面的USB……,就会在触屏上面出现一个鼠标箭头,不加则没有,
该行必须
export PATH=$QPEDIR/bin:$PATH #该行必须,因为触屏中的可执行文件在这
里
export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib #该行必须,触屏用到的库
文件
if [ -f /etc/pointercal ] ; then
qpe 1>/dev/null 2>/dev/null
else
echo "Now adjust the TouchScreen"
ts_calibrate
qpe 1>/dev/null 2>/dev/null
fi
最后这个if-else-fi用于判断是否存在etc/pointercal文件,如果存在,则直接进入
图像界面,如果不存在,则进行校正后再进入。
qpe 1>/dev/null 2>/dev/null 这句中后面的是用于将启动信息不打印到串口,如果
直接用下面
qpe &,则会有一些信息打印出来。后面的“&”用于后台运行。
这里还需要改变qtopia的属性,权限至少是全部可执行
15
lysysjw QQ:29581992
chmod 777 qtopia
2.2.9其他目录,默认为空即可
3、制作根文件系统镜像
这里利用飞凌给的官方的制作yaff的程序来制作根文件系统,mkyaffs2image
命令如下
./mkyaffs2image root-2.6
这样烧写到开发板中就可以启动带有qtopia界面的linux系统。
若发现问题,可以qq联系
16


发布评论