打印
[DSP编程]

【连载】DaVinci 把玩实录

[复制链接]
楼主: dong_abc
手机看帖
扫描二维码
随时随地手机跟帖
101
dong_abc|  楼主 | 2013-12-6 12:35 | 只看该作者 回帖奖励 |倒序浏览
zhouluopei 发表于 2013-12-6 10:34
谢谢回复啊,但是我看狗板好像视频输入输出这一块做的比较好,天漠你还需要买他的输入输出模块,加起来都上 ...


这几天没折腾了,没怎么仔细比较这两个个板子。你看看天漠的光盘吧。新手玩狗板必定会多灾多难。
http://pan.baidu.com/s/1xiDKU

使用特权

评论回复
102
zhouluopei| | 2013-12-7 10:33 | 只看该作者
谢谢提醒啊,但是你那个链接打不开,我重新下了一个,我知道原装板多灾多难,我现在用的就是ti的原装版omapl138 lcdk,那用得太痛苦了,由于我以前没搞过linux,使我现在模拟视频读入模块驱动还没有搞定,ti那边的支持又做得很差,痛苦。。。。。。还是买天漠吧,我想问一下,天漠的工程师支持好吗?积不积极?

使用特权

评论回复
103
dong_abc|  楼主 | 2013-12-8 10:43 | 只看该作者
zhouluopei 发表于 2013-12-7 10:33
谢谢提醒啊,但是你那个链接打不开,我重新下了一个,我知道原装板多灾多难,我现在用的就是ti的原装版omap ...

关于技术支持,可能要让你失望了,这几年买的各厂家的开发板,基本都是0支持。ARM级开发板的支持太繁琐注定就不会有太好的支持,除非你跟厂商有项目上的合作。你也知道开发板也没什么利润,指望他们在你身上花太多精力是不现实的。找个主流、资料完整的板是最靠谱的。 good luck ......

使用特权

评论回复
104
ycdhonker| | 2014-4-3 09:23 | 只看该作者
谢谢楼主 祝楼主找个好媳妇,嘿嘿

使用特权

评论回复
105
windqj| | 2014-6-7 20:26 | 只看该作者
楼主。最近还有在搞DaVinci么?我用的是天漠的Devkit8500.现在在尝试添加自己的算法时遇到了问题。我只是在videnc_copy这个codec修改了如下
/*
*  ======== VIDENCCOPY_TI_alloc ========
*/
Int VIDENCCOPY_TI_alloc(const IALG_Params *algParams,
    IALG_Fxns **pf, IALG_MemRec memTab[])
{
    if (curTrace.modName == NULL) {   /* initialize GT (tracing) */
        GT_create(&curTrace, GTNAME);
    }

    GT_3trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_alloc(0x%x, 0x%x, 0x%x)\n",
        algParams, pf, memTab);

    /* Request memory for my object */
    memTab[0].size = sizeof(VIDENCCOPY_TI_Obj);
    memTab[0].alignment = 0;
    memTab[0].space = IALG_EXTERNAL;
    memTab[0].attrs = IALG_PERSIST;

    memTab[1].size = sizeof(IplImage);
    memTab[1].alignment = 0;
    memTab[1].space = IALG_EXTERNAL;
    memTab[1].attrs = IALG_PERSIST;

    memTab[2].size = sizeof(IplImage);
    memTab[2].alignment = 0;
    memTab[2].space = IALG_EXTERNAL;
    memTab[2].attrs = IALG_PERSIST;

    memTab[3].size = 640*480*sizeof(XDAS_UInt8);
    memTab[3].alignment = 0;
    memTab[3].space = IALG_EXTERNAL;
    memTab[3].attrs = IALG_PERSIST;

    memTab[4].size = 320*480*sizeof(XDAS_UInt8);
    memTab[4].alignment = 0;
    memTab[4].space = IALG_EXTERNAL;
    memTab[4].attrs = IALG_PERSIST;

    memTab[5].size = 320*480*sizeof(XDAS_UInt8);
    memTab[5].alignment = 0;
    memTab[5].space = IALG_EXTERNAL;
    memTab[5].attrs = IALG_PERSIST;


    return (6);
}


/*
*  ======== VIDENCCOPY_TI_free ========
*/
Int VIDENCCOPY_TI_free(IALG_Handle handle, IALG_MemRec memTab[])
{
    VIDENCCOPY_TI_Obj *VIDENC_COPY = (VIDENCCOPY_TI_Obj *)handle;
    GT_2trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_free(0x%lx, 0x%lx)\n",
        handle, memTab);

    VIDENCCOPY_TI_alloc(NULL, NULL, memTab);

    memTab[0].base = handle;

    memTab[1].base = VIDENC_COPY->IMG_Y;
    memTab[1].size = sizeof(IplImage);

    memTab[2].base = VIDENC_COPY->IMG_H;
    memTab[2].size = sizeof(IplImage);

    memTab[3].base = VIDENC_COPY->CamY;
    memTab[3].size = 640 * 480 *sizeof(XDAS_UInt8);

    memTab[4].base = VIDENC_COPY->CamU;
    memTab[4].size = 320 * 480 *sizeof(XDAS_UInt8);

    memTab[5].base = VIDENC_COPY->CamV;
    memTab[5].size = 320 * 480 *sizeof(XDAS_UInt8);

    return (6);
}


/*
*  ======== VIDENCCOPY_TI_initObj ========
*/
Int VIDENCCOPY_TI_initObj(IALG_Handle handle,
    const IALG_MemRec memTab[], IALG_Handle p,
    const IALG_Params *algParams)
{
    VIDENCCOPY_TI_Obj *VIDENC_COPY = (VIDENCCOPY_TI_Obj *)handle;

    VIDENC_COPY->IMG_Y  = memTab[1].base;
    VIDENC_COPY->IMG_H  = memTab[2].base;
    VIDENC_COPY->CamY   = memTab[3].base;
    VIDENC_COPY->CamU   = memTab[4].base;
    VIDENC_COPY->CamV   = memTab[5].base;       
    GT_4trace(curTrace, GT_ENTER,
        "VIDENCCOPY_TI_initObj(0x%x, 0x%x, 0x%x, 0x%x)\n", handle, memTab,
        p, algParams);

    return (IALG_EOK);
}


/*
*  ======== VIDENCCOPY_TI_process ========
*/
XDAS_Int32 VIDENCCOPY_TI_process(IVIDENC_Handle h, XDM_BufDesc *inBufs,
    XDM_BufDesc *outBufs, IVIDENC_InArgs *inArgs, IVIDENC_OutArgs *outArgs)
{
    XDAS_Int32 curBuf;
    XDAS_UInt32 minSamples;

    XDAS_UInt32 m,n,l;
   
    Uint8* pointer;
    XDAS_UInt8 *CameraY;
    XDAS_UInt8 *CameraU;
    XDAS_UInt8 *CameraV;
    VIDENCCOPY_TI_Obj *VIDENC_COPY = (VIDENCCOPY_TI_Obj *)h;
#ifdef USE_ACPY3
    const Uint32 maxTransferChunkSize       = 0xffff;
    Uint32       thisTransferChunkSize      = 0x0;
    Uint32       remainingTransferChunkSize;
    Uint32       thisTransferSrcAddr, thisTransferDstAddr;

    ACPY3_Params params;
    VIDENCCOPY_TI_Obj *videncObj = (VIDENCCOPY_TI_Obj *)h;
#endif

    GT_5trace(curTrace, GT_ENTER, "VIDENCCOPY_TI_process(0x%x, 0x%x, 0x%x, "
        "0x%x, 0x%x)\n", h, inBufs, outBufs, inArgs, outArgs);

    /* validate arguments - this codec only supports "base" xDM. */
    if ((inArgs->size != sizeof(*inArgs)) ||
        (outArgs->size != sizeof(*outArgs))) {

        GT_2trace(curTrace, GT_ENTER,
            "VIDENCCOPY_TI_process, unsupported size "
            "(0x%x, 0x%x)\n", inArgs->size, outArgs->size);

        return (IVIDENC_EFAIL);
    }
    CameraY = VIDENC_COPY -> CamY;
    CameraU = VIDENC_COPY -> CamU;
    CameraV = VIDENC_COPY -> CamV;   
    pointer = (Uint8 *)inBufs->bufs;
    l=0;
    for(m=0;m<480;m++)
    {
        for(n=0;n<320;n++)
        {
            *(CameraY) = *( pointer + (m*320+n)*4);
              CameraY ++;
            *(CameraU) = *( pointer + (m*320+n)*4 + 1);
              CameraU ++;
            *(CameraY) = *( pointer + (m*320+n)*4 + 2);
              CameraY ++;
            *(CameraV) = *( pointer + (m*320+n)*4 + 3);
              CameraV ++;
        }
    }
    VIDENC_COPY -> IMG_Y -> imageData = VIDENC_COPY -> CamY;
   
    VIDENCCOPY_TI_MyYCbCr2Hue (VIDENC_COPY -> IMG_Y -> imageData, VIDENC_COPY -> CamU, VIDENC_COPY -> CamV, VIDENC_COPY -> IMG_H ->imageData, VIDENCCOPY_TI_CapSize);
   
#ifdef USE_ACPY3
    /*
     * Activate Channel  scratch DMA channels.
     */
    ACPY3_activate(videncObj->dmaHandle1D1D8B);
#endif

    /* outArgs->bytesGenerated reports the total number of bytes generated */
    outArgs->bytesGenerated = 0;

    /*
     * A couple constraints for this simple "copy" codec:
     *    - Video encoding presumes a single input buffer, so only one input
     *      buffer will be encoded, regardless of inBufs->numBufs.
     *    - Given a different size of an input and output buffers, only
     *      encode (i.e., copy) the lesser of the sizes.
     */
   
   /* for (curBuf = 0; (curBuf < inBufs->numBufs) &&
        (curBuf < outBufs->numBufs); curBuf++) {*/

      for (curBuf = 0; curBuf < 640*480; curBuf++){
        /* there's an available in and out buffer, how many samples? */
       /* minSamples = inBufs->bufSizes[curBuf] < outBufs->bufSizes[curBuf] ?
            inBufs->bufSizes[curBuf] : outBufs->bufSizes[curBuf];*/
       
#ifdef USE_ACPY3

        thisTransferSrcAddr        = (Uint32)inBufs->bufs[curBuf];
        thisTransferDstAddr        = (Uint32)outBufs->bufs[curBuf];
        remainingTransferChunkSize = minSamples;

        while (remainingTransferChunkSize > 0) {

            if (remainingTransferChunkSize > maxTransferChunkSize) {
               thisTransferChunkSize = maxTransferChunkSize;
            }
            else {
               thisTransferChunkSize = remainingTransferChunkSize;
            }

            /* Configure the logical channel */
            params.transferType = ACPY3_1D1D;
            params.srcAddr      = (void *)thisTransferSrcAddr;
            params.dstAddr      = (void *)thisTransferDstAddr;
            params.elementSize  = thisTransferChunkSize;
            params.numElements  = 1;
            params.waitId       = 0;
            params.numFrames    = 1;

            remainingTransferChunkSize -= thisTransferChunkSize;
            thisTransferSrcAddr += thisTransferChunkSize;
            thisTransferDstAddr += thisTransferChunkSize;

            /* Configure logical dma channel */
            ACPY3_configure(videncObj->dmaHandle1D1D8B, &params, 0);

            /* Use DMA to copy data */
            ACPY3_start(videncObj->dmaHandle1D1D8B);

            /* wait for transfer to finish  */
            ACPY3_wait(videncObj->dmaHandle1D1D8B);
        }
        GT_1trace(curTrace, GT_2CLASS, "VIDENCCOPY_TI_process> "
               "ACPY3 Processed %d bytes.\n", minSamples);
#else
        GT_3trace(curTrace, GT_2CLASS, "VIDENCCOPY_TI_process> "
               "memcpy (0x%x, 0x%x, %d)\n",
               outBufs->bufs[curBuf], inBufs->bufs[curBuf], minSamples);

        /* process the data: read input, produce output */
        memcpy(outBufs->bufs[curBuf], VIDENC_COPY -> IMG_Y ->imageData, minSamples);
#endif

        outArgs->bytesGenerated += minSamples;
    }

    /* Fill out the rest of the outArgs struct */
    outArgs->extendedError = 0;
    outArgs->encodedFrameType = 0;    /* TODO */
    outArgs->inputFrameSkip = IVIDEO_FRAME_ENCODED;
    outArgs->reconBufs.numBufs = 0;   /* important: indicate no reconBufs */

    return (IVIDENC_EOK);
}
编译是成功的,但是在运行时却出现如下问题
DSP MMU Error Fault!  MMU_IRQSTATUS = [0x1]. Virtual DSP addr reference that generated the interrupt = [0x85900000].
我加载cmemk时用的命令是这个insmod cmemk.ko allowOverlap=1 phys_start=0x84f00000 phys_end=0x85900000 pools=1x5250000,5x829440,1x345600,1x691200,1x1 allowOverlap=1,楼主有遇到这个问题么?我用的是dvsdk4_03,有什么解决思路可以供我参考么?
谢谢

