/*---------------------------------------------------------------------------*/
/* © copyright STMicroelectronics(Wireless),2008. All rights reserved. For */
/* information, STMicroelectronics(Wireless)reserves the right to license */
/* this software concurrently under separate license conditions. */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU Lesser General Public License as published */
/* by the Free Software Foundation; either version 2.1 of the License, */
/* or (at your option)any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but */
/* WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See */
/* the GNU Lesser General Public License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with this program. If not, see . */
/*---------------------------------------------------------------------------*/
/** Include files */
/** Linux includes */
#include
#include
#include
#include
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/** Driver include file */
#include "b2r2_driver_usr_api.h"
/** b2r2 API file */
#include "b2r2_api.h"
#include "b2r2_global.h"
static unsigned int compute_the_horizontal_scale_factor(B2R2_RECT *psrc_window, \
B2R2_RECT *pdst_window,int *x_out_width);
static unsigned int compute_the_vertical_scale_factor(B2R2_RECT *psrc_window,\
B2R2_RECT *pdst_window);
static void configure_node_for_b2r2_op(b2r2_library *library,b2r2_configuration *config);
#define DEBUG_NODE_DATA (0)
#define DEBUG_PRINTF (0)
#define PERFORMANCE_MEASUREMENT (1)
/**
* It opens the b2r2 driver instance
* and returns NONE.
* @param[in] library The library instance.
* @return NONE
*/
void b2r2_library_init(b2r2_library* library)
{
/** Open one driver instance */
#if DEBUG_PRINTF
printf("%s\n",__FUNCTION__);
#endif
library->file_pointer=open("/dev/b2r2",O_RDWR);
}
/**
* Close the b2r2 driver instance
* and returns NONE.
* @param[in] library The library instance.
* @return NONE
*/
void b2r2_library_close(b2r2_library* library)
{
/** Close the driver instance */
#if DEBUG_PRINTF
printf("%s\n",__FUNCTION__);
#endif
close(library->file_pointer);
}
/**
* It allocates the kernal memory
* and returns NONE.
* @param[in] library The library instance.
* @param[out] memory Physical address of the kernal buffer.
* @return NONE
*/
void b2r2_library_allocate(b2r2_library* library,b2r2_buffer_memory* memory)
{
b2r2_driver_memory driver_memory;
#if DEBUG_PRINTF
printf("%s\n",__FUNCTION__);
#endif
/** Assign the size of memory */
driver_memory.size_of_memory=memory->size_of_memory;
/** Get the physical address of that memory */
ioctl(library->file_pointer,B2R2_ALLOCATE_MEMORY,&driver_memory);
memory->physical_address=driver_memory.physical_address;
/** Get the virtual address of that memory */
memory->logical_address= mmap (NULL,memory->size_of_memory,PROT_READ|PROT_WRITE,MAP_SHARED,
library->file_pointer,0);
}
/**
* It deallocates the kernal memory
* and returns NONE.
* @param[in] library The library instance.
* @param[out] memory Physical address of the kernal buffer.
* @return NONE
*/
void b2r2_library_deallocate(b2r2_library* library,b2r2_buffer_memory* memory)
{
b2r2_driver_memory driver_memory;
#if DEBUG_PRINTF
printf("%s\n",__FUNCTION__);
#endif
/** Assign the size of memory */
driver_memory.size_of_memory=memory->size_of_memory;
driver_memory.physical_address=memory->physical_address;
/** Get the physical address of that memory */
ioctl(library->file_pointer,B2R2_DEALLOCATE_MEMORY,&driver_memory);
/** need to remove the virtual address */
munmap(memory->logical_address,memory->size_of_memory);
}
void do_pixmap_pitch(b2r2_color_form color_format,unsigned short pic_width,unsigned short *pixmap_pitch)
{
switch(color_format)
{
case A1:
*pixmap_pitch = pic_width/8;
if( 0!=pic_width%8)
{
*pixmap_pitch +=1;
}
break;
case CLUT1:
*pixmap_pitch = pic_width/8;
if( 0!=pic_width%8)
{
*pixmap_pitch +=1;
}
break;
case CLUT2:
*pixmap_pitch = pic_width/4;
if( 0!=pic_width%4)
{
*pixmap_pitch +=1;
}
break;
case CLUT4:
*pixmap_pitch = pic_width/2;
if( 0!=pic_width%2)
{
*pixmap_pitch +=1;
}
break;
case CLUT8:
*pixmap_pitch = pic_width;
break;
case ACLUT44:
*pixmap_pitch = pic_width;
break;
case ACLUT88:
*pixmap_pitch = pic_width*2;
break;
case A8:
*pixmap_pitch = pic_width;
break;
case RGB565:
*pixmap_pitch = pic_width*2;
break;
case ARGB4444:
*pixmap_pitch = pic_width*2;
break;
case ARGB1555:
*pixmap_pitch = pic_width*2;
break;
case ARGB8565:
*pixmap_pitch = pic_width*3;
break;
case RGB888:
*pixmap_pitch = pic_width*3;
break;
case YCBCR888:
*pixmap_pitch = pic_width*3;
break;
case ARGB8888:
*pixmap_pitch = pic_width*4;
break;
case AYCBCR8888:
*pixmap_pitch = pic_width*4;
break;
case YCBCR422R:
*pixmap_pitch = pic_width*2;
break;
case YCBCR42XMB:
*pixmap_pitch = pic_width;
break;
case YUV:
*pixmap_pitch = pic_width;
break;
case YCBCR42XMBN:
*pixmap_pitch = pic_width;
break;
case YCBCR42XR2B:
*pixmap_pitch = pic_width;
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////////
int b2r2_library_operation_configure(b2r2_library *library,b2r2_configuration *config)
{
b2r2_buffer_memory memory;
int no_of_nodes=1;
config->is_color_key_en = config->color_key.enable ? 1:0;
config->is_alpha_blend_en = config->alpha_blend.enable ? 1:0;
config->is_rect_clip_en = config->rect_clip.enable ? 1:0;
config->is_color_fill_en = config->color_fill.enable ? 1:0;
config->is_rop_ops_en = config->rop.enable ? 1:0;
if((config->is_alpha_blend_en||config->is_color_key_en||\
config->is_rect_clip_en||config->is_color_fill_en)&config->is_rop_ops_en)
{
//error to be defined
return -1;
}
if(config->dst_image.physical_address)
{
/*check for resize*/
config->is_resize=((config->src_window.width!=config->dst_window.width)|| \
(config->src_window.height!=config->dst_window.height))?1:0;
config->is_color_conversion = ((config->src_image.color_format == B2R2_YCBCR42XMBN) || \
(config->src_image.color_format == B2R2_YUV) || \
(config->src_image.color_format == B2R2_YCBCR888) || \
(config->src_image.color_format == B2R2_YCBCR422R) || \
(config->src_image.color_format == B2R2_AYCBCR8888) || \
(config->src_image.color_format == B2R2_YCBCR42XMB) || \
(config->src_image.color_format == B2R2_YCBCR42XR2B))?1:0;
config->is_rotation =(config->rotation!=B2R2_ROT_0)?1:0;
/*resize or rotation*/
if(config->is_resize || config->is_rotation || config->is_color_conversion)
{
/* Find the Number of nodes*/
if(config->is_rotation)
{
unsigned char is_src_width_multiple_of_16=1;
no_of_nodes = (config->rotation!=B2R2_ROT_180)?(config->src_window.width/16):1;
if(config->src_window.width%16)
{
no_of_nodes++;
is_src_width_multiple_of_16 =0;
}
/** We have to allocate memory for nodes */
memory.size_of_memory=no_of_nodes*sizeof(b2r2_link_list);
b2r2_library_allocate(library,&memory);
configure_rotate(no_of_nodes,is_src_width_multiple_of_16,&memory,config);
config->NodeAdress=memory.logical_address;
config->no_of_nodes =no_of_nodes;
config->last_nodeAdress =config->NodeAdress+(no_of_nodes-1)*sizeof(b2r2_link_list);
config->NodePhysicalAdress=memory.physical_address;
#if DEBUG_PRINTF
printf("%s\n",__FUNCTION__);
printf("no_of_nodes is %x \n",no_of_nodes);
printf("config->NodephyAdress is %x \n",memory.physical_address);
#endif
}
else
{
/** resize/color conversion*/
unsigned char is_src_width_multiple_of_128=1;
//printf("config->src_window.width:%d\n",config->src_window.width);
no_of_nodes = (config->src_window.width/128);
if(config->src_window.width%128)
{
no_of_nodes++;
is_src_width_multiple_of_128 =0;
}
/** We have to allocate memory for nodes */
memory.size_of_memory=no_of_nodes*sizeof(b2r2_link_list);
b2r2_library_allocate(library,&memory);
//printf("memory.physical_address:%x\n",memory.physical_address);
if (config->is_color_conversion)
configure_color_conversion(no_of_nodes,is_src_width_multiple_of_128,&memory,config);
else if (config->is_resize )
configure_resize(no_of_nodes,is_src_width_multiple_of_128,&memory,config);
config->NodeAdress=memory.logical_address;
config->no_of_nodes =no_of_nodes;
config->last_nodeAdress =config->NodeAdress+(no_of_nodes-1)*sizeof(b2r2_link_list);
config->NodePhysicalAdress=memory.physical_address;
#if DEBUG_PRINTF
printf("%s\n",__FUNCTION__);
printf("no_of_nodes is %x \n",no_of_nodes);
printf("config->NodephyAdress is %x \n",memory.physical_address);
#endif
}
}
else
{
/** We have to allocate memory for a node */
memory.size_of_memory=sizeof(b2r2_link_list);
b2r2_library_allocate(library,&memory);
config->NodeAdress=memory.logical_address;
config->no_of_nodes =1;
config->last_nodeAdress =config->NodeAdress;
config->NodePhysicalAdress=memory.physical_address;
configure_node_for_b2r2_op(library,config);
}
}
else
{
memory.size_of_memory=sizeof(b2r2_link_list);
b2r2_library_allocate(library,&memory);
config->NodeAdress=memory.logical_address;
config->no_of_nodes =1;
config->last_nodeAdress =config->NodeAdress;
config->NodePhysicalAdress=memory.physical_address;
configure_node_for_b2r2_op(library,config);
}
config->job.job_logical_address=memory.logical_address;
config->job.job_physical_address=memory.physical_address;
config->job.job_size=no_of_nodes*sizeof(b2r2_link_list);
config->job.job_pace_lna_physical_address=memory.physical_address+(no_of_nodes-1)*sizeof(b2r2_link_list);
return 0;
}
void b2r2_library_update_params(b2r2_library *library,b2r2_configuration *config,
B2R2_UPDATE_PARAMS params,B2R2_UPDATE_PARAMS_VAL *pVal)
{
b2r2_link_list *pt_mem;
unsigned short pixmap_pitch;
int i = 0;
pt_mem=(b2r2_link_list*)(config->NodeAdress);
switch(params)
{
case B2R2_FILL_COLOR_OP_PARAMS:
pt_mem->GROUP2.B2R2_S1CF = pVal->val;
pt_mem->GROUP1.B2R2_TXY = (pVal->window_params.src_window.top<window_params.src_window.left);
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(pVal->window_params.src_window.width)|(pVal->window_params.src_window.height<GROUP1.B2R2_TXY = (pVal->window_params.dst_window.top<window_params.dst_window.left));
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(pVal->window_params.dst_window.width)|(pVal->window_params.dst_window.height<GROUP3.B2R2_SXY = pt_mem->GROUP1.B2R2_TXY;
pt_mem->GROUP3.B2R2_SSZ = pt_mem->GROUP1.B2R2_TSZ;
pt_mem->GROUP4.B2R2_SXY = (pVal->window_params.src_window.top<window_params.src_window.left));
pt_mem->GROUP4.B2R2_SSZ = (RESVD|(pVal->window_params.src_window.width)|(pVal->window_params.src_window.height<GROUP0.B2R2_ACK = ((pt_mem->GROUP0.B2R2_ACK & 0xffff00ff) | (pVal->val<GROUP1.B2R2_TXY = (pVal->window_params.dst_window.top<window_params.dst_window.left));
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(pVal->window_params.dst_window.width)|(pVal->window_params.dst_window.height<GROUP3.B2R2_SXY = pt_mem->GROUP1.B2R2_TXY;
pt_mem->GROUP3.B2R2_SSZ = pt_mem->GROUP1.B2R2_TSZ;
pt_mem->GROUP4.B2R2_SXY = (pVal->window_params.src_window.top<window_params.src_window.left));
pt_mem->GROUP4.B2R2_SSZ = (RESVD|(pVal->window_params.src_window.width)|(pVal->window_params.src_window.height<GROUP12.B2R2_KEY1 =
((((pVal->val&0xFF000000)>>24)<val&0xF800)>>11)<<3)<val&0x07E0)>>5)<<2)<val&0x1F)<<3));
pt_mem->GROUP12.B2R2_KEY2 =
((((pVal->val&0xFF000000)>>24)<val&0xF800)>>11)<<3)|0x7)<val&0x07E0)>>5)<<2)|0x3)<val&0x1F)<<3)|0x7));
break;
case B2R2_ROTATION_OP_PARAMS:
break;
case B2R2_CLIP_OP_PARAMS:
pt_mem->GROUP6.B2R2_CWO =((pVal->window_params.clip_window.top<window_params.clip_window.left);
pt_mem->GROUP6.B2R2_CWS =(((pVal->window_params.clip_window.top+pVal->window_params.clip_window.height)<window_params.clip_window.left+pVal->window_params.clip_window.width));
break;
case B2R2_RESIZE_OP_PARAMS:
break;
case B2R2_ROP_OP_PARAMS:
pt_mem->GROUP0.B2R2_ACK =((pt_mem->GROUP0.B2R2_ACK & 0xffff00ff) | (pVal->val<no_of_nodes; i++)
{
pt_mem = (b2r2_link_list*)(config->NodeAdress+(i*sizeof(b2r2_link_list)));
if (pVal->val == B2R2_YCBCR42XMBN)
{
/*Source1*/
pt_mem->GROUP3.B2R2_SBA = 0;
/*Source2*/
pt_mem->GROUP4.B2R2_SBA = pVal->ppp_params.source_chroma_address;
/*Source3*/
pt_mem->GROUP5.B2R2_SBA = pVal->ppp_params.source_luma_address;
}
else if (pVal->val == B2R2_YUV)
{
/*Source1*/
pt_mem->GROUP3.B2R2_SBA = pVal->ppp_params.source_chroma2_address;
/*Source2*/
pt_mem->GROUP4.B2R2_SBA = pVal->ppp_params.source_chroma_address;
/*Source3*/
pt_mem->GROUP5.B2R2_SBA = pVal->ppp_params.source_luma_address;
}
}
break;
case B2R2_SOURCE_ADDRESS_OF_PARAMS:
if(config->is_alpha_blend_en || config->is_color_key_en || \
config->is_rect_clip_en || config->is_color_fill_en || config->is_rop_ops_en)
pt_mem->GROUP3.B2R2_SBA = pVal->val;
break;
case B2R2_DESTINATION_ADDRESS_OF_PARAMS:
if(config->is_alpha_blend_en || config->is_color_key_en || \
config->is_rect_clip_en || config->is_color_fill_en || config->is_rop_ops_en)
{
pt_mem->GROUP1.B2R2_TBA = pVal->val;
}
else if(config->is_resize || config->is_rotation || config->is_color_conversion)
{
for (i=0; i < config->no_of_nodes; i++)
{
pt_mem = (b2r2_link_list*)(config->NodeAdress+(i*sizeof(b2r2_link_list)));
pt_mem->GROUP1.B2R2_TBA = pVal->val;
}
}
break;
default:
printf("Inavlid params to update\n");
}
}
void b2r2_library_do_operation(b2r2_library *library,b2r2_configuration *config)
{
b2r2_driver driver_handler;
#if DEBUG_PRINTF
printf("%s\n",__FUNCTION__);
#endif
switch(config->job.priority)
{
case B2R2_PRIORITY_1:
{
driver_handler.context=B2R2_CQ1_JOB;
driver_handler.queue_address=config->job.job_physical_address;
//driver_handler.control=(B2R2_AQ_Enab | B2R2_AQ_PRIOR_1);
driver_handler.pace_control=config->job.job_pace_lna_physical_address;
driver_handler.interrupt_target=0;
driver_handler.interrupt_context=(B2R2BLT_ITSCQ1_completed);
}
break;
case B2R2_PRIORITY_2:
{
driver_handler.context=B2R2_CQ2_JOB;
driver_handler.queue_address=config->job.job_physical_address;
//driver_handler.control=(B2R2_AQ_Enab | B2R2_AQ_PRIOR_1);
driver_handler.pace_control=config->job.job_pace_lna_physical_address;
driver_handler.interrupt_target=0;
driver_handler.interrupt_context=(B2R2BLT_ITSCQ2_completed);
}
break;
case B2R2_PRIORITY_3:
{
driver_handler.context=B2R2_AQ1_JOB;
driver_handler.queue_address=config->job.job_physical_address;
driver_handler.control=(B2R2_AQ_Enab | B2R2_AQ_PRIOR_0);
driver_handler.pace_control=config->job.job_pace_lna_physical_address;
driver_handler.interrupt_target=0;
driver_handler.interrupt_context=(B2R2BLT_ITSAQ1_LNA_Reached)|(B2R2BLT_ITSAQ1_Node_Notif);
}
break;
case B2R2_PRIORITY_4:
{
driver_handler.context=B2R2_AQ2_JOB;
driver_handler.queue_address=config->job.job_physical_address;
driver_handler.control=(B2R2_AQ_Enab | B2R2_AQ_PRIOR_1);
driver_handler.pace_control=config->job.job_pace_lna_physical_address;
driver_handler.interrupt_target=0;
driver_handler.interrupt_context=(B2R2BLT_ITSAQ2_LNA_Reached)|(B2R2BLT_ITSAQ2_Node_Notif);
}
break;
case B2R2_PRIORITY_5:
{
driver_handler.context=B2R2_AQ3_JOB;
driver_handler.queue_address=config->job.job_physical_address;
driver_handler.control=(B2R2_AQ_Enab | B2R2_AQ_PRIOR_2);
driver_handler.pace_control=config->job.job_pace_lna_physical_address;
driver_handler.interrupt_target=0;
driver_handler.interrupt_context=(B2R2BLT_ITSAQ3_LNA_Reached)|(B2R2BLT_ITSAQ3_Node_Notif);
}
break;
case B2R2_PRIORITY_6:
{
driver_handler.context=B2R2_AQ4_JOB;
driver_handler.queue_address=config->job.job_physical_address;
driver_handler.control=(B2R2_AQ_Enab | B2R2_AQ_PRIOR_3);
driver_handler.pace_control=config->job.job_pace_lna_physical_address;
driver_handler.interrupt_target=0;
driver_handler.interrupt_context=(B2R2BLT_ITSAQ4_LNA_Reached)|(B2R2BLT_ITSAQ4_Node_Notif);
}
break;
}
/** do a queue call */
ioctl(library->file_pointer,B2R2_QUEUE_JOB,&driver_handler);
/** get the job id */
config->job.jobid=driver_handler.jobid;
#if DEBUG_NODE_DATA
debug_print_node_data(config->NodeAdress,5*sizeof(b2r2_link_list));
#endif
}
void b2r2_library_operation_done(b2r2_library *library,b2r2_configuration *config)
{
b2r2_driver driver_handler;
#if DEBUG_PRINTF
printf("%s\n",__FUNCTION__);
#endif
/** get the job queue id */
driver_handler.jobid=config->job.jobid;
driver_handler.context=B2R2_AQ1_JOB;
/** do a dequeue call */
ioctl(library->file_pointer,B2R2_DEQUEUE_JOB,&driver_handler);
}
void configure_resize(unsigned char no_of_nodes,unsigned char is_src_width_multiple_of_128,\
b2r2_buffer_memory *pNode_mem,b2r2_configuration *config)
{
b2r2_link_list *pt_mem;
int i=0;
unsigned short dst_pixmap_pitch,src_pixmap_pitch;
B2R2_RECT src_rsz_inc_rect,dst_rsz_inc_vect;
int x_in_offset=0,x_out_offset=0;
int x_in_width=128,x_out_width=0;
unsigned char no_of_nodes_multiple_of_128=0;
unsigned int chroma_rsf=0,luma_rsf=0;
no_of_nodes_multiple_of_128=(is_src_width_multiple_of_128)? \
no_of_nodes:no_of_nodes-1;
pt_mem= (b2r2_link_list*)(pNode_mem->logical_address);
do_pixmap_pitch(config->dst_image.color_format,config->dst_image.width,&dst_pixmap_pitch);
do_pixmap_pitch(config->src_image.color_format,config->src_image.width,&src_pixmap_pitch);
/*For the nodes whose source width is equal to 128*/
if(config->src_window.width!=config->dst_window.width)
{
chroma_rsf=compute_the_horizontal_scale_factor(&config->src_window,&config->dst_window,&x_out_width);
if(x_out_width == 0)
{
printf("xoutwidth = %d, \n",x_out_width);
while(1);
}
}
else
{
chroma_rsf=0x0400;
x_out_width =128;
}
if(config->src_window.height!=config->dst_window.height)
{
luma_rsf=compute_the_vertical_scale_factor(&config->src_window,&config->dst_window);
}
else
{
luma_rsf=0x0400;
}
for(i=0;iGROUP0.B2R2_NIP = pNode_mem->physical_address+(i+1)*sizeof(b2r2_link_list);
pt_mem->GROUP0.B2R2_CIC = 0x1FFF;
pt_mem->GROUP0.B2R2_INS = (B2R2_SRC2_FETCH_MEM|B2R2BLT_INS2DRESCALE);
pt_mem->GROUP0.B2R2_ACK = B2R2_BYPASS_SRC2_SRC3;
pt_mem->GROUP1.B2R2_TBA = config->dst_image.physical_address;
pt_mem->GROUP1.B2R2_TTY = (RESVD|(0<dst_image.color_format<GROUP1.B2R2_TXY = (config->dst_window.top<dst_window.left+x_out_offset));
pt_mem->GROUP1.B2R2_TSZ = (RESVD|x_out_width|(config->dst_window.height<GROUP2.B2R2_S1CF = 0;
pt_mem->GROUP2.B2R2_S2CF = 0;
/*Source1*/
pt_mem->GROUP3.B2R2_SBA = 0;
pt_mem->GROUP3.B2R2_STY = 0;
pt_mem->GROUP3.B2R2_SXY = 0;
pt_mem->GROUP3.B2R2_SSZ = 0;
/*Source2*/
pt_mem->GROUP4.B2R2_SBA = config->src_image.physical_address;
pt_mem->GROUP4.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP4.B2R2_SXY = (config->src_window.top<src_window.left+x_in_offset));
pt_mem->GROUP4.B2R2_SSZ = (RESVD|x_in_width|(config->src_window.height<GROUP5.B2R2_SBA = 0;
pt_mem->GROUP5.B2R2_STY = 0;
pt_mem->GROUP5.B2R2_SXY = 0;
pt_mem->GROUP5.B2R2_SSZ = 0;
/*Clip*/
pt_mem->GROUP6.B2R2_CWO = 0;
pt_mem->GROUP6.B2R2_CWS = 0;
/*Clut*/
pt_mem->GROUP7.B2R2_CCO = 0;
pt_mem->GROUP7.B2R2_CML = 0;
pt_mem->GROUP8.B2R2_FCTL=0x22000044;
pt_mem->GROUP8.B2R2_PMK =0;
pt_mem->GROUP9.B2R2_RSF=((luma_rsf<<16)|chroma_rsf);//0x08000800;
pt_mem->GROUP9.B2R2_RZI=0x30003000;
pt_mem->GROUP9.B2R2_HFP=0;
pt_mem->GROUP9.B2R2_VFP=0;
pt_mem->GROUP10.B2R2_RSF=((luma_rsf<<16)|chroma_rsf);//0x08000800;
pt_mem->GROUP10.B2R2_RZI=0x30003000;
pt_mem->GROUP10.B2R2_HFP=0;
pt_mem->GROUP10.B2R2_VFP=0;
pt_mem->GROUP12.B2R2_KEY1=0;
pt_mem->GROUP12.B2R2_KEY2=0;
x_in_offset+=128;
x_out_offset+=x_out_width;
if((i==no_of_nodes_multiple_of_128-1)&&(is_src_width_multiple_of_128))
{
pt_mem->GROUP0.B2R2_NIP= 0;
pt_mem->GROUP0.B2R2_INS |=B2R2BLT_INSBlitCompIRQ ;
}
else
{
pt_mem++;
}
}
/*For the node whose source width less than 128*/
if(is_src_width_multiple_of_128==0)
{
pt_mem->GROUP0.B2R2_NIP= 0;
pt_mem->GROUP0.B2R2_CIC = 0x1FFF;
pt_mem->GROUP0.B2R2_INS = (B2R2_SRC2_FETCH_MEM|B2R2BLT_INS2DRESCALE|B2R2BLT_INSBlitCompIRQ);
pt_mem->GROUP0.B2R2_ACK = B2R2_BYPASS_SRC2_SRC3;
pt_mem->GROUP1.B2R2_TBA = config->dst_image.physical_address;
pt_mem->GROUP1.B2R2_TTY = (RESVD|(0<dst_image.color_format<GROUP1.B2R2_TXY = (config->dst_window.top<dst_window.left+x_out_offset));
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(config->dst_window.width-x_out_offset)|(config->dst_window.height<GROUP2.B2R2_S1CF = 0;
pt_mem->GROUP2.B2R2_S2CF = 0;
/*Source1*/
pt_mem->GROUP3.B2R2_SBA = 0;
pt_mem->GROUP3.B2R2_STY = 0;
pt_mem->GROUP3.B2R2_SXY = 0;
pt_mem->GROUP3.B2R2_SSZ = 0;
/*Source2*/
pt_mem->GROUP4.B2R2_SBA = config->src_image.physical_address;
pt_mem->GROUP4.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP4.B2R2_SXY = (config->src_window.top<src_window.left+x_in_offset));;
pt_mem->GROUP4.B2R2_SSZ = (RESVD|(config->src_window.width-x_in_offset)|(config->src_window.height<GROUP5.B2R2_SBA = 0;
pt_mem->GROUP5.B2R2_STY = 0;
pt_mem->GROUP5.B2R2_SXY = 0;
pt_mem->GROUP5.B2R2_SSZ = 0;
/*Clip*/
pt_mem->GROUP6.B2R2_CWO = 0;
pt_mem->GROUP6.B2R2_CWS = 0;
/*Clut*/
pt_mem->GROUP7.B2R2_CCO = 0;
pt_mem->GROUP7.B2R2_CML = 0;
pt_mem->GROUP8.B2R2_FCTL=0x22000044;
pt_mem->GROUP8.B2R2_PMK =0;
pt_mem->GROUP9.B2R2_RSF=((luma_rsf<<16)|chroma_rsf);
pt_mem->GROUP9.B2R2_RZI=0x30003000;
pt_mem->GROUP9.B2R2_HFP=0;
pt_mem->GROUP9.B2R2_VFP=0;
pt_mem->GROUP10.B2R2_RSF=((luma_rsf<<16)|chroma_rsf);
pt_mem->GROUP10.B2R2_RZI=0x30003000;
pt_mem->GROUP10.B2R2_HFP=0;
pt_mem->GROUP10.B2R2_VFP=0;
pt_mem->GROUP12.B2R2_KEY1=0;
pt_mem->GROUP12.B2R2_KEY2=0;
}
}
void configure_rotate(unsigned char no_of_nodes,unsigned char is_src_width_multiple_of_16,\
b2r2_buffer_memory *pNode_mem,b2r2_configuration *config)
{
b2r2_link_list *pt_mem;
int i=0;
unsigned short dst_pixmap_pitch,src_pixmap_pitch;
B2R2_RECT src_rsz_inc_rect,dst_rsz_inc_vect;
int x_in_offset=0,x_out_offset=0;
int x_in_width=16,x_out_width=16;
unsigned char no_of_nodes_multiple_of_16=0;
unsigned int chroma_rsf=0,luma_rsf=0;
no_of_nodes_multiple_of_16=(is_src_width_multiple_of_16)? \
no_of_nodes:no_of_nodes-1;
if(config->rotation == B2R2_ROT_180)
{
no_of_nodes_multiple_of_16=1;
is_src_width_multiple_of_16=1;
if(config->src_window.width<16)
is_src_width_multiple_of_16=0;
}
pt_mem= (b2r2_link_list*)(pNode_mem->logical_address);
do_pixmap_pitch(config->dst_image.color_format,config->dst_image.width,&dst_pixmap_pitch);
do_pixmap_pitch(config->src_image.color_format,config->src_image.width,&src_pixmap_pitch);
for(i=0;iGROUP0.B2R2_NIP = pNode_mem->physical_address+(i+1)*sizeof(b2r2_link_list);
pt_mem->GROUP0.B2R2_CIC = 0x1FFF;
pt_mem->GROUP0.B2R2_INS = (B2R2_SRC2_FETCH_MEM);
pt_mem->GROUP0.B2R2_ACK = B2R2_BYPASS_SRC2_SRC3;
pt_mem->GROUP1.B2R2_TBA = config->dst_image.physical_address;
pt_mem->GROUP1.B2R2_TTY = (RESVD|(0<dst_image.color_format<GROUP2.B2R2_S1CF = 0;
pt_mem->GROUP2.B2R2_S2CF = 0;
/*Source1*/
pt_mem->GROUP3.B2R2_SBA = 0;
pt_mem->GROUP3.B2R2_STY = 0;
pt_mem->GROUP3.B2R2_SXY = 0;
pt_mem->GROUP3.B2R2_SSZ = 0;
/*Source2*/
pt_mem->GROUP4.B2R2_SBA = config->src_image.physical_address;
pt_mem->GROUP4.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP4.B2R2_SXY = (config->src_window.top<src_window.left+x_in_offset));
pt_mem->GROUP4.B2R2_SSZ = (RESVD|x_in_width|(config->src_window.height<GROUP5.B2R2_SBA = 0;
pt_mem->GROUP5.B2R2_STY = 0;
pt_mem->GROUP5.B2R2_SXY = 0;
pt_mem->GROUP5.B2R2_SSZ = 0;
/*Clip*/
pt_mem->GROUP6.B2R2_CWO = 0;
pt_mem->GROUP6.B2R2_CWS = 0;
/*Clut*/
pt_mem->GROUP7.B2R2_CCO = 0;
pt_mem->GROUP7.B2R2_CML = 0;
pt_mem->GROUP8.B2R2_FCTL=0;
pt_mem->GROUP8.B2R2_PMK =0;
pt_mem->GROUP9.B2R2_RSF=0;
pt_mem->GROUP9.B2R2_RZI=0;
pt_mem->GROUP9.B2R2_HFP=0;
pt_mem->GROUP9.B2R2_VFP=0;
pt_mem->GROUP10.B2R2_RSF=0;
pt_mem->GROUP10.B2R2_RZI=0;
pt_mem->GROUP10.B2R2_HFP=0;
pt_mem->GROUP10.B2R2_VFP=0;
pt_mem->GROUP12.B2R2_KEY1=0;
pt_mem->GROUP12.B2R2_KEY2=0;
if(config->rotation== B2R2_ROT_90)
{ /** Set rotation enabled bit */
pt_mem->GROUP0.B2R2_INS |= B2R2BLT_INSROTATION;
pt_mem->GROUP1.B2R2_TTY |= (B2R2BLT_TTYHSO); //Set this bit to start line write operation from bottom to top in target area
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(x_out_width<src_window.height);
pt_mem->GROUP1.B2R2_TXY = ((((config->dst_window.top)+x_out_width*i)<dst_window.left+config->dst_window.width-1));
}
if(config->rotation == B2R2_ROT_180)
{
pt_mem->GROUP1.B2R2_TTY |= (B2R2BLT_TTYVSO|B2R2BLT_TTYHSO);
pt_mem->GROUP1.B2R2_TXY = (((config->dst_window.top+config->dst_window.height-1)<dst_window.left+config->dst_window.width-1));
pt_mem->GROUP1.B2R2_TSZ = (RESVD|config->dst_window.width|(config->dst_window.height<GROUP4.B2R2_SSZ = (RESVD|config->src_window.width|(config->src_window.height<rotation == B2R2_ROT_270)
{
pt_mem->GROUP0.B2R2_INS |= B2R2BLT_INSROTATION;
pt_mem->GROUP1.B2R2_TTY |= (B2R2BLT_TTYVSO); //Set this bit to start pixel write operation from right to left in target area
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(x_out_width<src_window.height);
pt_mem->GROUP1.B2R2_TXY = ((config->dst_window.top)+(config->dst_window.height-1)-(x_out_width*i))<dst_window.left;
}
x_in_offset+=16;
x_out_offset+=16;
if((i==no_of_nodes_multiple_of_16-1)&&(is_src_width_multiple_of_16))
{
pt_mem->GROUP0.B2R2_NIP= 0;
pt_mem->GROUP0.B2R2_INS |=B2R2BLT_INSBlitCompIRQ ;
}
else
{
pt_mem++;
}
}
/*For the node whose source width less than 128*/
if(is_src_width_multiple_of_16==0)
{
x_in_width=config->src_window.width-no_of_nodes_multiple_of_16*16;
x_out_width=x_in_width;
pt_mem->GROUP0.B2R2_NIP= 0;
pt_mem->GROUP0.B2R2_CIC = 0x1FFF;
pt_mem->GROUP0.B2R2_INS = (B2R2_SRC2_FETCH_MEM);
pt_mem->GROUP0.B2R2_ACK = B2R2_BYPASS_SRC2_SRC3;
pt_mem->GROUP1.B2R2_TBA = config->dst_image.physical_address;
pt_mem->GROUP1.B2R2_TTY = (RESVD|(0<dst_image.color_format<GROUP2.B2R2_S1CF = 0;
pt_mem->GROUP2.B2R2_S2CF = 0;
/*Source1*/
pt_mem->GROUP3.B2R2_SBA = 0;
pt_mem->GROUP3.B2R2_STY = 0;
pt_mem->GROUP3.B2R2_SXY = 0;
pt_mem->GROUP3.B2R2_SSZ = 0;
/*Source2*/
pt_mem->GROUP4.B2R2_SBA = config->src_image.physical_address;
pt_mem->GROUP4.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP4.B2R2_SXY = (config->src_window.top<src_window.left+x_in_offset));
pt_mem->GROUP4.B2R2_SSZ = (RESVD|x_in_width|(config->src_window.height<GROUP5.B2R2_SBA = 0;
pt_mem->GROUP5.B2R2_STY = 0;
pt_mem->GROUP5.B2R2_SXY = 0;
pt_mem->GROUP5.B2R2_SSZ = 0;
/*Clip*/
pt_mem->GROUP6.B2R2_CWO = 0;
pt_mem->GROUP6.B2R2_CWS = 0;
/*Clut*/
pt_mem->GROUP7.B2R2_CCO = 0;
pt_mem->GROUP7.B2R2_CML = 0;
pt_mem->GROUP8.B2R2_FCTL=0;
pt_mem->GROUP8.B2R2_PMK =0;
pt_mem->GROUP9.B2R2_RSF=0;
pt_mem->GROUP9.B2R2_RZI=0;
pt_mem->GROUP9.B2R2_HFP=0;
pt_mem->GROUP9.B2R2_VFP=0;
pt_mem->GROUP10.B2R2_RSF=0;
pt_mem->GROUP10.B2R2_RZI=0;
pt_mem->GROUP10.B2R2_HFP=0;
pt_mem->GROUP10.B2R2_VFP=0;
pt_mem->GROUP12.B2R2_KEY1=0;
pt_mem->GROUP12.B2R2_KEY2=0;
if(config->rotation== B2R2_ROT_90)
{ /** Set rotation enabled bit */
pt_mem->GROUP0.B2R2_INS |= B2R2BLT_INSROTATION;
pt_mem->GROUP1.B2R2_TTY |= (B2R2BLT_TTYHSO); //Set this bit to start line write operation from bottom to top in target area
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(x_out_width<src_window.height);
pt_mem->GROUP1.B2R2_TXY = ((((config->dst_window.top)+x_out_width*i)<dst_window.left+config->dst_window.width-1));
}
if(config->rotation == B2R2_ROT_270)
{
pt_mem->GROUP0.B2R2_INS |= B2R2BLT_INSROTATION;
pt_mem->GROUP1.B2R2_TTY |= (B2R2BLT_TTYVSO); //Set this bit to start pixel write operation from right to left in target area
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(x_out_width<src_window.height);
pt_mem->GROUP1.B2R2_TXY = ((config->dst_window.top)+(config->dst_window.height-1)-(x_out_width*i))<dst_window.left;
}
if(config->rotation == B2R2_ROT_180)
{
pt_mem->GROUP1.B2R2_TTY |= (B2R2BLT_TTYVSO|B2R2BLT_TTYHSO);
pt_mem->GROUP1.B2R2_TXY = (((config->dst_window.top+config->dst_window.height-1)<dst_window.left+config->dst_window.width-1));
pt_mem->GROUP1.B2R2_TSZ = (RESVD|config->dst_window.width|(config->dst_window.height<GROUP4.B2R2_SSZ = (RESVD|config->src_window.width|(config->src_window.height<logical_address);
do_pixmap_pitch(config->dst_image.color_format,config->dst_image.width,&dst_pixmap_pitch);
do_pixmap_pitch(config->src_image.color_format,config->src_image.width,&src_pixmap_pitch);
/*For the nodes whose source width is equal to 128*/
if(config->src_window.width!=config->dst_window.width)
{
chroma_rsf=compute_the_horizontal_scale_factor(&config->src_window,&config->dst_window,&x_out_width);
if(x_out_width == 0)
{
printf("xoutwidth = %d, \n",x_out_width);
while(1);
}
}
else
{
chroma_rsf=0x0400;
x_out_width =128;
}
if(config->src_window.height!=config->dst_window.height)
{
luma_rsf=compute_the_vertical_scale_factor(&config->src_window,&config->dst_window);
}
else
{
luma_rsf=0x0400;
}
for(i=0;iphysical_address);
pt_mem->GROUP0.B2R2_NIP = pNode_mem->physical_address+(i+1)*sizeof(b2r2_link_list);
pt_mem->GROUP0.B2R2_CIC = 0xFFFF;
if (config->src_image.color_format == B2R2_YCBCR42XMBN)
pt_mem->GROUP0.B2R2_INS = (B2R2BLT_INSIVMX|B2R2BLT_INS2DRESCALE|B2R2_SRC2_FETCH_MEM|B2R2_SRC3_FETCH_MEM);
else if (config->src_image.color_format == B2R2_YUV)
pt_mem->GROUP0.B2R2_INS = (B2R2BLT_INSIVMX|B2R2BLT_INS2DRESCALE|B2R2_SRC2_FETCH_MEM|B2R2_SRC3_FETCH_MEM|B2R2_SRC1_FETCH_MEM);
pt_mem->GROUP0.B2R2_ACK = B2R2_BYPASS_SRC2_SRC3;
pt_mem->GROUP1.B2R2_TBA = config->dst_image.physical_address;
pt_mem->GROUP1.B2R2_TTY = (RESVD|(0<dst_image.color_format<GROUP1.B2R2_TXY = (config->dst_window.top<dst_window.left+x_out_offset));
pt_mem->GROUP1.B2R2_TSZ = (RESVD|x_out_width|(config->dst_window.height<GROUP2.B2R2_S1CF = 0;
pt_mem->GROUP2.B2R2_S2CF = 0;
if (config->src_image.color_format == B2R2_YCBCR42XMBN)
{
/*Source1*/
pt_mem->GROUP3.B2R2_SBA = 0;
pt_mem->GROUP3.B2R2_STY = 0;
pt_mem->GROUP3.B2R2_SXY = 0;
pt_mem->GROUP3.B2R2_SSZ = 0;
}
else if (config->src_image.color_format == B2R2_YUV)
{
pt_mem->GROUP3.B2R2_SBA = config->ppp_conf.source_chroma2_address;
pt_mem->GROUP3.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP3.B2R2_SXY = ((config->src_window.top/2)<src_window.left+x_in_offset)/2));
pt_mem->GROUP3.B2R2_SSZ = (RESVD|(x_in_width/2)|(((config->src_window.height)/2)<GROUP4.B2R2_SBA = config->ppp_conf.source_chroma_address;
if (config->src_image.color_format == B2R2_YCBCR42XMBN)
pt_mem->GROUP4.B2R2_STY = (RESVD|(0<src_image.color_format<src_image.color_format == B2R2_YUV)
pt_mem->GROUP4.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP4.B2R2_SXY = ((config->src_window.top/2)<src_window.left+x_in_offset)/2));
pt_mem->GROUP4.B2R2_SSZ = (RESVD|(x_in_width/2)|(((config->src_window.height)/2)<GROUP5.B2R2_SBA = config->ppp_conf.source_luma_address;
pt_mem->GROUP5.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP5.B2R2_SXY = (config->src_window.top<src_window.left+x_in_offset));
pt_mem->GROUP5.B2R2_SSZ = (RESVD|x_in_width|(config->src_window.height<GROUP6.B2R2_CWO = 0;
pt_mem->GROUP6.B2R2_CWS = 0;
/*Clut*/
pt_mem->GROUP7.B2R2_CCO = 0;
pt_mem->GROUP7.B2R2_CML = 0;
pt_mem->GROUP8.B2R2_FCTL=0x22000044;
pt_mem->GROUP8.B2R2_PMK =0;
pt_mem->GROUP9.B2R2_RSF=(((luma_rsf/2)<<16)|(chroma_rsf/2));
pt_mem->GROUP9.B2R2_RZI=0x30003000;
pt_mem->GROUP9.B2R2_HFP=0;
pt_mem->GROUP9.B2R2_VFP=0;
pt_mem->GROUP10.B2R2_RSF=((luma_rsf<<16)|chroma_rsf);
pt_mem->GROUP10.B2R2_RZI=0x30003000;
pt_mem->GROUP10.B2R2_HFP=0;
pt_mem->GROUP10.B2R2_VFP=0;
pt_mem->GROUP12.B2R2_KEY1=0;
pt_mem->GROUP12.B2R2_KEY2=0;
pt_mem->GROUP15.B2R2_VMX0 = 0x2C440000;//0x3324a800;
pt_mem->GROUP15.B2R2_VMX1 = 0xE9A403AA;//0xe604ab9c;
pt_mem->GROUP15.B2R2_VMX2 = 0x0004013F;//0x0004a957;
pt_mem->GROUP15.B2R2_VMX3 = 0x34F21322;//0x32121eeb;
x_in_offset+=128;
x_out_offset+=x_out_width;
if((i==no_of_nodes_multiple_of_128-1)&&(is_src_width_multiple_of_128))
{
pt_mem->GROUP0.B2R2_NIP= 0;
//pt_mem->GROUP0.B2R2_INS |=B2R2BLT_INSBlitCompIRQ ;
}
else
{
pt_mem++;
}
}
/*For the node whose source width less than 128*/
if(is_src_width_multiple_of_128==0)
{
pt_mem->GROUP0.B2R2_NIP= 0;
pt_mem->GROUP0.B2R2_CIC = 0xFFFF;
if (config->src_image.color_format == B2R2_YCBCR42XMBN)
pt_mem->GROUP0.B2R2_INS = (B2R2BLT_INSIVMX|B2R2BLT_INS2DRESCALE|B2R2_SRC2_FETCH_MEM|B2R2_SRC3_FETCH_MEM);
else if (config->src_image.color_format == B2R2_YUV)
pt_mem->GROUP0.B2R2_INS = (B2R2BLT_INSIVMX|B2R2BLT_INS2DRESCALE|B2R2_SRC2_FETCH_MEM|B2R2_SRC3_FETCH_MEM|B2R2_SRC1_FETCH_MEM);
pt_mem->GROUP0.B2R2_ACK = B2R2_BYPASS_SRC2_SRC3;
pt_mem->GROUP1.B2R2_TBA = config->dst_image.physical_address;
pt_mem->GROUP1.B2R2_TTY = (RESVD|(0<dst_image.color_format<GROUP1.B2R2_TXY = (config->dst_window.top<dst_window.left+x_out_offset));
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(config->dst_window.width-x_out_offset)|(config->dst_window.height<GROUP2.B2R2_S1CF = 0;
pt_mem->GROUP2.B2R2_S2CF = 0;
if (config->src_image.color_format == B2R2_YCBCR42XMBN)
{
/*Source1*/
pt_mem->GROUP3.B2R2_SBA = 0;
pt_mem->GROUP3.B2R2_STY = 0;
pt_mem->GROUP3.B2R2_SXY = 0;
pt_mem->GROUP3.B2R2_SSZ = 0;
}
else if (config->src_image.color_format == B2R2_YUV)
{
pt_mem->GROUP3.B2R2_SBA = config->ppp_conf.source_chroma2_address;
pt_mem->GROUP3.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP3.B2R2_SXY = ((config->src_window.top/2)<src_window.left+x_in_offset)/2));
pt_mem->GROUP3.B2R2_SSZ = (RESVD|((config->src_window.width-x_in_offset)/2)|((config->src_window.height/2)<GROUP4.B2R2_SBA = config->ppp_conf.source_chroma_address;
if(config->src_image.color_format == B2R2_YCBCR42XMBN)
pt_mem->GROUP4.B2R2_STY = (RESVD|(0<src_image.color_format<src_image.color_format == B2R2_YUV)
pt_mem->GROUP4.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP4.B2R2_SXY = ((config->src_window.top/2)<src_window.left+x_in_offset)/2));
pt_mem->GROUP4.B2R2_SSZ = (RESVD|((config->src_window.width-x_in_offset)/2)|((config->src_window.height/2)<GROUP5.B2R2_SBA = config->ppp_conf.source_luma_address;
pt_mem->GROUP5.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP5.B2R2_SXY = (config->src_window.top<src_window.left+x_in_offset));
pt_mem->GROUP5.B2R2_SSZ = (RESVD|(config->src_window.width-x_in_offset)|(config->src_window.height<GROUP6.B2R2_CWO = 0;
pt_mem->GROUP6.B2R2_CWS = 0;
/*Clut*/
pt_mem->GROUP7.B2R2_CCO = 0;
pt_mem->GROUP7.B2R2_CML = 0;
pt_mem->GROUP8.B2R2_FCTL=0x22000044;
pt_mem->GROUP8.B2R2_PMK =0;
pt_mem->GROUP9.B2R2_RSF=(((luma_rsf/2)<<16)|(chroma_rsf/2));
pt_mem->GROUP9.B2R2_RZI=0x30003000;
pt_mem->GROUP9.B2R2_HFP=0;
pt_mem->GROUP9.B2R2_VFP=0;
pt_mem->GROUP10.B2R2_RSF=((luma_rsf<<16)|chroma_rsf);
pt_mem->GROUP10.B2R2_RZI=0x30003000;
pt_mem->GROUP10.B2R2_HFP=0;
pt_mem->GROUP10.B2R2_VFP=0;
pt_mem->GROUP12.B2R2_KEY1=0;
pt_mem->GROUP12.B2R2_KEY2=0;
pt_mem->GROUP15.B2R2_VMX0 = 0x2C440000;//0x3324a800;
pt_mem->GROUP15.B2R2_VMX1 = 0xE9A403AA;//0xe604ab9c;
pt_mem->GROUP15.B2R2_VMX2 = 0x0004013F;//0x0004a957;
pt_mem->GROUP15.B2R2_VMX3 = 0x34F21322;//0x32121eeb;
}
}
static unsigned int compute_the_horizontal_scale_factor(B2R2_RECT *psrc_window,
B2R2_RECT *pdst_window,int *x_out_width)
{
unsigned scale_fr=0;/*scale factor in 6.10 format*/
scale_fr =((psrc_window->width*1024)/pdst_window->width);
scale_fr&=0xFFFF;
*x_out_width=(128*1024)/scale_fr;
#if DEBUG_PRINTF
printf("%s\n",__FUNCTION__);
printf("Horizontal scale_fr = %d, \n",scale_fr);
printf("xoutwidth down= %d, \n",*x_out_width);
#endif
return scale_fr;
}
static unsigned int compute_the_vertical_scale_factor(B2R2_RECT *psrc_window,\
B2R2_RECT *pdst_window)
{
unsigned scale_fr=0;/*scale factor in 6.10 format*/
scale_fr =((psrc_window->height*1024)/pdst_window->height);
scale_fr&=0xFFFF;
return scale_fr;
}
static void configure_node_for_b2r2_op(b2r2_library *library,b2r2_configuration *config)
{
b2r2_link_list *pt_mem;
unsigned short pixmap_pitch;
pt_mem=(b2r2_link_list*)(config->NodeAdress);
memset((unsigned char*)pt_mem,0,sizeof(b2r2_link_list));
pt_mem->GROUP0.B2R2_NIP = NEXT_NODE_NULL;
pt_mem->GROUP0.B2R2_CIC = 0x1FFF;
pt_mem->GROUP0.B2R2_INS = B2R2BLT_INSBlitCompIRQ;
/*Configure sources and destinations*/
if(config->dst_image.physical_address == 0)
{
pt_mem->GROUP0.B2R2_ACK =B2R2_BYPASS_SRC1;
pt_mem->GROUP0.B2R2_INS |=B2R2_SRC1_FETCH_MEM;
do_pixmap_pitch(config->src_image.color_format,config->src_image.width,&pixmap_pitch);
pt_mem->GROUP1.B2R2_TBA = config->src_image.physical_address;
pt_mem->GROUP1.B2R2_TTY = (RESVD|(config->dst_image.color_format<GROUP1.B2R2_TXY = (config->src_window.top<src_window.left);
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(config->src_window.width)|(config->src_window.height<GROUP3.B2R2_SBA = config->src_image.physical_address;
pt_mem->GROUP3.B2R2_STY = pt_mem->GROUP1.B2R2_TTY;
pt_mem->GROUP3.B2R2_SXY = pt_mem->GROUP1.B2R2_TXY;
pt_mem->GROUP3.B2R2_SSZ = pt_mem->GROUP1.B2R2_TSZ;
if(config->is_color_fill_en)
{
pt_mem->GROUP0.B2R2_INS=B2R2_SRC1_DIRECT_FILL;
pt_mem->GROUP2.B2R2_S2CF = 0;
pt_mem->GROUP2.B2R2_S1CF = config->color_fill.color;
}
}
else
{
do_pixmap_pitch(config->dst_image.color_format,config->dst_image.width,&pixmap_pitch);
//printf("pixmap pitch is %x \n",pixmap_pitch);
pt_mem->GROUP1.B2R2_TBA = config->dst_image.physical_address;
pt_mem->GROUP1.B2R2_TTY = (RESVD|(0<dst_image.color_format<GROUP1.B2R2_TXY = (config->dst_window.top<dst_window.left));
pt_mem->GROUP1.B2R2_TSZ = (RESVD|(config->dst_window.width)|(config->dst_window.height<is_alpha_blend_en)
{
pt_mem->GROUP0.B2R2_ACK |=((config->alpha_blend.val<alpha_blend.swap_fg_bg)|(config->alpha_blend.premuliplier));;
pt_mem->GROUP0.B2R2_INS |=(B2R2_SRC2_FETCH_MEM|B2R2_SRC1_FETCH_MEM);
pt_mem->GROUP1.B2R2_TTY |=config->alpha_blend.range<GROUP3.B2R2_SBA = pt_mem->GROUP1.B2R2_TBA;
pt_mem->GROUP3.B2R2_STY = pt_mem->GROUP1.B2R2_TTY;
pt_mem->GROUP3.B2R2_SXY = pt_mem->GROUP1.B2R2_TXY;
pt_mem->GROUP3.B2R2_SSZ = pt_mem->GROUP1.B2R2_TSZ;
}
else if(config->is_rop_ops_en)
{
pt_mem->GROUP0.B2R2_INS |=(B2R2_SRC2_FETCH_MEM|B2R2_SRC1_FETCH_MEM);
pt_mem->GROUP0.B2R2_ACK |=((config->rop.logi_op<GROUP3.B2R2_SBA = pt_mem->GROUP1.B2R2_TBA;
pt_mem->GROUP3.B2R2_STY = pt_mem->GROUP1.B2R2_TTY;
pt_mem->GROUP3.B2R2_SXY = pt_mem->GROUP1.B2R2_TXY;
pt_mem->GROUP3.B2R2_SSZ = pt_mem->GROUP1.B2R2_TSZ;
}
else
{
pt_mem->GROUP0.B2R2_ACK |=B2R2_BYPASS_SRC2_SRC3;
pt_mem->GROUP0.B2R2_INS |=B2R2_SRC2_FETCH_MEM;
if(config->is_color_fill_en)
{
pt_mem->GROUP0.B2R2_INS |=B2R2_SRC2_COLOR_FILL;
pt_mem->GROUP2.B2R2_S1CF = 0;
pt_mem->GROUP2.B2R2_S2CF = config->color_fill.color;
}
}
do_pixmap_pitch(config->src_image.color_format,config->src_image.width,&pixmap_pitch);
pt_mem->GROUP4.B2R2_SBA = config->src_image.physical_address;
pt_mem->GROUP4.B2R2_STY = (RESVD|(0<src_image.color_format<GROUP4.B2R2_SXY = (config->src_window.top<src_window.left));
pt_mem->GROUP4.B2R2_SSZ = (RESVD|(config->src_window.width)|(config->src_window.height<is_rect_clip_en)
{
pt_mem->GROUP0.B2R2_INS |=B2R2BLT_INSRECT_CLIP;
pt_mem->GROUP6.B2R2_CWO =((config->rect_clip.rect.top<rect_clip.rect.left);
pt_mem->GROUP6.B2R2_CWS =(((config->rect_clip.rect.top+config->rect_clip.rect.height)<rect_clip.rect.left+config->rect_clip.rect.width));
if(config->rect_clip.clip_mode==B2R2_INSIDE_CLIP)
{
pt_mem->GROUP6.B2R2_CWO &=0x7FFFFFFF;
}
else
{
pt_mem->GROUP6.B2R2_CWO |=(0x80000000);
}
}
if(config->is_color_key_en)
{
pt_mem->GROUP0.B2R2_INS |= B2R2BLT_INSCKEY;
pt_mem->GROUP0.B2R2_ACK |= (RESVD|(config->color_key.sel<color_key.config.color.val & 0x3F)<GROUP12.B2R2_KEY1 =
((((config->color_key.color&0xFF000000)>>24)<color_key.color&0xF800)>>11)<<3)<color_key.color&0x07E0)>>5)<<2)<color_key.color&0x1F)<<3));
pt_mem->GROUP12.B2R2_KEY2 =
((((config->color_key.color&0xFF000000)>>24)<color_key.color&0xF800)>>11)<<3)|0x7)<color_key.color&0x07E0)>>5)<<2)|0x3)<color_key.color&0x1F)<<3)|0x7));
}
return;
}
void debug_print_node_data(unsigned int node_addr,unsigned int sizeinwords)
{
volatile unsigned int *pdata,i,temp;
pdata =(unsigned int*)node_addr ;
for(i=0;ino_of_nodes*sizeof(b2r2_link_list);
#if DEBUG_PRINTF
printf("%s\n",__FUNCTION__);
#endif
/** Assign the size of memory */
driver_memory.size_of_memory=size;
driver_memory.physical_address=config->NodePhysicalAdress;
/** Get the physical address of that memory */
ioctl(library->file_pointer,B2R2_DEALLOCATE_MEMORY,&driver_memory);
munmap(config->NodeAdress,size);
return 0;
}