From: "Pali Rohár" <pali.rohar@gmail.com>
To: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Cc: "linux-bluetooth@vger.kernel.org"
<linux-bluetooth@vger.kernel.org>,
Johan Hedberg <johan.hedberg@gmail.com>,
Marcel Holtmann <marcel@holtmann.org>,
Pavel Machek <pavel@ucw.cz>
Subject: Re: HCI Set custom bandwidth for AuriStream SCO codec
Date: Sun, 19 May 2019 10:54:56 +0200 [thread overview]
Message-ID: <20190519085456.spa4nqkteic42u34@pali> (raw)
In-Reply-To: <CABBYNZJKO07p-8ufP7=4WUYS1oLhnsKY_pnP6-0SbVzi=CYZsQ@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 14702 bytes --]
On Sunday 19 May 2019 11:45:02 Luiz Augusto von Dentz wrote:
> Hi Pali,
>
> On Sun, May 19, 2019 at 11:23 AM Pali Rohár <pali.rohar@gmail.com> wrote:
> >
> > On Sunday 19 May 2019 11:16:00 Luiz Augusto von Dentz wrote:
> > > Hi Pali,
> > >
> > > On Thu, May 16, 2019 at 9:34 PM Pali Rohár <pali.rohar@gmail.com> wrote:
> > > >
> > > > Ping, can you comment anything related to hardcoded bandwidth?
> > > >
> > > > I would really like to take next step how to expose API for changing
> > > > bandwidth as linux kernel currently does not allow to receive and
> > > > transmit voice encoded by AuriStream codec.
> > >
> > > Didn't even know such codec existed, anyway that is not using the
> > > standard AT commands so it is kind hard to figure out how to set it up
> > > properly,
> >
> > Yes, AT+CSRSF is not standard AT command, but CSR extension. Also there
> > are e.g. more headsets which support Apple extensions to AT commands...
> > And Apple has public documentation for it.
> >
> > > to be honest, I would rather see WBS implementation finally
> > > reach PA before we start digging into this.
> >
> > First I want to finish improving A2DP codec support in pulseaudio. Later
> > I can look at HSP/HFP profiles. Ideally it should have modular/plugin
> > extensible design. So the aim is that adding new codec would be very
> > simple, without need to hack something related to mSBC/WBC, AuriStream
> > or any other codec.
>
> Well HSP don't have support for codec negotiation, but yes a modular
> design is probably recommended.
Agree.
> > But for AuriStream I need to set custom SCO parameters as described
> > below and currently kernel does not support it. This is why I'm asking
> > how kernel can export for userspace configuration of SCO parameters...
>
> We can always come up with socket options but we got to see the value
> it would bring
As wrote in previous emails, CSR SDK uses following HCI settings for
AuriStream:
syncPktTypes = 0x003F
bandwidth = 4000
max_latency = 16
voice_settings = 0x63
retx_effort = 2
And based on my experiments without setting bandwidth to 4000, connect()
syscall fails.
> since AuriStream don't look that popular among
> headsets, at least Ive never seem any device advertising it like
> apt-X, etc.
I have never seen advertised AuriStream codec too. I just wanted to
figure out what that mysterious AT+CSRSF means and figure out that it is
CSR's custom HFP codec.
Anyway, seems that there are lot of headsets with AuriStream codec. Put
AT+CSRSF=0,0,0,0,0,7 to google search and would get lot of results of
people who pasted bluetooth logs.
So implementation of AuriStream can be really useful as it is already
widely used.
> > > > On Monday 06 May 2019 17:16:51 Pali Rohár wrote:
> > > > > Ccing more people...
> > > > >
> > > > > do you have idea why for custom SCO HFP codec is needed to change
> > > > > Transmit and Receive bandwidth in HCI Setup Synchronous Connection
> > > > > packet?
> > > > >
> > > > > And how to expose API for userspace applications so they can change
> > > > > hardcoded kernel bandwidth? Why is there value 8000?
> > > > >
> > > > > Without changing hardcoded value 8000 to 4000 I'm unable to open SCO
> > > > > socket for AuriStream codec in HFP profile.
> > > > >
> > > > > On Saturday 04 May 2019 19:15:50 Pali Rohár wrote:
> > > > > > Hello,
> > > > > >
> > > > > > I found out that more bluetooth headsets supports AuriStream codec in
> > > > > > bluetooth HSP/HFP profile. It is proprietary CSR codec described as some
> > > > > > ADPCM variant with better quality as default CVSD codec.
> > > > > >
> > > > > > Headset announce their support by sending command AT+CSRSF, in sixth
> > > > > > number with first or second bit set (counted from zero). E.g.:
> > > > > >
> > > > > > AT+CSRSF=0,0,0,0,0,7
> > > > > >
> > > > > > Codec is then selected by host with sending:
> > > > > >
> > > > > > +CSRFN: (6,4)
> > > > > > OK
> > > > > >
> > > > > > And answer from headset is acknowledged by another:
> > > > > >
> > > > > > OK
> > > > > >
> > > > > >
> > > > > > Problem is that on Linux after issuing these AT commands I cannot longer
> > > > > > connect to SCO socket. connect() fails with Protocol Error.
> > > > > >
> > > > > > And in btmon is following error:
> > > > > >
> > > > > > > HCI Event: Synchronous Connect Complete (0x2c) plen 17
> > > > > > Status: Invalid LMP Parameters / Invalid LL Parameters (0x1e)
> > > > > >
> > > > > >
> > > > > > In some CSR SKD is example how to activate it and there is code which
> > > > > > seems to sets following HCI connection parameters:
> > > > > >
> > > > > > syncPktTypes = 0x003F
> > > > > > bandwidth = 4000
> > > > > > max_latency = 16
> > > > > > voice_settings = 0x63
> > > > > > retx_effort = 2
> > > > > >
> > > > > > I figured out that voice_settings can be configured via setsockopt()
> > > > > > SOL_BLUETOOTH + BT_VOICE. But for some unknown reason linux kernel
> > > > > > accept only two whitelisted values: 0x0003 and 0x0060.
> > > > > >
> > > > > > So I tried to set 0x0003 value (BT_VOICE_TRANSPARENT).
> > > > > >
> > > > > > In btmon I saw that kernel really changed "Air Coding Format" from CVSD
> > > > > > to Transparent, but I still got same "Invalid LMP Parameters" error.
> > > > > >
> > > > > > I tried to remove that whilelist from BT_VOICE option via patch below:
> > > > > >
> > > > > > diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
> > > > > > index 9a580999ca57..06db91de4f23 100644
> > > > > > --- a/net/bluetooth/sco.c
> > > > > > +++ b/net/bluetooth/sco.c
> > > > > > @@ -231,7 +231,7 @@ static int sco_connect(struct sock *sk)
> > > > > > else
> > > > > > type = SCO_LINK;
> > > > > >
> > > > > > - if (sco_pi(sk)->setting == BT_VOICE_TRANSPARENT &&
> > > > > > + if ((sco_pi(sk)->setting & SCO_AIRMODE_MASK) == SCO_AIRMODE_TRANSP &&
> > > > > > (!lmp_transp_capable(hdev) || !lmp_esco_capable(hdev))) {
> > > > > > err = -EOPNOTSUPP;
> > > > > > goto done;
> > > > > > @@ -836,13 +836,6 @@ static int sco_sock_setsockopt(struct socket *sock, int level, int optname,
> > > > > > break;
> > > > > > }
> > > > > >
> > > > > > - /* Explicitly check for these values */
> > > > > > - if (voice.setting != BT_VOICE_TRANSPARENT &&
> > > > > > - voice.setting != BT_VOICE_CVSD_16BIT) {
> > > > > > - err = -EINVAL;
> > > > > > - break;
> > > > > > - }
> > > > > > -
> > > > > > sco_pi(sk)->setting = voice.setting;
> > > > > > break;
> > > > > >
> > > > > >
> > > > > > Btmon now really showed Settings as 0x63, but still did not worked.
> > > > > > Again exactly same HCI error.
> > > > > >
> > > > > > Next I tried hacking linux kernel to customize packet type and max
> > > > > > latency. But even I changed these values I still got that HCI error.
> > > > > >
> > > > > > After I changed tx_bandwidth and rx_bandwidth to 4000 (as described in
> > > > > > above connection parameters), connect() syscall for that SCO socket
> > > > > > succeeded and I started getting voice microphone data on that socket.
> > > > > >
> > > > > > And it worked also with voice settings 0x0003 with active in-kernel
> > > > > > whitelist.
> > > > > >
> > > > > > Patch which is needed is following: Change bandwidth to 4000:
> > > > > >
> > > > > > diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
> > > > > > index bd4978ce8c45..2dd4d0412971 100644
> > > > > > --- a/net/bluetooth/hci_conn.c
> > > > > > +++ b/net/bluetooth/hci_conn.c
> > > > > > @@ -283,8 +283,8 @@ bool hci_setup_sync(struct hci_conn *conn, __u16 handle)
> > > > > >
> > > > > > cp.handle = cpu_to_le16(handle);
> > > > > >
> > > > > > - cp.tx_bandwidth = cpu_to_le32(0x00001f40);
> > > > > > - cp.rx_bandwidth = cpu_to_le32(0x00001f40);
> > > > > > + cp.tx_bandwidth = cpu_to_le32(4000);
> > > > > > + cp.rx_bandwidth = cpu_to_le32(4000);
> > > > > > cp.voice_setting = cpu_to_le16(conn->setting);
> > > > > >
> > > > > > switch (conn->setting & SCO_AIRMODE_MASK) {
> > > > > >
> > > > > > I have really no idea what it does with headset. But without this patch
> > > > > > I'm not able to switch HSP codec from CVSD to AuriStream.
> > > > > >
> > > > > > Is somebody able to explain how above change can allow opening SCO
> > > > > > socket?
> > > > > >
> > > > > > Because without it I'm not able to activate AuriStream codec, could you
> > > > > > consider allowing userspace (via some setsockoptň to change bandwidth?
> > > > > > Because now it is hardcoded in kernel source code.
> > > > > >
> > > > > > For more details here is btmon output with default bandwidth which is
> > > > > > failing:
> > > > > >
> > > > > > $ sudo ./monitor/btmon
> > > > > > Bluetooth monitor ver 5.50
> > > > > > = Note: Linux version 4.9.0-9-amd64 (x86_64)
> > > > > > = Note: Bluetooth subsystem version 2.22
> > > > > > = New Index: XX:XX:XX:XX:XX:XX (Primary,USB,hci0)
> > > > > > = Open Index: XX:XX:XX:XX:XX:XX
> > > > > > = Index Info: XX:XX:XX:XX:XX:XX (Intel Corp.)
> > > > > > @ MGMT Open: bluetoothd (privileged) version 1.14
> > > > > > @ MGMT Open: btmon (privileged) version 1.14
> > > > > > < HCI Command: Setup Synchronous Connection (0x01|0x0028) plen 17
> > > > > > Handle: 34
> > > > > > Transmit bandwidth: 8000
> > > > > > Receive bandwidth: 8000
> > > > > > Max latency: 13
> > > > > > Setting: 0x0003
> > > > > > Input Coding: Linear
> > > > > > Input Data Format: 1's complement
> > > > > > Input Sample Size: 8-bit
> > > > > > # of bits padding at MSB: 0
> > > > > > Air Coding Format: Transparent Data
> > > > > > Retransmission effort: Optimize for link quality (0x02)
> > > > > > Packet type: 0x0380
> > > > > > 3-EV3 may not be used
> > > > > > 2-EV5 may not be used
> > > > > > 3-EV5 may not be used
> > > > > > > HCI Event: Command Status (0x0f) plen 4
> > > > > > Setup Synchronous Connection (0x01|0x0028) ncmd 1
> > > > > > Status: Success (0x00)
> > > > > > > HCI Event: Max Slots Change (0x1b) plen 3
> > > > > > Handle: 34
> > > > > > Max slots: 1
> > > > > > > HCI Event: Synchronous Connect Complete (0x2c) plen 17
> > > > > > Status: Invalid LMP Parameters / Invalid LL Parameters (0x1e)
> > > > > > Handle: 34
> > > > > > Address: XX:XX:XX:XX:XX:XX (Creative Technology, Ltd.)
> > > > > > Link type: eSCO (0x02)
> > > > > > Transmission interval: 0x00
> > > > > > Retransmission window: 0x00
> > > > > > RX packet length: 0
> > > > > > TX packet length: 0
> > > > > > Air mode: u-law log (0x00)
> > > > > > > HCI Event: Max Slots Change (0x1b) plen 3
> > > > > > Handle: 34
> > > > > > Max slots: 5
> > > > > >
> > > > > > And here is btmon output with above kernel patch which changes bandwidth to 4000:
> > > > > >
> > > > > > $ sudo ./monitor/btmon
> > > > > > Bluetooth monitor ver 5.50
> > > > > > = Note: Linux version 4.9.0-9-amd64 (x86_64)
> > > > > > = Note: Bluetooth subsystem version 2.22
> > > > > > = New Index: XX:XX:XX:XX:XX:XX (Primary,USB,hci0)
> > > > > > = Open Index: XX:XX:XX:XX:XX:XX
> > > > > > = Index Info: XX:XX:XX:XX:XX:XX (Intel Corp.)
> > > > > > @ MGMT Open: bluetoothd (privileged) version 1.14
> > > > > > @ MGMT Open: btmon (privileged) version 1.14
> > > > > > < HCI Command: Setup Synchronous Connection (0x01|0x0028) plen 17
> > > > > > Handle: 34
> > > > > > Transmit bandwidth: 4000
> > > > > > Receive bandwidth: 4000
> > > > > > Max latency: 13
> > > > > > Setting: 0x0003
> > > > > > Input Coding: Linear
> > > > > > Input Data Format: 1's complement
> > > > > > Input Sample Size: 8-bit
> > > > > > # of bits padding at MSB: 0
> > > > > > Air Coding Format: Transparent Data
> > > > > > Retransmission effort: Optimize for link quality (0x02)
> > > > > > Packet type: 0x0380
> > > > > > 3-EV3 may not be used
> > > > > > 2-EV5 may not be used
> > > > > > 3-EV5 may not be used
> > > > > > > HCI Event: Command Status (0x0f) plen 4
> > > > > > Setup Synchronous Connection (0x01|0x0028) ncmd 1
> > > > > > Status: Success (0x00)
> > > > > > > HCI Event: Max Slots Change (0x1b) plen 3
> > > > > > Handle: 34
> > > > > > Max slots: 1
> > > > > > > HCI Event: Synchronous Connect Complete (0x2c) plen 17
> > > > > > Status: Success (0x00)
> > > > > > Handle: 38
> > > > > > Address: XX:XX:XX:XX:XX:XX (Creative Technology, Ltd.)
> > > > > > Link type: eSCO (0x02)
> > > > > > Transmission interval: 0x10
> > > > > > Retransmission window: 0x02
> > > > > > RX packet length: 40
> > > > > > TX packet length: 40
> > > > > > Air mode: Transparent (0x03)
> > > > > > < SCO Data TX: Handle 38 flags 0x00 dlen 48
> > > > > > < ACL Data TX: Handle 34 flags 0x00 dlen 18
> > > > > > Channel: 105 len 14 [PSM 0 mode 0] {chan 0}
> > > > > > 61 ef 15 0d 0a 2b 56 47 4d 3d 34 0d 0a d4 a....+VGM=4...
> > > > > > > HCI Event: Number of Completed Packets (0x13) plen 5
> > > > > > Num handles: 1
> > > > > > Handle: 34
> > > > > > Count: 1
> > > > > > > SCO Data RX: Handle 38 flags 0x00 dlen 24
> > > > > > > SCO Data RX: Handle 38 flags 0x00 dlen 24
> > > > > > > SCO Data RX: Handle 38 flags 0x00 dlen 24
> > > > > > < SCO Data TX: Handle 38 flags 0x00 dlen 48
> > > > > > > HCI Event: Max Slots Change (0x1b) plen 3
> > > > > > Handle: 34
> > > > > > Max slots: 5
> > > > > >
> > > > > > ... and SCO data are coming on SCO socket.
> > > > > >
> > > > >
> > > >
> > > > --
> > > > Pali Rohár
> > > > pali.rohar@gmail.com
> > >
> > >
> > >
> >
> > --
> > Pali Rohár
> > pali.rohar@gmail.com
--
Pali Rohár
pali.rohar@gmail.com
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
next prev parent reply other threads:[~2019-05-19 17:34 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-04 17:15 HCI Set custom bandwidth for AuriStream SCO codec Pali Rohár
2019-05-06 15:16 ` Pali Rohár
2019-05-16 18:34 ` Pali Rohár
2019-05-19 8:16 ` Luiz Augusto von Dentz
2019-05-19 8:23 ` Pali Rohár
2019-05-19 8:45 ` Luiz Augusto von Dentz
2019-05-19 8:54 ` Pali Rohár [this message]
2019-05-19 21:21 ` Pavel Machek
2019-06-07 13:02 ` Pali Rohár
2019-06-07 15:19 ` Luiz Augusto von Dentz
2019-07-06 13:45 ` Marcel Holtmann
2019-07-08 12:25 ` Pali Rohár
2019-07-08 13:23 ` Marcel Holtmann
2019-07-08 21:06 ` Pali Rohár
2019-07-12 18:59 ` Marcel Holtmann
2019-07-18 10:09 ` Pali Rohár
2019-07-18 20:06 ` Marcel Holtmann
2019-11-21 23:00 ` Pali Rohár
2019-11-24 11:02 ` Marcel Holtmann
2019-10-27 22:09 ` Pali Rohár
2019-11-12 21:06 ` Pavel Machek
2019-11-13 9:22 ` Pali Rohár
2019-11-21 22:47 ` Pali Rohár
2019-11-19 17:04 ` Marcel Holtmann
2019-11-19 17:13 ` Pali Rohár
2019-11-19 23:47 ` Marcel Holtmann
2019-11-20 7:44 ` Pali Rohár
2019-11-21 22:44 ` Pali Rohár
2019-11-24 11:04 ` Marcel Holtmann
2019-11-24 11:13 ` Pali Rohár
2019-11-26 7:24 ` Marcel Holtmann
2019-11-26 7:46 ` Pali Rohár
2019-11-26 7:58 ` Marcel Holtmann
2019-11-26 8:00 ` Pali Rohár
2019-11-26 9:41 ` Luiz Augusto von Dentz
2019-11-26 9:58 ` Pali Rohár
2019-12-05 9:28 ` Pali Rohár
2019-12-11 14:40 ` Pali Rohár
2020-01-04 10:04 ` Marcel Holtmann
2020-01-04 10:37 ` Pali Rohár
2020-02-09 12:59 ` Pali Rohár
2020-02-19 12:09 ` David Heidelberg
2020-04-19 23:49 ` Bluetooth: Allow to use configure SCO socket codec parameters Pali Rohár
2020-04-20 23:54 ` Luiz Augusto von Dentz
2020-04-21 8:53 ` Pali Rohár
2020-05-14 19:49 ` Aleksandar Kostadinov
2020-05-15 22:46 ` Andrew Fuller
2020-05-15 23:08 ` Luiz Augusto von Dentz
2020-05-16 7:50 ` Aleksandar Kostadinov
2020-05-16 7:53 ` Pali Rohár
2020-05-18 16:43 ` Luiz Augusto von Dentz
2020-05-18 16:50 ` Pali Rohár
2020-05-27 12:18 ` Ujjwal Sharma
2020-05-27 15:48 ` Luiz Augusto von Dentz
2020-05-27 16:24 ` Ujjwal Sharma
2020-06-04 20:43 ` Pali Rohár
2020-07-13 16:46 ` Pasi Kärkkäinen
2020-09-29 21:04 ` Pali Rohár
2020-10-26 11:45 ` Joschi 127
2020-10-27 23:45 ` Paul Stejskal
2020-10-28 20:25 ` Joschi 127
2020-11-03 12:10 ` Joschi 127
2020-11-03 12:18 ` Pali Rohár
2020-11-03 12:43 ` Jan-Philipp Litza
2020-11-04 0:37 ` Luiz Augusto von Dentz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190519085456.spa4nqkteic42u34@pali \
--to=pali.rohar@gmail.com \
--cc=johan.hedberg@gmail.com \
--cc=linux-bluetooth@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
--cc=marcel@holtmann.org \
--cc=pavel@ucw.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).