千家信息网

怎么从0移植uboot支持exynos4412?

发表于:2024-10-17 作者:千家信息网编辑
千家信息网最后更新 2024年10月17日,这篇文章将为大家详细讲解有关怎么从0移植uboot支持exynos4412?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。本文主要目的是怎么从0编译和移植uboot
千家信息网最后更新 2024年10月17日怎么从0移植uboot支持exynos4412?

这篇文章将为大家详细讲解有关怎么从0移植uboot支持exynos4412?,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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

一、移植步骤

1. Uboot配置

1.指定交叉编译工具链 进入uboot代码根目录

$ cd  u-boot-2013.01

修改 Makefile 在

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

下添加

ifeq   (arm,$(ARCH))    CROSS_COMPILE ?= arm-none-linux-gnueabi- endif

交叉编译工具

2.指定产品CPU 我们产品用的CPU是 exynos 4412;

查看u-boot源码:

arch/arm/cpu/armv7/exynos/

可见U-boot已支持该CPU。

3.指定产品BOARD 三星公司已经为exynos 4412发布了初始化的程序:

origen

4.cpu硬件信息 对应的该CPU硬件信息头文件位于以下位置:

include/configs/origen.h

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

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

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

6.编译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 $< $@   $(BOARD_SIZE_CHECK)

下添加

@#./mkuboot @split  -b  14336  u-boot.bin  bl2 @make -C sdfuse_q/ @#cp u-boot.bin u-boot-4212.bin @#cp u-boot.bin u-boot-4412.bin @#./sdfuse_q/add_sign @./sdfuse_q/chksum @./sdfuse_q/add_padding @rm bl2a* @echo

注意是tab键缩进的,否则makefile编译报错 注意如果执行了make distclean 需重新拷贝CodeSign4SecureBoot

为方便起见,在根目录下创建编译脚本build.sh,该脚本将自动完成添加加密方式。

 1 #!/bin/sh  2   3 sec_path="CodeSign4SecureBoot/"  4 CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}')  5 ROOT_DIR=$(pwd)  6 CUR_DIR=${ROOT_DIR##*/}  7   8 case "$1" in  9     clean) 10         echo make clean 11         make mrproper 12         ;; 13     *) 14  15         if [ ! -d $sec_path ] 16         then 17             echo "**********************************************" 18             echo "[ERR]please get the CodeSign4SecureBoot first" 19             echo "**********************************************" 20             return 21         fi      22  23         make origen_config 24  25         make -j$CPU_JOB_NUM 26  27         if [ ! -f checksum_bl2_14k.bin ] 28         then 29             echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 30             echo "There are some error(s) while building uboot, please use command make to check." 31             echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 32             exit 0 33         fi 34  35         cp -rf checksum_bl2_14k.bin $sec_path 36         cp -rf u-boot.bin $sec_path 37         rm checksum_bl2_14k.bin 38  39         cd $sec_path 40         cat E4412_N.bl1.SCP2G.bin bl2.bin all00_padding.bin u-boot.bin tzsw_SMDK4412_SCP_2GB.bin > 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# ls api                  config.mk  examples     Makefile  sdfuse_q         u-boot.bin arch                 COPYING    fs           mkconfig  snapshot.commit  u-boot.map board                CREDITS    helper.mk    nand_spl  spl              u-boot-origen.bin boards.cfg           disk       include      net       System.map       u-boot.srec build.sh             doc        lib          post      test CodeSign4SecureBoot  drivers    MAINTAINERS  README    tools common               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 << (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/origen.h 修改

85 #undef CONFIG_CMD_PING

#define  CONFIG_CMD_PING

修改

90 #undef CONFIG_CMD_NET

#define  CONFIG_CMD_NET

在文件末尾

#endif /* __CONFIG_H */

前面添加

#ifdef CONFIG_CMD_NET #define CONFIG_NET_MULTI #define CONFIG_DRIVER_DM9000  1 #define CONFIG_DM9000_BASE    0x05000000 //内存基地址 #define DM9000_IO         CONFIG_DM9000_BASE #define DM9000_DATA       (CONFIG_DM9000_BASE + 4) #define CONFIG_DM9000_USE_16BIT #define CONFIG_DM9000_NO_SROM  1 #define CONFIG_ETHADDR   11:22:33:44:55:66 #define CONFIG_IPADDR     192.168.6.187 #define CONFIG_SERVERIP         192.168.6.186 #define CONFIG_GATEWAYIP       192.168.1.1 #define CONFIG_NETMASK   255.255.255.0 #endif

其中CONFIG_DM9000_BASE 地址为何是0x05000000,后续章节会详细分析。

6. FLASH移植 (EMMC)

1.移植EMMC需要添加一些源文件:

cmd_mmc.c cmd_mmc_fdisk.c cmd_movi.c mmc.c mmc.h movi.c movi.h s5p_mshc.c s5p_mshc.h

这些文件,由三星提供。

2.添加相关驱动

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

修改文件arch/arm/cpu/armv7/exynos/Makefile在pinmux.o 后添加movi.o

修改板级文件 board/samsung/origen/origen.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: %d\n",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 card\n");    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);    /* switch mmc to normal paritition */   sprintf(run_cmd,"emmc close 0");   run_command(run_cmd, 0);    return 0; }  int board_late_init (void) {      int boot_dev =0 ;      char boot_cmd[100];      boot_dev = chk_bootdev();      if(!boot_dev)      {            printf("\n\nChecking Boot Mode ... EMMC4.41\n");      }      return 0; } #endif

3.添加相关命令

$ cp    cmd_movi.c  common/ $ cp    cmd_mmc.c  common/ $ cp cmd_mmc_fdisk.c  common/

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

4.添加EMMC相关配置

$vim    include/configs/origen.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   #endif  #ifdef CONFIG_EMMC44_CH4 #define CONFIG_S5P_MSHC #define CONFIG_EMMC             1                #define USE_MMC4   /* #define CONFIG_EMMC_8Bit */ #define CONFIG_EMMC_EMERGENCY /*#define emmcdbg(fmt,args...) printf(fmt ,##args) *///for emmc debug  #define emmcdbg(fmt,args...) #endif  #endif /*end CONFIG_EVT1*/ #define CONFIG_CMD_MOVINAND #define CONFIG_CLK_1000_400_200 #define CFG_PHY_UBOOT_BASE      CONFIG_SYS_SDRAM_BASE + 0x3e00000 #define CFG_PHY_KERNEL_BASE     CONFIG_SYS_SDRAM_BASE + 0x8000  #define BOOT_MMCSD      0x3 #define BOOT_EMMC43     0x6 #define BOOT_EMMC441    0x7 #define CONFIG_BOARD_LATE_INIT

7. 重新编译u-boot

修改顶层Makefile,注释掉spl的编译:

623 #$(obj)spl/u-boot-spl.bin:  $(SUBDIR_TOOLS) depend 624 #       $(MAKE) -C spl all

重新编译uboot:

$ ./build.sh

在根目录下会生成bin文件u-boot-origen.bin。

二、SD卡制作

1. 烧写脚本

三星公司已经给我们提供了制作SD卡启动的烧写的脚本:mkuboot.sh

#!/bin/bash  # # This script will create a u-boot binary for movinand/mmc boot #  echo "Fuse FS4412 trustzone uboot file into SD card"  if [ -z $1 ] #判断参数1的字符串是否为空,如果为空,则打印出帮助信息 then  ./sd_fusing_exynos4x12.sh /dev/sdb u-boot-origen.bin else  ./sd_fusing_exynos4x12.sh $1 u-boot-origen.bin fi

sd_fusing_exynos4x12.sh

 1 #!/bin/sh     2 #  3 # Copyright (C) 2010 Samsung Electronics Co., Ltd.  4 #              http://www.samsung.com/  5 #  6 # This program is free software; you can redistribute it and/or modify  7 # it under the terms of the GNU General Public License version 2 as  8 # published by the Free Software Foundation.  9 # 10 #################################### 11 reader_type1="/dev/sd" 12 reader_type2="/dev/mmcblk0" 13  14 if [ -z $2 ]  #判断参数2的字符串是否为空,如果为空,则打印出帮助信息 15 then 16     echo "usage: ./sd_fusing.sh  " 17     exit 0 18 fi 19  20 param1=`echo "$1" | awk '{print substr($1,1,7)}'` 21  22 if [ "$param1" = "$reader_type1" ] 23 then 24     partition1=$1"1" 25     partition2=$1"2" 26     partition3=$1"3" 27     partition4=$1"4" 28  29 elif [ "$1" = "$reader_type2" ] 30 then 31     partition1=$1"p1" 32     partition2=$1"p2" 33     partition3=$1"p3" 34     partition4=$1"p4" 35  36 else 37     echo "Unsupported SD reader" 38     exit 0 39 fi 40  41 if [ -b $1 ] #判断参数1所指向的设备节点是否存在 42 then 43     echo "$1 reader is identified." 44 else 45     echo "$1 is NOT identified." 46     exit 0 47 fi 48  49 #################################### 50 # format 51 umount $partition1 2> /dev/null 52 umount $partition2 2> /dev/null 53 umount $partition3 2> /dev/null 54 umount $partition4 2> /dev/null 55  56 echo "$2 fusing..."  # 烧写u-boot-origen.bin到SD卡(512+8K)字节处, 512+8K=17x512,即第17个block 57 dd iflag=dsync oflag=dsync if=$2 of=$1 seek=1 && \ 58     echo "$2 image has been fused successfully." 59  60 #echo "zImage fusing..." 61 #dd iflag=dsync oflag=dsync if=../../TC4_Kernel_3.0/arch/arm/boot/zImage of=$1 seek=1024 && \ 62 #   echo "zImage has been fused successfully." 63  64 #echo "ramdisk-uboot.img fusing..." 65 #dd iflag=dsync oflag=dsync if=../../TC4_GB_2.3.4/out/target/product/smdk4212/ramdisk-uboot.img of=$1 seek=9216 && \ 66 #   echo "ramdisk-uboot.img has been fused successfully." 67  68 #################################### 69 # 70 echo "Eject SD card" 71

2. 制作步骤

a) 创建文件mkuboot.sh、sd_fusing_exynos4x12.sh b) 将SD卡插入电脑并被ubuntu识别 c) 拷贝编译好u-boot-origen.bin拷贝到当前目录下

root@ubuntu:/home/peng/uboot/sdfuse_q# ls mkuboot.sh  sd_fusing_exynos4x12.sh  u-boot-origen.bin

d) 进入sdfuse_q执行如下操作

root@ubuntu:/home/peng/uboot/sdfuse_q#./mkuboot.sh  /dev/sdb

d) 在SD卡中创建目录sdupdate,并把编译好的uboot镜像文件u-boot-origen.bin拷贝到这个目录。

3. 通过sd卡启动烧写uboot

a) 连接串口和板子,运行串口通信程序putty

选择右上角的"Serial",然后点击左下角的"Serial"

按照自己的主机的情况选择COM口其他必须一直,然后点击open打开串口

b) 关闭开发板电源,将拨码开关SW1调至(1000)(SD启动模式)后打开电源 c) 将刚才做好的SD启动盘插入SD卡插槽 d) 重新打开开发板能够看到如下界面

在这里插入图片描述

在读秒倒计时时按任意键。由上图所示,已经支持EMMC和dm9000网卡。

e) 烧写 在终端上执行

sdfuse  flashall

注意:上面的命令把SD卡 sdupdate目录下的u-boot-origen.bin烧写到emmc起始位置 等待终端无输出是表示烧写结束

f) 关闭开发板电源,将拨码开关SW1调至0110(EMMC启动模式)后打开电源即可以从emmc启动

4. 网络烧写uboot

如果板子已经可以启动uboot,我们也可以通过网络烧写uboot。

步骤如下:

把编译好的u-boot-origen.bin拷贝到/tftpboot下

启动开发板,在u-boot下先下载u-boot-origen.bin到41000000;再运行

movi  write  u-boot  41000000

关于"怎么从0移植uboot支持exynos4412?"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

文件 编译 三星 配置 移植 信息 串口 命令 开发 支持 代码 目录 程序 网卡 脚本 驱动 拷贝 方式 板子 网络 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全主要测试工具种类 威客网软件开发单子怎么价格低 杨浦区互联网软件开发收费套餐 oracle云数据库使用 网站服务器申请报告 网络安全简ppt 宽城区智能化网络安全常见问题 网络技术人员的工作职责 如何制作数据库并发模型 小南瓜网络技术有限公司 计算机网络技术专业调研目的 紫鲸互联网科技有什么成就 对于网络安全我们该如何防范 数据库中 unicode 辽宁特色软件开发项目信息 私人软件开发官司 七上八下二元一次方程数据库 售后好的服务器安全防护 科技创新课程之互联网 答案 宁波协同管理软件开发 计算机系统网络技术论文 重庆纽信网络技术有限公司 数据库删除表的输入密码 数据库表增加一行 网络安全法处拘留 数据库系统概论第五版原书 网络安全主题画一等奖五年级 软件开发平台哪个品牌好 网络安全攻防方式 oracle数据库断电控制文件
0