Simple cpu boost tracker for LOGF builds. Shows the last 64 cpu_boost() calls from the debug menu


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12087 a1c6a512-1295-4272-9138-f99709370657
diff --git a/apps/codecs.c b/apps/codecs.c
index a093c2b..3af5158 100644
--- a/apps/codecs.c
+++ b/apps/codecs.c
@@ -131,9 +131,13 @@
     system_memory_guard,
     &cpu_frequency,
 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
+#ifdef CPU_BOOST_LOGGING
+    cpu_boost_,
+#else
     cpu_boost,
 #endif
 #endif
+#endif
 
     /* strings and memory */
     snprintf,
diff --git a/apps/codecs.h b/apps/codecs.h
index dff219c..cef14c3 100644
--- a/apps/codecs.h
+++ b/apps/codecs.h
@@ -209,9 +209,13 @@
     int (*system_memory_guard)(int newmode);
     long *cpu_frequency;
 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
+#ifdef CPU_BOOST_LOGGING
+    void (*cpu_boost_)(bool on_off,char*location,int line);
+#else
     void (*cpu_boost)(bool on_off);
 #endif
 #endif
+#endif
 
     /* strings and memory */
     int (*snprintf)(char *buf, size_t size, const char *fmt, ...);
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 081bf2f..22db43d 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -2237,7 +2237,55 @@
     return false;
 }
 #endif /* defined(HAVE_EEPROM) && !defined(HAVE_EEPROM_SETTINGS) */
