存档2022年4月8日

PBTEE环境搭建

系统环境 ubuntu20.04  使用18.04 会存在glibc 版本太低,最低要求glibc 2.28,而18.04 的glibc 2.27.更换glibc难度太大,稍不注意会导致命令没有,启动失败,

watchdog使用方法介绍

watchdog简介与使用方法介绍

本文介绍飞腾平台(简称FT)watchdog相关知识,以及如何在uefi固件下和操作系统下配置使用watchdog的方法。

实验环境:D2000+FT uefi +kylin

FT watchdog符合 ARM规范的watchdog 参考链接: SBSA (Arm Server Base System Architecture)      因此在寄存器配置上,是兼容的。小编对比过相关寄存器,也就是基址不一样,所以在使用方法上和标准linux  uefi是一样的。

linux上源码 在上文链接中有详细介绍,我在这里阐述一下自己的理解, watchdog中的操作主要涉及到初始化寄存器、是指超时时间、使能看门狗、第一次超时 ws0寄存器被置1,上报中断,第二次超时 ws1寄存器置1,芯片将会进入热复位,芯片内部重新上电相当于重新开机。在看门狗计时器件,可以重新填入超时时间,此时将重新计数。参考文档 腾锐D2000软件编程手册》

UEFI watchdog介绍

在ft uefi中,已经添加了watchdot相关的支持

其中dsc中已经描述了飞腾通用寄存器与中断寄存器基址与偏移,

#
#  SBSA Watchdog
#  
   gArmTokenSpaceGuid.PcdGenericWatchdogControlBase|0x2800B000
   gArmTokenSpaceGuid.PcdGenericWatchdogRefreshBase|0x2800A000
   gArmTokenSpaceGuid.PcdGenericWatchdogEl2IntrNum|48
#
# ARM General Interrupt Controller
#
  gArmTokenSpaceGuid.PcdGicDistributorBase|0x29900000
  gArmTokenSpaceGuid.PcdGicRedistributorsBase|0x29980000
  gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0x29c00000

且开源uefi中已经集成arm watchdog驱动路径:ArmPkg/Drivers/GenericWatchdogDxe/GenericWatchdogDxe.c

因此在整个uefi DXE阶段之后,都是可以直接使用watchdog功能的。

具体使用方法:第一个参数为设置秒数 ,设置为0将会主动关闭看门狗功能。

gBS->SetWatchdogTimer (5 * 60, 0x0000, 0x00, NULL);

uefi中,将watchdog驱动注册,提供了中断支持,关闭、重设时间等功能。整个uefi代码中也多次使用了watchdog。在标准驱动中,进入uefishell 进入gurb代码都会主动关闭看门狗功能。


kernen watchdog 介绍

内核想要使用watchdog功能,固件提供相应支持

在ACPI表的GTDT中需要有看门狗的相关描述,汇报给操作系统PhytiumPkg/Phytium2004Pkg/Drivers/AcpiTables/Gtdt.aslc

操作系统会在开机过程中匹配相关字符串,若成功匹配,则会在系统中有watchdog的字符设备:/dev/watchdog0,1,2,若成功出现该字符设备,说明系统下看门狗功能就可以使用了。

系统下测试看门狗方法:

(没想好该不该介绍,毕竟用到了别人开发的程序)

 

飞腾平台Can总线验证方法

介绍飞腾平台下如何验证与使用can总线的方法

验证环境:D2000平台、 CAN协议分析仪

1 安装can命令

apt-get update && apt-get install git   

cd /tmp   

git clone https://github.com/linux-can/can-utils.git   

cd can-utils/   

make   

make install

2 can 接口验证方法

1. 先配置复用寄存器为CAN0CAN1CAN2总线功能

 

2. 设置总线波特率,并开启CAN总线

 

3. 飞腾CAN0接收数据,CAN分析仪CAN1发送数据

系统下使用Canutils软件测试CAN总线,接收数据时执行./candump can0指令

4. 飞腾CAN0发送数据,CAN分析仪CAN1接收数据

系统下使用Canutils软件测试CAN总线,接收数据时执行./candump can0指令

 

 

1. 飞腾CAN0发送数据,CAN分析仪CAN1接收数据

系统下使用Canutils软件测试CAN总线,接收数据时执行./candump can0指令

飞腾平台下访问GMAC-PHY的方法

linux 系统下操作PHY读写方式

本文简单介绍使用源码编译,通过mdio方式操作PHY寄存器

1 获取源码

代码已经上传,可自行下载,另外可以下载我已经编译好的文件直接使用。

2 编译源码

编译命令:gcc mdio.c -o mdio

3赋予权限

chmod a+x mdio

4 查看网口

通过ifconfig -a命令查看你想要操作的网口,保存网口名,在后续会使用到

5读取phy ID示例

./mdio

mdio:

read operation: mdio reg_addr

write operation: mdio reg_addr value

For example:

mdio eth0 1

mdio eth0 0 0x12

例如要查看phy id 

 ./mdio enaphyt4i0 3

将会返回获取的值

 

介绍操作裕泰PHY的方法:

首先读取查看phy手册,可以指导PHY访问有多种方式

