diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2013-05-03 21:08:42 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2013-05-03 21:08:42 +0400 |
commit | 1058def8e7827e56ce4a70afb4aeacb5dc44148f (patch) | |
tree | 4495d23e7b54ab5700e3839081e797c1eafe0db9 /tutorials/drivers/myossdev0/myossdev.c | |
download | oss4-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.c | 143 |
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 */ +} |