[meta-freescale] [PATCH 52/52] bluez5: Add patches to support Tufello 1.1 SoC

Tom Hochstein tom.hochstein at nxp.com
Mon Jul 30 12:44:11 PDT 2018


Signed-off-by: Tom Hochstein <tom.hochstein at nxp.com>
---
 recipes-connectivity/bluez5/bluez5_5.%.bbappend    |  15 +-
 .../0004-Add-support-for-Tufello-1.1-SOC.patch     | 120 ++++++++
 ...bluetooth-Add-support-for-multi-baud-rate.patch | 335 +++++++++++++++++++++
 3 files changed, 460 insertions(+), 10 deletions(-)
 create mode 100644 recipes-connectivity/bluez5/files/0004-Add-support-for-Tufello-1.1-SOC.patch
 create mode 100644 recipes-connectivity/bluez5/files/0005-bluetooth-Add-support-for-multi-baud-rate.patch

diff --git a/recipes-connectivity/bluez5/bluez5_5.%.bbappend b/recipes-connectivity/bluez5/bluez5_5.%.bbappend
index 00eb248..d4eaf74 100644
--- a/recipes-connectivity/bluez5/bluez5_5.%.bbappend
+++ b/recipes-connectivity/bluez5/bluez5_5.%.bbappend
@@ -1,14 +1,9 @@
 FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
 
-# Do not start the service during system boot up
-INITSCRIPT_PARAMS_${PN} = "stop 20 0 1 6 ."
-
-# Add patch for module bcm43xx
-# Add patches for QCA modules with Qca6174 and Qca9377-3 chips
 SRC_URI += " \
-            file://0001-bluetooth-Add-bluetooth-support-for-QCA6174-chip.patch \
-            file://0002-hciattach-set-flag-to-enable-HCI-reset-on-init.patch \
-            file://0003-hciattach-instead-of-strlcpy-with-strncpy-to-avoid-r.patch \
-            file://0004-Add-support-for-Tufello-1.1-SOC.patch \
-            file://0005-bluetooth-Add-support-for-multi-baud-rate.patch \
+    file://0001-bluetooth-Add-bluetooth-support-for-QCA6174-chip.patch \
+    file://0002-hciattach-set-flag-to-enable-HCI-reset-on-init.patch \
+    file://0003-hciattach-instead-of-strlcpy-with-strncpy-to-avoid-r.patch \
+    file://0004-Add-support-for-Tufello-1.1-SOC.patch \
+    file://0005-bluetooth-Add-support-for-multi-baud-rate.patch \
 "
