From 79996281be90c3969f24b6b2683358a8a6bd00d0 Mon Sep 17 00:00:00 2001 From: Ryan Slawson Date: Wed, 19 Feb 2025 12:04:17 +0100 Subject: [PATCH] Make GDB init wait until target device is connected. --- .../src/Bittide/Instances/Hitl/Driver/Demo.hs | 13 +++---------- .../src/Bittide/Instances/Hitl/Utils/Program.hs | 7 ++++++- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/bittide-instances/src/Bittide/Instances/Hitl/Driver/Demo.hs b/bittide-instances/src/Bittide/Instances/Hitl/Driver/Demo.hs index 7cd899785..0cf42865d 100644 --- a/bittide-instances/src/Bittide/Instances/Hitl/Driver/Demo.hs +++ b/bittide-instances/src/Bittide/Instances/Hitl/Driver/Demo.hs @@ -15,7 +15,6 @@ import Bittide.Instances.Hitl.Setup (demoRigInfo) import Bittide.Instances.Hitl.Utils.Program import Bittide.Instances.Hitl.Utils.Vivado -import Control.Exception (SomeException, catch) import Control.Monad (forM_, zipWithM) import Control.Monad.IO.Class import Data.Maybe (fromMaybe) @@ -182,6 +181,9 @@ driverFunc testName targets = do "gdb-" <> binName <> "-" <> show (getTargetIndex hwT) <> ".log" Gdb.setFile gdb $ firmwareBinariesDir "riscv32imc" Release binName Gdb.setTarget gdb gdbPort + Gdb.runCommands gdb.stdinHandle ["echo connected to target device"] + tryWithTimeout "Waiting for GDB to be ready to proceed" 15_000_000 + $ expectLine gdb.stdoutHandle gdbWaitForConnect let gdbProcName = "GDB (" <> binName <> ", " <> show d.deviceId <> ")" @@ -246,16 +248,8 @@ driverFunc testName targets = do then (count + 1, acc) else (count, code) - dumpBuffer :: Handle -> (Handle -> IO a) -> IO () - dumpBuffer hdl f = do - ready <- catch (hReady hdl) $ \(_ :: SomeException) -> return False - if ready - then f hdl >> dumpBuffer hdl f - else return () - muGdbCheck :: (HwTarget, DeviceInfo) -> ProcessStdIoHandles -> VivadoM ExitCode muGdbCheck (_, _) gdb = do - liftIO $ dumpBuffer gdb.stdoutHandle hGetLine liftIO $ Gdb.runCommands gdb.stdinHandle ["x/4sb 0x60000000", "echo END OF WHOAMI\\n"] gdbRead <- liftIO @@ -266,7 +260,6 @@ driverFunc testName targets = do ccGdbCheck :: (HwTarget, DeviceInfo) -> ProcessStdIoHandles -> VivadoM ExitCode ccGdbCheck (_, _) gdb = do - liftIO $ dumpBuffer gdb.stdoutHandle hGetLine liftIO $ Gdb.runCommands gdb.stdinHandle ["x/4sb 0x60000000", "echo END OF WHOAMI\\n"] gdbRead <- liftIO diff --git a/bittide-instances/src/Bittide/Instances/Hitl/Utils/Program.hs b/bittide-instances/src/Bittide/Instances/Hitl/Utils/Program.hs index 615ddfc58..e1bb139bf 100644 --- a/bittide-instances/src/Bittide/Instances/Hitl/Utils/Program.hs +++ b/bittide-instances/src/Bittide/Instances/Hitl/Utils/Program.hs @@ -14,7 +14,7 @@ import Paths_bittide_instances import Control.Monad.Catch import Control.Monad.IO.Class -import Data.List (isPrefixOf) +import Data.List (isInfixOf, isPrefixOf) import Data.Maybe (fromJust) import System.IO import System.Posix.Env (getEnvironment) @@ -239,6 +239,11 @@ openOcdWaitForHalt s | "Halting processor" `isPrefixOf` s = Stop Ok | otherwise = Continue +gdbWaitForConnect :: String -> Filter +gdbWaitForConnect s + | "connected to target device" `isInfixOf` s = Stop Ok + | otherwise = Continue + gdbWaitForLoad :: String -> Filter gdbWaitForLoad s | "Remote communication error." `isPrefixOf` s =