[Keyboard] Panc60 Refactor (#5559)

* remove unneeded uart setting

* use pragma once everywhere

* remove custom matrix support

* fixup readme

* set bootmagic to lite

* remove dependency on custom i2c code

* use the right header files and function calls
This commit is contained in:
MechMerlin 2019-04-06 18:08:57 -07:00 committed by Drashna Jaelre
parent 410984486b
commit 5c1ef2bddc
9 changed files with 11 additions and 296 deletions

View File

@ -39,5 +39,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define NO_BACKLIGHT_CLOCK #define NO_BACKLIGHT_CLOCK
#define BACKLIGHT_LEVELS 1 #define BACKLIGHT_LEVELS 1
#define RGBLIGHT_ANIMATIONS #define RGBLIGHT_ANIMATIONS
#define NO_UART 1

View File

@ -1,106 +0,0 @@
/*
Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
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/>.
*/
// Please do not modify this file
#include <avr/io.h>
#include <util/twi.h>
#include "i2c.h"
void i2c_set_bitrate(uint16_t bitrate_khz) {
uint8_t bitrate_div = ((F_CPU / 1000l) / bitrate_khz);
if (bitrate_div >= 16) {
bitrate_div = (bitrate_div - 16) / 2;
}
TWBR = bitrate_div;
}
void i2c_init(void) {
// set pull-up resistors on I2C bus pins
PORTC |= 0b11;
i2c_set_bitrate(400);
// enable TWI (two-wire interface)
TWCR |= (1 << TWEN);
// enable TWI interrupt and slave address ACK
TWCR |= (1 << TWIE);
TWCR |= (1 << TWEA);
}
uint8_t i2c_start(uint8_t address) {
// reset TWI control register
TWCR = 0;
// begin transmission and wait for it to end
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
// check if the start condition was successfully transmitted
if ((TWSR & 0xF8) != TW_START) {
return 1;
}
// transmit address and wait
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
// check if the device has acknowledged the READ / WRITE mode
uint8_t twst = TW_STATUS & 0xF8;
if ((twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK)) {
return 1;
}
return 0;
}
void i2c_stop(void) {
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
uint8_t i2c_write(uint8_t data) {
TWDR = data;
// transmit data and wait
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != TW_MT_DATA_ACK) {
return 1;
}
return 0;
}
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length) {
if (i2c_start(address)) {
return 1;
}
for (uint16_t i = 0; i < length; i++) {
if (i2c_write(data[i])) {
return 1;
}
}
i2c_stop();
return 0;
}

View File

@ -1,27 +0,0 @@
/*
Copyright 2016 Luiz Ribeiro <luizribeiro@gmail.com>
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/>.
*/
// Please do not modify this file
#ifndef __I2C_H__
#define __I2C_H__
void i2c_init(void);
void i2c_set_bitrate(uint16_t bitrate_khz);
uint8_t i2c_send(uint8_t address, uint8_t *data, uint16_t length);
#endif

View File

