*/
#![no_std]
-#![crate_type="staticlib"]
+#![no_main]
#[link(name="libcommon.rlib")]
extern crate common;
+mod uart0;
+
use common::buffer::Buffer;
use common::clock;
use common::systick;
use common::port;
use common::gpio;
+use common::nvic;
+use common::i2c;
+use common::uart;
use common::usb_serial;
+use common::display;
extern {
fn enable_interrupts();
}
#[no_mangle]
-pub unsafe extern fn main() {
+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 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 upper right push button.
gpio::set_direction(gpio::GPIOA, 1 << 12, gpio::Direction::Input);
port::set_af(port::PORTA, 12, 1);
cdc_tx_buf.write(b"\n");
cdc_tx_buf.flush();
+ let mut display = display::Display::new(gpio::GPIOB, 1 << 16, 0x3c);
+
+ display.init();
+ display.clear();
+
+ // Hold GPS in reset while configuring its UART.
+ gpio::clear(gpio::GPIOB, 1);
+ systick::delay_ms(50);
+ uart::configure(uart::UART0);
+ systick::delay_ms(50);
+ gpio::set(gpio::GPIOB, 1);
+
+ nvic::enable_irq(12); // UART0
+
loop {
systick::delay_ms(1000);
cdc_tx_buf.write(b".\n");
cdc_tx_buf.flush();
+
+ if (gpio::get(gpio::GPIOA) & (1 << 12)) == 0 {
+ nvic::system_reset();
+ }
}
}