diff options
Diffstat (limited to 'b2r2_api.c')
-rw-r--r-- | b2r2_api.c | 1466 |
1 files changed, 1466 insertions, 0 deletions
diff --git a/b2r2_api.c b/b2r2_api.c new file mode 100644 index 0000000..0e8b0c7 --- /dev/null +++ b/b2r2_api.c @@ -0,0 +1,1466 @@ +/*---------------------------------------------------------------------------*/ +/* © 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 <http://www.gnu.org/licenses/>. */ +/*---------------------------------------------------------------------------*/ + + +/** Include files */ + + +/** Linux includes */ + +#include <stdio.h> +#include <sys/types.h> +#include <fcntl.h> +#include <sys/mman.h> +//#include <sys/fcntl.h> +#include <sys/mman.h> +#include <sys/types.h> +#include <stdlib.h> +#include <unistd.h> +#include <linux/fb.h> +#include <linux/kd.h> +#include <sys/mman.h> +#include <sys/ioctl.h> +#include <string.h> +#include <errno.h> + +/** 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<<B2R2_Y_SHIFT|pVal->window_params.src_window.left); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|(pVal->window_params.src_window.width)|(pVal->window_params.src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + break; + + case B2R2_ALPHA_BLEND_OP_PARAMS: + pt_mem->GROUP1.B2R2_TXY = (pVal->window_params.dst_window.top<<B2R2_Y_SHIFT|(pVal->window_params.dst_window.left)); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|(pVal->window_params.dst_window.width)|(pVal->window_params.dst_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + pt_mem->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<<B2R2_Y_SHIFT|(pVal->window_params.src_window.left)); + pt_mem->GROUP4.B2R2_SSZ = (RESVD|(pVal->window_params.src_window.width)|(pVal->window_params.src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + pt_mem->GROUP0.B2R2_ACK = ((pt_mem->GROUP0.B2R2_ACK & 0xffff00ff) | (pVal->val<<B2R2BLT_ACKGALPHA_ROPIDShift)); + break; + + case B2R2_COLOR_KEY_OP_PARMS: + pt_mem->GROUP1.B2R2_TXY = (pVal->window_params.dst_window.top<<B2R2_Y_SHIFT|(pVal->window_params.dst_window.left)); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|(pVal->window_params.dst_window.width)|(pVal->window_params.dst_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + pt_mem->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<<B2R2_Y_SHIFT|(pVal->window_params.src_window.left)); + pt_mem->GROUP4.B2R2_SSZ = (RESVD|(pVal->window_params.src_window.width)|(pVal->window_params.src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + pt_mem->GROUP12.B2R2_KEY1 = + ((((pVal->val&0xFF000000)>>24)<<B2R2BLT_KEY1ALPHA0Shift)| \ + ((((pVal->val&0xF800)>>11)<<3)<<B2R2BLT_KEY1RED_MINShift)| \ + ((((pVal->val&0x07E0)>>5)<<2)<<B2R2BLT_KEY1GREEN_MINShift)| \ + ((pVal->val&0x1F)<<3)); + pt_mem->GROUP12.B2R2_KEY2 = + ((((pVal->val&0xFF000000)>>24)<<B2R2BLT_KEY1ALPHA0Shift)| \ + (((((pVal->val&0xF800)>>11)<<3)|0x7)<<B2R2BLT_KEY1RED_MINShift)| \ + (((((pVal->val&0x07E0)>>5)<<2)|0x3)<<B2R2BLT_KEY1GREEN_MINShift)| \ + (((pVal->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<<B2R2BLT_CWOYDOShift)| \ + pVal->window_params.clip_window.left); + pt_mem->GROUP6.B2R2_CWS =(((pVal->window_params.clip_window.top+pVal->window_params.clip_window.height)<<B2R2BLT_CWSYDSShift)| \ + (pVal->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<<B2R2BLT_ACKGALPHA_ROPIDShift)); + break; + case B2R2_COLOR_CONVERSION_OF_PARAMS: + for (i=0; i < config->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;i<no_of_nodes_multiple_of_128;i++) + { + pt_mem->GROUP0.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<<B2R2_ALPHA_RANGE_SHIFT)|(config->dst_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|dst_pixmap_pitch); + pt_mem->GROUP1.B2R2_TXY = (config->dst_window.top<<B2R2_Y_SHIFT|(config->dst_window.left+x_out_offset)); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|x_out_width|(config->dst_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + pt_mem->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<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|src_pixmap_pitch); + pt_mem->GROUP4.B2R2_SXY = (config->src_window.top<<B2R2_Y_SHIFT|(config->src_window.left+x_in_offset)); + pt_mem->GROUP4.B2R2_SSZ = (RESVD|x_in_width|(config->src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + //printf("iteration= %d,Node addrress is %x \n",i,pt_mem); + + /*Source3*/ + pt_mem->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<<B2R2_ALPHA_RANGE_SHIFT)|(config->dst_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|dst_pixmap_pitch); + pt_mem->GROUP1.B2R2_TXY = (config->dst_window.top<<B2R2_Y_SHIFT|(config->dst_window.left+x_out_offset)); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|(config->dst_window.width-x_out_offset)|(config->dst_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + pt_mem->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<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|src_pixmap_pitch); + pt_mem->GROUP4.B2R2_SXY = (config->src_window.top<<B2R2_Y_SHIFT|(config->src_window.left+x_in_offset));; + pt_mem->GROUP4.B2R2_SSZ = (RESVD|(config->src_window.width-x_in_offset)|(config->src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + + /*Source3*/ + pt_mem->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;i<no_of_nodes_multiple_of_16;i++) + { + pt_mem->GROUP0.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<<B2R2_ALPHA_RANGE_SHIFT)|(config->dst_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|dst_pixmap_pitch); + + + pt_mem->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<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|src_pixmap_pitch); + pt_mem->GROUP4.B2R2_SXY = (config->src_window.top<<B2R2_Y_SHIFT|(config->src_window.left+x_in_offset)); + pt_mem->GROUP4.B2R2_SSZ = (RESVD|x_in_width|(config->src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + //printf("iteration= %d,Node addrress is %x \n",i,pt_mem); + + /*Source3*/ + pt_mem->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<<B2R2BLT_TSZWIN_HEIGHTShift)|config->src_window.height); + pt_mem->GROUP1.B2R2_TXY = ((((config->dst_window.top)+x_out_width*i)<<B2R2_Y_SHIFT)|(config->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)<<B2R2_Y_SHIFT)|(config->dst_window.left+config->dst_window.width-1)); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|config->dst_window.width|(config->dst_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + pt_mem->GROUP4.B2R2_SSZ = (RESVD|config->src_window.width|(config->src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + + } + + 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<<B2R2BLT_TSZWIN_HEIGHTShift)|config->src_window.height); + pt_mem->GROUP1.B2R2_TXY = ((config->dst_window.top)+(config->dst_window.height-1)-(x_out_width*i))<<B2R2_Y_SHIFT|config->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<<B2R2_ALPHA_RANGE_SHIFT)|(config->dst_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|dst_pixmap_pitch); + + + pt_mem->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<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|src_pixmap_pitch); + pt_mem->GROUP4.B2R2_SXY = (config->src_window.top<<B2R2_Y_SHIFT|(config->src_window.left+x_in_offset)); + pt_mem->GROUP4.B2R2_SSZ = (RESVD|x_in_width|(config->src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + + /*Source3*/ + pt_mem->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<<B2R2BLT_TSZWIN_HEIGHTShift)|config->src_window.height); + pt_mem->GROUP1.B2R2_TXY = ((((config->dst_window.top)+x_out_width*i)<<B2R2_Y_SHIFT)|(config->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<<B2R2BLT_TSZWIN_HEIGHTShift)|config->src_window.height); + pt_mem->GROUP1.B2R2_TXY = ((config->dst_window.top)+(config->dst_window.height-1)-(x_out_width*i))<<B2R2_Y_SHIFT|config->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)<<B2R2_Y_SHIFT)|(config->dst_window.left+config->dst_window.width-1)); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|config->dst_window.width|(config->dst_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + pt_mem->GROUP4.B2R2_SSZ = (RESVD|config->src_window.width|(config->src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + + } + + } + +} + + +void configure_color_conversion(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;i<no_of_nodes_multiple_of_128;i++) + { + //printf("configure_color_conversion:Node Address:%x\n",pNode_mem->physical_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<<B2R2_ALPHA_RANGE_SHIFT)|(config->dst_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|dst_pixmap_pitch); + pt_mem->GROUP1.B2R2_TXY = (config->dst_window.top<<B2R2_Y_SHIFT|(config->dst_window.left+x_out_offset)); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|x_out_width|(config->dst_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + pt_mem->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<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|(src_pixmap_pitch/2)); + pt_mem->GROUP3.B2R2_SXY = ((config->src_window.top/2)<<B2R2_Y_SHIFT|((config->src_window.left+x_in_offset)/2)); + pt_mem->GROUP3.B2R2_SSZ = (RESVD|(x_in_width/2)|(((config->src_window.height)/2)<<B2R2BLT_TSZWIN_HEIGHTShift)); + } + /*Source2*/ + pt_mem->GROUP4.B2R2_SBA = config->ppp_conf.source_chroma_address; + if (config->src_image.color_format == B2R2_YCBCR42XMBN) + pt_mem->GROUP4.B2R2_STY = (RESVD|(0<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|src_pixmap_pitch); + else if (config->src_image.color_format == B2R2_YUV) + pt_mem->GROUP4.B2R2_STY = (RESVD|(0<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|(src_pixmap_pitch/2)); + pt_mem->GROUP4.B2R2_SXY = ((config->src_window.top/2)<<B2R2_Y_SHIFT|((config->src_window.left+x_in_offset)/2)); + pt_mem->GROUP4.B2R2_SSZ = (RESVD|(x_in_width/2)|(((config->src_window.height)/2)<<B2R2BLT_TSZWIN_HEIGHTShift)); + + /*Source3*/ + pt_mem->GROUP5.B2R2_SBA = config->ppp_conf.source_luma_address; + pt_mem->GROUP5.B2R2_STY = (RESVD|(0<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|src_pixmap_pitch); + pt_mem->GROUP5.B2R2_SXY = (config->src_window.top<<B2R2_Y_SHIFT|(config->src_window.left+x_in_offset)); + pt_mem->GROUP5.B2R2_SSZ = (RESVD|x_in_width|(config->src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + /*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/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<<B2R2_ALPHA_RANGE_SHIFT)|(config->dst_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|dst_pixmap_pitch); + pt_mem->GROUP1.B2R2_TXY = (config->dst_window.top<<B2R2_Y_SHIFT|(config->dst_window.left+x_out_offset)); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|(config->dst_window.width-x_out_offset)|(config->dst_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + pt_mem->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<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|(src_pixmap_pitch/2)); + pt_mem->GROUP3.B2R2_SXY = ((config->src_window.top/2)<<B2R2_Y_SHIFT|((config->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)<<B2R2BLT_TSZWIN_HEIGHTShift)); + } + + /*Source2*/ + pt_mem->GROUP4.B2R2_SBA = config->ppp_conf.source_chroma_address; + if(config->src_image.color_format == B2R2_YCBCR42XMBN) + pt_mem->GROUP4.B2R2_STY = (RESVD|(0<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|src_pixmap_pitch); + else if (config->src_image.color_format == B2R2_YUV) + pt_mem->GROUP4.B2R2_STY = (RESVD|(0<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|(src_pixmap_pitch/2)); + pt_mem->GROUP4.B2R2_SXY = ((config->src_window.top/2)<<B2R2_Y_SHIFT|((config->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)<<B2R2BLT_TSZWIN_HEIGHTShift)); + + /*Source3*/ + pt_mem->GROUP5.B2R2_SBA = config->ppp_conf.source_luma_address; + pt_mem->GROUP5.B2R2_STY = (RESVD|(0<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|src_pixmap_pitch); + pt_mem->GROUP5.B2R2_SXY = (config->src_window.top<<B2R2_Y_SHIFT|(config->src_window.left+x_in_offset)); + pt_mem->GROUP5.B2R2_SSZ = (RESVD|(config->src_window.width-x_in_offset)|(config->src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + + /*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/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<<B2R2BLT_TTYCOLOR_FORMShift)|pixmap_pitch); + pt_mem->GROUP1.B2R2_TXY = (config->src_window.top<<B2R2_Y_SHIFT|config->src_window.left); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|(config->src_window.width)|(config->src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + pt_mem->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<<B2R2_ALPHA_RANGE_SHIFT)|(config->dst_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|pixmap_pitch); + pt_mem->GROUP1.B2R2_TXY = (config->dst_window.top<<B2R2_Y_SHIFT|(config->dst_window.left)); + pt_mem->GROUP1.B2R2_TSZ = (RESVD|(config->dst_window.width)|(config->dst_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + if(config->is_alpha_blend_en) + { + pt_mem->GROUP0.B2R2_ACK |=((config->alpha_blend.val<<B2R2BLT_ACKGALPHA_ROPIDShift)|(config->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<<B2R2_ALPHA_RANGE_SHIFT; + + pt_mem->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<<B2R2BLT_ACKGALPHA_ROPIDShift)|B2R2_LOGICAL_OPER); + + pt_mem->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<<B2R2_ALPHA_RANGE_SHIFT)|(config->src_image.color_format<<B2R2BLT_TTYCOLOR_FORMShift)|pixmap_pitch); + pt_mem->GROUP4.B2R2_SXY = (config->src_window.top<<B2R2_Y_SHIFT|(config->src_window.left)); + pt_mem->GROUP4.B2R2_SSZ = (RESVD|(config->src_window.width)|(config->src_window.height<<B2R2BLT_TSZWIN_HEIGHTShift)); + + } + + if(config->is_rect_clip_en) + { + pt_mem->GROUP0.B2R2_INS |=B2R2BLT_INSRECT_CLIP; + + + pt_mem->GROUP6.B2R2_CWO =((config->rect_clip.rect.top<<B2R2BLT_CWOYDOShift)| \ + config->rect_clip.rect.left); + pt_mem->GROUP6.B2R2_CWS =(((config->rect_clip.rect.top+config->rect_clip.rect.height)<<B2R2BLT_CWSYDSShift)| \ + (config->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<<B2R2BLT_ACKCKEY_SELShift)| \ + ((config->color_key.config.color.val & 0x3F)<<B2R2BLT_ACKACK_CKEYShift)); //Fetch from source2 + + pt_mem->GROUP12.B2R2_KEY1 = + ((((config->color_key.color&0xFF000000)>>24)<<B2R2BLT_KEY1ALPHA0Shift)| \ + ((((config->color_key.color&0xF800)>>11)<<3)<<B2R2BLT_KEY1RED_MINShift)| \ + ((((config->color_key.color&0x07E0)>>5)<<2)<<B2R2BLT_KEY1GREEN_MINShift)| \ + ((config->color_key.color&0x1F)<<3)); + + pt_mem->GROUP12.B2R2_KEY2 = + ((((config->color_key.color&0xFF000000)>>24)<<B2R2BLT_KEY1ALPHA0Shift)| \ + (((((config->color_key.color&0xF800)>>11)<<3)|0x7)<<B2R2BLT_KEY1RED_MINShift)| \ + (((((config->color_key.color&0x07E0)>>5)<<2)|0x3)<<B2R2BLT_KEY1GREEN_MINShift)| \ + (((config->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;i<sizeinwords;i++) + { + printf("Address =0x%x ,data=0x%x \n",pdata,*pdata); + pdata++; + } +} + + + +int b2r2_library_operation_deconfigure(b2r2_library *library,b2r2_configuration *config) +{ + + b2r2_driver_memory driver_memory; + int size=config->no_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; +} + + + + + + + + + + |