答案内容由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
}
}
字段含义说明:
| 字段名 | 含义与作用 |
|---|---|
Id |
UART 控制器编号(如 UART0、UART1),对应底层硬件控制器 |
BaudRate, DataBit, ParityBit, StopBit |
标准串口参数配置,用于设置通信波特率、数据位、校验位、停止位 |
PortConnection |
指定该 UART 所连接的 物理端口(Port)编号。1 表示与 Port1 相连。这是关键的路由配置 |
UartConnection |
若为串口互联,表示连接到哪一路 UART。255 表示无连接(无效值),通常表示该 UART 是对外接口 |
SerialSwitch |
动态控制串口方向或使能状态的信号源,此处绑定到 GPIO 信号 Scanner_Gpio31.Value,可用于运行时切换 |
注:
ParityBit: 78看似异常,但在 openUBMC 的 CSR 字典中,78代表'N'(无校验),是合法字符编码表示。此为内部字符串转码机制所致。
二、/dev/ttySX 设备节点映射说明
问题:为何 D-Bus 接口未显示 /dev/ttySX?
原因:
D-Bus 暴露的是 抽象对象模型(如 UartPort),并非直接暴露 Linux 字符设备节点(如 /dev/ttyS1)。二者之间的映射由平台驱动与设备树决定。
如何对应到 /dev/ttySX?
-
一般情况下,BMC 上的 UART 控制器会映射为
/dev/ttyS<X>:UART0→/dev/ttyS0UART1→/dev/ttyS1- 以此类推
-
映射逻辑由以下组件决定:
- 设备树(Device Tree):指定 UART 控制器对应的物理地址和中断
- 平台初始化脚本(如
platform.sr):通过Uart和SerialManagement对象定义映射关系
-
您可通过
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
- 若
结论:不能仅靠
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
注意:确保串口线连接正确,对方设备也配置相同波特率。
方法二:通过脚本自动读写(适用于程序开发)
使用 lua 或 C 编写程序读写串口。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
注意:需确保进程有权限访问
/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)
参考文档:
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
五、开发建议与最佳实践
开发流程建议:
-
确认硬件连接
- 检查 UART1 是否物理连接到目标设备(如 expander)
- 使用示波器或逻辑分析仪验证通信电平
-
验证驱动与设备节点
- 启动后执行:
ls /dev/ttyS* dmesg | grep uart - 检查是否加载对应 UART 驱动
- 启动后执行:
-
配置 CSR 文件
- 在
platform.sr中定义Uart,UartPort,UartCircularLog等对象 - 确保
PortConnection与硬件一致
- 在
-
测试通信
- 使用
screen或minicom初步测试收发 - 再开发应用程序逻辑
- 使用
-
监控与日志
- 配置
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.Uart、serial_mgmt.lua、UartCircularLog |
| 推荐工具 | screen, minicom, ipmitool, dmesg |
建议参考 openUBMC 社区文档 和
CSR 配置字典获取最新字段定义。
如需进一步调试,可启用串口日志记录或使用 QEMU 仿真环境进行验证。
相关链接: