分享

OMAPL138学习

 暗夜藏经阁 2016-12-02

loop例程中数据流向:

loop.c是实现loop例程的文件。

在LOOP_Main()主函数中调用Loop_Create()、LOOP_Execute()、LOOP_Delete()三个函数来创建执行和删除。

LOOP_Create()中PROC_setup()初始化proc对象,PROC_attach()附加要使用的DSP,随后打开POOL

PROC_load() 下载代码到DSP端

 status = CHNL_create (processorId, CHNL_ID_OUTPUT, &chnlAttrOutput) ;创建到DSP的channel

status = CHNL_create (processorId, CHNL_ID_INPUT, &chnlAttrInput) ;        创建来自DSP的channel

status = CHNL_allocateBuffer (processorId,
                                      CHNL_ID_OUTPUT,
                                      LOOP_Buffers, 分配传输到DSP的缓冲
                                      LOOP_BufferSize ,
                                      1) ;                            

 temp = LOOP_Buffers [0] ;
  for (i = 0 ; i < LOOP_BufferSize ; i++) { 初始化缓冲有效数据
            *temp++ = XFER_CHAR ;}

    status = LOOP_Execute (LOOP_NumIterations, processorId) ;   执行数据传输

    ----------PROC_start()//让DSP开始运行

    ----------status = CHNL_issue (processorId, CHNL_ID_OUTPUT, &LOOP_IOReq) ;   //向DSP发送数据,把已经填充好的数据发送到channel

   -----------status = CHNL_reclaim (processorId,        //回收空缓冲
                                   CHNL_ID_OUTPUT,
                                   WAIT_FOREVER,
                                   &LOOP_IOReq) ;

………………………………………………DSP端……………………………………………

在DSP端进行ISR初始化、DSPLINK初始化以后进入SWILOOP_create()

SWILOOP_create()

------------DSPLINK_init()

------------status=POOL_open(0,&poolObj)

------------ status = DEV_createDevice("/dsplink", &ZCPYDATA_FXNS, (Fxn) &ZCPYDATA_init, &devAttrs) ;

这一步是动态建立IOM 驱动,这个IOM驱动是什么东西。DSP/BIOS提供了两种设备驱动来使能应用程序与DSP周边进行通信传输:IOM和SIO/DEV。

---------- status = DEV_createDevice("/dio_dsplink", &DIO_tskDynamicFxns, NULL, &dioDevAttrs);//

       上图是在使用DIO 驱动和mini-driver 各个模块的依赖关系。

-------------*infoPtr = MEM_calloc (DSPLINK_SEGID,        //为SWILOOP传输信息结构体分配
                           sizeof (SWILOOP_TransferInfo),
                           DSPLINK_BUF_ALIGN) ;

-------------GIO_Attrs gioAttrs  = GIO_ATTRS ;                   //这一步是创建channel handle
        info->gioInputChan  = GIO_create (INPUT_CHANNEL,
                                         IOM_INPUT,
                                          NULL,
                                          NULL,
                                           &gioAttrs) ;
        info->gioOutputChan = GIO_create (OUTPUT_CHANNEL,
                                           IOM_OUTPUT,
                                           NULL,
                                           NULL,
                                           &gioAttrs) ;

这个GIO又是什么东西呢?GIO模块是DSP/BIOS用于输入输出的模块,它是应用程序和mini-driver的通信基础。DEV模块负责维护系统设备驱动表,GIO模块通过使用函数来获得设备信息,比如说DEV_match。

G IO_create()是分配和初始化GIO对象。应用程序调用GIO_create 来建立GIO_Obj 对象和打开channel 通信。这个函数初始化I/Ochannel ,打开最底层的设备驱动channel。也创建了同步对象并存储在GIO_obj对象里。

-----------  swiAttrs.fxn     = loopbackSWI ;                              //这一段为发送和接收数据创建SWI 

            swiAttrs.arg0    = (Arg) info ;
           swiAttrs.mailbox = INITIAL_MAILBOX_VAL ;
                    info->swi = SWI_create (&swiAttrs) ;
                             if (info->swi == NULL) {
                             status = SYS_EALLOC ;
                             SET_FAILURE_REASON (status) ;
                              }

     ----------loopbackSWI()      

--------- for (i = 0 ; i < info->readWords ; i++) {//处理数据
       info->outputBuffer [i] = info->inputBuffer [i] ;

--------- iomStatus = GIO_submit (info->gioInputChan,     //提交读请求
                          IOM_READ,
                            info->inputBuffer,
                            (size_t *) &(info->bufferSize),
                            &(info->appReadCb)) ;

-------iomStatus = GIO_submit (info->gioOutputChan,
                               IOM_WRITE,
                                info->outputBuffer,
                                &numWordsToWrite,
                               &(info->appWriteCb)) ;

GIO_submin()是向mini-driver提交 GIO数据包,成功返回IOM_COMPLETED,如果请求被排列则返回IOM_PENDING。

GIO_write()同步写命令,应用程序使用这个函数写数据到通信channel。

-------- status = POOL_alloc (SAMPLE_POOL_ID,
                             (Ptr *) &(info->inputBuffer),
                             info->bufferSize) ;
         if (status == SYS_OK) {
             status = POOL_alloc (SAMPLE_POOL_ID,
                                 (Ptr *) &(info->outputBuffer),
                                 info->bufferSize) ;

为输入和输出分配缓冲区

SWILOOP_execute()

----------iomStatus = GIO_submit (info->gioInputChan,
                            IOM_READ,
                            info->inputBuffer,
                            (size_t *) &(info->bufferSize),
                            &(info->appReadCb)) ;

  提交读请求

----------SWI_andn (info->swi, WRITE_MAILBOX_MASK) ;

这是SWI模型中的一个函数,SWI模块是软件中断管理,SWI_andn()是清除软件中断邮箱位,如果值为0则提交,它用于提交一个软件中断,

tskLoopTask = TSK_create(tskLoop, NULL, 0);  //为TSKLOOP 应用程序创建任务

----------DSPLINK_init();

----------TSKLOOP_create()

----------POOL_open()

                ----------- status = DEV_createDevice("/dsplink", &ZCPYDATA_FXNS, (Fxn) &ZCPYDATA_init, &devAttrs) ;

动态创建IOM驱动

----------status = DEV_createDevice("/dio_dsplink", &DIO_tskDynamicFxns, NULL, &dioDevAttrs);

动态创建DIO适配器

---------- *infoPtr = MEM_calloc (DSPLINK_SEGID,
                           sizeof (TSKLOOP_TransferInfo),
                           DSPLINK_BUF_ALIGN) ;

分配TSKLOOP_TransferInfo,初始化并传递给其他应用程序参数

-----------  info->numTransfers =  numTransfers ;
        info->bufferSize   =  xferBufSize ;
        info->numBuffers   =  TSK_NUM_BUFFERS ;

-

-

-

-

-待续……

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多