onekey: Fix for V-USB of ATtiny85 and key scan
This commit is contained in:
parent
45f6e5cb97
commit
4dc2fb5b31
7 changed files with 83 additions and 140 deletions
|
|
@ -49,7 +49,7 @@ TARGET_DIR = .
|
||||||
|
|
||||||
# project specific files
|
# project specific files
|
||||||
SRC = keymap.c \
|
SRC = keymap.c \
|
||||||
matrix.c \
|
onekey.c \
|
||||||
led.c
|
led.c
|
||||||
|
|
||||||
CONFIG_H = config.h
|
CONFIG_H = config.h
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ TARGET_DIR = .
|
||||||
|
|
||||||
# project specific files
|
# project specific files
|
||||||
SRC = keymap.c \
|
SRC = keymap.c \
|
||||||
matrix.c \
|
onekey.c \
|
||||||
led.c
|
led.c
|
||||||
|
|
||||||
CONFIG_H = config.h
|
CONFIG_H = config.h
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ TARGET_DIR = .
|
||||||
|
|
||||||
# keyboard dependent files
|
# keyboard dependent files
|
||||||
SRC = keymap.c \
|
SRC = keymap.c \
|
||||||
matrix.c \
|
onekey.c \
|
||||||
led.c
|
led.c
|
||||||
|
|
||||||
CONFIG_H = config.h
|
CONFIG_H = config.h
|
||||||
|
|
@ -18,7 +18,8 @@ CONFIG_H = config.h
|
||||||
# MCU name, you MUST set this to match the board you are using
|
# MCU name, you MUST set this to match the board you are using
|
||||||
# type "make clean" after changing this, so all files will be rebuilt
|
# type "make clean" after changing this, so all files will be rebuilt
|
||||||
#MCU = atmega168p
|
#MCU = atmega168p
|
||||||
MCU = atmega328p
|
#MCU = atmega328p
|
||||||
|
MCU = attiny85
|
||||||
|
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
|
|
@ -35,6 +36,11 @@ F_CPU = 12000000
|
||||||
#MOUSEKEY_ENABLE = yes # Mouse keys
|
#MOUSEKEY_ENABLE = yes # Mouse keys
|
||||||
#EXTRAKEY_ENABLE = yes # Audio control and System control
|
#EXTRAKEY_ENABLE = yes # Audio control and System control
|
||||||
#NKRO_ENABLE = yes # USB Nkey Rollover
|
#NKRO_ENABLE = yes # USB Nkey Rollover
|
||||||
|
NO_UART = yes # No UART debug(V-USB)
|
||||||
|
|
||||||
|
OPT_DEFS += -DNO_ACTION_TAPPING
|
||||||
|
OPT_DEFS += -DNO_ACTION_LAYER
|
||||||
|
OPT_DEFS += -DNO_ACTION_MACRO
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
Onekey
|
Onekey
|
||||||
======
|
======
|
||||||
Just one key keyboard for example. It sends 'a' key if pins PB0 and PB1 are short-circuited.
|
Just one key keyboard for example. It sends 'a' key if pins PB0 and GND are short-circuited.
|
||||||
|
|
||||||
https://github.com/tmk/tmk_keyboard/issues/56
|
https://github.com/tmk/tmk_keyboard/issues/56
|
||||||
|
|
|
||||||
|
|
@ -1,133 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright 2012 Jun Wako <wakojun@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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* scan matrix
|
|
||||||
*/
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <avr/io.h>
|
|
||||||
#include <util/delay.h>
|
|
||||||
#include "print.h"
|
|
||||||
#include "debug.h"
|
|
||||||
#include "util.h"
|
|
||||||
#include "matrix.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DEBOUNCE
|
|
||||||
# define DEBOUNCE 5
|
|
||||||
#endif
|
|
||||||
static uint8_t debouncing = DEBOUNCE;
|
|
||||||
|
|
||||||
/* matrix state(1:on, 0:off) */
|
|
||||||
static matrix_row_t matrix[MATRIX_ROWS];
|
|
||||||
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
|
|
||||||
|
|
||||||
static matrix_row_t read_cols(void);
|
|
||||||
static void init_cols(void);
|
|
||||||
static void unselect_rows(void);
|
|
||||||
static void select_row(uint8_t row);
|
|
||||||
|
|
||||||
|
|
||||||
void matrix_init(void)
|
|
||||||
{
|
|
||||||
debug_enable = true;
|
|
||||||
debug_matrix = true;
|
|
||||||
debug_mouse = true;
|
|
||||||
// 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t matrix_scan(void)
|
|
||||||
{
|
|
||||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
|
|
||||||
select_row(i);
|
|
||||||
_delay_us(30); // without this wait read unstable value.
|
|
||||||
matrix_row_t cols = read_cols();
|
|
||||||
if (matrix_debouncing[i] != cols) {
|
|
||||||
matrix_debouncing[i] = cols;
|
|
||||||
if (debouncing) {
|
|
||||||
debug("bounce!: "); debug_hex(debouncing); debug("\n");
|
|
||||||
}
|
|
||||||
debouncing = DEBOUNCE;
|
|
||||||
}
|
|
||||||
unselect_rows();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (debouncing) {
|
|
||||||
if (--debouncing) {
|
|
||||||
_delay_ms(1);
|
|
||||||
} else {
|
|
||||||
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
|
|
||||||
matrix[i] = matrix_debouncing[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline
|
|
||||||
matrix_row_t matrix_get_row(uint8_t row)
|
|
||||||
{
|
|
||||||
return matrix[row];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Column pin configuration
|
|
||||||
* col: 0
|
|
||||||
* pin: B0
|
|
||||||
*/
|
|
||||||
static void init_cols(void)
|
|
||||||
{
|
|
||||||
// Input with pull-up(DDR:0, PORT:1)
|
|
||||||
DDRB &= ~(1<<0);
|
|
||||||
PORTB |= (1<<0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static matrix_row_t read_cols(void)
|
|
||||||
{
|
|
||||||
return (PINB&(1<<0) ? 0 : (1<<0));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Row pin configuration
|
|
||||||
* row: 0
|
|
||||||
* pin: B1
|
|
||||||
*/
|
|
||||||
static void unselect_rows(void)
|
|
||||||
{
|
|
||||||
// Hi-Z(DDR:0, PORT:0) to unselect
|
|
||||||
DDRB &= ~0b00000010;
|
|
||||||
PORTB &= ~0b00000010;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void select_row(uint8_t row)
|
|
||||||
{
|
|
||||||
// Output low(DDR:1, PORT:0) to select
|
|
||||||
switch (row) {
|
|
||||||
case 0:
|
|
||||||
DDRB |= (1<<1);
|
|
||||||
PORTB &= ~(1<<1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
70
keyboard/onekey/onekey.c
Normal file
70
keyboard/onekey/onekey.c
Normal file
|
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
Copyright 2017 Jun Wako <wakojun@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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* scan matrix
|
||||||
|
*/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include "debug.h"
|
||||||
|
#include "timer.h"
|
||||||
|
#include "matrix.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef DEBOUNCE
|
||||||
|
# define DEBOUNCE 5
|
||||||
|
#endif
|
||||||
|
/* matrix state(1:on, 0:off) */
|
||||||
|
static matrix_row_t row_debounced = 0;
|
||||||
|
static matrix_row_t row_debouncing = 0;
|
||||||
|
static bool debouncing = false;
|
||||||
|
static uint16_t debouncing_time = 0;
|
||||||
|
|
||||||
|
|
||||||
|
void matrix_init(void)
|
||||||
|
{
|
||||||
|
debug_enable = true;
|
||||||
|
debug_matrix = true;
|
||||||
|
debug_mouse = true;
|
||||||
|
|
||||||
|
// PB0: Input with pull-up(DDR:0, PORT:1)
|
||||||
|
DDRB &= ~(1<<0);
|
||||||
|
PORTB |= (1<<0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t matrix_scan(void)
|
||||||
|
{
|
||||||
|
matrix_row_t r = (PINB&(1<<0) ? 0 : 1);
|
||||||
|
if (row_debouncing != r) {
|
||||||
|
row_debouncing = r;
|
||||||
|
debouncing = true;
|
||||||
|
debouncing_time = timer_read();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) {
|
||||||
|
row_debounced = row_debouncing;
|
||||||
|
debouncing = false;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline
|
||||||
|
matrix_row_t matrix_get_row(uint8_t row)
|
||||||
|
{
|
||||||
|
return row_debounced;
|
||||||
|
}
|
||||||
|
|
@ -24,11 +24,11 @@ section at the end of this file).
|
||||||
|
|
||||||
/* ---------------------------- Hardware Config ---------------------------- */
|
/* ---------------------------- Hardware Config ---------------------------- */
|
||||||
|
|
||||||
#define USB_CFG_IOPORTNAME D
|
#define USB_CFG_IOPORTNAME B
|
||||||
/* This is the port where the USB bus is connected. When you configure it to
|
/* This is the port where the USB bus is connected. When you configure it to
|
||||||
* "B", the registers PORTB, PINB and DDRB will be used.
|
* "B", the registers PORTB, PINB and DDRB will be used.
|
||||||
*/
|
*/
|
||||||
#define USB_CFG_DMINUS_BIT 3
|
#define USB_CFG_DMINUS_BIT 1
|
||||||
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
|
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
|
||||||
* This may be any bit in the port.
|
* This may be any bit in the port.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue