lib/memzip: Factor out memzip from teensy/ into lib/memzip.
parent
a9f3030371
commit
074d713bfb
|
@ -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)
|
||||||
|
```
|
||||||
|
|
|
@ -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 <stdint.h>', 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()
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
#include "py/misc.h"
|
#include "py/misc.h"
|
||||||
#include "memzip.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 *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;
|
uint8_t *mem_data;
|
||||||
|
|
||||||
/* Zip file filenames don't have a leading /, so we strip it off */
|
/* 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) {
|
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;
|
uint8_t *mem_data;
|
||||||
|
|
||||||
if (strcmp(filename, "/") == 0) {
|
if (strcmp(filename, "/") == 0) {
|
|
@ -78,12 +78,12 @@ SRC_C = \
|
||||||
hal_ftm.c \
|
hal_ftm.c \
|
||||||
hal_gpio.c \
|
hal_gpio.c \
|
||||||
help.c \
|
help.c \
|
||||||
import.c \
|
|
||||||
main.c \
|
main.c \
|
||||||
lcd.c \
|
lcd.c \
|
||||||
led.c \
|
led.c \
|
||||||
lexermemzip.c \
|
lib/memzip/import.c \
|
||||||
memzip.c \
|
lib/memzip/lexermemzip.c \
|
||||||
|
lib/memzip/memzip.c \
|
||||||
modpyb.c \
|
modpyb.c \
|
||||||
pin_defs_teensy.c \
|
pin_defs_teensy.c \
|
||||||
reg.c \
|
reg.c \
|
||||||
|
@ -92,6 +92,7 @@ SRC_C = \
|
||||||
uart.c \
|
uart.c \
|
||||||
usb.c \
|
usb.c \
|
||||||
|
|
||||||
|
|
||||||
STM_SRC_C = $(addprefix stmhal/,\
|
STM_SRC_C = $(addprefix stmhal/,\
|
||||||
gccollect.c \
|
gccollect.c \
|
||||||
input.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 = $(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 += $(addprefix $(BUILD)/, $(LIB_SRC_C:.c=.o))
|
||||||
OBJ += $(BUILD)/pins_gen.o
|
OBJ += $(BUILD)/pins_gen.o
|
||||||
|
OBJ += $(BUILD)/memzip-files.o
|
||||||
|
|
||||||
all: hex
|
all: hex
|
||||||
hex: $(BUILD)/micropython-mz.hex
|
hex: $(BUILD)/micropython.hex
|
||||||
|
|
||||||
ifeq ($(ARDUINO),)
|
ifeq ($(ARDUINO),)
|
||||||
post_compile: $(BUILD)/micropython-mz.hex
|
post_compile: $(BUILD)/micropython.hex
|
||||||
$(ECHO) "Please define ARDUINO (where TeensyDuino is installed)"
|
$(ECHO) "Please define ARDUINO (where TeensyDuino is installed)"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
|
@ -142,7 +144,7 @@ reboot:
|
||||||
else
|
else
|
||||||
TOOLS_PATH = $(ARDUINO)/hardware/tools
|
TOOLS_PATH = $(ARDUINO)/hardware/tools
|
||||||
|
|
||||||
post_compile: $(BUILD)/micropython-mz.hex
|
post_compile: $(BUILD)/micropython.hex
|
||||||
$(ECHO) "Preparing $@ for upload"
|
$(ECHO) "Preparing $@ for upload"
|
||||||
$(Q)$(TOOLS_PATH)/teensy_post_compile -file="$(basename $(<F))" -path="$(abspath $(<D))" -tools="$(TOOLS_PATH)"
|
$(Q)$(TOOLS_PATH)/teensy_post_compile -file="$(basename $(<F))" -path="$(abspath $(<D))" -tools="$(TOOLS_PATH)"
|
||||||
|
|
||||||
|
@ -163,15 +165,12 @@ ifeq ($(MEMZIP_DIR),)
|
||||||
MEMZIP_DIR = memzip_files
|
MEMZIP_DIR = memzip_files
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(BUILD)/micropython-mz.hex: $(BUILD)/micropython.hex $(shell find ${MEMZIP_DIR} -type f)
|
|
||||||
@$(ECHO) "Creating $@"
|
|
||||||
$(Q)./add-memzip.sh $< $@ ${MEMZIP_DIR}
|
|
||||||
|
|
||||||
$(BUILD)/%.hex: $(BUILD)/%.elf
|
$(BUILD)/%.hex: $(BUILD)/%.elf
|
||||||
$(ECHO) "HEX $<"
|
$(ECHO) "HEX $<"
|
||||||
$(Q)$(OBJCOPY) -O ihex -R .eeprom "$<" "$@"
|
$(Q)$(OBJCOPY) -O ihex -R .eeprom "$<" "$@"
|
||||||
|
|
||||||
MAKE_PINS = make-pins.py
|
MAKE_PINS = make-pins.py
|
||||||
|
MAKE_MEMZIP = ../lib/memzip/make-memzip.py
|
||||||
BOARD_PINS = teensy_pins.csv
|
BOARD_PINS = teensy_pins.csv
|
||||||
AF_FILE = mk20dx256_af.csv
|
AF_FILE = mk20dx256_af.csv
|
||||||
PREFIX_FILE = mk20dx256_prefix.c
|
PREFIX_FILE = mk20dx256_prefix.c
|
||||||
|
@ -197,6 +196,13 @@ $(BUILD)/%_gen.c $(HEADER_BUILD)/%.h $(HEADER_BUILD)/%_af_const.h $(BUILD)/%_qst
|
||||||
$(BUILD)/pins_gen.o: $(BUILD)/pins_gen.c
|
$(BUILD)/pins_gen.o: $(BUILD)/pins_gen.c
|
||||||
$(call compile_c)
|
$(call compile_c)
|
||||||
|
|
||||||
|
$(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)
|
||||||
|
|
||||||
$(BUILD)/%.pp: $(BUILD)/%.c
|
$(BUILD)/%.pp: $(BUILD)/%.c
|
||||||
$(ECHO) "PreProcess $<"
|
$(ECHO) "PreProcess $<"
|
||||||
$(Q)$(CC) $(CFLAGS) -E -Wp,-C,-dD,-dI -o $@ $<
|
$(Q)$(CC) $(CFLAGS) -E -Wp,-C,-dD,-dI -o $@ $<
|
||||||
|
|
Loading…
Reference in New Issue