lv12 uboot移植深化 9

2023-12-17

u-boot-2013 .0 1移植

【实验目的】

了解 u- boot 的代码结构及移植 的基本 方法

【实验环境】

  1. u buntu 14.04 发行版
  2. FS 4412 实验 平台
  3. 交叉编译 工具 arm-none-linux-gnueabi-

注意事项

实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行

【实验步骤】

1 建立自己的平台

1.1 下载uboot源码

uboot官网 下载uboot 源码(这里我们选择 u-boot- 2013.01 .t ar.bz2

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

1.2解压uboot源码

拷贝uboot源码包到ubuntu的家目录下,解压并进入其顶层目录

$ tar xvf u-boot-2013.01.tar.bz2
$ cd u-boot-2013.01/

1.3 指定交叉编译工具信息

uboot源码并不知道我们使用的处理器架构及交叉编译工具是什么,这里我们需要自己 在Makefile中指定

$ vi Makefile

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

修改为如下内容( 注意后边不要有多余的空格 ),然后保存退出

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

1.4 添加Board信息

因为uboot源码并不支持我们的开发板,这里我们需要从源码支持的开发板中找一个硬 件与我们最类似的,在其基础上进行修改,这里我们参考的是samsung公司的origen

$ cp -rf board/samsung/origen/ board/samsung/fs4412

$ mv board/samsung/fs4412/origen.c board/samsung/fs4412/fs4412.c

因为修改了文件名,所以对应的Makefile也要修改

$ vi board/samsung/fs4412/Makefile

ifndef CONFIG_SPL_BUILD

COBJS += origen.o

endif

修改为如下内容,然后保存退出

ifndef CONFIG_SPL_BUILD

COBJS += fs4412.o

endif

拷贝origen相关的头文件并将其重命名

$ cp include/configs/origen.h include/configs/fs4412.h

修改文件中的信息

$ vi include/configs/fs4412.h

#define CONFIG_SYS_PROMPT "ORIGEN #"

修改为如下内容

#define CONFIG_SYS_PROMPT "fs4412 #"

再将

#define CONFIG_IDENT_STRING " for ORIGEN"

修改为如下内容,然后保存退出。这块影响的是启动打印信息

#define CONFIG_IDENT_STRING "for fs4412"

打开uboot源码顶层目录下的boards.cfg文件

$ vi boards.cfg

origen arm armv7 origen samsung exynos

后添加如下内容(FS4412的相关信息),然后保存退出。

fs4412 arm armv7 fs4412 samsung exynos

至此我们在uboot源码中给我们的 板子添加了“档案” ,源码就支持我们的开发板了

1.5 编译uboot

在uboot源码顶层目录下执行如下命令,指定当前使用的Board信息

$ make fs4412_config

编译uboot

$ make

编译完成后会在源码顶层目录下生成u-boot.bin文件,但该文件还不能在我们的开发板 上运行,因为以上操作我们只是把origen相关的文件的名字改成了fs4412,使uboot能 识别fs4412开发板,但文件中的代码还是origen的,和我们的开发板不匹配,所以我 们还需要进一步进行修改和配置

2 添加三星加密引导方式

考虑芯片启动的安全性, Exynos4412需要三星提供的初始引导加密后我们的u-boot才 能被引导运行,所以我们需要在uboot源码中添加三星提供的加密处理 代码。(uboot是开源的,所以很多厂家为了安全性采用了加密引导)

2.1 添加三星加密引导方式

将资料中“移植相关文件”下的sdfuse_q和CodeSign4SecureBoot目录拷贝到uboot源 码的顶层目录下( 这之后不要执行make clean或make distclean,这会将加密文件清除

因为添加的加密文件也要编译,所以对应的Makefile也要修改

$ vi Makefile 

$(obj)u-boot.bin: $(obj)u-boot

    $(OBJCOPY)${OBJCFLAGS} -O binary $< $@

    $(BOARD_SIZE_CHECK)

后添加如下内容( 添加的内容需要tab键缩进,否则编译报错 ),然后保存退出

@#./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

2.2 添加调试代码(点灯法)

很多时候我们不确定uboot是否已经在板子上运行,所以我们在uboot源码中添加一段 代码使板子上的LED点亮,这样如果看到LED亮的话就表示uboot已经在运行了

打开uboot启动后的第一段代码

$ vi arch/arm/cpu/armv7/start.S

在第134行后添加如下代码(即点亮LED2),然后保存退出

ldr r0, =0x11000c40
ldr r1, [r0]
bic r1, r1, #0xf0000000
orr r1, r1, #0x10000000
str r1, [r0]
ldr r0, =0x11000c44
mov r1, #0xff
str r1, [r0]

​​​​​​2.3 添加编译脚本

使用make命令编译时只链接uboot源码中的相关代码,而我们添加的 初始引导加密 代码不会被连接到u-boot.bin中,所以这里我们自己编写编译脚本build.sh,这个脚本 中除了对uboot源码进行配置和编译外还将 初始引导加密 代码链接到了u-boot.bin上, 最终生成一个完成的uboot镜像u-boot-fs4412.bin

将资料中“ 移植相关文件 下的build.sh 拷贝到uboot 源码 的顶层目录

给编译脚本添加可执行权限

$ chmod 777 build.sh

build.sh中内容主要是实现make fs4412_config 和make -j 多核数

把三星的引导文件合并为了u-boot-fs4412.bin(不需要过多了解)

2.4 编译uboot

通过脚本编译uboot源码

$ ./build.sh

编译完成后在源码的顶层目录下会生成“u-boot-fs4412.bin”

2.5 测试uboot

参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象,若LED2点亮则说明我自己移植的u-boot已经能够被加载运行

3 实现串口输出

虽然uboot已经能在开发板上加载运行,但是 此时的uboot 还不能在终端上打印信息, 原因在于uboot源码中对UART的配置与我们实际的硬件 不匹配

3.1 修改UART源码

$ vi board/samsung/fs4412/lowlevel_init.S

lowlevel_init:

后添加如下内容(初始化临时栈)

dr sp,=0x02060000

beq wakeup_reset

后添加如下内容(关闭看门狗)

#if 1

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

uart_asm_init:

/* setup UART0-UART3 GPIOs (part1) */

mov r0, r7

ldr r1, =EXYNOS4_GPIO_A0_CON_VAL

str r1, [r0, #EXYNOS4_GPIO_A0_CON_OFFSET]

ldr r1, =EXYNOS4_GPIO_A1_CON_VAL

str r1, [r0, #EXYNOS4_GPIO_A1_CON_OFFSET]

后添加如下内容(UART初始化)

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]

注释掉

bl uart_asm_init

后的一条语句,然后保存退出

#if 0

bl tzpc_init

#endif

3.2 编译uboot

通过脚本编译uboot源码

$ ./build.sh

3.3 测试uboot

参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象,若终端有打印信息则说明UART移植成功

4 网卡移植

虽然可以通过终端输入命令,但此时的uboot还不能使用ping、tftp等命令,原因在于 命令都是操作网络的,而uboot源码中网卡的相关配置与我们当前的板子不匹配 ,所以 我们还要对网卡进行移植

4.1 修改网络初始化代码

$ vi board/samsung/fs4412/fs4412.c

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

};



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

​​​​​​​4.2 修改网络配置代码

$ vi include/configs/fs4412.h

#undef CONFIG_CMD_PING

修改为

#define CONFIG_CMD_PING

再将

#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.9.200

#define CONFIG_SERVERIP 192.168.9.120

#define CONFIG_GATEWAYIP 192.168.9.1

#define CONFIG_NETMASK 255.255.255.0

#endif

​​​​​​​4.3 编译uboot

通过脚本编译uboot源码

$ ./build.sh

​​​​​​​4.4 测试uboot

参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象;设置好相关的环境变量,使用网线连接开发板与开发主机,使用 ping命令连接ubuntu,若显示“host xxx.xxx.xxx.xxx is alive”则表示网卡移植成功

​​​​​​​5 EMMC移植

因为uboot源码中对EMMC的配置与我们的板子不匹配,这里还需要对EMMC相关的 代码进行修改和配置

5.1 修改EMMC初始化代码

将资料中“ 移植相关文件 下的 movi.c拷贝到uboot 源码 arch/arm/cpu/armv7/exynos/ 目录

因为添加的新文件也要编译,所以对应的Makefile也要修改

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

COBJS += clock.o power.o soc.o system.o pinmux.o

修改为如下内容,然后保存退出

COBJS += clock.o power.o soc.o system.o pinmux.o movi.o

修改板级文件

$ vi board/samsung/fs4412/fs4412.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

}

将board_mmc_init函数中的内容修改为( 之前的内容删除即可 )如下内容

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

​​​​​​​5.2 添加EMMC命令

将资料中“ 移植相关文件 下的 cmd_movi.c、cmd_mmc.c、cmd_mmc_fdisk.c 拷贝到uboot 源码 common / 目录

因为添加的新文件也要编译,所以对应的Makefile也要修改

$ vi common/Makefile

COBJS-$(CONFIG_CMD_MMC) += cmd_mmc.o

后添加如下内容,然后保存退出

COBJS-$(CONFIG_CMD_MMC) += cmd_mmc_fdisk.o

COBJS-$(CONFIG_CMD_MOVINAND) += cmd_movi.o

将资料中“ 移植相关文件 下的 mmc.c、s5p_mshc.c 拷贝到uboot 源码 drivers/mmc/ 目录

将资料中“ 移植相关文件 下的 mmc.h、movi.h、s5p_mshc.h 拷贝到uboot 源码 include/ 目录

因为添加的新文件也要编译,所以对应的Makefile也要修改

$ vi drivers/mmc/Makefile

COBJS-$(CONFIG_S5P_SDHCI) += s5p_sdhci.o

后添加如下内容,然后保存退出

COBJS-$(CONFIG_S5P_MSHC) += s5p_mshc.o

5.3 修改EMMC配置代码

 $ vi include/configs/fs4412.h

在文件的末尾

#endif /* __CONFIG_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) */

#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

​​​​​​​5.4 编译uboot

通过脚本编译uboot源码

$ ./build.sh

​​​​​​​5.5 测试uboot

参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动, 然后上电查看现象;若显示EMMC的相关信息则表示EMMC移植成功

6 电源管理移植

因为uboot源码中对电源管理芯片的配置与我们的板子不匹配,后续有可能会导致内核 启动卡死,这里还需要对电源管理芯片相关的代码进行修改和配置

6.1 修改电源管理相关代码

将资料中“ 移植相关文件 下的 pmic_s5m8767.c 拷贝到uboot 源码 drivers/power/pmic/ 目录下 ​​​​​​​

因为添加的新文件也要编译,所以对应的Makefile也要修改

$ vi drivers/power/pmic/Makefile

COBJS-$(CONFIG_POWER_MAX77686) += pmic_max77686.o

后添加如下内容, 然后保存退出

COBJS-$(CONFIG_POWER_S5M8767) += pmic_s5m8767.o

将添加的函数在头文件中声明

$ vi include/power/pmic.h

int pmic_set_output(struct pmic *p, u32 reg, int ldo, int on);

后添加如下内容, 然后保存退出

void pmic_s5m8767_init(void);

修改配置文件

$ vi include/configs/fs4412.h

在文件末尾

#endif /* __CONFIG_H */

前添加如下内容,然后保存退出

#define CONFIG_POWER_S5M8767

修改板级文件

$ vi board/samsung/fs4412/fs4412.c

在board_init函数中

#ifdef CONFIG_DRIVER_DM9000

dm9000aep_pre_init();

#endif

后添加如下内容, 然后保存退出

#ifdef CONFIG_POWER_S5M8767

pmic_s5m8767_init();

#endif

注释原有的代码

$ vi drivers/power/Makefile

COBJS-$(CONFIG_POWER) += power_core.o

修改为(即注释掉)

#COBJS-$(CONFIG_POWER) += power_core.o

修改架构文件

$ vi arch/arm/cpu/armv7/s5p-common/cpu_info.c

#include <asm/arch/clk.h>

后添加如下内容, 然后保存退出

#include <power/pmic.h>

​​​​​​​6.2 编译uboot

通过脚本编译uboot源码

$ ./build.sh

6.3 测试uboot

参照之前的实验将生成的u-boot-fs4412.bin烧写到SD卡中,开发板选择SD卡启动,然后上电查看现象

至此,uboot移植完成

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

lv12 uboot移植深化 9 的相关文章

  • linux 网络

    网络基础 协议的概念 什么是协议 从应用的角度出发 协议可理解为 规则 是数据传输和数据的解释的规则 假设 A B双方欲传输文件 规定 第一次 传输文件名 接收方接收到文件名 应答OK给传输方 第二次 发送文件的尺寸 接收方接收到该数据再次
  • thttpd嵌入式www服务工具的使用

    thttpd是一个非常小巧的轻量级web server 它非常简单 仅仅提供了HTTP 1 1和简单的CGI支持 在其官方网站上有一个与其他web server 如Apache Zeus等 的对比图 Benchmark 可以参考 此外 th
  • linux的应用线程同步与驱动同步机制

    同步机制 在 Linux 应用程序和内核中的驱动程序中 有一些常见的同步机制用于实现线程或进程之间的同步和数据访问保护 下面是它们的一些主要机制 Linux 应用程序中的同步机制 互斥锁 Mutex 用于保护共享资源 确保只有一个线程可以访
  • RTOS专栏(一) —— rt-thread简单介绍和qemu使用

    本期主题 简单介绍rt thread 介绍qemu和rt thread怎么配合使用 qemu的简单例子 rt thread qemu 1 rt thread介绍 2 qemu介绍 3 搭建rt thread和qemu开发环境 4 简单例子
  • TQ210烧写uboot secureCRT和minicom都没有信息输出

    前几天一直在纠结TQ210烧写uboot 串口没有信息打印信息输出 结果又是这样的 说明波特率 串口号都是正确的 开发板一上电 按住空格键 结果还是一样 本以为是这个软件是破解版 有BUG 好 切换到LINUX 使用minicom 试试 还
  • FPGA UART仿真

    摘自威三学员尤凯元 tb文件 Copyright c 2014 2019 All rights reserved Author Youkaiyuan v3eduyky 126 com wechat 15921999232 File tb t
  • 开始前准备

    开始前准备 一 环境预览 二 安装Ubuntu 三 安装arm gcc工具链 四 Ubuntu构建LiteOS所需要的工具链 五 安装STM32CubeMX软件 六 串口调试助手下载 七 ST Link和USB转TTL串口调试工具 一 环境
  • 开发板配置NFS服务

    文章目录 NFS介绍 NFS版本 NFS服务器和客户端 安装NFS 配置NFS服务器 启动NFS服务 挂载NFS共享 NFS安全性 NFS日志 开发板配置NFS环境 环境 操作前先关闭防火墙 配置过程 server端的配置 开发板的操作 常
  • 在ubuntu20.04上安装arm-linux-gcc 4.4.3

    1下载地址 http www friendlyelec com cn download asp 2 将 arm linux gcc 4 4 3 tar gz 拷贝到 bin目录 无法拷贝怎么办 出现这种情况是 Linux 拷贝文件时权限不够
  • 将uboot,kernel,rootfs下载到开发板上

    1 为什么要下载 所谓下载 也称烧录 部署 1 1 什么是u boot Hi3518EV200 单板的 Bootloader 采用 U boot u boot是一种普遍用于嵌入式系统中的Bootloader Bootloader是在操作系统
  • 【uboot内核适配学习】uboot 修改默认ip

    1 修改默认ip作用 设备出场的时候都需要默认的ip 2 修改措施 找到uboot芯片配置文件 不同芯片厂家适配的文件必定是不一样的 位置也可能不一样 define CONFIG ETHADDR 00 40 5c 26 0a 5b MAC地
  • 定时器详解

    1 什么是定时器 timer 定时器实际上就是Soc当中的一个内部外设 1 定时器与计数器 定时器常与计数器扯到一起 计数器也是soc当中的一个内部外设 计数器顾名思义是用来计数的 就和我们的秒表一样 秒表实际上就是一个计数器 每隔一个单位
  • 如何在U-Boot和Linux内核中添加自定义的ATAG变量?

    我要添加定制atagU Boot 和 Linux 内核中的变量 我怎样才能做到这一点 有没有什么程序可以添加ATAG变量在U Boot and Linux 最新的 Linux 内核正试图废弃ATAGS with 设备树 但是 那setup
  • lv12 uboot移植深化 9

    u boot 2013 0 1移植 实验目的 了解 u boot 的代码结构及移植 的基本 方法 实验环境 u buntu 14 04
  • lv12 uboot源码配置编译 8

    目录 1 uboot源码获取 2 uboot特定 3 uboot源码结构 3 1 平台相关代码 3 1 1 arch 3 1 2 board 3 2 平台无关代码 3 2 1 common下放的都是uboot的命令 3 3 配置文件 帮助文
  • 移植useradd到嵌入式Linux设备

    友情提示 前面一大段描述的是在老版本Ubuntu14 4交叉编译新版本shadow 过程曲折 没有结果 分割线后面一段是重新换了一个较老版本shadow 4 4 过程丝滑 结果喜人 诸君如耐心有限可直接划拉至分割线后部分内容 对于其他程序的
  • <sa8650>sa8650 CDT-之-汽车CDT配置用户指南(上)

    sa8650 sa8650 CDT 之 汽车CDT配置用户指南 上 2 CDT概述 2 1 Platform ID值 2 2 CDT一般结构 2 3 CDT头 2 4 块元数据 2 5 CDBs 2 6 加载CDT的启动过程
  • u-boot 可以支持多个以太网端口吗?

    我想从多个以太网端口执行 ping 操作 u boot 仅支持单个以太网端口是否存在固有限制 u boot 可以支持多个以太网端口吗 是的 在最近版本的 U Boot 中 至少可以追溯到 2012 10 突出的代码是eth current
  • 【学习分享】全志平台TWI子系统源码分析(1)从设备树到寄存器

    全志平台TWI子系统源码分析 1 从设备树到寄存器 前言 一 名词解释 二 从设备树入手看源码 1 TWI设备树 2 TWI源码位置 3 TWI总线相关寄存器 总结 前言 这次开坑主要是想把全志平台TWI子系统在源
  • 基于 BBB DT 的方法

    我已经使用平台设备模型成功为我的自定义协议实现了基于 GPIO 的驱动程序 我想使用设备树方法升级它 因此 对于初学者来说 我有一个 beaglebone black 并且我使用在 uboot 控制台消息显示期间启用和验证的设备树配置交叉编

随机推荐

  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • Web自动化测试适用于哪些场景?看完这篇文章你就知道了!

    前言 在软件开发的过程中 测试是不可或缺的环节 而随着web应用的普及 web自动化测试也成为了非常重要的一部分 本文将介绍web自动化测试的概念和常见应用场景 并给出一个示例代码 一 什么是web自动化测试 Web自动化测试是指通过编写程
  • 开源AI云测试平台,Hydra Lab

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 8k次 点赞82次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 【算法】【动规】最长递增子序列

    跳转汇总链接 动态规划算法汇总链接 2 1 最长递增子序列 题目链接 给你一个整数数组 nums 找到其中最长严格递增子序列的长度 子序列是由数组派生而来的序列 删除 或不删除 数组中的元素而 不改变其余元素的顺序 例如 3 6 2 7 是
  • debug点f8step over会进入class文件

    File gt settings gt Bulid Executiong Deployment gt Debugger gt Stepping 取消如图对钩即可
  • SoapUI、Jmeter、Postman三种接口测试工具的比较分析!

    前段时间忙于接口测试 也看了几款接口测试工具 简单从几个角度做了个比较 拿出来与诸位分享一下 本文 从多个方面对接口测试的三款常用工具进行比较分析 以便于在特定的情况下选择最合适的工具 或者使用自己编写的工具 不同工具定位不同 我们只是主要
  • 关于在redis中查找键值对报java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to...的问题

    valueOperations get SystemInfo 返回linkedHashMap类型 在Java中 LinkedHashMap 是一个类 它继承自 HashMap 并保持插入顺序 它的设计使得我们可以更容易地按照插入顺序迭代元素
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 谷歌浏览器导出非http无法直接打开

    解决方法 1 打开谷歌浏览器右上角三个点 点击设置前往隐私和安全菜单 2 打开隐私和安全点击网站设置 网站设置拉至页面最下方 展开更多设置点击不安全内容页面 不安全内容页面最下方添加网站网址即可
  • 【数据结构】单链表的定义和操作

    目录 1 单链表的定义 2 单链表的创建和初始化 3 单链表的插入节点操作 4 单链表的删除节点操作 5 单链表的查找节点操作 6 单链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 基于ssm足球联赛管理系统

    摘 要 随着计算机技术发展 计算机系统的应用已延伸到社会的各个领域 大量基于网络的广泛应用给生活带来了十分的便利 所以把足球联赛管理与现在网络相结合 利用计算机搭建足球联赛管理系统 实现足球联赛管理系统的信息化 则对于进一步提高足球联赛管理
  • WOA-BILSTM-Attention基于鲸鱼算法优化双向长短期记忆网络结合注意力机制回归预测,多变量输入模型

    文章目录 效果一览 文章概述 订阅专栏只能获取专栏内一份代码 部分源码 参考资料
  • arm Linux中dma的cache管理

    概述 前两周有人询问DMA下的cache操作和dma coherent 以前零碎看过代码 临时找 还没有找到 这两天整理了调用流程 也找到了dma coherent的用法 Linux的文档里没有详细说明dma coherent的用法 根据代
  • 设计模式—迭代器模式解析

    本文参考学习了 图解设计模式 中的代码实现和原理解释 迭代器模式 简介 Iterator 模式用于在数据集合中按照顺序遍历集合 就类似于我们的循环 一个个去遍历一个集合中的所有元素 示例代码 首先我们思考一个书本和书架的关系 显然 书架可以
  • linux面试题分享

    1 简述RAID0 1 5 10的区别 什么是LVM RAID与LVM的使用场景 RAID0需要两块以上硬盘 不提供冗余或错误修复能力 速度快 磁盘利用率100 RAID1需要两块以上硬盘 提供数据块冗余 磁盘利用率50 RAID5需要三块
  • 应对压力:14个方法助你有效缓解

    在快节奏的现代生活中 我们常常会感受到各种各样的压力 这些压力可能来自于工作 学习 人际关系 甚至是生活中的一些琐事 过度的压力会对我们的身心健康造成严重的影响 因此学会有效地缓解压力变得尤为重要 本文将介绍14个简单易行的方法 帮助你应对
  • 嵌入式开发、C++后端开发、C++音视频开发怎么选择?

    嵌入式开发 C 后端开发和C 音视频开发的选择问题 近年来 随着互联网和物联网的快速发展 嵌入式开发 C 后端开发和C 音视频开发等职业领域也逐渐受到广泛关注 对于有志于从事这些领域的人来说 如何做出选择呢 下面将从前景 薪酬和职业稳定性等
  • The content of element type “mapper“ must match “(cache-ref|cache|resultMap*|parameterMap*|sql*|inse

    这段话的意思是告诉你标签没有写全 比如
  • 软件测试市场复苏了!

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • lv12 uboot移植深化 9

    u boot 2013 0 1移植 实验目的 了解 u boot 的代码结构及移植 的基本 方法 实验环境 u buntu 14 04