📄 omapfb_main.c
字号:
&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 + -