SAM4的TI图形库移植

分享到:

前几天一直了UCGUI的图形库部分,今天又接着把TIgrlib图形库移植到了Atmel SAM4的套件中。显示效果还可以。

图形库其实都是都是由底层的画点,画线等这些基本函数组成。大家以前上数学都有学过点成线,线成面这些的,而图形库也是基于此的。
TI的图形库分3层,如下图:
我们只需要修改显示驱动层即可。上面两层都是在调用最低层的驱动层。
显示驱动层函数要我们重写,不是很多,就只有几个函数而已:

 

如下截图:

 

分别是:
画点函数:void PixelDraw(void *pvDisplayData, long x, long y, unsigned longcolor)
画多点的函数:void PixelDrawMultiple(void *pvDisplayData,
                                                        longx,
                                                        longy,
                                                        longx0,
                                                        longlCount,
                                                        longBPP,
                                                        constunsigned char  *pucData,
                                                        constunsigned char  *pucPalette)
{        
画横线的函数:void LineDrawH (void *pvDisplayData,long x1,long x2, long y,unsigned long color)
画竖线的函数:void LineDrawH (void *pvDisplayData,long x1,long x2, long y,unsigned long color)
矩形填充函数:void RectFill (void *pvDisplayData, const tRectangle *pRect,unsigned long ulValue)
以下是我重写的源代码,我用的屏幕是2.4寸的TFT屏,主控是ILI9341SPI通信的。
画点函数:
void PixelDraw(void *pvDisplayData, long x,long y, unsigned long color)
{
         TFT_setXY(x,y);
         TFT_sendData16(color);
}
画线横线的函数:
void LineDrawH (void *pvDisplayData,longx1,long x2, long y, unsigned long color)
{
         int32_ti = 0;
         int32_tlength = x2 - x1;
         TFT_setCol(x1,x2);
         TFT_setPage(y,y);
         TFT_sendCMD(0x2c);

 

         TFT_DC_HIGH;

 

         //TFT_CS_LOW;

 

         for(; i < length; i++)

 

         {
                   SPI_transfer8(color>> 8);
                   SPI_transfer8(color& 0xff);
         }

 

         //TFT_CS_HIGH;   

 

 

}

 

画竖线的函数:
void LineDrawV (void *pvDisplayData,longx,long y1, long y2, unsigned long color)
{
int32_t i = 0;
         int32_tlength = y2 - y1;
         TFT_setCol(x,x);
         TFT_setPage(y1,y2);
         TFT_sendCMD(0x2c);
         TFT_DC_HIGH;
         //TFT_CS_LOW;

 

 

         for(; i < length; i++)

 

 

         {
                   SPI_transfer8(color>> 8);
                   SPI_transfer8(color& 0xff);
         }

 

         //TFT_CS_HIGH;   

 

}        
填充矩形的函数:
void RectFill (void *pvDisplayData, consttRectangle *pRect, unsigned long ulValue)
{

 

         uint32_tuY;

 

         for(uY = pRect->sYMin; uY <= pRect->sYMax; uY++)
         {
                   LineDrawH(0,pRect->sXMin, pRect->sXMax, uY, ulValue);
         }

 

}

 

最后的函数有些长的画多点的函数:
void PixelDrawMultiple(void *pvDisplayData,
                                                        longx,
                                                        longy,
                                                        longx0,
                                                        longlCount,
                                                        longBPP,
                                                        constunsigned char  *pucData,
                                                        constunsigned char  *pucPalette)
{        
         uint32_tulPixel = 0;
         uint32_tulColor = 0;
         TFT_setCol(x,DISPLAY_WIDTH);
         TFT_setPage(y,DISPLAY_HEIGHT);
         TFT_sendCMD(0x2c);

 

 

 

         if(BPP == 1)

 

 

 

         {
                   //1 bit per pixel in pucData
                   //lX0 is the index of the bit processed within a byte
                   //pucPalette holds the pre-translated 32bit display color
                   while(lCount)
                   {
                            ulPixel= *pucData++;

 

                            while(lCount && x0 < 8) // whilethere are pixels in this byte

 

                            {
                                     ulColor= ((uint32_t *) pucPalette)[ulPixel & 1];// retrieve already translatedcolor
                                     TFT_sendData16(ulColor);

 

                                     lCount--;            // processed another pixel

 

                                     x0++;                           // done with this bit
                                     ulPixel>>= 1;   // prepare next bit
                            }

 

                            x0= 0;      // process next byte, reset bitcounter

 

                   }
         }
         elseif (BPP == 4)
         {
                   //4 bits per pixel in pucData
                   //lX0 holds 0/1 to indicate 4-bit nibble within byte
                   //pucPalette holds untranslated 24 bit color
                   while(lCount)
                   {
                            if(x0 == 0)         // read first nibble
                            {
                                     ulPixel= *pucData >> 4;
                                     x0= 1;      // set index to second nibble
                            }
                            else
                            {                                    // readsecond nibble
                                     ulPixel= *pucData & 0x0f;
                                     pucData++;//increase byte pointer as we're done reading this byte
                                     x0= 0;      // set index to first nibble
                            }

 

                            ulColor= *(uint32_t *) (pucPalette + (ulPixel * 3)) & 0x00ffffff;// retrieve 24bit color

 

                            TFT_sendData16(COLOR24TO16BIT(ulColor));//translate and write to display

 

                            lCount--;  // processed another pixel

 

                   }
         }
         elseif (BPP == 8)
         {
                   //8 bits per pixel in pucData
                   //pucPalette holds untranslated 24 bit color
                   while(lCount)
                   {
                            ulPixel= *pucData++;               // read pixel
                            ulColor= *(uint32_t *) (pucPalette + (ulPixel * 3)) & 0x00ffffff;// retrieve 24bit color
                            TFT_sendData16(COLOR24TO16BIT(ulColor));//translate and write to display
                            lCount--;  // processed another pixel
                   }
         }
         elseif (BPP == 16)
         {
                   //16 bits per pixel
                   //Pixel is in 16bit color, 5R 6G 5B format
                   //No color translation needed for this display
                   while(lCount)
                   {
                            ulPixel= *((uint16_t *) pucData);
                            TFT_sendData16(ulPixel);
                            pucData+= 2;
                            lCount--;
                   }
         }
}
如果你的屏幕是控制芯片是其他的,可以拿厂家提供的底层驱动文件整合到TI的图形库的底层驱动中。

 

这次使用了TI图形库的库文件grlib.a,我加上grlib.h的头文件即可。工程结构如下图:

 

ti的图像库可以支持多种文件格式的输出到屏幕显示,还有画图像的函数。我也是参考坛友的帖子进行操作的。TI的图形库有个工具可以把图像转换成c的代码。只不过只支持pnm后缀的图片格式。我们可以用图像编辑软件转换格式。我使用了GIMP的软件进行转换。
具体在目录是StellarisWare\tools\bin

 

首先我们打开GMIP软件,然后可以直接把图片拖到编辑区,然后设置导出的参数,步奏如下:

 

软件默认转化后的文件放值得位置是在图片所在的目录:
软件默认是第一个选项,但这样生成的图片数据太大,转换软件会爆出:颜色太多的信息而导致转换失败。所以我就选择了网页优化版。
我们启动cmd,把目录切换到我们工具所在的位置,这些windows的命令自行百度去。我这里就不多说了,都是常用的命令。

 

 

然后打上pnmtoc -c image.pnm > image.cimage是你图片的文件名,回车后就会生成一个c的文本。
以下是我的测试图片:
 
 

更多Atmel及科技资讯请关注:  
Atmel中文官网:http://www.atmel.com/zh/cn/
Atmel技术论坛:http://atmel.eefocus.com/
Atmel中文博客:http://blog.sina.com.cn/u/2253031744
Atmel新浪微博:http://www.weibo.com/atmelcn

 


©2014 Atmel Corporation
facebook google plus twitter linkedin youku weibo blog rss