clang-format changes
This commit is contained in:
parent
61af76a10d
commit
b624f32f94
502 changed files with 32259 additions and 39062 deletions
|
@ -37,43 +37,39 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "iwrap.h"
|
||||
#include "print.h"
|
||||
|
||||
|
||||
/* iWRAP MUX mode utils. 3.10 HID raw mode(iWRAP_HID_Application_Note.pdf) */
|
||||
#define MUX_HEADER(LINK, LENGTH) do { \
|
||||
xmit(0xbf); /* SOF */ \
|
||||
xmit(LINK); /* Link */ \
|
||||
xmit(0x00); /* Flags */ \
|
||||
xmit(LENGTH); /* Length */ \
|
||||
} while (0)
|
||||
#define MUX_FOOTER(LINK) xmit(LINK^0xff)
|
||||
|
||||
#define MUX_HEADER(LINK, LENGTH) \
|
||||
do { \
|
||||
xmit(0xbf); /* SOF */ \
|
||||
xmit(LINK); /* Link */ \
|
||||
xmit(0x00); /* Flags */ \
|
||||
xmit(LENGTH); /* Length */ \
|
||||
} while (0)
|
||||
#define MUX_FOOTER(LINK) xmit(LINK ^ 0xff)
|
||||
|
||||
static uint8_t connected = 0;
|
||||
//static uint8_t channel = 1;
|
||||
// static uint8_t channel = 1;
|
||||
|
||||
/* iWRAP buffer */
|
||||
#define MUX_BUF_SIZE 64
|
||||
static char buf[MUX_BUF_SIZE];
|
||||
static char buf[MUX_BUF_SIZE];
|
||||
static uint8_t snd_pos = 0;
|
||||
|
||||
#define MUX_RCV_BUF_SIZE 256
|
||||
static char rcv_buf[MUX_RCV_BUF_SIZE];
|
||||
static char rcv_buf[MUX_RCV_BUF_SIZE];
|
||||
static uint8_t rcv_head = 0;
|
||||
static uint8_t rcv_tail = 0;
|
||||
|
||||
|
||||
/* receive buffer */
|
||||
static void rcv_enq(char c)
|
||||
{
|
||||
static void rcv_enq(char c) {
|
||||
uint8_t next = (rcv_head + 1) % MUX_RCV_BUF_SIZE;
|
||||
if (next != rcv_tail) {
|
||||
rcv_buf[rcv_head] = c;
|
||||
rcv_head = next;
|
||||
rcv_head = next;
|
||||
}
|
||||
}
|
||||
|
||||
static char rcv_deq(void)
|
||||
{
|
||||
static char rcv_deq(void) {
|
||||
char c = 0;
|
||||
if (rcv_head != rcv_tail) {
|
||||
c = rcv_buf[rcv_tail++];
|
||||
|
@ -91,38 +87,33 @@ static char rcv_peek(void)
|
|||
}
|
||||
*/
|
||||
|
||||
static void rcv_clear(void)
|
||||
{
|
||||
rcv_tail = rcv_head = 0;
|
||||
}
|
||||
static void rcv_clear(void) { rcv_tail = rcv_head = 0; }
|
||||
|
||||
/* iWRAP response */
|
||||
ISR(PCINT1_vect, ISR_BLOCK) // recv() runs away in case of ISR_NOBLOCK
|
||||
ISR(PCINT1_vect, ISR_BLOCK) // recv() runs away in case of ISR_NOBLOCK
|
||||
{
|
||||
if ((SUART_IN_PIN & (1<<SUART_IN_BIT)))
|
||||
return;
|
||||
if ((SUART_IN_PIN & (1 << SUART_IN_BIT))) return;
|
||||
|
||||
static volatile uint8_t mux_state = 0xff;
|
||||
static volatile uint8_t mux_link = 0xff;
|
||||
uint8_t c = recv();
|
||||
static volatile uint8_t mux_link = 0xff;
|
||||
uint8_t c = recv();
|
||||
switch (mux_state) {
|
||||
case 0xff: // SOF
|
||||
if (c == 0xbf)
|
||||
mux_state--;
|
||||
case 0xff: // SOF
|
||||
if (c == 0xbf) mux_state--;
|
||||
break;
|
||||
case 0xfe: // Link
|
||||
case 0xfe: // Link
|
||||
mux_state--;
|
||||
mux_link = c;
|
||||
break;
|
||||
case 0xfd: // Flags
|
||||
case 0xfd: // Flags
|
||||
mux_state--;
|
||||
break;
|
||||
case 0xfc: // Length
|
||||
case 0xfc: // Length
|
||||
mux_state = c;
|
||||
break;
|
||||
case 0x00:
|
||||
mux_state = 0xff;
|
||||
mux_link = 0xff;
|
||||
mux_link = 0xff;
|
||||
break;
|
||||
default:
|
||||
if (mux_state--) {
|
||||
|
@ -132,12 +123,10 @@ ISR(PCINT1_vect, ISR_BLOCK) // recv() runs away in case of ISR_NOBLOCK
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------------------------*
|
||||
* iWRAP communication
|
||||
*------------------------------------------------------------------*/
|
||||
void iwrap_init(void)
|
||||
{
|
||||
void iwrap_init(void) {
|
||||
// reset iWRAP if in already MUX mode after AVR software-reset
|
||||
iwrap_send("RESET");
|
||||
iwrap_mux_send("RESET");
|
||||
|
@ -147,43 +136,34 @@ void iwrap_init(void)
|
|||
iwrap_check_connection();
|
||||
}
|
||||
|
||||
void iwrap_mux_send(const char *s)
|
||||
{
|
||||
void iwrap_mux_send(const char *s) {
|
||||
rcv_clear();
|
||||
MUX_HEADER(0xff, strlen((char *)s));
|
||||
iwrap_send(s);
|
||||
MUX_FOOTER(0xff);
|
||||
}
|
||||
|
||||
void iwrap_send(const char *s)
|
||||
{
|
||||
while (*s)
|
||||
xmit(*s++);
|
||||
void iwrap_send(const char *s) {
|
||||
while (*s) xmit(*s++);
|
||||
}
|
||||
|
||||
/* send buffer */
|
||||
void iwrap_buf_add(uint8_t c)
|
||||
{
|
||||
void iwrap_buf_add(uint8_t c) {
|
||||
// need space for '\0'
|
||||
if (snd_pos < MUX_BUF_SIZE-1)
|
||||
buf[snd_pos++] = c;
|
||||
if (snd_pos < MUX_BUF_SIZE - 1) buf[snd_pos++] = c;
|
||||
}
|
||||
|
||||
void iwrap_buf_del(void)
|
||||
{
|
||||
if (snd_pos)
|
||||
snd_pos--;
|
||||
void iwrap_buf_del(void) {
|
||||
if (snd_pos) snd_pos--;
|
||||
}
|
||||
|
||||
void iwrap_buf_send(void)
|
||||
{
|
||||
void iwrap_buf_send(void) {
|
||||
buf[snd_pos] = '\0';
|
||||
snd_pos = 0;
|
||||
snd_pos = 0;
|
||||
iwrap_mux_send(buf);
|
||||
}
|
||||
|
||||
void iwrap_call(void)
|
||||
{
|
||||
void iwrap_call(void) {
|
||||
char *p;
|
||||
|
||||
iwrap_mux_send("SET BT PAIR");
|
||||
|
@ -193,7 +173,7 @@ void iwrap_call(void)
|
|||
while (!strncmp(p, "SET BT PAIR", 11)) {
|
||||
p += 7;
|
||||
strncpy(p, "CALL", 4);
|
||||
strncpy(p+22, " 11 HID\n\0", 9);
|
||||
strncpy(p + 22, " 11 HID\n\0", 9);
|
||||
print_S(p);
|
||||
iwrap_mux_send(p);
|
||||
// TODO: skip to next line
|
||||
|
@ -224,20 +204,21 @@ void iwrap_call(void)
|
|||
iwrap_check_connection();
|
||||
}
|
||||
|
||||
void iwrap_kill(void)
|
||||
{
|
||||
void iwrap_kill(void) {
|
||||
char c;
|
||||
iwrap_mux_send("LIST");
|
||||
_delay_ms(500);
|
||||
|
||||
while ((c = rcv_deq()) && c != '\n') ;
|
||||
while ((c = rcv_deq()) && c != '\n')
|
||||
;
|
||||
if (strncmp(rcv_buf + rcv_tail, "LIST ", 5)) {
|
||||
print("no connection to kill.\n");
|
||||
return;
|
||||
}
|
||||
// skip 10 'space' chars
|
||||
for (uint8_t i = 10; i; i--)
|
||||
while ((c = rcv_deq()) && c != ' ') ;
|
||||
while ((c = rcv_deq()) && c != ' ')
|
||||
;
|
||||
|
||||
char *p = rcv_buf + rcv_tail - 5;
|
||||
strncpy(p, "KILL ", 5);
|
||||
|
@ -249,47 +230,34 @@ void iwrap_kill(void)
|
|||
iwrap_check_connection();
|
||||
}
|
||||
|
||||
void iwrap_unpair(void)
|
||||
{
|
||||
void iwrap_unpair(void) {
|
||||
iwrap_mux_send("SET BT PAIR");
|
||||
_delay_ms(500);
|
||||
|
||||
char *p = rcv_buf + rcv_tail;
|
||||
if (!strncmp(p, "SET BT PAIR", 11)) {
|
||||
strncpy(p+29, "\n\0", 2);
|
||||
strncpy(p + 29, "\n\0", 2);
|
||||
print_S(p);
|
||||
iwrap_mux_send(p);
|
||||
}
|
||||
}
|
||||
|
||||
void iwrap_sleep(void)
|
||||
{
|
||||
iwrap_mux_send("SLEEP");
|
||||
}
|
||||
void iwrap_sleep(void) { iwrap_mux_send("SLEEP"); }
|
||||
|
||||
void iwrap_sniff(void)
|
||||
{
|
||||
}
|
||||
void iwrap_sniff(void) {}
|
||||
|
||||
void iwrap_subrate(void)
|
||||
{
|
||||
}
|
||||
void iwrap_subrate(void) {}
|
||||
|
||||
bool iwrap_failed(void)
|
||||
{
|
||||
bool iwrap_failed(void) {
|
||||
if (strncmp(rcv_buf, "SYNTAX ERROR", 12))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t iwrap_connected(void)
|
||||
{
|
||||
return connected;
|
||||
}
|
||||
uint8_t iwrap_connected(void) { return connected; }
|
||||
|
||||
uint8_t iwrap_check_connection(void)
|
||||
{
|
||||
uint8_t iwrap_check_connection(void) {
|
||||
iwrap_mux_send("LIST");
|
||||
_delay_ms(100);
|
||||
|
||||
|
@ -300,44 +268,31 @@ uint8_t iwrap_check_connection(void)
|
|||
return connected;
|
||||
}
|
||||
|
||||
|
||||
/*------------------------------------------------------------------*
|
||||
* Host driver
|
||||
*------------------------------------------------------------------*/
|
||||
static uint8_t keyboard_leds(void);
|
||||
static void send_keyboard(report_keyboard_t *report);
|
||||
static void send_mouse(report_mouse_t *report);
|
||||
static void send_system(uint16_t data);
|
||||
static void send_consumer(uint16_t data);
|
||||
static void send_keyboard(report_keyboard_t *report);
|
||||
static void send_mouse(report_mouse_t *report);
|
||||
static void send_system(uint16_t data);
|
||||
static void send_consumer(uint16_t data);
|
||||
|
||||
static host_driver_t driver = {
|
||||
keyboard_leds,
|
||||
send_keyboard,
|
||||
send_mouse,
|
||||
send_system,
|
||||
send_consumer
|
||||
};
|
||||
static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer};
|
||||
|
||||
host_driver_t *iwrap_driver(void)
|
||||
{
|
||||
return &driver;
|
||||
}
|
||||
host_driver_t *iwrap_driver(void) { return &driver; }
|
||||
|
||||
static uint8_t keyboard_leds(void) {
|
||||
return 0;
|
||||
}
|
||||
static uint8_t keyboard_leds(void) { return 0; }
|
||||
|
||||
static void send_keyboard(report_keyboard_t *report)
|
||||
{
|
||||
static void send_keyboard(report_keyboard_t *report) {
|
||||
if (!iwrap_connected() && !iwrap_check_connection()) return;
|
||||
MUX_HEADER(0x01, 0x0c);
|
||||
// HID raw mode header
|
||||
xmit(0x9f);
|
||||
xmit(0x0a); // Length
|
||||
xmit(0xa1); // DATA(Input)
|
||||
xmit(0x01); // Report ID
|
||||
xmit(0x0a); // Length
|
||||
xmit(0xa1); // DATA(Input)
|
||||
xmit(0x01); // Report ID
|
||||
xmit(report->mods);
|
||||
xmit(0x00); // reserved byte(always 0)
|
||||
xmit(0x00); // reserved byte(always 0)
|
||||
xmit(report->keys[0]);
|
||||
xmit(report->keys[1]);
|
||||
xmit(report->keys[2]);
|
||||
|
@ -347,16 +302,15 @@ static void send_keyboard(report_keyboard_t *report)
|
|||
MUX_FOOTER(0x01);
|
||||
}
|
||||
|
||||
static void send_mouse(report_mouse_t *report)
|
||||
{
|
||||
static void send_mouse(report_mouse_t *report) {
|
||||
#if defined(MOUSEKEY_ENABLE) || defined(PS2_MOUSE_ENABLE) || defined(POINTING_DEVICE_ENABLE)
|
||||
if (!iwrap_connected() && !iwrap_check_connection()) return;
|
||||
MUX_HEADER(0x01, 0x09);
|
||||
// HID raw mode header
|
||||
xmit(0x9f);
|
||||
xmit(0x07); // Length
|
||||
xmit(0xa1); // DATA(Input)
|
||||
xmit(0x02); // Report ID
|
||||
xmit(0x07); // Length
|
||||
xmit(0xa1); // DATA(Input)
|
||||
xmit(0x02); // Report ID
|
||||
xmit(report->buttons);
|
||||
xmit(report->x);
|
||||
xmit(report->y);
|
||||
|
@ -366,18 +320,14 @@ static void send_mouse(report_mouse_t *report)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void send_system(uint16_t data)
|
||||
{
|
||||
/* not supported */
|
||||
}
|
||||
static void send_system(uint16_t data) { /* not supported */ }
|
||||
|
||||
static void send_consumer(uint16_t data)
|
||||
{
|
||||
static void send_consumer(uint16_t data) {
|
||||
#ifdef EXTRAKEY_ENABLE
|
||||
static uint16_t last_data = 0;
|
||||
uint8_t bits1 = 0;
|
||||
uint8_t bits2 = 0;
|
||||
uint8_t bits3 = 0;
|
||||
uint8_t bits1 = 0;
|
||||
uint8_t bits2 = 0;
|
||||
uint8_t bits3 = 0;
|
||||
|
||||
if (!iwrap_connected() && !iwrap_check_connection()) return;
|
||||
if (data == last_data) return;
|
||||
|
@ -458,9 +408,9 @@ static void send_consumer(uint16_t data)
|
|||
|
||||
MUX_HEADER(0x01, 0x07);
|
||||
xmit(0x9f);
|
||||
xmit(0x05); // Length
|
||||
xmit(0xa1); // DATA(Input)
|
||||
xmit(0x03); // Report ID
|
||||
xmit(0x05); // Length
|
||||
xmit(0xa1); // DATA(Input)
|
||||
xmit(0x03); // Report ID
|
||||
xmit(bits1);
|
||||
xmit(bits2);
|
||||
xmit(bits3);
|
||||
|
|
|
@ -22,11 +22,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include <stdbool.h>
|
||||
#include "host_driver.h"
|
||||
|
||||
|
||||
/* enable iWRAP MUX mode */
|
||||
#define MUX_MODE
|
||||
|
||||
|
||||
host_driver_t *iwrap_driver(void);
|
||||
|
||||
void iwrap_init(void);
|
||||
|
@ -36,13 +34,13 @@ void iwrap_buf_send(void);
|
|||
void iwrap_buf_add(uint8_t c);
|
||||
void iwrap_buf_del(void);
|
||||
|
||||
void iwrap_call(void);
|
||||
void iwrap_kill(void);
|
||||
void iwrap_unpair(void);
|
||||
void iwrap_sleep(void);
|
||||
void iwrap_sniff(void);
|
||||
void iwrap_subrate(void);
|
||||
bool iwrap_failed(void);
|
||||
void iwrap_call(void);
|
||||
void iwrap_kill(void);
|
||||
void iwrap_unpair(void);
|
||||
void iwrap_sleep(void);
|
||||
void iwrap_sniff(void);
|
||||
void iwrap_subrate(void);
|
||||
bool iwrap_failed(void);
|
||||
uint8_t iwrap_connected(void);
|
||||
uint8_t iwrap_check_connection(void);
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include <avr/interrupt.h>
|
||||
#include <avr/io.h>
|
||||
//#include <avr/wdt.h>
|
||||
#include "wd.h" // in order to use watchdog in interrupt mode
|
||||
#include "wd.h" // in order to use watchdog in interrupt mode
|
||||
#include <avr/sleep.h>
|
||||
#include <util/delay.h>
|
||||
#include <avr/power.h>
|
||||
|
@ -28,8 +28,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "action.h"
|
||||
#include "iwrap.h"
|
||||
#ifdef PROTOCOL_VUSB
|
||||
# include "vusb.h"
|
||||
# include "usbdrv.h"
|
||||
# include "vusb.h"
|
||||
# include "usbdrv.h"
|
||||
#endif
|
||||
#include "uart.h"
|
||||
#include "suart.h"
|
||||
|
@ -38,13 +38,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "keycode.h"
|
||||
#include "command.h"
|
||||
|
||||
|
||||
static void sleep(uint8_t term);
|
||||
static bool console(void);
|
||||
static bool console_command(uint8_t c);
|
||||
static void sleep(uint8_t term);
|
||||
static bool console(void);
|
||||
static bool console_command(uint8_t c);
|
||||
static uint8_t key2asc(uint8_t key);
|
||||
|
||||
|
||||
/*
|
||||
static void set_prr(void)
|
||||
{
|
||||
|
@ -78,37 +76,32 @@ static void pullup_pins(void)
|
|||
}
|
||||
*/
|
||||
|
||||
|
||||
#ifdef PROTOCOL_VUSB
|
||||
static void disable_vusb(void)
|
||||
{
|
||||
static void disable_vusb(void) {
|
||||
// disable interrupt & disconnect to prevent host from enumerating
|
||||
USB_INTR_ENABLE &= ~(1 << USB_INTR_ENABLE_BIT);
|
||||
usbDeviceDisconnect();
|
||||
}
|
||||
|
||||
static void enable_vusb(void)
|
||||
{
|
||||
static void enable_vusb(void) {
|
||||
USB_INTR_ENABLE |= (1 << USB_INTR_ENABLE_BIT);
|
||||
usbDeviceConnect();
|
||||
}
|
||||
|
||||
static void init_vusb(void)
|
||||
{
|
||||
static void init_vusb(void) {
|
||||
uint8_t i = 0;
|
||||
|
||||
usbInit();
|
||||
disable_vusb();
|
||||
/* fake USB disconnect for > 250 ms */
|
||||
while(--i){
|
||||
while (--i) {
|
||||
_delay_ms(1);
|
||||
}
|
||||
enable_vusb();
|
||||
}
|
||||
#endif
|
||||
|
||||
void change_driver(host_driver_t *driver)
|
||||
{
|
||||
void change_driver(host_driver_t *driver) {
|
||||
/*
|
||||
host_clear_keyboard_report();
|
||||
host_swap_keyboard_report();
|
||||
|
@ -120,20 +113,18 @@ void change_driver(host_driver_t *driver)
|
|||
host_set_driver(driver);
|
||||
}
|
||||
|
||||
|
||||
static bool sleeping = false;
|
||||
static bool insomniac = false; // TODO: should be false for power saving
|
||||
static bool sleeping = false;
|
||||
static bool insomniac = false; // TODO: should be false for power saving
|
||||
static uint16_t last_timer = 0;
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int main(void) {
|
||||
MCUSR = 0;
|
||||
clock_prescale_set(clock_div_1);
|
||||
WD_SET(WD_OFF);
|
||||
|
||||
// power saving: the result is worse than nothing... why?
|
||||
//pullup_pins();
|
||||
//set_prr();
|
||||
// pullup_pins();
|
||||
// set_prr();
|
||||
|
||||
#ifdef PROTOCOL_VUSB
|
||||
disable_vusb();
|
||||
|
@ -146,11 +137,11 @@ int main(void)
|
|||
print("suart init\n");
|
||||
// suart init
|
||||
// PC4: Tx Output IDLE(Hi)
|
||||
PORTC |= (1<<4);
|
||||
DDRC |= (1<<4);
|
||||
PORTC |= (1 << 4);
|
||||
DDRC |= (1 << 4);
|
||||
// PC5: Rx Input(pull-up)
|
||||
PORTC |= (1<<5);
|
||||
DDRC &= ~(1<<5);
|
||||
PORTC |= (1 << 5);
|
||||
DDRC &= ~(1 << 5);
|
||||
// suart receive interrut(PC5/PCINT13)
|
||||
PCMSK1 = 0b00100000;
|
||||
PCICR = 0b00000010;
|
||||
|
@ -164,18 +155,16 @@ int main(void)
|
|||
last_timer = timer_read();
|
||||
while (true) {
|
||||
#ifdef PROTOCOL_VUSB
|
||||
if (host_get_driver() == vusb_driver())
|
||||
usbPoll();
|
||||
if (host_get_driver() == vusb_driver()) usbPoll();
|
||||
#endif
|
||||
keyboard_task();
|
||||
#ifdef PROTOCOL_VUSB
|
||||
if (host_get_driver() == vusb_driver())
|
||||
vusb_transfer_keyboard();
|
||||
if (host_get_driver() == vusb_driver()) vusb_transfer_keyboard();
|
||||
#endif
|
||||
// TODO: depricated
|
||||
if (matrix_is_modified() || console()) {
|
||||
last_timer = timer_read();
|
||||
sleeping = false;
|
||||
sleeping = false;
|
||||
} else if (!sleeping && timer_elapsed(last_timer) > 4000) {
|
||||
sleeping = true;
|
||||
iwrap_check_connection();
|
||||
|
@ -184,7 +173,7 @@ int main(void)
|
|||
// TODO: suspend.h
|
||||
if (host_get_driver() == iwrap_driver()) {
|
||||
if (sleeping && !insomniac) {
|
||||
_delay_ms(1); // wait for UART to send
|
||||
_delay_ms(1); // wait for UART to send
|
||||
iwrap_sleep();
|
||||
sleep(WDTO_60MS);
|
||||
}
|
||||
|
@ -192,8 +181,7 @@ int main(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void sleep(uint8_t term)
|
||||
{
|
||||
static void sleep(uint8_t term) {
|
||||
WD_SET(WD_IRQ, term);
|
||||
|
||||
cli();
|
||||
|
@ -207,51 +195,46 @@ static void sleep(uint8_t term)
|
|||
WD_SET(WD_OFF);
|
||||
}
|
||||
|
||||
static bool console(void)
|
||||
{
|
||||
// Send to Bluetoot module WT12
|
||||
static bool breaked = false;
|
||||
if (!uart_available())
|
||||
return false;
|
||||
else {
|
||||
uint8_t c;
|
||||
c = uart_getchar();
|
||||
uart_putchar(c);
|
||||
switch (c) {
|
||||
case 0x00: // BREAK signal
|
||||
if (!breaked) {
|
||||
print("break(? for help): ");
|
||||
breaked = true;
|
||||
}
|
||||
break;
|
||||
case '\r':
|
||||
uart_putchar('\n');
|
||||
iwrap_buf_send();
|
||||
break;
|
||||
case '\b':
|
||||
iwrap_buf_del();
|
||||
break;
|
||||
default:
|
||||
if (breaked) {
|
||||
print("\n");
|
||||
console_command(c);
|
||||
breaked = false;
|
||||
} else {
|
||||
iwrap_buf_add(c);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
static bool console(void) {
|
||||
// Send to Bluetoot module WT12
|
||||
static bool breaked = false;
|
||||
if (!uart_available())
|
||||
return false;
|
||||
else {
|
||||
uint8_t c;
|
||||
c = uart_getchar();
|
||||
uart_putchar(c);
|
||||
switch (c) {
|
||||
case 0x00: // BREAK signal
|
||||
if (!breaked) {
|
||||
print("break(? for help): ");
|
||||
breaked = true;
|
||||
}
|
||||
break;
|
||||
case '\r':
|
||||
uart_putchar('\n');
|
||||
iwrap_buf_send();
|
||||
break;
|
||||
case '\b':
|
||||
iwrap_buf_del();
|
||||
break;
|
||||
default:
|
||||
if (breaked) {
|
||||
print("\n");
|
||||
console_command(c);
|
||||
breaked = false;
|
||||
} else {
|
||||
iwrap_buf_add(c);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool command_extra(uint8_t code)
|
||||
{
|
||||
return console_command(key2asc(code));
|
||||
}
|
||||
bool command_extra(uint8_t code) { return console_command(key2asc(code)); }
|
||||
|
||||
static bool console_command(uint8_t c)
|
||||
{
|
||||
static bool console_command(uint8_t c) {
|
||||
switch (c) {
|
||||
case 'h':
|
||||
case '?':
|
||||
|
@ -287,11 +270,11 @@ static bool console_command(uint8_t c)
|
|||
print("USB mode\n");
|
||||
init_vusb();
|
||||
change_driver(vusb_driver());
|
||||
//iwrap_kill();
|
||||
//iwrap_sleep();
|
||||
// iwrap_kill();
|
||||
// iwrap_sleep();
|
||||
// disable suart receive interrut(PC5/PCINT13)
|
||||
PCMSK1 &= ~(0b00100000);
|
||||
PCICR &= ~(0b00000010);
|
||||
PCICR &= ~(0b00000010);
|
||||
return 1;
|
||||
case 'w':
|
||||
print("iWRAP mode\n");
|
||||
|
@ -299,7 +282,7 @@ static bool console_command(uint8_t c)
|
|||
disable_vusb();
|
||||
// enable suart receive interrut(PC5/PCINT13)
|
||||
PCMSK1 |= 0b00100000;
|
||||
PCICR |= 0b00000010;
|
||||
PCICR |= 0b00000010;
|
||||
return 1;
|
||||
#endif
|
||||
case 'k':
|
||||
|
@ -315,62 +298,115 @@ static bool console_command(uint8_t c)
|
|||
}
|
||||
|
||||
// convert keycode into ascii charactor
|
||||
static uint8_t key2asc(uint8_t key)
|
||||
{
|
||||
static uint8_t key2asc(uint8_t key) {
|
||||
switch (key) {
|
||||
case KC_A: return 'a';
|
||||
case KC_B: return 'b';
|
||||
case KC_C: return 'c';
|
||||
case KC_D: return 'd';
|
||||
case KC_E: return 'e';
|
||||
case KC_F: return 'f';
|
||||
case KC_G: return 'g';
|
||||
case KC_H: return 'h';
|
||||
case KC_I: return 'i';
|
||||
case KC_J: return 'j';
|
||||
case KC_K: return 'k';
|
||||
case KC_L: return 'l';
|
||||
case KC_M: return 'm';
|
||||
case KC_N: return 'n';
|
||||
case KC_O: return 'o';
|
||||
case KC_P: return 'p';
|
||||
case KC_Q: return 'q';
|
||||
case KC_R: return 'r';
|
||||
case KC_S: return 's';
|
||||
case KC_T: return 't';
|
||||
case KC_U: return 'u';
|
||||
case KC_V: return 'v';
|
||||
case KC_W: return 'w';
|
||||
case KC_X: return 'x';
|
||||
case KC_Y: return 'y';
|
||||
case KC_Z: return 'z';
|
||||
case KC_1: return '1';
|
||||
case KC_2: return '2';
|
||||
case KC_3: return '3';
|
||||
case KC_4: return '4';
|
||||
case KC_5: return '5';
|
||||
case KC_6: return '6';
|
||||
case KC_7: return '7';
|
||||
case KC_8: return '8';
|
||||
case KC_9: return '9';
|
||||
case KC_0: return '0';
|
||||
case KC_ENTER: return '\n';
|
||||
case KC_ESCAPE: return 0x1B;
|
||||
case KC_BSPACE: return '\b';
|
||||
case KC_TAB: return '\t';
|
||||
case KC_SPACE: return ' ';
|
||||
case KC_MINUS: return '-';
|
||||
case KC_EQUAL: return '=';
|
||||
case KC_LBRACKET: return '[';
|
||||
case KC_RBRACKET: return ']';
|
||||
case KC_BSLASH: return '\\';
|
||||
case KC_NONUS_HASH: return '\\';
|
||||
case KC_SCOLON: return ';';
|
||||
case KC_QUOTE: return '\'';
|
||||
case KC_GRAVE: return '`';
|
||||
case KC_COMMA: return ',';
|
||||
case KC_DOT: return '.';
|
||||
case KC_SLASH: return '/';
|
||||
default: return 0x00;
|
||||
case KC_A:
|
||||
return 'a';
|
||||
case KC_B:
|
||||
return 'b';
|
||||
case KC_C:
|
||||
return 'c';
|
||||
case KC_D:
|
||||
return 'd';
|
||||
case KC_E:
|
||||
return 'e';
|
||||
case KC_F:
|
||||
return 'f';
|
||||
case KC_G:
|
||||
return 'g';
|
||||
case KC_H:
|
||||
return 'h';
|
||||
case KC_I:
|
||||
return 'i';
|
||||
case KC_J:
|
||||
return 'j';
|
||||
case KC_K:
|
||||
return 'k';
|
||||
case KC_L:
|
||||
return 'l';
|
||||
case KC_M:
|
||||
return 'm';
|
||||
case KC_N:
|
||||
return 'n';
|
||||
case KC_O:
|
||||
return 'o';
|
||||
case KC_P:
|
||||
return 'p';
|
||||
case KC_Q:
|
||||
return 'q';
|
||||
case KC_R:
|
||||
return 'r';
|
||||
case KC_S:
|
||||
return 's';
|
||||
case KC_T:
|
||||
return 't';
|
||||
case KC_U:
|
||||
return 'u';
|
||||
case KC_V:
|
||||
return 'v';
|
||||
case KC_W:
|
||||
return 'w';
|
||||
case KC_X:
|
||||
return 'x';
|
||||
case KC_Y:
|
||||
return 'y';
|
||||
case KC_Z:
|
||||
return 'z';
|
||||
case KC_1:
|
||||
return '1';
|
||||
case KC_2:
|
||||
return '2';
|
||||
case KC_3:
|
||||
return '3';
|
||||
case KC_4:
|
||||
return '4';
|
||||
case KC_5:
|
||||
return '5';
|
||||
case KC_6:
|
||||
return '6';
|
||||
case KC_7:
|
||||
return '7';
|
||||
case KC_8:
|
||||
return '8';
|
||||
case KC_9:
|
||||
return '9';
|
||||
case KC_0:
|
||||
return '0';
|
||||
case KC_ENTER:
|
||||
return '\n';
|
||||
case KC_ESCAPE:
|
||||
return 0x1B;
|
||||
case KC_BSPACE:
|
||||
return '\b';
|
||||
case KC_TAB:
|
||||
return '\t';
|
||||
case KC_SPACE:
|
||||
return ' ';
|
||||
case KC_MINUS:
|
||||
return '-';
|
||||
case KC_EQUAL:
|
||||
return '=';
|
||||
case KC_LBRACKET:
|
||||
return '[';
|
||||
case KC_RBRACKET:
|
||||
return ']';
|
||||
case KC_BSLASH:
|
||||
return '\\';
|
||||
case KC_NONUS_HASH:
|
||||
return '\\';
|
||||
case KC_SCOLON:
|
||||
return ';';
|
||||
case KC_QUOTE:
|
||||
return '\'';
|
||||
case KC_GRAVE:
|
||||
return '`';
|
||||
case KC_COMMA:
|
||||
return ',';
|
||||
case KC_DOT:
|
||||
return '.';
|
||||
case KC_SLASH:
|
||||
return '/';
|
||||
default:
|
||||
return 0x00;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
#ifndef SUART
|
||||
#define SUART
|
||||
|
||||
void xmit(uint8_t);
|
||||
void xmit(uint8_t);
|
||||
uint8_t rcvr(void);
|
||||
uint8_t recv(void);
|
||||
|
||||
#endif /* SUART */
|
||||
#endif /* SUART */
|
||||
|
|
|
@ -61,55 +61,58 @@ cleared on every power up or reset, along with disabling the watchdog-
|
|||
|
||||
*/
|
||||
|
||||
//reset registers to the same name (MCUCSR)
|
||||
// reset registers to the same name (MCUCSR)
|
||||
#if !defined(MCUCSR)
|
||||
#define MCUCSR MCUSR
|
||||
# define MCUCSR MCUSR
|
||||
#endif
|
||||
|
||||
//watchdog registers to the same name (WDTCSR)
|
||||
// watchdog registers to the same name (WDTCSR)
|
||||
#if !defined(WDTCSR)
|
||||
#define WDTCSR WDTCR
|
||||
# define WDTCSR WDTCR
|
||||
#endif
|
||||
|
||||
//if enhanced watchdog, define irq values, create disable macro
|
||||
// if enhanced watchdog, define irq values, create disable macro
|
||||
#if defined(WDIF)
|
||||
#define WD_IRQ 0xC0
|
||||
#define WD_RST_IRQ 0xC8
|
||||
#define WD_DISABLE() do{ \
|
||||
MCUCSR &= ~(1<<WDRF); \
|
||||
WD_SET(WD_OFF); \
|
||||
}while(0)
|
||||
# define WD_IRQ 0xC0
|
||||
# define WD_RST_IRQ 0xC8
|
||||
# define WD_DISABLE() \
|
||||
do { \
|
||||
MCUCSR &= ~(1 << WDRF); \
|
||||
WD_SET(WD_OFF); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
//all watchdogs
|
||||
#define WD_RST 8
|
||||
#define WD_OFF 0
|
||||
// all watchdogs
|
||||
#define WD_RST 8
|
||||
#define WD_OFF 0
|
||||
|
||||
//prescale values
|
||||
#define WDTO_15MS 0
|
||||
#define WDTO_30MS 1
|
||||
#define WDTO_60MS 2
|
||||
#define WDTO_120MS 3
|
||||
#define WDTO_250MS 4
|
||||
#define WDTO_500MS 5
|
||||
#define WDTO_1S 6
|
||||
#define WDTO_2S 7
|
||||
// prescale values
|
||||
#define WDTO_15MS 0
|
||||
#define WDTO_30MS 1
|
||||
#define WDTO_60MS 2
|
||||
#define WDTO_120MS 3
|
||||
#define WDTO_250MS 4
|
||||
#define WDTO_500MS 5
|
||||
#define WDTO_1S 6
|
||||
#define WDTO_2S 7
|
||||
|
||||
//prescale values for avrs with WDP3
|
||||
// prescale values for avrs with WDP3
|
||||
#if defined(WDP3)
|
||||
#define WDTO_4S 0x20
|
||||
#define WDTO_8S 0x21
|
||||
# define WDTO_4S 0x20
|
||||
# define WDTO_8S 0x21
|
||||
#endif
|
||||
|
||||
//watchdog reset
|
||||
#define WDR() __asm__ __volatile__("wdr")
|
||||
// watchdog reset
|
||||
#define WDR() __asm__ __volatile__("wdr")
|
||||
|
||||
//avr reset using watchdog
|
||||
#define WD_AVR_RESET() do{ \
|
||||
__asm__ __volatile__("cli"); \
|
||||
WD_SET_UNSAFE(WD_RST); \
|
||||
while(1); \
|
||||
}while(0)
|
||||
// avr reset using watchdog
|
||||
#define WD_AVR_RESET() \
|
||||
do { \
|
||||
__asm__ __volatile__("cli"); \
|
||||
WD_SET_UNSAFE(WD_RST); \
|
||||
while (1) \
|
||||
; \
|
||||
} while (0)
|
||||
|
||||
/*set the watchdog-
|
||||
1. save SREG
|
||||
|
@ -119,41 +122,40 @@ cleared on every power up or reset, along with disabling the watchdog-
|
|||
5. write watchdog value
|
||||
6. restore SREG (restoring irq status)
|
||||
*/
|
||||
#define WD_SET(val,...) \
|
||||
__asm__ __volatile__( \
|
||||
"in __tmp_reg__,__SREG__" "\n\t" \
|
||||
"cli" "\n\t" \
|
||||
"wdr" "\n\t" \
|
||||
"sts %[wdreg],%[wden]" "\n\t" \
|
||||
"sts %[wdreg],%[wdval]" "\n\t" \
|
||||
"out __SREG__,__tmp_reg__" "\n\t" \
|
||||
: \
|
||||
: [wdreg] "M" (&WDTCSR), \
|
||||
[wden] "r" ((uint8_t)(0x18)), \
|
||||
[wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0))) \
|
||||
: "r0" \
|
||||
)
|
||||
#define WD_SET(val, ...) \
|
||||
__asm__ __volatile__("in __tmp_reg__,__SREG__" \
|
||||
"\n\t" \
|
||||
"cli" \
|
||||
"\n\t" \
|
||||
"wdr" \
|
||||
"\n\t" \
|
||||
"sts %[wdreg],%[wden]" \
|
||||
"\n\t" \
|
||||
"sts %[wdreg],%[wdval]" \
|
||||
"\n\t" \
|
||||
"out __SREG__,__tmp_reg__" \
|
||||
"\n\t" \
|
||||
: \
|
||||
: [ wdreg ] "M"(&WDTCSR), [ wden ] "r"((uint8_t)(0x18)), [ wdval ] "r"((uint8_t)(val | (__VA_ARGS__ + 0))) \
|
||||
: "r0")
|
||||
|
||||
/*set the watchdog when I bit in SREG known to be clear-
|
||||
1. reset watchdog timer
|
||||
2. enable watchdog change
|
||||
5. write watchdog value
|
||||
*/
|
||||
#define WD_SET_UNSAFE(val,...) \
|
||||
__asm__ __volatile__( \
|
||||
"wdr" "\n\t" \
|
||||
"sts %[wdreg],%[wden]" "\n\t" \
|
||||
"sts %[wdreg],%[wdval]" "\n\t" \
|
||||
: \
|
||||
: [wdreg] "M" (&WDTCSR), \
|
||||
[wden] "r" ((uint8_t)(0x18)), \
|
||||
[wdval] "r" ((uint8_t)(val|(__VA_ARGS__+0))) \
|
||||
)
|
||||
|
||||
|
||||
//for compatibility with avr/wdt.h
|
||||
#define wdt_enable(val) WD_SET(WD_RST,val)
|
||||
#define wdt_disable() WD_SET(WD_OFF)
|
||||
#define WD_SET_UNSAFE(val, ...) \
|
||||
__asm__ __volatile__("wdr" \
|
||||
"\n\t" \
|
||||
"sts %[wdreg],%[wden]" \
|
||||
"\n\t" \
|
||||
"sts %[wdreg],%[wdval]" \
|
||||
"\n\t" \
|
||||
: \
|
||||
: [ wdreg ] "M"(&WDTCSR), [ wden ] "r"((uint8_t)(0x18)), [ wdval ] "r"((uint8_t)(val | (__VA_ARGS__ + 0))))
|
||||
|
||||
// for compatibility with avr/wdt.h
|
||||
#define wdt_enable(val) WD_SET(WD_RST, val)
|
||||
#define wdt_disable() WD_SET(WD_OFF)
|
||||
|
||||
#endif /* _AVR_WD_H_ */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue