1-- OpenOCD RPC example, covered by GNU GPLv3 or later 2-- Copyright (C) 2014 Paul Fertser 3-- 4-- Example output: 5-- $ ./ocdrpc 6-- Halting the target, full log output captured: 7-- target state: halted 8-- target halted due to debug-request, current mode: Thread 9-- xPSR: 0x21000000 pc: 0x00003352 msp: 0x20000fe8 10-- 11-- Read memory, parse the result and show as a list of strings: 12-- ["0x20001000","0x0000334d","0x00002abb","0x0000118f","0x00002707","0x00002707","0x00002707","0x00000000","0x00000000","0x00000000","0x00000000","0x00002707","0x00002707","0x00000000","0x00002707","0x00002781"] 13-- Resuming 14 15{-# LANGUAGE OverloadedStrings #-} 16module Main where 17 18import Prelude 19import Network.Socket 20import System.IO.Streams.Core hiding (connect) 21import System.IO.Streams.Network 22import System.IO.Streams.Attoparsec 23import Data.Attoparsec.ByteString.Char8 24import Data.ByteString.Char8 hiding (putStrLn, concat, map) 25import Text.Printf 26 27ocdReply = manyTill anyChar (char '\x1a') 28 29ocdExec (oistream, oostream) command = do 30 write (Just $ pack $ command ++ "\x1a") oostream 31 parseFromStream ocdReply oistream 32 33-- For each line: dispose of address, then match hex values 34mdwParser = (manyTill anyChar (string ": ") *> 35 hexadecimal `sepBy` char ' ') 36 `sepBy` string " \n" 37 38ocdMdw :: (InputStream ByteString, OutputStream ByteString) -> Integer -> Integer -> IO [Integer] 39ocdMdw s start qnt = do 40 res <- ocdExec s $ "mdw " ++ show start ++ " " ++ show qnt 41 case parseOnly mdwParser (pack res) of 42 Right r -> return $ concat r 43 44main = do 45 osock <- socket AF_INET Stream defaultProtocol 46 connect osock (SockAddrInet 6666 $ tupleToHostAddress (127,0,0,1)) 47 ostreams <- socketToStreams osock 48 putStrLn "Halting the target, full log output captured:" 49 ocdExec ostreams "capture \"halt\"" >>= putStrLn 50 putStrLn "Read memory, parse the result and show as a list of strings:" 51 ocdMdw ostreams 0 16 >>= putStrLn . (show :: [String] -> String) . map (printf "0x%08x") 52 putStrLn "Resuming" 53 ocdExec ostreams "resume" 54