1#!/bin/bash 2 3get_gpio() 4{ 5 local NET_NAME=$1 6 local RET_VAL 7 8 mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME") 9 if [ "${#GPIO_INFO[@]}" -ne 2 ]; then 10 echo "get_gpio: can not find gpio, $NET_NAME" >&2 11 return 1 12 fi 13 for _ in {1..10} 14 do 15 if ! RET_VAL=$(gpioget "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}") ; then 16 usleep 10000 17 continue 18 else 19 echo "${RET_VAL}" 20 return 0 21 fi 22 done 23 24 echo "get_gpio: get ${NET_NAME} failed" >&2 25 return 1 26} 27 28set_gpio() 29{ 30 local NET_NAME=$1 31 local OUT_VAL=$2 32 mapfile -t -d " " GPIO_INFO < <(gpiofind "$NET_NAME") 33 if [ "${#GPIO_INFO[@]}" -ne 2 ]; then 34 echo "set_gpio: can not find gpio, $NET_NAME" 35 return 1 36 fi 37 38 echo -n "set_gpio: set $NET_NAME = $OUT_VAL" 39 if ! gpioset "${GPIO_INFO[0]}" "${GPIO_INFO[1]%$'\n'}"="$OUT_VAL"; then 40 echo " failed" 41 return 1 42 fi 43 44 echo " success" 45 return 0 46} 47 48bind_i2c_device() 49{ 50 local DRIVER_NAME="$1" 51 local DEV_BUS_ADDR="$2" 52 local DRIVER_DIR_PATH="/sys/bus/i2c/drivers/${DRIVER_NAME}" 53 local DRIVER_BIND_PATH="${DRIVER_DIR_PATH}/bind" 54 local MAX_RETRIES=1 55 local RETRY=0 56 57 if [ -n "$3" ]; then 58 MAX_RETRIES="$3" 59 fi 60 61 if [ -L "${DRIVER_DIR_PATH}/${DEV_BUS_ADDR}" ]; then 62 return 0 63 fi 64 65 while [ "$RETRY" -lt "$MAX_RETRIES" ] 66 do 67 if echo "${DEV_BUS_ADDR}" > "${DRIVER_BIND_PATH}"; then 68 echo "bind_i2c_device: $DRIVER_NAME, $DEV_BUS_ADDR successful" 69 return 0 70 fi 71 72 RETRY=$((RETRY + 1)) 73 echo "bind_i2c_device: $DRIVER_NAME, $DEV_BUS_ADDR failed" 74 usleep 50000 75 done 76 77 return 1 78} 79 80if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then 81 CMD=$1 82 shift 83 case "$CMD" in 84 get_gpio) 85 get_gpio "$@" 86 ;; 87 set_gpio) 88 set_gpio "$@" 89 ;; 90 bind_i2c_device) 91 bind_i2c_device "$@" 92 ;; 93 *) 94 echo "Usage: $0 {get_gpio|set_gpio|bind_i2c_device} args..." 95 exit 1 96 ;; 97 esac 98fi 99