mcu shell命令参考文档

mcu shell uart 串口设置:波特率 115200,8 位数据位,1 位停止位,无奇偶校验。

登陆 xcd mcu shell

💥 xcd mcu shell 通过串口总共有 3 种登陆方式,3 种方式彼此互斥,同时只能接一种硬件设备。

  • android 系统通过 adb/串口直接登陆到 MCU
  • PC 通过 type c usb 线登陆到 MCU
  • PC 通过 debug 板子登陆到 MCU

android 系统通过串口直接登陆到 MCU

Android 系统通过 adb/串口登陆到 mcu shell 步骤:

  1. 通过 adb shell 登陆到 Android 系统,或者通过 soc 串口登陆到 Android
  2. 输入命令:
    1. stop mculog —— 停止 mculog 进程,因为 mculog 打开占用了串口 /dev/ttyHS4,不停止会导致 mcu shell 无法输入。
      1. microcom /dev/ttyHS4,输入命令后连续输入两个回车就会出现 mcu shell 终端提示符:msh>#
    2. 如果 mcu log 比较多,无法看清楚输入的命令,可以直接复制命令 log.set.loglevel.current 0 粘贴到终端,然后输入回车,该命令可以设置 mcu log 等级为 fatal 级别。
    3. 如果 mcu shell 可以输入输出,但没有 log,可能是因为 soc 启动后没有发送握手信号给 mcu,可以输入命令 log.cat 就可以看到 mcu 的 log 了。

mcu shell microcom 命令帮助信息

microcom 命令可以登陆到 mcu shell,输入 CTRL+] 可以退出 mcu shell 回到 Android shell。

PC 通过 type c usb 线登陆到 MCU

P1 及 P1 之后的硬件板子可用,P1 之前的板子无法使用,输入有问题。

type-c 出来的 UART TTL 电平必须是 1.2V,其他电平都无法输入输出。

type-c 接口连接示意图

PC 通过 debug 板子登陆到 MCU

TODO:

系统

system.version

获取系统版本号。

命令格式: system.version

该命令无参数,用于获取 mcu 系统 git 版本号和编译时间信息。

system.reset

复位 mcu 系统。

命令格式: system.reset

该命令参数说明:

  • 0:mcu 安全复位(等待 SOC 关机)+ SOC 复位 + MCU 复位,原则上非特殊情况不能使用
  • 1:mcu 重启(不等待 SOC 关机)+ SOC 复位 + MCU 复位,原则上非特殊情况不能使用
  • 2:SOC 安全重启(等待 SOC 关机)+ SOC 复位(拉 KPD)+ MCU 不复位
  • 3:SOC 非安全重启(不等待 SOC 关机)+ SOC 复位(拉 KPD)+ MCU 不复位

产线老化测试,建议使用 system.reset 1

os

os.dump.taskinfo

dump autosar 指定 task 信息。

log

log.set.loglevel.current

设置 mcu log 等级,该设置只会影响当前点火周期的 log 等级,不会保存配置,掉电后配置丢失。

命令格式: log.set.loglevel.current $level_id

  • level_id:设置的 log 等级,取值为 0,1,2,3,4。其分别代表:0:fatal 1:error 2:warnning 3:info 4:debug。

log.set.loglevel.saved

设置 mcu log 等级,该设置会影响当前点火周期的 log 等级,且配置会保持到 nvm 中,掉电重启后该配置还会生效。

命令格式: log.set.loglevel.saved $level_id

  • level_id:设置的 log 等级,取值为 0,1,2,3,4。其分别代表:0:fatal 1:error 2:warnning 3:info 4:debug。

示例:log.set.loglevel.saved 3

log.get.loglevel

获取当前 mcu log 打印等级。

命令格式: log.get.loglevel

该命令无参数。

log.filter

log.filter.grep

命令格式: log.filter.grep $pattern

功能说明: 根据指定匹配模式过滤日志。

参数介绍:

  • pattern:匹配模式,支持任意字符 *

例 1:log.filter.grep ab,表示匹配包含 ab 字符的日志。

