On Sun, Jul 5, 2015 at 11:14 PM, Serge Vakulenko <serge.vakule...@gmail.com> wrote: > Data definitions and function declarations for simulation > of pic32 microcontrollers. > > Signed-off-by: Serge Vakulenko <serge.vakule...@gmail.com> > --- > hw/mips/pic32_peripherals.h | 210 > ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 210 insertions(+) > create mode 100644 hw/mips/pic32_peripherals.h > > diff --git a/hw/mips/pic32_peripherals.h b/hw/mips/pic32_peripherals.h > new file mode 100644 > index 0000000..4435991 > --- /dev/null > +++ b/hw/mips/pic32_peripherals.h > @@ -0,0 +1,210 @@ > +/* > + * Define memory map for PIC32 microcontroller. > + * > + * Copyright (C) 2015 Serge Vakulenko > + * > + * Permission to use, copy, modify, and distribute this software > + * and its documentation for any purpose and without fee is hereby > + * granted, provided that the above copyright notice appear in all > + * copies and that both that the copyright notice and this > + * permission notice and warranty disclaimer appear in supporting > + * documentation, and that the name of the author not be used in > + * advertising or publicity pertaining to distribution of the > + * software without specific, written prior permission. > + * > + * The author disclaim all warranties with regard to this > + * software, including all implied warranties of merchantability > + * and fitness. In no event shall the author be liable for any > + * special, indirect or consequential damages or any damages > + * whatsoever resulting from loss of use, data or profits, whether > + * in an action of contract, negligence or other tortious action, > + * arising out of or in connection with the use or performance of > + * this software. > + */ > +#include "hw/sysbus.h" /* SysBusDevice */ > +#include "net/net.h" > + > +#define IO_MEM_SIZE (1024*1024) /* 1 Mbyte */ > + > +typedef struct _uart_t uart_t; > +typedef struct _spi_t spi_t; > +typedef struct _sdcard_t sdcard_t; > +typedef struct _pic32_t pic32_t; > +typedef struct _eth_t eth_t; > + > +/* > + * UART private data. > + */ > +struct _uart_t {
All typenames must be CamelCase. scripts/checkpatch.pl should catch these. > + pic32_t *mcu; /* back pointer to pic32 object */ > + unsigned irq; /* interrupt number */ > + int oactive; /* output active */ > + unsigned sta; /* UxSTA address */ > + unsigned mode; /* UxMODE address */ > + unsigned rxbyte; /* received byte */ > + CharDriverState *chr; /* pointer to serial_hds[i] */ > + QEMUTimer *transmit_timer; /* needed to delay TX interrupt */ > +}; > + > +/* > + * SPI private data. > + */ > +struct _spi_t { > + unsigned buf[4]; /* transmit and receive buffer */ > + unsigned rfifo; /* read fifo counter */ > + unsigned wfifo; /* write fifo counter */ > + unsigned irq; /* interrupt numbers */ > + unsigned con; /* SPIxCON address */ > + unsigned stat; /* SPIxSTAT address */ > +}; > + > +/* > + * SD card private data. > + */ > +struct _sdcard_t { > + const char *name; /* Device name */ > + unsigned gpio_port; /* GPIO port number of CS0 signal */ > + unsigned gpio_cs; /* GPIO pin mask of CS0 signal */ > + unsigned kbytes; /* Disk size */ > + int unit; /* Index (sd0 or sd1) */ > + int fd; /* Image file */ > + int select; /* Selected */ > + int read_multiple; /* Read-multiple mode */ > + unsigned blen; /* Block length */ > + unsigned wbecnt; /* Write block erase count */ > + unsigned offset; /* Read/write offset */ > + unsigned count; /* Byte count */ > + unsigned limit; /* Reply length */ > + unsigned char buf[1024 + 16]; > +}; > + > +/* > + * PIC32 data structure. > + */ > +struct _pic32_t { > + SysBusDevice parent_obj; > + MIPSCPU *cpu; /* back pointer to cpu object */ > + uint32_t *iomem; /* backing storage for I/O area */ > + > + int board_type; /* board variant */ > + int stop_on_reset; /* halt simulation on soft reset */ > + unsigned syskey_unlock; /* syskey state */ > + > +#define NUM_UART 6 /* number of UART ports */ > + uart_t uart[NUM_UART]; /* UART data */ > + > +#define NUM_SPI 6 /* max number of SPI ports */ > + spi_t spi[NUM_SPI]; /* SPI data */ > + > + unsigned sdcard_spi_port; /* SPI port number of SD card */ > + sdcard_t sdcard[2]; /* SD card data */ sd-cards will be off chip. Instead a higher (board?) level should define the SD cards and the connections. Regards, Peter > + > + DeviceState *eth_dev; /* Ethernet device */ > + eth_t *eth; /* Ethernet driver data */ > + > + void (*irq_raise)(pic32_t *s, int irq); /* set interrupt request */ > + void (*irq_clear)(pic32_t *s, int irq); /* clear interrupt request */ > +}; > + > +/* > + * GPIO routines. > + */ > +void pic32_gpio_write(pic32_t *s, int unit, unsigned val); > + > +/* > + * UART routines. > + */ > +void pic32_uart_init(pic32_t *s, int unit, int irq, int sta, int mode); > +unsigned pic32_uart_get_char(pic32_t *s, int unit); > +void pic32_uart_put_char(pic32_t *s, int unit, unsigned char data); > +void pic32_uart_poll_status(pic32_t *s, int unit); > +void pic32_uart_update_mode(pic32_t *s, int unit); > +void pic32_uart_update_status(pic32_t *s, int unit); > + > +/* > + * SPI routines. > + */ > +void pic32_spi_init(pic32_t *s, int unit, int irq, int con, int stat); > +void pic32_spi_control(pic32_t *s, int unit); > +unsigned pic32_spi_readbuf(pic32_t *s, int unit); > +void pic32_spi_writebuf(pic32_t *s, int unit, unsigned val); > + > +/* > + * SD card routines. > + */ > +void pic32_sdcard_init(pic32_t *s, int unit, const char *name, > + const char *filename, int cs_port, int cs_pin); > +void pic32_sdcard_reset(pic32_t *s); > +void pic32_sdcard_select(pic32_t *s, int unit, int on); > +unsigned pic32_sdcard_io(pic32_t *s, unsigned data); > + > +/* > + * Ethernet routines. > + */ > +void pic32_eth_init(pic32_t *s, NICInfo *nd); > +void pic32_eth_control(pic32_t *s); > +void pic32_mii_command(pic32_t *s); > +void pic32_mii_write(pic32_t *s); > + > +/* > + * Load a binary file in hex or srec format. > + */ > +int pic32_load_hex_file(const char *filename, > + void (*store_byte)(unsigned address, unsigned char byte)); > + > +/* > + * Helper defines for i/o switch. > + */ > +#define VALUE(name) (s->iomem[(name & 0xfffff) >> 2]) > + > +#define STORAGE(name) case name:\ > + *namep = #name; > + > +#define READONLY(name) case name:\ > + *namep = #name;\ > + goto readonly > + > +#define WRITEOP(name) case name:\ > + *namep = #name;\ > + goto op_##name;\ > + case name+4:\ > + *namep = #name"CLR";\ > + goto op_##name;\ > + case name+8:\ > + *namep = #name"SET";\ > + goto op_##name;\ > + case name+12:\ > + *namep = #name"INV";\ > + op_##name: \ > + VALUE(name) = write_op(VALUE(name), data, offset) > + > +#define WRITEOPX(name, label) \ > + case name:\ > + *namep = #name;\ > + goto op_##label;\ > + case name+4:\ > + *namep = #name"CLR";\ > + goto op_##label;\ > + case name+8:\ > + *namep = #name"SET";\ > + goto op_##label;\ > + case name+12:\ > + *namep = #name"INV";\ > + goto op_##label > + > +#define WRITEOPR(name, romask) \ > + case name:\ > + *namep = #name;\ > + goto op_##name;\ > + case name+4:\ > + *namep = #name"CLR";\ > + goto op_##name;\ > + case name+8:\ > + *namep = #name"SET";\ > + goto op_##name;\ > + case name+12:\ > + *namep = #name"INV";\ > + op_##name: \ > + VALUE(name) = (VALUE(name) & (romask)) |\ > + (write_op(VALUE(name), data, offset) &\ > + ~(romask)) > -- > 2.2.2 > >