/*************************************************************************** * * Copyright 2015-2019 BES. * All rights reserved. All unpublished rights reserved. * * No part of this work may be used or reproduced in any form or by any * means, or stored in a database or retrieval system, without prior written * permission of BES. * * Use of this work is governed by a license granted by BES. * This work contains confidential and proprietary information of * BES. which is protected by copyright, trade secret, * trademark and other intellectual property rights. * ****************************************************************************/ #include #include #include #include "hal_trace.h" #include "bluetooth.h" #include "me_api.h" #ifndef FPGA #include "cmsis_os.h" #include "cmsis.h" #include "nvrecord.h" //static int DDB_Print_Node(BtDeviceRecord* record) //{ // nvrec_trace(0,"record_bdAddr = "); // OS_DUMP8("%x ",record->bdAddr.addr,sizeof(record->bdAddr.addr)); // nvrec_trace(0,"record_trusted = "); // OS_DUMP8("%d ",&record->trusted,sizeof((uint8_t)record->trusted)); // nvrec_trace(0,"record_linkKey = "); // OS_DUMP8("%x ",record->linkKey,sizeof(record->linkKey)); // nvrec_trace(0,"record_keyType = "); // OS_DUMP8("%x ",&record->keyType,sizeof(record->keyType)); // nvrec_trace(0,"record_pinLen = "); // OS_DUMP8("%x ",&record->pinLen,sizeof(record->pinLen)); // return 1; //} void ddbif_list_saved_flash(void) { nv_record_flash_flush(); } bt_status_t ddbif_close(void) { ddbif_list_saved_flash(); return BT_STS_SUCCESS; } bt_status_t ddbif_add_record(btif_device_record_t *record) { return nv_record_add(section_usrdata_ddbrecord,(void *)record); } bt_status_t ddbif_open(const bt_bdaddr_t *bdAddr) { bt_status_t status = BT_STS_FAILED; status = nv_record_open(section_usrdata_ddbrecord); return status; } bt_status_t ddbif_find_record(const bt_bdaddr_t *bdAddr, btif_device_record_t *record) { return nv_record_ddbrec_find(bdAddr,record); } bt_status_t ddbif_delete_record(const bt_bdaddr_t *bdAddr) { return nv_record_ddbrec_delete(bdAddr); } bt_status_t ddbif_enum_device_records(I16 index, btif_device_record_t *record) { return nv_record_enum_dev_records((unsigned short)index,record); } #else typedef struct _DDB_List { struct _DDB_List *next; btif_device_record_t *record; } DDB_List; static DDB_List *head = NULL; static bt_bdaddr_t remDev_addr; static int DDB_Print_Node(btif_device_record_t *record); static int DDB_Print(); static void *DDB_Malloc (uint32_t size) { return malloc(size); } static void DDB_Free (void *p_mem) { free(p_mem); } static char POSSIBLY_UNUSED Hex2String(unsigned char *src, char* dest, unsigned int srcLen, unsigned int destLen) { unsigned int i = 0; unsigned char hb = 0, lb = 0; memset((char *)dest, 0, destLen); for(i = 0 ; i < srcLen ; i++) { hb = (src[i]&0xf0)>>4; if( hb >= 0 && hb <= 9) hb += 0x30; else if( hb>=10 &&hb <=15 ) hb = hb -10 + 'A'; else return 0; lb = src[i]&0x0f; if( lb>=0 && lb<=9 ) lb += 0x30; else if( lb>=10 && lb<=15 ) lb = lb - 10 + 'A'; else return 0; dest[i*2+0] = hb; dest[i*2+1] = lb; } return 1; } static void DDB_List_delete(DDB_List *list_head) { DDB_List *list = list_head,*list_tmp = NULL; while(NULL != list) { list_tmp = list; if(NULL != list->record) DDB_Free(list->record); list = list->next; DDB_Free(list_tmp); } } bt_status_t ddbif_close(void) { DDB_List *Close_tmp = NULL; Close_tmp = head; while(1) { DDB_Print(); Close_tmp = Close_tmp->next; if(Close_tmp == NULL) { TRACE(0,"DDB_Close.\n"); break; } } DDB_List_delete(head); return BT_STS_SUCCESS; } bt_status_t ddbif_add_record(btif_device_record_t *record) { DDB_List *ptr = NULL; DDB_List *tmp = NULL; ptr = head; tmp = (DDB_List *)DDB_Malloc(sizeof(DDB_List)); if(tmp == NULL) { TRACE(0,"DDB_AddRecord head == NULL:There is no enough space for DDB_List.\n"); return BT_STS_FAILED; } tmp->next = NULL; tmp->record = (btif_device_record_t *)DDB_Malloc(sizeof(btif_device_record_t)); if(NULL == tmp->record) { TRACE(0,"DDB_AddRecord head == NULL:There is no enough space for DDB_List.record.\n"); return BT_STS_FAILED; } if(head == NULL) { memcpy(tmp->record->bdAddr.address,record->bdAddr.address,sizeof(record->bdAddr.address)); tmp->record->keyType = record->keyType; memcpy(tmp->record->linkKey,record->linkKey,sizeof(record->linkKey)); tmp->record->pinLen = record->pinLen; tmp->record->trusted = record->trusted; head = tmp; memcpy(remDev_addr.address,tmp->record->bdAddr.address,sizeof(tmp->record->bdAddr.address)); TRACE(0,"DDB_AddRecord head:\n"); DDB_Print_Node(tmp->record); DDB_Print(); return BT_STS_SUCCESS; } while((ptr->next != NULL) && (memcmp(ptr->record->bdAddr.address, record->bdAddr.address, sizeof(ptr->record->bdAddr.address)))) { ptr = ptr->next; } if(!memcmp(ptr->record->bdAddr.address, record->bdAddr.address, sizeof(ptr->record->bdAddr.address))) { ptr->record->keyType = record->keyType; memcpy(ptr->record->linkKey,record->linkKey,sizeof(record->linkKey)); ptr->record->pinLen = record->pinLen; ptr->record->trusted = record->trusted; TRACE(0,"DDB_AddRecord head::\n"); DDB_Print_Node(ptr->record); DDB_Print(); free(tmp->record); free(tmp); return BT_STS_SUCCESS; } if(ptr->next == NULL) { tmp->next = NULL; memcpy(tmp->record->bdAddr.address,record->bdAddr.address,sizeof(record->bdAddr.address)); tmp->record->keyType = record->keyType; memcpy(tmp->record->linkKey,record->linkKey,sizeof(record->linkKey)); tmp->record->pinLen = record->pinLen; tmp->record->trusted = record->trusted; memcpy(remDev_addr.address,tmp->record->bdAddr.address,sizeof(tmp->record->bdAddr.address)); ptr->next = tmp; TRACE(0,"DDB_AddRecord head:::\n"); DDB_Print_Node(tmp->record); DDB_Print(); return BT_STS_SUCCESS; } return BT_STS_FAILED; } bt_status_t ddbif_open(const bt_bdaddr_t *bdAddr) { // DDB_List *head = NULL; return BT_STS_SUCCESS; } static int DDB_Print_Node(btif_device_record_t *record) { int i; for(i = 0; i < 6; i++) { TRACE(1,"%x ",record->bdAddr.address[i]); } TRACE(0,"\n"); /* for(i=0; i<16; i++) { TRACE(1,"%x ",record->linkKey[i]); } TRACE(0,"\n"); TRACE(3,"%d,%d,%d\n",record->keyType,record->pinLen,record->trusted); */ return 1; } static int DDB_Print() { DDB_List *Print_tmp = NULL; Print_tmp = head; if(Print_tmp == NULL) { TRACE(0,"DDB list is null!\n"); return 0; } TRACE(0,"-----------------DDB list-------------------\n"); while(Print_tmp != NULL) { DDB_Print_Node(Print_tmp->record); Print_tmp = Print_tmp->next; } TRACE(0,"--------------------end---------------------\n"); return 0; } bt_status_t ddbif_find_record(const bt_bdaddr_t *bdAddr, btif_device_record_t *record) { DDB_List *FindRecord_tmp = NULL; FindRecord_tmp = head; if(head == NULL) { TRACE(0,"DDB_FindRecord:DDB is null!\n"); return BT_STS_FAILED; } while(memcmp(FindRecord_tmp->record->bdAddr.address, bdAddr->address, sizeof(FindRecord_tmp->record->bdAddr.address)) && (FindRecord_tmp->next != NULL)) { FindRecord_tmp = FindRecord_tmp->next; } if(!memcmp(FindRecord_tmp->record->bdAddr.address,bdAddr->address, sizeof(FindRecord_tmp->record->bdAddr.address))) { memcpy(record->bdAddr.address, FindRecord_tmp->record->bdAddr.address, sizeof(FindRecord_tmp->record->bdAddr.address)); record->keyType = FindRecord_tmp->record->keyType; memcpy(record->linkKey,FindRecord_tmp->record->linkKey, sizeof(FindRecord_tmp->record->linkKey)); record->pinLen = FindRecord_tmp->record->pinLen; record->trusted = FindRecord_tmp->record->trusted; TRACE(0,"DDB_FindRecord:\n"); DDB_Print_Node(record); return BT_STS_SUCCESS; } if(FindRecord_tmp->next == NULL) { TRACE(0,"DDB_FindRecord ends.\n"); return BT_STS_FAILED; } return BT_STS_FAILED; } bt_status_t ddbif_delete_record(const bt_bdaddr_t *bdAddr) { DDB_List *checkingAddr = NULL; DDB_List *checkedAddr = NULL; checkingAddr = head; if(head == NULL) { TRACE(0,"DDB_DeleteRecord:list is null!\n"); return BT_STS_FAILED; } while(memcmp(checkingAddr->record->bdAddr.address,bdAddr->address, sizeof(checkingAddr->record->bdAddr.address)) && (checkingAddr->next != NULL)) { checkedAddr = checkingAddr; checkingAddr = checkingAddr->next; } if(!memcmp(checkingAddr->record->bdAddr.address,bdAddr->address, sizeof(checkingAddr->record->bdAddr.address))) { if(checkingAddr == head) { head = checkingAddr->next; free(checkingAddr->record); free(checkingAddr); DDB_Print(); return BT_STS_SUCCESS; } else { checkedAddr->next = checkingAddr->next; free(checkingAddr->record); free(checkingAddr); DDB_Print(); return BT_STS_SUCCESS; } } if(checkingAddr->next == NULL) { return BT_STS_FAILED; } return BT_STS_FAILED; } bt_status_t ddbif_enum_device_records(I16 index, btif_device_record_t *record) { DDB_List *databaselist; databaselist = head; if(head == NULL) { TRACE(0,"DDB_EnumDeviceRecords:No records!\n"); return BT_STS_FAILED; } TRACE(1,"index=%d\n",(uint32_t)index); while(databaselist != NULL) { if(!index) { break; } databaselist = databaselist->next; index--; } if((index == 0) && (databaselist != NULL)) { TRACE(0,"Enum record:\n"); DDB_Print_Node(databaselist->record); TRACE(0,"Enumeration ends!\n\n"); return BT_STS_SUCCESS; } if(databaselist == NULL) { TRACE(0,"Enumeration failed.\n"); return BT_STS_FAILED; } return BT_STS_FAILED; } #endif