qmk-firmware/tmk_core/protocol/arm_atsam/d51_util.c

166 lines
3.7 KiB
C

#include "d51_util.h"
//Display unsigned 32-bit number through m15
//Read as follows: 1230 = || ||| |||| | (note always ending toggle)
void m15_print(uint32_t x)
{
int8_t t;
uint32_t n;
uint32_t p, p2;
if (x < 10) t = 0;
else if (x < 100) t = 1;
else if (x < 1000) t = 2;
else if (x < 10000) t = 3;
else if (x < 100000) t = 4;
else if (x < 1000000) t = 5;
else if (x < 10000000) t = 6;
else if (x < 100000000) t = 7;
else if (x < 1000000000) t = 8;
else t = 9;
while (t >= 0)
{
p2 = t;
p = 1;
while (p2--) p *= 10;
n = x / p;
x -= n * p;
while (n > 0)
{
m15_on;
n--;
m15_off;
}
//Will always end with an extra toggle
m15_on;
t--;
m15_off;
}
}
//Display unsigned 32-bit number through debug led
//Read as follows: 1230 = [*] [* *] [* * *] [**] (note zero is fast double flash)
#define DLED_ONTIME 1000000
#define DLED_PAUSE 1500000
volatile uint32_t w;
void dled_print(uint32_t x, uint8_t long_pause)
{
int8_t t;
uint32_t n;
uint32_t p, p2;
if (x < 10) t = 0;
else if (x < 100) t = 1;
else if (x < 1000) t = 2;
else if (x < 10000) t = 3;
else if (x < 100000) t = 4;
else if (x < 1000000) t = 5;
else if (x < 10000000) t = 6;
else if (x < 100000000) t = 7;
else if (x < 1000000000) t = 8;
else t = 9;
while (t >= 0)
{
p2 = t;
p = 1;
while (p2--) p *= 10;
n = x / p;
x -= n * p;
if (!n)
{
led_on;
for (w = DLED_ONTIME / 4; w; w--);
led_off;
for (w = DLED_ONTIME / 4; w; w--);
led_on;
for (w = DLED_ONTIME / 4; w; w--);
led_off;
for (w = DLED_ONTIME / 4; w; w--);
n--;
}
else
{
while (n > 0)
{
led_on;
for (w = DLED_ONTIME; w; w--);
led_off;
for (w = DLED_ONTIME / 2; w; w--);
n--;
}
}
for (w = DLED_PAUSE; w; w--);
t--;
}
if (long_pause)
{
for (w = DLED_PAUSE * 4; w; w--);
}
}
#ifdef DEBUG_BOOT_TRACING
volatile uint32_t debug_code;
void EIC_15_Handler()
{
//This is only for non-functional keyboard troubleshooting and should be disabled after boot
//Intention is to lock up the keyboard here with repeating debug led code
while (1)
{
dled_print(debug_code, 1);
}
}
void debug_code_init(void)
{
DBGC(DC_UNSET);
//Configure Ports for EIC on PB31
PORT->Group[1].DIRCLR.reg = 1 << 31; //Input
PORT->Group[1].OUTSET.reg = 1 << 31; //High
PORT->Group[1].PINCFG[31].bit.INEN = 1; //Input Enable
PORT->Group[1].PINCFG[31].bit.PULLEN = 1; //Pull Enable
PORT->Group[1].PINCFG[31].bit.PMUXEN = 1; //Mux Enable
PORT->Group[1].PMUX[15].bit.PMUXO = 0; //Mux A
//Enable CLK_EIC_APB
MCLK->APBAMASK.bit.EIC_ = 1;
//Configure EIC
EIC->CTRLA.bit.SWRST = 1;
while (EIC->SYNCBUSY.bit.SWRST) {}
EIC->ASYNCH.reg = 1 << 15;
EIC->INTENSET.reg = 1 << 15;
EIC->CONFIG[1].bit.SENSE7 = 2;
EIC->CTRLA.bit.ENABLE = 1;
while (EIC->SYNCBUSY.bit.ENABLE) {}
//Enable EIC IRQ
NVIC_EnableIRQ(EIC_15_IRQn);
}
void debug_code_disable(void)
{
//Disable EIC IRQ
NVIC_DisableIRQ(EIC_15_IRQn);
//Disable EIC
EIC->CTRLA.bit.ENABLE = 0;
while (EIC->SYNCBUSY.bit.ENABLE) {}
//Disable CLK_EIC_APB
MCLK->APBAMASK.bit.EIC_ = 0;
}
#else
void debug_code_init(void) {}
void debug_code_disable(void) {}
#endif //DEBUG_BOOT_TRACING