summaryrefslogtreecommitdiff
path: root/firmware/ada/src/pouetpouet.adb
diff options
context:
space:
mode:
authorMarc Poulhiès <dkm@kataplop.net>2022-07-07 22:36:29 +0200
committerMarc Poulhiès <dkm@kataplop.net>2022-07-22 21:06:23 +0200
commitc9094c7d7b49e21bc53d273288463723beec6601 (patch)
tree35882eb4560ba16575a5b7f0ad275bedaf4e9558 /firmware/ada/src/pouetpouet.adb
parent3c71e3a2a3af39d579c2649fddf0c8ba835bfa01 (diff)
Initial Ada firmware
Missing doc, comment.
Diffstat (limited to 'firmware/ada/src/pouetpouet.adb')
-rw-r--r--firmware/ada/src/pouetpouet.adb124
1 files changed, 124 insertions, 0 deletions
diff --git a/firmware/ada/src/pouetpouet.adb b/firmware/ada/src/pouetpouet.adb
new file mode 100644
index 0000000..a201bc6
--- /dev/null
+++ b/firmware/ada/src/pouetpouet.adb
@@ -0,0 +1,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;