@@ -135,6 +135,28 @@ static void stm32_create_uart_dev(
135
135
stm32_init_periph (uart_dev , periph , addr , irq );
136
136
}
137
137
138
+ static void stm32_create_timer_dev (
139
+ Object * stm32_container ,
140
+ stm32_periph_t periph ,
141
+ int timer_num ,
142
+ DeviceState * rcc_dev ,
143
+ DeviceState * * gpio_dev ,
144
+ DeviceState * afio_dev ,
145
+ hwaddr addr ,
146
+ qemu_irq * irq ,
147
+ int num_irqs )
148
+ {
149
+ char child_name [9 ];
150
+ DeviceState * timer_dev = qdev_create (NULL , "stm32-timer" );
151
+ QDEV_PROP_SET_PERIPH_T (timer_dev , "periph" , periph );
152
+ qdev_prop_set_ptr (timer_dev , "stm32_rcc" , rcc_dev );
153
+ qdev_prop_set_ptr (timer_dev , "stm32_gpio" , gpio_dev );
154
+ qdev_prop_set_ptr (timer_dev , "stm32_afio" , afio_dev );
155
+ snprintf (child_name , sizeof (child_name ), "timer[%i]" , timer_num );
156
+ object_property_add_child (stm32_container , child_name , OBJECT (timer_dev ), NULL );
157
+ stm32_init_periph (timer_dev , periph , addr , irq , num_irqs );
158
+ }
159
+
138
160
139
161
void stm32_init (
140
162
ram_addr_t flash_size ,
@@ -181,7 +203,7 @@ void stm32_init(
181
203
qdev_prop_set_uint32 (rcc_dev , "osc_freq" , osc_freq );
182
204
qdev_prop_set_uint32 (rcc_dev , "osc32_freq" , osc32_freq );
183
205
object_property_add_child (stm32_container , "rcc" , OBJECT (rcc_dev ), NULL );
184
- stm32_init_periph (rcc_dev , STM32_RCC_PERIPH , 0x40021000 , pic [STM32_RCC_IRQ ]);
206
+ stm32_init_periph (rcc_dev , STM32_RCC , 0x40021000 , pic [STM32_RCC_IRQ ]);
185
207
186
208
DeviceState * * gpio_dev = (DeviceState * * )g_malloc0 (sizeof (DeviceState * ) * STM32_GPIO_COUNT );
187
209
for (i = 0 ; i < STM32_GPIO_COUNT ; i ++ ) {
@@ -197,7 +219,7 @@ void stm32_init(
197
219
198
220
DeviceState * exti_dev = qdev_create (NULL , TYPE_STM32_EXTI );
199
221
object_property_add_child (stm32_container , "exti" , OBJECT (exti_dev ), NULL );
200
- stm32_init_periph (exti_dev , STM32_EXTI_PERIPH , 0x40010400 , NULL );
222
+ stm32_init_periph (exti_dev , STM32_EXTI , 0x40010400 , NULL );
201
223
SysBusDevice * exti_busdev = SYS_BUS_DEVICE (exti_dev );
202
224
sysbus_connect_irq (exti_busdev , 0 , pic [STM32_EXTI0_IRQ ]);
203
225
sysbus_connect_irq (exti_busdev , 1 , pic [STM32_EXTI1_IRQ ]);
@@ -228,4 +250,15 @@ void stm32_init(
228
250
stm32_create_uart_dev (stm32_container , STM32_UART3 , 3 , rcc_dev , gpio_dev , afio_dev , 0x40004800 , pic [STM32_UART3_IRQ ]);
229
251
stm32_create_uart_dev (stm32_container , STM32_UART4 , 4 , rcc_dev , gpio_dev , afio_dev , 0x40004c00 , pic [STM32_UART4_IRQ ]);
230
252
stm32_create_uart_dev (stm32_container , STM32_UART5 , 5 , rcc_dev , gpio_dev , afio_dev , 0x40005000 , pic [STM32_UART5_IRQ ]);
253
+
254
+ qemu_irq tim1_irqs [] = { pic [TIM1_BRK_IRQn ], pic [TIM1_UP_IRQn ], pic [TIM1_TRG_COM_IRQn ],
255
+ pic [TIM1_CC_IRQn ]};
256
+ stm32_create_timer_dev (stm32_container , STM32_TIM1 , 1 , rcc_dev , gpio_dev , afio_dev , 0x40012C00 , tim1_irqs , 5 );
257
+
258
+ stm32_create_timer_dev (stm32_container , STM32_TIM2 , 1 , rcc_dev , gpio_dev , afio_dev , 0x40000000 , pic [TIM2_IRQn ], 1 );
259
+ stm32_create_timer_dev (stm32_container , STM32_TIM3 , 1 , rcc_dev , gpio_dev , afio_dev , 0x40000400 , pic [TIM3_IRQn ], 1 );
260
+ stm32_create_timer_dev (stm32_container , STM32_TIM4 , 1 , rcc_dev , gpio_dev , afio_dev , 0x40000800 , pic [TIM4_IRQn ], 1 );
261
+ stm32_create_timer_dev (stm32_container , STM32_TIM5 , 1 , rcc_dev , gpio_dev , afio_dev , 0x40000C00 , pic [TIM5_IRQn ], 1 );
262
+
263
+
231
264
}
0 commit comments