#!/bin/bash # ######################################################### # Script to run on witherspoon BMC to read/set vrm voltages # ######################################################### d2v () { # usage: d2v echo $1 | awk '{print $1 * 256 + .5}' | cut -d '.' -f 1 } # ######################################################### v2d () { # usage: v2d printf " %0.3fV" `echo $1 | awk '{print $1 / 256}'` } # ######################################################### i2d () { # usage: i2d # 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)}'` } # ######################################################### rw_vc () { # usage: rw_vc # 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 [=[value] [=[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