From 620f94596fdb124e4f9c640b3dd73c96b4d775a3 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 11 May 2016 10:22:25 +0200 Subject: [PATCH 001/117] meta-digi: Replace COMPATIBLE_MACHINE string for ccimx6 COMPATIBLE_MACHINE is a regular expression, so we need to update the current pattern for ccimx6 due to it will also match with ccimx6ul. Signed-off-by: Isaac Hermida --- meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros.bb | 2 +- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 2 +- meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend | 2 +- meta-digi-arm/recipes-kernel/linux/linux-dey_3.14.bb | 2 +- meta-digi-dey/recipes-digi/dey-examples/dey-examples-bt.bb | 2 +- .../recipes-digi/dey-examples/dey-examples-btconfig.bb | 2 +- meta-digi-dey/recipes-digi/dey-examples/dey-examples-can.bb | 2 +- meta-digi-dey/recipes-digi/dey-examples/dey-examples-hdp.bb | 2 +- .../recipes-digi/dey-examples/dey-examples-opengles.bb | 2 +- meta-digi-dey/recipes-digi/dey-examples/dey-examples-v4l2.bb | 2 +- .../recipes-digi/packagegroups/packagegroup-dey-examples.bb | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros.bb b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros.bb index b9311c6cb..c039dc191 100644 --- a/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros.bb +++ b/meta-digi-arm/recipes-bsp/firmware-atheros/firmware-atheros.bb @@ -82,4 +82,4 @@ FILES_${PN}-ar3k = "/lib/firmware/ar3k" FILES_${PN}-ath6kl = "/lib/firmware/ath6k" PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6)" +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 816082c23..795921585 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -57,4 +57,4 @@ do_deploy_append() { mkimage -T script -n bootscript -C none -d ${WORKDIR}/boot.txt ${DEPLOYDIR}/boot.scr } -COMPATIBLE_MACHINE = "(ccimx6)" +COMPATIBLE_MACHINE = "(ccimx6$)" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend b/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend index ca253e736..8540dc4cb 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend @@ -27,4 +27,4 @@ pkg_postinst_${PN}() { fi } -COMPATIBLE_MACHINE = "(ccimx6)" +COMPATIBLE_MACHINE = "(ccimx6$)" diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_3.14.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_3.14.bb index 023241b1b..6819a65b9 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey_3.14.bb +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey_3.14.bb @@ -8,4 +8,4 @@ inherit fsl-vivante-kernel-driver-handler SRCBRANCH = "v3.14/dey-2.0/maint" SRCREV = "${AUTOREV}" -COMPATIBLE_MACHINE = "(ccimx6)" +COMPATIBLE_MACHINE = "(ccimx6$)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-bt.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-bt.bb index 975b0c4fa..3fed99409 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-bt.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-bt.bb @@ -22,4 +22,4 @@ do_install() { install -m 0755 bt_test ${D}${bindir} } -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6)" +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-btconfig.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-btconfig.bb index fa6e52f99..c40c90d20 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-btconfig.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-btconfig.bb @@ -22,4 +22,4 @@ do_install() { install -m 0755 btconfig ${D}${bindir} } -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6)" +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-can.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-can.bb index e87d11af4..1233f7725 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-can.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-can.bb @@ -18,4 +18,4 @@ do_install() { install -m 0755 can_test ${D}${bindir} } -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6)" +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-hdp.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-hdp.bb index 72a34b357..64290d8f5 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-hdp.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-hdp.bb @@ -16,4 +16,4 @@ do_install() { RDEPENDS_${PN} = "python python-argparse python-crypt python-dbus python-pygobject" -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6)" +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-opengles.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-opengles.bb index cf9ada749..f28891e71 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-opengles.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-opengles.bb @@ -24,4 +24,4 @@ RDEPENDS_${PN}_ccimx6 = "libopenvg-mx6" PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccimx6)" +COMPATIBLE_MACHINE = "(ccimx6$)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-v4l2.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-v4l2.bb index 757bf796a..1e0ce763d 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-v4l2.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-v4l2.bb @@ -25,4 +25,4 @@ do_install() { PACKAGE_ARCH = "${MACHINE_ARCH}" -COMPATIBLE_MACHINE = "(ccimx6)" +COMPATIBLE_MACHINE = "(ccimx6$)" diff --git a/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb index d19be8411..a0315823c 100644 --- a/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb +++ b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb @@ -35,4 +35,4 @@ RDEPENDS_${PN}_append_ccimx6 = "\ dey-examples-v4l2 \ " -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6)" +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" From 0cfe463c26e41ad40392d95aedb59d234f351034 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 12 Apr 2016 16:58:06 +0200 Subject: [PATCH 002/117] conf: machine: Creating new files for ccimx6ul and ccimx6ulstarter Creating new file for ccimx6ul module as a clone of ccimx6. Creating new file for ccimx6ulstarter platform as a clone of ccimx6sbc. https://jira.digi.com/browse/DEL-2380 https://jira.digi.com/browse/DEL-2381 https://jira.digi.com/browse/DEL-2529 Signed-off-by: Isaac Hermida --- .../conf/machine/ccimx6ulstarter.conf | 39 +++++++++++++++++++ .../conf/machine/include/ccimx6ul.inc | 35 +++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 meta-digi-arm/conf/machine/ccimx6ulstarter.conf create mode 100644 meta-digi-arm/conf/machine/include/ccimx6ul.inc diff --git a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf new file mode 100644 index 000000000..31804f96e --- /dev/null +++ b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf @@ -0,0 +1,39 @@ +#@TYPE: Machine +#@NAME: ConnectCore 6 Single Board Computer. +#@DESCRIPTION: Machine configuration for Digi's ConnectCore 6 SBC. + +# Contains the ConnectCore 6 module. +include conf/machine/include/ccimx6.inc + +# U-Boot configurations +# Last one is the default (the one the symlinks point at) +UBOOT_CONFIG ??= "ccimx6dlsbc512MB ccimx6dlsbc ccimx6qsbc2GB ccimx6qsbc512MB ccimx6qsbc" +UBOOT_CONFIG[ccimx6dlsbc512MB] = "ccimx6dlsbc512MB_defconfig" +UBOOT_CONFIG[ccimx6dlsbc] = "ccimx6dlsbc_defconfig" +UBOOT_CONFIG[ccimx6qsbc2GB] = "ccimx6qsbc2GB_defconfig" +UBOOT_CONFIG[ccimx6qsbc512MB] = "ccimx6qsbc512MB_defconfig" +UBOOT_CONFIG[ccimx6qsbc] = "ccimx6qsbc_defconfig" + +KERNEL_DEVICETREE ?= " \ + imx6dl-ccimx6sbc.dtb \ + imx6dl-ccimx6sbc-w.dtb \ + imx6dl-ccimx6sbc-wb.dtb \ + imx6q-ccimx6sbc.dtb \ + imx6q-ccimx6sbc-w.dtb \ + imx6q-ccimx6sbc-wb.dtb \ + imx6q-ccimx6sbc-wb-ldo-bypass.dtb \ + imx6q-ccimx6sbc-id129.dtb \ + imx6q-ccimx6sbc-id130.dtb \ + imx6dl-ccimx6sbc-id131.dtb \ +" + +SERIAL_CONSOLES = "115200;ttymxc3" + +# Bluetooth tty +BT_TTY ?= "ttymxc1" + +# U-Boot script to be copied to the boot image +BOOT_SCRIPTS = "boot.scr:boot.scr" + +# Flash image types +IMAGE_FSTYPES ?= "boot.vfat ext4 sdcard tar.bz2" diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc new file mode 100644 index 000000000..b5a22f3aa --- /dev/null +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -0,0 +1,35 @@ +#@TYPE: Machine +#@NAME: ConnectCore 6 module. +#@DESCRIPTION: Machine configuration for Digi's ConnectCore 6 module. + +include conf/machine/include/imx-digi-base.inc +include conf/machine/include/tune-cortexa9.inc + +DIGI_FAMILY = "ccimx6" +SOC_FAMILY = "mx6:mx6dl:mx6q:${DIGI_FAMILY}" + +# Platform u-boot settings +UBOOT_ENTRYPOINT = "0x10800000" +UBOOT_SUFFIX = "imx" +UBOOT_SYMLINK = "u-boot-${MACHINE}.${UBOOT_SUFFIX}" + +# Wireless external module +WIRELESS_MODULE ?= "" + +# Firmware +MACHINE_FIRMWARE ?= "" +MACHINE_FIRMWARE_append_mx6q = " firmware-imx-vpu-imx6q" +MACHINE_FIRMWARE_append_mx6dl = " firmware-imx-vpu-imx6d" +MACHINE_FIRMWARE_append = " ${@base_conditional('HAVE_BT', '1' , 'firmware-atheros-ar3k', '', d)}" +MACHINE_FIRMWARE_append = " ${@base_conditional('HAVE_WIFI', '1' , 'firmware-atheros-ath6kl', '', d)}" + +MACHINE_EXTRA_RDEPENDS += " \ + e2fsprogs-mke2fs \ + e2fsprogs-resize2fs \ + parted \ + u-boot-fw-utils \ +" +MACHINE_EXTRA_RRECOMMENDS += "${MACHINE_FIRMWARE} ${WIRELESS_MODULE}" +MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins" + +MACHINE_FEATURES += "accel-graphics accel-video wifi bluetooth" From 313d902a8b0d808f225bd2e28370410dadd68248 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 11 May 2016 14:01:30 +0200 Subject: [PATCH 003/117] Initial support for ccimx6ulstarter platform Added initial support for Digi's ConnectCore 6UL Starter Board. https://jira.digi.com/browse/DEL-2380 https://jira.digi.com/browse/DEL-2529 Signed-off-by: Isaac Hermida --- .../conf/machine/ccimx6ulstarter.conf | 37 ++++++------------- .../conf/machine/include/ccimx6ul.inc | 26 ++++++------- .../conf/machine/include/digi-defaults.inc | 1 + 3 files changed, 23 insertions(+), 41 deletions(-) diff --git a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf index 31804f96e..978982153 100644 --- a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf +++ b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf @@ -1,39 +1,24 @@ #@TYPE: Machine -#@NAME: ConnectCore 6 Single Board Computer. -#@DESCRIPTION: Machine configuration for Digi's ConnectCore 6 SBC. +#@NAME: Starter Board for ConnectCore for i.MX6UL +#@DESCRIPTION: Machine configuration for Digi's ConnectCore 6UL Starter Board. -# Contains the ConnectCore 6 module. -include conf/machine/include/ccimx6.inc +# Include the machine configuration for Digi's ConnectCore 6UL. +include conf/machine/include/ccimx6ul.inc # U-Boot configurations # Last one is the default (the one the symlinks point at) -UBOOT_CONFIG ??= "ccimx6dlsbc512MB ccimx6dlsbc ccimx6qsbc2GB ccimx6qsbc512MB ccimx6qsbc" -UBOOT_CONFIG[ccimx6dlsbc512MB] = "ccimx6dlsbc512MB_defconfig" -UBOOT_CONFIG[ccimx6dlsbc] = "ccimx6dlsbc_defconfig" -UBOOT_CONFIG[ccimx6qsbc2GB] = "ccimx6qsbc2GB_defconfig" -UBOOT_CONFIG[ccimx6qsbc512MB] = "ccimx6qsbc512MB_defconfig" -UBOOT_CONFIG[ccimx6qsbc] = "ccimx6qsbc_defconfig" +UBOOT_CONFIG ??= "ccimx6ulstarter" +UBOOT_CONFIG[ccimx6ulstarter] = "ccimx6ulsbc_defconfig" KERNEL_DEVICETREE ?= " \ - imx6dl-ccimx6sbc.dtb \ - imx6dl-ccimx6sbc-w.dtb \ - imx6dl-ccimx6sbc-wb.dtb \ - imx6q-ccimx6sbc.dtb \ - imx6q-ccimx6sbc-w.dtb \ - imx6q-ccimx6sbc-wb.dtb \ - imx6q-ccimx6sbc-wb-ldo-bypass.dtb \ - imx6q-ccimx6sbc-id129.dtb \ - imx6q-ccimx6sbc-id130.dtb \ - imx6dl-ccimx6sbc-id131.dtb \ + imx6ul-ccimx6ulstarter.dtb \ + imx6ul-ccimx6ulstarter-wb.dtb \ " -SERIAL_CONSOLES = "115200;ttymxc3" +SERIAL_CONSOLES = "115200;ttymxc1" # Bluetooth tty -BT_TTY ?= "ttymxc1" - -# U-Boot script to be copied to the boot image -BOOT_SCRIPTS = "boot.scr:boot.scr" +BT_TTY ?= "ttymxc0" # Flash image types -IMAGE_FSTYPES ?= "boot.vfat ext4 sdcard tar.bz2" +IMAGE_FSTYPES ?= "tar.bz2 ubifs sdcard" diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index b5a22f3aa..75e81e4ba 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -1,15 +1,14 @@ #@TYPE: Machine -#@NAME: ConnectCore 6 module. -#@DESCRIPTION: Machine configuration for Digi's ConnectCore 6 module. +#@NAME: ConnectCore for i.MX6UL. +#@DESCRIPTION: Machine configuration for Digi's ConnectCore 6UL. include conf/machine/include/imx-digi-base.inc -include conf/machine/include/tune-cortexa9.inc +include conf/machine/include/tune-cortexa7.inc -DIGI_FAMILY = "ccimx6" -SOC_FAMILY = "mx6:mx6dl:mx6q:${DIGI_FAMILY}" +DIGI_FAMILY = "ccimx6ul" +SOC_FAMILY = "mx6ul:${DIGI_FAMILY}" # Platform u-boot settings -UBOOT_ENTRYPOINT = "0x10800000" UBOOT_SUFFIX = "imx" UBOOT_SYMLINK = "u-boot-${MACHINE}.${UBOOT_SUFFIX}" @@ -18,18 +17,15 @@ WIRELESS_MODULE ?= "" # Firmware MACHINE_FIRMWARE ?= "" -MACHINE_FIRMWARE_append_mx6q = " firmware-imx-vpu-imx6q" -MACHINE_FIRMWARE_append_mx6dl = " firmware-imx-vpu-imx6d" -MACHINE_FIRMWARE_append = " ${@base_conditional('HAVE_BT', '1' , 'firmware-atheros-ar3k', '', d)}" -MACHINE_FIRMWARE_append = " ${@base_conditional('HAVE_WIFI', '1' , 'firmware-atheros-ath6kl', '', d)}" MACHINE_EXTRA_RDEPENDS += " \ - e2fsprogs-mke2fs \ - e2fsprogs-resize2fs \ - parted \ - u-boot-fw-utils \ + mtd-utils-ubifs \ " MACHINE_EXTRA_RRECOMMENDS += "${MACHINE_FIRMWARE} ${WIRELESS_MODULE}" MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins" -MACHINE_FEATURES += "accel-graphics accel-video wifi bluetooth" +MACHINE_FEATURES += "wifi bluetooth" + +KERNEL_IMAGETYPE = "zImage" +# FLASH parameters +MKUBIFS_ARGS ?= "-m 2048 -e 126976 -c 2047" diff --git a/meta-digi-arm/conf/machine/include/digi-defaults.inc b/meta-digi-arm/conf/machine/include/digi-defaults.inc index ea23756f6..f1c642a09 100644 --- a/meta-digi-arm/conf/machine/include/digi-defaults.inc +++ b/meta-digi-arm/conf/machine/include/digi-defaults.inc @@ -12,6 +12,7 @@ PREFERRED_PROVIDER_virtual/xserver = "xserver-xorg" # ------------------------------------------------- # ccardimx28 3.10 2013.01 # ccimx6 3.14 2015.04 +# ccimx6ul 4.1 2015.04 # # Help variables used in recipes From 0f5820f111378529081c6a3327c06f4c97fd9b53 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 11 May 2016 14:03:41 +0200 Subject: [PATCH 004/117] sdk: Support for ccimx6ulstarter Adding sdk support by copying the files from ccimx6sbc and replacing the machine. https://jira.digi.com/browse/DEL-2529 Signed-off-by: Isaac Hermida --- sdk/build.sh | 5 +- .../ccimx6ulstarter/bblayers.conf.sample | 25 ++ sdk/config/ccimx6ulstarter/conf-notes.txt | 12 + sdk/config/ccimx6ulstarter/local.conf.sample | 255 ++++++++++++++++++ 4 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 sdk/config/ccimx6ulstarter/bblayers.conf.sample create mode 100644 sdk/config/ccimx6ulstarter/conf-notes.txt create mode 100644 sdk/config/ccimx6ulstarter/local.conf.sample diff --git a/sdk/build.sh b/sdk/build.sh index d45438080..2405d337d 100755 --- a/sdk/build.sh +++ b/sdk/build.sh @@ -142,8 +142,9 @@ while read _pl _var; do fi eval "${_pl}_var=\"${_var}\"" done<<-_EOF_ - ccardimx28js - e w wb web web1 - ccimx6sbc DONTBUILDVARIANTS + ccardimx28js - e w wb web web1 + ccimx6sbc DONTBUILDVARIANTS + ccimx6ulstarter DONTBUILDVARIANTS _EOF_ YOCTO_IMGS_DIR="${WORKSPACE}/images" diff --git a/sdk/config/ccimx6ulstarter/bblayers.conf.sample b/sdk/config/ccimx6ulstarter/bblayers.conf.sample new file mode 100644 index 000000000..0647c0d8d --- /dev/null +++ b/sdk/config/ccimx6ulstarter/bblayers.conf.sample @@ -0,0 +1,25 @@ +# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf +# changes incompatibly +LCONF_VERSION = "6" + +BBPATH = "${TOPDIR}" +BBFILES ?= "" + +BBLAYERS ?= " \ + ##OEROOT##/meta \ + ##OEROOT##/meta-yocto \ + ##OEROOT##/meta-yocto-bsp \ + ##DIGIBASE##/meta-openembedded/meta-oe \ + ##DIGIBASE##/meta-openembedded/meta-python \ + ##DIGIBASE##/meta-openembedded/meta-networking \ + ##DIGIBASE##/meta-openembedded/meta-webserver \ + ##DIGIBASE##/meta-qt5 \ + ##DIGIBASE##/meta-fsl-arm \ + ##DIGIBASE##/meta-fsl-demos \ + ##DIGIBASE##/meta-digi/meta-digi-arm \ + ##DIGIBASE##/meta-digi/meta-digi-dey \ + " +BBLAYERS_NON_REMOVABLE ?= " \ + ##OEROOT##/meta \ + ##OEROOT##/meta-yocto \ + " diff --git a/sdk/config/ccimx6ulstarter/conf-notes.txt b/sdk/config/ccimx6ulstarter/conf-notes.txt new file mode 100644 index 000000000..d8fa34f70 --- /dev/null +++ b/sdk/config/ccimx6ulstarter/conf-notes.txt @@ -0,0 +1,12 @@ +Digi Embedded Yocto provides the following image recipes: + + * dey-image-qt: graphical QT image + + By default the image is X11-based so it provides a full SATO theme + desktop environment. + + To compile the image for the framebuffer (instead of X11) add the + following line to the project's conf/local.conf: + + DISTRO_FEATURES_remove = "x11" + diff --git a/sdk/config/ccimx6ulstarter/local.conf.sample b/sdk/config/ccimx6ulstarter/local.conf.sample new file mode 100644 index 000000000..b3fbcc609 --- /dev/null +++ b/sdk/config/ccimx6ulstarter/local.conf.sample @@ -0,0 +1,255 @@ +# +# This file is your local configuration file and is where all local user settings +# are placed. The comments in this file give some guide to the options a new user +# to the system might want to change but pretty much any configuration option can +# be set in this file. More adventurous users can look at local.conf.extended +# which contains other examples of configuration which can be placed in this file +# but new users likely won't need any of them initially. +# +# Lines starting with the '#' character are commented out and in some cases the +# default values are provided as comments to show people example syntax. Enabling +# the option is a question of removing the # character and making any change to the +# variable as required. + +# +# Machine Selection +# +# You need to select a specific machine to target the build with. There are a selection +# of emulated machines available which can boot and run in the QEMU emulator: +# +#MACHINE ?= "qemuarm" +#MACHINE ?= "qemuarm64" +#MACHINE ?= "qemumips" +#MACHINE ?= "qemuppc" +#MACHINE ?= "qemux86" +#MACHINE ?= "qemux86-64" +# +# There are also the following hardware board target machines included for +# demonstration purposes: +# +#MACHINE ?= "beaglebone" +#MACHINE ?= "genericx86" +#MACHINE ?= "genericx86-64" +#MACHINE ?= "mpc8315e-rdb" +#MACHINE ?= "edgerouter" +# +# This sets the default machine to be qemux86 if no other machine is selected: +#MACHINE ??= "qemux86" + +MACHINE = "ccimx6ulstarter" + +# +# Use Digi's internal git repositories +# +#DIGI_INTERNAL_GIT ?= "1" + +# +# Where to place downloads +# +# During a first build the system will download many different source code tarballs +# from various upstream projects. This can take a while, particularly if your network +# connection is slow. These are all stored in DL_DIR. When wiping and rebuilding you +# can preserve this directory to speed up this part of subsequent builds. This directory +# is safe to share between multiple builds on the same machine too. +# +# The default is a downloads directory under TOPDIR which is the build directory. +# +#DL_DIR ?= "${TOPDIR}/downloads" + +# +# Where to place shared-state files +# +# BitBake has the capability to accelerate builds based on previously built output. +# This is done using "shared state" files which can be thought of as cache objects +# and this option determines where those files are placed. +# +# You can wipe out TMPDIR leaving this directory intact and the build would regenerate +# from these files if no changes were made to the configuration. If changes were made +# to the configuration, only shared state files where the state was still valid would +# be used (done using checksums). +# +# The default is a sstate-cache directory under TOPDIR. +# +#SSTATE_DIR ?= "${TOPDIR}/sstate-cache" + +# +# Where to place the build output +# +# This option specifies where the bulk of the building work should be done and +# where BitBake should place its temporary files and output. Keep in mind that +# this includes the extraction and compilation of many applications and the toolchain +# which can use Gigabytes of hard disk space. +# +# The default is a tmp directory under TOPDIR. +# +#TMPDIR = "${TOPDIR}/tmp" + +# +# Default policy config +# +# The distribution setting controls which policy settings are used as defaults. +# The default value is fine for general Yocto project use, at least initially. +# Ultimately when creating custom policy, people will likely end up subclassing +# these defaults. +# +DISTRO ?= "dey" +# As an example of a subclass there is a "bleeding" edge policy configuration +# where many versions are set to the absolute latest code from the upstream +# source control systems. This is just mentioned here as an example, its not +# useful to most new users. +# DISTRO ?= "poky-bleeding" + +# +# Package Management configuration +# +# This variable lists which packaging formats to enable. Multiple package backends +# can be enabled at once and the first item listed in the variable will be used +# to generate the root filesystems. +# Options are: +# - 'package_deb' for debian style deb files +# - 'package_ipk' for ipk files are used by opkg (a debian style embedded package manager) +# - 'package_rpm' for rpm style packages +# E.g.: PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk" +# We default to rpm: +PACKAGE_CLASSES ?= "package_rpm" + +# +# SDK/ADT target architecture +# +# This variable specifies the architecture to build SDK/ADT items for and means +# you can build the SDK packages for architectures other than the machine you are +# running the build on (i.e. building i686 packages on an x86_64 host). +# Supported values are i686 and x86_64 +#SDKMACHINE ?= "i686" + +# +# Extra image configuration defaults +# +# The EXTRA_IMAGE_FEATURES variable allows extra packages to be added to the generated +# images. Some of these options are added to certain image types automatically. The +# variable can contain the following options: +# "dbg-pkgs" - add -dbg packages for all installed packages +# (adds symbol information for debugging/profiling) +# "dev-pkgs" - add -dev packages for all installed packages +# (useful if you want to develop against libs in the image) +# "ptest-pkgs" - add -ptest packages for all ptest-enabled packages +# (useful if you want to run the package test suites) +# "tools-sdk" - add development tools (gcc, make, pkgconfig etc.) +# "tools-debug" - add debugging tools (gdb, strace) +# "eclipse-debug" - add Eclipse remote debugging support +# "tools-profile" - add profiling tools (oprofile, exmap, lttng, valgrind) +# "tools-testapps" - add useful testing tools (ts_print, aplay, arecord etc.) +# "debug-tweaks" - make an image suitable for development +# e.g. ssh root access has a blank password +# There are other application targets that can be used here too, see +# meta/classes/image.bbclass and meta/classes/core-image.bbclass for more details. +# We default to enabling the debugging tweaks. +EXTRA_IMAGE_FEATURES = "debug-tweaks" + +# +# Additional image features +# +# The following is a list of additional classes to use when building images which +# enable extra features. Some available options which can be included in this variable +# are: +# - 'buildstats' collect build statistics +# - 'image-mklibs' to reduce shared library files size for an image +# - 'image-prelink' in order to prelink the filesystem image +# - 'image-swab' to perform host system intrusion detection +# NOTE: if listing mklibs & prelink both, then make sure mklibs is before prelink +# NOTE: mklibs also needs to be explicitly enabled for a given image, see local.conf.extended +# NOTE: image-prelink is currently broken due to problems with the prelinker. It is advised +# that you do NOT run the prelinker at this time. +USER_CLASSES ?= "buildstats image-mklibs" + +# +# Runtime testing of images +# +# The build system can test booting virtual machine images under qemu (an emulator) +# after any root filesystems are created and run tests against those images. To +# enable this uncomment this line. See classes/testimage(-auto).bbclass for +# further details. +#TEST_IMAGE = "1" +# +# Interactive shell configuration +# +# Under certain circumstances the system may need input from you and to do this it +# can launch an interactive shell. It needs to do this since the build is +# multithreaded and needs to be able to handle the case where more than one parallel +# process may require the user's attention. The default is iterate over the available +# terminal types to find one that works. +# +# Examples of the occasions this may happen are when resolving patches which cannot +# be applied, to use the devshell or the kernel menuconfig +# +# Supported values are auto, gnome, xfce, rxvt, screen, konsole (KDE 3.x only), none +# Note: currently, Konsole support only works for KDE 3.x due to the way +# newer Konsole versions behave +#OE_TERMINAL = "auto" +# By default disable interactive patch resolution (tasks will just fail instead): +PATCHRESOLVE = "noop" + +# +# Disk Space Monitoring during the build +# +# Monitor the disk space during the build. If there is less that 1GB of space or less +# than 100K inodes in any key build location (TMPDIR, DL_DIR, SSTATE_DIR), gracefully +# shutdown the build. If there is less that 100MB or 1K inodes, perform a hard abort +# of the build. The reason for this is that running completely out of space can corrupt +# files and damages the build in ways which may not be easily recoverable. +# It's necesary to monitor /tmp, if there is no space left the build will fail +# with very exotic errors. +BB_DISKMON_DIRS = "\ + STOPTASKS,${TMPDIR},1G,100K \ + STOPTASKS,${DL_DIR},1G,100K \ + STOPTASKS,${SSTATE_DIR},1G,100K \ + STOPTASKS,/tmp,100M,100K \ + ABORT,${TMPDIR},100M,1K \ + ABORT,${DL_DIR},100M,1K \ + ABORT,${SSTATE_DIR},100M,1K \ + ABORT,/tmp,10M,1K" + +# +# Shared-state files from other locations +# +# As mentioned above, shared state files are prebuilt cache data objects which can +# used to accelerate build time. This variable can be used to configure the system +# to search other mirror locations for these objects before it builds the data itself. +# +# This can be a filesystem directory, or a remote url such as http or ftp. These +# would contain the sstate-cache results from previous builds (possibly from other +# machines). This variable works like fetcher MIRRORS/PREMIRRORS and points to the +# cache locations to check for the shared objects. +# NOTE: if the mirror uses the same structure as SSTATE_DIR, you need to add PATH +# at the end as shown in the examples below. This will be substituted with the +# correct path within the directory structure. +#SSTATE_MIRRORS ?= "\ +#file://.* http://someserver.tld/share/sstate/PATH;downloadfilename=PATH \n \ +#file://.* file:///some/local/dir/sstate/PATH" + + +# +# Qemu configuration +# +# By default qemu will build with a builtin VNC server where graphical output can be +# seen. The two lines below enable the SDL backend too. This assumes there is a +# libsdl library available on your build system. +PACKAGECONFIG_append_pn-qemu-native = " sdl" +PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl" +ASSUME_PROVIDED += "libsdl-native" + + +# CONF_VERSION is increased each time build/conf/ changes incompatibly and is used to +# track the version of this file when it was generated. This can safely be ignored if +# this doesn't mean anything to you. +CONF_VERSION = "1" + +# +# Enable local PR server +# +PRSERV_HOST = "localhost:0" + +# +# Some libraries and packages are covered by Freescale EULA +# +#ACCEPT_FSL_EULA = "1" From 68d5f7d536f9c89c255886fa6ad341cafc0c0737 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 11 May 2016 14:17:53 +0200 Subject: [PATCH 005/117] recipes-bsp: u-boot: Support for ccimx6ul https://jira.digi.com/browse/DEL-2381 https://jira.digi.com/browse/DEL-2529 Signed-off-by: Isaac Hermida --- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 795921585..90844408c 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -11,6 +11,7 @@ DEPENDS += "dtc-native u-boot-mkimage-native" PROVIDES += "u-boot" SRCBRANCH = "v2015.04/maint" +SRCBRANCH_ccimx6ul = "v2015.04/master" SRCREV = "${AUTOREV}" # Select internal or Github U-Boot repo @@ -18,6 +19,9 @@ UBOOT_GIT_URI = "${@base_conditional('DIGI_INTERNAL_GIT', '1' , '${DIGI_GIT}u-bo SRC_URI = " \ ${UBOOT_GIT_URI};branch=${SRCBRANCH} \ +" + +SRC_URI_append_ccimx6 = " \ file://boot.txt \ file://install_linux_fw_sd.txt \ " @@ -48,7 +52,9 @@ do_deploy_append() { done unset i fi +} +do_deploy_append_ccimx6() { # DEY firmware install script sed -i -e 's,##GRAPHICAL_BACKEND##,${GRAPHICAL_BACKEND},g' ${WORKDIR}/install_linux_fw_sd.txt mkimage -T script -n "DEY firmware install script" -C none -d ${WORKDIR}/install_linux_fw_sd.txt ${DEPLOYDIR}/install_linux_fw_sd.scr @@ -57,4 +63,4 @@ do_deploy_append() { mkimage -T script -n bootscript -C none -d ${WORKDIR}/boot.txt ${DEPLOYDIR}/boot.scr } -COMPATIBLE_MACHINE = "(ccimx6$)" +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul)" From 0775ee38e083e2867ce9a99c8afa781769b73360 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 11 May 2016 14:19:08 +0200 Subject: [PATCH 006/117] recipes-kernel: Support for ccimx6ulsbc Used ccimx6ul_defconfig from v4.1/master repository. The defconfig file will live under module folder and not specific platform folder because it will be the same for other ccimx6ul platforms. https://jira.digi.com/browse/DEL-2381 https://jira.digi.com/browse/DEL-2529 Signed-off-by: Isaac Hermida --- .../linux/linux-dey-4.1/ccimx6ul/defconfig | 446 ++++++++++++++++++ .../recipes-kernel/linux/linux-dey_4.1.bb | 9 + 2 files changed, 455 insertions(+) create mode 100644 meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig create mode 100644 meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig new file mode 100644 index 000000000..a1b0ad8f7 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig @@ -0,0 +1,446 @@ +CONFIG_KERNEL_LZO=y +CONFIG_SYSVIPC=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_CGROUPS=y +CONFIG_RELAY=y +CONFIG_BLK_DEV_INITRD=y +CONFIG_EXPERT=y +CONFIG_KALLSYMS_ALL=y +CONFIG_PERF_EVENTS=y +# CONFIG_SLUB_DEBUG is not set +# CONFIG_COMPAT_BRK is not set +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SRCVERSION_ALL=y +# CONFIG_BLK_DEV_BSG is not set +CONFIG_ARCH_MXC=y +CONFIG_SOC_IMX50=y +CONFIG_SOC_IMX53=y +CONFIG_SOC_IMX6Q=y +CONFIG_SOC_IMX6SL=y +CONFIG_SOC_IMX6SX=y +CONFIG_SOC_IMX6UL=y +CONFIG_SOC_IMX7D=y +CONFIG_SOC_VF610=y +# CONFIG_SWP_EMULATE is not set +CONFIG_SMP=y +CONFIG_HAVE_ARM_ARCH_TIMER=y +CONFIG_VMSPLIT_2G=y +CONFIG_PREEMPT=y +CONFIG_AEABI=y +CONFIG_HIGHMEM=y +CONFIG_CMA=y +CONFIG_CMDLINE="noinitrd console=ttymxc0,115200" +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_ARM_IMX6Q_CPUFREQ=y +CONFIG_ARM_IMX7D_CPUFREQ=y +CONFIG_CPU_IDLE=y +CONFIG_VFP=y +CONFIG_NEON=y +CONFIG_BINFMT_MISC=m +CONFIG_PM_DEBUG=y +CONFIG_PM_TEST_SUSPEND=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_INET=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET_XFRM_MODE_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +CONFIG_IPV6=y +CONFIG_VLAN_8021Q=y +CONFIG_LLC2=y +CONFIG_CAN=y +CONFIG_CAN_FLEXCAN=y +CONFIG_CAN_M_CAN=y +CONFIG_BT=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=y +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=y +CONFIG_BT_HCIBTUSB=y +CONFIG_BT_HCIUART=y +CONFIG_BT_HCIUART_BCSP=y +CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIBCM203X=y +CONFIG_BT_ATH3K=y +CONFIG_CFG80211=m +CONFIG_CFG80211_CERTIFICATION_ONUS=y +CONFIG_CFG80211_DEBUGFS=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_CFG80211_WEXT=y +CONFIG_MAC80211=m +CONFIG_MAC80211_DEBUGFS=y +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +# CONFIG_STANDALONE is not set +CONFIG_DMA_CMA=y +CONFIG_CMA_SIZE_MBYTES=0 +CONFIG_IMX_WEIM=y +CONFIG_CONNECTOR=y +CONFIG_MTD=y +CONFIG_MTD_CMDLINE_PARTS=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_CFI=y +CONFIG_MTD_JEDECPROBE=y +CONFIG_MTD_CFI_INTELEXT=y +CONFIG_MTD_CFI_AMDSTD=y +CONFIG_MTD_CFI_STAA=y +CONFIG_MTD_PHYSMAP_OF=y +CONFIG_MTD_DATAFLASH=y +CONFIG_MTD_M25P80=y +CONFIG_MTD_SST25L=y +CONFIG_MTD_NAND=y +CONFIG_MTD_NAND_GPMI_NAND=y +CONFIG_MTD_NAND_MXC=y +CONFIG_MTD_SPI_NOR=y +CONFIG_SPI_FSL_QUADSPI=y +CONFIG_MTD_UBI=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=65536 +CONFIG_SENSORS_FXOS8700=y +CONFIG_SENSORS_FXAS2100X=y +CONFIG_EEPROM_AT24=y +CONFIG_EEPROM_AT25=y +# CONFIG_SCSI_PROC_FS is not set +CONFIG_BLK_DEV_SD=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +# CONFIG_SCSI_LOWLEVEL is not set +CONFIG_ATA=y +CONFIG_SATA_AHCI_PLATFORM=y +CONFIG_AHCI_IMX=y +CONFIG_PATA_IMX=y +CONFIG_NETDEVICES=y +# CONFIG_NET_VENDOR_BROADCOM is not set +CONFIG_CS89x0=y +CONFIG_CS89x0_PLATFORM=y +# CONFIG_NET_VENDOR_FARADAY is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_SEEQ is not set +CONFIG_SMC91X=y +CONFIG_SMC911X=y +CONFIG_SMSC911X=y +# CONFIG_NET_VENDOR_STMICRO is not set +CONFIG_MICREL_PHY=y +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_RTL8152=m +CONFIG_USB_USBNET=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_ATH_CARDS=m +CONFIG_ATH_DEBUG=y +CONFIG_BCMDHD=m +CONFIG_BCMDHD_SDIO=y +CONFIG_BCMDHD_FW_PATH="/lib/firmware/bcm/fw_bcmdhd.bin" +CONFIG_BCMDHD_NVRAM_PATH="/lib/firmware/bcm/bcmdhd.cal" +CONFIG_HOSTAP=y +CONFIG_HOSTAP_FIRMWARE=y +CONFIG_HOSTAP_FIRMWARE_NVRAM=y +# CONFIG_RTL_CARDS is not set +# CONFIG_INPUT_MOUSEDEV_PSAUX is not set +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_KEYBOARD_GPIO=y +CONFIG_KEYBOARD_IMX=y +CONFIG_MOUSE_PS2=m +CONFIG_MOUSE_PS2_ELANTECH=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_ADS7846=y +CONFIG_TOUCHSCREEN_EGALAX=y +CONFIG_TOUCHSCREEN_ELAN_TS=y +CONFIG_TOUCHSCREEN_MAX11801=y +CONFIG_TOUCHSCREEN_IMX6UL_TSC=y +CONFIG_TOUCHSCREEN_MC13783=y +CONFIG_TOUCHSCREEN_TSC2007=y +CONFIG_TOUCHSCREEN_STMPE=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_MMA8450=y +CONFIG_INPUT_MPL3115=y +CONFIG_SENSOR_FXLS8471=y +CONFIG_INPUT_ISL29023=y +CONFIG_SERIO_SERPORT=m +# CONFIG_LEGACY_PTYS is not set +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_IMX=y +CONFIG_SERIAL_IMX_CONSOLE=y +CONFIG_SERIAL_FSL_LPUART=y +CONFIG_SERIAL_FSL_LPUART_CONSOLE=y +CONFIG_FSL_OTP=y +# CONFIG_I2C_COMPAT is not set +CONFIG_I2C_CHARDEV=y +# CONFIG_I2C_HELPER_AUTO is not set +CONFIG_I2C_ALGOPCF=m +CONFIG_I2C_ALGOPCA=m +CONFIG_I2C_IMX=y +CONFIG_SPI=y +CONFIG_SPI_GPIO=y +CONFIG_SPI_IMX=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_MAX732X=y +CONFIG_GPIO_PCA953X=y +CONFIG_GPIO_74X164=y +CONFIG_POWER_SUPPLY=y +CONFIG_SABRESD_MAX8903=y +CONFIG_POWER_RESET=y +CONFIG_POWER_RESET_SYSCON_POWEROFF=y +CONFIG_SENSORS_MAX17135=y +CONFIG_SENSORS_MAG3110=y +CONFIG_THERMAL=y +CONFIG_CPU_THERMAL=y +CONFIG_IMX_THERMAL=y +CONFIG_DEVICE_THERMAL=y +CONFIG_WATCHDOG=y +CONFIG_IMX2_WDT=y +CONFIG_MFD_DA9052_I2C=y +CONFIG_MFD_MC13XXX_SPI=y +CONFIG_MFD_MC13XXX_I2C=y +CONFIG_MFD_MAX17135=y +CONFIG_MFD_SI476X_CORE=y +CONFIG_MFD_STMPE=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_ANATOP=y +CONFIG_REGULATOR_DA9052=y +CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_MAX17135=y +CONFIG_REGULATOR_MC13783=y +CONFIG_REGULATOR_MC13892=y +CONFIG_REGULATOR_PFUZE100=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_RC_SUPPORT=y +CONFIG_RC_DEVICES=y +CONFIG_IR_GPIO_CIR=y +CONFIG_MEDIA_USB_SUPPORT=y +CONFIG_USB_VIDEO_CLASS=m +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_VIDEO_MXC_OUTPUT=y +CONFIG_VIDEO_MXC_CAPTURE=m +CONFIG_MXC_CAMERA_OV5640=m +CONFIG_MXC_CAMERA_OV5642=m +CONFIG_MXC_CAMERA_OV5640_MIPI=m +CONFIG_MXC_TVIN_ADV7180=m +CONFIG_MXC_IPU_DEVICE_QUEUE_SDC=m +CONFIG_VIDEO_MXC_IPU_OUTPUT=y +CONFIG_VIDEO_MXC_PXP_V4L2=y +CONFIG_VIDEO_MXC_CSI_CAMERA=m +CONFIG_MXC_VADC=m +CONFIG_MXC_MIPI_CSI=m +CONFIG_MXC_CAMERA_OV5647_MIPI=m +CONFIG_SOC_CAMERA=y +CONFIG_VIDEO_MX3=y +CONFIG_V4L_MEM2MEM_DRIVERS=y +CONFIG_VIDEO_CODA=y +CONFIG_RADIO_SI476X=y +CONFIG_SOC_CAMERA_OV2640=y +CONFIG_DRM=y +CONFIG_DRM_VIVANTE=y +CONFIG_FB=y +CONFIG_FB_MXS=y +CONFIG_FB_MXC_SYNC_PANEL=y +CONFIG_FB_MXC_MIPI_DSI=y +CONFIG_FB_MXC_MIPI_DSI_SAMSUNG=y +CONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL=y +CONFIG_FB_MXC_LDB=y +CONFIG_FB_MXC_HDMI=y +CONFIG_FB_MXS_SII902X=y +CONFIG_FB_MXC_DCIC=m +CONFIG_HANNSTAR_CABC=y +CONFIG_FB_MXC_EINK_PANEL=y +CONFIG_FB_MXC_EINK_V2_PANEL=y +CONFIG_LCD_CLASS_DEVICE=y +CONFIG_LCD_L4F00242T03=y +CONFIG_LCD_PLATFORM=y +CONFIG_BACKLIGHT_PWM=y +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y +CONFIG_LOGO=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=m +CONFIG_SND_SOC=y +CONFIG_SND_IMX_SOC=y +CONFIG_SND_SOC_EUKREA_TLV320=y +CONFIG_SND_SOC_IMX_WM8960=y +CONFIG_SND_SOC_IMX_SII902X=y +CONFIG_SND_SOC_IMX_WM8958=y +CONFIG_SND_SOC_IMX_CS42888=y +CONFIG_SND_SOC_IMX_WM8962=y +CONFIG_SND_SOC_IMX_SGTL5000=y +CONFIG_SND_SOC_IMX_MQS=y +CONFIG_SND_SOC_IMX_SPDIF=y +CONFIG_SND_SOC_IMX_MC13783=y +CONFIG_SND_SOC_IMX_SI476X=y +CONFIG_SND_SOC_IMX_HDMI=y +CONFIG_USB=y +CONFIG_USB_OTG_WHITELIST=y +CONFIG_USB_OTG_FSM=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MXC=y +CONFIG_USB_HCD_TEST_MODE=y +CONFIG_USB_ACM=m +CONFIG_USB_STORAGE=y +CONFIG_USB_CHIPIDEA=y +CONFIG_USB_CHIPIDEA_UDC=y +CONFIG_USB_CHIPIDEA_HOST=y +CONFIG_USB_SERIAL=m +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_OPTION=m +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MXS_PHY=y +CONFIG_USB_GADGET=y +CONFIG_USB_CONFIGFS=m +CONFIG_USB_CONFIGFS_SERIAL=y +CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_OBEX=y +CONFIG_USB_CONFIGFS_NCM=y +CONFIG_USB_CONFIGFS_ECM=y +CONFIG_USB_CONFIGFS_ECM_SUBSET=y +CONFIG_USB_CONFIGFS_RNDIS=y +CONFIG_USB_CONFIGFS_EEM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_USB_CONFIGFS_F_LB_SS=y +CONFIG_USB_CONFIGFS_F_FS=y +CONFIG_USB_ZERO=m +CONFIG_USB_ETH=m +CONFIG_USB_G_NCM=m +CONFIG_USB_GADGETFS=m +CONFIG_USB_MASS_STORAGE=m +CONFIG_USB_G_SERIAL=m +CONFIG_MMC=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_ESDHC_IMX=y +CONFIG_MXC_IPU=y +CONFIG_MXC_IPU_V3_PRE=y +CONFIG_MXC_GPU_VIV=y +CONFIG_MXC_SIM=y +CONFIG_MXC_MIPI_CSI2=y +CONFIG_MXC_HDMI_CEC=y +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_GPIO=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_INTF_DEV_UIE_EMUL=y +CONFIG_RTC_DRV_MC13XXX=y +CONFIG_RTC_DRV_MXC=y +CONFIG_RTC_DRV_SNVS=y +CONFIG_DMADEVICES=y +CONFIG_MXC_PXP_V2=y +CONFIG_MXC_PXP_V3=y +CONFIG_IMX_SDMA=y +CONFIG_MXS_DMA=y +CONFIG_DMATEST=m +CONFIG_STAGING=y +CONFIG_STAGING_MEDIA=y +# CONFIG_IOMMU_SUPPORT is not set +CONFIG_IIO=y +CONFIG_IMX7D_ADC=y +CONFIG_VF610_ADC=y +CONFIG_PWM=y +CONFIG_PWM_IMX=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT2_FS_POSIX_ACL=y +CONFIG_EXT2_FS_SECURITY=y +CONFIG_EXT3_FS=y +CONFIG_EXT3_FS_POSIX_ACL=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +CONFIG_QUOTA_NETLINK_INTERFACE=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_AUTOFS4_FS=y +CONFIG_FUSE_FS=y +CONFIG_ISO9660_FS=m +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_UDF_FS=m +CONFIG_MSDOS_FS=m +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_JFFS2_FS=y +CONFIG_UBIFS_FS=y +CONFIG_NFS_FS=y +CONFIG_NFS_V3_ACL=y +CONFIG_NFS_V4=y +CONFIG_ROOT_NFS=y +CONFIG_NLS_DEFAULT="cp437" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_ISO8859_15=m +CONFIG_NLS_UTF8=y +CONFIG_DEBUG_FS=y +CONFIG_MAGIC_SYSRQ=y +# CONFIG_SCHED_DEBUG is not set +# CONFIG_DEBUG_BUGVERBOSE is not set +# CONFIG_FTRACE is not set +CONFIG_SECURITYFS=y +CONFIG_CRYPTO_USER=y +CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_GCM=y +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_LRW=y +CONFIG_CRYPTO_XTS=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_RMD128=y +CONFIG_CRYPTO_RMD160=y +CONFIG_CRYPTO_RMD256=y +CONFIG_CRYPTO_RMD320=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA512=y +CONFIG_CRYPTO_TGR192=y +CONFIG_CRYPTO_WP512=y +CONFIG_CRYPTO_BLOWFISH=y +CONFIG_CRYPTO_CAMELLIA=y +CONFIG_CRYPTO_DES=y +CONFIG_CRYPTO_TWOFISH=y +# CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_DEV_FSL_CAAM=y +CONFIG_CRYPTO_DEV_FSL_CAAM_SM=y +CONFIG_CRYPTO_DEV_FSL_CAAM_SM_TEST=y +CONFIG_CRYPTO_DEV_FSL_CAAM_SECVIO=y +CONFIG_CRC_CCITT=m +CONFIG_CRC_T10DIF=y +CONFIG_CRC7=m +CONFIG_LIBCRC32C=m +CONFIG_FONTS=y +CONFIG_FONT_8x8=y +CONFIG_FONT_8x16=y diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb new file mode 100644 index 000000000..612b5a5b9 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb @@ -0,0 +1,9 @@ +# Copyright (C) 2016 Digi International + +require recipes-kernel/linux/linux-dey.inc +require recipes-kernel/linux/linux-dtb.inc + +SRCBRANCH_ccimx6ul = "v4.1/master" +SRCREV = "${AUTOREV}" + +COMPATIBLE_MACHINE = "(ccimx6ul)" From e975240bdef9c8d6ad6e06c77c9cebac2dc40ef1 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 22 Mar 2016 13:44:12 +0100 Subject: [PATCH 007/117] packagegroup-dey-examples: Defining initial list for ccimx6ul https://jira.digi.com/browse/DEL-2529 Signed-off-by: Isaac Hermida --- .../recipes-digi/dey-examples/dey-examples-bt.bb | 2 +- .../recipes-digi/dey-examples/dey-examples-btconfig.bb | 2 +- .../recipes-digi/dey-examples/dey-examples-can.bb | 2 +- .../recipes-digi/dey-examples/dey-examples-hdp.bb | 2 +- .../packagegroups/packagegroup-dey-examples.bb | 9 ++++++++- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-bt.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-bt.bb index 3fed99409..71866c3fc 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-bt.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-bt.bb @@ -22,4 +22,4 @@ do_install() { install -m 0755 bt_test ${D}${bindir} } -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$|ccimx6ul)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-btconfig.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-btconfig.bb index c40c90d20..0e997e1a3 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-btconfig.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-btconfig.bb @@ -22,4 +22,4 @@ do_install() { install -m 0755 btconfig ${D}${bindir} } -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$|ccimx6ul)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-can.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-can.bb index 1233f7725..a6c7de141 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-can.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-can.bb @@ -18,4 +18,4 @@ do_install() { install -m 0755 can_test ${D}${bindir} } -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$|ccimx6ul)" diff --git a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-hdp.bb b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-hdp.bb index 64290d8f5..b306b3a9f 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/dey-examples-hdp.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/dey-examples-hdp.bb @@ -16,4 +16,4 @@ do_install() { RDEPENDS_${PN} = "python python-argparse python-crypt python-dbus python-pygobject" -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$|ccimx6ul)" diff --git a/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb index a0315823c..2d3a1ffa2 100644 --- a/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb +++ b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb @@ -35,4 +35,11 @@ RDEPENDS_${PN}_append_ccimx6 = "\ dey-examples-v4l2 \ " -COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$)" +RDEPENDS_${PN}_append_ccimx6ul = "\ + ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-bt", "", d)} \ + ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-btconfig", "", d)} \ + dey-examples-can \ + ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-hdp", "", d)} \ +" + +COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$|ccimx6ul)" From 5d147152f9c39286a0e8f34eeaea0ffb6de751b9 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 11 May 2016 11:07:14 +0200 Subject: [PATCH 008/117] alsa-state: Support for ccimx6ul Adding some early initial support as a copy of ccimx6 files. https://jira.digi.com/browse/DEL-2529 Signed-off-by: Isaac Hermida --- .../alsa-state/ccimx6ul/asound.conf | 43 ++++++ .../alsa-state/ccimx6ul/asound.inline.state | 127 ++++++++++++++++++ .../ccimx6ul/asound.inline_play.state | 127 ++++++++++++++++++ .../alsa-state/ccimx6ul/asound.micro.state | 127 ++++++++++++++++++ .../ccimx6ul/asound.micro_play.state | 127 ++++++++++++++++++ .../alsa-state/ccimx6ul/asound.play.state | 127 ++++++++++++++++++ 6 files changed, 678 insertions(+) create mode 100644 meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.conf create mode 100644 meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.inline.state create mode 100644 meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.inline_play.state create mode 100644 meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.micro.state create mode 100644 meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.micro_play.state create mode 100644 meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.play.state diff --git a/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.conf b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.conf new file mode 100644 index 000000000..b39177ba8 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.conf @@ -0,0 +1,43 @@ +pcm.btheadset { + type plug + slave { + pcm { + type bluetooth + device 80:57:19:B2:A1:04 + profile "auto" + } + } + hint { + show on + description "BT Headset" + } +} +ctl.btheadset { + type bluetooth +} + +pcm.btspeaker { + type plug + slave { + pcm { + type bluetooth + device A0:E9:DB:10:33:58 + profile "auto" + } + } + hint { + show on + description "BT Speaker" + } +} +ctl.btspeaker { + type bluetooth +} + +pcm.btspeaker_softvol +{ + type softvol + slave.pcm "btspeaker" + control.name "Bluetooth" + control.card 0 +} diff --git a/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.inline.state b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.inline.state new file mode 100644 index 000000000..0d9c9db6b --- /dev/null +++ b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.inline.state @@ -0,0 +1,127 @@ +state.sgtl5000audio { + control.1 { + iface MIXER + name 'PCM Playback Volume' + value.0 144 + value.1 144 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 192' + } + } + control.2 { + iface MIXER + name 'Capture Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 15' + } + } + control.3 { + iface MIXER + name 'Capture Attenuate Switch (-6dB)' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 2' + dbmin -600 + dbmax 600 + dbvalue.0 0 + } + } + control.4 { + iface MIXER + name 'Capture ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.5 { + iface MIXER + name 'Headphone Playback Volume' + value.0 105 + value.1 105 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -5150 + dbmax 1200 + dbvalue.0 100 + dbvalue.1 100 + } + } + control.6 { + iface MIXER + name 'Headphone Playback ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.7 { + iface MIXER + name 'Mic Volume' + value 2 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 3' + dbmin 0 + dbmax 4000 + dbvalue.0 3000 + } + } + control.8 { + iface MIXER + name 'Headphone Mux' + value LINE_IN + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 LINE_IN + } + } + control.9 { + iface MIXER + name 'Capture Mux' + value LINE_IN + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 MIC_IN + item.1 LINE_IN + } + } +} + +state.imxhdmisoc { + control.1 { + iface MIXER + name 'IEC958 Playback Default' + value '0400220300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + comment { + access 'read write volatile' + type IEC958 + count 1 + } + } +} diff --git a/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.inline_play.state b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.inline_play.state new file mode 100644 index 000000000..05a69279e --- /dev/null +++ b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.inline_play.state @@ -0,0 +1,127 @@ +state.sgtl5000audio { + control.1 { + iface MIXER + name 'PCM Playback Volume' + value.0 144 + value.1 144 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 192' + } + } + control.2 { + iface MIXER + name 'Capture Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 15' + } + } + control.3 { + iface MIXER + name 'Capture Attenuate Switch (-6dB)' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 2' + dbmin -600 + dbmax 600 + dbvalue.0 0 + } + } + control.4 { + iface MIXER + name 'Capture ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.5 { + iface MIXER + name 'Headphone Playback Volume' + value.0 105 + value.1 105 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -5150 + dbmax 1200 + dbvalue.0 100 + dbvalue.1 100 + } + } + control.6 { + iface MIXER + name 'Headphone Playback ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.7 { + iface MIXER + name 'Mic Volume' + value 2 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 3' + dbmin 0 + dbmax 4000 + dbvalue.0 3000 + } + } + control.8 { + iface MIXER + name 'Headphone Mux' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 LINE_IN + } + } + control.9 { + iface MIXER + name 'Capture Mux' + value LINE_IN + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 MIC_IN + item.1 LINE_IN + } + } +} + +state.imxhdmisoc { + control.1 { + iface MIXER + name 'IEC958 Playback Default' + value '0400220300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + comment { + access 'read write volatile' + type IEC958 + count 1 + } + } +} diff --git a/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.micro.state b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.micro.state new file mode 100644 index 000000000..4d55bc608 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.micro.state @@ -0,0 +1,127 @@ +state.sgtl5000audio { + control.1 { + iface MIXER + name 'PCM Playback Volume' + value.0 144 + value.1 144 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 192' + } + } + control.2 { + iface MIXER + name 'Capture Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 15' + } + } + control.3 { + iface MIXER + name 'Capture Attenuate Switch (-6dB)' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 2' + dbmin -600 + dbmax 600 + dbvalue.0 0 + } + } + control.4 { + iface MIXER + name 'Capture ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.5 { + iface MIXER + name 'Headphone Playback Volume' + value.0 105 + value.1 105 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -5150 + dbmax 1200 + dbvalue.0 100 + dbvalue.1 100 + } + } + control.6 { + iface MIXER + name 'Headphone Playback ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.7 { + iface MIXER + name 'Mic Volume' + value 2 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 3' + dbmin 0 + dbmax 4000 + dbvalue.0 3000 + } + } + control.8 { + iface MIXER + name 'Headphone Mux' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 LINE_IN + } + } + control.9 { + iface MIXER + name 'Capture Mux' + value MIC_IN + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 MIC_IN + item.1 LINE_IN + } + } +} + +state.imxhdmisoc { + control.1 { + iface MIXER + name 'IEC958 Playback Default' + value '0400220300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + comment { + access 'read write volatile' + type IEC958 + count 1 + } + } +} diff --git a/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.micro_play.state b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.micro_play.state new file mode 100644 index 000000000..4d55bc608 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.micro_play.state @@ -0,0 +1,127 @@ +state.sgtl5000audio { + control.1 { + iface MIXER + name 'PCM Playback Volume' + value.0 144 + value.1 144 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 192' + } + } + control.2 { + iface MIXER + name 'Capture Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 15' + } + } + control.3 { + iface MIXER + name 'Capture Attenuate Switch (-6dB)' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 2' + dbmin -600 + dbmax 600 + dbvalue.0 0 + } + } + control.4 { + iface MIXER + name 'Capture ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.5 { + iface MIXER + name 'Headphone Playback Volume' + value.0 105 + value.1 105 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -5150 + dbmax 1200 + dbvalue.0 100 + dbvalue.1 100 + } + } + control.6 { + iface MIXER + name 'Headphone Playback ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.7 { + iface MIXER + name 'Mic Volume' + value 2 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 3' + dbmin 0 + dbmax 4000 + dbvalue.0 3000 + } + } + control.8 { + iface MIXER + name 'Headphone Mux' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 LINE_IN + } + } + control.9 { + iface MIXER + name 'Capture Mux' + value MIC_IN + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 MIC_IN + item.1 LINE_IN + } + } +} + +state.imxhdmisoc { + control.1 { + iface MIXER + name 'IEC958 Playback Default' + value '0400220300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + comment { + access 'read write volatile' + type IEC958 + count 1 + } + } +} diff --git a/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.play.state b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.play.state new file mode 100644 index 000000000..4d55bc608 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/alsa-state/alsa-state/ccimx6ul/asound.play.state @@ -0,0 +1,127 @@ +state.sgtl5000audio { + control.1 { + iface MIXER + name 'PCM Playback Volume' + value.0 144 + value.1 144 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 192' + } + } + control.2 { + iface MIXER + name 'Capture Volume' + value.0 12 + value.1 12 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 15' + } + } + control.3 { + iface MIXER + name 'Capture Attenuate Switch (-6dB)' + value 1 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 2' + dbmin -600 + dbmax 600 + dbvalue.0 0 + } + } + control.4 { + iface MIXER + name 'Capture ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.5 { + iface MIXER + name 'Headphone Playback Volume' + value.0 105 + value.1 105 + comment { + access 'read write' + type INTEGER + count 2 + range '0 - 127' + dbmin -5150 + dbmax 1200 + dbvalue.0 100 + dbvalue.1 100 + } + } + control.6 { + iface MIXER + name 'Headphone Playback ZC Switch' + value true + comment { + access 'read write' + type BOOLEAN + count 1 + } + } + control.7 { + iface MIXER + name 'Mic Volume' + value 2 + comment { + access 'read write' + type INTEGER + count 1 + range '0 - 3' + dbmin 0 + dbmax 4000 + dbvalue.0 3000 + } + } + control.8 { + iface MIXER + name 'Headphone Mux' + value DAC + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 DAC + item.1 LINE_IN + } + } + control.9 { + iface MIXER + name 'Capture Mux' + value MIC_IN + comment { + access 'read write' + type ENUMERATED + count 1 + item.0 MIC_IN + item.1 LINE_IN + } + } +} + +state.imxhdmisoc { + control.1 { + iface MIXER + name 'IEC958 Playback Default' + value '0400220300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' + comment { + access 'read write volatile' + type IEC958 + count 1 + } + } +} From d5501d31c6aaa69b277c5359c43e30d0db0b3dd1 Mon Sep 17 00:00:00 2001 From: Arturo Buzarra Date: Thu, 26 May 2016 13:58:10 +0200 Subject: [PATCH 009/117] dey.conf: update distro version to 2.0-r2 Signed-off-by: Arturo Buzarra --- meta-digi-dey/conf/distro/dey.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index d095b350d..f550fb473 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -1,6 +1,6 @@ DISTRO = "dey" DISTRO_NAME = "Digi Embedded Yocto" -DISTRO_VERSION = "2.0-r1" +DISTRO_VERSION = "2.0-r2" DISTRO_CODENAME = "jethro" SDK_VENDOR = "-deysdk" SDK_VERSION := "${@'${DISTRO_VERSION}'}" From 6e717090758814316e27f4686145e6313de38e42 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 11 May 2016 17:58:48 +0200 Subject: [PATCH 010/117] meta-digi-arm: enable NXP's CAAM support This enables the Cryptographic Accelerator and Assurance Module (CAAM). https://jira.digi.com/browse/DEL-2502 Signed-off-by: Javier Viguera --- .../recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig b/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig index 33fe2f75d..e6794fa5c 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig @@ -147,7 +147,6 @@ CONFIG_SERIAL_IMX_CONSOLE=y CONFIG_SERIAL_FSL_LPUART=y CONFIG_SERIAL_FSL_LPUART_CONSOLE=y CONFIG_FSL_OTP=y -CONFIG_HW_RANDOM=y # CONFIG_I2C_COMPAT is not set CONFIG_I2C_CHARDEV=y # CONFIG_I2C_HELPER_AUTO is not set @@ -301,5 +300,5 @@ CONFIG_SECURITYFS=y CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_ANSI_CPRNG is not set -# CONFIG_CRYPTO_HW is not set +CONFIG_CRYPTO_DEV_FSL_CAAM=y CONFIG_FONTS=y From 951627ea02dc6851965ff6977a9e581d336ec070 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 11 May 2016 18:01:32 +0200 Subject: [PATCH 011/117] cryptodev: install cryptodev-module for CC6 This module is the interface between user-space (openssl, gnutls) and the hardware cryptographic acceleration support (CAAM). This commit installs the module in the rootfs and configures it so it is loaded on boot. https://jira.digi.com/browse/DEL-2501 Signed-off-by: Javier Viguera --- meta-digi-arm/conf/machine/include/ccimx6.inc | 2 +- .../recipes-kernel/cryptodev/cryptodev-module_%.bbappend | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 meta-digi-arm/recipes-kernel/cryptodev/cryptodev-module_%.bbappend diff --git a/meta-digi-arm/conf/machine/include/ccimx6.inc b/meta-digi-arm/conf/machine/include/ccimx6.inc index b5a22f3aa..bdca7707a 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6.inc @@ -30,6 +30,6 @@ MACHINE_EXTRA_RDEPENDS += " \ u-boot-fw-utils \ " MACHINE_EXTRA_RRECOMMENDS += "${MACHINE_FIRMWARE} ${WIRELESS_MODULE}" -MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins" +MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins cryptodev-module" MACHINE_FEATURES += "accel-graphics accel-video wifi bluetooth" diff --git a/meta-digi-arm/recipes-kernel/cryptodev/cryptodev-module_%.bbappend b/meta-digi-arm/recipes-kernel/cryptodev/cryptodev-module_%.bbappend new file mode 100644 index 000000000..087f298e1 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/cryptodev/cryptodev-module_%.bbappend @@ -0,0 +1,3 @@ +# Copyright (C) 2016 Digi International. + +KERNEL_MODULE_AUTOLOAD = "cryptodev" From 2a8e1d7002e4482f93ff628b0c8b1209a42e1748 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Fri, 13 May 2016 10:58:11 +0200 Subject: [PATCH 012/117] openssl: update cryptodev engine implementation As of Yocto 2.0, the cryptodev module used as interface between user-space and hardware encryption is the version 1.7. According to that cryptodev's version documentation, the cryptodev engine in openssh is outdated: https://github.com/cryptodev-linux/cryptodev-linux/blob/cryptodev-linux-1.7/README They provide an URL with two patches to update openssl. This commit forward port those patches to the Openssl version used in this version of Yocto. https://jira.digi.com/browse/DEL-2501 Signed-off-by: Javier Viguera --- ...-Fix-issue-with-signature-generation.patch | 449 ++++++++++++++++++ ...cryptodev-allow-copying-EVP-contexts.patch | 203 ++++++++ .../openssl/openssl_%.bbappend | 8 + 3 files changed, 660 insertions(+) create mode 100644 meta-digi-dey/recipes-connectivity/openssl/openssl/0001-cryptodev-Fix-issue-with-signature-generation.patch create mode 100644 meta-digi-dey/recipes-connectivity/openssl/openssl/0002-cryptodev-allow-copying-EVP-contexts.patch create mode 100644 meta-digi-dey/recipes-connectivity/openssl/openssl_%.bbappend diff --git a/meta-digi-dey/recipes-connectivity/openssl/openssl/0001-cryptodev-Fix-issue-with-signature-generation.patch b/meta-digi-dey/recipes-connectivity/openssl/openssl/0001-cryptodev-Fix-issue-with-signature-generation.patch new file mode 100644 index 000000000..53b45b1ad --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/openssl/openssl/0001-cryptodev-Fix-issue-with-signature-generation.patch @@ -0,0 +1,449 @@ +From: Nikos Mavrogiannopoulos +Date: Wed, 11 May 2016 12:07:15 +0200 +Subject: [PATCH] cryptodev: Fix issue with signature generation + +That patch also enables support for SHA2 hashes, and removes support +for hashes that were never supported by cryptodev. + +Forward port of patch from: +https://rt.openssl.org/Ticket/Display.html?id=2770&user=guest&pass=guest + +Signed-off-by: Javier Viguera +--- + crypto/engine/eng_cryptodev.c | 197 +++++++++++++++++++++++++++++++----------- + 1 file changed, 147 insertions(+), 50 deletions(-) + +diff --git a/crypto/engine/eng_cryptodev.c b/crypto/engine/eng_cryptodev.c +index 926d95c0d7fc..d3554b4eaecd 100644 +--- a/crypto/engine/eng_cryptodev.c ++++ b/crypto/engine/eng_cryptodev.c +@@ -2,6 +2,7 @@ + * Copyright (c) 2002 Bob Beck + * Copyright (c) 2002 Theo de Raadt + * Copyright (c) 2002 Markus Friedl ++ * Copyright (c) 2012 Nikos Mavrogiannopoulos + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without +@@ -72,7 +73,6 @@ struct dev_crypto_state { + struct session_op d_sess; + int d_fd; + # ifdef USE_CRYPTODEV_DIGESTS +- char dummy_mac_key[HASH_MAX_LEN]; + unsigned char digest_res[HASH_MAX_LEN]; + char *mac_data; + int mac_len; +@@ -189,8 +189,10 @@ static struct { + static struct { + int id; + int nid; +- int keylen; ++ int digestlen; + } digests[] = { ++#if 0 ++ /* HMAC is not supported */ + { + CRYPTO_MD5_HMAC, NID_hmacWithMD5, 16 + }, +@@ -198,15 +200,15 @@ static struct { + CRYPTO_SHA1_HMAC, NID_hmacWithSHA1, 20 + }, + { +- CRYPTO_RIPEMD160_HMAC, NID_ripemd160, 16 +- /* ? */ ++ CRYPTO_SHA2_256_HMAC, NID_hmacWithSHA256, 32 + }, + { +- CRYPTO_MD5_KPDK, NID_undef, 0 ++ CRYPTO_SHA2_384_HMAC, NID_hmacWithSHA384, 48 + }, + { +- CRYPTO_SHA1_KPDK, NID_undef, 0 ++ CRYPTO_SHA2_512_HMAC, NID_hmacWithSHA512, 64 + }, ++#endif + { + CRYPTO_MD5, NID_md5, 16 + }, +@@ -214,6 +216,15 @@ static struct { + CRYPTO_SHA1, NID_sha1, 20 + }, + { ++ CRYPTO_SHA2_256, NID_sha256, 32 ++ }, ++ { ++ CRYPTO_SHA2_384, NID_sha384, 48 ++ }, ++ { ++ CRYPTO_SHA2_512, NID_sha512, 64 ++ }, ++ { + 0, NID_undef, 0 + }, + }; +@@ -288,13 +299,14 @@ static int get_cryptodev_ciphers(const int **cnids) + static int nids[CRYPTO_ALGORITHM_MAX]; + struct session_op sess; + int fd, i, count = 0; ++ unsigned char fake_key[CRYPTO_CIPHER_MAX_KEY_LEN]; + + if ((fd = get_dev_crypto()) < 0) { + *cnids = NULL; + return (0); + } + memset(&sess, 0, sizeof(sess)); +- sess.key = (caddr_t) "123456789abcdefghijklmno"; ++ sess.key = (void*)fake_key; + + for (i = 0; ciphers[i].id && count < CRYPTO_ALGORITHM_MAX; i++) { + if (ciphers[i].nid == NID_undef) +@@ -325,6 +337,7 @@ static int get_cryptodev_ciphers(const int **cnids) + static int get_cryptodev_digests(const int **cnids) + { + static int nids[CRYPTO_ALGORITHM_MAX]; ++ unsigned char fake_key[CRYPTO_CIPHER_MAX_KEY_LEN]; + struct session_op sess; + int fd, i, count = 0; + +@@ -333,12 +346,12 @@ static int get_cryptodev_digests(const int **cnids) + return (0); + } + memset(&sess, 0, sizeof(sess)); +- sess.mackey = (caddr_t) "123456789abcdefghijklmno"; ++ sess.mackey = fake_key; + for (i = 0; digests[i].id && count < CRYPTO_ALGORITHM_MAX; i++) { + if (digests[i].nid == NID_undef) + continue; + sess.mac = digests[i].id; +- sess.mackeylen = digests[i].keylen; ++ sess.mackeylen = 8; + sess.cipher = 0; + if (ioctl(fd, CIOCGSESSION, &sess) != -1 && + ioctl(fd, CIOCFSESSION, &sess.ses) != -1) +@@ -424,14 +437,14 @@ cryptodev_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, + cryp.ses = sess->ses; + cryp.flags = 0; + cryp.len = inl; +- cryp.src = (caddr_t) in; +- cryp.dst = (caddr_t) out; ++ cryp.src = (void*) in; ++ cryp.dst = (void*) out; + cryp.mac = 0; + + cryp.op = ctx->encrypt ? COP_ENCRYPT : COP_DECRYPT; + + if (ctx->cipher->iv_len) { +- cryp.iv = (caddr_t) ctx->iv; ++ cryp.iv = (void*) ctx->iv; + if (!ctx->encrypt) { + iiv = in + inl - ctx->cipher->iv_len; + memcpy(save_iv, iiv, ctx->cipher->iv_len); +@@ -483,7 +496,7 @@ cryptodev_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, + if ((state->d_fd = get_dev_crypto()) < 0) + return (0); + +- sess->key = (caddr_t) key; ++ sess->key = (void*)key; + sess->keylen = ctx->key_len; + sess->cipher = cipher; + +@@ -749,16 +762,6 @@ static int digest_nid_to_cryptodev(int nid) + return (0); + } + +-static int digest_key_length(int nid) +-{ +- int i; +- +- for (i = 0; digests[i].id; i++) +- if (digests[i].nid == nid) +- return digests[i].keylen; +- return (0); +-} +- + static int cryptodev_digest_init(EVP_MD_CTX *ctx) + { + struct dev_crypto_state *state = ctx->md_data; +@@ -769,7 +772,6 @@ static int cryptodev_digest_init(EVP_MD_CTX *ctx) + printf("cryptodev_digest_init: Can't get digest \n"); + return (0); + } +- + memset(state, 0, sizeof(struct dev_crypto_state)); + + if ((state->d_fd = get_dev_crypto()) < 0) { +@@ -777,8 +779,8 @@ static int cryptodev_digest_init(EVP_MD_CTX *ctx) + return (0); + } + +- sess->mackey = state->dummy_mac_key; +- sess->mackeylen = digest_key_length(ctx->digest->type); ++ sess->mackey = NULL; ++ sess->mackeylen = 0; + sess->mac = digest; + + if (ioctl(state->d_fd, CIOCGSESSION, sess) < 0) { +@@ -794,8 +796,8 @@ static int cryptodev_digest_init(EVP_MD_CTX *ctx) + static int cryptodev_digest_update(EVP_MD_CTX *ctx, const void *data, + size_t count) + { +- struct crypt_op cryp; + struct dev_crypto_state *state = ctx->md_data; ++ struct crypt_op cryp; + struct session_op *sess = &state->d_sess; + + if (!data || state->d_fd < 0) { +@@ -804,7 +806,7 @@ static int cryptodev_digest_update(EVP_MD_CTX *ctx, const void *data, + } + + if (!count) { +- return (0); ++ return (1); + } + + if (!(ctx->flags & EVP_MD_CTX_FLAG_ONESHOT)) { +@@ -828,9 +830,9 @@ static int cryptodev_digest_update(EVP_MD_CTX *ctx, const void *data, + cryp.ses = sess->ses; + cryp.flags = 0; + cryp.len = count; +- cryp.src = (caddr_t) data; ++ cryp.src = (void*) data; + cryp.dst = NULL; +- cryp.mac = (caddr_t) state->digest_res; ++ cryp.mac = (void*) state->digest_res; + if (ioctl(state->d_fd, CIOCCRYPT, &cryp) < 0) { + printf("cryptodev_digest_update: digest failed\n"); + return (0); +@@ -844,8 +846,6 @@ static int cryptodev_digest_final(EVP_MD_CTX *ctx, unsigned char *md) + struct dev_crypto_state *state = ctx->md_data; + struct session_op *sess = &state->d_sess; + +- int ret = 1; +- + if (!md || state->d_fd < 0) { + printf("cryptodev_digest_final: illegal input\n"); + return (0); +@@ -859,7 +859,7 @@ static int cryptodev_digest_final(EVP_MD_CTX *ctx, unsigned char *md) + cryp.len = state->mac_len; + cryp.src = state->mac_data; + cryp.dst = NULL; +- cryp.mac = (caddr_t) md; ++ cryp.mac = (void*)md; + if (ioctl(state->d_fd, CIOCCRYPT, &cryp) < 0) { + printf("cryptodev_digest_final: digest failed\n"); + return (0); +@@ -870,7 +870,7 @@ static int cryptodev_digest_final(EVP_MD_CTX *ctx, unsigned char *md) + + memcpy(md, state->digest_res, ctx->digest->md_size); + +- return (ret); ++ return 1; + } + + static int cryptodev_digest_cleanup(EVP_MD_CTX *ctx) +@@ -921,8 +921,8 @@ static int cryptodev_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from) + + digest = digest_nid_to_cryptodev(to->digest->type); + +- sess->mackey = dstate->dummy_mac_key; +- sess->mackeylen = digest_key_length(to->digest->type); ++ sess->mackey = NULL; ++ sess->mackeylen = 0; + sess->mac = digest; + + dstate->d_fd = get_dev_crypto(); +@@ -945,34 +945,118 @@ static int cryptodev_digest_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from) + return 1; + } + +-const EVP_MD cryptodev_sha1 = { ++static const EVP_MD cryptodev_sha1 = { + NID_sha1, +- NID_undef, ++ NID_sha1WithRSAEncryption, + SHA_DIGEST_LENGTH, ++#if defined(EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) && defined(EVP_MD_FLAG_DIGALGID_ABSENT) ++ EVP_MD_FLAG_PKEY_METHOD_SIGNATURE| ++ EVP_MD_FLAG_DIGALGID_ABSENT| ++#endif + EVP_MD_FLAG_ONESHOT, + cryptodev_digest_init, + cryptodev_digest_update, + cryptodev_digest_final, + cryptodev_digest_copy, + cryptodev_digest_cleanup, +- EVP_PKEY_NULL_method, ++ EVP_PKEY_RSA_method, + SHA_CBLOCK, +- sizeof(struct dev_crypto_state), ++ sizeof(EVP_MD *)+sizeof(struct dev_crypto_state), + }; + +-const EVP_MD cryptodev_md5 = { ++static const EVP_MD cryptodev_sha256 = { ++ NID_sha256, ++ NID_sha256WithRSAEncryption, ++ SHA256_DIGEST_LENGTH, ++#if defined(EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) && defined(EVP_MD_FLAG_DIGALGID_ABSENT) ++ EVP_MD_FLAG_PKEY_METHOD_SIGNATURE| ++ EVP_MD_FLAG_DIGALGID_ABSENT| ++#endif ++ EVP_MD_FLAG_ONESHOT, ++ cryptodev_digest_init, ++ cryptodev_digest_update, ++ cryptodev_digest_final, ++ cryptodev_digest_copy, ++ cryptodev_digest_cleanup, ++ EVP_PKEY_RSA_method, ++ SHA256_CBLOCK, ++ sizeof(EVP_MD *)+sizeof(struct dev_crypto_state), ++}; ++ ++static const EVP_MD cryptodev_sha224 = { ++ NID_sha224, ++ NID_sha224WithRSAEncryption, ++ SHA224_DIGEST_LENGTH, ++#if defined(EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) && defined(EVP_MD_FLAG_DIGALGID_ABSENT) ++ EVP_MD_FLAG_PKEY_METHOD_SIGNATURE| ++ EVP_MD_FLAG_DIGALGID_ABSENT| ++#endif ++ EVP_MD_FLAG_ONESHOT, ++ cryptodev_digest_init, ++ cryptodev_digest_update, ++ cryptodev_digest_final, ++ cryptodev_digest_copy, ++ cryptodev_digest_cleanup, ++ EVP_PKEY_RSA_method, ++ SHA256_CBLOCK, ++ sizeof(EVP_MD *)+sizeof(struct dev_crypto_state), ++}; ++ ++static const EVP_MD cryptodev_sha384 = { ++ NID_sha384, ++ NID_sha384WithRSAEncryption, ++ SHA384_DIGEST_LENGTH, ++#if defined(EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) && defined(EVP_MD_FLAG_DIGALGID_ABSENT) ++ EVP_MD_FLAG_PKEY_METHOD_SIGNATURE| ++ EVP_MD_FLAG_DIGALGID_ABSENT| ++#endif ++ EVP_MD_FLAG_ONESHOT, ++ cryptodev_digest_init, ++ cryptodev_digest_update, ++ cryptodev_digest_final, ++ cryptodev_digest_copy, ++ cryptodev_digest_cleanup, ++ EVP_PKEY_RSA_method, ++ SHA512_CBLOCK, ++ sizeof(EVP_MD *)+sizeof(struct dev_crypto_state), ++}; ++ ++static const EVP_MD cryptodev_sha512 = { ++ NID_sha512, ++ NID_sha512WithRSAEncryption, ++ SHA512_DIGEST_LENGTH, ++#if defined(EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) && defined(EVP_MD_FLAG_DIGALGID_ABSENT) ++ EVP_MD_FLAG_PKEY_METHOD_SIGNATURE| ++ EVP_MD_FLAG_DIGALGID_ABSENT| ++#endif ++ EVP_MD_FLAG_ONESHOT, ++ cryptodev_digest_init, ++ cryptodev_digest_update, ++ cryptodev_digest_final, ++ cryptodev_digest_copy, ++ cryptodev_digest_cleanup, ++ EVP_PKEY_RSA_method, ++ SHA512_CBLOCK, ++ sizeof(EVP_MD *)+sizeof(struct dev_crypto_state), ++}; ++ ++static const EVP_MD cryptodev_md5 = { + NID_md5, +- NID_undef, ++ NID_md5WithRSAEncryption, + 16 /* MD5_DIGEST_LENGTH */ , ++#if defined(EVP_MD_FLAG_PKEY_METHOD_SIGNATURE) && defined(EVP_MD_FLAG_DIGALGID_ABSENT) ++ EVP_MD_FLAG_PKEY_METHOD_SIGNATURE| ++ EVP_MD_FLAG_DIGALGID_ABSENT| ++#endif + EVP_MD_FLAG_ONESHOT, + cryptodev_digest_init, + cryptodev_digest_update, + cryptodev_digest_final, + cryptodev_digest_copy, + cryptodev_digest_cleanup, +- EVP_PKEY_NULL_method, ++ EVP_PKEY_RSA_method, + 64 /* MD5_CBLOCK */ , +- sizeof(struct dev_crypto_state), ++ sizeof(EVP_MD *)+sizeof(struct dev_crypto_state), + }; + + # endif /* USE_CRYPTODEV_DIGESTS */ +@@ -992,6 +1076,18 @@ cryptodev_engine_digests(ENGINE *e, const EVP_MD **digest, + case NID_sha1: + *digest = &cryptodev_sha1; + break; ++ case NID_sha224: ++ *digest = &cryptodev_sha224; ++ break; ++ case NID_sha256: ++ *digest = &cryptodev_sha256; ++ break; ++ case NID_sha384: ++ *digest = &cryptodev_sha384; ++ break; ++ case NID_sha512: ++ *digest = &cryptodev_sha512; ++ break; + default: + # endif /* USE_CRYPTODEV_DIGESTS */ + *digest = NULL; +@@ -1022,7 +1118,7 @@ static int bn2crparam(const BIGNUM *a, struct crparam *crp) + return (1); + memset(b, 0, bytes); + +- crp->crp_p = (caddr_t) b; ++ crp->crp_p = (void*) b; + crp->crp_nbits = bits; + + for (i = 0, j = 0; i < a->top; i++) { +@@ -1277,7 +1373,7 @@ static DSA_SIG *cryptodev_dsa_do_sign(const unsigned char *dgst, int dlen, + kop.crk_op = CRK_DSA_SIGN; + + /* inputs: dgst dsa->p dsa->q dsa->g dsa->priv_key */ +- kop.crk_param[0].crp_p = (caddr_t) dgst; ++ kop.crk_param[0].crp_p = (void*)dgst; + kop.crk_param[0].crp_nbits = dlen * 8; + if (bn2crparam(dsa->p, &kop.crk_param[1])) + goto err; +@@ -1317,7 +1413,7 @@ cryptodev_dsa_verify(const unsigned char *dgst, int dlen, + kop.crk_op = CRK_DSA_VERIFY; + + /* inputs: dgst dsa->p dsa->q dsa->g dsa->pub_key sig->r sig->s */ +- kop.crk_param[0].crp_p = (caddr_t) dgst; ++ kop.crk_param[0].crp_p = (void*)dgst; + kop.crk_param[0].crp_nbits = dlen * 8; + if (bn2crparam(dsa->p, &kop.crk_param[1])) + goto err; +@@ -1398,9 +1494,10 @@ cryptodev_dh_compute_key(unsigned char *key, const BIGNUM *pub_key, DH *dh) + goto err; + kop.crk_iparams = 3; + +- kop.crk_param[3].crp_p = (caddr_t) key; +- kop.crk_param[3].crp_nbits = keylen * 8; ++ kop.crk_param[3].crp_p = (void*) key; ++ kop.crk_param[3].crp_nbits = keylen; + kop.crk_oparams = 1; ++ dhret = keylen/8; + + if (ioctl(fd, CIOCKEY, &kop) == -1) { + const DH_METHOD *meth = DH_OpenSSL(); +@@ -1470,7 +1567,7 @@ void ENGINE_load_cryptodev(void) + put_dev_crypto(fd); + + if (!ENGINE_set_id(engine, "cryptodev") || +- !ENGINE_set_name(engine, "BSD cryptodev engine") || ++ !ENGINE_set_name(engine, "cryptodev engine") || + !ENGINE_set_ciphers(engine, cryptodev_engine_ciphers) || + !ENGINE_set_digests(engine, cryptodev_engine_digests) || + !ENGINE_set_ctrl_function(engine, cryptodev_ctrl) || diff --git a/meta-digi-dey/recipes-connectivity/openssl/openssl/0002-cryptodev-allow-copying-EVP-contexts.patch b/meta-digi-dey/recipes-connectivity/openssl/openssl/0002-cryptodev-allow-copying-EVP-contexts.patch new file mode 100644 index 000000000..087b85b50 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/openssl/openssl/0002-cryptodev-allow-copying-EVP-contexts.patch @@ -0,0 +1,203 @@ +From: Nikos Mavrogiannopoulos +Date: Wed, 11 May 2016 12:33:20 +0200 +Subject: [PATCH] cryptodev: allow copying EVP contexts + +Forward port of patch from: +https://rt.openssl.org/Ticket/Display.html?id=2770&user=guest&pass=guest + +Signed-off-by: Javier Viguera +--- + crypto/engine/eng_cryptodev.c | 57 ++++++++++++++++++++++++++----------------- + 1 file changed, 35 insertions(+), 22 deletions(-) + +diff --git a/crypto/engine/eng_cryptodev.c b/crypto/engine/eng_cryptodev.c +index d3554b4eaecd..47e292f5e3c0 100644 +--- a/crypto/engine/eng_cryptodev.c ++++ b/crypto/engine/eng_cryptodev.c +@@ -547,151 +547,164 @@ static int cryptodev_cleanup(EVP_CIPHER_CTX *ctx) + * gets called when libcrypto requests a cipher NID. + */ + ++static int cryptodev_cipher_ctrl(EVP_CIPHER_CTX *ctx, int type, int p1, void *p2) ++{ ++ struct dev_crypto_state *state = ctx->cipher_data; ++ struct session_op *sess = &state->d_sess; ++ ++ if (type == EVP_CTRL_COPY) { ++ EVP_CIPHER_CTX *out = p2; ++ return cryptodev_init_key(out, sess->key, ctx->iv, 0); ++ } ++ ++ return 0; ++} ++ + /* RC4 */ + const EVP_CIPHER cryptodev_rc4 = { + NID_rc4, + 1, 16, 0, +- EVP_CIPH_VARIABLE_LENGTH, ++ EVP_CIPH_VARIABLE_LENGTH|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + NULL, + NULL, +- NULL ++ cryptodev_cipher_ctrl + }; + + /* DES CBC EVP */ + const EVP_CIPHER cryptodev_des_cbc = { + NID_des_cbc, + 8, 8, 8, +- EVP_CIPH_CBC_MODE, ++ EVP_CIPH_CBC_MODE|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, +- NULL ++ cryptodev_cipher_ctrl + }; + + /* 3DES CBC EVP */ + const EVP_CIPHER cryptodev_3des_cbc = { + NID_des_ede3_cbc, + 8, 24, 8, +- EVP_CIPH_CBC_MODE, ++ EVP_CIPH_CBC_MODE|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, +- NULL ++ cryptodev_cipher_ctrl + }; + + const EVP_CIPHER cryptodev_bf_cbc = { + NID_bf_cbc, + 8, 16, 8, +- EVP_CIPH_CBC_MODE, ++ EVP_CIPH_CBC_MODE|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, +- NULL ++ cryptodev_cipher_ctrl + }; + + const EVP_CIPHER cryptodev_cast_cbc = { + NID_cast5_cbc, + 8, 16, 8, +- EVP_CIPH_CBC_MODE, ++ EVP_CIPH_CBC_MODE|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, +- NULL ++ cryptodev_cipher_ctrl + }; + + const EVP_CIPHER cryptodev_aes_cbc = { + NID_aes_128_cbc, + 16, 16, 16, +- EVP_CIPH_CBC_MODE, ++ EVP_CIPH_CBC_MODE|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, +- NULL ++ cryptodev_cipher_ctrl + }; + + const EVP_CIPHER cryptodev_aes_192_cbc = { + NID_aes_192_cbc, + 16, 24, 16, +- EVP_CIPH_CBC_MODE, ++ EVP_CIPH_CBC_MODE|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, +- NULL ++ cryptodev_cipher_ctrl + }; + + const EVP_CIPHER cryptodev_aes_256_cbc = { + NID_aes_256_cbc, + 16, 32, 16, +- EVP_CIPH_CBC_MODE, ++ EVP_CIPH_CBC_MODE|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, +- NULL ++ cryptodev_cipher_ctrl + }; + + # ifdef CRYPTO_AES_CTR + const EVP_CIPHER cryptodev_aes_ctr = { + NID_aes_128_ctr, + 16, 16, 14, +- EVP_CIPH_CTR_MODE, ++ EVP_CIPH_CTR_MODE|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, +- NULL ++ cryptodev_cipher_ctrl + }; + + const EVP_CIPHER cryptodev_aes_ctr_192 = { + NID_aes_192_ctr, + 16, 24, 14, +- EVP_CIPH_CTR_MODE, ++ EVP_CIPH_CTR_MODE|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, +- NULL ++ cryptodev_cipher_ctrl + }; + + const EVP_CIPHER cryptodev_aes_ctr_256 = { + NID_aes_256_ctr, + 16, 32, 14, +- EVP_CIPH_CTR_MODE, ++ EVP_CIPH_CTR_MODE|EVP_CIPH_CUSTOM_COPY, + cryptodev_init_key, + cryptodev_cipher, + cryptodev_cleanup, + sizeof(struct dev_crypto_state), + EVP_CIPHER_set_asn1_iv, + EVP_CIPHER_get_asn1_iv, +- NULL ++ cryptodev_cipher_ctrl + }; + # endif + /* diff --git a/meta-digi-dey/recipes-connectivity/openssl/openssl_%.bbappend b/meta-digi-dey/recipes-connectivity/openssl/openssl_%.bbappend new file mode 100644 index 000000000..2f4503192 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/openssl/openssl_%.bbappend @@ -0,0 +1,8 @@ +# Copyright (C) 2016 Digi International. + +FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" + +SRC_URI += " \ + file://0001-cryptodev-Fix-issue-with-signature-generation.patch \ + file://0002-cryptodev-allow-copying-EVP-contexts.patch \ +" From 988ca78f31ece281ed21511aff46e81b3be3d756 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Mon, 16 May 2016 18:46:47 +0200 Subject: [PATCH 013/117] meta-digi-arm: add rng-tools for CC6 This daemon (rngd) feeds random data from hardware device to kernel entropy pool. https://jira.digi.com/browse/DEL-2501 Signed-off-by: Javier Viguera --- meta-digi-arm/conf/machine/include/ccimx6.inc | 2 +- meta-digi-dey/recipes-support/rng-tools/rng-tools/default | 2 ++ meta-digi-dey/recipes-support/rng-tools/rng-tools_%.bbappend | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 meta-digi-dey/recipes-support/rng-tools/rng-tools/default create mode 100644 meta-digi-dey/recipes-support/rng-tools/rng-tools_%.bbappend diff --git a/meta-digi-arm/conf/machine/include/ccimx6.inc b/meta-digi-arm/conf/machine/include/ccimx6.inc index bdca7707a..b0d4e2a7c 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6.inc @@ -30,6 +30,6 @@ MACHINE_EXTRA_RDEPENDS += " \ u-boot-fw-utils \ " MACHINE_EXTRA_RRECOMMENDS += "${MACHINE_FIRMWARE} ${WIRELESS_MODULE}" -MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins cryptodev-module" +MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins cryptodev-module rng-tools" MACHINE_FEATURES += "accel-graphics accel-video wifi bluetooth" diff --git a/meta-digi-dey/recipes-support/rng-tools/rng-tools/default b/meta-digi-dey/recipes-support/rng-tools/rng-tools/default new file mode 100644 index 000000000..ab7cd9327 --- /dev/null +++ b/meta-digi-dey/recipes-support/rng-tools/rng-tools/default @@ -0,0 +1,2 @@ +# Specify rng device +RNG_DEVICE=/dev/hwrng diff --git a/meta-digi-dey/recipes-support/rng-tools/rng-tools_%.bbappend b/meta-digi-dey/recipes-support/rng-tools/rng-tools_%.bbappend new file mode 100644 index 000000000..01631c66d --- /dev/null +++ b/meta-digi-dey/recipes-support/rng-tools/rng-tools_%.bbappend @@ -0,0 +1,3 @@ +# Copyright (C) 2016 Digi International. + +FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" From 49f55ce7d09de545d22a4a304062d973f73bb9e2 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Fri, 27 May 2016 18:25:35 +0200 Subject: [PATCH 014/117] u-boot: u-boot: use v2015.04 master branch 'v2015.04/master' is the branch with Trustfence support. Signed-off-by: Javier Viguera --- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 90844408c..8ae9e66eb 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -10,7 +10,7 @@ DEPENDS += "dtc-native u-boot-mkimage-native" PROVIDES += "u-boot" -SRCBRANCH = "v2015.04/maint" +SRCBRANCH = "v2015.04/master" SRCBRANCH_ccimx6ul = "v2015.04/master" SRCREV = "${AUTOREV}" From 2edc86c877a1bd21ee7ebd5e76b524ddcb481f18 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Fri, 27 May 2016 19:16:14 +0200 Subject: [PATCH 015/117] meta-digi-arm: more kernel config options for CAAM This enables the Cryptographic Accelerator and Assurance Module (CAAM). https://jira.digi.com/browse/DEL-2502 Signed-off-by: Javier Viguera --- .../recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig b/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig index e6794fa5c..a8515423c 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig @@ -297,6 +297,8 @@ CONFIG_DEBUG_FS=y # CONFIG_FTRACE is not set # CONFIG_ARM_UNWIND is not set CONFIG_SECURITYFS=y +# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set +CONFIG_CRYPTO_TEST=m CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_ANSI_CPRNG is not set From 325c3b9da9bc6597285bf6305eb3dbd640f94721 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 26 May 2016 10:18:16 +0200 Subject: [PATCH 016/117] bluez5: add support for qca6564 bluetooth chip Port the bluez5 qca6564 support based on 5.19 to the current version 5.33. The ported version is based on qualcomm tag r110048.3. https://jira.digi.com/browse/DEL-2581 Signed-off-by: Isaac Hermida --- .../bluez/{bluez5 => bluez5-5.33}/bluez-init | 0 ...d-bluetooth-support-for-QCA6174-chip.patch | 2066 +++++++++++++++++ ...-bluetooth-low-power-mode-functional.patch | 28 + ...ix-bug-in-firmware-parsing-mechanism.patch | 51 + .../0004-bluetooth-Configure-BD-Address.patch | 114 + ...-unused-functions-in-the-firmware-do.patch | 73 + ...tooth-Enable-3Mbps-baud-rate-support.patch | 150 ++ ...TTY-buffer-for-data-availability-bef.patch | 189 ++ ...upport-for-TUFEELO-firmware-download.patch | 44 + ...uetooth-Add-support-for-ROME-3.2-SOC.patch | 236 ++ ...rrect-TTY-ioctl-calls-for-flow-contr.patch | 189 ++ ...ooth-Add-support-for-multi-baud-rate.patch | 256 ++ ...ttings-by-reading-configuration-file.patch | 144 ++ ...0013-Add-support-for-Tufello-1.1-SOC.patch | 169 ++ ...ART-CLK-ON-prior-to-firmware-downloa.patch | 74 + ...ttings-by-reading-configuration-file.patch | 127 + ...ter-derefrencing-in-AVRCP-Target-rol.patch | 79 + ...bluetooth-Fix-flow-control-operation.patch | 52 + ...M-specific-code-under-_PLATFORM_MDM_.patch | 65 + ...Bluetooth-Fix-static-analysis-issues.patch | 58 + .../bluez/bluez5_%.bbappend | 16 - .../bluez/bluez5_5.33.bbappend | 41 + 22 files changed, 4205 insertions(+), 16 deletions(-) rename meta-digi-dey/recipes-connectivity/bluez/{bluez5 => bluez5-5.33}/bluez-init (100%) create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0001-bluetooth-Add-bluetooth-support-for-QCA6174-chip.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0002-bluetooth-Enable-bluetooth-low-power-mode-functional.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0003-bluetooth-Fix-bug-in-firmware-parsing-mechanism.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0004-bluetooth-Configure-BD-Address.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0005-bluetooth-Remove-unused-functions-in-the-firmware-do.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0006-bluetooth-Enable-3Mbps-baud-rate-support.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0007-bluetooth-Check-TTY-buffer-for-data-availability-bef.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0008-bluetooth-Add-support-for-TUFEELO-firmware-download.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0009-bluetooth-Add-support-for-ROME-3.2-SOC.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0010-bluetooth-Use-correct-TTY-ioctl-calls-for-flow-contr.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0011-bluetooth-Add-support-for-multi-baud-rate.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0012-Override-PCM-Settings-by-reading-configuration-file.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0013-Add-support-for-Tufello-1.1-SOC.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0014-bluetooth-Vote-UART-CLK-ON-prior-to-firmware-downloa.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0015-Override-IBS-settings-by-reading-configuration-file.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0016-Handle-NULL-Pointer-derefrencing-in-AVRCP-Target-rol.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0017-bluetooth-Fix-flow-control-operation.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0018-Adding-MDM-specific-code-under-_PLATFORM_MDM_.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0019-Bluetooth-Fix-static-analysis-issues.patch delete mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5_%.bbappend create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5_5.33.bbappend diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5/bluez-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init similarity index 100% rename from meta-digi-dey/recipes-connectivity/bluez/bluez5/bluez-init rename to meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0001-bluetooth-Add-bluetooth-support-for-QCA6174-chip.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0001-bluetooth-Add-bluetooth-support-for-QCA6174-chip.patch new file mode 100644 index 000000000..4a446da5d --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0001-bluetooth-Add-bluetooth-support-for-QCA6174-chip.patch @@ -0,0 +1,2066 @@ +From: Anantha Krishnan +Date: Tue, 19 Aug 2014 20:23:01 +0530 +Subject: [PATCH] bluetooth : Add bluetooth support for QCA6174 chip. + +Register the QCA6174 initialization routine with hciattach for +downloading firmware patches to the bluetooth controller. +Add optional support 'f' to control installation of line +discipline driver. Invoke hciattach from command line and +download the firmware patches: + hciattach /dev/ttyHS0 qca 3000000 -t120 flow -f0 + +Change-Id: I87f2927d7096904071a02d73d3afef0dc34db414 +Signed-off-by: Rupesh Tatiya +--- + Makefile.tools | 3 +- + tools/hciattach.c | 25 +- + tools/hciattach.h | 6 +- + tools/hciattach_rome.c | 1578 ++++++++++++++++++++++++++++++++++++++++++++++++ + tools/hciattach_rome.h | 317 ++++++++++ + 5 files changed, 1925 insertions(+), 4 deletions(-) + create mode 100644 tools/hciattach_rome.c + create mode 100644 tools/hciattach_rome.h + +diff --git a/Makefile.tools b/Makefile.tools +index e193be9f33aa..52c8581b5b58 100644 +--- a/Makefile.tools ++++ b/Makefile.tools +@@ -159,7 +159,8 @@ tools_hciattach_SOURCES = tools/hciattach.c tools/hciattach.h \ + tools/hciattach_ath3k.c \ + tools/hciattach_qualcomm.c \ + tools/hciattach_intel.c \ +- tools/hciattach_bcm43xx.c ++ tools/hciattach_bcm43xx.c \ ++ tools/hciattach_rome.c tools/hciattach_rome.h + tools_hciattach_LDADD = lib/libbluetooth-internal.la + + tools_hciconfig_SOURCES = tools/hciconfig.c tools/csr.h tools/csr.c +diff --git a/tools/hciattach.c b/tools/hciattach.c +index 4dc5be5635c7..d3917a0d503e 100644 +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -67,6 +67,8 @@ struct uart_t { + #define ENABLE_PM 1 + #define DISABLE_PM 0 + ++int line_disp = 1; ++ + static volatile sig_atomic_t __io_canceled = 0; + + static void sig_hup(int sig) +@@ -317,6 +319,12 @@ static int ath3k_pm(int fd, struct uart_t *u, struct termios *ti) + return ath3k_post(fd, u->pm); + } + ++static int qca(int fd, struct uart_t *u, struct termios *ti) ++{ ++ fprintf(stderr,"qca\n"); ++ return qca_soc_init(fd, u->bdaddr); ++} ++ + static int qualcomm(int fd, struct uart_t *u, struct termios *ti) + { + return qualcomm_init(fd, u->speed, ti, u->bdaddr); +@@ -1147,6 +1155,10 @@ struct uart_t uart[] = { + { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, + ++ /* QCA ROME */ ++ { "qca", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, ++ FLOW_CTL, DISABLE_PM, NULL, qca, NULL }, ++ + /* QUALCOMM BTS */ + { "qualcomm", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, qualcomm, NULL }, +@@ -1249,6 +1261,7 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) + goto fail; + } + ++if (line_disp) { + /* Set TTY to N_HCI line discipline */ + i = N_HCI; + if (ioctl(fd, TIOCSETD, &i) < 0) { +@@ -1265,6 +1278,7 @@ static int init_uart(char *dev, struct uart_t *u, int send_break, int raw) + perror("Can't set device"); + goto fail; + } ++} + + if (u->post && u->post(fd, u, &ti) < 0) + goto fail; +@@ -1303,7 +1317,7 @@ int main(int argc, char *argv[]) + printpid = 0; + raw = 0; + +- while ((opt=getopt(argc, argv, "bnpt:s:lr")) != EOF) { ++ while ((opt=getopt(argc, argv, "bnpt:s:lrf:")) != EOF) { + switch(opt) { + case 'b': + send_break = 1; +@@ -1336,6 +1350,11 @@ int main(int argc, char *argv[]) + raw = 1; + break; + ++ case 'f': ++ line_disp = atoi(optarg); ++ fprintf(stderr, "Line_disp val : %d\n", line_disp); ++ break; ++ + default: + usage(); + exit(1); +@@ -1398,6 +1417,7 @@ int main(int argc, char *argv[]) + case 5: + u->bdaddr = argv[optind]; + break; ++ + } + } + +@@ -1474,12 +1494,15 @@ int main(int argc, char *argv[]) + break; + } + ++if (line_disp) { + /* Restore TTY line discipline */ ++ fprintf(stderr, "Restoring the Line Discipline driver\n"); + ld = N_TTY; + if (ioctl(n, TIOCSETD, &ld) < 0) { + perror("Can't restore line discipline"); + exit(1); + } ++} + + return 0; + } +diff --git a/tools/hciattach.h b/tools/hciattach.h +index 909ada871df2..2021c33a9824 100644 +--- a/tools/hciattach.h ++++ b/tools/hciattach.h +@@ -39,8 +39,9 @@ + #define HCI_UART_H4DS 3 + #define HCI_UART_LL 4 + #define HCI_UART_ATH3K 5 +-#define HCI_UART_INTEL 6 +-#define HCI_UART_BCM 7 ++#define HCI_UART_IBS 6 ++#define HCI_UART_INTEL 7 ++#define HCI_UART_BCM 8 + + #define HCI_UART_RAW_DEVICE 0 + #define HCI_UART_RESET_ON_INIT 1 +@@ -62,6 +63,7 @@ int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, + struct termios *ti); + int ath3k_post(int fd, int pm); + int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr); ++int qca_soc_init(int fd, 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, + const char *bdaddr); +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +new file mode 100644 +index 000000000000..f31be43c09e4 +--- /dev/null ++++ b/tools/hciattach_rome.c +@@ -0,0 +1,1578 @@ ++/* ++ * ++ * Copyright (c) 2013, The Linux Foundation. All rights reserved. ++ * Not a Contribution. ++ * ++ * Copyright 2012 The Android Open Source Project ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); you ++ * may not use this file except in compliance with the License. You may ++ * obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or ++ * implied. See the License for the specific language governing ++ * permissions and limitations under the License. ++ * ++ */ ++ ++/****************************************************************************** ++ * ++ * Filename: hciattach_rome.c ++ * ++ * Description: Contains controller-specific functions, like ++ * firmware patch download ++ * low power mode operations ++ * ++ ******************************************************************************/ ++ ++#define LOG_TAG "bt_vendor" ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include "hciattach_rome.h" ++#include "hciattach.h" ++ ++#ifdef __cplusplus ++} ++#endif ++ ++ ++/****************************************************************************** ++** Variables ++******************************************************************************/ ++FILE *file; ++unsigned char *phdr_buffer; ++unsigned char *pdata_buffer = NULL; ++patch_info rampatch_patch_info; ++int rome_ver = ROME_VER_UNKNOWN; ++unsigned char gTlv_type; ++char *rampatch_file_path; ++char *nvm_file_path; ++vnd_userial_cb_t vnd_userial; ++/****************************************************************************** ++** Extern variables ++******************************************************************************/ ++//extern unsigned char vnd_local_bd_addr[6]; ++ ++/***************************************************************************** ++** Functions ++*****************************************************************************/ ++ ++/******************************************************************************* ++** ++** Function userial_to_tcio_baud ++** ++** Description helper function converts USERIAL baud rates into TCIO ++** conforming baud rates ++** ++** Returns TRUE/FALSE ++** ++*******************************************************************************/ ++unsigned char userial_to_tcio_baud(unsigned char cfg_baud, unsigned int *baud) ++{ ++ if (cfg_baud == USERIAL_BAUD_115200) ++ *baud = B115200; ++ else if (cfg_baud == USERIAL_BAUD_4M) ++ *baud = B4000000; ++ else if (cfg_baud == USERIAL_BAUD_3M) ++ *baud = B3000000; ++ else if (cfg_baud == USERIAL_BAUD_2M) ++ *baud = B2000000; ++ else if (cfg_baud == USERIAL_BAUD_1M) ++ *baud = B1000000; ++ else if (cfg_baud == USERIAL_BAUD_921600) ++ *baud = B921600; ++ else if (cfg_baud == USERIAL_BAUD_460800) ++ *baud = B460800; ++ else if (cfg_baud == USERIAL_BAUD_230400) ++ *baud = B230400; ++ else if (cfg_baud == USERIAL_BAUD_57600) ++ *baud = B57600; ++ else if (cfg_baud == USERIAL_BAUD_19200) ++ *baud = B19200; ++ else if (cfg_baud == USERIAL_BAUD_9600) ++ *baud = B9600; ++ else if (cfg_baud == USERIAL_BAUD_1200) ++ *baud = B1200; ++ else if (cfg_baud == USERIAL_BAUD_600) ++ *baud = B600; ++ else ++ { ++ fprintf(stderr, "userial vendor open: unsupported baud idx %i\n", cfg_baud); ++ *baud = B115200; ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++ ++/******************************************************************************* ++** ++** Function userial_vendor_set_baud ++** ++** Description Set new baud rate ++** ++** Returns None ++** ++*******************************************************************************/ ++void userial_vendor_set_baud(unsigned char userial_baud) ++{ ++ unsigned int tcio_baud; ++ fprintf(stderr, "## userial_vendor_set_baud: %d\n", userial_baud); ++ ++ userial_to_tcio_baud(userial_baud, &tcio_baud); ++ ++ cfsetospeed(&vnd_userial.termios, tcio_baud); ++ cfsetispeed(&vnd_userial.termios, tcio_baud); ++ tcsetattr(vnd_userial.fd, TCSADRAIN, &vnd_userial.termios); /* don't change speed until last write done */ ++ ++} ++ ++ ++/******************************************************************************* ++** ++** Function userial_vendor_ioctl ++** ++** Description ioctl inteface ++** ++** Returns None ++** ++*******************************************************************************/ ++int userial_vendor_ioctl(int fd, userial_vendor_ioctl_op_t op, int *p_data) ++{ ++ int err = -1; ++ struct termios ti; ++ ++ if (tcgetattr(fd, &ti) < 0) { ++ perror("Can't get port settings"); ++ return -1; ++ } ++ cfmakeraw(&ti); ++ ti.c_cflag |= CLOCAL; ++ ++ switch(op) ++ { ++#if (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) ++ case USERIAL_OP_ASSERT_BT_WAKE: ++ VNDUSERIALDBG("## userial_vendor_ioctl: Asserting BT_Wake ##"); ++ err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_ASSERT, NULL); ++ break; ++ ++ case USERIAL_OP_DEASSERT_BT_WAKE: ++ VNDUSERIALDBG("## userial_vendor_ioctl: De-asserting BT_Wake ##"); ++ err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_DEASSERT, NULL); ++ break; ++ ++ case USERIAL_OP_GET_BT_WAKE_STATE: ++ err = ioctl(fd, USERIAL_IOCTL_BT_WAKE_GET_ST, p_data); ++ break; ++#endif // (BT_WAKE_VIA_USERIAL_IOCTL==TRUE) ++ case USERIAL_OP_FLOW_ON: ++ fprintf(stderr, "## userial_vendor_ioctl: UART Flow On\n "); ++ ti.c_cflag |= CRTSCTS; ++ ++ if (err = tcsetattr(fd, TCSANOW, &ti) < 0) { ++ perror("Can't set port settings"); ++ return -1; ++ } ++ ++ break; ++ ++ case USERIAL_OP_FLOW_OFF: ++ fprintf(stderr, "## userial_vendor_ioctl: UART Flow Off\n "); ++ ti.c_cflag &= ~CRTSCTS; ++ if (err = tcsetattr(fd, TCSANOW, &ti) < 0) { ++ fprintf(stderr, "Can't set port settings"); ++ return -1; ++ } ++ break; ++ ++ default: ++ break; ++ } ++ ++ return err; ++} ++ ++ ++int get_vs_hci_event(unsigned char *rsp) ++{ ++ int err = 0, soc_id =0; ++ unsigned char paramlen = 0; ++ ++ if( (rsp[EVENTCODE_OFFSET] == VSEVENT_CODE) || (rsp[EVENTCODE_OFFSET] == EVT_CMD_COMPLETE)) ++ fprintf(stderr, "%s: Received HCI-Vendor Specific event\n", __FUNCTION__); ++ else { ++ fprintf(stderr, "%s: Failed to receive HCI-Vendor Specific event\n", __FUNCTION__); ++ err = -EIO; ++ goto failed; ++ } ++ ++ fprintf(stderr, "%s: Parameter Length: 0x%x\n", __FUNCTION__, paramlen = rsp[EVT_PLEN]); ++ fprintf(stderr, "%s: Command response: 0x%x\n", __FUNCTION__, rsp[CMD_RSP_OFFSET]); ++ fprintf(stderr, "%s: Response type : 0x%x\n", __FUNCTION__, rsp[RSP_TYPE_OFFSET]); ++ ++ /* Check the status of the operation */ ++ switch ( rsp[CMD_RSP_OFFSET] ) ++ { ++ case EDL_CMD_REQ_RES_EVT: ++ fprintf(stderr, "%s: Command Request Response\n", __FUNCTION__); ++ switch(rsp[RSP_TYPE_OFFSET]) ++ { ++ case EDL_PATCH_VER_RES_EVT: ++ case EDL_APP_VER_RES_EVT: ++ fprintf(stderr, "\t Current Product ID\t\t: 0x%08x\n", ++ (unsigned int)(rsp[PATCH_PROD_ID_OFFSET +3] << 24 | ++ rsp[PATCH_PROD_ID_OFFSET+2] << 16 | ++ rsp[PATCH_PROD_ID_OFFSET+1] << 8 | ++ rsp[PATCH_PROD_ID_OFFSET] )); ++ ++ /* Patch Version indicates FW patch version */ ++ fprintf(stderr, "\t Current Patch Version\t\t: 0x%04x\n", ++ (unsigned short)(rsp[PATCH_PATCH_VER_OFFSET + 1] << 8 | ++ rsp[PATCH_PATCH_VER_OFFSET] )); ++ ++ /* ROM Build Version indicates ROM build version like 1.0/1.1/2.0 */ ++ fprintf(stderr, "\t Current ROM Build Version\t: 0x%04x\n", rome_ver = ++ (int)(rsp[PATCH_ROM_BUILD_VER_OFFSET + 1] << 8 | ++ rsp[PATCH_ROM_BUILD_VER_OFFSET] )); ++ ++ /* In case rome 1.0/1.1, there is no SOC ID version available */ ++ if (paramlen - 10) ++ { ++ fprintf(stderr, "\t Current SOC Version\t\t: 0x%08x\n", soc_id = ++ (unsigned int)(rsp[PATCH_SOC_VER_OFFSET +3] << 24 | ++ rsp[PATCH_SOC_VER_OFFSET+2] << 16 | ++ rsp[PATCH_SOC_VER_OFFSET+1] << 8 | ++ rsp[PATCH_SOC_VER_OFFSET] )); ++ } ++ ++ /* Rome Chipset Version can be decided by Patch version and SOC version, ++ Upper 2 bytes will be used for Patch version and Lower 2 bytes will be ++ used for SOC as combination for BT host driver */ ++ rome_ver = (rome_ver << 16) | (soc_id & 0x0000ffff); ++ break; ++ case EDL_TVL_DNLD_RES_EVT: ++ case EDL_CMD_EXE_STATUS_EVT: ++ switch (err = rsp[CMD_STATUS_OFFSET]) ++ { ++ case HCI_CMD_SUCCESS: ++ fprintf(stderr, "%s: Download Packet successfully!\n", __FUNCTION__); ++ break; ++ case PATCH_LEN_ERROR: ++ fprintf(stderr, "%s: Invalid patch length argument passed for EDL PATCH " ++ "SET REQ cmd\n", __FUNCTION__); ++ break; ++ case PATCH_VER_ERROR: ++ fprintf(stderr, "%s: Invalid patch version argument passed for EDL PATCH " ++ "SET REQ cmd\n", __FUNCTION__); ++ break; ++ case PATCH_CRC_ERROR: ++ fprintf(stderr, "%s: CRC check of patch failed!!!\n", __FUNCTION__); ++ break; ++ case PATCH_NOT_FOUND: ++ fprintf(stderr, "%s: Invalid patch data!!!\n", __FUNCTION__); ++ break; ++ case TLV_TYPE_ERROR: ++ fprintf(stderr, "%s: TLV Type Error !!!\n", __FUNCTION__); ++ break; ++ default: ++ fprintf(stderr, "%s: Undefined error (0x%x)", __FUNCTION__, err); ++ break; ++ } ++ break; ++ } ++ break; ++ ++ case NVM_ACCESS_CODE: ++ fprintf(stderr, "%s: NVM Access Code!!!\n", __FUNCTION__); ++ err = HCI_CMD_SUCCESS; ++ break; ++ case EDL_SET_BAUDRATE_RSP_EVT: ++ /* Rome 1.1 has bug with the response, so it should ignore it. */ ++ if (rsp[BAUDRATE_RSP_STATUS_OFFSET] != BAUDRATE_CHANGE_SUCCESS) ++ { ++ fprintf(stderr, "%s: Set Baudrate request failed - 0x%x\n", __FUNCTION__, ++ rsp[CMD_STATUS_OFFSET]); ++ err = -1; ++ } ++ break; ++ default: ++ fprintf(stderr, "%s: Not a valid status!!!\n", __FUNCTION__); ++ err = -1; ++ break; ++ } ++ ++failed: ++ return err; ++} ++ ++ ++/* ++ * Read an VS HCI event from the given file descriptor. ++ */ ++int read_vs_hci_event(int fd, unsigned char* buf, int size) ++{ ++ int remain, r; ++ int count = 0; ++ ++ if (size <= 0) { ++ fprintf(stderr, "Invalid size arguement!\n"); ++ return -1; ++ } ++ ++ fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC\n", __FUNCTION__); ++ ++ /* The first byte identifies the packet type. For HCI event packets, it ++ * should be 0x04, so we read until we get to the 0x04. */ ++ /* It will keep reading until find 0x04 byte */ ++ while (1) { ++ r = read(fd, buf, 1); ++ if (r <= 0) ++ return -1; ++ if (buf[0] == 0x04) ++ break; ++ } ++ count++; ++ ++ fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC, buf[0] - 0x%x\n", __FUNCTION__, buf[0]); ++ /* The next two bytes are the event code and parameter total length. */ ++ while (count < 3) { ++ r = read(fd, buf + count, 3 - count); ++ if ((r <= 0) || (buf[1] != 0xFF )) { ++ fprintf(stderr, "It is not VS event !!\n"); ++ return -1; ++ } ++ count += r; ++ } ++ ++ fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC, buf[1] - 0x%x\n", __FUNCTION__, buf[1]); ++ /* Now we read the parameters. */ ++ if (buf[2] < (size - 3)) ++ remain = buf[2]; ++ else ++ remain = size - 3; ++ ++ while ((count - 3) < remain) { ++ r = read(fd, buf + count, remain - (count - 3)); ++ if (r <= 0) ++ return -1; ++ count += r; ++ } ++ ++ /* Check if the set patch command is successful or not */ ++ if(get_vs_hci_event(buf) != HCI_CMD_SUCCESS) ++ return -1; ++ ++ fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC, count - 0x%x\n", __FUNCTION__, count); ++ return count; ++} ++ ++ ++int hci_send_vs_cmd(int fd, unsigned char *cmd, unsigned char *rsp, int size) ++{ ++ int ret = 0; ++ ++ /* Send the HCI command packet to UART for transmission */ ++ ret = write(fd, cmd, size); ++ if (ret != size) { ++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, ret); ++ goto failed; ++ } ++ ++ /* Check for response from the Controller */ ++ if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { ++ ret = -ETIMEDOUT; ++ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); ++ goto failed; ++ } ++ ++ fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); ++failed: ++ return ret; ++} ++ ++void frame_hci_cmd_pkt( ++ unsigned char *cmd, ++ int edl_cmd, unsigned int p_base_addr, ++ int segtNo, int size ++ ) ++{ ++ int offset = 0; ++ hci_command_hdr *cmd_hdr; ++ ++ memset(cmd, 0x0, HCI_MAX_CMD_SIZE); ++ ++ cmd_hdr = (void *) (cmd + 1); ++ ++ cmd[0] = HCI_COMMAND_PKT; ++ cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, HCI_PATCH_CMD_OCF); ++ cmd_hdr->plen = size; ++ cmd[4] = edl_cmd; ++ ++ switch (edl_cmd) ++ { ++ case EDL_PATCH_SET_REQ_CMD: ++ /* Copy the patch header info as CMD params */ ++ memcpy(&cmd[5], phdr_buffer, PATCH_HDR_LEN); ++ fprintf(stderr, "%s: Sending EDL_PATCH_SET_REQ_CMD\n", __FUNCTION__); ++ fprintf(stderr, "HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", ++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); ++ break; ++ case EDL_PATCH_DLD_REQ_CMD: ++ offset = ((segtNo - 1) * MAX_DATA_PER_SEGMENT); ++ p_base_addr += offset; ++ cmd_hdr->plen = (size + 6); ++ cmd[5] = (size + 4); ++ cmd[6] = EXTRACT_BYTE(p_base_addr, 0); ++ cmd[7] = EXTRACT_BYTE(p_base_addr, 1); ++ cmd[8] = EXTRACT_BYTE(p_base_addr, 2); ++ cmd[9] = EXTRACT_BYTE(p_base_addr, 3); ++ memcpy(&cmd[10], (pdata_buffer + offset), size); ++ ++ fprintf(stderr, "%s: Sending EDL_PATCH_DLD_REQ_CMD: size: %d bytes\n", ++ __FUNCTION__, size); ++ fprintf(stderr, "HCI-CMD %d:\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t0x%x\t" ++ "0x%x\t0x%x\t0x%x\t\n", segtNo, cmd[0], cmd[1], cmd[2], ++ cmd[3], cmd[4], cmd[5], cmd[6], cmd[7], cmd[8], cmd[9]); ++ break; ++ case EDL_PATCH_ATCH_REQ_CMD: ++ fprintf(stderr, "%s: Sending EDL_PATCH_ATTACH_REQ_CMD\n", __FUNCTION__); ++ fprintf(stderr, "HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", ++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); ++ break; ++ case EDL_PATCH_RST_REQ_CMD: ++ fprintf(stderr, "%s: Sending EDL_PATCH_RESET_REQ_CMD\n", __FUNCTION__); ++ fprintf(stderr, "HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", ++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); ++ break; ++ case EDL_PATCH_VER_REQ_CMD: ++ fprintf(stderr, "%s: Sending EDL_PATCH_VER_REQ_CMD\n", __FUNCTION__); ++ fprintf(stderr, "HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", ++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4]); ++ break; ++ case EDL_PATCH_TLV_REQ_CMD: ++ fprintf(stderr, "%s: Sending EDL_PATCH_TLV_REQ_CMD\n", __FUNCTION__); ++ /* Parameter Total Length */ ++ cmd[3] = size +2; ++ ++ /* TLV Segment Length */ ++ cmd[5] = size; ++ fprintf(stderr, "HCI-CMD %d:\t0x%x \t0x%x \t0x%x \t0x%x \t0x%x \t0x%x\n", ++ segtNo, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5]); ++ offset = (segtNo * MAX_SIZE_PER_TLV_SEGMENT); ++ memcpy(&cmd[6], (pdata_buffer + offset), size); ++ break; ++ default: ++ fprintf(stderr, "%s: Unknown EDL CMD !!!\n", __FUNCTION__); ++ } ++} ++ ++void rome_extract_patch_header_info(unsigned char *buf) ++{ ++ int index; ++ ++ /* Extract patch id */ ++ for (index = 0; index < 4; index++) ++ rampatch_patch_info.patch_id |= ++ (LSH(buf[index + P_ID_OFFSET], (index * 8))); ++ ++ /* Extract (ROM and BUILD) version information */ ++ for (index = 0; index < 2; index++) ++ rampatch_patch_info.patch_ver.rom_version |= ++ (LSH(buf[index + P_ROME_VER_OFFSET], (index * 8))); ++ ++ for (index = 0; index < 2; index++) ++ rampatch_patch_info.patch_ver.build_version |= ++ (LSH(buf[index + P_BUILD_VER_OFFSET], (index * 8))); ++ ++ /* Extract patch base and entry addresses */ ++ for (index = 0; index < 4; index++) ++ rampatch_patch_info.patch_base_addr |= ++ (LSH(buf[index + P_BASE_ADDR_OFFSET], (index * 8))); ++ ++ /* Patch BASE & ENTRY addresses are same */ ++ rampatch_patch_info.patch_entry_addr = rampatch_patch_info.patch_base_addr; ++ ++ /* Extract total length of the patch payload */ ++ for (index = 0; index < 4; index++) ++ rampatch_patch_info.patch_length |= ++ (LSH(buf[index + P_LEN_OFFSET], (index * 8))); ++ ++ /* Extract the CRC checksum of the patch payload */ ++ for (index = 0; index < 4; index++) ++ rampatch_patch_info.patch_crc |= ++ (LSH(buf[index + P_CRC_OFFSET], (index * 8))); ++ ++ /* Extract patch control value */ ++ for (index = 0; index < 4; index++) ++ rampatch_patch_info.patch_ctrl |= ++ (LSH(buf[index + P_CONTROL_OFFSET], (index * 8))); ++ ++ fprintf(stderr, "PATCH_ID\t : 0x%x\n", rampatch_patch_info.patch_id); ++ fprintf(stderr, "ROM_VERSION\t : 0x%x\n", rampatch_patch_info.patch_ver.rom_version); ++ fprintf(stderr, "BUILD_VERSION\t : 0x%x\n", rampatch_patch_info.patch_ver.build_version); ++ fprintf(stderr, "PATCH_LENGTH\t : 0x%x\n", rampatch_patch_info.patch_length); ++ fprintf(stderr, "PATCH_CRC\t : 0x%x\n", rampatch_patch_info.patch_crc); ++ fprintf(stderr, "PATCH_CONTROL\t : 0x%x\n", rampatch_patch_info.patch_ctrl); ++ fprintf(stderr, "PATCH_BASE_ADDR\t : 0x%x\n", rampatch_patch_info.patch_base_addr); ++ ++} ++ ++int rome_edl_set_patch_request(int fd) ++{ ++ int size, err; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++ /* Frame the HCI CMD to be sent to the Controller */ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_SET_REQ_CMD, 0, ++ -1, PATCH_HDR_LEN + 1); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if ( err != size) { ++ fprintf(stderr, "Failed to set the patch info to the Controller!\n"); ++ goto error; ++ } ++ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if ( err < 0) { ++ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); ++ goto error; ++ } ++ fprintf(stderr, "%s: Successfully set patch info on the Controller\n", __FUNCTION__); ++error: ++ return err; ++} ++ ++int rome_edl_patch_download_request(int fd) ++{ ++ int no_of_patch_segment; ++ int index = 1, err = 0, size = 0; ++ unsigned int p_base_addr; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++ no_of_patch_segment = (rampatch_patch_info.patch_length / ++ MAX_DATA_PER_SEGMENT); ++ fprintf(stderr, "%s: %d patch segments to be d'loaded from patch base addr: 0x%x\n", ++ __FUNCTION__, no_of_patch_segment, ++ rampatch_patch_info.patch_base_addr); ++ ++ /* Initialize the patch base address from the one read from bin file */ ++ p_base_addr = rampatch_patch_info.patch_base_addr; ++ ++ /* ++ * Depending upon size of the patch payload, download the patches in ++ * segments with a max. size of 239 bytes ++ */ ++ for (index = 1; index <= no_of_patch_segment; index++) { ++ ++ fprintf(stderr, "%s: Downloading patch segment: %d\n", __FUNCTION__, index); ++ ++ /* Frame the HCI CMD PKT to be sent to Controller*/ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, ++ index, MAX_DATA_PER_SEGMENT); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ ++ /* Initialize the RSP packet everytime to 0 */ ++ memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if ( err != size) { ++ fprintf(stderr, "Failed to send the patch payload to the Controller!\n"); ++ goto error; ++ } ++ ++ /* Read Command Complete Event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if ( err < 0) { ++ fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", ++ __FUNCTION__, index); ++ goto error; ++ } ++ fprintf(stderr, "%s: Successfully downloaded patch segment: %d\n", ++ __FUNCTION__, index); ++ } ++ ++ /* Check if any pending patch data to be sent */ ++ size = (rampatch_patch_info.patch_length < MAX_DATA_PER_SEGMENT) ? ++ rampatch_patch_info.patch_length : ++ (rampatch_patch_info.patch_length % MAX_DATA_PER_SEGMENT); ++ ++ if (size) ++ { ++ /* Frame the HCI CMD PKT to be sent to Controller*/ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_DLD_REQ_CMD, p_base_addr, index, size); ++ ++ /* Initialize the RSP packet everytime to 0 */ ++ memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if ( err != size) { ++ fprintf(stderr, "Failed to send the patch payload to the Controller!\n"); ++ goto error; ++ } ++ ++ /* Read Command Complete Event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if ( err < 0) { ++ fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", ++ __FUNCTION__, index); ++ goto error; ++ } ++ ++ fprintf(stderr, "%s: Successfully downloaded patch segment: %d\n", ++ __FUNCTION__, index); ++ } ++ ++error: ++ return err; ++} ++ ++static int rome_download_rampatch(int fd) ++{ ++ int c, size, index, ret = -1; ++ ++ fprintf(stderr, "%s:\n", __FUNCTION__); ++ ++ /* Get handle to the RAMPATCH binary file */ ++ fprintf(stderr, "%s: Getting handle to the RAMPATCH binary file from %s\n", __FUNCTION__, ROME_FW_PATH); ++ file = fopen(ROME_FW_PATH, "r"); ++ if (file == NULL) { ++ fprintf(stderr, "%s: Failed to get handle to the RAMPATCH bin file!\n", ++ __FUNCTION__); ++ return -ENFILE; ++ } ++ ++ /* Allocate memory for the patch headder info */ ++ fprintf(stderr, "%s: Allocating memory for the patch header\n", __FUNCTION__); ++ phdr_buffer = (unsigned char *) malloc(PATCH_HDR_LEN + 1); ++ if (phdr_buffer == NULL) { ++ fprintf(stderr, "%s: Failed to allocate memory for patch header\n", ++ __FUNCTION__); ++ goto phdr_alloc_failed; ++ } ++ for (index = 0; index < PATCH_HDR_LEN + 1; index++) ++ phdr_buffer[index] = 0x0; ++ ++ /* Read 28 bytes of patch header information */ ++ fprintf(stderr, "%s: Reading patch header info\n", __FUNCTION__); ++ index = 0; ++ do { ++ c = fgetc (file); ++ phdr_buffer[index++] = (unsigned char)c; ++ } while (index != PATCH_HDR_LEN); ++ ++ /* Save the patch header info into local structure */ ++ fprintf(stderr, "%s: Saving patch hdr. info\n", __FUNCTION__); ++ rome_extract_patch_header_info((unsigned char *)phdr_buffer); ++ ++ /* Set the patch header info onto the Controller */ ++ ret = rome_edl_set_patch_request(fd); ++ if (ret < 0) { ++ fprintf(stderr, "%s: Error setting the patchheader info!\n", __FUNCTION__); ++ goto pdata_alloc_failed; ++ } ++ ++ /* Allocate memory for the patch payload */ ++ fprintf(stderr, "%s: Allocating memory for patch payload\n", __FUNCTION__); ++ size = rampatch_patch_info.patch_length; ++ pdata_buffer = (unsigned char *) malloc(size+1); ++ if (pdata_buffer == NULL) { ++ fprintf(stderr, "%s: Failed to allocate memory for patch payload\n", ++ __FUNCTION__); ++ goto pdata_alloc_failed; ++ } ++ for (index = 0; index < size+1; index++) ++ pdata_buffer[index] = 0x0; ++ ++ /* Read the patch data from Rampatch binary image */ ++ fprintf(stderr, "%s: Reading patch payload from RAMPATCH file\n", __FUNCTION__); ++ index = 0; ++ do { ++ c = fgetc (file); ++ pdata_buffer[index++] = (unsigned char)c; ++ } while (c != EOF); ++ ++ /* Downloading patches in segments to controller */ ++ ret = rome_edl_patch_download_request(fd); ++ if (ret < 0) { ++ fprintf(stderr, "%s: Error downloading patch segments!\n", __FUNCTION__); ++ goto cleanup; ++ } ++cleanup: ++ free(pdata_buffer); ++pdata_alloc_failed: ++ free(phdr_buffer); ++phdr_alloc_failed: ++ fclose(file); ++ ++ return ret; ++} ++ ++int rome_attach_rampatch(int fd) ++{ ++ int size, err; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++ /* Frame the HCI CMD to be sent to the Controller */ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_ATCH_REQ_CMD, 0, ++ -1, EDL_PATCH_CMD_LEN); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if ( err != size) { ++ fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); ++ goto error; ++ } ++ ++ /* Read Command Complete Event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if ( err < 0) { ++ fprintf(stderr, "%s: Failed to attach the patch segment(s)\n", __FUNCTION__); ++ goto error; ++ } ++error: ++ return err; ++} ++ ++int rome_rampatch_reset(int fd) ++{ ++ int size, err = 0; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ struct timespec tm = { 0, 100*1000*1000 }; /* 100 ms */ ++ ++ /* Frame the HCI CMD to be sent to the Controller */ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_RST_REQ_CMD, 0, ++ -1, EDL_PATCH_CMD_LEN); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); ++ ++ /* Send HCI Command packet to Controller */ ++ err = write(fd, cmd, size); ++ if (err != size) { ++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); ++ goto error; ++ } ++ ++ /* ++ * Controller doesn't sends any response for the patch reset ++ * command. HOST has to wait for 100ms before proceeding. ++ */ ++ nanosleep(&tm, NULL); ++ ++error: ++ return err; ++} ++ ++int rome_get_tlv_file(char *file_path) ++{ ++ FILE * pFile; ++ long fileSize; ++ int readSize, nvm_length, nvm_index, i; ++ unsigned short nvm_tag_len; ++ tlv_patch_info *ptlv_header; ++ tlv_nvm_hdr *nvm_ptr; ++ unsigned char data_buf[PRINT_BUF_SIZE]={0,}; ++ unsigned char *nvm_byte_ptr; ++ ++ fprintf(stderr, "File Open (%s)\n", file_path); ++ pFile = fopen ( file_path , "r" ); ++ if (pFile==NULL) {; ++ fprintf(stderr, "%s File Open Fail\n", file_path); ++ return -1; ++ } ++ ++ /* Get File Size */ ++ fseek (pFile , 0 , SEEK_END); ++ fileSize = ftell (pFile); ++ rewind (pFile); ++ ++ pdata_buffer = (unsigned char*) malloc (sizeof(char)*fileSize); ++ if (pdata_buffer == NULL) { ++ fprintf(stderr, "Allocated Memory failed\n"); ++ fclose (pFile); ++ return -1; ++ } ++ ++ /* Copy file into allocated buffer */ ++ readSize = fread (pdata_buffer,1,fileSize,pFile); ++ ++ /* File Close */ ++ fclose (pFile); ++ ++ if (readSize != fileSize) { ++ fprintf(stderr, "Read file size(%d) not matched with actual file size (%ld bytes)\n",readSize,fileSize); ++ return -1; ++ } ++ ++ ptlv_header = (tlv_patch_info *) pdata_buffer; ++ ++ /* To handle different event between rampatch and NVM */ ++ gTlv_type = ptlv_header->tlv_type; ++ ++ if(ptlv_header->tlv_type == TLV_TYPE_PATCH){ ++ fprintf(stderr, "====================================================\n"); ++ fprintf(stderr, "TLV Type\t\t\t : 0x%x\n", ptlv_header->tlv_type); ++ fprintf(stderr, "Length\t\t\t : %d bytes\n", (ptlv_header->tlv_length1) | ++ (ptlv_header->tlv_length2 << 8) | ++ (ptlv_header->tlv_length3 << 16)); ++ fprintf(stderr, "Total Length\t\t\t : %d bytes\n", ptlv_header->tlv_data_len); ++ fprintf(stderr, "Patch Data Length\t\t\t : %d bytes\n",ptlv_header->tlv_patch_data_len); ++ fprintf(stderr, "Signing Format Version\t : 0x%x\n", ptlv_header->tlv.patch.sign_ver); ++ fprintf(stderr, "Signature Algorithm\t\t : 0x%x\n", ptlv_header->tlv.patch.sign_algorithm); ++ fprintf(stderr, "Reserved\t\t\t : 0x%x\n", ptlv_header->tlv.patch.reserved1); ++ fprintf(stderr, "Product ID\t\t\t : 0x%04x\n", ptlv_header->tlv.patch.prod_id); ++ fprintf(stderr, "Rom Build Version\t\t : 0x%04x\n", ptlv_header->tlv.patch.build_ver); ++ fprintf(stderr, "Patch Version\t\t : 0x%04x\n", ptlv_header->tlv.patch.patch_ver); ++ fprintf(stderr, "Reserved\t\t\t : 0x%x\n", ptlv_header->tlv.patch.reserved2); ++ fprintf(stderr, "Patch Entry Address\t\t : 0x%x\n", (ptlv_header->tlv.patch.patch_entry_addr)); ++ fprintf(stderr, "====================================================\n"); ++ ++ } else if(ptlv_header->tlv_type == TLV_TYPE_NVM) { ++ fprintf(stderr, "====================================================\n"); ++ fprintf(stderr, "TLV Type\t\t\t : 0x%x\n", ptlv_header->tlv_type); ++ fprintf(stderr, "Length\t\t\t : %d bytes\n", nvm_length = (ptlv_header->tlv_length1) | ++ (ptlv_header->tlv_length2 << 8) | ++ (ptlv_header->tlv_length3 << 16)); ++ ++ if(nvm_length <= 0) ++ return readSize; ++ ++ for(nvm_byte_ptr=(unsigned char *)(nvm_ptr = &(ptlv_header->tlv.nvm)), nvm_index=0; ++ nvm_index < nvm_length ; nvm_ptr = (tlv_nvm_hdr *) nvm_byte_ptr) ++ { ++ fprintf(stderr, "TAG ID\t\t\t : %d\n", nvm_ptr->tag_id); ++ fprintf(stderr, "TAG Length\t\t\t : %d\n", nvm_tag_len = nvm_ptr->tag_len); ++ fprintf(stderr, "TAG Pointer\t\t\t : %d\n", nvm_ptr->tag_ptr); ++ fprintf(stderr, "TAG Extended Flag\t\t : %d\n", nvm_ptr->tag_ex_flag); ++ ++ /* Increase nvm_index to NVM data */ ++ nvm_index+=sizeof(tlv_nvm_hdr); ++ nvm_byte_ptr+=sizeof(tlv_nvm_hdr); ++ ++ /* Write BD Address */ ++ if(nvm_ptr->tag_id == TAG_NUM_2){ ++ memcpy(nvm_byte_ptr, vnd_local_bd_addr, 6); ++ fprintf(stderr, "BD Address: %.02x:%.02x:%.02x:%.02x:%.02x:%.02x\n", ++ *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), ++ *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); ++ } ++ ++ for(i =0;(itag_len && (i*3 + 2) tag_len; ++ nvm_byte_ptr +=nvm_ptr->tag_len; ++ } ++ ++ fprintf(stderr, "====================================================\n"); ++ ++ } else { ++ fprintf(stderr, "TLV Header type is unknown (%d) \n", ptlv_header->tlv_type); ++ } ++ ++ return readSize; ++} ++ ++int rome_tlv_dnld_segment(int fd, int index, int seg_size, unsigned char wait_cc_evt) ++{ ++ int size=0, err = -1; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++ fprintf(stderr, "%s: Downloading TLV Patch segment no.%d, size:%d\n", __FUNCTION__, index, seg_size); ++ ++ /* Frame the HCI CMD PKT to be sent to Controller*/ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_TLV_REQ_CMD, 0, index, seg_size); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ ++ /* Initialize the RSP packet everytime to 0 */ ++ memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if ( err != size) { ++ fprintf(stderr, "Failed to send the patch payload to the Controller! 0x%x\n", err); ++ return err; ++ } ++ ++ if(wait_cc_evt) { ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if ( err < 0) { ++ fprintf(stderr, "%s: Failed to downlaod patch segment: %d!\n", __FUNCTION__, index); ++ return err; ++ } ++ } ++ ++ fprintf(stderr, "%s: Successfully downloaded patch segment: %d\n", __FUNCTION__, index); ++ return err; ++} ++ ++int rome_tlv_dnld_req(int fd, int tlv_size) ++{ ++ int total_segment, remain_size, i, err = -1; ++ unsigned char wait_cc_evt; ++ ++ total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT; ++ remain_size = (tlv_size < MAX_SIZE_PER_TLV_SEGMENT)?\ ++ tlv_size: (tlv_size%MAX_SIZE_PER_TLV_SEGMENT); ++ ++ fprintf(stderr, "%s: TLV size: %d, Total Seg num: %d, remain size: %d\n", ++ __FUNCTION__,tlv_size, total_segment, remain_size); ++ ++ for(i=0;i= ROME_VER_1_1) && (gTlv_type == TLV_TYPE_PATCH ) ++ && !remain_size && ((i+1) == total_segment))? FALSE: TRUE; ++ if((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0) ++ goto error; ++ } ++ ++ /* In case remain data still remain, last rampatch segment command will not wait ++ for command complete event here */ ++ wait_cc_evt = ((rome_ver >= ROME_VER_1_1) && (gTlv_type == TLV_TYPE_PATCH ) ++ && remain_size )? FALSE:TRUE; ++ ++ if(remain_size) err =rome_tlv_dnld_segment(fd, i, remain_size, wait_cc_evt); ++ ++error: ++ return err; ++} ++ ++int rome_download_tlv_file(int fd) ++{ ++ int tlv_size, err = -1; ++ ++ /* Rampatch TLV file Downloading */ ++ pdata_buffer = NULL; ++ ++ if((tlv_size = rome_get_tlv_file(rampatch_file_path)) < 0) ++ goto error; ++ ++ if((err =rome_tlv_dnld_req(fd, tlv_size)) <0 ) ++ goto error; ++ ++ if (pdata_buffer != NULL){ ++ free (pdata_buffer); ++ pdata_buffer = NULL; ++ } ++ ++ /* NVM TLV file Downloading */ ++ if((tlv_size = rome_get_tlv_file(nvm_file_path)) < 0) ++ goto error; ++ ++ if((err =rome_tlv_dnld_req(fd, tlv_size)) <0 ) ++ goto error; ++ ++error: ++ if (pdata_buffer != NULL) ++ free (pdata_buffer); ++ ++ return err; ++} ++ ++int rome_1_0_nvm_tag_dnld(int fd) ++{ ++ int i, size, err = 0; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++#if (NVM_VERSION >= ROME_1_0_100019) ++ unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] = ++ { ++ /* Tag 2 */ /* BD Address */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 9, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 2, ++ /* Tag Len */ 6, ++ /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 ++ }, ++ /* Tag 6 */ /* Bluetooth Support Features */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 11, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 6, ++ /* Tag Len */ 8, ++ /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B ++ }, ++ /* Tag 17 */ /* HCI Transport Layer Setting */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 11, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 17, ++ /* Tag Len */ 8, ++ /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00 ++ }, ++ /* Tag 35 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 58, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 35, ++ /* Tag Len */ 55, ++ /* Tag Value */ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x58, 0x59, ++ 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F, ++ 0x0E, 0x0E, 0x16, 0x16, 0x16, 0x1E, 0x26, 0x5F, 0x2F, 0x5F, ++ 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80, ++ 0x0C, 0x18, 0x14, 0x24, 0x40, 0x4C, 0x70, 0x80, 0x80, 0x80, ++ 0x1B, 0x14, 0x01, 0x04, 0x48 ++ }, ++ /* Tag 36 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 15, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 36, ++ /* Tag Len */ 12, ++ /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00 ++ }, ++ /* Tag 39 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 7, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 39, ++ /* Tag Len */ 4, ++ /* Tag Value */ 0x12,0x00,0x00,0x00 ++ }, ++ /* Tag 41 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 91, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 41, ++ /* Tag Len */ 88, ++ /* Tag Value */ 0x15, 0x00, 0x00, 0x00, 0xF6, 0x02, 0x00, 0x00, 0x76, 0x00, ++ 0x1E, 0x00, 0x29, 0x02, 0x1F, 0x00, 0x61, 0x00, 0x1A, 0x00, ++ 0x76, 0x00, 0x1E, 0x00, 0x7D, 0x00, 0x40, 0x00, 0x91, 0x00, ++ 0x06, 0x00, 0x92, 0x00, 0x03, 0x00, 0xA6, 0x01, 0x50, 0x00, ++ 0xAA, 0x01, 0x15, 0x00, 0xAB, 0x01, 0x0A, 0x00, 0xAC, 0x01, ++ 0x00, 0x00, 0xB0, 0x01, 0xC5, 0x00, 0xB3, 0x01, 0x03, 0x00, ++ 0xB4, 0x01, 0x13, 0x00, 0xB5, 0x01, 0x0C, 0x00, 0xC5, 0x01, ++ 0x0D, 0x00, 0xC6, 0x01, 0x10, 0x00, 0xCA, 0x01, 0x2B, 0x00, ++ 0xCB, 0x01, 0x5F, 0x00, 0xCC, 0x01, 0x48, 0x00 ++ }, ++ /* Tag 42 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 63, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 42, ++ /* Tag Len */ 60, ++ /* Tag Value */ 0xD7, 0xC0, 0x00, 0x00, 0x8F, 0x5C, 0x02, 0x00, 0x80, 0x47, ++ 0x60, 0x0C, 0x70, 0x4C, 0x00, 0x00, 0x00, 0x01, 0x1F, 0x01, ++ 0x42, 0x01, 0x69, 0x01, 0x95, 0x01, 0xC7, 0x01, 0xFE, 0x01, ++ 0x3D, 0x02, 0x83, 0x02, 0xD1, 0x02, 0x29, 0x03, 0x00, 0x0A, ++ 0x10, 0x00, 0x1F, 0x00, 0x3F, 0x00, 0x7F, 0x00, 0xFD, 0x00, ++ 0xF9, 0x01, 0xF1, 0x03, 0xDE, 0x07, 0x00, 0x00, 0x9A, 0x01 ++ }, ++ /* Tag 84 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 153, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 84, ++ /* Tag Len */ 150, ++ /* Tag Value */ 0x7C, 0x6A, 0x59, 0x47, 0x19, 0x36, 0x35, 0x25, 0x25, 0x28, ++ 0x2C, 0x2B, 0x2B, 0x28, 0x2C, 0x28, 0x29, 0x28, 0x29, 0x28, ++ 0x29, 0x29, 0x2C, 0x29, 0x2C, 0x29, 0x2C, 0x28, 0x29, 0x28, ++ 0x29, 0x28, 0x29, 0x2A, 0x00, 0x00, 0x2C, 0x2A, 0x2C, 0x18, ++ 0x98, 0x98, 0x98, 0x98, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, ++ 0x1E, 0x13, 0x1E, 0x1E, 0x1E, 0x1E, 0x13, 0x13, 0x11, 0x13, ++ 0x1E, 0x1E, 0x13, 0x12, 0x12, 0x12, 0x11, 0x12, 0x1F, 0x12, ++ 0x12, 0x12, 0x10, 0x0C, 0x18, 0x0D, 0x01, 0x01, 0x01, 0x01, ++ 0x01, 0x01, 0x01, 0x0C, 0x01, 0x01, 0x01, 0x01, 0x0D, 0x0D, ++ 0x0E, 0x0D, 0x01, 0x01, 0x0D, 0x0D, 0x0D, 0x0D, 0x0F, 0x0D, ++ 0x10, 0x0D, 0x0D, 0x0D, 0x0D, 0x10, 0x05, 0x10, 0x03, 0x00, ++ 0x7E, 0x7B, 0x7B, 0x72, 0x71, 0x50, 0x50, 0x50, 0x00, 0x40, ++ 0x60, 0x60, 0x30, 0x08, 0x02, 0x0F, 0x00, 0x01, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x08, 0x16, 0x16, 0x08, 0x08, 0x00, ++ 0x00, 0x00, 0x1E, 0x34, 0x2B, 0x1B, 0x23, 0x2B, 0x15, 0x0D ++ }, ++ /* Tag 85 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 119, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 85, ++ /* Tag Len */ 116, ++ /* Tag Value */ 0x03, 0x00, 0x38, 0x00, 0x45, 0x77, 0x00, 0xE8, 0x00, 0x59, ++ 0x01, 0xCA, 0x01, 0x3B, 0x02, 0xAC, 0x02, 0x1D, 0x03, 0x8E, ++ 0x03, 0x00, 0x89, 0x01, 0x0E, 0x02, 0x5C, 0x02, 0xD7, 0x02, ++ 0xF8, 0x08, 0x01, 0x00, 0x1F, 0x00, 0x0A, 0x02, 0x55, 0x02, ++ 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD7, 0x00, 0x00, ++ 0x00, 0x1E, 0xDE, 0x00, 0x00, 0x00, 0x14, 0x0F, 0x0A, 0x0F, ++ 0x0A, 0x0C, 0x0C, 0x0C, 0x0C, 0x04, 0x04, 0x04, 0x0C, 0x0C, ++ 0x0C, 0x0C, 0x06, 0x06, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, ++ 0x01, 0x00, 0x02, 0x02, 0x02, 0x02, 0x01, 0x00, 0x00, 0x00, ++ 0x06, 0x0F, 0x14, 0x05, 0x47, 0xCF, 0x77, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0xAC, 0x7C, 0xFF, 0x40, 0x00, 0x00, 0x00, ++ 0x12, 0x04, 0x04, 0x01, 0x04, 0x03 ++ }, ++ {TAG_END} ++ }; ++#elif (NVM_VERSION == ROME_1_0_6002) ++ unsigned char cmds[MAX_TAG_CMD][HCI_MAX_CMD_SIZE] = ++ { ++ /* Tag 2 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 9, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 2, ++ /* Tag Len */ 6, ++ /* Tag Value */ 0x77,0x78,0x23,0x01,0x56,0x22 /* BD Address */ ++ }, ++ /* Tag 6 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 11, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 6, ++ /* Tag Len */ 8, ++ /* Tag Value */ 0xFF,0xFE,0x8B,0xFE,0xD8,0x3F,0x5B,0x8B ++ }, ++ /* Tag 17 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 11, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 17, ++ /* Tag Len */ 8, ++ /* Tag Value */ 0x82,0x01,0x0E,0x08,0x04,0x32,0x0A,0x00 ++ }, ++ /* Tag 36 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 15, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 36, ++ /* Tag Len */ 12, ++ /* Tag Value */ 0x0F,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x00 ++ }, ++ ++ /* Tag 39 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 7, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 39, ++ /* Tag Len */ 4, ++ /* Tag Value */ 0x12,0x00,0x00,0x00 ++ }, ++ ++ /* Tag 41 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 199, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 41, ++ /* Tag Len */ 196, ++ /* Tag Value */ 0x30,0x00,0x00,0x00,0xD5,0x00,0x0E,0x00,0xD6,0x00,0x0E,0x00, ++ 0xD7,0x00,0x16,0x00,0xD8,0x00,0x16,0x00,0xD9,0x00,0x16,0x00, ++ 0xDA,0x00,0x1E,0x00,0xDB,0x00,0x26,0x00,0xDC,0x00,0x5F,0x00, ++ 0xDD,0x00,0x2F,0x00,0xDE,0x00,0x5F,0x00,0xE0,0x00,0x0E,0x00, ++ 0xE1,0x00,0x0E,0x00,0xE2,0x00,0x16,0x00,0xE3,0x00,0x16,0x00, ++ 0xE4,0x00,0x16,0x00,0xE5,0x00,0x1E,0x00,0xE6,0x00,0x26,0x00, ++ 0xE7,0x00,0x5F,0x00,0xE8,0x00,0x2F,0x00,0xE9,0x00,0x5F,0x00, ++ 0xEC,0x00,0x0C,0x00,0xED,0x00,0x08,0x00,0xEE,0x00,0x14,0x00, ++ 0xEF,0x00,0x24,0x00,0xF0,0x00,0x40,0x00,0xF1,0x00,0x4C,0x00, ++ 0xF2,0x00,0x70,0x00,0xF3,0x00,0x80,0x00,0xF4,0x00,0x80,0x00, ++ 0xF5,0x00,0x80,0x00,0xF8,0x00,0x0C,0x00,0xF9,0x00,0x18,0x00, ++ 0xFA,0x00,0x14,0x00,0xFB,0x00,0x24,0x00,0xFC,0x00,0x40,0x00, ++ 0xFD,0x00,0x4C,0x00,0xFE,0x00,0x70,0x00,0xFF,0x00,0x80,0x00, ++ 0x00,0x01,0x80,0x00,0x01,0x01,0x80,0x00,0x04,0x01,0x1B,0x00, ++ 0x05,0x01,0x14,0x00,0x06,0x01,0x01,0x00,0x07,0x01,0x04,0x00, ++ 0x08,0x01,0x00,0x00,0x09,0x01,0x00,0x00,0x0A,0x01,0x03,0x00, ++ 0x0B,0x01,0x03,0x00 ++ }, ++ ++ /* Tag 44 */ ++ { /* Packet Type */HCI_COMMAND_PKT, ++ /* Opcode */ 0x0b,0xfc, ++ /* Total Len */ 44, ++ /* NVM CMD */ NVM_ACCESS_SET, ++ /* Tag Num */ 44, ++ /* Tag Len */ 41, ++ /* Tag Value */ 0x6F,0x0A,0x00,0x00,0x00,0x00,0x00,0x50,0xFF,0x10,0x02,0x02, ++ 0x01,0x00,0x14,0x01,0x06,0x28,0xA0,0x62,0x03,0x64,0x01,0x01, ++ 0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0xFF,0x10,0x02,0x01, ++ 0x00,0x14,0x01,0x02,0x03 ++ }, ++ {TAG_END} ++ }; ++#endif ++ ++ fprintf(stderr, "%s: Start sending NVM Tags (ver: 0x%x)\n", __FUNCTION__, (unsigned int) NVM_VERSION); ++ ++ for (i=0; (i < MAX_TAG_CMD) && (cmds[i][0] != TAG_END); i++) ++ { ++ /* Write BD Address */ ++ if(cmds[i][TAG_NUM_OFFSET] == TAG_NUM_2){ ++ memcpy(&cmds[i][TAG_BDADDR_OFFSET], vnd_local_bd_addr, 6); ++ fprintf(stderr, "BD Address: %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", ++ cmds[i][TAG_BDADDR_OFFSET ], cmds[i][TAG_BDADDR_OFFSET + 1], ++ cmds[i][TAG_BDADDR_OFFSET + 2], cmds[i][TAG_BDADDR_OFFSET + 3], ++ cmds[i][TAG_BDADDR_OFFSET + 4], cmds[i][TAG_BDADDR_OFFSET + 5]); ++ } ++ size = cmds[i][3] + HCI_COMMAND_HDR_SIZE + 1; ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)&cmds[i][0], rsp, size); ++ if ( err != size) { ++ fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); ++ goto error; ++ } ++ ++ /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if ( err < 0) { ++ fprintf(stderr, "%s: Failed to get patch version(s)\n", __FUNCTION__); ++ goto error; ++ } ++ } ++ ++error: ++ return err; ++} ++ ++ ++ ++int rome_patch_ver_req(int fd) ++{ ++ int size, err = 0; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ ++ /* Frame the HCI CMD to be sent to the Controller */ ++ frame_hci_cmd_pkt(cmd, EDL_PATCH_VER_REQ_CMD, 0, ++ -1, EDL_PATCH_CMD_LEN); ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); ++ ++ /* Send HCI Command packet to Controller */ ++ err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); ++ if ( err != size) { ++ fprintf(stderr, "Failed to attach the patch payload to the Controller!\n"); ++ goto error; ++ } ++ ++ /* Read Command Complete Event - This is extra routine for ROME 1.0. From ROM 2.0, it should be removed. */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if ( err < 0) { ++ fprintf(stderr, "%s: Failed to get patch version(s)\n", __FUNCTION__); ++ goto error; ++ } ++error: ++ return err; ++ ++} ++ ++int rome_disable_sleep(int fd) ++{ ++ int size, err = 0; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ hci_command_hdr *cmd_hdr; ++ int flags; ++ ++ memset(cmd, 0x0, HCI_MAX_CMD_SIZE); ++ ++ cmd_hdr = (void *) (cmd + 1); ++ cmd[0] = HCI_COMMAND_PKT; ++ cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, NVM_ACCESS_CODE); ++ cmd_hdr->plen = VSC_DISABLE_IBS_LEN; ++ cmd[4] = 0x01; ++ cmd[5] = 0x1B; ++ cmd[6] = 0x01; ++ cmd[7] = 0x00; ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_DISABLE_IBS_LEN); ++ /* Send the HCI command packet to UART for transmission */ ++ fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5], cmd[6], cmd[7]) ; ++ err = write(fd, cmd, size); ++ if (err != size) { ++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); ++ goto error; ++ } ++ ++ /* Check for response from the Controller */ ++ if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { ++ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); ++ goto error; ++ } ++ ++ fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); ++ ++ /* Wait for command complete event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if ( err < 0) { ++ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); ++ goto error; ++ } ++ fprintf(stderr, "%s\n", __FUNCTION__); ++error: ++ return err; ++ ++} ++ ++int rome_set_baudrate_req(int fd) ++{ ++ int size, err = 0; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ hci_command_hdr *cmd_hdr; ++ int flags; ++ ++ memset(cmd, 0x0, HCI_MAX_CMD_SIZE); ++ ++ cmd_hdr = (void *) (cmd + 1); ++ 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_115200; ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); ++ /* Send the HCI command packet to UART for transmission */ ++ fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3],cmd[4]) ; ++ err = write(fd, cmd, size); ++ if (err != size) { ++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); ++ goto error; ++ } ++ ++ /* Check for response from the Controller */ ++ if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { ++ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); ++ goto error; ++ } ++ ++ fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); ++ ++ /* Wait for command complete event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if ( err < 0) { ++ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); ++ goto error; ++ } ++ fprintf(stderr, "%s\n", __FUNCTION__); ++error: ++ return err; ++ ++} ++ ++ ++int rome_hci_reset_req(int fd) ++{ ++ int size, err = 0; ++ unsigned char cmd[HCI_MAX_CMD_SIZE]; ++ unsigned char rsp[HCI_MAX_EVENT_SIZE]; ++ hci_command_hdr *cmd_hdr; ++ int flags; ++ ++ fprintf(stderr, "%s: HCI RESET \n", __FUNCTION__); ++ ++ memset(cmd, 0x0, HCI_MAX_CMD_SIZE); ++ ++ cmd_hdr = (void *) (cmd + 1); ++ cmd[0] = HCI_COMMAND_PKT; ++ cmd_hdr->opcode = HCI_RESET; ++ cmd_hdr->plen = 0; ++ ++ /* Total length of the packet to be sent to the Controller */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); ++ ++ /* Send the HCI command packet to UART for transmission */ ++ fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3]); ++ err = write(fd, cmd, size); ++ if (err != size) { ++ fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); ++ goto error; ++ } ++ ++ /* Wait for command complete event */ ++ err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); ++ if ( err < 0) { ++ fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); ++ goto error; ++ } ++ ++error: ++ return err; ++ ++} ++ ++ ++int qca_soc_init(int fd, char *bdaddr) ++{ ++ int err = -1; ++ int size; ++ ++ fprintf(stderr, " %s \n", __FUNCTION__); ++ vnd_userial.fd = fd; ++ /* Get Rome version information */ ++ if((err = rome_patch_ver_req(fd)) <0){ ++ fprintf(stderr, "%s: Fail to get Rome Version (0x%x)\n", __FUNCTION__, err); ++ goto error; ++ } ++ ++ fprintf(stderr, "%s: Rome Version (0x%08x)\n", __FUNCTION__, rome_ver); ++ ++ switch (rome_ver){ ++ case ROME_VER_1_0: ++ { ++ /* Set and Download the RAMPATCH */ ++ fprintf(stderr, "%s: Setting Patch Header & Downloading Patches\n", __FUNCTION__); ++ err = rome_download_rampatch(fd); ++ if (err < 0) { ++ fprintf(stderr, "%s: DOWNLOAD RAMPATCH failed!\n", __FUNCTION__); ++ goto error; ++ } ++ fprintf(stderr, "%s: DOWNLOAD RAMPTACH complete\n", __FUNCTION__); ++ ++ /* Attach the RAMPATCH */ ++ fprintf(stderr, "%s: Attaching the patches\n", __FUNCTION__); ++ err = rome_attach_rampatch(fd); ++ if (err < 0) { ++ fprintf(stderr, "%s: ATTACH RAMPATCH failed!\n", __FUNCTION__); ++ goto error; ++ } ++ fprintf(stderr, "%s: ATTACH RAMPTACH complete\n", __FUNCTION__); ++ ++ /* Send Reset */ ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); ++ err = rome_rampatch_reset(fd); ++ if ( err < 0 ) { ++ fprintf(stderr, "Failed to RESET after RAMPATCH upgrade!\n"); ++ goto error; ++ } ++ ++ /* NVM download */ ++ fprintf(stderr, "%s: Downloading NVM\n", __FUNCTION__); ++ err = rome_1_0_nvm_tag_dnld(fd); ++ if ( err <0 ) { ++ fprintf(stderr, "Downloading NVM Failed !!\n"); ++ goto error; ++ } ++ ++ /* Change baud rate 115.2 kbps to 3Mbps*/ ++ err = rome_hci_reset_req(fd); ++ if ( err <0 ) { ++ fprintf(stderr, "HCI Reset Failed !!\n"); ++ goto error; ++ } ++ ++ fprintf(stderr, "HCI Reset is done\n"); ++ } ++ break; ++ case ROME_VER_1_1: ++ rampatch_file_path = ROME_RAMPATCH_TLV_PATH; ++ nvm_file_path = ROME_NVM_TLV_PATH; ++ goto download; ++ case ROME_VER_1_3: ++ rampatch_file_path = ROME_RAMPATCH_TLV_1_0_3_PATH; ++ nvm_file_path = ROME_NVM_TLV_1_0_3_PATH; ++ goto download; ++ case ROME_VER_2_1: ++ rampatch_file_path = ROME_RAMPATCH_TLV_2_0_1_PATH; ++ nvm_file_path = ROME_NVM_TLV_2_0_1_PATH; ++ goto download; ++ case ROME_VER_3_0: ++ case TUFELLO_VER_1_0: ++ rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH; ++ nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; ++ ++download: ++ /* Donwload TLV files (rampatch, NVM) */ ++ err = rome_download_tlv_file(fd); ++ if (err < 0) { ++ fprintf(stderr, "%s: Download TLV file failed!\n", __FUNCTION__); ++ goto error; ++ } ++ fprintf(stderr, "%s: Download TLV file successfully \n", __FUNCTION__); ++ ++ /* Change baud rate back to user requested */ ++ fprintf(stderr, "Changing baud rate back from 3M --> 115K\n"); ++ err = rome_set_baudrate_req(fd); ++ if (err < 0) { ++ fprintf(stderr, "%s: Baud rate change failed!\n", __FUNCTION__); ++ goto error; ++ } ++ fprintf(stderr, "%s: Baud rate changed successfully \n", __FUNCTION__); ++ ++ fprintf(stderr, "%s: Disabling In Band Sleep functionality\n", __FUNCTION__); ++ err = rome_disable_sleep(fd); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to disable IBS!\n", __FUNCTION__); ++ goto error; ++ } ++ fprintf(stderr, "%s: IBS disabled successfully \n", __FUNCTION__); ++ ++ /* Perform HCI reset here*/ ++ err = rome_hci_reset_req(fd); ++ if ( err <0 ) { ++ fprintf(stderr, "HCI Reset Failed !!!\n"); ++ goto error; ++ } ++ fprintf(stderr, "HCI Reset is done\n"); ++ ++ break; ++ case ROME_VER_UNKNOWN: ++ default: ++ fprintf(stderr, "%s: Detected unknown ROME version\n", __FUNCTION__); ++ err = -1; ++ break; ++ } ++ ++error: ++ return err; ++} +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +new file mode 100644 +index 000000000000..aa59965643ec +--- /dev/null ++++ b/tools/hciattach_rome.h +@@ -0,0 +1,317 @@ ++/* ++ * Copyright 2012 The Android Open Source Project ++ * Copyright (c) 2013, The Linux Foundation. All rights reserved. ++ * Not a Contribution. ++ * ++ * Licensed under the Apache License, Version 2.0 (the "License"); ++ * you may not use this file except in compliance with the License. ++ * You may obtain a copy of the License at ++ * ++ * http://www.apache.org/licenses/LICENSE-2.0 ++ * ++ * Unless required by applicable law or agreed to in writing, software ++ * distributed under the License is distributed on an "AS IS" BASIS, ++ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ++ * See the License for the specific language governing permissions and ++ * limitations under the License. ++ */ ++#ifndef HW_ROME_H ++#define HW_ROME_H ++ ++/****************************************************************************** ++** Constants & Macros ++******************************************************************************/ ++#define HCI_MAX_CMD_SIZE 260 ++#define HCI_MAX_EVENT_SIZE 260 ++#define PRINT_BUF_SIZE ((HCI_MAX_CMD_SIZE * 3) + 2) ++/* HCI Command/Event Opcode */ ++#define HCI_RESET 0x0C03 ++#define EVT_CMD_COMPLETE 0x0E ++/* HCI Packet types */ ++#define HCI_COMMAND_PKT 0x01 ++#define HCI_ACLDATA_PKT 0x02 ++#define HCI_SCODATA_PKT 0x03 ++#define HCI_EVENT_PKT 0x04 ++#define HCI_VENDOR_PKT 0xff ++#define cmd_opcode_pack(ogf, ocf) (unsigned short)((ocf & 0x03ff)|(ogf << 10)) ++unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; ++typedef enum { ++ USERIAL_OP_FLOW_ON, ++ USERIAL_OP_FLOW_OFF, ++ USERIAL_OP_NOP, ++} userial_vendor_ioctl_op_t; ++ ++ ++/* vendor serial control block */ ++typedef struct ++{ ++ int fd; /* fd to Bluetooth device */ ++ struct termios termios; /* serial terminal of BT port */ ++ char port_name[256]; ++} vnd_userial_cb_t; ++ ++/**** baud rates ****/ ++#define USERIAL_BAUD_300 0 ++#define USERIAL_BAUD_600 1 ++#define USERIAL_BAUD_1200 2 ++#define USERIAL_BAUD_2400 3 ++#define USERIAL_BAUD_9600 4 ++#define USERIAL_BAUD_19200 5 ++#define USERIAL_BAUD_57600 6 ++#define USERIAL_BAUD_115200 7 ++#define USERIAL_BAUD_230400 8 ++#define USERIAL_BAUD_460800 9 ++#define USERIAL_BAUD_921600 10 ++#define USERIAL_BAUD_1M 11 ++#define USERIAL_BAUD_1_5M 12 ++#define USERIAL_BAUD_2M 13 ++#define USERIAL_BAUD_3M 14 ++#define USERIAL_BAUD_4M 15 ++#define USERIAL_BAUD_AUTO 16 ++ ++#ifndef FALSE ++#define FALSE 0 ++#endif ++ ++#ifndef TRUE ++#define TRUE (!FALSE) ++#endif ++ ++#define HCI_CHG_BAUD_CMD_OCF 0x0C ++#define HCI_VENDOR_CMD_OGF 0x3F ++#define WRITE_BDADDR_CMD_LEN 14 ++#define WRITE_BAUD_CMD_LEN 6 ++#define MAX_CMD_LEN WRITE_BDADDR_CMD_LEN ++#define GET_VERSION_OCF 0x1E ++ ++#define PS_HDR_LEN 4 ++#define HCI_VENDOR_CMD_OGF 0x3F ++#define HCI_PS_CMD_OCF 0x0B ++ ++#define HCI_COMMAND_HDR_SIZE 3 ++#define EVT_CMD_COMPLETE_SIZE 3 ++#define EVT_CMD_STATUS 0x0F ++#define EVT_CMD_STATUS_SIZE 4 ++#define HCI_EVENT_HDR_SIZE 2 ++#define HCI_EV_SUCCESS 0x00 ++/* HCI Socket options */ ++#define HCI_DATA_DIR 1 ++#define HCI_FILTER 2 ++#define HCI_TIME_STAMP 3 ++ ++#define P_ID_OFFSET (0) ++#define HCI_CMD_IND (1) ++#define EVENTCODE_OFFSET (1) ++#define EVT_PLEN (2) ++#define PLEN (3) ++#define CMD_RSP_OFFSET (3) ++#define RSP_TYPE_OFFSET (4) ++#define BAUDRATE_RSP_STATUS_OFFSET (4) ++#define CMD_STATUS_OFFSET (5) ++#define P_ROME_VER_OFFSET (4) ++#define P_BUILD_VER_OFFSET (6) ++#define P_BASE_ADDR_OFFSET (8) ++#define P_ENTRY_ADDR_OFFSET (12) ++#define P_LEN_OFFSET (16) ++#define P_CRC_OFFSET (20) ++#define P_CONTROL_OFFSET (24) ++#define PATCH_HDR_LEN (28) ++#define MAX_DATA_PER_SEGMENT (239) ++#define VSEVENT_CODE (0xFF) ++#define HC_VS_MAX_CMD_EVENT (0xFF) ++#define PATCH_PROD_ID_OFFSET (5) ++#define PATCH_PATCH_VER_OFFSET (9) ++#define PATCH_ROM_BUILD_VER_OFFSET (11) ++#define PATCH_SOC_VER_OFFSET (13) ++#define MAX_SIZE_PER_TLV_SEGMENT (243) ++ ++/* VS Opcode */ ++#define HCI_PATCH_CMD_OCF (0) ++#define EDL_SET_BAUDRATE_CMD_OCF (0x48) ++ ++/* VS Commands */ ++#define VSC_SET_BAUDRATE_REQ_LEN (1) ++#define EDL_PATCH_CMD_LEN (1) ++#define EDL_PATCH_CMD_REQ_LEN (1) ++#define EDL_PATCH_DLD_REQ_CMD (0x01) ++#define EDL_PATCH_RST_REQ_CMD (0x05) ++#define EDL_PATCH_SET_REQ_CMD (0x16) ++#define EDL_PATCH_ATCH_REQ_CMD (0x17) ++#define EDL_PATCH_VER_REQ_CMD (0x19) ++#define EDL_PATCH_TLV_REQ_CMD (0x1E) ++#define VSC_DISABLE_IBS_LEN (0x04) ++ ++/* VS Event */ ++#define EDL_CMD_REQ_RES_EVT (0x00) ++#define EDL_CMD_EXE_STATUS_EVT (0x00) ++#define EDL_SET_BAUDRATE_RSP_EVT (0x92) ++#define EDL_PATCH_VER_RES_EVT (0x19) ++#define EDL_TVL_DNLD_RES_EVT (0x04) ++#define EDL_APP_VER_RES_EVT (0x02) ++ ++ ++/* Status Codes of HCI CMD execution*/ ++#define HCI_CMD_SUCCESS (0x0) ++#define PATCH_LEN_ERROR (0x1) ++#define PATCH_VER_ERROR (0x2) ++#define PATCH_CRC_ERROR (0x3) ++#define PATCH_NOT_FOUND (0x4) ++#define TLV_TYPE_ERROR (0x10) ++#define NVM_ACCESS_CODE (0x0B) ++#define BAUDRATE_CHANGE_SUCCESS (1) ++ ++/* TLV_TYPE */ ++#define TLV_TYPE_PATCH (1) ++#define TLV_TYPE_NVM (2) ++ ++/* NVM */ ++#define MAX_TAG_CMD 30 ++#define TAG_END 0xFF ++#define NVM_ACCESS_SET 0x01 ++#define TAG_NUM_OFFSET 5 ++#define TAG_NUM_2 2 ++#define TAG_BDADDR_OFFSET 7 ++ ++/* NVM Tags specifically used for ROME 1.0 */ ++#define ROME_1_0_100022_1 0x101000221 ++#define ROME_1_0_100019 0x101000190 ++#define ROME_1_0_6002 0x100600200 ++ ++/* Default NVM Version setting for ROME 1.0 */ ++#define NVM_VERSION ROME_1_0_100022_1 ++ ++ ++#define LSH(val, n) ((unsigned int)(val) << (n)) ++#define EXTRACT_BYTE(val, pos) (char) (((val) >> (8 * (pos))) & 0xFF) ++#define CALC_SEG_SIZE(len, max) ((plen) % (max))?((plen/max)+1) : ((plen) / (max)) ++ ++#define ROME_FW_PATH "/lib/firmware/rampatch.img" ++#define ROME_RAMPATCH_TLV_PATH "/lib/firmware/rampatch_tlv.img" ++#define ROME_NVM_TLV_PATH "/lib/firmware/nvm_tlv.bin" ++#define ROME_RAMPATCH_TLV_1_0_3_PATH "/lib/firmware/rampatch_tlv_1.3.tlv" ++#define ROME_NVM_TLV_1_0_3_PATH "/lib/firmware/nvm_tlv_1.3.bin" ++#define ROME_RAMPATCH_TLV_2_0_1_PATH "/lib/firmware/rampatch_tlv_2.1.tlv" ++#define ROME_NVM_TLV_2_0_1_PATH "/lib/firmware/nvm_tlv_2.1.bin" ++#define ROME_RAMPATCH_TLV_3_0_0_PATH "/lib/firmware/qca/rampatch_tlv_3.0.tlv" ++#define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/qca/nvm_tlv_3.0.bin" ++ ++ ++/****************************************************************************** ++** Local type definitions ++******************************************************************************/ ++ ++typedef struct { ++ unsigned char ncmd; ++ unsigned short opcode; ++} __attribute__ ((packed)) evt_cmd_complete; ++ ++typedef struct { ++ unsigned char status; ++ unsigned char ncmd; ++ unsigned short opcode; ++} __attribute__ ((packed)) evt_cmd_status; ++ ++typedef struct { ++ unsigned short opcode; ++ unsigned char plen; ++} __attribute__ ((packed)) hci_command_hdr; ++ ++typedef struct { ++ unsigned char evt; ++ unsigned char plen; ++} __attribute__ ((packed)) hci_event_hdr; ++typedef struct { ++ unsigned short rom_version; ++ unsigned short build_version; ++} __attribute__ ((packed)) patch_version; ++ ++typedef struct { ++ unsigned int patch_id; ++ patch_version patch_ver; ++ unsigned int patch_base_addr; ++ unsigned int patch_entry_addr; ++ unsigned short patch_length; ++ int patch_crc; ++ unsigned short patch_ctrl; ++} __attribute__ ((packed)) patch_info; ++ ++typedef struct { ++ unsigned char sign_ver; ++ unsigned char sign_algorithm; ++ unsigned short reserved1; ++ unsigned short prod_id; ++ unsigned short build_ver; ++ unsigned short patch_ver; ++ unsigned short reserved2; ++ unsigned int patch_entry_addr; ++} __attribute__ ((packed)) tlv_patch_hdr; ++ ++typedef struct { ++ unsigned short tag_id; ++ unsigned short tag_len; ++ unsigned int tag_ptr; ++ unsigned int tag_ex_flag; ++} __attribute__ ((packed)) tlv_nvm_hdr; ++ ++typedef struct { ++ unsigned char tlv_type; ++ unsigned char tlv_length1; ++ unsigned char tlv_length2; ++ unsigned char tlv_length3; ++ unsigned int tlv_data_len; ++ unsigned int tlv_patch_data_len; ++ ++ union{ ++ tlv_patch_hdr patch; ++ tlv_nvm_hdr nvm; ++ }tlv; ++} __attribute__ ((packed)) tlv_patch_info; ++ ++enum{ ++ BAUDRATE_115200 = 0x00, ++ BAUDRATE_57600 = 0x01, ++ BAUDRATE_38400 = 0x02, ++ BAUDRATE_19200 = 0x03, ++ BAUDRATE_9600 = 0x04, ++ BAUDRATE_230400 = 0x05, ++ BAUDRATE_250000 = 0x06, ++ BAUDRATE_460800 = 0x07, ++ BAUDRATE_500000 = 0x08, ++ BAUDRATE_720000 = 0x09, ++ BAUDRATE_921600 = 0x0A, ++ BAUDRATE_1000000 = 0x0B, ++ BAUDRATE_1250000 = 0x0C, ++ BAUDRATE_2000000 = 0x0D, ++ BAUDRATE_3000000 = 0x0E, ++ BAUDRATE_4000000 = 0x0F, ++ BAUDRATE_1600000 = 0x10, ++ BAUDRATE_3200000 = 0x11, ++ BAUDRATE_3500000 = 0x12, ++ BAUDRATE_AUTO = 0xFE, ++ BAUDRATE_Reserved = 0xFF ++}; ++ ++enum{ ++ ROME_PATCH_VER_0100 = 0x0100, ++ ROME_PATCH_VER_0101 = 0x0101, ++ ROME_PATCH_VER_0200 = 0x0200, ++ ROME_PATCH_VER_0300 = 0x0300 ++ }; ++ ++enum{ ++ ROME_SOC_ID_00 = 0x00000000, ++ ROME_SOC_ID_11 = 0x00000011, ++ ROME_SOC_ID_13 = 0x00000013, ++ ROME_SOC_ID_22 = 0x00000022, ++}; ++ ++enum{ ++ ROME_VER_UNKNOWN = 0, ++ ROME_VER_1_0 = ((ROME_PATCH_VER_0100 << 16 ) | ROME_SOC_ID_00 ), ++ ROME_VER_1_1 = ((ROME_PATCH_VER_0101 << 16 ) | ROME_SOC_ID_00 ), ++ ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ), ++ 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 ), ++ TUFELLO_VER_1_0 = ((ROME_PATCH_VER_0300 << 16 ) | ROME_SOC_ID_13 ) ++}; ++#endif /* HW_ROME_H */ diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0002-bluetooth-Enable-bluetooth-low-power-mode-functional.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0002-bluetooth-Enable-bluetooth-low-power-mode-functional.patch new file mode 100644 index 000000000..b0368d0e8 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0002-bluetooth-Enable-bluetooth-low-power-mode-functional.patch @@ -0,0 +1,28 @@ +From: Anantha Krishnan +Date: Thu, 11 Sep 2014 19:20:02 +0530 +Subject: [PATCH] bluetooth: Enable bluetooth low power mode functionality + +During periods of inactivity the bluetooth controller and the +application processor will indicate each other to enter into +low power mode and signal each other when they have data to be +exchanged, thereby saving considerable amount of power. + +Change-Id: I9e0d579ac8a9d61a2ebde78b031f4101cb6bc443 +Signed-off-by: Rupesh Tatiya +--- + tools/hciattach.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/hciattach.c b/tools/hciattach.c +index d3917a0d503e..3041e28ff82a 100644 +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -1156,7 +1156,7 @@ struct uart_t uart[] = { + FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, + + /* QCA ROME */ +- { "qca", 0x0000, 0x0000, HCI_UART_H4, 115200, 115200, ++ { "qca", 0x0000, 0x0000, HCI_UART_IBS, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, qca, NULL }, + + /* QUALCOMM BTS */ diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0003-bluetooth-Fix-bug-in-firmware-parsing-mechanism.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0003-bluetooth-Fix-bug-in-firmware-parsing-mechanism.patch new file mode 100644 index 000000000..21b57dde3 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0003-bluetooth-Fix-bug-in-firmware-parsing-mechanism.patch @@ -0,0 +1,51 @@ +From: Anantha Krishnan +Date: Thu, 11 Sep 2014 18:57:45 +0530 +Subject: [PATCH] bluetooth: Fix bug in firmware parsing mechanism + +Reorganize the RAMPATCH members to be present as part of the +RAMPATCH header structre instead of the main firmware structure + +Change-Id: If523e1bb20edcd52b7c6f623c07af492e6305bd0 +Signed-off-by: Rupesh Tatiya +--- + tools/hciattach_rome.c | 4 ++-- + tools/hciattach_rome.h | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index f31be43c09e4..122a0f4b89bc 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -851,8 +851,8 @@ int rome_get_tlv_file(char *file_path) + fprintf(stderr, "Length\t\t\t : %d bytes\n", (ptlv_header->tlv_length1) | + (ptlv_header->tlv_length2 << 8) | + (ptlv_header->tlv_length3 << 16)); +- fprintf(stderr, "Total Length\t\t\t : %d bytes\n", ptlv_header->tlv_data_len); +- fprintf(stderr, "Patch Data Length\t\t\t : %d bytes\n",ptlv_header->tlv_patch_data_len); ++ fprintf(stderr, "Total Length\t\t\t : %d bytes\n", ptlv_header->tlv.patch.tlv_data_len); ++ fprintf(stderr, "Patch Data Length\t\t\t : %d bytes\n",ptlv_header->tlv.patch.tlv_patch_data_len); + fprintf(stderr, "Signing Format Version\t : 0x%x\n", ptlv_header->tlv.patch.sign_ver); + fprintf(stderr, "Signature Algorithm\t\t : 0x%x\n", ptlv_header->tlv.patch.sign_algorithm); + fprintf(stderr, "Reserved\t\t\t : 0x%x\n", ptlv_header->tlv.patch.reserved1); +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index aa59965643ec..07127f30a70a 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -236,6 +236,8 @@ typedef struct { + } __attribute__ ((packed)) patch_info; + + typedef struct { ++ unsigned int tlv_data_len; ++ unsigned int tlv_patch_data_len; + unsigned char sign_ver; + unsigned char sign_algorithm; + unsigned short reserved1; +@@ -258,8 +260,6 @@ typedef struct { + unsigned char tlv_length1; + unsigned char tlv_length2; + unsigned char tlv_length3; +- unsigned int tlv_data_len; +- unsigned int tlv_patch_data_len; + + union{ + tlv_patch_hdr patch; diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0004-bluetooth-Configure-BD-Address.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0004-bluetooth-Configure-BD-Address.patch new file mode 100644 index 000000000..d39d8d0a0 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0004-bluetooth-Configure-BD-Address.patch @@ -0,0 +1,114 @@ +From: Anantha Krishnan +Date: Mon, 8 Sep 2014 15:11:02 +0530 +Subject: [PATCH] bluetooth: Configure BD Address + +Read the BD Address programmed by user from persist location. +If there is no user programmed BD address then use the default +BD address present in the firmware file. + +Change-Id: Id702d1476bae765dfd23f88542bfd5a8a1f26056 +Signed-off-by: Rupesh Tatiya +--- + tools/hciattach_rome.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++--- + tools/hciattach_rome.h | 7 +++++++ + 2 files changed, 60 insertions(+), 3 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 122a0f4b89bc..947e1abb96c4 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -809,6 +809,7 @@ int rome_get_tlv_file(char *file_path) + tlv_nvm_hdr *nvm_ptr; + unsigned char data_buf[PRINT_BUF_SIZE]={0,}; + unsigned char *nvm_byte_ptr; ++ unsigned char bdaddr[6]; + + fprintf(stderr, "File Open (%s)\n", file_path); + pFile = fopen ( file_path , "r" ); +@@ -886,9 +887,10 @@ int rome_get_tlv_file(char *file_path) + nvm_byte_ptr+=sizeof(tlv_nvm_hdr); + + /* Write BD Address */ +- if(nvm_ptr->tag_id == TAG_NUM_2){ +- memcpy(nvm_byte_ptr, vnd_local_bd_addr, 6); +- fprintf(stderr, "BD Address: %.02x:%.02x:%.02x:%.02x:%.02x:%.02x\n", ++ if(nvm_ptr->tag_id == TAG_NUM_2 && read_bd_address(&bdaddr) == 0) { ++ memcpy(nvm_byte_ptr, bdaddr, 6); ++ fprintf(stderr, "Overriding default BD ADDR with user" ++ " programmed BD Address: %02x:%02x:%02x:%02x:%02x:%02x\n", + *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), + *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); + } +@@ -1451,6 +1453,54 @@ error: + + } + ++int read_bd_address(unsigned char *bdaddr) ++{ ++ int fd = -1; ++ int readPtr = 0; ++ unsigned char data[BD_ADDR_LEN]; ++ ++ /* Open the persist file for reading device address*/ ++ fd = open("/etc/bluetooth/.bt_nv.bin", O_RDONLY); ++ if(fd < 0) ++ { ++ fprintf(stderr, "%s: Open failed: Programming default BD ADDR\n", __func__); ++ return -1; ++ } ++ ++ /* Read the NVM Header : fp will be advanced by readPtr number of bytes */ ++ readPtr = read(fd, data, PERSIST_HEADER_LEN); ++ if (readPtr > 0) ++ fprintf(stderr, "%s: Persist header data: %02x \t %02x \t %02x\n", __func__, ++ data[NVITEM], data[RDWR_PROT], data[NVITEM_SIZE]); ++ else { ++ fprintf(stderr, "%s: Read from persist memory failed : Programming default" ++ " BD ADDR\n"); ++ close(fd); ++ return -1; ++ } ++ ++ /* Check for BD ADDR length before programming */ ++ if(data[NVITEM_SIZE] != BD_ADDR_LEN) { ++ fprintf(stderr, "Invalid BD ADDR: Programming default BD ADDR!\n"); ++ close(fd); ++ return -1; ++ } ++ ++ /* Read the BD ADDR info */ ++ readPtr = read(fd, data, BD_ADDR_LEN); ++ if (readPtr > 0) ++ fprintf(stderr, "BD-ADDR: ==> %02x:%02x:%02x:%02x:%02x:%02x\n", data[0], ++ data[1], data[2], data[3], data[4], data[5]); ++ else { ++ fprintf(stderr, "%s: Read from persist memory failed : Programming default" ++ " BD ADDR\n"); ++ close(fd); ++ return -1; ++ } ++ memcpy(bdaddr, data, BD_ADDR_LEN); ++ close(fd); ++ return 0; ++} + + int qca_soc_init(int fd, char *bdaddr) + { +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index 07127f30a70a..a4abe9f73080 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -34,6 +34,13 @@ + #define HCI_EVENT_PKT 0x04 + #define HCI_VENDOR_PKT 0xff + #define cmd_opcode_pack(ogf, ocf) (unsigned short)((ocf & 0x03ff)|(ogf << 10)) ++ ++#define NVITEM 0 ++#define RDWR_PROT 1 ++#define NVITEM_SIZE 2 ++#define PERSIST_HEADER_LEN 3 ++#define BD_ADDR_LEN 6 ++ + unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + typedef enum { + USERIAL_OP_FLOW_ON, diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0005-bluetooth-Remove-unused-functions-in-the-firmware-do.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0005-bluetooth-Remove-unused-functions-in-the-firmware-do.patch new file mode 100644 index 000000000..604efb2e4 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0005-bluetooth-Remove-unused-functions-in-the-firmware-do.patch @@ -0,0 +1,73 @@ +From: Anantha Krishnan +Date: Mon, 8 Sep 2014 14:33:24 +0530 +Subject: [PATCH] bluetooth: Remove unused functions in the firmware download + process + +rome_disable_sleep() function is not used anywhere in the code and +hence remove it. + +Change-Id: Iec1f9b1478850af3023ff297493693283a5338d7 +Signed-off-by: Rupesh Tatiya +--- + tools/hciattach_rome.c | 48 ------------------------------------------------ + 1 file changed, 48 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 947e1abb96c4..4fcbdf2ab82a 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -1317,54 +1317,6 @@ error: + + } + +-int rome_disable_sleep(int fd) +-{ +- int size, err = 0; +- unsigned char cmd[HCI_MAX_CMD_SIZE]; +- unsigned char rsp[HCI_MAX_EVENT_SIZE]; +- hci_command_hdr *cmd_hdr; +- int flags; +- +- memset(cmd, 0x0, HCI_MAX_CMD_SIZE); +- +- cmd_hdr = (void *) (cmd + 1); +- cmd[0] = HCI_COMMAND_PKT; +- cmd_hdr->opcode = cmd_opcode_pack(HCI_VENDOR_CMD_OGF, NVM_ACCESS_CODE); +- cmd_hdr->plen = VSC_DISABLE_IBS_LEN; +- cmd[4] = 0x01; +- cmd[5] = 0x1B; +- cmd[6] = 0x01; +- cmd[7] = 0x00; +- +- /* Total length of the packet to be sent to the Controller */ +- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_DISABLE_IBS_LEN); +- /* Send the HCI command packet to UART for transmission */ +- fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5], cmd[6], cmd[7]) ; +- err = write(fd, cmd, size); +- if (err != size) { +- fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); +- goto error; +- } +- +- /* Check for response from the Controller */ +- if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { +- fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); +- goto error; +- } +- +- fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); +- +- /* Wait for command complete event */ +- err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); +- if ( err < 0) { +- fprintf(stderr, "%s: Failed to set patch info on Controller\n", __FUNCTION__); +- goto error; +- } +- fprintf(stderr, "%s\n", __FUNCTION__); +-error: +- return err; +- +-} + + int rome_set_baudrate_req(int fd) + { diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0006-bluetooth-Enable-3Mbps-baud-rate-support.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0006-bluetooth-Enable-3Mbps-baud-rate-support.patch new file mode 100644 index 000000000..a4f15ead0 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0006-bluetooth-Enable-3Mbps-baud-rate-support.patch @@ -0,0 +1,150 @@ +From: Anantha Krishnan +Date: Mon, 8 Sep 2014 14:31:18 +0530 +Subject: [PATCH] bluetooth: Enable 3Mbps baud rate support + +Allow APPS PROC and BT Controller to operate at 3Mbps baud rate +for faster exchange of commands, events and data between the two + +Change-Id: I55651633027ea60a762b11abea84fe1abd6574a9 +Signed-off-by: Rupesh Tatiya +--- + tools/hciattach_rome.c | 63 ++++++++++++++++++++++++++++++++++++++------------ + 1 file changed, 48 insertions(+), 15 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 4fcbdf2ab82a..d0e2935b9997 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -166,6 +166,7 @@ int userial_vendor_ioctl(int fd, userial_vendor_ioctl_op_t op, int *p_data) + } + cfmakeraw(&ti); + ti.c_cflag |= CLOCAL; ++ ti.c_cflag |= CREAD; + + switch(op) + { +@@ -332,6 +333,8 @@ int read_vs_hci_event(int fd, unsigned char* buf, int size) + { + int remain, r; + int count = 0; ++ fd_set infids; ++ struct timeval timeout; + + if (size <= 0) { + fprintf(stderr, "Invalid size arguement!\n"); +@@ -340,6 +343,16 @@ int read_vs_hci_event(int fd, unsigned char* buf, int size) + + fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC\n", __FUNCTION__); + ++ FD_ZERO (&infids); ++ FD_SET (fd, &infids); ++ timeout.tv_sec = 3; ++ timeout.tv_usec = 0; /* half second is a long time at 115.2 Kbps */ ++ ++ if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) ++ fprintf(stderr, "%s: Timing out on select for 3 secs.\n", __FUNCTION__); ++ else ++ fprintf(stderr, "%s: Data available in TTY Serial buffer\n", __FUNCTION__); ++ + /* The first byte identifies the packet type. For HCI event packets, it + * should be 0x04, so we read until we get to the 0x04. */ + /* It will keep reading until find 0x04 byte */ +@@ -1332,10 +1345,16 @@ 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_115200; ++ cmd[4] = BAUDRATE_3000000; + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); ++ /* Flow off during baudrate change */ ++ if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_OFF , &flags)) < 0) ++ { ++ fprintf(stderr, "%s: HW Flow-off error: 0x%x\n", __FUNCTION__, err); ++ goto error; ++ } + /* Send the HCI command packet to UART for transmission */ + fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3],cmd[4]) ; + err = write(fd, cmd, size); +@@ -1343,7 +1362,15 @@ int rome_set_baudrate_req(int fd) + fprintf(stderr, "%s: Send failed with ret value: %d\n", __FUNCTION__, err); + goto error; + } ++ /* Change Local UART baudrate to high speed UART */ ++ userial_vendor_set_baud(USERIAL_BAUD_3M); + ++ /* Flow on after changing local uart baudrate */ ++ if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_ON , &flags)) < 0) ++ { ++ fprintf(stderr, "%s: HW Flow-on error: 0x%x \n", __FUNCTION__, err); ++ return err; ++ } + /* Check for response from the Controller */ + if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { + fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); +@@ -1385,6 +1412,12 @@ int rome_hci_reset_req(int fd) + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); + ++ /* Flow off during baudrate change */ ++ if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_OFF , &flags)) < 0) ++ { ++ fprintf(stderr, "%s: HW Flow-off error: 0x%x\n", __FUNCTION__, err); ++ goto error; ++ } + /* Send the HCI command packet to UART for transmission */ + fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3]); + err = write(fd, cmd, size); +@@ -1393,6 +1426,15 @@ int rome_hci_reset_req(int fd) + goto error; + } + ++ /* Change Local UART baudrate to high speed UART */ ++ userial_vendor_set_baud(USERIAL_BAUD_3M); ++ ++ /* Flow on after changing local uart baudrate */ ++ if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_ON , &flags)) < 0) ++ { ++ fprintf(stderr, "%s: HW Flow-on error: 0x%x \n", __FUNCTION__, err); ++ return err; ++ } + /* Wait for command complete event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if ( err < 0) { +@@ -1534,16 +1576,7 @@ int qca_soc_init(int fd, char *bdaddr) + nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; + + download: +- /* Donwload TLV files (rampatch, NVM) */ +- err = rome_download_tlv_file(fd); +- if (err < 0) { +- fprintf(stderr, "%s: Download TLV file failed!\n", __FUNCTION__); +- goto error; +- } +- fprintf(stderr, "%s: Download TLV file successfully \n", __FUNCTION__); +- +- /* Change baud rate back to user requested */ +- fprintf(stderr, "Changing baud rate back from 3M --> 115K\n"); ++ /* 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__); +@@ -1551,13 +1584,13 @@ download: + } + fprintf(stderr, "%s: Baud rate changed successfully \n", __FUNCTION__); + +- fprintf(stderr, "%s: Disabling In Band Sleep functionality\n", __FUNCTION__); +- err = rome_disable_sleep(fd); ++ /* Donwload TLV files (rampatch, NVM) */ ++ err = rome_download_tlv_file(fd); + if (err < 0) { +- fprintf(stderr, "%s: Failed to disable IBS!\n", __FUNCTION__); ++ fprintf(stderr, "%s: Download TLV file failed!\n", __FUNCTION__); + goto error; + } +- fprintf(stderr, "%s: IBS disabled successfully \n", __FUNCTION__); ++ fprintf(stderr, "%s: Download TLV file successfully \n", __FUNCTION__); + + /* Perform HCI reset here*/ + err = rome_hci_reset_req(fd); diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0007-bluetooth-Check-TTY-buffer-for-data-availability-bef.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0007-bluetooth-Check-TTY-buffer-for-data-availability-bef.patch new file mode 100644 index 000000000..d92dbfcce --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0007-bluetooth-Check-TTY-buffer-for-data-availability-bef.patch @@ -0,0 +1,189 @@ +From: Anantha Krishnan +Date: Tue, 30 Sep 2014 12:13:00 +0530 +Subject: [PATCH] bluetooth: Check TTY buffer for data availability before + reading + +When operating at higher baud rates check the TTY buffer for +availability of data before proceeding to read. Call select() with +a 3 sec timeout value to check for the availablitiy of data. +select() will return once data is available in the TTY buffers +and will allow read() to fetch the data. If data is not available +in the TTY buffer until the timeout valueexpires, do not proceed +to read the data from the TTY buffers as there is none. + +Occasionally corrupt data is received on UART lines while we wait +for vendor specific event from Controller. Expected vendor specific +events are received after the corrupt data. But we do not retry +and exit and this causes firmware download failures. So, retry once +if we did not get HCI event. + +Change-Id: I3b672a7762403690f8b934ca216492f16285e8da +Signed-off-by: Rupesh Tatiya +--- + tools/hciattach.c | 20 ++++++++++++- + tools/hciattach_rome.c | 77 +++++++++++++++++++++++++++++++++++++++----------- + tools/hciattach_rome.h | 3 ++ + 3 files changed, 83 insertions(+), 17 deletions(-) + +diff --git a/tools/hciattach.c b/tools/hciattach.c +index 3041e28ff82a..13f073325c43 100644 +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -163,16 +163,34 @@ int read_hci_event(int fd, unsigned char* buf, int size) + { + int remain, r; + int count = 0; ++ fd_set infids; ++ struct timeval timeout; + + if (size <= 0) + return -1; + ++ FD_ZERO (&infids); ++ FD_SET (fd, &infids); ++ timeout.tv_sec = 3; ++ timeout.tv_usec = 0; ++ ++ /* Check whether data is available in TTY buffer before calling read() */ ++ if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) { ++ fprintf(stderr, "%s: Timing out on select for 3 secs.\n", __FUNCTION__); ++ return -1; ++ } ++ else ++ fprintf(stderr, "%s: Data(HCI-CMD-COMP-EVENT) available in TTY Serial buffer\n", __FUNCTION__); ++ + /* The first byte identifies the packet type. For HCI event packets, it + * should be 0x04, so we read until we get to the 0x04. */ + while (1) { + r = read(fd, buf, 1); +- if (r <= 0) ++ if (r <= 0) { ++ fprintf(stderr, "%s: read() failed with return value: %d\n", ++ __FUNCTION__, r); + return -1; ++ } + if (buf[0] == 0x04) + break; + } +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index d0e2935b9997..d2687b1ef01a 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -326,42 +326,87 @@ failed: + } + + ++int wait_for_data(int fd, int maxTimeOut) ++{ ++ fd_set infids; ++ struct timeval timeout; ++ ++ if (maxTimeOut <= 0) { ++ fprintf(stderr, "%s: Invalid timeout value specified", __func__); ++ return -EINVAL; ++ } ++ ++ FD_ZERO (&infids); ++ FD_SET (fd, &infids); ++ timeout.tv_sec = maxTimeOut; ++ timeout.tv_usec = 0; ++ ++ /* Check whether data is available in TTY buffer before calling read() */ ++ if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) { ++ fprintf(stderr, "%s: Timing out on select for %d secs.\n", __FUNCTION__, maxTimeOut); ++ return -1; ++ } ++ else ++ fprintf(stderr, "%s: HCI-VS-EVENT available in TTY Serial buffer\n", ++ __FUNCTION__); ++ ++ return 1; ++} ++ + /* + * Read an VS HCI event from the given file descriptor. + */ + int read_vs_hci_event(int fd, unsigned char* buf, int size) + { +- int remain, r; ++ int remain, r, retry = 0; + int count = 0; +- fd_set infids; +- struct timeval timeout; + + if (size <= 0) { + fprintf(stderr, "Invalid size arguement!\n"); + return -1; + } + +- fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC\n", __FUNCTION__); +- +- FD_ZERO (&infids); +- FD_SET (fd, &infids); +- timeout.tv_sec = 3; +- timeout.tv_usec = 0; /* half second is a long time at 115.2 Kbps */ ++ fprintf(stderr, "%s: Wait for HCI-Vendor Specfic Event from SOC\n", ++ __FUNCTION__); + +- if (select (fd + 1, &infids, NULL, NULL, &timeout) < 1) +- fprintf(stderr, "%s: Timing out on select for 3 secs.\n", __FUNCTION__); +- else +- fprintf(stderr, "%s: Data available in TTY Serial buffer\n", __FUNCTION__); ++ /* Check whether data is available in TTY buffer before calling read() */ ++ if (wait_for_data(fd, SELECT_TIMEOUT) < 1) ++ return -1; + + /* The first byte identifies the packet type. For HCI event packets, it + * should be 0x04, so we read until we get to the 0x04. */ + /* It will keep reading until find 0x04 byte */ + while (1) { ++ /* Read UART Buffer for HCI-DATA */ + r = read(fd, buf, 1); +- if (r <= 0) +- return -1; +- if (buf[0] == 0x04) ++ if (r <= 0) { ++ fprintf(stderr, "%s: read() failed. error: %d\n", ++ __FUNCTION__, r); ++ return -1; ++ } ++ ++ /* Check if received data is HCI-DATA or not. ++ * If not HCI-DATA, then retry reading the UART Buffer once. ++ * Sometimes there could be corruption on the UART lines and to ++ * avoid that retry once reading the UART Buffer for HCI-DATA. ++ */ ++ if (buf[0] == 0x04) { /* Recvd. HCI DATA */ ++ retry = 0; + break; ++ } ++ else if (retry < MAX_RETRY_CNT){ /* Retry mechanism */ ++ retry++; ++ fprintf(stderr, "%s: Not an HCI-VS-Event! buf[0]: %d", ++ __FUNCTION__, buf[0]); ++ if (wait_for_data(fd, SELECT_TIMEOUT) < 1) ++ return -1; ++ else /* Data available in UART Buffer: Continue to read */ ++ continue; ++ } ++ else { /* RETRY failed : Exiting with failure */ ++ fprintf(stderr, "%s: RETRY failed!", __FUNCTION__); ++ return -1; ++ } + } + count++; + +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index a4abe9f73080..3efb71995c45 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -179,6 +179,9 @@ typedef struct + #define TAG_NUM_2 2 + #define TAG_BDADDR_OFFSET 7 + ++#define MAX_RETRY_CNT 1 ++#define SELECT_TIMEOUT 3 ++ + /* NVM Tags specifically used for ROME 1.0 */ + #define ROME_1_0_100022_1 0x101000221 + #define ROME_1_0_100019 0x101000190 diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0008-bluetooth-Add-support-for-TUFEELO-firmware-download.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0008-bluetooth-Add-support-for-TUFEELO-firmware-download.patch new file mode 100644 index 000000000..e8f2f8dcc --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0008-bluetooth-Add-support-for-TUFEELO-firmware-download.patch @@ -0,0 +1,44 @@ +From: Anantha Krishnan +Date: Wed, 20 Aug 2014 12:13:19 +0530 +Subject: [PATCH] bluetooth : Add support for TUFEELO firmware download + +Add TUFELLO chip version to allow firmware download. + +Change-Id: Ie3760fa64e8345bf9a84b2f047fde0ac1003b393 +--- + tools/hciattach_rome.c | 5 ++++- + tools/hciattach_rome.h | 3 ++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index d2687b1ef01a..84dfc97b5140 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -1616,9 +1616,12 @@ int qca_soc_init(int fd, char *bdaddr) + nvm_file_path = ROME_NVM_TLV_2_0_1_PATH; + goto download; + case ROME_VER_3_0: +- case TUFELLO_VER_1_0: + rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH; + nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; ++ goto download; ++ 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; + + download: + /* Change baud rate 115.2 kbps to 3Mbps*/ +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index 3efb71995c45..9d18c576fcae 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -204,7 +204,8 @@ typedef struct + #define ROME_NVM_TLV_2_0_1_PATH "/lib/firmware/nvm_tlv_2.1.bin" + #define ROME_RAMPATCH_TLV_3_0_0_PATH "/lib/firmware/qca/rampatch_tlv_3.0.tlv" + #define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/qca/nvm_tlv_3.0.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" + + /****************************************************************************** + ** Local type definitions diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0009-bluetooth-Add-support-for-ROME-3.2-SOC.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0009-bluetooth-Add-support-for-ROME-3.2-SOC.patch new file mode 100644 index 000000000..5cc72bde2 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0009-bluetooth-Add-support-for-ROME-3.2-SOC.patch @@ -0,0 +1,236 @@ +From: Anantha Krishnan +Date: Mon, 8 Dec 2014 14:52:16 +0530 +Subject: [PATCH] bluetooth: Add support for ROME 3.2 SOC. + +Add firmware download support for ROME 3.2 version. As part +of this, the Bluetooth on time is optimized based on event +handling while downloading rampatch files.From ROME 3.2 onwards, +the VS and command complete events will be sent depending the flag +indication present in the header. HOST can wait for VS and command +complete events only if specified in the header info. This greatly +reduces the time spent by HOST in waiting for 2 events from the +Controller before downloading each segment of the RAMPATCH file + +Change-Id: I9c4227a7a529455f4d120b2c9d065f3ec6b439e9 +--- + tools/hciattach_rome.c | 104 ++++++++++++++++++++++++++++++++++++++++++------- + tools/hciattach_rome.h | 16 +++++++- + 2 files changed, 103 insertions(+), 17 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 84dfc97b5140..c6d528f118e1 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -62,9 +62,11 @@ unsigned char *pdata_buffer = NULL; + patch_info rampatch_patch_info; + int rome_ver = ROME_VER_UNKNOWN; + unsigned char gTlv_type; ++unsigned char gtlv_dwndcfg; + char *rampatch_file_path; + char *nvm_file_path; + vnd_userial_cb_t vnd_userial; ++unsigned char wait_vsc_evt = TRUE; + /****************************************************************************** + ** Extern variables + ******************************************************************************/ +@@ -455,14 +457,16 @@ int hci_send_vs_cmd(int fd, unsigned char *cmd, unsigned char *rsp, int size) + goto failed; + } + +- /* Check for response from the Controller */ +- if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { +- ret = -ETIMEDOUT; +- fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); +- goto failed; ++ if (wait_vsc_evt) { ++ /* Check for response from the Controller */ ++ if (read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE) < 0) { ++ ret = -ETIMEDOUT; ++ fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); ++ goto failed; ++ } ++ fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); + } + +- fprintf(stderr, "%s: Received HCI-Vendor Specific Event from SOC\n", __FUNCTION__); + failed: + return ret; + } +@@ -903,6 +907,7 @@ int rome_get_tlv_file(char *file_path) + + /* To handle different event between rampatch and NVM */ + gTlv_type = ptlv_header->tlv_type; ++ gtlv_dwndcfg = ptlv_header->tlv.patch.dwnd_cfg; + + if(ptlv_header->tlv_type == TLV_TYPE_PATCH){ + fprintf(stderr, "====================================================\n"); +@@ -914,6 +919,7 @@ int rome_get_tlv_file(char *file_path) + fprintf(stderr, "Patch Data Length\t\t\t : %d bytes\n",ptlv_header->tlv.patch.tlv_patch_data_len); + fprintf(stderr, "Signing Format Version\t : 0x%x\n", ptlv_header->tlv.patch.sign_ver); + fprintf(stderr, "Signature Algorithm\t\t : 0x%x\n", ptlv_header->tlv.patch.sign_algorithm); ++ fprintf(stderr, "Event Handling\t\t\t : 0x%x", ptlv_header->tlv.patch.dwnd_cfg); + fprintf(stderr, "Reserved\t\t\t : 0x%x\n", ptlv_header->tlv.patch.reserved1); + fprintf(stderr, "Product ID\t\t\t : 0x%04x\n", ptlv_header->tlv.patch.prod_id); + fprintf(stderr, "Rom Build Version\t\t : 0x%04x\n", ptlv_header->tlv.patch.build_ver); +@@ -1023,19 +1029,83 @@ int rome_tlv_dnld_req(int fd, int tlv_size) + fprintf(stderr, "%s: TLV size: %d, Total Seg num: %d, remain size: %d\n", + __FUNCTION__,tlv_size, total_segment, remain_size); + +- for(i=0;i= ROME_VER_1_1) && (gTlv_type == TLV_TYPE_PATCH ) +- && !remain_size && ((i+1) == total_segment))? FALSE: TRUE; ++ if (gTlv_type == TLV_TYPE_PATCH) { ++ /* Prior to Rome version 3.2(including inital few rampatch release of ++ * Rome 3.2), the event handling mechanism is ROME_SKIP_EVT_NONE. After ++ * few release of rampatch for Rome 3.2, the mechamism is changed to ++ * ROME_SKIP_EVT_VSE_CC. Rest of the mechanism is not used for now ++ */ ++ switch(gtlv_dwndcfg) ++ { ++ case ROME_SKIP_EVT_NONE: ++ wait_vsc_evt = TRUE; ++ wait_cc_evt = TRUE; ++ fprintf(stderr, "%s: Event handling type: ROME_SKIP_EVT_NONE", __func__); ++ break; ++ case ROME_SKIP_EVT_VSE_CC: ++ wait_vsc_evt = FALSE; ++ wait_cc_evt = FALSE; ++ fprintf(stderr, "%s: Event handling type: ROME_SKIP_EVT_VSE_CC", __func__); ++ break; ++ /* Not handled for now */ ++ case ROME_SKIP_EVT_VSE: ++ case ROME_SKIP_EVT_CC: ++ default: ++ fprintf(stderr, "%s: Unsupported Event handling: %d", __func__, gtlv_dwndcfg); ++ break; ++ } ++ } else { ++ wait_vsc_evt = TRUE; ++ wait_cc_evt = TRUE; ++ } ++ ++ 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) && ++ (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)) { ++ /* 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 ++ * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is ++ * same as Rome 2.1, 2.2, 3.0 ++ */ ++ if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { ++ wait_cc_evt = !remain_size ? FALSE: TRUE; ++ } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { ++ wait_vsc_evt = !remain_size ? TRUE: FALSE; ++ } ++ } ++ } ++ + if((err = rome_tlv_dnld_segment(fd, i, MAX_SIZE_PER_TLV_SEGMENT, wait_cc_evt )) < 0) + goto error; + } + +- /* In case remain data still remain, last rampatch segment command will not wait +- for command complete event here */ +- wait_cc_evt = ((rome_ver >= ROME_VER_1_1) && (gTlv_type == TLV_TYPE_PATCH ) +- && remain_size )? FALSE:TRUE; ++ if ((rome_ver >= ROME_VER_1_1) && (rome_ver < ROME_VER_3_2) && (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)) { ++ /* 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 ++ * 3. If gtlv_dwndcfg is ROME_SKIP_EVT_NONE then the logic is ++ * same as Rome 2.1, 2.2, 3.0 ++ */ ++ if (gtlv_dwndcfg == ROME_SKIP_EVT_NONE) { ++ wait_cc_evt = remain_size ? FALSE: TRUE; ++ } else if (gtlv_dwndcfg == ROME_SKIP_EVT_VSE_CC) { ++ wait_vsc_evt = remain_size ? TRUE: FALSE; ++ } ++ } + + if(remain_size) err =rome_tlv_dnld_segment(fd, i, remain_size, wait_cc_evt); + +@@ -1619,6 +1689,10 @@ int qca_soc_init(int fd, char *bdaddr) + rampatch_file_path = ROME_RAMPATCH_TLV_3_0_0_PATH; + nvm_file_path = ROME_NVM_TLV_3_0_0_PATH; + goto download; ++ case ROME_VER_3_2: ++ rampatch_file_path = ROME_RAMPATCH_TLV_3_0_2_PATH; ++ nvm_file_path = ROME_NVM_TLV_3_0_2_PATH; ++ goto download; + 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; +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index 9d18c576fcae..77e85e7e7b19 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -204,9 +204,17 @@ typedef struct + #define ROME_NVM_TLV_2_0_1_PATH "/lib/firmware/nvm_tlv_2.1.bin" + #define ROME_RAMPATCH_TLV_3_0_0_PATH "/lib/firmware/qca/rampatch_tlv_3.0.tlv" + #define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/qca/nvm_tlv_3.0.bin" ++#define ROME_RAMPATCH_TLV_3_0_2_PATH "/lib/firmware/qca/rampatch_tlv_3.2.tlv" ++#define ROME_NVM_TLV_3_0_2_PATH "/lib/firmware/qca/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" + ++/* This header value in rampatch file decides event handling mechanism in the HOST */ ++#define ROME_SKIP_EVT_NONE 0x00 ++#define ROME_SKIP_EVT_VSE 0x01 ++#define ROME_SKIP_EVT_CC 0x02 ++#define ROME_SKIP_EVT_VSE_CC 0x03 ++ + /****************************************************************************** + ** Local type definitions + ******************************************************************************/ +@@ -251,7 +259,8 @@ typedef struct { + unsigned int tlv_patch_data_len; + unsigned char sign_ver; + unsigned char sign_algorithm; +- unsigned short reserved1; ++ unsigned char dwnd_cfg; ++ unsigned char reserved1; + unsigned short prod_id; + unsigned short build_ver; + unsigned short patch_ver; +@@ -306,7 +315,8 @@ enum{ + ROME_PATCH_VER_0100 = 0x0100, + ROME_PATCH_VER_0101 = 0x0101, + ROME_PATCH_VER_0200 = 0x0200, +- ROME_PATCH_VER_0300 = 0x0300 ++ ROME_PATCH_VER_0300 = 0x0300, ++ ROME_PATCH_VER_0302 = 0x0302 + }; + + enum{ +@@ -314,6 +324,7 @@ enum{ + ROME_SOC_ID_11 = 0x00000011, + ROME_SOC_ID_13 = 0x00000013, + ROME_SOC_ID_22 = 0x00000022, ++ ROME_SOC_ID_44 = 0x00000044 + }; + + enum{ +@@ -323,6 +334,7 @@ enum{ + ROME_VER_1_3 = ((ROME_PATCH_VER_0200 << 16 ) | ROME_SOC_ID_00 ), + 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 ) + }; + #endif /* HW_ROME_H */ diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0010-bluetooth-Use-correct-TTY-ioctl-calls-for-flow-contr.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0010-bluetooth-Use-correct-TTY-ioctl-calls-for-flow-contr.patch new file mode 100644 index 000000000..b48e915e2 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0010-bluetooth-Use-correct-TTY-ioctl-calls-for-flow-contr.patch @@ -0,0 +1,189 @@ +From: Anantha Krishnan +Date: Thu, 4 Dec 2014 17:23:58 +0530 +Subject: [PATCH] bluetooth: Use correct TTY ioctl calls for flow control + operations + +BT firmware download application is using incorrect APIs for +performing flow off and flow on operations. As a result, the local +UART Controller is detecting breaks errors on the UART HW lines. + +Appliaction should use TIOCMGET and TIOCMSET ioctl()'s for flow +control operations instead of the tcsetattr() call. Also, the +application should set the value of "number of bits per character" +value to 8 and not as 5. + +Due to incorrect APIs used for flow control operation and wrong +value configured for CSIZE parameter, the local UART Controller +detected break errors on the UART HW lines. This caused the +firmware download operation to fail and resulted in BT ON failure. + +Change-Id: Id0ac1276609eceb528163860cc87267aaa50fede +--- + tools/hciattach_rome.c | 67 +++++++++++++++++++++++++++++++++----------------- + tools/hciattach_rome.h | 6 +++-- + 2 files changed, 49 insertions(+), 24 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index c6d528f118e1..1e689273b851 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -1,6 +1,6 @@ + /* + * +- * Copyright (c) 2013, The Linux Foundation. All rights reserved. ++ * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Not a Contribution. + * + * Copyright 2012 The Android Open Source Project +@@ -31,6 +31,7 @@ + + #define LOG_TAG "bt_vendor" + #include ++#include + #include + #include + #include +@@ -139,6 +140,16 @@ void userial_vendor_set_baud(unsigned char userial_baud) + unsigned int tcio_baud; + fprintf(stderr, "## userial_vendor_set_baud: %d\n", userial_baud); + ++ if (tcgetattr(vnd_userial.fd, &vnd_userial.termios) < 0) { ++ perror("Can't get port settings"); ++ return; ++ } ++ cfmakeraw(&vnd_userial.termios); ++ vnd_userial.termios.c_cflag |= CLOCAL; ++ vnd_userial.termios.c_cflag |= CREAD; ++ vnd_userial.termios.c_cflag |= CS8; ++ tcsetattr(vnd_userial.fd, TCSANOW, &vnd_userial.termios); ++ + userial_to_tcio_baud(userial_baud, &tcio_baud); + + cfsetospeed(&vnd_userial.termios, tcio_baud); +@@ -169,6 +180,7 @@ int userial_vendor_ioctl(int fd, userial_vendor_ioctl_op_t op, int *p_data) + cfmakeraw(&ti); + ti.c_cflag |= CLOCAL; + ti.c_cflag |= CREAD; ++ ti.c_cflag |= CS8; + + switch(op) + { +@@ -1445,6 +1457,29 @@ error: + + } + ++static void flow_control(int fd, int opt) ++{ ++ struct termios c_opt; ++ ++ ioctl(fd, TIOCMGET, &c_opt); ++ c_opt.c_cc[VTIME] = 0; /* inter-character timer unused */ ++ c_opt.c_cc[VMIN] = 0; /* blocking read until 8 chars received */ ++ c_opt.c_cflag &= ~CSIZE; ++ c_opt.c_cflag |= (CS8 | CLOCAL | CREAD); ++ if (MSM_ENABLE_FLOW_CTRL) ++ c_opt.c_cflag |= CRTSCTS; ++ else if (MSM_DISABLE_FLOW_CTRL) ++ c_opt.c_cflag |= ~CRTSCTS; ++ else { ++ fprintf(stderr, "%s: Incorrect option passed for TIOCMSET\n", __func__); ++ return; ++ } ++ c_opt.c_iflag = IGNPAR; ++ c_opt.c_oflag = 0; ++ c_opt.c_lflag = 0; ++ ioctl(fd, TIOCMSET, &c_opt); ++} ++ + + int rome_set_baudrate_req(int fd) + { +@@ -1464,12 +1499,10 @@ int rome_set_baudrate_req(int fd) + + /* Total length of the packet to be sent to the Controller */ + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + VSC_SET_BAUDRATE_REQ_LEN); ++ + /* Flow off during baudrate change */ +- if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_OFF , &flags)) < 0) +- { +- fprintf(stderr, "%s: HW Flow-off error: 0x%x\n", __FUNCTION__, err); +- goto error; +- } ++ flow_control(fd, MSM_DISABLE_FLOW_CTRL); ++ + /* Send the HCI command packet to UART for transmission */ + fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3],cmd[4]) ; + err = write(fd, cmd, size); +@@ -1481,11 +1514,8 @@ int rome_set_baudrate_req(int fd) + userial_vendor_set_baud(USERIAL_BAUD_3M); + + /* Flow on after changing local uart baudrate */ +- if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_ON , &flags)) < 0) +- { +- fprintf(stderr, "%s: HW Flow-on error: 0x%x \n", __FUNCTION__, err); +- return err; +- } ++ flow_control(fd, MSM_ENABLE_FLOW_CTRL); ++ + /* Check for response from the Controller */ + if ((err =read_vs_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE)) < 0) { + fprintf(stderr, "%s: Failed to get HCI-VS Event from SOC\n", __FUNCTION__); +@@ -1528,11 +1558,8 @@ int rome_hci_reset_req(int fd) + size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE); + + /* Flow off during baudrate change */ +- if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_OFF , &flags)) < 0) +- { +- fprintf(stderr, "%s: HW Flow-off error: 0x%x\n", __FUNCTION__, err); +- goto error; +- } ++ flow_control(fd, MSM_DISABLE_FLOW_CTRL); ++ + /* Send the HCI command packet to UART for transmission */ + fprintf(stderr, "%s: HCI CMD: 0x%x 0x%x 0x%x 0x%x\n", __FUNCTION__, cmd[0], cmd[1], cmd[2], cmd[3]); + err = write(fd, cmd, size); +@@ -1545,11 +1572,8 @@ int rome_hci_reset_req(int fd) + userial_vendor_set_baud(USERIAL_BAUD_3M); + + /* Flow on after changing local uart baudrate */ +- if ((err = userial_vendor_ioctl(fd, USERIAL_OP_FLOW_ON , &flags)) < 0) +- { +- fprintf(stderr, "%s: HW Flow-on error: 0x%x \n", __FUNCTION__, err); +- return err; +- } ++ flow_control(fd, MSM_ENABLE_FLOW_CTRL); ++ + /* Wait for command complete event */ + err = read_hci_event(fd, rsp, HCI_MAX_EVENT_SIZE); + if ( err < 0) { +@@ -1616,7 +1640,6 @@ int qca_soc_init(int fd, char *bdaddr) + int err = -1; + int size; + +- fprintf(stderr, " %s \n", __FUNCTION__); + vnd_userial.fd = fd; + /* Get Rome version information */ + if((err = rome_patch_ver_req(fd)) <0){ +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index 77e85e7e7b19..ef3647e6a69b 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -1,7 +1,7 @@ + /* +- * Copyright 2012 The Android Open Source Project +- * Copyright (c) 2013, The Linux Foundation. All rights reserved. ++ * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Not a Contribution. ++ * Copyright 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. +@@ -40,6 +40,8 @@ + #define NVITEM_SIZE 2 + #define PERSIST_HEADER_LEN 3 + #define BD_ADDR_LEN 6 ++#define MSM_ENABLE_FLOW_CTRL 16 ++#define MSM_DISABLE_FLOW_CTRL 17 + + unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + typedef enum { diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0011-bluetooth-Add-support-for-multi-baud-rate.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0011-bluetooth-Add-support-for-multi-baud-rate.patch new file mode 100644 index 000000000..05a06061e --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0011-bluetooth-Add-support-for-multi-baud-rate.patch @@ -0,0 +1,256 @@ +From: Anantha Krishnan +Date: Tue, 20 Jan 2015 12:43:20 +0530 +Subject: [PATCH] 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. + +Change-Id: I4bbaf7db01ffb983c38dca7c4a4a56f579c678a8 +--- + tools/hciattach.c | 2 +- + tools/hciattach.h | 2 +- + tools/hciattach_rome.c | 109 ++++++++++++++++++++++++++++++++++++++++++------- + tools/hciattach_rome.h | 23 +++++++++++ + 4 files changed, 119 insertions(+), 17 deletions(-) + +diff --git a/tools/hciattach.c b/tools/hciattach.c +index 13f073325c43..6de4129dfd8f 100644 +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -340,7 +340,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 +index 2021c33a9824..c5aa495ac3ee 100644 +--- a/tools/hciattach.h ++++ b/tools/hciattach.h +@@ -63,7 +63,7 @@ int ath3k_init(int fd, int speed, int init_speed, char *bdaddr, + struct termios *ti); + int ath3k_post(int fd, int pm); + int qualcomm_init(int fd, int speed, struct termios *ti, const char *bdaddr); +-int qca_soc_init(int fd, char *bdaddr); ++int qca_soc_init(int fd, int speed, 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, + const char *bdaddr); +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 1e689273b851..37974290ae0a 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -1481,7 +1481,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]; +@@ -1495,7 +1495,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); +@@ -1511,7 +1511,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); +@@ -1537,7 +1537,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]; +@@ -1569,7 +1569,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); +@@ -1635,10 +1635,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; + /* Get Rome version information */ +@@ -1687,7 +1746,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; +@@ -1721,13 +1780,23 @@ int qca_soc_init(int fd, char *bdaddr) + nvm_file_path = TF_NVM_TLV_1_0_0_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; + } +- fprintf(stderr, "%s: Baud rate changed successfully \n", __FUNCTION__); ++ 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) ++ 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; ++ } ++ } + + /* Donwload TLV files (rampatch, NVM) */ + err = rome_download_tlv_file(fd); +@@ -1737,8 +1806,18 @@ 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 +index ef3647e6a69b..1500ddd3a79f 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -78,6 +78,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 diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0012-Override-PCM-Settings-by-reading-configuration-file.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0012-Override-PCM-Settings-by-reading-configuration-file.patch new file mode 100644 index 000000000..c86dee8e7 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0012-Override-PCM-Settings-by-reading-configuration-file.patch @@ -0,0 +1,144 @@ +From: Kamal Negi +Date: Tue, 30 Dec 2014 19:15:08 +0530 +Subject: [PATCH] Override PCM Settings by reading configuration file + +Configure the PCM role as master or slave depending upon +the platform's support. This configuration is provided +in the config file which is read during the firmware +download process and the default PCM configuration is +overwritten with this value. + +Change-Id: If0eae58b4cd32d75b3bcb669bc73dca67652473c +Signed-off-by: Kamal Negi +--- + tools/hciattach_rome.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++--- + tools/hciattach_rome.h | 8 ++++++ + 2 files changed, 71 insertions(+), 4 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 37974290ae0a..99866e23e99e 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -1,6 +1,6 @@ + /* + * +- * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. ++ * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Not a Contribution. + * + * Copyright 2012 The Android Open Source Project +@@ -873,6 +873,44 @@ error: + return err; + } + ++int get_value_from_config(char *file_path,char *param) ++{ ++ FILE *pfile = NULL; ++ char *line = NULL; ++ char *pch = NULL; ++ char param_str[20]; ++ int bytes_read = 0, position; ++ int ret = -1; ++ ++ if (!file_path || !param) { ++ fprintf(stderr,"Invalid arguments\n"); ++ return -EINVAL; ++ } ++ ++ pfile = fopen(file_path, "r" ); ++ if (!pfile) { ++ fprintf(stderr, "Failed to open %s\n", file_path); ++ return ret; ++ } ++ ++ while (getline(&line, &bytes_read, pfile) > 0 ) { ++ if (line[0] != '#' && line[0] != '\n') { ++ pch = memchr(line, '=', strlen(line)); ++ if (pch != NULL) { ++ position = pch - line; ++ strncpy(param_str, line, position); ++ if (strncmp(param_str, param, position) == 0) { ++ ret = atoi(pch + 1); ++ break; ++ } ++ } ++ } ++ } ++ free(line); ++ fclose(pfile); ++ return ret; ++} ++ + int rome_get_tlv_file(char *file_path) + { + FILE * pFile; +@@ -884,7 +922,7 @@ int rome_get_tlv_file(char *file_path) + unsigned char data_buf[PRINT_BUF_SIZE]={0,}; + unsigned char *nvm_byte_ptr; + unsigned char bdaddr[6]; +- ++ unsigned short pcm_value; + fprintf(stderr, "File Open (%s)\n", file_path); + pFile = fopen ( file_path , "r" ); + if (pFile==NULL) {; +@@ -970,9 +1008,30 @@ int rome_get_tlv_file(char *file_path) + *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), + *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); + } ++ /* Read from file and check what PCM Configuration is required: ++ * Master = 0 /Slave = 1 */ ++ /* Override PCM configuration */ ++ if (nvm_ptr->tag_id == TAG_NUM_44) { ++ if ((pcm_value = ++ get_value_from_config(PCM_CONFIG_FILE_PATH, "PCM")) >= 0) { ++ ++ if (pcm_value == PCM_SLAVE) { ++ nvm_byte_ptr[PCM_MS_OFFSET_1] |= ++ (1 << PCM_ROLE_BIT_OFFSET); ++ nvm_byte_ptr[PCM_MS_OFFSET_2] |= ++ (1 << PCM_ROLE_BIT_OFFSET); ++ } else if (pcm_value == PCM_MASTER) { ++ nvm_byte_ptr[PCM_MS_OFFSET_1] &= ++ (~(1 << PCM_ROLE_BIT_OFFSET)); ++ nvm_byte_ptr[PCM_MS_OFFSET_2] &= ++ (~(1 << PCM_ROLE_BIT_OFFSET)); ++ } ++ } ++ } + +- for(i =0;(itag_len && (i*3 + 2) tag_len && (i*3 + 2) < PRINT_BUF_SIZE);i++) ++ snprintf((char *) data_buf, PRINT_BUF_SIZE, "%s%.02x ", ++ (char *)data_buf, *(nvm_byte_ptr + i)); + + fprintf(stderr, "TAG Data\t\t\t : %s\n", data_buf); + +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index 1500ddd3a79f..f591c10e4f2b 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -202,8 +202,15 @@ typedef struct + #define NVM_ACCESS_SET 0x01 + #define TAG_NUM_OFFSET 5 + #define TAG_NUM_2 2 ++#define TAG_NUM_44 44 + #define TAG_BDADDR_OFFSET 7 + ++#define PCM_MS_OFFSET_1 9 ++#define PCM_MS_OFFSET_2 33 ++ ++#define PCM_SLAVE 1 ++#define PCM_MASTER 0 ++#define PCM_ROLE_BIT_OFFSET 4 + #define MAX_RETRY_CNT 1 + #define SELECT_TIMEOUT 3 + +@@ -240,6 +247,7 @@ typedef struct + #define ROME_SKIP_EVT_CC 0x02 + #define ROME_SKIP_EVT_VSE_CC 0x03 + ++#define PCM_CONFIG_FILE_PATH "/etc/bluetooth/pcm.conf" + /****************************************************************************** + ** Local type definitions + ******************************************************************************/ diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0013-Add-support-for-Tufello-1.1-SOC.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0013-Add-support-for-Tufello-1.1-SOC.patch new file mode 100644 index 000000000..f47a9d47e --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0013-Add-support-for-Tufello-1.1-SOC.patch @@ -0,0 +1,169 @@ +From: Rupesh Tatiya +Date: Thu, 29 Jan 2015 15:36:27 +0530 +Subject: [PATCH] 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 +--- + tools/hciattach_rome.c | 29 ++++++++++++++++++----------- + tools/hciattach_rome.h | 10 +++++++--- + 2 files changed, 25 insertions(+), 14 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 99866e23e99e..fee36f904e04 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -621,7 +621,7 @@ int rome_edl_set_patch_request(int fd) + -1, PATCH_HDR_LEN + 1); + + /* Total length of the packet to be sent to the Controller */ +- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); +@@ -670,7 +670,7 @@ int rome_edl_patch_download_request(int fd) + index, MAX_DATA_PER_SEGMENT); + + /* Total length of the packet to be sent to the Controller */ +- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Initialize the RSP packet everytime to 0 */ + memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); +@@ -707,7 +707,7 @@ int rome_edl_patch_download_request(int fd) + memset(rsp, 0x0, HCI_MAX_EVENT_SIZE); + + /* Total length of the packet to be sent to the Controller */ +- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); +@@ -824,7 +824,7 @@ int rome_attach_rampatch(int fd) + -1, EDL_PATCH_CMD_LEN); + + /* Total length of the packet to be sent to the Controller */ +- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + cmd[PLEN]); + + /* Send HCI Command packet to Controller */ + err = hci_send_vs_cmd(fd, (unsigned char *)cmd, rsp, size); +@@ -854,7 +854,7 @@ int rome_rampatch_reset(int fd) + -1, EDL_PATCH_CMD_LEN); + + /* Total length of the packet to be sent to the Controller */ +- size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); ++ size = (HCI_CMD_IND + HCI_COMMAND_HDR_SIZE + EDL_PATCH_CMD_LEN); + + /* Send HCI Command packet to Controller */ + err = write(fd, cmd, size); +@@ -1058,7 +1058,7 @@ int rome_tlv_dnld_segment(int fd, int index, int seg_size, unsigned char wait_cc + unsigned char cmd[HCI_MAX_CMD_SIZE]; + unsigned char rsp[HCI_MAX_EVENT_SIZE]; + +- fprintf(stderr, "%s: Downloading TLV Patch segment no.%d, size:%d\n", __FUNCTION__, index, seg_size); ++ fprintf(stderr, "%s: Downloading TLV Patch segment no.%d, size:%d wait_cc_evt = 0x%x\n", __FUNCTION__, index, seg_size, wait_cc_evt); + + /* Frame the HCI CMD PKT to be sent to Controller*/ + frame_hci_cmd_pkt(cmd, EDL_PATCH_TLV_REQ_CMD, 0, index, seg_size); +@@ -1092,6 +1092,7 @@ int rome_tlv_dnld_req(int fd, int tlv_size) + { + int total_segment, remain_size, i, err = -1; + unsigned char wait_cc_evt; ++ unsigned int rom = rome_ver >> 16; + + total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT; + remain_size = (tlv_size < MAX_SIZE_PER_TLV_SEGMENT)?\ +@@ -1132,14 +1133,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 +@@ -1158,13 +1160,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 +@@ -1837,6 +1840,10 @@ int qca_soc_init(int fd, int speed, 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: + /* Check if user requested for 115200 kbps */ +@@ -1881,7 +1888,7 @@ download: + fprintf(stderr, "HCI Reset Failed !!!\n"); + goto error; + } +- fprintf(stderr, "HCI Reset is done\n"); ++ fprintf(stderr, "HCI Reset is done\n"); + + break; + case ROME_VER_UNKNOWN: +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index f591c10e4f2b..95d5f1e8a5c2 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -238,8 +238,10 @@ typedef struct + #define ROME_NVM_TLV_3_0_0_PATH "/lib/firmware/qca/nvm_tlv_3.0.bin" + #define ROME_RAMPATCH_TLV_3_0_2_PATH "/lib/firmware/qca/rampatch_tlv_3.2.tlv" + #define ROME_NVM_TLV_3_0_2_PATH "/lib/firmware/qca/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" ++#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/rampatch_tlv_tf_1.1.tlv" ++#define TF_NVM_TLV_1_0_1_PATH "/lib/firmware/qca/nvm_tlv_tf_1.1.bin" + + /* This header value in rampatch file decides event handling mechanism in the HOST */ + #define ROME_SKIP_EVT_NONE 0x00 +@@ -357,6 +359,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 + }; + +@@ -368,6 +371,7 @@ 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 ) + }; + #endif /* HW_ROME_H */ diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0014-bluetooth-Vote-UART-CLK-ON-prior-to-firmware-downloa.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0014-bluetooth-Vote-UART-CLK-ON-prior-to-firmware-downloa.patch new file mode 100644 index 000000000..ffb182062 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0014-bluetooth-Vote-UART-CLK-ON-prior-to-firmware-downloa.patch @@ -0,0 +1,74 @@ +From: Anantha Krishnan +Date: Wed, 4 Feb 2015 12:29:07 +0530 +Subject: [PATCH] bluetooth: Vote UART CLK ON prior to firmware download + process + +Before starting the firmware download process, vote UART CLK ON +to avoid triggering the dynamic suspend of UART driver. Post +firmware download and in error scenarios vote UART CLK OFF. + +As per design, the UART driver enters into dynamic suspend if +there are no activity on the UART lines for 100ms. Depending upon +the rampatch size, the BT Controller takes time to apply the +downloaded rampatch segments and in sending the vendor specific +event. If the BT Controller takes > 100ms time in sending the +vendor specific event, the UART driver enters into suspend state. + +As a result, UART driver fails to process the last vendor specific +event sent by the BT Controller. The VSE sent by BT Controller +wakes up the UART driver, but the data is not processed causing +firmware download failures. + +Hence, vote UART CLK ON prior to firmware download process and +vote UART CLK OFF post firmware download proess and in error +scenarios. + +Change-Id: I447ded33ad1cfaa020b491effce368fbfe41f894 +--- + tools/hciattach_rome.c | 13 +++++++++++++ + tools/hciattach_rome.h | 2 ++ + 2 files changed, 15 insertions(+) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index fee36f904e04..574ceac6c750 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -1762,6 +1762,14 @@ int qca_soc_init(int fd, int speed, char *bdaddr) + int size, local_baud_rate = 0, controller_baud_rate = 0; + + vnd_userial.fd = fd; ++ ++ /* Vote for UART CLK prior to FW download */ ++ err = ioctl(fd, USERIAL_OP_CLK_ON); ++ if (err < 0) { ++ fprintf(stderr, "%s: Failed to vote UART CLK ON\n", __func__); ++ return -1; ++ } ++ + /* Get Rome version information */ + if((err = rome_patch_ver_req(fd)) <0){ + fprintf(stderr, "%s: Fail to get Rome Version (0x%x)\n", __FUNCTION__, err); +@@ -1899,5 +1907,10 @@ download: + } + + error: ++ /* Vote UART CLK OFF post to FW download */ ++ err = ioctl(fd, USERIAL_OP_CLK_OFF); ++ if (err < 0) ++ fprintf(stderr, "%s: Failed to vote UART CLK OFF!!!\n", __func__); ++ + return err; + } +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index 95d5f1e8a5c2..20264f9978d9 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -42,6 +42,8 @@ + #define BD_ADDR_LEN 6 + #define MSM_ENABLE_FLOW_CTRL 16 + #define MSM_DISABLE_FLOW_CTRL 17 ++#define USERIAL_OP_CLK_ON 0x5441 ++#define USERIAL_OP_CLK_OFF 0x5442 + + unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + typedef enum { diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0015-Override-IBS-settings-by-reading-configuration-file.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0015-Override-IBS-settings-by-reading-configuration-file.patch new file mode 100644 index 000000000..0a1e865ba --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0015-Override-IBS-settings-by-reading-configuration-file.patch @@ -0,0 +1,127 @@ +From: Kamal Negi +Date: Thu, 30 Apr 2015 15:53:06 +0530 +Subject: [PATCH] Override IBS settings by reading configuration file + +Configure the IBS value in Firmware by reading the +configuration file.This configuration value is +provided in the config file which is read during +the firmware download process and the default +configuration value is overwritten with this value. + +Change-Id: I47992a573b3137ac9bfb80538727981f56b328c4 +Signed-off-by: Kamal Negi +--- + tools/hciattach_rome.c | 42 +++++++++++++++++++++++++++++------------- + tools/hciattach_rome.h | 24 ++++++++++++++++-------- + 2 files changed, 45 insertions(+), 21 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 574ceac6c750..6a3f33867c12 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -922,7 +922,8 @@ int rome_get_tlv_file(char *file_path) + unsigned char data_buf[PRINT_BUF_SIZE]={0,}; + unsigned char *nvm_byte_ptr; + unsigned char bdaddr[6]; +- unsigned short pcm_value; ++ unsigned short pcm_value, ibs_value; ++ + fprintf(stderr, "File Open (%s)\n", file_path); + pFile = fopen ( file_path , "r" ); + if (pFile==NULL) {; +@@ -1008,23 +1009,38 @@ int rome_get_tlv_file(char *file_path) + *nvm_byte_ptr, *(nvm_byte_ptr+1), *(nvm_byte_ptr+2), + *(nvm_byte_ptr+3), *(nvm_byte_ptr+4), *(nvm_byte_ptr+5)); + } ++ ++ if (nvm_ptr->tag_id == TAG_NUM_17) { ++ if ((ibs_value = ++ get_value_from_config(FW_CONFIG_FILE_PATH, "IBS")) >= 0) { ++ if (ibs_value == FWCONF_IBS_DISABLE) { ++ nvm_byte_ptr[FWCONF_IBS_VAL_OFFSET] &= ++ (~(FWCONF_IBS_ENABLE << ++ FWCONF_IBS_VAL_BIT)); ++ } else if (ibs_value == FWCONF_IBS_ENABLE) { ++ nvm_byte_ptr[FWCONF_IBS_VAL_OFFSET] |= ++ (FWCONF_IBS_ENABLE << ++ FWCONF_IBS_VAL_BIT); ++ } ++ } ++ } + /* Read from file and check what PCM Configuration is required: + * Master = 0 /Slave = 1 */ + /* Override PCM configuration */ + if (nvm_ptr->tag_id == TAG_NUM_44) { + if ((pcm_value = +- get_value_from_config(PCM_CONFIG_FILE_PATH, "PCM")) >= 0) { +- +- if (pcm_value == PCM_SLAVE) { +- nvm_byte_ptr[PCM_MS_OFFSET_1] |= +- (1 << PCM_ROLE_BIT_OFFSET); +- nvm_byte_ptr[PCM_MS_OFFSET_2] |= +- (1 << PCM_ROLE_BIT_OFFSET); +- } else if (pcm_value == PCM_MASTER) { +- nvm_byte_ptr[PCM_MS_OFFSET_1] &= +- (~(1 << PCM_ROLE_BIT_OFFSET)); +- nvm_byte_ptr[PCM_MS_OFFSET_2] &= +- (~(1 << PCM_ROLE_BIT_OFFSET)); ++ get_value_from_config(FW_CONFIG_FILE_PATH, "PCM")) >= 0) { ++ ++ if (pcm_value == FWCONF_PCM_SLAVE) { ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] |= ++ (1 << FWCONF_PCM_ROLE_BIT_OFFSET); ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] |= ++ (1 << FWCONF_PCM_ROLE_BIT_OFFSET); ++ } else if (pcm_value == FWCONF_PCM_MASTER) { ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_1] &= ++ (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); ++ nvm_byte_ptr[FWCONF_PCM_MS_OFFSET_2] &= ++ (~(1 << FWCONF_PCM_ROLE_BIT_OFFSET)); + } + } + } +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index 20264f9978d9..8eaeeed8bc96 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -203,16 +203,24 @@ typedef struct + #define TAG_END 0xFF + #define NVM_ACCESS_SET 0x01 + #define TAG_NUM_OFFSET 5 +-#define TAG_NUM_2 2 +-#define TAG_NUM_44 44 ++#define TAG_NUM_2 2 ++#define TAG_NUM_17 (17) ++#define TAG_NUM_44 44 + #define TAG_BDADDR_OFFSET 7 + +-#define PCM_MS_OFFSET_1 9 +-#define PCM_MS_OFFSET_2 33 ++/* FW PCM Configuration */ ++#define FWCONF_PCM_MS_OFFSET_1 9 ++#define FWCONF_PCM_MS_OFFSET_2 33 ++#define FWCONF_PCM_SLAVE 1 ++#define FWCONF_PCM_MASTER 0 ++#define FWCONF_PCM_ROLE_BIT_OFFSET 4 ++ ++/* FW IBS Configuration */ ++#define FWCONF_IBS_DISABLE (0) ++#define FWCONF_IBS_ENABLE (1) ++#define FWCONF_IBS_VAL_BIT (7) ++#define FWCONF_IBS_VAL_OFFSET (0) + +-#define PCM_SLAVE 1 +-#define PCM_MASTER 0 +-#define PCM_ROLE_BIT_OFFSET 4 + #define MAX_RETRY_CNT 1 + #define SELECT_TIMEOUT 3 + +@@ -251,7 +259,7 @@ typedef struct + #define ROME_SKIP_EVT_CC 0x02 + #define ROME_SKIP_EVT_VSE_CC 0x03 + +-#define PCM_CONFIG_FILE_PATH "/etc/bluetooth/pcm.conf" ++#define FW_CONFIG_FILE_PATH "/etc/bluetooth/firmware.conf" + /****************************************************************************** + ** Local type definitions + ******************************************************************************/ diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0016-Handle-NULL-Pointer-derefrencing-in-AVRCP-Target-rol.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0016-Handle-NULL-Pointer-derefrencing-in-AVRCP-Target-rol.patch new file mode 100644 index 000000000..19bd40406 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0016-Handle-NULL-Pointer-derefrencing-in-AVRCP-Target-rol.patch @@ -0,0 +1,79 @@ +From: Kamal Negi +Date: Fri, 8 May 2015 15:01:02 +0530 +Subject: [PATCH] Handle NULL Pointer derefrencing in AVRCP Target role + +Check NULL pointer to AVRCP controller role initialized or not. +If remote device don't support the AVRCP target role, then HOST dont +initialize AVRCP controller role and directly dereference the controller +role and segfault happens. + +Change-Id: Ibbb9452f17a576c3a79a53ea72e0211982752144 +Signed-off-by: Kamal Negi +--- + profiles/audio/avrcp.c | 27 ++++++++++++++++++++++----- + 1 file changed, 22 insertions(+), 5 deletions(-) + +diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c +index d66f67032624..9fa939d9548b 100644 +--- a/profiles/audio/avrcp.c ++++ b/profiles/audio/avrcp.c +@@ -1808,13 +1808,19 @@ static gboolean avrcp_get_play_status_rsp(struct avctp *conn, + void *user_data) + { + struct avrcp *session = user_data; +- struct avrcp_player *player = session->controller->player; +- struct media_player *mp = player->user_data; ++ struct avrcp_player *player; ++ struct media_player *mp; + struct avrcp_header *pdu = (void *) operands; + uint32_t duration; + uint32_t position; + uint8_t status; + ++ if (!session || !session->controller) ++ return FALSE; ++ ++ player = session->controller->player; ++ mp = player->user_data; ++ + if (pdu == NULL || code == AVC_CTYPE_REJECTED || + ntohs(pdu->params_len) != 9) + return FALSE; +@@ -1872,12 +1878,18 @@ static gboolean avrcp_player_value_rsp(struct avctp *conn, + void *user_data) + { + struct avrcp *session = user_data; +- struct avrcp_player *player = session->controller->player; +- struct media_player *mp = player->user_data; ++ struct avrcp_player *player; ++ struct media_player *mp; + struct avrcp_header *pdu = (void *) operands; + uint8_t count; + int i; + ++ if (!session || !session->controller) ++ return FALSE; ++ ++ player = session->controller->player; ++ mp = player->user_data; ++ + if (pdu == NULL) { + media_player_set_setting(mp, "Error", "Timeout"); + return FALSE; +@@ -2028,10 +2040,15 @@ static gboolean avrcp_get_element_attributes_rsp(struct avctp *conn, + void *user_data) + { + struct avrcp *session = user_data; +- struct avrcp_player *player = session->controller->player; ++ struct avrcp_player *player; + struct avrcp_header *pdu = (void *) operands; + uint8_t count; + ++ if (!session || !session->controller) ++ return FALSE; ++ ++ player = session->controller->player; ++ + if (code == AVC_CTYPE_REJECTED) + return FALSE; + diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0017-bluetooth-Fix-flow-control-operation.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0017-bluetooth-Fix-flow-control-operation.patch new file mode 100644 index 000000000..ce05c2928 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0017-bluetooth-Fix-flow-control-operation.patch @@ -0,0 +1,52 @@ +From: Dibyendu Roy +Date: Fri, 22 May 2015 18:57:05 +0530 +Subject: [PATCH] bluetooth: Fix flow control operation + +Flow off operation was not actually happening at the UART line level, +since the argument passed was not being used correctly. As a result, +sometimes command complete and VS event were sent by BT SOC even +before the local UART Controller could change its baud rate to the +newer one(3 Mbps). This led to VS event being processed +incorrectly which in turn causes baud rate change to fail. + +CRs-Fixed: 844730 +Change-Id: I06d8c4ed7807aa47dd5498642c7a23c9189a1cff +Signed-off-by: Dibyendu Roy +--- + tools/hciattach_rome.c | 6 +++--- + tools/hciattach_rome.h | 4 ++-- + 2 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 6a3f33867c12..0d7014f1d2f6 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -1544,10 +1544,10 @@ static void flow_control(int fd, int opt) + c_opt.c_cc[VMIN] = 0; /* blocking read until 8 chars received */ + c_opt.c_cflag &= ~CSIZE; + c_opt.c_cflag |= (CS8 | CLOCAL | CREAD); +- if (MSM_ENABLE_FLOW_CTRL) ++ if (opt == MSM_ENABLE_FLOW_CTRL) + c_opt.c_cflag |= CRTSCTS; +- else if (MSM_DISABLE_FLOW_CTRL) +- c_opt.c_cflag |= ~CRTSCTS; ++ else if (opt == MSM_DISABLE_FLOW_CTRL) ++ c_opt.c_cflag &= ~CRTSCTS; + else { + fprintf(stderr, "%s: Incorrect option passed for TIOCMSET\n", __func__); + return; +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index 8eaeeed8bc96..3fdaf208e522 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -40,8 +40,8 @@ + #define NVITEM_SIZE 2 + #define PERSIST_HEADER_LEN 3 + #define BD_ADDR_LEN 6 +-#define MSM_ENABLE_FLOW_CTRL 16 +-#define MSM_DISABLE_FLOW_CTRL 17 ++#define MSM_DISABLE_FLOW_CTRL 0 ++#define MSM_ENABLE_FLOW_CTRL 1 + #define USERIAL_OP_CLK_ON 0x5441 + #define USERIAL_OP_CLK_OFF 0x5442 + diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0018-Adding-MDM-specific-code-under-_PLATFORM_MDM_.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0018-Adding-MDM-specific-code-under-_PLATFORM_MDM_.patch new file mode 100644 index 000000000..c2987d399 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0018-Adding-MDM-specific-code-under-_PLATFORM_MDM_.patch @@ -0,0 +1,65 @@ +From: Dibyendu Roy +Date: Thu, 11 Jun 2015 12:07:43 +0530 +Subject: [PATCH] Adding MDM specific code under _PLATFORM_MDM_ + +This patch is added to comment out the commit +84cc0e12983b5761c67789ef93fd6fb164c7314d in x86 as +dynamic suspend feature is not available in x86. However, +this code shall be active for MDM platform due to +dynamic suspend feature. + +Change-Id: I998f0521b4a5f9744412db40f2c2d3bff2ac3d11 +--- + tools/hciattach_rome.c | 5 ++++- + tools/hciattach_rome.h | 3 +++ + 2 files changed, 7 insertions(+), 1 deletion(-) + +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 0d7014f1d2f6..1891de24e21a 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -1779,13 +1779,14 @@ int qca_soc_init(int fd, int speed, char *bdaddr) + + vnd_userial.fd = fd; + ++#ifdef _PLATFORM_MDM_ + /* Vote for UART CLK prior to FW download */ + err = ioctl(fd, USERIAL_OP_CLK_ON); + if (err < 0) { + fprintf(stderr, "%s: Failed to vote UART CLK ON\n", __func__); + return -1; + } +- ++#endif + /* Get Rome version information */ + if((err = rome_patch_ver_req(fd)) <0){ + fprintf(stderr, "%s: Fail to get Rome Version (0x%x)\n", __FUNCTION__, err); +@@ -1923,10 +1924,12 @@ download: + } + + error: ++#ifdef _PLATFORM_MDM_ + /* Vote UART CLK OFF post to FW download */ + err = ioctl(fd, USERIAL_OP_CLK_OFF); + if (err < 0) + fprintf(stderr, "%s: Failed to vote UART CLK OFF!!!\n", __func__); ++#endif + + return err; + } +diff --git a/tools/hciattach_rome.h b/tools/hciattach_rome.h +index 3fdaf208e522..89f7db3bef86 100644 +--- a/tools/hciattach_rome.h ++++ b/tools/hciattach_rome.h +@@ -42,8 +42,11 @@ + #define BD_ADDR_LEN 6 + #define MSM_DISABLE_FLOW_CTRL 0 + #define MSM_ENABLE_FLOW_CTRL 1 ++ ++#ifdef _PLATFORM_MDM_ + #define USERIAL_OP_CLK_ON 0x5441 + #define USERIAL_OP_CLK_OFF 0x5442 ++#endif + + unsigned char vnd_local_bd_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + typedef enum { diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0019-Bluetooth-Fix-static-analysis-issues.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0019-Bluetooth-Fix-static-analysis-issues.patch new file mode 100644 index 000000000..2b382a68e --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/ccimx6ul/0019-Bluetooth-Fix-static-analysis-issues.patch @@ -0,0 +1,58 @@ +From: Dibyendu Roy +Date: Mon, 6 Jul 2015 13:30:53 +0530 +Subject: [PATCH] Bluetooth: Fix static analysis issues + +Change-Id: Ida91f012544c39a8aaa6e7db23f1d5b68d3bec08 +--- + tools/hciattach.c | 9 ++++++++- + tools/hciattach_rome.c | 10 ++++++++-- + 2 files changed, 16 insertions(+), 3 deletions(-) + +diff --git a/tools/hciattach.c b/tools/hciattach.c +index 6de4129dfd8f..c9a5feffca2b 100644 +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -1395,7 +1395,14 @@ int main(int argc, char *argv[]) + dev[0] = 0; + if (!strchr(opt, '/')) + strcpy(dev, "/dev/"); +- strcat(dev, opt); ++ ++ if (strlen(opt) + 1 > sizeof(dev) - strlen(dev)) { ++ fprintf(stderr, "error: string truncated\n"); ++ exit(1); ++ } ++ ++ strncat(dev, opt, sizeof(dev) - strlen(dev) - 1); ++ + break; + + case 1: +diff --git a/tools/hciattach_rome.c b/tools/hciattach_rome.c +index 1891de24e21a..59bdc16e4e8f 100644 +--- a/tools/hciattach_rome.c ++++ b/tools/hciattach_rome.c +@@ -933,7 +933,13 @@ int rome_get_tlv_file(char *file_path) + + /* Get File Size */ + fseek (pFile , 0 , SEEK_END); +- fileSize = ftell (pFile); ++ ++ if((fileSize = ftell(pFile)) < 0) { ++ fprintf(stderr, "%s: fail to get current file position\n", file_path); ++ fclose (pFile); ++ return -1; ++ } ++ + rewind (pFile); + + pdata_buffer = (unsigned char*) malloc (sizeof(char)*fileSize); +@@ -1107,7 +1113,7 @@ int rome_tlv_dnld_segment(int fd, int index, int seg_size, unsigned char wait_cc + int rome_tlv_dnld_req(int fd, int tlv_size) + { + int total_segment, remain_size, i, err = -1; +- unsigned char wait_cc_evt; ++ unsigned char wait_cc_evt = FALSE; + unsigned int rom = rome_ver >> 16; + + total_segment = tlv_size/MAX_SIZE_PER_TLV_SEGMENT; diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5_%.bbappend b/meta-digi-dey/recipes-connectivity/bluez/bluez5_%.bbappend deleted file mode 100644 index abb8f84be..000000000 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5_%.bbappend +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (C) 2015 Digi International. - -FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" -SRC_URI += "file://bluez-init" - -inherit update-rc.d - -PACKAGECONFIG_append = " experimental" - -do_install_append() { - install -d ${D}${sysconfdir}/init.d/ - install -m 0755 ${WORKDIR}/bluez-init ${D}${sysconfdir}/init.d/bluez -} - -INITSCRIPT_NAME = "bluez" -INITSCRIPT_PARAMS = "start 10 5 ." diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.33.bbappend b/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.33.bbappend new file mode 100644 index 000000000..559688781 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.33.bbappend @@ -0,0 +1,41 @@ +# Copyright (C) 2015 Digi International. + +FILESEXTRAPATHS_prepend := "${THISDIR}/${BP}:" + +SRC_URI += "file://bluez-init" + +SRC_URI_append_ccimx6ul = " \ + file://0001-bluetooth-Add-bluetooth-support-for-QCA6174-chip.patch \ + file://0002-bluetooth-Enable-bluetooth-low-power-mode-functional.patch \ + file://0003-bluetooth-Fix-bug-in-firmware-parsing-mechanism.patch \ + file://0004-bluetooth-Configure-BD-Address.patch \ + file://0005-bluetooth-Remove-unused-functions-in-the-firmware-do.patch \ + file://0006-bluetooth-Enable-3Mbps-baud-rate-support.patch \ + file://0007-bluetooth-Check-TTY-buffer-for-data-availability-bef.patch \ + file://0008-bluetooth-Add-support-for-TUFEELO-firmware-download.patch \ + file://0009-bluetooth-Add-support-for-ROME-3.2-SOC.patch \ + file://0010-bluetooth-Use-correct-TTY-ioctl-calls-for-flow-contr.patch \ + file://0011-bluetooth-Add-support-for-multi-baud-rate.patch \ + file://0012-Override-PCM-Settings-by-reading-configuration-file.patch \ + file://0013-Add-support-for-Tufello-1.1-SOC.patch \ + file://0014-bluetooth-Vote-UART-CLK-ON-prior-to-firmware-downloa.patch \ + file://0015-Override-IBS-settings-by-reading-configuration-file.patch \ + file://0016-Handle-NULL-Pointer-derefrencing-in-AVRCP-Target-rol.patch \ + file://0017-bluetooth-Fix-flow-control-operation.patch \ + file://0018-Adding-MDM-specific-code-under-_PLATFORM_MDM_.patch \ + file://0019-Bluetooth-Fix-static-analysis-issues.patch \ +" + +inherit update-rc.d + +PACKAGECONFIG_append = " experimental" + +do_install_append() { + install -d ${D}${sysconfdir}/init.d/ + install -m 0755 ${WORKDIR}/bluez-init ${D}${sysconfdir}/init.d/bluez +} + +INITSCRIPT_NAME = "bluez" +INITSCRIPT_PARAMS = "start 10 5 ." + +PACKAGE_ARCH = "${MACHINE_ARCH}" From 78370fce07777de2fde1d34ecf2fb5c9a7a01f79 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 26 May 2016 12:07:52 +0200 Subject: [PATCH 017/117] recipes-kernel: Update config file for ccimx6ulsbc https://jira.digi.com/browse/DEL-2370 Signed-off-by: Isaac Hermida --- .../linux/linux-dey-4.1/ccimx6ul/defconfig | 95 ++++--------------- 1 file changed, 21 insertions(+), 74 deletions(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig index a1b0ad8f7..9796e3675 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig @@ -19,14 +19,8 @@ CONFIG_MODVERSIONS=y CONFIG_MODULE_SRCVERSION_ALL=y # CONFIG_BLK_DEV_BSG is not set CONFIG_ARCH_MXC=y -CONFIG_SOC_IMX50=y -CONFIG_SOC_IMX53=y CONFIG_SOC_IMX6Q=y -CONFIG_SOC_IMX6SL=y -CONFIG_SOC_IMX6SX=y CONFIG_SOC_IMX6UL=y -CONFIG_SOC_IMX7D=y -CONFIG_SOC_VF610=y # CONFIG_SWP_EMULATE is not set CONFIG_SMP=y CONFIG_HAVE_ARM_ARCH_TIMER=y @@ -73,12 +67,8 @@ CONFIG_BT_BNEP=y CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=y -CONFIG_BT_HCIBTUSB=y CONFIG_BT_HCIUART=y -CONFIG_BT_HCIUART_BCSP=y -CONFIG_BT_HCIUART_ATH3K=y -CONFIG_BT_HCIBCM203X=y -CONFIG_BT_ATH3K=y +CONFIG_BT_HCIUART_IBS=y CONFIG_CFG80211=m CONFIG_CFG80211_CERTIFICATION_ONUS=y CONFIG_CFG80211_DEBUGFS=y @@ -114,25 +104,22 @@ CONFIG_MTD_UBI=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=65536 -CONFIG_SENSORS_FXOS8700=y -CONFIG_SENSORS_FXAS2100X=y CONFIG_EEPROM_AT24=y CONFIG_EEPROM_AT25=y +CONFIG_SCSI=y # CONFIG_SCSI_PROC_FS is not set CONFIG_BLK_DEV_SD=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y CONFIG_SCSI_SCAN_ASYNC=y # CONFIG_SCSI_LOWLEVEL is not set -CONFIG_ATA=y -CONFIG_SATA_AHCI_PLATFORM=y -CONFIG_AHCI_IMX=y -CONFIG_PATA_IMX=y CONFIG_NETDEVICES=y +# CONFIG_NET_VENDOR_ARC is not set # CONFIG_NET_VENDOR_BROADCOM is not set CONFIG_CS89x0=y CONFIG_CS89x0_PLATFORM=y # CONFIG_NET_VENDOR_FARADAY is not set +# CONFIG_NET_VENDOR_HISILICON is not set # CONFIG_NET_VENDOR_INTEL is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MICREL is not set @@ -143,7 +130,7 @@ CONFIG_SMC91X=y CONFIG_SMC911X=y CONFIG_SMSC911X=y # CONFIG_NET_VENDOR_STMICRO is not set -CONFIG_MICREL_PHY=y +CONFIG_SMSC_PHY=y CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_RTL8152=m @@ -151,10 +138,6 @@ CONFIG_USB_USBNET=m CONFIG_USB_NET_CDC_EEM=m CONFIG_ATH_CARDS=m CONFIG_ATH_DEBUG=y -CONFIG_BCMDHD=m -CONFIG_BCMDHD_SDIO=y -CONFIG_BCMDHD_FW_PATH="/lib/firmware/bcm/fw_bcmdhd.bin" -CONFIG_BCMDHD_NVRAM_PATH="/lib/firmware/bcm/bcmdhd.cal" CONFIG_HOSTAP=y CONFIG_HOSTAP_FIRMWARE=y CONFIG_HOSTAP_FIRMWARE_NVRAM=y @@ -168,13 +151,7 @@ CONFIG_MOUSE_PS2=m CONFIG_MOUSE_PS2_ELANTECH=y CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ADS7846=y -CONFIG_TOUCHSCREEN_EGALAX=y -CONFIG_TOUCHSCREEN_ELAN_TS=y -CONFIG_TOUCHSCREEN_MAX11801=y CONFIG_TOUCHSCREEN_IMX6UL_TSC=y -CONFIG_TOUCHSCREEN_MC13783=y -CONFIG_TOUCHSCREEN_TSC2007=y -CONFIG_TOUCHSCREEN_STMPE=y CONFIG_INPUT_MISC=y CONFIG_INPUT_MMA8450=y CONFIG_INPUT_MPL3115=y @@ -198,20 +175,20 @@ CONFIG_SPI=y CONFIG_SPI_GPIO=y CONFIG_SPI_IMX=y CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_MCA_CC6UL=y CONFIG_GPIO_MAX732X=y CONFIG_GPIO_PCA953X=y CONFIG_GPIO_74X164=y CONFIG_POWER_SUPPLY=y -CONFIG_SABRESD_MAX8903=y CONFIG_POWER_RESET=y CONFIG_POWER_RESET_SYSCON_POWEROFF=y -CONFIG_SENSORS_MAX17135=y -CONFIG_SENSORS_MAG3110=y +# CONFIG_MXC_MMA8451 is not set CONFIG_THERMAL=y CONFIG_CPU_THERMAL=y CONFIG_IMX_THERMAL=y CONFIG_DEVICE_THERMAL=y CONFIG_WATCHDOG=y +CONFIG_MCA_CC6UL_WATCHDOG=y CONFIG_IMX2_WDT=y CONFIG_MFD_DA9052_I2C=y CONFIG_MFD_MC13XXX_SPI=y @@ -222,50 +199,30 @@ CONFIG_MFD_STMPE=y CONFIG_REGULATOR=y CONFIG_REGULATOR_FIXED_VOLTAGE=y CONFIG_REGULATOR_ANATOP=y -CONFIG_REGULATOR_DA9052=y CONFIG_REGULATOR_GPIO=y -CONFIG_REGULATOR_MAX17135=y -CONFIG_REGULATOR_MC13783=y -CONFIG_REGULATOR_MC13892=y CONFIG_REGULATOR_PFUZE100=y CONFIG_MEDIA_SUPPORT=y CONFIG_MEDIA_CAMERA_SUPPORT=y -CONFIG_MEDIA_RADIO_SUPPORT=y -CONFIG_MEDIA_RC_SUPPORT=y -CONFIG_RC_DEVICES=y -CONFIG_IR_GPIO_CIR=y -CONFIG_MEDIA_USB_SUPPORT=y -CONFIG_USB_VIDEO_CLASS=m CONFIG_V4L_PLATFORM_DRIVERS=y CONFIG_VIDEO_MXC_OUTPUT=y -CONFIG_VIDEO_MXC_CAPTURE=m -CONFIG_MXC_CAMERA_OV5640=m -CONFIG_MXC_CAMERA_OV5642=m -CONFIG_MXC_CAMERA_OV5640_MIPI=m -CONFIG_MXC_TVIN_ADV7180=m -CONFIG_MXC_IPU_DEVICE_QUEUE_SDC=m -CONFIG_VIDEO_MXC_IPU_OUTPUT=y +CONFIG_VIDEO_MXC_CAPTURE=y +CONFIG_MXC_CAMERA_OV5640=y +CONFIG_MXC_CAMERA_OV5642=y +CONFIG_MXC_IPU_DEVICE_QUEUE_SDC=y CONFIG_VIDEO_MXC_PXP_V4L2=y -CONFIG_VIDEO_MXC_CSI_CAMERA=m -CONFIG_MXC_VADC=m -CONFIG_MXC_MIPI_CSI=m -CONFIG_MXC_CAMERA_OV5647_MIPI=m +CONFIG_VIDEO_MXC_CSI_CAMERA=y CONFIG_SOC_CAMERA=y -CONFIG_VIDEO_MX3=y CONFIG_V4L_MEM2MEM_DRIVERS=y CONFIG_VIDEO_CODA=y -CONFIG_RADIO_SI476X=y CONFIG_SOC_CAMERA_OV2640=y CONFIG_DRM=y CONFIG_DRM_VIVANTE=y CONFIG_FB=y CONFIG_FB_MXS=y CONFIG_FB_MXC_SYNC_PANEL=y -CONFIG_FB_MXC_MIPI_DSI=y CONFIG_FB_MXC_MIPI_DSI_SAMSUNG=y CONFIG_FB_MXC_TRULY_WVGA_SYNC_PANEL=y CONFIG_FB_MXC_LDB=y -CONFIG_FB_MXC_HDMI=y CONFIG_FB_MXS_SII902X=y CONFIG_FB_MXC_DCIC=m CONFIG_HANNSTAR_CABC=y @@ -282,19 +239,13 @@ CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_USB_AUDIO=m CONFIG_SND_SOC=y +CONFIG_SND_SOC_FSL_ASRC=y +CONFIG_SND_SOC_FSL_SAI=y +CONFIG_SND_SOC_FSL_SSI=y +CONFIG_SND_SOC_FSL_ESAI=y +CONFIG_SND_SOC_IMX_AUDMUX=y CONFIG_SND_IMX_SOC=y -CONFIG_SND_SOC_EUKREA_TLV320=y -CONFIG_SND_SOC_IMX_WM8960=y -CONFIG_SND_SOC_IMX_SII902X=y -CONFIG_SND_SOC_IMX_WM8958=y -CONFIG_SND_SOC_IMX_CS42888=y -CONFIG_SND_SOC_IMX_WM8962=y -CONFIG_SND_SOC_IMX_SGTL5000=y -CONFIG_SND_SOC_IMX_MQS=y CONFIG_SND_SOC_IMX_SPDIF=y -CONFIG_SND_SOC_IMX_MC13783=y -CONFIG_SND_SOC_IMX_SI476X=y -CONFIG_SND_SOC_IMX_HDMI=y CONFIG_USB=y CONFIG_USB_OTG_WHITELIST=y CONFIG_USB_OTG_FSM=y @@ -337,11 +288,7 @@ CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_ESDHC_IMX=y CONFIG_MXC_IPU=y -CONFIG_MXC_IPU_V3_PRE=y -CONFIG_MXC_GPU_VIV=y CONFIG_MXC_SIM=y -CONFIG_MXC_MIPI_CSI2=y -CONFIG_MXC_HDMI_CEC=y CONFIG_NEW_LEDS=y CONFIG_LEDS_CLASS=y CONFIG_LEDS_GPIO=y @@ -353,7 +300,7 @@ CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_GPIO=y CONFIG_RTC_CLASS=y CONFIG_RTC_INTF_DEV_UIE_EMUL=y -CONFIG_RTC_DRV_MC13XXX=y +CONFIG_RTC_DRV_MCA_CC6UL=y CONFIG_RTC_DRV_MXC=y CONFIG_RTC_DRV_SNVS=y CONFIG_DMADEVICES=y @@ -366,10 +313,9 @@ CONFIG_STAGING=y CONFIG_STAGING_MEDIA=y # CONFIG_IOMMU_SUPPORT is not set CONFIG_IIO=y -CONFIG_IMX7D_ADC=y -CONFIG_VF610_ADC=y CONFIG_PWM=y CONFIG_PWM_IMX=y +# CONFIG_RESET_GPIO is not set CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y @@ -444,3 +390,4 @@ CONFIG_LIBCRC32C=m CONFIG_FONTS=y CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y +CONFIG_VIRTUALIZATION=y From b4c0c0af9a82ee687c5f8b3939462edcac11126c Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 26 May 2016 12:10:36 +0200 Subject: [PATCH 018/117] ccimx6ul: Add recipe support for firmware-qualcomm https://jira.digi.com/browse/DEL-2581 Signed-off-by: Isaac Hermida --- .../conf/machine/include/ccimx6ul.inc | 3 + .../firmware-qualcomm/firmware-qualcomm.bb | 66 ++++ .../LICENCE.atheros_firmware | 38 ++ .../firmware-qualcomm/bdwlan30.bin | Bin 0 -> 8124 bytes .../firmware-qualcomm/otp30.bin | Bin 0 -> 23773 bytes .../firmware-qualcomm/qca/nvm_tlv_3.0.bin | Bin 0 -> 1937 bytes .../firmware-qualcomm/qca/nvm_tlv_3.2.bin | Bin 0 -> 1968 bytes .../qca/rampatch_tlv_3.0.tlv | Bin 0 -> 54000 bytes .../qca/rampatch_tlv_3.2.tlv | Bin 0 -> 48664 bytes .../firmware-qualcomm/qwlan30.bin | Bin 0 -> 503752 bytes .../firmware-qualcomm/utf30.bin | Bin 0 -> 265293 bytes .../firmware-qualcomm/utfbd30.bin | Bin 0 -> 8124 bytes .../firmware-qualcomm/wlan/cfg.dat | Bin 0 -> 10298 bytes .../firmware-qualcomm/wlan/qcom_cfg.ini | 357 ++++++++++++++++++ 14 files changed, 464 insertions(+) create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/LICENCE.atheros_firmware create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/bdwlan30.bin create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/otp30.bin create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qca/nvm_tlv_3.0.bin create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qca/nvm_tlv_3.2.bin create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qca/rampatch_tlv_3.0.tlv create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qca/rampatch_tlv_3.2.tlv create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qwlan30.bin create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/utf30.bin create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/utfbd30.bin create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/wlan/cfg.dat create mode 100644 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/wlan/qcom_cfg.ini diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index 75e81e4ba..6a34347ce 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -26,6 +26,9 @@ MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins" MACHINE_FEATURES += "wifi bluetooth" +MACHINE_FIRMWARE_append = " ${@base_contains('MACHINE_FEATURES', 'bluetooth', 'firmware-qualcomm-qca6564-bt', '', d)}" +MACHINE_FIRMWARE_append = " ${@base_contains('MACHINE_FEATURES', 'wifi', 'firmware-qualcomm-qca6564-wifi', '', d)}" + KERNEL_IMAGETYPE = "zImage" # FLASH parameters MKUBIFS_ARGS ?= "-m 2048 -e 126976 -c 2047" diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb new file mode 100644 index 000000000..a85fa9930 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb @@ -0,0 +1,66 @@ +# Copyright (C) 2016 Digi International. + +SUMMARY = "Qualcomm firmware files for Digi's platforms." +SECTION = "base" +LICENSE = "Proprietary" +LIC_FILES_CHKSUM = "file://${DIGI_EULA_FILE};md5=4c0991cfde5c8a92338cbfe0f4f9a5c6" + +FW_QCA6564-BT = " \ + file://qca/nvm_tlv_3.0.bin \ + file://qca/nvm_tlv_3.2.bin \ + file://qca/rampatch_tlv_3.0.tlv \ + file://qca/rampatch_tlv_3.2.tlv \ +" + +FW_QCA6564-WIFI = " \ + file://bdwlan30.bin \ + file://LICENCE.atheros_firmware \ + file://otp30.bin \ + file://qwlan30.bin \ + file://utf30.bin \ + file://utfbd30.bin \ + file://wlan/cfg.dat \ + file://wlan/qcom_cfg.ini \ +" + +SRC_URI = " \ + ${FW_QCA6564-BT} \ + ${FW_QCA6564-WIFI} \ +" + +S = "${WORKDIR}" + +do_install() { + # BT firmware + install -d ${D}${base_libdir}/firmware/qca + install -m 0644 \ + qca/nvm_tlv_3.0.bin \ + qca/nvm_tlv_3.2.bin \ + qca/rampatch_tlv_3.0.tlv \ + qca/rampatch_tlv_3.2.tlv \ + ${D}${base_libdir}/firmware/qca + + # Wifi firmware + install -d ${D}${base_libdir}/firmware/wlan + install -m 0644 \ + bdwlan30.bin \ + LICENCE.atheros_firmware \ + otp30.bin \ + qwlan30.bin \ + utf30.bin \ + utfbd30.bin \ + ${D}${base_libdir}/firmware + install -m 0644 \ + wlan/cfg.dat \ + wlan/qcom_cfg.ini \ + ${D}${base_libdir}/firmware/wlan +} + +# Do not create empty debug and development packages (PN-dbg PN-dev PN-staticdev) +PACKAGES = "${PN}-qca6564-bt ${PN}-qca6564-wifi" + +FILES_${PN}-qca6564-bt = "/lib/firmware/qca" +FILES_${PN}-qca6564-wifi = "/lib/firmware" + +PACKAGE_ARCH = "${MACHINE_ARCH}" +COMPATIBLE_MACHINE = "(ccimx6ul)" diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/LICENCE.atheros_firmware b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/LICENCE.atheros_firmware new file mode 100644 index 000000000..e0ebdacdd --- /dev/null +++ b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/LICENCE.atheros_firmware @@ -0,0 +1,38 @@ +Copyright (c) 2008-2010, Atheros Communications, Inc. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without +modification, are permitted provided that the following conditions are +met: + +* Redistributions must reproduce the above copyright notice and the + following disclaimer in the documentation and/or other materials + provided with the distribution. + +* Neither the name of Atheros Communications, Inc. nor the names of + its suppliers may be used to endorse or promote products derived + from this software without specific prior written permission. + +* No reverse engineering, decompilation, or disassembly of this + software is permitted. + +Limited patent license. Atheros Communications, Inc. grants a +world-wide, royalty-free, non-exclusive license under patents it +now or hereafter owns or controls to make, have made, use, import, +offer to sell and sell ("Utilize") this software, but solely to +the extent that any such patent is necessary to Utilize the software +in conjunction with an Atheros Chipset. The patent license shall not +apply to any other combinations which include this software. No +hardware per se is licensed hereunder. + +DISCLAIMER. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/bdwlan30.bin b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/bdwlan30.bin new file mode 100644 index 0000000000000000000000000000000000000000..dfd6a46343a97329173ab2ffc1f204268a9e938a GIT binary patch literal 8124 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 Rq*3qh^K=`#{8PN}{sWeoYKZ^< literal 0 HcmV?d00001 diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qca/rampatch_tlv_3.0.tlv b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qca/rampatch_tlv_3.0.tlv new file mode 100644 index 0000000000000000000000000000000000000000..25d79c24b506a5f3a32d40fbfbd2cc79a1f069e8 GIT binary patch literal 54000 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 z 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 Uoqqd`4|ik)PlczS`sauL2YR3wssI20 literal 0 HcmV?d00001 diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qca/rampatch_tlv_3.2.tlv b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qca/rampatch_tlv_3.2.tlv new file mode 100644 index 0000000000000000000000000000000000000000..37e22432ba33b4be25464702da5032fadaef9d55 GIT binary patch literal 48664 zcmbrn3wRXO-9LV2_PzPf5V0M$hZb)Fm&441CU6{;lZrqBfs2eVJ0w|jhV3Tm! z4X7KiH3YN)Z5t@I!K#g^@wKhgVD&B0US<>0g4kaNwFY~6yOq8*5MY0wGrJ)A>-+rQ z=lO@{?Dx!>Irs1R-p=uJSFzK5fU3g2*jD#e~&P+`pZnrJIcfcuCuYNh<}8zGtS25 zjj*v7E^A`5u4-aGK+s=fW1nBw#2&k%i8bSU9`9a?Yhu^q+Su=|Xk&jG)yDpLT^nnT z>tb84=wiC7`WU&aj~%(Lk1fOd(rfxy-l#727sT`8`q+|Dee6dF7Z6TfGsK=AF~sr^ zCS5kf-nnj!{TISu+!R}U)f8KG#TQLrMS>+y>#u)}#5Rr)2OBLA4{*k? z(^nua+3^d5Np_a+G3bY;mTUByp(*9>?L4oyp4pRY^)6{Ry_55v-pX(!wgNfFM7ava zo-a)*KVa)BW9-{)dD6sk!gZFBm~SLN$JoMBGSSwARKAo%I{K!Mw*4J;T z-TbJ-70h?d4mu0DHCt;pt@~=SnGlkH4@;Emh%lrt^dV8su4G8Cogu3bMh-Bf6|j3e zLpB3yUS$NPjXC+ic9Z2s{NM_5Grl#>+>Aesc%ZkXJEg+#9sRdEJ#6$<8?ozhjTJQR zP~*%q})3?{C_&Eg_2?xZv1LgA z5ZcQ0{6B=0*wm4?dg7cb5Y4Fz5Ux9*<6?oCb$<~96H{W7NB-<{@fi|xxUH;2B94{v zDTz3j%Y?hAC_%>Ij($|>2olF#QLb@?W1jpq#~t!Y#~k?{$1M4NN3p!xF++a9Q6xX; z*d^yWcF4s%$D3nU;>6|*=(=MkLuF^G2(nZ@E0xMp-)l6p zS>Be=kIQQsvn8&v18rfV8ZJ=h;*H8!sF~qW&sD zhr=MxcHExq`OY|f*D2g*JLP{K;TeQlghRf#t+e{@ZR)MMU)a(Vlaqpn54wDwaXnlOmPT>jv<09cqQl#wL!=D6gjS|n))ijpY9c>KP zU1&U2M@OWlsWgybKib4hpMI9<&^o3KHkEgH9A_n76VXn~8)Q26cx-1i&dF!DRx@15 zN?~fy+fYsH3#GnHx2rGcHZVh}c8d}a_&Vl0bJ@9RjQnU7QJC-WAx(&>yU-M_+bA*} zM!$vM=&Kd!Os*WRp=}8qZ7ju%Fla|-z?@+&#*7l?N0fXn@uP8nlZcAw3~}&;~8i zDBVg0+yOF?wvi$<``Upq*IzuQ6#Ln#|eS1MW z1w0eP&w|#uJ?Z2;U<1mH$KxboKwSubbr3wG2$bi)M#z(QGGrsl6r6;t#Pb`d?`k~G zFm3+kK0{x+zU>Fi?2P>b*TuNt3%=k?ONvY~xQjw^y>*`re=2waI)xNz zqJ$e3DK2X|_&QAoU7H_^nhu&`z}gG+eo&#~J28VA*@1aKdo6I%435TfodNnRUjsh@ zCiEfQ(rb?W=GqYG<e*9%{z=UE;Ov?6wQRQUo?%-(_&t4Wy9fMcIw#t>0awxvl)Z^^Y`= z^!!lH1EM+hA6KoXW+ug?a$Mf2D4#%RO?1_bDYl4X~Du8hti4Yw{!8b}O?)P*AKMnifhnD&Y4DrhSc6-pca1-e0L&_6*>C{3dDgwhd8FYW>jSqR$k zD!w^`uo__p0;M-42p>#kh+{KkGteVS+bGSWvR()@?4M(aN)IXh3xOuiMpZtw2=fqfks^X(j zF5vYi{1eTw_R&w0D=)31Tg9h0N7JzeEx?jKP?vPf%^3NQ`{T35gWkE*rmVI-+SeA0h3;xl^X4G@+C!Jn!w2^mdn(Or%__aum}hUss3|G;Zoq z@h)ETEy${lbzk|G!MAtd+uP(#$|0e`MjE>Ug7+D9q`LgXQ6ZlQR@j$%`*T{2t;8J5 z9wk#!lrG7I7XQSvEP5)a=?HtOqEq;I;aqt(Utz28o{)?kHP%SrvFa02iBw~CH=Yi3 zN%JHQZEM90>PAZ>wz&(>>=yb<3bgV(Da|#e*c|)bmBg29^O)kLt54Nqv~0}s2DFEO z>Y1B4s|R@k<(!pKo>8VNG;gL>#gMl>`SpVF-O1qP+1 z$X(K%sNI8a6JN42Yb#wzl#q?KDqL^6+0Xlu{ai`=IsHC)xk@RQP|V~>p(s;YxDs^G z*r5ar9b8>}dNnAXzpitl8RPqnE2a)^OMH5nT*1*PW$wxY2Ji@V8IG!})5f^VL>=4{Pk@;S|vCPloNH4LVP*U=zcByLbwL zsmT@XNXw(YHF;t#;`zznJjADniQjz017&p02a@s!r7sg8lTi8ROddoU(2(VLN9j*w zCFB;+3JLK|2v#TPL6W9W+A{Ck(Dy)Fc6TylFT|m512!LH$PW-+N4{RbLcAY$95jqR z18VVn{`(C1E1t*v0Jb5O~~+mpO?_ zSD{Om2q(FX7(%Sow+Btoh!|*5!M`YBc=ATJM*!gV3B5kmT4~h^xT8xj4fNb*Qdb>SSC!cg}*kE ztnafgIl0SJo^uN=-61JtV22h$F3>6FSk~nQq7m|5&gHwr1-{ncf{IqMbXA_j{BQ%` zStjxGp+^}*5TMnWbe$v)>&1E9@45-n@$Z%Hz#N!9p*U zOfDiVH?bPNz<;a)ivNK!vI#f~ynP+0wMbmpq}bzH4R>@#i4>lh{J< z>-a7NNdB?V>qh892ocg(q642qpuCg3WU_oPjv?05JU}hI9Z1ASFLNqU9OK*l0?n1AIjnHH&fRlclamnZs}NE!oqyhvDPJ za!YCP*gYH{IH?o0YF~2DKDrhQXA<&jl;?Iagy8~ZtjMVEC%(*(bqv;1?|ku2K{qu$ z|J_Y-wxr^3ETp=EiP5)qkb*3^on&Ml-0(y1!8LE~NW||{FlY;u#onL;JD63_I+1s*aPtUW58T4TYQ@2p_KH99N5D@Y+N=LmgE_-++xwCB3@Z>2vc z%$1m+j_WStg3neP9lF7Fw)qmZrI=!q;`%9J^5`-#^J$+iRZVIT_M1>p0#uYln4h=u(d+Fn$*)6y%k)Wcp&+ zI88VB>znx=z5X5Yt_mgRY-hOA*Tg&E3+1BHkuGy5gtPaf!(E0h`=C|{&KS|i-v#Q9ExsW#6Gd-B6 zd4Vj^7^L%k;pTT!u21lh+`VMn@?+NJm~SKI(jiU(&N{@Y_;n_K9f%i*iC-t;(?t3U zs-@B_GL@)u|LOt|8qg)Hg(YUtnjFabjxmHBqWl;M)OOK`G!F3~=oE+a=RlVzEeqZT zI|l-#X;gopI>SK&%AJzX7ykTnljS(RpYtPz{4<3iWq=<8ZUtP8@>&7U;CU4AS6E-w z-GF#r3wRpP(tAZHm0ArcL$H|{j60iEUwxxd77WSKBrPt|tx&$sRth*$B zCYYoUG^Ec&GSTS%hbpyx3cWhw|GOyo|E{hJ{K9sjiT;-mww+qrxAAXkDqVqO>R-e@ zPVj#qE<}zGDlS&}gBL4_!w3yxrabI>J88c(#nxSOf!=&nU4ma4`%tw+QLR?m$~Cg8 zK4_3x=aVD$ygFjft0VTD@R)zA|F~Mm_teo!mD81%#TS7;$Amsx zssE6$5Tj4O8aeq~avYykzaN2h<{K5ym)kb%>CTpR6mQ^@JDi9rtte^W6?1IfCRT5_YS)qLM?*sMaDZj*q0D7{oFN9jYumfl){)KdK_w3+IC z4~xEFYjB@uOf=*wZPYk*a%tmUCyU?5oSG=p`jBs|n+cm@gI6h@->2rCtme&;??K*W zIfFfS`pN?t8<*+F4ei78K+nFw!T+(m@??3hsO8zki1e1eOt75sN$rL)L;LV+9$Mr( zxZzm?d!~KE0PIz4(2|?wWdp5Jzuqv!iKdMrQbFk`Hv`>oS4&D4!gy~zL)YtVLsYWM z7@8@BH?$f|XNnkd)=4jdRLD@KFBqz0C!9RzrVE5TXH+fL|zAI*LCbcQ5o-s>}KiR zBZMSVEca>)=9oD2a#&saY&4|KIi00lYQLE?j4iyz6dSLO&sI7?nCQ-gH}vaS{I=?uA;{0j6^A{7N)^o2N1&ZPBCrStU=d)0q(C3t=*y4}z-~(^ znL(DYXK^jLXJLxnuI9Yg*9J}5ZCF!|HlA;j-ZtDP=w+>xr`Mdx#H^jiSF0=Xf=r=C zUa7*{qx9{#A+7YW&T^&_-2b>f^~@pZW5cI%PLLD=8@V>W71B;-fbm;SwnKs*m08T} zzs}IME=bnM->h-Lmul=njqYTP^Z!ka#mO3(yhDCk_OP6VzB19A|Dnd|Dy^QZQX-7B zf0|H=U{hCUL2`vUg@36lG*I@x;f>S80#LZZDc&9e z&iw&_0B>&K3FVb;;3&|NECQtXN%0Bjr{XQe=L&p(1E0SQJf(P-@?+p2;PO`)G8^z( zFGI!ymc0gk2v~>bE|m8Y;90=p|G*jn{5s%8z;6RC0sK9n2*u*XUm%E<$%H{pn$7Ym6is8UGS>?cElw zR^ixam1y9Eno4yg>g5XG!JC}=smnfrG_wxMn=L1W3fATi8omAi7c3L0tZb4Nfi5o= zG&c9MZ z{uUL6{S0jC#cDj>4!T0b# zLoDqyG`LHe$aG=NYk{)qLR#P7FKNPTA6F7XSj1QIEBS|b8ehl%{gUyqzh5#vz8%lw zOY%gvFHgu5OQDyWgIbRDnghAO7zBT=Xe_(Y5}UxD&cyTocN?ri=+gMeo0m2}WkHEX zwZt@(I1VL_6UK|I1kQ&TZ7BzKqeZxD1I8AAn*cA-0ma`(fJGQfI?g44BA!c<-yxOU zg*5JOm;(|gG>7ZeX~MMfK5&)A?=R99_}tp1!F6ei(~Pi^m^jNyM$zC`#FN>!6i+(* zLRgon?UKuSw8YaR;WypZ?{)X=^Q69S=Eo?R>RQeo$}1;W%dR(WKgMv@vh)J-hje?y z!@O_gStZ?pCoZb*)3>I%$1q;2B36}3W0mNWRgDMA#)}!iEQ(XFjsqS6 zf2cnOUFX$nwydw;wtgK~`{*_-_H|tKiX|LkTi0*l9^PEf1siHMaa-0mG}J!&b#zy? zjTHYJ`=G!lvr4fIvWc!?$O=YvEz?ySD5HGv$0HWiRw2{`%HBg>8R7Q`t;kRDQDbBL zBjQd7Gy|m78V=E1|6P$6`Blgidlq>wL3d!C4E8A#<$a5$VfXpJ1X#?2d%E*^Di!~= znoKv#Gh2h1b&@f*KJIFrD^Xh-nf}k{$ATtErWxgrsjtbjRGFQ&R6eR`zx$`*LY^t| zotu}*&FkNPD)cP{`{G3l&b|H+Y5Tp<5-E-B^Nc$yYmBj)_@Ga3TlyelAJCL~GqOmB z#~ZOmMdpm#N)&fi-#FkxhxV{>dB1QxCmeA{j`xJIORL5Hv~fApaXg2#9`B))`CXMV z|3anAKNra1Q=xF=wHz_$Up?W_%brt%KM}$aPvn57d|-*%8qc{`kwTnPWWBxRLAL#; z4|NNq-5m*gOi}E9s?@$$E%Q~i%oE9WXR7Vi#mV6tZD!Rr9~bp#vrhTxL$9Guw*7a* z?yTp0hq2yB2uJYm|u zrn%MnVbfDR`>oIRkb}9+zsef0wpx$(*!jmRT6@|&lLuPF(~;I%5qpTFgRz%bOO3mQ z3{B{%w5-l%$Vxe#TQ&+zAW^piW3pl>ppMCQbxbOi*FEV2YoOy3XIYeTO8Sjw=sHIvIaya4{Gw4<8HbvQF-P$3c{DEWH66MboKFj`a_MN~{W*YV_rkSxD zxd#|@zjco%Wl(7rC%JQ!EqWysp?V4wn;dYzh82~>IZ1AND&ol=yt6ve^AojoB{kL6 z^Q8Fao39gFUk_tv50G{Zc6m!AUv;>L&0Q$H&_lS_%gVsRLSh@++AF_ z=fm9&-Wa=doz7{jx3wGg^)^Tp!BTbZ{&wAj^!XL@eMff~+L;6MeERlzJ}rW-J=>R4 znX#X79^xN~I(K4U8F~=wtd$>E+=g{S8qTqGuac8b$Pv)Z)sU}N0Iqw4RcQ}#6Czfv zSTdih6upI|>(+6LA6*CfK<%$zq%W%997w$Aco4kKMMwq07w?xhY<>9QTb^k-s`PS8 z8oz1l7U`B}wammvs4qy%M7w?knj|Bn-hq1NU|)1LA=3df@H|h65BvGPoX_Ev6VmC^ zie*EGCc^xdN*l{^N+-4V7~NN*2R-_Mn7}+K<}iC{-}TD2Nptmc)BYSK9U6E*!CL@6 zDU2f{YQ&CDIw&R6_ObAB)v5h!c`@hI9)^QLBO*%f^D!*YN#4tetIR4rto+ z9i+Xb=Y8S*s&EgJJ6E#u-DON$=MDz82wGk?r3;QUc@UV8z*i&cXQDbqu9_z?9W?D< zsFSq)Qut++X8#v8(X`V7R%UIetWW%9weZ9{V%m;<%{^A8{k`UYWVQATSRE zHPaeD9Xh7gcucMF!{Ij1#KEUks$s%feo|oUrB5*(85)}t5NN-yr%hE;p9 zflTM*EtOrhA&h9ZC+pma+U_1Y1{eLLWB&eASc`1i0M;eEGY&FXscva~WlN8~qeu$( zSoyB9gl4*~$_3v9a^~(&sI6i&x?sO+*E*Zz?IT9$sD{JF&?K(2F0ezX>)yfDckk@1 zkL~CTyLKw!z)r3uw$ofRLH5^MipV)j{-5eM`Lyuy({;1~55~)`;5D1kEx}*#XSP<7 z@SZcqqNA{c4X~WQo+$o$GpE#lG|X_F4U__0>h)Ad-WGZrtkJaEkWX2OoMV=Osu=83U9%w~tOta_3U-fX0#) z@EWc2zr>qee2sK^`FPdPHf_)ujnN^p?C|5K1@NAyDq1jcPk|k$Z)ALTo-MT$CK!1?Rpd=xwDB zG6%GWs~!qRUdnMtUV?Oz0%}C%2g49+tHj7IEhowhC0pt!6Tc+;d~~Il$Ldi>mN~Kn zV=LSo+q=cSale7w;NrtQe(BWm`NEr!e&UcD!Xd8pblu^ zzJm2{mS>3~xYuv4AFWj+^9EvTEBh1nWI0&fM&+X_&&{t1K!-ENUL18mt|v|=I#p!+ zrD|-7Sc?5@P*b}Rl87%937rlZi;aOqj7#dq6I5K9q~a3Q2jic&s&=0E=g-5=kt1fo zcRWYThNL_ZzY+gLAqP9@6S0#%Nz6g&ByplDMSo@PZ!#!#-w<;`@r2G_0DNQif&|Z_ zIFpz|@zL4_Li!;CZ}MT^8}Ogd#Xbe>zw;pszF)cg#rpm%N@nQf-+`|7NeLQGt*9p3&nhj#>d2-8BnB)QkO(^^c5MJZQ0;RDHn6Ltn(9;TSY za9rK%yWKeS#Rv*YD2c8RNWFE?74xJCqt?18s zHgnKg;cM+VX60sU+9RHVff;C3=|%#pKJ^=RLyIUBLQjo>4nZ}D`Dojb%L(aaj@q)j z)s~SWoy>Mf-f)km!x;PKWtSMpHV2u4Iq){!A^$)jN7^8dOj9L=*iCulFVNem4X#)% z5~HFRMu>H72$2rh+iR`Mp(Cg?dEmsx%Kt+o9oTsGn6(_ zxtYq}lzx4c9^Hj<_rfTWpixvF|DWaRTt%-uq4u#w?PI+vGqn!xQAgsjn=;d9L%Yg% zCuJu8@ViJ4BWu*5}Xew^l;*GJlMn+CB!Mg$YQr7e^ z#-7TxYsIgZ3s0PDysz=O#(mb5?D3h$`Dc69R<5h)@XQ@(g;WdQ@isr&;&1R{1`do+ ztxh*osrGbr0wW+_Pmq^FC&WyFF6szr)633QNitwBy+|TOBb2wouT)4uiA;0>+mFGDlcn#z)R<6oRHcn8|fsCaufe<#{hrnc#KLk{&z zkNV|rA@TltaF$wH|4lvf?V-u#3zK92b9L-9taR*;s$+c=@@iu2FYHj~q9I2e?L?n` zAm1T6;QwP7#TtZE?!d|)IXPRH32rzG+z`P(Tbu=6I7j`ZcBL=yCL!8Te51JbMf#U@ zE{e+(uPHuL9H#h7aggFA#nZ3w*qicIqP+iqvK3uFm%(4pV4W=f6+=!SL=oP=bNX)+ z>t~TT3hVSDU>1w>Ij&w$h1bX7+>pCAL+Vp~olDEv7qSt%8+)Z}$K92oNvuOZ(77KJ zWsd_oHuaC5uTpLLR3f-{unt4izW)yK4#5!H62F7$AzSAP*j>W=IYM6(PIt+()f|aZ zXbIFGE4S({SMjE>rzkpIAo+c}9Tj~BierD;`ux`QTc6+V6tWbjm@6FHO?IWgvxj;% zo3S@Qcg%?`&qw(SWcclNL9Y-Sr#^!hZl5f0;>`W#kP!Mt=+~jZNk}@JDJbg68EV1H z5wgT^O*ZB`AroPi-7YWH;pyBh!9L$?z|$s%^s!LP3na<&>nAc5!ZoHGQ zH}@*y6ffG~Ll{H65Z?*#Tc9}b_h>@?Sr2&c07DKz77Fyv^AX3`V2UijfA5ZRCU2rt znfXZVivgS|%Imj2xp!8@*kDayrn&=8;KWBgSKtdAm?8EI<<()wdFK{+rsn;SIt?t@AI5)*{t=7n1N6;UbC;35NCYL`Ppr@S1@(gl~ zoOGhLc@pI#4+k;@$deK3qi5vlyOCZUN#iH*=4gsArUDjGn?GRWQ*O3xK3~i`ctdQ* z^^udQq8Y2lAg16qP)7YKsjoKm={AdIuM*LfVkXr2_n+q6} z122kL?{oZ~ZY^I}Ze*U}-?2^;Oy4zr$9zOv$jUkdjl$**L|mLUleC-?}Fm z17m?JrvoK7zsS9w`jszC$uCTz0lhSdM*N!9UrH}Rs|Z<#zR~^Tjc2gObqDq-04o4f z0G9w-dKuV%wXzO2B|~iFn&qTjT^+UxYIUI=;;bVjs#Q2iYm0a}zfQ?1C-y6tkvW(x zP6``Z(;4SS(U36&X4CW*jrfXe>2RZy=pyCiB!u&oTc1c>+RX`H?_#C~}#U7Vwy z>av_nOYV~0*ei>`o^4qMe^xM7M><1Z1uVpK2y5dE<}FOu2+}{L{U~Qh%@Fzp=miwA zXul4*a1zmOwi#mct`VCpP=kG=a5o#Ir=2`OU%(V$LQFTt3DP`+(;_(C2Wd4>MlIo= z_kI&Ip2oKZ>FKV21WN;fU`QWIXB@L-oRW!X+irKvIGfLh=3JEeGzCKzd+|hLmmzj` z)Of;(8jJzs2?3CvVleJCp4g|>YCQ2Spf8Xfsos0NJnqYG)gFG1A19e6e}|8FOtPQH z8HpjrcKMi*+X8$a3+!O*pGpI4Ec{9E2n-GX*+%tXCs{y8kJUMxL!?MxOE% zM~yEmZEVF(#nQTr#&L#r!?Wq_>10}dbSi)74#ugMjm{~u$yq3yo!L>F!WLMg;YshN zFSUvmv8T@f`P^xGpSIu^XuPVCLshdOFf_#1M;JrER05TLMgPy-K)} zKrn!FNF5oHyP1V%c@ZakBHjVS%XI~3yGg#zS zO@I0;o>ck5{sY*xpmRdn46!#yAtS*aPC9ThQ4(0|P=x7A@AizBrRIRoO9t-4v0VkH zFZR)MZrH`pjrA_G9Pn=N(YCVk0i1OmQpTdC`{41yVc++H-=x)?S*z}Bx0OBMTm6-} zG&)Byj+dikx()jkDF<+}@s_q4+Rb?KsVz67<%jrpv2K{$^Q@WAa;H2Cte$3&v%EU_ z!~JU(>*XAUv3)T7(S8HY-Q6D5C0Fu_QF<=7HsBQ%DdL?kDmSr9!TxeT8}TasSB8yR z#}KR(d^>A#ryNPF7Yo+Q3z0R8wQ`p7Ld4L~f>MpF@r=VKHD^c+F!lmCQy9H8@-|zm zT2h`5d!;w=^@3z%D~3`ac}mUIvWH+l`o0Z(#=bUBY1F7Sp1J+sl%%os>u8(C3S%*D zln!P{PKEMtRacnlEnUJbDPO@=EUw}fFI!fejcCJVTd_K>B{mDgWA4jXy1?I*l?gsC(;w!H~gAu{y1nQXao8B z?~$MKf>-l=2Ws;w^2+I%Z;^;bt-|DeY_NGdJfF)4YN+RWNiV?}Hgkv#CaCCya&zQx z?S#q+6)${|C;x8-r}r509Ii3MKDkl?YOm$>_H@xA7-EMmQyDA`u|Hl(Q+W;LmVdl* z{qvN|mXj$e*G}+mm4^+neVSB4?!j3Jsn=u~p9k0uxya0r%=56_U@gB3L!%+iN`PV(0f zN0v+^*p|2r{BO$JLey{20>1Do5%sw{*Is~K&LW$oP?m;yOUO3u@tDpYTU%3OQr6VK zLrAv3BN_IWwSHLm1i4T2tG>ls9 z@b8CjJQEFl{_SvRBa`cPv90%Oj(E*VpG&jfXg}!H?0E}sX!q?t@@wzLwsLgmuyb!xQmmalbD_5{b1*zv2>stGv@ z+FB$!A=#@v!#`G9m4_9N(lr&j4&++umqUGQM&>iBjHoP3_~uYQMk*Upe;(>HN&Opf z-aGv`@?Fe;Pa`0eA1N)R=hdl?&!!5{5|nesK}f0-eqp=ePqqs*g~sts3}uf;+~`K3 z2$I5{0EdlLp{=RWii&x>U9~&B5zq{PlGz#bWq8JAMAwHEDN=OWJN%Ooij+2Z6m$ zdKO0?@Ui*yR+7FP(5}P9pl3z$y<+RmEaybo>dcm>D71WP1xS={kZbwQiTYT|^`*&C z)j)EXBo~8bXUmo9jA_1gyHbvrSR01*+*huFt;1&PfW=EIm#OEYsa1&PW7T{gMep#_ znX#djb#b?_*YkOFq2S(ty482YLoUf|@ddpncW9iGYJBwz)n{!)A} z;(iF$k~j}3L)SZtwO9aK>FRk{vp6?K&r4E#=|bFvxqlna>CoXXP9Z90J zIbGUD(!A5rLmTg&*T0dT!7|R=j}tlH4VoqQT_0~e8muz@1hVt)>6++;;Qzt7WNp;O z`zaOVw91WKpGN;*PN6-pkYlOpUH z&2a3D-m4gCD{YkWqm6sM?wcU(CX>Ar&_+A&okPeYo1u$pl%g4oJYxolhVs|tEDE@!Lhqu0=5UZuzgeTVSc<5( z`~-UUZf?mhdVt>8ar{yD?2mVR3@_f)0ya8!8i}Um>SKRUZ`+uKl*vdLgOvASD@n+y zsj7`>O!7AscpWICIG6)`r8pae?Ty|CQ2R0b9PeVt;XlDQ6!7nWe!$y40bT-L>OIh% z(b3na$1N_4Wnd8`KiIyp{_i;ldr(`(VQq)eda98*z%=O&ls2&kn8O;UI5_q&b0oc) zJxuajt*w*HuIYTr0aII+GPXna?4ryuv$^1!pnKA(p3a;jz=o6~`#i=ESmbeA+b5Y0 z>tpZXT)PqHX&%XOXTH;O(xV+9(-qjYm?uTFF z;FT9@B$Fc^{dv-%KTK0eTf}o>kf?dkBVm6xk`Smr6?b^gE~>)rH`3Li!%#&ZHGRl9ktkhGLfdy z^Z!=apZPZSpRmI*snheP4-)s@yfR4g%!gT=+Gk{a%r?sLV=xNEnHIag>kq?B9(1bS zH2z+(tvgjpI|R8YpK;z1J=N4|Vw|(0Vc3J{{bclZ5O@}~kv3!3DOi(EZ83Jy+gZYZ zrGTYd%F8W~KVO+>?t*VXxmmS$YZ1q{yNz8W81|&%W|lDGZp8J7mm(fQoJ5)Yw2n@- zebFlp-hz9%DD^&gH3Pdmsi5wG-Z4BhuUOkvTO+jr!Jj=^Oes3{jiDEFfs@mdYn*{K z64W2`Xqw6m3#v$)3wx5Vu{sLRIjW1LF5f!bex!g(k*1A$mdb!PDDT z+ZW8V4=_u-rPhQ#l%3Rv2s~WelQKp4b*uMJxui#ONbqkxU7o?SuDhA+&I_!>8Id3kO@aH$2vZ|F|>J7^?2TZ)i8B>hFqXT zA|dV6q0XRw$|-|`?@wPK&Eiw+U1hf=$J51+oIDz&RE8Y506Y2EXp7CXnmEVEX)5oh zD=t6J!7q?<`E)xu+=Y__BPZ>u{aPP;dvxTaK6wI}sI-C7k*nZ|rav>JuZn@)UdIzI z6=%qa(>&Iz(hSy?na3J)YP4sA_uU*a9b>6nle)F~K;t^Tsl zm75{0@^UVVRq$sj+lwYdgSP(rM6KyeDB?Eg&t%sAL)DD}kZJ-ak9_0aZ-i!98?~|5 zuEAa?Q*4>Z+hA|k$LdEZ=21-BGWv-Rp1_clOsduQBXxc`DYUuM|54qE`#?RVPdNSIM~j32 zD{n5+%IOMn!)FwCRWxZFyP~dI&K`F$E>g?6m_~4*y4ARqDOi*(*A;Q{{Y7`k%|#34 zM~l|V5^}JP^-;E?-&YC?&~oViI#ts8&&2$|JIla(m0zg0%js~toPoa!d9;pl`OPGM zqPF^z<;Bp~9K7xbZfH|}R!MS;B*yOIb(m2DpR2ZSru?e<)%_g(>e6uB=BgcAY+7a7 zXaa_em0$Mh)O+Dx^69|UXkJ2Z);A7O3wz4kuym~gytLr-q0ovaX`q*n%=uJ|t+Qe9dAR(s6N7Q~5*AgyX%oLkyBWq|Wmgti=dt;8aQ`&%D zZS`%rWe#EEMQL7OOJB4T8cgN zjstyc+m!&mBh#>}P^-_6&tztfuRXT!W9j(*_1+h(?GrPy2Xfkb^f3wF(OsCaGc#7T zOBoS;Y`t0o#juC3=tydmyU{naS0}IXbzfAc>X-ctO{ ze#_mKx!?Rx&jw}#cXwz*{hH!6-D?aT-7Urr9{2XqGqDT6r|trex>KG6>K{|2CfD|^ zroi@#P2JlZ&9QB@^meZL6OE`+d>(g2MVNzZE8D(6D&}<^UD)yDLQIE0 z)V;qm6xgqXy7&3R;M?Fx>t)w|jZMevV!wzJ?A%>q$8AA+s!4C>Y*yh!yo zj;l|##qEBpKDK$}Ye`D!R|xmnu++!}x*Gj~i;cMDtVsz-O0v`0C*o_AU^zKX91A^qoO+rhai-)8{rcbW##_%g17wq?9J{|xJ0FL_`>>Gfy0O>s459k8i184-Vdm7M<=QjaM0FQ##ybicA zhW&cXucbGYWXjY#Be61Vjoi#-jTwggq1H(j=ePkgX1t3~0nX;4j7`Hds{cHUz7}7yOUfXDAL+9(db7&}OtX z!ENeCxJX~m=;xoQHVQ2dPhafwzhpB#u*cU*mMoz(=V6p(>229S3Jh{a?XGf4buw!2 z4{|dP*6Cvp;B6E9`sfZIm7VU#bD(UbcWV{N-%?@V=LGzqFk_5fYI!74~v4pA|QlQ&~oA;4bV(Y31PSlgUaPz4x zd$%kKYs0hsOOdb7(5K$8&D|J=#f)lNQ{VwZai03tl8!!{jV412 zczQRFuJCt*li-1R!ehi&5PsZ z)TzI^d50gF`dd*Jp7czJ{x&(M@2Kxk`qa6~ugd=%%$A%J`{BhCN9#|C+SsI#KMrS1 z{loBE=t2I?9^m}ETI+4mTicKpeHqe7=}Lhs_2PUMJV_FFK;EvlWE@)Z!YwW7L5VYN zmN+I^qDh{lyeOW4cS58LcRFwyVD(4CU#{iQ&04;7OD()wix;)D-BQaD@!9fc(c@Kg zy@rnnUz}-uTr}5`0f2^9cEtE98@rBnhnhTYd^R{HWW}eTv*{(@nYFGaGJMkPU zyAxx5w-m@pmoG+k+DxqAHQRKtv7-z$v<%#$(VA^yOs0sZ`E0Q|dSm(LF?xCEM?LzH zi+-$99#S?b@EbjVb54+fD9yQ@OV}fE5=^~|mii%4+LM8FYR5bS-l{{~f}r4;-Y0q5 z0eV8;1Ev8MB2Zb5(ke=WK0qFN=VTw=(>vtG15$a9+DWJ4+Z2SqqCPv|bc7r7ANEG3 z{$*)`CU)WbR33H5-n|0)EMEhCaz|2eN3Bu5it(TxK%+NkG&h1(1Mi}wMMM|txI%Bv zv-Ij>=dNn`&)|vlna{W~Lpp_Xrv0!sn4$u3=)ZtNZrshcpxEWo#h$wY{}E^aI{p*f z)uz3N&UN2a=rTCHG6vsQct6CQ7-R1xuvNgbc;-MO15dkgc3(JfGQ&PPOttazqK-E= zY5Di7xj74FlY+@|9Dd%8-62C3ZjEqp0i2<**at;j>>>2Z0xL&JK#%(bW%Q`n%Av-4 zujq5_{I8GV2JF}qS8+?wZpuaRmHZ3v91d;O#meBXeHt=}F6Kcj*87G}fCN+OeaiYX zF`j2?`j5*0Bu{h`=TzB&y9fIkLk9a$3C}@?eZv>tnITPZ(K`?0SRp^6H+rC5ezfal zv}!zBg;TPJ8O~V$Ls1W@&+jd@mhg0ZQmyBMz@Tk1t7%-_^^B z?`B@r@ZW=;`~yK3yMFom0_YdE z*B}4MFx%mjLObiMkva!bJg&8_!~} zgz&->-KqTJ@RC|2Jnoqrt)bfCmu?iVX<{0VHkCHO+P2l!T)MTUnW;b8Tv~sjnb~67 zQM!eRJQg|Ox&3Tt-!I9JJQ;&d;EOKy+6cpAk8htlC+sl}N?td4!lONpvRgx~Vb6+l zgrhUCL`l#IdRI23S5(HPG>hI(Md=i!IfoE`?MEgHr7z3ZH*5`Xo3}rT6H@hr5bBRX zX-^`(blo3HrK4?0i zm4%5?>D7Uq5x z;m5NsezZ@gPZ4st!%6$oeXMYj%(dv@-Jx$5oZKP1`QZ>hA^#Gyu>Bn&?S5bxcG*Lu z@wc0&yL7SpdctilIZT~gzS$MBzdlUo^qYqu4&)`rSLewN5P%hc9fGfdgF{^7hgbEm z6O`p<_?Y#V5#D8Wjs#vW_R?K92aAy$xFVmNI`5v?!N(h|JuuN5;}#*ta)AZ+CgyHCY&{{Y zXV;*wRpECF)(|cB`1*FlE$CB_{~l65(jN3S@ES`-$-t$7b-Pd5Z554-H~aFZEcIFa zxh~WMafz#;Z^K+gG0idIYZ@nW6wM)dVOXH?3$Js#?Il7T`DKuH(dOfo^=CyL?<(<= z=9LvD%lg8h^6Pn7ci%tclBCsF^A)2Ik_3=(KqO zM7?YCcrRpA=&&>`CG&c(nT2c4R3s~R|L$sWr3HFY)DS((hME(`7wwQ>fWJgC=0o0V z?9<$qL33MHN7tC-tSIlj-v5mK^Q-Z?+kpa?93g~D(l(mi!}>{ynwGLA*i7nlhsx>- z{ajt9(9vW`!-a>^h_wTCo@R^ZyzPgxgZQ(Ew%DUZ||vOZ%5xHlwxcSHN8SV?y_(i(R;RcJBAHr%JuoV3YxtQEz4E_56vzglG!x(08@D zH}&1|Gf2mJc&?_xW7P;gMR@w~Q~;-fT~2O@7KS9CmFUmE;NI4E&#{}$ZCYsQfn|{! zXe$hy2{m-lgaKNj7Y&HE|FIhpDV zI}IXjU#5VCl&tXD$;{MMZ3c=jZf z`h#fvSsyCpPLVCJIh%&F!lcV$E)WTw95_2xKzuT=MfAXPPtFk!A}cj?By`ka=o%VIK62E-qI08Mr!$)!4Cfrk zv1hM#Ezf=0buAK~8_iut7p>KS`5S_j5xbIT4~6kQgXn!mKj!4dr^|z*xqW*K=@8F9 z-2HLi_jm+2_3-j_8A}4$y4d1dtYs?R@0240??nqisr<%_rj9JN4b zhs2j2;U=U)Bbp+Uw?!b=>k0)&R(f6hl)d2*(uu|ryf4jB>?!U^$rT9GJg% zjP|x$*Wc=)et!~{jhG?>qL+gYR)=|NOT>rq!7F=O_iR#D&!b)TsekvwkxJRYQcAJ=Eg|gMS!(Bn_u4c385>8a;8FtgnK;1AUv{ zBkjd0rP$k0GJYeE{LSYl$G=-TzKs>%?jwBvf`J-VhGPYOFGD&Tsqge`DG6RQ0eDk( z&(-KME_S=q?RI7iw(GwV;o`a?9Z2$=qC5B@KS^TuaCt2ipDXo?iALYCeGDtM&w#*W zUzce}cdqgV5XWIR8HZP|+Y3!>$dT09I+;TRil-?9Bg=|!{FLHdp^F{*2GUOC3iMPN z3Z|wm_N0>Ydo{;JUOQi3&xc-1hy7X7&;C|4Ve}1?!?pC>cctjWg-r}CpX>@v+y(E# zK#99ii}*x$;~sEr5opb1vyXrO2Hf9$dWdVV%Rc2VeofI3`AzpAX;t{3BVB&Zd*|?J zT*us5rdJ%suI22oIg`sY-8Fm`M>*FoJy)HF8Z77n!PLgwC1T^pzFi4^`NuurTziOjbwd-PV<*uMHBzeF+LQr~ zFvgXPzbWvm82}wjF;-yXvHmQJ_E;vB&^kdI`|{QkVw(4_SJz5Ui{o9bQ+-YC%((P~ zBMCb|IuqA?c*_&k<^^?+3kS4;P&g%!-RulHayzAUt=18pfhpFoE_MU@)*%sJ(>^f( zy-z@BuK_x@t<1)8&>NWA^+AUxZ0cesaw0B27^$qY7nwudj@%TdM&4_mnQA z`*}(rB~w><(WDbE9&5^gSACxAB+_iT(8c!e2QPttZ=qSvhmIl{Jujs&Qyzfmr((?M z<6#M%2)S)ip;4X;3C$WE3me=AR}0ZsqgUCXFzz0NyEAY%dMb2UDL}{>P-w#42Hc&5 zyS2ER!`;b|@nX8dTgHj7-a|@b(cEaL;$cVHC99-4R5m=BgLj+hoF3TZmn;&+eGO9l z9Q9q$3l+b$da_3^ldi4z&38v8dvq(~zwaTk2fGoS8){b9` z6=9Qv)uSA$XpUZYe+6x2ygxtsEo|?W>gq3qW7VAJ3-OD&CP+5Pa$Y0$2`JLZc|g;E zr&bZxig{R);#@8wrAGlL&I%91+Q$L}j%lb7=d(cksa0hg~i30)KH6<$|3OelAnLt-|`5V%qTdZxkX)Bq_zi7Phgin&f!ppAZ- zs{=ZluHbb%*`7tcvladXY2X__6@FSJczAI9vr4Uqir4JNs7*5es_65Xq_NPI^8Qz< zXl)3539Jvbd7NbwT9F-Ttw_QzAV2`2fPTf_HvRNr(e2%Z=!iqo0xZZ0j?gG@(ANc|EW~h9 zD~^Jei9BEO(D(DP*9_Ve92FjNi8e(KO0+5MK0qy}2WAs5ZE>?49yQyDr%~N#rd*kL z@`mb_!W!|vs$ny+@HWI#D`zqPyB<(hJKD$t;yR_)4f z1s|Ss2AjNQ?yyc- z`;#diqAQR8^{VIi$5&e=D(Bc56t{EW_}+DpuasGeUqyb}P2gMtKHHAOdf2e8OH)Hdmzs{kb;ZJX)HLsZsp)eRMf36)akP7k;9mW@XN-IA zYEAVR_vp$+9&6?3sui9wmFGc?aS!(ty2n%=Ty=g`Vbz$*d{1GO6@P~*f320ftK+}1 zFT1C(a?zSX_o6jLl~(1hl)AqyA0f2AU{kJW#*C zlB!|N4vYsJUx0o!Q^R11W3vWhU4?#o2x(H9hJAu-y*Qta>$33Mh%%NTrFGdAqzi^< zSOX4*^VgA17>fH*j&~Sz|G3v+*07gwq@UKta=yJKw1@5BG2g;J&#u>9xGCuR?VJ2pvP)VK#&#|s-D#QtMn z<}F-7vEa!r`^2l2%cbSGVu1X|$`RWMZ$T@uvAPJY-yo$I>E%}22co^{1NXU_0Lz$9 z<-e!+`J~8~gdk>Hc;k8B69cvHxoKSxze*eXO~U(98nUwp|eVyBQ{kyGM8U!K3GC{w;*{IAM84LSF0PUG_0>_dRZ z^8Go*jpGed)41_E`9t%FZG-FsfPVBBQ!@UhpMI+9dA}CBMC<{NXRys`W1AA~a1{KR z=9gy_KK-!Jj$MYd@{u^FuV_~4n0cWEdqohE@Gc<_D0~NM1GTUyPs|K+;ZDOK)Zwt5 zBIsytX%rq4XV-ABvZW#-XOL?TH0vy)De!p7x?I*&C$K_$4RooIAodd4Aiix7Yxokv ziyW|Rgkfds&dM9+5%5q+x+rX8hO*Qq!D!YrR=Zlvb{5EDBWVrHSr}y6ki&hcURXW1 z%-;Yktso?fyM>pefEOBdxiqgqQQ0qIvEvcx80J=aYKNyElO4Ra53Ym$1-hM%raHi?#3{Nk6NNJ%PWUpB_24hqu*RgaLDO+Y6;;*b{a{4D&ckci8AO z0uQG^+MFq);`909BFw)uKVzPz zeSS`W-#h_+b|D}0Hd5Mq7}gq=4ZhZlbD!jbr=e_Ro`1!Z-VXW{4$?!AEI@NU!*w(t zm-5g<;8=sQ0ys|K8j7!?J;^+I8TKN{oT=t27O*QM-$uL124mfRr*-8!RxcVDcS#VXW`j1A~qlyS(RtMTWPevEsl_q{cl6^qi2tm ze-&>7>6fC_jJ31`uL{1jz8kxd*_V;`S+MCB@I+q#@9h#vShlO_^#=DctiJGfe$c%v zJt!6J>WS>qZvaeppPUb52l-G?yO6|5Ug_VhVu;0fLFuh8V1!an zt&Bv&9KI{{(`c|Y@ole!>FWymnHP=-4#|_xq~UgZz8O2IPm1^&10zQQ2g}HF&L-hX zka{))A{0YxEVJgzgzd={Yh?|5xAnzCBi%KA(Qadn$$o$3=70HyTrtI&^7VS4bgR#j?Gac`TedMtcBbl=UJ=5qBVO8x!4^&fKv_4g_Dk78Ec za=|BgU`Ilmpf4MpweU5!D>bjVv_PDPo_K%4$1xf%#hs#ZCwemWc-DjaTT!2Syw4(7 zXYfA2ang*(`;0G-T&tO_ywB`P=e%}9GJKrd)21u^Vj6t*21ql-h4YgAv!rV^CCX~c zD!arJiUj{LxVcFpEqGl2sIv|~Pj3$tj;+^fzPavJ)lD1Pu<{6H*wH9U~(b&8`c4&Cnddy!Vkg6h$j;N zS%Y(LB87hsdm6mSIFw_zL}T@>#5Y6D(Pv}98}Y9OLCQ!8m5H(ELW(eemO&cdAE3uhsCj zz>Zyrg??8oR$_(T70)S>ldb-oa8BtF`sh1KKRD-pTU=0WtEX@OrjqkkqEGaWq1Vw1 zO6y-&#(qat$XQCGXS6Lb`u|&L%`0I+KkmY-|1$3L6a8SMGVY)08~4-#f4D)u5T%XG zz|wTq)X2v*PrB#v_7$1_X6XJN7sL{M9z&l#fR;j=@GrRedbE?}S`BFty3dZTKPG;( z$s~b$R~&^FIum1u@D#c+w>~)s{kHzF@Wfo*_V|e35jprzb8E9wYnoe|F4Rdhb4^Ul zTn!PgGIP}?X0AAQuqxv_X*_D8%v?KBdykw18|*!pufDt*5R`q+3pJPRkTMp@*2V%? zhe_a@6uxZDvzlqXs)(%bH)j;!&F;XQvD95?o|<^`sgXN{X^A%;WH~p3ZPR(9`P5F zn~2{K?;)NO!o9?26!{7Kig??9;#tJ6NZ$GcK72Gkk$k9gg@y3{<$ZVey>F)SzG=$) z!v9TavuwQYw#56IB#ie)DwT93Ta+HNaSm&?Hf|DWe5J17_^7Wz7+uHwp1OLBSJQZ4pol5*lEf`33UH!%Kg!el8gBfSLw3*J@^~&x8iTRKe{Oj zjmaWGu(0idb0Ov;LJWvU>Lz(Lv9wzvY6;r{`0G>Olncy%Vl%CzSpKi_7A;K1`c=30 zymv&_`D({bRy0`F?qp*#B4w4?{=r$KS6GU|cl=R~S8XT?kvk&k)i*Gu`pO zw-GHYt-ixOQ;V2zj7iPf=ZI;-v+Fo^sXz|Pv53RO~vnuUX z1FDaE?3K<{cIY9>gjvu_*eeHl>~77fGPfONIud`&Ks(*^*CD*KiuMkpe$zYGQU93< zd*NrmH|Xut)Hij=qdrLe@0cF@oZL4Vye0=fjusUA$ed>+Z@=*u`FImky}_YQ}C z0`u!5NSjAcQ_;oI8jz|B8dl z)v#eW-obrSkiO638l3lF9KDyPVV6f~*!}{Phx;nVXxKEXhGii&qr68!{{#0;FVraG zXdTkW@%xZP!wjM^u`1JEf-hxE3#~>Rt1zVa5K%kOdc->x_7OZQ&VRnT*)3LL4zzQm ztFvIo+cNkOK&FCKcRy^oyeF_2f@Io!rgopjwDgmzuwmTA$DvmMvgJk5 z@atilv#%+(i;=*t%!yRP&M{mjy~Br!-a+(p`;Ud(#<2OZHVyV<#r{0to7K=jBwykR zjL~C$t^h0L^9=PxL%qx1+Rk#(CXL@pAti)qw?nh?I+R>dqa@+MC zX+IJ&d_SsU8-6s8_uRIXjlGvpawCq$111jIk{6ZHXRYtCE|hKXw3{xa+bHhl1yK__ z-W~UH>ppv2d3(BQQskJZXu1(yR)lue$ww2vt@XrljEPcslwyH|@NoCA=u?W<%o9R0 zV)E1F@A5XEEr-rEb{}-_hZV~P+rt6({yyIgDrbP)-bVG&xTZ^^C+;ulFmPsuv&xKoi3iD-y%LaL7fzysRzaMWt8h4vz>sDLdbZNfRglHoc`yp15 zsj^p$)sQxVYGK_<9((sG{E?oS0nb;`Z&Xz#yC@!76evzo{h~lZ$j_KGV(F0`2Z8?* zsMY5Ip)eLhxumloL^hgvs@ytYMKFtq_F`6t{5@F1dn~g(TsKoAbzA0NCwBh}&M@-zWkgu@Ku^CkoJ9(xK@w+r&3)S%kLSCtds7l<^5_wAWEWahEjM^7b7lS{b+_C`%}MDe^%mMLDusJz$z2)~|7K0ayk zu;^+FG#(XPY{{)P32OeWwF#>7)>}fWrDJu;j*ivG6kT!0>JBAhr5)|mE_hu`N^WL+ z=)s@QIV%)P6L$n)15Q490`|cBWyl_nQrjoP1C>DtOK#>YSf9ZLoUGU@Ev^bvv_ybh z2~Rt-Vd&h*@+(r8){hSv2be`|J$qk1j)0*mkJB`NUVkS z3J;MD*E$UP_g2T?$ivD#K%OLAK%CzLiwy6o_4GhPl;Ij;YpFO84WNYYL|bb)SD@rw z>42f=;_C@-oq~vI`(DH=qBCB6Kr}s|EzHKQb3n_2EnQnUw2M3BvF#;n{KwdIDI2BggP}xEzDEIwLQ`ft8NDe_uxQSna<2*&JCx)};i$WHcW55^Eak5kAGo{*d*XMp2@wi@HvC$QD>g*Qh^6U|9uP)Y%{loi;_s*yj!@1_y1xviF z{D%-H2aV5V?wK=Y4zXCjG>NRl$@%Qr>k%PGGcNkRwxvy3y(O<; zM}QK%*lyNrV~6%SH5=&(>6RA-F81w>bjwMkU*Dj-*vp4u%R)@ccyreal77?*=bEhh z{SP|^M(zjhe{$sc(BtS)N9Vl;YmJ_FIJs*3GtQtM1!&Sjkt>7T~ z$P=PRnS^J4`fO;m>;7^efmA*V>4_pOtScas%9%RJWwl;WOpU1D<(rdP6VXRC(cYZ@`X=sE6azXWxD+8;6>Wz;u}Q9mjOv#Q^}rUqDCw6Q z?Wx?!p6f3{E?h4sMY)r-ztC~~x=-d_)E8sFgJQRA)z@Fdef&OrVSAU?HL!8CG}EGW zRXRUkanex`Z2?~(zccbbqc~iO3vPuzr5XI?2RKgQ@IX$AebCcGHm6b?J&0>u0~v~Z zlSw8^=i_n11L2YRg?V50UFPh2e(rw_UJoLoFmnpOJf8y}8hiGh@{UV;$`{FtqEw^D zP$M2SGBu8o_POG9y18Oa`5=^X)BH&GpI78e`fx>#okgwDJIz1wPqIJLSK?=h5+5r6 zt6XbSO{}v|JLbS_h4U-J3HAZ4}6*?ba6jqyu~#WV_+A1%zSj&i%Xw$jJotB zA|zPjT(fm;d!rRS_&5#6VhIuBC{f3X2nSVE=>_gwq6ho|T$11l~$v_zSB?5xdy(J5;;`$9g*K^lG>TFA1%0nW$QV7rL?cP z*atU#XAim$V67CFi_dlM2kHg9G$K9V)!nC48s{|TyVm3yZ#&XfoBiFkXQ9zpm;FN9 z@@zKd8OP}JpRi*&3s&^N`}JdXF6XYrJ^9CS7A?-q;#@oDLhl*-xZ5T@pKDlht*!g) zpK>zp=_%wo#q5kFziRs&*DqMH59N(_ty(vJh5MD&d{( z81D6*UN=YYvf_QRp!>GxzS$-<2C`cnnU}6GtF$*~*NUE^l!)D|&%++3u@hMP8W2~p zCihQmbk!#qFIX*Eq8KLaIT`3(K9qPD&^u@aMC)5Rzc^vX>9KZ47A9zF`vHjgu;r1q za6S+!jpjl;VLN0q-&uF>9k`n$7JFmpRKNtpbombV?7lV~i8XaE^6DSak6&-dYuwea zs?pIf6RT|6Q!I|L+P>3*Xg)$%4eYE2WdLR0c?^^W>rvw=(y7p2(i{wA9&r78<=m=P ztZ`B!Lq%I7bWr%ht>{k+<&s8`^^V37-ByZ)LX3J^bfEB;ZLAUUw66#|xtK!Fg}5j9^y-`8O!v9qw(cz26qL>C*yii}-6mtwO) zZqUla_nvcnb!jd1F*H_RLlo>9_bMeeDr}&*94nAMXnc?qNP3(hu6x|Mu3_6(xI4q_ zzzS%iSW%wbGqDWVZi|gYsQDc?j$iP4i!$EoVTX8EeCG}pE9eQrTVq4ygdsR>oPR+Z;P zPKN4Tb>+DV2GmSJ#emwG`*oW>FUz;sxxg9DN)8nT+@Tr-x}FUDyEGF!OK<-g_7}|L zV`ssWf`$D`VwREajDM4Xd=+`31#5=<#NRy7qr~{%e9#4A{O>5xqs92&0?=c`_}|f> ztz!J|7|?}c{I3;skw||@f3O&G0QI*&>($t#f1tlnpCkP>&G%nUhJFD3ENKdSQ6L*w zkeRUj6q!BYOE*rI`C} z+XzVupEh0e8D&>JqB&sn^4?SMb84BxMvj#*jx}X?9l!6SI(}pwOOd?ucYS<=@;LZqLY?40mA_`eZ*iyP4yRhW(=8epq5!$5##jIVt5vJ zX$iGy^KHUR(Z0_V3ON>Zu~;W0Z0sS_!giQ3{|Qk zR6#v8LrhDIbBZG&TPf)kvLWkRalH8Ak|m@=5Fp=^z92Q3DfIR-Pg@oaxmj%1AE-!qZu>FMH(IG4HOL!v%2MPlvZ%bUkl&Nd(hV{d{aeQt#R^0 zwQPK$JWE>VVvr@Q@Rs4X`~#!8bt=Uy`I<8QEftR z+>%tB2`{5`c|dWhT#Q)i6d*sRVONejP-+IsJXLW;EDG=~ z^qn4NHFv&0=S?p5l z4AH^nFNHsV90r~v2R#$;sKyV6e=A8yUqhP)Xac6z%^@{waq8uU!yt2BDuJ_BuiP{Lv{MYuh&)7 z>kjX#HyqZ~8-TT-k&mF%-(59~cXryCe>SZ2=7(n=*mCcdEn0{a#c7ZZc$;&3jq6}= z_x6JgMToW@C~JYnrYV{xZ;u9}-$A6;z(k}Mi`{jDZA-#9(L+u%Sl34kn2o)zcj_g0 zT1c*r`ZZV&({E3dZHr%nFNkXgTJMSshyvpQ=N3i{N;)@cRPJ#{O-ky*JqDB=zkU|V z)+*P{i0YJdYLuQZDM~&#k0Uk!k=#J_k=z}_uoq#r9y|4Jc-kwug3!(f)^&tIL02DG7X;OT$ZvY5P;j|Bz-LN?vm?OXeU9+K zzDN&o*awUA5H8Rcr=7y?Q`93|=n)J%eaxThTQ?j2{&&c_XIiK5*we5BR>(=Rw`o|R zt#eA{yX@JeY{FQ%)0_!JyfG21dK{w&;}U&@vyKD;5X+-J@pf3dSMwBikR1qwXU==0 zP1iCDJKsiajwWr(nTi3ZpYCwHA9PBS=S3&Zk`^{;G1}HhzICmR*CX*Y%$`%pM@`Qd zpVmA{cmfm&hSFmvZs~v{z~y~?bu>n?*1AA0K+0L?$OZ0EillZ9i0|o;8&bee?qG5K zB`vHoHsUww6-b6)4?}Ocn`6-w#D(CzXIy+wrfayK@OI*R z;w_w4RnE_yx0s(@zPQ}ExO}#pdf(5Gk`3&aBJAsEuVNQuD!ls*0WuiU z9OOrFz6&YE^^h$0`RQG!G%b57c^lixMmtQJ7W<>^1Gwhxg0YB`whO@83XhNmbq;3R zW{+wdmG!;ZS^&OUr`-NWaH0fy-$tb!HY)8vR%t>~(pc*MAHN&=&i9toeQ}jiQf=Rv ze=P~M!@S^@HBW1vNuF$+@^%{^vg^zjfuLexG4X4%R;0)^VwrhOA$Q3-dO&oHCCu4} zzi!oEDg>U%TH3|l$}Sm3kIE^|*_k^_KP&Ze#3NK!@dec(CK+IVE`*<#b$pgw9X)4Q z8JS@@RyW6Tr7lq636U49C(s(QI$HzrcYpcf6s5)sl^P4tu)%eK;f_IxI}~3T+|iD0 zdyKdX(#@kLeR5ir=+y7sTq->6*NeV;0=q?P4jMgw5k8AnXjlFeBSL#%%)G40#;>7_<-n4&d zS@ri!@it}F{{;P_7u&rG9d4e>#V8eLW0WnbDleZ8>;n9D&YKHQvc+Qu-xG*M;rJ!6p+17Vezp|-%N?8kCOL*73g=&4v7cappu!tM$3B0TJWlrFlxwBio zW$C^2TiZ;1v}wCaPcUzJVChi9ww*LSFN@kMRl z^<$5z`TJW{dckIuHf&UB?K3JJsnGP5GpkUgZ!b~lm+UG%=?;~yp03ijJNnU+ReFnA zr4gUi_pBphRl2rGZQBp`sPwmIRQk4l^t_d7{m;IwUh}zj$YqzTOcbZgs;4YQExLc)nZdd6?`jxpUpysbnR_j*$clFzS)}hvI)6Z4< z$L%Wp!za~pru3s9{k3|{v2!Z@#!9tqzt^uHKD=7ZzrI1=*ACxVq|#s9snXjQs5IA) z?pdYge|l$9UpaMqReHicl^(WOrC*7u^j%M@bn&w)edVZ1mmOE1m48&Fr$p2?DZ9{wE(uNrbilkgIB)*Z)qXmw%+v z7e}kK_fINq`X7}xTvET|+wZCL`=6-v!G3(;@)WgSt=pyct8;%*uP^_zO5gKamA3p< zrEmXCr7MT2?fl5w>N{%BskEg;t@EsY^qhY5l79T~gYT*L=A2aNxBAhG^3>-pNLJ~l zuheH1l&kMJrb?y1eNDaoXMa=a!cSHD=P{N3jYh4*>Z@x0>3;b)mZ|;f{x8*Qnm$wM zhp(yhvcIbIl226n(Mf7OM`%_0^M23rPEhk3c$FTKqtZ?N=!OgGSYE)Xyl%uW_4*-q zsPqf{o_o7d&HrAeN>3lG(hXTE{a(Lv?w_vapT4fXV_}-wo^Pe9^rU2!=Dty{pEN?v z|8$jF=G9u2E?B419ZOYu&=!@B^p_2SYW{@BRQhN2DxLGNO5YP!>1CJHaRifeA3tgQ zxk_`-s@I?UBTFZli2nJiH?Ede&Ucknt-N!d=qz73f8jjm%K7zcebx1AS5`S!F7&T- zY`X8h8GLzteQmvk-?EmMsyDCYtNHrs)oc0HwHwxWH+pL~@LRkaCG3&2mY-X`bTNKy zSW~-&uf31=FLKV~9S+`CU%Ps3LxXq2{T4h|qrpN7|K?QJ^Lz*R%o5&yA_`&eSgzW)*n9j z$1R$t7Qc3W;kreqcbi)uyMM^h1?Kr@{{B>kKe(au7rtpHrfiWv|L->{FZ^obo}pcf zh8W-Z{mVOlv?H|RrNK2Xb>${gdZ=P znEhbY&rS$Gc=M(E-#@-~*x&ElRk8Ft#y5XC;`z7vJJcvZQ5?TYq!o z(e!sN|0d<3Pxc)7tonhsT|ZsCHS5B~V}FP)JD+5KZeQpZAN+K}fOBsh`s9}xYv=78 nz5d?rXjb&yO`pA9yf*S`MfLYbtzWx5>FMX6?OJl={>%Rdsm!lY literal 0 HcmV?d00001 diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qwlan30.bin b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/qwlan30.bin new file mode 100644 index 0000000000000000000000000000000000000000..e463d68fe7d3fe2afa4e018babe1b311ee55b46d GIT binary patch literal 503752 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

Scz1lF3R;o|pLKecnJR>#= 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 z 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

DR5c2jIF8?Ym99RspB~mY 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 `q%@DJ1+1p|07 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 z zV!bG>mTrVbPE!6eVC)rT>WV5h3G;kWT^h{AO5PhBQ5HF)EI!Vnfy&z@-QQ@RQPROa zD9%1e!AQH3=xKpYqCkdr4C)yr4~inX1*!L$o-V&y`FmXiK_;hN~$qTen%he}^&d zdq*tF>w41iNKqCWxQ<8cTy}A?*luMJU2SY+@xGwS=`?(G7!wgC09g;vVGoObC7-Wd z7rB+`wh_h9I`Yjvfp4A0lT2#jOpsxrYH>a0T&J}yA(ji~1Q`VFfe21aBp)lBrXKbCa`Cj zN-I4-nPx+ph)9@6E&KDX6=47y6TfH7Afup)=vI6n944eMwArjep-0NhGPE)T7o3 z$TBBk7sln7l{8UpeN>ypHF7yxE4yNBr&QXIPG zARs=N%oLm!*^&SZ0NDK% z_2Z3XcsrB#wY04|p_CX;ed;|m<{sKv;oI3QzM^C=8eQ19M;V*|XWcV-iW^)?*5tJ* z>DFj^LQoHn#`~=?v^{w%(x(`dGc}gPhJu+t$*r1rKo&~D_l(cB^wH_IQ!z~>rmRN- zSECgOOEJZ+NMa~rJ=|uaA%IO`+DP(~5tDf*cne8{%ZrJ;H^FiYKl!pwO;ge8)Ow?k z)nb=|(!?J^9_yYB(^`{A%@L^7neu0w=GM4Rpw#rdu>mg}H#mYdHC*}|G#NC<)JFsh$%_3}+ zlv5c`a(Jy3D9CQTfr6Yu4hDf0$euio-Fn?AWaAbgR)`#RM2%~&^%}Jl^`%nrH6(eh zU*XPrL~XZT!DDA0+iv}yd54)U6)QnRMo)zLOrYr)sm^Du@Ny8zgk$Eg@M*9hd=zpM z+UwMFeAch(v)O65V1Rff`;@2=F$2@duX9R8JMF&?LQBT{*OBL3lUnVJxPO+053ukQNQK@L5 zEn$N825GcTA6bauhwUntDi$mAh{P5X9q3ohDPpEKM2dK3$wfXMAp^2a zbv&Nh66xLA+=r$0AC);3|i#-+^*a!acwHZwDVKB#9|OTj_iA6SC;I zCtl%$poi6;6GL$2SvR=9lf_9C(~zLu4GbrqG((>B`&a zx|wu(GHpwx?dzU4uiI%{SD{_^N9VfoiScSv(+oo=a-~j6rln0BojbeyyOy^n<}=3F zq^~eMqLeLfPmmK~sYDGBBK;#xZ(7wp91_Sjn<^o0T>#=3}?P-g^Ee1KGb4a`tB2)syx=^JdPljHHILg zGEbo#J|^C3akoo44Try0bUfLcL2o{C;u!DL5v-?!v*;7=vo{}U3)?1&Tkl;yd-&}|Tif)L=qu4*75rWfqpiD7KEa?P7ril10ie%dQgB-c{+ z#UBsDgMnA1#6VE81reVc_L?buZS9X`^B}+E1zX#!zEg2MJ@Ou{yC-$$ds?kGPOXMD z*Y%(a0JJI}I*x>gPuWG{$) zr*>x&XM6I~my8{6SNHn5);mwV+BWDjNWEQ;!j=}{9DJJTMG??`7VPIeSSqA8Pzkjg z>Tv>aPpKHl3`OncdP*t4A|ZxVm!S5cdIBz*&N^pRwhxLhto5Kp`e7Ck)XuG|}5MF$Dv0LxxCrT;gssM8V(E`HvwM**#G1 zbvZpmXf#Wyu7+0TO~%tZ%+70j;(Au83*2#DLuAV-Y3m&NsvY=rrps%5QDeW<=+}`#t{JDcw zXZ*RBa!&j88cF--_?6~-hF@9xrwBAaL!}0z?IDl+(mdM7$sebUp6IbJ*<+u~9i#tH z%|0h>OYhV`)gN?$U)t&K7g@Hxdr*ZMm?}GTF3(8eJn^>t=!ON2Dd+M#@2lR7YF$;r zzIV%W))rF>OvjCpkxtICifW_L5Yd$HGpOgaUfwm$t5J!+>nJDw(7SBzPjm~q++H1q zu=kZ~Re-lpOg=`6oVSSV7K!tyIdC3@VHqWU#Vkxtn_s_u%@u&Cr1+j0g>w42cxpE(u;BH*nH zqA|@hvqtT^ea=8dTm^dl_jBfys{3?bcm~x!)AH0KQkzbZ?Lu;R-@v8+YX4kMFJ^l z1(Fc(r*uSo>3qysSft&cQT&F(&^sT^I{PF;72J2jF~}lR4T;v;N6m1zpb7VCG(BC9 zblM6&<+ZMkKvWaNX`zIpCJ7)ly|Wb+@3H}@Axqo>x@A9(5F~xA(9Rf$rfs(V zxI}qzjFUTLh`I7Ur#;wjmT4)G;t3&O(4oCV4Xg8$wu8`99@V`k1$w_j4*VD-wh0}U-^VI2Cqwn|=GJDWg^kiCIDloF0s z1oRxttKnwO5+5gL@Rw*c)(v?`GrgjVjSKT;dCVxLAkj$}Sg)CH zHRh~*U!DZ?DYewp$2fFreM+vj&em;~XC5Ma&=T7MVT{=i!VhWO611x6XJcF*>7Ac# z=VP3rFuN%9JrX0>^0(T(s}42-WVM{xi(*M5mm*|M*cL%OU;Y#_nPcZn6=+^JhancD z<~t^W>^@+Z+Rp^T4j>@)fZ0PHz*|PG(xZ&HGR~#On1G*Vt;9Bu{$}G`M{@7$F-J)V zQ>Ru*gpIe~DN|~3OOUZD0(_|JFFhE_81p~qq+6|nHQc8B5< zW(g+>W|8qz`Jf#2Hryua?2Yvb>ul}3%FZ~{P z1SZ)b2a>2ixc1`OO zDZ1j%^>BhRdQFNMT=8lBz$g6CF7@aNDHVnc7kJ2cVnNX1{hWhuv*EmNdGQC=9PC_O z`){B-qWI!>#3#$gE1pd|c$9sNU(~_2W|p+<0VJQBnIo}2yVG4Psd$j|{8YmbGLSS+ z!?wpligu$_m(TL!e-kDUuzDqOcQ;agynHq|UKduy#=Ig6HX`SYr(1_51H)-8f0i5z zt?;Kchh_drUGi7;!1;Qke!#5%Cmf}qTSu?eV*;D?!$$oeZb?id{g7Gzb>OL4|BX@q zRntExppnF9s7L^mh!*+B!|${EMLj=DjtRxz!C_Z(nE1>nyqh>?tJ>m>>f|M7fggy4v7k6I=ME{BO z2L!O~5eVM%lh?#e;`hHf!fvJpGE2&@Tdzp2ruUpp1M!p(4E%j(OR=QqK}imr8UqVa zWC+q5#2JRrq)JfGRB7rP8N9NASEDNZ>c;q>#;Pjz^G8~v!^T#S7`=|lzU2IiJ>#>- zR=1Y9xBQfW@HCvWQ#MhNxgd$BXTblX(VH}OY9oysGnc_ff&iA zL98yO;E`507K!Jc-EUe(xjWU~6%x3<@UD3!aA!hz=S%VD*9#* z7gHI^bmfo4C&&08xYrm+3)VIMnArc>@6!>Z@+7O;rc*|^1}&Aol!&1e#ktQ)?Zis50z?noDWwF8*yP4S zm#!{FP6hY1Legekvu*A_UDpCP5{4^APR@Q-u4kZF%Hn5cX4b9l&CHyQjaEUy?0cV4 zY>2nC4hh9$LebKT_xi{3L_>M7S$rYvLKyjaa)fIdv-c(Svb`DEH_eKr=IkBrezK@K zrdi*JfR?6*k*Vy=64(1?q$`Mep1gGQj+US6$8>B`(Caa-Y0;v<%GUBN;Tl8CgVsX1 zeR@z|(02_z|A^?p!3d+EBI75IT~aG=>P(nUCnQPB=Ea%W(27)GteJJ}96k%T4D7J# z7e6jj2?DWw+)pZ1hqJWQUS$NG7hoX&+i(_750fo`;BM5ShL6>9zA3vu8deQjp zcX|KCJalNze9`zY^V0LX@Xg%8zCu0kp}ZZrl_O$f++5_f$IbipyVHLf5%*=|E_e2~ z-&MaqQAp#*6L04AO{AQ@=n!KogmVq?wi6P7biQ&2hGX&XJ|DM@eKKDBN9QEr3C*je zrBC|XkKe$jErgclB;^3Q%ktO&0zr3PGYwK<&sXE&NN^A6Ir7-RFN7Nnz8Pr=Ci(W? z@pD6itu9P~L{l)4E^F?9YR;?)Z%-g&0rUTLxHD3c`M>*};;UYyk=d_QV-A0Gp!mFJ zq}3dX6FWDC)d~bzWc;lx)-l>Hd)zYx^CdGjg_Iv5;j|`IoKX4c1AF-Wgu^-Gp1~ui z!lpz$Mh7{M#>rfyI%BkAR!e0T$#3D7&71Fi^UDFPG#%PqpU8R2opuCXaZm`htCNP# zPM;Jynp+=Cl?)k@s1+*b(KykKR2Pj_tZJ#uCS}(=W8s(0!x3NUctAfGP(V~JCJ!l5 z-8`Cdn3LF#JA^KwxpQv907nwQiXH+2KAscddpQ>>+a$N?(q<8|1qV@s8KVqQBwo1r15)UEln^^DppTM47E_}kdPyL)0H z>Xy-ZAKN0-A9oa2^NIa8qj<|R%-h<`aeCxl8_R5CnFI}mDB&14nu2A5{iGuh-uV_| zK!h$2oO&~FA+!XT`ovp_x|mVZJ$RkjSMF)NBXDUqr2M<>rRg5KAsNptcbM)$aM}hY zFAVkock?( zK*>g00gXI;vBObprWpaM0H@jbEDWOwmVrsOJR7L;vq)$yr29o3y7He7Ov5|+wX2YZ z)>|GkIY_G>voqE)F5Ujk7X-`+cTE&v0~Tr~@)WH`K-0!*D;>)JfcF+C9oc?oy>;+#nIRV-ZE1kCrFh>bTiJRyeL>_| zNrSxXKm{!?1~R;e3>^_pJ_n9I8zU6Ec$!tT&%XNL%-@c1lo!u&OhseXb%;J#^xOwC z(Xqv}=N`I`Ga?(;S~42g2d)uY%hgPxe)tz=4-2A36Ifz1_EWg_T3c{awbXBZb=kqB zUUYOGQ!(cY(yreEgfqb>IfUUtx8EfyD*b|#M z@7j9h_nZ@NKNoDem!T{s+|r4Q0H2)t77AY^0*hNiwxe*3JjE}eJgcigFz%VPvxw@X zwO)=sZ+S~%U9dCg9I4>VuY#W&IiYhlP#Dt0{XlZrkaCIkxWK= zR-EZ4rj_=rWEiH4eb%m?PZ5m%XwT7|&a8Zkp!|%rK_U>c%5OOMPCJX3net&Ql!wi7 zwP1{Max5!uNPp5Ippqf*H84hz#+2kd0)Oq3E*Bv}ckLl}@y|cG^p3SP`NUnz!k^B* z*B-%26@#HI6SuUf1*iSQyr4~u*mjPnqbED|PP=y5JJSt>cFj@OSj|)RnbC-9grba` z4r5k6^VQ!D$%=>WrhJ@}wf*km>pz(}E^}5K0{Hav$(jt~wRL2zom@}5%sNI7olEuv z8T#bO^qOs2PBMZXE-{DwDvrCBYi8C)O6cOi#c^bd1ul+nvCP^gHUn7o3%=$8oXehX zZWaUJ$9!^xvu%aBLr~riElMX71Onp+*cNAeL0X zaEJIp&@t}tmk$FsaQZx#!c#`~35M(}qIMN@P!92>2Vup#u2F0X z3Jl?(k+AY#z|F#Z+*~hTHNW4xJl45bg$Z=!+_do^DzU<^z6v5v(rx%3gl^V<+V4hS zkPGk*)+{EXU1>j&+`vC_IeK1Ak=1{XJS;;NRV3Ru=S3WYXB2G&)<9six+@-$JeS2O z`z8^UO?y>t4(6q8nZ0L*s4Pl}{7gP)FyHuE=HVHVwX&#+vaCgds;mC=c9me@2nmLt&Rt4fOHneSNbDffUdo9{8l-M@_^DtSh}cl);W_h)c~B_*?2vtl#WKk)8f zI61Mbg!pL*cgQo_tcwVO7iqGZ@PSA@?z3|(MtnPw!l6$hIC44QX zB5fZ=nmIWRQEfvDTsa%_pn6JNTVr<0qMSt=6J^EviFdV}KdaTV19bOz<(SxZ-n!Pj zh=fC7RNr$^B0x1Cnm~ar{25Qpanl(kGafP|pxOr#X(< zVAZC-o64{KL6^g3)n3xMukKVl4X;8y193H~gV7>oSI^&c#n*4ZtzFky=A|go5;G45 zBDh`9WR8nsi84uAZ7aMGi~ls*Gdr!{>Ig|QS+SCbcoXF?!`dLX$ENN*WM4;=EXKH~ zj^-BZ&?OnC;D&?OiFY$Y+;gi=5x; zwQ?VC628}IU&c~4)Yd+l@1dT8__Ha%r!XgaAErIOqiw&Z2Opxba;1h-rn)V(W;0FE zV|qTehvyd9H%EInOEdIb-{#xWx6+hen-#!wK)VY|3)?mtVHgmDW#Ew1zR?IErq>#b z8rUA8oyn~8zhK=uc}?>uZF`LF;B-ktWXbQ6Ey}2AJ-;$-{;1JrJ zMZ8Cvv!u+gjQNFGxYYh3ku~t9V^ht1SJuHJp&gvQRQQta{`B*s9Kj5DIiW;-F@xJ_ z;FyL&Sp(nb%2e~HT^1n7?RtS-&$sJ&c6|_W>BeXx^^7J`&uAj`Tzr99vdd5qgo^f}i4?-4d7t=~+ zFX`fV7RVh7TuN&0p?!OTgD_|q_x@I|uBFTB;>@EQO4kB(&wGc6KPYmr*1@qXr1Ej- zwTvRPSQf(khBCil$aJb{qIkk9@#fYYw2mup4${Y=Qy)ttvWrPi@fE>A7LIK@ZJ7?U zGKG+5J*X>-n%~T`@HWUT!lLY;qHJDKHs74hDw=RB$dD(SAx}1dx`B2agI^6m|EjR< z0tgU|&Sn~&{VRWjlbM@2MS4k*o+?1S^&w_G)1~@Qvz{TLKFq8SM^X>Ry)cY_1A9kx0pNG zPd*9v|6@y7B&7TjHuKA2ez`ps9n3;+XLgBLkJ%iAbjuRbh+OWl79id;>M^fO4Jc*t%w^i zNlBz#vkgwv-5pjJHQJC?3!@3j5?X7rb_BEPZM86_4R#?4>EZdOY~{4s`s`H^f?_az zRLGSh08qSw^&GVCLp|v1-`{1V0m%tTPz-043UD7_med9q#3Uf zCjJCFBeq_{l~-=3Q{EjoA_Xi}t2JVnSU9ZUOw&9|Qd(MFOM`pQTmduKPWg9$31GSN zY>L5l1{;pyj<8qLB5+zshH$vlqt-q4#sm+mpq|yY&~=s`hqX~&XnIAIOuNFvGNRS zwr;F^qK>+5gmYtpu1;H@ZA`2OcWLFy%|cdD3XE3PBSuX{X5HnoC22=zgFB?1iyOEo z1t4Wy#Ok(<9}Xf(F}zc-0bg2=GqD!Vni9 zehh}svWoAe&;cFQK9K+Zp3ikmArFE{~(j|rWfq$W*4}-Ox;0_0T z(w?3PLLPY0uP%AC>2mZ=3YO{l*?F2JvApIWLd;lhDsCO=hu&`H2Z%XrhE2Fqo1Z=7 zFP}B@OLqqNu7S1oHP%)x5g##*F^JbD)MM6R5SNtHA<;PFnTjf2ab!r5ffe7)Dt?~Y zHp5tSoLf+&8(1aHT)9*6px8bGo;<|HS6l9JaoUq`!01XY@aj^!1_1dw;yyf&Qxyk? zkG;p`I8kdIQUIr?K2{G}9H>V37PS0GM$3m2n95Rm!(6uX}x5mA3 zvE62!h9mEW*L%ISk;pQRpkw@w`Hm=~R(kRf?mL1k3y<+(u=yX?U~OOxZVoDaB+!1W zJIp-Bcz34MS90Z-0CDlM2e;D;)?*1G!bzDlbNx=R4{f4xU|@YS2jd2VCNL)un5CIh z^6MtVm-`i$u`!+$AMQHz%azb6@u8asK@Mv_EX0kmdd3RS!8s;inh-nD1c(vG1e^Yw zCQOJCn63{pO<-gRt~?{wn89ou zvx3Z7>}D`p!UtOLIE4-R{8NC_m(zVRgrbLK#VJ@isH=D^B#n?HK;KT;db-kZ)^jsPJ=O`# zDXsRI^k?V?hhpk>(l#UAT1i*_k@i&385=bZpG|7o(iT-%=~E@AorZP=nwbEm&dc%`+LhMFD) zd70vTaf1h}er@R_o*tg@)U~q{^0W!_Xf4n$(CF9Er7!y{QSaay3-)Nn#HtC^B_+$b zLe9{j-bS;Gu{*S-EKm?d!0}wG8LH-f-tb<(i%*FXvcnT*O9+mYimq*{H^x>WBL>a% zcH;OAWmNXZn1Z_^56FpD?dE;_zuX@PpLh;!Y(1UM_=I)F*4!jrwC($t)>y_)C?y3Pxl^l899vEZk z%$v%co1XS=dWr-CEKW4CjzVu~er3JX<22S&#j&2dF5a7 zP5|PO_tjtJtvoBp-JYV&dKhTD`Tk&YJesxWNHAIgEs+gIlR;;}AwT#pLp?|Vw z_x-=s?0hpm@_$#coFP<9X=|qI-k_625FTxB(g?Hy#aj|_f^FiqzCi<_FJ^h(q+5>E z!Wm4XvLVG0j%RqUk$^b*MU8`a8!zJZhQh$x4Xvk>I;MAOK0hjSUvPJ7P7jjv%g~NG zU#iibTKV~Vd}}{(5J`o6b1bft?XV3QBq!!aInQ$J_&fO{)fG63?O+dSB&WJy`0CV% z1CP8`D)7vy;g4%Z2EDI*Gx`tr=SO8Y^0todmLk-Dk{QsgQIYV!KlkOIw(v7{o5Z39!p5|JJNsXV;6%{wBIIfAG=Lex61D-3ae1je@Y<1F}w+LO6D5ZaN^wF_gR@q;J(D_s_R2faD z>JDN+gBE?n>a0U}rmKu1)1!kB)0K4cNP_rQVRnL;IuP@hQ^@fvVz%E7V&0kP0a1<- zy{WBk+HhnBv=seJn;dm?L> z<{Gh|vTJMhJjvktJc$ubYa|?e+E2a;@ig8}6>lOS7+a_uY8kC|S74Dk#z8{hvixUI zru7}Vwv5uWwgQjVFCugytywJq|leYXszX&WW*++TB& zyoA`b?~y73-f+}j_ITFYckRvOP(yhnn!S~6DXIp6R z2h9HvkDL6j^U`gU%|o|-2n~vT!xr;~-`mhj(~W&>^HNkT@qaV+CU8xiY5Q<;vO#jd zgoFqL0m=TmE~b?jSmbZk&M1F=(s#d(us)j+i+ z=@wjOAhrmKQ_Zwfv~@=5xK0hnOBL9Sq0ks2V15PtI%kWgIefHPD0jFJJDiaFRhsi@5<7Pwwjl5S zZ8SDtIh^k%qaE#28>>ajCS$c$=S!&bS(Igd zDNP{)oXMGzDl^_eHZR-L4D86Am!PeNUo%YTa**m)*6rs^ zm4eQ>n<~%3$qakZenG~Km`-I~FVICO9f!g8miqLksGBcYnmOdW59qOpCnTVooXPQ$mqd1N(*x_ZIAxO^^gN z=RQG=yTmBVV4wNCVQTraH-crY0qIwhivJvOorYVgJd`hNNu38G{AsB8kN|-|+Zc=l z*x2?xOu!IhuA<8~T?w<~STBM+`5V~&yO?o_Fce?DZoQG=d^EUd_fjc6!}C0I-awcMw9MO+UXvxxDmC_` zHylg%@a>!=UUk&nNE_fbJ|^0M};i4542!Pvv?(R{v})MzAYkUj7N z83F}KmQOw_FFGMzSWuH+Dc4VqZ8icutiJh<18F#(^6v*AZ6ld}ZzDPI|FN7Eq$fAT&V}O0t3-gV^8yEt^?5hLk*HK(J$f|ER zp6(Um^VxMH*CvpJrMh4&65+8ewo@X)@7dob_7Vv(9#6)?1Uj0>QmWE289}*>v}pO5 zn&-v2tav%g%vnD5`19mp%{Y9_8aGt$>3w)FJ&`^^iv1mrMAZ;;gtFpRAOkA6MCZr; zoa~w@W+wW>=~?2Azod6-jBV*5&zV5Z zOKnCs<^Lod2a1AHOLd zCF=QT`8ki_`@#`3zj=}vgc!bma@cZMzDsIHSiYskH+914cR0hg)n(bM@PD38&+4lv z>aVcERYJ&U^|4`N(fDm<|DV$hPXr%t8(l0Hjc=k6^9#g8oMH-WN&o5S%Mw>QUj7DQ zOVk0f%XoiXH*dV}U@St=!KkJ8B#~cbSOx#f-rn?uuJ#x9mA`Q1m@?qGhDLXGkfugY zJuYLB_wWC2XBJ75Ky>IjZ$+@z<{p>kddDcLl;;;Dly8f1mq9>qenDdSCOpbnkwZ9B zoJ12GjFr2%0B(wwxC=Xurtd0LS?0%Bs%1WL$&s`xXaA_{fBU7tj&?Ahxufm+t{BTd z7xsDDFT9>}>#{q)ADi$4uUx2oB?io-Wxa*PG=5aSRih<2Xp60`s zN?#->=2h|bl(W50E&2KjthG`193yPIv@1ceOBHWP{-r)eHq+~jFUbpjUT6%c-~qLD ztF+O01u`kkV8plow#}=v=rH(07pbPZ6a3Qv`ALAX^$v za}q+{BL39%FE0Do-E_*!%M$;4LXbB25-zf#Q&)PPppRXM6Vrx0lf37#q8Irukj8i~ zrFUFRhwi~WL?KENOn_LFCCu3%JIEL%{UwHz8?NhL z^b>#7dB4^5#`%;tPG5SmdvtJOplV6u#OPr$TIo|RelS8dZ0yFB&7@`i57Ql2(i^@> z_kNpxwLiV%TKb8r>1V%7?|a4`dS*@kGtcqW>e?IL@6-9GblxA*8-7f8Eqk`%dir&8 z8aQ4belZ@Ko{Gmg-to8>D19^QlBx{_TMI4^*54>*@6D6oZ(7MtOtJ;EbsryusnZ53H}1 zM4l4FiZf((FPZ#ZIHlPO1q*INqr-_zN(F_mjNqn@w=4~u+27Q9q zMjEKlyK-O%n&9bf|La%cHCpJw9#rhyssiwYP}P7@fB911Q|h3U#Cxi;^OPXpCHR%d z?-_}+YXTv_aK#M3%c{+!-z%98JBmi43i6_|Oj1;mr{76jcuK3qrzx6RzR0swUiUty zXBA83?&7*`OO{eV3Z6UW%g$6$xPod3B!?{OP=)w-UHevFTEHl2-`mcgN;3ae)obk1 zT+cIXs)=y)h?_kjyZVcjqvdX~NLS>J6}{yJA>k7I@(6q8;=wbdPh_#NwsnFu95%@;J3^G5KN*K2lBN8WQ z2Vha*!$61!7qMn-p{7~f@I#`jRLb)rzEs9j%MqP3mkY@RmWzns04r$uJQHypJ*zHS zUPUryCrU-^z0lGGPm$7{*(5 zT4xT*K@o`BT)0sQKO`e*db_;NZs>_F4pI$+>HwxDVug)KWIBbs-IM2OS)-xn_jlc+ zg*8FLr#vF^z}+y3!yeHw#o~{YfFG#VG)R*?hudjLtF?|F61mb$S{AMtek3IHT-M=2 z@sYzTjmi6(FfsjVU7L8NqKH=MKaja95(_r)6d2d`?ZwGlQ0du-TK-(-{T*@=Vo|DtRPd?ReXVW-?7P6ZZ!}2%&M1U_@#(+W`4IkR~sl@kw5rAvr%I&(p43cWkgEavBfbAv=)oox%o0 zd+TnWjM_JVrn^VDd*%SHsn94So7qlMFjW zy+}mz9+B!7nj6UZd9_KsIRPY!K8c#=sfE$YJm7(n5y12yzaiqph35XqM)^Pkg&w)n zI=qHW3t`}eYDH^_Dh|~zn*P!%cui;7 z14XQwVLu)3k{e|VoqhwJA>@y6+L+J3}8ZO`Q|U9jXlpG%^9xgLB}4ZE(>5uv7Gb#>+zOOWko+ zcLK1S`+ z&r)C}ftj(H2`q*C7amxa!r0;=pQW&1-LY=st{p#xY%KOWJY?a9E{r|E?q~yuD_S+Y zQc6gwYaM0=)EO-rIq+^-r^VIk?@71`WNylBUXMx<;(1{1-~+j*Z4xNKgG#SuVD!jm zVGkOK-0GSLDGnnOk}%39BHvb+nKg=vkxbU}g)f)r=L;q_WPFDjuU{be&dg*&o>=-7 z`aj@(443uAb+@DQ;O=;S5=j(>FT;E28T13qFpE4_d%FXrr`A0IfDaW)cVv+bSD^e+ zHwUb%M2>&xwocGNv;<#Cp^k)evY3D-#-2m%{Bz_^?h}cPWhO({(J#`!qJK%3G>Xj| z{+l`wjRsN;F+G~TpMIFsb*JNYKr8b8Lx-AtFi|N~MhUkVbkyKDJ9+}3FB~J8y%ak= z#*s5{C?Kqkwf%jJ9SUuQRl>q>t%RuRx)5zp*Ti-~i|2=T#<{wK+5%p_ozSM+uu>e@OF0DDO znFE#9)6CAQ+dE%~>HvdZ+paSfq23s%=)P*jCIWLev1{gH&LrYumKgt@v}X;+3Jd#Y zP!h<|Px~kKRAEHd%2Ae$>3A*i#1zK-3(PN${Tg)`zHGW%!pGX{wpk`BIJR480f0B{ zhN}Z9XOLCWXA=3RGNE{TIG*Z@Uu0fz+b!vjT@=VN^!&YUKV)AjG<+~QS(~_@i2V;T z@bLZ|A>@vUQ{(7|&=ssz-e6_uBXmx{D&wtEcP#IzVM{8w%#Q>n5?Ol=km1`U0grpK ztd(mo{dDogC-)rdj@Bye0O8n7W z;s2vp!e@wF*?N?`5DemFgcRq@mpv278fjW~jJmB@ck`muKaB~;OZx877m9aI#kgP( z8@};)1Thf}D-lXqWa&?5cG_;&qif0DhLPsjPLkii=n~7_5@u)7?Px%rm8sje?q-+7 zKZ6O;V)Fw7;RAs)5xDr=qgh2XSAp)Z_sE}hx-{Mw~ zk{ODnn|h*^s9T0gJU3UJ0ZomW6+y|m14zrUe*#7C zdWv+q5JgcU0ce7XF zpTqRtzG&=?GaGOBDlVq^M(h7z)-N+VUL!hl{pL4oBJKK@G6aY-R0OAI>A;4H&)zbk zdmb>?j-v0L!iels;QEphP4LJdv6Sp+8s4k$KFV|*^Vk{R!5X_-0Yuu(t#+o~&J2Ir z>@8>LNez!NT-@w>ySkw!smKYSEOm{Y;XDiRcYsbxW&CrQj(H4_P=~0LgK|)D(eGV~ zt{%nHaSijCbr)giT~nYg7K^+K7*7F%9vq@`Nd429@Y}ZnBSj(ehJb1o*5lojm-lf7 zPBo)6<`Z`wpS<(@LCW;sBLt-f-8qgW{YH^KTR&N;@i6hmW@r3M2A`KQf!)^!;#4#KWdq^-?(2Bw*mpaYkewwe`u9GCL%Mj>(?h!x zDjD*Mgw}zC9?TMfZ~S{;uOd7;weCfqF{tUvgZPJI4$9R85 z&RzdAOrYu|zUnuws+C;T@7b!wp{i#Pm++@x4J#os<=bM|2$rs7@*iF5OtgI>wtYwz zZV1qfQ<(rezml(M^?cvj(!sqU^6Y5$c&_aZswz)KDm!ZyF1*$mf#&!@Iq^5u2Vkc} z!&RgOp#bzC*HkcWh85_NP_QB(Ds5)0xdE` zBI#0`i9=uDL6N`n#crOi zO7`!w(Y}$MmgQD?)=*cE1BsE=X6^}LZx0b)K8ogdNWny-S;h-ROqIl zu%8TuPQupxqyEjGw@(4q3H=mc3~>xuW!>U{75+s9P(|LDFi4l4g>iO5?w2s`y*KoQ zIMj2X^_%*=@veA9c!a2_kV_HO-|!SU+qngz*0<|jN=13|PjKQ@w7(thyIgeoec9t1 z$A7kOOlXAY@Wgxmtp+F`ZKZSQr$bh__L0HTT#V`rcykkodhGR%RZL#Z2;*~1mZ?@? zIwK5LLY~M*Ny)*1- zidk{T_cLI>^-;wz>awlqo7Gph2{z@c;p!L@E$vE}S{^!-q2K#2OWIQ|`pdbEiIuh$ z0Lcu``m*y{1a{1%3Y~w8prlT?LssGDL_&&BMd*oK4&WVIj{K1I!R%Oj@_W$)Wd6%9M}#_md8f`U)VVrZ=hT5Zqavtw->fe; zhEZ_wL7^%e_Y=MEbw5nVN6m>vdfEi1?W;`Jp$u2-7v(op^hDZ#8|1|8u9M=*5{T5( zZ30^rGS!KDK{8d&kRqVcwj8&-*9M3a(s~O`OChL*f zDFZZj8C&6hfyq6@@KkZpCk&4G#m%?$Tf~;CK}Ucuk}a4lHrrx7x$e|$u;}EL3<+_& z=X-8NKsPPrLdCBc|5|23e#vtOq%K}$(UsUU!p?sRS}_2wob5ae2o2!5!u=bRJA%bT zy`YR01b|?x+p{&!e+hB-N`l4C&yEpg8t*y=3FI*%d$#VsenlYxWcR^{`qvpxw>nhD z7WWEmM0~y7zh4GsfRAdB0{FIL5Josm;ogG$#-A zt#u>Q`)b{b*gjS`}; zO}fDEWV#9pRfj*2ov39F9~^&nev-q<9R8#1>L%v!pE3)R2J}cJPb%%P8lS1|NKo7I zCNO}sj?JWb&NuL9x6 z)CD*oqo68#XfXdlcye;4a(vDB;BeQD^znt7z+c3nPq2%70!KYyt^lOdQ9n3T!W?d3 z@>ViN7n3C!*lR09HV;m8g{?vaAiHumpg!`}f;r%P=NM6n35vg%>EFVvyX8xu<9KB; z9goRi{x!snJew3|heN{A#REm~RL|kp73;n^b6MS22`L&>WW^zsv`-}tt7QEu2~yTX z#JI=Se1p3Z6IO``HGG=sQ&Ij`8PPWy+;j1|^SN6{+ow_h%o$afA~=Q$ifuFHPO)ve z=(^bUu=t|b_7K%8w#}AwiEXo_m#*xyHt(D1E_HCguSHL|9fUo zGn^iFkvlDJ`eRp|k6-P|BMX=AR?bU{@I=9yO5i!WK z617=(MfoN9P>z8Qe?pdUjeQ&Lj_Fx#VianA7}MA9M&Z(*6`qNhwc^FI2b)CDx75zD zC>Gh4AGw7j^sL*`p}grrp|*=>+}bn7qRX~qfF0UZK~Dt|0pE_;|g79?|!(BFt)o6(LsR%Q@b|9T7TdoEJhZF>i|DDq{4PO%<3{GFqCs zV+Pw#$z7B}A2F(G^+|D-!Y4t&ly739`t&w=z@-0i64m*l$lu7&Py4iCO3G1U7bWSV zgpvG)j3ilclrWOtFdTK)NPfedn|zB-rzdbWMZZlhe;QMj7|pk~Z~>EM=i9L%Q-WtL zb9f(ByjbMl#vpf}7CCd2q@NN4L!8W%Z*UJTjuwHAA+v^}y2U_mr)f+Tyx&&r9Dl3d zq^GCXrK2FgP*Bcd!RLJE!#^(&*geJ=6bLA*V17>_9lKE^a>Z6RR(xeR8VYyl`a0Ca z!@Ywzw`eQ%O?0jiod0&^`zrKbNgNdb?jlD(z!(FK<}|WIR&be#g3D_7G+qIWJT%VC z$3on&4^E9WJH4@8`M^V>t5Fchk+4bo*$32TlNRgiME$8t`#fDg-alX865DUm^?$tZ z$82h&31o*D-GEMTQ53p5KuOTUHT%V)M$#4N2b|UDZU5`U51dn5k1mfXZWfDtCiBQ! z18rZ2N^Tq`>Y3#oOQ7lb)TN>p4V?akDCzN2NG;<{Vv<=8gRbpksWvfs*5AaKO@ley zhaBknE}O!s7uKO~JwbwhZ1;Oq=ZdIJ7-UF4TXsDm{^Z>nM@xCYCSsncoH1P-a+}A^ zR<=C%{Jv3h-eZd1V9vc7+rCfJ`hJZ|B{xiM%IcMLsjh23Yf{43!j)?~h1G&UyJ|BFYG=5O7bap#qe1mc9U>bPF z>t*~NrsF>uoMk8ez?`h=ezt9W^OnXPwO_JT>PwFd){Ahd^LCQsPCJ2Y*fdp&>(VrO zqjeXyx?B+@0B&8x#azl92R7wFS^DO1zbWU6M|mN^+) zCbDc;0;o|obS4+_AR??|n13Jxq&MzlGAWkI9W1+aH&)5#2y4tMf z1j+-6evg*Fw}%=uzHgQb@q$8sZ8-Huhh_(ykyK z3`0mdLSaCvc_+?*SQ8eo|0OJ1@4Ob~367ltt-R>`@Ip!VO@`0*(xY~zC|B=MfI|2z zMUt~0+(DHX15T%MnQlRMS)h~FZ73D%j3afvL^y;=ky#c{#f)f_lKwS`N)JZO6Eu*$ zP}Mi>OC<_)(Y{CP!lr%r>otPi@ZennGV+Ce5Pv&14iB(XqT;uqL?LzxNwgP<=Fy{y z?&9YJqWWO zdG5R!X?Tm-bJJNuZ|=$T%|Eb-_i%xdB)&x2w22UvZ!?3=%|TBa2nY>9f587-kfjo|7u7wO~69gE0dQop~{uE*AkcgoGSZ0{v5S zQcNpPL+1?PdFUzg;5J3m_vLWrRjq*zG!0tNBn9F{bAi(kFrg6`7oH-;QWx4ew7f$S zY1qR7slR+y|G9G!`HxY%h0R3YAH9&8Wu$a_V>#CCnnF%0)Q_g&gHQ&=d~u_IMHBJv z1$sAx-d7@d2ZtdJsTw<2HNPJ(&ku~EFs~M$i&T(|Ik_xLzBP$5--tAvPrUU`%_rg_ z_;3G*y8e6hoS?NHa2dj3T@Or*(@YV-m<7;`nsabq%5+=iTz?MM=4YU7I!-=JWY-oJ zIjuGCit9gA*MF*>bKMHNenQ6+hzh{PtBbmx10Ye&N8(l>I~IespVRx?aTu}!|E}D8 zBGQ!7TYRy+C$8zOeh=4QEH!_ML&<4zkL!u4djV69N6;tHbBc@VVO+wn!r$MZ28PW1 z$H=*MVj4i!4!zAP)>RmE(9NY~WlOh}+0|us&2(LvJ;CxQWnZMu3o!Kj)y*;UCG)lO zP5Fn^yLFQJug%{zklq`gcu?Zu2S%ym9VWa(mRg?-%)o^w(}cUl-S4iBl4q{uqdE9O-n6f6#Ne7LFu`# zNG2P;H591q<>$Za6&s#cojxfppWP2@bRC8OS+u{0IxfCUaxs6q@#}~^LxoU(j?R23 z(s?OjA0xcJkZ8Ubk)!abzZX(LT3quUs=4#LknpSGzYF|_ymy!eiO#8Is~t^lD=z#Q zFQG$6E1g>Jd*qbiGHL`W$B{Xl%On8H0u(Q~!rVrcr#RRnr>4Ob3y$=op1) zd-DB)<)-%oaKSgxvxd%sb6-X}gacTBD2v{~-(di0PE9Y!l4cbQSUkHbfQA@az(7IQgtvOej>4%Us~fszpqrCQ-df zQ^U3o=D&|I9$@lbN_U{nRr)MYDnoUlvP_%T*PZ zQ^_mZ{Hc?s?Y|dFui# z$M@&9x8%0Aqb>`|fvzck)g+Ho&u{A-*zISFeE*zhmJ61h0GFf(W|C93N{nmXg zFUA~cDf<7ISD!ukujOXn8hcX}_^-;wuaOuQ5fl&w8(R<;bf%9g z{Rn)1ziUa zrDvO0ScHOsrOyV{QO@+XZC6Z5tYD(zqxe%&+k&ZAMLPO#0q<`@!m0|7Isl(p$HSjq z*sg03Ts(544iFim)B3)f3h-vm)a#bq>&niwqrePYD=W*2#n z3i}lM`rsGg+#2}S6a6-nO8B-*n^@+3bT2h$N)?c5j*%!u1?}gxUk%jTD0GdWp(l)2 z?s^Y1!NZyorc*AH_O(T#k;#I#j&KozoUMMtpy0ZxP^oLw* zVZajs7dp3**}8#}mx-pSbRqWPo~9E*T?MKP`!p>&`$FQhc$ft3{4UZb)Wdd`Hq;q%9I1_7?Ssi*BiZl;!Y$o;T;f0LknUqPw#6JbNF8rG&3bqe*sNW6>avfMYf_w3O1m2!r$%RP@pm=>67yAICpH z0IXYSBlLXoXyDcg^8%+zI67aZ!eFS*i5ci7`oL*du;w^ZHoX?3!kI=2zsD$gEoZX$ zPY5YYIYJ;Z!n`E&#pwYwX~##*G$`Yx(lE|#OeNsNIL1Z^D@>3EB5s}-%rr}(j011! zI_>=n14_pKiEtmx*~ScBph6~bzDH!gFV6cZbKW2q%$Q5DeL_YgB=7dDo zaf)%AX8fNsSHIPHPcksO;TKhVzhK<4*N3%Ts*UZw(VP_;-FoQ(dW7O>i}&x0PZ`=F zYRV3#SpKCr{JOj_8=ZM6+ovqw_fueWE2SH(dRcY`L zW?v3hCEy{%Izv@jJOtR5)Rbd8VTJYcEpV@Cw`Tg*{_|g+PhQv?5kZ%|X`8wQ0dwyq2oj(7tICF)^I*Xg&KZ zf|<-J{2lqOvQ*ep=E+ccQ$IKSDP~dolFZ>WwWi?ZF~eD{q~_K3ZCmSeujR5NLE4p9 zq`11~YemoR=pQZ39p9dtdkuyrWm+*de)*-S9xC=@mYqjTyA+N-Chtq85HMbt|4n>$^svA>wPgJcEMmAi(Yv*{uiEFQc>lrp&oLKG zy<<4@qOQ1Ja=6eGy+p1TS(3GutO85nSbK?ysDfTJUDC+qqH3|z1PjfYE8o|@-3|}x zT&cu!V|{-q#hG{SB_a?or8NM=)%g_pU87H(; z5D5MZ?CZi}HsloE(cQ459puy8)yI3DwP>>}Cf1ud+)^;!GG&JS5j~2IBR!eD3-!2D zG^tqLMaKE8kmG>`oM{xDjj{j=j})W-Eyc!u5<2z5*n zX_%!ThO~7`j^z;zX%RByGDp#b@&az)|IqaRrX|HUqIXP6$D^xE&+$h*$N~>{_4;0l ze)CSR|ExZHs%)M!rKpHD@B9?%yeY{tCE5N+!i<10^qhHD6ww4LLa1c4luVT3L@7d@ zbwV%Pm0&jMCLqHM^;2}{Co6?sUH(6G(p_`mMCNebbEfV~QX#F(GUZ;&BgsRvksG}W zV~N=y5UU#{=&F_g0)^#=lF8(}t6s!>nyk;C2@4!~I_EsZwWlbBsObU&U)U@E*LckT zV?5(vyb4iX=5PpVFG2A=sv=Bp176*&)8ez28P2rh>OaZOgZA*1<2lnC(K*hCmLDTH z518Y?dWQc{62+8;9R>rO@qD!F1Evvo0?3Gy2{yFP2oNWOtM+I6&{;~?caPhyrOBKC z+b-=)Jdz48kSPf-LOx!=@2uytUl#@!O3&FaKM+bm8K@XfNu33P8V^s&hMuGlZj-Hm zgiR5?3Vqs;ucMvr*xZGy^0N*s3Eu4>4kv~6B2&)Gc!|_GRY(GeL+=MEBo`rwHI%q21wQJWKQ~=XAiiu{TG>@YUkyiOfpj~TJsN&P(PUDmPfM4dtD=!lS3~<%1*I} z%Na#4AjM&(Hk~9N$Q$%=+?Q#pu9;j8vKSt<=ft1P-X2G% zp1j;C5^axb%oCu|7$ed-!EES$lg(GDuatg6o-jc*-c$9Z$3e`bH z36Q|Iq;J!%9E*dnSeRRR`ML>`eA9u836~_jYe(VqfbwTwhf|Z-47)E?hMRcEFG;^HpPAtj0BE zDFBFtN>}%@8Y17HvaFBQ5b6Gur^0MPc*@fOHX-zgxix4FOnHW9wS3h*E>`ENx_4j< z9r?f(^O7^+K*JTLsduYZ=fBEy^fMo5b%(bMb7l*c)!;fS2Om-f9tQSZ8}?=AJo%=XEp}}7n0&%mJxS%W<5+fVrFjfQ zc8kZ2d|x_RUb%Q&rMX~9Ao?iuv5n1T*?W2xu{$o}jv^AN#;o2!U12qjgrxi(7i$1z z%|1)ABV`ZRTJ_1ExAnsQJ)knxGWjxopL zUEN=yfD>fIJJhMOkbm$5mpL_iKSHo4Ql3%k2lImroa?$--Yd6WW9Ss;7(vtYN%1pE zr_Ps3n5_ZwJN8 zW}xhud{NOVTNx-un{aKNxuF)#K|gT`P<0T`biVwKFeaD{mKWrfS{)f6?5XZp_-5g= z4j^B$t7MN779ANmr0tq|Q0805LBxKf|K)vm0}WPS%Fjx5rN$Ar*R#_831I0I;c*06 z*s~16b2?|S&09x5E$Ey*wR2_w?}FY^{)0F<*8K!3wOAL-@Ay;?9{^o+_`x{mn$uF$ zWbn@I%-1iK`nTz5+F{jUqj5R~RmB4-T{CD^U(dq6S*h?b3?~46v(kjWBZR-{z4<5a z3(QIh%rXRK$pf>bBtOXRZb!&{BVU(WzY2=`w*1TkJ=^YLano^`Yw4*a;;=2#Wy=EK z-CwgPdv$thEg4!d?|Ch7G^tJ89Ke)!m5~FZq`$4NIebuTy~wbkOy?)U;kK6w9eOlu zN_M_0j4}aY5$0D~GZMV5A99D|f& ziqL=4h5nnY?AhiQu8smCS1C3Kvs$1wW-EKLX*TW38W{X&=%6^n>T~ABnSuhU=fLN&L3JD zT@R*20mUD@Qvl}W*YeXc@Y8W!^#R3DRJo`7V}oGM&z>lPU7OSb%tWG9S&uo%+>hX|LUpCI9L^f*WY zhI>MX5_$=c;%H^l5neegmEL_{V%MR=+tkR596^~=qi0iHHpz&m;<=0*LkkiN?5$_T zd&N+ur;Pao)HoBR+hAUd@1fA6VKx~>?iD*f6nJ!_m37;o+4c|N4m>zk6(XdBo&E?`6TAg zMCO&0PjaqI>XYnDljBRJpr{Sr47-b%W8Q#1W8O`MPMR*EN4li%^h!^zP&L-CSs%TC zZT9;Ab>}ulcUNF}_-|p1w_McjYt+A`&0Ilar=PFwVMl}Kb5%fC;P1^FzD%?3bK+{* zl{z5&Cae0xSx8PxW{Wrb``&h(xXr*4q|sV=Z)X47k%bFat=?KFk`yhh_baMLIaN?8 zKx}8safovseXs0M(cv}moHtVQSnix(w%0snLdf}ZyDymEn7Q9jkTaE*G?#+EVx#mQ zNN0;lKJ9+R(}le&!g0E?S4Df$9HUcl7?wIG2!11Kwwbp6ULUN0bbwA3^?0!e+bXjE zQZ`#8$E+FAXQOha8Vbg5eb0N7@nr`q4otL9$_qD$LJe55?T1^;c`&y$5nD%imF7&n z0@N#KA|wuHx{SY|Mc{yo>?T%zmx#~a0)@lZT10mpM*{63*u?&XE;eEiw3!rb=BPj> zrE=ChGB5=C1U1XvrwB@_ za6%0^2AUM@`@Dk1udt_~qbtNl@L%IjHcasPBtdym3&ZRu$eck{v>)IO z2EF=a*+o_pg$Us)E@L0>P#8wy2(^2S#Fs!I>SZ1 zgOP5mpFS|sYiu06kL-@uuZeGnE~G3hq=bK4NJ=6iO0j4uy^`)4YfqK$q=AlpX)GFq zL1fv?!aQ7f^&6ytw?q~3iRv*Pi222Z#ypA9CtcV=7FDlu!Qta)He8axm!O?p6;g<= z9MH73ZfHF?Fei`{Fs=n%#+g$OzuJWgPax+avbRc&ESrZBDzd2|sf?Oax>D&JSZ_w( zzLI!u&>ei8tD%+33=^pLZ#yQCB`X(tJIF@y@45_-vOF2Ef3hd#kW_2u!d+dIEJ$+1VFy zpq>d?@E#DQ$GEo}{WqDFZ~r!^@;;avRAnlstM>HgEP?{}$w~IPZR*KVz`?BEBju)u z3nWEFsPd{bLn)Sf+7-X>~L5kU`UaT3Y-Mk{9%<8`HF!<^^U%U4)e+9wY=phY7%^-(sC@S*bVLi92|ZqpRDY97hH(; zUF|}M`H=jy;+PEiKcoCwvhL<>`Ob%Kl*SujJWcu4#^dc{j(;*{@$4ICX`{kHI11&l*yER;E8atnw)<1xygX#85)Te0ru;t4mrdgGZbn$6iQjg6&{HkmwM zR6{4=uaT}&+R#SZwXyUu`mH`2E~TP_lutp=;*UHr$OLxEgUGejFK9{57D9rxpGO-f zfcnldWff#Sk~Jl(ihLk6Al8IQRK87wk>RsN7#azN=7WSB)FaJ!j5=q&(PjGLKK}?K zE;(JGL7(S)7LsNrH=2S4b(2655>O2xuTt7LPu8>({}(TnEvy-{aM76DrR(1>j^%b- z7zs$lfh(R6*P3oLGDaY$HPA+%#Q6xY9Uo~fECJ℞NMp(rAg%Xta6W^HITsXtOr6 zh5}p(rfvBrVR<{)!3LroJWJ_Q#FiQHmSrl-rWno>`*I3p-!?JNWV|n@Bg1&sY~&Nf zCr&4xX?gZ|OVyE!C`eo`jK2|?NYDuwLvhTM{oMf3X!Lnd1HbXl2 za>{7SvdNaU6Y0jSDPt`y`Ic=``tuLAB?8@yCVp~%-T-*K@)P1m2#xl@ogg~(?zRf& zpktJA*1NXpB0%UKibem!u{@Yw1vwpLJ`~a^A&uzjXd``3-@{3L4=1-Dm$t(adXnDt z%Q*i%M*MAiso`E@KqKZ$M79$AWo#uziy`id$NN1E{qr?fbBz$fU(GXe9v3%XbEAMPz;QU2$6etxWX zjInvX-)QuXHM%_SxfYZJmYJ`PGjjJ5H3er(|Gj$pZv=DV?@H@>r$A9T1t z5+g!5`vA1I1~s^djsllGpuS~ygL8IJ;wU1st{7m`LoeP5#=wpN(!;MIN(&u@#z4+< z-igNc!IOVa0TC*qhr$~1&QlTp3Ze+n@dDh`o%K$-6RqQ+;oi(tzi@&Ca=M0+!%}xa zqWsfH`R7-7wERBf#`Z}0x~rtUla2C25z@!^8|Awq;htOiXTByK_JFZ75arjOonj1l z&WAm(c8oXD*>oZubJb?FT8-?-Mfo2y+|(FuYApAt%=Jm6tYmpv$(pi~g=Ho4xRMIK zWCdUH0#`DhK4tr`rtHzU!c}Eclk+U8WmA(TNE*f(ty7Ks{1t)uiQR4C`Hz*&f1zyt zi(GY8U-fvlI;X$-0po+l{*Tpte_l>sn8aCqF}~ja|VY{ z*bksJvQi>qidIbl?$8!lI}9Gb%(L{v;-Y+N!V~K*Q@2a+S$;p z+|2cYGRe3O(5J`5eV*fh3H3EhHx_;3fwqS&S+v?`Zr@km@(SauH?;J}h~WbA<`4Zd z#S5I=Oc8wC{P;&|AN`cEf+EL;Yqw{8IEQMIoj5Li+4( z#|`hLhLb0FrKIib?$k+F{@C8$((Y-|>>MQzp6zn-RtbASzwy8#ke&yb+3$` zbS_&S{Zg~fbluz55j@-G#|2@QOm*6`M`PH3Y#7)u7ygt>Ctvxgy*}~?^h}SeU(iz1 zV(L4>oH=i-`Np*Hn<;(M#dWLNueD#f2TfjO=mGnv{Py=Dal#L`l3ZeK7$701+ZQ%Y zS-m~>$X{HuMM8{97^{gXn^?Rg#Sjuprlo2Z?rSgFBh=U^e^MzI<8VPuXnNhvg=ol5 z&hxHjUyI@W)vxQ0d@0mH$j9?n;7G z3?nzvx|FcZ`3{(>jiT{dSwYTyzM}}b_am*dhzbEPTxq`JCAK?V^=q)>R*y(e;oQE z5~3sf4$OJI{m1H9LyI9IikQHEqldjHuIwmErTaX?Jm0jh-t*Afzc2i_{>OV1`A>*o z<2hT@L%03!R=Z}acfYNkbF|&__x81~^iNkW zJY64pQZ1BW>v$u-V*_82OAmwHcg48YZ#AeW-vCp>c8uEYw-R#SuAlKStqROq=W1YF z3;v@sRm3+u5NKd7v<#c^ZR+jZ-_`T;{(tt~1iGm*{~x~Do8)#$X#*uKE-23d$_u0PB_xUbQduOk!Q9}o^zV$;_ z>jzl;TxX6_+vB;TIPnqbaB55ZYpL0V54g^_banx7W$!V8ws)@n7VGLA@nxs2-Z!YV zFZ3OAx!h%lz2|_UgZ36bjiJuoy-w2tSwxPR#8(&e=`=ppQf(Gcb~Ra%%X{+5TqKTL~OH_+M7VleF)CFikCLfpXC4Qz*V<2v`yVRG+SFI%OGu*r=x8m-y{ z>&poZm(*8pKPCdKJH%dhiqD;v_{N}D75&5L4(aK4Fl^2_2RW5`s-kckK02i59D^Q} zno~tro_6W~;p*!z>+UK0#|}XU-P(P5gz3IWZLPL`3Xw#eqL7?k2&CDPnT&0a6s_ z6^lG#0b&Ko{$e2^pcC`XgzO){0%zn+=l;AyN(zg$$mmeZC^`(8V;jW|xT`FY%+3;v?Ev=B9Io5KXEld9Y8x%jilKP&w=B16RpXE$Stc6VO} zPYfN`R?Iju;w&-%-*TIW=j&_ghaDOyKE4D+?iF_o{5Qz{e*vzS2wb0v{28czHVS?N zR6mRSU*XCP+9Y?Kz1_n^_#{Se*8r|}`i`ylm?D5~*-Q~OiJ|KhD>3>H4glFOKe`^1 zXNBA`m+?w+&dZSM`~*+eKp({PT$j7vpfz4c5xS=aCS^50bynzabe3aYFpGo1)aNI3 z?cnUyfea2}<+fM$#sb z#V;}XP-0)z!0&@iDftggQFyu{x@f>V-W-LIPdv%+0bH(Xc=1q!oM%-hdhB2BXS_-&E!N; z@vrj4s>ddONt0_&L`NczuKL#{@IF6fk58TMHErE`jouI`UrMO|!J3#)%0xTZO=Mq*Bh=jjV3!Bkfo+cs zoLTHOML|jZiR|g7jJTW;u}=y5rds>bRq*3Xv3}E7&BDI`!(=jAuREgqpH|HaIhbU=m< z)W^?6d6?1Z;T_@MO&QsDmvx}lWp`cHSXRT*$_V6oXzw!3e&pg|G<{yHH;zJ0x=*`K z@8_mbJLtp>gHGtQXVfqz;bUSv%&0vdO1x(V&AsuB2PCUb51QA+UjQAF@Kc}r`ygUCxxPW?-O#^R=9$KyusFeTr{F%1VBX=j=4xtV{D!&{nc%!!;>o2D&pVBp z_75HxaftMbwNAIb?RPldM+8TOPDn>5EfXiL6@c(Pf_{AuD26Qp$iIqfuO}6T;-Wq2 z1sU-K84;WW{AOV(2?nS_3hkkr+ML0VOrn_Y)Gp*2=-QLZ)45QyQJ7#a3&A z%~XE&!8AEg4X}}vo0bCMD2IlzgF%D?s0RO;&wjjxC81`I9bG$T%fkVj<7JziIus-3 zaSqN@gtH1Qf{UsU&W1yrI}e5GR66ycnKPU>QH|L?chOe$pwo1}M>Ve4^t)B2N7Vaf z&|;2R>N;!nxt}R^SFUoG0qZv{OP5WRXl}TATYaCZFf2?%8bK5xZF?_rjjFSZ^zeB|Ph{m`P| z3xm|?15+h_(|nt$*k_u@nda(DWs5xY@0`pcr^)0sE%ca5(!)JWnNOAMSB>lY!rIr{ zI`FM^;9{$vS!!b*xPI|^@8%y1dpE!745tb&qQdr8D25X>2+#tvHNhV)Ft3M3mhV-~ z8GdG-lQD7bXBu)gFg_SWJ<4EN_{!vC=Hgm*ykl=24AfRTnfpA!PFMbehu1e;!I^u(*u6fLMS5QFH}k%y{uzO z0OR>SW|5aEwK2sUGk;sdqW#L=MHhXhMP5^B$x{>2Ypa+?AcCpB7Z5D3xbGe>^SiED zK4y-3w%Dc`=V$KU*I+v(_sZAUZY8tn{6Uk9-} zpgRGnrb_4q#h*x4Hzi*!oWrXgqMnbL_|3lhMeI)Vi6;|m(s|bU^~jGevsaU)(UIvu zT9GcRNZ2ct6Fgz3x#sF1fW*=QtHp&TywCu}4^T)^QFsu6I7WNimHjV{q!(uP2#k={ z{aB^>3-@tG@y9v3kF>^*O{-hxqV0aA#Hpk-`@y;bej3aqCoSoNf&#IoYewEc3)Iq5 zemT_#X&qsoMKD9>43(4(sx-Y|3+ZbSuyV=w5>3O5`DGT8c7td}*2;`H91%DfRqoc8 z{St>pJxKW<&qw)$z$FPF)8sWstDKQHWB#~Td`M3c{|xstGKYZ||A1ynuRcIQhv+?Q+Cwz8EFzh{qp&>2X zp$BAIX%H)OE|p0R9=-u+cgS?6`;L$^)7IlRI8}0b@XRFJ`sod)X#wna^J9<}>rD50 z+|SVIm_oWP6`6mFd`!`g%JcVg_Vz`V?Fu?QC(p$MaZ z>U_pBsyvCX{B=kjWx+#Fbpn_}_&YoPtgOzIcHP}(Vx&^4x}3p_@)c|QdSK2Db9CEc zM)`?r-})Y)by;!XgbH*PkL-KJ0*{#DL_^0tk)X9#p#S-CFEuYUi=45bEU4t%b>w#N z8y*Lp&M79pFUy2ZlE`Ti3hwmGv6<5-qYR|V?1}n}s?577I*OH1Kos;AmpNfQ?2AsP zjL>89-5_X`7qC~>6*A0hrd}>v98wP5oCou#2`K)h6Xt_hX<V}&n3dd5WjYnMJ zNg~`toaaOZ5NAIA(>Ht5UBR?X;PLcS&Qbo8rIohP#1o+${FnUX-?N2a#f}G=wm0JF zG49c^bhsx?Uvy*r_ig?A)wnGk_;Ax+_fOf!l589gF-V7a?QX=l8Q9*Iw!v$ErXuQA zZ;r~F6A9IGbQqM-`EnwB_Gf%K(H`jxr*vk?52H$sjC#@$`|S>SZ2o=CtxcO+-`Z3Y zO;sdJ0(J4n*c*s?GY4l*gfnM^M|zJ_T2%7Qh?0FHka9axzBJ`<>&{KBTQ*5$RN4zS zqH%pti_e5NUY=A;|rj!zYM5 z*@Lm;5kz}tQ8_%AGe*ZUTjIEQJ-SCb)bVoyy_=v%C*1U89_G(biKNSKdZMGac+%N7 zec}e5bg z9$|8pF+IO$GG;UVD{zT>X*tvR=TjrTiZ?Ef8vpk9B4#CXc+}oMH)S>7){vFIs~~y& zuHbzvlg8+T2sv7o=yy#p%_4oBUSRD@NXXckky8$JtctZl0paMAN75NtBxlhxxM zrq^@l>y@HFIh?8xcNPIFB#h%!fb*=83Z!M1ce%Q>6OxpZ%Q&0K9LFbWcPE%;*yROwO zN={Cn9DhpA6^J)BWPWtb`0+L6nvHoIvy`l6&4Z1?gS~@WUQN>FBxT+Sl2aUo`^%r%g6CxPK0ZQ8A%KRK8<61bY_t57|kDU^;S z%Zx4cTl@G3?f9j|J1?%uRXSrr%#;{ zcZ!rjG>FHeo&9T=OHVNW;E1JJ)S{+$(D5Ym9T)afrIKDbcxo{48MIlN@l9N& zD29$)vlyK8gxeHt*T1dp5X^9I?18SV9m2GuTW#WRMmt^^&Dmeowzv{Eif1X(j)INi z1+jZA<2u3~`PkES35Ui$55zdynVu&{Y4%S}hh{4sBe2=?)ABX97TvnbzG0I-gJ}|& zH?kcfa|>(MvA}phQ(syq{x_%PcBLy?-(fmLiO-4c0rfP5cOh_pnDd|a^^89-*xGZ} zf#(GKJM=(vNAjIVI<4C_!6=qaQQ%R4P9Beq9L;t-#k6lM>r&~vA`HVW`P=0D()%)Qn3QwGPU$e_HW7W!cak{;uOW2FxKOLgFtX!0)`w zpD-%>q81ifZshpFoH!Zu^-X;DMIkN)kn`8a=}@%0yK64}Bk$&FyHr~2DtvKe!wL)J zmH5lN{x+1?bN^#riKB++6*tgR!!%A69=w&x{?tP^|F%lHNL1o~8W+E8X!Y|<8@dw%cf(-geqqfEgQQcN z{##p{{&QRDA8Gp6?R{r>d;j;Hs-&;~x>NbQhT8jo(W(5pk9jWst@8t9Co>8e>@K&7 zjQJt9+(#|9fh`Kxks?+7W9H|?>f~r^omhQ1YEGuwWMSI=9_^l}URfV!uvdZaLA{XZ zUvO+-{0R^HL|a|QBd9M_MZFQ`8>-enMYMjX1rO{^WDhYt3Cn$=Ca zjvJL1BZ~GD&3VB7dtP818wtzZ@KlZ$nf_YFlfZgK@4^&e{~sA`hpKOXg!O`|>|zA+ z38cN5q-Gr1uTU$msM04|iMpW_)UEYm1SeXB$S4;jqPUw$hU)gbS5(7^EdN(^^NIe@ zQ_FCob*P~>V7cgzj1_9R_eXd|Yk#wbK9RU$ObYNBBBS~ep~w*fMB$9v%6RRR56lhW z=k{KOf(z7(*KW}?w{b1h7o6KN=!utcc7e+!R?~8yD90-@I7RRHMQ_{fO9lp(_;cTO z=DwpoCR4vDQ$H$G!{U@Zyl)3l^zvZS@- ztYn%-k77;JlL}=?3&n&GI30&Fi=0mJh8S5>Zg){avFYyaza)4~cfr1DtYCFZw9b*I zO?0P>cSfqaTU_e3nY{H=I<&Q{iq51{b|*5d)ABoLmgta{b!=)~xXJrARFG^seTqA# z-`ngBodCR}z1eG;;xQR=5@VT{nE|tSYTnO^WKH<@s&U0x36Hrqx{o% zKc!SR-LiV8ICBw|x}O~6F1-pKSbJ-g_xR<3{i@6dEUVuPx0DaGfRbxW+IOuR4hauwE)f04Y$%ECi30Ci943-cZ6k#rTh)o8c8-|x-T&y!C8Da2- zpbxpjDO- zHaU`)F`WkX4+-e^mLE|MAdkG;HV#MN@ucZG7#DLvvk~4gQoOqQdbxMWGMii_dpMtC zz+i$&=SX94h-f0B?L%LWH!UPzuc07>S{CquTw^yxNQ3dK_!vFoV!i1p0XTLOI4;9G zJ;u-ELh&fOCP>$pg%6iIzj*B)y6g05Ur@!m#OK9b_f|KtOdNscF!EX=3Z*_f?*V?5zjC3V*RQI3r zB6v~0!y|0Md)@VnwJpK=&O~Q!2$w5og>$V|vAIud?nyAeKatB-dUF+C;R0K3XgB!` z>+YTiO#xnEsV{d__pYe!?gU&0cyq&{Q`wsv(XQD$*CSl$$&E4Qj`rtjWDiaLp|ChN zWK}L*o*QAzRrqt2#@tcH+|W0~xGJq~U>uvVl+ruAxiQ|{Fi)=BlN;U)^AUUJZf|zH z9;Bf;MG@dIzPeCV`!yRsrv*paB}!sR1u$jfXYo@ZaE5SGPIp4)oXB#MlygV8w=lGP zC3bWdWLeqd5l4tMBg{u6^Qt1TioXdy6uKr;80L?n%CaI%Z!i}`tl9?t?c%FvKVnsp zXP;Pio&M&6h*R6RIgyCftAvt&F7{l}RSZd|8+%q4=O$L)&YNWCl58pkr;4n&J#NZ@ zJyR53feM3mU$1vgq*F-y1**m=;+8?bk?xi35F*|&@zS>jFNhdSO;Q`=?or!Nr^ABS z*mH$fZ*w|jb|#HkvyAo$6Ka2NZ(V{bz1~5m%;6U%u309peU$gwdUlW*AM1FF>G>cw z$IhVEo)MBvXs+s7Y|dJ2?ot^7#{u2G;b#xMYo2$f3#l+(xt|BYhvcS-^XT^VI~bC@ zGY2$L?1aCL9DqAy!g0L?CgQGCvLs^Ru2#i1DInf{dMqa&ak5nQNLaV$ahqa8ck8p= z&Ch~G%VzK3>{p%ktH_g0eg%S)t(I={1{Ry=3$<+LNeuo=Jn7DV%PRxjRrcQQ?o%u- zbh=OGoIdM4cG5eS@~J3)K2s@6#zd!hr>)tV^SaE?MmPugtdSJW7T>-`*h46Mtyo(4KKvHOcn-CjM| zBew5YH`t2rueAf$_1wu)_VEgy&~Ee6b3~*GC=dmg(@^&M|J?VIXrB!@%3Z% zvM-?(Tpi`#`RRA5p?lI4^`SPo6W1}XZ5z$i3EohAml^}#&QK5S#98OiHt`$0bXSaR zc4FMXL1-678FLC5sP9`K(OO#b=O^c%s9I=xhhaY(y=-wgR8^-j@2U$jMIpw|6vmG? z6?azX=WR-g1Pjw`Nyb}~GAAb$PwZM;Q7)!IN(LcWYqTpT>6s-diF&;lQon^d(5xUV zsnxb=wG#skqa&fKkk(DR9DoO*ons}2evBqwyxJy$Aa9c6UC>~oJfa0X6(jXTj5(rb zD?dt89~(Y^gX^Nlk=ItpsCS85w`qNm0@f~E-6XS(Rv&5kN6g3_L@f%Ckr0-6)P`t! zcc({5NAL({Bjavj`o7R6MqRa1l+BT6eS_Wnx~~)liYa6?lvK_q{l_Q)Nel9c(~)Q2 z!P4@UZMKDKU?Xt@SVx)}cMG#M{A#dH#2HT482V<~n4b5U{$0!^j>%|c=Df$a(-_AN zrfoZu^BPmVjmZ~ph;0tpyP!V5?E|J^due{%9%eyQ^-gBP`=wK=+nG6gncJhjzwfK% zr`GMQ&DqC{pP8|nVfHf{MwI@!;9uiK&OhI^lOpwB%8E$((k0;Cav`*8I?)pAxW&{wMb!wO=w=Q zsp#2>Mb?S7=^Q&96iJL5Wc-B87D=%(jv&9qRQU+1ShlNdegs6iWdyg^Jn?%)X%BIv#Gwe@+MUkc_T39wfC^zb{TsIG{^1 zj!i0$O=4r7k5nhwM(Coc+DKi=DqXa|BHPaD7C^7bu)O?b^$eUr*!2i^ge^I)t8&m(ZcUgdDQ1 zHJr^O6F=xzktpBOy^*(f*+OPmJq~>h#(1p$M)!z-abcBpc!`eZ&mhh}I4Y`ubFT zz8okv_$s}5>fQ(IV|FhBSM=ToD`KKc4i6IY@VR|glM02>zYg+iF~s~s9sGfk*9i=* zsTH@MbV1htfSF4bsgM5PITPjSvK-p?QICu9rc>VDDDN>#W5@gbZsvTL?~5qkryazdge1ww3_WG*;VU-v+8six^>4P4 zwddSq2ptl%rUX0zL!X*r7Nar9D{Lztu0{pnoG4hK4G{sLhk70fPZ3&=r;x% zd4sCKvyc$V%|U`zAxr^sC3Q(nUazTvre~5Rd-J^o8RfbKkZ=5deqrU5Yz6 z3FC=QVUu0%L*!(SB+dj|^V@K}37ab4aJ~AZ-~#LtlNGd+*}DJAFd=pV%N(jgx2Quz zFLz+z3!%ONXBFp>Nyy1@7!(bWM_L+pP*7=5gOG z2K1oPqn#)8kO_-2b3ltoAOjDIoHIuAazJyUxcKKBM}HFVK?`j0&pGW;Xkc3e@W4Ip z2y)X^(n30{i*cVFz4g5-fouQ_(A2s3P)|Iqix0DRJ*M5y9{xz9+t<<|+&Wg&{O9ps zlA`%>#4kozblS6iZaU;-7WDW-(*qkn9mTW-s`Vn|jsn#R@?-}>*?6-2Y;m&jqn!37 zcy%9R+I5b&Sf~^o5;Eu8YND6}%nm`aFtyDVxym+&Vj~}8=Lohs23eH=ccT>x)H7)Z z!*_M++?&{qR6==n{%M$huyn{owS~o2tcZ2L9Od{luxZ=`A#CDP@C3eFk%tKDNCZOZBBQGrI3nNYSUVR;=qTO%Rhjc2Gv3Wtg^Y!2^o4`| z#Ea_+85C15Um$VHKj7rMZSsWLRkhh~5Lue8$kx|4S)a|(-yWgYPc-L2;(8)hudY>@ zr9xw=Xqte+A=+4q%bvuVLC~c58j|umm|BlcP3h)RI<-JI4;x;wT8Mh+)S?<5=QU9? z+I9$ZbI7)oIY*c;PFy#LlN`E{jX%h#2yvCJb@VW80bLNOt8NY!e&Y@B%(iFV+Sw|A!(fCTBc3s>)?4S%$)COTg#@c zv89=vX;t3kTYbx)?K#WzpJAG94cvy}+x^^f^Y@u;z09T4OvWju`Xp0#f^mG#IG0!1 zmak!#uVoTqGncPR7GiDq-soFi<6T~h5zH-ry$Kp#p&*o;lF94ppI#r|NEm^6PyUUK zU(+ef`GRqFLF@q`9pX+TShI0E-h*Ql3*}$QLJ788c=BU-6t6E4W|$1IOyF8wckyOV z!K#yiUp9!}&-ws+Wgk<|<~$OG9E%ekD-CHFmAM3189x`8jJV)kH^x8aVn60$r%-)f z>P(CHIoA(FV*^}2t@f&}7pi@T$XC~SR&G<|Wqiq0#Kdta6C9c#Ue+#j{Ef-p&!yfK zSS}zElalU;`6=`qAA09dC>bx+U2M&X$f58*Y#u0(i*S~+T;(?*%dKjItBC5bNGg9 z+j@`N0J9W+cV%5hoX`D?S5DRW7!CL)#a%1xpzz9Su)vjQ)>c+lIo*1%yR7z_Zv2>9 zXP=N-WlAhJCDcr&@JmbZwYwtX5|0rDLav2lgIgIh*2W~VOoHiK=C#|3olFAj)@SmC zwia0Rw_DBQA)VOTVs)C5Xl1V$IE|2wfj-Niga(_OVL!Z{M$Eqh`a;=!S8pmU4?Yn z`+pf-`yZlXf?@snqYw-|5_+MjA6f>meR!1C@}vk(S+_-0(Xlqy}FBo16B5J43>8zM!tymj-YWlt*CSnFNj z#l*OKevcra-inkBYCfw=MD>ALV0bzFOwT27RE=^oV0Qb7b^`N+PTknrDZ})nm?+F| zHbmTIvDu$!5WtWkMs_pw2{sF8X~w^pIbpHxeuj?hq`@&wmlgomv$v;WiGktM*72KY z8JiFge!zTcmtzr7zU;Wn$R3I2QZ%jiNWS}bbf;j=lu#tltO0d`OSuDT!@m2&WTI0Q zVvvPKuF%63{+=tm=r7Fm7k=a~eAHKH@D;jzh0A?~-}no^1*=wJj<3+|D_r3#yx@q6 zZMzaAUJ^_(@m;l8Wwnc~17h`HXd5b_R4BKvh)O#V{}=sml7dp0TIYOn-{I#zS2N6FX;J0PLa_3RkMCB8cxrhEo; zT=qY`_fKp6o4r8g`$7h_o!$x0_`U!u!4H~VNXde<=AA9ze}(+7=%AF!ew~HVeG6N# zoLp-atl)ot&;LFOc-5S|Qd{Ksh)qJ^0~Z zvMO!>-qQ{Ys^90^S{gZ-$xF94jF7gro9r&_;(n6KJZoVVlZgFjp(;_F63Tik}Oye`fdQGGEwmD6su8I5NRo`U_Yf>QfORfTAS<~ps zxmE~@3b`hARVf=>NmI95W=&Gcl%dE7d0CpX;UdQ-EhNxE!@V$ewV34bCfsy zrqR=S2C3Z-OZ$3~Y$Kt#HDlSPM@H4UgQ38t@ph>eO)f>i33hoU$6bV<7DXhFjouP*XugfAAp008Obr~PWoiskt2sg+m%iI ztsGJ4(;n>ic1OFiWg7&2YjzHL(2lq88$0dPV4&@2c=dHM1}^n8*TPwW7EJv9@cVE9 zS@KpGEh?`oDz=*q750auP3|Uz9-4!s11+jR$xA;U0by;l@>CeA5J;w+Z(|}@ zCR&rl)>9Z1EtU=PlE*J|kTG%+4TDW?o88=?VB?KE1_=2g8Qu|w)@Op;wDk#uuWk<0 z?y`3(HCc!D37VB;E{HshgIp5`vk*p!!RU3qf`PZEMZ(RefXFm%7kVH{hIp6-MAAS} zx!!795ST~K*Ce*rM6{@-A+`CA2K(k+);h*^uNawduTYn_wr}GdiJsH13wiI8OuTxX)GLDtmYniaaS~1!8|Mx;w8qX8;r9bbQ$~RauGE zJl|e8%lH>T_k4TtXM*BS>@b=b&= z%DrjhI}|7O{XzYLY;Q)_D?L0y#@joxh=|>@EMCDNVD5hhC)W;fy%3}d;D)T+!4^Dw zURbtsz3&UTH_Yjs{hUQ|O?W<|Whc1hh-As5LUz39pc7E?Y z!aY;PQ&L+y7IXIqophevkyCwxbj?Yj2SB3pWRI5F1md!3RyIv*ec28LYuycYw!prz zhu=#a_%%0SgK;_w-li265l7$0CNqz?No^G#mB_0SpU;8iEdhY|Bg`R=+V{S7znx1Z zO00&;82RXe-zuX$SjOI=GWIzO_CtyE@G{Ql(4$dACwkm30A+5}_4k28aH$he^iT<2 zI?qYpN5@d34OD|ewgO`R&9J%4&1}Z`-b=T1pVE3~wp0B?Hp^^52WU)VMbliD}C zp0LqdtaZ@q{H8@jLn-YoysF+IRZ0X$8u{q8VgevlS&h|YQIRnudf|^4P5dZouUWy< z83`VgoP-)-M`tEPwJS45#BygsxT6Eu_q}I?=Q;1OAAGYYqQ!X@(d*pTi5H<~mI&b> z0y^XGtkcIqF#y?3p+SWF3i)4Ay?MVGYpgefg z0l5W}f8d+oJJG?jnrGV}P##d4NZzUM{wi<&Ude~kDw~|lFIK3CSQkJ#xztyG5#K~* z0Cg1Va_}$E;e_sEE``N164IXYBL6KPl5YI;nm4R%!2cQ1DAYaAJG;%zQ!JW9p0p3i z!f@o8O~JW5pSc<$tk!w9LXK66eW|)F$y>s92sCZjBU9ahE%G2V4#6kY9oRUWILrwI z?V`phd9aW^!Cvc1dA(Q8#U$cX(&`fT?T=VpudUt2$~j75Fq_+C4~?wd&dS?{zGPsU zu~%XIT?qFT%xo8>oN>-t!oikfWaIuIw=dxBCSX1(bb@C=@>`rn(X`U@4q4@$p`~nm zPFafzGC!xG2b*6klug1Zv{ykwx_hmzUe)OqKG2Tt%kVKkP877VQ%Hw<=~6lja*5tv zfp3<`Ka29u68L8cZFH&etlZVmYC9$13MBplv9mx5Q}zCN$^N{1!T$w3vi419ytcLw zW}l@Hb8+j*`qafkmI!WED|Gm65^|^I{?l^b@pA9cC7z=d&g1tVW=;t_$ESIZo4BJ( z_o}$#53&h&_>V6}^lL)r@!PQWd5*939{+>y_&WCZQ(SnV?f8=orVT_NPW9oH-s6>? zqs5Z>`DhGLHc#bdh9)H4j{BHJm@dlXtnBqVFH1g~Z(V2dPT0~uw zaHUN5q+qYgd-Q_m=r@NmPUXPDCDzkpucz+c%Xp7%VH57ok?Y!iV16Vdm3Cp>4zrF`KVJo*N3VT}`H$<_0?I3;x}LtYIcng# z)<3t{Cwe#b+wQ-v@B3ywgk*6f_vOCpohD?JTe@zeKlRPn;uTZ$eGmepvuz@)UsOjw zF>r0Yb@Tex1M9obuJ`52II!Zm?o2amsgWPduB# zVGJr?=L&W-32ll}J0IkczxPco*bcn~?}0DA>pC~0_*W6S)_F%1cb{Ys=e&@^UZmXY zRBrjY*V`-ihHkUFbGo;$cg}dT9_tXpmeS~Ze+gB4XYi;up&*^8* zi)kHMSjI3J65Yt(kEcg-{7O(AN=ACSID5Zy#*!wnUm(bCVHHcBziWlAa3v5S;fqXWST!YvB?wp{OQQ- zZRLeC&t^7>vs=mwTj6X52SH0ic0+Liu6b!;%{ijK3T=0$#?>yw#3ZUnVFm@s$s58} zhUrXLIul`Cl9-eq`E|-QDIJFy=e=j!c`3m}W^eD5wuS3}+URDs)JwVL<9TeQg)L}y zV-Y-vDUN9qx|8(bw%B&&_dHgA}1d{%agx?$X&EiyXXU-+IBw2)D3;d=~@ z-8yn15xkDjk?V*$ACoM#$;CPy)74O&$zND&;ZI9I-3zuPO2;NqTA$WCD%~Ganr&f2 z4xskJ%WB&wrA@tIBq=>{yn+|S%{QnyX>2_Y$`z_wzQCZZ^aviiVQO* zIoX-Q?_GJ)e+<%52hR<%sf0~ysCZ&|0_7Za4p9s|B*L~#DFS;IWul5fx^muW|pE; zMn`kB0PSm+(Q2ELVwHm04Ngr$*9%@vV%JnU20A1>npl5o#G%m&pC%DnY%jV>CdlY9 zuG236@f+%$QuPy3S_*~xUuS;)Fj zFN3at?cZC37BUI2gh4T`{`K{SS2k@aWmEX>kXc~t7uG70o5%$StoCf?otm?_)}qzY za{<1jmEU4LXJsN&%-C8BG_-aiQt@i0rj8*zt}FnQEWK7^KkQ|hA^;M#Nd z1Yymjz&%rFAP@CPc_5AgW(lz7!#R6*!hrK92$5>ckcqpf=KBqXhs5m#IJh!+!S7FSZW6YJ?a+S8+xi)&i^^LWq%4X-x z1*qKUeO+I7IcGjoADTkc6BHNh=nPHi!m?dF^S#c{;(Y4sEyV>-TSC9K_(Pud=RXDc zU=+2{uD_OJz!9T9$6r_gkqPUy9Dlyjmap*T;{>#T9<90Po4KIoQvzLu^f<8{(;11K8Gt(>291&L=pIjVdo#W}ue3&lT2<9w*aI8+*ndz|RjMC9Du#Duuu0>lE z;4D8W_d*v={(|$0b^qpOm%?u&w;=0 zD+-#R%rUb#)?<9*yux3s#ZKp${nkkZkQ~n}d%lAH()bs7W}YKifo3AA$LPGKz)FvO z!FJEKlM2sl7oyr`ZO>O^gzFI3lh=~0$XqfWas9#;zpMo7Z zc^9X1%a`|Pb#07p{N@cUOuVjIr}HmM_AR^hQi85OQO7O+y?6PFwq#vTlFmI&XG@vb zAo4DY-f+Ecyl(v3ua^0jr5s+!EgR!b)wQMR{3+?alnJ_&RNFFbb&AfLGSa&^g0leo*|nSp z)>cS&erM3!LMT~ya!2A)%OS#rXop*(%s9TfH8CrZO}DuYE^o18A5Dye)% zg6c#3R6n`8CX1p<*c$`uRVB$cR)$Ac-l{!F>IWRpG-YhjWBLbkcRqOcS^cwHi(cNU zequm<>T+3@wrsxEu`O=1#hw*mpC4h^#TJ#bw4$}byk|F5e;7C?|0;AI5g0gDy$Bq? z0&9h~XcxFA_qFWVC(tw)b~#&H%zO3;ZHEO#I;UM{Zshp)EGPZ`<}7__PFJGRqRFG8 z492$y4Lnc>@>FHIYO2C9y*>5w8mJc8;(^Ne+P}Ljf)}#TsE9R!$}DZ%fR@RD*)v?@ zXtJhV!@B-zJ*9b;7P@W|9K14UHkZ92r9uo>JC#(qLmOYM*Vp0PdG%zhc5yZ3bm+Bp zv$J|2&n7ZueNY0D}Tfm9oERoXmlZ30=9il(X7UD4mYD;-u-2>IvLT#DE^p^B1l zGeTg`2yRzBC0-#qCLAv)%_v~hpM>ALO9IL!BI~ahO1`8Xyj3!t6CT_Py$&=KZl?(k zyY)I3B{Y=T>tKDv@OX7|Pi4^+XsbU(;k!cus3A1j?KG*h+B$8Lc7?GVD=jo%b;?gT}BtwLEkM%4)-G)VCg&~?<>1(LgVN9duBi0($S@{u*!A&2%! z%8%Z#H=0ok>V1c+#ntLzTRA5!+LIm8`hu%u!Pt5?sBDLB7uKw$$U$y;mary?vR*dS zHd8SMs>%_VVU>m}xXuwTJ&Nj#{2hp*+A?@7Jx) zMY(&;KH;=`De^s^(jB}(-Kx^-v;_QA$=@i$`&y@6aM-=n1DgY#?$+-NUH_yGL2ggLZ4r*JsvMcDu1Ch!zYnPv@UNcGFxLfKwdSlsxUsc;HNMod1_n|RS$UuJ? zR|EL|kaUWN8G%cIzAv?|&)6MdCq4{Y`=0W^nrzvLed3lzuIt9N>h5e81@ln<)_(6G zFiG4^HMjBL#9b6V_YshAxCDAv+xiK+0>C77SazxnbvQIshc?j1NgbAQr~}kw@&Lu> zZc6_N%coZpXzoh_D0i*N9(!nCtnQ;5mbTj*6wD^+FmHKK!g88On~JaGwt5E!&{R49 z6&UKMGQq;2htd^SS&>v&qmvO_7K+ASVz-Y#F zgRTfnH=8M@_7r9uTxykrtdH{?Mfxi{q?Ot$9insf6ji9|5S6{FHR!ZOhRZrr=vEtL ze}^q+VhY@i9G%>=PxYAq7(5LQ-cXUUen1h&2=H(=Pf zXXL`^_fCv#d_TPKZgdeA;sh6#E7S=uya)fKoJwlGK3H=s;C#)|;F5QO^DyxR>UWB= zD~7Y`qFh&z_KMM@LIpD!6}Xcr%t5uG%;KWvJ1_^yAW$1f`*N$B9f;cj*-VweaOKYmH7>AOP?o` zrM|60h)raNsG-hg8kJa0pn?h1xL?^`w{ZWxcZflv-S>h04p*fM7bG1W= zbrT1TUhS!V+y-xbiloeBMmM6+e!kE~QYgk$hp@8pGS)9M89pQr7+70n3SYXGq-fj| z^TefvYwn#K*|;Zs?c)JhjvIpIxM8paY_Zqx_KjX;H`9{Ja_z$PT4=eRU!G4D6;)mJ zeM9I@l7+dtJW7)YEkS|!JA|KSN;tb&2ZbVb=;jJqgg~YSN6qF*vv2>a77h#K!SCK!csHd0`RZCYcZc|ldsxZHfL zb-oKsR15P8D{ABz@D&M_PUC1>B+Uxtd}PhChpbN!XcIevYqS_5Yb#cHqISnKdUww1 zEgIiQD)XZoscTS!zLQl@y9AkV3^pj)JzY_|sdyx1=B*GetSHl7skOn9=CX3Ul^6%t z`L#)UUf(CdLP)=W{XD3qGj=ALUv89FU(xE@a|}&6MV(be-Br9UC!@?~6#I-4pHT`! zEM{K%&|?(#{5=|?W!)_i9-{~sNBYjk(S_Y#MxZ+8k05VGWYW9;7U2;>JCuqu(uR|d zceiMXtzKiO`7Z)gnST$1r_&gLcL-vE1BNq(<3=lXhSR8`e}^}s64^D;X^fm1>NSRt z%Pu2s%rTlgM#_@UTavPytL(7e$D8i+8x;dM$Qof6AlOEtZHHGy%D0iV4^-CYl%34! z|9iBdsmjm_qkNv+5uV&gGeihlw0&12pcW3&<9!VgMeSA2T&l=b1^#nVaIOGN;&O$R zO^;(`AhpjGnHvRtdm_rtKORiptL5z9BGmkMfm0L;sRmnah+jmbwS=i9SMJRf!@v?) zMRLPqmEhAc4@My1zL0@|iMCvYH&=o>z?-vw$H!M9vNu-><#X^v=lFAJdLyDhmeZLV z3Lr!ZEcveXDsQd~Le2p`c`(V-gzbYC+WV^PCxhby@|}b&D3?c2(f9n)GXxsC7V(Rk zs)|~x416|$);M#8hW08nns2>`%cV9Ra@AL%SK4x=eDh^P<8&pg zZAMDUF)Krkg_M;|Wb-Jf^uge^Oz)5)^J1f-$Wm2gttukpOG%~<>{XgCKfigBQz(zs zR4mJ+V|NHsN_5d7o;=DjT|ZQ+?(T@2#lmc+7X5s;>b1yQ37WrW^8`9AkV^E+RMKCi zlD%d-%#S+$?1h^1F1aNpb8Tom!Y&wp3gG>QzX!+bP`Y2bL+O9%KlD8mKIHz=f9U&v z>(V1`kIXbu{MtE`=0D{<7wqrhgDM ztcZ}wnL-@IP(a}2^KsZh%8(88&is@SsXIgMj=yDvFi_3uAEY1?Y^MLQszRLyce=H~ z`qBKjKsLkcwmW|OP?gj-t2A|B^~=Ak6lv9O)CXn%{bO0+XoV<*RKd5I67&A#q}+ym zRNJP%D}x6N+Au5(SQ>wJ=F=R|(K2F*jXv|e`j#L0@1qa=z`O3jfAg;At-$x^Zw2CsiiEuX>;W0? z?kNiA-P={8c(-dM!@DLng?GQo%;epz=5;U_K%z*S}qxXSK;8y0kxl|i^y2KwQje+u-|kw*jL z&iU;%zMr2Oyvn;34+Pxbj}7?Sj|ci!;tGt1H|>FOc>l^+K7NL6Jn#P77#LsnT~qmQ z$vZi`J9?ghch3aJKKNUE$aH@9J*@^;!C8z9igWvKXJS2vIzepc&1+4-23=9U~)Ad#W zKJVQUaF0D2h*xF}<;#D>q2=Ai$SmHi|JM}WJ-$9L-!dKx%u5BQ=KW7mQr?wz2kOgx z8>s)@AbkHC9w`6c!TJx?OKc958>SWT=_7;nzx3BYKF*f{@VGw+pEp2(BI^;S4XhL8 z#z6f}h;n&JKg;~A71h872bU!2;XC41ND*(mERZ0Kg1AlWkL5J z_XOayDcB#j?l?Xl<1QobrY20}-Cicp&qwYGl=uEKfqoMQ+Z9q4Xy+(vz<=Ynm-%#i z-iqMe&sPQV8@D8#|CX-|lso%Rf${p)OM&!iz-{PnUO7c=%nw`nt0x40!=KL3l^e-p z2|oF7hn^6;4?UeU;sqZI+~BhS0WLjk0toz!yS4;@ILf(x)3k; zSl|Yq`%q3zep1!1o)GvAe>xMZYRF>=KKXEmo)EkbJ)H@N7kn&mgHIV>PT0yC!0u-c zU{*8y=?q<2Lmo@;$%i}igy4PX0nBQK9>A<7_{^*Lf2n^^&ae80^w;pdA@7~&1M*mc zPd?nCCj{?9&rshGcX965^L*6^l2jsB?pM1DOPYB+Jo}s=W?(qKM%lSp$ zkiHt;H{`t&eLx;d@X3ce^n~Dj=o#u8;tuPdiC9mlt%ma3;65=njG6*BJh^O4)SCk8 z{`+pH65vLEpgd)U``+cj&S&9n78&9!aHHrbFxd$x)siJ5D_rHwF`2>qmi(Xg?msrl z`i=wm_xW+xqZE1v2WheNj?ziDG^O(a2d*0@)KC{TZ>2??WVnvFv-N2+-AN0gJ zt5zwaZZ)Z~$ttp}L ztWG#<#*7(Va2iH8j7D>FdmzVN)>Xb5fLT`1IsgNfYYjoivaLhV!mnW%vkI-F(6%l6 z7*ux5J`M|Q#~ESWv7D2vJ2B@J>&|rN4CHxHTl9HxA`9p@zqd0z4$ z&r1PR!B{X33xm^x#n8#Jvr3?qrLvYl_Me38zXr1Z<&gcafb2g7*?%2m|MiglH$e8^ z$U6FOVjcajVIBQ9L-y}OuB$X;|E;W}|2Edqe>>~wzXP)WPRRbdAp7rz?7s)H|6a)c z74q`GdOgB*$Xt(dFS#D^y2R^IZtnQ;ydL4Qq;|t=*P(0Ip=;Nn|I+J_{BEFBxW`g8 z*X5|CxN&g4Y_g?p$BpCSKW|mx&t#E!d2%XlvhlL*td0B>kHb%-JV`OAU7>ZGwc#Dw zNvE`#xFz@7nbPvw!N&~@Y4?R~nZI7Dopgt``T_0J&zS97O#Sy}{(*6}Bah#In|AQY z|BP2U{zRWX?uEy-m8JSPlMPzy1+D!nZRQ*GuKx_>{d`{+;W=e2He<-E)o7Z8^|rTt!hQ05yCYxg{tCG%td zqGQirsh|J;O8xv>s`T?8*{gNFs{1G&)ZS97`?zaRyJ1lGF<7hn_&D<1b9|gUBznzy zIA+#EiS9R9udPNVnTMLA+FDm1$NFMzN0oL%o%TRlJJ_vVYI0GtPtR-LG4-kX_-k&| z)>doxuht&es2w!xQqX#1)u1>+$# zT*vKdM!X&-#?9_*fSK2R@|{MhkE?2eetoH01Eb57YG(c5jVT|tXKlSb4WD1R=z~^x zaNFBoY~%L!mmAulUp3%&!0L)G-P{RNzMJUc_H2JzH~ixt0?8h@ID*$6HfF15H^b>a z-cr&BzrOMAHCy4j-~BBA6&U~9FFv<}s&7A?fgHPyd!XBgABe(v&0KE)o^zBs07E#1 z3h$%huc)pI7vRi<;186eavSYx z-ShLa<(!|~{)IX4TP-a`3Fv1}f1;B0N4tJgML!c$ODO6|V-0*PlykqlZym}s$otBn z;wE|D7xg-`y&mElLIxZ7xQA4t5k8TnzT3okT&Xn_qgmXv$%lS0kx0Y1Dp##$dxpNW zDYTp06QT4T&i%mJy=MCWY_#yYiH+8f@sM#CZd<8}kHR{qZ{;zFSFlvo0p^=xgrMXb zO1>%c4JF@D@(m^5Q1T5W-%#=mCErl;O_^^f`G%5jDEWqxZ`PS_DEWqxZz%cJ_3ADt z`G%5jT|d!l>YJhD+tjy0$v2dIn|g*a-%#=mCEs_Md_&2%h~3i*bTZz%beI`R!A-%#?+I`XaVHhF=P7btmwk{1zq zfsz*}c`?SJTrJ&(s(fk-zjOLe?h)nlnH_KR1ajl0lNrCDKk>lE1_ACh={coII9gTrf%ehQY1 zv+PkI_K^9F>n{(@BIC* zsb9DMhu4AYAd!9b*8%t2@CoeqYOdGS^YwXNJ%9Cl?)P#pKL3)R@%nX2U<2>Zgt2~R zrmhE%&W^J_AOESEPBiyRJXwYxG=scZKbl85K2#h3V;9?MyDsD~l@HQV2R@4ac9Z(Hfeey`Zi*#552FShge`#yVN{c!Hj*K_M-=sG}m0k)e^2kq(H8g*7P^8O5N3qM=TRMlI98u zu{fD{Dk|O4%63*(R904&R93dLq_l+8q@tok=erl$uf4D9`{VoXBky?+>peX0>3I+9 z(2Ob5(hZ{jRY@Gb*j*xKmy}L&i63OI>(F}6Mx0k&Ls=;b7n7Env!llf&$_h%!4I_xK|r&DfbynN%Iyv7cMF=D6zzFPfF5rv|2?ntE7_@dW^}IQQ{~W zmSHoNMI;#<45%`6$_ z-D2vYL{@xesCaKwlT)gK`6=5r&(cHbW014~mU$!IjC!`IspG{u%O@dGiGxlIyrzdT z*4!g(>^m0O8ue^_eaDM6eS0XwEIq=8ZLvD`gg-f;_jAFH7hevo|Db7UooVRxvh{t# z`Vhy~dPUpbpk*7M>TP?l!uv#7&<)Qa$J+Z#hONNN5gFJ{amFO|FkAJqbp-+ey&3W@ z7irU*p=n2w6n>bjH%FVv+NRjuOOnKXsmKv7?0z{(5}rtsJ(w=cR7i(L!n7A8Nd|T= z)IXgh`#w&ROziWa1-IQ-B?^>h8RQgcwKOD&!nJm;*>++!CW-U8B#DLgMM)Bc*@d5A z#(CQm7r_Q@l+I`IqWKfNNsxogvtJN3&=d&liQOpa zq*zJm4?RhYCk#@K-AJak-XiCa76Bu=HBeI!5_Og76+;2++uKZT3yF0)w;RN{+aMX3 zi3Bbp?UfQ}vld_P!pp^_cG9fhfOK8GB+#p!Qd=bQaq@%MHib5{dk8{}h>uzpSs``` zP=LJ<$mL8aBh4SE)Qc6$V8k@EDR+++e`SL~s-WqCItil2E)y||hcw*Cv5vxSC1A=? zSDWIc0Y<(?DSEYVd2j;4b#7}jIjNFAsA-x`tmM@TUDj^dM>+RV&cF)9_4jI1Vk`vd zY{I)~PMdO5yMd7B_v75(X0pq9WHcbQ1pL$zb(8r=6zNCpCi6Rps5I^O5Y$UEMjpf+ zm)B-0O+QOJ2m%GpVbUIfHxPxS4kC^nQQkc-GDrfO1AziEDj?tZv3NDnvIYtK+NR78 z1a?w!eh<=9ykficY+%W`!0Um4^G03vE)w#P&|pk42LdgaCaf6}No8ars<;LhWs4Ni zneBZ=)*(S5Zpu7Zz8d2x#J`*-Xk6x!@`!3_z^sJkjcBmXQ3ug97ck4ToCq^&_G>FvRkNAW+3Zg`rpx`S}v zBuN@!eS~#k?hK&HNYB|qfBzI6fM3kEDp?aQGQ6Ki;i*7i8g>=Nf*bCG`a?-#CGCvO z$Vi$m(utZTCCM5p`=*k_{28TszOm1 zyt}@kQBvEKp+>zkwS0@31J`7tVxHoOe@$RN*E_AlO>T7>?TY-W;@AByG!Db=Si#{YB&nJ9a72KZAcameE;st-&78x zC9wO3B$Iag&%0^ubMztKWyyLclU9^iu^Xim7#t(XVvi@(+vUQPH z(_6`Mii!QkAe2CIo4IVBINK~MhxsJ4uu1}9w(b?!zUz|Z$PJ`4Dp{JZrhg_ROXIj? zNf|>8am{gMva~aG`bgFOT$02SE^!Y188RUk3cwHLPzBqe5%$79Xoe$j98N(8bb&IL z{ssxDmNE2m5sv-9SONm0PW^h|a8;XPI~zE}^mCXiZstqGkR!NHVW-Q)5x8(&APuct zPlzVij=oHv?h@i!XSl>!Ok})v!hW(YETU6-=)bd2NnT85oiaD|Y<3{d(Kge=lW)el zpWw~VwE}5#ljUaf0GV!%ls(HBTn`(XNeL0pieFdiitNe8*VdIl9Z)5PW|kE#W9chK zD*4t8Qup!(alW!a4)5C_h1a7Ei0;QMgL0?>xq-3w2&t9C1(<_`39=sV251C^`oO@l zqkFJ6!G36NQxc4C$YHEUpaoi?9Xgr##D<8!2E^88dQfRc+F#pDeQrQ8gB=1#1Az!k zCm2O(Gp!#RgEbD$1v$kwq%UUR?SWkIK_U2|49cMj>Y)J|+mtAx2PSl`Ly4|Cx*`y8Nkp6C z`-`Ru31rcg+!TF6$5FIB_yZFHQ@&vIezAwxO|T!D;V`s7E3`u=$TSEl2@0GJ1gzNY z5CMU&X!>)@&N;EiKpZ5rDY5OHVzj;?i8#^v_D+3M8L*__Oa+RX7|=V-gsu#n9>@hB z6f*3LO;Uu_4`omeRZtHN&D+#YHlul=w$8@<5% zJd0GY)-#zl<9!%dnMw<0J1X%e#+BbCu^y3FFKTRVvN-XJfjCG27kI!AWl#=PP)`?T zt5FJNuoha{%r#1pi~Mdz!MUM5~2#$c^%Br;$4$aPLogk7`HcUV#-&`rd@i3I4s#2RgXkHGv-7gkKXImkIg=)2{Cy zy2vS#h{p<}#BV1(UkDo!u+9i00dT2vudMF&axr8EhX zLkn!5TOm=KSV+X8yA~tQY6IH7vS*-Iz|mMOdH<@G*r%%{ZCAAvK3gqiJFCTsUm`fM z@1x+Z;PsM1gA6_&IFsJsl7fl!4m+I(zeG$2o922%+P%yrwwtL=qk)<>NGXUjNH#Z) zlJf@x0UO~G8EEo2OR@SO@$XH%r|P;_ZE>T0B8wXoMa6X=p~;yVcSTO*mV@Nz&7!uN5b&VF@Fl7Lf=E zDhyo7Jamgoyj=HyBe%`8-BU=XTtl|GzFS@F>`+h?CbP}7Da|5}zE>^3(4Y6yJcrqu zWjGI+23dQ_2C;unhlS?e8ziI81}P_sAFSV2OXM+?7)_Q`OQ!)JFR9A-xXoPL|fw)lxcm1Dke{o%lCE5&kWD2O;k6pUD19wbzA;>6Q^N+jMw$rgV;J~`QGxpLNsvU| zRDpU#cTk7`3zBvU(U^hy2}37@7{rH}hACzg^cgDp`U=@QvqD^EF~kxsJ$gEuM+!B% zMs{CSBfhI^q$RONs<5|$Kb}J2cWNx=xEd)08`m2k?>gMq)QG~l%%g?vQeu!JD-9ge zBug&Xp#T_pivF*27CniRn0-vtHVKwq5M+oo>_Jmj5-!nikUH$Gah2j3RVl5|jyrHH z5O8m0MTtttTPcLf@C zIZ&hZm@8;w$MQB)ReV>Qscg8kuV^zrmDDaxPWpk>AQ2pO?)iuT_c4R<&<61y-N3Y7 zBWtHp+?#47YDSGj-d;ohyh7|~eES0QT(pVSG)q_tH6MK?*WyraBWa@#pK)-#5B31| zFwA&1KH?Nt8OJD1)CE$k=|9uZFtbMX-9_zY)kqxpp$cSWh2+wz4zg-O1!bV68t^-% zR!GYI71F}^K9o%toJ|MHsgcS#HS#LqUWeIa9S@Pjt*6D~uqT2KoE9;ZLu+o0B;eLp zj!wdL&Z9c-Cht7D@jdhgIK<3x7}6mFQdn?!23ATL@lqDoNc|d@__JA%z;yGaEJ30% zqgjUZkg@{Of(9rgtQ|82d@h%iE@7Bq?#8SVx=tK36lSVa%0Xtb!k|h?S&BRmgKQmy z?Mik@BF$Kcy#R`!961^x-5k+odgjVfy!_ysvR-1D0B@$}$gS~VnfRqc2IRWd%K>1C zB0Knt>q(q&wu=!i*-Lh@D#e1`52D?txuj_!)i%*3DYsWjX)cEVxs{Tb$oR#-Jb@(} z;uk0vuM{YF3r(2It$xQ(RO%QsCPt{3>Ic1VSk2VCO9FBQ^QreidaY}(>V@#k}J zfW0B9Qrz{33deE#>C}1HeQ;zo9dQjcT0~8Pa5}TkPsdzdBZ=3t*jq*q0z1@0`Pd|J z5+|29ffIp1Ye|h{V9&e`b%JSyh)Xv}`U8x06zgHk1eEYvdLAQ~5kpOJRw%4g^B$xH zxn_G9MTo3YAmVS_Ad=5o1ygwzrTQ;sv|Y?xn2nSzg#j!d8KlK%;LM?yRIYSMeK|U2 zU5zxu9!Q1uM`-Q!$cbHkAv@UFPQE{hY{zcL-pCrJ3+&7%4zPik#g+Oq)qgYV*$=BQlqOpfrQ&_?5`exTRXI=}(UQZjzU?E?(^tO%@yLBq&^>72E!8EuL|C>mM z?m&5>AOeimHq#S}#e=90u{#~@0cQ}4DYX?I4@TWjyBWtc0+3d zzJ`I!W|()e2*g-o(P+B9yl_V|HS;`rAx9EQ94%W-q9Bb1a0J%jE>j18>!c=XJ8#$8-Yv@`=ry__$t0 zk{uZ?al|vz#rKfLF;p#WypwIXpPAE!E)0)Xq>QkA;?0D!NL;Z&5@2V_2I;zCgY=HK zN&VY&nEfcIcWHw4b&|kr?R%_FZs*{mDU7^OHjOoPBDHl=MOtpm4Di5ij`LcUxx|m% zg<|v7*GUU@*-aD!_MO6Qq6@d0YVbqIwZpU{Utqq?~6X{eJ%;@Gk0?cX3xq~m|S zj*U^B9C@E{@E%Q1U8F)i`3F|8c-@N9qWo_BJW%$uOB%WMEb?Tvgh~_FTA&?VltVUC zzu+URA5y-p6vuXhc&N)3s0Sw`d{rZk!zkQOY0`s?(U0iX-_}SM?EDVpOw6>vUoU~6d*KSwLYjGvcQFvoQTt|f+N z7I0L$gabLX4-GZ}t-6h%ehD^Ig*yVO#rXh5Y_~o~;IHBzB9}CH5#v08ND0eH#nZ zr5mIbb4VOr1O$60VPlJv#W0)I(kyBZvovdioI;AV&_x`ykI+xTpa4Y$_iALQFrDK}Jq3&$HA@ zCvn5ArzMC5k^@u0OgW%0kWPyUyBXq^aO=lfBFYEJlICPFN7_!C7}y;fnm~Gp!3BP3 z0-n1ttldflFQf4ur%~tDN+R$xk^{Xd(|pXkq1UA%b1=j3%f(y(Mdh`)FO|S~?q^hBT@U4CzK&(hBbdX^j4da z_O#TmCBJ9cAeEt&tsfDyPA0#jmt;O-&cj?Lhfxcj1sv@+$ z5E`uUdA%}h&;vnw5vHePBdY&iT`)WTy&+s&9IVBJky9AnVR+p}&_385(wkF^zS#Of z1Y83BVE{xDqlC}}*k?mF%)&hoa}Yd++(;3gXd)jj!zi=vV&X1F!3Kg#xt{7|dm8BEAU6;w?}c{qu&8H2Y;9+>|H9}399ge!qVA?s*303X2n@F;8qKdgY|a1A8DSQrCWLp)r?LBg(YDu3bp{liJ+ z$XE()B=CR_{J_f6;Lb)myBNwL_wG7z>fMt1%)m?sH>5!-q<{+&Apznc4q_n&qQDDz zPyjr4BSqkcQYeGK;5P$nG0Rb6v_K`+D)2!a)PoiD|7?&8kq`kM$b_>rpaWCh8E<;! zzVok_Q$)G-v=3*w97M7VJ~4o* z*o>-ztUSFo8e(7?xY+vJc~CHp-Z=0~%NaSpa$C_`a_+kLO;1Z#=r#L(mb2!A556dW zJ=YXykv~@-d*l)6ygb&LD1SWjPR$AVy=hllKl$yCq877sd}WN^F24?Hala{Drb zwRPZXY5n-f{ZGq@@O8sKkslV_ZmW^+8*}@b?hyJ0&;qm)YIm-mul^)TCJ*`4#a@tPj`isL>W|zQ{S;Z29K&1dx&Z&ahq}I zH4_TKU;z^q7EsMGmSA=}fu|+NVl*2}qF5{zDf*;JN+CB>RcMp`w7=l`&+^j#F3`3d=uXmZ#&2jDsZA5~t*z7=wYDrL)NL7jJ z{*BQ0giNLKmTGYgz>HBXJ{CaqaUOkxH5ZcDiuEx33Ox;~`G3+#p(o_QMuR%E*ma|7 zDUMK`#i?~z60o>`B$A?E%g~eAtqv>p=uvX9&A`CaU@EX|Yi`j&ya;T*XLPgM82l20=ukB!MJ=`#Th-zL z#RCimeM$`~C4o{JDU(DqO)SbVJ(ylhFQ%XCey*$b7}Xl#CrQ6W4N33^sY*{ZBxYaG zKFfii0~Xa(w!o}fiWD`(sakVYyR(dlWvXIVdqvPy+Mi_NdQrbE4=>`Onv3ntLCuy! zL5D1dgAQAc1Rb%cJfkDc^pHbja|mZ~%+8>lmc2oHRZ}rdWmA>e^_$tL&{o?qw_`S7 zHel|=-1#isFhaGK*rlF2ZdAh(+MjHHvExZ{v|3%1$VG{;mToQ8G7Xs~ztL|lHI|zF zL4J!~l7^rLaQ)mH)N!S`s<|{n zwXaMl3o27hE8V3*rK*WkN)uG8OSRh72p8p0`;^-86E$X4gc=;7TEZ(CEtL)Wqqu-s zZtd10&HSQT+`-*0JHNqd@|v60KEV$4-)jFt*@iSM+j0>iR}C%6Rhb<|6HE{>bOwtSsACA&8o?yZOWr|{^EA- zx@2*_Z_$FhyXWQ3$(cPXJL|5@J8sXo^_Cga-8W53yMF4F$te?)T;s31c3i^PtFIaz zcjXnaBQCo%I%?>U!Gj_PToTdO5#HP0vqxyK)ocnfipw&=nq*C}PPU|)rW&t5fBo61 zol}0B^2?<5Nk2_ImE4y6z3aOP-z5I$n$O}t9{FMP`>L&^z-4h+ldTi2lPptAsm7^+ zsa?eBnDq0+GfAh$|Co4U-0?BrU3K)zBO|_w`f|{h5&uzpBpO`CB;!OwicAhn=}P@` z%5Rf@N%<-HA5AI2V!|1R#^*rS(zGwkbu-(2#IF<1&(ZP_i+_I7ud-oBY?L-zWa+ zI&UEi1rXazaM?<%5N_}8vV`CZw7u7aTG~{l7c3xmcl82P5xujugUGM(}^dqX}kKw=Cf@MkNagzd)!Z#{WR>%pmsI-L6@HePYfqLA!3psVd|=7oQ`>@hhGf~ zZ()2LhgLWR?a%?8&_&2>g+&E-62t~<_C+{e*7E_SHYF3N} zV~}DpThOrjDumzQ5H%!3bvX2Y*1TNRvN}bLDUCJhD-A_8nN{;vn%J~vj%r;qUyX}X zdyi7AHoGGt(is&K8yBCD=t@aVbEjuydc3)LzJkIcf9aZs)@^vK_VKMxJhkh&-7miK z+8g`cegDJePd_{SpCjM2e0ThZ6Ky}9I{nj`pMUw~*N)$Q|NW0YIy?XT^RK_qe`j?) zsO!UX=Ty_WrMd{gD|@Jxm8q(Ad#c*IcCMPWMp27HHr+hLp6r|*SL)i~e#djdXDz;L z{qyFUKt+cQ6p3bPv*kDfmCh3S>af8>8Y>zWM_D^+=Z=C)Tqt$Qo*>o><{ zMNN!%aF;wk-nx78 z9WUPhOhc<=O=kF-7eXX*peRZ;9`n|Jm&HwR*4|X(cd|=hW-){Oo_Ol*ue;5B&RK25E znNu*u8|LSOV2!&l97{YF1$3iDdJmeNy4_6WgldIHR0r-vwuExxb~H2YF=4#efrF? z^ZVZab4YXl=SNhG8+oqR>AbI}efadN5AAB*^xnhKMV35o=A^W(i7R7UBHyqLJ~KXW z=fR?*wa>o%`j_iEH}_jOX8A2Q7TmRAq&EKJp6!D~9_Sr5tafzNhUdtG8Ug>#e;Rk9@p&;mH$!7484+%ax--oa@6Pf}Xs0G`qaqCfm5<>1kCx1MUN@;q?%mHem8v)AQ2T$^qlI{caVIP**W zZanku`OE{KeLerFV|xl8{JD0`;-0fMx+9aeT|FY|xxNXOgMrCEeSIYT!;>$~YWTCp z_mH);cw_%3H~c&H%^jbP|Mtapm-W3%reFTmIPZ<8vz9Ih6g^NWt7=~idt%ooQE$Ee z^O%-5B2t4ty>{k^@9)aH>5pa0^Fns4+#Ruc{bM7KJ^4#w(+eLbU-m(QJLJm&a~7Rh zUXXU~&WBzwZm)jSzUJ9qqrZE#IsT2euDL$uJ{A|RQZH);f&uy4|_rd$qQ@_4_))glceLepiyzUS451S4- z-hSq}q4h6S#I1Z+l^f@OmXSI2*md(`e;!oW%OQPK(?k8+@8aY#i<^u)l2q$M2}YJ} zR@L%gxN64esand$-=X~8VQY$vFB{ouP)v)g(XvDQtt>xLHR#LF2+j0D~N*nF2B#7#XX5X*yq zF8=09uYR>8t*|>%gr7jgF=d2GBUCw|s(}2R4VbzNd%9DLMU-NvsFp|L_Y3~WV*Quihq#!@4)`vm1OZbFzKTFf$u?P@Ug7#1VL zdHF7s-w_;)%$Lhm({r)0oU2>q3h5<^j6~SJS8^~JB5|r|ci&Mo+$7E%to&ZZ?pHsq zaS)y52S;YPlj@`aj({KRleqy3DO2ji3svAqt&^DR>!bj)3id-Mv`-}*{vN1;de{qx zp%wn$j_A7ZcivFPI|amps5DI23!T$A!gF)>0=YL6A7ZC-6L$s&E3gkz(~%Q8q2*TO z1>0?egEZIJBIGZFScC%A6M9~z(?+%vfbnRnDlWEM$y>ZB4nppmRw!AZ91 z+4#eDNS{Sfp%4y03)p8<6%gy?zBH6UIkbX3hkWKzOz?pp_Cahe`GFtGVJ94bR&dOt zY9Jm`pbVPfIJAR%KJloou9{jmtt~&=UPxFr@*xk(c$nS zYU&jAi0WAp;OUaHn9{l!03qre@;5V06Hq!Qi+ErhohA{O>|;(LL^pF+HR zAWNtP@IeC{hEB-j+Tw!jf+dT&Rk)}iJI{A_0sT<&7cZVSbzw^K0_?N%XHUw{cdMpL z7U!rTw*1-CvKQa257JR+kWtyQ37uV#GjU;ou24*U7UwR?FPO3iS~3$oL4 z7S1hTMeRd}iICQ!{8;BA-|R)+9Ot4X1#+%Zev-5MZRny>H-u2JPXIxuTa(uUD=Pk)W(@rWZ z$XV#k@v4>-C&9Wu22hZ*SXFWs&Y3sYIb63*nYT1&q0@`@NF{40FZs_^O*#3_0@l|~ zUv~b28T0N(Wn3$_EWCT+qI*?yKWD*xJ`Pm!au%w+ubnt8g~#k~PrE58#W^i0Lp6;c zaC*+d*^8DeRFx5`Y3jYX^YTzM#(Apc4$@n!f0011?VMO$088$i{G5BP8}5yD78L4r zs+vM)Omt72l09$XRBz#R6n5c~1vkx^p5voNX&}{7>TqYzzB`9{oV#cds;bu#%9x+8 z=Xc4Xg4~>Z4nl@-|EzF!&f>+>a|-h3QDu>O^CZt>hT#}P>BrGn-lBzbRZFPe^7#en z^A_aL%G8!>3Ym2uEs6YkC-5%Po7ARv1(YHy-tH#1SVuF#<*1g3Zbs8@$alfS>^#-9 z&FRhd&c=+HIA<;?%%$+8lRaB6lHQNh;NpC5&g^_@(NugpYEg2QF8C*1#X2h+DT)V> z(`;24PVTC5S@-W1s>PP0hDKe$5~Z5%MvPGe98JBfx^F7Y$jOaq^>`9k%?YA=(q!js zzUnZG($8D8&{;q+>1 z-!dcFIX#C>9Vry(ZREqY*y*Jg&o0QJ&Ap49GZsyBPF$4db>>sdkt0VEEp_VTD>xC% zS*Y&9chTYkHkou9Q?XkOkI13}sisI$Sg^>ugk9u3Zx$cKSdi^=UgsR1 zL3)ZaFK1~E%~{efIc2hQ&Z7JU*#*wo42rpQTwmV(&LuuCUCOyI=U(Tcg*nc9=N05S zb8>w7ixy<@jg7^6b&q$(6^=r_1$QBhJL$$NC#Soe>4naM{Omb%=FL_uZfC(FMxFl6 z1+x6VPfOsGL)UU&ERS<%eM>5SP2v16l0S{l5tz;W`#bf&L6H%I^uNgd5t`ku|8uzv z{ON(LR^9D%YUbj}#L#Ru-AfrlI%3xPMQWk8_X9sk(25|}Rs8l23)h@8wVpkB3tj?x z0v2l|Gk32G*47}ce~}iEuJtU*B#?$6S6|KgpqFM^nis6~F6l28V(5YU6pzzPC8IS< zNs8uhYL?Q4nqz?G^J#rc_3K7GjB@9NWECy6)Me33D|0WLvFpvIFThxQiGC{1&YHAb zXiQcP7Y@(EF{40VDn!Gj5CfON2)G>db(Y>yc{)h?K?Ga^`T@IsO0F-}t^f`jxa59Np$L}2a#*2RR$f+o zA>3r#Q$SyVPKE11AENroa2nhQH(dzI^rV0Cr2C^3y0W4fWFE|iyCDx2TnJi%btRO- zDp(C`pbQ>>2jQU$K~W1ls>~DAFay%z7Pu8|gABO+LePa+7l9A%fqX#A>rdi#-|tw8 zdGCdwYq35IkH9)8hxJea8=w+4UKBv%9>hN*K)>IkSsoar4PNaG(k!d3THI>U?5jNB z)auR6IVfmwE{TNh1HPk>Y z)WIe#bd^hUt|9W81QK=ETbJa>u%4{Bo*8bGra$0a&6%fr1jiz|e362R3R%oU6)MzgvK3APsY zLs1`XOhQUue(upO?M}{`unT|pY~Iq(+wz0 zEH=%yD((n&uNEGm*&a;PlmcqRt&8kMhZGl@__3RDdaM)*d8{akRd&sazVc`aMe?NI zLyCEtVvo};ahj4_q+1F!CC}>7%n_R6(-aC*r2APSG*hmgamdCDbX)9&deDEZYZ5hE zoHp{&FdHP^XedQn8>M$P>)JR%dhIAbs@@s_k$~Q_ zMnMe3LL89OTHiPEw4X_g$VK?l7z0d^vU_TsyW;g_g z;Rv+AacG58&<-8Y30<1C!fK#;bwR9P13Ne%!l0Q~#SFq01tV~kX2kOQQ2Z6RN7Br3 zx?g05X0gx2Cll@h56l8D%z<2(4|$+hkq`2r0G2`_+z+}8%fSyNPztM|3?78F@CcMc z1ysVLP{ll!T8E_`wnGE#ghtp6dtfg#!9Lgz2cQ`a!C^Q8EpQxK;S{t(2XsOg2)(h? zg~bXsu!934jC5jae{7MU*O(JD<&OBJnt5G;R#NnUQ;S;3Q-qgkV;_^2l}VcE>CEyq zNm`GG9dR3RJrU`vNYczZZKayoso7Wz>6;xb^j}l8P#0hQT9TvL{*|MJ7N=@f$A2xi zHPd9x=IY)ObuYQKkVtfhzUtOO2WTc7C6V1L?n(M~Mhhv#BaRiWW*ggmbydoRb*^T* zMhiw!uFAN$3fFoRr{T=|d+m+pV)&EZYJCZ=h4$CXy2J7JN?fzvdf{@6z8=@?`o%>VmZp>*#Ll8q`N*j@Bz3E#cIK>$b)JpDmR&xE4CS zJKr^#|LySom!nK!ZLakw8PF|FS%hYZ)PnzZp^33Z-8tZPJ|4-I( z_y2`0_x@vLK+x2B3hS9d{} z+fku(J4&W&rtKM8Z~U?9gQp^v9+9Y7?z!M{X`zvt>7pb3za6>%?I`MYten^#X@mX0 zU3Dq{VnmaHU5H?nvcA? z+xj>Qi^wq-tf;KWu@|g*UrV@PO~rc61#2d1K-WFg^W#3eFIYD#|5#a?{Oue2kJa^$ zHT@rJ?nP^a7Tz5v@}lX~$B}7Gfo6I{E_%gWG-EHCaTm?_i)O+_Gx4J7x@e|cG*d~E zE>IGYcG1Iq(M-Q+W?VEgFPffW$Mc^6F|30|!ySa8v!@S<6C(ezVe|9v2( z1yh(Fky_8^BFZ%D`#D-xo%`?e6q;$SX4~k|9Cdk`b))CMPgFD|QM;_ptsiq~%Gmp~ zkjJcg5dBc)@3}#bxT)Ls|JAhBxix#OP3wW#tB!`%-Gu+!?DkLBf=MPE@4rnl`TMNp z!noP!VI%IHt@YZ1&c%_%mCg=(%_Vqn8#JE53^-Y*RH$&6QdY z7U_k3vet>JUp-C>d7FNxV>0Rymz3}#B< zMQpw%=+La6%&ZTvfgXnK`XCoQ=622eSplweLN~E|W67?W-d@<;{im6m5}Eaj75xtL zZS3uBp5DB)9>xpk;nk7=MbH3|eR%yI9DS>0E$n5h(V*~(en_<(4&`eH=lGgYfHgXC zo4fc-7;gP#q{IDqp`EX{+57V@{Qy2N0I`wPQZTSu4ng}MUUVPK%k56wkTHah55VzZ zyg&~TQM~F88IT@L-j^cV703aJBawA9-!+Km`vqf>2M$0%LbZ6W;g#}ne3b$0F5c${ zC8=7vF!y5aMutwz#)-W1pTb8ECL_xfzAP~nIpFa1T!-8ncwry*z!C7K5guBnQ71QH z-c-#Q!HQ3USm8uz*3ag$fa0XV`cmGVRQNT(+9^u2Ia#i6cT+B?yBWEr^BVjNUb}~= zbiU~T`)=Wz47XNG6_nqJ40lmJPqnzRDeElC=A}OF;add-$Z{{=aww$UmLp>cVM<9G zn(=cN5qBBst)jlx5w8OIAEg~0W6Of(S`|l|mlk@^@R@FXC%~Lq9G{9UEf>F(49!wT zU#zvK;L_K+4+)Ei2Vx5J-D?^)Umh27nI|5w7qP9#O4cmRo>`jZW9xKmZdSnW#Imz! zcCt2ZPGteTC*yuCbWeJ;W;vMISF?PYhjRVM+Y@ILi|sv;tSdi?9nViBEB0pB5NrwT zBM+vcyALL?e{6PL#!uWOI0e0XFoBI-vu`**o<2AW(c1@ed*F;=0pIKyh%@dwe)Jvp z#|gtU%NG*P1s7VsS>MEd?!KH0F$46t*K*a#==wPKQhqY}X_n7&(fG}tUO1gs>Q07T zbBt!?q=A}Bcu%vukiMR#{S9t63ZMDlq$Y^>#NZgDC~T^MVcGpK;G39(&77IQ7cknw zX$2gEaaIl#;5dv8=0pPyLv#pd5%4hTY#i0VCioBZ>A|@Qtb&)|6h!vq z+y(B1EwCScg5HeuQQ(F=SOsLpK6w#d^ADU z!xiuu#a|6BFu;54onG+W&F`buAyg5nNxs)Cb)J7~mQOO)^Ha2#U3kH`xD2Y5UE$3Qsu3{M8Gk@FnO>tB`qbWT#bD1Zzq(%!_x#)9J`hj}?9g~>vX#Jm0OV1_2B27uFJn0e-4$Gs1 zd9jVxt8#Tmxm*9*@HRf$qdS5^aD+;s9%r3%u!-s9U_UMRK%REV68}_PnBeb*IzwE# z&Gb@+W}5$u3*C~bnaVkdj7ht2;h|W~^og~95~0M&PBzB&fPO))>8F|PyzQ^s4``P4 zvAmwI+fhT074j-QcFpuqA(Lc_^MYd&>z>t4E%ftDO$pJIeoeQq?u^k)J{zYaiehsN z96oZ)gemTfthv6z;s+{fwmtLA?!9kop%r5;KJyf8=Zx9Wr*FTAOZpFpjEWk@zu`lN z3>h|b$j~7ix!H#gkK!Lr=ddCA*|lQVEO#iD5Y7BvU#8!56hs44aq)GWA*ougk`+Zo zE-m@ix%_lXA4tUrd@Wssryrj6nlSu1Nt*UI**c{Ocpt#pBM z4X>xc5$FK>I9^|ax)k2!o5(9|x7A8I_%nzHKI})P@$L+EH#AJfyq@;~34fgMcFZcS zZ@-=QY9O9h;97Yd?$C7nZ{QWO$+aA3C^KuNoEPD$Adz?Ma_f_rTgU}G^EonnofPwH zx#LNyV28#9go8LAFV`)u<)aR@(hM!o0lV)dejyUx#|vxs^RgUd6ydKTC3X+?bY5)p zFDEVN1lI~)-s9!A7AVJV^;0_NfQ*t_$y-?~^>BP$t+a3A1-{2g9}dIX&9zbqx%K$L zen{C;D``*&&EVOJKdjxx3v|y?n=ewXJ=6*$LJJhULT$ZPD@|bI^{=Y;X&K~+org&| z_cxH<)5x}qu&^EC{#7eGA(1edP`Zj21)&2HR?~X;HNj!h@=-6Y4+sZ`p@{rk1=I;B zOQ;j-&I^g;-@Z1@X!}_!RE4Dmy>d||4O;6JPQDg&~+`< z!CG6L)PbiLk3RI`h$AM13wAQUj3)?s^IQZJhVc->r92{n>FvX_8H0F!VhAq@4d4NV z7$EFkXc&Q@1F_>Tkz_~s!f=Fk)Jf4u9)!Tp2fKrLwt}z?m*YoXe(cr=(&^8$6_?77Yx|9ODu{-X=4TqpZ zr9LqCVfuJQsT}s*Pvv8F5VixmZCRaW-t6Uc*IgtwgJxQr;b8KOs+ImMUV4@@qvOd4`=*fkSDLog%hG2|Tc=9JdxkAR zj`fN|t5@FK-tcC&;U&YXhKl)5lo@RgwpgWPX!lqB&D~%1ACn|WCP$UAS}6;Az>zTY zny7*8W0JB=1B6^YHaQLttedvW_^RQCH(Gkgp5ANK2E#*deDHA&_alv2rdao9PS-wX z-1E*|#_yjr92k+M^vk(aY++dz&yMQk?`K-RKOHp0?Pb3fRzcqQm9EW45F>h8Mvn}+}e@Es|ve`y!lX?tnkB$npjm}bf+1}(QOS#JV zdDACc3~N4|^huWD$Qn_Ylhv~@Vrz0vmZ{L2Whoqx6;il1DocsZGTE~%YL@+8{#OT* zJhZRPJjXF`df1h=_?>T;42=w3;!8-Hm1>)n+9N;tuF=U^vRaWjQ9UY#M%vc*-|DElsBc~w$HaxhmyAauAvt_T^}P96UiAV!wr*<~E=km&yQ z=$SpDM~sY~fBBs2BW?5a?57gn7D9c7YRSPR$)Q`5Lu_FK+dp~#oGsR7Y>r)taJQR( z&$1N9jIuavj=oW*P`-CKt!n6;+bty98Zet=&OEH&9}P@4%Ff%Prw-d?+|e0`9x-fZ z$ejKkQr?nF%tRhgRx;J*FH0(!+GF+Uz%FA>d%*mAz@|+8F_2|inX1*xoApJ-;uvCe zl*A-Cw>s&3JNg^81k*E(75&8)X_+_hlm5mnA&%zef=_13fd${a-}O?@cMS5$Ov5kl zcfHrE-@LwCLLDF599#QK$%kF_4e?v2N&VgpFIg|07hxOpT&Uyc9u94Qd~&d>ac{hK zlQh1z;iVp9=LLV;({Z?G)7Q=~d+svY{vW2^Jidu)?;oG++q6yEnRH1DS(=o#plw0f zY0{LkYg?g!!aWp7*}Z@WqD7j3HI<@mKxq&(2}E18*Cr~o)Lxr_wS{sY8ode%UZ^)$ zxGF+L76tNqkI(D%e1CsTGIQpfGiUki%Z&7fl({Tp2LGB~mr(bx?K%R)K( z1A0X}GKkQ`p@~Ha08by67(B(8N4NRX#I$e*?_AP!{(+3PQ*F)ZUA!>O2m18qaPZqM zpyl;znt6DqNDp2nmB6_489~q4wvQYQ?uJvHZEjD~cvBtI&*C!&*Q@ zbPf@%9F70nsu`o&gF!3Z)@}*@zu7d0eO4tA8M*N#;z+6*pL_ZcqD6z@F^T0$6(!nGHz{J-O+2CByu5 zo?aU~b%!1g@N_F2BZ|;35$1|fvq4CN1<`-U=*eh7rw^XG(-%LaXXgLaiaPXKG-zZ2 z&qY^cS9#}U=-;bmP>7*8MgXwlh;X`p7ZFXjU5a(_TgCo*sh4G%cy9TUceJG+YyEXX zS5`t*YEo62tV@LZYq{6=;eQd;bi2Zhjec3BM1Q(u4ru^sQtAx9V1=@1MWQ!_38XT# z%(WsZdQ=P|C#ui$%79lJL(1~cl^FZ^nD6s+BDFt6kH-kz^U)ZSCBk)4J3;uA|En0C z)+K70-ztvQ2x&z+O_b}=r5EcWD_E^8TAk=xorK5uKOmB4h`4SEt)Z)pcVdAwh9<(o zQF6zKOksN6Gu|cr&<_KxI^;X(Ah0Nh!TrZgD&mCKL8Z zF(6vr#cSa;@pTO2R)Mg*E)1kI!QAat8X;)T42sC@uuEyZ3}gIMs`m&QC?csASSW^8 zI5I6^FSjDW2yaj^a?pB@h+dj^AMo)2N9cmgMUMjN#n>qEXrF$P&pL)HdIXn`;u!1FG+7Xgb1Yx5$m)FogT5?B%q>$+=vA20Y8-2bC_9fx>Szn)9mZ%KmYUIRRmtM?ma!fA8P{)p_`9}^ z@jT;cns&BRMJdb;4FNDtx6qNr)YJrOYBtr0^jVo&Z9uEtRDvM);f(eYI{#s+ zDosCL=gnev1#CfFu&umV0b2xTisp?$6`x*vju+(tYZ}*=jbKX4Jqtwm2Gv$U+X~eZ zTlad~j#a{={}ej~j@}1#0wUhMzLjs!=03f(O-{@E4^5Kh?DNgwIc7j6E(+~jEZ?eX z70~b5Zd>U0e8troTdP1*yjUFl#WGo5G2y|1H*)r&+RT#8@6Zn63yNY#Zywre+|R$^ zR<#2(jt70SFipF1wrJWT23mdeWc)Zj#h9rQuX%^I4uZuff$QX@aRMq8BB}Uy$V|)^XQ_=)E1q0Bx8J=YPWhvF&+7*1Gcv)??YI?-Y5EW{)3eF zVVs{^c3u}fKrI#&RHjspU@UpeMmBz&xc+lrC?yzT&ItU!#(IR*M)uwMuZc9tHWZ_W z-?ik0H+sa6QQmw8^`rYJZvjqHlq#)pAA16q5&y5pf`C5g+ zPJ|4}EJR#Xdo4y1c06nRlBn?eMT}0V!)9QC zW>q!pY1p`s+l*QV5$#`FNgWhq^CpWHi{D}9(Gr>uz~s^5=R2DfO`6gpZM|ux)CAKE zx@v1yZ*K6kavco{wW|}nx*1HqXu=W9OQU!7DEDuf<~rG=>Jd<;Y>8>1@N_3+{9T=Lx{FHdBQw}|+_Q$#Y( zv!1BNO(G)hgdR7U@edL0xG97kXZ!`%^lUp3kA*BXmdLUT8QV`pc5oA(a9Bx_v&~HO zDmVlbG_QpLd)}F&w}ju}cEJl)xi?8q#Cwwh@l0bn)2yhz(0xSd%H9rS zzS9SYxM4BQh3RMz+U`5`EO+-2KpH(eTxkhbPEJEv`l)ahP>e8E*;G&iDTuYftn}V~jr&$=k)#89HZR27_e{ z&1C3dSJR!c^R&mQ?HCCnNkra^|Jw)KA2A|(hsNfq=C|HlVJx?{;~W?a&EC=qnSwvKMlX3nXk>&;FF!@qOM=`z=N{4>S836};8BE|Y21>{o0pL&= z7kHe|Z))xFj8iJP0!znBwo+^m>d|7XN7l1LUr!z6K}h$JsCc9T>H z>jy=x!UHF1p_}J<@_ODp4>Tu%y^Ld%^+zVPXLMyfYct zZ+`+xMa(Jn;@y$$Fo-N5(r1q)Cel~4I^u}JPM6$`prF(OUs9|yA z6HMikOp`2Zs_E}=81bNls*x$J{J>LSW{$FoG`V*X;}TGAxj2uiN{8hvXtIY*jz~y3 z7-EJ(DbfGL)T`w*pPtrk>EN}Ob*N05M@+K{!lxgo*Qz6@|4_%N2T$KuKS&xn{k!_@ zB&crC4IGOg5q0rl&-x1v@ugUA<Pz3xahE^^gKE7h-zjBP z_1NCZ6#-YXJcLR zk}I);@}4uX)7~xtwkj7Z<1jAwR&fwp+ZfyB1tX?sV?QuY_XZU9d>uQox3(L|J=?p2 zQ3kY7NkOwM^Fg+YBAGguu*QYt-6l(@7H*IQ)rUx^P11p*8*!AD@u3x`-H|{Dwa^|PLI3laxM5N9Iuz&harF&{_ zj%`wS0{`Y%N&-~@gx$HKUB6{bV(-#(1(LOj!EpLjVPqZ=eP{uatm2gEe8{xBIZcw5 zG3WHKk@c2`pX9eM?Z|N@ie2+4Uz+5d?3J|Q_+Z{QZQ(P_ofn7ZFoVOCF#inBQ4h^w zFTo@c-{Z+N8?DLBI&$$n}muZsM38= z^$l#Ons0v?)pU6c4|lf47b)U@Z)>6S7s=HH}*QvD) zw-D(oOZ;c}qvVx;Wy;nw`4)y2Zv2AZEcoOb&t7By`Jk~dZ2Z*!d#p!Jgb#hP(Ny$E z)l!jZhQ+jMiYalLsl3=!V5!;|Z_4IZEd+yj_;yTF>@aPgHE-Iuv9m^R+4Dhlj$|2C?>i#HA9SN)~voXM1-GEI&* zEmoMeNk7jJnOga`59X>bLOWDDY1f$t>TKF^=DxaD;W~3qy-MLY^M_iB^E>JmdH3#a z^>n%EA#`LU>KXA>>-Z&F%CzmpV;L`)TAwpb;a5GKd(Nc3C^pSenAS;6yG6$`_*Dm! z)mG( zUc}v;bEX4vraAGZbqdpN>9GtEx+{U2c@V>n4;l)?hEHJ`!{k4q|8Ltg;Qb!#HH=|8<_)FCgnH`$7u!7mx$#W{NV->wVEcunCdY614cxm z=oDHg`X4v8Gxp6){uZY3S;q1VkF0-b1YBSy~ya7Yjriu=D*R?`So)FU`;}I;x0TddFeUb zPR6@~2{@RL9c`K5a z;Qa&)Kd9GvUu5z+m9}%{1ERowB78oWtMhJ$%5D7GOvLW#Z*rXM05fn92FTr)-(qUQ zs!RRKvz}VV626?R!YQDJ7h$< zmB#_cGfV(D@Ju9Ee|`pL5zaOAK|FNGd^~l>DpOh_R@0F-^pNiER@@zYNO!f)IllkS zd0B_MFV&PLX|8ME+R@U|K@=}5?Ue2?1DFf=8E93R>y{$~RkvH%jqwQCn?N<)Gk5zhB{|cU=k zA~bwJ;tc){vp2}V>}_ac;9fBVaMTfr;TZ0pM(Kx44N5*jP20yP3Wt>FVQpM@cQJ`G zf5`P24#7@s`IxI`&pArs>=IkROs9KWiR4d!Y{TPc5XFv>`94Nn#OF4lorp#lUMIrE zt!BC&s?}P93ueam%^BCRX+&XE+TO$V-6jf?(sqQ1Uz)A<2_S%UU^i>4f_fVVXU*p7 zPrS#OKqnFJv_6XsHol8CHQrB%*tDDo6W<}ym!xkp2g*ZTjQ8(E{O}1Pv>wJ73qzk0 zI$0U@5y=?a4kGq2MAjfBqV2w%oz+)7p1JRid$_EVDLP!EdH&KC)yA(y8$Yk{b~9bV z=vy3aEj4bNRlMYty;<$jEqnh{3s*04F7q<=9%{pLOj(Gb_~yKtfMg}126i%o9^M>& zt3>V3u@edir_Y7kQ-se*iA9VIQ;PpJS+ts!JD@mrr0!&J6!P zbK_@>_atL(!3wXG&z9CyX}iS6H_RG6m}`~(RZM4YCCvTVJxtKFGwcO3)kgQ2%RXl; zy^Lg8G7)O}aK~8_=9Ts zGnkwzY;sZ`skEKS_5I3A7lAH+b(&E#*=7gLjxu`@P3}byik>nU_(Lp+q zy}F)=!iyk#&4#safo?BTc9!uDFaVnfPfZ&X7tc-tW!hQXPzs#3n{mrRB(-xI%$-Vq zjoI7BEd2ngMxt{GuD6?y8XopWU~UlaN+6=~winIb2$4T(+h+Ejg0%nwlC2ucx1Pu6 zRE5^Ku;&|Kn!Ze;FI%fGlj_Ta`ZAfmOr$T9>&wLYGQ~k2{iDwlzxjwzzmU##>&pcC zGSuhk%lHR*ldr>%uV0w%>f`InR_V*u=*w2>%T{~80JSf)JquUY>)OzlOymOpt0yS> z*Ag-ECP%(Px4&x;PL}uZsn)p7&Ej_XtRrJ{7k@REDmoM^5fh>Q-Av&ed947q>5k1U zl6JZ8lyF+^BY9t1K|wG1Q~@jF`$p+IWo|p7<;YGBb@uFDZ1tFde=fuizWpI*`B$LSk+on6p87}~guD36omy0} zTj~;EI4Q+x&2M$Gz*h`B`+$;}sDAF5wk`nE!;8(Z99lobxS<^_US!5lMRqg#!bqPo zdoKZo(HSnDB=Uq({4X>^ef*Ab(;zkvQJ6o#e3uSAMhp@nUTK?e4qax#BPk+W)4hqr zKkc7q&L6}IFujI>?-_GHZwV1i4rVQY9q9>k<-Zy4C8k#p`G9x5U!^5tZRSqgC^Hjb zhIk;#Q2nY>5}y%$9FC#duVEbba(*=!pCD9>5{+P2PmLT>@Jnk*)DhG3OHTnuuhnib$TGjK3G zn4|hMBAj5yjtpD}jn$UU*@H@`;U8)C{tA?*j3doIJ%Us4IFa4NNk>t{*`!y0LZm8X zG}~M&rNHI9zhcRsf`!F4!c5O53YFHDWxnu;_ctbVlZcs8bZRu25!(^E#dv=sGFA(U z?awq@PB4wPnGII7w&={A%7#vD70X}WsfB2W8aBQ8s6GQas96`f4aT|qX(G`%h)Ab3 z&xV_IiXMCg_+T53YKTK9(0e}vI2nhTA;Y+h-Vm6>*9+|Ew{$O4S~JGuA8U{Viy?-#edqkZ0q836RV@9j8`*2)? z<{OjDmIus+7}(nq?;l_sW^|y!E)a1RChzCC+y`Li=biyhqnohFPGk%H@kIVG$1&nK z7Opq#Yf@?LFF6)c+U!l7#LiD%_E$nz*%TzM$|lEIK1U<}U?K)0Tot;9{e7_;ttBLG ztx-aRYvH7H8TK{v8tOLHI8_aeFS(wiYV-iSLko!b)Nh)5{|zhpQS(Mi>d6DoE}EJ8M4L?m;RpQ+G1k4Rm!Y=0CU)jvUGGnG9m zBGdTq7J~j4c6WLG_OJ@v%Kuo%J3DjusBx4OW)%abZmtl!yZ;r8U3HJCx;ZcLi%d$lJ_IO~W z|J%Zl8nMlo5BKxjOPn0cQZ!~C|n-&!Y{~1zb-6GV>$Sf zvJo8v#0{GAHfT^;dA52-+c9nQpM@4s5CgpI(=rhX0yzz(wl51!iE&kW`9{z1rJmvG z55#S@ z&)(484V@j>bl!UjX9JfmZ@SuO`;5?wqHVD&jpw{UozkIG9s8K^v~4=}v2a~niJY1o zH-92;U0jcZn%@a(nDPiczf-a@v}DO9kl1x`<3f3P9C}R_zl>(E_Kw>Yk5+Ty(P|sG z|G0Lp5%|t?1MAoSd3XAN8C-4L9LbVB-S5c6|ABQXrS3-ajrDtpG$GY}x&3ljmw4au#eaXHNyvgFcvztnLH+kAO1yBDJ?*FMfw4^Pt7HuhO!*B2o~mNupzkA_aCCr3XgVm1DapT~5=5soyQh~{ZA z!gmV^U5*pmJ3wks*~830pnbA@$5*jkqmB1OJFvg3FSy+hdA@<79$6p zcr}!_uoBnL67eXl(NjnyuWcZbEUoeF!ZIC6czGgW=%_+f5BF3et>_8z=?AgS1 z173+}BtxlZjEko(+s!EYx+m@k=-E&MQ;{R|HWJ|i{m5XOUg^t$xOkrg^)RK%(Z+{1N0cpg#YYuy%I!uL z9IS>&7Kxkeoa5PUF<~g1FdHcgh7oNjyagIM3f5tK6qLh1*8f^z4;Qyvm6NRlM%k-J za_EgYdxr1Ee4X2j9BxZke?91=C5wok%J7arUrO69__c~n8QyG;f4)+PR$Y959jM4Z zys2!vJ?caQdk*W(#qQd3MnXf*vDFgU;}D{SFYxLQ|{s~0V`rN=M7BmVXPZ<&K6Bvnf zzjj+;xHabO!GHmY{%VfIg^9Et8e!rKg-5d(LUZTCK>nUDgtcl5MMNL35?>S=FT!v? z#x#<)MPhKJh;6;GS{@N$Mw6(}Lugg3v~4a7onX8V1IN^Bi14vz3xN;1TQGiz_l?iR zQpIb*!=K@v0$Jj3!$23||4fN)0H{wR64#ibN-5A4rUsG2z{$KO$h@m}97{|YsAaMy zCtt=a|BecJ|1!*vW}sq2&;;=Y2`5sAmLuBHHHDmn=b>zCAZa=*;3QL45v5~FbY&r( zW~@Re6CP)u222WO>1H&7avN7b7+PymBGTCbhk%Y=i$cGxFa&^|n8g7G)@FI(Q2p$>-u z?LwI8M5-r=az}A=0mg{vQ8=w0$G>GhH0ts+BD0rsSMv&CO{5jJd4-_@*1H*-GJPR8 zoVkSvgqi3^Sl!37NpdY!fYqlakkndgDv{Sx5Sy!iut4o!l=;SbK*3{$5S_&dui@M_ z2QxWPow+mow?Ztnadu&7Gz%5_r8t=7p64Xt=u9H6*J3KOM`Mk4m7$1>8<|lULY$mK zp-1y)IJ3eubTn!V8#Kbg$Ptl}!te*5645Bgo*eC)ifA#p_cNF(^?!n5)CxkiD-T16 z7Qp~8UjHXIP4rs|tJDu+sPnLp!CVgn7^4~J1@2sy4?+wWk50kurz%|_V)MDBT!L9l zMing3Q=>a#CR^33#f?Tu6kEPXs$(OH?hu?!C(*9v+F`yBxAmZP8ew`15S<uMpxZmYTb7#=ssf3_V~-+>(b1LopIJ-8c%XblM_e(8C0bf^!GYH-fUyC$hQ5 zoI*fDSicYW+ugSbn_daC*$7MxoO4*#J`7Ka;5_?k?!kcEU2{p?tBYuU{t0G7n5pb! z%Jwmq5QA_Q;8`|A&;2{xb|^u?!!>O|PZaC^Y|ylgh}&m@8n^wMX*)Z{bCK75jTavI zwfUNI{Y7Ql(M+lnMky_(l1D`E|20@C!^5J(3a{9YKBUIzLc19V`)JVKmz6#V!#uC2$Bq9vo z=Bc?Ag9Ogq$-@e=g$sEb9x#;<`fVHFgN3lWBPa7kPTa?)I<{oKx&)_*z>BO$SoEG1 z$t2RZoti|;{QS(T;rnT)$8;3 zBa8tHSsjHcP#u*Mrkcp!1|O^T!=*Gjbf4h_PNg3*@^-^M%&Z0j-a@3?iRg=Gxby?b zGWgCuD$?us5xG~8Y=LsQu_zOoqIt%qnqn19)1F*#Oldxee{)Ty;@Tzn@LrY}IHG2Y zO(F8vC_t^l@L)=$ITl86g$%Oij-q>0K=2n_APFh9Kc<9+5n)kTFEFZ zI7BGKnxhwo^2aGK0B!i5+qzv+!@snpV}Q$5Mm~1OYi2pM_39KIMCDAl6`jI=L7Tzy z4Ete9sEGYjkL7*mEoRpPiSzz5rE)4;Rsy#1FSGOEg*hU}IEWQ`XRU5J>)zL|S}pP|WujjKonBqZo8?{9Pfy9Gn1NaBjoB=n%%ui&3AZLR z#W@U?OAsmIi0G4IE&aa3P*gUDrAt<+y11bAjh5v_mXR|;GX`edD6))ORk>;d{hap| zrtvYBelL8ON}rSdfPU?6{#DEQvT$Wmu#$0AYJ8O`4oePgTBWOmx5<+0FrD^=)}uF< zP9K`iy80eeWGB#12GZH!Jdtnq5?5&ZtWdCQda!Ipuxw_Lr?*Jn9k zc^qMuPDHaUK^G3wJZ}MulV+Z!l&juE-4#O5A z`E?FGGq8}GVo8`tzL;*A30EQyu0-`p9_&L7!}-9IMEC?!5QGXCOcW4+74%4l;iL38 zbkxMmksrvW(@+f$g;tSGL~`$Rw)wyQJbv{bG~b-NgGjzoGEBj#eix#05ZofQt>6_| z8KeW%&#*1zmE4Ot1Z=(2rbQ{sWVHopat?>dPV8Vy%=~4O9p|5{4b-7EB z?9f}z0E%)Bvtia;OvG`V+9-_w3oMwExG*>WdaP63Q(I|JZVjPW1dIm& zH)jw%BRFpeYeaoX!P8)>ce1@pScGs0!E)o5vVmoA?D$t8(=+fGYpW3%3yJ8*^%hFE zoIU;Fpg@7|35Jt|kx@lIq)$2%-^||_Rz80OIVY;iWl8pGlBw=ta17L<$+nlNGEFPG{Qei_R4rUt! zrV+&_z(&U?&dBZq`9C?5-y~4?iA|}=rtDnP_yW^HLG@6^^)AF&N0E?(zyv%Q&$oR{ zsegZflje=a-6HW_2gE1oimvTNNh7Fu@ZEJ`% zRi+YWjpW%@^Ov)Ztl^?h!3WvPN$N~HP)PxFE+l&%#j+jsn*#ay(dcMaPmXqFpY zc+12BI;Z|k-?Rk)Lh%=)1Jl{|HQ_9!S`j-o>F0sz?71^Pof*txe|j;nmIaYI!*?CJ z;#$G#Fic>Q=pR$D6+&>##%iW@5Yd+fSX4}_^fT>6 zvHz&Rr%w&)GZ0I(G*x1gXgY&SGkSiDCEMg-{V+{`cx(b>KIZwT!J&!Y?{olv z(;|A!ka!U-y?)nG7ymmt)Iiinjj$#j&w}$YC|=~!YmU2JOEvy}eoq7%(`<)89eHB(LlMz>s3_31-F6XNI&tO@-UyR7NF zf-Wxo+cH>Eb8eBQ>g$O=wL-XmSqVhjpZg99Ce}?`w(p_ZQ`e zT2)*aPeh-lEQaa8S8s^)B|Iq3#Z(BeydUap;B>3{f+XL zRdf^zaUK;saZmkbLiofV>U#;dc8HEH0rt6ScmaFS8aQ&1Ik}50#y=vK0*Lm?Ju!aye1z0XhPlP_1ufm9koBj=)RI4L11bZ z&0)E`upP54RQ?<`do+>Kz-EEkvXOZ?ailtt2RQRL-*;qg^?A5ZQkduw(t=0;BKkr8 z&V8SUiaKL@tC~p6jnmmCS=D$kEjRuV%eY>ZjmVeX!!xcoZe3q;z#@NJhVF1d&C6Y(7l5sn~JUc#3{qeDcp z>o0f!2I$D_^gfSpV@tcC_lrnUmfuhPw7>ZY+jIAQ_!2B^H0Q<>iGqvCX?mu9AvETO z`=I=C|7)kQjs%R>^fnq8bv9RgLkYp6!o5bZ6 zNd~QAWH5GnHu~^L!4my4hHD8{*IW> znEcZ>y-B9E*=T24$gj%Q;`>d)ZKiL%)ttZ*&CA9K=9%g+ee1F%qp02B-NueoA3M$) zX+kDL;6>FAI%_%&C2@%OL@e=C2KzVqob}2R zcYZaVM2<_<3{hhZEB-82wNTV(XM4i2NZ$kXZuX#1+#N$_@4mMgx?Ym7_t&A&_Q?OJ z2LDIr_@4=`{~537ck{ZtH`S?z{wLp-GQtNIubK`+V%(r$lF^in$NYLx?rE|(vX=X- zH(l1>U~&}g(h$)p8AO!$NeO1B#q|ZRXa?n&!5gyP8noVySn04eE@+MSSrY(SrT6JA zK|?a&t7=x7PjD-k^n5s}rnFPl-JMy}uY%49|1=^KjjH=$gT%91Tfdf0^H<$3;ZZ;p zW7YlWq5DM!p5jY&-1Whe57aM8hfdyCKb+_|c~3ne*>&=FwJhCt@~-;#gy6|L6^dW5 zK=7-d-xMKGf%JY3#tmgSydS-I$23 zppNHOIdo%Px_ozKozA6u*rCg-+u*jt5T0**9iwXHZ-h(axkEUmQ^F_K{)s2{Z7xIF z42zrBr>e`RWo}*bhb?8!U)>w(DqSb0J5E&ep6IhHz#VF7?DL)x`wXcq1Fd|Q zLFvBif0YcYpk;N?-71j(ho<(rO7{lGiBi{ziZEJv-GP=+Ut`#i+Be`cD9?ynE<>!U zBjt0AJ24dKpJfi+qb|Za%G|sTV(IeZVE;p4?O%w7tTf_ik^2aI{}bm2Gc|)NZqnNO`k zaUzbSNM=UF%KVv74cYyFlc&R(!^75;KXXsPul_d~y6Gv`OfI_Eg=B=E)c^Y?U6^?xH!O(nzYq~5^zR-N zDEp@j2~_o;LRC2ZA-WO2xxpn!^a+wKEW9uwC}8@33=7!)0}+9`f6kyFS$*xt;E6=< zQc$Z=CGWv=U>r?tc$r;V%(}9M2mZ<`+!a@^`m(gHEU)K{9j+DLqsRFrzL?s5MSprF zE%xb=aCO|)IawbTB9jmeeA9OJKBd|6`J>;LxQY1M@;NLvHNBHwM2pHT@qN0Wg?0*k zX(C@4UPu#{m+A8av{CrZ@Yv{RjM3y*P<>Xz8O=??&0b$RP7(g5lOdG*=2C_ zA!EnMf;5Qh7ee@)!{c(O@~zC$zfsL)F5`$@fsRTfo?b^nnrCN=#Z@VxB<6#K)@I$^K;N@e%io#*41z~q(VKR&r>gGS$8IjeY9XGi76&v{i@C(!vuV}4m3 z>wSeSov$o~^SgaA&gon@y=})Pdv~$$Leja&{Xh_P$@__mdAoEzBau`gLMN!FpbURB z8R4_@roDctOM-^}4`Fe6bM9jPJ4rG+aq}U**61M8Yh{nxsmgk`Y&TXX@G6@=5;Dm; z^+pMurh5(6LL+R+>mB+WSlU+)@x1NaAH*>fGLbZ9;ShAE#pB69kQ>-5d=>1*NDeAjA0 zWHs-g6yn92RywU_{~p(x_nS4JG@XeXaIt;~?+n}$5M6$bi4|1;GKc<+k#daKSwuvy zTOIle8h9$*4-|I89xx%ahm8t&x{XX#Qa`HFPoiqiPz-2Ttna9Qj!4eW`yuAj$HQVS z%tZz8BqExMI8$*Gj(I*zQvtKB)Lyfd9u^f4@!gb4s&OXcOl_Cdx7WX!&1>a>&Z)2% z?+znL>8V5pi1bcpFQ}bqO*zOPnC6zYPneG$-zx7Co)L{tn~}3{!bQ#qWr+3a=%2qn zKtw)?1(|4>+&uIistl$NIZtm<=`G51xx<))lt|p675UX5Gv8t(wzh)0;N;;D<5jGQp>72oL*JL&@Ut;KW4x`Kw@O$rH*Mowd03}+=~8{V6o(GL*zu90ctp!` z_a<82eR@yd&X$u^^TqV6j*m+Cn1cxk4XrZwNmz|$%jntNoy!{bFLR%y)6mTDLl+mP z+r^{P9fm6|T^cQKschNcE<-%w+UDZQd93;y@kU)%5cY@_3cThcpk~{SYvF|_Li!<` zDjlYj=3;b#8qLL$6?hj8m99V)1StqJ*Zx7`4K7_qb8)>JH|SkNW~_bz;jCU5h7|U< z)Lay=!?5478X7pYR5yI1PP^5%>N8jI0wPL%!@CbGNLE4TpqA||-us*1pYIEea~S4V z0s!Be{-5S3Zul~lO}2O4|E6;xF%&PL6@CMeyqOuI?n{XH@Kap!lS7x{(hUdW=jnCB z3UnDoy7Y3LW~nZ1qb_x;YL#wb{tV0bvg}HSPK)Jo->9?eb;bf+W|7WNuG25o>FDIG zjjOy112aP72eL2wza^5tGr${56AN90PW8@V%iK_j(?6jXpVxt|1TFCn5kfHPpR1|c z;h0+E(9iebWe!W7|8D*sLw1R3sfBMMbLaOa^?~b5=>4@1 zVv_TOyRpuW?9r(ZmHNDOA&6S;fxf^Quq#feyvzxeH;l-UJdUr4FqO+VV!ofHVI$Zz zw;iIsdG?;;A9e730?H-ed5Xt0ARBDF(3HCFXm;MLLqKg~G4j~9YWI4=*=(0w^ZtQ1 zeXH1W1)7WJ3o@?XDbU3377S*xnrnm0S>zS2Vx2`AXI&9&X*_!EtY^@?6>&@EVo$_a zT#+X35+er^FJp3;-OYGfy46RLf_-76|@ zV|RZ}KimWNjwpR6ErFS=YLdu%fb~>q)%6LAdbKps)&D?Um)y}sC_5u*pXfQWr@Kn~9sqnte#B5rProl245wVp_uScY zy-Mo~E7gyvQI%fXKJgNy&xyN9+{9+E=!s2@o~?V6kX=`N==qC!+7MbY01(L}^##`~uFWXt~CnkMvY?Qx$&{Ye)8FVaYGCz*_(l1#(=M zY7o4&wDui@Eht<0K!rdhgwonoYkYy%kDB9TGc-F&KE>`~ z&E_$#lXs48<@e-Lmx}R{jH1l#wQv=TbMco|)n%X_46da|lv`H6NJNjMmKH0`=HjB0 znLTk7?M8Yhf7!kicssID`-leV5DY#$g}0A9CpTp-qJ`i(lKHgIyPGY~nTo#J%iG$7 zZFBdG5|yu>3XM!+Pxf&`2%o%j3+{TEoq@bVZ$DjJat+a8FbkuLABjRUlL1`-T&_;z zLald>sVQzKI{94BAkk$`>N$_!CwtBk@h|IXem1D>jwSV*0T-g9s)wNVfp`XWsp=Q> zw6JnF>pjHg7qFqjY@?s;$am&%lVVtR7T_oE7iHPEOk{+r`%`5{nNxc9?3d>^H2h0h z)An13rKaX);1&avZ~IhP8dG*u(%>&OAMdF6Hg&duuInwM(>#Y^JJ{4cb5FxwZ8Imp zduHrOmwR?<5kG!?`kuToT7;TivhKm7^522I>0x?g_elWGCP?(Ztf`s3r@xD)?>1ib zo)2_{@J<8>wBk5tupvx4X4vB=xZU<>V@&Or zlpSO_A!}BM&WQSAO)5wS6UNU^OFfpRJ}{y8jdQig&nVWK&6_kAJ^k9gH_q1v^;Vz0 z_>)cys%c9@!{K*35{Oj6y(mmp0hYOVjeYXv{*px8V!`MS|t?U zkL?;wi<)`wuWl9W3d{=m!?AYNmD&jt`*V7A7t+tYFmxBE=yyw2|6>3hK6bNckBL7?@$ygT*-)zy7@uXQ_m*#@WbmC*$! z{+k!;zWp~oEUE3GbAc<~JB_{NSlTt=_EU_Afx(ZX)LQ-^;*(PUA$-4>Hf-CP8w zP*n0;%$eVt?3C8!*YtN+{PaDx9smF^05G&CcjQ;R_Z{@0cD`f8yNJ1*N<^RM1&*-m zgfq(QEify-QtSvRix{eC0cClQJ#h57vULjc7S)6;oLjMJQ;WFZ3+1e;Eqkt^(aJKX zu$9XvJR_pxheApSd0ldtr(|y4c^wGHVX8&tFdQPH)ihEM-&MSkznkrnLHu`5;ae)$ z!27Io%o#+v1X@|=T%d>h@m9XGIPf<(uiwmo(4gKaaSHK)WFo))9NmxSq;l3HUX$?L zjNqA(2d-XO*tgKB8tP-*(z`03N_a4yBh5E`Wx|Sw9>DyFA{QfhH&yN>qVOghNvNQ!qammG?q9LRBqHnvdD?DOwZyfW^2m-iv~k zBqwaO$Co2+PkV-!stUBRk$1gKS=GEdG*O}I$LPpsZ6)(jLd;i z^kr(Cjxu3$k`qqw=Uj$i5l?-EObqG1`X0=-t2ZBEHFw)H_YZz^ZGUG_L0xay)ZLjE zeC$PJj|bV_O#6pKd}87hECF;7Uj*XEsrR_tZ-?>k;CvFF;s2xROW>Ni(!R4NBo_#f zT#=wAfgm7SKq?WjB|(tI4Xn7fSI|)Rs->iADp}7UG5r(-0Md z#SWw!T5XY*7M<2Xx}jb2{jc-A^Sz%xNlwn)&OOU>p7sBXZ#{)35EINNm3=7|$+bZE zH6UsY22z{i72b3Mc3aKsj|@=ewkfvLun+iQH%~~wJ&YxW!V;rZyB^3MB^iy$HI;3o zR|MOVt7O9FqiUCSgO3q-7(rK|>4yKf*ztoOlGO$@9hUaCXxyMJrP>D5me>=1M%l*I z{XM;-O$n$M+gbR!sdewB+s-N50F;y7k*RQnh-~NK4F1Z2blU}}a&-sN?b-=w<hlVGJ>Oe8w$2z>ogqYi@*LIo`WwucnbUd=46c0A-rgmoWK!iZYju4K{OM7XH# zsFKLr-Yi-hkl$GHxtt1Mf`UxIc@Z)M5rJ;Q9-?zhr-TFH|A1wboz4}Liqia;nmQ-E zvY>z(cm)brkWDnDVVWh@TDl&$oh&kZs4O_CL_2HJERUlmxnx4VcDD6Ld(8Nnb>r!PQ>=*4mX*C|rFyUWg!?qv;Pkg?eLQ zy0s+2RhZ@~87n(xFPw4uD=B#UJ!AV=?>K;v{uMG}e6^-NCM>HoN<>@*IZb~^guApV zx7Cp0GoULBTNT4UF{8na+$K#`2ptWwP!&T*V|*pV*xEPY3{tMe(>)pEhSSq3(Z0WB zBwbV*E-7RA8Cu%#hay8O$9^ZQSp5o5b6M%sqVG>CS$C3CJL^s;YnHu^2>*&mO8Q~p z9F|rTmV}g)gc?ia4gAItXIK-r=!T%|53D-~HIqrz1DBTE|2-t2DPq7%YDtRNGX>Mm z{ssIRV40l)Q|+E9PA)sV4NalAUtOoN2@VckuBT*-t1uBA;VOxMHnb$NA;4M^2E|2s zEG4d&YyrStJW&Ny65xvD+btEoiN>0S)+-Q3rd4ubv49)Id-k@eteIs`P+J&yH%by{ zyR2MLd(zz)Vl|SrKyWmUvBzs#JCz5TeLOB4Gj6GUKq-+47uk)w`tWA(&#aN=4Uwt8LpHh|eox$jl>m0T~T zC-Algiyq#4Sh_WjM=#@SSCM8U*yiAGTj8?%%{ZQ?G9cwaI2Cv~aM?F(U%Ex@@MRT`uuFSHtO@}5n6 znq@q^SXVJ~B&5OIw59efrmZZaeGZZ!y1CII|icfNp!CiKUZc?rP! z!u~fxwl^eVMswb@y)D-DSB7vT87<{?Ohz3fr1J8VJa5epR-V+uljSw;?M8d7MyU#$ z?7@)MPv8S=eu+7J>L%;^)@wmbnF`_c?#m8$R)x_h5q;^0jvijAvVEHnbFuH03%iOJ zC=<8U7KU-GpK}*v8;&TX)~+N2Jhk zW$Zx!={b3_G~m8z2&>V4fb^v9W&Q;?2MIUQ$3;Pf4oIMyBt(*Ne^JmFD2 zuQM9Jm;_0}C4N5{K)9~{MgA^}NsI6>Z@I6!$qR&!dAsL^n|y^BU>f@Gy2&R9f=>v0 zPb#tZ^lfy;mre^HCJ~6geq$WI)1hzLvPkJP(i215SziICk$Ee`y*mU!hUHUP=?+Mt zKnoI%r6)qEAZ_Q<6XTploLF~539~dHMw?ZxtAG4jElv7TnU1Pqq!E7woGUWxIDwpEbEeT^vgJKl2q|5AbOO8tZ?I-TIVT%u=~brAt} z-nQ)@1f1&v#Z@&zqd~lUjSDV=&W?_Bg28^P*m4QKw%>wIAKrHWtu>lp4{UwvN8v5O zHB`2?E9``1p_PKS2rcv;;uN>DKYC3XhXoKr3OsF4UgvWUyNVa5gIA|O7FJnjNR%U-sNjFJ2nt9^m9R=#1tVwGl7GR0HjW<`76;DO{81Tx z3UYPRm2pD+^u+#4>6O-$#l^StoDuy94mC6KXOzZ^iC%t9SvxN-${E&Aa6XzkyZ%Q? za(@jK5c`8t^P^I`%0va54-1m+DK-CA0_ae3iYRyokPjbXAdMLFVdX2lh6pXtKbK-B z94&z3HJryCM`mEXSas!eR0+&)kKu>yKAgx;P{QAIgNG@>gw_$I2R{W7KOw^8A7wwl z8((*525#37Q3?@m2rXD(gYy`!^ytb<;I$LaE8r_i12uKSO54v$yXoDvaU~`T9i_DE z-o>ok3Nz_DiB^-vuG?Lc2P+PGz4aF*ahGj~_5ysZYptIhZRF|3k9Qp!!ZoIv84Qqk zepL=u&tT%!CAxP}zw(HBaPN$EDXL9-X8>&PpprRlf3br(LOW!-jnb_kGmwxilt`zu z;5c)}9!W4qX;Xmi6=@+Q(h3o2CejY>28_fhXfN{|v`MVPeMmTF&0rS037PFTrLKMk zg3v~l4(p6|k?ny}hi{?nq0&(|14mn{V~FgDKLlG2QNpv-n7PuGV9v6} zwEnKN{h_q4=Q!5raEiM_P!t(Zus~UKl7sjuiElE?PoM*g#jG@F`%`HOO0@l@G+jxx z`IU}>IP-j^1s-RYvTCkcKjTuezisZ|k_HY5LLxXzbYJy-#`Rr$6dm5M%*G=J$v9nE z@Ze4V;Nn2jim@O$fm6T+1$uCEyN0l8_||n2r$AS%vjIR%#tK*FE9i=rjZjs_YAI=* zAiW0X=7xN?NLt4yYu}_K%_|y{@XID383*HpnL9MC$x!yNsem;P9_K?$oAV+ab+?h_ zo##qRrSOlNb9%qD6*T0PHW^;;xBwQKs3FX3_ZSsNkdd*EankBWhGAO8ch$fTHm(gL zf(N=546Id-tW}JxB}dkd@zR_xZP0Fa(b}##ETGUe!RdOb86J)n2_>|K5~^E#(@%bc zzy*i|9Ad0j+a`5?!ZaOppJ$TSXHACq$%MBGNjB1a63;pbwy7#jo9rytbZ`_whW1!Y zP(rkpzgD2tow4fL#3h7fdLuvC8%cythv&sik?2pvI%E)17B1lPm>8+pEF!Bcra!q< znAyI$7&xAC7}a2y1#cQ`6On|(9uZmv=N`wOF{-P?mjn;;-d)I*f8R-1PHV+PnAYf^(Bof_@pHyuwdva!c>l>9*JFNoXb_VsI>X512x_7l1XZjYO#utG z7^rz75}M1U_2_8FZ~n>BqL;*-kZQDmfQ;tYqoe>M>5{gsJsZ(b)ff-egYfl@hnl8a zj^O;ZLrwXu64D+Ps{1CU?NDS@({js^#uGR)S$gb7-yx4Q$}>0Iq|-!R^B%JLg6(t0 zwjHtu>?-?%IaXoMkFW;pb{?udP+`qeU5ECImH?|VfNTpTjA!&h>rwxi>DX(NL;$V0 z6$9J6D@w}hs7^G=;Q5r%7K(G>IH2d9na(F*c0+G@v^;dz;Fmy|p~UWJi#Eo~C#;lk zJ`l#x%E2!{cdSuTn6B|S^FKjgW0S#S;V9zvLArsRVZOVXl8teI-DZsjWe=BV>o5vA zZB12Yk12CPi=|}Q$o4mtg#wORZ&2$1xwmblmWk!5W+iG9AvKkaF!n@(hc*gWpLr^ENZ9ABggAt zbbKBG+HU#?hlN&#MXezMETKfc^U&E7EObi_xJpS*XtJF%8(ClA+C+$Gk77vMo2M`s z6jrAEX_!^SPGSC{8nD;otDywp9G6kVv~E`PzZG(>@$_AuD2p>HAymWLl%=TxVmTfW z$4$QS7okmbRm5`F%{cuHPxK^5)m=I!*~q;5Y)XPHO38d6ZxZUmlh=MY6gyxlcfy6e zY21)jRhr+JzliwT@bAn+%lGNF>?xemiRsDAE6+}yrYgOis>G#9G7?uOrm3e3`6RpZhQ$aPD!qhy|8aKu1%)YgHAO?E9;2T=6ETBd3QP zn?#784z@@q2d%Wox4)xo;H~VEUuh5@W``+NJMtIhYpa_ZLM&Y9{X^bv=&t;i zzjl_cJB5hM=5gptzY|f!it>vU=MKD7_V$^W;XO?M+l*?5K43ZzU9EM+KIt+&X^j0a z-(oa<*oMA4m!6vXmHWK=?6~YZ2!daMg<;-^tT3T_B6zxkP#)GKz`t5Vc8E!PQ~)Nw zyP2`ab9MV;2;R`4UO7q3e{kYDV(O}P0y5a81-R=iuCDbDf^X3fcis*sk8=@i`-dll z^|b*fChdx7)1Hl=o_1SA4!uwCuzROd;(yPHz)aS*V)f*D-)n@joDxOiehvqKwm8Kc zr`8*44k6JFi=^$4MXx#!x=|NOwjFYY+VjCKHUt3n0AkvS(y>z+kKx!&c@79?+o1-T zs=0P}TdieVZT}0k_skq%;P|;vhYjCT-;wo&=AVZK_KUPH*r1(aPErUMYRek<4XnnB zvhcm3mYiE$JPNftC$p;98Z9vZ$5Rp6&_wXGEb6k}b(nLFYYrndY~!4EiynapFxci2 zvLCKGxeTKq_X?QlZXo)QVS~25wqoeq*DHoi{UOwouZEWI;C&$YoDE-{LZmvOn>z*C6Jp&RZg@ zLdyGJC?DR&zT`b~xdm1Z^LG3_AKAyv?@qhLzU_=pD!+q_^P8STrvhNuBZuM%eAjqG z7-nFy!zpIc=<>vt5eUC8P~aHTi_S2@yz>rEzH3Kmy*`BC*6easI0y$nbQJ zfbM9H{tzYk2bSlqZCja!h8y(N#JA7zD(7*^s~Agce`5$a8rmjFJMYTju&HTs{;P1n zKJ64jwaa`UB%9@4%TRcqGw)vfEniOTK#l;)3D!3>N9fCm1Iut{PEPzljtItIu`g%R zA9M6=@l%s?5)$=>Mv3z8*S3R1A+ z*qQ^vE&|gcl8FZV;u2Lu4jdbD*t8$koDft)77~SJ-|&+qzdH4Z{mCI%4N=a2oo6d4 z$xpGZYn8wnYgt#mB!)Z{TpA{}sP-iDMCqI)C7G5M%O^_+=VdtOc+%Q=jKyHjN~E)r zkYmdE8J(4kZ#rx0pc`x)a*brAShF6-)18CXtZ8g3vQl*)rrERf?T~k-WMRdMAe)G0 zIDavgC+s>oyrck{;5ZNaxEIGVJXr?xuU!}7$uhFtot5c8oX5C6 z9Gm6K%EG|fb)mkjY*zi0HGA+(8Z(4LIRja_?0{#%OHh;#@5zF8Ha^b7tc0ClTpWLJ z71vb4jRTAEMj;h&C7qJk!;8@e){u2;OJd$3BD$eon1vZ&S=7jdIlOaj1K|3{+zCMy zF}4lmmR3Q_OBE30HrF&3y)8V>b1{vB5B){o3vi0J)T*2E!wFMBN8xNOiU zk?Q8Qp|{fR4P-~Nt;+@<@SluLwWByQawHqhK8BHOn50A#DA9WoXHkN_Po&i)s%{~q zS*=zaZBwS7KYE@ga-kWOJdTHX^JqG+@+9_YUp5@c#{91jeo=~MsMJD^R;ny%{*i1o zoh`ua+0n`tj$~_4poGt9X~5879gJj0-F(&ZR+R0yXX4#%4`%ruk%%p$H-ls8CRPrrG6?>Uw}=s`ltKRKR05x^ZAYr^bQ){<{8t z9PsHT;K1Em(5jB72(?`|4hLbMfNR6u<{QmdVKie78CDK3z9}KiX!R^C?PXaQYlI^u z&zo%~$x-AQ9twsEI5<0kBVN6(VH(zQHo>kU4D9{o|M>_Oi8#&}EahwoyOgv4O8|cO z9&Iv@A-&uY;R;`jVxV&YdS=PqZYq>s)&|4hStQ&WH=Mfqcmom+ZNgH>#vT9XBdqeS zf5khj7AsCPAL=mZx_F{IKQX;B-%sRb=lOelpwp|=oIn6Ft(x$kFOTkjUKKWCh+{%} zg58jP#@{nQiSo6aAd1M>;8UFMK3@(&fTL!sDjq{eCH8b9yc1VzfToT!Huf}^Q-aOJ z`oW!Po%<6xOnKGP)n|e0rCo9~V1^T&n_M=5*%!;%q?OEd* zgs93KuWE#OJWF6j*X|yZHK7(BmV2VJgw`zXqbdJ54`4#qK6b1YuAG&aG25Mo+a>^&>c3k=PO@b%BZmr_2)m)` zzmzSQYemIDSvVUusSv&62?R zl9fQ%p2*sKCJW*%hH#S3%79)G{U3_GR+O0>4K#Sw)a2Dr0M%_{DOX|0I+Hf$oh>BU ztz|oG^9$w1i5&7|h|}IKa1^Aq3m6Lw1F^I*4!z)X(MGr)%`r|Ioc|xPZA`ElC$nVR zV>M1;C!Fyy-MlorF|i#Ft$LY#k!1W$b^1(L-fsjMVHD zA$pH-I%u_X#A8fjX|{33U=E%FQf*B48E3LITPyb&pJ2(N@k!lm(DNZ2%NQ`SyR=;! zGGH{aM8=qD%EGZx9Gf*_%mVSUYePqj*({MX&IWj)#JnnpHs<1m?AkEe2x4zuo$oMU ze=(QLu^K^8%*!6_o3=3|v#8vt2laKhrnh(eK=7ccP{m$E;{_>9Zg@8$3SK=q0N^H?3 zOl9j=ju?yC-(yFNCG7Vq9l*KGi&xV|6Zb5`-zV+v z|ELxk(-?&(@}wtU;R6RA$j+^Nt|woK0vkU<`tlLd8_xISk8yo8Z2BFc?cXN2Iy}s3 zyX`5)L94sn%%O63Gwsl((G2|a{p$G4axIjQ=ArPipW{M^w+K!2Lw8bQ9u^<0z} zi^wjGhw%?}jwp}0zjl*>GFo|ZIBVOvuUfW+929SU&7JXD#pcc13@Y-)r2RWGWO3i)PZI^4;#DB|kTW*+1bXOA|`tR*`(s>7Oa$z4TUe z6$8&z#x;rKvG=&o({{(rmJ^0E=Y%GC8goOf9^RHvo!&jbtm^+})s>Un_TYYIo0qG* z>o<=h84&p*Kta@l>{Tpwh72McQ~d4yf66m}!);!Xcr!2`+^j)@S;%{x8 z+wBV5)vHl>FZTtiyK7x5PD0PKF<3lAv|WxrZ3?x@O+Eh3Yn1rcbUQ3Y#X_@)goZkon;W8c4jvelH5ct4V;fJpq~%0p z%?x8+c~^mL0*PE)j;2wMMo19lo_>^$Ew(QCk%G(Fq;Cqe*m` z3GmBgo7Z8$2Y#DLZ%%|BPUwh^XI`bJ@3h8)j)b=AZwY-1{rxG;>Kc^~?!55VU08!=_+AdG#+sg{_tV=7{6AUnGTU+q_pi z*zeCcsXor@)sxuD8&*Mm*8pPNP^yDvVRtblvUA3hW{sjD%p$Sol^=`6GaB%WW4U;S z6VEt$LWO6jyoUiU6!hE;aCwmGfkFb7E81lDPfzMqk??f982*5JC*-;&Cuxbs7_D3r zLjEj3SX=09Ubbs&CnadrR%QMd97yw2x7x+%}KI0WFeBd>R zNOFC|I{mq>$ekg&;onXB{B4>#ycN-9Xe>Bej2xI}la>^(DJay*^#<|f@9iv_dF z9#}+GTWa?u0$MgETo@C}E7cR?fq=d(zFV*dym@_#Zastp@fK`#7V#*%jO`oV!3xGY zPR>(|;N@n8sI;o7`K3jt9*$`E2pB+}P`1bbXJc z3Bp}G*#6Omv37>j#6`IAIlWW2d{lO>NEU`_VsOo1$B zdtOW#T*-dvO^?3P2Prga&x;w*jg8u7;O?^=&y3pAQOMDuFcXD2j;BX$PoS`1aK)(Y zNfe$kp^$;XlELMpHUkPPOeh#pSm{_cYRg1nwGM?@D6DZT9kpelutA4HHVT_fORxyH z*=Cc2z%JWUxRVOnQwXQu6X~{qtsQcLkLh2?G{W-jik9lK{Y6r~YU<+pdjzpr_G zk^4&&rve*~d;PqDMO_&)am_mT#?cd5wVJDg=jjlv?_CnQQL6RG5&H9W6zPC9-o@kE zd7Sd|AqY+fRt&s(kE%jEAzWVw?`Wjt=s4j(2>@AyvDjH zsHV=?wO0$pTk4yqDaq*#FhT+edDsWkIu!Czh;(F(dbiXZXcr(3!ZwG* z&(er7;JGc&J21-93ef@N(0l_lZb=T`&b(g?CQ4{Ivh;MfzHTnrcmxi^v(re}rW^nI zQJO8`oIW`%GGcbxHX;bBKs$5cXv*~2X$ufaWr2hW8aJL8+d7XdT>lz^ZQ008?~%UK zgFnID==4*IPp{^QVD93Z(s3`*FMd07=4i^|+2?qjF&sAdO!u|_M=9)8|Hcvb(UeU% zQaKgpJKhE;*&Tm+^U;&MO2obj!u6;fd=7kL5EoW{gvxWM z?3_Xg^I!`$ziE0KZOi`DpRf)VnQ2fab^^vQVk0V-o<^X|uhG2Dshra(yw0;Q6c0m=AhBbr-e&3$L)95+oeMX*TxFAmC9M?CY*U?GgXL zrH4gR?x44zgSPueF8xvT*bpuOrnLNBKh3n4?{XK7euvY0(TL7Qzm;jL-RCaq8pK90 z^&09b597|Q%wc!YOW)!&6D8R8H^1xBFGVkZgC-{7KGlBDrGcWd0sMR#Klk{H4&TO^ zNNuoY7utD=ZRacfI2wb&eGMGchyCBWi{^ceb8_)AqL;xHoge<$T{PhmJWC_4Kk8ov-S;RdwI%eHFo4b*hw8qpfKzSvt%x{H=y z$NMg22Wu6(R?9}P3PlD_B4hiUkhf+Co)T zuDcXzU&V=&=7y=X)l*BYgP?{jtsvR6z!F;1W)WI) zoU8*&ZfGu#&D?W`l3c}QG$Y;a6gGr*=T^g3x*SREo$!)^ymJPho_@;j@joNgf$x#5)PyIG+Uqm3Ig5;Z$Cve3p`97@tQ{+>{|)h2j5lp?;w zL@H@5B&W*&9fNl*UPv0ABF&3Pf?oi&caG4iTauh3Y8V?Q`E{xA^mJb5JkGB#3QsTP zWfyTMVz#ukh@^F=JwW*r-pOm*vW)cD!Zk}t!xFN1G3i6<;zDxZh+trOsBgJ^?eg69 zaW8w8hdIT_%Z7Kg+QL0{PU~_K;59ApskeV1UmIau$J4IkdzMM9%VhSeDfWpR!wS-B zr>IV$SH1p8WlWXi#|b#LY_ex1TzH2!4Qgr9|HW?iXSUU>mjr%qy~TR`Hy5h zb2KHSp_oKgtfwT?1-4Zrf)>`B9FfUS!K`~tKzVr6k6e5+uO~A*uQt61fO<{iZD(T6Y%qM$IA;2)S!WTxoljG_R!u0j%T0*cdZ9 zn4qKKeaqTNM8|;kH4#U2;gozlmIk_9qd;=!!EgOdTOoxVM@-Kyy~G+S5#JGMJxET5 zjEAfRBL5=z&B?w($yuJKP=KKaA*BMoSYqJ=46kMl+<#Jmnc@u7a1{2dqfKG7Hmv$Q z8#mN0uq`8L?Kw(#>m_XUD-UD>i%FQn*M>=!^2e0$N)}3H3W`33y?|bU#vlhPt_3;; zy3t5$&*NeYp;OuhEJ+$u+?E15I#=4gpORg9zF<9R+k~Z2_Z<4>8ge-GZY1@J+Z)I` zVb`O&rk>4gTvhcv5D@CCE>?X~^-a^lQ9eX5gh$!0S_tLR6AR#Soyi$qqAbkhQ=&7= z5ODyl2d#U2Boo8CTWbWfooQdiqSn|~g|}`d>$Z~CRdZddw6-mzeN_TW+D$)!Fy2c5 z-Tnoj5DC?~JN|You!N5Fq*G;no~(*!kdE$kH_8!B)u^uZ0sw>K$z#nKwGA(L@^~KR z4;)0Ssx^;~#tiKxg5f!p!tL98yH3&5^NTN&=iTdLuDQK0cry7No5+U!)=YtAKi(M{ z89Gz=VBLe4?!;eD>&k0fhQ0od|2AJy_RrpJB+yQ@aQO6XD#t*jAR%izulNOkTjyt2 z7oodnuOK@N_cwrm&NM9Pn&>}tf9kEwAGQ1GrsB85_^^~0*S$=V&lA%PZN(mD z*bT^@^9a&A4(swCiI1;>XgPS%zmW>s1$zs+pmjYtRM7h}xp_FnNvd`@!N;Oo%7G-5$3a8(uPL_xKDUg`;i91P_;}wg?j21>8F`(B1d1fiMpQSmuP-vc z@vH!TJ{sp1{Ip+1j7z8p6Z4Y4t@t!hrRlm*JF^;-IWIGDksB!pi{AVh&9(%<`7r<_ zT%qTY72@uTl+6ATxk_kwg#`0g{3@2~HGW&>NSJuwqm{$MDZWYM^{@;qorPlT7`NQc zWxjM5w!C;WrE)j&3%2WpNH`CyI1TJQYZPP7y2WUd6ns zwKCJ=!08dMlCeCPZ|OII3EYz*f^mo{K4QJ;cRj;n)Dpv z_>T76-bLQ8AlrC#X0l1uT2A7v8rMIVapz^8;i4?X{#i$4gK^q4>Q}*tvCM@2YxjaYD3Bw$rmj6Wq1*599*zqTe3F9wugjE z^YBz;%!xu}TPRMw7}TXleR*bx`CUcQK?VAi5{?4^a>jYJ=?c``TUhWF1u%6@o%-V4 zq(>w;ouIc>kx6?gVFaX2^XE%}lWV&4A4kQGgNin`^2f0{_;;g>3w0iSN59fmjdW|k zd1S-oI`p<0b}&tDy(@-idz~Eo5G#*RnLb31_Py}UBcPOyH%LmBDtEN&JN|~Zq=d_~ zxC6jE1L=!|t(Mf(kx7T~s7~%_HClI0Z?j?tj5>w^X}#xtzio&TJ#_>U!zsP(EwT_f;e?@Q7U0s8dfVIJ z#iM87#wYXuBQIpw*oQui2Jb!Cs!u|v@X;wDKrah0_eCR~8yObF<|TMm#WT?u7y01( zdZ@Kug9X$4+Ht+{gAdXBeOjbp>-o%Zed-+6!@og`JU6v(85%PWO!j>6wXFd`@akrL zwtz$4fm98TVO|Cr)1>!A@%u8niDT^@euWJn-qIuG zp;Rs(d{dwFcT)3?0)1ma10(>DUl7sMSWgCPm|jUE6>_CHtz?)+3bg_M{uA zvVv6Io;0BYR3>4GH?lNcVY8E-_x!DPFlu5iM#J$pJth8X)|TDm8UPxt5joEL3&nyQ zF(QVIm*&v1Pr{pU$I@1sS=n^kDhRSMHs0r?0q&6QWovjv$>vItu3sXDon5NT@^|toi#sP$jOI%{)1s(q*CH!l> zjL2o)sjpoGRUnKkGshBXgYWwfL=Z&TKYX7Heb-j|CMWhUl6&Uz%nouytQb(hL#TFu z;&6%?(t=&iGK%S#O2nJq^A{gM4OHaQEy&TgWh){P8sd2+%*x{edg2qrO!kcgL2rv9 z@WSv0!mugZfH|bJGaq8oT4x0Tt`KaQ-+kE)mz3Dv*A*QEc^j!Y%-^mbnbhL;%ZGn) zJgB3D111$R4fcF(xNfsSN3$yj2SGbt(A%6?T&=k7AY7qUEQ#2r_lU8m5JD18kOMgH zp1gn1aieNahB3%A&s@TuFZw>4A3!g`bkH|fpqv4evDXtkZ;qQ}s8UUX{T zZET9G?h_=CEQad5ww8Nb`JO#`Lnyd{*xh3x1u<6CL#1nn=V<5xA1xTgW!^I8Fp1s4Q5G z29n+_crG#%;l^3LxW^qs?}9Wa0dZmMar4s?qp{`$P>PV=mMq9<9;* zbU^CbF(7FOa|ce!K4i**HX-8~Jv;|eX$or-!zw9HO@MV1YG6NS~K3Wu3n)zsN6!3=>6LeBJw>`S~de9 zdVCjtJt$Dw1p+madVOd(d;fI23LQHVgX5yz8#O5V;#6vsRY~R+C_7__2;9)zidov! zN=e|rXUS;lK$VLrx3qdY5QRPtfe~{9+}G;MU$1v#{aDmQ9AF)YG{7hri{*~zuvp2f zAs$VLJt36-pbU%EmoUMokz42TJPGO89<6iWRO3IhkC(0Ccr-z_qa-q$qCxa4wNy}r zdZyl^3AQ;&1iaGp3iR`Cq)Qn;Lyzs=7brMAd8S9hW9MxSMeLrYo38gJVfIRAQNa}@ zx>SAfR>hVU(#*h-KRLFJU7`;nEn=3@paY0_U5S4SmZ}(ziJ@@+`7-|+poz9J{^LSA z<_TgP+nFvB@g^*8t8kF30kVTj$pJih%qGM-NjRGiyPw{(BLj9n<(ky888hQC zq?66Zq*kLmMc;w_jKI=ULoqxZ8k~ua1WIa|j=Y_Mc*i74Zkguo?K5Lh{Rp|B6+1!f zc$bWYnX1{3Ay7G%9(fI?AcP@WX_w-&X$z6&Sm+>@C}dF2_w>H$|SCLQlf?L;yP4BFUJCAotxsZ}k%qxFJCxD+0Pj^m0=%Nb5ZR zkfEVC5`ptY$TW4V+1b0{XDV=U_XbZwFBP_|@_GNCq zS?XNd;B3IM7UkIRU_72R4J`@uBs}l>DAqbhfDPw^4?%}(XR)de(KCLGDBL98-gW{k zT&@%Jtm1iUJe@bVj19^PtWJJIK?#kjU4SXdU_&7EL6D|kS zEbQ1z?Lp37T=I(NW}v6L$CL0H8u*g+1LP+#M?dbrQ;@nk0xunhM^?`O2csU8=^>@z z9|#l{yOKLtK+ax07A#H2U$A}DQ($S-CI}^QEI9x)Rh(`<`Rr;8;+q@AdSp!W*f>}( zt%pH5jPmSF(|1Y=_?3thL)llJk=9&ITrN-gwVJbQj&a4IKH76U*I(RIcoh*d(M?Q|= z#j!%*^M-YpW7LE(RrSs~tUH}6yw^bzX`X9C9zx+#a)CzVTEWq2{p7lnL;yynti1<( zsbqK3lt^8kl4Nr?pfI)fsQq73XLVSbO2XvfpB;b?5}-$~YQNZ2s30lvd7_NsQ6ScyQ}Zqj_1 z5? zqF7d^bQMHoILDY5f;8_X?7Fc4X?u)q#}P`B4O7hCi7uTE_qKyqd}~sv38rW=V|~Qe3Z#K`kClK+$g=Uy3Yx(>lO0E-9JFL5Gxd&T*>&&}X88=w;xF>180j zG|pDlTHLfL+;Ke>_p==$w;WV2^cFaZy7+W3TnP*cJEe z*#c|ahQ?y_5Ik(cnvjI68m_T#h-2Xa@E(R6`wGIh9+3d-``G;{(Y}S0bf4JF7C;%_ zD6ON2eG7FxNET9;hMkWkI{(B3s@|GKh3#92K4mYMpF{=jTkuipf6_$FznY3y!&|&v zMnsr?{i|;a5sxVtRy7}6xVLx6+*il$;I~3Npcvh;n{Ocqc5y3}IW@RQ0k!WPRGR1f*^T3`a`_FR(Ls%imcx=QbvB zn+;*sF^-|XU?srb3<3m0B=%{f3__HGMT!KERJhr2h8k-&oT4U~4K8Ye+0c^OSKtfe z;Wh_mQeo8#-cR)wdkEfvbSktuQ+FIZm+r=2HRt+zeYb*qlcy2{m^6@J0lVvC#sv~% z2T1OH2ibu~2(Th7lHb~4zM4?_uK=f2wda7iX>>n*dAp5!5Pq-SY9-#@Bo5MY~j(d zJ1urEyphm=^2%oLx*882`dt) ziPZtPtU3UweHcZA%$O&dj*HmmOs1qb#;&6n7Ek2)N2}-s{PwLW##%p3Iz<+V@#-A1 z4dF$VksN?H(D9g5^tVsVls0e=U?Lq7bethw6ItQQWKM-n!zrRCzEI72$>ZDB#xjt* zo+eZ_8)?-wP=eRijiF;Pqiq{++sKhAV<_S6ISpRX@GZA*(-==eM$HP=>jd$KllkL@ z2N>>FsmsUkdY)Fxc5Hs8qA*)IB0VAV4}VqR%NBIlNHFOIpo8gbcoXhVPfWFLpaeT1 zM3Gb=g>=_X)~rB)7!NnBJHxW14N$KvB7zVlU%q$Ift?*^Daqld+2+f2+fot2z=fy5 z9j=Wb@1KJTXJT;hflt7pK@HQ8jy%!l{p2@4;`cd998!4(N!lz|DRGeKBqhFwrEmTg zVb3&}Tlz=>rph#Xd@LLP%50+~Er~2;t1djSHwoZ8Z4et@!1>=4MgEJ9+J@2CQyIr-tXDEp z6`@4L%60X%Z`GE}R?wkbBv&0byz+#*1TPSXHt<5 zD(O6_uKk5P8?3eo$+Tb=^S*haW+f)V3J|#9L==`ooYBB-w|SZdysK#$6{K03>J>xu zj)|NBJ%PyVhpX%C!Nvdgg25tWipH5bO2%HVTa=1K^A|`EM)Sxz?LCar;KEd54x4D+ zxdlJfgN3Px_j(DmY&1gyZH)u7!94yA>?Y$EV4??O8J5Tg=Yb#L%%eneaNhR8IS9~O zq(jtS_7@1rS_HqyKy#`iHR)3Kn}q3!&_Pld%0X-v5mQQ_qcbSyGB zg#+K$)QxF@H|%AFTVb&E(;)j=v}{1Ko7D65{KBYEApR?jS-e6}3$Y}f5=lN0mgsVE zj~ddL%`4G$!=uO3@E z62LnaeBf@fly{*1z;;?Bu!?v!qczuAALW`C>^M1%w-_OEKg}YDy4|EJl-n0Tk5%^t zwpiRnIia4VYE&HzB;vO>%Lc|~wA^!(Ujd0B@?fBy;f*l7?H|bKu`xKA97TTe@PmOA zl12$85%`;j;_<)%+nntmNa=`|&NT3{wVb=nc4imx*Z{+`-Vz}SZ2SAtfw50OQT0qf zb0aaudP@T2Eu?|}Kx!ZR1hgUKI!Se-{g%XjRqs1Q;K2Lhfruy0jDPV)Ga*gds&IuO zGIkTz-tGCw;?Ba-K0!Q9i9L%vxfPyVy3^FLK1v*reG^x`=E-~2lULsP zmES&AgSHjD^rL5~rt$=9Ml-aN1r87m*D^L?;v|i$gp+~!{vZS%74;L43|&|WeU`|z z3hPA>eHQknDAQPktO|0vvAAE&0lBISby16#_Z=X)l=l z6$wyeCtepOQez%xgHA)SDXy`7h*;kaH(9{2v)=p~nrQD6`M`b=~=u-R0Yzgnjnt$n1y62e(7jNW{KEOnm1$7NZN(YL4|2NT_kg z#P;0R?76R=YqXnsUD&PIIko*gN<5~zu@(8q7!nih6N%@OAp3@?)-JsVT<}zEh|%`k z@~e$r0rorOD4Vpy6$feUN?8X7K&w|sqQ>AQr`wDIFceilrS7dhe$y3p>JDEzfOx z6bBNK`MQa?{W0l_=XiVjZvmvFwBw&7ri|lX)0~j4b#2nJZjfBhVOFQEyF1Ov`sEYp zP*LBR)+SV+S088NuYvT2IBZO`@25EhFcSCnkX~uqZGg03;`QQhaBv#1+ZW}R=I>~0 z&7XQEj8}OBUUoOvups6>bV)?Dt@RVAvkN{&7my{w;?Kz~pOMKO@@m7=T)CBLEXEr+ z0S0Oww-UR^*VEbrD686JP-mijy050S@sUdpD)zyf)AFb0&+-=MFS_z(J2-!M8?}Bx z1#CE$oMa&l!wPvJGZ}%5oD5{dcn_QPlan~uHFVdfc zJ<6#z$V+OU=GvjPkR?7!-C^o})V=0gsx~R)2Gd9A)Jcn;ee;F^TZb;1{V;XmRwyC` zugUwUSbo7;a?D?C$S7n``&D5)2OX&EoMyZvSiJB116$F(CAD}+>zCkYU%doX+J=8& z#?2}~PhoIwLXU2~nVD~Ey@kU3vTpgwS|EAAyKe#d57`OD6$Kc8!4Ic(AhF|#kbGP7 zVS5AzRV^;{0+5WmkN;yDCBC_`uvh}OpsyhL24FD^D=_F2zor6rz0gku?#aH5VW%~U z{>32|a^y!@5CBQV;`AW*#gP7PIpYf%u(_cw9eDpqbo+%c-v==5w1l0WRvE~#cSsnD zn0`Nq>>VKcFLK=jkeTH$0brK*oR{~0L-wD?M0dXCnigyB{g(9BxjMqnoobV<1UknO zOaf%@#UMcG@Rt08X;_iX4obH2d$M0jii%~q|r-Ag9YA++*7Kjg5$ics{i(z8@x0JX}Ez1OegIe8+yrmiq zI)&}8ZIM&-6_X~Q1eMz^ z-JgHBR>U~BHHk|VV+WY> zHW6H?&Kwi@zVu%gImJic7mVESKY(`fbq?{`?Q0mE%RZ(YiQIDwj`QP^4hjhm;UMZ8 zxty^Xb4Bo7Jx$8OufLzXDP&|*XxB41`Wf*Z&DE4Rop$|Lf2nf z=5Qg?Tf%tPZd&?A+`As;9XPaA>$hco+vOM{OcUHmQ;~g(q(sJG?Z6s3bx;T3gAc zh@}Q*Z3rQZ)3iK^nB{F+O-NiZ!CNq(`94axU|4Zvet`OtoXzo68P75QMm8jMJRohO zWbZ?gd7tU|nsNV=X&YPq24j&l1bB(QK&Q0lJS}UMb@wzP>nsrRT7jlhr>SkAIq3Z$ zRJF9UqJksMP@Q)gT3R(N7Mk%h<>jrL{mj5)29>4!|B&=8a81?y|J&FFwgYT1HgKT( z4u&A0+W_wtAbGY4qIRT18IV55K(^+)cE}TC{SiP_!qEhl7IU!hXh*cQVEr$m2D{ z);1^(|MT!6-%=sC{!me_)}q+AXWw4`5)opE&75nslaKP3l%;-Q}4ZZ+Srdc=fKs_F>CY9?-wo{;J+`b!D`) z`j)vdptIZiqaN=nJ>g5-l5uiLR75+ zHYO;igafoksRkf?zMYMQ-$zGx9IOn%C z#U9Ycx@d96Fp`E!|G=yg>KNG^`_j5W@lPUVOnJwg*R2{T%NNm-gHJ$k|4CDCF8K?q z=TmzJ9HhaV)-eIWbuwah*-m~+fFa#x5$x}GsCgYcHKgJjqLCFdleXso$T#vhlZ9PG zofUUL^@(sNpOURDo6V$v?a-EQV=aQO6T}jpRm}qx4N~0ExaOc68`W*X5&y)A55A*h zCy{Tx^oy>%JwjTzv^nU|_uo<)l#hIz0qi!fGjAF8<0BwM82`f~p ze`IF)6@kvfpZeBq3>X|u`2>-`I6xIKWGX$Z9wS8DJbf0Ls?kk->rQ9h{)Jk0$x&^Zu>OP&nSG1+{=V|m=GruY!S4$RXfB!4X^O77A$~hy`L!h z-J>B$>%J3OIH={4Nh3TFJb3B*gHekH%Cw6XhC7wK{_$?=YB2h$b|Wt99!9&dp|ond zC`bmdtjwO-?C$LA9_}BCDaMq&1De^eq_O1Kto#mwC_c z698$M`^^RGg{s|vFO^a|RnG|5 z^MNQ&z+C9GL$x?>>#FM(qJL19mAWeEloXyv@w)(M6|hx;w#1^n(8(~P`s;GCZydaq zUO`v0DWHD3onW!Qrp&UiM+}aMI+Qb;B<$$9c$ac8nIz(zzOIIg!h@l@RcSz75 z*h$z~*2DuWid`{8wKlxmZD0b`4tIjn9ml%mR<{;jL?+$J%w-vqlbP*c<`gmW${8ai zE@3EpV@xP>R@mc0GDgzfq=_U8%gpsNb9~HfFEg)T{}}VO zl6r!Q@{*ZAUZOYjP9~X(9vW0Q$qFwM4WCdu%K0#9J~H#dWF3j7g!yhmxjUI#e|mU4 z1qdP5LdC5Qgmn5<9>A?dsPEZR58lWkXmZr}F;$*ajnY)^45xdE$DL~l^}5%BUhXFj z2YghtQ{Z)Hc-%|29RwsbXZ!w*oz!UXouIB3>s2L}c!=wB*03Z^Q}S&6Ih8Vcr(hhn z6H;O-%HcLR-Ez$A=benn!5FPfT)*Tep$erS#8t_Ip_B;Q2PH#=O^k(yB;@?_+Gn-~ zo0Xa6AXB54g7e9Sq5{k`Th{?6lZ4F!u@#m{^f3$k%tKx#(!)G#5wc8b0sO+^{j-BD zqfWw+vUy3QpFHFv3ox|qAa$qU+9!vPTx;-dTMtj{hOF+9nzV4wBmQJr(36dc3Wsrm}sjlhG&jU`BbbC)DU1WL8b~38i4srxQ++ zTyP{XXQlshWzKdKsbh)BOVTkrK$a=q9h+mxX|OUz%zQ7CUa;wh%PJmv>)g36!CsB@ zyFVmUQ0&EJ@t^p5XG=6JJMBlK}oi2c~{?>wl0Mf;~4T z93&akos@=m-i|yC2a_xwoIrU*CeBCn^HXjwKye^aTs`4`H|@m3!7PdE*6A1kb?Zk(USjZ*85;*TPJpezvx3JZLFH`Mkz^1}*(U5kYSiXy zZQ57eYH15%nHX&2EHk-eRIn(8=V0bzOGlj_)a_=OSV)6imU|Au9aN-u1gRa24lCI~ zCRqZ{eZXb(JD4e8!nWMwwZfi7x&~p14#RSyKFvxrsKVnQ^IHTLrHAWVoBz2_^xf}k z{w@eUU&myifD*=*mk_ICVs#{=WOUCSDM-%dvqXauKWG%<%V-NU4ycV6wathUE<;cm zy=P@ott7P|=*~rH7gxy*W3YFU^t<1={yz+pDWolE(XX86XEPVGrou2Hg*sN23WaR@ zfnT7(f0m2Qz0eKSaf(ch9lqSgH~d?hIKDuXBD9PT48Igub`18~yHlSL!StZS*ym`` zUuz)7=I{{|584;z1U%=+a{xEWfPs)xCpoL(QhHK0R-E;6qmB|Ums%vt|K^Ysrqe>z zPY!paMS{E+;EKSOQ_z@&)opX(E1Qd!CHw#Z3x+HM9hjgh7w5aRMV!EhoIRZ7PRP*N zJX2Ak4jW}C!iC2*GE_V-wx>H*hd^2P+IW6jw|{krcMBv7uTwlaj>=3UZ{z3CMc9Xe zkv1O+h9ObY8g7q(jA_P3XF#@Fcs>)&*`TQYzCVirBf*=`2h+iCJ|FV8%On(=fd`^% z83@&0ah*G0m#g*8bQE&q3V#Q(y#=tUUA%M#U^j&t?&FW1&?#X07N1JD!|%nOn4F1! zHNBq>KnHMEqI3=%SKNkB3oZH&LZ6G}#V6sx4aYAW+s1qN^yM_Qrc)~WK3v{0-w3;= zsU;mlZ(gUt1I_C=KmlMXiB$+OHl4torb9`=U7L=lhcT0DGU3jE_XUY+<+dNj7b-iH zY99&r+QL;&skgnY9^wZK@xpzdJ?Z;~Kg18`X?a6}0N-bP51HIep_)i-x@&0b?KZ*f z6M?)*8N5CAN*ySUT%)v1`A>T-jy0~K7ioDy4$$6L+5}fHXjh-?7Sft0Y7qZFg8x6o z|F^mW=t)obo|n^MPx_u$&|&L*&nxM$^`7S=x6CW>Vy`5BFaiKL|EM3YY@`AKxrLlCGYMrk5Z zzYkI~{8+^#+7el?LzopSw_NhXM*3rwl|8P?30Gyd%N(Ju%w}1~SCtd2COadOu#Q!g zJuJ#enKV5vH*rn4?u*81;RKkVT>fV=HFsGOlQSs89vM?$`OQa^npUh}Kbhnuc)!S+!J3|$i5mQ@@iUV= z*dQ<{Oq31PH2(B^Npycq!C#@#L0t6P%P2fdn3a)x+*+sGKuIxveJXXGT5XP0n@Dsy z34^j%nng-Wm2)R5ciUJ-ZH!Xa9GYz>ynfjz zRgWTJ5iHahktHy9vb4J4D-Gp^bz&ifYFd6YkI$7c_J{Kbl_LbU~eCR z!DZ3lD@4<$9kx{7W%ExRqyy(XmZGrQHr+^+v8N91oi4)hZ6Ix`c6nFD`Bv#Qtu^Os zdiv2%L8;8rAXZiIjd}1EVldSN$=OKyvS7>w~qEGxq9&X`yzXSaw%+d)l$LRt#4w^%uVuI~L)zJ4^ z*bQAmO-ar68Yn@URF;IJjT%gu@L5v?i*8P!nI;==+dIL{LiA`(_T2MeEz_jxh#Z2U zPY!u=uxKL>VQe#JZm#tIg zWE7ZGh8s5937g}lz;SI95y1Rz>D6E){-3ouZwZ{Aet}S9QxdhhMov^XIgVe5oqLppq1Axfg(#sy;3MAbB6uyNFR(7sn_-cOTwb(Z>w+VL_s2!fjDo^ z*t+SH;Qo_9ZBj1DDxz2RO;zp7COP=ZkP})1s+oPYTWgSI`+kXXbN!gLG(t zrj-tSOCB&M3^m1%Z>5CBZdJvvsKP*rwjH3BvH44QMN2?Q37#B0>{?o)aSnk`4cnUT+0S^m3~pa!6F`jSKMGXv(Unbmpbh027o9b`$~Z06W#ptly&DdBf~}0 zitKMsk2YyA>Fyo#K-pDfp|@n7XgEZRj%nwRrAD-k!2JfUSbRXA$}>I`k!a?cg%se- z0o0D}EK49o@AA&+90K0C4_KLicQ_V$*rCX6jvPVVLZyZ2&g;(vMr3C&ih6smXAIN< z+*k{$S9^7bgCH==9Nd$`T5>H^|l&OVhDhfIOD+4k`?tNSpZu z*Vdcc&uD8q4>Sd)XL8lu|3h);hMbc6x}@!g4!zfG9A*0RI?K87eRY>WL}{DOFfA?lC2jL_4$*+ZtjlQkO*wEokM-zucVg zhgKq=r}B-6z3(i|Y1M46Cl{`QzFqS28Hh4UeDcZ04*+(SfQ(UW__Y>d?DtH);Jak>y6e$qNI|NPi{eKZtrF~^Uyn2ne9g$97@a1*D-PV z%v2Mj8NaS7ViNC#QmW=q2NUa`5#hKgWT#a-t|d5_=o|=IedCn)RiW`OQ1NdDQHM`V z5yrp6r^Eo8IN;3!R^WK3vLpU)y>Kc%qdOA*ma2*PjO&<22Oobr35N!*+I?m+g|RCe zQ;rWP-9M|03zd0@*#GZEr>@>X;=0@g*Tfz&RW&~)i*rm&QyojD1o`gVv1b&J@(u{! z3vogyfCM?z_uhSC=C;ms20htl#t5oUcX zNYXuPJ)cFQ@{XyB$TZ;j#YcGdWZ-dfXOz>D%c}-aemu@|JfYw(DXO<(L$fkdK8y=- z5WPdnuWbdg=ftB^P$t$%rdS7r-m3;LGg*~nawOKMt{I()`&7>x{UnxCDtwI2%fwup z@H1L!l0|e;h>`=Mqhc6MJzcaU>^Ug3e$MdGINj^63pb!xcp^4H5f#iPU{lt^N%h(~ zu|?!y2uGHAKOYnLyK;c0zg&yt11qE8+`1_EQjGqxh@7yZ64cib_e;YCbjU0Odl{XT z3B!ZM77P4P^HH+4U}+foQ}w7+=Z-FND^2c5^d`F1L8AO_?O1Cq%xfQ+>SrQVce!|? zL&!st7#4riI9@h#sh%vqldfG9LUz;68hXJYEUv`BfOI4RN+VJoo8wBC28>| zY0hw(LV*1I#*s^DoFqz0O)5#!`3ZEp_@s#|Qv@(z?bFp50}O_Ts4yz1cS#5OHGJ=> zKWWLuogZN^bgC478#eSMzW z1(-A)&X$LF%uwGO9_{OQH;=mw>K1;*?@he$ir=ASa7q%9J4v|PsP5w9ypacCIs`iq zEZclg=}F?FEgnu4RoRgPRM80(Kx;W{jxQ&FkcM1qAfT&4ELi2orsI;`+;9bO;t2hV zPQjGLAT{)DXycgN*&eVpKo01&c>Gm*q>_iX(sbSC19FiB(IPfLPb zoaiG7JvDeOidr_vS?2It-hS&G;zcQbl86p#d?4>l;@2KS+bla8hS6Q6Q&bxzPBPh%qJo6vO4=Wwbzni^ybTwX}>|6JPytDIL6L<#pj8rlpg>Mpd@Ke`fx+gozP@ zKp8VGh7PaFkuOriS)sWo^bkEaII#dL(LvkL*eR3!Gj{d->_7=)Sm-P!=*C@pZo!Y_ zWORE5K!J2|Hlnlp121G{rmFL_5%8nS(dXTab?L5K(DY8ZrWO;rT(B6)G9-9!Aj@P%-Ffa%RU5Nvyt1V zE$dbdijD^4T}Pgns#Da!@068Gc>Y_$q8ZhV3)mSo`$yX(s5L?D*#d~q$vY>va=Xi* z&=Qcdh)swFl1;0UiY)(SrcRW@EXgIxZu2%Qi8hgh~I`~NTEbarjZ%49GHX+1*9Z)AqgWdsNLRrPf zwD>lvc@nh(%)H=kUndsueAgy`nW(+01wtu|32FbGp9$2&d_GhK=sT0CV0pf+h9R>e ziWvFh_9Ay=`!`kjkWNfkZ}kC`w9!t;@Ar{0<(!Ucw{fm|&UpDHdCkK7OOY^&vfNtJ zC2jvOSgHWKJrs%53g9W)g71wZWDrVAd!_T#P`mZdry=eKa~5c1o_oH!P39#Eki{b% zMeasvpxBY;a6%X$qHQv2K7NqkqT*-MI)S%9G_^OnO9Yj*IIUaAsR;8r``RcDWIp&naL?^bg+~2fy0{=Mc<+4-8hTf@S3Q;X6XwZNX7LcI?-- zV&8uVy6xENo_8Qe!E_mPEuRTTx{-J&{b%8F3waju#JVc5A&aBmoYsSll0v-5+#V-qs-xwOdkHXG8NfLip$hpJiDr*!a zuE`rJhfle7eioxNF)E!~ixGcm94R~H?gY5E)C!!PvXz9WX3HFU9$raxClIxtR=IQ3T|#b9mvh5j3=&2H1jTEp+$(yGQUkY7t;Erc z416C+OJAcrEfW~+09y2ACI}j|52Yc~{BidxPyrHmE~;ub&F8*(!i^mFsC=Y$%}cu+ z2~F}-u^ZX5=8#9BYlh58Ll_kQVFJPEz}FEYN>Eb3T?0>|Y7Nk1x|w($AQ$F21-M`i z{A00?;eeNx#=!{SI1cI`cM`ROAOsQt90uGXJ^~#9-ml#hSU_LfnFHSde5;s?>_Ti# zk$xuJLl933r<&l-Uwd?uJGPM;xG5~)%C~C;780bLvU+wD}b}(}26dT5~ zE{~cnkJap98AZ|Md!z1?uQrQ1h1~3lOY5|&js#!{a1(EjR+rW+=@jFaVqMy02^_Z} zP7(^N_If>mN`d`X!5Pm0-7M+uu#zyADEve|I^Nlb^f>9Be9n;`hNt)$`5mm9uD&Z8 z0eEp}@dxYhhU-DGn(`DdASvJg!e=4(!O-(+cI@HvWZy&HTn|!(1p}ZpE28}gz8M0i zf)5@QVE3x|3zh9@Rax%H%I$Jme5<&Ix$ic)wRq8&Iv(%a$%pK5Or?WvG1!-HF-T^p zd8`Nn@j@^r%nMHg9{<8y97an|rP0!xk0AM}Xhg~#E~W!-6*UE=!4XZ}D(ZuCAp@@9 z>ikZ7&i1ov_$jbm*#RZJ^~^J9{rX}wd3_1)&d(At&%vI(#mLKT>p860OHA3bYC8DV zGkQLz-`5*y(Z8qbd3eSxnhvVZdytBwqK|0Fm(S!uzf0VJsf%OUdI+tDorl_H5H-K zRQRY5_LQS2$t&ek52%z9_)IAA0zSf<)^H9nb8QnS9)e`3R;q9O%V}dzocEb735qWB zpFQ}!>c0UC_z+nMWi@4`*|u&8ur8N#`^9jmzgd7?G@RET47(iFZ)X z9NMc|*RkO;b-#2Rw()7j*m-CQyI(5)E_KowMD>tH6ne|39Ra+>+`hF@mx=oaAOw{# zqb&ftyC!v(bqonBow@%2%p|A}iieYfSb0u8=%wXf^S`A7b6+dNHR9_+vBqfR%p$8cmt_W-zy5~z?;k= zWuIH=y2R)Cux{mj+tBehnIQn7Vk3q<$XGe7?c1)leay#=-r27Ik{10m74KNMg9E`p zXcYdtCIJfi2c`1*P}=%1m`=BYn1kw>njI)K3f34vrF1PXs@QZ^)9iS-g4)c3>%P;>OW zWCi}J*Hj;LXhS3@k6wU8dgMQpurZDn&$)vIM=AIGfkeB4W5PxUPG162hM3|@srjD> z;C$I`y-f%8Y^6mXJ>nD6%Flvb=!>=AHJfLb)pS_h@@-aqKZgd}gD8LRw`4%t4OCLk zE8M=>4W3lj=j3WYPHGCGw`TWq5-iEsSJgmRP=J#EI{-bt3+t$$lKa5Bvjt;C3hJa2 zN(AJ5Ohs@8k{gjBVkaM@PTGd)k+EG{T8cT9v{T(FK}HkS@tIUCZ+2x-`~igV_n@|G zszp*+EmU;}wuzgb{OiQ&A1O(JMAXq44N1=YuoDOeF1Qp&G6Tc!felr#SdJt8=H%1tLlureaFvMlnQeOk zZJ{Ymv(z{S@K?l8mV%CW^XbMTawqrbA3zI9?OizXRw{?8a|dEX_7=Inq(i41NJab3 zouNg;klT}rt*PLrN;6v2=Ibh~&cwhuwCH~dgy%Riglg>C<|b+#Eu8*ls=JP3ndrcZ zJ0?rw_zd)Kq*naMMT9<%+zd{J*TI}n;FD7O?KNuCDHk31@gf+jRr^uod;UrLL0Wu2 z6dr`C*GYA1-+s0GHuhvB=~d@hQu|(4yWddLp^;5{Qv2RiyHUWq7P+0_w8ZdQD#zgf zRV6~fJ#lxc8-VYihjBc@rUI$Q(K}G)*B)&$BOmP<0PHdkDhpW3W0Rs4MO-V+zKm9| zcXz&;>OE!l*h*?w$~-1I`K=M;i@-F&=I@s`xSx71(};n*7_=F&~6 zeg9OW^fQ`Q{CsNPA+@_+P0I}%Qu`Xvdnz10$GHiyB8s2I`2o--r^)ptpjZ$$J%juH zh7HN^G{7s578j+~f}gIy8R$Lbn*TMjMd`qGXn0;Bt$Ho8=_#1435RL{jA76}4mBdfB%#%2CGu57X5|rDUQxUTk5z)94WGsN zw1QRSfq94FT@)M@sZtdjV`veA+l}hnOEz1LqWwwR;o0qL6xS?6sfyOrA&a8bQq4d4 zUnfRkU~ zQYxhHZ9ELrQSwc+?AhP{z%u{>hG%*U9lj|DWl)~3qy%DMuQ$ij(#`DCm2gLb-&9_E zz*X?lILvPz4_nLA}`!f3?pvo_~XNU`;_;>t%+fl00cxTlh2IV(oj~;%1o+k zRaDl$*xFE8c?Q4*E2G={ULaf#j+_@_ju9f8A&-%R~=l zoEd67V`a2^-xE3dac;DSXcxB$vc4D^vb?whEFz_~X{B4wR07}#pJ>cbElwu5hyUv_ zKP{aZ;~@kkPRnl$4Xu5#e)Z6PJY7?3OG9&N58~7*t!wDOG=jT(`o}zs=CL+G{+B~u zGUeVsEKiTwwvN?rwKCx_7SZ@h8qW#@Z4iZ9C?ozn)qa= zjqmwvj2E2&NJ-O#36;+LaC0(~$G)okEmqe1gNrvg19;UvA}9-0R+9%r&M6~*noyZ9 zTIM72@4vbo3vFH3OCuNE?q_tDL8VC$F)%jWr-e_!{|F!3&{vhTC>3d$_@Db5ocb#* zPK}0PgMZ3;|8Vi9Wbm@NXJj0Mm{2tRpUH;czgYp9YgWK8cuGr)o}xpHV|a=dabpNU z1)_DSF}Oa4rc#T4!u?`=B!atoJ9nef6Ld)7_o!3F-3Is!vx49@1h*k{u< zZ_k*7koevd7q}h$Zk(V^i%U&is1Gse#H+~qC1qLMc#bkBuuC)I4>D41?^s( zmw;(Jv9t^=V1QwBl?CSN%c02mF7 z&3&eY zsHLI}5s5SAJe-0GNEjIN{613g$L013V`BuIlv5vwnXPj$Qp2aL;k>hr zx-Mt}XpTgKWg{p|SPboqXj{w(!badI2I;jkC3^U>32AZT%WxcNTKaIRXhebIDLO!y z#Ni9T2@%mG=jljnxdZgHaoy%l`wIBBU8SEY+Nk!kMh}_P6v8u+xXun7wmV%Z()Jr{ z`&nmOus)azXPHQ*ox|PZ z*fm0o1lSo@vkZ@ z@z+IMNML+J!Nzat(A{yDx6>kjb`KI(*xyU?Pfbv&uioWpZH2j~4VoHlXH|x~kP6m= zwJqqP=%1^3JpudScdY&Jz;{aiW>I@QtDS}n(nF7qWhuUL@?>d-g{PsXi|(gtb|=ME zCY%=k376Z}Im4Mp)v(#$1&-(?Hy!kj4(t6$auXfgxbZmmae@wZ@|&T$QUQMKy>F|# zhglNoI%%uiZ)#8equ)mBnfWaH8w0B2&E{oh3j#4C6XJFlFuxL@sdSMgpG&T(Fu za4@fFu6UR|4q|aKdr@?U*-Z;)eQ4Le21!`WL33Ugr|^bPs_WiUf8SGk)K(wlNw(GY z7JfHLuqc+RzQmY)WVeT@#LlvQCc4bl%*W_L|d``^nsk)zU;^@5R&Y7f2UE9k1iDnn5)BM)X1lsrHk- zEZKwo$WLDPlGk`Y+lK}*v0uktXBoP#aJdS9n=V*%WumT4eYny6zS?!&=1HbO@a4i! zdp^Muta1_-1&5d_F5@j0)Th@#%`h+95CK!v~i|!*eL(P+v7PA_d+ksprkM&SR1CY_(VQmb6(R*{T@xV zUvSw@tp4XRexn8`4OuJil6~raA<|D|=P%z!0@-pq&to6cF#$_6?GANahdPfIH){0Z zFlE}$WOiZaKb2(Chg+sK&$Wy;OKVf*j+=pwX~~8;nGPxE{h7m8O_C)Gz^!l3u+?Q! z0la_=&84vhMMIw9(rF;yhL$V(^Rm9+|6SZlcyoK-DfLyx8_XN(vGp!LAo))SUf%hI zuy~6Jn$l&l!6vi~6&k)jJ@mE>ci{zP6js(@fmK$f@htYrJucp}_I)KKljCp=t{mBD zvOCom#l;&`51g9e0_kmj5v$~cJjE8CL z)Po)39|flVvc{d)CCx^&L*1WgNx*ah*d0?7Lx?Do00zR2#Ik0yCe?uT_x+EwsIP$U zWF)isXk0hp+6ng=KivC1JkVx-uBoqsYx7cC!dcb$GkK*cp$vtc*9r2OrB}+K?I)vep z8;xiB@V3;|^&CURepSVf;BlYF`8;NsDj*Mgsq&-*us4>L0_?Rpfupi|jh|*>IF#1V ztLXFP#&RaP5N?E21ap6egAp{gt4t<3aCkoE@5kXI1`|hq8OEvLrykG5ottKuJY;E4 z1*J+39&qmo;1$^f{!@iMo6W~iekS;DzH(0!0-Txlqa2wtO)1`nqo;^T>Ts*Gn8hmb zW*j>iBaW#RfD8f}xSS;^L&pGOTmTH{Poc}xa@A7>Xd3YekKQg?WG;(m3Vbr$93lv zymXpsT`sq8!bUcKE<}fS&ZG2j*c8W@(DlqhTJpuB&UqC#IPjguWd9hx%@@-OF>I4K zINTH*HAO+@oCqpAugt@pry?U*4$3LvDmrj^2JWLa0iMH7rN#eVMpJMp#6+0vH4&KP z|DBC5|2tcC4a9s%d}E#ba1&-Z#$m_Qo<_@52T4aqU*_{HSR=AJhr0f8)k_iwS*n^O zft12h?%sq2?CC)^TlF-&7zo*<)hQ#v+$zTjS*Kjxo60^=uijW}R0&!3hcrxL;skEvH2Tr88AmldNtn zR!q6OaNFT9NQ2$4=4@|o7jo(m7J#ZEas0B{{0YKexmf?8-z6pwli_5RA>+ZyWU)-ZHOakf?9y!F8Tw)!ub=jLy&23uE9Z~Ja9S$-Czl~Jv4bOoM#9s4M^pdT3& zqX(?+UDm5nz!oL=$YM*UpDe<_-V-|FDzW{xA!NL?;C!f++e48%u!4#l4PlvwhPrm2 zJxL4moJ{6W`|h(XAWg!pMn(Mr-H@}ZNf&A1H)Nt;og}kM(PFeDILHzpmz-oVVinm5 zKr?yBLNCc0rS1jS-sKSH_d)iI^^$@db+AP`NEQ|WO5?Tn7XJ2Lz+bX1>5WqWeP#U> zJV4!kPwXQLyFz}FjoAyS$8WrkZd&+L@Ic^DM^aKNakqCh{`b z-s=GAXAkur8*4wtLn)I%C~VoZ*d55_4v__(WS*Cx%q37wT`?{MzrQxpqF-YWa?1Kx z?juzJ=j)o#7hpRAIel>$7vwUQk19@a*j)%-eCYYaO0MO|FJOj=@ z7#c7-kS@S>XJC5xKC?NP*-mDThf4;_!1VBwnO?FGFXklk9VExcEMv(MA9+|~$!W#Z ze%<6{7J8U0Co|u{yl zLW5np|DuniQO%kMl|Mi2V-QhI!!?xhM3-RCM-MQvsz1==<*NCB;mlOU1eYyT>fFzn z+&l8!rEqNem?cA%j0m@#*!=_&af+&GIY z!Yp657?a%eOywNFxzYV4DnHDvuTwC=Fo`S)l*Y2di@?py7E$??jG8r8g4wdfNpj#4 z_$)NX!7Mq^a1amikR(4RcNh5}q_6XRp9yn-wln&e8D3@)7Y)B~h(>Yg;tNI{S?M5; zI7yP1ET*FIoO^wigi$xJ?m(u4LoBl;q|U8&B0(yA+YwoJlqIO9!7y8Hm@mJKcx!c* z8%~hFL2hS}?^+Eh7J$GYrtioHM%}4s?bv}VEvXe+ zh{wq@@byU}t*FcGdLgv(p*Xh6^9>`bI zM~-t(H8HDHo45y~s>Glu3k18^tVLhQSHaiyFoa<9DkMf;;NHi9Z!);Y*|9k<;F@Ej z!^{iL=?ID{(~A9yw~f#NMC{h4|AyiREHHMvz7bE#YC4Rsx1YSrz21tu-1kNAP0*8A zfF8|rix1(xb8$O8XxZ8A#c$!-xm}Cw6Zos~p1OxfN1>HgvW18am?uMe?~eFOl!fC+ z7WM$MB>zef6dL!KvQy*&(Lr?6>qhgKa<-%ryTRl7{pf)yK#6nMdbu8DPRu$VS%QXW zu#T48KH8xp4I2XiKn)-a@H9Gi&@Kf%ihx@p$j;8ue$kq&YQVC$6uC8Jk zj6(gE&uHn1h#())Hsq^TCRv%}FlHKrJePGDS<^B8x!U8Fdl;RciFY!w4koUMnZYs! z=AaV02+K@m`vs0~C!C+VoD6X=i7b=g|GW}DS|^!C2lm0!$%Z9|wqJhqYSEQbLT`_2 zps0N~yZz5c@0a_SB-H~bA&E{h6^Kco0pZXR?hT8#oj=(hZUA zXYW;i-#~@@orpQzN)mibs-H_joC24xlR>gxbiO-7M^aXZzSo(&0(&*w5-a1^aS$arEQ)T~xAcG9Rlf?T!mt*hnea3Af*iCXQ)~no3;$V<|N?0b&%OrT1sXivr$;A5^T%q-oSRefB zqK52g8cg{kC6IQpU>cQ8^Dr~urYx8@K#P9KVE79}fT3cdd)1sKzrTM0LS`>lcVMM= z`~wiq%r9Vj)X}2j(e+XHI#9VpH6tymkCMPbHT>H)>{cT@ruEyXz?u$B?yJLHG3RtTnTVQZpq$ulIm<-q zNDL*e7bJvHqQknAK6G#Aq-H7HBZ846qn^bkH`$Y9b|zJ>mtK1hvvQhor1F84#B7$< z2VI_+P(6;B5#yM~S6$OMPFYMuVYTsf{}#%0Fp*90DNiHX#40w{Y>KVCD5y+Dc~iDH z-q=*}UoP)ctsVn{xt)4%dyJ(ir-M8b6>%>9*mv#@-VynK`PB|)1Q6`6HL z{Yww1=N(1z@~7n>JSIl{jt7pXwHu$obj^WG0!s1EC!V@t{VZCVcSGILuV%lzYf13j z5?H#uw>TH@>^dOCP?l=8aY>mo?#(~mYk%*w?HFnL$Ajk>XZ)KEW)fU^03#NcKS(em zf7S-T#3Pu%Se2mpN;9?vI7vitn$Z~tojdD=2hR9f2cw~>j4cmruHEo@w+ZN=4874< zL`W8&v?4^`b;!KYVUb7qNHoGFn!8vmerB={(K+BI zH}_jQ5Pt&y!*FL`y&L1JX{Z5pP%gAEA0r%yA2xba9)d+m6Y+s)uSy_Qqssw%4F6^q*N5kmYgsN!v!P4=CaH!~No2 zS>jiFR_#BNB6?{#PFhn_a+wFHVDNq?n-9OHHA}ER45;6jv6q$~)?L0!i#|+%F=d%W z0YuE4RSy7Uvx*Rv4XAh48kZCe69ig`7uMFE?s*C7yFo-nbAtW&Za@j*=q8h;%_da(08V z7^&T%E@Fb4=TectWK`3^|H*$Fp|Ahshu(Js#{}VU6Ov&C>f}`GZ*e-!bwQ^cJm?bO zr4v$sS_5M z?1ZQgCRl)xN@c!QQ|qZ@>fzBoKcj%DeRa5b_+o$unTx>|2^GR7r2mDH`EEIfrAmWg zP?wFm+Ih8gg@@ur*b`11k3JqQmLcrS`QkY??Bg1V>{Ab;0At1;9?uFbv*mYoD!c+S zaG%}{#$S~6Zueix#)0OJjxpt=)@CUrN@t%cM+bM$EcwWN1BZPfGLJhD-Zkj7wTmGV zYXU}oGr&R(<2aY=-OU}1V3k@?Ga1+H+W@6cJMxP`3<`!^t~Psco*OB7z8Cz4`m$zb zcBZB7IXkKifWO1ZggpnARtPj(s>_mRNM$kks3-*A5zXC~dR^ckN@N>YB#5@7htIXP zj9&zy2RnVV>>ksd*`GJo19mM}?;z{yVX45IJ+n^A7EsmZ`f)3xyd20Yi4eiF)!Jfq zknrPrsphTRw@!o62PPa9wLS=R2Mz>{iSoJt08~5#u$rb9dGZ6~55|~P1?K#+Q3q4F&gZaCqf<>Q9Aa$an@h46} z8|_1Ps-`0_TJ;G4-c^QgXboHV3oQzkH+^leNZ5p#=(8W9x$zK5>+PL&Xitl516a)e z0E!l0t{yNTG=haA{!z_MlYWDEH65hjas+P}F7E_oCwf<0wW0Vc!{yhJ4p7yzJkOzq zPU2()4n2VH4<|^0XxDiIbvn+h*q;%G}LDM5dD@5r$`a1b{Q zC~h|i*>CPu^KUc>t%LU(6wP^^j78WDMr%L@#pW;O<#d=G>gzDbqmk?r^%GR>1QRsD zb$wUVK*EP=bjV^;H1peg7Phx8?98Mdx4pO8!SGz?S34PgJHUVL!pff2+gfC73@>SL zZ*st2A)33|f4Xe2eqGrxeL*?d-g}IPazIzZO_wqXUizPfBTSXBaThU6bRfkh#AA$r zycygCQ7{NmFbqv0YV;v0!5iWn4UrA{z6pd9Tupq_r*b@d)z98D`a=a5P!{{b60ih` zGlAO=YRF80wK6R}|58QXvjQN{{@5-;b$=l zJn$Q6+Zfq7aYZnmLO`CZ8&r6 zt^)bpL)tp6RyeIBg}?1oltsWf_HCfr;zeYD?gXlk&7!RqK->t^G;2ye>7gh9&pk}k z$v=vao9vda4@ltys1Dx4QsDF7H6SG|2l;3}(872U1u)P008I~0zjEZOit_wZ-!ipI zF9|b(`}e5O9!ZOC=;NJQSU5I=eHaK)Qp5TB-Z8l04Vdqtobjm77=_u~y$z^=rlSVC z4=7^}LD1A_SVVDL!Z;x#X&5 zgw`Usy?S?m{v`uC zWgNp5awpVvg;uefN46RIu&g)J((@YlA$)=t4LW2Hh=19EnbGple`(5*JA!a~=y$LI zDk>0jk?Nt+$(u?ILnZ~LDbVLTB!xO#f`Eau$jdL>u5FX(JT9o#TMRXQH~-xqT(}uV zhju?enX{1@lcjCi1alAx$D0f~2b3ah#HiSC?x4YTa8P<(*1~j^f!J&4o)D4M6Aq#G z=AQ!$ugPxs<*obX-kav_G;O04x#hgKfBCBV_VzLu}&t? zFk$vHK|h7!2j91U-l;2dsM{B~hBmSr>e>P$QxUzl^y5biI5i3IT*l=( z*xP%M%X7YgCJ&;?o#rcO=htZGXkB~zK{RgY;GH_O-FXWwy^V%_gND_eSB_7Pz!bl> z)|6a>(pumb zo%|0aULQ!!xLLjJRCtzXmsj*^Pxk(cDS;dI;T+4gHJAUt&dQcUXASXX34V0wz;G*W z42#bSjW43&QPbs}-@=6PRus@nTBNh>*2c3-_f1RWHeAm^7@iRu_TAKp|BL(!^J|-K zs|jY_{shiz0<*%d>7%8)ca0)}ucBUHL9vEFYvR-fH#oeb#*5rqY#3$#QRm?j0kRM! z<_}lGAXKyr!z6RWBF{81qgAUtZ!0~|LEDQTF=*ggc=o`5*1Bhp>xg`I0LrZey|KIr znMZFdm(!vGOP>dd#q;&U&Ep!N#8D6yhBPfH9&Z>vRL?n>e%h&j*uZJT0v!VvSZWrN z!0jM+(5c#CxW#RJTKwjY)7%G$Z(77A-}F=;19)W%^*t@yE1KQ$10r=99Y5l83Aj9E zA-NrQv1(|ED~48_e=6Njv4<9i<%8iSCO4N3!ncz1yi`t?e191&KBviNP+d;m1V?iu z9pZ{9HW+AyD@H%Vz=gjQe_tRPot(l+td5`6dK>^4V*3*HZA4*XYCZSI-pAQmVdLtN zY53!~RLuSHt49*?=UtaR(SR56kc83cjnS5s-0Y2@5|gDZnO0^7v}Oxvxx@92Q-xNW zjhg3VW;A5B7QyIB z9-FYaTtavw;05qAiT=-X{me8EnF8YjF5WV9z*^3G`S)K5OUD?{w{S1#6Rnq+bndm= zj!GItcLd<=(7|P+S}BI_M)kAEhiO(x*F^^b-vobl3-> zP2mRn|3MpkimNiy34Omj%m5743NMr7VNz)7%-V9BpcEF29NJ$5e0H5PE55|0ss|Ff zitKN+Y;lkj4EMuNAq0j+ZT>}VJg=;Cs7%8+ypw|(E z3;cnZm|_1|UE!mY7@9piyjR{rr87Q_3!D9g;!5TdTcQ2A%Kn7i^b^m>g$*;IgBSmS z-`E4QW@g~L-)9&RH;knz_jG5x5#Nm5n}NU~=CV5psC9SJ+y!*tJZ|fPJ+u*|&Nz$H z02dWiT@Fop6iM zlFq!lc)mv-;~>B~ST~zgT@=D}4q`$u4#B!k^rZPja!vymt^=JNLUXE3QYrxR3#U=R z!~atw0)kNLJxLZxE7*k;;86j>T0n8Lc3!8@^_k+@C+!<{KierN`s%^>+v;nVdcU@9 z2p;ND{Qjqxq_!9Cezpt65;uf4{ss4?lcd9QJ}6?i0NPqa&*Fa)aly0y$J4ifHF0L| z=N^&_kc4D15YQytk-ImvXt`KG)GDZWscsAwgj!p1U29vrO$LRaw1u&)L2;Wz(SXuI z>?)|V5L*SsEuKg*+^o%}hHvO$1^fF9stFd(8{?eeWDA`oCSD&JW#iR*pQ ztw%EHM|zP__>sQ)qE|nI_(1#9__v!Omy8}Uv$#WTysX$M+&cLRFc#eo6ikb7pKPHt zu4-mMy})Atv=YPiR{B*FuJ`lW1q32(NsU6p?he0;BG?@g(0fYUrDjm{i$nmwW}>`$ z?rfkdOa4SxEXx~(2Uf#I-*E$shL}E>M94!BR=$1+iIfw19m2F87G0Tcl(sBGL=OeS zA1*)*NoTf$LIIRyt30fiBV$Zy3(_XWA@Af}gP&S>_6=|5TDgZOLp@A-NI(Ys`I%WC_s(75!6WjsnmTq1 zYt%qGO2a`yFY+jp>wyn=6v<#Hk$4okD7h|Hj!=OC=u;u01rhZU;7aziTrR*8o&V^ z2X9!L|Lh`QJUbK(ZzmXi{X)7fC0Yvm(l$RMxw)av4YhqUFplmoSsmhLV_Ki%rc*H6o7T`a7U08iLHrReKJ z{Pg|Q#{BU?-AzANAy%uud-TDGb+M>M!}AGP^l%=8%0m(lBX@Gi1s2Vy!y^_0;4r_@ zxumXO@}3i5#`#@FS%^h3V= z*vA5cO#7w^G=fsthY#q2 zB>j_GK?{VDk$2x`$s&Tf2`9>bMHgRV0f1IiNnEorrfCQ=H9A-nAecn~kmi5!wdtlE zkPM2B=yi9o9Tk)HK?c2;R`@ao4&D8DtO#H7Qm@&x*^YF?HZ)BFN+29f zPbjiI>JTy!7COSbO?uchnwAiL=+QDMx|wj1X~fB}bI6_$my&!Xgw|_n>ow+bdyUo3 zL|LFx^7Tr@@yx4fLc3yLjoG~ERhQXy2L7V`m_B(xAe(7UIg>bFpZEkkj-n?LGE9a- zQ)qbYqZR+GStfn;NXwBk9sHVO`i6N4qi;Q8(F1+5UTx5`4KF)pZBFvy0{=j8;ElzXMvZ#4w@Pvyg$2^8l9sp$`Qh5Hh-mRVuSl;d@aynh88$T2W?#I|8ybyXfza+!6h#y1w{o_-g;8kdZ$b4q0eGMR%(} zY3sbIa$i%qO+6QKut36PLP#`Qp z1Ogh+l&DR%!YKSQb97olR9OyUcq+3)#9pU5zWTh zD$60;1^sax#3BnvK88i+z@3yYL#OKHfeDUx0WlQ14d>wZj8gbEkXQW&yU|jadk*_m z$u(FG_jah9nj|4LFDx2ye|c{xo7B*EM&Z21W$`YD{#`f6?ra%-7>^;x5@mOeJFjv_ zktN{IR*})irdGH*nOg!`o&E5cn#1}{sKk0_#kyl_Typ1^0$J0FhBNji{iY^`eRZcp zM0p%jE1v88{+H=Z4d9@4g9I49_vDmYG}Xv!IZk6k(SxZ*U^i=Gqn%%I+18+Xv>CN; z8vSLeOH8rsu~+fSJw{P#!_QL{|C{nUr`E*9I((33SFpz@Np6^!x-Rv8#q;`3;b48o zX|}3;Q_=mY%im8qzv8n8)Zm=q<5T?->bmsSmtOQ(LaY0jhI>bovXnvz z-86CGLY;n7selRR>~ckOq-owG9BtDK)GxG}J2#<(DDm54iQUH%hguIG ztrHHJHznRV785@|6>SJQJ#_VFZYRh2KBwl?nVP1~MhyP#&F0Q-eGi1Ya)pVLcR{to z&P5WsLq;9txuknWoYFIOTtv_-%c~SWhB^qU3x-MgU&2$dq%=H?clhFg`Y&Wn{>gX| zaxev9kiBYjiwu(&JuphcSV!vDcr@?!>RF!yB@3J@4y2-p4lQy=BpStz_@Coz537>D zfT`-t)aXA`EhUmK)nEmuBlZ&7PEf5?q?->Mq%$kAZ6d;YM*-58@$p|KGWVU0_XF{5 zv{i?l%)ii?71+beubhbB1ECuq7mUAuuOjJJlV|;&~%ESM= zqesO-{Ooi|1XgZ~@;~ujJ@+hIU8TQjlMsXW-v-Ejc_!I1CjKE&# zSExM#-mqNF=?yg_jX_M;NW81^ zL)HLe4Qu#1zDq$l4xyfH@4E|e0MXvJQp0ZC1RL(I|vG_Qn#itO@u?mJ1isroD{|B0mqW-;nhtX%| z=ryANfmtO6A^cjr11X&T3-*lYux}5>$PLgCTVifB6uk=%>!ruE4 z7AHUbr$&+f)&3x=6DR#BP>U^>uw_qwFs|a{y8aNOufCxx-V>^0rBb@r9T>h4ZXs?f zyc4+&((sS*7|Tzt;B(!4zK72P=_rPW(-hj-)Y;%<)k^C$%JIFb=wkf+&(-NR)$nmu zze7!XxcV>EyIidNG4UsKbw)w)flJQ#6XR8Kb6a{}lia+>23s z_<#Rph#SzgD*)cAl1)kzY->IrDs&ZZN7wfJD{}T8nnF2-P!yK{5(|GP-kz)L;1Ty+sGKp*YQ z!weQD5WJe?@9yQ{9NI;+UTL_&GkE0Ne2}B(if~8J*M)<;@Z(ePj^Hi|vfmwZUy(bn z$PHIiUc`8uNW+sCzR%fpT03GePZ(amb#J85JpQ=zK|?I_?IXlanL_gt19O8n^tqyC zv%S!yVM%yg}q6UhE}+R<_=MK6|SgJ2=5L(rkFu5x<>fISYrW~8$7sr^G|g)0jti?%ln!- ziz=pCIVz7{Ww;_wyhZOiPT*RX7}!gF-9Fg4jh}ri3Fg6wP?-30C+A-1t`7{8(jO8+ z7$J`qio8NT%P>9|+V>S(nsck}P!u10ki}S=ONrQOdPX{y)Du|^?k{l#2(Rg9)ZJ=o6coK0Pxyhh zO0X5*>nXZRZf2RAmn?d4o@X#o;H=XcWKFOa3x0cGfJG^;*tx^bG0CWWyRu79wd$y} zy)EN8itQHEiE5b?{NI63NMd` z<&D@u104^_m^BA)q9r6aLW(2LAn+6H@R_G@^0}C{n7oUVc690R)Ruuxr?LbwsqkmP zq#|yFk6r%Bt5}fe(DeKpy!=lQ4X6mTqITz97gyWH2zX8bwusToyh4oB#0s%1y+rZu zU9L8lz9L6O=)Tu^gTnBgQ(&(K^Gr5#H%Gx-kz3PiR@&F;*9uQi>Y5UJoWzCTJfv>a z$bq%Mf_3+R$0||idG1)EOYac~6Tj|+YT4Cn7?56x3z-n`Mg$^Sz=se)X3XU@27Le2 zgLqb8W?GXfk8x3DX`_#w&114L#`Ee1?%|u>R(hi^l@~T*vkYA)#H~ zuq~e9y{;MaMPzAg0PphI0roH%mD=0J?@_Q#?SdkXh={=(T38z7VYM|BQ=et0r2od;5HON3a;$WTE!Mi~RK{1X*EF2mV6iib_-j!KH*+SA3GDflIArYfDP>4At zxi|B58ECa5U>1S75WAE(rbBJhS3(Xr&>r_xE3}gHhF}@bmPGKF-05D0fWu?iwEOx5 z{ z+pi%_deuU9Iej{w3FRa6M^s*^OAn)JWt1hHB984kCRz-+$@nC-3S5|b-+i{3OGjk| zFTogixExOg$Ia!YK5}QE65Gk;IWu?+m+$lnm<)bxlZNIB=nUZmS4d1wWQd5@N4TPq z41t#`CKh@##QhNzohzBhB}Q`nyt#5uuGEt&bLaXpxjydP0G0z&<+g9{iljWb3U{ti z>X{`-GEjLkiso}Tw$PXE@J`h6_e_M0rybYP;XI^(u;a~=Okqq#bi)i(i&?`x(0w_O za9prf2J9~gQ)X9-`2@_=# zfV$uLAP=_cJjXa@MxplpdsHk{GnfikAK5f|52VIJWCP26LwwwcKr;>Y2c7o zc@0N6cr!XjR^%V=;x+t4xOk(V;7^f7;o^nA?}u#yDL!tJk3N9K^baCw1}x3;!>L6; zzH0cRHg32>+)yHDxGfGRq($2$qm{Cv2eP6Wenl_&6^Y_UEB%YE_>V4;hyTuPX!UOx z^oKp^Lx@c))e)hZh?xZunV=!tJ7l!PA*l)VS{%P5ed&}ZI8qkP_FWKLO_ z6i)hp`T!jGWP>_bg7`Qul`xwZp<)z){qk#BtevW6l)NpabH$}H%WVYzqwu@W*RMn= ziOVP?zBwE#v+x6=zj{2SHMXL2Z3IMX+UZeIE87h0vC(ZwcT@B~qzIv2!!q zZMAlVu^=xUt}qHW*I#vZrL-bP{}^&EEy+p5Gc~ z5xwsKM))?!X_za%i~hsWDMn#59rkWB+lydF;cQDLRkjjW$Q~vY3xxFt6o{B`(U8%$ z-CXSSlgP1%8bto$bs-ZI(E1dGN|oop^&1{f6wj34x_$Om3yKlYq7}Jti(0}q^7NT1 zT__tuj^bV17rUq|i?U=>$zpE4n3H(0MO(CK)6Pzo<;A?(9xcp%H$Xd+5awrd&>$uv zl)I6ipUn*!FJx!hsqiLKZ>vy2mq1+cUHcJMHV#g$f2 z9z#On=eiL?Vi85qhIq!1IG0L+_#_v`lkI#0R(XQ6Flnwf%pJDBIMgtNc2FX)5Yc}F zZ!OnzoMRRCun#7=5HZ|sL@vI+{Ah|XBw+Wsf&RszVl-A4%;O?WEjTZaLbxKex1C)F z4GE2kdHQQ8L8*EX^IZtv28W3VI1~};TRgK46LWjT?J3ZBzJ3`_WX*2KZ#{KgU|D4p zEZitf;hBv7^xZ5+KCBU9+T3(`5zCv@1$m?<|6hGAU$sq=e&D>@bDK6YocDUJy4z%<%v z6voD3kB^?$uco4Sy$lL>78#{AYmLFd2E%MTh;LHn>VPo3g<#D#K5dvwsLf_UL5|;b zAykhR8j=XH<}7AMxD3x6gK)Tv;Cp##r3x}muu+=+p}JI2B0T-;?&A6@wnNzu#hRDp zuB?b4S+lrxN@Ybp$2)PmH3gc-Wd&5T$Qp^(4P5+u$!hJ)8#6DJC~#ClZ9QoeK7%gZ zbSOLjorSZ33CpYe(pRcM;mo(sE3dAweu4RHpIu%bz)pE+0ZST1#93{`oA^cbE=U2!uTsjgKJEH&l8Zunm>chx?dTT8KF6X^d6jZ<+f4p<R?&R-}=a&%x#;Fig(Px+}Urh43K8^dV_Ur#b+g zR~c*9vdWB!eyR?DJN+S^k1{#*Dfq~ie^bbAGVsnoDUPq@MGMht;(QwJK!V>gc`$mI zJTBnS_0=(Phz+6z(u~$3P+$fPzoYRgINkYueY4OO*F2~gUWW*Zt|uR#@Wt>hP2U%@ z(m=2PQ&hzrUQc01qj>b`e6NCwUGQZmdV>oUoo%x^duJ5|sJrtCX=lsq&QE3+Db*E7 zb=>=7$}?2bay2d_Cv%YBh2w$0n-QMCBDy!yBlibP8H9dgVxo za$Q@UtI_H%3Fz^eh*I55c{np^Gd1s7+~A(z4xZ&E#$(fsk_Eqd=b!cXIFG47LIOO` zc}$MVaa|0n2Z5(>v}u_AoQn?osl=KKI;^{i?d4Fo4Ha?N0iK5Ce^J2$l}bHxf~ZEX;Mubl62ZqIdL{hiok667~!K zWeSJX-&Q4u)jEnPU8uZ+7yf!&z1y;dVvgOZEQb(S+Efe1Wp(Dd&|=9iY|DGLU&8m? zOXBBzEN@{w$c13lmQakux4O;(F^yV=g^>e4kqKRE3+z9liddJ9A7n5_;lE1{;&dZn zZyNaR(gFQ96W?cE!=5RP25n9fJ6uVwr{OooIkw_v8~z&CdJxRe(+{ZHo^d=)v5vrwI1$@K`)DkJf*)<)O6~c* zXgel4eJY~sEo3Ra<#-;u$-`g7Hp{i?;74?a;_g8bG`cMg={x8Kp$okv-lk^j?A|N< z)UgfMBOl!wml`b!=IEhr^tcYU0UqKXo6uBQu;RHmqhQ&4MoFPAycA|{%u!e%mYC5k zara-K*7*V1<~eI4Sv+9ohxsOb?!1Ir%gG zh*=k<;f60j-Jlg1kis~|p6qy$>RO@BLg{&~OX@v2)i&Q1v+GE3n{?zG?zsihk$)xO zz<2!cXCj7+zYk>xn)DNFKAdAaWzY=ytpiY=P!ERf9#GKG75vx?kBEmk5Q1-wi0Sa8ooTv zdzup)3=3dfR_S;RHqrZ;%i_Era0np$v?<>4ceJbzUmAxUP6b=a*$RW;TY8SF^>vCi zKo?a%72MQnM)Mbkg=(d-4Lg32VU+DtxuLBH3({(4T%R@8=u!VgUn>%io~Hv0*>^r9*ZrPSckZt(jsUg&n7pwr>khQk4>?s-G*tEIo}?;- zu#5t~IqBTi{Zw%E3N&Q(ArRRN+&;8()A-M5REDS?8chlqQ*aep+_2SSnyNC?+@lJ> z(wq14eL@@j7IL+u!&MZc4??;o62z$LwaE+&`J$XUr zS9kB~$!n`6*0YntD6u#zdcYaTz)>?m4QUD?BtvFFoha3pEXhbV z1-tni;;Q|Wym-HgK=Qi!rLB=PpBwzaOC{5T|63tqi;7I@hzq_qw9*aIlUkwI-f{!H z9~5mO89sN(Wz})-aqK4n3`YJm~pG7}t@J%4b{?4@O zH?b&chx|DBf%VC%VImp@Ex=!Ed)1^*rp!v(R-xRE>3K}HFT*NsO{!pvY{>cpt~|J1 z!B1Fsx3eZthqSQ_PoOTZpk3esgN&z3mENoN!sXgI0B*x2bMuH7zYaHw!GiYMkDh<24HRbmx)v5l&Sb zqiR3dzOZc=Cuku;b;gEXhpsw z8onqA89l&v=Ljc!1kSbmnkn5xj-d8U>X0VL@dkBLqhfE4YO7xAd*cA_vXR4qFp44& zuosf4nu%D+`2U0jACPpckER5UQfnr4f<~b>j||7hDszm67#Aa;wm* z4=C^zTDnvNj#`2=zac+l%ZSc&>Vs}xYFr81JVr6LS!<=AQxN-UMG(C*$eB6EC89}j z<6m85&$0G1^hzb$M4F;A=T_aWn%P*6dDB+5u680lo~Xjn9aT^lT3R1iWf{pMp?qAw z)g0B?Zyt1XkhWH96wIb(q7LP=fVU2XAS#MtC3s^!FQ5-Olc#O8xbsM-p0cL6jgkn> z3(w|%`YUw8lFj{Lu&Yts;DH2>4zm`l_84^r41$T#oa33^YqQx?l& z{qyDDQ0^Mc7O_;SkybG|?3ID`ivz>74~^>bf<#SI+xXW$|IZmFKxBDOU9)>nbBqf~K;GXh>`rD4b}Ag>0sd@5k+Y?S0T$X$sV|5ZRPH@K3w zp7nH5-mcU)B#1JLtm@irNb`%XInqf6>M$W)$wt4*6dXo;FFEZWD520hMcgz{I9&~K zi+BKh3Z4k@i1=y9%{U$G6$#Ri&=C?mArhudbr!s(?as5BI#K9(Cy2ZlWUH@vM@Y^K z%Bq_}vJ$TU!0LX26g58X;M*Lc(kZ8igHj#xl@F0|IPKAGXadak5=4Hmd>S#yJEUnS z;s`v4RYAdPT?&+_UYUBRKiJ&Vp}0WWQeiVePNrXx_Ku^7Y3?(T0nn zwt81`i(6Q5WN@JRsylkb7Y$X53Ak5j=>9R;8a`RwY*K8I)hkHdpVTDm*WE?CDEp>KhAjf&DqhSAg&Oom7*2RL~{sEArEZP{bugtPijm3O7F$0%U z;rqCtUdG&*Buo7q?@;!Wo#ZVLG_?<3Uhx>0pZ$+WkBFOHulI_0*+;b_B7XKi)Dt2> z_Iv)cNSJMtIM^|>q@v8`;xiDNxm%?keH0W_HQNqq&3_Ci`u#}=RpUx-8=iEaTC|6Y zj4|}4M0Fw?zC?x@ilVARF5mrQLTQMNfAA(xwC*v)iTuwyUE5Th*E-1!@8F{Sy7MYl zJZ6G9HAlll;g6l4jWfYoCNGFYJAlvrOI|qRwVV5H>b!YDm#;lW*ne0w<1yi1k&8pg zooMeSvH!fYc)1TFk)S+`ws3nM4qui(##i?7S)Eggnzv^` z?-O{8ZIz8igV<70tdF@$S4CUiMQk__(aPE(wUy6SB$vo-ncXXE?1F-;{xz)va;twq zs{a7GTMr>GkbbZ&6cNlr)cyC#)avm+e8yXn>=Mxp&_8q};eq-20tw$*bLs{OVlKRwoI~5&J#cvO) zgCqU!_8o=*OP9J7-1II0dnxWv6t46hG0OJ;t@}uDSmYyWGNU`WetJQ#pNns|FY;c! zM~3(jB)&2C0!^;qjSmJ;F4B0^ITPRn8}ST$to?goKlzUvZA8_F0ie& zk$0zzkd93A9aFX^HyWz9ST$7{lj4W@9ubG>9Ve?OXKx=FL%Dlf$P1LW*G$F*PS}r+ zKk6i>2hsKxb9E1u0L zSDq6rm9@O2)4ak%QOKRz>{kLjyjWrxY%2Sg;eBk|Mo&iU%Z1_>M7zs~#g{o8yh!RS zm9L0`{aK^Lg1Wlf&jmw@-;d8o_rqu~NS}f$%yLcQEndvN0C=l*~{q9ao~oV+Y_JKtNs)a^;dB&yzQJ6OXA$#r64hltN15!;j60ICe5Z&*UmYh?l+4vW@}|ObwS|0MIdauZP77c~@V8FV zi24-B;C^&=Q?W95xRb0>dF(@-nBN z)y;Rx?sP7jnwg^U0mSv6Hc_;J>_xo zM6GOqbj1E&uYkKdW9TROuXB@5|6o7|xlh;7Pi_#=_Hna8zC}5MvDX|@#yinCSc$d{ zo#&JWkG=1T5;Mp0sXq^sX;7#8w%of2_(yT%oe6?i^e$WV?Y(mH| zl8wbrZo==tqPN(7%ow%UAKvVz(MlG3u;teU%tIPpb4m-c(0gbxK z?F2gV@e!JJQ|L0QvvP;*3cEAi40^grtdU>Fx(sdv!j>W9>#HV?QRXgjD>)4lGwiyb zakWwTN=}ASl(@Pp%CLSBDh|s}MYW!x^yetcS*rG*RMK(E@gdb1P#0R28NCukCGC`h zm)=GhOzAre3c&reVNT*f9hN2{1o{1_$e9PiD6c6QjE9UVCb>(;CS!toj^~bi!);12 znC8-5QBiB=sj38QB~lzhIs$NA_41;`_gAP{1cUbNYNNViPZRJa+o|De)X+V(?jCoj zPtoU1htwBkOR)oX?v6E`r&`-6Vj69q(w?SG8DP9?oI&`J-ko_Dknj{m>(f0qxSrnc zK%|Gpw{&+kD(q;ML2KbMfG+h<&rivBYf~6~T8lgV+&mvo%K$07M z@w6=qsM;_Di4hT$oA>^+z=suq+67cAK{C?)wT$M51O_a>^&$mV zJL?yI-(VQbg}%?jY5kLoBA7^pmhLW(2;pUQ^F8UQZu@R``T~M?`ZOUiI~BW*1X{Cn zH(PF558qlbXve9vb>29$Hzydr8X?gdbh@2am@mi3kwpPxVIzx_2liIYVj}k)Dho!WnhBq!v1+kDZ_hYE1wJG zRlLD(2=N=Sv$yHdrz5Sx6B}+YWn@3U!D;727Wy*!bS64tZYiWZi_g&%O5OT&_l$_h ztz06vzk_O9)%Ugh;wzR8s`5ZGPStus&4eYeqg(UKj}rGMs$jxvpR|0W{z+;raq43+ zpoAaJg&z#8G7rkhZQ|NC$~LdM)E%wYUT~M{=Wdo%mwKWN+FnnoAsaM1UJw@ydP_sa zf5jJcbQpa1(l8Caa7TxOY$5y{-g=@V@HXPgpSwrmZR8Df!;Qk5C=lPwipHC06yA1T zlH(e|1=+KT<>yQTQn3gdXaVJ&5x9TQyEPD>7(pOCBM9_VTY*r<3xa5kA2UO%wce^D zmN8qk^cufDHNyp@ow*zShr?NcY&~5okw|&{*L24EtRS{}gQfU)n%$9-; z_%x?-v zpQWzs-sft&0P2$urQ|iKWf6r>=ny3_M1_q(Gz}$T_EY7!iQ408>v}|T@V50FY0GVa z#g!W+ZsS$0&(@MrJm%kAR!5XKt!d+BAGu>NDX^#IebQ}Em@mjJN7d#F>~GzL3WJ7Z zH2xTLw?=u`Dzn<=js-PJ=r#UJ4%f}4#h|)dsI}Hy=%llgv~{uz?lsEu2E!T>V{gzu zX;|ZD(C04BjuT+qFUk*9gKV}fUeWoPfLt0emOaQT@CY1efo94^+MOx#;$5dHa+tmG zC*fLxg$`FgOU=Y6Ai%BlYTN{SmB5ppQ_xY*Iy{Kt?Az?sM?!$Xby^|dAllJ;o&GmE zVVzvoNp-O!HAWN%N-XEd?qz0#`<596L7!0iOO$mZATCxF8FWAF;E8mca}%#wwCYHo zm%0{F-2@XGhTlMho)7C@h8bZLF2JN1qc#2>joKE&f?1+h?!>!|(oYy_>lKBXdw;MzsF zOiU!$3GjhLY!Gf)r-99|s#@j|C-yEim{hnoZ2xl)Ek1&31BapY^OhVP3+bL4z40bd zH@6@~hFi&+!Lcqoxto_2&9QAkBuZq753at#^F!4%N+m&>U63OJ1%@fvIL(r=K-#zk zn=ZaW>!a{`dXmvcM~ul}S6RC|Bv1}1M!|G^^6FDy9{YNHeXIimA!uGKSh|=9Hs}|7 zOo{AWJplKkkUi==aLSBiV;ZWHHU3@=2?6nF5FqgzS%ZH{=!)#5TfOrkA^x5 z)i0nmijg&nzRwQ=+o#v4$qO2wEVU=pyH3NouEjG_rFPWSTgDoU|m$i($6O2 z(Q6ZGfTDH<*4vG~J_rl8#>GF~MTztSX2rEBJkTl%Ut+{WlP@DO2>C0>c{^fPzUS zArLJ=1wtkC-yBRoGDvFqm|{v^#E3ct%gs%&GOfy|IiOp?IaW9Y%isusb5ynzpTC-3 zdzqq36OBUcN~2F=zEPH#hu0N&1;C{RM4niH_ppr;F~w=YD$H`Dggp&in#|~zGz&cX z6sTWlZR=XM7KF>yPk2~9)u+7rRA=6Fa=}^5dZRFJ^RI`6XZQ0ifA*NT2?p6L@8e&a zc$fPg8-1&uZVIcohB)IB041_orlPV7n2%e#;5rm&KelvHi+!?wdz`bS_gPkLC5X5j zm%wRCaEp@)PWgH@O^{#N;EmIMjOHT@JfMO@E?&jYTu=ZuS==oiSToYK)_sG^-omvKtJQ6q1u1dsXElqlsatH_J-}wyV8#%B zwt1MB>_QUXgoPx2U=1!VN<5a`%^UN%5ey~N>tWc3^G{zF@5bRfV{7tRJ)>qcBvg$@ zqws3{SS_1@r!Wl?qC9+IfA9K1FDp4}_ZkvQx+dws}Uuv+E=823D6kqhroDIZI;>{gter=ZT(i9*f$HEFP!2)Ega(AD713 z#B~-cuS(qO^RlM55ExivEqvE8UUaP+gRu35wUH>fEZ8@Lozh8J%^aOgK(5OQ4yyR> zu~D!^Q2AUuPU|(mf~_p`bVW_*l_Q3D`mxs9?@x4?E@qU_Aq`ntROv3e?GFCApI|WGpAt6NUsc$SkK97&(fx6>K{@5L7w(WEq;;*dZwm)kNBSHKW$m{!BfDX|1$HIc; zzO+8lnq%HCEU*zUnri9=1rlN@29sUtCk%@5@h>J!K}O-bsVQDVJje*VreLG+*Dby1 z&ebL(f6oW^bJrEh71Y^87tNXB?s|49i$k%+smPb}C;YOsM&WP8>SqycXZX`&r3hd! znbXG*y`16IYuLnkeSB5d!&YyemfUk2v#22OHWAzQwDU_YRu<>gUZ6nk86J# zzAl7dd-X|dPWG2bXn0#f__0ErzzTJO%~E}H6120rI{yJM8urwVp?13kcFe1%F-zRn zzH^)AAGRKDa;|AHn}4R)oMtpl=9ZrirTDSz)xjx!=u*`3vwH(;gJ5q&yAIA53tr3vZxWG8vn`1fqNIkzX$sZVQ^IbgHJ5K38H zT};ThRSnT}+N~JSl+}!04daDuk8BoS7kaxkjdX25!^q+R$Y(JDUVtQf^TE#R2T|fr z<_cn29XKNFcra~V?N>;pczrdyLRQcI(P~uF$n>-Zkb$4Oqm$TMPpVivH5uOfUWREA z%Qzih!Q%|f#s}~9AHAmdJIgJZs*HGYmrIO8+63=DoN|e(Q7pr83pac0)+^dMZp|g< zwD@!9(HZ&p-*OMM9PVVE-atRS7U1=N(w<(&JiQU2Hsptko|!OZVutrGqA(8zeC_3O zCT_YXPItbJ**1MdoJ5;u-0k&j)155$p}_}k$|NVl-JdS?e7ZAPACGZO$)uy+NxlRM zm(N4NWR88D3e>HFLOk6jfev9_|y9m%H0)xD^XgU=V;=8QZ* zUOktxrQmb06)uk8w24l?iU;QrZa!H*-Kg3pL4LtLNf0p1DbF#p_Xc3d60d32T%ZOE zV3QnvKKf3wE_2C{07d*jDb#oWAb8T653Oe!tuJ41LeihA+b-;bwmfpf^-d1Gq>^qeyf0 zoc;Qlgsjtj5W}@jQN=|NDSa`P@oM$UMrpPB^2?9eNrTIW2I%lbb%n@M?{oR`lpB1} zvdSF@vsdoux=H~qsgOMC>kGf^^QhTRboMbKd`EK#-cgZ)^i{6hG2y+QWgaN0iA6W{Yw(Y zs_pkUr*B$%*(4j=@tT@1DpA$5n-+9LtX0S6AnV7!qcTt$TVfQ;>bOMEkG#@H5} ze3^SX#-%v9ke3zC!A)qMf4Or=K)wK=pDEE26aX1pc|{0k&qVd?@qZt@Df9;TdIU;$ zfc#dkXQi)Gpk(;yn&ez5FAj`pZ9@sA()CRLbqW=Kjn9nm!v=gKUr^pS?+^NSsN8Eh zI%+2Zt{cH>E~F!ZvOs?zlu%h`raEh|xWWj0B@k^yB=-99f_0OwWg|iH=RShgIQX9$A66T`|4Mf(u3?DpY>7E|FE zL}!4Yn;pcf2o5tmb_`4XZUBxczasjZ^BP|3GjXCmqt69crxpPn`g;99PJaE{QP0-% zoGhU-wh&8k8Bxjt@8g_R1&eU~k9_D*_)_~SO9bFBfVSCpbrzd3Jlsb0_fyd?SQpsh zxlbAlGz=5k3hB! z9C>*9)8-o$C|fQ6-oNY%D*tn?<8$iT>Qi^UQciYA?8$}E+NNKR=xKBs6#hN&dd>Df zY9^+0AfD+ILQrVi@Y@CVhSxiMQNP&rIYk7~5suW~VZ?89hyH~KoCx^H8{irFoHz0> z62Y+R{&ieB;=S>SbX-aLli1y@;V>Er9dW#+u5+kP!K}OlcBa@_CZx!gN1TNoKyhQ} zK78sByEpG+gk~a_wKJYV^SL=F=U%SPFet1IM&XPyj0gCXhNV9SS!ZKKUog`e3FRUdg(o{=xO*A_bc z4zQQ&Gvc@3Os5Zxq(9WxL2uC!$L@b=6h1J1q_)}|Mxo5PaseFyE%Y&oXR-I=2&12g zP`bnRfgcD6iu>7p4Bzau|IUhGrWvu%n~Qd!lz8uex;~dSu)WrCJNrUH_)Ww%&ZzxmDStbqrI4PhC(|Oi?O0 zX`fH$8PU^eioXo)wO^@)D~D> zC2J?Q`ohQ%a!@^o)OxQNNW?gx6Yq6%Uw!#RfI-Y|-^&Akx&_V>to9dc**nyRiT3JuQH~)=# zXScx0tupP-&Qa{p#4iS>T5w*yM>ob`FbKdjo8G~>n+50F4_)ADk2eOi^GicR#*tq^ztkj;xGUK}TnPfIA-aZH zbh*bUx)oOMv}P1jB%?HlOXc5Wj(E8Y?~9Rto&L4%WzjSolM{mjK+M2*^5w|CI)AMz zxg3btC~-vA=;eJ?bE^E}Q9@=P-^u1d?m9Z7^WU9Uo)nHBRb+8F_zTLDyLBk`)%F&L z5ZVj0gxk`x6Gf*@uFlS#5SU+fy1{Jo3}^JI7}0lAPWx2F$P^(#K>70bMzPO#EEI&Q z1vKvQVDBs2e=z!9CI-==vYEGOXlDoCa>pnNGWz}m_NPZ-XAngP=ktWvQb#58vJ3`! z;>;F0ieqOwQPP~k|4PEG{#@782|~-980~)4z3w-P&gN9pZG}is0Dq|fX()a&>lY~) zE@gmqx<-V1#c%fvz$YC=N8ld3HZ@vuW zQl5s^#8Om~?(JDRD75^@PQTXM)QXx}5sMYYRa#ea*ImjggE1i5cV{|2p_o6p8~0v`0Y`tP9)o>ZlA})>>iOqLvkl z?DNo>zMNq4?jeGR1aT~zlM+fkTxW2CtHP`G$gDv%rNaU;J*!cHPsB3B#fp>X) zycM(`mcWoDSoe4+zPUIUbdWEuVS}9DFLg$j4wu z^~i`(xO1qth9P{0r>N>u*~5vYK3PJPBNM^S8{9YiFbS_-ge;Qle{bV?`EzW??$=Sh zrEDmQyv*fvpYimLdrahrENjw#=w8b>ND=%bKXd>jBTq*$0Mz%NlxRnkrQJ~js?L@# z&JX_3A${fO=zBYn#iRAg`!A?$D)Aq}5tV49K-3mSywJ}LG}D3t#5aEt_kFEXoK|XoD4E^{nDj7d;RTMPrC7@^<_mTUKd?=<{{j*rTR!Tvov|uf zI&>2UgWOqvvU6lfv@pGWAhaSGA?wMhl1!`&qPyju%sF?$s?L1%SnRex>&3s!IhTVu z_lMN|Z<5x?mN8wQRZeI7n62q_wq*RC4nD)5#~8`-8M>1`k|n|4p-H@vPGrfv{JDn* zZD1gobE~dc%l%JXzW_o*)^YD7)R@2MyC-K8hf&8lZ#k;qMwb71pwnU`r5MGZ#oBG@ z&TIjbEo9>X*F{vYGJXVID~2p%gsY=Gjos@EX$EnV-+m_e-|vrboNZJgtQ2ZYTsHU>XLK|dg!|#;#Qo)#FxG{XzE{le zb6OQ<3&%DcyQaWK6F?dbrnv`9*7%LEH1mS!w&eXkVUt^nonfr-pOqbON^S{0-nDiE z(0Zl)e5~zb;9l+8o(H=+au$dHyng8%Qv_xnuDD((pC=@uXiOiIw+I@SvMvtb55P2M zTNa6Ew(>w`0l+8)J--ETy$3ZEu>oR+4jyS~iFEE`9cktFGTrt^r>F0wh*-zpa13q2 zysLq39_en0^c`S9k-Q$FN?~!l^MPSicnSZa_ZxBj%}2E~7&Wwn|3m#xfNMT@@%kt1 z(%qk{Fr$~K)eJB0<+r+PJhJ=m2rQQ7SyERnvL)vIO7q|!wkJ$;J-Mzq)~E|1SS&O$ z95F`^;Vk7TPIeNWCwdYCP2jJZ<4kODpnvjEggwKk3Qt%~1xwgED) zB2%?VL|O$kcTG158E6$ZGrk-ZspDC(E)F9!hw+Kyi0D??$+Y&*#12fNaF?)?Gp(($ z4IS(GBhbs~zlFp9)0cx0fibj9kwWdc3`bSa1d1c=2q6cAlZ0A^G(DI!YPR6?`s)Rn zxJl4c-ytM1wJ5$LR|}X0Yb&dmAUD34wS?>4B6)c+5zhageB&ym(N{X%Nc~3$4skRW7hi zOn~f7IJ!@fTk~*)>EVqa-<){$dKUERA)+WC$P^d7IFkEcGRay&lp(qf?#7WVqK!@lKz} zDy$Y}<1ih?mHQr;U$5IWC9Gskm`P$>Bkh&A&lI*2osynk1MYp1mPl69+VHAipHSCd zQwB)EGFJUapf|%1Mp}rJ)j??|XPGPNs)F2$SgVDIEti$$j#i4xdmfbCuJfNMZ2x>E z{^BDN@Tb$$nOy{4;g`lGV{4=%5+4}RAr~aA9N!|gmD$wkQrm^5m;EWPy80 z3u(40ot24js9MT|Bt55Nt?Z+{gfwAkq9^P@L9fv3mt5@cUEw2AZmn~EsRZ*Gj4~O5 z!kho8+mjy_J?eE!py(hXKWn2!2}PKV}Oo#R>ZB+fY*DgTXaN@`|H0ads= zPA7g-LvBX*Kvpl5#s4L|x;)Gh%5udz%cVs&Ws=b8D{PIml(5he^vC>o^yo-*H*)Eg zNJt_uDjber@Z@~KKD8+?>~W>!06qyQK0cS@^9{z9=vNzeGx;vO^VC* z{F~+vT9Q6CTRGX2q9Ona-W3@ZHT^_n2;h&A9JM_FofkU-E9u=bm(#=s zL>CE1VJd&^j}$*x4fXncE1*ST3}qE2?d=tLguax}BL~=tm+%dO9Af(?B^{U#jMx2u zi4CrIViG<~1^t#w1=$vrW1uQib!w?WOaj1LTQ9yGhc9i#eZlTR?=6}6voK+G6;ga? zDaTj>&uPWAaPnLP*+G(bqRzo<=gdmEJvm|^&%Un4yxQVg6w#Z-LY zTP1a_l3ieTh7D`NZ)SpZZ-Z~!8P>`+l{93I>+Z+Gi@KqSA#45w79i}XCa1P62Z^5X z9B8TuN(mcl2=2irE?>_P1FJeTQCtMw`!evJgC(Flm{$$zcNhP{6oGd*tQ*eGi>-3ZC zfsn3XBHF!1?pq@@u8~>RgwuS@am$Et^kCi9*X#D05IU;)tF@$6*9xe3^yn24kw{Fm zkGG8eZbaL^y$8apVft;N=Ua+ihn%m zpb+o6BYEePq^r0y80KtoQ{PBZ{~LE=NSogF81gZgxI-FKvQ0m@qpl&@8Fvn7|6aZP z;{5{$x`=Zzuo0{?aW$BmGp!)DBF#!r0_zk7uBE7-%y7mywS*8=8>$Ka< z?!}o#DbKi+F(%6p1;!R8*P!BQ(+JWBy!OOqHHi_h#Tw%m0)1*x zX`K3acqEo2lx9r=gOZhmbadPr4hpIc+k;X;Hk>%DR|3I2c`PxyHwg81A#-34pj>1U zFb2lntwxk8(Z^a;6WuBl4R|0rsrXy|-!zMUA_|}2B4~h56^n8p``TzsL8|j2+j*we zDO}{#C)(T0-Zn{_3E6(%5VHjT|N4MWuQv9N8})G+s+5e_C*?0B5`RFkm#B_?$`}vf zgg)MYaLzuVB~}|HJkr3bw=pV@3f*``b8vZYGqikZwLZoN>0@3K%)ZagO#hu~lNys?0MbF!OTXNe0JowOw7S}MZ(^HI#eSrOr$ zUB}oTyJam!{Pc=>aP#G35ERc-sd1GK4ICI;*|HdAlR4odjumW{Y)VKK+p1?P<02L=J20%C68>v8)YuUqMVJ|kiBg8M}+r~_p`PcqKe gmUMG>B|S85bpEVc|7@fsq5e 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

  • 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 X(WW2U8J4(nwQy3Y6!O7yrc(b0nH+!# literal 0 HcmV?d00001 diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/utfbd30.bin b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/utfbd30.bin new file mode 100644 index 0000000000000000000000000000000000000000..dfd6a46343a97329173ab2ffc1f204268a9e938a GIT binary patch literal 8124 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 1->16k 2->32k 3->64k 4->128k) +gVhtAmpduLenExponent=7 + +# Maximum MPDU length (VHT only. Valid values: 0->3895 octets, 1->7991 octets, 2->11454 octets) +gVhtMpduLen=2 + +# Maximum number of wow filters required +#gMaxWoWFilters=22 + +# WOW Enable/Disable. +# 0 - Disable both magic pattern match and pattern byte match. +# 1 - Enable magic pattern match on all interfaces. +# 2 - Enable pattern byte match on all interfaces. +# 3 - Enable both magic patter and pattern byte match on all interfaces. +# Default value of gEnableWoW is 3. +# gEnableWoW=0 + +#Enable or Disable p2p device address administered +isP2pDeviceAddrAdministrated=0 + +# Set Thermal Power limit +TxPower2g=10 +TxPower5g=10 + +#Enable VHT on 2.4Ghz +gEnableVhtFor24GHzBand=1 + +#Enable or Disable 5G early beacon termination +gEnable5gEBT=1 + +ssdp = 0 + +#Enable Hysteretic mode +gEnableHystereticMode=1 + +# Bus bandwidth compute timeout value in ms +gBusBandwidthComputeInterval=2000 + +# Regulatory Setting; 0=STRICT; 1=CUSTOM +gRegulatoryChangeCountry=1 + +# Enable/Disable RX full reorder offload +gReorderOffloadSupported=1 + +#Set SAP max peer to 16 which allows 10 WEP connection +gSoftApMaxPeers=16 + +# Whether userspace country code setting shld have priority +gCountryCodePriority=1 + +# Enable(1)/Disable(0) SIFS burst +gEnableSifsBurst=1 + +# Enable or Disable Multi-user MIMO +# 1=Enable (default), 0=Disable +gEnableMuBformee=1 + +# Inactivity time (in ms) to end TX Service Period while in IBSS power save mode +gIbssTxSpEndInactivityTime=10 + +END + +# Note: Configuration parser would not read anything past the END marker + From f15d7c3e313e25f2a1ba01d877c95dea8d9a0e35 Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 10 May 2016 14:45:59 +0200 Subject: [PATCH 019/117] meta-digi-dey: Add auto-serial-console recipe. This support comes from meta-linaro @9f899282caa9 and adds the ability to configure getty dynamically from the console argument in the kernel command line. This will make it possible to enable/disable the console dynamically as signalled by U-Boot. Signed-off-by: Alex Gonzalez --- .../auto-serial-console/auto-getty | 24 +++++++++++++ .../auto-serial-console/auto-serial-console | 29 ++++++++++++++++ .../auto-serial-console/autogetty | 1 + .../auto-serial-console_0.1.bb | 34 +++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100755 meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/auto-getty create mode 100755 meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/auto-serial-console create mode 100644 meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/autogetty create mode 100644 meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console_0.1.bb diff --git a/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/auto-getty b/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/auto-getty new file mode 100755 index 000000000..cc600e543 --- /dev/null +++ b/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/auto-getty @@ -0,0 +1,24 @@ +#!/bin/sh + +set -e + +[ -f "/etc/default/autogetty" ] && . /etc/default/autogetty + +[ "${ENABLED}" != "1" ] && exit + +for arg in $(cat /proc/cmdline); do + case "${arg}" in + console=*) + eval ${arg} + TTY="${console%,*}" + SPEED="${console#*,}" + + # If no speed is given default to 115200 and fall-back + [ "${SPEED}" = "${TTY}" ] && SPEED="115200,57600,38400,19200,9600" + + if [ -n "${TTY}" ] && grep -qs "${TTY}" /etc/securetty; then + /sbin/getty -L "${SPEED}" "${TTY}" & + fi + ;; + esac +done diff --git a/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/auto-serial-console b/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/auto-serial-console new file mode 100755 index 000000000..12da6fc75 --- /dev/null +++ b/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/auto-serial-console @@ -0,0 +1,29 @@ +#!/bin/sh + +PATH=/sbin:/bin:/usr/sbin:/usr/bin +DAEMON=/usr/bin/auto-getty +NAME="auto-getty" + +case "$1" in + start) + echo -n "Starting auto-serial-console: " + start-stop-daemon -S -b -n $NAME --exec $DAEMON + echo "done" + ;; + stop) + echo -n "Stopping auto-serial-console: " + start-stop-daemon -K -n $NAME + echo "done" + ;; + restart) + $0 stop + $0 start + ;; + *) + echo "Usage: auto-serial-console { start | stop | restart }" >&2 + exit 1 + ;; +esac + +exit 0 + diff --git a/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/autogetty b/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/autogetty new file mode 100644 index 000000000..7543d5066 --- /dev/null +++ b/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console/autogetty @@ -0,0 +1 @@ +ENABLED=##ENABLED## diff --git a/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console_0.1.bb b/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console_0.1.bb new file mode 100644 index 000000000..8de93f2cf --- /dev/null +++ b/meta-digi-dey/recipes-digi/auto-serial-console/auto-serial-console_0.1.bb @@ -0,0 +1,34 @@ +SUMMARY = "Auto Serial Console script" +DESCRIPTION = "Scripts to call the console tty from the kernel cmd line" +SECTION = "base" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "\ + file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d690 \ + file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420 \ +" + +SRC_URI = "\ + file://autogetty \ + file://auto-getty \ + file://auto-serial-console \ +" + +S = "${WORKDIR}" + +inherit update-rc.d + +INITSCRIPT_NAME = "auto-serial-console" +INITSCRIPT_PARAMS = "start 99 5 ." + +do_install () { + install -m 0755 -d ${D}${sysconfdir}/default + AUTOGETTY_ENABLE='${@base_conditional( "TRUSTFENCE_CONSOLE_DISABLE", "1", "1", "0", d )}' + install -m 0644 ${WORKDIR}/autogetty ${D}${sysconfdir}/default/autogetty + sed -i -e "s/##ENABLED##/${AUTOGETTY_ENABLE}/g" ${D}${sysconfdir}/default/autogetty + + install -m 0755 -d ${D}${sysconfdir}/init.d + install -m 0755 ${WORKDIR}/auto-serial-console ${D}${sysconfdir}/init.d/auto-serial-console + + install -m 0755 -d ${D}${bindir} + install -m 0755 ${WORKDIR}/auto-getty ${D}${bindir}/auto-getty +} From 5351b71c8286752f788161b78ded9261d372d199 Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 10 May 2016 17:31:55 +0200 Subject: [PATCH 020/117] meta-digi-dey: sysvinit: No getty in inittab if console disabled. Signed-off-by: Alex Gonzalez --- meta-digi-arm/conf/machine/ccimx6sbc.conf | 2 +- .../recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bbappend | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 meta-digi-dey/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bbappend diff --git a/meta-digi-arm/conf/machine/ccimx6sbc.conf b/meta-digi-arm/conf/machine/ccimx6sbc.conf index 31804f96e..4b70319bb 100644 --- a/meta-digi-arm/conf/machine/ccimx6sbc.conf +++ b/meta-digi-arm/conf/machine/ccimx6sbc.conf @@ -27,7 +27,7 @@ KERNEL_DEVICETREE ?= " \ imx6dl-ccimx6sbc-id131.dtb \ " -SERIAL_CONSOLES = "115200;ttymxc3" +SERIAL_CONSOLES ?= "115200;ttymxc3" # Bluetooth tty BT_TTY ?= "ttymxc1" diff --git a/meta-digi-dey/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bbappend b/meta-digi-dey/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bbappend new file mode 100644 index 000000000..551283000 --- /dev/null +++ b/meta-digi-dey/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bbappend @@ -0,0 +1,6 @@ +# Copyright (C) 2016 Digi International. + +python __anonymous () { + if d.getVar("TRUSTFENCE_CONSOLE_DISABLE", True): + d.setVar("SERIAL_CONSOLES", "") +} From 12b196bc0fc9e289ca2db543b599e83058448568 Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 10 May 2016 18:15:36 +0200 Subject: [PATCH 021/117] meta-digi-arm: u-boot-dey: Add secure console trustfence configuration support. Signed-off-by: Alex Gonzalez --- .../recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 8ae9e66eb..4c8eca0e4 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -31,6 +31,54 @@ inherit fsl-u-boot-localversion EXTRA_OEMAKE_append = " KCFLAGS=-fgnu89-inline" +UBOOT_EXTRA_CONF ?= "" + +do_compile () { + if [ "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-gold', 'ld-is-gold', '', d)}" = "ld-is-gold" ] ; then + sed -i 's/$(CROSS_COMPILE)ld$/$(CROSS_COMPILE)ld.bfd/g' config.mk + fi + + unset LDFLAGS + unset CFLAGS + unset CPPFLAGS + + if [ ! -e ${B}/.scmversion -a ! -e ${S}/.scmversion ] + then + echo ${UBOOT_LOCALVERSION} > ${B}/.scmversion + echo ${UBOOT_LOCALVERSION} > ${S}/.scmversion + fi + + if [ "x${UBOOT_CONFIG}" != "x" ] + then + for config in ${UBOOT_MACHINE}; do + i=`expr $i + 1`; + for type in ${UBOOT_CONFIG}; do + j=`expr $j + 1`; + if [ $j -eq $i ] + then + oe_runmake O=${config} ${config} + for var in ${UBOOT_EXTRA_CONF}; do + echo "${var}" >> ${config}/.config + done + oe_runmake O=${config} oldconfig + oe_runmake O=${config} ${UBOOT_MAKE_TARGET} + cp ${S}/${config}/${UBOOT_BINARY} ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} + fi + done + unset j + done + unset i + else + oe_runmake ${UBOOT_MACHINE} + for var in ${UBOOT_EXTRA_CONF}; do + echo "${var}" >> .config + done + oe_runmake O=${config} oldconfig + oe_runmake ${UBOOT_MAKE_TARGET} + fi + +} + do_deploy_append() { # Remove canonical U-Boot symlinks for ${UBOOT_CONFIG} currently in the form: # u-boot-.imx- From 05f1daeecc082af527418ee46eadde677656d72b Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Wed, 11 May 2016 11:12:26 +0200 Subject: [PATCH 022/117] meta-digi-dey: systemd: Disable getty on console disable. Signed-off-by: Alex Gonzalez --- .../recipes-core/systemd/systemd-serialgetty.bbappend | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 meta-digi-dey/recipes-core/systemd/systemd-serialgetty.bbappend diff --git a/meta-digi-dey/recipes-core/systemd/systemd-serialgetty.bbappend b/meta-digi-dey/recipes-core/systemd/systemd-serialgetty.bbappend new file mode 100644 index 000000000..551283000 --- /dev/null +++ b/meta-digi-dey/recipes-core/systemd/systemd-serialgetty.bbappend @@ -0,0 +1,6 @@ +# Copyright (C) 2016 Digi International. + +python __anonymous () { + if d.getVar("TRUSTFENCE_CONSOLE_DISABLE", True): + d.setVar("SERIAL_CONSOLES", "") +} From 1fa78eb3de195bbcb64d39f2c25d8231bb3ca295 Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Wed, 11 May 2016 11:14:14 +0200 Subject: [PATCH 023/117] meta-digi-dey: Add dey-trustfence packagegroup and feature. Signed-off-by: Alex Gonzalez --- meta-digi-dey/conf/distro/dey.conf | 1 + .../packagegroups/packagegroup-dey-trustfence.bb | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-trustfence.bb diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index f550fb473..61e94fb2b 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -33,6 +33,7 @@ FEATURE_PACKAGES_dey-examples = "packagegroup-dey-examples" FEATURE_PACKAGES_dey-gstreamer = "packagegroup-dey-gstreamer" FEATURE_PACKAGES_dey-network = "packagegroup-dey-network" FEATURE_PACKAGES_dey-qt = "packagegroup-dey-qt" +FEATURE_PACKAGES_dey-trustfence = "packagegroup-dey-trustfence" FEATURE_PACKAGES_dey-wireless = "packagegroup-dey-wireless" # Set the PREFERRED_PROVIDER for jpeg functionality based on the MACHINE diff --git a/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-trustfence.bb b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-trustfence.bb new file mode 100644 index 000000000..cab5f931e --- /dev/null +++ b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-trustfence.bb @@ -0,0 +1,12 @@ +# Copyright (C) 2016 Digi International. + +SUMMARY = "DEY trustfence packagegroup" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=3f40d7994397109285ec7b81fdeb3b58 \ + file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420" + +inherit packagegroup + +RDEPENDS_${PN} = "\ + ${@base_conditional('TRUSTFENCE_CONSOLE_DISABLE', '1', 'auto-serial-console', '', d)} \ +" From 2e95ff7519faa4c214c9dafbd240531418f75510 Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 10 May 2016 18:16:28 +0200 Subject: [PATCH 024/117] meta-digi: Add TrustFence configuration class. This commit adds a trustfence class to encapsulate all trustfence configurations. https://jira.digi.com/browse/DEL-2257 Signed-off-by: Alex Gonzalez --- meta-digi-dey/classes/trustfence.bbclass | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 meta-digi-dey/classes/trustfence.bbclass diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass new file mode 100644 index 000000000..6058e450e --- /dev/null +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -0,0 +1,36 @@ +# Adds TrustFence configuration +# +# To use it add the following line to conf/local.conf: +# +# INHERIT += "trustfence" +# +# Inheriting this class enables the following default TrustFence configuration: +# +# * Disabled console +# + +# Default secure console configuration +TRUSTFENCE_CONSOLE_DISABLE ?= "1" + +# Uncomment to enable the console with the specified passphrase +#TRUSTFENCE_CONSOLE_PASSPHRASE_ENABLE = "my_secure_passphrase" + +# Alternatively, uncommment to enable the console with the specified GPIO +#TRUSTFENCE_CONSOLE_GPIO_ENABLE = "4" + +IMAGE_FEATURES += "dey-trustfence" + +UBOOT_EXTRA_CONF = "" + +python () { + import hashlib + + # Secure console configuration + if d.getVar("TRUSTFENCE_CONSOLE_DISABLE", True): + d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_CONSOLE_DISABLE=y ") + if d.getVar("TRUSTFENCE_CONSOLE_PASSPHRASE_ENABLE", True): + passphrase_hash = hashlib.sha256(d.getVar("TRUSTFENCE_CONSOLE_PASSPHRASE_ENABLE")).hexdigest() + d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_CONSOLE_ENABLE_PASSPHRASE=y CONFIG_CONSOLE_ENABLE_PASSPHRASE_KEY=\\"%s\\" ' % passphrase_hash) + elif d.getVar("TRUSTFENCE_CONSOLE_GPIO_ENABLE", True): + d.appendVar("UBOOT_EXTRA_CONF", " CONFIG_CONSOLE_ENABLE_GPIO=y CONFIG_CCIMX6SBC_CONSOLE_ENABLE_GPIO_NR=%s " % d.getVar("TRUSTFENCE_CONSOLE_GPIO_ENABLE")) +} From 8361d98e5abe2a3e17a2ca504b2abea1504f8ed6 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 1 Jun 2016 12:47:30 +0200 Subject: [PATCH 025/117] linux: update kernel source branch for ccimx6ul https://jira.digi.com/browse/DEL-2368 Signed-off-by: Isaac Hermida --- meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb index 612b5a5b9..4f107ab7d 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb @@ -3,7 +3,7 @@ require recipes-kernel/linux/linux-dey.inc require recipes-kernel/linux/linux-dtb.inc -SRCBRANCH_ccimx6ul = "v4.1/master" +SRCBRANCH = "v4.1/maint" SRCREV = "${AUTOREV}" COMPATIBLE_MACHINE = "(ccimx6ul)" From 0aa26fb70a5642fe6869ddf9196d53cfcea51a83 Mon Sep 17 00:00:00 2001 From: Victor Rubio Date: Thu, 2 Jun 2016 20:04:31 +0200 Subject: [PATCH 026/117] meta-digi-dey: add sysinfo package to dey-core packagegroup sysinfo is a bash script which gathers all the relevant information from a running system on a timestamped compressed file. https://jira.digi.com/browse/DEL-2447 Signed-off-by: Victor Rubio Victor.RubioTorroba@digi.com Signed-off-by: Alex Gonzalez Signed-off-by: Javier Viguera --- .../packagegroups/packagegroup-dey-core.bb | 1 + meta-digi-dey/recipes-digi/sysinfo/sysinfo.bb | 15 ++ .../recipes-digi/sysinfo/sysinfo/sysinfo | 215 ++++++++++++++++++ 3 files changed, 231 insertions(+) create mode 100644 meta-digi-dey/recipes-digi/sysinfo/sysinfo.bb create mode 100755 meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo diff --git a/meta-digi-dey/recipes-core/packagegroups/packagegroup-dey-core.bb b/meta-digi-dey/recipes-core/packagegroups/packagegroup-dey-core.bb index 1141b8094..d373fac40 100644 --- a/meta-digi-dey/recipes-core/packagegroups/packagegroup-dey-core.bb +++ b/meta-digi-dey/recipes-core/packagegroups/packagegroup-dey-core.bb @@ -39,6 +39,7 @@ RDEPENDS_${PN} = "\ modutils-initscripts \ netbase \ os-release \ + sysinfo \ usbutils \ ${VIRTUAL-RUNTIME_dev_manager} \ ${VIRTUAL-RUNTIME_init_manager} \ diff --git a/meta-digi-dey/recipes-digi/sysinfo/sysinfo.bb b/meta-digi-dey/recipes-digi/sysinfo/sysinfo.bb new file mode 100644 index 000000000..c46fdf74b --- /dev/null +++ b/meta-digi-dey/recipes-digi/sysinfo/sysinfo.bb @@ -0,0 +1,15 @@ +# Copyright (C) 2016 Digi International. + +SUMMARY = "Digi's system info utility" +SECTION = "base" +LICENSE = "GPL-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://sysinfo" + +S = "${WORKDIR}" + +do_install() { + install -d ${D}${bindir} + install -m 0755 sysinfo ${D}${bindir} +} diff --git a/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo b/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo new file mode 100755 index 000000000..8b0f2b9d7 --- /dev/null +++ b/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo @@ -0,0 +1,215 @@ +#!/bin/sh +#=============================================================================== +# +# sysinfo +# +# Copyright (C) 2016 by Digi International Inc. +# All rights reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# +# !Description: System information gather script +# +#=============================================================================== + +FW_PRINTENV="$(which fw_printenv)" + +make_report(){ + echo "--------------------------------------" + echo "- -" + echo "- Uptime -" + echo "- -" + echo "--------------------------------------" + echo "" + uptime + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Kernel version -" + echo "- -" + echo "--------------------------------------" + echo "" + uname -a + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- OS release -" + echo "- -" + echo "--------------------------------------" + echo "" + if [ -f "/etc/os-release" ]; then + cat /etc/os-release + else + echo "[NOT FOUND] /etc/os-release" + fi + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Build configurations -" + echo "- -" + echo "--------------------------------------" + echo "" + if [ -f "/etc/build" ]; then + cat /etc/build + else + echo "[NOT FOUND] /etc/build" + fi + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- U-boot saved environment -" + echo "- -" + echo "--------------------------------------" + echo "" + if [ -x "${FW_PRINTENV}" ]; then + ${FW_PRINTENV} + else + echo "[NOT FOUND] fw_printenv" + fi + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Linux boot log -" + echo "- -" + echo "--------------------------------------" + echo "" + dmesg + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Log files from /var/log -" + echo "- -" + echo "--------------------------------------" + echo "" + for f in $(find /var/log/ -name *.log); do + echo "${f} FILE"; + echo "---------------------------------------"; + cat ${f}; + printf "\n\n" + done + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- /var/log/messages -" + echo "- -" + echo "--------------------------------------" + echo "" + if [ -f "/var/log/messages" ]; then + cat /var/log/messages + else + echo "[NOT FOUND] /var/log/messages" + fi + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Linux kernel configuration -" + echo "- -" + echo "--------------------------------------" + echo "" + if [ -f "/proc/config.gz" ]; then + zcat /proc/config.gz + else + echo "[NOT FOUND] /proc/config.gz" + fi + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Memory consumption -" + echo "- -" + echo "--------------------------------------" + echo "" + free + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Running processes -" + echo "- -" + echo "--------------------------------------" + echo "" + ps -l + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Mounts -" + echo "- -" + echo "--------------------------------------" + echo "" + mount + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Opened ports -" + echo "- -" + echo "--------------------------------------" + echo "" + netstat -n -l + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Routes -" + echo "- -" + echo "--------------------------------------" + echo "" + route -n + printf "\n\n" + + echo "--------------------------------------" + echo "- -" + echo "- Network configuration -" + echo "- -" + echo "--------------------------------------" + echo "" + ifconfig -a + printf "\n" + + echo "-------------End of report------------" +} + + +DEY_VERSION="$(sed -ne 's,DISTRO_VERSION = \(.*\)$,\1,g;T;p' /etc/build)" +UBOOT_VERSION="$(strings /dev/mmcblk0boot0 | grep dub | cut -d' ' -f2)" +BOARD_VARIANT="$(cat /proc/device-tree/digi,hwid,variant)" +BOARD_SN="$(cat /proc/device-tree/digi,hwid,sn)" +BOARD_VERSION="$(cat /proc/device-tree/digi,carrierboard,version)" +BOARD_ID="$(cat /proc/device-tree/digi,carrierboard,id)" + +DATE="$(date "+%Y%m%d%H%M%S")" +FILE="/tmp/sysinfo-${DEY_VERSION}-${BOARD_SN}-${DATE}.txt" +printf "\n\n" + +( + echo "-------------------------------------" + echo "- -" + echo "- ENVIRONMENT TABLE -" + echo "- -" + echo "-------------------------------------" + echo "" + + echo "||*Component*|*Version*" + echo "|| DUT | SN-${BOARD_SN}, CC6 ${BOARD_VARIANT} SBCv${BOARD_VERSION} board_ID=${BOARD_ID}." + echo "|| U-Boot | ${UBOOT_VERSION}" + echo "|| Firmware | ${DEY_VERSION}-$(cat /etc/version)" + echo "|| Kernel | $(uname -a)" + printf "\n\n" +) | tee ${FILE} + +make_report >> ${FILE} +gzip ${FILE} +echo "Report generated in ${FILE}.gz" +printf "\n\n" From 5f45a87ebd42e99673fca24365d8643a1c179592 Mon Sep 17 00:00:00 2001 From: Jose Diaz de Grenu de Pedro Date: Tue, 31 May 2016 11:22:31 +0200 Subject: [PATCH 027/117] meta-digi-arm: trustfence: implement Yocto secure boot configuration Implement the set of TRUSTFENCE_ macros to configure each secure boot feature available in U-Boot. https://jira.digi.com/browse/DUB-570 Signed-off-by: Jose Diaz de Grenu de Pedro --- .../recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 19 +++++++++++++++++++ meta-digi-dey/classes/trustfence.bbclass | 18 ++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 4c8eca0e4..47aa9b21f 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -63,6 +63,12 @@ do_compile () { oe_runmake O=${config} oldconfig oe_runmake O=${config} ${UBOOT_MAKE_TARGET} cp ${S}/${config}/${UBOOT_BINARY} ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} + + # Secure boot artifacts + if [ -n "${TRUSTFENCE_UBOOT_SIGN}" ]; then + then + cp ${S}/${config}/u-boot-signed.imx ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} + fi fi done unset j @@ -94,6 +100,19 @@ do_deploy_append() { cd ${DEPLOYDIR} rm -r ${UBOOT_BINARY}-${type} ${UBOOT_SYMLINK}-${type} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-${type}.${UBOOT_SUFFIX} + if [ -n "${TRUSTFENCE_UBOOT_SIGN}" ] + then + install ${S}/${config}/SRK_efuses.bin SRK_efuses-${PV}-${PR}.bin + install ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + ln -sf u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-signed-${type}.${UBOOT_SUFFIX} + ln -sf SRK_efuses-${PV}-${PR}.bin SRK_efuses.bin + if [ -n "${TRUSTFENCE_UBOOT_ENCRYPT}" ] + then + # Move the data encryption key in plain text directly to the deployment directory. + # Do not leave any other copies in the machine. + mv ${S}/${config}/dek.bin ${DEPLOYDIR}/dek-${type}.bin + fi + fi fi done unset j diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index 6058e450e..bd627dec7 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -33,4 +33,22 @@ python () { d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_CONSOLE_ENABLE_PASSPHRASE=y CONFIG_CONSOLE_ENABLE_PASSPHRASE_KEY=\\"%s\\" ' % passphrase_hash) elif d.getVar("TRUSTFENCE_CONSOLE_GPIO_ENABLE", True): d.appendVar("UBOOT_EXTRA_CONF", " CONFIG_CONSOLE_ENABLE_GPIO=y CONFIG_CCIMX6SBC_CONSOLE_ENABLE_GPIO_NR=%s " % d.getVar("TRUSTFENCE_CONSOLE_GPIO_ENABLE")) + + # Secure boot configuration + if d.getVar("TRUSTFENCE_CHECK_KERNEL", True): + d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_SECURE_BOOT=y ") + if d.getVar("TRUSTFENCE_UBOOT_SIGN", True): + d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_SIGN_IMAGE=y ") + if d.getVar("TRUSTFENCE_CST_PATH", True): + d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_CST_PATH=\\"%s\\" ' % d.getVar("TRUSTFENCE_CST_PATH")) + if d.getVar("TRUSTFENCE_CSF_SIZE", True): + d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_CSF_SIZE=%s " % d.getVar("TRUSTFENCE_CSF_SIZE")) + if d.getVar("TRUSTFENCE_KEY_INDEX", True): + d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_KEY_INDEX=%s " % d.getVar("TRUSTFENCE_KEY_INDEX")) + if d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True): + d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_ENCRYPT_IMAGE=y ") + if d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE", True): + d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_DEK_SIZE=%s " % d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE")) + if d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True): + d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_ENV_AES=y CONFIG_ENV_AES_KEY=\\"%s\\"' % d.getVar("TRUSTFENCE_UBOOT_ENV_DEK")) } From 64c488a821bc8b68b7ca092a4bfd664d74895283 Mon Sep 17 00:00:00 2001 From: Jose Diaz de Grenu de Pedro Date: Mon, 6 Jun 2016 10:06:22 +0200 Subject: [PATCH 028/117] meta-digi-arm: u-boot: fix syntax error in U-Boot recipe Signed-off-by: Jose Diaz de Grenu de Pedro --- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 47aa9b21f..e48d06515 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -65,7 +65,7 @@ do_compile () { cp ${S}/${config}/${UBOOT_BINARY} ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} # Secure boot artifacts - if [ -n "${TRUSTFENCE_UBOOT_SIGN}" ]; then + if [ -n "${TRUSTFENCE_UBOOT_SIGN}" ] then cp ${S}/${config}/u-boot-signed.imx ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} fi From ac740b7fdc147bc9ccb03ef0f78f638b96d1b618 Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 7 Jun 2016 10:50:05 +0200 Subject: [PATCH 029/117] meta-digi-dey: trustfence: Explicitely check for "1" for variable enable https://jira.digi.com/browse/DEL-2603 Signed-off-by: Alex Gonzalez --- meta-digi-dey/classes/trustfence.bbclass | 2 +- meta-digi-dey/recipes-core/systemd/systemd-serialgetty.bbappend | 2 +- .../recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bbappend | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index bd627dec7..e37dc54d2 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -26,7 +26,7 @@ python () { import hashlib # Secure console configuration - if d.getVar("TRUSTFENCE_CONSOLE_DISABLE", True): + if (d.getVar("TRUSTFENCE_CONSOLE_DISABLE", True) == "1"): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_CONSOLE_DISABLE=y ") if d.getVar("TRUSTFENCE_CONSOLE_PASSPHRASE_ENABLE", True): passphrase_hash = hashlib.sha256(d.getVar("TRUSTFENCE_CONSOLE_PASSPHRASE_ENABLE")).hexdigest() diff --git a/meta-digi-dey/recipes-core/systemd/systemd-serialgetty.bbappend b/meta-digi-dey/recipes-core/systemd/systemd-serialgetty.bbappend index 551283000..f489f61be 100644 --- a/meta-digi-dey/recipes-core/systemd/systemd-serialgetty.bbappend +++ b/meta-digi-dey/recipes-core/systemd/systemd-serialgetty.bbappend @@ -1,6 +1,6 @@ # Copyright (C) 2016 Digi International. python __anonymous () { - if d.getVar("TRUSTFENCE_CONSOLE_DISABLE", True): + if (d.getVar("TRUSTFENCE_CONSOLE_DISABLE", True) == "1"): d.setVar("SERIAL_CONSOLES", "") } diff --git a/meta-digi-dey/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bbappend b/meta-digi-dey/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bbappend index 551283000..f489f61be 100644 --- a/meta-digi-dey/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bbappend +++ b/meta-digi-dey/recipes-core/sysvinit/sysvinit-inittab_2.88dsf.bbappend @@ -1,6 +1,6 @@ # Copyright (C) 2016 Digi International. python __anonymous () { - if d.getVar("TRUSTFENCE_CONSOLE_DISABLE", True): + if (d.getVar("TRUSTFENCE_CONSOLE_DISABLE", True) == "1"): d.setVar("SERIAL_CONSOLES", "") } From 68746632f1f0c09783e097982ccafdcd4d5be40e Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Mon, 13 Jun 2016 12:23:32 +0200 Subject: [PATCH 030/117] linux: update kernel source branch for ccimx6ul Signed-off-by: Isaac Hermida --- meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb index 4f107ab7d..96399f669 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey_4.1.bb @@ -3,7 +3,7 @@ require recipes-kernel/linux/linux-dey.inc require recipes-kernel/linux/linux-dtb.inc -SRCBRANCH = "v4.1/maint" +SRCBRANCH = "v4.1.15/master" SRCREV = "${AUTOREV}" COMPATIBLE_MACHINE = "(ccimx6ul)" From c715e16c459bedf828f326fcfbaa8e44882c0f7b Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Fri, 10 Jun 2016 12:34:06 +0200 Subject: [PATCH 031/117] ccimx6ulstarter.conf: fix incorrect serial port console Signed-off-by: Isaac Hermida --- meta-digi-arm/conf/machine/ccimx6ulstarter.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf index 978982153..e3be458b7 100644 --- a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf +++ b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf @@ -15,7 +15,7 @@ KERNEL_DEVICETREE ?= " \ imx6ul-ccimx6ulstarter-wb.dtb \ " -SERIAL_CONSOLES = "115200;ttymxc1" +SERIAL_CONSOLES = "115200;ttymxc4" # Bluetooth tty BT_TTY ?= "ttymxc0" From 9765192fbdf1b305a1f9d99e5a1d803773bf4aff Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Fri, 10 Jun 2016 16:55:48 +0200 Subject: [PATCH 032/117] bluez5-init: add support for qca6564 Add initial support for the qca6564 chip. https://jira.digi.com/browse/DEL-2611 Signed-off-by: Isaac Hermida --- .../bluez/bluez5-5.33/bluez-init | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init index 8e42e5b26..37151123d 100755 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init @@ -23,7 +23,22 @@ fi SCRIPTNAME="$(basename "${0}")" -bt_init() { +bt_init_qca6564() { + if hciattach -t120 ttyBt qca 3000000 flow 2>/dev/null; then + : # No-op + else + echo "${SCRIPTNAME}: FAILED (hciattach)" + exit + fi + if hciconfig hci0 up; then + echo "${SCRIPTNAME}: OK" + else + echo "${SCRIPTNAME}: FAILED (hciconfig)" + exit + fi +} + +bt_init_ar3k() { if grep -qs '\' /proc/device-tree/compatible; then BT_PWR_GPIO_NR="21" elif grep -qs '\' /proc/device-tree/compatible; then @@ -98,7 +113,13 @@ bt_init() { } # Check if this hardware does support Bluetooth -[ -d "/proc/device-tree/bluetooth" ] && bt_init +if [ -d "/proc/device-tree/bluetooth" ]; then + if grep -qs '\' /proc/device-tree/compatible; then + bt_init_qca6564 + else + bt_init_ar3k + fi +fi echo "Starting bluetooth services." start-stop-daemon -S --background --exec /usr/lib/bluez5/bluetooth/bluetoothd From 756ba7b8cfd23f62755dca65bd05da135e23012a Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 14 Jun 2016 09:58:06 +0200 Subject: [PATCH 033/117] bluez5-init: disable the HW flow control for qca6564 Add a software workaround to disable the HW flow control because the SOM revision 3 (and older) has swapped the bluetooth TX and RX lines so we need to operate in DTE mode which implies that the HW control lines are swapped. This also implies reducing the baudrate to avoid the need for HW flow control. https://jira.digi.com/browse/DEL-2611 Signed-off-by: Isaac Hermida --- .../bluez/bluez5-5.33/bluez-init | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init index 37151123d..5dfe8a764 100755 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init @@ -24,17 +24,31 @@ fi SCRIPTNAME="$(basename "${0}")" bt_init_qca6564() { - if hciattach -t120 ttyBt qca 3000000 flow 2>/dev/null; then + MOD_VERSION="$(($(cat /proc/device-tree/digi,hwid,hv 2>/dev/null || true)))" + + # Module version older than revision 4 has swapped TX and RX lines + if [ "${MOD_VERSION}" -lt "4" ]; then + # Workaround to ignore the CTS flow control line + BT_GPIO_CTS="18" + echo "${BT_GPIO_CTS}" > /sys/class/gpio/export + echo "out" > /sys/class/gpio/gpio${BT_GPIO_CTS}/direction + echo "0" > /sys/class/gpio/gpio${BT_GPIO_CTS}/value + # Reduce the rate to avoid the need for HW flow control + BT_RATE="115200" + BT_FLOW="noflow" + fi + + if hciattach -t120 ttyBt qca ${BT_RATE:-3000000} ${BT_FLOW:-flow} 2>/dev/null; then : # No-op else echo "${SCRIPTNAME}: FAILED (hciattach)" exit fi + if hciconfig hci0 up; then echo "${SCRIPTNAME}: OK" else - echo "${SCRIPTNAME}: FAILED (hciconfig)" - exit + echo "${SCRIPTNAME}: FAILED" fi } @@ -114,6 +128,7 @@ bt_init_ar3k() { # Check if this hardware does support Bluetooth if [ -d "/proc/device-tree/bluetooth" ]; then + # Initialize for the specific bluetooth chip if grep -qs '\' /proc/device-tree/compatible; then bt_init_qca6564 else From 5308fad8bcbc6455b0a5034dc4e6fc0b250806a8 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 16 Jun 2016 10:29:45 +0200 Subject: [PATCH 034/117] bluez5-init: add support to set qca6564 mac address The steps to set the bluetooth MAC address is send an specific hci command and an hci reset, so the bluetooth interface need to be up in order to configure it. Additionally we have generalized the way to read the MAC address from the device tree and removed some old code for getting the MAC address in kernel version 2. https://jira.digi.com/browse/DUB-595 Signed-off-by: Isaac Hermida --- .../bluez/bluez5-5.33/bluez-init | 50 +++++++++++++------ 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init index 5dfe8a764..9637792e5 100755 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init @@ -45,11 +45,35 @@ bt_init_qca6564() { exit fi - if hciconfig hci0 up; then - echo "${SCRIPTNAME}: OK" - else - echo "${SCRIPTNAME}: FAILED" + # Convert the BT address to the hcitool command format. + # Example: "00:04:F3:11:22:33" coverted to "33 22 11 F3 04 00" + HCI_BTADDR="$(echo ${BTADDR} | tr ':' '\n' | tac | tr '\n' ' ' | sed -e 's/ $//g')" + + # Up the interface to be able to send hci commands + if ! hciconfig hci0 up; then + echo "${SCRIPTNAME}: FAILED (hci0 up)" + exit fi + + # Set the MAC address + if ! hcitool -i hci0 cmd 3F 000B 01 02 06 ${HCI_BTADDR} > /dev/null; then + echo "${SCRIPTNAME}: FAILED (hci set MAC)" + exit + fi + + # HCI Reset + if ! hcitool -i hci0 cmd 03 0003 00 > /dev/null; then + echo "${SCRIPTNAME}: FAILED (hci reset)" + exit + fi + + # Down and up the interface to load the new MAC address + if ! hciconfig hci0 down; then + echo "${SCRIPTNAME}: FAILED (hci0 down)" + exit + fi + + hciconfig hci0 up && echo "${SCRIPTNAME}: OK" || echo "${SCRIPTNAME}: FAILED" } bt_init_ar3k() { @@ -63,16 +87,6 @@ bt_init_ar3k() { ( cd /lib/firmware/ar3k/1020200 - # Get MAC address from device tree or NVRAM. Use a default value it it has not been set. - if [ -f "/proc/device-tree/bluetooth/mac-address" ]; then - BTADDR="$(hexdump -ve '1/1 "%02X" ":"' /proc/device-tree/bluetooth/mac-address | sed 's/:$//g')" - else - BTADDR="$(sed -ne 's,^.*btaddr1=\([^[:blank:]]\+\)[:blank:]*.*,\1,g;T;p' /proc/cmdline)" - fi - if [ -z "${BTADDR}" ] || [ "${BTADDR}" = "00:00:00:00:00:00" ]; then - BTADDR="00:04:F3:FF:FF:BB" - fi - # Update the MAC address file only if it has changed. FW_MAC="ar3kbdaddr.pst" [ -f "${FW_MAC}" ] && [ "$(cat ${FW_MAC})" = "${BTADDR}" ] || echo ${BTADDR} > ${FW_MAC} @@ -128,6 +142,14 @@ bt_init_ar3k() { # Check if this hardware does support Bluetooth if [ -d "/proc/device-tree/bluetooth" ]; then + # Get MAC address from device tree. Use a default value if it has not been set. + if [ -f "/proc/device-tree/bluetooth/mac-address" ]; then + BTADDR="$(hexdump -ve '1/1 "%02X" ":"' /proc/device-tree/bluetooth/mac-address | sed 's/:$//g')" + fi + if [ -z "${BTADDR}" ] || [ "${BTADDR}" = "00:00:00:00:00:00" ]; then + BTADDR="00:04:F3:FF:FF:BB" + fi + # Initialize for the specific bluetooth chip if grep -qs '\' /proc/device-tree/compatible; then bt_init_qca6564 From 5c6de742880a176a4f412753f49925306cdac33c Mon Sep 17 00:00:00 2001 From: Jose Diaz de Grenu de Pedro Date: Mon, 13 Jun 2016 17:40:56 +0200 Subject: [PATCH 035/117] meta-digi-dey: trustfence: Explicitely check for "1" for variable enable. https://jira.digi.com/browse/DEL-2603 Signed-off-by: Alex Gonzalez Signed-off-by: Jose Diaz de Grenu de Pedro --- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 6 +++--- meta-digi-dey/classes/trustfence.bbclass | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index e48d06515..f7d9d0285 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -65,7 +65,7 @@ do_compile () { cp ${S}/${config}/${UBOOT_BINARY} ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} # Secure boot artifacts - if [ -n "${TRUSTFENCE_UBOOT_SIGN}" ] + if [ "${TRUSTFENCE_UBOOT_SIGN}" = "1" ] then cp ${S}/${config}/u-boot-signed.imx ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} fi @@ -100,13 +100,13 @@ do_deploy_append() { cd ${DEPLOYDIR} rm -r ${UBOOT_BINARY}-${type} ${UBOOT_SYMLINK}-${type} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-${type}.${UBOOT_SUFFIX} - if [ -n "${TRUSTFENCE_UBOOT_SIGN}" ] + if [ "${TRUSTFENCE_UBOOT_SIGN}" = "1" ] then install ${S}/${config}/SRK_efuses.bin SRK_efuses-${PV}-${PR}.bin install ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ln -sf u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-signed-${type}.${UBOOT_SUFFIX} ln -sf SRK_efuses-${PV}-${PR}.bin SRK_efuses.bin - if [ -n "${TRUSTFENCE_UBOOT_ENCRYPT}" ] + if [ "${TRUSTFENCE_UBOOT_ENCRYPT}" = "1" ] then # Move the data encryption key in plain text directly to the deployment directory. # Do not leave any other copies in the machine. diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index e37dc54d2..b40e5efe5 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -35,9 +35,9 @@ python () { d.appendVar("UBOOT_EXTRA_CONF", " CONFIG_CONSOLE_ENABLE_GPIO=y CONFIG_CCIMX6SBC_CONSOLE_ENABLE_GPIO_NR=%s " % d.getVar("TRUSTFENCE_CONSOLE_GPIO_ENABLE")) # Secure boot configuration - if d.getVar("TRUSTFENCE_CHECK_KERNEL", True): + if (d.getVar("TRUSTFENCE_CHECK_KERNEL", True) == "1"): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_SECURE_BOOT=y ") - if d.getVar("TRUSTFENCE_UBOOT_SIGN", True): + if (d.getVar("TRUSTFENCE_UBOOT_SIGN", True) == "1"): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_SIGN_IMAGE=y ") if d.getVar("TRUSTFENCE_CST_PATH", True): d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_CST_PATH=\\"%s\\" ' % d.getVar("TRUSTFENCE_CST_PATH")) @@ -45,7 +45,7 @@ python () { d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_CSF_SIZE=%s " % d.getVar("TRUSTFENCE_CSF_SIZE")) if d.getVar("TRUSTFENCE_KEY_INDEX", True): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_KEY_INDEX=%s " % d.getVar("TRUSTFENCE_KEY_INDEX")) - if d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True): + if (d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True) == "1"): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_ENCRYPT_IMAGE=y ") if d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE", True): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_DEK_SIZE=%s " % d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE")) From 3ef4fe1f34e8c14d7efc4993191f5ab4657f39c5 Mon Sep 17 00:00:00 2001 From: Jose Diaz de Grenu de Pedro Date: Tue, 14 Jun 2016 10:45:44 +0200 Subject: [PATCH 036/117] meta-digi-dey: trustfence: add default values for secure boot Signed-off-by: Jose Diaz de Grenu de Pedro --- meta-digi-dey/classes/trustfence.bbclass | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index b40e5efe5..bf7a5c2bb 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -18,12 +18,20 @@ TRUSTFENCE_CONSOLE_DISABLE ?= "1" # Alternatively, uncommment to enable the console with the specified GPIO #TRUSTFENCE_CONSOLE_GPIO_ENABLE = "4" +# Default secure boot configuration +TRUSTFENCE_CHECK_KERNEL ?= "1" +TRUSTFENCE_UBOOT_SIGN ?= "1" +TRUSTFENCE_UBOOT_ENCRYPT ?= "1" +TRUSTFENCE_UBOOT_ENV_DEK ?= "gen_random" + IMAGE_FEATURES += "dey-trustfence" UBOOT_EXTRA_CONF = "" python () { + import binascii import hashlib + import os # Secure console configuration if (d.getVar("TRUSTFENCE_CONSOLE_DISABLE", True) == "1"): @@ -35,6 +43,9 @@ python () { d.appendVar("UBOOT_EXTRA_CONF", " CONFIG_CONSOLE_ENABLE_GPIO=y CONFIG_CCIMX6SBC_CONSOLE_ENABLE_GPIO_NR=%s " % d.getVar("TRUSTFENCE_CONSOLE_GPIO_ENABLE")) # Secure boot configuration + if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK") == "gen_random"): + d.setVar("TRUSTFENCE_UBOOT_ENV_DEK", str(binascii.hexlify(os.urandom(16)).decode())) + if (d.getVar("TRUSTFENCE_CHECK_KERNEL", True) == "1"): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_SECURE_BOOT=y ") if (d.getVar("TRUSTFENCE_UBOOT_SIGN", True) == "1"): From ba6b5ffd8cd7a298695b4ce65ab3a085f17b4141 Mon Sep 17 00:00:00 2001 From: Jose Diaz de Grenu de Pedro Date: Tue, 14 Jun 2016 11:16:29 +0200 Subject: [PATCH 037/117] meta-digi-arm: u-boot: add secure boot configuration checks https://jira.digi.com/browse/DEL-2618 Signed-off-by: Jose Diaz de Grenu de Pedro --- .../recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index f7d9d0285..d51a43ea5 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -33,6 +33,18 @@ EXTRA_OEMAKE_append = " KCFLAGS=-fgnu89-inline" UBOOT_EXTRA_CONF ?= "" +python __anonymous() { + if (d.getVar("TRUSTFENCE_UBOOT_SIGN", True) == "1") and not d.getVar("TRUSTFENCE_CST_PATH", True): + bb.fatal("NXP's CST tool needs to be installed and a PKI tree generated. Please download it from the NXP website at http://www.nxp.com/pages/i.mx-design-tools:IMX_DESIGN?fsrch=1&sr=1&pageNum=1") + if (d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True) == "1") and (d.getVar("TRUSTFENCE_UBOOT_SIGN", True) != "1"): + bb.fatal("Only signed U-Boot images can be encrypted. Generate signed images (TRUSTFENCE_UBOOT_SIGN=1) or remove encryption (TRUSTFENCE_UBOOT_ENCRYPT=0)") + if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True) != "0"): + if (d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True) != "1"): + bb.warn("It is strongly recommended to encrypt the U-Boot image when using environment encrpytion. Consider defining TRUSTFENCE_UBOOT_ENCRYPT=1") + if (len(d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True)) != 32): + bb.fatal("Invalid TRUSTFENCE_UBOOT_ENV_DEK length. Define a string formed by 32 hexadecimal characters") +} + do_compile () { if [ "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-gold', 'ld-is-gold', '', d)}" = "ld-is-gold" ] ; then sed -i 's/$(CROSS_COMPILE)ld$/$(CROSS_COMPILE)ld.bfd/g' config.mk From 62e0e1c6c60fd092021446b5d61b7b4b170deee9 Mon Sep 17 00:00:00 2001 From: Jose Diaz de Grenu de Pedro Date: Mon, 20 Jun 2016 15:03:05 +0200 Subject: [PATCH 038/117] meta-digi-arm: u-boot: fix trustfence checks logic There are several possible values for TRUSTFENCE_UBOOT_ENV_DEK: * Not defined: if the trustfence support is not included. Should not include the feature. * 32 characters: when defining a valid key. Should include the feature. * "0": when explicetily disabling the feature. Should not include the feature * : Invalid value, should trigger the error. This commits fixes the logic so that 'None' (no defined) is taken as a valid value. Signed-off-by: Jose Diaz de Grenu de Pedro --- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index d51a43ea5..f749ccc3d 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -38,7 +38,7 @@ python __anonymous() { bb.fatal("NXP's CST tool needs to be installed and a PKI tree generated. Please download it from the NXP website at http://www.nxp.com/pages/i.mx-design-tools:IMX_DESIGN?fsrch=1&sr=1&pageNum=1") if (d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True) == "1") and (d.getVar("TRUSTFENCE_UBOOT_SIGN", True) != "1"): bb.fatal("Only signed U-Boot images can be encrypted. Generate signed images (TRUSTFENCE_UBOOT_SIGN=1) or remove encryption (TRUSTFENCE_UBOOT_ENCRYPT=0)") - if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True) != "0"): + if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True) not in [None, "0"]): if (d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True) != "1"): bb.warn("It is strongly recommended to encrypt the U-Boot image when using environment encrpytion. Consider defining TRUSTFENCE_UBOOT_ENCRYPT=1") if (len(d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True)) != 32): From e2fb8459709b9dfe453083c9fccb1979254fbe44 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Mon, 20 Jun 2016 18:59:36 +0200 Subject: [PATCH 039/117] ccimx6ulstarter: remove sdcard image creation The CC6UL does not support booting from SD card, so it does not make sense to create a SDCARD image by default. Signed-off-by: Javier Viguera --- meta-digi-arm/conf/machine/ccimx6ulstarter.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf index e3be458b7..538260239 100644 --- a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf +++ b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf @@ -21,4 +21,4 @@ SERIAL_CONSOLES = "115200;ttymxc4" BT_TTY ?= "ttymxc0" # Flash image types -IMAGE_FSTYPES ?= "tar.bz2 ubifs sdcard" +IMAGE_FSTYPES ?= "tar.bz2 ubifs" From 7db92fc4762493ff478229cf074d6245cdf937ea Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Mon, 20 Jun 2016 19:15:58 +0200 Subject: [PATCH 040/117] build.sh: allow to define per platform bitbake image target Instead of having one default image target for all platforms allow to define this per platform. This is needed because for example for the 'ccimx6ulstarter' we want to define a default command line image instead of a QT-based one. Signed-off-by: Javier Viguera --- sdk/build.sh | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/sdk/build.sh b/sdk/build.sh index 2405d337d..8e5596d37 100755 --- a/sdk/build.sh +++ b/sdk/build.sh @@ -70,7 +70,9 @@ copy_images() { else cp -r tmp/deploy/images ${1}/ if [ "${DY_BUILD_TCHAIN}" = "true" ]; then - cp -r tmp/deploy/sdk ${1}/ + if [ -d tmp/deploy/sdk ]; then + cp -r tmp/deploy/sdk ${1}/ + fi fi fi @@ -116,7 +118,6 @@ purge_sstate() { [ -z "${WORKSPACE}" ] && error "WORKSPACE not specified" # Set default settings if Jenkins does not do it -[ -z "${DY_TARGET}" ] && DY_TARGET="dey-image-qt" [ -z "${DY_DISTRO}" ] && DY_DISTRO="dey" # If DY_BUILD_TCHAIN is unset, set it for release jobs @@ -127,8 +128,8 @@ if [ -z "${DY_FB_IMAGE}" ] && echo ${JOB_NAME} | grep -qs 'dey.*fb'; then DY_FB_IMAGE="true" fi -# Per-platform variants -while read _pl _var; do +# Per-platform data +while read _pl _var _tgt; do # DY_BUILD_VARIANTS comes from Jenkins environment: # 'false': don't build variants (only the default) # : build all the variants supported by the platform @@ -140,11 +141,13 @@ while read _pl _var; do _var="${DY_BUILD_VARIANTS}" fi fi + [ -n "${DY_TARGET}" ] && _tgt="${DY_TARGET}" || true eval "${_pl}_var=\"${_var}\"" + eval "${_pl}_tgt=\"${_tgt}\"" done<<-_EOF_ - ccardimx28js - e w wb web web1 - ccimx6sbc DONTBUILDVARIANTS - ccimx6ulstarter DONTBUILDVARIANTS + ccardimx28js - e w wb web web1 dey-image-qt + ccimx6sbc DONTBUILDVARIANTS dey-image-qt + ccimx6ulstarter DONTBUILDVARIANTS core-image-base _EOF_ YOCTO_IMGS_DIR="${WORKSPACE}/images" @@ -181,6 +184,7 @@ fi rm -rf ${YOCTO_IMGS_DIR} ${YOCTO_PROJ_DIR} for platform in ${DY_PLATFORMS}; do eval platform_variants="\${${platform}_var}" + eval platform_targets="\${${platform}_tgt}" for variant in ${platform_variants}; do _this_prj_dir="${YOCTO_PROJ_DIR}/${platform}" _this_img_dir="${YOCTO_IMGS_DIR}/${platform}" @@ -217,7 +221,7 @@ for platform in ${DY_PLATFORMS}; do if [ "${DY_FB_IMAGE}" = "true" ]; then printf "${X11_REMOVAL_CFG}" >> conf/local.conf fi - for target in ${DY_TARGET}; do + for target in ${platform_targets}; do printf "\n[INFO] Building the ${target} target.\n" time bitbake ${target} # Build the toolchain for DEY images From 1e16f6af66d17d8b38dc85ffb420d49d9f0dece8 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 21 Jun 2016 11:15:28 +0200 Subject: [PATCH 041/117] meta-digi: global replace base_contains function This function is deprecated in favor of bb.utils.contains. The same change has been done in other layers. Signed-off-by: Javier Viguera --- .../conf/machine/include/ccardimx28.inc | 2 +- .../conf/machine/include/ccimx6ul.inc | 4 +-- .../conf/machine/include/digi-defaults.inc | 12 ++++----- meta-digi-dey/conf/distro/dey.conf | 2 +- .../packagegroup-dey-bluetooth.bb | 4 +-- .../packagegroups/packagegroup-dey-network.bb | 2 +- .../recipes-core/images/dey-image-qt.bb | 10 +++---- .../init-ifupdown/init-ifupdown_1.0.bbappend | 2 +- .../packagegroups/packagegroup-dey-core.bb | 8 +++--- .../packagegroup-dey-examples.bb | 26 +++++++++---------- 10 files changed, 36 insertions(+), 36 deletions(-) diff --git a/meta-digi-arm/conf/machine/include/ccardimx28.inc b/meta-digi-arm/conf/machine/include/ccardimx28.inc index a153bf32e..e9a6af2fe 100644 --- a/meta-digi-arm/conf/machine/include/ccardimx28.inc +++ b/meta-digi-arm/conf/machine/include/ccardimx28.inc @@ -15,7 +15,7 @@ UBOOT_SYMLINK = "u-boot-${MACHINE}.${UBOOT_SUFFIX}" # Wireless external module WIRELESS_MODULE ?= "" -WIRELESS_MODULE_append = "${@base_contains('MACHINE_FEATURES', 'wifi', 'kernel-module-atheros', '', d)}" +WIRELESS_MODULE_append = "${@bb.utils.contains('MACHINE_FEATURES', 'wifi', 'kernel-module-atheros', '', d)}" # Firmware MACHINE_FIRMWARE ?= "" diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index 6a34347ce..16b6d9f62 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -26,8 +26,8 @@ MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins" MACHINE_FEATURES += "wifi bluetooth" -MACHINE_FIRMWARE_append = " ${@base_contains('MACHINE_FEATURES', 'bluetooth', 'firmware-qualcomm-qca6564-bt', '', d)}" -MACHINE_FIRMWARE_append = " ${@base_contains('MACHINE_FEATURES', 'wifi', 'firmware-qualcomm-qca6564-wifi', '', d)}" +MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'bluetooth', 'firmware-qualcomm-qca6564-bt', '', d)}" +MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'wifi', 'firmware-qualcomm-qca6564-wifi', '', d)}" KERNEL_IMAGETYPE = "zImage" # FLASH parameters diff --git a/meta-digi-arm/conf/machine/include/digi-defaults.inc b/meta-digi-arm/conf/machine/include/digi-defaults.inc index f1c642a09..fd77702be 100644 --- a/meta-digi-arm/conf/machine/include/digi-defaults.inc +++ b/meta-digi-arm/conf/machine/include/digi-defaults.inc @@ -16,12 +16,12 @@ PREFERRED_PROVIDER_virtual/xserver = "xserver-xorg" # # Help variables used in recipes -HAVE_WIFI = "${@base_contains('MACHINE_FEATURES', 'wifi', '1', '', d)}" -HAVE_EXT_ETH = "${@base_contains('MACHINE_FEATURES', 'ext-eth', '1', '', d)}" -HAVE_BT = "${@base_contains('MACHINE_FEATURES', 'bluetooth', '1', '', d)}" -HAVE_1WIRE = "${@base_contains('MACHINE_FEATURES', '1-wire', '1', '', d)}" -HAVE_GUI = "${@base_contains('DISTRO_FEATURES', 'x11', '1', '', d)}" -HAVE_EXAMPLE = "${@base_contains('IMAGE_FEATURES', 'dey-examples', '1', '', d)}" +HAVE_WIFI = "${@bb.utils.contains('MACHINE_FEATURES', 'wifi', '1', '', d)}" +HAVE_EXT_ETH = "${@bb.utils.contains('MACHINE_FEATURES', 'ext-eth', '1', '', d)}" +HAVE_BT = "${@bb.utils.contains('MACHINE_FEATURES', 'bluetooth', '1', '', d)}" +HAVE_1WIRE = "${@bb.utils.contains('MACHINE_FEATURES', '1-wire', '1', '', d)}" +HAVE_GUI = "${@bb.utils.contains('DISTRO_FEATURES', 'x11', '1', '', d)}" +HAVE_EXAMPLE = "${@bb.utils.contains('IMAGE_FEATURES', 'dey-examples', '1', '', d)}" # # Ethernet configuration used in recipes diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index 61e94fb2b..545e46a06 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -23,7 +23,7 @@ DISTRO_FEATURES ?= "${DISTRO_FEATURES_DEFAULT} ${DISTRO_FEATURES_LIBC} ${POKY_DE # 'ptest' -> fails to build QT5 toolchain POKY_DEFAULT_DISTRO_FEATURES_remove = "ptest wayland" -GRAPHICAL_BACKEND = "${@base_contains('DISTRO_FEATURES', 'x11', 'x11', 'fb', d)}" +GRAPHICAL_BACKEND = "${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', 'fb', d)}" # DEY image features (alphabetical order) FEATURE_PACKAGES_dey-audio = "packagegroup-dey-audio" diff --git a/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-bluetooth.bb b/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-bluetooth.bb index b471bbb88..0caf33a3a 100644 --- a/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-bluetooth.bb +++ b/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-bluetooth.bb @@ -12,6 +12,6 @@ inherit packagegroup RDEPENDS_${PN} = " \ ${BLUEZ} \ ${BLUEZ}-testtools \ - ${@base_contains("MACHINE_FEATURES", "bluetooth", "libasound-module-bluez", "", d)} \ - ${@base_contains("BLUEZ", "bluez5", "bluez5-noinst-tools bluez5-obex", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "bluetooth", "libasound-module-bluez", "", d)} \ + ${@bb.utils.contains("BLUEZ", "bluez5", "bluez5-noinst-tools bluez5-obex", "", d)} \ " diff --git a/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-network.bb b/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-network.bb index 2a960787d..ce7d5d7ef 100644 --- a/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-network.bb +++ b/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-network.bb @@ -30,7 +30,7 @@ CELLULAR_PKGS = "\ RDEPENDS_${PN} = "\ iproute2 \ - ${@base_contains('DISTRO_FEATURES', 'cellular', '${CELLULAR_PKGS}', '', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'cellular', '${CELLULAR_PKGS}', '', d)} \ ${VIRTUAL-RUNTIME_ftp-server} \ ${VIRTUAL-RUNTIME_http-server} \ ${VIRTUAL-RUNTIME_network-utils} \ diff --git a/meta-digi-dey/recipes-core/images/dey-image-qt.bb b/meta-digi-dey/recipes-core/images/dey-image-qt.bb index 454741b2a..56a646301 100644 --- a/meta-digi-dey/recipes-core/images/dey-image-qt.bb +++ b/meta-digi-dey/recipes-core/images/dey-image-qt.bb @@ -19,11 +19,11 @@ IMAGE_FEATURES += " \ dey-qt \ package-management \ ssh-server-dropbear \ - ${@base_contains('DISTRO_FEATURES', 'x11', 'x11-base x11-sato', '', d)} \ - ${@base_contains('MACHINE_FEATURES', 'accel-video', 'dey-gstreamer', '', d)} \ - ${@base_contains('MACHINE_FEATURES', 'alsa', 'dey-audio', '', d)} \ - ${@base_contains('MACHINE_FEATURES', 'bluetooth', 'dey-bluetooth', '', d)} \ - ${@base_contains('MACHINE_FEATURES', 'wifi', 'dey-wireless', '', d)} \ + ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11-base x11-sato', '', d)} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'accel-video', 'dey-gstreamer', '', d)} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'alsa', 'dey-audio', '', d)} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'bluetooth', 'dey-bluetooth', '', d)} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'wifi', 'dey-wireless', '', d)} \ " # SDK features (for toolchains generated from an image with populate_sdk) diff --git a/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend b/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend index b3da925e0..ff4378aa5 100644 --- a/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend +++ b/meta-digi-dey/recipes-core/init-ifupdown/init-ifupdown_1.0.bbappend @@ -44,7 +44,7 @@ do_install_append() { [ -z "${WLAN0_STATIC_NETMASK}" ] && sed -i -e "/##WLAN0_STATIC_NETMASK##/d" ${D}${sysconfdir}/network/interfaces # Cellular interface - if [ -n "${@base_contains('DISTRO_FEATURES', 'cellular', '1', '', d)}" ] && [ -n "${CELLULAR_INTERFACE}" ]; then + if [ -n "${@bb.utils.contains('DISTRO_FEATURES', 'cellular', '1', '', d)}" ] && [ -n "${CELLULAR_INTERFACE}" ]; then cat ${WORKDIR}/interfaces.cellular >> ${D}${sysconfdir}/network/interfaces sed -i -e 's,##CELLULAR_INTERFACE##,${CELLULAR_INTERFACE},g' ${D}${sysconfdir}/network/interfaces [ -n "${CELLULAR_AUTO}" ] && sed -i -e 's/#auto/auto/g' ${D}${sysconfdir}/network/interfaces diff --git a/meta-digi-dey/recipes-core/packagegroups/packagegroup-dey-core.bb b/meta-digi-dey/recipes-core/packagegroups/packagegroup-dey-core.bb index d373fac40..7b6c6baa7 100644 --- a/meta-digi-dey/recipes-core/packagegroups/packagegroup-dey-core.bb +++ b/meta-digi-dey/recipes-core/packagegroups/packagegroup-dey-core.bb @@ -24,7 +24,7 @@ VIRTUAL-RUNTIME_login_manager ?= "" VIRTUAL-RUNTIME_passwd_manager ?= "shadow" # Set virtual runtimes depending on X11 feature -VIRTUAL-RUNTIME_touchscreen ?= "${@base_contains('DISTRO_FEATURES', 'x11', '', 'tslib-calibrate tslib-tests', d)}" +VIRTUAL-RUNTIME_touchscreen ?= "${@bb.utils.contains('DISTRO_FEATURES', 'x11', '', 'tslib-calibrate tslib-tests', d)}" RDEPENDS_${PN} = "\ base-files \ @@ -32,9 +32,9 @@ RDEPENDS_${PN} = "\ busybox \ busybox-acpid \ busybox-static-nodes \ - ${@base_contains("MACHINE_FEATURES", "keyboard", "${VIRTUAL-RUNTIME_keymaps}", "", d)} \ - ${@base_contains("MACHINE_FEATURES", "rtc", "busybox-hwclock", "", d)} \ - ${@base_contains("MACHINE_FEATURES", "touchscreen", "${VIRTUAL-RUNTIME_touchscreen}", "",d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "keyboard", "${VIRTUAL-RUNTIME_keymaps}", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "rtc", "busybox-hwclock", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "touchscreen", "${VIRTUAL-RUNTIME_touchscreen}", "",d)} \ init-ifupdown \ modutils-initscripts \ netbase \ diff --git a/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb index 2d3a1ffa2..5aed8fd83 100644 --- a/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb +++ b/meta-digi-dey/recipes-digi/packagegroups/packagegroup-dey-examples.bb @@ -11,35 +11,35 @@ PACKAGE_ARCH = "${MACHINE_ARCH}" inherit packagegroup RDEPENDS_${PN} = "\ - ${@base_contains("MACHINE_FEATURES", "alsa", "dey-examples-alsa", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "alsa", "dey-examples-alsa", "", d)} \ dey-examples-gpio-sysfs \ - ${@base_contains("MACHINE_FEATURES", "rtc", "dey-examples-rtc", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "rtc", "dey-examples-rtc", "", d)} \ dey-examples-spidev \ - ${@base_contains("MACHINE_FEATURES", "alsa", "dey-examples-vplay", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "alsa", "dey-examples-vplay", "", d)} \ dey-examples-watchdog \ " RDEPENDS_${PN}_append_ccardimx28 = "\ - ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-bt", "", d)} \ - ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-btconfig", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "bluetooth", "dey-examples-bt", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "bluetooth", "dey-examples-btconfig", "", d)} \ dey-examples-can \ - ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-hdp", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "bluetooth", "dey-examples-hdp", "", d)} \ " RDEPENDS_${PN}_append_ccimx6 = "\ - ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-bt", "", d)} \ - ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-btconfig", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "bluetooth", "dey-examples-bt", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "bluetooth", "dey-examples-btconfig", "", d)} \ dey-examples-can \ - ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-hdp", "", d)} \ - ${@base_contains("MACHINE_FEATURES", "accel-graphics", "dey-examples-opengles", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "bluetooth", "dey-examples-hdp", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "accel-graphics", "dey-examples-opengles", "", d)} \ dey-examples-v4l2 \ " RDEPENDS_${PN}_append_ccimx6ul = "\ - ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-bt", "", d)} \ - ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-btconfig", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "bluetooth", "dey-examples-bt", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "bluetooth", "dey-examples-btconfig", "", d)} \ dey-examples-can \ - ${@base_contains("MACHINE_FEATURES", "bluetooth", "dey-examples-hdp", "", d)} \ + ${@bb.utils.contains("MACHINE_FEATURES", "bluetooth", "dey-examples-hdp", "", d)} \ " COMPATIBLE_MACHINE = "(ccardimx28|ccimx6$|ccimx6ul)" From a2aaa26e50e627fbbd58ca19b5f35ae1e672aa9f Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 21 Jun 2016 11:50:27 +0200 Subject: [PATCH 042/117] meta-digi-arm: use linux branch 'v3.14/master' Signed-off-by: Javier Viguera --- meta-digi-arm/recipes-kernel/linux/linux-dey_3.14.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_3.14.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_3.14.bb index 6819a65b9..7f2aa8fc5 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey_3.14.bb +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey_3.14.bb @@ -5,7 +5,7 @@ require recipes-kernel/linux/linux-dtb.inc inherit fsl-vivante-kernel-driver-handler -SRCBRANCH = "v3.14/dey-2.0/maint" +SRCBRANCH = "v3.14/master" SRCREV = "${AUTOREV}" COMPATIBLE_MACHINE = "(ccimx6$)" From ef3d1ab94f4c0ce22b8d1a77ca6ab54ead9c1aaf Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 21 Jun 2016 12:03:03 +0200 Subject: [PATCH 043/117] meta-digi: do not use system libsdl-native Using native libsdl from the system is showing problems in newer versions of some operating systems (e.g. ubuntu 15.10). The default in Yocto 2.0 has changed to build a native libsdl and use it instead of the one in the system. This commit synchronizes the config templates to the latest in Yocto 2.0. https://jira.digi.com/browse/DEL-2586 Signed-off-by: Javier Viguera --- sdk/config/ccardimx28js/local.conf.sample | 7 ++++--- sdk/config/ccimx6sbc/local.conf.sample | 7 ++++--- sdk/config/ccimx6ulstarter/local.conf.sample | 7 ++++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/sdk/config/ccardimx28js/local.conf.sample b/sdk/config/ccardimx28js/local.conf.sample index 1bfcd50e6..fa3340fd4 100644 --- a/sdk/config/ccardimx28js/local.conf.sample +++ b/sdk/config/ccardimx28js/local.conf.sample @@ -247,11 +247,12 @@ BB_DISKMON_DIRS = "\ # Qemu configuration # # By default qemu will build with a builtin VNC server where graphical output can be -# seen. The two lines below enable the SDL backend too. This assumes there is a -# libsdl library available on your build system. +# seen. The two lines below enable the SDL backend too. By default libsdl-native will +# be built, if you want to use your host's libSDL instead of the minimal libsdl built +# by libsdl-native then uncomment the ASSUME_PROVIDED line below. PACKAGECONFIG_append_pn-qemu-native = " sdl" PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl" -ASSUME_PROVIDED += "libsdl-native" +#ASSUME_PROVIDED += "libsdl-native" # CONF_VERSION is increased each time build/conf/ changes incompatibly and is used to diff --git a/sdk/config/ccimx6sbc/local.conf.sample b/sdk/config/ccimx6sbc/local.conf.sample index f8f337e5d..31908c8dc 100644 --- a/sdk/config/ccimx6sbc/local.conf.sample +++ b/sdk/config/ccimx6sbc/local.conf.sample @@ -232,11 +232,12 @@ BB_DISKMON_DIRS = "\ # Qemu configuration # # By default qemu will build with a builtin VNC server where graphical output can be -# seen. The two lines below enable the SDL backend too. This assumes there is a -# libsdl library available on your build system. +# seen. The two lines below enable the SDL backend too. By default libsdl-native will +# be built, if you want to use your host's libSDL instead of the minimal libsdl built +# by libsdl-native then uncomment the ASSUME_PROVIDED line below. PACKAGECONFIG_append_pn-qemu-native = " sdl" PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl" -ASSUME_PROVIDED += "libsdl-native" +#ASSUME_PROVIDED += "libsdl-native" # CONF_VERSION is increased each time build/conf/ changes incompatibly and is used to diff --git a/sdk/config/ccimx6ulstarter/local.conf.sample b/sdk/config/ccimx6ulstarter/local.conf.sample index b3fbcc609..16ad9f0c1 100644 --- a/sdk/config/ccimx6ulstarter/local.conf.sample +++ b/sdk/config/ccimx6ulstarter/local.conf.sample @@ -232,11 +232,12 @@ BB_DISKMON_DIRS = "\ # Qemu configuration # # By default qemu will build with a builtin VNC server where graphical output can be -# seen. The two lines below enable the SDL backend too. This assumes there is a -# libsdl library available on your build system. +# seen. The two lines below enable the SDL backend too. By default libsdl-native will +# be built, if you want to use your host's libSDL instead of the minimal libsdl built +# by libsdl-native then uncomment the ASSUME_PROVIDED line below. PACKAGECONFIG_append_pn-qemu-native = " sdl" PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl" -ASSUME_PROVIDED += "libsdl-native" +#ASSUME_PROVIDED += "libsdl-native" # CONF_VERSION is increased each time build/conf/ changes incompatibly and is used to From 3d307a567f1955e22bf86bd97243675dc64bf4bf Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 21 Jun 2016 12:06:31 +0200 Subject: [PATCH 044/117] meta-digi-dey: update connectivity check URL in distro config Same change was done in Poky distro conf. Signed-off-by: Javier Viguera --- meta-digi-dey/conf/distro/dey.conf | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index 545e46a06..8e0fbfbe0 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -92,9 +92,7 @@ https://.*/.* http://downloads.yoctoproject.org/mirror/sources/ \n" # the variable to be empty. # Git example url: git://git.yoctoproject.org/yocto-firewall-test;protocol=git;rev=master -CONNECTIVITY_CHECK_URIS ?= " \ - https://eula-downloads.yoctoproject.org/index.php \ - http://bugzilla.yoctoproject.org/report.cgi" +CONNECTIVITY_CHECK_URIS ?= "https://www.example.com/" SANITY_TESTED_DISTROS ?= " \ poky-1.7 \n \ From 6809d1f5682edc3c779aeacc30e00e243dbd6023 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Mon, 20 Jun 2016 13:11:00 +0200 Subject: [PATCH 045/117] ccimx6ul: defconfig: compile 80211 modules as built in We compile those modules as built in to avoid a mismatch between the current kernel version and the wlan.ko module. https://jira.digi.com/browse/DEL-2653 Signed-off-by: Isaac Hermida --- .../recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig index 9796e3675..d53291f35 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig @@ -69,12 +69,12 @@ CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=y CONFIG_BT_HCIUART=y CONFIG_BT_HCIUART_IBS=y -CONFIG_CFG80211=m +CONFIG_CFG80211=y CONFIG_CFG80211_CERTIFICATION_ONUS=y CONFIG_CFG80211_DEBUGFS=y CONFIG_CFG80211_INTERNAL_REGDB=y CONFIG_CFG80211_WEXT=y -CONFIG_MAC80211=m +CONFIG_MAC80211=y CONFIG_MAC80211_DEBUGFS=y CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y From bf32fec01e055d32d55319376a2460cb4f3543a4 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Mon, 20 Jun 2016 13:02:56 +0200 Subject: [PATCH 046/117] kernel-module-qualcomm: initial support to compile qca6564 module externally Add recipe kernel-module-qualcomm to compile kernel module externally with all the patches for kernel 4.1.15. https://jira.digi.com/browse/DEL-2653 Signed-off-by: Isaac Hermida --- .../kernel-module-qualcomm.bb | 58 +++++ ...ling-errors-when-BUILD_DEBUG_VERSION.patch | 65 ++++++ ...vendor_event_alloc-call-for-newer-ke.patch | 57 +++++ ...date-cfg80211_ap_stopped-to-nl80211_.patch | 30 +++ .../0004-qcacld-2.0-remove-unused-code.patch | 215 ++++++++++++++++++ ...header-file-for-regulatory_hint_user.patch | 28 +++ ...06-Updating-calls-to-alloc_netdev_mq.patch | 75 ++++++ ...1-update-cfg80211_inform_bss-params-.patch | 28 +++ ...ate-call-to-cfg80211_rx_mgmt-for-dif.patch | 45 ++++ .../0009-linux_ac-Fix-for-f_dentry.patch | 43 ++++ ...hif-Do-not-call-to-HIGH-SPEED-functi.patch | 70 ++++++ ...for-undefined-ath_sysctl_pktlog_size.patch | 24 ++ ...ilation-flag-based-on-kernel-support.patch | 37 +++ .../modprobe-qualcomm.conf | 5 + .../kernel-module-qualcomm/qualcomm-pre-up | 61 +++++ 15 files changed, 841 insertions(+) create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0001-qcacld-Fix-compiling-errors-when-BUILD_DEBUG_VERSION.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0002-Update-cfg80211_vendor_event_alloc-call-for-newer-ke.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0003-wlan_hdd_main-Update-cfg80211_ap_stopped-to-nl80211_.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0004-qcacld-2.0-remove-unused-code.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0005-Including-header-file-for-regulatory_hint_user.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0006-Updating-calls-to-alloc_netdev_mq.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0007-wlan_hdd_cfg80211-update-cfg80211_inform_bss-params-.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0008-wlan_hdd_p2p-Update-call-to-cfg80211_rx_mgmt-for-dif.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0009-linux_ac-Fix-for-f_dentry.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0010-native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/modprobe-qualcomm.conf create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb new file mode 100644 index 000000000..2566d4336 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb @@ -0,0 +1,58 @@ +# Copyright (C) 2016 Digi International. + +SUMMARY = "Qualcomm's wireless driver for qca6564" +DESCRIPTION = "qcacld-2.0 module.bbclass mechanism." +LICENSE = "ISC" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/ISC;md5=f3b90e78ea0cffb20bf5cca7947a896d" +DEPENDS = "virtual/kernel" + +inherit module + +CAF_MIRROR = "git://codeaurora.org/quic/la/platform/vendor/qcom-opensource/wlan/qcacld-2.0" +PV = "v4.2.74.63" +SRCBRANCH = "caf-wlan/QCA6564_LE_1.0.3_LA.4.2.2.3" +SRCREV = "38f01638d75bdf3eb83ac428a4b6ec528b26f541" + +SRC_URI = " \ + ${CAF_MIRROR};destsuffix=${PV};branch=${SRCBRANCH} \ + file://qualcomm-pre-up \ + file://modprobe-qualcomm.conf \ + file://0001-qcacld-Fix-compiling-errors-when-BUILD_DEBUG_VERSION.patch \ + file://0002-Update-cfg80211_vendor_event_alloc-call-for-newer-ke.patch \ + file://0003-wlan_hdd_main-Update-cfg80211_ap_stopped-to-nl80211_.patch \ + file://0004-qcacld-2.0-remove-unused-code.patch \ + file://0005-Including-header-file-for-regulatory_hint_user.patch \ + file://0006-Updating-calls-to-alloc_netdev_mq.patch \ + file://0007-wlan_hdd_cfg80211-update-cfg80211_inform_bss-params-.patch \ + file://0008-wlan_hdd_p2p-Update-call-to-cfg80211_rx_mgmt-for-dif.patch \ + file://0009-linux_ac-Fix-for-f_dentry.patch \ + file://0010-native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch \ + file://0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch \ + file://0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch \ +" + +S = "${WORKDIR}/${PV}" + +EXTRA_OEMAKE += "CONFIG_CLD_HL_SDIO_CORE=y CONFIG_LINUX_QCMBR=y WLAN_OPEN_SOURCE=1" +# Explicity state it is not a QC platform, if not the driver will try to remap +# memory that is not allowed in ARMv6 (kernel commit +# 309caa9cc6ff39d261264ec4ff10e29489afc8f8) +EXTRA_OEMAKE += "CONFIG_NON_QC_PLATFORM=y" + +do_compile_prepend() { + export BUILD_VER=${PV} +} + +do_install_append() { + install -d ${D}${sysconfdir}/network/if-pre-up.d + install -m 0755 ${WORKDIR}/qualcomm-pre-up ${D}${sysconfdir}/network/if-pre-up.d/qualcomm + install -d ${D}${sysconfdir}/modprobe.d + install -m 0644 ${WORKDIR}/modprobe-qualcomm.conf ${D}${sysconfdir}/modprobe.d/qualcomm.conf +} + +FILES_${PN} += " \ + ${sysconfdir}/network/if-pre-up.d/qualcomm \ + ${sysconfdir}/modprobe.d/qualcomm.conf \ +" + +COMPATIBLE_MACHINE = "(ccimx6ul)" diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0001-qcacld-Fix-compiling-errors-when-BUILD_DEBUG_VERSION.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0001-qcacld-Fix-compiling-errors-when-BUILD_DEBUG_VERSION.patch new file mode 100644 index 000000000..eed092d73 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0001-qcacld-Fix-compiling-errors-when-BUILD_DEBUG_VERSION.patch @@ -0,0 +1,65 @@ +From: Yi Chen +Date: Fri, 28 Aug 2015 19:24:45 +0800 +Subject: [PATCH 01/12] qcacld: Fix compiling errors when BUILD_DEBUG_VERSION + := 0. + +This is a compiling issue when BUILD_DEBUG_VERSION := 0 is set in Kbuild. + +Change-Id: Iaee98eb91d66990dfa4989a7c07cb5592f8a6079 +CRs-Fixed: 898366 +(cherry picked from commit d0258ff1dcf19236e4cfa69e45f75b72a1334609) +--- + CORE/UTILS/FWLOG/dbglog_host.c | 4 ++-- + Kbuild | 8 ++++---- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/CORE/UTILS/FWLOG/dbglog_host.c b/CORE/UTILS/FWLOG/dbglog_host.c +index 2dfa45983a87..63fc742259fc 100644 +--- a/CORE/UTILS/FWLOG/dbglog_host.c ++++ b/CORE/UTILS/FWLOG/dbglog_host.c +@@ -55,8 +55,6 @@ + #include + #define FWLOG_DEBUG ATH_DEBUG_MAKE_MODULE_MASK(0) + +-#if defined(DEBUG) +- + static bool appstarted = FALSE; + static bool senddriverstatus = FALSE; + static bool kd_nl_init = FALSE; +@@ -64,6 +62,8 @@ static int cnss_diag_pid = INVALID_PID; + static int get_version = 0; + static int gprint_limiter = 0; + ++#if defined(DEBUG) ++ + static ATH_DEBUG_MASK_DESCRIPTION g_fwlogDebugDescription[] = { + {FWLOG_DEBUG,"fwlog"}, + }; +diff --git a/Kbuild b/Kbuild +index 04461cfb7945..b248eee28bf0 100644 +--- a/Kbuild ++++ b/Kbuild +@@ -882,7 +882,6 @@ CDEFINES := -DANI_LITTLE_BYTE_ENDIAN \ + -DWLAN_PERF \ + -DPTT_SOCK_SVC_ENABLE \ + -Wall\ +- -Werror\ + -D__linux__ \ + -DHAL_SELF_STA_PER_BSS=1 \ + -DWLAN_FEATURE_VOWIFI_11R \ +@@ -966,11 +965,12 @@ CDEFINES += -DWCN_PRONTO + CDEFINES += -DWCN_PRONTO_V1 + endif + ++CDEFINES += -DTRACE_RECORD \ ++ -DLIM_TRACE_RECORD \ ++ -DSME_TRACE_RECORD ++ + ifeq ($(BUILD_DEBUG_VERSION),1) + CDEFINES += -DWLAN_DEBUG \ +- -DTRACE_RECORD \ +- -DLIM_TRACE_RECORD \ +- -DSME_TRACE_RECORD \ + -DPE_DEBUG_LOGW \ + -DPE_DEBUG_LOGE \ + -DDEBUG diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0002-Update-cfg80211_vendor_event_alloc-call-for-newer-ke.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0002-Update-cfg80211_vendor_event_alloc-call-for-newer-ke.patch new file mode 100644 index 000000000..20dbe961e --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0002-Update-cfg80211_vendor_event_alloc-call-for-newer-ke.patch @@ -0,0 +1,57 @@ +From: Isaac Hermida +Date: Mon, 18 Apr 2016 08:48:14 +0200 +Subject: [PATCH 02/12] Update cfg80211_vendor_event_alloc call for newer + kernel versions + +Current compilation fails with next error. + +> wlan_hdd_cfg80211.h:995:9: error: too few arguments to function 'cfg80211_vendor_event_alloc' + +This function has been updated starting with kernel 3.15 + +Signed-off-by: Isaac Hermida +--- + CORE/HDD/inc/wlan_hdd_cfg80211.h | 2 +- + CORE/HDD/src/wlan_hdd_assoc.c | 8 ++++++++ + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h +index 7602f1d3874b..a40c55144bc5 100644 +--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h ++++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h +@@ -992,7 +992,7 @@ backported_cfg80211_vendor_event_alloc(struct wiphy *wiphy, + int approxlen, + int event_idx, gfp_t gfp) + { +- return cfg80211_vendor_event_alloc(wiphy, approxlen, event_idx, gfp); ++ return cfg80211_vendor_event_alloc(wiphy, wdev, approxlen, event_idx, gfp); + } + #define cfg80211_vendor_event_alloc backported_cfg80211_vendor_event_alloc + #endif +diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c +index bc3e15009d97..5dc882fa8f83 100644 +--- a/CORE/HDD/src/wlan_hdd_assoc.c ++++ b/CORE/HDD/src/wlan_hdd_assoc.c +@@ -2027,6 +2027,8 @@ static void hdd_RoamIbssIndicationHandler( hdd_adapter_t *pAdapter, + eRoamCmdStatus roamStatus, + eCsrRoamResult roamResult ) + { ++ struct ieee80211_channel *chann; ++ + hddLog(VOS_TRACE_LEVEL_INFO, "%s: %s: id %d, status %d, result %d", + __func__, pAdapter->dev->name, roamId, roamStatus, roamResult); + +@@ -2082,7 +2084,13 @@ static void hdd_RoamIbssIndicationHandler( hdd_adapter_t *pAdapter, + return; + } + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0) ++ chann = ieee80211_get_channel(pAdapter->wdev.wiphy, ++ (int)pRoamInfo->pBssDesc->channelId); ++ cfg80211_ibss_joined(pAdapter->dev, bss->bssid, chann, GFP_KERNEL); ++#else + cfg80211_ibss_joined(pAdapter->dev, bss->bssid, GFP_KERNEL); ++#endif + cfg80211_put_bss( + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0)) || defined(WITH_BACKPORTS) + pHddCtx->wiphy, diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0003-wlan_hdd_main-Update-cfg80211_ap_stopped-to-nl80211_.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0003-wlan_hdd_main-Update-cfg80211_ap_stopped-to-nl80211_.patch new file mode 100644 index 000000000..91eeac607 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0003-wlan_hdd_main-Update-cfg80211_ap_stopped-to-nl80211_.patch @@ -0,0 +1,30 @@ +From: Isaac Hermida +Date: Thu, 21 Apr 2016 10:30:51 +0200 +Subject: [PATCH 03/12] wlan_hdd_main: Update cfg80211_ap_stopped to + nl80211_send_ap_stopped + +Use nl80211_send_ap_stopped instead of cfg80211_ap_stopped for newer +kernel versions + +Signed-off-by: Isaac Hermida +--- + CORE/HDD/src/wlan_hdd_main.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c +index 5e4e95aaaee4..0ff3f31b9863 100755 +--- a/CORE/HDD/src/wlan_hdd_main.c ++++ b/CORE/HDD/src/wlan_hdd_main.c +@@ -9929,8 +9929,12 @@ VOS_STATUS hdd_start_all_adapters( hdd_context_t *pHddCtx ) + #if defined(MSM_PLATFORM) && !defined(WITH_BACKPORTS) + hddLog(VOS_TRACE_LEVEL_ERROR, "%s [SSR] send stop ap to supplicant", + __func__); ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)) + cfg80211_ap_stopped(pAdapter->dev, GFP_KERNEL); + #else ++ nl80211_send_ap_stopped(pAdapter->dev->ieee80211_ptr); ++#endif ++#else + hddLog(VOS_TRACE_LEVEL_ERROR, "%s [SSR] send restart supplicant", + __func__); + /* event supplicant to restart */ diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0004-qcacld-2.0-remove-unused-code.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0004-qcacld-2.0-remove-unused-code.patch new file mode 100644 index 000000000..80eba78fb --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0004-qcacld-2.0-remove-unused-code.patch @@ -0,0 +1,215 @@ +From: Karthick S +Date: Fri, 14 Aug 2015 14:52:23 +0530 +Subject: [PATCH 04/12] qcacld-2.0: remove unused code + +Removed unused code from ReinitSDIO. Also removed mmcbusmode and it's +related references in the code. + +Change-Id: Idaa40f31cc830c0e2fa5d6fbda8c78c9f434bdaf +CRs-Fixed: 890630 +(cherry picked from commit acca7f817db52580a985de2804f30973b2ed9cb7) + +Signed-off-by: Isaac Hermida +(cherry picked from commit d63533a6cc46671141ac31290e4f020c236298ee) +--- + CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c | 165 +-------------------- + 1 file changed, 2 insertions(+), 163 deletions(-) + +diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c +index 31641c94351c..b3afed2a8d7c 100644 +--- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c ++++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c +@@ -57,11 +57,6 @@ + + #define MAX_HIF_DEVICES 2 + +-unsigned int mmcbusmode = 0; +-module_param(mmcbusmode, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); +-MODULE_PARM_DESC(mmcbusmode, "Set MMC driver Bus Mode: 1-SDR12, 2-SDR25, 3-SDR50, 4-DDR50, 5-SDR104"); +-EXPORT_SYMBOL(mmcbusmode); +- + unsigned int mmcbuswidth = 0; + module_param(mmcbuswidth, uint, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + MODULE_PARM_DESC(mmcbuswidth, "Set MMC driver Bus Width: 1-1Bit, 4-4Bit, 8-8Bit"); +@@ -689,98 +684,6 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) + sdio_claim_host(func); + + do { +- /* 2.6.32 kernel does part of the SDIO initalization upon resume */ +- A_BOOL lt_2_6_32 = (LINUX_VERSION_CODEocr_avail) - 1; +- /* emulate the mmc_power_up(...) */ +- host->ios.vdd = bit; +- host->ios.chip_select = MMC_CS_DONTCARE; +- host->ios.bus_mode = MMC_BUSMODE_OPENDRAIN; +- host->ios.power_mode = MMC_POWER_UP; +- host->ios.bus_width = MMC_BUS_WIDTH_1; +- host->ios.timing = MMC_TIMING_LEGACY; +- host->ops->set_ios(host, &host->ios); +- /* +- * This delay should be sufficient to allow the power supply +- * to reach the minimum voltage. +- */ +- msleep(2); +- +- host->ios.clock = host->f_min; +- host->ios.power_mode = MMC_POWER_ON; +- host->ops->set_ios(host, &host->ios); +- +- /* +- * This delay must be at least 74 clock sizes, or 1 ms, or the +- * time required to reach a stable voltage. +- */ +- msleep(2); +- +- /* Issue CMD0. Goto idle state */ +- host->ios.chip_select = MMC_CS_HIGH; +- host->ops->set_ios(host, &host->ios); +- msleep(1); +- err = IssueSDCommand(device, MMC_GO_IDLE_STATE, 0, (MMC_RSP_NONE | MMC_CMD_BC), NULL); +- host->ios.chip_select = MMC_CS_DONTCARE; +- host->ops->set_ios(host, &host->ios); +- msleep(1); +- host->use_spi_crc = 0; +- +- if (err) { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD0 failed : %d \n",err)); +- break; +- } +- +- if (!host->ocr) { +- /* Issue CMD5, arg = 0 */ +- err = IssueSDCommand(device, SD_IO_SEND_OP_COND, 0, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); +- if (err) { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD5 failed : %d \n",err)); +- break; +- } +- host->ocr = resp; +- } +- +- /* Issue CMD5, arg = ocr. Wait till card is ready */ +- for (i=0;i<100;i++) { +- err = IssueSDCommand(device, SD_IO_SEND_OP_COND, host->ocr, (MMC_RSP_R4 | MMC_CMD_BCR), &resp); +- if (err) { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD5 failed : %d \n",err)); +- break; +- } +- if (resp & MMC_CARD_BUSY) { +- break; +- } +- msleep(10); +- } +- +- if ((i == 100) || (err)) { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: card in not ready : %d %d \n",i,err)); +- break; +- } +- +- /* Issue CMD3, get RCA */ +- err = IssueSDCommand(device, SD_SEND_RELATIVE_ADDR, 0, MMC_RSP_R6 | MMC_CMD_BCR, &resp); +- if (err) { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD3 failed : %d \n",err)); +- break; +- } +- rca = resp >> 16; +- host->ios.bus_mode = MMC_BUSMODE_PUSHPULL; +- host->ops->set_ios(host, &host->ios); +- +- /* Issue CMD7, select card */ +- err = IssueSDCommand(device, MMC_SELECT_CARD, (rca << 16), MMC_RSP_R1 | MMC_CMD_AC, NULL); +- if (err) { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD7 failed : %d \n",err)); +- break; +- } +- } +- + /* Enable high speed */ + if (card->host->caps & MMC_CAP_SD_HIGHSPEED) { + AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("ReinitSDIO: Set high speed mode\n")); +@@ -1212,10 +1115,7 @@ TODO: MMC SDIO3.0 Setting should also be modified in ReInit() function when Powe + */ + { + A_UINT32 clock, clock_set = 12500000; +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0) +- unsigned int bus_speed = 0, timing = 0; +- unsigned char speed = 0; +-#endif ++ + sdio_claim_host(func); + if (writecccr1) { + A_UINT32 err = Func0_CMD52WriteByte(func->card, +@@ -1352,69 +1252,8 @@ TODO: MMC SDIO3.0 Setting should also be modified in ReInit() function when Powe + if (debugcccr) { + HIFDumpCCCR(device); + } +- // Set MMC Bus Mode: 1-SDR12, 2-SDR25, 3-SDR50, 4-DDR50, 5-SDR104 +- if (mmcbusmode > 0) { +- printk("host caps:0x%08X, card_sd3_bus_mode:0x%08X\n", (unsigned int)func->card->host->caps, (unsigned int)func->card->sw_caps.sd3_bus_mode); +- if (mmcbusmode == 5 && (func->card->host->caps & MMC_CAP_UHS_SDR104) && +- ((func->card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104) || forcecard)) { +- bus_speed = SDIO_SPEED_SDR104; +- timing = MMC_TIMING_UHS_SDR104; +- func->card->sw_caps.uhs_max_dtr = UHS_SDR104_MAX_DTR; +- AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("%s: Set MMC bus mode to SDR104. \n", __func__)); +- } else if (mmcbusmode == 4 && (func->card->host->caps & MMC_CAP_UHS_DDR50) && +- ((func->card->sw_caps.sd3_bus_mode & SD_MODE_UHS_DDR50) || forcecard)) { +- bus_speed = SDIO_SPEED_DDR50; +- timing = MMC_TIMING_UHS_DDR50; +- func->card->sw_caps.uhs_max_dtr = UHS_DDR50_MAX_DTR; +- AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("%s: Set MMC bus mode to DDR50. \n", __func__)); +- } else if (mmcbusmode == 3 && (func->card->host->caps & (MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_SDR50)) && +- ((func->card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR50) || forcecard)) { +- bus_speed = SDIO_SPEED_SDR50; +- timing = MMC_TIMING_UHS_SDR50; +- func->card->sw_caps.uhs_max_dtr = UHS_SDR50_MAX_DTR; +- AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("%s: Set MMC bus mode to SDR50. \n", __func__)); +- } else if (mmcbusmode == 2 && (func->card->host->caps & +- (MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25)) && +- ((func->card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR25) || forcecard)) { +- bus_speed = SDIO_SPEED_SDR25; +- timing = MMC_TIMING_UHS_SDR25; +- func->card->sw_caps.uhs_max_dtr = UHS_SDR25_MAX_DTR; +- AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("%s: Set MMC bus mode to SDR25. \n", __func__)); +- } else if (mmcbusmode == 1 && (func->card->host->caps & (MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_SDR50 | +- MMC_CAP_UHS_SDR25 | MMC_CAP_UHS_SDR12)) && +- ((func->card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR12) || forcecard)) { +- bus_speed = SDIO_SPEED_SDR12; +- timing = MMC_TIMING_UHS_SDR12; +- func->card->sw_caps.uhs_max_dtr = UHS_SDR12_MAX_DTR; +- AR_DEBUG_PRINTF(ATH_DEBUG_ANY,("%s: Set MMC bus mode to SDR12. \n", __func__)); +- } else { +- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s: MMC bus mode %d not supported. \n", __func__, mmcbusmode)); +- return ret = -1; +- } +- +- ret = Func0_CMD52ReadByte(func->card, SDIO_CCCR_SPEED, &speed); +- if (ret){ +- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s: CMD52 to get CCCR SPEED failed: %d, cap_uhs: %lu, sd3_bus_mode: %x \n", __func__, ret, (long unsigned int)(func->card->host->caps & (MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_SDR50 | MMC_CAP_UHS_SDR25 | MMC_CAP_UHS_SDR12)), func->card->sw_caps.sd3_bus_mode)); +- return ret; +- } +- +- speed &= ~SDIO_SPEED_BSS_MASK; +- speed |= bus_speed; +- ret = Func0_CMD52WriteByte(func->card, SDIO_CCCR_SPEED, speed); +- if (ret){ +- AR_DEBUG_PRINTF(ATH_DEBUG_ERR,("%s: CMD52 to set CCCR SPPED failed: %d \n", __func__, ret)); +- return ret; +- } +- +- if (bus_speed) { +- device->host->ios.timing = timing; +- device->host->ops->set_ios(device->host, &device->host->ios); +- // mmc_set_clock(func->card->host, func->card->sw_caps.uhs_max_dtr); +- } +- } +- +-#endif //#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27) + ++#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0) */ + sdio_release_host(func); + } + diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0005-Including-header-file-for-regulatory_hint_user.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0005-Including-header-file-for-regulatory_hint_user.patch new file mode 100644 index 000000000..1c3529829 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0005-Including-header-file-for-regulatory_hint_user.patch @@ -0,0 +1,28 @@ +From: Isaac Hermida +Date: Thu, 21 Apr 2016 13:19:10 +0200 +Subject: [PATCH 05/12] Including header file for "regulatory_hint_user" + +The function "regulatory_hint_user" has been moved from +include/net/cfg80211.h to net/wireless/reg.h. + +Signed-off-by: Isaac Hermida +(cherry picked from commit db944bc907127c191b1bbdcc58d3aecedcf44a8c) +--- + CORE/VOSS/src/vos_nvitem.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/CORE/VOSS/src/vos_nvitem.c b/CORE/VOSS/src/vos_nvitem.c +index d79ae2871e4b..47290c9d1744 100644 +--- a/CORE/VOSS/src/vos_nvitem.c ++++ b/CORE/VOSS/src/vos_nvitem.c +@@ -53,6 +53,10 @@ + #include "regdomain.h" + #include "regdomain_common.h" + ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,0,0)) ++#include <../net/wireless/reg.h> ++#endif ++ + #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,9,0)) && !defined(WITH_BACKPORTS) + #define IEEE80211_CHAN_NO_80MHZ 1<<7 + #endif diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0006-Updating-calls-to-alloc_netdev_mq.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0006-Updating-calls-to-alloc_netdev_mq.patch new file mode 100644 index 000000000..15a34993b --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0006-Updating-calls-to-alloc_netdev_mq.patch @@ -0,0 +1,75 @@ +From: Isaac Hermida +Date: Thu, 21 Apr 2016 13:52:18 +0200 +Subject: [PATCH 06/12] Updating calls to "alloc_netdev_mq" + +Signed-off-by: Isaac Hermida +--- + CORE/EPPING/src/epping_txrx.c | 6 ++++++ + CORE/HDD/src/wlan_hdd_hostapd.c | 4 ++++ + CORE/HDD/src/wlan_hdd_main.c | 10 +++++++--- + 3 files changed, 17 insertions(+), 3 deletions(-) + +diff --git a/CORE/EPPING/src/epping_txrx.c b/CORE/EPPING/src/epping_txrx.c +index 678d58e0cfae..0985e362f94a 100644 +--- a/CORE/EPPING/src/epping_txrx.c ++++ b/CORE/EPPING/src/epping_txrx.c +@@ -355,7 +355,13 @@ epping_adapter_t *epping_add_adapter(epping_context_t *pEpping_ctx, + struct net_device *dev; + epping_adapter_t *pAdapter; + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0) ++ dev = alloc_netdev(sizeof(epping_adapter_t), "wifi%d", NET_NAME_UNKNOWN, ether_setup); ++#else + dev = alloc_netdev(sizeof(epping_adapter_t), "wifi%d", ether_setup); ++#endif ++ ++ + if (dev == NULL) { + EPPING_LOG(VOS_TRACE_LEVEL_FATAL, + "%s: Cannot allocate epping_adapter_t\n", __func__); +diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c +index 6251224c11df..8a80d26f355a 100644 +--- a/CORE/HDD/src/wlan_hdd_hostapd.c ++++ b/CORE/HDD/src/wlan_hdd_hostapd.c +@@ -5447,7 +5447,11 @@ hdd_adapter_t* hdd_wlan_create_ap_dev( hdd_context_t *pHddCtx, tSirMacAddr macAd + + hddLog(VOS_TRACE_LEVEL_DEBUG, "%s: iface_name = %s", __func__, iface_name); + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0) ++ pWlanHostapdDev = alloc_netdev_mq(sizeof(hdd_adapter_t), iface_name, NET_NAME_UNKNOWN, ether_setup, NUM_TX_QUEUES); ++#else + pWlanHostapdDev = alloc_netdev_mq(sizeof(hdd_adapter_t), iface_name, ether_setup, NUM_TX_QUEUES); ++#endif + + if (pWlanHostapdDev != NULL) + { +diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c +index 0ff3f31b9863..a10da2a9b164 100755 +--- a/CORE/HDD/src/wlan_hdd_main.c ++++ b/CORE/HDD/src/wlan_hdd_main.c +@@ -8226,7 +8226,11 @@ static hdd_adapter_t* hdd_alloc_station_adapter( hdd_context_t *pHddCtx, tSirMac + /* + * cfg80211 initialization and registration.... + */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0) ++ pWlanDev = alloc_netdev_mq(sizeof( hdd_adapter_t ), name, NET_NAME_UNKNOWN, ether_setup, NUM_TX_QUEUES); ++#else + pWlanDev = alloc_netdev_mq(sizeof( hdd_adapter_t ), name, ether_setup, NUM_TX_QUEUES); ++#endif + + if(pWlanDev != NULL) + { +@@ -9929,10 +9933,10 @@ VOS_STATUS hdd_start_all_adapters( hdd_context_t *pHddCtx ) + #if defined(MSM_PLATFORM) && !defined(WITH_BACKPORTS) + hddLog(VOS_TRACE_LEVEL_ERROR, "%s [SSR] send stop ap to supplicant", + __func__); +-#if (LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0)) +- cfg80211_ap_stopped(pAdapter->dev, GFP_KERNEL); +-#else ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0)) + nl80211_send_ap_stopped(pAdapter->dev->ieee80211_ptr); ++#else ++ cfg80211_ap_stopped(pAdapter->dev, GFP_KERNEL); + #endif + #else + hddLog(VOS_TRACE_LEVEL_ERROR, "%s [SSR] send restart supplicant", diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0007-wlan_hdd_cfg80211-update-cfg80211_inform_bss-params-.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0007-wlan_hdd_cfg80211-update-cfg80211_inform_bss-params-.patch new file mode 100644 index 000000000..2f3b586c3 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0007-wlan_hdd_cfg80211-update-cfg80211_inform_bss-params-.patch @@ -0,0 +1,28 @@ +From: Isaac Hermida +Date: Thu, 21 Apr 2016 13:56:15 +0200 +Subject: [PATCH 07/12] wlan_hdd_cfg80211: update "cfg80211_inform_bss" params + for kernel version + +Signed-off-by: Isaac Hermida +--- + CORE/HDD/src/wlan_hdd_cfg80211.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c +index c09ac0304852..c6c79552a9d0 100644 +--- a/CORE/HDD/src/wlan_hdd_cfg80211.c ++++ b/CORE/HDD/src/wlan_hdd_cfg80211.c +@@ -8460,8 +8460,11 @@ static struct cfg80211_bss* wlan_hdd_cfg80211_inform_bss( + WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); + if (bss == NULL) { + rssi = (VOS_MIN ((pBssDesc->rssi + pBssDesc->sinr), 0))*100; +- +- return (cfg80211_inform_bss(wiphy, chan, pBssDesc->bssId, ++ return (cfg80211_inform_bss(wiphy, chan, ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0) ++ CFG80211_BSS_FTYPE_BEACON, ++#endif ++ pBssDesc->bssId, + le64_to_cpu(*(__le64 *)pBssDesc->timeStamp), + pBssDesc->capabilityInfo, + pBssDesc->beaconInterval, ie, ie_length, diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0008-wlan_hdd_p2p-Update-call-to-cfg80211_rx_mgmt-for-dif.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0008-wlan_hdd_p2p-Update-call-to-cfg80211_rx_mgmt-for-dif.patch new file mode 100644 index 000000000..a9148ece0 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0008-wlan_hdd_p2p-Update-call-to-cfg80211_rx_mgmt-for-dif.patch @@ -0,0 +1,45 @@ +From: Isaac Hermida +Date: Thu, 21 Apr 2016 13:57:03 +0200 +Subject: [PATCH 08/12] wlan_hdd_p2p: Update call to "cfg80211_rx_mgmt" for + different kernel versions + +Signed-off-by: Isaac Hermida +--- + CORE/HDD/src/wlan_hdd_p2p.c | 17 +++++++++++++++-- + 1 file changed, 15 insertions(+), 2 deletions(-) + +diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c +index 0c6645f077f1..476b456e165c 100644 +--- a/CORE/HDD/src/wlan_hdd_p2p.c ++++ b/CORE/HDD/src/wlan_hdd_p2p.c +@@ -826,7 +826,16 @@ void hdd_remainChanReadyHandler( hdd_adapter_t *pAdapter ) + // Check for cached action frame + if(pRemainChanCtx->action_pkt_buff.frame_length != 0) + { +-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0)) || defined(WITH_BACKPORTS) ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0)) ++ cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, ++ pRemainChanCtx->action_pkt_buff.freq, 0, ++ pRemainChanCtx->action_pkt_buff.frame_ptr, ++ pRemainChanCtx->action_pkt_buff.frame_length, ++ NL80211_RXMGMT_FLAG_ANSWERED); ++#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0)) || defined(WITH_BACKPORTS) ++ ++#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0)) || defined(WITH_BACKPORTS) + cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, + pRemainChanCtx->action_pkt_buff.freq, 0, + pRemainChanCtx->action_pkt_buff.frame_ptr, +@@ -2340,7 +2349,11 @@ void hdd_indicateMgmtFrame( hdd_adapter_t *pAdapter, + + //Indicate Frame Over Normal Interface + hddLog( LOG1, FL("Indicate Frame over NL80211 Interface")); +-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0)) || defined(WITH_BACKPORTS) ++ ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0)) ++ cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, freq, 0, pbFrames, ++ nFrameLength, NL80211_RXMGMT_FLAG_ANSWERED); ++#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0)) || defined(WITH_BACKPORTS) + cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, freq, 0, pbFrames, + nFrameLength, NL80211_RXMGMT_FLAG_ANSWERED, GFP_ATOMIC); + #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0009-linux_ac-Fix-for-f_dentry.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0009-linux_ac-Fix-for-f_dentry.patch new file mode 100644 index 000000000..481ef0970 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0009-linux_ac-Fix-for-f_dentry.patch @@ -0,0 +1,43 @@ +From: Isaac Hermida +Date: Thu, 21 Apr 2016 13:58:29 +0200 +Subject: [PATCH 09/12] =?UTF-8?q?linux=5Fac:=20Fix=20for=20=E2=80=98f=5Fde?= + =?UTF-8?q?ntry=E2=80=99?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +https://communities.vmware.com/thread/499483?start=0&tstart=0 + +Signed-off-by: Isaac Hermida +--- + CORE/UTILS/PKTLOG/linux_ac.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/CORE/UTILS/PKTLOG/linux_ac.c b/CORE/UTILS/PKTLOG/linux_ac.c +index b1969ad5d2ba..8d45d7365b2b 100644 +--- a/CORE/UTILS/PKTLOG/linux_ac.c ++++ b/CORE/UTILS/PKTLOG/linux_ac.c +@@ -576,7 +576,10 @@ pktlog_read(struct file *file, char *buf, size_t nbytes, loff_t *ppos) + int rem_len; + int start_offset, end_offset; + int fold_offset, ppos_data, cur_rd_offset; +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0) ++ struct ath_pktlog_info *pl_info = (struct ath_pktlog_info *) ++ PDE_DATA(file_inode(file)); ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + struct ath_pktlog_info *pl_info = (struct ath_pktlog_info *) + PDE_DATA(file->f_dentry->d_inode); + #else +@@ -817,7 +820,10 @@ static struct vm_operations_struct pktlog_vmops = { + + static int pktlog_mmap(struct file *file, struct vm_area_struct *vma) + { +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0) ++ struct ath_pktlog_info *pl_info = (struct ath_pktlog_info *) ++ PDE_DATA(file_inode(file)); ++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0) + struct ath_pktlog_info *pl_info = (struct ath_pktlog_info *) + PDE_DATA(file->f_dentry->d_inode); + #else diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0010-native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0010-native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch new file mode 100644 index 000000000..7f6e94508 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0010-native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch @@ -0,0 +1,70 @@ +From: Isaac Hermida +Date: Thu, 21 Apr 2016 14:00:59 +0200 +Subject: [PATCH 10/12] native_sdio/src/hif: Do not call to HIGH SPEED + functions for newer kernels + +Signed-off-by: Isaac Hermida +--- + CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c | 18 +++++++++++++++++- + 1 file changed, 17 insertions(+), 1 deletion(-) + +diff --git a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c +index b3afed2a8d7c..1a1e51eff8c7 100644 +--- a/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c ++++ b/CORE/SERVICES/HIF/sdio/linux/native_sdio/src/hif.c +@@ -690,7 +690,9 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) + err = Func0_CMD52ReadByte(card, SDIO_CCCR_SPEED, &cmd52_resp); + if (err) { + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD52 read to CCCR speed register failed : %d \n",err)); ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) + card->state &= ~MMC_STATE_HIGHSPEED; ++#endif + /* no need to break */ + } else { + err = Func0_CMD52WriteByte(card, SDIO_CCCR_SPEED, (cmd52_resp | SDIO_SPEED_EHS)); +@@ -698,14 +700,20 @@ A_STATUS ReinitSDIO(HIF_DEVICE *device) + AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("ReinitSDIO: CMD52 write to CCCR speed register failed : %d \n",err)); + break; + } ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) + mmc_card_set_highspeed(card); ++#endif + host->ios.timing = MMC_TIMING_SD_HS; + host->ops->set_ios(host, &host->ios); + } + } + + /* Set clock */ +- if (mmc_card_highspeed(card)) { ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ++ if (mmc_card_highspeed(card)) { ++#else ++ if (mmc_card_hs(card)) { ++#endif + clock = 50000000; + } else { + clock = card->cis.max_dtr; +@@ -1181,7 +1189,11 @@ TODO: MMC SDIO3.0 Setting should also be modified in ReInit() function when Powe + if (mmcclock > 0){ + clock_set = mmcclock; + } ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) + if (mmc_card_highspeed(func->card)){ ++#else ++ if (mmc_card_hs(func->card)){ ++#endif + clock = 50000000; + } else { + clock = func->card->cis.max_dtr; +@@ -2000,7 +2012,11 @@ addHifDevice(struct sdio_func *func) + hifdevice->func = func; + hifdevice->powerConfig = HIF_DEVICE_POWER_UP; + hifdevice->DeviceState = HIF_DEVICE_STATE_ON; ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) + ret = sdio_set_drvdata(func, hifdevice); ++#else ++ sdio_set_drvdata(func, hifdevice); ++#endif + + EXIT("status %d", ret); + return hifdevice; diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch new file mode 100644 index 000000000..c8370c0a4 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch @@ -0,0 +1,24 @@ +From: Isaac Hermida +Date: Thu, 21 Apr 2016 14:32:57 +0200 +Subject: [PATCH 11/12] osdep_adf.h: fix for undefined ath_sysctl_pktlog_size + +Signed-off-by: Isaac Hermida +--- + CORE/SERVICES/COMMON/osdep_adf.h | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/CORE/SERVICES/COMMON/osdep_adf.h b/CORE/SERVICES/COMMON/osdep_adf.h +index 708b6f89fa03..48ca78618840 100644 +--- a/CORE/SERVICES/COMMON/osdep_adf.h ++++ b/CORE/SERVICES/COMMON/osdep_adf.h +@@ -168,6 +168,10 @@ typedef unsigned long TQUEUE_ARG; + #define ATH_SYSCTL_PROC_DOSTRING(ctl, write, filp, buffer, lenp, ppos) \ + proc_dostring(ctl, write, filp, buffer, lenp, ppos) + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,17,0) ++typedef struct ctl_table ctl_table; ++#endif ++ + /* + * Byte Order stuff + */ diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch new file mode 100644 index 000000000..a296bd836 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch @@ -0,0 +1,37 @@ +From: Isaac Hermida +Date: Thu, 19 May 2016 12:28:39 +0200 +Subject: [PATCH 12/12] Kbuild: Add compilation flag based on kernel support + +The option WLAN_NL80211_TESTMODE was inconditionally added to the compilation +but it does required the specific kernel support. + +https://jira.digi.com/browse/DEL-2567 + +Signed-off-by: Isaac Hermida +--- + Kbuild | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/Kbuild b/Kbuild +index b248eee28bf0..339262874c94 100644 +--- a/Kbuild ++++ b/Kbuild +@@ -908,7 +908,6 @@ CDEFINES := -DANI_LITTLE_BYTE_ENDIAN \ + -DWLAN_WAKEUP_EVENTS \ + -DFEATURE_WLAN_RA_FILTERING\ + -DWLAN_KD_READY_NOTIFIER \ +- -DWLAN_NL80211_TESTMODE \ + -DFEATURE_WLAN_BATCH_SCAN \ + -DFEATURE_WLAN_LPHB \ + -DFEATURE_WLAN_PAL_TIMER_DISABLE \ +@@ -948,6 +947,10 @@ CDEFINES += -DDFS_MASTER_OFFLOAD_IND_SUPPORT + endif + endif + ++ifeq ($(CONFIG_NL80211_TESTMODE), y) ++CDEFINES += -DWLAN_NL80211_TESTMODE ++endif ++ + ifeq ($(CONFIG_ARCH_MSM), y) + CDEFINES += -DMSM_PLATFORM + endif diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/modprobe-qualcomm.conf b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/modprobe-qualcomm.conf new file mode 100644 index 000000000..313d88b5c --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/modprobe-qualcomm.conf @@ -0,0 +1,5 @@ +install wlan true +# Load the wlan module with values for SDIO3.0. +options wlan asyncintdelay=0x2 writecccr1=0xf2 writecccr1value=0xf \ + writecccr2=0xf1 writecccr2value=0xa8 writecccr3=0xf0 \ + writecccr3value=0xa1 writecccr4=0x15 writecccr4value=0x30 diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up new file mode 100644 index 000000000..958516ea8 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up @@ -0,0 +1,61 @@ +#!/bin/sh +#=============================================================================== +# +# qualcomm-pre-up +# +# Copyright (C) 2016 by Digi International Inc. +# All rights reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# +# !Description: Load Qualcomm' wireless driver +# +#=============================================================================== + +[ "${IFACE}" != "wlan0" ] && exit 0 + +MACFILE="/lib/firmware/wlan/wlan_mac.bin" +TMP_MACFILE="$(mktemp -t wlan_mac.XXXXXX)" + +# Read the MACs from DeviceTree. We can have up to four wireless interfaces +# The only required one is wlan0 that is mapped with device tree mac address +# without suffix. +for index in $(seq 0 3); do + DT_WLANx_MAC="/proc/device-tree/wireless/mac-address" + if [ "${index}" = "0" ]; then + # Set a default MAC for wlan0 + MAC_ADDR="00:04:F3:FF:FF:FB" + else + # Add the interface suffix for the device tree node + DT_WLANx_MAC=${DT_WLANx_MAC}${index} + MAC_ADDR="" + fi + + if [ -f "${DT_WLANx_MAC}" ]; then + MAC_ADDR="$(hexdump -ve '1/1 "%02X" ":"' ${DT_WLANx_MAC} | sed 's/:$//g')" + fi + + # Dump the MAC address in a file with the expected firmware format. + # example: Intf0MacAddress=0004f3fffffb + echo "Intf${index}MacAddress=${MAC_ADDR}" | sed s/://g >> ${TMP_MACFILE} +done + +# Override the MAC firmware file only if the MAC file has changed. +if ! cmp -s ${TMP_MACFILE} ${MACFILE}; then + cp ${TMP_MACFILE} ${MACFILE} +fi +rm -f ${TMP_MACFILE} + +# Load the wireless module with the params defined in modprobe.d/qualcomm.conf +modprobe wlan + +# Validate that firmware was loaded by checking if the interface is present. +if [ -d "/sys/class/net/${IFACE}" ]; then + echo "Loading qca6564 module: [OK]" +else + echo "Loading qca6564 module: [FAILED]" + exit 1 +fi From 0793dbf75b5af8b1efdb8ff9cd1268d493f1e3d6 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 21 Jun 2016 12:47:38 +0200 Subject: [PATCH 047/117] ccimx6ul.inc: add kernel-module-qualcomm as machine feature if wifi is set https://jira.digi.com/browse/DEL-2653 Signed-off-by: Isaac Hermida --- meta-digi-arm/conf/machine/include/ccimx6ul.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index 16b6d9f62..d1681abf2 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -14,6 +14,7 @@ UBOOT_SYMLINK = "u-boot-${MACHINE}.${UBOOT_SUFFIX}" # Wireless external module WIRELESS_MODULE ?= "" +WIRELESS_MODULE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'wifi', 'kernel-module-qualcomm', '', d)}" # Firmware MACHINE_FIRMWARE ?= "" From a6d0a1d1399a62702d9290e3c07f8334dfbfd282 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 23 Jun 2016 11:31:24 +0200 Subject: [PATCH 048/117] bluez5-init: reset bluetooth qualcomm chip before initialization The power regulator connected to the qca6554 chip is always on, which causes the Bluetooth part to not work correctly after a software-reset. This commit asserts momentarily the BT_EN line during the start-up sequence to reset the Bluetooth controller so that it is in a predictable state after a reset. https://jira.digi.com/browse/DEL-2623 Signed-off-by: Isaac Hermida --- .../recipes-connectivity/bluez/bluez5-5.33/bluez-init | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init index 9637792e5..363c7aa3a 100755 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init @@ -26,6 +26,15 @@ SCRIPTNAME="$(basename "${0}")" bt_init_qca6564() { MOD_VERSION="$(($(cat /proc/device-tree/digi,hwid,hv 2>/dev/null || true)))" + # Reset the BT_EN line + BT_EN_QCA_GPIO_NR="137" + BT_EN_L="/sys/class/gpio/gpio${BT_EN_QCA_GPIO_NR}" + [ -d "${BT_EN_L}" ] || printf "%s" ${BT_EN_QCA_GPIO_NR} > /sys/class/gpio/export + printf out > ${BT_EN_L}/direction && sleep .1 + printf 0 > ${BT_EN_L}/value && sleep .1 + printf 1 > ${BT_EN_L}/value && sleep .1 + [ -d "${BT_EN_L}" ] && printf "%s" ${BT_EN_QCA_GPIO_NR} > /sys/class/gpio/unexport + # Module version older than revision 4 has swapped TX and RX lines if [ "${MOD_VERSION}" -lt "4" ]; then # Workaround to ignore the CTS flow control line From 32ae76e1cf10ae45b113a7c6587c854254b940d2 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 23 Jun 2016 14:43:40 +0200 Subject: [PATCH 049/117] bluez5-init: rename the CTS gpio name and make the code more robust Signed-off-by: Isaac Hermida --- .../recipes-connectivity/bluez/bluez5-5.33/bluez-init | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init index 363c7aa3a..583910c9f 100755 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init @@ -38,10 +38,12 @@ bt_init_qca6564() { # Module version older than revision 4 has swapped TX and RX lines if [ "${MOD_VERSION}" -lt "4" ]; then # Workaround to ignore the CTS flow control line - BT_GPIO_CTS="18" - echo "${BT_GPIO_CTS}" > /sys/class/gpio/export - echo "out" > /sys/class/gpio/gpio${BT_GPIO_CTS}/direction - echo "0" > /sys/class/gpio/gpio${BT_GPIO_CTS}/value + BT_CTS_QCA_GPIO_NR="18" + BT_CTS_L="/sys/class/gpio/gpio${BT_CTS_QCA_GPIO_NR}" + [ -d "${BT_CTS_L}" ] || printf "%s" ${BT_CTS_QCA_GPIO_NR} > /sys/class/gpio/export + printf out > ${BT_CTS_L}/direction && sleep .1 + printf 0 > ${BT_CTS_L}/value && sleep .1 + [ -d "${BT_CTS_L}" ] && printf "%s" ${BT_CTS_QCA_GPIO_NR} > /sys/class/gpio/unexport # Reduce the rate to avoid the need for HW flow control BT_RATE="115200" BT_FLOW="noflow" From 552f9a4567080070d6cfa1bb3b8360dddab97e51 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Fri, 24 Jun 2016 16:04:24 +0200 Subject: [PATCH 050/117] meta-digi: dey-wireless: add iw to the list of wireless packages Add iw to the list of packages to be installed regardless the platform. Signed-off-by: Isaac Hermida --- .../packagegroups/packagegroup-dey-wireless.bb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-wireless.bb b/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-wireless.bb index 52304b65d..0ab84684a 100644 --- a/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-wireless.bb +++ b/meta-digi-dey/recipes-connectivity/packagegroups/packagegroup-dey-wireless.bb @@ -10,11 +10,9 @@ inherit packagegroup RDEPENDS_${PN} = "\ crda \ + iw \ wireless-tools \ wpa-supplicant \ wpa-supplicant-cli \ wpa-supplicant-passphrase \ " - -RDEPENDS_${PN}_append_mxs = " iw" -RDEPENDS_${PN}_append_mx6 = " iw" From 9cd2009300e8fb417dc83a3c24d5815c21866280 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Mon, 27 Jun 2016 08:36:35 +0200 Subject: [PATCH 051/117] ccimx6ul.inc: add imx-kobs as a required package This tool is required to update the U-Boot NAND in linux. Signed-off-by: Isaac Hermida --- meta-digi-arm/conf/machine/include/ccimx6ul.inc | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index d1681abf2..dc6f8acce 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -20,6 +20,7 @@ WIRELESS_MODULE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'wifi', 'ker MACHINE_FIRMWARE ?= "" MACHINE_EXTRA_RDEPENDS += " \ + imx-kobs \ mtd-utils-ubifs \ " MACHINE_EXTRA_RRECOMMENDS += "${MACHINE_FIRMWARE} ${WIRELESS_MODULE}" From 113e9a0e0b29dbdf22c79f0fc123502a09d95dd5 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Fri, 24 Jun 2016 13:04:47 +0200 Subject: [PATCH 052/117] recipes-core: expand core-image-base recipe Expand the core-image-base recipe by including some default packages to the image. https://jira.digi.com/browse/DEL-2695 https://jira.digi.com/browse/DEL-2693 Signed-off-by: Isaac Hermida --- .../recipes-core/images/core-image-base.bbappend | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 meta-digi-dey/recipes-core/images/core-image-base.bbappend diff --git a/meta-digi-dey/recipes-core/images/core-image-base.bbappend b/meta-digi-dey/recipes-core/images/core-image-base.bbappend new file mode 100644 index 000000000..d04a7dae1 --- /dev/null +++ b/meta-digi-dey/recipes-core/images/core-image-base.bbappend @@ -0,0 +1,13 @@ +# +# Copyright (C) 2016 Digi International. +# + +IMAGE_FEATURES += " \ + dey-network \ + package-management \ + ssh-server-dropbear \ + ${@bb.utils.contains('MACHINE_FEATURES', 'accel-video', 'dey-gstreamer', '', d)} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'alsa', 'dey-audio', '', d)} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'bluetooth', 'dey-bluetooth', '', d)} \ + ${@bb.utils.contains('MACHINE_FEATURES', 'wifi', 'dey-wireless', '', d)} \ +" From 021bc9d29d97a97be14b2806cc1ff448d2767810 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Fri, 24 Jun 2016 13:36:27 +0200 Subject: [PATCH 053/117] kernel-module-qualcomm: qualcomm-pre-up: compatibility improvement for modprobe The root filesystem can have installed the busybox modprobe implementation or the kmod modprobe implementation. Check the version installed and compound the modprobe arguments. Signed-off-by: Isaac Hermida --- .../kernel-module-qualcomm/qualcomm-pre-up | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up index 958516ea8..f9f4e232d 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up @@ -49,8 +49,12 @@ if ! cmp -s ${TMP_MACFILE} ${MACFILE}; then fi rm -f ${TMP_MACFILE} +# Check the version of modprobe installed to compound the arguments. +if readlink -f $(which modprobe) | grep -qs kmod; then + MODPROBE_ARGS="-i" +fi # Load the wireless module with the params defined in modprobe.d/qualcomm.conf -modprobe wlan +modprobe ${MODPROBE_ARGS} wlan # Validate that firmware was loaded by checking if the interface is present. if [ -d "/sys/class/net/${IFACE}" ]; then From 9db7e6eb33b01d4e1e4068ead10e7e74c189ba73 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Fri, 24 Jun 2016 13:57:22 +0200 Subject: [PATCH 054/117] ccimx6ulstarter.conf: update U-Boot defconfig file Signed-off-by: Isaac Hermida --- meta-digi-arm/conf/machine/ccimx6ulstarter.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf index 538260239..64b12bf92 100644 --- a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf +++ b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf @@ -8,7 +8,7 @@ include conf/machine/include/ccimx6ul.inc # U-Boot configurations # Last one is the default (the one the symlinks point at) UBOOT_CONFIG ??= "ccimx6ulstarter" -UBOOT_CONFIG[ccimx6ulstarter] = "ccimx6ulsbc_defconfig" +UBOOT_CONFIG[ccimx6ulstarter] = "ccimx6ulstarter_defconfig" KERNEL_DEVICETREE ?= " \ imx6ul-ccimx6ulstarter.dtb \ From 7ecd73da73d8cf935a678de740c0f6c8161da44f Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Mon, 27 Jun 2016 13:21:52 +0200 Subject: [PATCH 055/117] kernel-module-qualcomm: [cosmetic] rework patches to do not include numbering Signed-off-by: Isaac Hermida --- ...qcacld-Fix-compiling-errors-when-BUILD_DEBUG_VERSION.patch | 3 +-- ...Update-cfg80211_vendor_event_alloc-call-for-newer-ke.patch | 4 ++-- ...wlan_hdd_main-Update-cfg80211_ap_stopped-to-nl80211_.patch | 2 +- .../0004-qcacld-2.0-remove-unused-code.patch | 2 +- .../0005-Including-header-file-for-regulatory_hint_user.patch | 2 +- .../0006-Updating-calls-to-alloc_netdev_mq.patch | 2 +- ...wlan_hdd_cfg80211-update-cfg80211_inform_bss-params-.patch | 4 ++-- ...wlan_hdd_p2p-Update-call-to-cfg80211_rx_mgmt-for-dif.patch | 4 ++-- .../0009-linux_ac-Fix-for-f_dentry.patch | 4 ++-- ...native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch | 4 ++-- ...osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch | 2 +- ...-Kbuild-Add-compilation-flag-based-on-kernel-support.patch | 2 +- 12 files changed, 17 insertions(+), 18 deletions(-) diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0001-qcacld-Fix-compiling-errors-when-BUILD_DEBUG_VERSION.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0001-qcacld-Fix-compiling-errors-when-BUILD_DEBUG_VERSION.patch index eed092d73..63847821a 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0001-qcacld-Fix-compiling-errors-when-BUILD_DEBUG_VERSION.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0001-qcacld-Fix-compiling-errors-when-BUILD_DEBUG_VERSION.patch @@ -1,7 +1,6 @@ From: Yi Chen Date: Fri, 28 Aug 2015 19:24:45 +0800 -Subject: [PATCH 01/12] qcacld: Fix compiling errors when BUILD_DEBUG_VERSION - := 0. +Subject: [PATCH] qcacld: Fix compiling errors when BUILD_DEBUG_VERSION := 0. This is a compiling issue when BUILD_DEBUG_VERSION := 0 is set in Kbuild. diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0002-Update-cfg80211_vendor_event_alloc-call-for-newer-ke.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0002-Update-cfg80211_vendor_event_alloc-call-for-newer-ke.patch index 20dbe961e..221547159 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0002-Update-cfg80211_vendor_event_alloc-call-for-newer-ke.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0002-Update-cfg80211_vendor_event_alloc-call-for-newer-ke.patch @@ -1,7 +1,7 @@ From: Isaac Hermida Date: Mon, 18 Apr 2016 08:48:14 +0200 -Subject: [PATCH 02/12] Update cfg80211_vendor_event_alloc call for newer - kernel versions +Subject: [PATCH] Update cfg80211_vendor_event_alloc call for newer kernel + versions Current compilation fails with next error. diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0003-wlan_hdd_main-Update-cfg80211_ap_stopped-to-nl80211_.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0003-wlan_hdd_main-Update-cfg80211_ap_stopped-to-nl80211_.patch index 91eeac607..86c6a4ca7 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0003-wlan_hdd_main-Update-cfg80211_ap_stopped-to-nl80211_.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0003-wlan_hdd_main-Update-cfg80211_ap_stopped-to-nl80211_.patch @@ -1,6 +1,6 @@ From: Isaac Hermida Date: Thu, 21 Apr 2016 10:30:51 +0200 -Subject: [PATCH 03/12] wlan_hdd_main: Update cfg80211_ap_stopped to +Subject: [PATCH] wlan_hdd_main: Update cfg80211_ap_stopped to nl80211_send_ap_stopped Use nl80211_send_ap_stopped instead of cfg80211_ap_stopped for newer diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0004-qcacld-2.0-remove-unused-code.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0004-qcacld-2.0-remove-unused-code.patch index 80eba78fb..09b3ee892 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0004-qcacld-2.0-remove-unused-code.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0004-qcacld-2.0-remove-unused-code.patch @@ -1,6 +1,6 @@ From: Karthick S Date: Fri, 14 Aug 2015 14:52:23 +0530 -Subject: [PATCH 04/12] qcacld-2.0: remove unused code +Subject: [PATCH] qcacld-2.0: remove unused code Removed unused code from ReinitSDIO. Also removed mmcbusmode and it's related references in the code. diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0005-Including-header-file-for-regulatory_hint_user.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0005-Including-header-file-for-regulatory_hint_user.patch index 1c3529829..750db8f12 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0005-Including-header-file-for-regulatory_hint_user.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0005-Including-header-file-for-regulatory_hint_user.patch @@ -1,6 +1,6 @@ From: Isaac Hermida Date: Thu, 21 Apr 2016 13:19:10 +0200 -Subject: [PATCH 05/12] Including header file for "regulatory_hint_user" +Subject: [PATCH] Including header file for "regulatory_hint_user" The function "regulatory_hint_user" has been moved from include/net/cfg80211.h to net/wireless/reg.h. diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0006-Updating-calls-to-alloc_netdev_mq.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0006-Updating-calls-to-alloc_netdev_mq.patch index 15a34993b..644edbf66 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0006-Updating-calls-to-alloc_netdev_mq.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0006-Updating-calls-to-alloc_netdev_mq.patch @@ -1,6 +1,6 @@ From: Isaac Hermida Date: Thu, 21 Apr 2016 13:52:18 +0200 -Subject: [PATCH 06/12] Updating calls to "alloc_netdev_mq" +Subject: [PATCH] Updating calls to "alloc_netdev_mq" Signed-off-by: Isaac Hermida --- diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0007-wlan_hdd_cfg80211-update-cfg80211_inform_bss-params-.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0007-wlan_hdd_cfg80211-update-cfg80211_inform_bss-params-.patch index 2f3b586c3..58df7fd70 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0007-wlan_hdd_cfg80211-update-cfg80211_inform_bss-params-.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0007-wlan_hdd_cfg80211-update-cfg80211_inform_bss-params-.patch @@ -1,7 +1,7 @@ From: Isaac Hermida Date: Thu, 21 Apr 2016 13:56:15 +0200 -Subject: [PATCH 07/12] wlan_hdd_cfg80211: update "cfg80211_inform_bss" params - for kernel version +Subject: [PATCH] wlan_hdd_cfg80211: update "cfg80211_inform_bss" params for + kernel version Signed-off-by: Isaac Hermida --- diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0008-wlan_hdd_p2p-Update-call-to-cfg80211_rx_mgmt-for-dif.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0008-wlan_hdd_p2p-Update-call-to-cfg80211_rx_mgmt-for-dif.patch index a9148ece0..773706b5c 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0008-wlan_hdd_p2p-Update-call-to-cfg80211_rx_mgmt-for-dif.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0008-wlan_hdd_p2p-Update-call-to-cfg80211_rx_mgmt-for-dif.patch @@ -1,7 +1,7 @@ From: Isaac Hermida Date: Thu, 21 Apr 2016 13:57:03 +0200 -Subject: [PATCH 08/12] wlan_hdd_p2p: Update call to "cfg80211_rx_mgmt" for - different kernel versions +Subject: [PATCH] wlan_hdd_p2p: Update call to "cfg80211_rx_mgmt" for different + kernel versions Signed-off-by: Isaac Hermida --- diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0009-linux_ac-Fix-for-f_dentry.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0009-linux_ac-Fix-for-f_dentry.patch index 481ef0970..f3bbd3bfa 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0009-linux_ac-Fix-for-f_dentry.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0009-linux_ac-Fix-for-f_dentry.patch @@ -1,7 +1,7 @@ From: Isaac Hermida Date: Thu, 21 Apr 2016 13:58:29 +0200 -Subject: [PATCH 09/12] =?UTF-8?q?linux=5Fac:=20Fix=20for=20=E2=80=98f=5Fde?= - =?UTF-8?q?ntry=E2=80=99?= +Subject: [PATCH] =?UTF-8?q?linux=5Fac:=20Fix=20for=20=E2=80=98f=5Fdentry?= + =?UTF-8?q?=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0010-native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0010-native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch index 7f6e94508..a2a7ce05e 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0010-native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0010-native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch @@ -1,7 +1,7 @@ From: Isaac Hermida Date: Thu, 21 Apr 2016 14:00:59 +0200 -Subject: [PATCH 10/12] native_sdio/src/hif: Do not call to HIGH SPEED - functions for newer kernels +Subject: [PATCH] native_sdio/src/hif: Do not call to HIGH SPEED functions for + newer kernels Signed-off-by: Isaac Hermida --- diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch index c8370c0a4..53fc1fb07 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch @@ -1,6 +1,6 @@ From: Isaac Hermida Date: Thu, 21 Apr 2016 14:32:57 +0200 -Subject: [PATCH 11/12] osdep_adf.h: fix for undefined ath_sysctl_pktlog_size +Subject: [PATCH] osdep_adf.h: fix for undefined ath_sysctl_pktlog_size Signed-off-by: Isaac Hermida --- diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch index a296bd836..de5ce9002 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch @@ -1,6 +1,6 @@ From: Isaac Hermida Date: Thu, 19 May 2016 12:28:39 +0200 -Subject: [PATCH 12/12] Kbuild: Add compilation flag based on kernel support +Subject: [PATCH] Kbuild: Add compilation flag based on kernel support The option WLAN_NL80211_TESTMODE was inconditionally added to the compilation but it does required the specific kernel support. From 7a95663c5ebf063d48e7c4faf12aae4504e519f3 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Mon, 27 Jun 2016 13:23:09 +0200 Subject: [PATCH 056/117] kernel-module-qualcomm: do not create an auxiliar p2p interface on init https://jira.digi.com/browse/DEL-2656 Signed-off-by: Isaac Hermida --- .../kernel-module-qualcomm.bb | 1 + ...o-not-create-an-auxiliar-p2p-on-init.patch | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0013-Kbuild-do-not-create-an-auxiliar-p2p-on-init.patch diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb index 2566d4336..9f742e3f7 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb @@ -29,6 +29,7 @@ SRC_URI = " \ file://0010-native_sdio-src-hif-Do-not-call-to-HIGH-SPEED-functi.patch \ file://0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch \ file://0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch \ + file://0013-Kbuild-do-not-create-an-auxiliar-p2p-on-init.patch \ " S = "${WORKDIR}/${PV}" diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0013-Kbuild-do-not-create-an-auxiliar-p2p-on-init.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0013-Kbuild-do-not-create-an-auxiliar-p2p-on-init.patch new file mode 100644 index 000000000..c8498dda3 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0013-Kbuild-do-not-create-an-auxiliar-p2p-on-init.patch @@ -0,0 +1,22 @@ +From: Isaac Hermida +Date: Mon, 27 Jun 2016 13:07:23 +0200 +Subject: [PATCH] Kbuild: do not create an auxiliar p2p on init + +Signed-off-by: Isaac Hermida +--- + Kbuild | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Kbuild b/Kbuild +index 339262874c94..b14417a558cd 100644 +--- a/Kbuild ++++ b/Kbuild +@@ -1254,7 +1254,7 @@ CDEFINES += -DQCA_HT_2040_COEX + else + + #Open P2P device interface only for non-Mobile router use cases +-CDEFINES += -DWLAN_OPEN_P2P_INTERFACE ++# CDEFINES += -DWLAN_OPEN_P2P_INTERFACE + + #Enable 2.4 GHz social channels in 5 GHz only mode for p2p usage + CDEFINES += -DWLAN_ENABLE_SOCIAL_CHANNELS_5G_ONLY From bc98b6f362c49ab24475f5fcd0d48c556eaf82be Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 28 Jun 2016 14:33:42 +0200 Subject: [PATCH 057/117] ccimx6ul: defconfig: do not use static DDBB for regulatory domain Do not compile the kernel for supporting the static regulatory domain but force the system to do that by using crda. https://jira.digi.com/browse/DEL-2539 Signed-off-by: Isaac Hermida --- .../recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig | 3 --- 1 file changed, 3 deletions(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig index d53291f35..835b59362 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig @@ -72,7 +72,6 @@ CONFIG_BT_HCIUART_IBS=y CONFIG_CFG80211=y CONFIG_CFG80211_CERTIFICATION_ONUS=y CONFIG_CFG80211_DEBUGFS=y -CONFIG_CFG80211_INTERNAL_REGDB=y CONFIG_CFG80211_WEXT=y CONFIG_MAC80211=y CONFIG_MAC80211_DEBUGFS=y @@ -358,8 +357,6 @@ CONFIG_MAGIC_SYSRQ=y CONFIG_SECURITYFS=y CONFIG_CRYPTO_USER=y CONFIG_CRYPTO_TEST=m -CONFIG_CRYPTO_CCM=y -CONFIG_CRYPTO_GCM=y CONFIG_CRYPTO_CBC=y CONFIG_CRYPTO_CTS=y CONFIG_CRYPTO_LRW=y From f88ea99ed3f4a3ad5e40d0479481faf6451fa328 Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Tue, 28 Jun 2016 12:46:32 +0200 Subject: [PATCH 058/117] ccimx6ul: Removed CONSOLE_ENABLE_GPIO_NR platform specific naming. This commit changes the CONFIG_CCIMX6SBC_CONSOLE_ENABLE_GPIO_NR define into a platform independent setting. Signed-off-by: Mike Engel https://jira.digi.com/browse/DEL-2641 --- meta-digi-dey/classes/trustfence.bbclass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index bf7a5c2bb..0e734044a 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -40,7 +40,7 @@ python () { passphrase_hash = hashlib.sha256(d.getVar("TRUSTFENCE_CONSOLE_PASSPHRASE_ENABLE")).hexdigest() d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_CONSOLE_ENABLE_PASSPHRASE=y CONFIG_CONSOLE_ENABLE_PASSPHRASE_KEY=\\"%s\\" ' % passphrase_hash) elif d.getVar("TRUSTFENCE_CONSOLE_GPIO_ENABLE", True): - d.appendVar("UBOOT_EXTRA_CONF", " CONFIG_CONSOLE_ENABLE_GPIO=y CONFIG_CCIMX6SBC_CONSOLE_ENABLE_GPIO_NR=%s " % d.getVar("TRUSTFENCE_CONSOLE_GPIO_ENABLE")) + d.appendVar("UBOOT_EXTRA_CONF", " CONFIG_CONSOLE_ENABLE_GPIO=y CONFIG_CONSOLE_ENABLE_GPIO_NR=%s " % d.getVar("TRUSTFENCE_CONSOLE_GPIO_ENABLE")) # Secure boot configuration if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK") == "gen_random"): From 36e3a2c6c3e0784ba3b3e88cbd6908d1495f8af7 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 29 Jun 2016 09:07:06 +0200 Subject: [PATCH 059/117] bluez5-init; redirect bluetooth daemon messages to a log file https://jira.digi.com/browse/DEL-2632 Signed-off-by: Isaac Hermida --- .../recipes-connectivity/bluez/bluez5-5.33/bluez-init | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init index 583910c9f..7458716a2 100755 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/bluez-init @@ -22,6 +22,7 @@ if [ "${1}" != "start" ]; then fi SCRIPTNAME="$(basename "${0}")" +LOGFILE="/var/log/bluetoothd.log" bt_init_qca6564() { MOD_VERSION="$(($(cat /proc/device-tree/digi,hwid,hv 2>/dev/null || true)))" @@ -49,7 +50,7 @@ bt_init_qca6564() { BT_FLOW="noflow" fi - if hciattach -t120 ttyBt qca ${BT_RATE:-3000000} ${BT_FLOW:-flow} 2>/dev/null; then + if hciattach -t120 ttyBt qca ${BT_RATE:-3000000} ${BT_FLOW:-flow} 2>${LOGFILE}; then : # No-op else echo "${SCRIPTNAME}: FAILED (hciattach)" @@ -123,7 +124,7 @@ bt_init_ar3k() { # Start the Bluetooth driver and daemon (D-BUS must already be running) RETRIES="5" while [ "${RETRIES}" -gt "0" ]; do - hciattach ttyBt ath3k 4000000 1>/dev/null && break + hciattach ttyBt ath3k 4000000 1>${LOGFILE} && break if [ -n "${BT_PWR_GPIO_NR}" ]; then # # If hciattach fails try to recover it by toggling the BT power GPIO From 7dda6380c24ba90e70de6802b5e80c772f95f82f Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 28 Jun 2016 12:37:51 +0200 Subject: [PATCH 060/117] meta-digi-dey: sysinfo: Use DISTRO and machine name. The following utilities are supposed to be available on the environment's PATH: uptime, uname, cat, zcat, free, ps, mount, netstat, route, ifconfig, gzip https://jira.digi.com/browse/DEL-2447 Signed-off-by: Alex Gonzalez --- meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo b/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo index 8b0f2b9d7..a9b5c565c 100755 --- a/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo +++ b/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo @@ -182,8 +182,10 @@ make_report(){ } +DISTRO="$(sed -ne 's,DISTRO = \(.*\)$,\1,g;T;p' /etc/build)" DEY_VERSION="$(sed -ne 's,DISTRO_VERSION = \(.*\)$,\1,g;T;p' /etc/build)" UBOOT_VERSION="$(strings /dev/mmcblk0boot0 | grep dub | cut -d' ' -f2)" +MACHINE="$(cat /proc/device-tree/digi,machine,name)" BOARD_VARIANT="$(cat /proc/device-tree/digi,hwid,variant)" BOARD_SN="$(cat /proc/device-tree/digi,hwid,sn)" BOARD_VERSION="$(cat /proc/device-tree/digi,carrierboard,version)" @@ -202,9 +204,9 @@ printf "\n\n" echo "" echo "||*Component*|*Version*" - echo "|| DUT | SN-${BOARD_SN}, CC6 ${BOARD_VARIANT} SBCv${BOARD_VERSION} board_ID=${BOARD_ID}." + echo "|| DUT | SN-${BOARD_SN}, ${MACHINE} ${BOARD_VARIANT} SBCv${BOARD_VERSION} board_ID=${BOARD_ID}." echo "|| U-Boot | ${UBOOT_VERSION}" - echo "|| Firmware | ${DEY_VERSION}-$(cat /etc/version)" + echo "|| Firmware | ${DISTRO}-${DEY_VERSION}-$(cat /etc/version)" echo "|| Kernel | $(uname -a)" printf "\n\n" ) | tee ${FILE} From e5dca69e961cabd31af89df41536d94072445033 Mon Sep 17 00:00:00 2001 From: Mike Engel Date: Fri, 1 Jul 2016 09:08:40 +0200 Subject: [PATCH 061/117] ccimx6ul: Add cryptodev module to kernel configuration. This commit will add the cryptodev module to the CC6UL kernel to use the CAAM from user space through this device. Signed-off-by: Mike Engel https://jira.digi.com/browse/DEL-2719 --- meta-digi-arm/conf/machine/include/ccimx6ul.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index dc6f8acce..689cdd95a 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -24,7 +24,7 @@ MACHINE_EXTRA_RDEPENDS += " \ mtd-utils-ubifs \ " MACHINE_EXTRA_RRECOMMENDS += "${MACHINE_FIRMWARE} ${WIRELESS_MODULE}" -MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins" +MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins cryptodev-module" MACHINE_FEATURES += "wifi bluetooth" From 8bc38a2cbcac1c27c9cf3b843e00df38f4fa64b8 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Fri, 1 Jul 2016 10:45:15 +0200 Subject: [PATCH 062/117] core-image-base: add dey-image tweaks Signed-off-by: Isaac Hermida --- meta-digi-dey/recipes-core/images/core-image-base.bbappend | 3 +++ 1 file changed, 3 insertions(+) diff --git a/meta-digi-dey/recipes-core/images/core-image-base.bbappend b/meta-digi-dey/recipes-core/images/core-image-base.bbappend index d04a7dae1..6c8a0fe9c 100644 --- a/meta-digi-dey/recipes-core/images/core-image-base.bbappend +++ b/meta-digi-dey/recipes-core/images/core-image-base.bbappend @@ -11,3 +11,6 @@ IMAGE_FEATURES += " \ ${@bb.utils.contains('MACHINE_FEATURES', 'bluetooth', 'dey-bluetooth', '', d)} \ ${@bb.utils.contains('MACHINE_FEATURES', 'wifi', 'dey-wireless', '', d)} \ " + +# Add our dey-image tweaks to the final image (like /etc/build info) +inherit dey-image From a91cc4e79617f161dbb806e4d42a8cfb79200ee3 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Thu, 23 Jun 2016 13:20:07 +0200 Subject: [PATCH 063/117] meta-digi-arm: u-boot: fix trustfence checks logic There are several possible values for TRUSTFENCE_UBOOT_ENV_DEK: * Not defined: if the trustfence support is not included. Should not include the feature. * 32 characters: when defining a valid key. Should include the feature. * "0": when explicitly disabling the feature. Should not include the feature * : Invalid value, should trigger the error. This commits fixes the logic so that 'None' (no defined) is taken as a valid value. Signed-off-by: Diaz de Grenu, Jose --- meta-digi-dey/classes/trustfence.bbclass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index 0e734044a..8bacd48a3 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -60,6 +60,6 @@ python () { d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_ENCRYPT_IMAGE=y ") if d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE", True): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_DEK_SIZE=%s " % d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE")) - if d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True): + if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True) not in [None, "0"]): d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_ENV_AES=y CONFIG_ENV_AES_KEY=\\"%s\\"' % d.getVar("TRUSTFENCE_UBOOT_ENV_DEK")) } From d7a26cc3e6298d229653e67edacc86ae377d4c89 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Tue, 28 Jun 2016 11:30:48 +0200 Subject: [PATCH 064/117] meta-digi-arm: u-boot: change name of encrypted artifacts for clarity https://jira.digi.com/browse/DEL-2663 Signed-off-by: Diaz de Grenu, Jose --- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index f749ccc3d..bed7e0b07 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -115,14 +115,19 @@ do_deploy_append() { if [ "${TRUSTFENCE_UBOOT_SIGN}" = "1" ] then install ${S}/${config}/SRK_efuses.bin SRK_efuses-${PV}-${PR}.bin - install ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} - ln -sf u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-signed-${type}.${UBOOT_SUFFIX} ln -sf SRK_efuses-${PV}-${PR}.bin SRK_efuses.bin + if [ "${TRUSTFENCE_UBOOT_ENCRYPT}" = "1" ] then + install ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + ln -sf u-boot-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-encrypted-${type}.${UBOOT_SUFFIX} + # Move the data encryption key in plain text directly to the deployment directory. # Do not leave any other copies in the machine. mv ${S}/${config}/dek.bin ${DEPLOYDIR}/dek-${type}.bin + else + install ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + ln -sf u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-signed-${type}.${UBOOT_SUFFIX} fi fi fi From d223bc68c2a6f4871fdc2afe0a4290adf5eecf40 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Tue, 28 Jun 2016 16:22:19 +0200 Subject: [PATCH 065/117] meta-digi-dey: trustfence: fix TRUSTFENCE_UBOOT_DEK_SIZE setting The TRUSTFENCE_UBOOT_DEK_SIZE Yocto macro maps to the UBOOT_DEK_SIZE U-Boot Kconfig entry, which is defined as a choice entry. This makes necessary to explicitly define the choice Kconfig entry for the configuration to work. Signed-off-by: Diaz de Grenu, Jose --- meta-digi-dey/classes/trustfence.bbclass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index 8bacd48a3..e5363006c 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -59,7 +59,7 @@ python () { if (d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True) == "1"): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_ENCRYPT_IMAGE=y ") if d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE", True): - d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_DEK_SIZE=%s " % d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE")) + d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_DEK_SIZE=%s CONFIG_DEK_SIZE_%s=y" % (d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE"),d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE"))) if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True) not in [None, "0"]): d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_ENV_AES=y CONFIG_ENV_AES_KEY=\\"%s\\"' % d.getVar("TRUSTFENCE_UBOOT_ENV_DEK")) } From 04c3220bd94d5770322cde61392f9250667c5008 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Sat, 2 Jul 2016 11:48:14 +0200 Subject: [PATCH 066/117] hostapd-2.4: add support to compile hostapd for ccimx6ul https://jira.digi.com/browse/DEL-2654 Signed-off-by: Isaac Hermida --- .../fix_num_probereq_cb_clearing.patch | 38 +++++++++++++++++++ .../hostapd/hostapd_2.4.bbappend | 9 +++++ 2 files changed, 47 insertions(+) create mode 100644 meta-digi-dey/recipes-connectivity/hostapd/hostapd-2.4/ccimx6ul/fix_num_probereq_cb_clearing.patch create mode 100644 meta-digi-dey/recipes-connectivity/hostapd/hostapd_2.4.bbappend diff --git a/meta-digi-dey/recipes-connectivity/hostapd/hostapd-2.4/ccimx6ul/fix_num_probereq_cb_clearing.patch b/meta-digi-dey/recipes-connectivity/hostapd/hostapd-2.4/ccimx6ul/fix_num_probereq_cb_clearing.patch new file mode 100644 index 000000000..df48d5f99 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/hostapd/hostapd-2.4/ccimx6ul/fix_num_probereq_cb_clearing.patch @@ -0,0 +1,38 @@ +From 24fd20438f00a6f1bdeb6f23358ef60c2696b488 Mon Sep 17 00:00:00 2001 +From: "Chen, Yi" +Date: Wed, 2 Sep 2015 21:25:01 +0530 +Subject: WPS: Fix num_probereq_cb clearing on DISABLE to avoid segfault + +Reset hapd->num_probereq_cb to 0 on an interface deinit to avoid +unexpected behavior if the same interface is enabled again without fully +freeing the data structures. hostapd_register_probereq_cb() increments +hapd->num_probereq_cb by one and leaves all old values unchanged. In +this deinit+init case, that would result in the first entry in the list +having an uninitialized pointer and the next Probe Request frame +processing would likely cause the process to terminate on segmentation +fault. + +This issue could be hit when hostapd was used with WPS enabled (non-zero +wps_state configuration parameter) and control interface command DISABLE +and ENABLE were used. + +Signed-off-by: Jouni Malinen +--- + src/ap/hostapd.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/ap/hostapd.c b/src/ap/hostapd.c +index e4d7bfc..c09c17a 100644 +--- a/src/ap/hostapd.c ++++ b/src/ap/hostapd.c +@@ -261,6 +261,7 @@ static void hostapd_free_hapd_data(struct hostapd_data *hapd) + { + os_free(hapd->probereq_cb); + hapd->probereq_cb = NULL; ++ hapd->num_probereq_cb = 0; + + #ifdef CONFIG_P2P + wpabuf_free(hapd->p2p_beacon_ie); +-- +cgit v0.12 + diff --git a/meta-digi-dey/recipes-connectivity/hostapd/hostapd_2.4.bbappend b/meta-digi-dey/recipes-connectivity/hostapd/hostapd_2.4.bbappend new file mode 100644 index 000000000..8d98fa93c --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/hostapd/hostapd_2.4.bbappend @@ -0,0 +1,9 @@ +# Copyright (C) 2016 Digi International. + +FILESEXTRAPATHS_prepend := "${THISDIR}/${BP}:" + +# The recipe uses a different "$S" directory so point the patch to the hostapd +# tarball directory. +SRC_URI_append_ccimx6ul = " file://fix_num_probereq_cb_clearing.patch;patchdir=.." + +PACKAGE_ARCH = "${MACHINE_ARCH}" From 9ec5895eb09b934423ef870c4975d554a1386664 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Mon, 4 Jul 2016 11:55:46 +0200 Subject: [PATCH 067/117] pulseaudio: only install hdmi_hotplug.sh for ccimx6 platforms The ccimx6ul or ccardimx28 do not have hdmi interface, so do not install the hdmi hotplug script. https://jira.digi.com/browse/DEL-2654 Signed-off-by: Isaac Hermida --- .../recipes-multimedia/pulseaudio/pulseaudio_%.bbappend | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend b/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend index 47dc37227..a61a17004 100644 --- a/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend +++ b/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend @@ -1,11 +1,11 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" -SRC_URI += "file://hdmi_hotplug.sh" +SRC_URI_append_ccimx6 = " file://hdmi_hotplug.sh" # Do not include module-udev-detect so that module-detect is used instead RDEPENDS_pulseaudio-server_remove = "pulseaudio-module-udev-detect" -do_install_append() { +do_install_append_ccimx6() { install -d ${D}${sysconfdir}/udev/scripts install -m 0755 ${WORKDIR}/hdmi_hotplug.sh ${D}${sysconfdir}/udev/scripts @@ -14,3 +14,5 @@ do_install_append() { SUBSYSTEM=="platform", KERNEL=="*hdmi_video", ACTION=="change", RUN+="/etc/udev/scripts/hdmi_hotplug.sh" _EOL_ } + +PACKAGE_ARCH = "${MACHINE_ARCH}" From cf7c6b0af849b95018c5a960e869ecaaaabe0f5c Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 5 Jul 2016 18:33:30 +0200 Subject: [PATCH 068/117] kernel-module-qualcomm: compile the driver without debug messages By default the driver was being compiled with debug messages. Disabled it but leave the option there so it can be enabled by user. Signed-off-by: Isaac Hermida --- .../kernel-module-qualcomm.bb | 4 ++ ...mpile-the-DEBUG-version-inconditiona.patch | 25 ++++++++++ ...p-most-of-the-relevant-DEBUG-options.patch | 48 +++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0014-Kbuild-do-not-compile-the-DEBUG-version-inconditiona.patch create mode 100644 meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0015-Kbuild-Group-most-of-the-relevant-DEBUG-options.patch diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb index 9f742e3f7..c59fe3693 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm.bb @@ -30,6 +30,8 @@ SRC_URI = " \ file://0011-osdep_adf.h-fix-for-undefined-ath_sysctl_pktlog_size.patch \ file://0012-Kbuild-Add-compilation-flag-based-on-kernel-support.patch \ file://0013-Kbuild-do-not-create-an-auxiliar-p2p-on-init.patch \ + file://0014-Kbuild-do-not-compile-the-DEBUG-version-inconditiona.patch \ + file://0015-Kbuild-Group-most-of-the-relevant-DEBUG-options.patch \ " S = "${WORKDIR}/${PV}" @@ -39,6 +41,8 @@ EXTRA_OEMAKE += "CONFIG_CLD_HL_SDIO_CORE=y CONFIG_LINUX_QCMBR=y WLAN_OPEN_SOURCE # memory that is not allowed in ARMv6 (kernel commit # 309caa9cc6ff39d261264ec4ff10e29489afc8f8) EXTRA_OEMAKE += "CONFIG_NON_QC_PLATFORM=y" +# Flag to compile the debug version (1 - enabled, rest of values - disabled) +EXTRA_OEMAKE += "BUILD_DEBUG_VERSION=0" do_compile_prepend() { export BUILD_VER=${PV} diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0014-Kbuild-do-not-compile-the-DEBUG-version-inconditiona.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0014-Kbuild-do-not-compile-the-DEBUG-version-inconditiona.patch new file mode 100644 index 000000000..98eb059b5 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0014-Kbuild-do-not-compile-the-DEBUG-version-inconditiona.patch @@ -0,0 +1,25 @@ +From: Isaac Hermida +Date: Tue, 5 Jul 2016 17:57:07 +0200 +Subject: [PATCH] Kbuild: do not compile the DEBUG version inconditionally + +Do not compile the DEBUG version inconditionally by adding the posibility to +define the DEBUG version as a flag parameter. + +Signed-off-by: Isaac Hermida +--- + Kbuild | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Kbuild b/Kbuild +index b14417a558cd..a0e203ce5493 100644 +--- a/Kbuild ++++ b/Kbuild +@@ -121,7 +121,7 @@ endif + # Feature flags which are not (currently) configurable via Kconfig + + #Whether to build debug version +-BUILD_DEBUG_VERSION := 1 ++BUILD_DEBUG_VERSION ?= 1 + + #Enable this flag to build driver in diag version + BUILD_DIAG_VERSION := 1 diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0015-Kbuild-Group-most-of-the-relevant-DEBUG-options.patch b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0015-Kbuild-Group-most-of-the-relevant-DEBUG-options.patch new file mode 100644 index 000000000..0c9c91943 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/0015-Kbuild-Group-most-of-the-relevant-DEBUG-options.patch @@ -0,0 +1,48 @@ +From: Isaac Hermida +Date: Tue, 5 Jul 2016 17:52:44 +0200 +Subject: [PATCH] Kbuild: Group most of the relevant DEBUG options + +The value of BUILD_DEBUG_VERSION will be used to compile the driver with most +of the relevant DEBUG flags. Use that variable to compile the debug version. + +Signed-off-by: Isaac Hermida +--- + Kbuild | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/Kbuild b/Kbuild +index a0e203ce5493..e5f2e8ebd4ad 100644 +--- a/Kbuild ++++ b/Kbuild +@@ -896,9 +896,7 @@ CDEFINES := -DANI_LITTLE_BYTE_ENDIAN \ + -DWLAN_FEATURE_PACKET_FILTERING \ + -DWLAN_FEATURE_VOWIFI \ + -DWLAN_FEATURE_11AC \ +- -DWLAN_FEATURE_P2P_DEBUG \ + -DWLAN_ENABLE_AGEIE_ON_SCAN_RESULTS \ +- -DWLANTL_DEBUG\ + -DWLAN_NS_OFFLOAD \ + -DWLAN_ACTIVEMODE_OFFLOAD_FEATURE \ + -DWLAN_FEATURE_HOLD_RX_WAKELOCK \ +@@ -936,8 +934,7 @@ CDEFINES += -DCONFIG_HL_SUPPORT \ + -DSDIO_3_0 \ + -DHIF_SDIO \ + -DCONFIG_ATH_PROCFS_DIAG_SUPPORT \ +- -DFEATURE_HL_GROUP_CREDIT_FLOW_CONTROL \ +- -DDEBUG_HL_LOGGING ++ -DFEATURE_HL_GROUP_CREDIT_FLOW_CONTROL + endif + + ifeq ($(CONFIG_QCA_WIFI_SDIO), 1) +@@ -974,8 +971,11 @@ CDEFINES += -DTRACE_RECORD \ + + ifeq ($(BUILD_DEBUG_VERSION),1) + CDEFINES += -DWLAN_DEBUG \ ++ -DWLAN_FEATURE_P2P_DEBUG \ ++ -DWLANTL_DEBUG\ + -DPE_DEBUG_LOGW \ + -DPE_DEBUG_LOGE \ ++ -DDEBUG_HL_LOGGING \ + -DDEBUG + endif + From 052775a34cc6d389054187092c1498bb1f8a4f62 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 6 Jul 2016 13:23:54 +0200 Subject: [PATCH 069/117] install_linux_fw_sd: fix semi-colons in script - Add semi-colons to instructions inside 'setenv' commands - Remove semi-colons in instructions where they are not needed (for consistency with the rest of instructions) Signed-off-by: Hector Palacios --- .../u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt index fd87f4990..a6f4e7506 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt @@ -67,7 +67,7 @@ setenv INSTALL_ROOTFS_FILENAME dey-image-qt-##GRAPHICAL_BACKEND##-ccimx6sbc.ext4 for install_f in ${INSTALL_UBOOT_FILENAME} ${INSTALL_LINUX_FILENAME} ${INSTALL_ROOTFS_FILENAME}; do if test ! -e mmc 1:1 ${install_f}; then echo "ERROR: Could not find file ${install_f}"; - install_abort=1 + install_abort=1; fi; done if test -n "${install_abort}"; then @@ -88,7 +88,7 @@ setenv mmcdev 0 # Update U-Boot echo "" echo "" -echo ">> Installing U-Boot boot loader (target will reset)"; +echo ">> Installing U-Boot boot loader (target will reset)" echo "" echo "" update uboot mmc 1 fat ${INSTALL_UBOOT_FILENAME} @@ -110,8 +110,8 @@ setenv bootcmd ' env default -a; saveenv; setenv mmcdev 0; - setenv INSTALL_LINUX_FILENAME dey-image-qt-##GRAPHICAL_BACKEND##-ccimx6sbc.boot.vfat - setenv INSTALL_ROOTFS_FILENAME dey-image-qt-##GRAPHICAL_BACKEND##-ccimx6sbc.ext4 + setenv INSTALL_LINUX_FILENAME dey-image-qt-##GRAPHICAL_BACKEND##-ccimx6sbc.boot.vfat; + setenv INSTALL_ROOTFS_FILENAME dey-image-qt-##GRAPHICAL_BACKEND##-ccimx6sbc.ext4; echo ""; echo ""; echo ">> Creating Linux partition table on the eMMC"; From a32cea139b744c6d1d8cef3c4daa55cfbb4ccb82 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 6 Jul 2016 13:32:37 +0200 Subject: [PATCH 070/117] install_linux_fw_sd: expand variables when setting bootcmd to avoid redefining them The setting of 'bootcmd' in the script was done using single quotes, which doesn't expand variables. As a consequence the following variables must be defined again (during the execution of the second part of the script): - mmcdev - INSTALL_LINUX_FILENAME - INSTALL_ROOTFS_FILENAME This patch changes the single quotes with double quotes, so that these variables are expanded during the setting of 'bootcmd' with the values assigned at the begining of the installation script (notice these are not dynamically generated so there is no risk to expand them). At the same time we need to escape with a backslash: - double quotes containing strings - variables that we don't want to expand (like the return value $?) Signed-off-by: Hector Palacios --- .../ccimx6/install_linux_fw_sd.txt | 73 +++++++++---------- 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt index a6f4e7506..4006c9927 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt @@ -106,58 +106,55 @@ fi # - Update the 'linux' partition # - Update the 'rootfs' partition # - Reset the system and let it boot -setenv bootcmd ' +setenv bootcmd " env default -a; saveenv; - setenv mmcdev 0; - setenv INSTALL_LINUX_FILENAME dey-image-qt-##GRAPHICAL_BACKEND##-ccimx6sbc.boot.vfat; - setenv INSTALL_ROOTFS_FILENAME dey-image-qt-##GRAPHICAL_BACKEND##-ccimx6sbc.ext4; - echo ""; - echo ""; - echo ">> Creating Linux partition table on the eMMC"; - echo ""; - echo ""; + echo \"\"; + echo \"\"; + echo \">> Creating Linux partition table on the eMMC\"; + echo \"\"; + echo \"\"; run partition_mmc_linux; - if test $? -eq 1; then - echo "[ERROR] Failed to create Linux partition table!"; - echo ""; - echo "Aborted."; + if test \$? -eq 1; then + echo \"[ERROR] Failed to create Linux partition table!\"; + echo \"\"; + echo \"Aborted.\"; exit; fi; - echo ""; - echo ""; - echo ">> Installing Linux kernel and device tree files"; - echo ""; - echo ""; + echo \"\"; + echo \"\"; + echo \">> Installing Linux kernel and device tree files\"; + echo \"\"; + echo \"\"; update linux mmc 1 fat ${INSTALL_LINUX_FILENAME}; - if test $? -eq 1; then - echo "[ERROR] Failed to update linux partition!"; - echo ""; - echo "Aborted."; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update linux partition!\"; + echo \"\"; + echo \"Aborted.\"; exit; fi; - echo ""; - echo ""; - echo ">> Installing Linux root file system"; - echo ""; - echo ""; + echo \"\"; + echo \"\"; + echo \">> Installing Linux root file system\"; + echo \"\"; + echo \"\"; update rootfs mmc 1 fat ${INSTALL_ROOTFS_FILENAME}; - if test $? -eq 1; then - echo "[ERROR] Failed to update rootfs partition!"; - echo ""; - echo "Aborted."; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update rootfs partition!\"; + echo \"\"; + echo \"Aborted.\"; exit; fi; - echo ""; - echo "#######################"; - echo "# Install complete! #"; - echo "#######################"; - echo ""; + echo \"\"; + echo \"#######################\"; + echo \"# Install complete! #\"; + echo \"#######################\"; + echo \"\"; sleep 1; - echo ">> Restarting the system"; + echo \">> Restarting the system\"; sleep 1; reset; -' +" saveenv reset From 6f2acb17c68e7a9c594b28d08e6611716b541ccd Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 6 Jul 2016 13:39:24 +0200 Subject: [PATCH 071/117] install_linux_fw_sd: parametrize the mmc device index containing the firmware Signed-off-by: Hector Palacios --- .../u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt index 4006c9927..6b6cad2cd 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6/install_linux_fw_sd.txt @@ -60,12 +60,13 @@ else exit; fi; +setenv INSTALL_MMCDEV 1 setenv INSTALL_LINUX_FILENAME dey-image-qt-##GRAPHICAL_BACKEND##-ccimx6sbc.boot.vfat setenv INSTALL_ROOTFS_FILENAME dey-image-qt-##GRAPHICAL_BACKEND##-ccimx6sbc.ext4 # Check for presence of firmware files on the SD card for install_f in ${INSTALL_UBOOT_FILENAME} ${INSTALL_LINUX_FILENAME} ${INSTALL_ROOTFS_FILENAME}; do - if test ! -e mmc 1:1 ${install_f}; then + if test ! -e mmc ${INSTALL_MMCDEV}:1 ${install_f}; then echo "ERROR: Could not find file ${install_f}"; install_abort=1; fi; @@ -91,7 +92,7 @@ echo "" echo ">> Installing U-Boot boot loader (target will reset)" echo "" echo "" -update uboot mmc 1 fat ${INSTALL_UBOOT_FILENAME} +update uboot mmc ${INSTALL_MMCDEV} fat ${INSTALL_UBOOT_FILENAME} if test $? -eq 1; then echo "[ERROR] Failed to update U-Boot boot loader!"; echo ""; @@ -126,7 +127,7 @@ setenv bootcmd " echo \">> Installing Linux kernel and device tree files\"; echo \"\"; echo \"\"; - update linux mmc 1 fat ${INSTALL_LINUX_FILENAME}; + update linux mmc ${INSTALL_MMCDEV} fat ${INSTALL_LINUX_FILENAME}; if test \$? -eq 1; then echo \"[ERROR] Failed to update linux partition!\"; echo \"\"; @@ -138,7 +139,7 @@ setenv bootcmd " echo \">> Installing Linux root file system\"; echo \"\"; echo \"\"; - update rootfs mmc 1 fat ${INSTALL_ROOTFS_FILENAME}; + update rootfs mmc ${INSTALL_MMCDEV} fat ${INSTALL_ROOTFS_FILENAME}; if test \$? -eq 1; then echo \"[ERROR] Failed to update rootfs partition!\"; echo \"\"; From ff59bf653d83b1e72464fa80f7c984d4d7598df0 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 6 Jul 2016 16:15:17 +0200 Subject: [PATCH 072/117] ccimx6ulstarter: add U-Boot scripts for deploying and booting the system - boot.txt Sets the device tree filename basing on the SOM variant read from the HWID and boots from NAND. - install_linux_fw_sd Deploys a full system (as generated by Digi Embedded Yocto) from a FAT formatted micro SD card into the NAND flash. The u-boot-dey recipe is now fully shared by ccimx6 and ccimx6ul platforms so we can remove the platform-specific appends. Signed-off-by: Hector Palacios --- .../conf/machine/ccimx6ulstarter.conf | 3 + .../ccimx6ulstarter/boot.txt | 23 ++++ .../ccimx6ulstarter/install_linux_fw_sd.txt | 105 ++++++++++++++++++ .../recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 4 +- 4 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6ulstarter/boot.txt create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6ulstarter/install_linux_fw_sd.txt diff --git a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf index 64b12bf92..129135ab4 100644 --- a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf +++ b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf @@ -20,5 +20,8 @@ SERIAL_CONSOLES = "115200;ttymxc4" # Bluetooth tty BT_TTY ?= "ttymxc0" +# U-Boot script to be copied to the boot image +BOOT_SCRIPTS = "boot.scr:boot.scr" + # Flash image types IMAGE_FSTYPES ?= "tar.bz2 ubifs" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6ulstarter/boot.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6ulstarter/boot.txt new file mode 100644 index 000000000..86f18aadb --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6ulstarter/boot.txt @@ -0,0 +1,23 @@ +# +# U-Boot bootscript for NAND images created by Yocto. +# + +# +# Set device tree filename depending on the board ID (if defined) +# +if test -n "${board_id}"; then + setenv fdt_file zImage-imx6ul-ccimx6ulstarter-id${board_id}.dtb +else + # + # Set device tree filename depending on the hardware variant + # + if test "${module_variant}" = "0x02"; then + setenv fdt_file zImage-imx6ul-ccimx6ulstarter-wb.dtb + elif test "${module_variant}" = "0x03"; then + setenv fdt_file zImage-imx6ul-ccimx6ulstarter.dtb + else + echo "------ Using default fdt_file: $fdt_file" + fi +fi + +dboot linux nand diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6ulstarter/install_linux_fw_sd.txt b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6ulstarter/install_linux_fw_sd.txt new file mode 100644 index 000000000..1729975f2 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey-2015.04/ccimx6ulstarter/install_linux_fw_sd.txt @@ -0,0 +1,105 @@ +# +# U-Boot script for installing Linux images created by Yocto from the micro SD +# card into the NAND +# + +echo "############################################################" +echo "# Linux firmware install from micro SD #" +echo "############################################################" +echo "" +echo " This process will erase your NAND and will install a new" +echo " U-Boot and Linux firmware images on the NAND." +echo "" +echo " Press CTRL+C now if you wish to abort or wait 10 seconds" +echo " to continue." + +sleep 10 +if test $? -eq 1; then + echo "Aborted by user."; + exit; +fi + +setenv INSTALL_MMCDEV 0 +setenv INSTALL_UBOOT_FILENAME u-boot-ccimx6ulstarter.imx +setenv INSTALL_LINUX_FILENAME core-image-base-ccimx6ulstarter.boot.ubifs +setenv INSTALL_ROOTFS_FILENAME core-image-base-ccimx6ulstarter.ubifs + +# Check for presence of firmware files on the SD card +for install_f in ${INSTALL_UBOOT_FILENAME} ${INSTALL_LINUX_FILENAME} ${INSTALL_ROOTFS_FILENAME}; do + if test ! -e mmc ${INSTALL_MMCDEV}:1 ${install_f}; then + echo "ERROR: Could not find file ${install_f}"; + install_abort=1; + fi; +done +if test -n "${install_abort}"; then + echo "Aborted."; + exit; +fi + +# Skip user confirmation for U-Boot update +setenv forced_update 1 + +# Set bootdelay to zero so that firmware update is run immediately after +# the first reset. +setenv bootdelay 0 + +# Update U-Boot +echo "" +echo "" +echo ">> Installing U-Boot boot loader (target will reset)" +echo "" +echo "" +update uboot mmc ${INSTALL_MMCDEV} fat ${INSTALL_UBOOT_FILENAME} +if test $? -eq 1; then + echo "[ERROR] Failed to update U-Boot boot loader!"; + echo ""; + echo "Aborted."; + exit; +fi + +# Set 'bootcmd' to the second part of the script that will +# - Reset environment to defaults +# - Save the environment +# - Update the 'linux' partition +# - Update the 'rootfs' partition +# - Reset the system and let it boot +setenv bootcmd " + env default -a; + saveenv; + echo \"\"; + echo \"\"; + echo \">> Installing Linux kernel and device tree files\"; + echo \"\"; + echo \"\"; + update linux mmc ${INSTALL_MMCDEV} fat ${INSTALL_LINUX_FILENAME}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update linux partition!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + echo \"\"; + echo \"\"; + echo \">> Installing Linux root file system\"; + echo \"\"; + echo \"\"; + update rootfs mmc ${INSTALL_MMCDEV} fat ${INSTALL_ROOTFS_FILENAME}; + if test \$? -eq 1; then + echo \"[ERROR] Failed to update rootfs partition!\"; + echo \"\"; + echo \"Aborted.\"; + exit; + fi; + echo \"\"; + echo \"#######################\"; + echo \"# Install complete! #\"; + echo \"#######################\"; + echo \"\"; + sleep 1; + echo \">> Restarting the system\"; + sleep 1; + reset; +" + +saveenv +reset diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index bed7e0b07..eeaeba1ef 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -21,7 +21,7 @@ SRC_URI = " \ ${UBOOT_GIT_URI};branch=${SRCBRANCH} \ " -SRC_URI_append_ccimx6 = " \ +SRC_URI_append = " \ file://boot.txt \ file://install_linux_fw_sd.txt \ " @@ -136,9 +136,7 @@ do_deploy_append() { done unset i fi -} -do_deploy_append_ccimx6() { # DEY firmware install script sed -i -e 's,##GRAPHICAL_BACKEND##,${GRAPHICAL_BACKEND},g' ${WORKDIR}/install_linux_fw_sd.txt mkimage -T script -n "DEY firmware install script" -C none -d ${WORKDIR}/install_linux_fw_sd.txt ${DEPLOYDIR}/install_linux_fw_sd.scr From 846e1cd07f4f8448ce1b244350cee972283d35e6 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 6 Jul 2016 16:23:12 +0200 Subject: [PATCH 073/117] image-types_digi.bbclass: implement boot.ubifs image type This creates a UBIFS file with the kernel, device tree files, and U-Boot bootscripts generated by Digi Embedded Yocto. The resulting image can be then programmed into the boot (linux) partition. Signed-off-by: Hector Palacios https://jira.digi.com/browse/DEL-2697 --- .../classes/image_types_digi.bbclass | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/meta-digi-arm/classes/image_types_digi.bbclass b/meta-digi-arm/classes/image_types_digi.bbclass index 51716b9e5..7293bb003 100644 --- a/meta-digi-arm/classes/image_types_digi.bbclass +++ b/meta-digi-arm/classes/image_types_digi.bbclass @@ -60,6 +60,47 @@ IMAGE_CMD_boot.vfat() { fi } +IMAGE_CMD_boot.ubifs() { + # + # Image generation code for image type 'boot.ubifs' + # + BOOTIMG_FILES_SYMLINK="${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin" + if [ -n "${KERNEL_DEVICETREE}" ]; then + for DTB in ${KERNEL_DEVICETREE}; do + if [ -e "${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTB}" ]; then + BOOTIMG_FILES_SYMLINK="${BOOTIMG_FILES_SYMLINK} ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTB}" + fi + done + fi + + # Create temporary folder + TMP_BOOTDIR="$(mktemp -d ${DEPLOY_DIR_IMAGE}/boot.XXXXXX)" + + # Hard-link BOOTIMG_FILES into the temporary folder with the symlink filename + for item in ${BOOTIMG_FILES_SYMLINK}; do + orig="$(readlink -e ${item})" + ln ${orig} ${TMP_BOOTDIR}/$(basename ${item}) + done + + # Hard-link boot scripts into the temporary folder + for item in ${BOOT_SCRIPTS}; do + src="$(echo ${item} | awk -F':' '{ print $1 }')" + dst="$(echo ${item} | awk -F':' '{ print $2 }')" + ln ${DEPLOY_DIR_IMAGE}/${src} ${TMP_BOOTDIR}/${dst} + done + + # Build UBIFS boot image out of temp folder + mkfs.ubifs -r ${TMP_BOOTDIR} -o ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.boot.ubifs ${MKUBIFS_BOOT_ARGS} + + # Create the symlink + if [ -n "${IMAGE_LINK_NAME}" ] && [ -e ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.boot.ubifs ]; then + ln -s ${IMAGE_NAME}.boot.ubifs ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.boot.ubifs + fi + + # Remove the temporary folder + rm -rf ${TMP_BOOTDIR} +} + IMAGE_CMD_rootfs.initramfs() { # # Image generation code for image type 'rootfs.initramfs' From a2554a08ccfbdf62d1ffa284315b615d533ccbd0 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 6 Jul 2016 16:26:29 +0200 Subject: [PATCH 074/117] ccimx6ul: add support to build boot.ubifs image The size of the destination partition (linux) is around 14MiB so the max-leb-cnt must be reduced compared to the one used for the rootfs partition. Signed-off-by: Hector Palacios https://jira.digi.com/browse/DEL-2697 --- meta-digi-arm/conf/machine/ccimx6ulstarter.conf | 2 +- meta-digi-arm/conf/machine/include/ccimx6ul.inc | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf index 129135ab4..73b423e07 100644 --- a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf +++ b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf @@ -24,4 +24,4 @@ BT_TTY ?= "ttymxc0" BOOT_SCRIPTS = "boot.scr:boot.scr" # Flash image types -IMAGE_FSTYPES ?= "tar.bz2 ubifs" +IMAGE_FSTYPES ?= "tar.bz2 ubifs boot.ubifs" diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index 689cdd95a..47235b8f9 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -32,5 +32,9 @@ MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'bluetooth' MACHINE_FIRMWARE_append = " ${@bb.utils.contains('MACHINE_FEATURES', 'wifi', 'firmware-qualcomm-qca6564-wifi', '', d)}" KERNEL_IMAGETYPE = "zImage" -# FLASH parameters + +# mkfs.ubifs parameters for boot partition (the one holding kernel and device tree files) +MKUBIFS_BOOT_ARGS ?= "-m 2048 -e 126976 -c 127" + +# mkfs.ubifs parameters for rootfs partition MKUBIFS_ARGS ?= "-m 2048 -e 126976 -c 2047" From 0f09bbad7a0e81393275009d7b2f2ccaab0f25f4 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Wed, 6 Jul 2016 19:41:40 +0200 Subject: [PATCH 075/117] kernel-module-imx-gpu-viv: refresh patches after module upgrade The external module revision has been upgraded in meta-fsl-arm, thus refresh the patches so they apply cleanly. https://jira.digi.com/browse/DEL-2305 Signed-off-by: Javier Viguera --- ...mxc-gpu-use-recommended-values-for-minimum-GPU-frequ.patch | 4 ++-- .../0002-Use-busfreq-imx6.h-up-to-3.15-kernel.patch | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-imx-gpu-viv/0001-mxc-gpu-use-recommended-values-for-minimum-GPU-frequ.patch b/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-imx-gpu-viv/0001-mxc-gpu-use-recommended-values-for-minimum-GPU-frequ.patch index 99dee10a2..72a2f6582 100644 --- a/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-imx-gpu-viv/0001-mxc-gpu-use-recommended-values-for-minimum-GPU-frequ.patch +++ b/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-imx-gpu-viv/0001-mxc-gpu-use-recommended-values-for-minimum-GPU-frequ.patch @@ -56,10 +56,10 @@ index 4a29f0e776e2..69a2d483b2cd 100644 if (!ret) diff --git a/kernel-module-imx-gpu-viv-src/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6q14.c b/kernel-module-imx-gpu-viv-src/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6q14.c -index a12579d44723..c2a54b7d072d 100644 +index a5473bb926a2..d08479fa43b7 100644 --- a/kernel-module-imx-gpu-viv-src/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6q14.c +++ b/kernel-module-imx-gpu-viv-src/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6q14.c -@@ -103,7 +103,7 @@ extern int unregister_thermal_notifier(struct notifier_block *nb); +@@ -108,7 +108,7 @@ extern int unregister_thermal_notifier(struct notifier_block *nb); #define UNREG_THERMAL_NOTIFIER(a) unregister_thermal_notifier(a); #endif diff --git a/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-imx-gpu-viv/0002-Use-busfreq-imx6.h-up-to-3.15-kernel.patch b/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-imx-gpu-viv/0002-Use-busfreq-imx6.h-up-to-3.15-kernel.patch index 19fb57e55..3b7ad712d 100644 --- a/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-imx-gpu-viv/0002-Use-busfreq-imx6.h-up-to-3.15-kernel.patch +++ b/meta-digi-arm/recipes-kernel/kernel-modules/kernel-module-imx-gpu-viv/0002-Use-busfreq-imx6.h-up-to-3.15-kernel.patch @@ -1,4 +1,3 @@ -From 07ca37302306e764adaeaa8f2a8e4ef1b40cd395 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Tue, 1 Dec 2015 11:36:24 +0100 Subject: [PATCH] Use busfreq-imx6.h up to 3.15 kernel @@ -13,7 +12,7 @@ Signed-off-by: Hector Palacios 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel-module-imx-gpu-viv-src/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6q14.c b/kernel-module-imx-gpu-viv-src/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6q14.c -index a12579d44723..8f7bb281aa74 100644 +index d08479fa43b7..4a9b72ce2297 100644 --- a/kernel-module-imx-gpu-viv-src/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6q14.c +++ b/kernel-module-imx-gpu-viv-src/hal/os/linux/kernel/platform/freescale/gc_hal_kernel_platform_imx6q14.c @@ -74,7 +74,7 @@ From 6ec562b6016a02e261019dbd53b521b0edb2e727 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 7 Jul 2016 17:57:55 +0200 Subject: [PATCH 076/117] linux: enable rootfs encryption options in kernel config https://jira.digi.com/browse/DEL-2278 Signed-off-by: Javier Viguera --- .../recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig b/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig index a8515423c..82d459cc4 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig @@ -101,6 +101,9 @@ CONFIG_ATA=y CONFIG_SATA_AHCI_PLATFORM=y CONFIG_AHCI_IMX=y CONFIG_PATA_IMX=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y CONFIG_NETDEVICES=y # CONFIG_NET_CADENCE is not set # CONFIG_NET_VENDOR_BROADCOM is not set @@ -299,8 +302,11 @@ CONFIG_DEBUG_FS=y CONFIG_SECURITYFS=y # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set CONFIG_CRYPTO_TEST=m +CONFIG_CRYPTO_XTS=y CONFIG_CRYPTO_DEFLATE=y CONFIG_CRYPTO_LZO=y # CONFIG_CRYPTO_ANSI_CPRNG is not set +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_DEV_FSL_CAAM=y CONFIG_FONTS=y From f80c531fb8f3c1e2b36f228c7e0f437b0b809f27 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 7 Jul 2016 17:58:25 +0200 Subject: [PATCH 077/117] lvm2: split libraries to a different package lvm2 package provides some user-space tools, but also some dynamic libraries: libdevmapper, libdevmapper-event, etc. This commit allows to package the LVM2 libraries in a different package than the LVM2 user-space tools. This way other user-space tools (e.g. cryptsetup) that runtime depends on the LVM2 libs can only add that libs package to the rootfs, instead of the whole LVM2 utilities. Signed-off-by: Javier Viguera --- meta-digi-dey/recipes-support/lvm2/lvm2_%.bbappend | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 meta-digi-dey/recipes-support/lvm2/lvm2_%.bbappend diff --git a/meta-digi-dey/recipes-support/lvm2/lvm2_%.bbappend b/meta-digi-dey/recipes-support/lvm2/lvm2_%.bbappend new file mode 100644 index 000000000..a467c444f --- /dev/null +++ b/meta-digi-dey/recipes-support/lvm2/lvm2_%.bbappend @@ -0,0 +1,6 @@ +# Copyright (C) 2016 Digi International. + +# Split libraries into a different package +PACKAGES =+ "lib${PN}" + +FILES_lib${PN} = "${libdir}/lib*.so.*" From 778aade6969c5f177fe07b1ea34174ff78f39511 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 7 Jul 2016 17:58:55 +0200 Subject: [PATCH 078/117] meta-digi-dey: new recipe for trustfence-tool binary package https://jira.digi.com/browse/DEL-2278 Signed-off-by: Javier Viguera --- .../recipes-core/trustfence/trustfence-tool_1.0.bb | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 meta-digi-dey/recipes-core/trustfence/trustfence-tool_1.0.bb diff --git a/meta-digi-dey/recipes-core/trustfence/trustfence-tool_1.0.bb b/meta-digi-dey/recipes-core/trustfence/trustfence-tool_1.0.bb new file mode 100644 index 000000000..468bb3ca6 --- /dev/null +++ b/meta-digi-dey/recipes-core/trustfence/trustfence-tool_1.0.bb @@ -0,0 +1,12 @@ +# Copyright (C) 2016 Digi International. + +SUMMARY = "Trustfence command line tool" +SECTION = "console/tools" +LICENSE = "CLOSED" + +SRC_URI = "${DIGI_PKG_SRC}/${BP}.tar.gz" + +SRC_URI[md5sum] = "aa9b8b530402f412886e1f8f1da466e6" +SRC_URI[sha256sum] = "dbeb718158a4a55552bb3a2c03990df3167331bb772925f824ebc02348e29089" + +inherit bin_package From 4dd7d438af8c85837503780390751240567d30be Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 7 Jul 2016 17:59:25 +0200 Subject: [PATCH 079/117] meta-digi-dey: new Trustfence initramfs package This package adds some files needed by the trustfence initramfs and that are not included in other packages. https://jira.digi.com/browse/DEL-2278 Signed-off-by: Javier Viguera --- .../trustfence/trustfence-initramfs.bb | 28 +++++++ .../trustfence-initramfs-init | 74 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb create mode 100644 meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init diff --git a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb new file mode 100644 index 000000000..dfe67b5a9 --- /dev/null +++ b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs.bb @@ -0,0 +1,28 @@ +# Copyright (C) 2016 Digi International. + +SUMMARY = "Trustfence initramfs required files" +LICENSE = "GPL-2.0" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI = "file://trustfence-initramfs-init" + +S = "${WORKDIR}" + +do_install() { + install -d ${D}${sbindir} + install -m 0755 trustfence-initramfs-init ${D}/init +} + +# Do not create debug/devel packages +PACKAGES = "${PN}" + +FILES_${PN} = "/" + +# Runtime packages used in 'trustfence-initramfs-init' +RDEPENDS_${PN} = " \ + cryptsetup \ + rng-tools \ + trustfence-tool \ + util-linux-findfs \ + wipe \ +" diff --git a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init new file mode 100644 index 000000000..8accf80df --- /dev/null +++ b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init @@ -0,0 +1,74 @@ +#!/bin/sh +#=============================================================================== +# +# trustfence-initramfs-init +# +# Copyright (C) 2016 by Digi International Inc. +# All rights reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# +# !Description: Init script for Trustfence initramfs +# +#=============================================================================== + +export PATH=/bin:/sbin:/usr/bin:/usr/sbin + +mkdir -p /proc /sys /dev +mount -t proc proc /proc +mount -t sysfs sysfs /sys +mount -t devtmpfs devtmpfs /dev + +# Set kernel console loglevel +LOGLEVEL="$(sysctl -n kernel.printk)" +sysctl -q -w kernel.printk=4 + +# Launch 'rngd' to feed random data to kernel entropy pool +mkdir -p /var/run && rngd + +for arg in $(cat /proc/cmdline); do + case "${arg}" in + init=*|rescue=1|root=*) eval ${arg};; + esac +done + +# Jump to a rescue shell if requested +if [ -n "${rescue}" ]; then + # Expand console and respawn if exited + while true; do + setsid cttyhack sh -l + sleep 1 + done +fi + +# Translate "PARTUUID=..." to real device +root="$(findfs ${root})" + +# Open LUKS encrypted device +TMP_KEYFILE="$(mktemp keyfile.XXXXXX)" +trustfence-tool -f ${TMP_KEYFILE} +if cryptsetup --key-file ${TMP_KEYFILE} open --type luks ${root} cryptroot; then + # Reset root variable to the decrypted mapped device + root="/dev/mapper/cryptroot" +fi +wipe -cfs ${TMP_KEYFILE} + +# Mount mapped device +mkdir -p /newroot +mount ${root} /newroot + +# +# Clean-up and do the switch_root to the final rootfs +# +# - explicit kill 'rngd' daemon so it doesn't leak to the final rootfs +# - restore previous kernel console loglevel +# - umount virtual filesystems +# +pkill -9 rngd +[ -n "${LOGLEVEL}" ] && sysctl -q -w kernel.printk="${LOGLEVEL}" +mount --move /dev /newroot/dev +umount /sys /proc +exec switch_root /newroot ${init:-/sbin/init} From 7a38d609f28374c219da4d2e490a85aeb88d7e73 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 7 Jul 2016 17:59:55 +0200 Subject: [PATCH 080/117] meta-digi-dey: new Trustfence initramfs image recipe This recipe builds the initramfs image that is used to boot from an encrypted rootfs. https://jira.digi.com/browse/DEL-2278 Signed-off-by: Javier Viguera --- .../images/dey-image-trustfence-initramfs.bb | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 meta-digi-dey/recipes-core/images/dey-image-trustfence-initramfs.bb diff --git a/meta-digi-dey/recipes-core/images/dey-image-trustfence-initramfs.bb b/meta-digi-dey/recipes-core/images/dey-image-trustfence-initramfs.bb new file mode 100644 index 000000000..f5923ce55 --- /dev/null +++ b/meta-digi-dey/recipes-core/images/dey-image-trustfence-initramfs.bb @@ -0,0 +1,25 @@ +DESCRIPTION = "Trustfence initramfs image" +LICENSE = "MIT" + +PACKAGE_INSTALL = " \ + busybox \ + pv \ + trustfence-initramfs \ +" + +# Do not pollute the initrd image with rootfs features +IMAGE_FEATURES = "" +IMAGE_LINGUAS = "" + +IMAGE_FSTYPES = "cpio.gz.u-boot" +inherit core-image image_types_uboot + +IMAGE_ROOTFS_SIZE = "8192" + +# Remove some packages added via recommendations +BAD_RECOMMENDATIONS += " \ + busybox-syslog \ + openssl-conf \ +" + +export IMAGE_BASENAME = "dey-image-trustfence-initramfs" From 6f8c58291e0df5c5a6844e4df7396904603fffc9 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 7 Jul 2016 18:00:25 +0200 Subject: [PATCH 081/117] meta-digi: add support for Trustfence secure rootfs When Trustfence is enabled, this adds a dependence on the TF initramfs, so it's built and added to the boot image. It also modifies the u-boot boot script on the fly, to boot correctly using the Trustfence initramfs. https://jira.digi.com/browse/DEL-2278 Signed-off-by: Javier Viguera --- meta-digi-arm/classes/image_types_digi.bbclass | 11 +++++++++++ .../recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 13 +++++++++++-- meta-digi-dey/classes/trustfence.bbclass | 3 +++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/meta-digi-arm/classes/image_types_digi.bbclass b/meta-digi-arm/classes/image_types_digi.bbclass index 7293bb003..e2946ea7a 100644 --- a/meta-digi-arm/classes/image_types_digi.bbclass +++ b/meta-digi-arm/classes/image_types_digi.bbclass @@ -1,10 +1,15 @@ inherit image_types +def TRUSTFENCE_BOOTIMAGE_DEPENDS(d): + tf_initramfs = d.getVar('TRUSTFENCE_INITRAMFS_IMAGE',True) or "" + return "%s:do_rootfs" % tf_initramfs if tf_initramfs else "" + IMAGE_DEPENDS_boot.vfat = " \ dosfstools-native:do_populate_sysroot \ mtools-native:do_populate_sysroot \ u-boot:do_deploy \ virtual/kernel:do_deploy \ + ${@TRUSTFENCE_BOOTIMAGE_DEPENDS(d)} \ " IMAGE_CMD_boot.vfat() { @@ -22,6 +27,12 @@ IMAGE_CMD_boot.vfat() { done fi + # Add Trustfence initramfs if enabled + if [ -n "${TRUSTFENCE_INITRAMFS_IMAGE}" ]; then + BOOTIMG_FILES="${BOOTIMG_FILES} $(readlink -e ${DEPLOY_DIR_IMAGE}/${TRUSTFENCE_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz.u-boot)" + BOOTIMG_FILES_SYMLINK="${BOOTIMG_FILES_SYMLINK} ${DEPLOY_DIR_IMAGE}/${TRUSTFENCE_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz.u-boot" + fi + # Size of kernel and device tree + 10% extra space (in bytes) BOOTIMG_FILES_SIZE="$(expr $(du -bc ${BOOTIMG_FILES} | tail -n1 | cut -f1) \* \( 100 + 10 \) / 100)" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index eeaeba1ef..61246088c 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -141,8 +141,17 @@ do_deploy_append() { sed -i -e 's,##GRAPHICAL_BACKEND##,${GRAPHICAL_BACKEND},g' ${WORKDIR}/install_linux_fw_sd.txt mkimage -T script -n "DEY firmware install script" -C none -d ${WORKDIR}/install_linux_fw_sd.txt ${DEPLOYDIR}/install_linux_fw_sd.scr - # Boot script for DEY images - mkimage -T script -n bootscript -C none -d ${WORKDIR}/boot.txt ${DEPLOYDIR}/boot.scr + # Boot script for DEY images (reconfigure on-the-fly if TRUSTFENCE is enabled) + TMP_BOOTSCR="$(mktemp ${WORKDIR}/bootscr.XXXXXX)" + cat ${WORKDIR}/boot.txt > ${TMP_BOOTSCR} + if [ -n "${TRUSTFENCE_INITRAMFS_IMAGE}" ]; then + sed -i -e '/^dboot linux/{ + i\setenv boot_initrd true + i\setenv initrd_file ${TRUSTFENCE_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz.u-boot + }' ${TMP_BOOTSCR} + fi + mkimage -T script -n bootscript -C none -d ${TMP_BOOTSCR} ${DEPLOYDIR}/boot.scr + rm -f ${TMP_BOOTSCR} } COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul)" diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index e5363006c..1844a3fea 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -24,6 +24,9 @@ TRUSTFENCE_UBOOT_SIGN ?= "1" TRUSTFENCE_UBOOT_ENCRYPT ?= "1" TRUSTFENCE_UBOOT_ENV_DEK ?= "gen_random" +# Trustfence initramfs image recipe +TRUSTFENCE_INITRAMFS_IMAGE ?= "dey-image-trustfence-initramfs" + IMAGE_FEATURES += "dey-trustfence" UBOOT_EXTRA_CONF = "" From 7b9cabe389ba7151b1138ebda0b2c5c970c96f6c Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Fri, 8 Jul 2016 14:55:04 +0200 Subject: [PATCH 082/117] packagegroup-dey-qt: restrict qtwebengine to ccimx6sbc qtwebengine does not support armv5 platforms (for example ccardimx28js), so we need to restrict that package to the ccimx6sbc Signed-off-by: Javier Viguera --- .../recipes-graphics/packagegroups/packagegroup-dey-qt.bb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-qt.bb b/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-qt.bb index 2bdc3fcdf..4e5e94a34 100644 --- a/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-qt.bb +++ b/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-qt.bb @@ -8,6 +8,9 @@ PACKAGE_ARCH = "${MACHINE_ARCH}" inherit packagegroup +MACHINE_QT5_EXTRA_INSTALL ?= "" +MACHINE_QT5_EXTRA_INSTALL_ccimx6 ?= "qtwebengine-examples" + QT5_PKS = " \ qtbase-fonts \ qtdeclarative-tools \ @@ -20,7 +23,6 @@ QT5_EXAMPLES = " \ qtdeclarative-examples \ qtmultimedia-examples \ qtsvg-examples \ - qtwebengine-examples \ " QT5_DEMOS = " \ @@ -34,4 +36,5 @@ RDEPENDS_${PN} += " \ ${QT5_PKS} \ ${QT5_DEMOS} \ ${QT5_EXAMPLES} \ + ${MACHINE_QT5_EXTRA_INSTALL} \ " From c90aaaaadd76bb3f916e887489806d6ade520e8e Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Mon, 11 Jul 2016 12:19:42 +0200 Subject: [PATCH 083/117] ccimx6ulstarter: update conf-notes.txt for core-image-base support Signed-off-by: Isaac Hermida --- sdk/config/ccimx6ulstarter/conf-notes.txt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/sdk/config/ccimx6ulstarter/conf-notes.txt b/sdk/config/ccimx6ulstarter/conf-notes.txt index d8fa34f70..6756fcb41 100644 --- a/sdk/config/ccimx6ulstarter/conf-notes.txt +++ b/sdk/config/ccimx6ulstarter/conf-notes.txt @@ -1,12 +1,6 @@ Digi Embedded Yocto provides the following image recipes: - * dey-image-qt: graphical QT image - - By default the image is X11-based so it provides a full SATO theme - desktop environment. - - To compile the image for the framebuffer (instead of X11) add the - following line to the project's conf/local.conf: - - DISTRO_FEATURES_remove = "x11" + * core-image-base: A console-only image. + Expansion of native core-image-base by including all the support for the + target device hardware like firmware files, rootfs customizations, etc. From 6e76f9f7e484b2599745a454fe1cefdb7d07b0b8 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Mon, 11 Jul 2016 11:49:09 +0200 Subject: [PATCH 084/117] bluez5: include hcitool patches (increase "conn" limit and "refresh" typo) Add a couple of bluez patches: one for increasing the number of connection showed with "hcitool con" command and remove "refresh" option in hcitool help that is not supported. The qca6564 chip can support more than 10 simultaneous BLE connections. https://jira.digi.com/browse/DEL-2735 Signed-off-by: Isaac Hermida --- ...-not-show-unsupported-refresh-option.patch | 22 +++++++ ...ase-the-shown-connection-limit-to-20.patch | 57 +++++++++++++++++++ .../bluez/bluez5_5.33.bbappend | 6 +- 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/0021-hcitool-do-not-show-unsupported-refresh-option.patch create mode 100644 meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/0022-hcitool-increase-the-shown-connection-limit-to-20.patch diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/0021-hcitool-do-not-show-unsupported-refresh-option.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/0021-hcitool-do-not-show-unsupported-refresh-option.patch new file mode 100644 index 000000000..0d0375dad --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/0021-hcitool-do-not-show-unsupported-refresh-option.patch @@ -0,0 +1,22 @@ +From: Isaac Hermida +Date: Fri, 8 Jul 2016 12:19:33 +0200 +Subject: [PATCH] hcitool: do not show unsupported refresh option + +Signed-off-by: Isaac Hermida +--- + tools/hcitool.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tools/hcitool.c b/tools/hcitool.c +index 02c4ebe1b71b..229c22c49909 100644 +--- a/tools/hcitool.c ++++ b/tools/hcitool.c +@@ -568,7 +568,7 @@ static struct option scan_options[] = { + + static const char *scan_help = + "Usage:\n" +- "\tscan [--length=N] [--numrsp=N] [--iac=lap] [--flush] [--class] [--info] [--oui] [--refresh]\n"; ++ "\tscan [--length=N] [--numrsp=N] [--iac=lap] [--flush] [--class] [--info] [--oui]\n"; + + static void cmd_scan(int dev_id, int argc, char **argv) + { diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/0022-hcitool-increase-the-shown-connection-limit-to-20.patch b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/0022-hcitool-increase-the-shown-connection-limit-to-20.patch new file mode 100644 index 000000000..fd81a1960 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-5.33/0022-hcitool-increase-the-shown-connection-limit-to-20.patch @@ -0,0 +1,57 @@ +From: Isaac Hermida +Date: Fri, 8 Jul 2016 10:42:57 +0200 +Subject: [PATCH] hcitool: increase the shown connection limit to 20 + +Created a variable to set the number of connections to shown and increase that +value so we can list more current LE connections. + +https://jira.digi.com/browse/DEL-2735 + +Signed-off-by: Isaac Hermida +--- + tools/hcitool.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/tools/hcitool.c b/tools/hcitool.c +index 229c22c49909..ae70c9c0d3b4 100644 +--- a/tools/hcitool.c ++++ b/tools/hcitool.c +@@ -69,6 +69,8 @@ + #define EIR_TX_POWER 0x0A /* transmit power level */ + #define EIR_DEVICE_ID 0x10 /* device ID */ + ++#define MAX_CONNECTIONS_SHOWN 20 /* Max number of "hcitool conn" items to shown */ ++ + #define for_each_opt(opt, long, short) while ((opt=getopt_long(argc, argv, short ? short:"+", long, NULL)) != -1) + + static volatile int signal_received = 0; +@@ -156,12 +158,12 @@ static int conn_list(int s, int dev_id, long arg) + if (id != -1 && dev_id != id) + return 0; + +- if (!(cl = malloc(10 * sizeof(*ci) + sizeof(*cl)))) { ++ if (!(cl = malloc(MAX_CONNECTIONS_SHOWN * sizeof(*ci) + sizeof(*cl)))) { + perror("Can't allocate memory"); + exit(1); + } + cl->dev_id = dev_id; +- cl->conn_num = 10; ++ cl->conn_num = MAX_CONNECTIONS_SHOWN; + ci = cl->conn_info; + + if (ioctl(s, HCIGETCONNLIST, (void *) cl)) { +@@ -190,12 +192,12 @@ static int find_conn(int s, int dev_id, long arg) + struct hci_conn_info *ci; + int i; + +- if (!(cl = malloc(10 * sizeof(*ci) + sizeof(*cl)))) { ++ if (!(cl = malloc(MAX_CONNECTIONS_SHOWN * sizeof(*ci) + sizeof(*cl)))) { + perror("Can't allocate memory"); + exit(1); + } + cl->dev_id = dev_id; +- cl->conn_num = 10; ++ cl->conn_num = MAX_CONNECTIONS_SHOWN; + ci = cl->conn_info; + + if (ioctl(s, HCIGETCONNLIST, (void *) cl)) { diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.33.bbappend b/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.33.bbappend index 559688781..ea0c71714 100644 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.33.bbappend +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5_5.33.bbappend @@ -2,7 +2,11 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/${BP}:" -SRC_URI += "file://bluez-init" +SRC_URI += " \ + file://bluez-init \ + file://0021-hcitool-do-not-show-unsupported-refresh-option.patch \ + file://0022-hcitool-increase-the-shown-connection-limit-to-20.patch \ +" SRC_URI_append_ccimx6ul = " \ file://0001-bluetooth-Add-bluetooth-support-for-QCA6174-chip.patch \ From e22244eddec68d09f61d210f81fae53ef2912df1 Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 21 Jun 2016 17:05:54 +0200 Subject: [PATCH 085/117] meta-digi-arm: Add u-boot.inc from poky's meta layer. Moving this file into meta-digi should be temporary until a patch is upstreamed. Signed-off-by: Alex Gonzalez --- meta-digi-arm/recipes-bsp/u-boot/u-boot.inc | 290 ++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot.inc diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot.inc b/meta-digi-arm/recipes-bsp/u-boot/u-boot.inc new file mode 100644 index 000000000..2d417ac0c --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot.inc @@ -0,0 +1,290 @@ +SUMMARY = "Universal Boot Loader for embedded devices" +HOMEPAGE = "http://www.denx.de/wiki/U-Boot/WebHome" +SECTION = "bootloaders" +PROVIDES = "virtual/bootloader" + +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://Licenses/README;md5=0507cd7da8e7ad6d6701926ec9b84c95" + +SRC_URI = "git://git.denx.de/u-boot.git;branch=master" + +S = "${WORKDIR}/git" + +PACKAGE_ARCH = "${MACHINE_ARCH}" + +inherit uboot-config deploy + +EXTRA_OEMAKE = 'CROSS_COMPILE=${TARGET_PREFIX} CC="${TARGET_PREFIX}gcc ${TOOLCHAIN_OPTIONS}" V=1' +EXTRA_OEMAKE += 'HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}"' + +PACKAGECONFIG ??= "openssl" +# u-boot will compile its own tools during the build, with specific +# configurations (aka when CONFIG_FIT_SIGNATURE is enabled) openssl is needed as +# a host build dependency. +PACKAGECONFIG[openssl] = ",,openssl-native" + +# Allow setting an additional version string that will be picked up by the +# u-boot build system and appended to the u-boot version. If the .scmversion +# file already exists it will not be overwritten. +UBOOT_LOCALVERSION ?= "" + +# Some versions of u-boot use .bin and others use .img. By default use .bin +# but enable individual recipes to change this value. +UBOOT_SUFFIX ??= "bin" +UBOOT_IMAGE ?= "u-boot-${MACHINE}-${PV}-${PR}.${UBOOT_SUFFIX}" +UBOOT_BINARY ?= "u-boot.${UBOOT_SUFFIX}" +UBOOT_SYMLINK ?= "u-boot-${MACHINE}.${UBOOT_SUFFIX}" +UBOOT_MAKE_TARGET ?= "all" + +# Output the ELF generated. Some platforms can use the ELF file and directly +# load it (JTAG booting, QEMU) additionally the ELF can be used for debugging +# purposes. +UBOOT_ELF ?= "" +UBOOT_ELF_SUFFIX ?= "elf" +UBOOT_ELF_IMAGE ?= "u-boot-${MACHINE}-${PV}-${PR}.${UBOOT_ELF_SUFFIX}" +UBOOT_ELF_BINARY ?= "u-boot.${UBOOT_ELF_SUFFIX}" +UBOOT_ELF_SYMLINK ?= "u-boot-${MACHINE}.${UBOOT_ELF_SUFFIX}" + +# Some versions of u-boot build an SPL (Second Program Loader) image that +# should be packaged along with the u-boot binary as well as placed in the +# deploy directory. For those versions they can set the following variables +# to allow packaging the SPL. +SPL_BINARY ?= "" +SPL_IMAGE ?= "${SPL_BINARY}-${MACHINE}-${PV}-${PR}" +SPL_SYMLINK ?= "${SPL_BINARY}-${MACHINE}" + +# Additional environment variables or a script can be installed alongside +# u-boot to be used automatically on boot. This file, typically 'uEnv.txt' +# or 'boot.scr', should be packaged along with u-boot as well as placed in the +# deploy directory. Machine configurations needing one of these files should +# include it in the SRC_URI and set the UBOOT_ENV parameter. +UBOOT_ENV_SUFFIX ?= "txt" +UBOOT_ENV ?= "" +UBOOT_ENV_BINARY ?= "${UBOOT_ENV}.${UBOOT_ENV_SUFFIX}" +UBOOT_ENV_IMAGE ?= "${UBOOT_ENV}-${MACHINE}-${PV}-${PR}.${UBOOT_ENV_SUFFIX}" +UBOOT_ENV_SYMLINK ?= "${UBOOT_ENV}-${MACHINE}.${UBOOT_ENV_SUFFIX}" + +do_compile () { + if [ "${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-gold', 'ld-is-gold', '', d)}" = "ld-is-gold" ] ; then + sed -i 's/$(CROSS_COMPILE)ld$/$(CROSS_COMPILE)ld.bfd/g' config.mk + fi + + unset LDFLAGS + unset CFLAGS + unset CPPFLAGS + + if [ ! -e ${B}/.scmversion -a ! -e ${S}/.scmversion ] + then + echo ${UBOOT_LOCALVERSION} > ${B}/.scmversion + echo ${UBOOT_LOCALVERSION} > ${S}/.scmversion + fi + + if [ "x${UBOOT_CONFIG}" != "x" ] + then + for config in ${UBOOT_MACHINE}; do + i=`expr $i + 1`; + for type in ${UBOOT_CONFIG}; do + j=`expr $j + 1`; + if [ $j -eq $i ] + then + oe_runmake O=${config} ${config} + oe_runmake O=${config} ${UBOOT_MAKE_TARGET} + cp ${S}/${config}/${UBOOT_BINARY} ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} + fi + done + unset j + done + unset i + else + oe_runmake ${UBOOT_MACHINE} + oe_runmake ${UBOOT_MAKE_TARGET} + fi + +} + +do_install () { + if [ "x${UBOOT_CONFIG}" != "x" ] + then + for config in ${UBOOT_MACHINE}; do + i=`expr $i + 1`; + for type in ${UBOOT_CONFIG}; do + j=`expr $j + 1`; + if [ $j -eq $i ] + then + install -d ${D}/boot + install ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} ${D}/boot/u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${D}/boot/${UBOOT_BINARY}-${type} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${D}/boot/${UBOOT_BINARY} + fi + done + unset j + done + unset i + else + install -d ${D}/boot + install ${S}/${UBOOT_BINARY} ${D}/boot/${UBOOT_IMAGE} + ln -sf ${UBOOT_IMAGE} ${D}/boot/${UBOOT_BINARY} + fi + + if [ "x${UBOOT_ELF}" != "x" ] + then + if [ "x${UBOOT_CONFIG}" != "x" ] + then + for config in ${UBOOT_MACHINE}; do + i=`expr $i + 1`; + for type in ${UBOOT_CONFIG}; do + j=`expr $j + 1`; + if [ $j -eq $i ] + then + install ${S}/${config}/${UBOOT_ELF} ${D}/boot/u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${D}/boot/${UBOOT_BINARY}-${type} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${D}/boot/${UBOOT_BINARY} + fi + done + unset j + done + unset i + else + install ${S}/${UBOOT_ELF} ${D}/boot/${UBOOT_ELF_IMAGE} + ln -sf ${UBOOT_ELF_IMAGE} ${D}/boot/${UBOOT_ELF_BINARY} + fi + fi + + if [ -e ${WORKDIR}/fw_env.config ] ; then + install -d ${D}${sysconfdir} + install -m 644 ${WORKDIR}/fw_env.config ${D}${sysconfdir}/fw_env.config + fi + + if [ "x${SPL_BINARY}" != "x" ] + then + if [ "x${UBOOT_CONFIG}" != "x" ] + then + for config in ${UBOOT_MACHINE}; do + i=`expr $i + 1`; + for type in ${UBOOT_CONFIG}; do + j=`expr $j + 1`; + if [ $j -eq $i ] + then + install ${S}/${config}/${SPL_BINARY} ${D}/boot/${SPL_IMAGE}-${type}-${PV}-${PR} + ln -sf ${SPL_IMAGE}-${type}-${PV}-${PR} ${D}/boot/${SPL_BINARY}-${type} + ln -sf ${SPL_IMAGE}-${type}-${PV}-${PR} ${D}/boot/${SPL_BINARY} + fi + done + unset j + done + unset i + else + install ${S}/${SPL_BINARY} ${D}/boot/${SPL_IMAGE} + ln -sf ${SPL_IMAGE} ${D}/boot/${SPL_BINARY} + fi + fi + + if [ "x${UBOOT_ENV}" != "x" ] + then + install ${WORKDIR}/${UBOOT_ENV_BINARY} ${D}/boot/${UBOOT_ENV_IMAGE} + ln -sf ${UBOOT_ENV_IMAGE} ${D}/boot/${UBOOT_ENV_BINARY} + fi +} + +FILES_${PN} = "/boot ${sysconfdir}" +# Ensure the split debug part of any elf files are put into dbg +FILES_${PN}-dbg += "/boot/.debug" + +do_deploy () { + if [ "x${UBOOT_CONFIG}" != "x" ] + then + for config in ${UBOOT_MACHINE}; do + i=`expr $i + 1`; + for type in ${UBOOT_CONFIG}; do + j=`expr $j + 1`; + if [ $j -eq $i ] + then + install -d ${DEPLOYDIR} + install ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} ${DEPLOYDIR}/u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + cd ${DEPLOYDIR} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${UBOOT_SYMLINK}-${type} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${UBOOT_SYMLINK} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${UBOOT_BINARY}-${type} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${UBOOT_BINARY} + fi + done + unset j + done + unset i + else + install -d ${DEPLOYDIR} + install ${S}/${UBOOT_BINARY} ${DEPLOYDIR}/${UBOOT_IMAGE} + cd ${DEPLOYDIR} + rm -f ${UBOOT_BINARY} ${UBOOT_SYMLINK} + ln -sf ${UBOOT_IMAGE} ${UBOOT_SYMLINK} + ln -sf ${UBOOT_IMAGE} ${UBOOT_BINARY} + fi + + if [ "x${UBOOT_ELF}" != "x" ] + then + if [ "x${UBOOT_CONFIG}" != "x" ] + then + for config in ${UBOOT_MACHINE}; do + i=`expr $i + 1`; + for type in ${UBOOT_CONFIG}; do + j=`expr $j + 1`; + if [ $j -eq $i ] + then + install ${S}/${config}/${UBOOT_ELF} ${DEPLOYDIR}/u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${DEPLOYDIR}/${UBOOT_ELF_BINARY}-${type} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${DEPLOYDIR}/${UBOOT_ELF_BINARY} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${DEPLOYDIR}/${UBOOT_ELF_SYMLINK}-${type} + ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${DEPLOYDIR}/${UBOOT_ELF_SYMLINK} + fi + done + unset j + done + unset i + else + install ${S}/${UBOOT_ELF} ${DEPLOYDIR}/${UBOOT_ELF_IMAGE} + ln -sf ${UBOOT_ELF_IMAGE} ${DEPLOYDIR}/${UBOOT_ELF_BINARY} + ln -sf ${UBOOT_ELF_IMAGE} ${DEPLOYDIR}/${UBOOT_ELF_SYMLINK} + fi + fi + + + if [ "x${SPL_BINARY}" != "x" ] + then + if [ "x${UBOOT_CONFIG}" != "x" ] + then + for config in ${UBOOT_MACHINE}; do + i=`expr $i + 1`; + for type in ${UBOOT_CONFIG}; do + j=`expr $j + 1`; + if [ $j -eq $i ] + then + install ${S}/${config}/${SPL_BINARY} ${DEPLOYDIR}/${SPL_IMAGE}-${type}-${PV}-${PR} + rm -f ${DEPLOYDIR}/${SPL_BINARY} ${DEPLOYDIR}/${SPL_SYMLINK}-${type} + ln -sf ${SPL_IMAGE}-${type}-${PV}-${PR} ${DEPLOYDIR}/${SPL_BINARY}-${type} + ln -sf ${SPL_IMAGE}-${type}-${PV}-${PR} ${DEPLOYDIR}/${SPL_BINARY} + ln -sf ${SPL_IMAGE}-${type}-${PV}-${PR} ${DEPLOYDIR}/${SPL_SYMLINK}-${type} + ln -sf ${SPL_IMAGE}-${type}-${PV}-${PR} ${DEPLOYDIR}/${SPL_SYMLINK} + fi + done + unset j + done + unset i + else + install ${S}/${SPL_BINARY} ${DEPLOYDIR}/${SPL_IMAGE} + rm -f ${DEPLOYDIR}/${SPL_BINARY} ${DEPLOYDIR}/${SPL_SYMLINK} + ln -sf ${SPL_IMAGE} ${DEPLOYDIR}/${SPL_BINARY} + ln -sf ${SPL_IMAGE} ${DEPLOYDIR}/${SPL_SYMLINK} + fi + fi + + + if [ "x${UBOOT_ENV}" != "x" ] + then + install ${WORKDIR}/${UBOOT_ENV_BINARY} ${DEPLOYDIR}/${UBOOT_ENV_IMAGE} + rm -f ${DEPLOYDIR}/${UBOOT_ENV_BINARY} ${DEPLOYDIR}/${UBOOT_ENV_SYMLINK} + ln -sf ${UBOOT_ENV_IMAGE} ${DEPLOYDIR}/${UBOOT_ENV_BINARY} + ln -sf ${UBOOT_ENV_IMAGE} ${DEPLOYDIR}/${UBOOT_ENV_SYMLINK} + fi +} + +addtask deploy before do_build after do_compile From c43c9897ad3dbc14a88319965dc06d9ff758d1c2 Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 21 Jun 2016 17:14:02 +0200 Subject: [PATCH 086/117] meta-digi-arm: u-boot.inc: Do not override defconfig targets on multiple u-boot builds. When building multiple u-boots they get compiled externally into a directory named after machine defconfigs. Once there is a directory with the same name as a defconfig it is not possible to run the defconfig make target. This change should be only temporary until it gets upstream. Fixes https://jira.digi.com/browse/DEL-2644 Signed-off-by: Alex Gonzalez --- meta-digi-arm/recipes-bsp/u-boot/u-boot.inc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot.inc b/meta-digi-arm/recipes-bsp/u-boot/u-boot.inc index 2d417ac0c..544c8a2e0 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot.inc +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot.inc @@ -87,9 +87,9 @@ do_compile () { j=`expr $j + 1`; if [ $j -eq $i ] then - oe_runmake O=${config} ${config} - oe_runmake O=${config} ${UBOOT_MAKE_TARGET} - cp ${S}/${config}/${UBOOT_BINARY} ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} + oe_runmake O=build_${config} ${config} + oe_runmake O=build_${config} ${UBOOT_MAKE_TARGET} + cp ${S}/build_${config}/${UBOOT_BINARY} ${S}/buidl_${config}/u-boot-${type}.${UBOOT_SUFFIX} fi done unset j @@ -112,7 +112,7 @@ do_install () { if [ $j -eq $i ] then install -d ${D}/boot - install ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} ${D}/boot/u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + install ${S}/build_${config}/u-boot-${type}.${UBOOT_SUFFIX} ${D}/boot/u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${D}/boot/${UBOOT_BINARY}-${type} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${D}/boot/${UBOOT_BINARY} fi @@ -136,7 +136,7 @@ do_install () { j=`expr $j + 1`; if [ $j -eq $i ] then - install ${S}/${config}/${UBOOT_ELF} ${D}/boot/u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} + install ${S}/build_${config}/${UBOOT_ELF} ${D}/boot/u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${D}/boot/${UBOOT_BINARY}-${type} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${D}/boot/${UBOOT_BINARY} fi @@ -165,7 +165,7 @@ do_install () { j=`expr $j + 1`; if [ $j -eq $i ] then - install ${S}/${config}/${SPL_BINARY} ${D}/boot/${SPL_IMAGE}-${type}-${PV}-${PR} + install ${S}/build_${config}/${SPL_BINARY} ${D}/boot/${SPL_IMAGE}-${type}-${PV}-${PR} ln -sf ${SPL_IMAGE}-${type}-${PV}-${PR} ${D}/boot/${SPL_BINARY}-${type} ln -sf ${SPL_IMAGE}-${type}-${PV}-${PR} ${D}/boot/${SPL_BINARY} fi @@ -200,7 +200,7 @@ do_deploy () { if [ $j -eq $i ] then install -d ${DEPLOYDIR} - install ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} ${DEPLOYDIR}/u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + install ${S}/build_${config}/u-boot-${type}.${UBOOT_SUFFIX} ${DEPLOYDIR}/u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} cd ${DEPLOYDIR} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${UBOOT_SYMLINK}-${type} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${UBOOT_SYMLINK} @@ -230,7 +230,7 @@ do_deploy () { j=`expr $j + 1`; if [ $j -eq $i ] then - install ${S}/${config}/${UBOOT_ELF} ${DEPLOYDIR}/u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} + install ${S}/build_${config}/${UBOOT_ELF} ${DEPLOYDIR}/u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${DEPLOYDIR}/${UBOOT_ELF_BINARY}-${type} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${DEPLOYDIR}/${UBOOT_ELF_BINARY} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_ELF_SUFFIX} ${DEPLOYDIR}/${UBOOT_ELF_SYMLINK}-${type} @@ -258,7 +258,7 @@ do_deploy () { j=`expr $j + 1`; if [ $j -eq $i ] then - install ${S}/${config}/${SPL_BINARY} ${DEPLOYDIR}/${SPL_IMAGE}-${type}-${PV}-${PR} + install ${S}/build_${config}/${SPL_BINARY} ${DEPLOYDIR}/${SPL_IMAGE}-${type}-${PV}-${PR} rm -f ${DEPLOYDIR}/${SPL_BINARY} ${DEPLOYDIR}/${SPL_SYMLINK}-${type} ln -sf ${SPL_IMAGE}-${type}-${PV}-${PR} ${DEPLOYDIR}/${SPL_BINARY}-${type} ln -sf ${SPL_IMAGE}-${type}-${PV}-${PR} ${DEPLOYDIR}/${SPL_BINARY} From da92e2f07d478dc2c78c8536973a56bc4f7f1cc8 Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 21 Jun 2016 17:14:20 +0200 Subject: [PATCH 087/117] meta-digi-arm: u-boot: Do not override defconfig targets on multiple u-boot builds. When building multiple u-boots they get compiled externally into a directory named after machine defconfigs. Once there is a directory with the same name as a defconfig it is not possible to run the defconfig make target. Fixes https://jira.digi.com/browse/DEL-2644 Signed-off-by: Alex Gonzalez --- .../recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 61246088c..9b808d07c 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -1,6 +1,6 @@ # Copyright (C) 2012-2015 Digi International -require recipes-bsp/u-boot/u-boot.inc +require u-boot.inc DESCRIPTION = "Bootloader for Digi platforms" LICENSE = "GPLv2+" @@ -68,18 +68,18 @@ do_compile () { j=`expr $j + 1`; if [ $j -eq $i ] then - oe_runmake O=${config} ${config} + oe_runmake O=build_${config} ${config} for var in ${UBOOT_EXTRA_CONF}; do - echo "${var}" >> ${config}/.config + echo "${var}" >> build_${config}/.config done - oe_runmake O=${config} oldconfig - oe_runmake O=${config} ${UBOOT_MAKE_TARGET} - cp ${S}/${config}/${UBOOT_BINARY} ${S}/${config}/u-boot-${type}.${UBOOT_SUFFIX} + oe_runmake O=build_${config} oldconfig + oe_runmake O=build_${config} ${UBOOT_MAKE_TARGET} + cp ${S}/build_${config}/${UBOOT_BINARY} ${S}/build_${config}/u-boot-${type}.${UBOOT_SUFFIX} # Secure boot artifacts if [ "${TRUSTFENCE_UBOOT_SIGN}" = "1" ] then - cp ${S}/${config}/u-boot-signed.imx ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} + cp ${S}/build_${config}/u-boot-signed.imx ${S}/build_${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} fi fi done @@ -114,19 +114,19 @@ do_deploy_append() { ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-${type}.${UBOOT_SUFFIX} if [ "${TRUSTFENCE_UBOOT_SIGN}" = "1" ] then - install ${S}/${config}/SRK_efuses.bin SRK_efuses-${PV}-${PR}.bin + install ${S}/build_${config}/SRK_efuses.bin SRK_efuses-${PV}-${PR}.bin ln -sf SRK_efuses-${PV}-${PR}.bin SRK_efuses.bin if [ "${TRUSTFENCE_UBOOT_ENCRYPT}" = "1" ] then - install ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + install ${S}/build_${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ln -sf u-boot-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-encrypted-${type}.${UBOOT_SUFFIX} # Move the data encryption key in plain text directly to the deployment directory. # Do not leave any other copies in the machine. - mv ${S}/${config}/dek.bin ${DEPLOYDIR}/dek-${type}.bin + mv ${S}/build_${config}/dek.bin ${DEPLOYDIR}/dek-${type}.bin else - install ${S}/${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + install ${S}/build_${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ln -sf u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-signed-${type}.${UBOOT_SUFFIX} fi fi From 9585e313af2d551a6c7199b6f85a9bd5424f3e06 Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 21 Jun 2016 17:11:14 +0200 Subject: [PATCH 088/117] meta-digi-arm: u-boot-dey: Do not use external compilation unless multiple u-boots are being build. Signed-off-by: Alex Gonzalez --- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 9b808d07c..bca380c35 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -91,7 +91,7 @@ do_compile () { for var in ${UBOOT_EXTRA_CONF}; do echo "${var}" >> .config done - oe_runmake O=${config} oldconfig + oe_runmake oldconfig oe_runmake ${UBOOT_MAKE_TARGET} fi From 5bd08351509ab32e816e2ef8ad18093d0ef9f0b3 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Thu, 14 Jul 2016 17:16:42 +0200 Subject: [PATCH 089/117] Revert "meta-digi-dey: pulseaudio: add HDMI audio sink on hotplug" When module-alsa-sink is used, the audio is sometimes heard with reverb. We will go back to module-udev-detect, so the functionality introduced in the commit being reverted won't longer work. This reverts commit fca507d316ded1e3126ba6db265b7fe871550fae. https://jira.digi.com/browse/DEL-2587 Signed-off-by: Jose Diaz de Grenu de Pedro --- .../pulseaudio/pulseaudio/hdmi_hotplug.sh | 18 ------------------ .../pulseaudio/pulseaudio_%.bbappend | 16 ---------------- 2 files changed, 34 deletions(-) delete mode 100644 meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio/hdmi_hotplug.sh diff --git a/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio/hdmi_hotplug.sh b/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio/hdmi_hotplug.sh deleted file mode 100644 index 63ce0772e..000000000 --- a/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio/hdmi_hotplug.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -# -# Called from udev on HDMI plug/unplug event - -# Find HDMI card number -for card in /sys/class/sound/card*; do - if readlink ${card}/device | grep -qs hdmi; then - HDMI_CARD="${card##/sys/class/sound/card}" - fi -done - -# On HDMI plugin event, if the sink has not been loaded yet, load the -# HDMI audio sink from ALSA -if [ "${EVENT}" = "plugin" ]; then - if ! pactl list sinks | grep -qs "imx-hdmi-soc"; then - pactl load-module module-alsa-sink device=hw:${HDMI_CARD} - fi -fi diff --git a/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend b/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend index a61a17004..8c02716bc 100644 --- a/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend +++ b/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend @@ -1,18 +1,2 @@ -FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" - -SRC_URI_append_ccimx6 = " file://hdmi_hotplug.sh" - # Do not include module-udev-detect so that module-detect is used instead RDEPENDS_pulseaudio-server_remove = "pulseaudio-module-udev-detect" - -do_install_append_ccimx6() { - install -d ${D}${sysconfdir}/udev/scripts - install -m 0755 ${WORKDIR}/hdmi_hotplug.sh ${D}${sysconfdir}/udev/scripts - - cat >> ${D}${base_libdir}/udev/rules.d/90-pulseaudio.rules <<-_EOL_ - - SUBSYSTEM=="platform", KERNEL=="*hdmi_video", ACTION=="change", RUN+="/etc/udev/scripts/hdmi_hotplug.sh" - _EOL_ -} - -PACKAGE_ARCH = "${MACHINE_ARCH}" From fa853e0c2e1821a22c8f68f6a744f747544e0163 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Thu, 14 Jul 2016 17:18:58 +0200 Subject: [PATCH 090/117] Revert "pulseaudio: remove module-udev-detect" Using module-detect there are some audio reverb problems. Reverting that commit will make pulseaudio use module-udev-detect again instead, which takes longer to initialize but does not have that problem. This reverts commit e021f738ee148c4cf747751fd0051a62e65badf1. https://jira.digi.com/browse/DEL-2587 Signed-off-by: Jose Diaz de Grenu de Pedro --- .../recipes-multimedia/pulseaudio/pulseaudio_%.bbappend | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend diff --git a/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend b/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend deleted file mode 100644 index 8c02716bc..000000000 --- a/meta-digi-dey/recipes-multimedia/pulseaudio/pulseaudio_%.bbappend +++ /dev/null @@ -1,2 +0,0 @@ -# Do not include module-udev-detect so that module-detect is used instead -RDEPENDS_pulseaudio-server_remove = "pulseaudio-module-udev-detect" From 8143f6f638c2e5b1d485353a259f3330808c5669 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Fri, 15 Jul 2016 14:29:21 +0200 Subject: [PATCH 091/117] meta-digi-dey: add suspend script support to ccimx6ul https://jira.digi.com/browse/DEL-2773 Signed-off-by: Isaac Hermida --- .../busybox/busybox-1.23.2/ccimx6ul/suspend | 58 +++++++++++++++++++ .../busybox/busybox_1.23.2.bbappend | 2 + 2 files changed, 60 insertions(+) create mode 100755 meta-digi-dey/recipes-core/busybox/busybox-1.23.2/ccimx6ul/suspend diff --git a/meta-digi-dey/recipes-core/busybox/busybox-1.23.2/ccimx6ul/suspend b/meta-digi-dey/recipes-core/busybox/busybox-1.23.2/ccimx6ul/suspend new file mode 100755 index 000000000..d597339b6 --- /dev/null +++ b/meta-digi-dey/recipes-core/busybox/busybox-1.23.2/ccimx6ul/suspend @@ -0,0 +1,58 @@ +#!/bin/sh +#=============================================================================== +# +# suspend +# +# Copyright (C) 2016 by Digi International Inc. +# All rights reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# +# !Description: suspend system to RAM +# +#=============================================================================== + +scriptname="$(basename ${0})" +syspower="/sys/power/state" + +usage() { + printf "\nSuspend system to RAM memory\n" + printf "\nUsage: ${scriptname} [OPTIONS]\n + -h Show this help + \n" +} + +suspend_interfaces() { + if grep -qs '^wlan0' /var/run/ifstate; then + ifdown wlan0 && up_wlan_on_resume="1" && sleep 0.5 && rmmod wlan + fi +} + +resume_interfaces() { + if ! grep -qs '^wlan0' /var/run/ifstate; then + [ -n "${up_wlan_on_resume}" ] && modprobe wlan && sleep 0.5 && ifup wlan0 + fi +} + +while getopts "h" c; do + case "${c}" in + h) usage; exit;; + esac +done + +if [ -f "${syspower}" ]; then + # Pre-suspend actions + suspend_interfaces + + # Suspend the device + printf "mem" > ${syspower} + sleep .5 + + # Post-resume actions + resume_interfaces +else + printf "\n[ERROR] File ${syspower} not found\n\n" +fi diff --git a/meta-digi-dey/recipes-core/busybox/busybox_1.23.2.bbappend b/meta-digi-dey/recipes-core/busybox/busybox_1.23.2.bbappend index db220bd20..89ba06284 100644 --- a/meta-digi-dey/recipes-core/busybox/busybox_1.23.2.bbappend +++ b/meta-digi-dey/recipes-core/busybox/busybox_1.23.2.bbappend @@ -74,3 +74,5 @@ do_install_append() { ln -s ../if-pre-up.d/bridgeifupdown ${D}${sysconfdir}/network/if-post-down.d/bridgeifupdown fi } + +PACKAGE_ARCH = "${MACHINE_ARCH}" From 948149208ea22d7cdc0da8594facce2c023c2b29 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 14 Jul 2016 15:30:10 +0200 Subject: [PATCH 092/117] recipes-kernel: Update config file for ccimx6ul Update config file to include power management MCA support. Signed-off-by: Isaac Hermida --- .../recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig index 835b59362..60b4ce0fe 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig @@ -156,6 +156,7 @@ CONFIG_INPUT_MMA8450=y CONFIG_INPUT_MPL3115=y CONFIG_SENSOR_FXLS8471=y CONFIG_INPUT_ISL29023=y +CONFIG_INPUT_MCA_CC6UL_PWRKEY=y CONFIG_SERIO_SERPORT=m # CONFIG_LEGACY_PTYS is not set # CONFIG_DEVKMEM is not set From 728619a5bc1633cc829b3455fbb8f18ce01c9d0f Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 14 Jul 2016 17:36:11 +0200 Subject: [PATCH 093/117] meta-digi-arm: u-boot: use v2015.04 maintenance branch Use the maintenance branch for the compatible platforms (ccimx6 and ccimx6ul) Signed-off-by: Isaac Hermida --- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index bca380c35..6a46528ab 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -10,8 +10,7 @@ DEPENDS += "dtc-native u-boot-mkimage-native" PROVIDES += "u-boot" -SRCBRANCH = "v2015.04/master" -SRCBRANCH_ccimx6ul = "v2015.04/master" +SRCBRANCH = "v2015.04/maint" SRCREV = "${AUTOREV}" # Select internal or Github U-Boot repo From 213577a930647ffa6ae9bbf61c4b6751529dafdc Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Mon, 18 Jul 2016 09:57:17 +0200 Subject: [PATCH 094/117] meta-digi-dey: linux-dey-3.14: Sync ccimx6sbc defconfig with kernel's defconfig Signed-off-by: Alex Gonzalez --- .../linux/linux-dey-3.14/ccimx6sbc/defconfig | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig b/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig index 82d459cc4..97a9c5f61 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig @@ -22,6 +22,9 @@ CONFIG_SOC_IMX53=y CONFIG_SOC_IMX6Q=y CONFIG_SOC_IMX6SL=y CONFIG_SOC_IMX6SX=y +CONFIG_SOC_IMX6UL=y +CONFIG_SOC_IMX7D=y +CONFIG_SOC_VF610=y CONFIG_PCI=y CONFIG_PCI_MSI=y CONFIG_PCI_IMX6=y @@ -40,6 +43,7 @@ CONFIG_CPU_FREQ_GOV_USERSPACE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y CONFIG_ARM_IMX6Q_CPUFREQ=y +CONFIG_ARM_IMX7D_CPUFREQ=y CONFIG_CPU_IDLE=y CONFIG_VFP=y CONFIG_NEON=y @@ -73,6 +77,7 @@ CONFIG_BT_HIDP=y CONFIG_BT_HCIUART=y CONFIG_BT_HCIUART_ATH3K=y CONFIG_CFG80211=y +CONFIG_CFG80211_CERTIFICATION_ONUS=y CONFIG_CFG80211_WEXT=y CONFIG_RFKILL=y CONFIG_RFKILL_INPUT=y @@ -81,7 +86,8 @@ CONFIG_DEVTMPFS_MOUNT=y # CONFIG_STANDALONE is not set # CONFIG_FW_LOADER_USER_HELPER is not set CONFIG_DMA_CMA=y -CONFIG_CMA_SIZE_MBYTES=320 +CONFIG_CMA_SIZE_PERCENTAGE=40 +CONFIG_CMA_SIZE_SEL_PERCENTAGE=y CONFIG_IMX_WEIM=y CONFIG_CONNECTOR=y CONFIG_PROC_DEVICETREE=y @@ -132,6 +138,8 @@ CONFIG_USB_SIERRA_NET=y CONFIG_ATH_CARDS=y CONFIG_ATH6KL=m CONFIG_ATH6KL_SDIO=m +CONFIG_ATH6KL_DEBUG=y +CONFIG_ATH6KL_REGDOMAIN=y CONFIG_INPUT_EVDEV=y CONFIG_KEYBOARD_GPIO=y CONFIG_KEYBOARD_IMX=y From 8ccafb949276306bc973cadcf336a253d15fd656 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Mon, 18 Jul 2016 11:35:09 +0200 Subject: [PATCH 095/117] u-boot: disable TF initramfs for CC6UL At the moment there is no support for rootfs encryption for the CC6UL, so there is not a ramdisk in the boot image. But with the initial addition of TF support, the u-boot boot script was being on-the-fly updated for TF regardless of the platform, making the CC6UL unable to boot when TF was enabled. This commit fixes the problem, by just changing the u-boot boot script when TF is enabled only for the CC6. https://jira.digi.com/browse/DEL-2754 Signed-off-by: Javier Viguera --- .../recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 6a46528ab..5c88ffd79 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -96,6 +96,13 @@ do_compile () { } +TF_BOOTSCRIPT_SEDFILTER = "" +TF_BOOTSCRIPT_SEDFILTER_ccimx6 = "${@tf_bootscript_sedfilter(d)}" + +def tf_bootscript_sedfilter(d): + tf_initramfs = d.getVar('TRUSTFENCE_INITRAMFS_IMAGE',True) or "" + return "/^dboot linux/i\setenv boot_initrd true\\nsetenv initrd_file %s-${MACHINE}.cpio.gz.u-boot" % tf_initramfs if tf_initramfs else "" + do_deploy_append() { # Remove canonical U-Boot symlinks for ${UBOOT_CONFIG} currently in the form: # u-boot-.imx- @@ -142,13 +149,7 @@ do_deploy_append() { # Boot script for DEY images (reconfigure on-the-fly if TRUSTFENCE is enabled) TMP_BOOTSCR="$(mktemp ${WORKDIR}/bootscr.XXXXXX)" - cat ${WORKDIR}/boot.txt > ${TMP_BOOTSCR} - if [ -n "${TRUSTFENCE_INITRAMFS_IMAGE}" ]; then - sed -i -e '/^dboot linux/{ - i\setenv boot_initrd true - i\setenv initrd_file ${TRUSTFENCE_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz.u-boot - }' ${TMP_BOOTSCR} - fi + sed -e "${TF_BOOTSCRIPT_SEDFILTER}" ${WORKDIR}/boot.txt > ${TMP_BOOTSCR} mkimage -T script -n bootscript -C none -d ${TMP_BOOTSCR} ${DEPLOYDIR}/boot.scr rm -f ${TMP_BOOTSCR} } From 529102b2dcd7d9a45b475741e411d8ae6a8c085f Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 12 Jul 2016 12:09:32 +0200 Subject: [PATCH 096/117] meta-digi-dey: sysinfo: extend report information with more details Extend the report with more details about: - memory usage - all network ports (-a) with their related PIDs (-p) - network link details (to determine if interface is up) Signed-off-by: Isaac Hermida --- meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo b/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo index a9b5c565c..b0561f374 100755 --- a/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo +++ b/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo @@ -131,6 +131,8 @@ make_report(){ echo "--------------------------------------" echo "" free + printf "\n" + cat /proc/meminfo printf "\n\n" echo "--------------------------------------" @@ -157,7 +159,7 @@ make_report(){ echo "- -" echo "--------------------------------------" echo "" - netstat -n -l + netstat -n -a -p printf "\n\n" echo "--------------------------------------" @@ -177,6 +179,8 @@ make_report(){ echo "" ifconfig -a printf "\n" + ip link show + printf "\n" echo "-------------End of report------------" } From dc5d85cb3b2b68d892dfca4d4dec316bdb538299 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Tue, 12 Jul 2016 12:22:36 +0200 Subject: [PATCH 097/117] meta-digi-dey: sysinfo: add support for CC6UL https://jira.digi.com/browse/DEL-2729 Signed-off-by: Isaac Hermida --- meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo b/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo index b0561f374..3a2c1b27e 100755 --- a/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo +++ b/meta-digi-dey/recipes-digi/sysinfo/sysinfo/sysinfo @@ -188,12 +188,20 @@ make_report(){ DISTRO="$(sed -ne 's,DISTRO = \(.*\)$,\1,g;T;p' /etc/build)" DEY_VERSION="$(sed -ne 's,DISTRO_VERSION = \(.*\)$,\1,g;T;p' /etc/build)" -UBOOT_VERSION="$(strings /dev/mmcblk0boot0 | grep dub | cut -d' ' -f2)" +UBOOT_PARTITION="/dev/mmcblk0boot0" +[ -c "/dev/mtd0" ] && UBOOT_PARTITION="/dev/mtd0" +UBOOT_VERSION="$(strings ${UBOOT_PARTITION} | grep -m 1 dub | cut -d' ' -f2)" MACHINE="$(cat /proc/device-tree/digi,machine,name)" BOARD_VARIANT="$(cat /proc/device-tree/digi,hwid,variant)" BOARD_SN="$(cat /proc/device-tree/digi,hwid,sn)" BOARD_VERSION="$(cat /proc/device-tree/digi,carrierboard,version)" BOARD_ID="$(cat /proc/device-tree/digi,carrierboard,id)" +if grep -qs '\' /proc/device-tree/compatible; then + MCA_NODE="/sys/devices/platform/soc/2100000.aips-bus/21a0000.i2c/i2c-0/0-007e" + MCA_HW_VERSION=$(cat ${MCA_NODE}/hw_version) || MCA_HW_VERSION="??" + MCA_FW_VERSION=$(cat ${MCA_NODE}/fw_version) || MCA_FW_VERSION="??" + MCA_VERSION="HW_VERSION=${MCA_HW_VERSION} FW_VERSION=${MCA_FW_VERSION}" +fi DATE="$(date "+%Y%m%d%H%M%S")" FILE="/tmp/sysinfo-${DEY_VERSION}-${BOARD_SN}-${DATE}.txt" @@ -212,6 +220,7 @@ printf "\n\n" echo "|| U-Boot | ${UBOOT_VERSION}" echo "|| Firmware | ${DISTRO}-${DEY_VERSION}-$(cat /etc/version)" echo "|| Kernel | $(uname -a)" + [ -n "${MCA_VERSION}" ] && echo "|| Kinetis | ${MCA_VERSION}" printf "\n\n" ) | tee ${FILE} From 24fb7f5bd454dd48093ff42b5ffcb74b1339399c Mon Sep 17 00:00:00 2001 From: Diego Escalona Date: Mon, 18 Jul 2016 13:21:17 +0200 Subject: [PATCH 098/117] build.sh: add support for the manufacturing build job - Added a checker with the job name to declare the manufacturing var - Changed the name of the repo manifest file for the manufacturing job - Added a checker to updated the bblayers.conf file with the mfg layer Signed-off-by: Diego Escalona --- sdk/build.sh | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sdk/build.sh b/sdk/build.sh index 8e5596d37..c668c50ef 100755 --- a/sdk/build.sh +++ b/sdk/build.sh @@ -128,6 +128,11 @@ if [ -z "${DY_FB_IMAGE}" ] && echo ${JOB_NAME} | grep -qs 'dey.*fb'; then DY_FB_IMAGE="true" fi +# If DY_MFG_IMAGE is unset, set it depending on the job name +if [ -z "${DY_MFG_IMAGE}" ] && echo ${JOB_NAME} | grep -qs 'dey.*mfg'; then + DY_MFG_IMAGE="true" +fi + # Per-platform data while read _pl _var _tgt; do # DY_BUILD_VARIANTS comes from Jenkins environment: @@ -174,7 +179,11 @@ if pushd ${YOCTO_INST_DIR}; then error "Revision \"${DY_REVISION}\" not found" fi fi - yes "" 2>/dev/null | ${REPO} init --no-repo-verify -u ${MANIFEST_URL} ${repo_revision} + # If it is a manufacturing job, specify the manufacturing manifest name + if [ "${DY_MFG_IMAGE}" = "true" ]; then + mfg_xml="-m manufacturing.xml" + fi + yes "" 2>/dev/null | ${REPO} init --no-repo-verify -u ${MANIFEST_URL} ${repo_revision} ${mfg_xml} ${REPO} forall -p -c 'git remote prune $(git remote)' time ${REPO} sync -d ${MAKE_JOBS} popd @@ -221,6 +230,10 @@ for platform in ${DY_PLATFORMS}; do if [ "${DY_FB_IMAGE}" = "true" ]; then printf "${X11_REMOVAL_CFG}" >> conf/local.conf fi + # Add the manufacturing layer to bblayers.conf file if it is a manufacturing job + if [ "${DY_MFG_IMAGE}" = "true" ]; then + sed -i -e "/meta-digi-dey/a\ ${YOCTO_INST_DIR}/sources/meta-digi-mfg \\\\" conf/bblayers.conf + fi for target in ${platform_targets}; do printf "\n[INFO] Building the ${target} target.\n" time bitbake ${target} From b71f2dacb5f0030933e80f692f828aeff5a50bfb Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Mon, 18 Jul 2016 16:55:19 +0200 Subject: [PATCH 099/117] u-boot-fw-utils: add support and config file for CC6UL platform U-Boot environment on the CC6UL NAND is located at partition /dev/mtd1: - original copy is located at offset 0 in the partition - redundant copy is located 1 erase block (128K) after the original copy Signed-off-by: Hector Palacios https://jira.digi.com/browse/DEL-2552 --- meta-digi-arm/conf/machine/include/ccimx6ul.inc | 1 + .../u-boot/u-boot-fw-utils/ccimx6ul/fw_env.config | 7 +++++++ .../recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend | 12 +++++------- 3 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils/ccimx6ul/fw_env.config diff --git a/meta-digi-arm/conf/machine/include/ccimx6ul.inc b/meta-digi-arm/conf/machine/include/ccimx6ul.inc index 47235b8f9..e8aa9ce89 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6ul.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6ul.inc @@ -22,6 +22,7 @@ MACHINE_FIRMWARE ?= "" MACHINE_EXTRA_RDEPENDS += " \ imx-kobs \ mtd-utils-ubifs \ + u-boot-fw-utils \ " MACHINE_EXTRA_RRECOMMENDS += "${MACHINE_FIRMWARE} ${WIRELESS_MODULE}" MACHINE_EXTRA_RRECOMMENDS += "fsl-alsa-plugins cryptodev-module" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils/ccimx6ul/fw_env.config b/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils/ccimx6ul/fw_env.config new file mode 100644 index 000000000..be29acc2f --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils/ccimx6ul/fw_env.config @@ -0,0 +1,7 @@ +# Configuration file for fw_(printenv/setenv) utility. +# Up to two entries are valid, in this case the redundant +# environment sector is assumed present. + +# Device name Offset Size +/dev/mtd1 0x0 0x20000 +/dev/mtd1 0x20000 0x20000 diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend b/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend index 8540dc4cb..89240d47b 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-fw-utils_%.bbappend @@ -2,12 +2,10 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" -SRC_URI += " \ - file://0002-fw_env-add-support-to-unlock-emmc-boot-partition.patch \ - file://fw_env.config \ -" +SRC_URI += "file://fw_env.config" +SRC_URI_append_ccimx6 = " file://0002-fw_env-add-support-to-unlock-emmc-boot-partition.patch" -# We do not have a CC6 defconfig in this version of u-boot, so just use the generic +# We do not have a platform defconfig in this version of u-boot, so just use the generic # sandbox defconfig, which is enough to build the Linux user-space tool (fw_printenv) UBOOT_CONFIG = "sandbox" UBOOT_CONFIG[sandbox] = "sandbox_defconfig" @@ -16,7 +14,7 @@ do_install_append() { install -m 0644 ${WORKDIR}/fw_env.config ${D}${sysconfdir}/ } -pkg_postinst_${PN}() { +pkg_postinst_${PN}_ccimx6() { # run the postinst script on first boot if [ x"$D" != "x" ]; then exit 1 @@ -27,4 +25,4 @@ pkg_postinst_${PN}() { fi } -COMPATIBLE_MACHINE = "(ccimx6$)" +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul)" From d80aa91c2854c445dea280c148f08b18470edb4e Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 19 Jul 2016 12:35:51 +0200 Subject: [PATCH 100/117] meta-digi-arm: set 'boot.ubifs' image depends explictly To build the CC6UL boot image, the u-boot and linux images need to be already deployed. Also the native mtd-utils package needs to be available in the sysroot. Make all this dependences explicit for deterministic reproducibility. Signed-off-by: Javier Viguera --- meta-digi-arm/classes/image_types_digi.bbclass | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/meta-digi-arm/classes/image_types_digi.bbclass b/meta-digi-arm/classes/image_types_digi.bbclass index e2946ea7a..1805de6e7 100644 --- a/meta-digi-arm/classes/image_types_digi.bbclass +++ b/meta-digi-arm/classes/image_types_digi.bbclass @@ -71,6 +71,12 @@ IMAGE_CMD_boot.vfat() { fi } +IMAGE_DEPENDS_boot.ubifs = " \ + mtd-utils-native:do_populate_sysroot \ + u-boot:do_deploy \ + virtual/kernel:do_deploy \ +" + IMAGE_CMD_boot.ubifs() { # # Image generation code for image type 'boot.ubifs' From 8ac7da51ef9cb58c9a84169a4d713114e49f17d6 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Thu, 30 Jun 2016 17:34:27 +0200 Subject: [PATCH 101/117] meta-digi-arm: add recipe for the Code Signing Tools NXP Code signing Tool for the High Assurance Boot library is needed for signing and encrypting different artifacts (U-Boot image, uImage, ...). As the CST cannot be included in DEY, the user needs to download the tarball and add it to the recipe folder. https://jira.digi.com/browse/DUB-618 Signed-off-by: Diaz de Grenu, Jose --- ...crypted_data-reuse-existing-DEK-file.patch | 29 ++++++++++++++++ .../trustfence-cst-2.3.2/Makefile | 24 ++++++++++++++ .../trustfence-cst/trustfence-cst_2.3.2.bb | 33 +++++++++++++++++++ .../recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 1 + .../recipes-kernel/linux/linux-dey.inc | 1 + 5 files changed, 88 insertions(+) create mode 100644 meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch create mode 100644 meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/Makefile create mode 100644 meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch new file mode 100644 index 000000000..881a77761 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch @@ -0,0 +1,29 @@ +From: "Diaz de Grenu, Jose" +Date: Thu, 30 Jun 2016 16:42:42 +0200 +Subject: [PATCH] gen_auth_encrypted_data: reuse existing DEK file + +In order to be able to encrypt several artifacts with the same DEK, it is +needed to allow the CST to reuse an existing DEK file. + +Previous to this patch, the DEK is generated on the fly and placed on the +specified path. After this patch, the DEK is taken from the specified path. + +https://jira.digi.com/browse/DUB-608 + +Signed-off-by: Diaz de Grenu, Jose +--- + code/back_end/src/adapt_layer_openssl.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/code/back_end/src/adapt_layer_openssl.c b/code/back_end/src/adapt_layer_openssl.c +index 8513046269ea..ce6e370f2c6a 100644 +--- a/code/back_end/src/adapt_layer_openssl.c ++++ b/code/back_end/src/adapt_layer_openssl.c +@@ -945,6 +945,7 @@ int32_t gen_auth_encrypted_data(const char* in_file, + } + printf("\n"); + #endif ++ reuse_dek = 1; + if (reuse_dek) { + fh = fopen(key_file, "rb"); + if (fh == NULL) { diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/Makefile b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/Makefile new file mode 100644 index 000000000..f443ef3d1 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/Makefile @@ -0,0 +1,24 @@ +TARGET = linux64/cst +LIBS = -lfrontend -lcrypto +CC = gcc +CFLAGS = -g -Wall + +.PHONY: default all clean + +default: $(TARGET) +all: default + +OBJECTS = code/back_end/src/*.c +HEADERS = code/back_end/hdr +LIBS_PATH = linux64/lib + +%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJECTS) + +$(TARGET): $(OBJECTS) + $(CC) $(OBJECTS) $(CFLAGS) -L $(LIBS_PATH) $(LIBS) -I $(HEADERS) -o $@ + +clean: + -rm -f *.o $(TARGET) diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb new file mode 100644 index 000000000..f1fd9ab58 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb @@ -0,0 +1,33 @@ +SUMMARY = "NXP Code signing Tool for the High Assurance Boot library" +DESCRIPTION = "Provides software code signing support designed for use with i.MX processors that integrate the HAB library in the internal boot ROM." +HOMEPAGE = "https://www.nxp.com/webapp/Download?colCode=IMX_CST_TOOL" +LICENSE = "CLOSED" + +DEPENDS = "openssl" + +S= "${WORKDIR}/cst-${PV}" + +SRC_URI = " \ + ${@base_conditional('TRUSTFENCE_SIGN', '1', 'file://cst-${PV}.tar.gz', '', d)} \ + file://0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch \ + file://Makefile \ +" + +do_configure() { + cp -f ${WORKDIR}/Makefile . +} + +do_compile () { + oe_runmake clean && oe_runmake +} + +do_install () { + install -d ${D}${bindir} + install -m 0755 linux64/cst ${D}${bindir}/cst + install -m 0755 linux64/srktool ${D}${bindir}/srktool + install -m 0755 ca/openssl.cnf ${D}${bindir}/openssl.cnf + install -m 0755 ca/v3_ca.cnf ${D}${bindir}/v3_ca.cnf + install -m 0755 ca/v3_usr.cnf ${D}${bindir}/v3_usr.cnf +} + +BBCLASSEXTEND = "native" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 5c88ffd79..68738aade 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -7,6 +7,7 @@ LICENSE = "GPLv2+" LIC_FILES_CHKSUM = "file://Licenses/README;md5=c7383a594871c03da76b3707929d2919" DEPENDS += "dtc-native u-boot-mkimage-native" +DEPENDS += "${@base_conditional('TRUSTFENCE_SIGN', '1', 'trustfence-cst-native', '', d)}" PROVIDES += "u-boot" diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey.inc b/meta-digi-arm/recipes-kernel/linux/linux-dey.inc index f663f0d8e..563fc664e 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey.inc +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey.inc @@ -5,6 +5,7 @@ LICENSE = "GPLv2" LIC_FILES_CHKSUM = "file://COPYING;md5=d7810fab7487fb0aad327b76f1be7cd7" DEPENDS += "lzop-native bc-native" +DEPENDS += "${@base_conditional('TRUSTFENCE_SIGN', '1', 'trustfence-cst-native', '', d)}" inherit kernel fsl-kernel-localversion From ceb9ca15374beea5951151ac9dc142334f0da272 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Tue, 12 Jul 2016 17:58:24 +0200 Subject: [PATCH 102/117] trustfence-cst: hab4_pki_tree-sh: automate script This allows to automatically create a secure PKI tree without user interaction. https://jira.digi.com/browse/DUB-618 Signed-off-by: Diaz de Grenu, Jose --- ...002-hab4_pki_tree.sh-automate-script.patch | 521 ++++++++++++++++++ .../trustfence-cst/trustfence-cst_2.3.2.bb | 2 + 2 files changed, 523 insertions(+) create mode 100644 meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0002-hab4_pki_tree.sh-automate-script.patch diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0002-hab4_pki_tree.sh-automate-script.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0002-hab4_pki_tree.sh-automate-script.patch new file mode 100644 index 000000000..a6686f9ee --- /dev/null +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0002-hab4_pki_tree.sh-automate-script.patch @@ -0,0 +1,521 @@ +From: "Diaz de Grenu, Jose" +Date: Mon, 18 Jul 2016 13:21:11 +0200 +Subject: [PATCH] hab4_pki_tree.sh: automate script + +Signed-off-by: Diaz de Grenu, Jose +--- + keys/hab4_pki_tree.sh | 347 ++++++++++++++++---------------------------------- + 1 file changed, 107 insertions(+), 240 deletions(-) + +diff --git a/keys/hab4_pki_tree.sh b/keys/hab4_pki_tree.sh +index 7dd67f68c8df..b2c6b71b604e 100755 +--- a/keys/hab4_pki_tree.sh ++++ b/keys/hab4_pki_tree.sh +@@ -42,84 +42,40 @@ + # + #----------------------------------------------------------------------------- + +-printf "\n" +-printf " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" +-printf " This script is a part of the Code signing tools for Freescale's\n" +-printf " High Assurance Boot. It generates a basic PKI tree. The PKI\n" +-printf " tree consists of one or more Super Root Keys (SRK), with each\n" +-printf " SRK having two subordinate keys: \n" +-printf " + a Command Sequence File (CSF) key \n" +-printf " + Image key. \n" +-printf " Additional keys can be added to the PKI tree but a separate \n" +-printf " script is available for this. This this script assumes openssl\n" +-printf " is installed on your system and is included in your search \n" +-printf " path. Finally, the private keys generated are password \n" +-printf " protectedwith the password provided by the file key_pass.txt.\n" +-printf " The format of the file is the password repeated twice:\n" +-printf " my_password\n" +-printf " my_password\n" +-printf " All private keys in the PKI tree are in PKCS #8 format will be\n" +-printf " protected by the same password.\n\n" +-printf " +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" +- +-stty erase  +- +-printf "Do you want to use an existing CA key (y/n)?: \b" +-read existing_ca +-if [ $existing_ca = "y" ] +-then +- printf "Enter CA key name: \b" +- read ca_key +- printf "Enter CA certificate name: \b" +- read ca_cert ++SCRIPT_BASEDIR="$(cd $(dirname ${0}) && pwd)" ++CSF_PATH="${1}" ++if [ ! -d "${CSF_PATH}" ]; then ++ echo "Invalid CSF_PATH: ${CSF_PATH}" ++ exit 1 + fi + +-printf "Do you want to use Elliptic Curve Cryptography (y/n)?: \b" +-read use_ecc +-if [ $use_ecc = "y" ] +-then +- printf "Enter length for elliptic curve to be used for PKI tree:\n" +- printf "Possible values p192, p256, p521: \b" +- read kl +- +- # Confirm that a valid key length has been entered +- case $kl in +- p192) +- cn="secp112r1" ;; +- p256) +- cn="prime256v1" ;; +- p521) +- cn="secp521r1" ;; +- *) +- echo Invalid key length. Supported key lengths: 192, 256, 521 +- exit 1 ;; +- esac +-else +- printf "Enter key length in bits for PKI tree: \b" +- read kl +- +- # Confirm that a valid key length has been entered +- case $kl in +- 1024) ;; +- 2048) ;; +- 3072) ;; +- 4096) ;; +- *) +- echo Invalid key length. Supported key lengths: 1024, 2048, 3072, 4096 +- exit 1 ;; +- esac +-fi ++cd "${CSF_PATH}" ++ ++[ -d crts ] || mkdir crts ++[ -d keys ] || mkdir keys + ++cd keys + ++existing_ca="n" ++kl="4096" + +-printf "Enter PKI tree duration (years): \b" +-read duration ++# Confirm that a valid key length has been entered ++case $kl in ++ 1024) ;; ++ 2048) ;; ++ 3072) ;; ++ 4096) ;; ++ *) ++ echo Invalid key length. Supported key lengths: 1024, 2048, 3072, 4096 ++ exit 1 ;; ++esac ++ ++duration="10" + + # Compute validity period + val_period=$((duration*365)) + +-printf "How many Super Root Keys should be generated? \b" +-read num_srk ++num_srk="4" + + # Check that 0 < num_srk <= 4 (Max. number of SRKs) + if [ $num_srk -lt 1 ] || [ $num_srk -gt 4 ] +@@ -128,10 +84,7 @@ then + exit 1 + fi + +-# Check if SRKs should be generated as CA certs or user certs +-printf "Do you want the SRK certificates to have the CA flag set? (y/n)?: \b" +-read srk_ca +- ++srk_ca="y" + # Check that the file "serial" is present, if not create it: + if [ ! -f serial ] + then +@@ -154,6 +107,9 @@ echo "unique_subject = no" > index.txt.attr + + if [ $existing_ca = "n" ] + then ++ ca_key=./CA1_sha256_${kl}_65537_v3_ca_key ++ ca_cert=../crts/CA1_sha256_${kl}_65537_v3_ca_crt ++ + # Generate CA key and certificate + # ------------------------------- + echo +@@ -161,31 +117,12 @@ then + echo + Generating CA key and certificate + + echo +++++++++++++++++++++++++++++++++++++ + echo +- +- if [ $use_ecc = 'n' ] +- then +- ca_key=./CA1_sha256_${kl}_65537_v3_ca_key +- ca_cert=../crts/CA1_sha256_${kl}_65537_v3_ca_crt +- ca_subj_req=/CN=CA1_sha256_${kl}_65537_v3_ca/ +- ca_key_type=rsa:${kl} +- else +- +- # Generate Elliptic Curve parameters: +- eck='ec-'$cn'.pem' +- openssl ecparam -out $eck -name $cn +- +- ca_key=./CA1_sha256_${cn}_v3_ca_key +- ca_cert=../crts/CA1_sha256_${cn}_v3_ca_crt +- ca_subj_req=/CN=CA1_sha256_${cn}_v3_ca/ +- ca_key_type=ec:${eck} +- fi +- +- openssl req -newkey ${ca_key_type} -passout file:./key_pass.txt \ +- -subj ${ca_subj_req} \ +- -x509 -extensions v3_ca \ +- -keyout temp_ca.pem \ +- -out ${ca_cert}.pem \ +- -days ${val_period} -config ../ca/openssl.cnf ++ openssl req -newkey rsa:${kl} -passout file:./key_pass.txt \ ++ -subj /CN=CA1_sha256_${kl}_65537_v3_ca/ \ ++ -x509 -extensions v3_ca \ ++ -keyout temp_ca.pem \ ++ -out ${ca_cert}.pem \ ++ -days ${val_period} -config "${SCRIPT_BASEDIR}/openssl.cnf" + + # Generate CA key in PKCS #8 format - both PEM and DER + openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ +@@ -202,7 +139,7 @@ then + openssl x509 -inform PEM -outform DER -in ${ca_cert}.pem -out ${ca_cert}.der + + # Cleanup +- \rm temp_ca.pem ++ rm temp_ca.pem + fi + + +@@ -219,64 +156,48 @@ then + echo + Generating SRK key and certificate $i + + echo ++++++++++++++++++++++++++++++++++++++++ + echo +- if [ $use_ecc = 'n' ] +- then +- # Generate SRK key +- openssl genrsa -des3 -passout file:./key_pass.txt -f4 \ +- -out ./temp_srk.pem ${kl} +- +- srk_subj_req=/CN=SRK${i}_sha256_${kl}_65537_v3_usr/ +- srk_crt=../crts/SRK${i}_sha256_${kl}_65537_v3_usr_crt +- srk_key=./SRK${i}_sha256_${kl}_65537_v3_usr_key +- else +- # Generate Elliptic Curve parameters: +- openssl ecparam -out ./temp_srk.pem -name ${cn} -genkey +- # Generate SRK key +- openssl ec -in ./temp_srk.pem -des3 -passout file:./key_pass.txt \ +- -out ./temp_srk.pem +- +- srk_subj_req=/CN=SRK${i}_sha256_${cn}_v3_usr/ +- srk_crt=../crts/SRK${i}_sha256_${cn}_v3_usr_crt +- srk_key=./SRK${i}_sha256_${cn}_v3_usr_key +- fi ++ ++ # Generate SRK key ++ openssl genrsa -des3 -passout file:./key_pass.txt -f4 \ ++ -out ./temp_srk.pem ${kl} + + # Generate SRK certificate signing request + openssl req -new -batch -passin file:./key_pass.txt \ +- -subj ${srk_subj_req} \ ++ -subj /CN=SRK${i}_sha256_${kl}_65537_v3_usr/ \ + -key ./temp_srk.pem \ + -out ./temp_srk_req.pem + + # Generate SRK certificate (this is a CA cert) +- openssl ca -batch -passin file:./key_pass.txt \ +- -md sha256 -outdir ./ \ +- -in ./temp_srk_req.pem \ +- -cert ${ca_cert}.pem \ ++ openssl ca -batch -passin file:./key_pass.txt \ ++ -md sha256 -outdir ./ \ ++ -in ./temp_srk_req.pem \ ++ -cert ${ca_cert}.pem \ + -keyfile ${ca_key}.pem \ +- -extfile ../ca/v3_usr.cnf \ +- -out ${srk_crt}.pem \ +- -days ${val_period} \ +- -config ../ca/openssl.cnf ++ -extfile "${SCRIPT_BASEDIR}/v3_usr.cnf" \ ++ -out ../crts/SRK${i}_sha256_${kl}_65537_v3_usr_crt.pem \ ++ -days ${val_period} \ ++ -config "${SCRIPT_BASEDIR}/openssl.cnf" + + # Convert SRK Certificate to DER format + openssl x509 -inform PEM -outform DER \ +- -in ${srk_crt}.pem \ +- -out ${srk_crt}.der ++ -in ../crts/SRK${i}_sha256_${kl}_65537_v3_usr_crt.pem \ ++ -out ../crts/SRK${i}_sha256_${kl}_65537_v3_usr_crt.der + + # Generate SRK key in PKCS #8 format - both PEM and DER + openssl pkcs8 -passin file:./key_pass.txt \ + -passout file:./key_pass.txt \ + -topk8 -inform PEM -outform DER -v2 des3 \ + -in temp_srk.pem \ +- -out ${srk_key}.der ++ -out ./SRK${i}_sha256_${kl}_65537_v3_usr_key.der + + openssl pkcs8 -passin file:./key_pass.txt \ + -passout file:./key_pass.txt \ + -topk8 -inform PEM -outform PEM -v2 des3 \ + -in temp_srk.pem \ +- -out ${srk_key}.pem ++ -out ./SRK${i}_sha256_${kl}_65537_v3_usr_key.pem + + # Cleanup +- \rm ./temp_srk.pem ./temp_srk_req.pem ++ rm ./temp_srk.pem ./temp_srk_req.pem + i=$((i+1)) + done + else +@@ -293,98 +214,60 @@ do + echo ++++++++++++++++++++++++++++++++++++++++ + echo + +- if [ $use_ecc = 'n' ] +- then +- # Generate SRK key +- openssl genrsa -des3 -passout file:./key_pass.txt -f4 \ +- -out ./temp_srk.pem ${kl} +- +- srk_subj_req=/CN=SRK${i}_sha256_${kl}_65537_v3_ca/ +- srk_crt=../crts/SRK${i}_sha256_${kl}_65537_v3_ca_crt +- srk_key=./SRK${i}_sha256_${kl}_65537_v3_ca_key +- else +- # Generate Elliptic Curve parameters: +- openssl ecparam -out ./temp_srk.pem -name ${cn} -genkey +- # Generate SRK key +- openssl ec -in ./temp_srk.pem -des3 -passout file:./key_pass.txt \ +- -out ./temp_srk.pem +- +- srk_subj_req=/CN=SRK${i}_sha256_${cn}_v3_ca/ +- srk_crt=../crts/SRK${i}_sha256_${cn}_v3_ca_crt +- srk_key=./SRK${i}_sha256_${cn}_v3_ca_key +- fi ++ # Generate SRK key ++ openssl genrsa -des3 -passout file:./key_pass.txt -f4 \ ++ -out ./temp_srk.pem ${kl} ++ + # Generate SRK certificate signing request +- openssl req -new -batch -passin file:./key_pass.txt \ +- -subj ${srk_subj_req} \ +- -key ./temp_srk.pem \ +- -out ./temp_srk_req.pem ++ openssl req -new -batch -passin file:./key_pass.txt \ ++ -subj /CN=SRK${i}_sha256_${kl}_65537_v3_ca/ \ ++ -key ./temp_srk.pem \ ++ -out ./temp_srk_req.pem + + # Generate SRK certificate (this is a CA cert) +- openssl ca -batch -passin file:./key_pass.txt \ +- -md sha256 -outdir ./ \ +- -in ./temp_srk_req.pem \ +- -cert ${ca_cert}.pem \ +- -keyfile ${ca_key}.pem \ +- -extfile ../ca/v3_ca.cnf \ +- -out ${srk_crt}.pem \ +- -days ${val_period} \ +- -config ../ca/openssl.cnf ++ openssl ca -batch -passin file:./key_pass.txt \ ++ -md sha256 -outdir ./ \ ++ -in ./temp_srk_req.pem \ ++ -cert ${ca_cert}.pem \ ++ -keyfile ${ca_key}.pem \ ++ -extfile "${SCRIPT_BASEDIR}/v3_ca.cnf" \ ++ -out ../crts/SRK${i}_sha256_${kl}_65537_v3_ca_crt.pem \ ++ -days ${val_period} \ ++ -config "${SCRIPT_BASEDIR}/openssl.cnf" + + # Convert SRK Certificate to DER format + openssl x509 -inform PEM -outform DER \ +- -in ${srk_crt}.pem \ +- -out ${srk_crt}.der ++ -in ../crts/SRK${i}_sha256_${kl}_65537_v3_ca_crt.pem \ ++ -out ../crts/SRK${i}_sha256_${kl}_65537_v3_ca_crt.der + + # Generate SRK key in PKCS #8 format - both PEM and DER +- openssl pkcs8 -passin file:./key_pass.txt \ +- -passout file:./key_pass.txt \ ++ openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ + -topk8 -inform PEM -outform DER -v2 des3 \ + -in temp_srk.pem \ +- -out ${srk_key}.der ++ -out ./SRK${i}_sha256_${kl}_65537_v3_ca_key.der + +- openssl pkcs8 -passin file:./key_pass.txt \ +- -passout file:./key_pass.txt \ ++ openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ + -topk8 -inform PEM -outform PEM -v2 des3 \ + -in temp_srk.pem \ +- -out ${srk_key}.pem ++ -out ./SRK${i}_sha256_${kl}_65537_v3_ca_key.pem + + # Cleanup + \rm ./temp_srk.pem ./temp_srk_req.pem + ++ + echo + echo ++++++++++++++++++++++++++++++++++++++++ + echo + Generating CSF key and certificate $i + + echo ++++++++++++++++++++++++++++++++++++++++ + echo + +- if [ $use_ecc = 'n' ] +- then +- srk_crt_i=../crts/SRK${i}_sha256_${kl}_65537_v3_ca_crt.pem +- srk_key_i=./SRK${i}_sha256_${kl}_65537_v3_ca_key.pem +- # Generate key +- openssl genrsa -des3 -passout file:./key_pass.txt -f4 \ +- -out ./temp_csf.pem ${kl} +- +- csf_subj_req=/CN=CSF${i}_1_sha256_${kl}_65537_v3_usr/ +- csf_crt=../crts/CSF${i}_1_sha256_${kl}_65537_v3_usr_crt +- csf_key=./CSF${i}_1_sha256_${kl}_65537_v3_usr_key +- else +- srk_crt_i=../crts/SRK${i}_sha256_${cn}_v3_ca_crt.pem +- srk_key_i=./SRK${i}_sha256_${cn}_v3_ca_key.pem +- # Generate Elliptic Curve parameters: +- openssl ecparam -out ./temp_csf.pem -name ${cn} -genkey +- # Generate key +- openssl ec -in ./temp_csf.pem -des3 -passout file:./key_pass.txt \ +- -out ./temp_csf.pem +- +- csf_subj_req=/CN=CSF${i}_1_sha256_${cn}_v3_usr/ +- csf_crt=../crts/CSF${i}_1_sha256_${cn}_v3_usr_crt +- csf_key=./CSF${i}_1_sha256_${cn}_v3_usr_key +- fi ++ # Generate key ++ openssl genrsa -des3 -passout file:./key_pass.txt \ ++ -f4 -out ./temp_csf.pem ${kl} + + # Generate CSF certificate signing request + openssl req -new -batch -passin file:./key_pass.txt \ +- -subj ${csf_subj_req} \ ++ -subj /CN=CSF${i}_1_sha256_${kl}_65537_v3_usr/ \ + -key ./temp_csf.pem \ + -out ./temp_csf_req.pem + +@@ -392,31 +275,31 @@ do + openssl ca -batch -md sha256 -outdir ./ \ + -passin file:./key_pass.txt \ + -in ./temp_csf_req.pem \ +- -cert ${srk_crt_i} \ +- -keyfile ${srk_key_i} \ +- -extfile ../ca/v3_usr.cnf \ +- -out ${csf_crt}.pem \ ++ -cert ../crts/SRK${i}_sha256_${kl}_65537_v3_ca_crt.pem \ ++ -keyfile ./SRK${i}_sha256_${kl}_65537_v3_ca_key.pem \ ++ -extfile "${SCRIPT_BASEDIR}/v3_usr.cnf" \ ++ -out ../crts/CSF${i}_1_sha256_${kl}_65537_v3_usr_crt.pem \ + -days ${val_period} \ +- -config ../ca/openssl.cnf ++ -config "${SCRIPT_BASEDIR}/openssl.cnf" + + # Convert CSF Certificate to DER format + openssl x509 -inform PEM -outform DER \ +- -in ${csf_crt}.pem \ +- -out ${csf_crt}.der ++ -in ../crts/CSF${i}_1_sha256_${kl}_65537_v3_usr_crt.pem \ ++ -out ../crts/CSF${i}_1_sha256_${kl}_65537_v3_usr_crt.der + + # Generate CSF key in PKCS #8 format - both PEM and DER + openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ + -topk8 -inform PEM -outform DER -v2 des3 \ + -in temp_csf.pem \ +- -out ${csf_key}.der ++ -out ./CSF${i}_1_sha256_${kl}_65537_v3_usr_key.der + + openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ + -topk8 -inform PEM -outform PEM -v2 des3 \ + -in temp_csf.pem \ +- -out ${csf_key}.pem ++ -out ./CSF${i}_1_sha256_${kl}_65537_v3_usr_key.pem + + # Cleanup +- \rm ./temp_csf.pem ./temp_csf_req.pem ++ rm ./temp_csf.pem ./temp_csf_req.pem + + echo + echo ++++++++++++++++++++++++++++++++++++++++ +@@ -424,61 +307,45 @@ do + echo ++++++++++++++++++++++++++++++++++++++++ + echo + +- if [ $use_ecc = 'n' ] +- then +- # Generate key +- openssl genrsa -des3 -passout file:./key_pass.txt -f4 \ +- -out ./temp_img.pem ${kl} +- +- img_subj_req=/CN=IMG${i}_1_sha256_${kl}_65537_v3_usr/ +- img_crt=../crts/IMG${i}_1_sha256_${kl}_65537_v3_usr_crt +- img_key=./IMG${i}_1_sha256_${kl}_65537_v3_usr_key +- else +- # Generate Elliptic Curve parameters: +- openssl ecparam -out ./temp_img.pem -name ${cn} -genkey +- # Generate key +- openssl ec -in ./temp_img.pem -des3 -passout file:./key_pass.txt \ +- -out ./temp_img.pem +- +- img_subj_req=/CN=IMG${i}_1_sha256_${cn}_v3_usr/ +- img_crt=../crts/IMG${i}_1_sha256_${cn}_v3_usr_crt +- img_key=./IMG${i}_1_sha256_${cn}_v3_usr_key +- fi ++ # Generate key ++ openssl genrsa -des3 -passout file:./key_pass.txt \ ++ -f4 -out ./temp_img.pem ${kl} + + # Generate IMG certificate signing request + openssl req -new -batch -passin file:./key_pass.txt \ +- -subj ${img_subj_req} \ ++ -subj /CN=IMG${i}_1_sha256_${kl}_65537_v3_usr/ \ + -key ./temp_img.pem \ + -out ./temp_img_req.pem + + openssl ca -batch -md sha256 -outdir ./ \ + -passin file:./key_pass.txt \ + -in ./temp_img_req.pem \ +- -cert ${srk_crt_i} \ +- -keyfile ${srk_key_i} \ +- -extfile ../ca/v3_usr.cnf \ +- -out ${img_crt}.pem \ ++ -cert ../crts/SRK${i}_sha256_${kl}_65537_v3_ca_crt.pem \ ++ -keyfile ./SRK${i}_sha256_${kl}_65537_v3_ca_key.pem \ ++ -extfile "${SCRIPT_BASEDIR}/v3_usr.cnf" \ ++ -out ../crts/IMG${i}_1_sha256_${kl}_65537_v3_usr_crt.pem \ + -days ${val_period} \ +- -config ../ca/openssl.cnf ++ -config "${SCRIPT_BASEDIR}/openssl.cnf" + + # Convert IMG Certificate to DER format + openssl x509 -inform PEM -outform DER \ +- -in ${img_crt}.pem \ +- -out ${img_crt}.der ++ -in ../crts/IMG${i}_1_sha256_${kl}_65537_v3_usr_crt.pem \ ++ -out ../crts/IMG${i}_1_sha256_${kl}_65537_v3_usr_crt.der + + # Generate IMG key in PKCS #8 format - both PEM and DER + openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ + -topk8 -inform PEM -outform DER -v2 des3 \ + -in temp_img.pem \ +- -out ${img_key}.der ++ -out ./IMG${i}_1_sha256_${kl}_65537_v3_usr_key.der + + openssl pkcs8 -passin file:./key_pass.txt -passout file:./key_pass.txt \ + -topk8 -inform PEM -outform PEM -v2 des3 \ + -in temp_img.pem \ +- -out ${img_key}.pem ++ -out ./IMG${i}_1_sha256_${kl}_65537_v3_usr_key.pem + + # Cleanup +- \rm ./temp_img.pem ./temp_img_req.pem ++ rm ./temp_img.pem ./temp_img_req.pem ++ + + i=$((i+1)) + done diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb index f1fd9ab58..0fc73c323 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb @@ -10,6 +10,7 @@ S= "${WORKDIR}/cst-${PV}" SRC_URI = " \ ${@base_conditional('TRUSTFENCE_SIGN', '1', 'file://cst-${PV}.tar.gz', '', d)} \ file://0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch \ + file://0002-hab4_pki_tree.sh-automate-script.patch \ file://Makefile \ " @@ -25,6 +26,7 @@ do_install () { install -d ${D}${bindir} install -m 0755 linux64/cst ${D}${bindir}/cst install -m 0755 linux64/srktool ${D}${bindir}/srktool + install -m 0755 keys/hab4_pki_tree.sh ${D}${bindir}/trustfence-gen-pki.sh install -m 0755 ca/openssl.cnf ${D}${bindir}/openssl.cnf install -m 0755 ca/v3_ca.cnf ${D}${bindir}/v3_ca.cnf install -m 0755 ca/v3_usr.cnf ${D}${bindir}/v3_usr.cnf From 37eb7db2dc892148c4406d6dc8c717503df71e39 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Tue, 12 Jul 2016 17:49:07 +0200 Subject: [PATCH 103/117] meta-digi-arm: trustfence-cst: use /dev/urandom This is needed in order to avoid indefinitely blocking. Signed-off-by: Diaz de Grenu, Jose --- ...elper-use-dev-urandom-as-seed-source.patch | 22 +++++++++++++++++++ .../trustfence-cst/trustfence-cst_2.3.2.bb | 1 + 2 files changed, 23 insertions(+) create mode 100644 meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0003-openssl_helper-use-dev-urandom-as-seed-source.patch diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0003-openssl_helper-use-dev-urandom-as-seed-source.patch b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0003-openssl_helper-use-dev-urandom-as-seed-source.patch new file mode 100644 index 000000000..24dcbd229 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-2.3.2/0003-openssl_helper-use-dev-urandom-as-seed-source.patch @@ -0,0 +1,22 @@ +From: "Diaz de Grenu, Jose" +Date: Tue, 12 Jul 2016 17:47:24 +0200 +Subject: [PATCH] openssl_helper: use /dev/urandom as seed source + +This is needed in order to avoid indefinitely blocking. + +Signed-off-by: Diaz de Grenu, Jose +--- + code/back_end/src/openssl_helper.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/code/back_end/src/openssl_helper.c b/code/back_end/src/openssl_helper.c +index 3c9c779092c5..f0cd4e06f0dd 100644 +--- a/code/back_end/src/openssl_helper.c ++++ b/code/back_end/src/openssl_helper.c +@@ -486,7 +486,7 @@ void print_version(void) + ---------------------------*/ + uint32_t seed_prng(uint32_t bytes) + { +- return RAND_load_file("/dev/random", bytes); ++ return RAND_load_file("/dev/urandom", bytes); + } diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb index 0fc73c323..eb5fd5f39 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst_2.3.2.bb @@ -11,6 +11,7 @@ SRC_URI = " \ ${@base_conditional('TRUSTFENCE_SIGN', '1', 'file://cst-${PV}.tar.gz', '', d)} \ file://0001-gen_auth_encrypted_data-reuse-existing-DEK-file.patch \ file://0002-hab4_pki_tree.sh-automate-script.patch \ + file://0003-openssl_helper-use-dev-urandom-as-seed-source.patch \ file://Makefile \ " From f23d8c6abb03deeed6c72a679c63fb575ce35a3e Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Thu, 7 Jul 2016 11:11:35 +0200 Subject: [PATCH 104/117] trustfence: simplify TRUSTFENCE_ configuration macros Adapt the U-Boot recipe to the last U-Boot Kconfig entries changes. Simplify the name of some TRUSTFENCE_ configuration macros. These were used to configure U-Boot, but they will also configure the uImage signature and encryption processes. https://jira.digi.com/browse/DUB-602 https://jira.digi.com/browse/DUB-618 https://jira.digi.com/browse/DUB-534 Signed-off-by: Diaz de Grenu, Jose --- .../recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 20 +++++-------- meta-digi-dey/classes/trustfence.bbclass | 28 +++++++++---------- 2 files changed, 21 insertions(+), 27 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 68738aade..4f0a3051a 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -34,13 +34,11 @@ EXTRA_OEMAKE_append = " KCFLAGS=-fgnu89-inline" UBOOT_EXTRA_CONF ?= "" python __anonymous() { - if (d.getVar("TRUSTFENCE_UBOOT_SIGN", True) == "1") and not d.getVar("TRUSTFENCE_CST_PATH", True): - bb.fatal("NXP's CST tool needs to be installed and a PKI tree generated. Please download it from the NXP website at http://www.nxp.com/pages/i.mx-design-tools:IMX_DESIGN?fsrch=1&sr=1&pageNum=1") - if (d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True) == "1") and (d.getVar("TRUSTFENCE_UBOOT_SIGN", True) != "1"): - bb.fatal("Only signed U-Boot images can be encrypted. Generate signed images (TRUSTFENCE_UBOOT_SIGN=1) or remove encryption (TRUSTFENCE_UBOOT_ENCRYPT=0)") + if (d.getVar("TRUSTFENCE_DEK_PATH", True) not in ["0", None]) and (d.getVar("TRUSTFENCE_SIGN", True) != "1"): + bb.fatal("Only signed U-Boot images can be encrypted. Generate signed images (TRUSTFENCE_SIGN=1) or remove encryption (TRUSTFENCE_ENCRYPT = 0)") if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True) not in [None, "0"]): - if (d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True) != "1"): - bb.warn("It is strongly recommended to encrypt the U-Boot image when using environment encrpytion. Consider defining TRUSTFENCE_UBOOT_ENCRYPT=1") + if (d.getVar("TRUSTFENCE_DEK_PATH", True) in [None, "0"]): + bb.warn("It is strongly recommended to encrypt the U-Boot image when using environment encryption. Consider removing TRUSTFENCE_DEK_PATH = 0") if (len(d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True)) != 32): bb.fatal("Invalid TRUSTFENCE_UBOOT_ENV_DEK length. Define a string formed by 32 hexadecimal characters") } @@ -77,7 +75,7 @@ do_compile () { cp ${S}/build_${config}/${UBOOT_BINARY} ${S}/build_${config}/u-boot-${type}.${UBOOT_SUFFIX} # Secure boot artifacts - if [ "${TRUSTFENCE_UBOOT_SIGN}" = "1" ] + if [ "${TRUSTFENCE_SIGN}" = "1" ] then cp ${S}/build_${config}/u-boot-signed.imx ${S}/build_${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} fi @@ -119,19 +117,15 @@ do_deploy_append() { cd ${DEPLOYDIR} rm -r ${UBOOT_BINARY}-${type} ${UBOOT_SYMLINK}-${type} ln -sf u-boot-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-${type}.${UBOOT_SUFFIX} - if [ "${TRUSTFENCE_UBOOT_SIGN}" = "1" ] + if [ "${TRUSTFENCE_SIGN}" = "1" ] then install ${S}/build_${config}/SRK_efuses.bin SRK_efuses-${PV}-${PR}.bin ln -sf SRK_efuses-${PV}-${PR}.bin SRK_efuses.bin - if [ "${TRUSTFENCE_UBOOT_ENCRYPT}" = "1" ] + if [ "${TRUSTFENCE_DEK_PATH}" != "0" ] then install ${S}/build_${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ln -sf u-boot-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-encrypted-${type}.${UBOOT_SUFFIX} - - # Move the data encryption key in plain text directly to the deployment directory. - # Do not leave any other copies in the machine. - mv ${S}/build_${config}/dek.bin ${DEPLOYDIR}/dek-${type}.bin else install ${S}/build_${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ln -sf u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-signed-${type}.${UBOOT_SUFFIX} diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index 1844a3fea..6530f01ef 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -19,9 +19,9 @@ TRUSTFENCE_CONSOLE_DISABLE ?= "1" #TRUSTFENCE_CONSOLE_GPIO_ENABLE = "4" # Default secure boot configuration -TRUSTFENCE_CHECK_KERNEL ?= "1" -TRUSTFENCE_UBOOT_SIGN ?= "1" -TRUSTFENCE_UBOOT_ENCRYPT ?= "1" +TRUSTFENCE_SIGN ?= "1" +TRUSTFENCE_SIGN_KEYS_PATH ?= "default" +TRUSTFENCE_DEK_PATH ?= "default" TRUSTFENCE_UBOOT_ENV_DEK ?= "gen_random" # Trustfence initramfs image recipe @@ -49,20 +49,20 @@ python () { if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK") == "gen_random"): d.setVar("TRUSTFENCE_UBOOT_ENV_DEK", str(binascii.hexlify(os.urandom(16)).decode())) - if (d.getVar("TRUSTFENCE_CHECK_KERNEL", True) == "1"): - d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_SECURE_BOOT=y ") - if (d.getVar("TRUSTFENCE_UBOOT_SIGN", True) == "1"): + if (d.getVar("TRUSTFENCE_SIGN_KEYS_PATH") == "default"): + d.setVar("TRUSTFENCE_SIGN_KEYS_PATH", d.getVar("TOPDIR") + "/trustfence"); + + if (d.getVar("TRUSTFENCE_DEK_PATH") == "default"): + d.setVar("TRUSTFENCE_DEK_PATH", d.getVar("TRUSTFENCE_SIGN_KEYS_PATH") + "/dek.bin"); + + if (d.getVar("TRUSTFENCE_SIGN", True) == "1"): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_SIGN_IMAGE=y ") - if d.getVar("TRUSTFENCE_CST_PATH", True): - d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_CST_PATH=\\"%s\\" ' % d.getVar("TRUSTFENCE_CST_PATH")) - if d.getVar("TRUSTFENCE_CSF_SIZE", True): - d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_CSF_SIZE=%s " % d.getVar("TRUSTFENCE_CSF_SIZE")) + if d.getVar("TRUSTFENCE_SIGN_KEYS_PATH", True): + d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_SIGN_KEYS_PATH=\\"%s\\" ' % d.getVar("TRUSTFENCE_SIGN_KEYS_PATH")) if d.getVar("TRUSTFENCE_KEY_INDEX", True): d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_KEY_INDEX=%s " % d.getVar("TRUSTFENCE_KEY_INDEX")) - if (d.getVar("TRUSTFENCE_UBOOT_ENCRYPT", True) == "1"): - d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_ENCRYPT_IMAGE=y ") - if d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE", True): - d.appendVar("UBOOT_EXTRA_CONF", "CONFIG_DEK_SIZE=%s CONFIG_DEK_SIZE_%s=y" % (d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE"),d.getVar("TRUSTFENCE_UBOOT_DEK_SIZE"))) + if (d.getVar("TRUSTFENCE_DEK_PATH", True) not in [None, "0"]): + d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_DEK_PATH=\\"%s\\" ' % d.getVar("TRUSTFENCE_DEK_PATH")) if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True) not in [None, "0"]): d.appendVar("UBOOT_EXTRA_CONF", 'CONFIG_ENV_AES=y CONFIG_ENV_AES_KEY=\\"%s\\"' % d.getVar("TRUSTFENCE_UBOOT_ENV_DEK")) } From d91661d7defc167e677350246e8dbebfc8e4eae3 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Tue, 5 Jul 2016 16:24:12 +0200 Subject: [PATCH 105/117] meta-digi-arm: add support for signed and encrypted uImages https://jira.digi.com/browse/DUB-534 https://jira.digi.com/browse/DUB-602 Signed-off-by: Diaz de Grenu, Jose --- .../recipes-kernel/linux/linux-dey.inc | 15 ++ .../scripts/templates/encrypt_uimage | 48 +++++ meta-digi-arm/scripts/templates/sign_uimage | 31 +++ .../scripts/trustfence-sign-uimage.sh | 195 ++++++++++++++++++ 4 files changed, 289 insertions(+) create mode 100644 meta-digi-arm/scripts/templates/encrypt_uimage create mode 100644 meta-digi-arm/scripts/templates/sign_uimage create mode 100755 meta-digi-arm/scripts/trustfence-sign-uimage.sh diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey.inc b/meta-digi-arm/recipes-kernel/linux/linux-dey.inc index 563fc664e..725c2485c 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey.inc +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey.inc @@ -25,7 +25,22 @@ S = "${WORKDIR}/git" # machine, with different entry points KERNEL_EXTRA_ARGS += "LOADADDR=${UBOOT_ENTRYPOINT}" +# In order to sign and encrypt the uImage, we need to know the address +# in which U-Boot loads the uImage. This is CONFIG_LOADADDR in U-Boot +# configuration file. +UBOOT_CONFIG_LOADADDR = "" +UBOOT_CONFIG_LOADADDR_ccimx6 = "0x12000000" +UBOOT_CONFIG_LOADADDR_ccimx6ul = "0x80800000" + do_deploy_append() { + if [ -n "${TRUSTFENCE_SIGN}" ]; then + export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" + export CONFIG_UIMAGE_LOADADDR="${UBOOT_CONFIG_LOADADDR}" + [ -n "${TRUSTFENCE_KEY_INDEX}" ] && export CONFIG_KEY_INDEX="${TRUSTFENCE_KEY_INDEX}" + [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ] && export CONFIG_DEK_PATH="${TRUSTFENCE_DEK_PATH}" + "${THISDIR}/../../scripts/trustfence-sign-uimage.sh" "${DEPLOYDIR}/${KERNEL_IMAGE_BASE_NAME}.bin" "${DEPLOYDIR}/${KERNEL_IMAGE_BASE_NAME}-signed.bin" + mv "${DEPLOYDIR}/${KERNEL_IMAGE_BASE_NAME}-signed.bin" "${DEPLOYDIR}/${KERNEL_IMAGE_BASE_NAME}.bin" + fi (cd ${DEPLOYDIR} && ln -sf ${KERNEL_IMAGE_BASE_NAME}.bin ${KERNEL_IMAGE_SYMLINK_NAME}) } diff --git a/meta-digi-arm/scripts/templates/encrypt_uimage b/meta-digi-arm/scripts/templates/encrypt_uimage new file mode 100644 index 000000000..3c8e682f4 --- /dev/null +++ b/meta-digi-arm/scripts/templates/encrypt_uimage @@ -0,0 +1,48 @@ +# The syntax for this file is documented in the HAB Code-Signing Tool +# User's Guide which is included in the CST package distributed by NXP +[Header] + Version = 4.1 + Hash Algorithm = sha256 + Engine Configuration = 0 + Certificate Format = X509 + Signature Format = CMS + Engine = CAAM + +[Install SRK] + File = "%srk_table%" + Source index = %key_index% + +[Install CSFK] + File = "%cert_csf%" + +[Authenticate CSF] + +[Install Key] + Verification index = 0 + Target index = 2 + File = "%cert_img%" + +[Authenticate Data] + Verification index = 2 + Blocks = %ivt_ram_start% %ivt_uimage_start% %ivt_size% "%uimage_path%" + +[Authenticate Data] + Verification index = 2 + Blocks = %entrypoint_ram_start% %entrypoint_uimage_offset% %entrypoint_size% "%uimage_path%" + +[Authenticate Data] + Verification index = 2 + Blocks = %header_ram_start% %header_uimage_offset% %header_size% "%uimage_path%" + +[Install Secret Key] + Verification index = 0 + Target index = 0 + Key = "%dek_path%" + Key Length = %dek_len% + Blob address = %dek_offset% + +[Decrypt Data] + Verification index = 0 + Mac Bytes = 16 + Blocks = %r1_ram_start% %r1_uimage_offset% %r1_size% "%uimage_path%", \ + %r2_ram_start% %r2_uimage_offset% %r2_size% "%uimage_path%" diff --git a/meta-digi-arm/scripts/templates/sign_uimage b/meta-digi-arm/scripts/templates/sign_uimage new file mode 100644 index 000000000..c30420a9f --- /dev/null +++ b/meta-digi-arm/scripts/templates/sign_uimage @@ -0,0 +1,31 @@ +# The syntax for this file is documented in the HAB Code Signing Tool +# User's Guid which is included in the CST package distributed by NXP +[Header] + Version = 4.0 + Hash Algorithm = sha256 + Engine Configuration = 0 + Certificate Format = X509 + Signature Format = CMS + +[Install SRK] + File = "%srk_table%" + Source index = %key_index% + + +[Install CSFK] + File = "%cert_csf%" + +[Authenticate CSF] + +[Unlock] + Engine = CAAM + Features = RNG + +[Install Key] + Verification index = 0 + Target index = 2 + File = "%cert_img%" + +[Authenticate Data] + Verification index = 2 + Blocks = %ram_start% %image_offset% %auth_len% "%uimage_path%" diff --git a/meta-digi-arm/scripts/trustfence-sign-uimage.sh b/meta-digi-arm/scripts/trustfence-sign-uimage.sh new file mode 100755 index 000000000..12beb31b8 --- /dev/null +++ b/meta-digi-arm/scripts/trustfence-sign-uimage.sh @@ -0,0 +1,195 @@ +#!/bin/bash +#=============================================================================== +# +# trustfence_sign_uimage.sh +# +# Copyright (C) 2016 by Digi International Inc. +# All rights reserved. +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# +# Description: +# Script for building signed and encrypted kernel uImages using NXP CST. +# +# The following environment variables define the script behaviour: +# CONFIG_SIGN_KEYS_PATH: (mandatory) path to the CST folder by NXP with keys generated. +# CONFIG_UIMAGE_LOADADDR: (mandatory) memory address in which U-Boot loads the uImage +# CONFIG_KEY_INDEX: (optional) key index to use for signing. Default is 0. +# CONFIG_DEK_PATH: (optional) Path to keyfile. Define it to generate +# encrypted images +# +#=============================================================================== + +# Negative offset with respect to CONFIG_UIMAGE_LOADADDR in which U-Boot +# copies the DEK blob. +DEK_BLOB_OFFSET="0x100" +CONFIG_CSF_SIZE="0x4000" + +UIMAGE_PATH="$(readlink -e ${1})" +TARGET="$(readlink -m ${2})" +SCRIPT_BASEDIR="$(cd $(dirname ${0}) && pwd)" + +# Check arguments +if [ -z "${CONFIG_SIGN_KEYS_PATH}" ]; then + echo "Undefined CONFIG_SIGN_KEYS_PATH"; + exit 1 +fi +[ -d "${CONFIG_SIGN_KEYS_PATH}" ] || mkdir "${CONFIG_SIGN_KEYS_PATH}" + +if [ -n "${CONFIG_DEK_PATH}" ]; then + if [ ! -f "${CONFIG_DEK_PATH}" ]; then + echo "DEK not found. Generating random 256 bit DEK." + [ -d $(dirname ${CONFIG_DEK_PATH}) ] || mkdir -p $(dirname ${CONFIG_DEK_PATH}) + dd if=/dev/urandom of="${CONFIG_DEK_PATH}" bs=32 count=1 + fi + dek_size="$((8 * $(stat -L -c %s ${CONFIG_DEK_PATH})))" + if [ "${dek_size}" != "128" ] && [ "${dek_size}" != "192" ] && [ "${dek_size}" != "256" ]; then + echo "Invalid DEK size: ${dek_size} bits. Valid sizes are 128, 192 and 256 bits" + exit 1 + fi + ENCRYPT="true" +fi +if [ -z "${CONFIG_UIMAGE_LOADADDR}" ]; then + echo "Undefined CONFIG_UIMAGE_LOADADDR" + exit 1 +fi + +# Default values +[ -z "${CONFIG_KEY_INDEX}" ] && CONFIG_KEY_INDEX="0" +CONFIG_KEY_INDEX_1="$((CONFIG_KEY_INDEX + 1))" +[ -z "${CONFIG_DEK_SIZE}" ] && CONFIG_DEK_SIZE="128" + +SRK_KEYS="$(echo ${CONFIG_SIGN_KEYS_PATH}/crts/SRK*crt.pem | sed s/\ /\,/g)" +CERT_CSF="$(echo ${CONFIG_SIGN_KEYS_PATH}/crts/CSF${CONFIG_KEY_INDEX_1}*crt.pem)" +CERT_IMG="$(echo ${CONFIG_SIGN_KEYS_PATH}/crts/IMG${CONFIG_KEY_INDEX_1}*crt.pem)" + +n_commas="$(echo ${SRK_KEYS} | grep -o "," | wc -l)" + +if [ "${n_commas}" -eq 3 ] && [ -f "${CERT_CSF}" ] && [ -f "${CERT_IMG}" ]; then + # PKI tree already exists. + echo "Using existing PKI tree" +elif [ "${n_commas}" -eq 0 ] || [ ! -f "${CERT_CSF}" ] || [ ! -f "${CERT_IMG}" ]; then + # Generate PKI + trustfence-gen-pki.sh "${CONFIG_SIGN_KEYS_PATH}" + + SRK_KEYS="$(echo ${CONFIG_SIGN_KEYS_PATH}/crts/SRK*crt.pem | sed s/\ /\,/g)" + CERT_CSF="$(echo ${CONFIG_SIGN_KEYS_PATH}/crts/CSF${CONFIG_KEY_INDEX_1}*crt.pem)" + CERT_IMG="$(echo ${CONFIG_SIGN_KEYS_PATH}/crts/IMG${CONFIG_KEY_INDEX_1}*crt.pem)" +else + echo "Inconsistent CST folder." + exit 1 +fi + +SRK_TABLE="$(pwd)/SRK_table.bin" + +# Other constants +GAP_FILLER="0x00" + +# Compute dek blob size in bytes: +# header (8) + 256-bit AES key (32) + MAC (16) + custom key size in bytes +dek_blob_size="$((8 + 32 + 16 + CONFIG_DEK_SIZE/8))" +dek_blob_offset="$((CONFIG_UIMAGE_LOADADDR - DEK_BLOB_OFFSET))" + +# Compute the layout: sizes and offsets. +uimage_size="$(stat -L -c %s ${UIMAGE_PATH})" +uimage_offset="0x0" +pad_len="$((uimage_size - uimage_size % 0x1000 + 0x1000))" +auth_len="$((pad_len + 0x20))" +sig_len="$((auth_len + CONFIG_CSF_SIZE))" + +ivt_uimage_start="$((auth_len - 0x20))" +ivt_ram_start="$((CONFIG_UIMAGE_LOADADDR + ivt_uimage_start))" +ivt_size="0x20" +csf_ram_start="$((ivt_ram_start + ivt_size))" +entrypoint_uimage_offset="0x1000" +entrypoint_ram_start="$((CONFIG_UIMAGE_LOADADDR + entrypoint_uimage_offset))" +entrypoint_size="0x20" +header_uimage_offset="0x0" +header_ram_start="${CONFIG_UIMAGE_LOADADDR}" +header_size="0x40" + +r1_uimage_offset="${header_size}" +r1_ram_start="$((CONFIG_UIMAGE_LOADADDR + r1_uimage_offset))" +r1_size="$((entrypoint_uimage_offset - header_size ))" +r2_uimage_offset="$((entrypoint_uimage_offset + entrypoint_size))" +r2_ram_start="$((CONFIG_UIMAGE_LOADADDR + r2_uimage_offset))" +r2_size="$((ivt_uimage_start - (entrypoint_uimage_offset + entrypoint_size)))" + +# Generate actual CSF descriptor file from template +if [ "${ENCRYPT}" = "true" ]; then + sed -e "s,%ram_start%,${CONFIG_UIMAGE_LOADADDR},g" \ + -e "s,%srk_table%,${SRK_TABLE},g " \ + -e "s,%cert_csf%,${CERT_CSF},g" \ + -e "s,%cert_img%,${CERT_IMG},g" \ + -e "s,%uimage_path%,${TARGET},g" \ + -e "s,%key_index%,${CONFIG_KEY_INDEX},g" \ + -e "s,%dek_len%,${dek_size},g" \ + -e "s,%dek_path%,${CONFIG_DEK_PATH},g" \ + -e "s,%dek_offset%,${dek_blob_offset},g" \ + -e "s,%ivt_uimage_start%,${ivt_uimage_start},g" \ + -e "s,%ivt_ram_start%,${ivt_ram_start},g" \ + -e "s,%ivt_size%,${ivt_size},g" \ + -e "s,%entrypoint_uimage_offset%,${entrypoint_uimage_offset},g" \ + -e "s,%entrypoint_ram_start%,${entrypoint_ram_start},g" \ + -e "s,%entrypoint_size%,${entrypoint_size},g" \ + -e "s,%header_uimage_offset%,${header_uimage_offset},g" \ + -e "s,%header_ram_start%,${header_ram_start},g" \ + -e "s,%header_size%,${header_size},g" \ + -e "s,%r1_uimage_offset%,${r1_uimage_offset},g" \ + -e "s,%r1_ram_start%,${r1_ram_start},g" \ + -e "s,%r1_size%,${r1_size},g" \ + -e "s,%r2_uimage_offset%,${r2_uimage_offset},g" \ + -e "s,%r2_ram_start%,${r2_ram_start},g" \ + -e "s,%r2_size%,${r2_size},g" \ + "${SCRIPT_BASEDIR}/templates/encrypt_uimage" > csf_descriptor +else + sed -e "s,%ram_start%,${CONFIG_UIMAGE_LOADADDR},g" \ + -e "s,%srk_table%,${SRK_TABLE},g" \ + -e "s,%image_offset%,${uimage_offset},g" \ + -e "s,%auth_len%,${auth_len},g" \ + -e "s,%cert_csf%,${CERT_CSF},g" \ + -e "s,%cert_img%,${CERT_IMG},g" \ + -e "s,%uimage_path%,${TARGET},g" \ + -e "s,%key_index%,${CONFIG_KEY_INDEX},g" \ + "${SCRIPT_BASEDIR}/templates/sign_uimage" > csf_descriptor +fi + +# Generate SRK tables +srktool --hab_ver 4 --certs "${SRK_KEYS}" --table "${SRK_TABLE}" --efuses /dev/null --digest sha256 +if [ $? -ne 0 ]; then + echo "[ERROR] Could not generate SRK tables" + exit 1 +fi + +# Pad to IVT +objcopy -I binary -O binary --pad-to "${pad_len}" --gap-fill="${GAP_FILLER}" "${UIMAGE_PATH}" "${TARGET}" + +# Generate and attach IVT +# Fields: header, jump location, reserved (0), DCD pointer (null) +# boot data (null), self pointer, CSF pointer, reserved (0) +IVT_HEADER="0x402000D1" +printf "0: %.8x" ${IVT_HEADER} | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 > ivt +printf "0: %.8x" "${entrypoint_ram_start}" | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 >> ivt +printf "0: %.8x" 0 | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 >> ivt +printf "0: %.8x" 0 | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 >> ivt +printf "0: %.8x" 0 | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 >> ivt +printf "0: %.8x" "${ivt_ram_start}" | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 >> ivt +printf "0: %.8x" "${csf_ram_start}" | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 >> ivt +printf "0: %.8x" 0 | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 >> ivt +cat ivt >> "${TARGET}" + +CURRENT_PATH="$(pwd)" +cst -o "${CURRENT_PATH}/csf.bin" -i "${CURRENT_PATH}/csf_descriptor" +if [ $? -ne 0 ]; then + echo "[ERROR] Could not generate CSF" + exit 1 +fi + +cat csf.bin >> "${TARGET}" + +objcopy -I binary -O binary --pad-to "${sig_len}" --gap-fill="${GAP_FILLER}" "${TARGET}" +echo "Signed uImage at ${TARGET}" +rm -f "${SRK_TABLE}" csf_descriptor csf.bin ivt 2> /dev/null From 3f25006148a72347319dff1393fb42903da42aff Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Mon, 18 Jul 2016 17:17:41 +0200 Subject: [PATCH 106/117] meta-digi-arm: u-boot: copy signed and encrypted artifacts After commit b0a766eafc8 in the U-Boot repository, both signed and encrypted images will be generated. Copy both of them to the deploy folder https://jira.digi.com/browse/DUB-642 Signed-off-by: Diaz de Grenu, Jose --- .../recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index 4f0a3051a..be5e8fbdc 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -78,6 +78,10 @@ do_compile () { if [ "${TRUSTFENCE_SIGN}" = "1" ] then cp ${S}/build_${config}/u-boot-signed.imx ${S}/build_${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} + if [ "${TRUSTFENCE_DEK_PATH}" != "0" ] + then + cp ${S}/build_${config}/u-boot-encrypted.imx ${S}/build_${config}/u-boot-encrypted-${type}.${UBOOT_SUFFIX} + fi fi fi done @@ -122,13 +126,13 @@ do_deploy_append() { install ${S}/build_${config}/SRK_efuses.bin SRK_efuses-${PV}-${PR}.bin ln -sf SRK_efuses-${PV}-${PR}.bin SRK_efuses.bin + install ${S}/build_${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + ln -sf u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-signed-${type}.${UBOOT_SUFFIX} + if [ "${TRUSTFENCE_DEK_PATH}" != "0" ] then - install ${S}/build_${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} + install ${S}/build_${config}/u-boot-encrypted-${type}.${UBOOT_SUFFIX} u-boot-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ln -sf u-boot-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-encrypted-${type}.${UBOOT_SUFFIX} - else - install ${S}/build_${config}/u-boot-signed-${type}.${UBOOT_SUFFIX} u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} - ln -sf u-boot-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} u-boot-signed-${type}.${UBOOT_SUFFIX} fi fi fi From ebbe0e6d3eb27ab8b8a3f5e292251d78277be7d8 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Tue, 19 Jul 2016 18:03:09 +0200 Subject: [PATCH 107/117] Revert "meta-digi-arm: u-boot: use v2015.04 maintenance branch" The correct U-Boot branch to be used with dey-2.0/master is v2015.04/master, as it contains the latest development changes (just like dey-2.0/master). This reverts commit 728619a5bc1633cc829b3455fbb8f18ce01c9d0f. --- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index be5e8fbdc..fbd22bc93 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -11,7 +11,8 @@ DEPENDS += "${@base_conditional('TRUSTFENCE_SIGN', '1', 'trustfence-cst-native', PROVIDES += "u-boot" -SRCBRANCH = "v2015.04/maint" +SRCBRANCH = "v2015.04/master" +SRCBRANCH_ccimx6ul = "v2015.04/master" SRCREV = "${AUTOREV}" # Select internal or Github U-Boot repo From d9c4a586f21501c2010adb848835c49e03f2d364 Mon Sep 17 00:00:00 2001 From: Hector Palacios Date: Wed, 20 Jul 2016 16:33:04 +0200 Subject: [PATCH 108/117] ccimx6ulstarter: add device tree file for -id129 board This device tree file corresponds to StarterBoard with ID=129 which corresponds to smart part number CC-WMX6UL-START. Signed-off-by: Hector Palacios --- meta-digi-arm/conf/machine/ccimx6ulstarter.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf index 73b423e07..6593173e4 100644 --- a/meta-digi-arm/conf/machine/ccimx6ulstarter.conf +++ b/meta-digi-arm/conf/machine/ccimx6ulstarter.conf @@ -13,6 +13,7 @@ UBOOT_CONFIG[ccimx6ulstarter] = "ccimx6ulstarter_defconfig" KERNEL_DEVICETREE ?= " \ imx6ul-ccimx6ulstarter.dtb \ imx6ul-ccimx6ulstarter-wb.dtb \ + imx6ul-ccimx6ulstarter-id129.dtb \ " SERIAL_CONSOLES = "115200;ttymxc4" From 5ee4340942d7f0d4697addcb4d111a1a290fd1ce Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Thu, 21 Jul 2016 11:20:03 +0200 Subject: [PATCH 109/117] meta-digi-arm: u-boot: [cosmetic] correct DEY macro name https://jira.digi.com/browse/DEL-2804 Signed-off-by: Diaz de Grenu, Jose --- meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb index fbd22bc93..1abe6a6ea 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2015.04.bb @@ -36,7 +36,7 @@ UBOOT_EXTRA_CONF ?= "" python __anonymous() { if (d.getVar("TRUSTFENCE_DEK_PATH", True) not in ["0", None]) and (d.getVar("TRUSTFENCE_SIGN", True) != "1"): - bb.fatal("Only signed U-Boot images can be encrypted. Generate signed images (TRUSTFENCE_SIGN=1) or remove encryption (TRUSTFENCE_ENCRYPT = 0)") + bb.fatal("Only signed U-Boot images can be encrypted. Generate signed images (TRUSTFENCE_SIGN=1) or remove encryption (TRUSTFENCE_DEK_PATH = 0)") if (d.getVar("TRUSTFENCE_UBOOT_ENV_DEK", True) not in [None, "0"]): if (d.getVar("TRUSTFENCE_DEK_PATH", True) in [None, "0"]): bb.warn("It is strongly recommended to encrypt the U-Boot image when using environment encryption. Consider removing TRUSTFENCE_DEK_PATH = 0") From 84cad4e4ade761973f81c51185e65fb9da888666 Mon Sep 17 00:00:00 2001 From: "Diaz de Grenu, Jose" Date: Thu, 21 Jul 2016 11:38:01 +0200 Subject: [PATCH 110/117] meta-digi-arm: linux-dey: fix check for uImage signing TRUSTFENCE_SIGN can be defined to "0" to explicitly disable uImage sign and encryption. https://jira.digi.com/browse/DEL-2803 Signed-off-by: Diaz de Grenu, Jose --- meta-digi-arm/recipes-kernel/linux/linux-dey.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey.inc b/meta-digi-arm/recipes-kernel/linux/linux-dey.inc index 725c2485c..19c71f113 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey.inc +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey.inc @@ -33,7 +33,7 @@ UBOOT_CONFIG_LOADADDR_ccimx6 = "0x12000000" UBOOT_CONFIG_LOADADDR_ccimx6ul = "0x80800000" do_deploy_append() { - if [ -n "${TRUSTFENCE_SIGN}" ]; then + if [ "${TRUSTFENCE_SIGN}" = "1" ]; then export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" export CONFIG_UIMAGE_LOADADDR="${UBOOT_CONFIG_LOADADDR}" [ -n "${TRUSTFENCE_KEY_INDEX}" ] && export CONFIG_KEY_INDEX="${TRUSTFENCE_KEY_INDEX}" From b81ce399f6f8a93964fec2e3c91d965624c711e8 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 21 Jul 2016 12:17:03 +0200 Subject: [PATCH 111/117] wpa-supplicant: add CC6UL specific configuration file We need a different configuration file, because the SoftAP functionality is supported using the hostapd package instead of the wpa_supplicant. https://jira.digi.com/browse/DEL-2744 Signed-off-by: Isaac Hermida --- .../wpa-supplicant/ccimx6ul/wpa_supplicant.conf-sane | 11 +++++++++++ .../wpa-supplicant/wpa-supplicant_%.bbappend | 2 ++ 2 files changed, 13 insertions(+) create mode 100644 meta-digi-dey/recipes-connectivity/wpa-supplicant/wpa-supplicant/ccimx6ul/wpa_supplicant.conf-sane diff --git a/meta-digi-dey/recipes-connectivity/wpa-supplicant/wpa-supplicant/ccimx6ul/wpa_supplicant.conf-sane b/meta-digi-dey/recipes-connectivity/wpa-supplicant/wpa-supplicant/ccimx6ul/wpa_supplicant.conf-sane new file mode 100644 index 000000000..a180d27d8 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/wpa-supplicant/wpa-supplicant/ccimx6ul/wpa_supplicant.conf-sane @@ -0,0 +1,11 @@ +ctrl_interface=/var/run/wpa_supplicant +ctrl_interface_group=0 +fast_reauth=1 +update_config=1 + +ap_scan=1 +network={ + scan_ssid=1 + ssid="" + key_mgmt=NONE +} diff --git a/meta-digi-dey/recipes-connectivity/wpa-supplicant/wpa-supplicant_%.bbappend b/meta-digi-dey/recipes-connectivity/wpa-supplicant/wpa-supplicant_%.bbappend index d85159e55..045b39c3e 100644 --- a/meta-digi-dey/recipes-connectivity/wpa-supplicant/wpa-supplicant_%.bbappend +++ b/meta-digi-dey/recipes-connectivity/wpa-supplicant/wpa-supplicant_%.bbappend @@ -3,3 +3,5 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" PACKAGECONFIG ?= "openssl" + +PACKAGE_ARCH = "${MACHINE_ARCH}" From 0b5c74e836ea19542c2a52e3ba2d518752ed934d Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Wed, 20 Jul 2016 11:32:52 +0200 Subject: [PATCH 112/117] recipes-bsp: firmware-qualcomm: add different firmware files for country regions We are including two firmware files: one for setting the country to US and the other one to set it to the World Wide Roaming region (SKU 0060). https://jira.digi.com/browse/DEL-2774 Signed-off-by: Isaac Hermida --- .../firmware-qualcomm/firmware-qualcomm.bb | 6 ++++-- .../{bdwlan30.bin => bdwlan30_US.bin} | Bin 8124 -> 8124 bytes .../firmware-qualcomm/bdwlan30_World.bin | Bin 0 -> 8124 bytes 3 files changed, 4 insertions(+), 2 deletions(-) rename meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/{bdwlan30.bin => bdwlan30_US.bin} (98%) create mode 100755 meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/bdwlan30_World.bin diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb index a85fa9930..8a4a37940 100644 --- a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb +++ b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm.bb @@ -13,7 +13,8 @@ FW_QCA6564-BT = " \ " FW_QCA6564-WIFI = " \ - file://bdwlan30.bin \ + file://bdwlan30_US.bin \ + file://bdwlan30_World.bin \ file://LICENCE.atheros_firmware \ file://otp30.bin \ file://qwlan30.bin \ @@ -43,7 +44,8 @@ do_install() { # Wifi firmware install -d ${D}${base_libdir}/firmware/wlan install -m 0644 \ - bdwlan30.bin \ + bdwlan30_US.bin \ + bdwlan30_World.bin \ LICENCE.atheros_firmware \ otp30.bin \ qwlan30.bin \ diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/bdwlan30.bin b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/bdwlan30_US.bin similarity index 98% rename from meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/bdwlan30.bin rename to meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/bdwlan30_US.bin index dfd6a46343a97329173ab2ffc1f204268a9e938a..a46e1986183fa504c6c9eefb65035c4b7221b3cb 100644 GIT binary patch delta 23 fcmdmEzsH_$kNnlkOpFZ7^#Kfw9?cv1*2x0^WqJp- delta 23 ecmdmEzsH_$kNn&KCPoJ4`Tzz-28NA%>*N7e4hAm( diff --git a/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/bdwlan30_World.bin b/meta-digi-arm/recipes-bsp/firmware-qualcomm/firmware-qualcomm/bdwlan30_World.bin new file mode 100755 index 0000000000000000000000000000000000000000..7fe4abdd1e825d5a94f439a1ff696d03fd0a575c GIT binary patch literal 8124 zcmeHMdr(tn7QX?l#Uc_6$Q7aqxl+O-B_NPoPza>J4Iw1RD{z5?XTmd@T3+F$sMt~^ ziZv*rb=~TAXxG{4G;Oy|ooVf3wpDhfGt17F4ztx%#Oe4)YyGEn&v$PEO3}`ayN)yU zgLBXKo!{>~ZwR@Q4>tU)_2OXOy;_W8z%VRz8(ai}0u0-LdBK*$;V$QbzTXNB4dZaI z&54PLKmGWlpl1D380O{m@yD`1d#&`iczZTT(==UFpj9hn=+I!Qtt!)CE3jpW`t!)Z ztYnUtAjKOc_beLgim!$PL|PGQ@mLq>)yz3Q-WwBp`Cy}?KA1oJptS5Ex*boLJH+keP${M4C=JNJ@?Mh6cYT4Wj0kb%*`QA4XNTPnDH+kOxO z;0OTO(hUQSK1WHbEJrG00mq=j4U7U{k*TBv1B{FhpD?v%s};&%R0=U0YHawZ zr71g0u@UNf)zBZ9)nQxRTrfaOt_8rb{*B;2LfxHHH-hL*poKQ$qWIk0&S6dtHR;SIin@_p>Ff)DZf<8w0 zTv< zF0<;_8y;^^xeQZcY4P4s-XiZc-rn91-f;s0*RBgyq(7gfQcL3!lE@Sc-m8zF@*7*0dRZZ>=5DD2)s3T zfZ3+2m#gtrZou55GsDpj8ieUWAJ5>c*&Ms1MfgUa<(ymKVU)+<0b*~q^Ih^XVVsY* zkN37tU4=A8$i+DhxJD}B z{=j&cd#PqIiErSp?r7K7%1JSf|Kb4}#d5A6&hKc`SIgx>U!gCXqgzoYjN$rm{W`kz zbrInC{Z+@dTEx^-){VgISv#!+r{Alefv) z>*DkMYl@2x3mfei9lbx}3G%QL;0F^zNfa4RrO-;N+Fsx+ch$LVo9?l#B?OX4;3d-; z)*Rr`u3F&z+7`sv;wX~gZDn|@FS4bB?^b6S_}-5vCZ!Bd1w51^kXSE4HaYmJ?D^nZ z!{>o5f{dkPbec8Wu5;>L)eJ9!;VBqiDe%@1p^|6G=cpt))tY73I!jztkavSS9?L`V z7I-M07UCJ_^P-wjEgoL@d|t$>a@T_DQ&=ge59JLY)=4&!5_jG_$ZO=Ug}kWdyLmjQ z5AhP|E!IqXp0n6x0G?pJK2JPUUpT`{Wq2qan*GA8*tsAc8xQr%=3ST-s!s>?Rr9$} zA3?@Y3G`;`^LCB12=ej>KFsRwnN|T0mx#z{Y7@iD1zsi0Csb~>Di5gN*m}A2 ziXki{Qj`!$CF-{{KfgzPX6vV=v(@P_x`e8ffvi7hE*5=P>8ks#akhB_{;V)DTDhqp zxh|tmHLm+>$(&Ib_?%EC&WbISHKz?^oz{F(c#Y<-jS$60Zi&;721PsE^S6s<45HvD zK~jV=wlK+@+MhX=`$6H=vU){t_A$+85M{PuZu?xvY|mVefEyi}NGPK7
  • U(;d`1 z+Ua5ePaG02N{!OQHE!Omd@bif{&hVO5Q8TPmEy`xFQmMjF`=5&xr(1%_gq-ASS>A= zZBIL@a_at3JX@X`o-3(LcroQf)_Kj9!s``RtFPCDt&0vz5@$#YWZN@_RA+U6E4fxK z+$JI+IHe0|+< z9&)qnA=XlN%ReX>58Y!2v57Ky@@B+R(}tn9-#!1OM{6qT_P_Pcho9zG9X$1y zkM7)AY*&}irlH|;Z+o<+2pnF0{Vl{t4>pVK9)FMit@ySS8$6}MbzU=1?C{{uuElo5 zWPe%Buwd(19-KMb5Y@(B=QZ+PSPM97Uuu$1Y`^abz-!qwNsE0a@Se+zQeBU97g+_*M<<@;;XGjpJ4uT5Q2;Q?w5PS>dbKE1#99#}I)7#Ahz4F2gM+UzB z9N*NY+E~toTOYPw_~h6<5(>OX?3WdjCxo0s$+#~weTW?jUs Date: Wed, 20 Jul 2016 13:42:52 +0200 Subject: [PATCH 113/117] kernel-module-qualcomm: load specific firmware file per region The country region is programmed in the OTP bits. Based on that value we need to load the firmware file for the specific country region. https://jira.digi.com/browse/DEL-2774 Signed-off-by: Isaac Hermida --- .../kernel-module-qualcomm/qualcomm-pre-up | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up index f9f4e232d..6300dd65d 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up @@ -17,7 +17,8 @@ [ "${IFACE}" != "wlan0" ] && exit 0 -MACFILE="/lib/firmware/wlan/wlan_mac.bin" +FIRMWARE_DIR="/lib/firmware" +MACFILE="${FIRMWARE_DIR}/wlan/wlan_mac.bin" TMP_MACFILE="$(mktemp -t wlan_mac.XXXXXX)" # Read the MACs from DeviceTree. We can have up to four wireless interfaces @@ -49,6 +50,31 @@ if ! cmp -s ${TMP_MACFILE} ${MACFILE}; then fi rm -f ${TMP_MACFILE} +REGION_CODE="$(cat /proc/device-tree/digi,hwid,cert 2>/dev/null)" +US_CODE="0x0" +WW_CODE="0x1" +JP_CODE="0x2" +BDATA_LINK="${FIRMWARE_DIR}/bdwlan30.bin" +# Create a symbolic link to the FW file for the specific country region. +BDATA_SOURCE="${FIRMWARE_DIR}/bdwlan30_US.bin" +case "${REGION_CODE}" in + ${US_CODE}) + logger -t qca6564 "Setting US wireless region";; + ${WW_CODE}|${JP_CODE}) + logger -t qca6564 "Setting WW (world wide) wireless region" + BDATA_SOURCE="${FIRMWARE_DIR}/bdwlan30_World.bin";; + "") + logger -t qca6564 "[WARN] region code not found, using US";; + *) + logger -t qca6564 "[WARN] Invalid region code, using US";; +esac + +# We don't want to rewrite NAND every time we boot so only +# change the link if it is wrong. +if [ ! -e "${BDATA_LINK}" ] || ! cmp -s "${BDATA_LINK}" "${BDATA_SOURCE}"; then + ln -sf "${BDATA_SOURCE}" "${BDATA_LINK}" +fi + # Check the version of modprobe installed to compound the arguments. if readlink -f $(which modprobe) | grep -qs kmod; then MODPROBE_ARGS="-i" From 46c7508ee3013883cef67f666893167f654968c1 Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 21 Jul 2016 10:22:49 +0200 Subject: [PATCH 114/117] kernel-module-qualcomm: add support to override the region code The region code is programmed in the OTP bits. We want to allow to be able to override this behavior by setting the new value as a property in the device tree called "regulatory-domain". This can be done by setting the variable "regdomain=" in uboot or well by defining that entry in the device tree. https://jira.digi.com/browse/DEL-2799 Signed-off-by: Isaac Hermida --- .../kernel-module-qualcomm/qualcomm-pre-up | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up index 6300dd65d..922b0ce17 100644 --- a/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up +++ b/meta-digi-arm/recipes-kernel/kernel-module-qualcomm/kernel-module-qualcomm/qualcomm-pre-up @@ -50,14 +50,25 @@ if ! cmp -s ${TMP_MACFILE} ${MACFILE}; then fi rm -f ${TMP_MACFILE} -REGION_CODE="$(cat /proc/device-tree/digi,hwid,cert 2>/dev/null)" +OTP_REGION_CODE="$(cat /proc/device-tree/digi,hwid,cert 2>/dev/null)" +DTB_REGION_CODE="$(cat /proc/device-tree/wireless/regulatory-domain 2>/dev/null)" US_CODE="0x0" WW_CODE="0x1" JP_CODE="0x2" +# Check if the DTB_REGION_CODE is in the list of valid codes, +# if not use the OTP programmed value. +case "${DTB_REGION_CODE}" in + ${US_CODE}|${WW_CODE}|${JP_CODE}) + REGULATORY_DOMAIN=${DTB_REGION_CODE};; + *) + logger -t qca6564 "[ERROR] Invalid region code in device tree, using OTP value" + REGULATORY_DOMAIN=${OTP_REGION_CODE};; +esac + BDATA_LINK="${FIRMWARE_DIR}/bdwlan30.bin" # Create a symbolic link to the FW file for the specific country region. BDATA_SOURCE="${FIRMWARE_DIR}/bdwlan30_US.bin" -case "${REGION_CODE}" in +case "${REGULATORY_DOMAIN}" in ${US_CODE}) logger -t qca6564 "Setting US wireless region";; ${WW_CODE}|${JP_CODE}) From 1e843089fee69e3fec3bfa8561525c5063af18ac Mon Sep 17 00:00:00 2001 From: Isaac Hermida Date: Thu, 21 Jul 2016 18:58:56 +0200 Subject: [PATCH 115/117] ccimx6ul: defconfig: update config file for ccimx6ul Add support for ADC using the MCA driver. Signed-off-by: Isaac Hermida --- .../recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig index 60b4ce0fe..78a7376f7 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey-4.1/ccimx6ul/defconfig @@ -313,6 +313,7 @@ CONFIG_STAGING=y CONFIG_STAGING_MEDIA=y # CONFIG_IOMMU_SUPPORT is not set CONFIG_IIO=y +CONFIG_MCA_CC6UL_ADC=y CONFIG_PWM=y CONFIG_PWM_IMX=y # CONFIG_RESET_GPIO is not set From 4ca3aa176aed62d417feefe3dbf76ba77aeac782 Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Tue, 12 Jul 2016 19:34:14 +0200 Subject: [PATCH 116/117] trustfence-initramfs-init: clean mount rootfs warnings Get filesystem type of rootfs block device and pass it explicitly to the mount command to clean following warnings on boot: EXT4-fs (dm-0): couldn't mount as ext3 due to feature incompatibilities EXT4-fs (dm-0): couldn't mount as ext2 due to feature incompatibilities Signed-off-by: Javier Viguera --- .../trustfence/trustfence-initramfs/trustfence-initramfs-init | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init index 8accf80df..a6c6f2f6e 100644 --- a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init +++ b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init @@ -58,7 +58,8 @@ wipe -cfs ${TMP_KEYFILE} # Mount mapped device mkdir -p /newroot -mount ${root} /newroot +FSTYPE="$(blkid ${root} | sed -e 's,.*TYPE="\([^"]\+\)".*,\1,g')" +mount ${FSTYPE:+-t ${FSTYPE}} ${root} /newroot # # Clean-up and do the switch_root to the final rootfs From a8c50c16eab0a49c605121339e6efd872aa1a8ea Mon Sep 17 00:00:00 2001 From: Javier Viguera Date: Thu, 21 Jul 2016 19:29:26 +0200 Subject: [PATCH 117/117] trustfence-initramfs-init: remove cryptsetup from init script New functionality has been implemented in trustfence-tool application, so there is no need to call cryptsetup command. Signed-off-by: Javier Viguera --- .../trustfence-initramfs/trustfence-initramfs-init | 5 +---- meta-digi-dey/recipes-core/trustfence/trustfence-tool_1.0.bb | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init index a6c6f2f6e..441635f73 100644 --- a/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init +++ b/meta-digi-dey/recipes-core/trustfence/trustfence-initramfs/trustfence-initramfs-init @@ -48,13 +48,10 @@ fi root="$(findfs ${root})" # Open LUKS encrypted device -TMP_KEYFILE="$(mktemp keyfile.XXXXXX)" -trustfence-tool -f ${TMP_KEYFILE} -if cryptsetup --key-file ${TMP_KEYFILE} open --type luks ${root} cryptroot; then +if trustfence-tool ${root} cryptroot; then # Reset root variable to the decrypted mapped device root="/dev/mapper/cryptroot" fi -wipe -cfs ${TMP_KEYFILE} # Mount mapped device mkdir -p /newroot diff --git a/meta-digi-dey/recipes-core/trustfence/trustfence-tool_1.0.bb b/meta-digi-dey/recipes-core/trustfence/trustfence-tool_1.0.bb index 468bb3ca6..88eb069b9 100644 --- a/meta-digi-dey/recipes-core/trustfence/trustfence-tool_1.0.bb +++ b/meta-digi-dey/recipes-core/trustfence/trustfence-tool_1.0.bb @@ -6,7 +6,7 @@ LICENSE = "CLOSED" SRC_URI = "${DIGI_PKG_SRC}/${BP}.tar.gz" -SRC_URI[md5sum] = "aa9b8b530402f412886e1f8f1da466e6" -SRC_URI[sha256sum] = "dbeb718158a4a55552bb3a2c03990df3167331bb772925f824ebc02348e29089" +SRC_URI[md5sum] = "1140b71d0e619001b677117e8938be48" +SRC_URI[sha256sum] = "13eecca139dfb6470204c75291c5791144dea098653f52d39d847b2aee3fe19b" inherit bin_package