From aeb8bd5a95051d081edc2423207319f718ae0691 Mon Sep 17 00:00:00 2001
From: NIIBE Yutaka <gniibe@fsij.org>
Date: Mon, 4 Aug 2014 13:38:42 +0900
Subject: l55 and hh only.

---
 example-fsm-55/Makefile         |   2 +-
 example-fsm-55/hacker-emblem.c  | 124 +++++++++++++----------
 example-fsm-55/hacker-emblem.c~ | 216 ----------------------------------------
 example-fsm-55/hh.txt           |  92 ++++++++---------
 4 files changed, 120 insertions(+), 314 deletions(-)
 delete mode 100644 example-fsm-55/hacker-emblem.c~

(limited to 'example-fsm-55')

diff --git a/example-fsm-55/Makefile b/example-fsm-55/Makefile
index 168d50e..755639c 100644
--- a/example-fsm-55/Makefile
+++ b/example-fsm-55/Makefile
@@ -14,7 +14,7 @@ OBJCOPY   = $(CROSS)objcopy
 
 MCU   = cortex-m0 # -save-temps
 CWARN = -Wall -Wextra -Wstrict-prototypes
-DEFS  = -DHAVE_SYS_H -DFREE_STANDING -DMHZ=48
+DEFS  = -DHAVE_SYS_H -DFREE_STANDING -DMHZ=48 -DUSE_WFI_FOR_IDLE
 OPT   = -O3 -Os -g
 LIBS  =
 
diff --git a/example-fsm-55/hacker-emblem.c b/example-fsm-55/hacker-emblem.c
index b209ff9..bc9594e 100644
--- a/example-fsm-55/hacker-emblem.c
+++ b/example-fsm-55/hacker-emblem.c
@@ -149,39 +149,6 @@ static uint32_t l55[] = {
   DATA55 (0x10, 0x0c, 0x18, 0x00, 0x00),
 };
 
-static uint32_t gnu[] = {
-  DATA55 (0x00,	0x00, 0x00, 0x00, 0x00),
-  DATA55 (0x00,	0x01, 0x01, 0x01, 0x00),
-  DATA55 (0x01,	0x02, 0x02, 0x02, 0x01),
-  DATA55 (0x03,	0x04, 0x04, 0x04, 0x03),
-  DATA55 (0x07,	0x08, 0x09, 0x08, 0x07),
-  DATA55 (0x0e,	0x10, 0x13, 0x11, 0x0e),
-  DATA55 (0x1c,	0x00, 0x06, 0x02, 0x1c),
-  DATA55 (0x19,	0x01, 0x0d, 0x05, 0x19),
-  DATA55 (0x12,	0x03, 0x1a, 0x0a, 0x12),
-  DATA55 (0x04,	0x06, 0x15, 0x14, 0x04),
-  DATA55 (0x08,	0x0c, 0x0a, 0x09, 0x08),
-  DATA55 (0x11,	0x19, 0x15, 0x13, 0x11),
-  DATA55 (0x02,	0x12, 0x0a, 0x06, 0x02),
-  DATA55 (0x05,	0x05, 0x15, 0x0d, 0x04),
-  DATA55 (0x0a,	0x0a, 0x0a, 0x1a, 0x09),
-  DATA55 (0x14,	0x14, 0x14, 0x14, 0x13),
-  DATA55 (0x08,	0x08, 0x08, 0x08, 0x07),
-  DATA55 (0x11,	0x11, 0x11, 0x11, 0x0e),
-  DATA55 (0x02,	0x02, 0x02, 0x02, 0x1c),
-  DATA55 (0x04,	0x04, 0x04, 0x04, 0x18),
-  DATA55 (0x08,	0x08, 0x08, 0x08, 0x10),
-  DATA55 (0x11,	0x11, 0x11, 0x10, 0x01),
-  DATA55 (0x03,	0x03, 0x03, 0x00, 0x02),
-  DATA55 (0x06,	0x06, 0x06, 0x00, 0x04),
-  DATA55 (0x0c,	0x0c, 0x0c, 0x00, 0x08),
-  DATA55 (0x18,	0x18, 0x18, 0x00, 0x10),
-  DATA55 (0x10,	0x10, 0x10, 0x00, 0x00),
-  DATA55 (0x00,	0x00, 0x00, 0x00, 0x00),
-  DATA55 (0x00,	0x00, 0x00, 0x00, 0x00),
-  DATA55 (0x00,	0x00, 0x00, 0x00, 0x00),
-};
-
 #define DATA55V(x0,x1,x2,x3,x4) (x0<<0)|(x1<<5)|(x2<<10)|(x3<< 15)|(x4<< 20)
 
 #define CHAR_SPC 0
