涉硬参数调整指南


1. 概述

本文主要描述模拟IP和数字接口涉硬参数调试方法。

2. 模拟IP涉硬参数调试步骤

2.1. USB 2.0

USB 2.0 IP提供了三个关于驱动能力的参数可以调节,分别为:Main Current(TX Swing)、De-emphasis以及CM Current。针对device mode和host mode均提供了用于debug和用于参数固化的方法来调节涉硬参数。

2.1.1. 通过dts配置默认值

驱动能力调节参数首先在DTS里设置了默认值,默认值为:对于USB2.0 device mode 参数默认值为:tx-swing=110%,de-emphasis=105%,cm-current=120%。对于USB2.0 host0 mode,host1 mode(分别对应PORT0,PORT1)参数默认值为:tx-swing=105%,de-emphasis=105%,cm-current=120%

1.  Sstar-udc {
2.      compatible = "sstar, msb250x-udc";
3.      interrupts = <GIC_SPI INT_IRQ_OTG IRQ_TYPE_LEVEL_HIGH>;
4.      tx-swing,de-emphasis,cm-current = <110>, <105>, <120>
5.      status = "ok";
6.  };
7.  
8.  sstar_u2ph1: u2phy1 {
9.      syscon-utmi = <&usb2phy1_utmi>;
10.     syscon-uhc = <&usb2phy1_uhc>;
11.     syscon-usbc = <&usb2phy1_usbc>;
12.     syscon-bc = <&usb2phy1_bc>;
13.     syscon-utmi2 = <&usb2phy1_utmi2>;
14.     tx-swing,de-emphasis,cm-current = <105>, <105>, <120>;
15.     otp_usb_phy_trim_offset = <0x0 0x44>;
16.     #phy-cells = <0>;
17.     status = "ok";
18. };
19. 
20. sstar_u2ph2: u2phy2 {
21.     syscon-utmi = <&usb2phy2_utmi>;
22.     syscon-uhc = <&usb2phy2_uhc>;
23.     syscon-usbc = <&usb2phy2_usbc>;
24.     syscon-bc = <&usb2phy2_bc>;
25.     tx-swing,de-emphasis,cm-current = <105>, <105>, <120>;
26.     otp_usb_phy_trim_offset = <0x0 0x45>;
27.     #phy-cells = <0>;
28.     status = "ok";
29. };

2.1.2. 通过insmod参数配置涉硬参数

驱动能力调节参数也支持在添加模块KO时通过加参数来配置。对于device和host操作如下所示,注意此方法要求相关模块编译成KO,注意加载顺序,对于host mode参数值会在ehci-hcd.ko起来后设置进去。对于device mode参数值会在udc-msb250x.ko安装时生效。

1.  insmod /config/modules/5.10/udc-msb250x.ko tx_swing=115 dem_cur=105 cm_cur=120
2.  insmod /config/modules/5.10/phy-sstar-u2phy.ko tx_swing=115 dem_cur=105 cm_cur=120

2.1.3. 通过命令行调整Main Current

Main Current总共有8个档位可以调整:80%、88%、90%、95%、100%、105%、110%、115%,默认值为115%。对应的寄存器及设定值为:

Register Name Bank Offset Value
HS_TX_TEST_L[6:4] 0x1421 0x16 0x0 : 100%
0x1 : 105%
0x2 : 110%
0x3 : 115%(default)
0x4 : 80%
0x5 : 85%
0x6 : 90%
0x7 : 95%

命令行调整Main Current方法:

  1. 查看当前TX Swing value命令:从上到下分别对应device、host0、host1 mode命令

    1.  # cat /sys/devices/soc0/soc/soc\:Sstar-udc/tx_swing
    2.  # cat /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.2/tx_swing
    3.  # cat /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.3/tx_swing
    
  2. 设置TX Swing value命令:从上到下分别对应device、host0、host1 mode命令

    1.  # echo value > /sys/devices/soc0/soc/soc\:Sstar-udc/tx_swing
    2.  # echo value > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.2/tx_swing
    3.  # echo value > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.3/tx_swing
    

    其中 value 的值为上表中的对应的值,不包含百分号,如将TX Swing设置为100%,device、host0、host1 mode命令如下: 1. # echo 100 > /sys/devices/soc0/soc/soc\:Sstar-udc/tx_swing 2. # echo 100 > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.2/tx_swing 3. # echo 100 > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.3/tx_swing

2.1.4. 通过命令行调整De-emphasis Current

De-emphasis Current总共有5个档位可以调整,分别为:100%、105%、110%、115%、120%,默认值为105%。对应的寄存器及设定值为:

Register Name Bank Offset Value
HS_TX_TEST_L[9:7] 0x1421 0x16 0x0 : 100%
0x1 : 100%
0x2 : 100%
0x3 : 100%
0x4 : 105%(default)
0x5 : 110%
0x6 : 115%
0x7 : 120%

命令行调整De-emphasis Current方法:

  1. 查看当前De-emphasis Current命令:从上到下分别对应device、host0、host1 mode命令

    1.  # cat /sys/devices/soc0/soc/soc\:Sstar-udc/de_emphasis_current
    2.  # cat /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.2/de_emphasis_current
    3.  # cat /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.3/de_emphasis_current
    
  2. 设置De-emphasis Current命令:从上到下分别对应device、host0、host1 mode命令

    1.  # echo value > /sys/devices/soc0/soc/soc\:Sstar-udc/de_emphasis_current
    2.  # echo value > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.2/de_emphasis_current
    3.  # echo value > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.3/de_emphasis_current
    

    其中 value 的值为上表中的对应的值,不包含百分号,如将De-emphasis Current设置为100%,device、host0、host1 mode命令如下: 1. # echo 100 > /sys/devices/soc0/soc/soc\:Sstar-udc/ de_emphasis_current 2. # echo 100 > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.2/de_emphasis_current 3. # echo 100 > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.3/de_emphasis_current

2.1.5. 通过命令行调整CM Current

CM Current总共有6个档位可以调整,分别为:105%、110%、115%、120%、125%、130%,默认值为110%。对应的寄存器及设定值为:

Register Name Bank Offset Value
HS_TX_TEST_H[5:3] 0x1421 0x17 0x0 : 120%
0x1 : 115%
0x2 : 110%(default)
0x3 : 105%
0x4 : 130%
0x5 : 125%
0x6 : 120%
0x7 : 115%

命令行调整CM Current方法:

  1. 查看当前CM Current命令:从上到下分别对应device、host0、host1 mode命令

    1.  # cat /sys/devices/soc0/soc/soc\:Sstar-udc/cm_current
    2.  # cat /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.2/cm_current
    3.  # cat /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.3/cm_current
    
  2. 设置CM Current命令:从上到下分别对应device、host0、host1 mode命令

    1.  # echo value > /sys/devices/soc0/soc/soc\:Sstar-udc/cm_current
    2.  # echo value > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.2/cm_current
    3.  # echo value > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.3/cm_current
    

    其中 value 的值为上表中的对应的值,不包含百分号,如将CM Current设置为120%,device、host0、host1 mode命令如下: 1. # echo 120 > /sys/devices/soc0/soc/soc\:Sstar-udc/cm_current 2. # echo 120 > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.2/cm_current 3. # echo 120 > /sys/kernel/debug/usb/phy-soc\:sstar-usb2-phy.3/cm_current

2.2. USB 3.0

由于USB 3.0同时包含3.0和2.0信号线,因此分别针对3.0和2.0信号提供了六个驱动能力的参数可以调节。参数对应的register位置如下表所示。注意USB3.0 device mode和host mode都共用一个usb3-phy.ko,因此USB3.0对于驱动能力参数的调整方法不区分device mode和host mode。

Parameter Name Bank Offset Bits
idrv 0x1529 0x41 [7:2]
idem 0x1529 0x41 [13:8]
ibiasi 0x1529 0x26 [3:1]
tx_swing 0x1437 0x16 [6:4]
de_emphasis 0x1437 0x16 [9:7]
cm_current 0x1437 0x17 [5:3]

其中参数idrv、idem以及ibiasi对应3.0信号部分的驱动能力调节,参数tx_swing,de_emphasis,cm_current则对应2.0信号部分的驱动能力调节。USB 3.0信号的驱动能力参数的调整一共有21种组合。具体组合如下表所示:

