1use capsules_extra::app_loader::AppLoader;
35use core::mem::MaybeUninit;
36use kernel::capabilities;
37use kernel::component::Component;
38use kernel::create_capability;
39use kernel::dynamic_binary_storage;
40
41#[macro_export]
43macro_rules! app_loader_component_static {
44 ($S:ty, $L:ty $(,)?) => {{
45 let al = kernel::static_buf!(capsules_extra::app_loader::AppLoader<$S, $L>);
46 let buffer = kernel::static_buf!([u8; capsules_extra::app_loader::BUF_LEN]);
47
48 (al, buffer)
49 };};
50}
51
52pub struct AppLoaderComponent<
53 S: dynamic_binary_storage::DynamicBinaryStore + 'static,
54 L: dynamic_binary_storage::DynamicProcessLoad + 'static,
55> {
56 board_kernel: &'static kernel::Kernel,
57 driver_num: usize,
58 storage_driver: &'static S,
59 load_driver: &'static L,
60}
61
62impl<
63 S: dynamic_binary_storage::DynamicBinaryStore + 'static,
64 L: dynamic_binary_storage::DynamicProcessLoad + 'static,
65 > AppLoaderComponent<S, L>
66{
67 pub fn new(
68 board_kernel: &'static kernel::Kernel,
69 driver_num: usize,
70 storage_driver: &'static S,
71 load_driver: &'static L,
72 ) -> Self {
73 Self {
74 board_kernel,
75 driver_num,
76 storage_driver,
77 load_driver,
78 }
79 }
80}
81
82impl<
83 S: dynamic_binary_storage::DynamicBinaryStore + 'static,
84 L: dynamic_binary_storage::DynamicProcessLoad + 'static,
85 > Component for AppLoaderComponent<S, L>
86{
87 type StaticInput = (
88 &'static mut MaybeUninit<AppLoader<S, L>>,
89 &'static mut MaybeUninit<[u8; capsules_extra::app_loader::BUF_LEN]>,
90 );
91 type Output = &'static AppLoader<S, L>;
92
93 fn finalize(self, static_buffer: Self::StaticInput) -> Self::Output {
94 let grant_cap = create_capability!(capabilities::MemoryAllocationCapability);
95
96 let buffer = static_buffer
97 .1
98 .write([0; capsules_extra::app_loader::BUF_LEN]);
99
100 let dynamic_app_loader = static_buffer.0.write(AppLoader::new(
101 self.board_kernel.create_grant(self.driver_num, &grant_cap),
102 self.storage_driver,
103 self.load_driver,
104 buffer,
105 ));
106 dynamic_binary_storage::DynamicBinaryStore::set_storage_client(
107 self.storage_driver,
108 dynamic_app_loader,
109 );
110 dynamic_binary_storage::DynamicProcessLoad::set_load_client(
111 self.load_driver,
112 dynamic_app_loader,
113 );
114 dynamic_app_loader
115 }
116}