390 lines
10 KiB
C
390 lines
10 KiB
C
/***************************************************************************
|
|
*
|
|
* 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 <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "bluetooth.h"
|
|
#include "hal_trace.h"
|
|
#include "me_api.h"
|
|
|
|
#ifndef FPGA
|
|
#include "cmsis.h"
|
|
#include "cmsis_os.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
|