⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash_initialise.c

📁 s1mp3 sdk, action mp3 develop tool kit!
💻 C
字号:
/*! \addtogroup Flash **/
/*@{*/

/**

  \file flash_initialise.c
  \name Flash Initialise

**/

#include "drivers\flash.h"
#include "ATJ2085_Ports.h"
#include "flash_defs.h"

unsigned char FLASH_NandFlashTypeCE1 = 0;
unsigned char FLASH_FlashBank_low;
unsigned char FLASH_FlashBank_High;

unsigned char FLASH_ManufacturerID = 0;
unsigned char FLASH_DeviceID = 0;
unsigned char FLASH_PageSize = 0;


/*!******************************************************************************/
void ReadStatusNANDFlash( void )
/*!
** \brief
**
** \param
**
** \return  in a
**           FLASH_STATUS_OK               (0x00) Flash OK
**           FLASH_STATUS_WRITE_PROTECTED  (0x02) Write Protected
**           FLASH_STATUS_ERROR            (0x03) Error
**
** \author  Aaron Blanchard
** \date    26/01/2006
**
*********************************************************************************/
{
#asm
    push    de
    ld      a, 0x60
ReadStatusNANDFlash_Delay:
    dec     a
    jr      nz, ReadStatusNANDFlash_Delay

    ld      a, FLASH_COMMAND_READ_STATUS_REGISTER
    out     (NAND_CMD_REG),a
    ld      d, a
ReadStatusNANDFlash_BusyWait:
    ld      a, (0x8002)
    bit     FLASH_STATUS_BLOCK_READ_READY, a
    jr      nz, ReadStatusNANDFlash_Ready
    dec     de
    ld      a, d
    or      e
    jr      nz, ReadStatusNANDFlash_BusyWait
ReadStatusNANDFlash_Error:
    ld      a, FLASH_COMMAND_RESET
    out     (NAND_CMD_REG), a
    ld      a, FLASH_STATUS_ERROR
    jr      ReadStatusNANDFlash_Exit

ReadStatusNANDFlash_WriteProtected:
    ld      a, FLASH_STATUS_WRITE_PROTECTED
    jr      ReadStatusNANDFlash_Exit

ReadStatusNANDFlash_Ready:
    ld      a, (0x8123)
    bit     0, a
    jr      nz, ReadStatusNANDFlash_Error
    rla                                                     ; If bit7 == 0 then write protected
    jr      nc, ReadStatusNANDFlash_WriteProtected
    xor     a
ReadStatusNANDFlash_Exit:
    pop     de
#endasm
}


/*!******************************************************************************/
void ResetNANDFlash( void )
/*!
** \brief   Reset the NAND Flash
**
** \param
**
** \return  in a
**           FLASH_STATUS_OK               (0x00) Flash OK
**           FLASH_STATUS_WRITE_PROTECTED  (0x02) Write Protected
**           FLASH_STATUS_ERROR            (0x03) Error
**
** \author  Aaron Blanchard
** \date    26/01/2006
**
*********************************************************************************/
{
#asm
    ld      a, FLASH_COMMAND_RESET
    out     (NAND_CMD_REG), a
    call    _ReadStatusNANDFlash
    push    af
    ld      a, FLASH_COMMAND_DISABLE
    out     (NAND_CMD_REG), a
    pop     af
#endasm
}


/*!******************************************************************************/
void DisableNANDFlash( void )
/*!
** \brief   Disable the NAND Flash
**
** \param
**
** \return
**
** \author  Aaron Blanchard
** \date    26/01/2006
**
*********************************************************************************/
{
#asm
    push    af
    ld      a, FLASH_COMMAND_DISABLE
    out     (NAND_CMD_REG),a
    xor     a
    out     (NAND_ENABLE_REG), a
    out     (NAND_CEMODE_REG), a
    ld      a, (_FLASH_FlashBank_low)
    out     (EM_PAGE_LO_REG), a
    ld      a, (_FLASH_FlashBank_high)
    out     (EM_PAGE_HI_REG), a
    ei
    pop     af
#endasm
}


/*!******************************************************************************/
void EnableNANDFlashBank( void )
/*!
** \brief   Enable the NAND Flash
**
** \param   reg b - which flash bank to enable
**
** \return
**
** \author  Aaron Blanchard
** \date    26/01/2006
**
*********************************************************************************/
{
#asm
    di
    in      a, (EM_PAGE_LO_REG)
    ld      (_FLASH_FlashBank_low), a
    in      a, (EM_PAGE_HI_REG)
    ld      (_FLASH_FlashBank_high), a
    xor     a
    out     (EM_PAGE_LO_REG), a
    ld      a, b
    add     a, a
    add     a, a
    add     a, a
    out     (EM_PAGE_HI_REG), a
    ld      a, NAND_CEMODE_FLASH_TYPE
    out     (NAND_CEMODE_REG), a
EnableNANDFlashBank_Loop:
    add     a, a
    djnz    EnableNANDFlashBank_Loop
    out     (NAND_ENABLE_REG), a
#endasm
}


