Acorn Electron keyboard scanner, turns an old Acorn Electron into a USB keyboard.

Dependencies:   USBDevice mbed

Committer:
IH
Date:
Wed Apr 30 21:26:27 2014 +0000
Revision:
0:9fd3dad2dc25
Child:
1:84cd616cc684
Basic HID KBD working. Bedtime!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IH 0:9fd3dad2dc25 1 #include "mbed.h"
IH 0:9fd3dad2dc25 2 #include "USBKeyboard.h"
IH 0:9fd3dad2dc25 3 #include "hid_keys.h"
IH 0:9fd3dad2dc25 4
IH 0:9fd3dad2dc25 5 #define MAX_ROWS 5
IH 0:9fd3dad2dc25 6 #define MAX_COLS 14
IH 0:9fd3dad2dc25 7 #define REPORT_LEN 9
IH 0:9fd3dad2dc25 8 #define REPORT_ID_KEYBOARD 1
IH 0:9fd3dad2dc25 9
IH 0:9fd3dad2dc25 10 const uint8_t hid_keys[MAX_ROWS * MAX_COLS] =
IH 0:9fd3dad2dc25 11 {
IH 0:9fd3dad2dc25 12 KEY_PERIOD, KEY_L, KEY_O, KEY_9, KEY_BACKSPACE,
IH 0:9fd3dad2dc25 13 KEY_SLASH, KEY_SEMICOLON, KEY_P, KEY_0, KEY_NONE,
IH 0:9fd3dad2dc25 14 KEY_NONE, KEY_EQUALS, KEY_UP_ARROW, KEY_MINUS, KEY_NONE,
IH 0:9fd3dad2dc25 15 KEY_DELETE, KEY_ENTER, KEY_DOWN_ARROW, KEY_LEFT_ARROW, KEY_NONE,
IH 0:9fd3dad2dc25 16 KEY_SPACE, KEY_NONE, KEY_OPEN_SQUARE, KEY_RIGHT_ARROW, KEY_NONE,
IH 0:9fd3dad2dc25 17 KEY_COMMA, KEY_K, KEY_I, KEY_8, KEY_NONE,
IH 0:9fd3dad2dc25 18 KEY_M, KEY_J, KEY_U, KEY_7, KEY_NONE,
IH 0:9fd3dad2dc25 19 KEY_N, KEY_H, KEY_Y, KEY_6, KEY_NONE,
IH 0:9fd3dad2dc25 20 KEY_B, KEY_G, KEY_T, KEY_5, KEY_NONE,
IH 0:9fd3dad2dc25 21 KEY_V, KEY_F, KEY_R, KEY_4, KEY_NONE,
IH 0:9fd3dad2dc25 22 KEY_C, KEY_D, KEY_E, KEY_3, KEY_NONE,
IH 0:9fd3dad2dc25 23 KEY_X, KEY_S, KEY_W, KEY_2, KEY_NONE,
IH 0:9fd3dad2dc25 24 KEY_Z, KEY_A, KEY_Q, KEY_1, KEY_NONE,
IH 0:9fd3dad2dc25 25 KEY_LEFT_SHIFT, KEY_LEFT_CTRL, KEY_TAB, KEY_ESC, KEY_NONE,
IH 0:9fd3dad2dc25 26 };
IH 0:9fd3dad2dc25 27
IH 0:9fd3dad2dc25 28
IH 0:9fd3dad2dc25 29 BusOut leds(LED1, LED2, LED3);
IH 0:9fd3dad2dc25 30
IH 0:9fd3dad2dc25 31 BusOut scanCols(
IH 0:9fd3dad2dc25 32 PTC10,PTC8,
IH 0:9fd3dad2dc25 33 PTC6, PTA5,
IH 0:9fd3dad2dc25 34 PTC5, PTA4,
IH 0:9fd3dad2dc25 35 PTC4, PTA12,
IH 0:9fd3dad2dc25 36 PTC3, PTD4,
IH 0:9fd3dad2dc25 37 PTC0, PTA2,
IH 0:9fd3dad2dc25 38 PTC7, PTA1
IH 0:9fd3dad2dc25 39 );
IH 0:9fd3dad2dc25 40
IH 0:9fd3dad2dc25 41 BusIn inRows(
IH 0:9fd3dad2dc25 42 PTB10,
IH 0:9fd3dad2dc25 43 PTB11,
IH 0:9fd3dad2dc25 44 PTE2,
IH 0:9fd3dad2dc25 45 PTE3,
IH 0:9fd3dad2dc25 46 PTE5 );
IH 0:9fd3dad2dc25 47
IH 0:9fd3dad2dc25 48 DigitalOut extLed(PTE4);
IH 0:9fd3dad2dc25 49
IH 0:9fd3dad2dc25 50 USBKeyboard kbd;
IH 0:9fd3dad2dc25 51
IH 0:9fd3dad2dc25 52 static int scanColumn(int col)
IH 0:9fd3dad2dc25 53 {
IH 0:9fd3dad2dc25 54 int rowBits;
IH 0:9fd3dad2dc25 55 // Drive output low to scan
IH 0:9fd3dad2dc25 56 scanCols.write(0x3FFF ^ (1 << col));
IH 0:9fd3dad2dc25 57 leds.write(col >> 1);
IH 0:9fd3dad2dc25 58 wait(0.01);
IH 0:9fd3dad2dc25 59 rowBits = inRows.read();
IH 0:9fd3dad2dc25 60 scanCols.write(0x3FFF);
IH 0:9fd3dad2dc25 61 // Inputs also active-low
IH 0:9fd3dad2dc25 62 return rowBits ^ 0x1F;
IH 0:9fd3dad2dc25 63 }
IH 0:9fd3dad2dc25 64
IH 0:9fd3dad2dc25 65 int main()
IH 0:9fd3dad2dc25 66 {
IH 0:9fd3dad2dc25 67 // Setup
IH 0:9fd3dad2dc25 68 inRows.mode(PullUp);
IH 0:9fd3dad2dc25 69 extLed = 1;
IH 0:9fd3dad2dc25 70
IH 0:9fd3dad2dc25 71 // Run loop
IH 0:9fd3dad2dc25 72 while(1)
IH 0:9fd3dad2dc25 73 {
IH 0:9fd3dad2dc25 74 int col, ocount;
IH 0:9fd3dad2dc25 75 HID_REPORT report;
IH 0:9fd3dad2dc25 76
IH 0:9fd3dad2dc25 77 report.data[0] = REPORT_ID_KEYBOARD;
IH 0:9fd3dad2dc25 78 report.data[1] = 0; // modifiers
IH 0:9fd3dad2dc25 79 report.data[2] = 0;
IH 0:9fd3dad2dc25 80 ocount = 3;
IH 0:9fd3dad2dc25 81
IH 0:9fd3dad2dc25 82 for (col=0; col < MAX_COLS; col++)
IH 0:9fd3dad2dc25 83 {
IH 0:9fd3dad2dc25 84 int row;
IH 0:9fd3dad2dc25 85 int rowBits = scanColumn(col);
IH 0:9fd3dad2dc25 86 if ( !rowBits )
IH 0:9fd3dad2dc25 87 continue;
IH 0:9fd3dad2dc25 88
IH 0:9fd3dad2dc25 89 for (row=0; row < MAX_ROWS; row++)
IH 0:9fd3dad2dc25 90 {
IH 0:9fd3dad2dc25 91 if ( rowBits & (1 << row) )
IH 0:9fd3dad2dc25 92 {
IH 0:9fd3dad2dc25 93 uint8_t key = hid_keys[col * MAX_ROWS + row];
IH 0:9fd3dad2dc25 94 if ( IS_MODIFIER(key) )
IH 0:9fd3dad2dc25 95 report.data[1] |= MODIFIER_BIT(key);
IH 0:9fd3dad2dc25 96 else if ( key != KEY_NONE )
IH 0:9fd3dad2dc25 97 {
IH 0:9fd3dad2dc25 98 if ( ocount < REPORT_LEN )
IH 0:9fd3dad2dc25 99 report.data[ocount++] = key;
IH 0:9fd3dad2dc25 100 }
IH 0:9fd3dad2dc25 101 //kbd.printf("c%dr%d ", col, row);
IH 0:9fd3dad2dc25 102 }
IH 0:9fd3dad2dc25 103 }
IH 0:9fd3dad2dc25 104 }
IH 0:9fd3dad2dc25 105
IH 0:9fd3dad2dc25 106 while( ocount < REPORT_LEN )
IH 0:9fd3dad2dc25 107 report.data[ocount++] = KEY_NONE;
IH 0:9fd3dad2dc25 108
IH 0:9fd3dad2dc25 109 report.length = REPORT_LEN;
IH 0:9fd3dad2dc25 110 kbd.send(&report);
IH 0:9fd3dad2dc25 111 }
IH 0:9fd3dad2dc25 112 }