【串口调试】我想用BMC的串口与设备通讯,应该如何开发呢?

我在vpd中这么设置

“Uart_1”: {
“Id”: 1,
“Description”: “UART1连接PORT1”,
“UartConnection”: 255,
“PortConnection”: 1,
“BaudRate”: 115200,
“DataBit”: 8,
“ParityBit”: 78,
“StopBit”: 1,
“SerialSwitch”: “<=/Scanner_Gpio31.Value”,
@Default”: {
“SerialSwitch”: 1
}
},

其中有些字段在https://www.openubmc.cn/docs/zh/development/specifications/SDK.html中没找到,后来发现https://discuss.openubmc.cn/t/topic/2380/1这里有补充。

NAME TYPE SIGNATURE RESULT/VALUE FLAGS
bmc.kepler.Managers.UartPort interface - - -
.Reset method a{ss} - -
.BusType property s “Uart” -
.Id property y 1 -
bmc.kepler.Object.Properties interface - - -
.GetAllWithContext method a{ss}s a{sv} -
.GetOptions method a{ss}ss a{ss} -
.GetPrivateProperties method a{ss} s -
.GetPropertiesByNames method a{ss}sas a{sv}a{sv} -
.GetPropertiesByOptions method a{ss}sa{ss} as -
.GetPropertyDetail method a{ss}ss s -
.GetWithContext method a{ss}ss v -
.SetWithContext method a{ss}ssv - -
.ClassName property s “Uart” emits-change
.ObjectIdentifier property (ysss) 0 “1” “1” “01” emits-change
.ObjectName property s “Uart_1_01” emits-change
.TraceSamplingRate property d 0 emits-change
org.freedesktop.DBus.Introspectable interface - - -
.Introspect method - s -
org.freedesktop.DBus.ObjectManager interface - - -
.GetManagedObjects method - a{oa{sa{sv}}} -
org.freedesktop.DBus.Peer interface - - -
.GetMachineId method - s -
.Ping method - - -
org.freedesktop.DBus.Properties interface - - -
.Get method ss v -
.GetAll method s a{sv} -
.Set method ssv - -
.PropertiesChanged signal sa{sv}as - -

这里没有它对应的在/dev/ttySX的信息,我应该如何对应呢?还是直接根据“PortConnection”: 1,这个字段对应?

如果我想测试串口收发,我应该如何操作呢?用哪个组件呢?

答案内容由AI生成,仅供参考:

如何在 openUBMC 中基于 BMC 串口进行开发与调试

您提出的问题涉及 BMC 串口通信的配置、设备节点映射、收发测试方法及组件使用。以下是基于 openUBMC 平台的完整开发指导,结合知识图谱(KG)、文档片段(DC)及搜索结果进行系统性说明。


一、串口配置字段解析

您在 VPD(重要产品数据)中配置了如下 Uart_1

"Uart_1": {
  "Id": 1,
  "Description": "UART1连接PORT1",
  "UartConnection": 255,
  "PortConnection": 1,
  "BaudRate": 115200,
  "DataBit": 8,
  "ParityBit": 78,
  "StopBit": 1,
  "SerialSwitch": "<=/Scanner_Gpio31.Value",
  "@Default": {
    "SerialSwitch": 1
  }
}

:white_check_mark: 字段含义说明:

字段名 含义与作用
Id UART 控制器编号(如 UART0、UART1),对应底层硬件控制器
BaudRate, DataBit, ParityBit, StopBit 标准串口参数配置,用于设置通信波特率、数据位、校验位、停止位
PortConnection 指定该 UART 所连接的 物理端口(Port)编号1 表示与 Port1 相连。这是关键的路由配置
UartConnection 若为串口互联,表示连接到哪一路 UART。255 表示无连接(无效值),通常表示该 UART 是对外接口
SerialSwitch 动态控制串口方向或使能状态的信号源,此处绑定到 GPIO 信号 Scanner_Gpio31.Value,可用于运行时切换

:magnifying_glass_tilted_left: 注:ParityBit: 78 看似异常,但在 openUBMC 的 CSR 字典中,78 代表 'N'(无校验),是合法字符编码表示。此为内部字符串转码机制所致。


二、/dev/ttySX 设备节点映射说明

:red_question_mark: 问题:为何 D-Bus 接口未显示 /dev/ttySX

原因
D-Bus 暴露的是 抽象对象模型(如 UartPort),并非直接暴露 Linux 字符设备节点(如 /dev/ttyS1)。二者之间的映射由平台驱动与设备树决定。

:white_check_mark: 如何对应到 /dev/ttySX

  • 一般情况下,BMC 上的 UART 控制器会映射为 /dev/ttyS<X>

    • UART0/dev/ttyS0
    • UART1/dev/ttyS1
    • 以此类推
  • 映射逻辑由以下组件决定:

    • 设备树(Device Tree):指定 UART 控制器对应的物理地址和中断
    • 平台初始化脚本(如 platform.sr:通过 UartSerialManagement 对象定义映射关系
  • 您可通过 PortConnection 推断用途

    • "PortConnection": 1,说明该串口通过 Port1 引出,可能是前面板串口或外接设备接口
    • 但具体是否生成 /dev/ttyS1,需查看内核日志:
      dmesg | grep ttyS
      
      输出示例:
      [    1.234567] 8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
      [    1.235678] 8250: ttyS1 at MMIO 0xfedc0000 (irq = 18) is a 16550A
      

:white_check_mark: 结论:不能仅靠 PortConnection 确定 /dev/ttySX 节点编号,必须结合内核启动信息确认实际分配。


三、串口收发测试方法

方法一:使用 minicom / screen 手动测试(推荐)

如果串口已正确初始化且设备节点存在,可使用终端工具测试:

# 安装工具(如有)
opkg install minicom

# 使用 screen 连接 UART1(假设为 /dev/ttyS1)
screen /dev/ttyS1 115200,8,n,1

或使用 minicom:

minicom -D /dev/ttyS1 -b 115200

:light_bulb: 注意:确保串口线连接正确,对方设备也配置相同波特率。


方法二:通过脚本自动读写(适用于程序开发)

使用 luaC 编写程序读写串口。openUBMC 支持 Lua 脚本管理串口。

示例:通过 lua 打开串口并读取数据

local fd = assert(io.open("/dev/ttyS1", "r+"))
fd:write("Hello UART!\r\n")
fd:flush()

while true do
    local line = fd:read("*l")
    if line then
        print("Received: " .. line)
    end
    skynet.sleep(100) -- 毫秒
end

:warning: 注意:需确保进程有权限访问 /dev/ttyS1,建议在 skynet 服务中运行。


四、关键组件与模块说明

1. bmc.kepler.Managers.Uart 模块

  • 负责管理所有 UART 控制器
  • 提供串口启停、参数设置、中断处理等能力
  • platform.sr 中需注册:
"Uart_1": {
  "Id": 1,
  "BaudRate": 115200,
  "DataBits": 8,
  "StopBits": 1,
  "Parity": "None"
}

2. serial_mgmt.lua 脚本

  • 管理串口互联逻辑
  • 可调用 UartRxConnectPortRx, PortTxConnectUartTx 等方法建立链路
  • 示例(设置 UART1 与 Port1 连通):
UartRxConnectPortRx(SrcUart=1, DestPort=1)
PortTxConnectUartTx(SrcPort=1, DestUart=1)

:books: 参考文档:https://discuss.openubmc.cn/t/topic/3568

3. UartCircularLog 模块(用于日志采集)

若您需要 长期监听串口日志(如 expander 日志),可配置 UartCircularLog 对象:

"UartCircularLog_4": {
  "Id": 4,
  "LogDirection": 1,
  "RxSize": 3,        // 接收缓存大小:对应2M
  "TxSize": 2,        // 发送缓存大小:对应1M
  "LogEnable": 1,
  "AutoCollect": 0,
  "IsSysCom": 0
}
  • 日志将缓存在内存中,可通过 一键收集 功能导出
  • 也可通过 Export 方法手动导出:
ipmcset -d uartlog -v export type=ALL path=/tmp/uart_log.txt

:pushpin: 来源:文档块 4搜索结果 9


五、开发建议与最佳实践

:white_check_mark: 开发流程建议:

  1. 确认硬件连接

    • 检查 UART1 是否物理连接到目标设备(如 expander)
    • 使用示波器或逻辑分析仪验证通信电平
  2. 验证驱动与设备节点

    • 启动后执行:
      ls /dev/ttyS*
      dmesg | grep uart
      
    • 检查是否加载对应 UART 驱动
  3. 配置 CSR 文件

    • platform.sr 中定义 Uart, UartPort, UartCircularLog 等对象
    • 确保 PortConnection 与硬件一致
  4. 测试通信

    • 使用 screenminicom 初步测试收发
    • 再开发应用程序逻辑
  5. 监控与日志

    • 配置 UartCircularLog 实现断电不丢日志
    • 使用 ipmcget -d log 导出诊断信息

六、常见问题排查

问题 排查方法
/dev/ttyS1 不存在 检查设备树、驱动加载、内核配置 CONFIG_SERIAL_8250
串口无输出 检查波特率匹配、线序(TX/RX 是否交叉)、供电
收到乱码 检查 BaudRate 是否一致,DataBits/Parity 配置正确
无法写入 检查文件权限、串口是否被占用(如被 console 占用)
SerialSwitch 不生效 检查 GPIO 是否正确导出并可读取

总结

项目 说明
串口映射 UART1 一般对应 /dev/ttyS1,需通过 dmesg 确认
PortConnection 表示逻辑端口编号,用于路由配置,非设备节点编号
开发方式 可使用 shell 工具测试,或在 Lua/C 中编程读写 /dev/ttySx
关键组件 bmc.kepler.Managers.Uartserial_mgmt.luaUartCircularLog
推荐工具 screen, minicom, ipmitool, dmesg

:white_check_mark: 建议参考 openUBMC 社区文档CSR 配置字典 获取最新字段定义。

如需进一步调试,可启用串口日志记录或使用 QEMU 仿真环境进行验证。

相关链接:

  1. Hi3093开发烧写后无法启动,报CRC错误
  2. 基础通用问题FAQ
  3. 【串口通信】Uart如何配置
  4. BIOS启动失败,BTC is busy ,BTC bt ctrl:0x80
  5. openUBMC

你这个问题看着像是个需求,看看要不要在hardware或者bmc_core的sig例会上讨论一下