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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? qmcsw.c

?? 這是單板上DPRAM的驅(qū)動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include <psos.h>
#include "board.h"
#include "bspfuncs.h"
#include "sdev.h"
#include "hdlc.h"
#include "link.h"
#include "qmc.h"
#include "qmcsw.h"

#define QMCSW_BSP_LOOP_SEND_EV   1
#define QMCSW_BSP_LOOP_RECV_EV   2

static void QmcIsr(void);
static void QmcSwLimitInit(void);

static int CurSubChan;
static LinkStruct TxLink[32], FreeLink;
static QmcSwCfgStruct  *pGCfg;
static DataBufStruct   *gDataBuf[32];
static UCHAR   MapTable[32];

static void InitLink(void)
{
    int i;
   
    LinkInit(&FreeLink);
    for(i=0;i<pGCfg->MaxBufNum;i++)
    {  
        LinkBufStruct  *buf=(LinkBufStruct *)((ULONG)(pGCfg->UncachedBuffer)
                        +(sizeof(LinkBufStruct)-LINK_DATA_BUF_LEN
                        +pGCfg->MaxBufLen)*i);
        LinkAppendBuf(&FreeLink, buf);
    }
            
    for(i=0;i<32;i++)
        LinkInit(&TxLink[i]);
}

static void InitBD(void)
{
    int i,j;
    LinkBufStruct *pData;

    /* init the rxbd and txbd */
    for(i=0;i<pGCfg->MaxSubChanNum;i++)
    {
        for(j=0;j<pGCfg->MaxSendBD;j++)
        {
            pData=LinkGetBuf(&FreeLink);
            if(pData==NULL) continue; 
            (gDataBuf[i]->pBaseSendBD)[j].length=0;
            (gDataBuf[i]->pBaseSendBD)[j].address=pData->Data;
            (gDataBuf[i]->pBaseSendBD)[j].status=BD_INTR|BD_LAST|HDLC_TX_CRC;
           
        }
        if(j>0)(gDataBuf[i]->pBaseSendBD)[j-1].status|=BD_WRAP;
        for(j=0;j<pGCfg->MaxRecvBD;j++)
        {
            pData=LinkGetBuf(&FreeLink);
            if(pData==NULL) continue;
            (gDataBuf[i]->pBaseRecvBD)[j].length=0;
            (gDataBuf[i]->pBaseRecvBD)[j].address=pData->Data;
            (gDataBuf[i]->pBaseRecvBD)[j].status=BD_INTR|BD_EMPTY;
        }
        if(j>0) (gDataBuf[i]->pBaseRecvBD)[j-1].status|=BD_WRAP;
    }
}/*end of init BD */

static void StopTransmit(UCHAR Channel)
{
	CPM_CMD(((0x1F&Channel)<<2)|QMC_STOP_TX|QMC_RESERVE);
}

static void ReStartTransmit(UCHAR Channel)
{
    QmcSubChanParamStruct *ch=(QmcSubChanParamStruct*)((GetIMMR()&IO_MAP_MASK)
                               +0x2000+pGCfg->SubChParamOffset);
    QmcGlobalParamStruct *gmp=(QmcGlobalParamStruct *)((GetIMMR()&IO_MAP_MASK)
                               +0x3C00+0x100*pGCfg->ch);
    Channel&=0x1f;
    if(ch[Channel].chamr.ent==0) /*do if channel is deactive*/
    {
        ch[Channel].tstate=0x30000000;
        ch[Channel].zistate=0x100;
        gmp->tsatt[Channel].v=1;
        ch[Channel].chamr.ent=1;
    }
    ch[Channel].chamr.pol=1;
}

static void StopReceive(UCHAR Channel)
{
	CPM_CMD(((0x1F&Channel)<<2)|QMC_STOP_RX|QMC_RESERVE);
}

static void ReStartReceive(UCHAR Channel)
{
    QmcSubChanParamStruct *ch=(QmcSubChanParamStruct*)((GetIMMR()&IO_MAP_MASK)
                               +0x2000+pGCfg->SubChParamOffset);
    Channel&=0x1f;
    ch[Channel].zdstate=0x80;
    ch[Channel].rstate= 0x31000000;
}

static int QmcSwRead(void *pDataBuf,void *pBuf, int MaxLen)         
{   
    int ret;
    int imax; 
    
    if(pGCfg->FatalFlag==1)
        return SDE_QMCSW_FATAL;
    pGCfg->ReInUsing|=(1<<(CurSubChan-pGCfg->SubChParamOffset/64));    
    imax=splx(MAX_ILEV);
     _sync_io();                   
    ret=BDRead(gDataBuf[CurSubChan&0x1f],pBuf,MaxLen);
    splx(imax); 
    pGCfg->ReInUsing&=~(1<<(CurSubChan-pGCfg->SubChParamOffset/64));
    if(ret>2)return ret-2;    /* sub 2 bytes of CRC */
    else if(ret>0)return SDE_INVALID_PACKET;  
    else return ret;
}

static int QmcSwWrite(void *pDataBuf,void *pBuf, int MaxLen)         
{   
    int ret;
    int imax; 
    QmcSubChanParamStruct *ch=(QmcSubChanParamStruct*)((GetIMMR()&IO_MAP_MASK)
                               +0x2000+pGCfg->SubChParamOffset);
    if(pGCfg->FatalFlag==1) return SDE_QMCSW_FATAL;
    pGCfg->WrInUsing|=(1<<(CurSubChan-pGCfg->SubChParamOffset/64));
    imax=splx(MAX_ILEV);
    _sync_io(); 
    ret=BDWrite(gDataBuf[CurSubChan&0x1f],pBuf,MaxLen);
    splx(imax); 
    pGCfg->WrInUsing&=~(1<<(CurSubChan-pGCfg->SubChParamOffset/64));
    ch[CurSubChan&0x1f].chamr.pol=1;   
    return ret; 
}

static void InitScc(void)
{
    PDA  *pda=(PDA *)(GetIMMR() & IO_MAP_MASK);

    pda->Scc_regs[pGCfg->ch].scc_gsmrb=0x780;
    pda->Scc_regs[pGCfg->ch].scc_gsmra|=0x0a;  /* enable QMC*/
}

/* Init Global MutiChannel Params*/
static void InitGlobPrams(void)
{
    int i;
    QmcGlobalParamStruct *gmp=(QmcGlobalParamStruct *)((GetIMMR()&IO_MAP_MASK)
                              +0x3C00+0x100*pGCfg->ch);

    gmp->mcbase=(ULONG)pGCfg->BDTable;  /* pointer to the start of BD tab*/
    gmp->mrblr=pGCfg->MaxBufLen-8;        /* set the MAX buffer length*/
    gmp->intbase=(ULONG)pGCfg->IntTable;/* pointer to the start of int tab*/
    gmp->grfthr=1;                      /* 1 receive frame to interrupt*/
    gmp->grfcnt=1;                      /* 1 receive frame to interrupt*/
    gmp->cmask32=0x0debb20e3;           /* 32 bit crc constant */
    gmp->cmask16=0x0f0b8;               /* 16 bit crc constant  */
    gmp->intptr=gmp->intbase;
    for (i=0;i<pGCfg->MaxSubChanNum;i++)/* Init receive time slot table*/
    {
        gmp->tsatr[i].w=0;              /* Init one slot to one channel */
        gmp->tsatr[i].chp=i+pGCfg->SubChParamOffset; 
        gmp->tsatr[i].mask0_1 =0x3;     /* No subchannel */
        gmp->tsatr[i].mask2_7 =0x3f;
        gmp->tsatr[i].v=1;
    }
    gmp->tsatr[i-1].w=1;
    for (i=0;i<pGCfg->MaxSubChanNum;i++)/* init transmit time slot table */
    {
        gmp->tsatt[i].w=0;
        gmp->tsatt[i].chp=i+pGCfg->SubChParamOffset;
        gmp->tsatt[i].mask0_1 =0x3;
        gmp->tsatt[i].mask2_7 =0x3f;
        gmp->tsatt[i].v=1;
    }
    gmp->tsatt[i-1].w=1;
    gmp->rx_s_ptr=0x3C00+pGCfg->ch*0x100+0x20;  /* init pointer to tsatr */
    gmp->tx_s_ptr=0x3C00+pGCfg->ch*0x100+0x60;
    gmp->rxptr=gmp->rx_s_ptr;
    gmp->txptr=gmp->tx_s_ptr;
    gmp->qmcstate=0x8000;
} /* End of InitGlobPrams */

/* init channel specific params*/
static void InitChPrams(void)
{
    int i;
    QmcSubChanParamStruct *ch;

    ch=(QmcSubChanParamStruct*)((GetIMMR() & IO_MAP_MASK)
                                +0x2000+pGCfg->SubChParamOffset);
    for(i=0;i<pGCfg->MaxSubChanNum;i++)
    {
        DataBufStruct *pData=gDataBuf[i];
/*      memset(pData, 0, sizeof(DataBufStruct)); */
        pData->CurSendBD=0;
        pData->CurRecvBD=0;
        pData->MaxRecvBD=pGCfg->MaxRecvBD;
        pData->MaxSendBD=pGCfg->MaxSendBD;
        pData->MaxBufLen=pGCfg->MaxBufLen;
        pData->RecvErrMask=(HDLC_DPLL_ERR|HDLC_GREATER_LEN|HDLC_NOT_ALIGNED
                     |HDLC_ABORT_SEQ|HDLC_RX_CRC|HDLC_OVERRUN|HDLC_CD_LOST);
        pData->SendErrMask=(HDLC_UNDERRUN|HDLC_CTS_LOST);

        ch[i].tbase=i*(pGCfg->MaxSendBD+pGCfg->MaxRecvBD)*sizeof(BuffDescType);
        pData->pBaseSendBD=(BuffDescType *)(pGCfg->BDTable+ch[i].tbase);

        ch[i].rbase=ch[i].tbase+pGCfg->MaxSendBD*sizeof(BuffDescType);
        pData->pBaseRecvBD=(BuffDescType *)(pGCfg->BDTable+ch[i].rbase);

        ch[i].tstate=0x30000000;
        ch[i].rstate=0x31000000;
        ch[i].zistate=0x100;          /* HDLC mode */
        ch[i].zdstate=0x80;
        ch[i].intmask=0x0e;           /* enable RXF TXB and BSY interrupt*/
        ch[i].mflr=pGCfg->MaxBufLen-4;    /* maximum frame length */
        ch[i].tbptr=ch[i].tbase;
        ch[i].rbptr=ch[i].rbase;
        ch[i].chamr.mode=1;           /* HDLC mode */
        ch[i].chamr.idlm=0;           /* disable idle frame  */
        ch[i].chamr.ent=1;            /* enable channel xmit*/
        ch[i].chamr.crc=0;            /* 16 bit crc */
        ch[i].chamr.nof=0;            /* 1 flags  */
        ch[i].chamr.pol=0;            /* we enable polling later */
    }
} /* End of InitChPrams */
                  

/* Interrupt Init */
static void InitInterrupt(ULONG Vector, void *Handler, void * Arg)
{
    int i;
    PDA  *pda=(PDA *)(GetIMMR() & IO_MAP_MASK);

    for(i=0;i<pGCfg->MaxIntEty;i++)
       (pGCfg->IntTable)[i].Word16=0;
    (pGCfg->IntTable)[i-1].Bit.w=1;
    pGCfg->IntTablePtr=pGCfg->IntTable;  /* init the soft service pointer */
    pda->Scc_regs[pGCfg->ch].scc_scce=0xffff; /*clear the event register*/
    pda->Scc_regs[pGCfg->ch].scc_sccm=0x0f;
    SPLX(pda->cpmi_cimr|=(EN_SCC1 >> pGCfg->ch);)
    SPLX(pda->cpmi_cipr|=(CLR_SCC1 >> pGCfg->ch);)
    SPLX(pda->cpmi_cisr|=(CLR_SCC1 >> pGCfg->ch);)
    SPLX(CpmIsrAddHandler(Vector,Handler,Arg);)
    SPLX(pda->cpmi_cicr|=CPM_EN_INTS|0x1b0000;)
}/* end of init interrupt */

/* Qmc global init */
static void QmcSwGlobalInit(void)
{
    int i;
    PDA  *pda=(PDA *)(GetIMMR() & IO_MAP_MASK);
  
    for(i=0;i<32;i++)
      MapTable[i]=QMCSW_SUBCHAN_INVALID;
    
    /* we asume the last channel is for loop test*/  
    MapTable[pGCfg->MaxSubChanNum-1]=QMCSW_SUBCHAN_OPERATE;
  
    pGCfg->WrInUsing=0;
    pGCfg->ReInUsing=0;
   
    pda->Scc_regs[pGCfg->ch].scc_gsmra &= 0xffffffcf; /* Disable Rx,Tx */    
    pda->si_sicr &= (~( (0x000000ff)<<(pGCfg->ch*8)));/* Connect to TSA*/    
    pda->si_sicr |= ( (0x00000040)<<(pGCfg->ch*8) );
    InitScc();            /* Init general mode  register*/
    InitGlobPrams();      /* init Global MutiChannel Params*/
    InitChPrams();        /* init channel specific params*/
    InitLink();           /* init recyclebin or DataBuffer */
    InitBD();
    InitInterrupt(V_SCC1-pGCfg->ch,QmcIsr,NULL); /* init interrupt */
    pda->Scc_regs[pGCfg->ch].scc_gsmra|=0x00000030;   /* Enable Rx,Tx */
/* for(i=0;i<pGCfg->MaxSubChanNum;i++)  StopReceive(i); */ /*Stop Rx */
        
}/* end of global init*/