-
+#ifdef CPU_BOOST_LOGGING
+static bool cpu_boost_log(void)
+{
+    int i = 0,j=0;
+    int count = cpu_boost_log_getcount();
+    int lines = LCD_HEIGHT/SYSFONT_HEIGHT;
+    char *str;
+    bool done;
+    lcd_setmargins(0, 0);
+    lcd_setfont(FONT_SYSFIXED);
+    str = cpu_boost_log_getlog_first();
+    while (i < count)
+    {
+        lcd_clear_display();
+        for(j=0; j<lines; j++,i++)
+        {
+            if (!str)
+                str = cpu_boost_log_getlog_next();
+            if (str)
+            {
+                lcd_puts(0, j,str);
+            }
+            str = NULL;
+        }
+        lcd_update();
+        done = false;
+        action_signalscreenchange();
+        while (!done)
+        {
+            switch(get_action(CONTEXT_STD,TIMEOUT_BLOCK))
+            {
+                case ACTION_STD_OK:
+                case ACTION_STD_PREV:
+                case ACTION_STD_NEXT:
+                    done = true;
+                break;
+                case ACTION_STD_CANCEL:
+                    i = count;
+                    done = true;
+                break;
+            }
+        }
+    }
+    get_action(CONTEXT_STD,TIMEOUT_BLOCK);
+    lcd_setfont(FONT_UI);
+    action_signalscreenchange();
+    return false;
+}
+#endif
 bool debug_menu(void)
 {
     int m;
@@ -2312,6 +2360,9 @@
         {"logf", logfdisplay },
         {"logfdump", logfdump },
 #endif
+#ifdef CPU_BOOST_LOGGING
+        {"cpu_boost log",cpu_boost_log},
+#endif
     };
 
     m=menu_init( items, sizeof items / sizeof(struct menu_item), NULL,
diff --git a/apps/plugin.c b/apps/plugin.c
index 250b4cc..e11fd5c 100644
--- a/apps/plugin.c
+++ b/apps/plugin.c
@@ -250,9 +250,14 @@
 #ifndef SIMULATOR
     system_memory_guard,
     &cpu_frequency,
+
 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
+#ifdef CPU_BOOST_LOGGING
+    cpu_boost_,
+#else
     cpu_boost,
 #endif
+#endif
     timer_register,
     timer_unregister,
     timer_set_period,
diff --git a/apps/plugin.h b/apps/plugin.h
index b2d894f..64cc208 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -344,8 +344,12 @@
     int (*system_memory_guard)(int newmode);
     long *cpu_frequency;
 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
+#ifdef CPU_BOOST_LOGGING
+    void (*cpu_boost_)(bool on_off,char*location,int line);
+#else
     void (*cpu_boost)(bool on_off);
 #endif
+#endif
     bool (*timer_register)(int reg_prio, void (*unregister_callback)(void),
                            long cycles, int int_prio,
                            void (*timer_callback)(void));
diff --git a/firmware/export/system.h b/firmware/export/system.h
index 688cf9b..6b53b88 100644
--- a/firmware/export/system.h
+++ b/firmware/export/system.h
@@ -56,22 +56,38 @@
 bool detect_flashed_ramimage(void);
 bool detect_original_firmware(void);
 
+#if defined(HAVE_ADJUSTABLE_CPU_FREQ) \
+        && defined(ROCKBOX_HAS_LOGF)
+#define CPU_BOOST_LOGGING
+#endif
+
 #ifdef HAVE_ADJUSTABLE_CPU_FREQ
 #define FREQ cpu_frequency
 void set_cpu_frequency(long frequency);
+#ifdef CPU_BOOST_LOGGING
+char * cpu_boost_log_getlog_first(void);
+char * cpu_boost_log_getlog_next(void);
+int cpu_boost_log_getcount(void);
+void cpu_boost_(bool on_off, char* location, int line);
+#else
 void cpu_boost(bool on_off);
+#endif
 void cpu_idle_mode(bool on_off);
 int get_cpu_boost_counter(void);
 #else
 #define FREQ CPU_FREQ
 #define set_cpu_frequency(frequency)
-#define cpu_boost(on_off)
+#define cpu_boost(on_off,location)
 #define cpu_boost_id(on_off, id)
 #define cpu_idle_mode(on_off)
 #define get_cpu_boost_counter()
 #define get_cpu_boost_tracker()
 #endif
 
+#ifdef CPU_BOOST_LOGGING
+#define cpu_boost(on_off) cpu_boost_(on_off,__FILE__,  __LINE__)
+#endif
+
 #define BAUDRATE 9600
 
 #ifndef NULL
diff --git a/firmware/system.c b/firmware/system.c
index c9ce086..49f01df 100644
--- a/firmware/system.c
+++ b/firmware/system.c
@@ -39,9 +39,55 @@
 {
     return boost_counter;
 }
-
+#ifdef CPU_BOOST_LOGGING
+#define MAX_BOOST_LOG 64
+static char cpu_boost_calls[MAX_BOOST_LOG][MAX_PATH];
+static int cpu_boost_first = 0;
+static int cpu_boost_calls_count = 0;
+static int cpu_boost_track_message = 0;
+int cpu_boost_log_getcount(void)
+{
+    return cpu_boost_calls_count;
+}
+char * cpu_boost_log_getlog_first(void)
+{
+    if (cpu_boost_calls_count)
+    {
+        cpu_boost_track_message = 1;
+        return cpu_boost_calls[cpu_boost_first];
+    }
+    else return NULL;
+}
+char * cpu_boost_log_getlog_next(void)
+{
+    int message = (cpu_boost_track_message+cpu_boost_first)%MAX_BOOST_LOG;
+    if (cpu_boost_track_message < cpu_boost_calls_count)
+    {
+        cpu_boost_track_message++;
+        return cpu_boost_calls[message];
+    }
+    else return NULL;
+}
+void cpu_boost_(bool on_off, char* location, int line)
+{
+    if (cpu_boost_calls_count == MAX_BOOST_LOG)
+    {
+        cpu_boost_first = (cpu_boost_first+1)%MAX_BOOST_LOG;
+        cpu_boost_calls_count--;
+        if (cpu_boost_calls_count < 0)
+            cpu_boost_calls_count = 0;
+    }
+    if (cpu_boost_calls_count < MAX_BOOST_LOG)
+    {
+        int message = (cpu_boost_first+cpu_boost_calls_count)%MAX_BOOST_LOG;
+        snprintf(cpu_boost_calls[message], MAX_PATH,
+                    "%c %s:%d",on_off==true?'B':'U',location,line);
+        cpu_boost_calls_count++;
+    }
+#else
 void cpu_boost(bool on_off)
 {
+#endif
     if(on_off)
     {
         /* Boost the frequency if not already boosted */