U-Boot移植 (2)- LCD 驱动修改和网络驱动修改

news2024/11/25 7:53:07

文章目录

    • 1. LCD 驱动修改
      • 1.1 修改c文件配置
      • 1.2 修改h文件配置
      • 1.3 编译测试
    • 2. 网络驱动修改
      • 2.1 I.MX6U-ALPHA 开发板网络简介
      • 2.2 网络 PHY 地址修改
      • 2.3 删除 uboot 中 74LV595 的驱动代码
      • 2.4 添加开发板网络复位引脚驱动
      • 2.5 更新 PHY 的连接状态和速度
      • 2.6 烧写调试
      • 2.7 测试一下 ENET1
      • 2.8 其他需要修改的地方

1. LCD 驱动修改

一般 uboot 中修改驱动基本都是在 xxx.h 和 xxx.c 这两个文件中进行的, xxx 为板子名称,即board/freescale/mx6ull_myboard/mx6ull_myboard.cinclude/configs/mx6ull_myboard.h这两个文件。

一般修改 LCD 驱动重点注意以下几点:

  • LCD 所使用的 GPIO,查看 uboot 中 LCD 的 IO 配置是否正确
  • LCD 背光引脚 GPIO 的配置
  • LCD 配置参数是否正确

正点原子的 I.MX6U-ALPHA 开发板 LCD 原理图和 NXP 官方 I.MX6ULL 开发板一致,也就是 LCD 的 IO 和背光 IO 都一样的,所以 IO 部分就不用修改了。

1.1 修改c文件配置

需要修改的之后 LCD 参数,打开文件 mx6ull_myboard.c,找到如下所示内容:

struct display_info_t const displays[] = {{
	.bus = MX6UL_LCDIF1_BASE_ADDR,
	.addr = 0,
	.pixfmt = 24,
	.detect = NULL,
	.enable	= do_enable_parallel_lcd,
	.mode	= {
		.name			= "TFT43AB",
		.xres           = 480,
		.yres           = 272,
		.pixclock       = 108695,
		.left_margin    = 8,
		.right_margin   = 4,
		.upper_margin   = 2,
		.lower_margin   = 4,
		.hsync_len      = 41,
		.vsync_len      = 10,
		.sync           = 0,
		.vmode          = FB_VMODE_NONINTERLACED
} } };

先来分析一下这段代码,该代码定义了一个变量displays,类型为display_info_t,这个结构体是LCD信息结构体,其中包括了LCD的分辨率,像素格式,LCD的各个参数等。

display_info_t 定义在文件 arch/arm/include/asm/imx-common/video.h 中,定义如下:

struct display_info_t {
	int	bus;
	int	addr;
	int	pixfmt;
	int	(*detect)(struct display_info_t const *dev);
	void	(*enable)(struct display_info_t const *dev);
	struct	fb_videomode mode;
};

这里的pixfmt是像素格式,也就是一个像素点是多少位,如果是RGB565的话就是16位,如果是RGB888的话就是24位,一般使用 RGB888。

结构体display_info_t还有个mode成员变量,此成员变量也是个结构体,为fb_videomode,定义在文件 include/linux/fb.h 中,定义如下:

struct fb_videomode {
	const char *name;	/* optional */
	u32 refresh;		/* optional */
	u32 xres;
	u32 yres;
	u32 pixclock;
	u32 left_margin;
	u32 right_margin;
	u32 upper_margin;
	u32 lower_margin;
	u32 hsync_len;
	u32 vsync_len;
	u32 sync;
	u32 vmode;
	u32 flag;
};

结构体b_videomode里面的成员变量为LCD的参数,这些成员变量函数如下:

  • name :LCD 名字,要和环境变量中的 panel 相等
  • xres 、yres :LCD X 轴和 Y 轴像素数量
  • pixclock:像素时钟,每个像素时钟周期的长度,单位为皮秒
  • left_margin :HBP(horizontal back porch),水平同步后肩
  • right_margin :HFP(horizontal front porch),水平同步前肩
  • upper_margin:VBP(vertical back porch),垂直同步后肩
  • lower_margin:VFP(vertical front porch),垂直同步前肩
  • hsync_len :HSPW(horizontal sync pulse width),行同步脉宽
  • vsync_len:VSPW(vertical sync pulse width),垂直同步脉宽
  • vmode :大多数使用 FB_VMODE_NONINTERLACED,也就是不使用隔行扫描。

