3. 解析SFF-8472收发器类型编码
任务说明
本案例要求解析SFF-8472规范中A0h地址0x02字节的收发器类型编码。该字节以位图方式标识光模块支持的传输介质与协议类型,是固件开发中识别模块能力的基础。完成本案例后,你将获得一个可直接编译运行的解析工具,输入原始字节值即可输出对应的收发器类型描述。
SFF-8472收发器类型编码规则
地址0x02的每一位(bit0~bit7)独立对应一种收发器类型,可同时置位多位表示多协议支持。编码规则如下:
- bit0 (0x01):未指定或未知类型
- bit1 (0x02):1000BASE-SX(短波多模光纤)
- bit2 (0x04):1000BASE-LX(长波单模/多模光纤)
- bit3 (0x08):1000BASE-CX(铜缆)
- bit4 (0x10):1000BASE-T(双绞线)
- bit5 (0x20):1000BASE-LX(长波,与bit2区别在于传输距离扩展)
- bit6 (0x40):100BASE-FX(多模光纤百兆)
- bit7 (0x80):100BASE-T(双绞线百兆)
当字节值为0x00时,表示模块不支持上述任何已定义类型,需结合其他字节进一步判断。
代码实现
#include <stdio.h>
#include <stdint.h>
const char* type_names[8] = {
"Unspecified/Unknown",
"1000BASE-SX",
"1000BASE-LX",
"1000BASE-CX",
"1000BASE-T",
"1000BASE-LX (extended reach)",
"100BASE-FX",
"100BASE-T"
};
void parse_transceiver_type(uint8_t byte_value) {
printf("Raw byte: 0x%02X\n", byte_value);
printf("Binary: 0b");
for (int i = 7; i >= 0; i--) {
printf("%d", (byte_value >> i) & 0x01);
}
printf("\n\n");
if (byte_value == 0x00) {
printf("Result: No known transceiver type defined.\n");
return;
}
printf("Supported transceiver type(s):\n");
int count = 0;
for (int bit = 0; bit < 8; bit++) {
if (byte_value & (1 << bit)) {
printf(" [bit%d] %s\n", bit, type_names[bit]);
count++;
}
}
printf("Total: %d type(s) detected.\n", count);
}
int main() {
// 测试样例
uint8_t test_values[] = {0x02, 0x0A, 0x86, 0x00};
int num_tests = sizeof(test_values) / sizeof(test_values[0]);
for (int i = 0; i < num_tests; i++) {
printf("=== Test Case %d ===\n", i + 1);
parse_transceiver_type(test_values[i]);
printf("\n");
}
return 0;
}
代码说明
程序定义了一个包含8种收发器类型名称的数组,索引与bit位置一一对应。核心函数parse_transceiver_type接收一个字节值,先以十六进制和二进制形式打印原始数据,然后逐位检查置位情况并输出对应的类型名称。主函数内置了4个测试样例:0x02(仅1000BASE-SX)、0x0A(bit1+bit3,即SX+CX)、0x86(bit1+bit2+bit7,即SX+LX+100BASE-T)、0x00(无定义类型)。
编译与运行
gcc -o transceiver_parser transceiver_parser.c
./transceiver_parser
验证方法
运行程序后,观察输出是否满足以下判定标准:
- 0x02输出仅包含“1000BASE-SX”,总计1种类型;
- 0x0A输出包含“1000BASE-SX”和“1000BASE-CX”,总计2种类型;
- 0x86输出包含“1000BASE-SX”、“1000BASE-LX”和“100BASE-T”,总计3种类型;
- 0x00输出“No known transceiver type defined”提示信息。
若输出与上述预期一致,则解析逻辑正确。该工具可直接用于读取SFF-8472 EEPROM中A0h地址0x02字节后的固件调试场景。