Author Topic: TMK driver help. *solved*  (Read 2367 times)

0 Members and 1 Guest are viewing this topic.

Offline Criterus

  • Thread Starter
  • Posts: 38
TMK driver help. *solved*
« on: Mon, 11 July 2016, 19:43:15 »
Thanks to Hasu pointing out some really obvious errors I got my TMK drivers to compile error free, but I've run into a couple issues I need some direction on.

When I initially plug in the keyboard it starts spitting out random characters. Once I press a key it stops, and after that I can press keys and most of them work fine including the ones that that were showing up before anything was pressed. I've looked everything over pretty thoroughly and I don't see any obvious shorts on the wiring. I've triple checked the pin out against my matrix.c file. All my diodes are facing the right direction.

Once I get it to stop randomly posting characters I have a hand full of keys that don't work in each row. :

t  -
a g k +
v Enter
Space

Looking at my wiring a couple of these sets are in the same column:

T G V - all in the same column
- + [Enter] - all in the same column

I'm not sure if this is an issue with my code or an issue with the switches/wiring. I'd just like some input before I start d-soldering and replacing things.

Link to the whole folder: https://www.dropbox.com/s/f84nu3t28cd6z6y/50_Keyboard.zip?dl=0

Matrix.c :

Code: [Select]
/*
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);


inline
uint8_t matrix_rows(void)
{
    return MATRIX_ROWS;
}

inline
uint8_t matrix_cols(void)
{
    return MATRIX_COLS;
}

void matrix_init(void)
{
    // 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;
}

bool matrix_is_modified(void)
{
    if (debouncing) return false;
    return true;
}

inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
    return (matrix[row] & ((matrix_row_t)1<<col));
}

inline
matrix_row_t matrix_get_row(uint8_t row)
{
    return matrix[row];
}

void matrix_print(void)
{
    print("\nr/c 0123456789ABCDEF\n");
    for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
        phex(row); print(": ");
        pbin_reverse16(matrix_get_row(row));
        print("\n");
    }
}

uint8_t matrix_key_count(void)
{
    uint8_t count = 0;
    for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
        count += bitpop16(matrix[i]);
    }
    return count;
}

/* Column pin configuration
 * col: 0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15 
 * pin: B0  B1  B2  B3  B7  D1  D2  D3  C6  C7  D6  D7  B4  B5  B6  F7  (Rev.A)
 * pin: //  //  //  //  //  //  //  //  //  //  // //   //  //  //  //                                 
 */
