@@ -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