Update the Netduino 2 Machine
v7 cover Update the Netduino 2 Machine
This patchset continues with the Netduino 2 and STM32F205 SoC work.
This patch series makes a small change to the STM32F2xx SoC to tidy up the code.
Next a feature is added to the STM32F2xx timer to display the PWM duty cycle, when debugging is enabled.
Then the STM32F2xx SPI and ADC devices are added and connected to the STM32F205 SoC.
Finally the maintainers file is updated to add myself as the maintainer for the Netdunio 2 and STM32F2xx.
V7:
- Convert the OR IRQ device to use the init/realise functions
V6:
- Add vmstate to the new OR IRQ device
V5:
- Add a irq ORing function
V4:
- Add VMState to the new devices
- Remove rand() function
V3:
- Rebase
V2:
- Update based on Peter C's coments
- Rebase
- Create an ADC folder for the ADC device
Alistair Francis (8):
STM32F205: Remove the individual device variables
STM32F2xx: Display PWM duty cycle from timer
STM32F2xx: Add the ADC device
STM32F2xx: Add the SPI device
irq: Add a new irq device that allows the ORing of lines
STM32F205: Connect the ADC devices
STM32F205: Connect the SPI devices
MAINTAINERS: Add Alistair to the maintainers list
MAINTAINERS | 15 ++ default-configs/arm-softmmu.mak | 2 + hw/Makefile.objs | 1 + hw/adc/Makefile.objs | 1 + hw/adc/stm32f2xx_adc.c | 306 ++++++++++++++++++++++++++++++++++++++++ hw/arm/stm32f205_soc.c | 93 +++++++++--- hw/core/Makefile.objs | 1 + hw/core/or-irq.c | 117 +++++++++++++++ hw/ssi/Makefile.objs | 1 + hw/ssi/stm32f2xx_spi.c | 225 +++++++++++++++++++++++++++++ hw/timer/stm32f2xx_timer.c | 9 ++ include/hw/adc/stm32f2xx_adc.h | 87 ++++++++++++ include/hw/arm/stm32f205_soc.h | 9 ++ include/hw/or-irq.h | 46 ++++++ include/hw/ssi/stm32f2xx_spi.h | 72 ++++++++++ 15 files changed, 967 insertions(+), 18 deletions(-) create mode 100644 hw/adc/Makefile.objs create mode 100644 hw/adc/stm32f2xx_adc.c create mode 100644 hw/core/or-irq.c create mode 100644 hw/ssi/stm32f2xx_spi.c create mode 100644 include/hw/adc/stm32f2xx_adc.h create mode 100644 include/hw/or-irq.h create mode 100644 include/hw/ssi/stm32f2xx_spi.h
Signature · 1 line
2.7.4
PATCH v7 1/8 STM32F205: Remove the individual device variables
Cleanup the individual DeviceState and SysBusDevice variables to re-use the same variable for each device.
---
hw/arm/stm32f205_soc.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-)
hw/arm/stm32f205_soc.c +17 -18
@@ -62,8 +62,8 @@ static void stm32f205_soc_initfn(Object *obj)static void stm32f205_soc_realize (DeviceState *dev_soc,Error **errp) {STM32F205State *s =STM32F205_SOC (dev_soc); -DeviceState *syscfgdev, *usartdev, *timerdev, *nvic; -SysBusDevice *syscfgbusdev, *usartbusdev, *timerbusdev; +DeviceState *dev, *nvic; +SysBusDevice *busdev;Error *err =NULL ;int i;
@@ -94,44 +94,43 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp) s->kernel_filename, s->cpu_model);/* System configuration controller */ - syscfgdev =DEVICE (&s->syscfg); + dev =DEVICE (&s->syscfg);object_property_set_bool (OBJECT (&s->syscfg), true,"realized" , &err);if (err !=NULL ) {error_propagate (errp, err);return ; } - syscfgbusdev =SYS_BUS_DEVICE (syscfgdev); -sysbus_mmio_map (syscfgbusdev,0 ,0x40013800 ); -sysbus_connect_irq (syscfgbusdev,0 ,qdev_get_gpio_in (nvic,71 )); + busdev =SYS_BUS_DEVICE (dev); +sysbus_mmio_map (busdev,0 ,0x40013800 ); +sysbus_connect_irq (busdev,0 ,qdev_get_gpio_in (nvic,71 ));/* Attach UART (uses USART registers) and USART controllers */ for (i =0 ; i <STM_NUM_USARTS ; i++) { - usartdev =DEVICE (&(s->usart[i])); -qdev_prop_set_chr (usartdev,"chardev" , i <MAX_SERIAL_PORTS ? serial_hds[i] :NULL ); + dev =DEVICE (&(s->usart[i])); +qdev_prop_set_chr (dev,"chardev" , + i <MAX_SERIAL_PORTS ? serial_hds[i] :NULL );object_property_set_bool (OBJECT (&s->usart[i]), true,"realized" , &err);if (err !=NULL ) {error_propagate (errp, err);return ; } - usartbusdev =SYS_BUS_DEVICE (usartdev); -sysbus_mmio_map (usartbusdev,0 , usart_addr[i]); -sysbus_connect_irq (usartbusdev,0 , -qdev_get_gpio_in (nvic, usart_irq[i])); + busdev =SYS_BUS_DEVICE (dev); +sysbus_mmio_map (busdev,0 , usart_addr[i]); +sysbus_connect_irq (busdev,0 ,qdev_get_gpio_in (nvic, usart_irq[i])); }/* Timer 2 to 5 */ for (i =0 ; i <STM_NUM_TIMERS ; i++) { - timerdev =DEVICE (&(s->timer[i])); -qdev_prop_set_uint64 (timerdev,"clock-frequency" ,1000000000 ); + dev =DEVICE (&(s->timer[i])); +qdev_prop_set_uint64 (dev,"clock-frequency" ,1000000000 );object_property_set_bool (OBJECT (&s->timer[i]), true,"realized" , &err);if (err !=NULL ) {error_propagate (errp, err);return ; } - timerbusdev =SYS_BUS_DEVICE (timerdev); -sysbus_mmio_map (timerbusdev,0 , timer_addr[i]); -sysbus_connect_irq (timerbusdev,0 , -qdev_get_gpio_in (nvic, timer_irq[i])); + busdev =SYS_BUS_DEVICE (dev); +sysbus_mmio_map (busdev,0 , timer_addr[i]); +sysbus_connect_irq (busdev,0 ,qdev_get_gpio_in (nvic, timer_irq[i])); } }
Signature · 1 line
2.7.4
PATCH v7 2/8 STM32F2xx: Display PWM duty cycle from timer
In reply to Alistair FrancisIf correctly configured allow the STM32F2xx timer to print out the PWM duty cycle information.
---
V3:
- Use OR instead of + for masking
- Improve clarity of print statement
V2:
- Fix up if statement braces
- Remove stm32f2xx_timer_set_alarm() call
hw/timer/stm32f2xx_timer.c | 9 +++++++++ 1 file changed, 9 insertions(+)
hw/timer/stm32f2xx_timer.c +9 -0
@@ -51,6 +51,15 @@ static void stm32f2xx_timer_interrupt(void *opaque)qemu_irq_pulse (s->irq);stm32f2xx_timer_set_alarm (s, s->hit_time); } + +if (s->tim_ccmr1 & (TIM_CCMR1_OC2M2 |TIM_CCMR1_OC2M1 ) && + !(s->tim_ccmr1 &TIM_CCMR1_OC2M0 ) && + s->tim_ccmr1 &TIM_CCMR1_OC2PE && + s->tim_ccer &TIM_CCER_CC2E ) { +/* PWM 2 - Mode 1 */ +DB_PRINT ("PWM2 Duty Cycle: %d%%\n" , + s->tim_ccr2 / (100 * (s->tim_psc +1 ))); + } }static inline int64_t stm32f2xx_ns_to_ticks (STM32F2XXTimerState *s,int64_t t)
Signature · 1 line
2.7.4
PATCH v7 3/8 STM32F2xx: Add the ADC device
In reply to Alistair FrancisAdd the STM32F2xx ADC device. This device randomly generates values on each read.
This also includes creating a hw/adc directory.
---
V4:
- Remove the rand() function
- Add VMState
- Small cleanups
V2:
- Address Peter C's comments
- Create a ADC folder and move the file in there
- Move some of the registers into arrays
default-configs/arm-softmmu.mak | 1 + hw/Makefile.objs | 1 + hw/adc/Makefile.objs | 1 + hw/adc/stm32f2xx_adc.c | 306 ++++++++++++++++++++++++++++++++++++++++ include/hw/adc/stm32f2xx_adc.h | 87 ++++++++++++ 5 files changed, 396 insertions(+) create mode 100644 hw/adc/Makefile.objs create mode 100644 hw/adc/stm32f2xx_adc.c create mode 100644 include/hw/adc/stm32f2xx_adc.h
default-configs/arm-softmmu.mak +1 -0
@@ -87,6 +87,7 @@ CONFIG_ZYNQ=y CONFIG_STM32F2XX_TIMER=y CONFIG_STM32F2XX_USART=y CONFIG_STM32F2XX_SYSCFG=y +CONFIG_STM32F2XX_ADC=y CONFIG_STM32F205_SOC=y CONFIG_VERSATILE_PCI=y
hw/Makefile.objs +1 -0
@@ -1,5 +1,6 @@ devices-dirs-$(call land, $(CONFIG_VIRTIO),$(call land,$(CONFIG_VIRTFS),$(CONFIG_PCI))) += 9pfs/ devices-dirs-$(CONFIG_ACPI) += acpi/ +devices-dirs-$(CONFIG_SOFTMMU) += adc/ devices-dirs-$(CONFIG_SOFTMMU) += audio/ devices-dirs-$(CONFIG_SOFTMMU) += block/ devices-dirs-$(CONFIG_SOFTMMU) += bt/
hw/adc/Makefile.objs new file +1 -0
@@ -0,0 +1 @@ +obj-$(CONFIG_STM32F2XX_ADC) += stm32f2xx_adc.o
hw/adc/stm32f2xx_adc.c new file +306 -0
306 lines not on this page · raw message
include/hw/adc/stm32f2xx_adc.h new file +87 -0
87 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v7 4/8 STM32F2xx: Add the SPI device
In reply to Alistair FrancisAdd the STM32F2xx SPI device.
---
V4:
- Add VMState
- Small fixes
V2:
- Address Peter C's comments
default-configs/arm-softmmu.mak | 1 + hw/ssi/Makefile.objs | 1 + hw/ssi/stm32f2xx_spi.c | 225 ++++++++++++++++++++++++++++++++++++++++ include/hw/ssi/stm32f2xx_spi.h | 72 +++++++++++++ 4 files changed, 299 insertions(+) create mode 100644 hw/ssi/stm32f2xx_spi.c create mode 100644 include/hw/ssi/stm32f2xx_spi.h
default-configs/arm-softmmu.mak +1 -0
@@ -88,6 +88,7 @@ CONFIG_STM32F2XX_TIMER=y CONFIG_STM32F2XX_USART=y CONFIG_STM32F2XX_SYSCFG=y CONFIG_STM32F2XX_ADC=y +CONFIG_STM32F2XX_SPI=y CONFIG_STM32F205_SOC=y CONFIG_VERSATILE_PCI=y
hw/ssi/Makefile.objs +1 -0
@@ -3,6 +3,7 @@ common-obj-$(CONFIG_SSI) += ssi.o common-obj-$(CONFIG_XILINX_SPI) += xilinx_spi.o common-obj-$(CONFIG_XILINX_SPIPS) += xilinx_spips.o common-obj-$(CONFIG_ASPEED_SOC) += aspeed_smc.o +common-obj-$(CONFIG_STM32F2XX_SPI) += stm32f2xx_spi.o obj-$(CONFIG_OMAP) += omap_spi.o obj-$(CONFIG_IMX) += imx_spi.o
hw/ssi/stm32f2xx_spi.c new file +225 -0
225 lines not on this page · raw message
include/hw/ssi/stm32f2xx_spi.h new file +72 -0
72 lines not on this page · raw message
Signature · 1 line
2.7.4
PATCH v7 5/8 irq: Add a new irq device that allows the ORing of lines
In reply to Alistair Francis---
As the migration framework is not included in user mode this needs to be a new file.
V7:
- Use the standard QEMU init/realise functions
V6:
- Make the OR IRQ device a TYPE_DEVICE
- Add vmstate
hw/core/Makefile.objs | 1 + hw/core/or-irq.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++ include/hw/or-irq.h | 46 ++++++++++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 hw/core/or-irq.c create mode 100644 include/hw/or-irq.h
hw/core/Makefile.objs +1 -0
@@ -16,4 +16,5 @@ common-obj-$(CONFIG_SOFTMMU) += null-machine.o common-obj-$(CONFIG_SOFTMMU) += loader.o common-obj-$(CONFIG_SOFTMMU) += qdev-properties-system.o common-obj-$(CONFIG_SOFTMMU) += register.o +common-obj-$(CONFIG_SOFTMMU) += or-irq.o common-obj-$(CONFIG_PLATFORM_BUS) += platform-bus.o
hw/core/or-irq.c new file +117 -0
117 lines not on this page · raw message
include/hw/or-irq.h new file +46 -0
46 lines not on this page · raw message
Signature · 1 line
2.7.4
Re: [Qemu-devel] [PATCH v7 5/8] irq: Add a new irq device that allows the ORing of lines
Quoted 26 lines · Alistair Francis
Signed-off-by Alistair Francis <[email protected]>---
As the migration framework is not included in user mode this needs to be a new file.V7:
- Use the standard QEMU init/realise functions
V6:
- Make the OR IRQ device aTYPE_DEVICE
- Add vmstatehw/core/or-irq.c new file +16
-0+static void or_irq_handler (void *opaque,int n,int level) +{ +qemu_or_irq *s =OR_IRQ (opaque); +int or_level =0 ; +int i; + + s->levels[n] = level; + +for (i =0 ; i < s->num_lines; i++) { + or_level |= s->levels[i]; + } + +qemu_set_irq (s->out_irq, or_level); +} + +static void or_irq_reset (DeviceState *dev)
hw/core/or-irq.c line 60
Quoted 10 lines
hw/core/or-irq.c new file +10
-0+{ +qemu_or_irq *s =OR_IRQ (dev); +int i; + +for (i =0 ; i <MAX_OR_LINES ; i++) { + s->levels[i] = false; + } + +/* Trigger an update of the out irqs. We just set the level to 0 */ +or_irq_handler (s,0 ,0 );
Changing an output qdev IRQ line on reset() is generally not recommended. Is it necessary here?
include/hw/or-irq.h line 31
Quoted 7 lines
include/hw/or-irq.h new file +7
-0+#include "hw/irq.h" +#include "hw/sysbus.h" +#include "qom/object.h" + +#define TYPE_OR_IRQ "or-irq" + +#define MAX_OR_LINES 16
This is a slightly arbitrary limit, but it's bigger than anybody's really likely to need and there's a forward compatible path for migration if we need to support larger sizes in future, so it's OK. (if num_lines > 16 you would dynamically allocate a levels array and migrate it with a migration subsection that's only present if the num_lines property is >16)
Quoted 4 lines
include/hw/or-irq.h new file +4
-0+typedef struct OrIRQState qemu_or_irq ; + +#define OR_IRQ (obj) OBJECT_CHECK(qemu_or_irq, (obj), TYPE_OR_IRQ) +
include/hw/or-irq.h line 46
Quoted 10 lines
include/hw/or-irq.h new file +10
-0+struct OrIRQState { +DeviceState parent_obj; + +qemu_irq out_irq; +qemu_irq *in_irqs; +bool levels[MAX_OR_LINES ]; +uint16_t num_lines; +}; + +qemu_irq *qemu_get_or_irqs (DeviceState *dev);
Why this rather than defining the input lines with qdev_init_gpio_in() so the users can use qdev_get_gpio_in() ?
thanks
-- PMM
Re: [Qemu-devel] [PATCH v7 5/8] irq: Add a new irq device that allows the ORing of lines
Quoted 32 lines · Peter Maydell
Quoted 31 lines · Alistair Francis
Signed-off-by Alistair Francis <[email protected]>---
As the migration framework is not included in user mode this needs to be a new file.V7:
- Use the standard QEMU init/realise functions
V6:
- Make the OR IRQ device aTYPE_DEVICE
- Add vmstatehw/core/or-irq.c new file +21
-0+static void or_irq_handler (void *opaque,int n,int level) +{ +qemu_or_irq *s =OR_IRQ (opaque); +int or_level =0 ; +int i; + + s->levels[n] = level; + +for (i =0 ; i < s->num_lines; i++) { + or_level |= s->levels[i]; + } + +qemu_set_irq (s->out_irq, or_level); +} + +static void or_irq_reset (DeviceState *dev) +{ +qemu_or_irq *s =OR_IRQ (dev); +int i; + +for (i =0 ; i <MAX_OR_LINES ; i++) {
Quoted 8 lines
hw/core/or-irq.c line 60
Quoted 5 lines
hw/core/or-irq.c new file +5
-0+ s->levels[i] = false; + } + +/* Trigger an update of the out irqs. We just set the level to 0 */ +or_irq_handler (s,0 ,0 );Changing an output qdev IRQ line on
reset()is generally not recommended. Is it necessary here?
No, it isn't necessary. I have removed it.
Quoted 25 lines
include/hw/or-irq.h line 31
Quoted 8 lines
include/hw/or-irq.h new file +7
-0+#include "hw/irq.h" +#include "hw/sysbus.h" +#include "qom/object.h" + +#define TYPE_OR_IRQ "or-irq" + +#define MAX_OR_LINES 16This is a slightly arbitrary limit, but it's bigger than anybody's really likely to need and there's a forward compatible path for migration if we need to support larger sizes in future, so it's OK. (if
num_lines> 16 you would dynamically allocate a levels array and migrate it with a migration subsection that's only present if thenum_linesproperty is >16)Quoted 9 lines
include/hw/or-irq.h new file +9
-0+typedef struct OrIRQState qemu_or_irq ; + +#define OR_IRQ (obj) OBJECT_CHECK(qemu_or_irq, (obj), TYPE_OR_IRQ) + +struct OrIRQState { +DeviceState parent_obj; + +qemu_irq out_irq; +qemu_irq *in_irqs;
Quoted 8 lines
include/hw/or-irq.h line 46
Quoted 5 lines
include/hw/or-irq.h new file +5
-0+bool levels[MAX_OR_LINES ]; +uint16_t num_lines; +}; + +qemu_irq *qemu_get_or_irqs (DeviceState *dev);Why this rather than defining the input lines with
qdev_init_gpio_in()so the users can useqdev_get_gpio_in()?
I was worried that I couldn't create the interrupts in the realise function, but it seems to work.
Thanks,
Alistair
Quoted 3 lines
thanks
-- PMM
PATCH v7 6/8 STM32F205: Connect the ADC devices
In reply to Alistair FrancisConnect the ADC devices to the STM32F205 SoC.
---
V7:
- Create the new ADC device
V5:
- Use the new irq ORing function
V4:
- Connect all the interrupt lines correctly
V2:
- Fix up the device/devices commit message
hw/arm/stm32f205_soc.c | 36 ++++++++++++++++++++++++++++++++++++ include/hw/arm/stm32f205_soc.h | 6 ++++++ 2 files changed, 42 insertions(+)
hw/arm/stm32f205_soc.c +36 -0
@@ -34,9 +34,12 @@ static const uint32_t timer_addr[STM_NUM_TIMERS] = { 0x40000000, 0x40000400, 0x40000800, 0x40000C00 };static const uint32_t usart_addr[STM_NUM_USARTS ] = {0x40011000 ,0x40004400 ,0x40004800 ,0x40004C00 ,0x40005000 ,0x40011400 }; +static const uint32_t adc_addr[STM_NUM_ADCS ] = {0x40012000 ,0x40012100 , +0x40012200 };static const int timer_irq[STM_NUM_TIMERS ] = {28 ,29 ,30 ,50 };static const int usart_irq[STM_NUM_USARTS ] = {37 ,38 ,39 ,52 ,53 ,71 }; +#define ADC_IRQ 18static void stm32f205_soc_initfn (Object *obj) {
@@ -57,6 +60,14 @@ static void stm32f205_soc_initfn(Object *obj) TYPE_STM32F2XX_TIMER);qdev_set_parent_bus (DEVICE (&s->timer[i]),sysbus_get_default ()); } + + s->adc_irqs =OR_IRQ (object_new (TYPE_OR_IRQ )); + +for (i =0 ; i <STM_NUM_ADCS ; i++) { +object_initialize (&s->adc[i],sizeof (s->adc[i]), +TYPE_STM32F2XX_ADC ); +qdev_set_parent_bus (DEVICE (&s->adc[i]),sysbus_get_default ()); + } }static void stm32f205_soc_realize (DeviceState *dev_soc,Error **errp)
@@ -64,6 +75,7 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)STM32F205State *s =STM32F205_SOC (dev_soc);DeviceState *dev, *nvic;SysBusDevice *busdev; +qemu_irq *gic_adc_irq_arr;Error *err =NULL ;int i;
@@ -132,6 +144,30 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)sysbus_mmio_map (busdev,0 , timer_addr[i]);sysbus_connect_irq (busdev,0 ,qdev_get_gpio_in (nvic, timer_irq[i])); } + +/* ADC 1 to 3 */ +object_property_set_int (OBJECT (s->adc_irqs),STM_NUM_ADCS , +"num-lines" , &err); +object_property_set_bool (OBJECT (s->adc_irqs), true,"realized" , &err); +if (err !=NULL ) { +error_propagate (errp, err); +return ; + } +qdev_connect_gpio_out (DEVICE (s->adc_irqs),0 , +qdev_get_gpio_in (nvic,ADC_IRQ )); + gic_adc_irq_arr =qemu_get_or_irqs (DEVICE (s->adc_irqs)); + +for (i =0 ; i <STM_NUM_ADCS ; i++) { + dev =DEVICE (&(s->adc[i])); +object_property_set_bool (OBJECT (&s->adc[i]), true,"realized" , &err); +if (err !=NULL ) { +error_propagate (errp, err); +return ; + } + busdev =SYS_BUS_DEVICE (dev); +sysbus_mmio_map (busdev,0 , adc_addr[i]); +sysbus_connect_irq (SYS_BUS_DEVICE (dev),0 , gic_adc_irq_arr[i]); + } }static Property stm32f205_soc_properties[] = {
include/hw/arm/stm32f205_soc.h +6 -0
@@ -28,6 +28,8 @@#include "hw/misc/stm32f2xx_syscfg.h" #include "hw/timer/stm32f2xx_timer.h" #include "hw/char/stm32f2xx_usart.h" +#include "hw/adc/stm32f2xx_adc.h" +#include "hw/or-irq.h" #define TYPE_STM32F205_SOC "stm32f205-soc"#define STM32F205_SOC (obj) \
@@ -35,6 +37,7 @@#define STM_NUM_USARTS 6#define STM_NUM_TIMERS 4 +#define STM_NUM_ADCS 3#define FLASH_BASE_ADDRESS 0x08000000#define FLASH_SIZE (1024 * 1024)
@@ -52,6 +55,9 @@ typedef struct STM32F205State {STM32F2XXSyscfgState syscfg;STM32F2XXUsartState usart[STM_NUM_USARTS ];STM32F2XXTimerState timer[STM_NUM_TIMERS ]; +STM32F2XXADCState adc[STM_NUM_ADCS ]; + + qemu_or_irq *adc_irqs; } STM32F205State;#endif
Signature · 1 line
2.7.4
PATCH v7 7/8 STM32F205: Connect the SPI devices
In reply to Alistair FrancisConnect the SPI devices to the STM32F205 SoC.
---
V2:
- Fix up the device/devices commit message
hw/arm/stm32f205_soc.c | 22 ++++++++++++++++++++++ include/hw/arm/stm32f205_soc.h | 3 +++ 2 files changed, 25 insertions(+)
hw/arm/stm32f205_soc.c +22 -0
@@ -36,10 +36,13 @@ static const uint32_t usart_addr[STM_NUM_USARTS] = { 0x40011000, 0x40004400, 0x40004800, 0x40004C00, 0x40005000, 0x40011400 };static const uint32_t adc_addr[STM_NUM_ADCS ] = {0x40012000 ,0x40012100 ,0x40012200 }; +static const uint32_t spi_addr[STM_NUM_SPIS ] = {0x40013000 ,0x40003800 , +0x40003C00 };static const int timer_irq[STM_NUM_TIMERS ] = {28 ,29 ,30 ,50 };static const int usart_irq[STM_NUM_USARTS ] = {37 ,38 ,39 ,52 ,53 ,71 };#define ADC_IRQ 18 +static const int spi_irq[STM_NUM_SPIS ] = {35 ,36 ,51 };static void stm32f205_soc_initfn (Object *obj) {
@@ -68,6 +71,12 @@ static void stm32f205_soc_initfn(Object *obj) TYPE_STM32F2XX_ADC);qdev_set_parent_bus (DEVICE (&s->adc[i]),sysbus_get_default ()); } + +for (i =0 ; i <STM_NUM_SPIS ; i++) { +object_initialize (&s->spi[i],sizeof (s->spi[i]), +TYPE_STM32F2XX_SPI ); +qdev_set_parent_bus (DEVICE (&s->spi[i]),sysbus_get_default ()); + } }static void stm32f205_soc_realize (DeviceState *dev_soc,Error **errp)
@@ -168,6 +177,19 @@ static void stm32f205_soc_realize(DeviceState *dev_soc, Error **errp)sysbus_mmio_map (busdev,0 , adc_addr[i]);sysbus_connect_irq (SYS_BUS_DEVICE (dev),0 , gic_adc_irq_arr[i]); } + +/* SPI 1 and 2 */ +for (i =0 ; i <STM_NUM_SPIS ; i++) { + dev =DEVICE (&(s->spi[i])); +object_property_set_bool (OBJECT (&s->spi[i]), true,"realized" , &err); +if (err !=NULL ) { +error_propagate (errp, err); +return ; + } + busdev =SYS_BUS_DEVICE (dev); +sysbus_mmio_map (busdev,0 , spi_addr[i]); +sysbus_connect_irq (busdev,0 ,qdev_get_gpio_in (nvic, spi_irq[i])); + } }static Property stm32f205_soc_properties[] = {
include/hw/arm/stm32f205_soc.h +3 -0
@@ -30,6 +30,7 @@#include "hw/char/stm32f2xx_usart.h" #include "hw/adc/stm32f2xx_adc.h" #include "hw/or-irq.h" +#include "hw/ssi/stm32f2xx_spi.h" #define TYPE_STM32F205_SOC "stm32f205-soc"#define STM32F205_SOC (obj) \
@@ -38,6 +39,7 @@#define STM_NUM_USARTS 6#define STM_NUM_TIMERS 4#define STM_NUM_ADCS 3 +#define STM_NUM_SPIS 3#define FLASH_BASE_ADDRESS 0x08000000#define FLASH_SIZE (1024 * 1024)
@@ -56,6 +58,7 @@ typedef struct STM32F205State {STM32F2XXUsartState usart[STM_NUM_USARTS ];STM32F2XXTimerState timer[STM_NUM_TIMERS ];STM32F2XXADCState adc[STM_NUM_ADCS ]; +STM32F2XXSPIState spi[STM_NUM_SPIS ];qemu_or_irq *adc_irqs; } STM32F205State;
Signature · 1 line
2.7.4
PATCH v7 8/8 MAINTAINERS: Add Alistair to the maintainers list
In reply to Alistair FrancisAdd Alistair Francis as the maintainer for the Netduino 2 and SMM32F205 SoC.
---
MAINTAINERS | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
MAINTAINERS +15 -0
@@ -475,6 +475,21 @@ S: Maintained F: hw/arm/virt-acpi-build.c F: include/hw/arm/virt-acpi-build.h +STM32F205 +M: Alistair Francis <[email protected]> +S: Maintained +F: hw/arm/stm32f205_soc.c +F: hw/misc/stm32f2xx_syscfg.c +F: hw/char/stm32f2xx_usart.c +F: hw/timer/stm32f2xx_timer.c +F: hw/adc/* +F: hw/ssi/stm32f2xx_spi.c + +Netduino 2 +M: Alistair Francis <[email protected]> +S: Maintained +F: hw/arm/netduino2.c + CRIS Machines ------------- Axis Dev88
Signature · 1 line
2.7.4