tools/fsusb/memimg.c
author slime@unimatrix01.gamma-quadrant.de
Tue, 29 Jan 2008 22:31:52 +0100
changeset 2 2f55e5dd591d
permissions -rw-r--r--
inital checkin
slime@2
     1
/*
slime@2
     2
** This file is part of fsusb_picdem
slime@2
     3
**
slime@2
     4
** fsusb_picdem is free software; you can redistribute it and/or
slime@2
     5
** modify it under the terms of the GNU General Public License as
slime@2
     6
** published by the Free Software Foundation; either version 2 of the
slime@2
     7
** License, or (at your option) any later version.
slime@2
     8
**
slime@2
     9
** fsusb_picdem is distributed in the hope that it will be useful, but
slime@2
    10
** WITHOUT ANY WARRANTY; without even the implied warranty of
slime@2
    11
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
slime@2
    12
** General Public License for more details.
slime@2
    13
**
slime@2
    14
** You should have received a copy of the GNU General Public License
slime@2
    15
** along with fsusb_picdem; if not, write to the Free Software
slime@2
    16
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
slime@2
    17
** 02110-1301, USA
slime@2
    18
*/
slime@2
    19
slime@2
    20
slime@2
    21
#include "memimg.h"
slime@2
    22
#include <stdlib.h>
slime@2
    23
#include <stdio.h>
slime@2
    24
#include <string.h>
slime@2
    25
slime@2
    26
slime@2
    27
slime@2
    28
/* mi_make_patch: Allocate and initialize a mi_patch
slime@2
    29
 */
slime@2
    30
mi_patch *mi_make_patch(unsigned long base, unsigned long top)
slime@2
    31
{
slime@2
    32
  mi_patch *pat;
slime@2
    33
slime@2
    34
slime@2
    35
slime@2
    36
  pat=malloc(sizeof(mi_patch));
slime@2
    37
  if(pat == NULL) {
slime@2
    38
    return NULL;
slime@2
    39
  }
slime@2
    40
slime@2
    41
slime@2
    42
  pat->base=base;
slime@2
    43
  pat->top=top;
slime@2
    44
slime@2
    45
slime@2
    46
slime@2
    47
  pat->contents=malloc(sizeof(mi_byte_t)*(top-base));
slime@2
    48
  if(pat->contents == NULL) {
slime@2
    49
    free(pat);
slime@2
    50
    return NULL;
slime@2
    51
  }
slime@2
    52
slime@2
    53
  memset(pat->contents, 0xff, sizeof(mi_byte_t)*(top-base));
slime@2
    54
slime@2
    55
slime@2
    56
slime@2
    57
  pat->mask=malloc(sizeof(char)*(top-base));
slime@2
    58
  if(pat->mask == NULL) {
slime@2
    59
    free(pat->contents);
slime@2
    60
    free(pat);
slime@2
    61
    return NULL;
slime@2
    62
  }
slime@2
    63
slime@2
    64
  memset(pat->mask, 0, sizeof(char)*(top-base));
slime@2
    65
slime@2
    66
slime@2
    67
slime@2
    68
  return pat;
slime@2
    69
}
slime@2
    70
slime@2
    71
slime@2
    72
slime@2
    73
/* mi_free_patch: Free a mi_patch and its buffers
slime@2
    74
 */
slime@2
    75
void mi_free_patch(mi_patch *p)
slime@2
    76
{
slime@2
    77
  if(p == NULL) {
slime@2
    78
    return;
slime@2
    79
  }
slime@2
    80
slime@2
    81
  free(p->contents);
slime@2
    82
  free(p->mask);
slime@2
    83
  free(p);
slime@2
    84
}
slime@2
    85
slime@2
    86
slime@2
    87
slime@2
    88
/* mi_free_image: Free a mi_patch and its contents
slime@2
    89
 */
slime@2
    90
void mi_free_image(mi_image *i)
slime@2
    91
{
slime@2
    92
  if(i == NULL) {
slime@2
    93
    return;
slime@2
    94
  }
slime@2
    95
slime@2
    96
  mi_free_patch(i->program);
slime@2
    97
  mi_free_patch(i->id);
slime@2
    98
  mi_free_patch(i->config);
slime@2
    99
  mi_free_patch(i->devid);
slime@2
   100
  mi_free_patch(i->eeprom);
slime@2
   101
slime@2
   102
  free(i);
slime@2
   103
}
slime@2
   104
slime@2
   105
slime@2
   106
slime@2
   107
/* mi_modify_patch: Modify patch contents, tagging it as changed
slime@2
   108
 */
slime@2
   109
void mi_modify_patch(mi_patch *p, int base, int len, mi_byte_t *data)
slime@2
   110
{
slime@2
   111
  int i;
slime@2
   112
slime@2
   113
  if(p == NULL) {
slime@2
   114
    return;
slime@2
   115
  }
slime@2
   116
slime@2
   117
slime@2
   118
slime@2
   119
  if(base<p->base || base+len-1 > p->top) {
slime@2
   120
    printf("*** mi_modify_patch(): patch out of range\n");
slime@2
   121
    return;
slime@2
   122
  }
slime@2
   123
slime@2
   124
slime@2
   125
slime@2
   126
  for(i=0;i<len;i++) {
slime@2
   127
    p->contents[base - p->base + i]=data[i];
slime@2
   128
    p->mask[base - p->base + i]=0xff;
slime@2
   129
  }
slime@2
   130
}
slime@2
   131
