add send scsi packet
All checks were successful
continuous-integration/drone Build is passing

Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
Julien CLEMENT 2022-12-12 01:08:16 +01:00
parent 11782b5397
commit 7dd8764409
3 changed files with 218 additions and 6 deletions

153
Cargo.lock generated

@ -2,6 +2,15 @@
# It is not intended for manual editing.
version = 3
[[package]]
name = "atomic-polyfill"
version = "0.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3ff7eb3f316534d83a8a2c3d1674ace8a5a71198eba31e2e2b597833f699b28"
dependencies = [
"critical-section",
]
[[package]]
name = "autocfg"
version = "1.1.0"
@ -26,12 +35,24 @@ version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "byteorder"
version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
[[package]]
name = "cfg-if"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "cobs"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15"
[[package]]
name = "conquer-once"
version = "0.2.1"
@ -47,6 +68,12 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "654fb2472cc369d311c547103a1fa81d467bef370ae7a0680f65939895b1182a"
[[package]]
name = "critical-section"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52"
[[package]]
name = "crossbeam-queue"
version = "0.2.3"
@ -92,6 +119,29 @@ dependencies = [
"pin-utils",
]
[[package]]
name = "hash32"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67"
dependencies = [
"byteorder",
]
[[package]]
name = "heapless"
version = "0.7.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db04bc24a18b9ea980628ecf00e6c0264f3c1426dac36c00cb49b6fbad8b0743"
dependencies = [
"atomic-polyfill",
"hash32",
"rustc_version",
"serde",
"spin 0.9.4",
"stable_deref_trait",
]
[[package]]
name = "julios"
version = "0.1.0"
@ -99,12 +149,15 @@ dependencies = [
"conquer-once",
"crossbeam-queue",
"futures-util",
"heapless",
"lazy_static",
"linked_list_allocator",
"multiboot2",
"pc-keyboard",
"pic8259",
"spin",
"postcard",
"serde",
"spin 0.5.2",
"volatile 0.2.7",
"x86_64",
]
@ -115,7 +168,7 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
dependencies = [
"spin",
"spin 0.5.2",
]
[[package]]
@ -178,6 +231,44 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
[[package]]
name = "postcard"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c2b180dc0bade59f03fd005cb967d3f1e5f69b13922dad0cd6e047cb8af2363"
dependencies = [
"cobs",
"heapless",
"serde",
]
[[package]]
name = "proc-macro2"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rustc_version"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
dependencies = [
"semver",
]
[[package]]
name = "rustversion"
version = "1.0.6"
@ -190,12 +281,47 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "semver"
version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4"
[[package]]
name = "serde"
version = "1.0.149"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "256b9932320c590e707b94576e3cc1f7c9024d0ee6612dfbcf1cb106cbe8e055"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.149"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4eae9b04cbffdfd550eb462ed33bc6a1b68c935127d008b27444d08380f94e4"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "spin"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
[[package]]
name = "spin"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f6002a767bff9e83f8eeecf883ecb8011875a21ae8da43bffb817a57e78cc09"
dependencies = [
"lock_api",
]
[[package]]
name = "spinning_top"
version = "0.2.4"
@ -205,6 +331,29 @@ dependencies = [
"lock_api",
]
[[package]]
name = "stable_deref_trait"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]]
name = "syn"
version = "1.0.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "unicode-ident"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
[[package]]
name = "volatile"
version = "0.2.7"

@ -16,6 +16,9 @@ pic8259 = "0.10.1"
pc-keyboard = "0.5.0"
multiboot2 = "0.1.0"
linked_list_allocator = "0.9.0"
postcard = "1.0.0"
serde = { version = "1.0", default-features = false, features = ["alloc"] }
heapless = "0.7.16"
[dependencies.lazy_static]
version = "1.0"

@ -1,7 +1,12 @@
use crate::serial_println;
use crate::println;
use core::convert::TryInto;
use lazy_static::lazy_static;
use serde::{Serialize, Deserialize};
use spin::Mutex;
use postcard::{to_vec};
use x86_64::instructions::port::Port;
const CD_SECTOR_SIZE: usize = 2048;
@ -14,6 +19,9 @@ const ATA_BUS_SECONDARY: u16 = 0x170;
const ATA_DRIVE_MASTER: u8 = 0xa0;
const ATA_DRIVE_SLAVE: u8 = 0xb0;
// ATA Commands
const ATA_CMD_PACKET: u8 = 0xa0;
// Status bits
const ATA_ERR: u8 = 1 << 0;
const ATA_DRQ: u8 = 1 << 3;
@ -40,14 +48,14 @@ static ATAPI_SIG: [u8; 4] = [
];
lazy_static! {
static ref DRIVE: Option<ATABus> = {
ATABus::discover_atapi_drive()
static ref DRIVE: Mutex<Option<ATABus>> = {
Mutex::new(ATABus::discover_atapi_drive())
};
}
pub fn init() {
println!("Detecting drives");
match DRIVE.as_ref() {
match DRIVE.lock().as_ref() {
None => println!("No drive detected :("),
Some(drive) => {
let drive_type = match drive.current_drive {
@ -64,6 +72,9 @@ pub fn init() {
serial_println!("Detected drive: {:?}", drive);
}
}
// TODO : remove
DRIVE.lock().as_mut().unwrap().send_packet(SCSIPacket::new());
}
#[derive(Debug)]
@ -71,7 +82,7 @@ struct ATABus {
base_port: u16,
// IO ports
data: Port<u8>,
data: Port<u16>,
features: Port<u8>, // write
error: Port<u8>, // read
sector_count: Port<u8>,
@ -164,6 +175,29 @@ impl ATABus {
ATAPI_SIG == sig
}
fn send_packet(&mut self, packet: SCSIPacket) {
let raw_packet = packet.serialize();
self.wait_busy();
unsafe {
self.features.write(0);
self.sector_count.write(0);
self.address2.write((CD_SECTOR_SIZE & 0xff) as u8);
self.address3.write(((CD_SECTOR_SIZE >> 8) & 0xff) as u8);
self.command.write(ATA_CMD_PACKET);
}
self.wait_packet_request();
for i in (0..raw_packet.len()).step_by(2) {
let word = u16::from_be_bytes(raw_packet[i..i+2].try_into().unwrap());
unsafe {
self.data.write(word);
}
}
// TODO: Wait packet data transmit
}
fn wait_busy(&mut self) {
let mut status = ATA_BSY;
while (status & ATA_BSY) != 0 {
@ -192,3 +226,29 @@ 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_midlo: 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()
}
}