#include <stdio.h>
#include <string.h>
#include <unistd.h>
+#include <stdarg.h>
#include "sim_avr.h"
#include "sim_core.h"
#include "sim_time.h"
#define AVR_KIND_DECL
#include "sim_core_decl.h"
+void std_logger(const int level, const char * format, ... );
+logger_t global_logger = std_logger;
+
int avr_init(avr_t * avr)
{
avr->flash = malloc(avr->flashend + 1);
avr->trace_data = calloc(1, sizeof(struct avr_trace_data_t));
#endif
- printf("%s init\n", avr->mmcu);
+ AVR_LOG(avr, LOG_TRACE, "%s init\n", avr->mmcu);
// cpu is in limbo before init is finished.
avr->state = cpu_Limbo;
void avr_reset(avr_t * avr)
{
- printf("%s reset\n", avr->mmcu);
+ AVR_LOG(avr, LOG_TRACE, "%s reset\n", avr->mmcu);
memset(avr->data, 0x0, avr->ramend + 1);
_avr_sp_set(avr, avr->ramend);
void avr_sadly_crashed(avr_t *avr, uint8_t signal)
{
- printf("%s\n", __FUNCTION__);
+ AVR_LOG(avr, LOG_ERROR, "%s\n", __FUNCTION__);
avr->state = cpu_Stopped;
if (avr->gdb_port) {
// enable gdb server, and wait
static void _avr_io_command_write(struct avr_t * avr, avr_io_addr_t addr, uint8_t v, void * param)
{
- printf("%s %02x\n", __FUNCTION__, v);
+ AVR_LOG(avr, LOG_TRACE, "%s %02x\n", __FUNCTION__, v);
switch (v) {
case SIMAVR_CMD_VCD_START_TRACE:
if (avr->vcd)
avr_irq_t * src = avr_io_getirq(avr, AVR_IOCTL_UART_GETIRQ('0'), UART_IRQ_OUTPUT);
avr_irq_t * dst = avr_io_getirq(avr, AVR_IOCTL_UART_GETIRQ('0'), UART_IRQ_INPUT);
if (src && dst) {
- printf("%s activating uart local echo IRQ src %p dst %p\n", __FUNCTION__, src, dst);
+ AVR_LOG(avr, LOG_TRACE, "%s activating uart local echo IRQ src %p dst %p\n", __FUNCTION__, src, dst);
avr_connect_irq(src, dst);
}
} break;
if (v == '\r' && buf) {
buf[len] = 0;
- printf("O:" "%s" "" "\n", buf);
+ AVR_LOG(avr, LOG_TRACE, "O:" "%s" "" "\n", buf);
fflush(stdout);
len = 0;
return;
void avr_loadcode(avr_t * avr, uint8_t * code, uint32_t size, avr_flashaddr_t address)
{
if (size > avr->flashend+1) {
- fprintf(stderr, "avr_loadcode(): Attempted to load code of size %d but flash size is only %d.\n",
+ AVR_LOG(avr, LOG_ERROR, "avr_loadcode(): Attempted to load code of size %d but flash size is only %d.\n",
size, avr->flashend+1);
abort();
}
if (avr->state == cpu_Sleeping) {
if (!avr->sreg[S_I]) {
if (avr->log)
- printf("simavr: sleeping with interrupts off, quitting gracefully\n");
+ AVR_LOG(avr, LOG_TRACE, "simavr: sleeping with interrupts off, quitting gracefully\n");
avr->state = cpu_Done;
return;
}
if (avr->state == cpu_Sleeping) {
if (!avr->sreg[S_I]) {
if (avr->log)
- printf("simavr: sleeping with interrupts off, quitting gracefully\n");
+ AVR_LOG(avr, LOG_TRACE, "simavr: sleeping with interrupts off, quitting gracefully\n");
avr->state = cpu_Done;
return;
}
}
}
if (!maker) {
- fprintf(stderr, "%s: AVR '%s' not known\n", __FUNCTION__, name);
+ AVR_LOG(((avr_t*)0), LOG_ERROR, "%s: AVR '%s' not known\n", __FUNCTION__, name);
return NULL;
}
avr_t * avr = maker->make();
- printf("Starting %s - flashend %04x ramend %04x e2end %04x\n", avr->mmcu, avr->flashend, avr->ramend, avr->e2end);
+ AVR_LOG(avr, LOG_TRACE, "Starting %s - flashend %04x ramend %04x e2end %04x\n", avr->mmcu, avr->flashend, avr->ramend, avr->e2end);
return avr;
}
+void std_logger(const int level, const char * format, ... ) {
+ va_list args;
+ va_start(args, format);
+ vfprintf((level > LOG_ERROR) ? stdout : stderr , format, args);
+ va_end(args);
+}
+
+
avr->vcd,
firmware->traceperiod >= 1000 ? firmware->traceperiod : 1000);
- printf("Creating VCD trace file '%s'\n", avr->vcd->filename);
+ AVR_LOG(avr, LOG_TRACE, "Creating VCD trace file '%s'\n", avr->vcd->filename);
for (int ti = 0; ti < firmware->tracecount; ti++) {
if (firmware->trace[ti].mask == 0xff || firmware->trace[ti].mask == 0) {
// easy one
uint8_t mask = src[0];
uint16_t addr = src[1] | (src[2] << 8);
char * name = (char*)src + 3;
- printf("AVR_MMCU_TAG_VCD_TRACE %04x:%02x - %s\n", addr, mask, name);
+ AVR_LOG(((avr_t*)0), LOG_TRACE, "AVR_MMCU_TAG_VCD_TRACE %04x:%02x - %s\n", addr, mask, name);
firmware->trace[firmware->tracecount].mask = mask;
firmware->trace[firmware->tracecount].addr = addr;
strncpy(firmware->trace[firmware->tracecount].name, name,
if ((fd = open(file, O_RDONLY | O_BINARY)) == -1 ||
(read(fd, &elf_header, sizeof(elf_header))) < sizeof(elf_header)) {
- printf("could not read %s\n", file);
+ AVR_LOG(((avr_t*)0), LOG_ERROR, "could not read %s\n", file);
perror(file);
close(fd);
return -1;
// hdump("code", data_text->d_buf, data_text->d_size);
memcpy(firmware->flash + offset, data_text->d_buf, data_text->d_size);
offset += data_text->d_size;
- printf("Loaded %u .text\n", (unsigned int)data_text->d_size);
+ AVR_LOG(((avr_t*)0), LOG_TRACE, "Loaded %u .text\n", (unsigned int)data_text->d_size);
}
if (data_data) {
// hdump("data", data_data->d_buf, data_data->d_size);
memcpy(firmware->flash + offset, data_data->d_buf, data_data->d_size);
- printf("Loaded %u .data\n", (unsigned int)data_data->d_size);
+ AVR_LOG(((avr_t*)0), LOG_TRACE, "Loaded %u .data\n", (unsigned int)data_data->d_size);
offset += data_data->d_size;
firmware->datasize = data_data->d_size;
}
// hdump("eeprom", data_ee->d_buf, data_ee->d_size);
firmware->eeprom = malloc(data_ee->d_size);
memcpy(firmware->eeprom, data_ee->d_buf, data_ee->d_size);
- printf("Loaded %u .eeprom\n", (unsigned int)data_ee->d_size);
+ AVR_LOG(((avr_t*)0), LOG_TRACE, "Loaded %u .eeprom\n", (unsigned int)data_ee->d_size);
firmware->eesize = data_ee->d_size;
}
// hdump("flash", avr->flash, offset);