Initial support for RAMA M6-A (#2600)

* 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
This commit is contained in:
Wilba6582
2018-03-25 15:58:55 +11:00
committed by Jack Humbert
parent 00dfa73e4c
commit 59a784500b
12 changed files with 844 additions and 0 deletions
@@ -0,0 +1,24 @@
/* Copyright 2018 Wilba
*
* 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/>.
*/
#ifndef CONFIG_USER_H
#define CONFIG_USER_H
#include "../../config.h"
// place overrides here
#endif
@@ -0,0 +1,298 @@
#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;
}
@@ -0,0 +1,12 @@
![RAMA M6-A Layout Image](https://static1.squarespace.com/static/563c788ae4b099120ae219e2/5ab7287f6d2a738f9a719568/5ab7288c1ae6cfa0dae88a59/1521952909569/m6-layout.jpg)
# Default RAMA M6-A Layout
This is an example layout to demonstrate layer toggling.
The top left key will cycle through six layers.
If LEDs are installed, one of the six LEDs will be on to indicate current layer.
LEDs should be installed cathode pin on the square pad.