3. 解析SFF-8472收发器类型编码

解析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字节后的固件调试场景。

SFF-8472 A0h 地址 0x02 字节解析流程 A0h EEPROM 0x00-0x01: Identifier 0x02: Transceiver 0x03-0x0B: Encoding 0x0C-0x0F: Rates 0x10-0x3F: Other Bit Parser bit0: 0x01 - Unknown bit1: 0x02 - 1000BASE-SX bit2: 0x04 - 1000BASE-LX bit3: 0x08 - 1000BASE-CX Output Result 0x02 → 1000BASE-SX 0x0A → SX + CX 0x86 → SX + LX + 100BASE-T 0x00 → No known type 0x02 Byte Bit Layout (bit7 ... bit0) bit7:0x80 bit6:0x40 bit5:0x20 bit4:0x10 bit3:0x08 bit2:0x04 bit1:0x02 bit0:0x01