这些参数需要与实用的LCD的参数一致,唯一不同的像素时钟 pixclock 的含义不同 。

「正点原子的7寸RGB屏幕」(ATK7016,1024x600)的一些参数如下:

参数
width1024
height600
HBP140
HFP160
VBP20
VFP12
HSPW20
VSPW3

像素时钟
像素时钟就是 RGB LCD 的时钟信号,以 ATK7016 这款屏幕为例,显示一帧图像所需要的时钟数就是:

= (VSPW+VBP+LINE+VFP) * (HSPW + HBP + HOZVAL + HFP)
= (3 + 20 + 600 + 12) * (20 + 140 + 1024 + 160)
= 635 * 1344
= 853440

显示一帧图像需要853440个时钟数,那么显示60帧就是: 853440 * 60 = 51206400≈51.2M,所以像素时钟就是 51.2MHz。 因此:

pixclock=(1/51200000)*10^12=19531

在根据其他的屏幕参数,可以得出 ATK7016 屏幕的配置参数如下:

struct display_info_t const displays[] = {{
	.bus = MX6UL_LCDIF1_BASE_ADDR,
	.addr = 0,
	.pixfmt = 24,
	.detect = NULL,
	.enable	= do_enable_parallel_lcd,
	.mode	= {
		.name           = "TFT7016",
		.xres           = 1024,
		.yres           = 600,
		.pixclock       = 19531,
		.left_margin    = 100,		//HBPD
		.right_margin   = 88,		//HFPD
		.upper_margin   = 39,		//VBPD
		.lower_margin   = 21,		//VFBD
		.hsync_len      = 48,		//HSPW
		.vsync_len      = 3,		//VSPW
		.sync           = 0,
		.vmode          = FB_VMODE_NONINTERLACED
} } };

1.2 修改h文件配置

另外还要修改include/configs/路径下的mx6ull_myboard.h,找到所有如下语句:

panel=TFT43AB

将其改为:

panel=TFT7016

也就是设置 panel 为 TFT7016, panel 的值要与displays.name 成员变量的值一致。修改完成以后重新编译一遍 uboot 并烧写到 SD 中启动

1.3 编译测试

将修改后的uboot编译下载以后,LCD 驱动一般就会工作正常了,LCD 上会显示 NXP 的 logo

