forked from mirrors/qmk_userspace
		
	Promethium rev2
* 10 more indicator LEDs * Piezo buzzer * Uses HC138 decoder to free up 5 pins * Trackpoint buttons are now part of matrix
This commit is contained in:
		
					parent
					
						
							
								ae8ac581c0
							
						
					
				
			
			
				commit
				
					
						93b2f23bba
					
				
			
		
					 7 changed files with 374 additions and 30 deletions
				
			
		| 
						 | 
				
			
			@ -35,12 +35,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
#define DESCRIPTION
 | 
			
		||||
 | 
			
		||||
/* key matrix size */
 | 
			
		||||
#define MATRIX_ROWS 8
 | 
			
		||||
#define MATRIX_COLS 6
 | 
			
		||||
#define MATRIX_ROWS 9
 | 
			
		||||
 | 
			
		||||
/* default pin-out */
 | 
			
		||||
#define MATRIX_COL_PINS { B6, B7, D6, C7, F6, F7 }
 | 
			
		||||
#define MATRIX_ROW_PINS { D7, C6, D0, D1, F5, F4, F1, F0 }
 | 
			
		||||
#define MATRIX_COL_PINS { F4, F1, F0, D6, D0, D1 }
 | 
			
		||||
#define MATRIX_ROW_PINS { F5, F6, F7 }
 | 
			
		||||
#define TRACKPOINT_PINS { B7, B6, D7 }
 | 
			
		||||
#define UNUSED_PINS
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -152,17 +153,20 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
//#define NO_ACTION_MACRO
 | 
			
		||||
//#define NO_ACTION_FUNCTION
 | 
			
		||||
 | 
			
		||||
#define PS2_INIT_DELAY 2000
 | 
			
		||||
#define PS2_INIT_DELAY 3000
 | 
			
		||||
#define BATTERY_PIN 9
 | 
			
		||||
#define BATTERY_POLL 30000
 | 
			
		||||
#define MAX_VOLTAGE 4.2
 | 
			
		||||
#define MIN_VOLTAGE 3.2
 | 
			
		||||
 | 
			
		||||
#define ___ KC_NO
 | 
			
		||||
 | 
			
		||||
#define KEYMAP( \
 | 
			
		||||
    k11, k12, k13, k14, k15, k16,      k17, k18, k19, k1a, k1b, k1c, \
 | 
			
		||||
    k21, k22, k23, k24, k25, k26,      k27, k28, k29, k2a, k2b, k2c, \
 | 
			
		||||
    k31, k32, k33, k34, k35, k36,      k37, k38, k39, k3a, k3b, k3c, \
 | 
			
		||||
    k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c \
 | 
			
		||||
    k41, k42, k43, k44, k45, k46,      k47, k48, k49, k4a, k4b, k4c, \
 | 
			
		||||
                             tp1, tp2, tp3 \
 | 
			
		||||
) \
 | 
			
		||||
{ \
 | 
			
		||||
    {k11, k12, k13, k14, k15, k16}, \
 | 
			
		||||
| 
						 | 
				
			
			@ -172,18 +176,29 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
    {k17, k18, k19, k1a, k1b, k1c}, \
 | 
			
		||||
    {k27, k28, k29, k2a, k2b, k2c}, \
 | 
			
		||||
    {k37, k38, k39, k3a, k3b, k3c}, \
 | 
			
		||||
    {k47, k48, k49, k4a, k4b, k4c} \
 | 
			
		||||
    {k47, k48, k49, k4a, k4b, k4c}, \
 | 
			
		||||
    {tp1, tp2, tp3, ___, ___, ___}  \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLER__ // assembler doesn't like enum in .h file
 | 
			
		||||
enum led_sequence {
 | 
			
		||||
  LED_IND_LINUX,
 | 
			
		||||
  LED_IND_APPLE,
 | 
			
		||||
  LED_IND_WINDOWS,
 | 
			
		||||
  LED_IND_QWERTY,
 | 
			
		||||
  LED_IND_ALT,
 | 
			
		||||
  LED_IND_AUDIO,
 | 
			
		||||
  LED_IND_BLUETOOTH,
 | 
			
		||||
  LED_IND_USB,
 | 
			
		||||
  LED_IND_BATTERY,
 | 
			
		||||
 | 
			
		||||
  LED_IND_BATTERY,
 | 
			
		||||
  LED_IND_CAPSLOCK,
 | 
			
		||||
  LED_IND_GUI,
 | 
			
		||||
  LED_IND_FUN,
 | 
			
		||||
  LED_IND_NUM,
 | 
			
		||||
  LED_IND_PUNC,
 | 
			
		||||
  LED_IND_EMOJI,
 | 
			
		||||
  LED_IND_GREEK,
 | 
			
		||||
 | 
			
		||||
  LED_BKSP,
 | 
			
		||||
  LED_ENT,
 | 
			
		||||
| 
						 | 
				
			
			@ -261,7 +276,7 @@ enum led_sequence {
 | 
			
		|||
#   define PS2_CLOCK_PORT  PORTD
 | 
			
		||||
#   define PS2_CLOCK_PIN   PIND
 | 
			
		||||
#   define PS2_CLOCK_DDR   DDRD
 | 
			
		||||
#   define PS2_CLOCK_BIT   1
 | 
			
		||||
#   define PS2_CLOCK_BIT   3
 | 
			
		||||
#   define PS2_DATA_PORT   PORTD
 | 
			
		||||
#   define PS2_DATA_PIN    PIND
 | 
			
		||||
#   define PS2_DATA_DDR    DDRD
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@ BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
			
		|||
RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 | 
			
		||||
PS2_MOUSE_ENABLE = yes
 | 
			
		||||
PS2_USE_INT = yes
 | 
			
		||||
FAUXCLICKY_ENABLE = yes
 | 
			
		||||
 | 
			
		||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 | 
			
		||||
SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -574,7 +574,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC,
 | 
			
		||||
  KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_QUOT, 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,
 | 
			
		||||
  KC_LCTL, KC_LALT, KC_LGUI, EMPTY,   NUM,     LSPACE,  RSPACE,  FUN,     GREEK,   KC_RGUI, C_RALT,  KC_RCTL
 | 
			
		||||
  KC_LCTL, KC_LALT, KC_LGUI, EMPTY,   NUM,     LSPACE,  RSPACE,  FUN,     GREEK,   KC_RGUI, C_RALT,  KC_RCTL,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Dvorak
 | 
			
		||||
| 
						 | 
				
			
			@ -593,7 +594,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  _______, KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    _______,
 | 
			
		||||
  _______, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    _______,
 | 
			
		||||
  _______, KC_SLSH, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    _______,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -614,7 +616,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  _______, KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_QUOT, _______,
 | 
			
		||||
  _______, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    _______,
 | 
			
		||||
  _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -635,7 +638,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  _______, KC_Q,    KC_W,    KC_D,    KC_F,    KC_K,    KC_J,    KC_U,    KC_R,    KC_L,    KC_QUOT, _______,
 | 
			
		||||
  _______, KC_A,    KC_S,    KC_E,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_I,    KC_O,    KC_H,    _______,
 | 
			
		||||
  _______, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_P,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, _______,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -656,7 +660,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  _______, KC_Q,    KC_D,    KC_R,    KC_W,    KC_B,    KC_J,    KC_F,    KC_U,    KC_P,    KC_QUOT, _______,
 | 
			
		||||
  _______, KC_A,    KC_S,    KC_H,    KC_T,    KC_G,    KC_Y,    KC_N,    KC_E,    KC_O,    KC_I,    _______,
 | 
			
		||||
  _______, KC_Z,    KC_X,    KC_M,    KC_C,    KC_V,    KC_K,    KC_L,    KC_COMM, KC_DOT,  KC_SLSH, _______,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -675,7 +680,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
 | 
			
		||||
  KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
 | 
			
		||||
  KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_COLN, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Num
 | 
			
		||||
| 
						 | 
				
			
			@ -690,10 +696,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
 * `-----------------------------------------------------------------------------------'
 | 
			
		||||
 */
 | 
			
		||||
[_NUM] = KEYMAP(
 | 
			
		||||
  KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, S(KC_A),  KC_7,    KC_8,    KC_9,   S(KC_D), _______,
 | 
			
		||||
  KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, S(KC_A),  KC_1,    KC_2,    KC_3,   S(KC_D), _______,
 | 
			
		||||
  KC_GRV,  KC_ASTR, KC_BSLS, KC_MINS,  KC_EQL, KC_SLSH, S(KC_B),  KC_4,    KC_5,    KC_6,   S(KC_E), _______,
 | 
			
		||||
  KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C),  KC_1,    KC_2,    KC_3,   S(KC_F), _______,
 | 
			
		||||
  _______, _______, KC_X,    _______, _______, _______, _______,  FUN0 ,   KC_COMM, KC_DOT, KC_COLN, _______
 | 
			
		||||
  KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C),  KC_7,    KC_8,    KC_9,   S(KC_F), _______,
 | 
			
		||||
  _______, _______, KC_X,    _______, _______, _______, _______,  FUN0 ,   KC_COMM, KC_DOT, KC_COLN, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Func
 | 
			
		||||
| 
						 | 
				
			
			@ -711,7 +718,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  XXXXXXX,   KC_F1,   KC_F2,   KC_F3,  KC_F4,   KC_INS,  XXXXXXX, KC_PGUP,   KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
 | 
			
		||||
  KC_CAPS,   KC_F5,   KC_F6,   KC_F7,  KC_F8,   KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
 | 
			
		||||
  _______,   KC_F9,  KC_F10,  KC_F11,  KC_F12,  KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME,  KC_END, XXXXXXX, _______,
 | 
			
		||||
  _______, _______, _______, _______,  _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
  _______, _______, _______, _______,  _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Uppercase Greek
 | 
			
		||||
| 
						 | 
				
			
			@ -729,7 +737,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  _______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC),  X(UPI), _______,
 | 
			
		||||
  _______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA),  X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
 | 
			
		||||
  _______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA),  X(UNU),  X(UMU), KC_COMM, KC_DOT,  KC_SLSH, _______,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Lowercase Greek
 | 
			
		||||
| 
						 | 
				
			
			@ -747,7 +756,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  _______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC),  X(LPI), _______,
 | 
			
		||||
  _______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA),  X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
 | 
			
		||||
  _______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA),  X(LNU),  X(LMU), KC_COMM, KC_DOT,  KC_SLSH, _______,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Empty
 | 
			
		||||
| 
						 | 
				
			
			@ -765,7 +775,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
 | 
			
		||||
  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
 | 
			
		||||
  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
 | 
			
		||||
  _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Emoji
 | 
			
		||||
| 
						 | 
				
			
			@ -783,7 +794,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
 | 
			
		||||
  X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART),  X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
 | 
			
		||||
  X(THMDN),X(SLEEP), X(CLAP),  X(CRY),  X(VIC),X(BHART),  X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
 | 
			
		||||
    X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK)
 | 
			
		||||
    X(POO), X(EYES), X(HUNRD),_______, X(SKULL),X(HORNS), X(HALO), X(FEAR),_______,X(YUMMY),X(DISAP),X(NOEVK),
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* GUI
 | 
			
		||||
| 
						 | 
				
			
			@ -801,7 +813,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
  XXXXXXX, G(KC_1), G(KC_2), G(KC_3), G(KC_4), G(KC_5), G(KC_6), G(KC_7), G(KC_8), G(KC_9), G(KC_0), XXXXXXX,
 | 
			
		||||
  KC_ESC,  XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB,  XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
 | 
			
		||||
  XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC,  KC_SPC,  KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
 | 
			
		||||
  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
 | 
			
		||||
  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
/* Sys
 | 
			
		||||
| 
						 | 
				
			
			@ -816,10 +829,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
 * `-----------------------------------------------------------------------------------'
 | 
			
		||||
 */
 | 
			
		||||
[_SYS] = KEYMAP(
 | 
			
		||||
  XXXXXXX, QWERTY,  WIN,     XXXXXXX, RESET,   XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
 | 
			
		||||
  DEBUG,   QWERTY,  WIN,     XXXXXXX, RESET,   XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
 | 
			
		||||
  XXXXXXX, FC_TOG,  XXXXXXX, DVORAK,  XXXXXXX, GLOW,    XXXXXXX, XXXXXXX, WORKMAN, LINUX,   XXXXXXX, XXXXXXX,
 | 
			
		||||
  XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BLE, NORMAN,  OSX,     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
 | 
			
		||||
  _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
 | 
			
		||||
  _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
 | 
			
		||||
                                           _______, _______, _______
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										306
									
								
								keyboards/handwired/promethium/matrix.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										306
									
								
								keyboards/handwired/promethium/matrix.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,306 @@
 | 
			
		|||
/*
 | 
			
		||||
Copyright 2012 Jun Wako
 | 
			
		||||
Copyright 2014 Jack Humbert
 | 
			
		||||
Copyright 2017 Priyadi Iman Nurcahyo
 | 
			
		||||
 | 
			
		||||
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 <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#if defined(__AVR__)
 | 
			
		||||
#include <avr/io.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include "wait.h"
 | 
			
		||||
#include "print.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "util.h"
 | 
			
		||||
#include "matrix.h"
 | 
			
		||||
#include "timer.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Set 0 if debouncing isn't needed */
 | 
			
		||||
 | 
			
		||||
#ifndef DEBOUNCING_DELAY
 | 
			
		||||
#   define DEBOUNCING_DELAY 5
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if (DEBOUNCING_DELAY > 0)
 | 
			
		||||
    static uint16_t debouncing_time;
 | 
			
		||||
    static bool debouncing = false;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if (MATRIX_COLS <= 8)
 | 
			
		||||
#    define print_matrix_header()  print("\nr/c 01234567\n")
 | 
			
		||||
#    define print_matrix_row(row)  print_bin_reverse8(matrix_get_row(row))
 | 
			
		||||
#    define matrix_bitpop(i)       bitpop(matrix[i])
 | 
			
		||||
#    define ROW_SHIFTER ((uint8_t)1)
 | 
			
		||||
#elif (MATRIX_COLS <= 16)
 | 
			
		||||
#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF\n")
 | 
			
		||||
#    define print_matrix_row(row)  print_bin_reverse16(matrix_get_row(row))
 | 
			
		||||
#    define matrix_bitpop(i)       bitpop16(matrix[i])
 | 
			
		||||
#    define ROW_SHIFTER ((uint16_t)1)
 | 
			
		||||
#elif (MATRIX_COLS <= 32)
 | 
			
		||||
#    define print_matrix_header()  print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
 | 
			
		||||
#    define print_matrix_row(row)  print_bin_reverse32(matrix_get_row(row))
 | 
			
		||||
#    define matrix_bitpop(i)       bitpop32(matrix[i])
 | 
			
		||||
#    define ROW_SHIFTER  ((uint32_t)1)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef MATRIX_MASKED
 | 
			
		||||
    extern const matrix_row_t matrix_mask[];
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
 | 
			
		||||
static const uint8_t tp_pins[3] = TRACKPOINT_PINS;
 | 
			
		||||
 | 
			
		||||
/* matrix state(1:on, 0:off) */
 | 
			
		||||
static matrix_row_t matrix[MATRIX_ROWS];
 | 
			
		||||
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
 | 
			
		||||
 | 
			
		||||
static void init_cols(void);
 | 
			
		||||
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row);
 | 
			
		||||
static void unselect_rows(void);
 | 
			
		||||
static void select_row(uint8_t row);
 | 
			
		||||
static void unselect_row(uint8_t row);
 | 
			
		||||
 | 
			
		||||
__attribute__ ((weak))
 | 
			
		||||
void matrix_init_quantum(void) {
 | 
			
		||||
    matrix_init_kb();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__ ((weak))
 | 
			
		||||
void matrix_scan_quantum(void) {
 | 
			
		||||
    matrix_scan_kb();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__ ((weak))
 | 
			
		||||
void matrix_init_kb(void) {
 | 
			
		||||
    matrix_init_user();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__ ((weak))
 | 
			
		||||
void matrix_scan_kb(void) {
 | 
			
		||||
    matrix_scan_user();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__ ((weak))
 | 
			
		||||
void matrix_init_user(void) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__attribute__ ((weak))
 | 
			
		||||
void matrix_scan_user(void) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline
 | 
			
		||||
uint8_t matrix_rows(void) {
 | 
			
		||||
    return MATRIX_ROWS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline
 | 
			
		||||
uint8_t matrix_cols(void) {
 | 
			
		||||
    return MATRIX_COLS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void matrix_init(void) {
 | 
			
		||||
 | 
			
		||||
    // To use PORTF disable JTAG with writing JTD bit twice within four cycles.
 | 
			
		||||
    #if  (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__) || defined(__AVR_ATmega32U4__))
 | 
			
		||||
        MCUCR |= _BV(JTD);
 | 
			
		||||
        MCUCR |= _BV(JTD);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    // initialize row and col
 | 
			
		||||
    unselect_rows();
 | 
			
		||||
    init_cols();
 | 
			
		||||
 | 
			
		||||
    // initialize matrix state: all keys off
 | 
			
		||||
    for (uint8_t i=0; i < MATRIX_ROWS; i++) {
 | 
			
		||||
        matrix[i] = 0;
 | 
			
		||||
        matrix_debouncing[i] = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    matrix_init_quantum();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t matrix_scan(void
 | 
			
		||||
){
 | 
			
		||||
    // Set row, read cols
 | 
			
		||||
    for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
 | 
			
		||||
#       if (DEBOUNCING_DELAY > 0)
 | 
			
		||||
            bool matrix_changed = read_cols_on_row(matrix_debouncing, current_row);
 | 
			
		||||
 | 
			
		||||
            if (matrix_changed) {
 | 
			
		||||
                debouncing = true;
 | 
			
		||||
                debouncing_time = timer_read();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
#       else
 | 
			
		||||
            read_cols_on_row(matrix, current_row);
 | 
			
		||||
#       endif
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#   if (DEBOUNCING_DELAY > 0)
 | 
			
		||||
        if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) {
 | 
			
		||||
            for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
 | 
			
		||||
                matrix[i] = matrix_debouncing[i];
 | 
			
		||||
            }
 | 
			
		||||
            debouncing = false;
 | 
			
		||||
        }
 | 
			
		||||
#   endif
 | 
			
		||||
 | 
			
		||||
    matrix_scan_quantum();
 | 
			
		||||
    return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool matrix_is_modified(void)
 | 
			
		||||
{
 | 
			
		||||
#if (DEBOUNCING_DELAY > 0)
 | 
			
		||||
    if (debouncing) return false;
 | 
			
		||||
#endif
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline
 | 
			
		||||
bool matrix_is_on(uint8_t row, uint8_t col)
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
    return (matrix[row] & ((matrix_row_t)1<col));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline
 | 
			
		||||
matrix_row_t matrix_get_row(uint8_t row)
 | 
			
		||||
{
 | 
			
		||||
    // Matrix mask lets you disable switches in the returned matrix data. For example, if you have a
 | 
			
		||||
    // switch blocker installed and the switch is always pressed.
 | 
			
		||||
#ifdef MATRIX_MASKED
 | 
			
		||||
    return matrix[row] & matrix_mask[row];
 | 
			
		||||
#else
 | 
			
		||||
    return matrix[row];
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void matrix_print(void)
 | 
			
		||||
{
 | 
			
		||||
    print_matrix_header();
 | 
			
		||||
 | 
			
		||||
    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
 | 
			
		||||
        phex(row); print(": ");
 | 
			
		||||
        print_matrix_row(row);
 | 
			
		||||
        print("\n");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t matrix_key_count(void)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t count = 0;
 | 
			
		||||
    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
 | 
			
		||||
        count += matrix_bitpop(i);
 | 
			
		||||
    }
 | 
			
		||||
    return count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define ROW_MASK 0b11100000
 | 
			
		||||
 | 
			
		||||
static const uint8_t row_bit[MATRIX_ROWS] = {
 | 
			
		||||
  //  76543210
 | 
			
		||||
    0b00000000,
 | 
			
		||||
    0b00100000,
 | 
			
		||||
    0b01000000,
 | 
			
		||||
    0b01100000,
 | 
			
		||||
    0b10000000,
 | 
			
		||||
    0b10100000,
 | 
			
		||||
    0b11000000,
 | 
			
		||||
    0b11100000,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void init_cols(void)
 | 
			
		||||
{
 | 
			
		||||
    // columns
 | 
			
		||||
    for(uint8_t x = 0; x < MATRIX_COLS; x++) {
 | 
			
		||||
        uint8_t pin = col_pins[x];
 | 
			
		||||
        _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
 | 
			
		||||
        _SFR_IO8((pin >> 4) + 2) |=  _BV(pin & 0xF); // HI
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // rows
 | 
			
		||||
    DDRF  |=  ROW_MASK;
 | 
			
		||||
    PORTF &= ~ROW_MASK;
 | 
			
		||||
 | 
			
		||||
    // trackpoint
 | 
			
		||||
    for(uint8_t x = 0; x < 3; x++) {
 | 
			
		||||
        uint8_t pin = tp_pins[x];
 | 
			
		||||
        _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
 | 
			
		||||
        _SFR_IO8((pin >> 4) + 2) |=  _BV(pin & 0xF); // HI
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
 | 
			
		||||
    {
 | 
			
		||||
        // Store last value of row prior to reading
 | 
			
		||||
        matrix_row_t last_row_value = current_matrix[current_row];
 | 
			
		||||
 | 
			
		||||
        // Clear data in matrix row
 | 
			
		||||
        current_matrix[current_row] = 0;
 | 
			
		||||
 | 
			
		||||
        // special case for trackpoint
 | 
			
		||||
        if (current_row == 8) {
 | 
			
		||||
            for(uint8_t tp_index = 0; tp_index < 3; tp_index++) {
 | 
			
		||||
 | 
			
		||||
                // Select the TP pin to read (active low)
 | 
			
		||||
                uint8_t pin = tp_pins[tp_index];
 | 
			
		||||
                uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF));
 | 
			
		||||
 | 
			
		||||
                // Populate the matrix row with the state of the col pin
 | 
			
		||||
                current_matrix[current_row] |=  pin_state ? 0 : (ROW_SHIFTER << tp_index);
 | 
			
		||||
            }
 | 
			
		||||
            return (last_row_value != current_matrix[current_row]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Select row and wait for row selecton to stabilize
 | 
			
		||||
        select_row(current_row);
 | 
			
		||||
        _delay_us(5);       // without this wait it won't read stable value.
 | 
			
		||||
        // wait_us(50);
 | 
			
		||||
 | 
			
		||||
        // For each col...
 | 
			
		||||
        for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
 | 
			
		||||
 | 
			
		||||
            // Select the col pin to read (active low)
 | 
			
		||||
            uint8_t pin = col_pins[col_index];
 | 
			
		||||
            uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF));
 | 
			
		||||
 | 
			
		||||
            // Populate the matrix row with the state of the col pin
 | 
			
		||||
            current_matrix[current_row] |=  pin_state ? 0 : (ROW_SHIFTER << col_index);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Unselect row
 | 
			
		||||
        unselect_row(current_row);
 | 
			
		||||
 | 
			
		||||
        return (last_row_value != current_matrix[current_row]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void select_row(uint8_t row)
 | 
			
		||||
{
 | 
			
		||||
    PORTF = row_bit[row] | (PORTF & ~ROW_MASK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void unselect_row(uint8_t row)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void unselect_rows(void)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2,6 +2,11 @@
 | 
			
		|||
#include "analog.h"
 | 
			
		||||
#include "timer.h"
 | 
			
		||||
#include "matrix.h"
 | 
			
		||||
#include "musical_notes.h"
 | 
			
		||||
 | 
			
		||||
float fauxclicky_pressed_note[2] = MUSICAL_NOTE(_F3, .03125);
 | 
			
		||||
float fauxclicky_released_note[2] = MUSICAL_NOTE(_C3, .03125);
 | 
			
		||||
float fauxclicky_beep_note[2] = MUSICAL_NOTE(_C3, .03125);
 | 
			
		||||
 | 
			
		||||
// cubic fit {3.3, 0}, {3.5, 2.9}, {3.6, 5}, {3.7, 8.6}, {3.8, 36},  {3.9, 62}, {4.0, 73}, {4.05, 83}, {4.1, 89}, {4.15, 94}, {4.2, 100}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,6 +67,7 @@ PS2_MOUSE_ENABLE ?= yes
 | 
			
		|||
PS2_USE_INT ?= yes
 | 
			
		||||
ADAFRUIT_BLE_ENABLE ?= yes
 | 
			
		||||
API_SYSEX_ENABLE ?= no
 | 
			
		||||
CUSTOM_MATRIX ?= yes
 | 
			
		||||
 | 
			
		||||
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 | 
			
		||||
SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
 | 
			
		||||
| 
						 | 
				
			
			@ -74,3 +75,4 @@ SLEEP_LED_ENABLE ?= no    # Breathing sleep LED during USB suspend
 | 
			
		|||
SRC += $(QUANTUM_DIR)/light_ws2812.c
 | 
			
		||||
SRC += rgbsps.c
 | 
			
		||||
SRC += $(QUANTUM_DIR)/analog.c
 | 
			
		||||
SRC += matrix.c
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,8 @@
 | 
			
		|||
    k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \
 | 
			
		||||
    k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \
 | 
			
		||||
    k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \
 | 
			
		||||
    k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c \
 | 
			
		||||
    k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, \
 | 
			
		||||
    tp1, tp2, tp3 \
 | 
			
		||||
) \
 | 
			
		||||
{ \
 | 
			
		||||
    {k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c}, \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue