Merge branch 'modernize_bgad' into 'master'
graphics/bgad: Use the MMIO based interface rather than port based one See merge request redox-os/drivers!303
This commit is contained in:
@@ -4,10 +4,3 @@ class = 0x03
|
||||
vendor = 0x1234
|
||||
device = 0x1111
|
||||
command = ["bgad"]
|
||||
|
||||
[[drivers]]
|
||||
name = "VirtualBox Graphics Array"
|
||||
class = 0x03
|
||||
vendor = 0x80EE
|
||||
device = 0xBEEF
|
||||
command = ["bgad"]
|
||||
|
||||
+26
-22
@@ -1,47 +1,51 @@
|
||||
use common::io::{Io, Pio};
|
||||
|
||||
const BGA_INDEX_XRES: u16 = 1;
|
||||
const BGA_INDEX_YRES: u16 = 2;
|
||||
const BGA_INDEX_BPP: u16 = 3;
|
||||
const BGA_INDEX_ENABLE: u16 = 4;
|
||||
|
||||
pub struct Bga {
|
||||
index: Pio<u16>,
|
||||
data: Pio<u16>,
|
||||
bar: *mut u8,
|
||||
}
|
||||
|
||||
impl Bga {
|
||||
pub fn new() -> Bga {
|
||||
Bga {
|
||||
index: Pio::new(0x1CE),
|
||||
data: Pio::new(0x1CF),
|
||||
pub unsafe fn new(bar: *mut u8) -> Bga {
|
||||
Bga { bar }
|
||||
}
|
||||
|
||||
fn bochs_dispi_addr(&mut self, index: u16) -> *mut u16 {
|
||||
assert!(index <= 0x10);
|
||||
unsafe {
|
||||
self.bar
|
||||
.byte_add(0x500)
|
||||
.cast::<u16>()
|
||||
.add(usize::from(index))
|
||||
}
|
||||
}
|
||||
|
||||
fn read(&mut self, index: u16) -> u16 {
|
||||
self.index.write(index);
|
||||
self.data.read()
|
||||
fn bochs_dispi_read(&mut self, index: u16) -> u16 {
|
||||
unsafe { self.bochs_dispi_addr(index).read_volatile() }
|
||||
}
|
||||
|
||||
fn write(&mut self, index: u16, data: u16) {
|
||||
self.index.write(index);
|
||||
self.data.write(data);
|
||||
fn bochs_dispi_write(&mut self, index: u16, data: u16) {
|
||||
assert!(index <= 0x10);
|
||||
unsafe {
|
||||
self.bochs_dispi_addr(index).write_volatile(data);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn width(&mut self) -> u16 {
|
||||
self.read(BGA_INDEX_XRES)
|
||||
self.bochs_dispi_read(BGA_INDEX_XRES)
|
||||
}
|
||||
|
||||
pub fn height(&mut self) -> u16 {
|
||||
self.read(BGA_INDEX_YRES)
|
||||
self.bochs_dispi_read(BGA_INDEX_YRES)
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn set_size(&mut self, width: u16, height: u16) {
|
||||
self.write(BGA_INDEX_ENABLE, 0);
|
||||
self.write(BGA_INDEX_XRES, width);
|
||||
self.write(BGA_INDEX_YRES, height);
|
||||
self.write(BGA_INDEX_BPP, 32);
|
||||
self.write(BGA_INDEX_ENABLE, 0x41);
|
||||
self.bochs_dispi_write(BGA_INDEX_ENABLE, 0);
|
||||
self.bochs_dispi_write(BGA_INDEX_XRES, width);
|
||||
self.bochs_dispi_write(BGA_INDEX_YRES, height);
|
||||
self.bochs_dispi_write(BGA_INDEX_BPP, 32);
|
||||
self.bochs_dispi_write(BGA_INDEX_ENABLE, 0x41);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use common::acquire_port_io_rights;
|
||||
//! <https://www.qemu.org/docs/master/specs/standard-vga.html>
|
||||
|
||||
use inputd::ProducerHandle;
|
||||
use pcid_interface::PciFunctionHandle;
|
||||
use redox_scheme::{RequestKind, SignalBehavior, Socket};
|
||||
@@ -9,8 +10,10 @@ use crate::scheme::BgaScheme;
|
||||
mod bga;
|
||||
mod scheme;
|
||||
|
||||
// FIXME add a driver-graphics implementation
|
||||
|
||||
fn main() {
|
||||
let pcid_handle = PciFunctionHandle::connect_default();
|
||||
let mut pcid_handle = PciFunctionHandle::connect_default();
|
||||
let pci_config = pcid_handle.config();
|
||||
|
||||
let mut name = pci_config.func.name();
|
||||
@@ -27,11 +30,11 @@ fn main() {
|
||||
log::info!("BGA {}", pci_config.func.display());
|
||||
|
||||
redox_daemon::Daemon::new(move |daemon| {
|
||||
acquire_port_io_rights().expect("bgad: failed to get port IO permission");
|
||||
|
||||
let socket = Socket::create("bga").expect("bgad: failed to create bga scheme");
|
||||
|
||||
let mut bga = Bga::new();
|
||||
let bar = unsafe { pcid_handle.map_bar(2) }.ptr.as_ptr();
|
||||
|
||||
let mut bga = unsafe { Bga::new(bar) };
|
||||
log::debug!("BGA {}x{}", bga.width(), bga.height());
|
||||
|
||||
let mut scheme = BgaScheme {
|
||||
|
||||
Reference in New Issue
Block a user