+ // Configure lower left push button.
+ gpio::set_direction(gpio::GPIOE, 1 << 24, gpio::Direction::Input);
+ port::set_af(port::PORTE, 24, 1);
+ port::set_pull(port::PORTE, 24, port::Pull::Up);
+
+ // Configure upper left push button.
+ gpio::set_direction(gpio::GPIOE, 1 << 25, gpio::Direction::Input);
+ port::set_af(port::PORTE, 25, 1);
+ port::set_pull(port::PORTE, 25, port::Pull::Up);
+
+ // Configure middle left push button.
+ gpio::set_direction(gpio::GPIOE, 1 << 31, gpio::Direction::Input);
+ port::set_af(port::PORTE, 31, 1);
+ port::set_pull(port::PORTE, 31, port::Pull::Up);
+}
+
+fn poll_pta12() -> bool {
+ (gpio::get(gpio::GPIOA) & (1 << 12)) == 0
+}
+
+fn uart0_try_read() -> Option<u8> {
+ extern {
+ static mut uart0_rx_buf: Ringbuf;
+ }
+
+ unsafe {
+ if uart0_rx_buf.is_empty() {
+ None
+ } else {
+ Some(uart0_rx_buf.read())
+ }
+ }
+}
+
+#[no_mangle]
+pub unsafe extern "C" fn _start() -> ! {
+ clock::configure();
+ clock::enable_osc0();
+ systick::init();
+ port::init();
+
+ // Configure pins for I2C0.
+ port::set_af(port::PORTC, 8, 2);
+ port::set_af(port::PORTC, 9, 2);
+
+ i2c::configure(i2c::I2C0);
+
+ nvic::disable_irq(8); // I2C0
+
+ // Configure pin for the display's reset line.
+ gpio::set_direction(gpio::GPIOB, 1 << 16, gpio::Direction::Output);
+ port::set_af(port::PORTB, 16, 1);
+
+ // Configure pin for the MX25L's chip select line.
+ gpio::set_direction(gpio::GPIOD, 1 << 0, gpio::Direction::Output);
+ port::set_af(port::PORTD, 0, 1);
+ gpio::set(gpio::GPIOD, 1 << 0);
+
+ // Configure pins for SPI0.
+ port::set_af(port::PORTD, 1, 2);
+ port::set_af(port::PORTD, 2, 5);
+ port::set_af(port::PORTD, 3, 5);
+
+ spi::configure(spi::SPI0);
+
+ nvic::disable_irq(10); // SPI0
+
+ // Configure pins for UART0.
+ port::set_af(port::PORTE, 20, 4);
+ port::set_af(port::PORTE, 21, 4);
+
+ // Configure pin for the GPS's reset line.
+ gpio::set_direction(gpio::GPIOB, 1 << 1, gpio::Direction::Output);
+ port::set_af(port::PORTB, 1, 1);
+
+ configure_push_buttons();
+