* [PATCH BlueZ 3/4] android/avrcp-lib: Add avrcp_set_volume function
From: Luiz Augusto von Dentz @ 2014-03-07 12:15 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1394194543-3095-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds avrcp_set_volume function which can be used to send
SetAbsoluteVolume PDUs.
---
android/avrcp-lib.c | 9 +++++++++
android/avrcp-lib.h | 2 ++
2 files changed, 11 insertions(+)
diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c
index a5530ec..bd1e7da 100644
--- a/android/avrcp-lib.c
+++ b/android/avrcp-lib.c
@@ -416,6 +416,15 @@ int avrcp_get_play_status(struct avrcp *session, avctp_rsp_cb func,
user_data);
}
+int avrcp_set_volume(struct avrcp *session, uint8_t volume, avctp_rsp_cb func,
+ void *user_data)
+{
+ return avrcp_send_req(session, AVC_CTYPE_CONTROL, AVC_SUBUNIT_PANEL,
+ AVRCP_SET_ABSOLUTE_VOLUME,
+ &volume, sizeof(volume),
+ func, user_data);
+}
+
int avrcp_get_play_status_rsp(struct avrcp *session, uint8_t transaction,
uint32_t position, uint32_t duration,
uint8_t status)
diff --git a/android/avrcp-lib.h b/android/avrcp-lib.h
index 4a49fe7..30d220e 100644
--- a/android/avrcp-lib.h
+++ b/android/avrcp-lib.h
@@ -148,6 +148,8 @@ int avrcp_get_current_player_value(struct avrcp *session, uint8_t *attrs,
void *user_data);
int avrcp_get_play_status(struct avrcp *session, avctp_rsp_cb func,
void *user_data);
+int avrcp_set_volume(struct avrcp *session, uint8_t volume, avctp_rsp_cb func,
+ void *user_data);
int avrcp_get_play_status_rsp(struct avrcp *session, uint8_t transaction,
uint32_t position, uint32_t duration,
--
1.8.5.3
^ permalink raw reply related
* [PATCH BlueZ 4/4] android/avrcp: Add support to set volume command
From: Luiz Augusto von Dentz @ 2014-03-07 12:15 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1394194543-3095-1-git-send-email-luiz.dentz@gmail.com>
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
---
android/avrcp.c | 27 ++++++++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/android/avrcp.c b/android/avrcp.c
index 978e6c0..11a2614 100644
--- a/android/avrcp.c
+++ b/android/avrcp.c
@@ -332,10 +332,35 @@ done:
static void handle_set_volume(const void *buf, uint16_t len)
{
+ struct hal_cmd_avrcp_set_volume *cmd = (void *) buf;
+ struct avrcp_device *dev;
+ uint8_t status;
+ int ret;
+
DBG("");
+ if (!devices) {
+ error("AVRCP: No device found to set volume");
+ status = HAL_STATUS_FAILED;
+ goto done;
+ }
+
+ /* Peek the first device since the HAL cannot really address a specific
+ * device it might mean there could only be one connected.
+ */
+ dev = devices->data;
+
+ ret = avrcp_set_volume(dev->session, cmd->value & 0x7f, NULL, NULL);
+ if (ret < 0) {
+ status = HAL_STATUS_FAILED;
+ goto done;
+ }
+
+ status = HAL_STATUS_SUCCESS;
+
+done:
ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_AVRCP, HAL_OP_AVRCP_SET_VOLUME,
- HAL_STATUS_FAILED);
+ status);
}
static const struct ipc_handler cmd_handlers[] = {
--
1.8.5.3
^ permalink raw reply related
* Re: [PATCH BlueZ 1/4] android/avrcp-lib: Add avrcp_register_notification function
From: Andrei Emeltchenko @ 2014-03-07 12:22 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth
In-Reply-To: <1394194543-3095-1-git-send-email-luiz.dentz@gmail.com>
Hi Luiz,
On Fri, Mar 07, 2014 at 02:15:40PM +0200, Luiz Augusto von Dentz wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> This adds avrcp_register_notification which can be used to send
> RegisterNotification PDUs.
Didn't I sent the same patch already? Why are we redoing the same work?
Best regards
Andrei Emeltchenko
> ---
> android/avrcp-lib.c | 15 +++++++++++++++
> android/avrcp-lib.h | 3 +++
> 2 files changed, 18 insertions(+)
>
> diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c
> index d66560b..a5530ec 100644
> --- a/android/avrcp-lib.c
> +++ b/android/avrcp-lib.c
> @@ -334,6 +334,21 @@ int avrcp_get_capabilities(struct avrcp *session, uint8_t param,
> func, user_data);
> }
>
> +int avrcp_register_notification(struct avrcp *session, uint8_t event,
> + uint32_t interval, avctp_rsp_cb func,
> + void *user_data)
> +{
> + uint8_t params[5];
> +
> + params[0] = event;
> + bt_put_be32(interval, ¶ms[1]);
> +
> + return avrcp_send_req(session, AVC_CTYPE_NOTIFY, AVC_SUBUNIT_PANEL,
> + AVRCP_REGISTER_NOTIFICATION,
> + params, sizeof(params),
> + func, user_data);
> +}
> +
> int avrcp_list_player_attributes(struct avrcp *session, avctp_rsp_cb func,
> void *user_data)
> {
> diff --git a/android/avrcp-lib.h b/android/avrcp-lib.h
> index ba1d84a..4a49fe7 100644
> --- a/android/avrcp-lib.h
> +++ b/android/avrcp-lib.h
> @@ -132,6 +132,9 @@ int avrcp_send(struct avrcp *session, uint8_t transaction, uint8_t code,
> uint8_t *params, size_t params_len);
> int avrcp_get_capabilities(struct avrcp *session, uint8_t param,
> avctp_rsp_cb func, void *user_data);
> +int avrcp_register_notification(struct avrcp *session, uint8_t event,
> + uint32_t interval, avctp_rsp_cb func,
> + void *user_data);
> int avrcp_list_player_attributes(struct avrcp *session, avctp_rsp_cb func,
> void *user_data);
> int avrcp_get_player_attribute_text(struct avrcp *session, uint8_t *attributes,
> --
> 1.8.5.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH BlueZ 1/4] android/avrcp-lib: Add avrcp_register_notification function
From: Luiz Augusto von Dentz @ 2014-03-07 13:00 UTC (permalink / raw)
To: Andrei Emeltchenko, Luiz Augusto von Dentz,
linux-bluetooth@vger.kernel.org
In-Reply-To: <20140307122228.GA4954@aemeltch-MOBL1>
Hi Andrei,
On Fri, Mar 7, 2014 at 2:22 PM, Andrei Emeltchenko
<andrei.emeltchenko.news@gmail.com> wrote:
> Hi Luiz,
>
> On Fri, Mar 07, 2014 at 02:15:40PM +0200, Luiz Augusto von Dentz wrote:
>> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>>
>> This adds avrcp_register_notification which can be used to send
>> RegisterNotification PDUs.
>
> Didn't I sent the same patch already? Why are we redoing the same work?
Im implementing the daemon side, this is the problem of sending big
patch sets it takes more time and I want to finish the AVRCP quickly
so we can have it tested. Btw, Im not sure why you are still defining
the PDU length public, this should probably be keep private until we
have proper struct defined, in fact I did mention that we might change
the way the handlers works in avrcp-lib to incorporate more logic and
do things like header checks that the unit test has been doing.
^ permalink raw reply
* [PATCH] Bluetooth: Fix expected key count debug logs
From: johan.hedberg @ 2014-03-07 13:04 UTC (permalink / raw)
To: linux-bluetooth
From: Johan Hedberg <johan.hedberg@intel.com>
The debug logs for reporting a discrepancy between the expected amount
of keys and the actually received amount of keys got these value mixed
up. This patch fixes the issue.
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
---
net/bluetooth/mgmt.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 98e9df3556e7..f2397e7ad385 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -2351,7 +2351,7 @@ static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
sizeof(struct mgmt_link_key_info);
if (expected_len != len) {
BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
- len, expected_len);
+ expected_len, len);
return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
MGMT_STATUS_INVALID_PARAMS);
}
@@ -4427,7 +4427,7 @@ static int load_irks(struct sock *sk, struct hci_dev *hdev, void *cp_data,
expected_len = sizeof(*cp) + irk_count * sizeof(struct mgmt_irk_info);
if (expected_len != len) {
BT_ERR("load_irks: expected %u bytes, got %u bytes",
- len, expected_len);
+ expected_len, len);
return cmd_status(sk, hdev->id, MGMT_OP_LOAD_IRKS,
MGMT_STATUS_INVALID_PARAMS);
}
@@ -4507,7 +4507,7 @@ static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
sizeof(struct mgmt_ltk_info);
if (expected_len != len) {
BT_ERR("load_keys: expected %u bytes, got %u bytes",
- len, expected_len);
+ expected_len, len);
return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
MGMT_STATUS_INVALID_PARAMS);
}
--
1.8.5.3
^ permalink raw reply related
* [PATCH 1/2] android/gatt: Handle Register gatt client command
From: Grzegorz Kolodziejczyk @ 2014-03-07 13:04 UTC (permalink / raw)
To: linux-bluetooth
This adds register gatt client app command handling.
---
android/gatt.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 62 insertions(+), 1 deletion(-)
diff --git a/android/gatt.c b/android/gatt.c
index ce85af4..f8f7208 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -31,6 +31,7 @@
#include <glib.h>
#include "ipc.h"
+#include "ipc-common.h"
#include "lib/bluetooth.h"
#include "gatt.h"
#include "src/log.h"
@@ -38,13 +39,73 @@
static struct ipc *hal_ipc = NULL;
static bdaddr_t adapter_addr;
+static int32_t client_if_counter;
+
+struct gatt_client {
+ int32_t client_if;
+ uint8_t uuid[16];
+};
+
+GList *gatt_client_list = NULL;
+
+static int find_client_uuid(gconstpointer data, gconstpointer user_data)
+{
+ const uint8_t *exp_uuid = user_data;
+ const uint8_t *cur_uuid = ((struct gatt_client *)data)->uuid;
+ struct gatt_client *client;
+
+ if (memcmp(exp_uuid, cur_uuid, sizeof(client->uuid)))
+ return 1;
+
+ return 0;
+}
+
static void handle_client_register(const void *buf, uint16_t len)
{
+ const struct hal_cmd_gatt_client_register *cmd = buf;
+ struct hal_ev_gatt_client_register_client ev;
+ struct gatt_client *client;
+ GList *found_client_uuid;
+
DBG("");
+ if (!cmd->uuid) {
+ error("no uuid received");
+ goto failed;
+ }
+
+ found_client_uuid = g_list_find_custom(gatt_client_list,
+ &cmd->uuid, find_client_uuid);
+
+ if (found_client_uuid) {
+ error("client uuid is already on list");
+ goto failed;
+ }
+
+ client = g_new0(struct gatt_client, 1);
+ g_memmove(client->uuid, cmd->uuid, sizeof(client->uuid));
+
+ client->client_if = ++client_if_counter;
+
+ gatt_client_list = g_list_append(gatt_client_list, client);
+
ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_GATT, HAL_OP_GATT_CLIENT_REGISTER,
- HAL_STATUS_FAILED);
+ HAL_STATUS_SUCCESS);
+
+ ev.status = HAL_STATUS_SUCCESS;
+ ev.client_if = client->client_if;
+ g_memmove(ev.app_uuid, client->uuid, sizeof(client->uuid));
+
+ ipc_send_notif(hal_ipc, HAL_SERVICE_ID_GATT,
+ HAL_EV_GATT_CLIENT_REGISTER_CLIENT, sizeof(ev), &ev);
+
+ return;
+
+failed:
+ ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_GATT,
+ HAL_OP_GATT_CLIENT_REGISTER, HAL_STATUS_FAILED);
+
}
static void handle_client_unregister(const void *buf, uint16_t len)
--
1.8.5.2
^ permalink raw reply related
* [PATCH 2/2] android/gatt: Handle Unregister gatt client command
From: Grzegorz Kolodziejczyk @ 2014-03-07 13:04 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1394197499-2207-1-git-send-email-grzegorz.kolodziejczyk@tieto.com>
This adds unregister gatt client app command handling.
---
android/gatt.c | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/android/gatt.c b/android/gatt.c
index f8f7208..1261c1f 100644
--- a/android/gatt.c
+++ b/android/gatt.c
@@ -60,6 +60,13 @@ static int find_client_uuid(gconstpointer data, gconstpointer user_data)
return 0;
}
+static int find_client_if(gconstpointer data, gconstpointer user_data)
+{
+ const int32_t exp_cif = *((int32_t *)user_data);
+ const int32_t cur_cif = ((struct gatt_client *)data)->client_if;
+
+ return cur_cif != exp_cif;
+}
static void handle_client_register(const void *buf, uint16_t len)
{
@@ -110,10 +117,26 @@ failed:
static void handle_client_unregister(const void *buf, uint16_t len)
{
+ const struct hal_cmd_gatt_client_unregister *cmd = buf;
+ int32_t client_if = cmd->client_if;
+ GList *found_client_if;
+
DBG("");
- ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_GATT,
+ found_client_if = g_list_find_custom(gatt_client_list, &client_if,
+ find_client_if);
+ if (!found_client_if) {
+ error("client_if: %d not found", client_if);
+ ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_GATT,
HAL_OP_GATT_CLIENT_UNREGISTER, HAL_STATUS_FAILED);
+ return;
+ }
+
+ gatt_client_list = g_list_remove(gatt_client_list,
+ found_client_if->data);
+
+ ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_GATT,
+ HAL_OP_GATT_CLIENT_UNREGISTER, HAL_STATUS_SUCCESS);
}
static void handle_client_scan(const void *buf, uint16_t len)
--
1.8.5.2
^ permalink raw reply related
* Re: [PATCH BlueZ 1/4] android/avrcp-lib: Add avrcp_register_notification function
From: Andrei Emeltchenko @ 2014-03-07 13:09 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: linux-bluetooth@vger.kernel.org
In-Reply-To: <CABBYNZJN5AU6jqDSq9P-MxKL09wZiiX1MFwUesRhzj+dGxLW7w@mail.gmail.com>
Hi Luiz,
On Fri, Mar 07, 2014 at 03:00:30PM +0200, Luiz Augusto von Dentz wrote:
> Hi Andrei,
>
> On Fri, Mar 7, 2014 at 2:22 PM, Andrei Emeltchenko
> <andrei.emeltchenko.news@gmail.com> wrote:
> > Hi Luiz,
> >
> > On Fri, Mar 07, 2014 at 02:15:40PM +0200, Luiz Augusto von Dentz wrote:
> >> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
> >>
> >> This adds avrcp_register_notification which can be used to send
> >> RegisterNotification PDUs.
> >
> > Didn't I sent the same patch already? Why are we redoing the same work?
>
> Im implementing the daemon side, this is the problem of sending big
> patch sets it takes more time and I want to finish the AVRCP quickly
> so we can have it tested. Btw, Im not sure why you are still defining
> the PDU length public,
The pdu lengths might be used in unit tests and avrcp-lib.
Best regards
Andrei Emeltchenko
> this should probably be keep private until we
> have proper struct defined, in fact I did mention that we might change
> the way the handlers works in avrcp-lib to incorporate more logic and
> do things like header checks that the unit test has been doing.
^ permalink raw reply
* [PATCH BlueZ v0] unit: Add test for g_dbus_client_set_ready_watch()
From: Claudio Takahasi @ 2014-03-07 13:14 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Claudio Takahasi
---
unit/test-gdbus-client.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/unit/test-gdbus-client.c b/unit/test-gdbus-client.c
index ee8a760..d0b6ce7 100644
--- a/unit/test-gdbus-client.c
+++ b/unit/test-gdbus-client.c
@@ -38,6 +38,7 @@ struct context {
GDBusClient *dbus_client;
GDBusProxy *proxy;
void *data;
+ gboolean client_ready;
guint timeout_source;
};
@@ -85,6 +86,7 @@ static struct context *create_context(void)
dbus_connection_set_exit_on_disconnect(context->dbus_conn, FALSE);
g_dbus_attach_object_manager(context->dbus_conn);
+ context->client_ready = FALSE;
return context;
}
@@ -964,6 +966,56 @@ static void client_force_disconnect(void)
destroy_context(context);
}
+static void client_ready_watch(GDBusClient *client, void *user_data)
+{
+ struct context *context = user_data;
+
+ context->client_ready = TRUE;
+}
+
+static void proxy_added(GDBusProxy *proxy, void *user_data)
+{
+ struct context *context = user_data;
+
+ /*
+ * Proxy added callback should not be called after Client ready
+ * watch. Ready means that all objects has been reported to the
+ * upper-layer.
+ */
+ g_assert(context->client_ready == FALSE);
+
+ g_main_loop_quit(context->main_loop);
+}
+
+static void client_ready(void)
+{
+ struct context *context = create_context();
+ static const GDBusPropertyTable string_properties[] = {
+ { "String", "s", get_string, set_string, string_exists },
+ { },
+ };
+
+ if (context == NULL)
+ return;
+
+ g_dbus_register_interface(context->dbus_conn,
+ SERVICE_PATH, SERVICE_NAME,
+ methods, signals, string_properties,
+ context, NULL);
+
+ context->dbus_client = g_dbus_client_new(context->dbus_conn,
+ SERVICE_NAME, SERVICE_PATH);
+
+ g_dbus_client_set_ready_watch(context->dbus_client, client_ready_watch,
+ context);
+ g_dbus_client_set_proxy_handlers(context->dbus_client,
+ proxy_added, NULL, NULL, context);
+
+ g_main_loop_run(context->main_loop);
+
+ destroy_context(context);
+}
+
int main(int argc, char *argv[])
{
g_test_init(&argc, &argv, NULL);
@@ -1001,5 +1053,7 @@ int main(int argc, char *argv[])
g_test_add_func("/gdbus/client_force_disconnect",
client_force_disconnect);
+ g_test_add_func("/gdbus/client_ready", client_ready);
+
return g_test_run();
}
--
1.8.3.1
^ permalink raw reply related
* [PATCH 8/9] unit/avrcp: Add /TP/NFY/BV-02-C test
From: Andrei Emeltchenko @ 2014-03-07 13:23 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1394193113-32347-8-git-send-email-Andrei.Emeltchenko.news@gmail.com>
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Test verifies that Target responds to Register notification command.
---
unit/test-avrcp.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/unit/test-avrcp.c b/unit/test-avrcp.c
index fa4870d..0e3bb51 100644
--- a/unit/test-avrcp.c
+++ b/unit/test-avrcp.c
@@ -162,6 +162,8 @@ static gboolean test_handler(GIOChannel *channel, GIOCondition cond,
ssize_t len;
int fd;
+ DBG("");
+
pdu = &context->data->pdu_list[context->pdu_offset++];
if (cond & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) {
@@ -495,6 +497,43 @@ static ssize_t avrcp_handle_get_element_attrs(struct avrcp *session,
return -EAGAIN;
}
+static ssize_t avrcp_handle_register_notification(struct avrcp *session,
+ uint8_t transaction,
+ uint16_t params_len,
+ uint8_t *params,
+ void *user_data)
+{
+ uint8_t event;
+ uint8_t pdu[1024];
+ size_t pdu_len;
+
+ DBG("");
+
+ if (params_len != AVRCP_REGISTER_NOTIFICATION_PARAM_LENGTH)
+ return -EINVAL;
+
+ event = params[0];
+ pdu[0] = event;
+ pdu_len = 1;
+
+ switch (event) {
+ case AVRCP_EVENT_TRACK_CHANGED:
+ memset(&pdu[1], 0xff, 8);
+ pdu_len += 8;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ avrcp_register_notification_rsp(session, transaction, AVC_CTYPE_INTERIM,
+ pdu, pdu_len);
+
+ avrcp_register_notification_rsp(session, transaction, AVC_CTYPE_CHANGED,
+ pdu, pdu_len);
+
+ return -EAGAIN;
+}
+
static const struct avrcp_control_handler control_handlers[] = {
{ AVRCP_GET_CAPABILITIES,
AVC_CTYPE_STATUS, AVC_CTYPE_STABLE,
@@ -523,6 +562,9 @@ static const struct avrcp_control_handler control_handlers[] = {
{ AVRCP_GET_ELEMENT_ATTRIBUTES,
AVC_CTYPE_STATUS, AVC_CTYPE_STABLE,
avrcp_handle_get_element_attrs },
+ { AVRCP_REGISTER_NOTIFICATION,
+ AVC_CTYPE_NOTIFY, AVC_CTYPE_INTERIM,
+ avrcp_handle_register_notification },
{ },
};
@@ -879,5 +921,22 @@ int main(int argc, char *argv[])
0x00, 0x00, 0x05, AVRCP_EVENT_STATUS_CHANGED,
0x00, 0x00, 0x00, 0x00));
+ /* Register notification - TG */
+ define_test("/TP/NFY/BV-02-C", test_server,
+ raw_pdu(0x00, 0x11, 0x0e, 0x03, 0x48, 0x00,
+ 0x00, 0x19, 0x58, AVRCP_REGISTER_NOTIFICATION,
+ 0x00, 0x00, 0x05, AVRCP_EVENT_TRACK_CHANGED,
+ 0x00, 0x00, 0x00, 0x00),
+ raw_pdu(0x02, 0x11, 0x0e, AVC_CTYPE_INTERIM, 0x48, 0x00,
+ 0x00, 0x19, 0x58, AVRCP_REGISTER_NOTIFICATION,
+ 0x00, 0x00, 0x09, AVRCP_EVENT_TRACK_CHANGED,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff),
+ raw_pdu(0x02, 0x11, 0x0e, AVC_CTYPE_CHANGED, 0x48, 0x00,
+ 0x00, 0x19, 0x58, AVRCP_REGISTER_NOTIFICATION,
+ 0x00, 0x00, 0x09, AVRCP_EVENT_TRACK_CHANGED,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff));
+
return g_test_run();
}
--
1.8.3.2
^ permalink raw reply related
* [PATCH] bluetooth: Fix aborting eSCO connection in case of error 0x20
From: Andrew Earl @ 2014-03-07 13:30 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Andrew Earl
Add additional error case to attempt alternative configuration for SCO. Error
occurs with Intel BT controller where fallback is not attempted as the error
0x020 Unsupported LMP Parameter value is not included in the list of errors
where a retry should be attempted.
The problem also affects PTS test case TC_HF_ACS_BV_05_I.
See the HCI log below for details:
< HCI Command: Setup Synchronous Connection (0x01|0x0028) plen 17
handle 256 voice setting 0x0060 ptype 0x0380
> HCI Event: Command Status (0x0f) plen 4
Setup Synchronous Connection (0x01|0x0028) status 0x00 ncmd 1
> HCI Event: Max Slots Change (0x1b) plen 3
handle 256 slots 1
> HCI Event: Synchronous Connect Complete (0x2c) plen 17
status 0x20 handle 0 bdaddr 00:80:98:09:0B:19 type eSCO
Error: Unsupported LMP Parameter Value
< HCI Command: Setup Synchronous Connection (0x01|0x0028) plen 17
handle 256 voice setting 0x0060 ptype 0x0380
> HCI Event: Command Status (0x0f) plen 4
Setup Synchronous Connection (0x01|0x0028) status 0x00 ncmd 1
> HCI Event: Max Slots Change (0x1b) plen 3
handle 256 slots 5
> HCI Event: Synchronous Connect Complete (0x2c) plen 17
status 0x20 handle 0 bdaddr 00:80:98:09:0B:19 type eSCO
Error: Unsupported LMP Parameter Value
< HCI Command: Setup Synchronous Connection (0x01|0x0028) plen 17
handle 256 voice setting 0x0060 ptype 0x03c8
> HCI Event: Command Status (0x0f) plen 4
Setup Synchronous Connection (0x01|0x0028) status 0x00 ncmd 1
> HCI Event: Max Slots Change (0x1b) plen 3
handle 256 slots 1
> HCI Event: Synchronous Connect Complete (0x2c) plen 17
status 0x00 handle 257 bdaddr 00:80:98:09:0B:19 type eSCO
Air mode: CVSD
---
net/bluetooth/hci_event.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 5f81245..59e1b45 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -2905,6 +2905,7 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
case 0x1c: /* SCO interval rejected */
case 0x1a: /* Unsupported Remote Feature */
case 0x1f: /* Unspecified error */
+ case 0x20: /* Unsupported LMP Parameter value */
if (conn->out) {
conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
(hdev->esco_type & EDR_ESCO_MASK);
--
1.7.11.7
^ permalink raw reply related
* [PATCH 1/2] unit/avrcp: Add /TP/NFY/BV-03-C test
From: Andrei Emeltchenko @ 2014-03-07 15:38 UTC (permalink / raw)
To: linux-bluetooth
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Test verifies that Target responds Register notification command with
parameter AVRCP_EVENT_SETTINGS_CHANGED.
---
unit/test-avrcp.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/unit/test-avrcp.c b/unit/test-avrcp.c
index 0e3bb51..c442001 100644
--- a/unit/test-avrcp.c
+++ b/unit/test-avrcp.c
@@ -521,6 +521,12 @@ static ssize_t avrcp_handle_register_notification(struct avrcp *session,
memset(&pdu[1], 0xff, 8);
pdu_len += 8;
break;
+ case AVRCP_EVENT_SETTINGS_CHANGED:
+ pdu[1] = 0x01;
+ pdu[2] = 0x01;
+ pdu[3] = 0x02;
+ pdu_len = 4;
+ break;
default:
return -EINVAL;
}
@@ -938,5 +944,23 @@ int main(int argc, char *argv[])
0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff));
+ /* Register notification - TG */
+ define_test("/TP/NFY/BV-03-C", test_server,
+ raw_pdu(0x00, 0x11, 0x0e, 0x03, 0x48, 0x00,
+ 0x00, 0x19, 0x58, AVRCP_REGISTER_NOTIFICATION,
+ 0x00, 0x00, 0x05,
+ AVRCP_EVENT_SETTINGS_CHANGED,
+ 0x00, 0x00, 0x00, 0x00),
+ raw_pdu(0x02, 0x11, 0x0e, AVC_CTYPE_INTERIM, 0x48, 0x00,
+ 0x00, 0x19, 0x58, AVRCP_REGISTER_NOTIFICATION,
+ 0x00, 0x00, 0x04,
+ AVRCP_EVENT_SETTINGS_CHANGED,
+ 0x01, 0x01, 0x02),
+ raw_pdu(0x02, 0x11, 0x0e, AVC_CTYPE_CHANGED, 0x48, 0x00,
+ 0x00, 0x19, 0x58, AVRCP_REGISTER_NOTIFICATION,
+ 0x00, 0x00, 0x04,
+ AVRCP_EVENT_SETTINGS_CHANGED,
+ 0x01, 0x01, 0x02));
+
return g_test_run();
}
--
1.8.3.2
^ permalink raw reply related
* [PATCH 2/2] unit/avrcp: Add /TP/NFY/BV-04-C test
From: Andrei Emeltchenko @ 2014-03-07 15:38 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1394206711-5508-1-git-send-email-Andrei.Emeltchenko.news@gmail.com>
From: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Test verifies that Target responds to Register notification - Track
Changed - No Selected Track.
---
unit/test-avrcp.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/unit/test-avrcp.c b/unit/test-avrcp.c
index c442001..6b5f615 100644
--- a/unit/test-avrcp.c
+++ b/unit/test-avrcp.c
@@ -962,5 +962,17 @@ int main(int argc, char *argv[])
AVRCP_EVENT_SETTINGS_CHANGED,
0x01, 0x01, 0x02));
+ /* Register notification - Track Changed - No Selected Track - TG */
+ define_test("/TP/NFY/BV-04-C", test_server,
+ raw_pdu(0x00, 0x11, 0x0e, 0x03, 0x48, 0x00,
+ 0x00, 0x19, 0x58, AVRCP_REGISTER_NOTIFICATION,
+ 0x00, 0x00, 0x05, AVRCP_EVENT_TRACK_CHANGED,
+ 0x00, 0x00, 0x00, 0x00),
+ raw_pdu(0x02, 0x11, 0x0e, AVC_CTYPE_INTERIM, 0x48, 0x00,
+ 0x00, 0x19, 0x58, AVRCP_REGISTER_NOTIFICATION,
+ 0x00, 0x00, 0x09, AVRCP_EVENT_TRACK_CHANGED,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff));
+
return g_test_run();
}
--
1.8.3.2
^ permalink raw reply related
* Re: [PATCH] bluetooth: Fix aborting eSCO connection in case of error 0x20
From: Marcel Holtmann @ 2014-03-07 17:53 UTC (permalink / raw)
To: Andrew Earl; +Cc: linux-bluetooth
In-Reply-To: <1394199005-28369-1-git-send-email-andrewx.earl@intel.com>
Hi Andre,
> Add additional error case to attempt alternative configuration for SCO. Error
> occurs with Intel BT controller where fallback is not attempted as the error
> 0x020 Unsupported LMP Parameter value is not included in the list of errors
status is only 1 octet and not 1.5 octets ;)
> where a retry should be attempted.
> The problem also affects PTS test case TC_HF_ACS_BV_05_I.
>
> See the HCI log below for details:
> < HCI Command: Setup Synchronous Connection (0x01|0x0028) plen 17
> handle 256 voice setting 0x0060 ptype 0x0380
>> HCI Event: Command Status (0x0f) plen 4
> Setup Synchronous Connection (0x01|0x0028) status 0x00 ncmd 1
>> HCI Event: Max Slots Change (0x1b) plen 3
> handle 256 slots 1
>> HCI Event: Synchronous Connect Complete (0x2c) plen 17
> status 0x20 handle 0 bdaddr 00:80:98:09:0B:19 type eSCO
> Error: Unsupported LMP Parameter Value
> < HCI Command: Setup Synchronous Connection (0x01|0x0028) plen 17
> handle 256 voice setting 0x0060 ptype 0x0380
>> HCI Event: Command Status (0x0f) plen 4
> Setup Synchronous Connection (0x01|0x0028) status 0x00 ncmd 1
>> HCI Event: Max Slots Change (0x1b) plen 3
> handle 256 slots 5
>> HCI Event: Synchronous Connect Complete (0x2c) plen 17
> status 0x20 handle 0 bdaddr 00:80:98:09:0B:19 type eSCO
> Error: Unsupported LMP Parameter Value
> < HCI Command: Setup Synchronous Connection (0x01|0x0028) plen 17
> handle 256 voice setting 0x0060 ptype 0x03c8
>> HCI Event: Command Status (0x0f) plen 4
> Setup Synchronous Connection (0x01|0x0028) status 0x00 ncmd 1
>> HCI Event: Max Slots Change (0x1b) plen 3
> handle 256 slots 1
>> HCI Event: Synchronous Connect Complete (0x2c) plen 17
> status 0x00 handle 257 bdaddr 00:80:98:09:0B:19 type eSCO
> Air mode: CVSD
You need to sign off your patches. Do you mind actually including the btmon trace since that is a bit more verbose.
> ---
> net/bluetooth/hci_event.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
> index 5f81245..59e1b45 100644
> --- a/net/bluetooth/hci_event.c
> +++ b/net/bluetooth/hci_event.c
> @@ -2905,6 +2905,7 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev,
> case 0x1c: /* SCO interval rejected */
> case 0x1a: /* Unsupported Remote Feature */
> case 0x1f: /* Unspecified error */
> + case 0x20: /* Unsupported LMP Parameter value */
> if (conn->out) {
> conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
> (hdev->esco_type & EDR_ESCO_MASK);
Regards
Marcel
^ permalink raw reply
* Re: [PATCH] Bluetooth: Fix skb allocation check for A2MP
From: Johan Hedberg @ 2014-03-07 18:12 UTC (permalink / raw)
To: Gustavo Padovan; +Cc: linux-bluetooth, Gustavo Padovan
In-Reply-To: <1356146573-9639-1-git-send-email-gustavo@padovan.org>
Hi Gustavo,
On Sat, Dec 22, 2012, Gustavo Padovan wrote:
> vtable's method alloc_skb() needs to return a ERR_PTR in case of err and
> not a NULL.
>
> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
> ---
> net/bluetooth/a2mp.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
Applied to bluetooth-next. Thanks.
Johan
^ permalink raw reply
* Re: [PATCH] Fix endian safe issue, make driver work on both little and big endian cpu.
From: Johan Hedberg @ 2014-03-07 18:13 UTC (permalink / raw)
To: Peng Chen; +Cc: gustavo, linux-bluetooth, marcel
In-Reply-To: <1346931043-11541-1-git-send-email-pengchen@qca.qualcomm.com>
Hi,
On Thu, Sep 06, 2012, Peng Chen wrote:
> Signed-off-by: Peng Chen <pengchen@qca.qualcomm.com>
> ---
> drivers/bluetooth/ath3k.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
Applied to bluetooth-next. Thanks.
Johan
^ permalink raw reply
* [PATCH 1/2] android/pics: Correct PICS for AbsoluteVolume
From: Sebastian Chlad @ 2014-03-07 18:42 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Sebastian Chlad
As Specification for AVRCP 1.4+ requires, in case of Absolute
Volume, roles are reveresed and IUT plays CT while PTS plays TG
role (PTS acts as sink. See section 6.13.2 AVRCP 1.5 Spec)
---
android/pics-avrcp.txt | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/android/pics-avrcp.txt b/android/pics-avrcp.txt
index 845ba33..bee22c8 100644
--- a/android/pics-avrcp.txt
+++ b/android/pics-avrcp.txt
@@ -12,7 +12,7 @@ O - optional
-------------------------------------------------------------------------------
Parameter Name Selected Description
-------------------------------------------------------------------------------
-SPC_AVRCP_1_1 False (*) Role: Controller (CT) (C.1)
+SPC_AVRCP_1_1 True Role: Controller (CT) (C.1)
TSPC_AVRCP_1_2 True Role: Target (TG) (C.1)
-------------------------------------------------------------------------------
C.1: Mandatory to support at least one of the defined roles.
@@ -82,9 +82,9 @@ TSPC_AVRCP_2_45 False CT: PlayItem(NowPlayingList) (C.8)
TSPC_AVRCP_2_46 False CT: AddToNowPlaying (O)
TSPC_AVRCP_2_47 False CT: EVENT_NOW_PLAYING_CONTENT_CHANGED (O)
TSPC_AVRCP_2_48 False CT: Playable Folders (O)
-TSPC_AVRCP_2_49 False CT: Absolute Volume (C.3)
-TSPC_AVRCP_2_50 False CT: SetAbsoluteVolume (C.3)
-TSPC_AVRCP_2_51 False CT: NotifyVolumeChange (C.3)
+TSPC_AVRCP_2_49 True (*) CT: Absolute Volume (C.3)
+TSPC_AVRCP_2_50 True (*) CT: SetAbsoluteVolume (C.3)
+TSPC_AVRCP_2_51 True (*) CT: NotifyVolumeChange (C.3)
TSPC_AVRCP_2_52 False (*) CT: Discoverable Mode (M)
TSPC_AVRCP_2_53 False CT: PASSTHROUGH operation supporting press
and hold (O)
@@ -405,9 +405,9 @@ TSPC_AVRCP_7_56 False TG: PlayItem(NowPlayingList) (C.11)
TSPC_AVRCP_7_57 False TG: AddToNowPlaying (O)
TSPC_AVRCP_7_58 False TG: EVENT_NOW_PLAYING_CONTENT_CHANGED (C.11)
TSPC_AVRCP_7_59 False TG: Playable Folders (O)
-TSPC_AVRCP_7_60 True (*) TG: Absolute Volume (C.5)
-TSPC_AVRCP_7_61 True (*) TG: SetAbsoluteVolume (C.5)
-TSPC_AVRCP_7_62 True (*) TG: NotifyVolumeChange (C.5)
+TSPC_AVRCP_7_60 False TG: Absolute Volume (C.5)
+TSPC_AVRCP_7_61 False TG: SetAbsoluteVolume (C.5)
+TSPC_AVRCP_7_62 False TG: NotifyVolumeChange (C.5)
TSPC_AVRCP_7_63 False TG: Error Response (O)
TSPC_AVRCP_7_64 False TG: General Reject (C.13)
TSPC_AVRCP_7_65 True TG: Discoverable Mode (M)
--
1.8.5.3
^ permalink raw reply related
* [PATCH 2/2] android/pts: Add AVRCP 1.5 PTS tests
From: Sebastian Chlad @ 2014-03-07 18:42 UTC (permalink / raw)
To: linux-bluetooth; +Cc: Sebastian Chlad
In-Reply-To: <1394217767-12242-1-git-send-email-sebastian.chlad@tieto.com>
Adding PTS test results for AVRCP 1.5.
---
android/pts-avrcp.txt | 42 +++++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/android/pts-avrcp.txt b/android/pts-avrcp.txt
index 8bd0b4d..b2cecf3 100644
--- a/android/pts-avrcp.txt
+++ b/android/pts-avrcp.txt
@@ -1,7 +1,7 @@
PTS test results for AVRCP
PTS version: 5.0
-Tested: 28.01.2014
+Tested: 07.03.2014
Android version: 4.4.2
Results:
@@ -77,12 +77,12 @@ TC_CT_PTT_BV_04_I N/A
TC_CT_PTT_BV_05_I N/A
TC_CT_RCR_BV_01_C N/A
TC_CT_RCR_BV_03_C N/A
-TC_CT_VLH_BI_03_C N/A
-TC_CT_VLH_BI_04_C N/A
-TC_CT_VLH_BV_01_C N/A
-TC_CT_VLH_BV_01_I N/A
-TC_CT_VLH_BV_02_I N/A
-TC_CT_VLH_BV_03_C N/A
+TC_CT_VLH_BI_03_C INC
+TC_CT_VLH_BI_04_C INC
+TC_CT_VLH_BV_01_C INC
+TC_CT_VLH_BV_01_I INC
+TC_CT_VLH_BV_02_I INC
+TC_CT_VLH_BV_03_C INC
-------------------------------------------------------------------------------
@@ -93,9 +93,9 @@ Test Name Result Notes
TC_TG_BGN_BV_01_I N/A
TC_TG_BGN_BV_02_I N/A
TC_TG_CEC_BV_01_I PASS
-TC_TG_CEC_BV_02_I INC Initiate a control channel connection
-TC_TG_CFG_BI_01_C INC
-TC_TG_CFG_BV_02_C INC
+TC_TG_CEC_BV_02_I PASS
+TC_TG_CFG_BI_01_C PASS
+TC_TG_CFG_BV_02_C PASS
TC_TG_CON_BV_02_C N/A
TC_TG_CON_BV_04_C N/A
TC_TG_CON_BV_05_C N/A
@@ -103,7 +103,7 @@ TC_TG_CRC_BV_01_I PASS
TC_TG_CRC_BV_02_I PASS Disconnect from PTS
TC_TG_ICC_BV_01_I PASS
TC_TG_ICC_BV_02_I PASS
-TC_TG_INV_BI_01_C INC
+TC_TG_INV_BI_01_C PASS
TC_TG_INV_BI_02_C N/A
TC_TG_MCN_CB_BI_01_C N/A
TC_TG_MCN_CB_BI_02_C N/A
@@ -146,9 +146,9 @@ TC_TG_MCN_SRC_BV_03_I N/A
TC_TG_MCN_SRC_BV_04_C N/A
TC_TG_MCN_SRC_BV_04_I N/A
TC_TG_MCN_SRC_BV_06_C N/A
-TC_TG_MDI_BV_02_C INC
-TC_TG_MDI_BV_04_C INC
-TC_TG_MDI_BV_05_C INC
+TC_TG_MDI_BV_02_C PASS
+TC_TG_MDI_BV_04_C FAIL
+TC_TG_MDI_BV_05_C PASS
TC_TG_MPS_BI_01_C N/A
TC_TG_MPS_BI_02_C N/A
TC_TG_MPS_BV_01_I N/A
@@ -161,14 +161,14 @@ TC_TG_MPS_BV_06_C N/A
TC_TG_MPS_BV_07_C N/A
TC_TG_MPS_BV_09_C N/A
TC_TG_MPS_BV_10_C N/A
-TC_TG_NFY_BI_01_C INC
-TC_TG_NFY_BV_02_C INC
+TC_TG_NFY_BI_01_C PASS
+TC_TG_NFY_BV_02_C PASS Change track when requested
TC_TG_NFY_BV_03_C N/A
-TC_TG_NFY_BV_04_C INC
-TC_TG_NFY_BV_05_C INC
+TC_TG_NFY_BV_04_C PASS
+TC_TG_NFY_BV_05_C PASS
TC_TG_NFY_BV_06_C N/A
TC_TG_NFY_BV_07_C N/A
-TC_TG_NFY_BV_08_C INC
+TC_TG_NFY_BV_08_C PASS
TC_TG_PAS_BI_01_C N/A
TC_TG_PAS_BI_02_C N/A
TC_TG_PAS_BI_03_C N/A
@@ -179,8 +179,8 @@ TC_TG_PAS_BV_04_C N/A
TC_TG_PAS_BV_06_C N/A
TC_TG_PAS_BV_08_C N/A
TC_TG_PAS_BV_10_C N/A
-TC_TG_PTT_BV_01_I INC
-TC_TG_PTT_BV_02_I N/A
+TC_TG_PTT_BV_01_I PASS
+TC_TG_PTT_BV_02_I PASS
TC_TG_PTT_BV_03_I N/A
TC_TG_PTT_BV_04_I N/A
TC_TG_PTT_BV_05_I N/A
--
1.8.5.3
^ permalink raw reply related
* [PATCH 1/5] android/handsfree: Fix possible g_io_channel_shutdown() on NULL channel
From: Marcin Kraglak @ 2014-03-07 20:23 UTC (permalink / raw)
To: linux-bluetooth
Return false if listen failed.
---
android/handsfree.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/android/handsfree.c b/android/handsfree.c
index dc5c73d..fa27f10 100644
--- a/android/handsfree.c
+++ b/android/handsfree.c
@@ -1192,7 +1192,7 @@ static bool enable_hfp_ag(void)
if (!hfp_server) {
error("Failed to listen on Handsfree rfcomm: %s", err->message);
g_error_free(err);
- goto failed;
+ return false;
}
rec = hfp_ag_record();
--
1.8.3.1
^ permalink raw reply related
* [PATCH 2/5] android/handsfree: Add support for handling incoming SCO connections
From: Marcin Kraglak @ 2014-03-07 20:23 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1394223800-11961-1-git-send-email-marcin.kraglak@tieto.com>
This adds support for accepting SCO connections from remote devices.
---
android/handsfree.c | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 148 insertions(+)
diff --git a/android/handsfree.c b/android/handsfree.c
index fa27f10..40f3652 100644
--- a/android/handsfree.c
+++ b/android/handsfree.c
@@ -83,11 +83,14 @@ static const struct indicator inds_defaults[] = {
static struct {
bdaddr_t bdaddr;
uint8_t state;
+ uint8_t audio_state;
uint32_t features;
bool indicators_enabled;
struct indicator inds[IND_COUNT];
bool hsp;
struct hfp_gw *gw;
+ GIOChannel *sco;
+ guint sco_watch;
} device;
static bdaddr_t adapter_addr;
@@ -99,6 +102,8 @@ static GIOChannel *hfp_server = NULL;
static uint32_t hsp_record_id = 0;
static GIOChannel *hsp_server = NULL;
+static GIOChannel *sco_server = NULL;
+
static void device_set_state(uint8_t state)
{
struct hal_ev_handsfree_conn_state ev;
@@ -119,6 +124,26 @@ static void device_set_state(uint8_t state)
HAL_EV_HANDSFREE_CONN_STATE, sizeof(ev), &ev);
}
+static void device_set_audio_state(uint8_t state)
+{
+ struct hal_ev_handsfree_audio_state ev;
+ char address[18];
+
+ if (device.audio_state == state)
+ return;
+
+ device.audio_state = state;
+
+ ba2str(&device.bdaddr, address);
+ DBG("device %s audio state %u", address, state);
+
+ bdaddr2android(&device.bdaddr, ev.bdaddr);
+ ev.state = state;
+
+ ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
+ HAL_EV_HANDSFREE_AUDIO_STATE, sizeof(ev), &ev);
+}
+
static void device_init(const bdaddr_t *bdaddr)
{
bacpy(&device.bdaddr, bdaddr);
@@ -137,6 +162,19 @@ static void device_cleanup(void)
device_set_state(HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED);
+ if (device.sco_watch) {
+ g_source_remove(device.sco_watch);
+ device.sco_watch = 0;
+ }
+
+ if (device.sco) {
+ g_io_channel_shutdown(device.sco, TRUE, NULL);
+ g_io_channel_unref(device.sco);
+ device.sco = NULL;
+ }
+
+ device_set_audio_state(HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED);
+
memset(&device, 0, sizeof(device));
}
@@ -739,6 +777,42 @@ failed:
HAL_OP_HANDSFREE_DISCONNECT, status);
}
+static gboolean sco_watch_cb(GIOChannel *chan, GIOCondition cond,
+ gpointer user_data)
+{
+ g_source_remove(device.sco_watch);
+ device.sco_watch = 0;
+
+ g_io_channel_shutdown(device.sco, TRUE, NULL);
+ g_io_channel_unref(device.sco);
+ device.sco = NULL;
+
+ device_set_audio_state(HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED);
+
+ return FALSE;
+}
+
+static void connect_sco_cb(GIOChannel *chan, GError *err, gpointer user_data)
+{
+ if (err) {
+ uint8_t status;
+
+ error("SCO: connect failed (%s)", err->message);
+ status = HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
+ device_set_audio_state(status);
+
+ return;
+ }
+
+ g_io_channel_set_close_on_unref(chan, TRUE);
+
+ device.sco = g_io_channel_ref(chan);
+ device.sco_watch = g_io_add_watch(chan, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
+ sco_watch_cb, NULL);
+
+ device_set_audio_state(HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED);
+}
+
static void handle_connect_audio(const void *buf, uint16_t len)
{
DBG("");
@@ -1044,6 +1118,46 @@ static sdp_record_t *headset_ag_record(void)
return record;
}
+static void confirm_sco_cb(GIOChannel *chan, gpointer user_data)
+{
+ char address[18];
+ bdaddr_t bdaddr;
+ GError *err = NULL;
+
+ if (device.sco)
+ goto drop;
+
+ bt_io_get(chan, &err,
+ BT_IO_OPT_DEST, address,
+ BT_IO_OPT_DEST_BDADDR, &bdaddr,
+ BT_IO_OPT_INVALID);
+ if (err) {
+ error("SCO: confirm failed (%s)", err->message);
+ g_error_free(err);
+ goto drop;
+ }
+
+ DBG("incoming SCO connection from %s", address);
+
+ if (device.state != HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED ||
+ bacmp(&device.bdaddr, &bdaddr)) {
+ error("SCO: connection from %s rejected", address);
+ goto drop;
+ }
+
+ if (!bt_io_accept(chan, connect_sco_cb, NULL, NULL, NULL)) {
+ error("SCO: failed to accept connection");
+ goto drop;
+ }
+
+ device_set_audio_state(HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTING);
+
+ return;
+
+drop:
+ g_io_channel_shutdown(chan, TRUE, NULL);
+}
+
static bool enable_hsp_ag(void)
{
sdp_record_t *rec;
@@ -1233,6 +1347,33 @@ static void cleanup_hfp_ag(void)
}
}
+static bool enable_sco_server(void)
+{
+ GError *err = NULL;
+
+ sco_server = bt_io_listen(NULL, confirm_sco_cb, NULL, NULL, &err,
+ BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
+ BT_IO_OPT_INVALID);
+ if (!sco_server) {
+ error("Failed to listen on SCO: %s", err->message);
+ g_error_free(err);
+ cleanup_hsp_ag();
+ cleanup_hfp_ag();
+ return false;
+ }
+
+ return true;
+}
+
+static void disable_sco_server(void)
+{
+ if (sco_server) {
+ g_io_channel_shutdown(sco_server, TRUE, NULL);
+ g_io_channel_unref(sco_server);
+ sco_server = NULL;
+ }
+}
+
bool bt_handsfree_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode)
{
DBG("mode 0x%x", mode);
@@ -1247,6 +1388,12 @@ bool bt_handsfree_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode)
return false;
}
+ if (!enable_sco_server()) {
+ cleanup_hsp_ag();
+ cleanup_hfp_ag();
+ return false;
+ }
+
hal_ipc = ipc;
ipc_register(hal_ipc, HAL_SERVICE_ID_HANDSFREE, cmd_handlers,
G_N_ELEMENTS(cmd_handlers));
@@ -1263,4 +1410,5 @@ void bt_handsfree_unregister(void)
cleanup_hfp_ag();
cleanup_hsp_ag();
+ disable_sco_server();
}
--
1.8.3.1
^ permalink raw reply related
* [PATCH 3/5] android/handsfree: Handle connect_audio call
From: Marcin Kraglak @ 2014-03-07 20:23 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1394223800-11961-1-git-send-email-marcin.kraglak@tieto.com>
This change handle connect_audio and start connect procedure.
---
android/handsfree.c | 43 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/android/handsfree.c b/android/handsfree.c
index 40f3652..a3c684e 100644
--- a/android/handsfree.c
+++ b/android/handsfree.c
@@ -813,12 +813,53 @@ static void connect_sco_cb(GIOChannel *chan, GError *err, gpointer user_data)
device_set_audio_state(HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED);
}
+static bool connect_sco(void)
+{
+ GIOChannel *io;
+ GError *gerr = NULL;
+
+ if (device.sco)
+ return false;
+
+ io = bt_io_connect(connect_sco_cb, NULL, NULL, &gerr,
+ BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
+ BT_IO_OPT_DEST_BDADDR, &device.bdaddr,
+ BT_IO_OPT_INVALID);
+
+ if (!io) {
+ error("SCO: unable to connect: %s", gerr->message);
+ g_error_free(gerr);
+ return false;
+ }
+
+ g_io_channel_unref(io);
+
+ device_set_audio_state(HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTING);
+
+ return true;
+}
+
static void handle_connect_audio(const void *buf, uint16_t len)
{
+ const struct hal_cmd_handsfree_connect_audio *cmd = buf;
+ bdaddr_t bdaddr;
+ uint8_t status;
+
DBG("");
+ android2bdaddr(cmd->bdaddr, &bdaddr);
+
+ if (device.audio_state != HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED ||
+ bacmp(&device.bdaddr, &bdaddr)) {
+ status = HAL_STATUS_FAILED;
+ goto done;
+ }
+
+ status = connect_sco() ? HAL_STATUS_SUCCESS : HAL_STATUS_FAILED;
+
+done:
ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
- HAL_OP_HANDSFREE_CONNECT_AUDIO, HAL_STATUS_FAILED);
+ HAL_OP_HANDSFREE_CONNECT_AUDIO, status);
}
static void handle_disconnect_audio(const void *buf, uint16_t len)
--
1.8.3.1
^ permalink raw reply related
* [PATCH 4/5] android/handsfree: Handle disconnect_audio call
From: Marcin Kraglak @ 2014-03-07 20:23 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1394223800-11961-1-git-send-email-marcin.kraglak@tieto.com>
This change adds handling of disconnect_audio call.
---
android/handsfree.c | 38 +++++++++++++++++++++++++++++++++++++-
1 file changed, 37 insertions(+), 1 deletion(-)
diff --git a/android/handsfree.c b/android/handsfree.c
index a3c684e..69de670 100644
--- a/android/handsfree.c
+++ b/android/handsfree.c
@@ -839,6 +839,27 @@ static bool connect_sco(void)
return true;
}
+static bool disconnect_sco(void)
+{
+ if (!device.sco)
+ return false;
+
+ device_set_audio_state(HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTING);
+
+ if (device.sco_watch) {
+ g_source_remove(device.sco_watch);
+ device.sco_watch = 0;
+ }
+
+ g_io_channel_shutdown(device.sco, TRUE, NULL);
+ g_io_channel_unref(device.sco);
+ device.sco = NULL;
+
+ device_set_audio_state(HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED);
+
+ return true;
+}
+
static void handle_connect_audio(const void *buf, uint16_t len)
{
const struct hal_cmd_handsfree_connect_audio *cmd = buf;
@@ -864,10 +885,25 @@ done:
static void handle_disconnect_audio(const void *buf, uint16_t len)
{
+ const struct hal_cmd_handsfree_disconnect_audio *cmd = buf;
+ bdaddr_t bdaddr;
+ uint8_t status;
+
DBG("");
+ android2bdaddr(cmd->bdaddr, &bdaddr);
+
+ if (device.audio_state != HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED ||
+ bacmp(&device.bdaddr, &bdaddr)) {
+ status = HAL_STATUS_FAILED;
+ goto done;
+ }
+
+ status = disconnect_sco() ? HAL_STATUS_SUCCESS : HAL_STATUS_FAILED;
+
+done:
ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
- HAL_OP_HANDSFREE_DISCONNECT_AUDIO, HAL_STATUS_FAILED);
+ HAL_OP_HANDSFREE_DISCONNECT_AUDIO, status);
}
static void handle_start_vr(const void *buf, uint16_t len)
--
1.8.3.1
^ permalink raw reply related
* [PATCH 5/5] android/handsfree: Remove empty line
From: Marcin Kraglak @ 2014-03-07 20:23 UTC (permalink / raw)
To: linux-bluetooth
In-Reply-To: <1394223800-11961-1-git-send-email-marcin.kraglak@tieto.com>
---
android/handsfree.c | 1 -
1 file changed, 1 deletion(-)
diff --git a/android/handsfree.c b/android/handsfree.c
index 69de670..1b42142 100644
--- a/android/handsfree.c
+++ b/android/handsfree.c
@@ -475,7 +475,6 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
hfp_gw_set_command_handler(device.gw, at_command_handler, NULL, NULL);
hfp_gw_set_disconnect_handler(device.gw, disconnect_watch, NULL, NULL);
-
if (device.hsp) {
register_post_slc_at();
device_set_state(HAL_EV_HANDSFREE_CONN_STATE_CONNECTED);
--
1.8.3.1
^ permalink raw reply related
* [PATCH] bdaddr: Add Marvell support
From: Petri Gynther @ 2014-03-07 22:28 UTC (permalink / raw)
To: linux-bluetooth
---
tools/bdaddr.c | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/tools/bdaddr.c b/tools/bdaddr.c
index e3ffa0e..ee9c01c 100644
--- a/tools/bdaddr.c
+++ b/tools/bdaddr.c
@@ -29,6 +29,7 @@
#include <errno.h>
#include <stdlib.h>
#include <getopt.h>
+#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -278,6 +279,30 @@ static int zeevo_write_bd_addr(int dd, bdaddr_t *bdaddr)
return 0;
}
+#define OCF_MRVL_WRITE_BD_ADDR 0x0022
+typedef struct {
+ uint8_t parameter_id;
+ uint8_t bdaddr_len;
+ bdaddr_t bdaddr;
+} __attribute__ ((packed)) mrvl_write_bd_addr_cp;
+
+static int mrvl_write_bd_addr(int dd, bdaddr_t *bdaddr)
+{
+ mrvl_write_bd_addr_cp cp;
+
+ memset(&cp, 0, sizeof(cp));
+ cp.parameter_id = 0xFE;
+ cp.bdaddr_len = 6;
+ bacpy(&cp.bdaddr, bdaddr);
+
+ if (hci_send_cmd(dd, OGF_VENDOR_CMD, OCF_MRVL_WRITE_BD_ADDR,
+ sizeof(cp), &cp) < 0)
+ return -1;
+
+ sleep(1);
+ return 0;
+}
+
static int st_write_bd_addr(int dd, bdaddr_t *bdaddr)
{
return ericsson_store_in_flash(dd, 0xfe, 6, (uint8_t *) bdaddr);
@@ -295,6 +320,7 @@ static struct {
{ 18, zeevo_write_bd_addr, NULL },
{ 48, st_write_bd_addr, generic_reset_device },
{ 57, ericsson_write_bd_addr, generic_reset_device },
+ { 72, mrvl_write_bd_addr, generic_reset_device },
{ 65535, NULL, NULL },
};
--
1.9.0.279.gdc9e3eb
^ permalink raw reply related
* [PATCH] bdaddr: Remove *_CP_SIZE defines
From: Petri Gynther @ 2014-03-07 22:55 UTC (permalink / raw)
To: linux-bluetooth
Remove *_CP_SIZE defines and use sizeof(cp) instead.
---
tools/bdaddr.c | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/tools/bdaddr.c b/tools/bdaddr.c
index ee9c01c..8356a8d 100644
--- a/tools/bdaddr.c
+++ b/tools/bdaddr.c
@@ -57,7 +57,6 @@ static int generic_reset_device(int dd)
typedef struct {
bdaddr_t bdaddr;
} __attribute__ ((packed)) ericsson_write_bd_addr_cp;
-#define ERICSSON_WRITE_BD_ADDR_CP_SIZE 6
static int ericsson_write_bd_addr(int dd, bdaddr_t *bdaddr)
{
@@ -71,7 +70,7 @@ static int ericsson_write_bd_addr(int dd, bdaddr_t *bdaddr)
rq.ogf = OGF_VENDOR_CMD;
rq.ocf = OCF_ERICSSON_WRITE_BD_ADDR;
rq.cparam = &cp;
- rq.clen = ERICSSON_WRITE_BD_ADDR_CP_SIZE;
+ rq.clen = sizeof(cp);
rq.rparam = NULL;
rq.rlen = 0;
@@ -87,7 +86,6 @@ typedef struct {
uint8_t flash_length;
uint8_t flash_data[253];
} __attribute__ ((packed)) ericsson_store_in_flash_cp;
-#define ERICSSON_STORE_IN_FLASH_CP_SIZE 255
static int ericsson_store_in_flash(int dd, uint8_t user_id, uint8_t flash_length, uint8_t *flash_data)
{
@@ -104,7 +102,7 @@ static int ericsson_store_in_flash(int dd, uint8_t user_id, uint8_t flash_length
rq.ogf = OGF_VENDOR_CMD;
rq.ocf = OCF_ERICSSON_STORE_IN_FLASH;
rq.cparam = &cp;
- rq.clen = ERICSSON_STORE_IN_FLASH_CP_SIZE;
+ rq.clen = sizeof(cp);
rq.rparam = NULL;
rq.rlen = 0;
@@ -199,7 +197,6 @@ static int csr_reset_device(int dd)
typedef struct {
bdaddr_t bdaddr;
} __attribute__ ((packed)) ti_write_bd_addr_cp;
-#define TI_WRITE_BD_ADDR_CP_SIZE 6
static int ti_write_bd_addr(int dd, bdaddr_t *bdaddr)
{
@@ -213,7 +210,7 @@ static int ti_write_bd_addr(int dd, bdaddr_t *bdaddr)
rq.ogf = OGF_VENDOR_CMD;
rq.ocf = OCF_TI_WRITE_BD_ADDR;
rq.cparam = &cp;
- rq.clen = TI_WRITE_BD_ADDR_CP_SIZE;
+ rq.clen = sizeof(cp);
rq.rparam = NULL;
rq.rlen = 0;
@@ -227,7 +224,6 @@ static int ti_write_bd_addr(int dd, bdaddr_t *bdaddr)
typedef struct {
bdaddr_t bdaddr;
} __attribute__ ((packed)) bcm_write_bd_addr_cp;
-#define BCM_WRITE_BD_ADDR_CP_SIZE 6
static int bcm_write_bd_addr(int dd, bdaddr_t *bdaddr)
{
@@ -241,7 +237,7 @@ static int bcm_write_bd_addr(int dd, bdaddr_t *bdaddr)
rq.ogf = OGF_VENDOR_CMD;
rq.ocf = OCF_BCM_WRITE_BD_ADDR;
rq.cparam = &cp;
- rq.clen = BCM_WRITE_BD_ADDR_CP_SIZE;
+ rq.clen = sizeof(cp);
rq.rparam = NULL;
rq.rlen = 0;
@@ -255,7 +251,6 @@ static int bcm_write_bd_addr(int dd, bdaddr_t *bdaddr)
typedef struct {
bdaddr_t bdaddr;
} __attribute__ ((packed)) zeevo_write_bd_addr_cp;
-#define ZEEVO_WRITE_BD_ADDR_CP_SIZE 6
static int zeevo_write_bd_addr(int dd, bdaddr_t *bdaddr)
{
@@ -269,7 +264,7 @@ static int zeevo_write_bd_addr(int dd, bdaddr_t *bdaddr)
rq.ogf = OGF_VENDOR_CMD;
rq.ocf = OCF_ZEEVO_WRITE_BD_ADDR;
rq.cparam = &cp;
- rq.clen = ZEEVO_WRITE_BD_ADDR_CP_SIZE;
+ rq.clen = sizeof(cp);
rq.rparam = NULL;
rq.rlen = 0;
--
1.9.0.279.gdc9e3eb
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox