Ivo van Poorten
/
SiLabs_C2
Basis for the C2 protocol from Silicon Labs.
main.cpp@17:0c5581ae2471, 2014-06-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |