Newer
Older
#!/usr/bin/env bash
# Script for installing pico-ducky on a Raspberry Pi Pico 2
CIRCUITPYTHON_BUNDLE_VERSION="9.x"
CIRCUITPYTHON_BUNDLE_FILE="adafruit-circuitpython-bundle-9.x-mpy-20241012.zip"
CIRCUITPYTHON_VERSION="9.2.0-beta.1"
CIRCUITPYTHON_LANG="fr"
CIRCUITPYTHON_FILE="adafruit-circuitpython-raspberry_pi_pico2-${CIRCUITPYTHON_LANG}-${CIRCUITPYTHON_VERSION}.uf2"
MEDIA_PATH="/media"
PI_NAME="RP2350" # "RPI-RP2" for pico 1
waitForFile() {
FILETOWAITFOR=$1
set +e
while true
do
ls $FILETOWAITFOR &> /dev/null
if [ "$?" -eq 0 ]
then
break
fi
echo "Waiting for $FILETOWAITFOR to appear..."
read -p "Press [Enter] to retry or provide the correct path: " USER_INPUT
if [ -n "$USER_INPUT" ]; then
FILETOWAITFOR="$USER_INPUT"
fi
sleep 2
done
set -e
}
set -e
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
CACHEDIR=/tmp/pico-ducky-cache
mkdir -p $CACHEDIR
cd $CACHEDIR
echo "Downloading CircuitPython $CIRCUITPYTHON_VERSION"
set +e;
ls ${CIRCUITPYTHON_FILE} &> /dev/null
CACHED=$?
set -e
if [ "$CACHED" -eq 0 ]
then
echo "Using cached ${CIRCUITPYTHON_FILE}"
wget -nv https://downloads.circuitpython.org/bin/raspberry_pi_pico2/${CIRCUITPYTHON_LANG}/${CIRCUITPYTHON_FILE}
fi
echo "Downloading CircuitPython bundle $CIRCUITPYTHON_BUNDLE_VERSION"
cd $CACHEDIR
set +e
ls $CIRCUITPYTHON_BUNDLE_FILE &> /dev/null
CACHED=$?
set -e
if [ "$CACHED" -eq 0 ]
then
echo "Using cached $CIRCUITPYTHON_BUNDLE_FILE"
wget -nv https://github.com/adafruit/Adafruit_CircuitPython_Bundle/releases/download/20241012/$CIRCUITPYTHON_BUNDLE_FILE
fi
echo "Downloading flash_nuke.uf2"
set +e
ls flash_nuke.uf2 &> /dev/null
CACHED=$?
set -e
if [ "$CACHED" -eq 0 ]
then
echo "Using cached flash_nuke.uf2"
wget -nv https://datasheets.raspberrypi.com/soft/flash_nuke.uf2
fi
echo "Downloading additional keyboard layouts"
cd $CACHEDIR
set +e
ls circuitpython-keyboard-layouts-py-20231122.zip &> /dev/null
CACHED=$?
set -e
if [ "$CACHED" -eq 0 ]
then
echo "Using cached circuitpython-keyboard-layouts-py-20231122.zip"
wget -nv https://github.com/Neradoc/Circuitpython_Keyboard_Layouts/releases/download/20231122/circuitpython-keyboard-layouts-py-20231122.zip
echo "Hold the button on the Pico 2 and plug it in so it shows up as mass storage device "${PI_NAME}""
waitForFile "${MEDIA_PATH}/*/${PI_NAME}"
echo "Installing flash_nuke"
cd ${MEDIA_PATH}/*/${PI_NAME}
cp $CACHEDIR/flash_nuke.uf2 .
echo "Done"
echo "Waiting for the Pico to reboot..."
sleep 3
waitForFile "${MEDIA_PATH}/*/${PI_NAME}"
echo "Installing CircuitPython image"
cd ${MEDIA_PATH}/*/${PI_NAME}
cp $CACHEDIR/$CIRCUITPYTHON_FILE .
echo "Done"
echo "Waiting for the Pico 2 to reboot again..."
waitForFile "${MEDIA_PATH}/*/CIRCUITPY"
echo "Installing pico-ducky and friends"
cd ${MEDIA_PATH}/*/CIRCUITPY
CPYDIR=`pwd`
CPBUNDLEDIR=$CACHEDIR/${CIRCUITPYTHON_BUNDLE_FILE/.zip}/
cp -r $CPBUNDLEDIR/lib/adafruit_hid lib/
cp -r $CPBUNDLEDIR/lib/adafruit_debouncer.mpy lib/
cp -r $CPBUNDLEDIR/lib/adafruit_ticks.mpy lib/
cp -r $CPBUNDLEDIR/lib/asyncio lib/
cp -r $CPBUNDLEDIR/lib/adafruit_wsgi lib/
cp -r $SCRIPTDIR/boot.py .
cp -r $SCRIPTDIR/duckyinpython.py .
cp -r $SCRIPTDIR/code.py .
cp -r $SCRIPTDIR/webapp.py .
cp -r $SCRIPTDIR/wsgiserver.py .
mkdir -p payloads
echo "Done"
echo "Installing azerty keyboard layout support"
cd ${MEDIA_PATH}/*/CIRCUITPY
CPYDIR=`pwd`
CPLAYOUTDIR=$CACHEDIR/circuitpython-keyboard-layouts-py-20231122/
cp -r $CPLAYOUTDIR/lib/keyboard_layout_win_fr.py lib/
cp -r $CPLAYOUTDIR/lib/keycode_mac_fr.py lib/
cp -r $CPLAYOUTDIR/lib/keyboard_layout_mac_fr.py lib/
cp -r $CPLAYOUTDIR/lib/keycode_win_fr.py lib/
echo "Done"
printf "\nThe device is now ready, and you may install your payload.dd in $CPYDIR\n"