diff --git a/recipes-connectivity/bluez5/files/0004-Add-support-for-Tufello-1.1-SOC.patch b/recipes-connectivity/bluez5/files/0004-Add-support-for-Tufello-1.1-SOC.patch
new file mode 100644
index 0000000..0760703
--- /dev/null
+++ b/recipes-connectivity/bluez5/files/0004-Add-support-for-Tufello-1.1-SOC.patch
@@ -0,0 +1,120 @@
+From beceec239b241e4b091e26bdb53e53b3ffba5a8b Mon Sep 17 00:00:00 2001
+From: Fugang Duan <fugang.duan at nxp.com>
+Date: Mon, 4 Sep 2017 19:01:19 +0800
+Subject: [PATCH 4/5] Add support for Tufello 1.1 SOC
+
+Enable mechanism to download firmware for Tufello 1.1 SOC.
+Also, use correct firmware file path for Tufello 1.0.
+
+Change-Id: I915e48023e45de9e2550336a3de9a07f2b788189
+Signed-off-by: Rupesh Tatiya <rtatiya at codeaurora.org>
+Signed-off-by: Fugang Duan <fugang.duan at nxp.com>
+
+(merge the patch into NXP bluez v5.41)
+---
+ tools/hciattach_rome.c | 14 ++++++++++----
+ tools/hciattach_rome.h | 17 ++++++++++++++---
+ 2 files changed, 24 insertions(+), 7 deletions(-)
+
+diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c
+index c3e9fde..188bcc1 100644
+--- a/tools/hciattach_rome.c
++++ b/tools/hciattach_rome.c
+@@ -1123,6 +1123,7 @@ int rome_tlv_dnld_req(int fd, int tlv_size)
+ {
+     int  total_segment, remain_size, i, err = -1;
+     unsigned char wait_cc_evt = FALSE;
++    unsigned int rom = rome_ver >> 16;
+ 
+     total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT;
+     remain_size = (tlv_size < MAX_SIZE_PER_TLV_SEGMENT)?\
+@@ -1163,14 +1164,15 @@ int rome_tlv_dnld_req(int fd, int tlv_size)
+ 
+     for(i = 0; i < total_segment; i++) {
+         if((i+1) == total_segment) {
+-             if ((rome_ver >= ROME_VER_1_1) && (rome_ver < ROME_VER_3_2) &&
++             if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) &&
+                  (gTlv_type == TLV_TYPE_PATCH)) {
+                /* If the Rome version is from 1.1 to 3.1
+                 * 1. No CCE for the last command segment but all other segment
+                 * 2. All the command segments get VSE including the last one
+                 */
+                 wait_cc_evt = !remain_size ? FALSE: TRUE;
+-             } else if ((rome_ver == ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) {
++             } else if ((rom == ROME_PATCH_VER_0302) &&
++                             (gTlv_type == TLV_TYPE_PATCH)) {
+                 /* If the Rome version is 3.2
+                  * 1. None of the command segments receive CCE
+                  * 2. No command segments receive VSE except the last one
+@@ -1189,13 +1191,14 @@ int rome_tlv_dnld_req(int fd, int tlv_size)
+             goto error;
+     }
+ 
+-    if ((rome_ver >= ROME_VER_1_1) && (rome_ver < ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) {
++    if ((rom >= ROME_PATCH_VER_0100) && (rom < ROME_PATCH_VER_0302) &&
++                                               (gTlv_type == TLV_TYPE_PATCH)) {
+        /* If the Rome version is from 1.1 to 3.1
+         * 1. No CCE for the last command segment but all other segment
+         * 2. All the command segments get VSE including the last one
+         */
+         wait_cc_evt = remain_size ? FALSE: TRUE;
+-    } else if ((rome_ver == ROME_VER_3_2) && (gTlv_type == TLV_TYPE_PATCH)) {
++    } else if ((rom == ROME_PATCH_VER_0302) && (gTlv_type == TLV_TYPE_PATCH)) {
+         /* If the Rome version is 3.2
+          * 1. None of the command segments receive CCE
+          * 2. No command segments receive VSE except the last one
+@@ -1818,6 +1821,9 @@ int qca_soc_init(int fd, char *bdaddr)
+         case TUFELLO_VER_1_0:
+             rampatch_file_path = TF_RAMPATCH_TLV_1_0_0_PATH;
+             nvm_file_path = TF_NVM_TLV_1_0_0_PATH;
++        case TUFELLO_VER_1_1:
++            rampatch_file_path = TF_RAMPATCH_TLV_1_0_1_PATH;
++            nvm_file_path = TF_NVM_TLV_1_0_1_PATH;
+ 
+ download:
+             /* Change baud rate 115.2 kbps to 3Mbps*/
+diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h
+index 9770d0b..917af55 100644
+--- a/tools/hciattach_rome.h
++++ b/tools/hciattach_rome.h
+@@ -230,8 +230,17 @@ typedef struct
+ #define ROME_NVM_TLV_3_0_0_PATH         "/lib/firmware/nvm_tlv_3.0.bin"
+ #define ROME_RAMPATCH_TLV_3_0_2_PATH    "/lib/firmware/rampatch_tlv_3.2.tlv"
+ #define ROME_NVM_TLV_3_0_2_PATH         "/lib/firmware/nvm_tlv_3.2.bin"
+-#define TF_RAMPATCH_TLV_1_0_0_PATH    "/lib/firmware/rampatch_tlv_tf_1.0.tlv"
+-#define TF_NVM_TLV_1_0_0_PATH         "/lib/firmware/nvm_tlv_tf_1.0.bin"
++#ifdef _PLATFORM_MDM_
++#define TF_RAMPATCH_TLV_1_0_0_PATH      "/lib/firmware/rampatch_tlv_tf_1.0.tlv"
++#define TF_NVM_TLV_1_0_0_PATH           "/lib/firmware/nvm_tlv_tf_1.0.bin"
++#define TF_RAMPATCH_TLV_1_0_1_PATH      "/lib/firmware/tfbtfw11.tlv"
++#define TF_NVM_TLV_1_0_1_PATH           "/lib/firmware/tfbtnv11.bin"
++#else
++#define TF_RAMPATCH_TLV_1_0_0_PATH      "/lib/firmware/qca/rampatch_tlv_tf_1.0.tlv"
++#define TF_NVM_TLV_1_0_0_PATH           "/lib/firmware/qca/nvm_tlv_tf_1.0.bin"
++#define TF_RAMPATCH_TLV_1_0_1_PATH      "/lib/firmware/qca/tfbtfw11.tlv"
++#define TF_NVM_TLV_1_0_1_PATH           "/lib/firmware/qca/tfbtnv11.bin"
++#endif
+ 
+ /* This header value in rampatch file decides event handling mechanism in the HOST */
+ #define ROME_SKIP_EVT_NONE     0x00
+@@ -349,6 +358,7 @@ enum{
+     ROME_SOC_ID_11 = 0x00000011,
+     ROME_SOC_ID_13 = 0x00000013,
+     ROME_SOC_ID_22 = 0x00000022,
++    ROME_SOC_ID_23 = 0x00000023,
+     ROME_SOC_ID_44 = 0x00000044
+ };
+ 
+@@ -360,7 +370,8 @@ enum{
+     ROME_VER_2_1 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_11 ),
+     ROME_VER_3_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_22 ),
+     ROME_VER_3_2 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_44 ),
+-    TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 )
++    TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 ),
++    TUFELLO_VER_1_1 = ((ROME_PATCH_VER_0302 << 16 ) | ROME_SOC_ID_23 ),
+ };
+ 
+ #ifdef USE_GLIB
+-- 
+1.9.1
+
diff --git a/recipes-connectivity/bluez5/files/0005-bluetooth-Add-support-for-multi-baud-rate.patch b/recipes-connectivity/bluez5/files/0005-bluetooth-Add-support-for-multi-baud-rate.patch
new file mode 100644
index 0000000..c635cd3
--- /dev/null
+++ b/recipes-connectivity/bluez5/files/0005-bluetooth-Add-support-for-multi-baud-rate.patch
@@ -0,0 +1,335 @@
+From 82348c8235b9935d0d3b0715908ec66db0ef7a75 Mon Sep 17 00:00:00 2001
+From: "aifeng.wang" <aifeng.wang at murata.com>
+Date: Tue, 5 Sep 2017 17:22:48 +0800
+Subject: [PATCH 5/5] bluetooth: Add support for multi baud rate
+
+Currently BT operates only at 3M baud rate. Provide option
+to configure the pre-defined baud rate values as supported by the
+target platform.
+(based on CAF commit:f7a564dd593b1ba29a3395e1078ac180e4a02ed3)
+---
+ tools/hciattach.c      |  58 +++++++++++++++++++++++++-
+ tools/hciattach.h      |   2 +-
+ tools/hciattach_rome.c | 109 ++++++++++++++++++++++++++++++++++++++++++-------
+ tools/hciattach_rome.h |  23 +++++++++++
+ 4 files changed, 176 insertions(+), 16 deletions(-)
+
+diff --git a/tools/hciattach.c b/tools/hciattach.c
+old mode 100644
+new mode 100755
+index d03ed46..d64601e
+--- a/tools/hciattach.c
++++ b/tools/hciattach.c
+@@ -88,6 +88,62 @@ static void sig_alarm(int sig)
+ 	exit(1);
+ }
+ 
++int uart_speed(int s)
++{
++	switch (s) {
++	case 9600:
++		return B9600;
++	case 19200:
++		return B19200;
++	case 38400:
++		return B38400;
++	case 57600:
++		return B57600;
++	case 115200:
++		return B115200;
++	case 230400:
++		return B230400;
++	case 460800:
++		return B460800;
++	case 500000:
++		return B500000;
++	case 576000:
++		return B576000;
++	case 921600:
++		return B921600;
++	case 1000000:
++		return B1000000;
++	case 1152000:
++		return B1152000;
++	case 1500000:
++		return B1500000;
++	case 2000000:
++		return B2000000;
++#ifdef B2500000
++	case 2500000:
++		return B2500000;
++#endif
++#ifdef B3000000
++	case 3000000:
++		return B3000000;
++#endif
++#ifdef B3500000
++	case 3500000:
++		return B3500000;
++#endif
++#ifdef B3710000
++	case 3710000
++		return B3710000;
++#endif
++#ifdef B4000000
++	case 4000000:
++		return B4000000;
++#endif
++	default:
++		return B57600;
++	}
++}
++
+ int set_speed(int fd, struct termios *ti, int speed)
+ {
+ 	if (cfsetospeed(ti, tty_get_speed(speed)) < 0)
+@@ -268,7 +324,7 @@ static int ath3k_pm(int fd, struct uart_t *u, struct termios *ti)
+ static int qca(int fd, struct uart_t *u, struct termios *ti)
+ {
+         fprintf(stderr,"qca\n");
+-        return qca_soc_init(fd, u->bdaddr);
++        return qca_soc_init(fd, u->speed, u->bdaddr);
+ }
+ 
+ static int qualcomm(int fd, struct uart_t *u, struct termios *ti)
+diff --git a/tools/hciattach.h b/tools/hciattach.h
+old mode 100644
+new mode 100755
+index 59efa31..626e2a0
+--- a/tools/hciattach.h
++++ b/tools/hciattach.h
+@@ -66,7 +66,7 @@ int bgb2xx_init(int dd, bdaddr_t *bdaddr);
+ int ath3k_init(int fd, int speed, int init_speed, char *bdaddr,
+ 						struct termios *ti);
+ int ath3k_post(int fd, int pm);
+-int qca_soc_init(int fd, char *bdaddr);
++int qca_soc_init(int fd, int speed, char *bdaddr);
+ int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr);
+ int intel_init(int fd, int init_speed, int *speed, struct termios *ti);
+ int bcm43xx_init(int fd, int def_speed, int speed, struct termios *ti,
+diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c
+old mode 100644
+new mode 100755
+index 188bcc1..fc843f6
+--- a/tools/hciattach_rome.c
++++ b/tools/hciattach_rome.c
+@@ -1574,7 +1574,7 @@ static void flow_control(int fd, int opt)
+ }
+ 
+ 
+-int rome_set_baudrate_req(int fd)
++int rome_set_baudrate_req(int fd, int local_baud_rate, int controller_baud_rate)
+ {
+    int size, err = 0;
+     unsigned char cmd[HCI_MAX_CMD_SIZE];
+@@ -1588,7 +1588,7 @@ int rome_set_baudrate_req(int fd)
+     cmd[0]  = HCI_COMMAND_PKT;
+     cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, EDL_SET_BAUDRATE_CMD_OCF);
+     cmd_hdr->plen     = VSC_SET_BAUDRATE_REQ_LEN;
+-    cmd[4]  = BAUDRATE_3000000;
++    cmd[4]  = controller_baud_rate;
+ 
+     /* Total length of the packet to be sent to the Controller */
+     size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN);
+@@ -1604,7 +1604,7 @@ int rome_set_baudrate_req(int fd)
+         goto error;
+     }
+     /* Change Local UART baudrate to high speed UART */
+-    userial_vendor_set_baud(USERIAL_BAUD_3M);
++    userial_vendor_set_baud(local_baud_rate);
+ 
+     /* Flow on after changing local uart baudrate */
+     flow_control(fd, MSM_ENABLE_FLOW_CTRL);
+@@ -1630,7 +1630,7 @@ error:
+ }
+ 
+ 
+-int rome_hci_reset_req(int fd)
++int rome_hci_reset_req(int fd, char baud)
+ {
+     int size, err = 0;
+     unsigned char cmd[HCI_MAX_CMD_SIZE];
+@@ -1662,7 +1662,7 @@ int rome_hci_reset_req(int fd)
+     }
+ 
+     /* Change Local UART baudrate to high speed UART */
+-     userial_vendor_set_baud(USERIAL_BAUD_3M);
++     userial_vendor_set_baud(baud);
+ 
+     /* Flow on after changing local uart baudrate */
+     flow_control(fd, MSM_ENABLE_FLOW_CTRL);
+@@ -1728,10 +1728,69 @@ int read_bd_address(unsigned char *bdaddr)
+   return 0;
+ }
+ 
+-int qca_soc_init(int fd, char *bdaddr)
++int isSpeedValid(int speed, int *local_baud_rate, int *controller_baud_rate)
++{
++    switch(speed) {
++    case 9600:
++        *local_baud_rate = USERIAL_BAUD_9600;
++        *controller_baud_rate = BAUDRATE_9600;
++        break;
++    case 19200:
++        *local_baud_rate = USERIAL_BAUD_19200;
++        *controller_baud_rate = BAUDRATE_19200;
++        break;
++    case 57600:
++        *local_baud_rate = USERIAL_BAUD_57600;
++        *controller_baud_rate = BAUDRATE_57600;
++        break;
++    case 115200:
++        *local_baud_rate = USERIAL_BAUD_115200;
++        *controller_baud_rate = BAUDRATE_115200;
++        break;
++    case 230400:
++        *local_baud_rate = USERIAL_BAUD_230400;
++        *controller_baud_rate = BAUDRATE_230400;
++        break;
++    case 460800:
++        *local_baud_rate = USERIAL_BAUD_460800;
++        *controller_baud_rate = BAUDRATE_460800;
++        break;
++    case 921600:
++        *local_baud_rate = USERIAL_BAUD_921600;
++        *controller_baud_rate = BAUDRATE_921600;
++        break;
++    case 1000000:
++        *local_baud_rate = USERIAL_BAUD_1M;
++        *controller_baud_rate = BAUDRATE_1000000;
++        break;
++    case 2000000:
++        *local_baud_rate = USERIAL_BAUD_2M;
++        *controller_baud_rate = BAUDRATE_2000000;
++        break;
++    case 3000000:
++        *local_baud_rate = USERIAL_BAUD_3M;
++        *controller_baud_rate = BAUDRATE_3000000;
++        break;
++    case 4000000:
++        *local_baud_rate = USERIAL_BAUD_4M;
++        *controller_baud_rate = BAUDRATE_4000000;
++        break;
++    case 300:
++    case 600:
++    case 1200:
++    case 2400:
++    default:
++        fprintf(stderr, "Invalid baud rate passed!\n");
++        *local_baud_rate = *controller_baud_rate = -1;
++        break;
++    }
++    return -1;
++}
++
++int qca_soc_init(int fd, int speed, char *bdaddr)
+ {
+     int err = -1;
+-    int size;
++    int size, local_baud_rate = 0, controller_baud_rate = 0;
+ 
+     vnd_userial.fd = fd;
+ 
+@@ -1789,7 +1848,7 @@ int qca_soc_init(int fd, char *bdaddr)
+                 }
+ 
+                 /* Change baud rate 115.2 kbps to 3Mbps*/
+-                err = rome_hci_reset_req(fd);
++                err = rome_hci_reset_req(fd, local_baud_rate);
+                 if ( err <0 ) {
+                     fprintf(stderr, "HCI Reset Failed !!\n");
+                     goto error;
+@@ -1821,17 +1880,30 @@ int qca_soc_init(int fd, char *bdaddr)
+         case TUFELLO_VER_1_0:
+             rampatch_file_path = TF_RAMPATCH_TLV_1_0_0_PATH;
+             nvm_file_path = TF_NVM_TLV_1_0_0_PATH;
++            goto download;
+         case TUFELLO_VER_1_1:
+             rampatch_file_path = TF_RAMPATCH_TLV_1_0_1_PATH;
+             nvm_file_path = TF_NVM_TLV_1_0_1_PATH;
+ 
+ download:
+-            /* Change baud rate 115.2 kbps to 3Mbps*/
+-            err = rome_set_baudrate_req(fd);
+-            if (err < 0) {
+-                fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__);
+-                goto error;
++            /* Check if user requested for 115200 kbps */
++            if (speed == 115200) {
++                local_baud_rate = USERIAL_BAUD_115200;
++                controller_baud_rate = BAUDRATE_115200;
+             }
++            else {
++                /* Change only if baud rate requested is valid or not */
++                isSpeedValid(speed, &local_baud_rate, &controller_baud_rate);
++                if (local_baud_rate < 0 || controller_baud_rate < 0) {
++                    err = -1;
++                    goto error;
++                }
++                err = rome_set_baudrate_req(fd, local_baud_rate, controller_baud_rate);
++                if (err < 0) {
++                    fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__);
++                   goto error;
++                }
++             }
+             fprintf(stderr, "%s: Baud rate changed successfully \n", __FUNCTION__);
+ 
+             /* Donwload TLV files (rampatch, NVM) */
+@@ -1842,8 +1914,17 @@ download:
+             }
+             fprintf(stderr, "%s: Download TLV file successfully \n", __FUNCTION__);
+ 
++            /*
++             * Overriding the baud rate value in NVM file with the user
++             * requested baud rate, since default baud rate in NVM file is 3M.
++             */
++            err = rome_set_baudrate_req(fd, local_baud_rate, controller_baud_rate);
++            if (err < 0) {
++                fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__);
++                goto error;
++            }
+             /* Perform HCI reset here*/
+-            err = rome_hci_reset_req(fd);
++            err = rome_hci_reset_req(fd, local_baud_rate);
+             if ( err <0 ) {
+                 fprintf(stderr, "HCI Reset Failed !!!\n");
+                 goto error;
+diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h
+old mode 100644
+new mode 100755
+index 917af55..62f2ac0
+--- a/tools/hciattach_rome.h
++++ b/tools/hciattach_rome.h
+@@ -83,6 +83,29 @@ typedef struct
+ #define USERIAL_BAUD_4M         15
+ #define USERIAL_BAUD_AUTO       16
+ 
++/* Vendor specific baud rate values */
++#define UART_Baud_Rate_Baud_9600        4
++#define UART_Baud_Rate_Baud_19200       3
++#define UART_Baud_Rate_Baud_57600       1
++#define UART_Baud_Rate_Baud_115200      0
++#define UART_Baud_Rate_Baud_230400      5
++#define UART_Baud_Rate_Baud_460800      7
++#define UART_Baud_Rate_Baud_921600      10
++#define UART_Baud_Rate_Baud_1000000     11
++#define UART_Baud_Rate_Baud_2000000     13
++#define UART_Baud_Rate_Baud_3000000     14
++#define UART_Baud_Rate_Baud_4000000     15
++
++#define UART_Baud_Rate_Baud_250000      6
++#define UART_Baud_Rate_Baud_500000      8
++#define UART_Baud_Rate_Baud_720000      9
++#define UART_Baud_Rate_Baud_125000      12
++#define UART_Baud_Rate_Baud_1600000     16
++#define UART_Baud_Rate_Baud_3200000     17
++#define UART_Baud_Rate_Baud_3500000     18
++
++
++
+ #ifndef FALSE
+ #define FALSE  0
+ #endif
+-- 
+1.9.1
+
-- 
2.7.4



More information about the meta-freescale mailing list