@@ -205,16 +172,16 @@ static uint8_t hh[] = {
 };
 
 struct { uint8_t width; uint32_t data; } chargen[] = {
-  { 5, 0 },						/* SPACE */
-  { 5, DATA55V (0x1f, 0x04, 0x04, 0x04, 0x1f) },	/* H */
-  { 5, DATA55V (0x07, 0x0a, 0x12, 0x0a, 0x07) },	/* A */
-  { 5, DATA55V (0x1f, 0x14, 0x14, 0x14, 0x18) },	/* P */
-  { 5, DATA55V (0x18, 0x04, 0x07, 0x04, 0x18) },	/* Y */
-  { 5, DATA55V (0x0e, 0x11, 0x11, 0x11, 0x02) },	/* C */
-  { 5, DATA55V (0x1f, 0x04, 0x0c, 0x12, 0x01) },	/* K */
+  { 3, 0 },						/* SPACE */
+  { 4, DATA55V (0x1f, 0x04, 0x04, 0x1f, 0x00) },	/* H */
+  { 4, DATA55V (0x02, 0x15, 0x15, 0x0f, 0x00) },	/* A */
+  { 4, DATA55V (0x1f, 0x14, 0x14, 0x08, 0x00) },	/* P */
+  { 4, DATA55V (0x19, 0x05, 0x05, 0x1e, 0x00) },	/* Y */
+  { 4, DATA55V (0x0e, 0x11, 0x11, 0x0a, 0x00) },	/* C */
+  { 4, DATA55V (0x1f, 0x04, 0x0c, 0x13, 0x00) },	/* K */
   { 3, DATA55V (0x11, 0x1f, 0x11, 0x00, 0x00) },	/* I */
-  { 5, DATA55V (0x1f, 0x08, 0x04, 0x02, 0x1f) },	/* N */
-  { 5, DATA55V (0x0e, 0x11, 0x11, 0x15, 0x06) },	/* G */
+  { 4, DATA55V (0x1f, 0x08, 0x06, 0x1f, 0x00) },	/* N */
+  { 4, DATA55V (0x0e, 0x11, 0x15, 0x07, 0x00) },	/* G */
   { 2, DATA55V (0x1d, 0x1c, 0x00, 0x00, 0x00) },	/* ! */
 };
 
@@ -244,9 +211,14 @@ happy_hacking (void)
 }
 
 
+#define REPEAT_COUNT 10
+
+static void setup_scr_sleepdeep (void);
+
 int
 main (int argc, const char *argv[])
 {
+  uint8_t count = 0;
   (void)argc;
   (void)argv;
 
@@ -264,6 +236,7 @@ main (int argc, const char *argv[])
   while (1)
     {
       unsigned int i;
+      uint8_t state_prev = state;
 
       if (state == 0)
 	for (i = 0; i < SIZE55 (l55); i++)
@@ -273,17 +246,66 @@ main (int argc, const char *argv[])
 	    set_led_display (l55[i]);
 	    wait_for (500*1000);
 	  }
-      else if (state == 1)
-	for (i = 0; i < SIZE55 (gnu); i++)
-	  {
-	    if (user_button ())
-	      state = 2;
-	    set_led_display (gnu[i]);
-	    wait_for (250*1000);
-	  }
-      else
+      if (state == 1)
 	happy_hacking ();
+
+      if (state_prev != state)
+	count = 0;
+      else
+	if (++count > REPEAT_COUNT)
+	  break;
     }
 
+  setup_scr_sleepdeep ();
+  for (;;)
+    asm volatile ("wfi" : : : "memory");
+
   return 0;
 }
