OMAPL138學習----DSPLINK DEMO解析之LOOP

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。

GIO_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 ;

-

-

-

-

-待續……


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章