/* * Copyright (C) 2010 Tobias Klauser * Copyright (C) 2010 chysun2000@gmail.com * * This file is part of nios2sim-ng. * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. */ #include #include "nios2sim-ng.h" #include "device.h" #include "uart.h" #include "jtag_uart.h" static struct device *devices[] = { &uart_core, &jtag_uart_core, }; #define DEVICES_COUNT ARRAY_SIZE(devices) bool device_generic_is_dev_addr(struct device *dev, uint32_t addr) { if (addr >= dev->base && addr < dev->base + dev->size) return true; return false; } int device_init_all(void) { unsigned int i; int ret = 0; for (i = 0; i < DEVICES_COUNT; i++) { struct device *dev = devices[i]; if (unlikely(dev->init == NULL)) continue; ret = dev->init(dev); if (ret) { err("Failed to initialize device '%s'\n", dev->name); break; } if (dev->is_dev_addr == NULL) dev->is_dev_addr = device_generic_is_dev_addr; vinfo("%s at 0x%08x - 0x%08x\n", dev->name, dev->base, (uint32_t)(dev->base + dev->size)); } return ret; } /** * Get device mapped at a specific address. * * @param addr address to get the mapped device for * @return pointer to the device mapped at addr, NULL if no device is * mapped there */ struct device *device_get_by_addr(uint32_t addr) { unsigned int i; struct device *dev = NULL; for (i = 0; i < DEVICES_COUNT; i++) { dev = devices[i]; if (unlikely(dev->is_dev_addr == NULL)) continue; if (dev->is_dev_addr(dev, addr)) return dev; } return NULL; } void device_simulate_all(void) { unsigned int i; struct device *dev; for (i = 0; i < DEVICES_COUNT; i++) { dev = devices[i]; if (likely(dev->simulate != NULL)) dev->simulate(dev); } } void io_register_init(struct io_register *reg, uint32_t addr, uint32_t valid, uint32_t readonly, uint32_t value) { reg->addr = addr; reg->valid_mask = valid; reg->readonly_mask = readonly; reg->value = value; } uint32_t io_register_read(struct io_register *reg) { return reg->value & reg->valid_mask; } void io_register_write(struct io_register *reg, uint32_t value) { reg->value = value & ~(reg->readonly_mask); }