From 074d713bfb845a87e557e608f5215f53694e7d01 Mon Sep 17 00:00:00 2001 From: Dave Hylands Date: Sat, 31 Oct 2015 21:24:47 -0700 Subject: [PATCH] lib/memzip: Factor out memzip from teensy/ into lib/memzip. --- lib/memzip/README.md | 28 ++++++++++ {teensy => lib/memzip}/import.c | 0 {teensy => lib/memzip}/lexermemzip.c | 0 lib/memzip/make-memzip.py | 79 ++++++++++++++++++++++++++++ {teensy => lib/memzip}/memzip.c | 6 +-- {teensy => lib/memzip}/memzip.h | 0 teensy/Makefile | 26 +++++---- 7 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 lib/memzip/README.md rename {teensy => lib/memzip}/import.c (100%) rename {teensy => lib/memzip}/lexermemzip.c (100%) create mode 100755 lib/memzip/make-memzip.py rename {teensy => lib/memzip}/memzip.c (94%) rename {teensy => lib/memzip}/memzip.h (100%) diff --git a/lib/memzip/README.md b/lib/memzip/README.md new file mode 100644 index 000000000..287d0fc48 --- /dev/null +++ b/lib/memzip/README.md @@ -0,0 +1,28 @@ +MEMZIP - a simple readonly file system + +memzip takes a zip file which is comprised of uncompressed files and +and presents it as a filesystem, allowing Python files to be imported. + +The script make-memzip.py takes a directory name and will create a zip file +containing uncompressed files found in the directory. It will then generate +a C file which contains the data from the zip file. + +A typical addition to a makefile would look like: +``` +SRC_C += \ + lib/memzip/import.c \ + lib/memzip/lexermemzip.c \ + lib/memzip/memzip.c \ + +OBJ += $(BUILD)/memzip-files.o + +MAKE_MEMZIP = ../lib/memzip/make-memzip.py + +$(BUILD)/memzip-files.o: $(BUILD)/memzip-files.c + $(call compile_c) + +$(BUILD)/memzip-files.c: $(shell find ${MEMZIP_DIR} -type f) + @$(ECHO) "Creating $@" + $(Q)$(PYTHON) $(MAKE_MEMZIP) --zip-file $(BUILD)/memzip-files.zip --c-file $@ $(MEMZIP_DIR) +``` + diff --git a/teensy/import.c b/lib/memzip/import.c similarity index 100% rename from teensy/import.c rename to lib/memzip/import.c diff --git a/teensy/lexermemzip.c b/lib/memzip/lexermemzip.c similarity index 100% rename from teensy/lexermemzip.c rename to lib/memzip/lexermemzip.c diff --git a/lib/memzip/make-memzip.py b/lib/memzip/make-memzip.py new file mode 100755 index 000000000..9730f5e00 --- /dev/null +++ b/lib/memzip/make-memzip.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python +# +# Takes a directory of files and zips them up (as uncompressed files). +# This then gets converted into a C data structure which can be read +# like a filesystem at runtime. +# +# This is somewhat like frozen modules in python, but allows arbitrary files +# to be used. + +from __future__ import print_function + +import argparse +import os +import subprocess +import sys +import types + +def create_zip(zip_filename, zip_dir): + abs_zip_filename = os.path.abspath(zip_filename) + save_cwd = os.getcwd() + os.chdir(zip_dir) + if os.path.exists(abs_zip_filename): + os.remove(abs_zip_filename) + subprocess.check_call(['zip', '-0', '-r', '-D', abs_zip_filename, '.']) + os.chdir(save_cwd) + +def create_c_from_file(c_filename, zip_filename): + with open(zip_filename, 'rb') as zip_file: + with open(c_filename, 'wb') as c_file: + print('#include ', file=c_file) + print('', file=c_file) + print('const uint8_t memzip_data[] = {', file=c_file) + while True: + buf = zip_file.read(16) + if not buf: + break + print(' ', end='', file=c_file) + for byte in buf: + if type(byte) is types.StringType: + print(' 0x{:02x},'.format(ord(byte)), end='', file=c_file) + else: + print(' 0x{:02x},'.format(byte), end='', file=c_file) + print('', file=c_file) + print('};', file=c_file) + +def main(): + parser = argparse.ArgumentParser( + prog='make-memzip.py', + usage='%(prog)s [options] [command]', + description='Generates a C source memzip file.' + ) + parser.add_argument( + '-z', '--zip-file', + dest='zip_filename', + help='Specifies the name of the created zip file.', + default='memzip_files.zip' + ) + parser.add_argument( + '-c', '--c-file', + dest='c_filename', + help='Specifies the name of the created C source file.', + default='memzip_files.c' + ) + parser.add_argument( + dest='source_dir', + default='memzip_files' + ) + args = parser.parse_args(sys.argv[1:]) + + print('args.zip_filename =', args.zip_filename) + print('args.c_filename =', args.c_filename) + print('args.source_dir =', args.source_dir) + + create_zip(args.zip_filename, args.source_dir) + create_c_from_file(args.c_filename, args.zip_filename) + +if __name__ == "__main__": + main() + diff --git a/teensy/memzip.c b/lib/memzip/memzip.c similarity index 94% rename from teensy/memzip.c rename to lib/memzip/memzip.c index 88c084381..3fbea8e1e 100644 --- a/teensy/memzip.c +++ b/lib/memzip/memzip.c @@ -5,11 +5,11 @@ #include "py/misc.h" #include "memzip.h" -extern uint8_t _staticfs[]; +extern uint8_t memzip_data[]; const MEMZIP_FILE_HDR *memzip_find_file_header(const char *filename) { - const MEMZIP_FILE_HDR *file_hdr = (const MEMZIP_FILE_HDR *)_staticfs; + const MEMZIP_FILE_HDR *file_hdr = (const MEMZIP_FILE_HDR *)memzip_data; uint8_t *mem_data; /* Zip file filenames don't have a leading /, so we strip it off */ @@ -33,7 +33,7 @@ const MEMZIP_FILE_HDR *memzip_find_file_header(const char *filename) { } bool memzip_is_dir(const char *filename) { - const MEMZIP_FILE_HDR *file_hdr = (const MEMZIP_FILE_HDR *)_staticfs; + const MEMZIP_FILE_HDR *file_hdr = (const MEMZIP_FILE_HDR *)memzip_data; uint8_t *mem_data; if (strcmp(filename, "/") == 0) { diff --git a/teensy/memzip.h b/lib/memzip/memzip.h similarity index 100% rename from teensy/memzip.h rename to lib/memzip/memzip.h diff --git a/teensy/Makefile b/teensy/Makefile index 42cb5123e..9db22918c 100644 --- a/teensy/Makefile +++ b/teensy/Makefile @@ -78,12 +78,12 @@ SRC_C = \ hal_ftm.c \ hal_gpio.c \ help.c \ - import.c \ main.c \ lcd.c \ led.c \ - lexermemzip.c \ - memzip.c \ + lib/memzip/import.c \ + lib/memzip/lexermemzip.c \ + lib/memzip/memzip.c \ modpyb.c \ pin_defs_teensy.c \ reg.c \ @@ -92,6 +92,7 @@ SRC_C = \ uart.c \ usb.c \ + STM_SRC_C = $(addprefix stmhal/,\ gccollect.c \ input.c \ @@ -126,12 +127,13 @@ SRC_TEENSY = $(addprefix core/,\ OBJ = $(PY_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o) $(STM_SRC_C:.c=.o) $(STM_SRC_S:.s=.o) $(SRC_TEENSY:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(LIB_SRC_C:.c=.o)) OBJ += $(BUILD)/pins_gen.o +OBJ += $(BUILD)/memzip-files.o all: hex -hex: $(BUILD)/micropython-mz.hex +hex: $(BUILD)/micropython.hex ifeq ($(ARDUINO),) -post_compile: $(BUILD)/micropython-mz.hex +post_compile: $(BUILD)/micropython.hex $(ECHO) "Please define ARDUINO (where TeensyDuino is installed)" exit 1 @@ -142,7 +144,7 @@ reboot: else TOOLS_PATH = $(ARDUINO)/hardware/tools -post_compile: $(BUILD)/micropython-mz.hex +post_compile: $(BUILD)/micropython.hex $(ECHO) "Preparing $@ for upload" $(Q)$(TOOLS_PATH)/teensy_post_compile -file="$(basename $(