aboutsummaryrefslogtreecommitdiff
path: root/example-fsm-55/hacker-emblem.c
diff options
context:
space:
mode:
Diffstat (limited to 'example-fsm-55/hacker-emblem.c')
l---------[-rw-r--r--]example-fsm-55/hacker-emblem.c456
1 files changed, 1 insertions, 455 deletions
diff --git a/example-fsm-55/hacker-emblem.c b/example-fsm-55/hacker-emblem.c
index b8e7409..d2bfd5f 100644..120000
--- a/example-fsm-55/hacker-emblem.c
+++ b/example-fsm-55/hacker-emblem.c
@@ -1,455 +1 @@
-#include <stdint.h>
-#include <stdlib.h>
-#include <chopstx.h>
-
-#include "board.h"
-
-static uint8_t main_finished;
-
-#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, cnd1;
-
-#define BUTTON_PUSHED 1
-static uint8_t button_state;
-
-static uint8_t
-user_button (void)
-{
- return button_state;
-}
-
-
-static uint8_t l_data[5];
-#define LED_FULL ((0x1f << 20)|(0x1f << 15)|(0x1f << 10)|(0x1f << 5)|0x1f)
-
-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
-scroll_led_display (uint8_t row)
-{
- l_data[0] = (l_data[0] << 1) | ((row >> 0) & 1);
- l_data[1] = (l_data[1] << 1) | ((row >> 1) & 1);
- l_data[2] = (l_data[2] << 1) | ((row >> 2) & 1);
- l_data[3] = (l_data[3] << 1) | ((row >> 3) & 1);
- l_data[4] = (l_data[4] << 1) | ((row >> 4) & 1);
-}
-
-
-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 (!main_finished)
- {
- int i;
-
- for (i = 0; i < 5; i++)
- {
- led_prepare_row (i);
- led_enable_column (i);
- wait_for (1000);
- }
- }
-
- GPIO_LED->ODR = 0x0000; /* Off all LEDs. */
- GPIO_LED->OSPEEDR = 0;
- GPIO_LED->OTYPER = 0;
- GPIO_LED->MODER = 0; /* Input mode. */
- GPIO_OTHER->PUPDR = 0x0000; /* No pull-up. */
-
- return NULL;
-}
-
-
-static uint8_t get_button_sw (void) { return (GPIO_OTHER->IDR & 1) == 0; }
-
-static void *
-button (void *arg)
-{
- uint8_t last_button = 0;
-
- (void)arg;
-
- chopstx_mutex_lock (&mtx);
- chopstx_cond_wait (&cnd1, &mtx);
- chopstx_mutex_unlock (&mtx);
-
- while (!main_finished)
- {
- uint8_t button = get_button_sw ();
-
- if (last_button == button && button != button_state)
- {
- wait_for (1000);
- button = get_button_sw ();
- if (last_button == button)
- button_state = button;
- }
-
- wait_for (2000);
- last_button = button;
- }
-
- return NULL;
-}
-
-#define PRIO_LED 3
-#define PRIO_BUTTON 2
-
-extern uint8_t __process1_stack_base__, __process1_stack_size__;
-extern uint8_t __process2_stack_base__, __process2_stack_size__;
-
-const uint32_t __stackaddr_led = (uint32_t)&__process1_stack_base__;
-const size_t __stacksize_led = (size_t)&__process1_stack_size__;
-
-const uint32_t __stackaddr_button = (uint32_t)&__process2_stack_base__;
-const size_t __stacksize_button = (size_t)&__process2_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[] = {
- 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),
-};
-
-#define DATA55V(x0,x1,x2,x3,x4) (x0<<0)|(x1<<5)|(x2<<10)|(x3<< 15)|(x4<< 20)
-
-#define CHAR_SPC 0
-#define CHAR_H 1
-#define CHAR_A 2
-#define CHAR_P 3
-#define CHAR_Y 4
-#define CHAR_C 5
-#define CHAR_K 6
-#define CHAR_I 7
-#define CHAR_N 8
-#define CHAR_G 9
-#define CHAR_EXC 10
-#define CHAR_W 11
-#define CHAR_h 12
-#define CHAR_t 13
-#define CHAR_AP 14
-#define CHAR_s 15
-#define CHAR_U 16
-#define CHAR_QT 17
-#define CHAR_o 18
-#define CHAR_X 19
-
-static uint8_t hh[] = {
- CHAR_H, CHAR_A, CHAR_P, CHAR_P, CHAR_Y,
- CHAR_SPC,
- CHAR_H, CHAR_A, CHAR_C, CHAR_K, CHAR_I, CHAR_N, CHAR_G,
- CHAR_EXC,
- CHAR_SPC, CHAR_SPC, CHAR_SPC,
-};
-
-static uint8_t gnu[] = {
- CHAR_W, CHAR_h, CHAR_A, CHAR_t, CHAR_AP, CHAR_s, CHAR_SPC,
- CHAR_G, CHAR_N, CHAR_U, CHAR_QT,
- CHAR_SPC, CHAR_SPC,
- CHAR_G, CHAR_N, CHAR_U, CHAR_AP, CHAR_s, CHAR_SPC,
- CHAR_N, CHAR_o, CHAR_t, CHAR_SPC,
- CHAR_U, CHAR_N, CHAR_I, CHAR_X,
- CHAR_EXC,
- CHAR_SPC, CHAR_SPC,
-};
-
-struct { uint8_t width; uint32_t data; } chargen[] = {
- { 3, 0 }, /* SPACE */
- { 4, DATA55V (0x1f, 0x04, 0x04, 0x1f, 0x00) }, /* H */
- { 3, DATA55V (0x17, 0x15, 0x0f, 0x00, 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 */
- { 4, DATA55V (0x1f, 0x08, 0x06, 0x1f, 0x00) }, /* N */
- { 4, DATA55V (0x0e, 0x11, 0x15, 0x07, 0x00) }, /* G */
- { 2, DATA55V (0x1d, 0x1c, 0x00, 0x00, 0x00) }, /* ! */
- { 5, DATA55V (0x1e, 0x01, 0x0e, 0x01, 0x1e) }, /* W */
- { 3, DATA55V (0x1f, 0x04, 0x07, 0x00, 0x00) }, /* h */
- { 4, DATA55V (0x08, 0x1e, 0x09, 0x09, 0x00) }, /* t */
- { 3, DATA55V (0x04, 0x18, 0x18, 0x00, 0x00) }, /* ' */
- { 4, DATA55V (0x09, 0x15, 0x15, 0x12, 0x00) }, /* s */
- { 4, DATA55V (0x1e, 0x01, 0x01, 0x1e, 0x00) }, /* U */
- { 4, DATA55V (0x08, 0x10, 0x15, 0x08, 0x00) }, /* ? */
- { 4, DATA55V (0x06, 0x09, 0x09, 0x06, 0x00) }, /* o */
- { 5, DATA55V (0x11, 0x0a, 0x04, 0x0a, 0x11) }, /* X */
-};
-
-
-#define REPEAT_COUNT 10
-
-static int
-life_display (void)
-{
- unsigned int i;
- uint8_t count = 0;
- uint8_t state = 0;
-
- while (count++ < REPEAT_COUNT)
- for (i = 0; i < SIZE55 (l55); i++)
- {
- if (user_button ())
- {
- set_led_display (LED_FULL);
- state = 1;
- }
- else if (state == 1)
- return 0;
- else
- set_led_display (l55[i]);
- wait_for (350*1000);
- }
-
- return 1;
-}
-
-
-static int
-text_display (uint8_t kind)
-{
- unsigned int i, j;
- uint8_t *text;
- uint8_t len;
- uint8_t count = 0;
- uint8_t state = 0;
-
- if (kind)
- {
- text = hh;
- len = sizeof (hh);
- }
- else
- {
- text = gnu;
- len = sizeof (gnu);
- }
-
- set_led_display (0);
- while (count++ < REPEAT_COUNT)
- for (i = 0; i < len; i++)
- {
- for (j = 0; j < chargen[text[i]].width; j++)
- {
- if (user_button ())
- {
- set_led_display (LED_FULL);
- state = 1;
- }
- else if (state == 1)
- return 0;
- else
- scroll_led_display ((chargen[text[i]].data >> j * 5) & 0x1f);
- wait_for (120*1000);
- }
-
- if (user_button ())
- {
- set_led_display (LED_FULL);
- state = 1;
- }
- else if (state == 1)
- return 0;
- else
- scroll_led_display (0);
- wait_for (120*1000);
- }
-
- return 1;
-}
-
-
-static void setup_scr_sleepdeep (void);
-
-int
-main (int argc, const char *argv[])
-{
- chopstx_t led_thd;
- chopstx_t button_thd;
- uint8_t happy = 1;
- (void)argc;
- (void)argv;
-
- chopstx_mutex_init (&mtx);
- chopstx_cond_init (&cnd0);
- chopstx_cond_init (&cnd1);
-
- led_thd = chopstx_create (PRIO_LED, __stackaddr_led,
- __stacksize_led, led, NULL);
- button_thd = chopstx_create (PRIO_BUTTON, __stackaddr_button,
- __stacksize_button, button, NULL);
-
- chopstx_usec_wait (200*1000);
-
- chopstx_mutex_lock (&mtx);
- chopstx_cond_signal (&cnd0);
- chopstx_cond_signal (&cnd1);
- chopstx_mutex_unlock (&mtx);
-
- wait_for (100*1000);
- if (user_button ())
- {
- /* Wait button release. */
- while (user_button ())
- wait_for (100*1000);
-
- happy = 0;
- goto do_text;
- }
-
- while (1)
- {
- if (life_display ())
- break;
- do_text:
- if (text_display (happy))
- break;
- }
-
- main_finished = 1;
- chopstx_join (button_thd, NULL);
- chopstx_join (led_thd, NULL);
-
- 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;
-}
+debian-logo.c \ No newline at end of file