beep.c revision c35aa225b9ae500f1d14f0d39a94f1eb6cda333d
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * CDDL HEADER START
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * The contents of this file are subject to the terms of the
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Common Development and Distribution License (the "License").
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * You may not use this file except in compliance with the License.
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * See the License for the specific language governing permissions
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * and limitations under the License.
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * When distributing Covered Code, include this CDDL HEADER in each
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * If applicable, add the following below this CDDL HEADER, with the
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * fields enclosed by brackets "[]" replaced with your own identifying
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * information: Portions Copyright [yyyy] [name of copyright owner]
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * CDDL HEADER END
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Use is subject to license terms.
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx#pragma ident "%Z%%M% %I% %E% SMI"
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * This is the Beep module for supporting keyboard beep for keyboards
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * that do not have the beeping feature within themselves
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Debug stuff
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * BEEP_DEBUG used for errors
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * BEEP_DEBUG1 prints when beep_debug > 1 and used for normal messages
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx#define BEEP_DEBUG1(args) if (beep_debug > 1) cmn_err args
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Note that mutex_init is not called on the mutex in beep_state,
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * But assumes that zeroed memory does not need to call mutex_init,
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * as documented in mutex.c
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * beep_init:
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Allocate the beep_queue structure
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Initialize beep_state structure
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Called from beep driver attach routine
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx "beep_init(0x%lx, 0x%lx, 0x%lx, 0x%lx) : start.",
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx (unsigned long) arg,
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx (unsigned long) beep_on_func,
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx (unsigned long) beep_off_func,
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx (unsigned long) beep_freq_func));
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx "beep_init : beep_state already initialized."));
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx queue = kmem_zalloc(sizeof (beep_entry_t) * beep_queue_size,
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx "beep_init : beep_queue kmem_zalloc(%d) = 0x%lx.",
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx (unsigned long)queue));
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx "beep_init : kmem_zalloc of beep_queue failed."));
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx "beep_fini : beep_state already uninitialized."));
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx return (0);
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx return (0);
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx return (0);
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx BEEP_DEBUG1((CE_CONT, "beeper_freq(%d, %d) : start", type, freq));
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * The frequency value is limited to the range of [0 - 32767]
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx for (bp = beep_params; bp->type != BEEP_DEFAULT; bp++) {
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx return (0);
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Start beeping for period specified by the type value,
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * from the value in the beep_param structure in milliseconds.
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx for (bp = beep_params; bp->type != BEEP_DEFAULT; bp++) {
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx /* If type doesn't match, return silently without beeping */
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx/*ARGSUSED*/
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * No-op at this time.
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Don't think we can make this work in general, as tem_safe
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * has a requirement of no mutexes, but kbd sends messages
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * through streams.
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx return (0);
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * beeper_on :
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Turn the beeper on
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx BEEP_DEBUG1((CE_CONT, "beeper_on(%d) : start.", type));
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx for (bp = beep_params; bp->type != BEEP_DEFAULT; bp++) {
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx /* If type doesn't match, return silently without beeping */
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx /* Start another beep only if the previous one is over */
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx BEEP_DEBUG1((CE_CONT, "beeper_on : done, status %d.", status));
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx BEEP_DEBUG1((CE_CONT, "beep_mktone(%d, %d) : start.", frequency,
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * The frequency value is limited to the range of [0 - 32767]
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx /* If already processing a beep, queue this one */
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * If there is room in the queue,
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * add this entry
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx /* Start another beep only if the previous one is over */
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Set timeout for ending the beep after the
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * specified time
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx BEEP_DEBUG1((CE_CONT, "beep_mktone : done, status %d.", status));
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Turn the beeper off which had been turned on from beep()
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * for a specified period of time
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx/*ARGSUSED*/
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx BEEP_DEBUG1((CE_CONT, "beep_timeout : uninitialized."));
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx /* Set timeout for ending the beep after the specified time */
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx * Return true (1) if we are sounding a tone.
c35aa225b9ae500f1d14f0d39a94f1eb6cda333dmarx BEEP_DEBUG1((CE_CONT, "beep_busy : status %d.", status));