U-Boot 2016.03 (Jun 26 2023 - 22:21:59 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 48C
Reset cause: WDOG
Board: MX6ULL 14x14 EVK
I2C:   ready
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Display: TFT7016 (1024x600)
Video: 1024x600x24
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
Net:   Board Net Initialization Failed
No ethernet found.
Normal Boot
Hit any key to stop autoboot:  0

在这里插入图片描述

2. 网络驱动修改

2.1 I.MX6U-ALPHA 开发板网络简介

I.MX6ULL内部有个以太网MAC外设,也就是ENET,需要外接一个PHY芯片来实现网络通信功能,也就是 「内部MAC+外部PHY芯片」 的方案。

I.MX6UL/ULL 有两个网络接口 ENET1ENET2,正点原子的 I.MX6U-ALPHA 开发板提供了这两个网络接口,其中 ENET1ENET2 都使用 LAN8720A 作为 PHY 芯片。 NXP 官方的I.MX6ULL EVK 开发板使用 KSZ8081 这颗 PHY 芯片。更换 PHY 芯片以后需要调整网络驱动,使网络工作正常。

ENET1

在这里插入图片描述

ENET1 的网络 PHY 芯片为 LAN8720A,通过 RMII 接口与 I.MX6ULL 相连,正点原子I.MX6U-ALPHA 开发板的 ENET1 引脚与 NXP 官方的 I.MX6ULL EVK 开发板基本一样,唯独复位引脚不同。正点原子I.MX6U-ALPHA 开发板的 ENET1 复位引脚ENET1_RST 接到了 I.M6ULLSNVS_TAMPER7 这个引脚上

I.MX6ULL 通过 MDIO接口来读取 PHY 芯片的内部寄存器, MDIO 接口有两个引脚, ENET_MDC 和 ENET_MDIO,ENET_MDC 提供时钟, ENET_MDIO 进行数据传输。一个 MDIO 接口可以管理 32 个 PHY 芯片,同一个 MDIO 接口下的这些 PHY 使用不同的器件地址来做区分, MIDO 接口通过不同的器件地址即可访问到相应的 PHY 芯片。

I.MX6U-ALPHA 开发板 ENET1 上连接的 LAN8720A器件地址为 0X0,所示要修改 ENET1 网络驱动重点就三点:

①、 ENET1 复位引脚初始化。
②、 LAN8720A 的器件 ID。
③、 LAN8720 驱动

ENET2

在这里插入图片描述

关于 ENET2 网络驱动的修改也注意一下三点:
①、 ENET2 的复位引脚,ENET2 的复位引脚 ENET2_RST 接到了I.MX6ULL 的 SNVS_TAMPER8
②、 ENET2 所使用的 PHY 芯片器件地址,PHY 器件地址为 0X1。
③、 LAN8720 驱动, ENET1 和 ENET2 都使用的 LAN8720,所以驱动是一样的。

2.2 网络 PHY 地址修改

首先修改 uboot 中的 ENET1 和 ENET2 的 PHY 地址和驱动,打开 mx6ull_myboard.h这个文件,找到如下代码:

#define CONFIG_FEC_ENET_DEV		1

#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE			ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR          0x2
#define CONFIG_FEC_XCV_TYPE             RMII
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE			ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR		0x1
#define CONFIG_FEC_XCV_TYPE		RMII
#endif
#define CONFIG_ETHPRIME			"FEC"

#define CONFIG_PHYLIB
#define CONFIG_PHY_MICREL
#endif
  • 第 331 行的宏 CONFIG_FEC_ENET_DEV 用于选择使用哪个网口,默认为 1,也就是选择ENET2

  • 第 335 行为 ENET1 的 PHY 地址,默认是 0X2

  • 第 339 行为 ENET2 的 PHY 地址,默认为 0x1

根据前面的分析可知,正点原子的 I.MX6U-ALPHA 开发板 ENET1 的 PHY 地址为0X0, ENET2 的 PHY 地址为 0X1,所以需要将第 335 行的宏 CONFIG_FEC_MXC_PHYADDR改为 0x0。  

如果要使用 LAN8720A,那么就得将 CONFIG_PHY_MICREL 改为 CONFIG_PHY_SMSC,也就是使能 uboot 中的 SMSC 公司中的 PHY 驱动,因为 LAN8720A 就是 SMSC 公司生产的。

所以示例代码有三处要修改:

①、修改 ENET1 网络 PHY 的地址。
②、修改 ENET2 网络 PHY 的地址。
③、使能 SMSC 公司的 PHY 驱动。

修改后的网络 PHY 地址参数如下所示:

#define CONFIG_FEC_ENET_DEV		1

#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE			ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR          0x0
#define CONFIG_FEC_XCV_TYPE             RMII
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE			ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR		0x1
#define CONFIG_FEC_XCV_TYPE		RMII
#endif
#define CONFIG_ETHPRIME			"FEC"

#define CONFIG_PHYLIB
#define CONFIG_PHY_SMSC
#endif

2.3 删除 uboot 中 74LV595 的驱动代码

1、uboot 中网络 PHY 芯片地址修改完成以后就是网络复位引脚的驱动修改了,打开mx6ull_myboard.c,找到如下代码:

#define IOX_SDI IMX_GPIO_NR(5, 10)
#define IOX_STCP IMX_GPIO_NR(5, 7)
#define IOX_SHCP IMX_GPIO_NR(5, 11)
#define IOX_OE IMX_GPIO_NR(5, 8)

以 IOX 开头的宏定义是 74LV595 的相关 GPIO,因为 NXP 官方I.MX6ULL EVK 开发板使用 74LV595 来扩展 IO,两个网络的复位引脚就是由 74LV595 来控制的。正点原子的 I.MX6U-ALPHA 开发板并没有使用 74LV595,因此我们将代码的代码删除掉,替换为

#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)

NET1 的复位引脚连接到 SNVS_TAMPER7 上,对应 GPIO5_IO07, ENET2 的复位引脚连接到 SNVS_TAMPER8 上,对应 GPIO5_IO08。

2、继续在 mx6ull_myboard.c 中找到如下代码:

static iomux_v3_cfg_t const iox_pads[] = {
	/* IOX_SDI */
	MX6_PAD_BOOT_MODE0__GPIO5_IO10 | MUX_PAD_CTRL(NO_PAD_CTRL),
	/* IOX_SHCP */
	MX6_PAD_BOOT_MODE1__GPIO5_IO11 | MUX_PAD_CTRL(NO_PAD_CTRL),
	/* IOX_STCP */
	MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
	/* IOX_nOE */
	MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
};

示例代码是 74LV595 的 IO 配置参数结构体,将其删除掉。

3、继续在mx6ull_myboard.c 中找到函数 iox74lv_init

static void iox74lv_init(void)
{
	int i;

	gpio_direction_output(IOX_OE, 0);

............

	gpio_direction_output(IOX_STCP, 1);
};

void iox74lv_set(int index)
{
	int i;

............

	gpio_direction_output(IOX_STCP, 1);
};

iox74lv_init 函数是 74LV595 的初始化函数, iox74lv_set 函数用于控制 74LV595 的 IO 输出电平,将这两个函数全部删除掉!

4、在 mx6ull_myboard.c 中找到 board_init 函数,此函数是板子初始化函数,会被board_init_r 调用, board_init 函数内容如下:

int board_init(void)
{
	.......
	imx_iomux_v3_setup_multiple_pads(iox_pads, ARRAY_SIZE(iox_pads));
	iox74lv_init();
	.......
	return 0;
}

board_init 会调用 imx_iomux_v3_setup_multiple_pads 和 iox74lv_init 这两个函数来初始化74lv595 的 GPIO,将这两行删除掉。

至此, mx6ull_myboard.c 中关于 74LV595 芯片的驱动代码都删除掉了,接下来就是添加 I.MX6U-ALPHA 开发板两个网络复位引脚了。

2.4 添加开发板网络复位引脚驱动

在 mx6ull_myboard.c 中找到如下所示代码:

static iomux_v3_cfg_t const fec1_pads[] = {
	MX6_PAD_GPIO1_IO06__ENET1_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
	MX6_PAD_GPIO1_IO07__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
	........
	MX6_PAD_ENET1_RX_ER__ENET1_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET1_RX_EN__ENET1_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
};

static iomux_v3_cfg_t const fec2_pads[] = {
	MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
	MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
	........
	MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
};

结构体数组 fec1_pads 和 fec2_pads 是 ENET1 和 ENET2 这两个网口的 IO 配置参数,在这两个数组中添加两个网口的复位 IO 配置参数,完成以后如下所示:

static iomux_v3_cfg_t const fec1_pads[] = {
	MX6_PAD_GPIO1_IO06__ENET1_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
	MX6_PAD_GPIO1_IO07__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
	........
	MX6_PAD_ENET1_RX_ER__ENET1_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET1_RX_EN__ENET1_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),           /* 初始化ETH1 RESET引脚 */
};

