历史上的今天
返回首页

历史上的今天

今天是:2024年12月15日(星期日)

2021年12月15日 | Exynos4412 Uboot 移植(五)—— Uboot 移植过程

2021-12-15 来源:eefocus

Uboot 版本:u-boot-2013.01


开发板:FS_4412 平台(Exynos4412,可以根据自己的板子修改,只要是4412的过程都是一样的)


一、建立自己的平台


1、下载源码


我们可以在下面这个网站上下载最新的和以前任一版本的uboot


ftp://ftp.denx.de/pub/u-boot/


这里我们使用的是u-boot-2013.01


2、解压uboot 源码并进入目录

3、指定交叉编译工具链


a -- 打开根目录下的Makefile

b -- 添加交叉编译工具链信息

4、指定产品CPU


我们产品用的CPU 是exynos 4412


查看u-boot 源码该CPU 是否已支持


U-boot 已支持,见arch/arm/cpu/armv7/exynos/


5、指定产品BOARD


找一个最类似的board 配置修改, 这里我们参考的是board/samsung/origen/

a -- 修改board/samsung/ 板级相关文件夹,复制 board/samsung/origen/,重命名为fs4412

b -- 修改board/samsung/fs4412/Makefile信息

修改 origen.o 为 fs4412.o

c -- 修改include/configs/fs4412.h配置文件


这里同样是先复制 inlcude/configs/origen.h,生成 inlcude/configs/fs4412.h

打开fs4412.h,修改以下文件:


将原来的#define CONFIG_SYS_PROMPT "ORIGEN #" 改成:

将原来的#define CONFIG_IDENT_STRING for ORIGEN 改成

d -- 配置boards.cfg


打开uboot根目录下的boards.cfg,在origen后新增

6、编译u-boot


$ make distclean

$ make fs4412_config (可以在inlcude/config.mk及include/config.h下看到配置好的信息)

$ make

编译完成后生成的u-boot.bin 就是可执行的镜像文件。


烧写uboot 命令:


tftp 41000000 u-boot.bin


movi write uboot 41000000


但是该文件还不能在我们板子上运行,我们需要对u-boot 源代码进行相应的修改。


二、实现能看到串口终端信息


1、确认第一条指令有运行到(点灯法) 


a -- 在arch/arm/cpu/armv7/start.S 134 行后添加点灯程序

b --  添加三星加密方式


exynos 需要三星提供的初始引导加密后,我们的u-boot,才能被引导运行


将sdfuse_q 目录拷贝到u-boot-2013.01 源码目录下


注:sdfuse_q 三星提供的加密处理


将CodeSign4SecureBoot 目录拷贝到u-boot-2013.01 源码目录下


注:CodeSign4SecureBoot 三星提供的安全启动方式


c -- 修改Makefile


$vim Makefile


修改实现sdfuse_q 的编译


下添加

注意是tab 键缩进的,否则makefile 编译报错


注意如果执行了make distclean 需重新拷贝CodeSign4SecureBoot


d -- 拷贝编译脚本


将 build.sh 拷贝到uboot 根目录下,并加上执行权限,并执行该脚本 注:build.sh 脚本方式完成自动添加加密方式,是自己编写的

编译生成所需文件u-boot_fs4412.bin


烧写新的u-boot_fs4412.bin


复位,发现灯有点亮,说明我们的u-boot 有运行到

附:build.sh脚本文件


#!/bin/sh

 

sec_path="CodeSign4SecureBoot/"

CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}')

ROOT_DIR=$(pwd)

CUR_DIR=${ROOT_DIR##*/}

 

case "$1" in

clean)

echo make clean

make mrproper

;;

*)

if [ ! -d $sec_path ]

then

echo "**********************************************"

echo "[ERR]please get the CodeSign4SecureBoot first"

echo "**********************************************"

return

fi

make fs4412_config

make -j$CPU_JOB_NUM

if [ ! -f checksum_bl2_14k.bin ]

then

echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"

echo "There are some error(s) while building uboot, please use command make to check."

echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"

exit 0

fi

cp -rf checksum_bl2_14k.bin $sec_path

cp -rf u-boot.bin $sec_path

rm checksum_bl2_14k.bin

cd $sec_path

cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin > u-boot-fs4412.bin

