This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请问DM8168 DVR_RDK系统上,A8和DSP之间数据共享buffer地址是怎么转换的?



各位大侠:

    我们需要A8从文件中读取数据(约3MByte)到DSP,作为DSP上算法的一个输入,DSP算法处理后,再将处理结果输出给A8,也是约3MByte大小。

因此,我们使用DM8168 DVR_RDK系统上DDR内的“FrameBuffer”作为两个核间的数据共享buffer。

目前通过DSP申请了数据共享buffer,获取了该数据共享buffer在DSP上的地址。

请问A8上看到该数据共享buffer的地址是什么?即如何将该数据共享buffer的DSP的地址转换为A8的地址?

谢谢!

  • 你好,

    对于A8就是把物理地址转换为了Linux下的虚拟地址。

    在DVR RDK里面已经有相应的应用,请参考Osa.c里面的mmap函数。

  • hi,Chris

        您说的是下面Mingw_support.c中的mmap()函数吗?

        我们的版本还是DVRRDK_02.00.00.23。

         谢谢!

     

  • hi,Chris

        您说的是下面Mingw_support.c中的mmap()函数吗?

        我们的版本还是DVRRDK_02.00.00.23。

         谢谢!

    void *mmap(void *addr, size_t len, int prot, int flags, int fd, int offset)
    {
        void *map = NULL;
        HANDLE handle = INVALID_HANDLE_VALUE;
        DWORD cfm_flags = 0, mvf_flags = 0;

        switch (prot) {
        case PROT_READ | PROT_WRITE:
            cfm_flags = PAGE_READWRITE;
            mvf_flags = FILE_MAP_ALL_ACCESS;
            break;
        case PROT_WRITE:
            cfm_flags = PAGE_READWRITE;
            mvf_flags = FILE_MAP_WRITE;
            break;
        case PROT_READ:
            cfm_flags = PAGE_READONLY;
            mvf_flags = FILE_MAP_READ;
            break;
        default:
            return MAP_FAILED;
        }

        handle = CreateFileMappingA((HANDLE) _get_osfhandle(fd), NULL,
                    cfm_flags, HIDWORD(len), LODWORD(len), NULL);
        if (!handle)
            return MAP_FAILED;

        map = MapViewOfFile(handle, mvf_flags, HIDWORD(offset),
                LODWORD(offset), len);
        CloseHandle(handle);

        if (!map)
            return MAP_FAILED;

        return map;
    }

  • hi,Chris

        您说的是下面Mingw_support.c中的mmap()函数吗?

        我们的版本还是DVRRDK_02.00.00.23。

         谢谢!

    void *mmap(void *addr, size_t len, int prot, int flags, int fd, int offset)
    {
        void *map = NULL;
        HANDLE handle = INVALID_HANDLE_VALUE;
        DWORD cfm_flags = 0, mvf_flags = 0;

        switch (prot) {
        case PROT_READ | PROT_WRITE:
            cfm_flags = PAGE_READWRITE;
            mvf_flags = FILE_MAP_ALL_ACCESS;
            break;
        case PROT_WRITE:
            cfm_flags = PAGE_READWRITE;
            mvf_flags = FILE_MAP_WRITE;
            break;
        case PROT_READ:
            cfm_flags = PAGE_READONLY;
            mvf_flags = FILE_MAP_READ;
            break;
        default:
            return MAP_FAILED;
        }

        handle = CreateFileMappingA((HANDLE) _get_osfhandle(fd), NULL,
                    cfm_flags, HIDWORD(len), LODWORD(len), NULL);
        if (!handle)
            return MAP_FAILED;

        map = MapViewOfFile(handle, mvf_flags, HIDWORD(offset),
                LODWORD(offset), len);
        CloseHandle(handle);

        if (!map)
            return MAP_FAILED;

        return map;
    }

  • 你好,

    如果你们的软件不是已经开发很久,我还是建议你使用最新版本的DVR RDK。

    mmap是Linux自带的函数,网上搜索一下相关信息吧。

  • hi,chris

         DM8168开发板我们是从第三方(TI小代理商)那里购买的。

         我们曾向他们提出提供最新DVR-RDK开发包的需求,但是他们说提供不了。

         TI网站上也没有找到下载的。

         请帮忙指导一下如何获取最新版本的DVR-RDK。

         谢谢!

  •     我们在DSP上申请的共享数据buffer地址(地址是0x8fcf2e94),采用mmap()函数在A8上转换为ARM地址时,转换的结果(0xffffffff)应该不正确,请大侠们看看可能是什么原因?
         
         --- 共享数据buffer在C6XDSP上看到的地址:
             memAddr is 0x8fcf2e94!!!

         
    --- 共享数据buffer在A8调用mmap()函数转换后的地址
             pCaliMemVirtAddr is 0xffffffff!!!

    以下是代码:
    int Demo_GetShareMemAddrAtA8( unsigned int memAddr )
    {
        unsigned int memAddr;
        unsigned int memSize = 2048;
        unsigned int mmapMemAddr;
        unsigned int memOffset;
     
        memfd = open("/dev/mem",O_RDWR|O_SYNC);
        if(memfd < 0)
        {
            printf(" ERROR: /dev/mem open failed !!!\n");
            return -1;
        }
     
        memAddr = 0x8fcf2e94;
        printf(" memAddr is 0x%x!!!\n",memAddr);
        memOffset   = 0;
     
        mmapMemAddr = memAddr - memOffset;
     
        mmapMemSize = memSize + memOffset;
     
        pCaliMemVirtAddr = mmap
                (void *)mmapMemAddr,
                mmapMemSize,
                PROT_READ|PROT_WRITE|PROT_EXEC,MAP_SHARED,
                memfd,
                mmapMemAddr
                );
        printf(" pCaliMemVirtAddr is 0x%x!!!\n",pCaliMemVirtAddr);
        if (pCaliMemVirtAddr==NULL)
        {
            perror(" ERROR: mmap() failed !!!\n");
            close(memfd);
            return -1;
        }
     
        return pCaliMemVirtAddr;
    }

  • mmap函数源码如下,应该是不正常的返回 MAP_FAILED 了,不知道为啥?

    void *mmap(void *addr, size_t len, int prot, int flags, int fd, int offset)
    {
        void *map = NULL;
        HANDLE handle = INVALID_HANDLE_VALUE;
        DWORD cfm_flags = 0, mvf_flags = 0;

        switch (prot) {
        case PROT_READ | PROT_WRITE:
            cfm_flags = PAGE_READWRITE;
            mvf_flags = FILE_MAP_ALL_ACCESS;
            break;
        case PROT_WRITE:
            cfm_flags = PAGE_READWRITE;
            mvf_flags = FILE_MAP_WRITE;
            break;
        case PROT_READ:
            cfm_flags = PAGE_READONLY;
            mvf_flags = FILE_MAP_READ;
            break;
        default:
            return MAP_FAILED;
        }

        handle = CreateFileMappingA((HANDLE) _get_osfhandle(fd), NULL,
                    cfm_flags, HIDWORD(len), LODWORD(len), NULL);
        if (!handle)
            return MAP_FAILED;

        map = MapViewOfFile(handle, mvf_flags, HIDWORD(offset),
                LODWORD(offset), len);
        CloseHandle(handle);

        if (!map)
            return MAP_FAILED;

        return map;
    }