Add button driver to drivers object
diff --git a/examples/button_leds.rs b/examples/button_leds.rs
index 789cb9b..bdf18ba 100644
--- a/examples/button_leds.rs
+++ b/examples/button_leds.rs
@@ -1,16 +1,19 @@
 #![no_std]
 
 use futures::future;
-use libtock::buttons;
 use libtock::buttons::ButtonState;
 use libtock::result::TockResult;
 use libtock::Hardware;
 
 #[libtock::main]
 async fn main() -> TockResult<()> {
-    let Hardware { mut led_driver, .. } = libtock::retrieve_hardware()?;
+    let Hardware {
+        mut led_driver,
+        button_driver,
+        ..
+    } = libtock::retrieve_hardware()?;
 
-    let mut with_callback = buttons::with_callback(|button_num: usize, state| {
+    let mut with_callback = button_driver.with_callback(|button_num: usize, state| {
         match state {
             ButtonState::Pressed => led_driver.get(button_num).unwrap().toggle().ok().unwrap(),
             ButtonState::Released => (),
diff --git a/examples/button_read.rs b/examples/button_read.rs
index edb4f49..b82167d 100644
--- a/examples/button_read.rs
+++ b/examples/button_read.rs
@@ -1,7 +1,6 @@
 #![no_std]
 
 use core::fmt::Write;
-use libtock::buttons;
 use libtock::buttons::ButtonState;
 use libtock::result::TockResult;
 use libtock::timer::Duration;
@@ -12,10 +11,11 @@
     let Hardware {
         console_driver,
         timer_context,
+        button_driver,
         ..
     } = libtock::retrieve_hardware()?;
     let mut console = console_driver.create_console();
-    let mut with_callback = buttons::with_callback(|_, _| {});
+    let mut with_callback = button_driver.with_callback(|_, _| {});
     let mut buttons = with_callback.init()?;
     let mut button = buttons.iter_mut().next().unwrap();
     let button = button.enable()?;
diff --git a/examples/button_subscribe.rs b/examples/button_subscribe.rs
index afc8079..f5d0cbe 100644
--- a/examples/button_subscribe.rs
+++ b/examples/button_subscribe.rs
@@ -2,7 +2,6 @@
 
 use core::fmt::Write;
 use futures::future;
-use libtock::buttons;
 use libtock::buttons::ButtonState;
 use libtock::result::TockResult;
 use libtock::Hardware;
@@ -10,9 +9,13 @@
 // FIXME: Hangs up when buttons are pressed rapidly. Yielding in callback leads to stack overflow.
 #[libtock::main]
 async fn main() -> TockResult<()> {
-    let Hardware { console_driver, .. } = libtock::retrieve_hardware()?;
+    let Hardware {
+        console_driver,
+        button_driver,
+        ..
+    } = libtock::retrieve_hardware()?;
     let mut console = console_driver.create_console();
-    let mut with_callback = buttons::with_callback(|button_num: usize, state| {
+    let mut with_callback = button_driver.with_callback(|button_num: usize, state| {
         writeln!(
             console,
             "Button: {} - State: {}",
diff --git a/src/buttons.rs b/src/buttons.rs
index c360f7a..850dd11 100644
--- a/src/buttons.rs
+++ b/src/buttons.rs
@@ -17,8 +17,14 @@
     pub const SUBSCRIBE_CALLBACK: usize = 0;
 }
 
-pub fn with_callback<CB>(callback: CB) -> WithCallback<CB> {
-    WithCallback { callback }
+pub struct ButtonDriver {
+    pub(crate) _unconstructible: (),
+}
+
+impl ButtonDriver {
+    pub fn with_callback<CB>(self, callback: CB) -> WithCallback<CB> {
+        WithCallback { callback }
+    }
 }
 
 pub struct WithCallback<CB> {
diff --git a/src/hardware.rs b/src/hardware.rs
index 1269f39..2e34ea7 100644
--- a/src/hardware.rs
+++ b/src/hardware.rs
@@ -1,3 +1,4 @@
+use crate::buttons::ButtonDriver;
 use crate::console::ConsoleDriver;
 use crate::gpio::GpioDriver;
 use crate::led::LedDriver;
@@ -15,6 +16,7 @@
     pub timer_context: DriverContext,
     pub gpio_driver: GpioDriver,
     pub temperature_driver: TemperatureDriver,
+    pub button_driver: ButtonDriver,
 }
 
 /// Retrieve Hardware struct. Returns Hardware only once.
@@ -52,6 +54,9 @@
     temperature_driver: TemperatureDriver {
         _unconstructible: (),
     },
+    button_driver: ButtonDriver {
+        _unconstructible: (),
+    },
 };
 
 static mut HARDWARE_SINGLETON: Option<Hardware> = Some(HARDWARE);