00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <config.h>
00038
00039 #include <stdio.h>
00040 #include <stdlib.h>
00041 #include <string.h>
00042
00043 #include "avrerror.h"
00044 #include "avrmalloc.h"
00045 #include "avrclass.h"
00046 #include "utils.h"
00047 #include "callback.h"
00048 #include "op_names.h"
00049
00050 #include "storage.h"
00051 #include "flash.h"
00052
00053 #include "vdevs.h"
00054 #include "memory.h"
00055 #include "stack.h"
00056 #include "register.h"
00057 #include "sram.h"
00058 #include "eeprom.h"
00059 #include "timers.h"
00060 #include "ports.h"
00061 #include "spi.h"
00062 #include "adc.h"
00063 #include "usb.h"
00064 #include "uart.h"
00065
00066 #include "avrcore.h"
00067
00068 #include "devsupp.h"
00069
00070 #ifndef DOXYGEN
00071
00072
00073
00074
00075
00076
00077 enum _vector_table_select
00078 {
00079 VTAB_AT90S1200 = 0,
00080 VTAB_AT90S2313,
00081 VTAB_AT90S4414,
00082 VTAB_ATMEGA8,
00083 VTAB_ATMEGA16,
00084 VTAB_ATMEGA32,
00085 VTAB_ATMEGA103,
00086 VTAB_ATMEGA128,
00087 VTAB_AT43USB355,
00088 VTAB_AT43USB320,
00089 VTAB_AT43USB325,
00090 VTAB_AT43USB326,
00091 };
00092
00093
00094
00095 struct io_reg_defn {
00096 uint16_t addr;
00097
00098 char *name;
00099
00100 uint16_t ref_addr;
00101
00102
00103
00104
00105
00106
00107
00108 uint16_t related;
00109
00110
00111
00112
00113
00114
00115
00116 VDevCreate vdev_create;
00117
00118
00119
00120
00121 void *data;
00122
00123 int flags;
00124
00125 uint8_t reset_value;
00126
00127
00128
00129
00130 uint8_t rd_mask;
00131
00132 uint8_t wr_mask;
00133
00134 };
00135
00136 #define IO_REG_DEFN_TERMINATOR { .name = NULL, }
00137
00138
00139
00140 struct _DevSuppDefn
00141 {
00142 char *name;
00143
00144 StackType stack_type;
00145 int has_ext_io_reg;
00146 int irq_vect_idx;
00147
00148 struct
00149 {
00150 int pc;
00151
00152 int stack;
00153
00154 int flash;
00155 int sram;
00156 int eeprom;
00157 int xram;
00158 } size;
00159
00160
00161
00162
00163 struct io_reg_defn io_reg[];
00164
00165 };
00166
00167 #endif
00168
00169 int
00170 dev_supp_has_ext_io_reg (DevSuppDefn *dev)
00171 {
00172 return dev->has_ext_io_reg;
00173 }
00174
00175 int
00176 dev_supp_get_flash_sz (DevSuppDefn *dev)
00177 {
00178 return dev->size.flash;
00179 }
00180
00181 int
00182 dev_supp_get_PC_sz (DevSuppDefn *dev)
00183 {
00184 return dev->size.pc;
00185 }
00186
00187 int
00188 dev_supp_get_stack_sz (DevSuppDefn *dev)
00189 {
00190 return dev->size.stack;
00191 }
00192
00193 int
00194 dev_supp_get_vtab_idx (DevSuppDefn *dev)
00195 {
00196 return dev->irq_vect_idx;
00197 }
00198
00199 int
00200 dev_supp_get_sram_sz (DevSuppDefn *dev)
00201 {
00202 return dev->size.sram;
00203 }
00204
00205 int
00206 dev_supp_get_xram_sz (DevSuppDefn *dev)
00207 {
00208 return dev->size.xram;
00209 }
00210
00211
00212
00213
00214
00215 #define IN_DEVSUPP_C
00216
00217 #include "defn/90s1200.h"
00218 #include "defn/90s2313.h"
00219 #include "defn/90s4414.h"
00220 #include "defn/90s8515.h"
00221
00222 #include "defn/mega8.h"
00223 #include "defn/mega16.h"
00224 #include "defn/mega32.h"
00225 #include "defn/mega103.h"
00226 #include "defn/mega128.h"
00227
00228 #include "defn/43usb320.h"
00229 #include "defn/43usb325.h"
00230 #include "defn/43usb326.h"
00231
00232 #include "defn/43usb351.h"
00233 #include "defn/43usb353.h"
00234 #include "defn/43usb355.h"
00235
00236 #undef IN_DEVSUPP_C
00237
00238
00239
00240 static DevSuppDefn *devices_supported[] = {
00241 &defn_at90s1200,
00242 &defn_at90s2313,
00243 &defn_at90s4414,
00244 &defn_at90s8515,
00245 &defn_atmega8,
00246 &defn_atmega16,
00247 &defn_atmega32,
00248 &defn_atmega103,
00249 &defn_atmega128,
00250 &defn_at43usb351,
00251 &defn_at43usb353,
00252 &defn_at43usb355,
00253 &defn_at43usb320,
00254 &defn_at43usb325,
00255 &defn_at43usb326,
00256 NULL
00257 };
00258
00259
00260
00261
00262
00263
00264
00265 DevSuppDefn *
00266 dev_supp_lookup_device (char *dev_name)
00267 {
00268 DevSuppDefn **dev = devices_supported;
00269 int len;
00270
00271 while ((*dev))
00272 {
00273 len = strlen ((*dev)->name);
00274
00275 if (strncmp ((*dev)->name, dev_name, len) == 0)
00276 return (*dev);
00277
00278 dev++;
00279 }
00280 return NULL;
00281 }
00282
00283
00284
00285 void
00286 dev_supp_list_devices (FILE * fp)
00287 {
00288 DevSuppDefn **dev;
00289
00290 for (dev = devices_supported; (*dev); dev++)
00291 fprintf (fp, " %s\n", (*dev)->name);
00292 }
00293
00294 void
00295 dev_supp_attach_io_regs (AvrCore *core, DevSuppDefn *dev)
00296 {
00297 VDevice *vdev;
00298 struct io_reg_defn *reg = dev->io_reg;
00299
00300 while (reg->name)
00301 {
00302 if (reg->ref_addr)
00303 {
00304 if (reg->ref_addr < 0x20)
00305 {
00306 avr_error ("can't attach IO reg into general register space");
00307 }
00308
00309
00310
00311 vdev = avr_core_get_vdev_by_addr (core, reg->ref_addr);
00312 if (vdev == NULL)
00313 {
00314
00315 avr_error ("reference vdev hasn't been created yet");
00316 }
00317
00318 vdev_add_addr (vdev, reg->addr, reg->name, reg->related,
00319 reg->data);
00320
00321 avr_core_attach_vdev (core, reg->addr, reg->name, vdev, reg->flags,
00322 reg->reset_value, reg->rd_mask,
00323 reg->wr_mask);
00324
00325 avr_message ("attach: IO Reg '%s' at 0x%04x: ref = 0x%04x\n",
00326 reg->name, reg->addr, reg->ref_addr);
00327 }
00328
00329 else if (reg->vdev_create)
00330 {
00331 vdev = reg->vdev_create (reg->addr, reg->name, reg->related,
00332 reg->data);
00333 avr_core_attach_vdev (core, reg->addr, reg->name, vdev, reg->flags,
00334 reg->reset_value, reg->rd_mask,
00335 reg->wr_mask);
00336
00337
00338
00339 class_unref ((AvrClass *)vdev);
00340
00341 avr_message ("attach: IO Reg '%s' at 0x%04x: created\n",
00342 reg->name, reg->addr);
00343 }
00344
00345 else
00346 {
00347 avr_message ("TODO: attach IO Reg '%s' at 0x%04x\n", reg->name,
00348 reg->addr);
00349
00350 avr_core_set_addr_name (core, reg->addr, reg->name);
00351 }
00352
00353 reg++;
00354 }
00355 }