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:
bjorn3
2025-03-13 19:19:41 +01:00
parent f04725f9b1
commit d5692c2855
7 changed files with 0 additions and 191 deletions
Generated
-10
View File
@@ -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"
-1
View File
@@ -14,7 +14,6 @@ members = [
"audio/ac97d",
"audio/ihdad",
"audio/pcspkrd",
"audio/sb16d",
"graphics/bgad",
-1
View File
@@ -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
-11
View File
@@ -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"
-46
View File
@@ -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");
}
-35
View File
@@ -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);
}
}
}
-87
View File
@@ -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)
}
}