Пример #1
0
int main (int argc, char *argv[])
{
    vAllocate_Deallocate_basic();
    ion_m4u_misc_using();

    return 0;
}
Пример #2
0
int main (int argc, char *argv[])
{
    M4UDBG("enter m4u_ut main \n");
    vAllocate_Deallocate_basic();


#if 0
    
    unsigned int i;
    M4UDBG("argc=%d \n", argc);
    for(i=0;i<argc;i++)
    {
    	  M4UDBG("argv[%d]=%s \n", i, argv[i]);
    }
    
    unsigned int* pDataIn = new unsigned int[argc];
    for(i=0;i<argc;i++)
    {
    	  sscanf(argv[i],"%d",pDataIn+i);
    }
    for(i=0;i<argc;i++)
    {
    	  M4UDBG("pDataIn[%d]=%d \n", i, *(pDataIn+i));
    }
    delete[] pDataIn;
        
    ///> --------------------1. allocate memory as LCD's source buffer
    unsigned int BufSize = 390*210*2;
    int pmem_fd_src, pmem_fd_dst;
    
#ifdef M4U_MEM_USE_PMEM    
    unsigned int BufAddr = (unsigned int)pmem_alloc_sync(BufSize, &pmem_fd_src );
    if(BufAddr==NULL)
    {
        M4UDBG("alloc pmem failed! \n");
    }
    else
    {
    	  M4UDBG("alloc pmem success! BufAddrDst=0x%x\n", BufAddr);
    }    
    unsigned int BufAddrPA = (unsigned int)pmem_get_phys(pmem_fd_src);
    M4UDBG("src use pmem, BufAddr=0x%x,  BufAddrPA=0x%x \n", BufAddr, BufAddrPA);
#else
    unsigned int BufAddr = (unsigned int)new unsigned char[BufSize];
    M4UDBG("src use new, BufAddr=0x%x \n", BufAddr);
#endif    


    unsigned int BufMVA;
    FILE *fp;
    fp = fopen("/system/bin/data_rgb565_720x480.bin", "r");
    if(NULL==fp)
    {
        M4UDBG("open /system/bin/data_rgb565_720x480.bin failed! \n");
        //memset((unsigned char*)BufAddr, 0xff, BufSize);
        memcpy((unsigned char*)BufAddr, rgb565_390x210, BufSize);
    }
    else
    {
        fread((unsigned char*)BufAddr , 1 , BufSize , fp);
        fclose(fp);
    }

    // save image
    {
        char* pFile;
        unsigned int index=0;
        pFile = new char[30];
        memset(pFile, 0, 30);
        sprintf(pFile, "/data/source_rgb_%d.bin", 1);
        fp = fopen(pFile, "w");
        for(index = 0 ; index < BufSize ; index++)
        {
            fprintf(fp, "%c", *(unsigned char*)(BufAddr+index));
        }
        fclose(fp);
    } 
    
    unsigned int BufSizeDst = 390*210*2;

#ifdef M4U_MEM_USE_PMEM   
    unsigned int BufAddrDstPA;
    unsigned int BufAddrDst = (unsigned int)pmem_alloc_sync(BufSize, &pmem_fd_dst );
    if(BufAddrDst==NULL)
    {
        M4UDBG("alloc pmem failed! \n");
    }
    else
    {
    	  M4UDBG("alloc pmem success! BufAddrDst=0x%x\n", BufAddrDst);
    }
    BufAddrDstPA = (unsigned int)pmem_get_phys(pmem_fd_dst);
    M4UDBG("dst use pmem, BufAddrDst=0x%x,  BufAddrDstPA=0x%x \n", BufAddrDst, BufAddrDstPA);
#else
    unsigned int BufAddrDst = (unsigned int)new unsigned char[BufSize];
#endif
    
    memset((unsigned char*)BufAddrDst, 0x55, BufSizeDst);
    M4UDBG("src addr=0x%x, dst addr=0x%x \r\n", BufAddr, BufAddrDst);

    ///> --------------------2. allocate MVA
    MTKM4UDrv CM4u;
    CM4u.m4u_power_on(M4U_CLNTMOD_LCDC);
    // allocate MVA buffer for LCDC module                    
    CM4u.m4u_alloc_mva(M4U_CLNTMOD_LCDC,     // Module ID
                       BufAddr,              // buffer virtual start address
                       BufSize,              // buffer size
                       &BufMVA);             // return MVA address
    M4UDBG(" after m4u_alloc_mva(), BufMVA=0x%x \r\n", BufMVA);
    
    ///> --------------------3. insert tlb range and tlb entry
    // manual insert MVA start page address
    CM4u.m4u_manual_insert_entry(M4U_CLNTMOD_LCDC, 
                                 BufMVA,   // MVA address
                                 true);    // lock the entry for circuling access

    // insert TLB uni-update range
    CM4u.m4u_insert_tlb_range(M4U_CLNTMOD_LCDC, 
                              BufMVA,                // range start MVA
                              BufMVA + BufSize - 1,  // range end MVA
                              RT_RANGE_HIGH_PRIORITY,
                              1);
    M4UDBG(" after m4u_manual_insert_entry() and m4u_insert_tlb_range() \r\n");
    CM4u.m4u_dump_reg(M4U_CLNTMOD_LCDC);
    CM4u.m4u_dump_info(M4U_CLNTMOD_LCDC);

    ///> --------------------4. config LCD port                       
    // config LCD port 
    M4U_PORT_STRUCT M4uPort;
    M4uPort.ePortID = M4U_PORT_LCD_R;
    M4uPort.Virtuality = 1;						   
    M4uPort.Security = 0;
    M4uPort.Distance = 1;
    M4uPort.Direction = 0;
    CM4u.m4u_config_port(&M4uPort);

/*
    M4uPort.ePortID = M4U_PORT_LCD_W;
    M4uPort.Virtuality = 1;						   
    M4uPort.Security = 0;
    M4uPort.Distance = 1;
    M4uPort.Direction = 0;
    CM4u.m4u_config_port(&M4uPort);
*/

/*
    CM4u.m4u_dump_reg(M4U_CLNTMOD_LCDC);
    CM4u.m4u_dump_info(M4U_CLNTMOD_LCDC);

    ///> --------------------5. start hardware engine
    // ...
    CM4u.m4u_monitor_start(M4U_PORT_LCD_R);
    int fp_fb;
    struct fb_overlay_layer ut_layer;
    fp_fb = open("/dev/graphics/fb0",O_RDONLY);
    if(fp_fb<0) return 0;
    	
    ut_layer.src_fmt = MTK_FB_FORMAT_RGB565;
    ut_layer.layer_id = 0;
    ut_layer.layer_enable = 1;
    ut_layer.src_base_addr = (void*)BufMVA;
    ut_layer.src_phy_addr = (void*)BufAddrDstPA; //////////////dest addr
    ut_layer.src_direct_link = 0;
    ut_layer.src_offset_x = ut_layer.src_offset_y = 0;
    ut_layer.tgt_offset_x = ut_layer.tgt_offset_y = 0;
    ut_layer.tgt_height = ut_layer.src_height = 390;
    ut_layer.tgt_width = ut_layer.src_width = ut_layer.src_pitch = 210;
    ut_layer.src_color_key = 0;
    ut_layer.layer_rotation = MTK_FB_ORIENTATION_0;
    
    ioctl(fp_fb, MTKFB_M4U_UT, &ut_layer);
    CM4u.m4u_monitor_stop(M4U_PORT_LCD_R);
*/

    M4UDBG("src_va=0x%x, dst_va=0x%x, *dst_va=0x%x \n", 
        BufAddr, BufAddrDst, *(unsigned char*)BufAddrDst);
    
    // save image
    {
        char* pFile;
        unsigned int index=0;
        pFile = new char[30];
        memset(pFile, 0, 30);
        sprintf(pFile, "/data/result_rgb_%d.bin", 1);
        fp = fopen(pFile, "w");
        for(index = 0 ; index < BufSize ; index++)
        {
            fprintf(fp, "%c", *(unsigned char*)(BufAddrDst+index));
        }
        fclose(fp);
    }    

    ///> --------------------6. de-allocate MVA and release tlb resource
    CM4u.m4u_invalid_tlb_range(M4U_CLNTMOD_LCDC, BufMVA, BufMVA+BufSize-1);
    CM4u.m4u_dealloc_mva(M4U_CLNTMOD_LCDC, BufAddr, BufSize, BufMVA);
    M4UDBG(" after m4u_dealloc_mva() \r\n");
    CM4u.m4u_dump_reg(M4U_CLNTMOD_LCDC);
    CM4u.m4u_dump_info(M4U_CLNTMOD_LCDC);
    CM4u.m4u_power_off(M4U_CLNTMOD_LCDC);
    
    int cnt=0;
    //while(1)
    {
    	sleep(2);
    	M4UDBG("m4u_ut sleep! %d\n", cnt++);
    }

#ifdef M4U_MEM_USE_PMEM     

#else
    delete[] (unsigned char*)BufAddr;
    delete[] (unsigned char*)BufAddrDst;
#endif

#endif


    return 0;
}