Files
asusctl/rog-scsi/src/scsi.rs
2024-12-24 17:13:05 +13:00

81 lines
2.2 KiB
Rust

extern crate sg;
pub use sg::Task;
static ENE_APPLY_VAL: u8 = 0x01; // Value for Apply Changes Register
static ENE_SAVE_VAL: u8 = 0xaa;
static ENE_REG_MODE: u32 = 0x8021; // Mode Selection Register
static ENE_REG_SPEED: u32 = 0x8022; // Speed Control Register
static ENE_REG_DIRECTION: u32 = 0x8023; // Direction Control Register
static ENE_REG_APPLY: u32 = 0x80a0;
static _ENE_REG_COLORS_DIRECT_V2: u32 = 0x8100; // to read the colurs
static ENE_REG_COLORS_EFFECT_V2: u32 = 0x8160;
fn data(reg: u32, arg_count: u8) -> [u8; 16] {
let mut cdb = [0u8; 16];
cdb[0] = 0xec;
cdb[1] = 0x41;
cdb[2] = 0x53;
cdb[3] = ((reg >> 8) & 0x00ff) as u8;
cdb[4] = (reg & 0x00ff) as u8;
cdb[5] = 0x00;
cdb[6] = 0x00;
cdb[7] = 0x00;
cdb[8] = 0x00;
cdb[9] = 0x00;
cdb[10] = 0x00;
cdb[11] = 0x00;
cdb[12] = 0x00;
cdb[13] = arg_count; // how many u8 in data packet
cdb[14] = 0x00;
cdb[15] = 0x00;
cdb
}
pub(crate) fn rgb_task(led: u32, rgb: &[u8; 3]) -> Task {
let mut task = Task::new();
task.set_cdb(data(led * 3 + ENE_REG_COLORS_EFFECT_V2, 3).as_slice());
task.set_data(rgb, sg::Direction::ToDevice);
task
}
/// 0-13
pub(crate) fn mode_task(mode: u8) -> Task {
let mut task = Task::new();
task.set_cdb(data(ENE_REG_MODE, 1).as_slice());
task.set_data(&[mode.min(13)], sg::Direction::ToDevice);
task
}
/// 0-4, fast to slow
pub(crate) fn speed_task(speed: u8) -> Task {
let mut task = Task::new();
task.set_cdb(data(ENE_REG_SPEED, 1).as_slice());
task.set_data(&[speed.min(4)], sg::Direction::ToDevice);
task
}
/// 0 = forward, 1 = backward
pub(crate) fn dir_task(mode: u8) -> Task {
let mut task = Task::new();
task.set_cdb(data(ENE_REG_DIRECTION, 1).as_slice());
task.set_data(&[mode.min(1)], sg::Direction::ToDevice);
task
}
pub(crate) fn apply_task() -> Task {
let mut task = Task::new();
task.set_cdb(data(ENE_REG_APPLY, 1).as_slice());
task.set_data(&[ENE_APPLY_VAL], sg::Direction::ToDevice);
task
}
pub(crate) fn save_task() -> Task {
let mut task = Task::new();
task.set_cdb(data(ENE_REG_APPLY, 1).as_slice());
task.set_data(&[ENE_SAVE_VAL], sg::Direction::ToDevice);
task
}