PM8051 使用指南
1. 概述¶
本文主要介绍PM8051单片机即mcu在u-boot和kernel下的使用方法。
2. u-boot 下使用 mcu¶
u-boot下支持在 dts、cmdline 和 bootargs 中配置 mcu 功能,配置生效的优先级如下:cmdline > bootargs > dts 。在系统上电时,首先会先从 dts 中读取 mcu 的配置,然后会根据 bootargs 修改 mcu 配置,最后可以使用 cmdline 中的 mcu 命令修改 mcu 配置。
2.1. dts 配置¶
如下为 u-boot 下支持的所有配置属性:
mcu: mcu {
compatible = "sstar,mcu";
reg = <0x1F006204 0x60>;
ir-mode = "nec";
ir-key-table = <0x00 0xA8>, <0x80 0x46>, <0x14 0x0C>;
cec-pad = <PAD_PM_PWM1>;
cec-opcode-table = <0x0D>, <0x82>, <0x04>;
gpio-edge-rising;
gpio-table = <PAD_PM_GPIO3>;
sar0-ref-1v;
sar0-low-threshold = <500>;
sar0-high-threshold = <600>;
sar1-ref-1v;
sar1-low-threshold = <500>;
sar1-high-threshold = <600>;
status = "okay";
};
各个属性的功能含义以及取值范围如下:
属性 |
类型 |
值 |
|---|---|---|
| compatible | string | |
| reg | < u32 u32 > | |
| ir-mode | string | |
| ir-key-table | < u32 u32 > | |
| cec-pad | < u32 > | |
| cec-opcode-table | < u32 > | |
| gpio-edge-rising | bool | |
| gpio-table | < u32 > | |
| sar0-ref-1v | bool | |
| sar0-low-threshold | < u32 > | <voltage> = <value> / <1024> * <ref_voltage> 例如: 设置为 <500> 参考电压为 1v8 时对应的电压下限为 879 mv |
| sar0-high-threshold | < u32 > | |
| sar1-low-threshold | < u32 > | |
| sar1-high-threshold | < u32 > | |
| status | string |
2.2. bootargs 配置¶
bootargs 配置功能用于动态配置 mcu 唤醒功能,并且可以在掉电后可以保存,以下是完整的配置命令:
mcu=ir:enable=on,mode=rc5,table=<0-0x00-0xa9-0x0090>,<1-0x80-0x0d-0x0090>, cec:enable=on,pad=PAD_PM_PWM0,table=<0-0xa0>,<1-0xb0>, gpio:edge=rising,enable=<PAD_PM_PWM1-on>,table=<PAD_PM_PWM1-0x008f>, sar:enable=<0-on>,<1-off>,ref=<0-1800>,<1-1000>,threshold=<0-500-600>,<1-700-800>
配置的格式以 “:” 和 “,” 作为分割符,格式为 <ip>:<cmd>=<content>,<ip> 只需要第一个设置指定即可,该命令支持的所有值如下:
| 模块 | 功能 | 内容 | 例子 |
|---|---|---|---|
| ir | enable | ||
| mode | |||
| table | |||
| cec | enable | ||
| pad | |||
| table | |||
| gpio | enable | ||
| edge | |||
| table | |||
| sar | enable | ||
| ref | |||
| threshold |
2.3. cmdline 配置¶
目前与 mcu 相关的命令有两条:pm 和 mcu。
pm 命令的使用方法为:
pm [event]
- pm:输入 pm 命令时会判断是否为 ac on 如果是 ac on 开机则进入待机
- pm event:获取唤醒源
mcu 命令的使用方法:
mcu - <ip> <cmd> [<value>]
Usage:
mcu <ip> <cmd> [<value>] - get/set current mcu configurations
- <ip> : ir cec gpio sar
- <cmd> : ir - enable mode table
cec - enable pad table
gpio - enable edge
sar - enable ref threshold
- <value> : ir & cec enable - <on/off>
gpio & sar enable - <ch> <on/off>
ir mode - <nec/rc5>
ir table - <no> <customer> <key>
cec pad - <pad name>/<pad index>
cec table - <no> <opcode>
gpio edge - <rising/falling>
sar ref - <ch> <1000/1800>
sar threshold - <ch> <low> <high>
命令的使用方法参考 mcu 命令的 help 文本,各个参数的含义可以参考 2.1. dts 配置 和2.2. bootargs 配置
3. kernel 下使用 mcu¶
kernel 下支持在 dts、bootargs 和 sysfs 中配置 mcu 功能,配置生效的优先级如下:sysfs > bootargs > dts 。在系统上电时,首先会先从 dts 中读取 mcu 的配置,然后会根据 bootargs 修改 mcu 配置,最后可以使用 sysfs 中 /sys/class/mstar/mcu 下的各个节点修改 mcu 配置。
3.1. dts 配置¶
如下为 u-boot 下支持的所有配置属性:
mcu: mcu {
compatible = "sstar,mcu";
reg = <0x1F006204 0x60>;
ir-mode = "nec";
ir-key-table = <0x00 0xA8 KEY_WAKEUP>, <0x80 0x46 KEY_WAKEUP>;
cec-pad = <PAD_PM_PWM1>;
cec-opcode-table = <0x0D>,<0x82>,<0x04>;
gpio-edge-rising;
gpio-table = <PAD_PM_GPIO3 KEY_WAKEUP>;
sar0-ref-1v;
sar0-low-threshold = <500>;
sar0-high-threshold = <600>;
sar1-ref-1v;
sar1-low-threshold = <500>;
sar1-high-threshold = <600>;
status = "okay";
};
kernel 下的 dts 配置与 u-boot 的 dts 属性高度相似,kernel 下 ir 和 gpio 支持在唤醒后向输入子系统上报码值,所以在 dts 需要多配置不同键值或 gpio 需要上报的码值,除此以外,大部分属性与 u-boot 下保持一致,如下只列举不一致部分,一致部分请参考 2.1. dts 配置
| 属性 | 类型 |
值 |
|---|---|---|
| ir-key-table | < u32 u32 u32 > | |
| gpio-table | < u32 u32 > |
3.2. bootargs 配置¶
bootargs 在 u-boot 和 kernel 之间是共享的,所以 kernel 下 bootargs 的配置与 u-boot 完全一样,可以参考:2.2. bootargs 配置
3.3. sysfs 配置¶
kernel 下 mcu 配置相关的节点主要在 /sys/class/mstar/mcu 目录下,/sys/class/mstar/mcu 下的目录结构为:
. ├── ir │ ├── enable │ ├── mode │ └── table ├── cec │ ├── enable │ ├── pad │ └── table ├── gpio │ ├── enable │ ├── edge │ └── table ├── sar │ ├── enable │ ├── ref │ └── threshold └── wakeup_event
查看 ir 唤醒使能状态:
/ # cat /sys/class/mstar/mcu/ir/enable 1
修改 ir 唤醒状态:
/ # echo 0 > /sys/class/mstar/mcu/ir/enable / # echo 1 > /sys/class/mstar/mcu/ir/enable
查看 ir 唤醒协议:
/ # cat /sys/class/mstar/mcu/ir/mode nec
修改 ir 唤醒协议:
/ # echo rc5 > /sys/class/mstar/mcu/ir/mode / # echo nec > /sys/class/mstar/mcu/ir/mode
查看 ir 键值等配置:
/ # cat /sys/class/mstar/mcu/ir/table
customer code key value report code
----------------------------------------
0x00 0xa8 0x008f
0x80 0x46 0x008f
0x11 0x0c 0x008f
修改 ir 键值等配置:
/ # echo <index> <customer code> <key value> <report code> > cat /sys/class/mstar/mcu/ir/table
<index>:序号从 0 开始,每次只能添加一个,例如当前配置最大的序号为2,则只能增加 3 或者修改 0 1 2 的信息。<customer code>:nec 协议的客户码 / rc5 协议的地址位<key value>:红外的键值<report code>:输入子系统的上报键值
例如:
/ # echo 0 0x80 0x11 0x008f > cat /sys/class/mstar/mcu/ir/table
查看 cec 使能状态:
/ # cat /sys/class/mstar/mcu/cec/enable 1
修改 cec 唤醒状态:
/ # echo 0 > /sys/class/mstar/mcu/cec/enable / # echo 1 > /sys/class/mstar/mcu/cec/enable
查看 cec 唤醒引脚:
/ # cat /sys/class/mstar/mcu/cec/pad PAD_PM_PWM1
修改 cec 唤醒引脚:
/ # echo PAD_PM_I2CM_SCL > /sys/class/mstar/mcu/cec/pad / # echo 35 > /sys/class/mstar/mcu/cec/pad
查看 cec 操作码配置:
/ # cat /sys/class/mstar/mcu/cec/table 0x0d 0x82 0x04 0x83
修改 cec 操作码配置:
/ # echo <index> <opcode> > /sys/class/mstar/mcu/cec/table
<index>:序号从 0 开始,每次只能添加一个,例如当前配置最大的序号为2,则只能增加 3 或者修改 0 1 2 的信息。<opcode>:cec 操作码
例如:
/ # echo 1 0x04 > /sys/class/mstar/mcu/cec/table
查看 gpio 使能状态:
/ # cat /sys/class/mstar/mcu/gpio/enable PAD_PM_PWM0 [0] PAD_PM_PWM1 [0] PAD_PM_I2CM_SCL [0] PAD_PM_I2CM_SDA [0] PAD_PM_UART_RX0 [0] PAD_PM_UART_TX0 [0] PAD_PM_IR_RX [0] PAD_PM_GPIO0 [0] PAD_PM_GPIO1 [0] PAD_PM_GPIO2 [0] PAD_PM_GPIO3 [1] PAD_PM_GPIO4 [0] PAD_PM_GPIO5 [0] PAD_PM_SPI_WPZ [0] PAD_PM_SPI_DO [0] PAD_PM_SPI_CZ [0] PAD_PM_SPI_HLD [0] PAD_PM_SPI_CK [0] PAD_PM_SPI_DI [0] PAD_SAR_GPIO0 [0] PAD_SAR_GPIO1 [0]
修改 gpio 使能状态:
/ # echo PAD_PM_PWM1 1 > /sys/class/mstar/mcu/gpio/enable / # echo 25 1 > /sys/class/mstar/mcu/gpio/enable
查看 gpio 唤醒边沿设置:
/ # cat /sys/class/mstar/mcu/gpio/edge PAD_PM_PWM1 [R]
修改 gpio 唤醒边沿设置:
/ # echo PAD_PM_PWM1 falling > /sys/class/mstar/mcu/gpio/edge / # echo PAD_PM_PWM1 rising > /sys/class/mstar/mcu/gpio/edge
查看 gpio 上报输入子系统码值:
/ # cat /sys/class/mstar/mcu/gpio/table
gpio name report code
-------------------------------
PAD_PM_GPIO3 0x008f
修改 gpio 上报输入子系统码值:
/ # echo <index> <report code> > /sys/class/mstar/mcu/gpio/table
例如:
/ # echo PAD_PM_GPIO3 0x008f > /sys/class/mstar/mcu/gpio/table / # echo 35 0x008f > /sys/class/mstar/mcu/gpio/table
查看 sar 唤醒使能状态:
/ # cat /sys/class/mstar/mcu/sar/enable SAR0 [1] SAR1 [1]
修改 sar 唤醒使能状态:
/ # echo <ch> <0/1> > /sys/class/mstar/mcu/sar/enable
例如:
/ # echo 0 1 > /sys/class/mstar/mcu/sar/enable
查看 sar 参考电压状态:
/ # cat /sys/class/mstar/mcu/sar/ref SAR0 [1000] SAR1 [1000]
修改 sar 参考电压状态:
/ # echo <ch> <1000/1800> > /sys/class/mstar/mcu/sar/ref
例如:
/ # echo 0 1800 > /sys/class/mstar/mcu/sar/ref
查看 sar 阈值设置:
/ # cat /sys/class/mstar/mcu/sar/threshold SAR0 [500-600] SAR1 [500-600]
修改 sar 阈值设置:
/ # echo <ch> <low> <high> > /sys/class/mstar/mcu/sar/threshold
例如:
/ # echo 0 500 600 > /sys/class/mstar/mcu/sar/threshold
4. PM8051源码编译¶
使用IDE工具Keil uVersion5来编译。
4.1 打开已有工程¶
工程路径:vendor\sigmastar\PM_8051\PM_8051.uvproj

4.2 编译工程¶
一键全编,如图:

4.3 打包生效¶
将编译生成的PM8051.bin拷贝到vendor\sigmastar\alkaid\project\board\p5\pm51 目录,重新打包并更新bootloader.img并重启即可。