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 #-}
20 import System
.IO.Streams
.Core
hiding (connect
)
21 import System
.IO.Streams
.Network
22 import System
.IO.Streams
.Attoparsec
23 import Data
.Attoparsec
.ByteString
.Char8
24 import Data
.ByteString
.Char8
hiding (putStrLn, concat, map)
27 ocdReply
= manyTill anyChar
(char
'\x1a')
29 ocdExec
(oistream
, oostream
) command
= do
30 write
(Just
$ pack
$ command
++ "\x1a") oostream
31 parseFromStream ocdReply oistream
33 -- For each line: dispose of address, then match hex values
34 mdwParser
= (manyTill anyChar
(string ": ") *>
35 hexadecimal `sepBy` char
' ')
38 ocdMdw
:: (InputStream ByteString
, OutputStream ByteString
) -> Integer -> Integer -> IO [Integer]
39 ocdMdw 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
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")
53 ocdExec ostreams
"resume"