FTDI Community

Please login or register.

Login with username, password and session length.
Advanced Search  

News:

Welcome to the FTDI Community!

Please read our Welcome Note

Technical Support enquires
please contact the team
@ FTDI Support


New Bridgetek Community is now open

Please note that we have created the Bridgetek Community to discuss all Bridgetek products e.g. EVE, MCU.

Please follow this link and create a new user account to get started.

Bridgetek Community

Show Posts

You can view here all posts made by this member. Note that you can only see posts made in areas to which you currently have access.

Messages - Farid

Pages: [1]
1
Discussion - Software / Re: Loading an image with FT813 issues
« on: May 01, 2018, 12:55:38 AM »
hello,

I have managed to display a start Icon on my LCD using the hex data defined in uint8_t home_start_icon[]. Below is how I did that:

However, I have a home icon saved as a png image and I converted it to a hex file which I used in an array, and I followed same sequence in displaying the start Icon, but it not display when I run the code. Could anyone say what I need to change in the code below so that that png icon is displayed. I tried changing format from L4 to ARGB4, but no success.

void Display(void)   
{   
uint16_t length=0;
   
WaitCmdFifoEmpty();                //wait for FIFO read/write
   
ft813memWrite32(RAM_CMD + cmdOffset, CMD_INFLATE); 
cmdOffset = incCMDOffset(cmdOffset, 4);

ft813memWrite32(RAM_CMD + cmdOffset, START_ICON_ADDR); 
cmdOffset = incCMDOffset(cmdOffset, 4);
   
length=sizeof(home_start_icon);
cmd_WrCmdBuf(home_start_icon,length);                         //Load from RAM
WaitCmdFifoEmpty();                //wait for FIFO read/write
      
   
/** Start a new Display list ***********************************/
ft813memWrite16(REG_CMD_DL, 0);   // Start the display list
   
ft813memWrite32(RAM_CMD + cmdOffset, (CMD_DLSTART));   // Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4);
         
ft813memWrite32(RAM_CMD + cmdOffset, (DL_CLEAR_RGB |BLUE));   // same as CLEAR_COLOR_RGB(0, 0, 0) Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4); 
      
ft813memWrite32(RAM_CMD + cmdOffset, CLEAR(1,1,1))  ;
cmdOffset = incCMDOffset(cmdOffset, 4);
      
ft813memWrite32(RAM_CMD + cmdOffset, BITMAP_HANDLE(START_ICON_HANDLE));
cmdOffset = incCMDOffset(cmdOffset, 4);
   
ft813memWrite32(RAM_CMD + cmdOffset, BITMAP_SOURCE(START_ICON_ADDR));
cmdOffset = incCMDOffset(cmdOffset, 4);
   
ft813memWrite32(RAM_CMD + cmdOffset, BITMAP_LAYOUT(L4, 16, 32));//L4   
//ft813memWrite32(RAM_CMD + cmdOffset, BITMAP_LAYOUT(ARGB4, 140, 70));//L4
cmdOffset = incCMDOffset(cmdOffset, 4);
   
ft813memWrite32(RAM_CMD + cmdOffset, BITMAP_SIZE(NEAREST, BORDER, BORDER, 32, 32));
//ft813memWrite32(RAM_CMD + cmdOffset, BITMAP_SIZE(NEAREST, BORDER, BORDER, 70, 140));
 cmdOffset = incCMDOffset(cmdOffset, 4);

ft813memWrite32(RAM_CMD + cmdOffset, COLOR_RGB(255,25,0));     //used for making colors                                                                                 
cmdOffset = incCMDOffset(cmdOffset, 4);

ft813memWrite32(RAM_CMD +  cmdOffset,BEGIN(BITMAPS));      
cmdOffset = incCMDOffset(cmdOffset, 4);

ft813memWrite32(RAM_CMD +  cmdOffset,VERTEX2II(450,240,START_ICON_HANDLE,4));      
cmdOffset = incCMDOffset(cmdOffset, 4);
   
ft813memWrite32(RAM_CMD +  cmdOffset,END());      
cmdOffset = incCMDOffset(cmdOffset, 4);
      
LCD_Display();
}

void LCD_Display(void)
{
      
ft813memWrite32(RAM_CMD + cmdOffset, (DL_DISPLAY));      // Instruct the graphics processor to show the list
cmdOffset = incCMDOffset(cmdOffset, 4);                        // Update the command pointer

ft813memWrite32(RAM_CMD + cmdOffset, (CMD_SWAP));         // Make this list active
cmdOffset = incCMDOffset(cmdOffset, 4);                        // Update the command pointer

ft813memWrite16(REG_CMD_WRITE, (cmdOffset));         
}

2
Hi,

Thank you so much for the help! Now I am able to use the saved static display in my while loop.

I am also interested in setting up a few static displays to be used in different user display selections. Could you please add some lines of code to the previous code to demonstrate that.

Thanks,
Farid

3
You anybody comments on my previous issues?

I have noticed in my code that I am always reading 0 for the offset using this piece of code:
while(0!=ft813memRead16(REG_CMD_READ));

again here is how is setup the static backgound

void initMainStaticBackground(void)   
{   
WaitCmdFifoEmpty();  //wait for FIFO read/write

ft813memWrite32(RAM_CMD + cmdOffset, (CMD_DLSTART));   // Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4);   
   
 /* ------------------------------------------------------------------------------------------------------------------------------
Initialise a block of grahics RAM memory where the static part will be stored. Ensure that this does not overlap with any memory
used to store fonts or bitmaps etc. in the application
------------------------------------------------------------------------------------------------------------------------------ */   
cmd_memset(0, 0, 300*1024);                           // Set a block of memory to zeros between address 0 and address 10*1024
WaitCmdFifoEmpty();
 
ft813memWrite16(REG_CMD_WRITE, (cmdOffset));               // Update the ring buffer pointer so the graphics processor starts executing
   
/* ------------------------------------------------------------------------------------------------------------------------------
Create the static part of the display and store it within the ft813's RAM_G Send a co-processor list containing the static parts of
the display to the ft813 using the command FIFO in the normal way. The list does not however terminate with the usual
Display and Swap commands since the dynamic part of the list will be appended later.
 
The ft813 will now create the display list based on these commands as per normal ft813 operation and so the resulting display list
will now be in RAM_DL. This is the display list is needed to draw the static part of the display.       
------------------------------------------------------------------------------------------------------------------------------ */
      
ft813memWrite32(RAM_CMD + cmdOffset, DL_CLEAR_RGB);   // same as CLEAR_COLOR_RGB(0, 0, 0) Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4);      
   
ft813memWrite32(RAM_CMD + cmdOffset, (DL_CLEAR_RGB | BLUE));   // same as CLEAR_COLOR_RGB(0, 0, 0) Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4);      
              
ft813memWrite32(RAM_CMD + cmdOffset, CLEAR(1,1,1))  ; 
cmdOffset = incCMDOffset(cmdOffset, 4);   

ft813memWrite32(RAM_CMD + cmdOffset, TAG_MASK(1)); 
cmdOffset = incCMDOffset(cmdOffset, 4);
      
ft813memWrite32(RAM_CMD + cmdOffset, TAG(10)); 
cmdOffset = incCMDOffset(cmdOffset, 4);         
DisplayButton(10,10, 180, 60, 24,  OPT_FLAT, &Button1String[0],GREY,BLACK);
      
ft813memWrite32(RAM_CMD + cmdOffset, TAG(20)); 
cmdOffset = incCMDOffset(cmdOffset, 4);   
DisplayButton(10,110, 180, 60, 24, OPT_FLAT, &Button2String[0],GREY,BLACK);
      
ft813memWrite32(RAM_CMD + cmdOffset, TAG(30)); 
cmdOffset = incCMDOffset(cmdOffset, 4);   
DisplayButton(10,210, 180, 60, 24, OPT_FLAT, &Button3String[0],GREY,BLACK);

ft813memWrite32(RAM_CMD + cmdOffset, TAG(40)); 
cmdOffset = incCMDOffset(cmdOffset, 4);   
DisplayButton(10,310, 180, 60, 24, OPT_FLAT, &Button4String[0],GREY,BLACK);
   
ft813memWrite32(RAM_CMD + cmdOffset, TAG(50)); 
cmdOffset = incCMDOffset(cmdOffset, 4);
DisplayButton(10,410, 180, 60, 24, OPT_FLAT, &Button5String[0],GREY,BLACK);
      
ft813memWrite32(RAM_CMD + cmdOffset, TAG_MASK(0)); 
cmdOffset = incCMDOffset(cmdOffset, 4);

DisplayRECT(220,20,300,60,WHITE,10);
      

 /* ------------------------------------------------------------------------------------------------------------------------------
Read the REG_CMD_DL register to determine the end address for this new display list (as an offset from the start of RAM_DL). This
equates to the size of the display list and is needed for the following mem copy.       
------------------------------------------------------------------------------------------------------------------------------ */
WaitCmdFifoEmpty();

//    while(0!=ft813memRead16(REG_CMD_READ));

dloffset = ft813memRead16(REG_CMD_DL);
      
dloffset= (uint16_t)cmdOffset;
      
cmd_memcpy(4000L, RAM_DL, dloffset);  // copy a number of bytes equal to cmdoffset value from RAM_DL to 1000L address
               
ft813memWrite16(REG_CMD_WRITE, (cmdOffset));               // Update the ring buffer pointer so the graphics processor starts executing      
}

4
ISSUE#1:

further debugging have showed me that the memset function does not work: here is how I defined, and I passed the following parameters top it:
    cmd_memset(0, 0, 100*1024L);                           // Set a block of memory to zeros between address 0 and address 10*1024
    WaitCmdFifoEmpty();

If I comment out cmd_memset above, I still see the same issues as described in the previous post.

void cmd_memset(uint32_t ptr, uint32_t value, uint32_t num)
{                     
   ft800memWrite32(RAM_CMD + cmdOffset, CMD_MEMSET);
   cmdOffset = incCMDOffset(cmdOffset, 4);   
   
   ft800memWrite32(RAM_CMD + cmdOffset, ptr);
   cmdOffset = incCMDOffset(cmdOffset, 4);
   
   ft800memWrite32(RAM_CMD + cmdOffset, value);
   cmdOffset = incCMDOffset(cmdOffset, 4);
   
   ft800memWrite32(RAM_CMD + cmdOffset, num);
   cmdOffset = incCMDOffset(cmdOffset, 4);
}

ISSUE#2:

Another Issue that I run out into is that: dloffset = ft800memRead16(REG_CMD_DL); this functions always returns zero. So to get around this, I have to track the offset and use that value as shown below:
dloffset= (uint16_t)cmdOffset;
      
ft800memWrite32(RAM_CMD + cmdOffset, CMD_MEMCPY);  // Command to copy a block of memory within the FT800
cmdOffset = incCMDOffset(cmdOffset, 4);

ft800memWrite32(RAM_CMD + cmdOffset, 100*1024L);  // First parameter is destination, copy to address 1,000 decimal
cmdOffset = incCMDOffset(cmdOffset, 4);
       
ft800memWrite32(RAM_CMD + cmdOffset, RAM_DL);
cmdOffset = incCMDOffset(cmdOffset, 4);
      
ft800memWrite32(RAM_CMD + cmdOffset,dloffset);
cmdOffset = incCMDOffset(cmdOffset, 4);
      
ft800memWrite16(REG_CMD_WRITE, (cmdOffset));               // Update the ring buffer pointer so the graphics processor starts executing


5
Hi,

Thank you so much for your reply. It's a helpful.

I managed to implement the append function; however, I was not able to see all of my display list. for example I am able to see only 3 buttons instead of 5 button, an no rectangle or dot.
I think the issue here is that I run out of RAM. I tried changing the ram space, but with no success. This is the function I used to change ram space:

cmd_memset(0, 0, 10 * 2048);


below is the display list:

ft800memWrite32(RAM_CMD + cmdOffset, (CMD_DLSTART));   // Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4);                        

ft800memWrite32(RAM_CMD + cmdOffset, DL_CLEAR_RGB);   // same as CLEAR_COLOR_RGB(0, 0, 0) Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4);      
   
ft800memWrite32(RAM_CMD + cmdOffset, (DL_CLEAR_RGB | BLUE));   // same as CLEAR_COLOR_RGB(0, 0, 0) Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4);      
              
ft800memWrite32(RAM_CMD + cmdOffset, CLEAR(1,1,1))  ; 
cmdOffset = incCMDOffset(cmdOffset, 4);   
      
ft800memWrite32(RAM_CMD + cmdOffset, TAG_MASK(1)); 
cmdOffset = incCMDOffset(cmdOffset, 4);
      
ft800memWrite32(RAM_CMD + cmdOffset, TAG(10)); 
cmdOffset = incCMDOffset(cmdOffset, 4);         
DisplayButton(10,10, 180, 60, 24,  OPT_FLAT, &Button1String[0],GREY,BLACK);
      
ft800memWrite32(RAM_CMD + cmdOffset, TAG(20)); 
cmdOffset = incCMDOffset(cmdOffset, 4);   
DisplayButton(10,110, 180, 60, 24, OPT_FLAT, &Button2String[0],GREY,BLACK);
      
ft800memWrite32(RAM_CMD + cmdOffset, TAG(30)); 
cmdOffset = incCMDOffset(cmdOffset, 4);   
DisplayButton(10,210, 180, 60, 24, OPT_FLAT, &Button3String[0],GREY,BLACK);
      
ft800memWrite32(RAM_CMD + cmdOffset, TAG(40)); 
cmdOffset = incCMDOffset(cmdOffset, 4);   
DisplayButton(10,310, 180, 60, 24, OPT_FLAT, &Button4String[0],GREY,BLACK);
      
ft800memWrite32(RAM_CMD + cmdOffset, TAG(50)); 
cmdOffset = incCMDOffset(cmdOffset, 4);
DisplayButton(10,410, 180, 60, 24, OPT_FLAT, &Button5String[0],GREY,BLACK);
      
ft800memWrite32(RAM_CMD + cmdOffset, TAG_MASK(0)); 
cmdOffset = incCMDOffset(cmdOffset, 4);
      
DisplayDOT(point_x1,point_y1,color,point_size);
DisplayRECT(220,20,300,60,WHITE,10);
ft800memWrite32(RAM_CMD + cmdOffset, COLOR_RGB(255,0,0));                                                                                      
cmdOffset = incCMDOffset(cmdOffset, 4);

6
Discussion - Software / Re: Loading an image with FT813 issues
« on: April 20, 2018, 12:46:23 AM »
Hi guys!

Can anyone comment on my previous question. below is how I called cmd_loadimage inside main.

int main()
{
cmdOffset= WaitCmdFifoEmpty();

ft800memWrite32(RAM_CMD + cmdOffset, (CMD_DLSTART));   // Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4);                        // Update the command pointer

ft800memWrite32(RAM_CMD + cmdOffset, DL_CLEAR_RGB);   // same as CLEAR_COLOR_RGB(0, 0, 0) Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4);      
   
ft800memWrite32(RAM_CMD + cmdOffset, (DL_CLEAR_RGB | WHITE));   // same as CLEAR_COLOR_RGB(0, 0, 0) Start the display list
cmdOffset = incCMDOffset(cmdOffset, 4);      
              
ft800memWrite32(RAM_CMD + cmdOffset, CLEAR(1,1,1)); 
cmdOffset = incCMDOffset(cmdOffset, 4);   

cmd_loadimage(&logo[0],0L,404,0);

ft800memWrite32(RAM_CMD + cmdOffset, BITMAP_SOURCE(0L)); 
cmdOffset = incCMDOffset(cmdOffset, 4);   

ft800memWrite32(RAM_CMD + cmdOffset, BITMAP_LAYOUT(RGB565, 200, 65)); 
cmdOffset = incCMDOffset(cmdOffset, 4);   

ft800memWrite32(RAM_CMD + cmdOffset, BITMAP_SIZE(NEAREST, BORDER, BORDER, 200, 65)); 
cmdOffset = incCMDOffset(cmdOffset, 4);   

ft800memWrite32(RAM_CMD + cmdOffset, BEGIN(BITMAPS));       
cmdOffset = incCMDOffset(cmdOffset, 4);   

ft800memWrite32(RAM_CMD + cmdOffset, VERTEX2II(77, 90, 0, 0));                                 
cmdOffset = incCMDOffset(cmdOffset, 4);   

ft800memWrite32(RAM_CMD + cmdOffset, DISPLAY());       
cmdOffset = incCMDOffset(cmdOffset, 4);   
      
ft800memWrite32(RAM_CMDcmdOffset,CMD_SWAP);                                                                         cmdOffset = incCMDOffset(cmdOffset, 4);   
      
ft800memWrite16(REG_CMD_WRITE, (cmdOffset));  // Update the ring buffer pointer so the graphics processor starts executing
}            

7
Discussion - Software / FT813 how to update a portion of a display
« on: April 18, 2018, 06:31:39 PM »
Can anyone tell me how to update only a portion of an LCD display. In my case, I need to display a numeric value on the main display once a user touches a certain button.

Now I am just transmitting the entire display content every 200 ms(which I dont think is efficient)

Thank you!

8
Discussion - Software / Loading an image with FT813 issues
« on: April 18, 2018, 06:21:54 PM »
I am trying to load a JPEG image using the function below. if I call this function in my code, my whole program stops working, can anyone tells me what I am doing wrong here?


cmd_loadimage(&logo[0],0L,404,0);

void cmd_loadimage(uint8_t img[], uint32_t ptr, uint32_t length, uint32_t opt)
{   
   uint32_t i;

   ft800memWrite32(RAM_CMD + cmdOffset, CMD_LOADIMAGE);
   cmdOffset = incCMDOffset(cmdOffset, 4);
   ft800memWrite32(RAM_CMD + cmdOffset, ptr);
   cmdOffset = incCMDOffset(cmdOffset, 4);
   ft800memWrite32(RAM_CMD + cmdOffset, opt);
   cmdOffset = incCMDOffset(cmdOffset, 4);
   
   for (i = 0; i < length; i++)
   {
     ft800memWrite8(RAM_CMD + cmdOffset, img);   
      cmdOffset++;
   }

}

Pages: [1]