当加载驱动的时候总是遇到跟内核系统版本不匹配问题,特别是这个+号,这儿是git自动增加的,主要原因就是本地存在未提交改动。解决方式两种:
1、git add提交
2、kernel跟目录下
echo ” > .scmversion # 清除 git 版本标记
echo ‘CONFIG_LOCALVERSION_AUTO=n’ >> .config
当加载驱动的时候总是遇到跟内核系统版本不匹配问题,特别是这个+号,这儿是git自动增加的,主要原因就是本地存在未提交改动。解决方式两种:
1、git add提交
2、kernel跟目录下
echo ” > .scmversion # 清除 git 版本标记
echo ‘CONFIG_LOCALVERSION_AUTO=n’ >> .config
┌───────────────┐
│ 上电或复位 │
└──────┬────────┘
↓
┌──────┴────────┐
│ FPGA 拉低 SYNC~│ ← 通知 ADC 停止发数据
└──────┬────────┘
↓
┌──────┴────────────┐
│ ADC 发送 CGS(K28.5)│ ← 帮助 FPGA 实现字符边界对齐、CDR 锁定
└──────┬────────────┘
↓
┌──────┴──────────────┐
│ FPGA 识别 CGS 并拉高 SYNC~│ ← 表示准备接收 ILAS
└──────┬──────────────┘
↓
┌──────┴────────────────────┐
│ ADC 发送 ILAS(4 Multi-Frame) │ ← 传输 JESD 参数 & 多 Lane 对齐
└──────┬────────────────────┘
↓
┌──────┴────────────────────┐
│ FPGA 检查 ILAS 是否一致 │ ← 校验 F、K、M、L、S 等参数
└──────┬────────────────────┘
↓
┌──────┴─────────────┐
│ 进入数据传输状态(DATA) │ ← 链路 Ready!
└────────────────────┘
SYNC~ 启动/K28.5/ 控制符✅ 2️⃣ ILAS 阶段(Initial Lane Alignment Sequence)
🧠 Subclass 特殊流程说明(Subclass 1)
在 Subclass 1 中,额外存在:
| 状态 | 描述 |
|---|---|
| CGS | 接收 K28.5,同步 CD & 边界 |
| ILAS | 接收 4 个多帧的初始化参数 |
| CHECK | 校验 JESD 配置是否匹配 |
| DATA | 正常数据传输 |
| LOST | 如果出现错误,状态机会跳回 CGS 重建链路 |
📦 FPGA 中实现建链过程的模块
| 模块 | 功能 |
|---|---|
GT Transceiver | 串行解码、CDR、8b10b 编码/解码 |
JESD204 RX IP | 包含链路状态机(CGS/ILAS/DATA),配置校验等 |
SYNC~ 控制 | 控制建链流程,通常是输出引脚连到 ADC SYNC |
SYSREF 输入 | Subclass 1 中的外部同步输入 |
| 阶段 | 关键信号 | 发射方行为 | 接收方行为 |
|---|---|---|---|
| CGS | SYNC~ = 0 | 发 /K28.5/ | 边界同步、CDR 锁定 |
| ILAS | SYNC~ = 1 | 发 4 个多帧(含参数) | 解码 JESD 参数、同步 LMFC |
| DATA | SYNC~ = 1 | 发真实采样数据 | 数据解帧、传送到用户逻辑 |
飞腾S5000C处理器支持双BIOS镜像(Dual BIOS)功能,通过SE_RECOVERY硬件引脚和Reset Source状态寄存器实现主备镜像的切换。当主BIOS镜像损坏时,可以通过硬件触发方式切换到备份镜像启动,提高系统可靠性。
S5000C芯片内部集成了一个 Reset Source硬件状态寄存器 ,用于记录芯片复位的原因。该寄存器由芯片硬件自动设置,软件通过SMC(Secure Monitor Call)调用读取。
Reset Source取值定义:
| 值 | 含义 | 说明 |
|---|---|---|
| 0x01 | PowerOn Reset | 上电复位 |
| 0x04 | SoftWare Warm Reset | 软件热复位 |
| 0x05 | Recover | SE_RECOVERY 恢复模式 |
| 0x80 | Watchdog Reset | 看门狗复位 |
| 0x100 | PII Reset | PLL 复位 |
| 0xAA | S3 Reset | S3 休眠恢复 |
| 0xA9 | Standby Reset | 待机恢复 |
SE_RECOVERY是S5000C芯片的一个 硬件配置引脚 ,在芯片复位时刻被采样:
在 s5000c_pack-V1.30 打包工具中,通过Kconfig配置启用双镜像功能:
config RECOVER_ENABLE
bool "recover enable"
default n
if RECOVER_ENABLE
menu "recover config"
config RECOVER_BL33
hex "config bl33 recover address"
default 0x800000
config RECOVER_BL32
hex "config bl32 recover address"
default 0xc00000
endmenu
endif
bl33_recovery的地址在0x800000
bl32_recovery的地址在0xc00000
双镜像文件存放结构:
s5000c_pack-V1.30/
├── pbf_bin/v1_30/ # ATF编译生成的默认镜像
│ ├── bl33.bin
│ └── bl33_recover.bin
└── ...
打包后的固件在SPI Flash中的布局:
| 镜像 | Flash 偏移地址 | 大小 | 说明 |
|---|---|---|---|
| BL1 (Boot ROM) | 0x000000 | – | 启动代码 |
| FIP (BL2/BL31) | – | – | ARM Trusted Firmware |
| BL33 (主镜像) | 0x500000 (5MB) | 根据实际 | 正常启动的 UEFI |
| BL33_RECOVER | 0x800000 (8MB) | 根据实际 | 备份 UEFI 镜像 |
| BL32/BL32_RECOVER | 0xb00000 (11MB) | 根据实际 | TEE 镜像(可选) |
芯片上电/复位
↓
硬件采样SE_RECOVERY引脚 = 高电平
↓
Reset Source = 0x01 (PowerOn) 或 0x04 (Soft Reset)
↓
BL1 (Boot ROM) 运行
↓
读取Reset Source = 0x01/0x04
↓
从Flash 0x500000加载BL33 (主镜像)
↓
启动正常UEFI
外部拉低SE_RECOVERY引脚
↓
触发芯片复位(上电或软复位)
↓
硬件采样SE_RECOVERY引脚 = 低电平
↓
Reset Source = 0x05 (Recover)
↓
BL1 (Boot ROM) 运行
↓
读取Reset Source = 0x05
↓
从Flash 0x800000加载BL33_RECOVER (备份镜像)
↓
启动备份UEFI
在UEFI代码中,通过PSSI库获取Reset Source:
// PssiLib.c
UINT32
PssiGetResetSource (VOID)
{
ARM_SMC_ARGS ArmSmcArgs;
ZeroMem (&ArmSmcArgs, sizeof (ARM_SMC_ARGS));
ArmSmcArgs.Arg0 = PSSI_GET_RST_SOURCE; // SMC调用号: 0xC2000F01
ArmCallSmc (&ArmSmcArgs);
// 返回值即为Reset Source
// 0x01=PowerOn, 0x04=SoftReset, 0x05=Recover...
return ArmSmcArgs.Arg0;
}
UEFI根据Reset Source设置Boot Mode:
// PlatformPei.c
EFI_BOOT_MODE BootMode;
// 获取硬件复位源
RstSource = GetResetSource();
DEBUG ((DEBUG_INFO, "Check reset source : 0x%x\n", RstSource));
// 设置UEFI Boot Mode
Status = PeiServicesSetBootMode (ArmPlatformGetBootMode ());
Status = PeiServicesGetBootMode (&BootMode);
// 如果是Recover模式,安装Recovery Boot Mode PPI
if (BootMode == BOOT_IN_RECOVERY_MODE) {
Status = PeiServicesInstallPpi (&mPpiListRecoveryBootMode);
}
在 theone 打包脚本中,双镜像的处理逻辑:
# 固件定义
BL33=bl33.bin # 主镜像
BL33_RECOVER=bl33_recover.bin # 备份镜像
# 地址配置
bl33_base=0x500000 # 主镜像地址
bl33_recover_addr=0x800000 # 备份镜像地址
# 如果启用recover功能
if [ "$recover_enable" = "y" ];then
# 创建recover镜像证书
echo "create bl33 recover info"
bl33_size=$(wc -c $BL33_RECOVER | awk '{print $1}')
my_scripts/cert_info.sh $bl33_recover_addr $bl33_size bl33_info.
bin
dd if=bl33_info.bin of=$INFO bs=16 seek=1 conv=notrunc
fi
bl33.bin bl33_recover.bin放到pbf_bin文件夹里
场景 :主BIOS镜像(0x500000)损坏,系统无法正常启动
恢复步骤 :
场景 :BIOS升级过程中断电,导致主镜像损坏
恢复机制 :
飞腾S5000C的SE_RECOVERY双BIOS镜像机制通过 硬件引脚 + 状态寄存器 + 固件支持 实现了可靠的故障恢复能力:
Nor Flash XIP 直接执行时,要求 Flash 硬件总线地址等于 SYS_TEXT_BASE,目的是让代码硬编码的链接地址和 CPU 实际取指地址一致,不用拷贝;
bl33.bin和bl33_recovery.bin的SYS_TEXT_BASE地址要根据pack实际使用地址进行修改。否则会报”Synchronous Abort” handler错误。
在现代无线通信系统中,天线阻抗匹配是确保信号高效传输的关键环节。阻抗失配不仅会导致信号反射、功率损耗,还可能影响整个系统的稳定性和性能。史密斯圆图(Smith Chart)作为一种经典的图形化工具,凭借其直观、高效的特点,成为射频工程师调试天线阻抗匹配的利器。它能够将复杂的复数阻抗变换过程可视化,帮助工程师快速完成阻抗匹配网络的设计与优化。
本文将介绍如何利用史密斯圆图分析和调整天线阻抗,涵盖基础理论、实际操作步骤,配合鼎阳的矢量网络分析仪为工程师提供天线阻抗匹配测试方案。


