Basis for the C2 protocol from Silicon Labs.

Dependencies:   mbed

Committer:
Ivop
Date:
Wed Jun 11 14:56:58 2014 +0000
Revision:
17:0c5581ae2471
Parent:
16:844edb89d863
reading (locked) pages so far...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ivop 1:7a82f806fe92 1 /*
Ivop 1:7a82f806fe92 2 * SiLabs C2 Protocol on mbed pins p5/p6
Ivop 1:7a82f806fe92 3 *
Ivop 1:7a82f806fe92 4 * Copyright (c) 2014, Ivo van Poorten <ivopvp@gmail.com>
Ivop 1:7a82f806fe92 5 * All rights reserved.
Ivop 1:7a82f806fe92 6 *
Ivop 1:7a82f806fe92 7 * Redistribution and use in source and binary forms, with or without
Ivop 1:7a82f806fe92 8 * modification, are permitted provided that the following conditions
Ivop 1:7a82f806fe92 9 * are met:
Ivop 1:7a82f806fe92 10 * 1. Redistributions of source code must retain the above copyright
Ivop 1:7a82f806fe92 11 * notice, this list of conditions and the following disclaimer.
Ivop 1:7a82f806fe92 12 * 2. Redistributions in binary form must reproduce the above copyright
Ivop 1:7a82f806fe92 13 * notice, this list of conditions and the following disclaimer in the
Ivop 1:7a82f806fe92 14 * documentation and/or other materials provided with the distribution.
Ivop 1:7a82f806fe92 15 *
Ivop 1:7a82f806fe92 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
Ivop 1:7a82f806fe92 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Ivop 1:7a82f806fe92 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Ivop 1:7a82f806fe92 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
Ivop 1:7a82f806fe92 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Ivop 1:7a82f806fe92 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Ivop 1:7a82f806fe92 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Ivop 1:7a82f806fe92 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Ivop 1:7a82f806fe92 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Ivop 1:7a82f806fe92 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Ivop 1:7a82f806fe92 26 */
Ivop 1:7a82f806fe92 27
Ivop 0:902f10e5d3e0 28 #include "mbed.h"
Ivop 7:65a72aad87b8 29 #include <stdarg.h>
Ivop 14:c24f608a8adb 30 #include <stdio.h>
Ivop 14:c24f608a8adb 31 #include <stdint.h>
Ivop 0:902f10e5d3e0 32
Ivop 0:902f10e5d3e0 33 DigitalOut c2ck(p5);
Ivop 0:902f10e5d3e0 34 DigitalInOut c2d(p6);
Ivop 0:902f10e5d3e0 35
Ivop 14:c24f608a8adb 36 static uint8_t buffer[256];
Ivop 14:c24f608a8adb 37
Ivop 4:a9e3ee5741be 38 static struct devices {
Ivop 4:a9e3ee5741be 39 char *name;
Ivop 4:a9e3ee5741be 40 int devid;
Ivop 4:a9e3ee5741be 41 } devices[] = {
Ivop 8:af5d402396fb 42 { "F30x", 0x04 }, { "F31x", 0x08 },
Ivop 8:af5d402396fb 43 { "F32x", 0x09 }, { "F326/7", 0x0d },
Ivop 8:af5d402396fb 44 { "F33x", 0x0a }, { "F336/7", 0x14 },
Ivop 8:af5d402396fb 45 { "F34x", 0x0f }, { "F35x", 0x0b },
Ivop 8:af5d402396fb 46 { "F36x", 0x12 }, { "F38x", 0x28 },
Ivop 8:af5d402396fb 47 { "F39x/F37x", 0x2b }, { "F41x", 0x0c },
Ivop 8:af5d402396fb 48 { "F50x/F51x", 0x1c }, { "F52xA/F53xA", 0x11 },
Ivop 8:af5d402396fb 49 { "F54x", 0x21 }, { "F55x/F56x/F57x", 0x22 },
Ivop 8:af5d402396fb 50 { "F58x/F59x", 0x20 }, { "F70x/F71x", 0x1e },
Ivop 8:af5d402396fb 51 { "F80x/F81x/F82x/F83x", 0x23 }, { "F90x/F91x", 0x1f },
Ivop 8:af5d402396fb 52 { "F92x/F93x", 0x16 }, { "F96x", 0x2a },
Ivop 8:af5d402396fb 53 { "F99x", 0x25 }, { "T60x", 0x10 },
Ivop 8:af5d402396fb 54 { "T606", 0x1b }, { "T61x", 0x13 },
Ivop 8:af5d402396fb 55 { "T62x/T32x", 0x18 }, { "T622/T623/T326/T327", 0x19 },
Ivop 8:af5d402396fb 56 { "T63x", 0x17 }, { NULL, 0 }
Ivop 4:a9e3ee5741be 57 };
Ivop 4:a9e3ee5741be 58
Ivop 6:deb670cb8105 59 #define C2_MASK_FLBUSY 0x80
Ivop 6:deb670cb8105 60 #define C2_MASK_INBUSY 0x02
Ivop 6:deb670cb8105 61 #define C2_MASK_OUTREADY 0x01
Ivop 6:deb670cb8105 62
Ivop 17:0c5581ae2471 63 // Programming Interface (PI) Commands
Ivop 9:6a689843a88e 64
Ivop 8:af5d402396fb 65 #define C2_PI_CMD_GET_VERSION 0x01
Ivop 8:af5d402396fb 66 #define C2_PI_CMD_GET_DERIVATIVE 0x02
Ivop 8:af5d402396fb 67
Ivop 8:af5d402396fb 68 #define C2_PI_CMD_DEVICE_ERASE 0x03
Ivop 8:af5d402396fb 69
Ivop 8:af5d402396fb 70 #define C2_PI_CMD_BLOCK_READ 0x06 // FLASH (max. 64K bytes, bankswapping not supported)
Ivop 8:af5d402396fb 71 #define C2_PI_CMD_BLOCK_WRITE 0x07 // FLASH
Ivop 8:af5d402396fb 72
Ivop 8:af5d402396fb 73 #define C2_PI_CMD_PAGE_ERASE 0x08
Ivop 8:af5d402396fb 74
Ivop 8:af5d402396fb 75 #define C2_PI_CMD_DIRECT_READ 0x09 // SFR (Special FUnction Registers, 256 bytes(?))
Ivop 8:af5d402396fb 76 #define C2_PI_CMD_DIRECT_WRITE 0x0a // SFR
Ivop 8:af5d402396fb 77
Ivop 8:af5d402396fb 78 #define C2_PI_CMD_INDIRECT_READ 0x0b // RAM (Internal, 256 bytes)
Ivop 8:af5d402396fb 79 #define C2_PI_CMD_INDIRECT_WRITE 0x0c // RAM
Ivop 8:af5d402396fb 80
Ivop 8:af5d402396fb 81 #define C2_PI_CMD_XRAM_READ 0x0e // RAM (External, 2K or 4K bytes)
Ivop 8:af5d402396fb 82 #define C2_PI_CMD_XRAM_WRITE 0x0f // RAM
Ivop 8:af5d402396fb 83
Ivop 9:6a689843a88e 84 // PI Status Values
Ivop 9:6a689843a88e 85 #define C2_PI_STATUS_COMMAND_INVALID 0x00
Ivop 9:6a689843a88e 86 #define C2_PI_STATUS_NO_CONNECT 0x01
Ivop 9:6a689843a88e 87 #define C2_PI_STATUS_FAILED 0x02
Ivop 17:0c5581ae2471 88 #define C2_PI_STATUS_PAGE_LOCKED 0x03 // "security" feature
Ivop 9:6a689843a88e 89 #define C2_PI_STATUS_TIMEOUT 0x04
Ivop 9:6a689843a88e 90 #define C2_PI_STATUS_BAD_DATA 0x05
Ivop 9:6a689843a88e 91 #define C2_PI_STATUS_OK 0x0d
Ivop 9:6a689843a88e 92
Ivop 9:6a689843a88e 93 // C2 Registers
Ivop 13:45aaa8847c2b 94 #define C2_REG_DEVID 0
Ivop 13:45aaa8847c2b 95 #define C2_REG_REVID 1
Ivop 13:45aaa8847c2b 96 #define C2_REG_FPCTL 2
Ivop 13:45aaa8847c2b 97 static int C2_REG_FPDAT = 0xb4; // or 0xad
Ivop 17:0c5581ae2471 98 static int page_size = 512;
Ivop 4:a9e3ee5741be 99
Ivop 7:65a72aad87b8 100 static void fatal(char *f, ...) {
Ivop 7:65a72aad87b8 101 va_list ap;
Ivop 7:65a72aad87b8 102 va_start(ap,f);
Ivop 14:c24f608a8adb 103 printf("\r\nFATAL: ");
Ivop 7:65a72aad87b8 104 vprintf(f, ap);
Ivop 7:65a72aad87b8 105 va_end(ap);
Ivop 7:65a72aad87b8 106 exit(1);
Ivop 7:65a72aad87b8 107 }
Ivop 7:65a72aad87b8 108
Ivop 1:7a82f806fe92 109 static void c2ck_reset(void) {
Ivop 17:0c5581ae2471 110 c2d.input();
Ivop 1:7a82f806fe92 111 c2ck = 0;
Ivop 1:7a82f806fe92 112 wait_us(25);
Ivop 1:7a82f806fe92 113 c2ck = 1;
Ivop 16:844edb89d863 114 wait_us(3);
Ivop 1:7a82f806fe92 115 }
Ivop 1:7a82f806fe92 116
Ivop 1:7a82f806fe92 117 static void c2ck_strobe(void) {
Ivop 1:7a82f806fe92 118 c2ck = 0;
Ivop 1:7a82f806fe92 119 wait_us(1);
Ivop 1:7a82f806fe92 120 c2ck = 1;
Ivop 1:7a82f806fe92 121 wait_us(1);
Ivop 1:7a82f806fe92 122 }
Ivop 1:7a82f806fe92 123
Ivop 2:9092d0d1558b 124 // Remember, ALL fields are sent LSB first(!)
Ivop 1:7a82f806fe92 125
Ivop 2:9092d0d1558b 126 #define START do{ c2ck_strobe(); }while(0)
Ivop 2:9092d0d1558b 127 #define STOP START
Ivop 2:9092d0d1558b 128 #define INS(a,b) do{ c2d = a; c2ck_strobe(); c2d = b; c2ck_strobe(); }while(0)
Ivop 2:9092d0d1558b 129 #define LENGTH(a,b) INS(a,b)
Ivop 17:0c5581ae2471 130 #define WAIT c2ck_strobe(); do{\
Ivop 17:0c5581ae2471 131 while(!c2d && t--) { \
Ivop 2:9092d0d1558b 132 c2ck_strobe(); \
Ivop 2:9092d0d1558b 133 wait_us(1); \
Ivop 2:9092d0d1558b 134 } if (!t) return -1; \
Ivop 2:9092d0d1558b 135 } while(0)
Ivop 4:a9e3ee5741be 136 #define READV do{\
Ivop 4:a9e3ee5741be 137 for (i=0; i<8; i++) { \
Ivop 4:a9e3ee5741be 138 v >>= 1; \
Ivop 4:a9e3ee5741be 139 c2ck_strobe(); \
Ivop 4:a9e3ee5741be 140 if (c2d) v |= 0x80; \
Ivop 4:a9e3ee5741be 141 } } while(0)
Ivop 4:a9e3ee5741be 142 #define WRITEV do{\
Ivop 11:2b19d52ea37c 143 for (i=0; i<8; i++) { \
Ivop 4:a9e3ee5741be 144 c2d = v & 1; \
Ivop 4:a9e3ee5741be 145 c2ck_strobe(); \
Ivop 4:a9e3ee5741be 146 v >>= 1; \
Ivop 4:a9e3ee5741be 147 } } while(0)
Ivop 2:9092d0d1558b 148
Ivop 2:9092d0d1558b 149 static int c2_read_dr(void) {
Ivop 4:a9e3ee5741be 150 int t = 20, i, v = 0;
Ivop 2:9092d0d1558b 151
Ivop 2:9092d0d1558b 152 START;
Ivop 2:9092d0d1558b 153 c2d.output();
Ivop 2:9092d0d1558b 154 INS(0,0);
Ivop 2:9092d0d1558b 155 LENGTH(0,0);
Ivop 2:9092d0d1558b 156 c2d.input();
Ivop 2:9092d0d1558b 157 WAIT;
Ivop 4:a9e3ee5741be 158 READV;
Ivop 2:9092d0d1558b 159 STOP;
Ivop 2:9092d0d1558b 160
Ivop 4:a9e3ee5741be 161 return v;
Ivop 2:9092d0d1558b 162 }
Ivop 2:9092d0d1558b 163
Ivop 4:a9e3ee5741be 164 static int c2_write_dr(int v) {
Ivop 2:9092d0d1558b 165 int t = 20, i;
Ivop 2:9092d0d1558b 166
Ivop 2:9092d0d1558b 167 START;
Ivop 2:9092d0d1558b 168 c2d.output();
Ivop 2:9092d0d1558b 169 INS(1,0);
Ivop 2:9092d0d1558b 170 LENGTH(0,0);
Ivop 4:a9e3ee5741be 171 WRITEV;
Ivop 2:9092d0d1558b 172 c2d.input();
Ivop 2:9092d0d1558b 173 WAIT;
Ivop 2:9092d0d1558b 174 STOP;
Ivop 2:9092d0d1558b 175
Ivop 2:9092d0d1558b 176 return 0;
Ivop 2:9092d0d1558b 177 }
Ivop 2:9092d0d1558b 178
Ivop 2:9092d0d1558b 179 static int c2_read_ar(void) {
Ivop 4:a9e3ee5741be 180 int i, v = 0;
Ivop 2:9092d0d1558b 181
Ivop 2:9092d0d1558b 182 START;
Ivop 2:9092d0d1558b 183 c2d.output();
Ivop 2:9092d0d1558b 184 INS(0,1);
Ivop 2:9092d0d1558b 185 c2d.input();
Ivop 4:a9e3ee5741be 186 READV;
Ivop 4:a9e3ee5741be 187 STOP;
Ivop 2:9092d0d1558b 188
Ivop 4:a9e3ee5741be 189 return v;
Ivop 2:9092d0d1558b 190 }
Ivop 2:9092d0d1558b 191
Ivop 4:a9e3ee5741be 192 static void c2_write_ar(int v) {
Ivop 2:9092d0d1558b 193 int i;
Ivop 2:9092d0d1558b 194
Ivop 2:9092d0d1558b 195 START;
Ivop 2:9092d0d1558b 196 c2d.output();
Ivop 2:9092d0d1558b 197 INS(1,1);
Ivop 4:a9e3ee5741be 198 WRITEV;
Ivop 2:9092d0d1558b 199 c2d.input();
Ivop 2:9092d0d1558b 200 STOP;
Ivop 2:9092d0d1558b 201 }
Ivop 1:7a82f806fe92 202
Ivop 6:deb670cb8105 203 static int poll_status(int mask) {
Ivop 16:844edb89d863 204 int t = 20, s;
Ivop 6:deb670cb8105 205 do {
Ivop 16:844edb89d863 206 s = c2_read_ar();
Ivop 16:844edb89d863 207 if (mask == C2_MASK_INBUSY) {
Ivop 16:844edb89d863 208 if (!(s & mask)) return 0;
Ivop 16:844edb89d863 209 } else {
Ivop 16:844edb89d863 210 if (s & mask) return 0;
Ivop 16:844edb89d863 211 }
Ivop 6:deb670cb8105 212 wait_us(1);
Ivop 6:deb670cb8105 213 } while(--t);
Ivop 6:deb670cb8105 214 return -1;
Ivop 6:deb670cb8105 215 }
Ivop 11:2b19d52ea37c 216
Ivop 12:49ac91452d77 217 static void c2_enable_pi(void) {
Ivop 12:49ac91452d77 218 c2ck_reset();
Ivop 17:0c5581ae2471 219 wait_ms(2);
Ivop 13:45aaa8847c2b 220 c2_write_ar(C2_REG_FPCTL);
Ivop 17:0c5581ae2471 221 if ((c2_write_dr(0x02))<0)
Ivop 17:0c5581ae2471 222 fatal("cannot enable PI (wr2)");
Ivop 17:0c5581ae2471 223 if ((c2_write_dr(0x04))<0)
Ivop 17:0c5581ae2471 224 fatal("cannot enable PI (wr4)");
Ivop 17:0c5581ae2471 225 if ((c2_write_dr(0x01))<0)
Ivop 17:0c5581ae2471 226 fatal("cannot enable PI (wr1)");
Ivop 17:0c5581ae2471 227 wait_ms(25);
Ivop 12:49ac91452d77 228 }
Ivop 11:2b19d52ea37c 229
Ivop 17:0c5581ae2471 230 static int c2_read_mem(int type, int address, int size, uint8_t *buf) {
Ivop 14:c24f608a8adb 231 int ret, i, ram_or_sfr = (type == C2_PI_CMD_DIRECT_READ) || (type == C2_PI_CMD_INDIRECT_READ);
Ivop 14:c24f608a8adb 232
Ivop 14:c24f608a8adb 233 c2_write_ar(C2_REG_FPDAT);
Ivop 14:c24f608a8adb 234 c2_write_dr(type);
Ivop 14:c24f608a8adb 235
Ivop 16:844edb89d863 236 if (poll_status(C2_MASK_INBUSY) < 0)
Ivop 16:844edb89d863 237 fatal("read_mem: cannot set FPDAT, no input ACK");
Ivop 16:844edb89d863 238 if (poll_status(C2_MASK_OUTREADY) < 0)
Ivop 16:844edb89d863 239 fatal("read_mem: cannot set FPDAT, no output ready");
Ivop 14:c24f608a8adb 240
Ivop 14:c24f608a8adb 241 ret = c2_read_dr();
Ivop 14:c24f608a8adb 242 if (ret != C2_PI_STATUS_OK)
Ivop 14:c24f608a8adb 243 fatal("read_mem: status not OK after setting FPDAT (status %02X)", ret);
Ivop 14:c24f608a8adb 244
Ivop 16:844edb89d863 245 if (!ram_or_sfr) {
Ivop 14:c24f608a8adb 246 c2_write_dr((address >> 8)&0xff);
Ivop 14:c24f608a8adb 247 if (poll_status(C2_MASK_INBUSY) < 0)
Ivop 14:c24f608a8adb 248 fatal("read_mem: cannot write msb of address");
Ivop 14:c24f608a8adb 249 }
Ivop 14:c24f608a8adb 250
Ivop 14:c24f608a8adb 251 c2_write_dr(address & 0xff);
Ivop 14:c24f608a8adb 252 if (poll_status(C2_MASK_INBUSY) < 0)
Ivop 14:c24f608a8adb 253 fatal("read_mem: cannot write lsb of address");
Ivop 14:c24f608a8adb 254
Ivop 16:844edb89d863 255 c2_write_dr(size&0xff);
Ivop 14:c24f608a8adb 256 if (poll_status(C2_MASK_INBUSY) < 0)
Ivop 14:c24f608a8adb 257 fatal("read_mem: cannot set block length");
Ivop 14:c24f608a8adb 258 if (poll_status(C2_MASK_OUTREADY) < 0)
Ivop 17:0c5581ae2471 259 fatal("read_mem: no data ready");
Ivop 14:c24f608a8adb 260
Ivop 17:0c5581ae2471 261 ret = c2_read_dr();
Ivop 17:0c5581ae2471 262 if (ret != C2_PI_STATUS_OK)
Ivop 17:0c5581ae2471 263 return ret;
Ivop 17:0c5581ae2471 264
Ivop 17:0c5581ae2471 265 for (i=0; i<size; i++) {
Ivop 17:0c5581ae2471 266 if (poll_status(C2_MASK_OUTREADY) < 0)
Ivop 17:0c5581ae2471 267 fatal("read_mem: no data ready during retrieval of block");
Ivop 14:c24f608a8adb 268 buf[i] = c2_read_dr();
Ivop 17:0c5581ae2471 269 }
Ivop 17:0c5581ae2471 270
Ivop 17:0c5581ae2471 271 return C2_PI_STATUS_OK;
Ivop 14:c24f608a8adb 272 }
Ivop 14:c24f608a8adb 273
Ivop 0:902f10e5d3e0 274 int main() {
Ivop 17:0c5581ae2471 275 int i, c, devid, revid, ret;
Ivop 1:7a82f806fe92 276
Ivop 1:7a82f806fe92 277 c2d.input();
Ivop 1:7a82f806fe92 278 c2ck = 1;
Ivop 1:7a82f806fe92 279
Ivop 8:af5d402396fb 280 // printf("\033[H\033[J");
Ivop 14:c24f608a8adb 281 printf("\r\nSiLabs C2 Protocol\r\n\r\n");
Ivop 14:c24f608a8adb 282 printf("Connect C2GND to GND, C2CK (clock) to p5 and C2D (data) to p6\r\n\r\n");
Ivop 14:c24f608a8adb 283 printf("Press any key to continue\r\n");
Ivop 4:a9e3ee5741be 284
Ivop 4:a9e3ee5741be 285 getc(stdin);
Ivop 3:b30605f1c435 286
Ivop 13:45aaa8847c2b 287 c2_write_ar(C2_REG_DEVID);
Ivop 3:b30605f1c435 288 devid = c2_read_dr();
Ivop 14:c24f608a8adb 289 if (devid <= 0) fatal("unable to read devid\r\n");
Ivop 1:7a82f806fe92 290
Ivop 13:45aaa8847c2b 291 c2_write_ar(C2_REG_REVID);
Ivop 3:b30605f1c435 292 revid = c2_read_dr();
Ivop 14:c24f608a8adb 293 if (revid < 0) fatal("unable to read revid\r\n");
Ivop 3:b30605f1c435 294
Ivop 4:a9e3ee5741be 295 for (i=0; devices[i].name; i++) {
Ivop 4:a9e3ee5741be 296 if (devices[i].devid == devid) break;
Ivop 4:a9e3ee5741be 297 }
Ivop 4:a9e3ee5741be 298
Ivop 14:c24f608a8adb 299 if (!i) fatal("unknown device: %02X:%02X\r\n", devid, revid);
Ivop 4:a9e3ee5741be 300
Ivop 4:a9e3ee5741be 301 switch(devid) {
Ivop 13:45aaa8847c2b 302 case 0x0f: case 0x28: case 0x18: case 0x19: C2_REG_FPDAT = 0xad;
Ivop 4:a9e3ee5741be 303 default: break;
Ivop 4:a9e3ee5741be 304 }
Ivop 4:a9e3ee5741be 305
Ivop 14:c24f608a8adb 306 printf("\r\nDevice found: %s (%02X:%02X)", devices[i].name, devid, revid);
Ivop 14:c24f608a8adb 307 printf("\r\nFPDAT Address: 0x%02X", C2_REG_FPDAT);
Ivop 14:c24f608a8adb 308 printf("\r\nPage Size: %i\n\r", page_size);
Ivop 12:49ac91452d77 309
Ivop 14:c24f608a8adb 310 printf("\r\nEnabling Programming Interface\r\n");
Ivop 12:49ac91452d77 311 c2_enable_pi();
Ivop 17:0c5581ae2471 312
Ivop 17:0c5581ae2471 313 for (c=0; c<256; c++) {
Ivop 17:0c5581ae2471 314 printf("\r\nReading page %i\r\n", c);
Ivop 17:0c5581ae2471 315 ret = c2_read_mem(C2_PI_CMD_BLOCK_READ, c<<8, 0x100, buffer);
Ivop 17:0c5581ae2471 316 if (ret == C2_PI_STATUS_OK) {
Ivop 17:0c5581ae2471 317 for (i=0; i<0x100; i++) {
Ivop 17:0c5581ae2471 318 printf("%02x ", buffer[i]);
Ivop 17:0c5581ae2471 319 if (i%16 == 15) printf("\r\n");
Ivop 17:0c5581ae2471 320 }
Ivop 17:0c5581ae2471 321 } else {
Ivop 17:0c5581ae2471 322 if (ret == C2_PI_STATUS_PAGE_LOCKED)
Ivop 17:0c5581ae2471 323 printf("page is locked, ");
Ivop 17:0c5581ae2471 324 printf("read failed\r\n");
Ivop 17:0c5581ae2471 325 }
Ivop 17:0c5581ae2471 326 }
Ivop 17:0c5581ae2471 327 }