20.从0学ARM-移植uboot支持exynos4412
经过前面一章的学习,我们已经了解了什么是uboot,本章主要目的是如何编译和移植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发布了初始化的程序:
- 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
编译:
$ 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
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)
- 移植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
这些文件,由三星提供。
添加相关驱动
cp movi.c arch/arm/cpu/armv7/exynos/
修改文件arch/arm/cpu/armv7/exynos/Makefile在pinmux.o 后添加movi.o
修改板级文件 board/samsung/origen/origen.c,在
#include <asm/arch/mmc.h>
后面添加
#include <asm/arch/clk.h>
#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 <movi.h>
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
添加相关命令
$ 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
添加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 <SD Reader's device file> <filename>"
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 #<Message Display>
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
若编译后的u-boot-origen.bin 无法运行,可参考上一节,重新从SD卡引导烧写。
20.从0学ARM-移植uboot支持exynos4412的更多相关文章
- jsoncpp 0.5 ARM移植
1.下载jsonapp 0.5 https://github.com/open-source-parsers/jsoncpp 2.编译 platform 没有包含 arm 平台,需要把源码提取出来,独 ...
- ARM微处理器中支持字节、半字、字三种数据类型,地址的低两位为0是啥意思?
问题: ARM微处理器中支持字节.半字.字三种数据类型,其中,字需要4字节对齐(地址的低两位为0).半字需要2字节对齐(地址的最低位为0).我想问的是括号中的内容是什么意思呢?请牛人帮忙解释一下!谢谢 ...
- 移植u-boot.2012.04.01
/*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...
- ok6410 u-boot-2012.04.01移植七完善u-boot移植(u-boot移植结束)
继ok6410 u-boot-2012.04.01移植六后,开发板已支持MLC NAND.DM9000等.但还需要完善比如环境变量.mtdpart分区.裁剪.制作补丁等.下面的工作就是完善移植的u-b ...
- 基于tiny4412的Linux内核移植(支持device tree)(三)
作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...
- Linux主机上使用交叉编译移植u-boot到树莓派
0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...
- S5PV210之Sate210-F DIY硬件,移植uboot,kernel,android 活动现在已经进入实施阶段吗,欢迎广大网友参与 !
大家一起来diy 超低价四核的exynos4412或者Cortex A8S5pv210开源开发板 商业版Sate210已经完成了好久了.Sate4412 也已经出来.但是这两个接口非常全,主要是针对企 ...
- u-boot支持LCD显示(基于TQ2440)
平台简介 Linux版本:Linux-3.14 u-boot版本:u-boot-2015.04 硬件:TQ2440(内存:64MB NandFlash:256MB) 作者:彭东林 邮箱:pengdo ...
- mini2440移植uboot 2014.04(四)
我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <mini2440移植u ...
- mini2440移植uboot 2014.04(一)
最新版的uboot添加了很多新功能,我决定在最新版代码基础上重新移植一遍加深理解. 我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot- ...
随机推荐
- C++判断字符串是否相等
话不多说,上代码 bool str_same(char *p1, char *p2) { if (strcmp(p1, p2)) return 0; else for (int i = 0; i &l ...
- python重拾第六天-面向对象基础
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的 ...
- 光伏储能电厂设备连接iec61850平台解决方案
在当今日益发展的电力系统中,光伏储能技术以其独特的优势逐渐崭露头角,成为可再生能源领域的重要组成部分.而在光伏储能系统的运行与监控中,通信协议的选择与实现则显得至关重要.本文将重点介绍光伏储能系统中的 ...
- FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
<FFmpeg开发实战:从零基础到短视频上线>一书在第10章介绍了轻量级流媒体服务器MediaMTX,通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流.不过MediaMTX的功能 ...
- Java反射机制原理详解
什么是反射? Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法.本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息 ...
- Nginx常用操作
Nginx Nginx的最重要的几个使用场景 静态资源服务,通过本地文件提供服务 反向代理服务,延伸出包括缓存,负载均衡等 API服务,OpenResty 相关概念 简单请求和非简单请求 请求方法是H ...
- mybatis log4j打印sql语句
依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</a ...
- 如何在有数BI中实现千人千面的数据推送?
问题背景 前几天有个项目管理的同学来咨询我一个问题,该项目有一个项目进度信息表,表中有项目名称,项目阶段,项目状态,项目任务等字段,在实际工作中想要实现如下场景: 当项目名称为A时,且项目阶段是需求阶 ...
- [翻译]欢迎使用C#9.0
本文由公众号[开发者精选资讯](微信号:yuantoutiao)翻译首发,转载请注明来源 C# 9.0 is taking shape, and I'd like to share our think ...
- Python按条件筛选、剔除表格数据并绘制剔除前后的直方图
本文介绍基于Python语言,读取Excel表格文件数据,以其中某一列数据的值为标准,对于这一列数据处于指定范围的所有行,再用其他几列数据的数值,加以数据筛选与剔除:同时,对筛选前.后的数据分别绘 ...