 include/directfb.h        |    7 +++++--
 src/core/surfaces.c       |   10 ++++++++++
 src/gfx/convert.c         |    6 ++++++
 src/gfx/convert.h         |   15 ++++++++++++++-
 src/gfx/generic/generic.c |   41 +++++++++++++++++++++++++++++++++++++++++
 src/idirectfb.c           |    1 +
 src/misc/conf.c           |    1 +
 src/misc/gfx_util.c       |    4 ++++
 systems/fbdev/fbdev.c     |   16 ++++++++++++++++
 9 files changed, 98 insertions(+), 3 deletions(-)

diff --git a/include/directfb.h b/include/directfb.h
index 9e8b5ff..03c9284 100644
--- a/include/directfb.h
+++ b/include/directfb.h
@@ -1062,12 +1062,15 @@ typedef enum {
      DSPF_RGB444    = DFB_SURFACE_PIXELFORMAT( 26, 12, 0, 0, 0, 2, 0, 0, 0, 0, 0 ),
 
      /* 16 bit   RGB (2 byte, nothing @15, red 5@10, green 5@5, blue 5@0) */
-     DSPF_RGB555    = DFB_SURFACE_PIXELFORMAT( 27, 15, 0, 0, 0, 2, 0, 0, 0, 0, 0 )
+     DSPF_RGB555    = DFB_SURFACE_PIXELFORMAT( 27, 15, 0, 0, 0, 2, 0, 0, 0, 0, 0 ),
+
+     /* 16 bit   BGR (2 byte, nothing @15, red 5@0, green 5@5, blue 5@10) */
+     DSPF_BGR555    = DFB_SURFACE_PIXELFORMAT( 28, 15, 0, 0, 0, 2, 0, 0, 0, 0, 0 )
 
 } DFBSurfacePixelFormat;
 
 /* Number of pixelformats defined */
-#define DFB_NUM_PIXELFORMATS            28
+#define DFB_NUM_PIXELFORMATS            29
 
 /* These macros extract information about the pixel format. */
 #define DFB_PIXELFORMAT_INDEX(fmt)      (((fmt) & 0x0000007F)      )
diff --git a/src/core/surfaces.c b/src/core/surfaces.c
index f15d99a..d118d8a 100644
--- a/src/core/surfaces.c
+++ b/src/core/surfaces.c
@@ -1110,6 +1110,7 @@ DFBResult dfb_surface_init ( CoreDFB                *core,
           case DSPF_YV12:
           case DSPF_RGB444:
           case DSPF_RGB555:
+          case DSPF_BGR555:
                break;
 
           default:
@@ -1242,6 +1243,7 @@ DFBResult dfb_surface_dump( CoreDFB     *core,
           case DSPF_UYVY:
           case DSPF_RGB444:
           case DSPF_RGB555:
+          case DSPF_BGR555:
                rgb   = true;
                break;
 
@@ -1417,6 +1419,14 @@ DFBResult dfb_surface_dump( CoreDFB     *core,
                     }
                     break;
 
+               case DSPF_BGR555:
+                    for (n=0, n3=0; n<surface->width; n++, n3+=3) {
+                         buf_p[n3+0] = (data16[n] & 0x001F) >> 7;
+                         buf_p[n3+1] = (data16[n] & 0x03E0) >> 2;
+                         buf_p[n3+2] = (data16[n] & 0x7C00) << 3;
+                    }
+                    break;
+
                case DSPF_ARGB2554:
                     for (n=0, n3=0; n<surface->width; n++, n3+=3) {
                          buf_p[n3+0] = (data16[n] & 0x3E00) >> 6;
diff --git a/src/gfx/convert.c b/src/gfx/convert.c
index 55dfe74..0546e6e 100644
--- a/src/gfx/convert.c
+++ b/src/gfx/convert.c
@@ -77,6 +77,9 @@ dfb_color_to_pixel( DFBSurfacePixelFormat format,
           case DSPF_RGB555:
                pixel = PIXEL_RGB555( r, g, b );
                break;
+          case DSPF_BGR555:
+               pixel = PIXEL_BGR555( r, g, b );
+               break;
           case DSPF_ARGB2554:
                pixel = PIXEL_ARGB2554( 0, r, g, b );
                break;
@@ -137,6 +140,9 @@ dfb_pixelformat_name( DFBSurfacePixelFormat format )
           case DSPF_RGB555:
                return "RGB555";
 
+          case DSPF_BGR555:
+               return "BGR555";
+
           case DSPF_RGB16:
                return "RGB16";
 
diff --git a/src/gfx/convert.h b/src/gfx/convert.h
index a5b6792..69433de 100644
--- a/src/gfx/convert.h
+++ b/src/gfx/convert.h
@@ -45,10 +45,14 @@
                                  (((g)&0xF8) << 2) | \
                                  (((b)&0xF8) >> 3) )
 
-#define PIXEL_RGB555(r,g,b)  ( (((r)&0xF8) << 7) | \
+#define PIXEL_RGB555(r,g,b)    ( (((r)&0xF8) << 7) | \
                                  (((g)&0xF8) << 2) | \
                                  (((b)&0xF8) >> 3) )
 
+#define PIXEL_BGR555(r,g,b)    ( (((r)&0xF8) >> 3) | \
+				 (((g)&0xF8) << 2) | \
+				 (((b)&0xF8) << 7) )
+
 #define PIXEL_ARGB2554(a,r,g,b)( (((a)&0xC0) << 8) | \
                                  (((r)&0xF8) << 6) | \
                                  (((g)&0xF8) << 1) | \
@@ -157,6 +161,10 @@
                                       (((pixel) & 0x03E0) << 6) | \
                                       (((pixel) & 0x001F) << 3) )
 
