l55 and hh only.
This commit is contained in:
@@ -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 =
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -1,38 +1,38 @@
|
||||
o...o
|
||||
o...o
|
||||
ooooo
|
||||
o...o
|
||||
o...o
|
||||
o..o
|
||||
o..o
|
||||
oooo
|
||||
o..o
|
||||
o..o
|
||||
|
||||
..o.
|
||||
.o.o.
|
||||
o...o
|
||||
ooooo
|
||||
o...o
|
||||
.oo.
|
||||
...o
|
||||
.ooo
|
||||
o..o
|
||||
.ooo
|
||||
|
||||
ooooo
|
||||
o...o
|
||||
oooo.
|
||||
o....
|
||||
o....
|
||||
ooo.
|
||||
o..o
|
||||
ooo.
|
||||
o...
|
||||
o...
|
||||
|
||||
o...o
|
||||
o...o
|
||||
.ooo.
|
||||
..o..
|
||||
..o..
|
||||
o..o
|
||||
o..o
|
||||
.ooo
|
||||
...o
|
||||
ooo.
|
||||
|
||||
.ooo.
|
||||
o....
|
||||
o....
|
||||
o...o
|
||||
.ooo.
|
||||
.oo.
|
||||
o..o
|
||||
o...
|
||||
o..o
|
||||
.oo.
|
||||
|
||||
o..o.
|
||||
o.o..
|
||||
ooo..
|
||||
o..o.
|
||||
o...o
|
||||
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
|
||||
o..o
|
||||
oo.o
|
||||
o.oo
|
||||
o.oo
|
||||
o..o
|
||||
|
||||
.ooo.
|
||||
o....
|
||||
o..oo
|
||||
o...o
|
||||
.ooo.
|
||||
.oo.
|
||||
o...
|
||||
o.oo
|
||||
o..o
|
||||
.ooo
|
||||
|
||||
oo
|
||||
oo
|
||||
|
||||
Reference in New Issue
Block a user