forked from M-Labs/thermostat
implement mac address generation with reading eui48 from i2c eeprom
This commit is contained in:
parent
a84242fb1f
commit
201701ee8b
|
@ -127,6 +127,15 @@ dependencies = [
|
||||||
"cortex-m",
|
"cortex-m",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "eeprom24x"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f680e8d81a559a97de04c5fab25f17f22a55770120c868ef8fbdea6398d44107"
|
||||||
|
dependencies = [
|
||||||
|
"embedded-hal",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "embedded-dma"
|
name = "embedded-dma"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
@ -164,12 +173,6 @@ dependencies = [
|
||||||
"typenum",
|
"typenum",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "hash2hwaddr"
|
|
||||||
version = "0.0.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "857afb5ee9e767c3a73b2ad7212b6deea0c3761a27db1e20ea0ed57ee352cfef"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libm"
|
name = "libm"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
|
@ -305,6 +308,8 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smoltcp"
|
name = "smoltcp"
|
||||||
version = "0.6.0"
|
version = "0.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0fe46639fd2ec79eadf8fe719f237a7a0bd4dac5d957f1ca5bbdbc1c3c39e53a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
|
@ -392,7 +397,7 @@ dependencies = [
|
||||||
"cortex-m",
|
"cortex-m",
|
||||||
"cortex-m-log",
|
"cortex-m-log",
|
||||||
"cortex-m-rt",
|
"cortex-m-rt",
|
||||||
"hash2hwaddr",
|
"eeprom24x",
|
||||||
"log",
|
"log",
|
||||||
"nb 0.1.3",
|
"nb 0.1.3",
|
||||||
"nom",
|
"nom",
|
||||||
|
|
|
@ -24,7 +24,6 @@ cortex-m-log = { version = "0.6", features = ["log-integration"] }
|
||||||
stm32f4xx-hal = { version = "0.8", features = ["rt", "stm32f427", "usb_fs"] }
|
stm32f4xx-hal = { version = "0.8", features = ["rt", "stm32f427", "usb_fs"] }
|
||||||
stm32-eth = { version = "0.2", features = ["stm32f427", "smoltcp-phy"], git = "https://github.com/stm32-rs/stm32-eth.git" }
|
stm32-eth = { version = "0.2", features = ["stm32f427", "smoltcp-phy"], git = "https://github.com/stm32-rs/stm32-eth.git" }
|
||||||
smoltcp = { version = "0.6.0", default-features = false, features = ["proto-ipv4", "socket-tcp", "log"] }
|
smoltcp = { version = "0.6.0", default-features = false, features = ["proto-ipv4", "socket-tcp", "log"] }
|
||||||
hash2hwaddr = { version = "0.0", optional = true }
|
|
||||||
bit_field = "0.10"
|
bit_field = "0.10"
|
||||||
byteorder = { version = "1", default-features = false }
|
byteorder = { version = "1", default-features = false }
|
||||||
nom = { version = "5", default-features = false }
|
nom = { version = "5", default-features = false }
|
||||||
|
@ -33,6 +32,7 @@ usb-device = "0.2"
|
||||||
usbd-serial = "0.1"
|
usbd-serial = "0.1"
|
||||||
nb = "0.1"
|
nb = "0.1"
|
||||||
uom = { version = "0.29", default-features = false, features = ["autoconvert", "si", "f64"] }
|
uom = { version = "0.29", default-features = false, features = ["autoconvert", "si", "f64"] }
|
||||||
|
eeprom24x = "0.3"
|
||||||
|
|
||||||
[patch.crates-io]
|
[patch.crates-io]
|
||||||
stm32f4xx-hal = { git = "https://github.com/stm32-rs/stm32f4xx-hal.git" }
|
stm32f4xx-hal = { git = "https://github.com/stm32-rs/stm32f4xx-hal.git" }
|
||||||
|
@ -40,8 +40,6 @@ stm32f4xx-hal = { git = "https://github.com/stm32-rs/stm32f4xx-hal.git" }
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
semihosting = ["panic-semihosting", "cortex-m-log/semihosting"]
|
semihosting = ["panic-semihosting", "cortex-m-log/semihosting"]
|
||||||
generate-hwaddr = ["hash2hwaddr"]
|
|
||||||
default = ["generate-hwaddr"]
|
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
codegen-units = 1
|
codegen-units = 1
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
"0wa1xknnmmax278pwvcj134g62y00mr7k54cmvis64y27qlbg64h"
|
"0gjm2xp4shfjxhxcnildifrglw5v1g33c7a566cq97bdw19f4gj8"
|
||||||
|
|
18
src/main.rs
18
src/main.rs
|
@ -71,8 +71,6 @@ const WATCHDOG_INTERVAL: u32 = 1_000;
|
||||||
#[cfg(feature = "semihosting")]
|
#[cfg(feature = "semihosting")]
|
||||||
const WATCHDOG_INTERVAL: u32 = 30_000;
|
const WATCHDOG_INTERVAL: u32 = 30_000;
|
||||||
|
|
||||||
#[cfg(not(feature = "generate-hwaddr"))]
|
|
||||||
const NET_HWADDR: [u8; 6] = [0x02, 0x00, 0xDE, 0xAD, 0xBE, 0xEF];
|
|
||||||
const TCP_PORT: u16 = 23;
|
const TCP_PORT: u16 = 23;
|
||||||
|
|
||||||
|
|
||||||
|
@ -103,9 +101,10 @@ fn main() -> ! {
|
||||||
|
|
||||||
timer::setup(cp.SYST, clocks);
|
timer::setup(cp.SYST, clocks);
|
||||||
|
|
||||||
let (pins, mut leds, eth_pins, usb) = Pins::setup(
|
let (pins, mut leds, mut eeprom, eth_pins, usb) = Pins::setup(
|
||||||
clocks, dp.TIM1, dp.TIM3,
|
clocks, dp.TIM1, dp.TIM3,
|
||||||
dp.GPIOA, dp.GPIOB, dp.GPIOC, dp.GPIOD, dp.GPIOE, dp.GPIOF, dp.GPIOG,
|
dp.GPIOA, dp.GPIOB, dp.GPIOC, dp.GPIOD, dp.GPIOE, dp.GPIOF, dp.GPIOG,
|
||||||
|
dp.I2C1,
|
||||||
dp.SPI2, dp.SPI4, dp.SPI5,
|
dp.SPI2, dp.SPI4, dp.SPI5,
|
||||||
dp.ADC1,
|
dp.ADC1,
|
||||||
dp.OTG_FS_GLOBAL,
|
dp.OTG_FS_GLOBAL,
|
||||||
|
@ -121,14 +120,11 @@ fn main() -> ! {
|
||||||
|
|
||||||
let mut channels = Channels::new(pins);
|
let mut channels = Channels::new(pins);
|
||||||
|
|
||||||
#[cfg(not(feature = "generate-hwaddr"))]
|
// EEPROM ships with a read-only EUI-48 identifier
|
||||||
let hwaddr = EthernetAddress(NET_HWADDR);
|
let mut eui48 = [0; 6];
|
||||||
#[cfg(feature = "generate-hwaddr")]
|
eeprom.read_data(0xFA, &mut eui48).unwrap();
|
||||||
let hwaddr = {
|
let hwaddr = EthernetAddress(eui48);
|
||||||
let uid = stm32f4xx_hal::signature::Uid::get();
|
info!("EEPROM MAC address: {}", hwaddr);
|
||||||
EthernetAddress(hash2hwaddr::generate_hwaddr(uid))
|
|
||||||
};
|
|
||||||
info!("Net hwaddr: {}", hwaddr);
|
|
||||||
|
|
||||||
net::run(clocks, dp.ETHERNET_MAC, dp.ETHERNET_DMA, eth_pins, hwaddr, |iface| {
|
net::run(clocks, dp.ETHERNET_MAC, dp.ETHERNET_DMA, eth_pins, hwaddr, |iface| {
|
||||||
Server::<Session>::run(iface, |server| {
|
Server::<Session>::run(iface, |server| {
|
||||||
|
|
25
src/pins.rs
25
src/pins.rs
|
@ -1,8 +1,7 @@
|
||||||
use stm32f4xx_hal::{
|
use stm32f4xx_hal::{
|
||||||
adc::Adc,
|
adc::Adc,
|
||||||
hal::{self, blocking::spi::Transfer, digital::v2::OutputPin},
|
|
||||||
gpio::{
|
gpio::{
|
||||||
AF5, Alternate, Analog, Floating, Input,
|
AF5, Alternate, AlternateOD, Analog, Floating, Input,
|
||||||
gpioa::*,
|
gpioa::*,
|
||||||
gpiob::*,
|
gpiob::*,
|
||||||
gpioc::*,
|
gpioc::*,
|
||||||
|
@ -12,6 +11,8 @@ use stm32f4xx_hal::{
|
||||||
GpioExt,
|
GpioExt,
|
||||||
Output, PushPull,
|
Output, PushPull,
|
||||||
},
|
},
|
||||||
|
hal::{self, blocking::spi::Transfer, digital::v2::OutputPin},
|
||||||
|
i2c::I2c,
|
||||||
otg_fs::USB,
|
otg_fs::USB,
|
||||||
rcc::Clocks,
|
rcc::Clocks,
|
||||||
pwm::{self, PwmChannels},
|
pwm::{self, PwmChannels},
|
||||||
|
@ -19,18 +20,28 @@ use stm32f4xx_hal::{
|
||||||
stm32::{
|
stm32::{
|
||||||
ADC1,
|
ADC1,
|
||||||
GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG,
|
GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG,
|
||||||
|
I2C1,
|
||||||
OTG_FS_GLOBAL, OTG_FS_DEVICE, OTG_FS_PWRCLK,
|
OTG_FS_GLOBAL, OTG_FS_DEVICE, OTG_FS_PWRCLK,
|
||||||
SPI2, SPI4, SPI5,
|
SPI2, SPI4, SPI5,
|
||||||
TIM1, TIM3,
|
TIM1, TIM3,
|
||||||
},
|
},
|
||||||
time::U32Ext,
|
time::U32Ext,
|
||||||
};
|
};
|
||||||
|
use eeprom24x::{self, Eeprom24x};
|
||||||
use stm32_eth::EthPins;
|
use stm32_eth::EthPins;
|
||||||
use crate::{
|
use crate::{
|
||||||
channel::{Channel0, Channel1},
|
channel::{Channel0, Channel1},
|
||||||
leds::Leds,
|
leds::Leds,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub type Eeprom = Eeprom24x<
|
||||||
|
I2c<I2C1, (
|
||||||
|
PB8<AlternateOD<stm32f4xx_hal::gpio::AF4>>,
|
||||||
|
PB9<AlternateOD<stm32f4xx_hal::gpio::AF4>>
|
||||||
|
)>,
|
||||||
|
eeprom24x::page_size::B8,
|
||||||
|
eeprom24x::addr_size::OneByte
|
||||||
|
>;
|
||||||
|
|
||||||
pub type EthernetPins = EthPins<
|
pub type EthernetPins = EthPins<
|
||||||
PA1<Input<Floating>>,
|
PA1<Input<Floating>>,
|
||||||
|
@ -106,10 +117,11 @@ impl Pins {
|
||||||
clocks: Clocks,
|
clocks: Clocks,
|
||||||
tim1: TIM1, tim3: TIM3,
|
tim1: TIM1, tim3: TIM3,
|
||||||
gpioa: GPIOA, gpiob: GPIOB, gpioc: GPIOC, gpiod: GPIOD, gpioe: GPIOE, gpiof: GPIOF, gpiog: GPIOG,
|
gpioa: GPIOA, gpiob: GPIOB, gpioc: GPIOC, gpiod: GPIOD, gpioe: GPIOE, gpiof: GPIOF, gpiog: GPIOG,
|
||||||
|
i2c1: I2C1,
|
||||||
spi2: SPI2, spi4: SPI4, spi5: SPI5,
|
spi2: SPI2, spi4: SPI4, spi5: SPI5,
|
||||||
adc1: ADC1,
|
adc1: ADC1,
|
||||||
otg_fs_global: OTG_FS_GLOBAL, otg_fs_device: OTG_FS_DEVICE, otg_fs_pwrclk: OTG_FS_PWRCLK,
|
otg_fs_global: OTG_FS_GLOBAL, otg_fs_device: OTG_FS_DEVICE, otg_fs_pwrclk: OTG_FS_PWRCLK,
|
||||||
) -> (Self, Leds, EthernetPins, USB) {
|
) -> (Self, Leds, Eeprom, EthernetPins, USB) {
|
||||||
let gpioa = gpioa.split();
|
let gpioa = gpioa.split();
|
||||||
let gpiob = gpiob.split();
|
let gpiob = gpiob.split();
|
||||||
let gpioc = gpioc.split();
|
let gpioc = gpioc.split();
|
||||||
|
@ -180,6 +192,11 @@ impl Pins {
|
||||||
|
|
||||||
let leds = Leds::new(gpiod.pd9, gpiod.pd10.into_push_pull_output(), gpiod.pd11.into_push_pull_output());
|
let leds = Leds::new(gpiod.pd9, gpiod.pd10.into_push_pull_output(), gpiod.pd11.into_push_pull_output());
|
||||||
|
|
||||||
|
let eeprom_scl = gpiob.pb8.into_alternate_af4().set_open_drain();
|
||||||
|
let eeprom_sda = gpiob.pb9.into_alternate_af4().set_open_drain();
|
||||||
|
let eeprom_i2c = I2c::i2c1(i2c1, (eeprom_scl, eeprom_sda), 400.khz(), clocks);
|
||||||
|
let eeprom = Eeprom24x::new_24x02(eeprom_i2c, eeprom24x::SlaveAddr::default());
|
||||||
|
|
||||||
let eth_pins = EthPins {
|
let eth_pins = EthPins {
|
||||||
ref_clk: gpioa.pa1,
|
ref_clk: gpioa.pa1,
|
||||||
md_io: gpioa.pa2,
|
md_io: gpioa.pa2,
|
||||||
|
@ -201,7 +218,7 @@ impl Pins {
|
||||||
hclk: clocks.hclk(),
|
hclk: clocks.hclk(),
|
||||||
};
|
};
|
||||||
|
|
||||||
(pins, leds, eth_pins, usb)
|
(pins, leds, eeprom, eth_pins, usb)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Configure the GPIO pins for SPI operation, and initialize SPI
|
/// Configure the GPIO pins for SPI operation, and initialize SPI
|
||||||
|
|
Loading…
Reference in New Issue