2 * Silicon Motion SM7XX 2D drawing engine functions.
4 * Copyright (C) 2006 Silicon Motion Technology Corp.
5 * Author: Boyod boyod.yang@siliconmotion.com.cn
7 * Copyright (C) 2009 Lemote, Inc.
8 * Author: Wu Zhangjin, wuzhangjin@gmail.com
10 * This file is subject to the terms and conditions of the GNU General Public
11 * License. See the file COPYING in the main directory of this archive for
14 * Version 0.10.26192.21.01
15 * - Add PowerPC support
16 * - Add 2D support for Lynx -
17 * Verified on 2.6.19.2
18 * Boyod.yang <boyod.yang@siliconmotion.com.cn>
21 unsigned char smtc_de_busy
;
23 void SMTC_write2Dreg(unsigned long nOffset
, unsigned long nData
)
25 writel(nData
, smtc_2DBaseAddress
+ nOffset
);
28 unsigned long SMTC_read2Dreg(unsigned long nOffset
)
30 return readl(smtc_2DBaseAddress
+ nOffset
);
33 void SMTC_write2Ddataport(unsigned long nOffset
, unsigned long nData
)
35 writel(nData
, smtc_2Ddataport
+ nOffset
);
38 /**********************************************************************
43 * Drawing engine initialization.
45 **********************************************************************/
47 void deInit(unsigned int nModeWidth
, unsigned int nModeHeight
,
50 /* Get current power configuration. */
52 clock
= smtc_seqr(0x21);
54 /* initialize global 'mutex lock' variable */
57 /* Enable 2D Drawing Engine */
58 smtc_seqw(0x21, clock
& 0xF8);
60 SMTC_write2Dreg(DE_CLIP_TL
,
61 FIELD_VALUE(0, DE_CLIP_TL
, TOP
, 0) |
62 FIELD_SET(0, DE_CLIP_TL
, STATUS
, DISABLE
) |
63 FIELD_SET(0, DE_CLIP_TL
, INHIBIT
, OUTSIDE
) |
64 FIELD_VALUE(0, DE_CLIP_TL
, LEFT
, 0));
67 SMTC_write2Dreg(DE_PITCH
,
68 FIELD_VALUE(0, DE_PITCH
, DESTINATION
,
69 nModeWidth
* 3) | FIELD_VALUE(0,
75 SMTC_write2Dreg(DE_PITCH
,
76 FIELD_VALUE(0, DE_PITCH
, DESTINATION
,
77 nModeWidth
) | FIELD_VALUE(0,
83 SMTC_write2Dreg(DE_WINDOW_WIDTH
,
84 FIELD_VALUE(0, DE_WINDOW_WIDTH
, DESTINATION
,
85 nModeWidth
) | FIELD_VALUE(0,
92 SMTC_write2Dreg(DE_STRETCH_FORMAT
,
93 FIELD_SET(0, DE_STRETCH_FORMAT
, PATTERN_XY
,
94 NORMAL
) | FIELD_VALUE(0,
98 FIELD_VALUE(0, DE_STRETCH_FORMAT
, PATTERN_X
,
99 0) | FIELD_SET(0, DE_STRETCH_FORMAT
,
105 FIELD_VALUE(0, DE_STRETCH_FORMAT
,
109 SMTC_write2Dreg(DE_STRETCH_FORMAT
,
110 FIELD_SET(0, DE_STRETCH_FORMAT
, PATTERN_XY
,
111 NORMAL
) | FIELD_VALUE(0,
115 FIELD_VALUE(0, DE_STRETCH_FORMAT
, PATTERN_X
,
116 0) | FIELD_SET(0, DE_STRETCH_FORMAT
,
122 FIELD_VALUE(0, DE_STRETCH_FORMAT
,
127 SMTC_write2Dreg(DE_STRETCH_FORMAT
,
128 FIELD_SET(0, DE_STRETCH_FORMAT
, PATTERN_XY
,
129 NORMAL
) | FIELD_VALUE(0,
133 FIELD_VALUE(0, DE_STRETCH_FORMAT
, PATTERN_X
,
134 0) | FIELD_SET(0, DE_STRETCH_FORMAT
,
140 FIELD_VALUE(0, DE_STRETCH_FORMAT
,
145 SMTC_write2Dreg(DE_MASKS
,
146 FIELD_VALUE(0, DE_MASKS
, BYTE_MASK
, 0xFFFF) |
147 FIELD_VALUE(0, DE_MASKS
, BIT_MASK
, 0xFFFF));
148 SMTC_write2Dreg(DE_COLOR_COMPARE_MASK
,
149 FIELD_VALUE(0, DE_COLOR_COMPARE_MASK
, MASKS
, \
151 SMTC_write2Dreg(DE_COLOR_COMPARE
,
152 FIELD_VALUE(0, DE_COLOR_COMPARE
, COLOR
, 0xFFFFFF));
155 void deVerticalLine(unsigned long dst_base
,
156 unsigned long dst_pitch
,
159 unsigned long dst_height
, unsigned long nColor
)
163 SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE
,
164 FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE
, ADDRESS
,
167 SMTC_write2Dreg(DE_PITCH
,
168 FIELD_VALUE(0, DE_PITCH
, DESTINATION
, dst_pitch
) |
169 FIELD_VALUE(0, DE_PITCH
, SOURCE
, dst_pitch
));
171 SMTC_write2Dreg(DE_WINDOW_WIDTH
,
172 FIELD_VALUE(0, DE_WINDOW_WIDTH
, DESTINATION
,
173 dst_pitch
) | FIELD_VALUE(0, DE_WINDOW_WIDTH
,
177 SMTC_write2Dreg(DE_FOREGROUND
,
178 FIELD_VALUE(0, DE_FOREGROUND
, COLOR
, nColor
));
180 SMTC_write2Dreg(DE_DESTINATION
,
181 FIELD_SET(0, DE_DESTINATION
, WRAP
, DISABLE
) |
182 FIELD_VALUE(0, DE_DESTINATION
, X
, nX
) |
183 FIELD_VALUE(0, DE_DESTINATION
, Y
, nY
));
185 SMTC_write2Dreg(DE_DIMENSION
,
186 FIELD_VALUE(0, DE_DIMENSION
, X
, 1) |
187 FIELD_VALUE(0, DE_DIMENSION
, Y_ET
, dst_height
));
189 SMTC_write2Dreg(DE_CONTROL
,
190 FIELD_SET(0, DE_CONTROL
, STATUS
, START
) |
191 FIELD_SET(0, DE_CONTROL
, DIRECTION
, LEFT_TO_RIGHT
) |
192 FIELD_SET(0, DE_CONTROL
, MAJOR
, Y
) |
193 FIELD_SET(0, DE_CONTROL
, STEP_X
, NEGATIVE
) |
194 FIELD_SET(0, DE_CONTROL
, STEP_Y
, POSITIVE
) |
195 FIELD_SET(0, DE_CONTROL
, LAST_PIXEL
, OFF
) |
196 FIELD_SET(0, DE_CONTROL
, COMMAND
, SHORT_STROKE
) |
197 FIELD_SET(0, DE_CONTROL
, ROP_SELECT
, ROP2
) |
198 FIELD_VALUE(0, DE_CONTROL
, ROP
, 0x0C));
203 void deHorizontalLine(unsigned long dst_base
,
204 unsigned long dst_pitch
,
207 unsigned long dst_width
, unsigned long nColor
)
211 SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE
,
212 FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE
, ADDRESS
,
215 SMTC_write2Dreg(DE_PITCH
,
216 FIELD_VALUE(0, DE_PITCH
, DESTINATION
, dst_pitch
) |
217 FIELD_VALUE(0, DE_PITCH
, SOURCE
, dst_pitch
));
219 SMTC_write2Dreg(DE_WINDOW_WIDTH
,
220 FIELD_VALUE(0, DE_WINDOW_WIDTH
, DESTINATION
,
221 dst_pitch
) | FIELD_VALUE(0, DE_WINDOW_WIDTH
,
224 SMTC_write2Dreg(DE_FOREGROUND
,
225 FIELD_VALUE(0, DE_FOREGROUND
, COLOR
, nColor
));
226 SMTC_write2Dreg(DE_DESTINATION
,
227 FIELD_SET(0, DE_DESTINATION
, WRAP
,
228 DISABLE
) | FIELD_VALUE(0, DE_DESTINATION
, X
,
233 SMTC_write2Dreg(DE_DIMENSION
,
234 FIELD_VALUE(0, DE_DIMENSION
, X
,
235 dst_width
) | FIELD_VALUE(0, DE_DIMENSION
,
237 SMTC_write2Dreg(DE_CONTROL
,
238 FIELD_SET(0, DE_CONTROL
, STATUS
, START
) | FIELD_SET(0,
242 | FIELD_SET(0, DE_CONTROL
, MAJOR
, X
) | FIELD_SET(0,
246 | FIELD_SET(0, DE_CONTROL
, STEP_Y
,
247 NEGATIVE
) | FIELD_SET(0, DE_CONTROL
,
253 | FIELD_SET(0, DE_CONTROL
, ROP_SELECT
,
254 ROP2
) | FIELD_VALUE(0, DE_CONTROL
, ROP
,
260 void deLine(unsigned long dst_base
,
261 unsigned long dst_pitch
,
264 unsigned long nX2
, unsigned long nY2
, unsigned long nColor
)
266 unsigned long nCommand
=
267 FIELD_SET(0, DE_CONTROL
, STATUS
, START
) |
268 FIELD_SET(0, DE_CONTROL
, DIRECTION
, LEFT_TO_RIGHT
) |
269 FIELD_SET(0, DE_CONTROL
, MAJOR
, X
) |
270 FIELD_SET(0, DE_CONTROL
, STEP_X
, POSITIVE
) |
271 FIELD_SET(0, DE_CONTROL
, STEP_Y
, POSITIVE
) |
272 FIELD_SET(0, DE_CONTROL
, LAST_PIXEL
, OFF
) |
273 FIELD_SET(0, DE_CONTROL
, ROP_SELECT
, ROP2
) |
274 FIELD_VALUE(0, DE_CONTROL
, ROP
, 0x0C);
275 unsigned long DeltaX
;
276 unsigned long DeltaY
;
278 /* Calculate delta X */
283 nCommand
= FIELD_SET(nCommand
, DE_CONTROL
, STEP_X
, NEGATIVE
);
286 /* Calculate delta Y */
291 nCommand
= FIELD_SET(nCommand
, DE_CONTROL
, STEP_Y
, NEGATIVE
);
294 /* Determine the major axis */
296 nCommand
= FIELD_SET(nCommand
, DE_CONTROL
, MAJOR
, Y
);
300 deVerticalLine(dst_base
, dst_pitch
, nX1
, nY1
, DeltaY
, nColor
);
302 /* Horizontal line? */
304 deHorizontalLine(dst_base
, dst_pitch
, nX1
, nY1
, \
308 else if (DeltaX
== DeltaY
) {
311 SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE
,
312 FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE
,
315 SMTC_write2Dreg(DE_PITCH
,
316 FIELD_VALUE(0, DE_PITCH
, DESTINATION
,
317 dst_pitch
) | FIELD_VALUE(0,
322 SMTC_write2Dreg(DE_WINDOW_WIDTH
,
323 FIELD_VALUE(0, DE_WINDOW_WIDTH
, DESTINATION
,
324 dst_pitch
) | FIELD_VALUE(0,
329 SMTC_write2Dreg(DE_FOREGROUND
,
330 FIELD_VALUE(0, DE_FOREGROUND
, COLOR
, nColor
));
332 SMTC_write2Dreg(DE_DESTINATION
,
333 FIELD_SET(0, DE_DESTINATION
, WRAP
, DISABLE
) |
334 FIELD_VALUE(0, DE_DESTINATION
, X
, 1) |
335 FIELD_VALUE(0, DE_DESTINATION
, Y
, nY1
));
337 SMTC_write2Dreg(DE_DIMENSION
,
338 FIELD_VALUE(0, DE_DIMENSION
, X
, 1) |
339 FIELD_VALUE(0, DE_DIMENSION
, Y_ET
, DeltaX
));
341 SMTC_write2Dreg(DE_CONTROL
,
342 FIELD_SET(nCommand
, DE_CONTROL
, COMMAND
,
348 unsigned int k1
, k2
, et
, w
;
349 if (DeltaX
< DeltaY
) {
363 SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE
,
364 FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE
,
367 SMTC_write2Dreg(DE_PITCH
,
368 FIELD_VALUE(0, DE_PITCH
, DESTINATION
,
369 dst_pitch
) | FIELD_VALUE(0,
374 SMTC_write2Dreg(DE_WINDOW_WIDTH
,
375 FIELD_VALUE(0, DE_WINDOW_WIDTH
, DESTINATION
,
376 dst_pitch
) | FIELD_VALUE(0,
381 SMTC_write2Dreg(DE_FOREGROUND
,
382 FIELD_VALUE(0, DE_FOREGROUND
, COLOR
, nColor
));
384 SMTC_write2Dreg(DE_SOURCE
,
385 FIELD_SET(0, DE_SOURCE
, WRAP
, DISABLE
) |
386 FIELD_VALUE(0, DE_SOURCE
, X_K1
, k1
) |
387 FIELD_VALUE(0, DE_SOURCE
, Y_K2
, k2
));
389 SMTC_write2Dreg(DE_DESTINATION
,
390 FIELD_SET(0, DE_DESTINATION
, WRAP
, DISABLE
) |
391 FIELD_VALUE(0, DE_DESTINATION
, X
, nX1
) |
392 FIELD_VALUE(0, DE_DESTINATION
, Y
, nY1
));
394 SMTC_write2Dreg(DE_DIMENSION
,
395 FIELD_VALUE(0, DE_DIMENSION
, X
, w
) |
396 FIELD_VALUE(0, DE_DIMENSION
, Y_ET
, et
));
398 SMTC_write2Dreg(DE_CONTROL
,
399 FIELD_SET(nCommand
, DE_CONTROL
, COMMAND
,
406 void deFillRect(unsigned long dst_base
,
407 unsigned long dst_pitch
,
410 unsigned long dst_width
,
411 unsigned long dst_height
, unsigned long nColor
)
415 SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE
,
416 FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE
, ADDRESS
,
420 SMTC_write2Dreg(DE_PITCH
,
421 FIELD_VALUE(0, DE_PITCH
, DESTINATION
,
422 dst_pitch
) | FIELD_VALUE(0,
427 SMTC_write2Dreg(DE_WINDOW_WIDTH
,
428 FIELD_VALUE(0, DE_WINDOW_WIDTH
, DESTINATION
,
429 dst_pitch
) | FIELD_VALUE(0,
435 SMTC_write2Dreg(DE_FOREGROUND
,
436 FIELD_VALUE(0, DE_FOREGROUND
, COLOR
, nColor
));
438 SMTC_write2Dreg(DE_DESTINATION
,
439 FIELD_SET(0, DE_DESTINATION
, WRAP
, DISABLE
) |
440 FIELD_VALUE(0, DE_DESTINATION
, X
, dst_X
) |
441 FIELD_VALUE(0, DE_DESTINATION
, Y
, dst_Y
));
443 SMTC_write2Dreg(DE_DIMENSION
,
444 FIELD_VALUE(0, DE_DIMENSION
, X
, dst_width
) |
445 FIELD_VALUE(0, DE_DIMENSION
, Y_ET
, dst_height
));
447 SMTC_write2Dreg(DE_CONTROL
,
448 FIELD_SET(0, DE_CONTROL
, STATUS
, START
) |
449 FIELD_SET(0, DE_CONTROL
, DIRECTION
, LEFT_TO_RIGHT
) |
450 FIELD_SET(0, DE_CONTROL
, LAST_PIXEL
, OFF
) |
451 FIELD_SET(0, DE_CONTROL
, COMMAND
, RECTANGLE_FILL
) |
452 FIELD_SET(0, DE_CONTROL
, ROP_SELECT
, ROP2
) |
453 FIELD_VALUE(0, DE_CONTROL
, ROP
, 0x0C));
458 /**********************************************************************
463 * Rotate the given pattern if necessary
467 * pPattern - Pointer to DE_SURFACE structure containing
469 * patternX - X position (0-7) of pattern origin
470 * patternY - Y position (0-7) of pattern origin
473 * pattern_dstaddr - Pointer to pre-allocated buffer containing
476 **********************************************************************/
477 void deRotatePattern(unsigned char *pattern_dstaddr
,
478 unsigned long pattern_src_addr
,
479 unsigned long pattern_BPP
,
480 unsigned long pattern_stride
, int patternX
, int patternY
)
483 unsigned long pattern
[PATTERN_WIDTH
* PATTERN_HEIGHT
];
485 unsigned char *pjPatByte
;
487 if (pattern_dstaddr
!= NULL
) {
490 if (patternX
|| patternY
) {
492 pjPatByte
= (unsigned char *)pattern
;
494 switch (pattern_BPP
) {
497 for (y
= 0; y
< 8; y
++) {
498 unsigned char *pjBuffer
=
500 ((patternY
+ y
) & 7) * 8;
501 for (x
= 0; x
< 8; x
++) {
506 pjPatByte
+= pattern_stride
;
513 for (y
= 0; y
< 8; y
++) {
514 unsigned short *pjBuffer
=
517 ((patternY
+ y
) & 7) * 8;
518 for (x
= 0; x
< 8; x
++) {
524 pjPatByte
+= pattern_stride
;
531 for (y
= 0; y
< 8; y
++) {
532 unsigned long *pjBuffer
=
535 ((patternY
+ y
) & 7) * 8;
536 for (x
= 0; x
< 8; x
++) {
542 pjPatByte
+= pattern_stride
;
548 /*Don't rotate,just copy pattern into pattern_dstaddr*/
549 for (i
= 0; i
< (pattern_BPP
* 2); i
++) {
550 ((unsigned long *)pattern_dstaddr
)[i
] =
558 /**********************************************************************
563 * Copy a rectangular area of the source surface to a destination surface
566 * Source bitmap must have the same color depth (BPP) as the destination
569 **********************************************************************/
570 void deCopy(unsigned long dst_base
,
571 unsigned long dst_pitch
,
572 unsigned long dst_BPP
,
575 unsigned long dst_width
,
576 unsigned long dst_height
,
577 unsigned long src_base
,
578 unsigned long src_pitch
,
580 unsigned long src_Y
, pTransparent pTransp
, unsigned char nROP2
)
582 unsigned long nDirection
= 0;
583 unsigned long nTransparent
= 0;
584 /* Direction of ROP2 operation:
586 * (-1) = Right to Left
588 unsigned long opSign
= 1;
589 /* xWidth is in pixels */
590 unsigned long xWidth
= 192 / (dst_BPP
/ 8);
591 unsigned long de_ctrl
= 0;
595 SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE
,
596 FIELD_VALUE(0, DE_WINDOW_DESTINATION_BASE
, ADDRESS
,
599 SMTC_write2Dreg(DE_WINDOW_SOURCE_BASE
,
600 FIELD_VALUE(0, DE_WINDOW_SOURCE_BASE
, ADDRESS
,
603 if (dst_pitch
&& src_pitch
) {
604 SMTC_write2Dreg(DE_PITCH
,
605 FIELD_VALUE(0, DE_PITCH
, DESTINATION
,
606 dst_pitch
) | FIELD_VALUE(0,
611 SMTC_write2Dreg(DE_WINDOW_WIDTH
,
612 FIELD_VALUE(0, DE_WINDOW_WIDTH
, DESTINATION
,
613 dst_pitch
) | FIELD_VALUE(0,
619 /* Set transparent bits if necessary */
620 if (pTransp
!= NULL
) {
622 pTransp
->match
| pTransp
->select
| pTransp
->control
;
624 /* Set color compare register */
625 SMTC_write2Dreg(DE_COLOR_COMPARE
,
626 FIELD_VALUE(0, DE_COLOR_COMPARE
, COLOR
,
630 /* Determine direction of operation */
641 nDirection
= BOTTOM_TO_TOP
;
642 } else if (src_Y
> dst_Y
) {
652 nDirection
= TOP_TO_BOTTOM
;
656 if (src_X
<= dst_X
) {
657 /* +------+---+------+
662 +------+---+------+ */
664 nDirection
= RIGHT_TO_LEFT
;
668 /* +------+---+------+
673 +------+---+------+ */
675 nDirection
= LEFT_TO_RIGHT
;
679 if ((nDirection
== BOTTOM_TO_TOP
) || (nDirection
== RIGHT_TO_LEFT
)) {
680 src_X
+= dst_width
- 1;
681 src_Y
+= dst_height
- 1;
682 dst_X
+= dst_width
- 1;
683 dst_Y
+= dst_height
- 1;
693 if ((nDirection
== BOTTOM_TO_TOP
)
694 || (nDirection
== RIGHT_TO_LEFT
)) {
700 /* Workaround for 192 byte hw bug */
701 if ((nROP2
!= 0x0C) && ((dst_width
* (dst_BPP
/ 8)) >= 192)) {
703 * Perform the ROP2 operation in chunks of (xWidth *
709 SMTC_write2Dreg(DE_SOURCE
,
710 FIELD_SET(0, DE_SOURCE
, WRAP
, DISABLE
) |
711 FIELD_VALUE(0, DE_SOURCE
, X_K1
, src_X
) |
712 FIELD_VALUE(0, DE_SOURCE
, Y_K2
, src_Y
));
714 SMTC_write2Dreg(DE_DESTINATION
,
715 FIELD_SET(0, DE_DESTINATION
, WRAP
,
716 DISABLE
) | FIELD_VALUE(0,
720 | FIELD_VALUE(0, DE_DESTINATION
, Y
,
723 SMTC_write2Dreg(DE_DIMENSION
,
724 FIELD_VALUE(0, DE_DIMENSION
, X
,
725 xWidth
) | FIELD_VALUE(0,
731 FIELD_VALUE(0, DE_CONTROL
, ROP
,
732 nROP2
) | nTransparent
| FIELD_SET(0,
736 | FIELD_SET(0, DE_CONTROL
, COMMAND
,
737 BITBLT
) | ((nDirection
==
742 : FIELD_SET(0, DE_CONTROL
,
745 FIELD_SET(0, DE_CONTROL
, STATUS
, START
);
747 SMTC_write2Dreg(DE_CONTROL
, de_ctrl
);
749 src_X
+= (opSign
* xWidth
);
750 dst_X
+= (opSign
* xWidth
);
753 if (dst_width
<= 0) {
754 /* ROP2 operation is complete */
758 if (xWidth
> dst_width
)
763 SMTC_write2Dreg(DE_SOURCE
,
764 FIELD_SET(0, DE_SOURCE
, WRAP
, DISABLE
) |
765 FIELD_VALUE(0, DE_SOURCE
, X_K1
, src_X
) |
766 FIELD_VALUE(0, DE_SOURCE
, Y_K2
, src_Y
));
768 SMTC_write2Dreg(DE_DESTINATION
,
769 FIELD_SET(0, DE_DESTINATION
, WRAP
, DISABLE
) |
770 FIELD_VALUE(0, DE_DESTINATION
, X
, dst_X
) |
771 FIELD_VALUE(0, DE_DESTINATION
, Y
, dst_Y
));
773 SMTC_write2Dreg(DE_DIMENSION
,
774 FIELD_VALUE(0, DE_DIMENSION
, X
, dst_width
) |
775 FIELD_VALUE(0, DE_DIMENSION
, Y_ET
, dst_height
));
777 de_ctrl
= FIELD_VALUE(0, DE_CONTROL
, ROP
, nROP2
) |
779 FIELD_SET(0, DE_CONTROL
, ROP_SELECT
, ROP2
) |
780 FIELD_SET(0, DE_CONTROL
, COMMAND
, BITBLT
) |
781 ((nDirection
== 1) ? FIELD_SET(0, DE_CONTROL
, DIRECTION
,
783 : FIELD_SET(0, DE_CONTROL
, DIRECTION
,
784 LEFT_TO_RIGHT
)) | FIELD_SET(0, DE_CONTROL
,
786 SMTC_write2Dreg(DE_CONTROL
, de_ctrl
);
793 * This function sets the pixel format that will apply to the 2D Engine.
795 void deSetPixelFormat(unsigned long bpp
)
797 unsigned long de_format
;
799 de_format
= SMTC_read2Dreg(DE_STRETCH_FORMAT
);
804 FIELD_SET(de_format
, DE_STRETCH_FORMAT
, PIXEL_FORMAT
, 8);
809 FIELD_SET(de_format
, DE_STRETCH_FORMAT
, PIXEL_FORMAT
, 16);
813 FIELD_SET(de_format
, DE_STRETCH_FORMAT
, PIXEL_FORMAT
, 32);
817 SMTC_write2Dreg(DE_STRETCH_FORMAT
, de_format
);
821 * System memory to Video memory monochrome expansion.
823 * Source is monochrome image in system memory. This function expands the
824 * monochrome data to color image in video memory.
827 long deSystemMem2VideoMemMonoBlt(const char *pSrcbuf
,
829 unsigned long startBit
,
831 unsigned long dPitch
,
833 unsigned long dx
, unsigned long dy
,
834 unsigned long width
, unsigned long height
,
835 unsigned long fColor
,
836 unsigned long bColor
,
837 unsigned long rop2
) {
838 unsigned long bytePerPixel
;
839 unsigned long ulBytesPerScan
;
840 unsigned long ul4BytesPerScan
;
841 unsigned long ulBytesRemain
;
842 unsigned long de_ctrl
= 0;
843 unsigned char ajRemain
[4];
846 bytePerPixel
= bpp
/ 8;
848 /* Just make sure the start bit is within legal range */
851 ulBytesPerScan
= (width
+ startBit
+ 7) / 8;
852 ul4BytesPerScan
= ulBytesPerScan
& ~3;
853 ulBytesRemain
= ulBytesPerScan
& 3;
859 * 2D Source Base. Use 0 for HOST Blt.
862 SMTC_write2Dreg(DE_WINDOW_SOURCE_BASE
, 0);
865 * 2D Destination Base.
867 * It is an address offset (128 bit aligned) from the beginning of
871 SMTC_write2Dreg(DE_WINDOW_DESTINATION_BASE
, dBase
);
876 * Program pitch (distance between the 1st points of two
879 * Note that input pitch is BYTE value, but the 2D Pitch
880 * register uses pixel values. Need Byte to pixel convertion.
883 SMTC_write2Dreg(DE_PITCH
,
884 FIELD_VALUE(0, DE_PITCH
, DESTINATION
,
886 bytePerPixel
) | FIELD_VALUE(0,
892 /* Screen Window width in Pixels.
894 * 2D engine uses this value to calculate the linear address in
895 * frame buffer for a given point.
898 SMTC_write2Dreg(DE_WINDOW_WIDTH
,
899 FIELD_VALUE(0, DE_WINDOW_WIDTH
, DESTINATION
,
901 bytePerPixel
)) | FIELD_VALUE(0,
908 /* Note: For 2D Source in Host Write, only X_K1 field is needed, and
909 * Y_K2 field is not used. For mono bitmap, use startBit for X_K1.
912 SMTC_write2Dreg(DE_SOURCE
,
913 FIELD_SET(0, DE_SOURCE
, WRAP
, DISABLE
) |
914 FIELD_VALUE(0, DE_SOURCE
, X_K1
, startBit
) |
915 FIELD_VALUE(0, DE_SOURCE
, Y_K2
, 0));
917 SMTC_write2Dreg(DE_DESTINATION
,
918 FIELD_SET(0, DE_DESTINATION
, WRAP
, DISABLE
) |
919 FIELD_VALUE(0, DE_DESTINATION
, X
, dx
) |
920 FIELD_VALUE(0, DE_DESTINATION
, Y
, dy
));
922 SMTC_write2Dreg(DE_DIMENSION
,
923 FIELD_VALUE(0, DE_DIMENSION
, X
, width
) |
924 FIELD_VALUE(0, DE_DIMENSION
, Y_ET
, height
));
926 SMTC_write2Dreg(DE_FOREGROUND
, fColor
);
927 SMTC_write2Dreg(DE_BACKGROUND
, bColor
);
930 deSetPixelFormat(bpp
);
931 /* Set the pixel format of the destination */
933 de_ctrl
= FIELD_VALUE(0, DE_CONTROL
, ROP
, rop2
) |
934 FIELD_SET(0, DE_CONTROL
, ROP_SELECT
, ROP2
) |
935 FIELD_SET(0, DE_CONTROL
, COMMAND
, HOST_WRITE
) |
936 FIELD_SET(0, DE_CONTROL
, HOST
, MONO
) |
937 FIELD_SET(0, DE_CONTROL
, STATUS
, START
);
939 SMTC_write2Dreg(DE_CONTROL
, de_ctrl
| deGetTransparency());
941 /* Write MONO data (line by line) to 2D Engine data port */
942 for (i
= 0; i
< height
; i
++) {
943 /* For each line, send the data in chunks of 4 bytes */
944 for (j
= 0; j
< (ul4BytesPerScan
/ 4); j
++)
945 SMTC_write2Ddataport(0,
946 *(unsigned long *)(pSrcbuf
+
950 memcpy(ajRemain
, pSrcbuf
+ ul4BytesPerScan
,
952 SMTC_write2Ddataport(0, *(unsigned long *)ajRemain
);
963 * This function gets the transparency status from DE_CONTROL register.
964 * It returns a double word with the transparent fields properly set,
965 * while other fields are 0.
967 unsigned long deGetTransparency(void)
969 unsigned long de_ctrl
;
971 de_ctrl
= SMTC_read2Dreg(DE_CONTROL
);
974 FIELD_MASK(DE_CONTROL_TRANSPARENCY_MATCH
) |
975 FIELD_MASK(DE_CONTROL_TRANSPARENCY_SELECT
) |
976 FIELD_MASK(DE_CONTROL_TRANSPARENCY
);