Signed-off-by: Julien CLEMENT <julien.clement@epita.fr>
This commit is contained in:
parent
11782b5397
commit
7dd8764409
153
Cargo.lock
generated
153
Cargo.lock
generated
@ -2,6 +2,15 @@
|
|||||||
# It is not intended for manual editing.
|
# It is not intended for manual editing.
|
||||||
version = 3
|
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]]
|
[[package]]
|
||||||
name = "autocfg"
|
name = "autocfg"
|
||||||
version = "1.1.0"
|
version = "1.1.0"
|
||||||
@ -26,12 +35,24 @@ version = "1.3.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "byteorder"
|
||||||
|
version = "1.4.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
version = "0.1.10"
|
version = "0.1.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cobs"
|
||||||
|
version = "0.2.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "67ba02a97a2bd10f4b59b25c7973101c79642302776489e030cd13cdab09ed15"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conquer-once"
|
name = "conquer-once"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
@ -47,6 +68,12 @@ version = "0.2.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "654fb2472cc369d311c547103a1fa81d467bef370ae7a0680f65939895b1182a"
|
checksum = "654fb2472cc369d311c547103a1fa81d467bef370ae7a0680f65939895b1182a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "critical-section"
|
||||||
|
version = "1.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6548a0ad5d2549e111e1f6a11a6c2e2d00ce6a3dafe22948d67c2b443f775e52"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crossbeam-queue"
|
name = "crossbeam-queue"
|
||||||
version = "0.2.3"
|
version = "0.2.3"
|
||||||
@ -92,6 +119,29 @@ dependencies = [
|
|||||||
"pin-utils",
|
"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]]
|
[[package]]
|
||||||
name = "julios"
|
name = "julios"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@ -99,12 +149,15 @@ dependencies = [
|
|||||||
"conquer-once",
|
"conquer-once",
|
||||||
"crossbeam-queue",
|
"crossbeam-queue",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
|
"heapless",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"linked_list_allocator",
|
"linked_list_allocator",
|
||||||
"multiboot2",
|
"multiboot2",
|
||||||
"pc-keyboard",
|
"pc-keyboard",
|
||||||
"pic8259",
|
"pic8259",
|
||||||
"spin",
|
"postcard",
|
||||||
|
"serde",
|
||||||
|
"spin 0.5.2",
|
||||||
"volatile 0.2.7",
|
"volatile 0.2.7",
|
||||||
"x86_64",
|
"x86_64",
|
||||||
]
|
]
|
||||||
@ -115,7 +168,7 @@ version = "1.4.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"spin",
|
"spin 0.5.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -178,6 +231,44 @@ version = "0.1.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
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]]
|
[[package]]
|
||||||
name = "rustversion"
|
name = "rustversion"
|
||||||
version = "1.0.6"
|
version = "1.0.6"
|
||||||
@ -190,12 +281,47 @@ version = "1.1.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
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]]
|
[[package]]
|
||||||
name = "spin"
|
name = "spin"
|
||||||
version = "0.5.2"
|
version = "0.5.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
|
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]]
|
[[package]]
|
||||||
name = "spinning_top"
|
name = "spinning_top"
|
||||||
version = "0.2.4"
|
version = "0.2.4"
|
||||||
@ -205,6 +331,29 @@ dependencies = [
|
|||||||
"lock_api",
|
"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]]
|
[[package]]
|
||||||
name = "volatile"
|
name = "volatile"
|
||||||
version = "0.2.7"
|
version = "0.2.7"
|
||||||
|
@ -16,6 +16,9 @@ pic8259 = "0.10.1"
|
|||||||
pc-keyboard = "0.5.0"
|
pc-keyboard = "0.5.0"
|
||||||
multiboot2 = "0.1.0"
|
multiboot2 = "0.1.0"
|
||||||
linked_list_allocator = "0.9.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]
|
[dependencies.lazy_static]
|
||||||
version = "1.0"
|
version = "1.0"
|
||||||
|
@ -1,7 +1,12 @@
|
|||||||
use crate::serial_println;
|
use crate::serial_println;
|
||||||
use crate::println;
|
use crate::println;
|
||||||
|
|
||||||
|
use core::convert::TryInto;
|
||||||
|
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
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;
|
||||||
@ -14,6 +19,9 @@ const ATA_BUS_SECONDARY: u16 = 0x170;
|
|||||||
const ATA_DRIVE_MASTER: u8 = 0xa0;
|
const ATA_DRIVE_MASTER: u8 = 0xa0;
|
||||||
const ATA_DRIVE_SLAVE: u8 = 0xb0;
|
const ATA_DRIVE_SLAVE: u8 = 0xb0;
|
||||||
|
|
||||||
|
// ATA Commands
|
||||||
|
const ATA_CMD_PACKET: u8 = 0xa0;
|
||||||
|
|
||||||
// Status bits
|
// Status bits
|
||||||
const ATA_ERR: u8 = 1 << 0;
|
const ATA_ERR: u8 = 1 << 0;
|
||||||
const ATA_DRQ: u8 = 1 << 3;
|
const ATA_DRQ: u8 = 1 << 3;
|
||||||
@ -40,14 +48,14 @@ static ATAPI_SIG: [u8; 4] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref DRIVE: Option<ATABus> = {
|
static ref DRIVE: Mutex<Option<ATABus>> = {
|
||||||
ATABus::discover_atapi_drive()
|
Mutex::new(ATABus::discover_atapi_drive())
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn init() {
|
pub fn init() {
|
||||||
println!("Detecting drives");
|
println!("Detecting drives");
|
||||||
match DRIVE.as_ref() {
|
match DRIVE.lock().as_ref() {
|
||||||
None => println!("No drive detected :("),
|
None => println!("No drive detected :("),
|
||||||
Some(drive) => {
|
Some(drive) => {
|
||||||
let drive_type = match drive.current_drive {
|
let drive_type = match drive.current_drive {
|
||||||
@ -64,6 +72,9 @@ pub fn init() {
|
|||||||
serial_println!("Detected drive: {:?}", drive);
|
serial_println!("Detected drive: {:?}", drive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO : remove
|
||||||
|
DRIVE.lock().as_mut().unwrap().send_packet(SCSIPacket::new());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -71,7 +82,7 @@ struct ATABus {
|
|||||||
base_port: u16,
|
base_port: u16,
|
||||||
|
|
||||||
// IO ports
|
// IO ports
|
||||||
data: Port<u8>,
|
data: Port<u16>,
|
||||||
features: Port<u8>, // write
|
features: Port<u8>, // write
|
||||||
error: Port<u8>, // read
|
error: Port<u8>, // read
|
||||||
sector_count: Port<u8>,
|
sector_count: Port<u8>,
|
||||||
@ -164,6 +175,29 @@ impl ATABus {
|
|||||||
ATAPI_SIG == sig
|
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) {
|
fn wait_busy(&mut self) {
|
||||||
let mut status = ATA_BSY;
|
let mut status = ATA_BSY;
|
||||||
while (status & ATA_BSY) != 0 {
|
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()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user