[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

--
ふかうみ なおき