@ -1,145 +0,0 @@
/*
Copyright 2018 Jack Humbert <jack.humb@gmail.com>
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 <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include "matrix.h"
#ifndef DEBOUNCE
# define DEBOUNCE 5
#endif
__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) { }
// #define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 }
// #define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, D7 }
static uint8_t debouncing = DEBOUNCE;
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
void matrix_init(void) {
// disables JTAG so we can use them as columns
MCUCSR = (1<<JTD);
MCUCSR = (1<<JTD);
// rows (output)
DDRB |= ((1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7));
PORTB |= ((1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7));
// cols (input)
DDRA &= ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7));
DDRC &= ~((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2));
DDRD &= ~((1 << 7));
// pull-up cols
PORTA |= ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7));
PORTC |= ((1 << 7) | (1 << 6) | (1 << 5) | (1 << 4) | (1 << 3) | (1 << 2));
PORTD |= ((1 << 7));
// initialize matrix state: all keys off
for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
matrix[row] = 0x00;
matrix_debouncing[row] = 0x00;
}
matrix_init_quantum();
}
uint8_t matrix_scan(void) {
// actual matrix scan
for (uint8_t c = 0; c < MATRIX_ROWS; c++) {
switch (c) {
case 0: PORTB &= ~(1 << 3); break;
case 1: PORTB &= ~(1 << 4); break;
case 2: PORTB &= ~(1 << 5); break;
case 3: PORTB &= ~(1 << 6); break;
case 4: PORTB &= ~(1 << 7); break;
}
_delay_us(5);
matrix_row_t current_row = (
(((PINA & (1 << 0)) ? 0 : 1 ) << 0) |
(((PINA & (1 << 1)) ? 0 : 1 ) << 1) |
(((PINA & (1 << 2)) ? 0 : 1 ) << 2) |
(((PINA & (1 << 3)) ? 0 : 1 ) << 3) |
(((PINA & (1 << 4)) ? 0 : 1 ) << 4) |
(((PINA & (1 << 5)) ? 0 : 1 ) << 5) |
(((PINA & (1 << 6)) ? 0 : 1 ) << 6) |
(((PINA & (1 << 7)) ? 0 : 1 ) << 7) |
(((PINC & (1 << 7)) ? 0 : 1 ) << 8) |
(((PINC & (1 << 6)) ? 0 : 1 ) << 9) |
(((PINC & (1 << 5)) ? 0 : 1 ) << 10) |
(((PINC & (1 << 4)) ? 0 : 1 ) << 11) |
(((PINC & (1 << 3)) ? 0 : 1 ) << 12) |
(((PINC & (1 << 2)) ? 0 : 1 ) << 13) |
(((PIND & (1 << 7)) ? 0 : 1 ) << 14)
);
switch (c) {
case 0: PORTB |= (1 << 3); break;
case 1: PORTB |= (1 << 4); break;
case 2: PORTB |= (1 << 5); break;
case 3: PORTB |= (1 << 6); break;
case 4: PORTB |= (1 << 7); break;
}
if (matrix_debouncing[c] != current_row) {
matrix_debouncing[c] = current_row;
debouncing = DEBOUNCE;
}
}
if (debouncing) {
if (--debouncing) {
_delay_ms(1);
} else {
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
matrix[i] = matrix_debouncing[i];
}
}
}
matrix_scan_quantum();
return 1;
}
inline matrix_row_t matrix_get_row(uint8_t row) {
return matrix[row];
}
void matrix_print(void) {
}

View File

@ -24,7 +24,7 @@
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
#include "action_layer.h" #include "action_layer.h"
#include "i2c.h" #include "i2c_master.h"
#include "quantum.h" #include "quantum.h"
__attribute__ ((weak)) __attribute__ ((weak))
@ -44,7 +44,7 @@ void rgblight_set(void) {
} }
i2c_init(); i2c_init();
i2c_send(0xb0, (uint8_t*)led, 3 * RGBLED_NUM); i2c_transmit(0xb0, (uint8_t*)led, 3 * RGBLED_NUM, 100);
} }
#endif #endif

View File

@ -13,8 +13,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef PANC60_H #pragma once
#define PANC60_H
#include "quantum.h" #include "quantum.h"
@ -67,5 +66,3 @@
{ K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E }, \ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E }, \
{ KC_NO, K41, K42, KC_NO, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, K4A, KC_NO, K4C, KC_NO, KC_NO } \ { KC_NO, K41, K42, KC_NO, KC_NO, KC_NO, KC_NO, K47, KC_NO, KC_NO, K4A, KC_NO, K4C, KC_NO, KC_NO } \
} }
#endif

View File

@ -14,6 +14,8 @@ Make example for this keyboard (after setting up your build environment):
Flashing Flashing
**Reset Key:** Hold down the key located at `K40`, commonly programmed as left control while plugging in the keyboard. You may also hold down the key located at `K00`, commonly programmed as the `Esc` key.
ps2avr(GB) boards use an atmega32a microcontroller and a different bootloader. It is not flashable using the regular QMK methods. ps2avr(GB) boards use an atmega32a microcontroller and a different bootloader. It is not flashable using the regular QMK methods.
To put the panc60 into reset, hold left control while plugging in. To put the panc60 into reset, hold left control while plugging in.
@ -36,9 +38,9 @@ macOS:
``` ```
3. Install the following packages: 3. Install the following packages:
``` ```
brew install python brew install python3
brew install pyusb pip3 install pyusb
brew install --HEAD`https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb brew install --HEAD https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb
4. Place your keyboard into reset. 4. Place your keyboard into reset.
5. Flash the board by typing `bootloadHID -r` followed by the path to your `.hex` file. 5. Flash the board by typing `bootloadHID -r` followed by the path to your `.hex` file.

View File

@ -31,7 +31,7 @@ F_CPU = 12000000
BOOTLOADER = bootloadHID BOOTLOADER = bootloadHID
# build options # build options
BOOTMAGIC_ENABLE = yes BOOTMAGIC_ENABLE = lite
MOUSEKEY_ENABLE = yes MOUSEKEY_ENABLE = yes
EXTRAKEY_ENABLE = yes EXTRAKEY_ENABLE = yes
CONSOLE_ENABLE = yes CONSOLE_ENABLE = yes
@ -43,8 +43,7 @@ RGBLIGHT_CUSTOM_DRIVER = yes
OPT_DEFS = -DDEBUG_LEVEL=0 OPT_DEFS = -DDEBUG_LEVEL=0
# custom matrix setup # custom matrix setup
CUSTOM_MATRIX = yes SRC = i2c_master.c
SRC = matrix.c i2c.c
# programming options # programming options
PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex PROGRAM_CMD = ./util/atmega32a_program.py $(TARGET).hex

View File

@ -8,8 +8,7 @@
* This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $ * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
*/ */
#ifndef __usbconfig_h_included__ #pragma once
#define __usbconfig_h_included__
#include "config.h" #include "config.h"
@ -392,5 +391,3 @@ section at the end of this file).
/* #define USB_INTR_PENDING EIFR */ /* #define USB_INTR_PENDING EIFR */
#define USB_INTR_PENDING_BIT INTF1 #define USB_INTR_PENDING_BIT INTF1
#define USB_INTR_VECTOR INT1_vect #define USB_INTR_VECTOR INT1_vect
#endif /* __usbconfig_h_included__ */