aspeed 2600适配u-boot/kernel

1.说明

本文采取aspeed sdk v09.01版本来适配自己的实际的硬件开发平台。!!非采取qemu模拟方式!!

2.采用的镜像文件

2.1 采用网站编译好的镜像

采用网站: https://github.com/AspeedTech-BMC/openbmc/releases的文件:
1.ast2600-default-515-obmc.tar.gz.选择里面的文件image-bmc.发现BMC启动不了,u-boot挂了。
2.ast2600-default-obmc.tar.gz里面的image-bmc.发现BMC启动不了,报错:

Boot from spi
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
Error loading kernel FIT image
ast# BP1c00

在这里插入图片描述

注意: 使用openbmc中的u-boot更新固件,在u-boot命令行可以采用的命令如下:

# mw 0x1E620064 0x500  //停止WDT2
# setenv gatewayip 10.245.27.1 //设置gatewayip
# setenv netmask 255.255.255.0 //设置网关
# dhcp //获取bmc ip 或者使用 setenv ipaddr 10.245.27.xx
# setenv serverip 10.245.27.xx  //设置tftp服务器ip目的地址
# tftp 0x81000000 image-bmc  //tftp 下载文件
# sf probe 0:0     //选中 flash0
# sf update 0x81000000 0x000000 0x4000000 //更新固件

2.2 自行编译镜像

从网站: https://github.com/AspeedTech-BMC/openbmc 上选择sdkv09.01版本的代码之后,编译:

$ source setup ast2600-default
$ bitbake obmc-phosphor-image

产生的固件image-bmc烧录之后,发现报错:

libfdt fdt_check_header(): FDT_ERR_BADMAGIC

使用命令print查看环境信息:

ast# print
baudrate=115200
boot_ast2700=echo "Boot from ${boot_device}!";if test ${boot_device} = mmc; then run bootmmc; fi;if test ${boot_device} = spi; then run bootspi; fi;ves
boot_device=spi
boota=setenv bootpart 2; setenv rootfs rofs-a; run setmmcargs; ext4load mmc 0:${bootpart} ${loadaddr} fitImage && bootm; echo Error loading kernel FITe
bootargs=console=ttyS4,115200n8 root=/dev/ram rw
bootb=setenv bootpart 3; setenv rootfs rofs-b; run setmmcargs; ext4load mmc 0:${bootpart} ${loadaddr} fitImage && bootm; echo Error loading kernel FITe
bootcmd=echo Boot from ${boot_device}; if test ${boot_device} = mmc; then run bootmmc; fi; if test ${boot_device} = spi; then run bootspi; fi;
bootdelay=2
bootfile=all.bin
bootmmc=if test "${bootside}" = "b"; then run bootb; run boota; else run boota; run bootb; fi
bootside=a
bootspi=fdt addr 20160000 && fdt header get fitsize totalsize && cp.b 20160000 ${loadaddr} ${fitsize} && bootm; echo Error loading kernel FIT image
fdtcontroladdr=bcf55f18
gatewayip=192.168.0.1
ipaddr=192.168.0.45
loadaddr=0x83000000
netmask=255.255.255.0
rootfs=rofs-a
serverip=192.168.0.81
setmmcargs=setenv bootargs ${bootargs} rootwait root=PARTLABEL=${rootfs}
stderr=serial@1e784000
stdin=serial@1e784000
stdout=serial@1e784000

Environment size: 1265/131068 bytes

环境变量默认值来源于:build/ast2600-default/workspace/sources/u-boot-aspeed-sdk/include/configs/evb_ast2600.h.
然后使用命令fdt addr:

ast# fdt addr 20160000
libfdt fdt_check_header(): FDT_ERR_BADMAGIC

分析到文件:meta-aspeed/conf/machine/evb-ast2600.conf中使用的dts信息:

KERNEL_DEVICETREE = "aspeed/aspeed-ast2600-evb.dtb"

UBOOT_MACHINE = "ast2600_openbmc_spl_defconfig"
UBOOT_DEVICETREE = "ast2600-evb"

查看linuxflash layout:
build/ast2600-default/workspace/sources/linux-aspeed/arch/arm/boot/dts/aspeed/aspeed-ast2600-evb.dts
中,引用了build/ast2600-default/workspace/sources/linux-aspeed/arch/arm/boot/dts/aspeed/aspeed-evb-flash-layout-64.dtsi

// SPDX-License-Identifier: GPL-2.0+
/*
 * Copyright (C) 2023 ASPEED.
 */

