Linux-2.4.x 在 s3c44b0上的移植总结

Posted skdev

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux-2.4.x 在 s3c44b0上的移植总结相关的知识,希望对你有一定的参考价值。

采用立宇泰的 uClinux-20040408-ARMSYS.patch 补丁。
需要准备的软件包:
系统包: uClinux-dist-20040408.tar.gz
补丁包: uClinux-20040408-ARMSYS.patch
该补丁的作用是针对 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.x2.4.x2.0.x
         linux-2.x.x/arch/armnommu
体系结构为不带mmuarm44B0no memory unit的,因而系统结构(arch)选择的是带nommuarm,而非arm
         vendors/Samsung/44B0
44B0是自已创建的文件夹,里面是针对开发板的系统配置文件,这和u-boot的结构相似,相当于u-bootboard,arch/armnommu相当于u-bootcpu
/**********************************************************************************
在此说一下uClinux-dist-200nmmdd.tar.gzlinux-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里指定的是44B044B0里的文件是对开发板属性进行配置,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 1231而非mnll
打完补丁后出现如下提示:
/**********************************************************************************
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
设置DRAMFLASH参数:
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 选择
/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

以上是关于Linux-2.4.x 在 s3c44b0上的移植总结的主要内容,如果未能解决你的问题,请参考以下文章

Linux-2.6.39在Tiny6410上的移植 - 外设驱动移植

uboot在s3c2440上的移植

Linux-2.6.39在Tiny6410上的移植

ucos-ii是怎样移植到Keil C上的?

ucos-ii在ti dsp 28377芯片上的运行过程和移植过程

uboot在s3c2440上的移植