diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2014-08-04 13:38:42 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2014-12-10 18:50:10 +0900 |
commit | aeb8bd5a95051d081edc2423207319f718ae0691 (patch) | |
tree | e6ae2b0e9b3a0846d2614e54e5441a208b656c47 /example-fsm-55 | |
parent | 447b11fd1c1311a6c2619bc57b8b4b334c52fa4d (diff) |
l55 and hh only.
Diffstat (limited to 'example-fsm-55')
-rw-r--r-- | example-fsm-55/Makefile | 2 | ||||
-rw-r--r-- | example-fsm-55/hacker-emblem.c | 124 | ||||
-rw-r--r-- | example-fsm-55/hacker-emblem.c~ | 216 | ||||
-rw-r--r-- | example-fsm-55/hh.txt | 92 |
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 |