示例#1
0
文件: fw_load.c 项目: itfanr/dm8168
Int FirmwareLoad_shutdown (UInt16 procId)
{
    Int             status = 0;
    ProcMgr_Handle  handle = NULL;
    UInt32          fileId;

    if(status>=0)
        status = FirmwareLoad_ipcStop(procId);    

    if(status>=0)    
        status = ProcMgr_open (&handle, procId);

    if (status >= 0) {
        status = ProcMgr_stop (handle);
        printf ("Stopped slave procId %d.\n", procId);

        fileId = ProcMgr_getLoadedFileId (handle);
        status = ProcMgr_unload (handle, fileId) ;

        printf ("Unloaded slave procId %d.\n", procId);
        status = ProcMgr_detach (handle);

        printf ("Detached from slave procId %d.\n", procId);

        status = ProcMgr_close (&handle);
    }

    return status;
}
示例#2
0
/*
 *  ======== ipc_cleanup ========
 */
static Void ipcCleanup (Void)
{
    ProcMgr_StopParams stopParams;
    Int                status = 0;

    /* Cleanup the default HeapBufMP registered with MessageQ */
    status = MessageQ_unregisterHeap (RCM_MSGQ_DOMX_HEAPID);
    if (status < 0) {
        Osal_printf ("Error in MessageQ_unregisterHeap [0x%x]\n", status);
    }

    if (heapHandle1) {
        status = HeapBufMP_delete (&heapHandle1);
        if (status < 0) {
            Osal_printf ("Error in HeapBufMP_delete [0x%x]\n", status);
        }
    }

    if (heapBufPtr1) {
        Memory_free (srHeap, heapBufPtr1, heapSize1);
    }

    status = MessageQ_unregisterHeap (RCM_MSGQ_TILER_HEAPID);
    if (status < 0) {
        Osal_printf ("Error in MessageQ_unregisterHeap [0x%x]\n", status);
    }

    if (heapHandle) {
        status = HeapBufMP_delete (&heapHandle);
        if (status < 0) {
            Osal_printf ("Error in HeapBufMP_delete [0x%x]\n", status);
        }
    }

    if (heapBufPtr) {
        Memory_free (srHeap, heapBufPtr, heapSize);
    }

    status = ProcMgr_deleteDMMPool (DUCATI_DMM_POOL_0_ID, remoteIdSysM3);
    if (status < 0) {
        Osal_printf ("Error in ProcMgr_deleteDMMPool:status = 0x%x\n", status);
    }

    if(appM3Client) {
        stopParams.proc_id = remoteIdAppM3;
        status = ProcMgr_stop (procMgrHandleAppM3, &stopParams);
        if (status < 0) {
            Osal_printf ("Error in ProcMgr_stop(%d): status = 0x%x\n",
                            stopParams.proc_id, status);
        }

#if defined(SYSLINK_USE_LOADER)
        status = ProcMgr_unload (procMgrHandleAppM3, fileIdAppM3);
        if(status < 0) {
            Osal_printf ("Error in ProcMgr_unload, status [0x%x]\n", status);
        }
#endif
    }

    stopParams.proc_id = remoteIdSysM3;
    status = ProcMgr_stop (procMgrHandleSysM3, &stopParams);
    if (status < 0) {
        Osal_printf ("Error in ProcMgr_stop(%d): status = 0x%x\n",
                        stopParams.proc_id, status);
    }

#if defined(SYSLINK_USE_LOADER)
    status = ProcMgr_unload (procMgrHandleSysM3, fileIdSysM3);
    if(status < 0) {
        Osal_printf ("Error in ProcMgr_unload, status [0x%x]\n", status);
    }
#endif

    if(appM3Client) {
        status = ProcMgr_detach (procMgrHandleAppM3);
        if (status < 0) {
            Osal_printf ("Error in ProcMgr_detach(AppM3): status = 0x%x\n", status);
        }

        status = ProcMgr_close (&procMgrHandleAppM3);
        if (status < 0) {
            Osal_printf ("Error in ProcMgr_close(AppM3): status = 0x%x\n", status);
        }
    }

    status = ProcMgr_detach (procMgrHandleSysM3);
    if (status < 0) {
        Osal_printf ("Error in ProcMgr_detach(SysM3): status = 0x%x\n", status);
    }

    status = ProcMgr_close (&procMgrHandleSysM3);
    if (status < 0) {
        Osal_printf ("Error in ProcMgr_close(SysM3): status = 0x%x\n", status);
    }

    status = Ipc_destroy ();
    if (status < 0) {
        Osal_printf ("Error in Ipc_destroy: status = 0x%x\n", status);
    }

    Osal_printf ("Done cleaning up ipc!\n\n");
}
/*
 *  ======== procDelete ========
 */
