Allow to use debug printing from interrupt handlers
This commit is contained in:
parent
2725248532
commit
fbfa245ad4
182
firmware/main.c
182
firmware/main.c
@ -80,6 +80,78 @@ void timer1_interupt(void) __interrupt(IRQ_TIMER1)
|
|||||||
TF1 = 0;
|
TF1 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// {{{ Debug logging
|
||||||
|
|
||||||
|
static uint8_t __xdata log_buffer[1024];
|
||||||
|
// end = start => empty buffer
|
||||||
|
// end can never equal start on a filled buffer
|
||||||
|
// end points to the last char if end != start
|
||||||
|
static uint16_t log_start = 0;
|
||||||
|
static uint16_t log_end = 0;
|
||||||
|
|
||||||
|
static void putc(char c)
|
||||||
|
{
|
||||||
|
log_end = (log_end + 1) % 1024;
|
||||||
|
|
||||||
|
if (log_end == log_start) {
|
||||||
|
// overflow, just push the start in front of us
|
||||||
|
log_start = (log_start + 1) % 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_buffer[log_end] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void puts(const char* s)
|
||||||
|
{
|
||||||
|
while (*s)
|
||||||
|
putc(*s++);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void put_uint(uint16_t value)
|
||||||
|
{
|
||||||
|
char buf[6];
|
||||||
|
char *p = &buf[6 - 1];
|
||||||
|
|
||||||
|
*p = '\0';
|
||||||
|
|
||||||
|
if (!value)
|
||||||
|
*--p = '0';
|
||||||
|
|
||||||
|
while (value) {
|
||||||
|
*--p = '0' + value % 10;
|
||||||
|
value /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
puts(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void put_hex_n(uint8_t nibble)
|
||||||
|
{
|
||||||
|
char c;
|
||||||
|
|
||||||
|
nibble &= 0xf;
|
||||||
|
|
||||||
|
if (nibble < 10)
|
||||||
|
c = '0' + nibble;
|
||||||
|
else
|
||||||
|
c = 'a' + (nibble - 10);
|
||||||
|
|
||||||
|
putc(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void put_hex_b(uint8_t hex)
|
||||||
|
{
|
||||||
|
put_hex_n(hex >> 4);
|
||||||
|
put_hex_n(hex);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void put_hex_w(uint16_t hex)
|
||||||
|
{
|
||||||
|
put_hex_b(hex >> 8);
|
||||||
|
put_hex_b(hex);
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
// {{{ Key scanning
|
// {{{ Key scanning
|
||||||
|
|
||||||
// Keyboard has 12 columns and 6 rows directly connected to GPIOs.
|
// Keyboard has 12 columns and 6 rows directly connected to GPIOs.
|
||||||
@ -343,78 +415,6 @@ void i2c_slave_init(void)
|
|||||||
P0_EIE3 |= BIT(5); // enable I2C B interrupt
|
P0_EIE3 |= BIT(5); // enable I2C B interrupt
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
|
||||||
// {{{ Debug logging
|
|
||||||
|
|
||||||
static uint8_t __xdata log_buffer[1024];
|
|
||||||
// end = start => empty buffer
|
|
||||||
// end can never equal start on a filled buffer
|
|
||||||
// end points to the last char if end != start
|
|
||||||
static uint16_t log_start = 0;
|
|
||||||
static uint16_t log_end = 0;
|
|
||||||
|
|
||||||
static void putc(char c)
|
|
||||||
{
|
|
||||||
log_end = (log_end + 1) % 1024;
|
|
||||||
|
|
||||||
if (log_end == log_start) {
|
|
||||||
// overflow, just push the start in front of us
|
|
||||||
log_start = (log_start + 1) % 1024;
|
|
||||||
}
|
|
||||||
|
|
||||||
log_buffer[log_end] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void puts(const char* s)
|
|
||||||
{
|
|
||||||
while (*s)
|
|
||||||
putc(*s++);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void put_uint(uint16_t value)
|
|
||||||
{
|
|
||||||
char buf[6];
|
|
||||||
char *p = &buf[6 - 1];
|
|
||||||
|
|
||||||
*p = '\0';
|
|
||||||
|
|
||||||
if (!value)
|
|
||||||
*--p = '0';
|
|
||||||
|
|
||||||
while (value) {
|
|
||||||
*--p = '0' + value % 10;
|
|
||||||
value /= 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
puts(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void put_hex_n(uint8_t nibble)
|
|
||||||
{
|
|
||||||
char c;
|
|
||||||
|
|
||||||
nibble &= 0xf;
|
|
||||||
|
|
||||||
if (nibble < 10)
|
|
||||||
c = '0' + nibble;
|
|
||||||
else
|
|
||||||
c = 'a' + (nibble - 10);
|
|
||||||
|
|
||||||
putc(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void put_hex_b(uint8_t hex)
|
|
||||||
{
|
|
||||||
put_hex_n(hex >> 4);
|
|
||||||
put_hex_n(hex);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void put_hex_w(uint16_t hex)
|
|
||||||
{
|
|
||||||
put_hex_b(hex >> 8);
|
|
||||||
put_hex_b(hex);
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
// {{{ USB
|
// {{{ USB
|
||||||
|
|
||||||
@ -610,7 +610,9 @@ static void usb_tasks(void)
|
|||||||
//XXX: what about others?
|
//XXX: what about others?
|
||||||
//XXX: reset software variables...
|
//XXX: reset software variables...
|
||||||
|
|
||||||
|
EA = 0;
|
||||||
puts("usb reset int\n");
|
puts("usb reset int\n");
|
||||||
|
EA = 1;
|
||||||
|
|
||||||
// ack reset request
|
// ack reset request
|
||||||
P1_UDCINT0STA &= ~BIT(5);
|
P1_UDCINT0STA &= ~BIT(5);
|
||||||
@ -626,13 +628,6 @@ static void usb_tasks(void)
|
|||||||
usb_ep0_in_remaining = (uint16_t)((buf[7] << 8) | buf[6]);
|
usb_ep0_in_remaining = (uint16_t)((buf[7] << 8) | buf[6]);
|
||||||
uint16_t in0_len = 0;
|
uint16_t in0_len = 0;
|
||||||
|
|
||||||
puts("ep0 setup: ");
|
|
||||||
put_hex_b(buf[0]);
|
|
||||||
put_hex_b(buf[1]);
|
|
||||||
put_hex_b(buf[2]);
|
|
||||||
put_hex_b(buf[3]);
|
|
||||||
putc('\n');
|
|
||||||
|
|
||||||
// standard commands
|
// standard commands
|
||||||
if (buf[0] == 0x80) {
|
if (buf[0] == 0x80) {
|
||||||
// GET_DESCRIPTOR
|
// GET_DESCRIPTOR
|
||||||
@ -677,8 +672,6 @@ ack_ep0_setup:
|
|||||||
if (P1_UDCINT1STA & BIT(0)) {
|
if (P1_UDCINT1STA & BIT(0)) {
|
||||||
// check if we're ready to send to ep0
|
// check if we're ready to send to ep0
|
||||||
if (!(P1_UDCEPBUF0CTRL & BIT(1))) {
|
if (!(P1_UDCEPBUF0CTRL & BIT(1))) {
|
||||||
puts("ep0 in int ack\n");
|
|
||||||
|
|
||||||
// if ep0 in buffer not empty, clear it first
|
// if ep0 in buffer not empty, clear it first
|
||||||
if (!(P1_UDCBUFSTA & BIT(0))) {
|
if (!(P1_UDCBUFSTA & BIT(0))) {
|
||||||
// clear ep0 buffer
|
// clear ep0 buffer
|
||||||
@ -706,6 +699,9 @@ ack_ep0_setup:
|
|||||||
// data received on ep0 out
|
// data received on ep0 out
|
||||||
if (P1_UDCINT1STA & BIT(1)) {
|
if (P1_UDCINT1STA & BIT(1)) {
|
||||||
// we don't handle any control transfers that send us data
|
// we don't handle any control transfers that send us data
|
||||||
|
EA = 0;
|
||||||
|
puts("usb EP0 OUT int\n");
|
||||||
|
EA = 1;
|
||||||
|
|
||||||
// reset ep0 buf
|
// reset ep0 buf
|
||||||
P1_UDCEPBUF0CTRL |= BIT(0);
|
P1_UDCEPBUF0CTRL |= BIT(0);
|
||||||
@ -717,7 +713,6 @@ ack_ep0_setup:
|
|||||||
|
|
||||||
// does not happen, EP1 IN is not configured on host
|
// does not happen, EP1 IN is not configured on host
|
||||||
if (P1_UDCINT1STA & BIT(2)) {
|
if (P1_UDCINT1STA & BIT(2)) {
|
||||||
puts("ep1 in int ack\n");
|
|
||||||
P1_UDCINT1STA &= ~BIT(2);
|
P1_UDCINT1STA &= ~BIT(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -726,17 +721,9 @@ ack_ep0_setup:
|
|||||||
// read data from ep1 fifo
|
// read data from ep1 fifo
|
||||||
uint8_t bytes = P1_UDCEP1DATAOUTCNT + 1;
|
uint8_t bytes = P1_UDCEP1DATAOUTCNT + 1;
|
||||||
|
|
||||||
puts("usb cmd len=");
|
for (uint8_t i = 0; i < 8; i++)
|
||||||
put_uint(bytes);
|
|
||||||
putc(' ');
|
|
||||||
for (uint8_t i = 0; i < 8; i++) {
|
|
||||||
usb_command[i] = P1_UDCEP1BUFDATA;
|
usb_command[i] = P1_UDCEP1BUFDATA;
|
||||||
|
|
||||||
putc(' ');
|
|
||||||
put_hex_b(usb_command[i]);
|
|
||||||
}
|
|
||||||
usb_command_status = 1;
|
usb_command_status = 1;
|
||||||
putc('\n');
|
|
||||||
|
|
||||||
P1_UDCINT1STA &= ~BIT(3);
|
P1_UDCINT1STA &= ~BIT(3);
|
||||||
|
|
||||||
@ -776,8 +763,6 @@ ack_ep0_setup:
|
|||||||
if (usb_command_status == 2 && !(P1_UDCEPBUF0CTRL & BIT(5))) {
|
if (usb_command_status == 2 && !(P1_UDCEPBUF0CTRL & BIT(5))) {
|
||||||
P1_UDCEP2DATAINCNT = 8 - 1; // how much bytes to send
|
P1_UDCEP2DATAINCNT = 8 - 1; // how much bytes to send
|
||||||
|
|
||||||
puts("ep2 in response\n");
|
|
||||||
|
|
||||||
for (uint8_t i = 0; i < 8; i++)
|
for (uint8_t i = 0; i < 8; i++)
|
||||||
P1_UDCEP2BUFDATA = usb_response[i];
|
P1_UDCEP2BUFDATA = usb_response[i];
|
||||||
|
|
||||||
@ -813,8 +798,6 @@ ack_ep0_setup:
|
|||||||
if (P1_UDCINT2STA & BIT(2)) {
|
if (P1_UDCINT2STA & BIT(2)) {
|
||||||
// push key change events to ep4 in
|
// push key change events to ep4 in
|
||||||
if (!(P1_UDCEPBUF1CTRL & BIT(1)) && usb_key_change) {
|
if (!(P1_UDCEPBUF1CTRL & BIT(1)) && usb_key_change) {
|
||||||
puts("key change sent\n");
|
|
||||||
|
|
||||||
for (uint8_t i = 0; i < 12; i++)
|
for (uint8_t i = 0; i < 12; i++)
|
||||||
P1_UDCEP4BUFDATA = i2c_regs[i + 4];
|
P1_UDCEP4BUFDATA = i2c_regs[i + 4];
|
||||||
|
|
||||||
@ -829,7 +812,10 @@ ack_ep0_setup:
|
|||||||
|
|
||||||
// suspend request
|
// suspend request
|
||||||
if (P1_UDCINT0STA & BIT(6)) {
|
if (P1_UDCINT0STA & BIT(6)) {
|
||||||
puts("suspend int ack\n");
|
EA = 0;
|
||||||
|
puts("usb suspend int\n");
|
||||||
|
EA = 1;
|
||||||
|
|
||||||
// ack
|
// ack
|
||||||
P1_UDCINT0STA &= ~BIT(6);
|
P1_UDCINT0STA &= ~BIT(6);
|
||||||
|
|
||||||
@ -897,6 +883,8 @@ void main(void)
|
|||||||
// enable auto-tuning internal RC oscillator based on USB SOF packets
|
// enable auto-tuning internal RC oscillator based on USB SOF packets
|
||||||
P1_IRCCTRL &= ~BIT(1); // disable manual trim
|
P1_IRCCTRL &= ~BIT(1); // disable manual trim
|
||||||
|
|
||||||
|
puts("ppkb firmware 0.1\n");
|
||||||
|
|
||||||
i2c_slave_init();
|
i2c_slave_init();
|
||||||
|
|
||||||
T1_SET_TIMEOUT(40000);
|
T1_SET_TIMEOUT(40000);
|
||||||
@ -908,8 +896,6 @@ void main(void)
|
|||||||
EA = 1;
|
EA = 1;
|
||||||
ext_int_deassert();
|
ext_int_deassert();
|
||||||
|
|
||||||
puts("Booted kb 0.1\n");
|
|
||||||
|
|
||||||
#if POLL_INPUT
|
#if POLL_INPUT
|
||||||
keyscan_active();
|
keyscan_active();
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user