static int QmcSwCntrl(void *pDataBuf, int cmd, void *pParam, int maxlen)
{
    PDA *pda= (PDA *)(GetIMMR() & IO_MAP_MASK);
    ChanMapStruct *mp;
    int i,ret,imask;
      
    ret=BDCntrl(gDataBuf[CurSubChan&0x1f],cmd,pParam,maxlen);
    if(ret!=SDE_UNKNOW_CMD)return ret;
    switch(cmd)
    {
        
        case SDC_REINIT:
            for(i=0;i<pGCfg->MaxSubChanNum;i++)
            {
            	StopTransmit(i);
            	StopReceive(i);
            } 	 
            for(i=0;i<pGCfg->MaxSubChanNum;i++) /* clear the databuf struct */
               memset(gDataBuf[i],0,sizeof(DataBufStruct)); 
            QmcSwGlobalInit();     
            break;

        case SDC_SEL_SUBCHAN:
            if(maxlen!=sizeof(int))return SDE_INVALID_ARG;
            if(*(int *)pParam<0 || *(int *)pParam>=pGCfg->MaxSubChanNum)
                return SDE_INVALID_ARG;
            CurSubChan=*(int *)pParam;
            break;
        
        case SDC_SET_MAP_TABLE:
            if(maxlen!=sizeof(ChanMapStruct))return SDE_INVALID_ARG;   
            mp=(ChanMapStruct *)pParam;
            if( mp->ChanIn<0 || mp->ChanIn>=pGCfg->MaxSubChanNum )
                return SDE_INVALID_ARG;
            if((mp->ChanOut<0 || mp->ChanOut>=pGCfg->MaxSubChanNum) 
               &&(mp->ChanOut!=QMCSW_SUBCHAN_OPERATE)
               &&(mp->ChanOut!=QMCSW_SUBCHAN_INVALID))
                return SDE_INVALID_ARG;
            SPLX(MapTable[mp->ChanIn]=mp->ChanOut; )
       /*     ReStartReceive(mp->ChanIn); */
            break;  
        
        case SDC_SET_LOOPBACK_MODE:         
            for(i=0;i<pGCfg->MaxSubChanNum;i++)
            {
                StopReceive(i);
                StopTransmit(i);    
            }
            imask = splx(MAX_ILEV);/* mask interrupt*/

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人网页在线观看| 亚洲综合色噜噜狠狠| 日本视频一区二区三区| 91色porny在线视频| 国产网红主播福利一区二区| 麻豆91精品91久久久的内涵| 欧美日韩国产大片| 午夜免费欧美电影| 欧美日韩国产在线观看| 亚洲一区免费视频| 欧美日韩精品一区二区天天拍小说| 中文字幕一区av| 91视频精品在这里| 亚洲免费视频中文字幕| 在线观看免费一区| 亚洲444eee在线观看| 91.com视频| 国产福利91精品| 中文字幕在线一区| 色丁香久综合在线久综合在线观看| 亚洲色图一区二区| 欧美日精品一区视频| 日韩中文字幕区一区有砖一区| 91麻豆精品国产91久久久资源速度| 天堂蜜桃一区二区三区| 欧美r级电影在线观看| 成人一级片在线观看| 亚洲影视在线播放| 久久久久高清精品| 一本一道综合狠狠老| 日本女优在线视频一区二区| 久久久精品人体av艺术| 色综合一个色综合亚洲| 老司机免费视频一区二区| 亚洲一区二区三区美女| 欧美精品电影在线播放| 国产传媒久久文化传媒| 亚洲图片欧美一区| 国产欧美日本一区视频| 欧美日韩在线免费视频| 国产成人综合网站| 丝袜亚洲另类欧美| 中文字幕在线播放不卡一区| 日韩免费高清av| 欧美少妇一区二区| 99视频在线精品| 国产一区二区在线影院| 亚洲一区二区三区影院| 国产日韩欧美精品一区| 精品国产乱码91久久久久久网站| 色婷婷精品大在线视频 | 国产日韩欧美制服另类| 欧美日韩视频一区二区| 99久久精品国产麻豆演员表| 国产一区二区在线视频| 日本女优在线视频一区二区| 亚洲国产精品久久人人爱| 亚洲婷婷在线视频| 亚洲国产精品精华液2区45| 26uuu色噜噜精品一区| 欧美日韩一区二区电影| 一本一本大道香蕉久在线精品 | 国产偷国产偷亚洲高清人白洁| 欧美高清一级片在线| 制服.丝袜.亚洲.中文.综合| 欧美日韩在线播放一区| 欧美日韩电影一区| 欧美亚洲日本国产| 欧美日韩一区二区三区在线| 在线观看日韩一区| 欧美日韩激情一区二区三区| 欧美绝品在线观看成人午夜影视| 欧美性猛交xxxx黑人交| 欧美精品乱码久久久久久按摩| 欧美精品免费视频| 欧美精品一区二区三区在线播放| 国产亚洲一区二区在线观看| 国产精品乱码一区二三区小蝌蚪| 1024成人网| 亚洲福利一二三区| 久久国内精品自在自线400部| 国产一区二三区好的| 色av成人天堂桃色av| 717成人午夜免费福利电影| 久久亚洲春色中文字幕久久久| 国产精品美女久久久久久久久久久 | 亚洲欧洲综合另类| 麻豆精品视频在线观看免费| 粉嫩久久99精品久久久久久夜 | 亚洲日本在线a| 免费看黄色91| 99精品一区二区三区| 欧美一区二区成人| 国产精品午夜电影| 男人的天堂亚洲一区| 91亚洲精华国产精华精华液| 91麻豆精品国产91久久久久 | 久久精品国产亚洲一区二区三区 | 黑人精品欧美一区二区蜜桃| 日本乱人伦一区| 2023国产精品自拍| 亚洲va韩国va欧美va| 成人午夜视频免费看| 日韩一区二区三区高清免费看看| 日韩一区欧美一区| 国产一级精品在线| 4438x成人网最大色成网站| 亚洲国产电影在线观看| 麻豆精品在线观看| 欧美日韩国产高清一区二区| 亚洲日本免费电影| 国产精品资源在线| www久久精品| 欧美久久久影院| 亚洲一区二区三区视频在线播放 | 欧美mv日韩mv国产网站app| 日本三级韩国三级欧美三级| 欧美日韩国产另类一区| 亚洲日本成人在线观看| 色悠悠久久综合| 亚洲欧美日本韩国| 99re这里都是精品| 亚洲欧美国产毛片在线| 97久久精品人人做人人爽| 国产精品久久久久桃色tv| 成人av在线网站| 亚洲日本在线天堂| 精品视频1区2区3区| 亚洲成人久久影院| 欧美一区二区成人| 国产成人免费视| 亚洲亚洲精品在线观看| 欧美久久久久久蜜桃| 人人狠狠综合久久亚洲| 日韩午夜电影在线观看| 免费精品99久久国产综合精品| 精品国精品国产尤物美女| 国产一二精品视频| 亚洲乱码国产乱码精品精可以看| 在线亚洲免费视频| 婷婷综合五月天| 久久久一区二区三区| 一本色道综合亚洲| 美女诱惑一区二区| 中文字幕巨乱亚洲| 欧美日韩在线播| 国产精品77777竹菊影视小说| 国产精品久99| 91精品蜜臀在线一区尤物| 国产成人免费xxxxxxxx| 亚洲精品视频在线观看免费| 精品久久久久久综合日本欧美| 成人99免费视频| 玖玖九九国产精品| 亚洲午夜视频在线观看| 久久五月婷婷丁香社区| 欧美亚洲日本国产| 99re成人精品视频| 欧美a一区二区| 亚洲成人动漫在线免费观看| 国产亚洲成年网址在线观看| 91精品在线免费观看| 99精品国产一区二区三区不卡| 久久国内精品视频| 日韩中文字幕不卡| 亚洲激情自拍视频| 中文字幕va一区二区三区| 欧美xxxxx牲另类人与| 精品视频在线免费看| 色狠狠av一区二区三区| 91在线小视频| 不卡的av电影| 成人激情综合网站| 国产一区二区影院| 国产在线麻豆精品观看| 日韩av一级片| 日韩激情中文字幕| 日韩电影在线免费观看| 亚洲成人自拍偷拍| 亚洲成人免费视| 无吗不卡中文字幕| 亚洲国产精品一区二区久久恐怖片| 亚洲精品伦理在线| 亚洲免费毛片网站| 亚洲一区二区精品视频| 一区二区三区波多野结衣在线观看 | 国产精品系列在线播放| 国产精品正在播放| 国产成人免费网站| 91美女片黄在线观看| 日本韩国欧美一区二区三区| 一本大道久久a久久精二百| 日韩亚洲欧美在线观看| 2020国产精品自拍| 中文一区二区在线观看| 亚洲欧美国产77777| 亚洲一卡二卡三卡四卡五卡| 看电视剧不卡顿的网站| 大胆亚洲人体视频| 欧美色综合网站|