root/tools/extract_error_table.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. usage
  2. dump_error_table_dry
  3. dump_error_table_vx
  4. process_dump_dry
  5. process_dump_vx
  6. main

   1 /*
   2 utility to extract canon error message list
   3 see http://chdk.wikia.com/wiki/Canon_error_codes
   4 */
   5 #include <stdio.h>
   6 #include <stdint.h>
   7 #include <string.h>
   8 #include <stdlib.h>
   9 #include "dumputil.h"
  10 
  11 void usage()
  12 {
  13     fprintf(stderr,"extract_error_table [-vxworks] <dumpfile.bin> <base address>\n");
  14     exit(1);
  15 }
  16 
  17 void dump_error_table_dry(dump_t *dump,unsigned index)
  18 {
  19     int i;
  20     for(i=index; i < dump->words - 2 && dump->pw[i+1]; i+=2) {
  21         printf("E%02d %02d %s\n",(short)(dump->pw[i] >> 16),dump->pw[i]&0xFFFF,deref_string_ptr(dump,(i+1)*4));
  22     }
  23 }
  24 
  25 void dump_error_table_vx(dump_t *dump,unsigned index)
  26 {
  27     int i;
  28     for(i=index; i < dump->words - 2 && dump->pw[i+1]; i+=2) {
  29         printf("E%02d %s\n",dump->pw[i+1],deref_string_ptr(dump,i*4));
  30     }
  31 }
  32 
  33 int process_dump_dry(dump_t *dump)
  34 {
  35     const char *sig_str="NoError";
  36     unsigned mark_offset=0;
  37     unsigned mark_addr=0;
  38     unsigned i;
  39     while(find_cstring(dump,&mark_offset,sig_str)) {
  40         mark_addr=offset_to_ptr(dump,mark_offset);
  41         i=0;
  42         while(find_word_aligned(dump,&i,mark_addr)) {
  43             if( dump->pw[i-1] == 0) { 
  44                 printf("error_table 0x%X\n",(i-1)*4+dump->base);
  45                 dump_error_table_dry(dump,i-1);
  46                 return 1;
  47             }
  48             i++;
  49         }
  50         mark_offset += strlen(sig_str);
  51     }
  52     if(!mark_offset) {
  53         fprintf(stderr,"error: \"%s\" not found\n",sig_str);
  54     }
  55     else {
  56         fprintf(stderr,"error: error table not found\n");
  57     }
  58     return 0;
  59 }
  60 
  61 int process_dump_vx(dump_t *dump)
  62 {
  63     const char *sig_str="BrtDrv.TimeOutPreBvInteg";
  64     unsigned mark_offset=0;
  65     unsigned mark_addr=0;
  66     unsigned i;
  67     while(find_cstring(dump,&mark_offset,sig_str)) {
  68         mark_addr=offset_to_ptr(dump,mark_offset);
  69         i=0;
  70         while(find_word_aligned(dump,&i,mark_addr)) {
  71             if( dump->pw[i+1] == 1) { 
  72                 printf("error_table 0x%X\n",i*4+dump->base);
  73                 dump_error_table_vx(dump,i);
  74                 return 1;
  75             }
  76             i++;
  77         }
  78         mark_offset += strlen(sig_str);
  79     }
  80     if(!mark_offset) {
  81         fprintf(stderr,"error: \"%s\" not found\n",sig_str);
  82     }
  83     else {
  84         fprintf(stderr,"error: error table not found\n");
  85     }
  86     return 0;
  87 }
  88 
  89 
  90 int main(int argc, char **argv)
  91 {
  92 
  93     dump_t dump;    
  94     int i;
  95     const char *dumpname=NULL;
  96     const char *base=NULL;
  97     int opt_vxworks = 0;
  98 
  99     for(i = 1; i < argc; i++) {
 100         if ( strcmp(argv[i],"-vxworks") == 0 ) {
 101             opt_vxworks = 1;
 102         } else if ( argv[i][0] == '-' ) {
 103             fprintf(stderr,"%s unknown option %s\n",argv[0],argv[i]);
 104             usage();
 105         }
 106         else {
 107             if (!dumpname) {
 108                 dumpname=argv[i];
 109             } else if(!base) {
 110                 base=argv[i];
 111             } else {
 112                 fprintf(stderr,"%s unexpected %s\n",argv[0],argv[i]);
 113                 usage();
 114             }
 115         }
 116     }
 117     if(!dumpname || !base) {
 118         usage();
 119     }
 120 
 121     if(!load_dump(dumpname,base,&dump))
 122         return 1;
 123 
 124     int r;
 125     if(opt_vxworks) {
 126         r=process_dump_vx(&dump);
 127     } else {
 128         r=process_dump_dry(&dump);
 129     }
 130     if(!r) {
 131         return 1;
 132     }
 133     return 0;
 134 }

/* [<][>][^][v][top][bottom][index][help] */