1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
with STM32.Device; use STM32.Device;
with STM32.GPIO; use STM32.GPIO;
-- Not yet used.
-- with STM32.Timers; use STM32.Timers;
-- with USB.HAL.Device;
-- with USB.Device.Serial;
with USB; use USB;
with USB.Device.HID.Keyboard;
with USB.Device; use USB.Device;
with Click;
with Logging; use Logging;
procedure Pouetpouet is
Fatal_Error : exception;
type ColR is range 1 .. 12;
type RowR is range 1 .. 5;
type Rt is array (RowR) of GPIO_Point;
type Ct is array (ColR) of GPIO_Point;
Rows : constant Rt
:= [PB0, PB1, PB2, PB10, PB11];
Cols : constant Ct
:= [PA0, PA1, PB13, PB12, PB14, PB15, PA15, PB3, PB4, PB5, PB8, PB9];
package TestClick is new Click (5 ,ColR, RowR, GPIO_Point,
Ct, Rt, Cols, Rows);
use TestClick;
BepoLayout : constant Layout :=
[
[Kb1, Kb2, Kb3, Kb4, Kb5, Grave, Kb6, Kb7, Kb8, Kb9, Kb0, Minus],
[Q, W, E, R, T, Tab, Y, U, I, O, P, LBracket],
[A, S, D, F, G, BSpace, H, J, K, L, SColon, Quote],
[Z, X, C, V, B, Enter, N, M, Comma, Dot, Slash, Bslash ],
[LCtrl, X, LGui, LShift, LAlt, Space, RAlt, RBracket, Equal, Delete, RShift, RCtrl]
];
Max_Packet_Size : constant := 64;
USB_Stack : USB.Device.USB_Device_Stack (Max_Classes => 1);
HID_Class : aliased USB.Device.HID.Keyboard.Instance;
use type USB.Device.Init_Result;
USB_Status : USB.Device.Init_Result;
begin
Init;
if not USB_Stack.Register_Class (HID_Class'Unchecked_Access) then
raise Fatal_Error with "Failed to register USB Serial device class";
end if;
USB_Status := USB_Stack.Initialize
(Controller => STM32.Device.UDC'Access,
Manufacturer => USB.To_USB_String ("Kataplop"),
Product => USB.To_USB_String ("Some buggy Keyboard"),
Serial_Number => USB.To_USB_String ("DEADBEEF"),
Max_Packet_Size => Max_Packet_Size);
if USB_Status /= USB.Device.Ok then
raise Fatal_Error with "USB stack initialization failed: " & USB_Status'Image;
end if;
USB_Stack.Start;
-- Enable_Clock (Timer_1);
-- Reset (Timer_1);
-- Configure (Timer_1, Prescaler => 13999, Period => 5999);
-- Enable_Interrupt (Timer_1, Timer_Update_Interrupt);
-- Enable (Timer_1);
Log ("STARTING");
for Row of Keys.Rows loop
Enable_Clock (Row);
Configure_IO
(Row,
(Mode => Mode_Out,
Resistors => Floating,
Speed => Speed_Medium,
Output_Type => Push_Pull));
end loop;
for Col of Keys.Cols loop
Enable_Clock (Col);
Configure_IO
(Col,
(Mode => Mode_In,
Resistors => Pull_Up));
end loop;
loop
USB_Stack.Poll;
declare
Evts : constant Events := Get_Events (Get_Matrix);
begin
for Evt of Evts loop
Log ("(" & Evt.Evt'Image & ", " & Evt.Col'Image & ", "
& Evt.Row'Image & ") = "
& KeyCode'Enum_Rep (BepoLayout (Evt.Row, Evt.Col))'Image);
if HID_Class.Ready then
if Evt.Evt = Press then
HID_Class.Push_Key_Code
(KeyCode'Enum_Rep (BepoLayout (Evt.Row, Evt.Col)));
end if;
HID_Class.Send_Report (UDC);
end if;
end loop;
end;
-- Delay_Cycles (72);
end loop;
end Pouetpouet;
|