Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Keyboard] add bajjak keyboard #12377

Merged
merged 30 commits into from
Aug 14, 2022
Merged
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
ad40d7c
[Keyboard] add bajjak keyboard
garykong Mar 22, 2021
67fc5c9
[keymap] add keymap 5x6
garykong Mar 30, 2021
a7ccae0
fix layouts in info.json
garykong Mar 30, 2021
5aa20f5
[keymap] Add GPL2 + license in keymap.c
garykong Apr 6, 2021
f23415e
[keyboard] Renamed the function from ergodox to bajjak
garykong Apr 6, 2021
a5a4bcd
Remove RGB LED
garykong Apr 21, 2021
3fc8c84
Update keyboards/bajjak/rules.mk
garykong May 14, 2021
2cbdd40
Update keyboards/bajjak/rules.mk
garykong Jul 5, 2021
7af33f0
Update keyboard product name
garykong Jul 5, 2021
83f077c
Update readme.md
garykong Jul 6, 2021
2152f2e
Change function names to lowercase
garykong Jul 6, 2021
37b24d9
Remove keymaps/default/readme.md
garykong Aug 2, 2021
b60c054
fix white space in keyboards/bajjak/bajjak.h
garykong Aug 2, 2021
c3dfaab
Remove code line in keyboards/bajjak/bajjak.h
garykong Aug 2, 2021
432c4fc
Replace function name
garykong Aug 2, 2021
865ce21
Update keyboards/bajjak/rules.mk
garykong Jan 3, 2022
4148d7e
Update keyboards/bajjak/rules.mk
garykong Jan 3, 2022
63d6ae8
Update keyboards/bajjak/rules.mk
garykong Jan 10, 2022
b29e10a
Update keyboards/bajjak/rules.mk
garykong Jan 10, 2022
b9b191a
Update keyboards/bajjak/rules.mk
garykong Jan 10, 2022
00e319e
Update keyboards/bajjak/info.json
garykong Jan 10, 2022
e5a4daf
Update keyboards/bajjak/config.h
garykong Jun 14, 2022
1a64a42
Fix DEBOUNCE_TYPE
garykong Jun 14, 2022
d4271e3
Update readme.md
garykong Jun 20, 2022
2587d87
Update keyboards/bajjak/bajjak.h
garykong Jul 21, 2022
77755c9
Update keyboards/bajjak/info.json
garykong Jul 21, 2022
83f3cab
Update keyboards/bajjak/readme.md
garykong Aug 10, 2022
aca5372
Update keyboards/bajjak/rules.mk
garykong Aug 10, 2022
e665c14
Update keyboards/bajjak/rules.mk
garykong Aug 10, 2022
c47b5e5
Update keyboards/bajjak/readme.md
garykong Aug 10, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
227 changes: 227 additions & 0 deletions keyboards/bajjak/bajjak.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
/*
Copyright 2012 Jun Wako <[email protected]>
Copyright 2013 Oleg Kostyuk <[email protected]>
Copyright 2015 ZSA Technology Labs Inc (@zsa)
Copyright 2020 Christopher Courtney <[email protected]> (@drashna)
Copyright 2021 Gary Kong <[email protected]> (@garykong)

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:https://www.gnu.org/licenses/>.
*/

#include "bajjak.h"

extern inline void bajjak_board_led_on(void);
extern inline void bajjak_right_led_1_on(void);
extern inline void bajjak_right_led_2_on(void);
extern inline void bajjak_right_led_3_on(void);
extern inline void bajjak_right_led_on(uint8_t led);

extern inline void bajjak_board_led_off(void);
extern inline void bajjak_right_led_1_off(void);
extern inline void bajjak_right_led_2_off(void);
extern inline void bajjak_right_led_3_off(void);
extern inline void bajjak_right_led_off(uint8_t led);

extern inline void bajjak_led_all_on(void);
extern inline void bajjak_led_all_off(void);

extern inline void bajjak_right_led_1_set(uint8_t n);
extern inline void bajjak_right_led_2_set(uint8_t n);
extern inline void bajjak_right_led_3_set(uint8_t n);
extern inline void bajjak_right_led_set(uint8_t led, uint8_t n);

extern inline void bajjak_led_all_set(uint8_t n);

keyboard_config_t keyboard_config;

bool i2c_initialized = 0;
i2c_status_t mcp23018_status = 0x20;

void matrix_init_kb(void) {
// keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md")
TCCR1A = 0b10101001; // set and configure fast PWM
TCCR1B = 0b00001001; // set and configure fast PWM

// (tied to Vcc for hardware convenience)
DDRB &= ~(1<<4); // set B(4) as input
PORTB &= ~(1<<4); // set B(4) internal pull-up disabled

// unused pins - D4, D5, E6
// set as input with internal pull-up enabled
DDRD &= ~(1<<5 | 1<<4);
DDRE &= ~(1<<6);
PORTD |= (1<<5 | 1<<4);
PORTE |= (1<<6);

keyboard_config.raw = eeconfig_read_kb();
bajjak_led_all_set((uint8_t)keyboard_config.led_level * 255 / 4 );
bajjak_blink_all_leds();

matrix_init_user();
}

void bajjak_blink_all_leds(void)
{
bajjak_led_all_off();
bajjak_led_all_set(LED_BRIGHTNESS_DEFAULT);
bajjak_right_led_1_on();
wait_ms(50);
bajjak_right_led_2_on();
wait_ms(50);
bajjak_right_led_3_on();
wait_ms(50);
#ifdef LEFT_LEDS
bajjak_left_led_1_on();
wait_ms(50);
if (!mcp23018_status) {
mcp23018_status = bajjak_left_leds_update();
}
bajjak_left_led_2_on();
wait_ms(50);
if (!mcp23018_status) {
mcp23018_status = bajjak_left_leds_update();
}
#endif
bajjak_right_led_1_off();
wait_ms(50);
bajjak_right_led_2_off();
wait_ms(50);
bajjak_right_led_3_off();
#ifdef LEFT_LEDS
wait_ms(50);
bajjak_left_led_1_off();
if (!mcp23018_status) {
mcp23018_status = bajjak_left_leds_update();
}
wait_ms(50);
bajjak_left_led_2_off();
if (!mcp23018_status) {
mcp23018_status = bajjak_left_leds_update();
}
#endif

//bajjak_led_all_on();
//wait_ms(333);
bajjak_led_all_off();
}

uint8_t init_mcp23018(void) {
mcp23018_status = 0x20;

// I2C subsystem

// uint8_t sreg_prev;
// sreg_prev=SREG;
// cli();

if (i2c_initialized == 0) {
i2c_init(); // on pins D(1,0)
i2c_initialized = true;
wait_ms(1000);
}
// i2c_init(); // on pins D(1,0)
// wait_ms(1000);

// set pin direction
// - unused : input : 1
// - input : input : 1
// - driving : output : 0
mcp23018_status = i2c_start(I2C_ADDR_WRITE, BAJJAK_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(IODIRA, BAJJAK_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b00000000, BAJJAK_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b00111111, BAJJAK_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
i2c_stop();

// set pull-up
// - unused : on : 1
// - input : on : 1
// - driving : off : 0
mcp23018_status = i2c_start(I2C_ADDR_WRITE, BAJJAK_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(GPPUA, BAJJAK_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b00000000, BAJJAK_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b01111111, BAJJAK_EZ_I2C_TIMEOUT); if (mcp23018_status) goto out;

out:
i2c_stop();

#ifdef LEFT_LEDS
if (!mcp23018_status) mcp23018_status = bajjak_left_leds_update();
#endif // LEFT_LEDS

// SREG=sreg_prev;

return mcp23018_status;
}

#ifdef LEFT_LEDS
uint8_t bajjak_left_leds_update(void) {
if (mcp23018_status) { // if there was an error
return mcp23018_status;
}
#define LEFT_LED_1_SHIFT 7 // in MCP23018 port A
#define LEFT_LED_2_SHIFT 7 // in MCP23018 port B

// set logical value (doesn't matter on inputs)
// - unused : hi-Z : 1
// - input : hi-Z : 1
// - driving : hi-Z : 1
mcp23018_status = i2c_start(I2C_ADDR_WRITE, BAJJAK_EZ_I2C_TIMEOUT);
if (mcp23018_status) goto out;
mcp23018_status = i2c_write(OLATA, BAJJAK_EZ_I2C_TIMEOUT);
if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b11111111
& ~(bajjak_left_led_1<<LEFT_LED_1_SHIFT),
BAJJAK_EZ_I2C_TIMEOUT);
if (mcp23018_status) goto out;
mcp23018_status = i2c_write(0b11111111
& ~(bajjak_left_led_2<<LEFT_LED_2_SHIFT),
BAJJAK_EZ_I2C_TIMEOUT);
if (mcp23018_status) goto out;

out:
i2c_stop();
return mcp23018_status;
}
#endif


#ifdef SWAP_HANDS_ENABLE
__attribute__ ((weak))
// swap-hands action needs a matrix to define the swap
const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
/* Left hand, matrix positions */
{{0, 13}, {1, 13}, {2, 13}, {3, 13}, {4, 13}, {5, 13}, {6, 13}},
{{0, 12}, {1, 12}, {2, 12}, {3, 12}, {4, 12}, {5, 12}, {6, 12}},
{{0, 11}, {1, 11}, {2, 11}, {3, 11}, {4, 11}, {5, 11}, {6, 11}},
{{0, 10}, {1, 10}, {2, 10}, {3, 10}, {4, 10}, {5, 10}, {6, 10}},
{{0, 9}, {1, 9}, {2, 9}, {3, 9}, {4, 9}, {5, 9}, {6, 9}},
{{0, 8}, {1, 8}, {2, 8}, {3, 8}, {4, 8}, {5, 8}, {6, 8}},
{{0, 7}, {1, 7}, {2, 7}, {3, 7}, {4, 7}, {5, 7}, {6, 7}},
/* Right hand, matrix positions */
{{0, 6}, {1, 6}, {2, 6}, {3, 6}, {4, 6}, {5, 6}, {6, 6}},
{{0, 5}, {1, 5}, {2, 5}, {3, 5}, {4, 5}, {5, 5}, {6, 5}},
{{0, 4}, {1, 4}, {2, 4}, {3, 4}, {4, 4}, {5, 4}, {6, 4}},
{{0, 3}, {1, 3}, {2, 3}, {3, 3}, {4, 3}, {5, 3}, {6, 3}},
{{0, 2}, {1, 2}, {2, 2}, {3, 2}, {4, 2}, {5, 2}, {6, 2}},
{{0, 1}, {1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}, {6, 1}},
{{0, 0}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}},
};
#endif