例 2:log.filter.grep a*b,表示匹配 a b 之间包含任意字符的日志。

例 3:log.filter.grep a*b*c,表示匹配 a b 包含任意字符且 b c 之间包含任意字符的日志。

log.filter.stop

命令格式: log.filter.stop

功能说明: 停止过滤。

参数介绍: 无参数。

memory

memory.display.word

从指定的地址 ram 或 rom 读取一个字(4 字节)的数据,给出的 addr 地址必须是 4 字节对齐。

命令格式: memory.display.word $addr

  • addr:从 addr 地址处读取数据。

memory.display.bytes

从指定的地址 ram 或 rom 读取多个字节的数据。

命令格式: memory.display.bytes $addr $length

  • addr:从 addr 地址处读取数据
  • length:读取字节的长度

memory.write.word

往指定的 ram 地址写数据,给出的 addr 地址必须是 4 字节对齐。

命令格式: memory.write.word $addr $value

  • addr:指定需要写数据的地址
  • value:需要写入到 addr 地址的值

memory.write.byte

往指定的 ram 地址写 1byte 数据。

命令格式: memory.write.byte $addr $value

  • addr:指定需要写数据的地址
  • value:需要写入到 addr 地址的值

memory.valid.check

使用以上命令读写 ram 或 rom 时,都会检测 addr 地址的有效性,通过该命令可以关闭或打开地址有效性检测。

命令格式: memory.valid.check $onoff

  • onoff:有效性设置开关,0:关闭,非 0:打开。

gpio

dio.write.channel

设置 dio channel 输出高低电平。

命令格式: dio.write.channel $chid $value

  • chid:channel id 号
  • value:设置的值,0 表示设置为低电平,非 0 表示设置为高电平

dio.read.channel

读取指定 dio channel 的电平。

命令格式: dio.read.channel $chid

  • chid:channel id 号

i2c

i2c.write.reg

往指定的 i2c 设备寄存器写值。

命令格式: i2c.write.reg $bus $slaveaddr $regaddr $value

  • bus:i2c 总线 id 号,默认从 0 开始
  • slaveaddr:i2c 外设 7bit slave addr
  • regaddr:i2c 外设寄存器地址
  • value:往寄存器写入的值

i2c.read.reg

读取指定的 i2c 设备寄存器的值。

命令格式: i2c.read.reg $bus $slaveaddr $regaddr

  • bus:i2c 总线 id 号,默认从 0 开始
  • slaveaddr:i2c 外设 7bit slave addr
  • regaddr:i2c 外设寄存器地址

i2c.read.reghub

读取 hub 寄存器的值。

命令格式: i2c.read.reghub $regaddr

  • regaddr:i2c 外设寄存器地址,地址范围:0xBF800000 -> 0xBF80FFFF0xBFD20000 -> 0xBFD2FFFF

usb

usb.set.mode.current

设置 usb hub 4715 模式为 host 或 device,该设置只会影响当前点火周期的 usb 模式,不会保存配置,掉电后配置丢失。

命令格式: usb.set.mode.current $mode

  • mode: 1:表示设置为 host 模式,即 soc 是 host,通过 hub4715 可以外接 u 盘等 usb 外设
  • mode: 0:表示设置为 device1 模式,即 soc 是 device,可以连接到 PC 上,PC 为 host,PC 通过 adb 可以登陆到 android

usb.set.mode.saved

设置 usb hub 4715 模式为 host 或 device,该设置会影响当前点火周期的 usb 模式,且配置会保持到 nvm 中,掉电重启后该配置还会生效。

命令格式: usb.set.mode.saved $mode

  • mode: 1:表示设置为 host 模式,即 soc 是 host,通过 hub4715 可以外接 u 盘等 usb 外设
  • mode: 0:表示设置为 device 模式,即 soc 是 device,可以连接到 PC 上,PC 为 host,PC 通过 adb 可以登陆到 android

⚠️ 注意:如果设置为 host 模式,且保持配置,无法通过 adb 登陆 Android 了,即使系统重启后也无法登陆。

usb.get.mode

获取 usb hub 4715 模式,返回 device 或 host。

命令格式: usb.get.mode

该命令无参数。

power

pm.set.sleep.time

该命令可以设置系统从 standby 进入 sleep 的时间,设置完成后,配置立即生效,且会保持配置到 nvm 中,掉电重启后该配置还会生效。

命令格式: pm.set.sleep.time $time

  • time:设置的时间参数,单位为秒,最小值为 30s,最大值 4294967295s,如果想系统永不休眠,可以设置为最大值。

pm.get.sleep.time

获取系统从 standby 进入 sleep 的时间配置参数。

命令格式: pm.get.sleep.time

该命令无参数。

pm.set.tec.config

该命令可以使能或关闭 TEC 的功能。

命令格式: pm.set.tec.config $enable

  • enable:1:打开 TEC,0:关闭 TEC

pm.get.tec.config

该命令查询 TEC 的状态。

命令格式: pm.get.tec.config

该命令无参数。

pm.set.tec.temp

该命令可以设置温度,以便于测试不同温度下的 TEC 策略。

命令格式: pm.set.tec.temp $temperature

  • temperature:具体的温度值,该值将影响 TEC 的策略

pm.get.tec.temp

该命令查询用户设置的影响 TEC 温控策略的温度。

命令格式: pm.get.tec.temp

该命令无参数。

pm.charge.hv.ctrl

手工设置充电的高压开关,设置完成后立即生效,重启或休眠唤醒后配置失效;该命令配置后,电池充电可以不用发送上高压信号(HvBattModStsCoding_HV_On)就可以实现充电。

命令格式: pm.charge.hv.ctrl $enable

  • enable:1:直接设置 HvBattModStsCoding_HV_On,不用信号值;0:使用真实的信号值

pm.charge.chk.ctrl

手工启动镍氢电池的健康检查,过滤 7 天的检查一次的条件,其他条件与镍氢电池的健康检查保持一致。

此命令需要上高压,若是台架可以使用 pm.charge.hv.ctrl 模拟上高压。

命令格式: pm.charge.chk.ctrl $enable

  • enable:1:过滤 7 天的条件,0:恢复 7 天的检查条件

此条命令同时会把当前已经检测的监测点数据输出,如无则说明还没有检测点数据。

250502-10:45:36.159 61980.206 I0 PM] xpm charge ubattery health
250502-10:45:36.160 61980.206 I0 PM] xpm charge health_flag[0]:0x5A, normal:604071, chk:112
250502-10:45:36.160 61980.206 I0 PM] xpm charge health_flag[1]:0x5A, normal:604071, chk:118
250502-10:45:36.160 61980.206 I0 PM] xpm charge health_flag[2]:0x5A, normal:604071, chk:112
250502-10:45:36.160 61980.206 I0 PM] xpm charge health_flag[3]:0x5A, normal:604071, chk:118
250502-10:45:36.160 61980.206 I0 PM] xpm charge health_flag[4]:0x5A, normal:604071, chk:112
250502-10:45:36.160 61980.206 I0 PM] xpm charge health_flag[5]:0x5A, normal:606308, chk:118
250502-10:45:36.161 61980.206 I0 PM] xpm charge health_flag[6]:0x5A, normal:606308, chk:107
250502-10:45:36.161 61980.206 I0 PM] xpm charge health_flag[7]:0x5A, normal:606308, chk:112
250502-10:45:36.161 61980.206 I0 PM] xpm charge health_flag[8]:0x5A, normal:606308, chk:118
250502-10:45:36.161 61980.206 I0 PM] xpm charge health_flag[9]:0x5A, normal:606308, chk:123

pm.standby

xCD 直接进入深睡,核心板掉电,MCU 进入 Standby 模式,该命令无参数。

pm.standby

pm.rtcwk.reg

设置定时唤醒,设置唤醒时间建议比当前时间延后 5min。

命令格式: pm.rtcwk.reg $module $year $month $day $hour $minute $second

  • module:取值范围 0 <= module <= 4
