uClinux在S3C4510上的启动分析2(ZT)

在配置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 /”是要加入的

你可能感兴趣的:(c,System,makefile,debugging,linux内核,Parsing)