Crates.io | cpuio |
lib.rs | cpuio |
version | 0.3.0 |
source | src |
created_at | 2015-11-08 19:29:28.862113 |
updated_at | 2020-05-20 18:00:17.567576 |
description | Bare metal (no_std) inb, outb, inw, outw, inl, outw instructions with Rust-like API |
homepage | https://github.com/emk/toyos-rs/tree/master/crates/cpuio |
repository | https://github.com/emk/toyos-rs |
max_upload_size | |
id | 3388 |
size | 7,909 |
cpuio
: Rust wrapper for inb
, outb
, etc., instructionsWARNING: The interface to the low-level outb
, outw
and outl
functions has changed to match Linux. Please reverse the order of
arguments to these three functions.
This library is intended to be run on bare metal, and it only depends on
the core
library.
To use this, add it to your Cargo.toml
file and call cpuio::Port::new
to create a port, being sure to specify u8
, u16
or u32
depending on
the size data supported by the port.
extern crate cpuio;
use cpuio::Port;
fn main() {
// Create a port pointing at 0x60, the address of the PS/2 keyboard
// port on x86 hardware. This is an unsafe operation because many
// ports can be used to reconfigure your underlying hardware, and
// it's the responsiblity of the port creator to make sure it's
// used safely.
let mut keyboard: Port<u8> = unsafe { Port::new(0x60) };
// Read a single scancode from a PS/2 keyboard. If you run this as
// an ordinary user, it will fail with a SIGSEGV.
println!("scancode: {}", keyboard.read());
}
The constructor Port::new
is available as a const fn
, which allows you
to configure a port at compile time.
The is also an UnsafePort
type which is identical, except that read
and
write
are explicitly marked as unsafe. It's better to use UnsafePort
whenever any individual port operation might corrupt memory or cause
undefined behavior.
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.