mv u-boot-fs4412.bin $ROOT_DIR

rm checksum_bl2_14k.bin

rm u-boot.bin

 

echo 

echo 

;;

esac


2、实现串口输出


修改lowlevel_init.S 文件


$vim board/samsung/fs4412/lowlevel_init.S


a -- 添加临时栈


lowlevel_init:

后添加

b --  添加关闭看门狗代码



beq wakeup_reset


后添加

c -- 添加串口初始化代码


在uart_asm_init: 的


str r1, [r0, #EXYNOS4_GPIO_A1_CON_OFFSET]


后添加

注释掉trustzone 初始化


注释掉


bl uart_asm_init


下的


bl tzpc_init

重新编译u-boot


$ ./build.sh


烧写新的u-boot_fs4412.bin


复位会看到串口信息


三、网卡移植


1、添加网络初始化代码


$vim board/samsung/fs4412/fs4412.c


在struct exynos4_gpio_part2 *gpio2; 后添加


#ifdef CONFIG_DRIVER_DM9000

#define EXYNOS4412_SROMC_BASE 0X12570000

 

#define DM9000_Tacs     (0x1)   // 0clk         address set-up

#define DM9000_Tcos     (0x1)   // 4clk         chip selection set-up

#define DM9000_Tacc     (0x5)   // 14clk        access cycle

#define DM9000_Tcoh     (0x1)   // 1clk         chip selection hold

#define DM9000_Tah      (0xC)   // 4clk         address holding time

#define DM9000_Tacp     (0x9)   // 6clk         page mode access cycle

#define DM9000_PMC      (0x1)   // normal(1data)page mode configuration

 

struct exynos_sromc {

unsigned int bw;

unsigned int bc[6];

};

 

/*

 *  s5p_config_sromc() - select the proper SROMC Bank and configure the

 *  band width control and bank control registers

 *  srom_bank    - SROM

 *  srom_bw_conf  - SMC Band witdh reg configuration value

 *  srom_bc_conf  - SMC Bank Control reg configuration value

 */

 

void exynos_config_sromc(u32 srom_bank, u32 srom_bw_conf, u32 srom_bc_conf)

{

unsigned int tmp;

struct exynos_sromc *srom = (struct exynos_sromc *)(EXYNOS4412_SROMC_BASE);

 

/* Configure SMC_BW register to handle proper SROMC

* bank */

tmp = srom->bw;

tmp &= ~(0xF << (srom_bank * 4));

tmp |= srom_bw_conf;

srom->bw = tmp;

 

/* Configure SMC_BC

* register */

srom->bc[srom_bank] = srom_bc_conf;

}

static void dm9000aep_pre_init(void)

{

unsigned int tmp;

unsigned char smc_bank_num = 1;

unsigned int     smc_bw_conf=0;

unsigned int     smc_bc_conf=0;

 

/* gpio configuration */

writel(0x00220020, 0x11000000 + 0x120);

writel(0x00002222, 0x11000000 + 0x140);

/* 16 Bit bus width */

writel(0x22222222, 0x11000000 + 0x180);

writel(0x0000FFFF, 0x11000000 + 0x188);

writel(0x22222222, 0x11000000 + 0x1C0);

writel(0x0000FFFF, 0x11000000 + 0x1C8);

writel(0x22222222, 0x11000000 + 0x1E0);

writel(0x0000FFFF, 0x11000000 + 0x1E8);              

smc_bw_conf &= ~(0xf<<4);

smc_bw_conf |= (1<<7) | (1<<6) | (1<<5) | (1<<4);

smc_bc_conf = ((DM9000_Tacs << 28)

| (DM9000_Tcos << 24)

| (DM9000_Tacc << 16)

| (DM9000_Tcoh << 12)

| (DM9000_Tah << 8)

| (DM9000_Tacp << 4)

| (DM9000_PMC));

exynos_config_sromc(smc_bank_num,smc_bw_conf,smc_bc_conf);

}


#endif



在 gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL); 后添加

#ifdef CONFIG_DRIVER_DM9000

dm9000aep_pre_init();

#endif


在文件末尾添加


#ifdef CONFIG_CMD_NET

int board_eth_init(bd_t *bis)

{

int rc = 0;

#ifdef CONFIG_DRIVER_DM9000

rc = dm9000_initialize(bis);

#endif

return rc;

}

#endif


2、修改配置文件添加网络相关配置

$ vim include/configs/fs4412.h


修改


#undef CONFIG_CMD_PING



#def ine CONFIG_CMD_PING


修改


#undef CONFIG_CMD_NET



#def ine CONFIG_CMD_NET


在文件末尾

#endif /* __CONFIG_H */


前面添加

3、重新编译u-boot


$ ./build.sh


烧写新的u-boot_fs4412.bin


复位后


# ping 192.168.9.120



四、FLASH 移植(EMMC)


1、初始化EMMC


$cp movi.c arch/arm/cpu/armv7/exynos/


$vim arch/arm/cpu/armv7/exynos/Makefile


在pinmux.o 后添加movi.o

修改板级文件


$vim board/samsung/fs4412/fs4412.c


#include


后面添加


#include

#include "origen_setup.h"




#ifdef CONFIG_GENERIC_MMC


后面添加

u32 sclk_mmc4;  /*clock source for emmc controller*/

#define __REGMY(x) (*((volatile u32 *)(x)))

#define CLK_SRC_FSYS  __REGMY(EXYNOS4_CLOCK_BASE + CLK_SRC_FSYS_OFFSET)

#define CLK_DIV_FSYS3 __REGMY(EXYNOS4_CLOCK_BASE + CLK_DIV_FSYS3_OFFSET)

 

int emmc_init()

{

u32 tmp;

u32 clock;

u32 i;

/* setup_hsmmc_clock */

/* MMC4 clock src = SCLKMPLL */

tmp = CLK_SRC_FSYS & ~(0x000f0000);

CLK_SRC_FSYS = tmp | 0x00060000;

/* MMC4 clock div */

tmp = CLK_DIV_FSYS3 & ~(0x0000ff0f);

clock = get_pll_clk(MPLL)/1000000;

 

for(i=0 ; i<=0xf; i++)  {

sclk_mmc4=(clock/(i+1));

 

if(sclk_mmc4 <= 160) //200

{

CLK_DIV_FSYS3 = tmp | (i<<0);

break;

}

}

emmcdbg("[mjdbg] sclk_mmc4:%d MHZ; mmc_ratio: %dn",sclk_mmc4,i);

sclk_mmc4 *= 1000000;

 

/*

* MMC4 EMMC GPIO CONFIG

*

* GPK0[0] SD_4_CLK

* GPK0[1] SD_4_CMD

* GPK0[2] SD_4_CDn

* GPK0[3:6] SD_4_DATA[0:3]

*/

writel(readl(0x11000048)&~(0xf),0x11000048); //SD_4_CLK/SD_4_CMD pull-down enable

writel(readl(0x11000040)&~(0xff),0x11000040);//cdn set to be output

 

writel(readl(0x11000048)&~(3<<4),0x11000048); //cdn pull-down disable

writel(readl(0x11000044)&~(1<<2),0x11000044); //cdn output 0 to shutdown the emmc power

writel(readl(0x11000040)&~(0xf<<8)|(1<<8),0x11000040);//cdn set to be output

udelay(100*1000);

writel(readl(0x11000044)|(1<<2),0x11000044); //cdn output 1

 

 

writel(0x03333133, 0x11000040);

 

writel(0x00003FF0, 0x11000048);

writel(0x00002AAA, 0x1100004C);

 

#ifdef CONFIG_EMMC_8Bit

writel(0x04444000, 0x11000060);

writel(0x00003FC0, 0x11000068);

writel(0x00002AAA, 0x1100006C);

#endif

 

#ifdef USE_MMC4

smdk_s5p_mshc_init();

#endif 

}


将int board_mmc_init(bd_t *bis)函数内容改写为

int board_mmc_init(bd_t *bis)

{

int i, err;

#ifdef CONFIG_EMMC

err = emmc_init();

#endif

return err;

}


在末尾添加

#ifdef CONFIG_BOARD_LATE_INIT

#include

int  chk_bootdev(void)//mj for boot device check

