在配置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
fi
endmenu
此菜单出现在自定义内核的 第一级菜单,要显示下一级菜单,则在相应目录的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-s 3c44b0/time.h setup_timer()函数中的相关代码,hardware.h。
uClinux-2.4.x/arch/armnommu/mach-s 3c44b0/time.c
(4) 中断控制器相关。/uClinux/linux-2.4.x/arch/armnommu/mach-s 3c44b0/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目录并在其下编写跟踪程序(实现
用户程序到内核函数的接口等功能)、中断控制调度程序和向量初始化程序等。
下面以添加 s 3c44b0为例:
一、加入S 3C44B0的在make menuconfig时的厂商/产品选项。
在uClinux-dist/vendors/Samsung下新建S 3C44B0目录,将uClinux-dist/vendors/Samsung10B下的内容全部复制到S 3C44B0目录下。这里有几个文件较为重要:
“config.linux-2.4.x”这个是linux内核编译配置选项文件。现在针对S 3C44B0我们要修改的是# 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_S 3C44B0=y #指明是处理器类型是S 3C44B0
# 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_S 3C44B0=y #使用S 3C44B0的串口
DRAM_BASE=0x 0c000000 #SDRAM起始是地址
DRAM_SIZE=0x00800000 #SDRAM大小
FLASH_MEM_BASE=0x00000000 #FLASH起始地址
FLASH_SIZE=0x00200000 #FLASH大小
#
# General setup
以后的make都以CONFIG_ARCH_S 3C44B0=y这选项来解决是编译和S 3C44B0相关的其他选项。
在make config后在Vendor/Product下可以看到有Samsung/S 3C44B0的选项了
二、在linux内核加入对44B0处理器的支持。
上面讲了如何在uClinux中加入S 3C44B0的在make config时的厂商/产品选项。现在主要讲述如何在在uClinux的内核加入对44B0处理器的支持。
因为三星的S 3C44B0X处理器无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 /
S 3C44B0 CONFIG_ARCH_S 3C44B0 /
Atmel CONFIG_ARCH_ATMEL" TI-DSC21
其中“S 3C44B0 CONFIG_ARCH_S 3C44B0 /”是要加入的