s5pv210 android hdmi與LCD異步顯示之fb2多線程操作驅動修改

s5pv210 android hdmi與LCD異步顯示之fb2多線程操作驅動修改

之前有一篇文章已經介紹過210 linux hdmi顯示 android和處理現在是把系統自帶的hdmi相關代碼刪除 使用之前linux上用到的hdmi代碼顯示輸出 改爲由fb2同步顯示到hdmi 內核版本linux3.0.8

一般情況能進行多線程操作的只有fb0設備 雖然dev下有顯示fb1-4的設備但不能多個線程進行操作 如果某一個線程需要對fb1-4進行操作需要在應用程序中加上如下代碼

	ret = ioctl(lcd_fd, FBIOGET_VSCREENINFO, &var );
	if( ret < 0 ){
		printf( "ioctl FBIOGET_VSCREENINFO failed\n");
		return -1;
	}
	var.activate = FB_ACTIVATE_FORCE;
	var.yres_virtual = var.yres;

	ret = ioctl(lcd_fd, FBIOPUT_VSCREENINFO, &var );
	if( ret < 0 ){
		printf( "ioctl FBIOPUT_VSCREENINFO failed\n");
		return -1;
	}
每這樣操作一次 就會導致對應的frambuffer地址發生變化 同時其它進程也會mmap失敗 這裏就需要對fb驅動作進行修改

主要修改文件爲

drivers/video/samsung/s3cfb.c

首先是

s3cfb_alloc_framebuffer函數裏只對default_win分配了framebuffer地址 修改爲如下

#if 0 //modify by hclydao
		if (i == pdata->default_win) {
			if (s3cfb_map_video_memory(ctrl->fb[i])) {
				dev_err(ctrl->dev,
					"failed to map video memory "
					"for default window (%d)\n", i);
				ret = -ENOMEM;
				goto err_map_video_mem;
			}
		}
#else
			if (s3cfb_map_video_memory(ctrl->fb[i])) {
				dev_err(ctrl->dev,
					"failed to map video memory "
					"for default window (%d)\n", i);
				ret = -ENOMEM;
				goto err_map_video_mem;
			}
#endif
s3cfb_set_par函數修改如下

static int s3cfb_set_par(struct fb_info *fb)
{
	struct s3cfb_global *fbdev =
		platform_get_drvdata(to_platform_device(fb->device));
	struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev);
	struct s3cfb_window *win = fb->par;

	dev_dbg(fbdev->dev, "[fb%d] set_par\n", win->id);
#if 0 //modify by hclydao
	/* modify the fix info */
	if (win->id != pdata->default_win) {
		fb->fix.line_length = fb->var.xres_virtual *
						fb->var.bits_per_pixel / 8;
		fb->fix.smem_len = fb->fix.line_length * fb->var.yres_virtual;

		s3cfb_map_video_memory(fb);
	}
#endif
	s3cfb_set_win_params(fbdev, win->id);

	return 0;
}
s3cfb_open及s3cfb_release_window函數修改如下

static int s3cfb_open(struct fb_info *fb, int user)
{
	struct s3cfb_global *fbdev =
		platform_get_drvdata(to_platform_device(fb->device));
	struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev);
	struct s3cfb_window *win = fb->par;
	int ret = 0;

	mutex_lock(&fbdev->lock);
	//modify by hclydao
	//if (win->in_use && win->id != pdata->default_win)
	if (win->in_use && (win->id != pdata->default_win) && (win->id != 4))
		ret = -EBUSY;
	else
		win->in_use++;

	mutex_unlock(&fbdev->lock);

	return ret;
}
static int s3cfb_release_window(struct fb_info *fb)
{
	struct s3cfb_global *fbdev =
		platform_get_drvdata(to_platform_device(fb->device));
	struct s3c_platform_fb *pdata = to_fb_plat(fbdev->dev);
	struct s3cfb_window *win = fb->par;
	//modify by hclydao
	//if (win->id != pdata->default_win)
	if ((win->id != pdata->default_win) && (win->id != 4)) {
		s3cfb_set_window(fbdev, win->id, 0);
		s3cfb_unmap_video_memory(fb);
		s3cfb_set_buffer_address(fbdev, win->id);
	}

	win->x = 0;
	win->y = 0;

	return 0;
}
因爲我想用多個線程對fb2進行操作 而默認的default_win是2所以修改爲如上

s3cfb_ioctl函數中case S3CFB_GET_LCD_ADDR:修改如下

	/* get changing physical framebuffer address(because of double buffering) */
	case S3CFB_GET_LCD_ADDR:
#if 0 //modify by hclydao
		LCDControllerBase = (volatile unsigned int *)ioremap(0xf8000000,1024);
		framebuffer_addr = LCDControllerBase[0xa0/4 + (win->id)*2];
		//LCDControllerBase = (volatile unsigned int *)ioremap(0xf80000a0,1024);
		//framebuffer_addr = LCDControllerBase[(win->id)*2];
		iounmap(LCDControllerBase);
		dev_dbg(fbdev->dev, "framebuffer_addr: 0x%08x\n", framebuffer_addr);
#else
		framebuffer_addr = (int)fix->smem_start;
		dev_dbg(fbdev->dev, "framebuffer_addr: 0x%08x\n", framebuffer_addr);
#endif
		if (copy_to_user((void *)arg, &framebuffer_addr, sizeof(int)))
			return -EFAULT;

		break;
s3cfb_probe函數中加一句

    s3cfb_set_window(fbdev, pdata->default_win, 1);
    //add by hclydao
    s3cfb_set_window(fbdev, 4, 1);

其中還有一些細節沒有修改 可能存在bug 這樣修改後就能夠通過多個線程對fb2進行操作了 這裏暫時只作下筆記.

目前已經實現了hdmi與lcd的異步顯示 可以通過app控制hdmi輸出的圖片 暫時只能顯示固定圖片

============================================
作者:hclydao
http://blog.csdn.net/hclydao
版權沒有,但是轉載請保留此段聲明

============================================

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