Linux-Bluetooth Archive on lore.kernel.org
 help / color / Atom feed
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
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 --]

  reply index

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-04 17:15 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

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

Linux-Bluetooth Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-bluetooth/0 linux-bluetooth/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-bluetooth linux-bluetooth/ https://lore.kernel.org/linux-bluetooth \
		linux-bluetooth@vger.kernel.org
	public-inbox-index linux-bluetooth

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-bluetooth


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git