Index level vppdiff De-emphasis(dB) idrv idem ibiasi
h41[7:2] h40[13:8] h26[3:1]
0 0 0.9 -3.50 101000 001111 110
1 1 1.0 -3.50 101011 010000 110
2 2 1.1 -3.50 101111 010010 110
3 3 1.2 -3.50 110011 010100 110
4 4 1.3 -3.50 110111 010101 111
5 5 1.4 -3.50 111100 010111 111
6 6 1.5 -3.50 111111 011010 111
7 0 0.9 -4.50 100100 011101 110
8 1 1.0 -4.50 101000 100000 110
9 2 1.1 -4.50 101011 100011 110
10 3 1.2 -4.50 101111 100110 110
11 4 1.3 -4.50 110011 101010 111
12 5 1.4 -4.50 110111 101101 111
13 6 1.5 -4.50 111100 110000 111
14 0 0.9 -6.0 100001 010100 110
15 1 1.0 -6.0 100101 010110 110
16 2 1.1 -6.0 101001 011001 110
17 3 1.2 -6.0 101101 011011 110
18 4 1.3 -6.0 110000 011110 111
19 5 1.4 -6.0 110100 100011 111
20 6 1.5 -6.0 101101 100101 111

2.2.1. 通过dts设置默认值

驱动能力调节参数首先在DTS里设置了默认值,如下:

1.  u3phy: usb3-phy {
2.      compatible = "sstar, mercury6p-u3phy";
3.      #address-cells = <1>;
4.      #size-cells = <1>;
5.      ranges;
6.      status = "ok";
7.  
8.      u3phy_utmi: utmi@1f286e00 {
9.          compatible = "sstar, mercury6p-utmi";
10.         reg = <0x1f286e00 0x200>;
11.         clocks = <&usbpll>;
12.         sstar,tx-swing-and-de-emphasis = <0x0>, <0x5>, <0x2>;
13.         #phy-cells = <0>;
14.         status = "ok";
15.     };
16. 
17.     u3phy_pipe: pipe@1f2a5200 {
18.         compatible = "sstar, mercury6p-pipe";
19.         reg = <0x1f2a5200 0x800>;
20.         clocks = <&CLK_ssusb_phy_108>, <&CLK_ssusb_phy_432>;
21.         sstar,otp-syscon = <&otp_syscon>;
22.         sstar,tx-swing-and-de-emphasis = <0x3f>, <0x1a>, <0x07>;
23.         #phy-cells = <0>;
24.         status = "ok";
25.    };
26. };

其中,dts中u3phy_pipe节点的sstar,tx-swing-and-de-emphasis = <0x32>,<0x28>,<0x0d>代表USB3.0信号的参数调节:idrv = 0x32,idem = 0x28,ibiasi = 0x0d。

dts中的u3phy_utmi节点的sstar,tx-swing-and-de-emphasis = <0x03>,<0x07>,<0x02>则对应USB3.0内的2.0信号部分的参数调节:对应为 tx_swing = 0x0,de-emphasis_current = 0x5,cm_current = 0x2。

2.2.2. 通过insmod参数设置

驱动能力调节参数也支持在添加模块KO时通过加参数来配置。操作如下所示,注意此方法要求相关模块编译成KO,注意加载顺序。对于host mode参数值会在sstar-dwc3-of-simple.ko起来后设置进去。

# insmod /config/modules/5.10/usb3-phy.ko tx_idrv=0x37 tx_idem=0x15 tx_biasi=0x7 tx_swing=0x6 dem_cur=0x6 cm_cur=0x2

2.2.3. 通过命令行调整参数

kernel起来后可以通过命令行下执行方式动态调整idrv,idem,ibiasi,tx_swing,de_emphasis,cm_current。

对于USB3.0的信号部分的调整操作如下(注意value为16进制数):

1.  # echo value > /sys/kernel/debug/usb/phy-soc:usb3-phy.3/tx-idrv
2.  # echo value > /sys/kernel/debug/usb/phy-soc:usb3-phy.3/tx-idem
3.  # echo value > /sys/kernel/debug/usb/phy-soc:usb3-phy.3/tx-biasi

对于USB2.0的信号部分的调整操作如下:

1.  # echo value > /sys/kernel/debug/usb/phy-soc:usb3-phy.2/tx_swing
2.  # echo value > /sys/kernel/debug/usb/phy-soc:usb3-phy.2/de_emphasis_current
3.  # echo value > /sys/kernel/debug/usb/phy-soc:usb3-phy.2/cm_current

2.2.4. 通过riu 命令设置参数

Kernel下也可以利用riu_r,riu_w命令直接修改寄存器的方式调节驱动能力:kernel起来后可以通过命令行下执行如下命令进行动态调整,value,bank以及offset设置参考2.2中的表格。

