分类: LINUX
2008-08-26 20:57:33
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);
}