diff --git a/general/overlay/usr/sbin/gpio b/general/overlay/usr/sbin/gpio
new file mode 100755
index 00000000..d3082f86
--- /dev/null
+++ b/general/overlay/usr/sbin/gpio
@@ -0,0 +1,107 @@
+#!/bin/sh
+
+soc=$(fw_printenv -n soc) || (>&2 echo "SOC not defined in U-Boot ENV"; exit 1)
+vendor=$(fw_printenv -n vendor) || (>&2 echo "Vendor not defined in U-Boot ENV"; exit 1)
+# devid=$(fw_printenv -n devid) || (>&2 echo "SOC not defined in U-Boot ENV"; exit 1)
+
+case ${vendor} in
+  anjoy)
+    case ${soc} in
+      ssc335|ssc337|ssc337de)
+      gpio="ircut1=78 ircut2=79 light=61"
+      ;;
+    esac
+    ;;
+  camhi|xin)
+    case ${soc} in
+      hi3516ev200|gk7205v200)
+        gpio="usb_ena=-9"
+        ;;
+      hi3516ev300|gk7205v300)
+        gpio="ircut1=10 ircut2=11 usb_ena=-7"
+        ;;
+      hi3518ev200)
+        gpio="ircut1=1 ircut2=2 light=48"
+        ;;
+    esac
+    ;;
+  herospeed|longsee|cantonk)
+    case ${soc} in
+      hi3516ev200|gk7205v200)
+        gpio="ircut1=12 ircut2=13 irctl=4 alm_in=15 alm_out=14"
+        ;;
+      hi3518ev200)
+        gpio="ircut1=64 ircut2=65"
+        ;;
+      hi3516av300)
+        gpio="ircut1=5 ircut2=6"
+        ;;
+    esac
+    ;;
+  jabsco)
+    case ${soc} in
+      hi3516ev200|gk7205v200)
+        gpio="ircut1=52 ircut2=53 irstatus=9"
+        ;;
+    esac
+    ;;
+  jvt)
+    case ${soc} in
+      hi3516cv200)
+        gpio="ircut1=64 ircut2=65 light=62"
+        ;;
+      hi3518ev200)
+        gpio="ircut1=64 ircut2=65 light=47"
+        ;;
+    esac
+    ;;
+  juan|sannce)
+    case ${soc} in
+      hi3518ev200)
+        gpio="ircut1=65 ircut2=64 irstatus=-62"
+        ;;
+    esac
+    ;;
+  tiandy)
+    case ${soc} in
+      hi3518ev200)
+        gpio="ircut1=78 ircut2=79 irctl=37"
+        ;;
+    esac
+    ;;
+  uniview)
+    case ${soc} in
+      hi3516ev300|gk7205v300)
+        gpio="ircut1=63 ircut2=67 reset="
+        ;;
+    esac
+    ;;
+  xm)
+    case ${soc} in
+      hi3516ev200|gk7205v200)
+        gpio="ircut1=8 ircut=29 irstatus=15 irctl=16 alm_in=4,53 alm_out=55 eth_act=14 eth_sta=12 reset=0"
+        ;;
+      hi3516ev300|gk7205v300)
+        gpio="ircut1=10 ircut2=11 irstatus=66 irctl=52 alm_in=4,67 alm_out=65 eth_act=30 eth_sta=31 reset=0"
+        ;;
+      hi3516dv100)
+        gpio="ircut1=14 ircut2=15"
+        ;;
+      hi3516cv300)
+        gpio="ircut1=53 ircut2=54 irstatus=64 irctl=66 alm_in=55 alm_out=1 reset=2 usb_ena=63"
+        ;;
+      hi3518ev200)
+        gpio="ircut1=33 ircut2=34 alm_in=61 alm_out=35"
+        ;;
+    esac
+    ;;
+  zenotech|videopark)
+    case ${soc} in
+      hi3516ev300|gk7205v300)
+        gpio="ircut1=40 ircut2=41 irctl=65"
+        ;;
+    esac
+    ;;
+esac
+
+echo ${gpio}