/*!******************************************************************************/
void ReadFlashID ( void )
/*!
** \brief   Read the Flash ID of the specified bank
**
** \param   None
**
** \return  reg b - Manufacturer Code
**              c - Device ID
**              d - Don't care Register
**              e - Page size, Block size etc.
**
** \author  Aaron Blanchard
** \date    26/01/2006
**
*********************************************************************************/
{
#asm
    ld      a,FLASH_COMMAND_READID
    jr      ReadFlashID_Start

ReadFlashID_ToshibaExtended:
    ld      a,FLASH_COMMAND_READID_TOSHIBA_EXTENDED
ReadFlashID_Start:                                  
    push    hl
    ld      h,80h                                       ; 0x8000 is where to read the ID from
    out     (NAND_CMD_REG),a
    ld      b,60h                                       ; Small delay
ReadFlashID_Delay:                                  
    djnz    ReadFlashID_Delay
    ld      a,(hl)
    ld      b,a                                         ; Manufacturer Code
    ld      (_FLASH_ManufacturerID),a
    ld      a,(hl)
    ld      c,a                                         ; Device ID
    ld      (_FLASH_DeviceID),a
    ld      a,(hl)
    ld      d,a                                         ; Do not Care
    ld      a,(hl)
    ld      e,a                                         ; Page size, Block size,
    ld      (_FLASH_PageSize),a
    pop     hl
#endasm
}


