source: svn/newcon3bcm2_21bu/dta/tests/unit_test/umstore.c @ 43

Last change on this file since 43 was 43, checked in by megakiss, 11 years ago

광주방송 OTC 주파수 369Mhz로 변경

  • Property svn:executable set to *
File size: 5.2 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2011, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile: $
11 * $brcm_Revision: $
12 * $brcm_Date: $
13 *
14 * Module Description: UDTA message storage implementation
15 *
16 * Revision History:
17 *
18 * $brcm_Log: $
19 *
20 *
21 ***************************************************************************/
22
23#include "bstd.h"
24#include "bkni.h"
25#include "bdbg.h"
26
27#include "umstore.h"
28#include "bfdb.h"
29#include "bspi_flash.h"
30#include "ramheader.h"
31
32BDBG_MODULE(bums);
33
34/* private structure that used by message storage interface */
35struct bums_data_t {
36    bfdb_handle db;
37};
38
39static struct bums_data_t umsd;
40
41/*
42   Flash configuration. For most flashes sector size and page size should be
43   left at default. Offset is a starting offset of database from the beginning
44   of the flash. DB_SIZE and DB_OFFSET must be dvisible by SECTOR_SIZE
45   This must match settings in bapp_settings.c. Later we will consolidate.
46 */
47#define FLASH_PAGE_SIZE 0x100
48#define FLASH_SECTOR_SIZE 0x10000
49
50#define FLASH_DB_SIZE FLASH_DATA_SIZE
51#define FLASH_DB_OFFSET (FLASH_BOOTLOADER_SIZE + FLASH_APP0_SIZE + FLASH_APP1_SIZE)
52#define MEM_DB_OFFSET 0
53#define MEM_DB_SIZE FLASH_DB_SIZE
54
55static bfdb_err bums_add(bfdb_handle handle, uint8_t id, uint8_t * data, size_t size);
56static bfdb_err bums_delete_all(bfdb_handle handle, uint8_t id);
57void bums_print_request(unsigned char data_id, int read);
58
59void bums_open(void)
60{
61        bfdb_err dberr;
62        struct bfdb_settings dbset;
63        bspi_settings_t spi_settings;
64        bresult rc;
65
66        rc = bspi_identify(&spi_settings);
67        BDBG_ASSERT(rc == b_ok);
68
69        dbset.page_size = spi_settings.page_size;
70        dbset.sector_size = spi_settings.sector_size;
71        dbset.db_offset = FLASH_DB_OFFSET;
72        dbset.db_size = FLASH_DB_SIZE;
73
74        BKNI_Memset(&umsd, 0, sizeof(struct bums_data_t));
75
76        dberr = bfdb_open(&dbset, &umsd.db);
77        if(BFDB_OK != dberr){
78                BDBG_ERR(("Error:%d line:%d\n", dberr, __LINE__));
79                if(BFDB_LOG_ERROR == dberr){
80                        dberr = bfdb_erase(umsd.db);
81                        if(BFDB_OK != dberr){
82                                BDBG_ERR(("Error:%d line:%d\n", dberr, __LINE__));
83                        }
84                }
85        }
86}
87
88void bums_close(void)
89{
90    int res;
91    /* close store handle. database does not need closing */
92    res = bfds_close(umsd.db->store);
93    if(BFDS_OK == res){
94        umsd.db = NULL;
95    }
96}
97
98
99int bums_read_data(unsigned char data_id, char * data, size_t size)
100{
101    int err;
102    bfdb_err dberr;
103
104    err = BUMS_ERROR;
105
106    bums_print_request(data_id, 1);
107
108    dberr = bfdb_rewind(umsd.db, data_id);
109    if(BFDB_OK == dberr){
110        dberr = bfdb_get(umsd.db, data, size);
111        if(BFDB_OK != dberr){
112                        BDBG_ERR(("Error:%d line:%d\n", dberr, __LINE__));
113                        goto ExitFunc;           
114        }
115        err = BUMS_OK;
116    }
117ExitFunc:
118    return err;
119}
120
121
122int bums_write_data(unsigned char data_id, char * data, size_t size)
123{
124    int err;
125    bfdb_err dberr;
126    err = BUMS_ERROR;
127
128    bums_print_request(data_id, 0);
129
130    dberr = bums_delete_all(umsd.db, data_id);
131        if(BFDB_OK != dberr){
132                BDBG_ERR(("Error:%d line:%d\n", dberr, __LINE__));
133                goto ExitFunc;
134        }
135    dberr = bums_add(umsd.db, data_id, data, size);
136    if(BFDB_OK != dberr){
137                BDBG_ERR(("Error:%d line:%d\n", dberr, __LINE__));
138        }
139    err = BUMS_OK;
140ExitFunc:   
141    return err;
142}
143
144int bums_delete_data(unsigned char data_id)
145{
146    int err;
147    bfdb_err dberr;
148    err = BUMS_ERROR;
149
150    bums_print_request(data_id, 2);
151
152    dberr = bums_delete_all(umsd.db, data_id);
153        if(BFDB_OK != dberr){
154                BDBG_ERR(("Error:%d line:%d\n", dberr, __LINE__));
155                goto ExitFunc;
156        }
157        err = BUMS_OK;
158ExitFunc:
159        return err;
160}
161
162/* add with compact if add fails */
163bfdb_err bums_add(bfdb_handle handle, uint8_t id, uint8_t * data, size_t size)
164{
165        bfdb_err dberr;
166        do {
167                dberr = bfdb_add(handle, id, data, size);
168                if(BFDB_LOG_FULL == dberr){
169                        dberr = bfdb_compact(handle);
170                        if(BFDB_OK == dberr){
171                                dberr = BFDB_LOG_FULL;
172                        }
173                }       
174        } while(BFDB_LOG_FULL == dberr);
175        return dberr;
176}
177
178bfdb_err bums_delete_all(bfdb_handle handle, uint8_t id)
179{
180        bfdb_err dberr;
181
182        dberr = bfdb_rewind(handle, id);
183        switch(dberr){
184        case BFDB_OK:
185                /* we have records in database, delete them */
186                do{
187                        dberr = bfdb_delete(handle);
188                        if(BFDB_OK != dberr){
189                                BDBG_ERR(("Error:%d line:%d\n", dberr, __LINE__));
190                                goto ExitFunc;
191                        }
192                        dberr = bfdb_next(handle, id);
193                }while(BFDB_OK == dberr);
194        case BFDB_RECORD_NOT_FOUND:
195                dberr = BFDB_OK;
196                break;
197        default:
198                BDBG_ERR(("Error:%d line:%d\n", dberr, __LINE__));
199        }
200ExitFunc:
201        return dberr;
202}
203
204
205static char * request_string[] = {
206    "CA_SYS_ID",
207};
208
209void bums_print_request(unsigned char data_id, int read)
210{
211    int idx;
212        char * action;
213
214    idx = data_id - BUMS_ID_START;
215    if(idx > (BUMS_ID_LAST - BUMS_ID_START)){
216        BDBG_ERR(("Incorrect ID requested"));
217    }
218        switch(read){
219        case 0:
220                action = "write";
221                break;
222        case 1:
223                action = "read";
224                break;
225        case 2:
226                action = "erase";
227                break;
228        }
229    BKNI_Printf("Request to %s %s\n", action, request_string[idx]);
230}
231
232bfdb_handle bast_getdb(void)
233{
234    return umsd.db;
235}
Note: See TracBrowser for help on using the repository browser.