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

VxWorks

开发平台:

C/C++

  1. /*
  2.  * $Id: flashDrvLib.c,v 1.2 Broadcom SDK $
  3.  * $Copyright: (c) 2001-2003, 2004 Broadcom Corp.
  4.  * All Rights Reserved.$
  5.  *
  6.  * File:    flashDrvLib.c
  7.  */
  8. #include "vxWorks.h"
  9. #include "taskLib.h"
  10. #include "stdlib.h"
  11. #include "stdio.h"
  12. #include "string.h"
  13. #include "ctype.h"
  14. #include "config.h"
  15. #include "flashDrvLib.h"
  16. #define TOTAL_LOADED_SECS  3
  17. int             flashVerbose = 0; /* DEBUG */
  18. unsigned int    flashBaseAddress = 0;
  19. int             flashSize = 0x200000;
  20. int             flashDevSectorSize = 0x10000;
  21. int             flashSectorCount = 0;
  22. LOCAL struct flash_drv_funcs_s *flashDrvFuncs = &flash28f320;
  23. LOCAL struct flashLoadedSectorInfo {
  24.     SEM_ID fsSemID;
  25.     int   sector;
  26.     int   dirty;
  27.     char *buffer;
  28. } flashLoadedSectors[TOTAL_LOADED_SECS];
  29. #define FS_CACHE_LOCK(_x_) 
  30.     semTake(flashLoadedSectors[(_x_)].fsSemID, WAIT_FOREVER)
  31. #define FS_CACHE_UNLOCK(_x_) 
  32.     semGive(flashLoadedSectors[(_x_)].fsSemID)
  33. LOCAL int
  34. flashFlushLoadedSector(int number)
  35. {
  36.     if (flashLoadedSectors[number].sector < 0 ||
  37.         !flashLoadedSectors[number].dirty) {
  38.         if (flashVerbose)
  39.             printf("flashFlushLoadedSector(%d): not dirtyn", number);
  40.         return (OK);
  41.     }
  42.     if (flashVerbose) {
  43.         printf("flashFlushLoadedSector(%d): Flushing %dn", number,
  44.                 flashLoadedSectors[number].sector);
  45.     }
  46.     if (flashDrvFuncs->flashEraseSector(flashLoadedSectors[number].sector)==ERROR) {
  47.         return (ERROR);
  48.     }
  49.     if (flashDrvFuncs->flashWrite(flashLoadedSectors[number].sector,
  50.             flashLoadedSectors[number].buffer, 0, FLASH_SECTOR_SIZE) == ERROR) {
  51.         return (ERROR);
  52.     }
  53.     if (flashVerbose) {
  54.         printf("                           Flushing %d donen",
  55.                 flashLoadedSectors[number].sector);
  56.     }
  57.     flashLoadedSectors[number].sector = -1;
  58.     flashLoadedSectors[number].dirty = 0;
  59.     return (OK);
  60. }
  61. int
  62. flashDrvLibInit(void)
  63. {
  64.     FLASH_TYPES     dev;
  65.     FLASH_VENDORS   vendor;
  66.     int i;
  67.     flashBaseAddress = FLASH_BASE_ADDRESS_FLASH_BOOT;
  68.     flashDrvFuncs = &flash29l160;
  69.     flashDrvFuncs->flashAutoSelect(&dev, &vendor);
  70.     if ((vendor == 0xFF) && (dev == 0xFF)) {
  71.         flashDrvFuncs = &flash28f320;
  72.         flashDrvFuncs->flashAutoSelect(&dev, &vendor);
  73.     }
  74.     switch (vendor) {
  75.         case AMD:
  76.         case ALLIANCE:
  77.         switch (dev) {
  78.             case FLASH_2F040:
  79.                 flashSectorCount = 8;
  80.                 flashDevSectorSize = 0x10000;
  81.                 if (flashVerbose)
  82.                     printf("flashInit(): 2F040 Foundn");
  83.                 break;
  84.             case FLASH_2F080:
  85.                 flashSectorCount = 16;
  86.                 flashDevSectorSize = 0x10000;
  87.                 if (flashVerbose)
  88.                     printf("flashInit(): 2F080 Foundn");
  89.                 break;
  90.             case FLASH_2L081:
  91.                 flashSectorCount = 16;
  92.                 flashDevSectorSize = 0x10000;
  93.                 if (flashVerbose)
  94.                     printf("flashInit(): 29LV081B Foundn");
  95.                 break;
  96.             case FLASH_2L160:
  97.             case FLASH_2L017:
  98.                 flashSectorCount = 32;
  99.                 flashDevSectorSize = 0x10000;
  100.                 if (flashVerbose)
  101.                     printf("flashInit(): 29LV160D Foundn");
  102.                 break;
  103.             default:
  104.                 printf("flashInit(): Unrecognized Device (0x%02X)n", dev);
  105.                 return (ERROR);
  106.         }
  107.         break;
  108.         case INTEL:
  109.         switch (dev) {
  110.             case FLASH_2F320:
  111.                 flashSectorCount = 32;
  112.                 flashDevSectorSize = 0x20000;
  113.                 if (flashVerbose)
  114.                     printf("flashInit(): 28F320 Foundn");
  115.                 break;
  116.             default:
  117.                 printf("flashInit(): Unrecognized Device (0x%02X)n", dev);
  118.                 return (ERROR);
  119.         }
  120.         break;
  121.         default:
  122.             printf("flashInit(): Unrecognized Vendor (0x%02X)n", vendor);
  123.             return (ERROR);
  124.     }
  125.     flashSize = flashDevSectorSize * flashSectorCount;
  126.     for (i = 0; i < TOTAL_LOADED_SECS; i++) {
  127.         flashLoadedSectors[i].buffer = malloc(FLASH_SECTOR_SIZE);
  128.         if (flashLoadedSectors[i].buffer == NULL) {
  129.             printf("flashInit(): malloc() failedn");
  130.             for (; i > 0; i--) {
  131.                 free(flashLoadedSectors[i-1].buffer);
  132.             }
  133.             return (ERROR);
  134.         }
  135.         flashLoadedSectors[i].sector = -1;
  136.         flashLoadedSectors[i].dirty = 0;
  137.         flashLoadedSectors[i].fsSemID =
  138.             semMCreate (SEM_Q_PRIORITY | SEM_DELETE_SAFE);
  139.     }
  140.     return (OK);
  141. }
  142. int
  143. flashGetSectorCount(void)
  144. {
  145.     return (flashSectorCount);
  146. }
  147. int
  148. flashEraseBank(int firstSector, int nSectors)
  149. {
  150.     int             sectorNum, errCnt = 0;
  151.     if (firstSector < 0 || firstSector + nSectors > flashSectorCount) {
  152.         printf("flashEraseBank(): Illegal parms %d, %dn",
  153.            firstSector, nSectors);
  154.         return ERROR;
  155.     }
  156.     for (sectorNum = firstSector;
  157.          sectorNum < firstSector + nSectors; sectorNum++) {
  158.          printf(".");
  159.         if (flashDrvFuncs->flashEraseSector(sectorNum))
  160.             errCnt++;
  161.     }
  162.     printf("n");
  163.     if (errCnt)
  164.         return (ERROR);
  165.     else
  166.         return (OK);
  167. }
  168. int
  169. flashBlkRead(int sectorNum, char *buff,
  170.          unsigned int offset, unsigned int count)
  171. {
  172.     int i;
  173.     if (sectorNum < 0 || sectorNum >= flashSectorCount) {
  174.         printf("flashBlkRead(): Sector %d invalidn", sectorNum);
  175.         return (ERROR);
  176.     }
  177.     if (offset < 0 || offset >= FLASH_SECTOR_SIZE) {
  178.         printf("flashBlkRead(): Offset 0x%x invalidn", offset);
  179.         return (ERROR);
  180.     }
  181.     if (count < 0 || count > FLASH_SECTOR_SIZE - offset) {
  182.         printf("flashBlkRead(): Count 0x%x invalidn", count);
  183.         return (ERROR);
  184.     }
  185.     /*
  186.      * If the sector is loaded, read from it.  Else, read from the
  187.      * flash itself (slower).
  188.      */
  189.     for (i = 0; i < TOTAL_LOADED_SECS; i++) {
  190.         if (flashLoadedSectors[i].sector == sectorNum) {
  191.             if (flashVerbose)
  192.                 printf("flashBlkRead(): from loaded sector %dn", sectorNum);
  193.             bcopy(&flashLoadedSectors[i].buffer[offset], buff, count);
  194.             return (OK);
  195.         }
  196.     }
  197.     flashDrvFuncs->flashRead(sectorNum, buff, offset, count);
  198.     return (OK);
  199. }
  200. LOCAL int
  201. flashCheckCanProgram(int sectorNum, unsigned int offset, unsigned int count)
  202. {
  203.     unsigned char   *flashBuffPtr;
  204.     int             i;
  205.     flashBuffPtr = (unsigned char *)(FLASH_SECTOR_ADDRESS(sectorNum) + offset);
  206.     for (i = 0; i < count; i++) {
  207.         if (flashBuffPtr[i] != 0xff)
  208.             return (ERROR);
  209.     }
  210.     return (OK);
  211. }
  212. int
  213. flashBlkWrite(int sectorNum, char *buff,
  214.           unsigned int offset, unsigned int count)
  215. {
  216.     char *save;
  217.     int i;
  218.     if (sectorNum < 0 || sectorNum >= flashSectorCount) {
  219.         printf("flashBlkWrite(): Sector %d invalidn", sectorNum);
  220.         return (ERROR);
  221.     }
  222.     if (offset < 0 || offset >= FLASH_SECTOR_SIZE) {
  223.         printf("flashBlkWrite(): Offset 0x%x invalidn", offset);
  224.         return (ERROR);
  225.     }
  226.     /* 
  227.      * Count must be within range and must be a long word multiple, as
  228.      * we always program long words.
  229.      */
  230.     if ((count < 0) || 
  231.         (count > ((flashSectorCount - sectorNum) * FLASH_SECTOR_SIZE - offset))) {
  232.         printf("flashBlkWrite(): Count 0x%x invalidn", count);
  233.         return (ERROR);
  234.     }
  235.     /*
  236.      * If the Sector is loaded, write it to buffer.  Else check to see
  237.      * if we can program the sector; if so, program it.  Else, flush the
  238.      * first loaded sector (if loaded and dirty), push loaded sectors
  239.      * up by one, load the new one and copy the data into the last one.
  240.      */
  241.     for (i = 0; i < TOTAL_LOADED_SECS; i++) {
  242.         FS_CACHE_LOCK(i);
  243.         if (flashLoadedSectors[i].sector == sectorNum) {
  244.             if (flashVerbose)
  245.                 printf("%d ", sectorNum);
  246.             bcopy(buff, &flashLoadedSectors[i].buffer[offset], count);
  247.             flashLoadedSectors[i].dirty = 1;
  248.             FS_CACHE_UNLOCK(i);
  249.             return (OK);
  250.         }
  251.         FS_CACHE_UNLOCK(i);
  252.     }
  253.     if (flashCheckCanProgram(sectorNum, offset, count) != ERROR) {
  254.         return (flashDrvFuncs->flashWrite(sectorNum, buff, offset, count));
  255.     }
  256.     FS_CACHE_LOCK(0);
  257.     if (flashFlushLoadedSector(0) == ERROR) {
  258.         FS_CACHE_UNLOCK(0);
  259.         return (ERROR);
  260.     }
  261.     FS_CACHE_UNLOCK(0);
  262.     save = flashLoadedSectors[0].buffer;
  263.     for (i = 1; i < TOTAL_LOADED_SECS; i++) {
  264.         FS_CACHE_LOCK(i-1);
  265.         flashLoadedSectors[i-1].sector = flashLoadedSectors[i].sector;
  266.         flashLoadedSectors[i-1].dirty  = flashLoadedSectors[i].dirty;
  267.         flashLoadedSectors[i-1].buffer = flashLoadedSectors[i].buffer;
  268.         FS_CACHE_UNLOCK(i-1);
  269.     }
  270.     i--;
  271.     flashLoadedSectors[i].buffer = save;
  272.     FS_CACHE_LOCK(i);
  273.     if (flashDrvFuncs->flashRead(sectorNum, flashLoadedSectors[i].buffer,
  274.                                  0, FLASH_SECTOR_SIZE) == ERROR) {
  275.         flashLoadedSectors[i].sector = -1;
  276.         FS_CACHE_UNLOCK(i);
  277.         return (ERROR);
  278.     }
  279.     flashLoadedSectors[i].sector = sectorNum;
  280.     bcopy(buff, &flashLoadedSectors[i].buffer[offset], count);
  281.     flashLoadedSectors[i].dirty = 1;
  282.     FS_CACHE_UNLOCK(i);
  283.     if (flashVerbose) {
  284.         printf("flashBlkWrite(): load %d (and write to cache only)n", sectorNum);
  285.         printf("%d ", sectorNum);
  286.     }
  287.     return (OK);
  288. }
  289. int
  290. flashDiagnostic(void)
  291. {
  292.     unsigned int   *flashSectorBuff;
  293.     int             sectorNum, i;
  294.     /*
  295.      * Probe flash; allocate flashLoadedSector Buffer
  296.      */
  297.     flashDrvLibInit();        /* Probe; clear loaded sector */
  298.     flashSectorBuff = (unsigned int *) flashLoadedSectors[0].buffer;
  299.     if (flashVerbose)
  300.         printf("flashDiagnostic(): Executing. Erasing %d Sectorsn",
  301.                 flashSectorCount);
  302.     if (flashEraseBank(0, flashSectorCount) == ERROR) {
  303.     if (flashVerbose)
  304.         printf("flashDiagnostic(): flashEraseBank() #1 failedn");
  305.     return (ERROR);
  306.     }
  307.     /* Write unique counting pattern to each sector. */
  308.     for (sectorNum = 0; sectorNum < flashSectorCount; sectorNum++) {
  309.     if (flashVerbose)
  310.         printf("flashDiagnostic(): writing sector %dn", sectorNum);
  311.     for (i = 0; i < FLASH_SECTOR_SIZE / sizeof (unsigned int); i++)
  312.         flashSectorBuff[i] = (i + sectorNum);
  313.     if (flashDrvFuncs->flashWrite(sectorNum, (char *)flashSectorBuff,
  314.                0, FLASH_SECTOR_SIZE) == ERROR) {
  315.         if (flashVerbose)
  316.         printf("flashDiagnostic(): flashWrite() failed on %dn",
  317.                sectorNum);
  318.         return (ERROR);
  319.     }
  320.     }
  321.     /* Verify each sector. */
  322.     for (sectorNum = 0; sectorNum < flashSectorCount; sectorNum++) {
  323.     if (flashVerbose)
  324.         printf("flashDiagnostic(): verifying sector %dn", sectorNum);
  325.     if (flashDrvFuncs->flashRead(sectorNum, (char *)flashSectorBuff,
  326.               0, FLASH_SECTOR_SIZE) == ERROR) {
  327.         if (flashVerbose)
  328.         printf("flashDiagnostic(): flashRead() failed on %dn",
  329.                sectorNum);
  330.         return (ERROR);
  331.     }
  332.     for (i = 0; i < FLASH_SECTOR_SIZE / sizeof (unsigned int); i++) {
  333.         if (flashSectorBuff[i] != (i + sectorNum)) {
  334.         if (flashVerbose) {
  335.             printf("flashDiagnostic(): verification failedn");
  336.             printf("flashDiagnostic(): sector %d, offset 0x%xn",
  337.                sectorNum, (i * sizeof(unsigned int)));
  338.             printf("flashDiagnostic(): expected 0x%x, got 0x%xn",
  339.                (i + sectorNum), (int)flashSectorBuff[i]);
  340.         }
  341.         return (ERROR);
  342.         }
  343.     }
  344.     }
  345.     if (flashEraseBank(0, flashSectorCount) == ERROR) {
  346.     if (flashVerbose)
  347.         printf("flashDiagnostic(): flashEraseBank() #2 failedn");
  348.         return (ERROR);
  349.     }
  350.     if (flashVerbose)
  351.         printf("flashDiagnostic(): Completed without errorn");
  352.     return (OK);
  353. }
  354. int
  355. flashSyncFilesystem(void)
  356. {
  357.     int i;
  358.     for (i = 0; i < TOTAL_LOADED_SECS; i++) {
  359.         FS_CACHE_LOCK(i);
  360.         if (flashFlushLoadedSector(i) != OK) {
  361.             FS_CACHE_UNLOCK(i);
  362.             return (ERROR);
  363.         }
  364.         FS_CACHE_UNLOCK(i);
  365.     }
  366.     return (OK);
  367. }