/*!******************************************************************************/
void DetermineFlashType ( void )
/*!
** \brief   Determine the flash type in the specified bank
**
** \param   reg b - which flash bank to enable
**
** \return  reg a -
**              FLASH_TYPE_ERROR (0xff) Unknown Flash Type or error
**              0x00  Single density flash
**              0x01
**              0x02  Dual density flash, double the amount of blocks in hl
**          ret hl -
**              Number of Blocks?
**
** \author  Aaron Blanchard
** \date    26/01/2006
**
*********************************************************************************/
{
#asm
    push    bc
    push    de
    call    _EnableNANDFlashBank
    call    _ResetNANDFlash
    cp      FLASH_STATUS_ERROR
    jp      z, DetermineFlashType_Exit
    call    _ReadFlashID
    ld      a, b
    cp      FLASH_TYPE_TOSHIBA
    jr      z, DetermineFlashType_ToshibaCheck
    cp      FLASH_TYPE_SAMSUNG
    jr      z, DetermineFlashType_Generic_Check
    cp      FLASH_TYPE_HYNIX
    jr      z, DetermineFlashType_Generic_Check
    cp      FLASH_TYPE_STMICRO
    jr      z, DetermineFlashType_Generic_Check
    jp      DetermineFlashType_ErrorUnknownFlash

DetermineFlashType_ToshibaCheck:
    ld      a, c
    cp      FLASH_TYPE_32Mbyte
    jp      z, DetermineFlashType_Toshiba32MByte
    cp      FLASH_TYPE_64Mbyte
    jp      z, DetermineFlashType_Toshiba64MByte
    cp      FLASH_TYPE_128Mbyte
    jp      z, DetermineFlashType_Tosh128MB
    cp      FLASH_TYPE_128Mbyte2
    jp      z, DetermineFlashType_Tosh128MB2
    cp      FLASH_TYPE_256Mbyte2
    jp      z, DetermineFlashType_Toshiba256MByte
    jp      DetermineFlashType_ErrorUnknownFlash
;
DetermineFlashType_Toshiba32MByte:
    ld      hl, FLASH_SECTORSIZE_0x00FC
    ld      a, FLASH_DENSITY_SINGLE
    jp      DetermineFlashType_Exit
;
DetermineFlashType_Toshiba64MByte:
    ld      hl, FLASH_SECTORSIZE_0x01F8
    ld      a, FLASH_DENSITY_SINGLE
    jp      DetermineFlashType_Exit
;
DetermineFlashType_Tosh128MB:
    ld      hl, FLASH_SECTORSIZE_0x03F0
    call    ReadFlashID_ToshibaExtended
    ld      a,b
    cp      0x24
    ld      a, FLASH_DENSITY_SINGLE
    jp      nz, DetermineFlashType_Exit
    ld      a, FLASH_DENSITY_SPECIAL_TOSHIBA
    jp      DetermineFlashType_Exit
;
DetermineFlashType_Tosh128MB2:
    ld      hl, FLASH_SECTORSIZE_0x03F0
    ld      a, FLASH_DENSITY_DUAL
    jp      DetermineFlashType_Exit
;
DetermineFlashType_Toshiba256MByte:
    ld      hl, FLASH_SECTORSIZE_0x07E0
    ld      a, FLASH_DENSITY_DUAL
    jp      DetermineFlashType_Exit
;
DetermineFlashType_Generic_Check:
    ld  a,c
    cp  FLASH_TYPE_32Mbyte
    jp  z,DetermineFlashType_32MByte
    cp  FLASH_TYPE_64Mbyte
    jp  z,DetermineFlashType_64MByte
    cp  FLASH_TYPE_128Mbyte
    jp  z,DetermineFlashType_128MByte
    cp  FLASH_TYPE_128Mbyte2
    jp  z,DetermineFlashType_128MByte
    cp  FLASH_TYPE_256Mbyte
    jp  z,DetermineFlashType_256MByte
    cp  FLASH_TYPE_256Mbyte2
    jp  z,DetermineFlashType_256MByte
    cp  FLASH_TYPE_512Mbyte
    jp  z,DetermineFlashType_512MByte
    cp  FLASH_TYPE_1024Mbyte
    jp  z,DetermineFlashType_1024MByte
    cp  FLASH_TYPE_2048Mbyte
    jp  z,DetermineFlashType_2048MByte
    jp  DetermineFlashType_ErrorUnknownFlash
;
DetermineFlashType_32MByte:
    ld  hl,FLASH_SECTORSIZE_0x00FC
    ld  a,FLASH_DENSITY_SINGLE
    jp  DetermineFlashType_Exit
;
DetermineFlashType_64MByte:
    ld  hl,FLASH_SECTORSIZE_0x01F8
    ld  a,FLASH_DENSITY_SINGLE
    jp  DetermineFlashType_Exit
;
DetermineFlashType_128MByte:
    cp  79h
    jp  nz,DetermineFlashType_128MByte_X2
    ld  hl,FLASH_SECTORSIZE_0x03F0
    ld  a,FLASH_DENSITY_SINGLE
    jp  DetermineFlashType_Exit
;
DetermineFlashType_128MByte_X2:
    ld      hl, FLASH_SECTORSIZE_0x03F0
    ld      a, FLASH_DENSITY_DUAL
    jp      DetermineFlashType_Exit
;
DetermineFlashType_256MByte:
    ld      hl, FLASH_SECTORSIZE_0x07E0
    cp      71h
    jp      nz, DetermineFlashType_256MByte_X2
    ld      a, FLASH_DENSITY_SINGLE
    jp      DetermineFlashType_Exit

DetermineFlashType_256MByte_X2:
    ld      a, FLASH_DENSITY_DUAL
    jp      DetermineFlashType_Exit

DetermineFlashType_512MByte:
    ld      hl, FLASH_SECTORSIZE_0x0FC0
    ld      a, e
    cp      0x15
    ld      a, FLASH_DENSITY_DUAL
    jp      z, DetermineFlashType_Exit
    ld      a, FLASH_DENSITY_SINGLE
    jp      DetermineFlashType_Exit

DetermineFlashType_1024MByte:
    ld      hl, FLASH_SECTORSIZE_0x1080
    ld      a, FLASH_DENSITY_DUAL
    jp      DetermineFlashType_Exit

DetermineFlashType_2048MByte:
    ld      hl, FLASH_SECTORSIZE_0x2100
    ld      a, FLASH_DENSITY_DUAL
    jp      DetermineFlashType_Exit

DetermineFlashType_ErrorUnknownFlash:
    ld      a, FLASH_TYPE_ERROR

DetermineFlashType_Exit:
    call    _DisableNANDFlash
    pop     de
    pop     bc
#endasm
}

/*!******************************************************************************/
void DetectNANDDevices( void )
/*!
** \brief   Check CE1, CE6, CE5, CE2 for valid NAND Flash devices
**          CE1 is master, if this not present then assume no flash whatsoever
**
** \param
**
** \return  reg a -
**              0 Success
**              FLASH_TYPE_ERROR    (0ffh)  Error
**              FLASH_TYPE_ERROR2   (003h)  Error**
**
** \author  Aaron Blanchard
** \date    26/01/2006
**
*********************************************************************************/
{
#asm
    push    bc
    push    de
    push    hl
    push    ix

    xor     a
    ld      (_FLASH_NandFlashTypeCE1),a
    ld      b, NAND_ENABLE_CE1
    call    _DetermineFlashType
    cp      FLASH_TYPE_ERROR
    jr      z,DetectNANDDevices_Exit    ; No Device in CE1 - instant failure
    cp      FLASH_TYPE_ERROR2
    jr      z, DetectNANDDevices_Exit   ; No Device in CE1 - instant failure
    ld      (_FLASH_NandFlashTypeCE1),a     ; Set CE1 NAND Flash type
DetectNANDDevices_Exit:

    pop     ix
    pop     hl
    pop     de
    pop     bc
#endasm
}


/*!******************************************************************************/
void FLASH_Initialise( void )
/*!
** \brief   Initialise flash
**
** \param
**
** \return
**
** \author  Aaron Blanchard
** \date    26/01/2006
**
*********************************************************************************/
{
    DetectNANDDevices();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -