免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2064 | 回复: 0
打印 上一主题 下一主题

[其它] VxWorks的block设备驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-26 20:57 |只看该作者 |倒序浏览

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);
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/53892/showart_1149535.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP