mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 04:48:04 +09:00
update win0 i2p ioctl
This commit is contained in:
@@ -123,6 +123,15 @@ struct win0_par {
|
||||
u32 y_offset;
|
||||
u32 uv_offset;
|
||||
|
||||
u32 odd_y_offset;
|
||||
u32 odd_uv_offset;
|
||||
u32 odd_nxt_y_offset;
|
||||
u32 odd_nxt_uv_offset;
|
||||
u32 even_y_offset;
|
||||
u32 even_uv_offset;
|
||||
u32 even_nxt_y_offset;
|
||||
u32 even_nxt_uv_offset;
|
||||
|
||||
struct win0_fmk fmktmp;
|
||||
struct win0_fmk fmk;
|
||||
|
||||
@@ -633,7 +642,7 @@ int rk2818_set_cursor(struct fb_info *info, struct fb_cursor *cursor)
|
||||
{
|
||||
struct rk2818fb_inf *inf = dev_get_drvdata(info->device);
|
||||
|
||||
fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__);
|
||||
//fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__);
|
||||
|
||||
/* check not being asked to exceed capabilities */
|
||||
|
||||
@@ -815,7 +824,7 @@ static int win0fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch(var->nonstd&0xff)
|
||||
switch(var->nonstd&0x0f)
|
||||
{
|
||||
case 0: // rgb
|
||||
switch(var->bits_per_pixel)
|
||||
@@ -829,7 +838,7 @@ static int win0fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
var->bits_per_pixel = 32;
|
||||
break;
|
||||
}
|
||||
var->nonstd &= 0xFCFF; //not support I2P in this format
|
||||
var->nonstd &= ~0xc0; //not support I2P in this format
|
||||
break;
|
||||
case 1: // yuv422
|
||||
var->xres_virtual = (var->xres_virtual + 0x3) & (~0x3);
|
||||
@@ -851,7 +860,7 @@ static int win0fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
var->yres = (var->yres + 0x1) & (~0x1);
|
||||
var->xoffset = (var->xoffset) & (~0x3);
|
||||
var->yoffset = (var->yoffset) & (~0x1);
|
||||
var->nonstd &= 0xFCFF; //not support I2P in this format
|
||||
var->nonstd &= ~0xc0; //not support I2P in this format
|
||||
break;
|
||||
case 4: // yuv420m
|
||||
var->xres_virtual = (var->xres_virtual + 0x7) & (~0x7);
|
||||
@@ -860,13 +869,13 @@ static int win0fb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
|
||||
var->yres = (var->yres + 0x1) & (~0x1);
|
||||
var->xoffset = (var->xoffset) & (~0x7);
|
||||
var->yoffset = (var->yoffset) & (~0x1);
|
||||
var->nonstd &= 0xFCFF; //not support I2P in this format
|
||||
var->nonstd &= ~0xc0; //not support I2P in this format
|
||||
break;
|
||||
case 5: // yuv444
|
||||
var->xres_virtual = (var->xres_virtual + 0x3) & (~0x3);
|
||||
var->xres = (var->xres + 0x3) & (~0x3);
|
||||
var->xoffset = (var->xoffset) & (~0x3);
|
||||
var->nonstd &= 0xFCFF; //not support I2P in this format
|
||||
var->nonstd &= ~0xc0; //not support I2P in this format
|
||||
break;
|
||||
default:
|
||||
printk(">>>>>> win0fb var->nonstd=%d is invalid! \n", var->nonstd);
|
||||
@@ -902,7 +911,7 @@ static int win0fb_set_par(struct fb_info *info)
|
||||
|
||||
u8 format = 0;
|
||||
dma_addr_t map_dma;
|
||||
u32 y_offset=0, uv_offset=0, cblen=0, crlen=0, map_size=0, smem_len=0, i2p_len=0;
|
||||
u32 cblen=0, crlen=0, map_size=0, smem_len=0, i2p_len=0;
|
||||
u32 pre_y_addr = 0, pre_uv_addr = 0, nxt_y_addr = 0, nxt_uv_addr = 0;
|
||||
|
||||
u32 actWidth = 0;
|
||||
@@ -923,15 +932,17 @@ static int win0fb_set_par(struct fb_info *info)
|
||||
u32 ScaleYUpX=0x1000, ScaleYDnX=0x1000, ScaleYUpY=0x1000, ScaleYDnY=0x1000;
|
||||
u32 ScaleCbrUpX=0x1000, ScaleCbrDnX=0x1000, ScaleCbrUpY=0x1000, ScaleCbrDnY=0x1000;
|
||||
|
||||
u8 i2p_mode = (var->nonstd & 0x0100)>>8;
|
||||
u8 i2p_polarity = (var->nonstd & 0x0200)>>9;
|
||||
u8 data_format = var->nonstd&0xff;
|
||||
u8 i2p_mode = (var->nonstd & 0x80)>>7;
|
||||
u8 i2p_polarity = (var->nonstd & 0x40)>>6;
|
||||
u8 data_format = var->nonstd&0x0f;
|
||||
u32 win0_en = var->reserved[2];
|
||||
u32 y_addr = var->reserved[3]; //user alloc buf addr y
|
||||
u32 uv_addr = var->reserved[4];
|
||||
|
||||
fbprintk(">>>>>> %s : %s\n", __FILE__, __FUNCTION__);
|
||||
|
||||
fbprintk("win0_en = %x, y_addr = %8x, uv_addr = %8x\n", win0_en, y_addr, uv_addr);
|
||||
|
||||
CHK_SUSPEND(inf);
|
||||
|
||||
/* calculate y_offset,uv_offset,line_length,cblen and crlen */
|
||||
@@ -943,12 +954,12 @@ static int win0fb_set_par(struct fb_info *info)
|
||||
case 16: // rgb565
|
||||
format = 1;
|
||||
fix->line_length = 2 * xvir;
|
||||
y_offset = (yact_st*xvir + xact_st)*2;
|
||||
par->y_offset = (yact_st*xvir + xact_st)*2;
|
||||
break;
|
||||
case 32: // rgb888
|
||||
format = 0;
|
||||
fix->line_length = 4 * xvir;
|
||||
y_offset = (yact_st*xvir + xact_st)*4;
|
||||
par->y_offset = (yact_st*xvir + xact_st)*4;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -956,59 +967,115 @@ static int win0fb_set_par(struct fb_info *info)
|
||||
break;
|
||||
case 1: // yuv422
|
||||
format = 2;
|
||||
fix->line_length = xvir;
|
||||
y_offset = yact_st*xvir + xact_st;
|
||||
uv_offset = yact_st*xvir + xact_st;
|
||||
if(var->rotate == 270)
|
||||
{
|
||||
y_offset += xvir*(yact- 1);
|
||||
uv_offset += xvir*(yact - 1);
|
||||
}
|
||||
fix->line_length = xvir;
|
||||
cblen = crlen = (xvir*yvir)/2;
|
||||
|
||||
if(i2p_mode)
|
||||
{
|
||||
i2p_len = (xvir*yvir)*2;
|
||||
i2p_len = (xvir*yvir)*2;
|
||||
if(var->rotate==0) //even
|
||||
{
|
||||
par->even_y_offset = (yact_st*xvir+xact_st) + xvir;
|
||||
par->even_uv_offset = (yact_st*xvir+xact_st) + xvir;
|
||||
par->even_nxt_y_offset = (yact_st*xvir+xact_st);
|
||||
par->even_nxt_uv_offset = (yact_st*xvir+xact_st);
|
||||
|
||||
par->odd_y_offset = (yact_st*xvir+xact_st);
|
||||
par->odd_uv_offset = (yact_st*xvir+xact_st);
|
||||
par->odd_nxt_y_offset = (yact_st*xvir+xact_st) + xvir;
|
||||
par->odd_nxt_uv_offset = (yact_st*xvir+xact_st) + xvir;
|
||||
}
|
||||
else if(var->rotate==270) //even
|
||||
{
|
||||
par->even_y_offset = (yact_st*xvir+xact_st) + xvir*(yact-1);
|
||||
par->even_uv_offset = (yact_st*xvir+xact_st) + xvir*(yact-1);
|
||||
par->even_nxt_y_offset = (yact_st*xvir+xact_st) + xvir*(yact-2);
|
||||
par->even_nxt_uv_offset = (yact_st*xvir+xact_st) + xvir*(yact-2);
|
||||
|
||||
par->odd_y_offset = (yact_st*xvir+xact_st) + xvir*(yact-2);
|
||||
par->odd_uv_offset = (yact_st*xvir+xact_st) + xvir*(yact-2);
|
||||
par->odd_nxt_y_offset = (yact_st*xvir+xact_st) + xvir*(yact-1);
|
||||
par->odd_nxt_uv_offset = (yact_st*xvir+xact_st) + xvir*(yact-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
par->y_offset = yact_st*xvir + xact_st;
|
||||
par->uv_offset = yact_st*xvir + xact_st;
|
||||
if(var->rotate == 270)
|
||||
{
|
||||
par->y_offset += xvir*(yact- 1);
|
||||
par->uv_offset += xvir*(yact - 1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2: // yuv4200
|
||||
format = 3;
|
||||
fix->line_length = xvir;
|
||||
y_offset = yact_st*xvir + xact_st;
|
||||
uv_offset = (yact_st/2)*xvir + xact_st;
|
||||
if(var->rotate == 270)
|
||||
{
|
||||
y_offset += xvir*(yact - 1);
|
||||
uv_offset += xvir*(yact/2 - 1);
|
||||
}
|
||||
fix->line_length = xvir;
|
||||
cblen = crlen = (xvir*yvir)/4;
|
||||
if(i2p_mode)
|
||||
{
|
||||
i2p_len = (xvir*yvir)*3/2;
|
||||
|
||||
if(var->rotate==0) //even
|
||||
{
|
||||
par->even_y_offset = (yact_st*xvir+xact_st) + xvir;
|
||||
par->even_uv_offset = (yact_st/2*xvir+xact_st) + xvir;
|
||||
par->even_nxt_y_offset = (yact_st*xvir+xact_st);
|
||||
par->even_nxt_uv_offset = (yact_st/2*xvir+xact_st);
|
||||
|
||||
par->odd_y_offset = (yact_st*xvir+xact_st);
|
||||
par->odd_uv_offset = (yact_st/2*xvir+xact_st);
|
||||
par->odd_nxt_y_offset = (yact_st*xvir+xact_st) + xvir;
|
||||
par->odd_nxt_uv_offset = (yact_st/2*xvir+xact_st) + xvir;
|
||||
}
|
||||
else if(var->rotate==270) //even
|
||||
{
|
||||
par->even_y_offset = (yact_st*xvir+xact_st) + xvir*(yact-1);
|
||||
par->even_uv_offset = (yact_st/2*xvir+xact_st) + xvir*(yact/2-1);
|
||||
par->even_nxt_y_offset = (yact_st*xvir+xact_st) + xvir*(yact-2);
|
||||
par->even_nxt_uv_offset = (yact_st/2*xvir+xact_st) + xvir*(yact/2-2);
|
||||
|
||||
par->odd_y_offset = (yact_st*xvir+xact_st) + xvir*(yact-2);
|
||||
par->odd_uv_offset = (yact_st/2*xvir+xact_st) + xvir*(yact/2-2);
|
||||
par->odd_nxt_y_offset = (yact_st*xvir+xact_st) + xvir*(yact-1);
|
||||
par->odd_nxt_uv_offset = (yact_st/2*xvir+xact_st) + xvir*(yact/2-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
par->y_offset = yact_st*xvir + xact_st;
|
||||
par->uv_offset = (yact_st/2)*xvir + xact_st;
|
||||
if(var->rotate == 270)
|
||||
{
|
||||
par->y_offset += xvir*(yact - 1);
|
||||
par->uv_offset += xvir*(yact/2 - 1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3: // yuv4201
|
||||
format = 4;
|
||||
fix->line_length = xvir;
|
||||
y_offset = (yact_st/2)*2*xvir + (xact_st)*2;
|
||||
uv_offset = (yact_st/2)*xvir + xact_st;
|
||||
par->y_offset = (yact_st/2)*2*xvir + (xact_st)*2;
|
||||
par->uv_offset = (yact_st/2)*xvir + xact_st;
|
||||
if(var->rotate == 270)
|
||||
{
|
||||
y_offset += xvir*2*(yact/2 - 1);
|
||||
uv_offset += xvir*(yact/2 - 1);
|
||||
par->y_offset += xvir*2*(yact/2 - 1);
|
||||
par->uv_offset += xvir*(yact/2 - 1);
|
||||
}
|
||||
cblen = crlen = (xvir*yvir)/4;
|
||||
break;
|
||||
case 4: // yuv420m
|
||||
format = 5;
|
||||
fix->line_length = xvir;
|
||||
y_offset = (yact_st/2)*3*xvir + (xact_st)*3;
|
||||
par->y_offset = (yact_st/2)*3*xvir + (xact_st)*3;
|
||||
cblen = crlen = (xvir*yvir)/4;
|
||||
break;
|
||||
case 5: // yuv444
|
||||
format = 6;
|
||||
fix->line_length = xvir;
|
||||
y_offset = yact_st*xvir + xact_st;
|
||||
uv_offset = yact_st*2*xvir + xact_st*2;
|
||||
par->y_offset = yact_st*xvir + xact_st;
|
||||
par->uv_offset = yact_st*2*xvir + xact_st*2;
|
||||
cblen = crlen = (xvir*yvir);
|
||||
break;
|
||||
default:
|
||||
@@ -1018,7 +1085,7 @@ static int win0fb_set_par(struct fb_info *info)
|
||||
smem_len = fix->line_length * yvir + cblen + crlen + i2p_len;
|
||||
map_size = PAGE_ALIGN(smem_len);
|
||||
|
||||
if(y_addr && uv_addr && !i2p_mode) // buffer alloced by user
|
||||
if(y_addr && uv_addr ) // buffer alloced by user, it's default instance
|
||||
{
|
||||
if (info->screen_base) {
|
||||
printk(">>>>>> win0fb unmap memory(%d)! \n", info->fix.smem_len);
|
||||
@@ -1030,6 +1097,7 @@ static int win0fb_set_par(struct fb_info *info)
|
||||
fix->mmio_start = uv_addr;
|
||||
|
||||
par->addr_seted = ((-1==(int)y_addr)&&(-1==(int)uv_addr)) ? 0 : 1;
|
||||
fbprintk("buffer alloced by user fix->smem_start = %8x, fix->smem_len = %8x, fix->mmio_start = %8x \n", fix->smem_start, fix->smem_len, fix->mmio_start);
|
||||
}
|
||||
else // driver alloce buffer
|
||||
{
|
||||
@@ -1074,58 +1142,39 @@ static int win0fb_set_par(struct fb_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
par->y_offset = y_offset;
|
||||
par->uv_offset = uv_offset;
|
||||
// calculate the display phy address
|
||||
y_addr = fix->smem_start + par->y_offset;
|
||||
uv_addr = fix->mmio_start + par->uv_offset;
|
||||
|
||||
fbprintk("y_addr 0x%08x = 0x%08x + %d\n", y_addr, (u32)fix->smem_start, par->y_offset);
|
||||
fbprintk("uv_addr 0x%08x = 0x%08x + %d\n", uv_addr, (u32)fix->mmio_start , par->uv_offset);
|
||||
|
||||
// calculate the display phy address
|
||||
|
||||
if(i2p_mode && fix->reserved[1] && fix->reserved[2])
|
||||
{
|
||||
if(i2p_polarity && (var->rotate==0)) //even
|
||||
{
|
||||
y_addr = fix->smem_start + (yact_st*xvir+xact_st) + xvir;
|
||||
uv_addr = fix->mmio_start + (yact_st/data_format*xvir+xact_st) + xvir;
|
||||
pre_y_addr = y_addr - xvir;
|
||||
pre_uv_addr = uv_addr - xvir;
|
||||
nxt_y_addr = fix->reserved[1] + (yact_st*xvir+xact_st);
|
||||
nxt_uv_addr = fix->reserved[2] + (yact_st/data_format*xvir+xact_st);
|
||||
{
|
||||
if(i2p_polarity)
|
||||
{
|
||||
y_addr = fix->smem_start + par->even_y_offset;
|
||||
uv_addr = fix->mmio_start + par->even_uv_offset;
|
||||
pre_y_addr = fix->smem_start + par->even_nxt_y_offset;
|
||||
pre_uv_addr = fix->mmio_start + par->even_nxt_uv_offset;
|
||||
nxt_y_addr = fix->reserved[1] + par->even_nxt_y_offset;
|
||||
nxt_uv_addr = fix->reserved[2] + par->even_nxt_uv_offset;
|
||||
}
|
||||
else if(!i2p_polarity && (var->rotate==0)) //odd
|
||||
{
|
||||
y_addr = fix->smem_start + (yact_st*xvir+xact_st);
|
||||
uv_addr = fix->mmio_start + (yact_st/data_format*xvir+xact_st);
|
||||
pre_y_addr = y_addr + xvir;
|
||||
pre_uv_addr = uv_addr + xvir;
|
||||
nxt_y_addr = fix->reserved[1] + (yact_st*xvir+xact_st) + xvir;
|
||||
nxt_uv_addr = fix->reserved[2] + (yact_st/data_format*xvir+xact_st) + xvir;
|
||||
else
|
||||
{
|
||||
y_addr = fix->smem_start + par->odd_y_offset;
|
||||
uv_addr = fix->mmio_start + par->odd_uv_offset;
|
||||
pre_y_addr = fix->smem_start + par->odd_nxt_y_offset;
|
||||
pre_uv_addr = fix->mmio_start + par->odd_nxt_uv_offset;
|
||||
nxt_y_addr = fix->reserved[1] + par->odd_nxt_y_offset;
|
||||
nxt_uv_addr = fix->reserved[2] + par->odd_nxt_uv_offset;
|
||||
}
|
||||
else if(i2p_polarity && (var->rotate==270)) //even
|
||||
{
|
||||
y_addr = fix->smem_start+ (yact_st*xvir+xact_st) + xvir*(yact-1);
|
||||
uv_addr = fix->mmio_start+ (yact_st/data_format*xvir+xact_st) + xvir*(yact/data_format-1);
|
||||
pre_y_addr = fix->smem_start+ (yact_st*xvir+xact_st) + xvir*(yact-2);
|
||||
pre_uv_addr = fix->mmio_start+ (yact_st/data_format*xvir+xact_st) + xvir*(yact/data_format-2);
|
||||
nxt_y_addr = fix->reserved[1] + (yact_st*xvir+xact_st) + xvir*(yact-2);
|
||||
nxt_uv_addr = fix->reserved[2] + (yact_st/data_format*xvir+xact_st) + xvir*(yact/data_format-2);
|
||||
}
|
||||
else if(!i2p_polarity&& (var->rotate==270)) //odd
|
||||
{
|
||||
y_addr = fix->smem_start + (yact_st*xvir+xact_st) + xvir*(yact-2);
|
||||
uv_addr = fix->mmio_start + (yact_st/data_format*xvir+xact_st) + xvir*(yact/data_format-2);
|
||||
pre_y_addr = fix->smem_start + (yact_st*xvir+xact_st) + xvir*(yact-1);
|
||||
pre_uv_addr = fix->mmio_start + (yact_st/data_format*xvir+xact_st) + xvir*(yact/data_format-1);
|
||||
nxt_y_addr = fix->reserved[1]+ (yact_st*xvir+xact_st) + xvir*(yact-1);
|
||||
nxt_uv_addr = fix->reserved[2] + (yact_st/data_format*xvir+xact_st) + xvir*(yact/data_format-1);
|
||||
}
|
||||
|
||||
fbprintk("pre_y_addr 0x%08x = 0x%08x + %d\n", pre_y_addr, (u32)fix->smem_start, par->even_nxt_y_offset);
|
||||
fbprintk("pre_uv_addr 0x%08x = 0x%08x + %d\n", pre_uv_addr, (u32)fix->mmio_start , par->even_nxt_uv_offset);
|
||||
fbprintk("nxt_y_addr 0x%08x = 0x%08x + %d\n", nxt_y_addr, (u32)fix->reserved[1], par->even_nxt_y_offset);
|
||||
fbprintk("nxt_uv_addr 0x%08x = 0x%08x + %d\n", nxt_uv_addr, (u32)fix->reserved[2] , par->even_nxt_uv_offset);
|
||||
}
|
||||
else
|
||||
{
|
||||
y_addr = fix->smem_start + y_offset;
|
||||
uv_addr = fix->mmio_start + uv_offset;
|
||||
}
|
||||
|
||||
fbprintk("y_addr 0x%08x = 0x%08x + %d\n", y_addr, (u32)fix->smem_start, y_offset);
|
||||
fbprintk("uv_addr 0x%08x = 0x%08x + %d\n", uv_addr, (u32)fix->mmio_start , uv_offset);
|
||||
|
||||
if(var->rotate == 270)
|
||||
{
|
||||
@@ -1236,13 +1285,6 @@ static int win0fb_set_par(struct fb_info *info)
|
||||
LcdWrReg(inf, I2P_REF0_MST_CBR, pre_uv_addr);
|
||||
LcdWrReg(inf, I2P_REF1_MST_Y, nxt_y_addr);
|
||||
LcdWrReg(inf, I2P_REF1_MST_CBR, nxt_uv_addr);
|
||||
|
||||
// when win0 is open, enable win1 color key and set the color to black(rgb=0)
|
||||
if(win0_en){
|
||||
LcdMskReg(inf, WIN1_COLOR_KEY_CTRL, m_COLORKEY_EN | m_KEYCOLOR, v_COLORKEY_EN(1) | v_KEYCOLOR(0));
|
||||
}else{
|
||||
LcdMskReg(inf, WIN1_COLOR_KEY_CTRL, m_COLORKEY_EN , v_COLORKEY_EN(0));
|
||||
}
|
||||
|
||||
switch(format)
|
||||
{
|
||||
@@ -1277,7 +1319,7 @@ static int win0fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *inf
|
||||
|
||||
CHK_SUSPEND(inf);
|
||||
|
||||
switch(var0->nonstd&0xff)
|
||||
switch(var0->nonstd&0x0f)
|
||||
{
|
||||
case 0: // rgb
|
||||
switch(var0->bits_per_pixel)
|
||||
@@ -1344,7 +1386,7 @@ static int win0fb_pan_display(struct fb_var_screeninfo *var, struct fb_info *inf
|
||||
int win0fb_rotate(struct fb_info *fbi, int rotate)
|
||||
{
|
||||
struct fb_var_screeninfo *var = &fbi->var;
|
||||
u32 SrcFmt = var->nonstd&0xff;
|
||||
u32 SrcFmt = var->nonstd&0x0f;
|
||||
|
||||
fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__);
|
||||
|
||||
@@ -1428,7 +1470,8 @@ static int win0fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar
|
||||
void __user *argp = (void __user *)arg;
|
||||
|
||||
fbprintk(">>>>>> %s : %s \n", __FILE__, __FUNCTION__);
|
||||
|
||||
fbprintk("win0fb_ioctl cmd = %8x, arg = %8x \n", cmd, arg);
|
||||
|
||||
CHK_SUSPEND(inf);
|
||||
|
||||
switch(cmd)
|
||||
@@ -1452,7 +1495,7 @@ static int win0fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar
|
||||
u32 yuv_phy[2];
|
||||
if (copy_from_user(yuv_phy, argp, 8))
|
||||
return -EFAULT;
|
||||
|
||||
|
||||
yuv_phy[0] += par->y_offset;
|
||||
yuv_phy[1] += par->uv_offset;
|
||||
|
||||
@@ -1522,7 +1565,75 @@ static int win0fb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar
|
||||
win0fb_rotate(info, 270);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case FB1_IOCTL_SET_I2P_ODD_ADDR:
|
||||
{
|
||||
u32 yuv_phy[4];
|
||||
u32 y_addr=0, uv_addr=0;
|
||||
u32 pre_y_addr=0, pre_uv_addr=0;
|
||||
u32 nxt_y_addr=0,nxt_uv_addr=0;
|
||||
if (copy_from_user(yuv_phy, argp, 16))
|
||||
return -EFAULT;
|
||||
|
||||
y_addr = yuv_phy[0] + par->odd_y_offset;
|
||||
uv_addr = yuv_phy[1] + par->odd_uv_offset;
|
||||
pre_y_addr = yuv_phy[0] + par->odd_nxt_y_offset;
|
||||
pre_uv_addr = yuv_phy[1] + par->odd_nxt_uv_offset;
|
||||
nxt_y_addr = yuv_phy[2] + par->odd_nxt_y_offset;
|
||||
nxt_uv_addr = yuv_phy[3] + par->odd_nxt_uv_offset;
|
||||
|
||||
//printk("new y_addr=%08x, new uv_addr=%08x \n", yuv_phy[0], yuv_phy[1]);
|
||||
LcdWrReg(inf, WIN0_YRGB_MST, y_addr);
|
||||
LcdWrReg(inf, WIN0_CBR_MST, uv_addr);
|
||||
LcdWrReg(inf, I2P_REF0_MST_Y, pre_y_addr);
|
||||
LcdWrReg(inf, I2P_REF0_MST_CBR, pre_uv_addr);
|
||||
LcdWrReg(inf, I2P_REF1_MST_Y, nxt_y_addr);
|
||||
LcdWrReg(inf, I2P_REF1_MST_CBR, nxt_uv_addr);
|
||||
LcdMskReg(inf, DSP_CTRL0, m_I2P_CUR_POLARITY, v_I2P_CUR_POLARITY(0));
|
||||
LcdWrReg(inf, REG_CFG_DONE, 0x01);
|
||||
|
||||
// enable win0 after the win0 par is seted
|
||||
par->addr_seted = 1;
|
||||
if(par->par_seted) {
|
||||
LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(1));
|
||||
mcu_refresh(inf);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case FB1_IOCTL_SET_I2P_EVEN_ADDR:
|
||||
{
|
||||
u32 yuv_phy[4];
|
||||
u32 y_addr=0, uv_addr=0;
|
||||
u32 pre_y_addr=0, pre_uv_addr=0;
|
||||
u32 nxt_y_addr=0,nxt_uv_addr=0;
|
||||
if (copy_from_user(yuv_phy, argp, 16))
|
||||
return -EFAULT;
|
||||
|
||||
y_addr = yuv_phy[0] + par->even_y_offset;
|
||||
uv_addr = yuv_phy[1] + par->even_uv_offset;
|
||||
pre_y_addr = yuv_phy[0] + par->even_nxt_y_offset;
|
||||
pre_uv_addr = yuv_phy[1] + par->even_nxt_uv_offset;
|
||||
nxt_y_addr = yuv_phy[2] + par->even_nxt_y_offset;
|
||||
nxt_uv_addr = yuv_phy[3] + par->even_nxt_uv_offset;
|
||||
|
||||
//printk("new y_addr=%08x, new uv_addr=%08x \n", yuv_phy[0], yuv_phy[1]);
|
||||
LcdWrReg(inf, WIN0_YRGB_MST, y_addr);
|
||||
LcdWrReg(inf, WIN0_CBR_MST, uv_addr);
|
||||
LcdWrReg(inf, I2P_REF0_MST_Y, pre_y_addr);
|
||||
LcdWrReg(inf, I2P_REF0_MST_CBR, pre_uv_addr);
|
||||
LcdWrReg(inf, I2P_REF1_MST_Y, nxt_y_addr);
|
||||
LcdWrReg(inf, I2P_REF1_MST_CBR, nxt_uv_addr);
|
||||
LcdMskReg(inf, DSP_CTRL0, m_I2P_CUR_POLARITY, v_I2P_CUR_POLARITY(1));
|
||||
LcdWrReg(inf, REG_CFG_DONE, 0x01);
|
||||
|
||||
// enable win0 after the win0 par is seted
|
||||
par->addr_seted = 1;
|
||||
if(par->par_seted) {
|
||||
LcdMskReg(inf, SYS_CONFIG, m_W0_ENABLE, v_W0_ENABLE(1));
|
||||
mcu_refresh(inf);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1760,8 +1871,11 @@ static int win1fb_set_par(struct fb_info *info)
|
||||
|
||||
LcdMskReg(inf, BLEND_CTRL, m_W1_BLEND_EN | m_W1_BLEND_FACTOR_SELECT | m_W1_BLEND_FACTOR,
|
||||
v_W1_BLEND_EN((TRSP_FMREG==trspmode) || (TRSP_MASK==trspmode)) |
|
||||
v_W1_BLEND_FACTOR_SELECT(TRSP_FMRAM==trspmode) | v_W1_BLEND_FACTOR(trspval));
|
||||
|
||||
v_W1_BLEND_FACTOR_SELECT(TRSP_FMRAM==trspmode) | v_W1_BLEND_FACTOR(trspval));
|
||||
|
||||
// enable win1 color key and set the color to black(rgb=0)
|
||||
LcdMskReg(inf, WIN1_COLOR_KEY_CTRL, m_COLORKEY_EN | m_KEYCOLOR, v_COLORKEY_EN(1) | v_KEYCOLOR(0));
|
||||
|
||||
if(1==format) //rgb565
|
||||
{
|
||||
LcdMskReg(inf, SWAP_CTRL, m_W1_8_SWAP | m_W1_16_SWAP | m_W1_R_SHIFT_SWAP | m_W1_565_RB_SWAP,
|
||||
@@ -1903,7 +2017,7 @@ static struct fb_ops win1fb_ops = {
|
||||
.fb_fillrect = cfb_fillrect,
|
||||
.fb_copyarea = cfb_copyarea,
|
||||
.fb_imageblit = cfb_imageblit,
|
||||
//.fb_cursor = rk2818_set_cursor,
|
||||
.fb_cursor = rk2818_set_cursor,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -345,6 +345,8 @@
|
||||
#define FB1_IOCTL_SET_YUV_ADDR 0x5002
|
||||
#define FB1_TOCTL_SET_MCU_DIR 0x5003
|
||||
#define FB1_IOCTL_SET_ROTATE 0x5004
|
||||
#define FB1_IOCTL_SET_I2P_ODD_ADDR 0x5005
|
||||
#define FB1_IOCTL_SET_I2P_EVEN_ADDR 0x5006
|
||||
|
||||
|
||||
/********************************************************************
|
||||
|
||||
Reference in New Issue
Block a user