From ccd15e30330f168e9c48aab01b8efb81e4b39998 Mon Sep 17 00:00:00 2001 From: batt Date: Fri, 28 May 2010 14:55:34 +0000 Subject: [PATCH] Remove old tests. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3876 38d2e660-2303-0410-9eaa-f027e97ec537 --- examples/at91sam7/at91sam7.c | 196 ---------- examples/at91sam7/at91sam7s.mk | 54 --- examples/at91sam7/at91sam7x.mk | 56 --- examples/at91sam7/cfg/cfg_monitor.h | 48 --- examples/at91sam7/cfg/cfg_proc.h | 108 ------ examples/at91sam7/cfg/cfg_sem.h | 48 --- examples/at91sam7/cfg/cfg_ser.h | 107 ------ examples/at91sam7/cfg/cfg_signal.h | 48 --- examples/at91sam7/cfg/cfg_timer.h | 55 --- examples/at91sam7/hw/hw_ser.h | 40 -- examples/at91sam7/verstag.h | 94 ----- examples/lm3s1968/cfg/cfg_debug.h | 53 --- examples/lm3s1968/cfg/cfg_gfx.h | 74 ---- examples/lm3s1968/cfg/cfg_heap.h | 49 --- examples/lm3s1968/cfg/cfg_kfile.h | 62 ---- examples/lm3s1968/cfg/cfg_lcd.h | 68 ---- examples/lm3s1968/cfg/cfg_monitor.h | 47 --- examples/lm3s1968/cfg/cfg_proc.h | 107 ------ examples/lm3s1968/cfg/cfg_sem.h | 47 --- examples/lm3s1968/cfg/cfg_ser.h | 222 ------------ examples/lm3s1968/cfg/cfg_signal.h | 47 --- examples/lm3s1968/cfg/cfg_timer.h | 66 ---- examples/lm3s1968/hw/hw_kbd.h | 69 ---- examples/lm3s1968/hw/hw_rit128x96.h | 122 ------- examples/lm3s1968/hw/kbd_map.h | 70 ---- examples/lm3s1968/lm3s1968.c | 375 ------------------- examples/lm3s1968/lm3s1968.mk | 84 ----- examples/lpc2378/cfg/cfg_adc.h | 110 ------ examples/lpc2378/cfg/cfg_afsk.h | 114 ------ examples/lpc2378/cfg/cfg_ax25.h | 76 ---- examples/lpc2378/cfg/cfg_battfs.h | 68 ---- examples/lpc2378/cfg/cfg_dataflash.h | 56 --- examples/lpc2378/cfg/cfg_dc_motor.h | 67 ---- examples/lpc2378/cfg/cfg_debug.h | 55 --- examples/lpc2378/cfg/cfg_fat.h | 140 ------- examples/lpc2378/cfg/cfg_flash25.h | 52 --- examples/lpc2378/cfg/cfg_formatwr.h | 67 ---- examples/lpc2378/cfg/cfg_heap.h | 51 --- examples/lpc2378/cfg/cfg_i2c.h | 90 ----- examples/lpc2378/cfg/cfg_i2s.h | 75 ---- examples/lpc2378/cfg/cfg_ini_reader.h | 49 --- examples/lpc2378/cfg/cfg_kbd.h | 59 --- examples/lpc2378/cfg/cfg_kfile.h | 62 ---- examples/lpc2378/cfg/cfg_lcd.h | 72 ---- examples/lpc2378/cfg/cfg_lm75.h | 57 --- examples/lpc2378/cfg/cfg_md2.h | 54 --- examples/lpc2378/cfg/cfg_monitor.h | 48 --- examples/lpc2378/cfg/cfg_nmea.h | 85 ----- examples/lpc2378/cfg/cfg_phase.h | 56 --- examples/lpc2378/cfg/cfg_pocketbus.h | 50 --- examples/lpc2378/cfg/cfg_proc.h | 108 ------ examples/lpc2378/cfg/cfg_pwm.h | 57 --- examples/lpc2378/cfg/cfg_ramp.h | 116 ------ examples/lpc2378/cfg/cfg_randpool.h | 56 --- examples/lpc2378/cfg/cfg_sem.h | 48 --- examples/lpc2378/cfg/cfg_ser.h | 222 ------------ examples/lpc2378/cfg/cfg_signal.h | 48 --- examples/lpc2378/cfg/cfg_spi_bitbang.h | 52 --- examples/lpc2378/cfg/cfg_stepper.h | 70 ---- examples/lpc2378/cfg/cfg_tas5706a.h | 51 --- examples/lpc2378/cfg/cfg_thermo.h | 58 --- examples/lpc2378/cfg/cfg_timer.h | 68 ---- examples/lpc2378/cfg/cfg_wdt.h | 48 --- examples/lpc2378/cfg/cfg_xmodem.h | 67 ---- examples/lpc2378/hw/hw_afsk.h | 87 ----- examples/lpc2378/hw/hw_buzzer.h | 52 --- examples/lpc2378/hw/hw_dataflash.c | 126 ------- examples/lpc2378/hw/hw_dataflash.h | 48 --- examples/lpc2378/hw/hw_dc_motor.h | 85 ----- examples/lpc2378/hw/hw_ft245rl.h | 65 ---- examples/lpc2378/hw/hw_i2c_bitbang.h | 66 ---- examples/lpc2378/hw/hw_kbd.h | 72 ---- examples/lpc2378/hw/hw_lcd_32122a.h | 155 -------- examples/lpc2378/hw/hw_lcd_hd44.h | 157 -------- examples/lpc2378/hw/hw_led.h | 49 --- examples/lpc2378/hw/hw_lm75.h | 49 --- examples/lpc2378/hw/hw_mcp41.c | 53 --- examples/lpc2378/hw/hw_mcp41.h | 75 ---- examples/lpc2378/hw/hw_ntc.c | 46 --- examples/lpc2378/hw/hw_ntc.h | 136 ------- examples/lpc2378/hw/hw_phase.c | 46 --- examples/lpc2378/hw/hw_phase.h | 80 ---- examples/lpc2378/hw/hw_sd.h | 53 --- examples/lpc2378/hw/hw_ser.h | 53 --- examples/lpc2378/hw/hw_sipo.h | 109 ------ examples/lpc2378/hw/hw_spi.h | 115 ------ examples/lpc2378/hw/hw_stepper.h | 309 ---------------- examples/lpc2378/hw/hw_tas5706a.h | 65 ---- examples/lpc2378/hw/hw_thermo.h | 182 ---------- examples/lpc2378/hw/hw_tlv5618.h | 69 ---- examples/lpc2378/hw/hw_tmp123.h | 52 --- examples/lpc2378/hw/kbd_map.h | 71 ---- examples/lpc2378/hw/mcp41_map.h | 59 --- examples/lpc2378/hw/ntc_map.h | 61 ---- examples/lpc2378/hw/phase_map.h | 58 --- examples/lpc2378/hw/pwm_map.h | 61 ---- examples/lpc2378/hw/thermo_map.h | 70 ---- examples/lpc2378/lpc2378.mk | 65 ---- examples/lpc2378/lpc2378_wiz.mk | 82 ----- examples/lpc2378/main.c | 91 ----- examples/stm32p103/cfg/cfg_debug.h | 53 --- examples/stm32p103/cfg/cfg_gfx.h | 74 ---- examples/stm32p103/cfg/cfg_heap.h | 49 --- examples/stm32p103/cfg/cfg_kfile.h | 62 ---- examples/stm32p103/cfg/cfg_lcd.h | 68 ---- examples/stm32p103/cfg/cfg_monitor.h | 47 --- examples/stm32p103/cfg/cfg_proc.h | 107 ------ examples/stm32p103/cfg/cfg_sem.h | 47 --- examples/stm32p103/cfg/cfg_ser.h | 222 ------------ examples/stm32p103/cfg/cfg_signal.h | 47 --- examples/stm32p103/cfg/cfg_timer.h | 66 ---- examples/stm32p103/main.c | 82 ----- examples/stm32p103/stm32p103.mk | 63 ---- examples/triface/boot/cfg/cfg_arch.h | 57 --- examples/triface/boot/cfg/cfg_debug.h | 49 --- examples/triface/boot/cfg/cfg_formatwr.h | 56 --- examples/triface/boot/cfg/cfg_kfile.h | 51 --- examples/triface/boot/cfg/cfg_proc.h | 99 ----- examples/triface/boot/cfg/cfg_ser.h | 108 ------ examples/triface/boot/hw/hw_boot.h | 71 ---- examples/triface/boot/hw/hw_ser.h | 45 --- examples/triface/boot/main.c | 123 ------- examples/triface/cfg/cfg_arch.h | 57 --- examples/triface/cfg/cfg_debug.h | 49 --- examples/triface/cfg/cfg_kfile.h | 51 --- examples/triface/cfg/cfg_proc.h | 99 ----- examples/triface/cfg/cfg_ser.h | 114 ------ examples/triface/cfg/cfg_wdt.h | 48 --- examples/triface/cmd_ctor.h | 59 --- examples/triface/doc/PROTOCOL | 84 ----- examples/triface/doc/schematics/TRIFACE.DSN | Bin 1390592 -> 0 bytes examples/triface/doc/schematics/triface.opj | 36 -- examples/triface/hw/hw_adc.c | 107 ------ examples/triface/hw/hw_adc.h | 61 ---- examples/triface/hw/hw_buzzer.h | 53 --- examples/triface/hw/hw_input.h | 71 ---- examples/triface/hw/hw_ser.h | 52 --- examples/triface/hw/hw_sipo.h | 149 -------- examples/triface/protocol.c | 382 -------------------- examples/triface/protocol.h | 50 --- examples/triface/triface.c | 93 ----- examples/triface/triface.mk | 106 ------ examples/triface/verstag.h | 95 ----- 143 files changed, 11632 deletions(-) delete mode 100644 examples/at91sam7/at91sam7.c delete mode 100644 examples/at91sam7/at91sam7s.mk delete mode 100644 examples/at91sam7/at91sam7x.mk delete mode 100644 examples/at91sam7/cfg/cfg_monitor.h delete mode 100644 examples/at91sam7/cfg/cfg_proc.h delete mode 100644 examples/at91sam7/cfg/cfg_sem.h delete mode 100644 examples/at91sam7/cfg/cfg_ser.h delete mode 100644 examples/at91sam7/cfg/cfg_signal.h delete mode 100644 examples/at91sam7/cfg/cfg_timer.h delete mode 100644 examples/at91sam7/hw/hw_ser.h delete mode 100644 examples/at91sam7/verstag.h delete mode 100644 examples/lm3s1968/cfg/cfg_debug.h delete mode 100644 examples/lm3s1968/cfg/cfg_gfx.h delete mode 100644 examples/lm3s1968/cfg/cfg_heap.h delete mode 100644 examples/lm3s1968/cfg/cfg_kfile.h delete mode 100644 examples/lm3s1968/cfg/cfg_lcd.h delete mode 100644 examples/lm3s1968/cfg/cfg_monitor.h delete mode 100644 examples/lm3s1968/cfg/cfg_proc.h delete mode 100644 examples/lm3s1968/cfg/cfg_sem.h delete mode 100644 examples/lm3s1968/cfg/cfg_ser.h delete mode 100644 examples/lm3s1968/cfg/cfg_signal.h delete mode 100644 examples/lm3s1968/cfg/cfg_timer.h delete mode 100644 examples/lm3s1968/hw/hw_kbd.h delete mode 100644 examples/lm3s1968/hw/hw_rit128x96.h delete mode 100644 examples/lm3s1968/hw/kbd_map.h delete mode 100644 examples/lm3s1968/lm3s1968.c delete mode 100644 examples/lm3s1968/lm3s1968.mk delete mode 100644 examples/lpc2378/cfg/cfg_adc.h delete mode 100644 examples/lpc2378/cfg/cfg_afsk.h delete mode 100644 examples/lpc2378/cfg/cfg_ax25.h delete mode 100644 examples/lpc2378/cfg/cfg_battfs.h delete mode 100644 examples/lpc2378/cfg/cfg_dataflash.h delete mode 100644 examples/lpc2378/cfg/cfg_dc_motor.h delete mode 100644 examples/lpc2378/cfg/cfg_debug.h delete mode 100644 examples/lpc2378/cfg/cfg_fat.h delete mode 100644 examples/lpc2378/cfg/cfg_flash25.h delete mode 100644 examples/lpc2378/cfg/cfg_formatwr.h delete mode 100644 examples/lpc2378/cfg/cfg_heap.h delete mode 100644 examples/lpc2378/cfg/cfg_i2c.h delete mode 100644 examples/lpc2378/cfg/cfg_i2s.h delete mode 100644 examples/lpc2378/cfg/cfg_ini_reader.h delete mode 100644 examples/lpc2378/cfg/cfg_kbd.h delete mode 100644 examples/lpc2378/cfg/cfg_kfile.h delete mode 100644 examples/lpc2378/cfg/cfg_lcd.h delete mode 100644 examples/lpc2378/cfg/cfg_lm75.h delete mode 100644 examples/lpc2378/cfg/cfg_md2.h delete mode 100644 examples/lpc2378/cfg/cfg_monitor.h delete mode 100644 examples/lpc2378/cfg/cfg_nmea.h delete mode 100644 examples/lpc2378/cfg/cfg_phase.h delete mode 100644 examples/lpc2378/cfg/cfg_pocketbus.h delete mode 100644 examples/lpc2378/cfg/cfg_proc.h delete mode 100644 examples/lpc2378/cfg/cfg_pwm.h delete mode 100644 examples/lpc2378/cfg/cfg_ramp.h delete mode 100644 examples/lpc2378/cfg/cfg_randpool.h delete mode 100644 examples/lpc2378/cfg/cfg_sem.h delete mode 100644 examples/lpc2378/cfg/cfg_ser.h delete mode 100644 examples/lpc2378/cfg/cfg_signal.h delete mode 100644 examples/lpc2378/cfg/cfg_spi_bitbang.h delete mode 100644 examples/lpc2378/cfg/cfg_stepper.h delete mode 100644 examples/lpc2378/cfg/cfg_tas5706a.h delete mode 100644 examples/lpc2378/cfg/cfg_thermo.h delete mode 100644 examples/lpc2378/cfg/cfg_timer.h delete mode 100644 examples/lpc2378/cfg/cfg_wdt.h delete mode 100644 examples/lpc2378/cfg/cfg_xmodem.h delete mode 100644 examples/lpc2378/hw/hw_afsk.h delete mode 100644 examples/lpc2378/hw/hw_buzzer.h delete mode 100644 examples/lpc2378/hw/hw_dataflash.c delete mode 100644 examples/lpc2378/hw/hw_dataflash.h delete mode 100644 examples/lpc2378/hw/hw_dc_motor.h delete mode 100644 examples/lpc2378/hw/hw_ft245rl.h delete mode 100644 examples/lpc2378/hw/hw_i2c_bitbang.h delete mode 100644 examples/lpc2378/hw/hw_kbd.h delete mode 100644 examples/lpc2378/hw/hw_lcd_32122a.h delete mode 100644 examples/lpc2378/hw/hw_lcd_hd44.h delete mode 100644 examples/lpc2378/hw/hw_led.h delete mode 100644 examples/lpc2378/hw/hw_lm75.h delete mode 100644 examples/lpc2378/hw/hw_mcp41.c delete mode 100644 examples/lpc2378/hw/hw_mcp41.h delete mode 100644 examples/lpc2378/hw/hw_ntc.c delete mode 100644 examples/lpc2378/hw/hw_ntc.h delete mode 100644 examples/lpc2378/hw/hw_phase.c delete mode 100644 examples/lpc2378/hw/hw_phase.h delete mode 100644 examples/lpc2378/hw/hw_sd.h delete mode 100644 examples/lpc2378/hw/hw_ser.h delete mode 100644 examples/lpc2378/hw/hw_sipo.h delete mode 100644 examples/lpc2378/hw/hw_spi.h delete mode 100644 examples/lpc2378/hw/hw_stepper.h delete mode 100644 examples/lpc2378/hw/hw_tas5706a.h delete mode 100644 examples/lpc2378/hw/hw_thermo.h delete mode 100644 examples/lpc2378/hw/hw_tlv5618.h delete mode 100644 examples/lpc2378/hw/hw_tmp123.h delete mode 100644 examples/lpc2378/hw/kbd_map.h delete mode 100644 examples/lpc2378/hw/mcp41_map.h delete mode 100644 examples/lpc2378/hw/ntc_map.h delete mode 100644 examples/lpc2378/hw/phase_map.h delete mode 100644 examples/lpc2378/hw/pwm_map.h delete mode 100644 examples/lpc2378/hw/thermo_map.h delete mode 100644 examples/lpc2378/lpc2378.mk delete mode 100644 examples/lpc2378/lpc2378_wiz.mk delete mode 100644 examples/lpc2378/main.c delete mode 100644 examples/stm32p103/cfg/cfg_debug.h delete mode 100644 examples/stm32p103/cfg/cfg_gfx.h delete mode 100644 examples/stm32p103/cfg/cfg_heap.h delete mode 100644 examples/stm32p103/cfg/cfg_kfile.h delete mode 100644 examples/stm32p103/cfg/cfg_lcd.h delete mode 100644 examples/stm32p103/cfg/cfg_monitor.h delete mode 100644 examples/stm32p103/cfg/cfg_proc.h delete mode 100644 examples/stm32p103/cfg/cfg_sem.h delete mode 100644 examples/stm32p103/cfg/cfg_ser.h delete mode 100644 examples/stm32p103/cfg/cfg_signal.h delete mode 100644 examples/stm32p103/cfg/cfg_timer.h delete mode 100644 examples/stm32p103/main.c delete mode 100644 examples/stm32p103/stm32p103.mk delete mode 100644 examples/triface/boot/cfg/cfg_arch.h delete mode 100644 examples/triface/boot/cfg/cfg_debug.h delete mode 100644 examples/triface/boot/cfg/cfg_formatwr.h delete mode 100644 examples/triface/boot/cfg/cfg_kfile.h delete mode 100644 examples/triface/boot/cfg/cfg_proc.h delete mode 100644 examples/triface/boot/cfg/cfg_ser.h delete mode 100644 examples/triface/boot/hw/hw_boot.h delete mode 100644 examples/triface/boot/hw/hw_ser.h delete mode 100644 examples/triface/boot/main.c delete mode 100644 examples/triface/cfg/cfg_arch.h delete mode 100644 examples/triface/cfg/cfg_debug.h delete mode 100644 examples/triface/cfg/cfg_kfile.h delete mode 100644 examples/triface/cfg/cfg_proc.h delete mode 100644 examples/triface/cfg/cfg_ser.h delete mode 100644 examples/triface/cfg/cfg_wdt.h delete mode 100644 examples/triface/cmd_ctor.h delete mode 100644 examples/triface/doc/PROTOCOL delete mode 100644 examples/triface/doc/schematics/TRIFACE.DSN delete mode 100644 examples/triface/doc/schematics/triface.opj delete mode 100644 examples/triface/hw/hw_adc.c delete mode 100644 examples/triface/hw/hw_adc.h delete mode 100644 examples/triface/hw/hw_buzzer.h delete mode 100644 examples/triface/hw/hw_input.h delete mode 100644 examples/triface/hw/hw_ser.h delete mode 100644 examples/triface/hw/hw_sipo.h delete mode 100644 examples/triface/protocol.c delete mode 100644 examples/triface/protocol.h delete mode 100644 examples/triface/triface.c delete mode 100644 examples/triface/triface.mk delete mode 100644 examples/triface/verstag.h diff --git a/examples/at91sam7/at91sam7.c b/examples/at91sam7/at91sam7.c deleted file mode 100644 index b8ef86c8..00000000 --- a/examples/at91sam7/at91sam7.c +++ /dev/null @@ -1,196 +0,0 @@ -/** - * \file - * - * - * \version $Id$ - * - * \author Francesco Sacchi - * \author Daniele Basile - * - * \brief Simple BeRTOS test on AT91SAM7X-EK evaluation board. - * - * This short program shows you a simple demo of some BeRTOS feature: - * - * - Debug system - * - Timer interrupt - * - Serial - * - Cooperative BeRTOS Kernel - * - */ - -#include "cfg/cfg_ser.h" -#include - -#include -#include - -#include - -#include -#include -#include - -#include - -Timer leds_timer; -Serial ser_fd; - -enum -{ - FORWARD, - BACKWARD, -}; - -int direction = FORWARD; - -static void leds_init(void) -{ - #if CPU_ARM_AT91SAM7X256 - /* Set PB19..22 connected to PIOB */ - PIOB_PER = 0x780000; - /* Set PB19..22 as output */ - PIOB_OER = 0x780000; - - /* Set PB19..22 to 1 to turn off leds */ - PIOB_SODR = 0x780000; - - /* turn first led on (PB19) */ - PIOB_CODR = 0x80000; - #elif CPU_ARM_AT91SAM7S256 - /* Set PA0..3 connected to PIOA */ - PIOA_PER = 0x0000001f; - /* Set PA0..3 as output */ - PIOA_OER = 0x0000001f; - - /* Set PA0..3 to 1 to turn off leds */ - PIOA_SODR = 0x0000000f; - /* turn first led on (PA0) */ - PIOA_CODR = 0x00000001; - #endif -} - -#if CPU_ARM_AT91SAM7X256 - #define GET_PIO_STATUS() (~PIOB_ODSR & 0x780000) - #define LAST_LED 0x200000 - #define FIRST_LED 0x100000 - #define SET_PIO_BITS PIOB_SODR - #define CLEAR_PIO_BITS PIOB_CODR - #define AT91SAM7_MSG "BeRTOS is running on AT91SAM7X256..\n" -#elif CPU_ARM_AT91SAM7S256 - #define GET_PIO_STATUS() (~PIOA_ODSR & 0x0000000f) - #define LAST_LED 0x00000004 - #define FIRST_LED 0x00000002 - #define SET_PIO_BITS PIOA_SODR - #define CLEAR_PIO_BITS PIOA_CODR - #define AT91SAM7_MSG "BeRTOS is running on AT91SAM7S256..\n" -#endif - -/* - * Knight Rider leds effect.. - */ -static void leds_toggle(void) -{ - uint32_t led_status = GET_PIO_STATUS(); - - // Turn on led in forward direction - if (direction == FORWARD) - { - if(led_status == LAST_LED) - direction = BACKWARD; - - SET_PIO_BITS = led_status; - CLEAR_PIO_BITS = led_status << 1; - } - // Turn on led in backward direction - else if (direction == BACKWARD) - { - if(led_status == FIRST_LED) - direction = FORWARD; - - SET_PIO_BITS = led_status; - CLEAR_PIO_BITS = led_status >> 1; - } - - /* Wait for interval time */ - timer_setDelay(&leds_timer, ms_to_ticks(100)); - timer_add(&leds_timer); -} - -int main(void) -{ char msg[]="BeRTOS, be fast be beatiful be realtime"; - - - kdbg_init(); - timer_init(); - proc_init(); - leds_init(); - - ASSERT(!IRQ_ENABLED()); - - /* Open the main communication port */ - ser_init(&ser_fd, 0); - ser_setbaudrate(&ser_fd, 115200); - ser_setparity(&ser_fd, SER_PARITY_NONE); - - IRQ_ENABLE; - ASSERT(IRQ_ENABLED()); - - /* - * Register timer and arm timer interupt. - */ - timer_setSoftint(&leds_timer, (Hook)leds_toggle, 0); - timer_setDelay(&leds_timer, ms_to_ticks(100)); - timer_add(&leds_timer); - - /* - * Run process test. - */ - if(!proc_testRun()) - kfile_printf(&ser_fd.fd, "ProcTest..ok!\n"); - else - kfile_printf(&ser_fd.fd, "ProcTest..FAIL!\n"); - /* - * Run signal test. - */ - if(!signal_testRun()) - kfile_printf(&ser_fd.fd, "SignalTest..ok!\n"); - else - kfile_printf(&ser_fd.fd, "SignalTest..FAIL!\n"); - - kputs(AT91SAM7_MSG); - - // Main loop - for(;;) - { - kfile_printf(&ser_fd.fd, "From serial 0: %s\r\n", msg); - } - return 0; -} diff --git a/examples/at91sam7/at91sam7s.mk b/examples/at91sam7/at91sam7s.mk deleted file mode 100644 index 451e4e90..00000000 --- a/examples/at91sam7/at91sam7s.mk +++ /dev/null @@ -1,54 +0,0 @@ -# -# $Id: at91sam7s.mk 18234 2007-10-08 13:39:48Z rasky $ -# Copyright 2006 Develer S.r.l. (http://www.develer.com/) -# All rights reserved. -# -# Makefile fragment for DevLib at91sam7s application. -# -# Author: Bernie Innocenti -# -# - -# Set to 1 for debug builds -at91sam7s_DEBUG = 1 - -# Our target application -TRG += at91sam7s - -at91sam7s_CSRC = \ - examples/at91sam7/at91sam7.c \ - bertos/drv/timer.c \ - bertos/drv/ser.c \ - bertos/cpu/arm/drv/sysirq_at91.c \ - bertos/cpu/arm/drv/ser_at91.c \ - bertos/cpu/arm/drv/timer_at91.c \ - bertos/mware/event.c \ - bertos/mware/formatwr.c \ - bertos/mware/hex.c \ - bertos/mware/sprintf.c \ - bertos/kern/kfile.c \ - bertos/kern/proc.c \ - bertos/kern/proc_test.c \ - bertos/kern/signal_test.c \ - bertos/kern/monitor.c \ - bertos/kern/signal.c \ - # - -at91sam7s_CPPASRC = \ - bertos/cpu/arm/hw/crtat91sam7_rom.S \ - bertos/cpu/arm/hw/switch_ctx_arm.S \ - # - -at91sam7s_PREFIX = arm-none-eabi- - -at91sam7s_CPPAFLAGS = -O0 -g -gdwarf-2 -g -at91sam7s_CPPFLAGS = -O0 -D'ARCH=0' -D__ARM_AT91SAM7S256__ -D'CPU_FREQ=(48023000UL)' -D'WIZ_AUTOGEN' -g3 -gdwarf-2 -fverbose-asm -Iexamples/at91sam7 -Ibertos/cpu/arm -at91sam7s_LDFLAGS = -nostartfiles -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld -Wl,--no-warn-mismatch -at91sam7s_CPU = arm7tdmi - -at91sam7s_PROGRAMMER_CPU = at91sam7 -at91sam7s_PROGRAMMER_TYPE = jtag-tiny -at91sam7s_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh -at91sam7s_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh -at91sam7s_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh -at91sam7s_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh diff --git a/examples/at91sam7/at91sam7x.mk b/examples/at91sam7/at91sam7x.mk deleted file mode 100644 index fe48a2ea..00000000 --- a/examples/at91sam7/at91sam7x.mk +++ /dev/null @@ -1,56 +0,0 @@ -# -# $Id: at91sam7x.mk 18234 2007-10-08 13:39:48Z rasky $ -# Copyright 2006 Develer S.r.l. (http://www.develer.com/) -# All rights reserved. -# -# Makefile fragment for DevLib at91sam7x application. -# -# Author: Bernie Innocenti -# -# - -# Set to 1 for debug builds -at91sam7x_DEBUG = 1 - -# Our target application -TRG += at91sam7x - -at91sam7x_CSRC = \ - examples/at91sam7/at91sam7.c \ - bertos/drv/timer.c \ - bertos/drv/ser.c \ - bertos/cpu/arm/drv/sysirq_at91.c \ - bertos/cpu/arm/drv/ser_at91.c \ - bertos/cpu/arm/drv/timer_at91.c \ - bertos/mware/event.c \ - bertos/mware/formatwr.c \ - bertos/mware/hex.c \ - bertos/mware/sprintf.c \ - bertos/struct/heap.c \ - bertos/kern/kfile.c \ - bertos/kern/proc.c \ - bertos/kern/proc_test.c \ - bertos/kern/signal_test.c \ - bertos/kern/monitor.c \ - bertos/kern/signal.c \ - # - -at91sam7x_CPPASRC = \ - bertos/cpu/arm/hw/crtat91sam7_rom.S \ - bertos/cpu/arm/hw/switch_ctx_arm.S \ - # - -at91sam7x_PREFIX = arm-none-eabi- - -at91sam7x_CPPAFLAGS = -O0 -g -gdwarf-2 -g -at91sam7x_CPPFLAGS = -O0 -D'ARCH=0' -D__ARM_AT91SAM7X256__ -D'CPU_FREQ=(48023000UL)' -D'WIZ_AUTOGEN' -g3 -gdwarf-2 -fverbose-asm -Iexamples/at91sam7 -Ibertos/cpu/arm -fno-strict-aliasing -fwrapv -at91sam7x_LDFLAGS = -nostartfiles -T bertos/cpu/arm/scripts/at91sam7_256_rom.ld -Wl,--no-warn-mismatch - -at91sam7x_CPU = arm7tdmi - -at91sam7x_PROGRAMMER_CPU = at91sam7 -at91sam7x_PROGRAMMER_TYPE = jtag-tiny -at91sam7x_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh -at91sam7x_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh -at91sam7x_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh -at91sam7x_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh diff --git a/examples/at91sam7/cfg/cfg_monitor.h b/examples/at91sam7/cfg/cfg_monitor.h deleted file mode 100644 index 6391b407..00000000 --- a/examples/at91sam7/cfg/cfg_monitor.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * \file - * - * - * \brief Kernel monitor configuration parameters - * - * \version $Id$ - * \author Bernie Innocenti - */ - -#ifndef CFG_MONITOR_H -#define CFG_MONITOR_H - -/** - * Process monitor. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_MONITOR 1 - -#endif /* CFG_MONITOR_H */ diff --git a/examples/at91sam7/cfg/cfg_proc.h b/examples/at91sam7/cfg/cfg_proc.h deleted file mode 100644 index c59f6715..00000000 --- a/examples/at91sam7/cfg/cfg_proc.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * \file - * - * - * \brief Kernel configuration parameters - * - * \version $Id$ - * \author Bernie Innocenti - */ - -#ifndef CFG_PROC_H -#define CFG_PROC_H - -/** - * Enable the multithreading kernel. - * - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN 1 - -/** - * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! - * $WIZ$ type = "boolean" - * $WIZ$ supports = "False" - */ -#define CONFIG_KERN_IRQ 0 - -/** - * Dynamic memory allocation for processes. - * $WIZ$ type = "boolean" - * $WIZ$ conditional_deps = "heap" - */ -#define CONFIG_KERN_HEAP 0 - -/** - * Size of the dynamic memory pool used by processes. - * $WIZ$ type = "int" - * $WIZ$ min = 0 - */ -#define CONFIG_KERN_HEAP_SIZE 16384L - -/** - * Preemptive process scheduling. - * - * $WIZ$ type = "boolean" - * $WIZ$ conditional_deps = "timer" - */ -#define CONFIG_KERN_PREEMPT 1 - -/** - * Priority-based scheduling policy. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_PRI 1 - -/** - * Time sharing quantum (a prime number prevents interference effects) [ms]. - * - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_KERN_QUANTUM 11 - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define KERN_LOG_LEVEL LOG_LVL_ERR - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define KERN_LOG_FORMAT LOG_FMT_VERBOSE - -#endif /* CFG_PROC_H */ diff --git a/examples/at91sam7/cfg/cfg_sem.h b/examples/at91sam7/cfg/cfg_sem.h deleted file mode 100644 index 86ed110d..00000000 --- a/examples/at91sam7/cfg/cfg_sem.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * \file - * - * - * \brief Kernel semaphores configuration parameters. - * - * \version $Id$ - * \author Bernie Innocenti - */ - -#ifndef CFG_SEM_H -#define CFG_SEM_H - -/** - * Re-entrant mutual exclusion primitives. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_SEMAPHORES 1 - -#endif /* CFG_SEM_H */ diff --git a/examples/at91sam7/cfg/cfg_ser.h b/examples/at91sam7/cfg/cfg_ser.h deleted file mode 100644 index 27b14c3e..00000000 --- a/examples/at91sam7/cfg/cfg_ser.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for serial module. - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef CFG_SER_H -#define CFG_SER_H - -/** - * Example of setting for serial port and - * spi port. - * Edit these define for your project. - */ - -/// [bytes] Size of the outbound FIFO buffer for port 0. -#define CONFIG_UART0_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for port 0. -#define CONFIG_UART0_RXBUFSIZE 32 - -/// [bytes] Size of the outbound FIFO buffer for port 1. -#define CONFIG_UART1_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for port 1. -#define CONFIG_UART1_RXBUFSIZE 32 - - -/// [bytes] Size of the outbound FIFO buffer for SPI port (AVR only) -#define CONFIG_SPI_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for SPI port (AVR only) -#define CONFIG_SPI_RXBUFSIZE 32 - -/// [bytes] Size of the outbound FIFO buffer for SPI port 0. -#define CONFIG_SPI0_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for SPI port 0. -#define CONFIG_SPI0_RXBUFSIZE 32 - -/// [bytes] Size of the outbound FIFO buffer for SPI port 1. -#define CONFIG_SPI1_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for SPI port 1. -#define CONFIG_SPI1_RXBUFSIZE 32 - -/// SPI data order (AVR only). -#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST - -/// SPI clock division factor (AVR only). -#define CONFIG_SPI_CLOCK_DIV 16 - -/// SPI clock polarity: 0 = normal low, 1 = normal high (AVR only). -#define CONFIG_SPI_CLOCK_POL 0 - -/// SPI clock phase: 0 = sample on first edge, 1 = sample on second clock edge (AVR only). -#define CONFIG_SPI_CLOCK_PHASE 0 - -/// Default transmit timeout (ms). Set to -1 to disable timeout support. -#define CONFIG_SER_TXTIMEOUT -1 - -/// Default receive timeout (ms). Set to -1 to disable timeout support. -#define CONFIG_SER_RXTIMEOUT -1 - -/// Use RTS/CTS handshake -#define CONFIG_SER_HWHANDSHAKE 0 - -/// Default baud rate (set to 0 to disable). -#define CONFIG_SER_DEFBAUDRATE 0 - -/// For serial debug. -#define CONFIG_SER_STROBE 0 - -#endif /* CFG_SER_H */ diff --git a/examples/at91sam7/cfg/cfg_signal.h b/examples/at91sam7/cfg/cfg_signal.h deleted file mode 100644 index ed85119b..00000000 --- a/examples/at91sam7/cfg/cfg_signal.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * \file - * - * - * \brief Kernel signals configuration parameters - * - * \version $Id$ - * \author Bernie Innocenti - */ - -#ifndef CFG_SIGNAL_H -#define CFG_SIGNAL_H - -/** - * Inter-process signals. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_SIGNALS 1 - -#endif /* CFG_SIGNAL_H */ diff --git a/examples/at91sam7/cfg/cfg_timer.h b/examples/at91sam7/cfg/cfg_timer.h deleted file mode 100644 index 9d8357ef..00000000 --- a/examples/at91sam7/cfg/cfg_timer.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for timer module. - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef CFG_TIMER_H -#define CFG_TIMER_H - -/// Hardware timer selection for drv/timer.c -#define CONFIG_TIMER TIMER_DEFAULT - -/// Debug timer interrupt using a strobe pin. -#define CONFIG_TIMER_STROBE 0 - -/// Enable asynchronous timers -#define CONFIG_TIMER_EVENTS 1 - -/// Support hi-res timer_usleep() -#define CONFIG_TIMER_UDELAY 1 - -#endif /* CFG_TIMER_H */ diff --git a/examples/at91sam7/hw/hw_ser.h b/examples/at91sam7/hw/hw_ser.h deleted file mode 100644 index 7b98f223..00000000 --- a/examples/at91sam7/hw/hw_ser.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * \file - * - * - * \brief Serial hardware-specific definitions - * - * \version $Id$ - * - * \author Daniele Basile - */ - - diff --git a/examples/at91sam7/verstag.h b/examples/at91sam7/verstag.h deleted file mode 100644 index e6163906..00000000 --- a/examples/at91sam7/verstag.h +++ /dev/null @@ -1,94 +0,0 @@ -/** - * \file - * - * - * \version $Id$ - * - * \author Bernie Innocenti - * - * \brief Declare application version strings - */ -#ifndef DEVLIB_VERSTAG_H -#define DEVLIB_VERSTAG_H - -#ifndef ARCH_CONFIG_H - #include "cfg/arch_config.h" -#endif - -#define APP_NAME "AT91SAM7S-EK porting test" -#define APP_DESCRIPTION "AT91SAM7S-EK porting test" -#define APP_AUTHOR "Develer" -#define APP_COPYRIGHT "Copyright 2007 Develer (http://www.develer.com/)" - -#define VERS_MAJOR 0 -#define VERS_MINOR 1 -#define VERS_REV 0 -#define VERS_LETTER "" - -/** - * If _SNAPSHOT is defined, \c VERS_TAG contains the build date - * date instead of a numeric version string. - */ -//#define _SNAPSHOT - -#ifdef _DEBUG - #define VERS_DBG "D" -#else - #define VERS_DBG "" -#endif - -#define __STRINGIZE(x) #x -#define _STRINGIZE(x) __STRINGIZE(x) - -/** Build application version string (i.e.: "1.7.0") */ -#define MAKE_VERS(maj,min,rev) _STRINGIZE(maj) "." _STRINGIZE(min) "." _STRINGIZE(rev) VERS_LETTER VERS_DBG -#ifdef _SNAPSHOT - #define VERS_TAG "snapshot" " " __DATE__ " " __TIME__ " " VERS_LETTER " " VERS_DBG -#else - #define VERS_TAG MAKE_VERS(VERS_MAJOR,VERS_MINOR,VERS_REV) -#endif - -/** Build application version string suitable for MS windows resource files (i.e.: "1, 7, 0, 1") */ -#define MAKE_RCVERS(maj,min,rev,bld) _STRINGIZE(maj) ", " _STRINGIZE(min) ", " _STRINGIZE(rev) ", " _STRINGIZE(bld) -#define RCVERSION_TAG MAKE_VERS(VERS_MAJOR,VERS_MINOR,VERS_REV) - -/** The revision string (contains VERS_TAG) */ -extern const char vers_tag[]; - -/** Sequential build number (contains VERS_BUILD) */ -extern const int vers_build_nr; -//extern const char vers_build_str[]; - -/** Hostname of the machine used to build this binary (contains VERS_HOST) */ -extern const char vers_host[]; - -#endif /* DEVLIB_VERSTAG_H */ diff --git a/examples/lm3s1968/cfg/cfg_debug.h b/examples/lm3s1968/cfg/cfg_debug.h deleted file mode 100644 index ef7c4a75..00000000 --- a/examples/lm3s1968/cfg/cfg_debug.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for Debug module. - * - * \author Daniele Basile - */ - -#ifndef CFG_DEBUG_H -#define CFG_DEBUG_H - -/** - * Debug console port. - * $WIZ$ type = "int"; min = 0 - */ -#define CONFIG_KDEBUG_PORT 0 - -/** - * Baudrate for the debug console. - * $WIZ$ type = "int"; min = 300 - */ -#define CONFIG_KDEBUG_BAUDRATE 115200UL - -#endif /* CFG_DEBUG_H */ diff --git a/examples/lm3s1968/cfg/cfg_gfx.h b/examples/lm3s1968/cfg/cfg_gfx.h deleted file mode 100644 index 8d8b6fa2..00000000 --- a/examples/lm3s1968/cfg/cfg_gfx.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for GFX module. - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef CFG_GFX_H -#define CFG_GFX_H - -/// Enable line clipping algorithm. -#define CONFIG_GFX_CLIPPING 1 - -/// Enable text rendering in bitmaps. -#define CONFIG_GFX_TEXT 1 - -/// Enable virtual coordinate system. -#define CONFIG_GFX_VCOORDS 1 - -/// Select bitmap pixel format. -#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB - - -#define CONFIG_CHART_TYPE_X uint8_t ///< Type for the chart dataset -#define CONFIG_CHART_TYPE_Y uint8_t ///< Type for the chart dataset - - -/// Enable button bar behind menus -#define CONFIG_MENU_MENUBAR 0 - -/// Level Edit Timeout -#define CONFIG_LEVELEDIT_TIMEOUT 0 - -/// Menu timeout -#define CONFIG_MENU_TIMEOUT 0 - -/// Enable smooth scrolling in menus -#define CONFIG_MENU_SMOOTH 1 - - -#endif /* CFG_GFX_H */ - diff --git a/examples/lm3s1968/cfg/cfg_heap.h b/examples/lm3s1968/cfg/cfg_heap.h deleted file mode 100644 index 7d080012..00000000 --- a/examples/lm3s1968/cfg/cfg_heap.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for heap module. - * - * \author Daniele Basile - */ - -#ifndef CFG_HEAP_H -#define CFG_HEAP_H - -/** - * Enable malloc/free like API. - * $WIZ$ type = "boolean" - */ -#define CONFIG_HEAP_MALLOC 1 - -#endif /* CFG_HEAP_H */ - - diff --git a/examples/lm3s1968/cfg/cfg_kfile.h b/examples/lm3s1968/cfg/cfg_kfile.h deleted file mode 100644 index 1b1989c9..00000000 --- a/examples/lm3s1968/cfg/cfg_kfile.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for KFile interface module. - * - * \version $Id$ - * \author Daniele Basile - */ - -#ifndef CFG_KFILE_H -#define CFG_KFILE_H - -/** - * Module logging level. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define KFILE_LOG_LEVEL LOG_LVL_INFO - -/** - * Module logging format. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define KFILE_LOG_FORMAT LOG_FMT_TERSE - -/** - * Enable the gets function with echo. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KFILE_GETS 1 - -#endif /* CFG_KFILE_H */ diff --git a/examples/lm3s1968/cfg/cfg_lcd.h b/examples/lm3s1968/cfg/cfg_lcd.h deleted file mode 100644 index d48fa5df..00000000 --- a/examples/lm3s1968/cfg/cfg_lcd.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for lcd display module. - */ - -#ifndef CFG_LCD_H -#define CFG_LCD_H - -/** - * Use 4 bit addressing mode. - * $WIZ$ type = "boolean" - */ -#define CONFIG_LCD_4BIT 0 - -/** - * Use a table to speed up LCD memory addressing. - * This will use about 100 bytes of RAM. - * $WIZ$ type = "boolean" - */ -#define CONFIG_LCD_ADDRESS_FAST 0 - -/** - * LCD setting for 32122A (AVR implementation). - * $WIZ$ type = "boolean" - * $WIZ$ supports = "avr and False" - */ -#define CONFIG_LCD_SOFTINT_REFRESH 0 - -/** - * LCD setting for 32122A (AVR implementation). - * $WIZ$ type = "boolean" - * $WIZ$ supports = "avr and False" - */ -#define CONFIG_LCD_WAIT 0 - - -#endif /* CFG_LCD_H */ - diff --git a/examples/lm3s1968/cfg/cfg_monitor.h b/examples/lm3s1968/cfg/cfg_monitor.h deleted file mode 100644 index d0e24da4..00000000 --- a/examples/lm3s1968/cfg/cfg_monitor.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * \file - * - * - * \brief Kernel monitor configuration parameters - * - * \author Bernie Innocenti - */ - -#ifndef CFG_MONITOR_H -#define CFG_MONITOR_H - -/** - * Process monitor. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_MONITOR 1 - -#endif /* CFG_MONITOR_H */ diff --git a/examples/lm3s1968/cfg/cfg_proc.h b/examples/lm3s1968/cfg/cfg_proc.h deleted file mode 100644 index eb5506b4..00000000 --- a/examples/lm3s1968/cfg/cfg_proc.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * \file - * - * - * \brief Kernel configuration parameters - * - * \author Bernie Innocenti - */ - -#ifndef CFG_PROC_H -#define CFG_PROC_H - -/** - * Enable the multithreading kernel. - * - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN 1 - -/** - * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! - * $WIZ$ type = "boolean" - * $WIZ$ supports = "False" - */ -#define CONFIG_KERN_IRQ 0 - -/** - * Preemptive process scheduling. - * - * $WIZ$ type = "boolean" - * $WIZ$ conditional_deps = "timer" - */ -#define CONFIG_KERN_PREEMPT 1 - -/** - * Time sharing quantum (a prime number prevents interference effects) [ms]. - * - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_KERN_QUANTUM 11 - -/** - * Priority-based scheduling policy. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_PRI 1 - -/** - * Dynamic memory allocation for processes. - * $WIZ$ type = "boolean" - * $WIZ$ conditional_deps = "heap" - */ -#define CONFIG_KERN_HEAP 1 - -/** - * Size of the dynamic memory pool used by processes. - * $WIZ$ type = "int" - * $WIZ$ min = 0 - */ -#define CONFIG_KERN_HEAP_SIZE 16384L - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define KERN_LOG_LEVEL LOG_LVL_ERR - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define KERN_LOG_FORMAT LOG_FMT_VERBOSE - -#endif /* CFG_PROC_H */ diff --git a/examples/lm3s1968/cfg/cfg_sem.h b/examples/lm3s1968/cfg/cfg_sem.h deleted file mode 100644 index 51811da4..00000000 --- a/examples/lm3s1968/cfg/cfg_sem.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * \file - * - * - * \brief Kernel semaphores configuration parameters. - * - * \author Bernie Innocenti - */ - -#ifndef CFG_SEM_H -#define CFG_SEM_H - -/** - * Re-entrant mutual exclusion primitives. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_SEMAPHORES 0 - -#endif /* CFG_SEM_H */ diff --git a/examples/lm3s1968/cfg/cfg_ser.h b/examples/lm3s1968/cfg/cfg_ser.h deleted file mode 100644 index 91a10e0b..00000000 --- a/examples/lm3s1968/cfg/cfg_ser.h +++ /dev/null @@ -1,222 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for serial module. - * - * \author Daniele Basile - */ - -#ifndef CFG_SER_H -#define CFG_SER_H - -/** - * Example of setting for serial port and - * spi port. - * Edit these define for your project. - */ - -/** - * Size of the outbound FIFO buffer for port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - */ -#define CONFIG_UART0_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - */ -#define CONFIG_UART0_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" - */ -#define CONFIG_UART1_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" - */ -#define CONFIG_UART1_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for port 2 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2" - */ -#define CONFIG_UART2_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 2 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2" - */ -#define CONFIG_UART2_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for port 3 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lpc2" - */ -#define CONFIG_UART3_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 3 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lpc2" - */ -#define CONFIG_UART3_RXBUFSIZE 32 - - -/** - * Size of the outbound FIFO buffer for SPI port [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for SPI port [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for SPI port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI0_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for SPI port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI0_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for SPI port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI1_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for SPI port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI1_RXBUFSIZE 32 - -/** - * SPI data order. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "ser_order_bit" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST - -/** - * SPI clock division factor. - * $WIZ$ type = "int" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_CLOCK_DIV 16 - -/** - * SPI clock polarity: normal low or normal high. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "ser_spi_pol" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW - -/** - * SPI clock phase you can choose sample on first edge or - * sample on second clock edge. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "ser_spi_phase" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE - -/** - * Default transmit timeout (ms). Set to -1 to disable timeout support. - * $WIZ$ type = "int" - * $WIZ$ min = -1 - */ -#define CONFIG_SER_TXTIMEOUT -1 - -/** - * Default receive timeout (ms). Set to -1 to disable timeout support. - * $WIZ$ type = "int" - * $WIZ$ min = -1 - */ -#define CONFIG_SER_RXTIMEOUT -1 - -/** - * Use RTS/CTS handshake. - * $WIZ$ type = "boolean" - * $WIZ$ supports = "False" - */ -#define CONFIG_SER_HWHANDSHAKE 0 - -/** - * Default baudrate for all serial ports (set to 0 to disable). - * $WIZ$ type = "int" - * $WIZ$ min = 0 - */ -#define CONFIG_SER_DEFBAUDRATE 0UL - -/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" -#define CONFIG_SER_STROBE 0 - -#endif /* CFG_SER_H */ diff --git a/examples/lm3s1968/cfg/cfg_signal.h b/examples/lm3s1968/cfg/cfg_signal.h deleted file mode 100644 index ce5324ec..00000000 --- a/examples/lm3s1968/cfg/cfg_signal.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * \file - * - * - * \brief Kernel signals configuration parameters - * - * \author Bernie Innocenti - */ - -#ifndef CFG_SIGNAL_H -#define CFG_SIGNAL_H - -/** - * Inter-process signals. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_SIGNALS 1 - -#endif /* CFG_SIGNAL_H */ diff --git a/examples/lm3s1968/cfg/cfg_timer.h b/examples/lm3s1968/cfg/cfg_timer.h deleted file mode 100644 index ae1a60b9..00000000 --- a/examples/lm3s1968/cfg/cfg_timer.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for timer module. - * - * \author Daniele Basile - */ - -#ifndef CFG_TIMER_H -#define CFG_TIMER_H - -/** - * Hardware timer selection for drv/timer.c. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "timer_select" - */ -#define CONFIG_TIMER TIMER_DEFAULT - -/** - * Debug timer interrupt using a strobe pin. - * $WIZ$ type = "boolean" - */ -#define CONFIG_TIMER_STROBE 0 - -/** - * Enable asynchronous timers. - * $WIZ$ type = "boolean" - */ -#define CONFIG_TIMER_EVENTS 1 - -/** - * Support hi-res timer_usleep(). - * $WIZ$ type = "boolean" - */ -#define CONFIG_TIMER_UDELAY 1 - -#endif /* CFG_TIMER_H */ diff --git a/examples/lm3s1968/hw/hw_kbd.h b/examples/lm3s1968/hw/hw_kbd.h deleted file mode 100644 index 7369a321..00000000 --- a/examples/lm3s1968/hw/hw_kbd.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - * \file - * - * - * \brief LM3S1968 keypad: hardware-specific definitions - * - * \author Andrea Righi - */ - -#ifndef HW_KBD_H -#define HW_KBD_H - -#include /* BV() */ -#include /* GPIO_PORTG_BASE */ -#include /* lm3s_busyWait() */ -#include /* lm3s_gpioPinConfig() / lm3s_gpioPinRead() */ -#include "hw/kbd_map.h" - -#define K_RPT_MASK (K_UP | K_DOWN | K_LEFT | K_RIGHT | K_OK) - -#define KBD_HW_INIT \ - do { \ - SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOG; \ - lm3s_busyWait(512); \ - lm3s_gpioPinConfig(GPIO_PORTG_BASE, \ - K_RPT_MASK, \ - GPIO_DIR_MODE_IN, \ - GPIO_STRENGTH_2MA, \ - GPIO_PIN_TYPE_STD_WPU); \ - } while (0) - -/** - * Read the keyboard ports and return the mask of depressed keys. - */ -INLINE keymask_t kbd_readkeys(void) -{ - return ~lm3s_gpioPinRead(GPIO_PORTG_BASE, - K_UP | K_DOWN | K_LEFT | K_RIGHT | K_OK); -} - -#endif /* HW_KBD_H */ diff --git a/examples/lm3s1968/hw/hw_rit128x96.h b/examples/lm3s1968/hw/hw_rit128x96.h deleted file mode 100644 index 5a8de9fc..00000000 --- a/examples/lm3s1968/hw/hw_rit128x96.h +++ /dev/null @@ -1,122 +0,0 @@ -/** - * \file - * - * - * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros - * - * \author Andrea Righi - */ - -#ifndef HW_RIT128x96_H -#define HW_RIT128x96_H - -#include "cfg/macros.h" /* BV() */ -#include "cfg/debug.h" - -#include -#include -#include - -#include -#include -#include - -/** - * \name LCD I/O pins/ports - * @{ - */ -/* OLED Data/Command control pin */ -#define GPIO_OLEDDC_PIN BV(2) - -/* OLED enable pin */ -#define GPIO_OLEDEN_PIN BV(3) -/*@}*/ - -/** - * \name LCD bus control macros - * @{ - */ -/* Enter command mode */ -#define LCD_SET_COMMAND() \ - lm3s_gpioPinWrite(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN, 0) - -/* Enter data mode */ -#define LCD_SET_DATA() \ - lm3s_gpioPinWrite(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN, GPIO_OLEDDC_PIN) - -/* Send data to the display */ -#define LCD_WRITE(x) \ - { \ - uint32_t _x; \ - while (!lm3s_ssiWriteFrameNonBlocking(SSI0_BASE, x)); \ - /* Dummy read to drain the FIFO */ \ - while (!lm3s_ssiReadFrameNonBlocking(SSI0_BASE, &_x)); \ - } -/*@}*/ - -INLINE void lcd_rit128x96_hw_bus_init(void) -{ - uint32_t dummy; - - /* Enable the peripheral clock */ - SYSCTL_RCGC1_R |= SYSCTL_RCGC1_SSI0; - SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA; - SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOH; - lm3s_busyWait(512); - - /* Configure the SSI0CLK and SSIOTX pins for SSI operation. */ - lm3s_gpioPinConfig(GPIO_PORTA_BASE, BV(2) | BV(3) | BV(5), - GPIO_DIR_MODE_HW, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); - /* - * Configure the GPIO port pin used as a D/C# signal (data/command - * control) for OLED device, and the port pin used to enable power to - * the OLED panel. - */ - lm3s_gpioPinConfig(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN, - GPIO_DIR_MODE_OUT, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); - lm3s_gpioPinWrite(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN, - GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN); - - /* Configure the SSI0 port for master mode */ - lm3s_ssiOpen(SSI0_BASE, SSI_FRF_MOTO_MODE_2, - SSI_MODE_MASTER, CPU_FREQ / 2, 8); - /* - * Configure the GPIO port pin used as a D/Cn signal for OLED device, - * and the port pin used to enable power to the OLED panel. - */ - lm3s_gpioPinConfig(GPIO_PORTA_BASE, GPIO_OLEDEN_PIN, - GPIO_DIR_MODE_HW, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); - - /* Drain the SSI RX FIFO */ - while (lm3s_ssiReadFrameNonBlocking(SSI0_BASE, &dummy)); -} - -#endif /* HW_RIT128x96_H */ diff --git a/examples/lm3s1968/hw/kbd_map.h b/examples/lm3s1968/hw/kbd_map.h deleted file mode 100644 index 20b95ea0..00000000 --- a/examples/lm3s1968/hw/kbd_map.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * \file - * - * - * \brief Keyboard map definitions. - * - * \version $Id$ - * - * \author Francesco Sacchi - * \author Stefano Fedrigo - */ - -#ifndef HW_KBD_MAP_H -#define HW_KBD_MAP_H - -#include - -/** - * Type for keyboard mask. - */ -typedef uint16_t keymask_t; - -/** - * \name Keycodes. - */ -/*@{*/ -#define K_UP BV(3) -#define K_DOWN BV(4) -#define K_LEFT BV(5) -#define K_RIGHT BV(6) -#define K_OK BV(7) -#define K_CANCEL BV(8) - -#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ -#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ -#define K_LONG BV(15) -/*@}*/ - -#define K_LNG_MASK 0 - -#endif /* HW_KBD_MAP_H */ diff --git a/examples/lm3s1968/lm3s1968.c b/examples/lm3s1968/lm3s1968.c deleted file mode 100644 index 8ae3b4a1..00000000 --- a/examples/lm3s1968/lm3s1968.c +++ /dev/null @@ -1,375 +0,0 @@ -/** - * \file - * - * - * \brief LM3S1968 Cortex-M3 testcase - * - * \author Andrea Righi - */ - -#include "hw/hw_rit128x96.h" - -#include "cfg/compiler.h" -#include "cfg/cfg_gfx.h" - -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include - -#include - - - -#define PROC_STACK_SIZE KERN_MINSTACKSIZE * 2 - -#if CONFIG_KERN_HEAP -#define hp_stack NULL -#define lp_stack NULL -#define ser_stack NULL -#define led_stack NULL -#else -static PROC_DEFINE_STACK(hp_stack, PROC_STACK_SIZE); -static PROC_DEFINE_STACK(lp_stack, PROC_STACK_SIZE); -static PROC_DEFINE_STACK(ser_stack, PROC_STACK_SIZE); -static PROC_DEFINE_STACK(led_stack, PROC_STACK_SIZE); -#endif - -extern Font font_gohu; -static uint8_t raster[RAST_SIZE(LCD_WIDTH, LCD_HEIGHT)]; -static Bitmap lcd_bitmap; - -#define KEY_MASK (K_UP | K_DOWN | K_LEFT | K_RIGHT | K_OK) - -static Process *hp_proc, *lp_proc, *led_proc; -static hptime_t start, end; - -static Serial ser_port; - -static void led_init(void) -{ - /* Enable the GPIO port that is used for the on-board LED */ - SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOG; - /* - * Perform a dummy read to insert a few cycles delay before enabling - * the peripheral. - */ - (void)SYSCTL_RCGC2_R; - /* Enable the GPIO pin for the LED */ - GPIO_PORTG_DIR_R = 0x04; - GPIO_PORTG_DEN_R = 0x04; -} - -INLINE void led_on(void) -{ - GPIO_PORTG_DATA_R |= 0x04; -} - -INLINE void led_off(void) -{ - GPIO_PORTG_DATA_R &= ~0x04; -} - -static bool led_blinking; - -static void NORETURN led_process(void) -{ - int i; - - for (i = 0; ; i++) - { - if (!led_blinking) - { - led_off(); - sig_wait(SIG_USER0); - } - if (i & 1) - led_on(); - else - led_off(); - timer_delay(50); - } -} - -static void led_test(UNUSED_ARG(Bitmap *, bm)) -{ - led_blinking = !led_blinking; - sig_send(led_proc, SIG_USER0); -} - -static void bouncing_logo(Bitmap *bm) -{ - const long SPEED_SCALE = 1000; - const long GRAVITY_ACCEL = 100; - const long BOUNCE_ELASTICITY = 1; - long h = (long)(-bertos_logo.height) * SPEED_SCALE; - long speed = 0, i; - - for (i = 0; ; i++) - { - /* Move */ - h += speed; - - /* Gravity acceleration */ - speed += GRAVITY_ACCEL; - - if (h > 0 && speed > 0) - { - /* Bounce */ - speed = -(speed / BOUNCE_ELASTICITY); - - } - /* Update graphics */ - gfx_bitmapClear(bm); - gfx_blitImage(bm, - (LCD_WIDTH - bertos_logo.width) / 2, - (LCD_HEIGHT - bertos_logo.height) / 2 + h / SPEED_SCALE, - &bertos_logo); - text_xprintf(bm, 7, 0, TEXT_FILL | TEXT_CENTER, "Press SELECT to quit"); - rit128x96_blitBitmap(bm); - timer_delay(5); - if (kbd_peek() & KEY_MASK) - break; - } -} - -static void screen_saver(Bitmap *bm) -{ - int x1, y1, x2, y2; - int i; - - for (i = 0; ; i++) - { - x1 = i % LCD_WIDTH; - y1 = i % LCD_HEIGHT; - - x2 = LCD_WIDTH - i % LCD_WIDTH; - y2 = LCD_HEIGHT - i % LCD_HEIGHT; - - gfx_bitmapClear(bm); - gfx_rectDraw(bm, x1, y1, x2, y2); - rit128x96_blitBitmap(bm); - if (kbd_peek() & KEY_MASK) - break; - } -} - -INLINE hptime_t get_hp_ticks(void) -{ - return (TIMER_HW_CNT - timer_hw_hpread()) + - timer_clock_unlocked() * TIMER_HW_CNT; -} - -static void NORETURN hp_process(void) -{ - while (1) - { - sig_wait(SIG_USER0); - end = get_hp_ticks(); - timer_delay(100); - sig_send(lp_proc, SIG_USER0); - } -} - -static void NORETURN lp_process(void) -{ - while (1) - { - start = get_hp_ticks(); - sig_send(hp_proc, SIG_USER0); - sig_wait(SIG_USER0); - } -} - -static void res_process(void) -{ - const char spinner[] = {'/', '-', '\\', '|'}; - int i; - char c; - - for (i = 0; ; i++) - { - /* Show context switch (in clock cycles) */ - c = spinner[i % countof(spinner)]; - text_xprintf(&lcd_bitmap, 3, 0, TEXT_CENTER | TEXT_FILL, "%c Context switch %c", c, c); - text_xprintf(&lcd_bitmap, 5, 0, TEXT_FILL, " %lu clock cycles", end - start); - /* Show context switch (in usec) */ - text_xprintf(&lcd_bitmap, 6, 0, TEXT_FILL, - " %lu.%lu usec", - ((end - start) * 1000000) / CPU_FREQ, - ((end - start) * (100000000 / CPU_FREQ)) % 100); - rit128x96_blitBitmap(&lcd_bitmap); - timer_delay(5); - if (kbd_peek() & KEY_MASK) - break; - } -} - -static void context_switch_test(Bitmap *bm) -{ - gfx_bitmapClear(bm); - text_xprintf(bm, 0, 0, TEXT_FILL, - "CPU: Cortex-M3 %luMHz", CPU_FREQ / 1000000); - rit128x96_blitBitmap(bm); - text_xprintf(bm, 1, 0, TEXT_FILL, "Board: LM3S1968 EVB"); - rit128x96_blitBitmap(bm); - - res_process(); -} - -static void uptime(Bitmap *bm) -{ - extern const Font font_luBS14; - const Font *old_font; - - old_font = bm->font; - - /* Set big font */ - gfx_bitmapClear(bm); - gfx_setFont(bm, &font_luBS14); - text_xprintf(bm, 0, 0, TEXT_FILL | TEXT_CENTER, "Uptime"); - while (1) - { - ticks_t clock = ticks_to_ms(timer_clock_unlocked()); - - /* Display uptime (in ticks) */ - text_xprintf(&lcd_bitmap, 2, 0, TEXT_FILL | TEXT_CENTER, - "%lu", clock / 1000); - rit128x96_blitBitmap(bm); - timer_delay(5); - if (kbd_peek() & KEY_MASK) - break; - } - gfx_setFont(bm, old_font); -} - -static void NORETURN soft_reset(Bitmap * bm) -{ - extern const Font font_luBS14; - int i; - - /* Set big font */ - gfx_bitmapClear(bm); - gfx_setFont(bm, &font_luBS14); - for (i = 5; i; --i) - { - text_xprintf(bm, 2, 0, TEXT_FILL | TEXT_CENTER, "%d", i); - rit128x96_blitBitmap(bm); - timer_delay(1000); - } - text_xprintf(bm, 2, 0, TEXT_FILL | TEXT_CENTER, "REBOOT"); - rit128x96_blitBitmap(bm); - timer_delay(1000); - - /* Perform a software reset request */ - HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ; - UNREACHABLE(); -} - -static void NORETURN ser_process(void) -{ - char buf[32]; - int i; - - ser_init(&ser_port, SER_UART0); - ser_setbaudrate(&ser_port, 115200); - - /* BeRTOS terminal */ - for (i = 0; ; i++) - { - kfile_printf(&ser_port.fd, "\n\r[%03d] BeRTOS:~$ ", i); - kfile_gets_echo(&ser_port.fd, buf, sizeof(buf), true); - kfile_printf(&ser_port.fd, "%s", buf); - } -} - -static struct MenuItem main_items[] = -{ - { (const_iptr_t)"LED blinking", 0, (MenuHook)led_test, (iptr_t)&lcd_bitmap }, - { (const_iptr_t)"Bouncing logo", 0, (MenuHook)bouncing_logo, (iptr_t)&lcd_bitmap }, - { (const_iptr_t)"Screen saver demo", 0, (MenuHook)screen_saver, (iptr_t)&lcd_bitmap }, - { (const_iptr_t)"Scheduling test", 0, (MenuHook)context_switch_test, (iptr_t)&lcd_bitmap }, - { (const_iptr_t)"Show uptime", 0, (MenuHook)uptime, (iptr_t)&lcd_bitmap }, - { (const_iptr_t)"Reboot", 0, (MenuHook)soft_reset, (iptr_t)&lcd_bitmap }, - { (const_iptr_t)0, 0, NULL, (iptr_t)0, } -}; - -static struct Menu main_menu = { main_items, "BeRTOS", MF_STICKY | MF_SAVESEL, &lcd_bitmap, 0, rit128x96_blitBitmap }; - -int main(void) -{ - IRQ_ENABLE; - kdbg_init(); - - kputs("Init LED.."); - led_init(); - kputs("Done.\n"); - kputs("Init Timer.."); - timer_init(); - kputs("Done.\n"); - kputs("Init Process.."); - proc_init(); - kputs("Done.\n"); - kputs("Init OLED display.."); - rit128x96_init(); - gfx_bitmapInit(&lcd_bitmap, raster, LCD_WIDTH, LCD_HEIGHT); - gfx_setFont(&lcd_bitmap, &font_gohu); - rit128x96_blitBitmap(&lcd_bitmap); - kputs("Done.\n"); - kputs("Init Keypad.."); - kbd_init(); - kputs("Done.\n"); - - hp_proc = proc_new(hp_process, NULL, PROC_STACK_SIZE, hp_stack); - lp_proc = proc_new(lp_process, NULL, PROC_STACK_SIZE, lp_stack); - led_proc = proc_new(led_process, NULL, PROC_STACK_SIZE, led_stack); - /* Open a dummy echo terminal on UART0 */ - proc_new(ser_process, NULL, PROC_STACK_SIZE, ser_stack); - - proc_setPri(hp_proc, 2); - proc_setPri(lp_proc, 1); - - while (1) - { - menu_handle(&main_menu); - cpu_relax(); - } -} diff --git a/examples/lm3s1968/lm3s1968.mk b/examples/lm3s1968/lm3s1968.mk deleted file mode 100644 index d93a6c1b..00000000 --- a/examples/lm3s1968/lm3s1968.mk +++ /dev/null @@ -1,84 +0,0 @@ -# -# $Id: lm3s1968.mk 18234 2007-10-08 13:39:48Z rasky $ -# Copyright 2006 Develer S.r.l. (http://www.develer.com/) -# All rights reserved. -# -# Makefile fragment for DevLib lm3s1968 application. -# -# Author: Manuele Fanelli -# -# - -# Set to 1 for debug builds -lm3s1968_DEBUG = 0 - -include bertos/fonts/fonts.mk - -# Our target application -TRG += lm3s1968 - -lm3s1968_CSRC = \ - examples/lm3s1968/lm3s1968.c \ - bertos/gfx/bitmap.c \ - bertos/gfx/line.c \ - bertos/gfx/win.c \ - bertos/gfx/text.c \ - bertos/gfx/text_format.c \ - bertos/gui/menu.c \ - bertos/fonts/gohu.c \ - bertos/fonts/luBS14.c \ - bertos/icons/logo.c \ - bertos/mware/formatwr.c \ - bertos/mware/hex.c \ - bertos/mware/sprintf.c \ - bertos/mware/event.c \ - bertos/struct/heap.c \ - bertos/drv/timer.c \ - bertos/drv/ser.c \ - bertos/drv/kbd.c \ - bertos/drv/lcd_rit128x96.c \ - bertos/kern/kfile.c \ - bertos/kern/monitor.c \ - bertos/kern/proc_test.c \ - bertos/kern/proc.c \ - bertos/kern/signal.c \ - bertos/cpu/cortex-m3/drv/gpio_lm3s.c \ - bertos/cpu/cortex-m3/drv/clock_lm3s.c \ - bertos/cpu/cortex-m3/drv/ser_lm3s.c \ - bertos/cpu/cortex-m3/drv/kdebug_lm3s.c \ - bertos/cpu/cortex-m3/drv/ssi_lm3s.c \ - bertos/cpu/cortex-m3/drv/timer_cm3.c \ - bertos/cpu/cortex-m3/drv/irq_cm3.c \ - bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ - bertos/cpu/cortex-m3/hw/init_cm3.c - -lm3s1968_CPPASRC = \ - bertos/cpu/cortex-m3/hw/vectors_cm3.S \ - bertos/cpu/cortex-m3/hw/crt_cm3.S \ - # - -# This is an hosted application -lm3s1968_PREFIX = arm-none-eabi- - -lm3s1968_CPPAFLAGS = -mthumb -mno-thumb-interwork -lm3s1968_CPPFLAGS = -D'ARCH=0' -D__ARM_LM3S1968__ -D'CPU_FREQ=(50000000L)' -D'WIZ_AUTOGEN' -mthumb -mno-thumb-interwork -Iexamples/lm3s1968 -Ibertos/cpu/cortex-m3 -fno-strict-aliasing -fwrapv -lm3s1968_LDFLAGS = -nostartfiles -T bertos/cpu/cortex-m3/scripts/lm3s1968_rom.ld -Wl,--no-warn-mismatch -mthumb -mno-thumb-interwork - -lm3s1968_CPU = cortex-m3 - -lm3s1968_PROGRAMMER_CPU = lm3s -lm3s1968_PROGRAMMER_TYPE = luminary -lm3s1968_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-lm3s.sh -lm3s1968_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh -lm3s1968_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh -lm3s1968_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh - -ifeq ($(lm3s1968_DEBUG),0) - # Production options - lm3s1968_CFLAGS += -O2 -fomit-frame-pointer - lm3s1968_CXXFLAGS += -O2 -fomit-frame-pointer -else - # Debug options - lm3s1968_CPPAFLAGS += -g -gdwarf-2 - lm3s1968_CPPFLAGS += -O0 -g3 -gdwarf-2 -fverbose-asm -endif diff --git a/examples/lpc2378/cfg/cfg_adc.h b/examples/lpc2378/cfg/cfg_adc.h deleted file mode 100644 index 4df8c62f..00000000 --- a/examples/lpc2378/cfg/cfg_adc.h +++ /dev/null @@ -1,110 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for the ADC module. - * - * \version $Id: cfg_adc.h 2582 2009-04-20 12:33:48Z batt $ - * \author Daniele Basile - */ - -#ifndef CFG_ADC_H -#define CFG_ADC_H - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define ADC_LOG_LEVEL LOG_LVL_INFO - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define ADC_LOG_FORMAT LOG_FMT_VERBOSE - -/** - * Clock Frequency for ADC conversion. - * - * $WIZ$ type = "int" - * $WIZ$ supports = "at91" - */ -#define CONFIG_ADC_CLOCK 4800000UL - -/** - * Minimum time for starting up a conversion [us]. - * - * $WIZ$ type = "int" - * $WIZ$ min = 0 - * $WIZ$ supports = "at91" - */ -#define CONFIG_ADC_STARTUP_TIME 20 - -/** - * Minimum time for sample and hold [us]. - * - * $WIZ$ type = "int" - * $WIZ$ min = 0 - * $WIZ$ supports = "at91" - */ -#define CONFIG_ADC_SHTIME 834 - -/** - * ADC Voltage Reference. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "avr_adc_refs" - * $WIZ$ supports = "avr" - */ -#define CONFIG_ADC_AVR_REF ADC_AVR_AVCC - -/** - * ADC clock divisor from main crystal. - * - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ max = 128 - * $WIZ$ supports = "avr" - */ -#define CONFIG_ADC_AVR_DIVISOR 2 - -/** - * Enable ADC strobe for debugging ADC ISR. - * - * $WIZ$ type = "boolean" - */ -#define CONFIG_ADC_STROBE 0 - -#endif /* CFG_ADC_H */ diff --git a/examples/lpc2378/cfg/cfg_afsk.h b/examples/lpc2378/cfg/cfg_afsk.h deleted file mode 100644 index 1b4b147e..00000000 --- a/examples/lpc2378/cfg/cfg_afsk.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for AFSK1200 modem. - * - * \version $Id: cfg_afsk.h 3065 2009-10-10 11:20:09Z batt $ - * \author Francesco Sacchi - */ - -#ifndef CFG_AFSK_H -#define CFG_AFSK_H - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define AFSK_LOG_LEVEL LOG_LVL_WARN - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define AFSK_LOG_FORMAT LOG_FMT_TERSE - - -/** - * AFSK discriminator filter type. - * - * $WIZ$ type = "enum"; value_list = "afsk_filter_list" - */ -#define CONFIG_AFSK_FILTER AFSK_CHEBYSHEV - - -/** - * AFSK receiver buffer length. - * - * $WIZ$ type = "int" - * $WIZ$ min = 2 - */ -#define CONFIG_AFSK_RX_BUFLEN 32 - -/** - * AFSK transimtter buffer length. - * - * $WIZ$ type = "int" - * $WIZ$ min = 2 - */ -#define CONFIG_AFSK_TX_BUFLEN 32 - -/** - * AFSK DAC sample rate for modem outout. - * $WIZ$ type = "int" - * $WIZ$ min = 2400 - */ -#define CONFIG_AFSK_DAC_SAMPLERATE 9600 - -/** - * AFSK RX timeout in ms, set to -1 to disable. - * $WIZ$ type = "int" - * $WIZ$ min = -1 - */ -#define CONFIG_AFSK_RXTIMEOUT 0 - - -/** - * AFSK Preamble length in [ms], before starting transmissions. - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_AFSK_PREAMBLE_LEN 300UL - - - -/** - * AFSK Trailer length in [ms], before stopping transmissions. - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_AFSK_TRAILER_LEN 50UL - -#endif /* CFG_AFSK_H */ diff --git a/examples/lpc2378/cfg/cfg_ax25.h b/examples/lpc2378/cfg/cfg_ax25.h deleted file mode 100644 index 64f862f1..00000000 --- a/examples/lpc2378/cfg/cfg_ax25.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for the AX25 protocol module. - * - * \version $Id$ - * \author Francesco Sacchi - */ - -#ifndef CFG_AX25_H -#define CFG_AX25_H - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define AX25_LOG_LEVEL LOG_LVL_WARN - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define AX25_LOG_FORMAT LOG_FMT_TERSE - -/** - * AX25 frame buffer lenght. - * - * $WIZ$ type = "int" - * $WIZ$ min = 18 - */ -#define CONFIG_AX25_FRAME_BUF_LEN 330 - - -/** - * Enable repeaters listing in AX25 frames. - * If enabled use 56 addtional bytes of RAM - * for each message received. - * - * $WIZ$ type = "boolean" - */ -#define CONFIG_AX25_RPT_LST 1 - -#endif /* CFG_AX25_H */ diff --git a/examples/lpc2378/cfg/cfg_battfs.h b/examples/lpc2378/cfg/cfg_battfs.h deleted file mode 100644 index 4849a7cb..00000000 --- a/examples/lpc2378/cfg/cfg_battfs.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for BattFS module. - * - * \version $Id: cfg_battfs.h 2665 2009-04-24 16:39:09Z batt $ - * \author Daniele Basile - */ - -#ifndef CFG_BATTFS_H -#define CFG_BATTFS_H - - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define BATTFS_LOG_LEVEL LOG_LVL_INFO - -/** - * module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define BATTFS_LOG_FORMAT LOG_FMT_VERBOSE - -/** - * Set to 1 to enable free page shuffling. - * This increase memories life but makes debugging - * more difficult due to its unrepeteable state. - * $WIZ$ type = "boolean" - */ -#define CONFIG_BATTFS_SHUFFLE_FREE_PAGES 0 - - -#endif /* BATTFS */ diff --git a/examples/lpc2378/cfg/cfg_dataflash.h b/examples/lpc2378/cfg/cfg_dataflash.h deleted file mode 100644 index 1115006a..00000000 --- a/examples/lpc2378/cfg/cfg_dataflash.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for data flash memory module. - * - * \version $Id: cfg_dataflash.h 2348 2009-02-16 13:43:44Z duplo $ - * \author Daniele Basile - */ - -#ifndef CFG_DATAFLASH_H -#define CFG_DATAFLASH_H - -/** - * Module logging level. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define DATAFLASH_LOG_LEVEL LOG_LVL_INFO - -/** - * Module logging format. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define DATAFLASH_LOG_FORMAT LOG_FMT_TERSE - -#endif /* CFG_DATAFLASH_H */ diff --git a/examples/lpc2378/cfg/cfg_dc_motor.h b/examples/lpc2378/cfg/cfg_dc_motor.h deleted file mode 100644 index 2b21bf6a..00000000 --- a/examples/lpc2378/cfg/cfg_dc_motor.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for DC motor module. - * - * \version $Id: cfg_dc_motor.h 2777 2009-08-20 14:54:17Z $ - * - * \author Daniele Basile - */ - -#ifndef CFG_DC_MOTOR_H -#define CFG_DC_MOTOR_H - -/** - * Number of the DC motors to manage. - * - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_NUM_DC_MOTOR 4 - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define DC_MOTOR_LOG_LEVEL LOG_LVL_WARN - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define DC_MOTOR_LOG_FORMAT LOG_FMT_TERSE - -#endif /* CFG_DC_MOTOR_H */ diff --git a/examples/lpc2378/cfg/cfg_debug.h b/examples/lpc2378/cfg/cfg_debug.h deleted file mode 100644 index 3283420c..00000000 --- a/examples/lpc2378/cfg/cfg_debug.h +++ /dev/null @@ -1,55 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for Debug module. - * - * \version $Id: cfg_debug.h 2582 2009-04-20 12:33:48Z batt $ - * - * \author Daniele Basile - */ - -#ifndef CFG_DEBUG_H -#define CFG_DEBUG_H - -/** - * Debug console port. - * $WIZ$ type = "int"; min = 0 - */ -#define CONFIG_KDEBUG_PORT 0 - -/** - * Baudrate for the debug console. - * $WIZ$ type = "int"; min = 300 - */ -#define CONFIG_KDEBUG_BAUDRATE 115200UL - -#endif /* CFG_DEBUG_H */ diff --git a/examples/lpc2378/cfg/cfg_fat.h b/examples/lpc2378/cfg/cfg_fat.h deleted file mode 100644 index 376f9ad2..00000000 --- a/examples/lpc2378/cfg/cfg_fat.h +++ /dev/null @@ -1,140 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for Fat module. - * - * \version $Id: cfg_fat.h 2694 2009-05-21 11:07:20Z batt $ - * - * \author Luca Ottaviano - * \author Francesco Sacchi - */ - -#ifndef CFG_FAT_H -#define CFG_FAT_H - -/** - * Use word alignment to access FAT structure. - * $WIZ$ type = "boolean" - */ -#define CONFIG_FAT_WORD_ACCESS 0 -#define _WORD_ACCESS CONFIG_FAT_WORD_ACCESS - -/** - * Enable read functions only. - * $WIZ$ type = "boolean" - */ -#define CONFIG_FAT_FS_READONLY 0 -#define _FS_READONLY CONFIG_FAT_FS_READONLY - -/** - * Minimization level to remove some functions. - * $WIZ$ type = "int"; min = 0; max = 3 - */ -#define CONFIG_FAT_FS_MINIMIZE 0 -#define _FS_MINIMIZE CONFIG_FAT_FS_MINIMIZE - -/** - * If enabled, this reduces memory consumption 512 bytes each file object by using a shared buffer. - * $WIZ$ type = "boolean" - */ -#define CONFIG_FAT_FS_TINY 1 -#define _FS_TINY CONFIG_FAT_FS_TINY - -/** - * To enable string functions, set _USE_STRFUNC to 1 or 2. - * $WIZ$ type = "int" - * $WIZ$ supports = "False" - */ -#define CONFIG_FAT_USE_STRFUNC 0 -#define _USE_STRFUNC CONFIG_FAT_USE_STRFUNC - -/** - * Enable f_mkfs function. Requires CONFIG_FAT_FS_READONLY = 0. - * $WIZ$ type = "boolean" - */ -#define CONFIG_FAT_USE_MKFS 0 -#define _USE_MKFS (CONFIG_FAT_USE_MKFS && !CONFIG_FAT_FS_READONLY) - -/** - * Enable f_forward function. Requires CONFIG_FAT_FS_TINY. - * $WIZ$ type = "boolean" - */ -#define CONFIG_FAT_USE_FORWARD 0 -#define _USE_FORWARD (CONFIG_FAT_USE_FORWARD && CONFIG_FAT_FS_TINY) - -/** - * Number of volumes (logical drives) to be used. - * $WIZ$ type = "int"; min = 1; max = 255 - */ -#define CONFIG_FAT_DRIVES 1 -#define _DRIVES CONFIG_FAT_DRIVES - -/** - * Maximum sector size to be handled. (512/1024/2048/4096). - * 512 for memory card and hard disk, 1024 for floppy disk, 2048 for MO disk - * $WIZ$ type = "int"; min = 512; max = 4096 - */ -#define CONFIG_FAT_MAX_SS 512 -#define _MAX_SS CONFIG_FAT_MAX_SS - -/** - * When _MULTI_PARTITION is set to 0, each volume is bound to the same physical - * drive number and can mount only first primaly partition. When it is set to 1, - * each volume is tied to the partitions listed in Drives[]. - * $WIZ$ type = "boolean" - * $WIZ$ supports = "False" - */ -#define CONFIG_FAT_MULTI_PARTITION 0 -#define _MULTI_PARTITION CONFIG_FAT_MULTI_PARTITION - -/** - * Specifies the OEM code page to be used on the target system. - * $WIZ$ type = "int" - */ -#define CONFIG_FAT_CODE_PAGE 850 -#define _CODE_PAGE CONFIG_FAT_CODE_PAGE - -/** - * Support for long filenames. Enable only if you have a valid Microsoft license. - * $WIZ$ type = "boolean" - */ -#define CONFIG_FAT_USE_LFN 0 -#define _USE_LFN CONFIG_FAT_USE_LFN - -/** - * Maximum Long File Name length to handle. - * $WIZ$ type = "int"; min = 8; max = 255 - */ -#define CONFIG_FAT_MAX_LFN 255 -#define _MAX_LFN CONFIG_FAT_MAX_LFN - -#endif /* CFG_FAT_H */ diff --git a/examples/lpc2378/cfg/cfg_flash25.h b/examples/lpc2378/cfg/cfg_flash25.h deleted file mode 100644 index 05ec8e45..00000000 --- a/examples/lpc2378/cfg/cfg_flash25.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for flash25 module. - * - * \version $Id: cfg_flash25.h 2362 2009-02-19 14:35:07Z duplo $ - * - * \author Daniele Basile - */ - -#ifndef CFG_FLASH25_H -#define CFG_FLASH25_H - -/** - * Eeprom memory type. - * - *$WIZ$ type = "enum" - *$WIZ$ value_list = "flash25_list" - */ -#define CONFIG_FLASH25 FLASH25_AT25F2048 - -#endif /* CFG_FALSH25_H */ - diff --git a/examples/lpc2378/cfg/cfg_formatwr.h b/examples/lpc2378/cfg/cfg_formatwr.h deleted file mode 100644 index 296e953b..00000000 --- a/examples/lpc2378/cfg/cfg_formatwr.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for formatted write module. - * - * \version $Id: cfg_formatwr.h 2965 2009-09-18 09:35:40Z lottaviano $ - * - * \author Daniele Basile - */ - -#ifndef CFG_FORMATWR_H -#define CFG_FORMATWR_H - -/** - * printf()-style formatter configuration. - * $WIZ$ type = "enum"; value_list = "printf_list" - * - * \sa PRINTF_DISABLED - * \sa PRINTF_NOMODIFIERS - * \sa PRINTF_REDUCED - * \sa PRINTF_NOFLOAT - * \sa PRINTF_FULL - */ -#define CONFIG_PRINTF PRINTF_FULL - -/** - * Size of buffer to format "%" sequences in printf. - * - * Warning: no check on buffer size is done when formatting, be careful especially - * with big numbers and %f formatting. - * - * $WIZ$ type = "int" - * $WIZ$ min = 4 - */ -#define CONFIG_FRMWRI_BUFSIZE 134 - -#endif /* CFG_FORMATWR_H */ - diff --git a/examples/lpc2378/cfg/cfg_heap.h b/examples/lpc2378/cfg/cfg_heap.h deleted file mode 100644 index 5af8e5c4..00000000 --- a/examples/lpc2378/cfg/cfg_heap.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for heap module. - * - * \version $Id: cfg_heap.h 3256 2010-03-22 16:29:37Z batt $ - * - * \author Daniele Basile - */ - -#ifndef CFG_HEAP_H -#define CFG_HEAP_H - -/** - * Enable malloc/free like API. - * $WIZ$ type = "boolean" - */ -#define CONFIG_HEAP_MALLOC 1 - -#endif /* CFG_HEAP_H */ - - diff --git a/examples/lpc2378/cfg/cfg_i2c.h b/examples/lpc2378/cfg/cfg_i2c.h deleted file mode 100644 index a796c395..00000000 --- a/examples/lpc2378/cfg/cfg_i2c.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for I2C module. - * - * \version $Id: cfg_i2c.h 2561 2009-04-20 09:26:48Z duplo $ - * - * \author Daniele Basile - */ - -#ifndef CFG_I2C_H -#define CFG_I2C_H - -/** -*Comunication frequency. -* -* $WIZ$ type = "int" -*/ -#define CONFIG_I2C_FREQ 100000UL - -/** - * I2C start timeout. - * For how many milliseconds the i2c_start - * should try to get an ACK before - * returning error. - * - * $WIZ$ type = "int" - */ -#define CONFIG_I2C_START_TIMEOUT 100 - -/** - * I2C backend the driver should use. - * - * I2C_BACKEND_BUILTIN: Use (if present) the builtin i2c hardware. - * I2C_BACKEND_BITBANG: Use the emulated bitbang driver. - * \see drv/i2c.h for more information. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "i2c_backend" - */ -#define CONFIG_I2C_BACKEND I2C_BACKEND_BUILTIN - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define I2C_LOG_LEVEL LOG_LVL_INFO - -/** - * module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define I2C_LOG_FORMAT LOG_FMT_TERSE - -#endif /* CFG_I2C_H */ - - diff --git a/examples/lpc2378/cfg/cfg_i2s.h b/examples/lpc2378/cfg/cfg_i2s.h deleted file mode 100644 index 9faf3dd8..00000000 --- a/examples/lpc2378/cfg/cfg_i2s.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for I2S module. - * - * \version $Id: cfg_i2s.h 2743 2009-07-06 15:17:09Z lottaviano $ - * - * \author Luca Ottaviano - */ - -#ifndef CFG_I2S_H -#define CFG_I2S_H - -/** - * Length of each play buffer. - * - * $WIZ$ type = "int" - */ -#define CONFIG_PLAY_BUF_LEN 8192 - -/** - * Sampling frequency of the audio file. - * - * $WIZ$ type = "int" - * $WIZ$ min = 32000 - * $WIZ$ max = 192000 - */ -#define CONFIG_SAMPLE_FREQ 44100UL - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define I2S_LOG_LEVEL LOG_LVL_INFO - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define I2S_LOG_FORMAT LOG_FMT_TERSE - -#endif /* CFG_I2S_H */ diff --git a/examples/lpc2378/cfg/cfg_ini_reader.h b/examples/lpc2378/cfg/cfg_ini_reader.h deleted file mode 100644 index 096c486d..00000000 --- a/examples/lpc2378/cfg/cfg_ini_reader.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for ini reader module. - * - * \version $Id: cfg_ini_reader.h 2710 2009-06-08 13:54:43Z batt $ - * - * \author Luca Ottaviano - */ - -#ifndef CFG_INI_READER_H -#define CFG_INI_READER_H - -/** - * Maximum ini file line length (chars). - * $WIZ$ type = "int"; min = 1 - */ -#define CONFIG_INI_MAX_LINE_LEN 64 - -#endif /* CFG_INI_READER_H */ diff --git a/examples/lpc2378/cfg/cfg_kbd.h b/examples/lpc2378/cfg/cfg_kbd.h deleted file mode 100644 index 97403c1f..00000000 --- a/examples/lpc2378/cfg/cfg_kbd.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for keyboard module. - * - * \version $Id: cfg_kbd.h 2936 2009-09-14 16:19:13Z asterix $ - * - * \author Daniele Basile - */ - -#ifndef CFG_KBD_H -#define CFG_KBD_H - -/// Keyboard polling method. $WIZ$ supports = "False" -#define CONFIG_KBD_POLL KBD_POLL_SOFTINT - -/// Enable keyboard event delivery to observers. $WIZ$ type = "boolean" -#define CONFIG_KBD_OBSERVER 0 - -/// Enable key beeps. $WIZ$ type = "boolean" -#define CONFIG_KBD_BEEP 0 - -/// Enable long pression handler for keys. $WIZ$ type = "boolean" -#define CONFIG_KBD_LONGPRESS 0 - -/// Enable calling poor man's scheduler to be called inside kbd_peek. $WIZ$ type = "boolean" -#define CONFIG_KBD_SCHED 0 - -#endif /* CFG_KBD_H */ - diff --git a/examples/lpc2378/cfg/cfg_kfile.h b/examples/lpc2378/cfg/cfg_kfile.h deleted file mode 100644 index f795af08..00000000 --- a/examples/lpc2378/cfg/cfg_kfile.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for KFile interface module. - * - * \version $Id: cfg_kfile.h 2348 2009-02-16 13:43:44Z duplo $ - * \author Daniele Basile - */ - -#ifndef CFG_KFILE_H -#define CFG_KFILE_H - -/** - * Module logging level. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define KFILE_LOG_LEVEL LOG_LVL_INFO - -/** - * Module logging format. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define KFILE_LOG_FORMAT LOG_FMT_TERSE - -/** - * Enable the gets function with echo. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KFILE_GETS 1 - -#endif /* CFG_KFILE_H */ diff --git a/examples/lpc2378/cfg/cfg_lcd.h b/examples/lpc2378/cfg/cfg_lcd.h deleted file mode 100644 index 8bd9884c..00000000 --- a/examples/lpc2378/cfg/cfg_lcd.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for lcd display module. - * - * \version $Id: cfg_lcd.h 2563 2009-04-20 09:47:08Z batt $ - * - * \author Daniele Basile - */ - -#ifndef CFG_LCD_H -#define CFG_LCD_H - -/** - * Use 4 bit addressing mode. - * $WIZ$ type = "boolean" - */ -#define CONFIG_LCD_4BIT 0 - -/** - * Use a table to speed up LCD memory addressing. - * This will use about 100 bytes of RAM. - * $WIZ$ type = "boolean" - */ -#define CONFIG_LCD_ADDRESS_FAST 1 - -/** - * LCD setting for 32122A (AVR implementation). - * $WIZ$ type = "boolean" - * $WIZ$ supports = "avr and False" - */ -#define CONFIG_LCD_SOFTINT_REFRESH 0 - -/** - * LCD setting for 32122A (AVR implementation). - * $WIZ$ type = "boolean" - * $WIZ$ supports = "avr and False" - */ -#define CONFIG_LCD_WAIT 1 - - -#endif /* CFG_LCD_H */ - diff --git a/examples/lpc2378/cfg/cfg_lm75.h b/examples/lpc2378/cfg/cfg_lm75.h deleted file mode 100644 index 91b347ad..00000000 --- a/examples/lpc2378/cfg/cfg_lm75.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for the LM75 sensor temperature. - * - * \author Daniele Basile - */ - -#ifndef CFG_LM75_H -#define CFG_LM75_H - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define LM75_LOG_LEVEL LOG_LVL_WARN - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define LM75_LOG_FORMAT LOG_FMT_TERSE - -#endif /* CFG_AX25_H */ diff --git a/examples/lpc2378/cfg/cfg_md2.h b/examples/lpc2378/cfg/cfg_md2.h deleted file mode 100644 index 65e4f4e3..00000000 --- a/examples/lpc2378/cfg/cfg_md2.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for MD2 module. - * - * \version $Id: cfg_md2.h 2582 2009-04-20 12:33:48Z batt $ - * - * \author Daniele Basile - */ - -#ifndef CFG_MD2_H -#define CFG_MD2_H - -/** - * Size of block for MD2 algorithm. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - */ -#define CONFIG_MD2_BLOCK_LEN 16 - -/// Use standard permutation in MD2 algorithm. $WIZ$ type = "boolean" -#define CONFIG_MD2_STD_PERM 0 - -#endif /* CFG_MD2_H */ - diff --git a/examples/lpc2378/cfg/cfg_monitor.h b/examples/lpc2378/cfg/cfg_monitor.h deleted file mode 100644 index dcd07e1c..00000000 --- a/examples/lpc2378/cfg/cfg_monitor.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * \file - * - * - * \brief Kernel monitor configuration parameters - * - * \version $Id: cfg_monitor.h 2418 2009-03-25 15:57:34Z batt $ - * \author Bernie Innocenti - */ - -#ifndef CFG_MONITOR_H -#define CFG_MONITOR_H - -/** - * Process monitor. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_MONITOR 1 - -#endif /* CFG_MONITOR_H */ diff --git a/examples/lpc2378/cfg/cfg_nmea.h b/examples/lpc2378/cfg/cfg_nmea.h deleted file mode 100644 index 9249a9af..00000000 --- a/examples/lpc2378/cfg/cfg_nmea.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for NMEA module. - * - * \author Daniele Basile - */ - -#ifndef CFG_NMEA_H -#define CFG_NMEA_H - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define NMEA_LOG_LEVEL LOG_LVL_ERR - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define NMEA_LOG_FORMAT LOG_FMT_TERSE - - -/** - * Maximum number of sentence parsers supported. - * - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_NMEAP_MAX_SENTENCES 8 - -/** - * Max length of a complete sentence. The standard says 82 bytes, but its probably - * better to go at least 128 since some units don't adhere to the 82 bytes - * especially for proprietary sentences. - * - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_NMEAP_MAX_SENTENCE_LENGTH 255 - -/** - * Max tokens in one sentence. 24 is enough for any standard sentence. - * - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_NMEAP_MAX_TOKENS 24 - -#endif /* CFG_NMEA_H */ - diff --git a/examples/lpc2378/cfg/cfg_phase.h b/examples/lpc2378/cfg/cfg_phase.h deleted file mode 100644 index c167776d..00000000 --- a/examples/lpc2378/cfg/cfg_phase.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for phase module. - * - * \version $Id: cfg_phase.h 2582 2009-04-20 12:33:48Z batt $ - * \author Daniele Basile - */ - -#ifndef CFG_PHASE_H -#define CFG_PHASE_H - -/** - * Max value of the duty cycle on triac. - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_TRIAC_MAX_DUTY 100 - -/** - * Max value of the triac power. - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_TRIAC_MAX_POWER 100 - -#endif /* CFG_PHASE_H */ diff --git a/examples/lpc2378/cfg/cfg_pocketbus.h b/examples/lpc2378/cfg/cfg_pocketbus.h deleted file mode 100644 index a331ec7f..00000000 --- a/examples/lpc2378/cfg/cfg_pocketbus.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for pocketbus module. - * - * \version $Id: cfg_pocketbus.h 2580 2009-04-20 12:25:57Z batt $ - * - * \author Daniele Basile - */ - -#ifndef CFG_POCKETBUS_H -#define CFG_POCKETBUS_H - -/** - *Buffer len for pockebus protocol. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - */ -#define CONFIG_POCKETBUS_BUFLEN 128 - -#endif /* CFG_POCKETBUS_H */ diff --git a/examples/lpc2378/cfg/cfg_proc.h b/examples/lpc2378/cfg/cfg_proc.h deleted file mode 100644 index eebcbf22..00000000 --- a/examples/lpc2378/cfg/cfg_proc.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * \file - * - * - * \brief Kernel configuration parameters - * - * \version $Id: cfg_proc.h 3255 2010-03-22 16:13:13Z batt $ - * \author Bernie Innocenti - */ - -#ifndef CFG_PROC_H -#define CFG_PROC_H - -/** - * Enable the multithreading kernel. - * - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN 1 - -/** - * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! - * $WIZ$ type = "boolean" - * $WIZ$ supports = "False" - */ -#define CONFIG_KERN_IRQ 0 - -/** - * Preemptive process scheduling. - * - * $WIZ$ type = "boolean" - * $WIZ$ conditional_deps = "timer" - */ -#define CONFIG_KERN_PREEMPT 1 - -/** - * Time sharing quantum (a prime number prevents interference effects) [ms]. - * - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_KERN_QUANTUM 11 - -/** - * Priority-based scheduling policy. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_PRI 1 - -/** - * Dynamic memory allocation for processes. - * $WIZ$ type = "boolean" - * $WIZ$ conditional_deps = "heap" - */ -#define CONFIG_KERN_HEAP 1 - -/** - * Size of the dynamic memory pool used by processes. - * $WIZ$ type = "int" - * $WIZ$ min = 0 - */ -#define CONFIG_KERN_HEAP_SIZE 16384L - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define KERN_LOG_LEVEL LOG_LVL_ERR - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define KERN_LOG_FORMAT LOG_FMT_VERBOSE - -#endif /* CFG_PROC_H */ diff --git a/examples/lpc2378/cfg/cfg_pwm.h b/examples/lpc2378/cfg/cfg_pwm.h deleted file mode 100644 index 8dfa279b..00000000 --- a/examples/lpc2378/cfg/cfg_pwm.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for PWM module. - * - * \version $Id: cfg_pwm.h 2348 2009-02-16 13:43:44Z duplo $ - * \author Daniele Basile - */ - -#ifndef CFG_PWM_H -#define CFG_PWM_H - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define PWM_LOG_LEVEL LOG_LVL_INFO - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define PWM_LOG_FORMAT LOG_FMT_VERBOSE - -#endif /* CFG_PWM_H */ diff --git a/examples/lpc2378/cfg/cfg_ramp.h b/examples/lpc2378/cfg/cfg_ramp.h deleted file mode 100644 index 6d4b9dff..00000000 --- a/examples/lpc2378/cfg/cfg_ramp.h +++ /dev/null @@ -1,116 +0,0 @@ - /** - * \file - * - * - * \brief Configuration file Ramp algorithm module. - * - * \version $Id: cfg_ramp.h 2582 2009-04-20 12:33:48Z batt $ - * \author Daniele Basile - */ - -#ifndef CFG_RAMP_H -#define CFG_RAMP_H - -/** - * Define whether the ramp will use floating point calculation within ramp_evaluate(). - * Otherwise, a less precise fixed point version will be used, which is faster on - * platforms which do no support floating point operations. - * - * \note Floating point operations will be always done within ramp_compute() to - * precalculate values, so there has to be at least a floating point emulation support. - * - * $WIZ$ type = "boolean" - */ -#define RAMP_USE_FLOATING_POINT 0 - - -#if !RAMP_USE_FLOATING_POINT - - /** - * Number of least-significant bits which are stripped away during ramp evaluation. - * This setting allows to specify larger ramps at the price of less precision. - * - * The maximum ramp size allowed is 2^(24 + RAMP_CLOCK_SHIFT_PRECISION), in clocks. - * For instance, using RAMP_CLOCK_SHIFT_PRECISION 1, and a 8x prescaler, the maximum - * length of a ramp is about 6.7 secs. Raising RAMP_CLOCK_SHIFT_PRECISION to 2 - * brings the maximum length to 13.4 secs, at the price of less precision. - * - * ramp_compute() will check that the length is below the maximum allowed through - * a runtime assertion. - * - * \note This macro is used only for the fixed-point version of the ramp. - * $WIZ$ type = "int" - * $WIZ$ min = 0 - * $WIZ$ max = 32 - */ - #define RAMP_CLOCK_SHIFT_PRECISION 2 -#endif - - -/** -* Negative pulse width for ramp. -* $WIZ$ type = "int" -* $WIZ$ min = 1 -*/ -#define RAMP_PULSE_WIDTH 50 - -/** - * Default ramp time (microsecs). - * $WIZ$ type = "int" - * $WIZ$ min = 1000 - */ -#define RAMP_DEF_TIME 6000000UL -/** - * Default ramp maxfreq (Hz). - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define RAMP_DEF_MAXFREQ 5000 -/** - * Default ramp minfreq (Hz). - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define RAMP_DEF_MINFREQ 200 -/** - * Default ramp powerrun (deciampere). - * $WIZ$ type = "int" - * $WIZ$ min = 0 - */ -#define RAMP_DEF_POWERRUN 10 -/** - * Default ramp poweridle (Hz). - * $WIZ$ type = "int" - * $WIZ$ min = 0 - */ -#define RAMP_DEF_POWERIDLE 1 - -#endif /* CFG_RAMP_H */ diff --git a/examples/lpc2378/cfg/cfg_randpool.h b/examples/lpc2378/cfg/cfg_randpool.h deleted file mode 100644 index 4eb099e9..00000000 --- a/examples/lpc2378/cfg/cfg_randpool.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for randpool module. - * - * \version $Id: cfg_randpool.h 2950 2009-09-16 10:08:31Z asterix $ - * - * \author Daniele Basile - */ - -#ifndef CFG_RANDPOOL_H -#define CFG_RANDPOOL_H - - -/** - * Define a size, in byte, of entropy pool. - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_SIZE_ENTROPY_POOL 64 - -/// Enable timer in randpool algo. $WIZ$ type = "boolean" -#define CONFIG_RANDPOOL_TIMER 1 - -#endif /* CFG_RANDPOOL_H */ - - diff --git a/examples/lpc2378/cfg/cfg_sem.h b/examples/lpc2378/cfg/cfg_sem.h deleted file mode 100644 index 1d3c674f..00000000 --- a/examples/lpc2378/cfg/cfg_sem.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * \file - * - * - * \brief Kernel semaphores configuration parameters. - * - * \version $Id: cfg_sem.h 2418 2009-03-25 15:57:34Z batt $ - * \author Bernie Innocenti - */ - -#ifndef CFG_SEM_H -#define CFG_SEM_H - -/** - * Re-entrant mutual exclusion primitives. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_SEMAPHORES 0 - -#endif /* CFG_SEM_H */ diff --git a/examples/lpc2378/cfg/cfg_ser.h b/examples/lpc2378/cfg/cfg_ser.h deleted file mode 100644 index 91a10e0b..00000000 --- a/examples/lpc2378/cfg/cfg_ser.h +++ /dev/null @@ -1,222 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for serial module. - * - * \author Daniele Basile - */ - -#ifndef CFG_SER_H -#define CFG_SER_H - -/** - * Example of setting for serial port and - * spi port. - * Edit these define for your project. - */ - -/** - * Size of the outbound FIFO buffer for port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - */ -#define CONFIG_UART0_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - */ -#define CONFIG_UART0_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" - */ -#define CONFIG_UART1_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" - */ -#define CONFIG_UART1_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for port 2 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2" - */ -#define CONFIG_UART2_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 2 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2" - */ -#define CONFIG_UART2_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for port 3 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lpc2" - */ -#define CONFIG_UART3_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 3 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lpc2" - */ -#define CONFIG_UART3_RXBUFSIZE 32 - - -/** - * Size of the outbound FIFO buffer for SPI port [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for SPI port [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for SPI port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI0_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for SPI port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI0_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for SPI port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI1_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for SPI port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI1_RXBUFSIZE 32 - -/** - * SPI data order. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "ser_order_bit" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST - -/** - * SPI clock division factor. - * $WIZ$ type = "int" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_CLOCK_DIV 16 - -/** - * SPI clock polarity: normal low or normal high. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "ser_spi_pol" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW - -/** - * SPI clock phase you can choose sample on first edge or - * sample on second clock edge. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "ser_spi_phase" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE - -/** - * Default transmit timeout (ms). Set to -1 to disable timeout support. - * $WIZ$ type = "int" - * $WIZ$ min = -1 - */ -#define CONFIG_SER_TXTIMEOUT -1 - -/** - * Default receive timeout (ms). Set to -1 to disable timeout support. - * $WIZ$ type = "int" - * $WIZ$ min = -1 - */ -#define CONFIG_SER_RXTIMEOUT -1 - -/** - * Use RTS/CTS handshake. - * $WIZ$ type = "boolean" - * $WIZ$ supports = "False" - */ -#define CONFIG_SER_HWHANDSHAKE 0 - -/** - * Default baudrate for all serial ports (set to 0 to disable). - * $WIZ$ type = "int" - * $WIZ$ min = 0 - */ -#define CONFIG_SER_DEFBAUDRATE 0UL - -/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" -#define CONFIG_SER_STROBE 0 - -#endif /* CFG_SER_H */ diff --git a/examples/lpc2378/cfg/cfg_signal.h b/examples/lpc2378/cfg/cfg_signal.h deleted file mode 100644 index fabbb666..00000000 --- a/examples/lpc2378/cfg/cfg_signal.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * \file - * - * - * \brief Kernel signals configuration parameters - * - * \version $Id: cfg_signal.h 2418 2009-03-25 15:57:34Z batt $ - * \author Bernie Innocenti - */ - -#ifndef CFG_SIGNAL_H -#define CFG_SIGNAL_H - -/** - * Inter-process signals. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_SIGNALS 0 - -#endif /* CFG_SIGNAL_H */ diff --git a/examples/lpc2378/cfg/cfg_spi_bitbang.h b/examples/lpc2378/cfg/cfg_spi_bitbang.h deleted file mode 100644 index 8761d44a..00000000 --- a/examples/lpc2378/cfg/cfg_spi_bitbang.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for SPI bitbang module. - * - * \version $Id: cfg_spi_bitbang.h 2348 2009-02-16 13:43:44Z duplo $ - * - * \author Daniele Basile - */ - -#ifndef CFG_SPI_BITBANG_H -#define CFG_SPI_BITBANG_H - -/** - * Set data order for emulated SPI. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "ordet_bit_list" - */ -#define CONFIG_SPI_DATAORDER SPI_LSB_FIRST - -#endif /* CFG_SPI_BITBANG_H */ - diff --git a/examples/lpc2378/cfg/cfg_stepper.h b/examples/lpc2378/cfg/cfg_stepper.h deleted file mode 100644 index 9dbf0e84..00000000 --- a/examples/lpc2378/cfg/cfg_stepper.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for stepper motor module. - * - * \version $Id: cfg_stepper.h 2582 2009-04-20 12:33:48Z batt $ - * \author Daniele Basile - */ - -#ifndef CFG_STEPPER_H -#define CFG_STEPPER_H - -/** - * Module logging level. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define STEPPER_LOG_LEVEL LOG_LVL_INFO - -/** - * Module logging format. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define STEPPER_LOG_FORMAT LOG_FMT_TERSE - -/** - * Max number of the stepper motor. - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_NUM_STEPPER_MOTORS 6 - -/** - * Max number of the timer usable on target to drive stepper motor. - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_TC_STEPPER_MAX_NUM 6 - -#endif /* CFG_STEPPER_H */ diff --git a/examples/lpc2378/cfg/cfg_tas5706a.h b/examples/lpc2378/cfg/cfg_tas5706a.h deleted file mode 100644 index dcebde4b..00000000 --- a/examples/lpc2378/cfg/cfg_tas5706a.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for the TAS5706A module. - * - * \version $Id: cfg_tas5706a.h 2740 2009-07-06 08:16:22Z lottaviano $ - * \author Luca Ottaviano - */ - -#ifndef CFG_TAS5706A_H -#define CFG_TAS5706A_H - -/** - * Maximum output volume for TAS chip [dB]. - * - * $WIZ$ type = "int" - * $WIZ$ min = -100 - * $WIZ$ max = 24 - */ -#define CONFIG_TAS_MAX_VOL -39 - -#endif /* CFG_TAS5706A_H */ diff --git a/examples/lpc2378/cfg/cfg_thermo.h b/examples/lpc2378/cfg/cfg_thermo.h deleted file mode 100644 index ed8deb41..00000000 --- a/examples/lpc2378/cfg/cfg_thermo.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for thermo module. - * - * \version $Id: cfg_thermo.h 2574 2009-04-20 10:50:42Z batt $ - * \author Daniele Basile - */ - -#ifndef CFG_THERMO_H -#define CFG_THERMO_H - -/** - * Interval at which thermo control is performed [ms]. - * - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_THERMO_INTERVAL_MS 100 - -/** - * Number of different samples we interpolate over to get the hifi temperature. - * - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_THERMO_HIFI_NUM_SAMPLES 10 - -#endif /* CFG_THERMO_H */ diff --git a/examples/lpc2378/cfg/cfg_timer.h b/examples/lpc2378/cfg/cfg_timer.h deleted file mode 100644 index d0475d5f..00000000 --- a/examples/lpc2378/cfg/cfg_timer.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for timer module. - * - * \version $Id: cfg_timer.h 2348 2009-02-16 13:43:44Z duplo $ - * - * \author Daniele Basile - */ - -#ifndef CFG_TIMER_H -#define CFG_TIMER_H - -/** - * Hardware timer selection for drv/timer.c. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "timer_select" - */ -#define CONFIG_TIMER TIMER_DEFAULT - -/** - * Debug timer interrupt using a strobe pin. - * $WIZ$ type = "boolean" - */ -#define CONFIG_TIMER_STROBE 0 - -/** - * Enable asynchronous timers. - * $WIZ$ type = "boolean" - */ -#define CONFIG_TIMER_EVENTS 1 - -/** - * Support hi-res timer_usleep(). - * $WIZ$ type = "boolean" - */ -#define CONFIG_TIMER_UDELAY 1 - -#endif /* CFG_TIMER_H */ diff --git a/examples/lpc2378/cfg/cfg_wdt.h b/examples/lpc2378/cfg/cfg_wdt.h deleted file mode 100644 index 0e491b10..00000000 --- a/examples/lpc2378/cfg/cfg_wdt.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for watchdog module. - * - * \version $Id: cfg_wdt.h 2576 2009-04-20 11:03:51Z batt $ - * - * \author Daniele Basile - */ - -#ifndef CFG_WDT_H -#define CFG_WDT_H - -/// Enable watchdog timer. $WIZ$ type = "autoenabled" -#define CONFIG_WATCHDOG 0 - -#endif /* CFG_WDT_H */ - - diff --git a/examples/lpc2378/cfg/cfg_xmodem.h b/examples/lpc2378/cfg/cfg_xmodem.h deleted file mode 100644 index 3e092c21..00000000 --- a/examples/lpc2378/cfg/cfg_xmodem.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for xmodem module. - * - * \version $Id: cfg_xmodem.h 2579 2009-04-20 12:25:40Z batt $ - * - * \author Daniele Basile - */ - -#ifndef CFG_XMODEM_H -#define CFG_XMODEM_H - -/// Enable Rx. $WIZ$ type = "boolean" -#define CONFIG_XMODEM_RECV 1 - -/// Enable TX. $WIZ$ type = "boolean" -#define CONFIG_XMODEM_SEND 1 - -/// Allow a Rx/Tx of 1Kbyte block. $WIZ$ type = "boolean" -#define CONFIG_XMODEM_1KCRC 1 - -/** - * Max retries before giving up. - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_XMODEM_MAXRETRIES 15 - -/** - * Max retries before switching to BCC. - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_XMODEM_MAXCRCRETRIES 7 - -#endif /* CFG_XMODEM_H */ - diff --git a/examples/lpc2378/hw/hw_afsk.h b/examples/lpc2378/hw/hw_afsk.h deleted file mode 100644 index a0a348d9..00000000 --- a/examples/lpc2378/hw/hw_afsk.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * \file - * - * - * \brief AFSK modem hardware-specific definitions. - * - * \version $Id: hw_afsk.h 3072 2009-10-10 13:01:56Z batt $ - * - * \author Francesco Sacchi - */ - -#ifndef HW_AFSK_H -#define HW_AFSK_H - -#include "cfg/cfg_arch.h" - -#warning TODO:This is an example implementation, you must implement it! - -/** - * Initialize the specified channel of the ADC for AFSK needs. - * The adc should be configured to have a continuos stream of convertions. - * For every convertion there must be an ISR that read the sample - * and call afsk_adc_isr(), passing the context and the sample. - * - * \param ch channel to be used for AFSK demodulation. - * \param ctx AFSK context (\see Afsk). This parameter must be saved and - * passed back to afsk_adc_isr() for every convertion. - */ -#define AFSK_ADC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) - -#define AFSK_STROBE_INIT() do { /* Implement me */ } while (0) -#define AFSK_STROBE_ON() do { /* Implement me */ } while (0) -#define AFSK_STROBE_OFF() do { /* Implement me */ } while (0) - -/** - * Initialize the specified channel of the DAC for AFSK needs. - * The DAC has to be configured in order to call an ISR for every sample sent. - * The DAC doesn't have to start the IRQ immediatly but have to wait - * the AFSK driver to call AFSK_DAC_IRQ_START(). - * The ISR must then call afsk_dac_isr() passing the AFSK context. - * \param ch DAC channel to be used for AFSK modulation. - * \param ctx AFSK context (\see Afsk). This parameter must be saved and - * passed back to afsk_dac_isr() for every convertion. - */ -#define AFSK_DAC_INIT(ch, ctx) do { (void)ch, (void)ctx; } while (0) - -/** - * Start DAC convertions on channel \a ch. - * \param ch DAC channel. - */ -#define AFSK_DAC_IRQ_START(ch) do { (void)ch; /* Implement me */ } while (0) - -/** - * Stop DAC convertions on channel \a ch. - * \param ch DAC channel. - */ -#define AFSK_DAC_IRQ_STOP(ch) do { (void)ch; /* Implement me */ } while (0) - -#endif /* HW_AFSK_H */ diff --git a/examples/lpc2378/hw/hw_buzzer.h b/examples/lpc2378/hw/hw_buzzer.h deleted file mode 100644 index 01683c85..00000000 --- a/examples/lpc2378/hw/hw_buzzer.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * \file - * - * - * \brief Buzzer hardware-specific definitions - * - * \version $Id: hw_buzzer.h 2506 2009-04-15 08:29:07Z duplo $ - * - * \author Francesco Sacchi - */ - -#ifndef HW_BUZZER_H -#define HW_BUZZER_H - -#warning TODO:This is an example implementation, you must implement it! - -#define BUZZER_BIT 1 -#define IS_BUZZER_ON 0 -#define BUZZER_HW_INIT do { /* Implement me! */ } while (0) -#define BUZZER_ON do { /* Implement me! */ } while (0) -#define BUZZER_OFF do { /* Implement me! */ } while (0) - -#endif /* HW_BUZZER_H */ diff --git a/examples/lpc2378/hw/hw_dataflash.c b/examples/lpc2378/hw/hw_dataflash.c deleted file mode 100644 index b3944b37..00000000 --- a/examples/lpc2378/hw/hw_dataflash.c +++ /dev/null @@ -1,126 +0,0 @@ -/** - * \file - * - * - * \brief Dataflash HW control routines. - * - * \version $Id: hw_dataflash.c 1398 2008-05-27 16:36:05Z asterix $ - * \author Francesco Sacchi - */ - -#include "hw/hw_dataflash.h" - -#include -#include -#include - -#warning TODO:This is an example implementation, you must implement it! - -MOD_DEFINE(hw_dataflash); - -/** - * Data flash init function. - * - * This function provide to initialize all that - * needs to drive a dataflash memory. - * Generaly needs to init pins to drive a CS line - * and reset line. - */ -void dataflash_hw_init(void) -{ - - //Disable CS line (remove if not needed) - dataflash_hw_setCS(false); - - /* - * Put here your code! - * - * Note: - * - if you drive manualy CS line, here init a CS pin - * - if you use a dedicated reset line, here init a reset pin - */ - - MOD_INIT(hw_dataflash); -} - -/** - * Chip Select drive. - * - * This function enable or disable a CS line. - * You must implement this function comply to a dataflash - * memory datasheet to allow the drive to enable a memory - * when \p enable flag is true, and disable it when is false. - */ -void dataflash_hw_setCS(bool enable) -{ - if (enable) - { - /* - * Put here your code to enable - * dataflash memory - */ - } - else - { - /* - * Put here your code to disable - * dataflash memory - */ - } -} - -/** - * Reset data flash memory. - * - * This function provide to send reset signal to - * dataflash memory. You must impement it comly to a dataflash - * memory datasheet to allow the drive to set a reset pin - * when \p enable flag is true, and disable it when is false. - * - */ -void dataflash_hw_setReset(bool enable) -{ - if (enable) - { - /* - * Put here your code to set reset of - * dataflash memory - */ - } - else - { - /* - * Put here your code to clear reset of - * dataflash memory - */ - } -} - diff --git a/examples/lpc2378/hw/hw_dataflash.h b/examples/lpc2378/hw/hw_dataflash.h deleted file mode 100644 index 8c2f0b89..00000000 --- a/examples/lpc2378/hw/hw_dataflash.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * \file - * - * - * \brief Dataflash HW control routines (interface). - * - * \version $Id: hw_dataflash.h 1312 2008-05-20 16:54:52Z asterix $ - * \author Francesco Sacchi - */ - -#ifndef HW_DATAFLASH_H -#define HW_DATAFLASH_H - -#include - -void dataflash_hw_init(void); -void dataflash_hw_setCS(bool enable); -void dataflash_hw_setReset(bool enable); - -#endif /* HW_DATAFLASH_H */ diff --git a/examples/lpc2378/hw/hw_dc_motor.h b/examples/lpc2378/hw/hw_dc_motor.h deleted file mode 100644 index 913ead7d..00000000 --- a/examples/lpc2378/hw/hw_dc_motor.h +++ /dev/null @@ -1,85 +0,0 @@ -/** - * \file - * - * - * \brief DC motor hardware-specific definitions - * - * \version $Id: hw_dc_motor.h 2859 2009-09-02 09:30:18Z asterix $ - * - * \author Daniele Basile - */ - -#ifndef HW_DC_MOTOR_H -#define HW_DC_MOTOR_H - -typedef enum MotorDCMap -{ - - /* Put here motor dc declaration */ - MOTOR_DC_CNT - -} MotorDCMap; - -/* - * Init all pin and device to manage dc motor. - */ -#define MOTOR_DC_INIT() \ - do { \ - /* Implement me! */ \ - } while (0) - - -/* - * Enable DC motor. - */ -#define DC_MOTOR_ENABLE(dev) \ - do { \ - /* Implement me! */ \ - } while (0) - -/* - * Disable DC motor. - */ -#define DC_MOTOR_DISABLE(dev) \ - do { \ - /* Implement me! */ \ - } while (0) - -/* - * Set direction for DC motor. - */ -#define DC_MOTOR_SET_DIR(dev, dir) \ - do { \ - /* Implement me! */ \ - } while (0) - - -#endif /* HW_DC_MOTOR_H */ diff --git a/examples/lpc2378/hw/hw_ft245rl.h b/examples/lpc2378/hw/hw_ft245rl.h deleted file mode 100644 index 34b157f6..00000000 --- a/examples/lpc2378/hw/hw_ft245rl.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * \file - * - * - * \brief FT245RL USB interface hardware-specific definitions - * - * \version $Id: hw_ft245rl.h 1777 2008-09-04 15:19:48Z batt $ - * - * \author Francesco Sacchi - */ - -#ifndef HW_FT245RL_H -#define HW_FT245RL_H - -#warning TODO:This is an example implementation, you must implement it! - -#define FT245RL_DATA_IN() /* Implement me! */ -#define FT245RL_DATA_OUT() /* Implement me! */ -#define WR_HI /* Implement me! */ -#define WR_LO /* Implement me! */ - -#define RD_HI /* Implement me! */ -#define RD_LO /* Implement me! */ - -#define FT245RL_INIT() \ -do \ -{ \ - /* Implement me! */ \ -} while(0) - -#define FT245RL_DATA_RDY() (/* Implement me! */ false) -#define FT245RL_GETDATA() ({/* Implement me! */ (0);}) -#define FT245RL_TX_ALLOWED() (/* Implement me! */ false) -#define FT245RL_SETDATA(data) do {/* Implement me! */ (void)((data)); } while(0) - -#endif /* HW_FT245RL_H */ - diff --git a/examples/lpc2378/hw/hw_i2c_bitbang.h b/examples/lpc2378/hw/hw_i2c_bitbang.h deleted file mode 100644 index 743e28b7..00000000 --- a/examples/lpc2378/hw/hw_i2c_bitbang.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * \file - * - * - * \brief Macro for I2C bitbang operation. - * - * - * \version $Id: hw_i2c_bitbang.h 2506 2009-04-15 08:29:07Z duplo $ - * - * \author Francesco Sacchi - */ - -#ifndef HW_I2C_BITBANG_H -#define HW_I2C_BITBANG_H - -#warning TODO:This is an example implementation, you must implement it! - -#define SDA_HI do { /* Implement me:Set SDA High by setting SDA pin as input */ } while (0) -#define SDA_LO do { /* Implement me:Set SDA Low by setting SDA pin as open collector output */ } while (0) -#define SCL_HI do { /* Implement me:Set SCL High by setting SCL pin as input */ } while (0) -#define SCL_LO do { /* Implement me:Set SCL Low by setting SCL pin as open collector output */ } while (0) - - -#define SCL_IN (true) /* Implement me: read SDA pin state */ -#define SDA_IN (true) /* Implement me: read SCL pin state */ - -/** - * This macro should set SDA and SCL lines as input. - */ -#define I2C_BITBANG_HW_INIT do { /* Implement me! */ } while (0) - -/** - * Half bit delay routine used to generate the correct timings. - */ -#define I2C_HALFBIT_DELAY() do { /* Implement me! */ } while (0) - -#endif /* HW_I2C_BITBANG_H */ diff --git a/examples/lpc2378/hw/hw_kbd.h b/examples/lpc2378/hw/hw_kbd.h deleted file mode 100644 index 2c59dd58..00000000 --- a/examples/lpc2378/hw/hw_kbd.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * \file - * - * - * \brief Keyboard hardware-specific definitions - * - * \version $Id: hw_kbd.h 2649 2009-04-23 12:51:28Z duplo $ - * - * \author Francesco Sacchi - * \author Stefano Fedrigo - */ - -#ifndef HW_KBD_H -#define HW_KBD_H - -#include "hw/kbd_map.h" - -#include - -#warning TODO:This is an example implementation, you must implement it! - -#define K_RPT_MASK (K_UP | K_DOWN | K_OK | K_CANCEL) - -#define KBD_HW_INIT \ - do { \ - /* Put here code to init hw */ \ - } while (0) - -EXTERN_C int emul_kbdReadCols(void); - -/** - * Read the keyboard ports and return the mask of - * depressed keys. - */ -INLINE keymask_t kbd_readkeys(void) -{ - /* Implement me! */ - - //Only for test remove when implement this function - return 0; -} - -#endif /* HW_KBD_H */ diff --git a/examples/lpc2378/hw/hw_lcd_32122a.h b/examples/lpc2378/hw/hw_lcd_32122a.h deleted file mode 100644 index 6ec29c5c..00000000 --- a/examples/lpc2378/hw/hw_lcd_32122a.h +++ /dev/null @@ -1,155 +0,0 @@ -/** - * \file - * - * - * \brief Displaytech 32122A LCD driver - * - * \author Bernie Innocenti - * \author Stefano Fedrigo - * - */ - -#ifndef HW_LCD_32122A_H -#define HW_LCD_32122A_H - -#include -#include - -#warning TODO:This is an example implementation, you must implement it! - -/** - * Predefined LCD PWM contrast values - */ -#define LCD_DEF_PWM 145 -#define LCD_MAX_PWM 505 -#define LCD_MIN_PWM 130 -#define LCD_PWM_CH 0 - - -/** - * \name LCD I/O pins/ports - * @{ - */ -#define LCD_RS /* Implement me! */ -#define LCD_RW /* Implement me! */ -#define LCD_PE_E1 /* Implement me! */ -#define LCD_PE_E2 /* Implement me! */ -#define LCD_DB0 /* Implement me! */ -#define LCD_DB1 /* Implement me! */ -#define LCD_DB2 /* Implement me! */ -#define LCD_DB3 /* Implement me! */ -#define LCD_DB4 /* Implement me! */ -#define LCD_DB5 /* Implement me! */ -#define LCD_DB6 /* Implement me! */ -#define LCD_DB7 /* Implement me! */ -#define LCD_PF_DB0 /* Implment me! */ -/*@}*/ - -/** - * \name LCD bus control macros - * @{ - */ -#define LCD_CLR_A0 do { /* Implement me! */ } while (0) -#define LCD_SET_A0 do { /* Implement me! */ } while (0) -#define LCD_CLR_RD do { /* Implement me! */ } while (0) -#define LCD_SET_RD do { /* Implement me! */ } while (0) -#define LCD_CLR_E1 do { /* Implement me! */ } while (0) -#define LCD_SET_E1 do { /* Implement me! */ } while (0) -#define LCD_CLR_E2 do { /* Implement me! */ } while (0) -#define LCD_SET_E2 do { /* Implement me! */ } while (0) -#define LCD_SET_E(x) do { (void)x; /* Implement me! */ } while (0) -#define LCD_CLR_E(x) do { (void)x; /* Implement me! */ } while (0) -/*@}*/ - -/** - * \name Chip select bits for LCD_SET_E() - * @{ - */ -#define LCDF_E1 ( 0/* Implement me! */) -#define LCDF_E2 ( 0/* Implement me! */) -/*@}*/ -/** Read from the LCD data bus (DB[0-7]) */ -#define LCD_WRITE(x) ((void)x)/* Implement me! */ -/** Write to the LCD data bus (DB[0-7]) */ -#define LCD_READ (0 /* Implement me! */ ) - -/** Set data bus direction to output (write to display) */ -#define LCD_DB_OUT /* Implement me! */ - -/** Set data bus direction to input (read from display) */ -#define LCD_DB_IN /* Implement me! */ - -/** Delay for write (Enable pulse width, 220ns) */ -#define LCD_DELAY_WRITE \ - do { \ - NOP; \ - NOP; \ - NOP; \ - NOP; \ - NOP; \ - } while (0) - -/** Delay for read (Data ouput delay time, 120ns) */ -#define LCD_DELAY_READ \ - do { \ - NOP; \ - NOP; \ - NOP; \ - NOP; \ - } while (0) - - -#define LCD_32122_RESET() do { /* Implement me! */ } while (0) - -INLINE void lcd_32122a_hw_bus_init(void) -{ - cpu_flags_t flags; - IRQ_SAVE_DISABLE(flags); - - /* - * Here set bus pin! - * to init a lcd device. - * - */ - - /* - * Data bus is in output state most of the time: - * LCD r/w functions assume it is left in output state - */ - LCD_DB_OUT; - - - IRQ_RESTORE(flags); -} - -#endif /* HW_LCD_32122A_H */ - diff --git a/examples/lpc2378/hw/hw_lcd_hd44.h b/examples/lpc2378/hw/hw_lcd_hd44.h deleted file mode 100644 index dfebbcab..00000000 --- a/examples/lpc2378/hw/hw_lcd_hd44.h +++ /dev/null @@ -1,157 +0,0 @@ -/** - * \file - * - * - * \brief LCD low-level hardware macros - * - * \author Bernie Innocenti - * \author Stefano Fedrigo - * - */ - -#ifndef HW_LCD_HD44_H -#define HW_LCD_HD44_H - -#include "cfg/cfg_lcd_hd44.h" /* CONFIG_LCD_4BIT */ - -#include -#include - -#warning TODO:This is an example implementation, you must implement it! - -/** - * \name LCD I/O pins/ports - * @{ - */ -#define LCD_RS /* Implement me! */ -#define LCD_RW /* Implement me! */ -#define LCD_E /* Implement me! */ -#define LCD_DB0 /* Implement me! */ -#define LCD_DB1 /* Implement me! */ -#define LCD_DB2 /* Implement me! */ -#define LCD_DB3 /* Implement me! */ -#define LCD_DB4 /* Implement me! */ -#define LCD_DB5 /* Implement me! */ -#define LCD_DB6 /* Implement me! */ -#define LCD_DB7 /* Implement me! */ -/*@}*/ - -/** - * \name DB high nibble (DB[4-7]) - * @{ - */ - -#if CONFIG_LCD_4BIT - #define LCD_MASK (LCD_DB7 | LCD_DB6 | LCD_DB5 | LCD_DB4) - #define LCD_SHIFT 4 -#else - #define LCD_MASK (uint8_t)0xff - #define LCD_SHIFT 0 -#endif -/*@}*/ - -/** - * \name LCD bus control macros - * @{ - */ -#define LCD_CLR_RS /* Implement me! */ -#define LCD_SET_RS /* Implement me! */ -#define LCD_CLR_RD /* Implement me! */ -#define LCD_SET_RD /* Implement me! */ -#define LCD_CLR_E /* Implement me! */ -#define LCD_SET_E /* Implement me! */ - -/* Enter command mode */ -#define LCD_SET_COMMAND() /* Implement me! */ - -/* Enter data mode */ -#define LCD_SET_DATA() /* Implement me! */ - -#if CONFIG_LCD_4BIT - #define LCD_WRITE_H(x) ((void)x)/* Implement me! */ - #define LCD_WRITE_L(x) ((void)x)/* Implement me! */ - #define LCD_READ_H ( 0 /* Implement me! */ ) - #define LCD_READ_L ( 0 /* Implement me! */ ) -#else - #define LCD_WRITE(x) ((void)x)/* Implement me! */ - #define LCD_READ (0 /* Implement me! */ ) -#endif -/*@}*/ - -/** Set data bus direction to output (write to display) */ -#define LCD_DB_OUT /* Implement me! */ - -/** Set data bus direction to input (read from display) */ -#define LCD_DB_IN /* Implement me! */ -/** Delay for write (Enable pulse width, 220ns) */ -#define LCD_DELAY_WRITE \ - do { \ - NOP; \ - NOP; \ - NOP; \ - NOP; \ - NOP; \ - } while (0) - -/** Delay for read (Data ouput delay time, 120ns) */ -#define LCD_DELAY_READ \ - do { \ - NOP; \ - NOP; \ - NOP; \ - NOP; \ - } while (0) - - - -INLINE void lcd_hd44_hw_bus_init(void) -{ - cpu_flags_t flags; - IRQ_SAVE_DISABLE(flags); - - /* - * Here set bus pin! - * to init a lcd device. - * - */ - - /* - * Data bus is in output state most of the time: - * LCD r/w functions assume it is left in output state - */ - LCD_DB_OUT; - - - IRQ_RESTORE(flags); -} - -#endif /* HW_LCD_HD44_H */ diff --git a/examples/lpc2378/hw/hw_led.h b/examples/lpc2378/hw/hw_led.h deleted file mode 100644 index e8c055b3..00000000 --- a/examples/lpc2378/hw/hw_led.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * \file - * - * - * \brief LED on/off macros for LPC-P2378. - * - * \author Andrea Righi - */ - -#ifndef HW_LED_H -#define HW_LED_H - -#include - -#define STATUS_LED (1 << 19) - -#define LED_ON() do { IOCLR1 = STATUS_LED; } while (0) -#define LED_OFF() do { IOSET1 = STATUS_LED; } while (0) - -#define LED_INIT() do { IODIR1 |= STATUS_LED; } while (0) - -#endif /* HW_LED_H */ diff --git a/examples/lpc2378/hw/hw_lm75.h b/examples/lpc2378/hw/hw_lm75.h deleted file mode 100644 index 290dae09..00000000 --- a/examples/lpc2378/hw/hw_lm75.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * \file - * - * - * \brief Hardware macro definition. - * - * \author Daniele Basile - */ - -#ifndef HW_LM75_H -#define HW_LM75_H - -#warning TODO:This is an example implentation, you must implement it! - -#define LM75_HW_INIT() \ - do { \ - /* Pin init */\ - } while (0) - -#endif /* HW_LM75_H */ - diff --git a/examples/lpc2378/hw/hw_mcp41.c b/examples/lpc2378/hw/hw_mcp41.c deleted file mode 100644 index 2a8415df..00000000 --- a/examples/lpc2378/hw/hw_mcp41.c +++ /dev/null @@ -1,53 +0,0 @@ -/** - * \file - * - * - * \brief MCP41 hardware-specific definitions - * - * \version $Id: hw_mcp41.c 2506 2009-04-15 08:29:07Z duplo $ - * \author Francesco Sacchi - */ - -#include "hw/hw_mcp41.h" - -#include -#include - -#warning TODO:This is an example implementation, you must implement it! - -const uint16_t mcp41_ports[MCP41_CNT] = -{ - 0, /* add here mcp41 ports */ -}; -const uint8_t mcp41_pins [MCP41_CNT] = -{ - 0, /* add here mcp41 ports */ -}; - diff --git a/examples/lpc2378/hw/hw_mcp41.h b/examples/lpc2378/hw/hw_mcp41.h deleted file mode 100644 index b1b5cd03..00000000 --- a/examples/lpc2378/hw/hw_mcp41.h +++ /dev/null @@ -1,75 +0,0 @@ -/** - * \file - * - * - * \brief MCP41 hardware-specific definitions - * - * \version $Id: hw_mcp41.h 2544 2009-04-17 14:21:09Z batt $ - * \author Francesco Sacchi - */ - -#ifndef HW_MCP41_H -#define HW_MCP41_H - -#include "hw/mcp41_map.h" - -#include - - -#warning TODO:This is an example implementation, you must implement it! - - -INLINE void SET_MCP41_DDR(Mcp41Dev dev) -{ - /* Implement me! */ - //Warning: this funtions is like avr target name, - //fix it to comply for all target. - - //Only for test remove when implement this function - (void)dev; -} - -INLINE void MCP41_ON(Mcp41Dev i) -{ - /* Implement me! */ - - //Only for test remove when implement this function - (void)i; -} - -INLINE void MCP41_OFF(Mcp41Dev i) -{ - /* Implement me! */ - - //Only for test remove when implement this function - (void)i; -} - -#endif /* HW_MCP41_H */ diff --git a/examples/lpc2378/hw/hw_ntc.c b/examples/lpc2378/hw/hw_ntc.c deleted file mode 100644 index b8c56914..00000000 --- a/examples/lpc2378/hw/hw_ntc.c +++ /dev/null @@ -1,46 +0,0 @@ -/** - * \file - * - * - * \brief NTC hardware-specific definition - * - * \version $Id: hw_ntc.h 1359 2008-05-26 09:42:37Z asterix $ - * \author Lorenzo Berni - * - */ - -#include -#include "hw/ntc_map.h" - -const res_t NTC_RSER[NTC_CNT]; -const res_t NTC_RPAR[NTC_CNT]; -const amp_t NTC_AMP[NTC_CNT]; -const NtcHwInfo* NTC_INFO[NTC_CNT]; diff --git a/examples/lpc2378/hw/hw_ntc.h b/examples/lpc2378/hw/hw_ntc.h deleted file mode 100644 index d3976b02..00000000 --- a/examples/lpc2378/hw/hw_ntc.h +++ /dev/null @@ -1,136 +0,0 @@ -/** - * \file - * - * - * \brief NTC hardware-specific definition - * - * \version $Id: hw_ntc.h 1359 2008-05-26 09:42:37Z asterix $ - * \author Francesco Sacchi - * - * A NTC acts as a variable resistor, whose resistance changes as a - * function of the temperature it measures. To sample it correctly, it is - * usually parallelized and serialized with two fixed resistor. The following diagram shows - * what is the exact disposition of the components, as handled by this - * library: - * - *
- *                 o Vref
- *                 |
- *                 |                               o Vref
- *                 |                               |
- *               -----                             |
- *              |     |                        ---------
- *              | Rser|                       |         |
- *              |     |                       |         |
- *               -----     -----              |   ADC   |
- *                 | Vp   |     |             |         |
- *      -----------|------| Amp |-------------|         |
- *     |           |      |     |      Vadc   |         |
- *   -----       -----     -----               ---------
- *  |     |     |     |
- *  | NTC |     | Rpar|
- *  |     |     |     |
- *   -----       -----
- *     |           |
- *     |           |
- *   -----       -----
- *    ---         ---
- *
- * Amp is an amplifier that amplify of AMP times the signal. - * If we indicate Rp as the parallel of NTC with Rpar, ADCBITS as the bits of the ad converter - * and ADCVAL as the result from the adc convertion (Not Vadc but just the value read - * from the adc register), after various calculation, the expression of Rp is: - * - *
- *
- *            ADCVAL * Rser
- * Rp = ------------------------
- *         ADCBITS
- *	2         * AMP - ADCVAL
- *
- * - * And after that NTC obvisiously is: - *
- *        Rpar * Rp
- * NTC = ----------
- *        Rpar - Rp
- *
- * - * - * The function ntc_hw_read() compute the resistence using these formulas above. - */ - -#ifndef HW_NTC_H -#define HW_NTC_H - -#include "ntc_map.h" - -#include - -#include -#include - -#warning TODO:This is an example implementation, you must implement it! - -extern const res_t NTC_RSER[NTC_CNT]; -extern const res_t NTC_RPAR[NTC_CNT]; -extern const amp_t NTC_AMP[NTC_CNT]; -extern const NtcHwInfo* NTC_INFO[NTC_CNT]; - - -/*! - * Read the resistence of ntc device \a dev. - * Return the result in res_t type. - */ -INLINE res_t ntc_hw_read(NtcDev dev) -{ - ASSERT(dev < NTC_CNT); - // See above for formula explanation. - adcread_t adcval = adc_read((uint16_t)dev); - float rp = (adcval * NTC_RSER[dev] ) / ((1 << adc_bits()) * NTC_AMP[dev] - adcval); - - //kprintf("Rp[%f], Rntc[%f]\n", rp/100, ((NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp)) / 100.0); - - return ( (NTC_RPAR[dev] * rp) / (NTC_RPAR[dev] - rp) ); -} - - -/*! - * Return the info (aka the table) associated with ntc device \a dev. - */ -INLINE const NtcHwInfo* ntc_hw_getInfo(NtcDev dev) -{ - return NTC_INFO[dev]; -} - -#define NTC_HW_INIT do { /* Implement me! */ } while(0) - -#endif /* HW_NTC_H */ diff --git a/examples/lpc2378/hw/hw_phase.c b/examples/lpc2378/hw/hw_phase.c deleted file mode 100644 index f58fe9a2..00000000 --- a/examples/lpc2378/hw/hw_phase.c +++ /dev/null @@ -1,46 +0,0 @@ -/** - * \file - * - * - * \brief Phase control hardware-specific definitions - * - * \version $Id: hw_phase.c 1398 2008-05-27 16:36:05Z asterix $ - * \author Francesco Sacchi - */ - -#ifndef HW_PHASE_H -#define HW_PHASE_H - -#include "hw/hw_phase.h" - -#warning TODO:This is an example implementation, you must implement it! - -#endif /* HW_PHASE_H */ diff --git a/examples/lpc2378/hw/hw_phase.h b/examples/lpc2378/hw/hw_phase.h deleted file mode 100644 index bb7d3c69..00000000 --- a/examples/lpc2378/hw/hw_phase.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - * \file - * - * - * \brief Phase control hardware-specific definitions - * - * \version $Id: hw_phase.h 2564 2009-04-20 09:51:04Z batt $ - * - * \author Francesco Sacchi - */ - -#ifndef HW_PHASE_H -#define HW_PHASE_H - -#include "hw/phase_map.h" - -#include - -#warning TODO:This is an example implementation, you must implement it! - -#define PHASE_HW_INIT do { /* Implement me! */ }while (0) - -INLINE void TRIAC_OFF(TriacDev i) -{ - /* Implement me! */ - - //Only for test remove when implement this function - (void)i; -} - - -INLINE void TRIAC_ON(TriacDev i) -{ - /* Implement me! */ - - //Only for test remove when implement this function - (void)i; -} - -INLINE void SET_TRIAC_DDR(TriacDev i) -{ - /* Implement me! */ - - //Only for test remove when implement this function - (void)i; -} - -void zerocross_isr(void); -#define DEFINE_ZEROCROSS_ISR() void zerocross_isr(void) - - -#endif /* HW_PHASE_H */ diff --git a/examples/lpc2378/hw/hw_sd.h b/examples/lpc2378/hw/hw_sd.h deleted file mode 100644 index 79759ae9..00000000 --- a/examples/lpc2378/hw/hw_sd.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * \file - * - * - * \brief SD driver hardware-specific definitions. - * - * \version $Id: hw_sd.h 2834 2009-08-31 18:11:02Z batt $ - * - * \author Luca Ottaviano - */ - -#ifndef HW_SD_H -#define HW_SD_H - -#warning FIXME: This is an example implementation, you must implement it - -#define SD_CS_INIT() do { /* implement me */} while(0) -#define SD_CS_ON() do { /* implement me */} while(0) -#define SD_CS_OFF() do { /* implement me */} while(0) - -#define SD_PIN_INIT() do { /* implement me */} while(0) -#define SD_CARD_PRESENT() true /* implement me */ -#define SD_WRITE_PROTECT() false /* implement me */ - -#endif /* HW_SD_H */ diff --git a/examples/lpc2378/hw/hw_ser.h b/examples/lpc2378/hw/hw_ser.h deleted file mode 100644 index 634c44bc..00000000 --- a/examples/lpc2378/hw/hw_ser.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * \file - * - * - * \brief Serial hardware-specific definitions - * - * \version $Id: hw_ser.h 2883 2009-09-04 19:46:02Z batt $ - * - * \author Daniele Basile - */ - -#ifndef HW_SER_H -#define HW_SER_H - -#include "cfg/cfg_ser.h" - -#if CONFIG_SER_STROBE - #warning FIXME: this is an example implementation, you must implement it - - #define SER_STROBE_INIT do { /* implement me */ } while (0) - #define SER_STROBE_ON do { /* implement me */ } while (0) - #define SER_STROBE_OFF do { /* implement me */ } while (0) -#endif - -#endif /* HW_SER_H */ diff --git a/examples/lpc2378/hw/hw_sipo.h b/examples/lpc2378/hw/hw_sipo.h deleted file mode 100644 index b4fba473..00000000 --- a/examples/lpc2378/hw/hw_sipo.h +++ /dev/null @@ -1,109 +0,0 @@ -/** - * \file - * - * - * \brief Macro for HW_SIPO_H - * - * - * \version $Id: hw_sipo.h 2882 2009-09-04 19:17:37Z batt $ - * - * \author Andrea Grandi - * \author Daniele Basile - */ - -#ifndef HW_SIPO_H -#define HW_SIPO_H - -/** - * Map sipo connection on board. - */ -typedef enum SipoMap -{ - SIPO_CNT -} SipoMap; - -/** - * Define generic macro to set pins logic level - */ -#define SIPO_SET_LEVEL_LOW(dev) do { /* Implement me! */ } while (0) -#define SIPO_SET_LEVEL_HIGH(dev) do { /* Implement me! */ } while (0) - - -/** - * Generate one low pulse on select line. - */ -#define PULSE_LOW(dev) do { /* Implement me! */ } while (0) - -/** - * Generate one hight pulse on select line. - */ -#define PULSE_HIGH(dev) do { /* Implement me! */ } while (0) - - -/** - * Define the procedure to drive serial input in sipo device (SI). - */ -#define SIPO_SI_HIGH() do { /* Implement me! */ } while (0) -#define SIPO_SI_LOW() do { /* Implement me! */ } while (0) - -/** - * Drive clock to shift SI data into latch. - */ -#define SIPO_SI_CLOCK(clk_pol) \ - do { \ - (void)clk_pol; \ - /* Implement me! */ \ - } while (0) - -/** - * Do everything needed in order to load dato into sipo. - */ -#define SIPO_LOAD(device, load_pol) do { /* Implement me! */ } while (0) - -/** - * Enable the shift register output. - */ -#define SIPO_ENABLE() do { /* Implement me! */ } while (0) - -/** - * Set polarity for Load, Clk, SI signals. - */ -#define SIPO_SET_LD_LEVEL(device, load_pol) do { /* Implement me! */ } while (0) -#define SIPO_SET_CLK_LEVEL(clock_pol) do { /* Implement me! */ } while (0) -#define SIPO_SET_SI_LEVEL() do { /* Implement me! */ } while (0) - -/** - * Do anything that needed to init sipo pins. - */ -#define SIPO_INIT_PIN() do { /* Implement me! */ } while (0) - -#endif /* HW_SIPO_H */ diff --git a/examples/lpc2378/hw/hw_spi.h b/examples/lpc2378/hw/hw_spi.h deleted file mode 100644 index b9436620..00000000 --- a/examples/lpc2378/hw/hw_spi.h +++ /dev/null @@ -1,115 +0,0 @@ -/** - * \file - * - * - * \brief Hardware macro definition. - * - * - * \version $Id: hw_spi.h 1357 2008-05-26 09:30:19Z asterix $ - * \author Daniele Basile - */ - -#ifndef HW_SPI_H -#define HW_SPI_H - -#warning TODO:This is an example implentation, you must implement it! - -#include - -/** - * SPI pin definition. - * - * \note CS is assert when level - * is low. - * - * \{ - */ -#define CS /* pin */ ///Connect to CS pin of Flash memory. -#define SCK /* pin */ ///Connect to SCK pin of Flash memory. -#define MOSI /* pin */ ///Connect to SI pin of Flash memory. -#define MISO /* pin */ ///Connect to SO pin of Flash memory. -#define SPI_PORT /* pin */ ///Micro pin PORT register. -#define SPI_PIN /* pin */ ///Micro pin PIN register. -#define SPI_DDR /* pin */ ///Micro pin DDR register. -/*\}*/ - -/** - * Pin logic level. - * - * \{ - */ -#define MOSI_LOW() do { /* Implement me! */ } while(0) -#define MOSI_HIGH() do { /* Implement me! */ } while(0) -#define MISO_HIGH() do { /* Implement me! */ } while(0) -#define SCK_LOW() do { /* Implement me! */ } while(0) -#define SCK_HIGH() do { /* Implement me! */ } while(0) -#define CS_LOW() do { /* Implement me! */ } while(0) -#define CS_HIGH() do { /* Implement me! */ } while(0) -/*\}*/ - -/** - * SPI pin commands. - * - * \{ - */ -#define CS_ENABLE() CS_LOW() -#define CS_DISABLE() CS_HIGH() -#define SS_ACTIVE() CS_LOW() -#define SS_INACTIVE() CS_HIGH() -#define SCK_INACTIVE() SCK_LOW() -#define SCK_ACTIVE() SCK_HIGH() -#define CS_OUT() do { /* Implement me! */ } while(0) -#define MOSI_IN() do { /* Implement me! */ } while(0) -#define MOSI_OUT() do { /* Implement me! */ } while(0) -#define IS_MISO_HIGH() (false /* Implement me! */ ) -#define MISO_IN() do { /* Implement me! */ } while(0) -#define MISO_OUT() do { /* Implement me! */ } while(0) -#define SCK_OUT() do { /* Implement me! */ } while(0) - -#define SCK_PULSE()\ - do {\ - SCK_HIGH();\ - SCK_LOW();\ - } while (0) -/*\}*/ - - -#define SPI_HW_INIT() \ - CS_DISABLE();\ - MOSI_LOW();\ - SCK_LOW();\ - MISO_IN();\ - MOSI_OUT();\ - SCK_OUT();\ - CS_OUT(); - -#endif /* HW_SPI_H */ - diff --git a/examples/lpc2378/hw/hw_stepper.h b/examples/lpc2378/hw/hw_stepper.h deleted file mode 100644 index 563a9aa1..00000000 --- a/examples/lpc2378/hw/hw_stepper.h +++ /dev/null @@ -1,309 +0,0 @@ -/** - * \file - * - * - * \brief Stepper hardware-specific definitions - * - * \version $Id: hw_stepper.h 2488 2009-04-10 17:52:12Z batt $ - * - * \author Daniele Basile - */ - - -#ifndef HW_STEPPER_H -#define HW_STEPPER_H - -#include - -#include - -#include - -#warning TODO:This is an example implentation, you must implement it! - -#define STEPPER_STROBE_INIT \ -do { \ - /* put init code for strobe */ \ -} while (0) - - -#define STEPPER_STROBE_ON do { /* Implement me! */ } while(0) -#define STEPPER_STROBE_OFF do { /* Implement me! */ } while(0) - -/** - * CPU clock frequency is divided by 2^STEPPER_PRESCALER_LOG2 to - * obtain stepper clock. - */ -#define STEPPER_PRESCALER_LOG2 1 - -/** - * Stepper timer clock frequency. - */ -#define STEPPER_CLOCK ((CPU_FREQ) >> STEPPER_PRESCALER_LOG2) - -/** - * us delay to reset a stepper motor. - * This is the time neccessary to reset - * the stepper controll chip. (see datasheet for more detail). - */ -#define STEPPER_RESET_DELAY 1 - -/* - * Pins define for each stepper - */ -#define STEPPER_1_CW_CCW_PIN 0 -#define STEPPER_1_HALF_FULL_PIN 0 -#define STEPPER_1_CONTROL_PIN 0 -#define STEPPER_1_ENABLE_PIN 0 -#define STEPPER_1_RESET_PIN 0 - -/* put here other stepper motor */ - -#define STEPPER_1_SET do { /* Implement me! */ } while(0) -/* add here the set for other stepper motor */ - -#define STEPPER_1_CLEAR do { /* Implement me! */ } while(0) -/* add here the clear for other stepper motor */ - -/* - * Generic macro definition - */ - -/* - * Stepper init macro - */ -#define STEPPER_PIN_INIT_MACRO(port, index) do { \ - /* Add here init pin code */ \ - } while (0) - -/* - * Stepper commands macros - */ -#define STEPPER_SET_CW(index) do { /* Implement me! */ } while (0) -#define STEPPER_SET_CCW(index) do { /* Implement me! */ } while (0) -#define STEPPER_SET_HALF(index) do { /* Implement me! */ } while (0) -#define STEPPER_SET_FULL(index) do { /* Implement me! */ } while (0) -#define STEPPER_SET_CONTROL_LOW(index) do { /* Implement me! */ } while (0) -#define STEPPER_SET_CONTROL_HIGHT(index) do { /* Implement me! */ } while (0) -#define STEPPER_SET_ENABLE(index) do { /* Implement me! */ } while (0) -#define STEPPER_SET_DISABLE(index) do { /* Implement me! */ } while (0) -#define STEPPER_SET_RESET_ENABLE(index) do { /* Implement me! */ } while (0) -#define STEPPER_SET_RESET_DISABLE(index) do { /* Implement me! */ } while (0) - - -/* - * Reset stepper macro - */ - -#define STEPPER_RESET_MACRO(index) do { \ - STEPPER_SET_RESET_ENABLE(index); \ - timer_udelay(STEPPER_RESET_DELAY); \ - STEPPER_SET_RESET_DISABLE(index); \ - } while (0) - -/* - * Set half or full step macro - */ -#define STEPPER_SET_STEP_MODE_MACRO(index, flag) do { \ - if (flag) \ - STEPPER_SET_HALF(index); \ - else \ - STEPPER_SET_FULL(index); \ - } while (0) - -/* - * Set control status macro - */ -#warning TODO: This macro is not implemented (see below) - -#define STEPPER_SET_CONTROL_BIT_MACRO(index, flag) do { \ - /* if (flag) */ \ - /* WARNING This macros not implemented */ \ - /* else */ \ - /* WARNING This macros not implemented */ \ - } while (0) - -/* - * Set current power macro - */ -#warning TODO: This macro is not implemented (see below) - -#define STEPPER_SET_POWER_CURRENT_MACRO(index, flag) do { \ - /* if (flag) */ \ - /* WARNING This macrois not implemented */ \ - /* else */ \ - /* WARNING This macrois not implemented */ \ - } while (0) - -/* - * Set rotation of stepper motor - * - dir = 1: positive rotation - * - dir = 0: no motor moviment - * - dir = -1: negative rotation - * - */ -#define STEPPER_SET_DIRECTION_MACRO(index, dir) do { \ - switch (dir) \ - { \ - case 1: \ - STEPPER_SET_CW(index); \ - break; \ - case -1: \ - STEPPER_SET_CCW(index); \ - break; \ - case 0: \ - break; \ - } \ - } while (0) - - -/* - * Define macros for manage low level of stepper. - */ - -#define STEPPER_INIT() do { \ - STEPPER_PIN_INIT_MACRO(A, 1); \ - /* Add here code for other stepper motor */ \ - } while (0) - - -/* - * Enable select stepper motor - */ -#define STEPPER_ENABLE(index) do { \ - switch (index) \ - { \ - case 1: \ - STEPPER_SET_ENABLE(1); \ - break; \ - /* Add here code for other stepper motor */ \ - } \ - } while (0) - -/* - * Enable all stepper connect to micro - */ -#define STEPPER_ENABLE_ALL() do { \ - STEPPER_SET_ENABLE(1); \ - /* Add here code for other stepper motor */ \ - } while (0) - -/* - * Disable select stepper motor - */ -#define STEPPER_DISABLE(index) do { \ - switch (index) \ - { \ - case 1: \ - STEPPER_SET_DISABLE(1); \ - break; \ - /* Add here code for other stepper motor */ \ - } \ - } while (0) - -/* - * Disable all stepper connect to micro - */ -#define STEPPER_DISABLE_ALL() do { \ - STEPPER_SET_DISABLE(1); \ - /* Add here code for other stepper motor */ \ - } while (0) - -/* - * Reset selected stepper motor - */ -#define STEPPER_RESET(index) do { \ - switch (index) \ - { \ - case 1: \ - STEPPER_RESET_MACRO(1); \ - break; \ - /* Add here code for other stepper motor */ \ - } \ - } while (0) - -/* - * Reset all stepper motor - */ -#define STEPPER_RESET_ALL() do { \ - STEPPER_RESET_MACRO(1) \ - /* Add here code for other stepper motor */ \ - } while (0) - -// Set half/full step macros -#define STEPPER_SET_HALF_STEP(index, flag) do { \ - switch (index) \ - { \ - case 1: \ - STEPPER_SET_STEP_MODE_MACRO(1, flag); \ - break; \ - /* Add here code for other stepper motor */ \ - } \ - } while (0) - - -// Control status -#define STEPPER_SET_CONTROL_BIT(index, flag) do { \ - switch (index) \ - { \ - case 1: \ - STEPPER_SET_CONTROL_BIT_MACRO(1, flag); \ - break; \ - /* Add here code for other stepper motor */ \ - } \ - } while (0) - - -// Set stepper power current -#define STEPPER_SET_POWER_CURRENT(index, flag) do { \ - switch (index) \ - { \ - case 1: \ - STEPPER_SET_POWER_CURRENT_MACRO(1, flag); \ - break; \ - /* Add here code for other stepper motor */ \ - } \ - } while (0) - -// Set rotation dirction of stepper motor -#define STEPPER_SET_DIRECTION(index, dir) do { \ - switch (index) \ - { \ - case 1: \ - STEPPER_SET_DIRECTION_MACRO(1, dir); \ - break; \ - /* Add here code for other stepper motor */ \ - } \ - } while (0) - -#endif /* HW_STEPPER_H */ - - diff --git a/examples/lpc2378/hw/hw_tas5706a.h b/examples/lpc2378/hw/hw_tas5706a.h deleted file mode 100644 index f8cbf353..00000000 --- a/examples/lpc2378/hw/hw_tas5706a.h +++ /dev/null @@ -1,65 +0,0 @@ -/** - * \file - * - * - * \brief HW pin handling. - * - * \version $Id: hw_tas5706a.h 2849 2009-09-01 15:46:14Z lottaviano $ - * - * \author Francesco Sacchi - */ - -#ifndef HW_TAS5706A_H -#define HW_TAS5706A_H - -#include - -#warning FIXME: This is an example implementation, you must implement it - -#define TAS5706A_SETPOWERDOWN(val) do { (void) val; /* implement me */ } while (0) -#define TAS5706A_SETRESET(val) do { (void) val; /* implement me */ } while (0) -#define TAS5706A_SETMUTE(val) do { (void) val; /* implement me */ } while (0) - -#define TAS5706A_PIN_INIT() \ - do { \ - TAS5706A_SETPOWERDOWN(true); \ - TAS5706A_SETRESET(true); \ - TAS5706A_SETMUTE(true); \ - /* complete me */ \ - } while (0) - -#define TAS5706A_MCLK_INIT() \ - do { \ - /* implement me */ \ - } while(0) - - -#endif /* HW_TAS5706A_H */ diff --git a/examples/lpc2378/hw/hw_thermo.h b/examples/lpc2378/hw/hw_thermo.h deleted file mode 100644 index de5edcc7..00000000 --- a/examples/lpc2378/hw/hw_thermo.h +++ /dev/null @@ -1,182 +0,0 @@ -/** - * \file - * - * - * \brief thermo hardware-specific control functions. - * - * \version $Id: hw_thermo.h 1440 2008-06-10 17:59:13Z asterix $ - * \author Francesco Sacchi - * - */ - -#ifndef HW_THERMO_H -#define HW_THERMO_H - -#include "thermo_map.h" -#include "ntc_map.h" - -#include -#include - -#include -#include - -#warning TODO:This is an example implentation, you must implement it! - -/*! - * This function should return the temperature set tolerance. - */ -INLINE deg_t thermo_hw_tolerance(ThermoDev dev) -{ - ASSERT(dev < THERMO_CNT); - - switch (dev) - { - case THERMO_TEST: - /* Put here convertion function to temperature size */ - break; - - /* Put here your thermo device */ - - default: - ASSERT(0); - } - - return 0; -} - - -/*! - * This function should return the timeout for reaching the - * target temperature. - */ -INLINE ticks_t thermo_hw_timeout(ThermoDev dev) -{ - ASSERT(dev < THERMO_CNT); - - switch (dev) - { - case THERMO_TEST: - /* return ms_to_ticks(60000); */ - break; - - /* Put here a time out for select thermo device */ - - default: - ASSERT(0); - } - - return 0; -} - - - -/*! - * Read the temperature of the hw device \a dev. - */ -INLINE deg_t thermo_hw_read(ThermoDev dev) -{ - return ntc_read(dev); -} - - -/*! - * Turns off a specific device. - * This function is usefull to handle errors. - */ -INLINE void thermo_hw_off(ThermoDev dev) -{ - ASSERT(dev < THERMO_CNT); - - switch (dev) - { - case THERMO_TEST: - phase_setPower(TRIAC_TEST, 0); - break; - - /* Put here a thermo device to turn off */ - - default: - ASSERT(0); - } - -} - - -/*! - * Based on the current temperature \a cur_temp and the target temperature \a target, this function turns on and off specific - * triac channel and handles the freezer alarm. - * It may use also PID control for thermo-regolations. - */ -INLINE void thermo_hw_set(ThermoDev dev, deg_t target, deg_t cur_temp) -{ - ASSERT(dev < THERMO_CNT); - - deg_t dist = target - cur_temp; - //kprintf("dev[%d], dist[%d]\n", dev, dist); - - switch(dev) - { - case THERMO_TEST: - if (dist > 0) - { - /* phase_setPower(TRIAC_TEST, dist * PID_TEST_K); */ - } - else - { - /* phase_setPower(TRIAC_TEST, 0); */ - } - break; - - /* Put here an other thermo device */ - - default: - ASSERT(0); - } -} - - -#define THERMO_HW_INIT _thermo_hw_init() - -/*! - * Init hw associated with thermo-control. - */ -INLINE void _thermo_hw_init(void) -{ - ASSERT(phase_initialized); - ASSERT(ntc_initialized); - - phase_setPower(TRIAC_TEST, 0); - - /* Add here the other thermo device */ -} - -#endif /* HW_THERMO_H */ diff --git a/examples/lpc2378/hw/hw_tlv5618.h b/examples/lpc2378/hw/hw_tlv5618.h deleted file mode 100644 index 4a2b4202..00000000 --- a/examples/lpc2378/hw/hw_tlv5618.h +++ /dev/null @@ -1,69 +0,0 @@ -/** - * \file - * - * - * \brief TLV5816 DAC hardware-specific definitions - * - * - * \author Francesco Sacchi - */ - -#ifndef HW_TLV5816_H -#define HW_TLV5816_H - -#warning TODO:This is an example implementation, you must implement it! - -#define TLV5618_CSINIT(pin) \ -do \ -{ \ - (void)pin; \ - /* Implement me! */ \ - TLV5618_CSHIGH(pin); \ -} while(0) - -#define TLV5618_CSLOW(pin) \ -do \ -{ \ - (void)pin; \ - /* Implement me! */ \ -} while(0) - - -#define TLV5618_CSHIGH(pin) \ -do \ -{ \ - (void)pin; \ - /* Implement me! */ \ -} while(0) - - -#endif /* HW_TLV5816_H */ - diff --git a/examples/lpc2378/hw/hw_tmp123.h b/examples/lpc2378/hw/hw_tmp123.h deleted file mode 100644 index adb18588..00000000 --- a/examples/lpc2378/hw/hw_tmp123.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * \file - * - * - * \brief Hardware macro definition. - * - * \author Daniele Basile - */ - -#ifndef HW_TMP123_H -#define HW_TMP123_H - -#warning TODO:This is an example implentation, you must implement it! - -#define TMP123_HW_CS_EN() /* Implement me! */ -#define TMP123_HW_CS_DIS() /* Implement me! */ - -#define TMP123_HW_INIT() \ - do { \ - /* Pin init */\ - } while (0) - -#endif /* HW_TMP123_H */ - diff --git a/examples/lpc2378/hw/kbd_map.h b/examples/lpc2378/hw/kbd_map.h deleted file mode 100644 index 07515c0a..00000000 --- a/examples/lpc2378/hw/kbd_map.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * \file - * - * - * \brief Keyboard map definitions. - * - * \version $Id: kbd_map.h 2848 2009-09-01 15:23:57Z lottaviano $ - * - * \author Francesco Sacchi - * \author Stefano Fedrigo - */ - -#ifndef HW_KBD_MAP_H -#define HW_KBD_MAP_H - -#include - -#warning TODO:This is an example implentation, you must implement it! - - -/** - * Type for keyboard mask. - */ -typedef uint16_t keymask_t; - -/** - * \name Keycodes. - */ -/*@{*/ -#define K_UP BV(0) -#define K_DOWN BV(1) -#define K_OK BV(2) -#define K_CANCEL BV(3) - -#define K_REPEAT BV(13) /**< This is a repeated keyevent. */ -#define K_TIMEOUT BV(14) /**< Fake key event for timeouts. */ -#define K_LONG BV(15) -/*@}*/ - -#define K_LNG_MASK 0 - -#endif /* HW_KBD_MAP_H */ diff --git a/examples/lpc2378/hw/mcp41_map.h b/examples/lpc2378/hw/mcp41_map.h deleted file mode 100644 index 544f5673..00000000 --- a/examples/lpc2378/hw/mcp41_map.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * \file - * - * - * \brief MCP41 digital potentiometer map definitions. - * - * \version $Id: mcp41_map.h 2506 2009-04-15 08:29:07Z duplo $ - * - * \author Francesco Sacchi - */ - -#ifndef MCP41_MAP_H -#define MCP41_MAP_H - -#warning TODO:This is an example implentation, you must implement it! - -/** \name Enum for mcp41 pot evices. - * \{ - * - */ -typedef enum Mcp41Dev -{ - MCP41_LED, - - /* put here other mcp41 device */ - - MCP41_CNT, -} Mcp41Dev; -/* \} */ - -#endif /* MCP41_MAP_H */ diff --git a/examples/lpc2378/hw/ntc_map.h b/examples/lpc2378/hw/ntc_map.h deleted file mode 100644 index 00997ce6..00000000 --- a/examples/lpc2378/hw/ntc_map.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * \file - * - * - * \brief NTC map definitions. - * - * \version $Id: ntc_map.h 1312 2008-05-20 16:54:52Z asterix $ - * - * \author Giovanni Bajo - * \author Francesco Sacchi - */ - -#ifndef NTC_MAP_H -#define NTC_MAP_H - -#include - -#warning TODO:This is an example implentation, you must implement it! - -/*! \name Enum for ntc devices. - * \{ - */ -typedef enum NtcDev -{ - NTC_TEST, - - /* Put here your thermo device */ - - NTC_CNT -} NtcDev; -/* \} */ - -#endif /* NTC_MAP_H */ diff --git a/examples/lpc2378/hw/phase_map.h b/examples/lpc2378/hw/phase_map.h deleted file mode 100644 index 2f338cdb..00000000 --- a/examples/lpc2378/hw/phase_map.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - * \file - * - * - * \brief Triac map definitions. - * - * \version $Id: phase_map.h 1357 2008-05-26 09:30:19Z asterix $ - * - * \author Francesco Sacchi - */ - -#ifndef PHASE_MAP_H -#define PHASE_MAP_H - -#warning TODO:This is an example implentation, you must implement it! - -/*! \name Enum for triac devices. - * \{ - */ -typedef enum TriacDev -{ - TRIAC_TEST, - - /* Put here other triac device */ - - TRIAC_CNT -} TriacDev; -/* \} */ - -#endif /* PHASE_MAP_H */ diff --git a/examples/lpc2378/hw/pwm_map.h b/examples/lpc2378/hw/pwm_map.h deleted file mode 100644 index 8f9f8b65..00000000 --- a/examples/lpc2378/hw/pwm_map.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * \file - * - * - * - * \brief PWM map device. - * - * \version $Id: pwm_map.h 1357 2008-05-26 09:30:19Z asterix $ - * - * \author Daniele Basile - */ - -#ifndef HW_PWM_MAP_H -#define HW_PWM_MAP_H - -#warning TODO:This is an example implentation, you must implement it! - -typedef enum -{ - PWM_CH0 = 0, - PWM_CH1, - PWM_CH2, - PWM_CH3, - -/* - * add other PWM channel or - * change above. - */ - - PWM_CNT -} PwmDev; - -#endif /* HW_PWM_MAP_H */ diff --git a/examples/lpc2378/hw/thermo_map.h b/examples/lpc2378/hw/thermo_map.h deleted file mode 100644 index 5973612b..00000000 --- a/examples/lpc2378/hw/thermo_map.h +++ /dev/null @@ -1,70 +0,0 @@ -/** - * \file - * - * - * \brief Thermo regulation control map definitions. - * - * \version $Id: thermo_map.h 1312 2008-05-20 16:54:52Z asterix $ - * - * \author Francesco Sacchi - */ - -#ifndef THERMO_MAP_H -#define THERMO_MAP_H - -#include -#include - -#warning TODO:This is an example implentation, you must implement it! - -typedef uint8_t thermostatus_t; - -#define THERMO_OFF 0 -#define THERMO_HEATING BV(0) -#define THERMO_FREEZING BV(1) -#define THERMO_TGT_REACH BV(2) -#define THERMOERRF_NTCSHORT BV(3) -#define THERMOERRF_NTCOPEN BV(4) -#define THERMOERRF_TIMEOUT BV(5) -#define THERMO_ACTIVE BV(6) - -#define THERMO_ERRMASK (THERMOERRF_NTCSHORT | THERMOERRF_NTCOPEN | THERMOERRF_TIMEOUT) - -typedef enum ThermoDev -{ - THERMO_TEST, - - /* Put here your thermo device */ - - THERMO_CNT, -} ThermoDev; - -#endif /* THERMO_MAP_H */ diff --git a/examples/lpc2378/lpc2378.mk b/examples/lpc2378/lpc2378.mk deleted file mode 100644 index 45a25e9c..00000000 --- a/examples/lpc2378/lpc2378.mk +++ /dev/null @@ -1,65 +0,0 @@ -# -# Copyright 2009 Develer S.r.l. (http://www.develer.com/) -# All rights reserved. -# -# Makefile template for BeRTOS wizard. -# -# Author: Lorenzo Berni -# -# - -# Programmer interface configuration, see http://dev.bertos.org/wiki/ProgrammerInterface for help -lpc2378_PROGRAMMER_TYPE = jtag-tiny -lpc2378_PROGRAMMER_PORT = none - -# Files included by the user. -lpc2378_USER_CSRC = \ - examples/lpc2378/main.c \ - bertos/drv/timer.c \ - bertos/drv/timer_test.c \ - bertos/drv/ser.c \ - bertos/cpu/arm/drv/ser_lpc2.c \ - bertos/cpu/arm/drv/vic_lpc2.c \ - bertos/cpu/arm/drv/timer_lpc2.c \ - bertos/mware/event.c \ - bertos/kern/kfile.c \ - bertos/kern/proc.c \ - bertos/kern/proc_test.c \ - bertos/kern/monitor.c \ - bertos/mware/sprintf.c \ - bertos/struct/heap.c \ - # - -# Files included by the user. -lpc2378_USER_PCSRC = \ - # - -# Files included by the user. -lpc2378_USER_CPPASRC = \ - bertos/cpu/arm/hw/switch_ctx_arm.S \ - # - -# Files included by the user. -lpc2378_USER_CXXSRC = \ - # - -# Files included by the user. -lpc2378_USER_ASRC = \ - # - -# Flags included by the user. -lpc2378_USER_LDFLAGS = \ - # - -# Flags included by the user. -lpc2378_USER_CPPAFLAGS = \ - # - -# Flags included by the user. -lpc2378_USER_CPPFLAGS = \ - -fno-strict-aliasing \ - -fwrapv \ - # - -# Include the mk file generated by the wizard -include examples/lpc2378/lpc2378_wiz.mk diff --git a/examples/lpc2378/lpc2378_wiz.mk b/examples/lpc2378/lpc2378_wiz.mk deleted file mode 100644 index f92dab6f..00000000 --- a/examples/lpc2378/lpc2378_wiz.mk +++ /dev/null @@ -1,82 +0,0 @@ -# -# Copyright 2009 Develer S.r.l. (http://www.develer.com/) -# All rights reserved. -# -# Makefile template for BeRTOS wizard. -# -# Author: Lorenzo Berni -# -# - -# Constants automatically defined by the selected modules -lpc2378_DEBUG = 1 - -# Our target application -TRG += lpc2378 - -lpc2378_PREFIX = "arm-none-eabi-" - -lpc2378_SUFFIX = "" - -# Files automatically generated by the wizard. DO NOT EDIT, USE lpc2378_USER_CSRC INSTEAD! -lpc2378_WIZARD_CSRC = \ - bertos/mware/hex.c \ - bertos/mware/formatwr.c \ - # - -# Files automatically generated by the wizard. DO NOT EDIT, USE lpc2378_USER_PCSRC INSTEAD! -lpc2378_WIZARD_PCSRC = \ - \ - # - -# Files automatically generated by the wizard. DO NOT EDIT, USE lpc2378_USER_CPPASRC INSTEAD! -lpc2378_WIZARD_CPPASRC = \ - \ - # - -# Files automatically generated by the wizard. DO NOT EDIT, USE lpc2378_USER_CXXSRC INSTEAD! -lpc2378_WIZARD_CXXSRC = \ - \ - # - -# Files automatically generated by the wizard. DO NOT EDIT, USE lpc2378_USER_ASRC INSTEAD! -lpc2378_WIZARD_ASRC = \ - \ - # - -lpc2378_CPPFLAGS = -D'CPU_FREQ=(72000000UL)' -D'ARCH=(ARCH_DEFAULT)' -D'WIZ_AUTOGEN' -Iexamples/lpc2378/ $(lpc2378_CPU_CPPFLAGS) $(lpc2378_USER_CPPFLAGS) - -# Automatically generated by the wizard. PLEASE DO NOT EDIT! -lpc2378_LDFLAGS = $(lpc2378_CPU_LDFLAGS) $(lpc2378_WIZARD_LDFLAGS) $(lpc2378_USER_LDFLAGS) - -# Automatically generated by the wizard. PLEASE DO NOT EDIT! -lpc2378_CPPAFLAGS = $(lpc2378_CPU_CPPAFLAGS) $(lpc2378_WIZARD_CPPAFLAGS) $(lpc2378_USER_CPPAFLAGS) - -# Automatically generated by the wizard. PLEASE DO NOT EDIT! -lpc2378_CSRC = $(lpc2378_CPU_CSRC) $(lpc2378_WIZARD_CSRC) $(lpc2378_USER_CSRC) - -# Automatically generated by the wizard. PLEASE DO NOT EDIT! -lpc2378_PCSRC = $(lpc2378_CPU_PCSRC) $(lpc2378_WIZARD_PCSRC) $(lpc2378_USER_PCSRC) - -# Automatically generated by the wizard. PLEASE DO NOT EDIT! -lpc2378_CPPASRC = $(lpc2378_CPU_CPPASRC) $(lpc2378_WIZARD_CPPASRC) $(lpc2378_USER_CPPASRC) - -# Automatically generated by the wizard. PLEASE DO NOT EDIT! -lpc2378_CXXSRC = $(lpc2378_CPU_CXXSRC) $(lpc2378_WIZARD_CXXSRC) $(lpc2378_USER_CXXSRC) - -# Automatically generated by the wizard. PLEASE DO NOT EDIT! -lpc2378_ASRC = $(lpc2378_CPU_ASRC) $(lpc2378_WIZARD_ASRC) $(lpc2378_USER_ASRC) - -# CPU specific flags and options, defined in the CPU definition files. -# Automatically generated by the wizard. PLEASE DO NOT EDIT! -lpc2378_CPU_CPPASRC = bertos/cpu/arm/hw/crt_arm7tdmi.S bertos/cpu/arm/hw/vectors_lpc2.S -lpc2378_CPU_CPPAFLAGS = -g -gdwarf-2 -lpc2378_CPU_CPPFLAGS = -O0 -g3 -gdwarf-2 -fverbose-asm -Ibertos/cpu/arm/ -D__ARM_LPC2378__ -lpc2378_CPU_CSRC = bertos/cpu/arm/hw/init_lpc2.c -lpc2378_PROGRAMMER_CPU = lpc2378 -lpc2378_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh -lpc2378_CPU = arm7tdmi -lpc2378_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh -lpc2378_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh -lpc2378_CPU_LDFLAGS = -nostartfiles -Wl,--no-warn-mismatch -T bertos/cpu/arm/scripts/lpc2378.ld -lpc2378_FLASH_SCRIPT = bertos/prg_scripts/arm/flash.sh diff --git a/examples/lpc2378/main.c b/examples/lpc2378/main.c deleted file mode 100644 index ef67627e..00000000 --- a/examples/lpc2378/main.c +++ /dev/null @@ -1,91 +0,0 @@ -// Emtpy main.c file generated by the wizard -#include -#include -#include -#include -#include -#include "hw/hw_led.h" - -#define PRIO_HIGH 1 -#define PRIO_LOW 0 - -static Serial ser_port; - -static void init(void) -{ - IRQ_ENABLE; - kdbg_init(); - timer_init(); - proc_init(); - - timer_delay(3000); - kprintf("NXP LPC2378 BeRTOS port test\n"); - timer_delay(3000); - /* Turn off boot led */ - IODIR0 = (1<<21); - IOCLR0 = (1<<21); - /* Init status led */ - LED_INIT(); - LED_OFF(); -} - -static void NORETURN ser_prompt(void) -{ - char buf[32]; - int i; - - ser_init(&ser_port, SER_UART1); - ser_setbaudrate(&ser_port, 115200); - - /* BeRTOS "echo" terminal */ - kfile_printf(&ser_port.fd, "\n\rBeRTOS echo terminal\n\r"); - proc_setPri(proc_current(), PRIO_HIGH); - for (i = 0; ; i++) - { - kfile_printf(&ser_port.fd, "\n\r[%03d] BeRTOS:~$ ", i); - kfile_gets_echo(&ser_port.fd, buf, sizeof(buf), true); - kfile_printf(&ser_port.fd, "%s", buf); - } -} - -static void NORETURN bertos_up(void) -{ - char spinner[] = {'/', '-', '\\', '|'}; - int i = 0; - while (1) - { - i++; - proc_forbid(); - kprintf("BeRTOS is up & running: %c\r", - spinner[i % countof(spinner)]); - proc_permit(); - timer_delay(100); - } -} - -static void NORETURN status(void) -{ - while (1) - { - LED_ON(); - timer_delay(250); - - LED_OFF(); - timer_delay(250); - } -} - -int main(void) -{ - - init(); - proc_testRun(); - proc_new(bertos_up, NULL, KERN_MINSTACKSIZE * 3, NULL); - proc_new(ser_prompt, NULL, KERN_MINSTACKSIZE * 3, NULL); - proc_new(status, NULL, 0, NULL); - while (1) - { - } - - return 0; -} diff --git a/examples/stm32p103/cfg/cfg_debug.h b/examples/stm32p103/cfg/cfg_debug.h deleted file mode 100644 index 20fec2d3..00000000 --- a/examples/stm32p103/cfg/cfg_debug.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for Debug module. - * - * \author Daniele Basile - */ - -#ifndef CFG_DEBUG_H -#define CFG_DEBUG_H - -/** - * Debug console port. - * $WIZ$ type = "int"; min = 0 - */ -#define CONFIG_KDEBUG_PORT 1 - -/** - * Baudrate for the debug console. - * $WIZ$ type = "int"; min = 300 - */ -#define CONFIG_KDEBUG_BAUDRATE 115200UL - -#endif /* CFG_DEBUG_H */ diff --git a/examples/stm32p103/cfg/cfg_gfx.h b/examples/stm32p103/cfg/cfg_gfx.h deleted file mode 100644 index 8d8b6fa2..00000000 --- a/examples/stm32p103/cfg/cfg_gfx.h +++ /dev/null @@ -1,74 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for GFX module. - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef CFG_GFX_H -#define CFG_GFX_H - -/// Enable line clipping algorithm. -#define CONFIG_GFX_CLIPPING 1 - -/// Enable text rendering in bitmaps. -#define CONFIG_GFX_TEXT 1 - -/// Enable virtual coordinate system. -#define CONFIG_GFX_VCOORDS 1 - -/// Select bitmap pixel format. -#define CONFIG_BITMAP_FMT BITMAP_FMT_PLANAR_V_LSB - - -#define CONFIG_CHART_TYPE_X uint8_t ///< Type for the chart dataset -#define CONFIG_CHART_TYPE_Y uint8_t ///< Type for the chart dataset - - -/// Enable button bar behind menus -#define CONFIG_MENU_MENUBAR 0 - -/// Level Edit Timeout -#define CONFIG_LEVELEDIT_TIMEOUT 0 - -/// Menu timeout -#define CONFIG_MENU_TIMEOUT 0 - -/// Enable smooth scrolling in menus -#define CONFIG_MENU_SMOOTH 1 - - -#endif /* CFG_GFX_H */ - diff --git a/examples/stm32p103/cfg/cfg_heap.h b/examples/stm32p103/cfg/cfg_heap.h deleted file mode 100644 index 7d080012..00000000 --- a/examples/stm32p103/cfg/cfg_heap.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for heap module. - * - * \author Daniele Basile - */ - -#ifndef CFG_HEAP_H -#define CFG_HEAP_H - -/** - * Enable malloc/free like API. - * $WIZ$ type = "boolean" - */ -#define CONFIG_HEAP_MALLOC 1 - -#endif /* CFG_HEAP_H */ - - diff --git a/examples/stm32p103/cfg/cfg_kfile.h b/examples/stm32p103/cfg/cfg_kfile.h deleted file mode 100644 index 1b1989c9..00000000 --- a/examples/stm32p103/cfg/cfg_kfile.h +++ /dev/null @@ -1,62 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for KFile interface module. - * - * \version $Id$ - * \author Daniele Basile - */ - -#ifndef CFG_KFILE_H -#define CFG_KFILE_H - -/** - * Module logging level. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define KFILE_LOG_LEVEL LOG_LVL_INFO - -/** - * Module logging format. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define KFILE_LOG_FORMAT LOG_FMT_TERSE - -/** - * Enable the gets function with echo. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KFILE_GETS 1 - -#endif /* CFG_KFILE_H */ diff --git a/examples/stm32p103/cfg/cfg_lcd.h b/examples/stm32p103/cfg/cfg_lcd.h deleted file mode 100644 index d48fa5df..00000000 --- a/examples/stm32p103/cfg/cfg_lcd.h +++ /dev/null @@ -1,68 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for lcd display module. - */ - -#ifndef CFG_LCD_H -#define CFG_LCD_H - -/** - * Use 4 bit addressing mode. - * $WIZ$ type = "boolean" - */ -#define CONFIG_LCD_4BIT 0 - -/** - * Use a table to speed up LCD memory addressing. - * This will use about 100 bytes of RAM. - * $WIZ$ type = "boolean" - */ -#define CONFIG_LCD_ADDRESS_FAST 0 - -/** - * LCD setting for 32122A (AVR implementation). - * $WIZ$ type = "boolean" - * $WIZ$ supports = "avr and False" - */ -#define CONFIG_LCD_SOFTINT_REFRESH 0 - -/** - * LCD setting for 32122A (AVR implementation). - * $WIZ$ type = "boolean" - * $WIZ$ supports = "avr and False" - */ -#define CONFIG_LCD_WAIT 0 - - -#endif /* CFG_LCD_H */ - diff --git a/examples/stm32p103/cfg/cfg_monitor.h b/examples/stm32p103/cfg/cfg_monitor.h deleted file mode 100644 index d0e24da4..00000000 --- a/examples/stm32p103/cfg/cfg_monitor.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * \file - * - * - * \brief Kernel monitor configuration parameters - * - * \author Bernie Innocenti - */ - -#ifndef CFG_MONITOR_H -#define CFG_MONITOR_H - -/** - * Process monitor. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_MONITOR 1 - -#endif /* CFG_MONITOR_H */ diff --git a/examples/stm32p103/cfg/cfg_proc.h b/examples/stm32p103/cfg/cfg_proc.h deleted file mode 100644 index bff5d853..00000000 --- a/examples/stm32p103/cfg/cfg_proc.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * \file - * - * - * \brief Kernel configuration parameters - * - * \author Bernie Innocenti - */ - -#ifndef CFG_PROC_H -#define CFG_PROC_H - -/** - * Enable the multithreading kernel. - * - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN 1 - -/** - * Kernel interrupt supervisor. WARNING: Experimental, still incomplete! - * $WIZ$ type = "boolean" - * $WIZ$ supports = "False" - */ -#define CONFIG_KERN_IRQ 0 - -/** - * Preemptive process scheduling. - * - * $WIZ$ type = "boolean" - * $WIZ$ conditional_deps = "timer" - */ -#define CONFIG_KERN_PREEMPT 1 - -/** - * Time sharing quantum (a prime number prevents interference effects) [ms]. - * - * $WIZ$ type = "int" - * $WIZ$ min = 1 - */ -#define CONFIG_KERN_QUANTUM 11 - -/** - * Priority-based scheduling policy. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_PRI 1 - -/** - * Dynamic memory allocation for processes. - * $WIZ$ type = "boolean" - * $WIZ$ conditional_deps = "heap" - */ -#define CONFIG_KERN_HEAP 1 - -/** - * Size of the dynamic memory pool used by processes. - * $WIZ$ type = "int" - * $WIZ$ min = 0 - */ -#define CONFIG_KERN_HEAP_SIZE 8192L - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define KERN_LOG_LEVEL LOG_LVL_ERR - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define KERN_LOG_FORMAT LOG_FMT_VERBOSE - -#endif /* CFG_PROC_H */ diff --git a/examples/stm32p103/cfg/cfg_sem.h b/examples/stm32p103/cfg/cfg_sem.h deleted file mode 100644 index 51811da4..00000000 --- a/examples/stm32p103/cfg/cfg_sem.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * \file - * - * - * \brief Kernel semaphores configuration parameters. - * - * \author Bernie Innocenti - */ - -#ifndef CFG_SEM_H -#define CFG_SEM_H - -/** - * Re-entrant mutual exclusion primitives. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_SEMAPHORES 0 - -#endif /* CFG_SEM_H */ diff --git a/examples/stm32p103/cfg/cfg_ser.h b/examples/stm32p103/cfg/cfg_ser.h deleted file mode 100644 index 91a10e0b..00000000 --- a/examples/stm32p103/cfg/cfg_ser.h +++ /dev/null @@ -1,222 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for serial module. - * - * \author Daniele Basile - */ - -#ifndef CFG_SER_H -#define CFG_SER_H - -/** - * Example of setting for serial port and - * spi port. - * Edit these define for your project. - */ - -/** - * Size of the outbound FIFO buffer for port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - */ -#define CONFIG_UART0_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - */ -#define CONFIG_UART0_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" - */ -#define CONFIG_UART1_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2 or (at91 and not atmega8 and not atmega168 and not atmega32)" - */ -#define CONFIG_UART1_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for port 2 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2" - */ -#define CONFIG_UART2_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 2 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lm3s or lpc2" - */ -#define CONFIG_UART2_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for port 3 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lpc2" - */ -#define CONFIG_UART3_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for port 3 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "lpc2" - */ -#define CONFIG_UART3_RXBUFSIZE 32 - - -/** - * Size of the outbound FIFO buffer for SPI port [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for SPI port [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for SPI port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI0_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for SPI port 0 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI0_RXBUFSIZE 32 - -/** - * Size of the outbound FIFO buffer for SPI port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI1_TXBUFSIZE 32 - -/** - * Size of the inbound FIFO buffer for SPI port 1 [bytes]. - * $WIZ$ type = "int" - * $WIZ$ min = 2 - * $WIZ$ supports = "at91" - */ -#define CONFIG_SPI1_RXBUFSIZE 32 - -/** - * SPI data order. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "ser_order_bit" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST - -/** - * SPI clock division factor. - * $WIZ$ type = "int" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_CLOCK_DIV 16 - -/** - * SPI clock polarity: normal low or normal high. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "ser_spi_pol" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_CLOCK_POL SPI_NORMAL_LOW - -/** - * SPI clock phase you can choose sample on first edge or - * sample on second clock edge. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "ser_spi_phase" - * $WIZ$ supports = "avr" - */ -#define CONFIG_SPI_CLOCK_PHASE SPI_SAMPLE_ON_FIRST_EDGE - -/** - * Default transmit timeout (ms). Set to -1 to disable timeout support. - * $WIZ$ type = "int" - * $WIZ$ min = -1 - */ -#define CONFIG_SER_TXTIMEOUT -1 - -/** - * Default receive timeout (ms). Set to -1 to disable timeout support. - * $WIZ$ type = "int" - * $WIZ$ min = -1 - */ -#define CONFIG_SER_RXTIMEOUT -1 - -/** - * Use RTS/CTS handshake. - * $WIZ$ type = "boolean" - * $WIZ$ supports = "False" - */ -#define CONFIG_SER_HWHANDSHAKE 0 - -/** - * Default baudrate for all serial ports (set to 0 to disable). - * $WIZ$ type = "int" - * $WIZ$ min = 0 - */ -#define CONFIG_SER_DEFBAUDRATE 0UL - -/// Enable strobe pin for debugging serial interrupt. $WIZ$ type = "boolean" -#define CONFIG_SER_STROBE 0 - -#endif /* CFG_SER_H */ diff --git a/examples/stm32p103/cfg/cfg_signal.h b/examples/stm32p103/cfg/cfg_signal.h deleted file mode 100644 index ce5324ec..00000000 --- a/examples/stm32p103/cfg/cfg_signal.h +++ /dev/null @@ -1,47 +0,0 @@ -/** - * \file - * - * - * \brief Kernel signals configuration parameters - * - * \author Bernie Innocenti - */ - -#ifndef CFG_SIGNAL_H -#define CFG_SIGNAL_H - -/** - * Inter-process signals. - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN_SIGNALS 1 - -#endif /* CFG_SIGNAL_H */ diff --git a/examples/stm32p103/cfg/cfg_timer.h b/examples/stm32p103/cfg/cfg_timer.h deleted file mode 100644 index ae1a60b9..00000000 --- a/examples/stm32p103/cfg/cfg_timer.h +++ /dev/null @@ -1,66 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for timer module. - * - * \author Daniele Basile - */ - -#ifndef CFG_TIMER_H -#define CFG_TIMER_H - -/** - * Hardware timer selection for drv/timer.c. - * $WIZ$ type = "enum" - * $WIZ$ value_list = "timer_select" - */ -#define CONFIG_TIMER TIMER_DEFAULT - -/** - * Debug timer interrupt using a strobe pin. - * $WIZ$ type = "boolean" - */ -#define CONFIG_TIMER_STROBE 0 - -/** - * Enable asynchronous timers. - * $WIZ$ type = "boolean" - */ -#define CONFIG_TIMER_EVENTS 1 - -/** - * Support hi-res timer_usleep(). - * $WIZ$ type = "boolean" - */ -#define CONFIG_TIMER_UDELAY 1 - -#endif /* CFG_TIMER_H */ diff --git a/examples/stm32p103/main.c b/examples/stm32p103/main.c deleted file mode 100644 index 483852e2..00000000 --- a/examples/stm32p103/main.c +++ /dev/null @@ -1,82 +0,0 @@ -/** - * \file - * - * - * \brief STM32-P103 Cortex-M3 testcase - * - * \author Andrea Righi - */ - -#include "cfg/compiler.h" -#include -#include -#include -#include - -#define LED_PIN (1 << 12) - -static void led_init(void) -{ - /* Enable clocking on GPIOA and GPIOC */ - RCC->APB2ENR |= RCC_APB2_GPIOC; - /* Configure the LED pin as GPIO */ - stm32_gpioPinConfig((struct stm32_gpio *)GPIOC_BASE, - LED_PIN, GPIO_MODE_OUT_PP, GPIO_SPEED_50MHZ); -} - -static void NORETURN led_process(void) -{ - int i; - - for (i = 0; ; i = !i) - { - stm32_gpioPinWrite((struct stm32_gpio *)GPIOC_BASE, LED_PIN, i); - timer_delay(250); - } -} - -int main(void) -{ - int i; - - IRQ_ENABLE; - kdbg_init(); - timer_init(); - proc_init(); - led_init(); - - proc_new(led_process, NULL, KERN_MINSTACKSIZE, NULL); - for (i = 0; ; i = !i) - { - kputs("BeRTOS up & running!\n"); - timer_delay(500); - } -} diff --git a/examples/stm32p103/stm32p103.mk b/examples/stm32p103/stm32p103.mk deleted file mode 100644 index 555b9af4..00000000 --- a/examples/stm32p103/stm32p103.mk +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright 2010 Develer S.r.l. (http://www.develer.com/) -# -# Makefile for the stm32p103 board example. -# -# Author: Andrea Righi - -# Set to 1 for debug builds -stm32p103_DEBUG = 1 - -include bertos/fonts/fonts.mk - -# Our target application -TRG += stm32p103 - -stm32p103_CSRC = \ - bertos/mware/formatwr.c \ - bertos/mware/hex.c \ - bertos/mware/sprintf.c \ - bertos/mware/event.c \ - bertos/struct/heap.c \ - bertos/kern/signal.c \ - bertos/kern/monitor.c \ - bertos/kern/proc.c \ - bertos/drv/timer.c \ - bertos/cpu/cortex-m3/drv/kdebug_stm32.c \ - bertos/cpu/cortex-m3/drv/gpio_stm32.c \ - bertos/cpu/cortex-m3/drv/clock_stm32.c \ - bertos/cpu/cortex-m3/drv/timer_cm3.c \ - bertos/cpu/cortex-m3/drv/irq_cm3.c \ - bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \ - bertos/cpu/cortex-m3/hw/init_cm3.c \ - examples/stm32p103/main.c - -stm32p103_CPPASRC = \ - bertos/cpu/cortex-m3/hw/vectors_cm3.S \ - bertos/cpu/cortex-m3/hw/crt_cm3.S \ - # - -# This is an hosted application -stm32p103_PREFIX = arm-none-eabi- - -stm32p103_CPPAFLAGS = -mthumb -stm32p103_CPPFLAGS = -D'ARCH=0' -D__ARM_STM32P103__ -D'CPU_FREQ=(72000000L)' -D'WIZ_AUTOGEN' -mthumb -Iexamples/stm32p103 -Ibertos/cpu/cortex-m3 -fno-strict-aliasing -fwrapv -stm32p103_LDFLAGS = -nostartfiles -T bertos/cpu/cortex-m3/scripts/stm32p103_rom.ld -Wl,--no-warn-mismatch -mthumb - -stm32p103_CPU = cortex-m3 - -stm32p103_PROGRAMMER_CPU = stm32 -stm32p103_PROGRAMMER_TYPE = jtag-tiny -stm32p103_FLASH_SCRIPT = bertos/prg_scripts/arm/flash-stm32.sh -stm32p103_STOPFLASH_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh -stm32p103_DEBUG_SCRIPT = bertos/prg_scripts/arm/debug.sh -stm32p103_STOPDEBUG_SCRIPT = bertos/prg_scripts/arm/stopopenocd.sh - -ifeq ($(stm32p103_DEBUG),0) - # Production options - stm32p103_CFLAGS += -O0 - stm32p103_CXXFLAGS += -O0 -else - # Debug options - stm32p103_CPPAFLAGS += -g -gdwarf-2 - stm32p103_CPPFLAGS += -O0 -g3 -gdwarf-2 -fverbose-asm -endif diff --git a/examples/triface/boot/cfg/cfg_arch.h b/examples/triface/boot/cfg/cfg_arch.h deleted file mode 100644 index 0956196a..00000000 --- a/examples/triface/boot/cfg/cfg_arch.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * \file - * - * - * \brief Set system configuration - * - * \version $Id$ - * - * \author Bernie Innocenti - * - */ - - -#ifndef CFG_ARCH_CONFIG_H -#define CFG_ARCH_CONFIG_H - -#include - -/** - * \name Architectures - * \{ - */ -#define ARCH_TRIFACE BV(0) -#define ARCH_BOOT BV(1) -#define ARCH_EMUL BV(2) -/*\}*/ - -#endif /* CFG_ARCH_CONFIG_H */ diff --git a/examples/triface/boot/cfg/cfg_debug.h b/examples/triface/boot/cfg/cfg_debug.h deleted file mode 100644 index a7c548a9..00000000 --- a/examples/triface/boot/cfg/cfg_debug.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for Debug module. - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef CFG_DEBUG_H -#define CFG_DEBUG_H - -/// kdebug console. -#define CONFIG_KDEBUG_PORT 1 - -/// Baud-rate for the kdebug console. -#define CONFIG_KDEBUG_BAUDRATE 115200 - -#endif /* CFG_DEBUG_H */ diff --git a/examples/triface/boot/cfg/cfg_formatwr.h b/examples/triface/boot/cfg/cfg_formatwr.h deleted file mode 100644 index 91c992ab..00000000 --- a/examples/triface/boot/cfg/cfg_formatwr.h +++ /dev/null @@ -1,56 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for formatted write module. - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef CFG_FORMTWR_H -#define CFG_FORMTWR_H - -/** - * printf()-style formatter configuration. - * - * \sa PRINTF_DISABLED - * \sa PRINTF_NOMODIFIERS - * \sa PRINTF_REDUCED - * \sa PRINTF_NOFLOAT - * \sa PRINTF_FULL - */ -#define CONFIG_PRINTF PRINTF_REDUCED - - -#endif /* CFG_FORMTWR_H */ - diff --git a/examples/triface/boot/cfg/cfg_kfile.h b/examples/triface/boot/cfg/cfg_kfile.h deleted file mode 100644 index e4f13b25..00000000 --- a/examples/triface/boot/cfg/cfg_kfile.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for KFile interface module. - * - * \version $Id$ - * \author Daniele Basile - */ - -#ifndef CFG_KFILE_H -#define CFG_KFILE_H - -/// Module logging level definition. -#define KFILE_LOG_LEVEL LOG_LVL_INFO - -/// Module logging verbosity. -#define KFILE_LOG_FORMAT LOG_FMT_TERSE - -/// Enable the gets function with echo. -#define CONFIG_KFILE_GETS 1 - -#endif /* CFG_KFILE_H */ diff --git a/examples/triface/boot/cfg/cfg_proc.h b/examples/triface/boot/cfg/cfg_proc.h deleted file mode 100644 index 097025e2..00000000 --- a/examples/triface/boot/cfg/cfg_proc.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * \file - * - * - * \brief Kernel configuration parameters - * - * \version $Id$ - * \author Bernie Innocenti - */ - -#ifndef CFG_PROC_H -#define CFG_PROC_H - -/** - * Enable the multithreading kernel. - * - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN 0 - -/** - * Kernel interrupt supervisor. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_IRQ 0 - -/** - * Dynamic memory allocation for processes. - * - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_HEAP 0 - -/** - * Preemptive process scheduling. WARNING: Experimental, still incomplete! - * - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_PREEMPT 0 - -/** - * Priority-based scheduling policy. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_PRI 0 - -/** - * Time sharing quantum (a prime number prevents interference effects) [ms]. - * - * $WIZ$ type = "int" - * $WIZ$ min = "0" - */ -#define CONFIG_KERN_QUANTUM 11 - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define KERN_LOG_LEVEL LOG_LVL_ERR - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define KERN_LOG_FORMAT LOG_FMT_VERBOSE - -#endif /* CFG_PROC_H */ diff --git a/examples/triface/boot/cfg/cfg_ser.h b/examples/triface/boot/cfg/cfg_ser.h deleted file mode 100644 index 1f60c55a..00000000 --- a/examples/triface/boot/cfg/cfg_ser.h +++ /dev/null @@ -1,108 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for serial module. - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef CFG_SER_H -#define CFG_SER_H - - -/// Kdebug console on debug unit -#define CONFIG_BOOT_PORT 1 - -/// Baud-rate for the kdebug console -#define CONFIG_BOOT_BAUDRATE 115200 - -/// [bytes] Size of the outbound FIFO buffer for port 0. -#define CONFIG_UART0_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for port 0. -#define CONFIG_UART0_RXBUFSIZE 64 - -/// [bytes] Size of the outbound FIFO buffer for port 1. -#define CONFIG_UART1_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for port 1. -#define CONFIG_UART1_RXBUFSIZE 64 - - -/// [bytes] Size of the outbound FIFO buffer for SPI port (AVR only) -#define CONFIG_SPI_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for SPI port (AVR only) -#define CONFIG_SPI_RXBUFSIZE 32 - -/// [bytes] Size of the outbound FIFO buffer for SPI port 0. -#define CONFIG_SPI0_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for SPI port 0. -#define CONFIG_SPI0_RXBUFSIZE 32 - -/// [bytes] Size of the outbound FIFO buffer for SPI port 1. -#define CONFIG_SPI1_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for SPI port 1. -#define CONFIG_SPI1_RXBUFSIZE 32 - -/// SPI data order (AVR only). -#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST - -/// SPI clock division factor (AVR only). -#define CONFIG_SPI_CLOCK_DIV 16 - -/// SPI clock polarity: 0 = normal low, 1 = normal high (AVR only). -#define CONFIG_SPI_CLOCK_POL 0 - -/// SPI clock phase: 0 = sample on first edge, 1 = sample on second clock edge (AVR only). -#define CONFIG_SPI_CLOCK_PHASE 0 - -/// Default transmit timeout (ms). Set to -1 to disable timeout support. -#define CONFIG_SER_TXTIMEOUT 100 - -/// Default receive timeout (ms). Set to -1 to disable timeout support. -#define CONFIG_SER_RXTIMEOUT 100 - -/// Use RTS/CTS handshake -#define CONFIG_SER_HWHANDSHAKE 0 - -/// Default baud rate (set to 0 to disable). -#define CONFIG_SER_DEFBAUDRATE 0 - -/// For serial debug. -#define CONFIG_SER_STROBE 0 - -#endif /* CFG_SER_H */ diff --git a/examples/triface/boot/hw/hw_boot.h b/examples/triface/boot/hw/hw_boot.h deleted file mode 100644 index 7bbb4817..00000000 --- a/examples/triface/boot/hw/hw_boot.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * \file - * - * - * \brief Macro for boot loader. - * - * - * \version $Id$ - * - * \author Daniele Basile - * \author Francesco Sacchi - */ - -#ifndef HW_BOOT_H -#define HW_BOOT_H - -#include -#include - -/* Set up function pointer to RESET vector */ -void (*rom_start)(void) NORETURN = 0x0000; - -#define START_APP() rom_start() - -#define BOOT_INIT do \ -{ \ - /* Enable change of Interrupt Vectors */ \ - MCUCR = BV(IVCE); \ - /* Move interrupts to boot Flash section */ \ - MCUCR = BV(IVSEL); \ -} while(0) - -#define BOOT_END do \ -{ \ - /* Enable change of Interrupt Vectors */ \ - MCUCR = BV(IVCE); \ - /* Move interrupts to boot Flash section */ \ - MCUCR = 0; \ -} while(0) - -#endif // HW_BOOT_H - diff --git a/examples/triface/boot/hw/hw_ser.h b/examples/triface/boot/hw/hw_ser.h deleted file mode 100644 index 21451b6c..00000000 --- a/examples/triface/boot/hw/hw_ser.h +++ /dev/null @@ -1,45 +0,0 @@ -/** - * \file - * - * - * \brief Serial hardware-specific definitions - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef HW_SER_H -#define HW_SER_H - - - -#endif /* HW_SER_H */ diff --git a/examples/triface/boot/main.c b/examples/triface/boot/main.c deleted file mode 100644 index d84dc255..00000000 --- a/examples/triface/boot/main.c +++ /dev/null @@ -1,123 +0,0 @@ -/** - * \file - * - * - * \brief Flash boot loader main. - * This is a simple generic bootloader app. - * It requires only a serial port to work. - * Try to receive a file through XMODEM protocol - * and flash it on program memory. - * BOOT_INIT, BOOT_END are macros used to perform special operations - * respectively at boot start and boot end and are CPU dependant. - * The macro START_APP() jumps to main application start. - * - * \version $Id$ - * \author Stefano Fedrigo - * \author Francesco Sacchi - * \author Daniele Basile - */ - -#include "hw/hw_boot.h" -#include "cfg/cfg_ser.h" - -#include - -#include -#include -#include /* BV() */ - -#include -#include -#include - -#include - -#include - -/* - * Watchdog disable. - * - * This function disable the watchdog timer early after a reset. - * We must do it very soon because new AVR cores do not disable - * the watchdog timer after a cpu reset. In this way the watchdog - * timer is still enabled, continuously resetting the cpu. This is - * necessary only with new AVR cores, for other cores this code has - * no effect. - * - * \{ - */ -// Function prototype of watchdog reset. -void wdt_init(void) __attribute__((naked)) __attribute__((section(".init3"))); -// Function implementation of watchdog reset. -void wdt_init(void) -{ - MCUSR = 0; - wdt_disable(); - - return; -} -/* \} */ - -int main(void) -{ - Flash flash; - Serial ser; - - - // Set up flash programming functions. - flash_init(&flash); - - IRQ_ENABLE; - - BOOT_INIT; - - kdbg_init(); - timer_init(); - - /* Open the main communication port */ - - ser_init(&ser, CONFIG_BOOT_PORT); - ser_setbaudrate(&ser, CONFIG_BOOT_BAUDRATE); - - xmodem_recv(&ser.fd, &flash.fd); - - kfile_close(&flash.fd); - kfile_close(&ser.fd); - - IRQ_DISABLE; - - BOOT_END; - - START_APP(); - -} - diff --git a/examples/triface/cfg/cfg_arch.h b/examples/triface/cfg/cfg_arch.h deleted file mode 100644 index 0956196a..00000000 --- a/examples/triface/cfg/cfg_arch.h +++ /dev/null @@ -1,57 +0,0 @@ -/** - * \file - * - * - * \brief Set system configuration - * - * \version $Id$ - * - * \author Bernie Innocenti - * - */ - - -#ifndef CFG_ARCH_CONFIG_H -#define CFG_ARCH_CONFIG_H - -#include - -/** - * \name Architectures - * \{ - */ -#define ARCH_TRIFACE BV(0) -#define ARCH_BOOT BV(1) -#define ARCH_EMUL BV(2) -/*\}*/ - -#endif /* CFG_ARCH_CONFIG_H */ diff --git a/examples/triface/cfg/cfg_debug.h b/examples/triface/cfg/cfg_debug.h deleted file mode 100644 index a7c548a9..00000000 --- a/examples/triface/cfg/cfg_debug.h +++ /dev/null @@ -1,49 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for Debug module. - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef CFG_DEBUG_H -#define CFG_DEBUG_H - -/// kdebug console. -#define CONFIG_KDEBUG_PORT 1 - -/// Baud-rate for the kdebug console. -#define CONFIG_KDEBUG_BAUDRATE 115200 - -#endif /* CFG_DEBUG_H */ diff --git a/examples/triface/cfg/cfg_kfile.h b/examples/triface/cfg/cfg_kfile.h deleted file mode 100644 index 10bb72db..00000000 --- a/examples/triface/cfg/cfg_kfile.h +++ /dev/null @@ -1,51 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for KFile interface module. - * - * \version $Id$ - * \author Daniele Basile - */ - -#ifndef CFG_KFILE_H -#define CFG_KFILE_H - -/// Module logging level definition. -#define KFILE_LOG_LEVEL LOG_LVL_INFO - -/// Module logging format. -#define KFILE_LOG_FORMAT LOG_FMT_TERSE - -/// Enable the gets function with echo. -#define CONFIG_KFILE_GETS 1 - -#endif /* CFG_KFILE_H */ diff --git a/examples/triface/cfg/cfg_proc.h b/examples/triface/cfg/cfg_proc.h deleted file mode 100644 index 097025e2..00000000 --- a/examples/triface/cfg/cfg_proc.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - * \file - * - * - * \brief Kernel configuration parameters - * - * \version $Id$ - * \author Bernie Innocenti - */ - -#ifndef CFG_PROC_H -#define CFG_PROC_H - -/** - * Enable the multithreading kernel. - * - * $WIZ$ type = "autoenabled" - */ -#define CONFIG_KERN 0 - -/** - * Kernel interrupt supervisor. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_IRQ 0 - -/** - * Dynamic memory allocation for processes. - * - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_HEAP 0 - -/** - * Preemptive process scheduling. WARNING: Experimental, still incomplete! - * - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_PREEMPT 0 - -/** - * Priority-based scheduling policy. - * $WIZ$ type = "boolean" - */ -#define CONFIG_KERN_PRI 0 - -/** - * Time sharing quantum (a prime number prevents interference effects) [ms]. - * - * $WIZ$ type = "int" - * $WIZ$ min = "0" - */ -#define CONFIG_KERN_QUANTUM 11 - -/** - * Module logging level. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_level" - */ -#define KERN_LOG_LEVEL LOG_LVL_ERR - -/** - * Module logging format. - * - * $WIZ$ type = "enum" - * $WIZ$ value_list = "log_format" - */ -#define KERN_LOG_FORMAT LOG_FMT_VERBOSE - -#endif /* CFG_PROC_H */ diff --git a/examples/triface/cfg/cfg_ser.h b/examples/triface/cfg/cfg_ser.h deleted file mode 100644 index d65e64aa..00000000 --- a/examples/triface/cfg/cfg_ser.h +++ /dev/null @@ -1,114 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for serial module. - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef CFG_SER_H -#define CFG_SER_H - - -/// Kdebug console on debug unit -#define CONFIG_TRIFACE_PORT 1 - -/// Baud-rate for the kdebug console -#define CONFIG_TRIFACE_BAUDRATE 115200 - -/// Triface serial tag port -#define TAG_SER_PORT 0 - -///Baud-rate for triface serial tag port -#define TAG_SER_BAUDRATE 9600 - -/// [bytes] Size of the outbound FIFO buffer for port 0. -#define CONFIG_UART0_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for port 0. -#define CONFIG_UART0_RXBUFSIZE 64 - -/// [bytes] Size of the outbound FIFO buffer for port 1. -#define CONFIG_UART1_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for port 1. -#define CONFIG_UART1_RXBUFSIZE 64 - - -/// [bytes] Size of the outbound FIFO buffer for SPI port (AVR only) -#define CONFIG_SPI_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for SPI port (AVR only) -#define CONFIG_SPI_RXBUFSIZE 32 - -/// [bytes] Size of the outbound FIFO buffer for SPI port 0. -#define CONFIG_SPI0_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for SPI port 0. -#define CONFIG_SPI0_RXBUFSIZE 32 - -/// [bytes] Size of the outbound FIFO buffer for SPI port 1. -#define CONFIG_SPI1_TXBUFSIZE 32 - -/// [bytes] Size of the inbound FIFO buffer for SPI port 1. -#define CONFIG_SPI1_RXBUFSIZE 32 - -/// SPI data order (AVR only). -#define CONFIG_SPI_DATA_ORDER SER_MSB_FIRST - -/// SPI clock division factor (AVR only). -#define CONFIG_SPI_CLOCK_DIV 16 - -/// SPI clock polarity: 0 = normal low, 1 = normal high (AVR only). -#define CONFIG_SPI_CLOCK_POL 0 - -/// SPI clock phase: 0 = sample on first edge, 1 = sample on second clock edge (AVR only). -#define CONFIG_SPI_CLOCK_PHASE 0 - -/// Default transmit timeout (ms). Set to -1 for infinite timeout, 0 for null timeout -#define CONFIG_SER_TXTIMEOUT 0 - -/// Default receive timeout (ms). Set to -1 for infinite timeout, 0 for null timeout -#define CONFIG_SER_RXTIMEOUT 0 - -/// Use RTS/CTS handshake -#define CONFIG_SER_HWHANDSHAKE 0 - -/// Default baud rate (set to 0 to disable). -#define CONFIG_SER_DEFBAUDRATE 0 - -/// For serial debug. -#define CONFIG_SER_STROBE 0 - -#endif /* CFG_SER_H */ diff --git a/examples/triface/cfg/cfg_wdt.h b/examples/triface/cfg/cfg_wdt.h deleted file mode 100644 index f67cb320..00000000 --- a/examples/triface/cfg/cfg_wdt.h +++ /dev/null @@ -1,48 +0,0 @@ -/** - * \file - * - * - * \brief Configuration file for watchdog module. - * - * \version $Id$ - * - * \author Daniele Basile - */ - -#ifndef CFG_WDT_H -#define CFG_WDT_H - -/// Enable watchdog timer. -#define CONFIG_WATCHDOG 1 - -#endif /* CFG_WDT_H */ - - diff --git a/examples/triface/cmd_ctor.h b/examples/triface/cmd_ctor.h deleted file mode 100644 index 0e38c836..00000000 --- a/examples/triface/cmd_ctor.h +++ /dev/null @@ -1,59 +0,0 @@ -/** - * \file - * - * - * \brief Macro for defining command for protocol. - * - * \author Marco Benelli - */ - -#ifndef CMD_CTOR_H -#define CMD_CTOR_H - -#include - -#define REGISTER_FUNCTION parser_register_cmd - -#define REGISTER_CMD(NAME) REGISTER_FUNCTION(&cmd_ ## NAME ## _template) - -#define MAKE_TEMPLATE(NAME, ARGS, RES, FLAGS) \ -const struct CmdTemplate cmd_ ## NAME ## _template = \ -{ \ - #NAME, ARGS, RES, cmd_ ## NAME, FLAGS \ -}; - -#define MAKE_CMD(NAME, ARGS, RES, BODY, FLAGS) \ -static ResultCode cmd_ ## NAME (parms *args) \ -{ \ - return (ResultCode)BODY; \ -} \ -MAKE_TEMPLATE(NAME, ARGS, RES, FLAGS) - -#endif // CMD_CTOR_H diff --git a/examples/triface/doc/PROTOCOL b/examples/triface/doc/PROTOCOL deleted file mode 100644 index defc38d5..00000000 --- a/examples/triface/doc/PROTOCOL +++ /dev/null @@ -1,84 +0,0 @@ - -Command format: - - ... - -Where: - command - alphanumeric command name - argN - numeric argument (unsigned base 10, 0-65535) - -Positive response format: - - 0... - -Where: - argN - numeric value (unsigned base 10, 0-65535) - -Negative response format: - - -N"" - -Where: - -N - numeric error code (negative number) - desc - verbose error description - -# Write digital outputs (masked) -> dout 120 240 -< 0 - -# Read digital inputs -> din -< 0 125 - -# Read analog inputs -> ain -< 0 32 121 35 31 - -# Wait specified amount of milliseconds -> sleep 300 -< 0 - -# Return firmware major version, minor version and revision -> vers -< 0 1 42 0 - -# Reset board -< reset -> 0 - -# Ping/nop -< ping -> 0 - -# NOP (empty command) -> -< (ignored) - -# Comments -> # foo bar foobar -< (ignored) - -# Unknown command -> sing -< -1 "Unknown command" - -# Missing parameter -> dout -< -2 "Required parameter missing" - -# Too many parameters -> din 42 666 -< -3 "Too many parameters" - -# Malformed command -> dout %'I! -< -4 "Invalid parameter" - -# Attention -> or -< 1 "Uh?" - - -To recover from a possibly unknown board status, -a client should begin the conversation by issuing -an attention sequence, eventually followed by a reset. diff --git a/examples/triface/doc/schematics/TRIFACE.DSN b/examples/triface/doc/schematics/TRIFACE.DSN deleted file mode 100644 index d18fa84b0fd474ce74cc66c4dc6cc3248301cc8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1390592 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%0Df-oyjt{&g8_BeMk+bA`A}wJSwH5l{pSA#if4 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

