Migrate ac97d to pcid_interface

This commit is contained in:
bjorn3
2024-01-20 18:58:09 +01:00
parent f9f3407f36
commit d950e33184
4 changed files with 25 additions and 12 deletions
Generated
+2
View File
@@ -9,6 +9,7 @@ dependencies = [
"bitflags 1.3.2",
"common",
"log",
"pcid",
"redox-daemon",
"redox-log",
"redox_event 0.1.0",
@@ -46,6 +47,7 @@ dependencies = [
"common",
"log",
"partitionlib",
"pcid",
"redox-daemon",
"redox-log",
"redox_syscall 0.4.1",
+2
View File
@@ -12,3 +12,5 @@ redox-log = "0.1"
redox_event = { git = "https://gitlab.redox-os.org/redox-os/event.git" }
redox_syscall = "0.4"
spin = "0.9"
pcid = { path = "../pcid" }
+2 -1
View File
@@ -2,4 +2,5 @@
name = "AC97 Audio"
class = 0x04
subclass = 0x01
command = ["ac97d", "$NAME", "$BAR0", "$BAR1", "$IRQ"]
command = ["ac97d"]
use_channel = true
+19 -11
View File
@@ -5,16 +5,17 @@ extern crate spin;
extern crate syscall;
extern crate event;
use std::{env, usize};
use std::fs::File;
use std::io::{ErrorKind, Read, Write, Result};
use std::os::unix::io::{AsRawFd, FromRawFd, RawFd};
use syscall::{Packet, SchemeBlockMut, EventFlags};
use std::cell::RefCell;
use std::sync::Arc;
use std::usize;
use event::EventQueue;
use pcid_interface::{PciBar, PcidServerHandle};
use redox_log::{OutputBuilder, RedoxLogger};
use syscall::{EventFlags, Packet, SchemeBlockMut};
pub mod device;
@@ -63,26 +64,33 @@ fn setup_logging() -> Option<&'static RedoxLogger> {
}
fn main() {
let mut args = env::args().skip(1);
let mut pcid_handle =
PcidServerHandle::connect_default().expect("ac97d: failed to setup channel to pcid");
let pci_config = pcid_handle
.fetch_config()
.expect("ac97d: failed to fetch config");
let mut name = args.next().expect("ac97: no name provided");
let mut name = pci_config.func.name();
name.push_str("_ac97");
let bar0_str = args.next().expect("ac97: no address provided");
let bar0 = u16::from_str_radix(&bar0_str, 16).expect("ac97: failed to parse address");
let bar0 = match pci_config.func.bars[0] {
PciBar::Port(port) => port,
_ => unreachable!(),
};
let bar1_str = args.next().expect("ac97: no address provided");
let bar1 = u16::from_str_radix(&bar1_str, 16).expect("ac97: failed to parse address");
let bar1 = match pci_config.func.bars[1] {
PciBar::Port(port) => port,
_ => unreachable!(),
};
let irq_str = args.next().expect("ac97: no irq provided");
let irq = irq_str.parse::<u8>().expect("ac97: failed to parse irq");
let irq = pci_config.func.legacy_interrupt_line;
print!("{}", format!(" + ac97 {} on: {:X}, {:X}, IRQ {}\n", name, bar0, bar1, irq));
// Daemonize
redox_daemon::Daemon::new(move |daemon| {
let _logger_ref = setup_logging();
unsafe { syscall::iopl(3) }.expect("ac97d: failed to set I/O privilege level to Ring 3");
let mut irq_file = File::open(format!("irq:{}", irq)).expect("ac97d: failed to open IRQ file");