1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/tools/fsusb/main.c Tue Jan 29 22:31:52 2008 +0100
1.3 @@ -0,0 +1,335 @@
1.4 +/*
1.5 +** This file is part of fsusb_picdem
1.6 +**
1.7 +** fsusb_picdem is free software; you can redistribute it and/or
1.8 +** modify it under the terms of the GNU General Public License as
1.9 +** published by the Free Software Foundation; either version 2 of the
1.10 +** License, or (at your option) any later version.
1.11 +**
1.12 +** fsusb_picdem is distributed in the hope that it will be useful, but
1.13 +** WITHOUT ANY WARRANTY; without even the implied warranty of
1.14 +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1.15 +** General Public License for more details.
1.16 +**
1.17 +** You should have received a copy of the GNU General Public License
1.18 +** along with fsusb_picdem; if not, write to the Free Software
1.19 +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
1.20 +** 02110-1301, USA
1.21 +*/
1.22 +
1.23 +
1.24 +#include "memimg.h"
1.25 +#include <stdio.h>
1.26 +#include <stdlib.h>
1.27 +#include "fsusb.h"
1.28 +#include <string.h>
1.29 +
1.30 +picdem_handle *usbdev;
1.31 +
1.32 +
1.33 +typedef int scan_callback_t(int,int,mi_byte_t*,char*);
1.34 +
1.35 +int program_flash(int addr, int len, mi_byte_t *data, char *mask)
1.36 +{
1.37 + if(len != 64) {
1.38 + printf("*** Tried to program flash not 64 bytes at a time!\n");
1.39 + printf("*** Is flash size divisible by 64?\n");
1.40 + return -1;
1.41 + }
1.42 +
1.43 + // printf("writing program block at %.8x\n", addr);
1.44 + rjl_write_block(usbdev, addr, data);
1.45 +
1.46 + return 0;
1.47 +}
1.48 +
1.49 +int program_config(int addr, int len, mi_byte_t *data, char *mask)
1.50 +{
1.51 + int i;
1.52 +
1.53 + printf("writing size-%i config block at %.8x:\n", len, (addr/64)*64);
1.54 +
1.55 + for(i=0;i<64;i++) {
1.56 + printf("%.2x", data[i]);
1.57 + }
1.58 + printf("\n");
1.59 +
1.60 +
1.61 + rjl_write_config_block(usbdev, addr, len, data);
1.62 +
1.63 + return 0;
1.64 +}
1.65 +
1.66 +int verify_flash(int addr, int len, mi_byte_t *data, char *mask)
1.67 +{
1.68 + int mb;
1.69 + int i;
1.70 + bl_packet bp;
1.71 + int bad=0;
1.72 + // printf("verifying %i bytes at %.8x\n", len, addr);
1.73 + /*
1.74 + printf("data is ");
1.75 + for(i=0;i<len;i++) {
1.76 + printf("%.2x", data[i]);
1.77 + }
1.78 + printf("\nmask is ");
1.79 + for(i=0;i<len;i++) {
1.80 + printf("%.2x", (mask[i])?0xff:0x00);
1.81 + }
1.82 +
1.83 + printf("\n");
1.84 + */
1.85 +
1.86 + for(mb=0;mb<64 && mb<len;mb+=32) {
1.87 + // printf("doing rjl_request_flash(usbdev, %.8x, %i, %.8x);\n",
1.88 + // addr+mb, (len-mb>=32)?32:len-mb, &bp);
1.89 + rjl_request_flash(usbdev, addr+mb, (len-mb>=32)?32:len-mb, &bp);
1.90 +
1.91 + for(i=0;i<32 && mb+i<len;i++) {
1.92 + if(mask[mb+i] && data[mb+i] != bp.data[i]) {
1.93 + bad=1;
1.94 + // printf("mismatch!\n");
1.95 + printf("mismatch in %i-byte chunk at 0x%.8x:\n",
1.96 + (len-mb>=32)?32:len-mb, addr+mb);
1.97 + printf("File: ");
1.98 + for(i=0;i<32 && mb+i<len;i++) {
1.99 + if(mask[mb+i]) {
1.100 + printf("%.2x", data[mb+i]);
1.101 + } else {
1.102 + printf("##");
1.103 + }
1.104 + }
1.105 + printf("\nDevice:");
1.106 + for(i=0;i<32 && mb+i<len;i++) {
1.107 + printf("%.2x", bp.data[i]);
1.108 + }
1.109 + printf("\n");
1.110 +
1.111 +
1.112 + }
1.113 + }
1.114 +
1.115 +
1.116 + }
1.117 +
1.118 + return bad;
1.119 +}
1.120 +
1.121 +int scanpatch(mi_patch *p, scan_callback_t sc)
1.122 +{
1.123 + int b,i,active;
1.124 + int retval=0;
1.125 + int callback_ret;
1.126 +
1.127 + for(b=0;b<=p->top - p->base;b+=64) {
1.128 + active=0;
1.129 + for(i=0;i<64 && b+i <= p->top - p->base;i++) {
1.130 + if(p->mask[i+b]) {
1.131 + active=1;
1.132 + }
1.133 + }
1.134 +
1.135 + if(active) {
1.136 + if((callback_ret=sc(b+p->base, (b+63+p->base > p->top)?p->top-p->base-b+1:64,
1.137 + p->contents+b, p->mask+b))) {
1.138 + retval=callback_ret;
1.139 + // printf("*** Something bad happened!\n");
1.140 + }
1.141 + // printf("active %s block at %.8lx\n", ttt, b+p->base);
1.142 + }
1.143 +
1.144 +
1.145 + }
1.146 +
1.147 + return retval;
1.148 +}
1.149 +
1.150 +void show_usage(void)
1.151 +{
1.152 + printf("fsusb: Software for \"PICDEM Full Speed USB\" demo board\n");
1.153 + printf("fsusb <file> program board with <file> and verify\n");
1.154 + printf("fsusb --program <file> program board with <file> and verify\n");
1.155 + printf("fsusb --verify <file> verify board against <file>\n");
1.156 + printf("fsusb --read <file> read board, saving result in <file>\n");
1.157 +}
1.158 +
1.159 +
1.160 +int verify_file(char *file)
1.161 +{
1.162 + mi_image *img;
1.163 + int retval=0;
1.164 +
1.165 + usbdev=rjl_fsusb_open();
1.166 + img=mi_load_hexfile(file);
1.167 +
1.168 + if(scanpatch(img->program, verify_flash)) {
1.169 + printf("Program memory contains errors!\n");
1.170 + } else {
1.171 + printf("Program memory validated\n");
1.172 + retval=1;
1.173 + }
1.174 +
1.175 + // don't bother checking config memory, it's write-protected anyway
1.176 + // scanpatch(img->id, verify_flash);
1.177 + // scanpatch(img->config, verify_flash);
1.178 + // scanpatch(img->devid, verify_flash);
1.179 +
1.180 + return retval;
1.181 +}
1.182 +
1.183 +int program_file(char *file)
1.184 +{
1.185 + mi_image *img;
1.186 + int retval=0;
1.187 +
1.188 + usbdev=rjl_fsusb_open();
1.189 + img=mi_load_hexfile(file);
1.190 +
1.191 + if(scanpatch(img->program, program_flash)) {
1.192 + printf("Writing program memory unsuccessful\n");
1.193 + retval=1;
1.194 + } else {
1.195 + printf("Writing program memory successful\n");
1.196 + }
1.197 +
1.198 + // don't bother with config memory, it's write-protected
1.199 + // scanpatch(img->id, program_config);
1.200 + // scanpatch(img->config, program_config);
1.201 +
1.202 + // devid is read-only, don't program it
1.203 + // scanpatch(img->devid, program_config);
1.204 +
1.205 + if(scanpatch(img->program, verify_flash)) {
1.206 + printf("Program memory contains errors!\n");
1.207 + retval=1;
1.208 + } else {
1.209 + printf("Program memory validated\n");
1.210 + }
1.211 +
1.212 + // don't bother checking config memory, it's write-protected anyway
1.213 + // scanpatch(img->id, verify_flash);
1.214 + // scanpatch(img->config, verify_flash);
1.215 + // scanpatch(img->devid, verify_flash);
1.216 +
1.217 + return retval;
1.218 +
1.219 +}
1.220 +
1.221 +
1.222 +
1.223 +int write_range(int base, int top, FILE *f)
1.224 +{
1.225 + bl_packet bp;
1.226 + int addr;
1.227 + int i;
1.228 + unsigned char checksum;
1.229 + int doit;
1.230 +
1.231 +
1.232 + fprintf(f, ":02000004%.2X%.2X%.2X\n",
1.233 + (base >> 16) & 0xff,
1.234 + (base >> 24) & 0xff,
1.235 + (unsigned char)
1.236 + (-((char)((2+4+((base >> 16) & 0xff)+((base >> 24) & 0xff))%256))));
1.237 +
1.238 + for(addr=base;addr<=top;addr+=16) {
1.239 + rjl_request_flash(usbdev, addr,
1.240 + (top-addr+1>=16)?16:top-addr+1, &bp);
1.241 +
1.242 + doit=0;
1.243 + for(i=0;i<16 && i+addr < top;i++) {
1.244 + if(bp.data[i] != 0xff) {
1.245 + doit=1;
1.246 + }
1.247 + }
1.248 + if(doit==0) { // This section is all 0xff, i.e. unprogrammed
1.249 + continue;
1.250 + }
1.251 +
1.252 + // :
1.253 + fprintf(f, ":");
1.254 + checksum=0;
1.255 +
1.256 + // ll
1.257 + checksum += (top-addr+1>=16)?16:top-addr+1;
1.258 + fprintf(f, "%.2X", (top-addr+1>=16)?16:top-addr+1);
1.259 +
1.260 + // aaaa
1.261 + checksum += (addr & 0xffff) / 256;
1.262 + fprintf(f, "%.2X", (addr & 0xffff) / 256);
1.263 + checksum += (addr & 0xffff) % 256;
1.264 + fprintf(f, "%.2X", (addr & 0xffff) % 256);
1.265 +
1.266 + // tt
1.267 + fprintf(f, "00");
1.268 +
1.269 + // dd...
1.270 + for(i=0;i<16 && i+addr<=top;i++) {
1.271 + checksum += bp.data[i];
1.272 + fprintf(f, "%.2X", bp.data[i]);
1.273 + }
1.274 +
1.275 + // cc
1.276 + fprintf(f, "%.2X\n", (unsigned char)(-((char)checksum)));
1.277 + }
1.278 +
1.279 + return 0;
1.280 +}
1.281 +
1.282 +
1.283 +int read_to_file(char *file)
1.284 +{
1.285 + usbdev=rjl_fsusb_open();
1.286 + FILE *f;
1.287 +
1.288 + f=fopen(file, "w");
1.289 +
1.290 + if(f == NULL) {
1.291 + return -1;
1.292 + }
1.293 +
1.294 + write_range(MI_PROGRAM_BASE, MI_PROGRAM_TOP, f);
1.295 + write_range(MI_ID_BASE, MI_ID_TOP, f);
1.296 + write_range(MI_CONFIG_BASE, MI_CONFIG_TOP, f);
1.297 + write_range(MI_DEVID_BASE, MI_DEVID_TOP, f);
1.298 + fprintf(f, ":00000001FF\n");
1.299 +
1.300 + printf("Finished reading\n");
1.301 +
1.302 + return 0;
1.303 +}
1.304 +
1.305 +
1.306 +int main(int argc, char *argv[])
1.307 +{
1.308 + if(argc < 2 || argc > 3) {
1.309 + show_usage();
1.310 + exit(1);
1.311 + }
1.312 +
1.313 + if(argc == 3) {
1.314 + if(!strcmp(argv[1], "--verify")) {
1.315 + exit(verify_file(argv[2]));
1.316 + }
1.317 +
1.318 + if(!strcmp(argv[1], "--program")) {
1.319 + exit(program_file(argv[2]));
1.320 + }
1.321 +
1.322 + if(!strcmp(argv[1], "--read")) {
1.323 + exit(read_to_file(argv[2]));
1.324 + }
1.325 +
1.326 + printf("Unknown option %s\n", argv[1]);
1.327 + show_usage();
1.328 + exit(1);
1.329 + }
1.330 +
1.331 + if(argc == 2) {
1.332 + exit(program_file(argv[1]));
1.333 + }
1.334 +
1.335 +
1.336 +
1.337 + return 1;
1.338 +}