static iomux_v3_cfg_t const fec2_pads[] = {
	MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
	MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
	........
	MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),   /* 初始化ETH2 RESET引脚 */
};

别是 ENET1 和 ENET2 的复位 IO 配置参数。

继续在文件 mx6ull_myboard.c 中找到函数 setup_iomux_fec,此函数默认代码如下:

static void setup_iomux_fec(int fec_id)
{
	if (fec_id == 0)
		imx_iomux_v3_setup_multiple_pads(fec1_pads,
						 ARRAY_SIZE(fec1_pads));
	else
		imx_iomux_v3_setup_multiple_pads(fec2_pads,
						 ARRAY_SIZE(fec2_pads));
}

函数 setup_iomux_fec 就是根据 fec1_pads 和 fec2_pads 这两个网络 IO 配置数组来初始化I.MX6ULL 的网络 IO。需要在其中添加网络复位 IO 的初始化代码,并且复位一下 PHY 芯片,修改后的 setup_iomux_fec 函数如下:

static void setup_iomux_fec(int fec_id)
{
	if (fec_id == 0)
	{
		imx_iomux_v3_setup_multiple_pads(fec1_pads,
											ARRAY_SIZE(fec1_pads));

		gpio_direction_output(ENET1_RESET, 1);
		gpio_set_value(ENET1_RESET, 0);
		mdelay(100);
		gpio_set_value(ENET1_RESET, 1);
    }
			 
	else
	{
			imx_iomux_v3_setup_multiple_pads(fec2_pads,
												ARRAY_SIZE(fec2_pads));
			gpio_direction_output(ENET2_RESET, 1);
			gpio_set_value(ENET2_RESET, 0);
			mdelay(100);
			gpio_set_value(ENET2_RESET, 1);
	}

}

