[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/DistRap/hocd/ci.yaml?branch=main)](https://github.com/DistRap/hocd/actions/workflows/ci.yaml) [![Hackage version](https://img.shields.io/hackage/v/hocd.svg?color=success)](https://hackage.haskell.org/package/hocd) [![Dependencies](https://img.shields.io/hackage-deps/v/hocd?label=Dependencies)](https://packdeps.haskellers.com/feed?needle=hocd) # hocd [OpenOCD] RPC service client. [OpenOCD]: https://openocd.org/ ## API See Haddocks or [HOCD.Monad] [HOCD.Monad]: ./src/HOCD/Monad.hs ## Example ```haskell {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeApplications #-} import Data.Word (Word32) import HOCD main :: IO () main = runOCD example >>= print -- | For STM32G474 example :: MonadOCD m => m ([Word32], Word32, Word32) example = do -- Note that halting a target is not required -- for writing or reading memory, only for reading -- CPU registers halt' -- Read pc CPU register pc <- readReg $ regName "pc" -- Write back same value writeReg @Word32 (regName "pc") pc -- Read RCC.CR register rccCr <- readMemCount @Word32 0x40021000 2 -- Read and increment GPIOA.ODR register let gpioaOdr = 0x48000014 odr <- readMem32 gpioaOdr writeMem gpioaOdr [odr+1] r <- readMem32 gpioaOdr resume pure (rccCr, r, pc) ``` This example is runnable from git repository using: ```sh openocd -f nucleo.cfg cabal run hocd-readme ``` ## Executable `hocd-read-mem` can be used to read a single or multiple addresses: ```sh cabal run hocd-read-mem -- 0x40021000 0x48000014 ``` Outputs: ``` 0x40021000: 0x3030500 0x48000014: 0x9 ```