cc2538_hal/
lib.rs

1//! This crate defines the HAL for the CC2538.
2
3#![no_std]
4#![feature(adt_const_params)]
5#![allow(dead_code)]
6#![allow(incomplete_features)]
7#![allow(unused_imports)]
8#![allow(non_camel_case_types)]
9#![allow(non_snake_case)]
10
11use cc2538_pac as pac;
12use cortex_m::peripheral::DWT;
13use embedded_hal as hal;
14
15pub mod adc;
16pub mod crypto;
17pub mod delay;
18pub mod dma;
19pub mod gpio;
20pub mod i2c;
21pub mod ioc;
22pub mod radio;
23pub mod rng;
24pub mod serial;
25pub mod smwd;
26pub mod spi;
27pub mod sys_ctrl;
28pub mod time;
29pub mod timers;
30
31/// Get the IEEE address from fixed memory.
32pub fn get_ieee_address(addr: &mut [u8]) {
33    const TI_ADDR: [u8; 3] = [0x00, 0x12, 0x4b];
34    const ADDR_LOCATION: u32 = 0x00280028;
35
36    if unsafe { core::ptr::read((ADDR_LOCATION + 3) as *const u32) as u8 } == TI_ADDR[0]
37        && unsafe { core::ptr::read((ADDR_LOCATION + 2) as *const u32) as u8 } == TI_ADDR[1]
38        && unsafe { core::ptr::read((ADDR_LOCATION + 1) as *const u32) as u8 } == TI_ADDR[2]
39    {
40        for i in 0..8 {
41            addr[8 - i - 1] = unsafe {
42                core::ptr::read(
43                    (ADDR_LOCATION + if i < 4 { i + 4 } else { i - 4 } as u32) as *const u32,
44                )
45            } as u8;
46        }
47    } else {
48        for (i, b) in addr.iter_mut().enumerate() {
49            *b = unsafe { core::ptr::read((ADDR_LOCATION + 8 - 1 - i as u32) as *const u32) } as u8;
50        }
51    }
52}
53
54struct FlashCca {
55    _bootloader_backdoor_disable: u32,
56    _is_valid: u32,
57    _flash_start_addr: u32,
58    _padding: u32,
59}
60
61#[link_section = ".flash_cca"]
62#[used]
63#[no_mangle]
64static FLASH_CCA: FlashCca = FlashCca {
65    _bootloader_backdoor_disable: 0xF3FF_FFFF,
66    _is_valid: 0,
67    _flash_start_addr: 0x0020_0000,
68    _padding: 0xFFFF_FFFF,
69};