void eeconfig_init_kb(void) { // EEPROM is getting reset!
keyboard_config.raw = 0;
keyboard_config.led_level = 4;
eeconfig_update_kb(keyboard_config.raw);
eeconfig_init_user();
}
165 changes: 165 additions & 0 deletions keyboards/bajjak/bajjak.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
/*
Copyright 2012 Jun Wako <[email protected]>
Copyright 2013 Oleg Kostyuk <[email protected]>
Copyright 2015 ZSA Technology Labs Inc (@zsa)
Copyright 2020 Christopher Courtney <[email protected]> (@drashna)
Copyright 2021 Gary Kong <[email protected]> (@garykong)

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:https://www.gnu.org/licenses/>.
*/

#pragma once

#include "quantum.h"
#include <stdint.h>
#include <stdbool.h>
#include "i2c_master.h"

// I2C aliases and register addresses (see "mcp23018.md")
#define I2C_ADDR 0b0100000
#define I2C_ADDR_WRITE ( (I2C_ADDR<<1) | I2C_WRITE )
#define I2C_ADDR_READ ( (I2C_ADDR<<1) | I2C_READ )
#define IODIRA 0x00 // i/o direction register
#define IODIRB 0x01
#define GPPUA 0x0C // GPIO pull-up resistor register
#define GPPUB 0x0D
#define GPIOA 0x12 // general purpose i/o port register (write modifies OLAT)
#define GPIOB 0x13
#define OLATA 0x14 // output latch register
#define OLATB 0x15

extern i2c_status_t mcp23018_status;
#define BAJJAK_EZ_I2C_TIMEOUT 100

void init_bajjak(void);
void bajjak_blink_all_leds(void);
uint8_t init_mcp23018(void);
uint8_t bajjak_left_leds_update(void);

#ifndef LED_BRIGHTNESS_LO
#define LED_BRIGHTNESS_LO 15
#endif
#ifndef LED_BRIGHTNESS_HI
#define LED_BRIGHTNESS_HI 255
#endif


inline void bajjak_board_led_on(void) { setPinOutput(D6); writePinHigh(D6); }
inline void bajjak_right_led_1_on(void) { setPinOutput(B5); writePinHigh(B5); }
inline void bajjak_right_led_2_on(void) { setPinOutput(B6); writePinHigh(B6); }
inline void bajjak_right_led_3_on(void) { setPinOutput(B7); writePinHigh(B7); }
inline void bajjak_right_led_on(uint8_t led) { setPinOutput(led+4); writePinHigh(led+4); }