YT PHY 内部有三种类型的寄存器:MII 寄存器(MII register,以下简写为 mii_reg),扩展寄存器(extended register,以下简写为 ext_reg)和 MMD 寄存器(简写为 mmd_reg
mii_reg: 寄存器地址为 0~0x1f,遵从 802.3 clause 22 的标准定义方式进行访问。其 MDC/MDIO 协议如下:

ext_reg: 由于 mii_reg 只有 0~0x1f,即 32 个。不能满足产品对寄存器数目的要求,就通过访问两个 mii_reg 0x1e, 0x1f 来扩展了更多的寄存器。访问方式为:
将要访问的 ext_reg 地址,写入 mii_reg 0x1e.
mii_reg 0x1f 得到值,即为 ext_reg 内的值. 写值到 mii_reg 0x1f,即将 ext_reg 寄存器内容改为写入的值.
例如:读取 ext_reg0x1000 的值:write mii_reg0x1e 0x1000;
read mii_reg0x1f;
ext_reg0x1000 的值为 0x3456
write mii_reg0x1e 0x1000;
write mii_reg0x1f 0x3456; 

mmd_reg: 为了扩展更多的寄存器,以适应更高速率的以太网。MMD 寄存器被创造出来。遵从 802.3 clause
45 的标准定义方式进行访问。MMD 寄存器有两种访问方式:间接访问和直接访问。
直接访问:其协议与 MII 访问不同,它是通过两条指令实现 MMD 寄存器的读或写,即先发 address 指令,
再发 Write Read 指令实现,具体协议如下:
间接访问:即通过 MII 寄存器(mii_reg 0xd, mii_reg 0xe,其具体含义见下表)来访问 MMD 寄存器。比如:
MMD 3 0x5 寄存器,其指令为:
write mii_reg 0xd 0x3; write mii_reg 0xe 0x5; write mii_reg 0xd 0x4003; read mii_reg 0xe
MMD 7 0x3c 寄存器值为 0x6,其指令为:
write mii_reg 0xd 0x7; write mii_reg 0xe 0x3c; write mii_reg 0xd 0x4007; write mii_reg 0xe 0x6
以上文档从官方手册中摘取
接下来要实现对PHY配置 主要验证phy Template(电口指标)配置
初始化:
Write_comm_ext_reg0xa000: 0x0 #选择 UTP 地址空间
write_utp_ext_reg0x41 to 0x4
write_utp_ext_reg0x42 to 0x8
write_utp_ext_reg0x43 to 0xc
write_utp_ext_reg0x44 to 0x10
write_utp_ext_reg0x45 to 0x10
write_utp_ext_reg0x46 to 0x10
write_utp_ext_reg0x47 to 0x10
write_utp_ext_reg0x4a to 0x1180
1000BT:
Write_comm_ext_reg0xa000: 0x0 #选择 UTP 地址空间
write_utp_ext_reg0x27: 0x2026
write_utp_mii_reg0x10: 0x2
write_utp_mii_ reg0x0: 0x8140
Test Mode 1Transmit waveform test
write_utp_mii_reg0x9: 0x2200
write_utp_mii_reg0x0: 0x8140
Test Mode 2Transmit Jitter test (master mode)
write_utp_mii_reg0x9: 0x5a00
write_utp_mii_reg0x0: 0x8140
Test Mode 3Transmit Jitter test (slave mode)
write_utp_mii_reg0x9: 0x7200
write_utp_mii_ reg0x0: 0x8140
Test Mode 4Transmit distortion test
write_utp_mii_reg0x9: 0x8200
write_utp_mii_ reg0x0: 0x8140 

将访问方式通过间接访问操作 ext寄存器。
写了一个脚本 

#!/bin/bash
#参考此处进行配置 举例配置了PHY 0x41 值为2 并再次把值都出来。
echo 初始化
./mdio enaphyt4i0 0x1e 0xa000
./mdio enaphyt4i0 0x1f 0x0
./mdio enaphyt4i0 0x1e 0x41
./mdio enaphyt4i0 0x1f 0x4
./mdio enaphyt4i0 0x1e 0x42
./mdio enaphyt4i0 0x1f 0x8
./mdio enaphyt4i0 0x1e 0x43
./mdio enaphyt4i0 0x1f 0xc
./mdio enaphyt4i0 0x1e 0x44
./mdio enaphyt4i0 0x1f 0x10
./mdio enaphyt4i0 0x1e 0x45
./mdio enaphyt4i0 0x1f 0x10
./mdio enaphyt4i0 0x1e 0x46
./mdio enaphyt4i0 0x1f 0x10
./mdio enaphyt4i0 0x1e 0x47
./mdio enaphyt4i0 0x1f 0x10
./mdio enaphyt4i0 0x1e 0x4a
./mdio enaphyt4i0 0x1f 0x1180
echo 1000bt
#1000BT
./mdio enaphyt4i0 0x1e 0x27
./mdio enaphyt4i0 0x1f 0x2026
echo test mode1
    #test mode1
./mdio enaphyt4i0 0x10 0x2
./mdio enaphyt4i0 0x0 0x8140
./mdio enaphyt4i0 0x9 0x2200
./mdio enaphyt4i0 0x0  0x8140
echo test end