meta-bletchley: introduce board-type-checker-fpb service

Add board-type-checker-fpb service for checking the board type
(main or 2nd source) of front panel board.
Base on the board type result, this service help probing i2c device
with compatable driver and creating a softlink to link virtual sensor
configuration to corresponding json file.

This commit require a kernel patch to remove hdc1080 node from
devicetree.

Signed-off-by: Potin Lai <potin.lai@quantatw.com>
Change-Id: I2b9aabb41c9749f525fe5444fb519871f0a7796d
diff --git a/meta-facebook/meta-bletchley/recipes-bletchley/board-type-checker/board-type-checker.bb b/meta-facebook/meta-bletchley/recipes-bletchley/board-type-checker/board-type-checker.bb
new file mode 100644
index 0000000..a75f6e7
--- /dev/null
+++ b/meta-facebook/meta-bletchley/recipes-bletchley/board-type-checker/board-type-checker.bb
@@ -0,0 +1,21 @@
+SUMMARY = "Bletchley board type checker"
+DESCRIPTION = "Bletchley board type checker to probe i2c device with correct driver in user-space"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit allarch systemd obmc-phosphor-systemd
+
+RDEPENDS:${PN} += " bash i2c-tools"
+
+SRC_URI = " file://board-type-checker-fpb \
+            file://board-type-checker-fpb.service \
+          "
+
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_SERVICE:${PN}:append = " board-type-checker-fpb.service"
+
+do_install() {
+    install -d ${D}${libexecdir}
+    install -m 0755 ${WORKDIR}/board-type-checker-fpb ${D}${libexecdir}/
+}
diff --git a/meta-facebook/meta-bletchley/recipes-bletchley/board-type-checker/files/board-type-checker-fpb b/meta-facebook/meta-bletchley/recipes-bletchley/board-type-checker/files/board-type-checker-fpb
new file mode 100644
index 0000000..3bd100f
--- /dev/null
+++ b/meta-facebook/meta-bletchley/recipes-bletchley/board-type-checker/files/board-type-checker-fpb
@@ -0,0 +1,99 @@
+#!/bin/bash
+
+add_i2c_device()
+{
+    local I2C_BUS=$1
+    local DEV_ADDR=$2
+    local DEVICE_COMP=$3
+    local I2C_BUS_DIR="/sys/bus/i2c/devices/i2c-$I2C_BUS"
+    local NEW_DEVIVE="$I2C_BUS_DIR/new_device"
+
+    echo "$DEVICE_COMP" "$DEV_ADDR" > "$NEW_DEVIVE"
+}
+
+delete_i2c_device()
+{
+    local I2C_BUS=$1
+    local DEV_ADDR=$2
+    local I2C_BUS_DIR="/sys/bus/i2c/devices/i2c-$I2C_BUS"
+    local DEL_DEVIVE="$I2C_BUS_DIR/delete_device"
+
+    echo "$DEV_ADDR" > "$DEL_DEVIVE"
+}
+
+is_valid_hdc1080()
+{
+    local I2C_BUS=$1
+    local DEV_ADDR=$2
+
+    MFR_ID=$(i2ctransfer -y -f "${I2C_BUS}" w1@"${DEV_ADDR}" 0xfe r2)
+    if [ "$MFR_ID" != "0x54 0x49" ]; then
+        return 1;
+    fi
+
+    DEV_ID=$(i2ctransfer -y -f "${I2C_BUS}" w1@"${DEV_ADDR}" 0xff r2)
+    if [ "$DEV_ID" != "0x10 0x50" ]; then
+        return 1;
+    fi
+
+    return 0;
+}
+
+
+I2C_BUS=10
+DEV_ADDR=0x40
+I2C_BUS_DIR="/sys/bus/i2c/devices/i2c-$I2C_BUS"
+DEV_ADDR_HEXSTR="$(printf %04X $DEV_ADDR)"
+DEV_DIR="$I2C_BUS_DIR/$I2C_BUS-$DEV_ADDR_HEXSTR"
+DEV_NAME_FILE="$DEV_DIR/name"
+
+# Check chip type
+if is_valid_hdc1080 "$I2C_BUS" "$DEV_ADDR"; then
+    CHIP_TYPE="HDC1080"
+    DEVICE_COMP="ti,hdc1080"
+else
+    CHIP_TYPE="SI7021"
+    DEVICE_COMP="silabs,si7020"
+fi
+
+# Check and probe i2c device
+if [ ! -f "$DEV_NAME_FILE" ]; then
+    # i2c device not porbed yet
+    add_i2c_device "$I2C_BUS" "$DEV_ADDR" "$DEVICE_COMP"
+else
+    DEV_NAME=$(cat "$DEV_NAME_FILE")
+    if [ "$DEV_NAME" != "$DEVICE_COMP" ]; then
+        # incorrect driver probed, delete and add again
+        delete_i2c_device "$I2C_BUS" "$DEV_ADDR"
+        add_i2c_device "$I2C_BUS" "$DEV_ADDR" "$DEVICE_COMP"
+    fi
+fi
+
+
+VIRT_SNR_CONF="/usr/share/phosphor-virtual-sensor/virtual_sensor_config.json"
+HDC1080_VIRT_SNR_CONF="/usr/share/phosphor-virtual-sensor/virtual_sensor_config_hdc1080.json"
+SI7021_VIRT_SNR_CONF="/usr/share/phosphor-virtual-sensor/virtual_sensor_config_si7021.json"
+
+
+# Setup virtual_sensor_config.json for phosphor-virtual-sensor
+case "$CHIP_TYPE" in
+"HDC1080")
+    REQUIRED_CONF_PATH="$HDC1080_VIRT_SNR_CONF"
+    ;;
+"SI7021")
+    REQUIRED_CONF_PATH="$SI7021_VIRT_SNR_CONF"
+    ;;
+*)
+    REQUIRED_CONF_PATH="$HDC1080_VIRT_SNR_CONF"
+    ;;
+esac
+
+if [ ! -e "$VIRT_SNR_CONF" ]; then
+    ln -s "$REQUIRED_CONF_PATH" "$VIRT_SNR_CONF"
+else
+    REAL_CONF_PATH="$(realpath $VIRT_SNR_CONF)"
+    if [ "$REAL_CONF_PATH" != "$REQUIRED_CONF_PATH" ]; then
+        rm "$VIRT_SNR_CONF"
+        ln -s "$REQUIRED_CONF_PATH" "$VIRT_SNR_CONF"
+    fi
+fi
diff --git a/meta-facebook/meta-bletchley/recipes-bletchley/board-type-checker/files/board-type-checker-fpb.service b/meta-facebook/meta-bletchley/recipes-bletchley/board-type-checker/files/board-type-checker-fpb.service
new file mode 100644
index 0000000..531aed3
--- /dev/null
+++ b/meta-facebook/meta-bletchley/recipes-bletchley/board-type-checker/files/board-type-checker-fpb.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Front Panel Board Checker
+StartLimitIntervalSec=90
+StartLimitBurst=5
+Before=phosphor-virtual-sensor.service
+Before=xyz.openbmc_project.EntityManager.service
+
+[Service]
+ExecStart=/usr/libexec/board-type-checker-fpb
+SyslogIdentifier=Front Panel Board Checker
+Type=oneshot
+RemainAfterExit=yes
+Restart=on-failure
+RestartSec=1
+
+[Install]
+WantedBy=multi-user.target
\ No newline at end of file
diff --git a/meta-facebook/meta-bletchley/recipes-phosphor/images/fb-bletchley-phosphor-image.inc b/meta-facebook/meta-bletchley/recipes-phosphor/images/fb-bletchley-phosphor-image.inc
index 8a51904..c359c5b 100644
--- a/meta-facebook/meta-bletchley/recipes-phosphor/images/fb-bletchley-phosphor-image.inc
+++ b/meta-facebook/meta-bletchley/recipes-phosphor/images/fb-bletchley-phosphor-image.inc
@@ -11,4 +11,5 @@
     detect-sled-present \
     phosphor-ipmi-ipmb \
     fb-ipmi-oem \
+    board-type-checker \
 "