From c9094c7d7b49e21bc53d273288463723beec6601 Mon Sep 17 00:00:00 2001 From: Marc Poulhiès Date: Thu, 7 Jul 2022 22:36:29 +0200 Subject: Initial Ada firmware Missing doc, comment. --- firmware/ada/src/pouetpouet.adb | 124 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 firmware/ada/src/pouetpouet.adb (limited to 'firmware/ada/src/pouetpouet.adb') 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; -- cgit v1.2.3