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 scsi::{SCSIPacket};
|
||||
|
||||
use core::convert::TryInto;
|
||||
use core::future::Future;
|
||||
@ -8,9 +11,7 @@ use core::task::{Context, Poll};
|
||||
|
||||
use lazy_static::lazy_static;
|
||||
use futures_util::task::AtomicWaker;
|
||||
use serde::{Serialize, Deserialize};
|
||||
use spin::Mutex;
|
||||
use postcard::{to_vec};
|
||||
use x86_64::instructions::port::Port;
|
||||
|
||||
const CD_SECTOR_SIZE: usize = 2048;
|
||||
@ -265,7 +266,7 @@ impl ATABus {
|
||||
|
||||
packet.op_code = SCSI_READ_12;
|
||||
packet.set_lba(lba);
|
||||
packet.transfer_length_lo = 1;
|
||||
packet.set_transfer_length(1);
|
||||
|
||||
self.send_packet(packet);
|
||||
|
||||
@ -301,7 +302,7 @@ impl ATABus {
|
||||
|
||||
packet.op_code = SCSI_READ_12;
|
||||
packet.set_lba(lba);
|
||||
packet.transfer_length_lo = 1;
|
||||
packet.set_transfer_length(1);
|
||||
|
||||
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() {
|
||||
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