summaryrefslogtreecommitdiffstats
path: root/bsps/arm/atsam/include/libchip/include/smc.h
blob: 72253ab38a529eda3e1f4811535846572ce0bd32 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/* ---------------------------------------------------------------------------- */
/*                  Atmel Microcontroller Software Support                      */
/*                       SAM Software Package License                           */
/* ---------------------------------------------------------------------------- */
/* Copyright (c) 2015, Atmel Corporation                                        */
/*                                                                              */
/* All rights reserved.                                                         */
/*                                                                              */
/* Redistribution and use in source and binary forms, with or without           */
/* modification, are permitted provided that the following condition is met:    */
/*                                                                              */
/* - Redistributions of source code must retain the above copyright notice,     */
/* this list of conditions and the disclaimer below.                            */
/*                                                                              */
/* Atmel's name may not be used to endorse or promote products derived from     */
/* this software without specific prior written permission.                     */
/*                                                                              */
/* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR   */
/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE   */
/* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,      */
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,  */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    */
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING         */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */
/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                           */
/* ---------------------------------------------------------------------------- */

/**
*  \file
*
*  Definitions and function prototype for SMC module
*/

#ifndef _SMC_
#define _SMC_

/*----------------------------------------------------------------------------
 *        Headers
 *----------------------------------------------------------------------------*/
#include "chip.h"

/*----------------------------------------------------------------------------
 *        Types
 *----------------------------------------------------------------------------*/
typedef union _SmcStatus {
	uint8_t BStatus;
	struct _SmcStatusBits {
		uint8_t smcSts: 1,   /**< NAND Flash Controller Status */
				xfrDone: 1,  /**< NFC Data Transfer Terminated */
				cmdDone: 1,  /**< Command Done */
				rbEdge: 1,   /**< Ready/Busy Line 3 Edge Detected*/
				hammingReady: 1;  /**< Hamming ecc ready */
	} bStatus;
} SmcStatus;

/*----------------------------------------------------------------------------
 *        Definitions
 *----------------------------------------------------------------------------*/
/*
 * NFC definitions
 */

/** Base address of NFC SRAM */
#define NFC_SRAM_BASE_ADDRESS 0x200000
/** Base address for NFC Address Command */
#define NFC_CMD_BASE_ADDR     0x70000000


/* -------- NFCADDR_CMD : NFC Address Command -------- */
#define NFCADDR_CMD_CMD1      (0xFFu <<  2)
/* Command Register Value for Cycle 1 */
#define NFCADDR_CMD_CMD2      (0xFFu << 10)
/* Command Register Value for Cycle 2 */
#define NFCADDR_CMD_VCMD2     (0x1u << 18)
/* Valid Cycle 2 Command */
#define NFCADDR_CMD_ACYCLE    (0x7u << 19)
/* Number of Address required for the current command */
#define   NFCADDR_CMD_ACYCLE_NONE    (0x0u << 19)
/* No address cycle */
#define   NFCADDR_CMD_ACYCLE_ONE     (0x1u << 19)
/* One address cycle */
#define   NFCADDR_CMD_ACYCLE_TWO     (0x2u << 19)
/* Two address cycles */
#define   NFCADDR_CMD_ACYCLE_THREE   (0x3u << 19)
/* Three address cycles */
#define   NFCADDR_CMD_ACYCLE_FOUR    (0x4u << 19)
/* Four address cycles */
#define   NFCADDR_CMD_ACYCLE_FIVE    (0x5u << 19)
/* Five address cycles */
#define NFCADDR_CMD_CSID      (0x7u << 22)
/* Chip Select Identifier */
#define   NFCADDR_CMD_CSID_0                    (0x0u << 22)
/* CS0 */
#define   NFCADDR_CMD_CSID_1                    (0x1u << 22)
/* CS1 */
#define   NFCADDR_CMD_CSID_2                    (0x2u << 22)
/* CS2 */
#define   NFCADDR_CMD_CSID_3                    (0x3u << 22)
/* CS3 */
#define   NFCADDR_CMD_CSID_4                    (0x4u << 22)
/* CS4 */
#define   NFCADDR_CMD_CSID_5                    (0x5u << 22)
/* CS5 */
#define   NFCADDR_CMD_CSID_6                    (0x6u << 22)
/* CS6 */
#define   NFCADDR_CMD_CSID_7                    (0x7u << 22)
/* CS7 */
#define NFCADDR_CMD_DATAEN   (0x1u << 25)
/* NFC Data Enable */
#define NFCADDR_CMD_DATADIS  (0x0u << 25)
/* NFC Data disable */
#define NFCADDR_CMD_NFCRD    (0x0u << 26)
/* NFC Read Enable */
#define NFCADDR_CMD_NFCWR    (0x1u << 26)
/* NFC Write Enable */
#define NFCADDR_CMD_NFCCMD   (0x1u << 27)
/* NFC Command Enable */

/*
 * ECC definitions (Hsiao Code Errors)
 */

/** A single bit was incorrect but has been recovered. */
#define Hsiao_ERROR_SINGLEBIT         1

/** The original code has been corrupted. */
#define Hsiao_ERROR_ECC               2

/** Multiple bits are incorrect in the data and they cannot be corrected. */
#define Hsiao_ERROR_MULTIPLEBITS      3

/*----------------------------------------------------------------------------
 *        Exported functions
 *----------------------------------------------------------------------------*/

/*
 * NFC functions
 */

extern void SMC_NFC_Configure(uint32_t mode);
extern void SMC_NFC_Reset(void);
extern void SMC_NFC_EnableNfc(void);
extern void SMC_NFC_EnableSpareRead(void);
extern void SMC_NFC_DisableSpareRead(void);
extern void SMC_NFC_EnableSpareWrite(void);
extern void SMC_NFC_DisableSpareWrite(void);
extern uint8_t SMC_NFC_isSpareRead(void);
extern uint8_t SMC_NFC_isSpareWrite(void);
extern uint8_t SMC_NFC_isTransferComplete(void);
extern uint8_t SMC_NFC_isReadyBusy(void);
extern uint8_t SMC_NFC_isNfcBusy(void);
extern uint32_t SMC_NFC_GetStatus(void);

extern void SMC_NFC_SendCommand(uint32_t cmd, uint32_t addressCycle,
								uint32_t cycle0);
extern void SMC_NFC_Wait_CommandDone(void);
extern void SMC_NFC_Wait_XfrDone(void);
extern void SMC_NFC_Wait_RBbusy(void);
extern void SMC_NFC_Wait_HammingReady(void);

extern void SMC_ECC_Configure(uint32_t type, uint32_t pageSize);
extern uint32_t SMC_ECC_GetCorrectoinType(void);
extern uint8_t SMC_ECC_GetStatus(uint8_t eccNumber);

extern void SMC_ECC_GetValue(uint32_t *ecc);
extern void SMC_ECC_GetEccParity(uint32_t pageDataSize, uint8_t *code,
								 uint8_t busWidth);
extern uint8_t SMC_ECC_VerifyHsiao(uint8_t *data, uint32_t size,
								   const uint8_t *originalCode, const uint8_t *verifyCode, uint8_t busWidth);

#endif /* #ifndef _SMC_ */