亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mfcsfr.c

?? 6410BSP3
?? C
字號:
//
// Copyright (c) Samsung Electronics. Co. LTD.  All rights reserved.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

*/
//

#include "MfcSfr.h"
#include "MfcMemory.h"
#include "LogMsg.h"
#include "MfcConfig.h"
#include "Prism_S.h"
#include "MfcMutex.h"
#include "MfcIntrNotification.h"


static volatile S3C6410_MFC_SFR   *vir_pMFC_SFR        = NULL;
static volatile unsigned int      *vir_pSW_RESET    = NULL;

static unsigned int                phyMFC_SFR        = 0;
static unsigned int                phySW_RESET        = 0;


#define SAVE_START_ADDR 0x100
#define SAVE_END_ADDR    0x200
static DWORD g_SleepData[SAVE_END_ADDR-SAVE_START_ADDR];
#define MFC_READ_REG( ADDR ) (DWORD)*(volatile DWORD *)(ADDR)
#define MFC_WRITE_REG( ADDR, DATA ) *(volatile DWORD *)(ADDR) = DATA



static int WaitForReady(void)
{
    int   i;

#ifdef _WIN32_WCE
    for (i=0; i<15; i++) {
        if (vir_pMFC_SFR->BUSY_FLAG == 0) {
            return TRUE;
        }
        Sleep(2);
    }
#else
    for (i=0; i<1000; i++) {
        if (vir_pMFC_SFR->BUSY_FLAG == 0) {
            return TRUE;
        }
        Sleep(100);    // 1/1000 second
    }
#endif

    LOG_MSG(LOG_TRACE, "WaitForReady", "Timeout in waiting for the Bit Processor available.\r\n");

    return FALSE;
}


int MFC_Sleep()
{
    DWORD i, index = 0;
    DWORD dwMfcBase;

    // 1. Wait until finish executing command.
    if (WaitForReady() == FALSE)
    {
            LOG_MSG(LOG_ERROR, "LOG_ERROR", "MFC_Sleep, BitProcessor is busy before issuing the command.\n");
            return 0;
    }

    // 2. Issue Sleep Command.
    vir_pMFC_SFR->BUSY_FLAG = 0x01;
    vir_pMFC_SFR->RUN_CMD   = SLEEP;

    // 3. Sleep
    WaitForReady();

    // 4. Backup the SFR values.
    dwMfcBase = (DWORD)vir_pMFC_SFR;
    for( i=SAVE_START_ADDR; i<= SAVE_END_ADDR; i+=4 )
    {
        g_SleepData[index] = MFC_READ_REG( dwMfcBase + i );
        index++;
    }    

    return 1;
}

int MFC_Wakeup()
{
    DWORD i, index = 0, dwMfcBase;

    MfcFirmwareIntoCodeDownReg();    

    // Restore the SFR values/
    dwMfcBase = (DWORD)vir_pMFC_SFR;
    for( i=SAVE_START_ADDR; i<= SAVE_END_ADDR; i+=4 )
    {
        MFC_WRITE_REG( ( dwMfcBase + i ), g_SleepData[index] );
        index++;
    }

    // Bit processor gets started.
    vir_pMFC_SFR->BUSY_FLAG = 0x01; 
    vir_pMFC_SFR->CODE_RUN  = 0x01;

    WaitForReady();

    // Bit processor wakes up.
    vir_pMFC_SFR->BUSY_FLAG = 0x01;
    vir_pMFC_SFR->RUN_CMD   = WAKEUP;

    WaitForReady();

    return 1;
}


static char *GetCmdString(MFC_COMMAND mfc_cmd)
{
    switch (mfc_cmd) {
    case SEQ_INIT:
        return "SEQ_INIT";

    case SEQ_END:
        return "SEQ_END";

    case PIC_RUN:
        return "PIC_RUN";

    case SET_FRAME_BUF:
        return "SET_FRAME_BUF";

    case ENC_HEADER:
        return "ENC_HEADER";

    case ENC_PARA_SET:
        return "ENC_PARA_SET";

    case DEC_PARA_SET:
        return "DEC_PARA_SET";

    case GET_FW_VER:
        return "GET_FW_VER";

    }

    return "UNDEF CMD";
}

