VxWorks的block设备驱动--ram disk驱动

来源:互联网 发布:二叉树的遍历算法先序 编辑:程序博客网 时间:2024/05/16 04:54

file fooDrv.h

#ifndef __INCFOODRV
#define __INCFOODRV
#include "vxWorks.h"
#include "sioLib.h"

typedef struct
{
    BLK_DEV  devHdr; /* generic block device structure */
    char  *addr;     /* memory location of the RAM disk */
    int   blkOffset; /* block offset of this device from ram_addr */
}fooDev;

STATUS fooDrv();
BLK_DEV *fooDevCreate(int bytesPerBlk, int nBlocks, int blkOffset);
STATUS fooRead(fooDev *pDev, int startBlk, int nBlks, char *pBuf);
STATUS fooWrite(fooDev *pDev, int startBlk, int nBlks, char *pBuf);
STATUS fooIoctl(fooDev *pDev, int cmd, int arg);
STATUS fooReset(fooDev *pDev);
STATUS fooStatusCheck(fooDev *pDev);

#endif

 

/*****************************************************************************

file fooDrv.c

/*****************************************************************************
 函 数 名  : fooDrv
 功能描述  :
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 
 修改历史  :
  1.日    期   : 2008年8月13日
    作    者   : huangxb
    修改内容   : 新生成函数
*****************************************************************************/
STATUS fooDrv()
{
    printf("fooDrv is called/n");
    return (OK);
}
/*****************************************************************************
 函 数 名  : fooDevCreate
 功能描述  :
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 
 修改历史  :
  1.日    期   : 2008年8月13日
    作    者   : huangxb
    修改内容   : 新生成函数
*****************************************************************************/
BLK_DEV *fooDevCreate(int bytesPerBlk, int nBlocks, int blkOffset)
{
    fooDev *pfooDev;
    BLK_DEV *pBlkDev;
 
    if ((pfooDev = (fooDev *)malloc(sizeof(fooDev))) == NULL)
        return (NULL);

    pBlkDev = &pfooDev->devHdr;
    pBlkDev->bd_nBlocks = nBlocks;
    pBlkDev->bd_bytesPerBlk = bytesPerBlk;
    //pBlkDev->bd_blksPerTrack = blksPerTrack;
    pBlkDev->bd_nHeads = 1;
    pBlkDev->bd_removable = FALSE;
    pBlkDev->bd_retry = 1;
    pBlkDev->bd_mode = UPDATE;
    pBlkDev->bd_readyChanged = TRUE;
   
    pBlkDev->bd_blkRd = fooRead;
    pBlkDev->bd_blkWrt = fooWrite;
    pBlkDev->bd_ioctl = fooIoctl;
    pBlkDev->bd_reset = fooReset;
    pBlkDev->bd_statusChk = fooStatusCheck;
   
    /* 为文件系统分配内存 */
    pfooDev->addr = (unsigned char *)malloc(nBlocks * bytesPerBlk *sizeof(unsigned char));

    pfooDev->blkOffset = blkOffset; 
   
    return (&pfooDev->devHdr);
}
/*****************************************************************************
 函 数 名  : fooRead
 功能描述  : read
 输入参数  : fooDev *pDev 
             int startBlk 
             int nBlks    
             char *pBuf   
 输出参数  : 无
 返 回 值  :
 调用函数  :
 被调函数  :
 
 修改历史      :
  1.日    期   : 2008年8月26日
    作    者   : huangxb
    修改内容   : 新生成函数

*****************************************************************************/
STATUS fooRead(fooDev *pDev, int startBlk, int nBlks, char *pBuf)
{      
    int  bytesPerBlk; /* number of bytes per block */

    printf("fooRead is call/n");
    printf("startBlk is %d nBlks is %d/n", startBlk, nBlks);

    bytesPerBlk = pDev->devHdr.bd_bytesPerBlk;
    /* Add in the block offset */
    startBlk += pDev->blkOffset;
   
    /* Read the block(s) */
    memcpy (pBuf, (pDev->addr + (startBlk * bytesPerBlk)),
         bytesPerBlk * nBlks);
    return OK;
}

/*****************************************************************************
 函 数 名  : fooWrite
 功能描述  : write
 输入参数  : fooDev *pDev 
             int startBlk 
             int nBlks    
             char *pBuf   
 输出参数  : 无
 返 回 值  :
 调用函数  :
 被调函数  :
 
 修改历史      :
  1.日    期   : 2008年8月26日
    作    者   : huangxb
    修改内容   : 新生成函数

*****************************************************************************/
STATUS fooWrite(fooDev *pDev, int startBlk, int nBlks, char *pBuf)
{
    int  bytesPerBlk; /* number of bytes per block */

    printf("fooWrite is call/n");
    printf("startBlk is %d nBlks is %d/n", startBlk, nBlks);

    bytesPerBlk = pDev->devHdr.bd_bytesPerBlk;

    /* Write the block(s) */
    memcpy ((pDev->addr + (startBlk * bytesPerBlk)), pBuf,
            bytesPerBlk * nBlks);
   
    return OK;
}
/*****************************************************************************
 函 数 名  : fooIoctl
 功能描述  :
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 
 修改历史  :
  1.日    期   : 2008年8月13日
    作    者   : huangxb
    修改内容   : 新生成函数
*****************************************************************************/
STATUS fooIoctl(fooDev *pDev, int cmd, int arg)
{
    printf("fooIotcl is call /n");
    return OK;
}
/*****************************************************************************
 函 数 名  : fooReset
 功能描述  :
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 
 修改历史  :
  1.日    期   : 2008年8月13日
    作    者   : huangxb
    修改内容   : 新生成函数
*****************************************************************************/
STATUS fooReset(fooDev *pDev)
{
    printf("fooReset is call /n");
    return (OK);
}
/*****************************************************************************
 函 数 名  : fooStatusCheck
 功能描述  :
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 
 修改历史  :
  1.日    期   : 2008年8月13日
    作    者   : huangxb
    修改内容   : 新生成函数
*****************************************************************************/
STATUS fooStatusCheck(fooDev *pDev)
{
    printf("fooStatusCheck is call /n");
    return (OK);  
}

/*****************************************************************************
 函 数 名  : fooDrvTest
 功能描述  :
 输入参数  : 无
 输出参数  : 无
 返 回 值  :
 
 修改历史  :
  1.日    期   : 2008年8月13日
    作    者   : huangxb
    修改内容   : 新生成函数
*****************************************************************************/
STATUS fooDrvTest()
{
    //char fooDevName[] = "fooDisk";
    BLK_DEV *pBlkDev;
    int fooFd = 0;
    unsigned char readBuf[20];
    unsigned char writeBuf[20];
   
    fooDrv();
    pBlkDev = fooDevCreate(512, 400, 0);
    if (pBlkDev == NULL)
        return (ERROR);
       
    rawFsDevInit("/rawDisk", pBlkDev);

    fooFd = open("/rawDisk", O_RDWR, 0);

    strcpy(writeBuf, "rawFS/n");
    write(fooFd, writeBuf, strlen(writeBuf));
    close(fooFd);

    fooFd = open("/rawDisk", O_RDWR, 0);
    read(fooFd, readBuf, 20);
    printf("readBuf is %s/n", readBuf);

    close(fooFd);
   
    return (OK);

}

原创粉丝点击