2020-08-04 10:15:57 +08:00
|
|
|
use libcortex_a9::sync_channel::{Sender, Receiver};
|
2020-07-09 04:32:45 +08:00
|
|
|
use libsupport_zynq::boot::Core1;
|
|
|
|
|
2020-09-01 09:44:34 +08:00
|
|
|
use super::{CHANNEL_0TO1, CHANNEL_1TO0, CHANNEL_SEM, INIT_LOCK, Message};
|
2020-08-04 10:17:19 +08:00
|
|
|
use crate::irq::restart_core1;
|
|
|
|
|
|
|
|
use core::mem::{forget, replace};
|
2020-07-09 04:32:45 +08:00
|
|
|
|
|
|
|
pub struct Control {
|
2020-08-04 10:15:57 +08:00
|
|
|
pub tx: Sender<'static, Message>,
|
|
|
|
pub rx: Receiver<'static, Message>,
|
|
|
|
}
|
|
|
|
|
|
|
|
fn get_channels() -> (Sender<'static, Message>, Receiver<'static, Message>) {
|
2020-09-01 09:44:34 +08:00
|
|
|
CHANNEL_SEM.wait();
|
2020-08-04 10:15:57 +08:00
|
|
|
let mut core0_tx = None;
|
|
|
|
while core0_tx.is_none() {
|
|
|
|
core0_tx = CHANNEL_0TO1.lock().take();
|
|
|
|
}
|
|
|
|
let core0_tx = core0_tx.unwrap();
|
|
|
|
|
|
|
|
let mut core0_rx = None;
|
|
|
|
while core0_rx.is_none() {
|
|
|
|
core0_rx = CHANNEL_1TO0.lock().take();
|
|
|
|
}
|
|
|
|
let core0_rx = core0_rx.unwrap();
|
|
|
|
|
|
|
|
(core0_tx, core0_rx)
|
2020-07-09 04:32:45 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Control {
|
|
|
|
pub fn start() -> Self {
|
2020-07-10 17:17:37 +08:00
|
|
|
Core1::start(true);
|
2020-08-04 10:15:57 +08:00
|
|
|
let (core0_tx, core0_rx) = get_channels();
|
2020-07-09 04:32:45 +08:00
|
|
|
|
|
|
|
Control {
|
|
|
|
tx: core0_tx,
|
|
|
|
rx: core0_rx,
|
|
|
|
}
|
|
|
|
}
|
2020-08-04 10:17:19 +08:00
|
|
|
|
|
|
|
pub fn restart(&mut self) {
|
2020-08-05 15:54:45 +08:00
|
|
|
{
|
2020-09-03 16:50:33 +08:00
|
|
|
let _lock = INIT_LOCK.lock();
|
2020-08-05 15:54:45 +08:00
|
|
|
restart_core1();
|
|
|
|
unsafe {
|
|
|
|
self.tx.drop_elements();
|
|
|
|
}
|
|
|
|
}
|
2020-08-04 10:17:19 +08:00
|
|
|
let (core0_tx, core0_rx) = get_channels();
|
|
|
|
// dangling pointer here, so we forget it
|
|
|
|
forget(replace(&mut self.tx, core0_tx));
|
|
|
|
forget(replace(&mut self.rx, core0_rx));
|
|
|
|
}
|
2020-07-09 04:32:45 +08:00
|
|
|
}
|
2020-08-04 10:15:57 +08:00
|
|
|
|