@@ -26,6 +26,8 @@ static byte* buf;
2626#define  SLEDFB_BGR  8
2727// Planar 
2828#define  SLEDFB_PLANAR  16
29+ // 16bpp 
30+ #define  SLEDFB_P2EN  32
2931
3032static  int  fbdev_w , fbdev_h , fbdev_fd ;
3133static  int  fbdev_flags ;
@@ -112,11 +114,16 @@ static int query_device(char* device) {
112114int  bpp  =  24 ; //vinfo.bpp; 
113115#endif 
114116	if  (bpp  !=  24 ) {
115- 		if  (bpp  !=  32 ) {
116- 			fprintf (stderr , "FB: Expected 24/32-bit display, got %i\n" , bpp );
117- 			return  1 ;
117+ 		if  (bpp  ==  32 ) {
118+ 			fbdev_flags  |= SLEDFB_P4EN ;
119+ 		} else  {
120+ 			if  (bpp  ==  16 ) {
121+ 				fbdev_flags  |= SLEDFB_P2EN ;
122+ 			} else  {
123+ 				fprintf (stderr , "FB: Expected 16/24/32-bit display, got %i\n" , bpp );
124+ 				return  1 ;
125+ 			}
118126		}
119- 		fbdev_flags  |= SLEDFB_P4EN ;
120127#ifdef  __linux__ 
121128		if  (ifo .transp .length ) {
122129			fbdev_flags  |= SLEDFB_P4AI ;
@@ -150,6 +157,8 @@ int init (int moduleno, char* argstr) {
150157		return  2 ;
151158	if  (fbdev_flags  &  SLEDFB_P4EN ) {
152159		buf  =  malloc (fbdev_w  *  fbdev_h  *  4 );
160+ 	} else  if  (fbdev_flags  &  SLEDFB_P2EN ) {
161+ 		buf  =  malloc (fbdev_w  *  fbdev_h  *  2 );
153162	} else  {
154163		buf  =  malloc (fbdev_w  *  fbdev_h  *  3 );
155164	}
@@ -179,7 +188,15 @@ int set(int _modno, int x, int y, RGB color) {
179188	assert (x  <  fbdev_w );
180189	assert (y  <  fbdev_h );
181190
182- 	if  (!(fbdev_flags  &  SLEDFB_PLANAR )) {
191+ 	if  (fbdev_flags  &  SLEDFB_P2EN ) {
192+ 		int  i  =  x  +  (y  *  fbdev_w );
193+ 		int  r  =  color .red  >> 3 ;
194+ 		int  g  =  color .green  >> 2 ;
195+ 		int  b  =  color .blue  >> 3 ;
196+ 		int  p  =  (r  << 11 ) | (g  << 5 ) | b ;
197+ 		buf [2 * i ] =  p  &  0xff ;
198+ 		buf [2 * i  +  1 ] =  p  >> 8 ;
199+ 	} else  if  (!(fbdev_flags  &  SLEDFB_PLANAR )) {
183200		int  i  =  (x  +  (y  *  fbdev_w )) *  ((fbdev_flags  &  SLEDFB_P4EN ) ? 4  : 3 );
184201		if  (fbdev_flags  &  SLEDFB_P4AF )
185202			i ++ ;
0 commit comments