general {
    version = 1
}

enum {
    "sam7_enable" {
        "Disable" { value = 0 };
        "Enable" { value = 1 };
    }
    "sam7_nebp" {
        "Page erase before programming" { value = 0 };
        "No page erase before programming" { value = 1 };
    }
    "sam7_fws" {
        "1 cycle read, 2 cycle write" { value = 0 };
        "2 cycle read, 3 cycle write" { value = 1 };
        "3 cycle read, 4 cycle write" { value = 2 };
        "4 cycle read, 4 cycle write" { value = 3 };
    }
    "sam7_frdy" {
        "Busy" { value = 0 };
        "Ready" { value = 1 };
    }
    "sam7_mcfr_mainrdy" {
        "MAINF not valid or main oscillator disabled" { value = 0 };
        "Main oscillator enabled and MAINF is valid" { value = 1 };
    }
    "sam7_mckr_css" {
        "Slow clock" { value = 0 };
        "Main clock" { value = 1 };
        "PLL clock" { value = 4 };
    }
    "sam7_mckr_pres" {
        "No division" { value = 0 };
        "1/2" { value = 1 };
        "1/4" { value = 2 };
        "1/8" { value = 3 };
        "1/16" { value = 4 };
        "1/32" { value = 5 };
        "1/64" { value = 6 };
    }
}
bitfield {
    mc_fmr_bitfield {
	FRDY {
	    loc = "0..0";
	    type = "sam7_enable";
	    desc = "Flash Ready Interrupt Enable";
	}
	LOCKE {
	    loc = "2..2";
	    type = "sam7_enable";
	    desc = "Lock Error Interrupt Enable";
	}
	PROGE {
	    loc = "3..3";
	    type = "sam7_enable";
	    desc = "Programming Error Interrupt Enable";
	}
	NEBP {
	    loc = "7..7";
	    type = "sam7_nebp";
	    desc = "No Erase Before Programming";
	}
	FWS {
	    loc = "8..9";
	    type = "sam7_fws";
	    desc = "Flash Wait State";
	}
	FMCN {
	    loc = "16..23";
	    desc = "Flash Microsecond Cycle Number";
	}
    }
    mc_fcr_bitfield {
	FCMD {
	    loc = "0..3";
	    desc = "Flash Command";
	}
	PAGEN {
	    loc = "8..17";
	    desc = "Page Number";
	}
	KEY {
	    loc = "24..31";
	    desc = "Write Protection Key";
	}
    }
    mc_fsr_bitfield {
	FRDY {
	    loc = "0..0";
	    type = "sam7_frdy";
	    desc = "Flash Ready Status";
	}
	LOCKE {
	    loc = "2..2";
	    desc = "Lock Error Status";
	}
	PROGE {
	    loc = "3..3";
	    desc = "Programming Error Status";
	}
	SECURITY {
	    loc = "4..4";
	    desc = "Security Bit Status";
	}
	GPNVM0 {
	    loc = "8..8";
	    desc = "General Purpose NVM Bit 0 Status";
	}
	GPNVM1 {
	    loc = "9..9";
	    desc = "General Purpose NVM Bit 1 Status";
	}
	LOCKS0 {
	    loc = "16..16";
	    desc = "Lock Region 0 Lock Status";
	}
	LOCKS1 {
	    loc = "17..17";
	    desc = "Lock Region 1 Lock Status";
	}
	LOCKS2 {
	    loc = "18..18";
	    desc = "Lock Region 2 Lock Status";
	}
	LOCKS3 {
	    loc = "19..19";
	    desc = "Lock Region 3 Lock Status";
	}
	LOCKS4 {
	    loc = "20..20";
	    desc = "Lock Region 4 Lock Status";
	}
	LOCKS5 {
	    loc = "21..21";
	    desc = "Lock Region 5 Lock Status";
	}
	LOCKS6 {
	    loc = "22..22";
	    desc = "Lock Region 6 Lock Status";
	}
	LOCKS7 {
	    loc = "23..23";
	    desc = "Lock Region 7 Lock Status";
	}
	LOCKS8 {
	    loc = "24..24";
	    desc = "Lock Region 8 Lock Status";
	}
	LOCKS9 {
	    loc = "25..25";
	    desc = "Lock Region 9 Lock Status";
	}
	LOCKS10 {
	    loc = "26..26";
	    desc = "Lock Region 10 Lock Status";
	}
	LOCKS11 {
	    loc = "27..27";
	    desc = "Lock Region 11 Lock Status";
	}
	LOCKS12 {
	    loc = "28..28";
	    desc = "Lock Region 12 Lock Status";
	}
	LOCKS13 {
	    loc = "29..29";
	    desc = "Lock Region 13 Lock Status";
	}
	LOCKS14 {
	    loc = "30..30";
	    desc = "Lock Region 14 Lock Status";
	}
	LOCKS15 {
	    loc = "31..31";
	    desc = "Lock Region 15 Lock Status";
	}
    }
    ckgr_mor_bitfield {
	MOSCEN {
	    loc = "0..0";
	    type = "sam7_enable";
	    desc = "Main Oscillator Enable";
	}
	OSCBYPASS {
	    loc = "1..1";
	    desc = "Oscillator Bypass";
	}
	OSCOUNT {
	    loc = "8..15";
	    desc = "Main Oscillator Start Up Time";
	}
    }
    ckgr_mcfr_bitfield {
	MAINF {
	    loc = "0..15";
	    desc = "Main Clock Frequency";
	}
	MAINRDY {
	    loc = "16..16";
	    type = "sam7_mcfr_mainrdy";
	    desc = "Main Clock Ready";
	}
    }
    pmc_mckr_bitfield {
	CSS {
	    loc = "0..1";
	    type = "sam7_mckr_css";
	    desc = "Master Clock Selection";
	}
	PRES {
	    loc = "2..4";
	    type = "sam7_mckr_pres";
	    desc = "Master Clock Prescaler";
	}
    }
    pmc_sr_bitfield {
	MOSCS {
	    loc = "0..0";
	    type = "sam7_enable";
	    desc = "MOSCS Flag Status";
	}
	LOCK {
	    loc = "2..2";
	    type = "sam7_enable";
	    desc = "PLL Lock Status";
	}
	MCKRDY {
	    loc = "3..3";
	    type = "sam7_enable";
	    desc = "Master Clock Status";
	}
	PCKRDY0 {
	    loc = "8..8";
	    type = "sam7_enable";
	    desc = "Programmable Clock 0 Ready Status";
	}
	PCKRDY1 {
	    loc = "9..9";
	    type = "sam7_enable";
	    desc = "Programmable Clock 1 Ready Status";
	}
	PCKRDY2 {
	    loc = "10..10";
	    type = "sam7_enable";
	    desc = "Programmable Clock 2 Ready Status";
	}
    }
}

