use core::ptr;
pub const EEPROM_PAGE_SIZE: u32 = 256;
pub const EEPROM_BLOCK_SIZE: u32 = 4096;
pub const EEPROM_MIN_ERASE_SIZE: u32 = 256;
pub const EEPROM_MIN_WRITE_SIZE: u32 = 1;
pub const EEPROM_MAX_SIZE: u32 = 0x8000;
pub const FLASH_ROM_MIN_WRITE_SIZE: u32 = 4;
pub const FLASH_ROM_MAX_SIZE: u32 = 0x070000;
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[repr(u8)]
pub enum RomCmd {
FlashRomStartIo = 0x00, FlashRomSwReset = 0x04, GetRomInfo = 0x06, GetUniqueId = 0x07, FlashRomPwrDown = 0x0D, FlashRomPwrUp = 0x0C, FlashRomLock = 0x08, EepromErase = 0x09, EepromWrite = 0x0A, EepromRead = 0x0B, FlashRomErase = 0x01, FlashRomWrite = 0x02, FlashRomVerify = 0x03, }
const ROM_CFG_MAC_ADDR: u32 = 0x7F018;
const ROM_CFG_BOOT_INFO: u32 = 0x7DFF8;
#[link(name = "ISP583")]
extern "C" {
pub fn FLASH_EEPROM_CMD(cmd: u8, star_addr: u32, buffer: *const u8, len: u32) -> u32;
}
pub fn get_unique_id() -> [u8; 8] {
let mut id = [0u8; 8];
unsafe {
FLASH_EEPROM_CMD(RomCmd::GetUniqueId as u8, 0, id.as_mut_ptr(), 0);
}
id
}
pub fn get_mac_address() -> [u8; 6] {
let mut mac = [0u8; 6];
unsafe {
FLASH_EEPROM_CMD(RomCmd::GetRomInfo as u8, ROM_CFG_MAC_ADDR, mac.as_mut_ptr(), 0);
}
mac
}
pub fn get_boot_info() -> [u8; 8] {
let mut boot_info = [0u8; 8];
unsafe {
FLASH_EEPROM_CMD(RomCmd::GetRomInfo as u8, ROM_CFG_BOOT_INFO, boot_info.as_mut_ptr(), 0);
}
boot_info
}
pub fn eeprom_read(start_addr: u32, buf: &mut [u8]) -> u32 {
unsafe { FLASH_EEPROM_CMD(RomCmd::EepromRead as u8, start_addr, buf.as_mut_ptr(), buf.len() as _) }
}
pub fn eeprom_erase(start_addr: u32, len: u32) -> u32 {
unsafe { FLASH_EEPROM_CMD(RomCmd::EepromErase as u8, start_addr, ptr::null_mut(), len) }
}
pub fn eeprom_write(start_addr: u32, buf: &[u8]) -> u32 {
unsafe { FLASH_EEPROM_CMD(RomCmd::EepromWrite as u8, start_addr, buf.as_ptr(), buf.len() as _) }
}
pub unsafe fn flash_power_down() {
FLASH_EEPROM_CMD(RomCmd::FlashRomPwrDown as u8, 0, ptr::null_mut(), 0);
}
pub unsafe fn flash_power_up() {
FLASH_EEPROM_CMD(RomCmd::FlashRomPwrUp as u8, 0, ptr::null_mut(), 0);
}
pub fn flash_rom_write(start_addr: u32, buf: &[u8]) -> bool {
unsafe { FLASH_EEPROM_CMD(RomCmd::FlashRomWrite as u8, start_addr, buf.as_ptr(), buf.len() as _) != 0 }
}
pub fn flash_rom_erase(start_addr: u32, len: u32) -> bool {
unsafe { FLASH_EEPROM_CMD(RomCmd::FlashRomErase as u8, start_addr, ptr::null_mut(), len) != 0 }
}
pub fn flash_rom_verify(start_addr: u32, buf: &mut [u8]) -> bool {
unsafe {
FLASH_EEPROM_CMD(
RomCmd::FlashRomVerify as u8,
start_addr,
buf.as_mut_ptr(),
buf.len() as _,
) != 0
}
}
pub fn flash_rom_read(start_addr: u32, buf: &mut [u8]) {
let addr = start_addr as *mut u32;
for i in 0..buf.len() {
unsafe {
*buf.get_unchecked_mut(i) = *addr.add(i) as u8;
}
}
}
pub fn flash_rom_reset() {
unsafe {
FLASH_EEPROM_CMD(RomCmd::FlashRomSwReset as u8, 0, ptr::null_mut(), 0);
}
}
pub fn flash_rom_start_io() {
unsafe {
FLASH_EEPROM_CMD(RomCmd::FlashRomStartIo as u8, 0, ptr::null_mut(), 0);
}
}
pub fn get_raw_user_option() -> u32 {
let mut opt = [0u8; 4];
unsafe {
FLASH_EEPROM_CMD(RomCmd::GetRomInfo as u8, 0x7EFFC, opt.as_mut_ptr(), 4);
}
u32::from_le_bytes(opt)
}
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub struct UserOption {
pub reset_enable: bool,
pub debug_enable: bool,
pub flash_rom_read_enable: bool,
pub bootloader_enable: bool,
pub boot_pin_enable: bool,
pub uart_no_key_download_enbale: bool,
pub flash_protect_enable: bool,
pub flash_protect_mask: u16,
}
pub fn get_user_option() -> Option<UserOption> {
let mut opt = [0u8; 4];
let ret = unsafe { FLASH_EEPROM_CMD(RomCmd::GetRomInfo as u8, 0x7EFFC, opt.as_mut_ptr(), 4) };
if ret == 0 {
let reset_enable = opt[0] & (1 << 3) != 0;
let debug_enable = opt[0] & (1 << 4) != 0;
let bootloader_enable = opt[0] & (1 << 6) != 0;
let flash_rom_read_enable = opt[0] & (1 << 7) != 0;
let uart_no_key_download_enbale = opt[1] & 1 != 0;
let boot_pin_enable = opt[1] & (1 << 1) != 0;
let s = u32::from_le_bytes(opt);
let flash_protect_enable = s & (5 << 20) != 0;
let flash_protect_mask = ((s >> 10) & 0x3fff) as u16;
Some(UserOption {
reset_enable,
debug_enable,
bootloader_enable,
flash_rom_read_enable,
uart_no_key_download_enbale,
boot_pin_enable,
flash_protect_enable,
flash_protect_mask,
})
} else {
None
}
}