SSD1322

sam76
Posts: 15
Joined: Fri May 03, 2013 8:07 am

SSD1322

Postby sam76 » Wed May 15, 2013 2:45 pm

Hi !

One day, One problem.

Today I look for writing a Gfx driver for my ssd1322 Oled display.

May be I say bullshit but this is what I have understand about the display :
- The display have a 4 bpp depth, so I need to have 2 pixels for sending one data byte.
- Worst : Columns are addressing 4 by 4 (May be it is configurable at init ?), so I need to have 4 pixels for sending.

This is what I have written for testing the 2 pixels 'frame buffer' :

Code: Select all

void gdisp_lld_draw_pixel(coord_t x, coord_t y, color_t color) {
//We need to send 2 pixel at a time for 4 bpp depth
//So impair pixel must be kept for sending with the next one (the pair pixel associate with this one)

        static waiting_pixel;
        static waiting_pixel_x;
        static waiting_pixel_y;
        static waiting_pixel_color;

        #if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
                if (x < GDISP.clipx0 || y < GDISP.clipy0 || x >= GDISP.clipx1 || y >= GDISP.clipy1) return;
        #endif

        //if imppair pixel
        if ( x&0x01 )
        {
                acquire_bus();
                setviewport(x, y, 1, 1);

                if (!waiting_pixel)
                        waiting_pixel_color = 0;
                write_cmd1(RAMWR, ( (waiting_pixel_color<<4) & 0xF0) | ( color & 0x0F) );

                release_bus();
                waiting_pixel = 0;
        }
        else    //else impair pixel
        {
                //if we have one pixel waiting but actuel pixel is not the pair
                // we send the last pixel with a black associated impair pixel
                if (waiting_pixel)
                        gdisp_lld_draw_pixel(waiting_pixel_x + 1, waiting_pixel_y, 0);

                //Store the new impair pixel
                waiting_pixel = 1;
                waiting_pixel_x = x;
                waiting_pixel_y = y;
                waiting_pixel_color = color;

        }
}


I can have a problem and erase some pixels with this algorithm.
For 4 pixels, it will be more compicated and the possiblity of losing of pixels grown.

The only way I see is to store ALL unfinished group of 4 pixels. and flush them at the end. It is a fractionned frame buffer. In the worst case, I will use a complete frame buffer of 8ko (256x64/2)

I heard about ccm Ram, can I store this to ccm ? Is ChibiOs use ccm ?

Do you see another method ?

User avatar
Tectu
Posts: 1226
Joined: Thu May 10, 2012 9:50 am
Location: Switzerland
Contact:

Re: SSD1322

Postby Tectu » Sun May 19, 2013 1:35 pm

After the talk on IRC, do you still need help here or did you get it working in the meantime?

And yes, there's a linker script to use the CCM memory. It's already in the Makefile of the F4 Discovery demo - you just have to uncomment it and comment out the other. But I've never used it myself.


~ Tectu

inmarket
Posts: 89
Joined: Fri Jul 27, 2012 1:37 pm
Location: Brisbane, Australia

Re: SSD1322

Postby inmarket » Thu Jun 13, 2013 3:07 am

Sorry for the delay in answering this. I didn't see it earlier due to my work load.

Take a look at the Nokia6610ge8 driver. It is a SPI 12 bit per pixel (4 bits per color component) driver. It supports that packing and unpacking that is required by the driver. Use that as your template on how to handle packing.

Note that draw_pixel() may be called with non-adjacent pixels so you cannot just save 1 pixel and wait for another pixel to complete the byte of data. Draw pixel needs to support drawing a singular non-adjacent pixel. If your controller doesn't allow this then you either need to memory map the display buffer (not good for low RAM processors) or use an internal read-pixel call to get the adjacent pixel before updating it.

Not that area fills and blits can be optimised to be more efficient just as it is for the Nokia6610Ge8 driver.


Return to “LCD Driver and Graphic Framework”

Who is online

Users browsing this forum: No registered users and 0 guests