picchick
A utility to aid in programming PIC microcontrollers
# This shell script is used to download and process the microchip DFU's for
# distrubution with picchick. It downloads the device packs, extracts only the
# needed .ini files, then strips them of comments, empty lines, and SFR* config
# entries. This gets it down from ~56M to ~4.5M for PICs 10, 12, 16, and 18.
# List of DFPs to include (Latest of 2025-09-07)
PACKS=(\
Microchip.PIC10-12Fxxx_DFP.1.8.184.atpack \
Microchip.PIC12-16Cxxx_DFP.1.7.175.atpack \
Microchip.PIC12-16F1xxx_DFP.1.8.254.atpack \
Microchip.PIC16F1xxxx_DFP.1.27.418.atpack \
Microchip.PIC16Fxxx_DFP.1.7.162.atpack \
Microchip.PIC18Cxxx_DFP.1.6.169.atpack \
Microchip.PIC18F-J_DFP.1.9.170.atpack \
Microchip.PIC18F-K_DFP.1.15.303.atpack \
Microchip.PIC18F-Q_DFP.1.28.451.atpack \
Microchip.PIC18Fxxxx_DFP.1.7.171.atpack \
)
MCHIP_URL="https://packs.download.microchip.com"
DL_DIR="build/vendor/downloads"
PACK_DIR="build/vendor/packs"
INI_DIR="picchick/devices/ini"
work=0
for pack in "${PACKS[@]}"; do
# Download .atpack if it doesn't exist
mkdir -p "$DL_DIR"
if [[ ! -f "$DL_DIR/$pack" ]]; then
echo Downloading $pack ...
curl -s "$MCHIP_URL/$pack" > "$DL_DIR/$pack"
let work++
fi
# Extract .atpack into directory with same name
pack_dir=$(basename "$pack" ".atpack")
mkdir -p "$PACK_DIR"
if [[ ! -d "$PACK_DIR/$pack_dir" ]]; then
unzip "$DL_DIR/$pack" "xc8/pic/dat/ini/*" -d "$PACK_DIR/$pack_dir"
let work++
fi
done
INI_FILES=($(find "$PACK_DIR" -name "*.ini"))
mkdir -p "$INI_DIR"
for file in "${INI_FILES[@]}"; do
if [[ ! -f "$INI_DIR/$(basename $file)" ]]; then
echo Trimming "$INI_DIR/$(basename $file)" ...
grep -vE "^#|^$" "$file" | grep -vE "^SFR" > "$INI_DIR/$(basename $file)"
let work++
fi
done
LICENSE_SOURCE_FILE="10f200.ini"
LICENSE_FILE="$INI_DIR/LICENSE"
LICENSE_SOURCE_FILE_PATH=$(find "$PACK_DIR" -name "$LICENSE_SOURCE_FILE")
if [[ ! -f "$LICENSE_FILE" ]]; then
echo Creating "$LICENSE_FILE" ...
head -n 29 "$LICENSE_SOURCE_FILE_PATH" | tail -n +3 > "$LICENSE_FILE"
let work++
fi
if [[ $work -eq 0 ]]; then
echo "Nothing to do!"
fi
echo -n "Total size: "
du -h "$INI_DIR"