summaryrefslogtreecommitdiffstats
path: root/ble/src/ble.rs
blob: e5f16cb00200ac555d9986cb96aa19b2331c9cd7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use nrf52840_hal::target::{FICR, RADIO, TIMER0};
use rubble::link::{AddressKind, DeviceAddress, HardwareInterface, LinkLayer, MIN_PDU_BUF};
use rubble_nrf52::{radio::BleRadio, timer::BleTimer};

struct NRF52840 {}
impl HardwareInterface for NRF52840 {
    type Timer = BleTimer<TIMER0>;
    type Tx = BleRadio;
}

pub fn setup(radio: RADIO, timer: TIMER0, ficr: FICR) {
    // make sure hfclock is started for timer0 to work at the right
    // resolution.
    let ble_timer = BleTimer::init(timer);
    let mut devaddr = [0u8; 6];
    let devaddr_lo = ficr.deviceaddr[0].read().bits();
    let devaddr_hi = ficr.deviceaddr[1].read().bits();
    devaddr[..4].clone_from_slice(&devaddr_lo.to_le_bytes());
    devaddr[4..].clone_from_slice(&devaddr_hi.to_le_bytes());

    let addrkind = if ficr.deviceaddrtype.read().deviceaddrtype().is_public() {
        AddressKind::Public
    } else {
        AddressKind::Random
    };
    let addr = DeviceAddress::new(devaddr, addrkind);
    let mut _ll = LinkLayer::<NRF52840>::new(addr, ble_timer);
}