uClinux在S3C4510上的啟動分析2(ZT)

來源:互聯網
上載者:User
在配置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 /”是要加入的

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.