/* Constants for manipulating system registers of PPC 405EX in C Michael Hamel ADInstruments May 2008 */ #include /* Indirect access to Clocking/Power-On registers */ #define CPR0_DCR_BASE 0x0C #define cprcfga (CPR0_DCR_BASE+0x0) #define cprcfgd (CPR0_DCR_BASE+0x1) #define mtcpr(reg, d) \ do { \ PPC_SET_DEVICE_CONTROL_REGISTER(cprcfga,reg); \ PPC_SET_DEVICE_CONTROL_REGISTER(cprcfgd,d); \ } while (0) #define mfcpr(reg, d) \ do { \ PPC_SET_DEVICE_CONTROL_REGISTER(cprcfga,reg); \ d = PPC_DEVICE_CONTROL_REGISTER(cprcfgd); \ } while (0) /* Indirect access to System registers */ #define SDR_DCR_BASE 0x0E #define sdrcfga (SDR_DCR_BASE+0x0) #define sdrcfgd (SDR_DCR_BASE+0x1) #define mtsdr(reg, d) \ do { \ PPC_SET_DEVICE_CONTROL_REGISTER(sdrcfga,reg); \ PPC_SET_DEVICE_CONTROL_REGISTER(sdrcfgd,d); \ } while (0) #define mfsdr(reg, d) \ do { \ PPC_SET_DEVICE_CONTROL_REGISTER(sdrcfga,reg); \ d = PPC_DEVICE_CONTROL_REGISTER(sdrcfgd); \ } while (0) /* Indirect access to EBC registers */ #define EBC_DCR_BASE 0x12 #define ebccfga (EBC_DCR_BASE+0x0) #define ebccfgd (EBC_DCR_BASE+0x1) #define mtebc(reg, d) \ do { \ PPC_SET_DEVICE_CONTROL_REGISTER(ebccfga,reg); \ PPC_SET_DEVICE_CONTROL_REGISTER(ebccfgd,d); \ } while (0) #define mfebc(reg, d) \ do { \ PPC_SET_DEVICE_CONTROL_REGISTER(ebccfga,reg); \ d = PPC_DEVICE_CONTROL_REGISTER(ebccfgd); \ } while (0) /* EBC DCRs */ enum { /* EBC0_B0CR = 0, EBC0_B1CR = 1, EBC0_B2CR = 2, EBC0_B3CR = 3, EBC0_B0AP = 0x10, EBC0_B1AP = 0x11, EBC0_B2AP = 0x12, EBC0_B3AP = 0x13, EBC0_BEAR = 0x20, EBC0_BESR = 0x21, EBC0_CFG = 0x23, */ EBC0_CID = 0x24 }; enum { SDR0_PINSTP = 0x40, SDR0_UART0 = 0x120, SDR0_UART1 = 0x121, SDR0_C405 = 0x180, SDR0_SRST0 = 0x200, SDR0_MALTBL = 0x280, SDR0_MALRBL = 0x2A0, SDR0_MALTBS = 0x2C0, SDR0_MALRBS = 0x2E0, SDR0_PFC2 = 0x4102, SDR0_MFR = 0x4300, SDR0_EMAC0RXST = 0x4301, SDR0_HSF = 0x4400 }; enum { CPR0_CLKUPD = 0x20, CPR0_PLLC = 0x40, CPR0_PLLD = 0x60, CPR0_CPUD = 0x80, CPR0_PLBD = 0xA0, CPR0_OPBD = 0xC0, CPR0_PERD = 0xE0, CPR0_AHBD = 0x100, CPR0_ICFG = 0x140 }; /* Memory-mapped registers */ /*======================= Ethernet =================== */ enum { EMAC0EXAddress = 0xEF600900, EMAC1EXAddress = 0xEF600A00, /* 405EX-specific bits in EMAC_MR1 */ keEMAC1000Mbps = 0x00800000, keEMAC16KRxFIFO = 0x00280000, keEMAC8KRxFIFO = 0x00200000, keEMAC4KRxFIFO = 0x00180000, keEMAC2KRxFIFO = 0x00100000, keEMAC1KRxFIFO = 0x00080000, keEMAC16KTxFIFO = 0x00050000, keEMAC8KTxFIFO = 0x00040000, keEMAC4KTxFIFO = 0x00030000, keEMAC2KTxFIFO = 0x00020000, keEMAC1KTxFIFO = 0x00010000, keEMACJumbo = 0x00000800, keEMACIPHYAddr4 = 0x180, keEMACOPB50MHz = 0x00, keEMACOPB66MHz = 0x08, keEMACOPB83MHz = 0x10, keEMACOPB100MHz = 0x18, keEMACOPBGt100 = 0x20, /* 405EX-specific bits in MAL0_CFG */ keMALRdMaxBurst4 = 0, keMALRdMaxBurst8 = 0x00100000, keMALRdMaxBurst16 = 0x00200000, keMALRdMaxBurst32 = 0x00300000, keMALWrLowPriority = 0, keMALWrMedLowPriority = 0x00040000, keMALWrMedHiPriority = 0x00080000, keMALWrHighPriority = 0x000C0000, keMALWrMaxBurst4 = 0, keMALWrMaxBurst8 = 0x00010000, keMALWrMaxBurst16 = 0x00020000, keMALWrMaxBurst32 = 0x00030000, /* 405EX-specific STA bits */ keSTARun = 0x8000, keSTADirectRd = 0x1000, keSTADirectWr = 0x0800, keSTAIndirAddr = 0x2000, keSTAIndirRd = 0x3000, keSTAIndirWr = 0x2800 }; typedef struct GPIORegisters { uint32_t OR; uint32_t GPIO_TCR; /* Note that TCR is defined as a DCR name */ uint32_t OSRL; uint32_t OSRH; uint32_t TSRL; uint32_t TSRH; uint32_t ODR; uint32_t IR; uint32_t RR1; uint32_t RR2; uint32_t RR3; uint32_t unknown; uint32_t ISR1L; uint32_t ISR1H; uint32_t ISR2L; uint32_t ISR2H; uint32_t ISR3L; uint32_t ISR3H; } GPIORegisters; enum { GPIOAddress = 0xEF600800 }; typedef struct RGMIIRegisters { uint32_t FER; uint32_t SSR; } RGMIIRegisters; enum { RGMIIAddress = 0xEF600B00 };