stm32f405_soc.c (9fc7fc4d3909817555ce0af6bcb69dff1606140d) stm32f405_soc.c (db873cc5d1a4aaa67eea87768d504b2f89d88738)
1/*
2 * STM32F405 SoC
3 *
4 * Copyright (c) 2014 Alistair Francis <alistair@alistair23.me>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights

--- 43 unchanged lines hidden (view full) ---

52 40, 40, 40, 40, 40} ;
53
54
55static void stm32f405_soc_initfn(Object *obj)
56{
57 STM32F405State *s = STM32F405_SOC(obj);
58 int i;
59
1/*
2 * STM32F405 SoC
3 *
4 * Copyright (c) 2014 Alistair Francis <alistair@alistair23.me>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights

--- 43 unchanged lines hidden (view full) ---

52 40, 40, 40, 40, 40} ;
53
54
55static void stm32f405_soc_initfn(Object *obj)
56{
57 STM32F405State *s = STM32F405_SOC(obj);
58 int i;
59
60 sysbus_init_child_obj(obj, "armv7m", &s->armv7m, sizeof(s->armv7m),
61 TYPE_ARMV7M);
60 object_initialize_child(obj, "armv7m", &s->armv7m, TYPE_ARMV7M);
62
61
63 sysbus_init_child_obj(obj, "syscfg", &s->syscfg, sizeof(s->syscfg),
64 TYPE_STM32F4XX_SYSCFG);
62 object_initialize_child(obj, "syscfg", &s->syscfg, TYPE_STM32F4XX_SYSCFG);
65
66 for (i = 0; i < STM_NUM_USARTS; i++) {
63
64 for (i = 0; i < STM_NUM_USARTS; i++) {
67 sysbus_init_child_obj(obj, "usart[*]", &s->usart[i],
68 sizeof(s->usart[i]), TYPE_STM32F2XX_USART);
65 object_initialize_child(obj, "usart[*]", &s->usart[i],
66 TYPE_STM32F2XX_USART);
69 }
70
71 for (i = 0; i < STM_NUM_TIMERS; i++) {
67 }
68
69 for (i = 0; i < STM_NUM_TIMERS; i++) {
72 sysbus_init_child_obj(obj, "timer[*]", &s->timer[i],
73 sizeof(s->timer[i]), TYPE_STM32F2XX_TIMER);
70 object_initialize_child(obj, "timer[*]", &s->timer[i],
71 TYPE_STM32F2XX_TIMER);
74 }
75
76 for (i = 0; i < STM_NUM_ADCS; i++) {
72 }
73
74 for (i = 0; i < STM_NUM_ADCS; i++) {
77 sysbus_init_child_obj(obj, "adc[*]", &s->adc[i], sizeof(s->adc[i]),
78 TYPE_STM32F2XX_ADC);
75 object_initialize_child(obj, "adc[*]", &s->adc[i], TYPE_STM32F2XX_ADC);
79 }
80
81 for (i = 0; i < STM_NUM_SPIS; i++) {
76 }
77
78 for (i = 0; i < STM_NUM_SPIS; i++) {
82 sysbus_init_child_obj(obj, "spi[*]", &s->spi[i], sizeof(s->spi[i]),
83 TYPE_STM32F2XX_SPI);
79 object_initialize_child(obj, "spi[*]", &s->spi[i], TYPE_STM32F2XX_SPI);
84 }
85
80 }
81
86 sysbus_init_child_obj(obj, "exti", &s->exti, sizeof(s->exti),
87 TYPE_STM32F4XX_EXTI);
82 object_initialize_child(obj, "exti", &s->exti, TYPE_STM32F4XX_EXTI);
88}
89
90static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
91{
92 STM32F405State *s = STM32F405_SOC(dev_soc);
93 MemoryRegion *system_memory = get_system_memory();
94 DeviceState *dev, *armv7m;
95 SysBusDevice *busdev;

--- 22 unchanged lines hidden (view full) ---

118 memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
119
120 armv7m = DEVICE(&s->armv7m);
121 qdev_prop_set_uint32(armv7m, "num-irq", 96);
122 qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
123 qdev_prop_set_bit(armv7m, "enable-bitband", true);
124 object_property_set_link(OBJECT(&s->armv7m), OBJECT(system_memory),
125 "memory", &error_abort);
83}
84
85static void stm32f405_soc_realize(DeviceState *dev_soc, Error **errp)
86{
87 STM32F405State *s = STM32F405_SOC(dev_soc);
88 MemoryRegion *system_memory = get_system_memory();
89 DeviceState *dev, *armv7m;
90 SysBusDevice *busdev;

--- 22 unchanged lines hidden (view full) ---

113 memory_region_add_subregion(system_memory, SRAM_BASE_ADDRESS, &s->sram);
114
115 armv7m = DEVICE(&s->armv7m);
116 qdev_prop_set_uint32(armv7m, "num-irq", 96);
117 qdev_prop_set_string(armv7m, "cpu-type", s->cpu_type);
118 qdev_prop_set_bit(armv7m, "enable-bitband", true);
119 object_property_set_link(OBJECT(&s->armv7m), OBJECT(system_memory),
120 "memory", &error_abort);
126 object_property_set_bool(OBJECT(&s->armv7m), true, "realized", &err);
121 sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &err);
127 if (err != NULL) {
128 error_propagate(errp, err);
129 return;
130 }
131
132 /* System configuration controller */
133 dev = DEVICE(&s->syscfg);
122 if (err != NULL) {
123 error_propagate(errp, err);
124 return;
125 }
126
127 /* System configuration controller */
128 dev = DEVICE(&s->syscfg);
134 object_property_set_bool(OBJECT(&s->syscfg), true, "realized", &err);
129 sysbus_realize(SYS_BUS_DEVICE(&s->syscfg), &err);
135 if (err != NULL) {
136 error_propagate(errp, err);
137 return;
138 }
139 busdev = SYS_BUS_DEVICE(dev);
140 sysbus_mmio_map(busdev, 0, SYSCFG_ADD);
141 sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, SYSCFG_IRQ));
142
143 /* Attach UART (uses USART registers) and USART controllers */
144 for (i = 0; i < STM_NUM_USARTS; i++) {
145 dev = DEVICE(&(s->usart[i]));
146 qdev_prop_set_chr(dev, "chardev", serial_hd(i));
130 if (err != NULL) {
131 error_propagate(errp, err);
132 return;
133 }
134 busdev = SYS_BUS_DEVICE(dev);
135 sysbus_mmio_map(busdev, 0, SYSCFG_ADD);
136 sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, SYSCFG_IRQ));
137
138 /* Attach UART (uses USART registers) and USART controllers */
139 for (i = 0; i < STM_NUM_USARTS; i++) {
140 dev = DEVICE(&(s->usart[i]));
141 qdev_prop_set_chr(dev, "chardev", serial_hd(i));
147 object_property_set_bool(OBJECT(&s->usart[i]), true, "realized", &err);
142 sysbus_realize(SYS_BUS_DEVICE(&s->usart[i]), &err);
148 if (err != NULL) {
149 error_propagate(errp, err);
150 return;
151 }
152 busdev = SYS_BUS_DEVICE(dev);
153 sysbus_mmio_map(busdev, 0, usart_addr[i]);
154 sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, usart_irq[i]));
155 }
156
157 /* Timer 2 to 5 */
158 for (i = 0; i < STM_NUM_TIMERS; i++) {
159 dev = DEVICE(&(s->timer[i]));
160 qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
143 if (err != NULL) {
144 error_propagate(errp, err);
145 return;
146 }
147 busdev = SYS_BUS_DEVICE(dev);
148 sysbus_mmio_map(busdev, 0, usart_addr[i]);
149 sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, usart_irq[i]));
150 }
151
152 /* Timer 2 to 5 */
153 for (i = 0; i < STM_NUM_TIMERS; i++) {
154 dev = DEVICE(&(s->timer[i]));
155 qdev_prop_set_uint64(dev, "clock-frequency", 1000000000);
161 object_property_set_bool(OBJECT(&s->timer[i]), true, "realized", &err);
156 sysbus_realize(SYS_BUS_DEVICE(&s->timer[i]), &err);
162 if (err != NULL) {
163 error_propagate(errp, err);
164 return;
165 }
166 busdev = SYS_BUS_DEVICE(dev);
167 sysbus_mmio_map(busdev, 0, timer_addr[i]);
168 sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, timer_irq[i]));
169 }

