Potin Lai | 8d5ee80 | 2022-08-09 09:46:48 +0000 | [diff] [blame^] | 1 | #!/bin/bash |
| 2 | |
| 3 | add_i2c_device() |
| 4 | { |
| 5 | local I2C_BUS=$1 |
| 6 | local DEV_ADDR=$2 |
| 7 | local DEVICE_COMP=$3 |
| 8 | local I2C_BUS_DIR="/sys/bus/i2c/devices/i2c-$I2C_BUS" |
| 9 | local NEW_DEVIVE="$I2C_BUS_DIR/new_device" |
| 10 | |
| 11 | echo "$DEVICE_COMP" "$DEV_ADDR" > "$NEW_DEVIVE" |
| 12 | } |
| 13 | |
| 14 | delete_i2c_device() |
| 15 | { |
| 16 | local I2C_BUS=$1 |
| 17 | local DEV_ADDR=$2 |
| 18 | local I2C_BUS_DIR="/sys/bus/i2c/devices/i2c-$I2C_BUS" |
| 19 | local DEL_DEVIVE="$I2C_BUS_DIR/delete_device" |
| 20 | |
| 21 | echo "$DEV_ADDR" > "$DEL_DEVIVE" |
| 22 | } |
| 23 | |
| 24 | is_valid_hdc1080() |
| 25 | { |
| 26 | local I2C_BUS=$1 |
| 27 | local DEV_ADDR=$2 |
| 28 | |
| 29 | MFR_ID=$(i2ctransfer -y -f "${I2C_BUS}" w1@"${DEV_ADDR}" 0xfe r2) |
| 30 | if [ "$MFR_ID" != "0x54 0x49" ]; then |
| 31 | return 1; |
| 32 | fi |
| 33 | |
| 34 | DEV_ID=$(i2ctransfer -y -f "${I2C_BUS}" w1@"${DEV_ADDR}" 0xff r2) |
| 35 | if [ "$DEV_ID" != "0x10 0x50" ]; then |
| 36 | return 1; |
| 37 | fi |
| 38 | |
| 39 | return 0; |
| 40 | } |
| 41 | |
| 42 | |
| 43 | I2C_BUS=10 |
| 44 | DEV_ADDR=0x40 |
| 45 | I2C_BUS_DIR="/sys/bus/i2c/devices/i2c-$I2C_BUS" |
| 46 | DEV_ADDR_HEXSTR="$(printf %04X $DEV_ADDR)" |
| 47 | DEV_DIR="$I2C_BUS_DIR/$I2C_BUS-$DEV_ADDR_HEXSTR" |
| 48 | DEV_NAME_FILE="$DEV_DIR/name" |
| 49 | |
| 50 | # Check chip type |
| 51 | if is_valid_hdc1080 "$I2C_BUS" "$DEV_ADDR"; then |
| 52 | CHIP_TYPE="HDC1080" |
| 53 | DEVICE_COMP="ti,hdc1080" |
| 54 | else |
| 55 | CHIP_TYPE="SI7021" |
| 56 | DEVICE_COMP="silabs,si7020" |
| 57 | fi |
| 58 | |
| 59 | # Check and probe i2c device |
| 60 | if [ ! -f "$DEV_NAME_FILE" ]; then |
| 61 | # i2c device not porbed yet |
| 62 | add_i2c_device "$I2C_BUS" "$DEV_ADDR" "$DEVICE_COMP" |
| 63 | else |
| 64 | DEV_NAME=$(cat "$DEV_NAME_FILE") |
| 65 | if [ "$DEV_NAME" != "$DEVICE_COMP" ]; then |
| 66 | # incorrect driver probed, delete and add again |
| 67 | delete_i2c_device "$I2C_BUS" "$DEV_ADDR" |
| 68 | add_i2c_device "$I2C_BUS" "$DEV_ADDR" "$DEVICE_COMP" |
| 69 | fi |
| 70 | fi |
| 71 | |
| 72 | |
| 73 | VIRT_SNR_CONF="/usr/share/phosphor-virtual-sensor/virtual_sensor_config.json" |
| 74 | HDC1080_VIRT_SNR_CONF="/usr/share/phosphor-virtual-sensor/virtual_sensor_config_hdc1080.json" |
| 75 | SI7021_VIRT_SNR_CONF="/usr/share/phosphor-virtual-sensor/virtual_sensor_config_si7021.json" |
| 76 | |
| 77 | |
| 78 | # Setup virtual_sensor_config.json for phosphor-virtual-sensor |
| 79 | case "$CHIP_TYPE" in |
| 80 | "HDC1080") |
| 81 | REQUIRED_CONF_PATH="$HDC1080_VIRT_SNR_CONF" |
| 82 | ;; |
| 83 | "SI7021") |
| 84 | REQUIRED_CONF_PATH="$SI7021_VIRT_SNR_CONF" |
| 85 | ;; |
| 86 | *) |
| 87 | REQUIRED_CONF_PATH="$HDC1080_VIRT_SNR_CONF" |
| 88 | ;; |
| 89 | esac |
| 90 | |
| 91 | if [ ! -e "$VIRT_SNR_CONF" ]; then |
| 92 | ln -s "$REQUIRED_CONF_PATH" "$VIRT_SNR_CONF" |
| 93 | else |
| 94 | REAL_CONF_PATH="$(realpath $VIRT_SNR_CONF)" |
| 95 | if [ "$REAL_CONF_PATH" != "$REQUIRED_CONF_PATH" ]; then |
| 96 | rm "$VIRT_SNR_CONF" |
| 97 | ln -s "$REQUIRED_CONF_PATH" "$VIRT_SNR_CONF" |
| 98 | fi |
| 99 | fi |