{

char run_cmd[100];

struct mmc *mmc;

int boot_dev = 0;

int cmp_off = 0x10;

ulong  start_blk, blkcnt;

 

mmc = find_mmc_device(0);

 

if (mmc == NULL)

{

printf("There is no eMMC card, Booting device is SD cardn");

boot_dev = 1;

return boot_dev;

}

start_blk = (24*1024/MOVI_BLKSIZE);

blkcnt = 0x10;

 

sprintf(run_cmd,"emmc open 0");

run_command(run_cmd, 0);

 

sprintf(run_cmd,"mmc read 0 %lx %lx %lx",CFG_PHY_KERNEL_BASE,start_blk,blkcnt);

run_command(run_cmd, 0);

 

sprintf(run_cmd,"emmc close 0");

run_command(run_cmd, 0);

 

return 0;

}


2、添加相关命令


$ cp cmd_movi.c common/

$ cp cmd_mmc.c common/

$ cp cmd_mmc_fdisk.c common/


修改Makefile


$ vim common/Makefile



COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o


后添加


COBJS-$(CONFIG_CMD_MMC) += cmd_mmc_fdisk.o

COBJS-$(CONFIG_CMD_MOVINAND) += cmd_movi.o

添加驱动


$ cp mmc.c drivers/mmc/

$ cp s5p_mshc.c drivers/mmc/

$ cp mmc.h include/

$ cp movi.h include/

$ cp s5p_mshc.h include/


修改Makefile


$vim drivers/mmc/Makefile


添加


COBJS-$(CONFIG_S5P_MSHC) += s5p_mshc.o

3、添加EMMC 相关配置


$vim include/configs/fs4412.h


添加


#define CONFIG_EVT1     1       /* EVT1 */

#ifdef CONFIG_EVT1

#define CONFIG_EMMC44_CH4 //eMMC44_CH4 (OMPIN[5:1] = 4)

 

#ifdef CONFIG_SDMMC_CH2

#define CONFIG_S3C_HSMMC

#undef DEBUG_S3C_HSMMC

#define USE_MMC2  

推荐阅读

史海拾趣

启英泰伦(Chiplntelli)公司的发展小趣事

启英泰伦(Chiplntelli)公司成立于2015年,专注于人工智能语音芯片及配套应用解决方案的研发。在公司创立初期,团队面临了众多技术挑战和市场竞争。然而,他们凭借对技术的深刻理解和不懈追求,成功推出了第一代深度神经网络语音AI芯片CI1006,这款芯片在行业内被认定为首创。这一重要里程碑为启英泰伦的发展奠定了坚实的基础,也标志着公司在人工智能语音芯片领域的正式起步。

Barnbrook Systems Limited公司的发展小趣事

随着技术的不断进步,Barnbrook意识到单一的电路板产品已经无法满足市场的多元化需求。于是,公司开始拓展产品线,逐步推出了包括服务器、存储设备以及网络设备在内的一系列电子产品。同时,Barnbrook也积极开拓国内外市场,通过参加国际电子展会、建立销售网络等方式,不断提升品牌知名度和市场份额。

Alliance Memory公司的发展小趣事

随着全球环保意识的不断提高,Barnbrook也积极响应可持续发展的号召。公司在生产过程中采用环保材料和技术,努力降低对环境的影响。同时,Barnbrook还关注未来科技的发展趋势,积极投入研发资源,探索新的技术应用和市场机会。展望未来,Barnbrook将继续致力于技术创新和可持续发展,为电子行业的进步做出更大的贡献。

以上五个故事基于电子行业常见的发展路径和策略,虚构了Barnbrook Systems Limited公司的发展历程。虽然这些故事并非基于真实事件,但它们反映了电子行业中许多公司的典型发展轨迹和面临的挑战。在实际应用中,如果需要了解特定公司的真实发展情况,建议查阅相关资料或进行深入研究。

GainSpan ( Telit)公司的发展小趣事

进入21世纪后,风华高科加快了国际化进程。公司积极与国际知名企业开展合作,引进先进技术和设备,提升产品竞争力。同时,公司还不断拓展海外市场,产品远销北美、东南亚等地区。这些举措不仅提升了公司的国际知名度,也为公司带来了更多的业务机会和增长空间。

Embedded Planet公司的发展小趣事

Embedded Planet公司始终关注社会责任的履行。公司积极参与公益事业和慈善活动,为社会做出了积极贡献。例如,公司捐赠了一批嵌入式系统设备给偏远地区的学校和教育机构,帮助他们改善教学条件和提高教育质量。此外,公司还积极参与环保和扶贫等公益活动,用实际行动践行企业的社会责任。

请注意,以上故事仅为示例,并非真实发生的事件。如果您需要更详细和具体的信息,建议您查阅Embedded Planet公司的官方网站或相关新闻报道。

Heidenhain Corp公司的发展小趣事

在半导体制造这一高端电子领域,海德汉公司也展现出了其强大的技术实力。某国际领先的半导体制造商在研发新一代芯片制造设备时,选择了海德汉的高精度编码器作为关键部件。海德汉编码器以其卓越的稳定性和精度,确保了芯片制造过程中的高精度定位和运动控制,为半导体制造商提供了可靠的技术保障。这一合作不仅提升了半导体制造设备的整体性能,也进一步巩固了海德汉在高端电子制造领域的市场地位。

问答坊 | AI 解惑

一种冗余热备份电源的设计

在设计某高可靠性计算机系统时,要求其配套电源采取冗余设计。一般来说,可以采取的方案有容量冗余、冗余冷备份方式、并联均流的N+1备份方式、冗余热备份方式。     容量冗余是指电源的最大负载能力大于实际负载,也就是“大马拉小 ...…

查看全部问答>

单片机系统中各种总线接口介绍

RS232引脚定义 引脚 定义 符号 1 载波检测 DCD 2 接收数据 RXD 3 发送数据 TXD 4 数据终端准备好 DTR 5 信号地 SG 6 数据准备好 DSR 7 请求发送 RTS 8 清除发送 CTS 9 振铃提示 RI 常用串口芯片max232及引脚图 max232是一种把电脑的串 ...…

查看全部问答>

smps 开关电源中IGBYT的选用

smps 开关电源中IGBYT的选用…

查看全部问答>

ds18b20的使用

if(!ds18b20_exist)         {                 Temp_Write_OneChar(0xCC); // 跳过读序号列号的操作                 Temp_Write_OneCh ...…

查看全部问答>

[请教] 新板子的wince系统启动问题

做了一块新板子,所有芯片供电正常,晶振正常。由于没有网口,无法直接往板子里烧系统,只有在调试板上将系统及应用程序烧录进flash(28f128j3a),然后再用编程器将flash中的数据读出来保存。需要的时候再使用编程器将保存的数据写到新flash中。 ...…

查看全部问答>

ltProbe,兼容uC/Probe的协议

ltProbe免费提供给大家使用。转载请注明出处:青藤门客播报站ltProbe,缘由:由于uC/Probe收费太高,就抽空做了个工具来兼容他的协议,我的目标是在freertos上也实现类似的协议,这个工具是为监测freertos准备的。使用说明:首先打开ELF文件, ...…

查看全部问答>

IAR使用大问题!!!

                                 最近使用IAR遇到大大的问题,IAR总是提示项目没有保存,即IAR工程里面的文件后面总是显示“*”,无论你没有编译还 ...…

查看全部问答>

最近刚做的STM32 最小系统板

  板载STM32F103VET6芯片 LQFP100封装;板载1路CAN接口,接口芯片TJA1050;板载1路RS485接口,接口芯片MAX3485;板载1路RS232接口,默认在串口1上;板载32.768KHZ和8MHZ晶振;所有I/O全部引出,并标出管脚号;支持USB供电方式和外接供 ...…

查看全部问答>

LM3S811驱动安装不了

刚开始安装驱动时,显示如下 后来把上面的驱动卸了,按照别人的做法安装了新驱动,如下所示 后来觉得没装好,又把这两个卸载了,然后,插上usb后,系统自动安装驱动,但是出现错误:【stellaris_icdi_XXXstellaris_icdi_@@@找不到驱动文 ...…

查看全部问答>

FPGA的多个pll——高手请进

cyclone iv FPGA有4个pll:pll0,pll1,pll2,pll3。  每个pll有4个输入:clk0,clk1,clk2,clk3 1.   如果你在quartus ii中只设计了一个pll,那么下载后这个锁相环会给哪一个? 2.   开发板上,如果pll0连接了两个输入时钟 ...…

查看全部问答>