summaryrefslogtreecommitdiff
path: root/recipes-bsp/multitech/mt-dt-overlay/init
blob: 4c82e120bcf8cad9864c5e9e5337f0fbb41d8763 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/bash
# This script must be run after mts-io
# to read the hw-version,
# but before anything else needs the
# device tree.
sysdir=/sys/devices/platform/mts-io

I2CDIR="/sys/bus/i2c/devices"
eepromPath="${I2CDIR}/0-0056/eeprom"

DEVTREE="/sys/kernel/config/device-tree/overlays/"
SYSFS="/usr/sbin/mts-io-sysfs"
AP1_EEPROM=${I2CDIR}"/1-0050/eeprom"
AP2_EEPROM=${I2CDIR}"/1-0052/eeprom"

install_all_dtbo() {
    for f in *.dtbo ; do
        if ! [[ -f $f ]] ; then
            continue
        fi
        # f2 is the extracted device name
        base=$(basename $f .dtbo)
        /bin/mkdir ${DEVTREE}/$base || true
        /bin/cat $f >${DEVTREE}/$base/dtbo
    done
}

install_dtbo_dir() {
    if ! [[ -d ${DEVTREE} ]] ; then
        mount configfs
    fi
    install_all_dtbo
    gpiob1=0
    gpiob2=0
    if [[ -f $AP1_EEPROM ]] ; then
	eeprom1=$(mts-id-eeprom --accessory-card --in-file "$AP1_EEPROM" 2>/dev/null)
	if [[ $eeprom1 =~ [[:space:]]hw-version:[[:space:]]*\"MTAC-GPIOB- ]] ; then
	   gpiob1=1
	fi
    fi
    if [[ -f $AP2_EEPROM ]] ; then
	eeprom2=$(mts-id-eeprom --accessory-card --in-file "$AP2_EEPROM" 2>/dev/null)
	if [[ $eeprom2 =~ [[:space:]]hw-version:[[:space:]]*\"MTAC-GPIOB- ]] ; then
	   gpiob2=1
	fi
    fi

    if ((gpiob1 == 1)) || ((gpiob2 == 1)) ; then
        /usr/bin/logger -t "mts-io" -p daemon.info -s 'Loading MTAC-GPIOB Device Tree'
        cd gpiob
    else
        /usr/bin/logger -t "mts-io" -p daemon.info -s 'Loading standard SPI Device Tree'
        cd lora
    fi
    install_all_dtbo
}

# Device tree format:
# [mach]
#     [rev]
#          [file1] [file2] [file3] capability
#              [flag]
#                  [file1] [file2] [file3]
setdevtree() {
    eeprom=$(mts-id-eeprom --in-file "$eepromPath" 2>/dev/null)
    [[ $eeprom =~ [[:space:]]hw-version:[[:space:]]*\"([^\"]+) ]]
    hw=${BASH_REMATCH[1]}
    mach=${hw/%-*}
    rev=${hw/#*-/}
    echo mach is $mach
    echo rev is $rev

    regx='capa-(.*):[[:space:]]*true'
    capflags=$(echo "$eeprom" | egrep "$regx" | sed -e 's/capa-//g' -e 's/: true//')
    capflags=" ${capflags} "

    # add device tree overlays, if they exist.
    [[ -d /lib/dtoverlays ]] || return 1
    (
    cd /lib/dtoverlays
    
    cd ${mach}
    
    best="-1"
    for d in * ; do
        if awk "BEGIN{if ($d <= $rev)exit 1}" ; then
            continue
        fi
        if awk "BEGIN{if ($d < $best)exit 1}" ; then
            best="$d"
        fi
    done
    if [[ $best == -1 ]] ; then
        # No overlay found
    exit 0
    fi
    cd $best
    install_dtbo_dir
    if [[ -d capability ]] ; then
        cd capability
        for d in * ; do
            echo "We have found overlay capability directory $d"
            if [[ ${capflags} =~ [[:space:]]${d}[[:space:]] ]] ; then
                echo "This device has capabilithy $d so install the overlay"
                (
                    cd $d
                    install_dtbo_dir
                )
            fi # Does a given capability flag exist in the EEPROM
        done # Loop over all capabilities for this machine and version overlays
    fi # Is there a capability directory to be installed?
    )
}

case $1 in
  start)
    /usr/bin/logger -t "mts-io" -p daemon.info -s "Loading device tree overlay"
    setdevtree
    ;;

  stop)
    echo "Not implemented"
    ;;

  *)
    echo "Usage: $0 {start|stop}"
    exit 2
    ;;
esac