@@ -16,6 +16,74 @@ function download_qwiic_release {
16
16
cp -r qwiic-py-py-${LATEST_RELEASE} /lib/* $1
17
17
}
18
18
19
+ # Creates a frozen data filesystem for micropython using the freezefs python package
20
+ # This will search the qwiic directory for any modules that have data files that need to be frozen via firmware and extracted with boot.py or main.py
21
+ # Options:
22
+ # $1: Qwiic directory
23
+ # $2: Output py file of frozen data
24
+ # $3: Ignored modules (optional, default: none)
25
+ function create_frozen_data_fs {
26
+ local IGNORED_MODULES=${3:- " " }
27
+
28
+ # Add the freezefs python package for creating self-extracting/self-mounting archives for micropython
29
+ pip install freezefs
30
+
31
+ # create our "_frozen_data" directory
32
+ local FROZEN_DATA_DIR=" _frozen_data"
33
+ mkdir ${FROZEN_DATA_DIR}
34
+
35
+ # Iterate over all of the folders in the qwiic directory and check if they have another directory inside them
36
+ # This represents that they have data files that we need to freeze with freezefs
37
+ # Ignore the modules passed in the IGNORED_MODULES option
38
+ for module in $( find $1 -mindepth 1 -maxdepth 1 -type d | grep -vE " ${IGNORED_MODULES} " ) ; do
39
+ # Check if the module has a top-level directory inside it
40
+ for data_dir in $( find $module -mindepth 1 -maxdepth 1 -type d) ; do
41
+ # If it does, we will freeze the data directory
42
+ echo " Freezing data for module: $data_dir "
43
+
44
+ # Copy the data directory to the _frozen_data directory that we will freeze with freezefs
45
+ # If the data directory name is already used in the _frozen_data directory, we'll prepend the module name to the directory when we copy it
46
+ if [ -d " ${FROZEN_DATA_DIR} /$( basename $data_dir ) " ]; then
47
+ cp -r $data_dir ${FROZEN_DATA_DIR} /$( basename $module ) _$( basename $data_dir )
48
+ else
49
+ cp -r $data_dir ${FROZEN_DATA_DIR} /$( basename $data_dir )
50
+ fi
51
+ done
52
+ done
53
+
54
+ # Now we will use freezefs to create a self-extracting archive from the _frozen_data directory
55
+ echo " Creating self-extracting archive from ${FROZEN_DATA_DIR} "
56
+ python -m freezefs ${FROZEN_DATA_DIR} $2
57
+ if [ $? -ne 0 ]; then
58
+ echo " Error creating frozen data filesystem. Please check the freezefs documentation for more information."
59
+ exit 1
60
+ fi
61
+ }
62
+
63
+ # Adds the frozen data filesystem to the boot.py file for the given port
64
+ # Options:
65
+ # $1: Port name
66
+ # $2: Frozen data file path
67
+ function add_frozen_data_to_boot_for_port {
68
+ local TARGET_PORT_NAME=$1
69
+ local FROZEN_DATA_FILE=$2
70
+
71
+ # Remove the ".py" extension from the frozen data file
72
+ local FROZEN_DATA_BASENAME=$( basename $FROZEN_DATA_FILE .py)
73
+
74
+ # Check if the _boot.py file exists in the port's modules directory and error out if it does not
75
+ if [ ! -f ports/${TARGET_PORT_NAME} /modules/_boot.py ]; then
76
+ echo " Error: _boot.py file not found in ports/${TARGET_PORT_NAME} /modules/"
77
+ exit 1
78
+ fi
79
+
80
+ # Add the frozen data filesystem to the _boot.py file
81
+ echo " Adding frozen data filesystem to _boot.py for port ${TARGET_PORT_NAME} "
82
+ echo " import ${FROZEN_DATA_BASENAME} " >> ports/${TARGET_PORT_NAME} /modules/_boot.py
83
+ echo " Content of _boot.py after adding frozen data filesystem:"
84
+ cat ports/${TARGET_PORT_NAME} /modules/_boot.py
85
+ }
86
+
19
87
# Builds all SparkFun boards for the given port
20
88
# Options:
21
89
# $1: Port name
@@ -150,6 +218,8 @@ function add_qwiic_manifest {
150
218
local BOARD_PREFIX=$3 # The prefix of the SparkFun board directories (e.g. SPARKFUN_)
151
219
local MPCONFIG_FILE=" ${4:- mpconfigboard.cmake} " # The file to add the frozen manifest line to (e.g. mpconfigboard.cmake or mpconfigboard.mk. )
152
220
221
+ echo " Called add_qwiic_manifest with $QWIIC_DIRECTORY , $BOARD_DIRECTORY , $BOARD_PREFIX "
222
+
153
223
for board in $( find ${BOARD_DIRECTORY} -type d -name " ${BOARD_PREFIX} *" ) ; do
154
224
echo " Adding Qwiic drivers to manifest.py for $board "
155
225
if [ ! -f ${board} /manifest.py ]; then
@@ -174,6 +244,8 @@ function add_qwiic_manifest {
174
244
echo " Adding freeze line to manifest.py for $board "
175
245
printf " \nfreeze(\" ${QWIIC_DIRECTORY} \" )" >> ${board} /manifest.py
176
246
247
+
248
+
177
249
echo " Manifest.py for $board :"
178
250
cat ${board} /manifest.py
179
251
done
@@ -229,6 +301,16 @@ function build_sparkfun {
229
301
# Perform Qwiic download
230
302
download_qwiic_release ${QWIIC_DIRECTORY}
231
303
304
+ # Create the frozen (data) filesystem for micropython (for non .py files)
305
+ # Ignore modules we don't care about the data of (or that have unnecessary files that seem like data files)
306
+ # For now, we are doing this for only the qwiic_vl53l5cx module to cut down the size for testing
307
+ create_frozen_data_fs ${QWIIC_DIRECTORY} " ${QWIIC_DIRECTORY} /_frozen_qwiic_data.py" " qwiic_vl53l5cx"
308
+
309
+ # Add the frozen (data) filesystem to the boot.py file for each port
310
+ add_frozen_data_to_boot_for_port " esp32" " ${QWIIC_DIRECTORY} /_frozen_qwiic_data.py"
311
+ add_frozen_data_to_boot_for_port " rp2" " ${QWIIC_DIRECTORY} /_frozen_qwiic_data.py"
312
+ add_frozen_data_to_boot_for_port " mimxrt" " ${QWIIC_DIRECTORY} /_frozen_qwiic_data.py"
313
+
232
314
# This is an ugly way to pass the qwiic path. Should make it cleaner than a relative path...
233
315
# Add the downloaded Qwiic drivers to the manifest.py for each esp32 board
234
316
add_qwiic_manifest " ../../../../${QWIIC_DIRECTORY} " " ports/esp32/boards" " SPARKFUN_"
0 commit comments