--- 13 unchanged lines hidden (view full) ---

183 error_propagate(errp, err);
184 return;
185 }
186 qdev_connect_gpio_out(DEVICE(&s->adc_irqs), 0,
187 qdev_get_gpio_in(armv7m, ADC_IRQ));
188
189 for (i = 0; i < STM_NUM_ADCS; i++) {
190 dev = DEVICE(&(s->adc[i]));
157 if (err != NULL) {
158 error_propagate(errp, err);
159 return;
160 }
161 busdev = SYS_BUS_DEVICE(dev);
162 sysbus_mmio_map(busdev, 0, timer_addr[i]);
163 sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, timer_irq[i]));
164 }

--- 13 unchanged lines hidden (view full) ---

178 error_propagate(errp, err);
179 return;
180 }
181 qdev_connect_gpio_out(DEVICE(&s->adc_irqs), 0,
182 qdev_get_gpio_in(armv7m, ADC_IRQ));
183
184 for (i = 0; i < STM_NUM_ADCS; i++) {
185 dev = DEVICE(&(s->adc[i]));
191 object_property_set_bool(OBJECT(&s->adc[i]), true, "realized", &err);
186 sysbus_realize(SYS_BUS_DEVICE(&s->adc[i]), &err);
192 if (err != NULL) {
193 error_propagate(errp, err);
194 return;
195 }
196 busdev = SYS_BUS_DEVICE(dev);
197 sysbus_mmio_map(busdev, 0, adc_addr[i]);
198 sysbus_connect_irq(busdev, 0,
199 qdev_get_gpio_in(DEVICE(&s->adc_irqs), i));
200 }
201
202 /* SPI devices */
203 for (i = 0; i < STM_NUM_SPIS; i++) {
204 dev = DEVICE(&(s->spi[i]));
187 if (err != NULL) {
188 error_propagate(errp, err);
189 return;
190 }
191 busdev = SYS_BUS_DEVICE(dev);
192 sysbus_mmio_map(busdev, 0, adc_addr[i]);
193 sysbus_connect_irq(busdev, 0,
194 qdev_get_gpio_in(DEVICE(&s->adc_irqs), i));
195 }
196
197 /* SPI devices */
198 for (i = 0; i < STM_NUM_SPIS; i++) {
199 dev = DEVICE(&(s->spi[i]));
205 object_property_set_bool(OBJECT(&s->spi[i]), true, "realized", &err);
200 sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), &err);
206 if (err != NULL) {
207 error_propagate(errp, err);
208 return;
209 }
210 busdev = SYS_BUS_DEVICE(dev);
211 sysbus_mmio_map(busdev, 0, spi_addr[i]);
212 sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, spi_irq[i]));
213 }
214
215 /* EXTI device */
216 dev = DEVICE(&s->exti);
201 if (err != NULL) {
202 error_propagate(errp, err);
203 return;
204 }
205 busdev = SYS_BUS_DEVICE(dev);
206 sysbus_mmio_map(busdev, 0, spi_addr[i]);
207 sysbus_connect_irq(busdev, 0, qdev_get_gpio_in(armv7m, spi_irq[i]));
208 }
209
210 /* EXTI device */
211 dev = DEVICE(&s->exti);
217 object_property_set_bool(OBJECT(&s->exti), true, "realized", &err);
212 sysbus_realize(SYS_BUS_DEVICE(&s->exti), &err);
218 if (err != NULL) {
219 error_propagate(errp, err);
220 return;
221 }
222 busdev = SYS_BUS_DEVICE(dev);
223 sysbus_mmio_map(busdev, 0, EXTI_ADDR);
224 for (i = 0; i < 16; i++) {
225 sysbus_connect_irq(busdev, i, qdev_get_gpio_in(armv7m, exti_irq[i]));

--- 78 unchanged lines hidden ---
213 if (err != NULL) {
214 error_propagate(errp, err);
215 return;
216 }
217 busdev = SYS_BUS_DEVICE(dev);
218 sysbus_mmio_map(busdev, 0, EXTI_ADDR);
219 for (i = 0; i < 16; i++) {
220 sysbus_connect_irq(busdev, i, qdev_get_gpio_in(armv7m, exti_irq[i]));

--- 78 unchanged lines hidden ---