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

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

?? cislib.c

?? 用于EQUATOR處理器上的FAT32文件系統(vxWorks5.5)
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* cisLib.c - PCMCIA CIS library */

/* Copyright 1984-1996 Wind River Systems, Inc. */
#include "copyright_wrs.h"

/*
modification history
--------------------
01g,17sep98,lrn  reworked DosFs 2.0 support and memory leak issues
01f,14jul98,lrn  DosFs2.0: can not delete DOS devices
01e,16jan97,hdn  added pCtrl->memBase, CIS_MAX_TUPLES.
01d,28mar96,jdi  doc: cleaned up language and format.
01c,08mar96,hdn  added more descriptions.
01b,22feb96,hdn  cleaned up
01a,10feb95,hdn  written.
*/


/*
DESCRIPTION
This library contains routines to manipulate the CIS (Configuration
Information Structure) tuples and the card configuration registers.
The library uses a memory window which is defined in `pcmciaMemwin'
to access the CIS of a PC card.
All CIS tuples in a PC card are read and stored in a linked list,
`cisTupleList'.  If there are configuration tuples, they are interpreted
and stored in another link list, `cisConifigList'.  After the CIS is read,
the PC card's enabler routine allocates resources and initializes a device
driver for the PC card.

If a PC card is inserted, the CSC (Card Status Change) interrupt handler
gets a CSC event from the PCMCIA chip and adds a cisGet() job to the
PCMCIA daemon.  The PCMCIA daemon initiates the cisGet() work.  The CIS
library reads the CIS from the PC card and makes a linked list of CIS
tuples.  It then enables the card.

If the PC card is removed, the CSC interrupt handler gets a CSC event from
the PCMCIA chip and adds a cisFree() job to the PCMCIA daemon.  The PCMCIA
daemon initiates the cisFree() work.  The CIS library frees allocated 
memory for the linked list of CIS tuples.
*/


#include "vxWorks.h"
#include "taskLib.h"
#include "sysLib.h"
#include "stdlib.h"
#include "string.h"
#include "drv/pcmcia/pcmciaLib.h"
#include "drv/pcmcia/cisLib.h"


/* defines */


/* imports */

IMPORT PCMCIA_CTRL	pcmciaCtrl;
IMPORT PCMCIA_MEMWIN	pcmciaMemwin[];
IMPORT PCCARD_ENABLER   pccardEnabler[];
IMPORT int		pccardEnablerNumEnt;


/* globals */

SEMAPHORE	cisMuteSem;


/* locals */

LOCAL u_char	powerMantissa [] = {10, 12, 13, 15, 20, 25, 30, 35,
				 40, 45, 50, 55, 60, 70, 80, 90};
LOCAL u_char	powerExponent [] = {0, 0, 0, 0, 0, 1, 10, 100};


/* forward declarations */

LOCAL STATUS	cisTupleGet	(int sock);
LOCAL STATUS	cisConfigGet	(int sock);
LOCAL STATUS	cisResourceGet	(int sock);


/*******************************************************************************
*
* cisGet - get information from a PC card's CIS
*
* This routine gets information from a PC card's CIS, configures the PC card,
* and allocates resources for the PC card.
*
* RETURNS: OK, or ERROR if it cannot get the CIS information,
* configure the PC card, or allocate resources.
*/

