Exemplo n.º 1
0
int qtft_fb_init(void)
{
	int err = 0;
	func_in();

	err = platform_driver_register(&qtft_fb_driver);
	if(err<0)
		goto out;

	qtft_fb_device = platform_device_alloc("qtft_fb_device", 0);
	if (!qtft_fb_device)
	{
		err = -ENOMEM;
		goto unregister;
	}

	err = platform_device_add(qtft_fb_device);
	if (err<0)
		goto device_put;

	goto out;

device_put:
	platform_device_put(qtft_fb_device);
unregister:
	platform_driver_unregister(&qtft_fb_driver);
out:
	func_out();
	return err;
}
Exemplo n.º 2
0
void qtft_fb_exit(void)
{
	func_in();

	platform_device_unregister(qtft_fb_device);
	platform_driver_unregister(&qtft_fb_driver);

	func_out();
}
Exemplo n.º 3
0
void qtft_spi_exit(void)
{
	func_in();

	qtft_spi_device_unregister(current_device);
	spi_unregister_driver(&qtft_spi_dri_driver);

	func_out();
}
Exemplo n.º 4
0
int bstree_iterate( bstree_t *tree_in, long node_in, void (*func_in)(bsnode_t*,void*), void *args_in )
{
	if( node_in != -1 )
	{
		bstree_iterate( tree_in, tree_in->start[node_in].left, func_in, args_in );
		func_in( tree_in->start + node_in, args_in );
		bstree_iterate( tree_in, tree_in->start[node_in].right, func_in, args_in );
	}
	return 0;
}
Exemplo n.º 5
0
static int qtft_fb_remove(struct platform_device *dev)
{
	struct fb_info *info = platform_get_drvdata(dev);

	func_in();
	if (info)
	{
		lcd_exit();
		unregister_framebuffer(info);
		fb_dealloc_cmap(&info->cmap);
		framebuffer_release(info);
		rvfree(videomemory, videomemorysize);
	}
	func_out();
	return 0;
}
Exemplo n.º 6
0
int qtft_spi_init(void)
{
	int err=0;
	struct spi_master *master=NULL;
	struct spi_device *new_device=NULL;
	func_in();

	err = spi_register_driver(&qtft_spi_dri_driver);
	if(err)
	{
		printk(KERN_ERR "Can't register spi driver \n");
		goto out;
	}

	master = spi_busnum_to_master(SPI_BUS_NUM);
	if(!master)
	{
		printk(KERN_ERR "Can't get SPI bus %d\n",SPI_BUS_NUM);
		err = -ENODEV;
		goto err0;
	}

	new_device = spi_new_device(master, qtft_spi_dev_board_info);
	if(!new_device)
	{
		printk(KERN_ERR "Can't register spi device \n");
		err = -ENODEV;
		goto err0;
	}

	goto out;

err0:
	spi_unregister_driver(&qtft_spi_dri_driver);
out:
	func_out();
	return err;
}
Exemplo n.º 7
0
static int qtft_fb_probe(struct platform_device * dev)
{
	struct fb_info *info;
	int retval = -ENOMEM;

	func_in();

	// 分配显存
	if (!(videomemory = rvmalloc(videomemorysize)))
		return retval;
	memset(videomemory, 0, videomemorysize);

	// 动态分配 fb_info
	info = framebuffer_alloc((sizeof(u32)*16), &dev->dev);
	if (!info)
		goto err0;

	// 虚拟地址
	info->screen_base = (char __iomem *)videomemory;
	info->screen_size = videomemorysize;
	
	// 文件操作符 qtft_fb_ops 在 ops.c 中定义
	info->fbops = &qtft_fb_ops;

	info->var = qtft_fb_var_default;

	qtft_fb_fix_default.smem_start = (unsigned long) videomemory;
	qtft_fb_fix_default.smem_len = videomemorysize;
	info->fix = qtft_fb_fix_default;
	
	// 16色伪调色板指针指向了 info->par 的私有空间
	info->pseudo_palette = info->par;
	info->par = NULL;
	info->flags = FBINFO_DEFAULT;

	// 为16色伪调色板分配内存
	retval = fb_alloc_cmap(&info->cmap, 16, 0);
	if (retval < 0)
		goto err1;

	retval = register_framebuffer(info);
	if (retval < 0)
		goto err2;

	// 初始化 LCD 模块
	retval = lcd_init();
	if (retval < 0)
		goto err3;

	retval = lcd_hard_reset();
	if (retval < 0)
		goto err3;

	retval = lcd_normal_config();
	if (retval < 0)
		goto err3;

	lcd_address_set(0,0,(info->var).xres,(info->var).yres);
	
	// 将 info 指针存入平台设备私有数据
	platform_set_drvdata(dev, info);

	printk(KERN_INFO "SPI QVGA TFT LCD driver: fb%d, %ldK video memory\n", info->node, videomemorysize >> 10);
	goto out;

err3:
	unregister_framebuffer(info);
err2:
	fb_dealloc_cmap(&info->cmap);
err1:
	framebuffer_release(info);
err0:
	rvfree(videomemory, videomemorysize);
out:
	func_out();
	return retval;
}