1 -- OpenOCD RPC example, covered by GNU GPLv3 or later
2 -- Copyright (C) 2014 Paul Fertser
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
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"]
15 {-# LANGUAGE OverloadedStrings #-}
19 import Control.Applicative
21 import System.IO.Streams.Core hiding (connect)
22 import System.IO.Streams.Network
23 import System.IO.Streams.Attoparsec
24 import Data.Attoparsec.ByteString.Char8
25 import Data.Attoparsec.Combinator
26 import Data.ByteString.Char8 hiding (putStrLn, concat, map)
29 ocdReply = manyTill anyChar (char '\x1a')
31 ocdExec (oistream, oostream) command = do
32 write (Just $ pack $ command ++ "\x1a") oostream
33 parseFromStream ocdReply oistream
35 -- For each line: dispose of address, then match hex values
36 mdwParser = (manyTill anyChar (string ": ") *>
37 hexadecimal `sepBy` char ' ')
40 ocdMdw :: (InputStream ByteString, OutputStream ByteString) -> Integer -> Integer -> IO [Integer]
41 ocdMdw s start count = do
42 s <- ocdExec s $ "ocd_mdw " ++ show start ++ " " ++ show count
43 case parseOnly mdwParser (pack s) of
44 Right r -> return $ concat r
47 osock <- socket AF_INET Stream defaultProtocol
48 haddr <- inet_addr "127.0.0.1"
49 connect osock (SockAddrInet 6666 haddr)
50 ostreams <- socketToStreams osock
51 putStrLn "Halting the target, full log output captured:"
52 ocdExec ostreams "capture \"halt\"" >>= putStrLn
53 putStrLn "Read memory, parse the result and show as a list of strings:"
54 ocdMdw ostreams 0 16 >>= putStrLn . (show :: [String] -> String) . map (printf "0x%08x")
56 ocdExec ostreams "resume"