分别对应 ENET1 和 ENET2 的复位 IO 初始化,将这两个 IO 设置为输出并且硬件复位一下 LAN8720A

2.5 更新 PHY 的连接状态和速度

打开文件drivers/net/phy/phy.c,找到函数 genphy_update_link,这是个通用 PHY 驱动函数,此函数用于更新 PHY 的连接状态和速度。使用 LAN8720A 的时候需要在此函数中添加一些代码,修改后的函数 genphy_update_link 如下所示:

nt genphy_update_link(struct phy_device *phydev)
{
	unsigned int mii_reg;
#ifdef CONFIG_PHY_SMSC
        static int lan8720_flag = 0;
        int bmcr_reg = 0;

        if(lan8720_flag == 0)
        {
                bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);   /* Read the default value of BCMR register */
                phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET); /* Software reset*/
                mdelay(10);
                phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg);   /* Write the default value to BCMR register */
                lan8720_flag = 1;
        }
#endif

2.6 烧写调试

至此网络的复位引脚驱动修改完成,重新编译 uboot,然后将 u-boot.bin 烧写到 SD 卡中并启动, uboot 启动信息

U-Boot 2016.03 (Jun 26 2023 - 22:07:29 +0800)

U-Boot 2016.03 (Jun 26 2023 - 22:21:59 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 48C
Reset cause: WDOG
Board: MX6ULL 14x14 EVK
I2C:   ready
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Display: TFT7016 (1024x600)
Video: 1024x600x24
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
Net:   FEC1
Error: FEC1 address not set.

Normal Boot
Hit any key to stop autoboot:  0

可以看到“Net: FEC1”这一行,提示当前使用的 FEC1 这个网口,也就是 ENET2。

配置u-boot中环境变量设置命令如下所示:

setenv ipaddr 192.168.1.50
setenv ethaddr b8:ae:1d:01:00:00
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.253
saveenv
=> ping 192.168.1.253
FEC1 Waiting for PHY auto negotiation to complete.... done
Using FEC1 device
host 192.168.1.253 is alive

有“host 192.168.1.250 is alive”这句,说明 ping 主机成功,说明ENET2网络工作正常。

2.7 测试一下 ENET1

打开 mx6ull_alientek_emmc.h,将 CONFIG_FEC_ENET_DEV 改为 0,然后重新编译一下 uboot 并烧写到 SD 卡中重启。重启开发板,

U-Boot 2016.03 (Jun 26 2023 - 22:21:59 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 48C
Reset cause: WDOG
Board: MX6ULL 14x14 EVK
I2C:   ready
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Display: TFT7016 (1024x600)
Video: 1024x600x24
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
Net:   FEC0
Normal Boot
Hit any key to stop autoboot:  0

有“Net: FEC0”这一行,说明当前使用的 FEC0 这个网卡,也就是ENET1,同样的 ping 一下主机

=> ping 192.168.1.253
FEC0 Waiting for PHY auto negotiation to complete.... done
Using FEC0 device
host 192.168.1.253 is alive

ping 主机也成功,说明 ENET1 网络也工作正常,至此, I.MX6UALPHA 开发板的两个网络都工作正常了

2.8 其他需要修改的地方

在 uboot 启动信息中会有“Board: MX6ULL 14x14 EVK”这一句,也就是说板子名字为“ MX6ULL 14x14 EVK”,要将其改为我们所使用的板子名字,比如“ MX6ULL MYBOARD”。打开文件 mx6ull_myboard.c,找到函数checkboard,将其改为如下所示内容:

int checkboard(void)
{
	if (is_mx6ull_9x9_evk())
		puts("Board: MX6ULL 9x9 EVK\n");
	else
		puts("Board: MX6ULL MYBOARD\n");

	return 0;
}
U-Boot 2016.03 (Jun 26 2023 - 22:39:30 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 42C
Reset cause: POR
Board: MX6ULL MYBOARD
I2C:   ready
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Display: TFT7016 (1024x600)
Video: 1024x600x24
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
Net:   FEC1
Normal Boot
Hit any key to stop autoboot:  0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BERT模型蒸馏完全指南(原理技巧代码)

BERT模型蒸馏完全指南(原理/技巧/代码) 小朋友,关于模型蒸馏,你是否有很多问号: 蒸馏是什么?怎么蒸BERT?BERT蒸馏有什么技巧?如何调参?蒸馏代码怎么写?有现成的吗?今天rumor就结合Distilled BiLSTM/BERT-PKD/DistillBERT/TinyBERT/MobileBERT/MiniLM六大经典模型,…

vscode copilot长时间没反应

检测问题 首先看一下OUPUT插件信息有什么异常 如果没有异常,但是也没输出 那是请求没有相应的原因 可以在vscode里设置一下代理 参考:https://github.com/orgs/community/discussions/29127

Jenkins构建Python项目提示:‘python‘ 不是内部或外部命令,也不是可运行的程序

一、问题描述(1) 今天Darren洋在jenkins里构建与飞书机器人通知时,用python编写脚本时发现了以下报错:Jenkins构建Python项目提示:‘python‘ 不是内部或外部命令,也不是可运行的程序 二、解决办法 在配置…

Vue自定义指令及使用

一、什么是指令 学习 vue 的时候肯定会接触指令&#xff0c;那么什么是指令呢&#xff1f; 在 vue 中提供了一些对于页面和数据更为方便的输出&#xff0c;这些操作就叫做指令&#xff0c;以 v-xxx 表示&#xff0c;比如 html 页面中的属性<div v-xxx /div>比如在 angu…

二叉树 — 求二叉树最宽层节点数

题目&#xff1a; 题目如标题所示&#xff0c;如果二叉树如下图所示&#xff0c;则最宽层数节点数为2&#xff08;b&#xff0c;c层&#xff09;。 分析&#xff1a; 依然是前面文章中提到的按层遍历&#xff0c;不过这次在按层遍历的过程中&#xff0c;需要知道每层结束的节…

【STM32智能车】运行状态

【STM32智能车】运行状态 小车状态完整代码 智能车不应该只能前进后退吧&#xff0c;本篇来做其他的小车运行状态。 想想&#xff0c;一辆车有那些状态呢&#xff1f;前进&#xff0c;后退&#xff0c;左转&#xff0c;右转&#xff0c;停止。之前定义了直行。 def go(speed):…

Matlab|改进的粒子群算法优化支持向量机(回归拟合)

作者在前面的文章中介绍了粒子群算法的原理及其2种改进算法&#xff0c;本文将基于这三种优化方法&#xff0c;应用于支持向量机进行预测&#xff0c;并对比改进算法与标准粒子群算法的预测性能&#xff0c;结果显示改进后的方法能够得到更佳的预测效果。 00 文章目录 1 支持…

Jenkins持续集成,在Linux中安装最新版Jenkins(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 去年从6月28日发布…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 3 日论文合集)

文章目录 一、分割|语义相关(4篇)1.1 SPAE: Semantic Pyramid AutoEncoder for Multimodal Generation with Frozen LLMs1.2 Achieving RGB-D level Segmentation Performance from a Single ToF Camera1.3 Topological Data Analysis Guided Segment Anything Model Prompt Op…

C++笔记之各种sleep方法总结

C笔记之sleep总结 —— 2023年4月9日 小问 上海 code review 文章目录 C笔记之sleep总结1.std::this\_thread::sleep\_for()附&#xff1a;std::this\_thread::sleep\_for(std::chrono::duration) 2.std::this\_thread::sleep\_until()附&#xff1a;std::this\_thread::sleep\…

c# 与单片机之间 float与byte的相互转化

该章作为 串口调试助手及结构体的收发的补充,主要用于自定义协议中的负数,浮点数等的收发(我们以前用的浮点数等,是直接使用的字符串的收发,从字符串中进行解析的,这里主要使用十六进制,对其收发原理及使用操作进行剖析)。 虚拟串口调试助手 一般来说,电脑的外部设备…

杂记 | 使用keycloak实现SSO单点登录(新手向,概念、原理、逻辑、详细步骤、难点解释)

文章目录 01 单点登录的概念02 keycloak的中的相关概念2.1 概念之间的关系2.2 案例说明 03 如何使用keycloak实现单点登录3.1 步骤与效果说明3.2 环境说明 04 操作步骤4.1 在服务器上创建并启动keycloak服务4.2 创建一个领域4.3 创建一个客户端4.4 获取客户端适配器配置4.5 创建…

C. Logo Turtle (DP,思维)

传送门 题意&#xff1a; 给一个含有T、F的字符串&#xff0c;T表示转向&#xff0c;F表示前进1格。现在可以把其中的T改为F&#xff0c;或F改为T&#xff0c;改变n次&#xff08;可重复改变某一位置的字母&#xff09;&#xff0c;问相对于起点最远能走多远。 思路&#xff…

quilt data 安装 数据包 框架

安装 Quilt 有两个用户可见的组件&#xff1a; 一个 Python 客户端一个 Web 目录 Python 客户端 需要 Python 3.7 或更高版本。 $ pip install quilt3[pyarrow]Mental Model Quilt 数据包的思维模型 Quilt 将数据集表示为数据包。一个数据包是一个不可变的相关文件集合&a…

Redis的主从复制、哨兵、cluster集群

Redis 主从复制 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务…

JAVA关于多线程的学习

1.创建线程的方法(这里不考虑继承Thread类) 通过实现Runnable接口的方式实现 public class MyRunnable implements Runnable{Overridepublic void run() {for (int i 0; i < 5; i) {System.out.println(Thread.currentThread().getName()"执行了....");}} }pub…

基于.Net Core微服务-第1章:说明及技术栈

微服务是一种架构模式&#xff0c;提倡将单一应用程序划分为一组小的服务&#xff0c;服务相互协调、互相配合&#xff0c;为用户提供最终价值。

vulnhub-ripper(易)

打靶练习Ripper&#xff0c;这是一个中低的靶场 0x00 部署0x01 信息收集&#xff1a;端口扫描、服务发现0x02路径扫描0x03 总结 0x00 部署 靶机&#xff1a;下载地址 宿主机&#xff1a;kali2021版本 0x01 信息收集&#xff1a;端口扫描、服务发现 sudo arp-scan -l #探测存…

【每日随笔】摩托车驾驶 ④ ( 德州增驾摩托车 D 本记录 | 考场位置 “ 德州市公安局交警支队直属四大队车辆管理所 “ )

文章目录 一、进入考场二、科目一三、科目二1、推车 ( 找准车辆停放位置 )2、上车前检查 ( 开始考试前准备 )3、科目二考试开始4、科目二路线要求5、坡起6、绕桩7、单边桥 四、科目三教学1、推车 ( 找准车辆停放位置 )2、上车前检查 ( 开始考试前准备 )3、科目三考试开始4、科目…

NSS [SWPUCTF 2021 新生赛]Do_you_know_http

NSS [SWPUCTF 2021 新生赛]Do_you_know_http 先看题目&#xff0c;应该是伪造XFF&#xff0c;UA等东西。 postman一把梭。