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
#include <config.h>
00027
00028
#include <stdio.h>
00029
#include <stdlib.h>
00030
#include <string.h>
00031
00032
#include "avrerror.h"
00033
#include "avrmalloc.h"
00034
#include "avrclass.h"
00035
#include "utils.h"
00036
#include "callback.h"
00037
#include "op_names.h"
00038
00039
#include "storage.h"
00040
#include "flash.h"
00041
00042
#include "vdevs.h"
00043
#include "memory.h"
00044
#include "stack.h"
00045
#include "register.h"
00046
#include "sram.h"
00047
#include "eeprom.h"
00048
#include "timers.h"
00049
#include "ports.h"
00050
00051
#include "avrcore.h"
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 VDevice *
00062 vdev_new (
char *name,
int base,
int size, VDevFP_Read rd, VDevFP_Write wr,
00063 VDevFP_Reset reset, VDevFP_RegName reg_name)
00064 {
00065 VDevice *dev;
00066
00067 dev =
avr_new (VDevice, 1);
00068
vdev_construct (dev, name, base, size, rd, wr, reset, reg_name);
00069
class_overload_destroy ((AvrClass *)dev,
vdev_destroy);
00070
00071
return dev;
00072 }
00073
00074
00075
void
00076 vdev_construct (VDevice *dev,
char *name,
int base,
int size, VDevFP_Read rd,
00077 VDevFP_Write wr, VDevFP_Reset reset, VDevFP_RegName reg_name)
00078 {
00079
if (dev == NULL)
00080
avr_error (
"passed null ptr");
00081
00082
class_construct ((AvrClass *)dev);
00083
00084 dev->name = name;
00085
00086 dev->base = base;
00087 dev->size = size;
00088
00089 dev->read = rd;
00090 dev->write = wr;
00091 dev->reset = reset;
00092 dev->reg_name = reg_name;
00093 }
00094
00095
00096
void
00097 vdev_destroy (
void *dev)
00098 {
00099
if (dev == NULL)
00100
return;
00101
00102
class_destroy (dev);
00103 }
00104
00105
00106
00107
00108
00109
00110
00111
int
00112 vdev_name_cmp (AvrClass *c1, AvrClass *c2)
00113 {
00114
return strcmp (((VDevice *)c1)->name, (
char *)c2);
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
int
00129 vdev_addr_cmp (AvrClass *c1, AvrClass *c2)
00130 {
00131 VDevice *d1 = (VDevice *)c1;
00132
int addr = *(
int *)c2;
00133
00134
if (addr < d1->base)
00135
return (addr - d1->base);
00136
00137
if (addr >= (d1->base + d1->size))
00138
00139
return (1 + addr - (d1->base + d1->size));
00140
00141
00142
return 0;
00143 }
00144
00145
00146 uint8_t
00147 vdev_read (VDevice *dev,
int addr)
00148 {
00149
return dev->read (dev, addr);
00150 }
00151
00152
00153
void
00154 vdev_write (VDevice *dev,
int addr, uint8_t val)
00155 {
00156 dev->write (dev, addr, val);
00157 }
00158
00159
00160
void
00161 vdev_reset (VDevice *dev)
00162 {
00163 dev->reset (dev);
00164 }
00165
00166
00167
void
00168 vdev_set_core (VDevice *dev, AvrClass *core)
00169 {
00170 dev->core = (AvrClass *)core;
00171 }
00172
00173
00174
extern inline AvrClass *
vdev_get_core (VDevice *dev);
00175
00176
00177
int
00178 vdev_get_base (VDevice *dev)
00179 {
00180
return dev->base;
00181 }
00182
00183
00184
00185
int
00186 vdev_get_size (VDevice *dev)
00187 {
00188
return dev->size;
00189 }
00190
00191
00192
char *
00193 vdev_get_name (VDevice *dev)
00194 {
00195
return dev->name;
00196 }
00197
00198
00199
00200
char *
00201 vdev_get_reg_name (VDevice *dev,
int addr)
00202 {
00203
return dev->reg_name (dev, addr);
00204 }