// 设置 2024 年 8 月 1 日 10:20:00 唤醒
pm.rtcwk.reg 1 2024 8 1 10 20 0

pm.hm.score.set

设置系统健康度。系统健康度小于 0 时,满足 str 条件时不进入 str 而是进行一次重启。

通过该命令设置过健康度后系统将不会继续计算健康度,直到系统重启或 STR 后。

pm.hm.score.set 127  // -1 + 128 的 offset

FastBoot

通过 MCU 的串口命令控制 SOC 进入 FastBoot 模式。

  • 进入:pm.soc.fastboot.ctrl 1
  • 退出:pm.soc.fastboot.ctrl 0

Recovery / MIBIOS

  • 进入 Recovery:pm.soc.recovery.ctrl 1
  • 进入 MIBIOS:pm.soc.bios.ctrl 1

EDL

通过 MCU 的串口命令控制 SOC 进入 EDL 模式。

  • 进入:pm.soc.edl.ctrl 1
  • 退出:pm.soc.edl.ctrl 0

900E

通过 MCU 的串口命令控制 SOC 进入 900E 模式。

  • 进入:pm.soc.900e.ctrl 1
  • 退出:pm.soc.900e.ctrl 0

ubattery

  • 打开放电:dio.write.channel 0x21e 1
  • 关闭放电:dio.write.channel 0x21e 0
  • 查看放电:dio.read.channel 0x21e
    • 1:表示放电打开
    • 0:表示放电关闭

cluster

cluster.odo.init

清除总里程数据,非必要不要使用,仅作为总里程 NvM 校验失败,里程无法存储写入一次默认值使用。

命令格式: cluster.odo.init

该命令无参数。

cluster.odo.initst

读清除总里程之后的 eeprom 数据,用来验证清除之后的 eeprom 值是否正确。

命令格式: cluster.odo.initst

该命令无参数。

执行之后看到如下 log 打印,即为 EEPROM 数据初始化成功:

EEP DATA:E10000000000000.
Return: 0, 0x00000000

cluster.dump.eep

命令格式: cluster.dump.eep $blockid

  • blockid:eeprom 划分的 block id 号

test

test.set.faultid

用 coredump 测试,软件开发阶段使用。

命令格式: test.set.faultid $coreid $faultid

  • faultid:fault 测试 id
  • coreid:表示第几个核。tc397 取值范围是 0-5

adc

adc.get.value

获取所有配置的 adc 值。

命令格式: adc.get.value

该命令无参数。

adc.get.channel.value

获取指定 group 指定 channel 的 adc 值。

命令格式: adc.get.channel.value $group $channel

  • group: uint8
  • channel: uint8

配置字

car.write.nvm

设置配置字高低配,重启生效。

命令格式: car.write.nvm $carmode

  • carmode0 —— 低配,2 —— 高配

car.read.nvm

获取配置字高低配。

命令格式: car.read.nvm

该命令无参数。

故障注入

test.safety.inject

命令格式: test.safety.inject $class $major $sub

  • Class:表示测试类 ID
  • Major:表示测试类下的主 ID
  • sub:表示测试类 ID 和主 ID 下的副 ID

SafetyDiag

sdiag.read.log

命令格式: sdiag.read.log $type

  • type:读取类型 id
    • 0:表示最新被记录 error 日志
    • 1-64:表示第 n 个 block 记录的日志
    • 255:表示读取所有日志
    • 256:表示 nvm 管理日志

Diagnostic

TLS Switch

命令格式: doip.set.d040

  • type:设置 DID D040 的值
    • 0:关闭 TLS,下一个上电周期有效
    • 1:打开 TLS,下一个上电周期有效

D010 Switch

命令格式: doip.get.d010 —— 获取 d010 的写入状态

命令格式: doip.set.d010 $value

  • type:设置 DID D010 的写入状态
    • 0:未写入 D010
    • 1:已写入 D010

security_access_enable

命令功能: diag.set.security 设置 F106(Security Key For SA)是否可写入。

命令格式: diag.set.security $value

  • type:设置状态
    • 0:不可修改 Security Key
    • 1:可修改 Security Key