📄 amd_flash.h
字号:
/*
* File: amd_flash.h
* Purpose: Flash driver for programming all AMD Flash devices
*
* Notes: This driver supports a single type (AM29XXXX) and
* width of FLASH. The type and width support is done
* at compilation. It supports multiple banks of same-
* width Flash, as well as consecutive/contiguous banks.
*
* Modifications:
*
*/
#ifndef _AMD_FLASH_H
#define _AMD_FLASH_H
/********************************************************************/
#if defined(__GNUC__)
void
amd_flash_init(ADDRESS)
__attribute__ ((section(".code_relocation")));
int
amd_flash_erase(ADDRESS, int, void(*)(char))
__attribute__ ((section(".code_relocation")));
int
amd_flash_program(ADDRESS, ADDRESS, int, int, void(*)(void), void(*)(char))
__attribute__ ((section(".code_relocation")));
ADDRESS
amd_flash_sector_start(ADDRESS)
__attribute__ ((section(".code_relocation")));
ADDRESS
amd_flash_sector_end(ADDRESS)
__attribute__ ((section(".code_relocation")));
int amd_flash_secsi_read(ADDRESS, ADDRESS, int)
__attribute__ ((section(".code_relocation")));
int amd_flash_secsi_write(ADDRESS, ADDRESS, int)
__attribute__ ((section(".code_relocation")));
int amd_flash_secsi_protect(void)
__attribute__ ((section(".code_relocation")));
int amd_flash_boot_get(void)
__attribute__ ((section(".code_relocation")));
#else
void
amd_flash_init(ADDRESS);
int
amd_flash_erase(ADDRESS, int, void(*)(char));
int
amd_flash_program(ADDRESS, ADDRESS, int, int, void(*)(void), void(*)(char));
ADDRESS
amd_flash_sector_start(ADDRESS);
ADDRESS
amd_flash_sector_end(ADDRESS);
int amd_flash_secsi_read(ADDRESS, ADDRESS, int);
int amd_flash_secsi_write(ADDRESS, ADDRESS, int);
int amd_flash_secsi_protect(void);
int amd_flash_boot_get(void);
#endif /* defined(__GNUC__) */
/********************************************************************/
typedef struct
{
uint32 size; /* Sector size in bytes */
uint32 offset; /* Offset from base of device */
} AMD_FLASH_SECTOR_INFO;
/********************************************************************/
#ifndef AMD_FLASH_DEVICES
#define AMD_FLASH_DEVICES 1
#endif
/********************************************************************/
/*
* Am29LV004B (8bit only)
*/
#if (defined(AMD_FLASH_AM29LV004BT) || \
defined(AMD_FLASH_AM29LV004BB))
#define AMD_FLASH_8BIT
#define AMD_FLASH_SECTORS 11
/*
* Am29PL160C - 16-bit Mode
*/
#elif defined(AMD_FLASH_AM29PL160CB_16BIT)
#define AMD_FLASH_16BIT
#define AMD_FLASH_SECTORS 11
#define AMD_FLASH_UNLOCK_BYPASS
/*
* Am29PL160D - 16-bit Mode
*/
#elif defined(AMD_FLASH_AM29LV160DB_16BIT)
#define AMD_FLASH_16BIT
#define AMD_FLASH_SECTORS 35
#define AMD_FLASH_UNLOCK_BYPASS
/*
* Am29BDD160G - 32-bit Mode
*/
#elif defined(AMD_FLASH_AM29BDD160GB_32BIT)
#define AMD_FLASH_32BIT
#define AMD_FLASH_SECTORS 46
#define AMD_FLASH_UNLOCK_BYPASS
/*
* Am29BDD160G - 16-bit Mode
*/
#elif defined(AMD_FLASH_AM29BDD160GB_16BIT)
#define AMD_FLASH_16BIT
#define AMD_FLASH_SECTORS 46
#define AMD_FLASH_UNLOCK_BYPASS
/* Constants for autoselect mode */
#define DEVADDR1 0x02 /* Address for byte 1 of device ID */
#define DEVADDR2 0x1c /* Address for byte 2 of device ID */
#define DEVADDR3 0x1e /* Address for byte 3 of device ID */
#define ADDR1 0xAAA /* These two defines are used as the */
#define ADDR2 0x555 /* addresses for the command algorithms */
#define BOOT_BLOCK_TOP 0
#define BOOT_BLOCK_BOTTOM 1
#define SECSI_PROTECT_ADDR (0x1A<<1)
/*
* Am29LV640MH/L - 16-bit Mode
*/
#elif (defined(AMD_FLASH_AM29LV640M_16BIT) || \
defined(AMD_FLASH_AM29LV640MH_16BIT) || \
defined(AMD_FLASH_AM29LV640ML_16BIT))
#define AMD_FLASH_16BIT
#define AMD_FLASH_SECTORS 128
#define AMD_FLASH_UNLOCK_BYPASS
/*
* Am29LV128MH/L - 16-bit Mode
*/
#elif (defined(AMD_FLASH_AM29LV128M_16BIT) || \
defined(AMD_FLASH_AM29LV128MH_16BIT) || \
defined(AMD_FLASH_AM29LV128ML_16BIT))
#define AMD_FLASH_16BIT
#define AMD_FLASH_SECTORS 256
#define AMD_FLASH_UNLOCK_BYPASS
#else
#error "Unsupported Flash device"
#endif
#ifndef ADDR1
#define ADDR1 0x555 /* These two defines are used as the */
#define ADDR2 0x2AA /* addresses for the command algorithms */
#endif
/********************************************************************/
/*
* Defines used to correctly address the Flash device(s)
*
* AMD_FLASH_BUS_SHIFT - Number of bits to right-shift the byte
* offsets of the sectors
* AMD_FLASH_CELL - Port size of Flash device(s)
* AMD_FLASH_CMD_DATA - Format of data when issuing commands
*
*/
#if defined(AMD_FLASH_8BIT)
#if (AMD_FLASH_DEVICES == 1)
#define AMD_FLASH_BUS_SHIFT 0
#define AMD_FLASH_CELL vuint8
#define AMD_FLASH_CELL_BYTES 1
#define AMD_FLASH_CELL_MASK 0x0
#define AMD_FLASH_CMD_DATA(x) ((uint8)x)
#elif (AMD_FLASH_DEVICES == 2)
#define AMD_FLASH_BUS_SHIFT 1
#define AMD_FLASH_CELL vuint16
#define AMD_FLASH_CELL_BYTES 2
#define AMD_FLASH_CELL_MASK 0x1
#define AMD_FLASH_CMD_DATA(x) ((uint16)((x<<8)|x))
#elif (AMD_FLASH_DEVICES == 4)
#define AMD_FLASH_BUS_SHIFT 2
#define AMD_FLASH_CELL vuint32
#define AMD_FLASH_CELL_BYTES 4
#define AMD_FLASH_CELL_MASK 0x3
#define AMD_FLASH_CMD_DATA(x) ((uint32)((x<<24)|(x<<16)|(x<<8)|x))
#else
#error "Unsupported number of Flash devices"
#endif
#elif defined(AMD_FLASH_16BIT)
#if (AMD_FLASH_DEVICES == 1)
#define AMD_FLASH_BUS_SHIFT 1
#define AMD_FLASH_CELL vuint16
#define AMD_FLASH_CELL_BYTES 2
#define AMD_FLASH_CELL_MASK 0x1
#define AMD_FLASH_CMD_DATA(x) ((uint16)x)
#elif (AMD_FLASH_DEVICES == 2)
#define AMD_FLASH_BUS_SHIFT 2
#define AMD_FLASH_CELL vuint32
#define AMD_FLASH_CELL_BYTES 4
#define AMD_FLASH_CELL_MASK 0x3
#define AMD_FLASH_CMD_DATA(x) ((uint32)((x<<16)|x))
#else
#error "Unsupported number of Flash devices"
#endif
#elif defined(AMD_FLASH_32BIT)
#if (AMD_FLASH_DEVICES == 1)
#define AMD_FLASH_BUS_SHIFT 2
#define AMD_FLASH_CELL vuint32
#define AMD_FLASH_CELL_BYTES 4
#define AMD_FLASH_CELL_MASK 0x3
#define AMD_FLASH_CMD_DATA(x) ((uint32)x)
#else
#error "Unsupported number of Flash devices"
#endif
#else
#error "Unsupported Flash device size"
#endif
/********************************************************************/
#endif /* _AMD_FLASH_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -