From aea9c54dbb7ea4b957f675ffee7266e0432cfd42 Mon Sep 17 00:00:00 2001 From: arighi Date: Thu, 8 Apr 2010 16:54:42 +0000 Subject: [PATCH 1/1] lm3s1968: add graphic to the example. Show the BeRTOS bouncing logo and statistics informations to the OLED display. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3403 38d2e660-2303-0410-9eaa-f027e97ec537 --- bertos/icons/logo.c | 2 +- examples/demo/demo.c | 2 +- examples/lm3s1968/cfg/cfg_gfx.h | 74 +++++++++++++++ examples/lm3s1968/lm3s1968.c | 159 ++++++++++++++++++++++++++------ examples/lm3s1968/lm3s1968.mk | 29 ++++-- 5 files changed, 232 insertions(+), 34 deletions(-) create mode 100644 examples/lm3s1968/cfg/cfg_gfx.h diff --git a/bertos/icons/logo.c b/bertos/icons/logo.c index bd5afcc3..85194d4b 100644 --- a/bertos/icons/logo.c +++ b/bertos/icons/logo.c @@ -8,7 +8,7 @@ */ const PROGMEM uint8_t bertos_logo_raster[] = { - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, diff --git a/examples/demo/demo.c b/examples/demo/demo.c index de9ddeb0..cd9487cd 100644 --- a/examples/demo/demo.c +++ b/examples/demo/demo.c @@ -92,7 +92,7 @@ static void hello_world(Bitmap *bm) /* Set big font */ gfx_setFont(bm, &font_ncenB18); - text_xprintf(bm, 1, 0, STYLEF_BOLD | TEXT_FILL | TEXT_CENTER, + text_xprintf(bm, 0, 0, STYLEF_BOLD | TEXT_FILL | TEXT_CENTER, "Hello, world!"); schedule(); while (1) diff --git a/examples/lm3s1968/cfg/cfg_gfx.h b/examples/lm3s1968/cfg/cfg_gfx.h new file mode 100644 index 00000000..8d8b6fa2 --- /dev/null +++ b/examples/lm3s1968/cfg/cfg_gfx.h @@ -0,0 +1,74 @@ +/** + * \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/lm3s1968.c b/examples/lm3s1968/lm3s1968.c index 826bd3e4..aec08cec 100644 --- a/examples/lm3s1968/lm3s1968.c +++ b/examples/lm3s1968/lm3s1968.c @@ -35,14 +35,37 @@ * \author Andrea Righi */ +#include +#include #include #include -#include "io/lm3s.h" +#include +#include +#include +#include +#include +#include +#include -static Process *hp_proc, *lp_proc; +#define PROC_STACK_SIZE KERN_MINSTACKSIZE * 2 + +#if CONFIG_KERN_HEAP +#define hp_stack NULL +#define lp_stack NULL +#else +static PROC_DEFINE_STACK(hp_stack, PROC_STACK_SIZE); +static PROC_DEFINE_STACK(lp_stack, PROC_STACK_SIZE); +#endif + +static Process *hp_proc, *lp_proc, *res_proc; static hptime_t start, end; +static uint8_t raster[RAST_SIZE(128, 96)]; +static Bitmap bm; + +extern Font font_helvB10; + static void led_init(void) { /* Enable the GPIO port that is used for the on-board LED */ @@ -73,47 +96,113 @@ INLINE hptime_t get_hp_ticks(void) timer_clock_unlocked() * TIMER_HW_CNT; } -#if CONFIG_KERN_HEAP -#define hp_stack NULL -#define HP_STACK_SIZE KERN_MINSTACKSIZE * 2 -#else -static PROC_DEFINE_STACK(hp_stack, KERN_MINSTACKSIZE * 2); -#define HP_STACK_SIZE sizeof(hp_stack) -#endif - -static void NORETURN hp_process(void) +static void NORETURN res_process(void) { - char spinner[] = {'/', '-', '\\', '|'}; + const char spinner[] = {'/', '-', '\\', '|'}; + char buffer[256], c; int i; - for(i = 0; ; i++) + for (i = 0; ; i++) { + ticks_t clock; + sig_wait(SIG_USER0); - end = get_hp_ticks(); - kprintf("%c context switch in %lu clock cycles (~%lu us) \r", - spinner[i % countof(spinner)], - end - start, - ((end - start) * 1000000 / CPU_FREQ)); + clock = timer_clock_unlocked(); + + /* Display uptime (in ticks) */ + buffer[sizeof(buffer) - 1] = '\0'; + snprintf(buffer, sizeof(buffer) - 1, + "uptime: %lu sec", clock / 1000); + text_xprintf(&bm, 2, 0, TEXT_FILL, buffer); + + /* Show context switch (in clock cycles) */ + c = spinner[i % countof(spinner)]; + buffer[sizeof(buffer) - 1] = '\0'; + snprintf(buffer, sizeof(buffer) - 1, + "%c Context switch %c", c, c); + text_xprintf(&bm, 4, 0, TEXT_CENTER | TEXT_FILL, buffer); + buffer[sizeof(buffer) - 1] = '\0'; + snprintf(buffer, sizeof(buffer) - 1, + " %lu clock cycles", end - start); + text_xprintf(&bm, 6, 0, TEXT_FILL, buffer); + + /* Show context switch (in usec) */ + buffer[sizeof(buffer) - 1] = '\0'; + snprintf(buffer, sizeof(buffer) - 1, + " %lu.%lu usec", + ((end - start) * 1000000) / CPU_FREQ, + ((end - start) * (100000000 / CPU_FREQ)) % 100); + text_xprintf(&bm, 7, 0, TEXT_FILL, buffer); + lm3s_lcd_blitBitmap(&bm); + + /* Blink the status LED and restart the test */ led_off(); - timer_delay(50); + timer_delay(100); + led_on(); sig_send(lp_proc, SIG_USER0); } } +static void NORETURN hp_process(void) +{ + while (1) + { + sig_wait(SIG_USER0); + end = get_hp_ticks(); + sig_send(res_proc, SIG_USER0); + } +} + static void NORETURN lp_process(void) { while (1) { - led_on(); - timer_delay(50); start = get_hp_ticks(); sig_send(hp_proc, SIG_USER0); sig_wait(SIG_USER0); } } +/** + * Show the splash screen + */ +static void bouncing_logo(Bitmap *bm) +{ + const long SPEED_SCALE = 1000; + const long GRAVITY_ACCEL = 100; + const long BOUNCE_ELASTICITY = 2; + const long TOT_FRAMES = 100; + long h = (long)(-bertos_logo.height) * SPEED_SCALE; + long speed = 0, i; + + for (i = 0; i < TOT_FRAMES; i++) + { + /* Move */ + h += speed; + + /* Gravity acceleration */ + speed += GRAVITY_ACCEL; + + if (h > 0 && speed > 0) + { + /* Bounce */ + speed = -(speed / BOUNCE_ELASTICITY); + + } + /* Update graphics */ + gfx_blitImage(bm, + (LCD_WIDTH - bertos_logo.width) / 2, + (LCD_HEIGHT - bertos_logo.height) / 2 + h / SPEED_SCALE, + &bertos_logo); + lm3s_lcd_blitBitmap(bm); + timer_delay(5); + } +} + int main(void) { + char buffer[32]; + IRQ_ENABLE; kdbg_init(); @@ -126,16 +215,34 @@ int main(void) kputs("Init Process.."); proc_init(); kputs("Done.\n"); + kputs("Init OLED display.."); + lm3s_lcd_init(CPU_FREQ / 2); + gfx_bitmapInit(&bm, raster, LCD_WIDTH, LCD_HEIGHT); + gfx_setFont(&bm, &font_helvB10); + kputs("Done.\n"); + + bouncing_logo(&bm); - kputs("Check scheduling functionality\n"); + gfx_bitmapClear(&bm); +#ifdef _DEBUG + text_xprintf(&bm, 4, 0, TEXT_CENTER | TEXT_FILL, "BeRTOS up & running!"); + lm3s_lcd_blitBitmap(&bm); proc_testRun(); +#endif + snprintf(buffer, sizeof(buffer), + "CPU: Cortex-M3 %luMHz", CPU_FREQ / 1000000); + text_xprintf(&bm, 0, 0, TEXT_FILL, buffer); + lm3s_lcd_blitBitmap(&bm); + text_xprintf(&bm, 1, 0, TEXT_FILL, "Board: LM3S1968 EVB"); + lm3s_lcd_blitBitmap(&bm); + + hp_proc = proc_new(hp_process, NULL, PROC_STACK_SIZE, hp_stack); + lp_proc = proc_new(lp_process, NULL, PROC_STACK_SIZE, lp_stack); - kputs("BeRTOS is up & running\n\n"); - hp_proc = proc_new(hp_process, NULL, HP_STACK_SIZE, hp_stack); - lp_proc = proc_current(); + res_proc = proc_current(); proc_setPri(hp_proc, 2); proc_setPri(lp_proc, 1); - lp_process(); + res_process(); } diff --git a/examples/lm3s1968/lm3s1968.mk b/examples/lm3s1968/lm3s1968.mk index 72d94cfd..d2432f4f 100644 --- a/examples/lm3s1968/lm3s1968.mk +++ b/examples/lm3s1968/lm3s1968.mk @@ -10,13 +10,23 @@ # # Set to 1 for debug builds -lm3s1968_DEBUG = 1 +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/fonts/luBS14.c \ + bertos/fonts/helvB10.c \ + bertos/icons/logo.c \ bertos/mware/formatwr.c \ bertos/mware/hex.c \ bertos/mware/sprintf.c \ @@ -29,10 +39,13 @@ lm3s1968_CSRC = \ bertos/kern/coop.c \ bertos/kern/preempt.c \ bertos/kern/signal.c \ + bertos/cpu/cortex-m3/drv/gpio_lm3s.c \ bertos/cpu/cortex-m3/drv/irq_lm3s.c \ bertos/cpu/cortex-m3/drv/timer_lm3s.c \ bertos/cpu/cortex-m3/drv/clock_lm3s.c \ bertos/cpu/cortex-m3/drv/kdebug_lm3s.c \ + bertos/cpu/cortex-m3/drv/ssi_lm3s.c \ + bertos/cpu/cortex-m3/drv/lcd_lm3s.c \ bertos/cpu/cortex-m3/hw/init_lm3s.c lm3s1968_CPPASRC = \ @@ -44,8 +57,8 @@ lm3s1968_CPPASRC = \ # This is an hosted application lm3s1968_PREFIX = arm-none-eabi- -lm3s1968_CPPAFLAGS = -g -gdwarf-2 -mthumb -mno-thumb-interwork -falign-functions=16 -fno-strict-aliasing -fwrapv -lm3s1968_CPPFLAGS = -O0 -D'ARCH=0' -D__ARM_LM3S1968__ -D'CPU_FREQ=(50000000L)' -D'WIZ_AUTOGEN' -g3 -gdwarf-2 -fverbose-asm -mthumb -mno-thumb-interwork -falign-functions=16 -Iexamples/lm3s1968 -Ibertos/cpu/cortex-m3 -fno-strict-aliasing -fwrapv +lm3s1968_CPPAFLAGS = -mthumb -mno-thumb-interwork -falign-functions=16 -fno-strict-aliasing -fwrapv +lm3s1968_CPPFLAGS = -D'ARCH=0' -D__ARM_LM3S1968__ -D'CPU_FREQ=(50000000L)' -D'WIZ_AUTOGEN' -mthumb -mno-thumb-interwork -falign-functions=16 -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 -fno-strict-aliasing -fwrapv -mthumb -mno-thumb-interwork -falign-functions=16 lm3s1968_CPU = cortex-m3 @@ -57,8 +70,12 @@ 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 -# Debug stuff ifeq ($(lm3s1968_DEBUG),0) - demo_CFLAGS += -Os -fomit-frame-pointer - demo_CXXFLAGS += -Os -fomit-frame-pointer + # 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 -- 2.25.1