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

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

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

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

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

        http://blog.csdn.net/embbnux/article/details/17394793

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

          http://www.embbnux.com/

參考文章:

         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文件

     原下載鏈接:  ili9325_gpio_driver_rpi.diff

     也可以到我的資源下載:

           http://download.csdn.net/detail/canyue102/6735059

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

      首先把 該diff文件放到內核根目錄下,終端進去該目錄:

     

patch -p1 < ili9325_gpio_driver_rpi.diff

      然後TFT內核源碼就被添加到內核去了. 

make menuconfig
     可以在device driver >> graphics support >> support for frame buffer 下看到ILI9325選項,Y選中它就把它添加進內核.另外的BCM2708 framebuffer support就是原來樹莓派自帶的HDMI和AV顯示.

make 
    就編譯好了,把它按上一篇的方法放到SD卡上去運行,就可以了.

三  測試

     進入ssh進入樹莓派

   

ls /dev/fb*

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

測試:

cat /dev/urandom > /dev/fb1

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

 那要如何樹莓派默認顯示在tft上:

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

三  源文件分析

    查看該diff文件可以看出作者對內核做了四處改動

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

   

static struct platform_device bcm2708_ili9325 = {
	.name = "ili9325",
	.id = 0,
};
/*************************/
bcm_register_device(&bcm2708_ili9325);

  2 ) 修改了 drivers/video/Kconfig 文件,添加:

config FB_ILI9325
	tristate "ILI9325 connected to Raspberry Pi GPIO support"
	depends on FB
	select FB_SYS_FILLRECT
	select FB_SYS_COPYAREA
	select FB_SYS_IMAGEBLIT
	select FB_SYS_FOPS
	select FB_DEFERRED_IO
	help
	  This driver implements a framebuffer on an LCD controlled by a
	  ILI9325 (or compatible) controller connected to the GPIO of the 
	  Raspberry Pi.

只有在Kconfig 中聲明定義該模塊,在make menuconfig 中才看得到ILI9325選項

   3 ) 在 drivers/video/Makefile 添加:

 

obj-$(CONFIG_FB_ILI9325)		  += ili9325.o

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


   4)  在drivers/video/目錄下新建了 ili9325.c文件

     代碼比較長,這裏只看核心代碼:

   

static void ili9325_copy(struct ili9325 *item, unsigned int index)
{
	unsigned short x;
	unsigned short y;
	unsigned short *buffer;
	unsigned short *oldbuffer;
	unsigned int len;
	unsigned int count;
	int sendNewPos=1;
	x = item->pages[index].x;
	y = item->pages[index].y;
	buffer = item->pages[index].buffer;
	oldbuffer = item->pages[index].oldbuffer;
	len = item->pages[index].len;
	dev_dbg(item->dev,
		"%s: page[%u]: x=%3hu y=%3hu buffer=0x%p len=%3hu\n",
		__func__, index, x, y, buffer, len);

	//Only update changed pixels in the page.
	for (count = 0; count < len; count++) {
		if (buffer[count]==oldbuffer[count]) {
			sendNewPos=1;
		} else {
			if (sendNewPos) {
				ili9325_setptr(item, x, y);
				sendNewPos=0;
			}
			ili9325_writeword(buffer[count], 1);
			oldbuffer[count]=buffer[count];
		}
		x++;
		if (x>=item->info->var.xres) {
			y++;
			x=0;
		}
	}
}

前面還有一系列定義命令和初始化的函數,主要是得符合ILI9325的時序.和單片機上使用該TFT一樣,這裏的這個函數,主要用來顯示,操作TFT上的每一個像素點.


四  有了顯示屏那就做個攝像頭顯示的小項目

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

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

     裝個mplayer:

   

sudo apt-get install mplayer

    然後用mplayer 播放該攝像頭

    在tft上用鼠標點擊終端圖標,輸入命令:

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

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

      

     

就到這裏吧,有空再玩.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章