Adding initial DHCP support prototype
This commit is contained in:
parent
6dd0a47bc9
commit
c2cb9a440c
|
@ -201,7 +201,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "derive_miniconf"
|
name = "derive_miniconf"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/quartiq/miniconf.git?branch=develop#394d0634a9622e43a55850afc34eb4695ecababa"
|
source = "git+https://github.com/quartiq/miniconf.git?branch=develop#314fa5587d1aa28e1ad70106f19e30db646e9f28"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
@ -414,10 +414,10 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "miniconf"
|
name = "miniconf"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/quartiq/miniconf.git?branch=develop#394d0634a9622e43a55850afc34eb4695ecababa"
|
source = "git+https://github.com/quartiq/miniconf.git?branch=develop#314fa5587d1aa28e1ad70106f19e30db646e9f28"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"derive_miniconf",
|
"derive_miniconf",
|
||||||
"heapless 0.5.6",
|
"heapless 0.6.1",
|
||||||
"minimq",
|
"minimq",
|
||||||
"serde",
|
"serde",
|
||||||
"serde-json-core",
|
"serde-json-core",
|
||||||
|
@ -426,13 +426,13 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "minimq"
|
name = "minimq"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
source = "git+https://github.com/quartiq/minimq.git?branch=master#a89a6f11d0d1f63114fb15f676022eb4fe904f56"
|
source = "git+https://github.com/quartiq/minimq.git?branch=feature/init-update#e686ccd89090f32990661fe49416d570e2e80835"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bit_field",
|
"bit_field",
|
||||||
"embedded-nal",
|
"embedded-nal",
|
||||||
"enum-iterator",
|
"enum-iterator",
|
||||||
"generic-array 0.14.4",
|
"generic-array 0.14.4",
|
||||||
"heapless 0.5.6",
|
"heapless 0.6.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -714,11 +714,10 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smoltcp-nal"
|
name = "smoltcp-nal"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/quartiq/smoltcp-nal.git?branch=feature/dhcp-support#5c62caa539d011c45453314c5872e9ca9cd9f780"
|
||||||
checksum = "e4e5aeb4818706fd74c35917692008d29a5314483c8180300a582253718ce57a"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"embedded-nal",
|
"embedded-nal",
|
||||||
"heapless 0.5.6",
|
"heapless 0.6.1",
|
||||||
"smoltcp",
|
"smoltcp",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,6 @@ enum-iterator = "0.6.0"
|
||||||
paste = "1"
|
paste = "1"
|
||||||
dsp = { path = "dsp" }
|
dsp = { path = "dsp" }
|
||||||
ad9959 = { path = "ad9959" }
|
ad9959 = { path = "ad9959" }
|
||||||
smoltcp-nal = "0.1.0"
|
|
||||||
miniconf = "0.1"
|
miniconf = "0.1"
|
||||||
generic-array = "0.14"
|
generic-array = "0.14"
|
||||||
|
|
||||||
|
@ -54,7 +53,11 @@ branch = "develop"
|
||||||
|
|
||||||
[patch.crates-io.minimq]
|
[patch.crates-io.minimq]
|
||||||
git = "https://github.com/quartiq/minimq.git"
|
git = "https://github.com/quartiq/minimq.git"
|
||||||
branch = "master"
|
branch = "feature/init-update"
|
||||||
|
|
||||||
|
[dependencies.smoltcp-nal]
|
||||||
|
git = "https://github.com/quartiq/smoltcp-nal.git"
|
||||||
|
branch = "feature/dhcp-support"
|
||||||
|
|
||||||
[patch.crates-io.serde-json-core]
|
[patch.crates-io.serde-json-core]
|
||||||
git = "https://github.com/rust-embedded-community/serde-json-core.git"
|
git = "https://github.com/rust-embedded-community/serde-json-core.git"
|
||||||
|
|
|
@ -147,13 +147,22 @@ const APP: () = {
|
||||||
!interface.network_stack().poll(clock.current_ms())
|
!interface.network_stack().poll(clock.current_ms())
|
||||||
});
|
});
|
||||||
|
|
||||||
if c.resources
|
match c
|
||||||
|
.resources
|
||||||
.mqtt_interface
|
.mqtt_interface
|
||||||
.lock(|interface| interface.update().unwrap())
|
.lock(|interface| interface.update())
|
||||||
{
|
{
|
||||||
c.spawn.settings_update().unwrap()
|
Ok(update) => {
|
||||||
} else if sleep {
|
if update {
|
||||||
cortex_m::asm::wfi();
|
c.spawn.settings_update().unwrap();
|
||||||
|
} else if sleep {
|
||||||
|
cortex_m::asm::wfi();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(miniconf::MqttError::Network(
|
||||||
|
smoltcp_nal::NetworkError::NoIpAddress,
|
||||||
|
)) => {}
|
||||||
|
Err(error) => log::info!("Unexpected error: {:?}", error),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,13 +19,18 @@ use super::{
|
||||||
|
|
||||||
pub struct NetStorage {
|
pub struct NetStorage {
|
||||||
pub ip_addrs: [smoltcp::wire::IpCidr; 1],
|
pub ip_addrs: [smoltcp::wire::IpCidr; 1],
|
||||||
pub sockets: [Option<smoltcp::socket::SocketSetItem<'static>>; 1],
|
pub sockets: [Option<smoltcp::socket::SocketSetItem<'static>>; 2],
|
||||||
pub neighbor_cache:
|
pub neighbor_cache:
|
||||||
[Option<(smoltcp::wire::IpAddress, smoltcp::iface::Neighbor)>; 8],
|
[Option<(smoltcp::wire::IpAddress, smoltcp::iface::Neighbor)>; 8],
|
||||||
pub routes_cache:
|
pub routes_cache:
|
||||||
[Option<(smoltcp::wire::IpCidr, smoltcp::iface::Route)>; 8],
|
[Option<(smoltcp::wire::IpCidr, smoltcp::iface::Route)>; 8],
|
||||||
pub tx_storage: [u8; 4096],
|
pub tx_storage: [u8; 4096],
|
||||||
pub rx_storage: [u8; 4096],
|
pub rx_storage: [u8; 4096],
|
||||||
|
|
||||||
|
pub dhcp_rx_metadata: [smoltcp::socket::RawPacketMetadata; 1],
|
||||||
|
pub dhcp_tx_metadata: [smoltcp::socket::RawPacketMetadata; 1],
|
||||||
|
pub dhcp_tx_storage: [u8; 600],
|
||||||
|
pub dhcp_rx_storage: [u8; 600],
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The available networking devices on Stabilizer.
|
/// The available networking devices on Stabilizer.
|
||||||
|
@ -69,10 +74,15 @@ static mut NET_STORE: NetStorage = NetStorage {
|
||||||
)],
|
)],
|
||||||
neighbor_cache: [None; 8],
|
neighbor_cache: [None; 8],
|
||||||
routes_cache: [None; 8],
|
routes_cache: [None; 8],
|
||||||
sockets: [None; 1],
|
sockets: [None, None],
|
||||||
|
|
||||||
tx_storage: [0; 4096],
|
tx_storage: [0; 4096],
|
||||||
rx_storage: [0; 4096],
|
rx_storage: [0; 4096],
|
||||||
|
|
||||||
|
dhcp_tx_storage: [0; 600],
|
||||||
|
dhcp_rx_storage: [0; 600],
|
||||||
|
dhcp_rx_metadata: [smoltcp::socket::RawPacketMetadata::EMPTY; 1],
|
||||||
|
dhcp_tx_metadata: [smoltcp::socket::RawPacketMetadata::EMPTY; 1],
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Configure the stabilizer hardware for operation.
|
/// Configure the stabilizer hardware for operation.
|
||||||
|
@ -519,14 +529,17 @@ pub fn setup(
|
||||||
let store = unsafe { &mut NET_STORE };
|
let store = unsafe { &mut NET_STORE };
|
||||||
|
|
||||||
store.ip_addrs[0] = smoltcp::wire::IpCidr::new(
|
store.ip_addrs[0] = smoltcp::wire::IpCidr::new(
|
||||||
smoltcp::wire::IpAddress::v4(10, 34, 16, 103),
|
smoltcp::wire::IpAddress::Ipv4(
|
||||||
24,
|
smoltcp::wire::Ipv4Address::UNSPECIFIED,
|
||||||
|
),
|
||||||
|
0,
|
||||||
);
|
);
|
||||||
|
|
||||||
let default_v4_gw = smoltcp::wire::Ipv4Address::new(10, 34, 16, 1);
|
|
||||||
let mut routes =
|
let mut routes =
|
||||||
smoltcp::iface::Routes::new(&mut store.routes_cache[..]);
|
smoltcp::iface::Routes::new(&mut store.routes_cache[..]);
|
||||||
routes.add_default_ipv4_route(default_v4_gw).unwrap();
|
routes
|
||||||
|
.add_default_ipv4_route(smoltcp::wire::Ipv4Address::UNSPECIFIED)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
let neighbor_cache =
|
let neighbor_cache =
|
||||||
smoltcp::iface::NeighborCache::new(&mut store.neighbor_cache[..]);
|
smoltcp::iface::NeighborCache::new(&mut store.neighbor_cache[..]);
|
||||||
|
@ -538,7 +551,7 @@ pub fn setup(
|
||||||
.routes(routes)
|
.routes(routes)
|
||||||
.finalize();
|
.finalize();
|
||||||
|
|
||||||
let sockets = {
|
let (mut sockets, handles) = {
|
||||||
// Note(unsafe): Configuration is only called once, so we only access the global
|
// Note(unsafe): Configuration is only called once, so we only access the global
|
||||||
// storage a single time.
|
// storage a single time.
|
||||||
let socket_storage = unsafe { &mut NET_STORE.sockets[..] };
|
let socket_storage = unsafe { &mut NET_STORE.sockets[..] };
|
||||||
|
@ -562,12 +575,39 @@ pub fn setup(
|
||||||
smoltcp::socket::TcpSocket::new(rx_buffer, tx_buffer)
|
smoltcp::socket::TcpSocket::new(rx_buffer, tx_buffer)
|
||||||
};
|
};
|
||||||
|
|
||||||
sockets.add(tcp_socket);
|
let handle = sockets.add(tcp_socket);
|
||||||
sockets
|
(sockets, [handle])
|
||||||
|
};
|
||||||
|
|
||||||
|
let dhcp_client = {
|
||||||
|
let rx = unsafe { &mut NET_STORE.dhcp_rx_storage[..] };
|
||||||
|
let tx = unsafe { &mut NET_STORE.dhcp_tx_storage[..] };
|
||||||
|
|
||||||
|
let dhcp_rx_buffer = smoltcp::socket::RawSocketBuffer::new(
|
||||||
|
unsafe { &mut NET_STORE.dhcp_rx_metadata[..] },
|
||||||
|
rx,
|
||||||
|
);
|
||||||
|
|
||||||
|
let dhcp_tx_buffer = smoltcp::socket::RawSocketBuffer::new(
|
||||||
|
unsafe { &mut NET_STORE.dhcp_tx_metadata[..] },
|
||||||
|
tx,
|
||||||
|
);
|
||||||
|
|
||||||
|
smoltcp::dhcp::Dhcpv4Client::new(
|
||||||
|
&mut sockets,
|
||||||
|
dhcp_rx_buffer,
|
||||||
|
dhcp_tx_buffer,
|
||||||
|
smoltcp::time::Instant::from_millis(-1),
|
||||||
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
NetworkDevices {
|
NetworkDevices {
|
||||||
stack: smoltcp_nal::NetworkStack::new(interface, sockets),
|
stack: smoltcp_nal::NetworkStack::new(
|
||||||
|
interface,
|
||||||
|
sockets,
|
||||||
|
&handles,
|
||||||
|
Some(dhcp_client),
|
||||||
|
),
|
||||||
phy: lan8742a,
|
phy: lan8742a,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -43,7 +43,7 @@ pub const DDS_SYNC_CLK_DIV: u8 = 4;
|
||||||
// The number of ticks in the ADC sampling timer. The timer runs at 100MHz, so the step size is
|
// The number of ticks in the ADC sampling timer. The timer runs at 100MHz, so the step size is
|
||||||
// equal to 10ns per tick.
|
// equal to 10ns per tick.
|
||||||
// Currently, the sample rate is equal to: Fsample = 100/128 MHz ~ 800 KHz
|
// Currently, the sample rate is equal to: Fsample = 100/128 MHz ~ 800 KHz
|
||||||
pub const ADC_SAMPLE_TICKS_LOG2: u8 = 7;
|
pub const ADC_SAMPLE_TICKS_LOG2: u8 = 12;
|
||||||
pub const ADC_SAMPLE_TICKS: u16 = 1 << ADC_SAMPLE_TICKS_LOG2;
|
pub const ADC_SAMPLE_TICKS: u16 = 1 << ADC_SAMPLE_TICKS_LOG2;
|
||||||
|
|
||||||
// The desired ADC sample processing buffer size.
|
// The desired ADC sample processing buffer size.
|
||||||
|
|
Loading…
Reference in New Issue