Just4Trionic - CAN and BDM FLASH programmer for Saab cars

Dependencies:   mbed

Committer:
Just4pLeisure
Date:
Tue Sep 14 21:02:04 2010 +0000
Revision:
1:d5452e398b76
Child:
2:bf3a2b29259a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Just4pLeisure 1:d5452e398b76 1 /*******************************************************************************
Just4pLeisure 1:d5452e398b76 2
Just4pLeisure 1:d5452e398b76 3 bdmcpu32.cpp
Just4pLeisure 1:d5452e398b76 4 (c) 2010 by Sophie Dexter
Just4pLeisure 1:d5452e398b76 5
Just4pLeisure 1:d5452e398b76 6 Generic BDM functions for Just4Trionic by Just4pLeisure
Just4pLeisure 1:d5452e398b76 7
Just4pLeisure 1:d5452e398b76 8 A derivative work based on:
Just4pLeisure 1:d5452e398b76 9 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 10 // CAN/BDM adapter firmware
Just4pLeisure 1:d5452e398b76 11 // (C) Janis Silins, 2010
Just4pLeisure 1:d5452e398b76 12 // $id$
Just4pLeisure 1:d5452e398b76 13 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 14
Just4pLeisure 1:d5452e398b76 15 ********************************************************************************
Just4pLeisure 1:d5452e398b76 16
Just4pLeisure 1:d5452e398b76 17 WARNING: Use at your own risk, sadly this software comes with no guarantees.
Just4pLeisure 1:d5452e398b76 18 This software is provided 'free' and in good faith, but the author does not
Just4pLeisure 1:d5452e398b76 19 accept liability for any damage arising from its use.
Just4pLeisure 1:d5452e398b76 20
Just4pLeisure 1:d5452e398b76 21 *******************************************************************************/
Just4pLeisure 1:d5452e398b76 22
Just4pLeisure 1:d5452e398b76 23 #include "bdmcpu32.h"
Just4pLeisure 1:d5452e398b76 24
Just4pLeisure 1:d5452e398b76 25 // constants
Just4pLeisure 1:d5452e398b76 26 #define MCU_SETTLE_TIME 10 ///< delay to let MCU switch modes, ms
Just4pLeisure 1:d5452e398b76 27 #define CMD_BIT_COUNT 17 ///< command size, bits
Just4pLeisure 1:d5452e398b76 28
Just4pLeisure 1:d5452e398b76 29 // BDM commands
Just4pLeisure 1:d5452e398b76 30 #define BDM_NOP 0x0000 ///< no-op
Just4pLeisure 1:d5452e398b76 31 #define BDM_GO 0x0c00 ///< resume execution
Just4pLeisure 1:d5452e398b76 32 #define BDM_WRITE 0x1800 ///< write memory
Just4pLeisure 1:d5452e398b76 33 #define BDM_READ 0x1900 ///< read memory
Just4pLeisure 1:d5452e398b76 34 #define BDM_WSREG 0x2480 ///< write system register
Just4pLeisure 1:d5452e398b76 35 #define BDM_RSREG 0x2580 ///< read system register
Just4pLeisure 1:d5452e398b76 36 #define BDM_RDREG 0x2180 ///< read A/D register
Just4pLeisure 1:d5452e398b76 37 #define BDM_WRREG 0x2080 ///< write A/D register
Just4pLeisure 1:d5452e398b76 38 #define BDM_DUMP 0x1d00 ///< dump memory
Just4pLeisure 1:d5452e398b76 39 #define BDM_FILL 0x1c00 ///< fill memory
Just4pLeisure 1:d5452e398b76 40 #define BDM_CALL 0x0800 ///< function call
Just4pLeisure 1:d5452e398b76 41 #define BDM_RST 0x0400 ///< reset
Just4pLeisure 1:d5452e398b76 42
Just4pLeisure 1:d5452e398b76 43 // system registers
Just4pLeisure 1:d5452e398b76 44 #define SREG_RPC 0x0
Just4pLeisure 1:d5452e398b76 45 #define SREG_PCC 0x1
Just4pLeisure 1:d5452e398b76 46 #define SREG_SR 0xb
Just4pLeisure 1:d5452e398b76 47 #define SREG_USP 0xc
Just4pLeisure 1:d5452e398b76 48 #define SREG_SSP 0xd
Just4pLeisure 1:d5452e398b76 49 #define SREG_SFC 0xe
Just4pLeisure 1:d5452e398b76 50 #define SREG_DFC 0xf
Just4pLeisure 1:d5452e398b76 51 #define SREG_ATEMP 0x8
Just4pLeisure 1:d5452e398b76 52 #define SREG_FAR 0x9
Just4pLeisure 1:d5452e398b76 53 #define SREG_VBR 0xa
Just4pLeisure 1:d5452e398b76 54
Just4pLeisure 1:d5452e398b76 55 // BDM responses
Just4pLeisure 1:d5452e398b76 56 #define BDM_CMDCMPLTE 0x0000ffff ///< command complete
Just4pLeisure 1:d5452e398b76 57 #define BDM_NOTREADY 0x00010000 ///< response not ready
Just4pLeisure 1:d5452e398b76 58 #define BDM_BERR 0x00010001 ///< error
Just4pLeisure 1:d5452e398b76 59 #define BDM_ILLEGAL 0x0001ffff ///< illegal command
Just4pLeisure 1:d5452e398b76 60
Just4pLeisure 1:d5452e398b76 61 // BDM data sizes
Just4pLeisure 1:d5452e398b76 62 #define BDM_BYTESIZE 0x00 ///< byte
Just4pLeisure 1:d5452e398b76 63 #define BDM_WORDSIZE 0x40 ///< word (2 bytes)
Just4pLeisure 1:d5452e398b76 64 #define BDM_LONGSIZE 0x80 ///< long word (4 bytes)
Just4pLeisure 1:d5452e398b76 65
Just4pLeisure 1:d5452e398b76 66 // static variables
Just4pLeisure 1:d5452e398b76 67 static uint32_t bdm_response; ///< result of BDM read/write operation
Just4pLeisure 1:d5452e398b76 68
Just4pLeisure 1:d5452e398b76 69 // private functions
Just4pLeisure 1:d5452e398b76 70 bool bdm_read(uint32_t* result, uint16_t cmd, const uint32_t* addr);
Just4pLeisure 1:d5452e398b76 71 //bool bdm_read_overlap(uint32_t* result, uint16_t cmd, const uint32_t* addr, uint16_t next_cmd);
Just4pLeisure 1:d5452e398b76 72 //bool bdm_read_continue(uint32_t* result, const uint32_t* addr, uint16_t next_cmd);
Just4pLeisure 1:d5452e398b76 73 bool bdm_write(const uint32_t* addr, uint16_t cmd, const uint32_t* value);
Just4pLeisure 1:d5452e398b76 74 //bool bdm_write_overlap(const uint32_t* addr, uint16_t cmd, const uint32_t* value, uint16_t next_cmd);
Just4pLeisure 1:d5452e398b76 75 void bdm_clk(uint16_t value, uint8_t num_bits);
Just4pLeisure 1:d5452e398b76 76 void bdm_clear();
Just4pLeisure 1:d5452e398b76 77
Just4pLeisure 1:d5452e398b76 78 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 79 /**
Just4pLeisure 1:d5452e398b76 80 Stops target MCU and puts into background debug mode (BDM).
Just4pLeisure 1:d5452e398b76 81
Just4pLeisure 1:d5452e398b76 82 @return status flag
Just4pLeisure 1:d5452e398b76 83 */
Just4pLeisure 1:d5452e398b76 84 uint8_t stop_chip() {
Just4pLeisure 1:d5452e398b76 85 // not connected
Just4pLeisure 1:d5452e398b76 86 if (!IS_CONNECTED) {
Just4pLeisure 1:d5452e398b76 87 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 88 }
Just4pLeisure 1:d5452e398b76 89
Just4pLeisure 1:d5452e398b76 90 // pull BKPT low to enter background mode (the pin must remain in output mode,
Just4pLeisure 1:d5452e398b76 91 // otherwise the target will pull it high and we'll lose the first DSO bit)
Just4pLeisure 1:d5452e398b76 92 PIN_BKPT.write(0);
Just4pLeisure 1:d5452e398b76 93 // set BPKT pin as output
Just4pLeisure 1:d5452e398b76 94 PIN_BKPT.output();
Just4pLeisure 1:d5452e398b76 95
Just4pLeisure 1:d5452e398b76 96 // wait for target MCU to settle
Just4pLeisure 1:d5452e398b76 97 wait_ms(MCU_SETTLE_TIME);
Just4pLeisure 1:d5452e398b76 98
Just4pLeisure 1:d5452e398b76 99 // check if succeeded
Just4pLeisure 1:d5452e398b76 100 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 101 // set BKPT back as input and fail
Just4pLeisure 1:d5452e398b76 102 PIN_BKPT.input();
Just4pLeisure 1:d5452e398b76 103 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 104 }
Just4pLeisure 1:d5452e398b76 105
Just4pLeisure 1:d5452e398b76 106 return TERM_OK;
Just4pLeisure 1:d5452e398b76 107 }
Just4pLeisure 1:d5452e398b76 108
Just4pLeisure 1:d5452e398b76 109 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 110 /**
Just4pLeisure 1:d5452e398b76 111 Forces hardware reset on target MCU and lets it run.
Just4pLeisure 1:d5452e398b76 112
Just4pLeisure 1:d5452e398b76 113 @return status flag
Just4pLeisure 1:d5452e398b76 114 */
Just4pLeisure 1:d5452e398b76 115 uint8_t reset_chip() {
Just4pLeisure 1:d5452e398b76 116 // not connected
Just4pLeisure 1:d5452e398b76 117 if (!IS_CONNECTED) {
Just4pLeisure 1:d5452e398b76 118 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 119 }
Just4pLeisure 1:d5452e398b76 120
Just4pLeisure 1:d5452e398b76 121 // BKPT pin as input
Just4pLeisure 1:d5452e398b76 122 PIN_BKPT.input();
Just4pLeisure 1:d5452e398b76 123 // push RESET low
Just4pLeisure 1:d5452e398b76 124 PIN_RESET.write(0);
Just4pLeisure 1:d5452e398b76 125 // RESET pins as output
Just4pLeisure 1:d5452e398b76 126 PIN_RESET.output();
Just4pLeisure 1:d5452e398b76 127 // wait for MCU to settle
Just4pLeisure 1:d5452e398b76 128 wait_ms(MCU_SETTLE_TIME);
Just4pLeisure 1:d5452e398b76 129 // rising edge on RESET line
Just4pLeisure 1:d5452e398b76 130 PIN_RESET.write(1);
Just4pLeisure 1:d5452e398b76 131 // wait for MCU to settle
Just4pLeisure 1:d5452e398b76 132 wait_ms(MCU_SETTLE_TIME);
Just4pLeisure 1:d5452e398b76 133
Just4pLeisure 1:d5452e398b76 134 // set RESET as an input again
Just4pLeisure 1:d5452e398b76 135 PIN_RESET.input();
Just4pLeisure 1:d5452e398b76 136
Just4pLeisure 1:d5452e398b76 137 // check if succeeded
Just4pLeisure 1:d5452e398b76 138 return IS_RUNNING ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 139 }
Just4pLeisure 1:d5452e398b76 140
Just4pLeisure 1:d5452e398b76 141 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 142 /**
Just4pLeisure 1:d5452e398b76 143 Starts target MCU from the specified address. If address is 0, execution
Just4pLeisure 1:d5452e398b76 144 begins at the current address in program counter.
Just4pLeisure 1:d5452e398b76 145
Just4pLeisure 1:d5452e398b76 146 @param addr start address
Just4pLeisure 1:d5452e398b76 147
Just4pLeisure 1:d5452e398b76 148 @return status flag
Just4pLeisure 1:d5452e398b76 149 */
Just4pLeisure 1:d5452e398b76 150 uint8_t run_chip(const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 151 // check state
Just4pLeisure 1:d5452e398b76 152 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 153 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 154 }
Just4pLeisure 1:d5452e398b76 155
Just4pLeisure 1:d5452e398b76 156 // set program counter
Just4pLeisure 1:d5452e398b76 157 if ((*addr > 0) && sysreg_write(SREG_RPC, addr) != TERM_OK) {
Just4pLeisure 1:d5452e398b76 158 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 159 }
Just4pLeisure 1:d5452e398b76 160 // resume MCU
Just4pLeisure 1:d5452e398b76 161 bdm_clk(BDM_GO, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 162
Just4pLeisure 1:d5452e398b76 163 // set BKPT back as input
Just4pLeisure 1:d5452e398b76 164 PIN_BKPT.input();
Just4pLeisure 1:d5452e398b76 165
Just4pLeisure 1:d5452e398b76 166 return TERM_OK;
Just4pLeisure 1:d5452e398b76 167 }
Just4pLeisure 1:d5452e398b76 168
Just4pLeisure 1:d5452e398b76 169 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 170 /**
Just4pLeisure 1:d5452e398b76 171 Resets target MCU and stops execution on first instruction fetch.
Just4pLeisure 1:d5452e398b76 172
Just4pLeisure 1:d5452e398b76 173 @return status flag
Just4pLeisure 1:d5452e398b76 174 */
Just4pLeisure 1:d5452e398b76 175 uint8_t restart_chip() {
Just4pLeisure 1:d5452e398b76 176 // not connected
Just4pLeisure 1:d5452e398b76 177 if (!IS_CONNECTED) {
Just4pLeisure 1:d5452e398b76 178 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 179 }
Just4pLeisure 1:d5452e398b76 180
Just4pLeisure 1:d5452e398b76 181 // pull BKPT low to enter background mode (the pin must remain an output,
Just4pLeisure 1:d5452e398b76 182 // otherwise the target will pull it high and we'll lose the first DSO bit)
Just4pLeisure 1:d5452e398b76 183 PIN_BKPT.write(0);
Just4pLeisure 1:d5452e398b76 184 // push RESET low
Just4pLeisure 1:d5452e398b76 185 PIN_RESET.write(0);
Just4pLeisure 1:d5452e398b76 186 // RESET, BKPT pins as outputs
Just4pLeisure 1:d5452e398b76 187 PIN_BKPT.output();
Just4pLeisure 1:d5452e398b76 188 PIN_RESET.output();
Just4pLeisure 1:d5452e398b76 189 // wait for target MCU to settle
Just4pLeisure 1:d5452e398b76 190 wait_ms(MCU_SETTLE_TIME);
Just4pLeisure 1:d5452e398b76 191 // rising edge on RESET line
Just4pLeisure 1:d5452e398b76 192 PIN_RESET.write(1);
Just4pLeisure 1:d5452e398b76 193 // wait for target MCU to settle
Just4pLeisure 1:d5452e398b76 194 wait_ms(MCU_SETTLE_TIME);
Just4pLeisure 1:d5452e398b76 195 // set RESET back as an input
Just4pLeisure 1:d5452e398b76 196 PIN_RESET.input();
Just4pLeisure 1:d5452e398b76 197
Just4pLeisure 1:d5452e398b76 198 // check if succeeded
Just4pLeisure 1:d5452e398b76 199 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 200 // set BKPT back as input and fail
Just4pLeisure 1:d5452e398b76 201 PIN_BKPT.input();
Just4pLeisure 1:d5452e398b76 202 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 203 }
Just4pLeisure 1:d5452e398b76 204
Just4pLeisure 1:d5452e398b76 205 return TERM_OK;
Just4pLeisure 1:d5452e398b76 206 }
Just4pLeisure 1:d5452e398b76 207
Just4pLeisure 1:d5452e398b76 208 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 209 /**
Just4pLeisure 1:d5452e398b76 210 Sends GO command word to target MCU, then triggers breakpoint on first
Just4pLeisure 1:d5452e398b76 211 instruction fetch.
Just4pLeisure 1:d5452e398b76 212
Just4pLeisure 1:d5452e398b76 213 @return status flag
Just4pLeisure 1:d5452e398b76 214 */
Just4pLeisure 1:d5452e398b76 215 uint8_t step_chip() {
Just4pLeisure 1:d5452e398b76 216 // not connected
Just4pLeisure 1:d5452e398b76 217 if (!IS_CONNECTED) {
Just4pLeisure 1:d5452e398b76 218 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 219 }
Just4pLeisure 1:d5452e398b76 220
Just4pLeisure 1:d5452e398b76 221 // resume MCU
Just4pLeisure 1:d5452e398b76 222 bdm_clk(BDM_GO, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 223
Just4pLeisure 1:d5452e398b76 224 // pull BKPT low to enter background mode (the pin must remain an output,
Just4pLeisure 1:d5452e398b76 225 // otherwise the target pulls it high and we lose the first DSO bit)
Just4pLeisure 1:d5452e398b76 226 PIN_BKPT.write(0);
Just4pLeisure 1:d5452e398b76 227 // set BPKT pin as output
Just4pLeisure 1:d5452e398b76 228 PIN_BKPT.output();
Just4pLeisure 1:d5452e398b76 229
Just4pLeisure 1:d5452e398b76 230 // wait for target MCU to settle
Just4pLeisure 1:d5452e398b76 231 // delay_ms(MCU_SETTLE_TIME);
Just4pLeisure 1:d5452e398b76 232 wait_ms(MCU_SETTLE_TIME);
Just4pLeisure 1:d5452e398b76 233
Just4pLeisure 1:d5452e398b76 234 // check if succeeded
Just4pLeisure 1:d5452e398b76 235 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 236 // set BKPT back as input and fail
Just4pLeisure 1:d5452e398b76 237 PIN_BKPT.input();
Just4pLeisure 1:d5452e398b76 238 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 239 }
Just4pLeisure 1:d5452e398b76 240
Just4pLeisure 1:d5452e398b76 241 return TERM_OK;
Just4pLeisure 1:d5452e398b76 242 }
Just4pLeisure 1:d5452e398b76 243
Just4pLeisure 1:d5452e398b76 244 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 245 /**
Just4pLeisure 1:d5452e398b76 246 Pulls BKPT pin low.
Just4pLeisure 1:d5452e398b76 247 */
Just4pLeisure 1:d5452e398b76 248 uint8_t bkpt_low() {
Just4pLeisure 1:d5452e398b76 249 PIN_BKPT.write(0);
Just4pLeisure 1:d5452e398b76 250 PIN_BKPT.output();
Just4pLeisure 1:d5452e398b76 251
Just4pLeisure 1:d5452e398b76 252 return TERM_OK;
Just4pLeisure 1:d5452e398b76 253 }
Just4pLeisure 1:d5452e398b76 254
Just4pLeisure 1:d5452e398b76 255 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 256 /**
Just4pLeisure 1:d5452e398b76 257 Pulls BKPT pin high.
Just4pLeisure 1:d5452e398b76 258 */
Just4pLeisure 1:d5452e398b76 259 uint8_t bkpt_high() {
Just4pLeisure 1:d5452e398b76 260 PIN_BKPT.write(1);
Just4pLeisure 1:d5452e398b76 261 PIN_BKPT.output();
Just4pLeisure 1:d5452e398b76 262
Just4pLeisure 1:d5452e398b76 263 return TERM_OK;
Just4pLeisure 1:d5452e398b76 264 }
Just4pLeisure 1:d5452e398b76 265
Just4pLeisure 1:d5452e398b76 266 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 267 /**
Just4pLeisure 1:d5452e398b76 268 Pulls RESET pin low.
Just4pLeisure 1:d5452e398b76 269 */
Just4pLeisure 1:d5452e398b76 270 uint8_t reset_low() {
Just4pLeisure 1:d5452e398b76 271 PIN_RESET.write(0);
Just4pLeisure 1:d5452e398b76 272 PIN_RESET.output();
Just4pLeisure 1:d5452e398b76 273
Just4pLeisure 1:d5452e398b76 274 return TERM_OK;
Just4pLeisure 1:d5452e398b76 275 }
Just4pLeisure 1:d5452e398b76 276
Just4pLeisure 1:d5452e398b76 277 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 278 /**
Just4pLeisure 1:d5452e398b76 279 Pulls RESET pin high.
Just4pLeisure 1:d5452e398b76 280 */
Just4pLeisure 1:d5452e398b76 281 uint8_t reset_high() {
Just4pLeisure 1:d5452e398b76 282 PIN_RESET.write(1);
Just4pLeisure 1:d5452e398b76 283 PIN_RESET.output();
Just4pLeisure 1:d5452e398b76 284
Just4pLeisure 1:d5452e398b76 285 return TERM_OK;
Just4pLeisure 1:d5452e398b76 286 }
Just4pLeisure 1:d5452e398b76 287
Just4pLeisure 1:d5452e398b76 288 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 289 /**
Just4pLeisure 1:d5452e398b76 290 Returns byte from the specified memory location; MCU must be in
Just4pLeisure 1:d5452e398b76 291 background mode.
Just4pLeisure 1:d5452e398b76 292
Just4pLeisure 1:d5452e398b76 293 @param result value (out)
Just4pLeisure 1:d5452e398b76 294 @param addr source address
Just4pLeisure 1:d5452e398b76 295
Just4pLeisure 1:d5452e398b76 296 @return status flag
Just4pLeisure 1:d5452e398b76 297 */
Just4pLeisure 1:d5452e398b76 298 uint8_t memread_byte(uint8_t* result, const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 299 // check state
Just4pLeisure 1:d5452e398b76 300 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 301 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 302 }
Just4pLeisure 1:d5452e398b76 303
Just4pLeisure 1:d5452e398b76 304 // read byte
Just4pLeisure 1:d5452e398b76 305 if (!bdm_read((uint32_t*)result, BDM_READ, addr)) {
Just4pLeisure 1:d5452e398b76 306 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 307 bdm_clear();
Just4pLeisure 1:d5452e398b76 308 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 309 }
Just4pLeisure 1:d5452e398b76 310
Just4pLeisure 1:d5452e398b76 311 return TERM_OK;
Just4pLeisure 1:d5452e398b76 312 }
Just4pLeisure 1:d5452e398b76 313
Just4pLeisure 1:d5452e398b76 314 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 315 /**
Just4pLeisure 1:d5452e398b76 316 Returns word (2 bytes) from the specified memory location. Address must be
Just4pLeisure 1:d5452e398b76 317 word-aligned and MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 318
Just4pLeisure 1:d5452e398b76 319 @param result value (out)
Just4pLeisure 1:d5452e398b76 320 @param addr source address
Just4pLeisure 1:d5452e398b76 321
Just4pLeisure 1:d5452e398b76 322 @return status flag
Just4pLeisure 1:d5452e398b76 323 */
Just4pLeisure 1:d5452e398b76 324 uint8_t memread_word(uint16_t* result, const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 325 // check state
Just4pLeisure 1:d5452e398b76 326 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 327 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 328 }
Just4pLeisure 1:d5452e398b76 329
Just4pLeisure 1:d5452e398b76 330 // read word
Just4pLeisure 1:d5452e398b76 331 if (!bdm_read((uint32_t*)result, BDM_READ + BDM_WORDSIZE, addr)) {
Just4pLeisure 1:d5452e398b76 332 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 333 bdm_clear();
Just4pLeisure 1:d5452e398b76 334 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 335 }
Just4pLeisure 1:d5452e398b76 336
Just4pLeisure 1:d5452e398b76 337 return TERM_OK;
Just4pLeisure 1:d5452e398b76 338 }
Just4pLeisure 1:d5452e398b76 339
Just4pLeisure 1:d5452e398b76 340 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 341 /**
Just4pLeisure 1:d5452e398b76 342 Returns long word (4 bytes) from the specified memory location. Address
Just4pLeisure 1:d5452e398b76 343 must be word-aligned and target MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 344
Just4pLeisure 1:d5452e398b76 345 @param result value
Just4pLeisure 1:d5452e398b76 346 @param addr source address
Just4pLeisure 1:d5452e398b76 347
Just4pLeisure 1:d5452e398b76 348 @return status flag
Just4pLeisure 1:d5452e398b76 349 */
Just4pLeisure 1:d5452e398b76 350 uint8_t memread_long(uint32_t* result, const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 351 // check state
Just4pLeisure 1:d5452e398b76 352 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 353 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 354 }
Just4pLeisure 1:d5452e398b76 355
Just4pLeisure 1:d5452e398b76 356 // read long word
Just4pLeisure 1:d5452e398b76 357 if (!bdm_read(result, BDM_READ + BDM_LONGSIZE, addr)) {
Just4pLeisure 1:d5452e398b76 358 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 359 bdm_clear();
Just4pLeisure 1:d5452e398b76 360 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 361 }
Just4pLeisure 1:d5452e398b76 362
Just4pLeisure 1:d5452e398b76 363 return TERM_OK;
Just4pLeisure 1:d5452e398b76 364 }
Just4pLeisure 1:d5452e398b76 365
Just4pLeisure 1:d5452e398b76 366 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 367 /**
Just4pLeisure 1:d5452e398b76 368 Dumps byte from the specified memory location; MCU must be in background
Just4pLeisure 1:d5452e398b76 369 mode. Any memread_*() function must be called beforehand to set the
Just4pLeisure 1:d5452e398b76 370 initial address.
Just4pLeisure 1:d5452e398b76 371
Just4pLeisure 1:d5452e398b76 372 @param value result (out)
Just4pLeisure 1:d5452e398b76 373
Just4pLeisure 1:d5452e398b76 374 @return status flag
Just4pLeisure 1:d5452e398b76 375 */
Just4pLeisure 1:d5452e398b76 376 uint8_t memdump_byte(uint8_t* result) {
Just4pLeisure 1:d5452e398b76 377 // check state
Just4pLeisure 1:d5452e398b76 378 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 379 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 380 }
Just4pLeisure 1:d5452e398b76 381
Just4pLeisure 1:d5452e398b76 382 // dump byte
Just4pLeisure 1:d5452e398b76 383 if (!bdm_read((uint32_t*)result, BDM_DUMP, NULL)) {
Just4pLeisure 1:d5452e398b76 384 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 385 bdm_clear();
Just4pLeisure 1:d5452e398b76 386 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 387 }
Just4pLeisure 1:d5452e398b76 388
Just4pLeisure 1:d5452e398b76 389 return TERM_OK;
Just4pLeisure 1:d5452e398b76 390 }
Just4pLeisure 1:d5452e398b76 391
Just4pLeisure 1:d5452e398b76 392 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 393 /**
Just4pLeisure 1:d5452e398b76 394 dumps word from the specified memory location; MCU must be in background
Just4pLeisure 1:d5452e398b76 395 mode. Any memread_*() function must be called beforehand to set the
Just4pLeisure 1:d5452e398b76 396 initial address.
Just4pLeisure 1:d5452e398b76 397
Just4pLeisure 1:d5452e398b76 398 @param value result (out)
Just4pLeisure 1:d5452e398b76 399
Just4pLeisure 1:d5452e398b76 400 @return status flag
Just4pLeisure 1:d5452e398b76 401 */
Just4pLeisure 1:d5452e398b76 402 uint8_t memdump_word(uint16_t* result) {
Just4pLeisure 1:d5452e398b76 403 // check state
Just4pLeisure 1:d5452e398b76 404 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 405 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 406 }
Just4pLeisure 1:d5452e398b76 407
Just4pLeisure 1:d5452e398b76 408 // dump word
Just4pLeisure 1:d5452e398b76 409 if (!bdm_read((uint32_t*)result, BDM_DUMP + BDM_WORDSIZE, NULL)) {
Just4pLeisure 1:d5452e398b76 410 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 411 bdm_clear();
Just4pLeisure 1:d5452e398b76 412 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 413 }
Just4pLeisure 1:d5452e398b76 414
Just4pLeisure 1:d5452e398b76 415 return TERM_OK;
Just4pLeisure 1:d5452e398b76 416 }
Just4pLeisure 1:d5452e398b76 417
Just4pLeisure 1:d5452e398b76 418 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 419 /**
Just4pLeisure 1:d5452e398b76 420 Dumps long word from the specified memory location; MCU must be in
Just4pLeisure 1:d5452e398b76 421 background mode. Any memread_*() function must be called beforehand to set
Just4pLeisure 1:d5452e398b76 422 the initial address.
Just4pLeisure 1:d5452e398b76 423
Just4pLeisure 1:d5452e398b76 424 @param value result (out)
Just4pLeisure 1:d5452e398b76 425
Just4pLeisure 1:d5452e398b76 426 @return status flag
Just4pLeisure 1:d5452e398b76 427 */
Just4pLeisure 1:d5452e398b76 428 uint8_t memdump_long(uint32_t* result) {
Just4pLeisure 1:d5452e398b76 429 // check state
Just4pLeisure 1:d5452e398b76 430 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 431 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 432 }
Just4pLeisure 1:d5452e398b76 433
Just4pLeisure 1:d5452e398b76 434 // dump long word
Just4pLeisure 1:d5452e398b76 435 if (!bdm_read(result, BDM_DUMP + BDM_LONGSIZE, NULL)) {
Just4pLeisure 1:d5452e398b76 436 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 437 bdm_clear();
Just4pLeisure 1:d5452e398b76 438 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 439 }
Just4pLeisure 1:d5452e398b76 440
Just4pLeisure 1:d5452e398b76 441 return TERM_OK;
Just4pLeisure 1:d5452e398b76 442 }
Just4pLeisure 1:d5452e398b76 443
Just4pLeisure 1:d5452e398b76 444 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 445 /**
Just4pLeisure 1:d5452e398b76 446 Writes byte to the specified memory location; MCU must be in background
Just4pLeisure 1:d5452e398b76 447 mode.
Just4pLeisure 1:d5452e398b76 448
Just4pLeisure 1:d5452e398b76 449 @param addr destination address
Just4pLeisure 1:d5452e398b76 450 @param value value
Just4pLeisure 1:d5452e398b76 451
Just4pLeisure 1:d5452e398b76 452 @return status flag
Just4pLeisure 1:d5452e398b76 453 */
Just4pLeisure 1:d5452e398b76 454 uint8_t memwrite_byte(const uint32_t* addr, uint8_t value) {
Just4pLeisure 1:d5452e398b76 455 // check state
Just4pLeisure 1:d5452e398b76 456 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 457 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 458 }
Just4pLeisure 1:d5452e398b76 459
Just4pLeisure 1:d5452e398b76 460 // write byte
Just4pLeisure 1:d5452e398b76 461 if (!bdm_write(addr, BDM_WRITE, (uint32_t*)&value)) {
Just4pLeisure 1:d5452e398b76 462 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 463 bdm_clear();
Just4pLeisure 1:d5452e398b76 464 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 465 }
Just4pLeisure 1:d5452e398b76 466
Just4pLeisure 1:d5452e398b76 467 return TERM_OK;
Just4pLeisure 1:d5452e398b76 468 }
Just4pLeisure 1:d5452e398b76 469
Just4pLeisure 1:d5452e398b76 470 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 471 /**
Just4pLeisure 1:d5452e398b76 472 Writes word to the specified memory location. Address must be word-aligned
Just4pLeisure 1:d5452e398b76 473 and MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 474
Just4pLeisure 1:d5452e398b76 475 @param addr memory address
Just4pLeisure 1:d5452e398b76 476 @param value value
Just4pLeisure 1:d5452e398b76 477
Just4pLeisure 1:d5452e398b76 478 @return status flag
Just4pLeisure 1:d5452e398b76 479 */
Just4pLeisure 1:d5452e398b76 480 uint8_t memwrite_word(const uint32_t* addr, uint16_t value) {
Just4pLeisure 1:d5452e398b76 481 // check state
Just4pLeisure 1:d5452e398b76 482 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 483 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 484 }
Just4pLeisure 1:d5452e398b76 485
Just4pLeisure 1:d5452e398b76 486 // write word
Just4pLeisure 1:d5452e398b76 487 if (!bdm_write(addr, BDM_WRITE + BDM_WORDSIZE, (uint32_t*)&value)) {
Just4pLeisure 1:d5452e398b76 488 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 489 bdm_clear();
Just4pLeisure 1:d5452e398b76 490 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 491 }
Just4pLeisure 1:d5452e398b76 492
Just4pLeisure 1:d5452e398b76 493 return TERM_OK;
Just4pLeisure 1:d5452e398b76 494 }
Just4pLeisure 1:d5452e398b76 495
Just4pLeisure 1:d5452e398b76 496 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 497 /**
Just4pLeisure 1:d5452e398b76 498 Writes long word to the specified memory location. Address must be
Just4pLeisure 1:d5452e398b76 499 word-aligned and target MCU must be in background mode.
Just4pLeisure 1:d5452e398b76 500
Just4pLeisure 1:d5452e398b76 501 @param addr memory address
Just4pLeisure 1:d5452e398b76 502 @param value value
Just4pLeisure 1:d5452e398b76 503
Just4pLeisure 1:d5452e398b76 504 @return status flag
Just4pLeisure 1:d5452e398b76 505 */
Just4pLeisure 1:d5452e398b76 506 uint8_t memwrite_long(const uint32_t* addr, const uint32_t* value) {
Just4pLeisure 1:d5452e398b76 507 // check state
Just4pLeisure 1:d5452e398b76 508 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 509 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 510 }
Just4pLeisure 1:d5452e398b76 511
Just4pLeisure 1:d5452e398b76 512 // write long word
Just4pLeisure 1:d5452e398b76 513 if (!bdm_write(addr, BDM_WRITE + BDM_LONGSIZE, value)) {
Just4pLeisure 1:d5452e398b76 514 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 515 bdm_clear();
Just4pLeisure 1:d5452e398b76 516 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 517 }
Just4pLeisure 1:d5452e398b76 518
Just4pLeisure 1:d5452e398b76 519 return TERM_OK;
Just4pLeisure 1:d5452e398b76 520 }
Just4pLeisure 1:d5452e398b76 521
Just4pLeisure 1:d5452e398b76 522 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 523 /**
Just4pLeisure 1:d5452e398b76 524 Writes byte to the current memory location; MCU must be in background
Just4pLeisure 1:d5452e398b76 525 mode. Any memwrite_*() function must be called beforehand to set the
Just4pLeisure 1:d5452e398b76 526 current address.
Just4pLeisure 1:d5452e398b76 527
Just4pLeisure 1:d5452e398b76 528 @param value value
Just4pLeisure 1:d5452e398b76 529
Just4pLeisure 1:d5452e398b76 530 @return status flag
Just4pLeisure 1:d5452e398b76 531 */
Just4pLeisure 1:d5452e398b76 532 uint8_t memfill_byte(uint8_t value) {
Just4pLeisure 1:d5452e398b76 533 // check state
Just4pLeisure 1:d5452e398b76 534 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 535 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 536 }
Just4pLeisure 1:d5452e398b76 537
Just4pLeisure 1:d5452e398b76 538 // fill byte
Just4pLeisure 1:d5452e398b76 539 if (!bdm_write(NULL, BDM_FILL, (uint32_t*)&value)) {
Just4pLeisure 1:d5452e398b76 540 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 541 bdm_clear();
Just4pLeisure 1:d5452e398b76 542 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 543 }
Just4pLeisure 1:d5452e398b76 544
Just4pLeisure 1:d5452e398b76 545 return TERM_OK;
Just4pLeisure 1:d5452e398b76 546 }
Just4pLeisure 1:d5452e398b76 547
Just4pLeisure 1:d5452e398b76 548 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 549 /**
Just4pLeisure 1:d5452e398b76 550 Writes word to the specified memory location; MCU must be in background
Just4pLeisure 1:d5452e398b76 551 mode. Any memwrite_*() function must be called beforehand to set the
Just4pLeisure 1:d5452e398b76 552 initial address.
Just4pLeisure 1:d5452e398b76 553
Just4pLeisure 1:d5452e398b76 554 @param value value
Just4pLeisure 1:d5452e398b76 555
Just4pLeisure 1:d5452e398b76 556 @return status flag
Just4pLeisure 1:d5452e398b76 557 */
Just4pLeisure 1:d5452e398b76 558 uint8_t memfill_word(uint16_t value) {
Just4pLeisure 1:d5452e398b76 559 // check state
Just4pLeisure 1:d5452e398b76 560 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 561 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 562 }
Just4pLeisure 1:d5452e398b76 563
Just4pLeisure 1:d5452e398b76 564 // fill word
Just4pLeisure 1:d5452e398b76 565 if (!IN_BDM || !bdm_write(NULL, BDM_FILL + BDM_WORDSIZE, (uint32_t*)&value)) {
Just4pLeisure 1:d5452e398b76 566 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 567 bdm_clear();
Just4pLeisure 1:d5452e398b76 568 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 569 }
Just4pLeisure 1:d5452e398b76 570
Just4pLeisure 1:d5452e398b76 571 return TERM_OK;
Just4pLeisure 1:d5452e398b76 572 }
Just4pLeisure 1:d5452e398b76 573
Just4pLeisure 1:d5452e398b76 574 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 575 /**
Just4pLeisure 1:d5452e398b76 576 Writes long word to the specified memory location; MCU must be in background
Just4pLeisure 1:d5452e398b76 577 mode. Any memwrite_*() function must be called beforehand to set the
Just4pLeisure 1:d5452e398b76 578 initial address.
Just4pLeisure 1:d5452e398b76 579
Just4pLeisure 1:d5452e398b76 580 @param value value
Just4pLeisure 1:d5452e398b76 581
Just4pLeisure 1:d5452e398b76 582 @return status flag
Just4pLeisure 1:d5452e398b76 583 */
Just4pLeisure 1:d5452e398b76 584 uint8_t memfill_long(const uint32_t* value) {
Just4pLeisure 1:d5452e398b76 585 // check state
Just4pLeisure 1:d5452e398b76 586 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 587 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 588 }
Just4pLeisure 1:d5452e398b76 589
Just4pLeisure 1:d5452e398b76 590 // fill long word
Just4pLeisure 1:d5452e398b76 591 if (!bdm_write(NULL, BDM_FILL + BDM_LONGSIZE, value)) {
Just4pLeisure 1:d5452e398b76 592 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 593 bdm_clear();
Just4pLeisure 1:d5452e398b76 594 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 595 }
Just4pLeisure 1:d5452e398b76 596
Just4pLeisure 1:d5452e398b76 597 return TERM_OK;
Just4pLeisure 1:d5452e398b76 598 }
Just4pLeisure 1:d5452e398b76 599
Just4pLeisure 1:d5452e398b76 600 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 601 /**
Just4pLeisure 1:d5452e398b76 602 Issues a read byte command to MCU.
Just4pLeisure 1:d5452e398b76 603
Just4pLeisure 1:d5452e398b76 604 @param addr address (optional)
Just4pLeisure 1:d5452e398b76 605
Just4pLeisure 1:d5452e398b76 606 @return status flag
Just4pLeisure 1:d5452e398b76 607 */
Just4pLeisure 1:d5452e398b76 608 uint8_t memread_byte_cmd(const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 609
Just4pLeisure 1:d5452e398b76 610 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 611
Just4pLeisure 1:d5452e398b76 612 // write command code
Just4pLeisure 1:d5452e398b76 613 if (!bdm_command(BDM_READ + BDM_BYTESIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 614 // write the optional address
Just4pLeisure 1:d5452e398b76 615 if (addr) {
Just4pLeisure 1:d5452e398b76 616 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 617 }
Just4pLeisure 1:d5452e398b76 618
Just4pLeisure 1:d5452e398b76 619 return TERM_OK;
Just4pLeisure 1:d5452e398b76 620 }
Just4pLeisure 1:d5452e398b76 621
Just4pLeisure 1:d5452e398b76 622 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 623 /**
Just4pLeisure 1:d5452e398b76 624 Issues a read word command to MCU.
Just4pLeisure 1:d5452e398b76 625
Just4pLeisure 1:d5452e398b76 626 @param addr address (optional)
Just4pLeisure 1:d5452e398b76 627
Just4pLeisure 1:d5452e398b76 628 @return status flag
Just4pLeisure 1:d5452e398b76 629 */
Just4pLeisure 1:d5452e398b76 630 uint8_t memread_word_cmd(const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 631
Just4pLeisure 1:d5452e398b76 632 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 633
Just4pLeisure 1:d5452e398b76 634 // write command code
Just4pLeisure 1:d5452e398b76 635 bdm_clk(BDM_READ + BDM_WORDSIZE, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 636 if (bdm_response > BDM_CMDCMPLTE) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 637 // write the optional address
Just4pLeisure 1:d5452e398b76 638 if (addr) {
Just4pLeisure 1:d5452e398b76 639 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 640 }
Just4pLeisure 1:d5452e398b76 641
Just4pLeisure 1:d5452e398b76 642 return TERM_OK;
Just4pLeisure 1:d5452e398b76 643 }
Just4pLeisure 1:d5452e398b76 644
Just4pLeisure 1:d5452e398b76 645 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 646 /**
Just4pLeisure 1:d5452e398b76 647 Issues a read long command to MCU.
Just4pLeisure 1:d5452e398b76 648
Just4pLeisure 1:d5452e398b76 649 @param addr address (optional)
Just4pLeisure 1:d5452e398b76 650
Just4pLeisure 1:d5452e398b76 651 @return status flag
Just4pLeisure 1:d5452e398b76 652 */
Just4pLeisure 1:d5452e398b76 653 uint8_t memread_long_cmd(const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 654
Just4pLeisure 1:d5452e398b76 655 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 656
Just4pLeisure 1:d5452e398b76 657 // write command code
Just4pLeisure 1:d5452e398b76 658 bdm_clk(BDM_READ + BDM_LONGSIZE, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 659 if (bdm_response > BDM_CMDCMPLTE) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 660 // write the optional address
Just4pLeisure 1:d5452e398b76 661 if (addr) {
Just4pLeisure 1:d5452e398b76 662 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 663 }
Just4pLeisure 1:d5452e398b76 664
Just4pLeisure 1:d5452e398b76 665 return TERM_OK;
Just4pLeisure 1:d5452e398b76 666 }
Just4pLeisure 1:d5452e398b76 667 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 668 /**
Just4pLeisure 1:d5452e398b76 669 Issues a write byte command to MCU.
Just4pLeisure 1:d5452e398b76 670
Just4pLeisure 1:d5452e398b76 671 @param addr address (optional)
Just4pLeisure 1:d5452e398b76 672
Just4pLeisure 1:d5452e398b76 673 @return status flag
Just4pLeisure 1:d5452e398b76 674 */
Just4pLeisure 1:d5452e398b76 675 uint8_t memwrite_byte_cmd(const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 676
Just4pLeisure 1:d5452e398b76 677 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 678
Just4pLeisure 1:d5452e398b76 679 // write command code
Just4pLeisure 1:d5452e398b76 680 if (!bdm_command(BDM_WRITE + BDM_BYTESIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 681 // write the optional address
Just4pLeisure 1:d5452e398b76 682 if (addr) {
Just4pLeisure 1:d5452e398b76 683 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 684 }
Just4pLeisure 1:d5452e398b76 685
Just4pLeisure 1:d5452e398b76 686 return TERM_OK;
Just4pLeisure 1:d5452e398b76 687 }
Just4pLeisure 1:d5452e398b76 688
Just4pLeisure 1:d5452e398b76 689 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 690 /**
Just4pLeisure 1:d5452e398b76 691 Issues a write word command to MCU.
Just4pLeisure 1:d5452e398b76 692
Just4pLeisure 1:d5452e398b76 693 @param addr address (optional)
Just4pLeisure 1:d5452e398b76 694
Just4pLeisure 1:d5452e398b76 695 @return status flag
Just4pLeisure 1:d5452e398b76 696 */
Just4pLeisure 1:d5452e398b76 697 uint8_t memwrite_word_cmd(const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 698
Just4pLeisure 1:d5452e398b76 699 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 700
Just4pLeisure 1:d5452e398b76 701 // write command code
Just4pLeisure 1:d5452e398b76 702 bdm_clk(BDM_WRITE + BDM_WORDSIZE, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 703 if (bdm_response > BDM_CMDCMPLTE) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 704 // write the optional address
Just4pLeisure 1:d5452e398b76 705 if (addr) {
Just4pLeisure 1:d5452e398b76 706 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 707 }
Just4pLeisure 1:d5452e398b76 708
Just4pLeisure 1:d5452e398b76 709 return TERM_OK;
Just4pLeisure 1:d5452e398b76 710 }
Just4pLeisure 1:d5452e398b76 711
Just4pLeisure 1:d5452e398b76 712 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 713 /**
Just4pLeisure 1:d5452e398b76 714 Issues a write long command to MCU.
Just4pLeisure 1:d5452e398b76 715
Just4pLeisure 1:d5452e398b76 716 @param addr address (optional)
Just4pLeisure 1:d5452e398b76 717
Just4pLeisure 1:d5452e398b76 718 @return status flag
Just4pLeisure 1:d5452e398b76 719 */
Just4pLeisure 1:d5452e398b76 720 uint8_t memwrite_long_cmd(const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 721
Just4pLeisure 1:d5452e398b76 722 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 723
Just4pLeisure 1:d5452e398b76 724 // write command code
Just4pLeisure 1:d5452e398b76 725 bdm_clk(BDM_WRITE + BDM_LONGSIZE, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 726 if (bdm_response > BDM_CMDCMPLTE) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 727 // write the optional address
Just4pLeisure 1:d5452e398b76 728 if (addr) {
Just4pLeisure 1:d5452e398b76 729 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 730 }
Just4pLeisure 1:d5452e398b76 731
Just4pLeisure 1:d5452e398b76 732 return TERM_OK;
Just4pLeisure 1:d5452e398b76 733 }
Just4pLeisure 1:d5452e398b76 734
Just4pLeisure 1:d5452e398b76 735 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 736 /**
Just4pLeisure 1:d5452e398b76 737 Gets a byte from the MCU (follows a previously sent read or dump word cmd)
Just4pLeisure 1:d5452e398b76 738 Sends a READ_BYTE command so that commands overlap
Just4pLeisure 1:d5452e398b76 739
Just4pLeisure 1:d5452e398b76 740 @param result read result (out)
Just4pLeisure 1:d5452e398b76 741 addr address (optional)
Just4pLeisure 1:d5452e398b76 742
Just4pLeisure 1:d5452e398b76 743 @return status flag
Just4pLeisure 1:d5452e398b76 744 */
Just4pLeisure 1:d5452e398b76 745 uint8_t memread_read_byte(uint8_t* result, const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 746
Just4pLeisure 1:d5452e398b76 747 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 748 // write the optional address
Just4pLeisure 1:d5452e398b76 749 if (addr) {
Just4pLeisure 1:d5452e398b76 750 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 751 }
Just4pLeisure 1:d5452e398b76 752 // receive the response byte
Just4pLeisure 1:d5452e398b76 753 return (bdm_get ((uint32_t*)result, BDM_BYTESIZE, BDM_READ + BDM_BYTESIZE)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 754 }
Just4pLeisure 1:d5452e398b76 755
Just4pLeisure 1:d5452e398b76 756 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 757 /**
Just4pLeisure 1:d5452e398b76 758 Gets a byte from the MCU (follows a previously sent read or dump word cmd)
Just4pLeisure 1:d5452e398b76 759 Sends a WRITE_BYTE command so that commands overlap
Just4pLeisure 1:d5452e398b76 760
Just4pLeisure 1:d5452e398b76 761 @param result read result (out)
Just4pLeisure 1:d5452e398b76 762 addr address (optional)
Just4pLeisure 1:d5452e398b76 763
Just4pLeisure 1:d5452e398b76 764 @return status flag
Just4pLeisure 1:d5452e398b76 765 */
Just4pLeisure 1:d5452e398b76 766 uint8_t memread_write_byte(uint8_t* result, const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 767
Just4pLeisure 1:d5452e398b76 768 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 769 // write the optional address
Just4pLeisure 1:d5452e398b76 770 if (addr) {
Just4pLeisure 1:d5452e398b76 771 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 772 }
Just4pLeisure 1:d5452e398b76 773 // receive the response byte
Just4pLeisure 1:d5452e398b76 774 return (bdm_get((uint32_t*)result, BDM_BYTESIZE, BDM_WRITE + BDM_BYTESIZE)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 775 }
Just4pLeisure 1:d5452e398b76 776
Just4pLeisure 1:d5452e398b76 777 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 778 /**
Just4pLeisure 1:d5452e398b76 779 Gets a byte from the MCU (follows a previously sent read or dump word cmd)
Just4pLeisure 1:d5452e398b76 780 Sends a BDM_NOP command to end a sequence of overlapping commands
Just4pLeisure 1:d5452e398b76 781
Just4pLeisure 1:d5452e398b76 782 @param result read result (out)
Just4pLeisure 1:d5452e398b76 783 addr address (optional)
Just4pLeisure 1:d5452e398b76 784
Just4pLeisure 1:d5452e398b76 785 @return status flag
Just4pLeisure 1:d5452e398b76 786 */
Just4pLeisure 1:d5452e398b76 787 uint8_t memread_nop_byte(uint8_t* result, const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 788
Just4pLeisure 1:d5452e398b76 789 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 790 // write the optional address
Just4pLeisure 1:d5452e398b76 791 if (addr) {
Just4pLeisure 1:d5452e398b76 792 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 793 }
Just4pLeisure 1:d5452e398b76 794 // receive the response byte
Just4pLeisure 1:d5452e398b76 795 return (bdm_get((uint32_t*)result, BDM_BYTESIZE, BDM_NOP)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 796 }
Just4pLeisure 1:d5452e398b76 797
Just4pLeisure 1:d5452e398b76 798 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 799 /**
Just4pLeisure 1:d5452e398b76 800 Writes a byte to the MCU (follows a previously sent write or fill word cmd)
Just4pLeisure 1:d5452e398b76 801 Sends a WRITE_BYTE command so that commands overlap
Just4pLeisure 1:d5452e398b76 802
Just4pLeisure 1:d5452e398b76 803 @param addr address (optional)
Just4pLeisure 1:d5452e398b76 804 value value to write
Just4pLeisure 1:d5452e398b76 805
Just4pLeisure 1:d5452e398b76 806 @return status flag
Just4pLeisure 1:d5452e398b76 807 */
Just4pLeisure 1:d5452e398b76 808 uint8_t memwrite_write_byte(const uint32_t* addr, uint8_t value) {
Just4pLeisure 1:d5452e398b76 809
Just4pLeisure 1:d5452e398b76 810 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 811 // write the optional address
Just4pLeisure 1:d5452e398b76 812 if (addr) {
Just4pLeisure 1:d5452e398b76 813 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 814 }
Just4pLeisure 1:d5452e398b76 815 // write the value
Just4pLeisure 1:d5452e398b76 816 if (!bdm_put((uint32_t*)&value, BDM_BYTESIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 817 // wait until MCU responds
Just4pLeisure 1:d5452e398b76 818 return (bdm_ready(BDM_WRITE + BDM_BYTESIZE)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 819 }
Just4pLeisure 1:d5452e398b76 820
Just4pLeisure 1:d5452e398b76 821 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 822 /**
Just4pLeisure 1:d5452e398b76 823 Writes a byte to the MCU (follows a previously sent write or fill word cmd)
Just4pLeisure 1:d5452e398b76 824 Sends a READ_BYTE command so that commands overlap
Just4pLeisure 1:d5452e398b76 825
Just4pLeisure 1:d5452e398b76 826 @param addr address (optional)
Just4pLeisure 1:d5452e398b76 827 value value to write
Just4pLeisure 1:d5452e398b76 828
Just4pLeisure 1:d5452e398b76 829 @return status flag
Just4pLeisure 1:d5452e398b76 830 */
Just4pLeisure 1:d5452e398b76 831 uint8_t memwrite_read_byte(const uint32_t* addr, uint8_t value) {
Just4pLeisure 1:d5452e398b76 832
Just4pLeisure 1:d5452e398b76 833 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 834 // write the optional address
Just4pLeisure 1:d5452e398b76 835 if (addr) {
Just4pLeisure 1:d5452e398b76 836 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 837 }
Just4pLeisure 1:d5452e398b76 838 // write the value
Just4pLeisure 1:d5452e398b76 839 if (!bdm_put((uint32_t*)&value, BDM_BYTESIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 840 // wait until MCU responds
Just4pLeisure 1:d5452e398b76 841 return (bdm_ready(BDM_READ + BDM_BYTESIZE)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 842 }
Just4pLeisure 1:d5452e398b76 843
Just4pLeisure 1:d5452e398b76 844 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 845 /**
Just4pLeisure 1:d5452e398b76 846 Writes a byte to the MCU (follows a previously sent write or fill word cmd)
Just4pLeisure 1:d5452e398b76 847 Sends a BDM_NOP command to end a sequence of overlapping commands
Just4pLeisure 1:d5452e398b76 848
Just4pLeisure 1:d5452e398b76 849 @param addr address (optional)
Just4pLeisure 1:d5452e398b76 850 value value to write
Just4pLeisure 1:d5452e398b76 851
Just4pLeisure 1:d5452e398b76 852 @return status flag
Just4pLeisure 1:d5452e398b76 853 */
Just4pLeisure 1:d5452e398b76 854 uint8_t memwrite_nop_byte(const uint32_t* addr, uint8_t value) {
Just4pLeisure 1:d5452e398b76 855
Just4pLeisure 1:d5452e398b76 856 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 857 // write the optional address
Just4pLeisure 1:d5452e398b76 858 if (addr) {
Just4pLeisure 1:d5452e398b76 859 if(!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 860 }
Just4pLeisure 1:d5452e398b76 861 // write the value
Just4pLeisure 1:d5452e398b76 862 if (!bdm_put((uint32_t*)&value, BDM_BYTESIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 863 // wait until MCU responds
Just4pLeisure 1:d5452e398b76 864 return (bdm_ready(BDM_NOP)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 865 }
Just4pLeisure 1:d5452e398b76 866
Just4pLeisure 1:d5452e398b76 867
Just4pLeisure 1:d5452e398b76 868 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 869 /**
Just4pLeisure 1:d5452e398b76 870 Writes 2 words to the same address
Just4pLeisure 1:d5452e398b76 871 The BDM commands are overlapped to make things a bit faster
Just4pLeisure 1:d5452e398b76 872 A BDM_NOP command is then sent to end the sequence of overlapping commands
Just4pLeisure 1:d5452e398b76 873
Just4pLeisure 1:d5452e398b76 874 @param addr address
Just4pLeisure 1:d5452e398b76 875 value1, 2 values to write
Just4pLeisure 1:d5452e398b76 876
Just4pLeisure 1:d5452e398b76 877 @return status flag
Just4pLeisure 1:d5452e398b76 878 */
Just4pLeisure 1:d5452e398b76 879 uint8_t memwrite_word_write_word(const uint32_t* addr, const uint16_t value1, const uint16_t value2) {
Just4pLeisure 1:d5452e398b76 880
Just4pLeisure 1:d5452e398b76 881 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 882
Just4pLeisure 1:d5452e398b76 883 // write command code
Just4pLeisure 1:d5452e398b76 884 if (!bdm_command(BDM_WRITE + BDM_WORDSIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 885 // write the address
Just4pLeisure 1:d5452e398b76 886 if (!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 887 // write the first value
Just4pLeisure 1:d5452e398b76 888 if (!bdm_put((uint32_t*)&value1, BDM_WORDSIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 889 // wait until MCU responds and overlap the next write command
Just4pLeisure 1:d5452e398b76 890 if (!bdm_ready(BDM_WRITE + BDM_WORDSIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 891 // write the address (same address for second word)
Just4pLeisure 1:d5452e398b76 892 if (!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 893 // write the second value
Just4pLeisure 1:d5452e398b76 894 if (!bdm_put((uint32_t*)&value2, BDM_WORDSIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 895 // wait until MCU responds
Just4pLeisure 1:d5452e398b76 896 return (bdm_ready(BDM_NOP)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 897 }
Just4pLeisure 1:d5452e398b76 898
Just4pLeisure 1:d5452e398b76 899 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 900 /**
Just4pLeisure 1:d5452e398b76 901 Writes a word then reads back a result from the same address
Just4pLeisure 1:d5452e398b76 902 The BDM commands are overlapped to make things a bit faster
Just4pLeisure 1:d5452e398b76 903 A BDM_NOP command is then sent to end the sequence of overlapping commands
Just4pLeisure 1:d5452e398b76 904
Just4pLeisure 1:d5452e398b76 905 @param result read result (out)
Just4pLeisure 1:d5452e398b76 906 addr address
Just4pLeisure 1:d5452e398b76 907 value value to write
Just4pLeisure 1:d5452e398b76 908
Just4pLeisure 1:d5452e398b76 909 @return status flag
Just4pLeisure 1:d5452e398b76 910 */
Just4pLeisure 1:d5452e398b76 911
Just4pLeisure 1:d5452e398b76 912 uint8_t memwrite_word_read_word(uint16_t* result, const uint32_t* addr, const uint16_t value) {
Just4pLeisure 1:d5452e398b76 913
Just4pLeisure 1:d5452e398b76 914 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 915
Just4pLeisure 1:d5452e398b76 916 // write command code
Just4pLeisure 1:d5452e398b76 917 if (!bdm_command(BDM_WRITE + BDM_WORDSIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 918 // write the address
Just4pLeisure 1:d5452e398b76 919 if (!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 920 // write the value
Just4pLeisure 1:d5452e398b76 921 if (!bdm_put((uint32_t*)&value, BDM_WORDSIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 922 // wait until MCU responds and overlap the next read command
Just4pLeisure 1:d5452e398b76 923 if (!bdm_ready(BDM_READ + BDM_WORDSIZE)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 924 // write the address (same address for reading the result)
Just4pLeisure 1:d5452e398b76 925 if (!bdm_address(addr)) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 926 // receive the response word
Just4pLeisure 1:d5452e398b76 927 return (bdm_get((uint32_t*)result, BDM_WORDSIZE, BDM_NOP)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 928 }
Just4pLeisure 1:d5452e398b76 929
Just4pLeisure 1:d5452e398b76 930 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 931 /**
Just4pLeisure 1:d5452e398b76 932 Gets a word from the MCU (follows a previously sent read or dump word cmd)
Just4pLeisure 1:d5452e398b76 933 Sends a DUMP_WORD command so that dump commands overlap
Just4pLeisure 1:d5452e398b76 934
Just4pLeisure 1:d5452e398b76 935 @param result read result (out)
Just4pLeisure 1:d5452e398b76 936
Just4pLeisure 1:d5452e398b76 937 @return status flag
Just4pLeisure 1:d5452e398b76 938 */
Just4pLeisure 1:d5452e398b76 939 uint8_t memget_word(uint16_t* result) {
Just4pLeisure 1:d5452e398b76 940
Just4pLeisure 1:d5452e398b76 941 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 942 // receive the response word
Just4pLeisure 1:d5452e398b76 943 return (bdm_get((uint32_t*)result, BDM_WORDSIZE, BDM_DUMP + BDM_WORDSIZE)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 944 }
Just4pLeisure 1:d5452e398b76 945
Just4pLeisure 1:d5452e398b76 946 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 947 /**
Just4pLeisure 1:d5452e398b76 948 Gets a long from the MCU (follows a previously sent read or dump long cmd)
Just4pLeisure 1:d5452e398b76 949 Sends a DUMP_LONG command so that dump commands overlap
Just4pLeisure 1:d5452e398b76 950
Just4pLeisure 1:d5452e398b76 951 @param result read result (out)
Just4pLeisure 1:d5452e398b76 952
Just4pLeisure 1:d5452e398b76 953 @return status flag
Just4pLeisure 1:d5452e398b76 954 */
Just4pLeisure 1:d5452e398b76 955 uint8_t memget_long(uint32_t* result) {
Just4pLeisure 1:d5452e398b76 956
Just4pLeisure 1:d5452e398b76 957 if (!IN_BDM) return TERM_ERR;
Just4pLeisure 1:d5452e398b76 958 // receive the response words
Just4pLeisure 1:d5452e398b76 959 return (bdm_get(result, BDM_LONGSIZE, BDM_DUMP + BDM_LONGSIZE)) ? TERM_OK : TERM_ERR;
Just4pLeisure 1:d5452e398b76 960 }
Just4pLeisure 1:d5452e398b76 961
Just4pLeisure 1:d5452e398b76 962 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 963 /**
Just4pLeisure 1:d5452e398b76 964 Reads value from system register.
Just4pLeisure 1:d5452e398b76 965
Just4pLeisure 1:d5452e398b76 966 @param result register value (out)
Just4pLeisure 1:d5452e398b76 967 @param reg register
Just4pLeisure 1:d5452e398b76 968
Just4pLeisure 1:d5452e398b76 969 @return status flag
Just4pLeisure 1:d5452e398b76 970 */
Just4pLeisure 1:d5452e398b76 971 uint8_t sysreg_read(uint32_t* result, uint8_t reg) {
Just4pLeisure 1:d5452e398b76 972 // check state
Just4pLeisure 1:d5452e398b76 973 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 974 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 975 }
Just4pLeisure 1:d5452e398b76 976
Just4pLeisure 1:d5452e398b76 977 // read register
Just4pLeisure 1:d5452e398b76 978 if (!bdm_read(result, BDM_RSREG + reg, NULL)) {
Just4pLeisure 1:d5452e398b76 979 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 980 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 981 }
Just4pLeisure 1:d5452e398b76 982
Just4pLeisure 1:d5452e398b76 983 return TERM_OK;
Just4pLeisure 1:d5452e398b76 984 }
Just4pLeisure 1:d5452e398b76 985
Just4pLeisure 1:d5452e398b76 986 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 987 /**
Just4pLeisure 1:d5452e398b76 988 Writes value to system register.
Just4pLeisure 1:d5452e398b76 989
Just4pLeisure 1:d5452e398b76 990 @param reg register
Just4pLeisure 1:d5452e398b76 991 @param value register value
Just4pLeisure 1:d5452e398b76 992
Just4pLeisure 1:d5452e398b76 993 @return status flag
Just4pLeisure 1:d5452e398b76 994 */
Just4pLeisure 1:d5452e398b76 995 uint8_t sysreg_write(uint8_t reg, const uint32_t* value) {
Just4pLeisure 1:d5452e398b76 996 // check state
Just4pLeisure 1:d5452e398b76 997 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 998 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 999 }
Just4pLeisure 1:d5452e398b76 1000
Just4pLeisure 1:d5452e398b76 1001 // write register
Just4pLeisure 1:d5452e398b76 1002 if (!bdm_write(NULL, BDM_WSREG + reg, value)) {
Just4pLeisure 1:d5452e398b76 1003 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 1004 bdm_clear();
Just4pLeisure 1:d5452e398b76 1005 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1006 }
Just4pLeisure 1:d5452e398b76 1007
Just4pLeisure 1:d5452e398b76 1008 return TERM_OK;
Just4pLeisure 1:d5452e398b76 1009 }
Just4pLeisure 1:d5452e398b76 1010
Just4pLeisure 1:d5452e398b76 1011 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1012 /**
Just4pLeisure 1:d5452e398b76 1013 Reads value from A/D register.
Just4pLeisure 1:d5452e398b76 1014
Just4pLeisure 1:d5452e398b76 1015 @param result register value (out)
Just4pLeisure 1:d5452e398b76 1016 @param reg register
Just4pLeisure 1:d5452e398b76 1017
Just4pLeisure 1:d5452e398b76 1018 @return status flag
Just4pLeisure 1:d5452e398b76 1019 */
Just4pLeisure 1:d5452e398b76 1020 uint8_t adreg_read(uint32_t* result, uint8_t reg) {
Just4pLeisure 1:d5452e398b76 1021 // check state
Just4pLeisure 1:d5452e398b76 1022 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 1023 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1024 }
Just4pLeisure 1:d5452e398b76 1025
Just4pLeisure 1:d5452e398b76 1026 // read register
Just4pLeisure 1:d5452e398b76 1027 if (!bdm_read(result, BDM_RDREG + reg, NULL)) {
Just4pLeisure 1:d5452e398b76 1028 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 1029 bdm_clear();
Just4pLeisure 1:d5452e398b76 1030 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1031 }
Just4pLeisure 1:d5452e398b76 1032
Just4pLeisure 1:d5452e398b76 1033 return TERM_OK;
Just4pLeisure 1:d5452e398b76 1034 }
Just4pLeisure 1:d5452e398b76 1035
Just4pLeisure 1:d5452e398b76 1036 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1037 /**
Just4pLeisure 1:d5452e398b76 1038 Writes value to A/D register.
Just4pLeisure 1:d5452e398b76 1039
Just4pLeisure 1:d5452e398b76 1040 @param reg register
Just4pLeisure 1:d5452e398b76 1041 @param value register value
Just4pLeisure 1:d5452e398b76 1042
Just4pLeisure 1:d5452e398b76 1043 @return status flag
Just4pLeisure 1:d5452e398b76 1044 */
Just4pLeisure 1:d5452e398b76 1045 uint8_t adreg_write(uint8_t reg, const uint32_t* value) {
Just4pLeisure 1:d5452e398b76 1046 // check state
Just4pLeisure 1:d5452e398b76 1047 if (!IN_BDM) {
Just4pLeisure 1:d5452e398b76 1048 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1049 }
Just4pLeisure 1:d5452e398b76 1050
Just4pLeisure 1:d5452e398b76 1051 // write register
Just4pLeisure 1:d5452e398b76 1052 if (!bdm_write(NULL, BDM_WRREG + reg, value)) {
Just4pLeisure 1:d5452e398b76 1053 // clear the interface and fail
Just4pLeisure 1:d5452e398b76 1054 bdm_clear();
Just4pLeisure 1:d5452e398b76 1055 return TERM_ERR;
Just4pLeisure 1:d5452e398b76 1056 }
Just4pLeisure 1:d5452e398b76 1057
Just4pLeisure 1:d5452e398b76 1058 return TERM_OK;
Just4pLeisure 1:d5452e398b76 1059 }
Just4pLeisure 1:d5452e398b76 1060
Just4pLeisure 1:d5452e398b76 1061 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1062 /**
Just4pLeisure 1:d5452e398b76 1063 Issues a read command to MCU.
Just4pLeisure 1:d5452e398b76 1064
Just4pLeisure 1:d5452e398b76 1065 @param result read result (out)
Just4pLeisure 1:d5452e398b76 1066 @param cmd command sequence
Just4pLeisure 1:d5452e398b76 1067 @param addr address (optional)
Just4pLeisure 1:d5452e398b76 1068
Just4pLeisure 1:d5452e398b76 1069 @return succ / fail
Just4pLeisure 1:d5452e398b76 1070 */
Just4pLeisure 1:d5452e398b76 1071 bool bdm_read(uint32_t* result, uint16_t cmd, const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 1072 *result = 0;
Just4pLeisure 1:d5452e398b76 1073
Just4pLeisure 1:d5452e398b76 1074 // write command code
Just4pLeisure 1:d5452e398b76 1075 bdm_clk(cmd, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1076 if (bdm_response > BDM_CMDCMPLTE) {
Just4pLeisure 1:d5452e398b76 1077 return false;
Just4pLeisure 1:d5452e398b76 1078 }
Just4pLeisure 1:d5452e398b76 1079
Just4pLeisure 1:d5452e398b76 1080 // write the optional address
Just4pLeisure 1:d5452e398b76 1081 if (addr) {
Just4pLeisure 1:d5452e398b76 1082 // first word
Just4pLeisure 1:d5452e398b76 1083 bdm_clk((uint16_t)(*addr >> 16), CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1084 if (bdm_response > BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1085 return false;
Just4pLeisure 1:d5452e398b76 1086 }
Just4pLeisure 1:d5452e398b76 1087 // second word
Just4pLeisure 1:d5452e398b76 1088 bdm_clk((uint16_t)(*addr), CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1089 if (bdm_response > BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1090 return false;
Just4pLeisure 1:d5452e398b76 1091 }
Just4pLeisure 1:d5452e398b76 1092 }
Just4pLeisure 1:d5452e398b76 1093
Just4pLeisure 1:d5452e398b76 1094 // receive response words
Just4pLeisure 1:d5452e398b76 1095 uint8_t wait_cnt;
Just4pLeisure 1:d5452e398b76 1096 for (uint8_t curr_word = 0; curr_word < ((cmd & BDM_LONGSIZE) ? 2 : 1);
Just4pLeisure 1:d5452e398b76 1097 ++curr_word) {
Just4pLeisure 1:d5452e398b76 1098 // wait while MCU prepares the response
Just4pLeisure 1:d5452e398b76 1099 wait_cnt = ERR_COUNT;
Just4pLeisure 1:d5452e398b76 1100 do {
Just4pLeisure 1:d5452e398b76 1101 bdm_clk(BDM_NOP, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1102 } while (bdm_response == BDM_NOTREADY && --wait_cnt > 0);
Just4pLeisure 1:d5452e398b76 1103
Just4pLeisure 1:d5452e398b76 1104 // save the result
Just4pLeisure 1:d5452e398b76 1105 if (bdm_response < BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1106 (*result) <<= 16;
Just4pLeisure 1:d5452e398b76 1107 (*result) |= bdm_response;
Just4pLeisure 1:d5452e398b76 1108 } else {
Just4pLeisure 1:d5452e398b76 1109 // result was not received
Just4pLeisure 1:d5452e398b76 1110 return false;
Just4pLeisure 1:d5452e398b76 1111 }
Just4pLeisure 1:d5452e398b76 1112 }
Just4pLeisure 1:d5452e398b76 1113
Just4pLeisure 1:d5452e398b76 1114 return true;
Just4pLeisure 1:d5452e398b76 1115 }
Just4pLeisure 1:d5452e398b76 1116
Just4pLeisure 1:d5452e398b76 1117 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1118 /**
Just4pLeisure 1:d5452e398b76 1119 Issues a write command to MCU.
Just4pLeisure 1:d5452e398b76 1120
Just4pLeisure 1:d5452e398b76 1121 @param num_words number of additional command words
Just4pLeisure 1:d5452e398b76 1122 @param cmd command sequence
Just4pLeisure 1:d5452e398b76 1123
Just4pLeisure 1:d5452e398b76 1124 @return succ / fail
Just4pLeisure 1:d5452e398b76 1125 */
Just4pLeisure 1:d5452e398b76 1126 bool bdm_write(const uint32_t* addr, uint16_t cmd, const uint32_t* value) {
Just4pLeisure 1:d5452e398b76 1127 // write command code
Just4pLeisure 1:d5452e398b76 1128 bdm_clk(cmd, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1129 if (bdm_response > BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1130 return false;
Just4pLeisure 1:d5452e398b76 1131 }
Just4pLeisure 1:d5452e398b76 1132
Just4pLeisure 1:d5452e398b76 1133 // write the optional address
Just4pLeisure 1:d5452e398b76 1134 if (addr) {
Just4pLeisure 1:d5452e398b76 1135 // first word
Just4pLeisure 1:d5452e398b76 1136 bdm_clk((uint16_t)((*addr) >> 16), CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1137 if (bdm_response > BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1138 return false;
Just4pLeisure 1:d5452e398b76 1139 }
Just4pLeisure 1:d5452e398b76 1140 // second word
Just4pLeisure 1:d5452e398b76 1141 bdm_clk((uint16_t)(*addr), CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1142 if (bdm_response > BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1143 return false;
Just4pLeisure 1:d5452e398b76 1144 }
Just4pLeisure 1:d5452e398b76 1145 }
Just4pLeisure 1:d5452e398b76 1146
Just4pLeisure 1:d5452e398b76 1147 // write the value
Just4pLeisure 1:d5452e398b76 1148 if (cmd & BDM_LONGSIZE) {
Just4pLeisure 1:d5452e398b76 1149 bdm_clk((uint16_t)((*value) >> 16), CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1150 if (bdm_response > BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1151 return false;
Just4pLeisure 1:d5452e398b76 1152 }
Just4pLeisure 1:d5452e398b76 1153 }
Just4pLeisure 1:d5452e398b76 1154 bdm_clk((uint16_t)(*value), CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1155 if (bdm_response > BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1156 return false;
Just4pLeisure 1:d5452e398b76 1157 }
Just4pLeisure 1:d5452e398b76 1158
Just4pLeisure 1:d5452e398b76 1159 // wait until MCU responds
Just4pLeisure 1:d5452e398b76 1160 uint8_t wait_cnt = ERR_COUNT;
Just4pLeisure 1:d5452e398b76 1161 do {
Just4pLeisure 1:d5452e398b76 1162 // read response
Just4pLeisure 1:d5452e398b76 1163 bdm_clk(BDM_NOP, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1164 } while (bdm_response == BDM_NOTREADY && --wait_cnt > 0);
Just4pLeisure 1:d5452e398b76 1165
Just4pLeisure 1:d5452e398b76 1166 // check if command succeeded
Just4pLeisure 1:d5452e398b76 1167 return (bdm_response == BDM_CMDCMPLTE);
Just4pLeisure 1:d5452e398b76 1168 }
Just4pLeisure 1:d5452e398b76 1169
Just4pLeisure 1:d5452e398b76 1170 bool bdm_command (uint16_t cmd) {
Just4pLeisure 1:d5452e398b76 1171 // write command code
Just4pLeisure 1:d5452e398b76 1172 bdm_clk(cmd, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1173 return (bdm_response > BDM_NOTREADY) ? false : true;
Just4pLeisure 1:d5452e398b76 1174 }
Just4pLeisure 1:d5452e398b76 1175
Just4pLeisure 1:d5452e398b76 1176 bool bdm_address (const uint32_t* addr) {
Just4pLeisure 1:d5452e398b76 1177 // write an address
Just4pLeisure 1:d5452e398b76 1178 // first word
Just4pLeisure 1:d5452e398b76 1179 bdm_clk((uint16_t)((*addr) >> 16), CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1180 if (bdm_response > BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1181 return false;
Just4pLeisure 1:d5452e398b76 1182 }
Just4pLeisure 1:d5452e398b76 1183 // second word
Just4pLeisure 1:d5452e398b76 1184 bdm_clk((uint16_t)(*addr), CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1185 return (bdm_response > BDM_NOTREADY) ? false : true;
Just4pLeisure 1:d5452e398b76 1186 }
Just4pLeisure 1:d5452e398b76 1187
Just4pLeisure 1:d5452e398b76 1188 bool bdm_get (uint32_t* result, uint8_t size, uint16_t next_cmd) {
Just4pLeisure 1:d5452e398b76 1189 // receive response words
Just4pLeisure 1:d5452e398b76 1190 *result = 0;
Just4pLeisure 1:d5452e398b76 1191 uint8_t wait_cnt;
Just4pLeisure 1:d5452e398b76 1192 for (uint8_t curr_word = 0; curr_word < ((size & BDM_LONGSIZE) ? 2 : 1);
Just4pLeisure 1:d5452e398b76 1193 ++curr_word) {
Just4pLeisure 1:d5452e398b76 1194 // wait while MCU prepares the response
Just4pLeisure 1:d5452e398b76 1195 wait_cnt = ERR_COUNT;
Just4pLeisure 1:d5452e398b76 1196 do {
Just4pLeisure 1:d5452e398b76 1197 bdm_clk(next_cmd, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1198 } while (bdm_response == BDM_NOTREADY && --wait_cnt > 0);
Just4pLeisure 1:d5452e398b76 1199
Just4pLeisure 1:d5452e398b76 1200 // save the result
Just4pLeisure 1:d5452e398b76 1201 if (bdm_response < BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1202 (*result) <<= 16;
Just4pLeisure 1:d5452e398b76 1203 (*result) |= bdm_response;
Just4pLeisure 1:d5452e398b76 1204 } else {
Just4pLeisure 1:d5452e398b76 1205 // result was not received
Just4pLeisure 1:d5452e398b76 1206 return false;
Just4pLeisure 1:d5452e398b76 1207 }
Just4pLeisure 1:d5452e398b76 1208 }
Just4pLeisure 1:d5452e398b76 1209 return true;
Just4pLeisure 1:d5452e398b76 1210 }
Just4pLeisure 1:d5452e398b76 1211
Just4pLeisure 1:d5452e398b76 1212 bool bdm_put (const uint32_t* value, uint8_t size) {
Just4pLeisure 1:d5452e398b76 1213 // write the value
Just4pLeisure 1:d5452e398b76 1214 if (size & BDM_LONGSIZE) {
Just4pLeisure 1:d5452e398b76 1215 bdm_clk((uint16_t)((*value) >> 16), CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1216 if (bdm_response > BDM_NOTREADY) {
Just4pLeisure 1:d5452e398b76 1217 return false;
Just4pLeisure 1:d5452e398b76 1218 }
Just4pLeisure 1:d5452e398b76 1219 }
Just4pLeisure 1:d5452e398b76 1220 bdm_clk((uint16_t)(*value), CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1221 return (bdm_response > BDM_NOTREADY) ? false : true;
Just4pLeisure 1:d5452e398b76 1222 }
Just4pLeisure 1:d5452e398b76 1223
Just4pLeisure 1:d5452e398b76 1224 bool bdm_ready (uint16_t next_cmd) {
Just4pLeisure 1:d5452e398b76 1225 // wait until MCU responds
Just4pLeisure 1:d5452e398b76 1226 uint8_t wait_cnt = ERR_COUNT;
Just4pLeisure 1:d5452e398b76 1227 do {
Just4pLeisure 1:d5452e398b76 1228 // read response
Just4pLeisure 1:d5452e398b76 1229 bdm_clk(next_cmd, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1230 } while (bdm_response == BDM_NOTREADY && --wait_cnt > 0);
Just4pLeisure 1:d5452e398b76 1231
Just4pLeisure 1:d5452e398b76 1232 // check if command succeeded
Just4pLeisure 1:d5452e398b76 1233 return (bdm_response == BDM_CMDCMPLTE);
Just4pLeisure 1:d5452e398b76 1234 }
Just4pLeisure 1:d5452e398b76 1235
Just4pLeisure 1:d5452e398b76 1236 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1237 /**
Just4pLeisure 1:d5452e398b76 1238 Writes a word to target MCU via BDM line and gets the response.
Just4pLeisure 1:d5452e398b76 1239
Just4pLeisure 1:d5452e398b76 1240 @param value value to write
Just4pLeisure 1:d5452e398b76 1241 @param num_bits value size, bits
Just4pLeisure 1:d5452e398b76 1242 */
Just4pLeisure 1:d5452e398b76 1243 void bdm_clk(uint16_t value, uint8_t num_bits) {
Just4pLeisure 1:d5452e398b76 1244 // PIN_BKPT.output();
Just4pLeisure 1:d5452e398b76 1245 // PIN_DSI.output();
Just4pLeisure 1:d5452e398b76 1246 LPC_GPIO2->FIODIR |= 0x00000004;
Just4pLeisure 1:d5452e398b76 1247 // clock the value via BDM
Just4pLeisure 1:d5452e398b76 1248 bdm_response = ((uint32_t)value) << (32 - num_bits);
Just4pLeisure 1:d5452e398b76 1249 // bool dsi;
Just4pLeisure 1:d5452e398b76 1250
Just4pLeisure 1:d5452e398b76 1251 while (num_bits--) {
Just4pLeisure 1:d5452e398b76 1252
Just4pLeisure 1:d5452e398b76 1253 // falling edge on BKPT/DSCLK
Just4pLeisure 1:d5452e398b76 1254 PIN_BKPT.write(0);
Just4pLeisure 1:d5452e398b76 1255
Just4pLeisure 1:d5452e398b76 1256 // set DSI bit
Just4pLeisure 1:d5452e398b76 1257 PIN_DSI.write(bdm_response & 0x80000000);
Just4pLeisure 1:d5452e398b76 1258 bdm_response <<= 1;
Just4pLeisure 1:d5452e398b76 1259
Just4pLeisure 1:d5452e398b76 1260 // read DSO bit
Just4pLeisure 1:d5452e398b76 1261 bdm_response |= PIN_DSO.read();
Just4pLeisure 1:d5452e398b76 1262
Just4pLeisure 1:d5452e398b76 1263 // short delay
Just4pLeisure 1:d5452e398b76 1264 // for (uint8_t c = 1; c; c--);
Just4pLeisure 1:d5452e398b76 1265 // wait_us(1);
Just4pLeisure 1:d5452e398b76 1266
Just4pLeisure 1:d5452e398b76 1267 // rising edge on BKPT/DSCLK
Just4pLeisure 1:d5452e398b76 1268 PIN_BKPT.write(1);
Just4pLeisure 1:d5452e398b76 1269
Just4pLeisure 1:d5452e398b76 1270 // short delay
Just4pLeisure 1:d5452e398b76 1271 for (uint8_t c = 1; c; c--);
Just4pLeisure 1:d5452e398b76 1272 // wait_us(1);
Just4pLeisure 1:d5452e398b76 1273 }
Just4pLeisure 1:d5452e398b76 1274
Just4pLeisure 1:d5452e398b76 1275 PIN_DSI.input();
Just4pLeisure 1:d5452e398b76 1276 // LPC_GPIO2->FIODIR &= 0xfffffffb;
Just4pLeisure 1:d5452e398b76 1277 }
Just4pLeisure 1:d5452e398b76 1278
Just4pLeisure 1:d5452e398b76 1279 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1280 /**
Just4pLeisure 1:d5452e398b76 1281 Clears the BDM interface after errors.
Just4pLeisure 1:d5452e398b76 1282 */
Just4pLeisure 1:d5452e398b76 1283 void bdm_clear() {
Just4pLeisure 1:d5452e398b76 1284 bdm_clk (BDM_NOP, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1285 bdm_clk (BDM_NOP, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1286 bdm_clk (BDM_NOP, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1287 bdm_clk (BDM_NOP, CMD_BIT_COUNT);
Just4pLeisure 1:d5452e398b76 1288
Just4pLeisure 1:d5452e398b76 1289 while (bdm_response > 0) {
Just4pLeisure 1:d5452e398b76 1290 bdm_clk(0, 1);
Just4pLeisure 1:d5452e398b76 1291 }
Just4pLeisure 1:d5452e398b76 1292 while (bdm_response < 1) {
Just4pLeisure 1:d5452e398b76 1293 bdm_clk(0, 1);
Just4pLeisure 1:d5452e398b76 1294 }
Just4pLeisure 1:d5452e398b76 1295 bdm_clk(0, 15);
Just4pLeisure 1:d5452e398b76 1296 }
Just4pLeisure 1:d5452e398b76 1297
Just4pLeisure 1:d5452e398b76 1298 //-----------------------------------------------------------------------------
Just4pLeisure 1:d5452e398b76 1299 // EOF
Just4pLeisure 1:d5452e398b76 1300 //-----------------------------------------------------------------------------