diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/S40network b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/S40network new file mode 100755 index 0000000..0c01cfb --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/S40network @@ -0,0 +1,19 @@ +#!/bin/sh + +start() { + echo "Starting network..." + ifup lo + modprobe 8812eu rtw_tx_pwr_by_rate=0 rtw_tx_pwr_lmt_enable=0 +} + +stop() { + ifdown lo + ifdown -f wlan0 + ifdown -f eth0 +} + +case "$1" in + start|stop) "$1" ;; + restart|reload) stop; start ;; + *) echo "Usage: $0 {start|stop|restart|reload}"; exit 1 ;; +esac diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/S41mgmt-net b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/S41mgmt-net new file mode 100755 index 0000000..793f062 --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/S41mgmt-net @@ -0,0 +1,29 @@ +#!/bin/sh + +case "$1" in + start) + ifdown eth0 2>/dev/null || true + ifup eth0 + sleep 5 + /usr/bin/mgmt-net --force + + if [ -r /run/mgmt-netd.pid ] && + kill -0 "$(cat /run/mgmt-netd.pid)" 2>/dev/null; then + exit 0 + fi + + ( + while :; do + /usr/bin/mgmt-net + sleep 2 + done + ) & + echo $! >/run/mgmt-netd.pid + ;; + + stop) + [ -r /run/mgmt-netd.pid ] && + kill "$(cat /run/mgmt-netd.pid)" 2>/dev/null || true + rm -f /run/mgmt-netd.pid /run/mgmt-net.state + ;; +esac diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/S97link-monitor b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/S97link-monitor new file mode 100755 index 0000000..0d47043 --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/S97link-monitor @@ -0,0 +1,28 @@ +#!/bin/sh + +case "$1" in + start) + pidof wfb_tx wfb_rx wfb_tun wifilink >/dev/null && exit 0 + pidof msposd >/dev/null && exit 0 + + size=$(curl -s localhost/api/v1/config.json | \ + jsonfilter -qe "@.video0.size") + size="${size:-1280x720}" + + msposd \ + -b 115200 \ + -c 8 \ + -c 6 \ + -p 500 \ + -w 1000 \ + -r 20 \ + -m /dev/ttyS2 \ + -o 127.0.0.1:14551 \ + -z "$size" \ + >/tmp/msposd-management.log 2>&1 & + ;; + + *) + exit 0 + ;; +esac diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/wifibroadcast b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/wifibroadcast new file mode 100755 index 0000000..3ee64ef --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/init.d/wifibroadcast @@ -0,0 +1,18 @@ +#!/bin/sh + +case "$1" in + start) + echo "Starting wifibroadcast..." + wifibroadcast start + ;; + + stop) + echo "Stopping wifibroadcast..." + wifibroadcast stop + ;; + + *) + echo "Usage: $0 {start|stop}" + exit 1 + ;; +esac diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/majestic.yaml b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/majestic.yaml new file mode 100644 index 0000000..22b5e10 --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/majestic.yaml @@ -0,0 +1,81 @@ +system: + webPort: 80 + httpsPort: 443 + logLevel: info +isp: + antiFlicker: disabled + sensorConfig: /etc/sensors/imx415_fpv.bin + exposure: 5 + iqServer: false +image: + mirror: false + flip: false + rotate: 0 + contrast: 50 + hue: 50 + saturation: 50 + luminance: 50 +video0: + enabled: true + codec: h264 + fps: 60 + bitrate: 4096 + rcMode: cbr + gopSize: 0.2 + size: 1280x720 + profile: main + sliceUnits: 0 +video1: + enabled: false + codec: h264 + size: 704x576 + fps: 15 +jpeg: + enabled: true + qfactor: 50 + fps: 5 +osd: + enabled: false + font: /usr/share/fonts/truetype/UbuntuMono-Regular.ttf + template: '%d.%m.%Y %H:%M:%S' + posX: 16 + posY: 16 +audio: + enabled: false + volume: 30 + srate: 8000 + codec: opus + outputEnabled: false + outputVolume: 30 +rtsp: + enabled: false + port: 554 +nightMode: + colorToGray: true + irCutSingleInvert: false + lightMonitor: false + lightSensorInvert: false +motionDetect: + enabled: false + visualize: false + debug: false +records: + enabled: false + path: /mnt/mmcblk0p1/%F + split: 1 + maxUsage: 95 + notime: true +outgoing: + enabled: true + naluSize: 1400 + wfb: true + server: + substream: false +watchdog: + enabled: true + timeout: 300 +hls: + enabled: false +fpv: + enabled: true + noiseLevel: 1 diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/network/interfaces.d/eth0 b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/network/interfaces.d/eth0 new file mode 100644 index 0000000..1e2374e --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/network/interfaces.d/eth0 @@ -0,0 +1,6 @@ +iface eth0 inet static + hwaddress ether $(fw_printenv -n ethaddr || echo 00:00:23:34:45:66) + address 192.168.0.10 + netmask 255.255.255.0 + gateway 192.168.0.1 + post-up echo "nameserver 1.1.1.1" > /etc/resolv.conf diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/network/interfaces.d/wlan0 b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/network/interfaces.d/wlan0 new file mode 100644 index 0000000..885b8a2 --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/network/interfaces.d/wlan0 @@ -0,0 +1,10 @@ +auto wlan0 +iface wlan0 inet static + address 192.168.0.10 + netmask 255.255.255.0 + gateway 192.168.0.1 + pre-up wpa_passphrase "$(fw_printenv -n wlanssid)" "$(fw_printenv -n wlanpass)" > /tmp/wpa_supplicant.conf + pre-up sed -i 's/#psk.*/scan_ssid=1/g' /tmp/wpa_supplicant.conf + pre-up wpa_supplicant -B -i wlan0 -D nl80211,wext -c /tmp/wpa_supplicant.conf + post-up echo "nameserver 1.1.1.1" > /etc/resolv.conf + post-down killall -q wpa_supplicant diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/wfb.yaml b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/wfb.yaml new file mode 100644 index 0000000..c6e0e9b --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/etc/wfb.yaml @@ -0,0 +1,17 @@ +wireless: + txpower: 10 + channel: 161 + width: 20 + mlink: 1500 +broadcast: + mcs_index: 2 + tun_index: 1 + fec_k: 8 + fec_n: 12 + stbc: 0 + ldpc: 0 + link_id: 7669206 +telemetry: + router: msposd + serial: ttyS2 + osd_fps: 20 diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/channels.sh b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/channels.sh new file mode 100755 index 0000000..18ea364 --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/channels.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +CHANNEL="${1:-}" +VALUE="${2:-}" + +[ "$CHANNEL" = "6" ] || exit 0 + +case "$VALUE" in + ''|*[!0-9]*) exit 2 ;; +esac + +if [ "$VALUE" -le 1250 ]; then + logger -t channels "AUX2=$VALUE -> management" + exec /usr/bin/link-mode management +fi + +if [ "$VALUE" -ge 1350 ]; then + logger -t channels "AUX2=$VALUE -> preflight" + exec /usr/bin/link-mode preflight +fi + +exit 0 diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/link-mode b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/link-mode new file mode 100755 index 0000000..c29b969 --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/link-mode @@ -0,0 +1,65 @@ +#!/bin/sh + +LOCK=/run/link-mode.lock +STATE=/run/link-mode.state + +log() { + logger -t link-mode "$*" +} + +if ! mkdir "$LOCK" 2>/dev/null; then + log "another transition is in progress; ignoring ${1:-}" + exit 0 +fi + +cleanup() { + rmdir "$LOCK" 2>/dev/null || true +} + +trap cleanup EXIT HUP INT TERM + +wfb_active() { + pidof wfb_tx wfb_rx wfb_tun wifilink >/dev/null +} + +case "${1:-}" in + preflight) + if wfb_active; then + echo wfb >"$STATE" + exit 0 + fi + + log "management -> WFB" + ifdown wlan0 >/dev/null 2>&1 || true + killall -q wpa_supplicant 2>/dev/null || true + ip link set wlan0 up + + if /usr/bin/wifibroadcast start && wfb_active; then + echo wfb >"$STATE" + log "WFB is active" + exit 0 + fi + + log "WFB start failed" + exit 1 + ;; + + management) + if wfb_active; then + log "WFB -> management" + /usr/bin/wifibroadcast stop + killall -q wifilink 2>/dev/null || true + fi + + /usr/bin/mgmt-net --force + echo management >"$STATE" + log "management path restored" + /etc/init.d/S97link-monitor start + exit 0 + ;; + + *) + echo "Usage: $0 {preflight|management}" >&2 + exit 2 + ;; +esac diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/mgmt-net b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/mgmt-net new file mode 100755 index 0000000..06c4632 --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/mgmt-net @@ -0,0 +1,59 @@ +#!/bin/sh + +STATE=/run/mgmt-net.state +LINK_LOCK=/run/link-mode.lock +FORCE="${1:-}" + +[ -e "$LINK_LOCK" ] && [ "$FORCE" != "--force" ] && exit 0 + +eth_standby() { + ifdown eth0 2>/dev/null || true + ifup eth0 + ip addr flush dev eth0 +} + +carrier=0 +if [ -r /sys/class/net/eth0/carrier ]; then + carrier=$(cat /sys/class/net/eth0/carrier 2>/dev/null || echo 0) +fi + +if pidof wfb_tx wfb_rx wfb_tun wifilink >/dev/null; then + wfb_active=1 +else + wfb_active=0 +fi + +if [ "$carrier" = "1" ]; then + wanted=ethernet +elif [ "$wfb_active" = "1" ]; then + wanted=wfb +else + wanted=wifi +fi + +current=$(cat "$STATE" 2>/dev/null || true) +[ "$wanted" = "$current" ] && [ "$FORCE" != "--force" ] && exit 0 + +case "$wanted" in + ethernet) + [ "$wfb_active" = "0" ] && ifdown wlan0 2>/dev/null || true + ifdown eth0 2>/dev/null || true + ifup eth0 + ;; + + wifi) + eth_standby + ifdown wlan0 2>/dev/null || true + ip link set wlan0 down + iw dev wlan0 set type managed + ip link set wlan0 up + ifup wlan0 + ;; + + wfb) + eth_standby + ;; +esac + +echo "$wanted" >"$STATE" +logger -t mgmt-net "active path: $wanted" diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/wifibroadcast b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/wifibroadcast new file mode 100755 index 0000000..e0fa21f --- /dev/null +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/bin/wifibroadcast @@ -0,0 +1,196 @@ +#!/bin/sh +wfb_key=/etc/drone.key +wfb_cfg=/etc/wfb.yaml +wfb_dev=wlan0 + +echo_log() { + echo "$1" | logger -s -t wifibroadcast +} + +wfb_yaml() { + if [ -e "$1" ]; then + while IFS=: read -r key value; do + key=$(eval echo "$key") + value=$(eval echo "$value") + export "$key=$value" + done < "$1" + fi +} + +load_config() { + wfb_yaml /rom"$wfb_cfg" + wfb_yaml "$wfb_cfg" + [ ! -e "$wfb_key" ] && wfb_key=/rom"$wfb_key" +} + +load_modules() { + for card in $(lsusb | awk '{print $6}' | uniq); do + case "$card" in + "0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012") + driver=88XXau + ;; + + "0bda:a81a") + driver=8812eu + ;; + + "0bda:f72b" | "0bda:b733") + driver=8733bu + ;; + esac + done + + if [ -z "$driver" ]; then + echo_log "Wireless module not detected!" + exit 1 + fi + + echo_log "Detected driver: $driver" + [ -e /sys/class/net/"$wfb_dev" ] && return + sleep 1 + + if [ "$driver" != "88XXau" ]; then + opt1="rtw_tx_pwr_by_rate=0" + opt2="rtw_tx_pwr_lmt_enable=0" + fi + + modprobe "$driver" "$opt1" "$opt2" + sleep 3 + + if ! ifconfig "$wfb_dev" up; then + echo_log "Wireless driver not found!" + exit 1 + fi +} + +load_mlink() { + ifconfig "$wfb_dev" mtu "$mlink" + + nalu=$((mlink - 100)) + if [ "$(cli -g .outgoing.naluSize)" != "$nalu" ]; then + cli -s .outgoing.naluSize "$nalu" + killall -1 majestic + fi +} + +load_interface() { + iw "$wfb_dev" set monitor none + + [ "$width" = "40" ] && wfb_width=HT40+ || wfb_width=HT20 + iw "$wfb_dev" set channel "$channel" "$wfb_width" + iw reg set 00 + + [ "$driver" = "88XXau" ] && wfb_power=$((txpower * -100)) || wfb_power=$((txpower * 50)) + iw "$wfb_dev" set txpower fixed "$wfb_power" +} + +load_wfb() { + wfb_rx -K "$wfb_key" -i "$link_id" -p "$1" -u "$3" "$wfb_dev" &> /dev/null & + wfb_tx -K "$wfb_key" -M "$tun_index" -B "$width" -k "$fec_k" -n "$fec_n" \ + -S "$stbc" -L "$ldpc" -i "$link_id" -p "$2" -u "$4" "$wfb_dev" &> /dev/null & +} + +start_broadcast() { + echo_log "Starting wfb_tx" + wfb_tx -K "$wfb_key" -M "$mcs_index" -B "$width" -k "$fec_k" -n "$fec_n" -U rtp_local \ + -S "$stbc" -L "$ldpc" -i "$link_id" -C 8000 "$wfb_dev" &> /dev/null & +} + +start_tunnel() { + echo_log "Starting wfb_tun" + load_wfb 160 32 5800 5801 + wfb_tun -a 10.5.0.10/24 > /dev/null & +} + +start_telemetry() { + chipset=$(ipcinfo -c) + [ "$chipset" = "ssc33x" ] && devmem 0x1F207890 16 0x8 + + port_rx=14550 + port_tx=14551 + + echo_log "Starting $router" + load_wfb 144 16 "$port_rx" "$port_tx" + + if [ "$router" = "mavfwd" ]; then + mavfwd -b 115200 -c 8 -p 100 -a 15 -t -m /dev/"$serial" \ + -o 127.0.0.1:"$port_tx" -i 127.0.0.1:"$port_rx" > /dev/null & + else + if [ "$router" = "msposd" ]; then + size=$(curl -s localhost/api/v1/config.json | jsonfilter -qe "@.video0.size") + fi + if ! pidof msposd >/dev/null; then + msposd -b 115200 -c 8 -c 6 -p 500 -w 1000 -r "$osd_fps" -m /dev/"$serial" \ + -o 127.0.0.1:"$port_tx" -z "$size" > /dev/null & + fi + fi +} + +video_settings() { + sensor=$(ipcinfo -s) + cli -s .isp.sensorConfig /etc/sensors/"$sensor"_fpv.bin + cli -s .isp.exposure 5 + cli -s .video0.fps 60 + cli -s .video0.size 1280x720 + cli -s .video0.bitrate 4096 + cli -s .video0.codec h264 + cli -s .video0.rcMode cbr + cli -s .video0.gopSize 0.2 + cli -s .outgoing.enabled true + cli -s .outgoing.wfb true + cli -s .fpv.enabled true + cli -s .fpv.noiseLevel 1 + cli -s .records.split 1 + cli -s .records.notime true +} + +start() { + load_config + load_modules + load_mlink + load_interface + + if [ ! -e /etc/system.ok ]; then + video_settings + touch /etc/system.ok +# killall -1 majestic + reboot + fi + + stop + start_broadcast + start_tunnel + start_telemetry + wifilink 20 & +} + +stop() { + for process in wfb_rx wfb_tx wfb_tun mavfwd; do + if [ -n "$(pidof $process)" ]; then + echo_log "Stopping $process" + killall -q "$process" + fi + done +} + +case "$1" in + start|stop) + $1 + ;; + + reset) + cp -f /rom"$wfb_cfg" "$wfb_cfg" + cp -f /rom/etc/majestic.yaml /etc/majestic.yaml + video_settings + ;; + + cli) + shift + yaml-cli -i "$wfb_cfg" "$@" + ;; + + *) + echo "Usage: $0 {start|stop|reset|cli}" + exit 1 + ;; +esac diff --git a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/share/openipc/customizer.sh b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/share/openipc/customizer.sh index ae07415..3c30472 100644 --- a/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/share/openipc/customizer.sh +++ b/devices/ssc338q_fpv_openipc-urllc-aio/general/overlay/usr/share/openipc/customizer.sh @@ -1,6 +1,6 @@ #!/bin/sh -# Set custom upgrade url -fw_setenv upgrade 'https://github.com/OpenIPC/builder/releases/download/latest/ssc338q_fpv_openipc-urllc-aio-nor.tgz' +# Set the reproducible Piksar HiLink firmware release channel. +fw_setenv upgrade 'https://git.piksar.eu/piotr/openipc-builder/releases/download/latest/ssc338q_fpv_openipc-urllc-aio-nor.tgz' exit 0