# Makefile for GPIO Demo Module
-NAME = mod_gpio
+TARGET_DIR = apps/$(NAME)
+
LPC = lpc1224
CPU = cortex-m0
ARCH = armv6-m
CFLAGS = -Wall -O2 -mthumb -mcpu=$(CPU) $(FOPTS)
LINKOPTS = -static -nostartfiles -nostdlib \
-Wl,--gc-sections -Wl,--build-id=none \
- -Wl,-Map=lpc_map_$(LPC).map -Tlpc_link_$(LPC).ld
-
+ -Wl,-Map=$(TARGET_DIR)/lpc_map_$(LPC).map -Tlpc_link_$(LPC).ld
-.PHONY: all
-all: $(NAME).bin
-prog: CFLAGS += -DEEPROM_WRITE
-prog: clean all
+APPS = $(subst apps/,,$(wildcard apps/*))
+.PHONY: all $(APPS)
+all: $(APPS)
INCLUDES = include/
+TARGET_INCLUDES = $(TARGET_DIR)/
OBJDIR = objs
-SRC = $(shell find . -name \*.c)
+SRC = $(wildcard */*.c)
OBJS = ${SRC:%.c=${OBJDIR}/%.o}
+DEPS = ${OBJS:%.o=$(OBJDIR)/%.d}
+
+NAME_SRC = $(wildcard $(TARGET_DIR)/*.c)
+NAME_OBJS = ${NAME_SRC:%.c=${OBJDIR}/%.o}
+NAME_DEPS = ${NAME_OBJS:%.o=$(OBJDIR)/%.d}
+
+-include $(DEPS) $(NAME_DEPS)
+
+.SECONDARY: $(OBJS) $(NAME_OBJS)
+.PRECIOUS: %.elf
+%.elf: $(OBJS) $(NAME_OBJS)
+ @echo "Linking $(NAME) ..."
+ @$(CC) $(LINKOPTS) $(OBJS) $(NAME_OBJS) -o $@
-$(NAME).bin: $(NAME)
+%.bin: %.elf
@echo "Creating image : \e[32m$@\e[39m"
@$(CROSS_COMPILE)objcopy -R .stack -R .bss -O binary $^ $@
@ls -l $@
@echo Done.
-$(NAME): $(OBJS)
- @echo "Linking ..."
- @$(CC) $(CFLAGS) $(LINKOPTS) $(OBJS) -o $@ -I$(INCLUDES)
-
${OBJDIR}/%.o: %.c
@mkdir -p $(dir $@)
@echo "-- compiling" $<
- @$(CC) -MMD -MP -MF ${OBJDIR}/$*.d $(CFLAGS) $< -c -o $@ -I$(INCLUDES)
+ @$(CC) -MMD -MP -MF ${OBJDIR}/$*.d $(CFLAGS) $< -c -o $@ -I$(INCLUDES) -I$(TARGET_INCLUDES)
+
+
+$(APPS):
+ @make --no-print-directory NAME=$@ apps/$@/$@.bin
+
+all_apps: $(APPS)
clean:
- find ${OBJDIR} -name "*.o" -exec rm {} \;
- find ${OBJDIR} -name "*.d" -exec rm {} \;
- rm -f *.map
+ rm -rf $(OBJDIR)
mrproper: clean
- rm -f $(NAME)*
+ rm -f apps/*/*.bin apps/*/*.elf apps/*/*.map
It has support for the LPC1224 as used on this development module, and
for the peripherals found on the development module (Led, eeprom and
temperature sensor).
+Support for various other cool stuff is added when we play with it.
-By default, both uarts are configured to echo any received character.
-The programm will send the identification found in the EEPROM once and
-then send the temperature in an endless loop on UART1, while playing with
-the status LED.
+Example applications are created in the apps directory, with one
+sub-directory for each application. These are (and must stay) independent.
-More usefull stuff is up to you.
+More usefull stuff is up to you. Creating an app is *very* simple. Copy
+an example from apps/ to the name you want and simply change "NAME" in the
+Makefile to the name of your new directory. Please, no spaces in the name !
********************
BUID and FLASH
Build has been tested using gcc, and only gcc, in the version provided by
-the emdebian project, but any ARM gcc toolchain should do.
+the emdebian project, and a few other binary versions available for
+download on the Internet, but any ARM gcc toolchain should do.
In order to get the emdebian ARM gcc cross-toolchain you should add this
repository to your apt sources :
deb http://www.emdebian.org/debian/ unstable main
and then update and install package gcc-4.7-arm-linux-gnueabi
-It may be required that you create a symlink in /usr/bin for the arm gcc
- cd /usr/bin && ln -s arm-linux-gnueabi-gcc-4.7 arm-linux-gnueabi-gcc
+It may be required that you update the alternatives for this compiler, with
+a line like this one :
+ update-alternatives --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-gcc-4.7 60
There's no need for the related libc package here, the libc does not fit
in our micro-controller memory. Instead have a look at the content of the
lib/ directory, and add stuff there.
Once done you should build using the provided makefile by running the
-simple "make" command.
-
-To flash the binary (the one with .bin) to the LPC Flash you will need
-our lpctool package (not yet packaged for Debian as of 2013-11-06)
-available in our git repository : http://git.techno-innov.fr/lpctools
+simple "make" command in the base directory, which will build all apps, or
+run "make <app_name>" to build a specific application. You can also run the
+simple "make" command in the specific app subdirectory to compile this
+application alone.
+
+To flash the binary (the one with .bin) to the LPC Flash you will need the
+lpctool package, now packaged for Debian, starting with Jessie, or available
+in our git repository : http://git.techno-innov.fr/lpctools
Clone using :
git clone http://gitclone.techno-innov.fr/lpctools
Then build (make) and use :)
Usual command lines :
./lpcprog -d /dev/ttyUSB0 -c id
- ./lpcprog -d /dev/ttyUSB0 -c flash mod_gpio.bin
+ ./lpcprog -d /dev/ttyUSB0 -c flash app_name.bin
See lpctools readme and lpcprog or isp help (-h) or manpages for more
information.
- Interrupts
- ROM based division routines
- Utility functions to replace ctz and clz instructions (not present in Cortex M0)
+ - IAP ROM based functions (tested for user flash access only)
- Bootstrap
- vector table
- flash accelerator configuration
- watchdog (stop)
- clock / PLL config
- - call of existing/used drivers configuration routines
- systick
- precise msleep and usleep functions (using systick)
- counter / timers
+ - pio configuration
- Simple C Library
- memcpy and memset
- strcpy, strncpy, strcmp, strncmp, strchr, strrchr, strlen, strnlen
- snprintf, vsnprintf
-- Interface drivers
+- Integrated Interface drivers
- UART (as UART or RS485)
- I²C
- - I²C EEPROM
- - TMP101 I²C temperature sensor
- ADC
- GPIO
- GPIO interrupts
- SPI (SSP)
+ - PWM
+
+- External Device drivers
+ - I²C EEPROM
+ - TMP101 I²C temperature sensor
+ - DHT11 temperatur and Humidity sensor
+ - CC1101 Sub 1GHz RF Transceiver
+ - Status led
********************
- RTC Support
- Comparator support
- Watchdog support
-- Flash IAP support
- CRC engine support
- Test UART IrDA mode