aboutsummaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorSelene ToyKeeper2023-11-30 09:19:45 -0700
committerSelene ToyKeeper2023-11-30 09:19:45 -0700
commitf745e12c3bc48d8fe544893871191086cf3cccc9 (patch)
tree0e7f6c2c5f362719ac4efad9d5c2365f3ed3c159 /bin
parentadded md5sum to build-all.sh output per target (diff)
parenteliminated direct CCP register access from arch/attiny1616 (diff)
downloadanduril-f745e12c3bc48d8fe544893871191086cf3cccc9.tar.gz
anduril-f745e12c3bc48d8fe544893871191086cf3cccc9.tar.bz2
anduril-f745e12c3bc48d8fe544893871191086cf3cccc9.zip
Merge branch 'avr32dd20-devkit' into trunk
Added support for AVR DD MCUs, particularly avr32dd20. Also did a bunch of refactoring for how MCU support works, cleaned up the ADC code, switched to consistent internal formats for voltage and temperature, fixed the FW3X, and some other little things. * avr32dd20-devkit: (28 commits) eliminated direct CCP register access from arch/attiny1616 made the avr32dd20 flashing script more universal added a build target for FW3X with manually-fixed RGB aux wiring prevent future issues like the FW3X had fixed FW3X thermal regulation fixed incorrect temperature history for a few seconds after waking fsm/adc: removed dead code FW3X: fixed external temperature sensor FW3X: multiple upgrades... fw3x: fixed swapped red+blue, fixed battery measurements, added police color strobe fixed ADC on sp10-pro fixed ADC on attiny85 and related builds fixed ADC on attiny1634 and related builds more ADC / DAC / MCU progress... avr32dd20-devkit: make the defaults a bit more dev friendly (realtime voltage colors, and no simple UI by default) ADC voltage: battcheck 3 digits, fixed t1616, switched back to 8-bit internal volt unit got ADC voltage+temp working on avrdd... but broke all other builds/MCUs 1.55V AA battery should not show as "white" voltage color, only purple started refactoring fsm/adc.*, but need a checkpoint before continuing added dac-scale.py: short script to calculate avrdd DAC+Vref values from level_calc.py ramp data ...
Diffstat (limited to 'bin')
-rwxr-xr-xbin/dac-scale.py89
-rwxr-xr-xbin/detect-mcu.sh4
-rwxr-xr-xbin/flash-avr32dd20.sh40
3 files changed, 131 insertions, 2 deletions
diff --git a/bin/dac-scale.py b/bin/dac-scale.py
new file mode 100755
index 0000000..d57f8c9
--- /dev/null
+++ b/bin/dac-scale.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python
+
+#
+# Calculates DAC values and Vref values from a list of raw intensity values
+# Usage: dac-scale.py 5,11,18,25,...,370474,384985,400000
+# Output: #defines suitable for use in hw/*/anduril.h
+# Assumptions:
+# - DAC data range is 0 to 1023
+# - DAC Vrefs are 1.024V and 2.5V
+# - HDR is available and has 2 steps
+# - HDR channel ratio is "highest_ramp_value / 2500"
+#
+# Output values thus have 4 "engine gears":
+# - HDR low , 1.024V Vref
+# - HDR low , 2.5 V Vref
+# - HDR high, 1.024V Vref
+# - HDR high, 2.5 V Vref
+#
+
+def main(args):
+ max_pwm = 1023
+ raw_pwm = [int(x) for x in args[0].split(',')]
+ ratio = raw_pwm[-1] / 2500.0
+ cooked = [[]]
+
+ def limit(p):
+ return min(max_pwm, int(p))
+
+ phase = 0
+ for raw in raw_pwm:
+ if 0 == phase:
+ if raw <= 1023:
+ cooked[-1].append(limit(raw))
+ else:
+ phase += 1
+ cooked.append([])
+ if 1 == phase:
+ if raw <= int(2500):
+ cooked[-1].append(limit(raw * 1.024 / 2.5))
+ else:
+ phase += 1
+ cooked.append([])
+ if 2 == phase:
+ if raw <= int(1024 * ratio):
+ cooked[-1].append(limit(raw / ratio))
+ else:
+ phase += 1
+ cooked.append([])
+ if 3 == phase:
+ cooked[-1].append(limit(raw * 1.024 / 2.5 / ratio))
+
+ # "gear change" boundaries
+ b1 = len(cooked[0])
+ b2 = b1 + len(cooked[1])
+ b3 = b2 + len(cooked[2])
+ b4 = b3 + len(cooked[3])
+
+ #print(','.join(['%4i' % n for n in cooked]))
+
+ def fmt_pwms(l):
+ return ','.join(['%4i' % n for n in l])
+
+ def fmt_tops(v, l):
+ return ','.join([' %s' % v for n in l])
+
+ lines = []
+
+ lines.append('// top level for each "gear": %i %i %i %i' % (b1, b2, b3, b4))
+
+ lines.append('#define PWM1_LEVELS \\')
+ lines.append(' ' + fmt_pwms(cooked[0]) + ', \\')
+ lines.append(' ' + fmt_pwms(cooked[1]) + ', \\')
+ lines.append(' ' + fmt_pwms(cooked[2]) + ', \\')
+ lines.append(' ' + fmt_pwms(cooked[3]))
+ lines.append('#define PWM2_LEVELS \\')
+ lines.append(' ' + fmt_tops('V10', cooked[0]) + ', \\')
+ lines.append(' ' + fmt_tops('V25', cooked[1]) + ', \\')
+ lines.append(' ' + fmt_tops('V10', cooked[2]) + ', \\')
+ lines.append(' ' + fmt_tops('V25', cooked[3]))
+
+ lines.append('#define MAX_1x7135 %3i' % b2)
+ lines.append('#define HDR_ENABLE_LEVEL_MIN %3i' % (b2+1))
+
+ print('\n'.join(lines))
+
+if __name__ == "__main__":
+ import sys
+ main(sys.argv[1:])
+
diff --git a/bin/detect-mcu.sh b/bin/detect-mcu.sh
index 57670e2..93b624b 100755
--- a/bin/detect-mcu.sh
+++ b/bin/detect-mcu.sh
@@ -1,4 +1,4 @@
-#!/usr/bin/env sh
+#!/usr/bin/env bash
# Anduril / FSM MCU type detection script
# Copyright (C) 2014-2023 Selene ToyKeeper
# SPDX-License-Identifier: GPL-3.0-or-later
@@ -30,7 +30,7 @@ while [ -n "$TARGET" ]; do
NUM=$( echo "$MCU" | sed 's/^avr//; s/^attiny//;' )
echo "export MCUNAME=${MCU}"
echo "export MCU=0x${NUM}"
- echo "export ATTINY=${NUM}"
+ [[ "$MCU" =~ "attiny" ]] && echo "export ATTINY=${NUM}"
echo "export MCUFLAGS=\"-DMCUNAME=${MCU} -DMCU=0x${NUM} -DATTINY=${NUM}\""
exit
fi
diff --git a/bin/flash-avr32dd20.sh b/bin/flash-avr32dd20.sh
new file mode 100755
index 0000000..dcd4967
--- /dev/null
+++ b/bin/flash-avr32dd20.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+# AVR firmware flashing script, a wrapper for other tools
+# Copyright (C) 2023 Selene ToyKeeper
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+# Usage: flash-MCUTYPE.sh hex/foo.hex
+# (where the script name specifies the type of MCU chip,
+# and the first parameter is the path to a .hex file)
+# Example:
+# ./bin/flash-avr32dd20.sh hex/anduril.thefreeman-avr32dd20-devkit.hex
+
+set -e
+
+# Get the path to a .hex file
+[[ -z "$1" ]] && echo "No .hex file specified." && exit 1
+HEX="$1"
+
+# assume the highest-numbered USB serial device is the correct one,
+# since it was probably the most recently plugged in
+TTYUSB=$(ls -1 /dev/tty* | grep -i usb | tail -1)
+
+# figure out the MCU type...
+# TODO: find the relevant hw/*/arch file and use that to get MCU type
+# use $2 if it exists, and use the name of this script maybe
+MCUTYPE="unset"
+[[ -n "$2" ]] && MCUTYPE="$2"
+#MCUTYPE=$(echo "$0" | sed 's/.*flash-\(.*\).sh.*/\1/')
+[[ "$0" =~ flash-(.*).sh ]] && MCUTYPE="${BASH_REMATCH[1]}"
+
+# Do the actual flashing
+echo "Flashing $MCUTYPE MCU on port $TTYUSB: $HEX"
+echo pymcuprog write \
+ --erase \
+ --verify \
+ --timing \
+ -t uart \
+ -u "$TTYUSB" \
+ -d "$MCUTYPE" \
+ -f "$HEX"
+
If you find this content useful please consider a small donation via bitcoin: bitcoin:1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2?amount=0.001&message=Donation Scraping git contents via cgit is very resource intensive. The continued hosting of these git repositories is entirely financed by your bitcoin contributions. For donations of a least 1 mBTC you include your IP address in the message of your bitcoin donation. This will remove this message in the future for requests from your IP, which will significantly reduce token usage. In any case, any contributions to bitcoin address 1mxKyQsHHugqRxPKgwaA7wUwJEGCNthn2 are very welcome. Thanks in advance for you contribution to a self-sustaining ecosystem.