• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    4年前 (2014-10-31)  dsp Linux |   抢沙发  53 
    文章评分 0 次,平均分 0.0

    今天看了DM8127 Linux端运行在A8核上程序流程,并分析以作备用。我们使用的解决方案是IPNC_SDK_3.5或者IPNC_SDK_3.8,Linux Host使用的是unbutu 10,以下分析都是针对A8运行Linux下的程序。

    1.程序启动流程

      1.1.Linux系统开机执行/etc/rcS/dS99finish.sh这个脚本

    整个脚本实际上是/etc/init.d/finish_ubifs.sh的一个软连接,可以看看这个脚本详情:

    #!/bin/sh
    echo ' inside finish.sh '
    if ! test -e /etc/.configured; then
    	> /etc/.configured
    fi
    echo 33 > /sys/class/gpio/export
    echo 85 > /sys/class/gpio/export
    echo 103 > /sys/class/gpio/export
    echo 104 > /sys/class/gpio/export
    echo 105 > /sys/class/gpio/export
    echo 106 > /sys/class/gpio/export
    echo 107 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio33/direction
    echo out > /sys/class/gpio/gpio104/direction
    /opt/ipnc/smart_mount UBIFS /dev/mtd5 /mnt/nand
    mkdir /tmp/nand
    /opt/ipnc/smart_mount UBIFS /dev/mtd7 /tmp/nand
    rm -f /tmp/nand/boa-temp.bin
    cd /opt/ipnc
    ./init.sh
    ./system_server&
    sleep 7
    ./autorun_ipnc.sh&
    cd /
    

    首先挂载文件系统到/dev/mmtd5,因此在每次更新程序后,最好先flash_eraseall /etc/mtd5,接着执行init.sh初始化脚本,启动system_server进程,最后执行autorun_ipnc.sh脚本

      1.2.init.sh初始化脚本

    这个脚本除了加载一些驱动或者模块外,还主要运行了./bin/remote_debug_client.out 0xbff00000 ./linux_prcm_ipcam

      1.3.autorun_ipnc.sh初始化脚本

    也是执行一些初始化工作,并执行下面程序

    cd /opt/ipnc
    ./boot_proc 1&
    sleep 2
    ./boa -c /etc &
    sleep 2
    ./boot_proc 2&
    sleep 2
    

    2.程序运行流程

    整个RDK仅仅提供了一个可供执行的工程,Demo位于\ipnc_rdk\ipnc_mcfw\demos,其中的ipnc_rdk\ipnc_mcfw\demos\mcfw_api_demos\multich_usecase为usecase工程主函数所在目录,主函数文件为ti_mcfw_ipnc_main.c

    在ipnc_rdk\ipnc_mcfw\mcfw\src_linux\mcfw_api\usecases目录下我们可以看见很多usecase,不同的usecase针对不同的应用场景,在每个usecase的源文件里我们可以看到流程图。

    那么multich_usecase与usecases是什么关系呢,看下面各个步骤分析:

      2.1.Demo主函数运行

    在使用make -s mcfw_linux交叉编译后,会生成这个demo的可执行程序ipnc_rdk_mcfw.out,在主函数中,会调用函数

    Vsys_create();

    这个函数可以从提供的chm帮助文档中查到,他的解释如下:

    Create and setup processing block's based on sub-system configuration.
    This API should be called after sub-system init's ( Vxxx_init() ). This API will allocate and setup all HW resource in order for the system use-case to run. Once this API succeds now the sub-system's can be started to start the system execution

      2.2.Vsys_create主函数运行

    在Vsys_create中,根据系统配置的usecase(应用场景)选择不同的处理函数,代码如下:

    switch (gVsysModuleContext.vsysConfig.systemUseCase) {
    
            case VSYS_USECASE_MULTICHN_TRISTREAM_LOWPWR:
                MultiCh_createTriStreamLowPwr();
                break;
    		case VSYS_USECASE_TRISTREAM_SMARTANALYTICS:			
            case VSYS_USECASE_MULTICHN_TRISTREAM_FULLFTR:
                MultiCh_createTriStreamFullFtr();
                break;
            case VSYS_USECASE_DUALCHN_DISPLAY:
                MultiCh_createStreamCaptureDisplay();
                break;
    		case VSYS_USECASE_ENC_A8_DEC:
    			MultiCh_createEncA8Dec();
    			break;
    		case VSYS_USECASE_MULTICHN_QUADSTREAM_NF:
    			MultiCh_createQuadStreamNf();
    			break;
            case VSYS_USECASE_DUALCHN_DEMO:
                MultiCh_createStreamDualStreamDemo();
                break;
    		case VSYS_USECASE_MCTNF_DEMO:
    			MultiCh_createStreamCaptMctnfDisplay();
    			break;
    		case VSYS_USECASE_RVM_DEMO:
    			MultiCh_createRvm();
    			break;			
            case VSYS_USECASE_MAX:
            default:
                break;
        

    这些函数都声明在\ipnc_rdk\ipnc_mcfw\mcfw\src_linux\mcfw_api\ti_vsys_priv.h中,那么哪些文件来实现这些函数呢,就得看哪些源文件或者头文件包含了这个头文件。在ipnc_rdk\ipnc_mcfw\mcfw\src_linux\mcfw_api\usecases中的multich_common.h中包含了该头文件,现在目标转到multich_common.h上,查看usecases目录下的的所有usecase都会看见包含了multich_common.h头文件。

    所以,Vsys_create中使用switch针对不同的应用场景分发到不同的usecase,对应关系如下

    这个函数可以从提供的chm帮助文档中查到,他的解释如下:

    VSYS_USECASE_MULTICHN_TRISTREAM_LOWPWR------multich_tristream_lowpower.c
    VSYS_USECASE_TRISTREAM_SMARTANALYTICS------multich_tristream_fullfeature.c
    VSYS_USECASE_MULTICHN_TRISTREAM_FULLFTR------multich_tristream_fullfeature.c
    VSYS_USECASE_DUALCHN_DISPLAY------multich_dualstream_demo.c
    VSYS_USECASE_ENC_A8_DEC------multich_encode_decode.c
    VSYS_USECASE_MULTICHN_QUADSTREAM_NF------multich_quadstream_noisefilter.c
    VSYS_USECASE_DUALCHN_DEMO------multich_dualstream_demo.c
    VSYS_USECASE_MCTNF_DEMO------multich_captMctnfDisp.c
    VSYS_USECASE_RVM_DEMO------multich_rvm.c

    至此,明白了,整个RDK提供的唯一的Demo工程为multich_usecase,整个工程中根据配置使用不同的usecase作为应用场景,我们可以很容易添加自己的usecase了。

      2.3.link与chain

    另外通过这些usecase,我们可以看到link如何被组织成chain,如果要看link如何实现,在哪里实现的话,我们还是按照这个方向反推multich_common.h->ti_vsys_priv.h,是不是在ti_vsys_priv.h中看见了好多Link的头文件,随便打开一个就知道怎么实现了。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/3810.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享