| #!/bin/bash |
| # ######################################################### |
| # Script to run on witherspoon BMC to read/set vrm voltages |
| |
| |
| # ######################################################### |
| d2v () { |
| # usage: d2v <decimal volts> |
| |
| echo $1 | awk '{print $1 * 256 + .5}' | cut -d '.' -f 1 |
| } |
| |
| |
| # ######################################################### |
| v2d () { |
| # usage: v2d <hex val> |
| |
| printf " %0.3fV" `echo $1 | awk '{print $1 / 256}'` |
| } |
| |
| |
| # ######################################################### |
| i2d () { |
| # usage: i2d <hex val> <current divisor> |
| |
| # parse current mantisa and exponent |
| # format: SEEE ESMM MMMM MMMM |
| let e=$1/0x800 |
| let esign=e/0x10 |
| let m=$1\&0x07FF |
| let msign=m/0x0400 |
| |
| if [ $msign -eq 1 ] |
| then |
| # calc ones compliment |
| let m=($m^0x07FF)+1 |
| m="-$m" |
| fi |
| if [ $esign -eq 1 ] |
| then |
| # calc ones compliment |
| let e=(e^0x1F)+1 |
| e="-$e" |
| fi |
| printf " %0.3fA\n" `echo $m $e $2 | awk '{print ($1 * 2^$2) / $3}'` |
| } |
| |
| |
| # ######################################################### |
| rw_vc () { |
| # usage: rw_vc <bus> <addr> <current divisor> <channel> <value> |
| |
| # select channel |
| if [ $4 != "x" ] |
| then |
| i2cset -y $1 $2 0 $4 b |
| fi |
| |
| # write new voltage set point |
| if [ ! -e $5 ] |
| then |
| i2cset -y $1 $2 0x21 `d2v $5` w |
| fi |
| |
| # print voltage set point |
| v2d `i2cget -y $1 $2 0x21 w` |
| |
| # print voltage |
| v2d `i2cget -y $1 $2 0x8B w` |
| |
| # print current |
| i2d `i2cget -y $1 $2 0x8C w` $3 |
| |
| # default back to channel 0 |
| if [ $4 != "x" ] |
| then |
| i2cset -y $1 $2 0 0 b |
| fi |
| } |
| |
| |
| # ######################################################### |
| # Main |
| |
| if [ -e $1 ] |
| then |
| $0 vdda vcsa vdna vioa vddra vppa vddb vcsb vdnb viob vddrb vppb |
| exit |
| fi |
| |
| if [ $1 == "-h" ] |
| then |
| echo " Usage: vrm [<rail>=[value] [<rail>=[value]] ...]" |
| echo " rail: vdda vcsa vdna vioa vddra vppa vddb vcsb vdnb viob vddrb vppb vdnd viod" |
| echo " value: volts" |
| echo |
| echo " e.g., vrm vioa=1.0 viob=1.0" |
| echo |
| exit |
| fi |
| |
| echo "rail set read current" |
| echo "------- ------- ------- -------" |
| for param in ${@:1} |
| do |
| rail=`echo $param | cut -d'=' -f 1` |
| val=`echo ${param}= | cut -d'=' -f 2` |
| echo -n "$rail" |
| case "$rail" in |
| vdda) |
| rw_vc 4 0x70 2 0 $val |
| ;; |
| vddb) |
| rw_vc 5 0x70 2 0 $val |
| ;; |
| vcsa) |
| rw_vc 4 0x70 4 1 $val |
| ;; |
| vcsb) |
| rw_vc 5 0x70 4 1 $val |
| ;; |
| vdna) |
| rw_vc 4 0x71 2 0 $val |
| ;; |
| vdnb) |
| rw_vc 5 0x71 2 0 $val |
| ;; |
| vioa) |
| rw_vc 4 0x40 2 x $val |
| ;; |
| viob) |
| rw_vc 5 0x40 2 x $val |
| ;; |
| vddra) |
| rw_vc 4 0x71 2 1 $val |
| ;; |
| vddrb) |
| rw_vc 5 0x71 2 1 $val |
| ;; |
| vppa) |
| rw_vc 12 0x41 2 x $val |
| ;; |
| vppb) |
| rw_vc 13 0x41 2 x $val |
| ;; |
| vdnd) |
| rw_vc 2 0x70 2 0 $val |
| ;; |
| viod) |
| rw_vc 2 0x70 2 1 $val |
| ;; |
| *) |
| echo " non-existant" |
| esac |
| done |