@@ -48,6 +48,7 @@ struct fbinfo_s {
48
48
u32 xoffset , yoffset ;
49
49
u32 base ;
50
50
u32 screen_size ;
51
+ u16 cmap [256 ];
51
52
};
52
53
53
54
struct bcm2708_fb {
@@ -266,18 +267,31 @@ static inline u32 convert_bitfield(int val, struct fb_bitfield *bf)
266
267
return (val >> (16 - bf -> length ) & mask ) << bf -> offset ;
267
268
}
268
269
270
+
269
271
static int bcm2708_fb_setcolreg (unsigned int regno , unsigned int red ,
270
272
unsigned int green , unsigned int blue ,
271
273
unsigned int transp , struct fb_info * info )
272
274
{
273
275
struct bcm2708_fb * fb = to_bcm2708 (info );
274
276
277
+ /*pr_info("BCM2708FB: setcolreg %d:(%02x,%02x,%02x,%02x) %x\n", regno, red, green, blue, transp, fb->fb.fix.visual);*/
275
278
if (regno < 16 )
276
279
fb -> cmap [regno ] = convert_bitfield (transp , & fb -> fb .var .transp ) |
277
280
convert_bitfield (blue , & fb -> fb .var .blue ) |
278
281
convert_bitfield (green , & fb -> fb .var .green ) |
279
282
convert_bitfield (red , & fb -> fb .var .red );
280
283
284
+ if (regno < 256 ) {
285
+ /* blue [0:4], green [5:10], red [11:15] */
286
+ fb -> info -> cmap [regno ] = ((red >> (16 - 5 )) & 0x1f ) << 11 |
287
+ ((green >> (16 - 6 )) & 0x3f ) << 5 |
288
+ ((blue >> (16 - 5 )) & 0x1f ) << 0 ;
289
+ }
290
+ /* Hack: we need to tell GPU the palette has changed, but currently bcm2708_fb_set_par takes noticable time when called for every (256) colour */
291
+ /* So just call it for what looks like the last colour in a list for now. */
292
+ if (regno == 15 || regno == 255 )
293
+ bcm2708_fb_set_par (info );
294
+
281
295
return regno > 255 ;
282
296
}
283
297
0 commit comments