4.移植項目及說明
4.1壓縮核心代碼起始地址修改
修改檔案:uClinux-dist/linux-2.4.x/arch/armnommu/boot/Makefile
修改內容:
ifeq ($(CONFIG_BOARD_MBA44),y)
ZTEXTADDR = 0x0c100000
ZRELADDR = 0x0c008000
endif
說明:
ZTEXTADDR:自解壓代碼的起始地址。
ZRELADDR:核心解壓後代碼輸出起始地址。
4.2處理器配置選項的修改
修改檔案:uClinux-dist/linux-2.4.x/arch/armnommu/config.in
修改內容:
define_bool CONFIG_NO_PGT_CACHE y
define_bool CONFIG_CPU_WITH_CACHE y
define_bool CONFIG_CPU_WITH_MCR_INSTRUCTION n
- define_int CONFIG_ARM_CLK 60000000
- define_bool CONFIG_SERIAL_S3C44B0X y
- define_int CONFIG_FORCE_MAX_ZONEORDER 5
+ define_int CONFIG_ARM_CLK 64000000 #72000000
+# define_bool CONFIG_SERIAL_S3C44B0X y
+# define_int CONFIG_FORCE_MAX_ZONEORDER 5
if [ "$CONFIG_SET_MEM_PARAM" = "n" ]; then
- define_hex DRAM_BASE 0x00000000
+ define_hex DRAM_BASE 0x0C000000
define_hex DRAM_SIZE 0x00800000
- define_hex FLASH_MEM_BASE 0x01000000
+ define_hex FLASH_MEM_BASE 0x00000000
define_hex FLASH_SIZE 0x00200000
fi
fi
……
說明:
修改了對ARM處理器主頻的定義:
define_int CONFIG_ARM_CLK 64000000
修改了儲存空間大小和起始地址的定義:
define_hex DRAM_BASE 0x0C000000;SDRAM的起始地址
define_hex DRAM_SIZE 0x00800000;SDRAM的大小
define_hex FLASH_MEM_BASE 0x00000000;flash的起始地址
define_hex FLASH_SIZE 0x00200000;flash的大小
4.3核心起始地址的修改
修改檔案:uClinux-dist/linux-2.4.x/arch/armnommu/Makefile
修改內容:
ifeq ($(CONFIG_BOARD_MBA44),y)
-TEXTADDR = 0x0c000000
+TEXTADDR = 0x0c008000
MACHINE = S3C44B0X
INCDIR = $(MACHINE)
-CORE_FILES := $(CORE_FILES) romfs.o
+CORE_FILES := $(CORE_FILES) #romfs.o
endif
說明:
TEXTADDR:核心的起始地址,通常取值:DRAM_BASE+0x8000。
4.4ROM檔案系統的定位修改
修改檔案:uClinux-dist/linux-2.4.x/drivers/block/blkmem.c
修改內容:
+#ifdef CONFIG_BOARD_MBA44
+ {0, 0xc700000, -1},/*{0, 0x100000, -1},*/
#endif
說明:將ROM file system在SDRAM中的地址定位在0xc700000。
4.5修改儲存空間配置
修改檔案:uClinux-dist/linux-2.4.x/include/asm-armnommu/arch-S3C44B0X/memory.h
修改內容:
-#define PHYS_OFFSET (DRAM_BASE + 2*1024*1024)
+#define PHYS_OFFSET (DRAM_BASE)//(DRAM_BASE + 2*1024*1024)
#define PAGE_OFFSET (PHYS_OFFSET)
-#define END_MEM (DRAM_BASE + DRAM_SIZE - 2*1024*1024)
+#define END_MEM (DRAM_BASE+DRAM_SIZE)//(DRAM_BASE + DRAM_SIZE - 2*1024*1024)
說明:PHYS_OFFSET:RAM第一個bank的起始地址。
4.6初始化節拍定時器
修改檔案:uClinux-dist/linux-2.4.x/include/asm-armnommu/arch-S3C44B0X/time.h
修改內容:
-extern void s3c44b0x_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+//extern void s3c44b0x_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static inline void s3c44b0x_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+ do_leds();
+ do_timer(regs);
+}//modified by hzh
/* TODO: THE, 2003-08-13, do timer setup like in eCos */
-#define S3C44B0X_TIMER5_PRESCALER 16
+#define S3C44B0X_TIMER5_PRESCALER 32
extern __inline__ void setup_timer (void)
{
u_int32_t tmod;
u_int32_t period;
+ __u32 rw_tmp;
period = (CONFIG_ARM_CLK/S3C44B0X_TIMER5_PRESCALER)/HZ;
outl(period, S3C44B0X_TCNTB5);
@@ -36,8 +42,14 @@
outl(tmod, S3C44B0X_TCON);
/* initialize the timer period and prescaler */
- outl((5-1) << 16, S3C44B0X_TCFG0);
- outl( (0x3 <<20), S3C44B0X_TCFG1); /* prescaler */
+ rw_tmp = inl(S3C44B0X_TCFG0);
+ rw_tmp &= ~(0xff<<16);
+ rw_tmp |= (16-1)<<16;
+ outl(rw_tmp, S3C44B0X_TCFG0); // prescaler = 1/16
+ rw_tmp = inl(S3C44B0X_TCFG1);
+ rw_tmp &= ~(0xf<<20);
+ rw_tmp |= 0<<20;
+ outl(rw_tmp, S3C44B0X_TCFG1); // mux = 1/2
說明:這裡,uClinux使用了S3C44B0X的內部定時器5,並利用定時器5的中斷來產生節拍。
4.7定義二級異常中斷向量表的起始地址
修改檔案:uClinux-dist/linux-2.4.x/include/asm-armnommu/proc/system.h
修改內容:
+#ifdef CONFIG_BOARD_MBA44
+#undef vectors_base()
+#define vectors_base() (DRAM_BASE)
+#endif
說明:vectors_base()定義了二級異常中斷向量表的起始地址,這個地址與Bootloader中的_IRQ_BASEADDRESS相對應。
4.8定義CPU體繫結構和交叉編譯器
修改檔案:uClinux-dist/linux-2.4.x/Makefile
修改內容:
-# ARCH := armnommu
+ARCH := armnommu
# ARCH := m68knommu
# ARCH := h8300
# ARCH := niosnommu
……
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
# CROSS_COMPILE = m68k-elf-
-# CROSS_COMPILE = arm-elf-
+CROSS_COMPILE = arm-elf-
# CROSS_COMPILE = h8300-elf-
# CROSS_COMPILE = nios-elf-
# CROSS_COMPILE = e1-coff-
說明:這裡定義了CPU體繫結構:ARCH := armnommu和對應的交叉編譯器名稱:CROSS_COMPILE = arm-elf-。
4.9乙太網路卡寄存器地址的位移量修改
這裡針對ARMSYS的硬體結構,要做兩處特殊的修改:
修改檔案:uClinux-dist/linux-2.4.x/driver/net/8390.h
修改內容:#define ETH_ADDR_SFT 8
說明:訪問RTL8019內部寄存器地址的位移量。
4.10乙太網路裝置基地址修改
修改檔案:uClinux-dist/linux-2.4.x/driver/net/ne.c
修改內容:dev->base_addr = base_addr = 0x08000000;
說明:修改了乙太網路裝置的基地址。
5.移植的步驟
5.1解壓uClinux-dist發行包
到以下地址下載uClinux-dist-20040408.tar.gz原始碼包:
http://www.uclinux.org/pub/uClinux/dist/uClinux-dist-20040408.tar.gz
該版本在很多方面比早先的20030522版本要完善很多,這也使我們的移植工作變得方便很多。其中使用的核心版本是Linux 2.4.24。
以下工作在裝有Linux作業系統(例如RedHat9.0)的PC機上進行。
將uClinux-dist-20040408.tar.gz拷貝到/home/下(或者其它目錄都可以),運行解壓命令:
tar xvzf uClinux-ARMSYS-20040801.tar.gz
解壓結束後會在/home/下產生uClinux-dist目錄。
5.2安裝補丁
到以下地址下載補丁檔案:
http://www.hzlitai.com.cn/download/uClinux-20040408-ARMSYS.rar
解壓後產生patch檔案,安裝patch檔案:
patch –p1 < uClinux-20040408-ARMSYS.patch
安裝過程中可能會出現一些錯誤資訊,可以手動地按照patch檔案的內容在指定的檔案處進行修改一下。
6.配置與編譯
6.1安裝編譯環境
到以下地址下載arm-elf工具鏈:
http://www.uclinux.org/pub/uClinux/m68k-elf-tools/arm-elf-tools-20030314.sh
將arm-elf-tools-20030314.sh拷貝到根目錄,運行安裝:
sh arm-elf-tools-20030314.sh
6.2核心配置
下面就可以開始配置uClinux的核心和使用者選項了。開啟終端。
# cd /home/uClinux-dist
# make menuconfig
進入uClinux配置(uClinux v3.1.0 Configuration),選中“Kernel/Library/Defaults Selectionà”敲空格進入。其中有兩個選項:定製核心設定和定製使用者選項設定:
[*] Customize Kernel Settings
[ ] Customize Vendor/User Settings
選中定製核心設定選項,按下ESC鍵退出,在詢問是否儲存時,選擇Yes並斷行符號。
終端將首先進入核心配置選單。我們在配置uClinux核心時,就可以通過對這些選項的選擇和取消選擇來設定核心所具有的功能項。這也是裁減uClinux核心的基本方法。
每個選項都對應著一個宏定義,make menuconfig執行結束後,自動將配置結果儲存為.config檔案,將前一次的配置結果備份為.config.old檔案。
讀者可到http://www.hzlitai.com.cn/download/linux/8019/kernelconfig_eth 處下載核心設定檔(其中包括對網卡驅動的配置),讀者可對照進行配置。
6.3交叉編譯
按下面的步驟對uClinux源碼包進行編譯:
# make dep
# make clean (非必要)
# make lib_only
# make user_only
# make romfs
# make image
# make
初次移植時,在make lib_only到make這5步編譯過程中很可能產生錯誤,無法繼續下去。如果產生了錯誤,可以嘗試根據報告的錯誤內容修改一下來源程式,這一過程將有助於你熟悉uClinux核心來源程式的結構,或者可以跟我們聯絡 Support@hzlitai.com.cn 。
交叉編譯成功後,在uClinux-dist/目錄下產生images目錄,其中包含的3個檔案:image.ram, image.rom和romfs.img就是我們可以使用的二進位檔案。參考《uClinux的移植包在ARMSYS上的使用說明》的方法,下載或燒錄這些二進位檔案,並啟動運行uClinux。