aboutsummaryrefslogtreecommitdiff
path: root/example-fsm-55
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2014-08-04 13:38:42 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2014-12-10 18:50:10 +0900
commitaeb8bd5a95051d081edc2423207319f718ae0691 (patch)
treee6ae2b0e9b3a0846d2614e54e5441a208b656c47 /example-fsm-55
parent447b11fd1c1311a6c2619bc57b8b4b334c52fa4d (diff)
l55 and hh only.
Diffstat (limited to 'example-fsm-55')
-rw-r--r--example-fsm-55/Makefile2
-rw-r--r--example-fsm-55/hacker-emblem.c124
-rw-r--r--example-fsm-55/hacker-emblem.c~216
-rw-r--r--example-fsm-55/hh.txt92
4 files changed, 120 insertions, 314 deletions
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