Skip to content

Commit 734fee7

Browse files
committed
Add read operation to /dev/vga/palette
1 parent e194a77 commit 734fee7

File tree

3 files changed

+52
-13
lines changed

3 files changed

+52
-13
lines changed

src/sys/vga/mod.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const ATTR_READ_REG: u16 = 0x3C1;
2727
const MISC_WRITE_REG: u16 = 0x3C2;
2828
const SEQUENCER_ADDR_REG: u16 = 0x3C4;
2929
const SEQUENCER_DATA_REG: u16 = 0x3C5;
30+
const DAC_ADDR_READ_MODE_REG: u16 = 0x3C7;
3031
const DAC_ADDR_WRITE_MODE_REG: u16 = 0x3C8;
3132
const DAC_DATA_REG: u16 = 0x3C9;
3233
const GRAPHICS_ADDR_REG: u16 = 0x3CE;
@@ -75,11 +76,6 @@ struct ScreenBuffer {
7576
chars: [[ScreenChar; SCREEN_WIDTH]; SCREEN_HEIGHT],
7677
}
7778

78-
// Convert 8-bit to 6-bit color
79-
fn vga_color(color: u8) -> u8 {
80-
color >> 2
81-
}
82-
8379
// TODO: Remove this
8480
fn parse_palette(palette: &str) -> Result<(usize, u8, u8, u8), ParseIntError> {
8581
debug_assert!(palette.len() == 8);

src/sys/vga/palette.rs

+36-5
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,30 @@ impl Palette {
4242
palette
4343
}
4444

45+
pub fn get() -> Self {
46+
let mut palette = Palette::new();
47+
for i in 0..256 {
48+
palette.colors[i] = get_palette(i);
49+
}
50+
palette
51+
}
52+
4553
pub fn set(&self) {
4654
for (i, (r, g, b)) in self.colors.iter().enumerate() {
4755
set_palette(i, *r, *g, *b);
4856
}
4957
}
5058

59+
pub fn to_bytes(&self) -> [u8; 256 * 3] {
60+
let mut buf = [0; 256 * 3];
61+
for (i, (r, g, b)) in self.colors.iter().enumerate() {
62+
buf[i * 3 + 0] = *r;
63+
buf[i * 3 + 1] = *g;
64+
buf[i * 3 + 2] = *b;
65+
}
66+
buf
67+
}
68+
5169
pub fn size() -> usize {
5270
256 * 3
5371
}
@@ -70,8 +88,13 @@ impl TryFrom<&[u8]> for Palette {
7088
}
7189

7290
impl FileIO for VgaPalette {
73-
fn read(&mut self, _buf: &mut [u8]) -> Result<usize, ()> {
74-
Err(()) // TODO
91+
fn read(&mut self, buf: &mut [u8]) -> Result<usize, ()> {
92+
let res = Palette::get().to_bytes();
93+
if buf.len() < res.len() {
94+
return Err(());
95+
}
96+
buf.clone_from_slice(&res);
97+
Ok(res.len())
7598
}
7699

77100
fn write(&mut self, buf: &[u8]) -> Result<usize, ()> {
@@ -84,14 +107,22 @@ impl FileIO for VgaPalette {
84107

85108
fn poll(&mut self, event: IO) -> bool {
86109
match event {
87-
IO::Read => false, // TODO
88-
IO::Write => true, // TODO
110+
IO::Read => true,
111+
IO::Write => true,
89112
}
90113
}
91114
}
92115

93-
pub fn set_palette(i: usize, r: u8, g: u8, b: u8) {
116+
// TODO: Rename to `write_palette_index`
117+
fn set_palette(i: usize, r: u8, g: u8, b: u8) {
94118
interrupts::without_interrupts(||
95119
WRITER.lock().set_palette(i, r, g, b)
96120
)
97121
}
122+
123+
// TODO: Rename to `read_palette_index`
124+
fn get_palette(i: usize) -> (u8, u8, u8) {
125+
interrupts::without_interrupts(||
126+
WRITER.lock().palette(i)
127+
)
128+
}

src/sys/vga/writer.rs

+15-3
Original file line numberDiff line numberDiff line change
@@ -272,9 +272,21 @@ impl Writer {
272272
let mut data: Port<u8> = Port::new(DAC_DATA_REG);
273273
unsafe {
274274
addr.write(i as u8);
275-
data.write(vga_color(r));
276-
data.write(vga_color(g));
277-
data.write(vga_color(b));
275+
data.write(r >> 2); // Convert 8-bit to 6-bit color
276+
data.write(g >> 2);
277+
data.write(b >> 2);
278+
}
279+
}
280+
281+
pub fn palette(&mut self, i: usize) -> (u8, u8, u8) {
282+
let mut addr: Port<u8> = Port::new(DAC_ADDR_READ_MODE_REG);
283+
let mut data: Port<u8> = Port::new(DAC_DATA_REG);
284+
unsafe {
285+
addr.write(i as u8);
286+
let r = data.read() << 2; // Convert 6-bit to 8-bit color
287+
let g = data.read() << 2;
288+
let b = data.read() << 2;
289+
(r, g, b)
278290
}
279291
}
280292

0 commit comments

Comments
 (0)