1. SMC命令字定义
opcode也就是csr配置中的Offset,由Function,Command,MS,RW四个组成。
M就是multiple,表示多个读取;S是single,表示单个读取;RW很好理解,读和写
M=0,S=1
R=1,W=0
"Accessor_ShortPushButton": {
"Chip": "#/Smc_ExpBoardSMC",
"Offset": 134224384,
"Size": 1,
"Mask": 1,
"Type": 0,
"Value": 0
},
"Accessor_LongPushButton": {
"Chip": "#/Smc_ExpBoardSMC",
"Offset": 134224384,
"Size": 1,
"Mask": 2,
"Type": 0,
"Value": 0
},
2. SMC命令调试
例如:
短按 mdbctl call Smc_ExpBoardSMC_0101 bmc.kepler.Chip.BlockIO Write 0 0x8001a00 1 0x01
长按 mdbctl call Smc_ExpBoardSMC_0101 bmc.kepler.Chip.BitIO Write 0 0x8001a00 1 2 1 0x01
其实这里最好用BitIO的方法,和csr中的Type要对应起来,否则可能出现我在这篇帖子中遇到的问题 强制重启SMC命令定制 - 交流互助区 - openUBMC 论坛
Type = 0对应BitIO,1对应BlockIO。
接口中使用的参数参考文档中BlockIO和BitIO的说明 简介 | 文档中心 | openUBMC
3.SMC命令字转换工具
这边写了个简单的小工具,Linux环境中使用,压缩包里有工具和源码,有问题的话大家自己改一下。
smc_tool.zip (3.9 KB)
去算offset的时候后面的4个参数都是十六进制数,可以加上0x也可以不加。
4.疑问
- 关于MS,这里的多个和单个是指什么?好像和read,write后面跟的读取/写入个数没关系
- 读上下电状态在csr中的offset是469765888(0x1c000f00),算出来就是7 3 1 1。以前好像有看到个文章说MS和RW应该是对应起来的,要么0 1,要么1 0,不会有1 1的情况,并且在印象里v2中xml在这个命令字的注释上面好像写的也是7 3 0 1即0x1c000d00,但实际配置的offset却是0x1c000f00,请问这个是为什么呢?
- BitIO write的参数问题,有一个写入长度Length,但是实际InData数组的第一个数据好像还得指定长度,后面的才是实际写入数据。这两个长度是重复了吗?还是我对第一个Length的理解不对?



