flashFsLib.c
上传用户:yuanda199
上传日期:2022-06-26
资源大小:412k
文件大小:6k
源码类别:

VxWorks

开发平台:

C/C++

  1. #include "types.h"
  2. #include "vxWorks.h"
  3. #include "stdio.h"
  4. #include "stdlib.h"
  5. #include "errno.h"
  6. #include "ioLib.h"
  7. #include "dosFsLib.h"
  8. #include "fioLib.h"
  9. #include "blkIo.h"
  10. #include "string.h"
  11. #include "flashDrvLib.h"
  12. #include "flashFsLib.h"
  13. #include "errnoLib.h"
  14. BLK_DEV         flashBlkDev;
  15. DOS_VOL_DESC   *flashDosVolDesc = NULL;
  16. int             flashDosFormat = 0;
  17. /* 
  18.  * The boot ROM resides at the begining of the 2 MB flash, from 0 MB
  19.  * through 0 MB plus 512 KB.
  20.  *
  21.  * flashFsGetPhys remaps logical into physical sectors in such as way as
  22.  * to skip over the two boot sectors.
  23.  */
  24. int             flashFsVerbose = 0;
  25. STATUS
  26. flashFsGetPhys(int blkNum, int *sectorNum, int *offset)
  27. {
  28.     int sect;
  29.     if (blkNum >= FLASH_FS_SIZE_BLOCKS)
  30. return (ERROR);
  31.     sect = blkNum / FLASH_FS_BLOCK_PER_SECTOR;
  32.     if (sect >= FLASH_BOOT_START_SECTOR) {
  33. /* Skip boot sector */
  34. sect += FLASH_BOOT_SIZE_SECTORS;
  35.     }
  36.     *sectorNum = sect;
  37.     *offset = (blkNum % FLASH_FS_BLOCK_PER_SECTOR) * FLASH_FS_BLOCK_SIZE;
  38.     if (flashFsVerbose > 2)
  39. printf("flashFsGetPhys(): blkNum = %d, "
  40.        "*sectorNum = %d, *offset = 0x%xn",
  41.        blkNum, *sectorNum, *offset);
  42.     return (OK);
  43. }
  44. STATUS
  45. flashFsBlkRead(BLK_DEV *pDev, int startBlk, int numBlks, char *pBuf)
  46. {
  47.     int             blkIndx, phySectorNum, offset;
  48.     if (flashFsVerbose > 1)
  49. printf("flashFsBlkRead(): startBlk = %d, numBlks = %dn",
  50.        startBlk, numBlks);
  51.     for (blkIndx = 0; blkIndx < numBlks; blkIndx++) {
  52. if (flashFsGetPhys((startBlk + blkIndx), &phySectorNum, &offset) ==
  53.     ERROR) {
  54.     if (flashFsVerbose)
  55. printf("flashFsBlkRead(): flashFsGetPhys() failedn");
  56.     return (ERROR);
  57. }
  58. if (flashBlkRead(phySectorNum, pBuf,
  59.  offset, FLASH_FS_BLOCK_SIZE) == ERROR) {
  60.     if (flashFsVerbose)
  61. printf("flashFsBlkRead(): flashBlkRead() failedn");
  62.     return (ERROR);
  63. }
  64. pBuf += FLASH_FS_BLOCK_SIZE;
  65.     }
  66.     return (OK);
  67. }
  68. STATUS
  69. flashFsBlkWrite(BLK_DEV *pDev, int startBlk, int numBlks, char *pBuf)
  70. {
  71.     int             blkIndx, phySectorNum, offset;
  72.     if (flashFsVerbose > 1)
  73. printf("flashFsBlkWrite(): startBlk = %d, numBlks = %dn",
  74.        startBlk, numBlks);
  75.     for (blkIndx = 0; blkIndx < numBlks; blkIndx++) {
  76. if (flashFsGetPhys((startBlk + blkIndx), &phySectorNum, &offset) ==
  77.     ERROR) {
  78.     printf("flashFsBlkWrite(): flashFsGetPhys() failedn");
  79.     return (ERROR);
  80. }
  81. if (flashBlkWrite(phySectorNum, pBuf,
  82.   offset, FLASH_FS_BLOCK_SIZE) == ERROR) {
  83.     printf("flashFsBlkWrite(): flashBlkWrite() failedn");
  84.     return (ERROR);
  85. }
  86. pBuf += FLASH_FS_BLOCK_SIZE;
  87.     }
  88.     return (OK);
  89. }
  90. STATUS
  91. flashSync(void)
  92. {
  93.     int             flashFd = 0;
  94.     STATUS          rc;
  95.     if ((flashFd = open(FLASH_FS_NAME, O_RDWR, 0666)) == ERROR) {
  96. printf("flashSync(): open() failedn");
  97.     }
  98.     rc = ioctl(flashFd, FLASH_FS_SYNC, 0);
  99.     close(flashFd);
  100.     return rc;
  101. }
  102. STATUS
  103. flashFsIoctl(BLK_DEV *pDev, int funcCode, int arg)
  104. {
  105.     int sectorAfterBoot;
  106.     if (flashFsVerbose > 1)
  107. printf("flashFsBlkIoctl(): calledn");
  108.     switch (funcCode) {
  109.     case FIODISKFORMAT:
  110. /* Clear flashDrvLib's cached sector */
  111. if (flashDrvLibInit() == ERROR) {
  112.     printf("flashFsLibInit(): flashDrvLibInit() failedn");
  113.     return (ERROR);
  114. }
  115. /* From beginning of flash to beginning of Boot Area */
  116. if (flashEraseBank(0, FLASH_BOOT_START_SECTOR) == ERROR) {
  117.     return (ERROR);
  118. }
  119. sectorAfterBoot = FLASH_BOOT_START_SECTOR + FLASH_BOOT_SIZE_SECTORS;
  120. /* From end of Boot Area to end of flash */
  121. if (flashEraseBank(sectorAfterBoot,
  122.    FLASH_SIZE_SECTORS - sectorAfterBoot) == ERROR) {
  123.     return (ERROR);
  124. }
  125. break;
  126.     case FLASH_FS_SYNC:
  127. flashSyncFilesystem();
  128. break;
  129.     default:
  130. errnoSet(S_ioLib_UNKNOWN_REQUEST);
  131. return (ERROR);
  132. break;
  133.     }
  134.     return (OK);
  135. }
  136. int
  137. tstFlashFile(void)
  138. {
  139.     int             fh;
  140.     char            buff[20];
  141.     printf("creatingn");
  142.     fh = creat("myfile", O_RDWR);
  143.     if (fh < 0) {
  144. printf("tstFlashFile(): create() failedn");
  145. return (ERROR);
  146.     }
  147.     printf("writingn");
  148.     write(fh, buff, 10);
  149.     printf("closingn");
  150.     close(fh);
  151.     return (0);
  152. }
  153. int
  154. tstFlashFile_1(void)
  155. {
  156.     int             fh;
  157.     char            buff[40];
  158.     printf("openingn");
  159.     fh = open("myfile", O_RDWR, 0664);
  160.     if (fh < 0) {
  161. printf("tstFlashFile_1(): open() failedn");
  162. return (ERROR);
  163.     }
  164.     printf("writingn");
  165.     write(fh, buff, 10);
  166.     printf("writingn");
  167.     write(fh, buff, 23);
  168.     printf("closingn");
  169.     close(fh);
  170.     return (0);
  171. }
  172. STATUS
  173. flashFsLibInit(void)
  174. {
  175.     /* 
  176.      * We are considered initialized once flashDosVolDesc is non-NULL.
  177.      */
  178.     if (flashDosVolDesc) {
  179. return OK;
  180.     }
  181.     if (flashDrvLibInit() == ERROR) {
  182. printf("flashFsLibInit(): flashDrvLibInit() failedn");
  183. return (ERROR);
  184.     }
  185.     /* 
  186.      * Set up BLK DEV structure
  187.      */
  188.     flashBlkDev.bd_blkRd = flashFsBlkRead;
  189.     flashBlkDev.bd_blkWrt = flashFsBlkWrite;
  190.     flashBlkDev.bd_ioctl = flashFsIoctl;
  191.     flashBlkDev.bd_reset = NULL;
  192.     flashBlkDev.bd_statusChk = NULL;
  193.     flashBlkDev.bd_removable = FALSE;
  194.     flashBlkDev.bd_nBlocks = FLASH_FS_SIZE_BLOCKS;
  195.     flashBlkDev.bd_bytesPerBlk = FLASH_FS_BLOCK_SIZE;
  196.     flashBlkDev.bd_blksPerTrack = 1;
  197.     flashBlkDev.bd_nHeads = 1;
  198.     flashBlkDev.bd_retry = 1;
  199.     flashBlkDev.bd_mode = O_RDWR;
  200.     flashBlkDev.bd_readyChanged = FALSE;
  201.     if (flashFsVerbose) {
  202. printf("flashFsLibInit: Initializingn");
  203.     }
  204.     if (!flashDosFormat) {
  205.     flashDosVolDesc = dosFsDevInit(FLASH_FS_NAME, &flashBlkDev, NULL);
  206.     }
  207.     if (flashDosVolDesc == NULL) {
  208. if (flashFsVerbose) {
  209.     printf("nflashFsLibInit: first time initialization...n");
  210. }
  211. if (dosFsMkfsOptionsSet(DOS_OPT_LONGNAMES) == ERROR) {
  212.     printf("flashFsLibInit: dosFsMkfsOptionsSet failedn");
  213. }
  214. flashDosVolDesc = dosFsMkfs(FLASH_FS_NAME, &flashBlkDev);
  215. if (flashDosVolDesc == NULL) {
  216.     printf("flashFsLibInit (first init): dosFsMkfs failed!");
  217.     printf("(0x%x)n", errno);
  218.     return ERROR;
  219. } else {
  220.     if (flashFsVerbose) {
  221. printf("donen");
  222.     }
  223. }
  224.     }
  225.     flashFsSync();
  226.     return OK;
  227. }
  228. STATUS
  229. flashFsSync(void)
  230. {
  231.     if (flashDosVolDesc) {
  232. if (flashFsVerbose) {
  233.     printf("flashFsSync(): Syncing...");
  234. }
  235. flashSyncFilesystem();
  236. if (flashFsVerbose) {
  237.     printf("donen");
  238. }
  239.     }
  240.     return OK;
  241. }