DVBCore  20.3.0
DVBCore Documentation
app_nvm.c
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright © 2014 The DTVKit Open Software Foundation Ltd (www.dtvkit.org)
3  * Copyright © 2004 Ocean Blue Software Ltd
4  *
5  * This file is part of a DTVKit Software Component
6  * You are permitted to copy, modify or distribute this file subject to the terms
7  * of the DTVKit 1.0 Licence which can be found in licence.txt or at www.dtvkit.org
8  *
9  * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
10  * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES
11  * OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
12  *
13  * If you or your organisation is not a member of DTVKit then you have access
14  * to this source code outside of the terms of the licence agreement
15  * and you are expected to delete this and any associated files immediately.
16  * Further information on DTVKit, membership and terms can be found at www.dtvkit.org
17  *******************************************************************************/
25 //#define NVM_DEBUG
26 
27 //---includes for this file-------------------------------------------------------------------------
28 // compiler library header files
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 
33 // third party header files
34 
35 // Ocean Blue Software header files
36 #include "techtype.h" //generic data definitions
37 #include "dbgfuncs.h" //debug functions
38 
39 #include "stbhwav.h"
40 #include "stbdpc.h"
41 #include "stbgc.h"
42 #include "stbsiflt.h"
43 #include "stbsitab.h"
44 #include "stbheap.h"
45 #include "vtctype.h"
46 
47 #include "app.h" // Application header file
48 #include "ap_cfg.h"
49 #include "ap_dbacc.h"
50 #include "ap_ipadd.h"
51 
52 #include "app_nvm.h" //nvm data functions header file
53 
54 #include "dba.h"
55 
56 //---constant definitions for this file-------------------------------------------------------------
57 #define DVB_DATA_BLOCK_ID 0x44564220 /* 'DVB ' */
58 
59 #define WIRELESS_ESSID_MAX 33
60 #define WIRELESS_PASSWORD_MAX 64
61 
62 #ifdef NVM_DEBUG
63 #define DBG(X) STB_SPDebugWrite X
64 #else
65 #define DBG(X)
66 #endif
67 
68 
69 //---local typedefs, structs, enumerations for this file--------------------------------------------
70 typedef struct s_nvm_field
71 {
72  void *field_ptr;
73  void *def_ptr;
74  U32BIT field_size;
75 }
77 
78 typedef struct s_nvm_data
79 {
80  BOOLEAN nvm_first_boot; // FIRST_BOOT_NVM
81  BOOLEAN nvm_standby_powersave; // STANDBY_POWERSAVE_NVM
82  U8BIT nvm_volume; // VOLUME_NVM
83  E_STB_AV_ASPECT_MODE nvm_aspect_mode; // ASPECT_MODE_NVM
84  E_STB_AV_SOURCES nvm_scart_input_type; // SCART_INPUT_TYPE_NVM
85  U8BIT nvm_primary_audio_lang_entry; // PRIMARY_AUDIO_LANG_NVM
86  U8BIT nvm_secondary_audio_lang_entry; // SECONDARY_AUDIO_LANG_NVM
87  ADB_AUDIO_TYPE nvm_audio_type; // AUDIO_TYPE_NVM
88  U8BIT nvm_standby_state; // STANDBY_STATE_NVM
89  BOOLEAN nvm_searching; // SEARCHING_STATE_NVM
90  U8BIT nvm_parental_lock; // PARENTAL_LOCK_NVM
91  U8BIT nvm_ics_parental_lock; // ICS_PARENTAL_LOCK_NVM
92  U16BIT nvm_system_pin_no; // SYSTEM_PIN_NO_NVM
93  BOOLEAN nvm_aerial_power_on; // AERIAL_POWER_ON_NVM
94  U32BIT nvm_country_code; // COUNTRY_CODE_NVM
95  U8BIT nvm_region_id; // REGION_ID_NVM
96  U8BIT nvm_uhf_channel; // RF_CHANNEL_NUM_NVM
97  E_STB_AV_ASPECT_RATIO nvm_aspect_ratio; // ASPECT_RATIO_NVM
98  E_STB_AV_SOURCES nvm_tv_scart_type; // TV_SCART_TYPE_NVM
99  U8BIT nvm_wakeup_volume; // WAKEUP_VOLUME_NVM
100  E_STB_AV_VIDEO_FORMAT hdmi_resolution; // HDMI_RESOLUTION_NVM
101  E_NET_IF_TYPE nvm_net_if_type; // NET_IF_TYPE_NVM
102  E_STB_IP_MODE nvm_ip_mode; // IP_MODE_NVM
103  U32BIT nvm_ip_address; // IP_ADDRESS_NVM
104  U32BIT nvm_subnet_mask; // SUBNET_MASK_NVM
105  U32BIT nvm_gateway_ip; // GATEWAY_IP_NVM
106  U32BIT nvm_dns_ip; // DNS_SERVER_IP_NVM
107  U8BIT nvm_essid[WIRELESS_ESSID_MAX];
108  U8BIT nvm_essid_password[WIRELESS_PASSWORD_MAX];
109  U8BIT nvm_ad_volume; // AD_VOLUME_NVM
110  E_STB_DIGITAL_AUDIO_TYPE nvm_spdif_output; // SPDIF_OUTPUT_NVM
111  U16BIT nvm_lip_sync_adjustment; // LIP_SYNC_ADJUSTMENT_NVM
112  U8BIT nvm_target_region_depth; // TARGET_REGION_DEPTH_NVM
113  U32BIT nvm_target_region_country; // TARGET_REGION_COUNTRY_NVM
114  U8BIT nvm_target_region_primary; // TARGET_REGION_PRIMARY_NVM
115  U8BIT nvm_target_region_secondary; // TARGET_REGION_SECONDARY_NVM
116  U16BIT nvm_target_region_tertiary; // TARGET_REGION_TERTIARY_NVM
117  U8BIT nvm_ota_type; // OTA_TYPE_NVM
118  U16BIT nvm_ota_last_update_srch; // OTA_LAST_UPDATE_SRCH_NVM
119  U16BIT nvm_last_chan_srch; // LAST_CHAN_SRCH_NVM
120  U32BIT nvm_last_eit_update; // LAST_EIT_UPDATE_NVM
121  E_VIEW_REC_PREF nvm_watch_hd; // WATCH_HD_PROGRAMMES_NVM
122  E_VIEW_REC_PREF nvm_record_hd; // RECORD_HD_PROGRAMMES_NVM
123  U16BIT nvm_timeshift_buffer_size; // TIMESHIFT_BUFFER_SIZE_NVM
124  E_SUBTITLE_TYPE nvm_subtitle_type; // SUBTITLE_TYPE_NVM
125  U16BIT nvm_background_search_start; // BACKGROUND_SEARCH_START_NVM
126  U16BIT nvm_background_search_end; // BACKGROUND_SEARCH_END_NVM
127  BOOLEAN nvm_service_search_enabled; // SERVICE_SEARCH_ENABLED_NVM
128  BOOLEAN nvm_ssu_search_enabled; // SSU_SEARCH_ENABLED_NVM
129  U16BIT nvm_live_service_lcn; // LIVE_SERVICE_LCN_NVM
130  U8BIT nvm_primary_text_lang; // PRIMARY_TEXT_LANG_NVM
131  U8BIT nvm_secondary_text_lang; // SECONDARY_TEXT_LANG_NVM
132  E_STB_DIGITAL_AUDIO_TYPE nvm_hdmi_audio_output; // HDMI_AUDIO_OUTPUT_NVM
133  U16BIT nvm_eit_sched_limit; // EIT_SCHED_LIMIT_NVM
134  BOOLEAN nvm_prefer_hd_audio; // PREFER_HD_AUDIO_NVM
135  U16BIT nvm_pvr_notify_time; // PVR_NOTIFY_TIME_NVM
136  S32BIT nvm_record_start_padding; // RECORD_START_PADDING_NVM
137  S32BIT nvm_record_end_padding; // RECORD_END_PADDING_NVM
138 
139 #ifdef COMMON_INTERFACE
140  U8BIT cicam_id0_0[4];
141  U8BIT cicam_id0_1[4];
142  S32BIT cicam_pin0;
143  U32BIT pin0_used_time;
144  U8BIT cicam_id1_0[4];
145  U8BIT cicam_id1_1[4];
146  S32BIT cicam_pin1;
147  U32BIT pin1_used_time;
148  U8BIT cicam_id2_0[4];
149  U8BIT cicam_id2_1[4];
150  S32BIT cicam_pin2;
151  U32BIT pin2_used_time;
152  U8BIT cicam_id3_0[4];
153  U8BIT cicam_id3_1[4];
154  S32BIT cicam_pin3;
155  U32BIT pin3_used_time;
156 #endif
157 
158  //NOTE_1: ANY ADDITIONAL NVM VARIABLES ARE TO BE ADDED JUST ABOVE THIS COMMENT
159  // AND ABOVE THE "checksum" struct element below.
160  //NOTE_2: AN INITIALISATION VALUE MUST ALSO BE SUPPLIED IN THE CORRESPONDING
161  // LOCATION IN THE static const default_data (defined below)
162  //NOTE_3: AN ENTRY IN THE field_definition struct MUST ALSO BE SUPPLIED IN THE CORRESPONDING
163  // LOCATION IN THE static const S_NVM_FIELD field_definition (defined below)
164  //-------------------------------------------------------------------------
165 
166  /* NVM Data Checksum - U16BIT stored as byte array to ensure that it can be located on a byte boundary
167  and there will be no padding between the last item of data and the checksum */
168  U8BIT checksum[sizeof(U16BIT)]; //0x0000
169 } S_NVM_DATA;
170 
171 //---local (static) variable declarations for this file---------------------------------------------
172 // (internal variables declared static to make them local)
173 static const S_NVM_DATA default_data =
174 {
175  TRUE, // nvm_first_boot;
176  TRUE, // nvm_standby_powersave;
177  100, // nvm_volume;
178  ASPECT_MODE_AUTO, // nvm_aspect_mode;
179  AV_SOURCE_VCR_COMPOSITE, // nvm_scart_input_type;
180  0, // nvm_primary_audio_lang_entry;
181  ACFG_INVALID_LANG, // nvm_secondary_audio_lang_entry - set to invalid
182  ADB_AUDIO_TYPE_UNDEFINED, // nvm_audio_type;
183  0, // nvm_standby_state;
184  FALSE, // nvm_searching;
185  PARENTAL_LOCK_OFF, // nvm_parental_lock;
186  PARENTAL_LOCK_OFF, // nvm_ics_parental_lock;
187  0, // nvm_system_pin_no;
188  FALSE, // nvm_aerial_power_on;
189  0, // nvm_country_code;
190  ACFG_INVALID_REGION, // nvm_region_id;
191  36, // uhf_channel_id;
192  ASPECT_RATIO_16_9, // nvm_aspect_ratio;
193  AV_SOURCE_ENCODER_RGB, // nvm_tv_scart_type;
194  50, // nvm_wakeup_volume;
195  VIDEO_FORMAT_AUTO, // hdmi_resolution;
196  NET_IF_NONE, // NET_IF_TYPE
197  IP_DHCP, // IP_MODE_NVM
198  0, // IP_ADDRESS_NVM
199  0, // SUBNET_MASK_NVM
200  0, // GATEWAY_IP_NVM
201  0, // DNS_SERVER_IP_NVM
202  "", // ESSID_NVM
203  "", // ESSID_PASSWORD_NVM
204  100, // AD_VOLUME_NVM
205  DIGITAL_AUDIO_PCM, // SPDIF output
206  0, // Lip sync adjustment
207  0, // nvm_target_region_depth;
208  0, // nvm_target_region_country;
209  0, // nvm_target_region_primary;
210  0, // nvm_target_region_secondary;
211  0, // nvm_target_region_tertiary;
212  OTA_TYPE_AUTO, // nvm_ota_type
213  0, // nvm_ota_last_update_srch
214  0, // nvm_last_chan_srch
215  0, // nvm_last_eit_update
216  VIEW_REC_NEVER, // nvm_watch_hd
217  VIEW_REC_NEVER, // nvm_record_hd
218  60, // nvm_timeshift_buffer_size
219  SUBTITLE_NORMAL, // nvm_subtitle_type
220  120, // Background search start (2am)
221  240, // Background search end (4am)
222  TRUE, // Background service search enabled
223  TRUE, // Background SSU search enabled
224  0, // Live service LCN
225  0, // nvm_primary_text_lang;
226  ACFG_INVALID_LANG, // nvm_secondary_text_lang;
227  DIGITAL_AUDIO_PCM, // HDMI audio output
228  0, // EIT schedule limit, 0=disabled
229  TRUE, // Prefer HD audio
230  0, // PVR notify time
231  0, // Start padding on a recording
232  0, // End padding on a recording
233 #ifdef COMMON_INTERFACE
234  {0, 0, 0, 0},
235  {0, 0, 0, 0},
236  -1,
237  0,
238  {0, 0, 0, 0},
239  {0, 0, 0, 0},
240  -1,
241  0,
242  {0, 0, 0, 0},
243  {0, 0, 0, 0},
244  -1,
245  0,
246  {0, 0, 0, 0},
247  {0, 0, 0, 0},
248  -1,
249  0,
250 #endif
251  {0x00, 0x00} //U16BIT checksum (stored as a 2 byte array to guarantee there is no padding between last data item & chcksum)
252 };
253 
254 static S_NVM_DATA current_data;
255 
256 static const S_NVM_FIELD field_definition[] =
257 {
258  {(void *)&(current_data.nvm_first_boot), (void *)&(default_data.nvm_first_boot), sizeof(BOOLEAN)},
259  {(void *)&(current_data.nvm_standby_powersave), (void *)&(default_data.nvm_standby_powersave), sizeof(BOOLEAN)},
260  {(void *)&(current_data.nvm_volume), (void *)&(default_data.nvm_volume), sizeof(U8BIT)},
261  {(void *)&(current_data.nvm_aspect_mode), (void *)&(default_data.nvm_aspect_mode), sizeof(E_STB_AV_ASPECT_MODE)},
262  {(void *)&(current_data.nvm_scart_input_type), (void *)&(default_data.nvm_scart_input_type), sizeof(E_STB_AV_SOURCES)},
263  {(void *)&(current_data.nvm_primary_audio_lang_entry), (void *)&(default_data.nvm_primary_audio_lang_entry), sizeof(U8BIT)},
264  {(void *)&(current_data.nvm_secondary_audio_lang_entry), (void *)&(default_data.nvm_secondary_audio_lang_entry), sizeof(U8BIT)},
265  {(void *)&(current_data.nvm_audio_type), (void *)&(default_data.nvm_audio_type), sizeof(ADB_AUDIO_TYPE)},
266  {(void *)&(current_data.nvm_standby_state), (void *)&(default_data.nvm_standby_state), sizeof(U8BIT)},
267  {(void *)&(current_data.nvm_searching), (void *)&(default_data.nvm_searching), sizeof(BOOLEAN)},
268  {(void *)&(current_data.nvm_parental_lock), (void *)&(default_data.nvm_parental_lock), sizeof(U8BIT)},
269  {(void *)&(current_data.nvm_ics_parental_lock), (void *)&(default_data.nvm_ics_parental_lock), sizeof(U8BIT)},
270  {(void *)&(current_data.nvm_system_pin_no), (void *)&(default_data.nvm_system_pin_no), sizeof(U16BIT)},
271  {(void *)&(current_data.nvm_aerial_power_on), (void *)&(default_data.nvm_aerial_power_on), sizeof(BOOLEAN)},
272  {(void *)&(current_data.nvm_country_code), (void *)&(default_data.nvm_country_code), sizeof(U32BIT)},
273  {(void *)&(current_data.nvm_region_id), (void *)&(default_data.nvm_region_id), sizeof(U8BIT)},
274  {(void *)&(current_data.nvm_uhf_channel), (void *)&(default_data.nvm_uhf_channel), sizeof(U8BIT)},
275  {(void *)&(current_data.nvm_aspect_ratio), (void *)&(default_data.nvm_aspect_ratio), sizeof(E_STB_AV_ASPECT_RATIO)},
276  {(void *)&(current_data.nvm_tv_scart_type), (void *)&(default_data.nvm_tv_scart_type), sizeof(E_STB_AV_SOURCES)},
277  {(void *)&(current_data.nvm_wakeup_volume), (void *)&(default_data.nvm_wakeup_volume), sizeof(U8BIT)},
278  {(void *)&(current_data.hdmi_resolution), (void *)&(default_data.hdmi_resolution), sizeof(E_STB_AV_VIDEO_FORMAT)},
279  {(void *)&(current_data.nvm_net_if_type), (void *)&(default_data.nvm_net_if_type), sizeof(E_NET_IF_TYPE)},
280  {(void *)&(current_data.nvm_ip_mode), (void *)&(default_data.nvm_ip_mode), sizeof(E_STB_IP_MODE)},
281  {(void *)&(current_data.nvm_ip_address), (void *)&(default_data.nvm_ip_address), sizeof(U32BIT)},
282  {(void *)&(current_data.nvm_subnet_mask), (void *)&(default_data.nvm_subnet_mask), sizeof(U32BIT)},
283  {(void *)&(current_data.nvm_gateway_ip), (void *)&(default_data.nvm_gateway_ip), sizeof(U32BIT)},
284  {(void *)&(current_data.nvm_dns_ip), (void *)&(default_data.nvm_dns_ip), sizeof(U32BIT)},
285  {(void *)&(current_data.nvm_essid), (void *)&(default_data.nvm_essid), sizeof(current_data.nvm_essid)},
286  {(void *)&(current_data.nvm_essid_password), (void *)&(default_data.nvm_essid_password), sizeof(current_data.nvm_essid_password)},
287  {(void *)&(current_data.nvm_ad_volume), (void *)&(default_data.nvm_ad_volume), sizeof(U8BIT)},
288  {(void *)&(current_data.nvm_spdif_output), (void *)&(default_data.nvm_spdif_output), sizeof(E_STB_DIGITAL_AUDIO_TYPE)},
289  {(void *)&(current_data.nvm_lip_sync_adjustment), (void *)&(default_data.nvm_lip_sync_adjustment), sizeof(U16BIT)},
290  {(void *)&(current_data.nvm_target_region_depth), (void *)&(default_data.nvm_target_region_depth), sizeof(U8BIT)},
291  {(void *)&(current_data.nvm_target_region_country), (void *)&(default_data.nvm_target_region_country), sizeof(U32BIT)},
292  {(void *)&(current_data.nvm_target_region_primary), (void *)&(default_data.nvm_target_region_primary), sizeof(U8BIT)},
293  {(void *)&(current_data.nvm_target_region_secondary), (void *)&(default_data.nvm_target_region_secondary), sizeof(U8BIT)},
294  {(void *)&(current_data.nvm_target_region_tertiary), (void *)&(default_data.nvm_target_region_tertiary), sizeof(U16BIT)},
295  {(void *)&(current_data.nvm_ota_type), (void *)&(default_data.nvm_ota_type), sizeof(U8BIT)},
296  {(void *)&(current_data.nvm_ota_last_update_srch), (void *)&(default_data.nvm_ota_last_update_srch), sizeof(U16BIT)},
297  {(void *)&(current_data.nvm_last_chan_srch), (void *)&(default_data.nvm_last_chan_srch), sizeof(U16BIT)},
298  {(void *)&(current_data.nvm_last_eit_update), (void *)&(default_data.nvm_last_eit_update), sizeof(U32DHMS)},
299  {(void *)&(current_data.nvm_watch_hd), (void *)&(default_data.nvm_watch_hd), sizeof(E_VIEW_REC_PREF)},
300  {(void *)&(current_data.nvm_record_hd), (void *)&(default_data.nvm_record_hd), sizeof(E_VIEW_REC_PREF)},
301  {(void *)&(current_data.nvm_timeshift_buffer_size), (void *)&(default_data.nvm_timeshift_buffer_size), sizeof(U16BIT)},
302  {(void *)&(current_data.nvm_subtitle_type), (void *)&(default_data.nvm_subtitle_type), sizeof(E_SUBTITLE_TYPE)},
303  {(void *)&(current_data.nvm_background_search_start), (void *)&(default_data.nvm_background_search_start), sizeof(U16BIT)},
304  {(void *)&(current_data.nvm_background_search_end), (void *)&(default_data.nvm_background_search_end), sizeof(U16BIT)},
305  {(void *)&(current_data.nvm_service_search_enabled), (void *)&(default_data.nvm_service_search_enabled), sizeof(BOOLEAN)},
306  {(void *)&(current_data.nvm_ssu_search_enabled), (void *)&(default_data.nvm_ssu_search_enabled), sizeof(BOOLEAN)},
307  {(void *)&(current_data.nvm_live_service_lcn), (void *)&(default_data.nvm_live_service_lcn), sizeof(U16BIT)},
308  {(void *)&(current_data.nvm_primary_text_lang), (void *)&(default_data.nvm_primary_text_lang), sizeof(U8BIT)},
309  {(void *)&(current_data.nvm_secondary_text_lang), (void *)&(default_data.nvm_secondary_text_lang), sizeof(U8BIT)},
310  {(void *)&(current_data.nvm_hdmi_audio_output), (void *)&(default_data.nvm_hdmi_audio_output), sizeof(E_STB_DIGITAL_AUDIO_TYPE)},
311  {(void *)&(current_data.nvm_eit_sched_limit), (void *)&(default_data.nvm_eit_sched_limit), sizeof(U16BIT)},
312  {(void *)&(current_data.nvm_prefer_hd_audio), (void *)&(default_data.nvm_prefer_hd_audio), sizeof(BOOLEAN)},
313  {(void *)&(current_data.nvm_pvr_notify_time), (void *)&(default_data.nvm_pvr_notify_time), sizeof(U16BIT)},
314  {(void *)&(current_data.nvm_record_start_padding), (void *)&(default_data.nvm_record_start_padding), sizeof(S32BIT)},
315  {(void *)&(current_data.nvm_record_end_padding), (void *)&(default_data.nvm_record_end_padding), sizeof(S32BIT)},
316 #ifdef COMMON_INTERFACE
317  {(void *)&(current_data.cicam_id0_0[0]), (void *)&(default_data.cicam_id0_0[0]), sizeof(U8BIT[4])},
318  {(void *)&(current_data.cicam_id0_1[0]), (void *)&(default_data.cicam_id0_1[0]), sizeof(U8BIT[4])},
319  {(void *)&(current_data.cicam_pin0), (void *)&(default_data.cicam_pin0), sizeof(S32BIT)},
320  {(void *)&(current_data.pin0_used_time), (void *)&(default_data.pin0_used_time), sizeof(U32DHMS)},
321  {(void *)&(current_data.cicam_id1_0[0]), (void *)&(default_data.cicam_id1_0[0]), sizeof(U8BIT[4])},
322  {(void *)&(current_data.cicam_id1_1[0]), (void *)&(default_data.cicam_id1_1[0]), sizeof(U8BIT[4])},
323  {(void *)&(current_data.cicam_pin1), (void *)&(default_data.cicam_pin1), sizeof(S32BIT)},
324  {(void *)&(current_data.pin1_used_time), (void *)&(default_data.pin1_used_time), sizeof(U32DHMS)},
325  {(void *)&(current_data.cicam_id2_0[0]), (void *)&(default_data.cicam_id2_0[0]), sizeof(U8BIT[4])},
326  {(void *)&(current_data.cicam_id2_1[0]), (void *)&(default_data.cicam_id2_1[0]), sizeof(U8BIT[4])},
327  {(void *)&(current_data.cicam_pin2), (void *)&(default_data.cicam_pin2), sizeof(S32BIT)},
328  {(void *)&(current_data.pin2_used_time), (void *)&(default_data.pin2_used_time), sizeof(U32DHMS)},
329  {(void *)&(current_data.cicam_id3_0[0]), (void *)&(default_data.cicam_id3_0[0]), sizeof(U8BIT[4])},
330  {(void *)&(current_data.cicam_id3_1[0]), (void *)&(default_data.cicam_id3_1[0]), sizeof(U8BIT[4])},
331  {(void *)&(current_data.cicam_pin3), (void *)&(default_data.cicam_pin3), sizeof(S32BIT)},
332  {(void *)&(current_data.pin3_used_time), (void *)&(default_data.pin3_used_time), sizeof(U32DHMS)}
333 #endif
334 };
335 
336 static BOOLEAN nvmdata_is_initialised;
337 static BOOLEAN nvm_data_has_changed;
338 
339 
340 //---local function prototypes for this file--------------------------------------------------------
341 // (internal functions declared static to make them local)
342 static BOOLEAN VerifyNvmChecksum(void);
343 static U16BIT ComputeNvmChecksum(void);
344 static void SaveNvmData(void);
345 
346 //--------------------------------------------------------------------------------------------------
347 // LOCAL FUNCTION DEFINITIONS
348 //--------------------------------------------------------------------------------------------------
349 
361 static BOOLEAN VerifyNvmChecksum(void)
362 {
363  BOOLEAN verify_status;
364  U16BIT temp_checksum;
365 
366  FUNCTION_START(VerifyNvmChecksum);
367 
368  ASSERT(nvmdata_is_initialised == TRUE);
369 
370  temp_checksum = (current_data.checksum[0] << 8) | current_data.checksum[1];
371 
372  if (temp_checksum == ComputeNvmChecksum())
373  {
374  verify_status = TRUE;
375  }
376  else
377  {
378  verify_status = FALSE;
379  }
380 
381  FUNCTION_FINISH(VerifyNvmChecksum);
382 
383  return verify_status;
384 }
385 
397 static U16BIT ComputeNvmChecksum(void)
398 {
399  U16BIT checksum;
400  U16BIT nvmdata;
401  U32BIT num_nvmdata_bytes;
402  U8BIT *nvmdata_ptr;
403 
404  FUNCTION_START(ComputeNvmChecksum);
405 
406  nvmdata_ptr = (U8BIT *)&current_data;
407  num_nvmdata_bytes = (U32BIT)(current_data.checksum - nvmdata_ptr);
408 
409  //init checksum with an arbitary seed value
410  //This ensures that nvm data of all zeros is not mistaken for valid data
411  nvmdata = 0xECD7;
412  checksum = nvmdata;
413 
414  //adding two U16BIT numbers (as opposed to U16BIT and a U8BIT) substantially
415  //increases the period between recurring ffff values (ie for the case of the
416  //nvm data being all ones.
417  while (num_nvmdata_bytes > 0)
418  {
419  nvmdata <<= 8;
420  nvmdata += (*nvmdata_ptr);
421  checksum += nvmdata;
422 
423  nvmdata_ptr++;
424  num_nvmdata_bytes--;
425  }
426 
427  FUNCTION_FINISH(ComputeNvmChecksum);
428 
429  return checksum;
430 }
431 
443 static void SaveNvmData(void)
444 {
445  U16BIT temp_checksum;
446 
447  FUNCTION_START(SaveNvmData);
448 
449  if (nvm_data_has_changed)
450  {
451  temp_checksum = ComputeNvmChecksum();
452  current_data.checksum[0] = temp_checksum >> 8;
453  current_data.checksum[1] = temp_checksum & 0xff;
454 
455  DBG(("SaveNvmData: saving dvb data"));
457  DBA_DataBlockWrite(DVB_DATA_BLOCK_ID, (U8BIT *)&current_data, sizeof(S_NVM_DATA));
459 
460  nvm_data_has_changed = FALSE;
461  }
462 
463  FUNCTION_FINISH(SaveNvmData);
464 }
465 
466 //--------------------------------------------------------------------------------------------------
467 // GLOBAL FUNCTION DEFINITIONS
468 //--------------------------------------------------------------------------------------------------
469 
474 {
475  FUNCTION_START(APP_NvmInitialise);
476 
477  /* Read DVB data */
478  if ((DBA_DataBlockSize(DVB_DATA_BLOCK_ID) != sizeof(current_data)) ||
479  (DBA_DataBlockRead(DVB_DATA_BLOCK_ID, (U8BIT *)&current_data, sizeof(current_data)) != sizeof(current_data)))
480  {
481  /* Use default settings */
482  DBG(("APP_NvmInitialise: Using defaults"));
484  }
485 
486  nvmdata_is_initialised = TRUE;
487  nvm_data_has_changed = FALSE;
488 
489  if (!VerifyNvmChecksum())
490  {
491  DBG(("APP_NvmInitialise CRC ERROR, RESTORING DEFAULTS\n"));
493  }
494 
495  FUNCTION_FINISH(APP_NvmInitialise);
496 }
497 
502 {
503  FUNCTION_START(APP_NvmRestoreDefaults);
504 
505  memcpy(&current_data, &default_data, sizeof(S_NVM_DATA));
506  nvm_data_has_changed = TRUE;
507 
508  DBG(("APP_NvmRestoreDefaults: restoring defaults"));
509  SaveNvmData();
510 
511  FUNCTION_FINISH(APP_NvmRestoreDefaults);
512 }
513 
519 U32BIT APP_NvmReadDefault(E_NVM_ITEMS nvm_item)
520 {
521  U32BIT default_item_value = 0;
522 
523  FUNCTION_START(APP_NvmReadDefault);
524 
525  //ensure valid nvm item
526  if (nvm_item < NUM_ITEMS_NVM)
527  {
528  switch (field_definition[nvm_item].field_size)
529  {
530  case 1:
531  {
532  default_item_value = (U32BIT)(*((U8BIT *)field_definition[nvm_item].def_ptr));
533  break;
534  }
535  case 2:
536  {
537  default_item_value = (U32BIT)(*((U16BIT *)field_definition[nvm_item].def_ptr));
538  break;
539  }
540  case 4:
541  {
542  default_item_value = (U32BIT)(*((U32BIT *)field_definition[nvm_item].def_ptr));
543  break;
544  }
545  default:
546  {
547  ASSERT(0);
548  break;
549  }
550  }
551  }
552 
553  FUNCTION_FINISH(APP_NvmReadDefault);
554  return(default_item_value);
555 }
556 
562 U32BIT APP_NvmRead(E_NVM_ITEMS nvm_item)
563 {
564  U32BIT nvm_item_value = 0;
565 
566  FUNCTION_START(APP_NvmRead);
567 
568  //ensure valid nvm item
569  if (nvm_item < NUM_ITEMS_NVM)
570  {
571  switch (field_definition[nvm_item].field_size)
572  {
573  case 1:
574  {
575  nvm_item_value = (U32BIT)(*((U8BIT *)field_definition[nvm_item].field_ptr));
576  break;
577  }
578  case 2:
579  {
580  nvm_item_value = (U32BIT)(*((U16BIT *)field_definition[nvm_item].field_ptr));
581  break;
582  }
583  case 4:
584  {
585  nvm_item_value = (U32BIT)(*((U32BIT *)field_definition[nvm_item].field_ptr));
586  break;
587  }
588  default:
589  {
590  ASSERT(0);
591  break;
592  }
593  }
594  }
595 
596  FUNCTION_FINISH(APP_NvmRead);
597  return(nvm_item_value);
598 }
599 
605 U8BIT *APP_NvmReadString(E_NVM_ITEMS nvm_item)
606 {
607  U8BIT *nvm_item_ptr;
608 
609  FUNCTION_START(APP_NvmReadString);
610 
611  //ensure valid nvm item
612  if (nvm_item < NUM_ITEMS_NVM)
613  {
614  ASSERT(field_definition[nvm_item].field_size == sizeof(U8BIT*));
615  nvm_item_ptr = (U8BIT*)field_definition[nvm_item].field_ptr;
616  }
617  else
618  {
619  nvm_item_ptr = NULL;
620  }
621 
622  FUNCTION_FINISH(APP_NvmReadString);
623  return(nvm_item_ptr);
624 }
625 
634 void APP_NvmSave(E_NVM_ITEMS nvm_item, U32BIT new_value, BOOLEAN write_to_flash_now)
635 {
636  U32BIT nvm_item_value;
637 
638  FUNCTION_START(APP_NvmSave);
639 
640  //ensure valid nvm item
641  if (nvm_item < NUM_ITEMS_NVM)
642  {
643  DBG(("APP_NvmSave: nvm_item = 0x%x, write_now=%s", nvm_item, write_to_flash_now ? "TRUE" : "FALSE"));
644  switch (field_definition[nvm_item].field_size)
645  {
646  case 1:
647  {
648  //read current nvm value
649  nvm_item_value = (U32BIT)(*((U8BIT *)field_definition[nvm_item].field_ptr));
650 
651  //has nvm value changed
652  if (nvm_item_value != new_value)
653  {
654  *((U8BIT *)field_definition[nvm_item].field_ptr) = (U8BIT)new_value;
655  nvm_data_has_changed = TRUE;
656  }
657 
658  //write to flash if reqd
659  if (write_to_flash_now == TRUE)
660  {
661  SaveNvmData();
662  }
663  break;
664  }
665  case 2:
666  {
667  //read current nvm value
668  nvm_item_value = (U32BIT)(*((U16BIT *)field_definition[nvm_item].field_ptr));
669 
670  //has nvm value changed
671  if (nvm_item_value != new_value)
672  {
673  *((U16BIT *)field_definition[nvm_item].field_ptr) = (U16BIT)new_value;
674  nvm_data_has_changed = TRUE;
675  }
676 
677  //write to flash if reqd
678  if (write_to_flash_now == TRUE)
679  {
680  SaveNvmData();
681  }
682  break;
683  }
684  case 4:
685  {
686  //read current nvm value
687  nvm_item_value = (U32BIT)(*((U32BIT *)field_definition[nvm_item].field_ptr));
688 
689  //has nvm value changed
690  if (nvm_item_value != new_value)
691  {
692  *((U32BIT *)field_definition[nvm_item].field_ptr) = (U32BIT)new_value;
693  nvm_data_has_changed = TRUE;
694  }
695 
696  //write to flash if reqd
697  if (write_to_flash_now == TRUE)
698  {
699  SaveNvmData();
700  }
701  break;
702  }
703  default:
704  {
705  ASSERT(0);
706  break;
707  }
708  }
709  }
710 
711  FUNCTION_FINISH(APP_NvmSave);
712 }
713 
722 void APP_NvmSaveString(E_NVM_ITEMS nvm_item, U8BIT *str_ptr, BOOLEAN write_to_flash_now)
723 {
724  U8BIT *nvm_item_ptr;
725 
726  FUNCTION_START(APP_NvmSave);
727 
728  //ensure valid nvm item
729  if (nvm_item < NUM_ITEMS_NVM)
730  {
731  ASSERT(field_definition[nvm_item].field_size == sizeof(U8BIT*));
732  DBG(("APP_NvmSaveString: nvm_item = %s, write_now=%s", str_ptr, write_to_flash_now ? "TRUE" : "FALSE"));
733  nvm_item_ptr = (U8BIT *)field_definition[nvm_item].field_ptr;
734  if (strcmp((char *)nvm_item_ptr, (char *)str_ptr) != 0)
735  {
736  strncpy((char *)nvm_item_ptr, (char *)str_ptr, field_definition[nvm_item].field_size);
737  nvm_data_has_changed = TRUE;
738  }
739  if (write_to_flash_now == TRUE)
740  {
741  SaveNvmData();
742  }
743  }
744  FUNCTION_FINISH(APP_NvmSaveString);
745 }
746 
751 {
752  FUNCTION_START(APP_NvmSaveAllNow);
753  DBG(("APP_NvmSaveAllNow"));
754  SaveNvmData();
755  FUNCTION_FINISH(APP_NvmSaveAllNow);
756 }
757 
762 U32BIT APP_NvmGetDvbSize(void)
763 {
764  FUNCTION_START(APP_NvmGetDvbSize);
765  FUNCTION_FINISH(APP_NvmGetDvbSize);
766  return(sizeof(S_NVM_DATA));
767 }
768 
Application configuration.
Header file - macros and function prototypes for public use.
Header file for NVM data handling functions.
U32BIT DBA_DataBlockSize(U32BIT data_block_id)
Returns the number of bytes available for the given data block.
Definition: dba_nvm.c:1508
void APP_NvmSaveAllNow(void)
Saves DVB values immediately.
Definition: app_nvm.c:750
void APP_NvmSaveString(E_NVM_ITEMS nvm_item, U8BIT *str_ptr, BOOLEAN write_to_flash_now)
Sets the current value for the given DVB setting.
Definition: app_nvm.c:722
Header file - Function prototypes for A/V control.
BOOLEAN DBA_DataBlockWrite(U32BIT data_block_id, U8BIT *data, U32BIT num_bytes)
Writes a block of data into the database from the given buffer.
Definition: dba_nvm.c:1560
void APP_NvmRestoreDefaults(void)
Resets the DVB&#39;s settings to factory defaults.
Definition: app_nvm.c:501
Header file - Function prototypes for A/V control.
U8BIT * APP_NvmReadString(E_NVM_ITEMS nvm_item)
Returns pointer to current string for the given DVB setting.
Definition: app_nvm.c:605
U32BIT APP_NvmReadDefault(E_NVM_ITEMS nvm_item)
Returns the factory default value for the given DVB setting.
Definition: app_nvm.c:519
Debug functions header file.
Header file - macros and function prototypes for public use.
Header file - macros and function prototypes for public use.
Database access defines, structures and public functions.
Contains the initialise functions for IP.
U32BIT DBA_DataBlockRead(U32BIT data_block_id, U8BIT *data, U32BIT num_bytes)
Read a block of data from the database into the given buffer.
Definition: dba_nvm.c:1528
System Wide Global Technical Data Type Definitions.
U32BIT APP_NvmRead(E_NVM_ITEMS nvm_item)
Returns the current value for the given DVB setting.
Definition: app_nvm.c:562
void APP_NvmInitialise(void)
Initialises the DVB core&#39;s NVM data.
Definition: app_nvm.c:473
Header file - Function prototypes for heap memory.
Application header file.
U32BIT APP_NvmGetDvbSize(void)
Returns the size in bytes the DVB module uses to save its settings.
Definition: app_nvm.c:762
void DBA_LockDatabase(void)
Locks the database to prevent access from other threads or processes.
Definition: dba_nvm.c:866
void DBA_UnlockDatabase(void)
Unlocks the database to allow other threads or processes to access it.
Definition: dba_nvm.c:876
void APP_NvmSave(E_NVM_ITEMS nvm_item, U32BIT new_value, BOOLEAN write_to_flash_now)
Sets the current value for the given DVB setting.
Definition: app_nvm.c:634
Application database access functions.
Header file - macros and function prototypes for public use.