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