[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
color map problem on TX3922 kernel
こんにちは、深海です。
SHARP Telios シリーズで NetBSD-1.5{,1} を使うと、カーネルが表示するメッ
セージが黒く塗りつぶされた状態で読めない、という話です。
# 他の機種でも発生してるんでしょうか、持ってないのでわかりません
NetBSD-current では既に修正されていますが、 2001/06/14 の NetBSD-release
(NetBSD-1.5.1) では修正まだされていないようです。
http://cvsweb.netbsd.org/cgi-bin/cvsweb.cgi/syssrc/sys/arch/hpcmips/dev/Attic/hpcfb.c.diff?r1=1.14&r2=1.15
このパッチを sys/arch/hpcmips/dev/hpcfb.c に適用すると修正されます。適用
してコンパイルしたカーネルと、ソースの差分を以下の場所に置いておきます。
http://kame.naobsd.org/~nao/hpcmips/TX3922/
ソースの差分はこのメールの最後にも付けておきます。
Telios HC-VJ1C でこのパッチを適用したカーネルを使うと、画面表示は黒地に
白文字となり、起動メッセージなど、カーネルが表示するメッセージも読めるよ
うになります。
これを今から 1.5.1 につっこむ... のは、時期的に難しいですよね、きっと。
-current の hpcfb はなにやら jump scroll したり multi console (screen?)
だったりしてかなり高機能なので、 -current で生活する方がよいのかなと思う
今日この頃でもありますが。
# 差分を -release に持って来れるかなぁ...
また、それと別に、適用する前も適用した後も、 pbsdboot で画面の白黒反転を
選んでも反転しない気がする、という疑問も浮かんだりしていますけど :)
それでは。
"Re: Plz help me with installation on SHARP HC-AJ2" というメールで、
Yoshihisa Sugimoto さんはおっしゃいました:
> 杉本@滋賀医大ともうします.
>
> Telios HC-AJ1で試しておりますが,
>
> At 11:36 PM +0900 01.5.15, UCHIYAMA Yasushi wrote:
> > | 一応、ロードメッセージにあわせて黒い部
> > | 分と白い部分は進んでいきますし、キーボ
> > | ードからの入力も全て真っ黒に表示される
> > | ものの、認識はしているようです。
> >
> >これは、NetBSD 1.5 releaseの頃のバグで、今は直ってるので、
> >
> >/pub/NetBSD/arch/hpcmips/snapshot/20010510-1.5.1_BETA2/binary/kernel
> >あたりの、新しいやつで試してみてください。
>
> /pub/NetBSD/arch/hpcmips/snapshot/20010422/
> のインストール用kernelは真っ黒表示はありませんが,
>
> /pub/NetBSD/arch/hpcmips/snapshot/20010510-1.5.1_BETA2/binary/kernel
> のkernelは真っ黒表示になってしまいます.
*** hpcfb.c.orig Sun Aug 6 13:18:21 2000
--- hpcfb.c Thu Jun 14 11:55:45 2001
***************
*** 158,163 ****
--- 158,165 ----
static int hpcfb_show_screen __P((void *, void *, int,
void (*) (void *, int, int), void *));
static void hpcfb_power __P((int, void *));
+ static void hpcfb_cmap_reorder __P((struct hpcfb_fbconf *,
+ struct hpcfb_devconfig *));
static int pow __P((int, int));
***************
*** 435,468 ****
struct hpcfb_fbconf *fbconf;
struct hpcfb_devconfig *dc;
{
- int i;
- int32_t fg, bg;
struct rasops_info *ri;
vaddr_t fbaddr;
fbaddr = (vaddr_t)fbconf->hf_baseaddr + fbconf->hf_offset;
- /*
- * Set forground and background so that the screen
- * looks black on white.
- * Normally, black = 00 and white = ff.
- * HPCFB_ACCESS_REVERSE means black = ff and white = 00.
- */
- if (fbconf->hf_access_flags & HPCFB_ACCESS_REVERSE) {
- bg = 0;
- fg = ~0;
- } else {
- bg = ~0;
- fg = 0;
- }
-
- /* clear the screen */
- for (i = 0;
- i < fbconf->hf_height * fbconf->hf_bytes_per_line;
- i += sizeof(u_int32_t)) {
- *(u_int32_t *)(fbaddr + i) = bg;
- }
-
/* init rasops */
ri = &dc->dc_rinfo;
bzero(ri, sizeof(struct rasops_info));
--- 437,447 ----
***************
*** 481,489 ****
}
/* over write color map of rasops */
! ri->ri_devcmap[0] = bg;
! for (i = 1; i < 16; i++)
! ri->ri_devcmap[i] = fg;
#ifdef HPCFB_TVRAM
dc->dc_curx = -1;
--- 460,466 ----
}
/* over write color map of rasops */
! hpcfb_cmap_reorder (fbconf, dc);
#ifdef HPCFB_TVRAM
dc->dc_curx = -1;
***************
*** 504,509 ****
--- 481,543 ----
#endif /* HPCFB_HOOK */
return (0);
+ }
+
+ static void
+ hpcfb_cmap_reorder(fbconf, dc)
+ struct hpcfb_fbconf *fbconf;
+ struct hpcfb_devconfig *dc;
+ {
+ struct rasops_info *ri = &dc->dc_rinfo;
+ int reverse = fbconf->hf_access_flags & HPCFB_ACCESS_REVERSE;
+ int *cmap = ri->ri_devcmap;
+ vaddr_t fbaddr = (vaddr_t)fbconf->hf_baseaddr + fbconf->hf_offset;
+ int i, j, bg, fg, tmp;
+
+ /*
+ * Set forground and background so that the screen
+ * looks black on white.
+ * Normally, black = 00 and white = ff.
+ * HPCFB_ACCESS_REVERSE means black = ff and white = 00.
+ */
+ switch (fbconf->hf_pixel_width) {
+ case 1:
+ /* FALLTHROUGH */
+ case 2:
+ /* FALLTHROUGH */
+ case 4:
+ if (reverse) {
+ bg = 0;
+ fg = ~0;
+ } else {
+ bg = ~0;
+ fg = 0;
+ }
+ /* for gray-scale LCD, hi-contrast color map */
+ cmap[0] = bg;
+ for (i = 1; i < 16; i++)
+ cmap[i] = fg;
+ break;
+ case 8:
+ /* FALLTHROUGH */
+ case 16:
+ if (reverse) {
+ for (i = 0, j = 15; i < 8; i++, j--) {
+ tmp = cmap[i];
+ cmap[i] = cmap[j];
+ cmap[j] = tmp;
+ }
+ }
+ break;
+ }
+
+ /* clear the screen */
+ bg = cmap[0];
+ for (i = 0;
+ i < fbconf->hf_height * fbconf->hf_bytes_per_line;
+ i += sizeof(u_int32_t)) {
+ *(u_int32_t *)(fbaddr + i) = bg;
+ }
}
int
--
ふかうみ なおき