lkml.org 
[lkml]   [2015]   [Mar]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv3 08/10] fbdev: ssd1307fb: Add module parameter bitsperpixel.
    Date
    This patch adds a module parameter 'bitsperpixel' to adjust the colordepth
    of the framebuffer. All values >1 will result in memory map of the requested
    color depth. However only the MSB of each pixel will be sent to the device.
    The framebuffer identifies itself as a grayscale display with the specified
    depth.

    Signed-off-by: Thomas Niederprüm <niederp@physik.uni-kl.de>
    ---
    drivers/video/fbdev/ssd1307fb.c | 25 ++++++++++++++++---------
    1 file changed, 16 insertions(+), 9 deletions(-)

    diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
    index 7c8e627..3cf4da1 100644
    --- a/drivers/video/fbdev/ssd1307fb.c
    +++ b/drivers/video/fbdev/ssd1307fb.c
    @@ -44,6 +44,10 @@
    #define SSD1307FB_SET_VCOMH 0xdb

    #define REFRASHRATE 1
    +#define BITSPERPIXEL 1
    +
    +static u_int bitsperpixel = BITSPERPIXEL;
    +module_param(bitsperpixel, uint, 0);

    static u_int refreshrate = REFRASHRATE;
    module_param(refreshrate, uint, 0);
    @@ -99,7 +103,8 @@ static struct fb_fix_screeninfo ssd1307fb_fix = {
    };

    static struct fb_var_screeninfo ssd1307fb_var = {
    - .bits_per_pixel = 1,
    + .bits_per_pixel = BITSPERPIXEL,
    + .grayscale = 1,
    };

    static struct ssd1307fb_array *ssd1307fb_alloc_array(u32 len, u8 type)
    @@ -194,10 +199,11 @@ static void ssd1307fb_update_display(struct ssd1307fb_par *par)
    array->data[array_idx] = 0;
    for (k = 0; k < 8; k++) {
    u32 page_length = par->width * i;
    - u32 index = page_length + (par->width * k + j) / 8;
    + u32 index = page_length * bitsperpixel + (par->width * k + j) * bitsperpixel / 8;
    u8 byte = *(vmem + index);
    - u8 bit = byte & (1 << (j % 8));
    - bit = bit >> (j % 8);
    + u8 bit = byte & (((1 << (bitsperpixel))-1) << (j % 8/bitsperpixel));
    +
    + bit = (bit >> (j % 8/bitsperpixel)) >> (bitsperpixel-1);
    array->data[array_idx] |= bit << k;
    }
    }
    @@ -536,7 +542,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
    par->dclk_div = par->device_info->default_dclk_div;
    par->dclk_frq = par->device_info->default_dclk_frq;

    - vmem_size = par->width * par->height / 8;
    + vmem_size = par->width * par->height * bitsperpixel / 8;

    vmem = vzalloc(vmem_size);
    if (!vmem) {
    @@ -557,20 +563,21 @@ static int ssd1307fb_probe(struct i2c_client *client,

    info->fbops = &ssd1307fb_ops;
    info->fix = ssd1307fb_fix;
    - info->fix.line_length = par->width / 8;
    + info->fix.line_length = par->width * bitsperpixel / 8;
    info->fbdefio = ssd1307fb_defio;

    info->var = ssd1307fb_var;
    + info->var.bits_per_pixel = bitsperpixel;
    info->var.xres = par->width;
    info->var.xres_virtual = par->width;
    info->var.yres = par->height;
    info->var.yres_virtual = par->height;

    - info->var.red.length = 1;
    + info->var.red.length = bitsperpixel;
    info->var.red.offset = 0;
    - info->var.green.length = 1;
    + info->var.green.length = bitsperpixel;
    info->var.green.offset = 0;
    - info->var.blue.length = 1;
    + info->var.blue.length = bitsperpixel;
    info->var.blue.offset = 0;

    info->screen_base = (u8 __force __iomem *)vmem;
    --
    2.3.0


    \
     
     \ /
      Last update: 2015-03-09 23:41    [W:5.087 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site