partitions {
	compatible = "fixed-partitions";
	#address-cells = <1>;
	#size-cells = <1>;

	u-boot@0 {
		reg = <0x0 0x140000>; // 1280KB
		label = "u-boot";
	};

	u-boot-env@140000 {
		reg = <0x140000 0x20000>; // 128KB
		label = "u-boot-env";
	};

	kernel@160000 {
		reg = <0x160000 0x800000>; // 8MB
		label = "kernel";
	};

	rofs@960000 {
		reg = <0x960000 0x24a0000>; // 36.625MB
		label = "rofs";
	};

	rwfs@2e00000 {
		reg = <0x2e00000 0x1200000>; // 18MB
		label = "rwfs";
	};
};

从基本信息来看,代码基本上没问题,那么,进入u-boot中手动去加载dts,查看是否仍然有问题:

1.在u-boot中disable FMC_WDT2

# mw 0x1e620064 0x0  //disable FMC_WDT2

2.在主机中,将fitImage文件拷贝到tftp服务器中:

# cp tmp/deploy/images/ast2600-default/fitImage /home/wityuan/Desktop/tftp

3.设置BMC的ip等信息

# setenv gatewayip 10.245.27.1
# setenv netmask 255.255.255.0
# dhcp
# setenv serverip 10.245.27.69 //服务器ip

4.在u-boot中加载fitImage

# tftp 0x83000000 fitImage

5.使用fdt addr加载fdt信息

# fdt addr 0x83000000
# fdt header get fitsize totalsize
# cp.b 0x83000000 ${loadaddr} ${fitsize}

6.启动linux

使用命令:

# bootm

可以看到系统加载成功。

在这里插入图片描述

7.排查

1.tftp 0x83000000 fitImage //将数据加载到0x83000000 地址上
2.使用md.b 0x83000000  20 查看数据
2.使用notepad++查看image-bmc的0x00160000地址上的数据

在这里插入图片描述
在这里插入图片描述
使用sf read读取flash0地址,发现数据不正确:
在这里插入图片描述
在这里插入图片描述
切换到flash2启动(包含正常启动的uboot),然后使用flash2排查flash1的数据:
在这里插入图片描述
数据符合预期。

因此: sdk09.01uboot代码是有问题的. 工具sf read需要修正或者仅仅是dts配置有问题,导致spi工作不正常。

修改build/ast2600-default/workspace/sources/u-boot-aspeed-sdk/arch/arm/dts/ast2600-evb.dts中:

&fmc {
	status = "okay";

	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_fmcquad_default>;

	flash@0 {
		compatible = "spi-flash", "sst,w25q256";
		status = "okay";
		spi-max-frequency = <50000000>;
		spi-tx-bus-width = <2>;
		spi-rx-bus-width = <2>;
	};

	flash@1 {
		compatible = "spi-flash", "sst,w25q256";
		status = "okay";
		spi-max-frequency = <50000000>;
		spi-tx-bus-width = <2>;
		spi-rx-bus-width = <2>;
	};
};

执行:

# bitbake -c build u-boot-aspeed-sdk
# bitbake -c deploy u-boot-aspeed-sdk

对于flash(mx66l512)芯片,默认的是3B模式,需要注意,后面u-boot代码都改为设置4B模式一次,详见代码:

在这里插入图片描述
另外,需要修改linux代码:build/ast2600-default/workspace/sources/linux-aspeed/arch/arm/boot/dts/aspeed/aspeed-ast2600-evb.dts:

&fmc {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_fwqspi_default>;

	flash@0 {
		status = "okay";
		m25p,fast-read;
		label = "bmc";
		spi-rx-bus-width = <2>;
		spi-tx-bus-width = <2>;
		spi-max-frequency = <50000000>;
#include "aspeed-evb-flash-layout-64.dtsi"
	};

	flash@1 {
		status = "okay";
		m25p,fast-read;
		label = "fmc0:1";
		spi-rx-bus-width = <2>;
		spi-tx-bus-width = <2>;
		spi-max-frequency = <50000000>;
	};

	flash@2 {
		status = "disabled";
		m25p,fast-read;
		label = "fmc0:2";
		spi-rx-bus-width = <4>;
		spi-tx-bus-width = <4>;
		spi-max-frequency = <50000000>;
	};
};

最重要的是需要设置:

		spi-rx-bus-width = <2>;
		spi-tx-bus-width = <2>;

否则会发生报错:

在这里插入图片描述
以上,修改完成后,在ac上电时候,需要进入u-boot手动禁止掉watchdog:

//disable fmc watchdog
# mw 0x1e620064 0x0
# //disable watchdog 
mw 0x1e78508c 0x0

以上,成功进入BMC系统:

在这里插入图片描述
在这里插入图片描述

3.适配网络

当前系统启动,网络并不能分配地址,报错如:
在这里插入图片描述

当前使用的是硬件上的MAC1(datasheet数值加1)连接RTL8211,作为dedicated网络。MAC2(datasheet数值加1)不做网络用途。

在这里插入图片描述

修改代码build/ast2600-default/workspace/sources/linux-aspeed/arch/arm/boot/dts/aspeed/aspeed-ast2600-evb.dts内容:

&mdio0 {
	status = "okay";

	ethphy0: ethernet-phy@0 {
		compatible = "ethernet-phy-ieee802.3-c22";
		reg = <1>;
	};
};

启动BMC后,能找到网卡设备:
在这里插入图片描述
在这里插入图片描述
web可以访问:

在这里插入图片描述
ssh也可以访问到:
在这里插入图片描述
ipmitool也可以访问到:
在这里插入图片描述

简单看一下"reg = <0x1>"的解析流程:

build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mdio/of_mdio.c
__of_mdiobus_register()
	 build/ast2600-default/workspace/sources/linux-aspeed/include/linux/of_mdio.h
--->  of_mdio_parse_addr() 
	---> ret = of_property_read_u32(np, "reg", &addr);
		/* A PHY must have a reg property in the range [0-31] */
    ---> if (addr >= PHY_MAX_ADDR) {  
        ...
		}

所以该:reg值的范围是0~31,概念为:PHY_MAX_ADDR.

原理图上为:

在这里插入图片描述

在这里插入图片描述
此处描述如果有误,还请告知^ _ ^ .

4.修复重启

如果AC,会发现BMC执行到kernel一段时间之后就会启动到flash2上,这是因为fmc watchdog的超时导致。

可以在uboot代码中:build/ast2600-default/workspace/sources/u-boot-aspeed-sdk/arch/arm/mach-aspeed/ast2600/board_common.c添加一段代码:

void board_add_ram_info(int use_default)
{
...
	//disable fmc watchdog and watchdog
	{
		unsigned long value = 0;
        //disable watchdog
        *((volatile unsigned long *)(0x1e78508c)) = 0x0;
		value = *((volatile unsigned long *)(0x1e78508c));
        printf("\nwatchdog stop: 0x%08x \n", value);
		//disable fmc watchdog
        *((volatile unsigned long *)(0x1e620064)) = 0x0;
		value = *((volatile unsigned long *)(0x1e620064));
        printf("\nfmc watchdog stop: 0x%08x \n", value);

	}
}
...

5.修复过多打印

例如串口频繁打印:

# [   45.604472] ipmi-ssif-host 4-0010: Warn: on_stop_event unexpected SLAVE STOP in state=SSIF_ABORTING

可以直接在代码里面:build/ast2600-default/workspace/sources/linux-aspeed/drivers/char/ipmi/ssif_bmc.c中注释:

		// dev_warn(&ssif_bmc->client->dev,
		// 	 "Warn: %s unexpected SLAVE STOP in state=%s\n",
		// 	 __func__, state_to_string(ssif_bmc->state));

			// dev_warn(&ssif_bmc->client->dev, "Warn: Unknown SMBus write command=0x%x",
			// 	 ssif_bmc->part_buf.smbus_cmd);

或者修改:build/ast2600-default/workspace/sources/linux-aspeed/arch/arm/boot/dts/aspeed/aspeed-ast2600-evb.dts

&i2c4 {
	status = "disabled";

	ssif-bmc@10 {
		compatible = "ssif-bmc";
		reg = <0x10>;
	};
};

不过修改dts !!未验证!!

备注

# setenv gatewayip 10.245.xx.xx
# setenv netmask 255.255.255.0
# dhcp
# setenv serverip 10.245.xx.xx
# tftp 0x83000000 image-u-boot
# sf probe 0
# sf update 0x83000000 0 $filesize
  • 5.单独更新kernel的方法:
# setenv gatewayip 10.245.xx.xx
# setenv netmask 255.255.255.0
# dhcp
# setenv serverip 10.245.xx.xx
# tftp 0x83000000 fitimage
# sf probe 0
# sf update 0x83000000 0 $filesize
  • 6.单独更新bmc的方法:
# setenv gatewayip 10.245.xx.xx
# setenv netmask 255.255.255.0
# dhcp
# setenv serverip 10.245.xx.xx
# tftp 0x83000000 image-bmc
# sf probe 0
# sf update 0x83000000 0 $filesize
  • 7.如果出现编译linux-aspeed报错,但是修改的内容并无问题,可以尝试:
# bitbake -c clean linux-aspeed
# bitbake -c build linux-aspeed
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值