使用特权

评论回复
106
dong_abc|  楼主 | 2014-6-7 21:03 | 只看该作者
windqj 发表于 2014-6-7 20:26
楼主。最近还有在搞DaVinci么?我用的是天漠的Devkit8500.现在在尝试添加自己的算法时遇到了问题。我只是在 ...

半年没搞了,忘光了。

使用特权

评论回复
107
zhangmangui| | 2014-6-7 22:08 | 只看该作者
dong_abc 发表于 2014-6-7 21:03
半年没搞了,忘光了。

楼主啊   **加油继续啊  
很需要

使用特权

评论回复
108
dong_abc|  楼主 | 2014-6-7 22:14 | 只看该作者
zhangmangui 发表于 2014-6-7 22:08
楼主啊   **加油继续啊  
很需要

转行了,做穿戴小产品了。

使用特权

评论回复
109
zhangmangui| | 2014-6-7 22:21 | 只看该作者
dong_abc 发表于 2014-6-7 22:14
转行了,做穿戴小产品了。

越转越好   抽时间学着呗    别丢了啊  

使用特权

评论回复
110
windqj| | 2014-6-11 22:37 | 只看该作者
楼主居然不搞了、哎、难得找到一个开帖子的人在做DaVinci的啊。我的问题还是没能解决,郁闷

使用特权

评论回复
111
hejie7711| | 2014-6-26 19:20 | 只看该作者
dong_abc 发表于 2014-6-7 21:03
半年没搞了,忘光了。

楼主这就不搞啦。。。。。话说去年也看着这帖子,好久不看,楼主竟然就不搞了

使用特权

评论回复
112
dong_abc|  楼主 | 2014-6-26 19:45 | 只看该作者
hejie7711 发表于 2014-6-26 19:20
楼主这就不搞啦。。。。。话说去年也看着这帖子,好久不看,楼主竟然就不搞了 ...

技术这东西,是个无底洞,现在没这方面的项目,自学也不一定用得上。 就算有这方面的项目,也不可能允许你边学边做,这么浮躁社会,都只想捡现成的。

或许,等退休了,又或者转行了有时间了 当业余爱好玩玩还行~

使用特权

评论回复
113
jxggj| | 2014-9-2 15:59 | 只看该作者
本帖最后由 jxggj 于 2014-9-2 16:02 编辑
windqj 发表于 2014-6-7 20:26
楼主。最近还有在搞DaVinci么?我用的是天漠的Devkit8500.现在在尝试添加自己的算法时遇到了问题。我只是在 ...

你好,请问你用的dvsdk是哪个版本?我用dvsdk4.03,但把板带的bsp包放进去后编译出来的映像用不了,你遇到过这种情况吗?贴子里面的大神有没有碰到过?

使用特权

评论回复
114
jxggj| | 2014-9-2 21:12 | 只看该作者
老师你好,我看了您关于davinci的帖子,下了您提供的资料,真的受益匪浅,非常感谢。我用的也是devkit8500的板子,但是我把板子带的bsp包替换dvsdk4.03自带的bsp包,改了相关的文件之后能编译内核,但如果make all,在编译到dmai时就会出错,提示缺少了文件,而如果不替换bsp包是不会出错的。请问您遇到过这种情况吗,你是怎么把板子带的bsp包放进去的?希望您能解答我的问题,万分感谢!

使用特权

评论回复
115
friderick| | 2014-11-1 15:28 | 只看该作者
楼主加油

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则