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
  • sstar,mcu:驱动的匹配字符,需与驱动中的匹配字符串一致
  • reg < u32 u32 >
  • < 0x1F006204 0x60 >:驱动储存配置的寄存器,需与 mcu 固件中的地址一致
  • ir-mode string
  • “nec”:配置 ir 协议为 nec 协议
  • “rc5”:配置 ir 协议为 rc5 协议
  • ir-key-table < u32 u32 >
  • < customer-code key-value >:对于 nec 协议,第一个参数为客户码(customer code),第二个参数为键值(key value)
  • < address key >:对于 rc5 协议,第一个参数为地址位,第二个参数为命令位
  • cec-pad < u32 >
  • 配置 mcu 检测 cec 信号的引脚,只支持 PM domain 的引脚,可以配置的值参考 drivers/sstar/include/pioneer5/gpio.h 中 PAD_PM 开头的宏定义
  • cec-opcode-table < u32 >
  • 配置 cec 唤醒的操作码
  • gpio-edge-rising bool
  • 默认为下降沿时唤醒,如果声明 gpio-edge-rising 属性,则将 gpio 唤醒边沿更改为上升沿(rising)
  • gpio-table < u32 >
  • 配置支持唤醒的引脚,可以配置多根引脚,以逗号隔开
  • sar0-ref-1v bool
  • 设置对应通道 sar 的参考电压为 1v 默认为 1v8
  • sar0-low-threshold < u32 >
  • 设置对应通道 sar 的唤醒范围的下限,当 sar 引脚采集到的电压在上下限范围内时唤醒,设置值和电压的对应关系为:<voltage> = <value> / <1024> * <ref_voltage> 例如: 设置为 <500> 参考电压为 1v8 时对应的电压下限为 879 mv
  • sar0-high-threshold < u32 >
  • 设置对应通道 sar 的唤醒范围的上限,当 sar 引脚采集到的电压在上下限范围内时唤醒
  • sar1-low-threshold < u32 >
  • 设置对应通道 sar 的唤醒范围的下限,当 sar 引脚采集到的电压在上下限范围内时唤醒
  • sar1-high-threshold < u32 >
  • 设置对应通道 sar 的唤醒范围的上限,当 sar 引脚采集到的电压在上下限范围内时唤醒
  • 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
  • on:开启 ir 唤醒功能
  • off:关闭 ir 唤醒功能
  • enable=on
  • enable=off
  • mode
  • nec:配置 ir 唤醒协议为 nec
  • rc5:配置 ir 唤醒协议为 rc5
  • mode=nec
  • mode=rc5
  • table
  • < index-customer-key-report >:第一个参数为配置的序号,从零开始;第二个参数为客户码(nec)或地址位(rc5);第三个参数为键值;第四个参数为注册到 kernel 输入子系统上报的码值
  • table=< 0-0x00-0xa9-0x0090 >,< 1-0x80-0x0d-0x0090 >
  • cec enable
  • on:开启 cec 唤醒功能
  • off:关闭 cec 唤醒功能
  • enable=on
  • enable=off
  • pad
  • pad:配置 mcu 检测 cec 信号的引脚,只支持 PM domain 的引脚,可以配置的值参考 drivers/sstar/include/pioneer5/gpio.h 中 PAD_PM 开头的宏定义,或者宏定义的值(十进制)
  • pad=PAD_PM_PWM0
  • pad=25
  • table
  • < index-opcode-report >:第一个参数为配置的序号,从零开始;第二个参数为操作码;第三个参数为注册到 kernel 输入子系统上报的码值
  • table=< 0-0xa0 >,< 1-0xb0 >
  • gpio enable
  • < index-on/off >:配置是否使能 gpio 唤醒功能,第一个参数为 gpio 的名称或索引值,可以配置的值参考 drivers/sstar/include/pioneer5/gpio.h 中 PAD_PM 开头的宏定义,或者宏定义的值(十进制)
  • enable=< PAD_PM_PWM1-on >,< PAD_PM_GPIO0-off >
  • edge
  • falling:配置 gpio 为下降沿时唤醒
  • rising:配置 gpio 为上升沿时唤醒
  • edge=falling
  • edge=rising
  • table
  • < index-report >:配置引脚唤醒时上报给输入子系统的码值
  • table=< PAD_PM_PWM1-0x008f >
  • sar enable
  • < ch-on/off >:配置是否使能特定通道的 sar 唤醒功能
  • enable=< 0-on >,< 1-off >
  • ref
  • < ch-ref >:配置特定通道 sar 的参考电压,参考电压的取值为 1000 或 18000
  • ref=< 0-1000 >,< 1-1800 >
  • threshold
  • < ch-low-high >:配置特定通道 sar 唤醒的阈值,计算方式同上
  • threshold=< 0-500-600 >,< 1-500-600 >
  • 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 >
  • < customer-code key-value report code >:对于 nec 协议,第一个参数为客户码(customer code),第二个参数为键值(key value),第三个参数为上报到输入子系的码统值
  • < address key >:对于 rc5 协议,第一个参数为地址位,第二个参数为命令位,第三个参数为上报到输入子系统的码值
  • gpio-table < u32 u32 >
  • < gpio report-code >:配置支持唤醒的引脚和对应上报到输入子系统的码值,可以配置多根引脚,以逗号隔开;第一个参数为 gpio 的名字或序号,第二个参数为上报到输入子系统的码值
  • 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并重启即可。