20.从0学ARM

您所在的位置:网站首页 移植uboot 20.从0学ARM

20.从0学ARM

2022-08-04 07:35| 来源: 网络整理| 查看: 265

继续更新两篇ARM专题文章,该系列汇总如下:

《从0学ARM》

本文主要目的是如何从0编译和移植uboot,增加串口、网络、emmc等功能,让他支持exynos4412开发板。

一、移植步骤 1. Uboot配置 指定交叉编译工具链 进入uboot代码根目录 $ cd  u-boot-2013.01

修改 Makefile 在

ifeq ($(HOSTARCH),$(ARCH))   CROSS_COMPILE ?=endif

下添加

ifeq   (arm,$(ARCH))   CROSS_COMPILE ?= arm-none-linux-gnueabi-endif 交叉编译工具 在这里插入图片描述 指定产品CPU 我们产品用的CPU是 exynos 4412;

查看u-boot源码:

arch/arm/cpu/armv7/exynos/

可见U-boot已支持该CPU。

指定产品BOARD 三星公司已经为exynos 4412发布了初始化的程序: origen cpu硬件信息 对应的该CPU硬件信息头文件位于以下位置: include/configs/origen.h

该文件定义了uboot启动必须关于exynos 4412必须的一些资源信息。

boards.cfg 在uboot-2013-01中,顶层目录下的boards.cfs文件中查看它支持的开发板和相应的信息,后续的编译过程需要根据配置名检索到相应的信息。文件格式如下:

和以前的老版本比,配置更加规范化了,其实这些就是相关文件分类的一个文件夹的描述。依照这个层次关系,我们可以很方便的对我们开发板进行配置。

编译u-boot

不同版本的uboot的配置命令可能是不同的,源码包的文件README通常会有相应的配置命令【其他版本的uboot会不一样】:配置和编译命令如下:

$ make  distclean$ make  origen_config

改配置命令会生成以下文件:

include/config.h config.h

编译:

$ make all

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

但是并不会生成真正适配我们板子的uboot,只是适配参考板,该文件还不能在我们板子上运行,我们需要对u-boot源代码进行相应的修改。

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

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

#if 1  ldr r0, =0x11000c40 @GPX2_7 led2  ldr r1, [r0]  bic r1, r1, #0xf0000000  orr r1, r1, #0x10000000  str r1, [r0]   ldr r0, =0x11000c44  mov r1,#0xff  str r1, [r0]#endif 

因为uboot刚启动的时候,串口没有来得及初始化,我们可以通过点亮LED的方法来判断程序是否执行到此处。

代码详解参考《十、LED汇编、C语言驱动编写》

3. 添加三星加密方式

exynos 需要三星提供的初始引导加密后,我们的u-boot,才能被引导运行,这其中要用到下面的几个命令或三星提供的工具软件,这些操作的目的就是根据三星的芯片的启动要求对uboot.bin 进行一些处理,包括在特定长度的位置加上和校验信息以及插入一些文件段。

$cp  sdfuse_q  u-boot-2013.01  -rf $ chmod  777  u-boot-2013.01/sdfuse_q  -R      $cp  CodeSign4SecureBoot  u-boot-2013.01  -rf     

注:CodeSign4SecureBoot 三星提供的安全启动方式  ,对应的程序由三星提供。sdfuse_q目录下的文件是针对三星堆uboot.bin文件格式要求进行加密编写的文件。

修改根目录Makefile,实现sdfuse_q的编译 在

$(obj)u-boot.bin: $(obj)u-boot  $(OBJCOPY) ${OBJCFLAGS} -O binary $ u-boot-origen.bin 41         mv u-boot-origen.bin $ROOT_DIR 42  43         rm checksum_bl2_14k.bin 44         rm u-boot.bin 45  46         echo  47         echo  48         ;; 49  50 esac

编译脚本

$ chmod   777  u-boot-2013.01/ build.sh$ ./buildsh

注:build.sh 脚本方式完成自动添加加密方式, 编译生成所需文件u-boot_origen.bin

root@ubuntu:/home/peng/uboot/u-boot-2013.01# lsapi                  config.mk  examples     Makefile  sdfuse_q         u-boot.binarch                 COPYING    fs           mkconfig  snapshot.commit  u-boot.mapboard                CREDITS    helper.mk    nand_spl  spl              u-boot-origen.binboards.cfg           disk       include      net       System.map       u-boot.srecbuild.sh             doc        lib          post      testCodeSign4SecureBoot  drivers    MAINTAINERS  README    toolscommon               dts        MAKEALL      rules.mk  u-boot u-boot_origen.bin 4. 实现串口输出

修改lowlevel_init.S文件

$vim  board/samsung/origen/lowlevel_init.S

a) 添加临时栈,在

41 lowlevel_init:

后添加

ldr  sp,=0x02060000 @use iRom stack in bl2

b) 添加关闭看门狗代码: 在

67     beq wakeup_reset  

后添加

#if 1 /*for close watchdog */         /* PS-Hold high */  ldr r0, =0x1002330c  ldr r1, [r0]  orr r1, r1, #0x300  str r1, [r0]           ldr     r0, =0x11000c08  ldr r1, =0x0  str r1, [r0]/* Clear  MASK_WDT_RESET_REQUEST  */  ldr r0, =0x1002040c  ldr r1, =0x00  str r1, [r0]#endif  

c) 添加串口初始化代码: 在uart_asm_init: 的

351     str r1, [r0, #EXYNOS4_GPIO_A1_CON_OFFSET]

后添加

 ldr r0, =0x10030000  ldr r1, =0x666666   ldr r2, =CLK_SRC_PERIL0_OFFSET str r1, [r0, r2] ldr r1, =0x777777  ldr r2, =CLK_DIV_PERIL0_OFFSET str r1, [r0, r2]

d) 注释掉trustzone初始化 注释掉

104     bl uart_asm_init

下的代码:

#if 0    bl tzpc_init#endif  5. 网卡移植

因为各个厂家使用的网卡不尽相同,所以三星公司提供的驱动程序只预留了网卡初始化的函数入口,针对不同的板子,我们需要针对电路自己移植网卡的驱动。网卡的驱动详解,我们会在后一章节详细讲解。

1、 添加网络初始化代码

$ vim   board/samsung/origen/origen.c

31 struct exynos4_gpio_part2 *gpio2;

后添加:

#ifdef CONFIG_DRIVER_DM9000#define EXYNOS4412_SROMC_BASE 0X12570000

#define DM9000_Tacs     (0x1) #define DM9000_Tcos     (0x1) #define DM9000_Tacc     (0x5) #define DM9000_Tcoh     (0x1) #define DM9000_Tah      (0xC) #define DM9000_Tacp     (0x9)   #define DM9000_PMC      (0x1)  

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 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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3