Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
parent
df9d85a1a5
commit
56d10459ed
@ -1,4 +1,7 @@
|
|||||||
|
mod scsi;
|
||||||
|
|
||||||
use crate::{println, serial_println};
|
use crate::{println, serial_println};
|
||||||
|
use scsi::{SCSIPacket};
|
||||||
|
|
||||||
use core::convert::TryInto;
|
use core::convert::TryInto;
|
||||||
use core::future::Future;
|
use core::future::Future;
|
||||||
@ -8,9 +11,7 @@ use core::task::{Context, Poll};
|
|||||||
|
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use futures_util::task::AtomicWaker;
|
use futures_util::task::AtomicWaker;
|
||||||
use serde::{Serialize, Deserialize};
|
|
||||||
use spin::Mutex;
|
use spin::Mutex;
|
||||||
use postcard::{to_vec};
|
|
||||||
use x86_64::instructions::port::Port;
|
use x86_64::instructions::port::Port;
|
||||||
|
|
||||||
const CD_SECTOR_SIZE: usize = 2048;
|
const CD_SECTOR_SIZE: usize = 2048;
|
||||||
@ -265,7 +266,7 @@ impl ATABus {
|
|||||||
|
|
||||||
packet.op_code = SCSI_READ_12;
|
packet.op_code = SCSI_READ_12;
|
||||||
packet.set_lba(lba);
|
packet.set_lba(lba);
|
||||||
packet.transfer_length_lo = 1;
|
packet.set_transfer_length(1);
|
||||||
|
|
||||||
self.send_packet(packet);
|
self.send_packet(packet);
|
||||||
|
|
||||||
@ -301,7 +302,7 @@ impl ATABus {
|
|||||||
|
|
||||||
packet.op_code = SCSI_READ_12;
|
packet.op_code = SCSI_READ_12;
|
||||||
packet.set_lba(lba);
|
packet.set_lba(lba);
|
||||||
packet.transfer_length_lo = 1;
|
packet.set_transfer_length(1);
|
||||||
|
|
||||||
self.send_packet(packet);
|
self.send_packet(packet);
|
||||||
|
|
||||||
@ -361,48 +362,6 @@ impl ATABus {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default, Serialize, Deserialize, Debug, Eq, PartialEq)]
|
|
||||||
#[repr(C, packed)]
|
|
||||||
struct SCSIPacket {
|
|
||||||
op_code: u8,
|
|
||||||
flags_lo: u8,
|
|
||||||
lba_hi: u8,
|
|
||||||
lba_mihi: u8,
|
|
||||||
lba_milo: u8,
|
|
||||||
lba_lo: u8,
|
|
||||||
transfer_length_hi: u8,
|
|
||||||
transfer_length_mihi: u8,
|
|
||||||
transfer_length_milo: u8,
|
|
||||||
transfer_length_lo: u8,
|
|
||||||
flags_hi: u8,
|
|
||||||
control: u8
|
|
||||||
}
|
|
||||||
|
|
||||||
impl SCSIPacket {
|
|
||||||
fn new() -> Self {
|
|
||||||
SCSIPacket::default()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn serialize(&self) -> heapless::Vec<u8, 12> {
|
|
||||||
to_vec(&self).unwrap()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_lba(&mut self, lba: u32) {
|
|
||||||
self.lba_lo = (lba & 0xff) as u8;
|
|
||||||
self.lba_milo = ((lba >> 0x8) & 0xff) as u8;
|
|
||||||
self.lba_mihi = ((lba >> 0x10) & 0xff) as u8;
|
|
||||||
self.lba_hi = ((lba >> 0x18) & 0xff) as u8;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(dead_code)]
|
|
||||||
fn set_transfer_length(&mut self, l: u32) {
|
|
||||||
self.transfer_length_lo = (l & 0xff) as u8;
|
|
||||||
self.transfer_length_milo = ((l >> 0x8) & 0xff) as u8;
|
|
||||||
self.transfer_length_mihi = ((l >> 0x10) & 0xff) as u8;
|
|
||||||
self.transfer_length_hi = ((l >> 0x18) & 0xff) as u8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
pub async fn print_block() {
|
pub async fn print_block() {
|
||||||
DRIVE.lock().as_mut().unwrap().read_block(0).await;
|
DRIVE.lock().as_mut().unwrap().read_block(0).await;
|
||||||
|
43
src/drivers/atapi/scsi.rs
Normal file
43
src/drivers/atapi/scsi.rs
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
use postcard::{to_vec};
|
||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
|
#[derive(Default, Serialize, Deserialize, Debug, Eq, PartialEq)]
|
||||||
|
#[repr(C, packed)]
|
||||||
|
pub struct SCSIPacket {
|
||||||
|
pub op_code: u8,
|
||||||
|
flags_lo: u8,
|
||||||
|
lba_hi: u8,
|
||||||
|
lba_mihi: u8,
|
||||||
|
lba_milo: u8,
|
||||||
|
lba_lo: u8,
|
||||||
|
transfer_length_hi: u8,
|
||||||
|
transfer_length_mihi: u8,
|
||||||
|
transfer_length_milo: u8,
|
||||||
|
transfer_length_lo: u8,
|
||||||
|
flags_hi: u8,
|
||||||
|
control: u8
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SCSIPacket {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
SCSIPacket::default()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn serialize(&self) -> heapless::Vec<u8, 12> {
|
||||||
|
to_vec(&self).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_lba(&mut self, lba: u32) {
|
||||||
|
self.lba_lo = (lba & 0xff) as u8;
|
||||||
|
self.lba_milo = ((lba >> 0x8) & 0xff) as u8;
|
||||||
|
self.lba_mihi = ((lba >> 0x10) & 0xff) as u8;
|
||||||
|
self.lba_hi = ((lba >> 0x18) & 0xff) as u8;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_transfer_length(&mut self, l: u32) {
|
||||||
|
self.transfer_length_lo = (l & 0xff) as u8;
|
||||||
|
self.transfer_length_milo = ((l >> 0x8) & 0xff) as u8;
|
||||||
|
self.transfer_length_mihi = ((l >> 0x10) & 0xff) as u8;
|
||||||
|
self.transfer_length_hi = ((l >> 0x18) & 0xff) as u8;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user