diff options
Diffstat (limited to 'firmware/ada/src')
-rw-r--r-- | firmware/ada/src/logging.adb | 61 | ||||
-rw-r--r-- | firmware/ada/src/logging.ads | 16 | ||||
-rw-r--r-- | firmware/ada/src/pouetpouet.adb | 124 |
3 files changed, 201 insertions, 0 deletions
diff --git a/firmware/ada/src/logging.adb b/firmware/ada/src/logging.adb new file mode 100644 index 0000000..f6a159f --- /dev/null +++ b/firmware/ada/src/logging.adb @@ -0,0 +1,61 @@ +with HAL; use HAL; +with STM32.Device; use STM32.Device; +with STM32.GPIO; use STM32.GPIO; +with STM32.USARTs; use STM32.USARTs; + +package body Logging is + + TX_Pin : constant GPIO_Point := PB6; + RX_Pin : constant GPIO_Point := PB7; + + procedure Init is + begin + Enable_Clock (USART_1); + Enable_Clock (RX_Pin & TX_Pin); + + Configure_IO + (RX_Pin & TX_Pin, + (Mode => Mode_AF, + AF => GPIO_B_AF_USART1_0, + Resistors => Pull_Up, + AF_Speed => Speed_50MHz, + AF_Output_Type => Push_Pull)); + + Disable (USART_1); + + Set_Oversampling_Mode (USART_1, Oversampling_By_16); + Set_Baud_Rate (USART_1, 115200); + Set_Mode (USART_1, Tx_Rx_Mode); + Set_Stop_Bits (USART_1, Stopbits_1); + Set_Word_Length (USART_1, Word_Length_8); + Set_Parity (USART_1, No_Parity); + Set_Flow_Control (USART_1, No_Flow_Control); + + Enable (USART_1); + + end Init; + + procedure Await_Send_Ready (This : USART) is + begin + loop + exit when Tx_Ready (This); + end loop; + end Await_Send_Ready; + + procedure Put_Blocking (This : in out USART; Data : UInt16) is + begin + Await_Send_Ready (This); + Transmit (This, UInt9 (Data)); + end Put_Blocking; + + procedure Log (S : String; L : Integer := 1; Deindent : Integer := 0) is + begin + + for C of S loop + Put_Blocking (USART_1, Character'Pos (C)); + end loop; + + Put_Blocking (USART_1, UInt16 (13)); -- CR + Put_Blocking (USART_1, UInt16 (10)); -- LF + end Log; +end Logging; diff --git a/firmware/ada/src/logging.ads b/firmware/ada/src/logging.ads new file mode 100644 index 0000000..32eaa2a --- /dev/null +++ b/firmware/ada/src/logging.ads @@ -0,0 +1,16 @@ +with HAL; use HAL; +with STM32.Device; use STM32.Device; +with STM32.GPIO; use STM32.GPIO; +with STM32.USARTs; use STM32.USARTs; + +package Logging is + + procedure Init; + + procedure Await_Send_Ready (This : USART); + + procedure Put_Blocking (This : in out USART; Data : UInt16); + + procedure Log (S : String; L : Integer := 1; Deindent : Integer := 0); + +end Logging; 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; |