| 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 | |
|---|
| 32 | BDBG_MODULE(bums); |
|---|
| 33 | |
|---|
| 34 | /* private structure that used by message storage interface */ |
|---|
| 35 | struct bums_data_t { |
|---|
| 36 | bfdb_handle db; |
|---|
| 37 | }; |
|---|
| 38 | |
|---|
| 39 | static 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 | |
|---|
| 55 | static bfdb_err bums_add(bfdb_handle handle, uint8_t id, uint8_t * data, size_t size); |
|---|
| 56 | static bfdb_err bums_delete_all(bfdb_handle handle, uint8_t id); |
|---|
| 57 | void bums_print_request(unsigned char data_id, int read); |
|---|
| 58 | |
|---|
| 59 | void 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 | |
|---|
| 88 | void 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 | |
|---|
| 99 | int 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 | } |
|---|
| 117 | ExitFunc: |
|---|
| 118 | return err; |
|---|
| 119 | } |
|---|
| 120 | |
|---|
| 121 | |
|---|
| 122 | int 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; |
|---|
| 140 | ExitFunc: |
|---|
| 141 | return err; |
|---|
| 142 | } |
|---|
| 143 | |
|---|
| 144 | int 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; |
|---|
| 158 | ExitFunc: |
|---|
| 159 | return err; |
|---|
| 160 | } |
|---|
| 161 | |
|---|
| 162 | /* add with compact if add fails */ |
|---|
| 163 | bfdb_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 | |
|---|
| 178 | bfdb_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 | } |
|---|
| 200 | ExitFunc: |
|---|
| 201 | return dberr; |
|---|
| 202 | } |
|---|
| 203 | |
|---|
| 204 | |
|---|
| 205 | static char * request_string[] = { |
|---|
| 206 | "CA_SYS_ID", |
|---|
| 207 | }; |
|---|
| 208 | |
|---|
| 209 | void 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 | |
|---|
| 232 | bfdb_handle bast_getdb(void) |
|---|
| 233 | { |
|---|
| 234 | return umsd.db; |
|---|
| 235 | } |
|---|