slime@2
   132
slime@2
   133
slime@2
   134
/* mi_image: Create a mi_image from the contents of filename
slime@2
   135
 */
slime@2
   136
mi_image *mi_load_hexfile(char *filename)
slime@2
   137
{
slime@2
   138
  mi_image *img;
slime@2
   139
  hex_record *r;
slime@2
   140
  FILE *f;
slime@2
   141
  hex_file *hf;
slime@2
   142
  int i;
slime@2
   143
slime@2
   144
slime@2
   145
slime@2
   146
  if(filename == NULL) {
slime@2
   147
    return NULL;
slime@2
   148
  }
slime@2
   149
slime@2
   150
slime@2
   151
slime@2
   152
  f=fopen(filename, "r");
slime@2
   153
  if(f == NULL) {
slime@2
   154
    return NULL;
slime@2
   155
  }
slime@2
   156
slime@2
   157
slime@2
   158
slime@2
   159
  hf=hex_open(f);
slime@2
   160
  if(hf == NULL) {
slime@2
   161
    fclose(f);
slime@2
   162
    return NULL;
slime@2
   163
  }
slime@2
   164
slime@2
   165
slime@2
   166
slime@2
   167
  img=malloc(sizeof(mi_image));
slime@2
   168
  if(img == NULL) {
slime@2
   169
    fclose(f);
slime@2
   170
    free(hf);
slime@2
   171
    return NULL;
slime@2
   172
  }
slime@2
   173
slime@2
   174
slime@2
   175
slime@2
   176
  /* These nulls may not be required, but make me feel safer when
slime@2
   177
   *  using free_image() on an error
slime@2
   178
   */
slime@2
   179
  img->program = NULL;
slime@2
   180
  img->id = NULL;
slime@2
   181
  img->config = NULL;
slime@2
   182
  img->devid = NULL;
slime@2
   183
  img->eeprom = NULL;
slime@2
   184
slime@2
   185
slime@2
   186
slime@2
   187
  img->program=mi_make_patch(MI_PROGRAM_BASE, MI_PROGRAM_TOP);
slime@2
   188
  img->id=mi_make_patch(MI_ID_BASE, MI_ID_TOP);
slime@2
   189
  img->config=mi_make_patch(MI_CONFIG_BASE, MI_CONFIG_TOP);
slime@2
   190
  img->devid=mi_make_patch(MI_DEVID_BASE, MI_DEVID_TOP);
slime@2
   191
  img->eeprom=mi_make_patch(MI_EEPROM_BASE, MI_EEPROM_TOP);
slime@2
   192
slime@2
   193
  if(img->program == NULL || img->id == NULL || img->config == NULL
slime@2
   194
     || img->devid == NULL || img->eeprom == NULL) {
slime@2
   195
    fclose(f);
slime@2
   196
    free(hf);
slime@2
   197
    mi_free_image(img);
slime@2
   198
    return NULL;
slime@2
   199
  }
slime@2
   200
slime@2
   201
slime@2
   202
slime@2
   203
  while((r=hex_read(hf))) {
slime@2
   204
    if(r->type == 0) {
slime@2
   205
      
slime@2
   206
      printf("file: %.2i@0x%.8X:\t", r->datlen, r->addr);
slime@2
   207
      for(i=0;i<r->datlen;i++) {
slime@2
   208
        printf("%.2x", r->data[i]);
slime@2
   209
      }
slime@2
   210
      printf("\n");
slime@2
   211
slime@2
   212
      if (r->addr < 0x800) {
slime@2
   213
        printf ("Dammit! we cant write into code-protected memory!!\n");
slime@2
   214
      }
slime@2
   215
      else
slime@2
   216
      {
slime@2
   217
        if(r->addr >= MI_PROGRAM_BASE && r->addr <= MI_PROGRAM_TOP) {
slime@2
   218
          mi_modify_patch(img->program, r->addr, r->datlen, r->data);
slime@2
   219
        }
slime@2
   220
slime@2
   221
        if(r->addr >= MI_ID_BASE && r->addr <= MI_ID_TOP) {
slime@2
   222
          mi_modify_patch(img->id, r->addr, r->datlen, r->data);
slime@2
   223
        }
slime@2
   224
slime@2
   225
        if(r->addr >= MI_CONFIG_BASE && r->addr <= MI_CONFIG_TOP) {
slime@2
   226
          mi_modify_patch(img->config, r->addr, r->datlen, r->data);
slime@2
   227
        }
slime@2
   228
slime@2
   229
        if(r->addr >= MI_DEVID_BASE && r->addr <= MI_DEVID_TOP) {
slime@2
   230
          mi_modify_patch(img->devid, r->addr, r->datlen, r->data);
slime@2
   231
        }
slime@2
   232
      }
slime@2
   233
slime@2
   234
slime@2
   235
    }
slime@2
   236
    free(r);
slime@2
   237
    //    printf("\n");
slime@2
   238
  }
slime@2
   239
slime@2
   240
slime@2
   241
slime@2
   242
  free(hf);
slime@2
   243
  fclose(f);
slime@2
   244
  return img;
slime@2
   245
}
slime@2
   246