use volatile_register::{RO, WO, RW}; use libregister::{register, register_bit, register_bits, RegisterW}; #[repr(C)] pub struct RegisterBlock { pub cache_id: RW, pub cache_type: RW, pub _unused1: [RO; 62], pub control: Control, pub aux_control: RW, pub tag_ram_control: RamControl, pub data_ram_control: RamControl, pub _unused2: [RO; 60], pub ev_counter_ctrl: RW, pub ev_counter1_cfg: RW, pub ev_counter2_cfg: RW, pub ev_counter1: RW, pub ev_counter2: RW, pub int_mask: Interrupts, pub int_mask_status: Interrupts, pub int_raw_status: Interrupts, pub int_clear: Interrupts, pub _unused3: [RO; 323], pub cache_sync: RW, pub _unused4: [RO; 15], pub inv_pa: RW, pub _unused5: [RO; 2], pub inv_way: RW, pub _unused6: [RO; 12], pub clean_pa: RW, pub _unused7: [RO; 1], pub clean_index: RW, pub clean_way: RW, pub _unused8: [RO; 12], pub clean_inv_pa: RW, pub _unused9: [RO; 1], pub clean_inv_index: RW, pub clean_inv_way: RW, pub _unused10: [RO; 64], pub d_lockdown0: RW, pub i_lockdown0: RW, pub d_lockdown1: RW, pub i_lockdown1: RW, pub d_lockdown2: RW, pub i_lockdown2: RW, pub d_lockdown3: RW, pub i_lockdown3: RW, pub d_lockdown4: RW, pub i_lockdown4: RW, pub d_lockdown5: RW, pub i_lockdown5: RW, pub d_lockdown6: RW, pub i_lockdown6: RW, pub d_lockdown7: RW, pub i_lockdown7: RW, pub _unused11: [RO; 4], pub lock_line_en: RW, pub unlock_way: RW, pub _unused12: [RO; 170], pub addr_filtering_start: RW, pub addr_filtering_end: RW, pub _unused13: [RO; 206], pub debug_ctrl: RW, pub _unused14: [RO; 7], pub prefetch_ctrl: RW, pub _unused15: [RO; 7], pub power_ctrl: RW, } impl RegisterBlock { pub unsafe fn new_at(baseaddr: usize) -> &'static mut Self { &mut *(baseaddr as *mut _) } } register!(control, Control, RW, u32); register_bit!(control, l2_enable, 0); register!(ram_control, RamControl, RW, u32); register_bits!(ram_control, setup_lat, u8, 0, 2); register_bits!(ram_control, rd_access_lat, u8, 4, 6); register_bits!(ram_control, wr_access_lat, u8, 8, 10); register!(interrupts, Interrupts, RW, u32); register_bit!(interrupts, ecntr, 0); register_bit!(interrupts, parrt, 1); register_bit!(interrupts, parrd, 2); register_bit!(interrupts, errwt, 3); register_bit!(interrupts, errwd, 4); register_bit!(interrupts, errrt, 5); register_bit!(interrupts, errrd, 6); register_bit!(interrupts, slverr, 7); register_bit!(interrupts, decerr, 8);