#include "embiosapp.h"
void main();
EMBIOS_APP_HEADER("LCD Test application", 0x1000, main, 127)
#define LCDSTS (*((volatile uint32_t*)(0x3860001c)))
#define LCDWCMD (*((volatile uint32_t*)(0x38600004)))
#define LCDWDAT (*((volatile uint32_t*)(0x38600040)))
#define PDAT(x) (*((volatile uint32_t*)(0x3CF00004 + (x) * 16)))
static inline void waitlcd()
{
while (LCDSTS & 0x10);
}
static inline void waitlcdread()
{
while (!(LCDSTS & 1));
}
static inline void sendlcdc(int cmd)
{
waitlcd();
LCDWCMD = cmd;
}
static inline void sendlcd2d(int data)
{
waitlcd();
LCDWDAT = data >> 8;
waitlcd();
LCDWDAT = data & 0xff;
}
volatile bool done;
volatile bool sync;
void handler(enum button_event eventtype, int which, int value)
{
if (eventtype == BUTTON_PRESS)
{
if (which == 4) done = true;
else if (which == 2) sync = false;
else if (which == 1) sync = true;
}
}
void main()
{
int i, j;
button_register_handler(handler);
sendlcdc(0x35);
sendlcd2d(0);
done = false;
sync = false;
while (!done)
{
for (j = 1; j < 176; j++)
{
if (done) break;
while (sync && !(PDAT(8) & 1)) if (done) break;
sendlcdc(0x2a);
sendlcd2d(j - 1);
sendlcd2d(j);
sendlcdc(0x2b);
sendlcd2d(0);
sendlcd2d(131);
sendlcdc(0x2c);
for (i = 0; i < 132; i++)
{
sendlcd2d(0xffff);
sendlcd2d(0);
}
sleep(50000);
}
}
cputs(3, "Terminated\n");
}