int GetFirmwareVersion(void)
{
    unsigned int prd_no, ver_no;

    WaitForReady();

    vir_pMFC_SFR->RUN_CMD     = GET_FW_VER;

    LOG_MSG(LOG_TRACE, "GetFirmwareVersion ", "GET_FW_VER command was issued.\r\n");

    WaitForReady();

    prd_no = vir_pMFC_SFR->param.dec_seq_init.RET_SEQ_SUCCESS >> 16;
    ver_no = (vir_pMFC_SFR->param.dec_seq_init.RET_SEQ_SUCCESS & 0x00FFFF);

    LOG_MSG(LOG_TRACE, "GetFirmwareVersion", "GET_FW_VER => 0x%X, 0x%X\n", prd_no, ver_no);
    LOG_MSG(LOG_TRACE, "BUSY_FLAG", "BUSY_FLAG => %d\n", vir_pMFC_SFR->BUSY_FLAG);

    return vir_pMFC_SFR->param.dec_seq_init.RET_SEQ_SUCCESS;
}


BOOL MfcIssueCmd(int inst_no, MFC_CODECMODE codec_mode, MFC_COMMAND mfc_cmd)
{
    unsigned int intr_reason;

    vir_pMFC_SFR->RUN_INDEX     = inst_no;

    if (codec_mode == H263_DEC) {
        vir_pMFC_SFR->RUN_COD_STD    = MP4_DEC;
    } else if (codec_mode == H263_ENC) {
        vir_pMFC_SFR->RUN_COD_STD    = MP4_ENC;
    } else {
        vir_pMFC_SFR->RUN_COD_STD   = codec_mode;
    }
        
    switch (mfc_cmd) 
    {
    case PIC_RUN:
    case SEQ_INIT:
    case SEQ_END:
//    case ENC_HEADER:

        vir_pMFC_SFR->RUN_CMD       = mfc_cmd;

        intr_reason = WaitInterruptNotification();
        if (intr_reason == MFC_INTR_REASON_INTRNOTI_TIMEOUT) {
            LOG_MSG(LOG_ERROR, "LOG_ERROR", "MfcIssueCmd CMD = %s, WaitInterruptNotification returns TIMEOUT.\n", GetCmdString(mfc_cmd));
            return FALSE;
        }
        if (intr_reason & MFC_INTR_REASON_BUFFER_EMPTY) {
            LOG_MSG(LOG_ERROR, "LOG_ERROR", "MfcIssueCmd CMD = %s, BUFFER EMPTY interrupt was raised.\n", GetCmdString(mfc_cmd));
            return FALSE;
        }
        break;


    default:
        if (WaitForReady() == FALSE) {
            LOG_MSG(LOG_ERROR, "LOG_ERROR", "MfcIssueCmd CMD = %s, BitProcessor is busy before issuing the command.\n", GetCmdString(mfc_cmd));
            return FALSE;
        }

        vir_pMFC_SFR->RUN_CMD       = mfc_cmd;
    
        WaitForReady();
            
    } 

    return TRUE;
}


BOOL MfcSfrMemMapping(void)
{
    BOOL    ret = FALSE;

    // virtual address mapping
    vir_pMFC_SFR = (volatile S3C6410_MFC_SFR *)Phy2Vir_AddrMapping(S3C6410_BASEADDR_MFC_SFR, S3C6410_MFC_SFR_SIZE, FALSE);
    if (vir_pMFC_SFR == NULL)
    {
        LOG_MSG(LOG_ERROR, "MfcSfrMapping", "For MFC_SFR: Address Mapping failed!\r\n");
        return ret;
    }

    vir_pSW_RESET = (unsigned int *) ((int)vir_pMFC_SFR  +  S3C6410_MFC_SFR_SW_RESET_ADDR);

    // Physical address mapping
    phyMFC_SFR    = S3C6410_BASEADDR_MFC_SFR;
    phySW_RESET    = S3C6410_BASEADDR_MFC_SFR + S3C6410_MFC_SFR_SW_RESET_ADDR;

    ret = TRUE;

    return ret;
}

volatile S3C6410_MFC_SFR *GetMfcSfrVirAddr(void)
{
    volatile S3C6410_MFC_SFR    *mfc_sfr;

    mfc_sfr = vir_pMFC_SFR;

    return mfc_sfr;
}

void *MfcGetCmdParamRegion(void)
{
    return (void *) &(vir_pMFC_SFR->param);
}

// Perform the SW_RESET
void MfcReset(void)
{
    *vir_pSW_RESET = 0x00;
    *vir_pSW_RESET = 0x01;
    vir_pMFC_SFR->INT_ENABLE = MFC_INTR_ENABLE_RESET;    // Interrupt is enabled for PIC_RUN command and empty/full STRM_BUF status.
    vir_pMFC_SFR->INT_REASON = MFC_INTR_REASON_NULL;
    vir_pMFC_SFR->BITS_INT_CLEAR = 0x1;
}

// Clear the MFC Interrupt
// After catching the MFC Interrupt,
// it is required to call this functions for clearing the interrupt-related register.
void MfcClearIntr(void)
{
    vir_pMFC_SFR->BITS_INT_CLEAR = 0x1;
    vir_pMFC_SFR->INT_REASON     = MFC_INTR_REASON_NULL;
}

// Check INT_REASON register of MFC (the interrupt reason register)
unsigned int MfcIntrReason(void)
{
    return vir_pMFC_SFR->INT_REASON;
}

// Set the MFC's SFR of DEC_FUNC_CTRL to 1.
// It means that the data will not be added more to the STRM_BUF.
// It is required in RING_BUF mode (VC-1 DEC).
void MfcSetEos(int buffer_mode)
{
    // buffer_mode == 0 : Ring Buffer mode
    if (buffer_mode == 0)
        vir_pMFC_SFR->DEC_FUNC_CTRL = 1;    // 1: Whole stream is in buffer.
    // buffer_mode == 1 : Line Buffer mode
    else
        vir_pMFC_SFR->DEC_FUNC_CTRL = 1<<1;    // 1: Whole stream is in buffer.
}


void MfcFirmwareIntoCodeDownReg(void)
{
    unsigned int  i;
    unsigned int  data;


    ///////////////////////////////////////////////////////
    // Download the Boot code into MFC's internal memory //
    ///////////////////////////////////////////////////////
    for (i=0; i<512; i++)
    {
        data = bit_code[i];

        vir_pMFC_SFR->CODE_DN_LOAD = ((i<<16) | data); // i: 13bit addr
    }

}

void MfcStartBitProcessor(void)
{
    vir_pMFC_SFR->CODE_RUN = 0x01;
}


void MfcStopBitProcessor(void)
{
    vir_pMFC_SFR->CODE_RUN = 0x00;
}

void MfcConfigSFR_BITPROC_BUF(void)
{
    // CODE BUFFER ADDRESS (BASE + 0x100)
    //   : Located from the Base address of the BIT PROCESSOR'S Firmware code segment
    vir_pMFC_SFR->CODE_BUF_ADDR = S3C6410_BASEADDR_MFC_BITPROC_BUF;


    // WORKING BUFFER ADDRESS (BASE + 0x104)
    //   : Located from the next to the BIT PROCESSOR'S Firmware code segment
    vir_pMFC_SFR->WORK_BUF_ADDR = vir_pMFC_SFR->CODE_BUF_ADDR + MFC_CODE_BUF_SIZE;


    // PARAMETER BUFFER ADDRESS (BASE + 0x108)
    //   : Located from the next to the WORKING BUFFER
    vir_pMFC_SFR->PARA_BUF_ADDR = vir_pMFC_SFR->WORK_BUF_ADDR + MFC_WORK_BUF_SIZE;
}

void MfcConfigSFR_CTRL_OPTS(void)
{
    unsigned int  uRegData;

    // BIT STREAM BUFFER CONTROL (BASE + 0x10C)
    uRegData = vir_pMFC_SFR->STRM_BUF_CTRL;
    vir_pMFC_SFR->STRM_BUF_CTRL = (uRegData & ~(0x03)) | BUF_STATUS_FULL_EMPTY_CHECK_BIT | STREAM_ENDIAN_LITTLE;


    // FRAME MEMORY CONTROL  (BASE + 0x110)
    vir_pMFC_SFR->FRME_BUF_CTRL = FRAME_MEM_ENDIAN_LITTLE;


    // DECODER FUNCTION CONTROL (BASE + 0x114)
    vir_pMFC_SFR->DEC_FUNC_CTRL = 0;    // 0: Whole stream is not in buffer.

    // WORK BUFFER CONTROL (BASE + 0x11C)
    vir_pMFC_SFR->WORK_BUF_CTRL = 0;    // 0: Work buffer control is disabled.
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区果冻传媒| 麻豆精品视频在线观看视频| 久久综合九色综合欧美98| 欧美疯狂性受xxxxx喷水图片| 欧洲精品一区二区三区在线观看| 99久久精品免费| 色哟哟亚洲精品| 91福利国产精品| 91精品国产aⅴ一区二区| 91精品国产91久久综合桃花 | 久久综合久久99| 日本一区二区高清| 亚洲女人的天堂| 亚洲一区免费视频| 美女诱惑一区二区| 粉嫩久久99精品久久久久久夜| av中文字幕不卡| 欧美乱妇一区二区三区不卡视频| 欧美精品日韩精品| 久久男人中文字幕资源站| 欧美国产综合一区二区| 亚洲一区二区三区三| 久久狠狠亚洲综合| 99re这里只有精品首页| 91精品综合久久久久久| 国产欧美日产一区| 亚洲成人午夜影院| 国产呦萝稀缺另类资源| 色婷婷久久久亚洲一区二区三区| 3751色影院一区二区三区| 久久综合九色综合久久久精品综合| 亚洲欧洲av在线| 麻豆精品蜜桃视频网站| 成人av在线资源网站| 欧美人牲a欧美精品| 国产欧美日韩一区二区三区在线观看| 一区二区三区国产| 国产又黄又大久久| 欧美精品乱人伦久久久久久| 国产精品丝袜一区| 奇米精品一区二区三区四区| 99久久精品国产精品久久| 欧美日韩国产综合视频在线观看 | 色综合天天视频在线观看| 欧美日韩国产免费| 1区2区3区欧美| 国产精品一区免费在线观看| 欧美乱妇15p| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 美女免费视频一区二区| 欧洲另类一二三四区| 中文av一区二区| 国产美女在线精品| 欧美精品久久99久久在免费线| 国产精品久久福利| 久久不见久久见免费视频1| 欧美日韩国产乱码电影| 洋洋av久久久久久久一区| 成人三级伦理片| 国产三级精品三级| 国产在线播放一区二区三区| 欧美大片日本大片免费观看| 天堂蜜桃一区二区三区| 欧美亚州韩日在线看免费版国语版| 国产精品国产三级国产有无不卡 | 一区二区三区在线观看动漫| 成a人片国产精品| 亚洲国产成人在线| 粉嫩一区二区三区在线看| 久久久91精品国产一区二区精品| 韩国成人福利片在线播放| 日韩欧美高清一区| 久久国产精品露脸对白| 欧美大度的电影原声| 美洲天堂一区二卡三卡四卡视频 | 久草热8精品视频在线观看| 欧美人妖巨大在线| 日日夜夜精品视频免费| 日韩欧美高清一区| 国产在线播精品第三| 久久久精品黄色| 不卡电影免费在线播放一区| 亚洲欧洲精品成人久久奇米网| 99re这里只有精品首页| 亚洲乱码精品一二三四区日韩在线| 91同城在线观看| 亚洲已满18点击进入久久| 精品视频一区二区不卡| 日韩高清在线不卡| 久久奇米777| www.亚洲在线| 亚洲成在人线在线播放| 91精品国产综合久久精品麻豆| 青娱乐精品视频在线| 欧美成人乱码一区二区三区| 丁香婷婷综合色啪| 夜夜爽夜夜爽精品视频| 日韩西西人体444www| 国产福利91精品| 亚洲免费观看高清完整版在线观看熊| 在线免费观看一区| 免费欧美在线视频| 国产精品无遮挡| 欧美日韩久久一区| 国产福利不卡视频| 亚洲电影在线免费观看| 久久综合久久鬼色中文字| 色婷婷综合久色| 精品一区二区av| 亚洲综合在线免费观看| 欧美成人猛片aaaaaaa| 97久久精品人人爽人人爽蜜臀| 亚洲va韩国va欧美va| 国产视频一区二区三区在线观看| 色综合久久66| 国产老妇另类xxxxx| 亚洲一区二区视频在线观看| 久久综合狠狠综合久久激情| 欧美私人免费视频| 成人免费观看男女羞羞视频| 免费欧美日韩国产三级电影| 中文字幕亚洲一区二区av在线| 欧美变态凌虐bdsm| 欧美丝袜丝交足nylons图片| 成人高清免费在线播放| 美女诱惑一区二区| 亚洲国产一区视频| 自拍偷在线精品自拍偷无码专区| 26uuu国产日韩综合| 欧美色综合网站| 92国产精品观看| 国产麻豆视频一区| 麻豆专区一区二区三区四区五区| 亚洲香肠在线观看| 亚洲免费在线视频一区 二区| 日本一区二区三级电影在线观看| 日韩一区二区三区四区五区六区| 欧美三级中文字幕| 色域天天综合网| 91亚洲精品乱码久久久久久蜜桃| 国产99久久久精品| 国产一区美女在线| 久久精品二区亚洲w码| 免费在线观看成人| 日本成人超碰在线观看| 亚洲3atv精品一区二区三区| 亚洲五码中文字幕| 亚洲中国最大av网站| 亚洲精品亚洲人成人网在线播放| 中文字幕佐山爱一区二区免费| 国产欧美中文在线| 国产精品美女视频| 国产精品久久国产精麻豆99网站 | 91精品黄色片免费大全| 日本韩国精品一区二区在线观看| 99精品视频中文字幕| 色综合久久久久| 在线视频欧美区| 欧美日韩国产a| 91麻豆精品91久久久久久清纯| 91精品国产91久久综合桃花| 欧美一二三四在线| 久久一日本道色综合| 国产日韩欧美不卡在线| 中文字幕不卡的av| 亚洲女子a中天字幕| 亚洲国产精品久久人人爱| 亚洲123区在线观看| 久久精工是国产品牌吗| 国产v日产∨综合v精品视频| av电影天堂一区二区在线观看| 一本久道久久综合中文字幕| 欧美日本在线一区| xfplay精品久久| 亚洲欧美成aⅴ人在线观看| 首页欧美精品中文字幕| 国产一区二区三区高清播放| 91在线观看高清| 欧美日韩中文一区| 久久久久88色偷偷免费| 一区二区不卡在线播放| 欧美a一区二区| 91丝袜美腿高跟国产极品老师 | 国产亚洲精品7777| 成人欧美一区二区三区小说 | 日韩精品一区第一页| 国产剧情一区二区| 色94色欧美sute亚洲线路二| 精品久久国产字幕高潮| 亚洲女同一区二区| 老司机午夜精品| 在线视频综合导航| 久久九九久久九九| 午夜电影久久久| 成人av集中营| 久久久久久久久久久久久久久99 | 国产99久久久国产精品潘金| 欧美日韩一区二区三区在线看 | 欧美人牲a欧美精品| 日本一区二区三区电影|