Remove pcspkrd
The PC speaker device is not a general purpose audio device, but only capable of playing beeps. While pcspkrd does currently get built, it never actually gets started at startup. There is also no program anywhere inside Redox OS capable of playing any sound through pcspkrd. And finally basically the thing it is used for on modern systems is to emit a beep when pressing backspace in a VT while there is no input buffered. I personally find that beep rather annoying and have disabled the Linux counterpart to pcspkrd on my system because of this.
This commit is contained in:
Generated
-10
@@ -984,16 +984,6 @@ dependencies = [
|
||||
"toml 0.5.11",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pcspkrd"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"common",
|
||||
"libredox",
|
||||
"redox-daemon",
|
||||
"redox_syscall",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pico-args"
|
||||
version = "0.5.0"
|
||||
|
||||
@@ -14,7 +14,6 @@ members = [
|
||||
|
||||
"audio/ac97d",
|
||||
"audio/ihdad",
|
||||
"audio/pcspkrd",
|
||||
"audio/sb16d",
|
||||
|
||||
"graphics/bgad",
|
||||
|
||||
@@ -18,7 +18,6 @@ This document covers the driver details.
|
||||
- ixgbed - Intel 10 Gigabit ethernet
|
||||
- nvmed - NVMe interface
|
||||
- pcid - PCI interface with extensions for PCI Express
|
||||
- pcspkrd - PC speaker
|
||||
- ps2d - PS/2 interface
|
||||
- rtl8139d - Realtek ethernet
|
||||
- rtl8168d - Realtek ethernet
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
[package]
|
||||
name = "pcspkrd"
|
||||
version = "0.1.0"
|
||||
authors = ["Tibor Nagy <xnagytibor@gmail.com>"]
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
common = { path = "../../common" }
|
||||
redox_syscall = "0.5"
|
||||
redox-daemon = "0.1"
|
||||
libredox = "0.1.3"
|
||||
@@ -1,46 +0,0 @@
|
||||
mod pcspkr;
|
||||
mod scheme;
|
||||
|
||||
use std::fs::File;
|
||||
use std::io::{Read, Write};
|
||||
|
||||
use syscall::call::iopl;
|
||||
use syscall::data::Packet;
|
||||
use syscall::scheme::SchemeMut;
|
||||
|
||||
use redox_daemon::Daemon;
|
||||
|
||||
use self::pcspkr::Pcspkr;
|
||||
use self::scheme::PcspkrScheme;
|
||||
|
||||
fn main() {
|
||||
Daemon::new(move |daemon| {
|
||||
unsafe { iopl(3).unwrap() };
|
||||
|
||||
let mut socket = File::create(":pcspkr").expect("pcspkrd: failed to create pcspkr scheme");
|
||||
daemon.ready().expect("failed to notify parent");
|
||||
|
||||
let pcspkr = Pcspkr::new();
|
||||
println!(" + pcspkr");
|
||||
|
||||
let mut scheme = PcspkrScheme {
|
||||
pcspkr,
|
||||
handle: None,
|
||||
next_id: 0,
|
||||
};
|
||||
|
||||
libredox::call::setrens(0, 0).expect("pcspkrd: failed to enter null namespace");
|
||||
|
||||
loop {
|
||||
let mut packet = Packet::default();
|
||||
socket
|
||||
.read(&mut packet)
|
||||
.expect("pcspkrd: failed to read events from pcspkr scheme");
|
||||
scheme.handle(&mut packet);
|
||||
socket
|
||||
.write(&packet)
|
||||
.expect("pcspkrd: failed to write responses to pcspkr scheme");
|
||||
}
|
||||
})
|
||||
.expect("pcspkrd: failed to daemonize");
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
use common::io::{Io, Pio};
|
||||
|
||||
pub struct Pcspkr {
|
||||
command: Pio<u8>,
|
||||
channel: Pio<u8>,
|
||||
gate: Pio<u8>,
|
||||
}
|
||||
|
||||
const PIT_FREQUENCY: usize = 0x1234DC;
|
||||
|
||||
impl Pcspkr {
|
||||
pub fn new() -> Pcspkr {
|
||||
Pcspkr {
|
||||
command: Pio::new(0x43),
|
||||
channel: Pio::new(0x42),
|
||||
gate: Pio::new(0x61),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_frequency(&mut self, frequency: usize) {
|
||||
let div = PIT_FREQUENCY.checked_div(frequency).unwrap_or(0);
|
||||
self.command.write(0xB6);
|
||||
self.channel.write((div & 0xFF) as u8);
|
||||
self.channel.write(((div >> 8) & 0xFF) as u8);
|
||||
}
|
||||
|
||||
pub fn set_gate(&mut self, state: bool) {
|
||||
let gate_value = self.gate.read();
|
||||
if state {
|
||||
self.gate.write(gate_value | 0x03);
|
||||
} else {
|
||||
self.gate.write(gate_value & 0xFC);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
use syscall::data::Stat;
|
||||
use syscall::{
|
||||
Error, Result, SchemeMut, EBUSY, EINVAL, EPERM, MODE_CHR, O_ACCMODE, O_STAT, O_WRONLY,
|
||||
};
|
||||
|
||||
use crate::pcspkr::Pcspkr;
|
||||
|
||||
pub struct PcspkrScheme {
|
||||
pub pcspkr: Pcspkr,
|
||||
pub handle: Option<usize>,
|
||||
pub next_id: usize,
|
||||
}
|
||||
|
||||
impl SchemeMut for PcspkrScheme {
|
||||
fn open(&mut self, _path: &str, flags: usize, _uid: u32, _gid: u32) -> Result<usize> {
|
||||
if (flags & O_ACCMODE == 0) && (flags & O_STAT == O_STAT) {
|
||||
Ok(0)
|
||||
} else if flags & O_ACCMODE == O_WRONLY {
|
||||
if self.handle.is_none() {
|
||||
self.next_id += 1;
|
||||
self.handle = Some(self.next_id);
|
||||
Ok(self.next_id)
|
||||
} else {
|
||||
Err(Error::new(EBUSY))
|
||||
}
|
||||
} else {
|
||||
Err(Error::new(EINVAL))
|
||||
}
|
||||
}
|
||||
|
||||
fn read(&mut self, _id: usize, _buf: &mut [u8]) -> Result<usize> {
|
||||
Err(Error::new(EPERM))
|
||||
}
|
||||
|
||||
fn write(&mut self, id: usize, buf: &[u8]) -> Result<usize> {
|
||||
if self.handle != Some(id) {
|
||||
return Err(Error::new(EINVAL));
|
||||
}
|
||||
|
||||
if buf.len() != 2 {
|
||||
return Err(Error::new(EINVAL));
|
||||
}
|
||||
|
||||
let frequency = buf[0] as usize + ((buf[1] as usize) << 8);
|
||||
|
||||
if frequency == 0 {
|
||||
self.pcspkr.set_gate(false);
|
||||
} else {
|
||||
self.pcspkr.set_frequency(frequency);
|
||||
self.pcspkr.set_gate(true);
|
||||
}
|
||||
|
||||
Ok(buf.len())
|
||||
}
|
||||
|
||||
fn fpath(&mut self, _id: usize, buf: &mut [u8]) -> Result<usize> {
|
||||
let mut i = 0;
|
||||
let scheme_path = b"pcspkr";
|
||||
while i < buf.len() && i < scheme_path.len() {
|
||||
buf[i] = scheme_path[i];
|
||||
i += 1;
|
||||
}
|
||||
Ok(i)
|
||||
}
|
||||
|
||||
fn fstat(&mut self, _id: usize, stat: &mut Stat) -> Result<usize> {
|
||||
*stat = Stat {
|
||||
st_mode: MODE_CHR | 0o222,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
Ok(0)
|
||||
}
|
||||
|
||||
fn fcntl(&mut self, _id: usize, _cmd: usize, _arg: usize) -> Result<usize> {
|
||||
Ok(0)
|
||||
}
|
||||
|
||||
fn close(&mut self, id: usize) -> Result<usize> {
|
||||
if self.handle == Some(id) {
|
||||
self.pcspkr.set_gate(false);
|
||||
self.handle = None;
|
||||
}
|
||||
|
||||
Ok(0)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user