aboutsummaryrefslogtreecommitdiff
path: root/example-fsm-55
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2014-08-04 11:25:53 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2014-12-10 18:50:10 +0900
commitf4f2afd0ad7e1162b4161a61b15e12eb55e969b7 (patch)
tree89eda58efd361ca81c50848ec9930f669caf8fab /example-fsm-55
parentdffcf2d4bf9bf3e78a85fde704659be2b8384d40 (diff)
Use SIZE55.
Diffstat (limited to 'example-fsm-55')
-rw-r--r--example-fsm-55/hacker-emblem.c11
-rw-r--r--example-fsm-55/hacker-emblem.c~216
2 files changed, 222 insertions, 5 deletions
diff --git a/example-fsm-55/hacker-emblem.c b/example-fsm-55/hacker-emblem.c
index ddf83db..0f6ccd9 100644
--- a/example-fsm-55/hacker-emblem.c
+++ b/example-fsm-55/hacker-emblem.c
@@ -114,8 +114,9 @@ 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)
+#define SIZE55(img) (sizeof (img) / sizeof (uint32_t))
-static uint32_t l55[20] = {
+static uint32_t l55[] = {
DATA55 (0x08, 0x04, 0x1c, 0x00, 0x00),
DATA55 (0x00, 0x14, 0x0c, 0x08, 0x00),
DATA55 (0x00, 0x04, 0x14, 0x0c, 0x00),
@@ -138,7 +139,7 @@ static uint32_t l55[20] = {
DATA55 (0x10, 0x0c, 0x18, 0x00, 0x00),
};
-static uint32_t gnu[30] = {
+static uint32_t gnu[] = {
DATA55 (0x00, 0x00, 0x00, 0x00, 0x00),
DATA55 (0x00, 0x01, 0x01, 0x01, 0x00),
DATA55 (0x01, 0x02, 0x02, 0x02, 0x01),
@@ -192,10 +193,10 @@ main (int argc, const char *argv[])
while (1)
{
- int i;
+ unsigned int i;
if (state)
- for (i = 0; i < 20; i++)
+ for (i = 0; i < SIZE55 (l55); i++)
{
if (user_button ())
state = 0;
@@ -203,7 +204,7 @@ main (int argc, const char *argv[])
wait_for (500*1000);
}
else
- for (i = 0; i < 30; i++)
+ for (i = 0; i < SIZE55 (gnu); i++)
{
if (user_button ())
state = 1;
diff --git a/example-fsm-55/hacker-emblem.c~ b/example-fsm-55/hacker-emblem.c~
new file mode 100644
index 0000000..ddf83db
--- /dev/null
+++ b/example-fsm-55/hacker-emblem.c~
@@ -0,0 +1,216 @@
+#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;
+}