+#define ARGB1555_TO_BGR555(pixel) ( (((pixel) & 0x001F) << 9) | \
+                                    (((pixel) & 0x03E0) << 6) | \
+                                    (((pixel) & 0x7C00) << 3) )
+
 #define ARGB1555_TO_RGB444(pixel) ( (((pixel) & 0x7800) >> 3) | \
                                       (((pixel) & 0x03C0) >> 2) | \
                                       (((pixel) & 0x001E) >> 1) )
@@ -264,6 +272,11 @@
 #define ARGB_TO_RGB555(pixel)  ( (((pixel) & 0x00F80000) >>  9) | \
                                    (((pixel) & 0x0000F800) >>  6) | \
                                    (((pixel) & 0x000000F8) >>  3) )
+
+#define ARGB_TO_BGR555(pixel)  ( (((pixel) & 0x000000F8) >> 9 ) | \
+                                 (((pixel) & 0x0000F800) >> 6 ) | \
+                                 (((pixel) & 0x00F80000) >> 3 ) )
+ 
 /* RGB <-> YCbCr conversion */
 
 extern const u16 y_for_rgb[256];
diff --git a/src/gfx/generic/generic.c b/src/gfx/generic/generic.c
index 26db206..8697703 100644
--- a/src/gfx/generic/generic.c
+++ b/src/gfx/generic/generic.c
@@ -171,6 +171,24 @@ static void gInit_64bit();
 #define B_MASK 0x001f
 #include "template_acc_16.h"
 
+/* BGR555 */
+#define EXPAND_Ato8( a ) 0xFF
+#define EXPAND_Rto8( r ) EXPAND_5to8( r )
+#define EXPAND_Gto8( g ) EXPAND_5to8( g )
+#define EXPAND_Bto8( b ) EXPAND_5to8( b )
+#define PIXEL_OUT( a, r, g, b ) PIXEL_BGR555( r, g, b )
+#define Sop_PFI_OP_Dacc( op ) Sop_bgr555_##op##_Dacc
+#define Sacc_OP_Aop_PFI( op ) Sacc_##op##_Aop_bgr555
+#define A_SHIFT 0
+#define R_SHIFT 0
+#define G_SHIFT 5
+#define B_SHIFT 10
+#define A_MASK 0
+#define R_MASK 0x001f
+#define G_MASK 0x03e0
+#define B_MASK 0x7c00
+#include "template_acc_16.h"
+
 /* ARGB2554 */
 #define EXPAND_Ato8( a ) EXPAND_2to8( a )
 #define EXPAND_Rto8( r ) EXPAND_5to8( r )
@@ -449,6 +467,7 @@ static GenefxFunc Cop_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,               /* DSPF_LUT2 */
      Cop_to_Aop_16,      /* DSPF_RGB444 */
      Cop_to_Aop_16,      /* DSPF_RGB555 */
+     Cop_to_Aop_16,      /* DSPF_BGR555 */
 };
 
 /********************************* Cop_toK_Aop_PFI ****************************/
@@ -587,6 +606,7 @@ static GenefxFunc Cop_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                    /* DSPF_LUT2 */
      Cop_toK_Aop_12,          /* DSPF_RGB444 */
      Cop_toK_Aop_15,          /* DSPF_RGB555 */
+     Cop_toK_Aop_15,          /* DSPF_BGR555 */
 };
 
 /********************************* Bop_PFI_to_Aop_PFI *************************/
@@ -661,6 +681,7 @@ static GenefxFunc Bop_PFI_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,               /* DSPF_LUT2 */
      Bop_16_to_Aop,      /* DSPF_RGB444 */
      Bop_16_to_Aop,      /* DSPF_RGB555 */
+     Bop_16_to_Aop,      /* DSPF_BGR555 */
 };
 
 /********************************* Bop_PFI_Kto_Aop_PFI ************************/
@@ -872,6 +893,7 @@ static GenefxFunc Bop_PFI_Kto_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                    /* DSPF_LUT2 */
      Bop_12_Kto_Aop,          /* DSPF_RGB444 */
      Bop_15_Kto_Aop,          /* DSPF_RGB555 */
+     Bop_15_Kto_Aop,          /* DSPF_BGR555 */
 };
 
 /********************************* Bop_PFI_toK_Aop_PFI ************************/
@@ -1009,6 +1031,7 @@ static GenefxFunc Bop_PFI_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                    /* DSPF_LUT2 */
      Bop_12_toK_Aop,          /* DSPF_RGB444 */
      Bop_15_toK_Aop,          /* DSPF_RGB555 */
+     Bop_15_toK_Aop,          /* DSPF_BGR555 */
 };
 
 /********************************* Bop_PFI_KtoK_Aop_PFI ***********************/
@@ -1042,6 +1065,7 @@ static GenefxFunc Bop_PFI_KtoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                    /* DSPF_LUT2 */
      Bop_12_KtoK_Aop,         /* DSPF_RGB444 */
      Bop_15_KtoK_Aop,         /* DSPF_RGB555 */
+     Bop_15_KtoK_Aop,         /* DSPF_BGR555 */
 };
 
 /********************************* Bop_PFI_Sto_Aop_PFI ************************/
@@ -1540,6 +1564,7 @@ static GenefxFunc Bop_PFI_SKto_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                    /* DSPF_LUT2 */
      Bop_12_SKto_Aop,         /* DSPF_RGB444 */
      Bop_15_SKto_Aop,         /* DSPF_RGB555 */
+     Bop_15_SKto_Aop,         /* DSPF_BGR555 */
 };
 
 /********************************* Bop_PFI_StoK_Aop_PFI ***********************/
@@ -1573,6 +1598,7 @@ static GenefxFunc Bop_PFI_StoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                    /* DSPF_LUT2 */
      Bop_12_StoK_Aop,         /* DSPF_RGB444 */
      Bop_15_StoK_Aop,         /* DSPF_RGB555 */
+     Bop_15_StoK_Aop,         /* DSPF_BGR555 */
 };
 
 /********************************* Bop_PFI_SKtoK_Aop_PFI **********************/
@@ -1606,6 +1632,7 @@ static GenefxFunc Bop_PFI_SKtoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                    /* DSPF_LUT2 */
      Bop_12_SKtoK_Aop,        /* DSPF_RGB444 */
      Bop_15_SKtoK_Aop,        /* DSPF_RGB555 */
+     Bop_15_SKtoK_Aop,        /* DSPF_BGR555 */
 };
 
 /********************************* Sop_PFI_Sto_Dacc ***************************/
@@ -2000,6 +2027,7 @@ static GenefxFunc Sop_PFI_Sto_Dacc[DFB_NUM_PIXELFORMATS] = {
      NULL,                         /* DSPF_LUT2 */
      Sop_xrgb4444_Sto_Dacc,        /* DSPF_RGB444 */
      Sop_xrgb1555_Sto_Dacc,        /* DSPF_RGB555 */
+     Sop_bgr555_Sto_Dacc,          /* DSPF_BGR555 */
 };
 
 /********************************* Sop_PFI_SKto_Dacc **************************/
@@ -2418,6 +2446,7 @@ static GenefxFunc Sop_PFI_SKto_Dacc[DFB_NUM_PIXELFORMATS] = {
      NULL,                         /* DSPF_LUT2 */
      Sop_xrgb4444_SKto_Dacc,       /* DSPF_RGB444 */
      Sop_xrgb1555_SKto_Dacc,       /* DSPF_RGB555 */
+     Sop_bgr555_SKto_Dacc,         /* DSPF_BGR555 */
 };
 
 /********************************* Sop_PFI_to_Dacc ****************************/
@@ -2784,6 +2813,7 @@ static GenefxFunc Sop_PFI_to_Dacc[DFB_NUM_PIXELFORMATS] = {
      NULL,                         /* DSPF_LUT2 */
      Sop_xrgb4444_to_Dacc,         /* DSPF_RGB444 */
      Sop_xrgb1555_to_Dacc,         /* DSPF_RGB555 */
+     Sop_bgr555_to_Dacc,           /* DSPF_BGR555 */
 };
 
 /********************************* Sop_PFI_Kto_Dacc ***************************/
@@ -3179,6 +3209,7 @@ static GenefxFunc Sop_PFI_Kto_Dacc[DFB_NUM_PIXELFORMATS] = {
      NULL,                         /* DSPF_LUT2 */
      Sop_xrgb4444_Kto_Dacc,        /* DSPF_RGB444 */
      Sop_xrgb1555_Kto_Dacc,        /* DSPF_RGB555 */
+     Sop_bgr555_Kto_Dacc,          /* DSPF_BGR555 */
 };
 
 /********************************* Sacc_to_Aop_PFI ****************************/
@@ -3689,6 +3720,7 @@ static GenefxFunc Sacc_to_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                         /* DSPF_LUT2 */
      Sacc_to_Aop_xrgb4444,         /* DSPF_RGB444 */
      Sacc_to_Aop_xrgb1555,         /* DSPF_RGB555 */
+     Sacc_to_Aop_bgr555,           /* DSPF_BGR555 */
 };
 
 /********************************* Sacc_Sto_Aop_PFI ***************************/
@@ -4245,6 +4277,7 @@ static GenefxFunc Sacc_Sto_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                         /* DSPF_LUT2 */
      Sacc_Sto_Aop_xrgb4444,        /* DSPF_RGB444 */
      Sacc_Sto_Aop_xrgb1555,        /* DSPF_RGB555 */
+     Sacc_Sto_Aop_bgr555,          /* DSPF_BGR555 */
 };
 
 /********************************* Sacc_toK_Aop_PFI ***************************/
@@ -4584,6 +4617,7 @@ static GenefxFunc Sacc_toK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                         /* DSPF_LUT2 */
      Sacc_toK_Aop_xrgb4444,        /* DSPF_RGB444 */
      Sacc_toK_Aop_xrgb1555,        /* DSPF_RGB555 */
+     Sacc_toK_Aop_bgr555,          /* DSPF_BGR555 */
 };
 
 /********************************* Sacc_StoK_Aop_PFI **************************/
@@ -4617,6 +4651,7 @@ static GenefxFunc Sacc_StoK_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                         /* DSPF_LUT2 */
      Sacc_StoK_Aop_xrgb4444,       /* DSPF_RGB444 */
      Sacc_StoK_Aop_xrgb1555,       /* DSPF_RGB555 */
+     Sacc_StoK_Aop_bgr555,         /* DSPF_BGR555 */
 };
 
 /************** Bop_a8_set_alphapixel_Aop_PFI *********************************/
@@ -5432,6 +5467,7 @@ static GenefxFunc Bop_a1_set_alphapixel_Aop_PFI[DFB_NUM_PIXELFORMATS] = {
      NULL,                                        /* DSPF_LUT2 */
      NULL,                                        /* DSPF_RGB444 */
      NULL,                                        /* DSPF_RGB555 */
+     NULL,                                        /* DSPF_BGR555 */
 };
 
 
@@ -6164,6 +6200,7 @@ static GenefxFunc Bop_argb_blend_alphachannel_src_invsrc_Aop_PFI[DFB_NUM_PIXELFO
      NULL,                                             /* DSPF_LUT2 */
      NULL,                                             /* DSPF_RGB444 */
      NULL,                                             /* DSPF_RGB555 */
+     NULL,                                             /* DSPF_BGR555 */
 };
 
 /* A8/A1 to YCbCr */
@@ -6638,6 +6675,9 @@ bool gAcquire( CardState *state, DFBAccelerationMask accel )
           case DSPF_RGB555:
                gfxs->Cop = PIXEL_RGB555( color.r, color.g, color.b );
                break;
+          case DSPF_BGR555:
+               gfxs->Cop = PIXEL_BGR555(color.r, color.g, color.b );
+               break;
           default:
                D_ONCE("unsupported destination format");
                return false;
@@ -6663,6 +6703,7 @@ bool gAcquire( CardState *state, DFBAccelerationMask accel )
                case DSPF_RGB332:
                case DSPF_RGB444:
                case DSPF_RGB555:
+               case DSPF_BGR555:
                     if (dst_ycbcr &&
                         state->blittingflags & (DSBLIT_COLORIZE |
                                                 DSBLIT_SRC_PREMULTCOLOR))
diff --git a/src/idirectfb.c b/src/idirectfb.c
index 1018233..f1bd028 100644
--- a/src/idirectfb.c
+++ b/src/idirectfb.c
@@ -491,6 +491,7 @@ IDirectFB_CreateSurface( IDirectFB                    *thiz,
           case DSPF_NV16:
           case DSPF_RGB444:
           case DSPF_RGB555:
+          case DSPF_BGR555:
                break;
 
           default:
diff --git a/src/misc/conf.c b/src/misc/conf.c
index 7001672..ddedcb0 100644
--- a/src/misc/conf.c
+++ b/src/misc/conf.c
@@ -200,6 +200,7 @@ static const FormatString format_strings[] = {
      { "RGB332",   DSPF_RGB332   },
      { "RGB444",   DSPF_RGB444   },
      { "RGB555",   DSPF_RGB555   },
+     { "BGR555",   DSPF_BGR555   },
      { "UYVY",     DSPF_UYVY     },
      { "YUY2",     DSPF_YUY2     },
      { "YV12",     DSPF_YV12     },
diff --git a/src/misc/gfx_util.c b/src/misc/gfx_util.c
index 84bf1d3..736895d 100644
--- a/src/misc/gfx_util.c
+++ b/src/misc/gfx_util.c
@@ -439,6 +439,10 @@ static void write_argb_span (u32 *src, u8 *dst[], int len,
                     ((u16*)d)[i] = ARGB_TO_RGB555( src[i] );
                break;
 
+          case DSPF_BGR555:
+               for (i = 0; i < len; i++)
+                    ((u16*)d)[i] = ARGB_TO_BGR555( src[i] );
+
           case DSPF_RGB444:
                for (i = 0; i < len; i++)
                     ((u16*)d)[i] = ARGB_TO_RGB444( src[i] );
diff --git a/systems/fbdev/fbdev.c b/systems/fbdev/fbdev.c
index ea63d60..55abb30 100644
--- a/systems/fbdev/fbdev.c
+++ b/systems/fbdev/fbdev.c
@@ -1548,6 +1548,9 @@ static DFBSurfacePixelFormat dfb_fbdev_get_pixelformat( struct fb_var_screeninfo
                if (dfb_fbdev_compatible_format( var, 0, 5, 5, 5, 0, 10, 5, 0 ))
                     return DSPF_RGB555;
 
+               if (dfb_fbdev_compatible_format( var, 0, 5, 5, 5, 0, 0, 5, 10 ))
+                    return DSPF_BGR555;
+
                if(dfb_fbdev_compatible_format( var, 1, 5, 5, 5, 15, 10, 5, 0 ))
                    return DSPF_ARGB1555;
 
@@ -1558,6 +1561,9 @@ static DFBSurfacePixelFormat dfb_fbdev_get_pixelformat( struct fb_var_screeninfo
                if (dfb_fbdev_compatible_format( var, 0, 5, 5, 5, 0, 10, 5, 0 ))
                     return DSPF_RGB555;
 
+               if (dfb_fbdev_compatible_format( var, 0, 5, 5, 5, 0, 0, 5, 10 ))
+                    return DSPF_BGR555;
+
                if(dfb_fbdev_compatible_format( var, 1, 5, 5, 5, 15, 10, 5, 0 ))
                    return DSPF_ARGB1555;
 
@@ -1760,6 +1766,15 @@ static DFBResult dfb_fbdev_set_mode( CoreSurface           *surface,
                     var.blue.offset   = 0;
                     break;
 
+               case DSPF_BGR555:
+                    var.red.length    = 5;
+                    var.green.length  = 5;
+                    var.blue.length   = 5;
+                    var.red.offset    = 0;
+                    var.green.offset  = 5;
+                    var.blue.offset   = 10;
+                    break;
+
                case DSPF_ARGB4444:
                     var.transp.length = 4;
                     var.red.length    = 4;
@@ -2265,6 +2280,7 @@ static DFBResult dfb_fbdev_set_gamma_ramp( DFBSurfacePixelFormat format )
      switch (format) {
           case DSPF_ARGB1555:
           case DSPF_RGB555:
+          case DSPF_BGR555:
                red_size   = 32;
                green_size = 32;
                blue_size  = 32;
