dRonin  adbada4
dRonin firmware
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
board_hw_defs.c
Go to the documentation of this file.
1 
16 /*
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation; either version 3 of the License, or
20  * (at your option) any later version.
21  *
22  * This program is distributed in the hope that it will be useful, but
23  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25  * for more details.
26  *
27  * You should have received a copy of the GNU General Public License along
28  * with this program; if not, see <http://www.gnu.org/licenses/>
29  */
30 
31 #include <pios_config.h>
32 #include <pios_board_info.h>
33 
34 #if defined(PIOS_INCLUDE_ANNUNC)
35 
36 #include <pios_annunc_priv.h>
37 static const struct pios_annunc pios_annuncs[] = {
38  [PIOS_LED_ALARM] = {
39  .pin = {
40  .gpio = GPIOC,
41  .init = {
42  .GPIO_Pin = GPIO_Pin_13,
43  .GPIO_Speed = GPIO_Speed_2MHz,
44  .GPIO_Mode = GPIO_Mode_OUT,
45  .GPIO_OType = GPIO_OType_PP,
46  .GPIO_PuPd = GPIO_PuPd_DOWN
47  },
48  },
49  .remap = 0,
50  .active_high = false,
51  },
52  [PIOS_LED_HEARTBEAT] = {
53  .pin = {
54  .gpio = GPIOC,
55  .init = {
56  .GPIO_Pin = GPIO_Pin_14,
57  .GPIO_Speed = GPIO_Speed_2MHz,
58  .GPIO_Mode = GPIO_Mode_OUT,
59  .GPIO_OType = GPIO_OType_PP,
60  .GPIO_PuPd = GPIO_PuPd_DOWN
61  },
62  },
63  .remap = 0,
64  .active_high = false,
65  },
67  // Bipolar NPN low side, 1k base; 2.6mA base; hFE min 200
68  .pin = {
69  .gpio = GPIOA,
70  .init = {
71  .GPIO_Pin = GPIO_Pin_4,
72  .GPIO_Speed = GPIO_Speed_2MHz,
73  .GPIO_Mode = GPIO_Mode_OUT,
74  .GPIO_OType = GPIO_OType_PP,
75  .GPIO_PuPd = GPIO_PuPd_DOWN
76  },
77  },
78  .remap = 0,
79  .active_high = true,
80  },
81 };
82 
83 static const struct pios_annunc_cfg pios_annunc_cfg = {
84  .annunciators = pios_annuncs,
85  .num_annunciators = NELEMENTS(pios_annuncs),
86 };
87 
88 const struct pios_annunc_cfg * PIOS_BOARD_HW_DEFS_GetLedCfg (uint32_t board_revision)
89 {
90  return &pios_annunc_cfg;
91 }
92 
93 #endif /* PIOS_INCLUDE_ANNUNC */
94 
95 
96 #if defined(PIOS_INCLUDE_SPI)
97 #include <pios_spi_priv.h>
98 
99 /* SPI2 Interface
100  * - Used for flash communications
101  */
102 
103 static const struct pios_spi_cfg pios_spi_flash_cfg = {
104  .regs = SPI2,
105  .remap = GPIO_AF_SPI2,
106  .init = {
107  .SPI_Mode = SPI_Mode_Master,
108  .SPI_Direction = SPI_Direction_2Lines_FullDuplex,
109  .SPI_DataSize = SPI_DataSize_8b,
110  .SPI_NSS = SPI_NSS_Soft,
111  .SPI_FirstBit = SPI_FirstBit_MSB,
112  .SPI_CRCPolynomial = 7,
113  .SPI_CPOL = SPI_CPOL_High,
114  .SPI_CPHA = SPI_CPHA_2Edge,
115  .SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2, //@ APB1 PCLK1 42MHz / 2 == 21MHz
116  },
117  .sclk = {
118  .gpio = GPIOB,
119  .init = {
120  .GPIO_Pin = GPIO_Pin_13,
121  .GPIO_Speed = GPIO_Speed_100MHz,
122  .GPIO_Mode = GPIO_Mode_AF,
123  .GPIO_OType = GPIO_OType_PP,
124  .GPIO_PuPd = GPIO_PuPd_NOPULL
125  },
126  .pin_source = GPIO_PinSource13,
127  },
128  .miso = {
129  .gpio = GPIOC,
130  .init = {
131  .GPIO_Pin = GPIO_Pin_2,
132  .GPIO_Speed = GPIO_Speed_50MHz,
133  .GPIO_Mode = GPIO_Mode_AF,
134  .GPIO_OType = GPIO_OType_PP,
135  .GPIO_PuPd = GPIO_PuPd_NOPULL
136  },
137  .pin_source = GPIO_PinSource2,
138  },
139  .mosi = {
140  .gpio = GPIOC,
141  .init = {
142  .GPIO_Pin = GPIO_Pin_3,
143  .GPIO_Speed = GPIO_Speed_50MHz,
144  .GPIO_Mode = GPIO_Mode_AF,
145  .GPIO_OType = GPIO_OType_PP,
146  .GPIO_PuPd = GPIO_PuPd_NOPULL
147  },
148  .pin_source = GPIO_PinSource3,
149  },
150  .slave_count = 1,
151  .ssel = { {
152  .gpio = GPIOB,
153  .init = {
154  .GPIO_Pin = GPIO_Pin_12,
155  .GPIO_Speed = GPIO_Speed_50MHz,
156  .GPIO_Mode = GPIO_Mode_OUT,
157  .GPIO_OType = GPIO_OType_PP,
158  .GPIO_PuPd = GPIO_PuPd_UP
159  },
160  } },
161 };
162 
163 pios_spi_t pios_spi_flash_id;
164 
165 /* SPI1 Interface
166  * - Used for gyro communications
167  */
168 static const struct pios_spi_cfg pios_spi_gyro_accel_cfg = {
169  .regs = SPI1,
170  .remap = GPIO_AF_SPI1,
171  .init = {
172  .SPI_Mode = SPI_Mode_Master,
173  .SPI_Direction = SPI_Direction_2Lines_FullDuplex,
174  .SPI_DataSize = SPI_DataSize_8b,
175  .SPI_NSS = SPI_NSS_Soft,
176  .SPI_FirstBit = SPI_FirstBit_MSB,
177  .SPI_CRCPolynomial = 7,
178  .SPI_CPOL = SPI_CPOL_High,
179  .SPI_CPHA = SPI_CPHA_2Edge,
180  .SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32, //@ APB2 PCLK1 82MHz / 32 == 2.6MHz
181  },
182  .sclk = {
183  .gpio = GPIOA,
184  .init = {
185  .GPIO_Pin = GPIO_Pin_5,
186  .GPIO_Speed = GPIO_Speed_100MHz,
187  .GPIO_Mode = GPIO_Mode_AF,
188  .GPIO_OType = GPIO_OType_PP,
189  .GPIO_PuPd = GPIO_PuPd_NOPULL
190  },
191  .pin_source = GPIO_PinSource5,
192  },
193  .miso = {
194  .gpio = GPIOA,
195  .init = {
196  .GPIO_Pin = GPIO_Pin_6,
197  .GPIO_Speed = GPIO_Speed_100MHz,
198  .GPIO_Mode = GPIO_Mode_AF,
199  .GPIO_OType = GPIO_OType_PP,
200  .GPIO_PuPd = GPIO_PuPd_NOPULL
201  },
202  .pin_source = GPIO_PinSource6,
203  },
204  .mosi = {
205  .gpio = GPIOA,
206  .init = {
207  .GPIO_Pin = GPIO_Pin_7,
208  .GPIO_Speed = GPIO_Speed_100MHz,
209  .GPIO_Mode = GPIO_Mode_AF,
210  .GPIO_OType = GPIO_OType_PP,
211  .GPIO_PuPd = GPIO_PuPd_NOPULL
212  },
213  .pin_source = GPIO_PinSource7,
214  },
215  .slave_count = 1,
216  .ssel = { {
217  .gpio = GPIOC,
218  .init = {
219  .GPIO_Pin = GPIO_Pin_4,
220  .GPIO_Speed = GPIO_Speed_100MHz,
221  .GPIO_Mode = GPIO_Mode_OUT,
222  .GPIO_OType = GPIO_OType_PP,
223  .GPIO_PuPd = GPIO_PuPd_UP
224  },
225  } },
226 };
227 
228 pios_spi_t pios_spi_gyro_accel_id;
229 
230 #endif /* PIOS_INCLUDE_SPI */
231 
232 
233 #if defined(PIOS_INCLUDE_I2C)
234 
235 #include <pios_i2c_priv.h>
236 
237 /*
238  * I2C Adapters
239  */
240 
241 void PIOS_I2C_usart1_ev_irq_handler(void);
242 void PIOS_I2C_usart1_er_irq_handler(void);
243 void I2C1_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_usart1_ev_irq_handler")));
244 void I2C1_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_usart1_er_irq_handler")));
245 
246 static const struct pios_i2c_adapter_cfg pios_i2c_usart1_adapter_cfg = {
247  .regs = I2C1,
248  .remap = GPIO_AF_I2C1,
249  .init = {
250  .I2C_Mode = I2C_Mode_I2C,
251  .I2C_OwnAddress1 = 0,
252  .I2C_Ack = I2C_Ack_Enable,
253  .I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit,
254  .I2C_DutyCycle = I2C_DutyCycle_2,
255  .I2C_ClockSpeed = 400000, /* bits/s */
256  },
257  .transfer_timeout_ms = 50,
258  .scl = {
259  .gpio = GPIOB,
260  .init = {
261  .GPIO_Pin = GPIO_Pin_6,
262  .GPIO_Mode = GPIO_Mode_AF,
263  .GPIO_Speed = GPIO_Speed_50MHz,
264  .GPIO_OType = GPIO_OType_OD,
265  .GPIO_PuPd = GPIO_PuPd_NOPULL,
266  },
267  .pin_source = GPIO_PinSource6,
268  },
269  .sda = {
270  .gpio = GPIOB,
271  .init = {
272  .GPIO_Pin = GPIO_Pin_7,
273  .GPIO_Mode = GPIO_Mode_AF,
274  .GPIO_Speed = GPIO_Speed_50MHz,
275  .GPIO_OType = GPIO_OType_OD,
276  .GPIO_PuPd = GPIO_PuPd_NOPULL,
277  },
278  .pin_source = GPIO_PinSource7,
279  },
280  .event = {
281  .flags = 0, /* FIXME: check this */
282  .init = {
283  .NVIC_IRQChannel = I2C1_EV_IRQn,
284  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST,
285  .NVIC_IRQChannelSubPriority = 0,
286  .NVIC_IRQChannelCmd = ENABLE,
287  },
288  },
289  .error = {
290  .flags = 0, /* FIXME: check this */
291  .init = {
292  .NVIC_IRQChannel = I2C1_ER_IRQn,
293  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST,
294  .NVIC_IRQChannelSubPriority = 0,
295  .NVIC_IRQChannelCmd = ENABLE,
296  },
297  },
298 };
299 
300 pios_i2c_t pios_i2c_usart1_adapter_id;
301 void PIOS_I2C_usart1_ev_irq_handler(void)
302 {
303  /* Call into the generic code to handle the IRQ for this specific device */
304  PIOS_I2C_EV_IRQ_Handler(pios_i2c_usart1_adapter_id);
305 }
306 
307 void PIOS_I2C_usart1_er_irq_handler(void)
308 {
309  /* Call into the generic code to handle the IRQ for this specific device */
310  PIOS_I2C_ER_IRQ_Handler(pios_i2c_usart1_adapter_id);
311 }
312 
313 
314 
315 
316 void PIOS_I2C_usart3_ev_irq_handler(void);
317 void PIOS_I2C_usart3_er_irq_handler(void);
318 void I2C2_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_usart3_ev_irq_handler")));
319 void I2C2_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_usart3_er_irq_handler")));
320 
321 static const struct pios_i2c_adapter_cfg pios_i2c_usart3_adapter_cfg = {
322  .regs = I2C2,
323  .remap = GPIO_AF_I2C2,
324  .init = {
325  .I2C_Mode = I2C_Mode_I2C,
326  .I2C_OwnAddress1 = 0,
327  .I2C_Ack = I2C_Ack_Enable,
328  .I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit,
329  .I2C_DutyCycle = I2C_DutyCycle_2,
330  .I2C_ClockSpeed = 400000, /* bits/s */
331  },
332  .transfer_timeout_ms = 50,
333  .scl = {
334  .gpio = GPIOB,
335  .init = {
336  .GPIO_Pin = GPIO_Pin_10,
337  .GPIO_Mode = GPIO_Mode_AF,
338  .GPIO_Speed = GPIO_Speed_50MHz,
339  .GPIO_OType = GPIO_OType_OD,
340  .GPIO_PuPd = GPIO_PuPd_NOPULL,
341  },
342  .pin_source = GPIO_PinSource10,
343  },
344  .sda = {
345  .gpio = GPIOB,
346  .init = {
347  .GPIO_Pin = GPIO_Pin_11,
348  .GPIO_Mode = GPIO_Mode_AF,
349  .GPIO_Speed = GPIO_Speed_50MHz,
350  .GPIO_OType = GPIO_OType_OD,
351  .GPIO_PuPd = GPIO_PuPd_NOPULL,
352  },
353  .pin_source = GPIO_PinSource11,
354  },
355  .event = {
356  .flags = 0, /* FIXME: check this */
357  .init = {
358  .NVIC_IRQChannel = I2C2_EV_IRQn,
359  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST,
360  .NVIC_IRQChannelSubPriority = 0,
361  .NVIC_IRQChannelCmd = ENABLE,
362  },
363  },
364  .error = {
365  .flags = 0, /* FIXME: check this */
366  .init = {
367  .NVIC_IRQChannel = I2C2_ER_IRQn,
368  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST,
369  .NVIC_IRQChannelSubPriority = 0,
370  .NVIC_IRQChannelCmd = ENABLE,
371  },
372  },
373 };
374 
375 pios_i2c_t pios_i2c_usart3_adapter_id;
376 void PIOS_I2C_usart3_ev_irq_handler(void)
377 {
378  /* Call into the generic code to handle the IRQ for this specific device */
379  PIOS_I2C_EV_IRQ_Handler(pios_i2c_usart3_adapter_id);
380 }
381 
382 void PIOS_I2C_usart3_er_irq_handler(void)
383 {
384  /* Call into the generic code to handle the IRQ for this specific device */
385  PIOS_I2C_ER_IRQ_Handler(pios_i2c_usart3_adapter_id);
386 }
387 
388 
389 
390 void PIOS_I2C_internal_ev_irq_handler(void);
391 void PIOS_I2C_internal_er_irq_handler(void);
392 void I2C3_EV_IRQHandler() __attribute__ ((alias ("PIOS_I2C_internal_ev_irq_handler")));
393 void I2C3_ER_IRQHandler() __attribute__ ((alias ("PIOS_I2C_internal_er_irq_handler")));
394 
395 static const struct pios_i2c_adapter_cfg pios_i2c_internal_adapter_cfg = {
396  .regs = I2C3,
397  .remap = GPIO_AF_I2C3,
398  .init = {
399  .I2C_Mode = I2C_Mode_I2C,
400  .I2C_OwnAddress1 = 0,
401  .I2C_Ack = I2C_Ack_Enable,
402  .I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit,
403  .I2C_DutyCycle = I2C_DutyCycle_2,
404  .I2C_ClockSpeed = 400000, /* bits/s */
405  },
406  .transfer_timeout_ms = 50,
407  .scl = {
408  .gpio = GPIOA,
409  .init = {
410  .GPIO_Pin = GPIO_Pin_8,
411  .GPIO_Mode = GPIO_Mode_AF,
412  .GPIO_Speed = GPIO_Speed_50MHz,
413  .GPIO_OType = GPIO_OType_OD,
414  .GPIO_PuPd = GPIO_PuPd_NOPULL,
415  },
416  .pin_source = GPIO_PinSource8,
417  },
418  .sda = {
419  .gpio = GPIOC,
420  .init = {
421  .GPIO_Pin = GPIO_Pin_9,
422  .GPIO_Mode = GPIO_Mode_AF,
423  .GPIO_Speed = GPIO_Speed_50MHz,
424  .GPIO_OType = GPIO_OType_OD,
425  .GPIO_PuPd = GPIO_PuPd_NOPULL,
426  },
427  .pin_source = GPIO_PinSource9,
428  },
429  .event = {
430  .flags = 0, /* FIXME: check this */
431  .init = {
432  .NVIC_IRQChannel = I2C3_EV_IRQn,
433  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST,
434  .NVIC_IRQChannelSubPriority = 0,
435  .NVIC_IRQChannelCmd = ENABLE,
436  },
437  },
438  .error = {
439  .flags = 0, /* FIXME: check this */
440  .init = {
441  .NVIC_IRQChannel = I2C3_ER_IRQn,
442  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST,
443  .NVIC_IRQChannelSubPriority = 0,
444  .NVIC_IRQChannelCmd = ENABLE,
445  },
446  },
447 };
448 
449 pios_i2c_t pios_i2c_internal_adapter_id;
450 void PIOS_I2C_internal_ev_irq_handler(void)
451 {
452  /* Call into the generic code to handle the IRQ for this specific device */
453  PIOS_I2C_EV_IRQ_Handler(pios_i2c_internal_adapter_id);
454 }
455 
456 void PIOS_I2C_internal_er_irq_handler(void)
457 {
458  /* Call into the generic code to handle the IRQ for this specific device */
459  PIOS_I2C_ER_IRQ_Handler(pios_i2c_internal_adapter_id);
460 }
461 
462 
463 
464 #endif /* PIOS_INCLUDE_I2C */
465 
466 #if defined(PIOS_INCLUDE_FLASH)
467 #include "pios_flashfs_logfs_priv.h"
468 
469 static const struct flashfs_logfs_cfg flashfs_settings_cfg = {
470  .fs_magic = 0x3b1b14cf,
471  .arena_size = 0x00004000, /* 64 * slot size */
472  .slot_size = 0x00000100, /* 256 bytes */
473 };
474 
475 #if defined(PIOS_INCLUDE_FLASH_JEDEC)
476 #include "pios_flash_jedec_priv.h"
477 
478 static const struct pios_flash_jedec_cfg flash_mx25_cfg = {
480  .expect_memorytype = 0x20,
481  .expect_capacity = 0x16,
482  .sector_erase = 0x20,
483 };
484 #endif /* PIOS_INCLUDE_FLASH_JEDEC */
485 
486 #if defined(PIOS_INCLUDE_FLASH_INTERNAL)
488 
489 static const struct pios_flash_internal_cfg flash_internal_cfg = {
490 };
491 #endif /* PIOS_INCLUDE_FLASH_INTERNAL */
492 
493 #include "pios_flash_priv.h"
494 
495 #if defined(PIOS_INCLUDE_FLASH_INTERNAL)
496 static const struct pios_flash_sector_range stm32f4_sectors[] = {
497  {
498  .base_sector = 0,
499  .last_sector = 3,
500  .sector_size = FLASH_SECTOR_16KB,
501  },
502  {
503  .base_sector = 4,
504  .last_sector = 4,
505  .sector_size = FLASH_SECTOR_64KB,
506  },
507  {
508  .base_sector = 5,
509  .last_sector = 11,
510  .sector_size = FLASH_SECTOR_128KB,
511  },
512 
513 };
514 
515 uintptr_t pios_internal_flash_id;
516 static const struct pios_flash_chip pios_flash_chip_internal = {
518  .chip_id = &pios_internal_flash_id,
519  .page_size = 16, /* 128-bit rows */
520  .sector_blocks = stm32f4_sectors,
521  .num_blocks = NELEMENTS(stm32f4_sectors),
522 };
523 #endif /* PIOS_INCLUDE_FLASH_INTERNAL */
524 
525 #if defined(PIOS_INCLUDE_FLASH_JEDEC)
526 static const struct pios_flash_sector_range mx25_sectors[] = {
527  {
528  .base_sector = 0,
529  .last_sector = 1023,
530  .sector_size = FLASH_SECTOR_4KB,
531  },
532 };
533 
534 uintptr_t pios_external_flash_id;
535 static const struct pios_flash_chip pios_flash_chip_external = {
537  .chip_id = &pios_external_flash_id,
538  .page_size = 256,
539  .sector_blocks = mx25_sectors,
540  .num_blocks = NELEMENTS(mx25_sectors),
541 };
542 #endif /* PIOS_INCLUDE_FLASH_JEDEC */
543 
544 static const struct pios_flash_partition pios_flash_partition_table[] = {
545 #if defined(PIOS_INCLUDE_FLASH_INTERNAL)
546  {
548  .chip_desc = &pios_flash_chip_internal,
549  .first_sector = 0,
550  .last_sector = 1,
551  .chip_offset = 0,
552  .size = (1 - 0 + 1) * FLASH_SECTOR_16KB,
553  },
554 
555  /* NOTE: sectors 2-4 of the internal flash are currently unallocated */
556 
557  {
558  .label = FLASH_PARTITION_LABEL_FW,
559  .chip_desc = &pios_flash_chip_internal,
560  .first_sector = 5,
561  .last_sector = 7,
562  .chip_offset = (4 * FLASH_SECTOR_16KB) + (1 * FLASH_SECTOR_64KB),
563  .size = (7 - 5 + 1) * FLASH_SECTOR_128KB,
564  },
565  {
567  .chip_desc = &pios_flash_chip_internal,
568  .first_sector = 10,
569  .last_sector = 10,
570  .chip_offset = (4 * FLASH_SECTOR_16KB) + (1 * FLASH_SECTOR_64KB) + (5 * FLASH_SECTOR_128KB),
571  .size = (10 - 10 + 1) * FLASH_SECTOR_128KB,
572  },
573 
574  /* NOTE: sectors 8-9, 11 of the internal flash are currently unallocated */
575 
576 #endif /* PIOS_INCLUDE_FLASH_INTERNAL */
577 
578 #if defined(PIOS_INCLUDE_FLASH_JEDEC)
579  {
581  .chip_desc = &pios_flash_chip_external,
582  .first_sector = 0,
583  .last_sector = 15,
584  .chip_offset = 0,
585  .size = (15 - 0 + 1) * FLASH_SECTOR_4KB,
586  },
587 
588  {
590  .chip_desc = &pios_flash_chip_external,
591  .first_sector = 16,
592  .last_sector = 31,
593  .chip_offset = (16 * FLASH_SECTOR_4KB),
594  .size = (31 - 16 + 1) * FLASH_SECTOR_4KB,
595  },
596 
597  {
598  .label = FLASH_PARTITION_LABEL_LOG,
599  .chip_desc = &pios_flash_chip_external,
600  .first_sector = 32,
601  .last_sector = 1023,
602  .chip_offset = (32 * FLASH_SECTOR_4KB),
603  .size = (1023 - 32 + 1) * FLASH_SECTOR_4KB,
604  },
605 #endif /* PIOS_INCLUDE_FLASH_JEDEC */
606 };
607 
608 const struct pios_flash_partition * PIOS_BOARD_HW_DEFS_GetPartitionTable (uint32_t board_revision, uint32_t * num_partitions)
609 {
610  PIOS_Assert(num_partitions);
611 
612  *num_partitions = NELEMENTS(pios_flash_partition_table);
614 }
615 
616 #endif /* PIOS_INCLUDE_FLASH */
617 
618 #if defined(PIOS_INCLUDE_USART)
619 
620 #include "pios_usart_priv.h"
621 
622 #if defined(PIOS_INCLUDE_DSM)
623 /*
624  * Spektrum/JR DSM USART
625  */
626 #include <pios_dsm_priv.h>
627 
628 static const struct pios_dsm_cfg pios_usart1_dsm_aux_cfg = {
629  .bind = {
630  .gpio = GPIOB,
631  .init = {
632  .GPIO_Pin = GPIO_Pin_7,
633  .GPIO_Speed = GPIO_Speed_2MHz,
634  .GPIO_Mode = GPIO_Mode_OUT,
635  .GPIO_OType = GPIO_OType_PP,
636  .GPIO_PuPd = GPIO_PuPd_NOPULL
637  },
638  },
639 };
640 
641 static const struct pios_dsm_cfg pios_usart2_dsm_aux_cfg = {
642  .bind = {
643  .gpio = GPIOA,
644  .init = {
645  .GPIO_Pin = GPIO_Pin_3,
646  .GPIO_Speed = GPIO_Speed_2MHz,
647  .GPIO_Mode = GPIO_Mode_OUT,
648  .GPIO_OType = GPIO_OType_PP,
649  .GPIO_PuPd = GPIO_PuPd_NOPULL
650  },
651  },
652 };
653 
654 static const struct pios_dsm_cfg pios_usart3_dsm_aux_cfg = {
655  .bind = {
656  .gpio = GPIOB,
657  .init = {
658  .GPIO_Pin = GPIO_Pin_11,
659  .GPIO_Speed = GPIO_Speed_2MHz,
660  .GPIO_Mode = GPIO_Mode_OUT,
661  .GPIO_OType = GPIO_OType_PP,
662  .GPIO_PuPd = GPIO_PuPd_NOPULL
663  },
664  },
665 };
666 
667 static const struct pios_dsm_cfg pios_usart4_dsm_aux_cfg = {
668  .bind = {
669  .gpio = GPIOC,
670  .init = {
671  .GPIO_Pin = GPIO_Pin_11,
672  .GPIO_Speed = GPIO_Speed_2MHz,
673  .GPIO_Mode = GPIO_Mode_OUT,
674  .GPIO_OType = GPIO_OType_PP,
675  .GPIO_PuPd = GPIO_PuPd_NOPULL
676  },
677  },
678 };
679 
680 static const struct pios_dsm_cfg pios_usart5_dsm_aux_cfg = {
681  .bind = {
682  .gpio = GPIOD,
683  .init = {
684  .GPIO_Pin = GPIO_Pin_2,
685  .GPIO_Speed = GPIO_Speed_2MHz,
686  .GPIO_Mode = GPIO_Mode_OUT,
687  .GPIO_OType = GPIO_OType_PP,
688  .GPIO_PuPd = GPIO_PuPd_NOPULL
689  },
690  },
691 };
692 
693 static const struct pios_dsm_cfg pios_inportserial_dsm_aux_cfg = {
694  .bind = {
695  .gpio = GPIOC,
696  .init = {
697  .GPIO_Pin = GPIO_Pin_7,
698  .GPIO_Speed = GPIO_Speed_2MHz,
699  .GPIO_Mode = GPIO_Mode_OUT,
700  .GPIO_OType = GPIO_OType_PP,
701  .GPIO_PuPd = GPIO_PuPd_NOPULL
702  },
703  },
704 };
705 
706 #endif /* PIOS_INCLUDE_DSM */
707 
708 #if defined(PIOS_INCLUDE_SBUS)
709 
710 #include <pios_sbus_priv.h>
711 
712 static const struct pios_sbus_cfg pios_usart2_sbus_aux_cfg = {
713  /* Inverter configuration */
714  .inv = {
715  .gpio = GPIOB,
716  .init = {
717  .GPIO_Pin = GPIO_Pin_2,
718  .GPIO_Speed = GPIO_Speed_2MHz,
719  .GPIO_Mode = GPIO_Mode_OUT,
720  .GPIO_OType = GPIO_OType_PP,
721  .GPIO_PuPd = GPIO_PuPd_NOPULL
722  },
723  },
724  .gpio_inv_enable = Bit_SET,
725 };
726 
727 #endif /* PIOS_INCLUDE_SBUS */
728 
729 static const struct pios_usart_cfg pios_usart1_cfg = {
730  .regs = USART1,
731  .remap = GPIO_AF_USART1,
732  .irq = {
733  .init = {
734  .NVIC_IRQChannel = USART1_IRQn,
735  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
736  .NVIC_IRQChannelSubPriority = 0,
737  .NVIC_IRQChannelCmd = ENABLE,
738  },
739  },
740  .rx = {
741  .gpio = GPIOB,
742  .init = {
743  .GPIO_Pin = GPIO_Pin_7,
744  .GPIO_Speed = GPIO_Speed_2MHz,
745  .GPIO_Mode = GPIO_Mode_AF,
746  .GPIO_OType = GPIO_OType_PP,
747  .GPIO_PuPd = GPIO_PuPd_UP
748  },
749  .pin_source = GPIO_PinSource7,
750  },
751  .tx = {
752  .gpio = GPIOB,
753  .init = {
754  .GPIO_Pin = GPIO_Pin_6,
755  .GPIO_Speed = GPIO_Speed_2MHz,
756  .GPIO_Mode = GPIO_Mode_AF,
757  .GPIO_OType = GPIO_OType_PP,
758  .GPIO_PuPd = GPIO_PuPd_UP
759  },
760  .pin_source = GPIO_PinSource6,
761  },
762 };
763 
764 static const struct pios_usart_cfg pios_usart2_cfg = {
765  .regs = USART2,
766  .remap = GPIO_AF_USART2,
767  .irq = {
768  .init = {
769  .NVIC_IRQChannel = USART2_IRQn,
770  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
771  .NVIC_IRQChannelSubPriority = 0,
772  .NVIC_IRQChannelCmd = ENABLE,
773  },
774  },
775  .rx = {
776  .gpio = GPIOA,
777  .init = {
778  .GPIO_Pin = GPIO_Pin_3,
779  .GPIO_Speed = GPIO_Speed_2MHz,
780  .GPIO_Mode = GPIO_Mode_AF,
781  .GPIO_OType = GPIO_OType_PP,
782  .GPIO_PuPd = GPIO_PuPd_UP
783  },
784  .pin_source = GPIO_PinSource3,
785  },
786  .tx = {
787  .gpio = GPIOA,
788  .init = {
789  .GPIO_Pin = GPIO_Pin_2,
790  .GPIO_Speed = GPIO_Speed_2MHz,
791  .GPIO_Mode = GPIO_Mode_AF,
792  .GPIO_OType = GPIO_OType_PP,
793  .GPIO_PuPd = GPIO_PuPd_UP
794  },
795  .pin_source = GPIO_PinSource2,
796  },
797 };
798 
799 static const struct pios_usart_cfg pios_usart3_cfg = {
800  .regs = USART3,
801  .remap = GPIO_AF_USART3,
802  .irq = {
803  .init = {
804  .NVIC_IRQChannel = USART3_IRQn,
805  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
806  .NVIC_IRQChannelSubPriority = 0,
807  .NVIC_IRQChannelCmd = ENABLE,
808  },
809  },
810  .rx = {
811  .gpio = GPIOB,
812  .init = {
813  .GPIO_Pin = GPIO_Pin_11,
814  .GPIO_Speed = GPIO_Speed_2MHz,
815  .GPIO_Mode = GPIO_Mode_AF,
816  .GPIO_OType = GPIO_OType_PP,
817  .GPIO_PuPd = GPIO_PuPd_UP
818  },
819  .pin_source = GPIO_PinSource11,
820  },
821  .tx = {
822  .gpio = GPIOB,
823  .init = {
824  .GPIO_Pin = GPIO_Pin_10,
825  .GPIO_Speed = GPIO_Speed_2MHz,
826  .GPIO_Mode = GPIO_Mode_AF,
827  .GPIO_OType = GPIO_OType_PP,
828  .GPIO_PuPd = GPIO_PuPd_UP
829  },
830  .pin_source = GPIO_PinSource10,
831  },
832 };
833 
834 static const struct pios_usart_cfg pios_usart4_cfg = {
835  .regs = UART4,
836  .remap = GPIO_AF_UART4,
837  .irq = {
838  .init = {
839  .NVIC_IRQChannel = UART4_IRQn,
840  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
841  .NVIC_IRQChannelSubPriority = 0,
842  .NVIC_IRQChannelCmd = ENABLE,
843  },
844  },
845  .rx = {
846  .gpio = GPIOC,
847  .init = {
848  .GPIO_Pin = GPIO_Pin_11,
849  .GPIO_Speed = GPIO_Speed_2MHz,
850  .GPIO_Mode = GPIO_Mode_AF,
851  .GPIO_OType = GPIO_OType_PP,
852  .GPIO_PuPd = GPIO_PuPd_UP
853  },
854  .pin_source = GPIO_PinSource11,
855  },
856  .tx = {
857  .gpio = GPIOC,
858  .init = {
859  .GPIO_Pin = GPIO_Pin_10,
860  .GPIO_Speed = GPIO_Speed_2MHz,
861  .GPIO_Mode = GPIO_Mode_AF,
862  .GPIO_OType = GPIO_OType_PP,
863  .GPIO_PuPd = GPIO_PuPd_UP
864  },
865  .pin_source = GPIO_PinSource10,
866  },
867 };
868 
869 static const struct pios_usart_cfg pios_usart5_cfg = {
870  .regs = UART5,
871  .remap = GPIO_AF_UART5,
872  .irq = {
873  .init = {
874  .NVIC_IRQChannel = UART5_IRQn,
875  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
876  .NVIC_IRQChannelSubPriority = 0,
877  .NVIC_IRQChannelCmd = ENABLE,
878  },
879  },
880  .rx = {
881  .gpio = GPIOD,
882  .init = {
883  .GPIO_Pin = GPIO_Pin_2,
884  .GPIO_Speed = GPIO_Speed_2MHz,
885  .GPIO_Mode = GPIO_Mode_AF,
886  .GPIO_OType = GPIO_OType_PP,
887  .GPIO_PuPd = GPIO_PuPd_UP
888  },
889  .pin_source = GPIO_PinSource2,
890  },
891  .tx = {
892  .gpio = GPIOC,
893  .init = {
894  .GPIO_Pin = GPIO_Pin_12,
895  .GPIO_Speed = GPIO_Speed_2MHz,
896  .GPIO_Mode = GPIO_Mode_AF,
897  .GPIO_OType = GPIO_OType_PP,
898  .GPIO_PuPd = GPIO_PuPd_UP
899  },
900  .pin_source = GPIO_PinSource12,
901  },
902 };
903 
904 static const struct pios_usart_cfg pios_usart_inportserial_cfg = {
905  .regs = USART6,
906  .remap = GPIO_AF_USART6,
907  .irq = {
908  .init = {
909  .NVIC_IRQChannel = USART6_IRQn,
910  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
911  .NVIC_IRQChannelSubPriority = 0,
912  .NVIC_IRQChannelCmd = ENABLE,
913  },
914  },
915  .rx = {
916  .gpio = GPIOC,
917  .init = {
918  .GPIO_Pin = GPIO_Pin_7,
919  .GPIO_Speed = GPIO_Speed_2MHz,
920  .GPIO_Mode = GPIO_Mode_AF,
921  .GPIO_OType = GPIO_OType_PP,
922  .GPIO_PuPd = GPIO_PuPd_UP
923  },
924  .pin_source = GPIO_PinSource7,
925  },
926  .tx = {
927  .gpio = GPIOC,
928  .init = {
929  .GPIO_Pin = GPIO_Pin_6,
930  .GPIO_Speed = GPIO_Speed_2MHz,
931  .GPIO_Mode = GPIO_Mode_AF,
932  .GPIO_OType = GPIO_OType_PP,
933  .GPIO_PuPd = GPIO_PuPd_UP
934  },
935  .pin_source = GPIO_PinSource6,
936  },
937 };
938 
939 #endif /* PIOS_INCLUDE_USART */
940 
941 #if defined(PIOS_INCLUDE_COM)
942 
943 #include "pios_com_priv.h"
944 
945 #endif /* PIOS_INCLUDE_COM */
946 
947 #if defined(PIOS_INCLUDE_RTC)
948 /*
949  * Realtime Clock (RTC)
950  */
951 #include <pios_rtc_priv.h>
952 
953 void PIOS_RTC_IRQ_Handler (void);
954 void RTC_WKUP_IRQHandler() __attribute__ ((alias ("PIOS_RTC_IRQ_Handler")));
955 static const struct pios_rtc_cfg pios_rtc_main_cfg = {
956  .clksrc = RCC_RTCCLKSource_HSE_Div16, // Divide 8 Mhz crystal down to 1
957  // For some reason it's acting like crystal is 16 Mhz. This clock is then divided
958  // by another 16 to give a nominal 62.5 khz clock
959  .prescaler = 100, // Every 100 cycles gives 625 Hz
960  .irq = {
961  .init = {
962  .NVIC_IRQChannel = RTC_WKUP_IRQn,
963  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
964  .NVIC_IRQChannelSubPriority = 0,
965  .NVIC_IRQChannelCmd = ENABLE,
966  },
967  },
968 };
969 
970 void PIOS_RTC_IRQ_Handler (void)
971 {
973 }
974 
975 #endif
976 
977 
978 #include "pios_tim_priv.h"
979 
980 //Timers used for inputs (1, 2, 5, 8)
981 
982 static const TIM_TimeBaseInitTypeDef tim_2_5_time_base = {
983  .TIM_Prescaler = (PIOS_PERIPHERAL_APB1_COUNTER_CLOCK / 1000000) - 1,
984  .TIM_ClockDivision = TIM_CKD_DIV1,
985  .TIM_CounterMode = TIM_CounterMode_Up,
986  .TIM_Period = 0xFFFF,
987  .TIM_RepetitionCounter = 0x0000,
988 };
989 
990 static const TIM_TimeBaseInitTypeDef tim_1_8_time_base = {
991  .TIM_Prescaler = (PIOS_PERIPHERAL_APB2_COUNTER_CLOCK / 1000000) - 1,
992  .TIM_ClockDivision = TIM_CKD_DIV1,
993  .TIM_CounterMode = TIM_CounterMode_Up,
994  .TIM_Period = 0xFFFF,
995  .TIM_RepetitionCounter = 0x0000,
996 };
997 
998 static const struct pios_tim_clock_cfg tim_2_cfg = {
999  .timer = TIM2,
1000  .time_base_init = &tim_2_5_time_base,
1001  .irq = {
1002  .init = {
1003  .NVIC_IRQChannel = TIM2_IRQn,
1004  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
1005  .NVIC_IRQChannelSubPriority = 0,
1006  .NVIC_IRQChannelCmd = ENABLE,
1007  },
1008  },
1009 };
1010 
1011 static const struct pios_tim_clock_cfg tim_5_cfg = {
1012  .timer = TIM5,
1013  .time_base_init = &tim_2_5_time_base,
1014  .irq = {
1015  .init = {
1016  .NVIC_IRQChannel = TIM5_IRQn,
1017  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
1018  .NVIC_IRQChannelSubPriority = 0,
1019  .NVIC_IRQChannelCmd = ENABLE,
1020  },
1021  },
1022 };
1023 
1024 static const struct pios_tim_clock_cfg tim_1_cfg = {
1025  .timer = TIM1,
1026  .time_base_init = &tim_1_8_time_base,
1027  .irq = {
1028  .init = {
1029  .NVIC_IRQChannel = TIM1_CC_IRQn,
1030  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
1031  .NVIC_IRQChannelSubPriority = 0,
1032  .NVIC_IRQChannelCmd = ENABLE,
1033  },
1034  },
1035  .irq2 = {
1036  .init = {
1037  .NVIC_IRQChannel = TIM1_UP_TIM10_IRQn,
1038  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
1039  .NVIC_IRQChannelSubPriority = 0,
1040  .NVIC_IRQChannelCmd = ENABLE,
1041  },
1042  },
1043 };
1044 
1045 static const struct pios_tim_clock_cfg tim_8_cfg = {
1046  .timer = TIM8,
1047  .time_base_init = &tim_1_8_time_base,
1048  .irq = {
1049  .init = {
1050  .NVIC_IRQChannel = TIM8_CC_IRQn,
1051  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
1052  .NVIC_IRQChannelSubPriority = 0,
1053  .NVIC_IRQChannelCmd = ENABLE,
1054  },
1055  },
1056  .irq2 = {
1057  .init = {
1058  .NVIC_IRQChannel = TIM8_UP_TIM13_IRQn,
1059  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
1060  .NVIC_IRQChannelSubPriority = 0,
1061  .NVIC_IRQChannelCmd = ENABLE,
1062  },
1063  },
1064 };
1065 
1066 // Timers used for outputs (3, 10, 11, 12)
1067 
1068 // Set up timers that only have inputs on APB1
1069 static const TIM_TimeBaseInitTypeDef tim_3_12_time_base = {
1070  .TIM_Prescaler = (PIOS_PERIPHERAL_APB1_COUNTER_CLOCK / 1000000) - 1,
1071  .TIM_ClockDivision = TIM_CKD_DIV1,
1072  .TIM_CounterMode = TIM_CounterMode_Up,
1073  .TIM_Period = ((1000000 / PIOS_SERVO_UPDATE_HZ) - 1),
1074  .TIM_RepetitionCounter = 0x0000,
1075 };
1076 
1077 // Set up timers that only have inputs on APB2
1078 static const TIM_TimeBaseInitTypeDef tim_10_11_time_base = {
1079  .TIM_Prescaler = (PIOS_PERIPHERAL_APB2_COUNTER_CLOCK / 1000000) - 1,
1080  .TIM_ClockDivision = TIM_CKD_DIV1,
1081  .TIM_CounterMode = TIM_CounterMode_Up,
1082  .TIM_Period = ((1000000 / PIOS_SERVO_UPDATE_HZ) - 1),
1083  .TIM_RepetitionCounter = 0x0000,
1084 };
1085 
1086 static const struct pios_tim_clock_cfg tim_3_cfg = {
1087  .timer = TIM3,
1088  .time_base_init = &tim_3_12_time_base,
1089  .irq = {
1090  .init = {
1091  .NVIC_IRQChannel = TIM3_IRQn,
1092  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
1093  .NVIC_IRQChannelSubPriority = 0,
1094  .NVIC_IRQChannelCmd = ENABLE,
1095  },
1096  },
1097 };
1098 
1099 static const struct pios_tim_clock_cfg tim_10_cfg = {
1100  .timer = TIM10,
1101  .time_base_init = &tim_10_11_time_base,
1102  .irq = {
1103  .init = {
1104  .NVIC_IRQChannel = TIM1_UP_TIM10_IRQn,
1105  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
1106  .NVIC_IRQChannelSubPriority = 0,
1107  .NVIC_IRQChannelCmd = ENABLE,
1108  },
1109  },
1110 };
1111 
1112 static const struct pios_tim_clock_cfg tim_11_cfg = {
1113  .timer = TIM11,
1114  .time_base_init = &tim_10_11_time_base,
1115  .irq = {
1116  .init = {
1117  .NVIC_IRQChannel = TIM1_TRG_COM_TIM11_IRQn,
1118  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
1119  .NVIC_IRQChannelSubPriority = 0,
1120  .NVIC_IRQChannelCmd = ENABLE,
1121  },
1122  },
1123 };
1124 
1125 static const struct pios_tim_clock_cfg tim_12_cfg = {
1126  .timer = TIM12,
1127  .time_base_init = &tim_3_12_time_base,
1128  .irq = {
1129  .init = {
1130  .NVIC_IRQChannel = TIM8_BRK_TIM12_IRQn,
1131  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_MID,
1132  .NVIC_IRQChannelSubPriority = 0,
1133  .NVIC_IRQChannelCmd = ENABLE,
1134  },
1135  },
1136 };
1137 
1142 /*
1143  * OUTPUTS
1144  1: TIM3_CH1 (PB4)
1145  2: TIM3_CH2 (PB5)
1146  3: TIM3_CH3 (PB0)
1147  4: TIM3_CH4 (PB1)
1148  5: TIM12_CH1 (PB14)
1149  6: TIM12_CH2 (PB15)
1150  7: TIM10_CH1 (PB8)
1151  8: TIM11_CH1 (PB9)
1152  */
1154  {
1155  .timer = TIM3,
1156  .timer_chan = TIM_Channel_1,
1157  .remap = GPIO_AF_TIM3,
1158  .pin = {
1159  .gpio = GPIOB,
1160  .init = {
1161  .GPIO_Pin = GPIO_Pin_4,
1162  .GPIO_Speed = GPIO_Speed_2MHz,
1163  .GPIO_Mode = GPIO_Mode_AF,
1164  .GPIO_OType = GPIO_OType_PP,
1165  .GPIO_PuPd = GPIO_PuPd_UP
1166  },
1167  .pin_source = GPIO_PinSource4,
1168  },
1169  },
1170  {
1171  .timer = TIM3,
1172  .timer_chan = TIM_Channel_2,
1173  .remap = GPIO_AF_TIM3,
1174  .pin = {
1175  .gpio = GPIOB,
1176  .init = {
1177  .GPIO_Pin = GPIO_Pin_5,
1178  .GPIO_Speed = GPIO_Speed_2MHz,
1179  .GPIO_Mode = GPIO_Mode_AF,
1180  .GPIO_OType = GPIO_OType_PP,
1181  .GPIO_PuPd = GPIO_PuPd_UP
1182  },
1183  .pin_source = GPIO_PinSource5,
1184  },
1185  },
1186  {
1187  .timer = TIM3,
1188  .timer_chan = TIM_Channel_3,
1189  .remap = GPIO_AF_TIM3,
1190  .pin = {
1191  .gpio = GPIOB,
1192  .init = {
1193  .GPIO_Pin = GPIO_Pin_0,
1194  .GPIO_Speed = GPIO_Speed_2MHz,
1195  .GPIO_Mode = GPIO_Mode_AF,
1196  .GPIO_OType = GPIO_OType_PP,
1197  .GPIO_PuPd = GPIO_PuPd_UP
1198  },
1199  .pin_source = GPIO_PinSource0,
1200  },
1201  },
1202  {
1203  .timer = TIM3,
1204  .timer_chan = TIM_Channel_4,
1205  .remap = GPIO_AF_TIM3,
1206  .pin = {
1207  .gpio = GPIOB,
1208  .init = {
1209  .GPIO_Pin = GPIO_Pin_1,
1210  .GPIO_Speed = GPIO_Speed_2MHz,
1211  .GPIO_Mode = GPIO_Mode_AF,
1212  .GPIO_OType = GPIO_OType_PP,
1213  .GPIO_PuPd = GPIO_PuPd_UP
1214  },
1215  .pin_source = GPIO_PinSource1,
1216  },
1217  },
1218  {
1219  .timer = TIM12,
1220  .timer_chan = TIM_Channel_1,
1221  .remap = GPIO_AF_TIM12,
1222  .pin = {
1223  .gpio = GPIOB,
1224  .init = {
1225  .GPIO_Pin = GPIO_Pin_14,
1226  .GPIO_Speed = GPIO_Speed_2MHz,
1227  .GPIO_Mode = GPIO_Mode_AF,
1228  .GPIO_OType = GPIO_OType_PP,
1229  .GPIO_PuPd = GPIO_PuPd_UP
1230  },
1231  .pin_source = GPIO_PinSource14,
1232  },
1233  },
1234  {
1235  .timer = TIM12,
1236  .timer_chan = TIM_Channel_2,
1237  .remap = GPIO_AF_TIM12,
1238  .pin = {
1239  .gpio = GPIOB,
1240  .init = {
1241  .GPIO_Pin = GPIO_Pin_15,
1242  .GPIO_Speed = GPIO_Speed_2MHz,
1243  .GPIO_Mode = GPIO_Mode_AF,
1244  .GPIO_OType = GPIO_OType_PP,
1245  .GPIO_PuPd = GPIO_PuPd_UP
1246  },
1247  .pin_source = GPIO_PinSource15,
1248  },
1249  },
1250  {
1251  .timer = TIM10,
1252  .timer_chan = TIM_Channel_1,
1253  .remap = GPIO_AF_TIM10,
1254  .pin = {
1255  .gpio = GPIOB,
1256  .init = {
1257  .GPIO_Pin = GPIO_Pin_8,
1258  .GPIO_Speed = GPIO_Speed_2MHz,
1259  .GPIO_Mode = GPIO_Mode_AF,
1260  .GPIO_OType = GPIO_OType_PP,
1261  .GPIO_PuPd = GPIO_PuPd_UP
1262  },
1263  .pin_source = GPIO_PinSource8,
1264  },
1265  },
1266  {
1267  .timer = TIM11,
1268  .timer_chan = TIM_Channel_1,
1269  .remap = GPIO_AF_TIM11,
1270  .pin = {
1271  .gpio = GPIOB,
1272  .init = {
1273  .GPIO_Pin = GPIO_Pin_9,
1274  .GPIO_Speed = GPIO_Speed_2MHz,
1275  .GPIO_Mode = GPIO_Mode_AF,
1276  .GPIO_OType = GPIO_OType_PP,
1277  .GPIO_PuPd = GPIO_PuPd_UP
1278  },
1279  .pin_source = GPIO_PinSource9,
1280  },
1281  },
1282 };
1283 
1284 
1285 /*
1286  * OUTPUTS with extra outputs on receiverport
1287  1: TIM3_CH1 (PB4)
1288  2: TIM3_CH2 (PB5)
1289  3: TIM3_CH3 (PB0)
1290  4: TIM3_CH4 (PB1)
1291  5: TIM12_CH1 (PB14)
1292  6: TIM12_CH2 (PB15)
1293  7: TIM10_CH1 (PB8)
1294  8: TIM11_CH1 (PB9)
1295  9: TIM8_CH1 (PC6) (IN2)
1296  10: TIM8_CH2 (PC7) (IN3)
1297  11: TIM8_CH3 (PC8) (IN4)
1298  12: TIM2_CH1 (PA15) (IN5)
1299  13: TIM2_CH2 (PB3) (IN6)
1300  14: TIM5_CH1 (PA0) (IN7)
1301  15: TIM5_CH2 (PA1) (IN8)
1302  */
1303 
1305  {
1306  .timer = TIM3,
1307  .timer_chan = TIM_Channel_1,
1308  .remap = GPIO_AF_TIM3,
1309  .pin = {
1310  .gpio = GPIOB,
1311  .init = {
1312  .GPIO_Pin = GPIO_Pin_4,
1313  .GPIO_Speed = GPIO_Speed_2MHz,
1314  .GPIO_Mode = GPIO_Mode_AF,
1315  .GPIO_OType = GPIO_OType_PP,
1316  .GPIO_PuPd = GPIO_PuPd_UP
1317  },
1318  .pin_source = GPIO_PinSource4,
1319  },
1320  },
1321  {
1322  .timer = TIM3,
1323  .timer_chan = TIM_Channel_2,
1324  .remap = GPIO_AF_TIM3,
1325  .pin = {
1326  .gpio = GPIOB,
1327  .init = {
1328  .GPIO_Pin = GPIO_Pin_5,
1329  .GPIO_Speed = GPIO_Speed_2MHz,
1330  .GPIO_Mode = GPIO_Mode_AF,
1331  .GPIO_OType = GPIO_OType_PP,
1332  .GPIO_PuPd = GPIO_PuPd_UP
1333  },
1334  .pin_source = GPIO_PinSource5,
1335  },
1336  },
1337  {
1338  .timer = TIM3,
1339  .timer_chan = TIM_Channel_3,
1340  .remap = GPIO_AF_TIM3,
1341  .pin = {
1342  .gpio = GPIOB,
1343  .init = {
1344  .GPIO_Pin = GPIO_Pin_0,
1345  .GPIO_Speed = GPIO_Speed_2MHz,
1346  .GPIO_Mode = GPIO_Mode_AF,
1347  .GPIO_OType = GPIO_OType_PP,
1348  .GPIO_PuPd = GPIO_PuPd_UP
1349  },
1350  .pin_source = GPIO_PinSource0,
1351  },
1352  },
1353  {
1354  .timer = TIM3,
1355  .timer_chan = TIM_Channel_4,
1356  .remap = GPIO_AF_TIM3,
1357  .pin = {
1358  .gpio = GPIOB,
1359  .init = {
1360  .GPIO_Pin = GPIO_Pin_1,
1361  .GPIO_Speed = GPIO_Speed_2MHz,
1362  .GPIO_Mode = GPIO_Mode_AF,
1363  .GPIO_OType = GPIO_OType_PP,
1364  .GPIO_PuPd = GPIO_PuPd_UP
1365  },
1366  .pin_source = GPIO_PinSource1,
1367  },
1368  },
1369  {
1370  .timer = TIM12,
1371  .timer_chan = TIM_Channel_1,
1372  .remap = GPIO_AF_TIM12,
1373  .pin = {
1374  .gpio = GPIOB,
1375  .init = {
1376  .GPIO_Pin = GPIO_Pin_14,
1377  .GPIO_Speed = GPIO_Speed_2MHz,
1378  .GPIO_Mode = GPIO_Mode_AF,
1379  .GPIO_OType = GPIO_OType_PP,
1380  .GPIO_PuPd = GPIO_PuPd_UP
1381  },
1382  .pin_source = GPIO_PinSource14,
1383  },
1384  },
1385  {
1386  .timer = TIM12,
1387  .timer_chan = TIM_Channel_2,
1388  .remap = GPIO_AF_TIM12,
1389  .pin = {
1390  .gpio = GPIOB,
1391  .init = {
1392  .GPIO_Pin = GPIO_Pin_15,
1393  .GPIO_Speed = GPIO_Speed_2MHz,
1394  .GPIO_Mode = GPIO_Mode_AF,
1395  .GPIO_OType = GPIO_OType_PP,
1396  .GPIO_PuPd = GPIO_PuPd_UP
1397  },
1398  .pin_source = GPIO_PinSource15,
1399  },
1400  },
1401  {
1402  .timer = TIM10,
1403  .timer_chan = TIM_Channel_1,
1404  .remap = GPIO_AF_TIM10,
1405  .pin = {
1406  .gpio = GPIOB,
1407  .init = {
1408  .GPIO_Pin = GPIO_Pin_8,
1409  .GPIO_Speed = GPIO_Speed_2MHz,
1410  .GPIO_Mode = GPIO_Mode_AF,
1411  .GPIO_OType = GPIO_OType_PP,
1412  .GPIO_PuPd = GPIO_PuPd_UP
1413  },
1414  .pin_source = GPIO_PinSource8,
1415  },
1416  },
1417  {
1418  .timer = TIM11,
1419  .timer_chan = TIM_Channel_1,
1420  .remap = GPIO_AF_TIM11,
1421  .pin = {
1422  .gpio = GPIOB,
1423  .init = {
1424  .GPIO_Pin = GPIO_Pin_9,
1425  .GPIO_Speed = GPIO_Speed_2MHz,
1426  .GPIO_Mode = GPIO_Mode_AF,
1427  .GPIO_OType = GPIO_OType_PP,
1428  .GPIO_PuPd = GPIO_PuPd_UP
1429  },
1430  .pin_source = GPIO_PinSource9,
1431  },
1432  },
1433  {
1434  .timer = TIM8,
1435  .timer_chan = TIM_Channel_1,
1436  .remap = GPIO_AF_TIM8,
1437  .pin = {
1438  .gpio = GPIOC,
1439  .init = {
1440  .GPIO_Pin = GPIO_Pin_6,
1441  .GPIO_Speed = GPIO_Speed_2MHz,
1442  .GPIO_Mode = GPIO_Mode_AF,
1443  .GPIO_OType = GPIO_OType_PP,
1444  .GPIO_PuPd = GPIO_PuPd_UP
1445  },
1446  .pin_source = GPIO_PinSource6,
1447  },
1448  },
1449  {
1450  .timer = TIM8,
1451  .timer_chan = TIM_Channel_2,
1452  .remap = GPIO_AF_TIM8,
1453  .pin = {
1454  .gpio = GPIOC,
1455  .init = {
1456  .GPIO_Pin = GPIO_Pin_7,
1457  .GPIO_Speed = GPIO_Speed_2MHz,
1458  .GPIO_Mode = GPIO_Mode_AF,
1459  .GPIO_OType = GPIO_OType_PP,
1460  .GPIO_PuPd = GPIO_PuPd_UP
1461  },
1462  .pin_source = GPIO_PinSource7,
1463  },
1464  },
1465  {
1466  .timer = TIM8,
1467  .timer_chan = TIM_Channel_3,
1468  .remap = GPIO_AF_TIM8,
1469  .pin = {
1470  .gpio = GPIOC,
1471  .init = {
1472  .GPIO_Pin = GPIO_Pin_8,
1473  .GPIO_Speed = GPIO_Speed_2MHz,
1474  .GPIO_Mode = GPIO_Mode_AF,
1475  .GPIO_OType = GPIO_OType_PP,
1476  .GPIO_PuPd = GPIO_PuPd_UP
1477  },
1478  .pin_source = GPIO_PinSource8,
1479  },
1480  },
1481  {
1482  .timer = TIM2,
1483  .timer_chan = TIM_Channel_1,
1484  .remap = GPIO_AF_TIM2,
1485  .pin = {
1486  .gpio = GPIOA,
1487  .init = {
1488  .GPIO_Pin = GPIO_Pin_15,
1489  .GPIO_Speed = GPIO_Speed_2MHz,
1490  .GPIO_Mode = GPIO_Mode_AF,
1491  .GPIO_OType = GPIO_OType_PP,
1492  .GPIO_PuPd = GPIO_PuPd_UP
1493  },
1494  .pin_source = GPIO_PinSource15,
1495  },
1496  },
1497  {
1498  .timer = TIM2,
1499  .timer_chan = TIM_Channel_2,
1500  .remap = GPIO_AF_TIM2,
1501  .pin = {
1502  .gpio = GPIOB,
1503  .init = {
1504  .GPIO_Pin = GPIO_Pin_3,
1505  .GPIO_Speed = GPIO_Speed_2MHz,
1506  .GPIO_Mode = GPIO_Mode_AF,
1507  .GPIO_OType = GPIO_OType_PP,
1508  .GPIO_PuPd = GPIO_PuPd_UP
1509  },
1510  .pin_source = GPIO_PinSource3,
1511  },
1512  },
1513  {
1514  .timer = TIM5,
1515  .timer_chan = TIM_Channel_1,
1516  .remap = GPIO_AF_TIM5,
1517  .pin = {
1518  .gpio = GPIOA,
1519  .init = {
1520  .GPIO_Pin = GPIO_Pin_0,
1521  .GPIO_Speed = GPIO_Speed_2MHz,
1522  .GPIO_Mode = GPIO_Mode_AF,
1523  .GPIO_OType = GPIO_OType_PP,
1524  .GPIO_PuPd = GPIO_PuPd_UP
1525  },
1526  .pin_source = GPIO_PinSource0,
1527  },
1528  },
1529  {
1530  .timer = TIM5,
1531  .timer_chan = TIM_Channel_2,
1532  .remap = GPIO_AF_TIM5,
1533  .pin = {
1534  .gpio = GPIOA,
1535  .init = {
1536  .GPIO_Pin = GPIO_Pin_1,
1537  .GPIO_Speed = GPIO_Speed_2MHz,
1538  .GPIO_Mode = GPIO_Mode_AF,
1539  .GPIO_OType = GPIO_OType_PP,
1540  .GPIO_PuPd = GPIO_PuPd_UP
1541  },
1542  .pin_source = GPIO_PinSource1,
1543  },
1544  },
1545 };
1546 
1547 /*
1548  * OUTPUTS with extra outputs on receiverport
1549  1: TIM3_CH1 (PB4)
1550  2: TIM3_CH2 (PB5)
1551  3: TIM3_CH3 (PB0)
1552  4: TIM3_CH4 (PB1)
1553  5: TIM12_CH1 (PB14)
1554  6: TIM12_CH2 (PB15)
1555  7: TIM10_CH1 (PB8)
1556  8: TIM11_CH1 (PB9)
1557  9: TIM1_CH3 (PA10) (IN1)
1558  10: TIM8_CH1 (PC6) (IN2)
1559  11: TIM8_CH2 (PC7) (IN3)
1560  12: TIM8_CH3 (PC8) (IN4)
1561  13: TIM2_CH1 (PA15) (IN5)
1562  14: TIM2_CH2 (PB3) (IN6)
1563  15: TIM5_CH1 (PA0) (IN7)
1564  16: TIM5_CH2 (PA1) (IN8)
1565  */
1566 
1568  {
1569  .timer = TIM3,
1570  .timer_chan = TIM_Channel_1,
1571  .remap = GPIO_AF_TIM3,
1572  .pin = {
1573  .gpio = GPIOB,
1574  .init = {
1575  .GPIO_Pin = GPIO_Pin_4,
1576  .GPIO_Speed = GPIO_Speed_2MHz,
1577  .GPIO_Mode = GPIO_Mode_AF,
1578  .GPIO_OType = GPIO_OType_PP,
1579  .GPIO_PuPd = GPIO_PuPd_UP
1580  },
1581  .pin_source = GPIO_PinSource4,
1582  },
1583  },
1584  {
1585  .timer = TIM3,
1586  .timer_chan = TIM_Channel_2,
1587  .remap = GPIO_AF_TIM3,
1588  .pin = {
1589  .gpio = GPIOB,
1590  .init = {
1591  .GPIO_Pin = GPIO_Pin_5,
1592  .GPIO_Speed = GPIO_Speed_2MHz,
1593  .GPIO_Mode = GPIO_Mode_AF,
1594  .GPIO_OType = GPIO_OType_PP,
1595  .GPIO_PuPd = GPIO_PuPd_UP
1596  },
1597  .pin_source = GPIO_PinSource5,
1598  },
1599  },
1600  {
1601  .timer = TIM3,
1602  .timer_chan = TIM_Channel_3,
1603  .remap = GPIO_AF_TIM3,
1604  .pin = {
1605  .gpio = GPIOB,
1606  .init = {
1607  .GPIO_Pin = GPIO_Pin_0,
1608  .GPIO_Speed = GPIO_Speed_2MHz,
1609  .GPIO_Mode = GPIO_Mode_AF,
1610  .GPIO_OType = GPIO_OType_PP,
1611  .GPIO_PuPd = GPIO_PuPd_UP
1612  },
1613  .pin_source = GPIO_PinSource0,
1614  },
1615  },
1616  {
1617  .timer = TIM3,
1618  .timer_chan = TIM_Channel_4,
1619  .remap = GPIO_AF_TIM3,
1620  .pin = {
1621  .gpio = GPIOB,
1622  .init = {
1623  .GPIO_Pin = GPIO_Pin_1,
1624  .GPIO_Speed = GPIO_Speed_2MHz,
1625  .GPIO_Mode = GPIO_Mode_AF,
1626  .GPIO_OType = GPIO_OType_PP,
1627  .GPIO_PuPd = GPIO_PuPd_UP
1628  },
1629  .pin_source = GPIO_PinSource1,
1630  },
1631  },
1632  {
1633  .timer = TIM12,
1634  .timer_chan = TIM_Channel_1,
1635  .remap = GPIO_AF_TIM12,
1636  .pin = {
1637  .gpio = GPIOB,
1638  .init = {
1639  .GPIO_Pin = GPIO_Pin_14,
1640  .GPIO_Speed = GPIO_Speed_2MHz,
1641  .GPIO_Mode = GPIO_Mode_AF,
1642  .GPIO_OType = GPIO_OType_PP,
1643  .GPIO_PuPd = GPIO_PuPd_UP
1644  },
1645  .pin_source = GPIO_PinSource14,
1646  },
1647  },
1648  {
1649  .timer = TIM12,
1650  .timer_chan = TIM_Channel_2,
1651  .remap = GPIO_AF_TIM12,
1652  .pin = {
1653  .gpio = GPIOB,
1654  .init = {
1655  .GPIO_Pin = GPIO_Pin_15,
1656  .GPIO_Speed = GPIO_Speed_2MHz,
1657  .GPIO_Mode = GPIO_Mode_AF,
1658  .GPIO_OType = GPIO_OType_PP,
1659  .GPIO_PuPd = GPIO_PuPd_UP
1660  },
1661  .pin_source = GPIO_PinSource15,
1662  },
1663  },
1664  {
1665  .timer = TIM10,
1666  .timer_chan = TIM_Channel_1,
1667  .remap = GPIO_AF_TIM10,
1668  .pin = {
1669  .gpio = GPIOB,
1670  .init = {
1671  .GPIO_Pin = GPIO_Pin_8,
1672  .GPIO_Speed = GPIO_Speed_2MHz,
1673  .GPIO_Mode = GPIO_Mode_AF,
1674  .GPIO_OType = GPIO_OType_PP,
1675  .GPIO_PuPd = GPIO_PuPd_UP
1676  },
1677  .pin_source = GPIO_PinSource8,
1678  },
1679  },
1680  {
1681  .timer = TIM11,
1682  .timer_chan = TIM_Channel_1,
1683  .remap = GPIO_AF_TIM11,
1684  .pin = {
1685  .gpio = GPIOB,
1686  .init = {
1687  .GPIO_Pin = GPIO_Pin_9,
1688  .GPIO_Speed = GPIO_Speed_2MHz,
1689  .GPIO_Mode = GPIO_Mode_AF,
1690  .GPIO_OType = GPIO_OType_PP,
1691  .GPIO_PuPd = GPIO_PuPd_UP
1692  },
1693  .pin_source = GPIO_PinSource9,
1694  },
1695  },
1696  {
1697  .timer = TIM1,
1698  .timer_chan = TIM_Channel_3,
1699  .remap = GPIO_AF_TIM1,
1700  .pin = {
1701  .gpio = GPIOA,
1702  .init = {
1703  .GPIO_Pin = GPIO_Pin_10,
1704  .GPIO_Speed = GPIO_Speed_2MHz,
1705  .GPIO_Mode = GPIO_Mode_AF,
1706  .GPIO_OType = GPIO_OType_PP,
1707  .GPIO_PuPd = GPIO_PuPd_UP
1708  },
1709  .pin_source = GPIO_PinSource10,
1710  },
1711  },
1712  {
1713  .timer = TIM8,
1714  .timer_chan = TIM_Channel_1,
1715  .remap = GPIO_AF_TIM8,
1716  .pin = {
1717  .gpio = GPIOC,
1718  .init = {
1719  .GPIO_Pin = GPIO_Pin_6,
1720  .GPIO_Speed = GPIO_Speed_2MHz,
1721  .GPIO_Mode = GPIO_Mode_AF,
1722  .GPIO_OType = GPIO_OType_PP,
1723  .GPIO_PuPd = GPIO_PuPd_UP
1724  },
1725  .pin_source = GPIO_PinSource6,
1726  },
1727  },
1728  {
1729  .timer = TIM8,
1730  .timer_chan = TIM_Channel_2,
1731  .remap = GPIO_AF_TIM8,
1732  .pin = {
1733  .gpio = GPIOC,
1734  .init = {
1735  .GPIO_Pin = GPIO_Pin_7,
1736  .GPIO_Speed = GPIO_Speed_2MHz,
1737  .GPIO_Mode = GPIO_Mode_AF,
1738  .GPIO_OType = GPIO_OType_PP,
1739  .GPIO_PuPd = GPIO_PuPd_UP
1740  },
1741  .pin_source = GPIO_PinSource7,
1742  },
1743  },
1744  {
1745  .timer = TIM8,
1746  .timer_chan = TIM_Channel_3,
1747  .remap = GPIO_AF_TIM8,
1748  .pin = {
1749  .gpio = GPIOC,
1750  .init = {
1751  .GPIO_Pin = GPIO_Pin_8,
1752  .GPIO_Speed = GPIO_Speed_2MHz,
1753  .GPIO_Mode = GPIO_Mode_AF,
1754  .GPIO_OType = GPIO_OType_PP,
1755  .GPIO_PuPd = GPIO_PuPd_UP
1756  },
1757  .pin_source = GPIO_PinSource8,
1758  },
1759  },
1760  {
1761  .timer = TIM2,
1762  .timer_chan = TIM_Channel_1,
1763  .remap = GPIO_AF_TIM2,
1764  .pin = {
1765  .gpio = GPIOA,
1766  .init = {
1767  .GPIO_Pin = GPIO_Pin_15,
1768  .GPIO_Speed = GPIO_Speed_2MHz,
1769  .GPIO_Mode = GPIO_Mode_AF,
1770  .GPIO_OType = GPIO_OType_PP,
1771  .GPIO_PuPd = GPIO_PuPd_UP
1772  },
1773  .pin_source = GPIO_PinSource15,
1774  },
1775  },
1776  {
1777  .timer = TIM2,
1778  .timer_chan = TIM_Channel_2,
1779  .remap = GPIO_AF_TIM2,
1780  .pin = {
1781  .gpio = GPIOB,
1782  .init = {
1783  .GPIO_Pin = GPIO_Pin_3,
1784  .GPIO_Speed = GPIO_Speed_2MHz,
1785  .GPIO_Mode = GPIO_Mode_AF,
1786  .GPIO_OType = GPIO_OType_PP,
1787  .GPIO_PuPd = GPIO_PuPd_UP
1788  },
1789  .pin_source = GPIO_PinSource3,
1790  },
1791  },
1792  {
1793  .timer = TIM5,
1794  .timer_chan = TIM_Channel_1,
1795  .remap = GPIO_AF_TIM5,
1796  .pin = {
1797  .gpio = GPIOA,
1798  .init = {
1799  .GPIO_Pin = GPIO_Pin_0,
1800  .GPIO_Speed = GPIO_Speed_2MHz,
1801  .GPIO_Mode = GPIO_Mode_AF,
1802  .GPIO_OType = GPIO_OType_PP,
1803  .GPIO_PuPd = GPIO_PuPd_UP
1804  },
1805  .pin_source = GPIO_PinSource0,
1806  },
1807  },
1808  {
1809  .timer = TIM5,
1810  .timer_chan = TIM_Channel_2,
1811  .remap = GPIO_AF_TIM5,
1812  .pin = {
1813  .gpio = GPIOA,
1814  .init = {
1815  .GPIO_Pin = GPIO_Pin_1,
1816  .GPIO_Speed = GPIO_Speed_2MHz,
1817  .GPIO_Mode = GPIO_Mode_AF,
1818  .GPIO_OType = GPIO_OType_PP,
1819  .GPIO_PuPd = GPIO_PuPd_UP
1820  },
1821  .pin_source = GPIO_PinSource1,
1822  },
1823  },
1824 };
1825 
1826 #if defined(PIOS_INCLUDE_SERVO) && defined(PIOS_INCLUDE_TIM)
1827 /*
1828  * Servo outputs
1829  */
1830 #include <pios_servo_priv.h>
1831 
1832 const struct pios_servo_cfg pios_servo_cfg = {
1833  .tim_oc_init = {
1834  .TIM_OCMode = TIM_OCMode_PWM1,
1835  .TIM_OutputState = TIM_OutputState_Enable,
1836  .TIM_OutputNState = TIM_OutputNState_Disable,
1837  .TIM_Pulse = PIOS_SERVOS_INITIAL_POSITION,
1838  .TIM_OCPolarity = TIM_OCPolarity_High,
1839  .TIM_OCNPolarity = TIM_OCPolarity_High,
1840  .TIM_OCIdleState = TIM_OCIdleState_Reset,
1841  .TIM_OCNIdleState = TIM_OCNIdleState_Reset,
1842  },
1843  .channels = pios_tim_servoport_all_pins,
1844  .num_channels = NELEMENTS(pios_tim_servoport_all_pins),
1845 };
1846 
1847 const struct pios_servo_cfg pios_servo_with_adc_cfg = {
1848  .tim_oc_init = {
1849  .TIM_OCMode = TIM_OCMode_PWM1,
1850  .TIM_OutputState = TIM_OutputState_Enable,
1851  .TIM_OutputNState = TIM_OutputNState_Disable,
1852  .TIM_Pulse = PIOS_SERVOS_INITIAL_POSITION,
1853  .TIM_OCPolarity = TIM_OCPolarity_High,
1854  .TIM_OCNPolarity = TIM_OCPolarity_High,
1855  .TIM_OCIdleState = TIM_OCIdleState_Reset,
1856  .TIM_OCNIdleState = TIM_OCNIdleState_Reset,
1857  },
1858  /* Leave the last two for ADC use */
1859  .channels = pios_tim_servoport_all_pins,
1860  .num_channels = NELEMENTS(pios_tim_servoport_all_pins) - 2,
1861 };
1862 
1863 const struct pios_servo_cfg pios_servo_with_rcvr_cfg = {
1864  .tim_oc_init = {
1865  .TIM_OCMode = TIM_OCMode_PWM1,
1866  .TIM_OutputState = TIM_OutputState_Enable,
1867  .TIM_OutputNState = TIM_OutputNState_Disable,
1868  .TIM_Pulse = PIOS_SERVOS_INITIAL_POSITION,
1869  .TIM_OCPolarity = TIM_OCPolarity_High,
1870  .TIM_OCNPolarity = TIM_OCPolarity_High,
1871  .TIM_OCIdleState = TIM_OCIdleState_Reset,
1872  .TIM_OCNIdleState = TIM_OCNIdleState_Reset,
1873  },
1875  .num_channels = NELEMENTS(pios_tim_servoport_rcvrport_pins),
1876 };
1877 
1878 const struct pios_servo_cfg pios_servo_with_rcvr_ppm_cfg = {
1879  .tim_oc_init = {
1880  .TIM_OCMode = TIM_OCMode_PWM1,
1881  .TIM_OutputState = TIM_OutputState_Enable,
1882  .TIM_OutputNState = TIM_OutputNState_Disable,
1883  .TIM_Pulse = PIOS_SERVOS_INITIAL_POSITION,
1884  .TIM_OCPolarity = TIM_OCPolarity_High,
1885  .TIM_OCNPolarity = TIM_OCPolarity_High,
1886  .TIM_OCIdleState = TIM_OCIdleState_Reset,
1887  .TIM_OCNIdleState = TIM_OCNIdleState_Reset,
1888  },
1890  .num_channels = NELEMENTS(pios_tim_servoport_rcvrport_PPM_pins),
1891 };
1892 
1893 const struct pios_servo_cfg pios_servo_with_rcvr_with_adc_cfg = {
1894  .tim_oc_init = {
1895  .TIM_OCMode = TIM_OCMode_PWM1,
1896  .TIM_OutputState = TIM_OutputState_Enable,
1897  .TIM_OutputNState = TIM_OutputNState_Disable,
1898  .TIM_Pulse = PIOS_SERVOS_INITIAL_POSITION,
1899  .TIM_OCPolarity = TIM_OCPolarity_High,
1900  .TIM_OCNPolarity = TIM_OCPolarity_High,
1901  .TIM_OCIdleState = TIM_OCIdleState_Reset,
1902  .TIM_OCNIdleState = TIM_OCNIdleState_Reset,
1903  },
1904  /* Leave the last two for ADC use */
1906  .num_channels = NELEMENTS(pios_tim_servoport_rcvrport_pins) - 2,
1907 };
1908 
1909 const struct pios_servo_cfg pios_servo_with_rcvr_ppm_with_adc_cfg = {
1910  .tim_oc_init = {
1911  .TIM_OCMode = TIM_OCMode_PWM1,
1912  .TIM_OutputState = TIM_OutputState_Enable,
1913  .TIM_OutputNState = TIM_OutputNState_Disable,
1914  .TIM_Pulse = PIOS_SERVOS_INITIAL_POSITION,
1915  .TIM_OCPolarity = TIM_OCPolarity_High,
1916  .TIM_OCNPolarity = TIM_OCPolarity_High,
1917  .TIM_OCIdleState = TIM_OCIdleState_Reset,
1918  .TIM_OCNIdleState = TIM_OCNIdleState_Reset,
1919  },
1920  /* Leave the last two for ADC use */
1922  .num_channels = NELEMENTS(pios_tim_servoport_rcvrport_PPM_pins) - 2,
1923 };
1924 
1925 #endif /* PIOS_INCLUDE_SERVO && PIOS_INCLUDE_TIM */
1926 
1927 /*
1928  * INPUTS
1929  1: TIM1_CH3 (PA10)
1930  2: TIM8_CH1 (PC6)
1931  3: TIM8_CH2 (PC7)
1932  4: TIM8_CH3 (PC8)
1933  5: TIM2_CH1 (PA15)
1934  6: TIM2_CH2 (PB3)
1935  7: TIM5_CH1 (PA0)
1936  8: TIM5_CH2 (PA1)
1937  */
1939  {
1940  .timer = TIM1,
1941  .timer_chan = TIM_Channel_3,
1942  .remap = GPIO_AF_TIM1,
1943  .pin = {
1944  .gpio = GPIOA,
1945  .init = {
1946  .GPIO_Pin = GPIO_Pin_10,
1947  .GPIO_Speed = GPIO_Speed_2MHz,
1948  .GPIO_Mode = GPIO_Mode_AF,
1949  .GPIO_OType = GPIO_OType_PP,
1950  .GPIO_PuPd = GPIO_PuPd_UP
1951  },
1952  .pin_source = GPIO_PinSource10,
1953  },
1954  },
1955  {
1956  .timer = TIM8,
1957  .timer_chan = TIM_Channel_1,
1958  .remap = GPIO_AF_TIM8,
1959  .pin = {
1960  .gpio = GPIOC,
1961  .init = {
1962  .GPIO_Pin = GPIO_Pin_6,
1963  .GPIO_Speed = GPIO_Speed_2MHz,
1964  .GPIO_Mode = GPIO_Mode_AF,
1965  .GPIO_OType = GPIO_OType_PP,
1966  .GPIO_PuPd = GPIO_PuPd_UP
1967  },
1968  .pin_source = GPIO_PinSource6,
1969  },
1970  },
1971  {
1972  .timer = TIM8,
1973  .timer_chan = TIM_Channel_2,
1974  .remap = GPIO_AF_TIM8,
1975  .pin = {
1976  .gpio = GPIOC,
1977  .init = {
1978  .GPIO_Pin = GPIO_Pin_7,
1979  .GPIO_Speed = GPIO_Speed_2MHz,
1980  .GPIO_Mode = GPIO_Mode_AF,
1981  .GPIO_OType = GPIO_OType_PP,
1982  .GPIO_PuPd = GPIO_PuPd_UP
1983  },
1984  .pin_source = GPIO_PinSource7,
1985  },
1986  },
1987  {
1988  .timer = TIM8,
1989  .timer_chan = TIM_Channel_3,
1990  .remap = GPIO_AF_TIM8,
1991  .pin = {
1992  .gpio = GPIOC,
1993  .init = {
1994  .GPIO_Pin = GPIO_Pin_8,
1995  .GPIO_Speed = GPIO_Speed_2MHz,
1996  .GPIO_Mode = GPIO_Mode_AF,
1997  .GPIO_OType = GPIO_OType_PP,
1998  .GPIO_PuPd = GPIO_PuPd_UP
1999  },
2000  .pin_source = GPIO_PinSource8,
2001  },
2002  },
2003  {
2004  .timer = TIM2,
2005  .timer_chan = TIM_Channel_1,
2006  .remap = GPIO_AF_TIM2,
2007  .pin = {
2008  .gpio = GPIOA,
2009  .init = {
2010  .GPIO_Pin = GPIO_Pin_15,
2011  .GPIO_Speed = GPIO_Speed_2MHz,
2012  .GPIO_Mode = GPIO_Mode_AF,
2013  .GPIO_OType = GPIO_OType_PP,
2014  .GPIO_PuPd = GPIO_PuPd_UP
2015  },
2016  .pin_source = GPIO_PinSource15,
2017  },
2018  },
2019  {
2020  .timer = TIM2,
2021  .timer_chan = TIM_Channel_2,
2022  .remap = GPIO_AF_TIM2,
2023  .pin = {
2024  .gpio = GPIOB,
2025  .init = {
2026  .GPIO_Pin = GPIO_Pin_3,
2027  .GPIO_Speed = GPIO_Speed_2MHz,
2028  .GPIO_Mode = GPIO_Mode_AF,
2029  .GPIO_OType = GPIO_OType_PP,
2030  .GPIO_PuPd = GPIO_PuPd_UP
2031  },
2032  .pin_source = GPIO_PinSource3,
2033  },
2034  },
2035  {
2036  .timer = TIM5,
2037  .timer_chan = TIM_Channel_1,
2038  .remap = GPIO_AF_TIM5,
2039  .pin = {
2040  .gpio = GPIOA,
2041  .init = {
2042  .GPIO_Pin = GPIO_Pin_0,
2043  .GPIO_Speed = GPIO_Speed_2MHz,
2044  .GPIO_Mode = GPIO_Mode_AF,
2045  .GPIO_OType = GPIO_OType_PP,
2046  .GPIO_PuPd = GPIO_PuPd_UP
2047  },
2048  .pin_source = GPIO_PinSource0,
2049  },
2050  },
2051  {
2052  .timer = TIM5,
2053  .timer_chan = TIM_Channel_2,
2054  .remap = GPIO_AF_TIM5,
2055  .pin = {
2056  .gpio = GPIOA,
2057  .init = {
2058  .GPIO_Pin = GPIO_Pin_1,
2059  .GPIO_Speed = GPIO_Speed_2MHz,
2060  .GPIO_Mode = GPIO_Mode_AF,
2061  .GPIO_OType = GPIO_OType_PP,
2062  .GPIO_PuPd = GPIO_PuPd_UP
2063  },
2064  .pin_source = GPIO_PinSource1,
2065  },
2066  },
2067 };
2068 
2069 /*
2070  * PWM Inputs
2071  */
2072 #if defined(PIOS_INCLUDE_PWM) || defined(PIOS_INCLUDE_PPM)
2073 #include <pios_pwm_priv.h>
2074 
2075 const struct pios_pwm_cfg pios_pwm_cfg = {
2076  .tim_ic_init = {
2077  .TIM_ICPolarity = TIM_ICPolarity_Rising,
2078  .TIM_ICSelection = TIM_ICSelection_DirectTI,
2079  .TIM_ICPrescaler = TIM_ICPSC_DIV1,
2080  .TIM_ICFilter = 0x0,
2081  },
2082  .channels = pios_tim_rcvrport_all_channels,
2083  .num_channels = NELEMENTS(pios_tim_rcvrport_all_channels),
2084 };
2085 
2086 const struct pios_pwm_cfg pios_pwm_with_adc_cfg = {
2087  .tim_ic_init = {
2088  .TIM_ICPolarity = TIM_ICPolarity_Rising,
2089  .TIM_ICSelection = TIM_ICSelection_DirectTI,
2090  .TIM_ICPrescaler = TIM_ICPSC_DIV1,
2091  .TIM_ICFilter = 0x0,
2092  },
2093  /* Leave the last two for ADC use */
2094  .channels = pios_tim_rcvrport_all_channels,
2095  .num_channels = NELEMENTS(pios_tim_rcvrport_all_channels) - 2,
2096 };
2097 
2098 const struct pios_pwm_cfg pios_pwm_with_ppm_cfg = {
2099  .tim_ic_init = {
2100  .TIM_ICPolarity = TIM_ICPolarity_Rising,
2101  .TIM_ICSelection = TIM_ICSelection_DirectTI,
2102  .TIM_ICPrescaler = TIM_ICPSC_DIV1,
2103  .TIM_ICFilter = 0x0,
2104  },
2105  /* Leave the first channel for PPM use and use the rest for PWM */
2106  .channels = &pios_tim_rcvrport_all_channels[1],
2107  .num_channels = NELEMENTS(pios_tim_rcvrport_all_channels) - 1,
2108 };
2109 
2110 const struct pios_pwm_cfg pios_pwm_with_ppm_with_adc_cfg = {
2111  .tim_ic_init = {
2112  .TIM_ICPolarity = TIM_ICPolarity_Rising,
2113  .TIM_ICSelection = TIM_ICSelection_DirectTI,
2114  .TIM_ICPrescaler = TIM_ICPSC_DIV1,
2115  .TIM_ICFilter = 0x0,
2116  },
2117  /* Leave the first channel for PPM, the last two for ADC use and use the rest for PWM */
2118  .channels = &pios_tim_rcvrport_all_channels[1],
2119  .num_channels = NELEMENTS(pios_tim_rcvrport_all_channels) - 1 - 2,
2120 };
2121 
2122 #endif
2123 
2124 /*
2125  * PPM Input
2126  */
2127 #if defined(PIOS_INCLUDE_PPM)
2128 #include <pios_ppm_priv.h>
2129 
2130 static const struct pios_ppm_cfg pios_ppm_cfg = {
2131  .tim_ic_init = {
2132  .TIM_ICPolarity = TIM_ICPolarity_Rising,
2133  .TIM_ICSelection = TIM_ICSelection_DirectTI,
2134  .TIM_ICPrescaler = TIM_ICPSC_DIV1,
2135  .TIM_ICFilter = 0x0,
2136  .TIM_Channel = TIM_Channel_3,
2137  },
2138  /* Use only the first channel for ppm */
2139  .channels = &pios_tim_rcvrport_all_channels[0],
2140  .num_channels = 1,
2141 };
2142 
2143 static const struct pios_ppm_cfg pios_ppm_in4_cfg = {
2144  .tim_ic_init = {
2145  .TIM_ICPolarity = TIM_ICPolarity_Rising,
2146  .TIM_ICSelection = TIM_ICSelection_DirectTI,
2147  .TIM_ICPrescaler = TIM_ICPSC_DIV1,
2148  .TIM_ICFilter = 0x0,
2149  .TIM_Channel = TIM_Channel_3,
2150  },
2151  /* Use only the fourth channel for ppm */
2152  .channels = &pios_tim_rcvrport_all_channels[3],
2153  .num_channels = 1,
2154 };
2155 
2156 #endif //PPM
2157 
2158 #if defined(PIOS_INCLUDE_RCVR)
2159 #include "pios_rcvr_priv.h"
2160 #endif /* PIOS_INCLUDE_RCVR */
2161 
2162 #if defined(PIOS_INCLUDE_USB)
2163 #include "pios_usb_priv.h"
2164 
2165 static const struct pios_usb_cfg pios_usb_main_cfg = {
2166  .irq = {
2167  .init = {
2168  .NVIC_IRQChannel = OTG_FS_IRQn,
2169  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGHEST,
2170  .NVIC_IRQChannelSubPriority = 0,
2171  .NVIC_IRQChannelCmd = ENABLE,
2172  },
2173  },
2174  .vsense = {
2175  .gpio = GPIOA,
2176  .init = {
2177  .GPIO_Pin = GPIO_Pin_9,
2178  .GPIO_Speed = GPIO_Speed_25MHz,
2179  .GPIO_Mode = GPIO_Mode_IN,
2180  .GPIO_OType = GPIO_OType_OD,
2181  .GPIO_PuPd = GPIO_PuPd_UP,
2182  },
2183  }
2184 };
2185 
2186 const struct pios_usb_cfg * PIOS_BOARD_HW_DEFS_GetUsbCfg (uint32_t board_revision)
2187 {
2188  return &pios_usb_main_cfg;
2189 }
2190 
2191 #include "pios_usb_board_data_priv.h"
2194 #include "pios_usbhook.h"
2195 
2196 #endif /* PIOS_INCLUDE_USB */
2197 
2198 #if defined(PIOS_INCLUDE_COM_MSG)
2199 
2200 #include <pios_com_msg_priv.h>
2201 
2202 #endif /* PIOS_INCLUDE_COM_MSG */
2203 
2204 #if defined(PIOS_INCLUDE_USB_HID) && !defined(PIOS_INCLUDE_USB_CDC)
2205 #include <pios_usb_hid_priv.h>
2206 
2207 const struct pios_usb_hid_cfg pios_usb_hid_cfg = {
2208  .data_if = 0,
2209  .data_rx_ep = 1,
2210  .data_tx_ep = 1,
2211 };
2212 #endif /* PIOS_INCLUDE_USB_HID && !PIOS_INCLUDE_USB_CDC */
2213 
2214 #if defined(PIOS_INCLUDE_USB_HID) && defined(PIOS_INCLUDE_USB_CDC)
2215 #include <pios_usb_cdc_priv.h>
2216 
2217 const struct pios_usb_cdc_cfg pios_usb_cdc_cfg = {
2218  .ctrl_if = 0,
2219  .ctrl_tx_ep = 2,
2220 
2221  .data_if = 1,
2222  .data_rx_ep = 3,
2223  .data_tx_ep = 3,
2224 };
2225 
2226 #include <pios_usb_hid_priv.h>
2227 
2228 const struct pios_usb_hid_cfg pios_usb_hid_cfg = {
2229  .data_if = 2,
2230  .data_rx_ep = 1,
2231  .data_tx_ep = 1,
2232 };
2233 #endif /* PIOS_INCLUDE_USB_HID && PIOS_INCLUDE_USB_CDC */
2234 
2235 #if defined(PIOS_INCLUDE_ADC)
2236 #include "pios_adc_priv.h"
2237 #include "pios_internal_adc_priv.h"
2238 
2239 void PIOS_ADC_DMA_irq_handler(void);
2240 void DMA2_Stream0_IRQHandler(void) __attribute__((alias("PIOS_ADC_DMA_irq_handler")));
2241 struct pios_internal_adc_cfg pios_adc_cfg = {
2242  .adc_dev_master = ADC1,
2243  .dma = {
2244  .irq = {
2245  .flags = (DMA_FLAG_TCIF0 | DMA_FLAG_TEIF0 | DMA_FLAG_HTIF0),
2246  .init = {
2247  .NVIC_IRQChannel = DMA2_Stream0_IRQn,
2248  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_LOW,
2249  .NVIC_IRQChannelSubPriority = 0,
2250  .NVIC_IRQChannelCmd = ENABLE,
2251  },
2252  },
2253  .rx = {
2254  .channel = DMA2_Stream0,
2255  .init = {
2256  .DMA_Channel = DMA_Channel_0,
2257  .DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR
2258  },
2259  }
2260  },
2261  .half_flag = DMA_IT_HTIF0,
2262  .full_flag = DMA_IT_TCIF0,
2263  .adc_pins = { \
2264  { GPIOA, GPIO_Pin_0, ADC_Channel_0 }, \
2265  { GPIOA, GPIO_Pin_1, ADC_Channel_1 }, \
2266  { NULL, 0, ADC_Channel_Vrefint }, /* Voltage reference */ \
2267  { NULL, 0, ADC_Channel_TempSensor }, /* Temperature sensor */ \
2268  },
2269  .adc_pin_count = 4
2270 };
2271 
2272 void PIOS_ADC_DMA_irq_handler(void)
2273 {
2274  /* Call into the generic code to handle the IRQ for this specific device */
2276 }
2277 
2278 #endif /* PIOS_INCLUDE_ADC */
2279 
2284 #if defined(PIOS_INCLUDE_WS2811)
2285 #include "pios_ws2811.h"
2286 
2288 
2289 void DMA2_Stream6_IRQHandler() {
2290  PIOS_WS2811_dma_interrupt_handler(pios_ws2811);
2291 }
2292 
2293 static const struct pios_ws2811_cfg pios_ws2811_cfg = {
2294  .timer = TIM1,
2295  .clock_cfg = {
2296  .TIM_Prescaler = (PIOS_PERIPHERAL_APB2_COUNTER_CLOCK / 12000000) - 1,
2297  .TIM_ClockDivision = TIM_CKD_DIV1,
2298  .TIM_CounterMode = TIM_CounterMode_Up,
2299  .TIM_Period = 25, /* 2.083us/bit */
2300  },
2301  .interrupt = {
2302  .NVIC_IRQChannel = DMA2_Stream6_IRQn,
2303  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_LOW,
2304  .NVIC_IRQChannelSubPriority = 0,
2305  .NVIC_IRQChannelCmd = ENABLE,
2306  },
2307  .bit_clear_dma_tcif = DMA_IT_TCIF6,
2308  .fall_time_l = 5, /* 333ns */
2309  .fall_time_h = 11, /* 833ns */
2310  .led_gpio = GPIOA,
2311  .gpio_pin = GPIO_Pin_10, /* PA10 / IN1 */
2312  .bit_set_dma_stream = DMA2_Stream4,
2313  .bit_set_dma_channel = DMA_Channel_6, /* 2/S4/C6: TIM1 CH4|TRIG|COM */
2314  .bit_clear_dma_stream = DMA2_Stream6,
2315  .bit_clear_dma_channel = DMA_Channel_0, /* 0/S6/C0: TIM1 CH1|CH2|CH3 */
2316 };
2317 #endif
2318 
2322 #if defined(PIOS_INCLUDE_MPU)
2323 #include "pios_mpu.h"
2324 static const struct pios_exti_cfg pios_exti_mpu_cfg __exti_config = {
2325  .vector = PIOS_MPU_IRQHandler,
2326  .line = EXTI_Line0,
2327  .pin = {
2328  .gpio = GPIOC,
2329  .init = {
2330  .GPIO_Pin = GPIO_Pin_0,
2331  .GPIO_Speed = GPIO_Speed_100MHz,
2332  .GPIO_Mode = GPIO_Mode_IN,
2333  .GPIO_OType = GPIO_OType_OD,
2334  .GPIO_PuPd = GPIO_PuPd_NOPULL,
2335  },
2336  },
2337  .irq = {
2338  .init = {
2339  .NVIC_IRQChannel = EXTI0_IRQn,
2340  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_HIGH,
2341  .NVIC_IRQChannelSubPriority = 0,
2342  .NVIC_IRQChannelCmd = ENABLE,
2343  },
2344  },
2345  .exti = {
2346  .init = {
2347  .EXTI_Line = EXTI_Line0, // matches above GPIO pin
2348  .EXTI_Mode = EXTI_Mode_Interrupt,
2349  .EXTI_Trigger = EXTI_Trigger_Rising,
2350  .EXTI_LineCmd = ENABLE,
2351  },
2352  },
2353 };
2354 
2355 static const struct pios_mpu_cfg pios_mpu_cfg = {
2356  .exti_cfg = &pios_exti_mpu_cfg,
2357  .default_samplerate = 1000,
2358  .orientation = PIOS_MPU_TOP_180DEG
2359 };
2360 #endif /* PIOS_INCLUDE_MPU */
2361 
2362 
2366 #if defined(PIOS_INCLUDE_HMC5883)
2367 #include "pios_hmc5883_priv.h"
2368 static const struct pios_exti_cfg pios_exti_hmc5883_internal_cfg __exti_config = {
2370  .line = EXTI_Line1,
2371  .pin = {
2372  .gpio = GPIOC,
2373  .init = {
2374  .GPIO_Pin = GPIO_Pin_1,
2375  .GPIO_Speed = GPIO_Speed_100MHz,
2376  .GPIO_Mode = GPIO_Mode_IN,
2377  .GPIO_OType = GPIO_OType_OD,
2378  .GPIO_PuPd = GPIO_PuPd_NOPULL,
2379  },
2380  },
2381  .irq = {
2382  .init = {
2383  .NVIC_IRQChannel = EXTI1_IRQn,
2384  .NVIC_IRQChannelPreemptionPriority = PIOS_IRQ_PRIO_LOW,
2385  .NVIC_IRQChannelSubPriority = 0,
2386  .NVIC_IRQChannelCmd = ENABLE,
2387  },
2388  },
2389  .exti = {
2390  .init = {
2391  .EXTI_Line = EXTI_Line1, // matches above GPIO pin
2392  .EXTI_Mode = EXTI_Mode_Interrupt,
2393  .EXTI_Trigger = EXTI_Trigger_Rising,
2394  .EXTI_LineCmd = ENABLE,
2395  },
2396  },
2397 };
2398 
2399 static const struct pios_hmc5883_cfg pios_hmc5883_internal_cfg = {
2400  .exti_cfg = &pios_exti_hmc5883_internal_cfg,
2401  .M_ODR = PIOS_HMC5883_ODR_75,
2402  .Meas_Conf = PIOS_HMC5883_MEASCONF_NORMAL,
2403  .Gain = PIOS_HMC5883_GAIN_1_9,
2405  .Default_Orientation = PIOS_HMC5883_TOP_90DEG,
2406 };
2407 #endif /* PIOS_INCLUDE_HMC5883 */
2408 
2412 #if defined(PIOS_INCLUDE_MS5611)
2413 #include "pios_ms5611_priv.h"
2414 static const struct pios_ms5611_cfg pios_ms5611_cfg = {
2416  .temperature_interleaving = 1,
2417 };
2418 #endif /* PIOS_INCLUDE_MS5611 */
2419 
struct stm32_gpio pin
const struct pios_exti_cfg * exti_cfg
MS5611 functions header.
#define I2C3_ER_IRQHandler
static const struct pios_tim_channel pios_tim_servoport_rcvrport_pins[]
static const TIM_TimeBaseInitTypeDef tim_10_11_time_base
#define PIOS_HMC5883_ODR_75
static const struct pios_tim_channel pios_tim_servoport_rcvrport_PPM_pins[]
const struct pios_flash_driver pios_jedec_flash_driver
SPI private definitions.
#define NELEMENTS(x)
Definition: pios.h:192
#define I2C2_EV_IRQHandler
struct stm32_gpio bind
COM private definitions.
COM MSG private definitions.
APIs for PIOS_USBHOOK layer.
TIM_ICInitTypeDef tim_ic_init
Definition: pios_pwm_priv.h:39
static const struct pios_tim_clock_cfg tim_5_cfg
static const TIM_TimeBaseInitTypeDef tim_1_8_time_base
GPIO_TypeDef * gpio
Definition: pios_stm32.h:60
#define PIOS_HMC5883_MODE_CONTINUOUS
I2C_TypeDef * regs
Definition: pios_i2c_priv.h:37
ADC private definitions.
bool PIOS_HMC5883_IRQHandler()
#define PIOS_IRQ_PRIO_HIGHEST
Definition: pios_board.h:172
#define PIOS_SERVOS_INITIAL_POSITION
Definition: pios_board.h:210
#define FLASH_SECTOR_4KB
bool(* vector)(void)
Definition: pios_exti.h:38
Defines the API to set up the HID + CDC USB descriptor config.
void PIOS_INTERNAL_ADC_DMA_Handler()
#define RTC_WKUP_IRQHandler
static const struct pios_tim_channel pios_tim_servoport_all_pins[]
#define PIOS_LED_ALARM
Definition: pios_board.h:86
#define PIOS_IRQ_PRIO_MID
Definition: pios_board.h:170
Configuration structure for the MS5611 driver.
USART private definitions.
#define DMA2_Stream0_IRQHandler
Spektrum/JR DSMx satellite receiver private structures.
enum pios_ms5611_osr oversampling
#define I2C2_ER_IRQHandler
static const struct pios_tim_clock_cfg tim_1_cfg
#define FLASH_SECTOR_64KB
const struct pios_exti_cfg * exti_cfg
Definition: pios_mpu.h:140
Driver for talking to most JEDEC flash chips.
#define PIOS_SERVO_UPDATE_HZ
Definition: pios_board.h:209
TIM_TypeDef * timer
Definition: pios_tim_priv.h:7
SPI_TypeDef * regs
Definition: pios_spi_priv.h:44
struct pios_i2c_adapter * pios_i2c_t
Definition: pios_i2c.h:48
ws2811_dev_t pios_ws2811
Definition: pios_board.c:66
const struct pios_annunc * annunciators
void PIOS_I2C_EV_IRQ_Handler(pios_i2c_t i2c_id)
#define PIOS_HMC5883_GAIN_1_9
TIM_TypeDef * timer
ppm private structures.
NVIC_InitTypeDef init
Definition: pios_stm32.h:36
#define I2C1_ER_IRQHandler
static const TIM_TimeBaseInitTypeDef tim_3_12_time_base
struct stm32_gpio inv
USART_TypeDef * regs
USB private definitions.
TIM_OCInitTypeDef tim_oc_init
USB COM HID private definitions.
#define I2C1_EV_IRQHandler
ADC private definitions.
Servo private structures.
#define FLASH_SECTOR_16KB
static const TIM_TimeBaseInitTypeDef tim_2_5_time_base
void PIOS_I2C_ER_IRQ_Handler(pios_i2c_t i2c_id)
TIM_ICInitTypeDef tim_ic_init
Definition: pios_ppm_priv.h:37
#define DMA2_Stream6_IRQHandler
Defines the API to set up the HID-only USB descriptor config.
NVIC_InitTypeDef interrupt
static const struct pios_tim_clock_cfg tim_3_cfg
static const struct pios_tim_channel pios_tim_rcvrport_all_channels[]
#define PIOS_HMC5883_MEASCONF_NORMAL
void PIOS_RTC_irq_handler(void)
Futaba S.Bus Private structures.
void PIOS_WS2811_dma_interrupt_handler(ws2811_dev_t dev)
Handles a DMA completion interrupt on bit_clear_dma_stream.
bool PIOS_MPU_IRQHandler(void)
The IMU interrupt handler. Fetches new data from the IMU.
const struct pios_flash_driver * driver
const struct pios_flash_partition pios_flash_partition_table[]
Definition: unittest_init.c:50
static const struct pios_tim_clock_cfg tim_2_cfg
#define I2C3_EV_IRQHandler
#define PIOS_IRQ_PRIO_HIGH
Definition: pios_board.h:171
TIM_TypeDef * timer
Definition: pios_tim_priv.h:14
USB COM CDC private definitions.
#define JEDEC_MANUFACTURER_MACRONIX
uint32_t clksrc
Definition: pios_rtc_priv.h:37
enum pios_flash_partition_labels label
board_revision
Definition: board_hw_defs.c:35
static const struct pios_tim_clock_cfg tim_8_cfg
static const struct pios_tim_clock_cfg tim_10_cfg
#define PIOS_IRQ_PRIO_LOW
Definition: pios_board.h:169
#define PIOS_Assert(test)
Definition: pios_debug.h:52
static const struct pios_tim_clock_cfg tim_12_cfg
LED private definitions.
static const struct pios_tim_clock_cfg tim_11_cfg
#define PIOS_ANNUNCIATOR_BUZZER
Definition: pios_board.h:87
struct stm32_irq irq
Definition: pios_usb_priv.h:37
#define FLASH_SECTOR_128KB
const struct pios_flash_driver pios_internal_flash_driver
USART private definitions.
#define PIOS_LED_HEARTBEAT
Definition: pios_board.h:85
#define __exti_config
Definition: pios_exti.h:48
Defines the API to the board-specific USB data setup code.