#define SER_BT_PARAM_PREFIX_HDL_TX "handle_tx="
#define SER_BT_PARAM_PREFIX_HDL_CCCD "handle_cccd="
#define SER_BT_PARAM_PREFIX_VAL_CCCD "value_cccd="
+#define SER_BT_PARAM_PREFIX_BLE_MTU "mtu="
/**
* @file
{ "DL24M_BLE", SER_BT_CONN_AC6328, NULL, },
{ "DL24M_SPP", SER_BT_CONN_RFCOMM, "/channel=2", },
{ "HC-05", SER_BT_CONN_RFCOMM, NULL, },
+ { "TC66C", SER_BT_CONN_DIALOG, "/mtu=200", },
{ "UC96_BLE", SER_BT_CONN_AC6328, NULL, },
{ "UC96_SPP", SER_BT_CONN_RFCOMM, "/channel=2", },
{ "UM25C", SER_BT_CONN_RFCOMM, NULL, },
[SER_BT_CONN_NRF51] = "nrf51",
[SER_BT_CONN_CC254x] = "cc254x",
[SER_BT_CONN_AC6328] = "ac6328",
+ [SER_BT_CONN_DIALOG] = "dialog",
+ [SER_BT_CONN_NOTIFY] = "notify",
};
static enum ser_bt_conn_t lookup_conn_name(const char *name)
enum ser_bt_conn_t *conn_type, const char **remote_addr,
size_t *rfcomm_channel,
uint16_t *read_hdl, uint16_t *write_hdl,
- uint16_t *cccd_hdl, uint16_t *cccd_val)
+ uint16_t *cccd_hdl, uint16_t *cccd_val,
+ uint16_t *ble_mtu)
{
char **fields, *field;
enum ser_bt_conn_t type;
*cccd_hdl = 0;
if (cccd_val)
*cccd_val = 0;
+ if (ble_mtu)
+ *ble_mtu = 0;
if (!serial || !spec || !spec[0])
return SR_ERR_ARG;
if (cccd_val)
*cccd_val = 0x0001;
break;
+ case SER_BT_CONN_DIALOG:
+ if (read_hdl)
+ *read_hdl = 23;
+ if (write_hdl)
+ *write_hdl = 18;
+ if (cccd_hdl)
+ *cccd_hdl = 0;
+ if (cccd_val)
+ *cccd_val = 0x0001;
+ if (ble_mtu)
+ *ble_mtu = 400;
+ break;
+ case SER_BT_CONN_NOTIFY:
+ /* All other values must be provided externally. */
+ if (cccd_val)
+ *cccd_val = 0x0001;
+ break;
default:
return SR_ERR_ARG;
}
*cccd_val = parm_val;
continue;
}
+ if (g_str_has_prefix(field, SER_BT_PARAM_PREFIX_BLE_MTU)) {
+ field += strlen(SER_BT_PARAM_PREFIX_BLE_MTU);
+ endp = NULL;
+ ret = sr_atoul_base(field, &parm_val, &endp, 0);
+ if (ret != SR_OK || !endp || *endp != '\0') {
+ ret_parse = SR_ERR_ARG;
+ break;
+ }
+ if (ble_mtu)
+ *ble_mtu = parm_val;
+ continue;
+ }
return SR_ERR_DATA;
}
const char *remote_addr;
size_t rfcomm_channel;
uint16_t read_hdl, write_hdl, cccd_hdl, cccd_val;
+ uint16_t ble_mtu;
int rc;
struct sr_bt_desc *desc;
&conn_type, &remote_addr,
&rfcomm_channel,
&read_hdl, &write_hdl,
- &cccd_hdl, &cccd_val);
+ &cccd_hdl, &cccd_val,
+ &ble_mtu);
if (rc != SR_OK)
return SR_ERR_ARG;
case SER_BT_CONN_NRF51:
case SER_BT_CONN_CC254x:
case SER_BT_CONN_AC6328:
+ case SER_BT_CONN_DIALOG:
+ case SER_BT_CONN_NOTIFY:
rc = sr_bt_config_notify(desc,
- read_hdl, write_hdl, cccd_hdl, cccd_val);
+ read_hdl, write_hdl, cccd_hdl, cccd_val,
+ ble_mtu);
if (rc < 0)
return SR_ERR;
serial->bt_notify_handle_read = read_hdl;
serial->bt_notify_handle_write = write_hdl;
serial->bt_notify_handle_cccd = cccd_hdl;
serial->bt_notify_value_cccd = cccd_val;
+ serial->bt_ble_mtu = ble_mtu;
break;
default:
/* Unsupported type, or incomplete implementation. */
case SER_BT_CONN_NRF51:
case SER_BT_CONN_CC254x:
case SER_BT_CONN_AC6328:
+ case SER_BT_CONN_DIALOG:
+ case SER_BT_CONN_NOTIFY:
rc = sr_bt_connect_ble(desc);
if (rc < 0)
return SR_ERR;
case SER_BT_CONN_NRF51:
case SER_BT_CONN_CC254x:
case SER_BT_CONN_AC6328:
+ case SER_BT_CONN_DIALOG:
+ case SER_BT_CONN_NOTIFY:
/*
* Assume that when applications call the serial layer's
* write routine, then the BLE chip/module does support
case SER_BT_CONN_NRF51:
case SER_BT_CONN_CC254x:
case SER_BT_CONN_AC6328:
+ case SER_BT_CONN_DIALOG:
+ case SER_BT_CONN_NOTIFY:
dlen = sr_ser_has_queued_data(serial);
rc = sr_bt_check_notify(serial->bt_desc);
if (rc < 0)
case SER_BT_CONN_NRF51:
case SER_BT_CONN_CC254x:
case SER_BT_CONN_AC6328:
+ case SER_BT_CONN_DIALOG:
+ case SER_BT_CONN_NOTIFY:
dlen = sr_ser_has_queued_data(serial);
rc = sr_bt_check_notify(serial->bt_desc);
if (rc < 0)