flash29GL1GDrvLib.c
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /*
  2.  * $Id: flash29GL1GDrvLib.c,v 1.3 Broadcom SDK $
  3.  * $Copyright: Copyright 2008 Broadcom Corporation.
  4.  * This program is the proprietary software of Broadcom Corporation
  5.  * and/or its licensors, and may only be used, duplicated, modified
  6.  * or distributed pursuant to the terms and conditions of a separate,
  7.  * written license agreement executed between you and Broadcom
  8.  * (an "Authorized License").  Except as set forth in an Authorized
  9.  * License, Broadcom grants no license (express or implied), right
  10.  * to use, or waiver of any kind with respect to the Software, and
  11.  * Broadcom expressly reserves all rights in and to the Software
  12.  * and all intellectual property rights therein.  IF YOU HAVE
  13.  * NO AUTHORIZED LICENSE, THEN YOU HAVE NO RIGHT TO USE THIS SOFTWARE
  14.  * IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY BROADCOM AND DISCONTINUE
  15.  * ALL USE OF THE SOFTWARE.  
  16.  *  
  17.  * Except as expressly set forth in the Authorized License,
  18.  *  
  19.  * 1.     This program, including its structure, sequence and organization,
  20.  * constitutes the valuable trade secrets of Broadcom, and you shall use
  21.  * all reasonable efforts to protect the confidentiality thereof,
  22.  * and to use this information only in connection with your use of
  23.  * Broadcom integrated circuit products.
  24.  *  
  25.  * 2.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS
  26.  * PROVIDED "AS IS" AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES,
  27.  * REPRESENTATIONS OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY,
  28.  * OR OTHERWISE, WITH RESPECT TO THE SOFTWARE.  BROADCOM SPECIFICALLY
  29.  * DISCLAIMS ANY AND ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY,
  30.  * NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES,
  31.  * ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
  32.  * CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING
  33.  * OUT OF USE OR PERFORMANCE OF THE SOFTWARE.
  34.  * 
  35.  * 3.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL
  36.  * BROADCOM OR ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL,
  37.  * INCIDENTAL, SPECIAL, INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER
  38.  * ARISING OUT OF OR IN ANY WAY RELATING TO YOUR USE OF OR INABILITY
  39.  * TO USE THE SOFTWARE EVEN IF BROADCOM HAS BEEN ADVISED OF THE
  40.  * POSSIBILITY OF SUCH DAMAGES; OR (ii) ANY AMOUNT IN EXCESS OF
  41.  * THE AMOUNT ACTUALLY PAID FOR THE SOFTWARE ITSELF OR U.S. $1,
  42.  * WHICHEVER IS GREATER. THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING
  43.  * ANY FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY.$
  44.  */
  45. #include "vxWorks.h"
  46. #include "taskLib.h"
  47. #include "stdlib.h"
  48. #include "stdio.h"
  49. #include "string.h"
  50. #include "ctype.h"
  51. #include "config.h"
  52. #include "flashDrvLib.h"
  53. #define xor_val 0x0
  54. #define FLASH_WIDTH     UINT16*
  55. #define FLASH_ADDR(dev, addr) 
  56.     ((volatile UINT16 *) ((FLASH_WIDTH)dev + addr))
  57. #define FLASH_WRITE(dev, addr, value) 
  58.     (*FLASH_ADDR(dev, addr) = (value))
  59. #define FLASH_READ(dev, addr) 
  60.     (*FLASH_ADDR(dev, addr))
  61. LOCAL void
  62. flashReadReset(void)
  63. {
  64.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0xf0);
  65. }
  66. LOCAL void
  67. flashAutoSelect(FLASH_TYPES *dev, FLASH_VENDORS *vendor)
  68. {
  69.     flashReadReset();   
  70.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0xaa);
  71.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x2aa, 0x55);
  72.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0x90);
  73.     *vendor = FLASH_READ(FLASH_BASE_ADDRESS, 0);
  74.     *vendor = FLASH_READ(FLASH_BASE_ADDRESS, 0);
  75.     *dev = FLASH_READ(FLASH_BASE_ADDRESS, 1);
  76.     if (flashVerbose)
  77.         printf("flashAutoSelect(): dev = 0x%x, vendor = 0x%xn",
  78.                (int)*dev, (int)*vendor);
  79.     flashReadReset();   
  80.     if ((*dev != FLASH_29GL1G) || (*vendor != AMD)) {
  81.         *vendor = *dev = 0xFF;
  82.     }
  83. }
  84. LOCAL int
  85. flashEraseDevices(volatile unsigned char *sectorBasePtr)
  86. {
  87.     int             i;
  88.     unsigned int    tmp;
  89.     if (flashVerbose) {
  90.         printf("Erasing Sector @ 0x%08xn",(unsigned int)sectorBasePtr);
  91.     }
  92.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0xaa);
  93.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x2aa, 0x55);
  94.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0x80);
  95.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0xaa);
  96.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x2aa, 0x55);
  97.     FLASH_WRITE(sectorBasePtr, 0x0, 0x30);
  98.     for (i = 0; i < FLASH_ERASE_TIMEOUT_COUNT; i++) {
  99.         taskDelay(FLASH_ERASE_TIMEOUT_TICKS);
  100.         tmp = FLASH_READ(sectorBasePtr, 0x0);
  101.         if ((tmp & 0x80) == 0x80) {
  102.             if (flashVerbose > 1)
  103.                 printf("flashEraseDevices(): all devices erasedn");
  104.             return (OK);
  105.         }
  106.     }
  107.     if ((tmp & 0x20) == 0x20) {
  108.         printf("flashEraseDevices(): addr 0x%08x erase failedn",
  109.            (int)sectorBasePtr);
  110.     } else {
  111.         printf("flashEraseDevices(): addr 0x%08x erase timed outn",
  112.            (int)sectorBasePtr);
  113.     }
  114.     flashReadReset();
  115.     return (ERROR);
  116. }
  117. LOCAL int
  118. flashEraseSector(int sectorNum)
  119. {
  120.     unsigned char   *sectorBasePtr =
  121. (unsigned char *)FLASH_SECTOR_ADDRESS(sectorNum);
  122.     if (sectorNum < 0 || sectorNum >= flashSectorCount) {
  123.         printf("flashEraseSector(): Sector %d invalidn", sectorNum);
  124.         return (ERROR);
  125.     }
  126.     if (flashEraseDevices(sectorBasePtr) == ERROR) {
  127.         printf("flashEraseSector(): erase devices failed sector=%dn",
  128.                sectorNum);
  129.         return (ERROR);
  130.     }
  131.      if (flashVerbose)
  132.         printf("flashEraseSector(): Sector %d erasedn", sectorNum);
  133.     return (OK);
  134. }
  135. LOCAL int
  136. flashRead(int sectorNum, char *buff, unsigned int offset, unsigned int count)
  137. {
  138.     if (sectorNum < 0 || sectorNum >= flashSectorCount) {
  139.         printf("flashRead(): Illegal sector %dn", sectorNum);
  140.         return (ERROR);
  141.     }
  142.     bcopy((char *)(FLASH_SECTOR_ADDRESS(sectorNum) + offset), buff, count);
  143.     return (0);
  144. }
  145. LOCAL int
  146. flashProgramDevices(volatile unsigned short *addr, unsigned short val)
  147. {
  148.     int             polls;
  149.     unsigned char    tmp;
  150.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0xaa);
  151.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x2aa, 0x55);
  152.     FLASH_WRITE(FLASH_BASE_ADDRESS, 0x555, 0xa0);
  153.     /* FLASH_WRITE(addr, 0x0, val);*/
  154.     *addr = val;
  155.     for (polls = 0; polls < FLASH_PROGRAM_TIMEOUT_POLLS; polls++) {
  156.         tmp = *addr;
  157.         if ((tmp & 0x80) == (val & 0x80)) {
  158.             if (flashVerbose > 2)
  159.                 printf("flashProgramDevices(): devices programmedn");
  160.             return (OK);
  161.         }
  162.     }
  163.     if ((tmp & 0x20) != 0) {
  164. /* 
  165.  * We've already waited so long that chances are nil that the
  166.  * 0x80 bits will change again.  Don't bother re-checking them.
  167.  */
  168. printf("flashProgramDevices(): Address 0x%08x program failedn",
  169.        (int)addr);
  170.     } else {
  171.         printf("flashProgramDevices(): timed outn");
  172.     }
  173.     flashReadReset();
  174.     return (ERROR);
  175. }
  176. LOCAL int
  177. flashWrite(int sectorNum, char *buff, unsigned int offset, unsigned int count)
  178. {
  179.     unsigned short *curBuffPtr, *flashBuffPtr;
  180.     int             i;
  181.     curBuffPtr = (unsigned short *)buff;
  182.     flashBuffPtr = (unsigned short *)(FLASH_SECTOR_ADDRESS(sectorNum) + offset);
  183.     count = (count + 1)/2;
  184.     for (i = 0; i < count; i++) {
  185.         if (flashProgramDevices(flashBuffPtr, *curBuffPtr) == ERROR) {
  186.             printf("flashWrite(): Failed: Sector %d, address 0x%xn",
  187.                sectorNum, (int)flashBuffPtr);
  188.             return (ERROR);
  189.         }
  190.         flashBuffPtr++;
  191.         curBuffPtr++;
  192.     }
  193.     return (0);
  194. }
  195. struct flash_drv_funcs_s flash29GL1G = {
  196.     FLASH_29GL1G, AMD,
  197.     flashAutoSelect,
  198.     flashEraseSector,
  199.     flashRead,
  200.     flashWrite
  201. };