macro_rules! module_firmware {
($($builder:tt)*) => { ... };
}
Expand description
Create firmware .modinfo entries.
This macro is the counterpart of the C macro MODULE_FIRMWARE()
, but instead of taking a
simple string literals, which is already covered by the firmware
field of
crate::prelude::module!
, it allows the caller to pass a builder type, based on the
ModInfoBuilder
, which can create the firmware modinfo strings in a more flexible way.
Drivers should extend the ModInfoBuilder
with their own driver specific builder type.
The builder
argument must be a type which implements the following function.
const fn create(module_name: &'static CStr) -> ModInfoBuilder
create
should pass the module_name
to the ModInfoBuilder
and, with the help of
it construct the corresponding firmware modinfo.
Typically, such contracts would be enforced by a trait, however traits do not (yet) support const functions.
ยงExample
struct Builder<const N: usize>;
impl<const N: usize> Builder<N> {
const DIR: &'static str = "vendor/chip/";
const FILES: [&'static str; 3] = [ "foo", "bar", "baz" ];
const fn create(module_name: &'static kernel::str::CStr) -> firmware::ModInfoBuilder<N> {
let mut builder = firmware::ModInfoBuilder::new(module_name);
let mut i = 0;
while i < Self::FILES.len() {
builder = builder.new_entry()
.push(Self::DIR)
.push(Self::FILES[i])
.push(".bin");
i += 1;
}
builder
}
}
module! {
type: MyModule,
name: "module_firmware_test",
author: "Rust for Linux",
description: "module_firmware! test module",
license: "GPL",
}
kernel::module_firmware!(Builder);