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.
@@ -0,0 +1,24 @@
/* Copyright 2017 Pawnerd
*
* 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
+120
View File
@@ -0,0 +1,120 @@
#include "../../m6_a.h"
/*KNOPS_MISC*/
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*KNOPS_KEYMAP*/
};
void set_led_state(int ledId, bool state) {
if(state) {
switch(ledId) {
case 0:
PORTD |= (1<<6);
break;
case 1:
PORTB |= (1<<6);
break;
case 2:
PORTF |= (1<<5);
break;
case 3:
PORTB |= (1<<4);
break;
case 4:
PORTC |= (1<<7);
break;
case 5:
PORTF |= (1<<7);
break;
}
} else {
switch(ledId) {
case 0:
PORTD &= ~(1<<6);
break;
case 1:
PORTB &= ~(1<<6);
break;
case 2:
PORTF &= ~(1<<5);
break;
case 3:
PORTB &= ~(1<<4);
break;
case 4:
PORTC &= ~(1<<7);
break;
case 5:
PORTF &= ~(1<<7);
break;
}
}
}
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_layer(int layer) {
/*KNOPS_SIMPLELED_STATES*/
}
void matrix_init_user(void) {
led_init_ports();
led_set_layer(0);
/*KNOPS_INIT*/
}
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
//keyevent_t event = record->event;
/*KNOPS_MACRO*/
return NULL;
}
void matrix_scan_user(void) {
/*KNOPS_SCAN*/
}
void led_set_user(uint8_t usb_led) {
/*KNOPS_FUNCTIONALLED_STATES*/
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
/*KNOPS_PROCESS_STATE*/
return NULL;
}
@@ -0,0 +1,11 @@
# Default Knops Mini Layout
![Knops logo](http://knops.io/img/Knops_logo.jpg)
![Knops Mini Layout Image](https://i.imgur.com/WQBQctm.png)
This is the keymap that our configurator uses to compile new keymaps and features. Here is a screenshot:
![Knops Mini Layout Image](https://i.imgur.com/afH1NOt.png)
As of 12th of february 2018, this tool has not yet been released to the public. You may have a look at our older tool, KBFlasher: [our (almost outdated) configurator tool](http://knops.io/configurator.html) for this.