5 if [ "$#" -eq 0 ] || [ "$#" -gt 2 ]; then
6 echo "Usage: $(basename $0) fw.bin [module_prefix]"
11 echo "File $1 does not exist"
15 if [ "$#" -eq 2 ]; then
19 MODULEDIR=${MODULEDIR:-/boot/modules.local}
23 FWFILE=$(basename "$1")
24 # strip .bin and .fw extensions
25 MODNAME=$(basename $(basename "$1" .bin) .fw)
27 # if module_prefix is provided, append to module name
28 if [ "$#" -eq 2 ]; then
29 MODNAME=${MOD_PREFIX}${MODNAME}
32 # copy firmware file to workdir
33 cp -v "$1" "$WORKDIR"/"$FWFILE"
35 # prefer to use /sys build but provide workaround too
36 if [ -f /sys/tools/fw_stub.awk ];
38 echo "KMOD= ${MODNAME}" > "$WORKDIR"/Makefile
39 echo "FIRMWS= ${FWFILE}:${MODNAME}" >> "$WORKDIR"/Makefile
40 echo ".include <bsd.kmod.mk>" >> "$WORKDIR"/Makefile
45 # workaround case to build a local fw module version w/o kernel sources (should have no impact)
48 # ld/objcopy substitutes ' ', '-', '.' and '/' to '_'
49 FWSYM=$(echo ${FWFILE} |sed 's/ /_/g' | sed 's/-/_/g' |sed 's/\./_/g' |sed 's/\/_//g')
53 ld -b binary --no-warn-mismatch -r -d -o "${FWFILE}.fwo" "${FWFILE}"
55 cat << EOF >> ${MODNAME}.c
56 #include <sys/param.h>
57 #include <sys/errno.h>
58 #include <sys/kernel.h>
59 #include <sys/module.h>
60 #include <sys/linker.h>
61 #include <sys/firmware.h>
62 //#include <sys/systm.h>
64 extern char _binary_${FWSYM}_start[], _binary_${FWSYM}_end[];
67 ${MODNAME}_fw_modevent(module_t mod, int type, void *unused)
69 const struct firmware *fp;
73 fp = firmware_register("${MODNAME}", _binary_${FWSYM}_start , (size_t)(_binary_${FWSYM}_end - _binary_${FWSYM}_start), 0, NULL);
80 error = firmware_unregister("${MODNAME}");
86 static moduledata_t ${MODNAME}_fw_mod = {
88 ${MODNAME}_fw_modevent,
91 DECLARE_MODULE(${MODNAME}_fw, ${MODNAME}_fw_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);
92 MODULE_VERSION(${MODNAME}_fw, 1);
93 MODULE_DEPEND(${MODNAME}_fw, firmware, 1, 1, 1);
96 FFLAGS="-fno-common -ffreestanding -fno-asynchronous-unwind-tables -fno-omit-frame-pointer -fno-stack-protector"
97 cc -O -pipe -D_KERNEL -Wall -std=c99 -Werror -DKLD_MODULE ${FFLAGS} -mcmodel=kernel -mno-red-zone -c "${MODNAME}.c"
98 ld -r -d -o "${MODNAME}.ko" "${FWFILE}.fwo" "${MODNAME}.o"
103 # copy firmware module to external modules dir
104 cp -v "$WORKDIR/$MODNAME.ko" "${MODULEDIR}/"