From 0a268ebfc38378978b30cda8dbbc4a93049cd836 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 27 Jul 2011 00:11:30 +0200 Subject: [PATCH 01/11] Fix #define to somethin which works :) --- firmware/basic/idle.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/firmware/basic/idle.c b/firmware/basic/idle.c index f59bd73..a2d4321 100644 --- a/firmware/basic/idle.c +++ b/firmware/basic/idle.c @@ -4,9 +4,10 @@ #include "lcd/print.h" QUEUE the_queue; -#ifdef ARM +#ifdef __arm__ volatile uint32_t _timectr=0; #else +#error "foo" extern uint32_t simTimeCounter(); #define _timectr (simTimeCounter()) #endif @@ -18,8 +19,10 @@ void work_queue(void){ int start; if (the_queue.qstart == the_queue.qend){ -#ifdef ARM +#ifdef __arm__ __asm volatile ("WFI"); +#else + delayms(10); #endif return; }; @@ -36,8 +39,10 @@ void delayms_queue(uint32_t ms){ int end=_timectr+ms/10; do { if (the_queue.qstart == the_queue.qend){ -#ifdef ARM +#ifdef __arm__ __asm volatile ("WFI"); +#else + delayms(10); #endif }else{ work_queue(); @@ -48,8 +53,10 @@ void delayms_queue(uint32_t ms){ void delayms_power(uint32_t ms){ ms+=_timectr; do { -#ifdef ARM +#ifdef __arm__ __asm volatile ("WFI"); +#else + delayms(10); #endif } while (ms >_timectr); }; From 389ab257fafec08c59e99e9174f7a22fa20c9a9f Mon Sep 17 00:00:00 2001 From: roy rocket Date: Wed, 27 Jul 2011 00:16:59 +0200 Subject: [PATCH 02/11] fixed more ARM defines --- firmware/applications/iggy.c | 2 +- firmware/core/lpc134x.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/applications/iggy.c b/firmware/applications/iggy.c index 97b03b4..6523f0a 100644 --- a/firmware/applications/iggy.c +++ b/firmware/applications/iggy.c @@ -142,7 +142,7 @@ void main_iggy(void) { gpioSetValue (RB_LCD_BL, 0); SCB_SCR |= SCB_SCR_SLEEPDEEP; PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN; -#ifdef ARM +#ifdef __arm__ __asm volatile ("WFI"); #endif }else{ diff --git a/firmware/core/lpc134x.h b/firmware/core/lpc134x.h index 5a7332e..96903ae 100644 --- a/firmware/core/lpc134x.h +++ b/firmware/core/lpc134x.h @@ -1937,7 +1937,7 @@ typedef struct #define NVIC ((NVIC_Type *) NVIC_BASE_ADDRESS) -#ifdef ARM +#ifdef __arm__ static inline void __enable_irq() { __asm volatile ("cpsie i"); } static inline void __disable_irq() { __asm volatile ("cpsid i"); } #else From e124c142f2e1bd19841dd3652046499157a31717 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 27 Jul 2011 00:18:23 +0200 Subject: [PATCH 03/11] Fix more instances of wrong define used --- firmware/applications/iggy.c | 2 +- firmware/core/lpc134x.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/applications/iggy.c b/firmware/applications/iggy.c index 97b03b4..6523f0a 100644 --- a/firmware/applications/iggy.c +++ b/firmware/applications/iggy.c @@ -142,7 +142,7 @@ void main_iggy(void) { gpioSetValue (RB_LCD_BL, 0); SCB_SCR |= SCB_SCR_SLEEPDEEP; PMU_PMUCTRL = PMU_PMUCTRL_DPDEN_DEEPPOWERDOWN; -#ifdef ARM +#ifdef __arm__ __asm volatile ("WFI"); #endif }else{ diff --git a/firmware/core/lpc134x.h b/firmware/core/lpc134x.h index 5a7332e..96903ae 100644 --- a/firmware/core/lpc134x.h +++ b/firmware/core/lpc134x.h @@ -1937,7 +1937,7 @@ typedef struct #define NVIC ((NVIC_Type *) NVIC_BASE_ADDRESS) -#ifdef ARM +#ifdef __arm__ static inline void __enable_irq() { __asm volatile ("cpsie i"); } static inline void __disable_irq() { __asm volatile ("cpsid i"); } #else From 2da811bf61475bd0f824a86d6cf603ccb3a95aed Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 27 Jul 2011 00:25:24 +0200 Subject: [PATCH 04/11] Make our systick interval a #define --- firmware/applications/default.c | 9 +++++---- firmware/basic/basic.h | 2 ++ firmware/basic/idle.c | 9 +++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/firmware/applications/default.c b/firmware/applications/default.c index fc6e145..022b896 100644 --- a/firmware/applications/default.c +++ b/firmware/applications/default.c @@ -95,7 +95,7 @@ int lcdInitConfig(){ void main_default(void) { - systickInit(10); + systickInit(SYSTICKSPEED); if(getInputRaw()==BTN_ENTER){ ISPandReset(); @@ -118,7 +118,7 @@ void tick_default(void) { static int ctr; ctr++; incTimer(); - if(ctr>100){ + if(ctr>1000/SYSTICKSPEED){ if(!adcMutex){ VoltageCheck(); LightCheck(); @@ -133,7 +133,7 @@ void tick_default(void) { else backlightSetBrightness(0); - if(ctr%5==0){ + if(ctr%(50/SYSTICKSPEED)==0){ if(GetVoltage()<3600 #ifdef SAFE @@ -142,7 +142,7 @@ void tick_default(void) { ){ IOCON_PIO1_11 = 0x0; gpioSetDir(RB_LED3, gpioDirection_Output); - if( (ctr/5)%10 == 1 ) + if( (ctr/(50/SYSTICKSPEED))%10 == 1 ) gpioSetValue (RB_LED3, 1); else gpioSetValue (RB_LED3, 0); @@ -151,3 +151,4 @@ void tick_default(void) { return; }; + diff --git a/firmware/basic/basic.h b/firmware/basic/basic.h index 94b9222..be165b4 100644 --- a/firmware/basic/basic.h +++ b/firmware/basic/basic.h @@ -182,5 +182,7 @@ void handleMenu(const struct MENU *the_menu); #include "basic/idle.h" +#define SYSTICKSPEED 10 + #endif diff --git a/firmware/basic/idle.c b/firmware/basic/idle.c index a2d4321..3d01408 100644 --- a/firmware/basic/idle.c +++ b/firmware/basic/idle.c @@ -22,7 +22,7 @@ void work_queue(void){ #ifdef __arm__ __asm volatile ("WFI"); #else - delayms(10); + delayms(SYSTICKSPEED); #endif return; }; @@ -36,13 +36,13 @@ void work_queue(void){ }; void delayms_queue(uint32_t ms){ - int end=_timectr+ms/10; + int end=_timectr+ms/SYSTICKSPEED; do { if (the_queue.qstart == the_queue.qend){ #ifdef __arm__ __asm volatile ("WFI"); #else - delayms(10); + delayms(SYSTICKSPEED); #endif }else{ work_queue(); @@ -51,12 +51,13 @@ void delayms_queue(uint32_t ms){ }; void delayms_power(uint32_t ms){ + ms/=SYSTICKSPEED; ms+=_timectr; do { #ifdef __arm__ __asm volatile ("WFI"); #else - delayms(10); + delayms(SYSTICKSPEED); #endif } while (ms >_timectr); }; From 833a6387fb7dc3add73e2ead5dd5efa131ea6975 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 27 Jul 2011 00:28:08 +0200 Subject: [PATCH 05/11] always remove libapp.a before rebuilding it. --- firmware/applications/Makefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/firmware/applications/Makefile b/firmware/applications/Makefile index b8b0246..7647359 100644 --- a/firmware/applications/Makefile +++ b/firmware/applications/Makefile @@ -2,7 +2,11 @@ # User configuration and firmware specific object files ########################################################################## -OBJS = default.o +OBJS = +ifndef NODEFAULT +OBJS += default.o +endif + OBJS += $(foreach mod,$(APP),$(mod).o) SRCS = $(foreach mod,$(APP),$(mod).c) @@ -53,7 +57,6 @@ LOBJ=loadable_$(LAPP).o $(LOBJ): $(CC) $(CFLAGS) -o $@ $(LSRC) - $(RM) $(LIBFILE) OBJS += $(LOBJ) endif @@ -75,6 +78,7 @@ OBJS += $(TOBJS) endif $(LIBFILE): $(OBJS) $(WRAPOBJ) + $(RM) -f $@ $(AR) rcs $@ $(OBJS) $(WRAPOBJ) %.o : %.c From 535b635b0ebe2e3fe9bceb8f0c59d6749f66f347 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 27 Jul 2011 00:57:36 +0200 Subject: [PATCH 06/11] First draft of the new global config system Sorry if your display is mirrored again %) --- firmware/applications/default.c | 95 +-------------------------- firmware/applications/tester/config.c | 37 +++++++++++ firmware/basic/Makefile | 1 + firmware/basic/basic.h | 19 +++++- firmware/basic/config.c | 85 ++++++++++++++++++++++++ firmware/filesystem/ff.h | 1 + firmware/filesystem/util.c | 6 ++ firmware/main.c | 2 + 8 files changed, 152 insertions(+), 94 deletions(-) create mode 100644 firmware/applications/tester/config.c create mode 100644 firmware/basic/config.c diff --git a/firmware/applications/default.c b/firmware/applications/default.c index 022b896..4b25ee3 100644 --- a/firmware/applications/default.c +++ b/firmware/applications/default.c @@ -9,91 +9,6 @@ /**************************************************************************/ -FATFS FatFs[_VOLUMES]; /* File system object for logical drive */ - -#define CONFIGLEN 2 -int lcdInitConfig(){ - FIL file; /* File objects */ - BYTE buf[CONFIGLEN]; - UINT readbytes; - int res; - - lcdFill(0); // clear display buffer - res=f_mount(0, &FatFs[0]); - lcdPrint("mount:"); - lcdPrintln(f_get_rc_string(res)); - if(res){ - return 1; - }; - - res=f_open(&file, "r0ket.cfg", FA_OPEN_EXISTING|FA_READ); - lcdPrint("open:"); - lcdPrintln(f_get_rc_string(res)); - if(res){ - if(res==FR_NO_FILESYSTEM) - return 1; - - lcdPrintln("new r0ket.cfg..."); - - res=f_open(&file, "r0ket.cfg", FA_OPEN_ALWAYS|FA_WRITE); - lcdPrint("create:"); - lcdPrintln(f_get_rc_string(res)); - if(res){ - return 1; - }; - - buf[0]='0'; - buf[1]='0'; - res = f_write(&file, buf, 2, &readbytes); - lcdPrint("write:"); - lcdPrintln(f_get_rc_string(res)); - if(res){ - return 1; - }; - - lcdPrint("wrote:"); - lcdPrintInt(readbytes); - lcdPrintln("b"); - - res=f_close(&file); - lcdPrint("close:"); - lcdPrintln(f_get_rc_string(res)); - if(res){ - return 1; - }; - return 2; // created. Still show screen - }; - - for(int i=0;i + +#include "basic/basic.h" + +#include "lcd/print.h" + +#include "filesystem/ff.h" + +#include + +/**************************************************************************/ + +void readcfg(void) { + readConfig(); +}; + +void savecfg(void){ + saveConfig(); +}; + +void applycfg(void){ + applyConfig(); +}; + +void show(void){ + lcdClear(); + lcdPrint("time:"); lcdPrintInt(globalconfig.time); lcdNl(); + lcdPrint("btrig:"); lcdPrintInt(globalconfig.backlighttrigger); lcdNl(); + lcdPrint("bval:"); lcdPrintInt(globalconfig.backlightvalue); lcdNl(); + lcdPrint("lcd:"); lcdPrintInt(globalconfig.lcdstate); lcdNl(); + lcdPrint("priv:"); lcdPrintInt(globalconfig.privacy); lcdNl(); + lcdRefresh(); +}; + +void lcdmirror(void){ + globalconfig.lcdstate^=2; +}; diff --git a/firmware/basic/Makefile b/firmware/basic/Makefile index cc372be..e831d6d 100644 --- a/firmware/basic/Makefile +++ b/firmware/basic/Makefile @@ -18,6 +18,7 @@ OBJS += ecc.o OBJS += byteorder.o OBJS += random.o OBJS += idle.o +OBJS += config.o LIBNAME=basic diff --git a/firmware/basic/basic.h b/firmware/basic/basic.h index be165b4..b311f81 100644 --- a/firmware/basic/basic.h +++ b/firmware/basic/basic.h @@ -182,7 +182,24 @@ void handleMenu(const struct MENU *the_menu); #include "basic/idle.h" +// config.c + +struct config_t { + time_t time; + uint16_t backlighttrigger; + char backlightvalue; + char lcdstate; + char privacy; +} __attribute__((__packed__)); + +typedef struct config_t CONFIG; + +extern CONFIG globalconfig; + +int readConfig(void); +int saveConfig(void); +int applyConfig(void); + #define SYSTICKSPEED 10 #endif - diff --git a/firmware/basic/config.c b/firmware/basic/config.c new file mode 100644 index 0000000..0a9284c --- /dev/null +++ b/firmware/basic/config.c @@ -0,0 +1,85 @@ +#include +#include "basic/basic.h" + +#include "lcd/lcd.h" +#include "lcd/fonts/smallfonts.h" +#include "lcd/print.h" +#include "filesystem/ff.h" +#include "basic/random.h" + +CONFIG globalconfig = { 0,310,50,0,0}; + +#define CONFFILE "r0ket.cfg" + +/**************************************************************************/ + +int saveConfig(void){ + FIL file; /* File object */ + UINT writebytes; + int res; + + res=f_open(&file, CONFFILE, FA_OPEN_ALWAYS|FA_WRITE); + lcdPrint("create:"); + lcdPrintln(f_get_rc_string(res)); + if(res){ + return 1; + }; + + res = f_write(&file, &globalconfig, sizeof(CONFIG), &writebytes); + lcdPrint("write:"); + lcdPrintln(f_get_rc_string(res)); + if(res){ + return 1; + }; + + lcdPrint("wrote:"); + lcdPrintInt(writebytes); + lcdPrintln("b"); + + res=f_close(&file); + lcdPrint("close:"); + lcdPrintln(f_get_rc_string(res)); + if(res){ + return 1; + }; + return 0; +}; + +int readConfig(void){ + FIL file; /* File object */ + UINT readbytes; + int res; + + lcdFill(0); // clear display buffer + + res=f_open(&file, CONFFILE, FA_OPEN_EXISTING|FA_READ); + lcdPrint("open:"); + lcdPrintln(f_get_rc_string(res)); + if(res){ + return 1; + }; + + res = f_read(&file, &globalconfig, sizeof(CONFIG), &readbytes); + lcdPrint("read:"); + lcdPrintln(f_get_rc_string(res)); + if(res){ + return 1; + }; + + + res=f_close(&file); + lcdPrint("close:"); + lcdPrintln(f_get_rc_string(res)); + if(res){ + return 1; + }; + return 0; +}; + +int applyConfig(){ + if(globalconfig.lcdstate & LCD_INVERTED) + lcdToggleFlag(LCD_INVERTED); + if(globalconfig.lcdstate & LCD_MIRRORX) + lcdToggleFlag(LCD_MIRRORX); + return 0; +}; diff --git a/firmware/filesystem/ff.h b/firmware/filesystem/ff.h index 9a5eb20..07eb8ad 100644 --- a/firmware/filesystem/ff.h +++ b/firmware/filesystem/ff.h @@ -330,6 +330,7 @@ int ff_del_syncobj (_SYNC_t); /* Delete a sync object */ /* Utility functions */ const char* f_get_rc_string (FRESULT rc); +void fsInit(); #ifdef __cplusplus } diff --git a/firmware/filesystem/util.c b/firmware/filesystem/util.c index f183b1a..7e635ad 100644 --- a/firmware/filesystem/util.c +++ b/firmware/filesystem/util.c @@ -1,5 +1,7 @@ #include +FATFS FatFs; /* File system object for logical drive */ + const TCHAR *rcstrings = _T("OK\0DISK_ERR\0INT_ERR\0NOT_READY\0NO_FILE\0NO_PATH\0INVALID_NAME\0") _T("DENIED\0EXIST\0INVALID_OBJECT\0WRITE_PROTECTED\0INVALID_DRIVE\0") @@ -16,3 +18,7 @@ const char* f_get_rc_string (FRESULT rc) { return p; } + +void fsInit(){ + f_mount(0, &FatFs); +}; diff --git a/firmware/main.c b/firmware/main.c index 94c5a13..bcef02d 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -22,6 +22,8 @@ int main(void) { // initialise basic badge functions rbInit(); + + fsInit(); lcdInit(); // display From 5a55da7f76ecc9d54641537b8dce2b721b45de5f Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 27 Jul 2011 00:58:48 +0200 Subject: [PATCH 07/11] Fix some menu regressions because of getInputWait() changes --- firmware/applications/tester/util.c | 3 ++- firmware/basic/menu.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/firmware/applications/tester/util.c b/firmware/applications/tester/util.c index 02240b0..1d2a49c 100644 --- a/firmware/applications/tester/util.c +++ b/firmware/applications/tester/util.c @@ -74,7 +74,8 @@ void msc_menu(void){ DoString(0,8,"MSC Enabled."); lcdDisplay(); usbMSCInit(); - while(!getInputRaw())delayms(10); + getInputWaitRelease(); + getInputWait(); DoString(0,16,"MSC Disabled."); usbMSCOff(); }; diff --git a/firmware/basic/menu.c b/firmware/basic/menu.c index 3170315..4758d65 100644 --- a/firmware/basic/menu.c +++ b/firmware/basic/menu.c @@ -76,6 +76,7 @@ void handleMenu(const struct MENU *the_menu) { lcdClear(); lcdPrintln("Called..."); lcdRefresh(); + getInputWaitRelease(); if (the_menu->entries[menuselection]->callback!=NULL) the_menu->entries[menuselection]->callback(); lcdDisplay(); @@ -86,6 +87,7 @@ void handleMenu(const struct MENU *the_menu) { /* no button pressed */ break; } + getInputWaitRelease(); } return; From 477dfcf98aada674d821fdc7f0dc34178db1d909 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 27 Jul 2011 01:02:26 +0200 Subject: [PATCH 08/11] APP=initial is compiled without default.c --- firmware/applications/Makefile | 5 +++++ firmware/applications/initial.c | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/firmware/applications/Makefile b/firmware/applications/Makefile index 7647359..8a3baf2 100644 --- a/firmware/applications/Makefile +++ b/firmware/applications/Makefile @@ -3,6 +3,11 @@ ########################################################################## OBJS = + +ifeq "$(APP)" "initial" +NODEFAULT = y +endif + ifndef NODEFAULT OBJS += default.o endif diff --git a/firmware/applications/initial.c b/firmware/applications/initial.c index 8ed9c19..c3ef34b 100644 --- a/firmware/applications/initial.c +++ b/firmware/applications/initial.c @@ -11,6 +11,9 @@ void main_initial(void) { char key=BTN_NONE; + + systickInit(SYSTICKSPEED); + gpioSetValue (RB_LED0, 0); gpioSetValue (RB_LED1, 0); gpioSetValue (RB_LED2, 0); @@ -89,6 +92,7 @@ void main_initial(void) { void tick_initial(void){ static int foo=0; static int toggle=0; + incTimer(); if(foo++>80){ toggle=1-toggle; foo=0; From 250ea3213f91730c4e747f78640eb1ce0eebe2d8 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 27 Jul 2011 01:15:52 +0200 Subject: [PATCH 09/11] Make backlight and lcd-state config vars actually work --- firmware/applications/default.c | 2 +- firmware/applications/tester/config.c | 3 ++- firmware/applications/tester/util.c | 5 +++-- firmware/basic/config.c | 4 ---- firmware/basic/night.c | 12 ++++++------ firmware/lcd/display.c | 2 +- 6 files changed, 13 insertions(+), 15 deletions(-) diff --git a/firmware/applications/default.c b/firmware/applications/default.c index 4b25ee3..4e145ee 100644 --- a/firmware/applications/default.c +++ b/firmware/applications/default.c @@ -39,7 +39,7 @@ void tick_default(void) { }; if(isNight()) - backlightSetBrightness(100); + backlightSetBrightness(globalconfig.backlightvalue); else backlightSetBrightness(0); diff --git a/firmware/applications/tester/config.c b/firmware/applications/tester/config.c index 9e0efa4..0d8df7c 100644 --- a/firmware/applications/tester/config.c +++ b/firmware/applications/tester/config.c @@ -3,6 +3,7 @@ #include "basic/basic.h" #include "lcd/print.h" +#include "lcd/display.h" #include "filesystem/ff.h" @@ -33,5 +34,5 @@ void show(void){ }; void lcdmirror(void){ - globalconfig.lcdstate^=2; + lcdToggleFlag(LCD_MIRRORX); }; diff --git a/firmware/applications/tester/util.c b/firmware/applications/tester/util.c index 1d2a49c..8747264 100644 --- a/firmware/applications/tester/util.c +++ b/firmware/applications/tester/util.c @@ -33,10 +33,11 @@ void adc_light(void) { int dx=0; int dy=8; dx=DoString(0,dy,"Light:"); - DoString(0,dy+8,"Night:"); + DoString(0,dy+16,"Night:"); while ((getInputRaw())==BTN_NONE){ DoInt(dx,dy,GetLight()); - DoInt(dx,dy+8,isNight()); + DoInt(dx,dy+16,isNight()); + DoInt(dx,dy+8,globalconfig.backlighttrigger); lcdDisplay(); }; dy+=8; diff --git a/firmware/basic/config.c b/firmware/basic/config.c index 0a9284c..eea1936 100644 --- a/firmware/basic/config.c +++ b/firmware/basic/config.c @@ -77,9 +77,5 @@ int readConfig(void){ }; int applyConfig(){ - if(globalconfig.lcdstate & LCD_INVERTED) - lcdToggleFlag(LCD_INVERTED); - if(globalconfig.lcdstate & LCD_MIRRORX) - lcdToggleFlag(LCD_MIRRORX); return 0; }; diff --git a/firmware/basic/night.c b/firmware/basic/night.c index 8e7e60f..6110818 100644 --- a/firmware/basic/night.c +++ b/firmware/basic/night.c @@ -7,6 +7,8 @@ uint32_t light=300*HYST; char _isnight=1; +#define threshold globalconfig.backlighttrigger + void LightCheck(void){ int iocon; char iodir; @@ -25,16 +27,14 @@ void LightCheck(void){ gpioSetDir(RB_LED3, iodir); IOCON_PIO1_11=iocon; - static uint16_t threshold=0; - if(threshold==0){ - // read threshold from config - threshold=320 * HYST; + if(threshold==0){ // uninitialized? + threshold=320; }; - if(_isnight && light>(threshold+RANGE*HYST)) + if(_isnight && light/HYST>(threshold+RANGE)) _isnight=0; - if(!_isnight && light Date: Wed, 27 Jul 2011 15:41:18 +0200 Subject: [PATCH 10/11] Actually try to use USB-serial code. "make APP=tester TYPE=serial" --- firmware/applications/Makefile | 7 +- firmware/applications/serial/config.c | 1 + firmware/applications/serial/serial.c | 116 ++++++++++++++++++++++++++ firmware/applications/serial/util.c | 1 + firmware/applications/serial/uuid.c | 1 + firmware/basic/reinvoke_isp.c | 8 +- firmware/usb/usbmsc.c | 4 +- firmware/usb/usbmsc.h | 2 + firmware/usbcdc/usbhw.c | 9 +- 9 files changed, 142 insertions(+), 7 deletions(-) create mode 120000 firmware/applications/serial/config.c create mode 100644 firmware/applications/serial/serial.c create mode 120000 firmware/applications/serial/util.c create mode 120000 firmware/applications/serial/uuid.c diff --git a/firmware/applications/Makefile b/firmware/applications/Makefile index 8a3baf2..86a45db 100644 --- a/firmware/applications/Makefile +++ b/firmware/applications/Makefile @@ -67,7 +67,10 @@ OBJS += $(LOBJ) endif ifeq "$(APP)" "tester" -TSRCS = $(wildcard $(APP)/*.c) +ifndef TYPE +TYPE=$(APP) +endif +TSRCS = $(wildcard $(TYPE)/*.c) TOBJS = $(foreach mod,$(TSRCS),$(subst .c,.o,$(mod))) TWRAP=tester.gen @@ -90,7 +93,7 @@ $(LIBFILE): $(OBJS) $(WRAPOBJ) $(CC) $(CFLAGS) -o $@ $< clean: - rm -f $(OBJS) $(WRAPOBJ) $(WRAPSRC) $(LIBFILE) *.o tester/*.o + rm -f $(OBJS) $(WRAPOBJ) $(WRAPSRC) $(LIBFILE) *.o */*.o %.c: @echo diff --git a/firmware/applications/serial/config.c b/firmware/applications/serial/config.c new file mode 120000 index 0000000..0dc83e2 --- /dev/null +++ b/firmware/applications/serial/config.c @@ -0,0 +1 @@ +../tester/config.c \ No newline at end of file diff --git a/firmware/applications/serial/serial.c b/firmware/applications/serial/serial.c new file mode 100644 index 0000000..d8e1788 --- /dev/null +++ b/firmware/applications/serial/serial.c @@ -0,0 +1,116 @@ +#include + +#include "basic/basic.h" + +#include "lcd/lcd.h" +#include "lcd/print.h" + +#include "funk/nrf24l01p.h" + +#include "core/usbcdc/usb.h" +#include "core/usbcdc/usbcore.h" +#include "core/usbcdc/usbhw.h" +#include "core/usbcdc/cdcuser.h" +#include "core/usbcdc/cdc_buf.h" + +#include + +#if CFG_USBMSC +#error "MSC is defined +#endif + +#if !CFG_USBCDC +#error "CDC is not defined +#endif + +/**************************************************************************/ + +volatile unsigned int lastTick; +int puts(const char * str) +{ + // There must be at least 1ms between USB frames (of up to 64 bytes) + // This buffers all data and writes it out from the buffer one frame + // and one millisecond at a time + if (USB_Configuration) + { + while(*str) + cdcBufferWrite(*str++); + // Check if we can flush the buffer now or if we need to wait + unsigned int currentTick = systickGetTicks(); + if (currentTick != lastTick) + { + uint8_t frame[64]; + uint32_t bytesRead = 0; + while (cdcBufferDataPending()) + { + // Read up to 64 bytes as long as possible + bytesRead = cdcBufferReadLen(frame, 64); + USB_WriteEP (CDC_DEP_IN, frame, bytesRead); + systickDelay(1); + } + lastTick = currentTick; + } + } + return 0; +} + + +void f_ser(void) { + //lastTick = systickGetTicks(); // Used to control output/printf timing + CDC_Init(); // Initialise VCOM + USB_Init(); // USB Initialization + lcdPrintln("preconnect"); + USB_Connect(TRUE); // USB Connect + lcdPrintln("postconnect"); + // Wait until USB is configured or timeout occurs + uint32_t usbTimeout = 0; +// while ( usbTimeout < CFG_USBCDC_INITTIMEOUT / 10 ) { +// if (USB_Configuration) break; +// delayms(10); // Wait 10ms +// usbTimeout++; +// } + lcdPrintln("fini"); +}; + +void f_disconnect(void) { + USB_Connect(FALSE); +}; + +#define LEN 10 +void f_sread(){ + uint8_t buf[LEN+1]; + int l=LEN; + + lcdPrint("Bytes:"); + CDC_OutBufAvailChar (&l); + lcdPrintInt(l); + lcdNl(); + + lcdPrint("read:"); + CDC_RdOutBuf (buf, &l); + lcdPrintInt(l); + lcdNl(); + + buf[l]=0; + lcdPrintln(buf); +}; + +void f_echo(){ + uint8_t buf[2] = {0,0}; + int l; + while(1){ + CDC_OutBufAvailChar(&l); + if( l ){ + l = 1; + CDC_RdOutBuf (buf, &l); + puts(buf); + } + //puts("hello world\r\n"); + //delayms(1); + } +}; + +void f_say(){ + puts("hello world\r\n"); +}; + diff --git a/firmware/applications/serial/util.c b/firmware/applications/serial/util.c new file mode 120000 index 0000000..2a06902 --- /dev/null +++ b/firmware/applications/serial/util.c @@ -0,0 +1 @@ +../tester/util.c \ No newline at end of file diff --git a/firmware/applications/serial/uuid.c b/firmware/applications/serial/uuid.c new file mode 120000 index 0000000..a3edae7 --- /dev/null +++ b/firmware/applications/serial/uuid.c @@ -0,0 +1 @@ +../tester/uuid.c \ No newline at end of file diff --git a/firmware/basic/reinvoke_isp.c b/firmware/basic/reinvoke_isp.c index 2b3a6f3..b34ddc1 100644 --- a/firmware/basic/reinvoke_isp.c +++ b/firmware/basic/reinvoke_isp.c @@ -76,10 +76,16 @@ void EnableWatchdog(uint32_t ms){ void ISPandReset(void){ #if CFG_USBMSC - if(usbMSCenabled){ + if(usbMSCenabled&USB_MSC_ENABLEFLAG){ usbMSCOff(); delayms(500); }; +#endif +#if CFG_USBCDC + if(usbMSCenabled&USB_CDC_ENABLEFLAG){ + USB_Connect(FALSE); + delayms(500); + }; #endif EnableWatchdog(1000*5); ReinvokeISP(); diff --git a/firmware/usb/usbmsc.c b/firmware/usb/usbmsc.c index e75d310..25f4b70 100644 --- a/firmware/usb/usbmsc.c +++ b/firmware/usb/usbmsc.c @@ -85,7 +85,7 @@ void usbMSCInit(void) { (*rom)->pUSBD->init(&DeviceInfo); /* USB Initialization */ (*rom)->pUSBD->connect(true); /* USB Connect */ - usbMSCenabled=1; + usbMSCenabled|=USB_MSC_ENABLEFLAG; } #if CFG_USBMSC @@ -96,6 +96,6 @@ void USB_IRQHandler() { void usbMSCOff(void) { (*rom)->pUSBD->connect(false); /* USB Disconnect */ - usbMSCenabled=0; + usbMSCenabled&=~USB_MSC_ENABLEFLAG; } diff --git a/firmware/usb/usbmsc.h b/firmware/usb/usbmsc.h index defe55b..5d01583 100644 --- a/firmware/usb/usbmsc.h +++ b/firmware/usb/usbmsc.h @@ -39,6 +39,8 @@ #include "projectconfig.h" +#define USB_MSC_ENABLEFLAG (1<<0) +#define USB_CDC_ENABLEFLAG (1<<1) extern char usbMSCenabled; void usbMSCWrite(uint32_t offset, uint8_t src[], uint32_t length); void usbMSCRead(uint32_t offset, uint8_t dst[], uint32_t length); diff --git a/firmware/usbcdc/usbhw.c b/firmware/usbcdc/usbhw.c index d148ed2..711190c 100644 --- a/firmware/usbcdc/usbhw.c +++ b/firmware/usbcdc/usbhw.c @@ -27,6 +27,7 @@ #include "usbcore.h" #include "usbuser.h" +#include "usb/usbmsc.h" /* * USB and IO Clock configuration only. @@ -63,8 +64,8 @@ void USBIOClkConfig( void ) SCB_USBCLKSEL = SCB_USBCLKSEL_SOURCE_USBPLLOUT; // Set USB pin functions - IOCON_PIO0_1 &= ~IOCON_PIO0_1_FUNC_MASK; - IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CLKOUT; // CLK OUT +// IOCON_PIO0_1 &= ~IOCON_PIO0_1_FUNC_MASK; +// IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CLKOUT; // CLK OUT IOCON_PIO0_3 &= ~IOCON_PIO0_3_FUNC_MASK; IOCON_PIO0_3 |= IOCON_PIO0_3_FUNC_USB_VBUS; // VBus IOCON_PIO0_6 &= ~IOCON_PIO0_6_FUNC_MASK; @@ -205,6 +206,10 @@ void USB_Init (void) void USB_Connect (uint32_t con) { + if(con) + usbMSCenabled|=USB_CDC_ENABLEFLAG; + else + usbMSCenabled&=~USB_CDC_ENABLEFLAG; WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(con ? DEV_CON : 0)); } From 838f04505c7da75fd053c2bcb8bd1f1dacbd0ec9 Mon Sep 17 00:00:00 2001 From: Stefan `Sec` Zehl Date: Wed, 27 Jul 2011 17:19:29 +0200 Subject: [PATCH 11/11] Add small lcd documentation :) --- firmware/lcd/display.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/firmware/lcd/display.c b/firmware/lcd/display.c index fbb6150..02a9eae 100644 --- a/firmware/lcd/display.c +++ b/firmware/lcd/display.c @@ -79,9 +79,23 @@ void lcdInit(void) { lcd_select(); +/* Small Nokia 1200 LCD docs: + * clear/ set + * on 0xae / 0xaf + * invert 0xa6 / 0xa7 + * mirror-x 0xA0 / 0xA1 + * mirror-y 0xc7 / 0xc8 + * + * 0x20+x contrast (0=black - 0x2e) + * 0x40+x offset in rows from top (-0x7f) + * 0x80+x contrast? (0=black -0x9f?) + * 0xd0+x black lines from top? (-0xdf?) + * + */ + lcdWrite(TYPE_CMD,0xE2); delayms(5); - lcdWrite(TYPE_CMD,0xAF); + lcdWrite(TYPE_CMD,0xAF); // Display ON lcdWrite(TYPE_CMD,0xA4); lcdWrite(TYPE_CMD,0x2F); lcdWrite(TYPE_CMD,0xB0); @@ -252,3 +266,4 @@ void lcdShift(int x, int y, bool wrap) { while(y-->0) lcdShiftV(dir, wrap); } +