1 /*
2  * Copyright 2022, Cypress Semiconductor Corporation (an Infineon company)
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 /** @file
19  *  WICED Resource API's
20  *  The Resource Management functions reads resource from a resource location
21  *  and returns the number of bytes from an offset in an caller filled buffer.
22  *
23  *  Functions to get the resource size and resource data
24  *
25  *  The Resource could be one of the three locations
26  *
27  *  - Wiced Filesystem (File System)
28  *  - Internal Memory  (Embedded Flash memory)
29  *  - External Storage ( External Flash connected via SPI interface)
30  *
31  */
32 
33 #ifndef INCLUDED_RESOURCE_H_
34 #define INCLUDED_RESOURCE_H_
35 
36 #include <stdint.h>
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 
42 
43 /******************************************************
44 *                     Macros
45 ******************************************************/
46 #ifndef MIN
47 #define MIN(x, y) ( (x) < (y) ? (x) : (y) )
48 #endif /* ifndef MIN */
49 
50 /* Suppress unused parameter warning */
51 #ifndef UNUSED_PARAMETER
52 #define UNUSED_PARAMETER(x) ( (void)(x) )
53 #endif
54 
55 #ifndef RESULT_ENUM
56 #define RESULT_ENUM(prefix, name, value)  prefix ## name = (value)
57 #endif /* ifndef RESULT_ENUM */
58 
59 #if defined(CY_SECTION)
60 #define CY_SECTION_WHD          CY_SECTION
61 #else
62 #if !defined(CY_SECTION_WHD)
63 #if defined(__ARMCC_VERSION)
64 #define CY_SECTION_WHD(name)    __attribute__ ( (section(name) ) )
65 #elif defined (__GNUC__)
66 #if defined (__clang__)
67 #define CY_SECTION_WHD(name)    __attribute__ ( (section("__DATA, "name) ) )
68 #else
69 #define CY_SECTION_WHD(name)    __attribute__ ( (section(name) ) )
70 #endif
71 #elif defined (__ICCARM__)
72 #define CY_PRAGMA_WHD(x)        _Pragma(#x)
73 #define CY_SECTION_WHD(name)    CY_PRAGMA_WHD(location = name)
74 #else
75 #error "An unsupported toolchain"
76 #endif /* (__ARMCC_VERSION) */
77 #endif /* !defined(CY_SECTION_WHD) */
78 #endif /* defined(CY_SECTION) */
79 
80 /* These Enum result values are for Resource errors
81  * Values: 4000 - 4999
82  */
83 #define RESOURCE_RESULT_LIST(prefix)  \
84     RESULT_ENUM(prefix, SUCCESS,                         0),      /**< Success */                           \
85     RESULT_ENUM(prefix, UNSUPPORTED,                     7),      /**< Unsupported function */              \
86     RESULT_ENUM(prefix, OFFSET_TOO_BIG,               4001),      /**< Offset past end of resource */       \
87     RESULT_ENUM(prefix, FILE_OPEN_FAIL,               4002),      /**< Failed to open resource file */      \
88     RESULT_ENUM(prefix, FILE_SEEK_FAIL,               4003),      /**< Failed to seek to requested offset in resource file */ \
89     RESULT_ENUM(prefix, FILE_READ_FAIL,               4004),      /**< Failed to read resource file */
90 
91 #define resource_get_size(resource) ( (resource)->size )
92 
93 /******************************************************
94 *                    Constants
95 ******************************************************/
96 
97 #define RESOURCE_ENUM_OFFSET  (1300)
98 
99 /******************************************************
100 *                Enumerations
101 ******************************************************/
102 
103 /**
104  * Result type for WICED Resource function
105  */
106 typedef enum
107 {
108     RESOURCE_RESULT_LIST(RESOURCE_)
109 } resource_result_t;
110 
111 /******************************************************
112 *                 Type Definitions
113 ******************************************************/
114 
115 typedef const void *resource_data_t;
116 typedef unsigned long resource_size_t;
117 
118 /******************************************************
119 *                   Structures
120 ******************************************************/
121 
122 /**
123  * Memory handle
124  */
125 typedef struct
126 {
127     const char *data;          /**< resource data */
128 } memory_resource_handle_t;
129 
130 /**
131  * Filesystem handle
132  */
133 typedef struct
134 {
135     unsigned long offset;      /**< Offset to the start of the resource */
136     const char *filename;      /**< name of the resource                */
137 } filesystem_resource_handle_t;
138 
139 
140 typedef enum
141 {
142     RESOURCE_IN_MEMORY,           /**< resource location in memory           */
143     RESOURCE_IN_FILESYSTEM,       /**< resource location in filesystem       */
144     RESOURCE_IN_EXTERNAL_STORAGE  /**< resource location in external storage */
145 } resource_location_t;
146 
147 /**
148  * Resource handle structure
149  */
150 typedef struct
151 {
152     resource_location_t location;       /**< resource location */
153     unsigned long size;                 /**< resource size     */
154     union
155     {
156         filesystem_resource_handle_t fs;                      /** < filesystem resource handle */
157         memory_resource_handle_t mem;                         /** < memory resource handle     */
158         void *external_storage_context;                       /** < external storage context   */
159     } val;
160 } resource_hnd_t;
161 
162 /******************************************************
163 *                 Global Variables
164 ******************************************************/
165 
166 /******************************************************
167 *               Function Declarations
168 ******************************************************/
169 
170 /*****************************************************************************/
171 /** @addtogroup  resourceapi  Wiced Resource Management API's
172  *  @ingroup framework
173  *
174  *  WCIED Resource Management API's has functions to get the
175  *  resource size and reads resource data from a resource
176  *  location and returns the number of bytes in an caller
177  *  filled buffer
178  *
179  *  The Resource could be one of the three locations
180  *
181  *  - Wiced Filesystem ( File System)
182  *  - Internal Memory   (Embedded Flash memory)
183  *  - External Storage  ( External Flash connected via SPI interface )
184  *
185  *  @{
186  */
187 /*****************************************************************************/
188 
189 /** Read resource using the handle specified
190  *
191  * @param[in]  resource : handle of the resource to read
192  * @param[in]  offset   : offset from the beginning of the resource block
193  * @param[in]  maxsize  : size of the buffer
194  * @param[out] size     : size of the data successfully read
195  * @param[in]  buffer   : pointer to a buffer to contain the read data
196  *
197  * @return @ref resource_result_t
198  */
199 extern resource_result_t resource_read(const resource_hnd_t *resource, uint32_t offset, uint32_t maxsize,
200                                        uint32_t *size, void *buffer);
201 
202 /** Retrieve a read only resource buffer using the handle specified
203  *
204  * @param[in]  resource : handle of the resource to read
205  * @param[in]  offset   : offset from the beginning of the resource block
206  * @param[in]  maxsize  : size of the buffer
207  * @param[out] size     : size of the data successfully read
208  * @param[out] buffer   : pointer to a buffer pointer to point to the resource data
209  *
210  * @return @ref resource_result_t
211  */
212 extern resource_result_t resource_get_readonly_buffer(const resource_hnd_t *resource, uint32_t offset, uint32_t maxsize,
213                                                       uint32_t *size_out, const void **buffer);
214 
215 /** Free a read only resource buffer using the handle specified
216  *
217  * @param[in]  resource : handle of the resource to read
218  * @param[in]  buffer   : pointer to a buffer set using resource_get_readonly_buffer
219  *
220  * @return @ref resource_result_t
221  */
222 extern resource_result_t resource_free_readonly_buffer(const resource_hnd_t *handle, const void *buffer);
223 /* @} */
224 #ifdef __cplusplus
225 } /*extern "C" */
226 #endif
227 
228 #endif /* ifndef INCLUDED_RESOURCE_H_ */
229