<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/20298">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Menu App to select highram images from phone's flash memory<br><br>Change-Id: Ibbdb0093d8f502dcd57ea92b53e7e56b09ee9e5f<br>---<br>M src/target/firmware/Makefile<br>A src/target/firmware/apps/menu/main.c<br>2 files changed, 339 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/firmware/Makefile b/src/target/firmware/Makefile</span><br><span>index f7235ac..28a6418 100644</span><br><span>--- a/src/target/firmware/Makefile</span><br><span>+++ b/src/target/firmware/Makefile</span><br><span>@@ -96,11 +96,12 @@</span><br><span> #</span><br><span> </span><br><span> # List of all applications (meant to be overridden on command line)</span><br><span style="color: hsl(0, 100%, 40%);">-APPLICATIONS?=hello_world compal_dsp_dump layer1 loader rssi</span><br><span style="color: hsl(120, 100%, 40%);">+APPLICATIONS?=hello_world compal_dsp_dump layer1 loader rssi menu</span><br><span> </span><br><span> # Applications specific env requirements</span><br><span> APP_loader_ENVIRONMENTS=compalram highram</span><br><span> APP_rssi_ENVIRONMENTS=* -compalram</span><br><span style="color: hsl(120, 100%, 40%);">+APP_menu_ENVIRONMENTS=* -highram</span><br><span> </span><br><span> # Various objects that are currently linked into all applications</span><br><span> FLASH_OBJS=flash/cfi_flash.o</span><br><span>diff --git a/src/target/firmware/apps/menu/main.c b/src/target/firmware/apps/menu/main.c</span><br><span>new file mode 100644</span><br><span>index 0000000..fa36968</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/firmware/apps/menu/main.c</span><br><span>@@ -0,0 +1,337 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Menu for Calypso Phone to load applicatios from flash */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2013 by Andreas Eversberg <jolly@eversberg.eu></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <memory.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <delay.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <byteorder.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rffe.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <keypad.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <board.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <abb/twl3025.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <rf/trf6151.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/clock.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/tpu.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/tsp.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/dsp.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/irq.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/misc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <calypso/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <comm/sercomm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <comm/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <uart.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <fb/framebuffer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <battery/battery.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <asm/system.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define RAM 0x00820000</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAGIC 0x0083ff00</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static enum key_codes key_code = KEY_INV;</span><br><span style="color: hsl(120, 100%, 40%);">+static volatile enum key_states key_state;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int cursor = 0, scroll_apps = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct apps {</span><br><span style="color: hsl(120, 100%, 40%);">+       char name[16];</span><br><span style="color: hsl(120, 100%, 40%);">+        void *start;</span><br><span style="color: hsl(120, 100%, 40%);">+  int len;</span><br><span style="color: hsl(120, 100%, 40%);">+} apps[32];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void locate_apps(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int i, j, k;</span><br><span style="color: hsl(120, 100%, 40%);">+  char *p;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    memset(apps, 0, sizeof(apps));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (j = 0, i = 0x010000; i < 0x200000; i += 0x10000) {</span><br><span style="color: hsl(120, 100%, 40%);">+            p = (char *)i;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* check for highram header: "highram:" */</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!!memcmp(p, "highram:", 8))</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             p += 8;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* check for app name after header: "highram:<name>\n" */</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("found highram image at flash mem address 0x%p\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   (char *)i);</span><br><span style="color: hsl(120, 100%, 40%);">+           for (k = 0; k < (int)sizeof(apps[j].name) - 1; k++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (p[k] == '\n')</span><br><span style="color: hsl(120, 100%, 40%);">+                             break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (k == sizeof(apps[j].name) - 3) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf("skipping: corrupt highram header, no '\\n' "</span><br><span style="color: hsl(120, 100%, 40%);">+                                "after image name or name more larger than %d "</span><br><span style="color: hsl(120, 100%, 40%);">+                             "digits\n", (int)sizeof(apps[j].name) - 3);</span><br><span style="color: hsl(120, 100%, 40%);">+                         continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (j < 9)</span><br><span style="color: hsl(120, 100%, 40%);">+                 apps[j].name[0] = '1' + j;</span><br><span style="color: hsl(120, 100%, 40%);">+            else if (j == 9)</span><br><span style="color: hsl(120, 100%, 40%);">+                      apps[j].name[0] = '0';</span><br><span style="color: hsl(120, 100%, 40%);">+                else</span><br><span style="color: hsl(120, 100%, 40%);">+                  apps[j].name[0] = ' ';</span><br><span style="color: hsl(120, 100%, 40%);">+                apps[j].name[1] = ' ';</span><br><span style="color: hsl(120, 100%, 40%);">+                memcpy(apps[j].name + 2, p, k);</span><br><span style="color: hsl(120, 100%, 40%);">+               apps[j].len = 0x20000;</span><br><span style="color: hsl(120, 100%, 40%);">+                p += k + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           /* p points to highram image after header */</span><br><span style="color: hsl(120, 100%, 40%);">+          apps[j].start = p;</span><br><span style="color: hsl(120, 100%, 40%);">+            j++;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void wait_key_release(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* wait for key release */</span><br><span style="color: hsl(120, 100%, 40%);">+    while (key_state == PRESSED) {</span><br><span style="color: hsl(120, 100%, 40%);">+                delay_ms(10);</span><br><span style="color: hsl(120, 100%, 40%);">+         keypad_poll();</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void load_app(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ static int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ static void (*f) (void) = (void (*)(void))RAM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      wait_key_release();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ local_irq_disable();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < apps[cursor].len; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+             ((unsigned char *)RAM)[i] = ((unsigned char *)apps[cursor].start)[i];</span><br><span style="color: hsl(120, 100%, 40%);">+ f();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* UI */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void refresh_display(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span style="color: hsl(120, 100%, 40%);">+    char text[16];</span><br><span style="color: hsl(120, 100%, 40%);">+        int bat = battery_info.battery_percent;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+       int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      fb_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* header */</span><br><span style="color: hsl(120, 100%, 40%);">+  fb_setbg(FB_COLOR_WHITE);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+              fb_setfg(FB_COLOR_BLUE);</span><br><span style="color: hsl(120, 100%, 40%);">+              fb_setfont(FB_FONT_HELVR08);</span><br><span style="color: hsl(120, 100%, 40%);">+          fb_gotoxy(0, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+              fb_putstr("Osmocom Menu", -1);</span><br><span style="color: hsl(120, 100%, 40%);">+              fb_setfg(FB_COLOR_RGB(0xc0, 0xc0, 0x00));</span><br><span style="color: hsl(120, 100%, 40%);">+             fb_setfont(FB_FONT_SYMBOLS);</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span style="color: hsl(120, 100%, 40%);">+           fb_gotoxy(framebuffer->width - 15, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (bat >= 100 && (battery_info.flags & BATTERY_CHG_ENABLED)</span><br><span style="color: hsl(120, 100%, 40%);">+            && !(battery_info.flags & BATTERY_CHARGING))</span><br><span style="color: hsl(120, 100%, 40%);">+                     fb_putstr("@HHBC", framebuffer->width);</span><br><span style="color: hsl(120, 100%, 40%);">+          else {</span><br><span style="color: hsl(120, 100%, 40%);">+                        sprintf(text, "@%c%c%cC", (bat >= 30) ? 'B':'A',</span><br><span style="color: hsl(120, 100%, 40%);">+                         (bat >= 60) ? 'B':'A', (bat >= 90) ? 'B':'A');</span><br><span style="color: hsl(120, 100%, 40%);">+                  fb_putstr(text, framebuffer->width);</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+             fb_gotoxy(0, 8);</span><br><span style="color: hsl(120, 100%, 40%);">+              fb_putstr("GGEGG", framebuffer->width);</span><br><span style="color: hsl(120, 100%, 40%);">+          fb_setfg(FB_COLOR_GREEN);</span><br><span style="color: hsl(120, 100%, 40%);">+             fb_gotoxy(0, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+             fb_boxto(framebuffer->width - 1, 10);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setfg(FB_COLOR_BLACK);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setfont(FB_FONT_C64);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = 0; i < 5; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (!apps[scroll_apps + i].name)</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                if (scroll_apps + i == cursor) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      fb_setfg(FB_COLOR_WHITE);</span><br><span style="color: hsl(120, 100%, 40%);">+                     fb_setbg(FB_COLOR_BLUE);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+             fb_gotoxy(0, 20 + i * 10);</span><br><span style="color: hsl(120, 100%, 40%);">+            fb_putstr(apps[scroll_apps + i].name,</span><br><span style="color: hsl(120, 100%, 40%);">+                 framebuffer->width);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (scroll_apps + i == cursor) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      fb_setfg(FB_COLOR_BLACK);</span><br><span style="color: hsl(120, 100%, 40%);">+                     fb_setbg(FB_COLOR_WHITE);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (i == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         fb_gotoxy(0, 50);</span><br><span style="color: hsl(120, 100%, 40%);">+             fb_putstr("No apps!", -1);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fb_flush();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void handle_key_code()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    if (key_code == KEY_INV)</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (key_code) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case KEY_1:</span><br><span style="color: hsl(120, 100%, 40%);">+   case KEY_2:</span><br><span style="color: hsl(120, 100%, 40%);">+   case KEY_3:</span><br><span style="color: hsl(120, 100%, 40%);">+   case KEY_4:</span><br><span style="color: hsl(120, 100%, 40%);">+   case KEY_5:</span><br><span style="color: hsl(120, 100%, 40%);">+   case KEY_6:</span><br><span style="color: hsl(120, 100%, 40%);">+   case KEY_7:</span><br><span style="color: hsl(120, 100%, 40%);">+   case KEY_8:</span><br><span style="color: hsl(120, 100%, 40%);">+   case KEY_9:</span><br><span style="color: hsl(120, 100%, 40%);">+           if (apps[key_code - KEY_1].len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     cursor = key_code - KEY_1;</span><br><span style="color: hsl(120, 100%, 40%);">+                    load_app();</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_0:</span><br><span style="color: hsl(120, 100%, 40%);">+           if (apps[9].len) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    cursor = 9;</span><br><span style="color: hsl(120, 100%, 40%);">+                   load_app();</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_UP:</span><br><span style="color: hsl(120, 100%, 40%);">+          if (cursor == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                      return;</span><br><span style="color: hsl(120, 100%, 40%);">+               cursor--;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (cursor < scroll_apps)</span><br><span style="color: hsl(120, 100%, 40%);">+                  scroll_apps = cursor;</span><br><span style="color: hsl(120, 100%, 40%);">+         refresh_display();</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_DOWN:</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!apps[cursor + 1].name[0])</span><br><span style="color: hsl(120, 100%, 40%);">+                        return;</span><br><span style="color: hsl(120, 100%, 40%);">+               cursor++;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (cursor >= scroll_apps + 5)</span><br><span style="color: hsl(120, 100%, 40%);">+                     scroll_apps = cursor - 4;</span><br><span style="color: hsl(120, 100%, 40%);">+             refresh_display();</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_OK:</span><br><span style="color: hsl(120, 100%, 40%);">+          if (apps[cursor].len)</span><br><span style="color: hsl(120, 100%, 40%);">+                 load_app();</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case KEY_POWER:</span><br><span style="color: hsl(120, 100%, 40%);">+               wait_key_release();</span><br><span style="color: hsl(120, 100%, 40%);">+           twl3025_power_off();</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   key_code = KEY_INV;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Main Program */</span><br><span style="color: hsl(120, 100%, 40%);">+const char *hr = "======================================================================\n";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void key_handler(enum key_codes code, enum key_states state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        key_state = state;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (state != PRESSED)</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     key_code = code;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern void putchar_asm(uint32_t c);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const uint8_t phone_ack[] = { 0x1b, 0xf6, 0x02, 0x00, 0x41, 0x03, 0x42 };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int main(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Simulate a compal loader saying "ACK" */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < (int)sizeof(phone_ack); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             putchar_asm(phone_ack[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   board_init(0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      puts("\n\nOsmocomBB Menu (revision " GIT_REVISION ")\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ puts(hr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   fb_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ fb_setfg(FB_COLOR_BLACK);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setbg(FB_COLOR_WHITE);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setfont(FB_FONT_HELVB14);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        fb_gotoxy(2,20);</span><br><span style="color: hsl(120, 100%, 40%);">+      fb_putstr("menu",framebuffer->width-4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        fb_setfg(FB_COLOR_RED);</span><br><span style="color: hsl(120, 100%, 40%);">+       fb_setbg(FB_COLOR_BLUE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    fb_gotoxy(2,25);</span><br><span style="color: hsl(120, 100%, 40%);">+      fb_boxto(framebuffer->width-3,38);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       fb_setfg(FB_COLOR_WHITE);</span><br><span style="color: hsl(120, 100%, 40%);">+     fb_setfont(FB_FONT_HELVR08);</span><br><span style="color: hsl(120, 100%, 40%);">+  fb_gotoxy(8,33);</span><br><span style="color: hsl(120, 100%, 40%);">+      fb_putstr("osmocom-bb",framebuffer->width-4);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  fb_flush();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Dump device identification */</span><br><span style="color: hsl(120, 100%, 40%);">+      dump_dev_id();</span><br><span style="color: hsl(120, 100%, 40%);">+        puts(hr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Dump clock config before PLL set */</span><br><span style="color: hsl(120, 100%, 40%);">+        calypso_clk_dump();</span><br><span style="color: hsl(120, 100%, 40%);">+   puts(hr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   keypad_set_handler(&key_handler);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Dump clock config after PLL set */</span><br><span style="color: hsl(120, 100%, 40%);">+ calypso_clk_dump();</span><br><span style="color: hsl(120, 100%, 40%);">+   puts(hr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+// display_unset_attr(DISP_ATTR_INVERT);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       locate_apps();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           for (i = 0; i < 50; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 keypad_poll();</span><br><span style="color: hsl(120, 100%, 40%);">+                        delay_ms(10);</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_timers_update();</span><br><span style="color: hsl(120, 100%, 40%);">+                 handle_key_code();</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             refresh_display();</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* NOT REACHED */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   twl3025_power_off();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/20298">change 20298</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmocom-bb/+/20298"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ibbdb0093d8f502dcd57ea92b53e7e56b09ee9e5f </div>
<div style="display:none"> Gerrit-Change-Number: 20298 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>