inline void bajjak_board_led_off(void) { setPinInput(D6); writePinLow(D6); }
inline void bajjak_right_led_1_off(void) { setPinInput(B5); writePinLow(B5); }
inline void bajjak_right_led_2_off(void) { setPinInput(B6); writePinLow(B6); }
inline void bajjak_right_led_3_off(void) { setPinInput(B7); writePinLow(B7); }
inline void bajjak_right_led_off(uint8_t led) { setPinInput(led+4); writePinLow(led+4); }

#ifdef LEFT_LEDS
bool bajjak_left_led_1;
bool bajjak_left_led_2;
bool bajjak_left_led_3;

inline void bajjak_left_led_1_on(void) { bajjak_left_led_1 = 1; }
inline void bajjak_left_led_2_on(void) { bajjak_left_led_2 = 1; }

inline void bajjak_left_led_1_off(void) { bajjak_left_led_1 = 0; }
inline void bajjak_left_led_2_off(void) { bajjak_left_led_2 = 0; }
#endif // LEFT_LEDS

inline void bajjak_led_all_on(void) {
bajjak_board_led_on();
bajjak_right_led_1_on();
bajjak_right_led_2_on();
bajjak_right_led_3_on();
#ifdef LEFT_LEDS
bajjak_left_led_1_on();
bajjak_left_led_2_on();
#endif // LEFT_LEDS
}

inline void bajjak_led_all_off(void)
{
bajjak_board_led_off();
bajjak_right_led_1_off();
bajjak_right_led_2_off();
bajjak_right_led_3_off();
#ifdef LEFT_LEDS
bajjak_left_led_1_off();
bajjak_left_led_2_off();
#endif // LEFT_LEDS
}

inline void bajjak_right_led_1_set(uint8_t n) { OCR1A = n; }
inline void bajjak_right_led_2_set(uint8_t n) { OCR1B = n; }
inline void bajjak_right_led_3_set(uint8_t n) { OCR1C = n; }
inline void bajjak_right_led_set(uint8_t led, uint8_t n) {
(led == 1) ? (OCR1A = n) :
(led == 2) ? (OCR1B = n) :
(OCR1C = n);
}

inline void bajjak_led_all_set(uint8_t n) {
bajjak_right_led_1_set(n);
bajjak_right_led_2_set(n);
bajjak_right_led_3_set(n);
}

enum BAJJAK_ez_keycodes {
LED_LEVEL = SAFE_RANGE,
TOGGLE_LAYER_COLOR,
EZ_SAFE_RANGE,
};

#ifndef WEBUSB_ENABLE
# define WEBUSB_PAIR KC_NO
#endif

typedef union {
uint32_t raw;
struct {
uint8_t led_level :3;
bool disable_layer_led :1;
};
} keyboard_config_t;

extern keyboard_config_t keyboard_config;

#define LAYOUT_6x7( \
L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \
L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \
L20, L21, L22, L23, L24, L25, L26, R20, R21, R22, R23, R24, R25, R26, \
L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36, \
L40, L41, L42, L43, L44, L45, R41, R42, R43, R44, R45, R46, \
L50, L51, L52, L53, L54, R52, R53, R54, R55, R56, \
L65, L66, R60, R61, \
L64, R62, \
L63, L62, L61, R65, R64, R63 \
) { \
{ L00, L10, L20, L30, L40, L50, KC_NO }, \
{ L01, L11, L21, L31, L41, L51, L61 }, \
{ L02, L12, L22, L32, L42, L52, L62 }, \
{ L03, L13, L23, L33, L43, L53, L63 }, \
{ L04, L14, L24, L34, L44, L54, L64 }, \
{ L05, L15, L25, L35, L45, KC_NO, L65 }, \
{ L06, L16, L26, L36, KC_NO, KC_NO, L66 }, \
{ R00, R10, R20, R30, KC_NO, KC_NO, R60 }, \
{ R01, R11, R21, R31, R41, KC_NO, R61 }, \
{ R02, R12, R22, R32, R42, R52, R62 }, \
{ R03, R13, R23, R33, R43, R53, R63 }, \
{ R04, R14, R24, R34, R44, R54, R64 }, \
{ R05, R15, R25, R35, R45, R55, R65 },\
{ R06, R16, R26, R36, R46, R56, KC_NO } \
}
Loading