+
+struct SCB
+{
+  volatile uint32_t CPUID;
+  volatile uint32_t ICSR;
+  volatile uint32_t VTOR;
+  volatile uint32_t AIRCR;
+  volatile uint32_t SCR;
+  volatile uint32_t CCR;
+  volatile uint8_t  SHP[12];
+  volatile uint32_t SHCSR;
+  volatile uint32_t CFSR;
+  volatile uint32_t HFSR;
+  volatile uint32_t DFSR;
+  volatile uint32_t MMFAR;
+  volatile uint32_t BFAR;
+  volatile uint32_t AFSR;
+  volatile uint32_t PFR[2];
+  volatile uint32_t DFR;
+  volatile uint32_t ADR;
+  volatile uint32_t MMFR[4];
+  volatile uint32_t ISAR[5];
+};
+
+#define SCS_BASE	(0xE000E000)
+#define SCB_BASE	(SCS_BASE +  0x0D00)
+static struct SCB *const SCB = ((struct SCB *const) SCB_BASE);
+
+#define SCB_SCR_SLEEPDEEP (1 << 2)
+
+struct PWR
+{
+  volatile uint32_t CR;
+  volatile uint32_t CSR;
+};
+#define PWR_CR_PDDS 0x0002
+#define PWR_CR_CWUF 0x0004
+
+#define PWR_BASE	(APBPERIPH_BASE + 0x00007000)
+#define PWR		((struct PWR *) PWR_BASE)
+
+static void setup_scr_sleepdeep (void)
+{
+  PWR->CR |= PWR_CR_CWUF;
+  PWR->CR |= PWR_CR_PDDS;
+  SCB->SCR |= SCB_SCR_SLEEPDEEP;
+}
diff --git a/example-fsm-55/hacker-emblem.c~ b/example-fsm-55/hacker-emblem.c~
deleted file mode 100644
index ddf83db..0000000
--- a/example-fsm-55/hacker-emblem.c~
+++ /dev/null
@@ -1,216 +0,0 @@
-#include <stdint.h>
-#include <stdlib.h>
-#include <chopstx.h>
-
-#include "board.h"
-
-#define PERIPH_BASE	0x40000000
-#define APBPERIPH_BASE   PERIPH_BASE
-#define APB2PERIPH_BASE	(PERIPH_BASE + 0x10000)
-#define AHBPERIPH_BASE	(PERIPH_BASE + 0x20000)
-#define AHB2PERIPH_BASE	(PERIPH_BASE + 0x08000000)
-
-struct GPIO {
-  volatile uint32_t MODER;
-  volatile uint16_t OTYPER;
-  uint16_t dummy0;
-  volatile uint32_t OSPEEDR;
-  volatile uint32_t PUPDR;
-  volatile uint16_t IDR;
-  uint16_t dummy1;
-  volatile uint16_t ODR;
-  uint16_t dummy2;
-  volatile uint16_t BSRR;
-  uint16_t dummy3;
-  volatile uint32_t LCKR;
-  volatile uint32_t AFR[2];
-  volatile uint16_t BRR;
-  uint16_t dummy4;
-};
-#define GPIOA_BASE	(AHB2PERIPH_BASE + 0x0000)
-#define GPIOA		((struct GPIO *) GPIOA_BASE)
-#define GPIOF_BASE	(AHB2PERIPH_BASE + 0x1400)
-#define GPIOF		((struct GPIO *) GPIOF_BASE)
-
-static struct GPIO *const GPIO_LED = ((struct GPIO *const) GPIO_LED_BASE);
-static struct GPIO *const GPIO_OTHER = ((struct GPIO *const) GPIO_OTHER_BASE);
-
-static chopstx_mutex_t mtx;
-static chopstx_cond_t cnd0;
-
-static uint8_t
-user_button (void)
-{
-  return (GPIO_OTHER->IDR & 1) == 0;
-}
-
-static uint8_t l_data[5];
-
-static void
-set_led_display (uint32_t data)
-{
-  l_data[0] = (data >>  0) & 0x1f;
-  l_data[1] = (data >>  5) & 0x1f;
-  l_data[2] = (data >> 10) & 0x1f;
-  l_data[3] = (data >> 15) & 0x1f;
-  l_data[4] = (data >> 20) & 0x1f;
-}
-
-
-static void
-wait_for (uint32_t usec)
-{
-  chopstx_usec_wait (usec);
-}
-
-static void
-led_prepare_row (uint8_t col)
-{
-  uint16_t data = 0x1f;
-
-  data |= ((l_data[0] & (1 << col)) ? 1 : 0) << 5;
-  data |= ((l_data[1] & (1 << col)) ? 1 : 0) << 6;
-  data |= ((l_data[2] & (1 << col)) ? 1 : 0) << 7;
-  data |= ((l_data[3] & (1 << col)) ? 1 : 0) << 9;
-  data |= ((l_data[4] & (1 << col)) ? 1 : 0) << 10;
-  GPIO_LED->ODR = data;
-}
-
-static void
-led_enable_column (uint8_t col)
-{
-  GPIO_LED->BRR = (1 << col);
-}
-
-static void *
-led (void *arg)
-{
-  (void)arg;
-
-  chopstx_mutex_lock (&mtx);
-  chopstx_cond_wait (&cnd0, &mtx);
-  chopstx_mutex_unlock (&mtx);
-
-  while (1)
-    {
-      int i;
-
-      for (i = 0; i < 5; i++)
-	{
-	  led_prepare_row (i);
-	  led_enable_column (i);
-	  wait_for (1000);
-	}
-    }
-
-  return NULL;
-}
-
-#define PRIO_LED 3
-
-extern uint8_t __process1_stack_base__, __process1_stack_size__;
-
-const uint32_t __stackaddr_led = (uint32_t)&__process1_stack_base__;
-const size_t __stacksize_led = (size_t)&__process1_stack_size__;
-
-#define DATA55(x0,x1,x2,x3,x4) (x0<<20)|(x1<<15)|(x2<<10)|(x3<< 5)|(x4<< 0)
-
-static uint32_t l55[20] = {
-  DATA55 (0x08, 0x04, 0x1c, 0x00, 0x00),
-  DATA55 (0x00, 0x14, 0x0c, 0x08, 0x00),
-  DATA55 (0x00, 0x04, 0x14, 0x0c, 0x00),
-  DATA55 (0x00, 0x08, 0x06, 0x0c, 0x00),
-  DATA55 (0x00, 0x04, 0x02, 0x0e, 0x00),
-  DATA55 (0x00, 0x00, 0x0a, 0x06, 0x04),
-  DATA55 (0x00, 0x00, 0x02, 0x0a, 0x06),
-  DATA55 (0x00, 0x00, 0x04, 0x03, 0x06),
-  DATA55 (0x00, 0x00, 0x02, 0x01, 0x07),
-  DATA55 (0x02, 0x00, 0x00, 0x05, 0x03),
-  DATA55 (0x03, 0x00, 0x00, 0x01, 0x05),
-  DATA55 (0x03, 0x00, 0x00, 0x02, 0x11),
-  DATA55 (0x13, 0x00, 0x00, 0x01, 0x10),
-  DATA55 (0x11, 0x01, 0x00, 0x00, 0x12),
-  DATA55 (0x12, 0x11, 0x00, 0x00, 0x10),
-  DATA55 (0x18, 0x11, 0x00, 0x00, 0x01),
-  DATA55 (0x08, 0x19, 0x00, 0x00, 0x10),
-  DATA55 (0x09, 0x18, 0x10, 0x00, 0x00),
-  DATA55 (0x08, 0x09, 0x18, 0x00, 0x00),
-  DATA55 (0x10, 0x0c, 0x18, 0x00, 0x00),
-};
-
-static uint32_t gnu[30] = {
-  DATA55 (0x00,	0x00, 0x00, 0x00, 0x00),
-  DATA55 (0x00,	0x01, 0x01, 0x01, 0x00),
-  DATA55 (0x01,	0x02, 0x02, 0x02, 0x01),
-  DATA55 (0x03,	0x04, 0x04, 0x04, 0x03),
-  DATA55 (0x07,	0x08, 0x09, 0x08, 0x07),
-  DATA55 (0x0e,	0x10, 0x13, 0x11, 0x0e),
-  DATA55 (0x1c,	0x00, 0x06, 0x02, 0x1c),
-  DATA55 (0x19,	0x01, 0x0d, 0x05, 0x19),
-  DATA55 (0x12,	0x03, 0x1a, 0x0a, 0x12),
-  DATA55 (0x04,	0x06, 0x15, 0x14, 0x04),
-  DATA55 (0x08,	0x0c, 0x0a, 0x09, 0x08),
-  DATA55 (0x11,	0x19, 0x15, 0x13, 0x11),
-  DATA55 (0x02,	0x12, 0x0a, 0x06, 0x02),
-  DATA55 (0x05,	0x05, 0x15, 0x0d, 0x04),
-  DATA55 (0x0a,	0x0a, 0x0a, 0x1a, 0x09),
-  DATA55 (0x14,	0x14, 0x14, 0x14, 0x13),
-  DATA55 (0x08,	0x08, 0x08, 0x08, 0x07),
-  DATA55 (0x11,	0x11, 0x11, 0x11, 0x0e),
-  DATA55 (0x02,	0x02, 0x02, 0x02, 0x1c),
-  DATA55 (0x04,	0x04, 0x04, 0x04, 0x18),
-  DATA55 (0x08,	0x08, 0x08, 0x08, 0x10),
-  DATA55 (0x11,	0x11, 0x11, 0x10, 0x01),
-  DATA55 (0x03,	0x03, 0x03, 0x00, 0x02),
-  DATA55 (0x06,	0x06, 0x06, 0x00, 0x04),
-  DATA55 (0x0c,	0x0c, 0x0c, 0x00, 0x08),
-  DATA55 (0x18,	0x18, 0x18, 0x00, 0x10),
-  DATA55 (0x10,	0x10, 0x10, 0x00, 0x00),
-  DATA55 (0x00,	0x00, 0x00, 0x00, 0x00),
-  DATA55 (0x00,	0x00, 0x00, 0x00, 0x00),
-  DATA55 (0x00,	0x00, 0x00, 0x00, 0x00),
-};
-
-int
-main (int argc, const char *argv[])
-{
-  uint8_t state = 0;
-
-  (void)argc;
-  (void)argv;
-
-  chopstx_mutex_init (&mtx);
-  chopstx_cond_init (&cnd0);
-
-  chopstx_create (PRIO_LED, __stackaddr_led, __stacksize_led, led, NULL);
-
-  chopstx_usec_wait (200*1000);
-
-  chopstx_mutex_lock (&mtx);
-  chopstx_cond_signal (&cnd0);
-  chopstx_mutex_unlock (&mtx);
-
-  while (1)
-    {
-      int i;
-
-      if (state)
-	for (i = 0; i < 20; i++)
-	  {
-	    if (user_button ())
-	      state = 0;
-	    set_led_display (l55[i]);
-	    wait_for (500*1000);
-	  }
-      else
-	for (i = 0; i < 30; i++)
-	  {
-	    if (user_button ())
-	      state = 1;
-	    set_led_display (gnu[i]);
-	    wait_for (200*1000);
-	  }
-    }
-
-  return 0;
-}
diff --git a/example-fsm-55/hh.txt b/example-fsm-55/hh.txt
index 49493a5..c9c60fc 100644
--- a/example-fsm-55/hh.txt
+++ b/example-fsm-55/hh.txt
@@ -1,38 +1,38 @@
-o...o
-o...o
-ooooo
-o...o
-o...o
-
-..o.
-.o.o.
-o...o
-ooooo
-o...o
-
-ooooo
-o...o
-oooo.
-o....
-o....
-
-o...o
-o...o
-.ooo.
-..o..
-..o..
-
-.ooo.
-o....
-o....
-o...o
-.ooo.
-
-o..o.
-o.o..
-ooo..
-o..o.
-o...o
+o..o
+o..o
+oooo
+o..o
+o..o
+
+.oo.
+...o
+.ooo
+o..o
+.ooo
+
+ooo.
+o..o
+ooo.
+o...
+o...
+
+o..o
+o..o
+.ooo
+...o
+ooo.
+
+.oo.
+o..o
+o...
+o..o
+.oo.
+
+o..o
+o.o.
+ooo.
+o..o
+o..o
 
 ooo
 .o.
@@ -40,17 +40,17 @@ ooo
 .o.
 ooo
 
-o...o
-oo..o
-o.o.o
-o..oo
-o...o
-
-.ooo.
-o....
-o..oo
-o...o
-.ooo.
+o..o
+oo.o
+o.oo
+o.oo
+o..o
+
+.oo.
+o...
+o.oo
+o..o
+.ooo
 
 oo
 oo
-- 
cgit v1.2.3