u-boot 版本:2016.03 用的交叉編譯工具:arm-none-linux-gnueabi- git倉庫: http://git.oschina.net/qqliyunpeng/ubootv2016_03forjz2440
1. 添加交叉編譯工具:
vi Makefile
ifeq ($(HOSTARCH),$(ARCH)) CROSS_COMPILE ?= else CROSS_COMPILE =arm-none-linux-gnueabi- endif
2. 添加名叫 lip2440 的闆子到 uboot 中:
更改的依據是 doc/READ.kconfig 的添加闆子的小貼士部分:
Conversion from boards.cfg to Kconfig ------------------------------------- Prior to Kconfig, boards.cfg was a primary database that contained Arch, CPU, SoC, etc. of all the supported boards. It was deleted when switching to Kconfig. Each field of boards.cfg was converted as follows: Status -> "S:" entry of MAINTAINERS Arch -> CONFIG_SYS_ARCH defined by Kconfig CPU -> CONFIG_SYS_CPU defined by Kconfig SoC -> CONFIG_SYS_SOC defined by Kconfig Vendor -> CONFIG_SYS_VENDOR defined by Kconfig Board -> CONFIG_SYS_BOARD defined by Kconfig Target -> File name of defconfig (configs/<target>_defconfig) Options -> CONFIG_SYS_EXTRA_OPTIONS defined by Kconfig Maintainers -> "M:" entry of MAINTAINERS Tips to add/remove boards ------------------------- When adding a new board, the following steps are generally needed: [1] Add a header file include/configs/<target>.h [2] Make sure to define necessary CONFIG_SYS_* in Kconfig: Define CONFIG_SYS_CPU="cpu" to compile arch/<arch>/cpu/<cpu> Define CONFIG_SYS_SOC="soc" to compile arch/<arch>/cpu/<cpu>/<soc> Define CONFIG_SYS_VENDOR="vendor" to compile board/<vendor>/commonKconfig. [4] Add a MAINTAINERS file It is generally placed at board/<board>/MAINTAINERS or board/<vendor>/<board>/MAINTAINERS [5] Add configs/<target>_defconfig |
2.1 添加闆子的頭檔案:
cp include/configs/smdk2410.h include/configs/lip2440.h
2.2 [2]這部分更改完 Kconfig 之後,make lip2440_config 自動生成。
這裡的目的是提示你自己在給闆子取名的時候要和檔案的名字對應起來。
2.3 添加一個 make menuconfig 的選項:
arch/arm/Kconfig 在 config TARGET_SMDK2410 bool "Support smdk2410" select CPU_ARM920T 的下邊并列的添加: config TARGET_LIP2440 bool "Support lip2440" select CPU_ARM920T 相應的在 source "board/samsung/smdk2410/Kconfig" 下邊并列的添加: source "board/samsung/lip2440/Kconfig"
2.4 添加一個 MAINTAINERS
一看位置, board/<board>/MAINTAINERS or board/<vendor>/<board>/MAINTAINERS,我們發現,沒有建立闆子的檔案夾呢,建立闆子的檔案夾:
cp board/samsung/smdk2410 board/samsung/lip2440 -rf
mv board/samsung/lip2440/smdk2410.c board/samsung/lip2440/lip2440.c
vi board/samsung/lip2440/Makefile
将: obj-y := smdk2441.o 更改為: obj-y := lip2440.o
vi board/samsung/lip2440/Kconfig
将: Kconfig 中的内容更改成 if TARGET_LIP2440
config SYS_BOARD default " lip2440"
config SYS_VENDOR default " samsung"
config SYS_SOC default " s3c24x0"
config SYS_CONFIG_NAME default " lip2440"
endif
将: MAINTAINERS 中的内容更改成 LIP2440 BOARD M: lip <[email protected]> S: Maintained F: board/samsung/ lip2440/ F: include/configs/ lip2440.h F: configs/ lip2440_defconfig
2.5 添加configs/<target>_defconfig:
cp configs/smdk2410_defconfig configs/lip2440_config_defconfig
vi configs/lip2440_defconfig
CONFIG_ARM=y CONFIG_TARGET_LIP2440=y CONFIG_SYS_PROMPT=" LIP2440 # " # CONFIG_CMD_SETEXPR is not set
至此,闆子添加的工作就做完了,現在,你可以用 make lip2440_config / make lip2440_defconfig 來把闆子的預設參數添加進 .config 檔案,并用 make 來生成 闆子配置相關的頭檔案了。
3. 實作序列槽列印:
3.1 幾個檔案路徑的總結:
- 闆子的頭檔案:include/configs/lip2440.h
- 闆子的檔案夾:board/samsung/lip2440/lip2440.c
- _main 函數的入口放在: arch/arm/lib/crt0.S
- 對于序列槽直接操作底層進行輸出的函數(比如putc,puts)處在:drivers/serial/serial_s3c24x0.c
- 對 get_ FCLK HCLK PCLK 的函數處在:arch/arm/cpu/arm920t/s3c24x0/speed.c
- 在 lip2440.c 中的 board_init() 函數中 gd->bd->bi_arch_number = MACH_TYPE_S3C2440,在 arch/arm/include/asm/mach-types.h 中定義 有 MACH_TYPE_S3C2440 362 ,這個值與 linux核心中的 arch/arm/tools/mach-types 中相對應
3.2更改配置的宏:
vi include/configs/lip2440.h
将注釋中的所有 闆子 SAMSUNG SMDK2410 更改為 LIP2440 将代碼中的 2410 字眼改成 2440 : 用全局替換 :%s/2410/2440/g 特殊的更改:
#define CONFIG_S3C24X0 #define CONFIG_S3C2440 #define CONFIG_LIP2440
norflash 使用的是 cfi 的 flash,是以删除 #define CONFIG_FLASH_CFI_LEGACY 更改 sdram 的扇區數量 #define CONFIG_SYS_MAX_FLASH_SECT ( 35) 更改不是可能不全,自己好好查查就行。
3.3 更改 FCLK HCLK PCLK :
FCLK : HCLK : PCLK => 400 : 100 : 50 屏蔽中斷和分頻比例:
vi arch/arm/cpu/arm920t/start.S
@@ -74,16 +74,16 @@ copyex: mov r1, #0xffffffff ldr r0, =INTMSK str r1, [r0] -# if defined(CONFIG_S3C2410) - ldr r1, =0x3ff +# if defined(CONFIG_S3C2440) + ldr r1, =0x7fff ldr r0, =INTSUBMSK str r1, [r0] # endif
- - + + ldr r0, =CLKDIVN - mov r1, #3 + mov r1, #5 str r1, [r0] #endif
vi board/samsung/lip2440/lip2440.c
#elif (FCLK_SPEED == 1) #define M_MDIV 92 #define M_PDIV 1 #define M_SDIV 1 #endif
#elif (USB_CLOCK == 1) #define U_M_MDIV 56 #define U_M_PDIV 2 #define U_M_SDIV 2 #endif
修改 SDRAM 的時序: #define B1_BWSCON ( DW16) #define B2_BWSCON (DW16) #define B3_BWSCON (DW16) #define B4_BWSCON ( DW32) #define B5_BWSCON (DW16) #define B6_BWSCON (DW32) #define B7_BWSCON (DW32)
#define B0_Tacs 0x3 #define B0_Tcos 0x3 #define B0_Tacc 0x7 #define B0_Tcoh 0x3 #define B0_Tah 0x3 #define B0_Tacp 0x1 #define B0_PMC 0x0
#define B1_Tacs 0x1 #define B1_Tcos 0x1 #define B1_Tacc 0x6 #define B1_Tcoh 0x1 #define B1_Tah 0x1 #define B1_Tacp 0x0 #define B1_PMC 0x0
#define B2_Tacs 0x1 #define B2_Tcos 0x1 #define B2_Tacc 0x6 #define B2_Tcoh 0x1 #define B2_Tah 0x1 #define B2_Tacp 0x0 #define B2_PMC 0x0
#define B3_Tacs 0x1 #define B3_Tcos 0x1 #define B3_Tacc 0x6 #define B3_Tcoh 0x1 #define B3_Tah 0x1 #define B3_Tacp 0x0 #define B3_PMC 0x0
#define B4_Tacs 0x1 #define B4_Tcos 0x1 #define B4_Tacc 0x6 #define B4_Tcoh 0x1 #define B4_Tah 0x1 #define B4_Tacp 0x0 #define B4_PMC 0x0
#define B5_Tacs 0x1 #define B5_Tcos 0x1 #define B5_Tacc 0x6 #define B5_Tcoh 0x1 #define B5_Tah 0x1 #define B5_Tacp 0x0 #define B5_PMC 0x0
#define REFEN 0x1 #define TREFMD 0x0 #define Trp 0x1 #define Trc 0x1 #define Tchr 0x2 #define REFCNT 1268
3.4 添加nandflash 相關的驅動:
cp drivers/mtd/nand/s3c2410_nand.c drivers/mtd/nand/s3c2440_nand.c
進入 s3c2440_nand.c 将所有 2410 改成 2440 :%s/2410/2440/g 更改 Makefile 的支援: 在 obj-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o 下邊添加: obj-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o
4. 現在,你可以編譯你的工程了:
make distclean make lip2440_config make all
用jlink下載下傳到闆子上的 norflash 後序列槽輸出結果是: U-Boot 2016.03-00001-g79e6686 (May 04 2016 - 15:06:58 +0800)
CPUID: 32440001 FCLK: 400 MHz HCLK: 100 MHz PCLK: 50 MHz DRAM: 64 MiB WARNING: Caches not enabled Flash: 2 MiB NAND: 0 MiB *** Warning - bad CRC, using default environment
In: serial Out: serial Err: serial Net: CS8900-0 Error: CS8900-0 address not set.
LIP2440 #
5. 補充:
在後期調試的過程中發現了一個bug,用 print 列印環境量: LIP2440 # print baudrate=115200 bootdelay=6 ethact=CS8900-0 ipaddr=10.0.0.110 netmask=255.255.255.0 serverip=10.0.0.1 stderr=serial stdin=serial stdout=serial 更改其中的 bootdelay :setenv bootdelay 6 ,然後 saveenv,reset LIP2440 # save Saving Environment to Flash... Un-Protected 1 sectors Erasing Flash... . done Erased 1 sectors Writing to Flash... 9....8....7....6....5....4....3....2....1....done Protected 1 sectors LIP2440 # reset resetting ... 闆子重新開機不了 在做完 u-boot移植2 後 檢視 u-boot.bin 的大小,發現為 513164 跟這個相關的宏是: CONFIG_ENV_ADDR 修改方法是: -#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000) +#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x100000)
删除的這一句目的是 為 uboot 程式留出了 0x070000 (448k) 大小的空間,明顯,程式要大于此,是以,當你儲存環境變量的時候,覆寫了源代碼,導緻下次啟動不起來,新加的這行 為 uboot 程式留出了 1M 大小的空間,我們的 norflash 的大小是 2M 還是能滿足的。
參考部落格:
趙春江的專欄 jetli