32 #include "avrmalloc.h" 61 static uint8_t sreg_read (VDevice *dev,
int addr);
62 static void sreg_write (VDevice *dev,
int addr, uint8_t val);
63 static void sreg_reset (VDevice *dev);
64 static void sreg_add_addr (VDevice *dev,
int addr,
char *name,
int rel_addr,
68 sreg_create (
int addr,
char *name,
int rel_addr,
void *data)
70 return (VDevice *)sreg_new ();
79 sreg_construct (sreg);
86 sreg_construct (SREG *sreg)
91 vdev_construct ((VDevice *)sreg, sreg_read, sreg_write, sreg_reset,
98 sreg_destroy (
void *sreg)
106 extern uint8_t sreg_get (SREG *sreg);
108 extern void sreg_set (SREG *sreg, uint8_t val);
110 extern uint8_t sreg_get_bit (SREG *sreg,
int bit);
112 extern void sreg_set_bit (SREG *sreg,
int bit,
int val);
115 sreg_read (VDevice *dev,
int addr)
117 return sreg_get ((SREG *)dev);
121 sreg_write (VDevice *dev,
int addr, uint8_t val)
123 sreg_set ((SREG *)dev, val);
127 sreg_reset (VDevice *dev)
130 ((SREG *)dev)->sreg.reg = 0;
134 sreg_add_addr (VDevice *dev,
int addr,
char *name,
int rel_addr,
void *data)
146 static uint8_t gpwr_read (VDevice *dev,
int addr);
147 static void gpwr_write (VDevice *dev,
int addr, uint8_t val);
148 static void gpwr_reset (VDevice *dev);
156 gpwr_construct (gpwr);
163 gpwr_construct (GPWR *gpwr)
168 vdev_construct ((VDevice *)gpwr, gpwr_read, gpwr_write, gpwr_reset, NULL);
170 gpwr_reset ((VDevice *)gpwr);
174 gpwr_destroy (
void *gpwr)
182 extern uint8_t gpwr_get (GPWR *gpwr,
int reg);
184 extern void gpwr_set (GPWR *gpwr,
int reg, uint8_t val);
187 gpwr_read (VDevice *dev,
int addr)
189 return gpwr_get ((GPWR *)dev, addr);
193 gpwr_write (VDevice *dev,
int addr, uint8_t val)
195 gpwr_set ((GPWR *)dev, addr, val);
199 gpwr_reset (VDevice *dev)
203 for (i = 0; i < GPWR_SIZE; i++)
204 gpwr_set ((GPWR *)dev, i, 0);
213 static uint8_t acsr_read (VDevice *dev,
int addr);
214 static void acsr_write (VDevice *dev,
int addr, uint8_t val);
215 static void acsr_reset (VDevice *dev);
218 acsr_new (uint8_t func_mask)
223 acsr_construct (acsr, func_mask);
230 acsr_construct (ACSR *acsr, uint8_t func_mask)
235 vdev_construct ((VDevice *)acsr, acsr_read, acsr_write, acsr_reset,
238 acsr->func_mask = func_mask;
243 acsr_destroy (
void *acsr)
252 acsr_get_bit (ACSR *acsr,
int bit)
254 return !!(acsr->acsr & acsr->func_mask & (1 << bit));
258 acsr_set_bit (ACSR *acsr,
int bit,
int val)
263 val) & acsr->func_mask & ~(mask_ACO);
267 acsr_read (VDevice *dev,
int addr)
269 ACSR *reg = (ACSR *)dev;
271 return (reg->acsr & reg->func_mask);
275 acsr_write (VDevice *dev,
int addr, uint8_t val)
277 ACSR *reg = (ACSR *)dev;
280 reg->acsr = (val & reg->func_mask & ~(mask_ACO));
284 acsr_reset (VDevice *dev)
286 ((ACSR *)dev)->acsr = 0;
295 static uint8_t mcucr_read (VDevice *dev,
int addr);
296 static void mcucr_write (VDevice *dev,
int addr, uint8_t val);
297 static void mcucr_reset (VDevice *dev);
300 mcucr_new (uint8_t func_mask)
305 mcucr_construct (mcucr, func_mask);
312 mcucr_construct (MCUCR *mcucr, uint8_t func_mask)
317 vdev_construct ((VDevice *)mcucr, mcucr_read, mcucr_write, mcucr_reset,
320 mcucr->func_mask = func_mask;
325 mcucr_destroy (
void *mcucr)
334 mcucr_get_bit (MCUCR *reg,
int bit)
336 return !!(reg->mcucr & reg->func_mask & (1 << bit));
340 mcucr_set_bit (MCUCR *reg,
int bit,
int val)
346 mcucr_read (VDevice *dev,
int addr)
348 MCUCR *reg = (MCUCR *)dev;
350 return (reg->mcucr & reg->func_mask);
354 mcucr_write (VDevice *dev,
int addr, uint8_t val)
356 MCUCR *reg = (MCUCR *)dev;
358 reg->mcucr = (val & reg->func_mask);
362 mcucr_reset (VDevice *dev)
364 ((MCUCR *)dev)->mcucr = 0;
374 static void wdtcr_set_bit (WDTCR *wdtcr,
int bit,
int val);
376 static uint8_t wdtcr_read (VDevice *dev,
int addr);
377 static void wdtcr_write (VDevice *dev,
int addr, uint8_t val);
378 static void wdtcr_reset (VDevice *dev);
380 static int wdtcr_timer_cb (uint64_t time, AvrClass *data);
381 static int wdtcr_toe_clr_cb (uint64_t time, AvrClass *data);
384 wdtcr_new (uint8_t func_mask)
389 wdtcr_construct (wdtcr, func_mask);
396 wdtcr_construct (WDTCR *wdtcr, uint8_t func_mask)
401 vdev_construct ((VDevice *)wdtcr, wdtcr_read, wdtcr_write, wdtcr_reset,
404 wdtcr->func_mask = func_mask;
406 wdtcr_reset ((VDevice *)wdtcr);
410 wdtcr_destroy (
void *wdtcr)
422 wdtcr_update (WDTCR *wdtcr)
429 wdtcr_get_bit (WDTCR *reg,
int bit)
431 return !!(reg->wdtcr & reg->func_mask & (1 << bit));
436 wdtcr_set_bit (WDTCR *reg,
int bit,
int val)
442 wdtcr_read (VDevice *dev,
int addr)
444 WDTCR *reg = (WDTCR *)dev;
446 return (reg->wdtcr & reg->func_mask);
455 wdtcr_write (VDevice *dev,
int addr, uint8_t val)
457 WDTCR *reg = (WDTCR *)dev;
458 uint8_t wd_enabled = (reg->wdtcr & mask_WDE);
462 if (reg->func_mask & mask_WDTOE)
465 if ((reg->wdtcr & mask_WDE) && !(reg->wdtcr & mask_WDTOE))
471 if (val & mask_WDTOE)
473 reg->toe_clk = TOE_CLKS;
476 if (reg->toe_cb == NULL)
478 cb = callback_new (wdtcr_toe_clr_cb, (AvrClass *)reg);
485 reg->wdtcr = (val & reg->func_mask);
487 if ((wd_enabled == 0) && (val & mask_WDE) && (reg->timer_cb == NULL))
490 cb = callback_new (wdtcr_timer_cb, (AvrClass *)reg);
495 if (wd_enabled && ((val & mask_WDE) == 0) && (reg->timer_cb != NULL))
498 reg->timer_cb = NULL;
503 wdtcr_reset (VDevice *dev)
505 WDTCR *wdtcr = (WDTCR *)dev;
511 wdtcr->timer_cb = NULL;
513 wdtcr->toe_clk = TOE_CLKS;
514 wdtcr->toe_cb = NULL;
521 wdtcr_timer_cb (uint64_t time, AvrClass *data)
523 WDTCR *wdtcr = (WDTCR *)data;
527 if (wdtcr->timer_cb == NULL)
528 return CB_RET_REMOVE;
530 time_diff = time - wdtcr->last_WDR;
531 time_out = TIMEOUT_BASE * (1 << (wdtcr->wdtcr & mask_WDP));
533 if (time_diff > time_out)
535 avr_warning (
"watchdog reset: time %lld\n", time_diff);
539 irq_vect_table_index (RESET));
542 return CB_RET_RETAIN;
549 wdtcr_toe_clr_cb (uint64_t time, AvrClass *data)
551 WDTCR *wdtcr = (WDTCR *)data;
553 if (wdtcr->toe_cb == NULL)
554 return CB_RET_REMOVE;
556 if (wdtcr->toe_clk > 0)
562 wdtcr_set_bit (wdtcr, bit_WDTOE, 0);
563 wdtcr->toe_cb = NULL;
564 return CB_RET_REMOVE;
567 return CB_RET_RETAIN;
581 static uint8_t rampz_read (VDevice *dev,
int addr);
582 static void rampz_write (VDevice *dev,
int addr, uint8_t val);
583 static void rampz_reset (VDevice *dev);
586 rampz_create (
int addr,
char *name,
int rel_addr,
void *data)
588 return (VDevice *)rampz_new ();
597 rampz_construct (rampz);
604 rampz_construct (RAMPZ *rampz)
609 vdev_construct ((VDevice *)rampz, rampz_read, rampz_write, rampz_reset,
616 rampz_destroy (
void *rampz)
625 rampz_get (RAMPZ *rampz)
631 rampz_set (RAMPZ *rampz, uint8_t val)
637 rampz_read (VDevice *dev,
int addr)
639 return rampz_get ((RAMPZ *)dev);
643 rampz_write (VDevice *dev,
int addr, uint8_t val)
645 rampz_set ((RAMPZ *)dev, val);
649 rampz_reset (VDevice *dev)
652 ((RAMPZ *)dev)->reg = 0;
#define avr_new(type, count)
Macro for allocating memory.
uint64_t get_program_time(void)
Return the number of milliseconds of elapsed program time.
void avr_core_async_cb_add(AvrCore *core, CallBack *cb)
Add a new asynchronous callback to list.
void vdev_def_AddAddr(VDevice *dev, int addr, char *name, int related_addr, void *data)
Default AddAddr method.
void vdev_destroy(void *dev)
Destructor for a VDevice.
void avr_core_irq_raise(AvrCore *core, unsigned int irq)
Raises an irq by adding it's data to the irq_pending list.
AvrClass * vdev_get_core(VDevice *dev)
Get the core field.
uint8_t set_bit_in_byte(uint8_t src, int bit, int val)
Set a bit in src to 1 if val != 0, clears bit if val == 0.
#define avr_warning(fmt, args...)
Print a warning message to stderr.
void vdev_construct(VDevice *dev, VDevFP_Read rd, VDevFP_Write wr, VDevFP_Reset reset, VDevFP_AddAddr add_addr)
Constructor for a VDevice.
#define avr_error(fmt, args...)
Print an error message to stderr and terminate program.
void avr_core_clk_cb_add(AvrCore *core, CallBack *cb)
Add a new clock callback to list.
void display_io_reg(int reg, uint8_t val)
Update an IO register in the display.
void class_overload_destroy(AvrClass *klass, AvrClassFP_Destroy destroy)
Overload the default destroy method.