diff options
Diffstat (limited to 'share/examples/kld/firmware')
-rw-r--r-- | share/examples/kld/firmware/Makefile | 5 | ||||
-rw-r--r-- | share/examples/kld/firmware/README | 17 | ||||
-rw-r--r-- | share/examples/kld/firmware/fwconsumer/Makefile | 6 | ||||
-rw-r--r-- | share/examples/kld/firmware/fwconsumer/fw_consumer.c | 77 | ||||
-rw-r--r-- | share/examples/kld/firmware/fwimage/Makefile | 11 | ||||
-rw-r--r-- | share/examples/kld/firmware/fwimage/firmware.img.uu | 15 |
6 files changed, 131 insertions, 0 deletions
diff --git a/share/examples/kld/firmware/Makefile b/share/examples/kld/firmware/Makefile new file mode 100644 index 000000000000..5e31deaa17eb --- /dev/null +++ b/share/examples/kld/firmware/Makefile @@ -0,0 +1,5 @@ +PACKAGE=examples +FILESDIR=${SHAREDIR}/examples/kld/firmware +SUBDIR= fwimage fwconsumer + +.include <bsd.subdir.mk> diff --git a/share/examples/kld/firmware/README b/share/examples/kld/firmware/README new file mode 100644 index 000000000000..473245a8e2ae --- /dev/null +++ b/share/examples/kld/firmware/README @@ -0,0 +1,17 @@ + +This is a simple example of the firmware(9) system. It consists of two +parts: + +1) fwimage + This is the firmware image (the ascii art of beastie from the boot + menu). The Makefile lists the firmware file "firmware.img" and the + short handle for this firmware image "beastie". + Note that the module is called "beastie" as well so that it can be + loaded automatically if requested. + +2) fwconsumer + This module tries to get the a firmware image called "beastie", + checks if the data is '\0'-terminated and prints it to the console. + It keeps a reference to the firmware until it is unloaded. + +This is mainly to demonstrate how to construct firmware image modules. diff --git a/share/examples/kld/firmware/fwconsumer/Makefile b/share/examples/kld/firmware/fwconsumer/Makefile new file mode 100644 index 000000000000..ce4f77d41d89 --- /dev/null +++ b/share/examples/kld/firmware/fwconsumer/Makefile @@ -0,0 +1,6 @@ +PACKAGE=examples +FILESDIR=${SHAREDIR}/examples/kld/fwconsumer +KMOD= fw_consumer +SRCS= fw_consumer.c + +.include <bsd.kmod.mk> diff --git a/share/examples/kld/firmware/fwconsumer/fw_consumer.c b/share/examples/kld/firmware/fwconsumer/fw_consumer.c new file mode 100644 index 000000000000..8d749fed65df --- /dev/null +++ b/share/examples/kld/firmware/fwconsumer/fw_consumer.c @@ -0,0 +1,77 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2006, Max Laier <mlaier@FreeBSD.org> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice unmodified, this list of conditions, and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/errno.h> +#include <sys/systm.h> +#include <sys/linker.h> +#include <sys/firmware.h> +#include <sys/proc.h> +#include <sys/module.h> + +static const struct firmware *fp; + +static int +fw_consumer_modevent(module_t mod, int type, void *unused) +{ + switch (type) { + case MOD_LOAD: + fp = firmware_get("beastie"); + + if (fp == NULL) + return (ENOENT); + + if (((const char *)fp->data)[fp->datasize - 1] != '\0') { + firmware_put(fp, FIRMWARE_UNLOAD); + return (EINVAL); + } + printf("%s", (const char *)fp->data); + + return (0); + case MOD_UNLOAD: + printf("Bye!\n"); + + if (fp != NULL) { + printf("%s", (const char *)fp->data); + firmware_put(fp, FIRMWARE_UNLOAD); + } + + return (0); + } + return (EINVAL); +} + +static moduledata_t fw_consumer_mod = { + "fw_consumer", + fw_consumer_modevent, + 0 +}; +DECLARE_MODULE(fw_consumer, fw_consumer_mod, SI_SUB_DRIVERS, SI_ORDER_ANY); +MODULE_VERSION(fw_consumer, 1); +MODULE_DEPEND(fw_consumer, firmware, 1, 1, 1); diff --git a/share/examples/kld/firmware/fwimage/Makefile b/share/examples/kld/firmware/fwimage/Makefile new file mode 100644 index 000000000000..b57d2bf326b4 --- /dev/null +++ b/share/examples/kld/firmware/fwimage/Makefile @@ -0,0 +1,11 @@ +PACKAGE=examples +FILESDIR=${SHAREDIR}/examples/kld/fwimage +KMOD= beastie +FIRMWS= firmware.img:beastie + +CLEANFILES= firmware.img + +firmware.img: firmware.img.uu + uudecode -p ${.ALLSRC} > ${.TARGET} + +.include <bsd.kmod.mk> diff --git a/share/examples/kld/firmware/fwimage/firmware.img.uu b/share/examples/kld/firmware/fwimage/firmware.img.uu new file mode 100644 index 000000000000..075877e0bcb3 --- /dev/null +++ b/share/examples/kld/firmware/fwimage/firmware.img.uu @@ -0,0 +1,15 @@ +begin 644 firmware.img +M("`@("`@("`@("`@("`L("`@("`@("`L"B`@("`@("`@("`@("`O*"`@("`@ +M("`@*0H@("`@("`@("`@("`@7"!<7U]?("`@+R!\"B`@("`@("`@("`@("`O +M+2!?("`M+R`@)PH@("`@("`@("`@("`H+UPO(%P@7"`@("]<"B`@("`@("`@ +M("`@("\@+R`@('P@("`@(%P*("`@("`@("`@("`@3R!/("`@*2`O("`@('P* +M("`@("`@("`@("`@+5XM+2<\("`@("`G"B`@("`@("`@("`@*%\N*2`@7R`@ +M*2`@("\*("`@("`@("`@("`@+E]?7R\@("`@+PH@("`@("`@("`@("`@("TM +M+2TM)R`O"B`\+2TM+2X@("`@(%]?("\@7U\@("!<"B`\+2TM+7P]/3T]3RDI +M*3T]*2!<*2`O/3T]/0H@/"TM+2TG("`@("TM)R`N7U\L)R!<"B`@("`@("`@ +M("`@("`@?"`@("`@("`@?`H@("`@("`@("`@("`@("!<("`@("`@("\@("`@ +M("`@+UP*("`@("`@("`@(%]?7U]?7R@@*%\@("\@7%]?7U]?7R\*("`@("`@ +M("`L)R`@+"TM+2TM)R`@('P*("`@("`@("`M+7M?7U]?7U]?7U]?*2`@0V]P +@>7)I9VAT("AC*2`R,#`S(%-C;W1T($QO;F<*```````` +` +end |