register {
    MC_FMR {
	ln = "MC Flash Mode Register";
	access = "memorymapped";
	address = "0xffffff60";
	width = 32;
	type = "mc_fmr_bitfield";
	byte_endian = "little";
    }
    MC_FCR {
	ln = "MC Flash Control Register";
	access = "memorymapped";
	permission="read/none";
	address = "0xffffff64";
	width = 32;
	type = "mc_fcr_bitfield";
	byte_endian = "little";
    }
    MC_FSR {
	ln = "MC Flash Status Register";
	access = "memorymapped";
	permission="write/none";
	address = "0xffffff68";
	width = 32;
	type = "mc_fsr_bitfield";
	byte_endian = "little";
    }
    PMC_SCER {
	ln = "System Clock Enable Register";
	access = "memorymapped";
	address = "0xfffffc00";
	width = 32;
	byte_endian = "little";
    }
    PMC_SCDR {
	ln = "System Clock Disable Register";
	access = "memorymapped";
	address = "0xfffffc04";
	width = 32;
	byte_endian = "little";
    }
    PMC_SCSR {
	ln = "System Clock Status Register";
	access = "memorymapped";
	address = "0xfffffc08";
	width = 32;
	byte_endian = "little";
    }
    PMC_PCER {
	ln = "Peripheral Clock Enable Register";
	access = "memorymapped";
	address = "0xfffffc10";
	width = 32;
	byte_endian = "little";
    }
    PMC_PCDR {
	ln = "Peripheral Clock Disable Register";
	access = "memorymapped";
	address = "0xfffffc14";
	width = 32;
	byte_endian = "little";
    }
    PMC_PCSR {
	ln = "Peripheral Clock Status Register";
	access = "memorymapped";
	address = "0xfffffc18";
	width = 32;
	byte_endian = "little";
    }
    CKGR_MOR {
	ln = "Main Oscillator Register";
	access = "memorymapped";
	address = "0xfffffc20";
	width = 32;
	type = "ckgr_mor_bitfield";
	byte_endian = "little";
    }
    CKGR_MCFR {
	ln = "Main Clock Frequency Register";
	access = "memorymapped";
	address = "0xfffffc24";
	width = 32;
	type = "ckgr_mcfr_bitfield";
	byte_endian = "little";
    }
    CKGR_PLLR {
	ln = "PLL Register";
	access = "memorymapped";
	address = "0xfffffc2c";
	width = 32;
	byte_endian = "little";
    }
    PMC_MCKR {
	ln = "Master Clock Register";
	access = "memorymapped";
	address = "0xfffffc30";
	width = 32;
	type = "pmc_mckr_bitfield";
	byte_endian = "little";
    }
    PMC_PCK0 {
	ln = "Programmable Clock 0 Register";
	access = "memorymapped";
	address = "0xfffffc40";
	width = 32;
	type = "pmc_mckr_bitfield";
	byte_endian = "little";
    }
    PMC_PCK1 {
	ln = "Programmable Clock 1 Register";
	access = "memorymapped";
	address = "0xfffffc44";
	width = 32;
	type = "pmc_mckr_bitfield";
	byte_endian = "little";
    }
    PMC_IER {
	ln = "Interrupt Enable Register";
	access = "memorymapped";
	address = "0xfffffc60";
	width = 32;
	byte_endian = "little";
    }
    PMC_IDR {
	ln = "Interrupt Disable Register";
	access = "memorymapped";
	address = "0xfffffc64";
	width = 32;
	byte_endian = "little";
    }
    PMC_SR {
	ln = "Status Register";
	access = "memorymapped";
	address = "0xfffffc68";
	width = 32;
	type = "pmc_sr_bitfield";
	byte_endian = "little";
    }
    PMC_IMR {
	ln = "Interrupt Mask Register";
	access = "memorymapped";
	address = "0xfffffc6c";
	width = 32;
	byte_endian = "little";
    }
}

group {
    PMC {
	ln = "Power Management Controller";
	register = { "PMC_SCER", "PMC_SCDR", "PMC_SCSR", "PMC_PCER" };
	register += { "PMC_PCDR", "PMC_PCSR", "CKGR_MOR", "CKGR_MCFR" };
	register += { "CKGR_PLLR", "PMC_MCKR", "PMC_PCK0", "PMC_PCK1" };
	register += { "PMC_IER", "PMC_IDR", "PMC_SR", "PMC_IMR" };
    }
    EFC {
	ln = "Embedded Flash Controller";
	register = { "MC_FMR", "MC_FCR", "MC_FSR" };
    }
    AT91SAM7S {
        ln = "Atmel AT91SAM7S Registers"
        top_level_index = 100
        group = { "PMC", "EFC" }
    }
}
