【原创文章转载请注明出处】
以mini2440开发板为目标分析uboot 2010.06代码结构。
目录结构:
u-boot-2010.06
├── api
├── arch
│ ├── arm
│ │ ├── config.mk
│ │ ├── cpu
│ │ │ ├── arm1136
│ │ │ ├── arm1176
│ │ │ ├── arm720t
│ │ │ ├── arm920t
│ │ │ │ ├── config.mk
│ │ │ │ ├── cpu.c
│ │ │ │ ├── interrupts.c
│ │ │ │ ├── Makefile
│ │ │ │ ├── s3c24x0
│ │ │ │ │ ├── interrupts.c
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── speed.c
│ │ │ │ │ ├── timer.c
│ │ │ │ │ ├── usb.c
│ │ │ │ │ ├── usb_ohci.c
│ │ │ │ │ └── usb_ohci.h
│ │ │ │ ├── start.S
│ │ │ │ └── u-boot.lds
│ │ │ ├── arm925t
│ │ │ ├── arm926ejs
│ │ │ ├── arm946es
│ │ │ ├── arm_cortexa8
│ │ │ ├── arm_intcm
│ │ │ ├── ixp
│ │ │ ├── lh7a40x
│ │ │ ├── pxa
│ │ │ ├── s3c44b0
│ │ │ └── sa1100
│ │ ├── include
│ │ │ └── asm
│ │ │ ├── arch-a320
│ │ │ ├── arch-arm720t
│ │ │ ├── arch-arm925t
│ │ │ ├── arch-arm926ejs
│ │ │ ├── arch-at91
│ │ │ ├── arch-at91rm9200
│ │ │ ├── arch-davinci
│ │ │ ├── arch-ep93xx
│ │ │ ├── arch-imx
│ │ │ ├── arch-ixp
│ │ │ ├── arch-kirkwood
│ │ │ ├── arch-ks8695
│ │ │ ├── arch-lpc2292
│ │ │ ├── arch-mx25
│ │ │ ├── arch-mx27
│ │ │ ├── arch-mx31
│ │ │ ├── arch-mx51
│ │ │ ├── arch-nomadik
│ │ │ ├── arch-omap
│ │ │ ├── arch-omap24xx
│ │ │ ├── arch-omap3
│ │ │ ├── arch-orion5x
│ │ │ ├── arch-pxa
│ │ │ ├── arch-s3c24x0
│ │ │ │ ├── memory.h
│ │ │ │ ├── s3c2400.h
│ │ │ │ ├── s3c2410.h
│ │ │ │ ├── s3c24x0_cpu.h
│ │ │ │ └── s3c24x0.h
│ │ │ ├── arch-s3c44b0
│ │ │ ├── arch-s3c4510b
│ │ │ ├── arch-s3c64xx
│ │ │ ├── arch-s5pc1xx
│ │ │ ├── arch-sa1100
│ │ │ ├── arch-spear
│ │ │ ├── arch-tnetv107x
│ │ │ ├── atomic.h
│ │ │ ├── bitops.h
│ │ │ ├── byteorder.h
│ │ │ ├── cache.h
│ │ │ ├── config.h
│ │ │ ├── dma-mapping.h
│ │ │ ├── errno.h
│ │ │ ├── global_data.h
│ │ │ ├── hardware.h
│ │ │ ├── io.h
│ │ │ ├── mach-types.h
│ │ │ ├── macro.h
│ │ │ ├── memory.h
│ │ │ ├── posix_types.h
│ │ │ ├── proc-armv
│ │ │ ├── processor.h
│ │ │ ├── ptrace.h
│ │ │ ├── setup.h
│ │ │ ├── sizes.h
│ │ │ ├── string.h
│ │ │ ├── system.h
│ │ │ ├── types.h
│ │ │ ├── u-boot-arm.h
│ │ │ ├── u-boot.h
│ │ │ └── unaligned.h
│ │ └── lib
│ │ ├── _ashldi3.S
│ │ ├── _ashrdi3.S
│ │ ├── board.c
│ │ ├── bootm.c
│ │ ├── cache.c
│ │ ├── cache-cp15.c
│ │ ├── div0.c
│ │ ├── _divsi3.S
│ │ ├── eabi_compat.c
│ │ ├── interrupts.c
│ │ ├── _lshrdi3.S
│ │ ├── Makefile
│ │ ├── _modsi3.S
│ │ ├── reset.c
│ │ ├── _udivsi3.S
│ │ └── _umodsi3.S
│ ├── avr32
│ ├── blackfin
│ ├── i386
│ ├── m68k
│ ├── microblaze
│ ├── mips
│ ├── nios2
│ ├── powerpc
│ ├── sh
│ └── sparc
├── board
│ ├── a3000
│ ├── actux1
│ ├── actux2
│ ├── actux3
│ ├── actux4
│ ├── adder
│ ├── afeb9260
│ │ ...
│ ├── samsung
│ │ ├── goni
│ │ ├── smdk2400
│ │ │ ├── config.mk
│ │ │ ├── flash.c
│ │ │ ├── lowlevel_init.S
│ │ │ ├── Makefile
│ │ │ └── smdk2400.c
│ │ ├── smdk2410
│ │ │ ├── config.mk
│ │ │ ├── flash.c
│ │ │ ├── lowlevel_init.S
│ │ │ ├── Makefile
│ │ │ └── smdk2410.c
│ │ ├── smdk6400
│ │ └── smdkc100
│ │ ...
│ ├── xm250
│ ├── xsengine
│ ├── zeus
│ ├── zpc1900
│ └── zylonite
├── CHANGELOG
├── CHANGELOG-before-U-Boot-1.1.5
├── common
├── config.mk
├── COPYING
├── CREDITS
├── disk
├── doc
├── drivers
│ ├── bios_emulator
│ ├── block
│ ├── dma
│ ├── fpga
│ ├── gpio
│ ├── hwmon
│ ├── i2c
│ ├── input
│ ├── misc
│ ├── mmc
│ ├── mtd
│ ├── net
│ ├── pci
│ ├── pcmcia
│ ├── power
│ ├── qe
│ ├── rtc
│ ├── serial
│ ├── spi
│ ├── twserial
│ ├── usb
│ ├── video
│ └── watchdog
├── examples
│ ├── api
│ └── standalone
├── fs
│ ├── cramfs
│ ├── ext2
│ ├── fat
│ ├── fdos
│ ├── jffs2
│ ├── Makefile
│ ├── reiserfs
│ ├── ubifs
│ └── yaffs2
├── include
├── lib
├── MAINTAINERS
├── MAKEALL
├── Makefile
├── mkconfig
├── nand_spl
├── net
├── onenand_ipl
├── post
├── README
├── rules.mk
└── tools
861 directories, 6452 files
|
2010.06版本的uboot代码确实不少,看上去就很头疼,不仅如此,目录结构也与以前的版本有些变化。
首先看一下代码的根目录:
u-boot-2010.06
├── api 存放uboot提供的接口函数
├── arch 与体系结构相关的代码,uboot的重头戏
├── board 根据不同开发板定制的代码,代码也不少
├── common 通用的代码,涵盖各个方面,已命令行处理为主
├── disk 磁盘分区相关代码
├── doc 文档,一堆README开头的文件
├── drivers 驱动,很丰富,每种类型的设备驱动占用一个子目录
├── examples 示例程序
├── fs 文件系统,支持嵌入式开发板常见的文件系统
├── include 头文件,已通用的头文件为主
├── lib 通用库文件
├── nand_spl NAND存储器相关代码
├── net 网络相关代码,小型的协议栈
├── onenand_ipl
├── post 加电自检程序
└── tools 辅助程序,用于编译和检查uboot目标文件
|
仅看uboot代码根目录,已经非常庞大了,当然,功能也很丰富。其实,最主要的是看对应的处理器和开发板代码,2010.06版本与处理器相关的代码集中在arch、board目录。下面先看一下arch目录:
arch
├── arm
├── avr32
├── blackfin
├── i386
├── m68k
├── microblaze
├── mips
├── nios2
├── powerpc
├── sh
└── sparc
|
arch目录内容比以前的版本干净多了,每个子目录代表一个处理器类型,子目录名称就是处理器的类型名称。我们重点是看s3c2440处理器,所以看一下arch/arm目录:
arch/arm
├── cpu
├── include
└── lib
|
arch/arm目录下有三个目录,实际上,其他的处理器目录下也是这个结构:
cpu子目录对应一种处理器的不同产品型号或者系列;
include子目录是处理器用到的头文件,毕竟,一种类型的处理器大方面是相同的;
lib目录对应用到处理器公用的代码;
下面是重头戏,arch/arm/cpu目录下的内容:
arch/arm/cpu
├── arm1136
├── arm1176
├── arm720t
├── arm920t
├── arm925t
├── arm926ejs
├── arm946es
├── arm_cortexa8
├── arm_intcm
├── ixp
├── lh7a40x
├── pxa
├── s3c44b0
└── sa1100
|
uboot支持几乎所有的arm类型处理器,arch/arm/cpu目录下,每个子目录包含了一种类型的arm处理器,我们关心的s3c2440处理器是arm920t类型的,所以继续看arch/arm/cpu/arm920t目录结构:
arch/arm/cpu/arm920t
├── a320
├── at91
├── at91rm9200
├── config.mk
├── cpu.c
├── ep93xx
├── imx
├── interrupts.c
├── ks8695
├── Makefile
├── s3c24x0 三星S3C2410,12,40,42的代码
├── start.S 整个uboot代码入口点
└── u-boot.lds 连接器脚本
|
这个目录不是很单纯了,除了几个子目录外,还有一些文件。arch/arm/cpu/arm920t目录下的每个子目录对应一个具体的处理器,在这个目录是因为他们都是arm920t类型的处理器,文件是可以公用的功能。这个目录比较重要的是start.S文件,这是一个汇编源文件,处理器的初始化代码在这个文件,也是整个uboot目标程序的入口点。u-boot.lds文件是ld程序也就是连接器的脚本文件,这个文件描述了如何连接目标文件,ld程序会根据这个文件的指示按照需求把不同的目标文件连接在一起生成供烧写到开发板的程序。
最后是s3c24x0目录了:
arch/arm/cpu/arm920t/s3c24x0
├── interrupts.c
├── Makefile
├── speed.c
├── timer.c
├── usb.c
├── usb_ohci.c
└── usb_ohci.h
|
这个目录下面的文件对应了处理器不同的功能,都是在初始化的使用用到的,不同处理器的配置方法不一样,所以每个处理器目录下都有自己需要的配置方式。
【原创文章转载请注明出处】