summaryrefslogtreecommitdiffstats
path: root/Documentation/fb/pxafb.rst
blob: 90177f5e7e76888605b0c09b4e7302d825256702 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
================================
Driver for PXA25x LCD controller
================================

The driver supports the following options, either via
options=<OPTIONS> when modular or video=pxafb:<OPTIONS> when built in.

For example::

	modprobe pxafb options=vmem:2M,mode:640x480-8,passive

or on the kernel command line::

	video=pxafb:vmem:2M,mode:640x480-8,passive

vmem: VIDEO_MEM_SIZE

	Amount of video memory to allocate (can be suffixed with K or M
	for kilobytes or megabytes)

mode:XRESxYRES[-BPP]

	XRES == LCCR1_PPL + 1

	YRES == LLCR2_LPP + 1

		The resolution of the display in pixels

	BPP == The bit depth. Valid values are 1, 2, 4, 8 and 16.

pixclock:PIXCLOCK

	Pixel clock in picoseconds

left:LEFT == LCCR1_BLW + 1

right:RIGHT == LCCR1_ELW + 1

hsynclen:HSYNC == LCCR1_HSW + 1

upper:UPPER == LCCR2_BFW

lower:LOWER == LCCR2_EFR

vsynclen:VSYNC == LCCR2_VSW + 1

	Display margins and sync times

color | mono => LCCR0_CMS

	umm...

active | passive => LCCR0_PAS

	Active (TFT) or Passive (STN) display

single | dual => LCCR0_SDS

	Single or dual panel passive display

4pix | 8pix => LCCR0_DPD

	4 or 8 pixel monochrome single panel data

hsync:HSYNC, vsync:VSYNC

	Horizontal and vertical sync. 0 => active low, 1 => active
	high.

dpc:DPC

	Double pixel clock. 1=>true, 0=>false

outputen:POLARITY

	Output Enable Polarity. 0 => active low, 1 => active high

pixclockpol:POLARITY

	pixel clock polarity
	0 => falling edge, 1 => rising edge


Overlay Support for PXA27x and later LCD controllers
====================================================

  PXA27x and later processors support overlay1 and overlay2 on-top of the
  base framebuffer (although under-neath the base is also possible). They
  support palette and no-palette RGB formats, as well as YUV formats (only
  available on overlay2). These overlays have dedicated DMA channels and
  behave in a similar way as a framebuffer.

  However, there are some differences between these overlay framebuffers
  and normal framebuffers, as listed below:

  1. overlay can start at a 32-bit word aligned position within the base
     framebuffer, which means they have a start (x, y). This information
     is encoded into var->nonstd (no, var->xoffset and var->yoffset are
     not for such purpose).

  2. overlay framebuffer is allocated dynamically according to specified
     'struct fb_var_screeninfo', the amount is decided by::

	var->xres_virtual * var->yres_virtual * bpp

     bpp = 16 -- for RGB565 or RGBT555

     bpp = 24 -- for YUV444 packed

     bpp = 24 -- for YUV444 planar

     bpp = 16 -- for YUV422 planar (1 pixel = 1 Y + 1/2 Cb + 1/2 Cr)

     bpp = 12 -- for YUV420 planar (1 pixel = 1 Y + 1/4 Cb + 1/4 Cr)

     NOTE:

     a. overlay does not support panning in x-direction, thus
	var->xres_virtual will always be equal to var->xres

     b. line length of overlay(s) must be on a 32-bit word boundary,
	for YUV planar modes, it is a requirement for the component
	with minimum bits per pixel,  e.g. for YUV420, Cr component
	for one pixel is actually 2-bits, it means the line length
	should be a multiple of 16-pixels

     c. starting horizontal position (XPOS) should start on a 32-bit
	word boundary, otherwise the fb_check_var() will just fail.

     d. the rectangle of the overlay should be within the base plane,
	otherwise fail

     Applications should follow the sequence below to operate an overlay
     framebuffer:

	 a. open("/dev/fb[1-2]", ...)
	 b. ioctl(fd, FBIOGET_VSCREENINFO, ...)
	 c. modify 'var' with desired parameters:

	    1) var->xres and var->yres
	    2) larger var->yres_virtual if more memory is required,
	       usually for double-buffering
	    3) var->nonstd for starting (x, y) and color format
	    4) var->{red, green, blue, transp} if RGB mode is to be used

	 d. ioctl(fd, FBIOPUT_VSCREENINFO, ...)
	 e. ioctl(fd, FBIOGET_FSCREENINFO, ...)
	 f. mmap
	 g. ...

  3. for YUV planar formats, these are actually not supported within the
     framebuffer framework, application has to take care of the offsets
     and lengths of each component within the framebuffer.

  4. var->nonstd is used to pass starting (x, y) position and color format,
     the detailed bit fields are shown below::

      31                23  20         10          0
       +-----------------+---+----------+----------+
       |  ... unused ... |FOR|   XPOS   |   YPOS   |
       +-----------------+---+----------+----------+

     FOR  - color format, as defined by OVERLAY_FORMAT_* in pxafb.h

	  - 0 - RGB
	  - 1 - YUV444 PACKED
	  - 2 - YUV444 PLANAR
	  - 3 - YUV422 PLANAR
	  - 4 - YUR420 PLANAR

     XPOS - starting horizontal position

     YPOS - starting vertical position