上一篇 启动流程
移植的u-boot从sd卡启动 主板是4412
编译环境及源码版本: Ubuntu 16 u-boot -2020-01.tar.bz2
因为4412 是armv7架构 我们找一个类似板级复制
tar xvf u-boot -2020-01.tar.bz2 //解压
cd u-boot -2020-01.tar.bz2/
cp board/samsung/origen/ board/samsung/wqj4412/ -r
mv board/samsung/wqj4412/origen.c board/samsung/wqj4412/wqj4412.c
接着修改u-boot-2020.01/board/samsung/wqj4412/tools/mkorigenspl.c 将其改为mkwqj4412spl.c
然后修改 u-boot-2020.01/board/samsung/wqj4412/里面的文件内容orign全部改为wqj4412
上面的配置文件需要下面这些 我们继续复制类似板级
cp include/configs/origen.h include/configs/wqj4412.h
cp configs/origen_defconfig configs/wqj4412_defconfig
cp arch/arm/dts/exynos4412-odroid.dts arch/arm/dts/exynos4412-wqj4412.dts
由于添加了板级 我们需要在makefile中给添加进去
在arch/arm/dts/Makefile 添加
exynos4210-trats.dtb
exynos4412-trats2.dtb
exynos4412-wqj4412.dtb
exynos4412-odroid.dtb
启动内核需要添加id
修改arch/arm/include/asm/mach-types.h,增加wqj4412的 ID
#define MACH_TYPE_NASM25 5112
#define MACH_TYPE_TOMATO 5113
#define MACH_TYPE_OMAP3_MRC3D 5114
#define MACH_TYPE_WQJ4412 5115
接着修改可视化的配置选项
修改arch/arm/mach-exynos/Kconfig
添加
config TARGET_WQJ4412
bool “Exynos4412 Wqj4412 board”
select SUPPORT_SPL
然后底部添加路径
source "board/samsung/wqj4412/Kconfig"
记住复制里面的文件origen 改为wqj4412
添加白名单 /u-boot-2020.01/scripts/config_whitelist.txt
CONFIG_WQJ4412
然后编译 make distclean
make wqj4412_defconfig
进入make menuconfig
选的 wqj4412board
make
出现警告 不用管它。
此时已经生成了u-boot.bin 还有spl,不过还不能用 结合Uboot启动过程 还需要修改代码。
未完待续。。。。。。
修改源码spl生成校验 board/samsung/wqj4412/tools/mkwqj4412spl.c
修改成这个
#define IMG_SIZE (14*1024) //16*1024
#define SPL_HEADER_SIZE 0 //16
第二处 去掉
#if 0
for (i = 0; i < IMG_SIZE - SPL_HEADER_SIZE; i++)
checksum += buffer[i+16];
*(unsigned long *)buffer ^= 0x1f;
*(unsigned long *)(buffer+4) ^= checksum;
for (i = 1; i < SPL_HEADER_SIZE; i++)
buffer[i] ^= buffer[i-1];
#endif
添加 因为14k-4处校验
for (i = 0; i < IMG_SIZE - 4; i++)
checksum += (unsigned char)buffer[i];
*(unsigned int *)&buffer[i] = checksum;
添加点灯程序 在start.s
.globl save_boot_params_ret
.globl led_on
#ifdef CONFIG_ARMV7_LPAE
.global switch_to_hypervisor_ret
#endif
led_on:
ldr r0, =0x11000100 @ GPMl2_0
ldr r1, =0x00000001 @ Configurate GPM4_0<A1>GPM4_1<A2>GPM4_2<A2>GPM4_3 output
str r1, [r0]
mov r1, #0x01 @ light All led on
ldr r0, =0x11000104 @ GPM4DAT Register
str r1, [r0]
ldr r0, =0x11000060 @ GPMk1_1
ldr r1, =0x00000010 @ Configurate GPM4_0<A1>GPM4_1<A2>GPM4_2<A2>GPM4_3 output
str r1, [r0]
mov r1, #0x02 @ light All led on
ldr r0, =0x11000064 @ GPM4DAT Register
str r1, [r0]
mov pc, lr
reset:
bl led_on
编译生成代码
cat E4412_N.bl1.bin wqj4412-spl.bin u-boot.bin > u-boot-wqj-4412.bin
dd iflag=dsync oflag=dsync if=u-boot-wqj-4412.bin of=$1 seek=1
烧写进入sd卡 发现两个小灯已经亮了 说明bl2已经被加载成功
灯刚亮然后就灭 是因为没有供电锁存。
修改Power.c power.h
static uint32_t exynos4_get_reset_status(void)
{
#ifdef CONFIG_WQJ4412
struct exynos4x12_power *power =
(struct exynos4x12_power *)samsung_get_base_power();
#else
struct exynos4_power *power =
(struct exynos4_power *)samsung_get_base_power();
#endif
return power->inform1;
}
static void exynos4x12_set_ps_hold_ctrl(void)
{
struct exynos4x12_power *power =
(struct exynos4x12_power *)samsung_get_base_power();
/* Set PS-Hold high */
setbits_le32(&power->ps_hold_control,EXYNOS_PS_HOLD_CONTROL_DATA_HIGH);
writel(0x3, (unsigned int *)0x11000c08);
}
/*
* Set ps_hold data driving value high
* This enables the machine to stay powered on
* after the initial power-on condition goes away
* (e.g. power button).
*/
void set_ps_hold_ctrl(void)
{
#ifdef CONFIG_WQJ4412
if (cpu_is_exynos4())
exynos4x12_set_ps_hold_ctrl();
#else
if (cpu_is_exynos5())
exynos5_set_ps_hold_ctrl();
#endif
}
另外power.h添加结构体struct exynos4x12_power
修改include/configs / wqj4412.h
#define CONFIG_WQJ4412 1 /* working with ORIGEN*/ 改成这个 然后编译
报错
此时修改exynos4_setup.h 将其#ifdef CONFIG_WQJ4412 改成这个
编译