Changeset 88a38a8 in avrstuff


Ignore:
Timestamp:
Feb 7, 2023, 11:43:54 PM (15 months ago)
Author:
PulkoMandy <pulkomandy@…>
Branches:
main
Children:
53cf5f5
Parents:
8d96947
Message:

pcw2hid: first working version

Remaining problem: ESC seems to be pressed with alt and shift, I don't
see why. Probqbly should have a key acting as numlock, otherwise there's
no way to have cursor keys...

This message is typed with a PCW keyboard :D

Location:
kbd/pcw2hid/code
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • kbd/pcw2hid/code/Keyboard.c

    r8d96947 r88a38a8  
    113113void EVENT_USB_Device_Connect(void)
    114114{
    115         LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
     115        //LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
    116116}
    117117
     
    119119void EVENT_USB_Device_Disconnect(void)
    120120{
    121         LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
     121        //LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
    122122}
    123123
     
    131131        USB_Device_EnableSOFEvents();
    132132
    133         LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
     133        //LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
    134134}
    135135
     
    143143void EVENT_USB_Device_StartOfFrame(void)
    144144{
    145         HID_Device_MillisecondElapsed(&Keyboard_HID_Interface);
     145        //HID_Device_MillisecondElapsed(&Keyboard_HID_Interface);
    146146}
    147147
     
    164164        USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData;
    165165
    166         uint8_t* matrix = scanall();
    167 
     166        extern uint8_t matrix[16];
     167
     168        scanall();
    168169        uint8_t UsedKeyCodes = 0;
    169170
     
    182183        MAP(0, 5, HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW);
    183184        MAP(0, 4, HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP);
    184         MAP(0, 3, HID_KEYBOARD_SC_PASTE);
     185        MAP(0, 3, HID_KEYBOARD_SC_INSERT); // PASTE
    185186        MAP(0, 2, HID_KEYBOARD_SC_F1);
    186187        MAP(0, 1, HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT);
     
    191192        MAP(1, 5, HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW);
    192193        MAP(1, 4, HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW);
    193         MAP(1, 3, HID_KEYBOARD_SC_COPY);
    194         MAP(1, 2, HID_KEYBOARD_SC_CUT);
     194        MAP(1, 3, HID_KEYBOARD_SC_PAGE_DOWN); // COPY
     195        MAP(1, 2, HID_KEYBOARD_SC_PAGE_UP); // CUT
    195196        MAP(1, 1, HID_KEYBOARD_SC_F2);
    196197        MAP(1, 0, HID_KEYBOARD_SC_F4);
    197198
    198199        MAP(2, 7, HID_KEYBOARD_SC_KEYPAD_PLUS);
    199         MAP(2, 6, HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE);
    200         MODIFIER(2, 5, HID_KEYBOARD_MODIFIER_LEFTSHIFT | HID_KEYBOARD_MODIFIER_RIGHTSHIFT);
     200        MAP(2, 6, HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE);
     201        MAP(2, 5, HID_KEYBOARD_SC_LEFT_SHIFT);
     202        MODIFIER(2, 5, HID_KEYBOARD_MODIFIER_LEFTSHIFT);
    201203        MAP(2, 4, HID_KEYBOARD_SC_KEYPAD_7_AND_HOME);
    202         MAP(2, 3, HID_KEYBOARD_SC_BACKSLASH_AND_PIPE);
     204        MAP(2, 3, HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE);
    203205        MAP(2, 2, HID_KEYBOARD_SC_ENTER);
    204206        MAP(2, 1, HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE);
     
    238240        MAP(6, 3, HID_KEYBOARD_SC_T);
    239241        MAP(6, 2, HID_KEYBOARD_SC_R);
    240         MAP(6, 1, HID_KEYBOARD_SC_S);
     242        MAP(6, 1, HID_KEYBOARD_SC_5_AND_PERCENTAGE);
    241243        MAP(6, 0, HID_KEYBOARD_SC_6_AND_CARET);
    242244
     
    255257        MAP(8, 4, HID_KEYBOARD_SC_TAB);
    256258        MAP(8, 3, HID_KEYBOARD_SC_Q);
    257         MAP(8, 2, HID_KEYBOARD_SC_STOP);
     259        MAP(8, 2, HID_KEYBOARD_SC_ESCAPE); // STOP
    258260        MAP(8, 1, HID_KEYBOARD_SC_2_AND_AT);
    259261        MAP(8, 0, HID_KEYBOARD_SC_1_AND_EXCLAMATION);
    260262
    261263        MAP(9, 7, HID_KEYBOARD_SC_BACKSPACE);
    262         //MAP(9, 6, HID_KEYBOARD_SC_CAPS_LOCK);
     264        //MAP(9, 6, Nothing here);
    263265        MAP(9, 5, HID_KEYBOARD_SC_F6);
    264266        MAP(9, 4, HID_KEYBOARD_SC_F8);
     
    268270        MAP(9, 0, HID_KEYBOARD_SC_UP_ARROW);
    269271
    270         MODIFIER(10, 7, HID_KEYBOARD_MODIFIER_LEFTALT | HID_KEYBOARD_MODIFIER_RIGHTALT);
     272        MODIFIER(10, 7, HID_KEYBOARD_MODIFIER_LEFTALT);
     273        MAP(10, 7, HID_KEYBOARD_SC_LEFT_ALT);
    271274        MAP(10, 6, HID_KEYBOARD_SC_KEYPAD_DOT_AND_DELETE);
    272275        MAP(10, 5, HID_KEYBOARD_SC_KEYPAD_ENTER);
    273276        MAP(10, 4, HID_KEYBOARD_SC_F7);
    274277        MAP(10, 3, HID_KEYBOARD_SC_KEYPAD_MINUS);
    275         MAP(10, 2, HID_KEYBOARD_SC_CANCEL);
     278        MAP(10, 2, HID_KEYBOARD_SC_END); // CANCEL
    276279        MAP(10, 1, HID_KEYBOARD_SC_HOME);
    277280        MAP(10, 0, HID_KEYBOARD_SC_F5);
  • kbd/pcw2hid/code/makefile

    r8d96947 r88a38a8  
    1212# Run "make help" for target help.
    1313
    14 MCU          = at90usb162
     14#MCU          = at90usb162
     15MCU          = at90usb1287
    1516ARCH         = AVR8
    1617BOARD        =
    1718F_CPU        = 8000000
    1819F_USB        = $(F_CPU)
    19 OPTIMIZATION = s
     20OPTIMIZATION = 3
    2021TARGET       = Keyboard
    2122SRC          = $(TARGET).c Descriptors.c protocol.cpp $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)
     
    4344include $(DMBS_PATH)/atprogram.mk
    4445
    45 PROG=usbasp
     46#PROG=usbasp
     47PROG=avr109 -P /dev/ports/usb0
    4648flash: $(TARGET).hex
    4749        avrdude -u -c $(PROG) -p $(MCU) -Uflash:w:$^
  • kbd/pcw2hid/code/protocol.cpp

    r8d96947 r88a38a8  
    11#include <avr/io.h>
     2#include <avr/interrupt.h>
    23
    34#include <stdbool.h>
     
    1112#define PCW_DAT_A  (1 << 1)
    1213
    13 static uint8_t data;
    14 static uint8_t address;
     14uint8_t matrix[16];
    1515
    16 static uint8_t oldv;
    17 static uint8_t newv;
     16static uint16_t scanbyte()
     17{
     18        uint8_t pulses = 0;
     19        uint8_t oldv, newv;
     20        uint16_t rxbuffer = 0;
    1821
    19 static uint8_t pulses;
    20 
    21 static uint8_t kmatrix[16];
    22 
    23 uint8_t scanbyte()
    24 {
    25         pulses = 0;
    26         address = 0;
    27 
     22        // This is a bit timing critical so don't be interrupted while we do it
     23        cli();
    2824        oldv = PCW_PIN;
    2925
    30         for (int i = 0; i < 2048; i++) {
     26        for (;;) {
    3127                newv = PCW_PIN;
    3228
     
    3733                                // We are not in sync, start over
    3834                                pulses = 0;
    39                                 address = 0;
     35                                rxbuffer = 0;
    4036                        }
    4137                        if (((newv & PCW_DAT_A) == 0) && ((oldv & PCW_DAT_A) != 0)) {
    42                                 pulses++;
    43                         }
    44                 } else if (pulses < 6) {
    45                         // Receiving address (4 bits)
    46                         if (((newv & PCW_CLK_A) == 0) && ((oldv & PCW_CLK_A) != 0)) {
    47                                 address = (address << 1) | ((newv & PCW_DAT_A) ? 1 : 0);
    4838                                pulses++;
    4939                        }
     
    5141                        // Receiving data (8 bits)
    5242                        if (((newv & PCW_CLK_A) == 0) && ((oldv & PCW_CLK_A) != 0)) {
    53                                 data = (data << 1) | ((newv & PCW_DAT_A) ? 1 : 0);
     43                                rxbuffer = (rxbuffer << 1);
     44                                if (newv & PCW_DAT_A)
     45                                        rxbuffer |= 1;
    5446                                pulses++;
    55                         }
    5647
    57                         // If we reached the last bit, we can stop
    58                         if (pulses >= 10) {
    59                                 kmatrix[address] = data;
    60                                 return address;
     48                                // If we reached the last bit, we can stop
     49                                if (pulses == 14) {
     50                                        // We can be interrupted again.
     51                                        sei();
     52                                        return rxbuffer;
     53                                }
    6154                        }
    6255                }
     
    6457                oldv = newv;
    6558        }
    66 
    67         // TODO set up some error LED or something?
    68         return 255;
    6959}
    7060
    71 extern "C" uint8_t* scanall()
     61extern "C" void scanall()
    7262{
    73         uint8_t address;
    74 
    75         do {
    76                 address = scanbyte();
    77         // } while ((address < 15) && ((kmatrix[15] & 0x80) != 0));
    78         } while ((address != 10) && ((kmatrix[15] & 0x80) != 0));
    79         // nothing interesting past row 10, so stop scanning there.
    80 
    81         return kmatrix;
     63        uint16_t rxbuffer;
     64       
     65        for (int i = 0; i < 17; i++) {
     66                rxbuffer = scanbyte();
     67                matrix[rxbuffer >> 8] = rxbuffer & 0xFF;
     68        }
    8269}
    8370
    8471extern "C" void PCW_Init() {
    8572        // GrIP input
    86         PCW_PORT = 0xFF; // Enable pull-ups
    87         PCW_DDR = 0;  // Port as input
     73        PCW_PORT |= 0x3; // Enable pull-ups
     74        PCW_DDR &= 0xFC;  // Port as input
    8875}
    8976
Note: See TracChangeset for help on using the changeset viewer.