sai有两中点灯方案:
a)sonic点灯,sonic配置/sys/class/leds/port52/brightness文件,sai起线程A(_ctc_sai_macled_polling_thread)扫描brightness文件,根据文件内容配置点灯模式,需要sonic参与
b)sai点灯,sai起一个线程B(_ctc_sai_macled_monitor_speed_polling_thread)读取flex_macled.cfg中端口的原始speed,和端口当前speed,如果没降速按board.json中的默认方式点灯("mode" : "LED_MODE_2_OFF_RXLNKBIACT"),如果降速按照board.json配置的("slow_speed_led_mode" : "LED_MODE_2_RXLNKBIACT_OFF",)方式点灯,sonic不用参与
端口LED点灯流程完整分析报告
端口点灯:
sonic方式 :
硬件 → SAI → Syncd → Orchagent → APPL_DB → Ledd → led_control.py → sysfs → LED 硬件
sai 方式 :
硬件 → SAI 内部监控线程 → SAI 直接控制硬件 LED 寄存器 → LED 硬件
------------------- ↑
------------不经过 SONiC ledd
1. 整体架构层次
应用层API
↓
CTC Core层
↓
SYS通用层 → 芯片特定实现
↓
驱动层(Driver)
↓
硬件寄存器
2. 主要API接口
文件: sdk/core/common/include/ctc_chip.h
核心数据结构 :
🟠ctc_chip_led_para_t : LED参数配置
port_id : 端口ID或MAC ID
lport_en : 是否使用lport作为key
ctl_id : LED控制器ID (0-1)
first_mode : 主LED模式
sec_mode : 次LED模式
polarity : 极性配置
op_flag : 操作标志
🟠ctc_chip_led_mode_t : LED工作模式(15种)
链路指示:
CTC_CHIP_RXLINK_MODE,
CTC_CHIP_TXLINK_MODE
活动指示:
CTC_CHIP_RXACTIVITY_MODE,
CTC_CHIP_TXACTIVITY_MODE
链路+活动:
CTC_CHIP_RXLINK_RXACTIVITY_MODE
强制模式:
CTC_CHIP_FORCE_ON_MODE,
CTC_CHIP_FORCE_OFF_MODE
🟠ctc_chip_mac_led_mapping_t : MAC到LED的映射关系
3. 主要API函数
c
// 设置MAC LED模式
ctc_at_chip_set_mac_led_mode(lchip, p_led_para, led_type)
// 设置MAC LED映射
ctc_at_chip_set_mac_led_mapping(lchip, p_led_map)
// 设置MAC LED使能
ctc_at_chip_set_mac_led_en(lchip, enable)
4. LED配置流程详解
c
用户调用API
↓
【步骤1】参数验证和预处理
- 检查指针有效性
- 检查芯片特性支持
- lchip ID映射转换
↓
【步骤2】调用SYS层接口
- sys_usw_peri_set_mac_led_mode()
↓
【步骤3】芯片特定实现
- sys_tsingma_peri_set_mac_led_mode() [Tsingma芯片]
- sys_at_peri_set_mac_led_mode() [Arctic芯片]
↓
【步骤4】模式转换
_sys_tsingma_peri_get_mac_led_mode_cfg()
- CTC LED模式 → 硬件寄存器值
- 例如: RXLINK_MODE → (SYS_CHIP_LED_ON_RX_LINK | SYS_CHIP_LED_BLINK_OFF)
↓
【步骤5】配置硬件寄存器
- LedCfgPortMode: LED模式
- LedPolarityCfg: LED极性
- LedCfgPortSeqMap: MAC-LED映射
↓
【步骤6】LED时钟配置
- LedHiCwgDskCfg: 一级分频器
- LedCwgDskCfg: 二级分频器
↓
【步骤7】硬件生效
- 硬件自动根据链路状态点亮LED
- 硬件自动监测收发包触发闪烁
5. 关键寄存器说明
LED模式寄存器 (LedCfgPortMode):
primaryLedMode[1:0]: 主LED状态
secondaryLedMode[3:2]: 次LED状态
secondaryLedModeEn[4]: 次LED使能
LED状态值:
0: 强制熄灭
1: RX链路UP时点亮
2: TX链路UP时点亮
3: 强制常亮
LED闪烁模式:
0: 不闪烁
1: RX活动时闪烁
2: TX活动时闪烁
3: 常闪烁
LED时钟寄存器:
LedHiCwgDskCfg.cfgClkLedHiDivide: 一级分频(最大32倍)
LedCwgDskCfg.cfgClkLedDivide: 二级分频(最大32倍)
可实现1KHz ~ 1.35GHz的时钟配置
6. 配置示例
示例1: 配置端口0为RX链路+活动模式
c
ctc_chip_led_para_t led_para;
sal_memset(&led_para, 0, sizeof(led_para));
led_para.lchip = 0; // 芯片ID
led_para.port_id = 0; // 端口ID
led_para.lport_en = 1; // 使用lport
led_para.ctl_id = 0; // LED控制器0
led_para.first_mode = CTC_CHIP_RXLINK_RXACTIVITY_MODE;
ctc_at_chip_set_mac_led_mode(0, &led_para, CTC_CHIP_USING_ONE_LED);
示例2: 配置双LED模式
c
ctc_chip_led_para_t led_para;
sal_memset(&led_para, 0, sizeof(led_para));
led_para.lchip = 0;
led_para.port_id = 0;
led_para.lport_en = 1;
led_para.ctl_id = 0;
led_para.first_mode = CTC_CHIP_RXLINK_RXACTIVITY_MODE; // LED0
led_para.sec_mode = CTC_CHIP_TXACTIVITY_MODE; // LED1
ctc_at_chip_set_mac_led_mode(0, &led_para, CTC_CHIP_USING_TWO_LED);
7. 关键文件路径汇总
| 层级 | 文件路径(说明) |
|---|---|
| 应用层 | sdk/core/common/include/ctc_chip.h (API定义和数据结构) |
| CTC Core层 | sdk/core/usw/src/ctc_at/ctc_at_chip.c (CTC Core实现) |
| SYS通用层 | sdk/core/usw/src/sys/sys_usw_peri.c (通用SYS实现) |
| Tsingma芯片 | sdk/core/usw/src/sys/tsingma/sys_tsingma_peri.c (Tsingma特定实现) |
| Arctic芯片 | sdk/core/usw/src/sys/arctic/sys_at_peri.c (Arctic特定实现) |
| MAC层 | sdk/core/usw/src/sys/sys_usw_mac.c (MAC相关配置) |
| 驱动层 | sdk/driver/usw/include/drv_ds.h (寄存器定义) |
8. 特点总结
分层架构: 应用层→CTC Core→SYS→驱动层→硬件,层次清晰
模块化设计: 不同芯片系列有独立实现
灵活配置: 支持15种LED工作模式,可自由组合
硬件加速: 闪烁由硬件自动控制,降低CPU开销
动态映射: MAC到LED的映射可动态配置
精确控制: 支持时钟分频,实现精确闪烁频率