summaryrefslogtreecommitdiff
path: root/os/sa1110/sa1110io.h
diff options
context:
space:
mode:
Diffstat (limited to 'os/sa1110/sa1110io.h')
-rw-r--r--os/sa1110/sa1110io.h500
1 files changed, 500 insertions, 0 deletions
diff --git a/os/sa1110/sa1110io.h b/os/sa1110/sa1110io.h
new file mode 100644
index 00000000..53913c3d
--- /dev/null
+++ b/os/sa1110/sa1110io.h
@@ -0,0 +1,500 @@
+typedef struct PCMconftab PCMconftab;
+typedef struct PCMmap PCMmap;
+typedef struct PCMslot PCMslot;
+
+/*
+ * physical device addresses are mapped to the same virtual ones,
+ * allowing the same addresses to be used with or without mmu.
+ */
+
+#define PCMCIAcard(n) (PHYSPCMCIA0+((n)*PCMCIASIZE))
+#define PCMCIAIO(n) (PCMCIAcard(n)+0x0) /* I/O space */
+#define PCMCIAAttr(n) (PCMCIAcard(n)+0x8000000) /* Attribute space*/
+#define PCMCIAMem(n) (PCMCIAcard(n)+0xC000000) /* Memory space */
+
+#define INTRREG ((IntrReg*)PHYSINTR)
+typedef struct IntrReg IntrReg;
+struct IntrReg {
+ ulong icip; /* IRQ pending */
+ ulong icmr; /* mask */
+ ulong iclr; /* level */
+ ulong iccr; /* control */
+ ulong icfp; /* FIQ pending */
+ ulong rsvd[3];
+ ulong icpr; /* pending */
+};
+
+#define GPIObit(n) (n) /* GPIO Edge Detect bits */
+#define LCDbit (12) /* LCD Service Request */
+#define UDCbit (13) /* UDC Service Request */
+#define SDLCbit (14) /* SDLC Service Request */
+#define UARTbit(n) (15+((n)-1)) /* UART Service Request */
+#define HSSPbit (16) /* HSSP Service Request */
+#define MCPbit (18) /* MCP Service Request */
+#define SSPbit (19) /* SSP Serivce Request */
+#define DMAbit(chan) (20+(chan)) /* DMA channel Request */
+#define OSTimerbit(n) (26+(n)) /* OS Timer Request */
+#define RTCticbit (30) /* One Hz tic occured */
+#define RTCalarmbit (31) /* RTC = alarm register */
+#define MaxIRQbit 31 /* Maximum IRQ */
+#define MaxGPIObit 27 /* Maximum GPIO */
+
+#define GPIOREG ((GpioReg*)PHYSGPIO)
+typedef struct GpioReg GpioReg;
+struct GpioReg {
+ ulong gplr;
+ ulong gpdr;
+ ulong gpsr;
+ ulong gpcr;
+ ulong grer;
+ ulong gfer;
+ ulong gedr;
+ ulong gafr;
+};
+
+enum {
+ /* GPIO alternative functions if gafr bit set (see table on page 9-9) */
+ GPIO_32KHZ_OUT_o = 1<<27, /* raw 32.768kHz oscillator output */
+ GPIO_RCLK_OUT_o = 1<<26, /* internal clock/2 (must also set TUCR) */
+ GPIO_RTC_clock_o = 1<<25, /* real time clock out */
+ GPIO_TREQB_i = 1<<23, /* TIC request B */
+ GPIO_TREQA_i = 1<<22, /* TIC request A (or MBREQ) */
+ GPIO_TICK_ACK_o = 1<<21, /* TIC ack (or MBGNT), when output */
+ GPIO_MCP_CLK_i = 1<<21, /* MCP clock in, when input */
+ GPIO_UART_SCLK3_i = 1<<20, /* serial port 3 UART sample clock input */
+ GPIO_SSP_CLK_i = 1<<19, /* serial port 2 SSP sample clock input */
+ GPIO_UART_SCLK1_i = 1<<18, /* serial port 1 UART sample clock input */
+ GPIO_GPCLK_OUT_o = 1<<16, /* serial port 1 general-purpose clock out */
+ GPIO_UART_RXD_i = 1<<15, /* serial port 1 UART receive */
+ GPIO_UART_TXD_o = 1<<14, /* serial port 1 UART transmit */
+ GPIO_SSP_SFRM_o = 1<<13, /* SSP frame clock out */
+ GPIO_SSP_SCLK_o = 1<<12, /* SSP serial clock out */
+ GPIO_SSP_RXD_i = 1<<11, /* SSP receive */
+ GPIO_SSP_TXD_o = 1<<10, /* SSP transmit */
+ GPIO_LDD8_15_o = 0xFF<<2, /* high-order LCD data (bits 8-15) */
+ GPIO_LDD15_o = 1<<9,
+ GPIO_LDD14_o = 1<<8,
+ GPIO_LDD13_o = 1<<7,
+ GPIO_LDD12_o = 1<<6,
+ GPIO_LDD11_o = 1<<5,
+ GPIO_LDD10_o = 1<<4,
+ GPIO_LDD9_o = 1<<3,
+ GPIO_LDD8_o = 1<<2,
+};
+
+#define RTCREG ((RtcReg*)PHYSRTC)
+typedef struct RtcReg RtcReg;
+struct RtcReg {
+ ulong rtar; /* alarm */
+ ulong rcnr; /* count */
+ ulong rttr; /* trim */
+ ulong rsvd;
+ ulong rtsr; /* status */
+};
+
+#define OSTMRREG ((OstmrReg*)PHYSOSTMR)
+typedef struct OstmrReg OstmrReg;
+struct OstmrReg {
+ ulong osmr[4]; /* match */
+ ulong oscr; /* counter */
+ ulong ossr; /* status */
+ ulong ower; /* watchdog */
+ ulong oier; /* interrupt enable */
+};
+
+#define PMGRREG ((PmgrReg*)PHYSPOWER)
+typedef struct PmgrReg PmgrReg;
+struct PmgrReg {
+ ulong pmcr; /* ctl register */
+ ulong pssr; /* sleep status */
+ ulong pspr; /* scratch pad */
+ ulong pwer; /* wakeup enable */
+ ulong pcfr; /* general conf */
+ ulong ppcr; /* PLL configuration */
+ ulong pgsr; /* GPIO sleep state */
+ ulong posr; /* oscillator status */
+};
+
+enum
+{
+ /* page 9-35 to 40 */
+ PCFR_opde = 1<<0, /* oscillator powers down in sleep */
+ PCFR_fp = 1<<1, /* float pcmcia */
+ PCFR_fs = 1<<2, /* float static memory */
+ PCFR_fo = 1<<3, /* force 32k oscillator on */
+
+ PWER_rtc = 1<<31, /* wakeup by RTC alarm */
+
+ PSSR_sss = 1<<0, /* software sleep status */
+ PSSR_bfs = 1<<1, /* battery fault status */
+ PSSR_vfs = 1<<2, /* VDD fault status */
+ PSSR_dh = 1<<3, /* DRAM control held */
+ PSSR_ph = 1<<4, /* peripheral control hold */
+};
+
+#define RESETREG ((ResetReg*)PHYSRESET)
+typedef struct ResetReg ResetReg;
+struct ResetReg {
+ ulong rsrr; /* software reset */
+ ulong rcsr; /* status */
+ ulong tucr; /* reserved for test */
+};
+
+#define MEMCFGREG ((MemcfgReg*)PHYSMEMCFG)
+typedef struct MemcfgReg MemcfgReg;
+struct MemcfgReg {
+ ulong mdcnfg; /* DRAM config */
+ ulong mdcas0[3]; /* dram banks 0/1 */
+ ulong msc0; /* static memory or devices */
+ ulong msc1;
+ ulong mecr; /* expansion bus (pcmcia, CF) */
+ ulong mdrefr; /* dram refresh */
+ ulong mdcas2[3]; /* dram banks 2/3 */
+ ulong msc2; /* static memory or devices */
+ ulong smcnfg; /* SMROM config */
+};
+
+#define DMAREG(n) ((DmaReg*)(PHYSDMA+0x20*(n)))
+typedef struct DmaReg DmaReg;
+struct DmaReg {
+ ulong ddar; /* DMA device address */
+ ulong dcsr_s; /* set */
+ ulong dcsr_c; /* clear */
+ ulong dcsr; /* read */
+ struct {
+ ulong start;
+ ulong count;
+ } buf[2];
+};
+
+#define LCDREG ((LcdReg*)PHYSLCD)
+typedef struct LcdReg LcdReg;
+struct LcdReg {
+ ulong lccr0; /* control 0 */
+ ulong lcsr; /* status */
+ ulong rsvd[2];
+ ulong dbar1; /* DMA chan 1, base */
+ ulong dcar1; /* DMA chan 1, count */
+ ulong dbar2; /* DMA chan 2, base */
+ ulong dcar2; /* DMA chan 2, count */
+ ulong lccr1; /* control 1 */
+ ulong lccr2; /* control 2 */
+ ulong lccr3; /* control 3 */
+};
+
+/* Serial devices:
+ * 0 USB Serial Port 0
+ * 1 UART Serial Port 1
+ * 2 SDLC "
+ * 3 UART Serial Port 2 (eia1)
+ * 4 ICP/HSSP "
+ * 5 ICP/UART Serial Port 3 (eia0)
+ * 6 MPC Serial Port 4
+ * 7 SSP "
+ */
+
+#define USBREG ((UsbReg*)PHYSUSB)
+typedef struct UsbReg UsbReg;
+struct UsbReg {
+ ulong udccr; /* control */
+ ulong udcar; /* address */
+ ulong udcomp; /* out max packet */
+ ulong udcimp; /* in max packet */
+ ulong udccs0; /* endpoint 0 control/status */
+ ulong udccs1; /* endpoint 1(out) control/status */
+ ulong udccs2; /* endpoint 2(int) control/status */
+ ulong udcd0; /* endpoint 0 data register */
+ ulong udcwc; /* endpoint 0 write control register */
+ ulong rsvd1;
+ ulong udcdr; /* transmit/receive data register (FIFOs) */
+ ulong rsvd2;
+ ulong dcsr; /* status/interrupt register */
+};
+
+#define GPCLKREG ((GpclkReg*)PHYSGPCLK)
+typedef struct GpclkReg GpclkReg;
+struct GpclkReg {
+ ulong gpclkr0;
+ ulong rsvd[2];
+ ulong gpclkr1;
+ ulong gpclkr2;
+};
+
+/* UARTs 1, 2, 3 are mapped to serial devices 1, 3, and 5 */
+#define UARTREG(n) ((UartReg*)(PHYSSERIAL(2*(n)-1)))
+typedef struct UartReg UartReg;
+struct UartReg {
+ ulong utcr0; /* control 0 (bits, parity, clocks) */
+ ulong utcr1; /* control 1 (bps div hi) */
+ ulong utcr2; /* control 2 (bps div lo) */
+ ulong utcr3; /* control 3 */
+ ulong utcr4; /* control 4 (only serial port 2 (device 3)) */
+ ulong utdr; /* data */
+ ulong rsvd;
+ ulong utsr0; /* status 0 */
+ ulong utsr1; /* status 1 */
+};
+
+#define HSSPREG ((HsspReg*)(0x80040060))
+typedef struct HsspReg HsspReg;
+struct HsspReg {
+ ulong hscr0; /* control 0 */
+ ulong hscr1; /* control 1 */
+ ulong rsvd1;
+ ulong hsdr; /* data */
+ ulong rsvd2;
+ ulong hssr0; /* status 0 */
+ ulong hssr1; /* status 1 */
+};
+
+#define MCPREG ((McpReg*)(PHYSMCP))
+typedef struct McpReg McpReg;
+struct McpReg {
+ ulong mccr;
+ ulong rsvd1;
+ ulong mcdr0;
+ ulong mcdr1;
+ ulong mcdr2;
+ ulong rsvd2;
+ ulong mcsr;
+};
+
+enum {
+ MCCR_M_LBM= 0x800000,
+ MCCR_M_ARM= 0x400000,
+ MCCR_M_ATM= 0x200000,
+ MCCR_M_TRM= 0x100000,
+ MCCR_M_TTM= 0x080000,
+ MCCR_M_ADM= 0x040000,
+ MCCR_M_ECS= 0x020000,
+ MCCR_M_MCE= 0x010000,
+ MCCR_V_TSD= 8,
+ MCCR_V_ASD= 0,
+
+ MCDR2_M_nRW= 0x010000,
+ MCDR2_V_RN= 17,
+
+ MCSR_M_TCE= 0x8000,
+ MCSR_M_ACE= 0X4000,
+ MCSR_M_CRC= 0x2000,
+ MCSR_M_CWC= 0x1000,
+ MCSR_M_TNE= 0x0800,
+ MCSR_M_TNF= 0x0400,
+ MCSR_M_ANE= 0x0200,
+ MCSR_M_ANF= 0x0100,
+ MCSR_M_TRO= 0x0080,
+ MCSR_M_TTU= 0x0040,
+ MCSR_M_ARO= 0x0020,
+ MCSR_M_ATU= 0x0010,
+ MCSR_M_TRS= 0x0008,
+ MCSR_M_TTS= 0x0004,
+ MCSR_M_ARS= 0x0002,
+ MCSR_M_ATS= 0x0001,
+};
+
+#define SSPREG ((SspReg*)PHYSSSP)
+typedef struct SspReg SspReg;
+struct SspReg {
+ ulong sscr0; /* control 0 */
+ ulong sscr1; /* control 1 */
+ ulong rsvd1;
+ ulong ssdr; /* data */
+ ulong rsvd2;
+ ulong sssr; /* status */
+};
+
+enum {
+ SSCR0_V_SCR= 0x08,
+ SSCR0_V_SSE= 0x07,
+ SSCR0_V_ECS= 0x06,
+ SSCR0_V_FRF= 0x04,
+
+ SSPCR0_M_DSS= 0x0000000F,
+ SSPCR0_M_FRF= 0x00000030,
+ SSPCR0_M_SSE= 0x00000080,
+ SSPCR0_M_SCR= 0x0000FF00,
+ SSPCR0_V_DSS= 0,
+ SSPCR0_V_FRF= 4,
+ SSPCR0_V_SSE= 7,
+ SSPCR0_V_SCR= 8,
+
+ SSPCR1_M_RIM= 0x00000001,
+ SSPCR1_M_TIN= 0x00000002,
+ SSPCR1_M_LBM= 0x00000004,
+ SSPCR1_V_RIM= 0,
+ SSPCR1_V_TIN= 1,
+ SSPCR1_V_LBM= 2,
+
+ SSPSR_M_TNF= 0x00000002,
+ SSPSR_M_RNE= 0x00000004,
+ SSPSR_M_BSY= 0x00000008,
+ SSPSR_M_TFS= 0x00000010,
+ SSPSR_M_RFS= 0x00000020,
+ SSPSR_M_ROR= 0x00000040,
+ SSPSR_V_TNF= 1,
+ SSPSR_V_RNE= 2,
+ SSPSR_V_BSY= 3,
+ SSPSR_V_TFS= 4,
+ SSPSR_V_RFS= 5,
+ SSPSR_V_ROR= 6,
+};
+
+#define PPCREG ((PpcReg*)PHYSPPC)
+typedef struct PpcReg PpcReg;
+struct PpcReg {
+ ulong ppdr; /* pin direction */
+ ulong ppsr; /* pin state */
+ ulong ppar; /* pin assign */
+ ulong psdr; /* sleep mode */
+ ulong ppfr; /* pin flag reg */
+ uchar rsvd[0x1c]; /* pad to 0x30 */
+ ulong mccr1; /* MCP control register 1 */
+};
+
+enum {
+ /* ppdr and ppsr: =0, pin is general-purpose input; =1, pin is general-purpose output (11-168)*/
+ PPC_LDD0_7= 0xFF<<0, /* LCD data pins 0 to 7 */
+ PPC_L_PCLK= 1<<8, /* LCD pixel clock */
+ PPC_L_LCLK= 1<<9, /* LCD line clock */
+ PPC_L_FCLK= 1<<10, /* LCD frame clock */
+ PPC_L_BIAS= 1<<11, /* LCD AC bias */
+ PPC_TXD1= 1<<12, /* serial port 1 UART transmit */
+ PPC_RXD1= 1<<13, /* serial port 1 UART receive */
+ PPC_TXD2= 1<<14, /* serial port 2 IPC transmit */
+ PPC_RXD2= 1<<15, /* serial port 2 IPC receive */
+ PPC_TXD3= 1<<16, /* serial port 3 UART transmit */
+ PPC_RXD3= 1<<17, /* serial port 3 UART receive */
+ PPC_TXD4= 1<<18, /* serial port 4 MCP/SSP transmit */
+ PPC_RXD4= 1<<19, /* serial port 4 MCP/SSP receive */
+ PPC_SCLK= 1<<20, /* serial port 4 MCP/SSP serial clock */
+ PPC_SFRM= 1<<21, /* serial port 4 MCP/SSP frame clock */
+
+ PPAR_UPR= 1<<12, /* =1, serial port 1 GPCLK/UART pins reassigned */
+ PPAR_SPR= 1<<18, /* =1, SSP pins reassigned */
+};
+
+/*
+ * Irq Bus goo
+ */
+
+enum {
+ BusCPU= 1,
+ BusGPIOfalling= 2, /* falling edge */
+ BusGPIOrising = 3, /* rising edge */
+ BusGPIOboth = 4, /* both edges */
+ BusMAX= 4,
+ BUSUNKNOWN= -1,
+};
+
+enum {
+ /* DMA configuration parameters */
+
+ /* DMA Direction */
+ DmaOUT= 0,
+ DmaIN= 1,
+
+ /* dma endianess */
+ DmaLittle= 0,
+ DmaBig= 1,
+
+ /* dma devices */
+ DmaUDC= 0,
+ DmaSDLC= 2,
+ DmaUART0= 4,
+ DmaHSSP= 6,
+ DmaUART1= 7, /* special case (is really 6) */
+ DmaUART2= 8,
+ DmaMCPaudio= 10,
+ DmaMCPtelecom= 12,
+ DmaSSP= 14,
+};
+
+/*
+ * Interface to platform-specific PCMCIA signals, in arch*.c
+ */
+enum {
+ /* argument to pcmpin() */
+ PCMready,
+ PCMeject,
+ PCMstschng,
+};
+
+/*
+ * PCMCIA structures known by both port/cis.c and the pcmcia driver
+ */
+
+/*
+ * Map between ISA memory space and PCMCIA card memory space.
+ */
+struct PCMmap {
+ ulong ca; /* card address */
+ ulong cea; /* card end address */
+ ulong isa; /* local virtual address */
+ int len; /* length of the ISA area */
+ int attr; /* attribute memory */
+};
+
+/*
+ * a PCMCIA configuration entry
+ */
+struct PCMconftab
+{
+ int index;
+ ushort irqs; /* legal irqs */
+ uchar irqtype;
+ uchar bit16; /* true for 16 bit access */
+ struct {
+ ulong start;
+ ulong len;
+ } io[16];
+ int nio;
+ uchar vpp1;
+ uchar vpp2;
+ uchar memwait;
+ ulong maxwait;
+ ulong readywait;
+ ulong otherwait;
+};
+
+/*
+ * PCMCIA card slot
+ */
+struct PCMslot
+{
+ RWlock;
+
+ Ref ref;
+
+ long memlen; /* memory length */
+ uchar slotno; /* slot number */
+ void *regs; /* i/o registers */
+ void *mem; /* memory */
+ void *attr; /* attribute memory */
+
+ /* status */
+ uchar occupied; /* card in the slot */
+ uchar configed; /* card configured */
+ uchar busy;
+ uchar powered;
+ uchar battery;
+ uchar wrprot;
+ uchar enabled;
+ uchar special;
+ uchar dsize;
+
+ /* cis info */
+ int cisread; /* set when the cis has been read */
+ char verstr[512]; /* version string */
+ int ncfg; /* number of configurations */
+ struct {
+ ushort cpresent; /* config registers present */
+ ulong caddr; /* relative address of config registers */
+ } cfg[8];
+ int nctab; /* number of config table entries */
+ PCMconftab ctab[8];
+ PCMconftab *def; /* default conftab */
+
+ /* maps are fixed */
+ PCMmap memmap;
+ PCMmap attrmap;
+};