1.  # riu_r bank offset
2.  # riu_w bank offset value

2.3. GMAC

GMAC为1000M Ethernet,目前提供了TX方向的驱动能力调整,涉及的信号包括:

ID Pin Name
0 MDC
1 MDIO
2 RGMII_TX_CLK
3 RGMII_TX_D0
4 RGMII_TX_D1
5 RGMII_TX_D2
6 RGMII_TX_D3
7 RGMII_TX_CTL

GMAC共有16个档位可调:

Level Name Level Value Driving (mA)
Level_0 0 4.4
Level_1 1 6.5
Level_2 2 8.7
Level_3 3 10.9
Level_4 4 13.0
Level_5 5 15.2
Level_6 6 17.4
Level_7 7 19.5
Level_8 8 21.7
Level_9 9 23.9
Level_10 10 26.0
Level_11 11 28.2
Level_12 12 30.3
Level_13 13 32.5
Level_14 14 34.6
Level_15 15 36.8

列出当前各个IO的档位设定:

# cat /proc/gmac_0/driving
gmac0 driving:
MDC = 7
MDIO = 7
RGMII_TX_CLK = 7
RGMII_TX_D0 = 7
RGMII_TX_D1 = 7
RGMII_TX_D2 = 7
RGMII_TX_D3 = 7
RGMII_TX_CTL = 7

调节驱动能力等级:

1.  echo [Pin ID] [Level Value] > /proc/gmac_0/driving
2.  # [Pin ID]:上述的Pin脚ID
3.  # [Level Value]:上述表格中描述的驱动能力等级

以下是一些示例:

4.  # echo 1 6 > /proc/gmac_0/driving  //调整MDIO驱动能力等级为6
5.  # echo 3 9 > /proc/gmac_0/driving  //调整RGMII_TX_D0驱动能力等级为9
6.  # echo 7 15 > /proc/gmac_0/driving //调整RGMII_TX_CTL驱动能力等级为15

上述只以第一个GMAC作为说明,实际上GMAC支持多个网口,若有使用到,则调整驱动能力时把上述的"gmac_0"换成其它的(例如"gmac_1")就可以调整对应的GMAC Driving。

2.4. SATA展频(SSC)

展频(SSC)功能只有一档,无法动态调整。可以通过对应平台DTS文件中,SATA节点中的ssc_mode属性选择开关展频功能,ssc_mode属性支持的值为:

Property Name Value Comment
ssc_mode 0 关闭展频功能(默认)
1 开启展频功能

开启展频功能如下所示:

1.  sata {  
2.      compatible = "sstar,sata", "sstar,sata-ahci";  
3.      reg-names = "ahci", "ahci_port0", "ahci_misc";  
4.      reg = <0x1F346800 0x100>, <0x1F346900 0x100>, <0x1F287400 0x200>;  
5.      interrupts=<GIC_SPI INT_IRQ_SATA IRQ_TYPE_LEVEL_HIGH>;  
6.    clocks = <&CLK_sata_axi>,<&CLK_sata_pm>,<&CLK_sata_phy_108>,<&CLK_sata_phy_432>;  
7.  #ifdef CONFIG_CAM_CLK  
8.      camclk = <CAMCLK_sata_axi CAMCLK_sata_pm CAMCLK_sata_phy_108 CAMCLK_sata_phy_432 >;  
9.  #endif  
10.     phy_mode = <2>;  
11.     phy_setting = <0x4200>;  
12.     ssc_mode = <1>;  
13. };

修改DTS后,需要重新编译替换Kernel Image并重新替换升级至开发板。

2.5. HDMI

HDMI的主要参数:

Property Name Range Comment
Tap1Ch0 0x0-0x3F 参考图示
Tap1Ch1 0x0-0x3F 参考图示
Tap1Ch2 0x0-0x3F 参考图示
Tap1Ch3 0x0-0x3F 参考图示
Tap2Ch0 0x0-0x3F 参考图示
Tap2Ch1 0x0-0x3F 参考图示
Tap2Ch2 0x0-0x3F 参考图示
Tap2Ch3 0x0-0x3F 参考图示
RetrmCh 0x0-0xF 参考图示
PreDrvCh 0x0-0xF 参考图示
MuCh 0x0-0xF 参考图示

调整以上几个参数的命令为:(Tap1Ch0,Tap1Ch1等分别取表格里面对应Range的值)

# echo Tap1Ch0 Tap1Ch1 Tap1Ch2 Tap1Ch3 Tap2Ch0 Tap2Ch1 Tap2Ch2 Tap2Ch3 RetrmCh PreDrvCh MuCh > /sys/class/mstar/mhdmitx/drvcurcfg

查看当前设置的参数命令为:

# cat /sys/class/mstar/mhdmitx/drvcurcfg

3. GPIO驱动能力调整

3.1. 使用背景

由于 Linux GPIO lib 不支持 GPIO 上下拉及驱动能力的接口,所以导致我司的 GPIO Hal 层驱动缺少对 GPIO 上下拉和驱动能力设置的支持。然而在日常使用中,GPIO 的上下拉及驱动能力经常需要动态调整,所以增加上下拉及驱动能力设置 API 和用户层接口变得十分必要。

3.2. 内核接口

3.2.1. MDrv_GPIO_Pull_Up

  • 目的

    开启指定的 GPIO 上拉功能

  • 语法

    U8 MDrv_GPIO_Pull_Up(U8 u8IndexGPIO)
    
  • 参数

    Parameter Commemt
    u8IndexGPIO Gpio num
  • 返回值

    Return Value Commemt
    0 设置成功
    1 引脚不支持上下拉设置或者输入参数错误

3.2.2. MDrv_GPIO_Pull_Down

  • 目的

    开启指定的 GPIO 下拉功能

  • 语法

    U8 MDrv_GPIO_Pull_Down(U8 u8IndexGPIO)
    
  • 参数

    Parameter Commemt
    u8IndexGPIO Gpio num
  • 返回值

    Return Value Commemt
    0 设置成功
    1 引脚不支持上下拉设置或者输入参数错误

3.2.3. MDrv_GPIO_Pull_Off

  • 目的

    关闭指定的 GPIO 上/下拉功能,该 GPIO 切换至悬空态

  • 语法

    U8 MDrv_GPIO_Pull_Off(U8 u8IndexGPIO)
    
  • 参数

    Parameter Commemt
    u8IndexGPIO Gpio num
  • 返回值

    Return Value Commemt
    0 设置成功
    1 引脚不支持上下拉设置或者输入参数错误

3.2.4. MDrv_GPIO_Pull_Status

  • 目的

    获取指定的 GPIO 上/下拉状态

  • 语法

    U8 MDrv_GPIO_Pull_Status(U8 u8IndexGPIO, U8* u8PullStatus)
    
  • 参数

    Parameter Commemt
    u8IndexGPIO Gpio num
    8PullStatus Pull Status
  • 返回值

    Return Value Commemt
    0 获取成功
    1 引脚不支持上下拉设置或者输入参数错误

3.2.5. MDrv_GPIO_Drv_Set

  • 目的

    设置指定的 GPIO 的驱动能力

  • 语法

    U8 MDrv_GPIO_Drv_Set(U8 u8IndexGPIO, U8 u8Level)
    
  • 参数

    Parameter Commemt
    u8IndexGPIO Gpio num
    u8Level 驱动能力等级,目前支持的驱动能力等级如下:
    Value Level
    0 2mA/4mA/8mA
    1 4mA/8mA/12mA
    2 6mA/12mA/15mA
    3 8mA/16mA/18mA
    4 10mA/22mA
    5 12mA/25mA
    6 14mA/28mA
    7 16mA/32mA

  • 返回值

    Return Value Commemt
    0 设置成功
    1 引脚不支持驱动电流设置或者输入参数错误

3.2.6. MDrv_GPIO_Drv_Get

  • 目的

    设置指定的 GPIO 的驱动能力

  • 语法

    U8 MDrv_GPIO_Drv_Get(U8 u8IndexGPIO, U8\* u8Level)
    
  • 参数

    Parameter Commemt
    u8IndexGPIO Gpio num
    u8Level 驱动能力等级,目前支持的驱动能力等级如下:
    Value Level
    0 2mA/4mA/8mA
    1 4mA/8mA/12mA
    2 6mA/12mA/15mA
    3 8mA/16mA/18mA
    4 10mA/22mA
    5 12mA/25mA
    6 14mA/28mA
    7 16mA/32mA

  • 返回值

    Return Value Commemt
    0 获取成功
    1 引脚不支持驱动电流设置或者输入参数错误

3.3. 用户层调试方法

3.3.1. 开启功能

要使用用户层接口需要在Linux kernel的配置打开 CONFIG_MSYS_GPIO选项,该配置位于:

Device Drivers -->
    SStar SoC platform drivers -->
        msys api -->
            support GPIO pull and driving modify

3.3.2. 使用功能

  1. 设置上/下拉之前需要将 GPIO 设置为输入状态,输出状态下上下拉是没办法测量的:

    1.  # cd /sys/class/gpio
    2.  # echo gpio_index > export
    3.  # echo in > gpio gpio_index/direction
    

    查看当前的状态:

    1.  # cd /sys/class/mstar/msys
    2.  # echo gpio_index/gpio_name > gpio_pull
    3.  # cat gpio_pull
    

    设置上拉、下拉或者悬空:

    1.  # cd sys/class/mstar/msys
    2.  # echo gpio_index/gpio_name down/up/off > gpio_pull
    

    查看设置后的状态:

    1.  # cd sys/class/mstar/msys
    2.  # cat gpio_pull
    

    以PAD_UART_TX2为例,设置为输入:

    1.  # cd /sys/class/gpio
    2.  # echo 1 > export
    3.  # echo in > gpio1/direction
    

    查看当前状态:

    1.  # cd sys/class/mstar/msys
    2.  # echo 1 > gpio_pull
    3.  # echo PAD_UART_TX2 > gpio_pull  //the same to above
    4.  # cat gpio_pull
    

    设置为上拉:

    1.  # cd sys/class/mstar/msys
    2.  # echo 1 up > gpio_pull
    3.  # echo PAD_UART_TX2 up > gpio_pull  //the same to above
    

    设置为下拉:

    1.  # cd sys/class/mstar/msys
    2.  # echo 1 down > gpio_pull
    3.  # echo PAD_UART_TX2 down > gpio_pull    //the same to above
    

    设置为悬空:

    1.  # cd sys/class/mstar/msys
    2.  # echo 1 off > gpio_pull
    3.  # echo PAD_UART_TX2 off > gpio_pull //the same to above
    

    查看设置后的状态:

    1.  # cd sys/class/mstar/msys
    2.  # cat gpio_pull
    
  2. 设置驱动能力之前需要将 GPIO 设置为输出高电平状态方便测量:

    1.  # cd /sys/class/gpio
    2.  # echo gpio_index > export
    3.  # echo high > gpio gpio_index/direction
    

    查看当前的驱动能力等级:

    1.  # cd sys/class/mstar/msys
    2.  # echo gpio_index/gpio_name > gpio_drive
    3.  # cat gpio_drive
    

    调节驱动能力:

    1.  # cd sys/class/mstar/msys
    2.  # echo gpio_index/gpio_name level_num > gpio_drive
    

    以PAD_UART_TX2设置为8mA为例:

    1.  # cd /sys/class/gpio
    2.  # echo 1 > export
    3.  # echo high > gpio1 /direction
    4.  # cd sys/class/mstar/msys
    5.  # echo 1 1 > gpio_drive
    6.  # echo PAD_UART_TX2 1 > gpio_drive  //the same to above
    

    每次执行echo指令后,可以通过cat同一个文件确定上一条echo命令的状态。GPIO Index 、GPIO Name和Level_Num可以参考 Software_Padmux_Table.xls

4. SD/EMMC驱动能力配置

4.1. 概述

芯片支持2组mmc设备,分别命名为SD0, FCIE。其中SD0支持SD3.0 spec且支持SD boot, FCIE支持8bit mode且支持EMMC 4/8bit boot。这2组mmc均只有一种padmux mode,具体可参考相关的GPIO PAD配置文档。

4.1.1. SD driving寄存器

SD0使用SD专用PAD,驱动能力由DS2~DS0寄存器的对应bit位构成的DS[2:0] 3个参数共同决定。每个DS寄存器都有bit[8:0]共9个bit,每个bit都对应着SD3.0 PAD组里面的某个pin脚。例如,DS3~D0的bit0组成DS_bit0[3:0]作为控制PAD_SD0_D0的控制参数。

DS寄存器bit SD3.0 PAD pin
bit0 PAD_SD0_D0
bit1 PAD_SD0_D1
bit2 PAD_SD0_D2
bit3 PAD_SD0_D3
bit4 PAD_SD0_CMD
bit5 PAD_SD0_CLK
bit6 PAD_SD0_CDZ
bit7 PAD_SD0_VCTRL
bit8 PAD_SD0_GPIO0
Register Name Bank Offset
DS0 0x1419 0x23
DS1 0x1419 0x24
DS2 0x1419 0x25

如下图,DS_bitx[2:0]一栏表示DS3~DS0对应bit位的值的组合,以二进制形式表示,而括号内的值为对应的十进制形式,后面会直接使用该值设定驱动能力。

DS_bitx[2:0] Driving(mA)
[DS2 DS1 DS0]
000 (0) 2
001 (1) 4
010 (2) 6
011 (3) 8
100 (4) 10
101 (5) 12
110 (6) 14
111 (7) 16

例如:设定DATA0的driving为16mA的寄存器值为:

1.  riu_w 0x1419 0x23 0x1
2.  riu_w 0x1419 0x24 0x1
3.  riu_w 0x1419 0x25 0x1

4.1.2. FCIE driving寄存器

FCIE使用EMMC专用PAD,驱动能力由bank_0x141A offset_0x45 DRV2~DRV0寄存器的对应bit位构成的DRV[2:0] 3个参数共同决定。如下表:

Register Name Bank Offset
DRV0 0x141A 0x45[2:0]
DRV1 0x141A 0x45[6:4]
DRV2 0x141A 0x45[10:8]
Register Name (offset 0x45) DRV_PAD
DATA_DRV CLK_RST_DRV CMD_DS_DRV
DRV0 Bit0 Bit1 Bit2
DRV1 Bit4 Bit5 Bit6
DRV2 Bit8 Bit9 Bit10
DRV[2:0] IOL(mA) IOH(mA)
[DRV2 DRV1 DRV0]
000 (0) 8.18 8.56
001 (1) 11.45 12
010 (2) 14.7 15.4
011 (3) 18 18.83
100 (4) 21.3 22.3
101 (5) 24.5 25.7
110 (6) 27.8 29.1
111 (7) 31.1 32.5

例如:设定所有DATA的driving为32mA的寄存器值为:

# riu_w 0x141A 0x45 0x111

4.2. SD 驱动能力配置

SD driver有提供sysfs控pin脚driving能力,使用方法是:

1.  cd /sys/device/platform/soc/soc:sdmmc
2.  echo [slotNo] <signal> [level] > set_sdmmc_driving_control
3.  # 设置[slotNo]的<signal>信号线的驱动能力为[level]。
4.  # [slotNo] -选择操作的slot。
5.  # <signal> -可以选择设置clk、cmd、data、all或空值(等同all)。
6.  # [level]  -driving能力挡位,取值范围0~15。

将sd slot0的所有信号脚的drving能力设置为7:

1.  cd /sys/device/platform/soc/soc:sdmmc
2.  echo 0 all 7 > set_sdmmc_driving_control

SD driver支持从dts中配置clk,cmd,和data信号线的drving能力,配置方法如下:

1.  sdmmc {
2.      compatible = "sstar, sdmmc";
3.      slotnum = <1>;
4.      …
5.      slot-clk-driving = <7>,<0>,<0>;
6.      slot-cmd-driving = <7>,<0>,<0>;
7.      slot-data-driving = <7>,<0>,<0>;
8.      …
9.  }

如上图,这三项属性参数分别是配置clk线,cmd线和data四根线的driving能力。可以看到每项参数都有三个值,这三个值分别代表每个slot的驱动能力。

4.3. EMMC 驱动能力配置

EMMC driver同样提供了sysfs控pin脚driving能力,位置在:/sys/device/platform/soc/soc:emmc。使用方法是:

1.  echo [slotNo] <signal> [level] > eMMC_driving_control
2.  # 设置[slotNo]的<signal>信号线的驱动能力为[level]。
3.  # [slotNo] -选择操作的slot。
4.  # <signal> -可以选择设置clk、cmd、data、all或空值(等同all)。
5.  # [level]  -driving能力挡位,取值范围0~15。

EMMC driver也同样支持从dts中配置clk,cmd和data信号线的driving能力,配置方法如下:

1.  emmc {
2.      compatible = " sstar_mci ";
3.      slot-num = <1>;
4.      …
5.      clk-driving = <1>,<0>,<0>;
6.      cmd-driving = <1>,<0>,<0>;
7.      data-driving = <1>,<0>,<0>;
8.      …
9.  }

如上图,EMMC的参数解释和SD是一样的。