在配置uclinux是添加菜單:
一.
在linux 2.4的menuconfig中,添加驅動程式菜單,需要修改兩個檔案
config.in(也可能為Config.in)和Makefile
如:把程式mydriver.c放在drivers/char目錄下
1.修改drivers/char/Config.in,在合適的位置加上一行:
tristate 'XXXXXXXX' CONFIG_XXXX
2. 然後需要修改drivers/char/Makefile,在合適的位置,加上
obj-$(CONFIG_XXXX) += mydriver.o
這樣,就可以在make menuconfig時選擇配置自己的驅動程式了
二.在menuconfig中加入菜單:
要想添加自己的選項,可以在uClinux-dist/linux-2.4.x/arch/armnommu/config檔案中加入:比如要添加一個xxxxx菜單:
mainmenu_option next_comment
comment ‘xxxxxx’
tristate 'xxxxxx?' CONFIG_xxxx
if [ "$CONFIG_xxxx" != "n" ]; then
//如果選擇該選項,則調用相應目錄的config.in顯示下一級菜單,原理與這個相同
source drivers/xxxx/Config.in
fiendmenu
此菜單出現在自訂核心的 第一級菜單,要顯示下一級菜單,則在相應目錄的config.in開頭,添加:(比如添加一個MTD驅動,則在drivers/MTD/Config,in)
mainmenu_option next_comment
Comment 'Memory Technology Devices (MTD)'
tristate 'Memory Technology Device (MTD) support' CONFIG_MTD
Comment引號裡面的為顯示的內容,tristate後面表示選擇此選項,則CONFIG_MTD為真,為後面的程式進行條件編譯
比如選中此選項後要出現相應的選項進行選擇,則可以如下面所示:
if [ "$CONFIG_MTD" = "y" -o "$CONFIG_MTD" = "m" ]; then
bool 'Debugging' CONFIG_MTD_DEBUG
if [ "$CONFIG_MTD_DEBUG" = "y" ]; then
int ' Debugging verbosity (0 = quiet, 3 = noisy)' CONFIG_MTD_DEBUG_VERBOSE 0
fi
dep_tristate ' MTD partitioning support' CONFIG_MTD_PARTITIONS $CONFIG_MTD
dep_tristate ' MTD concatenating support' CONFIG_MTD_CONCAT $CONFIG_MTD
dep_tristate ' RedBoot partition table parsing' CONFIG_MTD_REDBOOT_PARTS $CONFIG_MTD_PARTITIONS
dep_tristate ' Command line partition table parsing' CONFIG_MTD_CMDLINE_PARTS $CONFIG_MTD_PARTITIONS
if [ "$CONFIG_ARM" = "y" ]; then
dep_tristate ' Compaq bootldr partition table parsing' CONFIG_MTD_BOOTLDR_PARTS $CONFIG_MTD_PARTITIONS
dep_tristate ' ARM Firmware Suite partition parsing' CONFIG_MTD_AFS_PARTS $CONFIG_MTD_PARTITIONS
fi
fi
fi用來表示一個if條件的結束。
dep_tristate後面引號內的內容就是選擇時出現的菜單內容,dep_tristate用於tristate的下一級菜單顯示,後面的選項意義同上。
與平台相關的代碼:
需要修改的系統源碼主要有如下幾處:
(1) bootloader相關代碼。此代碼位於/uClinux/linux-2.4.x/arch/armnommu/boot/compressed/目錄下名為head.s的檔案中。此處程式用組合語言實現,需要修改的地方主要是設定memory map的代碼,與memory controller的硬體實現相關。
(2) drivers li mian UART deng相關代碼。UART相關代碼位於/uClinux/linux-2.4.x/drivers/char目錄下的serial.c,並修改uClinux-2.4.x/drivers/Makefile,添加相應的驅動
(3) 定時器相關代碼。uClinux中有如下函數調用star_kernel()->time_init()->setup_timer(),需要修改uClinux-2.4.x/include/asm-armnommu/arch-s3c44b0/time.h setup_timer()函數中的相關代碼,hardware.h。
uClinux-2.4.x/arch/armnommu/mach-s3c44b0/time.c
(4) 中斷控制器相關。/uClinux/linux-2.4.x/arch/armnommu/mach-s3c44b0/irq.c
(5) 修改uClinux-2.4.x/arch/armnommu/kernel/entry-armv.S
修改uClinux-2.4.x/arch/armnommu/kernel/head-armv.S
修改 uClinux-2.4.x/arch/armnommu/mm/proc-arm6,7.S
在uClinux-dist/linux-2.4.x/arch/armnommu目錄下添加相應CPU的檔案夾
並修改armnommu下面的config.in和Makefile.
修改uClinux-dist/linux-2.4.x/arch/armnommu/boot/compressed目錄下的Makefile
修改uClinux-dist/linux-2.4.x/arch/armnommu/boot下的Makefile
修改uClinux-2.4.x/arch/armnommu/kernel/entry-armv.S
修改uClinux-2.4.x/arch/armnommu/kernel/head-armv.S
修改 uClinux-2.4.x/arch/armnommu/mm/proc-arm6,7.S
修改uClinux-2.4.x/drivers/Makefile
在修改原始碼時,可按照uclinux啟動和執行順序依次修改整個平台。
uclinux的移植大致可以分為:
·結構層次的移植,如果待移植處理器的結構不同於任何已經支援的處理器結構,
則需要修改linux/arch目錄下相關處理器結構的檔案。雖然uclinux核心代碼的
大部分是獨立於處理器和其體繫結構的,但是其最低級的代碼也是特定於各個系
統的。這主要表現在它們的中斷處理上下文、記憶體映射的維護、任務上下文和初
始化過程都是獨特的。這些例行程式位於linux/arch/目錄下。由於linux所支援
體繫結構的種類繁多,所以對一個新型的體系,其低級常式可以模仿與其相似的
體系常式編寫。
·平台層次的移植,如果待移植處理器是某種uclinux已支援體系的分支處理器,
則需要在相關體繫結構目錄下建立相應目錄並編寫相應代碼。如mc68ez328就
是基於無mmu的m68k核心的。此時的移植需要建立
linux/arch/m68knommu/platform/ mc68ez328目錄並在其下編寫跟蹤程式(實現
使用者程式到核心功能的介面等功能)、中斷控制發送器和向量初始化程式等。
下面以添加 s3c44b0為例:
一、加入S3C44B0的在make menuconfig時的廠商/產品選項。
在uClinux-dist/vendors/Samsung下建立S3C44B0目錄,將uClinux-dist/vendors/Samsung10B下的內容全部複製到S3C44B0目錄下。這裡有幾個檔案較為重要:
“config.linux-2.4.x”這個是linux核心編譯配置選項檔案。現在針對S3C44B0我們要修改的是# System Type到# General setup之間的內容。修改如下:
#
# System Type
#
# CONFIG_ARCH_DSC21 is not set
# CONFIG_ARCH_CNXT is not set
# CONFIG_ARCH_SWARM is not set
CONFIG_ARCH_S3C44B0=y #指明是處理器類型是S3C44B0
# CONFIG_ARCH_ATMEL is not set
CONFIG_NO_PGT_CACHE=y
CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
CONFIG_CPU_ARM710=y
CONFIG_CPU_WITH_CACHE=y
# CONFIG_CPU_WITH_MCR_INSTRUCTION is not set
CONFIG_SERIAL_S3C44B0=y #使用S3C44B0的串口
DRAM_BASE=0x0c000000 #SDRAM起始是地址
DRAM_SIZE=0x00800000 #SDRAM大小
FLASH_MEM_BASE=0x00000000 #FLASH起始地址
FLASH_SIZE=0x00200000 #FLASH大小
#
# General setup
以後的make都以CONFIG_ARCH_S3C44B0=y這選項來解決是編譯和S3C44B0相關的其他選項。
在make config後在Vendor/Product下可以看到有Samsung/S3C44B0的選項了
二、在linux核心加入對44B0處理器的支援。
上面講了如何在uClinux中加入S3C44B0的在make config時的廠商/產品選項。現在主要講述如何在在uClinux的核心加入對44B0處理器的支援。
因為三星的S3C44B0X處理器無MMU。這裡主要修改uClinux-dist/linux-2.4.x/arch/armnommu下的config.in和Makefile。config.in是我們在make config時選擇Customiae Kernel Settings(自訂核心)時的編譯項設定檔。
在config.in裡找有關4510的編譯選項“CONFIG_ARCH_SAMSUNG”:
#--------------------------------------------------------------------
# S y s t e m
#--------------------------------------------------------------------
mainmenu_option next_comment
comment 'System Type'
choice 'ARM system type' /
"TI-DSC21 CONFIG_ARCH_DSC21 /
Conexant CONFIG_ARCH_CNXT /
SWARM CONFIG_ARCH_SWARM / Samsung CONFIG_ARCH_SAMSUNG /
S3C44B0 CONFIG_ARCH_S3C44B0 /
Atmel CONFIG_ARCH_ATMEL" TI-DSC21
其中“S3C44B0 CONFIG_ARCH_S3C44B0 /”是要加入的