Numworks Epsilon  1.4.1
Graphing Calculator Operating System
keyboard.h
Go to the documentation of this file.
1 #ifndef ION_DEVICE_KEYBOARD_H
2 #define ION_DEVICE_KEYBOARD_H
3 
4 #include <ion/keyboard.h>
5 #include <ion.h>
6 #include "regs/regs.h"
7 
8 namespace Ion {
9 namespace Keyboard {
10 namespace Device {
11 
12 /* Pin | Role | Mode
13  * -----+-------------------+--------------------
14  * PC0 | Keyboard column 1 | Input, pulled up
15  * PC1 | Keyboard column 2 | Input, pulled up
16  * PC2 | Keyboard column 3 | Input, pulled up
17  * PC3 | Keyboard column 4 | Input, pulled up
18  * PC4 | Keyboard column 5 | Input, pulled up
19  * PC5 | Keyboard column 6 | Input, pulled up
20  * PE0 | Keyboard row A | Output, open drain
21  * PE1 | Keyboard row B | Output, open drain
22  * PE2 | Keyboard row C | Output, open drain
23  * PE3 | Keyboard row D | Output, open drain
24  * PE4 | Keyboard row E | Output, open drain
25  * PE5 | Keyboard row F | Output, open drain
26  * PE6 | Keyboard row G | Output, open drain
27  * PE7 | Keyboard row H | Output, open drain
28  * PE8 | Keyboard row I | Output, open drain
29  */
30 
31 void init();
32 void shutdown();
33 
34 constexpr GPIO RowGPIO = GPIOE;
35 constexpr uint8_t numberOfRows = 9;
36 constexpr uint8_t RowPins[numberOfRows] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
37 
38 constexpr GPIO ColumnGPIO = GPIOC;
39 constexpr uint8_t numberOfColumns = 6;
40 constexpr uint8_t ColumnPins[numberOfColumns] = {0, 1, 2, 3, 4, 5};
41 
42 inline uint8_t rowForKey(Key key) {
43  return (int)key/numberOfColumns;
44 }
45 inline uint8_t columnForKey(Key key) {
46  return (int)key%numberOfColumns;
47 }
48 
49 inline void activateRow(uint8_t row) {
50  /* In open-drain mode, a 0 in the register drives the pin low, and a 1 lets
51  * the pin floating (Hi-Z). So we want to set the current row to zero and all
52  * the others to 1. */
53  uint16_t rowState = ~(1<<row);
54 
55  // TODO: Assert pin numbers are sequentials and dynamically find 9 and 0
56  Device::RowGPIO.ODR()->setBitRange(9, 0, rowState);
57 
58  // TODO: 100 us seems to work, but wasn't really calculated
59  usleep(100);
60 }
61 
62 inline bool columnIsActive(uint8_t column) {
63  return !(Device::ColumnGPIO.IDR()->getBitRange(column,column));
64 }
65 
66 }
67 }
68 }
69 
70 #endif
Definition: gpio.h:6
bool columnIsActive(uint8_t column)
Definition: keyboard.h:62
unsigned short uint16_t
Definition: stdint.h:5
unsigned char uint8_t
Definition: stdint.h:4
Definition: gpio.h:47
uint8_t columnForKey(Key key)
Definition: keyboard.h:45
void activateRow(uint8_t row)
Definition: keyboard.h:49
constexpr uint8_t numberOfColumns
Definition: keyboard.h:39
constexpr GPIO GPIOE(4)
constexpr GPIO ColumnGPIO
Definition: keyboard.h:38
constexpr uint8_t RowPins[numberOfRows]
Definition: keyboard.h:36
void setBitRange(uint8_t high, uint8_t low, T value) volatile
Definition: register.h:21
constexpr uint8_t ColumnPins[numberOfColumns]
Definition: keyboard.h:40
void usleep(long us)
Definition: device.cpp:31
Definition: gpio.h:42
void Keyboard(const char *input)
Definition: keyboard.cpp:9
constexpr uint8_t numberOfRows
Definition: keyboard.h:35
Definition: backlight.h:6
uint8_t rowForKey(Key key)
Definition: keyboard.h:42
T getBitRange(uint8_t high, uint8_t low) volatile
Definition: register.h:24
constexpr GPIO RowGPIO
Definition: keyboard.h:34
constexpr GPIO GPIOC(2)