Replace all DOS line endings with Unix

Command run was:
git ls-tree -r HEAD --name-only | xargs dos2unix
This commit is contained in:
Angus Gratton
2018-07-05 09:01:03 +10:00
committed by Ivan Grokhotkov
parent 74245d27d3
commit a67d5d89e0
111 changed files with 43712 additions and 43712 deletions

View File

@@ -1,102 +1,102 @@
/********************************************************************* /*********************************************************************
* SEGGER Microcontroller GmbH & Co. KG * * SEGGER Microcontroller GmbH & Co. KG *
* The Embedded Experts * * The Embedded Experts *
********************************************************************** **********************************************************************
* * * *
* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG * * (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *
* * * *
* www.segger.com Support: support@segger.com * * www.segger.com Support: support@segger.com *
* * * *
********************************************************************** **********************************************************************
* * * *
* SEGGER SystemView * Real-time application analysis * * SEGGER SystemView * Real-time application analysis *
* * * *
********************************************************************** **********************************************************************
* * * *
* All rights reserved. * * All rights reserved. *
* * * *
* SEGGER strongly recommends to not make any changes * * SEGGER strongly recommends to not make any changes *
* to or modify the source code of this software in order to stay * * to or modify the source code of this software in order to stay *
* compatible with the RTT protocol and J-Link. * * compatible with the RTT protocol and J-Link. *
* * * *
* Redistribution and use in source and binary forms, with or * * Redistribution and use in source and binary forms, with or *
* without modification, are permitted provided that the following * * without modification, are permitted provided that the following *
* conditions are met: * * conditions are met: *
* * * *
* o Redistributions of source code must retain the above copyright * * o Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. * * notice, this list of conditions and the following disclaimer. *
* * * *
* o Redistributions in binary form must reproduce the above * * o Redistributions in binary form must reproduce the above *
* copyright notice, this list of conditions and the following * * copyright notice, this list of conditions and the following *
* disclaimer in the documentation and/or other materials provided * * disclaimer in the documentation and/or other materials provided *
* with the distribution. * * with the distribution. *
* * * *
* o Neither the name of SEGGER Microcontroller GmbH & Co. KG * * o Neither the name of SEGGER Microcontroller GmbH & Co. KG *
* nor the names of its contributors may be used to endorse or * * nor the names of its contributors may be used to endorse or *
* promote products derived from this software without specific * * promote products derived from this software without specific *
* prior written permission. * * prior written permission. *
* * * *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
* DAMAGE. * * DAMAGE. *
* * * *
********************************************************************** **********************************************************************
* * * *
* SystemView version: V2.42 * * SystemView version: V2.42 *
* * * *
********************************************************************** **********************************************************************
---------------------------------------------------------------------- ----------------------------------------------------------------------
File : Global.h File : Global.h
Purpose : Global types Purpose : Global types
In case your application already has a Global.h, you should In case your application already has a Global.h, you should
merge the files. In order to use Segger code, the types merge the files. In order to use Segger code, the types
U8, U16, U32, I8, I16, I32 need to be defined in Global.h; U8, U16, U32, I8, I16, I32 need to be defined in Global.h;
additional definitions do not hurt. additional definitions do not hurt.
---------------------------END-OF-HEADER------------------------------ ---------------------------END-OF-HEADER------------------------------
*/ */
#ifndef GLOBAL_H // Guard against multiple inclusion #ifndef GLOBAL_H // Guard against multiple inclusion
#define GLOBAL_H #define GLOBAL_H
#define U8 unsigned char #define U8 unsigned char
#define U16 unsigned short #define U16 unsigned short
#define U32 unsigned long #define U32 unsigned long
#define I8 signed char #define I8 signed char
#define I16 signed short #define I16 signed short
#define I32 signed long #define I32 signed long
#ifdef _WIN32 #ifdef _WIN32
// //
// Microsoft VC6 compiler related // Microsoft VC6 compiler related
// //
#define U64 unsigned __int64 #define U64 unsigned __int64
#define U128 unsigned __int128 #define U128 unsigned __int128
#define I64 __int64 #define I64 __int64
#define I128 __int128 #define I128 __int128
#if _MSC_VER <= 1200 #if _MSC_VER <= 1200
#define U64_C(x) x##UI64 #define U64_C(x) x##UI64
#else #else
#define U64_C(x) x##ULL #define U64_C(x) x##ULL
#endif #endif
#else #else
// //
// C99 compliant compiler // C99 compliant compiler
// //
#define U64 unsigned long long #define U64 unsigned long long
#define I64 signed long long #define I64 signed long long
#define U64_C(x) x##ULL #define U64_C(x) x##ULL
#endif #endif
#endif // Avoid multiple inclusion #endif // Avoid multiple inclusion
/*************************** End of file ****************************/ /*************************** End of file ****************************/

View File

@@ -1,298 +1,298 @@
/********************************************************************* /*********************************************************************
* SEGGER Microcontroller GmbH & Co. KG * * SEGGER Microcontroller GmbH & Co. KG *
* The Embedded Experts * * The Embedded Experts *
********************************************************************** **********************************************************************
* * * *
* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG * * (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *
* * * *
* www.segger.com Support: support@segger.com * * www.segger.com Support: support@segger.com *
* * * *
********************************************************************** **********************************************************************
* * * *
* SEGGER SystemView * Real-time application analysis * * SEGGER SystemView * Real-time application analysis *
* * * *
********************************************************************** **********************************************************************
* * * *
* All rights reserved. * * All rights reserved. *
* * * *
* SEGGER strongly recommends to not make any changes * * SEGGER strongly recommends to not make any changes *
* to or modify the source code of this software in order to stay * * to or modify the source code of this software in order to stay *
* compatible with the RTT protocol and J-Link. * * compatible with the RTT protocol and J-Link. *
* * * *
* Redistribution and use in source and binary forms, with or * * Redistribution and use in source and binary forms, with or *
* without modification, are permitted provided that the following * * without modification, are permitted provided that the following *
* conditions are met: * * conditions are met: *
* * * *
* o Redistributions of source code must retain the above copyright * * o Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. * * notice, this list of conditions and the following disclaimer. *
* * * *
* o Redistributions in binary form must reproduce the above * * o Redistributions in binary form must reproduce the above *
* copyright notice, this list of conditions and the following * * copyright notice, this list of conditions and the following *
* disclaimer in the documentation and/or other materials provided * * disclaimer in the documentation and/or other materials provided *
* with the distribution. * * with the distribution. *
* * * *
* o Neither the name of SEGGER Microcontroller GmbH & Co. KG * * o Neither the name of SEGGER Microcontroller GmbH & Co. KG *
* nor the names of its contributors may be used to endorse or * * nor the names of its contributors may be used to endorse or *
* promote products derived from this software without specific * * promote products derived from this software without specific *
* prior written permission. * * prior written permission. *
* * * *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
* DAMAGE. * * DAMAGE. *
* * * *
********************************************************************** **********************************************************************
* * * *
* SystemView version: V2.42 * * SystemView version: V2.42 *
* * * *
********************************************************************** **********************************************************************
---------------------------END-OF-HEADER------------------------------ ---------------------------END-OF-HEADER------------------------------
File : SEGGER_RTT_Conf.h File : SEGGER_RTT_Conf.h
Purpose : Implementation of SEGGER real-time transfer (RTT) which Purpose : Implementation of SEGGER real-time transfer (RTT) which
allows real-time communication on targets which support allows real-time communication on targets which support
debugger memory accesses while the CPU is running. debugger memory accesses while the CPU is running.
Revision: $Rev: 5626 $ Revision: $Rev: 5626 $
*/ */
#ifndef SEGGER_RTT_CONF_H #ifndef SEGGER_RTT_CONF_H
#define SEGGER_RTT_CONF_H #define SEGGER_RTT_CONF_H
#ifdef __IAR_SYSTEMS_ICC__ #ifdef __IAR_SYSTEMS_ICC__
#include <intrinsics.h> #include <intrinsics.h>
#endif #endif
/********************************************************************* /*********************************************************************
* *
* Defines, configurable * Defines, configurable
* *
********************************************************************** **********************************************************************
*/ */
#define SEGGER_RTT_MAX_NUM_UP_BUFFERS (3) // Max. number of up-buffers (T->H) available on this target (Default: 3) #define SEGGER_RTT_MAX_NUM_UP_BUFFERS (3) // Max. number of up-buffers (T->H) available on this target (Default: 3)
#define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3) // Max. number of down-buffers (H->T) available on this target (Default: 3) #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (3) // Max. number of down-buffers (H->T) available on this target (Default: 3)
#define BUFFER_SIZE_UP (1024) // Size of the buffer for terminal output of target, up to host (Default: 1k) #define BUFFER_SIZE_UP (1024) // Size of the buffer for terminal output of target, up to host (Default: 1k)
#define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16) #define BUFFER_SIZE_DOWN (16) // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16)
#define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64) #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64)
#define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0) #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0)
// //
// Target is not allowed to perform other RTT operations while string still has not been stored completely. // Target is not allowed to perform other RTT operations while string still has not been stored completely.
// Otherwise we would probably end up with a mixed string in the buffer. // Otherwise we would probably end up with a mixed string in the buffer.
// If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here. // If using RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here.
// //
// SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4. // SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4.
// Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches. // Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches.
// When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly. // When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly.
// (Higher priority = lower priority number) // (Higher priority = lower priority number)
// Default value for embOS: 128u // Default value for embOS: 128u
// Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) // Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
// In case of doubt mask all interrupts: 1 << (8 - BASEPRI_PRIO_BITS) i.e. 1 << 5 when 3 bits are implemented in NVIC // In case of doubt mask all interrupts: 1 << (8 - BASEPRI_PRIO_BITS) i.e. 1 << 5 when 3 bits are implemented in NVIC
// or define SEGGER_RTT_LOCK() to completely disable interrupts. // or define SEGGER_RTT_LOCK() to completely disable interrupts.
// //
#define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20) #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20)
/********************************************************************* /*********************************************************************
* *
* RTT lock configuration for SEGGER Embedded Studio, * RTT lock configuration for SEGGER Embedded Studio,
* Rowley CrossStudio and GCC * Rowley CrossStudio and GCC
*/ */
#if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__) #if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)
#ifdef __ARM_ARCH_6M__ #ifdef __ARM_ARCH_6M__
#define SEGGER_RTT_LOCK() { \ #define SEGGER_RTT_LOCK() { \
unsigned int LockState; \ unsigned int LockState; \
__asm volatile ("mrs %0, primask \n\t" \ __asm volatile ("mrs %0, primask \n\t" \
"mov r1, $1 \n\t" \ "mov r1, $1 \n\t" \
"msr primask, r1 \n\t" \ "msr primask, r1 \n\t" \
: "=r" (LockState) \ : "=r" (LockState) \
: \ : \
: "r1" \ : "r1" \
); );
#define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \ #define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \
: \ : \
: "r" (LockState) \ : "r" (LockState) \
: \ : \
); \ ); \
} }
#elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)) #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__))
#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
#define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
#endif #endif
#define SEGGER_RTT_LOCK() { \ #define SEGGER_RTT_LOCK() { \
unsigned int LockState; \ unsigned int LockState; \
__asm volatile ("mrs %0, basepri \n\t" \ __asm volatile ("mrs %0, basepri \n\t" \
"mov r1, %1 \n\t" \ "mov r1, %1 \n\t" \
"msr basepri, r1 \n\t" \ "msr basepri, r1 \n\t" \
: "=r" (LockState) \ : "=r" (LockState) \
: "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \ : "i"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY) \
: "r1" \ : "r1" \
); );
#define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \ #define SEGGER_RTT_UNLOCK() __asm volatile ("msr basepri, %0 \n\t" \
: \ : \
: "r" (LockState) \ : "r" (LockState) \
: \ : \
); \ ); \
} }
#elif defined(__ARM_ARCH_7A__) #elif defined(__ARM_ARCH_7A__)
#define SEGGER_RTT_LOCK() { \ #define SEGGER_RTT_LOCK() { \
unsigned int LockState; \ unsigned int LockState; \
__asm volatile ("mrs r1, CPSR \n\t" \ __asm volatile ("mrs r1, CPSR \n\t" \
"mov %0, r1 \n\t" \ "mov %0, r1 \n\t" \
"orr r1, r1, #0xC0 \n\t" \ "orr r1, r1, #0xC0 \n\t" \
"msr CPSR_c, r1 \n\t" \ "msr CPSR_c, r1 \n\t" \
: "=r" (LockState) \ : "=r" (LockState) \
: \ : \
: "r1" \ : "r1" \
); );
#define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \ #define SEGGER_RTT_UNLOCK() __asm volatile ("mov r0, %0 \n\t" \
"mrs r1, CPSR \n\t" \ "mrs r1, CPSR \n\t" \
"bic r1, r1, #0xC0 \n\t" \ "bic r1, r1, #0xC0 \n\t" \
"and r0, r0, #0xC0 \n\t" \ "and r0, r0, #0xC0 \n\t" \
"orr r1, r1, r0 \n\t" \ "orr r1, r1, r0 \n\t" \
"msr CPSR_c, r1 \n\t" \ "msr CPSR_c, r1 \n\t" \
: \ : \
: "r" (LockState) \ : "r" (LockState) \
: "r0", "r1" \ : "r0", "r1" \
); \ ); \
} }
#else #else
#define SEGGER_RTT_LOCK() #define SEGGER_RTT_LOCK()
#define SEGGER_RTT_UNLOCK() #define SEGGER_RTT_UNLOCK()
#endif #endif
#endif #endif
/********************************************************************* /*********************************************************************
* *
* RTT lock configuration for IAR EWARM * RTT lock configuration for IAR EWARM
*/ */
#ifdef __ICCARM__ #ifdef __ICCARM__
#if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__))
#define SEGGER_RTT_LOCK() { \ #define SEGGER_RTT_LOCK() { \
unsigned int LockState; \ unsigned int LockState; \
LockState = __get_PRIMASK(); \ LockState = __get_PRIMASK(); \
__set_PRIMASK(1); __set_PRIMASK(1);
#define SEGGER_RTT_UNLOCK() __set_PRIMASK(LockState); \ #define SEGGER_RTT_UNLOCK() __set_PRIMASK(LockState); \
} }
#elif ((defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || (defined (__ARM7M__) && (__CORE__ == __ARM7M__))) #elif ((defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)) || (defined (__ARM7M__) && (__CORE__ == __ARM7M__)))
#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
#define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
#endif #endif
#define SEGGER_RTT_LOCK() { \ #define SEGGER_RTT_LOCK() { \
unsigned int LockState; \ unsigned int LockState; \
LockState = __get_BASEPRI(); \ LockState = __get_BASEPRI(); \
__set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); __set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY);
#define SEGGER_RTT_UNLOCK() __set_BASEPRI(LockState); \ #define SEGGER_RTT_UNLOCK() __set_BASEPRI(LockState); \
} }
#endif #endif
#endif #endif
/********************************************************************* /*********************************************************************
* *
* RTT lock configuration for IAR RX * RTT lock configuration for IAR RX
*/ */
#ifdef __ICCRX__ #ifdef __ICCRX__
#define SEGGER_RTT_LOCK() { \ #define SEGGER_RTT_LOCK() { \
unsigned long LockState; \ unsigned long LockState; \
LockState = __get_interrupt_state(); \ LockState = __get_interrupt_state(); \
__disable_interrupt(); __disable_interrupt();
#define SEGGER_RTT_UNLOCK() __set_interrupt_state(LockState); \ #define SEGGER_RTT_UNLOCK() __set_interrupt_state(LockState); \
} }
#endif #endif
/********************************************************************* /*********************************************************************
* *
* RTT lock configuration for KEIL ARM * RTT lock configuration for KEIL ARM
*/ */
#ifdef __CC_ARM #ifdef __CC_ARM
#if (defined __TARGET_ARCH_6S_M) #if (defined __TARGET_ARCH_6S_M)
#define SEGGER_RTT_LOCK() { \ #define SEGGER_RTT_LOCK() { \
unsigned int LockState; \ unsigned int LockState; \
register unsigned char PRIMASK __asm( "primask"); \ register unsigned char PRIMASK __asm( "primask"); \
LockState = PRIMASK; \ LockState = PRIMASK; \
PRIMASK = 1u; \ PRIMASK = 1u; \
__schedule_barrier(); __schedule_barrier();
#define SEGGER_RTT_UNLOCK() PRIMASK = LockState; \ #define SEGGER_RTT_UNLOCK() PRIMASK = LockState; \
__schedule_barrier(); \ __schedule_barrier(); \
} }
#elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M))
#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
#define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
#endif #endif
#define SEGGER_RTT_LOCK() { \ #define SEGGER_RTT_LOCK() { \
unsigned int LockState; \ unsigned int LockState; \
register unsigned char BASEPRI __asm( "basepri"); \ register unsigned char BASEPRI __asm( "basepri"); \
LockState = BASEPRI; \ LockState = BASEPRI; \
BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \ BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY; \
__schedule_barrier(); __schedule_barrier();
#define SEGGER_RTT_UNLOCK() BASEPRI = LockState; \ #define SEGGER_RTT_UNLOCK() BASEPRI = LockState; \
__schedule_barrier(); \ __schedule_barrier(); \
} }
#endif #endif
#endif #endif
/********************************************************************* /*********************************************************************
* *
* RTT lock configuration for TI ARM * RTT lock configuration for TI ARM
*/ */
#ifdef __TI_ARM__ #ifdef __TI_ARM__
#if defined (__TI_ARM_V6M0__) #if defined (__TI_ARM_V6M0__)
#define SEGGER_RTT_LOCK() { \ #define SEGGER_RTT_LOCK() { \
unsigned int LockState; \ unsigned int LockState; \
LockState = __get_PRIMASK(); \ LockState = __get_PRIMASK(); \
__set_PRIMASK(1); __set_PRIMASK(1);
#define SEGGER_RTT_UNLOCK() __set_PRIMASK(LockState); \ #define SEGGER_RTT_UNLOCK() __set_PRIMASK(LockState); \
} }
#elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__)) #elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__))
#ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY #ifndef SEGGER_RTT_MAX_INTERRUPT_PRIORITY
#define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20) #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY (0x20)
#endif #endif
#define SEGGER_RTT_LOCK() { \ #define SEGGER_RTT_LOCK() { \
unsigned int LockState; \ unsigned int LockState; \
LockState = OS_GetBASEPRI(); \ LockState = OS_GetBASEPRI(); \
OS_SetBASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY); OS_SetBASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY);
#define SEGGER_RTT_UNLOCK() OS_SetBASEPRI(LockState); \ #define SEGGER_RTT_UNLOCK() OS_SetBASEPRI(LockState); \
} }
#endif #endif
#endif #endif
/********************************************************************* /*********************************************************************
* *
* RTT lock configuration fallback * RTT lock configuration fallback
*/ */
#ifndef SEGGER_RTT_LOCK #ifndef SEGGER_RTT_LOCK
void SEGGER_SYSVIEW_X_RTT_Lock(); void SEGGER_SYSVIEW_X_RTT_Lock();
#define SEGGER_RTT_LOCK() SEGGER_SYSVIEW_X_RTT_Lock() // Lock RTT (nestable) (i.e. disable interrupts) #define SEGGER_RTT_LOCK() SEGGER_SYSVIEW_X_RTT_Lock() // Lock RTT (nestable) (i.e. disable interrupts)
#endif #endif
#ifndef SEGGER_RTT_UNLOCK #ifndef SEGGER_RTT_UNLOCK
void SEGGER_SYSVIEW_X_RTT_Unlock(); void SEGGER_SYSVIEW_X_RTT_Unlock();
#define SEGGER_RTT_UNLOCK() SEGGER_SYSVIEW_X_RTT_Unlock() // Unlock RTT (nestable) (i.e. enable previous interrupt lock state) #define SEGGER_RTT_UNLOCK() SEGGER_SYSVIEW_X_RTT_Unlock() // Unlock RTT (nestable) (i.e. enable previous interrupt lock state)
#endif #endif
#endif #endif
/*************************** End of file ****************************/ /*************************** End of file ****************************/

View File

@@ -1,176 +1,176 @@
/********************************************************************* /*********************************************************************
* SEGGER Microcontroller GmbH & Co. KG * * SEGGER Microcontroller GmbH & Co. KG *
* The Embedded Experts * * The Embedded Experts *
********************************************************************** **********************************************************************
* * * *
* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG * * (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *
* * * *
* www.segger.com Support: support@segger.com * * www.segger.com Support: support@segger.com *
* * * *
********************************************************************** **********************************************************************
* * * *
* SEGGER SystemView * Real-time application analysis * * SEGGER SystemView * Real-time application analysis *
* * * *
********************************************************************** **********************************************************************
* * * *
* All rights reserved. * * All rights reserved. *
* * * *
* SEGGER strongly recommends to not make any changes * * SEGGER strongly recommends to not make any changes *
* to or modify the source code of this software in order to stay * * to or modify the source code of this software in order to stay *
* compatible with the RTT protocol and J-Link. * * compatible with the RTT protocol and J-Link. *
* * * *
* Redistribution and use in source and binary forms, with or * * Redistribution and use in source and binary forms, with or *
* without modification, are permitted provided that the following * * without modification, are permitted provided that the following *
* conditions are met: * * conditions are met: *
* * * *
* o Redistributions of source code must retain the above copyright * * o Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. * * notice, this list of conditions and the following disclaimer. *
* * * *
* o Redistributions in binary form must reproduce the above * * o Redistributions in binary form must reproduce the above *
* copyright notice, this list of conditions and the following * * copyright notice, this list of conditions and the following *
* disclaimer in the documentation and/or other materials provided * * disclaimer in the documentation and/or other materials provided *
* with the distribution. * * with the distribution. *
* * * *
* o Neither the name of SEGGER Microcontroller GmbH & Co. KG * * o Neither the name of SEGGER Microcontroller GmbH & Co. KG *
* nor the names of its contributors may be used to endorse or * * nor the names of its contributors may be used to endorse or *
* promote products derived from this software without specific * * promote products derived from this software without specific *
* prior written permission. * * prior written permission. *
* * * *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
* DAMAGE. * * DAMAGE. *
* * * *
********************************************************************** **********************************************************************
* * * *
* SystemView version: V2.42 * * SystemView version: V2.42 *
* * * *
********************************************************************** **********************************************************************
-------------------------- END-OF-HEADER ----------------------------- -------------------------- END-OF-HEADER -----------------------------
File : SEGGER_SYSVIEW_Conf.h File : SEGGER_SYSVIEW_Conf.h
Purpose : SEGGER SystemView configuration. Purpose : SEGGER SystemView configuration.
Revision: $Rev: 5927 $ Revision: $Rev: 5927 $
*/ */
#ifndef SEGGER_SYSVIEW_CONF_H #ifndef SEGGER_SYSVIEW_CONF_H
#define SEGGER_SYSVIEW_CONF_H #define SEGGER_SYSVIEW_CONF_H
/********************************************************************* /*********************************************************************
* *
* Defines, fixed * Defines, fixed
* *
********************************************************************** **********************************************************************
*/ */
// //
// Constants for known core configuration // Constants for known core configuration
// //
#define SEGGER_SYSVIEW_CORE_OTHER 0 #define SEGGER_SYSVIEW_CORE_OTHER 0
#define SEGGER_SYSVIEW_CORE_CM0 1 // Cortex-M0/M0+/M1 #define SEGGER_SYSVIEW_CORE_CM0 1 // Cortex-M0/M0+/M1
#define SEGGER_SYSVIEW_CORE_CM3 2 // Cortex-M3/M4/M7 #define SEGGER_SYSVIEW_CORE_CM3 2 // Cortex-M3/M4/M7
#define SEGGER_SYSVIEW_CORE_RX 3 // Renesas RX #define SEGGER_SYSVIEW_CORE_RX 3 // Renesas RX
#if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__) #if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)
#ifdef __ARM_ARCH_6M__ #ifdef __ARM_ARCH_6M__
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0
#elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)) #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__))
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3
#endif #endif
#elif defined(__ICCARM__) #elif defined(__ICCARM__)
#if (defined (__ARM6M__) && (__CORE__ == __ARM6M__)) #if (defined (__ARM6M__) && (__CORE__ == __ARM6M__))
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0
#elif ((defined (__ARM7M__) && (__CORE__ == __ARM7M__)) || (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__))) #elif ((defined (__ARM7M__) && (__CORE__ == __ARM7M__)) || (defined (__ARM7EM__) && (__CORE__ == __ARM7EM__)))
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3
#endif #endif
#elif defined(__CC_ARM) #elif defined(__CC_ARM)
#if (defined(__TARGET_ARCH_6S_M)) #if (defined(__TARGET_ARCH_6S_M))
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0
#elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M)) #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M))
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3
#endif #endif
#elif defined(__TI_ARM__) #elif defined(__TI_ARM__)
#ifdef __TI_ARM_V6M0__ #ifdef __TI_ARM_V6M0__
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0 #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM0
#elif (defined(__TI_ARM_V7M3__) || defined(__TI_ARM_V7M4__)) #elif (defined(__TI_ARM_V7M3__) || defined(__TI_ARM_V7M4__))
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3 #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_CM3
#endif #endif
#elif defined(__ICCRX__) #elif defined(__ICCRX__)
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX
#elif defined(__RX) #elif defined(__RX)
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_RX
#endif #endif
#ifndef SEGGER_SYSVIEW_CORE #ifndef SEGGER_SYSVIEW_CORE
#define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_OTHER #define SEGGER_SYSVIEW_CORE SEGGER_SYSVIEW_CORE_OTHER
#endif #endif
/********************************************************************* /*********************************************************************
* *
* Defines, configurable * Defines, configurable
* *
********************************************************************** **********************************************************************
*/ */
/********************************************************************* /*********************************************************************
* *
* SystemView buffer configuration * SystemView buffer configuration
*/ */
#define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 1024 // Number of bytes that SystemView uses for the buffer. #define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 1024 // Number of bytes that SystemView uses for the buffer.
#define SEGGER_SYSVIEW_RTT_CHANNEL 1 // The RTT channel that SystemView will use. 0: Auto selection #define SEGGER_SYSVIEW_RTT_CHANNEL 1 // The RTT channel that SystemView will use. 0: Auto selection
#define SEGGER_SYSVIEW_USE_STATIC_BUFFER 1 // Use a static buffer to generate events instead of a buffer on the stack #define SEGGER_SYSVIEW_USE_STATIC_BUFFER 1 // Use a static buffer to generate events instead of a buffer on the stack
#define SEGGER_SYSVIEW_POST_MORTEM_MODE 0 // 1: Enable post mortem analysis mode #define SEGGER_SYSVIEW_POST_MORTEM_MODE 0 // 1: Enable post mortem analysis mode
/********************************************************************* /*********************************************************************
* *
* SystemView timestamp configuration * SystemView timestamp configuration
*/ */
#if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3 #if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3
#define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0xE0001004)) // Retrieve a system timestamp. Cortex-M cycle counter. #define SEGGER_SYSVIEW_GET_TIMESTAMP() (*(U32 *)(0xE0001004)) // Retrieve a system timestamp. Cortex-M cycle counter.
#define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 // Define number of valid bits low-order delivered by clock source #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 // Define number of valid bits low-order delivered by clock source
#else #else
#define SEGGER_SYSVIEW_GET_TIMESTAMP() SEGGER_SYSVIEW_X_GetTimestamp() // Retrieve a system timestamp via user-defined function #define SEGGER_SYSVIEW_GET_TIMESTAMP() SEGGER_SYSVIEW_X_GetTimestamp() // Retrieve a system timestamp via user-defined function
#define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 // Define number of valid bits low-order delivered by SEGGER_SYSVIEW_X_GetTimestamp() #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 // Define number of valid bits low-order delivered by SEGGER_SYSVIEW_X_GetTimestamp()
#endif #endif
/********************************************************************* /*********************************************************************
* *
* SystemView Id configuration * SystemView Id configuration
*/ */
//TODO: optimise it //TODO: optimise it
#define SEGGER_SYSVIEW_ID_BASE 0x3F400000 // Default value for the lowest Id reported by the application. Can be overridden by the application via SEGGER_SYSVIEW_SetRAMBase(). (i.e. 0x20000000 when all Ids are an address in this RAM) #define SEGGER_SYSVIEW_ID_BASE 0x3F400000 // Default value for the lowest Id reported by the application. Can be overridden by the application via SEGGER_SYSVIEW_SetRAMBase(). (i.e. 0x20000000 when all Ids are an address in this RAM)
#define SEGGER_SYSVIEW_ID_SHIFT 0 // Number of bits to shift the Id to save bandwidth. (i.e. 2 when Ids are 4 byte aligned) #define SEGGER_SYSVIEW_ID_SHIFT 0 // Number of bits to shift the Id to save bandwidth. (i.e. 2 when Ids are 4 byte aligned)
/********************************************************************* /*********************************************************************
* *
* SystemView interrupt configuration * SystemView interrupt configuration
*/ */
#if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3 #if SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM3
#define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32 *)(0xE000ED04)) & 0x1FF) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[8:0] = active vector) #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32 *)(0xE000ED04)) & 0x1FF) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[8:0] = active vector)
#elif SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM0 #elif SEGGER_SYSVIEW_CORE == SEGGER_SYSVIEW_CORE_CM0
#if defined(__ICCARM__) #if defined(__ICCARM__)
#define SEGGER_SYSVIEW_GET_INTERRUPT_ID() (__get_IPSR()) // Workaround for IAR, which might do a byte-access to 0xE000ED04. Read IPSR instead. #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() (__get_IPSR()) // Workaround for IAR, which might do a byte-access to 0xE000ED04. Read IPSR instead.
#else #else
#define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32 *)(0xE000ED04)) & 0x3F) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[5:0] = active vector) #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() ((*(U32 *)(0xE000ED04)) & 0x3F) // Get the currently active interrupt Id. (i.e. read Cortex-M ICSR[5:0] = active vector)
#endif #endif
#else #else
#define SEGGER_SYSVIEW_GET_INTERRUPT_ID() SEGGER_SYSVIEW_X_GetInterruptId() // Get the currently active interrupt Id from the user-provided function. #define SEGGER_SYSVIEW_GET_INTERRUPT_ID() SEGGER_SYSVIEW_X_GetInterruptId() // Get the currently active interrupt Id from the user-provided function.
#endif #endif
void SEGGER_SYSVIEW_X_SysView_Lock(); void SEGGER_SYSVIEW_X_SysView_Lock();
void SEGGER_SYSVIEW_X_SysView_Unlock(); void SEGGER_SYSVIEW_X_SysView_Unlock();
#define SEGGER_SYSVIEW_LOCK() SEGGER_SYSVIEW_X_SysView_Lock() #define SEGGER_SYSVIEW_LOCK() SEGGER_SYSVIEW_X_SysView_Lock()
#define SEGGER_SYSVIEW_UNLOCK() SEGGER_SYSVIEW_X_SysView_Unlock() #define SEGGER_SYSVIEW_UNLOCK() SEGGER_SYSVIEW_X_SysView_Unlock()
#endif // SEGGER_SYSVIEW_CONF_H #endif // SEGGER_SYSVIEW_CONF_H
/*************************** End of file ****************************/ /*************************** End of file ****************************/

View File

@@ -1,155 +1,155 @@
/********************************************************************* /*********************************************************************
* SEGGER Microcontroller GmbH & Co. KG * * SEGGER Microcontroller GmbH & Co. KG *
* The Embedded Experts * * The Embedded Experts *
********************************************************************** **********************************************************************
* * * *
* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG * * (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *
* * * *
* www.segger.com Support: support@segger.com * * www.segger.com Support: support@segger.com *
* * * *
********************************************************************** **********************************************************************
* * * *
* SEGGER SystemView * Real-time application analysis * * SEGGER SystemView * Real-time application analysis *
* * * *
********************************************************************** **********************************************************************
* * * *
* All rights reserved. * * All rights reserved. *
* * * *
* SEGGER strongly recommends to not make any changes * * SEGGER strongly recommends to not make any changes *
* to or modify the source code of this software in order to stay * * to or modify the source code of this software in order to stay *
* compatible with the RTT protocol and J-Link. * * compatible with the RTT protocol and J-Link. *
* * * *
* Redistribution and use in source and binary forms, with or * * Redistribution and use in source and binary forms, with or *
* without modification, are permitted provided that the following * * without modification, are permitted provided that the following *
* conditions are met: * * conditions are met: *
* * * *
* o Redistributions of source code must retain the above copyright * * o Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. * * notice, this list of conditions and the following disclaimer. *
* * * *
* o Redistributions in binary form must reproduce the above * * o Redistributions in binary form must reproduce the above *
* copyright notice, this list of conditions and the following * * copyright notice, this list of conditions and the following *
* disclaimer in the documentation and/or other materials provided * * disclaimer in the documentation and/or other materials provided *
* with the distribution. * * with the distribution. *
* * * *
* o Neither the name of SEGGER Microcontroller GmbH & Co. KG * * o Neither the name of SEGGER Microcontroller GmbH & Co. KG *
* nor the names of its contributors may be used to endorse or * * nor the names of its contributors may be used to endorse or *
* promote products derived from this software without specific * * promote products derived from this software without specific *
* prior written permission. * * prior written permission. *
* * * *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
* DAMAGE. * * DAMAGE. *
* * * *
********************************************************************** **********************************************************************
* * * *
* SystemView version: V2.42 * * SystemView version: V2.42 *
* * * *
********************************************************************** **********************************************************************
---------------------------------------------------------------------- ----------------------------------------------------------------------
File : SEGGER.h File : SEGGER.h
Purpose : Global types etc & general purpose utility functions Purpose : Global types etc & general purpose utility functions
---------------------------END-OF-HEADER------------------------------ ---------------------------END-OF-HEADER------------------------------
*/ */
#ifndef SEGGER_H // Guard against multiple inclusion #ifndef SEGGER_H // Guard against multiple inclusion
#define SEGGER_H #define SEGGER_H
#include "Global.h" // Type definitions: U8, U16, U32, I8, I16, I32 #include "Global.h" // Type definitions: U8, U16, U32, I8, I16, I32
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { /* Make sure we have C-declarations in C++ programs */ extern "C" { /* Make sure we have C-declarations in C++ programs */
#endif #endif
/********************************************************************* /*********************************************************************
* *
* Keywords/specifiers * Keywords/specifiers
* *
********************************************************************** **********************************************************************
*/ */
#ifndef INLINE #ifndef INLINE
#ifdef _WIN32 #ifdef _WIN32
// //
// Microsoft VC6 and newer. // Microsoft VC6 and newer.
// Force inlining without cost checking. // Force inlining without cost checking.
// //
#define INLINE __forceinline #define INLINE __forceinline
#else #else
#if (defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) || defined(__RX) || defined(__ICCRX__)) #if (defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) || defined(__RX) || defined(__ICCRX__))
// //
// Other known compilers. // Other known compilers.
// //
#define INLINE inline #define INLINE inline
#else #else
// //
// Unknown compilers. // Unknown compilers.
// //
#define INLINE #define INLINE
#endif #endif
#endif #endif
#endif #endif
/********************************************************************* /*********************************************************************
* *
* Function-like macros * Function-like macros
* *
********************************************************************** **********************************************************************
*/ */
#define SEGGER_COUNTOF(a) (sizeof((a))/sizeof((a)[0])) #define SEGGER_COUNTOF(a) (sizeof((a))/sizeof((a)[0]))
#define SEGGER_MIN(a,b) (((a) < (b)) ? (a) : (b)) #define SEGGER_MIN(a,b) (((a) < (b)) ? (a) : (b))
#define SEGGER_MAX(a,b) (((a) > (b)) ? (a) : (b)) #define SEGGER_MAX(a,b) (((a) > (b)) ? (a) : (b))
/********************************************************************* /*********************************************************************
* *
* Types * Types
* *
********************************************************************** **********************************************************************
*/ */
typedef struct { typedef struct {
char *pBuffer; char *pBuffer;
int BufferSize; int BufferSize;
int Cnt; int Cnt;
} SEGGER_BUFFER_DESC; } SEGGER_BUFFER_DESC;
typedef struct { typedef struct {
int CacheLineSize; // 0: No Cache. Most Systems such as ARM9 use a 32 bytes cache line size. int CacheLineSize; // 0: No Cache. Most Systems such as ARM9 use a 32 bytes cache line size.
void (*pfDMB) (void); // Optional DMB function for Data Memory Barrier to make sure all memory operations are completed. void (*pfDMB) (void); // Optional DMB function for Data Memory Barrier to make sure all memory operations are completed.
void (*pfClean) (void *p, unsigned NumBytes); // Optional clean function for cached memory. void (*pfClean) (void *p, unsigned NumBytes); // Optional clean function for cached memory.
void (*pfInvalidate)(void *p, unsigned NumBytes); // Optional invalidate function for cached memory. void (*pfInvalidate)(void *p, unsigned NumBytes); // Optional invalidate function for cached memory.
} SEGGER_CACHE_CONFIG; } SEGGER_CACHE_CONFIG;
/********************************************************************* /*********************************************************************
* *
* Utility functions * Utility functions
* *
********************************************************************** **********************************************************************
*/ */
void SEGGER_ARM_memcpy (void *pDest, const void *pSrc, int NumBytes); void SEGGER_ARM_memcpy (void *pDest, const void *pSrc, int NumBytes);
void SEGGER_memcpy (void *pDest, const void *pSrc, int NumBytes); void SEGGER_memcpy (void *pDest, const void *pSrc, int NumBytes);
void SEGGER_memxor (void *pDest, const void *pSrc, unsigned NumBytes); void SEGGER_memxor (void *pDest, const void *pSrc, unsigned NumBytes);
void SEGGER_StoreChar (SEGGER_BUFFER_DESC *p, char c); void SEGGER_StoreChar (SEGGER_BUFFER_DESC *p, char c);
void SEGGER_PrintUnsigned(SEGGER_BUFFER_DESC *pBufferDesc, U32 v, unsigned Base, int NumDigits); void SEGGER_PrintUnsigned(SEGGER_BUFFER_DESC *pBufferDesc, U32 v, unsigned Base, int NumDigits);
void SEGGER_PrintInt (SEGGER_BUFFER_DESC *pBufferDesc, I32 v, unsigned Base, unsigned NumDigits); void SEGGER_PrintInt (SEGGER_BUFFER_DESC *pBufferDesc, I32 v, unsigned Base, unsigned NumDigits);
int SEGGER_snprintf (char *pBuffer, int BufferSize, const char *sFormat, ...); int SEGGER_snprintf (char *pBuffer, int BufferSize, const char *sFormat, ...);
#if defined(__cplusplus) #if defined(__cplusplus)
} /* Make sure we have C-declarations in C++ programs */ } /* Make sure we have C-declarations in C++ programs */
#endif #endif
#endif // Avoid multiple inclusion #endif // Avoid multiple inclusion
/*************************** End of file ****************************/ /*************************** End of file ****************************/

File diff suppressed because it is too large Load Diff

View File

@@ -1,334 +1,334 @@
/********************************************************************* /*********************************************************************
* SEGGER Microcontroller GmbH & Co. KG * * SEGGER Microcontroller GmbH & Co. KG *
* The Embedded Experts * * The Embedded Experts *
********************************************************************** **********************************************************************
* * * *
* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG * * (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *
* * * *
* www.segger.com Support: support@segger.com * * www.segger.com Support: support@segger.com *
* * * *
********************************************************************** **********************************************************************
* * * *
* SEGGER SystemView * Real-time application analysis * * SEGGER SystemView * Real-time application analysis *
* * * *
********************************************************************** **********************************************************************
* * * *
* All rights reserved. * * All rights reserved. *
* * * *
* SEGGER strongly recommends to not make any changes * * SEGGER strongly recommends to not make any changes *
* to or modify the source code of this software in order to stay * * to or modify the source code of this software in order to stay *
* compatible with the RTT protocol and J-Link. * * compatible with the RTT protocol and J-Link. *
* * * *
* Redistribution and use in source and binary forms, with or * * Redistribution and use in source and binary forms, with or *
* without modification, are permitted provided that the following * * without modification, are permitted provided that the following *
* conditions are met: * * conditions are met: *
* * * *
* o Redistributions of source code must retain the above copyright * * o Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. * * notice, this list of conditions and the following disclaimer. *
* * * *
* o Redistributions in binary form must reproduce the above * * o Redistributions in binary form must reproduce the above *
* copyright notice, this list of conditions and the following * * copyright notice, this list of conditions and the following *
* disclaimer in the documentation and/or other materials provided * * disclaimer in the documentation and/or other materials provided *
* with the distribution. * * with the distribution. *
* * * *
* o Neither the name of SEGGER Microcontroller GmbH & Co. KG * * o Neither the name of SEGGER Microcontroller GmbH & Co. KG *
* nor the names of its contributors may be used to endorse or * * nor the names of its contributors may be used to endorse or *
* promote products derived from this software without specific * * promote products derived from this software without specific *
* prior written permission. * * prior written permission. *
* * * *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
* DAMAGE. * * DAMAGE. *
* * * *
********************************************************************** **********************************************************************
* * * *
* SystemView version: V2.42 * * SystemView version: V2.42 *
* * * *
********************************************************************** **********************************************************************
-------------------------- END-OF-HEADER ----------------------------- -------------------------- END-OF-HEADER -----------------------------
File : SEGGER_SYSVIEW.h File : SEGGER_SYSVIEW.h
Purpose : System visualization API. Purpose : System visualization API.
Revision: $Rev: 5626 $ Revision: $Rev: 5626 $
*/ */
#ifndef SEGGER_SYSVIEW_H #ifndef SEGGER_SYSVIEW_H
#define SEGGER_SYSVIEW_H #define SEGGER_SYSVIEW_H
/********************************************************************* /*********************************************************************
* *
* #include Section * #include Section
* *
********************************************************************** **********************************************************************
*/ */
#include "SEGGER.h" #include "SEGGER.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/********************************************************************* /*********************************************************************
* *
* Defines, fixed * Defines, fixed
* *
********************************************************************** **********************************************************************
*/ */
#define SEGGER_SYSVIEW_VERSION 21000 #define SEGGER_SYSVIEW_VERSION 21000
#define SEGGER_SYSVIEW_INFO_SIZE 9 // Minimum size, which has to be reserved for a packet. 1-2 byte of message type, 0-2 byte of payload length, 1-5 bytes of timestamp. #define SEGGER_SYSVIEW_INFO_SIZE 9 // Minimum size, which has to be reserved for a packet. 1-2 byte of message type, 0-2 byte of payload length, 1-5 bytes of timestamp.
#define SEGGER_SYSVIEW_QUANTA_U32 5 // Maximum number of bytes to encode a U32, should be reserved for each 32-bit value in a packet. #define SEGGER_SYSVIEW_QUANTA_U32 5 // Maximum number of bytes to encode a U32, should be reserved for each 32-bit value in a packet.
#define SEGGER_SYSVIEW_LOG (0u) #define SEGGER_SYSVIEW_LOG (0u)
#define SEGGER_SYSVIEW_WARNING (1u) #define SEGGER_SYSVIEW_WARNING (1u)
#define SEGGER_SYSVIEW_ERROR (2u) #define SEGGER_SYSVIEW_ERROR (2u)
#define SEGGER_SYSVIEW_FLAG_APPEND (1u << 6) #define SEGGER_SYSVIEW_FLAG_APPEND (1u << 6)
#define SEGGER_SYSVIEW_PREPARE_PACKET(p) (p) + 4 #define SEGGER_SYSVIEW_PREPARE_PACKET(p) (p) + 4
// //
// SystemView events. First 32 IDs from 0 .. 31 are reserved for these // SystemView events. First 32 IDs from 0 .. 31 are reserved for these
// //
#define SYSVIEW_EVTID_NOP 0 // Dummy packet. #define SYSVIEW_EVTID_NOP 0 // Dummy packet.
#define SYSVIEW_EVTID_OVERFLOW 1 #define SYSVIEW_EVTID_OVERFLOW 1
#define SYSVIEW_EVTID_ISR_ENTER 2 #define SYSVIEW_EVTID_ISR_ENTER 2
#define SYSVIEW_EVTID_ISR_EXIT 3 #define SYSVIEW_EVTID_ISR_EXIT 3
#define SYSVIEW_EVTID_TASK_START_EXEC 4 #define SYSVIEW_EVTID_TASK_START_EXEC 4
#define SYSVIEW_EVTID_TASK_STOP_EXEC 5 #define SYSVIEW_EVTID_TASK_STOP_EXEC 5
#define SYSVIEW_EVTID_TASK_START_READY 6 #define SYSVIEW_EVTID_TASK_START_READY 6
#define SYSVIEW_EVTID_TASK_STOP_READY 7 #define SYSVIEW_EVTID_TASK_STOP_READY 7
#define SYSVIEW_EVTID_TASK_CREATE 8 #define SYSVIEW_EVTID_TASK_CREATE 8
#define SYSVIEW_EVTID_TASK_INFO 9 #define SYSVIEW_EVTID_TASK_INFO 9
#define SYSVIEW_EVTID_TRACE_START 10 #define SYSVIEW_EVTID_TRACE_START 10
#define SYSVIEW_EVTID_TRACE_STOP 11 #define SYSVIEW_EVTID_TRACE_STOP 11
#define SYSVIEW_EVTID_SYSTIME_CYCLES 12 #define SYSVIEW_EVTID_SYSTIME_CYCLES 12
#define SYSVIEW_EVTID_SYSTIME_US 13 #define SYSVIEW_EVTID_SYSTIME_US 13
#define SYSVIEW_EVTID_SYSDESC 14 #define SYSVIEW_EVTID_SYSDESC 14
#define SYSVIEW_EVTID_USER_START 15 #define SYSVIEW_EVTID_USER_START 15
#define SYSVIEW_EVTID_USER_STOP 16 #define SYSVIEW_EVTID_USER_STOP 16
#define SYSVIEW_EVTID_IDLE 17 #define SYSVIEW_EVTID_IDLE 17
#define SYSVIEW_EVTID_ISR_TO_SCHEDULER 18 #define SYSVIEW_EVTID_ISR_TO_SCHEDULER 18
#define SYSVIEW_EVTID_TIMER_ENTER 19 #define SYSVIEW_EVTID_TIMER_ENTER 19
#define SYSVIEW_EVTID_TIMER_EXIT 20 #define SYSVIEW_EVTID_TIMER_EXIT 20
#define SYSVIEW_EVTID_STACK_INFO 21 #define SYSVIEW_EVTID_STACK_INFO 21
#define SYSVIEW_EVTID_MODULEDESC 22 #define SYSVIEW_EVTID_MODULEDESC 22
#define SYSVIEW_EVTID_INIT 24 #define SYSVIEW_EVTID_INIT 24
#define SYSVIEW_EVTID_NAME_RESOURCE 25 #define SYSVIEW_EVTID_NAME_RESOURCE 25
#define SYSVIEW_EVTID_PRINT_FORMATTED 26 #define SYSVIEW_EVTID_PRINT_FORMATTED 26
#define SYSVIEW_EVTID_NUMMODULES 27 #define SYSVIEW_EVTID_NUMMODULES 27
#define SYSVIEW_EVTID_END_CALL 28 #define SYSVIEW_EVTID_END_CALL 28
#define SYSVIEW_EVTID_TASK_TERMINATE 29 #define SYSVIEW_EVTID_TASK_TERMINATE 29
#define SYSVIEW_EVTID_EX 31 #define SYSVIEW_EVTID_EX 31
// //
// Event masks to disable/enable events // Event masks to disable/enable events
// //
#define SYSVIEW_EVTMASK_NOP (1 << SYSVIEW_EVTID_NOP) #define SYSVIEW_EVTMASK_NOP (1 << SYSVIEW_EVTID_NOP)
#define SYSVIEW_EVTMASK_OVERFLOW (1 << SYSVIEW_EVTID_OVERFLOW) #define SYSVIEW_EVTMASK_OVERFLOW (1 << SYSVIEW_EVTID_OVERFLOW)
#define SYSVIEW_EVTMASK_ISR_ENTER (1 << SYSVIEW_EVTID_ISR_ENTER) #define SYSVIEW_EVTMASK_ISR_ENTER (1 << SYSVIEW_EVTID_ISR_ENTER)
#define SYSVIEW_EVTMASK_ISR_EXIT (1 << SYSVIEW_EVTID_ISR_EXIT) #define SYSVIEW_EVTMASK_ISR_EXIT (1 << SYSVIEW_EVTID_ISR_EXIT)
#define SYSVIEW_EVTMASK_TASK_START_EXEC (1 << SYSVIEW_EVTID_TASK_START_EXEC) #define SYSVIEW_EVTMASK_TASK_START_EXEC (1 << SYSVIEW_EVTID_TASK_START_EXEC)
#define SYSVIEW_EVTMASK_TASK_STOP_EXEC (1 << SYSVIEW_EVTID_TASK_STOP_EXEC) #define SYSVIEW_EVTMASK_TASK_STOP_EXEC (1 << SYSVIEW_EVTID_TASK_STOP_EXEC)
#define SYSVIEW_EVTMASK_TASK_START_READY (1 << SYSVIEW_EVTID_TASK_START_READY) #define SYSVIEW_EVTMASK_TASK_START_READY (1 << SYSVIEW_EVTID_TASK_START_READY)
#define SYSVIEW_EVTMASK_TASK_STOP_READY (1 << SYSVIEW_EVTID_TASK_STOP_READY) #define SYSVIEW_EVTMASK_TASK_STOP_READY (1 << SYSVIEW_EVTID_TASK_STOP_READY)
#define SYSVIEW_EVTMASK_TASK_CREATE (1 << SYSVIEW_EVTID_TASK_CREATE) #define SYSVIEW_EVTMASK_TASK_CREATE (1 << SYSVIEW_EVTID_TASK_CREATE)
#define SYSVIEW_EVTMASK_TASK_INFO (1 << SYSVIEW_EVTID_TASK_INFO) #define SYSVIEW_EVTMASK_TASK_INFO (1 << SYSVIEW_EVTID_TASK_INFO)
#define SYSVIEW_EVTMASK_TRACE_START (1 << SYSVIEW_EVTID_TRACE_START) #define SYSVIEW_EVTMASK_TRACE_START (1 << SYSVIEW_EVTID_TRACE_START)
#define SYSVIEW_EVTMASK_TRACE_STOP (1 << SYSVIEW_EVTID_TRACE_STOP) #define SYSVIEW_EVTMASK_TRACE_STOP (1 << SYSVIEW_EVTID_TRACE_STOP)
#define SYSVIEW_EVTMASK_SYSTIME_CYCLES (1 << SYSVIEW_EVTID_SYSTIME_CYCLES) #define SYSVIEW_EVTMASK_SYSTIME_CYCLES (1 << SYSVIEW_EVTID_SYSTIME_CYCLES)
#define SYSVIEW_EVTMASK_SYSTIME_US (1 << SYSVIEW_EVTID_SYSTIME_US) #define SYSVIEW_EVTMASK_SYSTIME_US (1 << SYSVIEW_EVTID_SYSTIME_US)
#define SYSVIEW_EVTMASK_SYSDESC (1 << SYSVIEW_EVTID_SYSDESC) #define SYSVIEW_EVTMASK_SYSDESC (1 << SYSVIEW_EVTID_SYSDESC)
#define SYSVIEW_EVTMASK_USER_START (1 << SYSVIEW_EVTID_USER_START) #define SYSVIEW_EVTMASK_USER_START (1 << SYSVIEW_EVTID_USER_START)
#define SYSVIEW_EVTMASK_USER_STOP (1 << SYSVIEW_EVTID_USER_STOP) #define SYSVIEW_EVTMASK_USER_STOP (1 << SYSVIEW_EVTID_USER_STOP)
#define SYSVIEW_EVTMASK_IDLE (1 << SYSVIEW_EVTID_IDLE) #define SYSVIEW_EVTMASK_IDLE (1 << SYSVIEW_EVTID_IDLE)
#define SYSVIEW_EVTMASK_ISR_TO_SCHEDULER (1 << SYSVIEW_EVTID_ISR_TO_SCHEDULER) #define SYSVIEW_EVTMASK_ISR_TO_SCHEDULER (1 << SYSVIEW_EVTID_ISR_TO_SCHEDULER)
#define SYSVIEW_EVTMASK_TIMER_ENTER (1 << SYSVIEW_EVTID_TIMER_ENTER) #define SYSVIEW_EVTMASK_TIMER_ENTER (1 << SYSVIEW_EVTID_TIMER_ENTER)
#define SYSVIEW_EVTMASK_TIMER_EXIT (1 << SYSVIEW_EVTID_TIMER_EXIT) #define SYSVIEW_EVTMASK_TIMER_EXIT (1 << SYSVIEW_EVTID_TIMER_EXIT)
#define SYSVIEW_EVTMASK_STACK_INFO (1 << SYSVIEW_EVTID_STACK_INFO) #define SYSVIEW_EVTMASK_STACK_INFO (1 << SYSVIEW_EVTID_STACK_INFO)
#define SYSVIEW_EVTMASK_MODULEDESC (1 << SYSVIEW_EVTID_MODULEDESC) #define SYSVIEW_EVTMASK_MODULEDESC (1 << SYSVIEW_EVTID_MODULEDESC)
#define SYSVIEW_EVTMASK_INIT (1 << SYSVIEW_EVTID_INIT) #define SYSVIEW_EVTMASK_INIT (1 << SYSVIEW_EVTID_INIT)
#define SYSVIEW_EVTMASK_NAME_RESOURCE (1 << SYSVIEW_EVTID_NAME_RESOURCE) #define SYSVIEW_EVTMASK_NAME_RESOURCE (1 << SYSVIEW_EVTID_NAME_RESOURCE)
#define SYSVIEW_EVTMASK_PRINT_FORMATTED (1 << SYSVIEW_EVTID_PRINT_FORMATTED) #define SYSVIEW_EVTMASK_PRINT_FORMATTED (1 << SYSVIEW_EVTID_PRINT_FORMATTED)
#define SYSVIEW_EVTMASK_NUMMODULES (1 << SYSVIEW_EVTID_NUMMODULES) #define SYSVIEW_EVTMASK_NUMMODULES (1 << SYSVIEW_EVTID_NUMMODULES)
#define SYSVIEW_EVTMASK_END_CALL (1 << SYSVIEW_EVTID_END_CALL) #define SYSVIEW_EVTMASK_END_CALL (1 << SYSVIEW_EVTID_END_CALL)
#define SYSVIEW_EVTMASK_TASK_TERMINATE (1 << SYSVIEW_EVTID_TASK_TERMINATE) #define SYSVIEW_EVTMASK_TASK_TERMINATE (1 << SYSVIEW_EVTID_TASK_TERMINATE)
#define SYSVIEW_EVTMASK_EX (1 << SYSVIEW_EVTID_EX) #define SYSVIEW_EVTMASK_EX (1 << SYSVIEW_EVTID_EX)
#define SYSVIEW_EVTMASK_ALL_INTERRUPTS ( SYSVIEW_EVTMASK_ISR_ENTER \ #define SYSVIEW_EVTMASK_ALL_INTERRUPTS ( SYSVIEW_EVTMASK_ISR_ENTER \
| SYSVIEW_EVTMASK_ISR_EXIT \ | SYSVIEW_EVTMASK_ISR_EXIT \
| SYSVIEW_EVTMASK_ISR_TO_SCHEDULER) | SYSVIEW_EVTMASK_ISR_TO_SCHEDULER)
#define SYSVIEW_EVTMASK_ALL_TASKS ( SYSVIEW_EVTMASK_TASK_START_EXEC \ #define SYSVIEW_EVTMASK_ALL_TASKS ( SYSVIEW_EVTMASK_TASK_START_EXEC \
| SYSVIEW_EVTMASK_TASK_STOP_EXEC \ | SYSVIEW_EVTMASK_TASK_STOP_EXEC \
| SYSVIEW_EVTMASK_TASK_START_READY \ | SYSVIEW_EVTMASK_TASK_START_READY \
| SYSVIEW_EVTMASK_TASK_STOP_READY \ | SYSVIEW_EVTMASK_TASK_STOP_READY \
| SYSVIEW_EVTMASK_TASK_CREATE \ | SYSVIEW_EVTMASK_TASK_CREATE \
| SYSVIEW_EVTMASK_TASK_INFO \ | SYSVIEW_EVTMASK_TASK_INFO \
| SYSVIEW_EVTMASK_STACK_INFO \ | SYSVIEW_EVTMASK_STACK_INFO \
| SYSVIEW_EVTMASK_TASK_TERMINATE) | SYSVIEW_EVTMASK_TASK_TERMINATE)
/********************************************************************* /*********************************************************************
* *
* Structures * Structures
* *
********************************************************************** **********************************************************************
*/ */
typedef struct { typedef struct {
U32 TaskID; U32 TaskID;
const char* sName; const char* sName;
U32 Prio; U32 Prio;
U32 StackBase; U32 StackBase;
U32 StackSize; U32 StackSize;
} SEGGER_SYSVIEW_TASKINFO; } SEGGER_SYSVIEW_TASKINFO;
typedef struct SEGGER_SYSVIEW_MODULE_STRUCT SEGGER_SYSVIEW_MODULE; typedef struct SEGGER_SYSVIEW_MODULE_STRUCT SEGGER_SYSVIEW_MODULE;
struct SEGGER_SYSVIEW_MODULE_STRUCT { struct SEGGER_SYSVIEW_MODULE_STRUCT {
const char* sModule; const char* sModule;
U32 NumEvents; U32 NumEvents;
U32 EventOffset; U32 EventOffset;
void (*pfSendModuleDesc)(void); void (*pfSendModuleDesc)(void);
SEGGER_SYSVIEW_MODULE* pNext; SEGGER_SYSVIEW_MODULE* pNext;
}; };
typedef void (SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC)(void); typedef void (SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC)(void);
/********************************************************************* /*********************************************************************
* *
* API functions * API functions
* *
********************************************************************** **********************************************************************
*/ */
typedef struct { typedef struct {
U64 (*pfGetTime) (void); U64 (*pfGetTime) (void);
void (*pfSendTaskList) (void); void (*pfSendTaskList) (void);
} SEGGER_SYSVIEW_OS_API; } SEGGER_SYSVIEW_OS_API;
/********************************************************************* /*********************************************************************
* *
* Control and initialization functions * Control and initialization functions
*/ */
void SEGGER_SYSVIEW_Init (U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc); void SEGGER_SYSVIEW_Init (U32 SysFreq, U32 CPUFreq, const SEGGER_SYSVIEW_OS_API *pOSAPI, SEGGER_SYSVIEW_SEND_SYS_DESC_FUNC pfSendSysDesc);
void SEGGER_SYSVIEW_SetRAMBase (U32 RAMBaseAddress); void SEGGER_SYSVIEW_SetRAMBase (U32 RAMBaseAddress);
void SEGGER_SYSVIEW_Start (void); void SEGGER_SYSVIEW_Start (void);
void SEGGER_SYSVIEW_Stop (void); void SEGGER_SYSVIEW_Stop (void);
void SEGGER_SYSVIEW_GetSysDesc (void); void SEGGER_SYSVIEW_GetSysDesc (void);
void SEGGER_SYSVIEW_SendTaskList (void); void SEGGER_SYSVIEW_SendTaskList (void);
void SEGGER_SYSVIEW_SendTaskInfo (const SEGGER_SYSVIEW_TASKINFO* pInfo); void SEGGER_SYSVIEW_SendTaskInfo (const SEGGER_SYSVIEW_TASKINFO* pInfo);
void SEGGER_SYSVIEW_SendSysDesc (const char* sSysDesc); void SEGGER_SYSVIEW_SendSysDesc (const char* sSysDesc);
/********************************************************************* /*********************************************************************
* *
* Event recording functions * Event recording functions
*/ */
void SEGGER_SYSVIEW_RecordVoid (unsigned int EventId); void SEGGER_SYSVIEW_RecordVoid (unsigned int EventId);
void SEGGER_SYSVIEW_RecordU32 (unsigned int EventId, U32 Para0); void SEGGER_SYSVIEW_RecordU32 (unsigned int EventId, U32 Para0);
void SEGGER_SYSVIEW_RecordU32x2 (unsigned int EventId, U32 Para0, U32 Para1); void SEGGER_SYSVIEW_RecordU32x2 (unsigned int EventId, U32 Para0, U32 Para1);
void SEGGER_SYSVIEW_RecordU32x3 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2); void SEGGER_SYSVIEW_RecordU32x3 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2);
void SEGGER_SYSVIEW_RecordU32x4 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3); void SEGGER_SYSVIEW_RecordU32x4 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3);
void SEGGER_SYSVIEW_RecordU32x5 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4); void SEGGER_SYSVIEW_RecordU32x5 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4);
void SEGGER_SYSVIEW_RecordU32x6 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5); void SEGGER_SYSVIEW_RecordU32x6 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5);
void SEGGER_SYSVIEW_RecordU32x7 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6); void SEGGER_SYSVIEW_RecordU32x7 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6);
void SEGGER_SYSVIEW_RecordU32x8 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7); void SEGGER_SYSVIEW_RecordU32x8 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7);
void SEGGER_SYSVIEW_RecordU32x9 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8); void SEGGER_SYSVIEW_RecordU32x9 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8);
void SEGGER_SYSVIEW_RecordU32x10 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9); void SEGGER_SYSVIEW_RecordU32x10 (unsigned int EventId, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4, U32 Para5, U32 Para6, U32 Para7, U32 Para8, U32 Para9);
void SEGGER_SYSVIEW_RecordString (unsigned int EventId, const char* pString); void SEGGER_SYSVIEW_RecordString (unsigned int EventId, const char* pString);
void SEGGER_SYSVIEW_RecordSystime (void); void SEGGER_SYSVIEW_RecordSystime (void);
void SEGGER_SYSVIEW_RecordEnterISR (U32 IrqId); void SEGGER_SYSVIEW_RecordEnterISR (U32 IrqId);
void SEGGER_SYSVIEW_RecordExitISR (void); void SEGGER_SYSVIEW_RecordExitISR (void);
void SEGGER_SYSVIEW_RecordExitISRToScheduler (void); void SEGGER_SYSVIEW_RecordExitISRToScheduler (void);
void SEGGER_SYSVIEW_RecordEnterTimer (U32 TimerId); void SEGGER_SYSVIEW_RecordEnterTimer (U32 TimerId);
void SEGGER_SYSVIEW_RecordExitTimer (void); void SEGGER_SYSVIEW_RecordExitTimer (void);
void SEGGER_SYSVIEW_RecordEndCall (unsigned int EventID); void SEGGER_SYSVIEW_RecordEndCall (unsigned int EventID);
void SEGGER_SYSVIEW_RecordEndCallU32 (unsigned int EventID, U32 Para0); void SEGGER_SYSVIEW_RecordEndCallU32 (unsigned int EventID, U32 Para0);
void SEGGER_SYSVIEW_OnIdle (void); void SEGGER_SYSVIEW_OnIdle (void);
void SEGGER_SYSVIEW_OnTaskCreate (U32 TaskId); void SEGGER_SYSVIEW_OnTaskCreate (U32 TaskId);
void SEGGER_SYSVIEW_OnTaskTerminate (U32 TaskId); void SEGGER_SYSVIEW_OnTaskTerminate (U32 TaskId);
void SEGGER_SYSVIEW_OnTaskStartExec (U32 TaskId); void SEGGER_SYSVIEW_OnTaskStartExec (U32 TaskId);
void SEGGER_SYSVIEW_OnTaskStopExec (void); void SEGGER_SYSVIEW_OnTaskStopExec (void);
void SEGGER_SYSVIEW_OnTaskStartReady (U32 TaskId); void SEGGER_SYSVIEW_OnTaskStartReady (U32 TaskId);
void SEGGER_SYSVIEW_OnTaskStopReady (U32 TaskId, unsigned int Cause); void SEGGER_SYSVIEW_OnTaskStopReady (U32 TaskId, unsigned int Cause);
void SEGGER_SYSVIEW_OnUserStart (unsigned int UserId); // Start of user defined event (such as a subroutine to profile) void SEGGER_SYSVIEW_OnUserStart (unsigned int UserId); // Start of user defined event (such as a subroutine to profile)
void SEGGER_SYSVIEW_OnUserStop (unsigned int UserId); // Start of user defined event void SEGGER_SYSVIEW_OnUserStop (unsigned int UserId); // Start of user defined event
void SEGGER_SYSVIEW_NameResource (U32 ResourceId, const char* sName); void SEGGER_SYSVIEW_NameResource (U32 ResourceId, const char* sName);
int SEGGER_SYSVIEW_SendPacket (U8* pPacket, U8* pPayloadEnd, unsigned int EventId); int SEGGER_SYSVIEW_SendPacket (U8* pPacket, U8* pPayloadEnd, unsigned int EventId);
/********************************************************************* /*********************************************************************
* *
* Event parameter encoding functions * Event parameter encoding functions
*/ */
U8* SEGGER_SYSVIEW_EncodeU32 (U8* pPayload, U32 Value); U8* SEGGER_SYSVIEW_EncodeU32 (U8* pPayload, U32 Value);
U8* SEGGER_SYSVIEW_EncodeData (U8* pPayload, const char* pSrc, unsigned int Len); U8* SEGGER_SYSVIEW_EncodeData (U8* pPayload, const char* pSrc, unsigned int Len);
U8* SEGGER_SYSVIEW_EncodeString (U8* pPayload, const char* s, unsigned int MaxLen); U8* SEGGER_SYSVIEW_EncodeString (U8* pPayload, const char* s, unsigned int MaxLen);
U8* SEGGER_SYSVIEW_EncodeId (U8* pPayload, U32 Id); U8* SEGGER_SYSVIEW_EncodeId (U8* pPayload, U32 Id);
U32 SEGGER_SYSVIEW_ShrinkId (U32 Id); U32 SEGGER_SYSVIEW_ShrinkId (U32 Id);
/********************************************************************* /*********************************************************************
* *
* Middleware module registration * Middleware module registration
*/ */
void SEGGER_SYSVIEW_RegisterModule (SEGGER_SYSVIEW_MODULE* pModule); void SEGGER_SYSVIEW_RegisterModule (SEGGER_SYSVIEW_MODULE* pModule);
void SEGGER_SYSVIEW_RecordModuleDescription (const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription); void SEGGER_SYSVIEW_RecordModuleDescription (const SEGGER_SYSVIEW_MODULE* pModule, const char* sDescription);
void SEGGER_SYSVIEW_SendModule (U8 ModuleId); void SEGGER_SYSVIEW_SendModule (U8 ModuleId);
void SEGGER_SYSVIEW_SendModuleDescription (void); void SEGGER_SYSVIEW_SendModuleDescription (void);
void SEGGER_SYSVIEW_SendNumModules (void); void SEGGER_SYSVIEW_SendNumModules (void);
/********************************************************************* /*********************************************************************
* *
* printf-Style functions * printf-Style functions
*/ */
#ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list #ifndef SEGGER_SYSVIEW_EXCLUDE_PRINTF // Define in project to avoid warnings about variable parameter list
void SEGGER_SYSVIEW_PrintfHostEx (const char* s, U32 Options, ...); void SEGGER_SYSVIEW_PrintfHostEx (const char* s, U32 Options, ...);
void SEGGER_SYSVIEW_PrintfTargetEx (const char* s, U32 Options, ...); void SEGGER_SYSVIEW_PrintfTargetEx (const char* s, U32 Options, ...);
void SEGGER_SYSVIEW_PrintfHost (const char* s, ...); void SEGGER_SYSVIEW_PrintfHost (const char* s, ...);
void SEGGER_SYSVIEW_PrintfTarget (const char* s, ...); void SEGGER_SYSVIEW_PrintfTarget (const char* s, ...);
void SEGGER_SYSVIEW_WarnfHost (const char* s, ...); void SEGGER_SYSVIEW_WarnfHost (const char* s, ...);
void SEGGER_SYSVIEW_WarnfTarget (const char* s, ...); void SEGGER_SYSVIEW_WarnfTarget (const char* s, ...);
void SEGGER_SYSVIEW_ErrorfHost (const char* s, ...); void SEGGER_SYSVIEW_ErrorfHost (const char* s, ...);
void SEGGER_SYSVIEW_ErrorfTarget (const char* s, ...); void SEGGER_SYSVIEW_ErrorfTarget (const char* s, ...);
#endif #endif
void SEGGER_SYSVIEW_Print (const char* s); void SEGGER_SYSVIEW_Print (const char* s);
void SEGGER_SYSVIEW_Warn (const char* s); void SEGGER_SYSVIEW_Warn (const char* s);
void SEGGER_SYSVIEW_Error (const char* s); void SEGGER_SYSVIEW_Error (const char* s);
/********************************************************************* /*********************************************************************
* *
* Run-time configuration functions * Run-time configuration functions
*/ */
void SEGGER_SYSVIEW_EnableEvents (U32 EnableMask); void SEGGER_SYSVIEW_EnableEvents (U32 EnableMask);
void SEGGER_SYSVIEW_DisableEvents (U32 DisableMask); void SEGGER_SYSVIEW_DisableEvents (U32 DisableMask);
/********************************************************************* /*********************************************************************
* *
* Application-provided functions * Application-provided functions
*/ */
void SEGGER_SYSVIEW_Conf (void); void SEGGER_SYSVIEW_Conf (void);
U32 SEGGER_SYSVIEW_X_GetTimestamp (void); U32 SEGGER_SYSVIEW_X_GetTimestamp (void);
U32 SEGGER_SYSVIEW_X_GetInterruptId (void); U32 SEGGER_SYSVIEW_X_GetInterruptId (void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif
/*************************** End of file ****************************/ /*************************** End of file ****************************/

View File

@@ -1,178 +1,178 @@
/********************************************************************* /*********************************************************************
* SEGGER Microcontroller GmbH & Co. KG * * SEGGER Microcontroller GmbH & Co. KG *
* The Embedded Experts * * The Embedded Experts *
********************************************************************** **********************************************************************
* * * *
* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG * * (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *
* * * *
* www.segger.com Support: support@segger.com * * www.segger.com Support: support@segger.com *
* * * *
********************************************************************** **********************************************************************
* * * *
* SEGGER SystemView * Real-time application analysis * * SEGGER SystemView * Real-time application analysis *
* * * *
********************************************************************** **********************************************************************
* * * *
* All rights reserved. * * All rights reserved. *
* * * *
* SEGGER strongly recommends to not make any changes * * SEGGER strongly recommends to not make any changes *
* to or modify the source code of this software in order to stay * * to or modify the source code of this software in order to stay *
* compatible with the RTT protocol and J-Link. * * compatible with the RTT protocol and J-Link. *
* * * *
* Redistribution and use in source and binary forms, with or * * Redistribution and use in source and binary forms, with or *
* without modification, are permitted provided that the following * * without modification, are permitted provided that the following *
* conditions are met: * * conditions are met: *
* * * *
* o Redistributions of source code must retain the above copyright * * o Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. * * notice, this list of conditions and the following disclaimer. *
* * * *
* o Redistributions in binary form must reproduce the above * * o Redistributions in binary form must reproduce the above *
* copyright notice, this list of conditions and the following * * copyright notice, this list of conditions and the following *
* disclaimer in the documentation and/or other materials provided * * disclaimer in the documentation and/or other materials provided *
* with the distribution. * * with the distribution. *
* * * *
* o Neither the name of SEGGER Microcontroller GmbH & Co. KG * * o Neither the name of SEGGER Microcontroller GmbH & Co. KG *
* nor the names of its contributors may be used to endorse or * * nor the names of its contributors may be used to endorse or *
* promote products derived from this software without specific * * promote products derived from this software without specific *
* prior written permission. * * prior written permission. *
* * * *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
* DAMAGE. * * DAMAGE. *
* * * *
********************************************************************** **********************************************************************
* * * *
* SystemView version: V2.42 * * SystemView version: V2.42 *
* * * *
********************************************************************** **********************************************************************
-------------------------- END-OF-HEADER ----------------------------- -------------------------- END-OF-HEADER -----------------------------
File : SEGGER_SYSVIEW_ConfDefaults.h File : SEGGER_SYSVIEW_ConfDefaults.h
Purpose : Defines defaults for configurable defines used in Purpose : Defines defaults for configurable defines used in
SEGGER SystemView. SEGGER SystemView.
Revision: $Rev: 3734 $ Revision: $Rev: 3734 $
*/ */
#ifndef SEGGER_SYSVIEW_CONFDEFAULTS_H #ifndef SEGGER_SYSVIEW_CONFDEFAULTS_H
#define SEGGER_SYSVIEW_CONFDEFAULTS_H #define SEGGER_SYSVIEW_CONFDEFAULTS_H
/********************************************************************* /*********************************************************************
* *
* #include Section * #include Section
* *
********************************************************************** **********************************************************************
*/ */
#include "SEGGER_SYSVIEW_Conf.h" #include "SEGGER_SYSVIEW_Conf.h"
#include "SEGGER_RTT_Conf.h" #include "SEGGER_RTT_Conf.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/********************************************************************* /*********************************************************************
* *
* Configuration defaults * Configuration defaults
* *
********************************************************************** **********************************************************************
*/ */
// Number of bytes that SystemView uses for a buffer. // Number of bytes that SystemView uses for a buffer.
#ifndef SEGGER_SYSVIEW_RTT_BUFFER_SIZE #ifndef SEGGER_SYSVIEW_RTT_BUFFER_SIZE
#define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 1024 #define SEGGER_SYSVIEW_RTT_BUFFER_SIZE 1024
#endif #endif
// The RTT channel that SystemView will use. // The RTT channel that SystemView will use.
#ifndef SEGGER_SYSVIEW_RTT_CHANNEL #ifndef SEGGER_SYSVIEW_RTT_CHANNEL
#define SEGGER_SYSVIEW_RTT_CHANNEL 0 #define SEGGER_SYSVIEW_RTT_CHANNEL 0
#endif #endif
// Sanity check of RTT channel // Sanity check of RTT channel
#if (SEGGER_SYSVIEW_RTT_CHANNEL == 0) && (SEGGER_RTT_MAX_NUM_UP_BUFFERS < 2) #if (SEGGER_SYSVIEW_RTT_CHANNEL == 0) && (SEGGER_RTT_MAX_NUM_UP_BUFFERS < 2)
#error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > 1!" #error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > 1!"
#elif (SEGGER_SYSVIEW_RTT_CHANNEL >= SEGGER_RTT_MAX_NUM_UP_BUFFERS) #elif (SEGGER_SYSVIEW_RTT_CHANNEL >= SEGGER_RTT_MAX_NUM_UP_BUFFERS)
#error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > SEGGER_SYSVIEW_RTT_CHANNEL!" #error "SEGGER_RTT_MAX_NUM_UP_BUFFERS in SEGGER_RTT_Conf.h has to be > SEGGER_SYSVIEW_RTT_CHANNEL!"
#endif #endif
// Place the SystemView buffer into its own/the RTT section // Place the SystemView buffer into its own/the RTT section
#if !(defined SEGGER_SYSVIEW_BUFFER_SECTION) && (defined SEGGER_RTT_SECTION) #if !(defined SEGGER_SYSVIEW_BUFFER_SECTION) && (defined SEGGER_RTT_SECTION)
#define SEGGER_SYSVIEW_BUFFER_SECTION SEGGER_RTT_SECTION #define SEGGER_SYSVIEW_BUFFER_SECTION SEGGER_RTT_SECTION
#endif #endif
// Retrieve a system timestamp. This gets the Cortex-M cycle counter. // Retrieve a system timestamp. This gets the Cortex-M cycle counter.
#ifndef SEGGER_SYSVIEW_GET_TIMESTAMP #ifndef SEGGER_SYSVIEW_GET_TIMESTAMP
#error "SEGGER_SYSVIEW_GET_TIMESTAMP has to be defined in SEGGER_SYSVIEW_Conf.h!" #error "SEGGER_SYSVIEW_GET_TIMESTAMP has to be defined in SEGGER_SYSVIEW_Conf.h!"
#endif #endif
// Define number of valid bits low-order delivered by clock source. // Define number of valid bits low-order delivered by clock source.
#ifndef SEGGER_SYSVIEW_TIMESTAMP_BITS #ifndef SEGGER_SYSVIEW_TIMESTAMP_BITS
#define SEGGER_SYSVIEW_TIMESTAMP_BITS 32 #define SEGGER_SYSVIEW_TIMESTAMP_BITS 32
#endif #endif
// Lowest Id reported by the Application. // Lowest Id reported by the Application.
#ifndef SEGGER_SYSVIEW_ID_BASE #ifndef SEGGER_SYSVIEW_ID_BASE
#define SEGGER_SYSVIEW_ID_BASE 0 #define SEGGER_SYSVIEW_ID_BASE 0
#endif #endif
// Number of bits to shift Ids to save bandwidth // Number of bits to shift Ids to save bandwidth
#ifndef SEGGER_SYSVIEW_ID_SHIFT #ifndef SEGGER_SYSVIEW_ID_SHIFT
#define SEGGER_SYSVIEW_ID_SHIFT 0 #define SEGGER_SYSVIEW_ID_SHIFT 0
#endif #endif
#ifndef SEGGER_SYSVIEW_GET_INTERRUPT_ID #ifndef SEGGER_SYSVIEW_GET_INTERRUPT_ID
#error "SEGGER_SYSVIEW_GET_INTERRUPT_ID has to be defined in SEGGER_SYSVIEW_Conf.h!" #error "SEGGER_SYSVIEW_GET_INTERRUPT_ID has to be defined in SEGGER_SYSVIEW_Conf.h!"
#endif #endif
#ifndef SEGGER_SYSVIEW_MAX_ARGUMENTS #ifndef SEGGER_SYSVIEW_MAX_ARGUMENTS
#define SEGGER_SYSVIEW_MAX_ARGUMENTS 16 #define SEGGER_SYSVIEW_MAX_ARGUMENTS 16
#endif #endif
#ifndef SEGGER_SYSVIEW_MAX_STRING_LEN #ifndef SEGGER_SYSVIEW_MAX_STRING_LEN
#define SEGGER_SYSVIEW_MAX_STRING_LEN 128 #define SEGGER_SYSVIEW_MAX_STRING_LEN 128
#endif #endif
// Use a static buffer instead of a buffer on the stack for packets // Use a static buffer instead of a buffer on the stack for packets
#ifndef SEGGER_SYSVIEW_USE_STATIC_BUFFER #ifndef SEGGER_SYSVIEW_USE_STATIC_BUFFER
#define SEGGER_SYSVIEW_USE_STATIC_BUFFER 1 #define SEGGER_SYSVIEW_USE_STATIC_BUFFER 1
#endif #endif
// Maximum packet size used by SystemView for the static buffer // Maximum packet size used by SystemView for the static buffer
#ifndef SEGGER_SYSVIEW_MAX_PACKET_SIZE #ifndef SEGGER_SYSVIEW_MAX_PACKET_SIZE
#define SEGGER_SYSVIEW_MAX_PACKET_SIZE SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_ARGUMENTS * SEGGER_SYSVIEW_QUANTA_U32 #define SEGGER_SYSVIEW_MAX_PACKET_SIZE SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_MAX_STRING_LEN + 2 * SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_ARGUMENTS * SEGGER_SYSVIEW_QUANTA_U32
#endif #endif
// Use post-mortem analysis instead of real-time analysis // Use post-mortem analysis instead of real-time analysis
#ifndef SEGGER_SYSVIEW_POST_MORTEM_MODE #ifndef SEGGER_SYSVIEW_POST_MORTEM_MODE
#define SEGGER_SYSVIEW_POST_MORTEM_MODE 0 #define SEGGER_SYSVIEW_POST_MORTEM_MODE 0
#endif #endif
// Configure how frequently syncronization is sent // Configure how frequently syncronization is sent
#ifndef SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT #ifndef SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT
#define SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT 8 #define SEGGER_SYSVIEW_SYNC_PERIOD_SHIFT 8
#endif #endif
// Lock SystemView (nestable) // Lock SystemView (nestable)
#ifndef SEGGER_SYSVIEW_LOCK #ifndef SEGGER_SYSVIEW_LOCK
#define SEGGER_SYSVIEW_LOCK() SEGGER_RTT_LOCK() #define SEGGER_SYSVIEW_LOCK() SEGGER_RTT_LOCK()
#endif #endif
// Unlock SystemView (nestable) // Unlock SystemView (nestable)
#ifndef SEGGER_SYSVIEW_UNLOCK #ifndef SEGGER_SYSVIEW_UNLOCK
#define SEGGER_SYSVIEW_UNLOCK() SEGGER_RTT_UNLOCK() #define SEGGER_SYSVIEW_UNLOCK() SEGGER_RTT_UNLOCK()
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif
/*************************** End of file ****************************/ /*************************** End of file ****************************/

View File

@@ -1,110 +1,110 @@
/********************************************************************* /*********************************************************************
* SEGGER Microcontroller GmbH & Co. KG * * SEGGER Microcontroller GmbH & Co. KG *
* The Embedded Experts * * The Embedded Experts *
********************************************************************** **********************************************************************
* * * *
* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG * * (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *
* * * *
* www.segger.com Support: support@segger.com * * www.segger.com Support: support@segger.com *
* * * *
********************************************************************** **********************************************************************
* * * *
* SEGGER SystemView * Real-time application analysis * * SEGGER SystemView * Real-time application analysis *
* * * *
********************************************************************** **********************************************************************
* * * *
* All rights reserved. * * All rights reserved. *
* * * *
* SEGGER strongly recommends to not make any changes * * SEGGER strongly recommends to not make any changes *
* to or modify the source code of this software in order to stay * * to or modify the source code of this software in order to stay *
* compatible with the RTT protocol and J-Link. * * compatible with the RTT protocol and J-Link. *
* * * *
* Redistribution and use in source and binary forms, with or * * Redistribution and use in source and binary forms, with or *
* without modification, are permitted provided that the following * * without modification, are permitted provided that the following *
* conditions are met: * * conditions are met: *
* * * *
* o Redistributions of source code must retain the above copyright * * o Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. * * notice, this list of conditions and the following disclaimer. *
* * * *
* o Redistributions in binary form must reproduce the above * * o Redistributions in binary form must reproduce the above *
* copyright notice, this list of conditions and the following * * copyright notice, this list of conditions and the following *
* disclaimer in the documentation and/or other materials provided * * disclaimer in the documentation and/or other materials provided *
* with the distribution. * * with the distribution. *
* * * *
* o Neither the name of SEGGER Microcontroller GmbH & Co. KG * * o Neither the name of SEGGER Microcontroller GmbH & Co. KG *
* nor the names of its contributors may be used to endorse or * * nor the names of its contributors may be used to endorse or *
* promote products derived from this software without specific * * promote products derived from this software without specific *
* prior written permission. * * prior written permission. *
* * * *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
* DAMAGE. * * DAMAGE. *
* * * *
********************************************************************** **********************************************************************
* * * *
* SystemView version: V2.42 * * SystemView version: V2.42 *
* * * *
********************************************************************** **********************************************************************
-------------------------- END-OF-HEADER ----------------------------- -------------------------- END-OF-HEADER -----------------------------
File : SEGGER_SYSVIEW_Int.h File : SEGGER_SYSVIEW_Int.h
Purpose : SEGGER SystemView internal header. Purpose : SEGGER SystemView internal header.
Revision: $Rev: 5626 $ Revision: $Rev: 5626 $
*/ */
#ifndef SEGGER_SYSVIEW_INT_H #ifndef SEGGER_SYSVIEW_INT_H
#define SEGGER_SYSVIEW_INT_H #define SEGGER_SYSVIEW_INT_H
/********************************************************************* /*********************************************************************
* *
* #include Section * #include Section
* *
********************************************************************** **********************************************************************
*/ */
#include "SEGGER_SYSVIEW.h" #include "SEGGER_SYSVIEW.h"
#include "SEGGER_SYSVIEW_Conf.h" #include "SEGGER_SYSVIEW_Conf.h"
#include "SEGGER_SYSVIEW_ConfDefaults.h" #include "SEGGER_SYSVIEW_ConfDefaults.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/********************************************************************* /*********************************************************************
* *
* Private data types * Private data types
* *
********************************************************************** **********************************************************************
*/ */
// //
// Commands that Host can send to target // Commands that Host can send to target
// //
typedef enum { typedef enum {
SEGGER_SYSVIEW_COMMAND_ID_START = 1, SEGGER_SYSVIEW_COMMAND_ID_START = 1,
SEGGER_SYSVIEW_COMMAND_ID_STOP, SEGGER_SYSVIEW_COMMAND_ID_STOP,
SEGGER_SYSVIEW_COMMAND_ID_GET_SYSTIME, SEGGER_SYSVIEW_COMMAND_ID_GET_SYSTIME,
SEGGER_SYSVIEW_COMMAND_ID_GET_TASKLIST, SEGGER_SYSVIEW_COMMAND_ID_GET_TASKLIST,
SEGGER_SYSVIEW_COMMAND_ID_GET_SYSDESC, SEGGER_SYSVIEW_COMMAND_ID_GET_SYSDESC,
SEGGER_SYSVIEW_COMMAND_ID_GET_NUMMODULES, SEGGER_SYSVIEW_COMMAND_ID_GET_NUMMODULES,
SEGGER_SYSVIEW_COMMAND_ID_GET_MODULEDESC, SEGGER_SYSVIEW_COMMAND_ID_GET_MODULEDESC,
// Extended commands: Commands >= 128 have a second parameter // Extended commands: Commands >= 128 have a second parameter
SEGGER_SYSVIEW_COMMAND_ID_GET_MODULE = 128 SEGGER_SYSVIEW_COMMAND_ID_GET_MODULE = 128
} SEGGER_SYSVIEW_COMMAND_ID; } SEGGER_SYSVIEW_COMMAND_ID;
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif
/*************************** End of file ****************************/ /*************************** End of file ****************************/

View File

@@ -1,290 +1,290 @@
/********************************************************************* /*********************************************************************
* SEGGER Microcontroller GmbH & Co. KG * * SEGGER Microcontroller GmbH & Co. KG *
* The Embedded Experts * * The Embedded Experts *
********************************************************************** **********************************************************************
* * * *
* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG * * (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *
* * * *
* www.segger.com Support: support@segger.com * * www.segger.com Support: support@segger.com *
* * * *
********************************************************************** **********************************************************************
* * * *
* SEGGER SystemView * Real-time application analysis * * SEGGER SystemView * Real-time application analysis *
* * * *
********************************************************************** **********************************************************************
* * * *
* All rights reserved. * * All rights reserved. *
* * * *
* SEGGER strongly recommends to not make any changes * * SEGGER strongly recommends to not make any changes *
* to or modify the source code of this software in order to stay * * to or modify the source code of this software in order to stay *
* compatible with the RTT protocol and J-Link. * * compatible with the RTT protocol and J-Link. *
* * * *
* Redistribution and use in source and binary forms, with or * * Redistribution and use in source and binary forms, with or *
* without modification, are permitted provided that the following * * without modification, are permitted provided that the following *
* conditions are met: * * conditions are met: *
* * * *
* o Redistributions of source code must retain the above copyright * * o Redistributions of source code must retain the above copyright *
* notice, this list of conditions and the following disclaimer. * * notice, this list of conditions and the following disclaimer. *
* * * *
* o Redistributions in binary form must reproduce the above * * o Redistributions in binary form must reproduce the above *
* copyright notice, this list of conditions and the following * * copyright notice, this list of conditions and the following *
* disclaimer in the documentation and/or other materials provided * * disclaimer in the documentation and/or other materials provided *
* with the distribution. * * with the distribution. *
* * * *
* o Neither the name of SEGGER Microcontroller GmbH & Co. KG * * o Neither the name of SEGGER Microcontroller GmbH & Co. KG *
* nor the names of its contributors may be used to endorse or * * nor the names of its contributors may be used to endorse or *
* promote products derived from this software without specific * * promote products derived from this software without specific *
* prior written permission. * * prior written permission. *
* * * *
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR * * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
* DAMAGE. * * DAMAGE. *
* * * *
********************************************************************** **********************************************************************
* * * *
* SystemView version: V2.42 * * SystemView version: V2.42 *
* * * *
********************************************************************** **********************************************************************
-------------------------- END-OF-HEADER ----------------------------- -------------------------- END-OF-HEADER -----------------------------
File : SEGGER_SYSVIEW_FreeRTOS.c File : SEGGER_SYSVIEW_FreeRTOS.c
Purpose : Interface between FreeRTOS and SystemView. Purpose : Interface between FreeRTOS and SystemView.
Revision: $Rev: 3734 $ Revision: $Rev: 3734 $
*/ */
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "SEGGER_SYSVIEW.h" #include "SEGGER_SYSVIEW.h"
#include "SEGGER_SYSVIEW_FreeRTOS.h" #include "SEGGER_SYSVIEW_FreeRTOS.h"
#include "string.h" // Required for memset #include "string.h" // Required for memset
typedef struct SYSVIEW_FREERTOS_TASK_STATUS SYSVIEW_FREERTOS_TASK_STATUS; typedef struct SYSVIEW_FREERTOS_TASK_STATUS SYSVIEW_FREERTOS_TASK_STATUS;
struct SYSVIEW_FREERTOS_TASK_STATUS { struct SYSVIEW_FREERTOS_TASK_STATUS {
U32 xHandle; U32 xHandle;
const char* pcTaskName; const char* pcTaskName;
unsigned uxCurrentPriority; unsigned uxCurrentPriority;
U32 pxStack; U32 pxStack;
unsigned uStackHighWaterMark; unsigned uStackHighWaterMark;
}; };
static SYSVIEW_FREERTOS_TASK_STATUS _aTasks[SYSVIEW_FREERTOS_MAX_NOF_TASKS]; static SYSVIEW_FREERTOS_TASK_STATUS _aTasks[SYSVIEW_FREERTOS_MAX_NOF_TASKS];
/********************************************************************* /*********************************************************************
* *
* _cbSendTaskList() * _cbSendTaskList()
* *
* Function description * Function description
* This function is part of the link between FreeRTOS and SYSVIEW. * This function is part of the link between FreeRTOS and SYSVIEW.
* Called from SystemView when asked by the host, it uses SYSVIEW * Called from SystemView when asked by the host, it uses SYSVIEW
* functions to send the entire task list to the host. * functions to send the entire task list to the host.
*/ */
static void _cbSendTaskList(void) { static void _cbSendTaskList(void) {
unsigned n; unsigned n;
for (n = 0; n < SYSVIEW_FREERTOS_MAX_NOF_TASKS; n++) { for (n = 0; n < SYSVIEW_FREERTOS_MAX_NOF_TASKS; n++) {
if (_aTasks[n].xHandle) { if (_aTasks[n].xHandle) {
#if INCLUDE_uxTaskGetStackHighWaterMark // Report Task Stack High Watermark #if INCLUDE_uxTaskGetStackHighWaterMark // Report Task Stack High Watermark
_aTasks[n].uStackHighWaterMark = uxTaskGetStackHighWaterMark((TaskHandle_t)_aTasks[n].xHandle); _aTasks[n].uStackHighWaterMark = uxTaskGetStackHighWaterMark((TaskHandle_t)_aTasks[n].xHandle);
#endif #endif
SYSVIEW_SendTaskInfo((U32)_aTasks[n].xHandle, _aTasks[n].pcTaskName, (unsigned)_aTasks[n].uxCurrentPriority, (U32)_aTasks[n].pxStack, (unsigned)_aTasks[n].uStackHighWaterMark); SYSVIEW_SendTaskInfo((U32)_aTasks[n].xHandle, _aTasks[n].pcTaskName, (unsigned)_aTasks[n].uxCurrentPriority, (U32)_aTasks[n].pxStack, (unsigned)_aTasks[n].uStackHighWaterMark);
} }
} }
} }
/********************************************************************* /*********************************************************************
* *
* _cbGetTime() * _cbGetTime()
* *
* Function description * Function description
* This function is part of the link between FreeRTOS and SYSVIEW. * This function is part of the link between FreeRTOS and SYSVIEW.
* Called from SystemView when asked by the host, returns the * Called from SystemView when asked by the host, returns the
* current system time in micro seconds. * current system time in micro seconds.
*/ */
static U64 _cbGetTime(void) { static U64 _cbGetTime(void) {
U64 Time; U64 Time;
Time = xTaskGetTickCountFromISR(); Time = xTaskGetTickCountFromISR();
Time *= portTICK_PERIOD_MS; Time *= portTICK_PERIOD_MS;
Time *= 1000; Time *= 1000;
return Time; return Time;
} }
/********************************************************************* /*********************************************************************
* *
* Global functions * Global functions
* *
********************************************************************** **********************************************************************
*/ */
/********************************************************************* /*********************************************************************
* *
* SYSVIEW_AddTask() * SYSVIEW_AddTask()
* *
* Function description * Function description
* Add a task to the internal list and record its information. * Add a task to the internal list and record its information.
*/ */
void SYSVIEW_AddTask(U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark) { void SYSVIEW_AddTask(U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark) {
unsigned n; unsigned n;
if (memcmp(pcTaskName, "IDLE", 5) == 0) { if (memcmp(pcTaskName, "IDLE", 5) == 0) {
return; return;
} }
for (n = 0; n < SYSVIEW_FREERTOS_MAX_NOF_TASKS; n++) { for (n = 0; n < SYSVIEW_FREERTOS_MAX_NOF_TASKS; n++) {
if (_aTasks[n].xHandle == 0) { if (_aTasks[n].xHandle == 0) {
break; break;
} }
} }
if (n == SYSVIEW_FREERTOS_MAX_NOF_TASKS) { if (n == SYSVIEW_FREERTOS_MAX_NOF_TASKS) {
SEGGER_SYSVIEW_Warn("SYSTEMVIEW: Could not record task information. Maximum number of tasks reached."); SEGGER_SYSVIEW_Warn("SYSTEMVIEW: Could not record task information. Maximum number of tasks reached.");
return; return;
} }
_aTasks[n].xHandle = xHandle; _aTasks[n].xHandle = xHandle;
_aTasks[n].pcTaskName = pcTaskName; _aTasks[n].pcTaskName = pcTaskName;
_aTasks[n].uxCurrentPriority = uxCurrentPriority; _aTasks[n].uxCurrentPriority = uxCurrentPriority;
_aTasks[n].pxStack = pxStack; _aTasks[n].pxStack = pxStack;
_aTasks[n].uStackHighWaterMark = uStackHighWaterMark; _aTasks[n].uStackHighWaterMark = uStackHighWaterMark;
SYSVIEW_SendTaskInfo(xHandle, pcTaskName,uxCurrentPriority, pxStack, uStackHighWaterMark); SYSVIEW_SendTaskInfo(xHandle, pcTaskName,uxCurrentPriority, pxStack, uStackHighWaterMark);
} }
/********************************************************************* /*********************************************************************
* *
* SYSVIEW_UpdateTask() * SYSVIEW_UpdateTask()
* *
* Function description * Function description
* Update a task in the internal list and record its information. * Update a task in the internal list and record its information.
*/ */
void SYSVIEW_UpdateTask(U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark) { void SYSVIEW_UpdateTask(U32 xHandle, const char* pcTaskName, unsigned uxCurrentPriority, U32 pxStack, unsigned uStackHighWaterMark) {
unsigned n; unsigned n;
if (memcmp(pcTaskName, "IDLE", 5) == 0) { if (memcmp(pcTaskName, "IDLE", 5) == 0) {
return; return;
} }
for (n = 0; n < SYSVIEW_FREERTOS_MAX_NOF_TASKS; n++) { for (n = 0; n < SYSVIEW_FREERTOS_MAX_NOF_TASKS; n++) {
if (_aTasks[n].xHandle == xHandle) { if (_aTasks[n].xHandle == xHandle) {
break; break;
} }
} }
if (n < SYSVIEW_FREERTOS_MAX_NOF_TASKS) { if (n < SYSVIEW_FREERTOS_MAX_NOF_TASKS) {
_aTasks[n].pcTaskName = pcTaskName; _aTasks[n].pcTaskName = pcTaskName;
_aTasks[n].uxCurrentPriority = uxCurrentPriority; _aTasks[n].uxCurrentPriority = uxCurrentPriority;
_aTasks[n].pxStack = pxStack; _aTasks[n].pxStack = pxStack;
_aTasks[n].uStackHighWaterMark = uStackHighWaterMark; _aTasks[n].uStackHighWaterMark = uStackHighWaterMark;
SYSVIEW_SendTaskInfo(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark); SYSVIEW_SendTaskInfo(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark);
} else { } else {
SYSVIEW_AddTask(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark); SYSVIEW_AddTask(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark);
} }
} }
/********************************************************************* /*********************************************************************
* *
* SYSVIEW_DeleteTask() * SYSVIEW_DeleteTask()
* *
* Function description * Function description
* Delete a task from the internal list. * Delete a task from the internal list.
*/ */
void SYSVIEW_DeleteTask(U32 xHandle) { void SYSVIEW_DeleteTask(U32 xHandle) {
unsigned n; unsigned n;
for (n = 0; n < SYSVIEW_FREERTOS_MAX_NOF_TASKS; n++) { for (n = 0; n < SYSVIEW_FREERTOS_MAX_NOF_TASKS; n++) {
if (_aTasks[n].xHandle == xHandle) { if (_aTasks[n].xHandle == xHandle) {
break; break;
} }
} }
if (n == SYSVIEW_FREERTOS_MAX_NOF_TASKS) { if (n == SYSVIEW_FREERTOS_MAX_NOF_TASKS) {
SEGGER_SYSVIEW_Warn("SYSTEMVIEW: Could not find task information. Cannot delete task."); SEGGER_SYSVIEW_Warn("SYSTEMVIEW: Could not find task information. Cannot delete task.");
return; return;
} }
_aTasks[n].xHandle = 0; _aTasks[n].xHandle = 0;
} }
/********************************************************************* /*********************************************************************
* *
* SYSVIEW_SendTaskInfo() * SYSVIEW_SendTaskInfo()
* *
* Function description * Function description
* Record task information. * Record task information.
*/ */
void SYSVIEW_SendTaskInfo(U32 TaskID, const char* sName, unsigned Prio, U32 StackBase, unsigned StackSize) { void SYSVIEW_SendTaskInfo(U32 TaskID, const char* sName, unsigned Prio, U32 StackBase, unsigned StackSize) {
SEGGER_SYSVIEW_TASKINFO TaskInfo; SEGGER_SYSVIEW_TASKINFO TaskInfo;
memset(&TaskInfo, 0, sizeof(TaskInfo)); // Fill all elements with 0 to allow extending the structure in future version without breaking the code memset(&TaskInfo, 0, sizeof(TaskInfo)); // Fill all elements with 0 to allow extending the structure in future version without breaking the code
TaskInfo.TaskID = TaskID; TaskInfo.TaskID = TaskID;
TaskInfo.sName = sName; TaskInfo.sName = sName;
TaskInfo.Prio = Prio; TaskInfo.Prio = Prio;
TaskInfo.StackBase = StackBase; TaskInfo.StackBase = StackBase;
TaskInfo.StackSize = StackSize; TaskInfo.StackSize = StackSize;
SEGGER_SYSVIEW_SendTaskInfo(&TaskInfo); SEGGER_SYSVIEW_SendTaskInfo(&TaskInfo);
} }
/********************************************************************* /*********************************************************************
* *
* SYSVIEW_RecordU32x4() * SYSVIEW_RecordU32x4()
* *
* Function description * Function description
* Record an event with 4 parameters * Record an event with 4 parameters
*/ */
void SYSVIEW_RecordU32x4(unsigned Id, U32 Para0, U32 Para1, U32 Para2, U32 Para3) { void SYSVIEW_RecordU32x4(unsigned Id, U32 Para0, U32 Para1, U32 Para2, U32 Para3) {
U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32]; U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32];
U8* pPayload; U8* pPayload;
// //
pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); // Prepare the packet for SystemView pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); // Prepare the packet for SystemView
pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0); // Add the first parameter to the packet pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0); // Add the first parameter to the packet
pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1); // Add the second parameter to the packet pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1); // Add the second parameter to the packet
pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para2); // Add the third parameter to the packet pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para2); // Add the third parameter to the packet
pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para3); // Add the fourth parameter to the packet pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para3); // Add the fourth parameter to the packet
// //
SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, Id); // Send the packet SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, Id); // Send the packet
} }
/********************************************************************* /*********************************************************************
* *
* SYSVIEW_RecordU32x5() * SYSVIEW_RecordU32x5()
* *
* Function description * Function description
* Record an event with 5 parameters * Record an event with 5 parameters
*/ */
void SYSVIEW_RecordU32x5(unsigned Id, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4) { void SYSVIEW_RecordU32x5(unsigned Id, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4) {
U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 5 * SEGGER_SYSVIEW_QUANTA_U32]; U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 5 * SEGGER_SYSVIEW_QUANTA_U32];
U8* pPayload; U8* pPayload;
// //
pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); // Prepare the packet for SystemView pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); // Prepare the packet for SystemView
pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0); // Add the first parameter to the packet pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0); // Add the first parameter to the packet
pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1); // Add the second parameter to the packet pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1); // Add the second parameter to the packet
pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para2); // Add the third parameter to the packet pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para2); // Add the third parameter to the packet
pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para3); // Add the fourth parameter to the packet pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para3); // Add the fourth parameter to the packet
pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para4); // Add the fifth parameter to the packet pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para4); // Add the fifth parameter to the packet
// //
SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, Id); // Send the packet SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, Id); // Send the packet
} }
/********************************************************************* /*********************************************************************
* *
* Public API structures * Public API structures
* *
********************************************************************** **********************************************************************
*/ */
// Callbacks provided to SYSTEMVIEW by FreeRTOS // Callbacks provided to SYSTEMVIEW by FreeRTOS
const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = { const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = {
_cbGetTime, _cbGetTime,
_cbSendTaskList, _cbSendTaskList,
}; };
/*************************** End of file ****************************/ /*************************** End of file ****************************/

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,53 +1,53 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// //
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include <stdint.h> #include <stdint.h>
#include "rom/crc.h" #include "rom/crc.h"
#include "sdspi_crc.h" #include "sdspi_crc.h"
static const uint8_t crc7_table[256] = static const uint8_t crc7_table[256] =
{ {
0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77,
0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26, 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e, 0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26, 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e,
0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d, 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, 0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d, 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45,
0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, 0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c, 0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, 0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c,
0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, 0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13, 0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, 0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13,
0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a, 0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a,
0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21,
0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38, 0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38,
0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e, 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36, 0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e, 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36,
0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f, 0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f,
0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04,
0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d, 0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d,
0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52, 0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52,
0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b, 0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b,
0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28, 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60, 0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28, 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60,
0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31, 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79, 0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31, 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79,
}; };
// returns the CRC-7 for a message of "length" bytes // returns the CRC-7 for a message of "length" bytes
uint8_t sdspi_crc7(const uint8_t *data, size_t size) uint8_t sdspi_crc7(const uint8_t *data, size_t size)
{ {
uint8_t result = 0; uint8_t result = 0;
for (size_t i = 0; i < size; ++i) { for (size_t i = 0; i < size; ++i) {
result = crc7_table[(result << 1) ^ data[i]]; result = crc7_table[(result << 1) ^ data[i]];
} }
return result; return result;
} }
/// Return CRC16 of data, in the on-the-wire format used by SD protocol /// Return CRC16 of data, in the on-the-wire format used by SD protocol
uint16_t sdspi_crc16(const uint8_t* data, size_t size) uint16_t sdspi_crc16(const uint8_t* data, size_t size)
{ {
return __builtin_bswap16(crc16_be(UINT16_MAX, data, size) ^ UINT16_MAX); return __builtin_bswap16(crc16_be(UINT16_MAX, data, size) ^ UINT16_MAX);
} }

View File

@@ -1,43 +1,43 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// //
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#endif #endif
/** /**
* @brief Return CRC7 of data, in the format used by SD protocol * @brief Return CRC7 of data, in the format used by SD protocol
* @param data array of data used to compute CRC * @param data array of data used to compute CRC
* @param size size of data in bytes * @param size size of data in bytes
* @return CRC7 value * @return CRC7 value
*/ */
uint8_t sdspi_crc7(const uint8_t *data, size_t size); uint8_t sdspi_crc7(const uint8_t *data, size_t size);
/** /**
* @brief Return CRC16 of data, in the format used by SD protocol * @brief Return CRC16 of data, in the format used by SD protocol
* @param data array of data used to compute CRC * @param data array of data used to compute CRC
* @param size size of data in bytes * @param size size of data in bytes
* @return CRC16 value * @return CRC16 value
*/ */
uint16_t sdspi_crc16(const uint8_t* data, size_t size); uint16_t sdspi_crc16(const uint8_t* data, size_t size);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,99 +1,99 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// //
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
#include "esp_err.h" #include "esp_err.h"
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/queue.h" #include "freertos/queue.h"
/// Control tokens used to frame data transfers /// Control tokens used to frame data transfers
/// (see section 7.3.3 of SD simplified spec) /// (see section 7.3.3 of SD simplified spec)
/// Token sent before single/multi block reads and single block writes /// Token sent before single/multi block reads and single block writes
#define TOKEN_BLOCK_START 0b11111110 #define TOKEN_BLOCK_START 0b11111110
/// Token sent before multi block writes /// Token sent before multi block writes
#define TOKEN_BLOCK_START_WRITE_MULTI 0b11111100 #define TOKEN_BLOCK_START_WRITE_MULTI 0b11111100
/// Token used to stop multi block write (for reads, CMD12 is used instead) /// Token used to stop multi block write (for reads, CMD12 is used instead)
#define TOKEN_BLOCK_STOP_WRITE_MULTI 0b11111101 #define TOKEN_BLOCK_STOP_WRITE_MULTI 0b11111101
/// Data response tokens /// Data response tokens
/// Mask (high 3 bits are undefined for data response tokens) /// Mask (high 3 bits are undefined for data response tokens)
#define TOKEN_RSP_MASK 0b11111 #define TOKEN_RSP_MASK 0b11111
/// Data accepted /// Data accepted
#define TOKEN_RSP_OK 0b00101 #define TOKEN_RSP_OK 0b00101
/// Data rejected due to CRC error /// Data rejected due to CRC error
#define TOKEN_RSP_CRC_ERR 0b01011 #define TOKEN_RSP_CRC_ERR 0b01011
/// Data rejected due to write error /// Data rejected due to write error
#define TOKEN_RSP_WRITE_ERR 0b01101 #define TOKEN_RSP_WRITE_ERR 0b01101
/// Data error tokens have format 0b0000xyzw where xyzw are signle bit flags. /// Data error tokens have format 0b0000xyzw where xyzw are signle bit flags.
/// MASK and VAL are used to check if a token is an error token /// MASK and VAL are used to check if a token is an error token
#define TOKEN_ERR_MASK 0b11110000 #define TOKEN_ERR_MASK 0b11110000
#define TOKEN_ERR_VAL 0b00000000 #define TOKEN_ERR_VAL 0b00000000
/// Argument is out of range /// Argument is out of range
#define TOKEN_ERR_RANGE BIT(3) #define TOKEN_ERR_RANGE BIT(3)
/// Card internal ECC error /// Card internal ECC error
#define TOKEN_ERR_CARD_ECC BIT(2) #define TOKEN_ERR_CARD_ECC BIT(2)
/// Card controller error /// Card controller error
#define TOKEN_ERR_INTERNAL BIT(1) #define TOKEN_ERR_INTERNAL BIT(1)
/// Card is locked /// Card is locked
#define TOKEN_ERR_LOCKED BIT(0) #define TOKEN_ERR_LOCKED BIT(0)
/// Transfer format in SPI mode. See section 7.3.1.1 of SD simplified spec. /// Transfer format in SPI mode. See section 7.3.1.1 of SD simplified spec.
typedef struct { typedef struct {
// These fields form the command sent from host to the card (6 bytes) // These fields form the command sent from host to the card (6 bytes)
uint8_t cmd_index : 6; uint8_t cmd_index : 6;
uint8_t transmission_bit : 1; uint8_t transmission_bit : 1;
uint8_t start_bit : 1; uint8_t start_bit : 1;
uint8_t arguments[4]; uint8_t arguments[4];
uint8_t stop_bit : 1; uint8_t stop_bit : 1;
uint8_t crc7 : 7; uint8_t crc7 : 7;
/// Ncr is the dead time between command and response; should be 0xff /// Ncr is the dead time between command and response; should be 0xff
uint8_t ncr; uint8_t ncr;
/// Response data, should be set by host to 0xff for read operations /// Response data, should be set by host to 0xff for read operations
uint8_t r1; uint8_t r1;
/// Up to 16 bytes of response. Luckily, this is aligned on 4 byte boundary. /// Up to 16 bytes of response. Luckily, this is aligned on 4 byte boundary.
uint32_t response[4]; uint32_t response[4];
/// response timeout, in milliseconds /// response timeout, in milliseconds
int timeout_ms; int timeout_ms;
} sdspi_hw_cmd_t; } sdspi_hw_cmd_t;
#define SDSPI_CMD_NORESP_SIZE 6 //!< Size of the command without any response #define SDSPI_CMD_NORESP_SIZE 6 //!< Size of the command without any response
#define SDSPI_CMD_R1_SIZE 8 //!< Size of the command with R1 response #define SDSPI_CMD_R1_SIZE 8 //!< Size of the command with R1 response
#define SDSPI_CMD_R2_SIZE 9 //!< Size of the command with R1b response #define SDSPI_CMD_R2_SIZE 9 //!< Size of the command with R1b response
#define SDSPI_CMD_R3_SIZE 12 //!< Size of the command with R3 response #define SDSPI_CMD_R3_SIZE 12 //!< Size of the command with R3 response
#define SDSPI_CMD_R7_SIZE 12 //!< Size of the command with R7 response #define SDSPI_CMD_R7_SIZE 12 //!< Size of the command with R7 response
#define SDSPI_CMD_FLAG_DATA BIT(0) //!< Command has data transfer #define SDSPI_CMD_FLAG_DATA BIT(0) //!< Command has data transfer
#define SDSPI_CMD_FLAG_WRITE BIT(1) //!< Data is written to the card #define SDSPI_CMD_FLAG_WRITE BIT(1) //!< Data is written to the card
#define SDSPI_CMD_FLAG_RSP_R1 BIT(2) //!< Response format R1 (1 byte) #define SDSPI_CMD_FLAG_RSP_R1 BIT(2) //!< Response format R1 (1 byte)
#define SDSPI_CMD_FLAG_RSP_R2 BIT(3) //!< Response format R2 (2 bytes) #define SDSPI_CMD_FLAG_RSP_R2 BIT(3) //!< Response format R2 (2 bytes)
#define SDSPI_CMD_FLAG_RSP_R3 BIT(4) //!< Response format R3 (5 bytes) #define SDSPI_CMD_FLAG_RSP_R3 BIT(4) //!< Response format R3 (5 bytes)
#define SDSPI_CMD_FLAG_RSP_R7 BIT(5) //!< Response format R7 (5 bytes) #define SDSPI_CMD_FLAG_RSP_R7 BIT(5) //!< Response format R7 (5 bytes)
#define SDSPI_CMD_FLAG_NORSP BIT(6) //!< Don't expect response (used when sending CMD0 first time). #define SDSPI_CMD_FLAG_NORSP BIT(6) //!< Don't expect response (used when sending CMD0 first time).
#define SDSPI_MAX_DATA_LEN 512 //!< Max size of single block transfer #define SDSPI_MAX_DATA_LEN 512 //!< Max size of single block transfer
void make_hw_cmd(uint32_t opcode, uint32_t arg, int timeout_ms, sdspi_hw_cmd_t *hw_cmd); void make_hw_cmd(uint32_t opcode, uint32_t arg, int timeout_ms, sdspi_hw_cmd_t *hw_cmd);
esp_err_t sdspi_host_start_command(int slot, sdspi_hw_cmd_t *cmd, esp_err_t sdspi_host_start_command(int slot, sdspi_hw_cmd_t *cmd,
void *data, uint32_t data_size, int flags); void *data, uint32_t data_size, int flags);

View File

@@ -1,314 +1,314 @@
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
Revision history of FatFs module Revision history of FatFs module
---------------------------------------------------------------------------- ----------------------------------------------------------------------------
R0.00 (February 26, 2006) R0.00 (February 26, 2006)
Prototype. Prototype.
R0.01 (April 29, 2006) R0.01 (April 29, 2006)
The first release. The first release.
R0.02 (June 01, 2006) R0.02 (June 01, 2006)
Added FAT12 support. Added FAT12 support.
Removed unbuffered mode. Removed unbuffered mode.
Fixed a problem on small (<32M) partition. Fixed a problem on small (<32M) partition.
R0.02a (June 10, 2006) R0.02a (June 10, 2006)
Added a configuration option (_FS_MINIMUM). Added a configuration option (_FS_MINIMUM).
R0.03 (September 22, 2006) R0.03 (September 22, 2006)
Added f_rename(). Added f_rename().
Changed option _FS_MINIMUM to _FS_MINIMIZE. Changed option _FS_MINIMUM to _FS_MINIMIZE.
R0.03a (December 11, 2006) R0.03a (December 11, 2006)
Improved cluster scan algorithm to write files fast. Improved cluster scan algorithm to write files fast.
Fixed f_mkdir() creates incorrect directory on FAT32. Fixed f_mkdir() creates incorrect directory on FAT32.
R0.04 (February 04, 2007) R0.04 (February 04, 2007)
Added f_mkfs(). Added f_mkfs().
Supported multiple drive system. Supported multiple drive system.
Changed some interfaces for multiple drive system. Changed some interfaces for multiple drive system.
Changed f_mountdrv() to f_mount(). Changed f_mountdrv() to f_mount().
R0.04a (April 01, 2007) R0.04a (April 01, 2007)
Supported multiple partitions on a physical drive. Supported multiple partitions on a physical drive.
Added a capability of extending file size to f_lseek(). Added a capability of extending file size to f_lseek().
Added minimization level 3. Added minimization level 3.
Fixed an endian sensitive code in f_mkfs(). Fixed an endian sensitive code in f_mkfs().
R0.04b (May 05, 2007) R0.04b (May 05, 2007)
Added a configuration option _USE_NTFLAG. Added a configuration option _USE_NTFLAG.
Added FSINFO support. Added FSINFO support.
Fixed DBCS name can result FR_INVALID_NAME. Fixed DBCS name can result FR_INVALID_NAME.
Fixed short seek (<= csize) collapses the file object. Fixed short seek (<= csize) collapses the file object.
R0.05 (August 25, 2007) R0.05 (August 25, 2007)
Changed arguments of f_read(), f_write() and f_mkfs(). Changed arguments of f_read(), f_write() and f_mkfs().
Fixed f_mkfs() on FAT32 creates incorrect FSINFO. Fixed f_mkfs() on FAT32 creates incorrect FSINFO.
Fixed f_mkdir() on FAT32 creates incorrect directory. Fixed f_mkdir() on FAT32 creates incorrect directory.
R0.05a (February 03, 2008) R0.05a (February 03, 2008)
Added f_truncate() and f_utime(). Added f_truncate() and f_utime().
Fixed off by one error at FAT sub-type determination. Fixed off by one error at FAT sub-type determination.
Fixed btr in f_read() can be mistruncated. Fixed btr in f_read() can be mistruncated.
Fixed cached sector is not flushed when create and close without write. Fixed cached sector is not flushed when create and close without write.
R0.06 (April 01, 2008) R0.06 (April 01, 2008)
Added fputc(), fputs(), fprintf() and fgets(). Added fputc(), fputs(), fprintf() and fgets().
Improved performance of f_lseek() on moving to the same or following cluster. Improved performance of f_lseek() on moving to the same or following cluster.
R0.07 (April 01, 2009) R0.07 (April 01, 2009)
Merged Tiny-FatFs as a configuration option. (_FS_TINY) Merged Tiny-FatFs as a configuration option. (_FS_TINY)
Added long file name feature. (_USE_LFN) Added long file name feature. (_USE_LFN)
Added multiple code page feature. (_CODE_PAGE) Added multiple code page feature. (_CODE_PAGE)
Added re-entrancy for multitask operation. (_FS_REENTRANT) Added re-entrancy for multitask operation. (_FS_REENTRANT)
Added auto cluster size selection to f_mkfs(). Added auto cluster size selection to f_mkfs().
Added rewind option to f_readdir(). Added rewind option to f_readdir().
Changed result code of critical errors. Changed result code of critical errors.
Renamed string functions to avoid name collision. Renamed string functions to avoid name collision.
R0.07a (April 14, 2009) R0.07a (April 14, 2009)
Septemberarated out OS dependent code on reentrant cfg. Septemberarated out OS dependent code on reentrant cfg.
Added multiple sector size feature. Added multiple sector size feature.
R0.07c (June 21, 2009) R0.07c (June 21, 2009)
Fixed f_unlink() can return FR_OK on error. Fixed f_unlink() can return FR_OK on error.
Fixed wrong cache control in f_lseek(). Fixed wrong cache control in f_lseek().
Added relative path feature. Added relative path feature.
Added f_chdir() and f_chdrive(). Added f_chdir() and f_chdrive().
Added proper case conversion to extended character. Added proper case conversion to extended character.
R0.07e (November 03, 2009) R0.07e (November 03, 2009)
Septemberarated out configuration options from ff.h to ffconf.h. Septemberarated out configuration options from ff.h to ffconf.h.
Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH. Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH.
Fixed name matching error on the 13 character boundary. Fixed name matching error on the 13 character boundary.
Added a configuration option, _LFN_UNICODE. Added a configuration option, _LFN_UNICODE.
Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. Changed f_readdir() to return the SFN with always upper case on non-LFN cfg.
R0.08 (May 15, 2010) R0.08 (May 15, 2010)
Added a memory configuration option. (_USE_LFN = 3) Added a memory configuration option. (_USE_LFN = 3)
Added file lock feature. (_FS_SHARE) Added file lock feature. (_FS_SHARE)
Added fast seek feature. (_USE_FASTSEEK) Added fast seek feature. (_USE_FASTSEEK)
Changed some types on the API, XCHAR->TCHAR. Changed some types on the API, XCHAR->TCHAR.
Changed .fname in the FILINFO structure on Unicode cfg. Changed .fname in the FILINFO structure on Unicode cfg.
String functions support UTF-8 encoding files on Unicode cfg. String functions support UTF-8 encoding files on Unicode cfg.
R0.08a (August 16, 2010) R0.08a (August 16, 2010)
Added f_getcwd(). (_FS_RPATH = 2) Added f_getcwd(). (_FS_RPATH = 2)
Added sector erase feature. (_USE_ERASE) Added sector erase feature. (_USE_ERASE)
Moved file lock semaphore table from fs object to the bss. Moved file lock semaphore table from fs object to the bss.
Fixed f_mkfs() creates wrong FAT32 volume. Fixed f_mkfs() creates wrong FAT32 volume.
R0.08b (January 15, 2011) R0.08b (January 15, 2011)
Fast seek feature is also applied to f_read() and f_write(). Fast seek feature is also applied to f_read() and f_write().
f_lseek() reports required table size on creating CLMP. f_lseek() reports required table size on creating CLMP.
Extended format syntax of f_printf(). Extended format syntax of f_printf().
Ignores duplicated directory separators in given path name. Ignores duplicated directory separators in given path name.
R0.09 (September 06, 2011) R0.09 (September 06, 2011)
f_mkfs() supports multiple partition to complete the multiple partition feature. f_mkfs() supports multiple partition to complete the multiple partition feature.
Added f_fdisk(). Added f_fdisk().
R0.09a (August 27, 2012) R0.09a (August 27, 2012)
Changed f_open() and f_opendir() reject null object pointer to avoid crash. Changed f_open() and f_opendir() reject null object pointer to avoid crash.
Changed option name _FS_SHARE to _FS_LOCK. Changed option name _FS_SHARE to _FS_LOCK.
Fixed assertion failure due to OS/2 EA on FAT12/16 volume. Fixed assertion failure due to OS/2 EA on FAT12/16 volume.
R0.09b (January 24, 2013) R0.09b (January 24, 2013)
Added f_setlabel() and f_getlabel(). Added f_setlabel() and f_getlabel().
R0.10 (October 02, 2013) R0.10 (October 02, 2013)
Added selection of character encoding on the file. (_STRF_ENCODE) Added selection of character encoding on the file. (_STRF_ENCODE)
Added f_closedir(). Added f_closedir().
Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO) Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO)
Added forced mount feature with changes of f_mount(). Added forced mount feature with changes of f_mount().
Improved behavior of volume auto detection. Improved behavior of volume auto detection.
Improved write throughput of f_puts() and f_printf(). Improved write throughput of f_puts() and f_printf().
Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write(). Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write().
Fixed f_write() can be truncated when the file size is close to 4GB. Fixed f_write() can be truncated when the file size is close to 4GB.
Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error. Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error.
R0.10a (January 15, 2014) R0.10a (January 15, 2014)
Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID) Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID)
Added a configuration option of minimum sector size. (_MIN_SS) Added a configuration option of minimum sector size. (_MIN_SS)
2nd argument of f_rename() can have a drive number and it will be ignored. 2nd argument of f_rename() can have a drive number and it will be ignored.
Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10) Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10)
Fixed f_close() invalidates the file object without volume lock. Fixed f_close() invalidates the file object without volume lock.
Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10) Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10)
Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07) Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07)
R0.10b (May 19, 2014) R0.10b (May 19, 2014)
Fixed a hard error in the disk I/O layer can collapse the directory entry. Fixed a hard error in the disk I/O layer can collapse the directory entry.
Fixed LFN entry is not deleted when delete/rename an object with lossy converted SFN. (appeared at R0.07) Fixed LFN entry is not deleted when delete/rename an object with lossy converted SFN. (appeared at R0.07)
R0.10c (November 09, 2014) R0.10c (November 09, 2014)
Added a configuration option for the platforms without RTC. (_FS_NORTC) Added a configuration option for the platforms without RTC. (_FS_NORTC)
Changed option name _USE_ERASE to _USE_TRIM. Changed option name _USE_ERASE to _USE_TRIM.
Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b) Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b)
Fixed a potential problem of FAT access that can appear on disk error. Fixed a potential problem of FAT access that can appear on disk error.
Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08) Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08)
R0.11 (February 09, 2015) R0.11 (February 09, 2015)
Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND) Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND)
Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c) Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c)
Fixed _FS_NORTC option does not work properly. (appeared at R0.10c) Fixed _FS_NORTC option does not work properly. (appeared at R0.10c)
R0.11a (September 05, 2015) R0.11a (September 05, 2015)
Fixed wrong media change can lead a deadlock at thread-safe configuration. Fixed wrong media change can lead a deadlock at thread-safe configuration.
Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE) Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE)
Removed some code pages actually not exist on the standard systems. (_CODE_PAGE) Removed some code pages actually not exist on the standard systems. (_CODE_PAGE)
Fixed errors in the case conversion teble of code page 437 and 850 (ff.c). Fixed errors in the case conversion teble of code page 437 and 850 (ff.c).
Fixed errors in the case conversion teble of Unicode (cc*.c). Fixed errors in the case conversion teble of Unicode (cc*.c).
R0.12 (April 12, 2016) R0.12 (April 12, 2016)
Added support for exFAT file system. (_FS_EXFAT) Added support for exFAT file system. (_FS_EXFAT)
Added f_expand(). (_USE_EXPAND) Added f_expand(). (_USE_EXPAND)
Changed some members in FINFO structure and behavior of f_readdir(). Changed some members in FINFO structure and behavior of f_readdir().
Added an option _USE_CHMOD. Added an option _USE_CHMOD.
Removed an option _WORD_ACCESS. Removed an option _WORD_ACCESS.
Fixed errors in the case conversion table of Unicode (cc*.c). Fixed errors in the case conversion table of Unicode (cc*.c).
R0.12a (July 10, 2016) R0.12a (July 10, 2016)
Added support for creating exFAT volume with some changes of f_mkfs(). Added support for creating exFAT volume with some changes of f_mkfs().
Added a file open method FA_OPEN_APPEND. An f_lseek() following f_open() is no longer needed. Added a file open method FA_OPEN_APPEND. An f_lseek() following f_open() is no longer needed.
f_forward() is available regardless of _FS_TINY. f_forward() is available regardless of _FS_TINY.
Fixed f_mkfs() creates wrong volume. (appeared at R0.12) Fixed f_mkfs() creates wrong volume. (appeared at R0.12)
Fixed wrong memory read in create_name(). (appeared at R0.12) Fixed wrong memory read in create_name(). (appeared at R0.12)
Fixed compilation fails at some configurations, _USE_FASTSEEK and _USE_FORWARD. Fixed compilation fails at some configurations, _USE_FASTSEEK and _USE_FORWARD.
R0.12b (September 04, 2016) R0.12b (September 04, 2016)
Made f_rename() be able to rename objects with the same name but case. Made f_rename() be able to rename objects with the same name but case.
Fixed an error in the case conversion teble of code page 866. (ff.c) Fixed an error in the case conversion teble of code page 866. (ff.c)
Fixed writing data is truncated at the file offset 4GiB on the exFAT volume. (appeared at R0.12) Fixed writing data is truncated at the file offset 4GiB on the exFAT volume. (appeared at R0.12)
Fixed creating a file in the root directory of exFAT volume can fail. (appeared at R0.12) Fixed creating a file in the root directory of exFAT volume can fail. (appeared at R0.12)
Fixed f_mkfs() creating exFAT volume with too small cluster size can collapse unallocated memory. (appeared at R0.12) Fixed f_mkfs() creating exFAT volume with too small cluster size can collapse unallocated memory. (appeared at R0.12)
Fixed wrong object name can be returned when read directory at Unicode cfg. (appeared at R0.12) Fixed wrong object name can be returned when read directory at Unicode cfg. (appeared at R0.12)
Fixed large file allocation/removing on the exFAT volume collapses allocation bitmap. (appeared at R0.12) Fixed large file allocation/removing on the exFAT volume collapses allocation bitmap. (appeared at R0.12)
Fixed some internal errors in f_expand() and f_lseek(). (appeared at R0.12) Fixed some internal errors in f_expand() and f_lseek(). (appeared at R0.12)
R0.12c (March 04, 2017) R0.12c (March 04, 2017)
Improved write throughput at the fragmented file on the exFAT volume. Improved write throughput at the fragmented file on the exFAT volume.
Made memory usage for exFAT be able to be reduced as decreasing _MAX_LFN. Made memory usage for exFAT be able to be reduced as decreasing _MAX_LFN.
Fixed successive f_getfree() can return wrong count on the FAT12/16 volume. (appeared at R0.12) Fixed successive f_getfree() can return wrong count on the FAT12/16 volume. (appeared at R0.12)
Fixed configuration option _VOLUMES cannot be set 10. (appeared at R0.10c) Fixed configuration option _VOLUMES cannot be set 10. (appeared at R0.10c)
R0.13 (May 21, 2017) R0.13 (May 21, 2017)
Changed heading character of configuration keywords "_" to "FF_". Changed heading character of configuration keywords "_" to "FF_".
Removed ASCII-only configuration, FF_CODE_PAGE = 1. Use FF_CODE_PAGE = 437 instead. Removed ASCII-only configuration, FF_CODE_PAGE = 1. Use FF_CODE_PAGE = 437 instead.
Added f_setcp(), run-time code page configuration. (FF_CODE_PAGE = 0) Added f_setcp(), run-time code page configuration. (FF_CODE_PAGE = 0)
Improved cluster allocation time on stretch a deep buried cluster chain. Improved cluster allocation time on stretch a deep buried cluster chain.
Improved processing time of f_mkdir() with large cluster size by using FF_USE_LFN = 3. Improved processing time of f_mkdir() with large cluster size by using FF_USE_LFN = 3.
Improved NoFatChain flag of the fragmented file to be set after it is truncated and got contiguous. Improved NoFatChain flag of the fragmented file to be set after it is truncated and got contiguous.
Fixed archive attribute is left not set when a file on the exFAT volume is renamed. (appeared at R0.12) Fixed archive attribute is left not set when a file on the exFAT volume is renamed. (appeared at R0.12)
Fixed exFAT FAT entry can be collapsed when write or lseek operation to the existing file is done. (appeared at R0.12c) Fixed exFAT FAT entry can be collapsed when write or lseek operation to the existing file is done. (appeared at R0.12c)
Fixed creating a file can fail when a new cluster allocation to the exFAT directory occures. (appeared at R0.12c) Fixed creating a file can fail when a new cluster allocation to the exFAT directory occures. (appeared at R0.12c)
R0.13a (October 14, 2017) R0.13a (October 14, 2017)
Added support for UTF-8 encoding on the API. (FF_LFN_UNICODE = 2) Added support for UTF-8 encoding on the API. (FF_LFN_UNICODE = 2)
Added options for file name output buffer. (FF_LFN_BUF, FF_SFN_BUF). Added options for file name output buffer. (FF_LFN_BUF, FF_SFN_BUF).
Added dynamic memory allocation option for working buffer of f_mkfs() and f_fdisk(). Added dynamic memory allocation option for working buffer of f_mkfs() and f_fdisk().
Fixed f_fdisk() and f_mkfs() create the partition table with wrong CHS parameters. (appeared at R0.09) Fixed f_fdisk() and f_mkfs() create the partition table with wrong CHS parameters. (appeared at R0.09)
Fixed f_unlink() can cause lost clusters at fragmented file on the exFAT volume. (appeared at R0.12c) Fixed f_unlink() can cause lost clusters at fragmented file on the exFAT volume. (appeared at R0.12c)
Fixed f_setlabel() rejects some valid characters for exFAT volume. (appeared at R0.12) Fixed f_setlabel() rejects some valid characters for exFAT volume. (appeared at R0.12)

View File

@@ -1,22 +1,22 @@
FatFs Module Source Files R0.13a FatFs Module Source Files R0.13a
FILES FILES
00readme.txt This file. 00readme.txt This file.
00history.txt Revision history. 00history.txt Revision history.
ff.c FatFs module. ff.c FatFs module.
ffconf.h Configuration file of FatFs module. ffconf.h Configuration file of FatFs module.
ff.h Common include file for FatFs and application module. ff.h Common include file for FatFs and application module.
diskio.h Common include file for FatFs and disk I/O module. diskio.h Common include file for FatFs and disk I/O module.
diskio.c An example of glue function to attach existing disk I/O module to FatFs. diskio.c An example of glue function to attach existing disk I/O module to FatFs.
integer.h Integer type definitions for FatFs. integer.h Integer type definitions for FatFs.
ffunicode.c Optional Unicode utility functions. ffunicode.c Optional Unicode utility functions.
ffsystem.c An example of optional O/S related functions. ffsystem.c An example of optional O/S related functions.
Low level disk I/O module is not included in this archive because the FatFs Low level disk I/O module is not included in this archive because the FatFs
module is only a generic file system layer and it does not depend on any specific module is only a generic file system layer and it does not depend on any specific
storage device. You need to provide a low level disk I/O module written to storage device. You need to provide a low level disk I/O module written to
control the storage device that attached to the target system. control the storage device that attached to the target system.

View File

@@ -1,92 +1,92 @@
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* Low level disk I/O module skeleton for FatFs (C)ChaN, 2016 */ /* Low level disk I/O module skeleton for FatFs (C)ChaN, 2016 */
/* ESP-IDF port Copyright 2016 Espressif Systems (Shanghai) PTE LTD */ /* ESP-IDF port Copyright 2016 Espressif Systems (Shanghai) PTE LTD */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* If a working storage control module is available, it should be */ /* If a working storage control module is available, it should be */
/* attached to the FatFs via a glue function rather than modifying it. */ /* attached to the FatFs via a glue function rather than modifying it. */
/* This is an example of glue functions to attach various exsisting */ /* This is an example of glue functions to attach various exsisting */
/* storage control modules to the FatFs module with a defined API. */ /* storage control modules to the FatFs module with a defined API. */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <sys/time.h> #include <sys/time.h>
#include "diskio.h" /* FatFs lower layer API */ #include "diskio.h" /* FatFs lower layer API */
#include "ffconf.h" #include "ffconf.h"
#include "ff.h" #include "ff.h"
static ff_diskio_impl_t * s_impls[FF_VOLUMES] = { NULL }; static ff_diskio_impl_t * s_impls[FF_VOLUMES] = { NULL };
#if FF_MULTI_PARTITION /* Multiple partition configuration */ #if FF_MULTI_PARTITION /* Multiple partition configuration */
PARTITION VolToPart[] = { PARTITION VolToPart[] = {
{0, 0}, /* Logical drive 0 ==> Physical drive 0, auto detection */ {0, 0}, /* Logical drive 0 ==> Physical drive 0, auto detection */
{1, 0} /* Logical drive 1 ==> Physical drive 1, auto detection */ {1, 0} /* Logical drive 1 ==> Physical drive 1, auto detection */
}; };
#endif #endif
esp_err_t ff_diskio_get_drive(BYTE* out_pdrv) esp_err_t ff_diskio_get_drive(BYTE* out_pdrv)
{ {
BYTE i; BYTE i;
for(i=0; i<FF_VOLUMES; i++) { for(i=0; i<FF_VOLUMES; i++) {
if (!s_impls[i]) { if (!s_impls[i]) {
*out_pdrv = i; *out_pdrv = i;
return ESP_OK; return ESP_OK;
} }
} }
return ESP_ERR_NOT_FOUND; return ESP_ERR_NOT_FOUND;
} }
void ff_diskio_register(BYTE pdrv, const ff_diskio_impl_t* discio_impl) void ff_diskio_register(BYTE pdrv, const ff_diskio_impl_t* discio_impl)
{ {
assert(pdrv < FF_VOLUMES); assert(pdrv < FF_VOLUMES);
if (s_impls[pdrv]) { if (s_impls[pdrv]) {
ff_diskio_impl_t* im = s_impls[pdrv]; ff_diskio_impl_t* im = s_impls[pdrv];
s_impls[pdrv] = NULL; s_impls[pdrv] = NULL;
free(im); free(im);
} }
if (!discio_impl) { if (!discio_impl) {
return; return;
} }
ff_diskio_impl_t * impl = (ff_diskio_impl_t *)malloc(sizeof(ff_diskio_impl_t)); ff_diskio_impl_t * impl = (ff_diskio_impl_t *)malloc(sizeof(ff_diskio_impl_t));
assert(impl != NULL); assert(impl != NULL);
memcpy(impl, discio_impl, sizeof(ff_diskio_impl_t)); memcpy(impl, discio_impl, sizeof(ff_diskio_impl_t));
s_impls[pdrv] = impl; s_impls[pdrv] = impl;
} }
DSTATUS ff_disk_initialize (BYTE pdrv) DSTATUS ff_disk_initialize (BYTE pdrv)
{ {
return s_impls[pdrv]->init(pdrv); return s_impls[pdrv]->init(pdrv);
} }
DSTATUS ff_disk_status (BYTE pdrv) DSTATUS ff_disk_status (BYTE pdrv)
{ {
return s_impls[pdrv]->status(pdrv); return s_impls[pdrv]->status(pdrv);
} }
DRESULT ff_disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count) DRESULT ff_disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count)
{ {
return s_impls[pdrv]->read(pdrv, buff, sector, count); return s_impls[pdrv]->read(pdrv, buff, sector, count);
} }
DRESULT ff_disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count) DRESULT ff_disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count)
{ {
return s_impls[pdrv]->write(pdrv, buff, sector, count); return s_impls[pdrv]->write(pdrv, buff, sector, count);
} }
DRESULT ff_disk_ioctl (BYTE pdrv, BYTE cmd, void* buff) DRESULT ff_disk_ioctl (BYTE pdrv, BYTE cmd, void* buff)
{ {
return s_impls[pdrv]->ioctl(pdrv, cmd, buff); return s_impls[pdrv]->ioctl(pdrv, cmd, buff);
} }
DWORD get_fattime(void) DWORD get_fattime(void)
{ {
time_t t = time(NULL); time_t t = time(NULL);
struct tm tmr; struct tm tmr;
localtime_r(&t, &tmr); localtime_r(&t, &tmr);
int year = tmr.tm_year < 80 ? 0 : tmr.tm_year - 80; int year = tmr.tm_year < 80 ? 0 : tmr.tm_year - 80;
return ((DWORD)(year) << 25) return ((DWORD)(year) << 25)
| ((DWORD)(tmr.tm_mon + 1) << 21) | ((DWORD)(tmr.tm_mon + 1) << 21)
| ((DWORD)tmr.tm_mday << 16) | ((DWORD)tmr.tm_mday << 16)
| (WORD)(tmr.tm_hour << 11) | (WORD)(tmr.tm_hour << 11)
| (WORD)(tmr.tm_min << 5) | (WORD)(tmr.tm_min << 5)
| (WORD)(tmr.tm_sec >> 1); | (WORD)(tmr.tm_sec >> 1);
} }

View File

@@ -1,133 +1,133 @@
/*-----------------------------------------------------------------------/ /*-----------------------------------------------------------------------/
/ Low level disk interface modlue include file (C)ChaN, 2014 / / Low level disk interface modlue include file (C)ChaN, 2014 /
/-----------------------------------------------------------------------*/ /-----------------------------------------------------------------------*/
#ifndef _DISKIO_DEFINED #ifndef _DISKIO_DEFINED
#define _DISKIO_DEFINED #define _DISKIO_DEFINED
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#include "integer.h" #include "integer.h"
#include "sdmmc_cmd.h" #include "sdmmc_cmd.h"
#include "driver/sdmmc_host.h" #include "driver/sdmmc_host.h"
/* Status of Disk Functions */ /* Status of Disk Functions */
typedef BYTE DSTATUS; typedef BYTE DSTATUS;
/* Results of Disk Functions */ /* Results of Disk Functions */
typedef enum { typedef enum {
RES_OK = 0, /* 0: Successful */ RES_OK = 0, /* 0: Successful */
RES_ERROR, /* 1: R/W Error */ RES_ERROR, /* 1: R/W Error */
RES_WRPRT, /* 2: Write Protected */ RES_WRPRT, /* 2: Write Protected */
RES_NOTRDY, /* 3: Not Ready */ RES_NOTRDY, /* 3: Not Ready */
RES_PARERR /* 4: Invalid Parameter */ RES_PARERR /* 4: Invalid Parameter */
} DRESULT; } DRESULT;
/*---------------------------------------*/ /*---------------------------------------*/
/* Prototypes for disk control functions */ /* Prototypes for disk control functions */
/* Redefine names of disk IO functions to prevent name collisions */ /* Redefine names of disk IO functions to prevent name collisions */
#define disk_initialize ff_disk_initialize #define disk_initialize ff_disk_initialize
#define disk_status ff_disk_status #define disk_status ff_disk_status
#define disk_read ff_disk_read #define disk_read ff_disk_read
#define disk_write ff_disk_write #define disk_write ff_disk_write
#define disk_ioctl ff_disk_ioctl #define disk_ioctl ff_disk_ioctl
DSTATUS disk_initialize (BYTE pdrv); DSTATUS disk_initialize (BYTE pdrv);
DSTATUS disk_status (BYTE pdrv); DSTATUS disk_status (BYTE pdrv);
DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
/** /**
* Structure of pointers to disk IO driver functions. * Structure of pointers to disk IO driver functions.
* *
* See FatFs documentation for details about these functions * See FatFs documentation for details about these functions
*/ */
typedef struct { typedef struct {
DSTATUS (*init) (BYTE pdrv); /*!< disk initialization function */ DSTATUS (*init) (BYTE pdrv); /*!< disk initialization function */
DSTATUS (*status) (BYTE pdrv); /*!< disk status check function */ DSTATUS (*status) (BYTE pdrv); /*!< disk status check function */
DRESULT (*read) (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); /*!< sector read function */ DRESULT (*read) (BYTE pdrv, BYTE* buff, DWORD sector, UINT count); /*!< sector read function */
DRESULT (*write) (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); /*!< sector write function */ DRESULT (*write) (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count); /*!< sector write function */
DRESULT (*ioctl) (BYTE pdrv, BYTE cmd, void* buff); /*!< function to get info about disk and do some misc operations */ DRESULT (*ioctl) (BYTE pdrv, BYTE cmd, void* buff); /*!< function to get info about disk and do some misc operations */
} ff_diskio_impl_t; } ff_diskio_impl_t;
/** /**
* Register or unregister diskio driver for given drive number. * Register or unregister diskio driver for given drive number.
* *
* When FATFS library calls one of disk_xxx functions for driver number pdrv, * When FATFS library calls one of disk_xxx functions for driver number pdrv,
* corresponding function in discio_impl for given pdrv will be called. * corresponding function in discio_impl for given pdrv will be called.
* *
* @param pdrv drive number * @param pdrv drive number
* @param discio_impl pointer to ff_diskio_impl_t structure with diskio functions * @param discio_impl pointer to ff_diskio_impl_t structure with diskio functions
* or NULL to unregister and free previously registered drive * or NULL to unregister and free previously registered drive
*/ */
void ff_diskio_register(BYTE pdrv, const ff_diskio_impl_t* discio_impl); void ff_diskio_register(BYTE pdrv, const ff_diskio_impl_t* discio_impl);
#define ff_diskio_unregister(pdrv_) ff_diskio_register(pdrv_, NULL) #define ff_diskio_unregister(pdrv_) ff_diskio_register(pdrv_, NULL)
/** /**
* Register SD/MMC diskio driver * Register SD/MMC diskio driver
* *
* @param pdrv drive number * @param pdrv drive number
* @param card pointer to sdmmc_card_t structure describing a card; card should be initialized before calling f_mount. * @param card pointer to sdmmc_card_t structure describing a card; card should be initialized before calling f_mount.
*/ */
void ff_diskio_register_sdmmc(BYTE pdrv, sdmmc_card_t* card); void ff_diskio_register_sdmmc(BYTE pdrv, sdmmc_card_t* card);
/** /**
* Get next available drive number * Get next available drive number
* *
* @param out_pdrv pointer to the byte to set if successful * @param out_pdrv pointer to the byte to set if successful
* *
* @return ESP_OK on success * @return ESP_OK on success
* ESP_ERR_NOT_FOUND if all drives are attached * ESP_ERR_NOT_FOUND if all drives are attached
*/ */
esp_err_t ff_diskio_get_drive(BYTE* out_pdrv); esp_err_t ff_diskio_get_drive(BYTE* out_pdrv);
/* Disk Status Bits (DSTATUS) */ /* Disk Status Bits (DSTATUS) */
#define STA_NOINIT 0x01 /* Drive not initialized */ #define STA_NOINIT 0x01 /* Drive not initialized */
#define STA_NODISK 0x02 /* No medium in the drive */ #define STA_NODISK 0x02 /* No medium in the drive */
#define STA_PROTECT 0x04 /* Write protected */ #define STA_PROTECT 0x04 /* Write protected */
/* Command code for disk_ioctrl fucntion */ /* Command code for disk_ioctrl fucntion */
/* Generic command (Used by FatFs) */ /* Generic command (Used by FatFs) */
#define CTRL_SYNC 0 /* Complete pending write process (needed at _FS_READONLY == 0) */ #define CTRL_SYNC 0 /* Complete pending write process (needed at _FS_READONLY == 0) */
#define GET_SECTOR_COUNT 1 /* Get media size (needed at _USE_MKFS == 1) */ #define GET_SECTOR_COUNT 1 /* Get media size (needed at _USE_MKFS == 1) */
#define GET_SECTOR_SIZE 2 /* Get sector size (needed at _MAX_SS != _MIN_SS) */ #define GET_SECTOR_SIZE 2 /* Get sector size (needed at _MAX_SS != _MIN_SS) */
#define GET_BLOCK_SIZE 3 /* Get erase block size (needed at _USE_MKFS == 1) */ #define GET_BLOCK_SIZE 3 /* Get erase block size (needed at _USE_MKFS == 1) */
#define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */ #define CTRL_TRIM 4 /* Inform device that the data on the block of sectors is no longer used (needed at _USE_TRIM == 1) */
/* Generic command (Not used by FatFs) */ /* Generic command (Not used by FatFs) */
#define CTRL_POWER 5 /* Get/Set power status */ #define CTRL_POWER 5 /* Get/Set power status */
#define CTRL_LOCK 6 /* Lock/Unlock media removal */ #define CTRL_LOCK 6 /* Lock/Unlock media removal */
#define CTRL_EJECT 7 /* Eject media */ #define CTRL_EJECT 7 /* Eject media */
#define CTRL_FORMAT 8 /* Create physical format on the media */ #define CTRL_FORMAT 8 /* Create physical format on the media */
/* MMC/SDC specific ioctl command */ /* MMC/SDC specific ioctl command */
#define MMC_GET_TYPE 10 /* Get card type */ #define MMC_GET_TYPE 10 /* Get card type */
#define MMC_GET_CSD 11 /* Get CSD */ #define MMC_GET_CSD 11 /* Get CSD */
#define MMC_GET_CID 12 /* Get CID */ #define MMC_GET_CID 12 /* Get CID */
#define MMC_GET_OCR 13 /* Get OCR */ #define MMC_GET_OCR 13 /* Get OCR */
#define MMC_GET_SDSTAT 14 /* Get SD status */ #define MMC_GET_SDSTAT 14 /* Get SD status */
#define ISDIO_READ 55 /* Read data form SD iSDIO register */ #define ISDIO_READ 55 /* Read data form SD iSDIO register */
#define ISDIO_WRITE 56 /* Write data to SD iSDIO register */ #define ISDIO_WRITE 56 /* Write data to SD iSDIO register */
#define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */ #define ISDIO_MRITE 57 /* Masked write data to SD iSDIO register */
/* ATA/CF specific ioctl command */ /* ATA/CF specific ioctl command */
#define ATA_GET_REV 20 /* Get F/W revision */ #define ATA_GET_REV 20 /* Get F/W revision */
#define ATA_GET_MODEL 21 /* Get model name */ #define ATA_GET_MODEL 21 /* Get model name */
#define ATA_GET_SN 22 /* Get serial number */ #define ATA_GET_SN 22 /* Get serial number */
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif

View File

@@ -1,38 +1,38 @@
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _DISKIO_RAWFLASH_DEFINED #ifndef _DISKIO_RAWFLASH_DEFINED
#define _DISKIO_RAWFLASH_DEFINED #define _DISKIO_RAWFLASH_DEFINED
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#include "integer.h" #include "integer.h"
#include "esp_partition.h" #include "esp_partition.h"
/** /**
* Register spi flash partition * Register spi flash partition
* *
* @param pdrv drive number * @param pdrv drive number
* @param part_handle pointer to raw flash partition. * @param part_handle pointer to raw flash partition.
*/ */
esp_err_t ff_diskio_register_raw_partition(BYTE pdrv, const esp_partition_t* part_handle); esp_err_t ff_diskio_register_raw_partition(BYTE pdrv, const esp_partition_t* part_handle);
BYTE ff_diskio_get_pdrv_raw(const esp_partition_t* part_handle); BYTE ff_diskio_get_pdrv_raw(const esp_partition_t* part_handle);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif // _DISKIO_RAWFLASH_DEFINED #endif // _DISKIO_RAWFLASH_DEFINED

View File

@@ -1,117 +1,117 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// //
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include <string.h> #include <string.h>
#include "diskio.h" #include "diskio.h"
#include "ffconf.h" #include "ffconf.h"
#include "ff.h" #include "ff.h"
#include "esp_log.h" #include "esp_log.h"
#include "diskio_wl.h" #include "diskio_wl.h"
#include "wear_levelling.h" #include "wear_levelling.h"
static const char* TAG = "ff_diskio_spiflash"; static const char* TAG = "ff_diskio_spiflash";
wl_handle_t ff_wl_handles[FF_VOLUMES] = { wl_handle_t ff_wl_handles[FF_VOLUMES] = {
WL_INVALID_HANDLE, WL_INVALID_HANDLE,
WL_INVALID_HANDLE, WL_INVALID_HANDLE,
}; };
DSTATUS ff_wl_initialize (BYTE pdrv) DSTATUS ff_wl_initialize (BYTE pdrv)
{ {
return 0; return 0;
} }
DSTATUS ff_wl_status (BYTE pdrv) DSTATUS ff_wl_status (BYTE pdrv)
{ {
return 0; return 0;
} }
DRESULT ff_wl_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count) DRESULT ff_wl_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
{ {
ESP_LOGV(TAG, "ff_wl_read - pdrv=%i, sector=%i, count=%i\n", (unsigned int)pdrv, (unsigned int)sector, (unsigned int)count); ESP_LOGV(TAG, "ff_wl_read - pdrv=%i, sector=%i, count=%i\n", (unsigned int)pdrv, (unsigned int)sector, (unsigned int)count);
wl_handle_t wl_handle = ff_wl_handles[pdrv]; wl_handle_t wl_handle = ff_wl_handles[pdrv];
assert(wl_handle + 1); assert(wl_handle + 1);
esp_err_t err = wl_read(wl_handle, sector * wl_sector_size(wl_handle), buff, count * wl_sector_size(wl_handle)); esp_err_t err = wl_read(wl_handle, sector * wl_sector_size(wl_handle), buff, count * wl_sector_size(wl_handle));
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGE(TAG, "wl_read failed (%d)", err); ESP_LOGE(TAG, "wl_read failed (%d)", err);
return RES_ERROR; return RES_ERROR;
} }
return RES_OK; return RES_OK;
} }
DRESULT ff_wl_write (BYTE pdrv, const BYTE *buff, DWORD sector, UINT count) DRESULT ff_wl_write (BYTE pdrv, const BYTE *buff, DWORD sector, UINT count)
{ {
ESP_LOGV(TAG, "ff_wl_write - pdrv=%i, sector=%i, count=%i\n", (unsigned int)pdrv, (unsigned int)sector, (unsigned int)count); ESP_LOGV(TAG, "ff_wl_write - pdrv=%i, sector=%i, count=%i\n", (unsigned int)pdrv, (unsigned int)sector, (unsigned int)count);
wl_handle_t wl_handle = ff_wl_handles[pdrv]; wl_handle_t wl_handle = ff_wl_handles[pdrv];
assert(wl_handle + 1); assert(wl_handle + 1);
esp_err_t err = wl_erase_range(wl_handle, sector * wl_sector_size(wl_handle), count * wl_sector_size(wl_handle)); esp_err_t err = wl_erase_range(wl_handle, sector * wl_sector_size(wl_handle), count * wl_sector_size(wl_handle));
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGE(TAG, "wl_erase_range failed (%d)", err); ESP_LOGE(TAG, "wl_erase_range failed (%d)", err);
return RES_ERROR; return RES_ERROR;
} }
err = wl_write(wl_handle, sector * wl_sector_size(wl_handle), buff, count * wl_sector_size(wl_handle)); err = wl_write(wl_handle, sector * wl_sector_size(wl_handle), buff, count * wl_sector_size(wl_handle));
if (err != ESP_OK) { if (err != ESP_OK) {
ESP_LOGE(TAG, "wl_write failed (%d)", err); ESP_LOGE(TAG, "wl_write failed (%d)", err);
return RES_ERROR; return RES_ERROR;
} }
return RES_OK; return RES_OK;
} }
DRESULT ff_wl_ioctl (BYTE pdrv, BYTE cmd, void *buff) DRESULT ff_wl_ioctl (BYTE pdrv, BYTE cmd, void *buff)
{ {
wl_handle_t wl_handle = ff_wl_handles[pdrv]; wl_handle_t wl_handle = ff_wl_handles[pdrv];
ESP_LOGV(TAG, "ff_wl_ioctl: cmd=%i\n", cmd); ESP_LOGV(TAG, "ff_wl_ioctl: cmd=%i\n", cmd);
assert(wl_handle + 1); assert(wl_handle + 1);
switch (cmd) { switch (cmd) {
case CTRL_SYNC: case CTRL_SYNC:
return RES_OK; return RES_OK;
case GET_SECTOR_COUNT: case GET_SECTOR_COUNT:
*((DWORD *) buff) = wl_size(wl_handle) / wl_sector_size(wl_handle); *((DWORD *) buff) = wl_size(wl_handle) / wl_sector_size(wl_handle);
return RES_OK; return RES_OK;
case GET_SECTOR_SIZE: case GET_SECTOR_SIZE:
*((WORD *) buff) = wl_sector_size(wl_handle); *((WORD *) buff) = wl_sector_size(wl_handle);
return RES_OK; return RES_OK;
case GET_BLOCK_SIZE: case GET_BLOCK_SIZE:
return RES_ERROR; return RES_ERROR;
} }
return RES_ERROR; return RES_ERROR;
} }
esp_err_t ff_diskio_register_wl_partition(BYTE pdrv, wl_handle_t flash_handle) esp_err_t ff_diskio_register_wl_partition(BYTE pdrv, wl_handle_t flash_handle)
{ {
if (pdrv >= FF_VOLUMES) { if (pdrv >= FF_VOLUMES) {
return ESP_ERR_INVALID_ARG; return ESP_ERR_INVALID_ARG;
} }
static const ff_diskio_impl_t wl_impl = { static const ff_diskio_impl_t wl_impl = {
.init = &ff_wl_initialize, .init = &ff_wl_initialize,
.status = &ff_wl_status, .status = &ff_wl_status,
.read = &ff_wl_read, .read = &ff_wl_read,
.write = &ff_wl_write, .write = &ff_wl_write,
.ioctl = &ff_wl_ioctl .ioctl = &ff_wl_ioctl
}; };
ff_wl_handles[pdrv] = flash_handle; ff_wl_handles[pdrv] = flash_handle;
ff_diskio_register(pdrv, &wl_impl); ff_diskio_register(pdrv, &wl_impl);
return ESP_OK; return ESP_OK;
} }
BYTE ff_diskio_get_pdrv_wl(wl_handle_t flash_handle) BYTE ff_diskio_get_pdrv_wl(wl_handle_t flash_handle)
{ {
for (int i = 0; i < FF_VOLUMES; i++) { for (int i = 0; i < FF_VOLUMES; i++) {
if (flash_handle == ff_wl_handles[i]) { if (flash_handle == ff_wl_handles[i]) {
return i; return i;
} }
} }
return 0xff; return 0xff;
} }

View File

@@ -1,39 +1,39 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _DISKIO_WL_DEFINED #ifndef _DISKIO_WL_DEFINED
#define _DISKIO_WL_DEFINED #define _DISKIO_WL_DEFINED
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#include "integer.h" #include "integer.h"
#include "wear_levelling.h" #include "wear_levelling.h"
/** /**
* Register spi flash partition * Register spi flash partition
* *
* @param pdrv drive number * @param pdrv drive number
* @param flash_handle handle of the wear levelling partition. * @param flash_handle handle of the wear levelling partition.
*/ */
esp_err_t ff_diskio_register_wl_partition(BYTE pdrv, wl_handle_t flash_handle); esp_err_t ff_diskio_register_wl_partition(BYTE pdrv, wl_handle_t flash_handle);
BYTE ff_diskio_get_pdrv_wl(wl_handle_t flash_handle); BYTE ff_diskio_get_pdrv_wl(wl_handle_t flash_handle);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif // _DISKIO_WL_DEFINED #endif // _DISKIO_WL_DEFINED

File diff suppressed because it is too large Load Diff

View File

@@ -1,369 +1,369 @@
/*----------------------------------------------------------------------------/ /*----------------------------------------------------------------------------/
/ FatFs - Generic FAT Filesystem module R0.13a / / FatFs - Generic FAT Filesystem module R0.13a /
/-----------------------------------------------------------------------------/ /-----------------------------------------------------------------------------/
/ /
/ Copyright (C) 2017, ChaN, all right reserved. / Copyright (C) 2017, ChaN, all right reserved.
/ /
/ FatFs module is an open source software. Redistribution and use of FatFs in / FatFs module is an open source software. Redistribution and use of FatFs in
/ source and binary forms, with or without modification, are permitted provided / source and binary forms, with or without modification, are permitted provided
/ that the following condition is met: / that the following condition is met:
/ 1. Redistributions of source code must retain the above copyright notice, / 1. Redistributions of source code must retain the above copyright notice,
/ this condition and the following disclaimer. / this condition and the following disclaimer.
/ /
/ This software is provided by the copyright holder and contributors "AS IS" / This software is provided by the copyright holder and contributors "AS IS"
/ and any warranties related to this software are DISCLAIMED. / and any warranties related to this software are DISCLAIMED.
/ The copyright owner or contributors be NOT LIABLE for any damages caused / The copyright owner or contributors be NOT LIABLE for any damages caused
/ by use of this software. / by use of this software.
/ /
/----------------------------------------------------------------------------*/ /----------------------------------------------------------------------------*/
#ifndef FF_DEFINED #ifndef FF_DEFINED
#define FF_DEFINED 89352 /* Revision ID */ #define FF_DEFINED 89352 /* Revision ID */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#include "integer.h" /* Basic integer types */ #include "integer.h" /* Basic integer types */
#include "ffconf.h" /* FatFs configuration options */ #include "ffconf.h" /* FatFs configuration options */
#if FF_DEFINED != FFCONF_DEF #if FF_DEFINED != FFCONF_DEF
#error Wrong configuration file (ffconf.h). #error Wrong configuration file (ffconf.h).
#endif #endif
#ifdef FF_DEFINE_DIR #ifdef FF_DEFINE_DIR
#define FF_DIR DIR #define FF_DIR DIR
#endif #endif
/* Definitions of volume management */ /* Definitions of volume management */
#if FF_MULTI_PARTITION /* Multiple partition configuration */ #if FF_MULTI_PARTITION /* Multiple partition configuration */
typedef struct { typedef struct {
BYTE pd; /* Physical drive number */ BYTE pd; /* Physical drive number */
BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */
} PARTITION; } PARTITION;
extern PARTITION VolToPart[]; /* Volume - Partition resolution table */ extern PARTITION VolToPart[]; /* Volume - Partition resolution table */
#endif #endif
/* Type of path name strings on FatFs API */ /* Type of path name strings on FatFs API */
#ifndef _INC_TCHAR #ifndef _INC_TCHAR
#define _INC_TCHAR #define _INC_TCHAR
#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* Unicode in UTF-16 encoding */ #if FF_USE_LFN && FF_LFN_UNICODE == 1 /* Unicode in UTF-16 encoding */
typedef WCHAR TCHAR; typedef WCHAR TCHAR;
#define _T(x) L ## x #define _T(x) L ## x
#define _TEXT(x) L ## x #define _TEXT(x) L ## x
#elif FF_USE_LFN && FF_LFN_UNICODE == 2 /* Unicode in UTF-8 encoding */ #elif FF_USE_LFN && FF_LFN_UNICODE == 2 /* Unicode in UTF-8 encoding */
typedef char TCHAR; typedef char TCHAR;
#define _T(x) u8 ## x #define _T(x) u8 ## x
#define _TEXT(x) u8 ## x #define _TEXT(x) u8 ## x
#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 2) #elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 2)
#error Wrong FF_LFN_UNICODE setting #error Wrong FF_LFN_UNICODE setting
#else /* ANSI/OEM code in SBCS/DBCS */ #else /* ANSI/OEM code in SBCS/DBCS */
typedef char TCHAR; typedef char TCHAR;
#define _T(x) x #define _T(x) x
#define _TEXT(x) x #define _TEXT(x) x
#endif #endif
#endif #endif
/* Type of file size variables */ /* Type of file size variables */
#if FF_FS_EXFAT #if FF_FS_EXFAT
typedef QWORD FSIZE_t; typedef QWORD FSIZE_t;
#else #else
typedef DWORD FSIZE_t; typedef DWORD FSIZE_t;
#endif #endif
/* Filesystem object structure (FATFS) */ /* Filesystem object structure (FATFS) */
typedef struct { typedef struct {
BYTE fs_type; /* Filesystem type (0:N/A) */ BYTE fs_type; /* Filesystem type (0:N/A) */
BYTE pdrv; /* Physical drive number */ BYTE pdrv; /* Physical drive number */
BYTE n_fats; /* Number of FATs (1 or 2) */ BYTE n_fats; /* Number of FATs (1 or 2) */
BYTE wflag; /* win[] flag (b0:dirty) */ BYTE wflag; /* win[] flag (b0:dirty) */
BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */ BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */
WORD id; /* Volume mount ID */ WORD id; /* Volume mount ID */
WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ WORD n_rootdir; /* Number of root directory entries (FAT12/16) */
WORD csize; /* Cluster size [sectors] */ WORD csize; /* Cluster size [sectors] */
#if FF_MAX_SS != FF_MIN_SS #if FF_MAX_SS != FF_MIN_SS
WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */ WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */
#endif #endif
#if FF_USE_LFN #if FF_USE_LFN
WCHAR* lfnbuf; /* LFN working buffer */ WCHAR* lfnbuf; /* LFN working buffer */
#endif #endif
#if FF_FS_EXFAT #if FF_FS_EXFAT
BYTE* dirbuf; /* Directory entry block scratchpad buffer for exFAT */ BYTE* dirbuf; /* Directory entry block scratchpad buffer for exFAT */
#endif #endif
#if FF_FS_REENTRANT #if FF_FS_REENTRANT
FF_SYNC_t sobj; /* Identifier of sync object */ FF_SYNC_t sobj; /* Identifier of sync object */
#endif #endif
#if !FF_FS_READONLY #if !FF_FS_READONLY
DWORD last_clst; /* Last allocated cluster */ DWORD last_clst; /* Last allocated cluster */
DWORD free_clst; /* Number of free clusters */ DWORD free_clst; /* Number of free clusters */
#endif #endif
#if FF_FS_RPATH #if FF_FS_RPATH
DWORD cdir; /* Current directory start cluster (0:root) */ DWORD cdir; /* Current directory start cluster (0:root) */
#if FF_FS_EXFAT #if FF_FS_EXFAT
DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */ DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */
DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */ DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */
DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */ DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */
#endif #endif
#endif #endif
DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */ DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */
DWORD fsize; /* Size of an FAT [sectors] */ DWORD fsize; /* Size of an FAT [sectors] */
DWORD volbase; /* Volume base sector */ DWORD volbase; /* Volume base sector */
DWORD fatbase; /* FAT base sector */ DWORD fatbase; /* FAT base sector */
DWORD dirbase; /* Root directory base sector/cluster */ DWORD dirbase; /* Root directory base sector/cluster */
DWORD database; /* Data base sector */ DWORD database; /* Data base sector */
DWORD winsect; /* Current sector appearing in the win[] */ DWORD winsect; /* Current sector appearing in the win[] */
BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */ BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */
} FATFS; } FATFS;
/* Object ID and allocation information (FFOBJID) */ /* Object ID and allocation information (FFOBJID) */
typedef struct { typedef struct {
FATFS* fs; /* Pointer to the hosting volume of this object */ FATFS* fs; /* Pointer to the hosting volume of this object */
WORD id; /* Hosting volume mount ID */ WORD id; /* Hosting volume mount ID */
BYTE attr; /* Object attribute */ BYTE attr; /* Object attribute */
BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:flagmented in this session, b2:sub-directory stretched) */ BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:flagmented in this session, b2:sub-directory stretched) */
DWORD sclust; /* Object data start cluster (0:no cluster or root directory) */ DWORD sclust; /* Object data start cluster (0:no cluster or root directory) */
FSIZE_t objsize; /* Object size (valid when sclust != 0) */ FSIZE_t objsize; /* Object size (valid when sclust != 0) */
#if FF_FS_EXFAT #if FF_FS_EXFAT
DWORD n_cont; /* Size of first fragment - 1 (valid when stat == 3) */ DWORD n_cont; /* Size of first fragment - 1 (valid when stat == 3) */
DWORD n_frag; /* Size of last fragment needs to be written to FAT (valid when not zero) */ DWORD n_frag; /* Size of last fragment needs to be written to FAT (valid when not zero) */
DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */ DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */
DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */ DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */
DWORD c_ofs; /* Offset in the containing directory (valid when file object and sclust != 0) */ DWORD c_ofs; /* Offset in the containing directory (valid when file object and sclust != 0) */
#endif #endif
#if FF_FS_LOCK #if FF_FS_LOCK
UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */ UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */
#endif #endif
} FFOBJID; } FFOBJID;
/* File object structure (FIL) */ /* File object structure (FIL) */
typedef struct { typedef struct {
FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */ FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */
BYTE flag; /* File status flags */ BYTE flag; /* File status flags */
BYTE err; /* Abort flag (error code) */ BYTE err; /* Abort flag (error code) */
FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */ FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */
DWORD clust; /* Current cluster of fpter (invalid when fptr is 0) */ DWORD clust; /* Current cluster of fpter (invalid when fptr is 0) */
DWORD sect; /* Sector number appearing in buf[] (0:invalid) */ DWORD sect; /* Sector number appearing in buf[] (0:invalid) */
#if !FF_FS_READONLY #if !FF_FS_READONLY
DWORD dir_sect; /* Sector number containing the directory entry (not used at exFAT) */ DWORD dir_sect; /* Sector number containing the directory entry (not used at exFAT) */
BYTE* dir_ptr; /* Pointer to the directory entry in the win[] (not used at exFAT) */ BYTE* dir_ptr; /* Pointer to the directory entry in the win[] (not used at exFAT) */
#endif #endif
#if FF_USE_FASTSEEK #if FF_USE_FASTSEEK
DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */ DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */
#endif #endif
#if !FF_FS_TINY #if !FF_FS_TINY
BYTE buf[FF_MAX_SS]; /* File private data read/write window */ BYTE buf[FF_MAX_SS]; /* File private data read/write window */
#endif #endif
} FIL; } FIL;
/* Directory object structure (FF_DIR) */ /* Directory object structure (FF_DIR) */
typedef struct { typedef struct {
FFOBJID obj; /* Object identifier */ FFOBJID obj; /* Object identifier */
DWORD dptr; /* Current read/write offset */ DWORD dptr; /* Current read/write offset */
DWORD clust; /* Current cluster */ DWORD clust; /* Current cluster */
DWORD sect; /* Current sector (0:Read operation has terminated) */ DWORD sect; /* Current sector (0:Read operation has terminated) */
BYTE* dir; /* Pointer to the directory item in the win[] */ BYTE* dir; /* Pointer to the directory item in the win[] */
BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */ BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */
#if FF_USE_LFN #if FF_USE_LFN
DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */ DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */
#endif #endif
#if FF_USE_FIND #if FF_USE_FIND
const TCHAR* pat; /* Pointer to the name matching pattern */ const TCHAR* pat; /* Pointer to the name matching pattern */
#endif #endif
} FF_DIR; } FF_DIR;
/* File information structure (FILINFO) */ /* File information structure (FILINFO) */
typedef struct { typedef struct {
FSIZE_t fsize; /* File size */ FSIZE_t fsize; /* File size */
WORD fdate; /* Modified date */ WORD fdate; /* Modified date */
WORD ftime; /* Modified time */ WORD ftime; /* Modified time */
BYTE fattrib; /* File attribute */ BYTE fattrib; /* File attribute */
#if FF_USE_LFN #if FF_USE_LFN
TCHAR altname[FF_SFN_BUF + 1];/* Altenative file name */ TCHAR altname[FF_SFN_BUF + 1];/* Altenative file name */
TCHAR fname[FF_LFN_BUF + 1]; /* Primary file name */ TCHAR fname[FF_LFN_BUF + 1]; /* Primary file name */
#else #else
TCHAR fname[12 + 1]; /* File name */ TCHAR fname[12 + 1]; /* File name */
#endif #endif
} FILINFO; } FILINFO;
/* File function return code (FRESULT) */ /* File function return code (FRESULT) */
typedef enum { typedef enum {
FR_OK = 0, /* (0) Succeeded */ FR_OK = 0, /* (0) Succeeded */
FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */
FR_INT_ERR, /* (2) Assertion failed */ FR_INT_ERR, /* (2) Assertion failed */
FR_NOT_READY, /* (3) The physical drive cannot work */ FR_NOT_READY, /* (3) The physical drive cannot work */
FR_NO_FILE, /* (4) Could not find the file */ FR_NO_FILE, /* (4) Could not find the file */
FR_NO_PATH, /* (5) Could not find the path */ FR_NO_PATH, /* (5) Could not find the path */
FR_INVALID_NAME, /* (6) The path name format is invalid */ FR_INVALID_NAME, /* (6) The path name format is invalid */
FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ FR_DENIED, /* (7) Access denied due to prohibited access or directory full */
FR_EXIST, /* (8) Access denied due to prohibited access */ FR_EXIST, /* (8) Access denied due to prohibited access */
FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */
FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */
FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */
FR_NOT_ENABLED, /* (12) The volume has no work area */ FR_NOT_ENABLED, /* (12) The volume has no work area */
FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */
FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */
FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */
FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */
FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */
FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */ FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */
FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ FR_INVALID_PARAMETER /* (19) Given parameter is invalid */
} FRESULT; } FRESULT;
/*--------------------------------------------------------------*/ /*--------------------------------------------------------------*/
/* FatFs module application interface */ /* FatFs module application interface */
FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */ FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */
FRESULT f_close (FIL* fp); /* Close an open file object */ FRESULT f_close (FIL* fp); /* Close an open file object */
FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */ FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */
FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */ FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */
FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */ FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */
FRESULT f_truncate (FIL* fp); /* Truncate the file */ FRESULT f_truncate (FIL* fp); /* Truncate the file */
FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */ FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */
FRESULT f_opendir (FF_DIR* dp, const TCHAR* path); /* Open a directory */ FRESULT f_opendir (FF_DIR* dp, const TCHAR* path); /* Open a directory */
FRESULT f_closedir (FF_DIR* dp); /* Close an open directory */ FRESULT f_closedir (FF_DIR* dp); /* Close an open directory */
FRESULT f_readdir (FF_DIR* dp, FILINFO* fno); /* Read a directory item */ FRESULT f_readdir (FF_DIR* dp, FILINFO* fno); /* Read a directory item */
FRESULT f_findfirst (FF_DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ FRESULT f_findfirst (FF_DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */
FRESULT f_findnext (FF_DIR* dp, FILINFO* fno); /* Find next file */ FRESULT f_findnext (FF_DIR* dp, FILINFO* fno); /* Find next file */
FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */
FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */
FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */
FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */
FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */ FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */
FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */ FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */
FRESULT f_chdir (const TCHAR* path); /* Change current directory */ FRESULT f_chdir (const TCHAR* path); /* Change current directory */
FRESULT f_chdrive (const TCHAR* path); /* Change current drive */ FRESULT f_chdrive (const TCHAR* path); /* Change current drive */
FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */ FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */
FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */ FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */
FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */ FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */
FRESULT f_setlabel (const TCHAR* label); /* Set volume label */ FRESULT f_setlabel (const TCHAR* label); /* Set volume label */
FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */ FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */
FRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt); /* Allocate a contiguous block to the file */ FRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt); /* Allocate a contiguous block to the file */
FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */
FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len); /* Create a FAT volume */ FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len); /* Create a FAT volume */
FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work); /* Divide a physical drive into some partitions */ FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work); /* Divide a physical drive into some partitions */
FRESULT f_setcp (WORD cp); /* Set current code page */ FRESULT f_setcp (WORD cp); /* Set current code page */
int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */ int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */
int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */ int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */
int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */ int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */
TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */ TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */
#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize)) #define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize))
#define f_error(fp) ((fp)->err) #define f_error(fp) ((fp)->err)
#define f_tell(fp) ((fp)->fptr) #define f_tell(fp) ((fp)->fptr)
#define f_size(fp) ((fp)->obj.objsize) #define f_size(fp) ((fp)->obj.objsize)
#define f_rewind(fp) f_lseek((fp), 0) #define f_rewind(fp) f_lseek((fp), 0)
#define f_rewinddir(dp) f_readdir((dp), 0) #define f_rewinddir(dp) f_readdir((dp), 0)
#define f_rmdir(path) f_unlink(path) #define f_rmdir(path) f_unlink(path)
#define f_unmount(path) f_mount(0, path, 0) #define f_unmount(path) f_mount(0, path, 0)
#ifndef EOF #ifndef EOF
#define EOF (-1) #define EOF (-1)
#endif #endif
/*--------------------------------------------------------------*/ /*--------------------------------------------------------------*/
/* Additional user defined functions */ /* Additional user defined functions */
/* RTC function */ /* RTC function */
#if !FF_FS_READONLY && !FF_FS_NORTC #if !FF_FS_READONLY && !FF_FS_NORTC
DWORD get_fattime (void); DWORD get_fattime (void);
#endif #endif
/* LFN support functions */ /* LFN support functions */
#if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */ #if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */
WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */ WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */
WCHAR ff_uni2oem (DWORD uni, WORD cp); /* Unicode to OEM code conversion */ WCHAR ff_uni2oem (DWORD uni, WORD cp); /* Unicode to OEM code conversion */
DWORD ff_wtoupper (DWORD uni); /* Unicode upper-case conversion */ DWORD ff_wtoupper (DWORD uni); /* Unicode upper-case conversion */
#endif #endif
#if FF_USE_LFN == 3 /* Dynamic memory allocation */ #if FF_USE_LFN == 3 /* Dynamic memory allocation */
void* ff_memalloc (UINT msize); /* Allocate memory block */ void* ff_memalloc (UINT msize); /* Allocate memory block */
void ff_memfree (void* mblock); /* Free memory block */ void ff_memfree (void* mblock); /* Free memory block */
#endif #endif
/* Sync functions */ /* Sync functions */
#if FF_FS_REENTRANT #if FF_FS_REENTRANT
int ff_cre_syncobj (BYTE vol, FF_SYNC_t* sobj); /* Create a sync object */ int ff_cre_syncobj (BYTE vol, FF_SYNC_t* sobj); /* Create a sync object */
int ff_req_grant (FF_SYNC_t sobj); /* Lock sync object */ int ff_req_grant (FF_SYNC_t sobj); /* Lock sync object */
void ff_rel_grant (FF_SYNC_t sobj); /* Unlock sync object */ void ff_rel_grant (FF_SYNC_t sobj); /* Unlock sync object */
int ff_del_syncobj (FF_SYNC_t sobj); /* Delete a sync object */ int ff_del_syncobj (FF_SYNC_t sobj); /* Delete a sync object */
#endif #endif
/*--------------------------------------------------------------*/ /*--------------------------------------------------------------*/
/* Flags and offset address */ /* Flags and offset address */
/* File access mode and open method flags (3rd argument of f_open) */ /* File access mode and open method flags (3rd argument of f_open) */
#define FA_READ 0x01 #define FA_READ 0x01
#define FA_WRITE 0x02 #define FA_WRITE 0x02
#define FA_OPEN_EXISTING 0x00 #define FA_OPEN_EXISTING 0x00
#define FA_CREATE_NEW 0x04 #define FA_CREATE_NEW 0x04
#define FA_CREATE_ALWAYS 0x08 #define FA_CREATE_ALWAYS 0x08
#define FA_OPEN_ALWAYS 0x10 #define FA_OPEN_ALWAYS 0x10
#define FA_OPEN_APPEND 0x30 #define FA_OPEN_APPEND 0x30
/* Fast seek controls (2nd argument of f_lseek) */ /* Fast seek controls (2nd argument of f_lseek) */
#define CREATE_LINKMAP ((FSIZE_t)0 - 1) #define CREATE_LINKMAP ((FSIZE_t)0 - 1)
/* Format options (2nd argument of f_mkfs) */ /* Format options (2nd argument of f_mkfs) */
#define FM_FAT 0x01 #define FM_FAT 0x01
#define FM_FAT32 0x02 #define FM_FAT32 0x02
#define FM_EXFAT 0x04 #define FM_EXFAT 0x04
#define FM_ANY 0x07 #define FM_ANY 0x07
#define FM_SFD 0x08 #define FM_SFD 0x08
/* Filesystem type (FATFS.fs_type) */ /* Filesystem type (FATFS.fs_type) */
#define FS_FAT12 1 #define FS_FAT12 1
#define FS_FAT16 2 #define FS_FAT16 2
#define FS_FAT32 3 #define FS_FAT32 3
#define FS_EXFAT 4 #define FS_EXFAT 4
/* File attribute bits for directory entry (FILINFO.fattrib) */ /* File attribute bits for directory entry (FILINFO.fattrib) */
#define AM_RDO 0x01 /* Read only */ #define AM_RDO 0x01 /* Read only */
#define AM_HID 0x02 /* Hidden */ #define AM_HID 0x02 /* Hidden */
#define AM_SYS 0x04 /* System */ #define AM_SYS 0x04 /* System */
#define AM_DIR 0x10 /* Directory */ #define AM_DIR 0x10 /* Directory */
#define AM_ARC 0x20 /* Archive */ #define AM_ARC 0x20 /* Archive */
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* FF_DEFINED */ #endif /* FF_DEFINED */

View File

@@ -1,304 +1,304 @@
#include <sys/param.h> #include <sys/param.h>
#include "sdkconfig.h" #include "sdkconfig.h"
/*---------------------------------------------------------------------------/ /*---------------------------------------------------------------------------/
/ FatFs - Configuration file / FatFs - Configuration file
/---------------------------------------------------------------------------*/ /---------------------------------------------------------------------------*/
#define FFCONF_DEF 89352 /* Revision ID */ #define FFCONF_DEF 89352 /* Revision ID */
/*---------------------------------------------------------------------------/ /*---------------------------------------------------------------------------/
/ Function Configurations / Function Configurations
/---------------------------------------------------------------------------*/ /---------------------------------------------------------------------------*/
#define FF_FS_READONLY 0 #define FF_FS_READONLY 0
/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) /* This option switches read-only configuration. (0:Read/Write or 1:Read-only)
/ Read-only configuration removes writing API functions, f_write(), f_sync(), / Read-only configuration removes writing API functions, f_write(), f_sync(),
/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() / f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()
/ and optional writing functions as well. */ / and optional writing functions as well. */
#define FF_FS_MINIMIZE 0 #define FF_FS_MINIMIZE 0
/* This option defines minimization level to remove some basic API functions. /* This option defines minimization level to remove some basic API functions.
/ /
/ 0: Basic functions are fully enabled. / 0: Basic functions are fully enabled.
/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() / 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename()
/ are removed. / are removed.
/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. / 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.
/ 3: f_lseek() function is removed in addition to 2. */ / 3: f_lseek() function is removed in addition to 2. */
#define FF_USE_STRFUNC 0 #define FF_USE_STRFUNC 0
/* This option switches string functions, f_gets(), f_putc(), f_puts() and f_printf(). /* This option switches string functions, f_gets(), f_putc(), f_puts() and f_printf().
/ /
/ 0: Disable string functions. / 0: Disable string functions.
/ 1: Enable without LF-CRLF conversion. / 1: Enable without LF-CRLF conversion.
/ 2: Enable with LF-CRLF conversion. */ / 2: Enable with LF-CRLF conversion. */
#define FF_USE_FIND 0 #define FF_USE_FIND 0
/* This option switches filtered directory read functions, f_findfirst() and /* This option switches filtered directory read functions, f_findfirst() and
/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ / f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */
#define FF_USE_MKFS 1 #define FF_USE_MKFS 1
/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ /* This option switches f_mkfs() function. (0:Disable or 1:Enable) */
#define FF_USE_FASTSEEK 0 #define FF_USE_FASTSEEK 0
/* This option switches fast seek function. (0:Disable or 1:Enable) */ /* This option switches fast seek function. (0:Disable or 1:Enable) */
#define FF_USE_EXPAND 0 #define FF_USE_EXPAND 0
/* This option switches f_expand function. (0:Disable or 1:Enable) */ /* This option switches f_expand function. (0:Disable or 1:Enable) */
#define FF_USE_CHMOD 0 #define FF_USE_CHMOD 0
/* This option switches attribute manipulation functions, f_chmod() and f_utime(). /* This option switches attribute manipulation functions, f_chmod() and f_utime().
/ (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */ / (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */
#define FF_USE_LABEL 0 #define FF_USE_LABEL 0
/* This option switches volume label functions, f_getlabel() and f_setlabel(). /* This option switches volume label functions, f_getlabel() and f_setlabel().
/ (0:Disable or 1:Enable) */ / (0:Disable or 1:Enable) */
#define FF_USE_FORWARD 0 #define FF_USE_FORWARD 0
/* This option switches f_forward() function. (0:Disable or 1:Enable) */ /* This option switches f_forward() function. (0:Disable or 1:Enable) */
/*---------------------------------------------------------------------------/ /*---------------------------------------------------------------------------/
/ Locale and Namespace Configurations / Locale and Namespace Configurations
/---------------------------------------------------------------------------*/ /---------------------------------------------------------------------------*/
#define FF_CODE_PAGE CONFIG_FATFS_CODEPAGE #define FF_CODE_PAGE CONFIG_FATFS_CODEPAGE
/* This option specifies the OEM code page to be used on the target system. /* This option specifies the OEM code page to be used on the target system.
/ Incorrect code page setting can cause a file open failure. / Incorrect code page setting can cause a file open failure.
/ /
/ 437 - U.S. / 437 - U.S.
/ 720 - Arabic / 720 - Arabic
/ 737 - Greek / 737 - Greek
/ 771 - KBL / 771 - KBL
/ 775 - Baltic / 775 - Baltic
/ 850 - Latin 1 / 850 - Latin 1
/ 852 - Latin 2 / 852 - Latin 2
/ 855 - Cyrillic / 855 - Cyrillic
/ 857 - Turkish / 857 - Turkish
/ 860 - Portuguese / 860 - Portuguese
/ 861 - Icelandic / 861 - Icelandic
/ 862 - Hebrew / 862 - Hebrew
/ 863 - Canadian French / 863 - Canadian French
/ 864 - Arabic / 864 - Arabic
/ 865 - Nordic / 865 - Nordic
/ 866 - Russian / 866 - Russian
/ 869 - Greek 2 / 869 - Greek 2
/ 932 - Japanese (DBCS) / 932 - Japanese (DBCS)
/ 936 - Simplified Chinese (DBCS) / 936 - Simplified Chinese (DBCS)
/ 949 - Korean (DBCS) / 949 - Korean (DBCS)
/ 950 - Traditional Chinese (DBCS) / 950 - Traditional Chinese (DBCS)
/ 0 - Include all code pages above and configured by f_setcp() / 0 - Include all code pages above and configured by f_setcp()
*/ */
#if defined(CONFIG_FATFS_LFN_STACK) #if defined(CONFIG_FATFS_LFN_STACK)
#define FF_USE_LFN 2 #define FF_USE_LFN 2
#elif defined(CONFIG_FATFS_LFN_HEAP) #elif defined(CONFIG_FATFS_LFN_HEAP)
#define FF_USE_LFN 3 #define FF_USE_LFN 3
#else /* CONFIG_FATFS_LFN_NONE */ #else /* CONFIG_FATFS_LFN_NONE */
#define FF_USE_LFN 0 #define FF_USE_LFN 0
#endif #endif
#ifdef CONFIG_FATFS_MAX_LFN #ifdef CONFIG_FATFS_MAX_LFN
#define FF_MAX_LFN CONFIG_FATFS_MAX_LFN #define FF_MAX_LFN CONFIG_FATFS_MAX_LFN
#endif #endif
/* The FF_USE_LFN switches the support for LFN (long file name). /* The FF_USE_LFN switches the support for LFN (long file name).
/ /
/ 0: Disable LFN. FF_MAX_LFN has no effect. / 0: Disable LFN. FF_MAX_LFN has no effect.
/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. / 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.
/ 2: Enable LFN with dynamic working buffer on the STACK. / 2: Enable LFN with dynamic working buffer on the STACK.
/ 3: Enable LFN with dynamic working buffer on the HEAP. / 3: Enable LFN with dynamic working buffer on the HEAP.
/ /
/ To enable the LFN, ffunicode.c needs to be added to the project. The LFN function / To enable the LFN, ffunicode.c needs to be added to the project. The LFN function
/ requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and / requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and
/ additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled. / additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled.
/ The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can / The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can
/ be in range of 12 to 255. It is recommended to be set 255 to fully support LFN / be in range of 12 to 255. It is recommended to be set 255 to fully support LFN
/ specification. / specification.
/ When use stack for the working buffer, take care on stack overflow. When use heap / When use stack for the working buffer, take care on stack overflow. When use heap
/ memory for the working buffer, memory management functions, ff_memalloc() and / memory for the working buffer, memory management functions, ff_memalloc() and
/ ff_memfree() in ffsystem.c, need to be added to the project. */ / ff_memfree() in ffsystem.c, need to be added to the project. */
#ifdef CONFIG_FATFS_API_ENCODING_UTF_8 #ifdef CONFIG_FATFS_API_ENCODING_UTF_8
#define FF_LFN_UNICODE 2 #define FF_LFN_UNICODE 2
#elif defined(CONFIG_FATFS_API_ENCODING_UTF_16) #elif defined(CONFIG_FATFS_API_ENCODING_UTF_16)
#define FF_LFN_UNICODE 1 #define FF_LFN_UNICODE 1
#else /* CONFIG_FATFS_API_ENCODING_ANSI_OEM */ #else /* CONFIG_FATFS_API_ENCODING_ANSI_OEM */
#define FF_LFN_UNICODE 0 #define FF_LFN_UNICODE 0
#endif #endif
/* This option switches the character encoding on the API when LFN is enabled. /* This option switches the character encoding on the API when LFN is enabled.
/ /
/ 0: ANSI/OEM in current CP (TCHAR = char) / 0: ANSI/OEM in current CP (TCHAR = char)
/ 1: Unicode in UTF-16 (TCHAR = WCHAR) / 1: Unicode in UTF-16 (TCHAR = WCHAR)
/ 2: Unicode in UTF-8 (TCHAR = char) / 2: Unicode in UTF-8 (TCHAR = char)
/ /
/ Also behavior of string I/O functions will be affected by this option. / Also behavior of string I/O functions will be affected by this option.
/ When LFN is not enabled, this option has no effect. */ / When LFN is not enabled, this option has no effect. */
#define FF_LFN_BUF 255 #define FF_LFN_BUF 255
#define FF_SFN_BUF 12 #define FF_SFN_BUF 12
/* This set of options defines size of file name members in the FILINFO structure /* This set of options defines size of file name members in the FILINFO structure
/ which is used to read out directory items. These values should be suffcient for / which is used to read out directory items. These values should be suffcient for
/ the file names to read. The maximum possible length of the read file name depends / the file names to read. The maximum possible length of the read file name depends
/ on character encoding. When LFN is not enabled, these options have no effect. */ / on character encoding. When LFN is not enabled, these options have no effect. */
#define FF_STRF_ENCODE 3 #define FF_STRF_ENCODE 3
/* When FF_LFN_UNICODE >= 1 with LFN enabled, string I/O functions, f_gets(), /* When FF_LFN_UNICODE >= 1 with LFN enabled, string I/O functions, f_gets(),
/ f_putc(), f_puts and f_printf() convert the character encoding in it. / f_putc(), f_puts and f_printf() convert the character encoding in it.
/ This option selects assumption of character encoding ON THE FILE to be / This option selects assumption of character encoding ON THE FILE to be
/ read/written via those functions. / read/written via those functions.
/ /
/ 0: ANSI/OEM in current CP / 0: ANSI/OEM in current CP
/ 1: Unicode in UTF-16LE / 1: Unicode in UTF-16LE
/ 2: Unicode in UTF-16BE / 2: Unicode in UTF-16BE
/ 3: Unicode in UTF-8 / 3: Unicode in UTF-8
*/ */
#define FF_FS_RPATH 0 #define FF_FS_RPATH 0
/* This option configures support for relative path. /* This option configures support for relative path.
/ /
/ 0: Disable relative path and remove related functions. / 0: Disable relative path and remove related functions.
/ 1: Enable relative path. f_chdir() and f_chdrive() are available. / 1: Enable relative path. f_chdir() and f_chdrive() are available.
/ 2: f_getcwd() function is available in addition to 1. / 2: f_getcwd() function is available in addition to 1.
*/ */
/*---------------------------------------------------------------------------/ /*---------------------------------------------------------------------------/
/ Drive/Volume Configurations / Drive/Volume Configurations
/---------------------------------------------------------------------------*/ /---------------------------------------------------------------------------*/
#define FF_VOLUMES 2 #define FF_VOLUMES 2
/* Number of volumes (logical drives) to be used. (1-10) */ /* Number of volumes (logical drives) to be used. (1-10) */
#define FF_STR_VOLUME_ID 0 #define FF_STR_VOLUME_ID 0
#define FF_VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3" #define FF_VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3"
/* FF_STR_VOLUME_ID switches string support for volume ID. /* FF_STR_VOLUME_ID switches string support for volume ID.
/ When FF_STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive / When FF_STR_VOLUME_ID is set to 1, also pre-defined strings can be used as drive
/ number in the path name. FF_VOLUME_STRS defines the drive ID strings for each / number in the path name. FF_VOLUME_STRS defines the drive ID strings for each
/ logical drives. Number of items must be equal to FF_VOLUMES. Valid characters for / logical drives. Number of items must be equal to FF_VOLUMES. Valid characters for
/ the drive ID strings are: A-Z and 0-9. */ / the drive ID strings are: A-Z and 0-9. */
#define FF_MULTI_PARTITION 1 #define FF_MULTI_PARTITION 1
/* This option switches support for multiple volumes on the physical drive. /* This option switches support for multiple volumes on the physical drive.
/ By default (0), each logical drive number is bound to the same physical drive / By default (0), each logical drive number is bound to the same physical drive
/ number and only an FAT volume found on the physical drive will be mounted. / number and only an FAT volume found on the physical drive will be mounted.
/ When this function is enabled (1), each logical drive number can be bound to / When this function is enabled (1), each logical drive number can be bound to
/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() / arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk()
/ funciton will be available. */ / funciton will be available. */
/* SD card sector size */ /* SD card sector size */
#define FF_SS_SDCARD 512 #define FF_SS_SDCARD 512
/* wear_levelling library sector size */ /* wear_levelling library sector size */
#define FF_SS_WL CONFIG_WL_SECTOR_SIZE #define FF_SS_WL CONFIG_WL_SECTOR_SIZE
#define FF_MIN_SS MIN(FF_SS_SDCARD, FF_SS_WL) #define FF_MIN_SS MIN(FF_SS_SDCARD, FF_SS_WL)
#define FF_MAX_SS MAX(FF_SS_SDCARD, FF_SS_WL) #define FF_MAX_SS MAX(FF_SS_SDCARD, FF_SS_WL)
/* This set of options configures the range of sector size to be supported. (512, /* This set of options configures the range of sector size to be supported. (512,
/ 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and / 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and
/ harddisk. But a larger value may be required for on-board flash memory and some / harddisk. But a larger value may be required for on-board flash memory and some
/ type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured / type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured
/ for variable sector size mode and disk_ioctl() function needs to implement / for variable sector size mode and disk_ioctl() function needs to implement
/ GET_SECTOR_SIZE command. */ / GET_SECTOR_SIZE command. */
#define FF_USE_TRIM 0 #define FF_USE_TRIM 0
/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable) /* This option switches support for ATA-TRIM. (0:Disable or 1:Enable)
/ To enable Trim function, also CTRL_TRIM command should be implemented to the / To enable Trim function, also CTRL_TRIM command should be implemented to the
/ disk_ioctl() function. */ / disk_ioctl() function. */
#define FF_FS_NOFSINFO 0 #define FF_FS_NOFSINFO 0
/* If you need to know correct free space on the FAT32 volume, set bit 0 of this /* If you need to know correct free space on the FAT32 volume, set bit 0 of this
/ option, and f_getfree() function at first time after volume mount will force / option, and f_getfree() function at first time after volume mount will force
/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. / a full FAT scan. Bit 1 controls the use of last allocated cluster number.
/ /
/ bit0=0: Use free cluster count in the FSINFO if available. / bit0=0: Use free cluster count in the FSINFO if available.
/ bit0=1: Do not trust free cluster count in the FSINFO. / bit0=1: Do not trust free cluster count in the FSINFO.
/ bit1=0: Use last allocated cluster number in the FSINFO if available. / bit1=0: Use last allocated cluster number in the FSINFO if available.
/ bit1=1: Do not trust last allocated cluster number in the FSINFO. / bit1=1: Do not trust last allocated cluster number in the FSINFO.
*/ */
/*---------------------------------------------------------------------------/ /*---------------------------------------------------------------------------/
/ System Configurations / System Configurations
/---------------------------------------------------------------------------*/ /---------------------------------------------------------------------------*/
#define FF_FS_TINY (!CONFIG_FATFS_PER_FILE_CACHE) #define FF_FS_TINY (!CONFIG_FATFS_PER_FILE_CACHE)
/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) /* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)
/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes. / At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.
/ Instead of private sector buffer eliminated from the file object, common sector / Instead of private sector buffer eliminated from the file object, common sector
/ buffer in the filesystem object (FATFS) is used for the file data transfer. */ / buffer in the filesystem object (FATFS) is used for the file data transfer. */
#define FF_FS_EXFAT 0 #define FF_FS_EXFAT 0
/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable) /* This option switches support for exFAT filesystem. (0:Disable or 1:Enable)
/ When enable exFAT, also LFN needs to be enabled. / When enable exFAT, also LFN needs to be enabled.
/ Note that enabling exFAT discards ANSI C (C89) compatibility. */ / Note that enabling exFAT discards ANSI C (C89) compatibility. */
#define FF_FS_NORTC 0 #define FF_FS_NORTC 0
#define FF_NORTC_MON 1 #define FF_NORTC_MON 1
#define FF_NORTC_MDAY 1 #define FF_NORTC_MDAY 1
#define FF_NORTC_YEAR 2017 #define FF_NORTC_YEAR 2017
/* The option FF_FS_NORTC switches timestamp functiton. If the system does not have /* The option FF_FS_NORTC switches timestamp functiton. If the system does not have
/ any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable / any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable
/ the timestamp function. All objects modified by FatFs will have a fixed timestamp / the timestamp function. All objects modified by FatFs will have a fixed timestamp
/ defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time. / defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time.
/ To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be / To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be
/ added to the project to read current time form real-time clock. FF_NORTC_MON, / added to the project to read current time form real-time clock. FF_NORTC_MON,
/ FF_NORTC_MDAY and FF_NORTC_YEAR have no effect. / FF_NORTC_MDAY and FF_NORTC_YEAR have no effect.
/ These options have no effect at read-only configuration (FF_FS_READONLY = 1). */ / These options have no effect at read-only configuration (FF_FS_READONLY = 1). */
#define FF_FS_LOCK CONFIG_FATFS_FS_LOCK #define FF_FS_LOCK CONFIG_FATFS_FS_LOCK
/* The option FF_FS_LOCK switches file lock function to control duplicated file open /* The option FF_FS_LOCK switches file lock function to control duplicated file open
/ and illegal operation to open objects. This option must be 0 when FF_FS_READONLY / and illegal operation to open objects. This option must be 0 when FF_FS_READONLY
/ is 1. / is 1.
/ /
/ 0: Disable file lock function. To avoid volume corruption, application program / 0: Disable file lock function. To avoid volume corruption, application program
/ should avoid illegal open, remove and rename to the open objects. / should avoid illegal open, remove and rename to the open objects.
/ >0: Enable file lock function. The value defines how many files/sub-directories / >0: Enable file lock function. The value defines how many files/sub-directories
/ can be opened simultaneously under file lock control. Note that the file / can be opened simultaneously under file lock control. Note that the file
/ lock control is independent of re-entrancy. */ / lock control is independent of re-entrancy. */
#define FF_FS_REENTRANT 1 #define FF_FS_REENTRANT 1
#define FF_FS_TIMEOUT (CONFIG_FATFS_TIMEOUT_MS / portTICK_PERIOD_MS) #define FF_FS_TIMEOUT (CONFIG_FATFS_TIMEOUT_MS / portTICK_PERIOD_MS)
#define FF_SYNC_t SemaphoreHandle_t #define FF_SYNC_t SemaphoreHandle_t
/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs /* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs
/ module itself. Note that regardless of this option, file access to different / module itself. Note that regardless of this option, file access to different
/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() / volume is always re-entrant and volume control functions, f_mount(), f_mkfs()
/ and f_fdisk() function, are always not re-entrant. Only file/directory access / and f_fdisk() function, are always not re-entrant. Only file/directory access
/ to the same volume is under control of this function. / to the same volume is under control of this function.
/ /
/ 0: Disable re-entrancy. FF_FS_TIMEOUT and FF_SYNC_t have no effect. / 0: Disable re-entrancy. FF_FS_TIMEOUT and FF_SYNC_t have no effect.
/ 1: Enable re-entrancy. Also user provided synchronization handlers, / 1: Enable re-entrancy. Also user provided synchronization handlers,
/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() / ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj()
/ function, must be added to the project. Samples are available in / function, must be added to the project. Samples are available in
/ option/syscall.c. / option/syscall.c.
/ /
/ The FF_FS_TIMEOUT defines timeout period in unit of time tick. / The FF_FS_TIMEOUT defines timeout period in unit of time tick.
/ The FF_SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, / The FF_SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*,
/ SemaphoreHandle_t and etc. A header file for O/S definitions needs to be / SemaphoreHandle_t and etc. A header file for O/S definitions needs to be
/ included somewhere in the scope of ff.h. */ / included somewhere in the scope of ff.h. */
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/semphr.h" #include "freertos/semphr.h"
/*--- End of configuration options ---*/ /*--- End of configuration options ---*/

View File

@@ -1,106 +1,106 @@
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* Sample Code of OS Dependent Functions for FatFs */ /* Sample Code of OS Dependent Functions for FatFs */
/* (C)ChaN, 2017 */ /* (C)ChaN, 2017 */
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
#include "ff.h" #include "ff.h"
#if FF_USE_LFN == 3 /* Dynamic memory allocation */ #if FF_USE_LFN == 3 /* Dynamic memory allocation */
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* Allocate a memory block */ /* Allocate a memory block */
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
void* ff_memalloc ( /* Returns pointer to the allocated memory block (null on not enough core) */ void* ff_memalloc ( /* Returns pointer to the allocated memory block (null on not enough core) */
UINT msize /* Number of bytes to allocate */ UINT msize /* Number of bytes to allocate */
) )
{ {
return malloc(msize); /* Allocate a new memory block with POSIX API */ return malloc(msize); /* Allocate a new memory block with POSIX API */
} }
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* Free a memory block */ /* Free a memory block */
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
void ff_memfree ( void ff_memfree (
void* mblock /* Pointer to the memory block to free (nothing to do for null) */ void* mblock /* Pointer to the memory block to free (nothing to do for null) */
) )
{ {
free(mblock); /* Free the memory block with POSIX API */ free(mblock); /* Free the memory block with POSIX API */
} }
#endif #endif
#if FF_FS_REENTRANT /* Mutal exclusion */ #if FF_FS_REENTRANT /* Mutal exclusion */
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* Create a Synchronization Object */ /* Create a Synchronization Object */
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* This function is called in f_mount() function to create a new /* This function is called in f_mount() function to create a new
/ synchronization object for the volume, such as semaphore and mutex. / synchronization object for the volume, such as semaphore and mutex.
/ When a 0 is returned, the f_mount() function fails with FR_INT_ERR. / When a 0 is returned, the f_mount() function fails with FR_INT_ERR.
*/ */
int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create the sync object */ int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create the sync object */
BYTE vol, /* Corresponding volume (logical drive number) */ BYTE vol, /* Corresponding volume (logical drive number) */
FF_SYNC_t *sobj /* Pointer to return the created sync object */ FF_SYNC_t *sobj /* Pointer to return the created sync object */
) )
{ {
*sobj = xSemaphoreCreateMutex(); *sobj = xSemaphoreCreateMutex();
return (*sobj != NULL) ? 1 : 0; return (*sobj != NULL) ? 1 : 0;
} }
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* Delete a Synchronization Object */ /* Delete a Synchronization Object */
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* This function is called in f_mount() function to delete a synchronization /* This function is called in f_mount() function to delete a synchronization
/ object that created with ff_cre_syncobj() function. When a 0 is returned, / object that created with ff_cre_syncobj() function. When a 0 is returned,
/ the f_mount() function fails with FR_INT_ERR. / the f_mount() function fails with FR_INT_ERR.
*/ */
int ff_del_syncobj ( /* 1:Function succeeded, 0:Could not delete due to an error */ int ff_del_syncobj ( /* 1:Function succeeded, 0:Could not delete due to an error */
FF_SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ FF_SYNC_t sobj /* Sync object tied to the logical drive to be deleted */
) )
{ {
vSemaphoreDelete(sobj); vSemaphoreDelete(sobj);
return 1; return 1;
} }
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* Request Grant to Access the Volume */ /* Request Grant to Access the Volume */
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* This function is called on entering file functions to lock the volume. /* This function is called on entering file functions to lock the volume.
/ When a 0 is returned, the file function fails with FR_TIMEOUT. / When a 0 is returned, the file function fails with FR_TIMEOUT.
*/ */
int ff_req_grant ( /* 1:Got a grant to access the volume, 0:Could not get a grant */ int ff_req_grant ( /* 1:Got a grant to access the volume, 0:Could not get a grant */
FF_SYNC_t sobj /* Sync object to wait */ FF_SYNC_t sobj /* Sync object to wait */
) )
{ {
return (xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE) ? 1 : 0; return (xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE) ? 1 : 0;
} }
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* Release Grant to Access the Volume */ /* Release Grant to Access the Volume */
/*------------------------------------------------------------------------*/ /*------------------------------------------------------------------------*/
/* This function is called on leaving file functions to unlock the volume. /* This function is called on leaving file functions to unlock the volume.
*/ */
void ff_rel_grant ( void ff_rel_grant (
FF_SYNC_t sobj /* Sync object to be signaled */ FF_SYNC_t sobj /* Sync object to be signaled */
) )
{ {
xSemaphoreGive(sobj); xSemaphoreGive(sobj);
} }
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,38 +1,38 @@
/*-------------------------------------------*/ /*-------------------------------------------*/
/* Integer type definitions for FatFs module */ /* Integer type definitions for FatFs module */
/*-------------------------------------------*/ /*-------------------------------------------*/
#ifndef FF_INTEGER #ifndef FF_INTEGER
#define FF_INTEGER #define FF_INTEGER
#ifdef _WIN32 /* FatFs development platform */ #ifdef _WIN32 /* FatFs development platform */
#include <windows.h> #include <windows.h>
#include <tchar.h> #include <tchar.h>
typedef unsigned __int64 QWORD; typedef unsigned __int64 QWORD;
#else /* Embedded platform */ #else /* Embedded platform */
/* These types MUST be 16-bit or 32-bit */ /* These types MUST be 16-bit or 32-bit */
typedef int INT; typedef int INT;
typedef unsigned int UINT; typedef unsigned int UINT;
/* This type MUST be 8-bit */ /* This type MUST be 8-bit */
typedef unsigned char BYTE; typedef unsigned char BYTE;
/* These types MUST be 16-bit */ /* These types MUST be 16-bit */
typedef short SHORT; typedef short SHORT;
typedef unsigned short WORD; typedef unsigned short WORD;
typedef unsigned short WCHAR; typedef unsigned short WCHAR;
/* These types MUST be 32-bit */ /* These types MUST be 32-bit */
typedef long LONG; typedef long LONG;
typedef unsigned long DWORD; typedef unsigned long DWORD;
/* This type MUST be 64-bit (Remove this for ANSI C (C89) compatibility) */ /* This type MUST be 64-bit (Remove this for ANSI C (C89) compatibility) */
typedef unsigned long long QWORD; typedef unsigned long long QWORD;
#endif #endif
#endif #endif

View File

@@ -1,52 +1,52 @@
/* /*
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without modification, * Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met: * are permitted provided that the following conditions are met:
* *
* 1. Redistributions of source code must retain the above copyright notice, * 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer. * this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice, * 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation * this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution. * and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products * 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * 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 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE. * OF SUCH DAMAGE.
* *
* This file is part of the lwIP TCP/IP stack. * This file is part of the lwIP TCP/IP stack.
* *
* Author: Adam Dunkels <adam@sics.se> * Author: Adam Dunkels <adam@sics.se>
* *
*/ */
#ifndef __SYS_ARCH_H__ #ifndef __SYS_ARCH_H__
#define __SYS_ARCH_H__ #define __SYS_ARCH_H__
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "freertos/queue.h" #include "freertos/queue.h"
#include "freertos/semphr.h" #include "freertos/semphr.h"
#include "arch/vfs_lwip.h" #include "arch/vfs_lwip.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef xSemaphoreHandle sys_sem_t; typedef xSemaphoreHandle sys_sem_t;
typedef xSemaphoreHandle sys_mutex_t; typedef xSemaphoreHandle sys_mutex_t;
typedef xTaskHandle sys_thread_t; typedef xTaskHandle sys_thread_t;
typedef struct sys_mbox_s { typedef struct sys_mbox_s {
xQueueHandle os_mbox; xQueueHandle os_mbox;
@@ -54,28 +54,28 @@ typedef struct sys_mbox_s {
uint8_t alive; uint8_t alive;
}* sys_mbox_t; }* sys_mbox_t;
#define LWIP_COMPAT_MUTEX 0
#if !LWIP_COMPAT_MUTEX
#define sys_mutex_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE )
#define sys_mutex_set_invalid( x ) ( ( *x ) = NULL )
#endif
#define sys_mbox_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE )
#define sys_mbox_set_invalid( x ) ( ( *x ) = NULL )
#define sys_sem_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE ) #define LWIP_COMPAT_MUTEX 0
#define sys_sem_set_invalid( x ) ( ( *x ) = NULL )
#if !LWIP_COMPAT_MUTEX
#define sys_mutex_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE )
#define sys_mutex_set_invalid( x ) ( ( *x ) = NULL )
#endif
#define sys_mbox_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE )
#define sys_mbox_set_invalid( x ) ( ( *x ) = NULL )
#define sys_sem_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE )
#define sys_sem_set_invalid( x ) ( ( *x ) = NULL )
void sys_delay_ms(uint32_t ms); void sys_delay_ms(uint32_t ms);
sys_sem_t* sys_thread_sem_init(void); sys_sem_t* sys_thread_sem_init(void);
void sys_thread_sem_deinit(void); void sys_thread_sem_deinit(void);
sys_sem_t* sys_thread_sem_get(void); sys_sem_t* sys_thread_sem_get(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* __SYS_ARCH_H__ */
#endif /* __SYS_ARCH_H__ */

View File

@@ -1,84 +1,84 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <pthread.h> #include <pthread.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include "esp32_compat.h" #include "esp32_compat.h"
void* g_queue; void* g_queue;
int g_queue_send_shall_fail = 0; int g_queue_send_shall_fail = 0;
int g_size = 0; int g_size = 0;
esp_err_t esp_timer_delete(esp_timer_handle_t timer) esp_err_t esp_timer_delete(esp_timer_handle_t timer)
{ {
return ESP_OK; return ESP_OK;
} }
esp_err_t esp_timer_stop(esp_timer_handle_t timer) esp_err_t esp_timer_stop(esp_timer_handle_t timer)
{ {
return ESP_OK; return ESP_OK;
} }
esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period) esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period)
{ {
return ESP_OK; return ESP_OK;
} }
esp_err_t esp_timer_create(const esp_timer_create_args_t* create_args, esp_err_t esp_timer_create(const esp_timer_create_args_t* create_args,
esp_timer_handle_t* out_handle) esp_timer_handle_t* out_handle)
{ {
return ESP_OK; return ESP_OK;
} }
uint32_t xTaskGetTickCount() uint32_t xTaskGetTickCount()
{ {
struct timeval tv; struct timeval tv;
struct timezone tz; struct timezone tz;
if (gettimeofday(&tv, &tz) == 0) { if (gettimeofday(&tv, &tz) == 0) {
return (tv.tv_sec * 1000) + (tv.tv_usec / 1000); return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
} }
return 0; return 0;
} }
/// Queue mock /// Queue mock
QueueHandle_t xQueueCreate( uint32_t uxQueueLength, uint32_t uxItemSize ) QueueHandle_t xQueueCreate( uint32_t uxQueueLength, uint32_t uxItemSize )
{ {
g_size = uxItemSize; g_size = uxItemSize;
g_queue = malloc((uxQueueLength)*(uxItemSize)); g_queue = malloc((uxQueueLength)*(uxItemSize));
return g_queue; return g_queue;
} }
void vQueueDelete( QueueHandle_t xQueue ) void vQueueDelete( QueueHandle_t xQueue )
{ {
free(xQueue); free(xQueue);
} }
uint32_t xQueueSend(QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait) uint32_t xQueueSend(QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait)
{ {
if (g_queue_send_shall_fail) if (g_queue_send_shall_fail)
{ {
return pdFALSE; return pdFALSE;
} }
else else
{ {
memcpy(xQueue, pvItemToQueue, g_size); memcpy(xQueue, pvItemToQueue, g_size);
return pdPASS; return pdPASS;
} }
} }
uint32_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait) uint32_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait)
{ {
return pdFALSE; return pdFALSE;
} }
void GetLastItem(void *pvBuffer) void GetLastItem(void *pvBuffer)
{ {
memcpy(pvBuffer, g_queue, g_size); memcpy(pvBuffer, g_queue, g_size);
} }
void ForceTaskDelete() void ForceTaskDelete()
{ {
g_queue_send_shall_fail = 1; g_queue_send_shall_fail = 1;
} }

View File

@@ -1,45 +1,45 @@
#ifndef ESP32_MOCK_H_ #ifndef ESP32_MOCK_H_
#define ESP32_MOCK_H_ #define ESP32_MOCK_H_
typedef void (*esp_timer_cb_t)(void* arg); typedef void (*esp_timer_cb_t)(void* arg);
typedef enum typedef enum
{ {
ESP_TIMER_TASK, //!< Callback is called from timer task ESP_TIMER_TASK, //!< Callback is called from timer task
} esp_timer_dispatch_t; } esp_timer_dispatch_t;
typedef struct typedef struct
{ {
esp_timer_cb_t callback; //!< Function to call when timer expires esp_timer_cb_t callback; //!< Function to call when timer expires
void* arg; //!< Argument to pass to the callback void* arg; //!< Argument to pass to the callback
esp_timer_dispatch_t dispatch_method; //!< Call the callback from task or from ISR esp_timer_dispatch_t dispatch_method; //!< Call the callback from task or from ISR
const char* name; //!< Timer name, used in esp_timer_dump function const char* name; //!< Timer name, used in esp_timer_dump function
} esp_timer_create_args_t; } esp_timer_create_args_t;
esp_err_t esp_timer_delete(esp_timer_handle_t timer); esp_err_t esp_timer_delete(esp_timer_handle_t timer);
esp_err_t esp_timer_stop(esp_timer_handle_t timer); esp_err_t esp_timer_stop(esp_timer_handle_t timer);
esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period); esp_err_t esp_timer_start_periodic(esp_timer_handle_t timer, uint64_t period);
esp_err_t esp_timer_create(const esp_timer_create_args_t* create_args, esp_err_t esp_timer_create(const esp_timer_create_args_t* create_args,
esp_timer_handle_t* out_handle); esp_timer_handle_t* out_handle);
// Queue mock // Queue mock
QueueHandle_t xQueueCreate( uint32_t uxQueueLength, QueueHandle_t xQueueCreate( uint32_t uxQueueLength,
uint32_t uxItemSize ); uint32_t uxItemSize );
void vQueueDelete( QueueHandle_t xQueue ); void vQueueDelete( QueueHandle_t xQueue );
uint32_t xQueueSend(QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait); uint32_t xQueueSend(QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait);
uint32_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait); uint32_t xQueueReceive(QueueHandle_t xQueue, void *pvBuffer, TickType_t xTicksToWait);
void GetLastItem(void *pvBuffer); void GetLastItem(void *pvBuffer);
void ForceTaskDelete(); void ForceTaskDelete();
#define _mdns_udp_pcb_write(tcpip_if, ip_protocol, ip, port, data, len) len #define _mdns_udp_pcb_write(tcpip_if, ip_protocol, ip, port, data, len) len
#endif /* ESP32_MOCK_H_ */ #endif /* ESP32_MOCK_H_ */

View File

@@ -1,111 +1,111 @@
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _X509_VFY_H_ #ifndef _X509_VFY_H_
#define _X509_VFY_H_ #define _X509_VFY_H_
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
#define X509_V_OK 0 #define X509_V_OK 0
#define X509_V_ERR_UNSPECIFIED 1 #define X509_V_ERR_UNSPECIFIED 1
#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2 #define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT 2
#define X509_V_ERR_UNABLE_TO_GET_CRL 3 #define X509_V_ERR_UNABLE_TO_GET_CRL 3
#define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4 #define X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE 4
#define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5 #define X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE 5
#define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6 #define X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY 6
#define X509_V_ERR_CERT_SIGNATURE_FAILURE 7 #define X509_V_ERR_CERT_SIGNATURE_FAILURE 7
#define X509_V_ERR_CRL_SIGNATURE_FAILURE 8 #define X509_V_ERR_CRL_SIGNATURE_FAILURE 8
#define X509_V_ERR_CERT_NOT_YET_VALID 9 #define X509_V_ERR_CERT_NOT_YET_VALID 9
#define X509_V_ERR_CERT_HAS_EXPIRED 10 #define X509_V_ERR_CERT_HAS_EXPIRED 10
#define X509_V_ERR_CRL_NOT_YET_VALID 11 #define X509_V_ERR_CRL_NOT_YET_VALID 11
#define X509_V_ERR_CRL_HAS_EXPIRED 12 #define X509_V_ERR_CRL_HAS_EXPIRED 12
#define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13 #define X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD 13
#define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14 #define X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD 14
#define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15 #define X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD 15
#define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16 #define X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD 16
#define X509_V_ERR_OUT_OF_MEM 17 #define X509_V_ERR_OUT_OF_MEM 17
#define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18 #define X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT 18
#define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19 #define X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN 19
#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20 #define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 20
#define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21 #define X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE 21
#define X509_V_ERR_CERT_CHAIN_TOO_LONG 22 #define X509_V_ERR_CERT_CHAIN_TOO_LONG 22
#define X509_V_ERR_CERT_REVOKED 23 #define X509_V_ERR_CERT_REVOKED 23
#define X509_V_ERR_INVALID_CA 24 #define X509_V_ERR_INVALID_CA 24
#define X509_V_ERR_PATH_LENGTH_EXCEEDED 25 #define X509_V_ERR_PATH_LENGTH_EXCEEDED 25
#define X509_V_ERR_INVALID_PURPOSE 26 #define X509_V_ERR_INVALID_PURPOSE 26
#define X509_V_ERR_CERT_UNTRUSTED 27 #define X509_V_ERR_CERT_UNTRUSTED 27
#define X509_V_ERR_CERT_REJECTED 28 #define X509_V_ERR_CERT_REJECTED 28
/* These are 'informational' when looking for issuer cert */ /* These are 'informational' when looking for issuer cert */
#define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29 #define X509_V_ERR_SUBJECT_ISSUER_MISMATCH 29
#define X509_V_ERR_AKID_SKID_MISMATCH 30 #define X509_V_ERR_AKID_SKID_MISMATCH 30
#define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31 #define X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH 31
#define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32 #define X509_V_ERR_KEYUSAGE_NO_CERTSIGN 32
#define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33 #define X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER 33
#define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34 #define X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION 34
#define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35 #define X509_V_ERR_KEYUSAGE_NO_CRL_SIGN 35
#define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36 #define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION 36
#define X509_V_ERR_INVALID_NON_CA 37 #define X509_V_ERR_INVALID_NON_CA 37
#define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38 #define X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED 38
#define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39 #define X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE 39
#define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40 #define X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED 40
#define X509_V_ERR_INVALID_EXTENSION 41 #define X509_V_ERR_INVALID_EXTENSION 41
#define X509_V_ERR_INVALID_POLICY_EXTENSION 42 #define X509_V_ERR_INVALID_POLICY_EXTENSION 42
#define X509_V_ERR_NO_EXPLICIT_POLICY 43 #define X509_V_ERR_NO_EXPLICIT_POLICY 43
#define X509_V_ERR_DIFFERENT_CRL_SCOPE 44 #define X509_V_ERR_DIFFERENT_CRL_SCOPE 44
#define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45 #define X509_V_ERR_UNSUPPORTED_EXTENSION_FEATURE 45
#define X509_V_ERR_UNNESTED_RESOURCE 46 #define X509_V_ERR_UNNESTED_RESOURCE 46
#define X509_V_ERR_PERMITTED_VIOLATION 47 #define X509_V_ERR_PERMITTED_VIOLATION 47
#define X509_V_ERR_EXCLUDED_VIOLATION 48 #define X509_V_ERR_EXCLUDED_VIOLATION 48
#define X509_V_ERR_SUBTREE_MINMAX 49 #define X509_V_ERR_SUBTREE_MINMAX 49
/* The application is not happy */ /* The application is not happy */
#define X509_V_ERR_APPLICATION_VERIFICATION 50 #define X509_V_ERR_APPLICATION_VERIFICATION 50
#define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51 #define X509_V_ERR_UNSUPPORTED_CONSTRAINT_TYPE 51
#define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52 #define X509_V_ERR_UNSUPPORTED_CONSTRAINT_SYNTAX 52
#define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53 #define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX 53
#define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54 #define X509_V_ERR_CRL_PATH_VALIDATION_ERROR 54
/* Another issuer check debug option */ /* Another issuer check debug option */
#define X509_V_ERR_PATH_LOOP 55 #define X509_V_ERR_PATH_LOOP 55
/* Suite B mode algorithm violation */ /* Suite B mode algorithm violation */
#define X509_V_ERR_SUITE_B_INVALID_VERSION 56 #define X509_V_ERR_SUITE_B_INVALID_VERSION 56
#define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57 #define X509_V_ERR_SUITE_B_INVALID_ALGORITHM 57
#define X509_V_ERR_SUITE_B_INVALID_CURVE 58 #define X509_V_ERR_SUITE_B_INVALID_CURVE 58
#define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59 #define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM 59
#define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60 #define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED 60
#define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61 #define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256 61
/* Host, email and IP check errors */ /* Host, email and IP check errors */
#define X509_V_ERR_HOSTNAME_MISMATCH 62 #define X509_V_ERR_HOSTNAME_MISMATCH 62
#define X509_V_ERR_EMAIL_MISMATCH 63 #define X509_V_ERR_EMAIL_MISMATCH 63
#define X509_V_ERR_IP_ADDRESS_MISMATCH 64 #define X509_V_ERR_IP_ADDRESS_MISMATCH 64
/* DANE TLSA errors */ /* DANE TLSA errors */
#define X509_V_ERR_DANE_NO_MATCH 65 #define X509_V_ERR_DANE_NO_MATCH 65
/* security level errors */ /* security level errors */
#define X509_V_ERR_EE_KEY_TOO_SMALL 66 #define X509_V_ERR_EE_KEY_TOO_SMALL 66
#define X509_V_ERR_CA_KEY_TOO_SMALL 67 #define X509_V_ERR_CA_KEY_TOO_SMALL 67
#define X509_V_ERR_CA_MD_TOO_WEAK 68 #define X509_V_ERR_CA_MD_TOO_WEAK 68
/* Caller error */ /* Caller error */
#define X509_V_ERR_INVALID_CALL 69 #define X509_V_ERR_INVALID_CALL 69
/* Issuer lookup error */ /* Issuer lookup error */
#define X509_V_ERR_STORE_LOOKUP 70 #define X509_V_ERR_STORE_LOOKUP 70
/* Certificate transparency */ /* Certificate transparency */
#define X509_V_ERR_NO_VALID_SCTS 71 #define X509_V_ERR_NO_VALID_SCTS 71
#define X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION 72 #define X509_V_ERR_PROXY_SUBJECT_NAME_VIOLATION 72
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,34 +1,34 @@
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _SOC_SDIO_SLAVE_PINS_H_ #ifndef _SOC_SDIO_SLAVE_PINS_H_
#define _SOC_SDIO_SLAVE_PINS_H_ #define _SOC_SDIO_SLAVE_PINS_H_
#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_CLK 6 #define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_CLK 6
#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_CMD 11 #define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_CMD 11
#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D0 7 #define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D0 7
#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D1 8 #define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D1 8
#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D2 9 #define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D2 9
#define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D3 10 #define SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D3 10
#define SDIO_SLAVE_SLOT0_FUNC 0 #define SDIO_SLAVE_SLOT0_FUNC 0
#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_CLK 14 #define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_CLK 14
#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_CMD 15 #define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_CMD 15
#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D0 2 #define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D0 2
#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D1 4 #define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D1 4
#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D2 12 #define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D2 12
#define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D3 13 #define SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D3 13
#define SDIO_SLAVE_SLOT1_FUNC 4 #define SDIO_SLAVE_SLOT1_FUNC 4
#endif /* _SOC_SDIO_SLAVE_PINS_H_ */ #endif /* _SOC_SDIO_SLAVE_PINS_H_ */

View File

@@ -1,38 +1,38 @@
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _SOC_SDMMC_PINS_H_ #ifndef _SOC_SDMMC_PINS_H_
#define _SOC_SDMMC_PINS_H_ #define _SOC_SDMMC_PINS_H_
#define SDMMC_SLOT0_IOMUX_PIN_NUM_CLK 6 #define SDMMC_SLOT0_IOMUX_PIN_NUM_CLK 6
#define SDMMC_SLOT0_IOMUX_PIN_NUM_CMD 11 #define SDMMC_SLOT0_IOMUX_PIN_NUM_CMD 11
#define SDMMC_SLOT0_IOMUX_PIN_NUM_D0 7 #define SDMMC_SLOT0_IOMUX_PIN_NUM_D0 7
#define SDMMC_SLOT0_IOMUX_PIN_NUM_D1 8 #define SDMMC_SLOT0_IOMUX_PIN_NUM_D1 8
#define SDMMC_SLOT0_IOMUX_PIN_NUM_D2 9 #define SDMMC_SLOT0_IOMUX_PIN_NUM_D2 9
#define SDMMC_SLOT0_IOMUX_PIN_NUM_D3 10 #define SDMMC_SLOT0_IOMUX_PIN_NUM_D3 10
#define SDMMC_SLOT0_IOMUX_PIN_NUM_D4 16 #define SDMMC_SLOT0_IOMUX_PIN_NUM_D4 16
#define SDMMC_SLOT0_IOMUX_PIN_NUM_D5 17 #define SDMMC_SLOT0_IOMUX_PIN_NUM_D5 17
#define SDMMC_SLOT0_IOMUX_PIN_NUM_D6 5 #define SDMMC_SLOT0_IOMUX_PIN_NUM_D6 5
#define SDMMC_SLOT0_IOMUX_PIN_NUM_D7 18 #define SDMMC_SLOT0_IOMUX_PIN_NUM_D7 18
#define SDMMC_SLOT0_FUNC 0 #define SDMMC_SLOT0_FUNC 0
#define SDMMC_SLOT1_IOMUX_PIN_NUM_CLK 14 #define SDMMC_SLOT1_IOMUX_PIN_NUM_CLK 14
#define SDMMC_SLOT1_IOMUX_PIN_NUM_CMD 15 #define SDMMC_SLOT1_IOMUX_PIN_NUM_CMD 15
#define SDMMC_SLOT1_IOMUX_PIN_NUM_D0 2 #define SDMMC_SLOT1_IOMUX_PIN_NUM_D0 2
#define SDMMC_SLOT1_IOMUX_PIN_NUM_D1 4 #define SDMMC_SLOT1_IOMUX_PIN_NUM_D1 4
#define SDMMC_SLOT1_IOMUX_PIN_NUM_D2 12 #define SDMMC_SLOT1_IOMUX_PIN_NUM_D2 12
#define SDMMC_SLOT1_IOMUX_PIN_NUM_D3 13 #define SDMMC_SLOT1_IOMUX_PIN_NUM_D3 13
#define SDMMC_SLOT1_FUNC 4 #define SDMMC_SLOT1_FUNC 4
#endif /* _SOC_SDMMC_PINS_H_ */ #endif /* _SOC_SDMMC_PINS_H_ */

View File

@@ -1,39 +1,39 @@
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _SOC_SPI_PINS_H_ #ifndef _SOC_SPI_PINS_H_
#define _SOC_SPI_PINS_H_ #define _SOC_SPI_PINS_H_
#define SPI_IOMUX_PIN_NUM_MISO 7 #define SPI_IOMUX_PIN_NUM_MISO 7
#define SPI_IOMUX_PIN_NUM_MOSI 8 #define SPI_IOMUX_PIN_NUM_MOSI 8
#define SPI_IOMUX_PIN_NUM_CLK 6 #define SPI_IOMUX_PIN_NUM_CLK 6
#define SPI_IOMUX_PIN_NUM_CS 11 #define SPI_IOMUX_PIN_NUM_CS 11
#define SPI_IOMUX_PIN_NUM_WP 10 #define SPI_IOMUX_PIN_NUM_WP 10
#define SPI_IOMUX_PIN_NUM_HD 9 #define SPI_IOMUX_PIN_NUM_HD 9
#define HSPI_IOMUX_PIN_NUM_MISO 12 #define HSPI_IOMUX_PIN_NUM_MISO 12
#define HSPI_IOMUX_PIN_NUM_MOSI 13 #define HSPI_IOMUX_PIN_NUM_MOSI 13
#define HSPI_IOMUX_PIN_NUM_CLK 14 #define HSPI_IOMUX_PIN_NUM_CLK 14
#define HSPI_IOMUX_PIN_NUM_CS 15 #define HSPI_IOMUX_PIN_NUM_CS 15
#define HSPI_IOMUX_PIN_NUM_WP 2 #define HSPI_IOMUX_PIN_NUM_WP 2
#define HSPI_IOMUX_PIN_NUM_HD 4 #define HSPI_IOMUX_PIN_NUM_HD 4
#define VSPI_IOMUX_PIN_NUM_MISO 19 #define VSPI_IOMUX_PIN_NUM_MISO 19
#define VSPI_IOMUX_PIN_NUM_MOSI 23 #define VSPI_IOMUX_PIN_NUM_MOSI 23
#define VSPI_IOMUX_PIN_NUM_CLK 18 #define VSPI_IOMUX_PIN_NUM_CLK 18
#define VSPI_IOMUX_PIN_NUM_CS 5 #define VSPI_IOMUX_PIN_NUM_CS 5
#define VSPI_IOMUX_PIN_NUM_WP 22 #define VSPI_IOMUX_PIN_NUM_WP 22
#define VSPI_IOMUX_PIN_NUM_HD 21 #define VSPI_IOMUX_PIN_NUM_HD 21
#endif /* _SOC_SPI_PINS_H_ */ #endif /* _SOC_SPI_PINS_H_ */

View File

@@ -1,43 +1,43 @@
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include <stdint.h> #include <stdint.h>
#include "soc/sdio_slave_periph.h" #include "soc/sdio_slave_periph.h"
#include "soc/io_mux_reg.h" #include "soc/io_mux_reg.h"
#include "soc/sdio_slave_pins.h" #include "soc/sdio_slave_pins.h"
// I/O slot of sdio slave: // I/O slot of sdio slave:
// 0: GPIO 6, 11, 7, 8, 9, 10, // 0: GPIO 6, 11, 7, 8, 9, 10,
// 1: GPIO 14, 15, 2, 4, 12, 13 for CLK, CMD, D0, D1, D2, D3 respectively. // 1: GPIO 14, 15, 2, 4, 12, 13 for CLK, CMD, D0, D1, D2, D3 respectively.
// only one peripheral for SDIO and only one slot can work at the same time. // only one peripheral for SDIO and only one slot can work at the same time.
// currently slot 0 is occupied by SPI for flash // currently slot 0 is occupied by SPI for flash
const sdio_slave_slot_info_t sdio_slave_slot_info[2] = { const sdio_slave_slot_info_t sdio_slave_slot_info[2] = {
{ {
.clk_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_CLK, .clk_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_CLK,
.cmd_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_CMD, .cmd_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_CMD,
.d0_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D0, .d0_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D0,
.d1_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D1, .d1_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D1,
.d2_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D2, .d2_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D2,
.d3_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D3, .d3_gpio = SDIO_SLAVE_SLOT0_IOMUX_PIN_NUM_D3,
.func = SDIO_SLAVE_SLOT0_FUNC, .func = SDIO_SLAVE_SLOT0_FUNC,
}, { }, {
.clk_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_CLK, .clk_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_CLK,
.cmd_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_CMD, .cmd_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_CMD,
.d0_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D0, .d0_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D0,
.d1_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D1, .d1_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D1,
.d2_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D2, .d2_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D2,
.d3_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D3, .d3_gpio = SDIO_SLAVE_SLOT1_IOMUX_PIN_NUM_D3,
.func = SDIO_SLAVE_SLOT1_FUNC, .func = SDIO_SLAVE_SLOT1_FUNC,
}, },
}; };

View File

@@ -1,50 +1,50 @@
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "soc/sdmmc_periph.h" #include "soc/sdmmc_periph.h"
const sdmmc_slot_info_t sdmmc_slot_info[2] = { const sdmmc_slot_info_t sdmmc_slot_info[2] = {
{ {
.clk_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_CLK, .clk_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_CLK,
.cmd_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_CMD, .cmd_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_CMD,
.d0_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D0, .d0_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D0,
.d1_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D1, .d1_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D1,
.d2_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D2, .d2_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D2,
.d3_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D3, .d3_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D3,
.d4_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D4, .d4_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D4,
.d5_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D5, .d5_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D5,
.d6_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D6, .d6_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D6,
.d7_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D7, .d7_gpio = SDMMC_SLOT0_IOMUX_PIN_NUM_D7,
.card_detect = HOST_CARD_DETECT_N_1_IDX, .card_detect = HOST_CARD_DETECT_N_1_IDX,
.write_protect = HOST_CARD_WRITE_PRT_1_IDX, .write_protect = HOST_CARD_WRITE_PRT_1_IDX,
.card_int = HOST_CARD_INT_N_1_IDX, .card_int = HOST_CARD_INT_N_1_IDX,
.width = 8 .width = 8
}, },
{ {
.clk_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_CLK, .clk_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_CLK,
.cmd_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_CMD, .cmd_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_CMD,
.d0_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_D0, .d0_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_D0,
.d1_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_D1, .d1_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_D1,
.d2_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_D2, .d2_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_D2,
.d3_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_D3, .d3_gpio = SDMMC_SLOT1_IOMUX_PIN_NUM_D3,
.d4_gpio = -1, //slot1 has no D4-7 .d4_gpio = -1, //slot1 has no D4-7
.d5_gpio = -1, .d5_gpio = -1,
.d6_gpio = -1, .d6_gpio = -1,
.d7_gpio = -1, .d7_gpio = -1,
.card_detect = HOST_CARD_DETECT_N_2_IDX, .card_detect = HOST_CARD_DETECT_N_2_IDX,
.write_protect = HOST_CARD_WRITE_PRT_2_IDX, .write_protect = HOST_CARD_WRITE_PRT_2_IDX,
.card_int = HOST_CARD_INT_N_2_IDX, .card_int = HOST_CARD_INT_N_2_IDX,
.width = 4 .width = 4
} }
}; };

View File

@@ -1,91 +1,91 @@
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "soc/spi_periph.h" #include "soc/spi_periph.h"
/* /*
Bunch of constants for every SPI peripheral: GPIO signals, irqs, hw addr of registers etc Bunch of constants for every SPI peripheral: GPIO signals, irqs, hw addr of registers etc
*/ */
const spi_signal_conn_t spi_periph_signal[3] = { const spi_signal_conn_t spi_periph_signal[3] = {
{ {
.spiclk_out = SPICLK_OUT_IDX, .spiclk_out = SPICLK_OUT_IDX,
.spiclk_in = SPICLK_IN_IDX, .spiclk_in = SPICLK_IN_IDX,
.spid_out = SPID_OUT_IDX, .spid_out = SPID_OUT_IDX,
.spiq_out = SPIQ_OUT_IDX, .spiq_out = SPIQ_OUT_IDX,
.spiwp_out = SPIWP_OUT_IDX, .spiwp_out = SPIWP_OUT_IDX,
.spihd_out = SPIHD_OUT_IDX, .spihd_out = SPIHD_OUT_IDX,
.spid_in = SPID_IN_IDX, .spid_in = SPID_IN_IDX,
.spiq_in = SPIQ_IN_IDX, .spiq_in = SPIQ_IN_IDX,
.spiwp_in = SPIWP_IN_IDX, .spiwp_in = SPIWP_IN_IDX,
.spihd_in = SPIHD_IN_IDX, .spihd_in = SPIHD_IN_IDX,
.spics_out = {SPICS0_OUT_IDX, SPICS1_OUT_IDX, SPICS2_OUT_IDX}, .spics_out = {SPICS0_OUT_IDX, SPICS1_OUT_IDX, SPICS2_OUT_IDX},
.spics_in = SPICS0_IN_IDX, .spics_in = SPICS0_IN_IDX,
.spiclk_iomux_pin = SPI_IOMUX_PIN_NUM_CLK, .spiclk_iomux_pin = SPI_IOMUX_PIN_NUM_CLK,
.spid_iomux_pin = SPI_IOMUX_PIN_NUM_MOSI, .spid_iomux_pin = SPI_IOMUX_PIN_NUM_MOSI,
.spiq_iomux_pin = SPI_IOMUX_PIN_NUM_MISO, .spiq_iomux_pin = SPI_IOMUX_PIN_NUM_MISO,
.spiwp_iomux_pin = SPI_IOMUX_PIN_NUM_WP, .spiwp_iomux_pin = SPI_IOMUX_PIN_NUM_WP,
.spihd_iomux_pin = SPI_IOMUX_PIN_NUM_HD, .spihd_iomux_pin = SPI_IOMUX_PIN_NUM_HD,
.spics0_iomux_pin = SPI_IOMUX_PIN_NUM_CS, .spics0_iomux_pin = SPI_IOMUX_PIN_NUM_CS,
.irq = ETS_SPI1_INTR_SOURCE, .irq = ETS_SPI1_INTR_SOURCE,
.irq_dma = ETS_SPI1_DMA_INTR_SOURCE, .irq_dma = ETS_SPI1_DMA_INTR_SOURCE,
.module = PERIPH_SPI_MODULE, .module = PERIPH_SPI_MODULE,
.hw = &SPI1 .hw = &SPI1
}, { }, {
.spiclk_out = HSPICLK_OUT_IDX, .spiclk_out = HSPICLK_OUT_IDX,
.spiclk_in = HSPICLK_IN_IDX, .spiclk_in = HSPICLK_IN_IDX,
.spid_out = HSPID_OUT_IDX, .spid_out = HSPID_OUT_IDX,
.spiq_out = HSPIQ_OUT_IDX, .spiq_out = HSPIQ_OUT_IDX,
.spiwp_out = HSPIWP_OUT_IDX, .spiwp_out = HSPIWP_OUT_IDX,
.spihd_out = HSPIHD_OUT_IDX, .spihd_out = HSPIHD_OUT_IDX,
.spid_in = HSPID_IN_IDX, .spid_in = HSPID_IN_IDX,
.spiq_in = HSPIQ_IN_IDX, .spiq_in = HSPIQ_IN_IDX,
.spiwp_in = HSPIWP_IN_IDX, .spiwp_in = HSPIWP_IN_IDX,
.spihd_in = HSPIHD_IN_IDX, .spihd_in = HSPIHD_IN_IDX,
.spics_out = {HSPICS0_OUT_IDX, HSPICS1_OUT_IDX, HSPICS2_OUT_IDX}, .spics_out = {HSPICS0_OUT_IDX, HSPICS1_OUT_IDX, HSPICS2_OUT_IDX},
.spics_in = HSPICS0_IN_IDX, .spics_in = HSPICS0_IN_IDX,
.spiclk_iomux_pin = HSPI_IOMUX_PIN_NUM_CLK, .spiclk_iomux_pin = HSPI_IOMUX_PIN_NUM_CLK,
.spid_iomux_pin = HSPI_IOMUX_PIN_NUM_MOSI, .spid_iomux_pin = HSPI_IOMUX_PIN_NUM_MOSI,
.spiq_iomux_pin = HSPI_IOMUX_PIN_NUM_MISO, .spiq_iomux_pin = HSPI_IOMUX_PIN_NUM_MISO,
.spiwp_iomux_pin = HSPI_IOMUX_PIN_NUM_WP, .spiwp_iomux_pin = HSPI_IOMUX_PIN_NUM_WP,
.spihd_iomux_pin = HSPI_IOMUX_PIN_NUM_HD, .spihd_iomux_pin = HSPI_IOMUX_PIN_NUM_HD,
.spics0_iomux_pin = HSPI_IOMUX_PIN_NUM_CS, .spics0_iomux_pin = HSPI_IOMUX_PIN_NUM_CS,
.irq = ETS_SPI2_INTR_SOURCE, .irq = ETS_SPI2_INTR_SOURCE,
.irq_dma = ETS_SPI2_DMA_INTR_SOURCE, .irq_dma = ETS_SPI2_DMA_INTR_SOURCE,
.module = PERIPH_HSPI_MODULE, .module = PERIPH_HSPI_MODULE,
.hw = &SPI2 .hw = &SPI2
}, { }, {
.spiclk_out = VSPICLK_OUT_IDX, .spiclk_out = VSPICLK_OUT_IDX,
.spiclk_in = VSPICLK_IN_IDX, .spiclk_in = VSPICLK_IN_IDX,
.spid_out = VSPID_OUT_IDX, .spid_out = VSPID_OUT_IDX,
.spiq_out = VSPIQ_OUT_IDX, .spiq_out = VSPIQ_OUT_IDX,
.spiwp_out = VSPIWP_OUT_IDX, .spiwp_out = VSPIWP_OUT_IDX,
.spihd_out = VSPIHD_OUT_IDX, .spihd_out = VSPIHD_OUT_IDX,
.spid_in = VSPID_IN_IDX, .spid_in = VSPID_IN_IDX,
.spiq_in = VSPIQ_IN_IDX, .spiq_in = VSPIQ_IN_IDX,
.spiwp_in = VSPIWP_IN_IDX, .spiwp_in = VSPIWP_IN_IDX,
.spihd_in = VSPIHD_IN_IDX, .spihd_in = VSPIHD_IN_IDX,
.spics_out = {VSPICS0_OUT_IDX, VSPICS1_OUT_IDX, VSPICS2_OUT_IDX}, .spics_out = {VSPICS0_OUT_IDX, VSPICS1_OUT_IDX, VSPICS2_OUT_IDX},
.spics_in = VSPICS0_IN_IDX, .spics_in = VSPICS0_IN_IDX,
.spiclk_iomux_pin = VSPI_IOMUX_PIN_NUM_CLK, .spiclk_iomux_pin = VSPI_IOMUX_PIN_NUM_CLK,
.spid_iomux_pin = VSPI_IOMUX_PIN_NUM_MOSI, .spid_iomux_pin = VSPI_IOMUX_PIN_NUM_MOSI,
.spiq_iomux_pin = VSPI_IOMUX_PIN_NUM_MISO, .spiq_iomux_pin = VSPI_IOMUX_PIN_NUM_MISO,
.spiwp_iomux_pin = VSPI_IOMUX_PIN_NUM_WP, .spiwp_iomux_pin = VSPI_IOMUX_PIN_NUM_WP,
.spihd_iomux_pin = VSPI_IOMUX_PIN_NUM_HD, .spihd_iomux_pin = VSPI_IOMUX_PIN_NUM_HD,
.spics0_iomux_pin = VSPI_IOMUX_PIN_NUM_CS, .spics0_iomux_pin = VSPI_IOMUX_PIN_NUM_CS,
.irq = ETS_SPI3_INTR_SOURCE, .irq = ETS_SPI3_INTR_SOURCE,
.irq_dma = ETS_SPI3_DMA_INTR_SOURCE, .irq_dma = ETS_SPI3_DMA_INTR_SOURCE,
.module = PERIPH_VSPI_MODULE, .module = PERIPH_VSPI_MODULE,
.hw = &SPI3 .hw = &SPI3
} }
}; };

View File

@@ -1,49 +1,49 @@
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _SOC_SDIO_SLAVE_PERIPH_H_ #ifndef _SOC_SDIO_SLAVE_PERIPH_H_
#define _SOC_SDIO_SLAVE_PERIPH_H_ #define _SOC_SDIO_SLAVE_PERIPH_H_
#include <stdint.h> #include <stdint.h>
//include soc related (generated) definitions //include soc related (generated) definitions
#include "soc/sdio_slave_pins.h" #include "soc/sdio_slave_pins.h"
#include "soc/slc_reg.h" #include "soc/slc_reg.h"
#include "soc/slc_struct.h" #include "soc/slc_struct.h"
#include "soc/host_reg.h" #include "soc/host_reg.h"
#include "soc/host_struct.h" #include "soc/host_struct.h"
#include "soc/hinf_reg.h" #include "soc/hinf_reg.h"
#include "soc/hinf_struct.h" #include "soc/hinf_struct.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/** pin and signal information of each slot */ /** pin and signal information of each slot */
typedef struct { typedef struct {
uint32_t clk_gpio; uint32_t clk_gpio;
uint32_t cmd_gpio; uint32_t cmd_gpio;
uint32_t d0_gpio; uint32_t d0_gpio;
uint32_t d1_gpio; uint32_t d1_gpio;
uint32_t d2_gpio; uint32_t d2_gpio;
uint32_t d3_gpio; uint32_t d3_gpio;
int func; int func;
} sdio_slave_slot_info_t; } sdio_slave_slot_info_t;
extern const sdio_slave_slot_info_t sdio_slave_slot_info[]; extern const sdio_slave_slot_info_t sdio_slave_slot_info[];
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* _SOC_SDIO_SLAVE_PERIPH_H_ */ #endif /* _SOC_SDIO_SLAVE_PERIPH_H_ */

View File

@@ -1,53 +1,53 @@
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _SOC_SDMMC_PERIPH_H_ #ifndef _SOC_SDMMC_PERIPH_H_
#define _SOC_SDMMC_PERIPH_H_ #define _SOC_SDMMC_PERIPH_H_
#include <stdint.h> #include <stdint.h>
//include soc related (generated) definitions //include soc related (generated) definitions
#include "soc/sdmmc_pins.h" #include "soc/sdmmc_pins.h"
#include "soc/sdmmc_reg.h" #include "soc/sdmmc_reg.h"
#include "soc/sdmmc_struct.h" #include "soc/sdmmc_struct.h"
#include "soc/gpio_sig_map.h" #include "soc/gpio_sig_map.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef struct { typedef struct {
uint8_t clk_gpio; uint8_t clk_gpio;
uint8_t cmd_gpio; uint8_t cmd_gpio;
uint8_t d0_gpio; uint8_t d0_gpio;
uint8_t d1_gpio; uint8_t d1_gpio;
uint8_t d2_gpio; uint8_t d2_gpio;
uint8_t d3_gpio; uint8_t d3_gpio;
uint8_t d4_gpio; uint8_t d4_gpio;
uint8_t d5_gpio; uint8_t d5_gpio;
uint8_t d6_gpio; uint8_t d6_gpio;
uint8_t d7_gpio; uint8_t d7_gpio;
uint8_t card_detect; uint8_t card_detect;
uint8_t write_protect; uint8_t write_protect;
uint8_t card_int; uint8_t card_int;
uint8_t width; uint8_t width;
} sdmmc_slot_info_t; } sdmmc_slot_info_t;
/** pin and signal information of each slot */ /** pin and signal information of each slot */
extern const sdmmc_slot_info_t sdmmc_slot_info[]; extern const sdmmc_slot_info_t sdmmc_slot_info[];
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* _SOC_SDMMC_PERIPH_H_ */ #endif /* _SOC_SDMMC_PERIPH_H_ */

View File

@@ -1,66 +1,66 @@
// Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _SOC_SPI_PERIPH_H_ #ifndef _SOC_SPI_PERIPH_H_
#define _SOC_SPI_PERIPH_H_ #define _SOC_SPI_PERIPH_H_
#include <stdint.h> #include <stdint.h>
#include "soc/soc.h" #include "soc/soc.h"
#include "soc/periph_defs.h" #include "soc/periph_defs.h"
//include soc related (generated) definitions //include soc related (generated) definitions
#include "soc/spi_pins.h" #include "soc/spi_pins.h"
#include "soc/spi_reg.h" #include "soc/spi_reg.h"
#include "soc/spi_struct.h" #include "soc/spi_struct.h"
#include "soc/gpio_sig_map.h" #include "soc/gpio_sig_map.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" extern "C"
{ {
#endif #endif
/* /*
Stores a bunch of per-spi-peripheral data. Stores a bunch of per-spi-peripheral data.
*/ */
typedef struct { typedef struct {
const uint8_t spiclk_out; //GPIO mux output signals const uint8_t spiclk_out; //GPIO mux output signals
const uint8_t spiclk_in; const uint8_t spiclk_in;
const uint8_t spid_out; const uint8_t spid_out;
const uint8_t spiq_out; const uint8_t spiq_out;
const uint8_t spiwp_out; const uint8_t spiwp_out;
const uint8_t spihd_out; const uint8_t spihd_out;
const uint8_t spid_in; //GPIO mux input signals const uint8_t spid_in; //GPIO mux input signals
const uint8_t spiq_in; const uint8_t spiq_in;
const uint8_t spiwp_in; const uint8_t spiwp_in;
const uint8_t spihd_in; const uint8_t spihd_in;
const uint8_t spics_out[3]; // /CS GPIO output mux signals const uint8_t spics_out[3]; // /CS GPIO output mux signals
const uint8_t spics_in; const uint8_t spics_in;
const uint8_t spiclk_iomux_pin; //IO pins of IO_MUX muxed signals const uint8_t spiclk_iomux_pin; //IO pins of IO_MUX muxed signals
const uint8_t spid_iomux_pin; const uint8_t spid_iomux_pin;
const uint8_t spiq_iomux_pin; const uint8_t spiq_iomux_pin;
const uint8_t spiwp_iomux_pin; const uint8_t spiwp_iomux_pin;
const uint8_t spihd_iomux_pin; const uint8_t spihd_iomux_pin;
const uint8_t spics0_iomux_pin; const uint8_t spics0_iomux_pin;
const uint8_t irq; //irq source for interrupt mux const uint8_t irq; //irq source for interrupt mux
const uint8_t irq_dma; //dma irq source for interrupt mux const uint8_t irq_dma; //dma irq source for interrupt mux
const periph_module_t module; //peripheral module, for enabling clock etc const periph_module_t module; //peripheral module, for enabling clock etc
spi_dev_t *hw; //Pointer to the hardware registers spi_dev_t *hw; //Pointer to the hardware registers
} spi_signal_conn_t; } spi_signal_conn_t;
extern const spi_signal_conn_t spi_periph_signal[3]; extern const spi_signal_conn_t spi_periph_signal[3];
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif /* _SOC_SPI_PERIPH_H_ */ #endif /* _SOC_SPI_PERIPH_H_ */

View File

@@ -1,127 +1,127 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "SpiFlash.h" #include "SpiFlash.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <vector> #include <vector>
#include <string> #include <string>
#include "sdkconfig.h" #include "sdkconfig.h"
#include "esp_flash_data_types.h" #include "esp_flash_data_types.h"
using namespace std; using namespace std;
SpiFlash::SpiFlash() SpiFlash::SpiFlash()
{ {
return; return;
} }
SpiFlash::~SpiFlash() SpiFlash::~SpiFlash()
{ {
deinit(); deinit();
} }
void SpiFlash::init(size_t chip_size, size_t block_size, size_t sector_size, size_t page_size, const char* partitions_bin) void SpiFlash::init(size_t chip_size, size_t block_size, size_t sector_size, size_t page_size, const char* partitions_bin)
{ {
// De-initialize first // De-initialize first
deinit(); deinit();
this->chip_size = chip_size; this->chip_size = chip_size;
this->block_size = block_size; this->block_size = block_size;
this->sector_size = sector_size; this->sector_size = sector_size;
this->page_size = page_size; this->page_size = page_size;
this->memory = (uint8_t *) malloc(this->chip_size); this->memory = (uint8_t *) malloc(this->chip_size);
memset(this->memory, 0xFF, this->chip_size); memset(this->memory, 0xFF, this->chip_size);
ifstream ifd(partitions_bin, ios::binary | ios::ate); ifstream ifd(partitions_bin, ios::binary | ios::ate);
int size = ifd.tellg(); int size = ifd.tellg();
ifd.seekg(0, ios::beg); ifd.seekg(0, ios::beg);
vector<char> buffer; vector<char> buffer;
buffer.resize(size); buffer.resize(size);
ifd.read(buffer.data(), size); ifd.read(buffer.data(), size);
memcpy(&this->memory[CONFIG_PARTITION_TABLE_OFFSET], buffer.data(), buffer.size()); memcpy(&this->memory[CONFIG_PARTITION_TABLE_OFFSET], buffer.data(), buffer.size());
} }
void SpiFlash::deinit() void SpiFlash::deinit()
{ {
if(inited) if(inited)
{ {
free(this->memory); free(this->memory);
} }
} }
size_t SpiFlash::get_chip_size() size_t SpiFlash::get_chip_size()
{ {
return this->chip_size; return this->chip_size;
} }
size_t SpiFlash::get_sector_size() size_t SpiFlash::get_sector_size()
{ {
return this->sector_size; return this->sector_size;
} }
esp_rom_spiflash_result_t SpiFlash::erase_block(uint32_t block) esp_rom_spiflash_result_t SpiFlash::erase_block(uint32_t block)
{ {
memset(&this->memory[block * this->block_size], 0xFF, this->block_size); memset(&this->memory[block * this->block_size], 0xFF, this->block_size);
return ESP_ROM_SPIFLASH_RESULT_OK; return ESP_ROM_SPIFLASH_RESULT_OK;
} }
esp_rom_spiflash_result_t SpiFlash::erase_sector(size_t sector) esp_rom_spiflash_result_t SpiFlash::erase_sector(size_t sector)
{ {
memset(&this->memory[sector * this->sector_size], 0xFF, this->sector_size); memset(&this->memory[sector * this->sector_size], 0xFF, this->sector_size);
return ESP_ROM_SPIFLASH_RESULT_OK; return ESP_ROM_SPIFLASH_RESULT_OK;
} }
esp_rom_spiflash_result_t SpiFlash::erase_page(uint32_t page) esp_rom_spiflash_result_t SpiFlash::erase_page(uint32_t page)
{ {
memset(&this->memory[page * this->page_size], 0xFF, this->page_size); memset(&this->memory[page * this->page_size], 0xFF, this->page_size);
return ESP_ROM_SPIFLASH_RESULT_OK; return ESP_ROM_SPIFLASH_RESULT_OK;
} }
esp_rom_spiflash_result_t SpiFlash::write(size_t dest_addr, const void *src, size_t size) esp_rom_spiflash_result_t SpiFlash::write(size_t dest_addr, const void *src, size_t size)
{ {
// Emulate inability to set programmed bits without erasing // Emulate inability to set programmed bits without erasing
for(uint32_t ctr = 0; ctr < size; ctr++) for(uint32_t ctr = 0; ctr < size; ctr++)
{ {
uint8_t data = ((uint8_t*)src)[ctr]; uint8_t data = ((uint8_t*)src)[ctr];
uint8_t written = this->memory[dest_addr + ctr]; uint8_t written = this->memory[dest_addr + ctr];
data &= written; data &= written;
this->memory[dest_addr + ctr] = data; this->memory[dest_addr + ctr] = data;
} }
return ESP_ROM_SPIFLASH_RESULT_OK; return ESP_ROM_SPIFLASH_RESULT_OK;
} }
esp_rom_spiflash_result_t SpiFlash::read(size_t src_addr, void *dest, size_t size) esp_rom_spiflash_result_t SpiFlash::read(size_t src_addr, void *dest, size_t size)
{ {
memcpy(dest, &this->memory[src_addr], size); memcpy(dest, &this->memory[src_addr], size);
return ESP_ROM_SPIFLASH_RESULT_OK; return ESP_ROM_SPIFLASH_RESULT_OK;
} }
uint8_t* SpiFlash::get_memory_ptr(uint32_t src_address) uint8_t* SpiFlash::get_memory_ptr(uint32_t src_address)
{ {
return &this->memory[src_address]; return &this->memory[src_address];
} }

View File

@@ -1,62 +1,62 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _SpiFlash_H_ #ifndef _SpiFlash_H_
#define _SpiFlash_H_ #define _SpiFlash_H_
#include "esp_err.h" #include "esp_err.h"
#include "rom/spi_flash.h" #include "rom/spi_flash.h"
/** /**
* @brief This class is used to emulate flash devices. * @brief This class is used to emulate flash devices.
* *
*/ */
class SpiFlash class SpiFlash
{ {
public: public:
SpiFlash(); SpiFlash();
~SpiFlash(); ~SpiFlash();
void init(size_t chip_size, size_t block_size, size_t sector_size, size_t page_size, const char* partitions_bin); void init(size_t chip_size, size_t block_size, size_t sector_size, size_t page_size, const char* partitions_bin);
esp_rom_spiflash_result_t erase_block(uint32_t block); esp_rom_spiflash_result_t erase_block(uint32_t block);
esp_rom_spiflash_result_t erase_sector(uint32_t sector); esp_rom_spiflash_result_t erase_sector(uint32_t sector);
esp_rom_spiflash_result_t erase_page(uint32_t page); esp_rom_spiflash_result_t erase_page(uint32_t page);
esp_rom_spiflash_result_t write(size_t dest_addr, const void *src, size_t size); esp_rom_spiflash_result_t write(size_t dest_addr, const void *src, size_t size);
esp_rom_spiflash_result_t read(size_t src_addr, void *dest, size_t size); esp_rom_spiflash_result_t read(size_t src_addr, void *dest, size_t size);
size_t get_chip_size(); size_t get_chip_size();
size_t get_sector_size(); size_t get_sector_size();
uint8_t* get_memory_ptr(uint32_t src_address); uint8_t* get_memory_ptr(uint32_t src_address);
private: private:
bool inited = false; bool inited = false;
size_t chip_size; size_t chip_size;
size_t block_size; size_t block_size;
size_t sector_size; size_t sector_size;
size_t page_size; size_t page_size;
uint8_t* memory; uint8_t* memory;
void* partitions; void* partitions;
uint8_t partitions_num; uint8_t partitions_num;
void deinit(); void deinit();
}; };
#endif // _SpiFlash_H_ #endif // _SpiFlash_H_

View File

@@ -1,68 +1,68 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "esp_log.h" #include "esp_log.h"
#include "Partition.h" #include "Partition.h"
static const char *TAG = "wl_partition"; static const char *TAG = "wl_partition";
Partition::Partition(const esp_partition_t *partition) Partition::Partition(const esp_partition_t *partition)
{ {
this->partition = partition; this->partition = partition;
} }
size_t Partition::chip_size() size_t Partition::chip_size()
{ {
return this->partition->size; return this->partition->size;
} }
esp_err_t Partition::erase_sector(size_t sector) esp_err_t Partition::erase_sector(size_t sector)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
result = erase_range(sector * SPI_FLASH_SEC_SIZE, SPI_FLASH_SEC_SIZE); result = erase_range(sector * SPI_FLASH_SEC_SIZE, SPI_FLASH_SEC_SIZE);
return result; return result;
} }
esp_err_t Partition::erase_range(size_t start_address, size_t size) esp_err_t Partition::erase_range(size_t start_address, size_t size)
{ {
esp_err_t result = esp_partition_erase_range(this->partition, start_address, size); esp_err_t result = esp_partition_erase_range(this->partition, start_address, size);
if (result == ESP_OK) { if (result == ESP_OK) {
ESP_LOGV(TAG, "erase_range - start_address=0x%08x, size=0x%08x, result=0x%08x", start_address, size, result); ESP_LOGV(TAG, "erase_range - start_address=0x%08x, size=0x%08x, result=0x%08x", start_address, size, result);
} else { } else {
ESP_LOGE(TAG, "erase_range - start_address=0x%08x, size=0x%08x, result=0x%08x", start_address, size, result); ESP_LOGE(TAG, "erase_range - start_address=0x%08x, size=0x%08x, result=0x%08x", start_address, size, result);
} }
return result; return result;
} }
esp_err_t Partition::write(size_t dest_addr, const void *src, size_t size) esp_err_t Partition::write(size_t dest_addr, const void *src, size_t size)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
result = esp_partition_write(this->partition, dest_addr, src, size); result = esp_partition_write(this->partition, dest_addr, src, size);
return result; return result;
} }
esp_err_t Partition::read(size_t src_addr, void *dest, size_t size) esp_err_t Partition::read(size_t src_addr, void *dest, size_t size)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
result = esp_partition_read(this->partition, src_addr, dest, size); result = esp_partition_read(this->partition, src_addr, dest, size);
return result; return result;
} }
size_t Partition::sector_size() size_t Partition::sector_size()
{ {
return SPI_FLASH_SEC_SIZE; return SPI_FLASH_SEC_SIZE;
} }
Partition::~Partition() Partition::~Partition()
{ {
} }

View File

@@ -1,81 +1,81 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "esp_log.h" #include "esp_log.h"
#include "SPI_Flash.h" #include "SPI_Flash.h"
#include "esp_spi_flash.h" #include "esp_spi_flash.h"
static const char *TAG = "spi_flash"; static const char *TAG = "spi_flash";
SPI_Flash::SPI_Flash() SPI_Flash::SPI_Flash()
{ {
} }
size_t SPI_Flash::chip_size() size_t SPI_Flash::chip_size()
{ {
return spi_flash_get_chip_size(); return spi_flash_get_chip_size();
} }
esp_err_t SPI_Flash::erase_sector(size_t sector) esp_err_t SPI_Flash::erase_sector(size_t sector)
{ {
esp_err_t result = spi_flash_erase_sector(sector); esp_err_t result = spi_flash_erase_sector(sector);
if (result == ESP_OK) { if (result == ESP_OK) {
ESP_LOGV(TAG, "erase_sector - sector=0x%08x, result=0x%08x", sector, result); ESP_LOGV(TAG, "erase_sector - sector=0x%08x, result=0x%08x", sector, result);
} else { } else {
ESP_LOGE(TAG, "erase_sector - sector=0x%08x, result=0x%08x", sector, result); ESP_LOGE(TAG, "erase_sector - sector=0x%08x, result=0x%08x", sector, result);
} }
return result; return result;
} }
esp_err_t SPI_Flash::erase_range(size_t start_address, size_t size) esp_err_t SPI_Flash::erase_range(size_t start_address, size_t size)
{ {
size = (size + SPI_FLASH_SEC_SIZE - 1) / SPI_FLASH_SEC_SIZE; size = (size + SPI_FLASH_SEC_SIZE - 1) / SPI_FLASH_SEC_SIZE;
size = size * SPI_FLASH_SEC_SIZE; size = size * SPI_FLASH_SEC_SIZE;
esp_err_t result = spi_flash_erase_range(start_address, size); esp_err_t result = spi_flash_erase_range(start_address, size);
if (result == ESP_OK) { if (result == ESP_OK) {
ESP_LOGV(TAG, "erase_range - start_address=0x%08x, size=0x%08x, result=0x%08x", start_address, size, result); ESP_LOGV(TAG, "erase_range - start_address=0x%08x, size=0x%08x, result=0x%08x", start_address, size, result);
} else { } else {
ESP_LOGE(TAG, "erase_range - start_address=0x%08x, size=0x%08x, result=0x%08x", start_address, size, result); ESP_LOGE(TAG, "erase_range - start_address=0x%08x, size=0x%08x, result=0x%08x", start_address, size, result);
} }
return result; return result;
} }
esp_err_t SPI_Flash::write(size_t dest_addr, const void *src, size_t size) esp_err_t SPI_Flash::write(size_t dest_addr, const void *src, size_t size)
{ {
esp_err_t result = spi_flash_write(dest_addr, src, size); esp_err_t result = spi_flash_write(dest_addr, src, size);
if (result == ESP_OK) { if (result == ESP_OK) {
ESP_LOGV(TAG, "write - dest_addr=0x%08x, size=0x%08x, result=0x%08x", dest_addr, size, result); ESP_LOGV(TAG, "write - dest_addr=0x%08x, size=0x%08x, result=0x%08x", dest_addr, size, result);
} else { } else {
ESP_LOGE(TAG, "write - dest_addr=0x%08x, size=0x%08x, result=0x%08x", dest_addr, size, result); ESP_LOGE(TAG, "write - dest_addr=0x%08x, size=0x%08x, result=0x%08x", dest_addr, size, result);
} }
return result; return result;
} }
esp_err_t SPI_Flash::read(size_t src_addr, void *dest, size_t size) esp_err_t SPI_Flash::read(size_t src_addr, void *dest, size_t size)
{ {
esp_err_t result = spi_flash_read(src_addr, dest, size); esp_err_t result = spi_flash_read(src_addr, dest, size);
if (result == ESP_OK) { if (result == ESP_OK) {
ESP_LOGV(TAG, "read - src_addr=0x%08x, size=0x%08x, result=0x%08x", src_addr, size, result); ESP_LOGV(TAG, "read - src_addr=0x%08x, size=0x%08x, result=0x%08x", src_addr, size, result);
} else { } else {
ESP_LOGE(TAG, "read - src_addr=0x%08x, size=0x%08x, result=0x%08x", src_addr, size, result); ESP_LOGE(TAG, "read - src_addr=0x%08x, size=0x%08x, result=0x%08x", src_addr, size, result);
} }
return result; return result;
} }
size_t SPI_Flash::sector_size() size_t SPI_Flash::sector_size()
{ {
return SPI_FLASH_SEC_SIZE; return SPI_FLASH_SEC_SIZE;
} }
SPI_Flash::~SPI_Flash() SPI_Flash::~SPI_Flash()
{ {
} }

View File

@@ -1,168 +1,168 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "WL_Ext_Perf.h" #include "WL_Ext_Perf.h"
#include <stdlib.h> #include <stdlib.h>
#include "esp_log.h" #include "esp_log.h"
static const char *TAG = "wl_ext_perf"; static const char *TAG = "wl_ext_perf";
#define WL_EXT_RESULT_CHECK(result) \ #define WL_EXT_RESULT_CHECK(result) \
if (result != ESP_OK) { \ if (result != ESP_OK) { \
ESP_LOGE(TAG,"%s(%d): result = 0x%08x", __FUNCTION__, __LINE__, result); \ ESP_LOGE(TAG,"%s(%d): result = 0x%08x", __FUNCTION__, __LINE__, result); \
return (result); \ return (result); \
} }
WL_Ext_Perf::WL_Ext_Perf(): WL_Flash() WL_Ext_Perf::WL_Ext_Perf(): WL_Flash()
{ {
this->sector_buffer = NULL; this->sector_buffer = NULL;
} }
WL_Ext_Perf::~WL_Ext_Perf() WL_Ext_Perf::~WL_Ext_Perf()
{ {
free(this->sector_buffer); free(this->sector_buffer);
} }
esp_err_t WL_Ext_Perf::config(WL_Config_s *cfg, Flash_Access *flash_drv) esp_err_t WL_Ext_Perf::config(WL_Config_s *cfg, Flash_Access *flash_drv)
{ {
wl_ext_cfg_t *config = (wl_ext_cfg_t *)cfg; wl_ext_cfg_t *config = (wl_ext_cfg_t *)cfg;
this->fat_sector_size = config->fat_sector_size; this->fat_sector_size = config->fat_sector_size;
this->flash_sector_size = cfg->sector_size; this->flash_sector_size = cfg->sector_size;
this->sector_buffer = (uint32_t *)malloc(cfg->sector_size); this->sector_buffer = (uint32_t *)malloc(cfg->sector_size);
if (this->sector_buffer == NULL) { if (this->sector_buffer == NULL) {
return ESP_ERR_NO_MEM; return ESP_ERR_NO_MEM;
} }
this->size_factor = this->flash_sector_size / this->fat_sector_size; this->size_factor = this->flash_sector_size / this->fat_sector_size;
if (this->size_factor < 1) { if (this->size_factor < 1) {
return ESP_ERR_INVALID_ARG; return ESP_ERR_INVALID_ARG;
} }
return WL_Flash::config(cfg, flash_drv); return WL_Flash::config(cfg, flash_drv);
} }
esp_err_t WL_Ext_Perf::init() esp_err_t WL_Ext_Perf::init()
{ {
return WL_Flash::init(); return WL_Flash::init();
} }
size_t WL_Ext_Perf::chip_size() size_t WL_Ext_Perf::chip_size()
{ {
return WL_Flash::chip_size(); return WL_Flash::chip_size();
} }
size_t WL_Ext_Perf::sector_size() size_t WL_Ext_Perf::sector_size()
{ {
return this->fat_sector_size; return this->fat_sector_size;
} }
esp_err_t WL_Ext_Perf::erase_sector(size_t sector) esp_err_t WL_Ext_Perf::erase_sector(size_t sector)
{ {
return this->erase_sector_fit(sector, 1); return this->erase_sector_fit(sector, 1);
} }
esp_err_t WL_Ext_Perf::erase_sector_fit(uint32_t start_sector, uint32_t count) esp_err_t WL_Ext_Perf::erase_sector_fit(uint32_t start_sector, uint32_t count)
{ {
ESP_LOGV(TAG, "%s begin, start_sector = 0x%08x, count = %i", __func__, start_sector, count); ESP_LOGV(TAG, "%s begin, start_sector = 0x%08x, count = %i", __func__, start_sector, count);
// This method works with one flash device sector and able to erase "count" of fatfs sectors from this sector // This method works with one flash device sector and able to erase "count" of fatfs sectors from this sector
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
uint32_t pre_check_start = start_sector % this->size_factor; uint32_t pre_check_start = start_sector % this->size_factor;
for (int i = 0; i < this->size_factor; i++) { for (int i = 0; i < this->size_factor; i++) {
if ((i < pre_check_start) || (i >= count + pre_check_start)) { if ((i < pre_check_start) || (i >= count + pre_check_start)) {
result = this->read(start_sector / this->size_factor * this->flash_sector_size + i * this->fat_sector_size, &this->sector_buffer[i * this->fat_sector_size / sizeof(uint32_t)], this->fat_sector_size); result = this->read(start_sector / this->size_factor * this->flash_sector_size + i * this->fat_sector_size, &this->sector_buffer[i * this->fat_sector_size / sizeof(uint32_t)], this->fat_sector_size);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
} }
} }
result = WL_Flash::erase_sector(start_sector / this->size_factor); // erase comlete flash sector result = WL_Flash::erase_sector(start_sector / this->size_factor); // erase comlete flash sector
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
// And write back only data that should not be erased... // And write back only data that should not be erased...
for (int i = 0; i < this->size_factor; i++) { for (int i = 0; i < this->size_factor; i++) {
if ((i < pre_check_start) || (i >= count + pre_check_start)) { if ((i < pre_check_start) || (i >= count + pre_check_start)) {
result = this->write(start_sector / this->size_factor * this->flash_sector_size + i * this->fat_sector_size, &this->sector_buffer[i * this->fat_sector_size / sizeof(uint32_t)], this->fat_sector_size); result = this->write(start_sector / this->size_factor * this->flash_sector_size + i * this->fat_sector_size, &this->sector_buffer[i * this->fat_sector_size / sizeof(uint32_t)], this->fat_sector_size);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
} }
} }
return ESP_OK; return ESP_OK;
} }
esp_err_t WL_Ext_Perf::erase_range(size_t start_address, size_t size) esp_err_t WL_Ext_Perf::erase_range(size_t start_address, size_t size)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
if ((start_address % this->fat_sector_size) != 0) { if ((start_address % this->fat_sector_size) != 0) {
result = ESP_ERR_INVALID_ARG; result = ESP_ERR_INVALID_ARG;
} }
if (((size % this->fat_sector_size) != 0) || (size == 0)) { if (((size % this->fat_sector_size) != 0) || (size == 0)) {
result = ESP_ERR_INVALID_ARG; result = ESP_ERR_INVALID_ARG;
} }
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
// The range to erase could be allocated in any possible way // The range to erase could be allocated in any possible way
// --------------------------------------------------------- // ---------------------------------------------------------
// | | | | | // | | | | |
// |0|0|x|x|x|x|x|x|x|x|x|x|x|x|0|0| // |0|0|x|x|x|x|x|x|x|x|x|x|x|x|0|0|
// | pre | rest | rest | post | <- check ranges // | pre | rest | rest | post | <- check ranges
// //
// Pre check - the data that is not fit to the full sector at the begining of the erased block // Pre check - the data that is not fit to the full sector at the begining of the erased block
// Post check - the data that are not fit to the full sector at the end of the erased block // Post check - the data that are not fit to the full sector at the end of the erased block
// rest - data that are fit to the flash device sector at the middle of the erased block // rest - data that are fit to the flash device sector at the middle of the erased block
// //
// In case of pre and post check situations the data of the non erased area have to be readed first and then // In case of pre and post check situations the data of the non erased area have to be readed first and then
// stored back. // stored back.
// For the rest area this operation not needed because complete flash device sector will be erased. // For the rest area this operation not needed because complete flash device sector will be erased.
ESP_LOGV(TAG, "%s begin, addr = 0x%08x, size = %i", __func__, start_address, size); ESP_LOGV(TAG, "%s begin, addr = 0x%08x, size = %i", __func__, start_address, size);
// Calculate pre check values // Calculate pre check values
uint32_t pre_check_start = (start_address / this->fat_sector_size) % this->size_factor; uint32_t pre_check_start = (start_address / this->fat_sector_size) % this->size_factor;
uint32_t sectors_count = size / this->fat_sector_size; uint32_t sectors_count = size / this->fat_sector_size;
uint32_t pre_check_count = (this->size_factor - pre_check_start); uint32_t pre_check_count = (this->size_factor - pre_check_start);
if (pre_check_count > sectors_count) { if (pre_check_count > sectors_count) {
pre_check_count = sectors_count; pre_check_count = sectors_count;
} }
// Calculate post ckeck // Calculate post ckeck
uint32_t post_check_count = (sectors_count - pre_check_count) % this->size_factor; uint32_t post_check_count = (sectors_count - pre_check_count) % this->size_factor;
uint32_t post_check_start = ((start_address + size - post_check_count * this->fat_sector_size) / this->fat_sector_size); uint32_t post_check_start = ((start_address + size - post_check_count * this->fat_sector_size) / this->fat_sector_size);
// Calculate rest // Calculate rest
uint32_t rest_check_count = sectors_count - pre_check_count - post_check_count; uint32_t rest_check_count = sectors_count - pre_check_count - post_check_count;
if ((pre_check_count == this->size_factor) && (0 == pre_check_start)) { if ((pre_check_count == this->size_factor) && (0 == pre_check_start)) {
rest_check_count+=this->size_factor; rest_check_count+=this->size_factor;
pre_check_count = 0; pre_check_count = 0;
} }
uint32_t rest_check_start = start_address + pre_check_count * this->fat_sector_size; uint32_t rest_check_start = start_address + pre_check_count * this->fat_sector_size;
// Here we will clear pre_check_count amount of sectors // Here we will clear pre_check_count amount of sectors
if (pre_check_count != 0) { if (pre_check_count != 0) {
result = this->erase_sector_fit(start_address / this->fat_sector_size, pre_check_count); result = this->erase_sector_fit(start_address / this->fat_sector_size, pre_check_count);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
} }
ESP_LOGV(TAG, "%s rest_check_start = %i, pre_check_count=%i, rest_check_count=%i, post_check_count=%i\n", __func__, rest_check_start, pre_check_count, rest_check_count, post_check_count); ESP_LOGV(TAG, "%s rest_check_start = %i, pre_check_count=%i, rest_check_count=%i, post_check_count=%i\n", __func__, rest_check_start, pre_check_count, rest_check_count, post_check_count);
if (rest_check_count > 0) { if (rest_check_count > 0) {
rest_check_count = rest_check_count / this->size_factor; rest_check_count = rest_check_count / this->size_factor;
size_t start_sector = rest_check_start / this->flash_sector_size; size_t start_sector = rest_check_start / this->flash_sector_size;
for (size_t i = 0; i < rest_check_count; i++) { for (size_t i = 0; i < rest_check_count; i++) {
result = WL_Flash::erase_sector(start_sector + i); result = WL_Flash::erase_sector(start_sector + i);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
} }
} }
if (post_check_count != 0) { if (post_check_count != 0) {
result = this->erase_sector_fit(post_check_start, post_check_count); result = this->erase_sector_fit(post_check_start, post_check_count);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
} }
return ESP_OK; return ESP_OK;
} }

View File

@@ -1,161 +1,161 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "WL_Ext_Safe.h" #include "WL_Ext_Safe.h"
#include <stdlib.h> #include <stdlib.h>
#include "esp_log.h" #include "esp_log.h"
static const char *TAG = "wl_ext_safe"; static const char *TAG = "wl_ext_safe";
#define WL_EXT_RESULT_CHECK(result) \ #define WL_EXT_RESULT_CHECK(result) \
if (result != ESP_OK) { \ if (result != ESP_OK) { \
ESP_LOGE(TAG,"%s(%d): result = 0x%08x", __FUNCTION__, __LINE__, result); \ ESP_LOGE(TAG,"%s(%d): result = 0x%08x", __FUNCTION__, __LINE__, result); \
return (result); \ return (result); \
} }
#ifndef FLASH_ERASE_VALUE #ifndef FLASH_ERASE_VALUE
#define FLASH_ERASE_VALUE 0xffffffff #define FLASH_ERASE_VALUE 0xffffffff
#endif // FLASH_ERASE_VALUE #endif // FLASH_ERASE_VALUE
#ifndef WL_EXT_SAFE_OK #ifndef WL_EXT_SAFE_OK
#define WL_EXT_SAFE_OK 0x12345678 #define WL_EXT_SAFE_OK 0x12345678
#endif // WL_EXT_SAFE_OK #endif // WL_EXT_SAFE_OK
#ifndef WL_EXT_SAFE_OFFSET #ifndef WL_EXT_SAFE_OFFSET
#define WL_EXT_SAFE_OFFSET 16 #define WL_EXT_SAFE_OFFSET 16
#endif // WL_EXT_SAFE_OFFSET #endif // WL_EXT_SAFE_OFFSET
struct WL_Ext_Safe_State { struct WL_Ext_Safe_State {
public: public:
uint32_t erase_begin; uint32_t erase_begin;
uint32_t local_addr_base; uint32_t local_addr_base;
uint32_t local_addr_shift; uint32_t local_addr_shift;
uint32_t count; uint32_t count;
}; };
WL_Ext_Safe::WL_Ext_Safe(): WL_Ext_Perf() WL_Ext_Safe::WL_Ext_Safe(): WL_Ext_Perf()
{ {
} }
WL_Ext_Safe::~WL_Ext_Safe() WL_Ext_Safe::~WL_Ext_Safe()
{ {
} }
esp_err_t WL_Ext_Safe::config(WL_Config_s *cfg, Flash_Access *flash_drv) esp_err_t WL_Ext_Safe::config(WL_Config_s *cfg, Flash_Access *flash_drv)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
result = WL_Ext_Perf::config(cfg, flash_drv); result = WL_Ext_Perf::config(cfg, flash_drv);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
this->state_addr = WL_Flash::chip_size() - 2 * WL_Flash::sector_size(); this->state_addr = WL_Flash::chip_size() - 2 * WL_Flash::sector_size();
this->dump_addr = WL_Flash::chip_size() - 1 * WL_Flash::sector_size(); this->dump_addr = WL_Flash::chip_size() - 1 * WL_Flash::sector_size();
return ESP_OK; return ESP_OK;
} }
esp_err_t WL_Ext_Safe::init() esp_err_t WL_Ext_Safe::init()
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
ESP_LOGV(TAG, "%s", __func__); ESP_LOGV(TAG, "%s", __func__);
result = WL_Ext_Perf::init(); result = WL_Ext_Perf::init();
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
result = this->recover(); result = this->recover();
return result; return result;
} }
size_t WL_Ext_Safe::chip_size() size_t WL_Ext_Safe::chip_size()
{ {
ESP_LOGV(TAG, "%s size = %i", __func__, WL_Flash::chip_size() - 2 * this->flash_sector_size); ESP_LOGV(TAG, "%s size = %i", __func__, WL_Flash::chip_size() - 2 * this->flash_sector_size);
return WL_Flash::chip_size() - 2 * this->flash_sector_size; return WL_Flash::chip_size() - 2 * this->flash_sector_size;
} }
esp_err_t WL_Ext_Safe::recover() esp_err_t WL_Ext_Safe::recover()
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
WL_Ext_Safe_State state; WL_Ext_Safe_State state;
result = WL_Flash::read(this->state_addr, &state, sizeof(WL_Ext_Safe_State)); result = WL_Flash::read(this->state_addr, &state, sizeof(WL_Ext_Safe_State));
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
ESP_LOGV(TAG, "%s recover, start_addr = 0x%08x, local_addr_base = 0x%08x, local_addr_shift = %i, count=%i", __func__, state.erase_begin, state.local_addr_base, state.local_addr_shift, state.count); ESP_LOGV(TAG, "%s recover, start_addr = 0x%08x, local_addr_base = 0x%08x, local_addr_shift = %i, count=%i", __func__, state.erase_begin, state.local_addr_base, state.local_addr_shift, state.count);
// check if we have transaction // check if we have transaction
if (state.erase_begin == WL_EXT_SAFE_OK) { if (state.erase_begin == WL_EXT_SAFE_OK) {
result = this->read(this->dump_addr, this->sector_buffer, this->flash_sector_size); result = this->read(this->dump_addr, this->sector_buffer, this->flash_sector_size);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
result = WL_Flash::erase_sector(state.local_addr_base); // erase comlete flash sector result = WL_Flash::erase_sector(state.local_addr_base); // erase comlete flash sector
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
// And write back... // And write back...
for (int i = 0; i < this->size_factor; i++) { for (int i = 0; i < this->size_factor; i++) {
if ((i < state.local_addr_shift) || (i >= state.count + state.local_addr_shift)) { if ((i < state.local_addr_shift) || (i >= state.count + state.local_addr_shift)) {
result = this->write(state.local_addr_base * this->flash_sector_size + i * this->fat_sector_size, &this->sector_buffer[i * this->fat_sector_size / sizeof(uint32_t)], this->fat_sector_size); result = this->write(state.local_addr_base * this->flash_sector_size + i * this->fat_sector_size, &this->sector_buffer[i * this->fat_sector_size / sizeof(uint32_t)], this->fat_sector_size);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
} }
} }
// clear transaction // clear transaction
result = WL_Flash::erase_range(this->state_addr, this->flash_sector_size); result = WL_Flash::erase_range(this->state_addr, this->flash_sector_size);
} }
return result; return result;
} }
esp_err_t WL_Ext_Safe::erase_sector_fit(uint32_t start_sector, uint32_t count) esp_err_t WL_Ext_Safe::erase_sector_fit(uint32_t start_sector, uint32_t count)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
uint32_t local_addr_base = start_sector / this->size_factor; uint32_t local_addr_base = start_sector / this->size_factor;
uint32_t pre_check_start = start_sector % this->size_factor; uint32_t pre_check_start = start_sector % this->size_factor;
ESP_LOGV(TAG, "%s start_sector=0x%08x, count = %i", __func__, start_sector, count); ESP_LOGV(TAG, "%s start_sector=0x%08x, count = %i", __func__, start_sector, count);
for (int i = 0; i < this->size_factor; i++) { for (int i = 0; i < this->size_factor; i++) {
if ((i < pre_check_start) || (i >= count + pre_check_start)) { if ((i < pre_check_start) || (i >= count + pre_check_start)) {
result = this->read(start_sector / this->size_factor * this->flash_sector_size + i * this->fat_sector_size, &this->sector_buffer[i * this->fat_sector_size / sizeof(uint32_t)], this->fat_sector_size); result = this->read(start_sector / this->size_factor * this->flash_sector_size + i * this->fat_sector_size, &this->sector_buffer[i * this->fat_sector_size / sizeof(uint32_t)], this->fat_sector_size);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
} }
} }
result = WL_Flash::erase_sector(this->dump_addr / this->flash_sector_size); result = WL_Flash::erase_sector(this->dump_addr / this->flash_sector_size);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
result = WL_Flash::write(this->dump_addr, this->sector_buffer, this->flash_sector_size); result = WL_Flash::write(this->dump_addr, this->sector_buffer, this->flash_sector_size);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
WL_Ext_Safe_State state; WL_Ext_Safe_State state;
state.erase_begin = WL_EXT_SAFE_OK; state.erase_begin = WL_EXT_SAFE_OK;
state.local_addr_base = local_addr_base; state.local_addr_base = local_addr_base;
state.local_addr_shift = pre_check_start; state.local_addr_shift = pre_check_start;
state.count = count; state.count = count;
result = WL_Flash::erase_sector(this->state_addr / this->flash_sector_size); result = WL_Flash::erase_sector(this->state_addr / this->flash_sector_size);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
result = WL_Flash::write(this->state_addr + 0, &state, sizeof(WL_Ext_Safe_State)); result = WL_Flash::write(this->state_addr + 0, &state, sizeof(WL_Ext_Safe_State));
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
// Erase // Erase
result = WL_Flash::erase_sector(local_addr_base); // erase comlete flash sector result = WL_Flash::erase_sector(local_addr_base); // erase comlete flash sector
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
// And write back... // And write back...
for (int i = 0; i < this->size_factor; i++) { for (int i = 0; i < this->size_factor; i++) {
if ((i < pre_check_start) || (i >= count + pre_check_start)) { if ((i < pre_check_start) || (i >= count + pre_check_start)) {
result = this->write(local_addr_base * this->flash_sector_size + i * this->fat_sector_size, &this->sector_buffer[i * this->fat_sector_size / sizeof(uint32_t)], this->fat_sector_size); result = this->write(local_addr_base * this->flash_sector_size + i * this->fat_sector_size, &this->sector_buffer[i * this->fat_sector_size / sizeof(uint32_t)], this->fat_sector_size);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
} }
} }
result = WL_Flash::erase_sector(this->state_addr / this->flash_sector_size); result = WL_Flash::erase_sector(this->state_addr / this->flash_sector_size);
WL_EXT_RESULT_CHECK(result); WL_EXT_RESULT_CHECK(result);
return ESP_OK; return ESP_OK;
} }

View File

@@ -1,478 +1,478 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include <stdio.h> #include <stdio.h>
#include "esp_log.h" #include "esp_log.h"
#include "WL_Flash.h" #include "WL_Flash.h"
#include <stdlib.h> #include <stdlib.h>
#include "crc32.h" #include "crc32.h"
#include <string.h> #include <string.h>
static const char *TAG = "wl_flash"; static const char *TAG = "wl_flash";
#ifndef WL_CFG_CRC_CONST #ifndef WL_CFG_CRC_CONST
#define WL_CFG_CRC_CONST UINT32_MAX #define WL_CFG_CRC_CONST UINT32_MAX
#endif // WL_CFG_CRC_CONST #endif // WL_CFG_CRC_CONST
#define WL_RESULT_CHECK(result) \ #define WL_RESULT_CHECK(result) \
if (result != ESP_OK) { \ if (result != ESP_OK) { \
ESP_LOGE(TAG,"%s(%d): result = 0x%08x", __FUNCTION__, __LINE__, result); \ ESP_LOGE(TAG,"%s(%d): result = 0x%08x", __FUNCTION__, __LINE__, result); \
return (result); \ return (result); \
} }
#ifndef _MSC_VER // MSVS has different format for this define #ifndef _MSC_VER // MSVS has different format for this define
static_assert(sizeof(wl_state_t) % 32 == 0, "wl_state_t structure size must be multiple of flash encryption unit size"); static_assert(sizeof(wl_state_t) % 32 == 0, "wl_state_t structure size must be multiple of flash encryption unit size");
#endif // _MSC_VER #endif // _MSC_VER
WL_Flash::WL_Flash() WL_Flash::WL_Flash()
{ {
} }
WL_Flash::~WL_Flash() WL_Flash::~WL_Flash()
{ {
free(this->temp_buff); free(this->temp_buff);
} }
esp_err_t WL_Flash::config(wl_config_t *cfg, Flash_Access *flash_drv) esp_err_t WL_Flash::config(wl_config_t *cfg, Flash_Access *flash_drv)
{ {
ESP_LOGV(TAG, "%s start_addr=0x%08x, full_mem_size=0x%08x, page_size=0x%08x, sector_size=0x%08x, updaterate=0x%08x, wr_size=0x%08x, version=0x%08x, temp_buff_size=0x%08x", __func__, ESP_LOGV(TAG, "%s start_addr=0x%08x, full_mem_size=0x%08x, page_size=0x%08x, sector_size=0x%08x, updaterate=0x%08x, wr_size=0x%08x, version=0x%08x, temp_buff_size=0x%08x", __func__,
(uint32_t) cfg->start_addr, (uint32_t) cfg->start_addr,
cfg->full_mem_size, cfg->full_mem_size,
cfg->page_size, cfg->page_size,
cfg->sector_size, cfg->sector_size,
cfg->updaterate, cfg->updaterate,
cfg->wr_size, cfg->wr_size,
cfg->version, cfg->version,
(uint32_t) cfg->temp_buff_size); (uint32_t) cfg->temp_buff_size);
cfg->crc = crc32::crc32_le(WL_CFG_CRC_CONST, (const unsigned char *)cfg, sizeof(wl_config_t) - sizeof(cfg->crc)); cfg->crc = crc32::crc32_le(WL_CFG_CRC_CONST, (const unsigned char *)cfg, sizeof(wl_config_t) - sizeof(cfg->crc));
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
memcpy(&this->cfg, cfg, sizeof(wl_config_t)); memcpy(&this->cfg, cfg, sizeof(wl_config_t));
this->configured = false; this->configured = false;
if (cfg == NULL) { if (cfg == NULL) {
result = ESP_ERR_INVALID_ARG; result = ESP_ERR_INVALID_ARG;
} }
this->flash_drv = flash_drv; this->flash_drv = flash_drv;
if (flash_drv == NULL) { if (flash_drv == NULL) {
result = ESP_ERR_INVALID_ARG; result = ESP_ERR_INVALID_ARG;
} }
if ((this->cfg.sector_size % this->cfg.temp_buff_size) != 0) { if ((this->cfg.sector_size % this->cfg.temp_buff_size) != 0) {
result = ESP_ERR_INVALID_ARG; result = ESP_ERR_INVALID_ARG;
} }
if (this->cfg.page_size < this->cfg.sector_size) { if (this->cfg.page_size < this->cfg.sector_size) {
result = ESP_ERR_INVALID_ARG; result = ESP_ERR_INVALID_ARG;
} }
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
this->temp_buff = (uint8_t *)malloc(this->cfg.temp_buff_size); this->temp_buff = (uint8_t *)malloc(this->cfg.temp_buff_size);
this->state_size = this->cfg.sector_size; this->state_size = this->cfg.sector_size;
if (this->state_size < (sizeof(wl_state_t) + (this->cfg.full_mem_size / this->cfg.sector_size)*this->cfg.wr_size)) { if (this->state_size < (sizeof(wl_state_t) + (this->cfg.full_mem_size / this->cfg.sector_size)*this->cfg.wr_size)) {
this->state_size = ((sizeof(wl_state_t) + (this->cfg.full_mem_size / this->cfg.sector_size) * this->cfg.wr_size) + this->cfg.sector_size - 1) / this->cfg.sector_size; this->state_size = ((sizeof(wl_state_t) + (this->cfg.full_mem_size / this->cfg.sector_size) * this->cfg.wr_size) + this->cfg.sector_size - 1) / this->cfg.sector_size;
this->state_size = this->state_size * this->cfg.sector_size; this->state_size = this->state_size * this->cfg.sector_size;
} }
this->cfg_size = (sizeof(wl_config_t) + this->cfg.sector_size - 1) / this->cfg.sector_size; this->cfg_size = (sizeof(wl_config_t) + this->cfg.sector_size - 1) / this->cfg.sector_size;
this->cfg_size = cfg_size * this->cfg.sector_size; this->cfg_size = cfg_size * this->cfg.sector_size;
this->addr_cfg = this->cfg.start_addr + this->cfg.full_mem_size - this->cfg_size; this->addr_cfg = this->cfg.start_addr + this->cfg.full_mem_size - this->cfg_size;
this->addr_state1 = this->cfg.start_addr + this->cfg.full_mem_size - this->state_size * 2 - this->cfg_size; // allocate data at the end of memory this->addr_state1 = this->cfg.start_addr + this->cfg.full_mem_size - this->state_size * 2 - this->cfg_size; // allocate data at the end of memory
this->addr_state2 = this->cfg.start_addr + this->cfg.full_mem_size - this->state_size * 1 - this->cfg_size; // allocate data at the end of memory this->addr_state2 = this->cfg.start_addr + this->cfg.full_mem_size - this->state_size * 1 - this->cfg_size; // allocate data at the end of memory
this->flash_size = ((this->cfg.full_mem_size - this->state_size * 2 - this->cfg_size) / this->cfg.page_size - 1) * this->cfg.page_size; // -1 remove dummy block this->flash_size = ((this->cfg.full_mem_size - this->state_size * 2 - this->cfg_size) / this->cfg.page_size - 1) * this->cfg.page_size; // -1 remove dummy block
ESP_LOGV(TAG, "%s - this->addr_state1=0x%08x", __func__, (uint32_t) this->addr_state1); ESP_LOGV(TAG, "%s - this->addr_state1=0x%08x", __func__, (uint32_t) this->addr_state1);
ESP_LOGV(TAG, "%s - this->addr_state2=0x%08x", __func__, (uint32_t) this->addr_state2); ESP_LOGV(TAG, "%s - this->addr_state2=0x%08x", __func__, (uint32_t) this->addr_state2);
this->configured = true; this->configured = true;
return ESP_OK; return ESP_OK;
} }
esp_err_t WL_Flash::init() esp_err_t WL_Flash::init()
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
if (this->configured == false) { if (this->configured == false) {
ESP_LOGW(TAG, "WL_Flash: not configured, call config() first"); ESP_LOGW(TAG, "WL_Flash: not configured, call config() first");
return ESP_ERR_INVALID_STATE; return ESP_ERR_INVALID_STATE;
} }
// If flow will be interrupted by error, then this flag will be false // If flow will be interrupted by error, then this flag will be false
this->initialized = false; this->initialized = false;
// Init states if it is first time... // Init states if it is first time...
this->flash_drv->read(this->addr_state1, &this->state, sizeof(wl_state_t)); this->flash_drv->read(this->addr_state1, &this->state, sizeof(wl_state_t));
wl_state_t sa_copy; wl_state_t sa_copy;
wl_state_t *state_copy = &sa_copy; wl_state_t *state_copy = &sa_copy;
result = this->flash_drv->read(this->addr_state2, state_copy, sizeof(wl_state_t)); result = this->flash_drv->read(this->addr_state2, state_copy, sizeof(wl_state_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
int check_size = sizeof(wl_state_t) - sizeof(uint32_t); int check_size = sizeof(wl_state_t) - sizeof(uint32_t);
// Chech CRC and recover state // Chech CRC and recover state
uint32_t crc1 = crc32::crc32_le(WL_CFG_CRC_CONST, (uint8_t *)&this->state, check_size); uint32_t crc1 = crc32::crc32_le(WL_CFG_CRC_CONST, (uint8_t *)&this->state, check_size);
uint32_t crc2 = crc32::crc32_le(WL_CFG_CRC_CONST, (uint8_t *)state_copy, check_size); uint32_t crc2 = crc32::crc32_le(WL_CFG_CRC_CONST, (uint8_t *)state_copy, check_size);
ESP_LOGD(TAG, "%s - config ID=%i, stored ID=%i, access_count=%i, block_size=%i, max_count=%i, pos=%i, move_count=%i", ESP_LOGD(TAG, "%s - config ID=%i, stored ID=%i, access_count=%i, block_size=%i, max_count=%i, pos=%i, move_count=%i",
__func__, __func__,
this->cfg.version, this->cfg.version,
this->state.version, this->state.version,
this->state.access_count, this->state.access_count,
this->state.block_size, this->state.block_size,
this->state.max_count, this->state.max_count,
this->state.pos, this->state.pos,
this->state.move_count); this->state.move_count);
ESP_LOGD(TAG, "%s starts: crc1=%i, crc2 = %i, this->state.crc=%i, state_copy->crc=%i", __func__, crc1, crc2, this->state.crc, state_copy->crc); ESP_LOGD(TAG, "%s starts: crc1=%i, crc2 = %i, this->state.crc=%i, state_copy->crc=%i", __func__, crc1, crc2, this->state.crc, state_copy->crc);
if ((crc1 == this->state.crc) && (crc2 == state_copy->crc)) { if ((crc1 == this->state.crc) && (crc2 == state_copy->crc)) {
// The state is OK. Check the ID // The state is OK. Check the ID
if (this->state.version != this->cfg.version) { if (this->state.version != this->cfg.version) {
result = this->initSections(); result = this->initSections();
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->recoverPos(); result = this->recoverPos();
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} else { } else {
if (crc1 != crc2) {// we did not update second structure. if (crc1 != crc2) {// we did not update second structure.
result = this->flash_drv->erase_range(this->addr_state2, this->state_size); result = this->flash_drv->erase_range(this->addr_state2, this->state_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t)); result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
for (size_t i = 0; i < ((this->cfg.full_mem_size / this->cfg.sector_size)*this->cfg.wr_size); i++) { for (size_t i = 0; i < ((this->cfg.full_mem_size / this->cfg.sector_size)*this->cfg.wr_size); i++) {
uint8_t pos_bits = 0; uint8_t pos_bits = 0;
result = this->flash_drv->read(this->addr_state1 + sizeof(wl_state_t) + i, &pos_bits, 1); result = this->flash_drv->read(this->addr_state1 + sizeof(wl_state_t) + i, &pos_bits, 1);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
if (pos_bits != 0xff) { if (pos_bits != 0xff) {
result = this->flash_drv->write(this->addr_state2 + sizeof(wl_state_t) + i, &pos_bits, 1); result = this->flash_drv->write(this->addr_state2 + sizeof(wl_state_t) + i, &pos_bits, 1);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} }
} }
} }
ESP_LOGD(TAG, "%s: crc1=%i, crc2 = %i, result=%i", __func__, crc1, crc2, result); ESP_LOGD(TAG, "%s: crc1=%i, crc2 = %i, result=%i", __func__, crc1, crc2, result);
result = this->recoverPos(); result = this->recoverPos();
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} }
} else if ((crc1 != this->state.crc) && (crc2 != state_copy->crc)) { // This is just new flash } else if ((crc1 != this->state.crc) && (crc2 != state_copy->crc)) { // This is just new flash
result = this->initSections(); result = this->initSections();
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->recoverPos(); result = this->recoverPos();
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} else { } else {
// recover broken state // recover broken state
if (crc1 == this->state.crc) {// we have to recover state 2 if (crc1 == this->state.crc) {// we have to recover state 2
result = this->flash_drv->erase_range(this->addr_state2, this->state_size); result = this->flash_drv->erase_range(this->addr_state2, this->state_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t)); result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
for (size_t i = 0; i < ((this->cfg.full_mem_size / this->cfg.sector_size) * this->cfg.wr_size); i++) { for (size_t i = 0; i < ((this->cfg.full_mem_size / this->cfg.sector_size) * this->cfg.wr_size); i++) {
uint8_t pos_bits = 0; uint8_t pos_bits = 0;
result = this->flash_drv->read(this->addr_state1 + sizeof(wl_state_t) + i, &pos_bits, 1); result = this->flash_drv->read(this->addr_state1 + sizeof(wl_state_t) + i, &pos_bits, 1);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
if (pos_bits != 0xff) { if (pos_bits != 0xff) {
result = this->flash_drv->write(this->addr_state2 + sizeof(wl_state_t) + i, &pos_bits, 1); result = this->flash_drv->write(this->addr_state2 + sizeof(wl_state_t) + i, &pos_bits, 1);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} }
} }
result = this->flash_drv->read(this->addr_state2, &this->state, sizeof(wl_state_t)); result = this->flash_drv->read(this->addr_state2, &this->state, sizeof(wl_state_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} else { // we have to recover state 1 } else { // we have to recover state 1
result = this->flash_drv->erase_range(this->addr_state1, this->state_size); result = this->flash_drv->erase_range(this->addr_state1, this->state_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->flash_drv->write(this->addr_state1, state_copy, sizeof(wl_state_t)); result = this->flash_drv->write(this->addr_state1, state_copy, sizeof(wl_state_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
for (size_t i = 0; i < ((this->cfg.full_mem_size / this->cfg.sector_size) * this->cfg.wr_size); i++) { for (size_t i = 0; i < ((this->cfg.full_mem_size / this->cfg.sector_size) * this->cfg.wr_size); i++) {
uint8_t pos_bits = 0; uint8_t pos_bits = 0;
result = this->flash_drv->read(this->addr_state2 + sizeof(wl_state_t) + i, &pos_bits, 1); result = this->flash_drv->read(this->addr_state2 + sizeof(wl_state_t) + i, &pos_bits, 1);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
if (pos_bits != 0xff) { if (pos_bits != 0xff) {
result = this->flash_drv->write(this->addr_state1 + sizeof(wl_state_t) + i, &pos_bits, 1); result = this->flash_drv->write(this->addr_state1 + sizeof(wl_state_t) + i, &pos_bits, 1);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} }
} }
result = this->flash_drv->read(this->addr_state1, &this->state, sizeof(wl_state_t)); result = this->flash_drv->read(this->addr_state1, &this->state, sizeof(wl_state_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
this->state.pos = this->state.max_pos - 1; this->state.pos = this->state.max_pos - 1;
} }
// done. We have recovered the state // done. We have recovered the state
// If we have a new configuration, we will overwrite it // If we have a new configuration, we will overwrite it
if (this->state.version != this->cfg.version) { if (this->state.version != this->cfg.version) {
result = this->initSections(); result = this->initSections();
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} }
} }
if (result != ESP_OK) { if (result != ESP_OK) {
this->initialized = false; this->initialized = false;
ESP_LOGE(TAG, "%s: returned 0x%x", __func__, result); ESP_LOGE(TAG, "%s: returned 0x%x", __func__, result);
return result; return result;
} }
this->initialized = true; this->initialized = true;
return ESP_OK; return ESP_OK;
} }
esp_err_t WL_Flash::recoverPos() esp_err_t WL_Flash::recoverPos()
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
size_t position = 0; size_t position = 0;
for (size_t i = 0; i < this->state.max_pos; i++) { for (size_t i = 0; i < this->state.max_pos; i++) {
uint8_t pos_bits = 0; uint8_t pos_bits = 0;
result = this->flash_drv->read(this->addr_state1 + sizeof(wl_state_t) + i * this->cfg.wr_size, &pos_bits, 1); result = this->flash_drv->read(this->addr_state1 + sizeof(wl_state_t) + i * this->cfg.wr_size, &pos_bits, 1);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
position = i; position = i;
if (pos_bits == 0xff) { if (pos_bits == 0xff) {
break; // we have found position break; // we have found position
} }
} }
this->state.pos = position; this->state.pos = position;
if (this->state.pos == this->state.max_pos) { if (this->state.pos == this->state.max_pos) {
this->state.pos--; this->state.pos--;
} }
ESP_LOGD(TAG, "%s - this->state.pos=0x%08x, result=%08x", __func__, this->state.pos, result); ESP_LOGD(TAG, "%s - this->state.pos=0x%08x, result=%08x", __func__, this->state.pos, result);
return result; return result;
} }
esp_err_t WL_Flash::initSections() esp_err_t WL_Flash::initSections()
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
this->state.pos = 0; this->state.pos = 0;
this->state.access_count = 0; this->state.access_count = 0;
this->state.move_count = 0; this->state.move_count = 0;
// max count // max count
this->state.max_count = this->flash_size / this->state_size * this->cfg.updaterate; this->state.max_count = this->flash_size / this->state_size * this->cfg.updaterate;
if (this->cfg.updaterate != 0) { if (this->cfg.updaterate != 0) {
this->state.max_count = this->cfg.updaterate; this->state.max_count = this->cfg.updaterate;
} }
this->state.version = this->cfg.version; this->state.version = this->cfg.version;
this->state.block_size = this->cfg.page_size; this->state.block_size = this->cfg.page_size;
this->used_bits = 0; this->used_bits = 0;
this->state.max_pos = 1 + this->flash_size / this->cfg.page_size; this->state.max_pos = 1 + this->flash_size / this->cfg.page_size;
this->state.crc = crc32::crc32_le(WL_CFG_CRC_CONST, (uint8_t *)&this->state, sizeof(wl_state_t) - sizeof(uint32_t)); this->state.crc = crc32::crc32_le(WL_CFG_CRC_CONST, (uint8_t *)&this->state, sizeof(wl_state_t) - sizeof(uint32_t));
result = this->flash_drv->erase_range(this->addr_state1, this->state_size); result = this->flash_drv->erase_range(this->addr_state1, this->state_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->flash_drv->write(this->addr_state1, &this->state, sizeof(wl_state_t)); result = this->flash_drv->write(this->addr_state1, &this->state, sizeof(wl_state_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
// write state copy // write state copy
result = this->flash_drv->erase_range(this->addr_state2, this->state_size); result = this->flash_drv->erase_range(this->addr_state2, this->state_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t)); result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->flash_drv->erase_range(this->addr_cfg, this->cfg_size); result = this->flash_drv->erase_range(this->addr_cfg, this->cfg_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->flash_drv->write(this->addr_cfg, &this->cfg, sizeof(wl_config_t)); result = this->flash_drv->write(this->addr_cfg, &this->cfg, sizeof(wl_config_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
ESP_LOGD(TAG, "%s - this->state->max_count=%08x, this->state->max_pos=%08x", __func__, this->state.max_count, this->state.max_pos); ESP_LOGD(TAG, "%s - this->state->max_count=%08x, this->state->max_pos=%08x", __func__, this->state.max_count, this->state.max_pos);
ESP_LOGD(TAG, "%s - result=%08x", __func__, result); ESP_LOGD(TAG, "%s - result=%08x", __func__, result);
return result; return result;
} }
esp_err_t WL_Flash::updateWL() esp_err_t WL_Flash::updateWL()
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
this->state.access_count++; this->state.access_count++;
if (this->state.access_count < this->state.max_count) { if (this->state.access_count < this->state.max_count) {
return result; return result;
} }
// Here we have to move the block and increase the state // Here we have to move the block and increase the state
this->state.access_count = 0; this->state.access_count = 0;
ESP_LOGV(TAG, "%s - access_count=0x%08x, pos=0x%08x", __func__, this->state.access_count, this->state.pos); ESP_LOGV(TAG, "%s - access_count=0x%08x, pos=0x%08x", __func__, this->state.access_count, this->state.pos);
// copy data to dummy block // copy data to dummy block
size_t data_addr = this->state.pos + 1; // next block, [pos+1] copy to [pos] size_t data_addr = this->state.pos + 1; // next block, [pos+1] copy to [pos]
if (data_addr >= this->state.max_pos) { if (data_addr >= this->state.max_pos) {
data_addr = 0; data_addr = 0;
} }
data_addr = this->cfg.start_addr + data_addr * this->cfg.page_size; data_addr = this->cfg.start_addr + data_addr * this->cfg.page_size;
this->dummy_addr = this->cfg.start_addr + this->state.pos * this->cfg.page_size; this->dummy_addr = this->cfg.start_addr + this->state.pos * this->cfg.page_size;
result = this->flash_drv->erase_range(this->dummy_addr, this->cfg.page_size); result = this->flash_drv->erase_range(this->dummy_addr, this->cfg.page_size);
if (result != ESP_OK) { if (result != ESP_OK) {
ESP_LOGE(TAG, "%s - erase wl dummy sector result=%08x", __func__, result); ESP_LOGE(TAG, "%s - erase wl dummy sector result=%08x", __func__, result);
this->state.access_count = this->state.max_count - 1; // we will update next time this->state.access_count = this->state.max_count - 1; // we will update next time
return result; return result;
} }
size_t copy_count = this->cfg.page_size / this->cfg.temp_buff_size; size_t copy_count = this->cfg.page_size / this->cfg.temp_buff_size;
for (size_t i = 0; i < copy_count; i++) { for (size_t i = 0; i < copy_count; i++) {
result = this->flash_drv->read(data_addr + i * this->cfg.temp_buff_size, this->temp_buff, this->cfg.temp_buff_size); result = this->flash_drv->read(data_addr + i * this->cfg.temp_buff_size, this->temp_buff, this->cfg.temp_buff_size);
if (result != ESP_OK) { if (result != ESP_OK) {
ESP_LOGE(TAG, "%s - not possible to read buffer, will try next time, result=%08x", __func__, result); ESP_LOGE(TAG, "%s - not possible to read buffer, will try next time, result=%08x", __func__, result);
this->state.access_count = this->state.max_count - 1; // we will update next time this->state.access_count = this->state.max_count - 1; // we will update next time
return result; return result;
} }
result = this->flash_drv->write(this->dummy_addr + i * this->cfg.temp_buff_size, this->temp_buff, this->cfg.temp_buff_size); result = this->flash_drv->write(this->dummy_addr + i * this->cfg.temp_buff_size, this->temp_buff, this->cfg.temp_buff_size);
if (result != ESP_OK) { if (result != ESP_OK) {
ESP_LOGE(TAG, "%s - not possible to write buffer, will try next time, result=%08x", __func__, result); ESP_LOGE(TAG, "%s - not possible to write buffer, will try next time, result=%08x", __func__, result);
this->state.access_count = this->state.max_count - 1; // we will update next time this->state.access_count = this->state.max_count - 1; // we will update next time
return result; return result;
} }
} }
// done... block moved. // done... block moved.
// Here we will update structures... // Here we will update structures...
// Update bits and save to flash: // Update bits and save to flash:
uint32_t byte_pos = this->state.pos * this->cfg.wr_size; uint32_t byte_pos = this->state.pos * this->cfg.wr_size;
this->used_bits = 0; this->used_bits = 0;
// write state to mem. We updating only affected bits // write state to mem. We updating only affected bits
result |= this->flash_drv->write(this->addr_state1 + sizeof(wl_state_t) + byte_pos, &this->used_bits, this->cfg.wr_size); result |= this->flash_drv->write(this->addr_state1 + sizeof(wl_state_t) + byte_pos, &this->used_bits, this->cfg.wr_size);
if (result != ESP_OK) { if (result != ESP_OK) {
ESP_LOGE(TAG, "%s - update position 1 result=%08x", __func__, result); ESP_LOGE(TAG, "%s - update position 1 result=%08x", __func__, result);
this->state.access_count = this->state.max_count - 1; // we will update next time this->state.access_count = this->state.max_count - 1; // we will update next time
return result; return result;
} }
result |= this->flash_drv->write(this->addr_state2 + sizeof(wl_state_t) + byte_pos, &this->used_bits, this->cfg.wr_size); result |= this->flash_drv->write(this->addr_state2 + sizeof(wl_state_t) + byte_pos, &this->used_bits, this->cfg.wr_size);
if (result != ESP_OK) { if (result != ESP_OK) {
ESP_LOGE(TAG, "%s - update position 2 result=%08x", __func__, result); ESP_LOGE(TAG, "%s - update position 2 result=%08x", __func__, result);
this->state.access_count = this->state.max_count - 1; // we will update next time this->state.access_count = this->state.max_count - 1; // we will update next time
return result; return result;
} }
this->state.pos++; this->state.pos++;
if (this->state.pos >= this->state.max_pos) { if (this->state.pos >= this->state.max_pos) {
this->state.pos = 0; this->state.pos = 0;
// one loop more // one loop more
this->state.move_count++; this->state.move_count++;
if (this->state.move_count >= (this->state.max_pos - 1)) { if (this->state.move_count >= (this->state.max_pos - 1)) {
this->state.move_count = 0; this->state.move_count = 0;
} }
// write main state // write main state
this->state.crc = crc32::crc32_le(WL_CFG_CRC_CONST, (uint8_t *)&this->state, sizeof(wl_state_t) - sizeof(uint32_t)); this->state.crc = crc32::crc32_le(WL_CFG_CRC_CONST, (uint8_t *)&this->state, sizeof(wl_state_t) - sizeof(uint32_t));
result = this->flash_drv->erase_range(this->addr_state1, this->state_size); result = this->flash_drv->erase_range(this->addr_state1, this->state_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->flash_drv->write(this->addr_state1, &this->state, sizeof(wl_state_t)); result = this->flash_drv->write(this->addr_state1, &this->state, sizeof(wl_state_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->flash_drv->erase_range(this->addr_state2, this->state_size); result = this->flash_drv->erase_range(this->addr_state2, this->state_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t)); result = this->flash_drv->write(this->addr_state2, &this->state, sizeof(wl_state_t));
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
ESP_LOGD(TAG, "%s - move_count=%08x", __func__, this->state.move_count); ESP_LOGD(TAG, "%s - move_count=%08x", __func__, this->state.move_count);
} }
// Save structures to the flash... and check result // Save structures to the flash... and check result
if (result == ESP_OK) { if (result == ESP_OK) {
ESP_LOGV(TAG, "%s - result=%08x", __func__, result); ESP_LOGV(TAG, "%s - result=%08x", __func__, result);
} else { } else {
ESP_LOGE(TAG, "%s - result=%08x", __func__, result); ESP_LOGE(TAG, "%s - result=%08x", __func__, result);
} }
return result; return result;
} }
size_t WL_Flash::calcAddr(size_t addr) size_t WL_Flash::calcAddr(size_t addr)
{ {
size_t result = (this->flash_size - this->state.move_count * this->cfg.page_size + addr) % this->flash_size; size_t result = (this->flash_size - this->state.move_count * this->cfg.page_size + addr) % this->flash_size;
size_t dummy_addr = this->state.pos * this->cfg.page_size; size_t dummy_addr = this->state.pos * this->cfg.page_size;
if (result < dummy_addr) { if (result < dummy_addr) {
} else { } else {
result += this->cfg.page_size; result += this->cfg.page_size;
} }
ESP_LOGV(TAG, "%s - addr=0x%08x -> result=0x%08x", __func__, (uint32_t) addr, (uint32_t) result); ESP_LOGV(TAG, "%s - addr=0x%08x -> result=0x%08x", __func__, (uint32_t) addr, (uint32_t) result);
return result; return result;
} }
size_t WL_Flash::chip_size() size_t WL_Flash::chip_size()
{ {
if (!this->configured) { if (!this->configured) {
return 0; return 0;
} }
return this->flash_size; return this->flash_size;
} }
size_t WL_Flash::sector_size() size_t WL_Flash::sector_size()
{ {
if (!this->configured) { if (!this->configured) {
return 0; return 0;
} }
return this->cfg.sector_size; return this->cfg.sector_size;
} }
esp_err_t WL_Flash::erase_sector(size_t sector) esp_err_t WL_Flash::erase_sector(size_t sector)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
if (!this->initialized) { if (!this->initialized) {
return ESP_ERR_INVALID_STATE; return ESP_ERR_INVALID_STATE;
} }
ESP_LOGV(TAG, "%s - sector=0x%08x", __func__, (uint32_t) sector); ESP_LOGV(TAG, "%s - sector=0x%08x", __func__, (uint32_t) sector);
result = this->updateWL(); result = this->updateWL();
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
size_t virt_addr = this->calcAddr(sector * this->cfg.sector_size); size_t virt_addr = this->calcAddr(sector * this->cfg.sector_size);
result = this->flash_drv->erase_sector((this->cfg.start_addr + virt_addr) / this->cfg.sector_size); result = this->flash_drv->erase_sector((this->cfg.start_addr + virt_addr) / this->cfg.sector_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
return result; return result;
} }
esp_err_t WL_Flash::erase_range(size_t start_address, size_t size) esp_err_t WL_Flash::erase_range(size_t start_address, size_t size)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
if (!this->initialized) { if (!this->initialized) {
return ESP_ERR_INVALID_STATE; return ESP_ERR_INVALID_STATE;
} }
ESP_LOGV(TAG, "%s - start_address=0x%08x, size=0x%08x", __func__, (uint32_t) start_address, (uint32_t) size); ESP_LOGV(TAG, "%s - start_address=0x%08x, size=0x%08x", __func__, (uint32_t) start_address, (uint32_t) size);
size_t erase_count = (size + this->cfg.sector_size - 1) / this->cfg.sector_size; size_t erase_count = (size + this->cfg.sector_size - 1) / this->cfg.sector_size;
size_t start_sector = start_address / this->cfg.sector_size; size_t start_sector = start_address / this->cfg.sector_size;
for (size_t i = 0; i < erase_count; i++) { for (size_t i = 0; i < erase_count; i++) {
result = this->erase_sector(start_sector + i); result = this->erase_sector(start_sector + i);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} }
ESP_LOGV(TAG, "%s - result=%08x", __func__, result); ESP_LOGV(TAG, "%s - result=%08x", __func__, result);
return result; return result;
} }
esp_err_t WL_Flash::write(size_t dest_addr, const void *src, size_t size) esp_err_t WL_Flash::write(size_t dest_addr, const void *src, size_t size)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
if (!this->initialized) { if (!this->initialized) {
return ESP_ERR_INVALID_STATE; return ESP_ERR_INVALID_STATE;
} }
ESP_LOGV(TAG, "%s - dest_addr=0x%08x, size=0x%08x", __func__, (uint32_t) dest_addr, (uint32_t) size); ESP_LOGV(TAG, "%s - dest_addr=0x%08x, size=0x%08x", __func__, (uint32_t) dest_addr, (uint32_t) size);
uint32_t count = (size - 1) / this->cfg.page_size; uint32_t count = (size - 1) / this->cfg.page_size;
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
size_t virt_addr = this->calcAddr(dest_addr + i * this->cfg.page_size); size_t virt_addr = this->calcAddr(dest_addr + i * this->cfg.page_size);
result = this->flash_drv->write(this->cfg.start_addr + virt_addr, &((uint8_t *)src)[i * this->cfg.page_size], this->cfg.page_size); result = this->flash_drv->write(this->cfg.start_addr + virt_addr, &((uint8_t *)src)[i * this->cfg.page_size], this->cfg.page_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} }
size_t virt_addr_last = this->calcAddr(dest_addr + count * this->cfg.page_size); size_t virt_addr_last = this->calcAddr(dest_addr + count * this->cfg.page_size);
result = this->flash_drv->write(this->cfg.start_addr + virt_addr_last, &((uint8_t *)src)[count * this->cfg.page_size], size - count * this->cfg.page_size); result = this->flash_drv->write(this->cfg.start_addr + virt_addr_last, &((uint8_t *)src)[count * this->cfg.page_size], size - count * this->cfg.page_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
return result; return result;
} }
esp_err_t WL_Flash::read(size_t src_addr, void *dest, size_t size) esp_err_t WL_Flash::read(size_t src_addr, void *dest, size_t size)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
if (!this->initialized) { if (!this->initialized) {
return ESP_ERR_INVALID_STATE; return ESP_ERR_INVALID_STATE;
} }
ESP_LOGV(TAG, "%s - src_addr=0x%08x, size=0x%08x", __func__, (uint32_t) src_addr, (uint32_t) size); ESP_LOGV(TAG, "%s - src_addr=0x%08x, size=0x%08x", __func__, (uint32_t) src_addr, (uint32_t) size);
uint32_t count = (size - 1) / this->cfg.page_size; uint32_t count = (size - 1) / this->cfg.page_size;
for (size_t i = 0; i < count; i++) { for (size_t i = 0; i < count; i++) {
size_t virt_addr = this->calcAddr(src_addr + i * this->cfg.page_size); size_t virt_addr = this->calcAddr(src_addr + i * this->cfg.page_size);
result = this->flash_drv->read(this->cfg.start_addr + virt_addr, &((uint8_t *)dest)[i * this->cfg.page_size], this->cfg.page_size); result = this->flash_drv->read(this->cfg.start_addr + virt_addr, &((uint8_t *)dest)[i * this->cfg.page_size], this->cfg.page_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
} }
size_t virt_addr_last = this->calcAddr(src_addr + count * this->cfg.page_size); size_t virt_addr_last = this->calcAddr(src_addr + count * this->cfg.page_size);
result = this->flash_drv->read(this->cfg.start_addr + virt_addr_last, &((uint8_t *)dest)[count * this->cfg.page_size], size - count * this->cfg.page_size); result = this->flash_drv->read(this->cfg.start_addr + virt_addr_last, &((uint8_t *)dest)[count * this->cfg.page_size], size - count * this->cfg.page_size);
WL_RESULT_CHECK(result); WL_RESULT_CHECK(result);
return result; return result;
} }
Flash_Access *WL_Flash::get_drv() Flash_Access *WL_Flash::get_drv()
{ {
return this->flash_drv; return this->flash_drv;
} }
wl_config_t *WL_Flash::get_cfg() wl_config_t *WL_Flash::get_cfg()
{ {
return &this->cfg; return &this->cfg;
} }
esp_err_t WL_Flash::flush() esp_err_t WL_Flash::flush()
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
this->state.access_count = this->state.max_count - 1; this->state.access_count = this->state.max_count - 1;
result = this->updateWL(); result = this->updateWL();
ESP_LOGV(TAG, "%s - result=%08x", __func__, result); ESP_LOGV(TAG, "%s - result=%08x", __func__, result);
return result; return result;
} }

View File

@@ -1,20 +1,20 @@
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include "crc32.h" #include "crc32.h"
#include "rom/crc.h" #include "rom/crc.h"
unsigned int crc32::crc32_le(unsigned int crc, unsigned char const *buf, unsigned int len) unsigned int crc32::crc32_le(unsigned int crc, unsigned char const *buf, unsigned int len)
{ {
return ::crc32_le(crc, buf, len); return ::crc32_le(crc, buf, len);
} }

View File

@@ -1,26 +1,26 @@
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _crc32_H_ #ifndef _crc32_H_
#define _crc32_H_ #define _crc32_H_
/** /**
* @brief This class is used to access crc32 module * @brief This class is used to access crc32 module
* *
*/ */
class crc32 class crc32
{ {
public: public:
static unsigned int crc32_le(unsigned int crc, unsigned char const *buf, unsigned int len); static unsigned int crc32_le(unsigned int crc, unsigned char const *buf, unsigned int len);
}; };
#endif // _crc32_H_ #endif // _crc32_H_

View File

@@ -1,88 +1,88 @@
Wear Levelling Component Wear Levelling Component
======================== ========================
Wear Levelling Component (WLC) it is a software component that is implemented to prevent situation when some sectors in flash memory used by erase operations more then others. The component shares access attempts between all avalible sectors. Wear Levelling Component (WLC) it is a software component that is implemented to prevent situation when some sectors in flash memory used by erase operations more then others. The component shares access attempts between all avalible sectors.
The WLC do not have internal cache. When write operation is finished, that means that data was really stored to the flash. The WLC do not have internal cache. When write operation is finished, that means that data was really stored to the flash.
As a parameter the WLC requires the driver to access the flash device. The driver has to implement Flash_Access interface. As a parameter the WLC requires the driver to access the flash device. The driver has to implement Flash_Access interface.
The WLC Files The WLC Files
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
The WLC consist of few components that are implemented in different files. The list and brief description of these components written below. The WLC consist of few components that are implemented in different files. The list and brief description of these components written below.
- Flash_Access - memory access interface. Used to access the memory. A classes WL_Flash, Partition, SPI_Flash are implements this interface. - Flash_Access - memory access interface. Used to access the memory. A classes WL_Flash, Partition, SPI_Flash are implements this interface.
- SPI_Flash - class implements the Flash_Access interface to provide access to the flash memory. - SPI_Flash - class implements the Flash_Access interface to provide access to the flash memory.
- Partition - class implements the Flash_Access interface to provide access to the partition. - Partition - class implements the Flash_Access interface to provide access to the partition.
- WL_Flash - the main class that implements wear levelling functionality. - WL_Flash - the main class that implements wear levelling functionality.
- WL_State - contains state structure of the WLC. - WL_State - contains state structure of the WLC.
- WL_Config - contains structure to configure the WLC component at startup. - WL_Config - contains structure to configure the WLC component at startup.
- wear_levelling - wrapper API class that provides "C" interface to access the memory through the WLC - wear_levelling - wrapper API class that provides "C" interface to access the memory through the WLC
Flash_Access Interface Flash_Access Interface
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
In the component exist virtual interface Flash_Access. This interface implement main basic functions: In the component exist virtual interface Flash_Access. This interface implement main basic functions:
- read - read memory to the buffer. - read - read memory to the buffer.
- write - writes buffer to the memory. - write - writes buffer to the memory.
- erase - erase one sector. - erase - erase one sector.
- erase_range - erase range of memory. The address of rage must be rounded to the sector size. - erase_range - erase range of memory. The address of rage must be rounded to the sector size.
- chip_size - returns the equivalent amount of memory. - chip_size - returns the equivalent amount of memory.
- sector_size - returns the sector size. - sector_size - returns the sector size.
- flush - stores current state to the flash, if needed. - flush - stores current state to the flash, if needed.
The WLC implements this interface for the user, and requires this interface to access the memory. The WLC implements this interface for the user, and requires this interface to access the memory.
Structure wl_config_t to Configure the WLC at startup Structure wl_config_t to Configure the WLC at startup
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The wl_config_t contains configuration parameters for the WLC component. The wl_config_t contains configuration parameters for the WLC component.
- start_addr - offset in the flash memory. The WLC will place all data after this address. - start_addr - offset in the flash memory. The WLC will place all data after this address.
- full_mem_size - amount of memory that was allocated and can be used by WLC - full_mem_size - amount of memory that was allocated and can be used by WLC
- sector_size - flash memory sector size - sector_size - flash memory sector size
- page_size - size of memory for relocation at once. Must be N*sector_size, where N > 0. - page_size - size of memory for relocation at once. Must be N*sector_size, where N > 0.
- updaterate - amount of erase cycles to execute the relocation procedure. - updaterate - amount of erase cycles to execute the relocation procedure.
- wr_size - smalest possible write access size without erasing of sector. - wr_size - smalest possible write access size without erasing of sector.
- version - version of the WLC component. - version - version of the WLC component.
- temp_buff_size - amount of memory that the WLC will allocate internally. Must be > 0. - temp_buff_size - amount of memory that the WLC will allocate internally. Must be > 0.
Internal Memory Organization Internal Memory Organization
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The WLC divide the memory that are define by start_addr and full_mem_size to three regions: The WLC divide the memory that are define by start_addr and full_mem_size to three regions:
- Configuration - Configuration
- Data - Data
- States - States
The Configuration region used to store configuration information. The user can use it to recover the WLC from memory dump. The Configuration region used to store configuration information. The user can use it to recover the WLC from memory dump.
The Data - is a region where user data stored. The Data - is a region where user data stored.
The States - is a region where the WLC stores internal information about the WLC state. The States region contains two copies of the WLC states. It is implemented to prevent situation when the device is shut down The States - is a region where the WLC stores internal information about the WLC state. The States region contains two copies of the WLC states. It is implemented to prevent situation when the device is shut down
during operation when the device stores the states. If one of copies is wrong, the WLC can recover the state from another. The broken copy will be overwritten by another. during operation when the device stores the states. If one of copies is wrong, the WLC can recover the state from another. The broken copy will be overwritten by another.
Main Idea Main Idea
^^^^^^^^^ ^^^^^^^^^
The WLC has two access addresses: virtual address and real address. The virtual address used by user to access the WLC, the real address used by the WLC to access the real memory. The WLC has two access addresses: virtual address and real address. The virtual address used by user to access the WLC, the real address used by the WLC to access the real memory.
The WLC makes the conversion between virtual and real addresses. The WLC makes the conversion between virtual and real addresses.
The Data region divided to N pages (page could be equal to the sector size). One page defined as dummy page. For user will be available only N-1 pages. The Data region divided to N pages (page could be equal to the sector size). One page defined as dummy page. For user will be available only N-1 pages.
The WLC has two internal counters to calculate virtual and real addresses: erase counter and move counter. The WLC has two internal counters to calculate virtual and real addresses: erase counter and move counter.
Every erase operation will be counted by erase counter. When this counter reached the *updaterate* number the page after Dummy page will be moved to the Dummy page, and Dummy page will be changed to this one. The erase counter will Every erase operation will be counted by erase counter. When this counter reached the *updaterate* number the page after Dummy page will be moved to the Dummy page, and Dummy page will be changed to this one. The erase counter will
be cleared and move counter will be incremented. This procedure will be repeated again and again. be cleared and move counter will be incremented. This procedure will be repeated again and again.
When the Dummy page will be at last page in the memory and erase counter will reach the updaterate, the move counter will be cleared and the state will be stored to the State memory. When the Dummy page will be at last page in the memory and erase counter will reach the updaterate, the move counter will be cleared and the state will be stored to the State memory.
Bellow shown the example with 4 available memory pages. Every state after updaterate erases. The X is a Dummy page. Bellow shown the example with 4 available memory pages. Every state after updaterate erases. The X is a Dummy page.
- X 0 1 2 - start position - X 0 1 2 - start position
- 0 X 1 2 - first move, the page 0 and Dummy page change the places - 0 X 1 2 - first move, the page 0 and Dummy page change the places
- 0 1 X 2 - second move, the page 1 and Dummy page change the places - 0 1 X 2 - second move, the page 1 and Dummy page change the places
- 0 1 2 X - - 0 1 2 X -
- X 1 2 0 - state stored to the memory - X 1 2 0 - state stored to the memory
- 1 X 2 0 - - 1 X 2 0 -
- 1 2 X 0 - - 1 2 X 0 -
- 1 2 0 X - - 1 2 0 X -
- X 2 0 1 - state stored to the memory - X 2 0 1 - state stored to the memory
- 2 X 0 1 - - 2 X 0 1 -
- 2 0 X 1 - - 2 0 X 1 -
- 2 0 1 X - - 2 0 1 X -
- X 0 1 2 - state stored to the memory, the memory made full cycle. - X 0 1 2 - state stored to the memory, the memory made full cycle.
As we see, if user will write data only to one address, amount of erase cycles will be shared between the full memory. The price for that is a one memory page that will not be used by user. As we see, if user will write data only to one address, amount of erase cycles will be shared between the full memory. The price for that is a one memory page that will not be used by user.

View File

@@ -1,136 +1,136 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// //
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _wear_levelling_H_ #ifndef _wear_levelling_H_
#define _wear_levelling_H_ #define _wear_levelling_H_
#include "esp_log.h" #include "esp_log.h"
#include "esp_partition.h" #include "esp_partition.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
/** /**
* @brief wear levelling handle * @brief wear levelling handle
*/ */
typedef int32_t wl_handle_t; typedef int32_t wl_handle_t;
#define WL_INVALID_HANDLE -1 #define WL_INVALID_HANDLE -1
/** /**
* @brief Mount WL for defined partition * @brief Mount WL for defined partition
* *
* @param partition that will be used for access * @param partition that will be used for access
* @param out_handle handle of the WL instance * @param out_handle handle of the WL instance
* *
* @return * @return
* - ESP_OK, if the allocation was successfully; * - ESP_OK, if the allocation was successfully;
* - ESP_ERR_INVALID_ARG, if WL allocation was unsuccessful; * - ESP_ERR_INVALID_ARG, if WL allocation was unsuccessful;
* - ESP_ERR_NO_MEM, if there was no memory to allocate WL components; * - ESP_ERR_NO_MEM, if there was no memory to allocate WL components;
*/ */
esp_err_t wl_mount(const esp_partition_t *partition, wl_handle_t *out_handle); esp_err_t wl_mount(const esp_partition_t *partition, wl_handle_t *out_handle);
/** /**
* @brief Unmount WL for defined partition * @brief Unmount WL for defined partition
* *
* @param handle WL partition handle * @param handle WL partition handle
* *
* @return * @return
* - ESP_OK, if the operation completed successfully; * - ESP_OK, if the operation completed successfully;
* - or one of error codes from lower-level flash driver. * - or one of error codes from lower-level flash driver.
*/ */
esp_err_t wl_unmount(wl_handle_t handle); esp_err_t wl_unmount(wl_handle_t handle);
/** /**
* @brief Erase part of the WL storage * @brief Erase part of the WL storage
* *
* @param handle WL handle that are related to the partition * @param handle WL handle that are related to the partition
* @param start_addr Address where erase operation should start. Must be aligned * @param start_addr Address where erase operation should start. Must be aligned
* to the result of function wl_sector_size(...). * to the result of function wl_sector_size(...).
* @param size Size of the range which should be erased, in bytes. * @param size Size of the range which should be erased, in bytes.
* Must be divisible by result of function wl_sector_size(...).. * Must be divisible by result of function wl_sector_size(...)..
* *
* @return * @return
* - ESP_OK, if the range was erased successfully; * - ESP_OK, if the range was erased successfully;
* - ESP_ERR_INVALID_ARG, if iterator or dst are NULL; * - ESP_ERR_INVALID_ARG, if iterator or dst are NULL;
* - ESP_ERR_INVALID_SIZE, if erase would go out of bounds of the partition; * - ESP_ERR_INVALID_SIZE, if erase would go out of bounds of the partition;
* - or one of error codes from lower-level flash driver. * - or one of error codes from lower-level flash driver.
*/ */
esp_err_t wl_erase_range(wl_handle_t handle, size_t start_addr, size_t size); esp_err_t wl_erase_range(wl_handle_t handle, size_t start_addr, size_t size);
/** /**
* @brief Write data to the WL storage * @brief Write data to the WL storage
* *
* Before writing data to flash, corresponding region of flash needs to be erased. * Before writing data to flash, corresponding region of flash needs to be erased.
* This can be done using wl_erase_range function. * This can be done using wl_erase_range function.
* *
* @param handle WL handle that are related to the partition * @param handle WL handle that are related to the partition
* @param dest_addr Address where the data should be written, relative to the * @param dest_addr Address where the data should be written, relative to the
* beginning of the partition. * beginning of the partition.
* @param src Pointer to the source buffer. Pointer must be non-NULL and * @param src Pointer to the source buffer. Pointer must be non-NULL and
* buffer must be at least 'size' bytes long. * buffer must be at least 'size' bytes long.
* @param size Size of data to be written, in bytes. * @param size Size of data to be written, in bytes.
* *
* @note Prior to writing to WL storage, make sure it has been erased with * @note Prior to writing to WL storage, make sure it has been erased with
* wl_erase_range call. * wl_erase_range call.
* *
* @return * @return
* - ESP_OK, if data was written successfully; * - ESP_OK, if data was written successfully;
* - ESP_ERR_INVALID_ARG, if dst_offset exceeds partition size; * - ESP_ERR_INVALID_ARG, if dst_offset exceeds partition size;
* - ESP_ERR_INVALID_SIZE, if write would go out of bounds of the partition; * - ESP_ERR_INVALID_SIZE, if write would go out of bounds of the partition;
* - or one of error codes from lower-level flash driver. * - or one of error codes from lower-level flash driver.
*/ */
esp_err_t wl_write(wl_handle_t handle, size_t dest_addr, const void *src, size_t size); esp_err_t wl_write(wl_handle_t handle, size_t dest_addr, const void *src, size_t size);
/** /**
* @brief Read data from the WL storage * @brief Read data from the WL storage
* *
* @param handle WL module instance that was initialized before * @param handle WL module instance that was initialized before
* @param dest Pointer to the buffer where data should be stored. * @param dest Pointer to the buffer where data should be stored.
* Pointer must be non-NULL and buffer must be at least 'size' bytes long. * Pointer must be non-NULL and buffer must be at least 'size' bytes long.
* @param src_addr Address of the data to be read, relative to the * @param src_addr Address of the data to be read, relative to the
* beginning of the partition. * beginning of the partition.
* @param size Size of data to be read, in bytes. * @param size Size of data to be read, in bytes.
* *
* @return * @return
* - ESP_OK, if data was read successfully; * - ESP_OK, if data was read successfully;
* - ESP_ERR_INVALID_ARG, if src_offset exceeds partition size; * - ESP_ERR_INVALID_ARG, if src_offset exceeds partition size;
* - ESP_ERR_INVALID_SIZE, if read would go out of bounds of the partition; * - ESP_ERR_INVALID_SIZE, if read would go out of bounds of the partition;
* - or one of error codes from lower-level flash driver. * - or one of error codes from lower-level flash driver.
*/ */
esp_err_t wl_read(wl_handle_t handle, size_t src_addr, void *dest, size_t size); esp_err_t wl_read(wl_handle_t handle, size_t src_addr, void *dest, size_t size);
/** /**
* @brief Get size of the WL storage * @brief Get size of the WL storage
* *
* @param handle WL module handle that was initialized before * @param handle WL module handle that was initialized before
* @return usable size, in bytes * @return usable size, in bytes
*/ */
size_t wl_size(wl_handle_t handle); size_t wl_size(wl_handle_t handle);
/** /**
* @brief Get sector size of the WL instance * @brief Get sector size of the WL instance
* *
* @param handle WL module handle that was initialized before * @param handle WL module handle that was initialized before
* @return sector size, in bytes * @return sector size, in bytes
*/ */
size_t wl_sector_size(wl_handle_t handle); size_t wl_sector_size(wl_handle_t handle);
#ifdef __cplusplus #ifdef __cplusplus
} // extern "C" } // extern "C"
#endif #endif
#endif // _wear_levelling_H_ #endif // _wear_levelling_H_

View File

@@ -1,44 +1,44 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _Flash_Access_H_ #ifndef _Flash_Access_H_
#define _Flash_Access_H_ #define _Flash_Access_H_
#include "esp_err.h" #include "esp_err.h"
/** /**
* @brief Universal flash access interface class * @brief Universal flash access interface class
* *
*/ */
class Flash_Access class Flash_Access
{ {
public: public:
virtual size_t chip_size() = 0; virtual size_t chip_size() = 0;
virtual esp_err_t erase_sector(size_t sector) = 0; virtual esp_err_t erase_sector(size_t sector) = 0;
virtual esp_err_t erase_range(size_t start_address, size_t size) = 0; virtual esp_err_t erase_range(size_t start_address, size_t size) = 0;
virtual esp_err_t write(size_t dest_addr, const void *src, size_t size) = 0; virtual esp_err_t write(size_t dest_addr, const void *src, size_t size) = 0;
virtual esp_err_t read(size_t src_addr, void *dest, size_t size) = 0; virtual esp_err_t read(size_t src_addr, void *dest, size_t size) = 0;
virtual size_t sector_size() = 0; virtual size_t sector_size() = 0;
virtual esp_err_t flush() virtual esp_err_t flush()
{ {
return ESP_OK; return ESP_OK;
}; };
virtual ~Flash_Access() {}; virtual ~Flash_Access() {};
}; };
#endif // _Flash_Access_H_ #endif // _Flash_Access_H_

View File

@@ -1,36 +1,36 @@
#ifndef _Partition_H_ #ifndef _Partition_H_
#define _Partition_H_ #define _Partition_H_
#include "esp_err.h" #include "esp_err.h"
#include "Flash_Access.h" #include "Flash_Access.h"
#include "esp_partition.h" #include "esp_partition.h"
/** /**
* @brief This class is used to access partition. Class implements Flash_Access interface * @brief This class is used to access partition. Class implements Flash_Access interface
* *
*/ */
class Partition : public Flash_Access class Partition : public Flash_Access
{ {
public: public:
Partition(const esp_partition_t *partition); Partition(const esp_partition_t *partition);
virtual size_t chip_size(); virtual size_t chip_size();
virtual esp_err_t erase_sector(size_t sector); virtual esp_err_t erase_sector(size_t sector);
virtual esp_err_t erase_range(size_t start_address, size_t size); virtual esp_err_t erase_range(size_t start_address, size_t size);
virtual esp_err_t write(size_t dest_addr, const void *src, size_t size); virtual esp_err_t write(size_t dest_addr, const void *src, size_t size);
virtual esp_err_t read(size_t src_addr, void *dest, size_t size); virtual esp_err_t read(size_t src_addr, void *dest, size_t size);
virtual size_t sector_size(); virtual size_t sector_size();
virtual ~Partition(); virtual ~Partition();
protected: protected:
const esp_partition_t *partition; const esp_partition_t *partition;
}; };
#endif // _Partition_H_ #endif // _Partition_H_

View File

@@ -1,26 +1,26 @@
#ifndef _SPI_Flash_H_ #ifndef _SPI_Flash_H_
#define _SPI_Flash_H_ #define _SPI_Flash_H_
#include "esp_err.h" #include "esp_err.h"
#include "Flash_Access.h" #include "Flash_Access.h"
/** /**
* @brief This class is used to access SPI flash devices. Class implements Flash_Access interface * @brief This class is used to access SPI flash devices. Class implements Flash_Access interface
* *
*/ */
class SPI_Flash : public Flash_Access class SPI_Flash : public Flash_Access
{ {
public: public:
SPI_Flash(); SPI_Flash();
size_t chip_size() override; size_t chip_size() override;
esp_err_t erase_sector(size_t sector) override; esp_err_t erase_sector(size_t sector) override;
esp_err_t erase_range(size_t start_address, size_t size) override; esp_err_t erase_range(size_t start_address, size_t size) override;
esp_err_t write(size_t dest_addr, const void *src, size_t size) override; esp_err_t write(size_t dest_addr, const void *src, size_t size) override;
esp_err_t read(size_t src_addr, void *dest, size_t size) override; esp_err_t read(size_t src_addr, void *dest, size_t size) override;
size_t sector_size() override; size_t sector_size() override;
~SPI_Flash() override; ~SPI_Flash() override;
}; };
#endif // _SPI_Flash_H_ #endif // _SPI_Flash_H_

View File

@@ -1,48 +1,48 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _WL_Config_H_ #ifndef _WL_Config_H_
#define _WL_Config_H_ #define _WL_Config_H_
#include "Flash_Access.h" #include "Flash_Access.h"
/** /**
* @brief This class is used as a structure to configure wear levelling module * @brief This class is used as a structure to configure wear levelling module
* *
*/ */
#if defined(_MSC_VER) #if defined(_MSC_VER)
#define ALIGNED_(x) __declspec(align(x)) #define ALIGNED_(x) __declspec(align(x))
#else #else
#if defined(__GNUC__) #if defined(__GNUC__)
#define ALIGNED_(x) __attribute__ ((aligned(x))) #define ALIGNED_(x) __attribute__ ((aligned(x)))
#endif #endif
#endif #endif
typedef struct ALIGNED_(16) WL_Config_s { /*!< Size of wl_config_t structure should be divided by 16 for encryption*/ typedef struct ALIGNED_(16) WL_Config_s { /*!< Size of wl_config_t structure should be divided by 16 for encryption*/
size_t start_addr; /*!< start address in the flash*/ size_t start_addr; /*!< start address in the flash*/
uint32_t full_mem_size; /*!< Amount of memory used to store data in bytes*/ uint32_t full_mem_size; /*!< Amount of memory used to store data in bytes*/
uint32_t page_size; /*!< One page size in bytes. Page could be more then memory block. This parameter must be page_size >= N*block_size.*/ uint32_t page_size; /*!< One page size in bytes. Page could be more then memory block. This parameter must be page_size >= N*block_size.*/
uint32_t sector_size; /*!< size of flash memory sector that will be erased and stored at once (erase)*/ uint32_t sector_size; /*!< size of flash memory sector that will be erased and stored at once (erase)*/
uint32_t updaterate; /*!< Amount of accesses before block will be moved*/ uint32_t updaterate; /*!< Amount of accesses before block will be moved*/
uint32_t wr_size; /*!< Minimum amount of bytes per one block at write operation: 1...*/ uint32_t wr_size; /*!< Minimum amount of bytes per one block at write operation: 1...*/
uint32_t version; /*!< A version of current implementatioon. To erase and reallocate complete memory this ID must be different from id before.*/ uint32_t version; /*!< A version of current implementatioon. To erase and reallocate complete memory this ID must be different from id before.*/
size_t temp_buff_size; /*!< Size of temporary allocated buffer to copy from one flash area to another. The best way, if this value will be equal to sector size.*/ size_t temp_buff_size; /*!< Size of temporary allocated buffer to copy from one flash area to another. The best way, if this value will be equal to sector size.*/
uint32_t crc; /*!< CRC for this config*/ uint32_t crc; /*!< CRC for this config*/
} wl_config_t; } wl_config_t;
#ifndef _MSC_VER // MSVS has different format for this define #ifndef _MSC_VER // MSVS has different format for this define
static_assert(sizeof(wl_config_t) % 16 == 0, "Size of wl_config_t structure should be compatible with flash encryption"); static_assert(sizeof(wl_config_t) % 16 == 0, "Size of wl_config_t structure should be compatible with flash encryption");
#endif // _MSC_VER #endif // _MSC_VER
#endif // _WL_Config_H_ #endif // _WL_Config_H_

View File

@@ -1,22 +1,22 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _WL_Ext_Cfg_H_ #ifndef _WL_Ext_Cfg_H_
#define _WL_Ext_Cfg_H_ #define _WL_Ext_Cfg_H_
#include "WL_Config.h" #include "WL_Config.h"
typedef struct WL_Ext_Cfg_s : public WL_Config_s { typedef struct WL_Ext_Cfg_s : public WL_Config_s {
uint32_t fat_sector_size; /*!< virtual sector size*/ uint32_t fat_sector_size; /*!< virtual sector size*/
} wl_ext_cfg_t; } wl_ext_cfg_t;
#endif // _WL_Ext_Cfg_H_ #endif // _WL_Ext_Cfg_H_

View File

@@ -1,46 +1,46 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _WL_Ext_Perf_H_ #ifndef _WL_Ext_Perf_H_
#define _WL_Ext_Perf_H_ #define _WL_Ext_Perf_H_
#include "WL_Flash.h" #include "WL_Flash.h"
#include "WL_Ext_Cfg.h" #include "WL_Ext_Cfg.h"
class WL_Ext_Perf : public WL_Flash class WL_Ext_Perf : public WL_Flash
{ {
public: public:
WL_Ext_Perf(); WL_Ext_Perf();
~WL_Ext_Perf() override; ~WL_Ext_Perf() override;
esp_err_t config(WL_Config_s *cfg, Flash_Access *flash_drv) override; esp_err_t config(WL_Config_s *cfg, Flash_Access *flash_drv) override;
esp_err_t init() override; esp_err_t init() override;
size_t chip_size() override; size_t chip_size() override;
size_t sector_size() override; size_t sector_size() override;
esp_err_t erase_sector(size_t sector) override; esp_err_t erase_sector(size_t sector) override;
esp_err_t erase_range(size_t start_address, size_t size) override; esp_err_t erase_range(size_t start_address, size_t size) override;
protected: protected:
uint32_t flash_sector_size; uint32_t flash_sector_size;
uint32_t fat_sector_size; uint32_t fat_sector_size;
uint32_t size_factor; uint32_t size_factor;
uint32_t *sector_buffer; uint32_t *sector_buffer;
virtual esp_err_t erase_sector_fit(uint32_t start_sector, uint32_t count); virtual esp_err_t erase_sector_fit(uint32_t start_sector, uint32_t count);
}; };
#endif // _WL_Ext_Perf_H_ #endif // _WL_Ext_Perf_H_

View File

@@ -1,42 +1,42 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _WL_Ext_Safe_H_ #ifndef _WL_Ext_Safe_H_
#define _WL_Ext_Safe_H_ #define _WL_Ext_Safe_H_
#include "WL_Flash.h" #include "WL_Flash.h"
#include "WL_Ext_Cfg.h" #include "WL_Ext_Cfg.h"
#include "WL_Ext_Perf.h" #include "WL_Ext_Perf.h"
class WL_Ext_Safe : public WL_Ext_Perf class WL_Ext_Safe : public WL_Ext_Perf
{ {
public: public:
WL_Ext_Safe(); WL_Ext_Safe();
~WL_Ext_Safe() override; ~WL_Ext_Safe() override;
esp_err_t config(WL_Config_s *cfg, Flash_Access *flash_drv) override; esp_err_t config(WL_Config_s *cfg, Flash_Access *flash_drv) override;
esp_err_t init() override; esp_err_t init() override;
size_t chip_size() override; size_t chip_size() override;
protected: protected:
esp_err_t erase_sector_fit(uint32_t start_sector, uint32_t count) override; esp_err_t erase_sector_fit(uint32_t start_sector, uint32_t count) override;
// Dump Sector // Dump Sector
uint32_t dump_addr; // dump buffer address uint32_t dump_addr; // dump buffer address
uint32_t state_addr;// sectore where state of transaction will be stored uint32_t state_addr;// sectore where state of transaction will be stored
esp_err_t recover(); esp_err_t recover();
}; };
#endif // _WL_Ext_Safe_H_ #endif // _WL_Ext_Safe_H_

View File

@@ -1,76 +1,76 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _WL_Flash_H_ #ifndef _WL_Flash_H_
#define _WL_Flash_H_ #define _WL_Flash_H_
#include "esp_err.h" #include "esp_err.h"
#include "Flash_Access.h" #include "Flash_Access.h"
#include "WL_Config.h" #include "WL_Config.h"
#include "WL_State.h" #include "WL_State.h"
/** /**
* @brief This class is used to make wear levelling for flash devices. Class implements Flash_Access interface * @brief This class is used to make wear levelling for flash devices. Class implements Flash_Access interface
* *
*/ */
class WL_Flash : public Flash_Access class WL_Flash : public Flash_Access
{ {
public : public :
WL_Flash(); WL_Flash();
~WL_Flash() override; ~WL_Flash() override;
virtual esp_err_t config(wl_config_t *cfg, Flash_Access *flash_drv); virtual esp_err_t config(wl_config_t *cfg, Flash_Access *flash_drv);
virtual esp_err_t init(); virtual esp_err_t init();
size_t chip_size() override; size_t chip_size() override;
size_t sector_size() override; size_t sector_size() override;
esp_err_t erase_sector(size_t sector) override; esp_err_t erase_sector(size_t sector) override;
esp_err_t erase_range(size_t start_address, size_t size) override; esp_err_t erase_range(size_t start_address, size_t size) override;
esp_err_t write(size_t dest_addr, const void *src, size_t size) override; esp_err_t write(size_t dest_addr, const void *src, size_t size) override;
esp_err_t read(size_t src_addr, void *dest, size_t size) override; esp_err_t read(size_t src_addr, void *dest, size_t size) override;
esp_err_t flush() override; esp_err_t flush() override;
Flash_Access *get_drv(); Flash_Access *get_drv();
wl_config_t *get_cfg(); wl_config_t *get_cfg();
protected: protected:
bool configured = false; bool configured = false;
bool initialized = false; bool initialized = false;
wl_state_t state; wl_state_t state;
wl_config_t cfg; wl_config_t cfg;
Flash_Access *flash_drv = NULL; Flash_Access *flash_drv = NULL;
size_t addr_cfg; size_t addr_cfg;
size_t addr_state1; size_t addr_state1;
size_t addr_state2; size_t addr_state2;
size_t index_state1; size_t index_state1;
size_t index_state2; size_t index_state2;
size_t flash_size; size_t flash_size;
uint32_t state_size; uint32_t state_size;
uint32_t cfg_size; uint32_t cfg_size;
uint8_t *temp_buff = NULL; uint8_t *temp_buff = NULL;
size_t dummy_addr; size_t dummy_addr;
uint8_t used_bits; uint8_t used_bits;
esp_err_t initSections(); esp_err_t initSections();
esp_err_t updateWL(); esp_err_t updateWL();
esp_err_t recoverPos(); esp_err_t recoverPos();
size_t calcAddr(size_t addr); size_t calcAddr(size_t addr);
}; };
#endif // _WL_Flash_H_ #endif // _WL_Flash_H_

View File

@@ -1,34 +1,34 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _WL_State_H_ #ifndef _WL_State_H_
#define _WL_State_H_ #define _WL_State_H_
#include "esp_err.h" #include "esp_err.h"
/** /**
* @brief This structure is used to store current state of flash access * @brief This structure is used to store current state of flash access
* *
*/ */
typedef struct WL_State_s { typedef struct WL_State_s {
public: public:
uint32_t pos; /*!< current dummy block position*/ uint32_t pos; /*!< current dummy block position*/
uint32_t max_pos; /*!< maximum amount of positions*/ uint32_t max_pos; /*!< maximum amount of positions*/
uint32_t move_count; /*!< total amount of move counts. Used to calculate the address*/ uint32_t move_count; /*!< total amount of move counts. Used to calculate the address*/
uint32_t access_count; /*!< current access count*/ uint32_t access_count; /*!< current access count*/
uint32_t max_count; /*!< max access count when block will be moved*/ uint32_t max_count; /*!< max access count when block will be moved*/
uint32_t block_size; /*!< size of move block*/ uint32_t block_size; /*!< size of move block*/
uint32_t version; /*!< state id used to identify the version of current libary implementaion*/ uint32_t version; /*!< state id used to identify the version of current libary implementaion*/
uint32_t crc; /*!< CRC of structure*/ uint32_t crc; /*!< CRC of structure*/
} wl_state_t; } wl_state_t;
#endif // _WL_State_H_ #endif // _WL_State_H_

View File

@@ -1,268 +1,268 @@
// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD // Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// //
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#include <stdlib.h> #include <stdlib.h>
#include <new> #include <new>
#include <sys/lock.h> #include <sys/lock.h>
#include "wear_levelling.h" #include "wear_levelling.h"
#include "WL_Config.h" #include "WL_Config.h"
#include "WL_Ext_Cfg.h" #include "WL_Ext_Cfg.h"
#include "WL_Flash.h" #include "WL_Flash.h"
#include "WL_Ext_Perf.h" #include "WL_Ext_Perf.h"
#include "WL_Ext_Safe.h" #include "WL_Ext_Safe.h"
#include "SPI_Flash.h" #include "SPI_Flash.h"
#include "Partition.h" #include "Partition.h"
#ifndef MAX_WL_HANDLES #ifndef MAX_WL_HANDLES
#define MAX_WL_HANDLES 8 #define MAX_WL_HANDLES 8
#endif // MAX_WL_HANDLES #endif // MAX_WL_HANDLES
#ifndef WL_DEFAULT_UPDATERATE #ifndef WL_DEFAULT_UPDATERATE
#define WL_DEFAULT_UPDATERATE 16 #define WL_DEFAULT_UPDATERATE 16
#endif //WL_DEFAULT_UPDATERATE #endif //WL_DEFAULT_UPDATERATE
#ifndef WL_DEFAULT_TEMP_BUFF_SIZE #ifndef WL_DEFAULT_TEMP_BUFF_SIZE
#define WL_DEFAULT_TEMP_BUFF_SIZE 32 #define WL_DEFAULT_TEMP_BUFF_SIZE 32
#endif //WL_DEFAULT_TEMP_BUFF_SIZE #endif //WL_DEFAULT_TEMP_BUFF_SIZE
#ifndef WL_DEFAULT_WRITE_SIZE #ifndef WL_DEFAULT_WRITE_SIZE
#define WL_DEFAULT_WRITE_SIZE 16 #define WL_DEFAULT_WRITE_SIZE 16
#endif //WL_DEFAULT_WRITE_SIZE #endif //WL_DEFAULT_WRITE_SIZE
#ifndef WL_DEFAULT_START_ADDR #ifndef WL_DEFAULT_START_ADDR
#define WL_DEFAULT_START_ADDR 0 #define WL_DEFAULT_START_ADDR 0
#endif //WL_DEFAULT_START_ADDR #endif //WL_DEFAULT_START_ADDR
#ifndef WL_CURRENT_VERSION #ifndef WL_CURRENT_VERSION
#define WL_CURRENT_VERSION 1 #define WL_CURRENT_VERSION 1
#endif //WL_CURRENT_VERSION #endif //WL_CURRENT_VERSION
typedef struct { typedef struct {
WL_Flash *instance; WL_Flash *instance;
_lock_t lock; _lock_t lock;
} wl_instance_t; } wl_instance_t;
static wl_instance_t s_instances[MAX_WL_HANDLES]; static wl_instance_t s_instances[MAX_WL_HANDLES];
static _lock_t s_instances_lock; static _lock_t s_instances_lock;
static const char *TAG = "wear_levelling"; static const char *TAG = "wear_levelling";
static esp_err_t check_handle(wl_handle_t handle, const char *func); static esp_err_t check_handle(wl_handle_t handle, const char *func);
esp_err_t wl_mount(const esp_partition_t *partition, wl_handle_t *out_handle) esp_err_t wl_mount(const esp_partition_t *partition, wl_handle_t *out_handle)
{ {
// Initialize variables before the first jump to cleanup label // Initialize variables before the first jump to cleanup label
void *wl_flash_ptr = NULL; void *wl_flash_ptr = NULL;
WL_Flash *wl_flash = NULL; WL_Flash *wl_flash = NULL;
void *part_ptr = NULL; void *part_ptr = NULL;
Partition *part = NULL; Partition *part = NULL;
_lock_acquire(&s_instances_lock); _lock_acquire(&s_instances_lock);
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
*out_handle = WL_INVALID_HANDLE; *out_handle = WL_INVALID_HANDLE;
for (size_t i = 0; i < MAX_WL_HANDLES; i++) { for (size_t i = 0; i < MAX_WL_HANDLES; i++) {
if (s_instances[i].instance == NULL) { if (s_instances[i].instance == NULL) {
*out_handle = i; *out_handle = i;
break; break;
} }
} }
wl_ext_cfg_t cfg; wl_ext_cfg_t cfg;
cfg.full_mem_size = partition->size; cfg.full_mem_size = partition->size;
cfg.start_addr = WL_DEFAULT_START_ADDR; cfg.start_addr = WL_DEFAULT_START_ADDR;
cfg.version = WL_CURRENT_VERSION; cfg.version = WL_CURRENT_VERSION;
cfg.sector_size = SPI_FLASH_SEC_SIZE; cfg.sector_size = SPI_FLASH_SEC_SIZE;
cfg.page_size = SPI_FLASH_SEC_SIZE; cfg.page_size = SPI_FLASH_SEC_SIZE;
cfg.updaterate = WL_DEFAULT_UPDATERATE; cfg.updaterate = WL_DEFAULT_UPDATERATE;
cfg.temp_buff_size = WL_DEFAULT_TEMP_BUFF_SIZE; cfg.temp_buff_size = WL_DEFAULT_TEMP_BUFF_SIZE;
cfg.wr_size = WL_DEFAULT_WRITE_SIZE; cfg.wr_size = WL_DEFAULT_WRITE_SIZE;
// FAT sector size by default will be 512 // FAT sector size by default will be 512
cfg.fat_sector_size = CONFIG_WL_SECTOR_SIZE; cfg.fat_sector_size = CONFIG_WL_SECTOR_SIZE;
if (*out_handle == WL_INVALID_HANDLE) { if (*out_handle == WL_INVALID_HANDLE) {
ESP_LOGE(TAG, "MAX_WL_HANDLES=%d instances already allocated", MAX_WL_HANDLES); ESP_LOGE(TAG, "MAX_WL_HANDLES=%d instances already allocated", MAX_WL_HANDLES);
result = ESP_ERR_NO_MEM; result = ESP_ERR_NO_MEM;
goto out; goto out;
} }
// Allocate memory for a Partition object, and then initialize the object // Allocate memory for a Partition object, and then initialize the object
// using placement new operator. This way we can recover from out of // using placement new operator. This way we can recover from out of
// memory condition. // memory condition.
part_ptr = malloc(sizeof(Partition)); part_ptr = malloc(sizeof(Partition));
if (part_ptr == NULL) { if (part_ptr == NULL) {
result = ESP_ERR_NO_MEM; result = ESP_ERR_NO_MEM;
ESP_LOGE(TAG, "%s: can't allocate Partition", __func__); ESP_LOGE(TAG, "%s: can't allocate Partition", __func__);
goto out; goto out;
} }
part = new (part_ptr) Partition(partition); part = new (part_ptr) Partition(partition);
// Same for WL_Flash: allocate memory, use placement new // Same for WL_Flash: allocate memory, use placement new
#if CONFIG_WL_SECTOR_SIZE == 512 #if CONFIG_WL_SECTOR_SIZE == 512
#if CONFIG_WL_SECTOR_MODE == 1 #if CONFIG_WL_SECTOR_MODE == 1
wl_flash_ptr = malloc(sizeof(WL_Ext_Safe)); wl_flash_ptr = malloc(sizeof(WL_Ext_Safe));
if (wl_flash_ptr == NULL) { if (wl_flash_ptr == NULL) {
result = ESP_ERR_NO_MEM; result = ESP_ERR_NO_MEM;
ESP_LOGE(TAG, "%s: can't allocate WL_Ext_Safe", __func__); ESP_LOGE(TAG, "%s: can't allocate WL_Ext_Safe", __func__);
goto out; goto out;
} }
wl_flash = new (wl_flash_ptr) WL_Ext_Safe(); wl_flash = new (wl_flash_ptr) WL_Ext_Safe();
#else #else
wl_flash_ptr = malloc(sizeof(WL_Ext_Perf)); wl_flash_ptr = malloc(sizeof(WL_Ext_Perf));
if (wl_flash_ptr == NULL) { if (wl_flash_ptr == NULL) {
result = ESP_ERR_NO_MEM; result = ESP_ERR_NO_MEM;
ESP_LOGE(TAG, "%s: can't allocate WL_Ext_Perf", __func__); ESP_LOGE(TAG, "%s: can't allocate WL_Ext_Perf", __func__);
goto out; goto out;
} }
wl_flash = new (wl_flash_ptr) WL_Ext_Perf(); wl_flash = new (wl_flash_ptr) WL_Ext_Perf();
#endif // CONFIG_WL_SECTOR_MODE #endif // CONFIG_WL_SECTOR_MODE
#endif // CONFIG_WL_SECTOR_SIZE #endif // CONFIG_WL_SECTOR_SIZE
#if CONFIG_WL_SECTOR_SIZE == 4096 #if CONFIG_WL_SECTOR_SIZE == 4096
wl_flash_ptr = malloc(sizeof(WL_Flash)); wl_flash_ptr = malloc(sizeof(WL_Flash));
if (wl_flash_ptr == NULL) { if (wl_flash_ptr == NULL) {
result = ESP_ERR_NO_MEM; result = ESP_ERR_NO_MEM;
ESP_LOGE(TAG, "%s: can't allocate WL_Flash", __func__); ESP_LOGE(TAG, "%s: can't allocate WL_Flash", __func__);
goto out; goto out;
} }
wl_flash = new (wl_flash_ptr) WL_Flash(); wl_flash = new (wl_flash_ptr) WL_Flash();
#endif // CONFIG_WL_SECTOR_SIZE #endif // CONFIG_WL_SECTOR_SIZE
result = wl_flash->config(&cfg, part); result = wl_flash->config(&cfg, part);
if (ESP_OK != result) { if (ESP_OK != result) {
ESP_LOGE(TAG, "%s: config instance=0x%08x, result=0x%x", __func__, *out_handle, result); ESP_LOGE(TAG, "%s: config instance=0x%08x, result=0x%x", __func__, *out_handle, result);
goto out; goto out;
} }
result = wl_flash->init(); result = wl_flash->init();
if (ESP_OK != result) { if (ESP_OK != result) {
ESP_LOGE(TAG, "%s: init instance=0x%08x, result=0x%x", __func__, *out_handle, result); ESP_LOGE(TAG, "%s: init instance=0x%08x, result=0x%x", __func__, *out_handle, result);
goto out; goto out;
} }
s_instances[*out_handle].instance = wl_flash; s_instances[*out_handle].instance = wl_flash;
_lock_init(&s_instances[*out_handle].lock); _lock_init(&s_instances[*out_handle].lock);
_lock_release(&s_instances_lock); _lock_release(&s_instances_lock);
return ESP_OK; return ESP_OK;
out: out:
_lock_release(&s_instances_lock); _lock_release(&s_instances_lock);
*out_handle = WL_INVALID_HANDLE; *out_handle = WL_INVALID_HANDLE;
if (wl_flash) { if (wl_flash) {
wl_flash->~WL_Flash(); wl_flash->~WL_Flash();
free(wl_flash); free(wl_flash);
} }
if (part) { if (part) {
part->~Partition(); part->~Partition();
free(part); free(part);
} }
return result; return result;
} }
esp_err_t wl_unmount(wl_handle_t handle) esp_err_t wl_unmount(wl_handle_t handle)
{ {
esp_err_t result = ESP_OK; esp_err_t result = ESP_OK;
_lock_acquire(&s_instances_lock); _lock_acquire(&s_instances_lock);
result = check_handle(handle, __func__); result = check_handle(handle, __func__);
if (result == ESP_OK) { if (result == ESP_OK) {
ESP_LOGV(TAG, "deleting handle 0x%08x", handle); ESP_LOGV(TAG, "deleting handle 0x%08x", handle);
// We have to flush state of the component // We have to flush state of the component
result = s_instances[handle].instance->flush(); result = s_instances[handle].instance->flush();
// We use placement new in wl_mount, so call destructor directly // We use placement new in wl_mount, so call destructor directly
Flash_Access *drv = s_instances[handle].instance->get_drv(); Flash_Access *drv = s_instances[handle].instance->get_drv();
drv->~Flash_Access(); drv->~Flash_Access();
free(drv); free(drv);
s_instances[handle].instance->~WL_Flash(); s_instances[handle].instance->~WL_Flash();
free(s_instances[handle].instance); free(s_instances[handle].instance);
s_instances[handle].instance = NULL; s_instances[handle].instance = NULL;
_lock_close(&s_instances[handle].lock); // also zeroes the lock variable _lock_close(&s_instances[handle].lock); // also zeroes the lock variable
} }
_lock_release(&s_instances_lock); _lock_release(&s_instances_lock);
return result; return result;
} }
esp_err_t wl_erase_range(wl_handle_t handle, size_t start_addr, size_t size) esp_err_t wl_erase_range(wl_handle_t handle, size_t start_addr, size_t size)
{ {
esp_err_t result = check_handle(handle, __func__); esp_err_t result = check_handle(handle, __func__);
if (result != ESP_OK) { if (result != ESP_OK) {
return result; return result;
} }
_lock_acquire(&s_instances[handle].lock); _lock_acquire(&s_instances[handle].lock);
result = s_instances[handle].instance->erase_range(start_addr, size); result = s_instances[handle].instance->erase_range(start_addr, size);
_lock_release(&s_instances[handle].lock); _lock_release(&s_instances[handle].lock);
return result; return result;
} }
esp_err_t wl_write(wl_handle_t handle, size_t dest_addr, const void *src, size_t size) esp_err_t wl_write(wl_handle_t handle, size_t dest_addr, const void *src, size_t size)
{ {
esp_err_t result = check_handle(handle, __func__); esp_err_t result = check_handle(handle, __func__);
if (result != ESP_OK) { if (result != ESP_OK) {
return result; return result;
} }
_lock_acquire(&s_instances[handle].lock); _lock_acquire(&s_instances[handle].lock);
result = s_instances[handle].instance->write(dest_addr, src, size); result = s_instances[handle].instance->write(dest_addr, src, size);
_lock_release(&s_instances[handle].lock); _lock_release(&s_instances[handle].lock);
return result; return result;
} }
esp_err_t wl_read(wl_handle_t handle, size_t src_addr, void *dest, size_t size) esp_err_t wl_read(wl_handle_t handle, size_t src_addr, void *dest, size_t size)
{ {
esp_err_t result = check_handle(handle, __func__); esp_err_t result = check_handle(handle, __func__);
if (result != ESP_OK) { if (result != ESP_OK) {
return result; return result;
} }
_lock_acquire(&s_instances[handle].lock); _lock_acquire(&s_instances[handle].lock);
result = s_instances[handle].instance->read(src_addr, dest, size); result = s_instances[handle].instance->read(src_addr, dest, size);
_lock_release(&s_instances[handle].lock); _lock_release(&s_instances[handle].lock);
return result; return result;
} }
size_t wl_size(wl_handle_t handle) size_t wl_size(wl_handle_t handle)
{ {
esp_err_t err = check_handle(handle, __func__); esp_err_t err = check_handle(handle, __func__);
if (err != ESP_OK) { if (err != ESP_OK) {
return 0; return 0;
} }
_lock_acquire(&s_instances[handle].lock); _lock_acquire(&s_instances[handle].lock);
size_t result = s_instances[handle].instance->chip_size(); size_t result = s_instances[handle].instance->chip_size();
_lock_release(&s_instances[handle].lock); _lock_release(&s_instances[handle].lock);
return result; return result;
} }
size_t wl_sector_size(wl_handle_t handle) size_t wl_sector_size(wl_handle_t handle)
{ {
esp_err_t err = check_handle(handle, __func__); esp_err_t err = check_handle(handle, __func__);
if (err != ESP_OK) { if (err != ESP_OK) {
return 0; return 0;
} }
_lock_acquire(&s_instances[handle].lock); _lock_acquire(&s_instances[handle].lock);
size_t result = s_instances[handle].instance->sector_size(); size_t result = s_instances[handle].instance->sector_size();
_lock_release(&s_instances[handle].lock); _lock_release(&s_instances[handle].lock);
return result; return result;
} }
static esp_err_t check_handle(wl_handle_t handle, const char *func) static esp_err_t check_handle(wl_handle_t handle, const char *func)
{ {
if (handle == WL_INVALID_HANDLE) { if (handle == WL_INVALID_HANDLE) {
ESP_LOGE(TAG, "%s: invalid handle", func); ESP_LOGE(TAG, "%s: invalid handle", func);
return ESP_ERR_NOT_FOUND; return ESP_ERR_NOT_FOUND;
} }
if (handle >= MAX_WL_HANDLES) { if (handle >= MAX_WL_HANDLES) {
ESP_LOGE(TAG, "%s: instance[0x%08x] out of range", func, handle); ESP_LOGE(TAG, "%s: instance[0x%08x] out of range", func, handle);
return ESP_ERR_INVALID_ARG; return ESP_ERR_INVALID_ARG;
} }
if (s_instances[handle].instance == NULL) { if (s_instances[handle].instance == NULL) {
ESP_LOGE(TAG, "%s: instance[0x%08x] not initialized", func, handle); ESP_LOGE(TAG, "%s: instance[0x%08x] not initialized", func, handle);
return ESP_ERR_NOT_FOUND; return ESP_ERR_NOT_FOUND;
} }
return ESP_OK; return ESP_OK;
} }

View File

@@ -1,16 +1,16 @@
/* /*
* EAP-PEAP common routines * EAP-PEAP common routines
* Copyright (c) 2008-2011, Jouni Malinen <j@w1.fi> * Copyright (c) 2008-2011, Jouni Malinen <j@w1.fi>
* *
* This software may be distributed under the terms of the BSD license. * This software may be distributed under the terms of the BSD license.
* See README for more details. * See README for more details.
*/ */
#ifndef EAP_PEAP_COMMON_H #ifndef EAP_PEAP_COMMON_H
#define EAP_PEAP_COMMON_H #define EAP_PEAP_COMMON_H
int peap_prfplus(int version, const u8 *key, size_t key_len, int peap_prfplus(int version, const u8 *key, size_t key_len,
const char *label, const u8 *seed, size_t seed_len, const char *label, const u8 *seed, size_t seed_len,
u8 *buf, size_t buf_len); u8 *buf, size_t buf_len);
#endif /* EAP_PEAP_COMMON_H */ #endif /* EAP_PEAP_COMMON_H */

View File

@@ -1,112 +1,112 @@
/* /*
* EAP-TLV definitions (draft-josefsson-pppext-eap-tls-eap-10.txt) * EAP-TLV definitions (draft-josefsson-pppext-eap-tls-eap-10.txt)
* Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi> * Copyright (c) 2004-2008, Jouni Malinen <j@w1.fi>
* *
* This software may be distributed under the terms of the BSD license. * This software may be distributed under the terms of the BSD license.
* See README for more details. * See README for more details.
*/ */
#ifndef EAP_TLV_COMMON_H #ifndef EAP_TLV_COMMON_H
#define EAP_TLV_COMMON_H #define EAP_TLV_COMMON_H
/* EAP-TLV TLVs (draft-josefsson-ppext-eap-tls-eap-10.txt) */ /* EAP-TLV TLVs (draft-josefsson-ppext-eap-tls-eap-10.txt) */
#define EAP_TLV_RESULT_TLV 3 /* Acknowledged Result */ #define EAP_TLV_RESULT_TLV 3 /* Acknowledged Result */
#define EAP_TLV_NAK_TLV 4 #define EAP_TLV_NAK_TLV 4
#define EAP_TLV_ERROR_CODE_TLV 5 #define EAP_TLV_ERROR_CODE_TLV 5
#define EAP_TLV_CONNECTION_BINDING_TLV 6 #define EAP_TLV_CONNECTION_BINDING_TLV 6
#define EAP_TLV_VENDOR_SPECIFIC_TLV 7 #define EAP_TLV_VENDOR_SPECIFIC_TLV 7
#define EAP_TLV_URI_TLV 8 #define EAP_TLV_URI_TLV 8
#define EAP_TLV_EAP_PAYLOAD_TLV 9 #define EAP_TLV_EAP_PAYLOAD_TLV 9
#define EAP_TLV_INTERMEDIATE_RESULT_TLV 10 #define EAP_TLV_INTERMEDIATE_RESULT_TLV 10
#define EAP_TLV_PAC_TLV 11 /* RFC 5422, Section 4.2 */ #define EAP_TLV_PAC_TLV 11 /* RFC 5422, Section 4.2 */
#define EAP_TLV_CRYPTO_BINDING_TLV 12 #define EAP_TLV_CRYPTO_BINDING_TLV 12
#define EAP_TLV_CALLING_STATION_ID_TLV 13 #define EAP_TLV_CALLING_STATION_ID_TLV 13
#define EAP_TLV_CALLED_STATION_ID_TLV 14 #define EAP_TLV_CALLED_STATION_ID_TLV 14
#define EAP_TLV_NAS_PORT_TYPE_TLV 15 #define EAP_TLV_NAS_PORT_TYPE_TLV 15
#define EAP_TLV_SERVER_IDENTIFIER_TLV 16 #define EAP_TLV_SERVER_IDENTIFIER_TLV 16
#define EAP_TLV_IDENTITY_TYPE_TLV 17 #define EAP_TLV_IDENTITY_TYPE_TLV 17
#define EAP_TLV_SERVER_TRUSTED_ROOT_TLV 18 #define EAP_TLV_SERVER_TRUSTED_ROOT_TLV 18
#define EAP_TLV_REQUEST_ACTION_TLV 19 #define EAP_TLV_REQUEST_ACTION_TLV 19
#define EAP_TLV_PKCS7_TLV 20 #define EAP_TLV_PKCS7_TLV 20
#define EAP_TLV_RESULT_SUCCESS 1 #define EAP_TLV_RESULT_SUCCESS 1
#define EAP_TLV_RESULT_FAILURE 2 #define EAP_TLV_RESULT_FAILURE 2
#define EAP_TLV_TYPE_MANDATORY 0x8000 #define EAP_TLV_TYPE_MANDATORY 0x8000
#define EAP_TLV_TYPE_MASK 0x3fff #define EAP_TLV_TYPE_MASK 0x3fff
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma pack(push, 1) #pragma pack(push, 1)
#endif /* _MSC_VER */ #endif /* _MSC_VER */
struct eap_tlv_hdr { struct eap_tlv_hdr {
be16 tlv_type; be16 tlv_type;
be16 length; be16 length;
} STRUCT_PACKED; } STRUCT_PACKED;
struct eap_tlv_nak_tlv { struct eap_tlv_nak_tlv {
be16 tlv_type; be16 tlv_type;
be16 length; be16 length;
be32 vendor_id; be32 vendor_id;
be16 nak_type; be16 nak_type;
} STRUCT_PACKED; } STRUCT_PACKED;
struct eap_tlv_result_tlv { struct eap_tlv_result_tlv {
be16 tlv_type; be16 tlv_type;
be16 length; be16 length;
be16 status; be16 status;
} STRUCT_PACKED; } STRUCT_PACKED;
/* RFC 4851, Section 4.2.7 - Intermediate-Result TLV */ /* RFC 4851, Section 4.2.7 - Intermediate-Result TLV */
struct eap_tlv_intermediate_result_tlv { struct eap_tlv_intermediate_result_tlv {
be16 tlv_type; be16 tlv_type;
be16 length; be16 length;
be16 status; be16 status;
/* Followed by optional TLVs */ /* Followed by optional TLVs */
} STRUCT_PACKED; } STRUCT_PACKED;
/* RFC 4851, Section 4.2.8 - Crypto-Binding TLV */ /* RFC 4851, Section 4.2.8 - Crypto-Binding TLV */
struct eap_tlv_crypto_binding_tlv { struct eap_tlv_crypto_binding_tlv {
be16 tlv_type; be16 tlv_type;
be16 length; be16 length;
u8 reserved; u8 reserved;
u8 version; u8 version;
u8 received_version; u8 received_version;
u8 subtype; u8 subtype;
u8 nonce[32]; u8 nonce[32];
u8 compound_mac[20]; u8 compound_mac[20];
} STRUCT_PACKED; } STRUCT_PACKED;
struct eap_tlv_pac_ack_tlv { struct eap_tlv_pac_ack_tlv {
be16 tlv_type; be16 tlv_type;
be16 length; be16 length;
be16 pac_type; be16 pac_type;
be16 pac_len; be16 pac_len;
be16 result; be16 result;
} STRUCT_PACKED; } STRUCT_PACKED;
/* RFC 4851, Section 4.2.9 - Request-Action TLV */ /* RFC 4851, Section 4.2.9 - Request-Action TLV */
struct eap_tlv_request_action_tlv { struct eap_tlv_request_action_tlv {
be16 tlv_type; be16 tlv_type;
be16 length; be16 length;
be16 action; be16 action;
} STRUCT_PACKED; } STRUCT_PACKED;
/* RFC 5422, Section 4.2.6 - PAC-Type TLV */ /* RFC 5422, Section 4.2.6 - PAC-Type TLV */
struct eap_tlv_pac_type_tlv { struct eap_tlv_pac_type_tlv {
be16 tlv_type; /* PAC_TYPE_PAC_TYPE */ be16 tlv_type; /* PAC_TYPE_PAC_TYPE */
be16 length; be16 length;
be16 pac_type; be16 pac_type;
} STRUCT_PACKED; } STRUCT_PACKED;
#ifdef _MSC_VER #ifdef _MSC_VER
#pragma pack(pop) #pragma pack(pop)
#endif /* _MSC_VER */ #endif /* _MSC_VER */
#define EAP_TLV_CRYPTO_BINDING_SUBTYPE_REQUEST 0 #define EAP_TLV_CRYPTO_BINDING_SUBTYPE_REQUEST 0
#define EAP_TLV_CRYPTO_BINDING_SUBTYPE_RESPONSE 1 #define EAP_TLV_CRYPTO_BINDING_SUBTYPE_RESPONSE 1
#define EAP_TLV_ACTION_PROCESS_TLV 1 #define EAP_TLV_ACTION_PROCESS_TLV 1
#define EAP_TLV_ACTION_NEGOTIATE_EAP 2 #define EAP_TLV_ACTION_NEGOTIATE_EAP 2
#endif /* EAP_TLV_COMMON_H */ #endif /* EAP_TLV_COMMON_H */

View File

@@ -1,65 +1,65 @@
/* /*
* EAP server/peer: EAP-TTLS (RFC 5281) * EAP server/peer: EAP-TTLS (RFC 5281)
* Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi> * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi>
* *
* This software may be distributed under the terms of the BSD license. * This software may be distributed under the terms of the BSD license.
* See README for more details. * See README for more details.
*/ */
#ifndef EAP_TTLS_H #ifndef EAP_TTLS_H
#define EAP_TTLS_H #define EAP_TTLS_H
struct ttls_avp { struct ttls_avp {
be32 avp_code; be32 avp_code;
be32 avp_length; /* 8-bit flags, 24-bit length; be32 avp_length; /* 8-bit flags, 24-bit length;
* length includes AVP header */ * length includes AVP header */
/* optional 32-bit Vendor-ID */ /* optional 32-bit Vendor-ID */
/* Data */ /* Data */
}; };
struct ttls_avp_vendor { struct ttls_avp_vendor {
be32 avp_code; be32 avp_code;
be32 avp_length; /* 8-bit flags, 24-bit length; be32 avp_length; /* 8-bit flags, 24-bit length;
* length includes AVP header */ * length includes AVP header */
be32 vendor_id; be32 vendor_id;
/* Data */ /* Data */
}; };
#define AVP_FLAGS_VENDOR 0x80 #define AVP_FLAGS_VENDOR 0x80
#define AVP_FLAGS_MANDATORY 0x40 #define AVP_FLAGS_MANDATORY 0x40
#define AVP_PAD(start, pos) \ #define AVP_PAD(start, pos) \
do { \ do { \
int __pad; \ int __pad; \
__pad = (4 - (((pos) - (start)) & 3)) & 3; \ __pad = (4 - (((pos) - (start)) & 3)) & 3; \
os_memset((pos), 0, __pad); \ os_memset((pos), 0, __pad); \
pos += __pad; \ pos += __pad; \
} while (0) } while (0)
/* RFC 2865 */ /* RFC 2865 */
#define RADIUS_ATTR_USER_NAME 1 #define RADIUS_ATTR_USER_NAME 1
#define RADIUS_ATTR_USER_PASSWORD 2 #define RADIUS_ATTR_USER_PASSWORD 2
#define RADIUS_ATTR_CHAP_PASSWORD 3 #define RADIUS_ATTR_CHAP_PASSWORD 3
#define RADIUS_ATTR_REPLY_MESSAGE 18 #define RADIUS_ATTR_REPLY_MESSAGE 18
#define RADIUS_ATTR_CHAP_CHALLENGE 60 #define RADIUS_ATTR_CHAP_CHALLENGE 60
#define RADIUS_ATTR_EAP_MESSAGE 79 #define RADIUS_ATTR_EAP_MESSAGE 79
/* RFC 2548 */ /* RFC 2548 */
#define RADIUS_VENDOR_ID_MICROSOFT 311 #define RADIUS_VENDOR_ID_MICROSOFT 311
#define RADIUS_ATTR_MS_CHAP_RESPONSE 1 #define RADIUS_ATTR_MS_CHAP_RESPONSE 1
#define RADIUS_ATTR_MS_CHAP_ERROR 2 #define RADIUS_ATTR_MS_CHAP_ERROR 2
#define RADIUS_ATTR_MS_CHAP_NT_ENC_PW 6 #define RADIUS_ATTR_MS_CHAP_NT_ENC_PW 6
#define RADIUS_ATTR_MS_CHAP_CHALLENGE 11 #define RADIUS_ATTR_MS_CHAP_CHALLENGE 11
#define RADIUS_ATTR_MS_CHAP2_RESPONSE 25 #define RADIUS_ATTR_MS_CHAP2_RESPONSE 25
#define RADIUS_ATTR_MS_CHAP2_SUCCESS 26 #define RADIUS_ATTR_MS_CHAP2_SUCCESS 26
#define RADIUS_ATTR_MS_CHAP2_CPW 27 #define RADIUS_ATTR_MS_CHAP2_CPW 27
#define EAP_TTLS_MSCHAPV2_CHALLENGE_LEN 16 #define EAP_TTLS_MSCHAPV2_CHALLENGE_LEN 16
#define EAP_TTLS_MSCHAPV2_RESPONSE_LEN 50 #define EAP_TTLS_MSCHAPV2_RESPONSE_LEN 50
#define EAP_TTLS_MSCHAP_CHALLENGE_LEN 8 #define EAP_TTLS_MSCHAP_CHALLENGE_LEN 8
#define EAP_TTLS_MSCHAP_RESPONSE_LEN 50 #define EAP_TTLS_MSCHAP_RESPONSE_LEN 50
#define EAP_TTLS_CHAP_CHALLENGE_LEN 16 #define EAP_TTLS_CHAP_CHALLENGE_LEN 16
#define EAP_TTLS_CHAP_PASSWORD_LEN 16 #define EAP_TTLS_CHAP_PASSWORD_LEN 16
#endif /* EAP_TTLS_H */ #endif /* EAP_TTLS_H */

View File

@@ -1,494 +1,494 @@
/* /*
* DES and 3DES-EDE ciphers * DES and 3DES-EDE ciphers
* *
* Modifications to LibTomCrypt implementation: * Modifications to LibTomCrypt implementation:
* Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi> * Copyright (c) 2006-2009, Jouni Malinen <j@w1.fi>
* *
* This software may be distributed under the terms of the BSD license. * This software may be distributed under the terms of the BSD license.
* See README for more details. * See README for more details.
*/ */
#include "wpa/includes.h" #include "wpa/includes.h"
#include "wpa/common.h" #include "wpa/common.h"
#include "crypto/crypto.h" #include "crypto/crypto.h"
//#include "des_i.h" //#include "des_i.h"
/* /*
* This implementation is based on a DES implementation included in * This implementation is based on a DES implementation included in
* LibTomCrypt. The version here is modified to fit in wpa_supplicant/hostapd * LibTomCrypt. The version here is modified to fit in wpa_supplicant/hostapd
* coding style. * coding style.
*/ */
/* LibTomCrypt, modular cryptographic library -- Tom St Denis /* LibTomCrypt, modular cryptographic library -- Tom St Denis
* *
* LibTomCrypt is a library that provides various cryptographic * LibTomCrypt is a library that provides various cryptographic
* algorithms in a highly modular and flexible manner. * algorithms in a highly modular and flexible manner.
* *
* The library is free for all purposes without any express * The library is free for all purposes without any express
* guarantee it works. * guarantee it works.
* *
* Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
*/ */
/** /**
DES code submitted by Dobes Vandermeer DES code submitted by Dobes Vandermeer
*/ */
#define ROLc(x, y) \ #define ROLc(x, y) \
((((unsigned long) (x) << (unsigned long) ((y) & 31)) | \ ((((unsigned long) (x) << (unsigned long) ((y) & 31)) | \
(((unsigned long) (x) & 0xFFFFFFFFUL) >> \ (((unsigned long) (x) & 0xFFFFFFFFUL) >> \
(unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL) (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
#define RORc(x, y) \ #define RORc(x, y) \
(((((unsigned long) (x) & 0xFFFFFFFFUL) >> \ (((((unsigned long) (x) & 0xFFFFFFFFUL) >> \
(unsigned long) ((y) & 31)) | \ (unsigned long) ((y) & 31)) | \
((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & \ ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & \
0xFFFFFFFFUL) 0xFFFFFFFFUL)
static const u32 bytebit[8] = static const u32 bytebit[8] =
{ {
0200, 0100, 040, 020, 010, 04, 02, 01 0200, 0100, 040, 020, 010, 04, 02, 01
}; };
static const u32 bigbyte[24] = static const u32 bigbyte[24] =
{ {
0x800000UL, 0x400000UL, 0x200000UL, 0x100000UL, 0x800000UL, 0x400000UL, 0x200000UL, 0x100000UL,
0x80000UL, 0x40000UL, 0x20000UL, 0x10000UL, 0x80000UL, 0x40000UL, 0x20000UL, 0x10000UL,
0x8000UL, 0x4000UL, 0x2000UL, 0x1000UL, 0x8000UL, 0x4000UL, 0x2000UL, 0x1000UL,
0x800UL, 0x400UL, 0x200UL, 0x100UL, 0x800UL, 0x400UL, 0x200UL, 0x100UL,
0x80UL, 0x40UL, 0x20UL, 0x10UL, 0x80UL, 0x40UL, 0x20UL, 0x10UL,
0x8UL, 0x4UL, 0x2UL, 0x1L 0x8UL, 0x4UL, 0x2UL, 0x1L
}; };
/* Use the key schedule specific in the standard (ANSI X3.92-1981) */ /* Use the key schedule specific in the standard (ANSI X3.92-1981) */
static const u8 pc1[56] = { static const u8 pc1[56] = {
56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,
9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,
13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3
}; };
static const u8 totrot[16] = { static const u8 totrot[16] = {
1, 2, 4, 6, 1, 2, 4, 6,
8, 10, 12, 14, 8, 10, 12, 14,
15, 17, 19, 21, 15, 17, 19, 21,
23, 25, 27, 28 23, 25, 27, 28
}; };
static const u8 pc2[48] = { static const u8 pc2[48] = {
13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31
}; };
static const u32 SP1[64] = static const u32 SP1[64] =
{ {
0x01010400UL, 0x00000000UL, 0x00010000UL, 0x01010404UL, 0x01010400UL, 0x00000000UL, 0x00010000UL, 0x01010404UL,
0x01010004UL, 0x00010404UL, 0x00000004UL, 0x00010000UL, 0x01010004UL, 0x00010404UL, 0x00000004UL, 0x00010000UL,
0x00000400UL, 0x01010400UL, 0x01010404UL, 0x00000400UL, 0x00000400UL, 0x01010400UL, 0x01010404UL, 0x00000400UL,
0x01000404UL, 0x01010004UL, 0x01000000UL, 0x00000004UL, 0x01000404UL, 0x01010004UL, 0x01000000UL, 0x00000004UL,
0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00010400UL, 0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00010400UL,
0x00010400UL, 0x01010000UL, 0x01010000UL, 0x01000404UL, 0x00010400UL, 0x01010000UL, 0x01010000UL, 0x01000404UL,
0x00010004UL, 0x01000004UL, 0x01000004UL, 0x00010004UL, 0x00010004UL, 0x01000004UL, 0x01000004UL, 0x00010004UL,
0x00000000UL, 0x00000404UL, 0x00010404UL, 0x01000000UL, 0x00000000UL, 0x00000404UL, 0x00010404UL, 0x01000000UL,
0x00010000UL, 0x01010404UL, 0x00000004UL, 0x01010000UL, 0x00010000UL, 0x01010404UL, 0x00000004UL, 0x01010000UL,
0x01010400UL, 0x01000000UL, 0x01000000UL, 0x00000400UL, 0x01010400UL, 0x01000000UL, 0x01000000UL, 0x00000400UL,
0x01010004UL, 0x00010000UL, 0x00010400UL, 0x01000004UL, 0x01010004UL, 0x00010000UL, 0x00010400UL, 0x01000004UL,
0x00000400UL, 0x00000004UL, 0x01000404UL, 0x00010404UL, 0x00000400UL, 0x00000004UL, 0x01000404UL, 0x00010404UL,
0x01010404UL, 0x00010004UL, 0x01010000UL, 0x01000404UL, 0x01010404UL, 0x00010004UL, 0x01010000UL, 0x01000404UL,
0x01000004UL, 0x00000404UL, 0x00010404UL, 0x01010400UL, 0x01000004UL, 0x00000404UL, 0x00010404UL, 0x01010400UL,
0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00000000UL, 0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00000000UL,
0x00010004UL, 0x00010400UL, 0x00000000UL, 0x01010004UL 0x00010004UL, 0x00010400UL, 0x00000000UL, 0x01010004UL
}; };
static const u32 SP2[64] = static const u32 SP2[64] =
{ {
0x80108020UL, 0x80008000UL, 0x00008000UL, 0x00108020UL, 0x80108020UL, 0x80008000UL, 0x00008000UL, 0x00108020UL,
0x00100000UL, 0x00000020UL, 0x80100020UL, 0x80008020UL, 0x00100000UL, 0x00000020UL, 0x80100020UL, 0x80008020UL,
0x80000020UL, 0x80108020UL, 0x80108000UL, 0x80000000UL, 0x80000020UL, 0x80108020UL, 0x80108000UL, 0x80000000UL,
0x80008000UL, 0x00100000UL, 0x00000020UL, 0x80100020UL, 0x80008000UL, 0x00100000UL, 0x00000020UL, 0x80100020UL,
0x00108000UL, 0x00100020UL, 0x80008020UL, 0x00000000UL, 0x00108000UL, 0x00100020UL, 0x80008020UL, 0x00000000UL,
0x80000000UL, 0x00008000UL, 0x00108020UL, 0x80100000UL, 0x80000000UL, 0x00008000UL, 0x00108020UL, 0x80100000UL,
0x00100020UL, 0x80000020UL, 0x00000000UL, 0x00108000UL, 0x00100020UL, 0x80000020UL, 0x00000000UL, 0x00108000UL,
0x00008020UL, 0x80108000UL, 0x80100000UL, 0x00008020UL, 0x00008020UL, 0x80108000UL, 0x80100000UL, 0x00008020UL,
0x00000000UL, 0x00108020UL, 0x80100020UL, 0x00100000UL, 0x00000000UL, 0x00108020UL, 0x80100020UL, 0x00100000UL,
0x80008020UL, 0x80100000UL, 0x80108000UL, 0x00008000UL, 0x80008020UL, 0x80100000UL, 0x80108000UL, 0x00008000UL,
0x80100000UL, 0x80008000UL, 0x00000020UL, 0x80108020UL, 0x80100000UL, 0x80008000UL, 0x00000020UL, 0x80108020UL,
0x00108020UL, 0x00000020UL, 0x00008000UL, 0x80000000UL, 0x00108020UL, 0x00000020UL, 0x00008000UL, 0x80000000UL,
0x00008020UL, 0x80108000UL, 0x00100000UL, 0x80000020UL, 0x00008020UL, 0x80108000UL, 0x00100000UL, 0x80000020UL,
0x00100020UL, 0x80008020UL, 0x80000020UL, 0x00100020UL, 0x00100020UL, 0x80008020UL, 0x80000020UL, 0x00100020UL,
0x00108000UL, 0x00000000UL, 0x80008000UL, 0x00008020UL, 0x00108000UL, 0x00000000UL, 0x80008000UL, 0x00008020UL,
0x80000000UL, 0x80100020UL, 0x80108020UL, 0x00108000UL 0x80000000UL, 0x80100020UL, 0x80108020UL, 0x00108000UL
}; };
static const u32 SP3[64] = static const u32 SP3[64] =
{ {
0x00000208UL, 0x08020200UL, 0x00000000UL, 0x08020008UL, 0x00000208UL, 0x08020200UL, 0x00000000UL, 0x08020008UL,
0x08000200UL, 0x00000000UL, 0x00020208UL, 0x08000200UL, 0x08000200UL, 0x00000000UL, 0x00020208UL, 0x08000200UL,
0x00020008UL, 0x08000008UL, 0x08000008UL, 0x00020000UL, 0x00020008UL, 0x08000008UL, 0x08000008UL, 0x00020000UL,
0x08020208UL, 0x00020008UL, 0x08020000UL, 0x00000208UL, 0x08020208UL, 0x00020008UL, 0x08020000UL, 0x00000208UL,
0x08000000UL, 0x00000008UL, 0x08020200UL, 0x00000200UL, 0x08000000UL, 0x00000008UL, 0x08020200UL, 0x00000200UL,
0x00020200UL, 0x08020000UL, 0x08020008UL, 0x00020208UL, 0x00020200UL, 0x08020000UL, 0x08020008UL, 0x00020208UL,
0x08000208UL, 0x00020200UL, 0x00020000UL, 0x08000208UL, 0x08000208UL, 0x00020200UL, 0x00020000UL, 0x08000208UL,
0x00000008UL, 0x08020208UL, 0x00000200UL, 0x08000000UL, 0x00000008UL, 0x08020208UL, 0x00000200UL, 0x08000000UL,
0x08020200UL, 0x08000000UL, 0x00020008UL, 0x00000208UL, 0x08020200UL, 0x08000000UL, 0x00020008UL, 0x00000208UL,
0x00020000UL, 0x08020200UL, 0x08000200UL, 0x00000000UL, 0x00020000UL, 0x08020200UL, 0x08000200UL, 0x00000000UL,
0x00000200UL, 0x00020008UL, 0x08020208UL, 0x08000200UL, 0x00000200UL, 0x00020008UL, 0x08020208UL, 0x08000200UL,
0x08000008UL, 0x00000200UL, 0x00000000UL, 0x08020008UL, 0x08000008UL, 0x00000200UL, 0x00000000UL, 0x08020008UL,
0x08000208UL, 0x00020000UL, 0x08000000UL, 0x08020208UL, 0x08000208UL, 0x00020000UL, 0x08000000UL, 0x08020208UL,
0x00000008UL, 0x00020208UL, 0x00020200UL, 0x08000008UL, 0x00000008UL, 0x00020208UL, 0x00020200UL, 0x08000008UL,
0x08020000UL, 0x08000208UL, 0x00000208UL, 0x08020000UL, 0x08020000UL, 0x08000208UL, 0x00000208UL, 0x08020000UL,
0x00020208UL, 0x00000008UL, 0x08020008UL, 0x00020200UL 0x00020208UL, 0x00000008UL, 0x08020008UL, 0x00020200UL
}; };
static const u32 SP4[64] = static const u32 SP4[64] =
{ {
0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL, 0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL,
0x00802080UL, 0x00800081UL, 0x00800001UL, 0x00002001UL, 0x00802080UL, 0x00800081UL, 0x00800001UL, 0x00002001UL,
0x00000000UL, 0x00802000UL, 0x00802000UL, 0x00802081UL, 0x00000000UL, 0x00802000UL, 0x00802000UL, 0x00802081UL,
0x00000081UL, 0x00000000UL, 0x00800080UL, 0x00800001UL, 0x00000081UL, 0x00000000UL, 0x00800080UL, 0x00800001UL,
0x00000001UL, 0x00002000UL, 0x00800000UL, 0x00802001UL, 0x00000001UL, 0x00002000UL, 0x00800000UL, 0x00802001UL,
0x00000080UL, 0x00800000UL, 0x00002001UL, 0x00002080UL, 0x00000080UL, 0x00800000UL, 0x00002001UL, 0x00002080UL,
0x00800081UL, 0x00000001UL, 0x00002080UL, 0x00800080UL, 0x00800081UL, 0x00000001UL, 0x00002080UL, 0x00800080UL,
0x00002000UL, 0x00802080UL, 0x00802081UL, 0x00000081UL, 0x00002000UL, 0x00802080UL, 0x00802081UL, 0x00000081UL,
0x00800080UL, 0x00800001UL, 0x00802000UL, 0x00802081UL, 0x00800080UL, 0x00800001UL, 0x00802000UL, 0x00802081UL,
0x00000081UL, 0x00000000UL, 0x00000000UL, 0x00802000UL, 0x00000081UL, 0x00000000UL, 0x00000000UL, 0x00802000UL,
0x00002080UL, 0x00800080UL, 0x00800081UL, 0x00000001UL, 0x00002080UL, 0x00800080UL, 0x00800081UL, 0x00000001UL,
0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL, 0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL,
0x00802081UL, 0x00000081UL, 0x00000001UL, 0x00002000UL, 0x00802081UL, 0x00000081UL, 0x00000001UL, 0x00002000UL,
0x00800001UL, 0x00002001UL, 0x00802080UL, 0x00800081UL, 0x00800001UL, 0x00002001UL, 0x00802080UL, 0x00800081UL,
0x00002001UL, 0x00002080UL, 0x00800000UL, 0x00802001UL, 0x00002001UL, 0x00002080UL, 0x00800000UL, 0x00802001UL,
0x00000080UL, 0x00800000UL, 0x00002000UL, 0x00802080UL 0x00000080UL, 0x00800000UL, 0x00002000UL, 0x00802080UL
}; };
static const u32 SP5[64] = static const u32 SP5[64] =
{ {
0x00000100UL, 0x02080100UL, 0x02080000UL, 0x42000100UL, 0x00000100UL, 0x02080100UL, 0x02080000UL, 0x42000100UL,
0x00080000UL, 0x00000100UL, 0x40000000UL, 0x02080000UL, 0x00080000UL, 0x00000100UL, 0x40000000UL, 0x02080000UL,
0x40080100UL, 0x00080000UL, 0x02000100UL, 0x40080100UL, 0x40080100UL, 0x00080000UL, 0x02000100UL, 0x40080100UL,
0x42000100UL, 0x42080000UL, 0x00080100UL, 0x40000000UL, 0x42000100UL, 0x42080000UL, 0x00080100UL, 0x40000000UL,
0x02000000UL, 0x40080000UL, 0x40080000UL, 0x00000000UL, 0x02000000UL, 0x40080000UL, 0x40080000UL, 0x00000000UL,
0x40000100UL, 0x42080100UL, 0x42080100UL, 0x02000100UL, 0x40000100UL, 0x42080100UL, 0x42080100UL, 0x02000100UL,
0x42080000UL, 0x40000100UL, 0x00000000UL, 0x42000000UL, 0x42080000UL, 0x40000100UL, 0x00000000UL, 0x42000000UL,
0x02080100UL, 0x02000000UL, 0x42000000UL, 0x00080100UL, 0x02080100UL, 0x02000000UL, 0x42000000UL, 0x00080100UL,
0x00080000UL, 0x42000100UL, 0x00000100UL, 0x02000000UL, 0x00080000UL, 0x42000100UL, 0x00000100UL, 0x02000000UL,
0x40000000UL, 0x02080000UL, 0x42000100UL, 0x40080100UL, 0x40000000UL, 0x02080000UL, 0x42000100UL, 0x40080100UL,
0x02000100UL, 0x40000000UL, 0x42080000UL, 0x02080100UL, 0x02000100UL, 0x40000000UL, 0x42080000UL, 0x02080100UL,
0x40080100UL, 0x00000100UL, 0x02000000UL, 0x42080000UL, 0x40080100UL, 0x00000100UL, 0x02000000UL, 0x42080000UL,
0x42080100UL, 0x00080100UL, 0x42000000UL, 0x42080100UL, 0x42080100UL, 0x00080100UL, 0x42000000UL, 0x42080100UL,
0x02080000UL, 0x00000000UL, 0x40080000UL, 0x42000000UL, 0x02080000UL, 0x00000000UL, 0x40080000UL, 0x42000000UL,
0x00080100UL, 0x02000100UL, 0x40000100UL, 0x00080000UL, 0x00080100UL, 0x02000100UL, 0x40000100UL, 0x00080000UL,
0x00000000UL, 0x40080000UL, 0x02080100UL, 0x40000100UL 0x00000000UL, 0x40080000UL, 0x02080100UL, 0x40000100UL
}; };
static const u32 SP6[64] = static const u32 SP6[64] =
{ {
0x20000010UL, 0x20400000UL, 0x00004000UL, 0x20404010UL, 0x20000010UL, 0x20400000UL, 0x00004000UL, 0x20404010UL,
0x20400000UL, 0x00000010UL, 0x20404010UL, 0x00400000UL, 0x20400000UL, 0x00000010UL, 0x20404010UL, 0x00400000UL,
0x20004000UL, 0x00404010UL, 0x00400000UL, 0x20000010UL, 0x20004000UL, 0x00404010UL, 0x00400000UL, 0x20000010UL,
0x00400010UL, 0x20004000UL, 0x20000000UL, 0x00004010UL, 0x00400010UL, 0x20004000UL, 0x20000000UL, 0x00004010UL,
0x00000000UL, 0x00400010UL, 0x20004010UL, 0x00004000UL, 0x00000000UL, 0x00400010UL, 0x20004010UL, 0x00004000UL,
0x00404000UL, 0x20004010UL, 0x00000010UL, 0x20400010UL, 0x00404000UL, 0x20004010UL, 0x00000010UL, 0x20400010UL,
0x20400010UL, 0x00000000UL, 0x00404010UL, 0x20404000UL, 0x20400010UL, 0x00000000UL, 0x00404010UL, 0x20404000UL,
0x00004010UL, 0x00404000UL, 0x20404000UL, 0x20000000UL, 0x00004010UL, 0x00404000UL, 0x20404000UL, 0x20000000UL,
0x20004000UL, 0x00000010UL, 0x20400010UL, 0x00404000UL, 0x20004000UL, 0x00000010UL, 0x20400010UL, 0x00404000UL,
0x20404010UL, 0x00400000UL, 0x00004010UL, 0x20000010UL, 0x20404010UL, 0x00400000UL, 0x00004010UL, 0x20000010UL,
0x00400000UL, 0x20004000UL, 0x20000000UL, 0x00004010UL, 0x00400000UL, 0x20004000UL, 0x20000000UL, 0x00004010UL,
0x20000010UL, 0x20404010UL, 0x00404000UL, 0x20400000UL, 0x20000010UL, 0x20404010UL, 0x00404000UL, 0x20400000UL,
0x00404010UL, 0x20404000UL, 0x00000000UL, 0x20400010UL, 0x00404010UL, 0x20404000UL, 0x00000000UL, 0x20400010UL,
0x00000010UL, 0x00004000UL, 0x20400000UL, 0x00404010UL, 0x00000010UL, 0x00004000UL, 0x20400000UL, 0x00404010UL,
0x00004000UL, 0x00400010UL, 0x20004010UL, 0x00000000UL, 0x00004000UL, 0x00400010UL, 0x20004010UL, 0x00000000UL,
0x20404000UL, 0x20000000UL, 0x00400010UL, 0x20004010UL 0x20404000UL, 0x20000000UL, 0x00400010UL, 0x20004010UL
}; };
static const u32 SP7[64] = static const u32 SP7[64] =
{ {
0x00200000UL, 0x04200002UL, 0x04000802UL, 0x00000000UL, 0x00200000UL, 0x04200002UL, 0x04000802UL, 0x00000000UL,
0x00000800UL, 0x04000802UL, 0x00200802UL, 0x04200800UL, 0x00000800UL, 0x04000802UL, 0x00200802UL, 0x04200800UL,
0x04200802UL, 0x00200000UL, 0x00000000UL, 0x04000002UL, 0x04200802UL, 0x00200000UL, 0x00000000UL, 0x04000002UL,
0x00000002UL, 0x04000000UL, 0x04200002UL, 0x00000802UL, 0x00000002UL, 0x04000000UL, 0x04200002UL, 0x00000802UL,
0x04000800UL, 0x00200802UL, 0x00200002UL, 0x04000800UL, 0x04000800UL, 0x00200802UL, 0x00200002UL, 0x04000800UL,
0x04000002UL, 0x04200000UL, 0x04200800UL, 0x00200002UL, 0x04000002UL, 0x04200000UL, 0x04200800UL, 0x00200002UL,
0x04200000UL, 0x00000800UL, 0x00000802UL, 0x04200802UL, 0x04200000UL, 0x00000800UL, 0x00000802UL, 0x04200802UL,
0x00200800UL, 0x00000002UL, 0x04000000UL, 0x00200800UL, 0x00200800UL, 0x00000002UL, 0x04000000UL, 0x00200800UL,
0x04000000UL, 0x00200800UL, 0x00200000UL, 0x04000802UL, 0x04000000UL, 0x00200800UL, 0x00200000UL, 0x04000802UL,
0x04000802UL, 0x04200002UL, 0x04200002UL, 0x00000002UL, 0x04000802UL, 0x04200002UL, 0x04200002UL, 0x00000002UL,
0x00200002UL, 0x04000000UL, 0x04000800UL, 0x00200000UL, 0x00200002UL, 0x04000000UL, 0x04000800UL, 0x00200000UL,
0x04200800UL, 0x00000802UL, 0x00200802UL, 0x04200800UL, 0x04200800UL, 0x00000802UL, 0x00200802UL, 0x04200800UL,
0x00000802UL, 0x04000002UL, 0x04200802UL, 0x04200000UL, 0x00000802UL, 0x04000002UL, 0x04200802UL, 0x04200000UL,
0x00200800UL, 0x00000000UL, 0x00000002UL, 0x04200802UL, 0x00200800UL, 0x00000000UL, 0x00000002UL, 0x04200802UL,
0x00000000UL, 0x00200802UL, 0x04200000UL, 0x00000800UL, 0x00000000UL, 0x00200802UL, 0x04200000UL, 0x00000800UL,
0x04000002UL, 0x04000800UL, 0x00000800UL, 0x00200002UL 0x04000002UL, 0x04000800UL, 0x00000800UL, 0x00200002UL
}; };
static const u32 SP8[64] = static const u32 SP8[64] =
{ {
0x10001040UL, 0x00001000UL, 0x00040000UL, 0x10041040UL, 0x10001040UL, 0x00001000UL, 0x00040000UL, 0x10041040UL,
0x10000000UL, 0x10001040UL, 0x00000040UL, 0x10000000UL, 0x10000000UL, 0x10001040UL, 0x00000040UL, 0x10000000UL,
0x00040040UL, 0x10040000UL, 0x10041040UL, 0x00041000UL, 0x00040040UL, 0x10040000UL, 0x10041040UL, 0x00041000UL,
0x10041000UL, 0x00041040UL, 0x00001000UL, 0x00000040UL, 0x10041000UL, 0x00041040UL, 0x00001000UL, 0x00000040UL,
0x10040000UL, 0x10000040UL, 0x10001000UL, 0x00001040UL, 0x10040000UL, 0x10000040UL, 0x10001000UL, 0x00001040UL,
0x00041000UL, 0x00040040UL, 0x10040040UL, 0x10041000UL, 0x00041000UL, 0x00040040UL, 0x10040040UL, 0x10041000UL,
0x00001040UL, 0x00000000UL, 0x00000000UL, 0x10040040UL, 0x00001040UL, 0x00000000UL, 0x00000000UL, 0x10040040UL,
0x10000040UL, 0x10001000UL, 0x00041040UL, 0x00040000UL, 0x10000040UL, 0x10001000UL, 0x00041040UL, 0x00040000UL,
0x00041040UL, 0x00040000UL, 0x10041000UL, 0x00001000UL, 0x00041040UL, 0x00040000UL, 0x10041000UL, 0x00001000UL,
0x00000040UL, 0x10040040UL, 0x00001000UL, 0x00041040UL, 0x00000040UL, 0x10040040UL, 0x00001000UL, 0x00041040UL,
0x10001000UL, 0x00000040UL, 0x10000040UL, 0x10040000UL, 0x10001000UL, 0x00000040UL, 0x10000040UL, 0x10040000UL,
0x10040040UL, 0x10000000UL, 0x00040000UL, 0x10001040UL, 0x10040040UL, 0x10000000UL, 0x00040000UL, 0x10001040UL,
0x00000000UL, 0x10041040UL, 0x00040040UL, 0x10000040UL, 0x00000000UL, 0x10041040UL, 0x00040040UL, 0x10000040UL,
0x10040000UL, 0x10001000UL, 0x10001040UL, 0x00000000UL, 0x10040000UL, 0x10001000UL, 0x10001040UL, 0x00000000UL,
0x10041040UL, 0x00041000UL, 0x00041000UL, 0x00001040UL, 0x10041040UL, 0x00041000UL, 0x00041000UL, 0x00001040UL,
0x00001040UL, 0x00040040UL, 0x10000000UL, 0x10041000UL 0x00001040UL, 0x00040040UL, 0x10000000UL, 0x10041000UL
}; };
static void cookey(const u32 *raw1, u32 *keyout) static void cookey(const u32 *raw1, u32 *keyout)
{ {
u32 *cook; u32 *cook;
const u32 *raw0; const u32 *raw0;
u32 dough[32]; u32 dough[32];
int i; int i;
cook = dough; cook = dough;
for (i = 0; i < 16; i++, raw1++) { for (i = 0; i < 16; i++, raw1++) {
raw0 = raw1++; raw0 = raw1++;
*cook = (*raw0 & 0x00fc0000L) << 6; *cook = (*raw0 & 0x00fc0000L) << 6;
*cook |= (*raw0 & 0x00000fc0L) << 10; *cook |= (*raw0 & 0x00000fc0L) << 10;
*cook |= (*raw1 & 0x00fc0000L) >> 10; *cook |= (*raw1 & 0x00fc0000L) >> 10;
*cook++ |= (*raw1 & 0x00000fc0L) >> 6; *cook++ |= (*raw1 & 0x00000fc0L) >> 6;
*cook = (*raw0 & 0x0003f000L) << 12; *cook = (*raw0 & 0x0003f000L) << 12;
*cook |= (*raw0 & 0x0000003fL) << 16; *cook |= (*raw0 & 0x0000003fL) << 16;
*cook |= (*raw1 & 0x0003f000L) >> 4; *cook |= (*raw1 & 0x0003f000L) >> 4;
*cook++ |= (*raw1 & 0x0000003fL); *cook++ |= (*raw1 & 0x0000003fL);
} }
os_memcpy(keyout, dough, sizeof(dough)); os_memcpy(keyout, dough, sizeof(dough));
} }
static void deskey(const u8 *key, int decrypt, u32 *keyout) static void deskey(const u8 *key, int decrypt, u32 *keyout)
{ {
u32 i, j, l, m, n, kn[32]; u32 i, j, l, m, n, kn[32];
u8 pc1m[56], pcr[56]; u8 pc1m[56], pcr[56];
for (j = 0; j < 56; j++) { for (j = 0; j < 56; j++) {
l = (u32) pc1[j]; l = (u32) pc1[j];
m = l & 7; m = l & 7;
pc1m[j] = (u8) pc1m[j] = (u8)
((key[l >> 3U] & bytebit[m]) == bytebit[m] ? 1 : 0); ((key[l >> 3U] & bytebit[m]) == bytebit[m] ? 1 : 0);
} }
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
if (decrypt) if (decrypt)
m = (15 - i) << 1; m = (15 - i) << 1;
else else
m = i << 1; m = i << 1;
n = m + 1; n = m + 1;
kn[m] = kn[n] = 0L; kn[m] = kn[n] = 0L;
for (j = 0; j < 28; j++) { for (j = 0; j < 28; j++) {
l = j + (u32) totrot[i]; l = j + (u32) totrot[i];
if (l < 28) if (l < 28)
pcr[j] = pc1m[l]; pcr[j] = pc1m[l];
else else
pcr[j] = pc1m[l - 28]; pcr[j] = pc1m[l - 28];
} }
for (/* j = 28 */; j < 56; j++) { for (/* j = 28 */; j < 56; j++) {
l = j + (u32) totrot[i]; l = j + (u32) totrot[i];
if (l < 56) if (l < 56)
pcr[j] = pc1m[l]; pcr[j] = pc1m[l];
else else
pcr[j] = pc1m[l - 28]; pcr[j] = pc1m[l - 28];
} }
for (j = 0; j < 24; j++) { for (j = 0; j < 24; j++) {
if ((int) pcr[(int) pc2[j]] != 0) if ((int) pcr[(int) pc2[j]] != 0)
kn[m] |= bigbyte[j]; kn[m] |= bigbyte[j];
if ((int) pcr[(int) pc2[j + 24]] != 0) if ((int) pcr[(int) pc2[j + 24]] != 0)
kn[n] |= bigbyte[j]; kn[n] |= bigbyte[j];
} }
} }
cookey(kn, keyout); cookey(kn, keyout);
} }
static void desfunc(u32 *block, const u32 *keys) static void desfunc(u32 *block, const u32 *keys)
{ {
u32 work, right, leftt; u32 work, right, leftt;
int cur_round; int cur_round;
leftt = block[0]; leftt = block[0];
right = block[1]; right = block[1];
work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL; work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL;
right ^= work; right ^= work;
leftt ^= (work << 4); leftt ^= (work << 4);
work = ((leftt >> 16) ^ right) & 0x0000ffffL; work = ((leftt >> 16) ^ right) & 0x0000ffffL;
right ^= work; right ^= work;
leftt ^= (work << 16); leftt ^= (work << 16);
work = ((right >> 2) ^ leftt) & 0x33333333L; work = ((right >> 2) ^ leftt) & 0x33333333L;
leftt ^= work; leftt ^= work;
right ^= (work << 2); right ^= (work << 2);
work = ((right >> 8) ^ leftt) & 0x00ff00ffL; work = ((right >> 8) ^ leftt) & 0x00ff00ffL;
leftt ^= work; leftt ^= work;
right ^= (work << 8); right ^= (work << 8);
right = ROLc(right, 1); right = ROLc(right, 1);
work = (leftt ^ right) & 0xaaaaaaaaL; work = (leftt ^ right) & 0xaaaaaaaaL;
leftt ^= work; leftt ^= work;
right ^= work; right ^= work;
leftt = ROLc(leftt, 1); leftt = ROLc(leftt, 1);
for (cur_round = 0; cur_round < 8; cur_round++) { for (cur_round = 0; cur_round < 8; cur_round++) {
work = RORc(right, 4) ^ *keys++; work = RORc(right, 4) ^ *keys++;
leftt ^= SP7[work & 0x3fL] leftt ^= SP7[work & 0x3fL]
^ SP5[(work >> 8) & 0x3fL] ^ SP5[(work >> 8) & 0x3fL]
^ SP3[(work >> 16) & 0x3fL] ^ SP3[(work >> 16) & 0x3fL]
^ SP1[(work >> 24) & 0x3fL]; ^ SP1[(work >> 24) & 0x3fL];
work = right ^ *keys++; work = right ^ *keys++;
leftt ^= SP8[ work & 0x3fL] leftt ^= SP8[ work & 0x3fL]
^ SP6[(work >> 8) & 0x3fL] ^ SP6[(work >> 8) & 0x3fL]
^ SP4[(work >> 16) & 0x3fL] ^ SP4[(work >> 16) & 0x3fL]
^ SP2[(work >> 24) & 0x3fL]; ^ SP2[(work >> 24) & 0x3fL];
work = RORc(leftt, 4) ^ *keys++; work = RORc(leftt, 4) ^ *keys++;
right ^= SP7[ work & 0x3fL] right ^= SP7[ work & 0x3fL]
^ SP5[(work >> 8) & 0x3fL] ^ SP5[(work >> 8) & 0x3fL]
^ SP3[(work >> 16) & 0x3fL] ^ SP3[(work >> 16) & 0x3fL]
^ SP1[(work >> 24) & 0x3fL]; ^ SP1[(work >> 24) & 0x3fL];
work = leftt ^ *keys++; work = leftt ^ *keys++;
right ^= SP8[ work & 0x3fL] right ^= SP8[ work & 0x3fL]
^ SP6[(work >> 8) & 0x3fL] ^ SP6[(work >> 8) & 0x3fL]
^ SP4[(work >> 16) & 0x3fL] ^ SP4[(work >> 16) & 0x3fL]
^ SP2[(work >> 24) & 0x3fL]; ^ SP2[(work >> 24) & 0x3fL];
} }
right = RORc(right, 1); right = RORc(right, 1);
work = (leftt ^ right) & 0xaaaaaaaaL; work = (leftt ^ right) & 0xaaaaaaaaL;
leftt ^= work; leftt ^= work;
right ^= work; right ^= work;
leftt = RORc(leftt, 1); leftt = RORc(leftt, 1);
work = ((leftt >> 8) ^ right) & 0x00ff00ffL; work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
right ^= work; right ^= work;
leftt ^= (work << 8); leftt ^= (work << 8);
/* -- */ /* -- */
work = ((leftt >> 2) ^ right) & 0x33333333L; work = ((leftt >> 2) ^ right) & 0x33333333L;
right ^= work; right ^= work;
leftt ^= (work << 2); leftt ^= (work << 2);
work = ((right >> 16) ^ leftt) & 0x0000ffffL; work = ((right >> 16) ^ leftt) & 0x0000ffffL;
leftt ^= work; leftt ^= work;
right ^= (work << 16); right ^= (work << 16);
work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL; work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
leftt ^= work; leftt ^= work;
right ^= (work << 4); right ^= (work << 4);
block[0] = right; block[0] = right;
block[1] = leftt; block[1] = leftt;
} }
/* wpa_supplicant/hostapd specific wrapper */ /* wpa_supplicant/hostapd specific wrapper */
void des_encrypt(const u8 *clear, const u8 *key, u8 *cypher) void des_encrypt(const u8 *clear, const u8 *key, u8 *cypher)
{ {
u8 pkey[8], next, tmp; u8 pkey[8], next, tmp;
int i; int i;
u32 ek[32], work[2]; u32 ek[32], work[2];
/* Add parity bits to the key */ /* Add parity bits to the key */
next = 0; next = 0;
for (i = 0; i < 7; i++) { for (i = 0; i < 7; i++) {
tmp = key[i]; tmp = key[i];
pkey[i] = (tmp >> i) | next | 1; pkey[i] = (tmp >> i) | next | 1;
next = tmp << (7 - i); next = tmp << (7 - i);
} }
pkey[i] = next | 1; pkey[i] = next | 1;
deskey(pkey, 0, ek); deskey(pkey, 0, ek);
work[0] = WPA_GET_BE32(clear); work[0] = WPA_GET_BE32(clear);
work[1] = WPA_GET_BE32(clear + 4); work[1] = WPA_GET_BE32(clear + 4);
desfunc(work, ek); desfunc(work, ek);
WPA_PUT_BE32(cypher, work[0]); WPA_PUT_BE32(cypher, work[0]);
WPA_PUT_BE32(cypher + 4, work[1]); WPA_PUT_BE32(cypher + 4, work[1]);
os_memset(pkey, 0, sizeof(pkey)); os_memset(pkey, 0, sizeof(pkey));
os_memset(ek, 0, sizeof(ek)); os_memset(ek, 0, sizeof(ek));
} }
/* /*
void des_key_setup(const u8 *key, u32 *ek, u32 *dk) void des_key_setup(const u8 *key, u32 *ek, u32 *dk)
{ {
deskey(key, 0, ek); deskey(key, 0, ek);
deskey(key, 1, dk); deskey(key, 1, dk);
} }
void des_block_encrypt(const u8 *plain, const u32 *ek, u8 *crypt) void des_block_encrypt(const u8 *plain, const u32 *ek, u8 *crypt)
{ {
u32 work[2]; u32 work[2];
work[0] = WPA_GET_BE32(plain); work[0] = WPA_GET_BE32(plain);
work[1] = WPA_GET_BE32(plain + 4); work[1] = WPA_GET_BE32(plain + 4);
desfunc(work, ek); desfunc(work, ek);
WPA_PUT_BE32(crypt, work[0]); WPA_PUT_BE32(crypt, work[0]);
WPA_PUT_BE32(crypt + 4, work[1]); WPA_PUT_BE32(crypt + 4, work[1]);
} }
void des_block_decrypt(const u8 *crypt, const u32 *dk, u8 *plain) void des_block_decrypt(const u8 *crypt, const u32 *dk, u8 *plain)
{ {
u32 work[2]; u32 work[2];
work[0] = WPA_GET_BE32(crypt); work[0] = WPA_GET_BE32(crypt);
work[1] = WPA_GET_BE32(crypt + 4); work[1] = WPA_GET_BE32(crypt + 4);
desfunc(work, dk); desfunc(work, dk);
WPA_PUT_BE32(plain, work[0]); WPA_PUT_BE32(plain, work[0]);
WPA_PUT_BE32(plain + 4, work[1]); WPA_PUT_BE32(plain + 4, work[1]);
} }
void des3_key_setup(const u8 *key, struct des3_key_s *dkey) void des3_key_setup(const u8 *key, struct des3_key_s *dkey)
{ {
deskey(key, 0, dkey->ek[0]); deskey(key, 0, dkey->ek[0]);
deskey(key + 8, 1, dkey->ek[1]); deskey(key + 8, 1, dkey->ek[1]);
deskey(key + 16, 0, dkey->ek[2]); deskey(key + 16, 0, dkey->ek[2]);
deskey(key, 1, dkey->dk[2]); deskey(key, 1, dkey->dk[2]);
deskey(key + 8, 0, dkey->dk[1]); deskey(key + 8, 0, dkey->dk[1]);
deskey(key + 16, 1, dkey->dk[0]); deskey(key + 16, 1, dkey->dk[0]);
} }
void des3_encrypt(const u8 *plain, const struct des3_key_s *key, u8 *crypt) void des3_encrypt(const u8 *plain, const struct des3_key_s *key, u8 *crypt)
{ {
u32 work[2]; u32 work[2];
work[0] = WPA_GET_BE32(plain); work[0] = WPA_GET_BE32(plain);
work[1] = WPA_GET_BE32(plain + 4); work[1] = WPA_GET_BE32(plain + 4);
desfunc(work, key->ek[0]); desfunc(work, key->ek[0]);
desfunc(work, key->ek[1]); desfunc(work, key->ek[1]);
desfunc(work, key->ek[2]); desfunc(work, key->ek[2]);
WPA_PUT_BE32(crypt, work[0]); WPA_PUT_BE32(crypt, work[0]);
WPA_PUT_BE32(crypt + 4, work[1]); WPA_PUT_BE32(crypt + 4, work[1]);
} }
void des3_decrypt(const u8 *crypt, const struct des3_key_s *key, u8 *plain) void des3_decrypt(const u8 *crypt, const struct des3_key_s *key, u8 *plain)
{ {
u32 work[2]; u32 work[2];
work[0] = WPA_GET_BE32(crypt); work[0] = WPA_GET_BE32(crypt);
work[1] = WPA_GET_BE32(crypt + 4); work[1] = WPA_GET_BE32(crypt + 4);
desfunc(work, key->dk[0]); desfunc(work, key->dk[0]);
desfunc(work, key->dk[1]); desfunc(work, key->dk[1]);
desfunc(work, key->dk[2]); desfunc(work, key->dk[2]);
WPA_PUT_BE32(plain, work[0]); WPA_PUT_BE32(plain, work[0]);
WPA_PUT_BE32(plain + 4, work[1]); WPA_PUT_BE32(plain + 4, work[1]);
}*/ }*/

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,90 +1,90 @@
/* /*
* EAP-PEAP common routines * EAP-PEAP common routines
* Copyright (c) 2008-2011, Jouni Malinen <j@w1.fi> * Copyright (c) 2008-2011, Jouni Malinen <j@w1.fi>
* *
* This software may be distributed under the terms of the BSD license. * This software may be distributed under the terms of the BSD license.
* See README for more details. * See README for more details.
*/ */
#ifdef EAP_PEAP #ifdef EAP_PEAP
#include "wpa/includes.h" #include "wpa/includes.h"
#include "wpa/common.h" #include "wpa/common.h"
#include "crypto/sha1.h" #include "crypto/sha1.h"
#include "wpa2/eap_peer/eap_peap_common.h" #include "wpa2/eap_peer/eap_peap_common.h"
int int
peap_prfplus(int version, const u8 *key, size_t key_len, peap_prfplus(int version, const u8 *key, size_t key_len,
const char *label, const u8 *seed, size_t seed_len, const char *label, const u8 *seed, size_t seed_len,
u8 *buf, size_t buf_len) u8 *buf, size_t buf_len)
{ {
unsigned char counter = 0; unsigned char counter = 0;
size_t pos, plen; size_t pos, plen;
u8 hash[SHA1_MAC_LEN]; u8 hash[SHA1_MAC_LEN];
size_t label_len = os_strlen(label); size_t label_len = os_strlen(label);
u8 extra[2]; u8 extra[2];
const unsigned char *addr[5]; const unsigned char *addr[5];
size_t len[5]; size_t len[5];
addr[0] = hash; addr[0] = hash;
len[0] = 0; len[0] = 0;
addr[1] = (unsigned char *) label; addr[1] = (unsigned char *) label;
len[1] = label_len; len[1] = label_len;
addr[2] = seed; addr[2] = seed;
len[2] = seed_len; len[2] = seed_len;
if (version == 0) { if (version == 0) {
/* /*
* PRF+(K, S, LEN) = T1 | T2 | ... | Tn * PRF+(K, S, LEN) = T1 | T2 | ... | Tn
* T1 = HMAC-SHA1(K, S | 0x01 | 0x00 | 0x00) * T1 = HMAC-SHA1(K, S | 0x01 | 0x00 | 0x00)
* T2 = HMAC-SHA1(K, T1 | S | 0x02 | 0x00 | 0x00) * T2 = HMAC-SHA1(K, T1 | S | 0x02 | 0x00 | 0x00)
* ... * ...
* Tn = HMAC-SHA1(K, Tn-1 | S | n | 0x00 | 0x00) * Tn = HMAC-SHA1(K, Tn-1 | S | n | 0x00 | 0x00)
*/ */
extra[0] = 0; extra[0] = 0;
extra[1] = 0; extra[1] = 0;
addr[3] = &counter; addr[3] = &counter;
len[3] = 1; len[3] = 1;
addr[4] = extra; addr[4] = extra;
len[4] = 2; len[4] = 2;
} else { } else {
/* /*
* PRF (K,S,LEN) = T1 | T2 | T3 | T4 | ... where: * PRF (K,S,LEN) = T1 | T2 | T3 | T4 | ... where:
* T1 = HMAC-SHA1(K, S | LEN | 0x01) * T1 = HMAC-SHA1(K, S | LEN | 0x01)
* T2 = HMAC-SHA1 (K, T1 | S | LEN | 0x02) * T2 = HMAC-SHA1 (K, T1 | S | LEN | 0x02)
* T3 = HMAC-SHA1 (K, T2 | S | LEN | 0x03) * T3 = HMAC-SHA1 (K, T2 | S | LEN | 0x03)
* T4 = HMAC-SHA1 (K, T3 | S | LEN | 0x04) * T4 = HMAC-SHA1 (K, T3 | S | LEN | 0x04)
* ... * ...
*/ */
extra[0] = buf_len & 0xff; extra[0] = buf_len & 0xff;
addr[3] = extra; addr[3] = extra;
len[3] = 1; len[3] = 1;
addr[4] = &counter; addr[4] = &counter;
len[4] = 1; len[4] = 1;
} }
pos = 0; pos = 0;
while (pos < buf_len) { while (pos < buf_len) {
counter++; counter++;
plen = buf_len - pos; plen = buf_len - pos;
if (hmac_sha1_vector(key, key_len, 5, addr, len, hash) < 0) if (hmac_sha1_vector(key, key_len, 5, addr, len, hash) < 0)
return -1; return -1;
if (plen >= SHA1_MAC_LEN) { if (plen >= SHA1_MAC_LEN) {
os_memcpy(&buf[pos], hash, SHA1_MAC_LEN); os_memcpy(&buf[pos], hash, SHA1_MAC_LEN);
pos += SHA1_MAC_LEN; pos += SHA1_MAC_LEN;
} else { } else {
os_memcpy(&buf[pos], hash, plen); os_memcpy(&buf[pos], hash, plen);
break; break;
} }
len[0] = SHA1_MAC_LEN; len[0] = SHA1_MAC_LEN;
} }
return 0; return 0;
} }
#endif /* EAP_PEAP */ #endif /* EAP_PEAP */

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,16 @@
# Documentation Source Folder # Documentation Source Folder
This folder contains source files of **ESP-IDF documentation** available in [English](https://docs.espressif.com/projects/esp-idf/en/latest/) and [中文](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/). This folder contains source files of **ESP-IDF documentation** available in [English](https://docs.espressif.com/projects/esp-idf/en/latest/) and [中文](https://docs.espressif.com/projects/esp-idf/zh_CN/latest/).
The sources do not render well in GitHub and some information is not visible at all. The sources do not render well in GitHub and some information is not visible at all.
Use actual documentation generated within about 20 minutes on each commit: Use actual documentation generated within about 20 minutes on each commit:
# Hosted Documentation # Hosted Documentation
* English: https://docs.espressif.com/projects/esp-idf/en/latest/ * English: https://docs.espressif.com/projects/esp-idf/en/latest/
* 中文: https://docs.espressif.com/projects/esp-idf/zh_CN/latest/ * 中文: https://docs.espressif.com/projects/esp-idf/zh_CN/latest/
The above URLs are all for the master branch latest version. Click the drop-down in the bottom left to choose a stable version or to download a PDF. The above URLs are all for the master branch latest version. Click the drop-down in the bottom left to choose a stable version or to download a PDF.

View File

@@ -1,17 +1,17 @@
.. this picture is generated by https://wavedrom.com/, using the sphinx plugin sphinxcontrib-wavedrom .. this picture is generated by https://wavedrom.com/, using the sphinx plugin sphinxcontrib-wavedrom
.. due to plugin issue, we cannot place only the picture information in a standalone file, but have to take .. wavedrom:: inside .. due to plugin issue, we cannot place only the picture information in a standalone file, but have to take .. wavedrom:: inside
.. wavedrom:: .. wavedrom::
{ signal: [ { signal: [
{ name: 'SCLK', wave: 'p...', node: '.ad...' }, { name: 'SCLK', wave: 'p...', node: '.ad...' },
{ name: 'MISO', wave: 'x3x.', node: '.b...', phase:-1.8 }, { name: 'MISO', wave: 'x3x.', node: '.b...', phase:-1.8 },
{ name: 'MISO delayed', wave: 'x3x.', node: '.c.', phase:-2.4 }, { name: 'MISO delayed', wave: 'x3x.', node: '.c.', phase:-2.4 },
], ],
edge: [ edge: [
'a|->b input delay', 'a|->b input delay',
'b|->c gpio delay', 'b|->c gpio delay',
'c-|>d setup slack' 'c-|>d setup slack'
], ],
config: { hscale: 3 } config: { hscale: 3 }
} }

View File

@@ -1,19 +1,19 @@
.. this picture is generated by https://wavedrom.com/, using the sphinx plugin sphinxcontrib-wavedrom .. this picture is generated by https://wavedrom.com/, using the sphinx plugin sphinxcontrib-wavedrom
.. due to plugin issue, we cannot place only the picture information in a standalone file, but have to take .. wavedrom:: inside .. due to plugin issue, we cannot place only the picture information in a standalone file, but have to take .. wavedrom:: inside
.. wavedrom:: .. wavedrom::
{ signal: [ { signal: [
{ name: 'SCLK', wave: '0.1....0....1...', node: '..a.........e'}, { name: 'SCLK', wave: '0.1....0....1...', node: '..a.........e'},
{ name: 'SLV_CLK',wave: 'p..............', node: '..b..', phase: -0.5 }, { name: 'SLV_CLK',wave: 'p..............', node: '..b..', phase: -0.5 },
{ name: 'MISO', wave: 'x...3.....x....', node: '....c', phase:-0.5}, { name: 'MISO', wave: 'x...3.....x....', node: '....c', phase:-0.5},
{ name: 'MISO delayed', wave: 'x.......3.....x.', node: '........d'}, { name: 'MISO delayed', wave: 'x.......3.....x.', node: '........d'},
], ],
edge: [ edge: [
'a|->b sample delay', 'a|->b sample delay',
'b|->c slave output delay', 'b|->c slave output delay',
'c|->d gpio delay', 'c|->d gpio delay',
'd-|>e setup slack', 'd-|>e setup slack',
'a-|>c input delay' 'a-|>c input delay'
], ],
} }

View File

@@ -1,33 +1,33 @@
# this is a GNUPLOT script generating the figure of spi_master_freq_tv.png # this is a GNUPLOT script generating the figure of spi_master_freq_tv.png
set xlabel "Input delay (ns)" set xlabel "Input delay (ns)"
set xrange [0: 125] set xrange [0: 125]
set ylabel "Fmax (MHz)" set ylabel "Fmax (MHz)"
set yrange [0: 81] set yrange [0: 81]
set xtics 12.5 textcolor rgb "black" set xtics 12.5 textcolor rgb "black"
set ytics 10 textcolor rgb "black" set ytics 10 textcolor rgb "black"
set border 3 lc rgb "gray" lw 2 set border 3 lc rgb "gray" lw 2
set grid lt -1 lc rgb "gray" lw 2 set grid lt -1 lc rgb "gray" lw 2
set samples 10000 set samples 10000
set terminal png size 700,500 set terminal png size 700,500
set output "plot.png" set output "plot.png"
apb = 12.5 apb = 12.5
#each line is broken into 10 pieces by the range determined by i #each line is broken into 10 pieces by the range determined by i
f1(i,x) = (x>= i*apb) && (x < (i+1)*apb) ? 80./(i+1) : 1/0 f1(i,x) = (x>= i*apb) && (x < (i+1)*apb) ? 80./(i+1) : 1/0
set style circle radius graph 0.008 set style circle radius graph 0.008
#solid and empty circles are draw by the coordinates given in the csv #solid and empty circles are draw by the coordinates given in the csv
plot [0:125]\ plot [0:125]\
f1(-1, x) lw 3lc rgb "blue" title "IOMUX",\ f1(-1, x) lw 3lc rgb "blue" title "IOMUX",\
for [i=0:9] f1(i, x) with lines lw 3 lc rgb "blue" notitle,\ for [i=0:9] f1(i, x) with lines lw 3 lc rgb "blue" notitle,\
f1(0, x+25) lw 3 lc rgb "red" title "GPIO",\ f1(0, x+25) lw 3 lc rgb "red" title "GPIO",\
for [i=2:11] f1(i, x+25) with lines lw 3 lc rgb "red" notitle, \ for [i=2:11] f1(i, x+25) with lines lw 3 lc rgb "red" notitle, \
"tv.csv" using 1:2 with circles notitle fill solid fc rgb "blue", \ "tv.csv" using 1:2 with circles notitle fill solid fc rgb "blue", \
"tv.csv" using 1:4 with circles notitle fc rgb "blue",\ "tv.csv" using 1:4 with circles notitle fc rgb "blue",\
"tv.csv" using 1:3 with circles notitle fill solid fc rgb "red" ,\ "tv.csv" using 1:3 with circles notitle fill solid fc rgb "red" ,\
"tv.csv" using 1:5 with circles notitle fc rgb "red" "tv.csv" using 1:5 with circles notitle fc rgb "red"

View File

@@ -1,29 +1,29 @@
0 80 26.66666667 #DIV/0! #DIV/0! 0 80 26.66666667 #DIV/0! #DIV/0!
12.5 40 20 80 26.66666667 12.5 40 20 80 26.66666667
25 26.66666667 16 40 20 25 26.66666667 16 40 20
37.5 20 13.33333333 26.66666667 16 37.5 20 13.33333333 26.66666667 16
50 16 11.42857143 20 13.33333333 50 16 11.42857143 20 13.33333333
62.5 13.33333333 10 16 11.42857143 62.5 13.33333333 10 16 11.42857143
75 11.42857143 8.888888889 13.33333333 10 75 11.42857143 8.888888889 13.33333333 10
87.5 10 8 11.42857143 8.888888889 87.5 10 8 11.42857143 8.888888889
100 8.888888889 7.272727273 10 8 100 8.888888889 7.272727273 10 8
112.5 8 6.666666667 8.888888889 7.272727273 112.5 8 6.666666667 8.888888889 7.272727273
125 7.272727273 6.153846154 8 6.666666667 125 7.272727273 6.153846154 8 6.666666667
137.5 6.666666667 5.714285714 7.272727273 6.153846154 137.5 6.666666667 5.714285714 7.272727273 6.153846154
150 6.153846154 5.333333333 6.666666667 5.714285714 150 6.153846154 5.333333333 6.666666667 5.714285714
162.5 5.714285714 5 6.153846154 5.333333333 162.5 5.714285714 5 6.153846154 5.333333333
175 5.333333333 4.705882353 5.714285714 5 175 5.333333333 4.705882353 5.714285714 5
187.5 5 4.444444444 5.333333333 4.705882353 187.5 5 4.444444444 5.333333333 4.705882353
200 4.705882353 4.210526316 5 4.444444444 200 4.705882353 4.210526316 5 4.444444444
212.5 4.444444444 4 4.705882353 4.210526316 212.5 4.444444444 4 4.705882353 4.210526316
225 4.210526316 3.80952381 4.444444444 4 225 4.210526316 3.80952381 4.444444444 4
237.5 4 3.636363636 4.210526316 3.80952381 237.5 4 3.636363636 4.210526316 3.80952381
250 3.80952381 3.47826087 4 3.636363636 250 3.80952381 3.47826087 4 3.636363636
262.5 3.636363636 3.333333333 3.80952381 3.47826087 262.5 3.636363636 3.333333333 3.80952381 3.47826087
275 3.47826087 3.2 3.636363636 3.333333333 275 3.47826087 3.2 3.636363636 3.333333333
287.5 3.333333333 3.076923077 3.47826087 3.2 287.5 3.333333333 3.076923077 3.47826087 3.2
300 3.2 2.962962963 3.333333333 3.076923077 300 3.2 2.962962963 3.333333333 3.076923077
312.5 3.076923077 2.857142857 3.2 2.962962963 312.5 3.076923077 2.857142857 3.2 2.962962963
325 2.962962963 2.75862069 3.076923077 2.857142857 325 2.962962963 2.75862069 3.076923077 2.857142857
337.5 2.857142857 2.666666667 2.962962963 2.75862069 337.5 2.857142857 2.666666667 2.962962963 2.75862069
350 2.75862069 2.580645161 2.857142857 2.666666667 350 2.75862069 2.580645161 2.857142857 2.666666667
1 0 80 26.66666667 #DIV/0! #DIV/0!
2 12.5 40 20 80 26.66666667
3 25 26.66666667 16 40 20
4 37.5 20 13.33333333 26.66666667 16
5 50 16 11.42857143 20 13.33333333
6 62.5 13.33333333 10 16 11.42857143
7 75 11.42857143 8.888888889 13.33333333 10
8 87.5 10 8 11.42857143 8.888888889
9 100 8.888888889 7.272727273 10 8
10 112.5 8 6.666666667 8.888888889 7.272727273
11 125 7.272727273 6.153846154 8 6.666666667
12 137.5 6.666666667 5.714285714 7.272727273 6.153846154
13 150 6.153846154 5.333333333 6.666666667 5.714285714
14 162.5 5.714285714 5 6.153846154 5.333333333
15 175 5.333333333 4.705882353 5.714285714 5
16 187.5 5 4.444444444 5.333333333 4.705882353
17 200 4.705882353 4.210526316 5 4.444444444
18 212.5 4.444444444 4 4.705882353 4.210526316
19 225 4.210526316 3.80952381 4.444444444 4
20 237.5 4 3.636363636 4.210526316 3.80952381
21 250 3.80952381 3.47826087 4 3.636363636
22 262.5 3.636363636 3.333333333 3.80952381 3.47826087
23 275 3.47826087 3.2 3.636363636 3.333333333
24 287.5 3.333333333 3.076923077 3.47826087 3.2
25 300 3.2 2.962962963 3.333333333 3.076923077
26 312.5 3.076923077 2.857142857 3.2 2.962962963
27 325 2.962962963 2.75862069 3.076923077 2.857142857
28 337.5 2.857142857 2.666666667 2.962962963 2.75862069
29 350 2.75862069 2.580645161 2.857142857 2.666666667

View File

@@ -1,4 +1,4 @@
About About
===== =====
This is documentation of `ESP-IDF <https://github.com/espressif/esp-idf>`_, the framework to develop applications for `ESP32 <https://espressif.com/en/products/hardware/esp32/overview>`_ chip by `Espressif <https://espressif.com>`_. This is documentation of `ESP-IDF <https://github.com/espressif/esp-idf>`_, the framework to develop applications for `ESP32 <https://espressif.com/en/products/hardware/esp32/overview>`_ chip by `Espressif <https://espressif.com>`_.

View File

@@ -1,104 +1,104 @@
128 vTaskAllocateMPURegions xTask=%t pxRegions=%u 128 vTaskAllocateMPURegions xTask=%t pxRegions=%u
33 vTaskDelete xTaskToDelete=%t 33 vTaskDelete xTaskToDelete=%t
34 vTaskDelay xTicksToDelay=%u 34 vTaskDelay xTicksToDelay=%u
35 vTaskDelayUntil 35 vTaskDelayUntil
129 uxTaskPriorityGet xTask=%t 129 uxTaskPriorityGet xTask=%t
56 uxTaskPriorityGetFromISR xTask=%t 56 uxTaskPriorityGetFromISR xTask=%t
130 eTaskGetState xTask=%t 130 eTaskGetState xTask=%t
55 vTaskPrioritySet xTask=%t uxNewPriority=%u 55 vTaskPrioritySet xTask=%t uxNewPriority=%u
36 vTaskSuspend xTaskToSuspend=%t 36 vTaskSuspend xTaskToSuspend=%t
40 vTaskResume xTaskToResume=%t 40 vTaskResume xTaskToResume=%t
43 xTaskResumeFromISR xTaskToResume=%t 43 xTaskResumeFromISR xTaskToResume=%t
131 vTaskStartScheduler 131 vTaskStartScheduler
132 vTaskEndScheduler 132 vTaskEndScheduler
133 vTaskSuspendAll 133 vTaskSuspendAll
134 xTaskResumeAll 134 xTaskResumeAll
135 xTaskGetTickCount 135 xTaskGetTickCount
57 xTaskGetTickCountFromISR 57 xTaskGetTickCountFromISR
136 uxTaskGetNumberOfTasks 136 uxTaskGetNumberOfTasks
137 pcTaskGetTaskName xTaskToQuery=%t 137 pcTaskGetTaskName xTaskToQuery=%t
138 uxTaskGetStackHighWaterMark xTask=%t 138 uxTaskGetStackHighWaterMark xTask=%t
139 vTaskSetApplicationTaskTag xTask=%t pxHookFunction=%u 139 vTaskSetApplicationTaskTag xTask=%t pxHookFunction=%u
140 xTaskGetApplicationTaskTag xTask=%t 140 xTaskGetApplicationTaskTag xTask=%t
141 vTaskSetThreadLocalStoragePointer xTaskToSet=%T xIndex=%u pvValue=%u 141 vTaskSetThreadLocalStoragePointer xTaskToSet=%T xIndex=%u pvValue=%u
142 pvTaskGetThreadLocalStoragePointer xTaskToQuery=%T xIndex=%u 142 pvTaskGetThreadLocalStoragePointer xTaskToQuery=%T xIndex=%u
143 xTaskCallApplicationTaskHook xTask=%T pvParameter=%u 143 xTaskCallApplicationTaskHook xTask=%T pvParameter=%u
144 xTaskGetIdleTaskHandle 144 xTaskGetIdleTaskHandle
145 uxTaskGetSystemState pxTaskStatusArray=%u uxArraySize=%u pulTotalRunTime=%u 145 uxTaskGetSystemState pxTaskStatusArray=%u uxArraySize=%u pulTotalRunTime=%u
146 vTaskList pcWriteBuffer=%u 146 vTaskList pcWriteBuffer=%u
147 vTaskGetRunTimeStats pcWriteBuffer=%u 147 vTaskGetRunTimeStats pcWriteBuffer=%u
44 xTaskGenericNotify xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u 44 xTaskGenericNotify xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u
45 xTaskGenericNotifyFromISR xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u pxHigherPriorityTaskWoken=%u 45 xTaskGenericNotifyFromISR xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u pxHigherPriorityTaskWoken=%u
46 xTaskNotifyWait ulBitsToClearOnEntry=%u ulBitsToClearOnExit=%u pulNotificationValue=%u xTicksToWait=%u 46 xTaskNotifyWait ulBitsToClearOnEntry=%u ulBitsToClearOnExit=%u pulNotificationValue=%u xTicksToWait=%u
38 vTaskNotifyGiveFromISR xTaskToNotify=%t pxHigherPriorityTaskWoken=%u 38 vTaskNotifyGiveFromISR xTaskToNotify=%t pxHigherPriorityTaskWoken=%u
37 ulTaskNotifyTake xClearCountOnExit=%u xTicksToWait=%u 37 ulTaskNotifyTake xClearCountOnExit=%u xTicksToWait=%u
148 xTaskNotifyStateClear xTask=%t 148 xTaskNotifyStateClear xTask=%t
149 xTaskGetCurrentTaskHandle 149 xTaskGetCurrentTaskHandle
150 vTaskSetTimeOutState pxTimeOut=%u 150 vTaskSetTimeOutState pxTimeOut=%u
151 xTaskCheckForTimeOut pxTimeOut=%u pxTicksToWait=%u 151 xTaskCheckForTimeOut pxTimeOut=%u pxTicksToWait=%u
152 vTaskMissedYield 152 vTaskMissedYield
153 xTaskGetSchedulerState 153 xTaskGetSchedulerState
39 vTaskPriorityInherit pxMutexHolder=%p 39 vTaskPriorityInherit pxMutexHolder=%p
42 xTaskPriorityDisinherit pxMutexHolder=%p 42 xTaskPriorityDisinherit pxMutexHolder=%p
154 xTaskGenericCreate pxTaskCode=%u pcName=%u usStackDepth=%u pvParameters=%u uxPriority=%u pxCreatedTask=%u puxStackBuffer=%u xRegions=%u 154 xTaskGenericCreate pxTaskCode=%u pcName=%u usStackDepth=%u pvParameters=%u uxPriority=%u pxCreatedTask=%u puxStackBuffer=%u xRegions=%u
155 uxTaskGetTaskNumber xTask=%u 155 uxTaskGetTaskNumber xTask=%u
156 vTaskSetTaskNumber xTask=%u uxHandle=%u 156 vTaskSetTaskNumber xTask=%u uxHandle=%u
41 vTaskStepTick xTicksToJump=%u 41 vTaskStepTick xTicksToJump=%u
157 eTaskConfirmSleepModeStatus 157 eTaskConfirmSleepModeStatus
158 xTimerCreate pcTimerName=%u xTimerPeriodInTicks=%u uxAutoReload=%u pvTimerID=%u pxCallbackFunction=%u 158 xTimerCreate pcTimerName=%u xTimerPeriodInTicks=%u uxAutoReload=%u pvTimerID=%u pxCallbackFunction=%u
159 pvTimerGetTimerID xTimer=%u 159 pvTimerGetTimerID xTimer=%u
160 vTimerSetTimerID xTimer=%u pvNewID=%u 160 vTimerSetTimerID xTimer=%u pvNewID=%u
161 xTimerIsTimerActive xTimer=%u 161 xTimerIsTimerActive xTimer=%u
162 xTimerGetTimerDaemonTaskHandle 162 xTimerGetTimerDaemonTaskHandle
163 xTimerPendFunctionCallFromISR xFunctionToPend=%u pvParameter1=%u ulParameter2=%u pxHigherPriorityTaskWoken=%u 163 xTimerPendFunctionCallFromISR xFunctionToPend=%u pvParameter1=%u ulParameter2=%u pxHigherPriorityTaskWoken=%u
164 xTimerPendFunctionCall xFunctionToPend=%u pvParameter1=%u ulParameter2=%u xTicksToWait=%u 164 xTimerPendFunctionCall xFunctionToPend=%u pvParameter1=%u ulParameter2=%u xTicksToWait=%u
165 pcTimerGetTimerName xTimer=%u 165 pcTimerGetTimerName xTimer=%u
166 xTimerCreateTimerTask 166 xTimerCreateTimerTask
167 xTimerGenericCommand xTimer=%u xCommandID=%u xOptionalValue=%u pxHigherPriorityTaskWoken=%u xTicksToWait=%u 167 xTimerGenericCommand xTimer=%u xCommandID=%u xOptionalValue=%u pxHigherPriorityTaskWoken=%u xTicksToWait=%u
53 xQueueGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u 53 xQueueGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u
50 xQueuePeekFromISR xQueue=%I pvBuffer=%p 50 xQueuePeekFromISR xQueue=%I pvBuffer=%p
49 xQueueGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeek=%u 49 xQueueGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeek=%u
168 uxQueueMessagesWaiting xQueue=%I 168 uxQueueMessagesWaiting xQueue=%I
169 uxQueueSpacesAvailable xQueue=%I 169 uxQueueSpacesAvailable xQueue=%I
48 vQueueDelete xQueue=%I 48 vQueueDelete xQueue=%I
54 xQueueGenericSendFromISR xQueue=%I pvItemToQueue=%p pxHigherPriorityTaskWoken=%u xCopyPosition=%u 54 xQueueGenericSendFromISR xQueue=%I pvItemToQueue=%p pxHigherPriorityTaskWoken=%u xCopyPosition=%u
61 xQueueGiveFromISR xQueue=%I pxHigherPriorityTaskWoken=%u 61 xQueueGiveFromISR xQueue=%I pxHigherPriorityTaskWoken=%u
51 xQueueReceiveFromISR xQueue=%I pvBuffer=%p pxHigherPriorityTaskWoken=%u 51 xQueueReceiveFromISR xQueue=%I pvBuffer=%p pxHigherPriorityTaskWoken=%u
62 xQueueIsQueueEmptyFromISR xQueue=%I 62 xQueueIsQueueEmptyFromISR xQueue=%I
63 xQueueIsQueueFullFromISR xQueue=%I 63 xQueueIsQueueFullFromISR xQueue=%I
170 uxQueueMessagesWaitingFromISR xQueue=%I 170 uxQueueMessagesWaitingFromISR xQueue=%I
171 xQueueAltGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u 171 xQueueAltGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u
172 xQueueAltGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeeking=%u 172 xQueueAltGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeeking=%u
173 xQueueCRSendFromISR xQueue=%I pvItemToQueue=%p xCoRoutinePreviouslyWoken=%u 173 xQueueCRSendFromISR xQueue=%I pvItemToQueue=%p xCoRoutinePreviouslyWoken=%u
174 xQueueCRReceiveFromISR xQueue=%I pvBuffer=%p pxTaskWoken=%u 174 xQueueCRReceiveFromISR xQueue=%I pvBuffer=%p pxTaskWoken=%u
175 xQueueCRSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u 175 xQueueCRSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u
176 xQueueCRReceive xQueue=%I pvBuffer=%p xTicksToWait=%u 176 xQueueCRReceive xQueue=%I pvBuffer=%p xTicksToWait=%u
177 xQueueCreateMutex ucQueueType=%u 177 xQueueCreateMutex ucQueueType=%u
178 xQueueCreateCountingSemaphore uxMaxCount=%u uxInitialCount=%u 178 xQueueCreateCountingSemaphore uxMaxCount=%u uxInitialCount=%u
179 xQueueGetMutexHolder xSemaphore=%u 179 xQueueGetMutexHolder xSemaphore=%u
180 xQueueTakeMutexRecursive xMutex=%u xTicksToWait=%u 180 xQueueTakeMutexRecursive xMutex=%u xTicksToWait=%u
181 xQueueGiveMutexRecursive pxMutex=%u 181 xQueueGiveMutexRecursive pxMutex=%u
52 vQueueAddToRegistry xQueue=%I pcName=%u 52 vQueueAddToRegistry xQueue=%I pcName=%u
182 vQueueUnregisterQueue xQueue=%I 182 vQueueUnregisterQueue xQueue=%I
47 xQueueGenericCreate uxQueueLength=%u uxItemSize=%u ucQueueType=%u 47 xQueueGenericCreate uxQueueLength=%u uxItemSize=%u ucQueueType=%u
183 xQueueCreateSet uxEventQueueLength=%u 183 xQueueCreateSet uxEventQueueLength=%u
184 xQueueAddToSet xQueueOrSemaphore=%u xQueueSet=%u 184 xQueueAddToSet xQueueOrSemaphore=%u xQueueSet=%u
185 xQueueRemoveFromSet xQueueOrSemaphore=%u xQueueSet=%u 185 xQueueRemoveFromSet xQueueOrSemaphore=%u xQueueSet=%u
186 xQueueSelectFromSet xQueueSet=%u xTicksToWait=%u 186 xQueueSelectFromSet xQueueSet=%u xTicksToWait=%u
187 xQueueSelectFromSetFromISR xQueueSet=%u 187 xQueueSelectFromSetFromISR xQueueSet=%u
188 xQueueGenericReset xQueue=%I xNewQueue=%u 188 xQueueGenericReset xQueue=%I xNewQueue=%u
189 vListInitialise pxList=%u 189 vListInitialise pxList=%u
190 vListInitialiseItem pxItem=%u 190 vListInitialiseItem pxItem=%u
191 vListInsert pxList=%u pxNewListItem=%u 191 vListInsert pxList=%u pxNewListItem=%u
192 vListInsertEnd pxList=%u pxNewListItem=%u 192 vListInsertEnd pxList=%u pxNewListItem=%u
193 uxListRemove pxItemToRemove=%u 193 uxListRemove pxItemToRemove=%u
194 xEventGroupCreate 194 xEventGroupCreate
195 xEventGroupWaitBits xEventGroup=%u uxBitsToWaitFor=%u xClearOnExit=%u xWaitForAllBits=%u xTicksToWait=%u 195 xEventGroupWaitBits xEventGroup=%u uxBitsToWaitFor=%u xClearOnExit=%u xWaitForAllBits=%u xTicksToWait=%u
196 xEventGroupClearBits xEventGroup=%u uxBitsToClear=%u 196 xEventGroupClearBits xEventGroup=%u uxBitsToClear=%u
58 xEventGroupClearBitsFromISR xEventGroup=%u uxBitsToSet=%u 58 xEventGroupClearBitsFromISR xEventGroup=%u uxBitsToSet=%u
197 xEventGroupSetBits xEventGroup=%u uxBitsToSet=%u 197 xEventGroupSetBits xEventGroup=%u uxBitsToSet=%u
59 xEventGroupSetBitsFromISR xEventGroup=%u uxBitsToSet=%u pxHigherPriorityTaskWoken=%u 59 xEventGroupSetBitsFromISR xEventGroup=%u uxBitsToSet=%u pxHigherPriorityTaskWoken=%u
198 xEventGroupSync xEventGroup=%u uxBitsToSet=%u uxBitsToWaitFor=%u xTicksToWait=%u 198 xEventGroupSync xEventGroup=%u uxBitsToSet=%u uxBitsToWaitFor=%u xTicksToWait=%u
60 xEventGroupGetBitsFromISR xEventGroup=%u 60 xEventGroupGetBitsFromISR xEventGroup=%u
199 vEventGroupDelete xEventGroup=%u 199 vEventGroupDelete xEventGroup=%u
200 uxEventGroupGetNumber xEventGroup=%u 200 uxEventGroupGetNumber xEventGroup=%u

File diff suppressed because it is too large Load Diff

View File

@@ -1,153 +1,153 @@
SD Pullup Requirements SD Pullup Requirements
====================== ======================
CMD and DATA lines D0-D3 of the slave should be pulled up by 50KOhm resistor CMD and DATA lines D0-D3 of the slave should be pulled up by 50KOhm resistor
even in 1-bit mode or SPI mode. The pullups of the slave cards should be even in 1-bit mode or SPI mode. The pullups of the slave cards should be
connected even if they're not connected to the host. connected even if they're not connected to the host.
The MTDI strapping pin is incompatible with DAT2 line pull-up by default The MTDI strapping pin is incompatible with DAT2 line pull-up by default
when the code flash is 3.3V. See :ref:`mtdi_strapping_pin` below. when the code flash is 3.3V. See :ref:`mtdi_strapping_pin` below.
Pullup inside Official Modules Pullup inside Official Modules
------------------------------ ------------------------------
For Espressif official modules, different weak pullups / pulldowns are For Espressif official modules, different weak pullups / pulldowns are
connected to CMD, and DATA pins as below. To use these modules, connected to CMD, and DATA pins as below. To use these modules,
these pins are required to be pulled up by 50KOhm resistors, since internal these pins are required to be pulled up by 50KOhm resistors, since internal
weak pullups are insufficient. weak pullups are insufficient.
+-----------------------+-----+--------------------------+------+----------------------+------+ +-----------------------+-----+--------------------------+------+----------------------+------+
| GPIO | 15 | 2 | 4 | 12 | 13 | | GPIO | 15 | 2 | 4 | 12 | 13 |
+=======================+=====+==========================+======+======================+======+ +=======================+=====+==========================+======+======================+======+
| Name | CMD | DAT0 | DAT1 | DAT2 | DAT3 | | Name | CMD | DAT0 | DAT1 | DAT2 | DAT3 |
+-----------------------+-----+--------------------------+------+----------------------+------+ +-----------------------+-----+--------------------------+------+----------------------+------+
| At startup | WPU | WPD | WPD | PU for 1.8v flash; | WPU | | At startup | WPU | WPD | WPD | PU for 1.8v flash; | WPU |
| | | | | WPD for 3.3v flash | | | | | | | WPD for 3.3v flash | |
+-----------------------+-----+--------------------------+------+----------------------+------+ +-----------------------+-----+--------------------------+------+----------------------+------+
| Strapping requirement | | Low to download to flash | | High for 1.8v flash; | | | Strapping requirement | | Low to download to flash | | High for 1.8v flash; | |
| | | | | Low for 3.3v flash | | | | | | | Low for 3.3v flash | |
+-----------------------+-----+--------------------------+------+----------------------+------+ +-----------------------+-----+--------------------------+------+----------------------+------+
- WPU: Weak pullup - WPU: Weak pullup
- WPD: Weak pulldown - WPD: Weak pulldown
- PU: Pullup inside the module - PU: Pullup inside the module
For Wrover modules, they use 1.8v flash, and have pullup on GPIO12 inside. For Wrover modules, they use 1.8v flash, and have pullup on GPIO12 inside.
For Wroom-32 Series, PICO-D4 modules, they use 3.3v flash, and is weakly For Wroom-32 Series, PICO-D4 modules, they use 3.3v flash, and is weakly
pulled down internally. See :ref:`mtdi_strapping_pin` below. pulled down internally. See :ref:`mtdi_strapping_pin` below.
Pullup on Official Devkit (WroverKit) Pullup on Official Devkit (WroverKit)
-------------------------------------- --------------------------------------
For official Wrover Kit (till version 3), some of the pullups are provided on For official Wrover Kit (till version 3), some of the pullups are provided on
the board as the table below. For other devkits that don't have pullups, the board as the table below. For other devkits that don't have pullups,
please connect them yourselves. please connect them yourselves.
+-----------------------+-----+------+------+------+---------+ +-----------------------+-----+------+------+------+---------+
| GPIO | 15 | 2 | 4 | 12 | 13 | | GPIO | 15 | 2 | 4 | 12 | 13 |
+=======================+=====+======+======+======+=========+ +=======================+=====+======+======+======+=========+
| Name | CMD | DAT0 | DAT1 | DAT2 | DAT3 | | Name | CMD | DAT0 | DAT1 | DAT2 | DAT3 |
+-----------------------+-----+------+------+------+---------+ +-----------------------+-----+------+------+------+---------+
| Pullup on the Kit | PU | PU | PU | | PU & PD | | Pullup on the Kit | PU | PU | PU | | PU & PD |
+-----------------------+-----+------+------+------+---------+ +-----------------------+-----+------+------+------+---------+
- PU: Pullup - PU: Pullup
- PD: Pulldown - PD: Pulldown
The DAT3 pullup conflicts with JTAG pulldown in WroverKit v3 and earlier, please The DAT3 pullup conflicts with JTAG pulldown in WroverKit v3 and earlier, please
either: either:
1. pull it up by resistor less than 5KOhm (2kOhm suggested) in 4-bit mode. 1. pull it up by resistor less than 5KOhm (2kOhm suggested) in 4-bit mode.
2. pull it up or drive it high by host or VDD3.3V in 1-bit mode. 2. pull it up or drive it high by host or VDD3.3V in 1-bit mode.
.. _mtdi_strapping_pin: .. _mtdi_strapping_pin:
MTDI strapping pin MTDI strapping pin
------------------ ------------------
MTDI (GPIO12) is used as a bootstrapping pin to select output voltage of an MTDI (GPIO12) is used as a bootstrapping pin to select output voltage of an
internal regulator which powers the flash chip (VDD_SDIO). This pin has an internal regulator which powers the flash chip (VDD_SDIO). This pin has an
internal pulldown so if left unconnected it will read low at reset (selecting internal pulldown so if left unconnected it will read low at reset (selecting
default 3.3V operation). When adding a pullup to this pin for SD card default 3.3V operation). When adding a pullup to this pin for SD card
operation, consider the following: operation, consider the following:
- For boards which don't use the internal regulator (VDD_SDIO) to power the - For boards which don't use the internal regulator (VDD_SDIO) to power the
flash, GPIO12 can be pulled high. flash, GPIO12 can be pulled high.
- For boards which use 1.8V flash chip, GPIO12 needs to be pulled high at - For boards which use 1.8V flash chip, GPIO12 needs to be pulled high at
reset. This is fully compatible with SD card operation. reset. This is fully compatible with SD card operation.
- On boards which use the internal regulator and a 3.3V flash chip, GPIO12 - On boards which use the internal regulator and a 3.3V flash chip, GPIO12
must be low at reset. This is incompatible with SD card operation. Please must be low at reset. This is incompatible with SD card operation. Please
check the table below to see whether your modules/kits use 3.3v flash. check the table below to see whether your modules/kits use 3.3v flash.
+-----------------+---------------+--------------------------------------+ +-----------------+---------------+--------------------------------------+
| Module | Flash voltage | DAT2 connections | | Module | Flash voltage | DAT2 connections |
+=================+===============+======================================+ +=================+===============+======================================+
| PICO-D4 | 3.3V | Internal PD, change EFUSE and pullup | | PICO-D4 | 3.3V | Internal PD, change EFUSE and pullup |
+-----------------+ + or disable DAT2 line* + +-----------------+ + or disable DAT2 line* +
| Wroom-32 Series | | | | Wroom-32 Series | | |
+-----------------+---------------+--------------------------------------+ +-----------------+---------------+--------------------------------------+
| Wrover | 1.8V | Internal PU, pullup suggested | | Wrover | 1.8V | Internal PU, pullup suggested |
+-----------------+---------------+--------------------------------------+ +-----------------+---------------+--------------------------------------+
Official devkits of different types and version mount different types of Official devkits of different types and version mount different types of
modules, please refer to the table below to see whether your devkit can modules, please refer to the table below to see whether your devkit can
support SDIO slave without steps above. support SDIO slave without steps above.
+--------------------------+-----------------+---------------+ +--------------------------+-----------------+---------------+
| Devkit | Module | Flash voltage | | Devkit | Module | Flash voltage |
+==========================+=================+===============+ +==========================+=================+===============+
| PICO Kit | PICO-D4 | 3.3V | | PICO Kit | PICO-D4 | 3.3V |
+--------------------------+-----------------+ (see steps + +--------------------------+-----------------+ (see steps +
| DevKitC | Wroom-32 Series | below) | | DevKitC | Wroom-32 Series | below) |
+--------------------------+ + + +--------------------------+ + +
| WroverKit v2 and earlier | | | | WroverKit v2 and earlier | | |
+--------------------------+-----------------+---------------+ +--------------------------+-----------------+---------------+
| WroverKit v3 | Wrover | 1.8V | | WroverKit v3 | Wrover | 1.8V |
+--------------------------+-----------------+---------------+ +--------------------------+-----------------+---------------+
If your board requires internal regulator with 3.3v output, to make it If your board requires internal regulator with 3.3v output, to make it
compatible with SD pullup, you can either: compatible with SD pullup, you can either:
- **In the case using ESP32 host only**, external pullup can be omitted and an - **In the case using ESP32 host only**, external pullup can be omitted and an
internal pullup can be enabled using a ``gpio_pullup_en(GPIO_NUM_12);`` call. internal pullup can be enabled using a ``gpio_pullup_en(GPIO_NUM_12);`` call.
Most SD cards work fine when an internal pullup on GPIO12 line is enabled. Most SD cards work fine when an internal pullup on GPIO12 line is enabled.
Note that if ESP32 experiences a power-on reset while the SD card is Note that if ESP32 experiences a power-on reset while the SD card is
sending data, high level on GPIO12 can be latched into the bootstrapping sending data, high level on GPIO12 can be latched into the bootstrapping
register, and ESP32 will enter a boot loop until external reset with register, and ESP32 will enter a boot loop until external reset with
correct GPIO12 level is applied. correct GPIO12 level is applied.
- **In the case using ESP32 slave in 1-bit mode**, speicfy - **In the case using ESP32 slave in 1-bit mode**, speicfy
``SDIO_SLAVE_FLAG_DAT2_DISABLED`` in the slave to avoid slave detecting on ``SDIO_SLAVE_FLAG_DAT2_DISABLED`` in the slave to avoid slave detecting on
DAT2 line. Note the host will not know 4-bit mode is not supported any more DAT2 line. Note the host will not know 4-bit mode is not supported any more
by the standard CCCR register. You have to tell the host use 1-bit only. by the standard CCCR register. You have to tell the host use 1-bit only.
- **For ESP32 host or slave**, another option is to burn the flash voltage - **For ESP32 host or slave**, another option is to burn the flash voltage
selection efuses. This will permanently select 3.3V output voltage for the selection efuses. This will permanently select 3.3V output voltage for the
internal regulator, and GPIO12 will not be used as a bootstrapping pin. internal regulator, and GPIO12 will not be used as a bootstrapping pin.
Then it is safe to connect a pullup resistor to GPIO12. This option is Then it is safe to connect a pullup resistor to GPIO12. This option is
suggested for production use. NOTE this cannot be reverted once the EFUSE suggested for production use. NOTE this cannot be reverted once the EFUSE
is burnt. is burnt.
The following command can be used to program flash voltage selection efuses **to 3.3V**: The following command can be used to program flash voltage selection efuses **to 3.3V**:
components/esptool_py/esptool/espefuse.py set_flash_voltage 3.3V components/esptool_py/esptool/espefuse.py set_flash_voltage 3.3V
This command will burn the `XPD_SDIO_TIEH`, `XPD_SDIO_FORCE`, and This command will burn the `XPD_SDIO_TIEH`, `XPD_SDIO_FORCE`, and
`XPD_SDIO_REG` efuses. With all three burned to value 1, the internal `XPD_SDIO_REG` efuses. With all three burned to value 1, the internal
VDD_SDIO flash voltage regulator is permanently enabled at 3.3V. See VDD_SDIO flash voltage regulator is permanently enabled at 3.3V. See
the technical reference manual for more details. the technical reference manual for more details.
`espefuse.py` has a `--do-not-confirm` option if running from an automated flashing script. `espefuse.py` has a `--do-not-confirm` option if running from an automated flashing script.
GPIO2 Strapping pin GPIO2 Strapping pin
------------------- -------------------
GPIO2 pin is used as a bootstrapping pin, and should be low to enter UART GPIO2 pin is used as a bootstrapping pin, and should be low to enter UART
download mode. You may find it unable to enter the UART download mode if you download mode. You may find it unable to enter the UART download mode if you
correctly connect the pullup of SD on GPIO2. For WroverKit v3, there are correctly connect the pullup of SD on GPIO2. For WroverKit v3, there are
dedicated circuits to pulldown the GPIO2 when downloading. For other boards, dedicated circuits to pulldown the GPIO2 when downloading. For other boards,
one way to do this is to connect GPIO0 and GPIO2 using a jumper, and then the one way to do this is to connect GPIO0 and GPIO2 using a jumper, and then the
auto-reset circuit on most development boards will pull GPIO2 low along with auto-reset circuit on most development boards will pull GPIO2 low along with
GPIO0, when entering download mode. GPIO0, when entering download mode.
- Some boards have pulldown and/or LED on GPIO2. LED is usually ok, but - Some boards have pulldown and/or LED on GPIO2. LED is usually ok, but
pulldown will interfere with D0 signals and must be removed. Check the pulldown will interfere with D0 signals and must be removed. Check the
schematic of your development board for anything connected to GPIO2. schematic of your development board for anything connected to GPIO2.

View File

@@ -1,53 +1,53 @@
SPIFFS Filesystem SPIFFS Filesystem
================= =================
Overview Overview
-------- --------
SPIFFS is a file system intended for SPI NOR flash devices on embedded targets. SPIFFS is a file system intended for SPI NOR flash devices on embedded targets.
It supports wear leveling, file system consistency checks and more. It supports wear leveling, file system consistency checks and more.
Notes Notes
----- -----
- Presently, spiffs does not support directories. It produces a flat structure. If SPIFFS is mounted under ``/spiffs`` creating a file with path ``/spiffs/tmp/myfile.txt`` will create a file called ``/tmp/myfile.txt`` in SPIFFS, instead of ``myfile.txt`` under directory ``/spiffs/tmp``. - Presently, spiffs does not support directories. It produces a flat structure. If SPIFFS is mounted under ``/spiffs`` creating a file with path ``/spiffs/tmp/myfile.txt`` will create a file called ``/tmp/myfile.txt`` in SPIFFS, instead of ``myfile.txt`` under directory ``/spiffs/tmp``.
- It is not a realtime stack. One write operation might last much longer than another. - It is not a realtime stack. One write operation might last much longer than another.
- Presently, it does not detect or handle bad blocks. - Presently, it does not detect or handle bad blocks.
Tools Tools
----- -----
Host-Side tools for creating SPIFS partition images exist and one such tool is `mkspiffs <https://github.com/igrr/mkspiffs>`_. Host-Side tools for creating SPIFS partition images exist and one such tool is `mkspiffs <https://github.com/igrr/mkspiffs>`_.
You can use it to create image from a given folder and then flash that image with ``esptool.py`` You can use it to create image from a given folder and then flash that image with ``esptool.py``
To do that you need to obtain some parameters: To do that you need to obtain some parameters:
- Block Size: 4096 (standard for SPI Flash) - Block Size: 4096 (standard for SPI Flash)
- Page Size: 256 (standard for SPI Flash) - Page Size: 256 (standard for SPI Flash)
- Image Size: Size of the partition in bytes (can be obtained from partition table) - Image Size: Size of the partition in bytes (can be obtained from partition table)
- Partition Offset: Starting address of the partition (can be obtained from partition table) - Partition Offset: Starting address of the partition (can be obtained from partition table)
To pack a folder into 1 Megabyte image:: To pack a folder into 1 Megabyte image::
mkspiffs -c [src_folder] -b 4096 -p 256 -s 0x100000 spiffs.bin mkspiffs -c [src_folder] -b 4096 -p 256 -s 0x100000 spiffs.bin
To flash the image to ESP32 at offset 0x110000:: To flash the image to ESP32 at offset 0x110000::
python esptool.py --chip esp32 --port [port] --baud [baud] write_flash -z 0x110000 spiffs.bin python esptool.py --chip esp32 --port [port] --baud [baud] write_flash -z 0x110000 spiffs.bin
See also See also
-------- --------
- :doc:`Partition Table documentation <../../api-guides/partition-tables>` - :doc:`Partition Table documentation <../../api-guides/partition-tables>`
Application Example Application Example
------------------- -------------------
An example for using SPIFFS is provided in :example:`storage/spiffs` directory. This example initializes and mounts SPIFFS partition, and writes and reads data from it using POSIX and C library APIs. See README.md file in the example directory for more information. An example for using SPIFFS is provided in :example:`storage/spiffs` directory. This example initializes and mounts SPIFFS partition, and writes and reads data from it using POSIX and C library APIs. See README.md file in the example directory for more information.
High level API Reference High level API Reference
------------------------ ------------------------
* :component_file:`spiffs/include/esp_spiffs.h` * :component_file:`spiffs/include/esp_spiffs.h`
.. include:: /_build/inc/esp_spiffs.inc .. include:: /_build/inc/esp_spiffs.inc

View File

@@ -1,34 +1,34 @@
.. include:: ../../../../components/wear_levelling/README.rst .. include:: ../../../../components/wear_levelling/README.rst
See also See also
-------- --------
- :doc:`FAT Filesystem <./fatfs>` - :doc:`FAT Filesystem <./fatfs>`
- :doc:`Partition Table documentation <../../api-guides/partition-tables>` - :doc:`Partition Table documentation <../../api-guides/partition-tables>`
Application Example Application Example
------------------- -------------------
An example which combines wear levelling driver with FATFS library is provided in ``examples/storage/wear_levelling`` directory. This example initializes the wear levelling driver, mounts FATFS partition, and writes and reads data from it using POSIX and C library APIs. See README.md file in the example directory for more information. An example which combines wear levelling driver with FATFS library is provided in ``examples/storage/wear_levelling`` directory. This example initializes the wear levelling driver, mounts FATFS partition, and writes and reads data from it using POSIX and C library APIs. See README.md file in the example directory for more information.
High level API Reference High level API Reference
------------------------ ------------------------
Header Files Header Files
^^^^^^^^^^^^ ^^^^^^^^^^^^
* :component_file:`fatfs/src/esp_vfs_fat.h` * :component_file:`fatfs/src/esp_vfs_fat.h`
Functions Functions
^^^^^^^^^ ^^^^^^^^^
.. doxygenfunction:: esp_vfs_fat_spiflash_mount .. doxygenfunction:: esp_vfs_fat_spiflash_mount
.. doxygenstruct:: esp_vfs_fat_mount_config_t .. doxygenstruct:: esp_vfs_fat_mount_config_t
:members: :members:
.. doxygenfunction:: esp_vfs_fat_spiflash_unmount .. doxygenfunction:: esp_vfs_fat_spiflash_unmount
Mid level API Reference Mid level API Reference
----------------------- -----------------------
.. include:: /_build/inc/wear_levelling.inc .. include:: /_build/inc/wear_levelling.inc

View File

@@ -1,79 +1,79 @@
ESP32-DevKitC V2 Getting Started Guide ESP32-DevKitC V2 Getting Started Guide
====================================== ======================================
This user guide shows how to get started with ESP32-DevKitC development board. This user guide shows how to get started with ESP32-DevKitC development board.
What You Need What You Need
------------- -------------
* 1 × :ref:`ESP32-DevKitC V2 board <get-started-esp32-devkitc-v2-board-front>` * 1 × :ref:`ESP32-DevKitC V2 board <get-started-esp32-devkitc-v2-board-front>`
* 1 × USB A / micro USB B cable * 1 × USB A / micro USB B cable
* 1 × PC loaded with Windows, Linux or Mac OS * 1 × PC loaded with Windows, Linux or Mac OS
Overview Overview
-------- --------
ESP32-DevKitC is a small-sized ESP32-based development board produced by `Espressif <https://espressif.com>`_. Most of the I/O pins are broken out to the pin headers on both sides for easy interfacing. Developers can connect these pins to peripherals as needed. Standard headers also make development easy and convenient when using a breadboard. ESP32-DevKitC is a small-sized ESP32-based development board produced by `Espressif <https://espressif.com>`_. Most of the I/O pins are broken out to the pin headers on both sides for easy interfacing. Developers can connect these pins to peripherals as needed. Standard headers also make development easy and convenient when using a breadboard.
Functional Description Functional Description
---------------------- ----------------------
The following list and figure below describe key components, interfaces and controls of ESP32-DevKitC board. The following list and figure below describe key components, interfaces and controls of ESP32-DevKitC board.
ESP-WROOM-32 ESP-WROOM-32
Standard `ESP-WROOM-32 <https://www.espressif.com/sites/default/files/documentation/esp-wroom-32_datasheet_en.pdf>`_ module soldered to the ESP32-DevKitC board. Standard `ESP-WROOM-32 <https://www.espressif.com/sites/default/files/documentation/esp-wroom-32_datasheet_en.pdf>`_ module soldered to the ESP32-DevKitC board.
EN EN
Reset button: pressing this button resets the system. Reset button: pressing this button resets the system.
Boot Boot
Download button: holding down the **Boot** button and pressing the **EN** button initiates the firmware download mode. Then user can download firmware through the serial port. Download button: holding down the **Boot** button and pressing the **EN** button initiates the firmware download mode. Then user can download firmware through the serial port.
USB USB
USB interface. It functions as the power supply for the board and the communication interface between PC and ESP-WROOM-32. USB interface. It functions as the power supply for the board and the communication interface between PC and ESP-WROOM-32.
I/O I/O
Most of the pins on the ESP-WROOM-32 are broken out to the pin headers on the board. Users can program ESP32 to enable multiple functions such as PWM, ADC, DAC, I2C, I2S, SPI, etc. Most of the pins on the ESP-WROOM-32 are broken out to the pin headers on the board. Users can program ESP32 to enable multiple functions such as PWM, ADC, DAC, I2C, I2S, SPI, etc.
.. _get-started-esp32-devkitc-v2-board-front: .. _get-started-esp32-devkitc-v2-board-front:
.. figure:: ../../_static/esp32-devkitc-v2-functional-overview.png .. figure:: ../../_static/esp32-devkitc-v2-functional-overview.png
:align: center :align: center
:alt: ESP32-DevKitC V2 board layout :alt: ESP32-DevKitC V2 board layout
:figclass: align-center :figclass: align-center
ESP32-DevKitC V2 board layout ESP32-DevKitC V2 board layout
Power Supply Options Power Supply Options
-------------------- --------------------
There following options are available to provide power supply to this board: There following options are available to provide power supply to this board:
1. Micro USB port, this is default power supply connection 1. Micro USB port, this is default power supply connection
2. 5V / GND header pins 2. 5V / GND header pins
3. 3V3 / GND header pins 3. 3V3 / GND header pins
.. warning:: .. warning::
Above options are mutually exclusive, i.e. the power supply may be provided using only one of the above options. Attempt to power the board using more than one connection at a time may damage the board and/or the power supply source. Above options are mutually exclusive, i.e. the power supply may be provided using only one of the above options. Attempt to power the board using more than one connection at a time may damage the board and/or the power supply source.
Start Application Development Start Application Development
------------------------------ ------------------------------
Before powering up the ESP32-DevKitC, please make sure that the board has been received in good condition with no obvious signs of damage. Before powering up the ESP32-DevKitC, please make sure that the board has been received in good condition with no obvious signs of damage.
To start development of applications, proceed to section :doc:`index`, that will walk you through the following steps: To start development of applications, proceed to section :doc:`index`, that will walk you through the following steps:
* :ref:`get-started-setup-toolchain` in your PC to develop applications for ESP32 in C language * :ref:`get-started-setup-toolchain` in your PC to develop applications for ESP32 in C language
* :ref:`get-started-connect` the module to the PC and verify if it is accessible * :ref:`get-started-connect` the module to the PC and verify if it is accessible
* :ref:`get-started-build-flash` an example application to the ESP32 * :ref:`get-started-build-flash` an example application to the ESP32
* :ref:`get-started-build-monitor` instantly what the application is doing * :ref:`get-started-build-monitor` instantly what the application is doing
Related Documents Related Documents
----------------- -----------------
* `ESP32-DevKitC schematic <https://dl.espressif.com/dl/schematics/ESP32-Core-Board-V2_sch.pdf>`_ (PDF) * `ESP32-DevKitC schematic <https://dl.espressif.com/dl/schematics/ESP32-Core-Board-V2_sch.pdf>`_ (PDF)
* `ESP32 Datasheet <https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf>`_ (PDF) * `ESP32 Datasheet <https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf>`_ (PDF)
* `ESP-WROOM-32 Datasheet <https://espressif.com/sites/default/files/documentation/esp-wroom-32_datasheet_en.pdf>`_ (PDF) * `ESP-WROOM-32 Datasheet <https://espressif.com/sites/default/files/documentation/esp-wroom-32_datasheet_en.pdf>`_ (PDF)

View File

@@ -1,126 +1,126 @@
ESP32-DevKitC V4 Getting Started Guide ESP32-DevKitC V4 Getting Started Guide
====================================== ======================================
This user guide shows how to get started with ESP32-DevKitC V4 development board. For description of other versions of the ESP32-DevKitC check :doc:`../hw-reference/index`. This user guide shows how to get started with ESP32-DevKitC V4 development board. For description of other versions of the ESP32-DevKitC check :doc:`../hw-reference/index`.
What You Need What You Need
------------- -------------
* 1 × :ref:`ESP32-DevKitC V4 board <get-started-esp32-devkitc-board-front>` * 1 × :ref:`ESP32-DevKitC V4 board <get-started-esp32-devkitc-board-front>`
* 1 × USB A / micro USB B cable * 1 × USB A / micro USB B cable
* 1 × PC loaded with Windows, Linux or Mac OS * 1 × PC loaded with Windows, Linux or Mac OS
Overview Overview
-------- --------
ESP32-DevKitC V4 is a small-sized ESP32-based development board produced by `Espressif <https://espressif.com>`_. Most of the I/O pins are broken out to the pin headers on both sides for easy interfacing. Developers can connect these pins to peripherals as needed. Standard headers also make development easy and convenient when using a breadboard. ESP32-DevKitC V4 is a small-sized ESP32-based development board produced by `Espressif <https://espressif.com>`_. Most of the I/O pins are broken out to the pin headers on both sides for easy interfacing. Developers can connect these pins to peripherals as needed. Standard headers also make development easy and convenient when using a breadboard.
The board supports various ESP32 modules, including :ref:`esp-modules-and-boards-esp32-wroom-32`, :ref:`ESP32-WROOM-32U <esp-modules-and-boards-esp32-wroom-32d-and-u>`, :ref:`ESP32-WROOM-32D <esp-modules-and-boards-esp32-wroom-32d-and-u>` and :ref:`esp-modules-and-boards-esp32-solo-1`. The board supports various ESP32 modules, including :ref:`esp-modules-and-boards-esp32-wroom-32`, :ref:`ESP32-WROOM-32U <esp-modules-and-boards-esp32-wroom-32d-and-u>`, :ref:`ESP32-WROOM-32D <esp-modules-and-boards-esp32-wroom-32d-and-u>` and :ref:`esp-modules-and-boards-esp32-solo-1`.
Functional Description Functional Description
---------------------- ----------------------
The following list and figure below describe key components, interfaces and controls of ESP32-DevKitC V4 board. The following list and figure below describe key components, interfaces and controls of ESP32-DevKitC V4 board.
ESP32-WROOM-32 ESP32-WROOM-32
:ref:`esp-modules-and-boards-esp32-wroom-32` module soldered to the ESP32-DevKitC V4 board. Optionally ESP32-WROOM-32D, ESP32-WROOM-32U or ESP32-SOLO-1 module may be soldered instead of the ESP32-WROOM-32. :ref:`esp-modules-and-boards-esp32-wroom-32` module soldered to the ESP32-DevKitC V4 board. Optionally ESP32-WROOM-32D, ESP32-WROOM-32U or ESP32-SOLO-1 module may be soldered instead of the ESP32-WROOM-32.
USB-UART Bridge USB-UART Bridge
A single chip USB-UART bridge provides up to 3 Mbps transfers rates. A single chip USB-UART bridge provides up to 3 Mbps transfers rates.
Boot Boot
Download button: holding down the **Boot** button and pressing the **EN** button initiates the firmware download mode. Then user can download firmware through the serial port. Download button: holding down the **Boot** button and pressing the **EN** button initiates the firmware download mode. Then user can download firmware through the serial port.
Micro USB Port Micro USB Port
USB interface. It functions as the power supply for the board and the communication interface between PC and the ESP module. USB interface. It functions as the power supply for the board and the communication interface between PC and the ESP module.
5V Power On LED 5V Power On LED
This LED lights when the USB or an external 5V power supply is applied to the board. For details see schematic in `Related Documents`_. This LED lights when the USB or an external 5V power supply is applied to the board. For details see schematic in `Related Documents`_.
EN EN
Reset button: pressing this button resets the system. Reset button: pressing this button resets the system.
I/O I/O
Most of the pins on the ESP module are broken out to the pin headers on the board. Users can program ESP32 to enable multiple functions such as PWM, ADC, DAC, I2C, I2S, SPI, etc. Most of the pins on the ESP module are broken out to the pin headers on the board. Users can program ESP32 to enable multiple functions such as PWM, ADC, DAC, I2C, I2S, SPI, etc.
.. note:: .. note::
Some of broken out pins are used internally by the ESP32-WROOM-32, ESP32-WROOM-32D/U and ESP32-SOLO-1 modules to communicate with SPI memory. They are grouped on one side of the board besides the USB connector and labeled CLK, D0, D1, D2, D3 and CMD (GPIO6 - GPIO11). In general these pins should be left unconnected, otherwise access to the SPI flash memory / SPI RAM may be disturbed. Some of broken out pins are used internally by the ESP32-WROOM-32, ESP32-WROOM-32D/U and ESP32-SOLO-1 modules to communicate with SPI memory. They are grouped on one side of the board besides the USB connector and labeled CLK, D0, D1, D2, D3 and CMD (GPIO6 - GPIO11). In general these pins should be left unconnected, otherwise access to the SPI flash memory / SPI RAM may be disturbed.
.. _get-started-esp32-devkitc-board-front: .. _get-started-esp32-devkitc-board-front:
.. figure:: ../../_static/esp32-devkitc-functional-overview.jpg .. figure:: ../../_static/esp32-devkitc-functional-overview.jpg
:align: center :align: center
:alt: ESP32-DevKitC V4 with ESP32-WROOM-32 module soldered :alt: ESP32-DevKitC V4 with ESP32-WROOM-32 module soldered
:figclass: align-center :figclass: align-center
ESP32-DevKitC V4 with ESP32-WROOM-32 module soldered ESP32-DevKitC V4 with ESP32-WROOM-32 module soldered
Power Supply Options Power Supply Options
-------------------- --------------------
There following options are available to provide power supply to this board: There following options are available to provide power supply to this board:
1. Micro USB port, this is default power supply connection 1. Micro USB port, this is default power supply connection
2. 5V / GND header pins 2. 5V / GND header pins
3. 3V3 / GND header pins 3. 3V3 / GND header pins
.. warning:: .. warning::
Above options are mutually exclusive, i.e. the power supply may be provided using only one of the above options. Attempt to power the board using more than one connection at a time may damage the board and/or the power supply source. Above options are mutually exclusive, i.e. the power supply may be provided using only one of the above options. Attempt to power the board using more than one connection at a time may damage the board and/or the power supply source.
Note on C15 Note on C15
----------- -----------
The C15, on the board of earlier batches of V4, may bring two issues: The C15, on the board of earlier batches of V4, may bring two issues:
1. The board may boot into download mode; 1. The board may boot into download mode;
2. If users output clock on GPIO0, C15 may impact the clock output. 2. If users output clock on GPIO0, C15 may impact the clock output.
As a result, if users believe that C15 will impact their use of the board, they can remove it completely (please refer to the screenshot below for the precise location of C15 that is colored in yellow). Otherwise, users do not need to concern about C15. As a result, if users believe that C15 will impact their use of the board, they can remove it completely (please refer to the screenshot below for the precise location of C15 that is colored in yellow). Otherwise, users do not need to concern about C15.
.. figure:: ../../_static/esp32-devkitc-c15-location.png .. figure:: ../../_static/esp32-devkitc-c15-location.png
:align: center :align: center
:alt: Location of C15 (colored yellow) on ESP32-DevKitC V4 board :alt: Location of C15 (colored yellow) on ESP32-DevKitC V4 board
:figclass: align-center :figclass: align-center
:width: 30% :width: 30%
Location of C15 (colored yellow) on ESP32-DevKitC V4 board Location of C15 (colored yellow) on ESP32-DevKitC V4 board
Start Application Development Start Application Development
------------------------------ ------------------------------
Before powering up the ESP32-DevKitC, please make sure that the board has been received in good condition with no obvious signs of damage. Before powering up the ESP32-DevKitC, please make sure that the board has been received in good condition with no obvious signs of damage.
To start development of applications, proceed to section :doc:`index`, that will walk you through the following steps: To start development of applications, proceed to section :doc:`index`, that will walk you through the following steps:
* :ref:`get-started-setup-toolchain` in your PC to develop applications for ESP32 in C language * :ref:`get-started-setup-toolchain` in your PC to develop applications for ESP32 in C language
* :ref:`get-started-connect` the module to the PC and verify if it is accessible * :ref:`get-started-connect` the module to the PC and verify if it is accessible
* :ref:`get-started-build-flash` an example application to the ESP32 * :ref:`get-started-build-flash` an example application to the ESP32
* :ref:`get-started-build-monitor` instantly what the application is doing * :ref:`get-started-build-monitor` instantly what the application is doing
Board Dimensions Board Dimensions
---------------- ----------------
.. figure:: ../../_static/esp32-devkitc-dimensions-back.jpg .. figure:: ../../_static/esp32-devkitc-dimensions-back.jpg
:align: center :align: center
:alt: ESP32 DevKitC board dimensions - back :alt: ESP32 DevKitC board dimensions - back
:figclass: align-center :figclass: align-center
ESP32 DevKitC board dimensions - back ESP32 DevKitC board dimensions - back
Related Documents Related Documents
----------------- -----------------
* `ESP32-DevKitC V4 schematic <https://dl.espressif.com/dl/schematics/esp32_devkitc_v4-sch-20180607a.pdf>`_ (PDF) * `ESP32-DevKitC V4 schematic <https://dl.espressif.com/dl/schematics/esp32_devkitc_v4-sch-20180607a.pdf>`_ (PDF)
* `ESP32 Datasheet <https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf>`_ (PDF) * `ESP32 Datasheet <https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf>`_ (PDF)
* `ESP32-WROOM-32 Datasheet <https://espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf>`_ (PDF) * `ESP32-WROOM-32 Datasheet <https://espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf>`_ (PDF)
* `ESP32-WROOM-32D/U Datasheet <https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32d_esp32-wroom-32u_datasheet_en.pdf>`_ (PDF) * `ESP32-WROOM-32D/U Datasheet <https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32d_esp32-wroom-32u_datasheet_en.pdf>`_ (PDF)
.. toctree:: .. toctree::
:hidden: :hidden:
get-started-devkitc-v2 get-started-devkitc-v2

View File

@@ -1,66 +1,66 @@
ESP32-PICO-KIT V3 Getting Started Guide ESP32-PICO-KIT V3 Getting Started Guide
======================================= =======================================
This user guide shows how to get started with the ESP32-PICO-KIT V3 mini development board. For description of other versions of the ESP32-PICO-KIT check :doc:`../hw-reference/index`. This user guide shows how to get started with the ESP32-PICO-KIT V3 mini development board. For description of other versions of the ESP32-PICO-KIT check :doc:`../hw-reference/index`.
What You Need What You Need
------------- -------------
* 1 × ESP32-PICO-KIT V3 mini development board * 1 × ESP32-PICO-KIT V3 mini development board
* 1 × USB A / Micro USB B cable * 1 × USB A / Micro USB B cable
* 1 × PC loaded with Windows, Linux or Mac OS * 1 × PC loaded with Windows, Linux or Mac OS
Overview Overview
-------- --------
ESP32-PICO-KIT V3 is a mini development board based on the ESP32-PICO-D4 SIP module produced by `Espressif <https://espressif.com>`_. All the IO signals and system power on ESP32-PICO-D4 are led out through two standard 20 pin x 0.1" pitch headers on both sides for easy interfacing. The development board integrates a USB-UART Bridge circuit, allowing the developers to connect the development board to a PC's USB port for downloads and debugging. ESP32-PICO-KIT V3 is a mini development board based on the ESP32-PICO-D4 SIP module produced by `Espressif <https://espressif.com>`_. All the IO signals and system power on ESP32-PICO-D4 are led out through two standard 20 pin x 0.1" pitch headers on both sides for easy interfacing. The development board integrates a USB-UART Bridge circuit, allowing the developers to connect the development board to a PC's USB port for downloads and debugging.
Functional Description Functional Description
---------------------- ----------------------
The following list and figure below describe key components, interfaces and controls of ESP32-PICO-KIT V3 board. The following list and figure below describe key components, interfaces and controls of ESP32-PICO-KIT V3 board.
ESP32-PICO-D4 ESP32-PICO-D4
Standard ESP32-PICO-D4 module soldered to the ESP32-PICO-KIT V3 board. The complete system of the ESP32 chip has been integrated into the SIP module, requiring only external antenna with LC matching network, decoupling capacitors and pull-up resistors for EN signals to function properly. Standard ESP32-PICO-D4 module soldered to the ESP32-PICO-KIT V3 board. The complete system of the ESP32 chip has been integrated into the SIP module, requiring only external antenna with LC matching network, decoupling capacitors and pull-up resistors for EN signals to function properly.
USB-UART Bridge USB-UART Bridge
A single chip USB-UART bridge provides up to 1 Mbps transfers rates. A single chip USB-UART bridge provides up to 1 Mbps transfers rates.
I/O I/O
All the pins on ESP32-PICO-D4 are broken out to the pin headers on the board. Users can program ESP32 to enable multiple functions such as PWM, ADC, DAC, I2C, I2S, SPI, etc. All the pins on ESP32-PICO-D4 are broken out to the pin headers on the board. Users can program ESP32 to enable multiple functions such as PWM, ADC, DAC, I2C, I2S, SPI, etc.
Micro USB Port Micro USB Port
USB interface. It functions as the power supply for the board and the communication interface between PC and ESP32-PICO-KIT V3. USB interface. It functions as the power supply for the board and the communication interface between PC and ESP32-PICO-KIT V3.
EN Button EN Button
Reset button; pressing this button resets the system. Reset button; pressing this button resets the system.
BOOT Button BOOT Button
Holding down the Boot button and pressing the EN button initiates the firmware download mode. Then user can download firmware through the serial port. Holding down the Boot button and pressing the EN button initiates the firmware download mode. Then user can download firmware through the serial port.
.. figure:: ../../_static/esp32-pico-kit-v3-layout.jpg .. figure:: ../../_static/esp32-pico-kit-v3-layout.jpg
:align: center :align: center
:alt: ESP32-PICO-KIT V3 board layout :alt: ESP32-PICO-KIT V3 board layout
:figclass: align-center :figclass: align-center
ESP32-PICO-KIT V3 board layout ESP32-PICO-KIT V3 board layout
Start Application Development Start Application Development
------------------------------ ------------------------------
Before powering up the ESP32-PICO-KIT V3, please make sure that the board has been received in good condition with no obvious signs of damage. Before powering up the ESP32-PICO-KIT V3, please make sure that the board has been received in good condition with no obvious signs of damage.
To start development of applications, proceed to section :doc:`index`, that will walk you through the following steps: To start development of applications, proceed to section :doc:`index`, that will walk you through the following steps:
* :ref:`get-started-setup-toolchain` in your PC to develop applications for ESP32 in C language * :ref:`get-started-setup-toolchain` in your PC to develop applications for ESP32 in C language
* :ref:`get-started-connect` the module to the PC and verify if it is accessible * :ref:`get-started-connect` the module to the PC and verify if it is accessible
* :ref:`get-started-build-flash` an example application to the ESP32 * :ref:`get-started-build-flash` an example application to the ESP32
* :ref:`get-started-build-monitor` instantly what the application is doing * :ref:`get-started-build-monitor` instantly what the application is doing
Related Documents Related Documents
----------------- -----------------
* `ESP32-PICO-KIT V3 schematic <https://dl.espressif.com/dl/schematics/esp32-pico-kit-v3_schematic.pdf>`_ (PDF) * `ESP32-PICO-KIT V3 schematic <https://dl.espressif.com/dl/schematics/esp32-pico-kit-v3_schematic.pdf>`_ (PDF)
* `ESP32-PICO-D4 Datasheet <http://espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf>`_ (PDF) * `ESP32-PICO-D4 Datasheet <http://espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf>`_ (PDF)
* :doc:`../hw-reference/index` * :doc:`../hw-reference/index`

View File

@@ -1,212 +1,212 @@
ESP32-PICO-KIT V4 Getting Started Guide ESP32-PICO-KIT V4 Getting Started Guide
======================================= =======================================
:link_to_translation:`zh_CN:[中文]` :link_to_translation:`zh_CN:[中文]`
This user guide shows how to get started with the ESP32-PICO-KIT V4 mini development board. For description of other versions of the ESP32-PICO-KIT check :doc:`../hw-reference/index`. This user guide shows how to get started with the ESP32-PICO-KIT V4 mini development board. For description of other versions of the ESP32-PICO-KIT check :doc:`../hw-reference/index`.
What You Need What You Need
------------- -------------
* 1 × :ref:`ESP32-PICO-KIT V4 mini development board <get-started-pico-kit-v4-board-front>` * 1 × :ref:`ESP32-PICO-KIT V4 mini development board <get-started-pico-kit-v4-board-front>`
* 1 × USB A / Micro USB B cable * 1 × USB A / Micro USB B cable
* 1 × PC loaded with Windows, Linux or Mac OS * 1 × PC loaded with Windows, Linux or Mac OS
If you like to start using this board right now, go directly to section `Start Application Development`_. If you like to start using this board right now, go directly to section `Start Application Development`_.
Overview Overview
-------- --------
ESP32-PICO-KIT V4 is a mini development board produced by `Espressif <https://espressif.com>`_. At the core of this board is the ESP32-PICO-D4, a System-in-Package (SIP) module with complete Wi-Fi and Bluetooth functionalities. Comparing to other ESP32 chips, the ESP32-PICO-D4 integrates several peripheral components in one single package, that otherwise would need to be installed separately. This includes a 40 MHz crystal oscillator, 4 MB flash, filter capacitors and RF matching links in. This greatly reduces quantity and costs of additional components, subsequent assembly and testing cost, as well as overall product complexity. ESP32-PICO-KIT V4 is a mini development board produced by `Espressif <https://espressif.com>`_. At the core of this board is the ESP32-PICO-D4, a System-in-Package (SIP) module with complete Wi-Fi and Bluetooth functionalities. Comparing to other ESP32 chips, the ESP32-PICO-D4 integrates several peripheral components in one single package, that otherwise would need to be installed separately. This includes a 40 MHz crystal oscillator, 4 MB flash, filter capacitors and RF matching links in. This greatly reduces quantity and costs of additional components, subsequent assembly and testing cost, as well as overall product complexity.
The development board integrates a USB-UART Bridge circuit, allowing the developers to connect the board to a PC's USB port for downloads and debugging. The development board integrates a USB-UART Bridge circuit, allowing the developers to connect the board to a PC's USB port for downloads and debugging.
For easy interfacing, all the IO signals and system power on ESP32-PICO-D4 are led out through two rows of 20 x 0.1" pitch header pads on both sides of the development board. To make the ESP32-PICO-KIT V4 fit into mini breadboards, the header pads are populated with two rows of 17 pin headers. Remaining 2 x 3 pads grouped on each side of the board besides the antenna are not populated. The remaining 2 x 3 pin headers may be soldered later by the user. For easy interfacing, all the IO signals and system power on ESP32-PICO-D4 are led out through two rows of 20 x 0.1" pitch header pads on both sides of the development board. To make the ESP32-PICO-KIT V4 fit into mini breadboards, the header pads are populated with two rows of 17 pin headers. Remaining 2 x 3 pads grouped on each side of the board besides the antenna are not populated. The remaining 2 x 3 pin headers may be soldered later by the user.
.. note:: .. note::
The 2 x 3 pads not populated with pin headers are internally connected to the flash memory embedded in the ESP32-PICO-D4 SIP module. For more details see module's datasheet in `Related Documents`_. The 2 x 3 pads not populated with pin headers are internally connected to the flash memory embedded in the ESP32-PICO-D4 SIP module. For more details see module's datasheet in `Related Documents`_.
The board dimensions are 52 x 20.3 x 10 mm (2.1" x 0.8" x 0.4"), see section `Board Dimensions`_. An overview functional block diagram is shown below. The board dimensions are 52 x 20.3 x 10 mm (2.1" x 0.8" x 0.4"), see section `Board Dimensions`_. An overview functional block diagram is shown below.
.. figure:: ../../_static/esp32-pico-kit-v4-functional-block-diagram.png .. figure:: ../../_static/esp32-pico-kit-v4-functional-block-diagram.png
:align: center :align: center
:alt: ESP32-PICO-KIT V4 functional block diagram :alt: ESP32-PICO-KIT V4 functional block diagram
:figclass: align-center :figclass: align-center
ESP32-PICO-KIT V4 functional block diagram ESP32-PICO-KIT V4 functional block diagram
Functional Description Functional Description
---------------------- ----------------------
The following list and figure below describe key components, interfaces and controls of ESP32-PICO-KIT V4 board. The following list and figure below describe key components, interfaces and controls of ESP32-PICO-KIT V4 board.
ESP32-PICO-D4 ESP32-PICO-D4
Standard ESP32-PICO-D4 module soldered to the ESP32-PICO-KIT V4 board. The complete system of the ESP32 chip has been integrated into the SIP module, requiring only external antenna with LC matching network, decoupling capacitors and pull-up resistors for EN signals to function properly. Standard ESP32-PICO-D4 module soldered to the ESP32-PICO-KIT V4 board. The complete system of the ESP32 chip has been integrated into the SIP module, requiring only external antenna with LC matching network, decoupling capacitors and pull-up resistors for EN signals to function properly.
LDO LDO
5V-to-3.3V Low dropout voltage regulator (LDO). 5V-to-3.3V Low dropout voltage regulator (LDO).
USB-UART Bridge USB-UART Bridge
A single chip USB-UART bridge provides up to 1 Mbps transfers rates. A single chip USB-UART bridge provides up to 1 Mbps transfers rates.
Micro USB Port Micro USB Port
USB interface. It functions as the power supply for the board and the communication interface between PC and ESP32-PICO-KIT V4. USB interface. It functions as the power supply for the board and the communication interface between PC and ESP32-PICO-KIT V4.
5V Power On LED 5V Power On LED
This light emitting diode lits when the USB or an external 5V power supply is applied to the board. For details see schematic in `Related Documents`_. This light emitting diode lits when the USB or an external 5V power supply is applied to the board. For details see schematic in `Related Documents`_.
I/O I/O
All the pins on ESP32-PICO-D4 are broken out to the pin headers on the board. Users can program ESP32 to enable multiple functions such as PWM, ADC, DAC, I2C, I2S, SPI, etc. For details please see section `Pin Descriptions`_. All the pins on ESP32-PICO-D4 are broken out to the pin headers on the board. Users can program ESP32 to enable multiple functions such as PWM, ADC, DAC, I2C, I2S, SPI, etc. For details please see section `Pin Descriptions`_.
BOOT Button BOOT Button
Holding down the Boot button and pressing the EN button initiates the firmware download mode. Then user can download firmware through the serial port. Holding down the Boot button and pressing the EN button initiates the firmware download mode. Then user can download firmware through the serial port.
EN Button EN Button
Reset button; pressing this button resets the system. Reset button; pressing this button resets the system.
.. _get-started-pico-kit-v4-board-front: .. _get-started-pico-kit-v4-board-front:
.. figure:: ../../_static/esp32-pico-kit-v4-layout.jpg .. figure:: ../../_static/esp32-pico-kit-v4-layout.jpg
:align: center :align: center
:alt: ESP32-PICO-KIT V4 board layout :alt: ESP32-PICO-KIT V4 board layout
:figclass: align-center :figclass: align-center
ESP32-PICO-KIT V4 board layout ESP32-PICO-KIT V4 board layout
Power Supply Options Power Supply Options
-------------------- --------------------
There following options are available to provide power supply to the ESP32-PICO-KIT V4: There following options are available to provide power supply to the ESP32-PICO-KIT V4:
1. Micro USB port, this is default power supply connection 1. Micro USB port, this is default power supply connection
2. 5V / GND header pins 2. 5V / GND header pins
3. 3V3 / GND header pins 3. 3V3 / GND header pins
.. warning:: .. warning::
Above options are mutually exclusive, i.e. the power supply may be provided using only one of the above options. Attempt to power the board using more than one connection at a time may damage the board and/or the power supply source. Above options are mutually exclusive, i.e. the power supply may be provided using only one of the above options. Attempt to power the board using more than one connection at a time may damage the board and/or the power supply source.
Start Application Development Start Application Development
----------------------------- -----------------------------
Before powering up the ESP32-PICO-KIT V4, please make sure that the board has been received in good condition with no obvious signs of damage. Before powering up the ESP32-PICO-KIT V4, please make sure that the board has been received in good condition with no obvious signs of damage.
To start development of applications, proceed to section :doc:`index`, that will walk you through the following steps: To start development of applications, proceed to section :doc:`index`, that will walk you through the following steps:
* :ref:`get-started-setup-toolchain` in your PC to develop applications for ESP32 in C language * :ref:`get-started-setup-toolchain` in your PC to develop applications for ESP32 in C language
* :ref:`get-started-connect` the module to the PC and verify if it is accessible * :ref:`get-started-connect` the module to the PC and verify if it is accessible
* :ref:`get-started-build-flash` an example application to the ESP32 * :ref:`get-started-build-flash` an example application to the ESP32
* :ref:`get-started-build-monitor` instantly what the application is doing * :ref:`get-started-build-monitor` instantly what the application is doing
Pin Descriptions Pin Descriptions
---------------- ----------------
The two tables below provide the **Name** and **Function** of I/O headers on both sides of the board, see :ref:`get-started-pico-kit-v4-board-front`. The pin numbering and header names are the same as on a schematic in `Related Documents`_. The two tables below provide the **Name** and **Function** of I/O headers on both sides of the board, see :ref:`get-started-pico-kit-v4-board-front`. The pin numbering and header names are the same as on a schematic in `Related Documents`_.
Header J2 Header J2
""""""""" """""""""
====== ================= ====== ====================================================== ====== ================= ====== ======================================================
No. Name Type Function No. Name Type Function
====== ================= ====== ====================================================== ====== ================= ====== ======================================================
1 FLASH_SD1 (FSD1) I/O | GPIO8, SD_DATA1, SPID, HS1_DATA1 :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U2CTS 1 FLASH_SD1 (FSD1) I/O | GPIO8, SD_DATA1, SPID, HS1_DATA1 :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U2CTS
2 FLASH_SD3 (FSD3) I/O | GPIO7, SD_DATA0, SPIQ, HS1_DATA0 :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U2RTS 2 FLASH_SD3 (FSD3) I/O | GPIO7, SD_DATA0, SPIQ, HS1_DATA0 :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U2RTS
3 FLASH_CLK (FCLK) I/O | GPIO6, SD_CLK, SPICLK, HS1_CLK :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U1CTS 3 FLASH_CLK (FCLK) I/O | GPIO6, SD_CLK, SPICLK, HS1_CLK :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U1CTS
4 IO21 I/O | GPIO21, VSPIHD, EMAC_TX_EN 4 IO21 I/O | GPIO21, VSPIHD, EMAC_TX_EN
5 IO22 I/O | GPIO22, VSPIWP, U0RTS, EMAC_TXD1 5 IO22 I/O | GPIO22, VSPIWP, U0RTS, EMAC_TXD1
6 IO19 I/O | GPIO19, VSPIQ, U0CTS, EMAC_TXD0 6 IO19 I/O | GPIO19, VSPIQ, U0CTS, EMAC_TXD0
7 IO23 I/O | GPIO23, VSPID, HS1_STROBE 7 IO23 I/O | GPIO23, VSPID, HS1_STROBE
8 IO18 I/O | GPIO18, VSPICLK, HS1_DATA7 8 IO18 I/O | GPIO18, VSPICLK, HS1_DATA7
9 IO5 I/O | GPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK 9 IO5 I/O | GPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK
10 IO10 I/O | GPIO10, SD_DATA3, SPIWP, HS1_DATA3, U1TXD 10 IO10 I/O | GPIO10, SD_DATA3, SPIWP, HS1_DATA3, U1TXD
11 IO9 I/O | GPIO9, SD_DATA2, SPIHD, HS1_DATA2, U1RXD 11 IO9 I/O | GPIO9, SD_DATA2, SPIHD, HS1_DATA2, U1RXD
12 RXD0 I/O | GPIO3, U0RXD :ref:`(4) <get-started-pico-kit-v4-pin-notes>` , CLK_OUT2 12 RXD0 I/O | GPIO3, U0RXD :ref:`(4) <get-started-pico-kit-v4-pin-notes>` , CLK_OUT2
13 TXD0 I/O | GPIO1, U0TXD :ref:`(4) <get-started-pico-kit-v4-pin-notes>` , CLK_OUT3, EMAC_RXD2 13 TXD0 I/O | GPIO1, U0TXD :ref:`(4) <get-started-pico-kit-v4-pin-notes>` , CLK_OUT3, EMAC_RXD2
14 IO35 I | ADC1_CH7, RTC_GPIO5 14 IO35 I | ADC1_CH7, RTC_GPIO5
15 IO34 I | ADC1_CH6, RTC_GPIO4 15 IO34 I | ADC1_CH6, RTC_GPIO4
16 IO38 I | GPIO38, ADC1_CH2, ADC_PRE_AMP :ref:`(2b) <get-started-pico-kit-v4-pin-notes>` , RTC_GPIO2 16 IO38 I | GPIO38, ADC1_CH2, ADC_PRE_AMP :ref:`(2b) <get-started-pico-kit-v4-pin-notes>` , RTC_GPIO2
17 IO37 I | GPIO37, ADC_PRE_AMP :ref:`(2a) <get-started-pico-kit-v4-pin-notes>` , ADC1_CH1, RTC_GPIO1 17 IO37 I | GPIO37, ADC_PRE_AMP :ref:`(2a) <get-started-pico-kit-v4-pin-notes>` , ADC1_CH1, RTC_GPIO1
18 EN I | CHIP_PU 18 EN I | CHIP_PU
19 GND P | Ground 19 GND P | Ground
20 VDD33 (3V3) P | 3.3V power supply 20 VDD33 (3V3) P | 3.3V power supply
====== ================= ====== ====================================================== ====== ================= ====== ======================================================
Header J3 Header J3
""""""""" """""""""
====== ================= ====== ====================================================== ====== ================= ====== ======================================================
No. Name Type Function No. Name Type Function
====== ================= ====== ====================================================== ====== ================= ====== ======================================================
1 FLASH_CS (FCS) I/O | GPIO16, HS1_DATA4 :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U2RXD, EMAC_CLK_OUT 1 FLASH_CS (FCS) I/O | GPIO16, HS1_DATA4 :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U2RXD, EMAC_CLK_OUT
2 FLASH_SD0 (FSD0) I/O | GPIO17, HS1_DATA5 :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U2TXD, EMAC_CLK_OUT_180 2 FLASH_SD0 (FSD0) I/O | GPIO17, HS1_DATA5 :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U2TXD, EMAC_CLK_OUT_180
3 FLASH_SD2 (FSD2) I/O | GPIO11, SD_CMD, SPICS0, HS1_CMD :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U1RTS 3 FLASH_SD2 (FSD2) I/O | GPIO11, SD_CMD, SPICS0, HS1_CMD :ref:`(1) <get-started-pico-kit-v4-pin-notes>` , U1RTS
4 SENSOR_VP (FSVP) I | GPIO36, ADC1_CH0, ADC_PRE_AMP :ref:`(2a) <get-started-pico-kit-v4-pin-notes>` , RTC_GPIO0 4 SENSOR_VP (FSVP) I | GPIO36, ADC1_CH0, ADC_PRE_AMP :ref:`(2a) <get-started-pico-kit-v4-pin-notes>` , RTC_GPIO0
5 SENSOR_VN (FSVN) I | GPIO39, ADC1_CH3, ADC_PRE_AMP :ref:`(2b) <get-started-pico-kit-v4-pin-notes>` , RTC_GPIO3 5 SENSOR_VN (FSVN) I | GPIO39, ADC1_CH3, ADC_PRE_AMP :ref:`(2b) <get-started-pico-kit-v4-pin-notes>` , RTC_GPIO3
6 IO25 I/O | GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0 6 IO25 I/O | GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0
7 IO26 I/O | GPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1 7 IO26 I/O | GPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1
8 IO32 I/O | 32K_XP :ref:`(3a) <get-started-pico-kit-v4-pin-notes>` , ADC1_CH4, TOUCH9, RTC_GPIO9 8 IO32 I/O | 32K_XP :ref:`(3a) <get-started-pico-kit-v4-pin-notes>` , ADC1_CH4, TOUCH9, RTC_GPIO9
9 IO33 I/O | 32K_XN :ref:`(3b) <get-started-pico-kit-v4-pin-notes>` , ADC1_CH5, TOUCH8, RTC_GPIO8 9 IO33 I/O | 32K_XN :ref:`(3b) <get-started-pico-kit-v4-pin-notes>` , ADC1_CH5, TOUCH8, RTC_GPIO8
10 IO27 I/O | GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17 10 IO27 I/O | GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17
| EMAC_RX_DV | EMAC_RX_DV
11 IO14 I/O | ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, 11 IO14 I/O | ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK,
| HS2_CLK, SD_CLK, EMAC_TXD2 | HS2_CLK, SD_CLK, EMAC_TXD2
12 IO12 I/O | ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI :ref:`(5) <get-started-pico-kit-v4-pin-notes>` , HSPIQ, 12 IO12 I/O | ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI :ref:`(5) <get-started-pico-kit-v4-pin-notes>` , HSPIQ,
| HS2_DATA2, SD_DATA2, EMAC_TXD3 | HS2_DATA2, SD_DATA2, EMAC_TXD3
13 IO13 I/O | ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, 13 IO13 I/O | ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID,
| HS2_DATA3, SD_DATA3, EMAC_RX_ER | HS2_DATA3, SD_DATA3, EMAC_RX_ER
14 IO15 I/O | ADC2_CH3, TOUCH3, RTC_GPIO13, MTDO, HSPICS0 14 IO15 I/O | ADC2_CH3, TOUCH3, RTC_GPIO13, MTDO, HSPICS0
| HS2_CMD, SD_CMD, EMAC_RXD3 | HS2_CMD, SD_CMD, EMAC_RXD3
15 IO2 I/O | ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, 15 IO2 I/O | ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP,
| HS2_DATA0, SD_DATA0 | HS2_DATA0, SD_DATA0
16 IO4 I/O | ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, 16 IO4 I/O | ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD,
| HS2_DATA1, SD_DATA1, EMAC_TX_ER | HS2_DATA1, SD_DATA1, EMAC_TX_ER
17 IO0 I/O | ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1 17 IO0 I/O | ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1
| EMAC_TX_CLK | EMAC_TX_CLK
18 VDD33 (3V3) P | 3.3V power supply 18 VDD33 (3V3) P | 3.3V power supply
19 GND P | Ground 19 GND P | Ground
20 EXT_5V (5V) P | 5V power supply 20 EXT_5V (5V) P | 5V power supply
====== ================= ====== ====================================================== ====== ================= ====== ======================================================
.. _get-started-pico-kit-v4-pin-notes: .. _get-started-pico-kit-v4-pin-notes:
**Notes to** `Pin Descriptions`_ **Notes to** `Pin Descriptions`_
1. This pin is connected to the flash pin of ESP32-PICO-D4. 1. This pin is connected to the flash pin of ESP32-PICO-D4.
2. When used as ADC_PRE_AMP, connect 270 pF capacitors between: (a) SENSOR_VP and IO37, (b) SENSOR_VN and IO38. 2. When used as ADC_PRE_AMP, connect 270 pF capacitors between: (a) SENSOR_VP and IO37, (b) SENSOR_VN and IO38.
3. 32.768 kHz crystal oscillator: (a) input, (b) output. 3. 32.768 kHz crystal oscillator: (a) input, (b) output.
4. This pin is connected to the pin of the USB bridge chip on the board. 4. This pin is connected to the pin of the USB bridge chip on the board.
5. The operating voltage of ESP32-PICO-KITs embedded SPI flash is 3.3V. Therefore, the strapping pin MTDI should hold bit ”0” during the module power-on reset. 5. The operating voltage of ESP32-PICO-KITs embedded SPI flash is 3.3V. Therefore, the strapping pin MTDI should hold bit ”0” during the module power-on reset.
Board Dimensions Board Dimensions
---------------- ----------------
.. figure:: ../../_static/esp32-pico-kit-v4-dimensions-back.jpg .. figure:: ../../_static/esp32-pico-kit-v4-dimensions-back.jpg
:align: center :align: center
:alt: ESP32-PICO-KIT V4 dimensions - back :alt: ESP32-PICO-KIT V4 dimensions - back
:figclass: align-center :figclass: align-center
ESP32-PICO-KIT V4 dimensions - back ESP32-PICO-KIT V4 dimensions - back
.. figure:: ../../_static/esp32-pico-kit-v4-dimensions-side.jpg .. figure:: ../../_static/esp32-pico-kit-v4-dimensions-side.jpg
:align: center :align: center
:alt: ESP32-PICO-KIT V4 dimensions - side :alt: ESP32-PICO-KIT V4 dimensions - side
:figclass: align-center :figclass: align-center
ESP32-PICO-KIT V4 dimensions - side ESP32-PICO-KIT V4 dimensions - side
Related Documents Related Documents
----------------- -----------------
* `ESP32-PICO-KIT V4 schematic <https://dl.espressif.com/dl/schematics/esp32-pico-kit-v4_schematic.pdf>`_ (PDF) * `ESP32-PICO-KIT V4 schematic <https://dl.espressif.com/dl/schematics/esp32-pico-kit-v4_schematic.pdf>`_ (PDF)
* `ESP32-PICO-D4 Datasheet <http://espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf>`_ (PDF) * `ESP32-PICO-D4 Datasheet <http://espressif.com/sites/default/files/documentation/esp32-pico-d4_datasheet_en.pdf>`_ (PDF)
* :doc:`../hw-reference/index` * :doc:`../hw-reference/index`
.. toctree:: .. toctree::
:hidden: :hidden:
get-started-pico-kit-v3 get-started-pico-kit-v3

View File

@@ -1,412 +1,412 @@
ESP-WROVER-KIT V3 Getting Started Guide ESP-WROVER-KIT V3 Getting Started Guide
======================================= =======================================
This user guide shows how to get started with ESP-WROVER-KIT V3 development board including description of its functionality and configuration options. For description of other versions of the ESP-WROVER-KIT check :doc:`../hw-reference/index`. This user guide shows how to get started with ESP-WROVER-KIT V3 development board including description of its functionality and configuration options. For description of other versions of the ESP-WROVER-KIT check :doc:`../hw-reference/index`.
If you like to start using this board right now, go directly to section :ref:`get-started-esp-wrover-kit-start-development`. If you like to start using this board right now, go directly to section :ref:`get-started-esp-wrover-kit-start-development`.
What You Need What You Need
------------- -------------
* 1 × :ref:`ESP-WROVER-KIT V3 board <get-started-esp-wrover-kit-board-front>` * 1 × :ref:`ESP-WROVER-KIT V3 board <get-started-esp-wrover-kit-board-front>`
* 1 x Micro USB 2.0 Cable, Type A to Micro B * 1 x Micro USB 2.0 Cable, Type A to Micro B
* 1 × PC loaded with Windows, Linux or Mac OS * 1 × PC loaded with Windows, Linux or Mac OS
Overview Overview
^^^^^^^^ ^^^^^^^^
The ESP-WROVER-KIT is a development board produced by `Espressif <https://espressif.com>`_ built around ESP32. This board is compatible with ESP32 modules, including the ESP32-WROOM-32 and ESP32-WROVER. The ESP-WROVER-KIT features support for an LCD and MicroSD card. The I/O pins have been broken out from the ESP32 module for easy extension. The board carries an advanced multi-protocol USB bridge (the FTDI FT2232HL), enabling developers to use JTAG directly to debug the ESP32 through the USB interface. The development board makes secondary development easy and cost-effective. The ESP-WROVER-KIT is a development board produced by `Espressif <https://espressif.com>`_ built around ESP32. This board is compatible with ESP32 modules, including the ESP32-WROOM-32 and ESP32-WROVER. The ESP-WROVER-KIT features support for an LCD and MicroSD card. The I/O pins have been broken out from the ESP32 module for easy extension. The board carries an advanced multi-protocol USB bridge (the FTDI FT2232HL), enabling developers to use JTAG directly to debug the ESP32 through the USB interface. The development board makes secondary development easy and cost-effective.
.. note:: .. note::
ESP-WROVER-KIT V3 integrates the ESP32-WROVER module by default. ESP-WROVER-KIT V3 integrates the ESP32-WROVER module by default.
Functionality Overview Functionality Overview
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
Block diagram below presents main components of ESP-WROVER-KIT and interconnections between components. Block diagram below presents main components of ESP-WROVER-KIT and interconnections between components.
.. figure:: ../../_static/esp32-wrover-kit-block-diagram.png .. figure:: ../../_static/esp32-wrover-kit-block-diagram.png
:align: center :align: center
:alt: ESP-WROVER-KIT block diagram :alt: ESP-WROVER-KIT block diagram
:figclass: align-center :figclass: align-center
ESP-WROVER-KIT block diagram ESP-WROVER-KIT block diagram
Functional Description Functional Description
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
The following list and figures below describe key components, interfaces and controls of ESP-WROVER-KIT board. The following list and figures below describe key components, interfaces and controls of ESP-WROVER-KIT board.
32.768 kHz 32.768 kHz
An external precision 32.768 kHz crystal oscillator provides the chip with a clock of low-power consumption during the Deep-sleep mode. An external precision 32.768 kHz crystal oscillator provides the chip with a clock of low-power consumption during the Deep-sleep mode.
0R 0R
A zero Ohm resistor intended as a placeholder for a current shunt. May be desoldered or replaced with a current shunt to facilitate measurement of current required by ESP32 module depending on power mode. A zero Ohm resistor intended as a placeholder for a current shunt. May be desoldered or replaced with a current shunt to facilitate measurement of current required by ESP32 module depending on power mode.
ESP32 Module ESP32 Module
ESP-WROVER-KIT is compatible with both ESP32-WROOM-32 and ESP32-WROVER. The ESP32-WROVER module features all the functions of ESP32-WROOM-32 and integrates an external 32-MBit PSRAM for flexible extended storage and data processing capabilities. ESP-WROVER-KIT is compatible with both ESP32-WROOM-32 and ESP32-WROVER. The ESP32-WROVER module features all the functions of ESP32-WROOM-32 and integrates an external 32-MBit PSRAM for flexible extended storage and data processing capabilities.
.. note:: .. note::
GPIO16 and GPIO17 are used as the CS and clock signal for PSRAM. To ensure reliable performance, the two GPIOs are not broken out. GPIO16 and GPIO17 are used as the CS and clock signal for PSRAM. To ensure reliable performance, the two GPIOs are not broken out.
FT2232 FT2232
The FT2232 chip is a multi-protocol USB-to-serial bridge. Users can control and program the FT2232 chip through the USB interface to establish communication with ESP32. The FT2232 chip also features USB-to-JTAG interface. USB-to-JTAG is available on channel A of FT2232, USB-to-serial on channel B. The embedded FT2232 chip is one of the distinguishing features of the ESPWROVER-KIT. It enhances users convenience in terms of application development and debugging. In addition, users do not need to buy a JTAG debugger separately, which reduces the development cost, see `ESP-WROVER-KIT V3 schematic`_. The FT2232 chip is a multi-protocol USB-to-serial bridge. Users can control and program the FT2232 chip through the USB interface to establish communication with ESP32. The FT2232 chip also features USB-to-JTAG interface. USB-to-JTAG is available on channel A of FT2232, USB-to-serial on channel B. The embedded FT2232 chip is one of the distinguishing features of the ESPWROVER-KIT. It enhances users convenience in terms of application development and debugging. In addition, users do not need to buy a JTAG debugger separately, which reduces the development cost, see `ESP-WROVER-KIT V3 schematic`_.
UART UART
Serial port: the serial TX/RX signals on FT2232HL and ESP32 are broken out to the two sides of JP11. By default, the two signals are connected with jumpers. To use the ESP32 module serial interface only, the jumpers may be removed and the module can be connected to another external serial device. Serial port: the serial TX/RX signals on FT2232HL and ESP32 are broken out to the two sides of JP11. By default, the two signals are connected with jumpers. To use the ESP32 module serial interface only, the jumpers may be removed and the module can be connected to another external serial device.
SPI SPI
SPI interface: the SPI interface connects to an external flash (PSRAM). To interface another SPI device, an extra CS signal is needed. The electrical level on the flash of this module is 1.8V. If an ESP32-WROOM-32 is being used, please note that the electrical level on the flash of this module is 3.3V. SPI interface: the SPI interface connects to an external flash (PSRAM). To interface another SPI device, an extra CS signal is needed. The electrical level on the flash of this module is 1.8V. If an ESP32-WROOM-32 is being used, please note that the electrical level on the flash of this module is 3.3V.
CTS/RTS CTS/RTS
Serial port flow control signals: the pins are not connected to the circuitry by default. To enable them, respective pins of JP14 must be shorted with jumpers. Serial port flow control signals: the pins are not connected to the circuitry by default. To enable them, respective pins of JP14 must be shorted with jumpers.
JTAG JTAG
JTAG interface: the JTAG signals on FT2232HL and ESP32 are broken out to the two sides of JP8. By default, the two signals are disconnected. To enable JTAG, shorting jumpers are required on the signals. JTAG interface: the JTAG signals on FT2232HL and ESP32 are broken out to the two sides of JP8. By default, the two signals are disconnected. To enable JTAG, shorting jumpers are required on the signals.
EN EN
Reset button: pressing this button resets the system. Reset button: pressing this button resets the system.
Boot Boot
Download button: holding down the **Boot** button and pressing the **EN** button initiates the firmware download mode. Then user can download firmware through the serial port. Download button: holding down the **Boot** button and pressing the **EN** button initiates the firmware download mode. Then user can download firmware through the serial port.
USB USB
USB interface. It functions as the power supply for the board and the communication interface between PC and ESP32 module. USB interface. It functions as the power supply for the board and the communication interface between PC and ESP32 module.
Power Select Power Select
Power supply selection interface: the ESP-WROVER-KIT can be powered through the USB interface or the 5V Input interface. The user can select the power supply with a jumper. More details can be found in section :ref:`get-started-esp-wrover-kit-setup-options`, jumper header JP7. Power supply selection interface: the ESP-WROVER-KIT can be powered through the USB interface or the 5V Input interface. The user can select the power supply with a jumper. More details can be found in section :ref:`get-started-esp-wrover-kit-setup-options`, jumper header JP7.
Power Key Power Key
Power on/off button: toggling to the right powers the board on; toggling to the left powers the board off. Power on/off button: toggling to the right powers the board on; toggling to the left powers the board off.
5V Input 5V Input
The 5V power supply interface is used as a backup power supply in case of full-load operation. The 5V power supply interface is used as a backup power supply in case of full-load operation.
LDO LDO
NCP1117(1A). 5V-to-3.3V LDO. (There is an alternative pin-compatible LDO — LM317DCY, with an output current of up to 1.5A). NCP1117 can provide a maximum current of 1A. The LDO solutions are available with both fixed output voltage and variable output voltage. For details please refer to `ESP-WROVER-KIT V3 schematic`_. NCP1117(1A). 5V-to-3.3V LDO. (There is an alternative pin-compatible LDO — LM317DCY, with an output current of up to 1.5A). NCP1117 can provide a maximum current of 1A. The LDO solutions are available with both fixed output voltage and variable output voltage. For details please refer to `ESP-WROVER-KIT V3 schematic`_.
Camera Camera
Camera interface: a standard OV7670 camera module is supported. Camera interface: a standard OV7670 camera module is supported.
RGB RGB
Red, green and blue (RGB) light emitting diodes (LEDs), which may be controlled by pulse width modulation (PWM). Red, green and blue (RGB) light emitting diodes (LEDs), which may be controlled by pulse width modulation (PWM).
I/O I/O
All the pins on the ESP32 module are led out to the pin headers on the ESP-WROVER-KIT. Users can program ESP32 to enable multiple functions such as PWM, ADC, DAC, I2C, I2S, SPI, etc. All the pins on the ESP32 module are led out to the pin headers on the ESP-WROVER-KIT. Users can program ESP32 to enable multiple functions such as PWM, ADC, DAC, I2C, I2S, SPI, etc.
Micro SD Card Micro SD Card
Micro SD card slot for data storage. Micro SD card slot for data storage.
LCD LCD
ESP-WROVER-KIT supports mounting and interfacing a 3.2” SPI (standard 4-wire Serial Peripheral Interface) LCD, as shown on figure :ref:`get-started-esp-wrover-kit-board-back`. ESP-WROVER-KIT supports mounting and interfacing a 3.2” SPI (standard 4-wire Serial Peripheral Interface) LCD, as shown on figure :ref:`get-started-esp-wrover-kit-board-back`.
.. _get-started-esp-wrover-kit-board-front: .. _get-started-esp-wrover-kit-board-front:
.. figure:: ../../_static/esp32-wrover-kit-layout-front.jpg .. figure:: ../../_static/esp32-wrover-kit-layout-front.jpg
:align: center :align: center
:alt: ESP-WROVER-KIT board layout - front :alt: ESP-WROVER-KIT board layout - front
:figclass: align-center :figclass: align-center
ESP-WROVER-KIT board layout - front ESP-WROVER-KIT board layout - front
.. _get-started-esp-wrover-kit-board-back: .. _get-started-esp-wrover-kit-board-back:
.. figure:: ../../_static/esp32-wrover-kit-layout-back.jpg .. figure:: ../../_static/esp32-wrover-kit-layout-back.jpg
:align: center :align: center
:alt: ESP-WROVER-KIT board layout - back :alt: ESP-WROVER-KIT board layout - back
:figclass: align-center :figclass: align-center
ESP-WROVER-KIT board layout - back ESP-WROVER-KIT board layout - back
.. _get-started-esp-wrover-kit-setup-options: .. _get-started-esp-wrover-kit-setup-options:
Setup Options Setup Options
^^^^^^^^^^^^^ ^^^^^^^^^^^^^
There are five jumper headers available to set up the board functionality. Typical options to select from are listed in table below. There are five jumper headers available to set up the board functionality. Typical options to select from are listed in table below.
+--------+------------------+--------------------------------------------------+ +--------+------------------+--------------------------------------------------+
| Header | Jumper Setting | Description of Functionality | | Header | Jumper Setting | Description of Functionality |
+--------+------------------+--------------------------------------------------+ +--------+------------------+--------------------------------------------------+
| JP7 | |jp7-ext_5v| | Power ESP-WROVER-KIT board from an external | | JP7 | |jp7-ext_5v| | Power ESP-WROVER-KIT board from an external |
| | | power supply | | | | power supply |
+--------+------------------+--------------------------------------------------+ +--------+------------------+--------------------------------------------------+
| JP7 | |jp7-usb_5v| | Power ESP-WROVER-KIT board from an USB port | | JP7 | |jp7-usb_5v| | Power ESP-WROVER-KIT board from an USB port |
+--------+------------------+--------------------------------------------------+ +--------+------------------+--------------------------------------------------+
| JP8 | |jp8| | Enable JTAG functionality | | JP8 | |jp8| | Enable JTAG functionality |
+--------+------------------+--------------------------------------------------+ +--------+------------------+--------------------------------------------------+
| JP11 | |jp11-rx-tx| | Enable UART communication | | JP11 | |jp11-rx-tx| | Enable UART communication |
+--------+------------------+--------------------------------------------------+ +--------+------------------+--------------------------------------------------+
| JP14 | |jp14| | Enable RTS/CTS flow control for serial | | JP14 | |jp14| | Enable RTS/CTS flow control for serial |
| | | communication | | | | communication |
+--------+------------------+--------------------------------------------------+ +--------+------------------+--------------------------------------------------+
Allocation of ESP32 Pins Allocation of ESP32 Pins
^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
Several pins / terminals of ESP32 module are allocated to the on board hardware. Some of them, like GPIO0 or GPIO2, have multiple functions. If certain hardware is not installed, e.g. nothing is plugged in to the Camera / JP4 header, then selected GPIOs may be used for other purposes. Several pins / terminals of ESP32 module are allocated to the on board hardware. Some of them, like GPIO0 or GPIO2, have multiple functions. If certain hardware is not installed, e.g. nothing is plugged in to the Camera / JP4 header, then selected GPIOs may be used for other purposes.
Main I/O Connector / JP1 Main I/O Connector / JP1
"""""""""""""""""""""""" """"""""""""""""""""""""
The JP1 connector is shown in two columns in the middle under "I/O" headers. The two columns "Shared With" outside, describe where else on the board certain GPIO is used. The JP1 connector is shown in two columns in the middle under "I/O" headers. The two columns "Shared With" outside, describe where else on the board certain GPIO is used.
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| Shared With | I/O | I/O | Shared With | | Shared With | I/O | I/O | Shared With |
+======================+======+======+======================+ +======================+======+======+======================+
| | 3.3V | GND | | | | 3.3V | GND | |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| NC/XTAL | IO32 | IO33 | NC/XTAL | | NC/XTAL | IO32 | IO33 | NC/XTAL |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| JTAG, MicroSD | IO12 | IO13 | JTAG, MicroSD | | JTAG, MicroSD | IO12 | IO13 | JTAG, MicroSD |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| JTAG, MicroSD | IO14 | IO27 | Camera | | JTAG, MicroSD | IO14 | IO27 | Camera |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| Camera | IO26 | IO25 | Camera, LCD | | Camera | IO26 | IO25 | Camera, LCD |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| Camera | IO35 | IO34 | Camera | | Camera | IO35 | IO34 | Camera |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| Camera | IO39 | IO36 | Camera | | Camera | IO39 | IO36 | Camera |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| JTAG | EN | IO23 | Camera, LCD | | JTAG | EN | IO23 | Camera, LCD |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| Camera, LCD | IO22 | IO21 | Camera, LCD, MicroSD | | Camera, LCD | IO22 | IO21 | Camera, LCD, MicroSD |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| Camera, LCD | IO19 | IO18 | Camera, LCD | | Camera, LCD | IO19 | IO18 | Camera, LCD |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| Camera, LCD | IO5 | IO17 | PSRAM | | Camera, LCD | IO5 | IO17 | PSRAM |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| PSRAM | IO16 | IO4 | LED, Camera, MicroSD | | PSRAM | IO16 | IO4 | LED, Camera, MicroSD |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| LED, Boot | IO0 | IO2 | LED, Camera, MicroSD | | LED, Boot | IO0 | IO2 | LED, Camera, MicroSD |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
| JTAG, MicroSD | IO15 | 5V | | | JTAG, MicroSD | IO15 | 5V | |
+----------------------+------+------+----------------------+ +----------------------+------+------+----------------------+
Legend: Legend:
* NC/XTAL - :ref:`32.768 kHz Oscillator <get-started-esp-wrover-kit-xtal>` * NC/XTAL - :ref:`32.768 kHz Oscillator <get-started-esp-wrover-kit-xtal>`
* JTAG - :ref:`JTAG / JP8 <get-started-esp-wrover-jtag-header>` * JTAG - :ref:`JTAG / JP8 <get-started-esp-wrover-jtag-header>`
* Boot - Boot button / SW2 * Boot - Boot button / SW2
* Camera - :ref:`Camera / JP4 <get-started-esp-wrover-camera-header>` * Camera - :ref:`Camera / JP4 <get-started-esp-wrover-camera-header>`
* LED - :ref:`RGB LED <get-started-esp-wrover-rgb-led-connections>` * LED - :ref:`RGB LED <get-started-esp-wrover-rgb-led-connections>`
* MicroSD - :ref:`MicroSD Card / J4 <get-started-esp-wrover-microsd-card-slot>` * MicroSD - :ref:`MicroSD Card / J4 <get-started-esp-wrover-microsd-card-slot>`
* LCD - :ref:`LCD / U5 <get-started-esp-wrover-lcd-connector>` * LCD - :ref:`LCD / U5 <get-started-esp-wrover-lcd-connector>`
* PSRAM - ESP32-WROVER's PSRAM, if ESP32-WROVER is installed * PSRAM - ESP32-WROVER's PSRAM, if ESP32-WROVER is installed
.. _get-started-esp-wrover-kit-xtal: .. _get-started-esp-wrover-kit-xtal:
32.768 kHz Oscillator 32.768 kHz Oscillator
""""""""""""""""""""" """""""""""""""""""""
+---+-----------+ +---+-----------+
| | ESP32 Pin | | | ESP32 Pin |
+===+===========+ +===+===========+
| 1 | GPIO32 | | 1 | GPIO32 |
+---+-----------+ +---+-----------+
| 2 | GPIO33 | | 2 | GPIO33 |
+---+-----------+ +---+-----------+
.. note:: .. note::
As GPIO32 and GPIO33 are connected to the oscillator, to maintain signal integrity, they are not connected to JP1 I/O expansion connector. This allocation may be changed from oscillator to JP1 by desoldering 0R resistors from positions R11 / R23 and installing them in positions R12 / R24. As GPIO32 and GPIO33 are connected to the oscillator, to maintain signal integrity, they are not connected to JP1 I/O expansion connector. This allocation may be changed from oscillator to JP1 by desoldering 0R resistors from positions R11 / R23 and installing them in positions R12 / R24.
.. _get-started-esp-wrover-spi-flash-header: .. _get-started-esp-wrover-spi-flash-header:
SPI Flash / JP13 SPI Flash / JP13
"""""""""""""""" """"""""""""""""
+---+--------------+ +---+--------------+
| | ESP32 Pin | | | ESP32 Pin |
+===+==============+ +===+==============+
| 1 | CLK / GPIO6 | | 1 | CLK / GPIO6 |
+---+--------------+ +---+--------------+
| 2 | SD0 / GPIO7 | | 2 | SD0 / GPIO7 |
+---+--------------+ +---+--------------+
| 3 | SD1 / GPIO8 | | 3 | SD1 / GPIO8 |
+---+--------------+ +---+--------------+
| 4 | SD2 / GPIO9 | | 4 | SD2 / GPIO9 |
+---+--------------+ +---+--------------+
| 5 | SD3 / GPIO10 | | 5 | SD3 / GPIO10 |
+---+--------------+ +---+--------------+
| 6 | CMD / GPIO11 | | 6 | CMD / GPIO11 |
+---+--------------+ +---+--------------+
.. important:: .. important::
The module's flash bus is connected to the pin header JP13 through 0-Ohm resistors R140 ~ R145. If the flash frequency needs to operate at 80 MHz, to improve integrity of the bus signals, it is recommended to desolder resistors R140 ~ R145. At this point, the module's flash bus is disconnected with the pin header JP13. The module's flash bus is connected to the pin header JP13 through 0-Ohm resistors R140 ~ R145. If the flash frequency needs to operate at 80 MHz, to improve integrity of the bus signals, it is recommended to desolder resistors R140 ~ R145. At this point, the module's flash bus is disconnected with the pin header JP13.
.. _get-started-esp-wrover-jtag-header: .. _get-started-esp-wrover-jtag-header:
JTAG / JP8 JTAG / JP8
"""""""""" """"""""""
+---+---------------+-------------+ +---+---------------+-------------+
| | ESP32 Pin | JTAG Signal | | | ESP32 Pin | JTAG Signal |
+===+===============+=============+ +===+===============+=============+
| 1 | EN | TRST_N | | 1 | EN | TRST_N |
+---+---------------+-------------+ +---+---------------+-------------+
| 2 | MTDO / GPIO15 | TDO | | 2 | MTDO / GPIO15 | TDO |
+---+---------------+-------------+ +---+---------------+-------------+
| 3 | MTDI / GPIO12 | TDI | | 3 | MTDI / GPIO12 | TDI |
+---+---------------+-------------+ +---+---------------+-------------+
| 4 | MTCK / GPIO13 | TCK | | 4 | MTCK / GPIO13 | TCK |
+---+---------------+-------------+ +---+---------------+-------------+
| 5 | MTMS / GPIO14 | TMS | | 5 | MTMS / GPIO14 | TMS |
+---+---------------+-------------+ +---+---------------+-------------+
.. _get-started-esp-wrover-camera-header: .. _get-started-esp-wrover-camera-header:
Camera / JP4 Camera / JP4
"""""""""""" """"""""""""
+----+--------------+----------------------+ +----+--------------+----------------------+
| | ESP32 Pin | Camera Signal | | | ESP32 Pin | Camera Signal |
+====+==============+======================+ +====+==============+======================+
| 1 | GPIO27 | SCCB Clock | | 1 | GPIO27 | SCCB Clock |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 2 | GPIO26 | SCCB Data | | 2 | GPIO26 | SCCB Data |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 3 | GPIO21 | System Clock | | 3 | GPIO21 | System Clock |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 4 | GPIO25 | Vertical Sync | | 4 | GPIO25 | Vertical Sync |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 5 | GPIO23 | Horizontal Reference | | 5 | GPIO23 | Horizontal Reference |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 6 | GPIO22 | Pixel Clock | | 6 | GPIO22 | Pixel Clock |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 7 | GPIO4 | Pixel Data Bit 0 | | 7 | GPIO4 | Pixel Data Bit 0 |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 8 | GPIO5 | Pixel Data Bit 1 | | 8 | GPIO5 | Pixel Data Bit 1 |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 9 | GPIO18 | Pixel Data Bit 2 | | 9 | GPIO18 | Pixel Data Bit 2 |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 10 | GPIO19 | Pixel Data Bit 3 | | 10 | GPIO19 | Pixel Data Bit 3 |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 11 | GPIO36 | Pixel Data Bit 4 | | 11 | GPIO36 | Pixel Data Bit 4 |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 11 | GPIO39 | Pixel Data Bit 5 | | 11 | GPIO39 | Pixel Data Bit 5 |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 11 | GPIO34 | Pixel Data Bit 6 | | 11 | GPIO34 | Pixel Data Bit 6 |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 11 | GPIO35 | Pixel Data Bit 7 | | 11 | GPIO35 | Pixel Data Bit 7 |
+----+--------------+----------------------+ +----+--------------+----------------------+
| 11 | GPIO2 | Camera Reset | | 11 | GPIO2 | Camera Reset |
+----+--------------+----------------------+ +----+--------------+----------------------+
.. _get-started-esp-wrover-rgb-led-connections: .. _get-started-esp-wrover-rgb-led-connections:
RGB LED RGB LED
""""""" """""""
+---+-----------+---------+ +---+-----------+---------+
| | ESP32 Pin | RGB LED | | | ESP32 Pin | RGB LED |
+===+===========+=========+ +===+===========+=========+
| 1 | GPIO0 | Red | | 1 | GPIO0 | Red |
+---+-----------+---------+ +---+-----------+---------+
| 2 | GPIO2 | Blue | | 2 | GPIO2 | Blue |
+---+-----------+---------+ +---+-----------+---------+
| 3 | GPIO4 | Green | | 3 | GPIO4 | Green |
+---+-----------+---------+ +---+-----------+---------+
.. _get-started-esp-wrover-microsd-card-slot: .. _get-started-esp-wrover-microsd-card-slot:
MicroSD Card / J4 MicroSD Card / J4
""""""""""""""""" """""""""""""""""
+---+---------------+----------------+ +---+---------------+----------------+
| | ESP32 Pin | MicroSD Signal | | | ESP32 Pin | MicroSD Signal |
+===+===============+================+ +===+===============+================+
| 1 | MTDI / GPIO12 | DATA2 | | 1 | MTDI / GPIO12 | DATA2 |
+---+---------------+----------------+ +---+---------------+----------------+
| 2 | MTCK / GPIO13 | CD / DATA3 | | 2 | MTCK / GPIO13 | CD / DATA3 |
+---+---------------+----------------+ +---+---------------+----------------+
| 3 | MTDO / GPIO15 | CMD | | 3 | MTDO / GPIO15 | CMD |
+---+---------------+----------------+ +---+---------------+----------------+
| 4 | MTMS / GPIO14 | CLK | | 4 | MTMS / GPIO14 | CLK |
+---+---------------+----------------+ +---+---------------+----------------+
| 5 | GPIO2 | DATA0 | | 5 | GPIO2 | DATA0 |
+---+---------------+----------------+ +---+---------------+----------------+
| 6 | GPIO4 | DATA1 | | 6 | GPIO4 | DATA1 |
+---+---------------+----------------+ +---+---------------+----------------+
| 7 | GPIO21 | CD | | 7 | GPIO21 | CD |
+---+---------------+----------------+ +---+---------------+----------------+
.. _get-started-esp-wrover-lcd-connector: .. _get-started-esp-wrover-lcd-connector:
LCD / U5 LCD / U5
"""""""" """"""""
+---+-----------+------------+ +---+-----------+------------+
| | ESP32 Pin | LCD Signal | | | ESP32 Pin | LCD Signal |
+===+===========+============+ +===+===========+============+
| 1 | GPIO18 | RESET | | 1 | GPIO18 | RESET |
+---+-----------+------------+ +---+-----------+------------+
| 2 | GPIO19 | SCL | | 2 | GPIO19 | SCL |
+---+-----------+------------+ +---+-----------+------------+
| 3 | GPIO21 | D/C | | 3 | GPIO21 | D/C |
+---+-----------+------------+ +---+-----------+------------+
| 4 | GPIO22 | CS | | 4 | GPIO22 | CS |
+---+-----------+------------+ +---+-----------+------------+
| 5 | GPIO23 | SDA | | 5 | GPIO23 | SDA |
+---+-----------+------------+ +---+-----------+------------+
| 6 | GPIO25 | SDO | | 6 | GPIO25 | SDO |
+---+-----------+------------+ +---+-----------+------------+
| 7 | GPIO5 | Backlight | | 7 | GPIO5 | Backlight |
+---+-----------+------------+ +---+-----------+------------+
.. _get-started-esp-wrover-kit-start-development: .. _get-started-esp-wrover-kit-start-development:
Start Application Development Start Application Development
----------------------------- -----------------------------
Before powering up the ESP-WROVER-KIT, please make sure that the board has been received in good condition with no obvious signs of damage. Before powering up the ESP-WROVER-KIT, please make sure that the board has been received in good condition with no obvious signs of damage.
Initial Setup Initial Setup
^^^^^^^^^^^^^ ^^^^^^^^^^^^^
Select the source of power supply for the board by setting jumper JP7. The options are either USB port or an external power supply. For this application selection of USB port is sufficient. Enable UART communication by installing jumpers on JP11. Both selections are shown in table below. Select the source of power supply for the board by setting jumper JP7. The options are either USB port or an external power supply. For this application selection of USB port is sufficient. Enable UART communication by installing jumpers on JP11. Both selections are shown in table below.
+----------------------+----------------------+ +----------------------+----------------------+
| Power up | Enable UART | | Power up | Enable UART |
| from USB port | communication | | from USB port | communication |
+----------------------+----------------------+ +----------------------+----------------------+
| |jp7-usb_5v| | |jp11-rx-tx| | | |jp7-usb_5v| | |jp11-rx-tx| |
+----------------------+----------------------+ +----------------------+----------------------+
Do not install any other jumpers. Do not install any other jumpers.
Now to Development Now to Development
^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^
To start development of applications for ESP-WROVER-KIT, proceed to section :doc:`index`, that will walk you through the following steps: To start development of applications for ESP-WROVER-KIT, proceed to section :doc:`index`, that will walk you through the following steps:
* :ref:`get-started-setup-toolchain` in your PC to develop applications for ESP32 in C language * :ref:`get-started-setup-toolchain` in your PC to develop applications for ESP32 in C language
* :ref:`get-started-connect` the module to the PC and verify if it is accessible * :ref:`get-started-connect` the module to the PC and verify if it is accessible
* :ref:`get-started-build-flash` an example application to the ESP32 * :ref:`get-started-build-flash` an example application to the ESP32
* :ref:`get-started-build-monitor` instantly what the application is doing * :ref:`get-started-build-monitor` instantly what the application is doing
Related Documents Related Documents
----------------- -----------------
* `ESP-WROVER-KIT V3 schematic`_ (PDF) * `ESP-WROVER-KIT V3 schematic`_ (PDF)
* `ESP32 Datasheet <https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf>`_ (PDF) * `ESP32 Datasheet <https://www.espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf>`_ (PDF)
* `ESP32-WROVER Datasheet <https://espressif.com/sites/default/files/documentation/esp32-wrover_datasheet_en.pdf>`_ (PDF) * `ESP32-WROVER Datasheet <https://espressif.com/sites/default/files/documentation/esp32-wrover_datasheet_en.pdf>`_ (PDF)
* `ESP32-WROOM-32 Datasheet <https://espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf>`_ (PDF) * `ESP32-WROOM-32 Datasheet <https://espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf>`_ (PDF)
* :doc:`../api-guides/jtag-debugging/index` * :doc:`../api-guides/jtag-debugging/index`
* :doc:`../hw-reference/index` * :doc:`../hw-reference/index`
.. |jp7-ext_5v| image:: ../../_static/esp-wrover-kit-v3-jp7-ext_5v.png .. |jp7-ext_5v| image:: ../../_static/esp-wrover-kit-v3-jp7-ext_5v.png
.. |jp7-usb_5v| image:: ../../_static/esp-wrover-kit-v3-jp7-usb_5v.png .. |jp7-usb_5v| image:: ../../_static/esp-wrover-kit-v3-jp7-usb_5v.png
.. |jp8| image:: ../../_static/esp-wrover-kit-v3-jp8.png .. |jp8| image:: ../../_static/esp-wrover-kit-v3-jp8.png
.. |jp11-rx-tx| image:: ../../_static/esp-wrover-kit-v3-jp11-tx-rx.png .. |jp11-rx-tx| image:: ../../_static/esp-wrover-kit-v3-jp11-tx-rx.png
.. |jp14| image:: ../../_static/esp-wrover-kit-v3-jp14.png .. |jp14| image:: ../../_static/esp-wrover-kit-v3-jp14.png
.. _ESP-WROVER-KIT V3 schematic: https://dl.espressif.com/dl/schematics/ESP-WROVER-KIT_SCH-3.pdf .. _ESP-WROVER-KIT V3 schematic: https://dl.espressif.com/dl/schematics/ESP-WROVER-KIT_SCH-3.pdf
.. toctree:: .. toctree::
:hidden: :hidden:
get-started-wrover-kit-v2.rst get-started-wrover-kit-v2.rst

View File

@@ -1,4 +1,4 @@
************************************* *************************************
Standard Setup of Toolchain for Linux Standard Setup of Toolchain for Linux
************************************* *************************************
:link_to_translation:`zh_CN:[中文]` :link_to_translation:`zh_CN:[中文]`

View File

@@ -1,19 +1,19 @@
Switch Between Languages/切换语言 Switch Between Languages/切换语言
================================= =================================
The documentation now has two language versions, however, please refer to the English version if there is any discrepancy. The documentation now has two language versions, however, please refer to the English version if there is any discrepancy.
本文档现在有两种语言的版本,如有出入请以英文版本为准。 本文档现在有两种语言的版本,如有出入请以英文版本为准。
- English/英文 - English/英文
- Chinese/中文 - Chinese/中文
You can easily changed from one language to another by the panel on the sidebar like below. Just click on the **Read You can easily changed from one language to another by the panel on the sidebar like below. Just click on the **Read
the Docs** title button on the left-bottom conner if it is folded. the Docs** title button on the left-bottom conner if it is folded.
如下图所示,你可使用边栏的面板进行语言的切换。如果该面板被折叠,点击左下角 **Read the Docs** 标题按钮来显示它。 如下图所示,你可使用边栏的面板进行语言的切换。如果该面板被折叠,点击左下角 **Read the Docs** 标题按钮来显示它。
.. image:: /../_static/choose_version.png .. image:: /../_static/choose_version.png

View File

@@ -1,104 +1,104 @@
128 vTaskAllocateMPURegions xTask=%t pxRegions=%u 128 vTaskAllocateMPURegions xTask=%t pxRegions=%u
33 vTaskDelete xTaskToDelete=%t 33 vTaskDelete xTaskToDelete=%t
34 vTaskDelay xTicksToDelay=%u 34 vTaskDelay xTicksToDelay=%u
35 vTaskDelayUntil 35 vTaskDelayUntil
129 uxTaskPriorityGet xTask=%t 129 uxTaskPriorityGet xTask=%t
56 uxTaskPriorityGetFromISR xTask=%t 56 uxTaskPriorityGetFromISR xTask=%t
130 eTaskGetState xTask=%t 130 eTaskGetState xTask=%t
55 vTaskPrioritySet xTask=%t uxNewPriority=%u 55 vTaskPrioritySet xTask=%t uxNewPriority=%u
36 vTaskSuspend xTaskToSuspend=%t 36 vTaskSuspend xTaskToSuspend=%t
40 vTaskResume xTaskToResume=%t 40 vTaskResume xTaskToResume=%t
43 xTaskResumeFromISR xTaskToResume=%t 43 xTaskResumeFromISR xTaskToResume=%t
131 vTaskStartScheduler 131 vTaskStartScheduler
132 vTaskEndScheduler 132 vTaskEndScheduler
133 vTaskSuspendAll 133 vTaskSuspendAll
134 xTaskResumeAll 134 xTaskResumeAll
135 xTaskGetTickCount 135 xTaskGetTickCount
57 xTaskGetTickCountFromISR 57 xTaskGetTickCountFromISR
136 uxTaskGetNumberOfTasks 136 uxTaskGetNumberOfTasks
137 pcTaskGetTaskName xTaskToQuery=%t 137 pcTaskGetTaskName xTaskToQuery=%t
138 uxTaskGetStackHighWaterMark xTask=%t 138 uxTaskGetStackHighWaterMark xTask=%t
139 vTaskSetApplicationTaskTag xTask=%t pxHookFunction=%u 139 vTaskSetApplicationTaskTag xTask=%t pxHookFunction=%u
140 xTaskGetApplicationTaskTag xTask=%t 140 xTaskGetApplicationTaskTag xTask=%t
141 vTaskSetThreadLocalStoragePointer xTaskToSet=%T xIndex=%u pvValue=%u 141 vTaskSetThreadLocalStoragePointer xTaskToSet=%T xIndex=%u pvValue=%u
142 pvTaskGetThreadLocalStoragePointer xTaskToQuery=%T xIndex=%u 142 pvTaskGetThreadLocalStoragePointer xTaskToQuery=%T xIndex=%u
143 xTaskCallApplicationTaskHook xTask=%T pvParameter=%u 143 xTaskCallApplicationTaskHook xTask=%T pvParameter=%u
144 xTaskGetIdleTaskHandle 144 xTaskGetIdleTaskHandle
145 uxTaskGetSystemState pxTaskStatusArray=%u uxArraySize=%u pulTotalRunTime=%u 145 uxTaskGetSystemState pxTaskStatusArray=%u uxArraySize=%u pulTotalRunTime=%u
146 vTaskList pcWriteBuffer=%u 146 vTaskList pcWriteBuffer=%u
147 vTaskGetRunTimeStats pcWriteBuffer=%u 147 vTaskGetRunTimeStats pcWriteBuffer=%u
44 xTaskGenericNotify xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u 44 xTaskGenericNotify xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u
45 xTaskGenericNotifyFromISR xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u pxHigherPriorityTaskWoken=%u 45 xTaskGenericNotifyFromISR xTaskToNotify=%t ulValue=%u eAction=%u pulPreviousNotificationValue=%u pxHigherPriorityTaskWoken=%u
46 xTaskNotifyWait ulBitsToClearOnEntry=%u ulBitsToClearOnExit=%u pulNotificationValue=%u xTicksToWait=%u 46 xTaskNotifyWait ulBitsToClearOnEntry=%u ulBitsToClearOnExit=%u pulNotificationValue=%u xTicksToWait=%u
38 vTaskNotifyGiveFromISR xTaskToNotify=%t pxHigherPriorityTaskWoken=%u 38 vTaskNotifyGiveFromISR xTaskToNotify=%t pxHigherPriorityTaskWoken=%u
37 ulTaskNotifyTake xClearCountOnExit=%u xTicksToWait=%u 37 ulTaskNotifyTake xClearCountOnExit=%u xTicksToWait=%u
148 xTaskNotifyStateClear xTask=%t 148 xTaskNotifyStateClear xTask=%t
149 xTaskGetCurrentTaskHandle 149 xTaskGetCurrentTaskHandle
150 vTaskSetTimeOutState pxTimeOut=%u 150 vTaskSetTimeOutState pxTimeOut=%u
151 xTaskCheckForTimeOut pxTimeOut=%u pxTicksToWait=%u 151 xTaskCheckForTimeOut pxTimeOut=%u pxTicksToWait=%u
152 vTaskMissedYield 152 vTaskMissedYield
153 xTaskGetSchedulerState 153 xTaskGetSchedulerState
39 vTaskPriorityInherit pxMutexHolder=%p 39 vTaskPriorityInherit pxMutexHolder=%p
42 xTaskPriorityDisinherit pxMutexHolder=%p 42 xTaskPriorityDisinherit pxMutexHolder=%p
154 xTaskGenericCreate pxTaskCode=%u pcName=%u usStackDepth=%u pvParameters=%u uxPriority=%u pxCreatedTask=%u puxStackBuffer=%u xRegions=%u 154 xTaskGenericCreate pxTaskCode=%u pcName=%u usStackDepth=%u pvParameters=%u uxPriority=%u pxCreatedTask=%u puxStackBuffer=%u xRegions=%u
155 uxTaskGetTaskNumber xTask=%u 155 uxTaskGetTaskNumber xTask=%u
156 vTaskSetTaskNumber xTask=%u uxHandle=%u 156 vTaskSetTaskNumber xTask=%u uxHandle=%u
41 vTaskStepTick xTicksToJump=%u 41 vTaskStepTick xTicksToJump=%u
157 eTaskConfirmSleepModeStatus 157 eTaskConfirmSleepModeStatus
158 xTimerCreate pcTimerName=%u xTimerPeriodInTicks=%u uxAutoReload=%u pvTimerID=%u pxCallbackFunction=%u 158 xTimerCreate pcTimerName=%u xTimerPeriodInTicks=%u uxAutoReload=%u pvTimerID=%u pxCallbackFunction=%u
159 pvTimerGetTimerID xTimer=%u 159 pvTimerGetTimerID xTimer=%u
160 vTimerSetTimerID xTimer=%u pvNewID=%u 160 vTimerSetTimerID xTimer=%u pvNewID=%u
161 xTimerIsTimerActive xTimer=%u 161 xTimerIsTimerActive xTimer=%u
162 xTimerGetTimerDaemonTaskHandle 162 xTimerGetTimerDaemonTaskHandle
163 xTimerPendFunctionCallFromISR xFunctionToPend=%u pvParameter1=%u ulParameter2=%u pxHigherPriorityTaskWoken=%u 163 xTimerPendFunctionCallFromISR xFunctionToPend=%u pvParameter1=%u ulParameter2=%u pxHigherPriorityTaskWoken=%u
164 xTimerPendFunctionCall xFunctionToPend=%u pvParameter1=%u ulParameter2=%u xTicksToWait=%u 164 xTimerPendFunctionCall xFunctionToPend=%u pvParameter1=%u ulParameter2=%u xTicksToWait=%u
165 pcTimerGetTimerName xTimer=%u 165 pcTimerGetTimerName xTimer=%u
166 xTimerCreateTimerTask 166 xTimerCreateTimerTask
167 xTimerGenericCommand xTimer=%u xCommandID=%u xOptionalValue=%u pxHigherPriorityTaskWoken=%u xTicksToWait=%u 167 xTimerGenericCommand xTimer=%u xCommandID=%u xOptionalValue=%u pxHigherPriorityTaskWoken=%u xTicksToWait=%u
53 xQueueGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u 53 xQueueGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u
50 xQueuePeekFromISR xQueue=%I pvBuffer=%p 50 xQueuePeekFromISR xQueue=%I pvBuffer=%p
49 xQueueGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeek=%u 49 xQueueGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeek=%u
168 uxQueueMessagesWaiting xQueue=%I 168 uxQueueMessagesWaiting xQueue=%I
169 uxQueueSpacesAvailable xQueue=%I 169 uxQueueSpacesAvailable xQueue=%I
48 vQueueDelete xQueue=%I 48 vQueueDelete xQueue=%I
54 xQueueGenericSendFromISR xQueue=%I pvItemToQueue=%p pxHigherPriorityTaskWoken=%u xCopyPosition=%u 54 xQueueGenericSendFromISR xQueue=%I pvItemToQueue=%p pxHigherPriorityTaskWoken=%u xCopyPosition=%u
61 xQueueGiveFromISR xQueue=%I pxHigherPriorityTaskWoken=%u 61 xQueueGiveFromISR xQueue=%I pxHigherPriorityTaskWoken=%u
51 xQueueReceiveFromISR xQueue=%I pvBuffer=%p pxHigherPriorityTaskWoken=%u 51 xQueueReceiveFromISR xQueue=%I pvBuffer=%p pxHigherPriorityTaskWoken=%u
62 xQueueIsQueueEmptyFromISR xQueue=%I 62 xQueueIsQueueEmptyFromISR xQueue=%I
63 xQueueIsQueueFullFromISR xQueue=%I 63 xQueueIsQueueFullFromISR xQueue=%I
170 uxQueueMessagesWaitingFromISR xQueue=%I 170 uxQueueMessagesWaitingFromISR xQueue=%I
171 xQueueAltGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u 171 xQueueAltGenericSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u xCopyPosition=%u
172 xQueueAltGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeeking=%u 172 xQueueAltGenericReceive xQueue=%I pvBuffer=%p xTicksToWait=%u xJustPeeking=%u
173 xQueueCRSendFromISR xQueue=%I pvItemToQueue=%p xCoRoutinePreviouslyWoken=%u 173 xQueueCRSendFromISR xQueue=%I pvItemToQueue=%p xCoRoutinePreviouslyWoken=%u
174 xQueueCRReceiveFromISR xQueue=%I pvBuffer=%p pxTaskWoken=%u 174 xQueueCRReceiveFromISR xQueue=%I pvBuffer=%p pxTaskWoken=%u
175 xQueueCRSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u 175 xQueueCRSend xQueue=%I pvItemToQueue=%p xTicksToWait=%u
176 xQueueCRReceive xQueue=%I pvBuffer=%p xTicksToWait=%u 176 xQueueCRReceive xQueue=%I pvBuffer=%p xTicksToWait=%u
177 xQueueCreateMutex ucQueueType=%u 177 xQueueCreateMutex ucQueueType=%u
178 xQueueCreateCountingSemaphore uxMaxCount=%u uxInitialCount=%u 178 xQueueCreateCountingSemaphore uxMaxCount=%u uxInitialCount=%u
179 xQueueGetMutexHolder xSemaphore=%u 179 xQueueGetMutexHolder xSemaphore=%u
180 xQueueTakeMutexRecursive xMutex=%u xTicksToWait=%u 180 xQueueTakeMutexRecursive xMutex=%u xTicksToWait=%u
181 xQueueGiveMutexRecursive pxMutex=%u 181 xQueueGiveMutexRecursive pxMutex=%u
52 vQueueAddToRegistry xQueue=%I pcName=%u 52 vQueueAddToRegistry xQueue=%I pcName=%u
182 vQueueUnregisterQueue xQueue=%I 182 vQueueUnregisterQueue xQueue=%I
47 xQueueGenericCreate uxQueueLength=%u uxItemSize=%u ucQueueType=%u 47 xQueueGenericCreate uxQueueLength=%u uxItemSize=%u ucQueueType=%u
183 xQueueCreateSet uxEventQueueLength=%u 183 xQueueCreateSet uxEventQueueLength=%u
184 xQueueAddToSet xQueueOrSemaphore=%u xQueueSet=%u 184 xQueueAddToSet xQueueOrSemaphore=%u xQueueSet=%u
185 xQueueRemoveFromSet xQueueOrSemaphore=%u xQueueSet=%u 185 xQueueRemoveFromSet xQueueOrSemaphore=%u xQueueSet=%u
186 xQueueSelectFromSet xQueueSet=%u xTicksToWait=%u 186 xQueueSelectFromSet xQueueSet=%u xTicksToWait=%u
187 xQueueSelectFromSetFromISR xQueueSet=%u 187 xQueueSelectFromSetFromISR xQueueSet=%u
188 xQueueGenericReset xQueue=%I xNewQueue=%u 188 xQueueGenericReset xQueue=%I xNewQueue=%u
189 vListInitialise pxList=%u 189 vListInitialise pxList=%u
190 vListInitialiseItem pxItem=%u 190 vListInitialiseItem pxItem=%u
191 vListInsert pxList=%u pxNewListItem=%u 191 vListInsert pxList=%u pxNewListItem=%u
192 vListInsertEnd pxList=%u pxNewListItem=%u 192 vListInsertEnd pxList=%u pxNewListItem=%u
193 uxListRemove pxItemToRemove=%u 193 uxListRemove pxItemToRemove=%u
194 xEventGroupCreate 194 xEventGroupCreate
195 xEventGroupWaitBits xEventGroup=%u uxBitsToWaitFor=%u xClearOnExit=%u xWaitForAllBits=%u xTicksToWait=%u 195 xEventGroupWaitBits xEventGroup=%u uxBitsToWaitFor=%u xClearOnExit=%u xWaitForAllBits=%u xTicksToWait=%u
196 xEventGroupClearBits xEventGroup=%u uxBitsToClear=%u 196 xEventGroupClearBits xEventGroup=%u uxBitsToClear=%u
58 xEventGroupClearBitsFromISR xEventGroup=%u uxBitsToSet=%u 58 xEventGroupClearBitsFromISR xEventGroup=%u uxBitsToSet=%u
197 xEventGroupSetBits xEventGroup=%u uxBitsToSet=%u 197 xEventGroupSetBits xEventGroup=%u uxBitsToSet=%u
59 xEventGroupSetBitsFromISR xEventGroup=%u uxBitsToSet=%u pxHigherPriorityTaskWoken=%u 59 xEventGroupSetBitsFromISR xEventGroup=%u uxBitsToSet=%u pxHigherPriorityTaskWoken=%u
198 xEventGroupSync xEventGroup=%u uxBitsToSet=%u uxBitsToWaitFor=%u xTicksToWait=%u 198 xEventGroupSync xEventGroup=%u uxBitsToSet=%u uxBitsToWaitFor=%u xTicksToWait=%u
60 xEventGroupGetBitsFromISR xEventGroup=%u 60 xEventGroupGetBitsFromISR xEventGroup=%u
199 vEventGroupDelete xEventGroup=%u 199 vEventGroupDelete xEventGroup=%u
200 uxEventGroupGetNumber xEventGroup=%u 200 uxEventGroupGetNumber xEventGroup=%u

View File

@@ -1 +1 @@
.. include:: ../en/languages.rst .. include:: ../en/languages.rst

View File

@@ -1,5 +1,5 @@
# Bluetooth Examples # Bluetooth Examples
Note: To use examples in this directory, you need to have Bluetooth enabled in configuration. Run `make menuconfig`, go to `Component config` and verify if you see `[*] Bluetooth`. If not - enable it and save. Note: To use examples in this directory, you need to have Bluetooth enabled in configuration. Run `make menuconfig`, go to `Component config` and verify if you see `[*] Bluetooth`. If not - enable it and save.
See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples. See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples.

View File

@@ -1,3 +1,3 @@
# Ethernet Examples # Ethernet Examples
See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples. See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples.

View File

@@ -1,5 +1,5 @@
# Get Started Examples # Get Started Examples
Simple code to get started with ESP32 and ESP-IDF. Simple code to get started with ESP32 and ESP-IDF.
See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples. See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples.

View File

@@ -1,5 +1,5 @@
# Peripherals Examples # Peripherals Examples
This section provides examples how to configure and use ESP32s internal peripherals like GPIO, UART, I2C, SPI, timers, counters, ADC / DAC, PWM, etc. This section provides examples how to configure and use ESP32s internal peripherals like GPIO, UART, I2C, SPI, timers, counters, ADC / DAC, PWM, etc.
See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples. See the [README.md](../README.md) file in the upper level [examples](../) directory for more information about examples.

View File

@@ -1,161 +1,161 @@
/* LEDC (LED Controller) fade example /* LEDC (LED Controller) fade example
This example code is in the Public Domain (or CC0 licensed, at your option.) This example code is in the Public Domain (or CC0 licensed, at your option.)
Unless required by applicable law or agreed to in writing, this Unless required by applicable law or agreed to in writing, this
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. CONDITIONS OF ANY KIND, either express or implied.
*/ */
#include <stdio.h> #include <stdio.h>
#include "freertos/FreeRTOS.h" #include "freertos/FreeRTOS.h"
#include "freertos/task.h" #include "freertos/task.h"
#include "driver/ledc.h" #include "driver/ledc.h"
#include "esp_err.h" #include "esp_err.h"
/* /*
* About this example * About this example
* *
* 1. Start with initializing LEDC module: * 1. Start with initializing LEDC module:
* a. Set the timer of LEDC first, this determines the frequency * a. Set the timer of LEDC first, this determines the frequency
* and resolution of PWM. * and resolution of PWM.
* b. Then set the LEDC channel you want to use, * b. Then set the LEDC channel you want to use,
* and bind with one of the timers. * and bind with one of the timers.
* *
* 2. You need first to install a default fade function, * 2. You need first to install a default fade function,
* then you can use fade APIs. * then you can use fade APIs.
* *
* 3. You can also set a target duty directly without fading. * 3. You can also set a target duty directly without fading.
* *
* 4. This example uses GPIO18/19/4/5 as LEDC output, * 4. This example uses GPIO18/19/4/5 as LEDC output,
* and it will change the duty repeatedly. * and it will change the duty repeatedly.
* *
* 5. GPIO18/19 are from high speed channel group. * 5. GPIO18/19 are from high speed channel group.
* GPIO4/5 are from low speed channel group. * GPIO4/5 are from low speed channel group.
* *
*/ */
#define LEDC_HS_TIMER LEDC_TIMER_0 #define LEDC_HS_TIMER LEDC_TIMER_0
#define LEDC_HS_MODE LEDC_HIGH_SPEED_MODE #define LEDC_HS_MODE LEDC_HIGH_SPEED_MODE
#define LEDC_HS_CH0_GPIO (18) #define LEDC_HS_CH0_GPIO (18)
#define LEDC_HS_CH0_CHANNEL LEDC_CHANNEL_0 #define LEDC_HS_CH0_CHANNEL LEDC_CHANNEL_0
#define LEDC_HS_CH1_GPIO (19) #define LEDC_HS_CH1_GPIO (19)
#define LEDC_HS_CH1_CHANNEL LEDC_CHANNEL_1 #define LEDC_HS_CH1_CHANNEL LEDC_CHANNEL_1
#define LEDC_LS_TIMER LEDC_TIMER_1 #define LEDC_LS_TIMER LEDC_TIMER_1
#define LEDC_LS_MODE LEDC_LOW_SPEED_MODE #define LEDC_LS_MODE LEDC_LOW_SPEED_MODE
#define LEDC_LS_CH2_GPIO (4) #define LEDC_LS_CH2_GPIO (4)
#define LEDC_LS_CH2_CHANNEL LEDC_CHANNEL_2 #define LEDC_LS_CH2_CHANNEL LEDC_CHANNEL_2
#define LEDC_LS_CH3_GPIO (5) #define LEDC_LS_CH3_GPIO (5)
#define LEDC_LS_CH3_CHANNEL LEDC_CHANNEL_3 #define LEDC_LS_CH3_CHANNEL LEDC_CHANNEL_3
#define LEDC_TEST_CH_NUM (4) #define LEDC_TEST_CH_NUM (4)
#define LEDC_TEST_DUTY (4000) #define LEDC_TEST_DUTY (4000)
#define LEDC_TEST_FADE_TIME (3000) #define LEDC_TEST_FADE_TIME (3000)
void app_main() void app_main()
{ {
int ch; int ch;
/* /*
* Prepare and set configuration of timers * Prepare and set configuration of timers
* that will be used by LED Controller * that will be used by LED Controller
*/ */
ledc_timer_config_t ledc_timer = { ledc_timer_config_t ledc_timer = {
.duty_resolution = LEDC_TIMER_13_BIT, // resolution of PWM duty .duty_resolution = LEDC_TIMER_13_BIT, // resolution of PWM duty
.freq_hz = 5000, // frequency of PWM signal .freq_hz = 5000, // frequency of PWM signal
.speed_mode = LEDC_HS_MODE, // timer mode .speed_mode = LEDC_HS_MODE, // timer mode
.timer_num = LEDC_HS_TIMER // timer index .timer_num = LEDC_HS_TIMER // timer index
}; };
// Set configuration of timer0 for high speed channels // Set configuration of timer0 for high speed channels
ledc_timer_config(&ledc_timer); ledc_timer_config(&ledc_timer);
// Prepare and set configuration of timer1 for low speed channels // Prepare and set configuration of timer1 for low speed channels
ledc_timer.speed_mode = LEDC_LS_MODE; ledc_timer.speed_mode = LEDC_LS_MODE;
ledc_timer.timer_num = LEDC_LS_TIMER; ledc_timer.timer_num = LEDC_LS_TIMER;
ledc_timer_config(&ledc_timer); ledc_timer_config(&ledc_timer);
/* /*
* Prepare individual configuration * Prepare individual configuration
* for each channel of LED Controller * for each channel of LED Controller
* by selecting: * by selecting:
* - controller's channel number * - controller's channel number
* - output duty cycle, set initially to 0 * - output duty cycle, set initially to 0
* - GPIO number where LED is connected to * - GPIO number where LED is connected to
* - speed mode, either high or low * - speed mode, either high or low
* - timer servicing selected channel * - timer servicing selected channel
* Note: if different channels use one timer, * Note: if different channels use one timer,
* then frequency and bit_num of these channels * then frequency and bit_num of these channels
* will be the same * will be the same
*/ */
ledc_channel_config_t ledc_channel[LEDC_TEST_CH_NUM] = { ledc_channel_config_t ledc_channel[LEDC_TEST_CH_NUM] = {
{ {
.channel = LEDC_HS_CH0_CHANNEL, .channel = LEDC_HS_CH0_CHANNEL,
.duty = 0, .duty = 0,
.gpio_num = LEDC_HS_CH0_GPIO, .gpio_num = LEDC_HS_CH0_GPIO,
.speed_mode = LEDC_HS_MODE, .speed_mode = LEDC_HS_MODE,
.timer_sel = LEDC_HS_TIMER .timer_sel = LEDC_HS_TIMER
}, },
{ {
.channel = LEDC_HS_CH1_CHANNEL, .channel = LEDC_HS_CH1_CHANNEL,
.duty = 0, .duty = 0,
.gpio_num = LEDC_HS_CH1_GPIO, .gpio_num = LEDC_HS_CH1_GPIO,
.speed_mode = LEDC_HS_MODE, .speed_mode = LEDC_HS_MODE,
.timer_sel = LEDC_HS_TIMER .timer_sel = LEDC_HS_TIMER
}, },
{ {
.channel = LEDC_LS_CH2_CHANNEL, .channel = LEDC_LS_CH2_CHANNEL,
.duty = 0, .duty = 0,
.gpio_num = LEDC_LS_CH2_GPIO, .gpio_num = LEDC_LS_CH2_GPIO,
.speed_mode = LEDC_LS_MODE, .speed_mode = LEDC_LS_MODE,
.timer_sel = LEDC_LS_TIMER .timer_sel = LEDC_LS_TIMER
}, },
{ {
.channel = LEDC_LS_CH3_CHANNEL, .channel = LEDC_LS_CH3_CHANNEL,
.duty = 0, .duty = 0,
.gpio_num = LEDC_LS_CH3_GPIO, .gpio_num = LEDC_LS_CH3_GPIO,
.speed_mode = LEDC_LS_MODE, .speed_mode = LEDC_LS_MODE,
.timer_sel = LEDC_LS_TIMER .timer_sel = LEDC_LS_TIMER
}, },
}; };
// Set LED Controller with previously prepared configuration // Set LED Controller with previously prepared configuration
for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) { for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
ledc_channel_config(&ledc_channel[ch]); ledc_channel_config(&ledc_channel[ch]);
} }
// Initialize fade service. // Initialize fade service.
ledc_fade_func_install(0); ledc_fade_func_install(0);
while (1) { while (1) {
printf("1. LEDC fade up to duty = %d\n", LEDC_TEST_DUTY); printf("1. LEDC fade up to duty = %d\n", LEDC_TEST_DUTY);
for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) { for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
ledc_set_fade_with_time(ledc_channel[ch].speed_mode, ledc_set_fade_with_time(ledc_channel[ch].speed_mode,
ledc_channel[ch].channel, LEDC_TEST_DUTY, LEDC_TEST_FADE_TIME); ledc_channel[ch].channel, LEDC_TEST_DUTY, LEDC_TEST_FADE_TIME);
ledc_fade_start(ledc_channel[ch].speed_mode, ledc_fade_start(ledc_channel[ch].speed_mode,
ledc_channel[ch].channel, LEDC_FADE_NO_WAIT); ledc_channel[ch].channel, LEDC_FADE_NO_WAIT);
} }
vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS); vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS);
printf("2. LEDC fade down to duty = 0\n"); printf("2. LEDC fade down to duty = 0\n");
for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) { for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
ledc_set_fade_with_time(ledc_channel[ch].speed_mode, ledc_set_fade_with_time(ledc_channel[ch].speed_mode,
ledc_channel[ch].channel, 0, LEDC_TEST_FADE_TIME); ledc_channel[ch].channel, 0, LEDC_TEST_FADE_TIME);
ledc_fade_start(ledc_channel[ch].speed_mode, ledc_fade_start(ledc_channel[ch].speed_mode,
ledc_channel[ch].channel, LEDC_FADE_NO_WAIT); ledc_channel[ch].channel, LEDC_FADE_NO_WAIT);
} }
vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS); vTaskDelay(LEDC_TEST_FADE_TIME / portTICK_PERIOD_MS);
printf("3. LEDC set duty = %d without fade\n", LEDC_TEST_DUTY); printf("3. LEDC set duty = %d without fade\n", LEDC_TEST_DUTY);
for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) { for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
ledc_set_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, LEDC_TEST_DUTY); ledc_set_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, LEDC_TEST_DUTY);
ledc_update_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel); ledc_update_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel);
} }
vTaskDelay(1000 / portTICK_PERIOD_MS); vTaskDelay(1000 / portTICK_PERIOD_MS);
printf("4. LEDC set duty = 0 without fade\n"); printf("4. LEDC set duty = 0 without fade\n");
for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) { for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
ledc_set_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, 0); ledc_set_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, 0);
ledc_update_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel); ledc_update_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel);
} }
vTaskDelay(1000 / portTICK_PERIOD_MS); vTaskDelay(1000 / portTICK_PERIOD_MS);
} }
} }

View File

@@ -1,43 +1,43 @@
menu "Example Configuration" menu "Example Configuration"
config SDIO_EXAMPLE_4BIT config SDIO_EXAMPLE_4BIT
bool "Host tries using 4-bit mode to communicate with slave" bool "Host tries using 4-bit mode to communicate with slave"
default n default n
help help
If this is set, the host tries using 4-bit mode to communicate with If this is set, the host tries using 4-bit mode to communicate with
slave. If failed, the communication falls back to 1-bit mode. slave. If failed, the communication falls back to 1-bit mode.
If this is not set, the host uses 1-bit mode. However, CMD1 is still If this is not set, the host uses 1-bit mode. However, CMD1 is still
mandatory for interrupts. mandatory for interrupts.
Note that 4-bit mode is not compatible (by default) if the slave is Note that 4-bit mode is not compatible (by default) if the slave is
using 3.3V flash which requires a pull-down on the MTDI pin. using 3.3V flash which requires a pull-down on the MTDI pin.
config SDIO_EXAMPLE_HIGHSPEED config SDIO_EXAMPLE_HIGHSPEED
bool "Host tries using HS mode to communicate with slave" bool "Host tries using HS mode to communicate with slave"
default y default y
help help
If this is set, the host tries using high-speed mode to communicate If this is set, the host tries using high-speed mode to communicate
with slave. If the slave doesn't support high-speed mode, the with slave. If the slave doesn't support high-speed mode, the
communication falls back to default-speed mode. If this is not set, communication falls back to default-speed mode. If this is not set,
the host uses DS mode. the host uses DS mode.
If the example does not work, please try disabling the HS mode. If the example does not work, please try disabling the HS mode.
choice EXAMPLE_SLAVE choice EXAMPLE_SLAVE
prompt "Id of Slave used in Espressif master-slave board." prompt "Id of Slave used in Espressif master-slave board."
default EXAMPLE_SLAVE_NONE default EXAMPLE_SLAVE_NONE
help help
If Espressif master-slave board is used, select which slave is used. If Espressif master-slave board is used, select which slave is used.
config EXAMPLE_SLAVE_NONE config EXAMPLE_SLAVE_NONE
bool "Not using Espressif master-slave board." bool "Not using Espressif master-slave board."
config EXAMPLE_SLAVE_B1 config EXAMPLE_SLAVE_B1
bool "Using slave B1" bool "Using slave B1"
config EXAMPLE_SLAVE_B2 config EXAMPLE_SLAVE_B2
bool "Using slave B2" bool "Using slave B2"
config EXAMPLE_SLAVE_B3 config EXAMPLE_SLAVE_B3
bool "Using slave B3" bool "Using slave B3"
endchoice endchoice
endmenu endmenu

View File

@@ -1,16 +1,16 @@
menu "Example Configuration" menu "Example Configuration"
config SDIO_DAT2_DISABLED config SDIO_DAT2_DISABLED
bool "Disable the DAT2 in SDIO slave" bool "Disable the DAT2 in SDIO slave"
default y default y
help help
SDIO slave DAT pin is unfortunately the same pin as MTDI, which SDIO slave DAT pin is unfortunately the same pin as MTDI, which
controls the flash power voltage. For 3.3v flash devkits / modules / controls the flash power voltage. For 3.3v flash devkits / modules /
kits, it conflicts with the DAT2 pullups required by the kits, it conflicts with the DAT2 pullups required by the
specification. specification.
This disables the peripheral input from the DAT2 so that we can work This disables the peripheral input from the DAT2 so that we can work
in 1-bit mode when DAT2 is floating (pulled down). 4-bit mode is in 1-bit mode when DAT2 is floating (pulled down). 4-bit mode is
therefore unavailable. therefore unavailable.
endmenu endmenu

View File

@@ -1,8 +1,8 @@
# #
# This is a project Makefile. It is assumed the directory this Makefile resides in is a # This is a project Makefile. It is assumed the directory this Makefile resides in is a
# project subdirectory. # project subdirectory.
# #
PROJECT_NAME := touch_pad_interrupt PROJECT_NAME := touch_pad_interrupt
include $(IDF_PATH)/make/project.mk include $(IDF_PATH)/make/project.mk

Some files were not shown because too many files have changed in this diff Show More