E~g88A!8GpW} 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 P@WUf*@x1*1k-&ce!9IRw diff --git a/examples/triface/doc/schematics/triface.opj b/examples/triface/doc/schematics/triface.opj deleted file mode 100644 index 79f75bb3..00000000 --- a/examples/triface/doc/schematics/triface.opj +++ /dev/null @@ -1,36 +0,0 @@ -(ExpressProject "triface" - (ProjectVersion "19981106") - (ProjectType "PCB") - (Folder "Design Resources" - (Folder "Library") - (NoModify) - (File ".\triface.dsn" - (Type "Schematic Design")) - (BuildFileAddedOrDeleted "x") - (CompileFileAddedOrDeleted "x") - (ANNOTATE_Scope "0") - (ANNOTATE_Mode "1") - (ANNOTATE_Action "0") - (Annotate_Page_Order "0") - (ANNOTATE_Reset_References_to_1 "FALSE") - (ANNOTATE_No_Page_Number_Change "FALSE") - (ANNOTATE_Property_Combine "{Value}{Source Package}{POWER_GROUP}") - (ANNOTATE_IncludeNonPrimitive "FALSE")) - (Folder "Outputs") - (Folder "Referenced Projects") - (PartMRUSelector) - (GlobalState - (FileView - (Path "Design Resources") - (Path "Design Resources" - "c:\documents and settings\administrator\desktop\new triface\triface.dsn") - (Path "Design Resources" - "c:\documents and settings\administrator\desktop\new triface\triface.dsn" - "TRIFACE BOARD")) - (HierarchyView) - (Doc - (Type "COrCapturePMDoc") - (Frame - (Placement "44 2 3 -1 -1 -4 -23 214 743 2 443")) - (Tab 0))) - (MPSSessionName "Administrator")) diff --git a/examples/triface/hw/hw_adc.c b/examples/triface/hw/hw_adc.c deleted file mode 100644 index db51bf28..00000000 --- a/examples/triface/hw/hw_adc.c +++ /dev/null @@ -1,107 +0,0 @@ -/** - * \file - * - * - * \brief ADC: Analogic to Digital Converter - * - * - * \author Andrea Grandi - */ - -#include "hw/hw_adc.h" - - -#include - -#include - -#include - -/** Set the active AI channel */ -void adc_set_active_ain(int ai) -{ - /* If number of channels is <= 4 we use the first two MUX bits */ - STATIC_ASSERT(ADC_CHANNEL_NUM <= 4); - - ai &= BV(0) | BV(1); - ADMUX &= ~BV(MUX0); - ADMUX &= ~BV(MUX1); - ADMUX |= ai; -} - -/** Initialize the ADC */ -void adc_init(void) -{ - /* Set analog IN as input */ - DDRF &= ~(BV(PF0) | BV(PF1) | BV(PF2) | BV(PF3)); - - /* Disable pull-up */ - PORTF &= ~(BV(PF0) | BV(PF1) | BV(PF2) | BV(PF3)); - - ENABLE_ADC; - adc_set_vref_avcc(); - SET_AI_ADLAR; - - /* Set the Division Factor to 128 */ - ADCSRA |= (BV(ADPS0) | BV(ADPS1) | BV(ADPS2)); -} - -/** Set the initial reference */ -void adc_set_vref_avcc(void) -{ - ADMUX &= ~BV(REFS1); - ADMUX |= BV(REFS0); -} - -/** Read the specified AI channel */ -int adc_read_ai_channel(int channel) -{ - adc_set_active_ain(channel); - timer_udelay(STABILIZING_AI_CHANNEL_TIME); - START_CONVERTION; - - while(ADCSRA & BV(ADSC)) - { - /* - * Intentionally empty loop. - * It waits the convertion to be completed by ADC - */ - } - - ADCSRA |= BV(ADIF); - - uint16_t val; - val = ADCL; - val |= (uint16_t)ADCH << 8; - - return val; -} diff --git a/examples/triface/hw/hw_adc.h b/examples/triface/hw/hw_adc.h deleted file mode 100644 index 1c6e99b8..00000000 --- a/examples/triface/hw/hw_adc.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - * \file - * ght 2006 Develer S.r.l. (http://www.develer.com/) - * - * \brief Macro for HW_AIN_H - * - * - * \author Andrea Grandi - */ - -#ifndef HW_ADC_H -#define HW_ADC_H - -#include - -#define START_CONVERTION (ADCSRA |= BV(ADSC)) -#define ENABLE_ADC (ADCSRA |= BV(ADEN)) -#define SET_AI_ADLAR (ADMUX &= ~BV(ADLAR)) - -/** Microseconds to wait before starting conversion after changing a channel */ -#define STABILIZING_AI_CHANNEL_TIME 125 - -/** Number of AIN channels */ -#define ADC_CHANNEL_NUM 4 - -void adc_set_active_ain(int ai); -void adc_init(void); -void adc_set_vref_avcc(void); -int adc_read_ai_channel(int channel); - -#endif // HW_ADC_H - diff --git a/examples/triface/hw/hw_buzzer.h b/examples/triface/hw/hw_buzzer.h deleted file mode 100644 index a2b683ad..00000000 --- a/examples/triface/hw/hw_buzzer.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - * \file - * - * - * \brief Buzzer hardware-specific definitions - * - * \author Francesco Sacchi - * \author Andrea Grandi - */ - -#ifndef HW_BUZZER_H -#define HW_BUZZER_H - -#include -#include - -#define BUZZER_BIT BV(PE3) -#define IS_BUZZER_ON (PORTE & BUZZER_BIT) -#define BUZZER_HW_INIT do { DDRE |= BV(DDE3); } while (0) -#define BUZZER_ON do { PORTE |= BUZZER_BIT; } while (0) -#define BUZZER_OFF do { PORTE &= ~BUZZER_BIT; } while (0) - -#endif /* HW_BUZZER_H */ - diff --git a/examples/triface/hw/hw_input.h b/examples/triface/hw/hw_input.h deleted file mode 100644 index f0ef721c..00000000 --- a/examples/triface/hw/hw_input.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * \file - * - * - * \brief Macro for HW_INPUT_H - * - * \author Andrea Grandi - */ - -#ifndef HW_INPUT_H -#define HW_INPUT_H - -#include - -/* Set pins as input and enable pull-up */ -#define INPUT_INIT_D do \ -{ \ - (DDRD &= ~(BV(PD4) | BV(PD5) | BV(PD6) | BV(PD7))); \ - (PORTD |= (BV(PD4) | BV(PD5) | BV(PD6) | BV(PD7))); \ -} while(0) - -#define INPUT_INIT_E do \ -{ \ - (DDRE &= ~(BV(PE4) | BV(PE5) | BV(PE6) | BV(PE7))); \ - ATOMIC((PORTE |= (BV(PE4) | BV(PE5) | BV(PE6) | BV(PE7)))); \ -} while(0) - -#define INPUT_INIT do { INPUT_INIT_D; INPUT_INIT_E;} while(0) - -INLINE uint8_t INPUT_GET(void) -{ - uint8_t out_d, out_e; - out_d = PIND; - out_e = PINE; - - out_d >>= 4; - out_e = out_e & 0xF0; - - return out_e | out_d; -} - -#endif // HW_INPUT_H diff --git a/examples/triface/hw/hw_ser.h b/examples/triface/hw/hw_ser.h deleted file mode 100644 index e51824d5..00000000 --- a/examples/triface/hw/hw_ser.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - * \file - * - * - * \brief Macro for STROBE signal - * - * \version $Id$ - * - * \author Manuele Fanelli - */ - -#ifndef HW_SER_H -#define HW_SER_H - -#include "cfg/cfg_ser.h" - -#if CONFIG_SER_STROBE - - #define SER_STROBE_ON do {PORTC |= BV(0);} while(0) - #define SER_STROBE_OFF do {PORTC &= ~BV(0);} while(0) - #define SER_STROBE_INIT do {DDRC |= BV(0); } while(0) -#endif - -#endif //HW_SER_H diff --git a/examples/triface/hw/hw_sipo.h b/examples/triface/hw/hw_sipo.h deleted file mode 100644 index 9922c052..00000000 --- a/examples/triface/hw/hw_sipo.h +++ /dev/null @@ -1,149 +0,0 @@ -/** - * \file - * - * - * \brief Macro for HW_SIPO_H - * - * - * \author Andrea Grandi - * \author Daniele Basile - */ - -#ifndef HW_SIPO_H -#define HW_SIPO_H - -#include - -#include - -/** - * Mapping sipo connection on board. - * See schematics for more info. - */ -typedef enum SipoMap -{ - TRIFACE_DOUT = 0, - - SIPO_CNT -} SipoMap; - - - -//Set output pin for sipo -#define SCK_OUT (DDRB |= BV(PB1)) // Shift register clock input pin -#define SOUT_OUT (DDRB |= BV(PB2)) // Serial data input pin -#define SLOAD_OUT (DDRB |= BV(PB3)) // Storage register clock input pin -#define OE_OUT (DDRG |= BV(PG3)) // Output enable pin - -//Define output level -#define SCK_HIGH (PORTB |= BV(PB1)) -#define SCK_LOW (PORTB &= ~BV(PB1)) -#define SOUT_OUT_HIGH (PORTB |= BV(PB2)) -#define SOUT_OUT_LOW (PORTB &= ~BV(PB2)) -#define SLOAD_OUT_HIGH (PORTB |= BV(PB3)) -#define SLOAD_OUT_LOW (PORTB &= ~BV(PB3)) -#define OE_LOW (PORTG &= BV(PG3)) - -/** - * Define the macros needed to set the serial input bit of SIPO device - * low or high. - */ -#define SIPO_SI_HIGH() SOUT_OUT_HIGH -#define SIPO_SI_LOW() SOUT_OUT_LOW - -/** - * Drive pin to load the bit, presented in serial-in pin, - * into sipo shift register. - */ -#define SIPO_SI_CLOCK(clk_pol) \ - do{ \ - (void)clk_pol; \ - SCK_HIGH; \ - SCK_LOW; \ - }while(0) - -/** - * Clock the content of shift register to output. - */ -#define SIPO_LOAD(device, load_pol) \ - do { \ - (void)device; \ - (void)load_pol; \ - SLOAD_OUT_HIGH; \ - SLOAD_OUT_LOW; \ - }while(0) - -/** - * Enable the shift register output. - */ -#define SIPO_ENABLE() OE_LOW; - -/** - * Set logic level for load signal - */ -#define SIPO_SET_LD_LEVEL(device, load_pol) \ - do { \ - (void)device; \ - if(load_pol) \ - SLOAD_OUT_HIGH; \ - else \ - SLOAD_OUT_LOW; \ - } while (0) - - -/** - * Sel logic level for clock signal - */ -#define SIPO_SET_CLK_LEVEL(clock_pol) \ - do { \ - if(clock_pol) \ - SCK_HIGH; \ - else \ - SCK_LOW; \ - } while (0) - -#define SIPO_SET_SI_LEVEL() SIPO_SI_LOW() - -/** - * Do everything needed in order to init the SIPO pins. - */ -#define SIPO_INIT_PIN() \ - do { \ - OE_OUT; \ - SOUT_OUT; \ - SCK_OUT; \ - SLOAD_OUT; \ - SIPO_ENABLE(); \ - } while(0) - - -#endif /* HW_SIPO_H */ diff --git a/examples/triface/protocol.c b/examples/triface/protocol.c deleted file mode 100644 index eec73684..00000000 --- a/examples/triface/protocol.c +++ /dev/null @@ -1,382 +0,0 @@ -/** - * \file - * - * - * \brief Implementation of the command protocol between the board and the host - * - * - * \author Giovanni Bajo - * \author Marco Benelli - * \author Bernie Innocenti - * \author Daniele Basile - */ - -#include "protocol.h" -#include "cmd_ctor.h" // MAKE_CMD, REGISTER_CMD -#include "verstag.h" - -#include "hw/hw_adc.h" -#include "hw/hw_input.h" - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include - -#include -#include - -// Define the format string for ADC -#define ADC_FORMAT_STR "dddd" - -// DEBUG: set to 1 to force interactive mode -#define FORCE_INTERACTIVE 1 - -/** - * True if we are in interactive mode, false if we are in protocol mode. - * In interactive mode, commands are read through readline() (prompt, - * completion, history) without IDs, and replies/errors are sent to the serial - * output. - * In protocol mode, we implement the default protocol - */ -static bool interactive; - -/// Readline context, used for interactive mode. -static struct RLContext rl_ctx; - -static Sipo fd_sipo; - -uint8_t reg_status_dout; -/** - * Send a NAK asking the host to send the current message again. - * - * \a fd kfile handler for serial. - * \a err human-readable description of the error for debug purposes. - */ -INLINE void NAK(KFile *fd, const char *err) -{ -#ifdef _DEBUG - kfile_printf(fd, "NAK \"%s\"\r\n", err); -#else - kfile_printf(fd, "NAK\r\n"); -#endif -} - -static void protocol_prompt(KFile *fd) -{ - kfile_print(fd, ">> "); -} - -/* - * Print args on s, with format specified in t->result_fmt. - * Return number of valid arguments or -1 in case of error. - */ -static bool protocol_reply(KFile *fd, const struct CmdTemplate *t, - const parms *args) -{ - unsigned short offset = strlen(t->arg_fmt) + 1; - unsigned short nres = strlen(t->result_fmt); - - for (unsigned short i = 0; i < nres; ++i) - { - if (t->result_fmt[i] == 'd') - { - kfile_printf(fd, " %ld", args[offset+i].l); - } - else if (t->result_fmt[i] == 's') - { - kfile_printf(fd, " %s", args[offset+i].s); - } - - else - { - abort(); - } - } - kfile_printf(fd, "\r\n"); - return true; -} - -static void protocol_parse(KFile *fd, const char *buf) -{ - const struct CmdTemplate *templ; - - /* Command check. */ - templ = parser_get_cmd_template(buf); - if (!templ) - { - kfile_print(fd, "-1 Invalid command.\r\n"); - protocol_prompt(fd); - return; - } - - parms args[PARSER_MAX_ARGS]; - - /* Args Check. TODO: Handle different case. see doc/PROTOCOL . */ - if (!parser_get_cmd_arguments(buf, templ, args)) - { - kfile_print(fd, "-2 Invalid arguments.\r\n"); - protocol_prompt(fd); - return; - } - - /* Execute. */ - if(!parser_execute_cmd(templ, args)) - { - NAK(fd, "Error in executing command."); - } - if (!protocol_reply(fd, templ, args)) - { - NAK(fd, "Invalid return format."); - } - - protocol_prompt(fd); - return; -} - -void protocol_run(KFile *fd) -{ - /** - * \todo to be removed, we could probably access the serial FIFO - * directly - */ - static char linebuf[80]; - - if (!interactive) - { - kfile_gets(fd, linebuf, sizeof(linebuf)); - - // reset serial port error anyway - kfile_clearerr(fd); - - // check message minimum length - if (linebuf[0]) - { - /* If we enter lines beginning with sharp(#) - they are stripped out from commands */ - if(linebuf[0] != '#') - { - if (linebuf[0] == 0x1B && linebuf[1] == 0x1B) // ESC - { - interactive = true; - kfile_printf(fd, "Entering interactive mode\r\n"); - } - else - { - protocol_parse(fd, linebuf); - } - } - } - } - else - { - const char *buf; - - /* - * Read a line from serial. We use a temporary buffer - * because otherwise we would have to extract a message - * from the port immediately: there might not be any - * available, and one might get free while we read - * the line. We also add a fake ID at the start to - * fool the parser. - */ - buf = rl_readline(&rl_ctx); - - /* If we enter lines beginning with sharp(#) - they are stripped out from commands */ - if(buf && buf[0] != '#') - { - if (buf[0] != '\0') - { - // exit special case to immediately change serial input - if (!strcmp(buf, "exit") || !strcmp(buf, "quit")) - { - rl_clear_history(&rl_ctx); - kfile_printf(fd, "Leaving interactive mode...\r\n"); - interactive = FORCE_INTERACTIVE; - } - else - { - //TODO: remove sequence numbers - linebuf[0] = '0'; - linebuf[1] = ' '; - - strncpy(linebuf + 2, buf, sizeof(linebuf) - 3); - linebuf[sizeof(linebuf) - 1] = '\0'; - protocol_parse(fd, linebuf); - } - } - } - } -} - -/* - * Commands. - * TODO: Command declarations and definitions should be in another file(s). - * Maybe we should use CMD_HUNK_TEMPLATE. - * - */ - -MAKE_CMD(ver, "", "ddd", -({ - args[1].l = VERS_MAJOR; - args[2].l = VERS_MINOR; - args[3].l = VERS_REV; - 0; -}), 0); - -/* Sleep. Example of declaring function body directly in macro call. */ -MAKE_CMD(sleep, "d", "", -({ - timer_delay((mtime_t)args[1].l); - 0; -}), 0) - -/* Ping. */ -MAKE_CMD(ping, "", "", -({ - //Silence "args not used" warning. - (void)args; - 0; -}), 0) - -/* Dout */ -MAKE_CMD(dout, "d", "", -({ - kfile_putc((uint8_t)args[1].l, &fd_sipo.fd); - - //Store status of dout ports. - reg_status_dout = (uint8_t)args[1].l; - 0; -}), 0) - -/* rdout read the status of out ports.*/ -MAKE_CMD(rdout, "", "d", -({ - args[1].l = reg_status_dout; - 0; -}), 0) - - -/* Reset */ -MAKE_CMD(reset, "", "", -({ - //Silence "args not used" warning. - (void)args; - wdt_enable(WDTO_2S); - - /*We want to have an infinite loop that lock access on watchdog timer. - This piece of code it's equivalent to a while(true), but we have done this because - gcc generate a warning message that suggest to use "noreturn" parameter in function reset.*/ - ASSERT(args); - while(args); - 0; - -}), 0) - -/* Din */ -MAKE_CMD(din, "", "d", -({ - args[1].l = INPUT_GET(); - 0; -}), 0) - - - -/* Ain */ -MAKE_CMD(ain, "", ADC_FORMAT_STR, -({ - STATIC_ASSERT((sizeof(ADC_FORMAT_STR) - 1) == ADC_CHANNEL_NUM); - for(int i = 0; i < ADC_CHANNEL_NUM; i++) - args[i+1].l = adc_read_ai_channel(i); - - 0; -}), 0) - -/* Beep */ -MAKE_CMD(beep, "d", "", -({ - buz_beep(args[1].l); - 0; -}), 0) - -/* Register commands. */ -static void protocol_registerCmds(void) -{ - REGISTER_CMD(ver); - REGISTER_CMD(sleep); - REGISTER_CMD(ping); - REGISTER_CMD(dout); - //Set off all dout ports. - reg_status_dout = 0; - REGISTER_CMD(rdout); - REGISTER_CMD(reset); - REGISTER_CMD(din); - REGISTER_CMD(ain); - REGISTER_CMD(beep); -} - -/* Initialization: readline context, parser and register commands. */ -void protocol_init(KFile *fd) -{ - /* SPI Port Initialization */ - fd_sipo.load_device = TRIFACE_DOUT; - fd_sipo.bit_order = SIPO_DATAORDER_LSB; - fd_sipo.clock_pol = SIPO_START_LOW; - fd_sipo.load_pol = SIPO_LOW_TO_HIGH; - - sipo_init(&fd_sipo); - - interactive = FORCE_INTERACTIVE; - - rl_init_ctx(&rl_ctx); - //rl_setprompt(&rl_ctx, ">> "); - rl_sethook_get(&rl_ctx, (getc_hook)kfile_getc, fd); - rl_sethook_put(&rl_ctx, (putc_hook)kfile_putc, fd); - rl_sethook_match(&rl_ctx, parser_rl_match, NULL); - rl_sethook_clear(&rl_ctx, (clear_hook)kfile_clearerr,fd); - - parser_init(); - - protocol_registerCmds(); - - protocol_prompt(fd); -} diff --git a/examples/triface/protocol.h b/examples/triface/protocol.h deleted file mode 100644 index 8075bc87..00000000 --- a/examples/triface/protocol.h +++ /dev/null @@ -1,50 +0,0 @@ -/** - * \file - * - * - * \brief Implementation of the command protocol between the board and the host - * - * \author Marco Benelli - */ - - -#ifndef PROTOCOL_H -#define PROTOCOL_H - -#include - -#include - -void protocol_init(KFile *fd); -void protocol_run(KFile *fd); - -#endif // PROTOOCOL_H diff --git a/examples/triface/triface.c b/examples/triface/triface.c deleted file mode 100644 index c64b6ceb..00000000 --- a/examples/triface/triface.c +++ /dev/null @@ -1,93 +0,0 @@ -/** - * \file - * - * - * \author Marco Benelli - * \author Bernie Innocenti - * \author Daniele Basile - * - * \brief Windowing system test. - */ - - -#include "protocol.h" -#include "hw/hw_input.h" -#include "hw/hw_adc.h" -#include "cfg/cfg_ser.h" - -#include - -#include -#include -#include - -#include -#include - -static Serial fd_ser; -static Serial tag_ser; - -int main(void) -{ - kdbg_init(); - timer_init(); - adc_init(); - buz_init(); - - IRQ_ENABLE; - INPUT_INIT; - - /* Initialize Tag serial port and data structure */ - TagPacket pkt; - - /* Open the main communication port */ - ser_init(&fd_ser, CONFIG_TRIFACE_PORT); - ser_setbaudrate(&fd_ser, CONFIG_TRIFACE_BAUDRATE); - - ser_init(&tag_ser, TAG_SER_PORT); - ser_setbaudrate(&tag_ser, TAG_SER_BAUDRATE); - - keytag_init(&pkt, &fd_ser.fd, &tag_ser.fd); - - protocol_init(&fd_ser.fd); - - // Main loop - for(;;) - { - protocol_run(&fd_ser.fd); - keytag_poll(&pkt); - } - - return 0; -} - - diff --git a/examples/triface/triface.mk b/examples/triface/triface.mk deleted file mode 100644 index 5341610a..00000000 --- a/examples/triface/triface.mk +++ /dev/null @@ -1,106 +0,0 @@ -# -# $Id$ -# Copyright 2006 Develer S.r.l. (http://www.develer.com/) -# All rights reserved. -# -# Makefile fragment for DevLib triface application. -# -# Author: Bernie Innocenti -# -# - -# Set to 1 for debug builds -triface_DEBUG = 1 - -# Our target application -TRG += triface -CPU = atmega1281 -BOOT_ADDR_START = 0x1E000 - -triface_PREFIX = avr- - -ifeq ($(CPU), atmega1281) -triface_hfuse = 0x98 -triface_lfuse = 0x3d -triface_efuse = 0x7f -triface_lock = 0x2f -else -triface_hfuse = 0x88 -triface_lfuse = 0xff -triface_efuse = 0xff -triface_lock = 0x2f -endif - -triface_MCU = $(CPU) - -triface_CSRC = \ - examples/triface/triface.c \ - examples/triface/protocol.c \ - examples/triface/hw/hw_adc.c \ - bertos/cpu/avr/drv/ser_avr.c \ - bertos/cpu/avr/drv/timer_avr.c \ - bertos/drv/timer.c \ - bertos/drv/ser.c \ - bertos/drv/buzzer.c \ - bertos/drv/sipo.c \ - bertos/mware/formatwr.c \ - bertos/mware/hex.c \ - bertos/mware/readline.c \ - bertos/mware/parser.c \ - bertos/mware/event.c \ - bertos/struct/hashtable.c \ - bertos/kern/kfile.c \ - bertos/net/keytag.c \ - # - -triface_PCSRC += bertos/mware/formatwr.c - -triface_CFLAGS = -O2 -D'ARCH=(ARCH_TRIFACE)' -D'CPU_FREQ=(14745600UL)' -D'WIZ_AUTOGEN' \ - -fno-strict-aliasing -fwrapv -Iexamples/triface -Ibertos/cpu/avr - -triface_LDFLAGS = -Wl - -triface_PROGRAMMER_CPU = atmega1281 -triface_PROGRAMMER_TYPE = stk500v2 -triface_PROGRAMMER_PORT = /dev/ttyS1 -triface_FLASH_SCRIPT = bertos/prg_scripts/avr/flash.sh -triface_STOPFLASH_SCRIPT = bertos/prg_scripts/none.sh -triface_DEBUG_SCRIPT = bertos/prg_scripts/nodebug.sh -triface_STOPDEBUG_SCRIPT = bertos/prg_scripts/none.sh - -# Set to 1 for debug builds -boot_DEBUG = 0 - -# Our target application -TRG += boot - -boot_MCU = $(CPU) -boot_CSRC = \ - examples/triface/boot/main.c \ - bertos/cpu/avr/drv/ser_avr.c \ - bertos/cpu/avr/drv/flash_avr.c \ - bertos/drv/timer.c \ - bertos/cpu/avr/drv/timer_avr.c \ - bertos/drv/ser.c \ - bertos/net/xmodem.c \ - bertos/algo/crc.c \ - bertos/mware/hex.c \ - bertos/kern/kfile.c \ - # - -boot_PREFIX = avr- - -boot_CPPFLAGS = -D'ARCH=(ARCH_TRIFACE|ARCH_BOOT)' -D'CPU_FREQ=(14745600UL)' -D'WIZ_AUTOGEN' \ - -fno-strict-aliasing -fwrapv -Iexamples/triface/boot -Ibertos/cpu/avr - -boot_CFLAGS = -Os -mcall-prologues -boot_LDFLAGS = -Wl,--relax -Wl,--section-start=.text=$(BOOT_ADDR_START) - - -boot_PROGRAMMER_CPU = $(triface_PROGRAMMER_CPU) -boot_PROGRAMMER_TYPE = $(triface_PROGRAMMER_TYPE) -boot_PROGRAMMER_PORT = $(triface_PROGRAMMER_PORT) -boot_FLASH_SCRIPT = $(triface_FLASH_SCRIPT) -boot_STOPFLASH_SCRIPT = $(triface_STOPFLASH_SCRIPT) -boot_DEBUG_SCRIPT = $(triface_DEBUG_SCRIPT) -boot_STOPDEBUG_SCRIPT = $(triface_STOPDEBUG_SCRIPT) diff --git a/examples/triface/verstag.h b/examples/triface/verstag.h deleted file mode 100644 index cbe71278..00000000 --- a/examples/triface/verstag.h +++ /dev/null @@ -1,95 +0,0 @@ -/** - * \file - * - * - * \version $Id$ - * - * \author Bernie Innocenti - * - * \brief Declare application version strings - */ - -#ifndef BERTOS_VERSTAG_H -#define BERTOS_VERSTAG_H - -#ifndef CFG_ARCH_CONFIG_H - #include "cfg/cfg_arch.h" -#endif - -#define APP_NAME "Triface" -#define APP_DESCRIPTION "Trinity Interface Board" -#define APP_AUTHOR "Develer" -#define APP_COPYRIGHT "Copyright 2006, 2007, 2008, Develer (http://www.develer.com/)" - -#define VERS_MAJOR 2 -#define VERS_MINOR 1 -#define VERS_REV 0 -#define VERS_LETTER "" - -/** - * If _SNAPSHOT is defined, \c VERS_TAG contains the build date - * date instead of a numeric version string. - */ -//#define _SNAPSHOT - -#ifdef _DEBUG - #define VERS_DBG "D" -#else - #define VERS_DBG "" -#endif - -#define __STRINGIZE(x) #x -#define _STRINGIZE(x) __STRINGIZE(x) - -/** Build application version string (i.e.: "1.7.0") */ -#define MAKE_VERS(maj,min,rev) _STRINGIZE(maj) "." _STRINGIZE(min) "." _STRINGIZE(rev) VERS_LETTER VERS_DBG -#ifdef _SNAPSHOT - #define VERS_TAG "snapshot" " " __DATE__ " " __TIME__ " " VERS_LETTER " " VERS_DBG -#else - #define VERS_TAG MAKE_VERS(VERS_MAJOR,VERS_MINOR,VERS_REV) -#endif - -/** Build application version string suitable for MS windows resource files (i.e.: "1, 7, 0, 1") */ -#define MAKE_RCVERS(maj,min,rev,bld) _STRINGIZE(maj) ", " _STRINGIZE(min) ", " _STRINGIZE(rev) ", " _STRINGIZE(bld) -#define RCVERSION_TAG MAKE_VERS(VERS_MAJOR,VERS_MINOR,VERS_REV) - -/** The revision string (contains VERS_TAG) */ -extern const char vers_tag[]; - -/** Sequential build number (contains VERS_BUILD) */ -extern const int vers_build_nr; -//extern const char vers_build_str[]; - -/** Hostname of the machine used to build this binary (contains VERS_HOST) */ -extern const char vers_host[]; - -#endif /* BERTOS_VERSTAG_H */ -- 2.25.1