summaryrefslogtreecommitdiff
path: root/tutorials/drivers/myossdev0/myossdev.c
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2013-05-03 21:08:42 +0400
committerIgor Pashev <pashev.igor@gmail.com>2013-05-03 21:08:42 +0400
commit1058def8e7827e56ce4a70afb4aeacb5dc44148f (patch)
tree4495d23e7b54ab5700e3839081e797c1eafe0db9 /tutorials/drivers/myossdev0/myossdev.c
downloadoss4-upstream.tar.gz
Imported Upstream version 4.2-build2006upstream/4.2-build2006upstream
Diffstat (limited to 'tutorials/drivers/myossdev0/myossdev.c')
-rw-r--r--tutorials/drivers/myossdev0/myossdev.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/tutorials/drivers/myossdev0/myossdev.c b/tutorials/drivers/myossdev0/myossdev.c
new file mode 100644
index 0000000..fbe5ce5
--- /dev/null
+++ b/tutorials/drivers/myossdev0/myossdev.c
@@ -0,0 +1,143 @@
+/*
+ * Purpose: Driver for the ACME Laboratories Evil Audio family of sound cards
+ * Description:
+ * This description section contains general information about the driver
+ * and the name and contact information of author and maintainer of the code.
+ *
+ * _NO_ copyright statement must be given in the comments since all drivers
+ * to be included in the OSS source tree must be compatible with the copying
+ * policy of the rest of OSS.
+ */
+
+/*
+ * Create a #define for the copying conditions. This define must be
+ * as above. Only the name of the copyright owner and the year(s) can be
+ * changed. This definition will be replaced by the actual OSS copyright
+ * statement by the build tools.
+ */
+/*
+ *
+ * This file is part of Open Sound System.
+ *
+ * Copyright (C) 4Front Technologies 1996-2008.
+ *
+ * This this source file is released under GPL v2 license (no other versions).
+ * See the COPYING file included in the main directory of this source
+ * distribution for the license terms and conditions.
+ *
+ */
+
+/*
+ * The _cfg.h file for the driver must be included before anything else
+ * by all OS drivers. This configuration file will be automatically generated
+ * based on the configuration files and operating system requirements.
+ */
+#include "myossdev_cfg.h"
+
+/*
+ * If the driver is split to multiple C source files then you should create
+ * a common header file for the driver and include it here.
+ */
+
+#include "myossdev.h"
+
+/*
+ * Drivers for PCI devices need to include <oss_pci.h>. Other drivers should
+ * not include it.
+ */
+#include <oss_pci.h>
+
+
+/*
+ * The attach routine for the device. This routine will be called once for
+ * each device instance found from the system. The osdev parameter is a handle
+ * to the device that will be needed by many subsequent OSS core functions.
+ */
+int
+myossdev_attach (oss_device_t * osdev)
+{
+ myossdev_devc_t *devc;
+
+ /*
+ * Some debugging printout. All OSS drivers must use cmn_err() instead
+ * of printf(), printk() or something else to print debugging and error
+ * messages.
+ *
+ * The cmn_err() call can be oput inside a DDB() macro. In this way the
+ * message will only be printed if OSS was started with detect_trace=1
+ * configuration option.
+ */
+ DDB (cmn_err (CE_CONT, "myossdev_attach called\n"));
+
+ /*
+ * First create the devc structure and initialize it to zeroes.
+ * The PMALLOC macro will allocate memory that will be automatically
+ * released when OSS gets unloaded. This kind of memory should be used
+ * for structures that will stay in use until the driver is unloaded.
+ */
+
+ if ((devc = PMALLOC (osdev, sizeof (*devc))) == NULL)
+ {
+ cmn_err (CE_WARN, "Cannot allocate devc\n");
+ return 0; /* Failure */
+ }
+
+ memset (devc, 0, sizeof (*devc));
+
+ /*
+ * Drivers must initialize osdev to have a link to the devc structure.
+ * Without this link the driver cannot be unloaded.
+ */
+ osdev->devc = devc;
+
+ /*
+ * Init the devc fields and create the mutex. Register the device.
+ */
+
+ devc->osdev = osdev;
+ MUTEX_INIT (devc->osdev, devc->mutex);
+ oss_register_device (osdev, "ACME Labs Evil Audio");
+
+ /*
+ * This is all for now. More will follow in the next episode.
+ */
+
+ return 1; /* Success */
+}
+
+/*
+ * Device detach routine. Note that this routine will be called once for
+ * each instance.
+ */
+
+int
+myossdev_detach (oss_device_t * osdev)
+{
+ myossdev_devc_t *devc = osdev->devc;
+ int err;
+
+ DDB (cmn_err (CE_CONT, "myossdev_detach called\n"));
+
+/*
+ * Check if the device is not busy.
+ */
+ if ((err = oss_disable_device (osdev)) < 0)
+ {
+ cmn_err (CE_WARN, "Cannot detach %s\n", osdev->nick);
+ return 0;
+ }
+
+ /*
+ * Uninitialize the instance variables. Do not try to free any
+ * memory allocated with PMALLOC().
+ */
+
+ MUTEX_CLEANUP (devc->mutex); /* Mutexes must be cleared */
+
+ /*
+ * Finally mark the device as inactive
+ */
+ oss_unregister_device (osdev);
+
+ return 1; /* Ok */
+}