Cleanup in elf.c with .bss section clean; adm command mounts cdrom instead of floppy...
[ZeXOS.git] / kernel / drivers / char / sound / speaker.c
bloba722e76e6060c90f1f8df12a1a29bed26da0c8b7
1 /*
2 * ZeX/OS
3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
4 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #include <config.h>
22 #include <build.h>
24 #ifdef ARCH_i386
26 #include <system.h>
27 #include <dev.h>
28 #include <arch/io.h>
29 #include <speaker.h>
31 #define PIT_TICK_RATE 1193182UL
33 static void pcspkr_do_sound (unsigned int freq)
35 unsigned int count = 0;
37 if (freq)
38 count = PIT_TICK_RATE/freq;
39 else
40 count = 0; // disable sound
42 if (count) {
43 /* enable counter 2 */
44 outb_p(inb_p(0x61) | 3, 0x61);
45 /* set command for counter 2, 2 byte write */
46 outb_p(0xB6, 0x43);
47 /* select desired HZ */
48 outb_p(count & 0xff, 0x42);
49 outb((count >> 8) & 0xff, 0x42);
50 } else {
51 /* disable counter 2 */
52 outb(inb_p(0x61) & 0xFC, 0x61);
56 bool pcspk_acthandler (unsigned act, unsigned freq)
58 switch (act) {
59 case DEV_ACT_INIT:
60 case DEV_ACT_STOP:
62 pcspkr_do_sound (0);
64 return 1;
66 break;
67 case DEV_ACT_PLAY:
69 pcspkr_do_sound (freq);
71 return 1;
73 break;
76 return 0;
78 #endif