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

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

?? fdcdrv.c

?? WINDRIVER MCP750 BSP
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* fdcDrv.c - Floppy Disk Controller (FDC) Input/Output Driver Module *//* Copyright 1984-2001 Wind River Systems, Inc. *//* Copyright 1996,1997,1998 Motorola, Inc., All Rights Reserved *//*modification history--------------------01c,16sep01,dat  Use of WRS_ASM macro01b,15apr98,dat  added INCLUDE_FD, using macros FD_BASE_ADDR and		 FD_DMA_CHAN to match old API for fdDrv().01a,12dec97,rbb  created by Motorola.*//*DESCRIPTIONThis is the I/O driver for a standard PS2 floppy device controller (FDC).This driver is normally included as a source file, and expects the macroINCLUDE_FD to be defined if any code is to be compiled.USER CALLABLE ROUTINESMost of the routines in this driver are accessible only through the I/Osystem.  Two routines, however, must be called directly: fdDrv() toinitialize the driver, and fdDevCreate() to create devices.Before using the driver, it must be initialized by calling the fdDrv().The macros FD_BASE_ADDR and FD_DMA_CHAN are needed to provide the baseaddress of the floppy disk controller device and the DMA channel numberto be used. (This is to maintain compatibility with the existing API forfdDrv() )..CSSTATUS fdDrv    (    UINT intVector,		// interrupt vector    UINT intLevel		// interrupt level    ).CEThis routine initializes the floppy disk controller driver, sets upinterrupt vectors, and performs hardware initialization of the floppydisk controller chip.This routine should be called exactly once, before any reads, writes,or calls to fdDevCreate().  Normally, it is called from usrRoot() inusrConfig.c.CREATING DISK DEVICESBefore a disk device can be used, it must be created.  This is donewith the fdDevCreate() call.  Each floppy disk drive to be used mayhave one or more devices associated with it, by calling this routine.The way the device is created with this call determines the floppydiskette type, and whether it covers the whole disk or just part ofit.fdDevCreate() - create a device for a floppy disk.CSBLK_DEV *fdDevCreate    (    UINT driveNumber,		// drive number (0 to 3)    UINT fdType,		// type of floppy disk (table index)    UINT nBlocks,		// device size in blocks (0 = whole disk)    UINT blkOffset 		// offset from start of device    ).CEThis routine creates a device for a specified floppy disk.The driveNumber parameter is the drive number of the floppy disk; validvalues are 0 to 3.The fdType parameter specifies the type of diskette, which is describedin the structure table fdcTypes[] in fdcDrv.c.  fdcType is an indexinto the table.  Currently the table contains two diskette types: - An fdcType of 0 indicates the first entry in the table (3.5" 2HD, 1.44MB); - An fdcType of 1 indicates the second entry in the table (3.5" 2HD, 720KB);Members of the fdcTypes[] structure are:   UINT numberofheads;		// number of heads (sides)   UINT numberoftracks;		// number of tracks   UINT sectorstrack;		// sectors (blocks) per track   UINT sectorsize;		// sector (block) size in bytes   UINT ratestep;		// step rate   UINT ratedata;		// data rate   UINT gaprw;			// read/write sector gap   UINT gapformat;		// format gapThe nBlocks parameter specifies the size of the device, in blocks.  IfnBlocks is zero, the whole disk is used.The blkOffset parameter specifies an offset, in blocks, from the startof the device to be used when writing or reading the floppy disk.  Thisoffset is added to the block numbers passed by the file system duringdisk accesses.  (VxWorks file systems always use block numbers beginningat zero for the start of a device.)  Normally, blkOffset is 0.For instance, to create a rawFs compatible device, covering the wholedisk (3.5" 2HD, 1.44MB) on drive 0, the proper call would be:.CS    fdDevCreate (0, 0, 0, 0);.CEIOCTLThis driver responds to all the same ioctl codes as a normal blockdevice driver.  To format a disk use FIODISKFORMAT.CAVEATSNo mechanism exists for detecting the change of media.  The driverdoes not support the concurrent operation of multiple drives.  Thisis due to the fact that all drives share the same DMA channel.*//* * includes * * include file paths are dependent on makefile */#include "vxWorks.h"	/* vxWorks generics */#include "taskLib.h"	/* taskLib functions */#include "ioLib.h"	/* input/output generics */#include "blkIo.h"	/* block input/output specifics */#include "semLib.h"	/* semaphore operations */#include "cacheLib.h"	/* cache control */#include "intLib.h"	/* interrupt control */#include "errnoLib.h"	/* error number */#include "string.h"#include "fdc.h"	/* floppy disk controller (FDC) */#include "fdcDrv.h"	/* floppy disk controller (FDC) driver header */#include "i8237.h"	/* i8237 DMA controller device */#ifdef INCLUDE_FD	/* do nothing, if not defined *//* defines */#ifndef EIEIO_SYNC# define EIEIO_SYNC  _WRS_ASM(" eieio; sync")#endif  /* EIEIO_SYNC *//* typedefs *//* globals */LOCAL UINT fdcDrvInitFlag = 0;		/* driver initialization flag */LOCAL UINT fdcDrvBaseAddress = 0;	/* base address of FDC */LOCAL UINT fdcDrvIntVector = (UINT)-1;	/* interrupt vector number */LOCAL UINT fdcDrvIntLevel = (UINT)-1;	/* interrupt level number */LOCAL UINT fdcDrvDmaChannel = (UINT)-1;	/* DMA channel number */LOCAL SEM_ID fdcDrvSemId;		/* driver ownership semaphore */LOCAL FDC_IARGS fdcDrvIArgs;		/* interrupt handler arguments */LOCAL UINT fdcDrvIntCount[FDC_NDRIVES] = { 0 };/* locals */LOCAL FDC_TYPE fdcTypes[] = {   { 2, 80, 18, 512, 0, 500, 0x1B, 0x6C },	/* 1.44MB */   { 2, 80,  9, 512, 0, 250, 0x2A, 0x50 }	/* 720KB */};#define FDC_TYPES_TABLESIZE	(sizeof(fdcTypes)/sizeof(FDC_TYPE))/* forward declarations */extern STATUS fdDrv();extern BLK_DEV *fdDevCreate();LOCAL STATUS fdcIoctl();LOCAL STATUS fdcRead();LOCAL STATUS fdcWrite();LOCAL STATUS fdcStatusChk();LOCAL UINT fdcCheck();		/* check state */LOCAL UINT fdcClearReset();	/* clear reset state */LOCAL void fdcDelay();		/* delay (sleep) in milli-seconds */LOCAL UINT fdcDrvMain();	/* fdc driver main entry point */LOCAL UINT fdcFormat();		/* format track/disk */LOCAL UCHAR fdcDRCode();	/* return data-rate code */LOCAL UINT fdcInit();		/* initialize operating parameters */LOCAL void fdcInt();		/* interrupt handler */LOCAL void fdcSetAES();	/* setup additional error status information */LOCAL UINT fdc_clsn();		/* calculate logical sector number */LOCAL void fdcCP();		/* calculate position */LOCAL UINT fdcRxd();		/* receive byte from data FIFO */LOCAL UINT fdcRxdEp();		/* receive data from FIFO, execution phase */LOCAL UINT fdcSeek();		/* seek to track */LOCAL void fdcStat();	/* retrieve command execution status (results) */LOCAL UINT fdcTxd(FDC *, UCHAR);	/* transmit (send) byte to data FIFO */LOCAL UINT fdcTxdEp();		/* transmit data to FIFO, execution phase */LOCAL void fdcExeCmd();		/* execute command */LOCAL UINT fdcXfer();		/* read/write transfer */LOCAL UINT fdcXfrcheck();	/* sanity check on block size/number of blocks/sector size parameters */LOCAL UINT fdcSCode();		/* return sector code *//* externals */extern void bzero();		/* zero or clear memory routine */extern void *calloc();		/* memory allocate and clear */extern void *memalign();	/* aligned memory allocate */extern int sysClkRateGet();	/* system clock rate */extern void isaDmaInit();	/* initialize DMA (global configuration) */extern void isaDmaStart();	/* initialize DMA channel for transfer */extern void isaDmaStop();	/* disable DMA channel */extern UINT isaDmaStatus();	/* query DMA channel for transfer status *//********************************************************************************* fdDrv - initialize the floppy disk driver* * This function's purpose is to the initialize the floppy disk* controller device for operation.** The macros FD_BASE_ADDR and FD_DMA_CHAN must be defined for this driver* to compile correctly.** RETURNS: OK, or ERROR if driver initialization fails*/STATUS fdDrv    (    register UINT interruptVector,	/* interrupt vector */    register UINT interruptLevel	/* interrupt level */    )    {    register UINT baseAddress = FD_BASE_ADDR;	/* base address of FDC */    register UINT dmaChannel = FD_DMA_CHAN; 	/* DMA channel number */    /* initialize driver, if initialized, return ERROR */    if (fdcDrvInitFlag) 	{        return (ERROR);   	}    /* make some sanity of the desired mode */    if (interruptVector != (UINT)-1) 	{        if (dmaChannel == (UINT)-1) 	    {   	    return (ERROR);      	    }   	}    /* create semaphore to interlock access to the FDC */    if ((fdcDrvSemId = semBCreate(SEM_Q_PRIORITY, SEM_FULL)) == (SEM_ID)NULL) 	{        return (ERROR);   	}    /* connect/enable interrupt handler */    if (interruptVector != (UINT)-1) 	{        intConnect( (VOIDFUNCPTR *)interruptVector,		    (VOIDFUNCPTR)fdcInt,		    (int)((FDC_IARGS *)&fdcDrvIArgs) );        intEnable(interruptVector);	}    /*     * initialize the base address of FDC variable, user may override     * if the value is not zero     */    if (!fdcDrvBaseAddress) 	{        fdcDrvBaseAddress = baseAddress;	}     /*     * initialize the DMA channel number for this FDC     * initialize the interrupt vector/level     */    fdcDrvDmaChannel = dmaChannel;    fdcDrvIntVector = interruptVector;    fdcDrvIntLevel = interruptLevel;    /* set the driver initialization flag to a true state */    fdcDrvInitFlag = (UINT)-1;	    return (OK);    }/********************************************************************************* fdDevCreate - create a device for a floppy disk* * This function's purpose is to create a device for a specified* floppy disk.** RETURNS: pointer to BLK_DEV structure*/BLK_DEV * fdDevCreate    (    register UINT driveNumber,	/* drive number (0 to 3) */    register UINT fdType,	/* type of floppy disk (table index) */    register UINT nBlocks,	/* device size in blocks (0 = whole disk) */    register UINT blkOffset 	/* offset from start of device */    )    {    register FDC_DEV *pDev;		/* device descriptor pointer */    register UINT dmaBufferAddress;	/* DMA buffer address */    register UINT realBlocks;		/* real number of blocks */    /* do not create device if the driver has not been initialized */    if (!fdcDrvInitFlag) 	{        return ((BLK_DEV *)NULL);	}    /* validate floppy disk drive number */    if (driveNumber > (FDC_NDRIVES - 1)) 	{        return ((BLK_DEV *)NULL);        }    /* validate floppy device/disk type */    if (fdType >= FDC_TYPES_TABLESIZE) 	{        return ((BLK_DEV *)NULL);        }    /* allocate memory for device descriptor */    pDev = calloc(1, sizeof(FDC_DEV));    if (pDev == (FDC_DEV *)NULL) 	{        return ((BLK_DEV *)NULL);        }       /* allocate DMA buffer */    dmaBufferAddress = (UINT)memalign(FDC_DMAALIGN, FDC_DMAALIGN);    if (dmaBufferAddress == (UINT)NULL) 	{        return ((BLK_DEV *)NULL);        }    pDev->dmaBuffer = dmaBufferAddress;    /* create interrupt level to task level semaphore */    if ((pDev->intSemId = semBCreate(SEM_Q_FIFO, SEM_EMPTY)) == (SEM_ID)NULL) 	{      	return ((BLK_DEV *)NULL);   	}    /* initialize device specific data structures */    pDev->driveNumber = driveNumber;    pDev->fdcType = fdcTypes[fdType];    /*     * initialize block information, perfrom some sanity     * checks on the blkOffset and nBlocks arguments     */    pDev->blockSize = pDev->fdcType.sectorsize;    pDev->blockOffset = blkOffset;    realBlocks = pDev->fdcType.numberofheads *                 pDev->fdcType.numberoftracks * 		 pDev->fdcType.sectorstrack;    if ((nBlocks > realBlocks) ||        (blkOffset >= realBlocks) ||        ((blkOffset + nBlocks) > realBlocks)) 	{      	return ((BLK_DEV *)NULL);   	}    if (!nBlocks) 	{        pDev->blockTotal = realBlocks - blkOffset;   	}     else 	{        pDev->blockTotal = nBlocks;   	}    /* initialize device block descriptor */    pDev->fdcBlockDev.bd_blkRd = fdcRead;    pDev->fdcBlockDev.bd_blkWrt = fdcWrite;    pDev->fdcBlockDev.bd_ioctl = fdcIoctl;    pDev->fdcBlockDev.bd_reset = NULL;    pDev->fdcBlockDev.bd_statusChk = fdcStatusChk;    pDev->fdcBlockDev.bd_removable = TRUE;    pDev->fdcBlockDev.bd_nBlocks = realBlocks;    pDev->fdcBlockDev.bd_bytesPerBlk = pDev->fdcType.sectorsize;    pDev->fdcBlockDev.bd_blksPerTrack = pDev->fdcType.sectorstrack;    pDev->fdcBlockDev.bd_nHeads = pDev->fdcType.numberofheads;    pDev->fdcBlockDev.bd_retry = 0;    pDev->fdcBlockDev.bd_mode = O_RDWR;    pDev->fdcBlockDev.bd_readyChanged = TRUE;    /* initialize the system clock rate */    pDev->sysClkRate = sysClkRateGet();    return ((BLK_DEV *)pDev);    }/********************************************************************************* fdcRead - fdc read blocks** This function's purpose is to read the specified number of* blocks from the specified device.** RETURNS: OK, or ERROR if the read failed*/LOCAL STATUS fdcRead    (    register FDC_DEV *pDev,		/* pointer to device descriptor */    register UINT startBlk,		/* starting block to read */    register UINT numBlks,		/* number of blocks to read */    register char *pBuf 		/* pointer to buffer to receive data */    )    {    register UINT localStatus;	/* local status variable */    FDC_CMDPCKT fdcCmdPacket;	/* command packet */    /*     * verify the request against the logical block parameters (all     * or nothing)     */    if ((startBlk + pDev->blockOffset + numBlks) > pDev->blockTotal) 	{        return (ERROR);	}    /* check for a NOP request */    if (!numBlks) 	{        errno = S_ioLib_DEVICE_ERROR;        return (ERROR);	}    /* build command packet */     fdcCmdPacket.command = FDC_READOP;    fdcCmdPacket.status = 0;    fdcCmdPacket.memaddr = (UINT)pBuf;    fdcCmdPacket.blcknum = startBlk + pDev->blockOffset;    fdcCmdPacket.nblcks = numBlks;    fdcCmdPacket.tdflg = 0;    fdcCmdPacket.aescount = 0;     /* take ownership, call driver, release ownership */    semTake(fdcDrvSemId, WAIT_FOREVER);    localStatus = fdcDrvMain(pDev, (FDC_CMDPCKT *)&fdcCmdPacket);    semGive(fdcDrvSemId);    return ((localStatus ? ERROR : OK));    }/********************************************************************************* fdcWrite - fdc write blocks* * This function's purpose is to write the specified number of* blocks to the specified device.** RETURNS: OK, or ERROR if the write failed*/LOCAL STATUS fdcWrite

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久久综合色一本| 欧美日韩视频在线一区二区| 国产夜色精品一区二区av| 久久99国产精品成人| 欧美精品一区二区久久婷婷| 国产高清久久久| 中文字幕一区二区三区在线观看| 99久久精品久久久久久清纯| 亚洲精品免费在线| 7777精品伊人久久久大香线蕉的| 久久疯狂做爰流白浆xx| 中文字幕国产一区| 欧美综合一区二区三区| 日韩专区在线视频| 久久伊人中文字幕| 97精品久久久久中文字幕 | 精品捆绑美女sm三区| 激情综合网最新| 国产精品第13页| 欧美裸体bbwbbwbbw| 国产一区二区福利| 亚洲人吸女人奶水| 欧美刺激午夜性久久久久久久| 国产精品99久久久| 亚洲国产精品精华液网站| 久久综合丝袜日本网| 在线免费亚洲电影| 精品一区二区精品| 一片黄亚洲嫩模| 亚洲精品在线免费播放| 不卡av在线免费观看| 日本va欧美va精品发布| 国产精品久久一级| 91精品国产综合久久久蜜臀粉嫩 | 亚洲国产毛片aaaaa无费看| 精品粉嫩aⅴ一区二区三区四区| av一二三不卡影片| 日日夜夜免费精品| 国产精品久久久爽爽爽麻豆色哟哟| 欧美视频一区二区三区| 福利视频网站一区二区三区| 午夜欧美大尺度福利影院在线看| 日本一区二区三区四区在线视频| 欧美区在线观看| 色综合久久久网| 国产·精品毛片| 免费看日韩精品| 亚洲一二三四区| 国产精品久久久久影院老司| 日韩一级片网址| 在线观看91视频| 91丨九色丨蝌蚪富婆spa| 国产美女一区二区| 久久99蜜桃精品| 日韩中文字幕区一区有砖一区| 国产嫩草影院久久久久| 精品国产91洋老外米糕| 欧美美女直播网站| 91国偷自产一区二区使用方法| 国产成人免费av在线| 免费观看久久久4p| 日韩精品三区四区| 亚洲国产你懂的| 亚洲激情综合网| 亚洲视频小说图片| 国产精品福利一区二区| 国产片一区二区| 国产女同互慰高潮91漫画| 精品不卡在线视频| 欧美大片顶级少妇| 精品国偷自产国产一区| 日韩欧美一区中文| 欧美一级xxx| 精品少妇一区二区三区在线播放 | 精品一区二区三区久久久| 日韩黄色一级片| 日本亚洲天堂网| 麻豆精品久久精品色综合| 日日摸夜夜添夜夜添国产精品| 亚洲国产欧美在线| 日韩精品欧美成人高清一区二区| 亚洲国产精品一区二区www| 亚洲第一福利视频在线| 日韩电影在线观看网站| 美女网站一区二区| 国内不卡的二区三区中文字幕 | 五月婷婷激情综合| 日韩电影在线免费| 国产自产高清不卡| 成人亚洲精品久久久久软件| 99热精品国产| 在线观看欧美黄色| 欧美乱熟臀69xxxxxx| 日韩欧美成人午夜| 欧美高清一级片在线观看| 一区在线观看视频| 亚洲成人在线网站| 麻豆久久久久久| 成人小视频在线| 欧美又粗又大又爽| 欧美刺激午夜性久久久久久久| 久久久久久久久久久久久久久99| 中文字幕av一区 二区| 亚洲综合999| 久久99精品久久久久婷婷| 福利91精品一区二区三区| 色av一区二区| 精品日韩成人av| 国产精品短视频| 日韩精品午夜视频| 国产剧情一区二区三区| 91美女在线看| 欧美一区二区视频免费观看| 日本一区二区三区dvd视频在线| 亚洲综合免费观看高清在线观看| 久久国产精品色婷婷| 91色综合久久久久婷婷| 欧美精品一区二区蜜臀亚洲| 国产精品久久久久四虎| 日本怡春院一区二区| 国产91在线观看丝袜| 91精品在线免费| 中文字幕av资源一区| 日本不卡123| 91视频一区二区三区| 久久综合成人精品亚洲另类欧美| 一区二区三区国产精品| 国产成人精品aa毛片| 在线不卡中文字幕播放| 国产精品久久久久aaaa| 久久精品国产精品亚洲精品| 在线免费观看日韩欧美| 国产视频一区二区在线观看| 日本vs亚洲vs韩国一区三区二区 | 久久精品国产亚洲aⅴ| 91精品91久久久中77777| 国产亚洲欧美日韩日本| 天天综合网 天天综合色| 不卡的av电影在线观看| 精品久久久久久久人人人人传媒| 一区二区三区国产精华| 成人性视频免费网站| 精品国产3级a| 蜜桃精品视频在线| 欧美特级限制片免费在线观看| 久久久精品黄色| 久久99精品久久久久| 91精品国产综合久久久久久漫画| 1024成人网| 成人的网站免费观看| 国产亚洲欧洲一区高清在线观看| 日本女优在线视频一区二区| 欧美吞精做爰啪啪高潮| 亚洲精品五月天| www.66久久| 中文字幕精品在线不卡| 国产高清不卡一区二区| 337p日本欧洲亚洲大胆色噜噜| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美亚洲综合色| 亚洲最大成人综合| 色综合久久中文综合久久97| 亚洲人成在线播放网站岛国 | 亚洲国产日韩综合久久精品| youjizz久久| 日韩理论在线观看| av午夜精品一区二区三区| 中文字幕一区二区日韩精品绯色| 丰满少妇久久久久久久| 欧美国产精品专区| av动漫一区二区| 亚洲精品日产精品乱码不卡| 91亚洲精品乱码久久久久久蜜桃| 成人欧美一区二区三区视频网页 | 国产成人精品综合在线观看| 久久久精品黄色| 午夜精品福利一区二区蜜股av| 欧美日韩综合不卡| 午夜伦理一区二区| 91精品国产品国语在线不卡| 免费高清不卡av| 国产日韩视频一区二区三区| 国产**成人网毛片九色 | 91在线观看下载| 亚洲男人都懂的| 在线播放欧美女士性生活| 九色porny丨国产精品| 欧美国产亚洲另类动漫| 91麻豆蜜桃一区二区三区| 亚洲gay无套男同| 久久一区二区三区四区| www.欧美色图| 亚洲成av人片一区二区| 久久综合一区二区| 色哟哟精品一区| 日本va欧美va瓶| 国产精品久99| 欧美日韩精品专区| 国产精品亚洲综合一区在线观看| 亚洲男同性恋视频|