static Void procDelete(Processor_Handle proc)
{
    Int status = 0;
    Int16 heapId;
    Bool unregisterAndDeleteHeap;
    ProcMgr_AddrInfo CMEMAddrInfo;
    CMEM_BlockAttrs cmemBlockAttrs;
    Int blockNum;
    Int nCMEMBlocks;

    Log_print1(Diags_ENTRY, "[+E] Processor_delete_d> Enter (proc=0x%x)",
            (IArg)proc);

    if (proc == NULL) {
        goto procDelete_return;
    }

    /* close tranport and stop DSP, detach, destroy */
    /* unregister this heap with MessageQ */

    if (proc->startCallBackStatus >= 0) {
        blockNum = 0;
        nCMEMBlocks = 0;
        status = CMEM_getNumBlocks(&nCMEMBlocks);
        if (status != 0) {
            Log_print1(Diags_USER2, "[+2] Processor_delete_d> "
                    "CMEM_getNumBlocks() failed: %d",
                    status);
        }

        while (blockNum < nCMEMBlocks) {
            status = CMEM_getBlockAttrs(blockNum, &cmemBlockAttrs);
            if (status != 0) {
                Log_print2(Diags_USER7, "[+7] Processor_delete_d> "
                        "CMEM_getBlockAttrs(%d) failed: %d",
                        blockNum, status);

                goto cmemDone;
            }

            CMEMAddrInfo.addr[ProcMgr_AddrType_MasterPhys] =
                cmemBlockAttrs.phys_base;
            CMEMAddrInfo.addr[ProcMgr_AddrType_SlaveVirt] =
                cmemBlockAttrs.phys_base;
            CMEMAddrInfo.size = cmemBlockAttrs.size;
            CMEMAddrInfo.isCached = FALSE;

            Log_print3(Diags_USER1, "[+1] Processor_delete_d> CMEM block "
                    "#%d found, doing ProcMgr_unmap(0x%x, 0x%x)...", blockNum,
                    (IArg)cmemBlockAttrs.phys_base,
                    (IArg)cmemBlockAttrs.size);

            status = ProcMgr_unmap(proc->procMgrH, ProcMgr_SLAVEVIRT,
                    &CMEMAddrInfo,
                    ProcMgr_AddrType_MasterPhys);
            if (status < 0) {
                Log_print1(Diags_USER7, "[+7] Processor_delete_d> "
                        "ProcMgr_unmap() failed: %d", status);
                goto cmemDone;
            }

            blockNum++;
        }

cmemDone:
        Log_print2(Diags_USER7, "[+2] Processor_delete_d> "
                "defaultHeapH: 0x%x, proc->heapH: 0x%x", (IArg)defaultHeapH,
                (IArg)proc->heapH);
        if (proc->heapH != NULL) {
            unregisterAndDeleteHeap = FALSE;
            if (proc->heapH == defaultHeapH) {
                Log_print1(Diags_USER1, "[+1] Processor_delete_d> "
                        "defaultHeapRefCount = %d",
                        (IArg)defaultHeapRefCount);
                if (--defaultHeapRefCount == 0) {
                    /* this is the last one using the default heap */
                    unregisterAndDeleteHeap = TRUE;
                }
            }
            else {
                unregisterAndDeleteHeap = TRUE;
            }

            if (unregisterAndDeleteHeap) {
                heapId = proc->heapId;
                Log_print1(Diags_USER1, "[+1] Processor_delete_d> "
                        "unregisterAndDeleteHeap, heapId = %d", (IArg)heapId);
                if (heapId != Processor_INVALID) {
                    Log_print1(Diags_USER1, "[+1] Processor_delete_d> "
                            "MessageQ_unregisterHeap(heapId: %d)",
                            (IArg)heapId);

                    if (MessageQ_unregisterHeap(heapId) !=MessageQ_S_SUCCESS) {
                        Log_print1(Diags_USER7, "[+7] Processor_delete_d> "
                                "MessageQ_unregisterHeap(heapId: %d) failed",
                                heapId);
                    }
                }

                /* delete heap used by message queue */
                Log_print1(Diags_USER1, "[+1] Processor_delete_d> "
                        "calling HeapBufMP_delete(heapH: 0x%x)",
                        (IArg)(proc->heapH));

                HeapBufMP_delete(&proc->heapH);
            }
        }

        /* Stop execution on DSP */
        Log_print0(Diags_USER1, "[+2] Processor_delete_d> "
                "calling Ipc_control(STOPCALLBACK)...");
        status = Ipc_control(proc->cpuId, Ipc_CONTROLCMD_STOPCALLBACK, NULL);

        Log_print2(Diags_USER2, "[+2] Processor_delete_d> "
                "Ipc_control(STOPCALLBACK) status: 0x%x [%d]", (IArg)status,
                (IArg)status);
    }
    else {
        Log_print2(Diags_USER2, "[+2] Processor_delete_d> Not calling "
                "Ipc_control(STOPCALLBACK) because startCallBackStatus =  "
                "0x%x [%d]", (IArg)proc->startCallBackStatus,
                (IArg)proc->startCallBackStatus);
    }

    if (proc->useExtLoader == FALSE) {
        /* We unload the slave processor */
        Log_print0(Diags_USER2, "[+2] Processor_delete_d> Stopping DSP...");

        status = ProcMgr_stop(proc->procMgrH);
        if (status < 0) {
            Log_print1(Diags_USER6, "[+6] Processor_delete_d> "
                    "Stopping DSP FAILED, status=0x%x", (IArg)status);
        }

        if (proc->fileId != 0xffffffff) {
            Log_print0(Diags_USER2, "[+2] Processor_delete_d> "
                    "Unloading DSP...");
            status = ProcMgr_unload(proc->procMgrH, proc->fileId);
            if (status < 0) {
                Log_print1(Diags_USER6, "[+6] Processor_delete_d> "
                        "Unloading DSP FAILED, status=0x%x", (IArg)status);
            }
        }

        /* Unmap slave memory */
        if (!mapByFile(proc->procMgrH, proc->memMapName, proc->cpuId, FALSE)) {
            Log_print0(Diags_USER6, "Processor_delete_d> mapByFile() failed!");
        }

        /* Detach from the processor */
        Log_print0(Diags_USER1, "[+1] Processor_delete_d> "
                "calling ProcMgr_detach()...");

        status = ProcMgr_detach(proc->procMgrH);
        if (status < 0) {
            Log_print1(Diags_USER6, "[+6] Processor_delete_d> "
                    "Detaching from DSP FAILED, status=0x%x", (IArg)status);
        }
    } // proc->useExtLoader == FALSE

    Log_print0(Diags_USER1, "[+1] Processor_delete_d> "
            "calling ProcMgr_close()...");

    status = ProcMgr_close(&proc->procMgrH);
    if (status < 0) {
        Log_print1(Diags_USER6, "[+6] Processor_delete_d> "
                "Closing ProcMgr FAILED, status=0x%x", (IArg)status);
    }

procDelete_return:

    Log_print0(Diags_EXIT, "[+X] Processor_delete_d> return");
}