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

VxWorks

开发平台:

C/C++

  1. #include "vxWorks.h"
  2. #include "taskLib.h"
  3. #include "stdlib.h"
  4. #include "stdio.h"
  5. #include "string.h"
  6. #include "ctype.h"
  7. #include "config.h"
  8. #include "flashDrvLib.h"
  9. #ifdef MBZ
  10. #define xor_val 0x3
  11. #else
  12. #define xor_val 0x0
  13. #endif
  14. #define FLASH_ADDR(dev, addr) 
  15.     ((volatile UINT8 *) (((int)(dev) + (int)(addr)) ^ xor_val))
  16. #define FLASH_WRITE(dev, addr, value) 
  17.     (*FLASH_ADDR(dev, addr) = (value))
  18. #define FLASH_READ(dev, addr) 
  19.     (*FLASH_ADDR(dev, addr))
  20. LOCAL void
  21. flashReadReset(void)
  22. {
  23.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x000, 0xff);
  24. }
  25. LOCAL void
  26. flashAutoSelect(FLASH_TYPES *dev, FLASH_VENDORS *vendor)
  27. {
  28.     flashReadReset();
  29.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x000, 0x90);
  30.     *vendor = FLASH_READ(FLASH_BASE_ADDRESS, 0);
  31.     *dev = FLASH_READ(FLASH_BASE_ADDRESS, 2);
  32.     if (flashVerbose) {
  33.         printf("flashAutoSelect(): dev = 0x%x, vendor = 0x%xn",
  34.                (int)*dev, (int)*vendor);
  35.     }
  36.     flashReadReset();
  37.     if ((*dev != FLASH_2F320) || (*vendor != INTEL)) {
  38.         *vendor = *dev = 0xFF;
  39.     }
  40. }
  41. LOCAL int
  42. flashEraseDevices(volatile UINT8 *sectorBasePtr)
  43. {
  44.     int             i;
  45.     unsigned int    tmp = 0;
  46.     if (flashVerbose) {
  47.         printf("Erasing Sector @ 0x%08xn",(UINT32)sectorBasePtr);
  48.     }
  49.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x0, 0xFF);
  50.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x0, 0x50);
  51.     FLASH_WRITE(sectorBasePtr, 0x000, 0x20);
  52.     FLASH_WRITE(sectorBasePtr, 0x000, 0xd0);
  53.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x0, 0x70);
  54.     for (i = 0; i < FLASH_ERASE_TIMEOUT_COUNT; i++) {
  55.         taskDelay(FLASH_ERASE_TIMEOUT_TICKS);
  56.         tmp = FLASH_READ(FLASH_BASE_ADDRESS, 0x0);
  57.         if ((tmp & 0x80) == 0x80) {
  58.             break;
  59.         }
  60.     }
  61.     flashReadReset();
  62.     if ((tmp & 0xa0) != 0x80) {
  63.         printf("flashEraseDevices(): addr 0x%08x erase failedn",
  64.            (int)sectorBasePtr);
  65.         return (ERROR);
  66.     }
  67.     return (OK);
  68. }
  69. LOCAL int
  70. flashEraseSector(int sectorNum)
  71. {
  72.     UINT8 *sectorBasePtr = (UINT8 *)FLASH_SECTOR_ADDRESS(sectorNum);
  73.     if (sectorNum < 0 || sectorNum >= flashSectorCount) {
  74.         printf("flashEraseSector(): Sector %d invalidn", sectorNum);
  75.         return (ERROR);
  76.     }
  77.     if (flashEraseDevices(sectorBasePtr) == ERROR) {
  78.         printf("flashEraseSector(): erase devices failed sector=%dn",
  79.                sectorNum);
  80.         return (ERROR);
  81.     }
  82.     if (flashVerbose)
  83.         printf("flashEraseSector(): Sector %d erasedn", sectorNum);
  84.     return (OK);
  85. }
  86. LOCAL int
  87. flashRead(int sectorNum, char *buff,
  88.     unsigned int offset, unsigned int count)
  89. {
  90.     flashReadReset();
  91.     if (sectorNum < 0 || sectorNum >= flashSectorCount) {
  92.         printf("flashRead(): Illegal sector %dn", sectorNum);
  93.         return (ERROR);
  94.     }
  95.     bcopy((char *)(FLASH_SECTOR_ADDRESS(sectorNum) + offset), buff, count);
  96.     return (0);
  97. }
  98. LOCAL int
  99. flashProgramDevices(volatile UINT8 *addr, UINT8 val)
  100. {
  101.     int             polls;
  102.     unsigned char    tmp;
  103.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x000, 0x50);
  104.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x000, 0xFF);
  105.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x000, 0x40);
  106.     /* FLASH_WRITE(addr, 0x0, val);*/
  107.     *addr = val;
  108.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x000, 0x70);
  109.     for (polls = 0; polls < FLASH_PROGRAM_TIMEOUT_POLLS; polls++) {
  110.         tmp = FLASH_READ(FLASH_BASE_ADDRESS, 0x0);
  111.         if ((tmp & 0x80) == 0x80) {
  112.             break;
  113.         }
  114.     }
  115.     flashReadReset();
  116.     if ((tmp & 0x90) != 0x80) {
  117.         printf("flashProgramDevices(): Address 0x%08x program failedn",
  118.                (int)addr);
  119.         return (ERROR);
  120.     } else {
  121.         return (OK);
  122.     }
  123. }
  124. LOCAL int
  125. flashWrite(int sectorNum, char *buff,
  126.             unsigned int offset, unsigned int count)
  127. {
  128.     UINT8   *curBuffPtr, *flashBuffPtr;
  129.     int             i;
  130.     curBuffPtr = (UINT8 *)buff;
  131.     flashBuffPtr = (UINT8 *)(FLASH_SECTOR_ADDRESS(sectorNum) + offset);
  132.     for (i = 0; i < count; i++) {
  133.         if (flashProgramDevices(flashBuffPtr, *curBuffPtr) == ERROR) {
  134.             printf("flashWrite(): Failed: Sector %d, address 0x%xn",
  135.                sectorNum, (int)flashBuffPtr);
  136.             return (ERROR);
  137.         }
  138.         flashBuffPtr++;
  139.         curBuffPtr++;
  140.     }
  141.     return (0);
  142. }
  143. struct flash_drv_funcs_s flash28f320 = {
  144.     FLASH_2F320, INTEL,
  145.     flashAutoSelect,
  146.     flashEraseSector,
  147.     flashRead,
  148.     flashWrite
  149. };