1/*
2 * Register definitions for the m88alp01 camera interface.  Offsets in bytes
3 * as given in the spec.
4 *
5 * Copyright 2006 One Laptop Per Child Association, Inc.
6 *
7 * Written by Jonathan Corbet, corbet@lwn.net.
8 *
9 * This file may be distributed under the terms of the GNU General
10 * Public License, version 2.
11 */
12#define REG_Y0BAR	0x00
13#define REG_Y1BAR	0x04
14#define REG_Y2BAR	0x08
15/* ... */
16
17#define REG_IMGPITCH	0x24	/* Image pitch register */
18#define   IMGP_YP_SHFT	  2		/* Y pitch params */
19#define   IMGP_YP_MASK	  0x00003ffc	/* Y pitch field */
20#define	  IMGP_UVP_SHFT	  18		/* UV pitch (planar) */
21#define   IMGP_UVP_MASK   0x3ffc0000
22#define REG_IRQSTATRAW	0x28	/* RAW IRQ Status */
23#define   IRQ_EOF0	  0x00000001	/* End of frame 0 */
24#define   IRQ_EOF1	  0x00000002	/* End of frame 1 */
25#define   IRQ_EOF2	  0x00000004	/* End of frame 2 */
26#define   IRQ_SOF0	  0x00000008	/* Start of frame 0 */
27#define   IRQ_SOF1	  0x00000010	/* Start of frame 1 */
28#define   IRQ_SOF2	  0x00000020	/* Start of frame 2 */
29#define   IRQ_OVERFLOW	  0x00000040	/* FIFO overflow */
30#define   IRQ_TWSIW	  0x00010000	/* TWSI (smbus) write */
31#define   IRQ_TWSIR	  0x00020000	/* TWSI read */
32#define   IRQ_TWSIE	  0x00040000	/* TWSI error */
33#define   TWSIIRQS (IRQ_TWSIW|IRQ_TWSIR|IRQ_TWSIE)
34#define   FRAMEIRQS (IRQ_EOF0|IRQ_EOF1|IRQ_EOF2|IRQ_SOF0|IRQ_SOF1|IRQ_SOF2)
35#define   ALLIRQS (TWSIIRQS|FRAMEIRQS|IRQ_OVERFLOW)
36#define REG_IRQMASK	0x2c	/* IRQ mask - same bits as IRQSTAT */
37#define REG_IRQSTAT	0x30	/* IRQ status / clear */
38
39#define REG_IMGSIZE	0x34	/* Image size */
40#define  IMGSZ_V_MASK	  0x1fff0000
41#define  IMGSZ_V_SHIFT	  16
42#define	 IMGSZ_H_MASK	  0x00003fff
43#define REG_IMGOFFSET	0x38	/* IMage offset */
44
45#define REG_CTRL0	0x3c	/* Control 0 */
46#define   C0_ENABLE	  0x00000001	/* Makes the whole thing go */
47
48/* Mask for all the format bits */
49#define   C0_DF_MASK	  0x00fffffc    /* Bits 2-23 */
50
51/* RGB ordering */
52#define   C0_RGB4_RGBX	  0x00000000
53#define	  C0_RGB4_XRGB	  0x00000004
54#define	  C0_RGB4_BGRX	  0x00000008
55#define   C0_RGB4_XBGR	  0x0000000c
56#define   C0_RGB5_RGGB	  0x00000000
57#define	  C0_RGB5_GRBG	  0x00000004
58#define	  C0_RGB5_GBRG	  0x00000008
59#define   C0_RGB5_BGGR	  0x0000000c
60
61/* Spec has two fields for DIN and DOUT, but they must match, so
62   combine them here. */
63#define   C0_DF_YUV	  0x00000000    /* Data is YUV	    */
64#define   C0_DF_RGB	  0x000000a0	/* ... RGB		    */
65#define   C0_DF_BAYER     0x00000140	/* ... Bayer                */
66/* 8-8-8 must be missing from the below - ask */
67#define   C0_RGBF_565	  0x00000000
68#define   C0_RGBF_444	  0x00000800
69#define   C0_RGB_BGR	  0x00001000	/* Blue comes first */
70#define   C0_YUV_PLANAR	  0x00000000	/* YUV 422 planar format */
71#define   C0_YUV_PACKED	  0x00008000	/* YUV 422 packed	*/
72#define   C0_YUV_420PL	  0x0000a000	/* YUV 420 planar	*/
73/* Think that 420 packed must be 111 - ask */
74#define	  C0_YUVE_YUYV	  0x00000000	/* Y1CbY0Cr 		*/
75#define	  C0_YUVE_YVYU	  0x00010000	/* Y1CrY0Cb 		*/
76#define	  C0_YUVE_VYUY	  0x00020000	/* CrY1CbY0 		*/
77#define	  C0_YUVE_UYVY	  0x00030000	/* CbY1CrY0 		*/
78#define   C0_YUVE_XYUV	  0x00000000    /* 420: .YUV		*/
79#define	  C0_YUVE_XYVU	  0x00010000	/* 420: .YVU 		*/
80#define	  C0_YUVE_XUVY	  0x00020000	/* 420: .UVY 		*/
81#define	  C0_YUVE_XVUY	  0x00030000	/* 420: .VUY 		*/
82/* Bayer bits 18,19 if needed */
83#define   C0_HPOL_LOW	  0x01000000	/* HSYNC polarity active low */
84#define   C0_VPOL_LOW	  0x02000000	/* VSYNC polarity active low */
85#define   C0_VCLK_LOW	  0x04000000	/* VCLK on falling edge */
86#define   C0_DOWNSCALE	  0x08000000	/* Enable downscaler */
87#define	  C0_SIFM_MASK	  0xc0000000	/* SIF mode bits */
88#define   C0_SIF_HVSYNC	  0x00000000	/* Use H/VSYNC */
89#define   CO_SOF_NOSYNC	  0x40000000	/* Use inband active signaling */
90
91
92#define REG_CTRL1	0x40	/* Control 1 */
93#define   C1_444ALPHA	  0x00f00000	/* Alpha field in RGB444 */
94#define   C1_ALPHA_SHFT	  20
95#define   C1_DMAB32	  0x00000000	/* 32-byte DMA burst */
96#define   C1_DMAB16	  0x02000000	/* 16-byte DMA burst */
97#define	  C1_DMAB64	  0x04000000	/* 64-byte DMA burst */
98#define	  C1_DMAB_MASK	  0x06000000
99#define   C1_TWOBUFS	  0x08000000	/* Use only two DMA buffers */
100#define   C1_PWRDWN	  0x10000000	/* Power down */
101
102#define REG_CLKCTRL	0x88	/* Clock control */
103#define   CLK_DIV_MASK	  0x0000ffff	/* Upper bits RW "reserved" */
104
105#define REG_GPR		0xb4	/* General purpose register.  This
106				   controls inputs to the power and reset
107				   pins on the OV7670 used with OLPC;
108				   other deployments could differ.  */
109#define   GPR_C1EN	  0x00000020	/* Pad 1 (power down) enable */
110#define   GPR_C0EN	  0x00000010	/* Pad 0 (reset) enable */
111#define	  GPR_C1	  0x00000002	/* Control 1 value */
112/*
113 * Control 0 is wired to reset on OLPC machines.  For ov7x sensors,
114 * it is active low, for 0v6x, instead, it's active high.  What
115 * fun.
116 */
117#define   GPR_C0	  0x00000001	/* Control 0 value */
118
119#define REG_TWSIC0	0xb8	/* TWSI (smbus) control 0 */
120#define   TWSIC0_EN       0x00000001	/* TWSI enable */
121#define   TWSIC0_MODE	  0x00000002	/* 1 = 16-bit, 0 = 8-bit */
122#define   TWSIC0_SID	  0x000003fc	/* Slave ID */
123#define   TWSIC0_SID_SHIFT 2
124#define   TWSIC0_CLKDIV   0x0007fc00	/* Clock divider */
125#define   TWSIC0_MASKACK  0x00400000	/* Mask ack from sensor */
126#define   TWSIC0_OVMAGIC  0x00800000	/* Make it work on OV sensors */
127
128#define REG_TWSIC1	0xbc	/* TWSI control 1 */
129#define   TWSIC1_DATA	  0x0000ffff	/* Data to/from camchip */
130#define   TWSIC1_ADDR	  0x00ff0000	/* Address (register) */
131#define   TWSIC1_ADDR_SHIFT 16
132#define   TWSIC1_READ	  0x01000000	/* Set for read op */
133#define   TWSIC1_WSTAT	  0x02000000	/* Write status */
134#define   TWSIC1_RVALID	  0x04000000	/* Read data valid */
135#define   TWSIC1_ERROR	  0x08000000	/* Something screwed up */
136
137
138#define REG_UBAR	0xc4	/* Upper base address register */
139
140/*
141 * Here's the weird global control registers which are said to live
142 * way up here.
143 */
144#define REG_GL_CSR     0x3004  /* Control/status register */
145#define   GCSR_SRS	 0x00000001	/* SW Reset set */
146#define   GCSR_SRC  	 0x00000002	/* SW Reset clear */
147#define	  GCSR_MRS	 0x00000004	/* Master reset set */
148#define	  GCSR_MRC	 0x00000008	/* HW Reset clear */
149#define   GCSR_CCIC_EN   0x00004000    /* CCIC Clock enable */
150#define REG_GL_IMASK   0x300c  /* Interrupt mask register */
151#define   GIMSK_CCIC_EN          0x00000004    /* CCIC Interrupt enable */
152
153#define REG_GL_FCR	0x3038  /* GPIO functional control register */
154#define	  GFCR_GPIO_ON	  0x08		/* Camera GPIO enabled */
155#define REG_GL_GPIOR	0x315c	/* GPIO register */
156#define   GGPIO_OUT  		0x80000	/* GPIO output */
157#define   GGPIO_VAL  		0x00008	/* Output pin value */
158
159#define REG_LEN                REG_GL_IMASK + 4
160
161
162/*
163 * Useful stuff that probably belongs somewhere global.
164 */
165#define VGA_WIDTH	640
166#define VGA_HEIGHT	480
167