DM8127 Linux端程序流程分析

2014年11月1日 由 Creater 留言 »

今天看了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的头文件,随便打开一个就知道怎么实现了。

广告位

发表评论

你必须 登陆 方可发表评论.