[Keyboard] Add BIOI Keyboards (#9602)
* Add BIOI Keyboards Add keyboards from BIOI, including dual-mode G60, Morgan65, and S65 * Update keyboards/bioi/g60/config.h Co-authored-by: Ryan <fauxpark@gmail.com> * Update keyboards/bioi/g60/config.h Co-authored-by: Ryan <fauxpark@gmail.com> * Update keyboards/bioi/g60/g60.c Co-authored-by: Ryan <fauxpark@gmail.com> * Update keyboards/bioi/g60/config.h Co-authored-by: Ryan <fauxpark@gmail.com> * Apply suggestions from code review Co-authored-by: Ryan <fauxpark@gmail.com> * Rename rule.mk to rules.mk * Rename rule.mk to rules.mk * Rename rule.mk to rules.mk * Update readme.md * Apply suggestions from code review Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> * Update ble.h * Update config.h Change VenderID to 8101 * Update config.h * Update config.h * Update ble.c * Update ble.h * Add license headers * Apply suggestions from code review Co-authored-by: Drashna Jaelre <drashna@live.com> * Add license header in keymap files * Fix year in license header * Update keyboards/bioi/s65/readme.md Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> Co-authored-by: Ryan <fauxpark@gmail.com> Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com> Co-authored-by: Drashna Jaelre <drashna@live.com>master
parent
46b3245d66
commit
6edbd845eb
|
@ -0,0 +1,220 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <avr/pgmspace.h>
|
||||
#include "report.h"
|
||||
#include "host.h"
|
||||
#include "host_driver.h"
|
||||
#include "keyboard.h"
|
||||
#include "action.h"
|
||||
#include "led.h"
|
||||
|
||||
#include "sendchar.h"
|
||||
#include "debug.h"
|
||||
#ifdef SLEEP_LED_ENABLE
|
||||
#include "sleep_led.h"
|
||||
#endif
|
||||
#include "suspend.h"
|
||||
|
||||
#include "usb_descriptor.h"
|
||||
#include "lufa.h"
|
||||
#include "quantum.h"
|
||||
#include <util/atomic.h>
|
||||
#include "outputselect.h"
|
||||
|
||||
#include "print.h"
|
||||
|
||||
#include "ble.h"
|
||||
#include "usart.h"
|
||||
|
||||
keyboard_config_t ble_config;
|
||||
|
||||
static uint8_t bluefruit_keyboard_leds = 0;
|
||||
|
||||
static void bluefruit_serial_send(uint8_t);
|
||||
|
||||
void send_str(const char *str)
|
||||
{
|
||||
uint8_t c;
|
||||
while ((c = pgm_read_byte(str++)))
|
||||
uart1_putc(c);
|
||||
}
|
||||
|
||||
void serial_send(uint8_t data)
|
||||
{
|
||||
dprintf("Sending: %u\n", data);
|
||||
}
|
||||
|
||||
void send_bytes(uint8_t data)
|
||||
{
|
||||
char hexStr[3];
|
||||
sprintf(hexStr, "%02X", data);
|
||||
for (int j = 0; j < sizeof(hexStr) - 1; j++)
|
||||
{
|
||||
uart1_putc(hexStr[j]);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef BLUEFRUIT_TRACE_SERIAL
|
||||
static void bluefruit_trace_header(void)
|
||||
{
|
||||
dprintf("+------------------------------------+\n");
|
||||
dprintf("| HID report to Bluefruit via serial |\n");
|
||||
dprintf("+------------------------------------+\n|");
|
||||
}
|
||||
|
||||
static void bluefruit_trace_footer(void)
|
||||
{
|
||||
dprintf("|\n+------------------------------------+\n\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
static void bluefruit_serial_send(uint8_t data)
|
||||
{
|
||||
#ifdef BLUEFRUIT_TRACE_SERIAL
|
||||
dprintf(" ");
|
||||
debug_hex8(data);
|
||||
dprintf(" ");
|
||||
#endif
|
||||
serial_send(data);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------*
|
||||
* 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);
|
||||
|
||||
host_driver_t bluefruit_driver = {
|
||||
keyboard_leds,
|
||||
send_keyboard,
|
||||
send_mouse,
|
||||
send_system,
|
||||
send_consumer};
|
||||
|
||||
host_driver_t null_driver = {};
|
||||
|
||||
static uint8_t keyboard_leds(void)
|
||||
{
|
||||
return bluefruit_keyboard_leds;
|
||||
}
|
||||
|
||||
static void send_keyboard(report_keyboard_t *report)
|
||||
{
|
||||
#ifdef BLUEFRUIT_TRACE_SERIAL
|
||||
bluefruit_trace_header();
|
||||
#endif
|
||||
dprintf("Sending...\n");
|
||||
|
||||
send_str(PSTR("AT+BLEKEYBOARDCODE="));
|
||||
|
||||
for (uint8_t i = 0; i < KEYBOARD_EPSIZE; i++)
|
||||
{
|
||||
send_bytes(report->raw[i]);
|
||||
if (i < (KEYBOARD_EPSIZE - 1))
|
||||
{
|
||||
send_str(PSTR("-"));
|
||||
}
|
||||
}
|
||||
|
||||
send_str(PSTR("\r\n"));
|
||||
#ifdef BLUEFRUIT_TRACE_SERIAL
|
||||
bluefruit_trace_footer();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void send_mouse(report_mouse_t *report)
|
||||
{
|
||||
#ifdef BLUEFRUIT_TRACE_SERIAL
|
||||
bluefruit_trace_header();
|
||||
#endif
|
||||
bluefruit_serial_send(0xFD);
|
||||
bluefruit_serial_send(0x00);
|
||||
bluefruit_serial_send(0x03);
|
||||
bluefruit_serial_send(report->buttons);
|
||||
bluefruit_serial_send(report->x);
|
||||
bluefruit_serial_send(report->y);
|
||||
bluefruit_serial_send(report->v); // should try sending the wheel v here
|
||||
bluefruit_serial_send(report->h); // should try sending the wheel h here
|
||||
bluefruit_serial_send(0x00);
|
||||
#ifdef BLUEFRUIT_TRACE_SERIAL
|
||||
bluefruit_trace_footer();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void send_system(uint16_t data)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
+-----------------+-------------------+-------+
|
||||
| Consumer Key | Bit Map | Hex |
|
||||
+-----------------+-------------------+-------+
|
||||
| Home | 00000001 00000000 | 01 00 |
|
||||
| KeyboardLayout | 00000010 00000000 | 02 00 |
|
||||
| Search | 00000100 00000000 | 04 00 |
|
||||
| Snapshot | 00001000 00000000 | 08 00 |
|
||||
| VolumeUp | 00010000 00000000 | 10 00 |
|
||||
| VolumeDown | 00100000 00000000 | 20 00 |
|
||||
| Play/Pause | 01000000 00000000 | 40 00 |
|
||||
| Fast Forward | 10000000 00000000 | 80 00 |
|
||||
| Rewind | 00000000 00000001 | 00 01 |
|
||||
| Scan Next Track | 00000000 00000010 | 00 02 |
|
||||
| Scan Prev Track | 00000000 00000100 | 00 04 |
|
||||
| Random Play | 00000000 00001000 | 00 08 |
|
||||
| Stop | 00000000 00010000 | 00 10 |
|
||||
+-------------------------------------+-------+
|
||||
*/
|
||||
#define CONSUMER2BLUEFRUIT(usage) \
|
||||
(usage == AUDIO_MUTE ? 0x00e2 : (usage == AUDIO_VOL_UP ? 0x00e9 : (usage == AUDIO_VOL_DOWN ? 0x00ea : (usage == TRANSPORT_NEXT_TRACK ? 0x00b5 : (usage == TRANSPORT_PREV_TRACK ? 0x00b6 : (usage == TRANSPORT_STOP ? 0x00b7 : (usage == TRANSPORT_STOP_EJECT ? 0x00b8 : (usage == TRANSPORT_PLAY_PAUSE ? 0x00b1 : (usage == AL_CC_CONFIG ? 0x0183 : (usage == AL_EMAIL ? 0x018c : (usage == AL_CALCULATOR ? 0x0192 : (usage == AL_LOCAL_BROWSER ? 0x0196 : (usage == AC_SEARCH ? 0x021f : (usage == AC_HOME ? 0x0223 : (usage == AC_BACK ? 0x0224 : (usage == AC_FORWARD ? 0x0225 : (usage == AC_STOP ? 0x0226 : (usage == AC_REFRESH ? 0x0227 : (usage == AC_BOOKMARKS ? 0x022a : 0)))))))))))))))))))
|
||||
|
||||
static void send_consumer(uint16_t data)
|
||||
{
|
||||
static uint16_t last_data = 0;
|
||||
if (data == last_data)
|
||||
return;
|
||||
last_data = data;
|
||||
|
||||
uint16_t bitmap = CONSUMER2BLUEFRUIT(data);
|
||||
|
||||
#ifdef BLUEFRUIT_TRACE_SERIAL
|
||||
dprintf("\nData: ");
|
||||
debug_hex16(data);
|
||||
dprintf("; bitmap: ");
|
||||
debug_hex16(bitmap);
|
||||
dprintf("\n");
|
||||
bluefruit_trace_header();
|
||||
#endif
|
||||
send_str(PSTR("AT+BLEHIDCONTROLKEY=0x"));
|
||||
send_bytes((bitmap >> 8) & 0xFF);
|
||||
send_bytes(bitmap & 0xFF);
|
||||
send_str(PSTR("\r\n"));
|
||||
#ifdef BLUEFRUIT_TRACE_SERIAL
|
||||
bluefruit_trace_footer();
|
||||
#endif
|
||||
}
|
||||
|
||||
void usart_init(void)
|
||||
{
|
||||
uart1_init(UART_BAUD_SELECT_DOUBLE_SPEED(76800, 8000000L));
|
||||
wait_ms(250);
|
||||
|
||||
send_str(PSTR("\r\n"));
|
||||
send_str(PSTR("\r\n"));
|
||||
send_str(PSTR("\r\n"));
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "host_driver.h"
|
||||
#include "host.h"
|
||||
|
||||
|
||||
typedef union {
|
||||
uint32_t raw;
|
||||
struct {
|
||||
bool init : 1;
|
||||
};
|
||||
} keyboard_config_t;
|
||||
|
||||
extern keyboard_config_t ble_config;
|
||||
|
||||
extern host_driver_t bluefruit_driver;
|
||||
extern host_driver_t null_driver;
|
||||
|
||||
void send_str(const char *str);
|
||||
void usart_init(void);
|
||||
void module_reset(void);
|
|
@ -0,0 +1,76 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
||||
|
||||
/* USB Device descriptor parameter */
|
||||
|
||||
#define VENDOR_ID 0x8101 // 8101 = "BIOI"
|
||||
#define PRODUCT_ID 0x6080
|
||||
#define DEVICE_VER 0x0001
|
||||
#define MANUFACTURER Basic IO Instruments
|
||||
#define PRODUCT BIOI G60
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 5
|
||||
#define MATRIX_COLS 14
|
||||
|
||||
/*
|
||||
* Keyboard Matrix Assignments
|
||||
*
|
||||
* Change this to how you wired your keyboard
|
||||
* COLS: AVR pins used for columns, left to right
|
||||
* ROWS: AVR pins used for rows, top to bottom
|
||||
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
|
||||
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
|
||||
*
|
||||
*/
|
||||
|
||||
#define MATRIX_ROW_PINS { E6, B0, F1, F5, F4 }
|
||||
#define MATRIX_COL_PINS { F6, F7, B3, C7, C6, B6, B5, D5, B4, D7, D6, D4, D1, D0 }
|
||||
|
||||
/* Backlight Setup */
|
||||
#define BACKLIGHT_PIN B7
|
||||
#define BACKLIGHT_LEVELS 12
|
||||
|
||||
/* COL2ROW or ROW2COL */
|
||||
#define DIODE_DIRECTION COL2ROW
|
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||
#define DEBOUNCE 5
|
||||
|
||||
/* RGB Underglow */
|
||||
#define RGB_DI_PIN B1
|
||||
#define RGBLIGHT_ANIMATIONS
|
||||
#define RGBLED_NUM 8 // Number of LEDs
|
||||
#define RGBLIGHT_HUE_STEP 8
|
||||
#define RGBLIGHT_SAT_STEP 8
|
||||
#define RGBLIGHT_VAL_STEP 8
|
||||
|
||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||
#define LOCKING_SUPPORT_ENABLE
|
||||
/* Locking resynchronize hack */
|
||||
#define LOCKING_RESYNC_ENABLE
|
||||
|
||||
/* key combination for magic key command */
|
||||
#define KEYBOARD_LOCK_ENABLE
|
||||
#define MAGIC_KEY_LOCK L
|
||||
|
||||
#define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 3
|
||||
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "g60.h"
|
||||
|
||||
void keyboard_pre_init_kb(void) {
|
||||
setPinOutput(F0);
|
||||
writePinHigh(F0);
|
||||
keyboard_pre_init_user();
|
||||
}
|
||||
|
||||
bool led_update_kb(led_t led_state) {
|
||||
if (led_update_user(led_state)) {
|
||||
writePin(F0, !led_state.caps_lock);
|
||||
}
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "quantum.h"
|
||||
|
||||
#define ___ KC_NO
|
||||
|
||||
#define LAYOUT_all( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
|
||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K47, K3D, K3C, \
|
||||
K40, K41, K42, K45, K4A, K4B, K48, K4C, K4D \
|
||||
) { \
|
||||
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
|
||||
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
|
||||
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
|
||||
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
|
||||
{ K40, K41, K42, ___, ___, K45, ___, K47, K48, K49, K4A, K4B, K4C, K4D } \
|
||||
}
|
|
@ -0,0 +1,84 @@
|
|||
{
|
||||
"keyboard_name": "BIOI G60",
|
||||
"url": "https://scottywei.github.io/bioi-g60ble/",
|
||||
"maintainer": "scottywei",
|
||||
"width": 15,
|
||||
"height": 5,
|
||||
"layouts": {
|
||||
"LAYOUT_all": {
|
||||
"layout": [
|
||||
{"x": 0, "y": 0},
|
||||
{"x": 1, "y": 0},
|
||||
{"x": 2, "y": 0},
|
||||
{"x": 3, "y": 0},
|
||||
{"x": 4, "y": 0},
|
||||
{"x": 5, "y": 0},
|
||||
{"x": 6, "y": 0},
|
||||
{"x": 7, "y": 0},
|
||||
{"x": 8, "y": 0},
|
||||
{"x": 9, "y": 0},
|
||||
{"x": 10, "y": 0},
|
||||
{"x": 11, "y": 0},
|
||||
{"x": 12, "y": 0},
|
||||
{"x": 13, "y": 0},
|
||||
{"x": 14, "y": 0},
|
||||
|
||||
{"x": 0, "y": 1, "w": 1.5},
|
||||
{"x": 1.5, "y": 1},
|
||||
{"x": 2.5, "y": 1},
|
||||
{"x": 3.5, "y": 1},
|
||||
{"x": 4.5, "y": 1},
|
||||
{"x": 5.5, "y": 1},
|
||||
{"x": 6.5, "y": 1},
|
||||
{"x": 7.5, "y": 1},
|
||||
{"x": 8.5, "y": 1},
|
||||
{"x": 9.5, "y": 1},
|
||||
{"x": 10.5, "y": 1},
|
||||
{"x": 11.5, "y": 1},
|
||||
{"x": 12.5, "y": 1},
|
||||
{"x": 13.5, "y": 1, "w": 1.5},
|
||||
|
||||
{"x": 0, "y": 2, "w": 1.75},
|
||||
{"x": 1.75, "y": 2},
|
||||
{"x": 2.75, "y": 2},
|
||||
{"x": 3.75, "y": 2},
|
||||
{"x": 4.75, "y": 2},
|
||||
{"x": 5.75, "y": 2},
|
||||
{"x": 6.75, "y": 2},
|
||||
{"x": 7.75, "y": 2},
|
||||
{"x": 8.75, "y": 2},
|
||||
{"x": 9.75, "y": 2},
|
||||
{"x": 10.75, "y": 2},
|
||||
{"x": 11.75, "y": 2},
|
||||
{"x": 12.75, "y": 2},
|
||||
{"x": 13.75, "y": 2, "w": 1.25},
|
||||
|
||||
{"x": 0, "y": 3},
|
||||
{"x": 1, "y": 3},
|
||||
{"x": 2, "y": 3},
|
||||
{"x": 3, "y": 3},
|
||||
{"x": 4, "y": 3},
|
||||
{"x": 5, "y": 3},
|
||||
{"x": 6, "y": 3},
|
||||
{"x": 7, "y": 3},
|
||||
{"x": 8, "y": 3},
|
||||
{"x": 9, "y": 3},
|
||||
{"x": 10, "y": 3},
|
||||
{"x": 11, "y": 3},
|
||||
{"x": 12, "y": 3},
|
||||
{"x": 13, "y": 3},
|
||||
{"x": 14, "y": 3},
|
||||
|
||||
{"x": 0, "y": 4, "w": 1.25},
|
||||
{"x": 1.25, "y": 4, "w": 1.25},
|
||||
{"x": 2.5, "y": 4, "w": 1.25},
|
||||
{"x": 3.75, "y": 4, "w": 6.25},
|
||||
{"x": 10, "y": 4},
|
||||
{"x": 11, "y": 4},
|
||||
{"x": 12, "y": 4},
|
||||
{"x": 13, "y": 4},
|
||||
{"x": 14, "y": 4}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
/* Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
// 0: Base Layer
|
||||
LAYOUT_all(
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_GRV,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
|
||||
KC_CAPSLOCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NONUS_HASH, KC_ENT,
|
||||
KC_LSFT, KC_NONUS_BSLASH, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, MO(1),
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_LEFT, KC_APP, KC_RCTRL),
|
||||
|
||||
// 1: Function Layer
|
||||
LAYOUT_all(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
|
||||
RESET, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
KC_LSFT, _______, RGB_TOG, RGB_MOD, BL_TOGG, BL_STEP, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
LAYOUT_all(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
LAYOUT_all(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
};
|
|
@ -0,0 +1,51 @@
|
|||
/* Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
// 0: Base Layer
|
||||
[0] = LAYOUT_all(
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_GRV,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
|
||||
KC_CAPSLOCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NONUS_HASH, KC_ENT,
|
||||
KC_LSFT, KC_NONUS_BSLASH, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_RSFT, MO(1),
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_LEFT, KC_APP, KC_RCTRL),
|
||||
|
||||
// 1: Function Layer
|
||||
[1] = LAYOUT_all(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
|
||||
RESET, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
KC_LSFT, _______, RGB_TOG, RGB_MOD, BL_TOGG, BL_STEP, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
[2] = LAYOUT_all(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
[3] = LAYOUT_all(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
};
|
|
@ -0,0 +1 @@
|
|||
VIA_ENABLE = yes
|
|
@ -0,0 +1,15 @@
|
|||
# Basic I/O Instruments G60
|
||||
|
||||
![BIOI G60](https://raw.githubusercontent.com/yilihong/alf/gh-pages/assets/img/g60/g60_gb/1.jpg)
|
||||
|
||||
Inspired by the design of the Cherry G80 series, the G60 is a 60% USB/Bluetooth dual-mode custom keyboard.
|
||||
|
||||
* Keyboard Maintainer: [Basic I/O Instruments (Scott Wei)](https://github.com/scottywei)
|
||||
* Hardware Supported: [BIOI G60BLE PCB](https://scottywei.github.io/bioi-g60ble/)
|
||||
* Hardware Availability: [BIOI Taobao Store](https://item.taobao.com/item.htm?&id=611933113439) / [Playkeyboard](https://play-keyboard.store/products/bioi-g60ble-pcb-default-version-custom-60-bluetooth-pcb)
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make bioi/g60:default
|
||||
|
||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
|
@ -0,0 +1,36 @@
|
|||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Processor frequency
|
||||
F_CPU = 8000000
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = qmk-dfu
|
||||
|
||||
SRC += ../usart.c \
|
||||
../ble.c \
|
||||
../main.c
|
||||
|
||||
OPT_DEFS += -DPROTOCOL_BLE
|
||||
OPT_DEFS += -DUART_RX1_BUFFER_SIZE=16 -DUART_TX1_BUFFER_SIZE=16
|
||||
OPT_DEFS += -DUSART1_ENABLED
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
|
||||
MOUSEKEY_ENABLE = no # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
LTO_ENABLE = yes # Reduce firmware size
|
||||
|
||||
VIA_ENABLE = yes # VIA support should be enabled here due to the main() loop will be compiled first.
|
|
@ -0,0 +1,389 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <avr/pgmspace.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
#include "report.h"
|
||||
#include "host.h"
|
||||
#include "host_driver.h"
|
||||
#include "keyboard.h"
|
||||
#include "action.h"
|
||||
#include "led.h"
|
||||
#include "sendchar.h"
|
||||
#include "debug.h"
|
||||
#include "print.h"
|
||||
#ifdef SLEEP_LED_ENABLE
|
||||
#include "sleep_led.h"
|
||||
#endif
|
||||
#include "suspend.h"
|
||||
|
||||
#include "usb_descriptor.h"
|
||||
#include "lufa.h"
|
||||
#include "quantum.h"
|
||||
#include <util/atomic.h>
|
||||
#include "outputselect.h"
|
||||
|
||||
#ifdef NKRO_ENABLE
|
||||
#include "keycode_config.h"
|
||||
|
||||
extern keymap_config_t keymap_config;
|
||||
#endif
|
||||
|
||||
#ifdef AUDIO_ENABLE
|
||||
#include <audio.h>
|
||||
#endif
|
||||
|
||||
#ifdef BLUETOOTH_ENABLE
|
||||
#ifdef MODULE_ADAFRUIT_BLE
|
||||
#include "adafruit_ble.h"
|
||||
#else
|
||||
#include "bluetooth.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef VIRTSER_ENABLE
|
||||
#include "virtser.h"
|
||||
#endif
|
||||
|
||||
#if (defined(RGB_MIDI) | defined(RGBLIGHT_ANIMATIONS)) & defined(RGBLIGHT_ENABLE)
|
||||
#include "rgblight.h"
|
||||
#endif
|
||||
|
||||
#ifdef MIDI_ENABLE
|
||||
#include "qmk_midi.h"
|
||||
#endif
|
||||
|
||||
#ifdef RAW_ENABLE
|
||||
#include "raw_hid.h"
|
||||
#endif
|
||||
|
||||
#include "ble.h"
|
||||
#include "usart.h"
|
||||
|
||||
#include <avr/power.h>
|
||||
#include <avr/sleep.h>
|
||||
|
||||
bool force_usb = false; //Reserved for FORCE USB Mode function.
|
||||
bool force_ble = false; //Reserved for FORCE USB Mode function.
|
||||
|
||||
bool usb_connected = false;
|
||||
bool ble_enabled = false;
|
||||
|
||||
uint32_t kb_idle_timer = 0;
|
||||
|
||||
bool usb_state_sent = false;
|
||||
|
||||
uint8_t USB_DeviceLastState = 0;
|
||||
|
||||
#ifdef RAW_ENABLE
|
||||
/** \brief Raw HID Task
|
||||
*
|
||||
* FIXME: Needs doc
|
||||
*/
|
||||
static void raw_hid_task(void)
|
||||
{
|
||||
// Create a temporary buffer to hold the read in data from the host
|
||||
uint8_t data[RAW_EPSIZE];
|
||||
bool data_read = false;
|
||||
|
||||
// Device must be connected and configured for the task to run
|
||||
if (USB_DeviceState != DEVICE_STATE_Configured)
|
||||
return;
|
||||
|
||||
Endpoint_SelectEndpoint(RAW_OUT_EPNUM);
|
||||
|
||||
// Check to see if a packet has been sent from the host
|
||||
if (Endpoint_IsOUTReceived())
|
||||
{
|
||||
// Check to see if the packet contains data
|
||||
if (Endpoint_IsReadWriteAllowed())
|
||||
{
|
||||
/* Read data */
|
||||
Endpoint_Read_Stream_LE(data, sizeof(data), NULL);
|
||||
data_read = true;
|
||||
}
|
||||
|
||||
// Finalize the stream transfer to receive the last packet
|
||||
Endpoint_ClearOUT();
|
||||
|
||||
if (data_read)
|
||||
{
|
||||
raw_hid_receive(data, sizeof(data));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void setup_mcu(void)
|
||||
{
|
||||
/* Disable watchdog if enabled by bootloader/fuses */
|
||||
MCUSR &= ~(1 << WDRF);
|
||||
wdt_disable();
|
||||
|
||||
CLKPR = (1 << CLKPCE);
|
||||
CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0);
|
||||
}
|
||||
|
||||
static void setup_usb(void)
|
||||
{
|
||||
// Leonardo needs. Without this USB device is not recognized.
|
||||
USB_Disable();
|
||||
|
||||
USB_Init();
|
||||
|
||||
// for Console_Task
|
||||
USB_Device_EnableSOFEvents();
|
||||
print_set_sendchar(sendchar);
|
||||
}
|
||||
|
||||
void power_saving(void)
|
||||
{
|
||||
power_adc_disable();
|
||||
power_usart0_disable();
|
||||
power_spi_disable();
|
||||
power_twi_disable();
|
||||
|
||||
USBCON |= (1 << FRZCLK); // Freeze the USB Clock
|
||||
PLLCSR &= ~(1 << PLLE); // Disable the USB Clock (PPL)
|
||||
USBCON &= ~(1 << USBE);
|
||||
}
|
||||
|
||||
void power_recover(void)
|
||||
{
|
||||
|
||||
USBCON |= (1 << USBE);
|
||||
PLLCSR |= (1 << PLLE); // Resume the USB Clock (PPL)
|
||||
USBCON &= ~(1 << FRZCLK); // Resume the USB Clock
|
||||
|
||||
power_adc_enable();
|
||||
power_usart0_enable();
|
||||
power_spi_enable();
|
||||
power_twi_enable();
|
||||
}
|
||||
|
||||
void ble_task_init(void)
|
||||
{
|
||||
kb_idle_timer = timer_read32(); //Mark current time, reserved for further usage;
|
||||
}
|
||||
|
||||
void ble_task(void)
|
||||
{
|
||||
|
||||
if (USB_DeviceLastState != USB_DeviceState)
|
||||
{
|
||||
usb_state_sent = false;
|
||||
#ifdef BLE_DEBUG
|
||||
send_str(PSTR("USB State Changed\r\n"));
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
{
|
||||
send_str(PSTR("USB State Unattached\r\n"));
|
||||
}
|
||||
#endif
|
||||
if (USB_DeviceState == DEVICE_STATE_Powered)
|
||||
{
|
||||
#ifdef BLE_DEBUG
|
||||
send_str(PSTR("USB State Powered\r\n"));
|
||||
#endif
|
||||
power_recover();
|
||||
host_set_driver(&null_driver);
|
||||
}
|
||||
#ifdef BLE_DEBUG
|
||||
if ((USB_DeviceState == DEVICE_STATE_Default))
|
||||
{
|
||||
send_str(PSTR("USB State Default\r\n"));
|
||||
}
|
||||
if ((USB_DeviceState == DEVICE_STATE_Addressed))
|
||||
{
|
||||
send_str(PSTR("USB State Addressed\r\n"));
|
||||
}
|
||||
if (USB_DeviceState == DEVICE_STATE_Configured)
|
||||
{
|
||||
send_str(PSTR("USB State Configured\r\n"));
|
||||
}
|
||||
if (USB_DeviceState > DEVICE_STATE_Unattached)
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef BLE_DEBUG
|
||||
if (!usb_state_sent)
|
||||
{
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
{
|
||||
send_str(PSTR("USB State Stopped at Unattached\r\n"));
|
||||
}
|
||||
if (USB_DeviceState == DEVICE_STATE_Powered)
|
||||
{
|
||||
send_str(PSTR("USB State Stopped at Powered\r\n"));
|
||||
}
|
||||
if ((USB_DeviceState == DEVICE_STATE_Default))
|
||||
{
|
||||
send_str(PSTR("USB State Stopped at Default\r\n"));
|
||||
}
|
||||
if ((USB_DeviceState == DEVICE_STATE_Addressed))
|
||||
{
|
||||
send_str(PSTR("USB State Stopped at Addressed\r\n"));
|
||||
}
|
||||
if (USB_DeviceState == DEVICE_STATE_Configured)
|
||||
{
|
||||
send_str(PSTR("USB State Stopped at Configured\r\n"));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (USB_DeviceState == DEVICE_STATE_Unattached)
|
||||
{
|
||||
if (host_get_driver() && host_get_driver() != &bluefruit_driver)
|
||||
{
|
||||
#ifdef BLE_DEBUG
|
||||
send_str(PSTR("USB State stopped at Unattached\r\n"));
|
||||
#endif
|
||||
ble_task_init();
|
||||
|
||||
force_usb = 0;
|
||||
usb_connected = 0;
|
||||
|
||||
//Reinit USB to prepare for next connection.
|
||||
USB_Init();
|
||||
USB_Detach();
|
||||
USB_Attach();
|
||||
|
||||
#ifdef BLE_DEBUG
|
||||
send_str(PSTR("Loading &bluefruit_driver\r\n"));
|
||||
#endif
|
||||
host_set_driver(&bluefruit_driver);
|
||||
clear_keyboard();
|
||||
power_saving();
|
||||
}
|
||||
else
|
||||
{
|
||||
//Do nothing if USB is unattached and the driver is &bluefruit_driver
|
||||
}
|
||||
}
|
||||
if (USB_DeviceState == DEVICE_STATE_Configured)
|
||||
{
|
||||
if (host_get_driver() && host_get_driver() != &lufa_driver)
|
||||
{
|
||||
#ifdef BLE_DEBUG
|
||||
send_str(PSTR("USB State stopped at Configured\r\n"));
|
||||
#endif
|
||||
power_recover();
|
||||
|
||||
usb_connected = 1;
|
||||
ble_enabled = 0;
|
||||
#ifdef BLE_DEBUG
|
||||
send_str(PSTR("Loading &lufa_driver\r\n"));
|
||||
#endif
|
||||
host_set_driver(&lufa_driver);
|
||||
clear_keyboard();
|
||||
}
|
||||
else
|
||||
{
|
||||
//Do nothing if the driver is &lufa_driver
|
||||
}
|
||||
}
|
||||
|
||||
usb_state_sent = true;
|
||||
}
|
||||
|
||||
USB_DeviceLastState = USB_DeviceState;
|
||||
}
|
||||
|
||||
// Use a custom main() function because the task logic is different from the common one.
|
||||
int main(void)
|
||||
{
|
||||
#ifdef MIDI_ENABLE
|
||||
setup_midi();
|
||||
#endif
|
||||
|
||||
setup_mcu();
|
||||
|
||||
keyboard_setup();
|
||||
|
||||
setup_usb();
|
||||
sei();
|
||||
|
||||
#if defined(MODULE_ADAFRUIT_EZKEY) || defined(MODULE_RN42)
|
||||
serial_init();
|
||||
#endif
|
||||
|
||||
/* wait for USB startup to get ready for debug output */
|
||||
uint8_t timeout = 255; // timeout when USB is not available(Bluetooth)
|
||||
while (timeout-- && USB_DeviceState != DEVICE_STATE_Configured)
|
||||
{
|
||||
wait_ms(4);
|
||||
#if defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
;
|
||||
#else
|
||||
USB_USBTask();
|
||||
#endif
|
||||
}
|
||||
|
||||
print("\nUSB init\n");
|
||||
|
||||
keyboard_init();
|
||||
host_set_driver(&lufa_driver);
|
||||
|
||||
backlight_disable();
|
||||
//host_set_driver(&lufa_driver);
|
||||
print("Keyboard initialized.\n");
|
||||
|
||||
//Init Hardware UART
|
||||
usart_init();
|
||||
|
||||
#ifdef BLE_DEBUG
|
||||
send_str(PSTR("Keyboard has been setup up\r\n"));
|
||||
|
||||
if (usb_connected)
|
||||
{
|
||||
send_str(PSTR("usb_connected=1\r\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
send_str(PSTR("usb_connected=0\r\n"));
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SLEEP_LED_ENABLE
|
||||
sleep_led_init();
|
||||
#endif
|
||||
|
||||
#ifdef VIRTSER_ENABLE
|
||||
virtser_init();
|
||||
#endif
|
||||
|
||||
while (1)
|
||||
{
|
||||
ble_task();
|
||||
keyboard_task();
|
||||
|
||||
#ifdef RAW_ENABLE
|
||||
raw_hid_task();
|
||||
#endif
|
||||
|
||||
#if defined(RGBLIGHT_ANIMATIONS) && defined(RGBLIGHT_ENABLE)
|
||||
rgblight_task();
|
||||
#endif
|
||||
|
||||
#if !defined(INTERRUPT_CONTROL_ENDPOINT)
|
||||
USB_USBTask();
|
||||
#endif
|
||||
}
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
||||
|
||||
/* USB Device descriptor parameter */
|
||||
|
||||
#define VENDOR_ID 0x8101 // 8101 = "BIOI"
|
||||
#define PRODUCT_ID 0x6581
|
||||
#define DEVICE_VER 0x0001
|
||||
#define MANUFACTURER Basic IO Instruments
|
||||
#define PRODUCT BIOI MORGAN65
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 5
|
||||
#define MATRIX_COLS 14
|
||||
|
||||
/*
|
||||
* Keyboard Matrix Assignments
|
||||
*
|
||||
* Change this to how you wired your keyboard
|
||||
* COLS: AVR pins used for columns, left to right
|
||||
* ROWS: AVR pins used for rows, top to bottom
|
||||
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
|
||||
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
|
||||
*
|
||||
*/
|
||||
|
||||
#define MATRIX_ROW_PINS { E6, C6, F4, B2, D4 }
|
||||
#define MATRIX_COL_PINS { F5, F6, F7, C7, B0, B7, B5, D5, B4, D7, D6, D1, D0, B3 }
|
||||
|
||||
//#define QMK_KEYS_PER_SCAN 4
|
||||
|
||||
/* Backlight Setup */
|
||||
#define BACKLIGHT_PIN B6
|
||||
#define BACKLIGHT_LEVELS 12
|
||||
|
||||
/* COL2ROW or ROW2COL */
|
||||
#define DIODE_DIRECTION COL2ROW
|
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||
#define DEBOUNCE 5
|
||||
|
||||
/* RGB Underglow */
|
||||
#define RGB_DI_PIN B1
|
||||
#define RGBLIGHT_ANIMATIONS
|
||||
#define RGBLED_NUM 8 // Number of LEDs
|
||||
#define RGBLIGHT_HUE_STEP 8
|
||||
#define RGBLIGHT_SAT_STEP 8
|
||||
#define RGBLIGHT_VAL_STEP 8
|
||||
|
||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||
#define LOCKING_SUPPORT_ENABLE
|
||||
/* Locking resynchronize hack */
|
||||
#define LOCKING_RESYNC_ENABLE
|
||||
|
||||
/* key combination for magic key command */
|
||||
#define KEYBOARD_LOCK_ENABLE
|
||||
#define MAGIC_KEY_LOCK L
|
||||
|
||||
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
|
|
@ -0,0 +1,88 @@
|
|||
{
|
||||
"keyboard_name": "Morgan65",
|
||||
"url": "",
|
||||
"maintainer": "scottywei",
|
||||
"width": 16,
|
||||
"height": 5,
|
||||
"layouts": {
|
||||
"LAYOUT_all": {
|
||||
"layout": [
|
||||
{"x": 0, "y": 0},
|
||||
{"x": 1, "y": 0},
|
||||
{"x": 2, "y": 0},
|
||||
{"x": 3, "y": 0},
|
||||
{"x": 4, "y": 0},
|
||||
{"x": 5, "y": 0},
|
||||
{"x": 6, "y": 0},
|
||||
{"x": 7, "y": 0},
|
||||
{"x": 8, "y": 0},
|
||||
{"x": 9, "y": 0},
|
||||
{"x": 10, "y": 0},
|
||||
{"x": 11, "y": 0},
|
||||
{"x": 12, "y": 0},
|
||||
{"x": 13, "y": 0},
|
||||
{"x": 14, "y": 0},
|
||||
{"x": 15, "y": 0},
|
||||
|
||||
{"x": 0, "y": 1, "w": 1.5},
|
||||
{"x": 1.5, "y": 1},
|
||||
{"x": 2.5, "y": 1},
|
||||
{"x": 3.5, "y": 1},
|
||||
{"x": 4.5, "y": 1},
|
||||
{"x": 5.5, "y": 1},
|
||||
{"x": 6.5, "y": 1},
|
||||
{"x": 7.5, "y": 1},
|
||||
{"x": 8.5, "y": 1},
|
||||
{"x": 9.5, "y": 1},
|
||||
{"x": 10.5, "y": 1},
|
||||
{"x": 11.5, "y": 1},
|
||||
{"x": 12.5, "y": 1},
|
||||
{"x": 13.5, "y": 1, "w": 1.5},
|
||||
{"x": 15, "y": 1},
|
||||
|
||||
{"x": 0, "y": 2, "w": 1.75},
|
||||
{"x": 1.75, "y": 2},
|
||||
{"x": 2.75, "y": 2},
|
||||
{"x": 3.75, "y": 2},
|
||||
{"x": 4.75, "y": 2},
|
||||
{"x": 5.75, "y": 2},
|
||||
{"x": 6.75, "y": 2},
|
||||
{"x": 7.75, "y": 2},
|
||||
{"x": 8.75, "y": 2},
|
||||
{"x": 9.75, "y": 2},
|
||||
{"x": 10.75, "y": 2},
|
||||
{"x": 11.75, "y": 2},
|
||||
{"x": 12.75, "y": 2},
|
||||
{"x": 13.75, "y": 2, "w": 1.25},
|
||||
{"x": 15, "y": 2},
|
||||
|
||||
{"x": 0, "y": 3, "w": 1.25},
|
||||
{"x": 1.25, "y": 3},
|
||||
{"x": 2.25, "y": 3},
|
||||
{"x": 3.25, "y": 3},
|
||||
{"x": 4.25, "y": 3},
|
||||
{"x": 5.25, "y": 3},
|
||||
{"x": 6.25, "y": 3},
|
||||
{"x": 7.25, "y": 3},
|
||||
{"x": 8.25, "y": 3},
|
||||
{"x": 9.25, "y": 3},
|
||||
{"x": 10.25, "y": 3},
|
||||
{"x": 11.25, "y": 3},
|
||||
{"x": 12.25, "y": 3, "w": 1.75},
|
||||
{"x": 14, "y": 3},
|
||||
{"x": 15, "y": 3},
|
||||
|
||||
{"x": 0, "y": 4, "w": 1.25},
|
||||
{"x": 1.25, "y": 4, "w": 1.25},
|
||||
{"x": 2.5, "y": 4, "w": 1.25},
|
||||
{"x": 3.75, "y": 4, "w": 6.25},
|
||||
{"x": 10, "y": 4, "w": 1.25},
|
||||
{"x": 11.25, "y": 4, "w": 1.25},
|
||||
|
||||
{"x": 13, "y": 4},
|
||||
{"x": 14, "y": 4},
|
||||
{"x": 15, "y": 4}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
/* Copyright 2020 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
// 0: Base Layer
|
||||
[0] = LAYOUT_all(
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_GRV, KC_F1,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_F2,
|
||||
KC_CAPSLOCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NONUS_HASH, KC_ENT, KC_F3,
|
||||
KC_LSFT, KC_NONUS_BSLASH, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_F4,
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
|
||||
|
||||
// 1: Function Layer
|
||||
[1] = LAYOUT_all(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______,
|
||||
RESET, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
KC_LSFT, _______, RGB_TOG, RGB_MOD, BL_TOGG, BL_STEP, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
[2] = LAYOUT_all(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
[3] = LAYOUT_all(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
};
|
|
@ -0,0 +1,51 @@
|
|||
/* Copyright 2020 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
// 0: Base Layer
|
||||
[0] = LAYOUT_all(
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_GRV, KC_F1,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_F2,
|
||||
KC_CAPSLOCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NONUS_HASH, KC_ENT, KC_F3,
|
||||
KC_LSFT, KC_NONUS_BSLASH, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_F4,
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
|
||||
|
||||
// 1: Function Layer
|
||||
[1] = LAYOUT_all(
|
||||
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______,
|
||||
RESET, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
KC_LSFT, _______, RGB_TOG, RGB_MOD, BL_TOGG, BL_STEP, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
[2] = LAYOUT_all(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
[3] = LAYOUT_all(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
};
|
|
@ -0,0 +1 @@
|
|||
VIA_ENABLE = yes
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "morgan65.h"
|
||||
|
||||
void keyboard_pre_init_kb(void) {
|
||||
setPinOutput(F0);
|
||||
writePinHigh(F0);
|
||||
keyboard_pre_init_user();
|
||||
}
|
||||
|
||||
bool led_update_kb(led_t led_state) {
|
||||
if (led_update_user(led_state)) {
|
||||
writePin(F0, !led_state.caps_lock);
|
||||
}
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "quantum.h"
|
||||
|
||||
#define ___ KC_NO
|
||||
|
||||
#define LAYOUT_all( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49, K43, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K44, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K47, \
|
||||
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K48, \
|
||||
K40, K41, K42, K45, K46, K4A, K4B, K4C, K4D \
|
||||
) { \
|
||||
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
|
||||
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
|
||||
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
|
||||
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
|
||||
{ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D } \
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
# Morgan65
|
||||
|
||||
![Morgan65](https://img.zfrontier.com/post/20200408/lucKXngFL3Xr8hP2zoLnGNK4jH8C?imageView2/2/format/webp)
|
||||
|
||||
Morgan65 is a 65% custom keyboard by DT Studio, powered by an USB/Bluetooth dual-mode PCB from Basic I/O Instruments.
|
||||
|
||||
* Keyboard Maintainer: [Basic I/O Instruments (Scott Wei)](https://github.com/scottywei)
|
||||
* Hardware Supported: Morgan65 PCB
|
||||
* Hardware Availability: N/A
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make bioi/morgan65:default
|
||||
|
||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
|
@ -0,0 +1,36 @@
|
|||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Processor frequency
|
||||
F_CPU = 8000000
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = qmk-dfu
|
||||
|
||||
SRC += ../usart.c \
|
||||
../ble.c \
|
||||
../main.c
|
||||
|
||||
OPT_DEFS += -DPROTOCOL_BLE
|
||||
OPT_DEFS += -DUART_RX1_BUFFER_SIZE=16 -DUART_TX1_BUFFER_SIZE=16
|
||||
OPT_DEFS += -DUSART1_ENABLED
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
|
||||
MOUSEKEY_ENABLE = no # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = no # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
LTO_ENABLE = yes # Reduce firmware size
|
||||
|
||||
VIA_ENABLE = yes # VIA support should be enabled here due to the main() loop will be compiled first.
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "config_common.h"
|
||||
|
||||
/* USB Device descriptor parameter */
|
||||
#define VENDOR_ID 0x8101 // 8101 = "BIOI"
|
||||
#define PRODUCT_ID 0x5365 // "S"65
|
||||
#define DEVICE_VER 0x0001
|
||||
#define MANUFACTURER Basic IO Instruments
|
||||
#define PRODUCT BIOI S65
|
||||
|
||||
|
||||
/* key matrix size */
|
||||
#define MATRIX_ROWS 5
|
||||
#define MATRIX_COLS 16
|
||||
|
||||
/*
|
||||
* Keyboard Matrix Assignments
|
||||
*
|
||||
* Change this to how you wired your keyboard
|
||||
* COLS: AVR pins used for columns, left to right
|
||||
* ROWS: AVR pins used for rows, top to bottom
|
||||
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
|
||||
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
|
||||
*
|
||||
*/
|
||||
|
||||
#define MATRIX_ROW_PINS { D2, D0, D1, F7, D6 }
|
||||
#define MATRIX_COL_PINS { F1, B3, F4, F5, F6, E6, C7, B2, B1, C6, B6, B5, B4, D7, D4, D5 }
|
||||
|
||||
|
||||
/* Backlight Setup */
|
||||
#define BACKLIGHT_PIN B6
|
||||
#define BACKLIGHT_LEVELS 12
|
||||
|
||||
/* COL2ROW or ROW2COL */
|
||||
#define DIODE_DIRECTION COL2ROW
|
||||
|
||||
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
|
||||
#define DEBOUNCE 5
|
||||
|
||||
/* RGB Underglow */
|
||||
#define RGB_DI_PIN D3
|
||||
#define RGBLIGHT_ANIMATIONS
|
||||
#define RGBLED_NUM 8
|
||||
#define RGBLIGHT_HUE_STEP 8
|
||||
#define RGBLIGHT_SAT_STEP 8
|
||||
#define RGBLIGHT_VAL_STEP 8
|
||||
|
||||
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
|
||||
#define LOCKING_SUPPORT_ENABLE
|
||||
/* Locking resynchronize hack */
|
||||
#define LOCKING_RESYNC_ENABLE
|
||||
|
||||
/* key combination for magic key command */
|
||||
#define KEYBOARD_LOCK_ENABLE
|
||||
#define MAGIC_KEY_LOCK L
|
|
@ -0,0 +1,94 @@
|
|||
{
|
||||
"keyboard_name": "BIOI S65",
|
||||
"url": "",
|
||||
"maintainer": "scottywei",
|
||||
"width": 18.25,
|
||||
"height": 5,
|
||||
"layouts": {
|
||||
"LAYOUT_all": {
|
||||
"layout": [
|
||||
{"x": 0, "y": 0},
|
||||
{"x": 1, "y": 0},
|
||||
{"x": 2, "y": 0},
|
||||
{"x": 3, "y": 0},
|
||||
{"x": 4, "y": 0},
|
||||
{"x": 5, "y": 0},
|
||||
{"x": 6, "y": 0},
|
||||
{"x": 7, "y": 0},
|
||||
{"x": 8, "y": 0},
|
||||
{"x": 9, "y": 0},
|
||||
{"x": 10, "y": 0},
|
||||
{"x": 11, "y": 0},
|
||||
{"x": 12, "y": 0},
|
||||
{"x": 13, "y": 0, "w": 2},
|
||||
|
||||
{"x": 15.25, "y": 0},
|
||||
{"x": 16.25, "y": 0},
|
||||
{"x": 17.25, "y": 0},
|
||||
|
||||
{"x": 0, "y": 1, "w": 1.5},
|
||||
{"x": 1.5, "y": 1},
|
||||
{"x": 2.5, "y": 1},
|
||||
{"x": 3.5, "y": 1},
|
||||
{"x": 4.5, "y": 1},
|
||||
{"x": 5.5, "y": 1},
|
||||
{"x": 6.5, "y": 1},
|
||||
{"x": 7.5, "y": 1},
|
||||
{"x": 8.5, "y": 1},
|
||||
{"x": 9.5, "y": 1},
|
||||
{"x": 10.5, "y": 1},
|
||||
{"x": 11.5, "y": 1},
|
||||
{"x": 12.5, "y": 1},
|
||||
{"x": 13.5, "y": 1, "w": 1.5},
|
||||
|
||||
{"x": 15.25, "y": 1},
|
||||
{"x": 16.25, "y": 1},
|
||||
{"x": 17.25, "y": 1},
|
||||
|
||||
{"x": 0, "y": 2, "w": 1.75},
|
||||
{"x": 1.75, "y": 2},
|
||||
{"x": 2.75, "y": 2},
|
||||
{"x": 3.75, "y": 2},
|
||||
{"x": 4.75, "y": 2},
|
||||
{"x": 5.75, "y": 2},
|
||||
{"x": 6.75, "y": 2},
|
||||
{"x": 7.75, "y": 2},
|
||||
{"x": 8.75, "y": 2},
|
||||
{"x": 9.75, "y": 2},
|
||||
{"x": 10.75, "y": 2},
|
||||
{"x": 11.75, "y": 2},
|
||||
{"x": 12.75, "y": 2},
|
||||
{"x": 13.75, "y": 2, "w": 1.25},
|
||||
|
||||
{"x": 0, "y": 3, "w": 2.25},
|
||||
{"x": 2.25, "y": 3},
|
||||
{"x": 3.25, "y": 3},
|
||||
{"x": 4.25, "y": 3},
|
||||
{"x": 5.25, "y": 3},
|
||||
{"x": 6.25, "y": 3},
|
||||
{"x": 7.25, "y": 3},
|
||||
{"x": 8.25, "y": 3},
|
||||
{"x": 9.25, "y": 3},
|
||||
{"x": 10.25, "y": 3},
|
||||
{"x": 11.25, "y": 3},
|
||||
{"x": 12.25, "y": 3, "w": 1.75},
|
||||
{"x": 14, "y": 3},
|
||||
|
||||
{"x": 16.25, "y": 3},
|
||||
|
||||
{"x": 0, "y": 4, "w": 1.25},
|
||||
{"x": 1.25, "y": 4, "w": 1.25},
|
||||
{"x": 2.5, "y": 4, "w": 1.25},
|
||||
{"x": 3.75, "y": 4, "w": 6.25},
|
||||
{"x": 10, "y": 4, "w": 1.25},
|
||||
{"x": 11.25, "y": 4, "w": 1.25},
|
||||
{"x": 12.5, "y": 4, "w": 1.25},
|
||||
{"x": 13.75, "y": 4, "w": 1.25},
|
||||
|
||||
{"x": 15.25, "y": 4},
|
||||
{"x": 16.25, "y": 4},
|
||||
{"x": 17.25, "y": 4}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
/* Copyright 2020 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
// 0: Base LayerKC_W
|
||||
[0] = LAYOUT_all(
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_INS, KC_HOME, KC_PGUP,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NONUS_HASH, KC_ENT,
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), KC_UP,
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
|
||||
|
||||
// 1: Function Layer
|
||||
[1] = LAYOUT_all(
|
||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_PSCR, KC_SLCK, KC_PAUS,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
|
||||
};
|
|
@ -0,0 +1,51 @@
|
|||
/* Copyright 2020 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include QMK_KEYBOARD_H
|
||||
|
||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||
|
||||
// 0: Base LayerKC_W
|
||||
[0] = LAYOUT_all(
|
||||
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPACE, KC_INS, KC_HOME, KC_PGUP,
|
||||
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
|
||||
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NONUS_HASH, KC_ENT,
|
||||
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1), KC_UP,
|
||||
KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
|
||||
|
||||
// 1: Function Layer
|
||||
[1] = LAYOUT_all(
|
||||
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_PSCR, KC_SLCK, KC_PAUS,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
[2] = LAYOUT_all(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
[3] = LAYOUT_all(
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
|
||||
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
|
||||
|
||||
};
|
|
@ -0,0 +1 @@
|
|||
VIA_ENABLE = yes
|
|
@ -0,0 +1,15 @@
|
|||
# S65
|
||||
|
||||
![S65](https://img.zfrontier.com/post/20200514/FucHmQHc4zv7NG68UnDMlpOS798l?imageView2/2/format/webp)
|
||||
|
||||
A tenkeyless keyboard without the F row.
|
||||
|
||||
* Keyboard Maintainer: [Basic I/O Instruments (Scott Wei)](https://github.com/scottywei)
|
||||
* Hardware Supported: S65 PCB
|
||||
* Hardware Availability: Coming soon
|
||||
|
||||
Make example for this keyboard (after setting up your build environment):
|
||||
|
||||
make bioi/s65:default
|
||||
|
||||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
|
|
@ -0,0 +1,23 @@
|
|||
# MCU name
|
||||
MCU = atmega32u4
|
||||
|
||||
# Bootloader selection
|
||||
BOOTLOADER = qmk-dfu
|
||||
|
||||
# Build Options
|
||||
# change yes to no to disable
|
||||
#
|
||||
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
|
||||
MOUSEKEY_ENABLE = no # Mouse keys
|
||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||
CONSOLE_ENABLE = no # Console for debug
|
||||
COMMAND_ENABLE = yes # Commands for debug and configuration
|
||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
|
||||
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
|
||||
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
|
||||
NKRO_ENABLE = yes # USB Nkey Rollover
|
||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
||||
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
|
||||
BLUETOOTH_ENABLE = no # Enable Bluetooth
|
||||
AUDIO_ENABLE = no # Audio output
|
||||
LTO_ENABLE = yes # Reduce firmware size
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "s65.h"
|
||||
void keyboard_pre_init_kb(void) {
|
||||
setPinOutput(F0);
|
||||
writePinHigh(F0);
|
||||
keyboard_pre_init_user();
|
||||
}
|
||||
|
||||
bool led_update_kb(led_t led_state) {
|
||||
if (led_update_user(led_state)) {
|
||||
writePin(F0, !led_state.caps_lock);
|
||||
}
|
||||
return true;
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
Copyright 2019 Basic I/O Instruments(Scott Wei) <scot.wei@gmail.com>
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "quantum.h"
|
||||
|
||||
#define ___ KC_NO
|
||||
|
||||
#define LAYOUT_all( \
|
||||
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, K2F, \
|
||||
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, K2E, \
|
||||
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
|
||||
K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
|
||||
K40, K41, K42, K46, K49, K4A, K4B, K4C, K4D, K4E, K4F \
|
||||
) { \
|
||||
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \
|
||||
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
|
||||
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \
|
||||
{ K30, ___, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, ___ }, \
|
||||
{ K40, K41, K42, ___, ___, ___, K46, ___, ___, K49, K4A, K4B, K4C, K4D, K4E, K4F } \
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,436 @@
|
|||
#ifndef USART_H
|
||||
#define USART_H
|
||||
|
||||
/************************************************************************
|
||||
Title: Interrupt UART library with receive/transmit circular buffers
|
||||
Author: Andy Gock
|
||||
Software: AVR-GCC 4.1, AVR Libc 1.4
|
||||
Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz
|
||||
License: GNU General Public License
|
||||
Usage: see README.md and Doxygen manual
|
||||
|
||||
Based on original library by Peter Fluery, Tim Sharpe, Nicholas Zambetti.
|
||||
|
||||
https://github.com/andygock/avr-uart
|
||||
|
||||
LICENSE:
|
||||
|
||||
Copyright (C) 2012 Andy Gock
|
||||
Copyright (C) 2006 Peter Fleury
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
************************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
uart_available, uart_flush, uart1_available, and uart1_flush functions
|
||||
were adapted from the Arduino HardwareSerial.h library by Tim Sharpe on
|
||||
11 Jan 2009. The license info for HardwareSerial.h is as follows:
|
||||
|
||||
HardwareSerial.h - Hardware serial library for Wiring
|
||||
Copyright (c) 2006 Nicholas Zambetti. All right reserved.
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
************************************************************************/
|
||||
|
||||
/**
|
||||
* @defgroup avr-uart UART Library
|
||||
* @code #include <uart.h> @endcode
|
||||
*
|
||||
* @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers.
|
||||
* @see README.md
|
||||
*
|
||||
* This library can be used to transmit and receive data through the built in UART.
|
||||
*
|
||||
* An interrupt is generated when the UART has finished transmitting or
|
||||
* receiving a byte. The interrupt handling routines use circular buffers
|
||||
* for buffering received and transmitted data.
|
||||
*
|
||||
* The UART_RXn_BUFFER_SIZE and UART_TXn_BUFFER_SIZE constants define
|
||||
* the size of the circular buffers in bytes. Note that these constants must be a power of 2.
|
||||
*
|
||||
* You need to define these buffer sizes as a symbol in your compiler settings or in uart.h
|
||||
*
|
||||
* See README.md for more detailed information. Especially that relating to symbols: USARTn_ENABLED and USARTn_LARGE_BUFFER
|
||||
*
|
||||
* @author Andy Gock <andy@gock.net>
|
||||
* @note Based on Atmel Application Note AVR306 and original library by Peter Fleury and Tim Sharpe.
|
||||
*/
|
||||
|
||||
/**@{*/
|
||||
#include <stdint.h>
|
||||
#include <avr/io.h>
|
||||
|
||||
#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
|
||||
#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* constants and macros
|
||||
*/
|
||||
|
||||
/* Enable USART 1, 2, 3 as required */
|
||||
/* Can be defined in compiler symbol setup with -D option (preferred) */
|
||||
#ifndef USART0_ENABLED
|
||||
#define USART0_ENABLED /**< Enable USART0 */
|
||||
#endif
|
||||
//#define USART1_ENABLED
|
||||
//#define USART2_ENABLED
|
||||
//#define USART3_ENABLED
|
||||
|
||||
/* Set size of receive and transmit buffers */
|
||||
|
||||
#ifndef UART_RX0_BUFFER_SIZE
|
||||
#define UART_RX0_BUFFER_SIZE 128 /**< Size of the circular receive buffer, must be power of 2 */
|
||||
#endif
|
||||
#ifndef UART_RX1_BUFFER_SIZE
|
||||
#define UART_RX1_BUFFER_SIZE 128 /**< Size of the circular receive buffer, must be power of 2 */
|
||||
#endif
|
||||
#ifndef UART_RX2_BUFFER_SIZE
|
||||
#define UART_RX2_BUFFER_SIZE 128 /**< Size of the circular receive buffer, must be power of 2 */
|
||||
#endif
|
||||
#ifndef UART_RX3_BUFFER_SIZE
|
||||
#define UART_RX3_BUFFER_SIZE 128 /**< Size of the circular receive buffer, must be power of 2 */
|
||||
#endif
|
||||
|
||||
#ifndef UART_TX0_BUFFER_SIZE
|
||||
#define UART_TX0_BUFFER_SIZE 128 /**< Size of the circular transmit buffer, must be power of 2 */
|
||||
#endif
|
||||
#ifndef UART_TX1_BUFFER_SIZE
|
||||
#define UART_TX1_BUFFER_SIZE 128 /**< Size of the circular transmit buffer, must be power of 2 */
|
||||
#endif
|
||||
#ifndef UART_TX2_BUFFER_SIZE
|
||||
#define UART_TX2_BUFFER_SIZE 128 /**< Size of the circular transmit buffer, must be power of 2 */
|
||||
#endif
|
||||
#ifndef UART_TX3_BUFFER_SIZE
|
||||
#define UART_TX3_BUFFER_SIZE 128 /**< Size of the circular transmit buffer, must be power of 2 */
|
||||
#endif
|
||||
|
||||
/* Check buffer sizes are not too large for 8-bit positioning */
|
||||
|
||||
#if (UART_RX0_BUFFER_SIZE > 256 & !defined(USART0_LARGE_BUFFER))
|
||||
#error "Buffer too large, please use -DUSART0_LARGE_BUFFER switch in compiler options"
|
||||
#endif
|
||||
|
||||
#if (UART_RX1_BUFFER_SIZE > 256 & !defined(USART1_LARGE_BUFFER))
|
||||
#error "Buffer too large, please use -DUSART1_LARGE_BUFFER switch in compiler options"
|
||||
#endif
|
||||
|
||||
#if (UART_RX2_BUFFER_SIZE > 256 & !defined(USART2_LARGE_BUFFER))
|
||||
#error "Buffer too large, please use -DUSART2_LARGE_BUFFER switch in compiler options"
|
||||
#endif
|
||||
|
||||
#if (UART_RX3_BUFFER_SIZE > 256 & !defined(USART3_LARGE_BUFFER))
|
||||
#error "Buffer too large, please use -DUSART3_LARGE_BUFFER switch in compiler options"
|
||||
#endif
|
||||
|
||||
/* Check buffer sizes are not too large for *_LARGE_BUFFER operation (16-bit positioning) */
|
||||
|
||||
#if (UART_RX0_BUFFER_SIZE > 32768)
|
||||
#error "Buffer too large, maximum allowed is 32768 bytes"
|
||||
#endif
|
||||
|
||||
#if (UART_RX1_BUFFER_SIZE > 32768)
|
||||
#error "Buffer too large, maximum allowed is 32768 bytes"
|
||||
#endif
|
||||
|
||||
#if (UART_RX2_BUFFER_SIZE > 32768)
|
||||
#error "Buffer too large, maximum allowed is 32768 bytes"
|
||||
#endif
|
||||
|
||||
#if (UART_RX3_BUFFER_SIZE > 32768)
|
||||
#error "Buffer too large, maximum allowed is 32768 bytes"
|
||||
#endif
|
||||
|
||||
/** @brief UART Baudrate Expression
|
||||
* @param xtalCpu system clock in Mhz, e.g. 4000000L for 4Mhz
|
||||
* @param baudRate baudrate in bps, e.g. 1200, 2400, 9600
|
||||
*/
|
||||
#define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu)+8UL*(baudRate))/(16UL*(baudRate))-1UL)
|
||||
|
||||
/** @brief UART Baudrate Expression for ATmega double speed mode
|
||||
* @param xtalCpu system clock in Mhz, e.g. 4000000L for 4Mhz
|
||||
* @param baudRate baudrate in bps, e.g. 1200, 2400, 9600
|
||||
*/
|
||||
#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) ((((xtalCpu)+4UL*(baudRate))/(8UL*(baudRate))-1)|0x8000)
|
||||
|
||||
/* test if the size of the circular buffers fits into SRAM */
|
||||
|
||||
#if defined(USART0_ENABLED) && ( (UART_RX0_BUFFER_SIZE+UART_TX0_BUFFER_SIZE) >= (RAMEND-0x60))
|
||||
#error "size of UART_RX0_BUFFER_SIZE + UART_TX0_BUFFER_SIZE larger than size of SRAM"
|
||||
#endif
|
||||
|
||||
#if defined(USART1_ENABLED) && ( (UART_RX1_BUFFER_SIZE+UART_TX1_BUFFER_SIZE) >= (RAMEND-0x60))
|
||||
#error "size of UART_RX1_BUFFER_SIZE + UART_TX1_BUFFER_SIZE larger than size of SRAM"
|
||||
#endif
|
||||
|
||||
#if defined(USART2_ENABLED) && ( (UART_RX2_BUFFER_SIZE+UART_RX2_BUFFER_SIZE) >= (RAMEND-0x60))
|
||||
#error "size of UART_RX2_BUFFER_SIZE + UART_TX2_BUFFER_SIZE larger than size of SRAM"
|
||||
#endif
|
||||
|
||||
#if defined(USART3_ENABLED) && ( (UART_RX3_BUFFER_SIZE+UART_RX3_BUFFER_SIZE) >= (RAMEND-0x60))
|
||||
#error "size of UART_RX3_BUFFER_SIZE + UART_TX3_BUFFER_SIZE larger than size of SRAM"
|
||||
#endif
|
||||
|
||||
/*
|
||||
** high byte error return code of uart_getc()
|
||||
*/
|
||||
#define UART_FRAME_ERROR 0x0800 /**< Framing Error by UART */
|
||||
#define UART_OVERRUN_ERROR 0x0400 /**< Overrun condition by UART */
|
||||
#define UART_BUFFER_OVERFLOW 0x0200 /**< receive ringbuffer overflow */
|
||||
#define UART_NO_DATA 0x0100 /**< no receive data available */
|
||||
|
||||
/* Macros, to allow use of legacy names */
|
||||
|
||||
/** @brief Macro to initialize USART0 (only available on selected ATmegas) @see uart0_init */
|
||||
#define uart_init(b) uart0_init(b)
|
||||
|
||||
/** @brief Macro to get received byte of USART0 from ringbuffer. (only available on selected ATmega) @see uart0_getc */
|
||||
#define uart_getc() uart0_getc()
|
||||
|
||||
/** @brief Macro to peek at next byte in USART0 ringbuffer */
|
||||
#define uart_peek() uart0_peek()
|
||||
|
||||
/** @brief Macro to put byte to ringbuffer for transmitting via USART0 (only available on selected ATmega) @see uart0_putc */
|
||||
#define uart_putc(d) uart0_putc(d)
|
||||
|
||||
/** @brief Macro to put string to ringbuffer for transmitting via USART0 (only available on selected ATmega) @see uart0_puts */
|
||||
#define uart_puts(s) uart0_puts(s)
|
||||
|
||||
/** @brief Macro to put string from program memory to ringbuffer for transmitting via USART0 (only available on selected ATmega) @see uart0_puts_p */
|
||||
#define uart_puts_p(s) uart0_puts_p(s)
|
||||
|
||||
/** @brief Macro to return number of bytes waiting in the receive buffer of USART0 @see uart0_available */
|
||||
#define uart_available() uart0_available()
|
||||
|
||||
/** @brief Macro to flush bytes waiting in receive buffer of USART0 @see uart0_flush */
|
||||
#define uart_flush() uart0_flush()
|
||||
|
||||
/*
|
||||
** function prototypes
|
||||
*/
|
||||
|
||||
/**
|
||||
@brief Initialize UART and set baudrate
|
||||
@param baudrate Specify baudrate using macro UART_BAUD_SELECT()
|
||||
@return none
|
||||
*/
|
||||
/*extern*/void uart0_init(uint16_t baudrate);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Get received byte from ringbuffer
|
||||
*
|
||||
* Returns in the lower byte the received character and in the
|
||||
* higher byte the last receive error.
|
||||
* UART_NO_DATA is returned when no data is available.
|
||||
*
|
||||
* @return lower byte: received byte from ringbuffer
|
||||
* @return higher byte: last receive status
|
||||
* - \b 0 successfully received data from UART
|
||||
* - \b UART_NO_DATA
|
||||
* <br>no receive data available
|
||||
* - \b UART_BUFFER_OVERFLOW
|
||||
* <br>Receive ringbuffer overflow.
|
||||
* We are not reading the receive buffer fast enough,
|
||||
* one or more received character have been dropped
|
||||
* - \b UART_OVERRUN_ERROR
|
||||
* <br>Overrun condition by UART.
|
||||
* A character already present in the UART UDR register was
|
||||
* not read by the interrupt handler before the next character arrived,
|
||||
* one or more received characters have been dropped.
|
||||
* - \b UART_FRAME_ERROR
|
||||
* <br>Framing Error by UART
|
||||
*/
|
||||
/*extern*/uint16_t uart0_getc(void);
|
||||
|
||||
/**
|
||||
* @brief Peek at next byte in ringbuffer
|
||||
*
|
||||
* Returns the next byte (character) of incoming UART data without removing it from the
|
||||
* internal ring buffer. That is, successive calls to uartN_peek() will return the same
|
||||
* character, as will the next call to uartN_getc().
|
||||
*
|
||||
* UART_NO_DATA is returned when no data is available.
|
||||
*
|
||||
* @return lower byte: next byte in ringbuffer
|
||||
* @return higher byte: last receive status
|
||||
* - \b 0 successfully received data from UART
|
||||
* - \b UART_NO_DATA
|
||||
* <br>no receive data available
|
||||
* - \b UART_BUFFER_OVERFLOW
|
||||
* <br>Receive ringbuffer overflow.
|
||||
* We are not reading the receive buffer fast enough,
|
||||
* one or more received character have been dropped
|
||||
* - \b UART_OVERRUN_ERROR
|
||||
* <br>Overrun condition by UART.
|
||||
* A character already present in the UART UDR register was
|
||||
* not read by the interrupt handler before the next character arrived,
|
||||
* one or more received characters have been dropped.
|
||||
* - \b UART_FRAME_ERROR
|
||||
* <br>Framing Error by UART
|
||||
*/
|
||||
/*extern*/uint16_t uart0_peek(void);
|
||||
|
||||
/**
|
||||
* @brief Put byte to ringbuffer for transmitting via UART
|
||||
* @param data byte to be transmitted
|
||||
* @return none
|
||||
*/
|
||||
/*extern*/void uart0_putc(uint8_t data);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Put string to ringbuffer for transmitting via UART
|
||||
*
|
||||
* The string is buffered by the uart library in a circular buffer
|
||||
* and one character at a time is transmitted to the UART using interrupts.
|
||||
* Blocks if it can not write the whole string into the circular buffer.
|
||||
*
|
||||
* @param s string to be transmitted
|
||||
* @return none
|
||||
*/
|
||||
/*extern*/void uart0_puts(const char *s);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Put string from program memory to ringbuffer for transmitting via UART.
|
||||
*
|
||||
* The string is buffered by the uart library in a circular buffer
|
||||
* and one character at a time is transmitted to the UART using interrupts.
|
||||
* Blocks if it can not write the whole string into the circular buffer.
|
||||
*
|
||||
* @param s program memory string to be transmitted
|
||||
* @return none
|
||||
* @see uart0_puts_P
|
||||
*/
|
||||
/*extern*/void uart0_puts_p(const char *s);
|
||||
|
||||
/**
|
||||
* @brief Macro to automatically put a string constant into program memory
|
||||
* \param __s string in program memory
|
||||
*/
|
||||
#define uart_puts_P(__s) uart0_puts_p(PSTR(__s))
|
||||
|
||||
/** @brief Macro to automatically put a string constant into program memory */
|
||||
#define uart0_puts_P(__s) uart0_puts_p(PSTR(__s))
|
||||
|
||||
/**
|
||||
* @brief Return number of bytes waiting in the receive buffer
|
||||
* @return bytes waiting in the receive buffer
|
||||
*/
|
||||
/*extern*/uint16_t uart0_available(void);
|
||||
|
||||
/**
|
||||
* @brief Flush bytes waiting in receive buffer
|
||||
*/
|
||||
/*extern*/void uart0_flush(void);
|
||||
|
||||
|
||||
/** @brief Initialize USART1 (only available on selected ATmegas) @see uart_init */
|
||||
/*extern*/void uart1_init(uint16_t baudrate);
|
||||
|
||||
/** @brief Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */
|
||||
/*extern*/uint16_t uart1_getc(void);
|
||||
|
||||
/** @brief Peek at next byte in USART1 ringbuffer */
|
||||
/*extern*/uint16_t uart1_peek(void);
|
||||
|
||||
/** @brief Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */
|
||||
/*extern*/void uart1_putc(uint8_t data);
|
||||
|
||||
/** @brief Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */
|
||||
/*extern*/void uart1_puts(const char *s);
|
||||
|
||||
/** @brief Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */
|
||||
/*extern*/void uart1_puts_p(const char *s);
|
||||
|
||||
/** @brief Macro to automatically put a string constant into program memory of USART1 @see uart1_puts_p */
|
||||
#define uart1_puts_P(__s) uart1_puts_p(PSTR(__s))
|
||||
|
||||
/** @brief Return number of bytes waiting in the receive buffer of USART1 */
|
||||
/*extern*/uint16_t uart1_available(void);
|
||||
|
||||
/** @brief Flush bytes waiting in receive buffer of USART1 */
|
||||
/*extern*/void uart1_flush(void);
|
||||
|
||||
|
||||
/** @brief Initialize USART2 (only available on selected ATmegas) @see uart_init */
|
||||
/*extern*/void uart2_init(uint16_t baudrate);
|
||||
|
||||
/** @brief Get received byte of USART2 from ringbuffer. (only available on selected ATmega) @see uart_getc */
|
||||
/*extern*/uint16_t uart2_getc(void);
|
||||
|
||||
/** @brief Peek at next byte in USART2 ringbuffer */
|
||||
/*extern*/uint16_t uart2_peek(void);
|
||||
|
||||
/** @brief Put byte to ringbuffer for transmitting via USART2 (only available on selected ATmega) @see uart_putc */
|
||||
/*extern*/void uart2_putc(uint8_t data);
|
||||
|
||||
/** @brief Put string to ringbuffer for transmitting via USART2 (only available on selected ATmega) @see uart_puts */
|
||||
/*extern*/void uart2_puts(const char *s);
|
||||
|
||||
/** @brief Put string from program memory to ringbuffer for transmitting via USART2 (only available on selected ATmega) @see uart_puts_p */
|
||||
/*extern*/void uart2_puts_p(const char *s);
|
||||
|
||||
/** @brief Macro to automatically put a string constant into program memory of USART2 @see uart2_puts_p */
|
||||
#define uart2_puts_P(__s) uart2_puts_p(PSTR(__s))
|
||||
|
||||
/** @brief Return number of bytes waiting in the receive buffer of USART2 */
|
||||
/*extern*/uint16_t uart2_available(void);
|
||||
|
||||
/** @brief Flush bytes waiting in receive buffer of USART2 */
|
||||
/*extern*/void uart2_flush(void);
|
||||
|
||||
|
||||
/** @brief Initialize USART3 (only available on selected ATmegas) @see uart_init */
|
||||
/*extern*/void uart3_init(uint16_t baudrate);
|
||||
|
||||
/** @brief Get received byte of USART3 from ringbuffer. (only available on selected ATmega) @see uart_getc */
|
||||
/*extern*/uint16_t uart3_getc(void);
|
||||
|
||||
/** @brief Peek at next byte in USART3 ringbuffer */
|
||||
/*extern*/uint16_t uart3_peek(void);
|
||||
|
||||
/** @brief Put byte to ringbuffer for transmitting via USART3 (only available on selected ATmega) @see uart_putc */
|
||||
/*extern*/void uart3_putc(uint8_t data);
|
||||
|
||||
/** @brief Put string to ringbuffer for transmitting via USART3 (only available on selected ATmega) @see uart_puts */
|
||||
/*extern*/void uart3_puts(const char *s);
|
||||
|
||||
/** @brief Put string from program memory to ringbuffer for transmitting via USART3 (only available on selected ATmega) @see uart_puts_p */
|
||||
/*extern*/void uart3_puts_p(const char *s);
|
||||
|
||||
/** @brief Macro to automatically put a string constant into program memory of USART3 @see uart3_puts_p */
|
||||
#define uart3_puts_P(__s) uart3_puts_p(PSTR(__s))
|
||||
|
||||
/** @brief Return number of bytes waiting in the receive buffer of USART3 */
|
||||
/*extern*/uint16_t uart3_available(void);
|
||||
|
||||
/** @brief Flush bytes waiting in receive buffer of USART3 */
|
||||
/*extern*/void uart3_flush(void);
|
||||
|
||||
/**@}*/
|
||||
|
||||
#endif // UART_H
|
||||
|
Loading…
Reference in New Issue