HardwareTimer.cpp: save some space with an rcc_clk_id hack.

Since rcc_clk_ids for a peripheral now form a contiguous range by
peripheral number, we can infer the rcc_clk_id for a timer given its
number (e.g., can calculate RCC_TIMER2 given timerNum == 2). This lets
us use timer_foreach() to avoid keeping a table of available timers in
HardwareTimer.cpp.

The implementation is hackish, but can be fixed up later if need be.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
HardwareTimer::setPeriod(): Don't use floating point.

I can't believe we've been shipping this for so long.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
HardwareTimer.cpp: cosmetics.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
STM32F2: fix pinMode() for PWM, PWM_OPEN_DRAIN.

Make it so the call to gpio_set_modef() actually happens.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
STM32F2: Add timer_get_af().

Pull some code out of the F2 pinMode() into a utility function. This
feels generally useful enough to be exposed to the users (it will, for
example, make it easier to implement input capture in a clean way).

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
Globally switch style for GPIO config routines.

Stupidly, spi_gpio_cfg() didn't take a spi_dev* argument on F1,
because it doesn't matter there. On F2, where we need to set an
alternate function when configuring GPIOs for SPI, we need to know the
dev.

We can't add break backwards compatibility, so we need a new
function. However, we've since added a bunch of foo_gpio_cfg()
routines, and we don't want confusing asymmetry in the names. So a
global style change is needed. (Fortunately, the new functions weren't
part of a release, so it's no problem to change their names).

Change all foo_gpio_cfg() routines to foo_config_gpios() (or
foo_config_gpio(), if there's only one GPIO to configure). For
backwards compatibility, make spi_gpio_cfg() on F1 an __always_inline
call to spi_config_gpios().

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
Typo fix.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
F2: Add usart_get_af().

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
libmaple_types.h: Add __unused.

We'll need this soon.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
<wirish/boards.h>: Add feature test macros for SPI.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
Add BOARD_HAVE_SERIALUSB.

Feature-test for SerialUSB support.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
Slightly improve and generify the USB infrastructure.

The good news is that <libmaple/usb.h> and <libmaple/usb_cdcacm.h> did
turn out generic enough in what they specify to go on unchanged.

However, we can't just go on assuming that there's USB just because
we're on an F1. Now that there's value line in the tree, we need to be
more careful (value line F1s don't have USB peripherals). To that end,
make all the F1 board-includes/*.mk files specify what line their MCU
is with an MCU_F1_LINE variable. Use that to hack
libmaple/usb/rules.mk so we only try to build the USB module under
appropriate circumstances.

While we're at it, add a vector_symbols.inc for value line MCUs under
support/ld/. We need this to get the target-config.mk modifications
implied by the addition of MCU_F1_LINE. We'll fix up some other
performance-line-isms under libmaple/stm32f1 in a separate commit.

Also in libmaple/usb/:

- Move everything into a new stm32f1 directory. Due to aforementioned
  rules.mk hacks, there is no immediate need for an stm32f2
  directory (USB support doesn't exist there).

- Update the README for style and content.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
Add ISRs and vector table for F1 value line.

Now libmaple/stm32f1/rules.mk tries to pull in ISRs and a vector table
on a per-line basis. Move isrs_performance.S and
vector_table_performance.S to (new) libmaple/stm32f1/performance, and
rename them.

Add corresponding files for value line under (new)
libmaple/stm32f1/value. This helps clean up some
performance-line-isms, and allows implementing e.g. the CEC interrupt,
which is used by something else on performance line.

Untested (I don't have access to a value line MCU); hopefully this
works.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
wirish/ext_interrupts.cpp: Doxygen, copyright.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
libmaple/dac.c: Generalize comment about PA4/PA5.

Seems like this is true on F2 as well!

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
libmaple/dac.c: Copyright.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
<libmaple/bitband.h>: Doxygen

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
Bring back EXTI on F1, with deprecations for gpio.h on F1.

Tested on Maple Mini with examples/mini-exti-test. Changes to Wirish
are minor: use the new EXTI types exti_num and exti_cfg (see below) in
place of now-deprecated variants in ext_interrupts.cpp.

The way I originally did libmaple/exti.h was stupid, and fixing it
turned out to be a little disruptive.

libmaple/exti.h depends on libmaple/gpio.h (for AFIO), but that's a
classic case of exposed implementation detail. So invert the
dependency: make gpio.h depend on exti.h. Do this by adding exti_num
and exti_cfg to exti.h; these respectively replace afio_exti_num and
afio_exti_port. The afio_* variants are now deprecated. (Throw in a
typedef and some macros at the bottom of the F1 series/gpio.h for
backwards compatibility).

Make exti_attach_interrupt() and exti_detach_interrupt() take
exti_num/exti_cfg arguments instead of the afio_* variants.

Make the EXTI dispatch routines __always_inline to defeat GCC -Os.

Many renames throughout libmaple/stm32f1/ to stop using the deprecated
names. Also move the previously F1-only gpio_exti_port() function into
the public libmaple header. Reimplementing it in terms of rcc_clk_ids
lets us deprecate the gpio_dev->exti_port field, which will save space
in the future.

While we're there, I notice that struct gpio_dev is defined once per
series. That's dumb, as it misses the entire point of having device
structs: they contain what's portable. So put the F1 version (which
has the extra EXTI port field) into libmaple/gpio.h, and add the
necessary exti_ports to libmaple/stm32f2/gpio.c. Sigh. We'll get rid
of it eventually, at least.

Clean up some other mistakes in gpio.h files as well (mostly removing
util.h dependency). Sorry for the messy commit.

For portability, add a new series-specific exti function,
exti_select(). The F1 version in (new) libmaple/stm32f1/exti.c uses
AFIO and some new private functionality in libmaple/exti.c and (new)
libmaple/exti_private.h to make this convenient.  We'll be able to do
the SYSCFG equivalent on F2 without any trouble.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
STM32F1: gpio.h: Cosmetics.

Those ugly Doxygen comments have been bothering me since forever. Fix
them up and throw some M-x align around.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>
STM32F2: Add SYSCFG support.

Turn it on at init() time on F2.

Signed-off-by: Marti Bolivar <mbolivar@leaflabs.com>