移植u-boot 2015.01到JZ2440上將分爲很多篇幅來寫,由於JZ2440相對比IMX8簡單很多,更適合用來學習uboot
本系列主要思路如下:
1. 移植uboot-2015.01到JZ2440板子上並正常運行起來,解決過程中的bugs
2. 一步一步分析uboot源碼,優化uboot過程
u-boot 2015中並沒有提供JZ2440的定製代碼,我們需要將最接近的smdk2410的板子信息移植過來
>>>>>移植UBOOT到ARM板子上的一般步驟
1. 創建ARM板文件
在board/samsung/文件下創建jz2440文件夾
將board/samsung/smdk2410下的所有文件複製到board/samsung/jz2440下
將board/samsung/jz2440下的smdk2410.c重命名爲jz2440.c
修改jz2440.c(在整個文件中只有一處2410的設置,如下):
將 gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;改爲:
gd->bd->bi_arch_number = MACH_TYPE_JZ2440;
修改writel(0x000007FF, &gpio->gphup);爲writel(0x000007F3, &gpio->gphup);設置串口上拉
在arch/arm/include/asm/mach-types.h增加對MACH_TYPE_JZ2440的定義
#define MACH_TYPE_JZ2440 194
同時增加machine ARCH的定義:
#ifdef CONFIG_ARCH_JZ2440
# ifdef machine_arch_type
# undef machine_arch_type
# define machine_arch_type __machine_arch_type
# else
# define machine_arch_type MACH_TYPE_JZ2440
# endif
# define machine_is_jz2440() (machine_arch_type == MACH_TYPE_JZ2440)
#else
# define machine_is_jz2440() (0)
#endif
2. 創建ARM板的Kconfig文件
修改board/samsung/jz2440下Kconfig文件如下:
if TARGET_JZ2440
config SYS_BOARD //在編譯時用來識別ARM板子所在board/廠商文件夾下板子文件夾的名字
default "jz2440"
config SYS_VENDOR //在編譯時用來識別ARM板子所在board下的廠商文件夾
default "samsung"
config SYS_SOC
default "s3c24x0"
config SYS_CONFIG_NAME //用來識別ARM板子的頭文件名字include/configs/SYS_CONFIG_NAME.h
default "jz2440"
endif
3. 創建ARM板子的Makefile
修改board/samsung/jz2440下Makefile文件如下:
將obj-y := smdk2410.o修改爲obj-y := jz2440.o
4. 創建ARM板子的defconfig文件
複製configs/smdk2410_defconfig到configs/jz2440_defconfig
修改configs/jz2440_defconfig中的 CONFIG_TARGET_SMDK2410=y爲CONFIG_TARGET_JZ2440=y
5. 創建ARM板子的頭文件
複製include/configs/smdk2410.h到include/configs/jz2440.h
修改include/configs/jz2440.h:
將文件中所有的S3C2410和SMDK2410全部替換爲JZ2440
6. 將ARM板子的Kconfig文件加入到ARM架構的Kconfig中
在arch/arm/Kconfig中增加:source "board/samsung/jz2440/Kconfig"
7. 創建ARM板子的config到系統的Kconfig中
在arch/arm/Kconfig中增加:
config TARGET_JZ2440
bool "Support jz2440"
select CPU_ARM920T
>>>>>修復移植過程中的問題:
1. 修改start.S文件
刪除老的時鐘配置:
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
增加新的時鐘配置:
/* FCLK:HCLK:PCLK = 1:4:8 */
/* default FCLK is 400 MHz ! */
ldr r0, =CLKDIVN
mov r1, #5 /* FCLK:HCLK:PCLK = 1:4:8 */
str r1, [r0]
/* 如果HDIVN非0,CPU的總線模式應該從“fast bus mode”變爲“asynchronous bus mode” */
mrc p15, 0, r1, c1, c0, 0 /* 讀出控制寄存器 */
orr r1, r1, #0xc0000000 /* 設置爲“asynchronous bus mode” */
mcr p15, 0, r1, c1, c0, 0 /* 寫入控制寄存器 */
2. 修改board/samsung/jz2440/jz2440.c
#elif FCLK_SPEED==1 /* Fout = 202.8MHz */
#define M_MDIV 0x5C
#define M_PDIV 0x1
#define M_SDIV 0x1
#endif
將M_MDIV的值從0xA1改爲0x5C,M_PDIV從0x3改爲0x1
將writel(0x000007FF, &gpio->gphup);改爲writel(0x000007F3, &gpio->gphup);
3. 複製drivers/mtd/nand/s3c2410_nand.c到drivers/mtd/nand/jz2440_nand.c:
將jz2440_nand.c中的所有S3C2410替換爲JZ2440
在drivers/mtd/nand/Makefile中增加obj-$(CONFIG_NAND_JZ2440) += jz2440_nand.o
4. 修改drivers/serial/serial_s3c24x0.c:
刪除uart fifo的配置:writel(0x07, &uart->ufcon); writel(0x0, &uart->umcon);
修改writel(0x245, &uart->ucon);爲writel(0x5, &uart->ucon);
>>>>>編譯燒寫uboot:
1. 配置交叉編譯地址 export CROSS_COMPILE=xxx/arm-linux-
2. 配置ARM架構 export ARCH=arm
3. make jz2440_defconfig
4. make
5. oflash u-boot.bin
注意此時u-boot.bin只支持NOR啓動,燒寫到Nor Flash中即可啓動板子