pass the phy addr to fix.smem_start by ioctl
****************************************************************************/
-int get_fb_layer_id(struct fb_fix_screeninfo *fix)
-{
- int layer_id;
- if(!strcmp(fix->id,"fb1")||!strcmp(fix->id,"fb3"))
- {
- layer_id = 0;
- }
- else if(!strcmp(fix->id,"fb0")||!strcmp(fix->id,"fb2"))
- {
- layer_id = 1;
- }
- else
- {
- printk(KERN_ERR "unsupported %s",fix->id);
- layer_id = -ENODEV;
- }
- return layer_id;
-}
/**********************************************************************
this is for hdmi
struct rk_lcdc_device_driver * dev_drv = (struct rk_lcdc_device_driver * )info->par;
int layer_id;
- layer_id = get_fb_layer_id(&info->fix);
+ layer_id = dev_drv->fb_get_layer(dev_drv,info->fix.id);
if(dev_drv->layer_par[layer_id]->state)
{
return 0; // if this layer aready opened ,no need to reopen
u32 xvir = var->xres_virtual;
u8 data_format = var->nonstd&0xff;
- layer_id = get_fb_layer_id(fix);
+ layer_id = dev_drv->fb_get_layer(dev_drv,info->fix.id);
if(layer_id < 0)
{
return -ENODEV;
struct fb_fix_screeninfo *fix = &info->fix;
struct rk_lcdc_device_driver *dev_drv = (struct rk_lcdc_device_driver * )info->par;
u32 yuv_phy[2];
- int layer_id = get_fb_layer_id(&info->fix);
+ int layer_id = dev_drv->fb_get_layer(dev_drv,info->fix.id);
int enable; // enable fb:1 enable;0 disable
int ovl; //overlay:0 win1 on the top of win0;1,win0 on the top of win1
int num_buf; //buffer_number
struct fb_fix_screeninfo *fix = &info->fix;
int layer_id;
- layer_id = get_fb_layer_id(fix);
+ layer_id = dev_drv->fb_get_layer(dev_drv,info->fix.id);
if(layer_id < 0)
{
return -ENODEV;
}
#endif
#endif
- layer_id = get_fb_layer_id(fix);
+ layer_id = dev_drv->fb_get_layer(dev_drv,info->fix.id);
if(layer_id < 0)
{
return -ENODEV;
info = inf->fb[2];
}
- layer_id = get_fb_layer_id(&info->fix);
+ layer_id = dev_drv->fb_get_layer(dev_drv,info->fix.id);
if(!enable)
{
if(dev_drv->layer_par[layer_id]->state)
dev_drv->get_disp_info = def_drv->get_disp_info;
dev_drv->ovl_mgr = def_drv->ovl_mgr;
dev_drv->fps_mgr = def_drv->fps_mgr;
+ dev_drv->fb_get_layer = def_drv->fb_get_layer;
+ dev_drv->fb_layer_remap = def_drv->fb_layer_remap;
init_layer_par(dev_drv);
init_completion(&dev_drv->frame_done);
spin_lock_init(&dev_drv->cpl_lock);
+ mutex_init(&dev_drv->fb_win_id_mutex);
+ dev_drv->fb_layer_remap(dev_drv,FB_DEFAULT_ORDER); //102
dev_drv->first_frame = 1;
return 0;
struct fb_info *fbi = dev_get_drvdata(dev);
struct rk_lcdc_device_driver * dev_drv =
(struct rk_lcdc_device_driver * )fbi->par;
- int layer_id = get_fb_layer_id(&fbi->fix);
+ int layer_id = dev_drv->fb_get_layer(dev_drv,fbi->fix.id);
if(dev_drv->get_disp_info)
dev_drv->get_disp_info(dev_drv,layer_id);
struct fb_info *fbi = dev_get_drvdata(dev);
struct rk_lcdc_device_driver * dev_drv =
(struct rk_lcdc_device_driver * )fbi->par;
- int layer_id = get_fb_layer_id(&fbi->fix);
+ int layer_id = dev_drv->fb_get_layer(dev_drv,fbi->fix.id);
int state = dev_drv->get_layer_state(dev_drv,layer_id);
return snprintf(buf, PAGE_SIZE, "%s\n",state?"enabled":"disabled");
struct fb_info *fbi = dev_get_drvdata(dev);
struct rk_lcdc_device_driver * dev_drv =
(struct rk_lcdc_device_driver * )fbi->par;
- int layer_id = get_fb_layer_id(&fbi->fix);
+ int layer_id = dev_drv->fb_get_layer(dev_drv,fbi->fix.id);
int state;
int ret;
ret = kstrtoint(buf, 0, &state);
return count;
}
+static ssize_t show_fb_win_map(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ int ret;
+ struct fb_info *fbi = dev_get_drvdata(dev);
+ struct rk_lcdc_device_driver * dev_drv =
+ (struct rk_lcdc_device_driver * )fbi->par;
+
+ mutex_lock(&dev_drv->fb_win_id_mutex);
+ ret = snprintf(buf, PAGE_SIZE,"fb0:win%d\nfb1:win%d\nfb2:win%d\n",dev_drv->fb0_win_id,dev_drv->fb1_win_id,
+ dev_drv->fb2_win_id);
+ mutex_unlock(&dev_drv->fb_win_id_mutex);
+
+ return ret;
+
+}
+
+static ssize_t set_fb_win_map(struct device *dev,struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct fb_info *fbi = dev_get_drvdata(dev);
+ struct rk_lcdc_device_driver * dev_drv =
+ (struct rk_lcdc_device_driver * )fbi->par;
+ int order;
+ int ret;
+ ret = kstrtoint(buf, 0, &order);
+ if((order != FB0_WIN2_FB1_WIN1_FB2_WIN0) && (order != FB0_WIN1_FB1_WIN2_FB2_WIN0 ) &&
+ (order != FB0_WIN2_FB1_WIN0_FB2_WIN1) && (order != FB0_WIN0_FB1_WIN2_FB2_WIN1 ) &&
+ (order != FB0_WIN0_FB1_WIN1_FB2_WIN2) && (order != FB0_WIN1_FB1_WIN0_FB2_WIN2 ))
+ {
+ printk(KERN_ERR "un support map\nyou can use the following order: \
+ \n201:\nfb0-win1\nfb1-win0\nfb2-win2\n \
+ \n210:\nfb0-win0\nfb1-win1\nfb2-win2\n \
+ \n120:\nfb0-win0\nfb1-win2\nfb2-win1\n \
+ \n102:\nfb0-win2\nfb1-win0\nfb2-win1\n \
+ \n021:\nfb0-win1\nfb1-win2\nfb2-win0\n \
+ \n012:\nfb0-win2\nfb1-win1\nfb2-win0\n");
+ return count;
+ }
+ else
+ {
+ dev_drv->fb_layer_remap(dev_drv,order);
+ }
+
+ return count;
+
+
+}
+
static struct device_attribute rkfb_attrs[] = {
__ATTR(phys_addr, S_IRUGO, show_phys, NULL),
__ATTR(virt_addr, S_IRUGO, show_virt, NULL),
__ATTR(enable, S_IRUGO | S_IWUSR, show_fb_state, set_fb_state),
__ATTR(overlay, S_IRUGO | S_IWUSR, show_overlay, set_overlay),
__ATTR(fps, S_IRUGO | S_IWUSR, show_fps, set_fps),
+ __ATTR(map, S_IRUGO | S_IWUSR, show_fb_win_map, set_fb_win_map),
};
int rkfb_create_sysfs(struct fb_info *fbi)
YUV444,
};
+enum fb_win_map_order{
+ FB_DEFAULT_ORDER = 0,
+ FB0_WIN2_FB1_WIN1_FB2_WIN0 = 012,
+ FB0_WIN1_FB1_WIN2_FB2_WIN0 = 021,
+ FB0_WIN2_FB1_WIN0_FB2_WIN1 = 102,
+ FB0_WIN0_FB1_WIN2_FB2_WIN1 = 120,
+ FB0_WIN0_FB1_WIN1_FB2_WIN2 = 210,
+ FB0_WIN1_FB1_WIN0_FB2_WIN2 = 201,
+};
+
struct rk_fb_rgb {
struct fb_bitfield red;
struct fb_bitfield green;
rk_screen *screen;
u32 pixclock;
+
+ char fb0_win_id;
+ char fb1_win_id;
+ char fb2_win_id;
+ struct mutex fb_win_id_mutex;
+
struct completion frame_done; //sync for pan_display,whe we set a new frame address to lcdc register,we must make sure the frame begain to display
spinlock_t cpl_lock; //lock for completion frame done
int first_frame ;
int (*get_layer_state)(struct rk_lcdc_device_driver *dev_drv,int layer_id);
int (*ovl_mgr)(struct rk_lcdc_device_driver *dev_drv,int swap,bool set); //overlay manager
int (*fps_mgr)(struct rk_lcdc_device_driver *dev_drv,int fps,bool set);
+ int (*fb_get_layer)(struct rk_lcdc_device_driver *dev_drv,const char *id); //find layer for fb
+ int (*fb_layer_remap)(struct rk_lcdc_device_driver *dev_drv,enum fb_win_map_order order);
};