2014-08-15 17:53:43 +00:00
/* Copyright (c) 2011,2012 Simon Schubert <2@0x2c.org>.
2015-06-14 20:56:56 +00:00
* Modifications by Jacob Alexander 2014 - 2015 < haata @ kiibohd . com >
2014-08-15 17:53:43 +00:00
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2015-06-14 20:56:56 +00:00
# pragma once
2014-08-15 17:53:43 +00:00
// ----- Local Includes -----
# include "mchck-cdefs.h"
// ----- Structs -----
struct FTFL_FSTAT_t {
2015-03-09 01:40:01 +00:00
UNION_STRUCT_START ( 8 ) ;
uint8_t mgstat0 : 1 ;
uint8_t _rsvd0 : 3 ;
uint8_t fpviol : 1 ;
uint8_t accerr : 1 ;
uint8_t rdcolerr : 1 ;
uint8_t ccif : 1 ;
UNION_STRUCT_END ;
2014-08-15 17:53:43 +00:00
} ;
CTASSERT_SIZE_BIT ( struct FTFL_FSTAT_t , 8 ) ;
struct FTFL_FCNFG_t {
2015-03-09 01:40:01 +00:00
UNION_STRUCT_START ( 8 ) ;
uint8_t eeerdy : 1 ;
uint8_t ramrdy : 1 ;
uint8_t pflsh : 1 ;
uint8_t _rsvd0 : 1 ;
uint8_t erssusp : 1 ;
uint8_t ersareq : 1 ;
uint8_t rdcollie : 1 ;
uint8_t ccie : 1 ;
UNION_STRUCT_END ;
2014-08-15 17:53:43 +00:00
} ;
CTASSERT_SIZE_BIT ( struct FTFL_FCNFG_t , 8 ) ;
struct FTFL_FSEC_t {
2015-03-09 01:40:01 +00:00
UNION_STRUCT_START ( 8 ) ;
enum {
FTFL_FSEC_SEC_UNSECURE = 2 ,
FTFL_FSEC_SEC_SECURE = 3
} sec : 2 ;
enum {
FTFL_FSEC_FSLACC_DENY = 1 ,
FTFL_FSEC_FSLACC_GRANT = 3
} fslacc : 2 ;
enum {
FTFL_FSEC_MEEN_DISABLE = 2 ,
FTFL_FSEC_MEEN_ENABLE = 3
} meen : 2 ;
enum {
FTFL_FSEC_KEYEN_DISABLE = 1 ,
FTFL_FSEC_KEYEN_ENABLE = 2
} keyen : 2 ;
UNION_STRUCT_END ;
2014-08-15 17:53:43 +00:00
} ;
CTASSERT_SIZE_BIT ( struct FTFL_FSEC_t , 8 ) ;
struct FTFL_FOPT_t {
2015-03-09 01:40:01 +00:00
UNION_STRUCT_START ( 8 ) ;
uint8_t lpboot : 1 ;
uint8_t ezport_dis : 1 ;
uint8_t nmi_dis : 1 ;
uint8_t _rsvd0 : 5 ;
UNION_STRUCT_END ;
2014-08-15 17:53:43 +00:00
} ;
CTASSERT_SIZE_BIT ( struct FTFL_FOPT_t , 8 ) ;
/**
* The FCOOB is a weird register file , because it is double big endian ,
* which makes for odd gaps and for some data that is big endian , and for
* some that is little endian .
*/
union FTFL_FCCOB_t {
2015-03-09 01:40:01 +00:00
struct ftfl_generic {
uint32_t addr : 24 ;
enum FTFL_FCMD {
FTFL_FCMD_READ_1s_BLOCK = 0x00 ,
FTFL_FCMD_READ_1s_SECTION = 0x01 ,
FTFL_FCMD_PROGRAM_CHECK = 0x02 ,
FTFL_FCMD_READ_RESOURCE = 0x03 ,
FTFL_FCMD_PROGRAM_LONGWORD = 0x06 ,
FTFL_FCMD_ERASE_BLOCK = 0x08 ,
FTFL_FCMD_ERASE_SECTOR = 0x09 ,
FTFL_FCMD_PROGRAM_SECTION = 0x0b ,
FTFL_FCMD_READ_1s_ALL_BLOCKS = 0x40 ,
FTFL_FCMD_READ_ONCE = 0x41 ,
FTFL_FCMD_PROGRAM_ONCE = 0x43 ,
FTFL_FCMD_ERASE_ALL_BLOCKS = 0x44 ,
FTFL_FCMD_VERIFY_KEY = 0x45 ,
FTFL_FCMD_PROGRAM_PARTITION = 0x80 ,
FTFL_FCMD_SET_FLEXRAM = 0x81
} fcmd : 8 ;
uint8_t data_be [ 8 ] ;
} generic ;
struct {
uint32_t addr : 24 ;
enum FTFL_FCMD fcmd : 8 ;
uint8_t _rsvd0 [ 3 ] ;
enum FTFL_MARGIN_CHOICE {
FTFL_MARGIN_NORMAL = 0x00 ,
FTFL_MARGIN_USER = 0x01 ,
FTFL_MARGIN_FACTORY = 0x02
} margin : 8 ;
} read_1s_block ;
struct ftfl_data_num_words {
uint32_t addr : 24 ;
enum FTFL_FCMD fcmd : 8 ;
uint8_t _rsvd0 ;
enum FTFL_MARGIN_CHOICE margin : 8 ;
uint16_t num_words ;
} read_1s_section ;
struct {
uint32_t addr : 24 ;
enum FTFL_FCMD fcmd : 8 ;
uint8_t _rsvd0 [ 3 ] ;
enum FTFL_MARGIN_CHOICE margin : 8 ;
uint8_t data_be [ 4 ] ;
} program_check ;
struct {
uint32_t addr : 24 ;
enum FTFL_FCMD fcmd : 8 ;
uint32_t data ;
uint8_t _rsvd0 [ 3 ] ;
enum FTFL_RESOURCE_SELECT {
FTFL_RESOURCE_IFR = 0x00 ,
FTFL_RESOURCE_VERSION = 0x01
} resource_select : 8 ;
} read_resource ;
struct {
uint32_t addr : 24 ;
enum FTFL_FCMD fcmd : 8 ;
uint8_t data_be [ 4 ] ;
} program_longword ;
struct {
uint32_t addr : 24 ;
enum FTFL_FCMD fcmd : 8 ;
} erase ;
struct ftfl_data_num_words program_section ;
struct {
uint8_t _rsvd0 [ 2 ] ;
enum FTFL_MARGIN_CHOICE margin : 8 ;
enum FTFL_FCMD fcmd : 8 ;
} read_1s_all_blocks ;
struct ftfl_cmd_once {
uint8_t _rsvd0 [ 2 ] ;
uint8_t idx ;
enum FTFL_FCMD fcmd : 8 ;
uint8_t data_be [ 4 ] ;
} read_once ;
struct ftfl_cmd_once program_once ;
struct {
uint8_t _rsvd0 [ 3 ] ;
enum FTFL_FCMD fcmd : 8 ;
} erase_all ;
struct {
uint8_t _rsvd0 [ 3 ] ;
enum FTFL_FCMD fcmd : 8 ;
uint8_t key_be [ 8 ] ;
} verify_key ;
struct {
uint8_t _rsvd0 [ 3 ] ;
enum FTFL_FCMD fcmd : 8 ;
uint8_t _rsvd1 [ 2 ] ;
/* the following enum is analogous to enum
* SIM_FLEXNVM_PARTITION in sim . h , but this one is padded
* with four 1 - bits to make an 8 - bit value .
*/
enum FTFL_FLEXNVM_PARTITION {
FTFL_FLEXNVM_DATA_32_EEPROM_0 = 0xF0 ,
FTFL_FLEXNVM_DATA_24_EEPROM_8 = 0xF1 ,
FTFL_FLEXNVM_DATA_16_EEPROM_16 = 0xF2 ,
FTFL_FLEXNVM_DATA_8_EEPROM_24 = 0xF9 ,
FTFL_FLEXNVM_DATA_0_EEPROM_32 = 0xF3
} flexnvm_partition : 8 ;
enum FTFL_EEPROM_SIZE {
FTFL_EEPROM_SIZE_0 = 0x3f ,
FTFL_EEPROM_SIZE_32 = 0x39 ,
FTFL_EEPROM_SIZE_64 = 0x38 ,
FTFL_EEPROM_SIZE_128 = 0x37 ,
FTFL_EEPROM_SIZE_256 = 0x36 ,
FTFL_EEPROM_SIZE_512 = 0x35 ,
FTFL_EEPROM_SIZE_1024 = 0x34 ,
FTFL_EEPROM_SIZE_2048 = 0x33
} eeprom_size : 8 ;
} program_partition ;
struct {
uint8_t _rsvd0 [ 2 ] ;
enum FTFL_FLEXRAM_FUNCTION {
FTFL_FLEXRAM_EEPROM = 0x00 ,
FTFL_FLEXRAM_RAM = 0xff
} flexram_function : 8 ;
enum FTFL_FCMD fcmd : 8 ;
} set_flexram ;
2014-08-15 17:53:43 +00:00
} ;
CTASSERT_SIZE_BYTE ( union FTFL_FCCOB_t , 12 ) ;
struct FTFL_t {
2015-03-09 01:40:01 +00:00
struct FTFL_FSTAT_t fstat ;
struct FTFL_FCNFG_t fcnfg ;
struct FTFL_FSEC_t fsec ;
struct FTFL_FOPT_t fopt ;
union FTFL_FCCOB_t fccob ;
uint8_t fprot_be [ 4 ] ;
uint8_t feprot ;
uint8_t fdprot ;
2014-08-15 17:53:43 +00:00
} ;
CTASSERT_SIZE_BYTE ( struct FTFL_t , 0x18 ) ;
/* Flash Configuration Field, see Sub-Family Reference Manual, section 28.3.1 */
struct FTFL_CONFIG_t {
2015-03-09 01:40:01 +00:00
uint8_t key [ 8 ] ;
uint8_t fprot [ 4 ] ;
struct FTFL_FSEC_t fsec ;
struct FTFL_FOPT_t fopt ;
uint8_t feprot ;
uint8_t fdprot ;
2014-08-15 17:53:43 +00:00
} ;
CTASSERT_SIZE_BYTE ( struct FTFL_CONFIG_t , 16 ) ;
extern volatile struct FTFL_t FTFL ;
extern char FlexRAM [ ] ;
extern struct FTFL_CONFIG_t FTFL_CONFIG ;