bajjak.h (4401B)
1 /* 2 Copyright 2012 Jun Wako <wakojun@gmail.com> 3 Copyright 2013 Oleg Kostyuk <cub.uanic@gmail.com> 4 Copyright 2015 ZSA Technology Labs Inc (@zsa) 5 Copyright 2020 Christopher Courtney <drashna@live.com> (@drashna) 6 Copyright 2021 Gary Kong <kongkm88@gmail.com> (@garykong) 7 8 This program is free software: you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation, either version 2 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. 20 */ 21 22 #pragma once 23 24 #include "quantum.h" 25 #include <stdint.h> 26 #include <stdbool.h> 27 #include "i2c_master.h" 28 29 // I2C aliases and register addresses (see "mcp23018.md") 30 #define I2C_ADDR (0b0100000<<1) 31 #define IODIRA 0x00 // i/o direction register 32 #define IODIRB 0x01 33 #define GPPUA 0x0C // GPIO pull-up resistor register 34 #define GPPUB 0x0D 35 #define GPIOA 0x12 // general purpose i/o port register (write modifies OLAT) 36 #define GPIOB 0x13 37 #define OLATA 0x14 // output latch register 38 #define OLATB 0x15 39 40 extern i2c_status_t mcp23018_status; 41 #define BAJJAK_EZ_I2C_TIMEOUT 100 42 43 void init_bajjak(void); 44 void bajjak_blink_all_leds(void); 45 uint8_t init_mcp23018(void); 46 uint8_t bajjak_left_leds_update(void); 47 48 #ifndef LED_BRIGHTNESS_LO 49 #define LED_BRIGHTNESS_LO 15 50 #endif 51 #ifndef LED_BRIGHTNESS_HI 52 #define LED_BRIGHTNESS_HI 255 53 #endif 54 55 56 inline void bajjak_board_led_on(void) { gpio_set_pin_output(D6); gpio_write_pin_high(D6); } 57 inline void bajjak_right_led_1_on(void) { gpio_set_pin_output(B5); gpio_write_pin_high(B5); } 58 inline void bajjak_right_led_2_on(void) { gpio_set_pin_output(B6); gpio_write_pin_high(B6); } 59 inline void bajjak_right_led_3_on(void) { gpio_set_pin_output(B7); gpio_write_pin_high(B7); } 60 inline void bajjak_right_led_on(uint8_t led) { gpio_set_pin_output(led+4); gpio_write_pin_high(led+4); } 61 62 inline void bajjak_board_led_off(void) { gpio_set_pin_input(D6); gpio_write_pin_low(D6); } 63 inline void bajjak_right_led_1_off(void) { gpio_set_pin_input(B5); gpio_write_pin_low(B5); } 64 inline void bajjak_right_led_2_off(void) { gpio_set_pin_input(B6); gpio_write_pin_low(B6); } 65 inline void bajjak_right_led_3_off(void) { gpio_set_pin_input(B7); gpio_write_pin_low(B7); } 66 inline void bajjak_right_led_off(uint8_t led) { gpio_set_pin_input(led+4); gpio_write_pin_low(led+4); } 67 68 #ifdef LEFT_LEDS 69 extern bool bajjak_left_led_1; 70 extern bool bajjak_left_led_2; 71 extern bool bajjak_left_led_3; 72 73 inline void bajjak_left_led_1_on(void) { bajjak_left_led_1 = 1; } 74 inline void bajjak_left_led_2_on(void) { bajjak_left_led_2 = 1; } 75 76 inline void bajjak_left_led_1_off(void) { bajjak_left_led_1 = 0; } 77 inline void bajjak_left_led_2_off(void) { bajjak_left_led_2 = 0; } 78 #endif // LEFT_LEDS 79 80 inline void bajjak_led_all_on(void) { 81 bajjak_board_led_on(); 82 bajjak_right_led_1_on(); 83 bajjak_right_led_2_on(); 84 bajjak_right_led_3_on(); 85 #ifdef LEFT_LEDS 86 bajjak_left_led_1_on(); 87 bajjak_left_led_2_on(); 88 #endif // LEFT_LEDS 89 } 90 91 inline void bajjak_led_all_off(void) 92 { 93 bajjak_board_led_off(); 94 bajjak_right_led_1_off(); 95 bajjak_right_led_2_off(); 96 bajjak_right_led_3_off(); 97 #ifdef LEFT_LEDS 98 bajjak_left_led_1_off(); 99 bajjak_left_led_2_off(); 100 #endif // LEFT_LEDS 101 } 102 103 inline void bajjak_right_led_1_set(uint8_t n) { OCR1A = n; } 104 inline void bajjak_right_led_2_set(uint8_t n) { OCR1B = n; } 105 inline void bajjak_right_led_3_set(uint8_t n) { OCR1C = n; } 106 inline void bajjak_right_led_set(uint8_t led, uint8_t n) { 107 (led == 1) ? (OCR1A = n) : 108 (led == 2) ? (OCR1B = n) : 109 (OCR1C = n); 110 } 111 112 inline void bajjak_led_all_set(uint8_t n) { 113 bajjak_right_led_1_set(n); 114 bajjak_right_led_2_set(n); 115 bajjak_right_led_3_set(n); 116 } 117 118 typedef union { 119 uint32_t raw; 120 struct { 121 uint8_t led_level :3; 122 bool disable_layer_led :1; 123 }; 124 } keyboard_config_t; 125 126 extern keyboard_config_t keyboard_config;