⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 omapfb_main.c

📁 Linux环境下视频显示卡设备的驱动程序源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
				&omapfb_client_list[omapfb_nb->plane_idx],				&omapfb_nb->nb);	if (r)		return r;	if (omapfb_dev != NULL &&	    omapfb_dev->ctrl && omapfb_dev->ctrl->bind_client) {		omapfb_dev->ctrl->bind_client(omapfb_nb);	}	return 0;}EXPORT_SYMBOL(omapfb_register_client);int omapfb_unregister_client(struct omapfb_notifier_block *omapfb_nb){	return blocking_notifier_chain_unregister(		&omapfb_client_list[omapfb_nb->plane_idx], &omapfb_nb->nb);}EXPORT_SYMBOL(omapfb_unregister_client);void omapfb_notify_clients(struct omapfb_device *fbdev, unsigned long event){	int i;	if (!notifier_inited)		/* no client registered yet */		return;	for (i = 0; i < OMAPFB_PLANE_NUM; i++)		blocking_notifier_call_chain(&omapfb_client_list[i], event,				    fbdev->fb_info[i]);}EXPORT_SYMBOL(omapfb_notify_clients);static int omapfb_set_update_mode(struct omapfb_device *fbdev,				   enum omapfb_update_mode mode){	int r;	omapfb_rqueue_lock(fbdev);	r = fbdev->ctrl->set_update_mode(mode);	omapfb_rqueue_unlock(fbdev);	return r;}static enum omapfb_update_mode omapfb_get_update_mode(struct omapfb_device *fbdev){	int r;	omapfb_rqueue_lock(fbdev);	r = fbdev->ctrl->get_update_mode();	omapfb_rqueue_unlock(fbdev);	return r;}static void omapfb_get_caps(struct omapfb_device *fbdev, int plane,				     struct omapfb_caps *caps){	memset(caps, 0, sizeof(*caps));	fbdev->ctrl->get_caps(plane, caps);	caps->ctrl |= fbdev->panel->get_caps(fbdev->panel);}/* For lcd testing */void omapfb_write_first_pixel(struct omapfb_device *fbdev, u16 pixval){	omapfb_rqueue_lock(fbdev);	*(u16 *)fbdev->mem_desc.region[0].vaddr = pixval;	if (fbdev->ctrl->get_update_mode() == OMAPFB_MANUAL_UPDATE) {		struct omapfb_update_window win;		memset(&win, 0, sizeof(win));		win.width = 2;		win.height = 2;		win.out_width = 2;		win.out_height = 2;		fbdev->ctrl->update_window(fbdev->fb_info[0], &win, NULL, NULL);	}	omapfb_rqueue_unlock(fbdev);}EXPORT_SYMBOL(omapfb_write_first_pixel);/* * Ioctl interface. Part of the kernel mode frame buffer API is duplicated * here to be accessible by user mode code. */static int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd,			unsigned long arg){	struct omapfb_plane_struct *plane = fbi->par;	struct omapfb_device	*fbdev = plane->fbdev;	struct fb_ops		*ops = fbi->fbops;	union {		struct omapfb_update_window	update_window;		struct omapfb_plane_info	plane_info;		struct omapfb_mem_info		mem_info;		struct omapfb_color_key		color_key;		enum omapfb_update_mode		update_mode;		struct omapfb_caps		caps;		unsigned int		mirror;		int			plane_out;		int			enable_plane;	} p;	int r = 0;	BUG_ON(!ops);	switch (cmd) {	case OMAPFB_MIRROR:		if (get_user(p.mirror, (int __user *)arg))			r = -EFAULT;		else			omapfb_mirror(fbi, p.mirror);		break;	case OMAPFB_SYNC_GFX:		omapfb_sync(fbi);		break;	case OMAPFB_VSYNC:		break;	case OMAPFB_SET_UPDATE_MODE:		if (get_user(p.update_mode, (int __user *)arg))			r = -EFAULT;		else			r = omapfb_set_update_mode(fbdev, p.update_mode);		break;	case OMAPFB_GET_UPDATE_MODE:		p.update_mode = omapfb_get_update_mode(fbdev);		if (put_user(p.update_mode,					(enum omapfb_update_mode __user *)arg))			r = -EFAULT;		break;	case OMAPFB_UPDATE_WINDOW_OLD:		if (copy_from_user(&p.update_window, (void __user *)arg,				   sizeof(struct omapfb_update_window_old)))			r = -EFAULT;		else {			struct omapfb_update_window *u = &p.update_window;			u->out_x = u->x;			u->out_y = u->y;			u->out_width = u->width;			u->out_height = u->height;			memset(u->reserved, 0, sizeof(u->reserved));			r = omapfb_update_win(fbi, u);		}		break;	case OMAPFB_UPDATE_WINDOW:		if (copy_from_user(&p.update_window, (void __user *)arg,				   sizeof(p.update_window)))			r = -EFAULT;		else			r = omapfb_update_win(fbi, &p.update_window);		break;	case OMAPFB_SETUP_PLANE:		if (copy_from_user(&p.plane_info, (void __user *)arg,				   sizeof(p.plane_info)))			r = -EFAULT;		else			r = omapfb_setup_plane(fbi, &p.plane_info);		break;	case OMAPFB_QUERY_PLANE:		if ((r = omapfb_query_plane(fbi, &p.plane_info)) < 0)			break;		if (copy_to_user((void __user *)arg, &p.plane_info,				   sizeof(p.plane_info)))			r = -EFAULT;		break;	case OMAPFB_SETUP_MEM:		if (copy_from_user(&p.mem_info, (void __user *)arg,				   sizeof(p.mem_info)))			r = -EFAULT;		else			r = omapfb_setup_mem(fbi, &p.mem_info);		break;	case OMAPFB_QUERY_MEM:		if ((r = omapfb_query_mem(fbi, &p.mem_info)) < 0)			break;		if (copy_to_user((void __user *)arg, &p.mem_info,				   sizeof(p.mem_info)))			r = -EFAULT;		break;	case OMAPFB_SET_COLOR_KEY:		if (copy_from_user(&p.color_key, (void __user *)arg,				   sizeof(p.color_key)))			r = -EFAULT;		else			r = omapfb_set_color_key(fbdev, &p.color_key);		break;	case OMAPFB_GET_COLOR_KEY:		if ((r = omapfb_get_color_key(fbdev, &p.color_key)) < 0)			break;		if (copy_to_user((void __user *)arg, &p.color_key,				 sizeof(p.color_key)))			r = -EFAULT;		break;	case OMAPFB_GET_CAPS:		omapfb_get_caps(fbdev, plane->idx, &p.caps);		if (copy_to_user((void __user *)arg, &p.caps, sizeof(p.caps)))			r = -EFAULT;		break;	case OMAPFB_LCD_TEST:		{			int test_num;			if (get_user(test_num, (int __user *)arg)) {				r = -EFAULT;				break;			}			if (!fbdev->panel->run_test) {				r = -EINVAL;				break;			}			r = fbdev->panel->run_test(fbdev->panel, test_num);			break;		}	case OMAPFB_CTRL_TEST:		{			int test_num;			if (get_user(test_num, (int __user *)arg)) {				r = -EFAULT;				break;			}			if (!fbdev->ctrl->run_test) {				r = -EINVAL;				break;			}			r = fbdev->ctrl->run_test(test_num);			break;		}	default:		r = -EINVAL;	}	return r;}static int omapfb_mmap(struct fb_info *info, struct vm_area_struct *vma){	struct omapfb_plane_struct *plane = info->par;	struct omapfb_device *fbdev = plane->fbdev;	int r;	omapfb_rqueue_lock(fbdev);	r = fbdev->ctrl->mmap(info, vma);	omapfb_rqueue_unlock(fbdev);	return r;}/* * Callback table for the frame buffer framework. Some of these pointers * will be changed according to the current setting of fb_info->accel_flags. */static struct fb_ops omapfb_ops = {	.owner		= THIS_MODULE,	.fb_open        = omapfb_open,	.fb_release     = omapfb_release,	.fb_setcolreg	= omapfb_setcolreg,	.fb_setcmap	= omapfb_setcmap,	.fb_fillrect	= cfb_fillrect,	.fb_copyarea	= cfb_copyarea,	.fb_imageblit	= cfb_imageblit,	.fb_blank       = omapfb_blank,	.fb_ioctl	= omapfb_ioctl,	.fb_check_var	= omapfb_check_var,	.fb_set_par	= omapfb_set_par,	.fb_rotate	= omapfb_rotate,	.fb_pan_display = omapfb_pan_display,};/* * --------------------------------------------------------------------------- * Sysfs interface * --------------------------------------------------------------------------- *//* omapfbX sysfs entries */static ssize_t omapfb_show_caps_num(struct device *dev,				    struct device_attribute *attr, char *buf){	struct omapfb_device *fbdev = (struct omapfb_device *)dev->driver_data;	int plane;	size_t size;	struct omapfb_caps caps;	plane = 0;	size = 0;	while (size < PAGE_SIZE && plane < OMAPFB_PLANE_NUM) {		omapfb_get_caps(fbdev, plane, &caps);		size += snprintf(&buf[size], PAGE_SIZE - size,			"plane#%d %#010x %#010x %#010x\n",			plane, caps.ctrl, caps.plane_color, caps.wnd_color);		plane++;	}	return size;}static ssize_t omapfb_show_caps_text(struct device *dev,				     struct device_attribute *attr, char *buf){	struct omapfb_device *fbdev = (struct omapfb_device *)dev->driver_data;	int i;	struct omapfb_caps caps;	int plane;	size_t size;	plane = 0;	size = 0;	while (size < PAGE_SIZE && plane < OMAPFB_PLANE_NUM) {		omapfb_get_caps(fbdev, plane, &caps);		size += snprintf(&buf[size], PAGE_SIZE - size,				 "plane#%d:\n", plane);		for (i = 0; i < ARRAY_SIZE(ctrl_caps) &&		     size < PAGE_SIZE; i++) {			if (ctrl_caps[i].flag & caps.ctrl)				size += snprintf(&buf[size], PAGE_SIZE - size,					" %s\n", ctrl_caps[i].name);		}		size += snprintf(&buf[size], PAGE_SIZE - size,				 " plane colors:\n");		for (i = 0; i < ARRAY_SIZE(color_caps) &&		     size < PAGE_SIZE; i++) {			if (color_caps[i].flag & caps.plane_color)				size += snprintf(&buf[size], PAGE_SIZE - size,					"  %s\n", color_caps[i].name);		}		size += snprintf(&buf[size], PAGE_SIZE - size,				 " window colors:\n");		for (i = 0; i < ARRAY_SIZE(color_caps) &&		     size < PAGE_SIZE; i++) {			if (color_caps[i].flag & caps.wnd_color)				size += snprintf(&buf[size], PAGE_SIZE - size,					"  %s\n", color_caps[i].name);		}		plane++;	}	return size;}static DEVICE_ATTR(caps_num, 0444, omapfb_show_caps_num, NULL);static DEVICE_ATTR(caps_text, 0444, omapfb_show_caps_text, NULL);/* panel sysfs entries */static ssize_t omapfb_show_panel_name(struct device *dev,				      struct device_attribute *attr, char *buf){	struct omapfb_device *fbdev = (struct omapfb_device *)dev->driver_data;	return snprintf(buf, PAGE_SIZE, "%s\n", fbdev->panel->name);}static ssize_t omapfb_show_bklight_level(struct device *dev,					 struct device_attribute *attr,					 char *buf){	struct omapfb_device *fbdev = (struct omapfb_device *)dev->driver_data;	int r;	if (fbdev->panel->get_bklight_level) {		r = snprintf(buf, PAGE_SIZE, "%d\n",			     fbdev->panel->get_bklight_level(fbdev->panel));	} else		r = -ENODEV;	return r;}static ssize_t omapfb_store_bklight_level(struct device *dev,					  struct device_attribute *attr,					  const char *buf, size_t size){	struct omapfb_device *fbdev = (struct omapfb_device *)dev->driver_data;	int r;	if (fbdev->panel->set_bklight_level) {		unsigned int level;		if (sscanf(buf, "%10d", &level) == 1) {			r = fbdev->panel->set_bklight_level(fbdev->panel,							    level);		} else			r = -EINVAL;	} else		r = -ENODEV;	return r ? r : size;}static ssize_t omapfb_show_bklight_max(struct device *dev,				       struct device_attribute *attr, char *buf){	struct omapfb_device *fbdev = (struct omapfb_device *)dev->driver_data;	int r;	if (fbdev->panel->get_bklight_level) {		r = snprintf(buf, PAGE_SIZE, "%d\n",			     fbdev->panel->get_bklight_max(fbdev->panel));	} else		r = -ENODEV;	return r;}static struct device_attribute dev_attr_panel_name =	__ATTR(name, 0444, omapfb_show_panel_name, NULL);static DEVICE_ATTR(backlight_level, 0664,		   omapfb_show_bklight_level, omapfb_store_bklight_level);static DEVICE_ATTR(backlight_max, 0444, omapfb_show_bklight_max, NULL);static struct attribute *panel_attrs[] = {	&dev_attr_panel_name.attr,	&dev_attr_backlight_level.attr,	&dev_attr_backlight_max.attr,	NULL,};static struct attribute_group panel_attr_grp = {	.name  = "panel",	.attrs = panel_attrs,};/* ctrl sysfs entries */static ssize_t omapfb_show_ctrl_name(struct device *dev,				     struct device_attribute *attr, char *buf){	struct omapfb_device *fbdev = (struct omapfb_device *)dev->driver_data;	return snprintf(buf, PAGE_SIZE, "%s\n", fbdev->ctrl->name);}static struct device_attribute dev_attr_ctrl_name =	__ATTR(name, 0444, omapfb_show_ctrl_name, NULL);static struct attribute *ctrl_attrs[] = {	&dev_attr_ctrl_name.attr,	NULL,};static struct attribute_group ctrl_attr_grp = {	.name  = "ctrl",	.attrs = ctrl_attrs,};static int omapfb_register_sysfs(struct omapfb_device *fbdev){	int r;	if ((r = device_create_file(fbdev->dev, &dev_attr_caps_num)))		goto fail0;	if ((r = device_create_file(fbdev->dev, &dev_attr_caps_text)))		goto fail1;	if ((r = sysfs_create_group(&fbdev->dev->kobj, &panel_attr_grp)))		goto fail2;	if ((r = sysfs_create_group(&fbdev->dev->kobj, &ctrl_attr_grp)))		goto fail3;	return 0;fail3:	sysfs_remove_group(&fbdev->dev->kobj, &panel_attr_grp);fail2:	device_remove_file(fbdev->dev, &dev_attr_caps_text);fail1:	device_remove_file(fbdev->dev, &dev_attr_caps_num);fail0:	dev_err(fbdev->dev, "unable to register sysfs interface\n");	return r;}static void omapfb_unregister_sysfs(struct omapfb_device *fbdev){	sysfs_remove_group(&fbdev->dev->kobj, &ctrl_attr_grp);	sysfs_remove_group(&fbdev->dev->kobj, &panel_attr_grp);	device_remove_file(fbdev->dev, &dev_attr_caps_num);	device_remove_file(fbdev->dev, &dev_attr_caps_text);}/* * --------------------------------------------------------------------------- * LDM callbacks * --------------------------------------------------------------------------- *//* Initialize system fb_info object and set the default video mode. * The frame buffer memory already allocated by lcddma_init */static int fbinfo_init(struct omapfb_device *fbdev, struct fb_info *info)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -