* Initial commit of RAMA M6-A firmware. * Added LED support * Added Knops support * Fixed compile error for knops keymap. * updated readme.md * updated readme.md * updated readme.md
		
			
				
	
	
		
			299 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			299 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "../../m6_a.h"
 | |
| 
 | |
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | |
| 
 | |
| 	KEYMAP(
 | |
| 		TO(1), KC_A, KC_B, KC_C, KC_D, KC_E),
 | |
| 
 | |
| 	KEYMAP(
 | |
| 		TO(2), KC_F, KC_G, KC_H, KC_I, KC_J),
 | |
| 
 | |
| 	KEYMAP(
 | |
| 		TO(3), KC_K, KC_L, KC_M, KC_N, KC_O),
 | |
| 
 | |
| 	KEYMAP(
 | |
| 		TO(4), KC_P, KC_Q, KC_R, KC_S, KC_T),
 | |
| 
 | |
| 	KEYMAP(
 | |
| 		TO(5), KC_U, KC_V, KC_W, KC_X, KC_Y),
 | |
| 
 | |
| 	KEYMAP(
 | |
| 		TO(0), KC_Z, KC_1, KC_2, KC_3, KC_4)
 | |
| };
 | |
| 
 | |
| const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
 | |
| 	//keyevent_t event = record->event;
 | |
| 
 | |
| 	switch (id) {
 | |
| 		case 0:
 | |
| 			if (record->event.pressed) {
 | |
| 				return MACRO( T(T), T(G), T(L), T(H), T(F), T(ENT), END );
 | |
| 			}
 | |
| 			break;
 | |
| 		case 1:
 | |
| 			if (record->event.pressed) {
 | |
| 				return MACRO( T(T), T(G), T(G), T(ENT), END );
 | |
| 			}
 | |
| 			break;
 | |
| 		case 2:
 | |
| 			if (record->event.pressed) {
 | |
| 				return MACRO( D(NO), T(L), U(NO), END );
 | |
| 			}
 | |
| 			break;
 | |
| 		case 3:
 | |
| 			if (record->event.pressed) {
 | |
| 				return MACRO( D(LCTL), T(Z), U(LCTL), END );
 | |
| 			}
 | |
| 			break;
 | |
| 		case 4:
 | |
| 			if (record->event.pressed) {
 | |
| 				return MACRO( D(LCTL), D(LSFT), T(Z), U(LSFT), U(LCTL), END );
 | |
| 			}
 | |
| 			break;
 | |
| 		case 5:
 | |
| 			if (record->event.pressed) {
 | |
| 				return MACRO( D(LCTL), T(X), U(LCTL), END );
 | |
| 			}
 | |
| 			break;
 | |
| 		case 6:
 | |
| 			if (record->event.pressed) {
 | |
| 				return MACRO( D(LCTL), T(C), U(LCTL), END );
 | |
| 			}
 | |
| 			break;
 | |
| 		case 7:
 | |
| 			if (record->event.pressed) {
 | |
| 				return MACRO( D(LCTL), T(V), U(LCTL), END );
 | |
| 			}
 | |
| 			break;
 | |
| 	}
 | |
| 	return MACRO_NONE;
 | |
| }
 | |
| 
 | |
| // M6-A LEDs are connected to D6, B6, F5, B4, C7, F7
 | |
| // This is 1-based because I copied it from Knops code.
 | |
| void set_switch_led(int ledId, bool state) {
 | |
| 	if(state) {
 | |
| 		switch(ledId) {
 | |
| 			case 1:
 | |
| 				PORTD |= (1<<6);
 | |
| 				break;
 | |
| 			case 2:
 | |
| 				PORTB |= (1<<6);
 | |
| 				break;
 | |
| 			case 3:
 | |
| 				PORTF |= (1<<5);
 | |
| 				break;
 | |
| 			case 4:
 | |
| 				PORTB |= (1<<4);
 | |
| 				break;
 | |
| 			case 5:
 | |
| 				PORTC |= (1<<7);
 | |
| 				break;
 | |
| 			case 6:
 | |
| 				PORTF |= (1<<7);
 | |
| 				break;
 | |
| 		}
 | |
| 	} else {
 | |
| 		switch(ledId) {
 | |
| 			case 1:
 | |
| 				PORTD &= ~(1<<6);
 | |
| 				break;
 | |
| 			case 2:
 | |
| 				PORTB &= ~(1<<6);
 | |
| 				break;
 | |
| 			case 3:
 | |
| 				PORTF &= ~(1<<5);
 | |
| 				break;
 | |
| 			case 4:
 | |
| 				PORTB &= ~(1<<4);
 | |
| 				break;
 | |
| 			case 5:
 | |
| 				PORTC &= ~(1<<7);
 | |
| 				break;
 | |
| 			case 6:
 | |
| 				PORTF &= ~(1<<7);
 | |
| 				break;
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| void set_layer_led(int layerId) {
 | |
| 	// UNUSED
 | |
| }
 | |
| 
 | |
| void led_set_layer(int layer);
 | |
| 
 | |
| void matrix_init_user(void) {
 | |
| 	led_init_ports();
 | |
| 	led_set_layer(0);
 | |
| }
 | |
| 
 | |
| void matrix_scan_user(void) {
 | |
| }
 | |
| 
 | |
| // M6-A LEDs are connected to D6, B6, F5, B4, C7, F7
 | |
| void led_init_ports() {
 | |
| 	// Switch #1
 | |
| 	DDRD |= (1<<6);
 | |
| 	PORTD &= ~(1<<6);
 | |
| 	
 | |
| 	// Switch #2
 | |
| 	DDRB |= (1<<6);
 | |
| 	PORTB &= ~(1<<6);
 | |
| 	
 | |
| 	// Switch #3
 | |
| 	DDRF |= (1<<5);
 | |
| 	PORTF &= ~(1<<5);
 | |
| 	
 | |
| 	// Switch #4
 | |
| 	DDRB |= (1<<4);
 | |
| 	PORTB &= ~(1<<4);
 | |
| 
 | |
| 	// Switch #5
 | |
| 	DDRC |= (1<<7);
 | |
| 	PORTC &= ~(1<<7);
 | |
| 	
 | |
| 	// Switch #6
 | |
| 	DDRF |= (1<<7);
 | |
| 	PORTF &= ~(1<<7);
 | |
| }
 | |
| 
 | |
| void led_set_user(uint8_t usb_led) {
 | |
| 
 | |
| 	if (usb_led & (1 << USB_LED_NUM_LOCK)) {
 | |
| 		
 | |
| 	} else {
 | |
| 		
 | |
| 	}
 | |
| 
 | |
| 	if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
 | |
| 
 | |
| 	} else {
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
 | |
| 		
 | |
| 	} else {
 | |
| 		
 | |
| 	}
 | |
| 
 | |
| 	if (usb_led & (1 << USB_LED_COMPOSE)) {
 | |
| 		
 | |
| 	} else {
 | |
| 		
 | |
| 	}
 | |
| 
 | |
| 	if (usb_led & (1 << USB_LED_KANA)) {
 | |
| 		
 | |
| 	} else {
 | |
| 		
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| void led_set_layer(int layer) {
 | |
| 	switch(layer) {
 | |
| 		case 0:
 | |
| 			set_switch_led(1, true);
 | |
| 			set_switch_led(2, false);
 | |
| 			set_switch_led(3, false);
 | |
| 			set_switch_led(4, false);
 | |
| 			set_switch_led(5, false);
 | |
| 			set_switch_led(6, false);
 | |
| 			break;
 | |
| 		case 1:
 | |
| 			set_switch_led(1, false);
 | |
| 			set_switch_led(2, true);
 | |
| 			set_switch_led(3, false);
 | |
| 			set_switch_led(4, false);
 | |
| 			set_switch_led(5, false);
 | |
| 			set_switch_led(6, false);
 | |
| 			break;
 | |
| 		case 2:
 | |
| 			set_switch_led(1, false);
 | |
| 			set_switch_led(2, false);
 | |
| 			set_switch_led(3, true);
 | |
| 			set_switch_led(4, false);
 | |
| 			set_switch_led(5, false);
 | |
| 			set_switch_led(6, false);
 | |
| 			break;
 | |
| 		case 3:
 | |
| 			set_switch_led(1, false);
 | |
| 			set_switch_led(2, false);
 | |
| 			set_switch_led(3, false);
 | |
| 			set_switch_led(4, true);
 | |
| 			set_switch_led(5, false);
 | |
| 			set_switch_led(6, false);
 | |
| 			break;
 | |
| 		case 4:
 | |
| 			set_switch_led(1, false);
 | |
| 			set_switch_led(2, false);
 | |
| 			set_switch_led(3, false);
 | |
| 			set_switch_led(4, false);
 | |
| 			set_switch_led(5, true);
 | |
| 			set_switch_led(6, false);
 | |
| 			break;
 | |
| 		case 5:
 | |
| 			set_switch_led(1, false);
 | |
| 			set_switch_led(2, false);
 | |
| 			set_switch_led(3, false);
 | |
| 			set_switch_led(4, false);
 | |
| 			set_switch_led(5, false);
 | |
| 			set_switch_led(6, true);
 | |
| 			break;
 | |
| 		default:
 | |
| 			set_switch_led(1, true);
 | |
| 			set_switch_led(2, true);
 | |
| 			set_switch_led(3, true);
 | |
| 			set_switch_led(4, true);
 | |
| 			set_switch_led(5, true);
 | |
| 			set_switch_led(6, true);
 | |
| 			break;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| bool process_record_user (uint16_t keycode, keyrecord_t *record) {
 | |
| 	switch ( keycode )
 | |
| 	{
 | |
| 		case TO( 0 ):
 | |
| 			if ( record->event.pressed )
 | |
| 			{
 | |
| 				led_set_layer( 0 );
 | |
| 			}
 | |
| 			break;
 | |
| 		case TO( 1 ):
 | |
| 			if ( record->event.pressed )
 | |
| 			{
 | |
| 				led_set_layer( 1 );
 | |
| 			}
 | |
| 			break;
 | |
| 		case TO( 2 ):
 | |
| 			if ( record->event.pressed )
 | |
| 			{
 | |
| 				led_set_layer( 2 );
 | |
| 			}
 | |
| 			break;
 | |
| 		case TO( 3 ):
 | |
| 			if ( record->event.pressed )
 | |
| 			{
 | |
| 				led_set_layer( 3 );
 | |
| 			}
 | |
| 			break;
 | |
| 		case TO( 4 ):
 | |
| 			if ( record->event.pressed )
 | |
| 			{
 | |
| 				led_set_layer( 4 );
 | |
| 			}
 | |
| 			break;
 | |
| 		case TO( 5 ):
 | |
| 			if ( record->event.pressed )
 | |
| 			{
 | |
| 				led_set_layer( 5 );
 | |
| 			}
 | |
| 			break;
 | |
| 	}
 | |
| 	return true;
 | |
| }
 |