static void  init_cols(void)
{
    // Input with pull-up(DDR:0, PORT:1)
    DDRF  &= ~(1<<7);
    PORTF |=  (1<<7);
   
//DDRE  &= ~(1<<6);
    //PORTE |=  (1<<6);
   
DDRD  &= ~(1<<7 |1<<6|1<<3 |1<<2 | 1<<1);
    PORTD |=  (1<<7 |1<<6|1<<3 |1<<2 | 1<<1);
   
DDRC  &= ~(1<<7 | 1<<6);
    PORTC |=  (1<<7 | 1<<6);
   
DDRB  &= ~(1<<7 | 1<<6 | 1<<5 | 1<< 4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
    PORTB |=  (1<<7 | 1<<6 | 1<<5 | 1<< 4 | 1<<3 | 1<<2 | 1<<1 | 1<<0);
}

static matrix_row_t read_cols(void)
{
    return (PINB&(1<<0) ? 0 : (1<<0)) |
           (PINB&(1<<1) ? 0 : (1<<1)) |
   (PINB&(1<<2) ? 0 : (1<<2)) |
   (PINB&(1<<3) ? 0 : (1<<3)) |
   (PINB&(1<<7) ? 0 : (1<<4)) |
   (PIND&(1<<0) ? 0 : (1<<5)) |
   (PIND&(1<<1) ? 0 : (1<<6)) |
   (PIND&(1<<2) ? 0 : (1<<7)) |
   (PIND&(1<<3) ? 0 : (1<<8)) |
   (PINC&(1<<6) ? 0 : (1<<9)) |
   (PINC&(1<<7) ? 0 : (1<<10)) |
   (PIND&(1<<7) ? 0 : (1<<11)) |
   (PINB&(1<<4) ? 0 : (1<<12)) |
   (PINB&(1<<5) ? 0 : (1<<13)) |
   (PINB&(1<<6) ? 0 : (1<<14)) |
   (PINF&(1<<7) ? 0 : (1<<15));
}

/* Row pin configuration
 * row: 0   1   2   3 
 * pin: F6  F5  F4  F1 
 */
static void unselect_rows(void)
{
    // Hi-Z(DDR:0, PORT:0) to unselect
    DDRF  &= ~0b01110010;
    PORTF &= ~0b01110010;
}

static void select_row(uint8_t row)
{
    // Output low(DDR:1, PORT:0) to select
    switch (row) {
        case 0:
            DDRF  |= (1<<6);
            PORTF &= ~(1<<6);
            break;
        case 1:
            DDRF  |= (1<<5);
            PORTF &= ~(1<<5);
            break;
        case 2:
            DDRF  |= (1<<4);
            PORTF &= ~(1<<4);
            break;
        case 3:
            DDRF  |= (1<<1);
            PORTF &= ~(1<<1);
            break;       
    }
}

Keymap_common.h

Code: [Select]
/*
Copyright 2012,2013 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/>.
*/
#ifndef KEYMAP_COMMON_H
#define KEYMAP_COMMON_H

#include <stdint.h>
#include <stdbool.h>
#include <avr/pgmspace.h>
#include "keycode.h"
#include "action.h"
#include "action_macro.h"
#include "report.h"
#include "host.h"
#include "print.h"
#include "debug.h"
#include "keymap.h"


extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
extern const uint16_t fn_actions[];


/* GH60 keymap definition macro
 * K2C, K31 and  K3C are extra keys for ISO
 */
#define KEYMAP( \
    K00, K01, K02, K03, K04, K05, K06, K07,  K08, K09, K0A,  K0B, K0C,  K0D, K0E, K0F, \
    K10, K11, K12, K13, K14, K15, K16, K17,  K18, K19,           K1B, K1C,  K1D, K1E, K1F, \
    K20,          K22, K23, K24, K25, K26, K27, K28, K29, K2A,  K2B, K2C,  K2D, K2E, K2F, \
    K30, K31,                                      K36,            K39, K3A,  K3B,           K3D, K3E       \
) {\
{ KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K0C, KC_##K0D, KC_##K0E, KC_##K0F, }, \
{ KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_NO,        KC_##K1B, KC_##K1C, KC_##K1D, KC_##K1E, KC_##K1F, }, \
{ KC_##K20, KC_NO,      KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K2C, KC_##K2D, KC_##K2E, KC_##K2F, }, \
{ KC_##K30, KC_##K31, KC_NO,      KC_NO,      KC_NO,      KC_NO,      KC_##K36, KC_NO,      KC_NO,       KC_##K39, KC_##K3A, KC_##K3B, KC_NO,        KC_##K3D, KC_##K3E, KC_NO     }  \
}


#endif

Keymap_poker.c :

Code: [Select]
#include "keymap_common.h"

const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

KEYMAP( ESC,  Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P,    BSPC, 7, 8, 9, MINS, \
         TAB,  A,   S,   D,   F,   G,   H,   J,   K,   L,          ENT, 4, 5, 6, PPLS, \
         LSFT, Z,   X,   C,   V,   B,   N,   M, QUOT, LBRC, DOT, 1, 2, 3, ENT,  \
         LCTL, LALT,              SPC,           FN0, RBRC, COMM, 0, DOT),
};

const uint16_t PROGMEM fn_actions[] = {};

LED.c (I just changed this to the F0 pin which isn't soldered to anything.

Code: [Select]
/*
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/>.
*/

#include <avr/io.h>
#include "stdint.h"
#include "led.h"


void led_set(uint8_t usb_led)
{
    if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
        // output low
        DDRF |= (1<<0);
        PORTF &= ~(1<<0);
    } else {
        // Hi-Z
        DDRF &= ~(1<<0);
        PORTF &= ~(1<<0);
    }
}












« Last Edit: Wed, 13 July 2016, 11:36:58 by Criterus »

Offline flashjac

  • Posts: 7
Re: TMK driver help. (Getting close)
« Reply #1 on: Tue, 12 July 2016, 06:00:37 »
I just had a look through your zip file, and the first thing that stood out to me was MATRIX_COLS seems to be off by one. The definition in config.h defines it as 15, but in your other code you use 16 columns. Not sure if that will fix all your problems, but it might help.

Offline Criterus

  • Thread Starter
  • Posts: 38
Re: TMK driver help. (Getting close)
« Reply #2 on: Tue, 12 July 2016, 12:36:04 »
That did help. it got the outer most column to work for me. That has me down to 4 keys that were not working. 1 had a hairline crack that I couldn't see so it just wasn't making good contact. 3 are all in the same column so I'm going to re-solder that pin



Thanks flashjac
« Last Edit: Tue, 12 July 2016, 13:18:08 by Criterus »

Offline QuincyJones

  • Posts: 270
  • Location: The Greatest Of Them All, England
Re: TMK driver help. (Getting close)
« Reply #3 on: Tue, 12 July 2016, 23:43:06 »
could we keep these problems to one thread please! it will make the forum easier to read instead of the same person starting a new thread each time they encounter a problem!
SENT FROM MY TRKA-100-ULTRA-PRO-1R WITH FLASHY MULTI-COLOURED LEDS FOR MEGA ULTRA COOLNESS
(please like me)

       

Offline user 18

  • * Senior Moderator
  • Posts: 2231
  • Location: Deutschland
Re: TMK driver help. (Getting close)
« Reply #4 on: Tue, 12 July 2016, 23:53:17 »
could we keep these problems to one thread please! it will make the forum easier to read instead of the same person starting a new thread each time they encounter a problem!

There's absolutely nothing wrong with starting a new thread for a new problem.
Please PM me if you are waiting on classifieds approval or have a question about the classifieds rules. | geekhack Terms of Service

Max Nighthawk x8 (MX Brown) | CM QFR (MX Blue) | CM QFR (MX Clear) | RK-9000 (MX Red) | Model M 1391401 | Model M SSK 1370475 | CM Novatouch | G80-8113 (MX Clear) | 60% (85g MX Blue) | Whitefox Aria (MX Clear) | CL-LX (MX Clear) | Mira SE (MX Clear)
Avatar by ashdenej

Offline vextanys

  • Posts: 40
Re: TMK driver help. (Getting close)
« Reply #5 on: Wed, 13 July 2016, 03:32:39 »
Your reading D0 without initializing it as input. That should solve the T column keys, cant see anything obvious in the Enter column keys

Offline Criterus

  • Thread Starter
  • Posts: 38
Re: TMK driver help. *solved*
« Reply #6 on: Wed, 13 July 2016, 11:41:31 »
I found that D0 pin I just hadn't made it back to update the post. I currently have all my keys working. I'm on to getting my housing built. With any luck I'll have some pictures of the final product minus a matching usb to show off in the next couple days.