1#!/bin/bash
2# #########################################################
3# Script to run on Romulus BMC to read/set vrm voltages
4
5
6# #########################################################
7function d2v() {
8    # usage:   d2v <decimal volts>
9
10    echo "$1" | awk '{print $1 * 256 + .5}' | cut -d '.' -f 1
11}
12
13
14# #########################################################
15function v2d() {
16    # usage:   v2d <hex val>
17
18    printf "	%0.3fV" "$(echo "$1" | awk '{print $1 / 256}')"
19}
20
21
22# #########################################################
23function i2d() {
24    # usage:  i2d <hex val> <current divisor>
25
26    # parse current mantisa and exponent
27    # format: SEEE ESMM MMMM MMMM
28    e=$(( $1/0x800 ))
29    esign=$(( e/0x10 ))
30    m=$(( $1 & 0x07FF ))
31    msign=$(( m/0x0400 ))
32
33    if [ $msign -eq 1 ]
34    then
35        # calc ones compliment
36        m=$(( (m^0x07FF)+1 ))
37        m=$(( -m ))
38    fi
39    if [ $esign -eq 1 ]
40    then
41        # calc ones compliment
42        e=$(( (e^0x1F)+1 ))
43        e=$(( -e ))
44    fi
45    printf "	%0.3fA\n" "$(echo $m $e "$2" | awk '{print ($1 * 2^$2) / $3}')"
46}
47
48
49# #########################################################
50function rw_vc() {
51    # usage:   rw_vc <bus> <addr> <current divisor> <channel> <value>
52
53    # select channel
54    if [ "$4" != "x" ]
55    then
56        i2cset -y "$1" "$2" 0 "$4" b
57    fi
58
59    # write new voltage set point
60    if [ ! -e "$5" ]
61    then
62        i2cset -y "$1" "$2" 0x21 "$(d2v "$5")" w
63    fi
64
65    # print voltage set point
66    v2d "$(i2cget -y "$1" "$2" 0x21 w)"
67
68    # print voltage
69    v2d "$(i2cget -y "$1" "$2" 0x8B w)"
70
71    # print current
72    i2d "$(i2cget -y "$1" "$2" 0x8C w)" "$3"
73
74    # default back to channel 0
75    if [ "$4" != "x" ]
76    then
77        i2cset -y "$1" "$2" 0 0 b
78    fi
79}
80
81
82# #########################################################
83# Main
84
85if [ -e "$1" ]
86then
87    $0 vdda vcsa vdna vioa vddb vcsb vdnb viob
88    exit
89fi
90
91if [ "$1" == "-h" ]
92then
93    echo "  Usage: vrm [<rail>=[value] [<rail>=[value]] ...]"
94    echo "    rail: vdda vcsa vdna vioa vddb vcsb vdnb viob"
95    echo "    value: volts"
96    echo
97    echo "    e.g., vrm vioa=1.0 viob=1.0"
98    echo
99    exit
100fi
101
102echo "rail	set	read	current"
103echo "-------	------- ------- -------"
104for param in "${@:1}"
105do
106    rail=$(echo "$param" | cut -d'=' -f 1)
107    val=$(echo "${param}=" | cut -d'=' -f 2)
108    echo -n "$rail"
109    case "$rail" in
110        vdda)
111            rw_vc 4 0x70 2 0 "$val"
112            ;;
113        vddb)
114            rw_vc 5 0x70 2 0 "$val"
115            ;;
116        vcsa)
117            rw_vc 4 0x70 4 1 "$val"
118            ;;
119        vcsb)
120            rw_vc 5 0x70 4 1 "$val"
121            ;;
122        vdna)
123            rw_vc 4 0x73 2 0 "$val"
124            ;;
125        vdnb)
126            rw_vc 5 0x73 2 0 "$val"
127            ;;
128        vioa)
129            rw_vc 4 0x73 2 1 "$val"
130            ;;
131        viob)
132            rw_vc 5 0x73 2 1 "$val"
133            ;;
134        *)
135            echo "	non-existant"
136    esac
137done
138