1. 程式人生 > >基於樹莓派raspberry: 移植 2.4寸TFT顯示屏以及原始碼分析

基於樹莓派raspberry: 移植 2.4寸TFT顯示屏以及原始碼分析

有了樹莓派,但是沒有hdmi顯示器,這是個蛋疼的事,但是樹莓派就是樹莓派,他的GPIO管腳就是我們發揮想象力的地方.可以通過它的GPIO管腳來驅動一個顯示屏.GOOGLE了一下,這個專案有個老外做好了,而且提供了patch檔案,很容易就能移植到核心裡面去.這裡我就在這裡記錄一下移植這個TFT驅動的過程,然後試著分析這個老外提供的PATCH檔案,希望能從中提高自己的能力,也能夠熟悉一下核心的移植.

        環境: ubuntu 13.10 (交叉編譯按前面的文章設定)

        TFT :  2.4寸 12864介面  ILI9325主控 (當時叉寶買來給AVR用的)

個人原創,轉載請註明原文出處:

  博主最近自建了部落格,以後會更多的用那個了,歡迎關注訪問,裡面也有很多有用資源:

參考文章:

         http://spritesmods.com/?art=rpi_arcade&page=2

         http://www.blogjava.net/baicker/archive/2012/12/18/392829.html

首先上張圖:

                      

                     

一  首先是接線

      用的是P1口:

      

       TFT與P1連線:

      

    這個上面的VCC接的是3.3v,因為我的螢幕介面是5v,所以我給改成5v了.

二  新增TFT驅動到核心

     編譯核心的環境,就按之前的文章設定,這裡不再複述.

     用的是spritesmods.com/?art=rpi_arcade&page=2提供的diff檔案

     也可以到我的資源下載:

      這個補丁是基於3.6核心的,不同版本的核心可能不一樣,自己改一下就好了.

      首先把 該diff檔案放到核心根目錄下,終端進去該目錄:

  1. patch -p1 < ili9325_gpio_driver_rpi.diff  

      然後TFT核心原始碼就被新增到核心去了.  
  1. make menuconfig  
   可以在device driver >> graphics support >> support for frame buffer 下看到ILI9325選項,Y選中它就把它新增進核心.另外的BCM2708 framebuffer support就是原來樹莓派自帶的HDMI和AV顯示.
  1. make   
 就編譯好了,把它按上一篇的方法放到SD卡上去執行,就可以了.

三  測試

     進入ssh進入樹莓派

  1. ls /dev/fb*  

     可以看到有fb0 和 fb1,  fb1 就是我的TFT.

測試:

  1. cat /dev/urandom > /dev/fb1  

如果螢幕出現花屏那就是成功了.

 那要如何樹莓派預設顯示在tft上:

    在make menuconfig裡面把剛才說到的BCM2708 framebuffer support取消掉就可以了,不過就不支援HDMI了

三  原始檔分析

    檢視該diff檔案可以看出作者對核心做了四處改動

 1 ) 在 arch/arm/mach-bcm2708/bcm2708.c檔案中添加了ILI9325 平臺定義

  1. static struct platform_device bcm2708_ili9325 = {  
  2.     .name = "ili9325",  
  3.     .id = 0,  
  4. };  
  5. /*************************/  
  6. bcm_register_device(&bcm2708_ili9325);  

 2 ) 修改了 drivers/video/Kconfig 檔案,新增:
  1. config FB_ILI9325  
  2.     tristate "ILI9325 connected to Raspberry Pi GPIO support"  
  3.     depends on FB  
  4.     select FB_SYS_FILLRECT  
  5.     select FB_SYS_COPYAREA  
  6.     select FB_SYS_IMAGEBLIT  
  7.     select FB_SYS_FOPS  
  8.     select FB_DEFERRED_IO  
  9.     help  
  10.       This driver implements a framebuffer on an LCD controlled by a  
  11.       ILI9325 (or compatible) controller connected to the GPIO of the   
  12.       Raspberry Pi.  

只有在Kconfig 中宣告定義該模組,在make menuconfig 中才看得到ILI9325選項

   3 ) 在 drivers/video/Makefile 新增:

  1. obj-$(CONFIG_FB_ILI9325)          += ili9325.o  

 只有加了這句話,在make menuconfig選中該模組後,make時,該模組才會被編譯

   4)  在drivers/video/目錄下新建了 ili9325.c檔案

     程式碼比較長,這裡只看核心程式碼:

  1. static void ili9325_copy(struct ili9325 *item, unsigned int index)  
  2. {  
  3.     unsigned short x;  
  4.     unsigned short y;  
  5.     unsigned short *buffer;  
  6.     unsigned short *oldbuffer;  
  7.     unsigned int len;  
  8.     unsigned int count;  
  9.     int sendNewPos=1;  
  10.     x = item->pages[index].x;  
  11.     y = item->pages[index].y;  
  12.     buffer = item->pages[index].buffer;  
  13.     oldbuffer = item->pages[index].oldbuffer;  
  14.     len = item->pages[index].len;  
  15.     dev_dbg(item->dev,  
  16.         "%s: page[%u]: x=%3hu y=%3hu buffer=0x%p len=%3hu\n",  
  17.         __func__, index, x, y, buffer, len);  
  18.     //Only update changed pixels in the page.  
  19.     for (count = 0; count < len; count++) {  
  20.         if (buffer[count]==oldbuffer[count]) {  
  21.             sendNewPos=1;  
  22.         } else {  
  23.             if (sendNewPos) {  
  24.                 ili9325_setptr(item, x, y);  
  25.                 sendNewPos=0;  
  26.             }  
  27.             ili9325_writeword(buffer[count], 1);  
  28.             oldbuffer[count]=buffer[count];  
  29.         }  
  30.         x++;  
  31.         if (x>=item->info->var.xres) {  
  32.             y++;  
  33.             x=0;  
  34.         }  
  35.     }  
  36. }  

前面還有一系列定義命令和初始化的函式,主要是得符合ILI9325的時序.和微控制器上使用該TFT一樣,這裡的這個函式,主要用來顯示,操作TFT上的每一個畫素點.

四  有了顯示屏那就做個攝像頭顯示的小專案

     我正好有一個USB介面的UVC驅動的攝像頭,樹莓派相容的,其他驅動晶片的驅動只要在make menuconfig裡面找到相應選項就可以了.

     插上usb攝像頭,可以看到/dev下多了video0檔案,這個就是攝像頭了.

     裝個mplayer:

  1. sudo apt-get install mplayer  

    然後用mplayer 播放該攝像頭

    在tft上用滑鼠點選終端圖示,輸入命令:

  1. mplayer tv:// -tv driver=v4l2:width=320:height=240:device=/dev/video0    

   然後就在tft上顯示攝像頭的影象:

       

就到這裡吧,有空再玩.