在现代无线通信系统中,天线阻抗匹配是确保信号高效传输的关键环节。阻抗失配不仅会导致信号反射、功率损耗,还可能影响整个系统的稳定性和性能。史密斯圆图(Smith Chart)作为一种经典的图形化工具,凭借其直观、高效的特点,成为射频工程师调试天线阻抗匹配的利器。它能够将复杂的复数阻抗变换过程可视化,帮助工程师快速完成阻抗匹配网络的设计与优化。
本文将介绍如何利用史密斯圆图分析和调整天线阻抗,涵盖基础理论、实际操作步骤,配合鼎阳的矢量网络分析仪为工程师提供天线阻抗匹配测试方案。

图3 史密斯圆图阻抗圆

图4 史密斯圆图导纳圆

图5 左电导圆/并L/逆时针

图6 左电导圆/并C/顺时针

图7 右电阻圆/串L/顺时针
图7 右电阻圆/串L/顺时针

图8 右电阻圆/串C/逆时针
使用鼎阳的矢网测试2.4G天线的S11,将显示格式切换为史密斯圆图,测得2.4G频点处的阻抗为10+10j,将数据点添加到仿真软件中。

图9 天线2.4G频点原始阻抗
为了将阻抗点匹配到史密斯圆图正中心的50Ω处,先串联L使得数据点沿着电阻圆顺时针移动到与50Ω等电导圆的交叉位置,之后再并联C使得数据点沿着电导圆顺时针移动到50Ω匹配点。

图10

图11 天线2.4G频点串联L并联C后阻抗
鼎阳的矢量网络分析仪不仅具备高精度的S参数测试能力,同样集成了阻抗匹配仿真功能,可帮助工程师快速优化天线、滤波器、功放等射频电路的阻抗匹配设计。该功能基于史密斯圆图可视化分析,结合自动化计算与仿真工具,显著提升调试效率。
点击CAL按键 > 夹具仿真 > 夹具仿真设置 > 选择相应port > Circuit Model。
选择合适的匹配电路,设置电容电感值,最后勾选“Enable Port Matching…”,同时打开夹具仿真应用。
注意,双击“电路模型”可以将阻抗匹配窗口最小化,便于调试。
以下图中的设置为例,选择“Shunt C-Series L”(并联C-串联L),注意阻抗匹配时是从DUT往负载端看,所以实际上是先串联了2.15nH的电感L,再并联了8.5Pf的电容C,其他未使用到的参数(R/G)不做设置即可。橙色迹线Tr1是未进行匹配仿真的原始迹线,蓝色迹线Tr2是经过匹配仿真后的迹线,可以看到对应频点经过匹配后已经十分接近50Ω匹配点。

图12 鼎阳矢网史密斯圆图阻抗匹配仿真
本文简单介绍了史密斯圆图在阻抗匹配中的核心原理,配合”上感下容,左并右串”等实用口诀,提升匹配网络设计效率。同时介绍鼎阳矢量网络分析仪的阻抗匹配仿真功能,让工程师更加快速便捷的完成天线、放大器、滤波器等器件的阻抗匹配。
#!/bin/bash
echo $1
diskP1=p1
diskP2=p2
if [[ $1 = "-h" || $1 = "-H" ]]; then
echo "===========虚拟磁盘使用说明==========="
echo "参数一:命令字,C-创建磁盘 D-删除磁盘 F-格式化磁盘 S-烧写固件 H-帮助"
echo "参数二:硬盘大小,单位MB,最小硬盘1MB"
echo "参数三:硬盘名称,自定义"
echo "======================================"
exit 1
else
if [[ -z "$1" || -z "$2" || -z "$3" ]]; then
echo "请输入有效的参数!"
exit 1
elif [[ $1 = "-c" || $1 = "-C" ]]; then
echo "开始创建虚拟磁盘!"
dd if=/dev/zero of=$3 bs=1M count=$2
# 非交互式执行 fdisk 命令
# 这里的逻辑是:n(新建分区) -> p(主分区) -> 1(分区号) -> 回车(默认起始扇区) -> +10G(大小) -> w(保存)
echo -e "n\np\n1\n\n+200M\nn\np\n\n\n\nw" | fdisk $3
echo "创建磁盘完成!"
elif [[ $1 = "-d" || $1 = "-D" ]]; then
echo "开始删除虚拟磁盘!"
sudo rm -rf $3
echo "删除完成!"
elif [[ $1 = "-f" || $1 = "-F" ]]; then
echo "开始格式化虚拟磁盘!"
sudo losetup -fP $3
varInfo=$(losetup -l | grep $3)
varInfo=(${varInfo//,/ })
echo ${varInfo}
sudo mkfs.fat ${varInfo}${diskP1}
sudo mkfs.ext4 ${varInfo}${diskP2}
sudo losetup -d $varInfo
echo "格式化完成!"
elif [[ $1 = "-s" || $1 = "-S" ]]; then
echo "开始烧写固件!"
sudo losetup -fP $3
varInfo=$(losetup -l | grep $3)
varInfo=(${varInfo//,/ })
echo ${varInfo}
sleep 1
sudo mount ${varInfo}${diskP1} /mnt
sudo cp Image s5000c-64c.dtb /mnt
sync
sudo umount /mnt
sudo umount /mnt
sleep 1
sudo mount ${varInfo}${diskP2} /mnt
sudo cp rootfs.tar /mnt
cd /mnt
sudo tar -xvf rootfs.tar
sleep 1
sync
sleep 5
cd /
sudo umount /mnt
sudo umount /mnt
sleep 1
sudo losetup -d $varInfo
echo "烧写完成!"
fi
fi
你可以通过以下步骤在Linux上虚拟一个磁盘,并将其挂载到 /mnt/ 目录下:
使用 dd 命令创建一个虚拟磁盘文件(例如大小为1GB):
dd if=/dev/zero of=/root/virtual_disk.img bs=1M count=1024
这将创建一个名为 virtual_disk.img 的1GB大小的文件。
使用 mkfs.ext4 命令将虚拟磁盘文件格式化为ext4文件系统:
mkfs.ext4 /root/virtual_disk.img
创建一个挂载点,例如 /mnt/ 目录:
mkdir -p /mnt/virtual_disk
使用 mount 命令将虚拟磁盘挂载到 /mnt/virtual_disk:
mount /root/virtual_disk.img /mnt/virtual_disk
使用 df -h 命令查看挂载是否成功:
df -h
如果希望在系统重启后自动挂载该虚拟磁盘,可以编辑 /etc/fstab 文件,添加以下内容:
/root/virtual_disk.img /mnt/virtual_disk ext4 defaults 0 0
这样就成功在Linux系统上创建并挂载了一个虚拟磁盘文件。
在虚拟硬盘上创建分区并格式化后,可以单独挂载每个分区。具体步骤如下:
步骤 1: 使用 losetup 绑定虚拟硬盘到环回设备
假设你已经创建了一个虚拟硬盘文件,例如 /root/virtual_disk.img,并在其中创建了分区。首先,使用 losetup 将虚拟磁盘文件关联到一个环回设备(loop device):
losetup -fP /root/virtual_disk.img
-f:自动选择一个未使用的环回设备。-P:自动解析分区信息。使用以下命令查看绑定的环回设备名(例如 /dev/loop0):
losetup -l
使用 lsblk 或 fdisk -l 查看该环回设备的分区:
lsblk /dev/loop0
或者:
fdisk -l /dev/loop0
此时,你应该可以看到类似 /dev/loop0p1、/dev/loop0p2 等分区。
假设你想挂载第一个分区 /dev/loop0p1,可以使用 mount 命令将其挂载到指定目录。例如,挂载到 /mnt/partition1:
mkdir -p /mnt/partition1
mount /dev/loop0p1 /mnt/partition1
使用 df -h 或 lsblk 检查分区是否成功挂载:
df -h
lsblk
完成操作后,可以通过以下命令解除环回设备的绑定:
losetup -d /dev/loop0
如果希望分区在系统重启后自动挂载,可以在 /etc/fstab 中添加对应分区的挂载信息。例如:
/dev/loop0p1 /mnt/partition1 ext4 defaults 0 0
/dev/loop0p2 /mnt/partition2 ext4 defaults 0 0
通过上述步骤,你可以单独挂载虚拟磁盘中的每个分区。
losetup(set up and control loop devices) 是 Linux 中用于管理环回设备(loop devices)的命令。环回设备是一个虚拟设备,它将文件当作块设备来使用,从而可以像操作硬盘一样操作一个普通的文件。losetup 指令主要用于将文件与环回设备进行绑定或解除绑定,以及查看现有环回设备的状态。
基本用法
losetup /dev/loopX /path/to/file.img
将文件 /path/to/file.img 绑定到指定的环回设备 /dev/loopX,使其成为一个可以像物理硬盘一样操作的设备。
losetup -f /path/to/file.img
-f 选项会自动查找并选择一个未使用的环回设备,避免手动指定。
losetup -fP /path/to/file.img
-P 选项会自动扫描并解析文件中的分区表,使文件中的各个分区都能作为 /dev/loopXpN 设备挂载,类似于实际的硬盘分区。
losetup -a
列出系统中所有已经绑定的环回设备及其关联的文件。
losetup /dev/loopX
显示特定环回设备的详细信息。
losetup -d /dev/loopX
将环回设备 /dev/loopX 解除绑定,不再将其作为块设备使用。
losetup -D
动解除所有未使用的环回设备的绑定。
常用选项
-f:自动查找一个未使用的环回设备。
-P:自动重新扫描分区表(适用于分区文件)。
-d:解除环回设备绑定。
-a:显示所有绑定的环回设备及其信息。
-l:列出系统中所有环回设备的详细信息。
-D:自动解除所有未使用的环回设备。
dd if=/dev/zero of=/root/virtual_disk.img bs=1M count=100
losetup -fP /root/virtual_disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 /mnt
2.解除虚拟磁盘的挂载和解除环回设备绑定:
umount /mnt
losetup -d /dev/loop0
主要区别如下:
losetup 解析出每个分区,并为每个分区创建独立的环回设备。ISO 9660 或 UDF 文件系统,且是只读的。