[Wetek.Play/amvideocap] - add support for aml video capture device (needed for boblight support

This commit is contained in:
Memphiz 2015-01-15 09:39:15 +01:00 committed by Memphis
parent 17bc2cf305
commit 14592b4cd3
2 changed files with 164 additions and 0 deletions

View File

@ -2690,3 +2690,26 @@ diff -Naur a/arch/arm/boot/dts/amlogic/meson6_g18.dtd b/arch/arm/boot/dts/amlogi
+ };
+}; /* end of / */
+
--- a/arch/arm/boot/dts/amlogic/meson6_g18.dtd 2015-01-12 00:19:11.729405484 +0100
+++ b/arch/arm/boot/dts/amlogic/meson6_g18.dtd 2015-01-12 00:23:29.396031497 +0100
@@ -1396,5 +1396,20 @@
fe1_ts = <0>;
fe1_dev = <1>;
};
+
+/// ***************************************************************************************
+/// - DISP&MM-A/V Amvideocap
+//$$ MODULE = "DISP&MM-Amvideocap"
+//$$ DEVICE="amvideocap"
+//$$ L2 PROP_STR = "status"
+//$$ L3 PROP_U32 4 ="reg"
+ amvideocap{
+ compatible = "amlogic,amvideocap";
+ dev_name = "amvideocap.0";
+ status = "okay";
+ reserve-memory = <0x00a00000>; // 1920 * 1088 * 4 = 8,355,840
+ reserve-iomap = "true";
+ };
+
}; /* end of / */

View File

@ -0,0 +1,141 @@
--- a/drivers/amlogic/amports/amvideocap.c 2015-01-12 19:17:17.003191369 +0100
+++ b/drivers/amlogic/amports/amvideocap.c 2015-01-12 19:20:50.855003956 +0100
@@ -163,13 +163,13 @@
//printk("vf->type:0x%x\n", vf->type);
if ((vf->type & VIDTYPE_VIU_422) == VIDTYPE_VIU_422) {
- printk("********************Into VIDTYPE_VIU_422*********************\n");
+ //printk("********************Into VIDTYPE_VIU_422*********************\n");
format = GE2D_FORMAT_S16_YUV422;
} else if ((vf->type & VIDTYPE_VIU_444) == VIDTYPE_VIU_444) {
- printk("********************Into VIDTYPE_VIU_444*********************\n");
+ //printk("********************Into VIDTYPE_VIU_444*********************\n");
format = GE2D_FORMAT_S24_YUV444;
} else if((vf->type & VIDTYPE_VIU_NV21) == VIDTYPE_VIU_NV21){
- printk("********************Into VIDTYPE_VIU_NV21*********************\n");
+ //printk("********************Into VIDTYPE_VIU_NV21*********************\n");
format= GE2D_FORMAT_M24_NV21;
}
return format;
@@ -195,13 +195,13 @@
printk("%s: failed to alloc y addr\n", __FUNCTION__);
return -1;
}
- printk("RGB_phy_addr:%x\n", (unsigned int)priv->phyaddr);
+ //printk("RGB_phy_addr:%x\n", (unsigned int)priv->phyaddr);
RGB_addr = (unsigned long)priv->vaddr;
if (!RGB_addr) {
printk("%s: failed to remap y addr\n", __FUNCTION__);
return -1;
}
- printk("RGB_addr:%x\n", (unsigned int)RGB_addr);
+ //printk("RGB_addr:%x\n", (unsigned int)RGB_addr);
if(vf == NULL) {
printk("%s: vf is NULL\n", __FUNCTION__);
@@ -250,7 +250,7 @@
canvas_read(y_index, &cs0);
canvas_read(u_index, &cs1);
canvas_read(v_index, &cs2);
- printk("y_index=[0x%x] u_index=[0x%x] cur_index:%x\n", y_index, u_index, cur_index);
+ //printk("y_index=[0x%x] u_index=[0x%x] cur_index:%x\n", y_index, u_index, cur_index);
ge2d_config.src_planes[0].addr = cs0.addr;
ge2d_config.src_planes[0].w = cs0.width;
ge2d_config.src_planes[0].h = cs0.height;
@@ -260,7 +260,7 @@
ge2d_config.src_planes[2].addr = cs2.addr;
ge2d_config.src_planes[2].w = cs2.width;
ge2d_config.src_planes[2].h = cs2.height;
- printk("w=%d-height=%d cur_index:%x\n", cs0.width, cs0.height, cur_index);
+ //printk("w=%d-height=%d cur_index:%x\n", cs0.width, cs0.height, cur_index);
ge2d_config.src_key.key_enable = 0;
ge2d_config.src_key.key_mask = 0;
@@ -282,7 +282,7 @@
canvas_read(canvas_idx, &cd);
- printk("cd.addr:%x\n", (unsigned int)cd.addr);
+ //printk("cd.addr:%x\n", (unsigned int)cd.addr);
ge2d_config.dst_planes[0].addr = cd.addr;
ge2d_config.dst_planes[0].w = cd.width;
ge2d_config.dst_planes[0].h = cd.height;
@@ -349,7 +349,7 @@
int curindex;
vframe_t *vf = vfput;
int ret = 0;
- printk("%s:start vf=%p,index=%x\n", __func__,vf,index);
+ //printk("%s:start vf=%p,index=%x\n", __func__,vf,index);
if (!vf) {
ret = amvideocap_capture_get_frame(priv, &vf, &curindex);
}else{
@@ -358,7 +358,7 @@
if (ret < 0 || !vf) {
return -EAGAIN;
}
- printk("%s: get vf type=%x\n", __func__,vf->type);
+ //printk("%s: get vf type=%x\n", __func__,vf->type);
#define CHECK_AND_SETVAL(val,want,def) (val)=(want)>0?(want):(def)
@@ -374,7 +374,7 @@
amvideocap_capture_put_frame(priv, vf);
if (!ret) {
- printk("%s: capture ok priv->want.fmt=%d\n", __func__,priv->want.fmt);
+ //printk("%s: capture ok priv->want.fmt=%d\n", __func__,priv->want.fmt);
priv->state = AMVIDEOCAP_STATE_FINISHED_CAPTURE;
priv->src.width=vf->width;
priv->src.height=vf->height;
@@ -387,7 +387,7 @@
}else{
priv->state = AMVIDEOCAP_STATE_ERROR;
}
- printk("amvideocap_capture_one_frame priv->state=%d\n", priv->state);
+ //printk("amvideocap_capture_one_frame priv->state=%d\n", priv->state);
return ret;
}
static int amvideocap_capture_one_frame_callback(unsigned long data, vframe_t *vfput, int index)
@@ -427,7 +427,7 @@
}
} else {
ret = amvideocap_capture_one_frame(priv, NULL, 0);
- printk("amvideocap_capture_one_frame_wait ret=%d\n", ret);
+ //printk("amvideocap_capture_one_frame_wait ret=%d\n", ret);
}
} while (ret == -EAGAIN && time_before(jiffies, timeout));
ext_register_end_frame_callback(NULL);/*del req*/
@@ -606,7 +606,7 @@
printk("set_cached: failed remap_pfn_range\n");
return -EAGAIN;
}
- printk("amvideocap_mmap ok\n");
+ //printk("amvideocap_mmap ok\n");
return 0;
}
static ssize_t amvideocap_read(struct file *file, char __user *buf, size_t count, loff_t * ppos)
@@ -626,12 +626,12 @@
waitdelay=file->f_flags & O_NONBLOCK ? HZ/100 : HZ * 10;
}
if(!pos){/*trigger a new capture,*/
- printk("start amvideocap_read waitdelay=%d\n",waitdelay);
+ //printk("start amvideocap_read waitdelay=%d\n",waitdelay);
ret = amvideocap_capture_one_frame_wait(priv,waitdelay);
- printk("amvideocap_read=%d,priv->state=%d,priv->vaddr=%p\n", ret,priv->state,priv->vaddr);
+ //printk("amvideocap_read=%d,priv->state=%d,priv->vaddr=%p\n", ret,priv->state,priv->vaddr);
if ((ret == 0) && (priv->state==AMVIDEOCAP_STATE_FINISHED_CAPTURE) && (priv->vaddr != NULL)) {
int size = min((int)count, (priv->out.byte_per_pix * priv->out.width_aligned* priv->out.height));
- printk("priv->out_width=%d priv->out_height=%d priv->outfmt_byteppix=%d, size=%d\n", priv->out.width,priv->out.height,priv->out.byte_per_pix,size);
+ //printk("priv->out_width=%d priv->out_height=%d priv->outfmt_byteppix=%d, size=%d\n", priv->out.width,priv->out.height,priv->out.byte_per_pix,size);
copied=copy_to_user(buf, priv->vaddr, size);
if(copied){
printk("amvideocap_read %d copy_to_user failed \n",size);
@@ -646,7 +646,7 @@
int maxsize = priv->out.byte_per_pix * priv->out.width_aligned* priv->out.height;
if(pos<maxsize){
int rsize=min((int)count,(maxsize-(int)pos));
- ///printk("amvideocap_read11 try copy %d,pos=%d\n",rsize,pos);
+ //printk("amvideocap_read11 try copy %d,pos=%d\n",rsize,pos);
copied=copy_to_user(buf, priv->vaddr+pos, rsize);
if(copied){
printk("amvideocap_read11 %d copy_to_user failed \n",rsize);