STATUS cisGet
    (
    int sock			/* socket no. */
    )
    {
    PCMCIA_CTRL *pCtrl	= &pcmciaCtrl;
    PCMCIA_CHIP *pChip	= &pCtrl->chip;
    PCMCIA_CARD *pCard	= &pCtrl->card[sock];
    STATUS status	= ERROR;
    DL_NODE *pNode;
    DL_NODE *pTemp;


    semTake (&cisMuteSem, WAIT_FOREVER);	/* mutual exclusion begin */
    (void) (* pChip->cscOff) (sock, pChip->intLevel);

    for (pNode = DLL_FIRST(&pCard->cisTupleList); pNode != NULL; pNode = pTemp)
	{
	pTemp = DLL_NEXT(pNode);
	free (pNode);
	}

    for (pNode = DLL_FIRST(&pCard->cisConfigList); pNode != NULL; pNode = pTemp)
	{
	pTemp = DLL_NEXT(pNode);
	free (pNode);
	}

    dllInit (&pCard->cisTupleList);
    dllInit (&pCard->cisConfigList);

    if ((cisTupleGet (sock) == OK) &&
	(cisConfigGet (sock) == OK) &&
    	(cisResourceGet (sock) == OK))
	status = OK;

    (void) (* pChip->cscPoll) (sock);

    (void) (* pChip->cscOn) (sock, pChip->intLevel);
    semGive (&cisMuteSem);			/* mutual exclusion end */

    return (status);
    }

/*******************************************************************************
*
* cisTupleGet - get tuples from PC card and attach it to the link list
*
* This routine get tuples from PC card and attach it to the link list.
*
* RETURNS: OK, or ERROR if it couldn't set a value to the PCMCIA chip.
*/

LOCAL STATUS cisTupleGet
    (
    int sock			/* socket no. */
    )

    {
    BOOL endList	= FALSE;
    BOOL noLink		= FALSE;
    u_long longlinkA	= 0;
    u_long longlinkC	= 0;
    PCMCIA_CTRL *pCtrl	= &pcmciaCtrl;
    PCMCIA_CHIP *pChip	= &pCtrl->chip;
    PCMCIA_CARD *pCard	= &pCtrl->card[sock];
    int ix		= 0;
    PCMCIA_MEMWIN cisMemwin;
    CIS_TUPLE_A *pTupleA;
    CIS_TUPLE_C *pTupleC;
    DL_NODE *pNode;
    u_char *pChar;
    u_char *pd;
    u_char *ps;
    int flag;
    int tuples;

    /* XXX
     * Assumption
     * 1. CIS tuple chain is in between start and stop in pcmciaMemwin[0].
     * 2. Longlink from Common memory to Attribute memory doesn't occur
     *
     * Card reset/power signal sequence (See p.60 PCMCIA Developer's guide)
     *                  ______________________________________________
     *   Card detect  __|
     *                   >50ms-
     *                         _______________________________________
     *   Vcc          _________|
     *                          >300ms--------
     *   Card signal                          ________________________
     *       enabled  ________________________|
     *                                        __________
     *   Reset        ________________________|        |______________
     *                                         >10ms---
     *                                                  >20ms----
     *   Card access                                             _____
     *       allowed  ___________________________________________|
     */

    if (pChip->installed != TRUE)
	return (ERROR);

    taskDelay (sysClkRateGet() >> 3);		/* 7 * 16ms = 112ms */

    if ((* pChip->reset)(sock) != OK)
	return (ERROR);

    flag = PC_PWR_AUTO | PC_VCC_5V | PC_VPP_5V;
    if ((* pChip->flagSet)(sock, flag) != OK)
	return (ERROR);

    taskDelay (sysClkRateGet() >> 1);		/* 30 * 16ms = 500ms */

    flag = PC_PWR_AUTO | PC_VCC_5V | PC_VPP_5V | PC_RESET;
    if ((* pChip->flagSet)(sock, flag) != OK)
	return (ERROR);

    taskDelay (sysClkRateGet() >> 4);		/* 3 * 16ms = 48ms */

    flag = PC_PWR_AUTO | PC_VCC_5V | PC_VPP_5V;
    if ((* pChip->flagSet)(sock, flag) != OK)
	return (ERROR);

    taskDelay (sysClkRateGet() >> 2);		/* 15 * 16ms = 240ms */

    flag = PC_READY | PC_POWERON;
    while ((((* pChip->status)(sock) & flag) != flag) && (ix++ < 8))
	taskDelay (sysClkRateGet() >> 2);

    do  {

	/* map attribute memory */

	pChar			= (u_char *)pcmciaMemwin[CIS_MEM_TUPLE].start +
				  pCtrl->memBase;
        cisMemwin.window	= PCMCIA_CIS_WINDOW;
        cisMemwin.flags		= MAP_ACTIVE | MAP_16BIT | MAP_ATTRIB;
        cisMemwin.extraws	= 2;
        cisMemwin.start		= pcmciaMemwin[CIS_MEM_TUPLE].start;
        cisMemwin.stop		= pcmciaMemwin[CIS_MEM_TUPLE].stop;
        cisMemwin.cardstart	= longlinkA;
	if ((* pChip->memwinSet)(sock, &cisMemwin) != OK)
	    return (ERROR);

	/* check the link target tuple if we had longlink tuple */

	if (longlinkA != 0)
	    {
	    longlinkA = 0;
	    pTupleA = (CIS_TUPLE_A *)pChar;
	    if (pTupleA->code == CISTPL_LINKTARGET)
		pChar += (pTupleA->link + 2) * 2;
	    else
		break;
	    }
	
	/* parse the tuple chain */

	endList = FALSE;
	for (tuples = 0; !endList; tuples++)
	    {
	    pTupleA = (CIS_TUPLE_A *)pChar;

	    switch (pTupleA->code)
		{
		case CISTPL_NULL:
		    pChar += 2;
		    break;
		
		case CISTPL_LONGLINK_A:
		    ps = pChar + 4;
		    pd = (u_char *)&longlinkA;
		    for (ix = 0; ix < 4; ix++)
			*pd++ = *ps++;
		    pChar += (pTupleA->link + 2) * 2;
		    break;
		
		case CISTPL_LONGLINK_C:
		    ps = pChar + 4;
		    pd = (u_char *)&longlinkC;
		    for (ix = 0; ix < 4; ix++)
			*pd++ = *ps++;
		    pChar += (pTupleA->link + 2) * 2;
		    break;
		
		case CISTPL_NO_LINK:
		    noLink = TRUE;
		    pChar += (pTupleA->link + 2) * 2;
		    break;

		case CISTPL_END:
		    if (tuples != 0)
		        endList = TRUE;
		    pChar += (pTupleA->link + 2) * 2;
		    break;

		case CISTPL_CHECKSUM:
		    /* XXX ignore now */
		    pChar += (pTupleA->link + 2) * 2;
		    break;
		
		default:
		    pNode = (DL_NODE *)malloc (pTupleA->link + 2 +
					       sizeof(DL_NODE));
		    pd = (u_char *)pNode + sizeof(DL_NODE);
		    ps = pChar;
		    for (ix = 0; ix < (pTupleA->link + 2); ix++)
			{
			*pd++ = *ps++;
			ps++;
			}
		    dllAdd (&pCard->cisTupleList, pNode);
		    pChar += (pTupleA->link + 2) * 2;
		    break;
		}
	    if ((pTupleA->link == 0xff) || (tuples >= CIS_MAX_TUPLES))
		endList = TRUE;
	    }
	} while (longlinkA != 0);

    if (noLink)
	{
        /* unmap memory window */

        cisMemwin.window	= 0;
        cisMemwin.flags		= 0;
        cisMemwin.extraws	= 0;
        cisMemwin.start		= 0;
        cisMemwin.stop		= 0;
        cisMemwin.cardstart	= 0;
        if ((* pChip->memwinSet)(sock, &cisMemwin) != OK)
            return (ERROR);
        return (OK);
	}


    do  {

	/* map common memory */

	pChar			= (u_char *)pcmciaMemwin[CIS_MEM_TUPLE].start +
				  pCtrl->memBase;
        cisMemwin.window	= PCMCIA_CIS_WINDOW;
        cisMemwin.flags		= MAP_ACTIVE | MAP_16BIT;
        cisMemwin.extraws	= 2;
        cisMemwin.start		= pcmciaMemwin[CIS_MEM_TUPLE].start;
        cisMemwin.stop		= pcmciaMemwin[CIS_MEM_TUPLE].stop;
        cisMemwin.cardstart	= longlinkC;
	if ((* pChip->memwinSet)(sock, &cisMemwin) != OK)
	    return (ERROR);

	/* check the link target tuple */

	pTupleC = (CIS_TUPLE_C *)pChar;
	if (pTupleC->code == CISTPL_LINKTARGET)
	    pChar += pTupleC->link + 2;
	else
	    break;

	/* parse the tuple chain */

	endList = FALSE;
	for (tuples = 0; !endList; tuples++)
	    {
	    pTupleC = (CIS_TUPLE_C *)pChar;
	    switch (pTupleC->code)
		{
		case CISTPL_NULL:
		    pChar++;
		    break;

		case CISTPL_LONGLINK_A:
		    ps = pChar + 2;
		    pd = (u_char *)&longlinkA;
		    for (ix = 0; ix < 4; ix++)
			*pd++ = *ps++;
		    
		    pChar += pTupleC->link + 2;
		    break;

		case CISTPL_LONGLINK_C:
		    ps = pChar + 2;
		    pd = (u_char *)&longlinkC;
		    for (ix = 0; ix < 4; ix++)
			*pd++ = *ps++;
		    
		    pChar += pTupleC->link + 2;
		    break;
		
		case CISTPL_NO_LINK:
		    noLink = TRUE;
		    pChar += pTupleC->link + 2;
		    break;
		
		case CISTPL_END:
		    if (tuples != 0)
		        endList = TRUE;
		    pChar += pTupleC->link + 2;
		    break;

		case CISTPL_CHECKSUM:
		    /* XXX ignore now */
		    pChar += pTupleC->link + 2;
		    break;
		
		default:
		    pNode = (DL_NODE *)malloc (pTupleC->link + 2 + 
					       sizeof(DL_NODE));
		    pd = (u_char *)pNode + sizeof(DL_NODE);
		    ps = pChar;
		    for (ix = 0; ix < (pTupleC->link + 2); ix++)
			*pd++ = *ps++;
		    dllAdd (&pCard->cisTupleList, pNode);
		    pChar += pTupleC->link + 2;
		    break;
		}
	    if ((pTupleC->link == 0xff) || (tuples >= CIS_MAX_TUPLES))
		endList = TRUE;
	    }
	} while (longlinkC != 0);

    /* unmap memory window */

    cisMemwin.window		= 0;
    cisMemwin.flags		= 0;
    cisMemwin.extraws		= 0;
    cisMemwin.start		= 0;
    cisMemwin.stop		= 0;
    cisMemwin.cardstart		= 0;
    if ((* pChip->memwinSet)(sock, &cisMemwin) != OK)
        return (ERROR);

    return (OK);
    }

/*******************************************************************************
*
* cisConfigGet - get configuration information from the CIS tuple link list
*
* Get configuration information from the CIS tuple link list.
*
* RETURNS: OK (always).
*/

LOCAL STATUS cisConfigGet
    (
    int sock			/* socket no. */
    )

    {
    PCMCIA_CTRL *pCtrl		= &pcmciaCtrl;
    PCMCIA_CARD *pCard		= &pCtrl->card[sock];
    CIS_CONFIG *pDefault	= 0;
    CIS_CONFIG *pConfig;
    DL_NODE *pNode;
    CIS_TUPLE *pTuple;
    CIS_BYTE4 base;
    CIS_BYTE4 mask;
    CIS_BYTE4 addr;
    CIS_BYTE4 length;
    CIS_BYTE4 cAddr;
    CIS_BYTE4 hAddr;
    int lengthSize;
    int addrSize;
    int maskSize;
    int windows;
    int ix;
    u_char *pChar;
    u_char *pEnd;
    u_char *pv;
    u_char featureSelection;
    u_char parameterSelection;
    u_char hostaddr;
    u_char waitScale;
    u_char busyScale;
    u_char reservedScale;


    for (pNode = DLL_FIRST (&pCard->cisTupleList);
	 pNode != NULL;
	 pNode = DLL_NEXT(pNode))
	{
	pTuple	= (CIS_TUPLE *)((char *)pNode + sizeof (DL_NODE));
	pChar	= (u_char *)pTuple + sizeof (CIS_TUPLE);
	pEnd	= pChar + pTuple->link;

	switch (pTuple->code)
	    {
	    case CISTPL_CONFIG:
		pCard->regBase = 0;
		pCard->regMask = 0;
		addrSize = (*pChar & 0x03) + 1;
		maskSize = ((*pChar & 0x3c) >> 2) + 1;
		pChar += 2;
		if (pChar > pEnd)
		    break;

		base.l = 0;
		for (ix = 0; ix < addrSize; ix++)
		    base.c[ix] = *pChar++;

		mask.l = 0;
		for (ix = 0; ix < maskSize; ix++)
		    mask.c[ix] = *pChar++;
		
		pCard->regBase = base.l;
		pCard->regMask = mask.l;
		break;
	    
	    case CISTPL_CFTABLE_ENTRY:
		pConfig = (CIS_CONFIG *)calloc(1, sizeof(CIS_CONFIG));
		if (*pChar & 0x40)
		    pDefault = pConfig;
		else if (pDefault != 0)
		    {
		    bcopy ((char *)pDefault, (char *)pConfig, 
			   sizeof(CIS_CONFIG));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女视频一区二区| 在线91免费看| 欧美白人最猛性xxxxx69交| 国产精品白丝在线| 玖玖九九国产精品| 欧美日韩综合色| 国产精品色哟哟| 激情文学综合插| 91精品国产综合久久久久久久久久 | 亚洲欧美福利一区二区| 久久99久国产精品黄毛片色诱| 色狠狠桃花综合| 国产精品剧情在线亚洲| 国内精品国产成人| 日韩欧美久久一区| 午夜激情综合网| 在线观看国产91| 亚洲人精品午夜| 成人99免费视频| 国产精品―色哟哟| av资源站一区| 亚洲国产成人自拍| 国产福利一区二区三区在线视频| 日韩欧美一区二区三区在线| 日韩中文欧美在线| 欧美日韩专区在线| 日日夜夜一区二区| 7777精品伊人久久久大香线蕉的 | 成人av午夜电影| 国产日韩欧美一区二区三区综合 | 日韩成人精品在线观看| 欧美日韩午夜影院| 三级不卡在线观看| 日韩一区二区在线观看视频| 免费观看久久久4p| 精品国产乱子伦一区| 加勒比av一区二区| 国产日韩欧美一区二区三区综合| 国产成+人+日韩+欧美+亚洲| 中文字幕免费不卡| 色又黄又爽网站www久久| 樱花草国产18久久久久| 欧美视频你懂的| 蜜桃av噜噜一区| 久久九九久久九九| 99精品国产视频| 亚洲综合激情另类小说区| 欧美精品三级日韩久久| 精久久久久久久久久久| 国产精品精品国产色婷婷| 91免费小视频| 蜜臀久久99精品久久久画质超高清| 精品日韩一区二区三区 | 亚洲欧洲日产国码二区| 欧洲国产伦久久久久久久| 日韩成人一级片| 91激情五月电影| 亚洲欧洲av在线| 一本一道久久a久久精品综合蜜臀| 亚洲视频在线一区观看| 欧美女孩性生活视频| 国产在线精品一区在线观看麻豆| 国产午夜一区二区三区| 色婷婷av一区二区三区gif | 在线日韩av片| 美女在线一区二区| 国产精品免费视频一区| 欧美伦理电影网| 成人蜜臀av电影| 图片区日韩欧美亚洲| 国产精品网曝门| 欧美一区二区女人| 91蜜桃免费观看视频| 国模套图日韩精品一区二区| 精品奇米国产一区二区三区| 欧美激情一区三区| 色一情一伦一子一伦一区| 麻豆国产精品官网| 一区二区在线看| 久久久久亚洲综合| 在线成人av影院| 99re8在线精品视频免费播放| 日韩高清不卡在线| 亚洲另类色综合网站| 久久久久久毛片| 91精品国产综合久久婷婷香蕉| 成人免费黄色在线| 老汉av免费一区二区三区| 亚洲午夜免费电影| 中文字幕在线不卡视频| 精品国产91亚洲一区二区三区婷婷| 日本乱人伦一区| 欧美精品国产精品| 在线看国产一区二区| 国产福利一区二区三区视频在线 | 亚洲人精品午夜| 国产亚洲成年网址在线观看| 欧美一级高清大全免费观看| 91麻豆国产自产在线观看| 国产不卡高清在线观看视频| 久久精品二区亚洲w码| 亚洲一区二区五区| 一区二区在线观看视频在线观看| 1024成人网| 最新高清无码专区| 中文字幕中文字幕一区二区| 国产精品视频在线看| 欧美激情艳妇裸体舞| 久久综合av免费| 久久综合久久综合九色| 日韩免费视频一区二区| 日韩午夜精品电影| 日韩欧美另类在线| 久久这里只有精品首页| 精品伦理精品一区| 久久综合九色综合欧美98| 精品欧美一区二区久久| 久久众筹精品私拍模特| 日韩成人伦理电影在线观看| 日韩精品成人一区二区三区| 日韩黄色免费网站| 久久99精品国产麻豆不卡| 国产自产高清不卡| 高清久久久久久| 99在线精品视频| 色综合久久久久网| 欧美日韩视频在线一区二区| 欧美日韩午夜精品| 日韩欧美美女一区二区三区| 久久香蕉国产线看观看99| 久久久久久久一区| 日韩一区有码在线| 亚洲国产欧美在线人成| 日韩av在线免费观看不卡| 男人操女人的视频在线观看欧美 | 精品福利一区二区三区| 欧美国产一区在线| 一区二区三区.www| 免费日韩伦理电影| 高清不卡一区二区| 色94色欧美sute亚洲线路一久| 欧美日本免费一区二区三区| 精品国产免费视频| 亚洲美腿欧美偷拍| 日本不卡高清视频| 成人在线综合网站| 欧美日韩一区二区欧美激情 | 7777精品伊人久久久大香线蕉经典版下载 | 无码av中文一区二区三区桃花岛| 久久国产成人午夜av影院| 国产99精品视频| 欧美日韩极品在线观看一区| 欧美α欧美αv大片| 亚洲精选在线视频| 久久av中文字幕片| 色综合天天综合给合国产| 欧美一区二区三区免费观看视频| 欧美激情一区二区三区全黄| 亚洲图片自拍偷拍| 成人丝袜高跟foot| 欧美一区二区三区系列电影| 欧美韩日一区二区三区四区| 婷婷激情综合网| 成人综合婷婷国产精品久久免费| 欧美视频一区二区三区在线观看| 久久久美女毛片| 日本一不卡视频| 在线亚洲+欧美+日本专区| 国产视频911| 日韩av一级片| 欧美色图第一页| 成人欧美一区二区三区| 国产成都精品91一区二区三| 日韩欧美一区二区免费| 一区二区三区不卡在线观看| 菠萝蜜视频在线观看一区| 精品国产制服丝袜高跟| 亚洲超丰满肉感bbw| 色婷婷亚洲精品| 国产精品麻豆视频| 国产麻豆欧美日韩一区| 日韩一区二区在线看| 亚洲gay无套男同| 在线精品国精品国产尤物884a| 丁香婷婷综合激情五月色| 欧美成人福利视频| 日本一区二区综合亚洲| 精品综合久久久久久8888| 91精品国产福利在线观看| 亚洲电影欧美电影有声小说| 在线观看亚洲精品视频| 日韩主播视频在线| 一本久道中文字幕精品亚洲嫩| 久久久三级国产网站| 欧美一级久久久久久久大片| 亚洲 欧美综合在线网络| 欧美日韩国产bt| 亚洲第一会所有码转帖| 欧美日韩一区二区三区四区| 亚洲电影在线免费观看|