---
title: 概述
description: "BIOS采用统一的接口与协议实现对组件的管理，SMC（Satellite Manager Controller）用于智能组件管理，具有以下特点："
url: https://www.hikunpeng.com/document/detail/zh/kunpengmodule/S920L08/mrm/S920L08_44_0018.html
sourcePath: /source/zh/kunpengmodule/S920L08/mrm/S920L08_44_0018.html
indexId: d23251bf82f24d08011d9eb616c28bfb2f82c2b76c03d245f28b73d17e6e23d457
---
# 概述

BIOS采用统一的接口与协议实现对组件的管理，SMC（Satellite Manager Controller）用于智能组件管理，具有以下特点：

- 采用命令+响应的方式交互数据
- 通信容量大
- 采用Local bus作为底层链路，链路设计简单，节约IO资源
- 整个传输过程自带CRC校验，数据传输可靠

一次完整的读取流程包括读取请求和读取响应两个部分，如表1和表2所示。两个部分必须配套使用，中间不能穿插其他命令。


**表1 SMC读取时序**

| 字段 | OpCode1 | OpCode2 | Parameter1 | Parameter2 | Set action | Set status busy | Length | DATA1 | … | DATAN | Set status complet | Master Read | clear lock |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 偏移地址 | 0x04 | 0x05 | 0x06 | 0x07 | 0x02 | 0x01 | 0x08 | 0x09\-0xff | 0x09\-0xff | 0x09\-0xff | 0x01 | \- | 0x00 |


加粗字段是CPLD的响应信息，不需要CPU下发该部分字段；其它字段需要CPU下发。


- Master读取时序步骤

  1. 读锁寄存器，检测是否被锁。
  2. 如果未锁，则读状态寄存器，检测是否idle/complet。
  3. 如果状态idle/complet，在写入4个opcode后，再写操作寄存器通知CPLD解析命令。
  4. 检测总线状态。检测到complet之后，从数据区读取数据。
  5. 清锁寄存器，释放控制权。
- Slave读取时序步骤

  1. CPLD检测WE上升沿，认为存在写操作，读取操作寄存器，收到操作指令，写状态寄存器为busy。
  2. 读取opcode。
  3. 根据opcode将对应数据写入数据区后，写状态寄存器为complet，等待BIOS读取。


**表2 SMC写入时序**

| 字段 | OpCode1 | OpCode2 | Parameter1 | Parameter2 | Length | DATA1 | … | DATAN | Set action | Set status busy | Slave Read | Set status complet |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 偏移地址 | 0x04 | 0x05 | 0x06 | 0x07 | 0x08 | 0x09\-0xff | 0x09\-0xff | 0x09\-0xff | 0x02 | 0x01 | \- | 0x01 |


加粗字段是CPLD的响应信息，不用CPU下发该部分字段；其它字段需要CPU下发。


- Master写入时序步骤

  1. 读锁寄存器，检测是否被锁。
  2. 如果未锁，则读状态寄存器，检测是否idle/complet。
  3. 如果状态idle/complet，在写入4个opcode + data后，再写操作寄存器通知CPLD解析命令。
- Slave写入时序步骤

  1. CPLD检测WE上升沿，认为存在写操作，读取操作寄存器，收到操作指令，写状态寄存器为busy。
  2. 读取opcode。
  3. 解析opcode，处理读取的数据。
  4. 写状态寄存器为complet。

数据字段的描述定义了读取流程的详细信息，如表3所示。


**表3 数据字段信息**

| 字段 | 地址 | 描述 | 属性 |
| --- | --- | --- | --- |
| Control Register Address | 0x00 | 锁寄存器：CPLD不操作，提供给BIOS写，用来防止BIOS进程抢占总线。 | BIOS：RW CPLD：NA |
| Control Register Address | 0x01 | 状态寄存器：BIOS只读，CPLD读写。 0h：命令执行成功 1h：命令不支持 2h：busy（CPLD在读写数据） 3h：参数错误 4h：内部错误（CRC错误） | BIOS：RO CPLD：RW |
| Control Register Address | 0x02 | 操作寄存器：BIOS写，CPLD读清。 | BIOS：WO CPLD：RC |
| Control Register Address | 0x03 | 自愈控制器 | BIOS：WO CPLD：RC |
| Opcode Register Address | 0x04 | Opcode1 | BIOS：RW CPLD：RO |
| Opcode Register Address | 0x05 | Opcode2 | BIOS：RW CPLD：RO |
| Opcode Register Address | 0x06 | Parameter1 | BIOS：RW CPLD：RO |
| Opcode Register Address | 0x07 | Parameter2 | BIOS：RW CPLD：RO |
| Data Register Address | 0x08 | Length | BIOS：RW CPLD：RW |
| Data Register Address | 0x09 | Data1\-DataN（数据最后加一字节CRC校验结果） | BIOS：RW CPLD：RW |


SMC使用命令字进行管脚功能配置，命令字的格式描述如表4所示。


**表4 SMC命令字信息**

| Function | Command | MS | RW | Param1 | Param2 |
| --- | --- | --- | --- | --- | --- |
| 功能定义如下： 0：获取系统基本信息 1：获取/设置CPU信息 2：获取/设置PCH信息 3：获取/设置电源管理信息 4：获取/设置系统告警信息 5：获取/设置杂项功能配置 | 命令字，见通信命令字定义 | 0：多个读取 1：单个读取 | 0：写入 1：读取 | 1…N：获取/设置第N个设备信息 | 1…N：获取/设置第N个设备信息 |


协议定义了位读、块读、位写和块写4种操作模式：

- 位读：M/S=1；RW=1；Param1=要读取的设备/对象序号; 返回单个对象的数据。
- 位写：M/S=1；RW=0；Param1=要写入取的设备/对象序号。

Function、Command、MS和RW组合成Opcode，定义如图1所示。

图1 Opcode定义

具体的SMC命令字信息参考表3-1/表3-2/表3-3/表3-4/表3-5。
