components/
keyboard_hid.rs1use core::mem::MaybeUninit;
37use kernel::capabilities;
38use kernel::component::Component;
39use kernel::create_capability;
40use kernel::hil;
41
42#[macro_export]
44macro_rules! keyboard_hid_component_static {
45 ($U:ty $(,)?) => {{
46 let hid = kernel::static_buf!(capsules_extra::usb::keyboard_hid::KeyboardHid<'static, $U>);
47 let driver = kernel::static_buf!(
48 capsules_extra::usb_hid_driver::UsbHidDriver<
49 'static,
50 capsules_extra::usb::keyboard_hid::KeyboardHid<'static, $U>,
51 >
52 );
53 let send_buffer = kernel::static_buf!([u8; 64]);
54 let recv_buffer = kernel::static_buf!([u8; 64]);
55
56 (hid, driver, send_buffer, recv_buffer)
57 };};
58}
59
60pub type KeyboardHidComponentType<U> = capsules_extra::usb_hid_driver::UsbHidDriver<
61 'static,
62 capsules_extra::usb::keyboard_hid::KeyboardHid<'static, U>,
63>;
64
65pub struct KeyboardHidComponent<U: 'static + hil::usb::UsbController<'static>> {
66 board_kernel: &'static kernel::Kernel,
67 driver_num: usize,
68 usb: &'static U,
69 vendor_id: u16,
70 product_id: u16,
71 strings: &'static [&'static str; 3],
72}
73
74impl<U: 'static + hil::usb::UsbController<'static>> KeyboardHidComponent<U> {
75 pub fn new(
76 board_kernel: &'static kernel::Kernel,
77 driver_num: usize,
78 usb: &'static U,
79 vendor_id: u16,
80 product_id: u16,
81 strings: &'static [&'static str; 3],
82 ) -> KeyboardHidComponent<U> {
83 KeyboardHidComponent {
84 board_kernel,
85 driver_num,
86 usb,
87 vendor_id,
88 product_id,
89 strings,
90 }
91 }
92}
93
94impl<U: 'static + hil::usb::UsbController<'static>> Component for KeyboardHidComponent<U> {
95 type StaticInput = (
96 &'static mut MaybeUninit<capsules_extra::usb::keyboard_hid::KeyboardHid<'static, U>>,
97 &'static mut MaybeUninit<
98 capsules_extra::usb_hid_driver::UsbHidDriver<
99 'static,
100 capsules_extra::usb::keyboard_hid::KeyboardHid<'static, U>,
101 >,
102 >,
103 &'static mut MaybeUninit<[u8; 64]>,
104 &'static mut MaybeUninit<[u8; 64]>,
105 );
106 type Output = (
107 &'static capsules_extra::usb::keyboard_hid::KeyboardHid<'static, U>,
108 &'static capsules_extra::usb_hid_driver::UsbHidDriver<
109 'static,
110 capsules_extra::usb::keyboard_hid::KeyboardHid<'static, U>,
111 >,
112 );
113
114 fn finalize(self, s: Self::StaticInput) -> Self::Output {
115 let keyboard_hid =
116 s.0.write(capsules_extra::usb::keyboard_hid::KeyboardHid::new(
117 self.usb,
118 self.vendor_id,
119 self.product_id,
120 self.strings,
121 ));
122 self.usb.set_client(keyboard_hid);
123
124 let grant_cap = create_capability!(capabilities::MemoryAllocationCapability);
125
126 let send_buffer = s.2.write([0; 64]);
127 let recv_buffer = s.3.write([0; 64]);
128
129 let usb_hid_driver = s.1.write(capsules_extra::usb_hid_driver::UsbHidDriver::new(
130 keyboard_hid,
131 send_buffer,
132 recv_buffer,
133 self.board_kernel.create_grant(self.driver_num, &grant_cap),
134 ));
135
136 keyboard_hid.set_client(usb_hid_driver);
137
138 (keyboard_hid, usb_hid_driver)
139 }
140}