1*df7f595eScegger /* $NetBSD: debug_subr.c,v 1.10 2009/03/18 10:22:28 cegger Exp $ */
27d170993Such
37d170993Such /*-
47d170993Such * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
57d170993Such * All rights reserved.
67d170993Such *
77d170993Such * This code is derived from software contributed to The NetBSD Foundation
87d170993Such * by UCHIYAMA Yasushi.
97d170993Such *
107d170993Such * Redistribution and use in source and binary forms, with or without
117d170993Such * modification, are permitted provided that the following conditions
127d170993Such * are met:
137d170993Such * 1. Redistributions of source code must retain the above copyright
147d170993Such * notice, this list of conditions and the following disclaimer.
157d170993Such * 2. Redistributions in binary form must reproduce the above copyright
167d170993Such * notice, this list of conditions and the following disclaimer in the
177d170993Such * documentation and/or other materials provided with the distribution.
187d170993Such *
197d170993Such * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
207d170993Such * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
217d170993Such * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
227d170993Such * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
237d170993Such * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
247d170993Such * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
257d170993Such * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
267d170993Such * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
277d170993Such * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
287d170993Such * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
297d170993Such * POSSIBILITY OF SUCH DAMAGE.
307d170993Such */
317d170993Such
320c82163cSlukem #include <sys/cdefs.h>
33*df7f595eScegger __KERNEL_RCSID(0, "$NetBSD: debug_subr.c,v 1.10 2009/03/18 10:22:28 cegger Exp $");
340c82163cSlukem
35c0a13ed2Such #include "debug_hpc.h"
36c0a13ed2Such
377d170993Such #include <sys/param.h>
387d170993Such #include <sys/systm.h>
397d170993Such
407d170993Such #include <machine/debug.h>
41c0a13ed2Such #include <machine/bootinfo.h>
427d170993Such
437d170993Such #define BANNER_LENGTH 80
447d170993Such
457d170993Such static const char onoff[2] = "_x";
467d170993Such
477d170993Such void
__dbg_bit_print(uint32_t a,int len,int start,int end,const char * title,int flags)48756e048eSuwe __dbg_bit_print(uint32_t a, int len, int start, int end, const char *title,
49f8cb4c37Stakemura int flags)
507d170993Such {
51756e048eSuwe uint32_t j, j1;
527d170993Such int i, n;
537d170993Such char buf[64];
547d170993Such
557d170993Such n = len * NBBY - 1;
567d170993Such j1 = 1 << n;
577d170993Such end = end ? end : n;
587d170993Such
59f8cb4c37Stakemura if (!(flags & DBG_BIT_PRINT_QUIET))
607d170993Such printf(" ");
617d170993Such if (title) {
627d170993Such printf("[%-16s] ", title);
637d170993Such }
647d170993Such
657d170993Such for (j = j1, i = n; j > 0; j >>=1, i--) {
667d170993Such if (i > end || i < start) {
677d170993Such printf("%c", a & j ? '+' : '-'); /* out of range */
687d170993Such } else {
697d170993Such printf("%c", a & j ? '|' : '.');
707d170993Such }
717d170993Such }
727d170993Such
73f8cb4c37Stakemura if (!(flags & DBG_BIT_PRINT_QUIET)) {
747d170993Such snprintf(buf, sizeof buf, " [0x%%0%dx %%12d]", len << 1);
757d170993Such printf(buf, a, a);
76f8cb4c37Stakemura }
777d170993Such
78f8cb4c37Stakemura if (flags & DBG_BIT_PRINT_COUNT) {
797d170993Such for (j = j1, i = n; j > 0; j >>=1, i--) {
807d170993Such if (!(i > end || i < start) && (a & j)) {
817d170993Such printf(" %d", i);
827d170993Such }
837d170993Such }
847d170993Such }
857d170993Such
86f8cb4c37Stakemura if (!(flags & DBG_BIT_PRINT_QUIET))
877d170993Such printf("\n");
887d170993Such }
897d170993Such
907d170993Such void
dbg_bitmask_print(uint32_t reg,uint32_t mask,const char * name)91756e048eSuwe dbg_bitmask_print(uint32_t reg, uint32_t mask, const char *name)
927d170993Such {
937d170993Such
947d170993Such printf("%s[%c] ", name, onoff[reg & mask ? 1 : 0]);
957d170993Such }
967d170993Such
977d170993Such void
dbg_banner_title(const char * name,size_t len)987d170993Such dbg_banner_title(const char *name, size_t len)
997d170993Such {
1007d170993Such int n = (BANNER_LENGTH - (len + 2)) >> 1;
1017d170993Such
1027d170993Such dbg_draw_line(n);
1037d170993Such printf("[%s]", name);
1047d170993Such dbg_draw_line(n);
1057d170993Such printf("\n");
1067d170993Such }
1077d170993Such
1087d170993Such void
dbg_banner_line(void)109*df7f595eScegger dbg_banner_line(void)
1107d170993Such {
1117d170993Such
1127d170993Such dbg_draw_line(BANNER_LENGTH);
1137d170993Such printf("\n");
1147d170993Such }
1157d170993Such
1167d170993Such void
dbg_draw_line(int n)1177d170993Such dbg_draw_line(int n)
1187d170993Such {
1197d170993Such int i;
1207d170993Such
1217d170993Such for (i = 0; i < n; i++)
1227d170993Such printf("-");
1237d170993Such }
124c0a13ed2Such
125c0a13ed2Such #ifdef HPC_DEBUG_LCD
126c0a13ed2Such /*
127c0a13ed2Such * LCD test routines for 8bpp, 16bpp LCD.
128c0a13ed2Such */
129756e048eSuwe static const uint8_t img[1024] = {
130c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
131c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
132c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
133c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
134c0a13ed2Such 0xff,0xd5,0xff,0xc3,0xff,0xd5,0xff,0xc3,
135c0a13ed2Such 0xff,0xd5,0xff,0xc3,0xff,0xd5,0xff,0xc3,
136c0a13ed2Such 0xff,0xd5,0xff,0xc3,0xff,0xd5,0xc3,0xd5,
137c0a13ed2Such 0xff,0xc3,0xff,0xd5,0xff,0xc3,0xff,0xd5,
138c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
139c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
140c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0x82,0x82,
141c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,
142c0a13ed2Such 0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
143c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
144c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xb9,0x82,
145c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb9,
146c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
147c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
148c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0x82,
149c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,
150c0a13ed2Such 0xff,0xb9,0xff,0xff,0xff,0xff,0xff,0xff,
151c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
152c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0x82,
153c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,
154c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
155c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
156c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0x82,
157c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,
158c0a13ed2Such 0xff,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,
159c0a13ed2Such 0xff,0xff,0xff,0xff,0xb9,0xd5,0xc3,0xd5,
160c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0x3d,0x82,
161c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb9,
162c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
163c0a13ed2Such 0xff,0xff,0xd5,0x82,0x82,0x82,0x82,0x82,
164c0a13ed2Such 0x82,0x82,0xd5,0xff,0xff,0xff,0xd5,0x82,
165c0a13ed2Such 0xff,0xff,0xd5,0xc3,0xff,0xff,0xff,0xc3,
166c0a13ed2Such 0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
167c0a13ed2Such 0xff,0xff,0x82,0x82,0xff,0xff,0xff,0xff,
168c0a13ed2Such 0xd5,0x3e,0x82,0x82,0x82,0xc3,0x82,0x3d,
169c0a13ed2Such 0xff,0xc3,0x82,0x3d,0xff,0xff,0xff,0xd5,
170c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
171c0a13ed2Such 0xff,0xd5,0x82,0xff,0xff,0xff,0xff,0xff,
172c0a13ed2Such 0xff,0xff,0xff,0xff,0x82,0x82,0x82,0x3d,
173c0a13ed2Such 0x82,0x82,0xd5,0xff,0xff,0xff,0xff,0xb9,
174c0a13ed2Such 0xff,0xb9,0xff,0xff,0xff,0xff,0xff,0xff,
175c0a13ed2Such 0xff,0x82,0x82,0xff,0xff,0xff,0xff,0xff,
176c0a13ed2Such 0xff,0xff,0xff,0xff,0xd5,0x82,0x82,0x82,
177c0a13ed2Such 0x82,0x82,0xb9,0xff,0xff,0xff,0xff,0xc3,
178c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
179c0a13ed2Such 0xff,0x82,0xd5,0xff,0xff,0xff,0xff,0xff,
180c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0x82,0x82,0x82,
181c0a13ed2Such 0xd5,0xff,0x82,0xd5,0xff,0xff,0xff,0xd5,
182c0a13ed2Such 0xff,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,
183c0a13ed2Such 0xd5,0x82,0xff,0xff,0xff,0xff,0xff,0xff,
184c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0x82,0x82,0x3e,
185c0a13ed2Such 0xff,0xff,0xc3,0x82,0xff,0xff,0xff,0xb9,
186c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
187c0a13ed2Such 0x82,0x3e,0xff,0xff,0xff,0xff,0xff,0xff,
188c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xd5,0x82,0xc3,
189c0a13ed2Such 0xff,0xff,0xff,0x82,0xf8,0xff,0xff,0xd5,
190c0a13ed2Such 0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
191c0a13ed2Such 0x82,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,
192c0a13ed2Such 0xff,0xff,0xff,0xff,0x3e,0x82,0x82,0x82,
193c0a13ed2Such 0x80,0x3d,0xff,0x3d,0x82,0xff,0xff,0xc3,
194c0a13ed2Such 0xff,0xff,0xff,0xff,0xd5,0xc3,0xd5,0xb9,
195c0a13ed2Such 0x82,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
196c0a13ed2Such 0xff,0xff,0xff,0xff,0x82,0x82,0xd5,0xff,
197c0a13ed2Such 0x82,0xd5,0xff,0xd5,0x82,0xff,0xff,0xb9,
198c0a13ed2Such 0xff,0xb9,0xff,0x82,0x82,0x82,0x82,0x82,
199c0a13ed2Such 0x82,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
200c0a13ed2Such 0xff,0xff,0xff,0x82,0x82,0x82,0x82,0x3d,
201c0a13ed2Such 0x82,0xb9,0xff,0xc3,0x82,0xff,0xff,0xd5,
202c0a13ed2Such 0xff,0xff,0xd5,0x82,0xd5,0xff,0xff,0xff,
203c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
204c0a13ed2Such 0xff,0xff,0xff,0x82,0x82,0xd5,0x3e,0x82,
205c0a13ed2Such 0x82,0xc3,0xff,0xb9,0x82,0xff,0xff,0xc3,
206c0a13ed2Such 0xff,0xc3,0x3e,0x82,0xff,0xff,0xff,0xff,
207c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
208c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
209c0a13ed2Such 0xff,0xff,0xff,0xd5,0x82,0xff,0xff,0xb9,
210c0a13ed2Such 0xff,0xff,0x82,0x3d,0xff,0xff,0x3e,0xd5,
211c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
212c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
213c0a13ed2Such 0xff,0xff,0xff,0xc3,0x82,0xff,0xff,0xd5,
214c0a13ed2Such 0xff,0xd5,0x82,0xd5,0xff,0xc3,0x82,0xff,
215c0a13ed2Such 0xc3,0xd5,0xb9,0xd5,0xff,0xff,0xff,0xff,
216c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0xd5,
217c0a13ed2Such 0xb9,0xff,0xff,0xb9,0x82,0xff,0xff,0xc3,
218c0a13ed2Such 0xff,0xb9,0x82,0xb9,0xff,0x82,0x3d,0xff,
219c0a13ed2Such 0x82,0x82,0x82,0x82,0xff,0xff,0xff,0xff,
220c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xd5,0x82,0x82,
221c0a13ed2Such 0x82,0x82,0xff,0xd5,0x82,0xff,0xff,0xd5,
222c0a13ed2Such 0xff,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
223c0a13ed2Such 0x82,0x82,0x82,0x82,0x82,0xc3,0xb9,0xd5,
224c0a13ed2Such 0xc3,0xd5,0xff,0xff,0xc3,0x82,0x82,0x82,
225c0a13ed2Such 0x82,0x82,0xb9,0xc3,0x82,0xff,0xff,0xb9,
226c0a13ed2Such 0xff,0xd5,0xc3,0xd5,0xb9,0x82,0x3d,0xd5,
227c0a13ed2Such 0x82,0x82,0x3e,0x82,0x82,0x82,0x82,0x82,
228c0a13ed2Such 0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x3d,
229c0a13ed2Such 0x82,0x82,0x82,0x82,0x3d,0xff,0xff,0xc3,
230c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xd5,0x82,0xc3,
231c0a13ed2Such 0x82,0xd5,0xff,0x82,0xd5,0xff,0xff,0xff,
232c0a13ed2Such 0xff,0xd5,0xb9,0xd5,0x82,0x82,0x82,0xd5,
233c0a13ed2Such 0x82,0x82,0x82,0xff,0xd5,0xff,0xff,0xd5,
234c0a13ed2Such 0xff,0xb9,0xff,0xff,0xff,0xff,0x82,0x82,
235c0a13ed2Such 0x82,0xc3,0x82,0x82,0xff,0xff,0xff,0xff,
236c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0x82,0x82,0x82,
237c0a13ed2Such 0x82,0x82,0x82,0xff,0xff,0xff,0xff,0xb9,
238c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3d,
239c0a13ed2Such 0x82,0x82,0x3d,0xff,0xff,0xff,0xff,0xff,
240c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xd5,0x82,0x82,
241c0a13ed2Such 0x82,0x82,0xd5,0xff,0xff,0xff,0xff,0xc3,
242c0a13ed2Such 0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
243c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
244c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,
245c0a13ed2Such 0xd5,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,
246c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
247c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
248c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
249c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb9,
250c0a13ed2Such 0xff,0xd5,0xff,0xff,0xff,0xff,0xff,0xff,
251c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
252c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
253c0a13ed2Such 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,
254c0a13ed2Such 0xff,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
255c0a13ed2Such 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
256c0a13ed2Such 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
257c0a13ed2Such 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
258c0a13ed2Such };
259c0a13ed2Such
260756e048eSuwe static const uint16_t rgb565_clut[256] = {
261c0a13ed2Such 0x0000, 0x8000, 0x0400, 0x8400, 0x0080, 0x8080, 0x0480, 0x8480,
262c0a13ed2Such 0xc6e0, 0xa6f0, 0x29ea, 0x29ff, 0x2ae0, 0x2af5, 0x2aea, 0x2aff,
263c0a13ed2Such 0x2be0, 0x2bf5, 0x2bea, 0x2bff, 0x2ce0, 0x2cf5, 0x2cea, 0x2cff,
264c0a13ed2Such 0x2de0, 0x2df5, 0x2dea, 0x2dff, 0x2ee0, 0x2ef5, 0x2eea, 0x2eff,
265c0a13ed2Such 0x2fe0, 0x2ff5, 0x2fea, 0x2fff, 0x5000, 0x5055, 0x50aa, 0x50ff,
266c0a13ed2Such 0x50e0, 0x50f5, 0x50ea, 0x50ff, 0x51e0, 0x51f5, 0x51ea, 0x51ff,
267c0a13ed2Such 0x52e0, 0x52f5, 0x52ea, 0x52ff, 0x53e0, 0x53f5, 0x53ea, 0x53ff,
268c0a13ed2Such 0x54e0, 0x54f5, 0x54ea, 0x54ff, 0x55e0, 0x55f5, 0x55ea, 0x55ff,
269c0a13ed2Such 0x56e0, 0x56f5, 0x56ea, 0x56ff, 0x57e0, 0x57f5, 0x57ea, 0x57ff,
270c0a13ed2Such 0x7800, 0x7855, 0x78aa, 0x78ff, 0x78e0, 0x78f5, 0x78ea, 0x78ff,
271c0a13ed2Such 0x79e0, 0x79f5, 0x79ea, 0x79ff, 0x7ae0, 0x7af5, 0x7aea, 0x7aff,
272c0a13ed2Such 0x7be0, 0x7bf5, 0x7bea, 0x7bff, 0x7ce0, 0x7cf5, 0x7cea, 0x7cff,
273c0a13ed2Such 0x7de0, 0x7df5, 0x7dea, 0x7dff, 0x7ee0, 0x7ef5, 0x7eea, 0x7eff,
274c0a13ed2Such 0x7fe0, 0x7ff5, 0x7fea, 0x7fff, 0xa800, 0xa855, 0xa8aa, 0xa8ff,
275c0a13ed2Such 0xa8e0, 0xa8f5, 0xa8ea, 0xa8ff, 0xa9e0, 0xa9f5, 0xa9ea, 0xa9ff,
276c0a13ed2Such 0xaae0, 0xaaf5, 0xaaea, 0xaaff, 0xabe0, 0xabf5, 0xabea, 0xabff,
277c0a13ed2Such 0xace0, 0xacf5, 0xacea, 0xacff, 0xade0, 0xadf5, 0xadea, 0xadff,
278c0a13ed2Such 0xaee0, 0xaef5, 0xaeea, 0xaeff, 0xafe0, 0xaff5, 0xafea, 0xafff,
279c0a13ed2Such 0xd000, 0xd055, 0xd0aa, 0xd0ff, 0xd0e0, 0xd0f5, 0xd0ea, 0xd0ff,
280c0a13ed2Such 0xd1e0, 0xd1f5, 0xd1ea, 0xd1ff, 0xd2e0, 0xd2f5, 0xd2ea, 0xd2ff,
281c0a13ed2Such 0xd3e0, 0xd3f5, 0xd3ea, 0xd3ff, 0xd4e0, 0xd4f5, 0xd4ea, 0xd4ff,
282c0a13ed2Such 0xd5e0, 0xd5f5, 0xd5ea, 0xd5ff, 0xd6e0, 0xd6f5, 0xd6ea, 0xd6ff,
283c0a13ed2Such 0xd7e0, 0xd7f5, 0xd7ea, 0xd7ff, 0xf855, 0xf8aa, 0xf8e0, 0xf8f5,
284c0a13ed2Such 0xf8ea, 0xf8ff, 0xf9e0, 0xf9f5, 0xf9ea, 0xf9ff, 0xfae0, 0xfaf5,
285c0a13ed2Such 0xfaea, 0xfaff, 0xfbe0, 0xfbf5, 0xfbea, 0xfbff, 0xfce0, 0xfcf5,
286c0a13ed2Such 0xfcea, 0xfcff, 0xfde0, 0xfdf5, 0xfdea, 0xfdff, 0xfee0, 0xfef5,
287c0a13ed2Such 0xfeea, 0xfeff, 0xfff5, 0xffea, 0xceff, 0xfeff, 0x37ff, 0x67ff,
288c0a13ed2Such 0x9fff, 0xcfff, 0x03e0, 0x03f5, 0x03ea, 0x03ff, 0x04e0, 0x04f5,
289c0a13ed2Such 0x04ea, 0x04ff, 0x05e0, 0x05f5, 0x05ea, 0x05ff, 0x06e0, 0x06f5,
290c0a13ed2Such 0x06ea, 0x06ff, 0x07f5, 0x07ea, 0x2800, 0x2855, 0x28aa, 0x28ff,
291c0a13ed2Such 0x28e0, 0x28f5, 0x28ea, 0x28ff, 0x29e0, 0x29f5, 0xfff0, 0xa5a4,
292c0a13ed2Such 0x8480, 0xf800, 0x07e0, 0xffe0, 0x00ff, 0xf8ff, 0x07ff, 0xffff
293c0a13ed2Such };
294c0a13ed2Such
295756e048eSuwe static uint16_t __color_tab16[] = {
296c0a13ed2Such RGB565_BLACK,
297c0a13ed2Such RGB565_RED,
298c0a13ed2Such RGB565_GREEN,
299c0a13ed2Such RGB565_YELLOW,
300c0a13ed2Such RGB565_BLUE,
301c0a13ed2Such RGB565_MAGENTA,
302c0a13ed2Such RGB565_CYAN,
303c0a13ed2Such RGB565_WHITE
304c0a13ed2Such };
305c0a13ed2Such
306c0a13ed2Such static int bootinfo_fb_depth(void);
307c0a13ed2Such static void __dbg_lcd_test8(vaddr_t, int, int);
308c0a13ed2Such static void __dbg_lcd_test16(vaddr_t, int, int);
309c0a13ed2Such
310c0a13ed2Such void
dbg_lcd_test(void)311*df7f595eScegger dbg_lcd_test(void)
312c0a13ed2Such {
313c0a13ed2Such vaddr_t fbaddr;
314c0a13ed2Such int w, h;
315c0a13ed2Such
316c0a13ed2Such if (bootinfo == NULL || bootinfo->fb_addr == NULL)
317c0a13ed2Such return;
318c0a13ed2Such
319c0a13ed2Such fbaddr = (vaddr_t)bootinfo->fb_addr;
320c0a13ed2Such w = bootinfo->fb_width;
321c0a13ed2Such h = bootinfo->fb_height;
322c0a13ed2Such
323c0a13ed2Such switch (bootinfo_fb_depth()) {
324c0a13ed2Such default:
325c0a13ed2Such break;
326c0a13ed2Such case 8:
327c0a13ed2Such __dbg_lcd_test8(fbaddr, w, h);
328c0a13ed2Such break;
329c0a13ed2Such case 16:
330c0a13ed2Such __dbg_lcd_test16(fbaddr, w, h);
331c0a13ed2Such break;
332c0a13ed2Such }
333c0a13ed2Such }
334c0a13ed2Such
335c0a13ed2Such /*
336c0a13ed2Such * 8bpp LCD test routine.
337c0a13ed2Such * HP620LX, HPW50PAD are little-endian display.
338c0a13ed2Such */
339c0a13ed2Such void
__dbg_lcd_test8(vaddr_t fbaddr,int w,int h)340c0a13ed2Such __dbg_lcd_test8(vaddr_t fbaddr, int w, int h)
341c0a13ed2Such {
342756e048eSuwe uint8_t *fb, *fb_start = (uint8_t *)fbaddr;
343c0a13ed2Such int i, x, y, y_start, y_end, len, skip;
344756e048eSuwe uint16_t *fb16;
345756e048eSuwe uint32_t *fb32;
346c0a13ed2Such
347c0a13ed2Such /*
348c0a13ed2Such * Clear screen (BLACK)
349c0a13ed2Such */
350c0a13ed2Such for (fb = fb_start, i = 0; i < w * h; i++)
351c0a13ed2Such *fb++ = 0;
352c0a13ed2Such
353c0a13ed2Such /*
354c0a13ed2Such * Color bar (I assume palette index is ANSI)
355c0a13ed2Such * BLACK|RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE
356c0a13ed2Such */
357c0a13ed2Such len = w / 8;
358c0a13ed2Such y_start = 0;
359c0a13ed2Such y_end = h / 2;
360c0a13ed2Such skip = bootinfo->fb_line_bytes - w;
361c0a13ed2Such for (fb = fb_start, y = y_start; y < y_end; y++, fb += skip) {
362c0a13ed2Such for (i = 0; i < 8; i++) {
363c0a13ed2Such for (x = 0; x < len; x++)
364c0a13ed2Such *fb++ = i;
365c0a13ed2Such }
366c0a13ed2Such }
367c0a13ed2Such
368c0a13ed2Such /*
369c0a13ed2Such * Byte order test. (display 32x32 bitmap)
370c0a13ed2Such */
37143eee137Such /*
37243eee137Such * 8-bit access (reference)
37343eee137Such */
374c0a13ed2Such y_start = y_end;
375c0a13ed2Such y_end = y_start + 32;
376c0a13ed2Such i = 0;
377c0a13ed2Such fb += w / 2 - 16; /* center */
378c0a13ed2Such skip = bootinfo->fb_line_bytes - 32;
379c0a13ed2Such for (y = y_start; y < y_end; y++, fb += skip)
380c0a13ed2Such for (x = 0; x < 32; x++)
381c0a13ed2Such *fb++ = img[i++];
382c0a13ed2Such
383c0a13ed2Such /*
38443eee137Such * 16-bit access
385c0a13ed2Such */
386c0a13ed2Such y_start = y_end;
387c0a13ed2Such y_end = y_start + 32;
388c0a13ed2Such i = 0;
389756e048eSuwe fb16 = (uint16_t *)fb;
390c0a13ed2Such skip /= 2;
391c0a13ed2Such for (y = y_start; y < y_end; y++, fb16 += skip)
392c0a13ed2Such for (x = 0; x < 16; x++, i += 2)
393c0a13ed2Such *fb16++ =
394c0a13ed2Such img[i + 1] << 8 |
395c0a13ed2Such img[i + 0];
396c0a13ed2Such
397c0a13ed2Such /*
39843eee137Such * 32-bit access
399c0a13ed2Such */
400c0a13ed2Such y_start = y_end;
401c0a13ed2Such y_end = y_start + 32;
402c0a13ed2Such i = 0;
403756e048eSuwe fb32 = (uint32_t *)(fb + 32 * w);
404c0a13ed2Such skip /= 2;
405c0a13ed2Such for (y = y_start; y < y_end; y++, fb32 += skip)
406c0a13ed2Such for (x = 0; x < 8; x++, i += 4)
407c0a13ed2Such *fb32++ =
408c0a13ed2Such img[i + 3] << 24 |
409c0a13ed2Such img[i + 2] << 16 |
410c0a13ed2Such img[i + 1] << 8 |
411c0a13ed2Such img[i + 0];
412c0a13ed2Such }
413c0a13ed2Such
414c0a13ed2Such /*
415c0a13ed2Such * 16bpp LCD test routine.
416c0a13ed2Such * Jornada6[89]0, HPW650PA are big-endian display.
417c0a13ed2Such */
418c0a13ed2Such void
__dbg_lcd_test16(vaddr_t fbaddr,int w,int h)419c0a13ed2Such __dbg_lcd_test16(vaddr_t fbaddr, int w, int h)
420c0a13ed2Such {
421756e048eSuwe uint16_t *fb, *fb_start = (uint16_t *)fbaddr;
422756e048eSuwe uint16_t pat;
423c0a13ed2Such int i, x, y, y_start, y_end, len, skip;
424756e048eSuwe uint32_t *fb32;
425c0a13ed2Such
426c0a13ed2Such /*
427c0a13ed2Such * Clear screen (BLACK)
428c0a13ed2Such */
429c0a13ed2Such pat = __color_tab16[0];
430c0a13ed2Such for (fb = fb_start, i = 0; i < w * h; i++)
431c0a13ed2Such *fb++ = pat;
432c0a13ed2Such
433c0a13ed2Such /*
434c0a13ed2Such * Color bar
435c0a13ed2Such * BLACK|RED|GREEN|YELLOW|BLUE|MAGENTA|CYAN|WHITE
436c0a13ed2Such */
437c0a13ed2Such len = w / 8;
438c0a13ed2Such y_start = 0;
439c0a13ed2Such y_end = h / 2;
440c0a13ed2Such for (fb = fb_start, y = y_start; y < y_end; y++) {
441c0a13ed2Such for (i = 0; i < 8; i++) {
442c0a13ed2Such pat = __color_tab16[i];
443c0a13ed2Such for (x = 0; x < len; x++)
444c0a13ed2Such *fb++ = pat;
445c0a13ed2Such }
446c0a13ed2Such }
447c0a13ed2Such y_start = y_end;
448c0a13ed2Such
449c0a13ed2Such /*
450c0a13ed2Such * Byte order test. (display 32x32 bitmap)
451c0a13ed2Such */
452c0a13ed2Such /*
453c0a13ed2Such * 16-bit access (reference)
454c0a13ed2Such */
455c0a13ed2Such y_start = y_end;
456c0a13ed2Such y_end = y_start + 32;
457c0a13ed2Such i = 0;
458c0a13ed2Such fb += w / 2 - 16; /* center */
459c0a13ed2Such skip = w - 32;
460c0a13ed2Such for (y = y_start; y < y_end; y++, fb += skip)
461c0a13ed2Such for (x = 0; x < 32; x++)
462c0a13ed2Such *fb++ = rgb565_clut[img[i++]];
463c0a13ed2Such
464c0a13ed2Such /*
465c0a13ed2Such * 32-bit access (test)
466c0a13ed2Such */
467c0a13ed2Such y_start = y_end;
468c0a13ed2Such y_end = y_start + 32;
469c0a13ed2Such i = 0;
470756e048eSuwe fb32 = (uint32_t *)fb;
471c0a13ed2Such skip /= 2;
472c0a13ed2Such for (y = y_start; y < y_end; y++, fb32 += skip)
473c0a13ed2Such for (x = 0; x < 16; x++, i += 2)
474c0a13ed2Such *fb32++ = (rgb565_clut[img[i + 1]] << 16) |
475c0a13ed2Such rgb565_clut[img[i]];
476c0a13ed2Such }
477c0a13ed2Such
478c0a13ed2Such int
bootinfo_fb_depth(void)479*df7f595eScegger bootinfo_fb_depth(void)
480c0a13ed2Such {
481c0a13ed2Such
482c0a13ed2Such switch (bootinfo->fb_type) {
483c0a13ed2Such case BIFB_D2_M2L_3:
484c0a13ed2Such /* FALLTHROUGH */
485c0a13ed2Such case BIFB_D2_M2L_0:
486c0a13ed2Such return (2);
487c0a13ed2Such case BIFB_D4_M2L_F:
488c0a13ed2Such /* FALLTHROUGH */
489c0a13ed2Such case BIFB_D4_M2L_0:
490c0a13ed2Such return (4);
491c0a13ed2Such case BIFB_D8_FF:
492c0a13ed2Such /* FALLTHROUGH */
493c0a13ed2Such case BIFB_D8_00:
494c0a13ed2Such return (8);
495c0a13ed2Such case BIFB_D16_FFFF:
496c0a13ed2Such /* FALLTHROUGH */
497c0a13ed2Such case BIFB_D16_0000:
498c0a13ed2Such return (16);
499c0a13ed2Such }
500c0a13ed2Such
501c0a13ed2Such return (0);
502c0a13ed2Such }
503c0a13ed2Such
504c0a13ed2Such #endif /* HPC_DEBUG_LCD */
505