2 * pccard noise interface.
3 * Nate Williams, October 1997.
4 * This file is in the public domain.
6 /* $FreeBSD: src/sys/pccard/pccard_beep.c,v 1.3.2.3 2001/06/05 19:11:34 imp Exp $ */
7 /* $DragonFly: src/sys/bus/pccard/Attic/pccard_beep.c,v 1.4 2004/09/18 21:05:07 joerg Exp $ */
10 #include <sys/kernel.h>
11 #include <sys/systm.h>
13 #include <machine/clock.h>
17 static enum beepstate allow_beep
= BEEP_OFF
;
18 static struct callout beep_timer
;
19 static int melody_type
= 0;
21 SYSINIT(pccard_beep
, SI_SUB_DRIVERS
, SI_ORDER_FIRST
, callout_init
, &beep_timer
);
23 #define MAX_TONE_MODE 3
31 static struct tone silent_beep
[] = {
35 static struct tone success_beep
[] = {
38 static struct tone failure_beep
[] = {
41 static struct tone insert_remove_beep
[] = {
45 static struct tone success_melody_beep
[] = {
46 {1200, 7}, {1000, 7}, { 800, 15}, {0, 0}
48 static struct tone failure_melody_beep
[] = {
49 {2000, 7}, {2400, 7}, {2800, 15}, {0, 0}
51 static struct tone insert_melody_beep
[] = {
52 {1600, 10}, {1200, 5}, {0, 0}
54 static struct tone remove_melody_beep
[] = {
55 {1200, 10}, {1600, 5}, {0, 0}
58 static struct tone
*melody_table
[MAX_TONE_MODE
][MAX_STATE
] = {
60 silent_beep
, silent_beep
, silent_beep
, silent_beep
,
62 { /* simple beep mode */
63 success_beep
, failure_beep
,
64 insert_remove_beep
, insert_remove_beep
,
66 { /* melody beep mode */
67 success_melody_beep
, failure_melody_beep
,
68 insert_melody_beep
, remove_melody_beep
,
74 pccard_beep_sub(void *arg
)
77 melody
= (struct tone
*)arg
;
79 if (melody
->pitch
!= 0) {
80 sysbeep(melody
->pitch
, melody
->duration
);
81 callout_reset(&beep_timer
, melody
->duration
,
82 pccard_beep_sub
, melody
+ 1);
88 pccard_beep_start(void *arg
)
91 melody
= (struct tone
*)arg
;
93 if (allow_beep
== BEEP_ON
&& melody
->pitch
!= 0) {
94 allow_beep
= BEEP_OFF
;
95 sysbeep(melody
->pitch
, melody
->duration
);
96 callout_reset(&beep_timer
, melody
->duration
,
97 pccard_beep_sub
, melody
+ 1);
102 pccard_success_beep(void)
104 pccard_beep_start(melody_table
[melody_type
][0]);
108 pccard_failure_beep(void)
110 pccard_beep_start(melody_table
[melody_type
][1]);
114 pccard_insert_beep(void)
116 pccard_beep_start(melody_table
[melody_type
][2]);
120 pccard_remove_beep(void)
122 pccard_beep_start(melody_table
[melody_type
][3]);
126 pccard_beep_select(int type
)
131 allow_beep
= BEEP_OFF
;
133 } else if (type
< 0 || MAX_TONE_MODE
- 1 < type
) {
136 allow_beep
= BEEP_ON
;