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

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. extern struct flash_drv_funcs_s flash29l160;
  21. LOCAL void
  22. flashReadReset(void)
  23. {
  24.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0xaaa, 0xf0);
  25. }
  26. LOCAL void
  27. flashAutoSelect(FLASH_TYPES *dev, FLASH_VENDORS *vendor)
  28. {
  29.     flashReadReset();   
  30.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0xaaa, 0xaa);
  31.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0x55);
  32.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0xaaa, 0x90);
  33.     *vendor = FLASH_READ(FLASH_BASE_ADDRESS, 0);
  34.     *dev = FLASH_READ(FLASH_BASE_ADDRESS, 2);
  35.     if (flashVerbose)
  36.         printf("flashAutoSelect(): dev = 0x%x, vendor = 0x%xn",
  37.                (int)*dev, (int)*vendor);
  38.     flashReadReset();   
  39.     if ((*dev != FLASH_2L160) || ((*vendor != AMD) && (*vendor != ALLIANCE))) {
  40.         *vendor = *dev = 0xFF;
  41.     }
  42. }
  43. LOCAL int
  44. flashEraseDevices(volatile unsigned char *sectorBasePtr)
  45. {
  46.     int             i;
  47.     unsigned int    tmp;
  48.     if (flashVerbose) {
  49.         printf("Erasing Sector @ 0x%08xn",(unsigned int)sectorBasePtr);
  50.     }
  51.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0xaaa, 0xaa);
  52.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0x55);
  53.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0xaaa, 0x80);
  54.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0xaaa, 0xaa);
  55.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0x55);
  56.     FLASH_WRITE(sectorBasePtr, 0x0, 0x30);
  57.     for (i = 0; i < FLASH_ERASE_TIMEOUT_COUNT; i++) {
  58.         taskDelay(FLASH_ERASE_TIMEOUT_TICKS);
  59.         tmp = FLASH_READ(sectorBasePtr, 0x0);
  60.         if ((tmp & 0x80) == 0x80) {
  61.             if (flashVerbose > 1)
  62.                 printf("flashEraseDevices(): all devices erasedn");
  63.             return (OK);
  64.         }
  65.     }
  66.     if ((tmp & 0x20) == 0x20) {
  67.         printf("flashEraseDevices(): addr 0x%08x erase failedn",
  68.            (int)sectorBasePtr);
  69.     } else {
  70.         printf("flashEraseDevices(): addr 0x%08x erase timed outn",
  71.            (int)sectorBasePtr);
  72.     }
  73.     flashReadReset();
  74.     return (ERROR);
  75. }
  76. LOCAL int
  77. flashEraseSector(int sectorNum)
  78. {
  79.     unsigned char   *sectorBasePtr =
  80. (unsigned char *)FLASH_SECTOR_ADDRESS(sectorNum);
  81.     if (sectorNum < 0 || sectorNum >= flashSectorCount) {
  82.         printf("flashEraseSector(): Sector %d invalidn", sectorNum);
  83.         return (ERROR);
  84.     }
  85.     if (flashEraseDevices(sectorBasePtr) == ERROR) {
  86.         printf("flashEraseSector(): erase devices failed sector=%dn",
  87.                sectorNum);
  88.         return (ERROR);
  89.     }
  90.     /* Boot Sectored devices need multiple erases in sector 0 Sector 0 is
  91.      * broken up into 16k, 8k, 8k, 32k sub sectors. Each one must have an
  92.      * erase issued in that sub sector to erase all of logical sector 0. */
  93.     if (sectorNum == 0) {
  94.         if (flashEraseDevices(sectorBasePtr + 0x4000) == ERROR) {
  95.             printf("flashEraseSector(): erase devices failed sector=0.1n");
  96.             return (ERROR);
  97.         }
  98.         if (flashEraseDevices(sectorBasePtr + 0x6000) == ERROR) {
  99.             printf("flashEraseSector(): erase devices failed sector=0.2n");
  100.             return (ERROR);
  101.         }
  102.         if (flashEraseDevices(sectorBasePtr + 0x8000) == ERROR) {
  103.             printf("flashEraseSector(): erase devices failed sector=0.3n");
  104.             return (ERROR);
  105.         }
  106.     }
  107.     if (flashVerbose)
  108.         printf("flashEraseSector(): Sector %d erasedn", sectorNum);
  109.     return (OK);
  110. }
  111. LOCAL int
  112. flashRead(int sectorNum, char *buff, unsigned int offset, unsigned int count)
  113. {
  114.     if (sectorNum < 0 || sectorNum >= flashSectorCount) {
  115.         printf("flashRead(): Illegal sector %dn", sectorNum);
  116.         return (ERROR);
  117.     }
  118.     bcopy((char *)(FLASH_SECTOR_ADDRESS(sectorNum) + offset), buff, count);
  119.     return (0);
  120. }
  121. LOCAL int
  122. flashProgramDevices(volatile unsigned char *addr, unsigned char val)
  123. {
  124.     int             polls;
  125.     unsigned char    tmp;
  126.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0xaaa, 0xaa);
  127.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0x55);
  128.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0xaaa, 0xa0);
  129.     /* FLASH_WRITE(addr, 0x0, val);*/
  130.     *addr = val;
  131.     for (polls = 0; polls < FLASH_PROGRAM_TIMEOUT_POLLS; polls++) {
  132.         tmp = *addr;
  133.         if ((tmp & 0x80) == (val & 0x80)) {
  134.             if (flashVerbose > 2)
  135.                 printf("flashProgramDevices(): devices programmedn");
  136.             return (OK);
  137.         }
  138.     }
  139.     if ((tmp & 0x20) != 0) {
  140. /* 
  141.  * We've already waited so long that chances are nil that the
  142.  * 0x80 bits will change again.  Don't bother re-checking them.
  143.  */
  144. printf("flashProgramDevices(): Address 0x%08x program failedn",
  145.        (int)addr);
  146.     } else {
  147.         printf("flashProgramDevices(): timed outn");
  148.     }
  149.     flashReadReset();
  150.     return (ERROR);
  151. }
  152. LOCAL int
  153. flashWrite(int sectorNum, char *buff, unsigned int offset, unsigned int count)
  154. {
  155.     unsigned char   *curBuffPtr, *flashBuffPtr;
  156.     int             i;
  157.     curBuffPtr = (unsigned char *)buff;
  158.     flashBuffPtr = (unsigned char *)(FLASH_SECTOR_ADDRESS(sectorNum) + offset);
  159.     for (i = 0; i < count; i++) {
  160.         if (flashProgramDevices(flashBuffPtr, *curBuffPtr) == ERROR) {
  161.             printf("flashWrite(): Failed: Sector %d, address 0x%xn",
  162.                sectorNum, (int)flashBuffPtr);
  163.             return (ERROR);
  164.         }
  165.         flashBuffPtr++;
  166.         curBuffPtr++;
  167.     }
  168.     return (0);
  169. }
  170. struct flash_drv_funcs_s flash29l160 = {
  171.     FLASH_2L160, AMD,
  172.     flashAutoSelect,
  173.     flashEraseSector,
  174.     flashRead,
  175.     flashWrite
  176. };