Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 3 | export U2_PRESENT=( 148 149 150 151 152 153 154 155 ) |
| 4 | export POWER_U2=( 195 196 202 199 198 197 127 126 ) |
| 5 | export PWRGD_U2=( 161 162 163 164 165 166 167 168 ) |
| 6 | export RST_BMC_U2=( 72 73 74 75 76 77 78 79 ) |
| 7 | export PLUGGED=0 |
| 8 | export I2C_BUS=8 |
| 9 | export CHIP_ADDR=0x68 |
| 10 | export CLOCK_GEN_VALUE= |
| 11 | |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 12 | CLOCK_GEN_VALUE=$(i2cget -y $I2C_BUS $CHIP_ADDR 0 i 2|cut -f3 -d' ') |
| 13 | |
| 14 | function set_gpio_direction() |
| 15 | { |
| 16 | #$1 gpio pin, $2 'in','high','low' |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 17 | echo "$2" > "/sys/class/gpio/gpio$1/direction" |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 18 | } |
| 19 | |
| 20 | function read_gpio_input() |
| 21 | { |
| 22 | #$1 read input gpio pin |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 23 | cat "/sys/class/gpio/gpio$1/value" |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 24 | } |
| 25 | |
| 26 | function enable_nvme_power() |
| 27 | { |
| 28 | set_gpio_direction "${POWER_U2[$1]}" "high" |
| 29 | sleep 0.04 |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 30 | check_powergood "$1" |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 31 | } |
| 32 | |
| 33 | function check_powergood() |
| 34 | { |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 35 | if [ "$(read_gpio_input "${PWRGD_U2[$1]}")" == 1 ];then |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 36 | sleep 0.005 |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 37 | update_clock_gen_chip_register "$1" 1 |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 38 | sleep 0.1 |
| 39 | set_gpio_direction "${RST_BMC_U2[$1]}" "high" |
| 40 | else |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 41 | disable_nvme_power "$1" |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 42 | fi |
| 43 | } |
| 44 | |
| 45 | function disable_nvme_power() |
| 46 | { |
| 47 | set_gpio_direction "${RST_BMC_U2[$1]}" "low" |
| 48 | sleep 0.1 |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 49 | update_clock_gen_chip_register "$1" 0 |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 50 | sleep 0.005 |
| 51 | set_gpio_direction "${POWER_U2[$1]}" "low" |
| 52 | } |
| 53 | |
| 54 | function update_clock_gen_chip_register(){ |
| 55 | #$1 nvme slot number, $2 enable/disable |
| 56 | update_value=$(printf '%x\n' "$((0x01 <<$1))") |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 57 | if [ "$2" -eq 1 ];then |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 58 | CLOCK_GEN_VALUE=$(printf '0x%x\n' \ |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 59 | "$((CLOCK_GEN_VALUE | 0x$update_value))") |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 60 | else |
| 61 | CLOCK_GEN_VALUE=$(printf '0x%x\n' \ |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 62 | "$((CLOCK_GEN_VALUE & ~0x$update_value))") |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 63 | fi |
Patrick Williams | 8c22623 | 2023-04-15 20:05:21 -0500 | [diff] [blame^] | 64 | i2cset -y $I2C_BUS $CHIP_ADDR 0 "$CLOCK_GEN_VALUE" s |
Samuel Jiang | 9a39379 | 2019-05-23 14:59:35 +0800 | [diff] [blame] | 65 | } |