采用立宇泰的 uClinux-20040408-ARMSYS.patch
补丁。
需要准备的软件包:
系统包:
uClinux-dist-20040408.tar.gz
下载地址:
http://www.uclinux.org/pub/uClinux/dist/uClinux-dist-20040408.tar.gz
补丁包:
uClinux-20040408-ARMSYS.patch
下载地址: http://www.hzlitai.com.cn/download/uClinux-20040408-ARMSYS.rar
该补丁的作用是针对 s3c44b0x
对系统进行配置。
1 解压uClinux-dist-20040408.tar.gz
[root@localhost opt]# tar -zxvf uClinux-dist-20040408.tar.gz
解压后在当前目录下生成uClinux-dist
目录。
移植主要涉及到的内容是:
⑴ linux-2.x.x
这个表示要选择的内核版本,目前提供的版本有2.6.x
、2.4.x
、2.0.x
⑵ linux-2.x.x/arch/armnommu
体系结构为不带mmu
的arm
,44B0
是no memory unit
的,因而系统结构(arch)
选择的是带nommu
的arm
,而非arm
。
⑶ vendors/Samsung/44B0
44B0
是自已创建的文件夹,里面是针对开发板的系统配置文件,这和u-boot
的结构相似,相当于u-boot
的board,arch/armnommu
相当于u-boot
的cpu
。
/**********************************************************************************
在此说一下uClinux-dist-200nmmdd.tar.gz
与linux-2.x.x.tar.bz2
的区别
uClinux-dist
是一个综合包,里面含有厂商、驱动、内核等文件;而linux-2.x.x
只是某个版本的内核,如linux-2.6.9
可以代替uClinux-dist
中的linux-2.6.x
文件夹;linux-2.x.x
是有mmu
的内核,若开cpu
没有mmu
,则还需要为该内核打上对应的uc0.patch
的包,如linux-2.6.9
需打上linux-2.6.9-uc0.patch
。
**********************************************************************************/
2 将uClinux-20040408-ARMSYS.patch拷到uClinux-dist里
[root@localhost opt]# cp uClinux-20040408-ARMSYS.patch uClinux-dist/
注意:这个包一定要放在uClinux-dist
里打,如果uClinux-20040408-ARMSYS.patch
放在uClinux-dist
外,则会打不进去。
3 创建uClinux-dist/vendors/Samsung/44B0
[root@localhost opt]# cd uClinux-dist
[root@localhost uClinux-dist]# cd vendors/Samsung
[root@localhost Samsung]# mkdir 44B0
[root@localhost Samsung]# cp 4510B/* 44B0/
文件名一定要用44B0,
因为patch
里指定的是44B0
,44B0
里的文件是对开发板属性进行配置,config.arch
是关于结构体系arm
的一些配置
config.linux-2.x.x
是关于2.x.x
版本内核的配置
config.uClinux
是关于库的配置,如若用到jng
图库时,则需选择该库
config.vendor-2.4.x
是关于主板参数的设置
rc
关于ip
的配置
4 打补丁
[root@localhost Samsung]# cd ../../
[root@localhost uClinux-dist]# patch -p1 < uClinux-20040408-ARMSYS.patch
-p1
是123
的1
而非mnl
的l
打完补丁后出现如下提示:
/**********************************************************************************
patching file kernel_44b0.cfg
patching file kernel_44b0.cfg.old
patching file kernel_4510.cfg
patching file kernel_4510.cfg.old
patching file Makefile
Hunk #1 FAILED at 5.
Hunk #2 FAILED at 40.
Hunk #3 FAILED at 187.
3 out of 3 hunks FAILED -- saving rejects to file Makefile.rej
patching file linux-2.4.x/arch/armnommu/vmlinux-armv.lds.in
Hunk #1 succeeded at 63 (offset 4 lines).
patching file vendors/Samsung/44B0/Makefile
patch: **** malformed patch at line 16516: @@ -55,23 +57,32 @@
**********************************************************************************/
由上可知出错的文件是vendors/Samsung/44B0/Makefile
,所以我们须手动进行修改
在此解释一下patch
文件的语法:
⑴ diff
是定位要修改的文件的命令
如 diff -Naur uClinux-dist/vendors/Samsung/44B0/Makefile
即找到Makefile
这个文件
⑵ @@
找到该文件的某一行
如 @@ -3,11 +3,13
表示第3
行前11
行到第3
行后13
行的范围。
⑶ + -
行的第一个字符’+’
,表示增加一行,’-‘
表示删除一行,无字符则不用修改,是定位用的。
5 修改补丁错误
打开uClinux-20040408-ARMSYS.patch
,找到diff -Naur uClinux-dist/vendors/Samsung/44B0/Makefile
,然后对照着修改/vendors/Samsung/44B0/Makefile
文件。
uClinux-dist//vendors/Samsung/44B0/Makefile
修改后如下:
/---------------------------------------------------------------------------------------------------------------------------
ROMFSIMG = $(IMAGEDIR)/romfs.img
ROMIMAGE = $(IMAGEDIR)/image.rom
RAMIMAGE = $(IMAGEDIR)/image.ram
...
echo "$(VERSIONSTR) -- " `date` > $(ROMFSDIR)/etc/version
cp $(ROOTDIR)/user/ramimage/ramfs2048.img /
$(ROOTDIR)/romfs/etc/ramfs2048.img
image:
[ -d $(IMAGEDIR) ] || mkdir -p $(IMAGEDIR)
genromfs -v -V "ROMdisk" -f $(ROMFSIMG) -d $(ROMFSDIR)
$(CROSS_COMPILE)ld -r -o $(ROOTDIR)/$(LINUXDIR)/romfs.o /
-b binary $(ROMFSIMG)
$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment /
-S $(ROOTDIR)/$(LINUXDIR)/linux $(RAMIMAGE)
cp $(ROOTDIR)/$(LINUXDIR)/arch/armnommu/boot/zImage /
$(ROMIMAGE)
# $(CROSS_COMPILE)objcopy -O binary --remove-section=.romvec /
--remove-section=.text --remove-section=.ramvec /
--remove-section=.init /
--remove-section=.bss --remove-section=.eram /
$(ROOTDIR)/$(LINUXDIR)/linux $(IMAGEDIR)/linux.data
# $(CROSS_COMPILE)objcopy -O binary --remove-section=.ramvec /
--remove-section=.bss --remove-section=.data /
--remove-section=.eram /
--set-section-flags=.romvec=CONTENTS,ALLOC,LOAD,READONLY,CODE /
$(ROOTDIR)/$(LINUXDIR)/linux $(IMAGEDIR)/linux.text
# cat $(IMAGEDIR)/linux.text $(IMAGEDIR)/linux.data $(ROMFSIMG) > $(IMAGE)
---------------------------------------------------------------------------------------------------------------------------/
uClinux-dist//vendors/Samsung/44B0/rc
修改如下
/---------------------------------------------------------------------------------------------------------------------------
hostname Samsung
/bin/expand /etc/ramfs.img /dev/ram0
/bin/expand /etc/ramfs2048.img /dev/ram1
mount -t proc proc /proc
mount -t ext2 /dev/ram0 /var
mount -t ext2 /dev/ram1 /var
chmod 777 /ramdisk
mkdir /var/config
mkdir /var/tmp
mkdir /var/log
mkdir /var/run
mkdir /var/lock
mkdir /var/empty
ifconfig lo 127.0.0.1
route add -net 127.0.0.0 netmask 255.255.255.0 lo
ifconfig eth0 192.168.1.70 netmask 255.255.255.0 up
cat /etc/motd
---------------------------------------------------------------------------------------------------------------------------/
6 修改uClinux-dist/linux-2.4.x/drivers/block/blkmem.c
在
#ifdef CONFIG_BOARD_SNDS100
extern char romfs_data[];
extern char romfs_data_end[];
#endif
后添加
#ifdef CONFIG_BOARD_MBA44
extern char romfs_data[];
extern char romfs_data_end[];
#endif
将
#ifdef CONFIG_BOARD_MBA44
{0, 0XC7000000,-1}
#endif
改为
#ifdef CONFIG_BOARD_MBA44
{0, romfs_data,-1}
#endif
MBA44
是一个板的名称,因为立宇泰这个补丁是针对MBA44
来改的;当然不是说我们的开发板一定要是MBA44
才行,MBA44
只是个模板,相当于u-boot
里的B2
一样。
7 修改uClinux-dist/linux-2.4.x/drivers/char/Makefile
销释obj -$(CONFIG_SERIAL_S3C44B0X) += serial_S3C44B0X.o
将
#obj -$(CONFIG_SERIAL_S3C44B0X) += serial_S3C44B0X.o
改为
obj -$(CONFIG_SERIAL_S3C44B0X) += serial_S3C44B0X.o
8 修改uClinux-dist/linux-2.4.x/arch/armnommu/config.in
销释 define_bool CONFIG_SERIAL_S3C44B0X
将
# define_bool CONFIG_SERIAL_S3C44B0X
改为
define_bool CONFIG_SERIAL_S3C44B0X
9 增加bzImage
修改uClinux-dist/Makefile
在TFTPDIR = /tftpboot
后添加
LINUXTARGET = bzImage
10 设置开发板信息
⑴
修改串口通信波特率
打开uClinux-dist/vendors/Samsung/44B0/config.arch
,将波特率改为与u-boot
统一的波特率
CONSOLE_BAUD_RATE = 57600
⑵
修改uClinux-dist/vendors/Samsung/44B0/config.linux-2.4.x
/---------------------------------------------------------------------------------------------------------------------------
#
# System Type
#
# CONFIG_ARCH_DSC21 is not set
# CONFIG_ARCH_C5471 is not set
# CONFIG_ARCH_CNXT is not set
# CONFIG_ARCH_NETARM is not set
# CONFIG_ARCH_TA7S is not set
# CONFIG_ARCH_TA7V is not set
# CONFIG_ARCH_SWARM is not set
CONFIG_ARCH_SAMSUNG=y
# CONFIG_ARCH_ATMEL is not set
# CONFIG_CPU_BIG_ENDIAN is not set
# CONFIG_SET_MEM_PARAM is not set
# CONFIG_RAMKERNEL is not set
# CONFIG_BOARD_SMDK40100 is not set
CONFIG_BOARD_MBA44=y
#CONFIG_ROMKERNEL=y
CONFIG_RAMKERNEL=y
# CONFIG_BOARD_EVS3C4530HEI is not set
# CONFIG_BOARD_S3C2500REFRGP is not set
# CONFIG_BOARD_SMDK2500 is not set
#CONFIG_BOARD_SNDS100=y
CONFIG_NO_PGT_CACHE=y
CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
#
CONFIG_CPU_4510B=y
CONFIG_CPU_S3C44B0X=y
CONFIG_CPU_ARM710=y
CONFIG_CPU_WITH_CACHE=y
# CONFIG_CPU_WITH_MCR_INSTRUCTION is not set
CONFIG_SET_MEM_PARAM=y
DRAM_BASE=0x0C000000
DRAM_SIZE=0x00800000
FLASH_MEM_BASE=0x01000000
FLASH_SIZE=0x00200000
…
CONFIG_NOFLASH=y
改为
#CONFIG_NOFLASH=y
---------------------------------------------------------------------------------------------------------------------------/
主要修改的几点:
选择开发板:
CONFIG_BOARD_MBA44=y
修改CPU
型号:
CONFIG_CPU_S3C44B0X=y
选择内核模式:
CONFIG_RAMKERNEL=y
设置
DRAM
和
FLASH
参数:
CONFIG_SET_MEM_PARAM=y
DRAM_BASE=0x0C000000
DRAM_SIZE=0x00800000
FLASH_MEM_BASE=0x01000000
FLASH_SIZE=0x00200000
⑶
修改uClinux-dist/vendors/Samsung/44B0/config.vendor-2.4.x
注释掉CONFIG_USER_BUSYBOX_KILLALL=y
#CONFIG_USER_BUSYBOX_KILLALL=y
将
CONFIG_USER_LOGIN_LOGIN=y
改为
CONFIG_USER_LOGIN_LOGIN=n
将
CONFIG_USER_OLD_PASSWORD=y
改为
CONFIG_USER_OLD_PASSWORD=n
将
CONFIG_USER_BUSYBOX_BUSYBOX=y
改为
CONFIG_USER_BUSYBOX_BUSYBOX=n
11 编译内核
⑴
[root@localhost opt]#
make distclean
⑵
[root@localhost opt]#make menuconfig
①
选择
CPU
Vendor:Samsung
Product:44B0
② 选择内核
Kernel Version:linux-2.4.x
Libc Version:uClibc
Customize kernel setting:y
Customize vendor/user setting:y
③ 保存设置
④
退出
退出后进行参数设置,参数的设置选择会自动按照
vendors/Samsung/44B0
里的配置文件来选择。再配置过程会出现如下需要手动选择的:
Timer and CPU usage LEDs (CONFIG_LEDS) [N/y/?] (NEW) y
Timer LED (CONFIG_LEDS_TIMER) [N/y/?] (NEW) y
CPU usage LED (CONFIG_LEDS_CPU) [N/y/?] (NEW) y
FLASH type (NONE, AMD, INTEL) [NONE] (NEW) AMD
defined CONFIG_AMDFLASH
FLASH size (AUTO, 128KB, 1MB, 2MB, 4MB, 6MB, 8MB, 16MB) [AUTO] (NEW)
(
回车
)
defined CONFIG_FLASHAUTO
FLASH bit width (AUTO, 8bit, 16bit, 32bit) [AUTO] (NEW)
(
回车
)
2nd flash in /dev/rom8 (CONFIG_EXTRA_FLASH) [N/y/?] (NEW) N
Serial console device (NULL, UART) [UART] (NEW)
(
回车
)
Anakin serial port support (CONFIG_SERIAL_ANAKIN) [N/y/?] (NEW) N
S3C44B0 serial port support (CONFIG_SERIAL_S3C44B0X) [Y/n/?]
Support for console on S3C44B0 serial port (CONFIG_SERIAL_S3C44B0X_CONSOLE) [Y/n/?]
Default S3C44B0 serial baudrate (CONFIG_S3C44B0_DEFAULT_BAUDRATE) [115200] (NEW) 57600
ARM AMBA serial port support (CONFIG_SERIAL_AMBA) [N/y/?] (NEW) N
CLPS711X serial port support (CONFIG_SERIAL_CLPS711X) [N/y/?] (NEW) N
DC21285 serial port support (CONFIG_SERIAL_21285) [N/y/?] (NEW) N
Excalibur serial port (uart00) support (CONFIG_SERIAL_UART00) [N/y/?] (NEW) N
SA1100 serial port support (CONFIG_SERIAL_SA1100) [N/y/?] (NEW) N
配置完毕后会弹出
kernel setting
和
vendor/user setting
的设置窗口,直接按
exit
保存即可。
⑶
make dep
⑷
make lib_only
⑸
make user_only
⑹
make romfs
⑺
make linux
这个编译会出现
cannot open romfs.o
这个错误提示,不理,因为
romfs.o
是在下一步产生的
⑻
make image
这里产生
No arch/armnommu/boot/zImage
错误,不理
⑼
make linux
⑽
make image
⑿
make
编译通过后会在
uClinux-dist/images
里产生三个文件:
image.ram image.rom romfs.img
image.ram
即是可以移植的。
Minicom
使用说明
[root@localhost opt]#minicom
1 CTR+A
弹出帮助状态栏,在
term
底端
2
输入
Z
弹出帮助菜单
3
选择
O
弹出串口配置
4
选择
Serial port setup
5
选择
A
/dev/ttyS0
表示
COM1
/dev/ttyS1
表示
COM2
修改后按回车,不要按
esc
6
选择
E
设置波特率和数据位
7
选择
F,G
取消硬件流和软件流
8
回车退出
9
选择
save setup as df1
即默认启动的配置文件
10
选择
exit
11
重新回到主菜单
12
选择
Q
退出帮助菜单
13 leave without reset
选择
yes
14
重启
minicom
15
进入帮助菜单,选择
L
,开启串口捕获。
16
退出
Tftp
使用说明
[root@localhost opt]#tftp
tftp>connect 192.168.1.70 //
板
IP
tftp>binary //
二进制传送,一定要设置成二进制的
tftp>put image.ram