diff --git a/README.md b/README.md index 04725c29b..c1c5d7978 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Digi Embedded Yocto (DEY) 5.0 -## Release 5.0-r2 +## Release 5.0-r3 This document provides information about Digi Embedded Yocto, Digi International's professional embedded Yocto development environment. @@ -114,11 +114,15 @@ Documentation is available online at https://www.digi.com/resources/documentatio # Downloads -* Demo images: https://ftp1.digi.com/support/digiembeddedyocto/5.0/r2/images/ -* Software Development Kit (SDK): https://ftp1.digi.com/support/digiembeddedyocto/5.0/r2/sdk/ +* Demo images: https://ftp1.digi.com/support/digiembeddedyocto/5.0/r3/images/ +* Software Development Kit (SDK): https://ftp1.digi.com/support/digiembeddedyocto/5.0/r3/sdk/ # Release Changelog +## 5.0-r3 + +TODO + ## 5.0-r2 * ST-based platforms diff --git a/meta-digi-arm/classes/fsl-eula-graphics.bbclass b/meta-digi-arm/classes/fsl-eula-graphics.bbclass index 7d9f0653e..81b9304c6 100644 --- a/meta-digi-arm/classes/fsl-eula-graphics.bbclass +++ b/meta-digi-arm/classes/fsl-eula-graphics.bbclass @@ -1,9 +1,11 @@ # fsl-eula-graphics.bbclass extends the naming scheme in fsl-eula.bbclass # to allow for graphics-backend-specific archives. +IMX_PACKAGE_NAME:append:class-target = "${IMX_PACKAGE_NAME_APPEND}${IMX_PACKAGE_NAME_APPEND_MALI}" +SRC_URI_NAME:append:class-target = "${IMX_PACKAGE_NAME_APPEND}${IMX_PACKAGE_NAME_APPEND_MALI}" IMX_PACKAGE_NAME_APPEND = "" IMX_PACKAGE_NAME_APPEND:class-target = \ "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '-wayland', \ bb.utils.contains('DISTRO_FEATURES', 'x11', '-x11', \ '-fb', d), d)}" -IMX_PACKAGE_NAME:append:class-target = "${IMX_PACKAGE_NAME_APPEND}" -SRC_URI_NAME:append:class-target = "${IMX_PACKAGE_NAME_APPEND}" +IMX_PACKAGE_NAME_APPEND_MALI = "" +IMX_PACKAGE_NAME_APPEND_MALI:mx95-nxp-bsp = "-mali" diff --git a/meta-digi-arm/classes/image_types_digi.bbclass b/meta-digi-arm/classes/image_types_digi.bbclass index 64cdc6d18..2bcb1b5b4 100644 --- a/meta-digi-arm/classes/image_types_digi.bbclass +++ b/meta-digi-arm/classes/image_types_digi.bbclass @@ -3,7 +3,8 @@ inherit image_types ################################################################################ # BOOT IMAGES # ################################################################################ -BOOTLOADER_IMAGE_RECIPE ?= "u-boot" +# Boot partition size in KiB, (default 64MiB) +BOARD_BOOTIMAGE_PARTITION_SIZE ?= "65536" def TRUSTFENCE_BOOTIMAGE_DEPENDS(d): tf_initramfs = d.getVar('TRUSTFENCE_INITRAMFS_IMAGE') or "" @@ -13,7 +14,7 @@ do_image_boot_vfat[depends] += " \ coreutils-native:do_populate_sysroot \ dosfstools-native:do_populate_sysroot \ mtools-native:do_populate_sysroot \ - ${BOOTLOADER_IMAGE_RECIPE}:do_deploy \ + virtual/bootloader:do_deploy \ virtual/kernel:do_deploy \ ${@TRUSTFENCE_BOOTIMAGE_DEPENDS(d)} \ " @@ -82,7 +83,7 @@ do_image_boot_vfat[imgsuffix] = "." do_image_boot_ubifs[depends] += " \ mtd-utils-native:do_populate_sysroot \ - ${BOOTLOADER_IMAGE_RECIPE}:do_deploy \ + virtual/bootloader:do_deploy \ virtual/kernel:do_deploy \ ${@TRUSTFENCE_BOOTIMAGE_DEPENDS(d)} \ " @@ -161,7 +162,7 @@ IMAGE_TYPEDEP:recovery.vfat = "boot.vfat" do_image_recovery_ubifs[depends] += " \ mtd-utils-native:do_populate_sysroot \ - ${BOOTLOADER_IMAGE_RECIPE}:do_deploy \ + virtual/bootloader:do_deploy \ virtual/kernel:do_deploy \ ${RECOVERY_INITRAMFS_IMAGE}:do_image_complete \ " @@ -229,10 +230,10 @@ trustence_sign_cpio() { # if [ "${TRUSTFENCE_SIGN_ARTIFACTS}" = "1" ] && [ "${TRUSTFENCE_SIGN_FIT_NXP}" = "0" ]; then # Set environment variables for trustfence configuration - export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" + export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_KEYS_PATH}" [ -n "${TRUSTFENCE_KEY_INDEX}" ] && export CONFIG_KEY_INDEX="${TRUSTFENCE_KEY_INDEX}" [ -n "${TRUSTFENCE_SRK_REVOKE_MASK}" ] && export SRK_REVOKE_MASK="${TRUSTFENCE_SRK_REVOKE_MASK}" - [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ] && export CONFIG_DEK_PATH="${TRUSTFENCE_DEK_PATH}" + [ "${TRUSTFENCE_ENCRYPT}" = "1" ] && export CONFIG_DEK_PATH="${TRUSTFENCE_KEYS_PATH}/${TRUSTFENCE_DEK_ENCRYPT_KEYNAME}" # Sign/encrypt the ramdisk trustfence-sign-artifact.sh -p "${DIGI_SOM}" -i "${1}" "${1}.tf" else @@ -251,7 +252,7 @@ IMAGE_TYPES += "cpio.gz.u-boot.tf" do_image_squashfs[postfuncs] += "${@oe.utils.vartrue('TRUSTFENCE_SIGN_ARTIFACTS', 'rootfs_sign', '', d)}" rootfs_sign() { # Set environment variables for trustfence configuration - export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" + export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_KEYS_PATH}" [ -n "${CONFIG_KEY_INDEX}" ] && export CONFIG_KEY_INDEX="${TRUSTFENCE_KEY_INDEX}" ROOTFS_IMAGE="${IMGDEPLOYDIR}/${IMAGE_NAME}.squashfs" @@ -262,96 +263,4 @@ rootfs_sign() { } rootfs_sign[dirs] = "${DEPLOY_DIR_IMAGE}" -do_image_squashfs[vardeps] += "TRUSTFENCE_SIGN_KEYS_PATH TRUSTFENCE_KEY_INDEX" - -################################################################################ -# SDCARD IMAGES # -################################################################################ -# Set alignment to 4MB [in KiB] -IMAGE_ROOTFS_ALIGNMENT = "4096" - -# Boot partition size in KiB, (default 64MiB) -BOARD_BOOTIMAGE_PARTITION_SIZE ??= "65536" - -# SD card image name -SDIMG = "${IMGDEPLOYDIR}/${IMAGE_NAME}.sdcard" - -BOOTLOADER_SEEK_USERDATA ?= "1" - -SDIMG_BOOTLOADER ?= "${DEPLOY_DIR_IMAGE}/${UBOOT_SYMLINK}" -SDIMG_BOOTFS_TYPE ?= "boot.vfat" -SDIMG_BOOTFS = "${IMGDEPLOYDIR}/${IMAGE_NAME}.${SDIMG_BOOTFS_TYPE}" -SDIMG_ROOTFS_TYPE ?= "ext4" -SDIMG_ROOTFS = "${IMGDEPLOYDIR}/${IMAGE_NAME}.${SDIMG_ROOTFS_TYPE}" - -do_image_sdcard[depends] = " \ - dosfstools-native:do_populate_sysroot \ - mtools-native:do_populate_sysroot \ - parted-native:do_populate_sysroot \ - ${BOOTLOADER_IMAGE_RECIPE}:do_deploy \ - virtual/kernel:do_deploy \ -" - -# -# Create an image that can be written onto an SD card using dd. -# -# The disk layout used is: -# -# 1. Not partitioned : reserved for bootloader (u-boot) -# 2. BOOT PARTITION : kernel and device tree blobs -# 3. ROOTFS PARTITION : rootfs -# -# 4MiB BOOT_SPACE ROOTFS_SIZE -# <------------> <--------------------> <------------------------------> -# +--------------+----------------------+--------------------------------+ -# | U-BOOT (RAW) | BOOT PARTITION (FAT) | ROOTFS PARTITION (EXT4) | -# +--------------+----------------------+--------------------------------+ -# ^ ^ ^ ^ -# | | | | -# 0 4MiB 4MiB + BOOT_SPACE SDIMG_SIZE -# -IMAGE_CMD:sdcard() { - # Align boot partition and calculate total sdcard image size - BOOT_SPACE_ALIGNED="$(expr \( \( ${BOARD_BOOTIMAGE_PARTITION_SIZE} + ${IMAGE_ROOTFS_ALIGNMENT} - 1 \) / ${IMAGE_ROOTFS_ALIGNMENT} \) \* ${IMAGE_ROOTFS_ALIGNMENT})" - SDIMG_SIZE="$(expr ${IMAGE_ROOTFS_ALIGNMENT} + ${BOOT_SPACE_ALIGNED} + $ROOTFS_SIZE)" - - # Initialize sdcard image file - dd if=/dev/zero of=${SDIMG} bs=1024 count=0 seek=${SDIMG_SIZE} - - # Create partition table, boot partition (with bootable flag) and rootfs partition (to the end of the disk) - parted -s ${SDIMG} mklabel msdos - parted -s ${SDIMG} unit KiB mkpart primary fat32 ${IMAGE_ROOTFS_ALIGNMENT} $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) - parted -s ${SDIMG} set 1 boot on - parted -s ${SDIMG} -- unit KiB mkpart primary ext2 $(expr ${IMAGE_ROOTFS_ALIGNMENT} \+ ${BOOT_SPACE_ALIGNED}) -1s - parted -s ${SDIMG} unit KiB print - - # Set u-boot image to flash depending on whether TRUSTFENCE_SIGN is enabled - if [ "${SWUPDATE_UBOOTIMG}" = "true" ]; then - SDIMG_BOOT="$(readlink -e ${SDIMG_BOOTLOADER})" - else - if [ "${TRUSTFENCE_SIGN}" = "1" ]; then - if [ "${BOOTLOADER_IMAGE_RECIPE}" = "u-boot" ]; then - SDIMG_BOOT="$(readlink -e ${SDIMG_BOOTLOADER} | sed -e 's,u-boot-,u-boot-signed-,g')" - else - SDIMG_BOOT="$(readlink -e ${SDIMG_BOOTLOADER} | sed -e 's,imx-boot-,imx-boot-signed-,g')" - fi - else - SDIMG_BOOT="$(readlink -e ${SDIMG_BOOTLOADER})" - fi - fi - - # Decompress rootfs image - gzip -d -k ${SDIMG_ROOTFS}.gz - - # Burn bootloader, boot and rootfs partitions - dd if=${SDIMG_BOOT} of=${SDIMG} conv=notrunc,fsync seek=${BOOTLOADER_SEEK_USERDATA} bs=1K - dd if=${SDIMG_BOOTFS} of=${SDIMG} conv=notrunc,fsync seek=1 bs=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) - dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc,fsync seek=1 bs=$(expr ${IMAGE_ROOTFS_ALIGNMENT} \* 1024 + ${BOOT_SPACE_ALIGNED} \* 1024) - - # Delete the decompressed rootfs image - rm -f ${SDIMG_ROOTFS} -} - -# The sdcard image requires the boot and rootfs images to be built before -IMAGE_TYPEDEP:sdcard = "${SDIMG_BOOTFS_TYPE} ${SDIMG_ROOTFS_TYPE}.gz" - +do_image_squashfs[vardeps] += "TRUSTFENCE_KEYS_PATH TRUSTFENCE_KEY_INDEX" diff --git a/meta-digi-arm/conf/layer.conf b/meta-digi-arm/conf/layer.conf index 5e71ab783..3f7c8ba15 100644 --- a/meta-digi-arm/conf/layer.conf +++ b/meta-digi-arm/conf/layer.conf @@ -10,6 +10,8 @@ BBFILE_PATTERN_digi-arm := "^${LAYERDIR}/" BBFILE_PRIORITY_digi-arm = "5" BBFILES_DYNAMIC += " \ + arm-toolchain:${LAYERDIR}/dynamic-layers/arm-toolchain/*/*/*.bb \ + arm-toolchain:${LAYERDIR}/dynamic-layers/arm-toolchain/*/*/*.bbappend \ freescale-layer:${LAYERDIR}/dynamic-layers/freescale-layer/*/*/*.bb \ freescale-layer:${LAYERDIR}/dynamic-layers/freescale-layer/*/*/*.bbappend \ stm-st-stm32mp:${LAYERDIR}/dynamic-layers/stm-st-stm32mp/*/*/*.bb \ @@ -52,9 +54,7 @@ BBMASK += " \ # Tweak x-linux-ai dependencies to use ST's machine learning packages LAYERDEPENDS_x-linux-ai:remove = "st-openstlinux" BBMASK += " \ - meta-st-x-linux-ai/recipes-st/images/st-image-ai-npu-userfs.bb \ - meta-st-x-linux-ai/recipes-st/images/st-image-ai-npu.bb \ - meta-st-x-linux-ai/recipes-st/images/st-image-ai-cpu.bb \ + meta-st-x-linux-ai/recipes-st/images/st-image-ai.bb \ " # Digi's General and Open Source license agreements diff --git a/meta-digi-arm/conf/machine/ccimx6qpsbc.conf b/meta-digi-arm/conf/machine/ccimx6qpsbc.conf index 243e82f50..ae5f12af8 100644 --- a/meta-digi-arm/conf/machine/ccimx6qpsbc.conf +++ b/meta-digi-arm/conf/machine/ccimx6qpsbc.conf @@ -31,9 +31,9 @@ UBOOT_INSTALL_USB_INDEX = "0" UBOOT_INSTALL_SD_INDEX = "1" KERNEL_DEVICETREE ?= " \ - imx6qp-ccimx6qpsbc.dtb \ - imx6qp-ccimx6qpsbc-id160.dtb \ - imx6qp-ccimx6qpsbc-wb.dtb \ + digi/imx6qp-ccimx6qpsbc.dtb \ + digi/imx6qp-ccimx6qpsbc-id160.dtb \ + digi/imx6qp-ccimx6qpsbc-wb.dtb \ " SERIAL_CONSOLES ?= "115200;ttymxc3" diff --git a/meta-digi-arm/conf/machine/ccimx6sbc.conf b/meta-digi-arm/conf/machine/ccimx6sbc.conf index d832c16f6..3102c8970 100644 --- a/meta-digi-arm/conf/machine/ccimx6sbc.conf +++ b/meta-digi-arm/conf/machine/ccimx6sbc.conf @@ -29,16 +29,16 @@ UBOOT_INSTALL_USB_INDEX = "0" UBOOT_INSTALL_SD_INDEX = "1" 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 \ + digi/imx6dl-ccimx6sbc.dtb \ + digi/imx6dl-ccimx6sbc-w.dtb \ + digi/imx6dl-ccimx6sbc-wb.dtb \ + digi/imx6q-ccimx6sbc.dtb \ + digi/imx6q-ccimx6sbc-w.dtb \ + digi/imx6q-ccimx6sbc-wb.dtb \ + digi/imx6q-ccimx6sbc-wb-ldo-bypass.dtb \ + digi/imx6q-ccimx6sbc-id129.dtb \ + digi/imx6q-ccimx6sbc-id130.dtb \ + digi/imx6dl-ccimx6sbc-id131.dtb \ " SERIAL_CONSOLES ?= "115200;ttymxc3" diff --git a/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf b/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf index 6ea18d62d..fd957a22e 100644 --- a/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx8mm-dvk.conf @@ -8,13 +8,9 @@ MACHINEOVERRIDES =. "mx8:mx8m:mx8mm:${DIGI_FAMILY}:${DIGI_SOM}:" # Include the machine configuration for Digi's ConnectCore 8M module. include conf/machine/include/ccimx8m.inc -BOOTLOADER_SEEK_USERDATA = "33" BOOTLOADER_SEEK_BOOTPART = "33" # U-Boot configurations -# -# At the moment config label should be "machine" because SDIMG_BOOTLOADER -# expects a boot artifact named after machine to create the sdcard image. UBOOT_CONFIG ??= "ccimx8mm-dvk" UBOOT_CONFIG[ccimx8mm-dvk] = "ccimx8mm_dvk_defconfig" SPL_BINARY = "spl/u-boot-spl.bin" @@ -29,6 +25,7 @@ UBOOT_INSTALL_SD_INDEX = "1" ATF_PLATFORM = "imx8mm" IMX_BOOT_SOC_TARGET = "iMX8MM" +IMX_BOOT_SEEK = "33" KERNEL_DEVICETREE ?= " \ digi/ccimx8m_bt.dtbo \ diff --git a/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf b/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf index 5966e7529..4ecc6f308 100644 --- a/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx8mn-dvk.conf @@ -8,12 +8,7 @@ MACHINEOVERRIDES =. "mx8:mx8m:mx8mn:${DIGI_FAMILY}:${DIGI_SOM}:" # Include the machine configuration for Digi's ConnectCore 8M module. include conf/machine/include/ccimx8m.inc -BOOTLOADER_SEEK_USERDATA = "32" - # U-Boot configurations -# -# At the moment config label should be "machine" because SDIMG_BOOTLOADER -# expects a boot artifact named after machine to create the sdcard image. UBOOT_CONFIG ??= "ccimx8mn-dvk" UBOOT_CONFIG[ccimx8mn-dvk] = "ccimx8mn_dvk_defconfig" SPL_BINARY = "spl/u-boot-spl.bin" @@ -28,6 +23,7 @@ UBOOT_INSTALL_SD_INDEX = "1" ATF_PLATFORM = "imx8mn" IMX_BOOT_SOC_TARGET = "iMX8MN" +IMX_BOOT_SEEK = "32" KERNEL_DEVICETREE ?= " \ digi/ccimx8m_bt.dtbo \ diff --git a/meta-digi-arm/conf/machine/ccimx91-dvk.conf b/meta-digi-arm/conf/machine/ccimx91-dvk.conf index f0c0ba895..ec1355381 100644 --- a/meta-digi-arm/conf/machine/ccimx91-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx91-dvk.conf @@ -8,8 +8,6 @@ MACHINEOVERRIDES =. "mx91:${DIGI_FAMILY}:${DIGI_SOM}:" # Include the machine configuration for Digi's ConnectCore 9 module include conf/machine/include/ccimx9.inc -IMXBOOT_TARGETS = "flash_singleboot" - # U-Boot configurations UBOOT_CONFIG ??= "ccimx91-dvk" UBOOT_CONFIG[ccimx91-dvk] = "ccimx91-dvk_defconfig" @@ -25,7 +23,12 @@ IMX_BOOT_SOC_TARGET = "iMX91" IMXBOOT_TARGETS = "flash_singleboot" SECO_FIRMWARE_NAME:ccimx91 = "mx91a0-ahab-container.img" -BOOTLOADER_SEEK_USERDATA = "32" +DDR_FIRMWARE_NAME = " \ + lpddr4_dmem_1d_v202201.bin \ + lpddr4_dmem_2d_v202201.bin \ + lpddr4_imem_1d_v202201.bin \ + lpddr4_imem_2d_v202201.bin \ +" KERNEL_DEVICETREE ?= " \ digi/ccimx91-dvk.dtb \ @@ -39,6 +42,9 @@ KERNEL_DEVICETREE ?= " \ " FIT_CONF_DEFAULT_DTB = "ccimx91-dvk.dtb" +# Per-machine DISTRO_FEATURES customization +MACHINE_DISTRO_FEATURES_REMOVE = "gstreamer opengl vulkan wayland x11" + # Default image for install scripts DEFAULT_IMAGE_NAME ?= "core-image-base" diff --git a/meta-digi-arm/conf/machine/ccimx93-dvk.conf b/meta-digi-arm/conf/machine/ccimx93-dvk.conf index 03de79998..6d6af2cee 100644 --- a/meta-digi-arm/conf/machine/ccimx93-dvk.conf +++ b/meta-digi-arm/conf/machine/ccimx93-dvk.conf @@ -25,6 +25,13 @@ IMXBOOT_TARGETS = "flash_singleboot flash_singleboot_a0" # one in "use-imx-security-controller-firmware.bbclass" takes precedence) SECO_FIRMWARE_NAME:ccimx93 = "mx93??-ahab-container.img" +DDR_FIRMWARE_NAME = " \ + lpddr4_dmem_1d_v202201.bin \ + lpddr4_dmem_2d_v202201.bin \ + lpddr4_imem_1d_v202201.bin \ + lpddr4_imem_2d_v202201.bin \ +" + KERNEL_DEVICETREE ?= " \ digi/ccimx9_bt-dtm.dtbo \ digi/ccimx9_bt.dtbo \ @@ -42,15 +49,12 @@ KERNEL_DEVICETREE ?= " \ " FIT_CONF_DEFAULT_DTB = "ccimx93-dvk.dtb" +# Per-machine DISTRO_FEATURES customization +MACHINE_DISTRO_FEATURES_REMOVE = "vulkan" + # Add additional firmware MACHINE_FIRMWARE:append = " ethos-u-firmware" -IMAGE_BOOT_FILES:append:use-nxp-bsp = " \ - imx93_m33_TCM_rpmsg_lite_pingpong_rtos_linux_remote.bin \ - imx93_m33_TCM_rpmsg_lite_str_echo_rtos.bin \ -" -WKS_FILE_DEPENDS:append = " imx-m33-demos" - # Boot artifacts to be copied from the deploy dir to the installer ZIP BOOTABLE_ARTIFACTS = " \ imx-boot##SIGNED##-ccimx93-dvk.bin \ diff --git a/meta-digi-arm/conf/machine/ccimx95-dvk.conf b/meta-digi-arm/conf/machine/ccimx95-dvk.conf new file mode 100644 index 000000000..c7af2421b --- /dev/null +++ b/meta-digi-arm/conf/machine/ccimx95-dvk.conf @@ -0,0 +1,58 @@ +#@TYPE: Machine +#@NAME: ConnectCore 95 Development Kit +#@DESCRIPTION: Machine configuration for Digi's ConnectCore 95 DVK + +DIGI_SOM = "ccimx95" +MACHINEOVERRIDES =. "mx95:${DIGI_FAMILY}:${DIGI_SOM}:" + +# Include the machine configuration for Digi's ConnectCore 9 module +include conf/machine/include/ccimx9.inc + +# U-Boot configurations +UBOOT_CONFIG ??= "ccimx95-dvk" +UBOOT_CONFIG[ccimx95-dvk] = "ccimx95-dvk_defconfig" + +# Index of USB device for installer +UBOOT_INSTALL_USB_INDEX = "0" +# Index of microSD device for installer +UBOOT_INSTALL_SD_INDEX = "1" + +# imx-boot configurations +ATF_PLATFORM = "imx95" +IMX_BOOT_SOC_TARGET = "iMX95" +IMXBOOT_TARGETS = "flash_all flash_a55" +SYSTEM_MANAGER_CONFIG ?= "ccimx95dvk" +SYSTEM_MANAGER_FIRMWARE_BASENAME ?= "m33_image" +SYSTEM_MANAGER_FIRMWARE_NAME ?= "${SYSTEM_MANAGER_FIRMWARE_BASENAME}-${SYSTEM_MANAGER_CONFIG}" + +OEI_CONFIGS = "ddr tcm" +OEI_CORE = "m33" +OEI_SOC = "mx95" +OEI_BOARD ?= "ccimx95" +DDR_TYPE ?= "lpddr5" + +DDR_FIRMWARE_NAME = " \ + lpddr5_dmem_v202409.bin \ + lpddr5_dmem_qb_v202409.bin \ + lpddr5_imem_v202409.bin \ + lpddr5_imem_qb_v202409.bin \ +" + +KERNEL_DEVICETREE ?= " \ + digi/ccimx95-dvk.dtb \ + digi/ccimx95-dvk_enet2.dtbo \ + digi/ccimx95-dvk_lvds0_g101evn010.dtbo \ + digi/ccimx95-dvk_lvds1_g101evn010.dtbo \ + digi/ccimx95-dvk_mikroe-accel2-click.dtbo \ + digi/ccimx95-dvk_mikroe-gyro-click.dtbo \ + digi/ccimx95-dvk_pcam5c.dtbo \ + digi/ccimx9_bt.dtbo \ + digi/ccimx9_bt-dtm.dtbo \ + digi/ccimx9_wifi.dtbo \ +" +FIT_CONF_DEFAULT_DTB = "ccimx95-dvk.dtb" + +# Boot artifacts to be copied from the deploy dir to the installer ZIP +BOOTABLE_ARTIFACTS = " \ + imx-boot##SIGNED##-ccimx95-dvk.bin \ +" diff --git a/meta-digi-arm/conf/machine/ccmp13-dvk.conf b/meta-digi-arm/conf/machine/ccmp13-dvk.conf index 61668bbd6..280962ac9 100644 --- a/meta-digi-arm/conf/machine/ccmp13-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp13-dvk.conf @@ -43,6 +43,7 @@ UBOOT_INSTALL_SD_INDEX = "1" STM32MP_DT_FILES_NAND = "ccmp13-dvk-256MB" STM32MP_DT_FILES_SDCARD = "${STM32MP_DT_FILES_NAND}" STM32MP_DT_FILES_USB = "${STM32MP_DT_FILES_NAND}" +STM32MP_DT_FILES_UART = "${STM32MP_DT_FILES_NAND}" # Extra DTB for board - need to specify it with .dtb ... STM32MP_KERNEL_DEVICETREE:ccmp13-dvk += " \ @@ -146,6 +147,7 @@ MACHINE_DISTRO_FEATURES_REMOVE = "gstreamer opengl vulkan wayland x11" # Disable use of vendorfs partition ST_VENDORFS = "0" +ST_USERFS = "0" # Boot artifacts to be copied from the deploy dir to the installer ZIP BOOTABLE_ARTIFACTS = " \ diff --git a/meta-digi-arm/conf/machine/ccmp15-dvk.conf b/meta-digi-arm/conf/machine/ccmp15-dvk.conf index 18b567fca..0f89255be 100644 --- a/meta-digi-arm/conf/machine/ccmp15-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp15-dvk.conf @@ -43,6 +43,7 @@ UBOOT_INSTALL_SD_INDEX = "1" STM32MP_DT_FILES_NAND = "ccmp15-dvk-512MB ccmp15-dvk-1GB" STM32MP_DT_FILES_SDCARD = "${STM32MP_DT_FILES_NAND}" STM32MP_DT_FILES_USB = "${STM32MP_DT_FILES_NAND}" +STM32MP_DT_FILES_UART = "${STM32MP_DT_FILES_NAND}" # Extra DTB for board - need to specify it with .dtb ... STM32MP_KERNEL_DEVICETREE:ccmp15-dvk += " \ @@ -75,8 +76,8 @@ FIT_CONF_DEFAULT_DTB = "ccmp157-dvk.dtb" OPTEE_DEVICETREE_optee = "${STM32MP_DEVICETREE}" OPTEE_DEVICETREE_opteemin = "${STM32MP_DEVICETREE}" # Supported boot schemes -BOOTSCHEME_LABELS ?= "opteemin" -BOOTSCHEME_DEFAULT ?= "opteemin" +BOOTSCHEME_LABELS ?= "optee" +BOOTSCHEME_DEFAULT ?= "optee" # ========================================================================= # Machine features diff --git a/meta-digi-arm/conf/machine/ccmp25-dvk.conf b/meta-digi-arm/conf/machine/ccmp25-dvk.conf index df8c187c3..8bdf6f5f1 100644 --- a/meta-digi-arm/conf/machine/ccmp25-dvk.conf +++ b/meta-digi-arm/conf/machine/ccmp25-dvk.conf @@ -78,7 +78,6 @@ MACHINE_FEATURES += "splashscreen" MACHINE_FEATURES += "watchdog" MACHINE_FEATURES += "bluetooth" MACHINE_FEATURES += "wifi" -MACHINE_FEATURES += "usbg0" # GPU MACHINE_FEATURES += "${@'gpu' if d.getVar('ACCEPT_EULA_'+d.getVar('MACHINE')) == '1' else ''}" @@ -134,11 +133,15 @@ ST_USERFS = "0" # Boot artifacts to be copied from the deploy dir to the installer ZIP BOOTABLE_ARTIFACTS = " \ - ${@oe.utils.ifelse(d.getVar('TRUSTFENCE_SIGN') == '1', 'tf-a-ccmp25-dvk-optee-emmc${SIGN_SUFFIX}.stm32', \ - 'tf-a-ccmp25-dvk-optee-emmc.stm32')} \ + ${@oe.utils.ifelse(d.getVar('TRUSTFENCE_SIGN') == '1', \ + oe.utils.ifelse(d.getVar('TRUSTFENCE_ENCRYPT') == '0', 'tf-a-ccmp25-dvk-optee-emmc${SIGN_SUFFIX}.stm32', \ + 'tf-a-ccmp25-dvk-optee-emmc${ENCRYPT_SUFFIX}${SIGN_SUFFIX}.stm32'), \ + 'tf-a-ccmp25-dvk-optee-emmc.stm32')} \ metadata-ccmp25-dvk.bin \ - ${@oe.utils.ifelse(d.getVar('TRUSTFENCE_SIGN') == '1', 'fip-ccmp25-dvk-optee-emmc${SIGN_SUFFIX}.bin', \ - 'fip-ccmp25-dvk-optee-emmc.bin')} \ + ${@oe.utils.ifelse(d.getVar('TRUSTFENCE_SIGN') == '1', \ + oe.utils.ifelse(d.getVar('TRUSTFENCE_ENCRYPT') == '0', 'fip-ccmp25-dvk-optee-emmc${SIGN_SUFFIX}.bin', \ + 'fip-ccmp25-dvk-optee-emmc${ENCRYPT_SUFFIX}${SIGN_SUFFIX}.bin'), \ + 'fip-ccmp25-dvk-optee-emmc.bin')} \ " # Per-machine DISTRO_FEATURES customization diff --git a/meta-digi-arm/conf/machine/include/ccimx6.inc b/meta-digi-arm/conf/machine/include/ccimx6.inc index 9169db2ed..860826e52 100644 --- a/meta-digi-arm/conf/machine/include/ccimx6.inc +++ b/meta-digi-arm/conf/machine/include/ccimx6.inc @@ -13,8 +13,6 @@ BOOTLOADER_SEEK_BOOTPART = "1" # Platform u-boot settings UBOOT_PREFIX = "u-boot" UBOOT_SUFFIX = "imx" -BOOTABLE_FILENAME = "${UBOOT_PREFIX}-${MACHINE}.${UBOOT_SUFFIX}" -SDIMG_BOOTLOADER = "${DEPLOY_DIR_IMAGE}/${BOOTABLE_FILENAME}" # Set InitRAMDisk load address to U-boot initramfs_addr UBOOT_RD_LOADADDRESS = "0x19000000" @@ -47,6 +45,10 @@ MACHINE_DISTRO_FEATURES_REMOVE = "vulkan" BOOTFS_EXT ?= ".boot.vfat" ROOTFS_EXT ?= '${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", ".squashfs", ".ext4.gz", d)}' +# i.MX6 platforms use weston 10.0.5.imx, which uses the wayland-0 socket +# instead of wayland-1 +WAYLAND_DISPLAY = "wayland-0" + BOOT_DEV_NAME ?= "/dev/mmcblk0p1" ROOTFS_DEV_NAME ?= "/dev/mmcblk0p3" ROOTFS_ENC_DEV = "/dev/mapper/cryptrootfs" diff --git a/meta-digi-arm/conf/machine/include/ccimx8m.inc b/meta-digi-arm/conf/machine/include/ccimx8m.inc index c164d867a..b6a550d5b 100644 --- a/meta-digi-arm/conf/machine/include/ccimx8m.inc +++ b/meta-digi-arm/conf/machine/include/ccimx8m.inc @@ -13,9 +13,6 @@ UBOOT_SUFFIX = "bin" # The bootloader image that gets flashed consists of U-Boot and several fw binaries EXTRA_IMAGEDEPENDS += "imx-boot" -BOOTLOADER_IMAGE_RECIPE = "imx-boot" -BOOTABLE_FILENAME = "${UBOOT_PREFIX}-${MACHINE}.bin" -SDIMG_BOOTLOADER = "${DEPLOY_DIR_IMAGE}/${BOOTABLE_FILENAME}" # Set InitRAMDisk load address to U-boot initramfs_addr UBOOT_RD_LOADADDRESS = "0x43800000" diff --git a/meta-digi-arm/conf/machine/include/ccimx8x.inc b/meta-digi-arm/conf/machine/include/ccimx8x.inc index d3450bcbd..748d4ca6f 100644 --- a/meta-digi-arm/conf/machine/include/ccimx8x.inc +++ b/meta-digi-arm/conf/machine/include/ccimx8x.inc @@ -18,11 +18,6 @@ UBOOT_RD_LOADADDRESS = "0x8A100000" # The bootloader image that gets flashed consists of U-Boot and several fw binaries EXTRA_IMAGEDEPENDS += "imx-boot" -BOOTLOADER_IMAGE_RECIPE = "imx-boot" -# BOOTLOADER_SEEK_USERDATA is 33 for step A of the silicon and 32 for step B -BOOTLOADER_SEEK_USERDATA = "32" -BOOTABLE_FILENAME = "${UBOOT_PREFIX}-${MACHINE}.bin" -SDIMG_BOOTLOADER = "${DEPLOY_DIR_IMAGE}/${BOOTABLE_FILENAME}" # The original variable used by NXP to store the mkimage "REV" parameter, # REV_OPTION, has a format of "REV=X0". Since we are interested in building diff --git a/meta-digi-arm/conf/machine/include/ccimx9.inc b/meta-digi-arm/conf/machine/include/ccimx9.inc index 9fba16f9b..738396ef4 100644 --- a/meta-digi-arm/conf/machine/include/ccimx9.inc +++ b/meta-digi-arm/conf/machine/include/ccimx9.inc @@ -25,17 +25,6 @@ KERNEL_IMAGETYPE:ccimx9 = "${@oe.utils.vartrue('TRUSTFENCE_SIGN_ARTIFACTS', 'fit # The bootloader image that gets flashed consists of U-Boot and several fw binaries EXTRA_IMAGEDEPENDS += "imx-boot" -BOOTLOADER_IMAGE_RECIPE = "imx-boot" -BOOTABLE_FILENAME = "${UBOOT_PREFIX}-${MACHINE}.bin" -SDIMG_BOOTLOADER = "${DEPLOY_DIR_IMAGE}/${BOOTABLE_FILENAME}" -BOOTLOADER_SEEK_USERDATA = "32" - -DDR_FIRMWARE_NAME = " \ - lpddr4_dmem_1d_v202201.bin \ - lpddr4_dmem_2d_v202201.bin \ - lpddr4_imem_1d_v202201.bin \ - lpddr4_imem_2d_v202201.bin \ -" MACHINE_FEATURES += "pci wifi bluetooth" MACHINE_FEATURES:append:use-nxp-bsp = " optee jailhouse" @@ -69,10 +58,6 @@ SERIAL_CONSOLES = "115200;ttyLP5" # Bluetooth tty BT_TTY ?= "ttyLP0" -# Per-machine DISTRO_FEATURES customization -MACHINE_DISTRO_FEATURES_REMOVE = "vulkan" -MACHINE_DISTRO_FEATURES_REMOVE:ccimx91 = "gstreamer opengl vulkan wayland x11" - # SWUpdate sw-description configuration BOOTFS_EXT ?= ".boot.vfat" ROOTFS_EXT ?= '${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", ".squashfs", ".ext4.gz", d)}' diff --git a/meta-digi-arm/conf/machine/include/ccmp1.inc b/meta-digi-arm/conf/machine/include/ccmp1.inc index 9467dfce2..05c75ca49 100644 --- a/meta-digi-arm/conf/machine/include/ccmp1.inc +++ b/meta-digi-arm/conf/machine/include/ccmp1.inc @@ -39,6 +39,13 @@ UBOOT_ENV_RANGE ?= "" FIP_SIGN_SUFFIX ?= "${@bb.utils.contains('TRUSTFENCE_SIGN', '1', '_Signed', '', d)}" +# ========================================================================= +# trusted-firmware-a +# ========================================================================= +# Set custom TF-A config +TF_A_CONFIG_ALL += " ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', bb.utils.contains('BOOTDEVICE_LABELS', 'usb', 'optee-usb', '', d), '', d)}" +TF_A_CONFIG_ALL += " ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', bb.utils.contains('BOOTDEVICE_LABELS', 'uart', 'optee-uart', '', d), '', d)}" + # ========================================================================= # Kernel # ========================================================================= @@ -97,7 +104,7 @@ IMAGE_FSTYPES:remove = "multiubi" WKS_FILE_DEPENDS ?= " \ virtual/bootloader \ virtual/trusted-firmware-a \ - ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'virtual/optee-os', '', d)} \ + ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'virtual-optee-os', '', d)} \ " # Disable the generation of flashlayout files diff --git a/meta-digi-arm/conf/machine/include/ccmp2.inc b/meta-digi-arm/conf/machine/include/ccmp2.inc index c8452ddbf..e69eaee54 100644 --- a/meta-digi-arm/conf/machine/include/ccmp2.inc +++ b/meta-digi-arm/conf/machine/include/ccmp2.inc @@ -32,6 +32,9 @@ UBOOT_DTBO_LOADADDRESS = "0x8a000000" # trusted-firmware-a # ========================================================================= PREFERRED_PROVIDER_virtual/trusted-firmware-a = "tf-a-stm32mp" +# Set custom TF-A config +TF_A_CONFIG_ALL += " ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', bb.utils.contains('BOOTDEVICE_LABELS', 'usb', 'optee-usb', '', d), '', d)}" + # Set metadata settings DEVICE_PARTUUID_FIP_A = "1c606ef5-f1ac-43b9-9bb5-d5c578580b6b" @@ -41,7 +44,7 @@ TF_A_METADATA_TOOL_ARGS ?= "-g -i 1 -b 2 -v ${TF_A_METADATA_TOOL_VERSION} ${DEVI # ========================================================================= # optee-os # ========================================================================= -PREFERRED_PROVIDER_virtual/optee-os = "optee-os-stm32mp" +PREFERRED_PROVIDER_virtual-optee-os = "optee-os-stm32mp" # OPTEE runtime packages to install OPTEE_PKGS ??= "optee-client" @@ -119,7 +122,7 @@ ST_OPTEE_DEBUG_LOG_LEVEL = "1" WKS_FILE_DEPENDS ?= " \ virtual/bootloader \ virtual/trusted-firmware-a \ - ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'virtual/optee-os', '', d)} \ + ${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', 'virtual-optee-os', '', d)} \ " # Disable the generation of flashlayout files diff --git a/meta-digi-arm/conf/machine/include/digi-defaults.inc b/meta-digi-arm/conf/machine/include/digi-defaults.inc index bd7e5bfa2..a39a1bd4c 100644 --- a/meta-digi-arm/conf/machine/include/digi-defaults.inc +++ b/meta-digi-arm/conf/machine/include/digi-defaults.inc @@ -10,14 +10,15 @@ PREFERRED_PROVIDER_virtual/xserver = "xserver-xorg" # # Platform Linux U-Boot # ------------------------------------------------- -# ccimx6 5.15 2017.03 -# ccimx6qp 5.15 2017.03 +# ccimx6 6.6 2024.04 +# ccimx6qp 6.6 2024.04 # ccimx6ul 6.6 2024.04 # ccimx8x 6.6 2024.04 (packaged in imx-boot) # ccimx8mn 6.6 2024.04 (packaged in imx-boot) # ccimx8mm 6.6 2024.04 (packaged in imx-boot) # ccimx91 6.6 2024.04 (packaged in imx-boot) # ccimx93 6.6 2024.04 (packaged in imx-boot) +# ccimx95 6.6 2024.04 (packaged in imx-boot) # ccmp15 6.6 2023.10 # ccmp13 6.6 2023.10 # ccmp25 6.6 2023.10 @@ -84,7 +85,7 @@ DEFAULT_IMAGE_NAME ??= "dey-image-qt" IMAGE_LINK_NAME = "${IMAGE_BASENAME}${IMAGE_MACHINE_SUFFIX}" # List of graphical images names (for install scripts) -GRAPHICAL_IMAGES ?= "dey-image-qt dey-image-webkit dey-image-lvgl" +GRAPHICAL_IMAGES ?= "dey-image-qt dey-image-webkit dey-image-lvgl dey-image-chromium" # Default wayland socket WAYLAND_DISPLAY ?= "wayland-1" diff --git a/meta-digi-arm/conf/machine/include/imx-digi-base.inc b/meta-digi-arm/conf/machine/include/imx-digi-base.inc index 5c815ef9f..b58cc248c 100644 --- a/meta-digi-arm/conf/machine/include/imx-digi-base.inc +++ b/meta-digi-arm/conf/machine/include/imx-digi-base.inc @@ -5,6 +5,8 @@ include conf/machine/include/digi-defaults.inc # IMX_DEFAULT_BSP = "nxp" # include conf/machine/include/imx-base.inc +require conf/machine/include/utilities.inc + # Machines or distros can define which BSP it should use by default. We are # intending to default for mainline BSP by default and specific machines or # DISTROs might change it if need. @@ -13,6 +15,15 @@ include conf/machine/include/digi-defaults.inc IMX_DEFAULT_BSP ?= "nxp" MACHINEOVERRIDES =. "use-${IMX_DEFAULT_BSP}-bsp:" +# UBOOT_BINARY is used inside the wks files to dynamically find the required +# U-Boot file. +UBOOT_BINARY ?= "u-boot.${UBOOT_SUFFIX}" + +# Some SoC can utilize the boot container provided by U-Boot, +# below variable sets that those SoC do use this rather than +# assembling it in the imx-boot recipe. +UBOOT_PROVIDES_BOOT_CONTAINER = "0" + # Allow setting the UART used during the boot by ATF. # FIXME: We should return INVALID here but currently only i.MX8M has support to override the UART @@ -47,6 +58,7 @@ DEFAULTTUNE:mx8m-generic-bsp ?= "cortexa53-crypto" DEFAULTTUNE:mx8x-generic-bsp ?= "cortexa35-crypto" DEFAULTTUNE:mx91-generic-bsp ?= "cortexa55" DEFAULTTUNE:mx93-generic-bsp ?= "cortexa55" +DEFAULTTUNE:mx95-generic-bsp ?= "cortexa55" # DEFAULTTUNE values ported form meta-imx (fsl-imx-base.inc) # Set a more generic tuning for code reuse across parts @@ -54,9 +66,16 @@ DEFAULTTUNE:mx8m-nxp-bsp ?= "armv8a-crc-crypto" DEFAULTTUNE:mx8x-nxp-bsp ?= "armv8a-crc-crypto" DEFAULTTUNE:mx91-nxp-bsp ?= "armv8a-crc-crypto" DEFAULTTUNE:mx93-nxp-bsp ?= "armv8a-crc-crypto" +DEFAULTTUNE:mx95-nxp-bsp ?= "armv8a-crc-crypto" INHERIT += "machine-overrides-extender" +IMX_SOC_REV ??= "A0" +IMX_SOC_REV:mx93-generic-bsp ??= "A1" +IMX_SOC_REV:mx95-generic-bsp ??= "B0" +IMX_SOC_REV_LOWER = "${@d.getVar('IMX_SOC_REV').lower()}" +IMX_SOC_REV_UPPER = "${@d.getVar('IMX_SOC_REV').upper()}" + ####### ### NXP BSP specific overrides ####### @@ -68,8 +87,9 @@ MACHINEOVERRIDES_EXTENDER:mx8mn:use-nxp-bsp = "imx-generic-bsp:imx-nxp-bsp:imxd MACHINEOVERRIDES_EXTENDER:mx8mp:use-nxp-bsp = "imx-generic-bsp:imx-nxp-bsp:imxdrm:imxvpu:imxgpu:imxviv:imxgpu2d:imxgpu3d:imxvulkan:mx8-generic-bsp:mx8-nxp-bsp:mx8m-generic-bsp:mx8m-nxp-bsp:mx8mp-generic-bsp:mx8mp-nxp-bsp" MACHINEOVERRIDES_EXTENDER:mx8qxp:use-nxp-bsp = "imx-generic-bsp:imx-nxp-bsp:imxdrm:imxdpu:imxgpu:imxviv:imxgpu2d:imxgpu3d:imxvulkan:mx8-generic-bsp:mx8-nxp-bsp:mx8x-generic-bsp:mx8x-nxp-bsp:mx8qxp-generic-bsp:mx8qxp-nxp-bsp" MACHINEOVERRIDES_EXTENDER:mx8dx:use-nxp-bsp = "imx-generic-bsp:imx-nxp-bsp:imxdrm:imxdpu:imxgpu:imxviv:imxgpu2d:imxgpu3d:imxvulkan:mx8-generic-bsp:mx8-nxp-bsp:mx8x-generic-bsp:mx8x-nxp-bsp:mx8dx-generic-bsp:mx8dx-nxp-bsp" -MACHINEOVERRIDES_EXTENDER:mx91:use-nxp-bsp = "imx-generic-bsp:imx-nxp-bsp:imxdrm:imxpxp:mx9-generic-bsp:mx9-nxp-bsp:mx91-generic-bsp:mx91-nxp-bsp" +MACHINEOVERRIDES_EXTENDER:mx91:use-nxp-bsp = "imx-generic-bsp:imx-nxp-bsp:imxdrm:mx9-generic-bsp:mx9-nxp-bsp:mx91-generic-bsp:mx91-nxp-bsp" MACHINEOVERRIDES_EXTENDER:mx93:use-nxp-bsp = "imx-generic-bsp:imx-nxp-bsp:imxdrm:imxpxp:mx9-generic-bsp:mx9-nxp-bsp:mx93-generic-bsp:mx93-nxp-bsp" +MACHINEOVERRIDES_EXTENDER:mx95:use-nxp-bsp = "imx-generic-bsp:imx-nxp-bsp:imxdrm:imxdpu:imxgpu:imxmali:imxgpu2d:imxgpu3d:mx9-generic-bsp:mx9-nxp-bsp:mx95-generic-bsp:mx95-nxp-bsp" ####### ### Mainline BSP specific overrides @@ -84,6 +104,7 @@ MACHINEOVERRIDES_EXTENDER:mx8qxp:use-mainline-bsp = "imx-generic-bsp:imx-mainlin MACHINEOVERRIDES_EXTENDER:mx8dx:use-mainline-bsp = "imx-generic-bsp:imx-mainline-bsp:mx8-generic-bsp:mx8-mainline-bsp:mx8x-generic-bsp:mx8x-mainline-bsp:mx8dx-generic-bsp:mx8dx-mainline-bsp" MACHINEOVERRIDES_EXTENDER:mx91:use-mainline-bsp = "imx-generic-bsp:imx-mainline-bsp:mx9-generic-bsp:mx9-mainline-bsp:mx91-generic-bsp:mx91-mainline-bsp" MACHINEOVERRIDES_EXTENDER:mx93:use-mainline-bsp = "imx-generic-bsp:imx-mainline-bsp:mx9-generic-bsp:mx9-mainline-bsp:mx93-generic-bsp:mx93-mainline-bsp" +MACHINEOVERRIDES_EXTENDER:mx95:use-mainline-bsp = "imx-generic-bsp:imx-mainline-bsp:mx9-generic-bsp:mx9-mainline-bsp:mx95-generic-bsp:mx95-mainline-bsp" MACHINEOVERRIDES_EXTENDER_FILTER_OUT = " \ mx6 \ @@ -114,6 +135,7 @@ MACHINEOVERRIDES_EXTENDER_FILTER_OUT = " \ mx8dxl \ mx91 \ mx93 \ + mx95 \ " MACHINEOVERRIDES_FILTERED_OUT_QA_ERROR = "%s overrides cannot be used and need conversion to use the new BSP-specific overrides. Check 'meta-freescale/scripts/convert-bsp-specific-overrides'." @@ -130,6 +152,7 @@ MACHINE_SOCARCH_SUFFIX:mx8qxp-nxp-bsp = "-mx8" MACHINE_SOCARCH_SUFFIX:mx8dx-nxp-bsp = "-mx8" MACHINE_SOCARCH_SUFFIX:mx91-nxp-bsp = "-mx91" MACHINE_SOCARCH_SUFFIX:mx93-nxp-bsp = "-mx93" +MACHINE_SOCARCH_SUFFIX:mx95-nxp-bsp = "-mx95" # For Mainline we use a single SoC suffix as we don't have different build options MACHINE_SOCARCH_SUFFIX:imx-mainline-bsp = "-imx" @@ -207,6 +230,9 @@ IMX_EXTRA_FIRMWARE:mx8m-generic-bsp = "imx-boot-firmware-files" IMX_EXTRA_FIRMWARE:mx8x-generic-bsp = "imx-sc-firmware imx-seco" IMX_EXTRA_FIRMWARE:mx91-generic-bsp = "imx-boot-firmware-files firmware-ele-imx" IMX_EXTRA_FIRMWARE:mx93-generic-bsp = "imx-boot-firmware-files firmware-ele-imx" +PREFERRED_PROVIDER_virtual/imx-system-manager ??= "imx-system-manager" +PREFERRED_PROVIDER_virtual/imx-oei ??= "imx-oei" +IMX_EXTRA_FIRMWARE:mx95-generic-bsp = "imx-boot-firmware-files firmware-ele-imx virtual/imx-system-manager virtual/imx-oei" # Firmware MACHINE_FIRMWARE ?= "" @@ -217,6 +243,7 @@ MACHINE_FIRMWARE:append:mx8mm-generic-bsp = " firmware-imx-sdma-imx7d" MACHINE_FIRMWARE:append:mx8mn-generic-bsp = " firmware-imx-sdma-imx7d firmware-imx-easrc-imx8mn" MACHINE_FIRMWARE:append:mx8qxp-generic-bsp = " firmware-imx-sdma-imx7d firmware-imx-vpu-amphion" MACHINE_FIRMWARE:append:mx8dx-generic-bsp = " firmware-imx-sdma-imx7d firmware-imx-vpu-amphion" +MACHINE_FIRMWARE:append:mx95-generic-bsp = " firmware-imx-vpu-wave" MACHINE_EXTRA_RRECOMMENDS += "${MACHINE_FIRMWARE}" @@ -228,7 +255,8 @@ MACHINE_EXTRA_RRECOMMENDS:append:mx8-nxp-bsp = " ${@bb.utils.contains('DISTRO_FE MACHINE_EXTRA_RRECOMMENDS:append:mx9-nxp-bsp = " ${@bb.utils.contains('DISTRO_FEATURES', 'alsa', '${IMX_ALSA_EXTRA}', '', d)}" # ELE extra Firmware -SECOEXT_FIRMWARE_NAME ?= "UNDEFINED" +SECOEXT_FIRMWARE_NAME ?= "" +SECOEXT_FIRMWARE_NAME:mx95-generic-bsp ?= "mx95a0runtime-ahab-container.img mx95b0runtime-ahab-container.img" # GStreamer 1.0 plugins MACHINE_GSTREAMER_1_0_PLUGIN ?= "" @@ -260,6 +288,9 @@ PREFERRED_VERSION_gstreamer1.0-vaapi:imx-nxp-bsp ??= "1.24.0.imx" # GStreamer downgrade ffmpeg PREFERRED_VERSION_ffmpeg:imx-nxp-bsp ??= "4.4.1" +# Use newer libvpx from 'meta-oe' (otherwise uses older from 'meta-webkit) +PREFERRED_VERSION_libvpx:imx-nxp-bsp ??= "1.14.0" + # Determines if the SoC has support for Vivante kernel driver SOC_HAS_VIVANTE_KERNEL_DRIVER_SUPPORT = "0" SOC_HAS_VIVANTE_KERNEL_DRIVER_SUPPORT:imxgpu = "1" @@ -269,27 +300,28 @@ SOC_HAS_VIVANTE_KERNEL_DRIVER_SUPPORT:imxgpu = "1" # 1 - machine has Vivante GPU driver support MACHINE_HAS_VIVANTE_KERNEL_DRIVER_SUPPORT ?= "${SOC_HAS_VIVANTE_KERNEL_DRIVER_SUPPORT}" -# Graphics libraries -PREFERRED_PROVIDER_virtual/egl ?= "mesa" -PREFERRED_PROVIDER_virtual/libgl ?= "mesa" -PREFERRED_PROVIDER_virtual/libgles1 ?= "mesa" -PREFERRED_PROVIDER_virtual/libgles2 ?= "mesa" +# Override graphics for i.MX GPU +IMXGPU_GRAPHICS_PROVIDER:imxviv ?= "imx-gpu-viv" +IMXGPU_GRAPHICS_PROVIDER:imxmali ?= "mali-imx" -PREFERRED_PROVIDER_virtual/egl:imxgpu ?= "imx-gpu-viv" +PREFERRED_PROVIDER_virtual/egl:imxgpu ?= "${IMXGPU_GRAPHICS_PROVIDER}" PREFERRED_PROVIDER_virtual/libgl:imxgpu ?= "mesa-gl" PREFERRED_PROVIDER_virtual/mesa:imxgpu ?= "mesa-gl" -PREFERRED_PROVIDER_virtual/libgles1:imxgpu3d ?= "imx-gpu-viv" -PREFERRED_PROVIDER_virtual/libgles2:imxgpu3d ?= "imx-gpu-viv" -PREFERRED_PROVIDER_virtual/libgles3:imxgpu3d ?= "imx-gpu-viv" +PREFERRED_PROVIDER_virtual/libgles1:imxgpu3d ?= "${IMXGPU_GRAPHICS_PROVIDER}" +PREFERRED_PROVIDER_virtual/libgles2:imxgpu3d ?= "${IMXGPU_GRAPHICS_PROVIDER}" +PREFERRED_PROVIDER_virtual/libgles3:imxgpu3d ?= "${IMXGPU_GRAPHICS_PROVIDER}" + +# The Vivante OpenCL implementation doesn't work with the standard headers and loader +PREFERRED_PROVIDER_opencl-clhpp:imxviv ?= "imx-gpu-viv" +PREFERRED_PROVIDER_opencl-headers:imxviv ?= "imx-gpu-viv" +PREFERRED_PROVIDER_opencl-icd-loader:imxviv ?= "imx-gpu-viv" +PREFERRED_PROVIDER_virtual/opencl-icd:imxviv ?= "imx-gpu-viv" + PREFERRED_PROVIDER_virtual/libg2d ?= "imx-gpu-g2d" PREFERRED_PROVIDER_virtual/libg2d:imxdpu ?= "imx-dpu-g2d" PREFERRED_PROVIDER_virtual/libg2d:mx93-nxp-bsp ?= "imx-pxp-g2d" -PREFERRED_PROVIDER_opencl-clhpp:imxgpu ?= "imx-gpu-viv" -PREFERRED_PROVIDER_opencl-headers:imxgpu ?= "imx-gpu-viv" -PREFERRED_PROVIDER_opencl-icd-loader:imxgpu ?= "imx-gpu-viv" -PREFERRED_PROVIDER_virtual/opencl-icd:imxgpu ?= "imx-gpu-viv" -PREFERRED_VERSION_weston:imx-nxp-bsp ??= "12.0.4.imx" +PREFERRED_VERSION_weston:imx-nxp-bsp ??= "12.0.5.imx" # i.MX 6 & 7 stay on weston 10.0 for fbdev PREFERRED_VERSION_weston:mx6-nxp-bsp ??= "10.0.5.imx" PREFERRED_VERSION_weston:mx7-nxp-bsp ??= "10.0.5.imx" @@ -315,6 +347,10 @@ PREFERRED_VERSION_optee-client:mx9-nxp-bsp ??= "4.4.0.imx" PREFERRED_VERSION_optee-test:mx8-nxp-bsp ??= "4.4.0.imx" PREFERRED_VERSION_optee-test:mx9-nxp-bsp ??= "4.4.0.imx" +# Firmware from NXP's "lf-6.6.52-2.2.1" release +PREFERRED_VERSION_firmware-imx:imx-nxp-bsp ??= "8.26.1" +PREFERRED_VERSION_imx-boot-firmware-files:imx-nxp-bsp ??= "8.26.1" + # Optee runtime packages to install OPTEE_PKGS ??= "optee-client optee-os" @@ -324,6 +360,28 @@ PREFERRED_VERSION_opencv:mx9-nxp-bsp ??= "4.10.0.imx" EXTRA_IMAGEDEPENDS += "u-boot" +# Do not update fstab file when using wic images +WIC_CREATE_EXTRA_ARGS ?= "--no-fstab-update" + +IMAGE_BOOT_FILES ?= " \ + ${KERNEL_IMAGETYPE}-${MACHINE}.bin \ + ${@bb.utils.contains('KERNEL_IMAGETYPE', 'fitImage', '', '${@make_dtb_boot_files(d)} boot.scr', d)} \ +" + +WKS_FILE_DEPENDS ?= " \ + virtual/bootloader \ + e2fsprogs-native \ + bmaptool-native \ +" +WKS_FILE_DEPENDS:append:mx8-nxp-bsp = " imx-boot" +WKS_FILE_DEPENDS:append:mx9-nxp-bsp = " imx-boot" + +SOC_DEFAULT_WKS_FILE ?= "imx-uboot-bootpart.wks.in" +SOC_DEFAULT_WKS_FILE:mx8-generic-bsp ?= "imx-imx-boot-bootpart.wks.in" +SOC_DEFAULT_WKS_FILE:mx9-generic-bsp ?= "imx-imx-boot-bootpart.wks.in" + +WKS_FILE ?= "${SOC_DEFAULT_WKS_FILE}" + KERNEL_IMAGETYPE = "zImage" KERNEL_IMAGETYPE:aarch64 = "Image.gz" @@ -332,8 +390,4 @@ MACHINE_FEATURES = "usbgadget usbhost vfat alsa touchscreen screen" # IMX specific udev extra rules added when device manager is systemd/udev UDEV_EXTRA_RULES:append = " udev-rules-imx" -# U-Boot 2017.X requires a specific dtc version. -PREFERRED_VERSION_dtc-native:ccimx6 ?= "1.4.5" -PREFERRED_VERSION_nativesdk-dtc:ccimx6 ?= "1.4.5" - DEY_SOC_VENDOR = "NXP" diff --git a/meta-digi-arm/conf/templates/ccimx6qpsbc/conf-notes.txt b/meta-digi-arm/conf/templates/ccimx6qpsbc/conf-notes.txt index 7c10edbcf..10884282c 100644 --- a/meta-digi-arm/conf/templates/ccimx6qpsbc/conf-notes.txt +++ b/meta-digi-arm/conf/templates/ccimx6qpsbc/conf-notes.txt @@ -12,5 +12,4 @@ Digi Embedded Yocto provides the following image recipes: * dey-image-lvgl: graphical LVGL image - By default the image is XWayland-based so it provides a full Weston - desktop environment. + A framebuffer-based image including an LVGL demo application. diff --git a/meta-digi-arm/conf/templates/ccimx6sbc/conf-notes.txt b/meta-digi-arm/conf/templates/ccimx6sbc/conf-notes.txt index 7c10edbcf..10884282c 100644 --- a/meta-digi-arm/conf/templates/ccimx6sbc/conf-notes.txt +++ b/meta-digi-arm/conf/templates/ccimx6sbc/conf-notes.txt @@ -12,5 +12,4 @@ Digi Embedded Yocto provides the following image recipes: * dey-image-lvgl: graphical LVGL image - By default the image is XWayland-based so it provides a full Weston - desktop environment. + A framebuffer-based image including an LVGL demo application. diff --git a/meta-digi-arm/conf/templates/ccimx6ulsbc/bblayers.conf.sample b/meta-digi-arm/conf/templates/ccimx6ulsbc/bblayers.conf.sample index 556605800..d8e908851 100644 --- a/meta-digi-arm/conf/templates/ccimx6ulsbc/bblayers.conf.sample +++ b/meta-digi-arm/conf/templates/ccimx6ulsbc/bblayers.conf.sample @@ -13,7 +13,7 @@ BBLAYERS ?= " \ ##DIGIBASE##/meta-openembedded/meta-python \ ##DIGIBASE##/meta-openembedded/meta-networking \ ##DIGIBASE##/meta-openembedded/meta-webserver \ - ##DIGIBASE##/meta-qt5 \ + ##DIGIBASE##/meta-qt6 \ ##DIGIBASE##/meta-swupdate \ ##DIGIBASE##/meta-freescale \ ##DIGIBASE##/meta-fsl-demos \ diff --git a/meta-digi-arm/conf/templates/ccimx8mm-dvk/conf-notes.txt b/meta-digi-arm/conf/templates/ccimx8mm-dvk/conf-notes.txt index 365bdb1bb..a7ffe6721 100644 --- a/meta-digi-arm/conf/templates/ccimx8mm-dvk/conf-notes.txt +++ b/meta-digi-arm/conf/templates/ccimx8mm-dvk/conf-notes.txt @@ -12,8 +12,7 @@ Digi Embedded Yocto provides the following image recipes: * dey-image-lvgl: graphical LVGL image - By default the image is XWayland-based so it provides a full Weston - desktop environment. + A DRM-based image including an LVGL demo application. * dey-image-flutter: graphical Flutter image diff --git a/meta-digi-arm/conf/templates/ccimx8mn-dvk/conf-notes.txt b/meta-digi-arm/conf/templates/ccimx8mn-dvk/conf-notes.txt index 365bdb1bb..a7ffe6721 100644 --- a/meta-digi-arm/conf/templates/ccimx8mn-dvk/conf-notes.txt +++ b/meta-digi-arm/conf/templates/ccimx8mn-dvk/conf-notes.txt @@ -12,8 +12,7 @@ Digi Embedded Yocto provides the following image recipes: * dey-image-lvgl: graphical LVGL image - By default the image is XWayland-based so it provides a full Weston - desktop environment. + A DRM-based image including an LVGL demo application. * dey-image-flutter: graphical Flutter image diff --git a/meta-digi-arm/conf/templates/ccimx8x-sbc-pro/conf-notes.txt b/meta-digi-arm/conf/templates/ccimx8x-sbc-pro/conf-notes.txt index 365bdb1bb..a7ffe6721 100644 --- a/meta-digi-arm/conf/templates/ccimx8x-sbc-pro/conf-notes.txt +++ b/meta-digi-arm/conf/templates/ccimx8x-sbc-pro/conf-notes.txt @@ -12,8 +12,7 @@ Digi Embedded Yocto provides the following image recipes: * dey-image-lvgl: graphical LVGL image - By default the image is XWayland-based so it provides a full Weston - desktop environment. + A DRM-based image including an LVGL demo application. * dey-image-flutter: graphical Flutter image diff --git a/meta-digi-arm/conf/templates/ccimx91-dvk/bblayers.conf.sample b/meta-digi-arm/conf/templates/ccimx91-dvk/bblayers.conf.sample index b33d95ee4..6fa8c6c1c 100644 --- a/meta-digi-arm/conf/templates/ccimx91-dvk/bblayers.conf.sample +++ b/meta-digi-arm/conf/templates/ccimx91-dvk/bblayers.conf.sample @@ -17,9 +17,7 @@ BBLAYERS ?= " \ ##DIGIBASE##/meta-swupdate \ ##DIGIBASE##/meta-freescale \ ##DIGIBASE##/meta-fsl-demos \ - ##DIGIBASE##/meta-webkit \ ##DIGIBASE##/meta-imx/meta-imx-ml \ - ##DIGIBASE##/meta-selinux \ ##DIGIBASE##/meta-timesys \ ##DIGIBASE##/meta-digi/meta-digi-arm \ ##DIGIBASE##/meta-digi/meta-digi-dey \ diff --git a/meta-digi-arm/conf/templates/ccimx93-dvk/conf-notes.txt b/meta-digi-arm/conf/templates/ccimx93-dvk/conf-notes.txt index 4d03f59dd..71da01170 100644 --- a/meta-digi-arm/conf/templates/ccimx93-dvk/conf-notes.txt +++ b/meta-digi-arm/conf/templates/ccimx93-dvk/conf-notes.txt @@ -7,6 +7,4 @@ Digi Embedded Yocto provides the following image recipes: * dey-image-lvgl: graphical LVGL image - By default the image is XWayland-based so it provides a full Weston - desktop environment. - + A DRM-based image including an LVGL demo application. diff --git a/meta-digi-arm/conf/templates/ccimx95-dvk/bblayers.conf.sample b/meta-digi-arm/conf/templates/ccimx95-dvk/bblayers.conf.sample new file mode 100644 index 000000000..ac7ef9d24 --- /dev/null +++ b/meta-digi-arm/conf/templates/ccimx95-dvk/bblayers.conf.sample @@ -0,0 +1,30 @@ +# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf +# changes incompatibly +POKY_BBLAYERS_CONF_VERSION = "2" + +BBPATH = "${TOPDIR}" +BBFILES ?= "" + +BBLAYERS ?= " \ + ##OEROOT##/meta \ + ##OEROOT##/meta-poky \ + ##OEROOT##/meta-yocto-bsp \ + ##DIGIBASE##/meta-arm/meta-arm-toolchain \ + ##DIGIBASE##/meta-openembedded/meta-oe \ + ##DIGIBASE##/meta-openembedded/meta-python \ + ##DIGIBASE##/meta-openembedded/meta-multimedia \ + ##DIGIBASE##/meta-openembedded/meta-networking \ + ##DIGIBASE##/meta-openembedded/meta-webserver \ + ##DIGIBASE##/meta-qt6 \ + ##DIGIBASE##/meta-swupdate \ + ##DIGIBASE##/meta-freescale \ + ##DIGIBASE##/meta-fsl-demos \ + ##DIGIBASE##/meta-imx/meta-imx-ml \ + ##DIGIBASE##/meta-timesys \ + ##DIGIBASE##/meta-flutter \ + ##DIGIBASE##/meta-flutter/meta-flutter-apps \ + ##DIGIBASE##/meta-clang \ + ##DIGIBASE##/meta-browser/meta-chromium \ + ##DIGIBASE##/meta-digi/meta-digi-arm \ + ##DIGIBASE##/meta-digi/meta-digi-dey \ + " diff --git a/meta-digi-arm/conf/templates/ccimx95-dvk/conf-notes.txt b/meta-digi-arm/conf/templates/ccimx95-dvk/conf-notes.txt new file mode 100644 index 000000000..ea31a59b3 --- /dev/null +++ b/meta-digi-arm/conf/templates/ccimx95-dvk/conf-notes.txt @@ -0,0 +1,20 @@ +Digi Embedded Yocto provides the following image recipes: + + * dey-image-qt: graphical QT image + + By default the image is XWayland-based so it provides a full Weston + desktop environment. + + * dey-image-chromium: graphical Chromium image + + By default the image is XWayland-based so it provides a full Weston + desktop environment. + + * dey-image-lvgl: graphical LVGL image + + A DRM-based image including an LVGL demo application. + + * dey-image-flutter: graphical Flutter image + + Expansion of custom Digi core-image-base including full Flutter + framework support. diff --git a/meta-digi-arm/conf/templates/ccimx95-dvk/local.conf.sample b/meta-digi-arm/conf/templates/ccimx95-dvk/local.conf.sample new file mode 100644 index 000000000..4cf603edd --- /dev/null +++ b/meta-digi-arm/conf/templates/ccimx95-dvk/local.conf.sample @@ -0,0 +1,305 @@ +# +# 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.sample.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. There's also site.conf.sample which contains examples of site specific +# information such as proxy server addresses. +# +# 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 ?= "qemumips64" +#MACHINE ?= "qemuppc" +#MACHINE ?= "qemux86" +#MACHINE ?= "qemux86-64" +# +# There are also the following hardware board target machines included for +# demonstration purposes: +# +#MACHINE ?= "beaglebone-yocto" +#MACHINE ?= "genericarm64" +#MACHINE ?= "genericx86" +#MACHINE ?= "genericx86-64" +# +# This sets the default machine to be qemux86-64 if no other machine is selected: +#MACHINE ??= "qemux86-64" + +MACHINE = "ccimx95-dvk" + +# These are some of the more commonly used values. Looking at the files in the +# meta/conf/machine directory, or the conf/machine directory of any additional layers +# you add in will show all the available machines. + +# +# 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" +# OE-Core defaults to ipkg, whilst Poky defaults to rpm: +PACKAGE_CLASSES ?= "package_rpm" + +# +# SDK target architecture +# +# This variable specifies the architecture to build SDK 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, x86_64, aarch64 +#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) +# "src-pkgs" - add -src packages for all installed packages +# (adds source code for debugging) +# "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, 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-recipe/image.bbclass and +# meta/classes-recipe/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 +USER_CLASSES ?= "buildstats" + +# +# 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. It can also +# run tests against any SDK that are built. To enable this uncomment these lines. +# See meta/classes-recipe/test{image,sdk}.bbclass for further details. +#IMAGE_CLASSES += "testimage testsdk" +#TESTIMAGE_AUTO:qemuall = "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 than 100MB or 1K inodes, perform a hard halt +# 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 necessary 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 \ + HALT,${TMPDIR},100M,1K \ + HALT,${DL_DIR},100M,1K \ + HALT,${SSTATE_DIR},100M,1K \ + HALT,/tmp,10M,1K" + +# +# Shared-state files from other locations +# +# As mentioned above, shared state files are prebuilt cache data objects which can be +# 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 https 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://.* https://someserver.tld/share/sstate/PATH;downloadfilename=PATH \ +#file://.* file:///some/local/dir/sstate/PATH" + +# +# Yocto Project SState Mirror +# +# The Yocto Project has prebuilt artefacts available for its releases, you can enable +# use of these by uncommenting some of the following lines. This will mean the build uses +# the network to check for artefacts at the start of builds, which does slow it down +# initially but it will then speed up the builds by not having to build things if they are +# present in the cache. It assumes you can download something faster than you can build it +# which will depend on your network. +# Note: For this to work you also need hash-equivalence passthrough to the matching server +# There is a choice between our sstate server directly and a faster content delivery network +# (CDN) kindly provided by JSDelivr, uncomment one of the SSTATE_MIRRORS lines, not both. +# Using the CDN rather than the yoctoproject.org address is suggested/preferred. +# +#BB_HASHSERVE_UPSTREAM = 'wss://hashserv.yoctoproject.org/ws' +#SSTATE_MIRRORS ?= "file://.* http://cdn.jsdelivr.net/yocto/sstate/all/PATH;downloadfilename=PATH" +# +###SSTATE_MIRRORS ?= "file://.* http://sstate.yoctoproject.org/all/PATH;downloadfilename=PATH" + + +# +# Qemu configuration +# +# By default native qemu will build with a builtin VNC server where graphical output can be +# seen. The line below enables the SDL UI frontend too. +PACKAGECONFIG:append:pn-qemu-system-native = " sdl" +# By default libsdl2-native will be built, if you want to use your host's libSDL instead of +# the minimal libsdl built by libsdl2-native then uncomment the ASSUME_PROVIDED line below. +#ASSUME_PROVIDED += "libsdl2-native" + +# You can also enable the Gtk UI frontend, which takes somewhat longer to build, but adds +# a handy set of menus for controlling the emulator. +#PACKAGECONFIG:append:pn-qemu-system-native = " gtk+" + +# +# Hash Equivalence +# +# Enable support for automatically running a local hash equivalence server and +# instruct bitbake to use a hash equivalence aware signature generator. Hash +# equivalence improves reuse of sstate by detecting when a given sstate +# artifact can be reused as equivalent, even if the current task hash doesn't +# match the one that generated the artifact. +# +# A shared hash equivalent server can be set with ":" format +# +#BB_HASHSERVE = "auto" +#BB_SIGNATURE_HANDLER = "OEEquivHash" + +# +# Memory Resident Bitbake +# +# Bitbake's server component can stay in memory after the UI for the current command +# has completed. This means subsequent commands can run faster since there is no need +# for bitbake to reload cache files and so on. Number is in seconds, after which the +# server will shut down. +# +#BB_SERVER_TIMEOUT = "60" + +# 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 = "2" + +# +# Enable local PR server +# +PRSERV_HOST = "localhost:0" + +# +# Some libraries and packages are covered by NXP EULA +# +#ACCEPT_FSL_EULA = "1" diff --git a/meta-digi-arm/conf/templates/ccmp15-dvk/bblayers.conf.sample b/meta-digi-arm/conf/templates/ccmp15-dvk/bblayers.conf.sample index 615bee8ea..74aeec820 100644 --- a/meta-digi-arm/conf/templates/ccmp15-dvk/bblayers.conf.sample +++ b/meta-digi-arm/conf/templates/ccmp15-dvk/bblayers.conf.sample @@ -22,6 +22,7 @@ BBLAYERS ?= " \ ##DIGIBASE##/meta-st-x-linux-ai \ ##DIGIBASE##/meta-flutter \ ##DIGIBASE##/meta-flutter/meta-flutter-apps \ + ##DIGIBASE##/meta-clang \ ##DIGIBASE##/meta-digi/meta-digi-arm \ ##DIGIBASE##/meta-digi/meta-digi-dey \ " diff --git a/meta-digi-arm/conf/templates/ccmp15-dvk/conf-notes.txt b/meta-digi-arm/conf/templates/ccmp15-dvk/conf-notes.txt index ed9e5d62f..a9a19bfe1 100644 --- a/meta-digi-arm/conf/templates/ccmp15-dvk/conf-notes.txt +++ b/meta-digi-arm/conf/templates/ccmp15-dvk/conf-notes.txt @@ -12,8 +12,7 @@ Digi Embedded Yocto provides the following image recipes: * dey-image-lvgl: graphical LVGL image - By default the image is Wayland-based so it provides a full Weston - desktop environment. + A DRM-based image including an LVGL demo application. * dey-image-flutter: graphical Flutter image diff --git a/meta-digi-arm/conf/templates/ccmp25-dvk/conf-notes.txt b/meta-digi-arm/conf/templates/ccmp25-dvk/conf-notes.txt index ed9e5d62f..a9a19bfe1 100644 --- a/meta-digi-arm/conf/templates/ccmp25-dvk/conf-notes.txt +++ b/meta-digi-arm/conf/templates/ccmp25-dvk/conf-notes.txt @@ -12,8 +12,7 @@ Digi Embedded Yocto provides the following image recipes: * dey-image-lvgl: graphical LVGL image - By default the image is Wayland-based so it provides a full Weston - desktop environment. + A DRM-based image including an LVGL demo application. * dey-image-flutter: graphical Flutter image diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0001-boards-ccimx95-add-platform-as-a-clone-of-mx95lp5.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0001-boards-ccimx95-add-platform-as-a-clone-of-mx95lp5.patch new file mode 100644 index 000000000..0eb6e9272 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0001-boards-ccimx95-add-platform-as-a-clone-of-mx95lp5.patch @@ -0,0 +1,32672 @@ +From: Javier Viguera +Date: Mon, 15 Sep 2025 11:38:14 +0200 +Subject: [PATCH] boards: ccimx95: add platform as a clone of mx95lp5 + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Javier Viguera +--- + boards/ccimx95/Makefile | 25 + + boards/ccimx95/board.c | 80 + + boards/ccimx95/board.h | 72 + + boards/ccimx95/config_board.h | 61 + + ...X19_6400MTS_FW2024.09_ECC_enabled_timing.c | 10757 ++++++++++++++++ + ...PDDR5_EVK_19X19_6400MTS_FW2024.09_timing.c | 10752 +++++++++++++++ + boards/ccimx95/ddr/Makefile | 4 + + ...XIMX95LPD5EVK19_6400mbps_train_timing_a1.c | 10754 +++++++++++++++ + boards/ccimx95/pin_mux.c | 33 + + boards/ccimx95/pin_mux.h | 44 + + 10 files changed, 32582 insertions(+) + create mode 100644 boards/ccimx95/Makefile + create mode 100644 boards/ccimx95/board.c + create mode 100644 boards/ccimx95/board.h + create mode 100644 boards/ccimx95/config_board.h + create mode 100644 boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_ECC_enabled_timing.c + create mode 100644 boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_timing.c + create mode 100644 boards/ccimx95/ddr/Makefile + create mode 100644 boards/ccimx95/ddr/XIMX95LPD5EVK19_6400mbps_train_timing_a1.c + create mode 100644 boards/ccimx95/pin_mux.c + create mode 100644 boards/ccimx95/pin_mux.h + +diff --git a/boards/ccimx95/Makefile b/boards/ccimx95/Makefile +new file mode 100644 +index 000000000000..321143748ec1 +--- /dev/null ++++ b/boards/ccimx95/Makefile +@@ -0,0 +1,25 @@ ++cpu := m33 ++SOC := MIMX95 ++SOCFULL := $(SOC) ++SOC_DEVICE_DIR := devices/$(SOC) ++ ++ifneq ($(REV),A0) ++FLAGS += -DCONFIG_DUMMY_TRAIN_DATA_SUPPORT -DCONFIG_ELE ++endif ++ ++BOARDS_DIR = $(ROOT_DIR)/boards ++BOARD_DIR = $(BOARDS_DIR)/$(SOM) ++ ++INCLUDE += \ ++ -I$(BOARDS_DIR) \ ++ -I$(BOARD_DIR) ++ ++ifeq ($(DEBUG),1) ++OBJS += \ ++ $(OUT)/board.o \ ++ $(OUT)/pin_mux.o ++endif ++ ++VPATH += \ ++ $(BOARDS_DIR) \ ++ $(BOARD_DIR) +diff --git a/boards/ccimx95/board.c b/boards/ccimx95/board.c +new file mode 100644 +index 000000000000..1de026235304 +--- /dev/null ++++ b/boards/ccimx95/board.c +@@ -0,0 +1,80 @@ ++/* ++ * Copyright 2023-2024 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#include "oei.h" ++#include "board.h" ++#include "fsl_lpuart.h" ++#include "fsl_ccm.h" ++#include "fsl_clock.h" ++ ++/******************************************************************************* ++ * Variables ++ ******************************************************************************/ ++/* Debug UART base pointer list */ ++static LPUART_Type *const s_uartBases[] = LPUART_BASE_PTRS; ++ ++/* Debug UART clock list */ ++static uint32_t const s_uartClks[] = ++{ ++ 0U, ++ CLOCK_ROOT_LPUART1, ++ CLOCK_ROOT_LPUART2, ++ CLOCK_ROOT_LPUART3, ++ CLOCK_ROOT_LPUART4, ++ CLOCK_ROOT_LPUART5, ++ CLOCK_ROOT_LPUART6, ++ CLOCK_ROOT_LPUART7, ++ CLOCK_ROOT_LPUART8 ++}; ++ ++/* Debug UART configuration info */ ++static board_uart_config_t const s_uartConfig = ++{ ++ .base = s_uartBases[BOARD_DEBUG_UART_INSTANCE], ++ .clockId = s_uartClks[BOARD_DEBUG_UART_INSTANCE], ++ .baud = BOARD_DEBUG_UART_BAUDRATE, ++ .inst = BOARD_DEBUG_UART_INSTANCE ++}; ++ ++/******************************************************************************* ++ * Code ++ ******************************************************************************/ ++ ++/*--------------------------------------------------------------------------*/ ++/* Return the debug UART info */ ++/*--------------------------------------------------------------------------*/ ++const board_uart_config_t *BOARD_GetDebugUart(void) ++{ ++ return &s_uartConfig; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Initialize debug console */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_InitDebugConsole(void) ++{ ++ if (s_uartConfig.base != NULL) ++ { ++#if 0 ++ uint64_t rate = CCM_RootGetRate(s_uartConfig.clockId); ++#else ++ uint64_t rate = 24000000; ++#endif ++ ++ /* Configure debug UART */ ++ lpuart_config_t lpuart_config; ++ LPUART_GetDefaultConfig(&lpuart_config); ++ lpuart_config.baudRate_Bps = s_uartConfig.baud; ++ lpuart_config.rxFifoWatermark = ((uint8_t) ++ FSL_FEATURE_LPUART_FIFO_SIZEn(s_uartConfig.base)) - 1U; ++ lpuart_config.txFifoWatermark = ((uint8_t) ++ FSL_FEATURE_LPUART_FIFO_SIZEn(s_uartConfig.base)) - 1U; ++ lpuart_config.enableTx = true; ++ lpuart_config.enableRx = true; ++ (void) LPUART_Init(s_uartConfig.base, &lpuart_config, ++ (uint32_t) rate & 0xFFFFFFFFU); ++ } ++} +diff --git a/boards/ccimx95/board.h b/boards/ccimx95/board.h +new file mode 100644 +index 000000000000..6142222a4739 +--- /dev/null ++++ b/boards/ccimx95/board.h +@@ -0,0 +1,72 @@ ++/* ++ * Copyright 2023-2024 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#ifndef BOARD_H ++#define BOARD_H ++ ++#include "fsl_common.h" ++#include "pin_mux.h" ++#include "config_board.h" ++ ++/*! ++ * @addtogroup BRD_OEI_MX95EVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing the board API. ++ */ ++ ++/******************************************************************************* ++ * Types ++ ******************************************************************************/ ++ ++/*! ++ * Debug UART configuration info ++ */ ++typedef struct ++{ ++ LPUART_Type *const base; /*!< LPUART base pointer */ ++ uint32_t clockId; /*!< Clock ID */ ++ uint32_t baud; /*!< Baud rate */ ++ uint8_t inst; /*!< Instance number */ ++} board_uart_config_t; ++ ++#if defined(__cplusplus) ++extern "C" { ++#endif /* __cplusplus */ ++ ++/******************************************************************************* ++ * API ++ ******************************************************************************/ ++ ++/*! Init hardware */ ++void BOARD_InitHardware(void); ++ ++/*! Init clocks */ ++void BOARD_InitClocks(void); ++ ++/*! ++ * Get a device clock debug UART info. ++ * ++ * This function returns the UART info for the UART used for SM ++ * debug. ++ * ++ * @return Returns the debug UART config info. ++ */ ++const board_uart_config_t *BOARD_GetDebugUart(void); ++ ++/*! Init the debug UART */ ++void BOARD_InitDebugConsole(void); ++ ++#if defined(__cplusplus) ++} ++#endif /* __cplusplus */ ++ ++/** @} */ ++ ++#endif /* BOARD_H */ +diff --git a/boards/ccimx95/config_board.h b/boards/ccimx95/config_board.h +new file mode 100644 +index 000000000000..3095ebf1d8ce +--- /dev/null ++++ b/boards/ccimx95/config_board.h +@@ -0,0 +1,61 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2024 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_MX95EVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing coniguration info for the board abstraction. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_BOARD_H ++#define CONFIG_BOARD_H ++ ++/* Includes */ ++ ++/* Defines */ ++ ++/*! Config for UART instance */ ++#define BOARD_DEBUG_UART_INSTANCE 2U ++/*! Config for UART baudrate */ ++#define BOARD_DEBUG_UART_BAUDRATE 115200U ++ ++#endif /* CONFIG_BOARD_H */ ++ ++/** @} */ +diff --git a/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_ECC_enabled_timing.c b/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_ECC_enabled_timing.c +new file mode 100644 +index 000000000000..99b2ec568cb8 +--- /dev/null ++++ b/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_ECC_enabled_timing.c +@@ -0,0 +1,10757 @@ ++/* ++ * Copyright 2025 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ * ++ * Code generated with DDR Tool v3.7.0_0.2-4600df02. ++ * DDR PHY FW2024.09 ++ * Chip revision: B0 ++ */ ++ ++#include "ddr.h" ++ ++/* Initialize DDRC registers */ ++static struct ddrc_cfg_param ddr_ddrc_cfg[] = { ++ {0x5e080110, 0x41114001U}, ++ {0x5e080000, 0x37fU}, ++ {0x5e080008, 0x0U}, ++ {0x5e080010, 0x3U}, ++ {0x5e080014, 0x80000U}, ++ {0x5e080020, 0x80000000U}, ++ {0x5e080024, 0x8000fffU}, ++ {0x5e080028, 0x80000000U}, ++ {0x5e08002c, 0x7ffU}, ++ {0x5e080080, 0x80800522U}, ++ {0x5e080084, 0x80800522U}, ++ {0x5e080114, 0x201000U}, ++ {0x5e080260, 0x800a1U}, ++ {0x5e080268, 0x0U}, ++ {0x5e08026c, 0x3d04U}, ++ {0x5e080278, 0x10U}, ++ {0x5e080800, 0x43d3bd80U}, ++ {0x5e080804, 0x1f1f1f1fU}, ++ {0x5e080810, 0x14084060U}, ++ {0x5e080c00, 0x40000000U}, ++ {0x5e081000, 0xc00000e3U}, ++ {0x5e080d00, 0x81000200U}, ++ {0x5e080d60, 0x0U}, ++ {0x5e080d64, 0x80000000U}, ++ {0x5e080d68, 0x3U}, ++ {0x5e080d6c, 0xffffffffU}, ++ {0x5e081220, 0x0U}, ++ {0x5e081224, 0x0U}, ++ {0x5e081228, 0x0U}, ++ {0x5e08122c, 0x0U}, ++ {0x5e081230, 0x0U}, ++ {0x5e081234, 0x0U}, ++ {0x5e081238, 0x0U}, ++ {0x5e08123c, 0x0U}, ++ {0x5e081240, 0x0U}, ++ {0x5e081244, 0x0U}, ++ {0x5e081248, 0x0U}, ++ {0x5e08124c, 0x0U}, ++ {0x5e081250, 0x0U}, ++ {0x5e081254, 0x0U}, ++ {0x5e081258, 0x0U}, ++ {0x5e08125c, 0x0U}, ++}; ++ ++/* DRAM fsp configurations */ ++static struct ddrc_cfg_param ddr_dram_fsp0_ddrc_cfg[] = { ++ {0x5e080100, 0x020D2100U}, ++ {0x5e080104, 0x4866000CU}, ++ {0x5e080108, 0xF2F28D47U}, ++ {0x5e08010C, 0x20488010U}, ++ {0x5e080124, 0x0C230000U}, ++ {0x5e080160, 0x00000101U}, ++ {0x5e08016C, 0x01300000U}, ++ {0x5e080170, 0x8C010509U}, ++ {0x5e080250, 0x00110C11U}, ++ {0x5e080254, 0x00680040U}, ++ {0x5e080258, 0x03003E80U}, ++ {0x5e08025C, 0x40520200U}, ++ {0x5e080300, 0x08110809U}, ++ {0x5e080304, 0x00680F02U}, ++ {0x5e080308, 0x06040603U}, ++ {0x5e08030C, 0x0030001CU}, ++ {0x5e080310, 0x20610000U}, ++ {0x5e080314, 0x0A0A0407U}, ++}; ++ ++/* PHY Initialize Configuration */ ++static struct ddrphy_cfg_param ddr_ddrphy_cfg[] = { ++ {0x10080, 0x7}, ++ {0x10081, 0x5}, ++ {0x10082, 0x6}, ++ {0x10083, 0x1}, ++ {0x10084, 0x2}, ++ {0x10085, 0x0}, ++ {0x10086, 0x3}, ++ {0x10087, 0x4}, ++ {0x11080, 0x0}, ++ {0x11081, 0x1}, ++ {0x11082, 0x2}, ++ {0x11083, 0x3}, ++ {0x11084, 0x4}, ++ {0x11085, 0x7}, ++ {0x11086, 0x6}, ++ {0x11087, 0x5}, ++ {0x12080, 0x5}, ++ {0x12081, 0x6}, ++ {0x12082, 0x1}, ++ {0x12083, 0x7}, ++ {0x12084, 0x4}, ++ {0x12085, 0x2}, ++ {0x12086, 0x0}, ++ {0x12087, 0x3}, ++ {0x13080, 0x0}, ++ {0x13081, 0x3}, ++ {0x13082, 0x2}, ++ {0x13083, 0x7}, ++ {0x13084, 0x4}, ++ {0x13085, 0x5}, ++ {0x13086, 0x6}, ++ {0x13087, 0x1}, ++ {0x30090, 0x4}, ++ {0x30091, 0x3}, ++ {0x30092, 0x6}, ++ {0x30093, 0x0}, ++ {0x30094, 0x5}, ++ {0x30095, 0x1}, ++ {0x30096, 0x2}, ++ {0x31090, 0x1}, ++ {0x31091, 0x3}, ++ {0x31092, 0x4}, ++ {0x31093, 0x6}, ++ {0x31094, 0x2}, ++ {0x31095, 0x0}, ++ {0x31096, 0x5}, ++ {0x20060, 0x2}, ++ {0x200a5, 0x1}, ++ {0xd0036, 0x0}, ++ {0x200bd, 0xff}, ++ {0x20300, 0x808}, ++ {0x20303, 0x9}, ++ {0x20302, 0x26}, ++ {0x20328, 0x0}, ++ {0x20301, 0x3}, ++ {0x2030b, 0x0}, ++ {0x300a7, 0x0}, ++ {0x310a7, 0x0}, ++ {0x300ae, 0x80}, ++ {0x300ad, 0x80}, ++ {0x300ac, 0x80}, ++ {0x310ae, 0x80}, ++ {0x310ad, 0x80}, ++ {0x310ac, 0x80}, ++ {0xc0086, 0x0}, ++ {0x100a3, 0xb33}, ++ {0x110a3, 0xb33}, ++ {0x120a3, 0xb33}, ++ {0x130a3, 0xb33}, ++ {0xc00f1, 0x6000}, ++ {0xc00f2, 0xa9}, ++ {0xc00f3, 0x8000}, ++ {0xc00f4, 0x5}, ++ {0xc00f5, 0x4000}, ++ {0xc00f6, 0x2}, ++ {0xc00f7, 0xf000}, ++ {0xc00f9, 0x6000}, ++ {0xc00fa, 0xa9}, ++ {0xc00fb, 0x8000}, ++ {0xc00fd, 0x4000}, ++ {0xc00ff, 0xf000}, ++ {0x908ff, 0xf}, ++ {0x10093, 0x0}, ++ {0x11093, 0x0}, ++ {0x12093, 0x0}, ++ {0x13093, 0x0}, ++ {0x20051, 0x3}, ++}; ++ ++/* PHY trained csr */ ++static struct ddrphy_cfg_param ddr_ddrphy_trained_csr[] = { ++ {0x200a5, 0x0}, ++ {0xd0036, 0x0}, ++ {0x200bd, 0x0}, ++ {0x20300, 0x0}, ++ {0x20303, 0x0}, ++ {0x20302, 0x0}, ++ {0x20328, 0x0}, ++ {0x20301, 0x0}, ++ {0x2030b, 0x0}, ++ {0x300a7, 0x0}, ++ {0x310a7, 0x0}, ++ {0x300ae, 0x0}, ++ {0x300ad, 0x0}, ++ {0x300ac, 0x0}, ++ {0x310ae, 0x0}, ++ {0x310ad, 0x0}, ++ {0x310ac, 0x0}, ++ {0xc0086, 0x0}, ++ {0x100a3, 0x0}, ++ {0x110a3, 0x0}, ++ {0x120a3, 0x0}, ++ {0x130a3, 0x0}, ++ {0xc00f1, 0x0}, ++ {0xc00f2, 0x0}, ++ {0xc00f3, 0x0}, ++ {0xc00f4, 0x0}, ++ {0xc00f5, 0x0}, ++ {0xc00f6, 0x0}, ++ {0xc00f7, 0x0}, ++ {0xc00f9, 0x0}, ++ {0xc00fa, 0x0}, ++ {0xc00fb, 0x0}, ++ {0xc00fd, 0x0}, ++ {0xc00ff, 0x0}, ++ {0x908ff, 0x0}, ++ {0x10093, 0x0}, ++ {0x11093, 0x0}, ++ {0x12093, 0x0}, ++ {0x13093, 0x0}, ++ {0x20051, 0x0}, ++ {0x90802, 0x0}, ++ {0x20002, 0x0}, ++ {0x20000, 0x0}, ++ {0x90801, 0x0}, ++ {0x90809, 0x0}, ++ {0x1005e, 0x0}, ++ {0x10060, 0x0}, ++ {0x10062, 0x0}, ++ {0x10064, 0x0}, ++ {0x1005f, 0x0}, ++ {0x10061, 0x0}, ++ {0x10063, 0x0}, ++ {0x10065, 0x0}, ++ {0x1105e, 0x0}, ++ {0x11060, 0x0}, ++ {0x11062, 0x0}, ++ {0x11064, 0x0}, ++ {0x1105f, 0x0}, ++ {0x11061, 0x0}, ++ {0x11063, 0x0}, ++ {0x11065, 0x0}, ++ {0x1205e, 0x0}, ++ {0x12060, 0x0}, ++ {0x12062, 0x0}, ++ {0x12064, 0x0}, ++ {0x1205f, 0x0}, ++ {0x12061, 0x0}, ++ {0x12063, 0x0}, ++ {0x12065, 0x0}, ++ {0x1305e, 0x0}, ++ {0x13060, 0x0}, ++ {0x13062, 0x0}, ++ {0x13064, 0x0}, ++ {0x1305f, 0x0}, ++ {0x13061, 0x0}, ++ {0x13063, 0x0}, ++ {0x13065, 0x0}, ++ {0x10005, 0x0}, ++ {0x1000b, 0x0}, ++ {0x11005, 0x0}, ++ {0x1100b, 0x0}, ++ {0x12005, 0x0}, ++ {0x1200b, 0x0}, ++ {0x13005, 0x0}, ++ {0x1300b, 0x0}, ++ {0x20007, 0x0}, ++ {0x20013, 0x0}, ++ {0x30038, 0x0}, ++ {0x30039, 0x0}, ++ {0x3003a, 0x0}, ++ {0x31038, 0x0}, ++ {0x31039, 0x0}, ++ {0x3103a, 0x0}, ++ {0x10038, 0x0}, ++ {0x1003a, 0x0}, ++ {0x11038, 0x0}, ++ {0x1103a, 0x0}, ++ {0x12038, 0x0}, ++ {0x1203a, 0x0}, ++ {0x13038, 0x0}, ++ {0x1303a, 0x0}, ++ {0x1003b, 0x0}, ++ {0x1103b, 0x0}, ++ {0x1203b, 0x0}, ++ {0x1303b, 0x0}, ++ {0x10009, 0x0}, ++ {0x10037, 0x0}, ++ {0x11009, 0x0}, ++ {0x11037, 0x0}, ++ {0x12009, 0x0}, ++ {0x12037, 0x0}, ++ {0x13009, 0x0}, ++ {0x13037, 0x0}, ++ {0x10004, 0x0}, ++ {0x10003, 0x0}, ++ {0x11004, 0x0}, ++ {0x11003, 0x0}, ++ {0x12004, 0x0}, ++ {0x12003, 0x0}, ++ {0x13004, 0x0}, ++ {0x13003, 0x0}, ++ {0x20004, 0x0}, ++ {0x30050, 0x0}, ++ {0x30051, 0x0}, ++ {0x30052, 0x0}, ++ {0x30053, 0x0}, ++ {0x31050, 0x0}, ++ {0x31051, 0x0}, ++ {0x31052, 0x0}, ++ {0x31053, 0x0}, ++ {0x1004e, 0x0}, ++ {0x1004f, 0x0}, ++ {0x10050, 0x0}, ++ {0x10051, 0x0}, ++ {0x1014e, 0x0}, ++ {0x1014f, 0x0}, ++ {0x10150, 0x0}, ++ {0x10151, 0x0}, ++ {0x1024e, 0x0}, ++ {0x1024f, 0x0}, ++ {0x10250, 0x0}, ++ {0x10251, 0x0}, ++ {0x1034e, 0x0}, ++ {0x1034f, 0x0}, ++ {0x10350, 0x0}, ++ {0x10351, 0x0}, ++ {0x1044e, 0x0}, ++ {0x1044f, 0x0}, ++ {0x10450, 0x0}, ++ {0x10451, 0x0}, ++ {0x1054e, 0x0}, ++ {0x1054f, 0x0}, ++ {0x10550, 0x0}, ++ {0x10551, 0x0}, ++ {0x1064e, 0x0}, ++ {0x1064f, 0x0}, ++ {0x10650, 0x0}, ++ {0x10651, 0x0}, ++ {0x1074e, 0x0}, ++ {0x1074f, 0x0}, ++ {0x10750, 0x0}, ++ {0x10751, 0x0}, ++ {0x1084e, 0x0}, ++ {0x1084f, 0x0}, ++ {0x10850, 0x0}, ++ {0x10851, 0x0}, ++ {0x1104e, 0x0}, ++ {0x1104f, 0x0}, ++ {0x11050, 0x0}, ++ {0x11051, 0x0}, ++ {0x1114e, 0x0}, ++ {0x1114f, 0x0}, ++ {0x11150, 0x0}, ++ {0x11151, 0x0}, ++ {0x1124e, 0x0}, ++ {0x1124f, 0x0}, ++ {0x11250, 0x0}, ++ {0x11251, 0x0}, ++ {0x1134e, 0x0}, ++ {0x1134f, 0x0}, ++ {0x11350, 0x0}, ++ {0x11351, 0x0}, ++ {0x1144e, 0x0}, ++ {0x1144f, 0x0}, ++ {0x11450, 0x0}, ++ {0x11451, 0x0}, ++ {0x1154e, 0x0}, ++ {0x1154f, 0x0}, ++ {0x11550, 0x0}, ++ {0x11551, 0x0}, ++ {0x1164e, 0x0}, ++ {0x1164f, 0x0}, ++ {0x11650, 0x0}, ++ {0x11651, 0x0}, ++ {0x1174e, 0x0}, ++ {0x1174f, 0x0}, ++ {0x11750, 0x0}, ++ {0x11751, 0x0}, ++ {0x1184e, 0x0}, ++ {0x1184f, 0x0}, ++ {0x11850, 0x0}, ++ {0x11851, 0x0}, ++ {0x1204e, 0x0}, ++ {0x1204f, 0x0}, ++ {0x12050, 0x0}, ++ {0x12051, 0x0}, ++ {0x1214e, 0x0}, ++ {0x1214f, 0x0}, ++ {0x12150, 0x0}, ++ {0x12151, 0x0}, ++ {0x1224e, 0x0}, ++ {0x1224f, 0x0}, ++ {0x12250, 0x0}, ++ {0x12251, 0x0}, ++ {0x1234e, 0x0}, ++ {0x1234f, 0x0}, ++ {0x12350, 0x0}, ++ {0x12351, 0x0}, ++ {0x1244e, 0x0}, ++ {0x1244f, 0x0}, ++ {0x12450, 0x0}, ++ {0x12451, 0x0}, ++ {0x1254e, 0x0}, ++ {0x1254f, 0x0}, ++ {0x12550, 0x0}, ++ {0x12551, 0x0}, ++ {0x1264e, 0x0}, ++ {0x1264f, 0x0}, ++ {0x12650, 0x0}, ++ {0x12651, 0x0}, ++ {0x1274e, 0x0}, ++ {0x1274f, 0x0}, ++ {0x12750, 0x0}, ++ {0x12751, 0x0}, ++ {0x1284e, 0x0}, ++ {0x1284f, 0x0}, ++ {0x12850, 0x0}, ++ {0x12851, 0x0}, ++ {0x1304e, 0x0}, ++ {0x1304f, 0x0}, ++ {0x13050, 0x0}, ++ {0x13051, 0x0}, ++ {0x1314e, 0x0}, ++ {0x1314f, 0x0}, ++ {0x13150, 0x0}, ++ {0x13151, 0x0}, ++ {0x1324e, 0x0}, ++ {0x1324f, 0x0}, ++ {0x13250, 0x0}, ++ {0x13251, 0x0}, ++ {0x1334e, 0x0}, ++ {0x1334f, 0x0}, ++ {0x13350, 0x0}, ++ {0x13351, 0x0}, ++ {0x1344e, 0x0}, ++ {0x1344f, 0x0}, ++ {0x13450, 0x0}, ++ {0x13451, 0x0}, ++ {0x1354e, 0x0}, ++ {0x1354f, 0x0}, ++ {0x13550, 0x0}, ++ {0x13551, 0x0}, ++ {0x1364e, 0x0}, ++ {0x1364f, 0x0}, ++ {0x13650, 0x0}, ++ {0x13651, 0x0}, ++ {0x1374e, 0x0}, ++ {0x1374f, 0x0}, ++ {0x13750, 0x0}, ++ {0x13751, 0x0}, ++ {0x1384e, 0x0}, ++ {0x1384f, 0x0}, ++ {0x13850, 0x0}, ++ {0x13851, 0x0}, ++ {0x30030, 0x0}, ++ {0x30031, 0x0}, ++ {0x30035, 0x0}, ++ {0x31030, 0x0}, ++ {0x31031, 0x0}, ++ {0x31035, 0x0}, ++ {0x10030, 0x0}, ++ {0x10035, 0x0}, ++ {0x10036, 0x0}, ++ {0x11030, 0x0}, ++ {0x11035, 0x0}, ++ {0x11036, 0x0}, ++ {0x12030, 0x0}, ++ {0x12035, 0x0}, ++ {0x12036, 0x0}, ++ {0x13030, 0x0}, ++ {0x13035, 0x0}, ++ {0x13036, 0x0}, ++ {0x3003c, 0x0}, ++ {0x3103c, 0x0}, ++ {0x1003c, 0x0}, ++ {0x1003d, 0x0}, ++ {0x1003e, 0x0}, ++ {0x1103c, 0x0}, ++ {0x1103d, 0x0}, ++ {0x1103e, 0x0}, ++ {0x1203c, 0x0}, ++ {0x1203d, 0x0}, ++ {0x1203e, 0x0}, ++ {0x1303c, 0x0}, ++ {0x1303d, 0x0}, ++ {0x1303e, 0x0}, ++ {0x20003, 0x0}, ++ {0x10006, 0x0}, ++ {0x11006, 0x0}, ++ {0x12006, 0x0}, ++ {0x13006, 0x0}, ++ {0x20001, 0x0}, ++ {0x20009, 0x0}, ++ {0x20008, 0x0}, ++ {0x200d9, 0x0}, ++ {0x30eef, 0x0}, ++ {0x31eef, 0x0}, ++ {0x20014, 0x0}, ++ {0x9080a, 0x0}, ++ {0x10040, 0x0}, ++ {0x10042, 0x0}, ++ {0x9080d, 0x0}, ++ {0x10043, 0x0}, ++ {0x10044, 0x0}, ++ {0x10045, 0x0}, ++ {0x11040, 0x0}, ++ {0x11042, 0x0}, ++ {0x11043, 0x0}, ++ {0x11044, 0x0}, ++ {0x11045, 0x0}, ++ {0x12040, 0x0}, ++ {0x12042, 0x0}, ++ {0x12043, 0x0}, ++ {0x12044, 0x0}, ++ {0x12045, 0x0}, ++ {0x13040, 0x0}, ++ {0x13042, 0x0}, ++ {0x13043, 0x0}, ++ {0x13044, 0x0}, ++ {0x13045, 0x0}, ++ {0x30040, 0x0}, ++ {0x30041, 0x0}, ++ {0x30042, 0x0}, ++ {0x30043, 0x0}, ++ {0x30330, 0x0}, ++ {0x31040, 0x0}, ++ {0x31041, 0x0}, ++ {0x31042, 0x0}, ++ {0x31043, 0x0}, ++ {0x31330, 0x0}, ++ {0x20331, 0x0}, ++ {0x10048, 0x0}, ++ {0x1004a, 0x0}, ++ {0x1004b, 0x0}, ++ {0x1004c, 0x0}, ++ {0x1004d, 0x0}, ++ {0x11048, 0x0}, ++ {0x1104a, 0x0}, ++ {0x1104b, 0x0}, ++ {0x1104c, 0x0}, ++ {0x1104d, 0x0}, ++ {0x12048, 0x0}, ++ {0x1204a, 0x0}, ++ {0x1204b, 0x0}, ++ {0x1204c, 0x0}, ++ {0x1204d, 0x0}, ++ {0x13048, 0x0}, ++ {0x1304a, 0x0}, ++ {0x1304b, 0x0}, ++ {0x1304c, 0x0}, ++ {0x1304d, 0x0}, ++ {0x30048, 0x0}, ++ {0x30049, 0x0}, ++ {0x3004a, 0x0}, ++ {0x3004b, 0x0}, ++ {0x31048, 0x0}, ++ {0x31049, 0x0}, ++ {0x3104a, 0x0}, ++ {0x3104b, 0x0}, ++ {0x30033, 0x0}, ++ {0x30034, 0x0}, ++ {0x3002e, 0x0}, ++ {0x31033, 0x0}, ++ {0x31034, 0x0}, ++ {0x3102e, 0x0}, ++ {0x10033, 0x0}, ++ {0x1002e, 0x0}, ++ {0x1002f, 0x0}, ++ {0x11033, 0x0}, ++ {0x1102e, 0x0}, ++ {0x1102f, 0x0}, ++ {0x12033, 0x0}, ++ {0x1202e, 0x0}, ++ {0x1202f, 0x0}, ++ {0x13033, 0x0}, ++ {0x1302e, 0x0}, ++ {0x1302f, 0x0}, ++ {0x90806, 0x0}, ++ {0x100e8, 0x0}, ++ {0x100e9, 0x0}, ++ {0x110e8, 0x0}, ++ {0x110e9, 0x0}, ++ {0x120e8, 0x0}, ++ {0x120e9, 0x0}, ++ {0x130e8, 0x0}, ++ {0x130e9, 0x0}, ++ {0x10001, 0x0}, ++ {0x11001, 0x0}, ++ {0x12001, 0x0}, ++ {0x13001, 0x0}, ++ {0x20012, 0x0}, ++ {0x20017, 0x0}, ++ {0x2000a, 0x0}, ++ {0x20186, 0x0}, ++ {0x20187, 0x0}, ++ {0x20010, 0x0}, ++ {0x20011, 0x0}, ++ {0x9080b, 0x0}, ++ {0x9080c, 0x0}, ++ {0x100a5, 0x0}, ++ {0x110a5, 0x0}, ++ {0x120a5, 0x0}, ++ {0x130a5, 0x0}, ++ {0x10014, 0x0}, ++ {0x11014, 0x0}, ++ {0x12014, 0x0}, ++ {0x13014, 0x0}, ++ {0x20035, 0x0}, ++ {0x20036, 0x0}, ++ {0x20037, 0x0}, ++ {0x20038, 0x0}, ++ {0x20039, 0x0}, ++ {0x2003a, 0x0}, ++ {0x2003b, 0x0}, ++ {0x2003c, 0x0}, ++ {0x2003d, 0x0}, ++ {0x2003e, 0x0}, ++ {0x2003f, 0x0}, ++ {0x20040, 0x0}, ++ {0x2002c, 0x0}, ++ {0x2002d, 0x0}, ++ {0x20030, 0x0}, ++ {0x2002e, 0x0}, ++ {0x2002f, 0x0}, ++ {0x2000c, 0x0}, ++ {0x2001b, 0x0}, ++ {0x10007, 0x0}, ++ {0x11007, 0x0}, ++ {0x12007, 0x0}, ++ {0x13007, 0x0}, ++ {0x908f0, 0x0}, ++ {0x908f1, 0x0}, ++ {0x908f2, 0x0}, ++ {0x908f3, 0x0}, ++ {0x908f4, 0x0}, ++ {0x908f5, 0x0}, ++ {0x908f6, 0x0}, ++ {0x908f7, 0x0}, ++ {0x41008, 0x0}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0x0}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x0}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0x0}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0x0}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x0}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0x0}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0x0}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x0}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0x0}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0x0}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x0}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0x0}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0x0}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x0}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0x0}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0x0}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x0}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0x0}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0x0}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x0}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x0}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x0}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x0}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x0}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x0}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0x0}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0x0}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x0}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0x0}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0x0}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x0}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0x0}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0x0}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0x410b8, 0x0}, ++ {0x410b9, 0x0}, ++ {0x410ba, 0x0}, ++ {0x410bb, 0x0}, ++ {0x410bc, 0x0}, ++ {0x410bd, 0x0}, ++ {0x410be, 0x0}, ++ {0x410bf, 0x0}, ++ {0x410c0, 0x0}, ++ {0x410c1, 0x0}, ++ {0x410c2, 0x0}, ++ {0x410c3, 0x0}, ++ {0x410c4, 0x0}, ++ {0x410c5, 0x0}, ++ {0x410c6, 0x0}, ++ {0x410c7, 0x0}, ++ {0x410c8, 0x0}, ++ {0x410c9, 0x0}, ++ {0x410ca, 0x0}, ++ {0x410cb, 0x0}, ++ {0x410cc, 0x0}, ++ {0x410cd, 0x0}, ++ {0x410ce, 0x0}, ++ {0x410cf, 0x0}, ++ {0x410d0, 0x0}, ++ {0x410d1, 0x0}, ++ {0x410d2, 0x0}, ++ {0x410d3, 0x0}, ++ {0x410d4, 0x0}, ++ {0x410d5, 0x0}, ++ {0x410d6, 0x0}, ++ {0x410d7, 0x0}, ++ {0x410d8, 0x0}, ++ {0x410d9, 0x0}, ++ {0x410da, 0x0}, ++ {0x410db, 0x0}, ++ {0x410dc, 0x0}, ++ {0x410dd, 0x0}, ++ {0x410de, 0x0}, ++ {0x410df, 0x0}, ++ {0x410e0, 0x0}, ++ {0x410e1, 0x0}, ++ {0x410e2, 0x0}, ++ {0x410e3, 0x0}, ++ {0x410e4, 0x0}, ++ {0x410e5, 0x0}, ++ {0x410e6, 0x0}, ++ {0x410e7, 0x0}, ++ {0x410e8, 0x0}, ++ {0x410e9, 0x0}, ++ {0x410ea, 0x0}, ++ {0x410eb, 0x0}, ++ {0x410ec, 0x0}, ++ {0x410ed, 0x0}, ++ {0x410ee, 0x0}, ++ {0x410ef, 0x0}, ++ {0x410f0, 0x0}, ++ {0x410f1, 0x0}, ++ {0x410f2, 0x0}, ++ {0x410f3, 0x0}, ++ {0x410f4, 0x0}, ++ {0x410f5, 0x0}, ++ {0x410f6, 0x0}, ++ {0x410f7, 0x0}, ++ {0x410f8, 0x0}, ++ {0x410f9, 0x0}, ++ {0x410fa, 0x0}, ++ {0x410fb, 0x0}, ++ {0x410fc, 0x0}, ++ {0x410fd, 0x0}, ++ {0x410fe, 0x0}, ++ {0x410ff, 0x0}, ++ {0x41100, 0x0}, ++ {0x41101, 0x0}, ++ {0x41102, 0x0}, ++ {0x41103, 0x0}, ++ {0x41104, 0x0}, ++ {0x41105, 0x0}, ++ {0x41106, 0x0}, ++ {0x41107, 0x0}, ++ {0x41108, 0x0}, ++ {0x41109, 0x0}, ++ {0x4110a, 0x0}, ++ {0x4110b, 0x0}, ++ {0x4110c, 0x0}, ++ {0x4110d, 0x0}, ++ {0x4110e, 0x0}, ++ {0x4110f, 0x0}, ++ {0x41110, 0x0}, ++ {0x41111, 0x0}, ++ {0x41112, 0x0}, ++ {0x41113, 0x0}, ++ {0x41114, 0x0}, ++ {0x41115, 0x0}, ++ {0x41116, 0x0}, ++ {0x41117, 0x0}, ++ {0x41118, 0x0}, ++ {0x41119, 0x0}, ++ {0x4111a, 0x0}, ++ {0x4111b, 0x0}, ++ {0x4111c, 0x0}, ++ {0x4111d, 0x0}, ++ {0x4111e, 0x0}, ++ {0x4111f, 0x0}, ++ {0x41120, 0x0}, ++ {0x41121, 0x0}, ++ {0x41122, 0x0}, ++ {0x41123, 0x0}, ++ {0x41124, 0x0}, ++ {0x41125, 0x0}, ++ {0x41126, 0x0}, ++ {0x41127, 0x0}, ++ {0x41128, 0x0}, ++ {0x41129, 0x0}, ++ {0x4112a, 0x0}, ++ {0x4112b, 0x0}, ++ {0x4112c, 0x0}, ++ {0x4112d, 0x0}, ++ {0x4112e, 0x0}, ++ {0x4112f, 0x0}, ++ {0x41130, 0x0}, ++ {0x41131, 0x0}, ++ {0x41132, 0x0}, ++ {0x41133, 0x0}, ++ {0x41134, 0x0}, ++ {0x41135, 0x0}, ++ {0x41136, 0x0}, ++ {0x41137, 0x0}, ++ {0x41138, 0x0}, ++ {0x41139, 0x0}, ++ {0x4113a, 0x0}, ++ {0x4113b, 0x0}, ++ {0x4113c, 0x0}, ++ {0x4113d, 0x0}, ++ {0x4113e, 0x0}, ++ {0x4113f, 0x0}, ++ {0x41140, 0x0}, ++ {0x41141, 0x0}, ++ {0x41142, 0x0}, ++ {0x41143, 0x0}, ++ {0x41144, 0x0}, ++ {0x41145, 0x0}, ++ {0x41146, 0x0}, ++ {0x41147, 0x0}, ++ {0x41148, 0x0}, ++ {0x41149, 0x0}, ++ {0x4114a, 0x0}, ++ {0x4114b, 0x0}, ++ {0x4114c, 0x0}, ++ {0x4114d, 0x0}, ++ {0x4114e, 0x0}, ++ {0x4114f, 0x0}, ++ {0x41150, 0x0}, ++ {0x41151, 0x0}, ++ {0x41152, 0x0}, ++ {0x41153, 0x0}, ++ {0x41154, 0x0}, ++ {0x41155, 0x0}, ++ {0x41156, 0x0}, ++ {0x41157, 0x0}, ++ {0x41158, 0x0}, ++ {0x41159, 0x0}, ++ {0x4115a, 0x0}, ++ {0x4115b, 0x0}, ++ {0x4115c, 0x0}, ++ {0x4115d, 0x0}, ++ {0x4115e, 0x0}, ++ {0x4115f, 0x0}, ++ {0x41160, 0x0}, ++ {0x41161, 0x0}, ++ {0x41162, 0x0}, ++ {0x41163, 0x0}, ++ {0x41164, 0x0}, ++ {0x41165, 0x0}, ++ {0x41166, 0x0}, ++ {0x41167, 0x0}, ++ {0x41168, 0x0}, ++ {0x41169, 0x0}, ++ {0x4116a, 0x0}, ++ {0x4116b, 0x0}, ++ {0x4116c, 0x0}, ++ {0x4116d, 0x0}, ++ {0x4116e, 0x0}, ++ {0x4116f, 0x0}, ++ {0x41170, 0x0}, ++ {0x41171, 0x0}, ++ {0x41172, 0x0}, ++ {0x41173, 0x0}, ++ {0x41174, 0x0}, ++ {0x41175, 0x0}, ++ {0x41176, 0x0}, ++ {0x41177, 0x0}, ++ {0x41178, 0x0}, ++ {0x41179, 0x0}, ++ {0x4117a, 0x0}, ++ {0x4117b, 0x0}, ++ {0x4117c, 0x0}, ++ {0x4117d, 0x0}, ++ {0x4117e, 0x0}, ++ {0x4117f, 0x0}, ++ {0x41180, 0x0}, ++ {0x41181, 0x0}, ++ {0x41182, 0x0}, ++ {0x41183, 0x0}, ++ {0x41184, 0x0}, ++ {0x41185, 0x0}, ++ {0x41186, 0x0}, ++ {0x41187, 0x0}, ++ {0x41188, 0x0}, ++ {0x41189, 0x0}, ++ {0x4118a, 0x0}, ++ {0x4118b, 0x0}, ++ {0x4118c, 0x0}, ++ {0x4118d, 0x0}, ++ {0x4118e, 0x0}, ++ {0x4118f, 0x0}, ++ {0x41190, 0x0}, ++ {0x41191, 0x0}, ++ {0x41192, 0x0}, ++ {0x41193, 0x0}, ++ {0x41194, 0x0}, ++ {0x41195, 0x0}, ++ {0x41196, 0x0}, ++ {0x41197, 0x0}, ++ {0x41198, 0x0}, ++ {0x41199, 0x0}, ++ {0x4119a, 0x0}, ++ {0x4119b, 0x0}, ++ {0x4119c, 0x0}, ++ {0x4119d, 0x0}, ++ {0x4119e, 0x0}, ++ {0x4119f, 0x0}, ++ {0x411a0, 0x0}, ++ {0x411a1, 0x0}, ++ {0x411a2, 0x0}, ++ {0x411a3, 0x0}, ++ {0x411a4, 0x0}, ++ {0x411a5, 0x0}, ++ {0x411a6, 0x0}, ++ {0x411a7, 0x0}, ++ {0x411a8, 0x0}, ++ {0x411a9, 0x0}, ++ {0x411aa, 0x0}, ++ {0x411ab, 0x0}, ++ {0x411ac, 0x0}, ++ {0x411ad, 0x0}, ++ {0x411ae, 0x0}, ++ {0x411af, 0x0}, ++ {0x411b0, 0x0}, ++ {0x411b1, 0x0}, ++ {0x411b2, 0x0}, ++ {0x411b3, 0x0}, ++ {0x411b4, 0x0}, ++ {0x411b5, 0x0}, ++ {0x411b6, 0x0}, ++ {0x411b7, 0x0}, ++ {0x411b8, 0x0}, ++ {0x411b9, 0x0}, ++ {0x411ba, 0x0}, ++ {0x411bb, 0x0}, ++ {0x411bc, 0x0}, ++ {0x411bd, 0x0}, ++ {0x411be, 0x0}, ++ {0x411bf, 0x0}, ++ {0x411c0, 0x0}, ++ {0x411c1, 0x0}, ++ {0x411c2, 0x0}, ++ {0x411c3, 0x0}, ++ {0x411c4, 0x0}, ++ {0x411c5, 0x0}, ++ {0x411c6, 0x0}, ++ {0x411c7, 0x0}, ++ {0x20015, 0x0}, ++ {0x2004a, 0x0}, ++ {0x2004b, 0x0}, ++ {0x2004c, 0x0}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x0}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20041, 0x0}, ++ {0x20045, 0x0}, ++ {0x10057, 0x0}, ++ {0x11057, 0x0}, ++ {0x12057, 0x0}, ++ {0x13057, 0x0}, ++ {0x1000f, 0x0}, ++ {0x1100f, 0x0}, ++ {0x1200f, 0x0}, ++ {0x1300f, 0x0}, ++ {0x90803, 0x0}, ++ {0x90804, 0x0}, ++ {0x90805, 0x0}, ++ {0x90903, 0x0}, ++ {0x9090b, 0x0}, ++ {0x90811, 0x0}, ++ {0x90812, 0x0}, ++ {0x20072, 0x0}, ++ {0x9080e, 0x0}, ++ {0x20073, 0x0}, ++ {0x9080f, 0x0}, ++ {0x41000, 0x0}, ++ {0x41001, 0x0}, ++ {0x41002, 0x0}, ++ {0x41003, 0x0}, ++ {0x41004, 0x0}, ++ {0x41005, 0x0}, ++ {0x41006, 0x0}, ++ {0x41007, 0x0}, ++ {0x41388, 0x0}, ++ {0x41389, 0x0}, ++ {0x4138a, 0x0}, ++ {0x4138b, 0x0}, ++ {0x4138c, 0x0}, ++ {0x4138d, 0x0}, ++ {0x4138e, 0x0}, ++ {0x4138f, 0x0}, ++ {0x41390, 0x0}, ++ {0x41391, 0x0}, ++ {0x41392, 0x0}, ++ {0x41393, 0x0}, ++ {0x41394, 0x0}, ++ {0x41395, 0x0}, ++ {0x41396, 0x0}, ++ {0x41397, 0x0}, ++ {0x41398, 0x0}, ++ {0x41399, 0x0}, ++ {0x4139a, 0x0}, ++ {0x4139b, 0x0}, ++ {0x4139c, 0x0}, ++ {0x4139d, 0x0}, ++ {0x4139e, 0x0}, ++ {0x4139f, 0x0}, ++ {0x413a0, 0x0}, ++ {0x413a1, 0x0}, ++ {0x413a2, 0x0}, ++ {0x413a3, 0x0}, ++ {0x413a4, 0x0}, ++ {0x413a5, 0x0}, ++ {0x413a6, 0x0}, ++ {0x413a7, 0x0}, ++ {0x413a8, 0x0}, ++ {0x413a9, 0x0}, ++ {0x413aa, 0x0}, ++ {0x413ab, 0x0}, ++ {0x413ac, 0x0}, ++ {0x413ad, 0x0}, ++ {0x413ae, 0x0}, ++ {0x413af, 0x0}, ++ {0x413b0, 0x0}, ++ {0x413b1, 0x0}, ++ {0x413b2, 0x0}, ++ {0x413b3, 0x0}, ++ {0x413b4, 0x0}, ++ {0x413b5, 0x0}, ++ {0x413b6, 0x0}, ++ {0x413b7, 0x0}, ++ {0x413b8, 0x0}, ++ {0x413b9, 0x0}, ++ {0x413ba, 0x0}, ++ {0x413bb, 0x0}, ++ {0x413bc, 0x0}, ++ {0x413bd, 0x0}, ++ {0x413be, 0x0}, ++ {0x413bf, 0x0}, ++ {0x413c0, 0x0}, ++ {0x413c1, 0x0}, ++ {0x413c2, 0x0}, ++ {0x413c3, 0x0}, ++ {0x413c4, 0x0}, ++ {0x413c5, 0x0}, ++ {0x413c6, 0x0}, ++ {0x413c7, 0x0}, ++ {0x413c8, 0x0}, ++ {0x413c9, 0x0}, ++ {0x413ca, 0x0}, ++ {0x413cb, 0x0}, ++ {0x413cc, 0x0}, ++ {0x413cd, 0x0}, ++ {0x413ce, 0x0}, ++ {0x413cf, 0x0}, ++ {0x413d0, 0x0}, ++ {0x413d1, 0x0}, ++ {0x413d2, 0x0}, ++ {0x413d3, 0x0}, ++ {0x413d4, 0x0}, ++ {0x413d5, 0x0}, ++ {0x413d6, 0x0}, ++ {0x413d7, 0x0}, ++ {0x413d8, 0x0}, ++ {0x413d9, 0x0}, ++ {0x413da, 0x0}, ++ {0x413db, 0x0}, ++ {0x413dc, 0x0}, ++ {0x413dd, 0x0}, ++ {0x413de, 0x0}, ++ {0x413df, 0x0}, ++ {0x413e0, 0x0}, ++ {0x413e1, 0x0}, ++ {0x413e2, 0x0}, ++ {0x413e3, 0x0}, ++ {0x413e4, 0x0}, ++ {0x413e5, 0x0}, ++ {0x413e6, 0x0}, ++ {0x413e7, 0x0}, ++ {0x413e8, 0x0}, ++ {0x413e9, 0x0}, ++ {0x413ea, 0x0}, ++ {0x413eb, 0x0}, ++ {0x413ec, 0x0}, ++ {0x413ed, 0x0}, ++ {0x413ee, 0x0}, ++ {0x413ef, 0x0}, ++ {0x413f0, 0x0}, ++ {0x413f1, 0x0}, ++ {0x413f2, 0x0}, ++ {0x413f3, 0x0}, ++ {0x413f4, 0x0}, ++ {0x413f5, 0x0}, ++ {0x413f6, 0x0}, ++ {0x413f7, 0x0}, ++ {0x413f8, 0x0}, ++ {0x413f9, 0x0}, ++ {0x413fa, 0x0}, ++ {0x413fb, 0x0}, ++ {0x413fc, 0x0}, ++ {0x413fd, 0x0}, ++ {0x413fe, 0x0}, ++ {0x413ff, 0x0}, ++ {0x41400, 0x0}, ++ {0x41401, 0x0}, ++ {0x41402, 0x0}, ++ {0x41403, 0x0}, ++ {0x41404, 0x0}, ++ {0x41405, 0x0}, ++ {0x41406, 0x0}, ++ {0x41407, 0x0}, ++ {0x41408, 0x0}, ++ {0x41409, 0x0}, ++ {0x4140a, 0x0}, ++ {0x4140b, 0x0}, ++ {0x4140c, 0x0}, ++ {0x4140d, 0x0}, ++ {0x4140e, 0x0}, ++ {0x4140f, 0x0}, ++ {0x41410, 0x0}, ++ {0x41411, 0x0}, ++ {0x41412, 0x0}, ++ {0x41413, 0x0}, ++ {0x41414, 0x0}, ++ {0x41415, 0x0}, ++ {0x41416, 0x0}, ++ {0x41417, 0x0}, ++ {0x41418, 0x0}, ++ {0x41419, 0x0}, ++ {0x4141a, 0x0}, ++ {0x4141b, 0x0}, ++ {0x4141c, 0x0}, ++ {0x4141d, 0x0}, ++ {0x4141e, 0x0}, ++ {0x4141f, 0x0}, ++ {0x41420, 0x0}, ++ {0x41421, 0x0}, ++ {0x41422, 0x0}, ++ {0x41423, 0x0}, ++ {0x41424, 0x0}, ++ {0x41425, 0x0}, ++ {0x41426, 0x0}, ++ {0x41427, 0x0}, ++ {0x41428, 0x0}, ++ {0x41429, 0x0}, ++ {0x4142a, 0x0}, ++ {0x4142b, 0x0}, ++ {0x4142c, 0x0}, ++ {0x4142d, 0x0}, ++ {0x4142e, 0x0}, ++ {0x4142f, 0x0}, ++ {0x41430, 0x0}, ++ {0x41431, 0x0}, ++ {0x41432, 0x0}, ++ {0x41433, 0x0}, ++ {0x41434, 0x0}, ++ {0x41435, 0x0}, ++ {0x41436, 0x0}, ++ {0x41437, 0x0}, ++ {0x41438, 0x0}, ++ {0x41439, 0x0}, ++ {0x4143a, 0x0}, ++ {0x4143b, 0x0}, ++ {0x4143c, 0x0}, ++ {0x4143d, 0x0}, ++ {0x4143e, 0x0}, ++ {0x4143f, 0x0}, ++ {0x41440, 0x0}, ++ {0x41441, 0x0}, ++ {0x41442, 0x0}, ++ {0x41443, 0x0}, ++ {0x41444, 0x0}, ++ {0x41445, 0x0}, ++ {0x41446, 0x0}, ++ {0x41447, 0x0}, ++ {0x41448, 0x0}, ++ {0x41449, 0x0}, ++ {0x4144a, 0x0}, ++ {0x4144b, 0x0}, ++ {0x4144c, 0x0}, ++ {0x4144d, 0x0}, ++ {0x4144e, 0x0}, ++ {0x4144f, 0x0}, ++ {0x41450, 0x0}, ++ {0x41451, 0x0}, ++ {0x41452, 0x0}, ++ {0x41453, 0x0}, ++ {0x41454, 0x0}, ++ {0x41455, 0x0}, ++ {0x41456, 0x0}, ++ {0x41457, 0x0}, ++ {0x41458, 0x0}, ++ {0x41459, 0x0}, ++ {0x4145a, 0x0}, ++ {0x4145b, 0x0}, ++ {0x4145c, 0x0}, ++ {0x4145d, 0x0}, ++ {0x4145e, 0x0}, ++ {0x4145f, 0x0}, ++ {0x41460, 0x0}, ++ {0x41461, 0x0}, ++ {0x41462, 0x0}, ++ {0x41463, 0x0}, ++ {0x41464, 0x0}, ++ {0x41465, 0x0}, ++ {0x41466, 0x0}, ++ {0x41467, 0x0}, ++ {0x41468, 0x0}, ++ {0x41469, 0x0}, ++ {0x4146a, 0x0}, ++ {0x4146b, 0x0}, ++ {0x4146c, 0x0}, ++ {0x4146d, 0x0}, ++ {0x4146e, 0x0}, ++ {0x4146f, 0x0}, ++ {0x41470, 0x0}, ++ {0x41471, 0x0}, ++ {0x41472, 0x0}, ++ {0x41473, 0x0}, ++ {0x41474, 0x0}, ++ {0x41475, 0x0}, ++ {0x41476, 0x0}, ++ {0x41477, 0x0}, ++ {0x41478, 0x0}, ++ {0x41479, 0x0}, ++ {0x4147a, 0x0}, ++ {0x4147b, 0x0}, ++ {0x4147c, 0x0}, ++ {0x4147d, 0x0}, ++ {0x4147e, 0x0}, ++ {0x4147f, 0x0}, ++ {0x41480, 0x0}, ++ {0x41481, 0x0}, ++ {0x41482, 0x0}, ++ {0x41483, 0x0}, ++ {0x41484, 0x0}, ++ {0x41485, 0x0}, ++ {0x41486, 0x0}, ++ {0x41487, 0x0}, ++ {0x41488, 0x0}, ++ {0x41489, 0x0}, ++ {0x4148a, 0x0}, ++ {0x4148b, 0x0}, ++ {0x4148c, 0x0}, ++ {0x4148d, 0x0}, ++ {0x4148e, 0x0}, ++ {0x4148f, 0x0}, ++ {0x41490, 0x0}, ++ {0x41491, 0x0}, ++ {0x41492, 0x0}, ++ {0x41493, 0x0}, ++ {0x41494, 0x0}, ++ {0x41495, 0x0}, ++ {0x41496, 0x0}, ++ {0x41497, 0x0}, ++ {0x41498, 0x0}, ++ {0x41499, 0x0}, ++ {0x4149a, 0x0}, ++ {0x4149b, 0x0}, ++ {0x4149c, 0x0}, ++ {0x4149d, 0x0}, ++ {0x4149e, 0x0}, ++ {0x4149f, 0x0}, ++ {0x414a0, 0x0}, ++ {0x414a1, 0x0}, ++ {0x414a2, 0x0}, ++ {0x414a3, 0x0}, ++ {0x414a4, 0x0}, ++ {0x414a5, 0x0}, ++ {0x414a6, 0x0}, ++ {0x414a7, 0x0}, ++ {0x414a8, 0x0}, ++ {0x414a9, 0x0}, ++ {0x414aa, 0x0}, ++ {0x414ab, 0x0}, ++ {0x414ac, 0x0}, ++ {0x414ad, 0x0}, ++ {0x414ae, 0x0}, ++ {0x414af, 0x0}, ++ {0x414b0, 0x0}, ++ {0x414b1, 0x0}, ++ {0x414b2, 0x0}, ++ {0x414b3, 0x0}, ++ {0x414b4, 0x0}, ++ {0x414b5, 0x0}, ++ {0x414b6, 0x0}, ++ {0x414b7, 0x0}, ++ {0x414b8, 0x0}, ++ {0x414b9, 0x0}, ++ {0x414ba, 0x0}, ++ {0x414bb, 0x0}, ++ {0x414bc, 0x0}, ++ {0x414bd, 0x0}, ++ {0x414be, 0x0}, ++ {0x414bf, 0x0}, ++ {0x414c0, 0x0}, ++ {0x414c1, 0x0}, ++ {0x414c2, 0x0}, ++ {0x414c3, 0x0}, ++ {0x414c4, 0x0}, ++ {0x414c5, 0x0}, ++ {0x414c6, 0x0}, ++ {0x414c7, 0x0}, ++ {0x414c8, 0x0}, ++ {0x414c9, 0x0}, ++ {0x414ca, 0x0}, ++ {0x414cb, 0x0}, ++ {0x414cc, 0x0}, ++ {0x414cd, 0x0}, ++ {0x414ce, 0x0}, ++ {0x414cf, 0x0}, ++ {0x414d0, 0x0}, ++ {0x414d1, 0x0}, ++ {0x414d2, 0x0}, ++ {0x414d3, 0x0}, ++ {0x414d4, 0x0}, ++ {0x414d5, 0x0}, ++ {0x414d6, 0x0}, ++ {0x414d7, 0x0}, ++ {0x414d8, 0x0}, ++ {0x414d9, 0x0}, ++ {0x414da, 0x0}, ++ {0x414db, 0x0}, ++ {0x414dc, 0x0}, ++ {0x414dd, 0x0}, ++ {0x414de, 0x0}, ++ {0x414df, 0x0}, ++ {0x414e0, 0x0}, ++ {0x414e1, 0x0}, ++ {0x414e2, 0x0}, ++ {0x414e3, 0x0}, ++ {0x414e4, 0x0}, ++ {0x414e5, 0x0}, ++ {0x414e6, 0x0}, ++ {0x414e7, 0x0}, ++ {0x414e8, 0x0}, ++ {0x414e9, 0x0}, ++ {0x414ea, 0x0}, ++ {0x414eb, 0x0}, ++ {0x414ec, 0x0}, ++ {0x414ed, 0x0}, ++ {0x414ee, 0x0}, ++ {0x414ef, 0x0}, ++ {0x414f0, 0x0}, ++ {0x414f1, 0x0}, ++ {0x414f2, 0x0}, ++ {0x414f3, 0x0}, ++ {0x414f4, 0x0}, ++ {0x414f5, 0x0}, ++ {0x414f6, 0x0}, ++ {0x414f7, 0x0}, ++ {0x414f8, 0x0}, ++ {0x414f9, 0x0}, ++ {0x414fa, 0x0}, ++ {0x414fb, 0x0}, ++ {0x414fc, 0x0}, ++ {0x414fd, 0x0}, ++ {0x414fe, 0x0}, ++ {0x414ff, 0x0}, ++ {0x41500, 0x0}, ++ {0x41501, 0x0}, ++ {0x41502, 0x0}, ++ {0x41503, 0x0}, ++ {0x41504, 0x0}, ++ {0x41505, 0x0}, ++ {0x41506, 0x0}, ++ {0x41507, 0x0}, ++ {0x41508, 0x0}, ++ {0x41509, 0x0}, ++ {0x4150a, 0x0}, ++ {0x4150b, 0x0}, ++ {0x4150c, 0x0}, ++ {0x4150d, 0x0}, ++ {0x4150e, 0x0}, ++ {0x4150f, 0x0}, ++ {0x41510, 0x0}, ++ {0x41511, 0x0}, ++ {0x41512, 0x0}, ++ {0x41513, 0x0}, ++ {0x41514, 0x0}, ++ {0x41515, 0x0}, ++ {0x41516, 0x0}, ++ {0x41517, 0x0}, ++ {0x41518, 0x0}, ++ {0x41519, 0x0}, ++ {0x4151a, 0x0}, ++ {0x4151b, 0x0}, ++ {0x4151c, 0x0}, ++ {0x4151d, 0x0}, ++ {0x4151e, 0x0}, ++ {0x4151f, 0x0}, ++ {0x41520, 0x0}, ++ {0x41521, 0x0}, ++ {0x41522, 0x0}, ++ {0x41523, 0x0}, ++ {0x41524, 0x0}, ++ {0x41525, 0x0}, ++ {0x41526, 0x0}, ++ {0x41527, 0x0}, ++ {0x41528, 0x0}, ++ {0x41529, 0x0}, ++ {0x4152a, 0x0}, ++ {0x4152b, 0x0}, ++ {0x4152c, 0x0}, ++ {0x4152d, 0x0}, ++ {0x4152e, 0x0}, ++ {0x4152f, 0x0}, ++ {0x41530, 0x0}, ++ {0x41531, 0x0}, ++ {0x41532, 0x0}, ++ {0x41533, 0x0}, ++ {0x41534, 0x0}, ++ {0x41535, 0x0}, ++ {0x41536, 0x0}, ++ {0x41537, 0x0}, ++ {0x41538, 0x0}, ++ {0x41539, 0x0}, ++ {0x4153a, 0x0}, ++ {0x4153b, 0x0}, ++ {0x4153c, 0x0}, ++ {0x4153d, 0x0}, ++ {0x4153e, 0x0}, ++ {0x4153f, 0x0}, ++ {0x41540, 0x0}, ++ {0x41541, 0x0}, ++ {0x41542, 0x0}, ++ {0x41543, 0x0}, ++ {0x41544, 0x0}, ++ {0x41545, 0x0}, ++ {0x41546, 0x0}, ++ {0x41547, 0x0}, ++ {0x41548, 0x0}, ++ {0x41549, 0x0}, ++ {0x4154a, 0x0}, ++ {0x4154b, 0x0}, ++ {0x4154c, 0x0}, ++ {0x4154d, 0x0}, ++ {0x4154e, 0x0}, ++ {0x4154f, 0x0}, ++ {0x41550, 0x0}, ++ {0x41551, 0x0}, ++ {0x41552, 0x0}, ++ {0x41553, 0x0}, ++ {0x41554, 0x0}, ++ {0x41555, 0x0}, ++ {0x41556, 0x0}, ++ {0x41557, 0x0}, ++ {0x41558, 0x0}, ++ {0x41559, 0x0}, ++ {0x4155a, 0x0}, ++ {0x4155b, 0x0}, ++ {0x4155c, 0x0}, ++ {0x4155d, 0x0}, ++ {0x4155e, 0x0}, ++ {0x4155f, 0x0}, ++ {0x41560, 0x0}, ++ {0x41561, 0x0}, ++ {0x41562, 0x0}, ++ {0x41563, 0x0}, ++ {0x41564, 0x0}, ++ {0x41565, 0x0}, ++ {0x41566, 0x0}, ++ {0x41567, 0x0}, ++ {0x41568, 0x0}, ++ {0x41569, 0x0}, ++ {0x4156a, 0x0}, ++ {0x4156b, 0x0}, ++ {0x4156c, 0x0}, ++ {0x4156d, 0x0}, ++ {0x4156e, 0x0}, ++ {0x4156f, 0x0}, ++ {0x41570, 0x0}, ++ {0x41571, 0x0}, ++ {0x41572, 0x0}, ++ {0x41573, 0x0}, ++ {0x41574, 0x0}, ++ {0x41575, 0x0}, ++ {0x41576, 0x0}, ++ {0x41577, 0x0}, ++ {0x41578, 0x0}, ++ {0x41579, 0x0}, ++ {0x4157a, 0x0}, ++ {0x4157b, 0x0}, ++ {0x4157c, 0x0}, ++ {0x4157d, 0x0}, ++ {0x4157e, 0x0}, ++ {0x4157f, 0x0}, ++ {0x41580, 0x0}, ++ {0x41581, 0x0}, ++ {0x41582, 0x0}, ++ {0x41583, 0x0}, ++ {0x41584, 0x0}, ++ {0x41585, 0x0}, ++ {0x41586, 0x0}, ++ {0x41587, 0x0}, ++ {0x41588, 0x0}, ++ {0x41589, 0x0}, ++ {0x4158a, 0x0}, ++ {0x4158b, 0x0}, ++ {0x4158c, 0x0}, ++ {0x4158d, 0x0}, ++ {0x4158e, 0x0}, ++ {0x4158f, 0x0}, ++ {0x41590, 0x0}, ++ {0x41591, 0x0}, ++ {0x41592, 0x0}, ++ {0x41593, 0x0}, ++ {0x41594, 0x0}, ++ {0x41595, 0x0}, ++ {0x41596, 0x0}, ++ {0x41597, 0x0}, ++ {0x41598, 0x0}, ++ {0x41599, 0x0}, ++ {0x4159a, 0x0}, ++ {0x4159b, 0x0}, ++ {0x4159c, 0x0}, ++ {0x4159d, 0x0}, ++ {0x4159e, 0x0}, ++ {0x4159f, 0x0}, ++ {0x415a0, 0x0}, ++ {0x415a1, 0x0}, ++ {0x415a2, 0x0}, ++ {0x415a3, 0x0}, ++ {0x415a4, 0x0}, ++ {0x415a5, 0x0}, ++ {0x415a6, 0x0}, ++ {0x415a7, 0x0}, ++ {0x415a8, 0x0}, ++ {0x415a9, 0x0}, ++ {0x415aa, 0x0}, ++ {0x415ab, 0x0}, ++ {0x415ac, 0x0}, ++ {0x415ad, 0x0}, ++ {0x415ae, 0x0}, ++ {0x415af, 0x0}, ++ {0x415b0, 0x0}, ++ {0x415b1, 0x0}, ++ {0x415b2, 0x0}, ++ {0x415b3, 0x0}, ++ {0x415b4, 0x0}, ++ {0x415b5, 0x0}, ++ {0x415b6, 0x0}, ++ {0x415b7, 0x0}, ++ {0x415b8, 0x0}, ++ {0x415b9, 0x0}, ++ {0x415ba, 0x0}, ++ {0x415bb, 0x0}, ++ {0x415bc, 0x0}, ++ {0x415bd, 0x0}, ++ {0x415be, 0x0}, ++ {0x415bf, 0x0}, ++ {0x415c0, 0x0}, ++ {0x415c1, 0x0}, ++ {0x415c2, 0x0}, ++ {0x415c3, 0x0}, ++ {0x415c4, 0x0}, ++ {0x415c5, 0x0}, ++ {0x415c6, 0x0}, ++ {0x415c7, 0x0}, ++ {0x415c8, 0x0}, ++ {0x415c9, 0x0}, ++ {0x415ca, 0x0}, ++ {0x415cb, 0x0}, ++ {0x415cc, 0x0}, ++ {0x415cd, 0x0}, ++ {0x415ce, 0x0}, ++ {0x415cf, 0x0}, ++ {0x415d0, 0x0}, ++ {0x415d1, 0x0}, ++ {0x415d2, 0x0}, ++ {0x415d3, 0x0}, ++ {0x415d4, 0x0}, ++ {0x415d5, 0x0}, ++ {0x415d6, 0x0}, ++ {0x415d7, 0x0}, ++ {0x415d8, 0x0}, ++ {0x415d9, 0x0}, ++ {0x415da, 0x0}, ++ {0x415db, 0x0}, ++ {0x415dc, 0x0}, ++ {0x415dd, 0x0}, ++ {0x415de, 0x0}, ++ {0x415df, 0x0}, ++ {0x415e0, 0x0}, ++ {0x415e1, 0x0}, ++ {0x415e2, 0x0}, ++ {0x415e3, 0x0}, ++ {0x415e4, 0x0}, ++ {0x415e5, 0x0}, ++ {0x415e6, 0x0}, ++ {0x415e7, 0x0}, ++ {0x415e8, 0x0}, ++ {0x415e9, 0x0}, ++ {0x415ea, 0x0}, ++ {0x415eb, 0x0}, ++ {0x415ec, 0x0}, ++ {0x415ed, 0x0}, ++ {0x415ee, 0x0}, ++ {0x415ef, 0x0}, ++ {0x415f0, 0x0}, ++ {0x415f1, 0x0}, ++ {0x415f2, 0x0}, ++ {0x415f3, 0x0}, ++ {0x415f4, 0x0}, ++ {0x415f5, 0x0}, ++ {0x415f6, 0x0}, ++ {0x415f7, 0x0}, ++ {0x415f8, 0x0}, ++ {0x415f9, 0x0}, ++ {0x415fa, 0x0}, ++ {0x415fb, 0x0}, ++ {0x415fc, 0x0}, ++ {0x415fd, 0x0}, ++ {0x415fe, 0x0}, ++ {0x415ff, 0x0}, ++ {0x41600, 0x0}, ++ {0x41601, 0x0}, ++ {0x41602, 0x0}, ++ {0x41603, 0x0}, ++ {0x41604, 0x0}, ++ {0x41605, 0x0}, ++ {0x41606, 0x0}, ++ {0x41607, 0x0}, ++ {0x41608, 0x0}, ++ {0x41609, 0x0}, ++ {0x4160a, 0x0}, ++ {0x4160b, 0x0}, ++ {0x4160c, 0x0}, ++ {0x4160d, 0x0}, ++ {0x4160e, 0x0}, ++ {0x4160f, 0x0}, ++ {0x41610, 0x0}, ++ {0x41611, 0x0}, ++ {0x41612, 0x0}, ++ {0x41613, 0x0}, ++ {0x41614, 0x0}, ++ {0x41615, 0x0}, ++ {0x41616, 0x0}, ++ {0x41617, 0x0}, ++ {0x41618, 0x0}, ++ {0x41619, 0x0}, ++ {0x4161a, 0x0}, ++ {0x4161b, 0x0}, ++ {0x4161c, 0x0}, ++ {0x4161d, 0x0}, ++ {0x4161e, 0x0}, ++ {0x4161f, 0x0}, ++ {0x41620, 0x0}, ++ {0x41621, 0x0}, ++ {0x41622, 0x0}, ++ {0x41623, 0x0}, ++ {0x41624, 0x0}, ++ {0x41625, 0x0}, ++ {0x41626, 0x0}, ++ {0x41627, 0x0}, ++ {0x41628, 0x0}, ++ {0x41629, 0x0}, ++ {0x4162a, 0x0}, ++ {0x4162b, 0x0}, ++ {0x4162c, 0x0}, ++ {0x4162d, 0x0}, ++ {0x4162e, 0x0}, ++ {0x4162f, 0x0}, ++ {0x41630, 0x0}, ++ {0x41631, 0x0}, ++ {0x41632, 0x0}, ++ {0x41633, 0x0}, ++ {0x41634, 0x0}, ++ {0x41635, 0x0}, ++ {0x41636, 0x0}, ++ {0x41637, 0x0}, ++ {0x41638, 0x0}, ++ {0x41639, 0x0}, ++ {0x4163a, 0x0}, ++ {0x4163b, 0x0}, ++ {0x4163c, 0x0}, ++ {0x4163d, 0x0}, ++ {0x4163e, 0x0}, ++ {0x4163f, 0x0}, ++ {0x41640, 0x0}, ++ {0x41641, 0x0}, ++ {0x41642, 0x0}, ++ {0x41643, 0x0}, ++ {0x41644, 0x0}, ++ {0x41645, 0x0}, ++ {0x41646, 0x0}, ++ {0x41647, 0x0}, ++ {0x41648, 0x0}, ++ {0x41649, 0x0}, ++ {0x4164a, 0x0}, ++ {0x4164b, 0x0}, ++ {0x4164c, 0x0}, ++ {0x4164d, 0x0}, ++ {0x4164e, 0x0}, ++ {0x4164f, 0x0}, ++ {0x41650, 0x0}, ++ {0x41651, 0x0}, ++ {0x41652, 0x0}, ++ {0x41653, 0x0}, ++ {0x41654, 0x0}, ++ {0x41655, 0x0}, ++ {0x41656, 0x0}, ++ {0x41657, 0x0}, ++ {0x41658, 0x0}, ++ {0x41659, 0x0}, ++ {0x4165a, 0x0}, ++ {0x4165b, 0x0}, ++ {0x4165c, 0x0}, ++ {0x4165d, 0x0}, ++ {0x4165e, 0x0}, ++ {0x4165f, 0x0}, ++ {0x41660, 0x0}, ++ {0x41661, 0x0}, ++ {0x41662, 0x0}, ++ {0x41663, 0x0}, ++ {0x41664, 0x0}, ++ {0x41665, 0x0}, ++ {0x41666, 0x0}, ++ {0x41667, 0x0}, ++ {0x41668, 0x0}, ++ {0x41669, 0x0}, ++ {0x4166a, 0x0}, ++ {0x4166b, 0x0}, ++ {0x4166c, 0x0}, ++ {0x4166d, 0x0}, ++ {0x4166e, 0x0}, ++ {0x4166f, 0x0}, ++ {0x41670, 0x0}, ++ {0x41671, 0x0}, ++ {0x41672, 0x0}, ++ {0x41673, 0x0}, ++ {0x41674, 0x0}, ++ {0x41675, 0x0}, ++ {0x41676, 0x0}, ++ {0x41677, 0x0}, ++ {0x41678, 0x0}, ++ {0x41679, 0x0}, ++ {0x4167a, 0x0}, ++ {0x4167b, 0x0}, ++ {0x4167c, 0x0}, ++ {0x4167d, 0x0}, ++ {0x4167e, 0x0}, ++ {0x4167f, 0x0}, ++ {0x41680, 0x0}, ++ {0x41681, 0x0}, ++ {0x41682, 0x0}, ++ {0x41683, 0x0}, ++ {0x41684, 0x0}, ++ {0x41685, 0x0}, ++ {0x41686, 0x0}, ++ {0x41687, 0x0}, ++ {0x41688, 0x0}, ++ {0x41689, 0x0}, ++ {0x4168a, 0x0}, ++ {0x4168b, 0x0}, ++ {0x4168c, 0x0}, ++ {0x4168d, 0x0}, ++ {0x4168e, 0x0}, ++ {0x4168f, 0x0}, ++ {0x41690, 0x0}, ++ {0x41691, 0x0}, ++ {0x41692, 0x0}, ++ {0x41693, 0x0}, ++ {0x41694, 0x0}, ++ {0x41695, 0x0}, ++ {0x41696, 0x0}, ++ {0x41697, 0x0}, ++ {0x41698, 0x0}, ++ {0x41699, 0x0}, ++ {0x4169a, 0x0}, ++ {0x4169b, 0x0}, ++ {0x4169c, 0x0}, ++ {0x4169d, 0x0}, ++ {0x4169e, 0x0}, ++ {0x4169f, 0x0}, ++ {0x416a0, 0x0}, ++ {0x416a1, 0x0}, ++ {0x416a2, 0x0}, ++ {0x416a3, 0x0}, ++ {0x416a4, 0x0}, ++ {0x416a5, 0x0}, ++ {0x416a6, 0x0}, ++ {0x416a7, 0x0}, ++ {0x416a8, 0x0}, ++ {0x416a9, 0x0}, ++ {0x416aa, 0x0}, ++ {0x416ab, 0x0}, ++ {0x416ac, 0x0}, ++ {0x416ad, 0x0}, ++ {0x416ae, 0x0}, ++ {0x416af, 0x0}, ++ {0x416b0, 0x0}, ++ {0x416b1, 0x0}, ++ {0x416b2, 0x0}, ++ {0x416b3, 0x0}, ++ {0x416b4, 0x0}, ++ {0x416b5, 0x0}, ++ {0x416b6, 0x0}, ++ {0x416b7, 0x0}, ++ {0x416b8, 0x0}, ++ {0x416b9, 0x0}, ++ {0x416ba, 0x0}, ++ {0x416bb, 0x0}, ++ {0x416bc, 0x0}, ++ {0x416bd, 0x0}, ++ {0x416be, 0x0}, ++ {0x416bf, 0x0}, ++ {0x416c0, 0x0}, ++ {0x416c1, 0x0}, ++ {0x416c2, 0x0}, ++ {0x416c3, 0x0}, ++ {0x416c4, 0x0}, ++ {0x416c5, 0x0}, ++ {0x416c6, 0x0}, ++ {0x416c7, 0x0}, ++ {0x416c8, 0x0}, ++ {0x416c9, 0x0}, ++ {0x416ca, 0x0}, ++ {0x416cb, 0x0}, ++ {0x416cc, 0x0}, ++ {0x416cd, 0x0}, ++ {0x416ce, 0x0}, ++ {0x416cf, 0x0}, ++ {0x416d0, 0x0}, ++ {0x416d1, 0x0}, ++ {0x416d2, 0x0}, ++ {0x416d3, 0x0}, ++ {0x416d4, 0x0}, ++ {0x416d5, 0x0}, ++ {0x416d6, 0x0}, ++ {0x416d7, 0x0}, ++ {0x416d8, 0x0}, ++ {0x416d9, 0x0}, ++ {0x416da, 0x0}, ++ {0x416db, 0x0}, ++ {0x416dc, 0x0}, ++ {0x416dd, 0x0}, ++ {0x416de, 0x0}, ++ {0x416df, 0x0}, ++ {0x416e0, 0x0}, ++ {0x416e1, 0x0}, ++ {0x416e2, 0x0}, ++ {0x416e3, 0x0}, ++ {0x416e4, 0x0}, ++ {0x416e5, 0x0}, ++ {0x416e6, 0x0}, ++ {0x416e7, 0x0}, ++ {0x416e8, 0x0}, ++ {0x416e9, 0x0}, ++ {0x416ea, 0x0}, ++ {0x416eb, 0x0}, ++ {0x416ec, 0x0}, ++ {0x416ed, 0x0}, ++ {0x416ee, 0x0}, ++ {0x416ef, 0x0}, ++ {0x416f0, 0x0}, ++ {0x416f1, 0x0}, ++ {0x416f2, 0x0}, ++ {0x416f3, 0x0}, ++ {0x416f4, 0x0}, ++ {0x416f5, 0x0}, ++ {0x416f6, 0x0}, ++ {0x416f7, 0x0}, ++ {0x416f8, 0x0}, ++ {0x416f9, 0x0}, ++ {0x416fa, 0x0}, ++ {0x416fb, 0x0}, ++ {0x416fc, 0x0}, ++ {0x416fd, 0x0}, ++ {0x416fe, 0x0}, ++ {0x416ff, 0x0}, ++ {0x41700, 0x0}, ++ {0x41701, 0x0}, ++ {0x41702, 0x0}, ++ {0x41703, 0x0}, ++ {0x41704, 0x0}, ++ {0x41705, 0x0}, ++ {0x41706, 0x0}, ++ {0x41707, 0x0}, ++ {0x41708, 0x0}, ++ {0x41709, 0x0}, ++ {0x4170a, 0x0}, ++ {0x4170b, 0x0}, ++ {0x4170c, 0x0}, ++ {0x4170d, 0x0}, ++ {0x4170e, 0x0}, ++ {0x4170f, 0x0}, ++ {0x41710, 0x0}, ++ {0x41711, 0x0}, ++ {0x41712, 0x0}, ++ {0x41713, 0x0}, ++ {0x41714, 0x0}, ++ {0x41715, 0x0}, ++ {0x41716, 0x0}, ++ {0x41717, 0x0}, ++ {0x41718, 0x0}, ++ {0x41719, 0x0}, ++ {0x4171a, 0x0}, ++ {0x4171b, 0x0}, ++ {0x4171c, 0x0}, ++ {0x4171d, 0x0}, ++ {0x4171e, 0x0}, ++ {0x4171f, 0x0}, ++ {0x41720, 0x0}, ++ {0x41721, 0x0}, ++ {0x41722, 0x0}, ++ {0x41723, 0x0}, ++ {0x41724, 0x0}, ++ {0x41725, 0x0}, ++ {0x41726, 0x0}, ++ {0x41727, 0x0}, ++ {0x41728, 0x0}, ++ {0x41729, 0x0}, ++ {0x4172a, 0x0}, ++ {0x4172b, 0x0}, ++ {0x4172c, 0x0}, ++ {0x4172d, 0x0}, ++ {0x4172e, 0x0}, ++ {0x4172f, 0x0}, ++ {0x41730, 0x0}, ++ {0x41731, 0x0}, ++ {0x41732, 0x0}, ++ {0x41733, 0x0}, ++ {0x41734, 0x0}, ++ {0x41735, 0x0}, ++ {0x41736, 0x0}, ++ {0x41737, 0x0}, ++ {0x41738, 0x0}, ++ {0x41739, 0x0}, ++ {0x4173a, 0x0}, ++ {0x4173b, 0x0}, ++ {0x4173c, 0x0}, ++ {0x4173d, 0x0}, ++ {0x4173e, 0x0}, ++ {0x4173f, 0x0}, ++ {0x41740, 0x0}, ++ {0x41741, 0x0}, ++ {0x41742, 0x0}, ++ {0x41743, 0x0}, ++ {0x41744, 0x0}, ++ {0x41745, 0x0}, ++ {0x41746, 0x0}, ++ {0x41747, 0x0}, ++ {0x41748, 0x0}, ++ {0x41749, 0x0}, ++ {0x4174a, 0x0}, ++ {0x4174b, 0x0}, ++ {0x4174c, 0x0}, ++ {0x4174d, 0x0}, ++ {0x4174e, 0x0}, ++ {0x4174f, 0x0}, ++ {0x41750, 0x0}, ++ {0x41751, 0x0}, ++ {0x41752, 0x0}, ++ {0x41753, 0x0}, ++ {0x41754, 0x0}, ++ {0x41755, 0x0}, ++ {0x41756, 0x0}, ++ {0x41757, 0x0}, ++ {0x41758, 0x0}, ++ {0x41759, 0x0}, ++ {0x4175a, 0x0}, ++ {0x4175b, 0x0}, ++ {0x4175c, 0x0}, ++ {0x4175d, 0x0}, ++ {0x4175e, 0x0}, ++ {0x4175f, 0x0}, ++ {0x41760, 0x0}, ++ {0x41761, 0x0}, ++ {0x41762, 0x0}, ++ {0x41763, 0x0}, ++ {0x41764, 0x0}, ++ {0x41765, 0x0}, ++ {0x41766, 0x0}, ++ {0x41767, 0x0}, ++ {0x41768, 0x0}, ++ {0x41769, 0x0}, ++ {0x4176a, 0x0}, ++ {0x4176b, 0x0}, ++ {0x4176c, 0x0}, ++ {0x4176d, 0x0}, ++ {0x4176e, 0x0}, ++ {0x4176f, 0x0}, ++ {0x41770, 0x0}, ++ {0x41771, 0x0}, ++ {0x41772, 0x0}, ++ {0x41773, 0x0}, ++ {0x41774, 0x0}, ++ {0x41775, 0x0}, ++ {0x41776, 0x0}, ++ {0x41777, 0x0}, ++ {0x41778, 0x0}, ++ {0x41779, 0x0}, ++ {0x4177a, 0x0}, ++ {0x4177b, 0x0}, ++ {0x4177c, 0x0}, ++ {0x4177d, 0x0}, ++ {0x4177e, 0x0}, ++ {0x4177f, 0x0}, ++ {0x41780, 0x0}, ++ {0x41781, 0x0}, ++ {0x41782, 0x0}, ++ {0x41783, 0x0}, ++ {0x41784, 0x0}, ++ {0x41785, 0x0}, ++ {0x41786, 0x0}, ++ {0x41787, 0x0}, ++ {0x41788, 0x0}, ++ {0x41789, 0x0}, ++ {0x4178a, 0x0}, ++ {0x4178b, 0x0}, ++ {0x4178c, 0x0}, ++ {0x4178d, 0x0}, ++ {0x4178e, 0x0}, ++ {0x4178f, 0x0}, ++ {0x41790, 0x0}, ++ {0x41791, 0x0}, ++ {0x41792, 0x0}, ++ {0x41793, 0x0}, ++ {0x41794, 0x0}, ++ {0x41795, 0x0}, ++ {0x41796, 0x0}, ++ {0x41797, 0x0}, ++ {0x41798, 0x0}, ++ {0x41799, 0x0}, ++ {0x4179a, 0x0}, ++ {0x4179b, 0x0}, ++ {0x4179c, 0x0}, ++ {0x4179d, 0x0}, ++ {0x4179e, 0x0}, ++ {0x4179f, 0x0}, ++ {0x417a0, 0x0}, ++ {0x417a1, 0x0}, ++ {0x417a2, 0x0}, ++ {0x417a3, 0x0}, ++ {0x417a4, 0x0}, ++ {0x417a5, 0x0}, ++ {0x417a6, 0x0}, ++ {0x417a7, 0x0}, ++ {0x417a8, 0x0}, ++ {0x417a9, 0x0}, ++ {0x417aa, 0x0}, ++ {0x417ab, 0x0}, ++ {0x417ac, 0x0}, ++ {0x417ad, 0x0}, ++ {0x417ae, 0x0}, ++ {0x417af, 0x0}, ++ {0x417b0, 0x0}, ++ {0x417b1, 0x0}, ++ {0x417b2, 0x0}, ++ {0x417b3, 0x0}, ++ {0x417b4, 0x0}, ++ {0x417b5, 0x0}, ++ {0x417b6, 0x0}, ++ {0x417b7, 0x0}, ++ {0x417b8, 0x0}, ++ {0x417b9, 0x0}, ++ {0x417ba, 0x0}, ++ {0x417bb, 0x0}, ++ {0x417bc, 0x0}, ++ {0x417bd, 0x0}, ++ {0x417be, 0x0}, ++ {0x417bf, 0x0}, ++ {0x417c0, 0x0}, ++ {0x417c1, 0x0}, ++ {0x417c2, 0x0}, ++ {0x417c3, 0x0}, ++ {0x417c4, 0x0}, ++ {0x417c5, 0x0}, ++ {0x417c6, 0x0}, ++ {0x417c7, 0x0}, ++ {0x417c8, 0x0}, ++ {0x417c9, 0x0}, ++ {0x417ca, 0x0}, ++ {0x417cb, 0x0}, ++ {0x417cc, 0x0}, ++ {0x417cd, 0x0}, ++ {0x417ce, 0x0}, ++ {0x417cf, 0x0}, ++ {0x417d0, 0x0}, ++ {0x417d1, 0x0}, ++ {0x417d2, 0x0}, ++ {0x417d3, 0x0}, ++ {0x417d4, 0x0}, ++ {0x417d5, 0x0}, ++ {0x417d6, 0x0}, ++ {0x417d7, 0x0}, ++ {0x417d8, 0x0}, ++ {0x417d9, 0x0}, ++ {0x417da, 0x0}, ++ {0x417db, 0x0}, ++ {0x417dc, 0x0}, ++ {0x417dd, 0x0}, ++ {0x417de, 0x0}, ++ {0x417df, 0x0}, ++ {0x417e0, 0x0}, ++ {0x417e1, 0x0}, ++ {0x417e2, 0x0}, ++ {0x417e3, 0x0}, ++ {0x417e4, 0x0}, ++ {0x417e5, 0x0}, ++ {0x417e6, 0x0}, ++ {0x417e7, 0x0}, ++ {0x417e8, 0x0}, ++ {0x417e9, 0x0}, ++ {0x417ea, 0x0}, ++ {0x417eb, 0x0}, ++ {0x417ec, 0x0}, ++ {0x417ed, 0x0}, ++ {0x417ee, 0x0}, ++ {0x417ef, 0x0}, ++ {0x417f0, 0x0}, ++ {0x417f1, 0x0}, ++ {0x417f2, 0x0}, ++ {0x417f3, 0x0}, ++ {0x417f4, 0x0}, ++ {0x417f5, 0x0}, ++ {0x417f6, 0x0}, ++ {0x417f7, 0x0}, ++ {0x417f8, 0x0}, ++ {0x417f9, 0x0}, ++ {0x417fa, 0x0}, ++ {0x417fb, 0x0}, ++ {0x417fc, 0x0}, ++ {0x417fd, 0x0}, ++ {0x417fe, 0x0}, ++ {0x417ff, 0x0}, ++ {0x41800, 0x0}, ++ {0x41801, 0x0}, ++ {0x41802, 0x0}, ++ {0x41803, 0x0}, ++ {0x41804, 0x0}, ++ {0x41805, 0x0}, ++ {0x41806, 0x0}, ++ {0x41807, 0x0}, ++ {0x41808, 0x0}, ++ {0x41809, 0x0}, ++ {0x4180a, 0x0}, ++ {0x4180b, 0x0}, ++ {0x4180c, 0x0}, ++ {0x4180d, 0x0}, ++ {0x4180e, 0x0}, ++ {0x4180f, 0x0}, ++ {0x41810, 0x0}, ++ {0x41811, 0x0}, ++ {0x41812, 0x0}, ++ {0x41813, 0x0}, ++ {0x41814, 0x0}, ++ {0x41815, 0x0}, ++ {0x41816, 0x0}, ++ {0x41817, 0x0}, ++ {0x41818, 0x0}, ++ {0x41819, 0x0}, ++ {0x4181a, 0x0}, ++ {0x4181b, 0x0}, ++ {0x4181c, 0x0}, ++ {0x4181d, 0x0}, ++ {0x4181e, 0x0}, ++ {0x4181f, 0x0}, ++ {0x41820, 0x0}, ++ {0x41821, 0x0}, ++ {0x41822, 0x0}, ++ {0x41823, 0x0}, ++ {0x41824, 0x0}, ++ {0x41825, 0x0}, ++ {0x41826, 0x0}, ++ {0x41827, 0x0}, ++ {0x41828, 0x0}, ++ {0x41829, 0x0}, ++ {0x4182a, 0x0}, ++ {0x4182b, 0x0}, ++ {0x4182c, 0x0}, ++ {0x4182d, 0x0}, ++ {0x4182e, 0x0}, ++ {0x4182f, 0x0}, ++ {0x41830, 0x0}, ++ {0x41831, 0x0}, ++ {0x41832, 0x0}, ++ {0x41833, 0x0}, ++ {0x41834, 0x0}, ++ {0x41835, 0x0}, ++ {0x41836, 0x0}, ++ {0x41837, 0x0}, ++ {0x41838, 0x0}, ++ {0x41839, 0x0}, ++ {0x4183a, 0x0}, ++ {0x4183b, 0x0}, ++ {0x4183c, 0x0}, ++ {0x4183d, 0x0}, ++ {0x4183e, 0x0}, ++ {0x4183f, 0x0}, ++ {0x41840, 0x0}, ++ {0x41841, 0x0}, ++ {0x41842, 0x0}, ++ {0x41843, 0x0}, ++ {0x41844, 0x0}, ++ {0x41845, 0x0}, ++ {0x41846, 0x0}, ++ {0x41847, 0x0}, ++ {0x41848, 0x0}, ++ {0x41849, 0x0}, ++ {0x4184a, 0x0}, ++ {0x4184b, 0x0}, ++ {0x4184c, 0x0}, ++ {0x4184d, 0x0}, ++ {0x4184e, 0x0}, ++ {0x4184f, 0x0}, ++ {0x41850, 0x0}, ++ {0x41851, 0x0}, ++ {0x41852, 0x0}, ++ {0x41853, 0x0}, ++ {0x41854, 0x0}, ++ {0x41855, 0x0}, ++ {0x41856, 0x0}, ++ {0x41857, 0x0}, ++ {0x41858, 0x0}, ++ {0x41859, 0x0}, ++ {0x4185a, 0x0}, ++ {0x4185b, 0x0}, ++ {0x4185c, 0x0}, ++ {0x4185d, 0x0}, ++ {0x4185e, 0x0}, ++ {0x4185f, 0x0}, ++ {0x41860, 0x0}, ++ {0x41861, 0x0}, ++ {0x41862, 0x0}, ++ {0x41863, 0x0}, ++ {0x41864, 0x0}, ++ {0x41865, 0x0}, ++ {0x41866, 0x0}, ++ {0x41867, 0x0}, ++ {0x41868, 0x0}, ++ {0x41869, 0x0}, ++ {0x4186a, 0x0}, ++ {0x4186b, 0x0}, ++ {0x4186c, 0x0}, ++ {0x4186d, 0x0}, ++ {0x4186e, 0x0}, ++ {0x4186f, 0x0}, ++ {0x41870, 0x0}, ++ {0x41871, 0x0}, ++ {0x41872, 0x0}, ++ {0x41873, 0x0}, ++ {0x41874, 0x0}, ++ {0x41875, 0x0}, ++ {0x41876, 0x0}, ++ {0x41877, 0x0}, ++ {0x41878, 0x0}, ++ {0x41879, 0x0}, ++ {0x4187a, 0x0}, ++ {0x4187b, 0x0}, ++ {0x4187c, 0x0}, ++ {0x4187d, 0x0}, ++ {0x4187e, 0x0}, ++ {0x4187f, 0x0}, ++ {0x41880, 0x0}, ++ {0x41881, 0x0}, ++ {0x41882, 0x0}, ++ {0x41883, 0x0}, ++ {0x41884, 0x0}, ++ {0x41885, 0x0}, ++ {0x41886, 0x0}, ++ {0x41887, 0x0}, ++ {0x41888, 0x0}, ++ {0x41889, 0x0}, ++ {0x4188a, 0x0}, ++ {0x4188b, 0x0}, ++ {0x4188c, 0x0}, ++ {0x4188d, 0x0}, ++ {0x4188e, 0x0}, ++ {0x4188f, 0x0}, ++ {0x41890, 0x0}, ++ {0x41891, 0x0}, ++ {0x41892, 0x0}, ++ {0x41893, 0x0}, ++ {0x41894, 0x0}, ++ {0x41895, 0x0}, ++ {0x41896, 0x0}, ++ {0x41897, 0x0}, ++ {0x41898, 0x0}, ++ {0x41899, 0x0}, ++ {0x4189a, 0x0}, ++ {0x4189b, 0x0}, ++ {0x4189c, 0x0}, ++ {0x4189d, 0x0}, ++ {0x4189e, 0x0}, ++ {0x4189f, 0x0}, ++ {0x418a0, 0x0}, ++ {0x418a1, 0x0}, ++ {0x418a2, 0x0}, ++ {0x418a3, 0x0}, ++ {0x418a4, 0x0}, ++ {0x418a5, 0x0}, ++ {0x418a6, 0x0}, ++ {0x418a7, 0x0}, ++ {0x418a8, 0x0}, ++ {0x418a9, 0x0}, ++ {0x418aa, 0x0}, ++ {0x418ab, 0x0}, ++ {0x418ac, 0x0}, ++ {0x418ad, 0x0}, ++ {0x418ae, 0x0}, ++ {0x418af, 0x0}, ++ {0x418b0, 0x0}, ++ {0x418b1, 0x0}, ++ {0x418b2, 0x0}, ++ {0x418b3, 0x0}, ++ {0x418b4, 0x0}, ++ {0x418b5, 0x0}, ++ {0x418b6, 0x0}, ++ {0x418b7, 0x0}, ++ {0x418b8, 0x0}, ++ {0x418b9, 0x0}, ++ {0x418ba, 0x0}, ++ {0x418bb, 0x0}, ++ {0x418bc, 0x0}, ++ {0x418bd, 0x0}, ++ {0x418be, 0x0}, ++ {0x418bf, 0x0}, ++ {0x418c0, 0x0}, ++ {0x418c1, 0x0}, ++ {0x418c2, 0x0}, ++ {0x418c3, 0x0}, ++ {0x418c4, 0x0}, ++ {0x418c5, 0x0}, ++ {0x418c6, 0x0}, ++ {0x418c7, 0x0}, ++ {0x418c8, 0x0}, ++ {0x418c9, 0x0}, ++ {0x418ca, 0x0}, ++ {0x418cb, 0x0}, ++ {0x418cc, 0x0}, ++ {0x418cd, 0x0}, ++ {0x418ce, 0x0}, ++ {0x418cf, 0x0}, ++ {0x418d0, 0x0}, ++ {0x418d1, 0x0}, ++ {0x418d2, 0x0}, ++ {0x418d3, 0x0}, ++ {0x418d4, 0x0}, ++ {0x418d5, 0x0}, ++ {0x418d6, 0x0}, ++ {0x418d7, 0x0}, ++ {0x418d8, 0x0}, ++ {0x418d9, 0x0}, ++ {0x418da, 0x0}, ++ {0x418db, 0x0}, ++ {0x418dc, 0x0}, ++ {0x418dd, 0x0}, ++ {0x418de, 0x0}, ++ {0x418df, 0x0}, ++ {0x418e0, 0x0}, ++ {0x418e1, 0x0}, ++ {0x418e2, 0x0}, ++ {0x418e3, 0x0}, ++ {0x418e4, 0x0}, ++ {0x418e5, 0x0}, ++ {0x418e6, 0x0}, ++ {0x418e7, 0x0}, ++ {0x418e8, 0x0}, ++ {0x418e9, 0x0}, ++ {0x418ea, 0x0}, ++ {0x418eb, 0x0}, ++ {0x418ec, 0x0}, ++ {0x418ed, 0x0}, ++ {0x418ee, 0x0}, ++ {0x418ef, 0x0}, ++ {0x418f0, 0x0}, ++ {0x418f1, 0x0}, ++ {0x418f2, 0x0}, ++ {0x418f3, 0x0}, ++ {0x418f4, 0x0}, ++ {0x418f5, 0x0}, ++ {0x418f6, 0x0}, ++ {0x418f7, 0x0}, ++ {0x418f8, 0x0}, ++ {0x418f9, 0x0}, ++ {0x418fa, 0x0}, ++ {0x418fb, 0x0}, ++ {0x418fc, 0x0}, ++ {0x418fd, 0x0}, ++ {0x418fe, 0x0}, ++ {0x418ff, 0x0}, ++ {0x41900, 0x0}, ++ {0x41901, 0x0}, ++ {0x41902, 0x0}, ++ {0x41903, 0x0}, ++ {0x41904, 0x0}, ++ {0x41905, 0x0}, ++ {0x41906, 0x0}, ++ {0x41907, 0x0}, ++ {0x41908, 0x0}, ++ {0x41909, 0x0}, ++ {0x4190a, 0x0}, ++ {0x4190b, 0x0}, ++ {0x4190c, 0x0}, ++ {0x4190d, 0x0}, ++ {0x4190e, 0x0}, ++ {0x4190f, 0x0}, ++ {0x41910, 0x0}, ++ {0x41911, 0x0}, ++ {0x41912, 0x0}, ++ {0x41913, 0x0}, ++ {0x41914, 0x0}, ++ {0x41915, 0x0}, ++ {0x41916, 0x0}, ++ {0x41917, 0x0}, ++ {0x41918, 0x0}, ++ {0x41919, 0x0}, ++ {0x4191a, 0x0}, ++ {0x4191b, 0x0}, ++ {0x4191c, 0x0}, ++ {0x4191d, 0x0}, ++ {0x4191e, 0x0}, ++ {0x4191f, 0x0}, ++ {0x41920, 0x0}, ++ {0x41921, 0x0}, ++ {0x41922, 0x0}, ++ {0x41923, 0x0}, ++ {0x41924, 0x0}, ++ {0x41925, 0x0}, ++ {0x41926, 0x0}, ++ {0x41927, 0x0}, ++ {0x41928, 0x0}, ++ {0x41929, 0x0}, ++ {0x4192a, 0x0}, ++ {0x4192b, 0x0}, ++ {0x4192c, 0x0}, ++ {0x4192d, 0x0}, ++ {0x4192e, 0x0}, ++ {0x4192f, 0x0}, ++ {0x41930, 0x0}, ++ {0x41931, 0x0}, ++ {0x41932, 0x0}, ++ {0x41933, 0x0}, ++ {0x41934, 0x0}, ++ {0x41935, 0x0}, ++ {0x41936, 0x0}, ++ {0x41937, 0x0}, ++ {0x41938, 0x0}, ++ {0x41939, 0x0}, ++ {0x4193a, 0x0}, ++ {0x4193b, 0x0}, ++ {0x4193c, 0x0}, ++ {0x4193d, 0x0}, ++ {0x4193e, 0x0}, ++ {0x4193f, 0x0}, ++ {0x41940, 0x0}, ++ {0x41941, 0x0}, ++ {0x41942, 0x0}, ++ {0x41943, 0x0}, ++ {0x41944, 0x0}, ++ {0x41945, 0x0}, ++ {0x41946, 0x0}, ++ {0x41947, 0x0}, ++ {0x41948, 0x0}, ++ {0x41949, 0x0}, ++ {0x4194a, 0x0}, ++ {0x4194b, 0x0}, ++ {0x4194c, 0x0}, ++ {0x4194d, 0x0}, ++ {0x4194e, 0x0}, ++ {0x4194f, 0x0}, ++ {0x41950, 0x0}, ++ {0x41951, 0x0}, ++ {0x41952, 0x0}, ++ {0x41953, 0x0}, ++ {0x41954, 0x0}, ++ {0x41955, 0x0}, ++ {0x41956, 0x0}, ++ {0x41957, 0x0}, ++ {0x41958, 0x0}, ++ {0x41959, 0x0}, ++ {0x4195a, 0x0}, ++ {0x4195b, 0x0}, ++ {0x4195c, 0x0}, ++ {0x4195d, 0x0}, ++ {0x4195e, 0x0}, ++ {0x4195f, 0x0}, ++ {0x41960, 0x0}, ++ {0x41961, 0x0}, ++ {0x41962, 0x0}, ++ {0x41963, 0x0}, ++ {0x41964, 0x0}, ++ {0x41965, 0x0}, ++ {0x41966, 0x0}, ++ {0x41967, 0x0}, ++ {0x41968, 0x0}, ++ {0x41969, 0x0}, ++ {0x4196a, 0x0}, ++ {0x4196b, 0x0}, ++ {0x4196c, 0x0}, ++ {0x4196d, 0x0}, ++ {0x4196e, 0x0}, ++ {0x4196f, 0x0}, ++ {0x41970, 0x0}, ++ {0x41971, 0x0}, ++ {0x41972, 0x0}, ++ {0x41973, 0x0}, ++ {0x41974, 0x0}, ++ {0x41975, 0x0}, ++ {0x41976, 0x0}, ++ {0x41977, 0x0}, ++ {0x41978, 0x0}, ++ {0x41979, 0x0}, ++ {0x4197a, 0x0}, ++ {0x4197b, 0x0}, ++ {0x4197c, 0x0}, ++ {0x4197d, 0x0}, ++ {0x4197e, 0x0}, ++ {0x4197f, 0x0}, ++ {0x41980, 0x0}, ++ {0x41981, 0x0}, ++ {0x41982, 0x0}, ++ {0x41983, 0x0}, ++ {0x41984, 0x0}, ++ {0x41985, 0x0}, ++ {0x41986, 0x0}, ++ {0x41987, 0x0}, ++ {0x41988, 0x0}, ++ {0x41989, 0x0}, ++ {0x4198a, 0x0}, ++ {0x4198b, 0x0}, ++ {0x4198c, 0x0}, ++ {0x4198d, 0x0}, ++ {0x4198e, 0x0}, ++ {0x4198f, 0x0}, ++ {0x41990, 0x0}, ++ {0x41991, 0x0}, ++ {0x41992, 0x0}, ++ {0x41993, 0x0}, ++ {0x41994, 0x0}, ++ {0x41995, 0x0}, ++ {0x41996, 0x0}, ++ {0x41997, 0x0}, ++ {0x41998, 0x0}, ++ {0x41999, 0x0}, ++ {0x4199a, 0x0}, ++ {0x4199b, 0x0}, ++ {0x4199c, 0x0}, ++ {0x4199d, 0x0}, ++ {0x4199e, 0x0}, ++ {0x4199f, 0x0}, ++ {0x419a0, 0x0}, ++ {0x419a1, 0x0}, ++ {0x419a2, 0x0}, ++ {0x419a3, 0x0}, ++ {0x419a4, 0x0}, ++ {0x419a5, 0x0}, ++ {0x419a6, 0x0}, ++ {0x419a7, 0x0}, ++ {0x419a8, 0x0}, ++ {0x419a9, 0x0}, ++ {0x419aa, 0x0}, ++ {0x419ab, 0x0}, ++ {0x419ac, 0x0}, ++ {0x419ad, 0x0}, ++ {0x419ae, 0x0}, ++ {0x419af, 0x0}, ++ {0x419b0, 0x0}, ++ {0x419b1, 0x0}, ++ {0x419b2, 0x0}, ++ {0x419b3, 0x0}, ++ {0x419b4, 0x0}, ++ {0x419b5, 0x0}, ++ {0x419b6, 0x0}, ++ {0x419b7, 0x0}, ++ {0x419b8, 0x0}, ++ {0x419b9, 0x0}, ++ {0x419ba, 0x0}, ++ {0x419bb, 0x0}, ++ {0x419bc, 0x0}, ++ {0x419bd, 0x0}, ++ {0x419be, 0x0}, ++ {0x419bf, 0x0}, ++ {0x419c0, 0x0}, ++ {0x419c1, 0x0}, ++ {0x419c2, 0x0}, ++ {0x419c3, 0x0}, ++ {0x419c4, 0x0}, ++ {0x419c5, 0x0}, ++ {0x419c6, 0x0}, ++ {0x419c7, 0x0}, ++ {0x419c8, 0x0}, ++ {0x419c9, 0x0}, ++ {0x419ca, 0x0}, ++ {0x419cb, 0x0}, ++ {0x419cc, 0x0}, ++ {0x419cd, 0x0}, ++ {0x419ce, 0x0}, ++ {0x419cf, 0x0}, ++ {0x419d0, 0x0}, ++ {0x419d1, 0x0}, ++ {0x419d2, 0x0}, ++ {0x419d3, 0x0}, ++ {0x419d4, 0x0}, ++ {0x419d5, 0x0}, ++ {0x419d6, 0x0}, ++ {0x419d7, 0x0}, ++ {0x419d8, 0x0}, ++ {0x419d9, 0x0}, ++ {0x419da, 0x0}, ++ {0x419db, 0x0}, ++ {0x419dc, 0x0}, ++ {0x419dd, 0x0}, ++ {0x419de, 0x0}, ++ {0x419df, 0x0}, ++ {0x419e0, 0x0}, ++ {0x419e1, 0x0}, ++ {0x419e2, 0x0}, ++ {0x419e3, 0x0}, ++ {0x419e4, 0x0}, ++ {0x419e5, 0x0}, ++ {0x419e6, 0x0}, ++ {0x419e7, 0x0}, ++ {0x419e8, 0x0}, ++ {0x419e9, 0x0}, ++ {0x419ea, 0x0}, ++ {0x419eb, 0x0}, ++ {0x419ec, 0x0}, ++ {0x419ed, 0x0}, ++ {0x419ee, 0x0}, ++ {0x419ef, 0x0}, ++ {0x419f0, 0x0}, ++ {0x419f1, 0x0}, ++ {0x419f2, 0x0}, ++ {0x419f3, 0x0}, ++ {0x419f4, 0x0}, ++ {0x419f5, 0x0}, ++ {0x419f6, 0x0}, ++ {0x419f7, 0x0}, ++ {0x419f8, 0x0}, ++ {0x419f9, 0x0}, ++ {0x419fa, 0x0}, ++ {0x419fb, 0x0}, ++ {0x419fc, 0x0}, ++ {0x419fd, 0x0}, ++ {0x419fe, 0x0}, ++ {0x419ff, 0x0}, ++ {0x41a00, 0x0}, ++ {0x41a01, 0x0}, ++ {0x41a02, 0x0}, ++ {0x41a03, 0x0}, ++ {0x41a04, 0x0}, ++ {0x41a05, 0x0}, ++ {0x41a06, 0x0}, ++ {0x41a07, 0x0}, ++ {0x41a08, 0x0}, ++ {0x41a09, 0x0}, ++ {0x41a0a, 0x0}, ++ {0x41a0b, 0x0}, ++ {0x41a0c, 0x0}, ++ {0x41a0d, 0x0}, ++ {0x41a0e, 0x0}, ++ {0x41a0f, 0x0}, ++ {0x41a10, 0x0}, ++ {0x41a11, 0x0}, ++ {0x41a12, 0x0}, ++ {0x41a13, 0x0}, ++ {0x41a14, 0x0}, ++ {0x41a15, 0x0}, ++ {0x41a16, 0x0}, ++ {0x41a17, 0x0}, ++ {0x41a18, 0x0}, ++ {0x41a19, 0x0}, ++ {0x41a1a, 0x0}, ++ {0x41a1b, 0x0}, ++ {0x41a1c, 0x0}, ++ {0x41a1d, 0x0}, ++ {0x41a1e, 0x0}, ++ {0x41a1f, 0x0}, ++ {0x41a20, 0x0}, ++ {0x41a21, 0x0}, ++ {0x41a22, 0x0}, ++ {0x41a23, 0x0}, ++ {0x41a24, 0x0}, ++ {0x41a25, 0x0}, ++ {0x41a26, 0x0}, ++ {0x41a27, 0x0}, ++ {0x41a28, 0x0}, ++ {0x41a29, 0x0}, ++ {0x41a2a, 0x0}, ++ {0x41a2b, 0x0}, ++ {0x41a2c, 0x0}, ++ {0x41a2d, 0x0}, ++ {0x41a2e, 0x0}, ++ {0x41a2f, 0x0}, ++ {0x41a30, 0x0}, ++ {0x41a31, 0x0}, ++ {0x41a32, 0x0}, ++ {0x41a33, 0x0}, ++ {0x41a34, 0x0}, ++ {0x41a35, 0x0}, ++ {0x41a36, 0x0}, ++ {0x41a37, 0x0}, ++ {0x41a38, 0x0}, ++ {0x41a39, 0x0}, ++ {0x41a3a, 0x0}, ++ {0x41a3b, 0x0}, ++ {0x41a3c, 0x0}, ++ {0x41a3d, 0x0}, ++ {0x41a3e, 0x0}, ++ {0x41a3f, 0x0}, ++ {0x41a40, 0x0}, ++ {0x41a41, 0x0}, ++ {0x41a42, 0x0}, ++ {0x41a43, 0x0}, ++ {0x41a44, 0x0}, ++ {0x41a45, 0x0}, ++ {0x41a46, 0x0}, ++ {0x41a47, 0x0}, ++ {0x41a48, 0x0}, ++ {0x41a49, 0x0}, ++ {0x41a4a, 0x0}, ++ {0x41a4b, 0x0}, ++ {0x41a4c, 0x0}, ++ {0x41a4d, 0x0}, ++ {0x41a4e, 0x0}, ++ {0x41a4f, 0x0}, ++ {0x41a50, 0x0}, ++ {0x41a51, 0x0}, ++ {0x41a52, 0x0}, ++ {0x41a53, 0x0}, ++ {0x41a54, 0x0}, ++ {0x41a55, 0x0}, ++ {0x41a56, 0x0}, ++ {0x41a57, 0x0}, ++ {0x41a58, 0x0}, ++ {0x41a59, 0x0}, ++ {0x41a5a, 0x0}, ++ {0x41a5b, 0x0}, ++ {0x41a5c, 0x0}, ++ {0x41a5d, 0x0}, ++ {0x41a5e, 0x0}, ++ {0x41a5f, 0x0}, ++ {0x41a60, 0x0}, ++ {0x41a61, 0x0}, ++ {0x41a62, 0x0}, ++ {0x41a63, 0x0}, ++ {0x41a64, 0x0}, ++ {0x41a65, 0x0}, ++ {0x41a66, 0x0}, ++ {0x41a67, 0x0}, ++ {0x41a68, 0x0}, ++ {0x41a69, 0x0}, ++ {0x41a6a, 0x0}, ++ {0x41a6b, 0x0}, ++ {0x41a6c, 0x0}, ++ {0x41a6d, 0x0}, ++ {0x41a6e, 0x0}, ++ {0x41a6f, 0x0}, ++ {0x41a70, 0x0}, ++ {0x41a71, 0x0}, ++ {0x41a72, 0x0}, ++ {0x41a73, 0x0}, ++ {0x41a74, 0x0}, ++ {0x41a75, 0x0}, ++ {0x41a76, 0x0}, ++ {0x41a77, 0x0}, ++ {0x41a78, 0x0}, ++ {0x41a79, 0x0}, ++ {0x41a7a, 0x0}, ++ {0x41a7b, 0x0}, ++ {0x41a7c, 0x0}, ++ {0x41a7d, 0x0}, ++ {0x41a7e, 0x0}, ++ {0x41a7f, 0x0}, ++ {0x41a80, 0x0}, ++ {0x41a81, 0x0}, ++ {0x41a82, 0x0}, ++ {0x41a83, 0x0}, ++ {0x41a84, 0x0}, ++ {0x41a85, 0x0}, ++ {0x41a86, 0x0}, ++ {0x41a87, 0x0}, ++ {0x41a88, 0x0}, ++ {0x41a89, 0x0}, ++ {0x41a8a, 0x0}, ++ {0x41a8b, 0x0}, ++ {0x41a8c, 0x0}, ++ {0x41a8d, 0x0}, ++ {0x41a8e, 0x0}, ++ {0x41a8f, 0x0}, ++ {0x41a90, 0x0}, ++ {0x41a91, 0x0}, ++ {0x41a92, 0x0}, ++ {0x41a93, 0x0}, ++ {0x41a94, 0x0}, ++ {0x41a95, 0x0}, ++ {0x41a96, 0x0}, ++ {0x41a97, 0x0}, ++ {0x41a98, 0x0}, ++ {0x41a99, 0x0}, ++ {0x41a9a, 0x0}, ++ {0x41a9b, 0x0}, ++ {0x41a9c, 0x0}, ++ {0x41a9d, 0x0}, ++ {0x41a9e, 0x0}, ++ {0x41a9f, 0x0}, ++ {0x41aa0, 0x0}, ++ {0x41aa1, 0x0}, ++ {0x41aa2, 0x0}, ++ {0x41aa3, 0x0}, ++ {0x41aa4, 0x0}, ++ {0x41aa5, 0x0}, ++ {0x41aa6, 0x0}, ++ {0x41aa7, 0x0}, ++ {0x41aa8, 0x0}, ++ {0x41aa9, 0x0}, ++ {0x41aaa, 0x0}, ++ {0x41aab, 0x0}, ++ {0x41aac, 0x0}, ++ {0x41aad, 0x0}, ++ {0x41aae, 0x0}, ++ {0x41aaf, 0x0}, ++ {0x41ab0, 0x0}, ++ {0x41ab1, 0x0}, ++ {0x41ab2, 0x0}, ++ {0x41ab3, 0x0}, ++ {0x41ab4, 0x0}, ++ {0x41ab5, 0x0}, ++ {0x41ab6, 0x0}, ++ {0x41ab7, 0x0}, ++ {0x41ab8, 0x0}, ++ {0x41ab9, 0x0}, ++ {0x41aba, 0x0}, ++ {0x41abb, 0x0}, ++ {0x41abc, 0x0}, ++ {0x41abd, 0x0}, ++ {0x41abe, 0x0}, ++ {0x41abf, 0x0}, ++ {0x41ac0, 0x0}, ++ {0x41ac1, 0x0}, ++ {0x41ac2, 0x0}, ++ {0x41ac3, 0x0}, ++ {0x41ac4, 0x0}, ++ {0x41ac5, 0x0}, ++ {0x41ac6, 0x0}, ++ {0x41ac7, 0x0}, ++ {0x41ac8, 0x0}, ++ {0x41ac9, 0x0}, ++ {0x41aca, 0x0}, ++ {0x41acb, 0x0}, ++ {0x41acc, 0x0}, ++ {0x41acd, 0x0}, ++ {0x41ace, 0x0}, ++ {0x41acf, 0x0}, ++ {0x41ad0, 0x0}, ++ {0x41ad1, 0x0}, ++ {0x41ad2, 0x0}, ++ {0x41ad3, 0x0}, ++ {0x41ad4, 0x0}, ++ {0x41ad5, 0x0}, ++ {0x41ad6, 0x0}, ++ {0x41ad7, 0x0}, ++ {0x41ad8, 0x0}, ++ {0x41ad9, 0x0}, ++ {0x41ada, 0x0}, ++ {0x41adb, 0x0}, ++ {0x41adc, 0x0}, ++ {0x41add, 0x0}, ++ {0x41ade, 0x0}, ++ {0x41adf, 0x0}, ++ {0x41ae0, 0x0}, ++ {0x41ae1, 0x0}, ++ {0x41ae2, 0x0}, ++ {0x41ae3, 0x0}, ++ {0x41ae4, 0x0}, ++ {0x41ae5, 0x0}, ++ {0x41ae6, 0x0}, ++ {0x41ae7, 0x0}, ++ {0x41ae8, 0x0}, ++ {0x41ae9, 0x0}, ++ {0x41aea, 0x0}, ++ {0x41aeb, 0x0}, ++ {0x41aec, 0x0}, ++ {0x41aed, 0x0}, ++ {0x41aee, 0x0}, ++ {0x41aef, 0x0}, ++ {0x41af0, 0x0}, ++ {0x41af1, 0x0}, ++ {0x41af2, 0x0}, ++ {0x41af3, 0x0}, ++ {0x41af4, 0x0}, ++ {0x41af5, 0x0}, ++ {0x41af6, 0x0}, ++ {0x41af7, 0x0}, ++ {0x41af8, 0x0}, ++ {0x41af9, 0x0}, ++ {0x41afa, 0x0}, ++ {0x41afb, 0x0}, ++ {0x41afc, 0x0}, ++ {0x41afd, 0x0}, ++ {0x41afe, 0x0}, ++ {0x41aff, 0x0}, ++ {0x41b00, 0x0}, ++ {0x41b01, 0x0}, ++ {0x41b02, 0x0}, ++ {0x41b03, 0x0}, ++ {0x41b04, 0x0}, ++ {0x41b05, 0x0}, ++ {0x41b06, 0x0}, ++ {0x41b07, 0x0}, ++ {0x41b08, 0x0}, ++ {0x41b09, 0x0}, ++ {0x41b0a, 0x0}, ++ {0x41b0b, 0x0}, ++ {0x41b0c, 0x0}, ++ {0x41b0d, 0x0}, ++ {0x41b0e, 0x0}, ++ {0x41b0f, 0x0}, ++ {0x41b10, 0x0}, ++ {0x41b11, 0x0}, ++ {0x41b12, 0x0}, ++ {0x41b13, 0x0}, ++ {0x41b14, 0x0}, ++ {0x41b15, 0x0}, ++ {0x41b16, 0x0}, ++ {0x41b17, 0x0}, ++ {0x41b18, 0x0}, ++ {0x41b19, 0x0}, ++ {0x41b1a, 0x0}, ++ {0x41b1b, 0x0}, ++ {0x41b1c, 0x0}, ++ {0x41b1d, 0x0}, ++ {0x41b1e, 0x0}, ++ {0x41b1f, 0x0}, ++ {0x41b20, 0x0}, ++ {0x41b21, 0x0}, ++ {0x41b22, 0x0}, ++ {0x41b23, 0x0}, ++ {0x41b24, 0x0}, ++ {0x41b25, 0x0}, ++ {0x41b26, 0x0}, ++ {0x41b27, 0x0}, ++ {0x41b28, 0x0}, ++ {0x41b29, 0x0}, ++ {0x41b2a, 0x0}, ++ {0x41b2b, 0x0}, ++ {0x41b2c, 0x0}, ++ {0x41b2d, 0x0}, ++ {0x41b2e, 0x0}, ++ {0x41b2f, 0x0}, ++ {0x41b30, 0x0}, ++ {0x41b31, 0x0}, ++ {0x41b32, 0x0}, ++ {0x41b33, 0x0}, ++ {0x41b34, 0x0}, ++ {0x41b35, 0x0}, ++ {0x41b36, 0x0}, ++ {0x41b37, 0x0}, ++ {0x41b38, 0x0}, ++ {0x41b39, 0x0}, ++ {0x41b3a, 0x0}, ++ {0x41b3b, 0x0}, ++ {0x41b3c, 0x0}, ++ {0x41b3d, 0x0}, ++ {0x41b3e, 0x0}, ++ {0x41b3f, 0x0}, ++ {0x41b40, 0x0}, ++ {0x41b41, 0x0}, ++ {0x41b42, 0x0}, ++ {0x41b43, 0x0}, ++ {0x41b44, 0x0}, ++ {0x41b45, 0x0}, ++ {0x41b46, 0x0}, ++ {0x41b47, 0x0}, ++ {0x41b48, 0x0}, ++ {0x41b49, 0x0}, ++ {0x41b4a, 0x0}, ++ {0x41b4b, 0x0}, ++ {0x41b4c, 0x0}, ++ {0x41b4d, 0x0}, ++ {0x41b4e, 0x0}, ++ {0x41b4f, 0x0}, ++ {0x41b50, 0x0}, ++ {0x41b51, 0x0}, ++ {0x41b52, 0x0}, ++ {0x41b53, 0x0}, ++ {0x41b54, 0x0}, ++ {0x41b55, 0x0}, ++ {0x41b56, 0x0}, ++ {0x41b57, 0x0}, ++ {0x41b58, 0x0}, ++ {0x41b59, 0x0}, ++ {0x41b5a, 0x0}, ++ {0x41b5b, 0x0}, ++ {0x41b5c, 0x0}, ++ {0x41b5d, 0x0}, ++ {0x41b5e, 0x0}, ++ {0x41b5f, 0x0}, ++ {0x41b60, 0x0}, ++ {0x41b61, 0x0}, ++ {0x41b62, 0x0}, ++ {0x41b63, 0x0}, ++ {0x41b64, 0x0}, ++ {0x41b65, 0x0}, ++ {0x41b66, 0x0}, ++ {0x41b67, 0x0}, ++ {0x41b68, 0x0}, ++ {0x41b69, 0x0}, ++ {0x41b6a, 0x0}, ++ {0x41b6b, 0x0}, ++ {0x41b6c, 0x0}, ++ {0x41b6d, 0x0}, ++ {0x41b6e, 0x0}, ++ {0x41b6f, 0x0}, ++ {0x41b70, 0x0}, ++ {0x41b71, 0x0}, ++ {0x41b72, 0x0}, ++ {0x41b73, 0x0}, ++ {0x41b74, 0x0}, ++ {0x41b75, 0x0}, ++ {0x41b76, 0x0}, ++ {0x41b77, 0x0}, ++ {0x41b78, 0x0}, ++ {0x41b79, 0x0}, ++ {0x41b7a, 0x0}, ++ {0x41b7b, 0x0}, ++ {0x41b7c, 0x0}, ++ {0x41b7d, 0x0}, ++ {0x41b7e, 0x0}, ++ {0x41b7f, 0x0}, ++ {0x41b80, 0x0}, ++ {0x41b81, 0x0}, ++ {0x41b82, 0x0}, ++ {0x41b83, 0x0}, ++ {0x41b84, 0x0}, ++ {0x41b85, 0x0}, ++ {0x41b86, 0x0}, ++ {0x41b87, 0x0}, ++ {0x41b88, 0x0}, ++ {0x41b89, 0x0}, ++ {0x41b8a, 0x0}, ++ {0x41b8b, 0x0}, ++ {0x41b8c, 0x0}, ++ {0x41b8d, 0x0}, ++ {0x41b8e, 0x0}, ++ {0x41b8f, 0x0}, ++ {0x41b90, 0x0}, ++ {0x41b91, 0x0}, ++ {0x41b92, 0x0}, ++ {0x41b93, 0x0}, ++ {0x41b94, 0x0}, ++ {0x41b95, 0x0}, ++ {0x41b96, 0x0}, ++ {0x41b97, 0x0}, ++ {0x41b98, 0x0}, ++ {0x41b99, 0x0}, ++ {0x41b9a, 0x0}, ++ {0x41b9b, 0x0}, ++ {0x41b9c, 0x0}, ++ {0x41b9d, 0x0}, ++ {0x41b9e, 0x0}, ++ {0x41b9f, 0x0}, ++ {0x41ba0, 0x0}, ++ {0x41ba1, 0x0}, ++ {0x41ba2, 0x0}, ++ {0x41ba3, 0x0}, ++ {0x41ba4, 0x0}, ++ {0x41ba5, 0x0}, ++ {0x41ba6, 0x0}, ++ {0x41ba7, 0x0}, ++ {0x41ba8, 0x0}, ++ {0x41ba9, 0x0}, ++ {0x41baa, 0x0}, ++ {0x41bab, 0x0}, ++ {0x41bac, 0x0}, ++ {0x41bad, 0x0}, ++ {0x41bae, 0x0}, ++ {0x41baf, 0x0}, ++ {0x41bb0, 0x0}, ++ {0x41bb1, 0x0}, ++ {0x41bb2, 0x0}, ++ {0x41bb3, 0x0}, ++ {0x41bb4, 0x0}, ++ {0x41bb5, 0x0}, ++ {0x41bb6, 0x0}, ++ {0x41bb7, 0x0}, ++ {0x41bb8, 0x0}, ++ {0x41bb9, 0x0}, ++ {0x41bba, 0x0}, ++ {0x41bbb, 0x0}, ++ {0x41bbc, 0x0}, ++ {0x41bbd, 0x0}, ++ {0x41bbe, 0x0}, ++ {0x41bbf, 0x0}, ++ {0x41bc0, 0x0}, ++ {0x41bc1, 0x0}, ++ {0x41bc2, 0x0}, ++ {0x41bc3, 0x0}, ++ {0x41bc4, 0x0}, ++ {0x41bc5, 0x0}, ++ {0x41bc6, 0x0}, ++ {0x41bc7, 0x0}, ++ {0x41bc8, 0x0}, ++ {0x41bc9, 0x0}, ++ {0x41bca, 0x0}, ++ {0x41bcb, 0x0}, ++ {0x41bcc, 0x0}, ++ {0x41bcd, 0x0}, ++ {0x41bce, 0x0}, ++ {0x41bcf, 0x0}, ++ {0x41bd0, 0x0}, ++ {0x41bd1, 0x0}, ++ {0x41bd2, 0x0}, ++ {0x41bd3, 0x0}, ++ {0x41bd4, 0x0}, ++ {0x41bd5, 0x0}, ++ {0x41bd6, 0x0}, ++ {0x41bd7, 0x0}, ++ {0x41bd8, 0x0}, ++ {0x41bd9, 0x0}, ++ {0x41bda, 0x0}, ++ {0x41bdb, 0x0}, ++ {0x41bdc, 0x0}, ++ {0x41bdd, 0x0}, ++ {0x41bde, 0x0}, ++ {0x41bdf, 0x0}, ++ {0x41be0, 0x0}, ++ {0x41be1, 0x0}, ++ {0x41be2, 0x0}, ++ {0x41be3, 0x0}, ++ {0x41be4, 0x0}, ++ {0x41be5, 0x0}, ++ {0x41be6, 0x0}, ++ {0x41be7, 0x0}, ++ {0x41be8, 0x0}, ++ {0x41be9, 0x0}, ++ {0x41bea, 0x0}, ++ {0x41beb, 0x0}, ++ {0x41bec, 0x0}, ++ {0x41bed, 0x0}, ++ {0x41bee, 0x0}, ++ {0x41bef, 0x0}, ++ {0x41bf0, 0x0}, ++ {0x41bf1, 0x0}, ++ {0x41bf2, 0x0}, ++ {0x41bf3, 0x0}, ++ {0x41bf4, 0x0}, ++ {0x41bf5, 0x0}, ++ {0x41bf6, 0x0}, ++ {0x41bf7, 0x0}, ++ {0x41bf8, 0x0}, ++ {0x41bf9, 0x0}, ++ {0x41bfa, 0x0}, ++ {0x41bfb, 0x0}, ++ {0x41bfc, 0x0}, ++ {0x41bfd, 0x0}, ++ {0x41bfe, 0x0}, ++ {0x41bff, 0x0}, ++ {0x41c00, 0x0}, ++ {0x41c01, 0x0}, ++ {0x41c02, 0x0}, ++ {0x41c03, 0x0}, ++ {0x41c04, 0x0}, ++ {0x41c05, 0x0}, ++ {0x41c06, 0x0}, ++ {0x41c07, 0x0}, ++ {0x41c08, 0x0}, ++ {0x41c09, 0x0}, ++ {0x41c0a, 0x0}, ++ {0x41c0b, 0x0}, ++ {0x41c0c, 0x0}, ++ {0x41c0d, 0x0}, ++ {0x41c0e, 0x0}, ++ {0x41c0f, 0x0}, ++ {0x41c10, 0x0}, ++ {0x41c11, 0x0}, ++ {0x41c12, 0x0}, ++ {0x41c13, 0x0}, ++ {0x41c14, 0x0}, ++ {0x41c15, 0x0}, ++ {0x41c16, 0x0}, ++ {0x41c17, 0x0}, ++ {0x41c18, 0x0}, ++ {0x41c19, 0x0}, ++ {0x41c1a, 0x0}, ++ {0x41c1b, 0x0}, ++ {0x41c1c, 0x0}, ++ {0x41c1d, 0x0}, ++ {0x41c1e, 0x0}, ++ {0x41c1f, 0x0}, ++ {0x41c20, 0x0}, ++ {0x41c21, 0x0}, ++ {0x41c22, 0x0}, ++ {0x41c23, 0x0}, ++ {0x41c24, 0x0}, ++ {0x41c25, 0x0}, ++ {0x41c26, 0x0}, ++ {0x41c27, 0x0}, ++ {0x41c28, 0x0}, ++ {0x41c29, 0x0}, ++ {0x41c2a, 0x0}, ++ {0x41c2b, 0x0}, ++ {0x41c2c, 0x0}, ++ {0x41c2d, 0x0}, ++ {0x41c2e, 0x0}, ++ {0x41c2f, 0x0}, ++ {0x41c30, 0x0}, ++ {0x41c31, 0x0}, ++ {0x41c32, 0x0}, ++ {0x41c33, 0x0}, ++ {0x41c34, 0x0}, ++ {0x41c35, 0x0}, ++ {0x41c36, 0x0}, ++ {0x41c37, 0x0}, ++ {0x41c38, 0x0}, ++ {0x41c39, 0x0}, ++ {0x41c3a, 0x0}, ++ {0x41c3b, 0x0}, ++ {0x41c3c, 0x0}, ++ {0x41c3d, 0x0}, ++ {0x41c3e, 0x0}, ++ {0x41c3f, 0x0}, ++ {0x41c40, 0x0}, ++ {0x41c41, 0x0}, ++ {0x41c42, 0x0}, ++ {0x41c43, 0x0}, ++ {0x41c44, 0x0}, ++ {0x41c45, 0x0}, ++ {0x41c46, 0x0}, ++ {0x41c47, 0x0}, ++ {0x41c48, 0x0}, ++ {0x41c49, 0x0}, ++ {0x41c4a, 0x0}, ++ {0x41c4b, 0x0}, ++ {0x41c4c, 0x0}, ++ {0x41c4d, 0x0}, ++ {0x41c4e, 0x0}, ++ {0x41c4f, 0x0}, ++ {0x41c50, 0x0}, ++ {0x41c51, 0x0}, ++ {0x41c52, 0x0}, ++ {0x41c53, 0x0}, ++ {0x41c54, 0x0}, ++ {0x41c55, 0x0}, ++ {0x41c56, 0x0}, ++ {0x41c57, 0x0}, ++ {0x9002e, 0x0}, ++ {0x9002f, 0x0}, ++ {0x90030, 0x0}, ++ {0x90031, 0x0}, ++ {0x90032, 0x0}, ++ {0x90033, 0x0}, ++ {0x90034, 0x0}, ++ {0x90035, 0x0}, ++ {0x90036, 0x0}, ++ {0x90037, 0x0}, ++ {0x90038, 0x0}, ++ {0x90039, 0x0}, ++ {0x9003a, 0x0}, ++ {0x9003b, 0x0}, ++ {0x9003c, 0x0}, ++ {0x9003d, 0x0}, ++ {0x9003e, 0x0}, ++ {0x9003f, 0x0}, ++ {0x90040, 0x0}, ++ {0x90041, 0x0}, ++ {0x90042, 0x0}, ++ {0x90043, 0x0}, ++ {0x90044, 0x0}, ++ {0x90045, 0x0}, ++ {0x90046, 0x0}, ++ {0x90047, 0x0}, ++ {0x90048, 0x0}, ++ {0x90049, 0x0}, ++ {0x9004a, 0x0}, ++ {0x9004b, 0x0}, ++ {0x9004c, 0x0}, ++ {0x9004d, 0x0}, ++ {0x9004e, 0x0}, ++ {0x9004f, 0x0}, ++ {0x90050, 0x0}, ++ {0x90051, 0x0}, ++ {0x90052, 0x0}, ++ {0x90053, 0x0}, ++ {0x90054, 0x0}, ++ {0x90055, 0x0}, ++ {0x90056, 0x0}, ++ {0x90057, 0x0}, ++ {0x90058, 0x0}, ++ {0x90059, 0x0}, ++ {0x9005a, 0x0}, ++ {0x9005b, 0x0}, ++ {0x9005c, 0x0}, ++ {0x9005d, 0x0}, ++ {0x9005e, 0x0}, ++ {0x9005f, 0x0}, ++ {0x90060, 0x0}, ++ {0x90061, 0x0}, ++ {0x90062, 0x0}, ++ {0x90063, 0x0}, ++ {0x90064, 0x0}, ++ {0x90065, 0x0}, ++ {0x90066, 0x0}, ++ {0x90067, 0x0}, ++ {0x90068, 0x0}, ++ {0x90069, 0x0}, ++ {0x9006a, 0x0}, ++ {0x9006b, 0x0}, ++ {0x9006c, 0x0}, ++ {0x9006d, 0x0}, ++ {0x9006e, 0x0}, ++ {0x9006f, 0x0}, ++ {0x90070, 0x0}, ++ {0x90071, 0x0}, ++ {0x90072, 0x0}, ++ {0x90073, 0x0}, ++ {0x90074, 0x0}, ++ {0x90075, 0x0}, ++ {0x90076, 0x0}, ++ {0x90077, 0x0}, ++ {0x90078, 0x0}, ++ {0x90079, 0x0}, ++ {0x9007a, 0x0}, ++ {0x9007b, 0x0}, ++ {0x9007c, 0x0}, ++ {0x9007d, 0x0}, ++ {0x9007e, 0x0}, ++ {0x9007f, 0x0}, ++ {0x90080, 0x0}, ++ {0x90081, 0x0}, ++ {0x90082, 0x0}, ++ {0x90083, 0x0}, ++ {0x90084, 0x0}, ++ {0x90085, 0x0}, ++ {0x90086, 0x0}, ++ {0x90087, 0x0}, ++ {0x90088, 0x0}, ++ {0x90089, 0x0}, ++ {0x9008a, 0x0}, ++ {0x9008b, 0x0}, ++ {0x9008c, 0x0}, ++ {0x9008d, 0x0}, ++ {0x9008e, 0x0}, ++ {0x9008f, 0x0}, ++ {0x90090, 0x0}, ++ {0x90091, 0x0}, ++ {0x90092, 0x0}, ++ {0x90093, 0x0}, ++ {0x90094, 0x0}, ++ {0x90095, 0x0}, ++ {0x90096, 0x0}, ++ {0x90097, 0x0}, ++ {0x90098, 0x0}, ++ {0x90099, 0x0}, ++ {0x9009a, 0x0}, ++ {0x9009b, 0x0}, ++ {0x9009c, 0x0}, ++ {0x9009d, 0x0}, ++ {0x9009e, 0x0}, ++ {0x9009f, 0x0}, ++ {0x900a0, 0x0}, ++ {0x900a1, 0x0}, ++ {0x900a2, 0x0}, ++ {0x900a3, 0x0}, ++ {0x900a4, 0x0}, ++ {0x900a5, 0x0}, ++ {0x900a6, 0x0}, ++ {0x900a7, 0x0}, ++ {0x900a8, 0x0}, ++ {0x900a9, 0x0}, ++ {0x900aa, 0x0}, ++ {0x900ab, 0x0}, ++ {0x900ac, 0x0}, ++ {0x900ad, 0x0}, ++ {0x900ae, 0x0}, ++ {0x900af, 0x0}, ++ {0x900b0, 0x0}, ++ {0x900b1, 0x0}, ++ {0x900b2, 0x0}, ++ {0x900b3, 0x0}, ++ {0x900b4, 0x0}, ++ {0x900b5, 0x0}, ++ {0x900b6, 0x0}, ++ {0x900b7, 0x0}, ++ {0x900b8, 0x0}, ++ {0x900b9, 0x0}, ++ {0x900ba, 0x0}, ++ {0x900bb, 0x0}, ++ {0x900bc, 0x0}, ++ {0x900bd, 0x0}, ++ {0x900be, 0x0}, ++ {0x900bf, 0x0}, ++ {0x900c0, 0x0}, ++ {0x900c1, 0x0}, ++ {0x900c2, 0x0}, ++ {0x900c3, 0x0}, ++ {0x900c4, 0x0}, ++ {0x900c5, 0x0}, ++ {0x900c6, 0x0}, ++ {0x900c7, 0x0}, ++ {0x900c8, 0x0}, ++ {0x900c9, 0x0}, ++ {0x900ca, 0x0}, ++ {0x900cb, 0x0}, ++ {0x900cc, 0x0}, ++ {0x900cd, 0x0}, ++ {0x900ce, 0x0}, ++ {0x900cf, 0x0}, ++ {0x900d0, 0x0}, ++ {0x900d1, 0x0}, ++ {0x900d2, 0x0}, ++ {0x900d3, 0x0}, ++ {0x900d4, 0x0}, ++ {0x900d5, 0x0}, ++ {0x900d6, 0x0}, ++ {0x900d7, 0x0}, ++ {0x900d8, 0x0}, ++ {0x900d9, 0x0}, ++ {0x900da, 0x0}, ++ {0x900db, 0x0}, ++ {0x900dc, 0x0}, ++ {0x900dd, 0x0}, ++ {0x900de, 0x0}, ++ {0x900df, 0x0}, ++ {0x900e0, 0x0}, ++ {0x900e1, 0x0}, ++ {0x900e2, 0x0}, ++ {0x900e3, 0x0}, ++ {0x900e4, 0x0}, ++ {0x900e5, 0x0}, ++ {0x900e6, 0x0}, ++ {0x900e7, 0x0}, ++ {0x900e8, 0x0}, ++ {0x900e9, 0x0}, ++ {0x900ea, 0x0}, ++ {0x900eb, 0x0}, ++ {0x900ec, 0x0}, ++ {0x900ed, 0x0}, ++ {0x900ee, 0x0}, ++ {0x900ef, 0x0}, ++ {0x900f0, 0x0}, ++ {0x900f1, 0x0}, ++ {0x900f2, 0x0}, ++ {0x900f3, 0x0}, ++ {0x900f4, 0x0}, ++ {0x900f5, 0x0}, ++ {0x900f6, 0x0}, ++ {0x900f7, 0x0}, ++ {0x900f8, 0x0}, ++ {0x900f9, 0x0}, ++ {0x900fa, 0x0}, ++ {0x900fb, 0x0}, ++ {0x900fc, 0x0}, ++ {0x900fd, 0x0}, ++ {0x900fe, 0x0}, ++ {0x900ff, 0x0}, ++ {0x90100, 0x0}, ++ {0x90101, 0x0}, ++ {0x90102, 0x0}, ++ {0x90103, 0x0}, ++ {0x90104, 0x0}, ++ {0x90105, 0x0}, ++ {0x90106, 0x0}, ++ {0x90107, 0x0}, ++ {0x90108, 0x0}, ++ {0x90109, 0x0}, ++ {0x9010a, 0x0}, ++ {0x9010b, 0x0}, ++ {0x9010c, 0x0}, ++ {0x9010d, 0x0}, ++ {0x9010e, 0x0}, ++ {0x9010f, 0x0}, ++ {0x90110, 0x0}, ++ {0x90111, 0x0}, ++ {0x90112, 0x0}, ++ {0x90113, 0x0}, ++ {0x90114, 0x0}, ++ {0x90115, 0x0}, ++ {0x90116, 0x0}, ++ {0x90117, 0x0}, ++ {0x90118, 0x0}, ++ {0x90119, 0x0}, ++ {0x9011a, 0x0}, ++ {0x9011b, 0x0}, ++ {0x9011c, 0x0}, ++ {0x9011d, 0x0}, ++ {0x9011e, 0x0}, ++ {0x9011f, 0x0}, ++ {0x90120, 0x0}, ++ {0x90121, 0x0}, ++ {0x90122, 0x0}, ++ {0x90123, 0x0}, ++ {0x90124, 0x0}, ++ {0x90125, 0x0}, ++ {0x90126, 0x0}, ++ {0x90127, 0x0}, ++ {0x90128, 0x0}, ++ {0x90129, 0x0}, ++ {0x9012a, 0x0}, ++ {0x9012b, 0x0}, ++ {0x9012c, 0x0}, ++ {0x9012d, 0x0}, ++ {0x9012e, 0x0}, ++ {0x9012f, 0x0}, ++ {0x90130, 0x0}, ++ {0x90131, 0x0}, ++ {0x90132, 0x0}, ++ {0x90133, 0x0}, ++ {0x90134, 0x0}, ++ {0x90135, 0x0}, ++ {0x90136, 0x0}, ++ {0x90137, 0x0}, ++ {0x90138, 0x0}, ++ {0x90139, 0x0}, ++ {0x9013a, 0x0}, ++ {0x9013b, 0x0}, ++ {0x9013c, 0x0}, ++ {0x9013d, 0x0}, ++ {0x9013e, 0x0}, ++ {0x9013f, 0x0}, ++ {0x90140, 0x0}, ++ {0x90141, 0x0}, ++ {0x90142, 0x0}, ++ {0x90143, 0x0}, ++ {0x90144, 0x0}, ++ {0x90145, 0x0}, ++ {0x90146, 0x0}, ++ {0x90147, 0x0}, ++ {0x90148, 0x0}, ++ {0x90149, 0x0}, ++ {0x9014a, 0x0}, ++ {0x9014b, 0x0}, ++ {0x9014c, 0x0}, ++ {0x9014d, 0x0}, ++ {0x9014e, 0x0}, ++ {0x9014f, 0x0}, ++ {0x90150, 0x0}, ++ {0x90151, 0x0}, ++ {0x90152, 0x0}, ++ {0x90153, 0x0}, ++ {0x90154, 0x0}, ++ {0x90155, 0x0}, ++ {0x90156, 0x0}, ++ {0x90157, 0x0}, ++ {0x90158, 0x0}, ++ {0x90159, 0x0}, ++ {0x9015a, 0x0}, ++ {0x9015b, 0x0}, ++ {0x9015c, 0x0}, ++ {0x9015d, 0x0}, ++ {0x9015e, 0x0}, ++ {0x9015f, 0x0}, ++ {0x90160, 0x0}, ++ {0x90161, 0x0}, ++ {0x90162, 0x0}, ++ {0x90163, 0x0}, ++ {0x90164, 0x0}, ++ {0x90165, 0x0}, ++ {0x90166, 0x0}, ++ {0x90167, 0x0}, ++ {0x90168, 0x0}, ++ {0x90169, 0x0}, ++ {0x9016a, 0x0}, ++ {0x9016b, 0x0}, ++ {0x9016c, 0x0}, ++ {0x9016d, 0x0}, ++ {0x9016e, 0x0}, ++ {0x9016f, 0x0}, ++ {0x90170, 0x0}, ++ {0x90171, 0x0}, ++ {0x90172, 0x0}, ++ {0x90173, 0x0}, ++ {0x90174, 0x0}, ++ {0x90175, 0x0}, ++ {0x90176, 0x0}, ++ {0x90177, 0x0}, ++ {0x90178, 0x0}, ++ {0x90179, 0x0}, ++ {0x9017a, 0x0}, ++ {0x9017b, 0x0}, ++ {0x9017c, 0x0}, ++ {0x9017d, 0x0}, ++ {0x9017e, 0x0}, ++ {0x9017f, 0x0}, ++ {0x90180, 0x0}, ++ {0x90181, 0x0}, ++ {0x90182, 0x0}, ++ {0x90183, 0x0}, ++ {0x90184, 0x0}, ++ {0x90185, 0x0}, ++ {0x90186, 0x0}, ++ {0x90187, 0x0}, ++ {0x90188, 0x0}, ++ {0x90189, 0x0}, ++ {0x9018a, 0x0}, ++ {0x9018b, 0x0}, ++ {0x9018c, 0x0}, ++ {0x9018d, 0x0}, ++ {0x9018e, 0x0}, ++ {0x9018f, 0x0}, ++ {0x90190, 0x0}, ++ {0x90191, 0x0}, ++ {0x90192, 0x0}, ++ {0x90193, 0x0}, ++ {0x90194, 0x0}, ++ {0x90195, 0x0}, ++ {0x90196, 0x0}, ++ {0x90197, 0x0}, ++ {0x90198, 0x0}, ++ {0x90199, 0x0}, ++ {0x9019a, 0x0}, ++ {0x9019b, 0x0}, ++ {0x9019c, 0x0}, ++ {0x9019d, 0x0}, ++ {0x9019e, 0x0}, ++ {0x9019f, 0x0}, ++ {0x901a0, 0x0}, ++ {0x901a1, 0x0}, ++ {0x901a2, 0x0}, ++ {0x901a3, 0x0}, ++ {0x901a4, 0x0}, ++ {0x901a5, 0x0}, ++ {0x901a6, 0x0}, ++ {0x901a7, 0x0}, ++ {0x901a8, 0x0}, ++ {0x901a9, 0x0}, ++ {0x901aa, 0x0}, ++ {0x901ab, 0x0}, ++ {0x901ac, 0x0}, ++ {0x901ad, 0x0}, ++ {0x901ae, 0x0}, ++ {0x901af, 0x0}, ++ {0x901b0, 0x0}, ++ {0x901b1, 0x0}, ++ {0x901b2, 0x0}, ++ {0x901b3, 0x0}, ++ {0x901b4, 0x0}, ++ {0x901b5, 0x0}, ++ {0x901b6, 0x0}, ++ {0x901b7, 0x0}, ++ {0x901b8, 0x0}, ++ {0x901b9, 0x0}, ++ {0x901ba, 0x0}, ++ {0x901bb, 0x0}, ++ {0x901bc, 0x0}, ++ {0x901bd, 0x0}, ++ {0x901be, 0x0}, ++ {0x901bf, 0x0}, ++ {0x901c0, 0x0}, ++ {0x901c1, 0x0}, ++ {0x901c2, 0x0}, ++ {0x901c3, 0x0}, ++ {0x901c4, 0x0}, ++ {0x901c5, 0x0}, ++ {0x901c6, 0x0}, ++ {0x901c7, 0x0}, ++ {0x901c8, 0x0}, ++ {0x901c9, 0x0}, ++ {0x901ca, 0x0}, ++ {0x901cb, 0x0}, ++ {0x901cc, 0x0}, ++ {0x901cd, 0x0}, ++ {0x901ce, 0x0}, ++ {0x901cf, 0x0}, ++ {0x901d0, 0x0}, ++ {0x901d1, 0x0}, ++ {0x901d2, 0x0}, ++ {0x901d3, 0x0}, ++ {0x901d4, 0x0}, ++ {0x901d5, 0x0}, ++ {0x901d6, 0x0}, ++ {0x901d7, 0x0}, ++ {0x901d8, 0x0}, ++ {0x901d9, 0x0}, ++ {0x901da, 0x0}, ++ {0x901db, 0x0}, ++ {0x901dc, 0x0}, ++ {0x901dd, 0x0}, ++ {0x901de, 0x0}, ++ {0x901df, 0x0}, ++ {0x901e0, 0x0}, ++ {0x901e1, 0x0}, ++ {0x901e2, 0x0}, ++ {0x901e3, 0x0}, ++ {0x901e4, 0x0}, ++ {0x901e5, 0x0}, ++ {0x901e6, 0x0}, ++ {0x901e7, 0x0}, ++ {0x901e8, 0x0}, ++ {0x901e9, 0x0}, ++ {0x901ea, 0x0}, ++ {0x901eb, 0x0}, ++ {0x901ec, 0x0}, ++ {0x901ed, 0x0}, ++ {0x901ee, 0x0}, ++ {0x901ef, 0x0}, ++ {0x901f0, 0x0}, ++ {0x901f1, 0x0}, ++ {0x901f2, 0x0}, ++ {0x901f3, 0x0}, ++ {0x901f4, 0x0}, ++ {0x901f5, 0x0}, ++ {0x901f6, 0x0}, ++ {0x901f7, 0x0}, ++ {0x901f8, 0x0}, ++ {0x901f9, 0x0}, ++ {0x901fa, 0x0}, ++ {0x901fb, 0x0}, ++ {0x901fc, 0x0}, ++ {0x901fd, 0x0}, ++ {0x901fe, 0x0}, ++ {0x901ff, 0x0}, ++ {0x90200, 0x0}, ++ {0x90201, 0x0}, ++ {0x90202, 0x0}, ++ {0x90203, 0x0}, ++ {0x90204, 0x0}, ++ {0x90205, 0x0}, ++ {0x90206, 0x0}, ++ {0x90207, 0x0}, ++ {0x90208, 0x0}, ++ {0x90209, 0x0}, ++ {0x9020a, 0x0}, ++ {0x9020b, 0x0}, ++ {0x9020c, 0x0}, ++ {0x9020d, 0x0}, ++ {0x9020e, 0x0}, ++ {0x9020f, 0x0}, ++ {0x90210, 0x0}, ++ {0x90211, 0x0}, ++ {0x90212, 0x0}, ++ {0x90213, 0x0}, ++ {0x90214, 0x0}, ++ {0x90215, 0x0}, ++ {0x90216, 0x0}, ++ {0x90217, 0x0}, ++ {0x90218, 0x0}, ++ {0x90219, 0x0}, ++ {0x9021a, 0x0}, ++ {0x9021b, 0x0}, ++ {0x9021c, 0x0}, ++ {0x9021d, 0x0}, ++ {0x9021e, 0x0}, ++ {0x9021f, 0x0}, ++ {0x90220, 0x0}, ++ {0x90221, 0x0}, ++ {0x90222, 0x0}, ++ {0x90223, 0x0}, ++ {0x90224, 0x0}, ++ {0x90225, 0x0}, ++ {0x90226, 0x0}, ++ {0x90227, 0x0}, ++ {0x90228, 0x0}, ++ {0x90229, 0x0}, ++ {0x9022a, 0x0}, ++ {0x9022b, 0x0}, ++ {0x9022c, 0x0}, ++ {0x9022d, 0x0}, ++ {0x9022e, 0x0}, ++ {0x9022f, 0x0}, ++ {0x90230, 0x0}, ++ {0x90231, 0x0}, ++ {0x90232, 0x0}, ++ {0x90233, 0x0}, ++ {0x90234, 0x0}, ++ {0x90235, 0x0}, ++ {0x90236, 0x0}, ++ {0x90237, 0x0}, ++ {0x90238, 0x0}, ++ {0x90239, 0x0}, ++ {0x9023a, 0x0}, ++ {0x9023b, 0x0}, ++ {0x9023c, 0x0}, ++ {0x9023d, 0x0}, ++ {0x9023e, 0x0}, ++ {0x9023f, 0x0}, ++ {0x90240, 0x0}, ++ {0x90241, 0x0}, ++ {0x90242, 0x0}, ++ {0x90243, 0x0}, ++ {0x90244, 0x0}, ++ {0x90245, 0x0}, ++ {0x90246, 0x0}, ++ {0x90247, 0x0}, ++ {0x90248, 0x0}, ++ {0x90249, 0x0}, ++ {0x9024a, 0x0}, ++ {0x9024b, 0x0}, ++ {0x9024c, 0x0}, ++ {0x9024d, 0x0}, ++ {0x9024e, 0x0}, ++ {0x9024f, 0x0}, ++ {0x90250, 0x0}, ++ {0x90251, 0x0}, ++ {0x90252, 0x0}, ++ {0x90253, 0x0}, ++ {0x90254, 0x0}, ++ {0x90255, 0x0}, ++ {0x90256, 0x0}, ++ {0x90257, 0x0}, ++ {0x90258, 0x0}, ++ {0x90259, 0x0}, ++ {0x9025a, 0x0}, ++ {0x9025b, 0x0}, ++ {0x9025c, 0x0}, ++ {0x9025d, 0x0}, ++ {0x9025e, 0x0}, ++ {0x9025f, 0x0}, ++ {0x90260, 0x0}, ++ {0x90261, 0x0}, ++ {0x90262, 0x0}, ++ {0x90263, 0x0}, ++ {0x90264, 0x0}, ++ {0x90265, 0x0}, ++ {0x90266, 0x0}, ++ {0x90267, 0x0}, ++ {0x90268, 0x0}, ++ {0x90269, 0x0}, ++ {0x9026a, 0x0}, ++ {0x9026b, 0x0}, ++ {0x9026c, 0x0}, ++ {0x9026d, 0x0}, ++ {0x9026e, 0x0}, ++ {0x9026f, 0x0}, ++ {0x90270, 0x0}, ++ {0x90271, 0x0}, ++ {0x90272, 0x0}, ++ {0x90273, 0x0}, ++ {0x90274, 0x0}, ++ {0x90275, 0x0}, ++ {0x90276, 0x0}, ++ {0x90277, 0x0}, ++ {0x90278, 0x0}, ++ {0x90279, 0x0}, ++ {0x9027a, 0x0}, ++ {0x9027b, 0x0}, ++ {0x9027c, 0x0}, ++ {0x9027d, 0x0}, ++ {0x9027e, 0x0}, ++ {0x9027f, 0x0}, ++ {0x90280, 0x0}, ++ {0x90281, 0x0}, ++ {0x90282, 0x0}, ++ {0x90283, 0x0}, ++ {0x90284, 0x0}, ++ {0x90285, 0x0}, ++ {0x90286, 0x0}, ++ {0x90287, 0x0}, ++ {0x90288, 0x0}, ++ {0x90289, 0x0}, ++ {0x9028a, 0x0}, ++ {0x9028b, 0x0}, ++ {0x9028c, 0x0}, ++ {0x9028d, 0x0}, ++ {0x9028e, 0x0}, ++ {0x9028f, 0x0}, ++ {0x90290, 0x0}, ++ {0x90291, 0x0}, ++ {0x90292, 0x0}, ++ {0x90293, 0x0}, ++ {0x90294, 0x0}, ++ {0x90295, 0x0}, ++ {0x90296, 0x0}, ++ {0x90297, 0x0}, ++ {0x90298, 0x0}, ++ {0x90299, 0x0}, ++ {0x9029a, 0x0}, ++ {0x9029b, 0x0}, ++ {0x9029c, 0x0}, ++ {0x9029d, 0x0}, ++ {0x9029e, 0x0}, ++ {0x9029f, 0x0}, ++ {0x902a0, 0x0}, ++ {0x902a1, 0x0}, ++ {0x902a2, 0x0}, ++ {0x902a3, 0x0}, ++ {0x902a4, 0x0}, ++ {0x902a5, 0x0}, ++ {0x902a6, 0x0}, ++ {0x902a7, 0x0}, ++ {0x902a8, 0x0}, ++ {0x902a9, 0x0}, ++ {0x902aa, 0x0}, ++ {0x902ab, 0x0}, ++ {0x902ac, 0x0}, ++ {0x902ad, 0x0}, ++ {0x902ae, 0x0}, ++ {0x902af, 0x0}, ++ {0x902b0, 0x0}, ++ {0x902b1, 0x0}, ++ {0x902b2, 0x0}, ++ {0x902b3, 0x0}, ++ {0x902b4, 0x0}, ++ {0x902b5, 0x0}, ++ {0x902b6, 0x0}, ++ {0x902b7, 0x0}, ++ {0x902b8, 0x0}, ++ {0x902b9, 0x0}, ++ {0x902ba, 0x0}, ++ {0x902bb, 0x0}, ++ {0x902bc, 0x0}, ++ {0x902bd, 0x0}, ++ {0x902be, 0x0}, ++ {0x902bf, 0x0}, ++ {0x902c0, 0x0}, ++ {0x902c1, 0x0}, ++ {0x902c2, 0x0}, ++ {0x902c3, 0x0}, ++ {0x902c4, 0x0}, ++ {0x902c5, 0x0}, ++ {0x902c6, 0x0}, ++ {0x902c7, 0x0}, ++ {0x902c8, 0x0}, ++ {0x902c9, 0x0}, ++ {0x902ca, 0x0}, ++ {0x902cb, 0x0}, ++ {0x902cc, 0x0}, ++ {0x902cd, 0x0}, ++ {0x902ce, 0x0}, ++ {0x902cf, 0x0}, ++ {0x902d0, 0x0}, ++ {0x902d1, 0x0}, ++ {0x902d2, 0x0}, ++ {0x902d3, 0x0}, ++ {0x902d4, 0x0}, ++ {0x902d5, 0x0}, ++ {0x902d6, 0x0}, ++ {0x902d7, 0x0}, ++ {0x902d8, 0x0}, ++ {0x902d9, 0x0}, ++ {0x902da, 0x0}, ++ {0x902db, 0x0}, ++ {0x902dc, 0x0}, ++ {0x902dd, 0x0}, ++ {0x902de, 0x0}, ++ {0x902df, 0x0}, ++ {0x902e0, 0x0}, ++ {0x902e1, 0x0}, ++ {0x902e2, 0x0}, ++ {0x902e3, 0x0}, ++ {0x902e4, 0x0}, ++ {0x902e5, 0x0}, ++ {0x902e6, 0x0}, ++ {0x902e7, 0x0}, ++ {0x902e8, 0x0}, ++ {0x902e9, 0x0}, ++ {0x902ea, 0x0}, ++ {0x902eb, 0x0}, ++ {0x902ec, 0x0}, ++ {0x902ed, 0x0}, ++ {0x902ee, 0x0}, ++ {0x902ef, 0x0}, ++ {0x902f0, 0x0}, ++ {0x902f1, 0x0}, ++ {0x902f2, 0x0}, ++ {0x902f3, 0x0}, ++ {0x902f4, 0x0}, ++ {0x902f5, 0x0}, ++ {0x902f6, 0x0}, ++ {0x902f7, 0x0}, ++ {0x902f8, 0x0}, ++ {0x902f9, 0x0}, ++ {0x902fa, 0x0}, ++ {0x902fb, 0x0}, ++ {0x902fc, 0x0}, ++ {0x902fd, 0x0}, ++ {0x902fe, 0x0}, ++ {0x902ff, 0x0}, ++ {0x90300, 0x0}, ++ {0x90301, 0x0}, ++ {0x90302, 0x0}, ++ {0x90303, 0x0}, ++ {0x90304, 0x0}, ++ {0x90305, 0x0}, ++ {0x90306, 0x0}, ++ {0x90307, 0x0}, ++ {0x90308, 0x0}, ++ {0x90309, 0x0}, ++ {0x9030a, 0x0}, ++ {0x9030b, 0x0}, ++ {0x9030c, 0x0}, ++ {0x9030d, 0x0}, ++ {0x9030e, 0x0}, ++ {0x9030f, 0x0}, ++ {0x90310, 0x0}, ++ {0x90311, 0x0}, ++ {0x90312, 0x0}, ++ {0x90313, 0x0}, ++ {0x90314, 0x0}, ++ {0x90315, 0x0}, ++ {0x90316, 0x0}, ++ {0x90317, 0x0}, ++ {0x90318, 0x0}, ++ {0x90319, 0x0}, ++ {0x9031a, 0x0}, ++ {0x9031b, 0x0}, ++ {0x9031c, 0x0}, ++ {0x9031d, 0x0}, ++ {0x9031e, 0x0}, ++ {0x9031f, 0x0}, ++ {0x90320, 0x0}, ++ {0x90321, 0x0}, ++ {0x90322, 0x0}, ++ {0x90323, 0x0}, ++ {0x90324, 0x0}, ++ {0x90325, 0x0}, ++ {0x90326, 0x0}, ++ {0x90327, 0x0}, ++ {0x90328, 0x0}, ++ {0x90329, 0x0}, ++ {0x9032a, 0x0}, ++ {0x9032b, 0x0}, ++ {0x9032c, 0x0}, ++ {0x9032d, 0x0}, ++ {0x9032e, 0x0}, ++ {0x9032f, 0x0}, ++ {0x90330, 0x0}, ++ {0x90331, 0x0}, ++ {0x90332, 0x0}, ++ {0x90333, 0x0}, ++ {0x90334, 0x0}, ++ {0x90335, 0x0}, ++ {0x90336, 0x0}, ++ {0x90337, 0x0}, ++ {0x90338, 0x0}, ++ {0x90339, 0x0}, ++ {0x9033a, 0x0}, ++ {0x9033b, 0x0}, ++ {0x9033c, 0x0}, ++ {0x9033d, 0x0}, ++ {0x9033e, 0x0}, ++ {0x9033f, 0x0}, ++ {0x90340, 0x0}, ++ {0x90341, 0x0}, ++ {0x90342, 0x0}, ++ {0x90343, 0x0}, ++ {0x90344, 0x0}, ++ {0x90345, 0x0}, ++ {0x90346, 0x0}, ++ {0x90347, 0x0}, ++ {0x90348, 0x0}, ++ {0x90349, 0x0}, ++ {0x9034a, 0x0}, ++ {0x9034b, 0x0}, ++ {0x9034c, 0x0}, ++ {0x9034d, 0x0}, ++ {0x9034e, 0x0}, ++ {0x9034f, 0x0}, ++ {0x90350, 0x0}, ++ {0x90351, 0x0}, ++ {0x90352, 0x0}, ++ {0x90353, 0x0}, ++ {0x90354, 0x0}, ++ {0x90355, 0x0}, ++ {0x90356, 0x0}, ++ {0x90357, 0x0}, ++ {0x90358, 0x0}, ++ {0x90359, 0x0}, ++ {0x9035a, 0x0}, ++ {0x9035b, 0x0}, ++ {0x9035c, 0x0}, ++ {0x9035d, 0x0}, ++ {0x9035e, 0x0}, ++ {0x9035f, 0x0}, ++ {0x90360, 0x0}, ++ {0x90361, 0x0}, ++ {0x90362, 0x0}, ++ {0x90363, 0x0}, ++ {0x90364, 0x0}, ++ {0x90365, 0x0}, ++ {0x90366, 0x0}, ++ {0x90367, 0x0}, ++ {0x90368, 0x0}, ++ {0x90369, 0x0}, ++ {0x9036a, 0x0}, ++ {0x9036b, 0x0}, ++ {0x9036c, 0x0}, ++ {0x9036d, 0x0}, ++ {0x9036e, 0x0}, ++ {0x9036f, 0x0}, ++ {0x90370, 0x0}, ++ {0x90371, 0x0}, ++ {0x90372, 0x0}, ++ {0x90373, 0x0}, ++ {0x90374, 0x0}, ++ {0x90375, 0x0}, ++ {0x90376, 0x0}, ++ {0x90377, 0x0}, ++ {0x90378, 0x0}, ++ {0x90379, 0x0}, ++ {0x9037a, 0x0}, ++ {0x9037b, 0x0}, ++ {0x9037c, 0x0}, ++ {0x9037d, 0x0}, ++ {0x9037e, 0x0}, ++ {0x9037f, 0x0}, ++ {0x90380, 0x0}, ++ {0x90381, 0x0}, ++ {0x90382, 0x0}, ++ {0x90383, 0x0}, ++ {0x90384, 0x0}, ++ {0x90385, 0x0}, ++ {0x90386, 0x0}, ++ {0x90387, 0x0}, ++ {0x90388, 0x0}, ++ {0x90389, 0x0}, ++ {0x9038a, 0x0}, ++ {0x9038b, 0x0}, ++ {0x9038c, 0x0}, ++ {0x9038d, 0x0}, ++ {0x9038e, 0x0}, ++ {0x9038f, 0x0}, ++ {0x90390, 0x0}, ++ {0x90391, 0x0}, ++ {0x90392, 0x0}, ++ {0x90393, 0x0}, ++ {0x90394, 0x0}, ++ {0x90395, 0x0}, ++ {0x90396, 0x0}, ++ {0x90397, 0x0}, ++ {0x90398, 0x0}, ++ {0x90399, 0x0}, ++ {0x9039a, 0x0}, ++ {0x9039b, 0x0}, ++ {0x9039c, 0x0}, ++ {0x9039d, 0x0}, ++ {0x9039e, 0x0}, ++ {0x9039f, 0x0}, ++ {0x903a0, 0x0}, ++ {0x903a1, 0x0}, ++ {0x903a2, 0x0}, ++ {0x903a3, 0x0}, ++ {0x903a4, 0x0}, ++ {0x903a5, 0x0}, ++ {0x903a6, 0x0}, ++ {0x903a7, 0x0}, ++ {0x903a8, 0x0}, ++ {0x903a9, 0x0}, ++ {0x903aa, 0x0}, ++ {0x903ab, 0x0}, ++ {0x903ac, 0x0}, ++ {0x903ad, 0x0}, ++ {0x903ae, 0x0}, ++ {0x903af, 0x0}, ++ {0x903b0, 0x0}, ++ {0x903b1, 0x0}, ++ {0x903b2, 0x0}, ++ {0x903b3, 0x0}, ++ {0x903b4, 0x0}, ++ {0x903b5, 0x0}, ++ {0x903b6, 0x0}, ++ {0x903b7, 0x0}, ++ {0x903b8, 0x0}, ++ {0x903b9, 0x0}, ++ {0x903ba, 0x0}, ++ {0x903bb, 0x0}, ++ {0x903bc, 0x0}, ++ {0x903bd, 0x0}, ++ {0x903be, 0x0}, ++ {0x903bf, 0x0}, ++ {0x903c0, 0x0}, ++ {0x903c1, 0x0}, ++ {0x903c2, 0x0}, ++ {0x903c3, 0x0}, ++ {0x903c4, 0x0}, ++ {0x903c5, 0x0}, ++ {0x903c6, 0x0}, ++ {0x903c7, 0x0}, ++ {0x903c8, 0x0}, ++ {0x903c9, 0x0}, ++ {0x903ca, 0x0}, ++ {0x903cb, 0x0}, ++ {0x903cc, 0x0}, ++ {0x903cd, 0x0}, ++ {0x903ce, 0x0}, ++ {0x903cf, 0x0}, ++ {0x903d0, 0x0}, ++ {0x903d1, 0x0}, ++ {0x903d2, 0x0}, ++ {0x903d3, 0x0}, ++ {0x903d4, 0x0}, ++ {0x903d5, 0x0}, ++ {0x903d6, 0x0}, ++ {0x903d7, 0x0}, ++ {0x903d8, 0x0}, ++ {0x903d9, 0x0}, ++ {0x903da, 0x0}, ++ {0x903db, 0x0}, ++ {0x903dc, 0x0}, ++ {0x903dd, 0x0}, ++ {0x903de, 0x0}, ++ {0x903df, 0x0}, ++ {0x903e0, 0x0}, ++ {0x903e1, 0x0}, ++ {0x903e2, 0x0}, ++ {0x903e3, 0x0}, ++ {0x903e4, 0x0}, ++ {0x903e5, 0x0}, ++ {0x903e6, 0x0}, ++ {0x903e7, 0x0}, ++ {0x903e8, 0x0}, ++ {0x903e9, 0x0}, ++ {0x903ea, 0x0}, ++ {0x903eb, 0x0}, ++ {0x903ec, 0x0}, ++ {0x903ed, 0x0}, ++ {0x903ee, 0x0}, ++ {0x903ef, 0x0}, ++ {0x903f0, 0x0}, ++ {0x903f1, 0x0}, ++ {0x903f2, 0x0}, ++ {0x903f3, 0x0}, ++ {0x903f4, 0x0}, ++ {0x903f5, 0x0}, ++ {0x903f6, 0x0}, ++ {0x903f7, 0x0}, ++ {0x903f8, 0x0}, ++ {0x903f9, 0x0}, ++ {0x903fa, 0x0}, ++ {0x903fb, 0x0}, ++ {0x903fc, 0x0}, ++ {0x903fd, 0x0}, ++ {0x903fe, 0x0}, ++ {0x903ff, 0x0}, ++ {0x90400, 0x0}, ++ {0x90401, 0x0}, ++ {0x90402, 0x0}, ++ {0x90403, 0x0}, ++ {0x90404, 0x0}, ++ {0x90405, 0x0}, ++ {0x90406, 0x0}, ++ {0x90407, 0x0}, ++ {0x90408, 0x0}, ++ {0x90409, 0x0}, ++ {0x9040a, 0x0}, ++ {0x9040b, 0x0}, ++ {0x9040c, 0x0}, ++ {0x9040d, 0x0}, ++ {0x9040e, 0x0}, ++ {0x9040f, 0x0}, ++ {0x90410, 0x0}, ++ {0x90411, 0x0}, ++ {0x90412, 0x0}, ++ {0x90413, 0x0}, ++ {0x90414, 0x0}, ++ {0x90415, 0x0}, ++ {0x90416, 0x0}, ++ {0x90417, 0x0}, ++ {0x90418, 0x0}, ++ {0x90419, 0x0}, ++ {0x9041a, 0x0}, ++ {0x9041b, 0x0}, ++ {0x9041c, 0x0}, ++ {0x9041d, 0x0}, ++ {0x9041e, 0x0}, ++ {0x9041f, 0x0}, ++ {0x90420, 0x0}, ++ {0x90421, 0x0}, ++ {0x90422, 0x0}, ++ {0x90423, 0x0}, ++ {0x90424, 0x0}, ++ {0x90425, 0x0}, ++ {0x90426, 0x0}, ++ {0x90427, 0x0}, ++ {0x90428, 0x0}, ++ {0x90429, 0x0}, ++ {0x9042a, 0x0}, ++ {0x9042b, 0x0}, ++ {0x9042c, 0x0}, ++ {0x9042d, 0x0}, ++ {0x9042e, 0x0}, ++ {0x9042f, 0x0}, ++ {0x90430, 0x0}, ++ {0x90431, 0x0}, ++ {0x90432, 0x0}, ++ {0x90433, 0x0}, ++ {0x90434, 0x0}, ++ {0x90435, 0x0}, ++ {0x90436, 0x0}, ++ {0x90437, 0x0}, ++ {0x90438, 0x0}, ++ {0x90439, 0x0}, ++ {0x9043a, 0x0}, ++ {0x9043b, 0x0}, ++ {0x9043c, 0x0}, ++ {0x9043d, 0x0}, ++ {0x9043e, 0x0}, ++ {0x9043f, 0x0}, ++ {0x90440, 0x0}, ++ {0x90441, 0x0}, ++ {0x90442, 0x0}, ++ {0x90443, 0x0}, ++ {0x90444, 0x0}, ++ {0x90445, 0x0}, ++ {0x90446, 0x0}, ++ {0x90447, 0x0}, ++ {0x90448, 0x0}, ++ {0x90449, 0x0}, ++ {0x9044a, 0x0}, ++ {0x9044b, 0x0}, ++ {0x9044c, 0x0}, ++ {0x9044d, 0x0}, ++ {0x9044e, 0x0}, ++ {0x9044f, 0x0}, ++ {0x90450, 0x0}, ++ {0x90451, 0x0}, ++ {0x90452, 0x0}, ++ {0x90453, 0x0}, ++ {0x90454, 0x0}, ++ {0x90455, 0x0}, ++ {0x90456, 0x0}, ++ {0x90457, 0x0}, ++ {0x90458, 0x0}, ++ {0x90459, 0x0}, ++ {0x9045a, 0x0}, ++ {0x9045b, 0x0}, ++ {0x9045c, 0x0}, ++ {0x9045d, 0x0}, ++ {0x9045e, 0x0}, ++ {0x9045f, 0x0}, ++ {0x90460, 0x0}, ++ {0x90461, 0x0}, ++ {0x90462, 0x0}, ++ {0x90463, 0x0}, ++ {0x90464, 0x0}, ++ {0x90465, 0x0}, ++ {0x90466, 0x0}, ++ {0x90467, 0x0}, ++ {0x90468, 0x0}, ++ {0x90469, 0x0}, ++ {0x9046a, 0x0}, ++ {0x9046b, 0x0}, ++ {0x9046c, 0x0}, ++ {0x9046d, 0x0}, ++ {0x9046e, 0x0}, ++ {0x9046f, 0x0}, ++ {0x90470, 0x0}, ++ {0x90471, 0x0}, ++ {0x90472, 0x0}, ++ {0x90473, 0x0}, ++ {0x90474, 0x0}, ++ {0x90475, 0x0}, ++ {0x90476, 0x0}, ++ {0x90477, 0x0}, ++ {0x90478, 0x0}, ++ {0x90479, 0x0}, ++ {0x9047a, 0x0}, ++ {0x9047b, 0x0}, ++ {0x9047c, 0x0}, ++ {0x9047d, 0x0}, ++ {0x9047e, 0x0}, ++ {0x9047f, 0x0}, ++ {0x90480, 0x0}, ++ {0x90481, 0x0}, ++ {0x90482, 0x0}, ++ {0x90483, 0x0}, ++ {0x90484, 0x0}, ++ {0x90485, 0x0}, ++ {0x90486, 0x0}, ++ {0x90487, 0x0}, ++ {0x90488, 0x0}, ++ {0x90489, 0x0}, ++ {0x9048a, 0x0}, ++ {0x9048b, 0x0}, ++ {0x9048c, 0x0}, ++ {0x9048d, 0x0}, ++ {0x9048e, 0x0}, ++ {0x9048f, 0x0}, ++ {0x90490, 0x0}, ++ {0x90491, 0x0}, ++ {0x90492, 0x0}, ++ {0x90493, 0x0}, ++ {0x90494, 0x0}, ++ {0x90495, 0x0}, ++ {0x90496, 0x0}, ++ {0x90497, 0x0}, ++ {0x90498, 0x0}, ++ {0x90499, 0x0}, ++ {0x9049a, 0x0}, ++ {0x9049b, 0x0}, ++ {0x9049c, 0x0}, ++ {0x9049d, 0x0}, ++ {0x9049e, 0x0}, ++ {0x9049f, 0x0}, ++ {0x904a0, 0x0}, ++ {0x904a1, 0x0}, ++ {0x904a2, 0x0}, ++ {0x904a3, 0x0}, ++ {0x904a4, 0x0}, ++ {0x904a5, 0x0}, ++ {0x904a6, 0x0}, ++ {0x904a7, 0x0}, ++ {0x904a8, 0x0}, ++ {0x904a9, 0x0}, ++ {0x904aa, 0x0}, ++ {0x904ab, 0x0}, ++ {0x904ac, 0x0}, ++ {0x904ad, 0x0}, ++ {0x904ae, 0x0}, ++ {0x904af, 0x0}, ++ {0x904b0, 0x0}, ++ {0x904b1, 0x0}, ++ {0x904b2, 0x0}, ++ {0x904b3, 0x0}, ++ {0x904b4, 0x0}, ++ {0x904b5, 0x0}, ++ {0x904b6, 0x0}, ++ {0x904b7, 0x0}, ++ {0x904b8, 0x0}, ++ {0x904b9, 0x0}, ++ {0x904ba, 0x0}, ++ {0x904bb, 0x0}, ++ {0x904bc, 0x0}, ++ {0x904bd, 0x0}, ++ {0x904be, 0x0}, ++ {0x904bf, 0x0}, ++ {0x904c0, 0x0}, ++ {0x904c1, 0x0}, ++ {0x904c2, 0x0}, ++ {0x904c3, 0x0}, ++ {0x904c4, 0x0}, ++ {0x904c5, 0x0}, ++ {0x904c6, 0x0}, ++ {0x904c7, 0x0}, ++ {0x904c8, 0x0}, ++ {0x904c9, 0x0}, ++ {0x904ca, 0x0}, ++ {0x904cb, 0x0}, ++ {0x904cc, 0x0}, ++ {0x904cd, 0x0}, ++ {0x904ce, 0x0}, ++ {0x904cf, 0x0}, ++ {0x904d0, 0x0}, ++ {0x904d1, 0x0}, ++ {0x904d2, 0x0}, ++ {0x904d3, 0x0}, ++ {0x904d4, 0x0}, ++ {0x904d5, 0x0}, ++ {0x904d6, 0x0}, ++ {0x904d7, 0x0}, ++ {0x904d8, 0x0}, ++ {0x904d9, 0x0}, ++ {0x904da, 0x0}, ++ {0x904db, 0x0}, ++ {0x904dc, 0x0}, ++ {0x904dd, 0x0}, ++ {0x904de, 0x0}, ++ {0x904df, 0x0}, ++ {0x904e0, 0x0}, ++ {0x904e1, 0x0}, ++ {0x904e2, 0x0}, ++ {0x904e3, 0x0}, ++ {0x904e4, 0x0}, ++ {0x904e5, 0x0}, ++ {0x904e6, 0x0}, ++ {0x904e7, 0x0}, ++ {0x904e8, 0x0}, ++ {0x904e9, 0x0}, ++ {0x904ea, 0x0}, ++ {0x904eb, 0x0}, ++ {0x904ec, 0x0}, ++ {0x904ed, 0x0}, ++ {0x904ee, 0x0}, ++ {0x904ef, 0x0}, ++ {0x904f0, 0x0}, ++ {0x904f1, 0x0}, ++ {0x904f2, 0x0}, ++ {0x904f3, 0x0}, ++ {0x904f4, 0x0}, ++ {0x904f5, 0x0}, ++ {0x904f6, 0x0}, ++ {0x904f7, 0x0}, ++ {0x904f8, 0x0}, ++ {0x904f9, 0x0}, ++ {0x904fa, 0x0}, ++ {0x904fb, 0x0}, ++ {0x904fc, 0x0}, ++ {0x904fd, 0x0}, ++ {0x904fe, 0x0}, ++ {0x904ff, 0x0}, ++ {0x90500, 0x0}, ++ {0x90501, 0x0}, ++ {0x90502, 0x0}, ++ {0x90503, 0x0}, ++ {0x90504, 0x0}, ++ {0x90505, 0x0}, ++ {0x90506, 0x0}, ++ {0x90507, 0x0}, ++ {0x90508, 0x0}, ++ {0x90509, 0x0}, ++ {0x9050a, 0x0}, ++ {0x9050b, 0x0}, ++ {0x9050c, 0x0}, ++ {0x9050d, 0x0}, ++ {0x9050e, 0x0}, ++ {0x9050f, 0x0}, ++ {0x90510, 0x0}, ++ {0x90511, 0x0}, ++ {0x90512, 0x0}, ++ {0x90513, 0x0}, ++ {0x90514, 0x0}, ++ {0x90515, 0x0}, ++ {0x90516, 0x0}, ++ {0x90517, 0x0}, ++ {0x90518, 0x0}, ++ {0x90519, 0x0}, ++ {0x9051a, 0x0}, ++ {0x9051b, 0x0}, ++ {0x9051c, 0x0}, ++ {0x9051d, 0x0}, ++ {0x9051e, 0x0}, ++ {0x9051f, 0x0}, ++ {0x90520, 0x0}, ++ {0x90521, 0x0}, ++ {0x90522, 0x0}, ++ {0x90523, 0x0}, ++ {0x90524, 0x0}, ++ {0x90525, 0x0}, ++ {0x90526, 0x0}, ++ {0x90527, 0x0}, ++ {0x90528, 0x0}, ++ {0x90529, 0x0}, ++ {0x9052a, 0x0}, ++ {0x9052b, 0x0}, ++ {0x9052c, 0x0}, ++ {0x9052d, 0x0}, ++ {0x9052e, 0x0}, ++ {0x9052f, 0x0}, ++ {0x90530, 0x0}, ++ {0x90531, 0x0}, ++ {0x90532, 0x0}, ++ {0x90533, 0x0}, ++ {0x90534, 0x0}, ++ {0x90535, 0x0}, ++ {0x90536, 0x0}, ++ {0x90537, 0x0}, ++ {0x90538, 0x0}, ++ {0x90539, 0x0}, ++ {0x9053a, 0x0}, ++ {0xd00e7, 0x0}, ++ {0x9001c, 0x0}, ++ {0x90020, 0x0}, ++ {0x90024, 0x0}, ++ {0x90025, 0x0}, ++ {0x90026, 0x0}, ++ {0x9002b, 0x0}, ++ {0x90708, 0x0}, ++ {0x90700, 0x0}, ++ {0x90701, 0x0}, ++ {0x90702, 0x0}, ++ {0x90703, 0x0}, ++ {0x90704, 0x0}, ++ {0x90705, 0x0}, ++ {0x90706, 0x0}, ++ {0x90707, 0x0}, ++ {0x2018a, 0x0}, ++ {0x20124, 0x0}, ++ {0x2018b, 0x0}, ++ {0x20125, 0x0}, ++ {0x2018c, 0x0}, ++ {0x20126, 0x0}, ++ {0x2018d, 0x0}, ++ {0x20127, 0x0}, ++ {0x2018e, 0x0}, ++ {0x20128, 0x0}, ++ {0x2018f, 0x0}, ++ {0x20129, 0x0}, ++ {0x20190, 0x0}, ++ {0x2012a, 0x0}, ++ {0x20191, 0x0}, ++ {0x2012b, 0x0}, ++ {0x20192, 0x0}, ++ {0x2012c, 0x0}, ++ {0x20193, 0x0}, ++ {0x2012d, 0x0}, ++ {0x20194, 0x0}, ++ {0x2012e, 0x0}, ++ {0x20195, 0x0}, ++ {0x2012f, 0x0}, ++ {0x20196, 0x0}, ++ {0x20130, 0x0}, ++ {0x20197, 0x0}, ++ {0x20131, 0x0}, ++ {0x20198, 0x0}, ++ {0x20132, 0x0}, ++ {0x20199, 0x0}, ++ {0x20133, 0x0}, ++ {0x2019a, 0x0}, ++ {0x20134, 0x0}, ++ {0x2019b, 0x0}, ++ {0x20135, 0x0}, ++ {0x2019c, 0x0}, ++ {0x20136, 0x0}, ++ {0x2019d, 0x0}, ++ {0x20137, 0x0}, ++ {0x2019e, 0x0}, ++ {0x20138, 0x0}, ++ {0x2019f, 0x0}, ++ {0x20139, 0x0}, ++ {0x201a0, 0x0}, ++ {0x2013a, 0x0}, ++ {0x201a1, 0x0}, ++ {0x2013b, 0x0}, ++ {0x201a2, 0x0}, ++ {0x2013c, 0x0}, ++ {0x201a3, 0x0}, ++ {0x2013d, 0x0}, ++ {0x201a4, 0x0}, ++ {0x2013e, 0x0}, ++ {0x201a5, 0x0}, ++ {0x2013f, 0x0}, ++ {0x201a6, 0x0}, ++ {0x20140, 0x0}, ++ {0x201a7, 0x0}, ++ {0x20141, 0x0}, ++ {0x201a8, 0x0}, ++ {0x20142, 0x0}, ++ {0x201a9, 0x0}, ++ {0x20143, 0x0}, ++ {0x201aa, 0x0}, ++ {0x20144, 0x0}, ++ {0x201ab, 0x0}, ++ {0x20145, 0x0}, ++ {0x201ac, 0x0}, ++ {0x20146, 0x0}, ++ {0x201ad, 0x0}, ++ {0x20147, 0x0}, ++ {0x201ae, 0x0}, ++ {0x20148, 0x0}, ++ {0x201af, 0x0}, ++ {0x20149, 0x0}, ++ {0x201b0, 0x0}, ++ {0x2014a, 0x0}, ++ {0x201b1, 0x0}, ++ {0x2014b, 0x0}, ++ {0x201b2, 0x0}, ++ {0x2014c, 0x0}, ++ {0x201b3, 0x0}, ++ {0x2014d, 0x0}, ++ {0x201b4, 0x0}, ++ {0x2014e, 0x0}, ++ {0x201b5, 0x0}, ++ {0x2014f, 0x0}, ++ {0x201b6, 0x0}, ++ {0x20150, 0x0}, ++ {0x201b7, 0x0}, ++ {0x20151, 0x0}, ++ {0x201b8, 0x0}, ++ {0x20152, 0x0}, ++ {0x201b9, 0x0}, ++ {0x20153, 0x0}, ++ {0x201ba, 0x0}, ++ {0x20154, 0x0}, ++ {0x201bb, 0x0}, ++ {0x20155, 0x0}, ++ {0x201bc, 0x0}, ++ {0x20156, 0x0}, ++ {0x201bd, 0x0}, ++ {0x20157, 0x0}, ++ {0x201be, 0x0}, ++ {0x20158, 0x0}, ++ {0x201bf, 0x0}, ++ {0x20159, 0x0}, ++ {0x201c0, 0x0}, ++ {0x2015a, 0x0}, ++ {0x201c1, 0x0}, ++ {0x2015b, 0x0}, ++ {0x201c2, 0x0}, ++ {0x2015c, 0x0}, ++ {0x201c3, 0x0}, ++ {0x2015d, 0x0}, ++ {0x201c4, 0x0}, ++ {0x2015e, 0x0}, ++ {0x201c5, 0x0}, ++ {0x2015f, 0x0}, ++ {0x201c6, 0x0}, ++ {0x20160, 0x0}, ++ {0x201c7, 0x0}, ++ {0x20161, 0x0}, ++ {0x201c8, 0x0}, ++ {0x20162, 0x0}, ++ {0x201c9, 0x0}, ++ {0x20163, 0x0}, ++ {0x201ca, 0x0}, ++ {0x20164, 0x0}, ++ {0x201cb, 0x0}, ++ {0x20165, 0x0}, ++ {0x201cc, 0x0}, ++ {0x20166, 0x0}, ++ {0x201cd, 0x0}, ++ {0x20167, 0x0}, ++ {0x201ce, 0x0}, ++ {0x20168, 0x0}, ++ {0x201cf, 0x0}, ++ {0x20169, 0x0}, ++ {0x201d0, 0x0}, ++ {0x2016a, 0x0}, ++ {0x201d1, 0x0}, ++ {0x2016b, 0x0}, ++ {0x201d2, 0x0}, ++ {0x2016c, 0x0}, ++ {0x201d3, 0x0}, ++ {0x2016d, 0x0}, ++ {0x201d4, 0x0}, ++ {0x2016e, 0x0}, ++ {0x201d5, 0x0}, ++ {0x2016f, 0x0}, ++ {0x201d6, 0x0}, ++ {0x20170, 0x0}, ++ {0x201d7, 0x0}, ++ {0x20171, 0x0}, ++ {0x201d8, 0x0}, ++ {0x20172, 0x0}, ++ {0x201d9, 0x0}, ++ {0x20173, 0x0}, ++ {0x201da, 0x0}, ++ {0xc0001, 0x0}, ++ {0xc0002, 0x0}, ++ {0xc0003, 0x0}, ++ {0xc0000, 0x0}, ++ {0xc0006, 0x0}, ++ {0xc0007, 0x0}, ++ {0x9070c, 0x0}, ++ {0x9070d, 0x0}, ++ {0x9070e, 0x0}, ++ {0x9070f, 0x0}, ++ {0x90710, 0x0}, ++ {0x90711, 0x0}, ++ {0x90713, 0x0}, ++ {0x90714, 0x0}, ++ {0x90715, 0x0}, ++ {0x90c10, 0x0}, ++ {0x90c12, 0x0}, ++ {0x90712, 0x0}, ++ {0x90c11, 0x0}, ++ {0x90716, 0x0}, ++ {0x90717, 0x0}, ++ {0x90718, 0x0}, ++ {0x90719, 0x0}, ++ {0x9071a, 0x0}, ++ {0x9071b, 0x0}, ++ {0x90904, 0x0}, ++ {0x90986, 0x0}, ++ {0x90920, 0x0}, ++ {0x90921, 0x0}, ++ {0x90922, 0x0}, ++ {0x90923, 0x0}, ++ {0x90924, 0x0}, ++ {0x90925, 0x0}, ++ {0x90926, 0x0}, ++ {0x90927, 0x0}, ++ {0x90930, 0x0}, ++ {0x90931, 0x0}, ++ {0x90932, 0x0}, ++ {0x90933, 0x0}, ++ {0x9090a, 0x0}, ++ {0x9090c, 0x0}, ++ {0x9090d, 0x0}, ++ {0x200f0, 0x0}, ++ {0x200f1, 0x0}, ++ {0x200f2, 0x0}, ++ {0x100b9, 0x0}, ++ {0x100b1, 0x0}, ++ {0x100ba, 0x0}, ++ {0x100a2, 0x0}, ++ {0x100b5, 0x0}, ++ {0x110b9, 0x0}, ++ {0x110b1, 0x0}, ++ {0x110ba, 0x0}, ++ {0x110a2, 0x0}, ++ {0x110b5, 0x0}, ++ {0x120b9, 0x0}, ++ {0x120b1, 0x0}, ++ {0x120ba, 0x0}, ++ {0x120a2, 0x0}, ++ {0x120b5, 0x0}, ++ {0x130b9, 0x0}, ++ {0x130b1, 0x0}, ++ {0x130ba, 0x0}, ++ {0x130a2, 0x0}, ++ {0x130b5, 0x0}, ++ {0x70024, 0x0}, ++ {0x70025, 0x0}, ++ {0x70026, 0x0}, ++ {0x70027, 0x0}, ++ {0x70028, 0x0}, ++ {0x70029, 0x0}, ++ {0x7002a, 0x0}, ++ {0x7002b, 0x0}, ++ {0x70124, 0x0}, ++ {0x70125, 0x0}, ++ {0x70126, 0x0}, ++ {0x70127, 0x0}, ++ {0x70128, 0x0}, ++ {0x70129, 0x0}, ++ {0x7012a, 0x0}, ++ {0x7012b, 0x0}, ++ {0x70224, 0x0}, ++ {0x70225, 0x0}, ++ {0x70226, 0x0}, ++ {0x70227, 0x0}, ++ {0x70228, 0x0}, ++ {0x70229, 0x0}, ++ {0x7022a, 0x0}, ++ {0x7022b, 0x0}, ++ {0x70324, 0x0}, ++ {0x70325, 0x0}, ++ {0x70326, 0x0}, ++ {0x70327, 0x0}, ++ {0x70328, 0x0}, ++ {0x70329, 0x0}, ++ {0x7032a, 0x0}, ++ {0x7032b, 0x0}, ++ {0x70424, 0x0}, ++ {0x70425, 0x0}, ++ {0x70426, 0x0}, ++ {0x70427, 0x0}, ++ {0x70428, 0x0}, ++ {0x70429, 0x0}, ++ {0x7042a, 0x0}, ++ {0x7042b, 0x0}, ++ {0x70524, 0x0}, ++ {0x70525, 0x0}, ++ {0x70526, 0x0}, ++ {0x70527, 0x0}, ++ {0x70528, 0x0}, ++ {0x70529, 0x0}, ++ {0x7052a, 0x0}, ++ {0x7052b, 0x0}, ++ {0x70624, 0x0}, ++ {0x70625, 0x0}, ++ {0x70626, 0x0}, ++ {0x70627, 0x0}, ++ {0x70628, 0x0}, ++ {0x70629, 0x0}, ++ {0x7062a, 0x0}, ++ {0x7062b, 0x0}, ++ {0x70724, 0x0}, ++ {0x70725, 0x0}, ++ {0x70726, 0x0}, ++ {0x70727, 0x0}, ++ {0x70728, 0x0}, ++ {0x70729, 0x0}, ++ {0x7072a, 0x0}, ++ {0x7072b, 0x0}, ++ {0x70824, 0x0}, ++ {0x70825, 0x0}, ++ {0x70826, 0x0}, ++ {0x70827, 0x0}, ++ {0x70828, 0x0}, ++ {0x70829, 0x0}, ++ {0x7082a, 0x0}, ++ {0x7082b, 0x0}, ++ {0x70065, 0x0}, ++ {0x2007e, 0x0}, ++ {0x200ef, 0x0}, ++ {0x90910, 0x0}, ++ {0x20310, 0x0}, ++ {0x20311, 0x0}, ++ {0x20049, 0x0}, ++ {0x100be, 0x0}, ++ {0x100b0, 0x0}, ++ {0x10080, 0x0}, ++ {0x10081, 0x0}, ++ {0x10082, 0x0}, ++ {0x10083, 0x0}, ++ {0x10084, 0x0}, ++ {0x10085, 0x0}, ++ {0x10086, 0x0}, ++ {0x10087, 0x0}, ++ {0x10056, 0x0}, ++ {0x100d9, 0x0}, ++ {0x110be, 0x0}, ++ {0x110b0, 0x0}, ++ {0x11080, 0x0}, ++ {0x11081, 0x0}, ++ {0x11082, 0x0}, ++ {0x11083, 0x0}, ++ {0x11084, 0x0}, ++ {0x11085, 0x0}, ++ {0x11086, 0x0}, ++ {0x11087, 0x0}, ++ {0x11056, 0x0}, ++ {0x110d9, 0x0}, ++ {0x120be, 0x0}, ++ {0x120b0, 0x0}, ++ {0x12080, 0x0}, ++ {0x12081, 0x0}, ++ {0x12082, 0x0}, ++ {0x12083, 0x0}, ++ {0x12084, 0x0}, ++ {0x12085, 0x0}, ++ {0x12086, 0x0}, ++ {0x12087, 0x0}, ++ {0x12056, 0x0}, ++ {0x120d9, 0x0}, ++ {0x130be, 0x0}, ++ {0x130b0, 0x0}, ++ {0x13080, 0x0}, ++ {0x13081, 0x0}, ++ {0x13082, 0x0}, ++ {0x13083, 0x0}, ++ {0x13084, 0x0}, ++ {0x13085, 0x0}, ++ {0x13086, 0x0}, ++ {0x13087, 0x0}, ++ {0x13056, 0x0}, ++ {0x130d9, 0x0}, ++ {0x30090, 0x0}, ++ {0x30091, 0x0}, ++ {0x30092, 0x0}, ++ {0x30093, 0x0}, ++ {0x30094, 0x0}, ++ {0x30095, 0x0}, ++ {0x30096, 0x0}, ++ {0x31090, 0x0}, ++ {0x31091, 0x0}, ++ {0x31092, 0x0}, ++ {0x31093, 0x0}, ++ {0x31094, 0x0}, ++ {0x31095, 0x0}, ++ {0x31096, 0x0}, ++ {0x30002, 0x0}, ++ {0x30007, 0x0}, ++ {0x30008, 0x0}, ++ {0x30005, 0x0}, ++ {0x30006, 0x0}, ++ {0x30001, 0x0}, ++ {0x30101, 0x0}, ++ {0x30201, 0x0}, ++ {0x30301, 0x0}, ++ {0x30401, 0x0}, ++ {0x30501, 0x0}, ++ {0x30601, 0x0}, ++ {0x30701, 0x0}, ++ {0x30801, 0x0}, ++ {0x30901, 0x0}, ++ {0x31002, 0x0}, ++ {0x31007, 0x0}, ++ {0x31008, 0x0}, ++ {0x31005, 0x0}, ++ {0x31006, 0x0}, ++ {0x31001, 0x0}, ++ {0x31101, 0x0}, ++ {0x31201, 0x0}, ++ {0x31301, 0x0}, ++ {0x31401, 0x0}, ++ {0x31501, 0x0}, ++ {0x31601, 0x0}, ++ {0x31701, 0x0}, ++ {0x31801, 0x0}, ++ {0x31901, 0x0}, ++ {0x10000, 0x0}, ++ {0x100ad, 0x0}, ++ {0x100af, 0x0}, ++ {0x10020, 0x0}, ++ {0x10021, 0x0}, ++ {0x10028, 0x0}, ++ {0x10029, 0x0}, ++ {0x10066, 0x0}, ++ {0x10067, 0x0}, ++ {0x1005a, 0x0}, ++ {0x1005b, 0x0}, ++ {0x1005c, 0x0}, ++ {0x1005d, 0x0}, ++ {0x1002a, 0x0}, ++ {0x1002b, 0x0}, ++ {0x10024, 0x0}, ++ {0x10025, 0x0}, ++ {0x10026, 0x0}, ++ {0x10027, 0x0}, ++ {0x10010, 0x0}, ++ {0x10011, 0x0}, ++ {0x10012, 0x0}, ++ {0x10013, 0x0}, ++ {0x10068, 0x0}, ++ {0x10069, 0x0}, ++ {0x1006a, 0x0}, ++ {0x1006b, 0x0}, ++ {0x1006c, 0x0}, ++ {0x1006d, 0x0}, ++ {0x1006e, 0x0}, ++ {0x1006f, 0x0}, ++ {0x1001c, 0x0}, ++ {0x1001d, 0x0}, ++ {0x1001e, 0x0}, ++ {0x1001f, 0x0}, ++ {0x10124, 0x0}, ++ {0x10125, 0x0}, ++ {0x10126, 0x0}, ++ {0x10127, 0x0}, ++ {0x10110, 0x0}, ++ {0x10111, 0x0}, ++ {0x10112, 0x0}, ++ {0x10113, 0x0}, ++ {0x10168, 0x0}, ++ {0x10169, 0x0}, ++ {0x1016a, 0x0}, ++ {0x1016b, 0x0}, ++ {0x1016c, 0x0}, ++ {0x1016d, 0x0}, ++ {0x1016e, 0x0}, ++ {0x1016f, 0x0}, ++ {0x1011c, 0x0}, ++ {0x1011d, 0x0}, ++ {0x1011e, 0x0}, ++ {0x1011f, 0x0}, ++ {0x10224, 0x0}, ++ {0x10225, 0x0}, ++ {0x10226, 0x0}, ++ {0x10227, 0x0}, ++ {0x10210, 0x0}, ++ {0x10211, 0x0}, ++ {0x10212, 0x0}, ++ {0x10213, 0x0}, ++ {0x10268, 0x0}, ++ {0x10269, 0x0}, ++ {0x1026a, 0x0}, ++ {0x1026b, 0x0}, ++ {0x1026c, 0x0}, ++ {0x1026d, 0x0}, ++ {0x1026e, 0x0}, ++ {0x1026f, 0x0}, ++ {0x1021c, 0x0}, ++ {0x1021d, 0x0}, ++ {0x1021e, 0x0}, ++ {0x1021f, 0x0}, ++ {0x10324, 0x0}, ++ {0x10325, 0x0}, ++ {0x10326, 0x0}, ++ {0x10327, 0x0}, ++ {0x10310, 0x0}, ++ {0x10311, 0x0}, ++ {0x10312, 0x0}, ++ {0x10313, 0x0}, ++ {0x10368, 0x0}, ++ {0x10369, 0x0}, ++ {0x1036a, 0x0}, ++ {0x1036b, 0x0}, ++ {0x1036c, 0x0}, ++ {0x1036d, 0x0}, ++ {0x1036e, 0x0}, ++ {0x1036f, 0x0}, ++ {0x1031c, 0x0}, ++ {0x1031d, 0x0}, ++ {0x1031e, 0x0}, ++ {0x1031f, 0x0}, ++ {0x10424, 0x0}, ++ {0x10425, 0x0}, ++ {0x10426, 0x0}, ++ {0x10427, 0x0}, ++ {0x10410, 0x0}, ++ {0x10411, 0x0}, ++ {0x10412, 0x0}, ++ {0x10413, 0x0}, ++ {0x10468, 0x0}, ++ {0x10469, 0x0}, ++ {0x1046a, 0x0}, ++ {0x1046b, 0x0}, ++ {0x1046c, 0x0}, ++ {0x1046d, 0x0}, ++ {0x1046e, 0x0}, ++ {0x1046f, 0x0}, ++ {0x1041c, 0x0}, ++ {0x1041d, 0x0}, ++ {0x1041e, 0x0}, ++ {0x1041f, 0x0}, ++ {0x10524, 0x0}, ++ {0x10525, 0x0}, ++ {0x10526, 0x0}, ++ {0x10527, 0x0}, ++ {0x10510, 0x0}, ++ {0x10511, 0x0}, ++ {0x10512, 0x0}, ++ {0x10513, 0x0}, ++ {0x10568, 0x0}, ++ {0x10569, 0x0}, ++ {0x1056a, 0x0}, ++ {0x1056b, 0x0}, ++ {0x1056c, 0x0}, ++ {0x1056d, 0x0}, ++ {0x1056e, 0x0}, ++ {0x1056f, 0x0}, ++ {0x1051c, 0x0}, ++ {0x1051d, 0x0}, ++ {0x1051e, 0x0}, ++ {0x1051f, 0x0}, ++ {0x10624, 0x0}, ++ {0x10625, 0x0}, ++ {0x10626, 0x0}, ++ {0x10627, 0x0}, ++ {0x10610, 0x0}, ++ {0x10611, 0x0}, ++ {0x10612, 0x0}, ++ {0x10613, 0x0}, ++ {0x10668, 0x0}, ++ {0x10669, 0x0}, ++ {0x1066a, 0x0}, ++ {0x1066b, 0x0}, ++ {0x1066c, 0x0}, ++ {0x1066d, 0x0}, ++ {0x1066e, 0x0}, ++ {0x1066f, 0x0}, ++ {0x1061c, 0x0}, ++ {0x1061d, 0x0}, ++ {0x1061e, 0x0}, ++ {0x1061f, 0x0}, ++ {0x10724, 0x0}, ++ {0x10725, 0x0}, ++ {0x10726, 0x0}, ++ {0x10727, 0x0}, ++ {0x10710, 0x0}, ++ {0x10711, 0x0}, ++ {0x10712, 0x0}, ++ {0x10713, 0x0}, ++ {0x10768, 0x0}, ++ {0x10769, 0x0}, ++ {0x1076a, 0x0}, ++ {0x1076b, 0x0}, ++ {0x1076c, 0x0}, ++ {0x1076d, 0x0}, ++ {0x1076e, 0x0}, ++ {0x1076f, 0x0}, ++ {0x1071c, 0x0}, ++ {0x1071d, 0x0}, ++ {0x1071e, 0x0}, ++ {0x1071f, 0x0}, ++ {0x10824, 0x0}, ++ {0x10825, 0x0}, ++ {0x10826, 0x0}, ++ {0x10827, 0x0}, ++ {0x10810, 0x0}, ++ {0x10811, 0x0}, ++ {0x10812, 0x0}, ++ {0x10813, 0x0}, ++ {0x10868, 0x0}, ++ {0x10869, 0x0}, ++ {0x1086a, 0x0}, ++ {0x1086b, 0x0}, ++ {0x1086c, 0x0}, ++ {0x1086d, 0x0}, ++ {0x1086e, 0x0}, ++ {0x1086f, 0x0}, ++ {0x1081c, 0x0}, ++ {0x1081d, 0x0}, ++ {0x1081e, 0x0}, ++ {0x1081f, 0x0}, ++ {0x1000c, 0x0}, ++ {0x1000d, 0x0}, ++ {0x10015, 0x0}, ++ {0x10016, 0x0}, ++ {0x10019, 0x0}, ++ {0x1001b, 0x0}, ++ {0x10022, 0x0}, ++ {0x10023, 0x0}, ++ {0x100d0, 0x0}, ++ {0x100d1, 0x0}, ++ {0x100d2, 0x0}, ++ {0x100d3, 0x0}, ++ {0x100d4, 0x0}, ++ {0x11000, 0x0}, ++ {0x110ad, 0x0}, ++ {0x110af, 0x0}, ++ {0x11020, 0x0}, ++ {0x11021, 0x0}, ++ {0x11028, 0x0}, ++ {0x11029, 0x0}, ++ {0x11066, 0x0}, ++ {0x11067, 0x0}, ++ {0x1105a, 0x0}, ++ {0x1105b, 0x0}, ++ {0x1105c, 0x0}, ++ {0x1105d, 0x0}, ++ {0x1102a, 0x0}, ++ {0x1102b, 0x0}, ++ {0x11024, 0x0}, ++ {0x11025, 0x0}, ++ {0x11026, 0x0}, ++ {0x11027, 0x0}, ++ {0x11010, 0x0}, ++ {0x11011, 0x0}, ++ {0x11012, 0x0}, ++ {0x11013, 0x0}, ++ {0x11068, 0x0}, ++ {0x11069, 0x0}, ++ {0x1106a, 0x0}, ++ {0x1106b, 0x0}, ++ {0x1106c, 0x0}, ++ {0x1106d, 0x0}, ++ {0x1106e, 0x0}, ++ {0x1106f, 0x0}, ++ {0x1101c, 0x0}, ++ {0x1101d, 0x0}, ++ {0x1101e, 0x0}, ++ {0x1101f, 0x0}, ++ {0x11124, 0x0}, ++ {0x11125, 0x0}, ++ {0x11126, 0x0}, ++ {0x11127, 0x0}, ++ {0x11110, 0x0}, ++ {0x11111, 0x0}, ++ {0x11112, 0x0}, ++ {0x11113, 0x0}, ++ {0x11168, 0x0}, ++ {0x11169, 0x0}, ++ {0x1116a, 0x0}, ++ {0x1116b, 0x0}, ++ {0x1116c, 0x0}, ++ {0x1116d, 0x0}, ++ {0x1116e, 0x0}, ++ {0x1116f, 0x0}, ++ {0x1111c, 0x0}, ++ {0x1111d, 0x0}, ++ {0x1111e, 0x0}, ++ {0x1111f, 0x0}, ++ {0x11224, 0x0}, ++ {0x11225, 0x0}, ++ {0x11226, 0x0}, ++ {0x11227, 0x0}, ++ {0x11210, 0x0}, ++ {0x11211, 0x0}, ++ {0x11212, 0x0}, ++ {0x11213, 0x0}, ++ {0x11268, 0x0}, ++ {0x11269, 0x0}, ++ {0x1126a, 0x0}, ++ {0x1126b, 0x0}, ++ {0x1126c, 0x0}, ++ {0x1126d, 0x0}, ++ {0x1126e, 0x0}, ++ {0x1126f, 0x0}, ++ {0x1121c, 0x0}, ++ {0x1121d, 0x0}, ++ {0x1121e, 0x0}, ++ {0x1121f, 0x0}, ++ {0x11324, 0x0}, ++ {0x11325, 0x0}, ++ {0x11326, 0x0}, ++ {0x11327, 0x0}, ++ {0x11310, 0x0}, ++ {0x11311, 0x0}, ++ {0x11312, 0x0}, ++ {0x11313, 0x0}, ++ {0x11368, 0x0}, ++ {0x11369, 0x0}, ++ {0x1136a, 0x0}, ++ {0x1136b, 0x0}, ++ {0x1136c, 0x0}, ++ {0x1136d, 0x0}, ++ {0x1136e, 0x0}, ++ {0x1136f, 0x0}, ++ {0x1131c, 0x0}, ++ {0x1131d, 0x0}, ++ {0x1131e, 0x0}, ++ {0x1131f, 0x0}, ++ {0x11424, 0x0}, ++ {0x11425, 0x0}, ++ {0x11426, 0x0}, ++ {0x11427, 0x0}, ++ {0x11410, 0x0}, ++ {0x11411, 0x0}, ++ {0x11412, 0x0}, ++ {0x11413, 0x0}, ++ {0x11468, 0x0}, ++ {0x11469, 0x0}, ++ {0x1146a, 0x0}, ++ {0x1146b, 0x0}, ++ {0x1146c, 0x0}, ++ {0x1146d, 0x0}, ++ {0x1146e, 0x0}, ++ {0x1146f, 0x0}, ++ {0x1141c, 0x0}, ++ {0x1141d, 0x0}, ++ {0x1141e, 0x0}, ++ {0x1141f, 0x0}, ++ {0x11524, 0x0}, ++ {0x11525, 0x0}, ++ {0x11526, 0x0}, ++ {0x11527, 0x0}, ++ {0x11510, 0x0}, ++ {0x11511, 0x0}, ++ {0x11512, 0x0}, ++ {0x11513, 0x0}, ++ {0x11568, 0x0}, ++ {0x11569, 0x0}, ++ {0x1156a, 0x0}, ++ {0x1156b, 0x0}, ++ {0x1156c, 0x0}, ++ {0x1156d, 0x0}, ++ {0x1156e, 0x0}, ++ {0x1156f, 0x0}, ++ {0x1151c, 0x0}, ++ {0x1151d, 0x0}, ++ {0x1151e, 0x0}, ++ {0x1151f, 0x0}, ++ {0x11624, 0x0}, ++ {0x11625, 0x0}, ++ {0x11626, 0x0}, ++ {0x11627, 0x0}, ++ {0x11610, 0x0}, ++ {0x11611, 0x0}, ++ {0x11612, 0x0}, ++ {0x11613, 0x0}, ++ {0x11668, 0x0}, ++ {0x11669, 0x0}, ++ {0x1166a, 0x0}, ++ {0x1166b, 0x0}, ++ {0x1166c, 0x0}, ++ {0x1166d, 0x0}, ++ {0x1166e, 0x0}, ++ {0x1166f, 0x0}, ++ {0x1161c, 0x0}, ++ {0x1161d, 0x0}, ++ {0x1161e, 0x0}, ++ {0x1161f, 0x0}, ++ {0x11724, 0x0}, ++ {0x11725, 0x0}, ++ {0x11726, 0x0}, ++ {0x11727, 0x0}, ++ {0x11710, 0x0}, ++ {0x11711, 0x0}, ++ {0x11712, 0x0}, ++ {0x11713, 0x0}, ++ {0x11768, 0x0}, ++ {0x11769, 0x0}, ++ {0x1176a, 0x0}, ++ {0x1176b, 0x0}, ++ {0x1176c, 0x0}, ++ {0x1176d, 0x0}, ++ {0x1176e, 0x0}, ++ {0x1176f, 0x0}, ++ {0x1171c, 0x0}, ++ {0x1171d, 0x0}, ++ {0x1171e, 0x0}, ++ {0x1171f, 0x0}, ++ {0x11824, 0x0}, ++ {0x11825, 0x0}, ++ {0x11826, 0x0}, ++ {0x11827, 0x0}, ++ {0x11810, 0x0}, ++ {0x11811, 0x0}, ++ {0x11812, 0x0}, ++ {0x11813, 0x0}, ++ {0x11868, 0x0}, ++ {0x11869, 0x0}, ++ {0x1186a, 0x0}, ++ {0x1186b, 0x0}, ++ {0x1186c, 0x0}, ++ {0x1186d, 0x0}, ++ {0x1186e, 0x0}, ++ {0x1186f, 0x0}, ++ {0x1181c, 0x0}, ++ {0x1181d, 0x0}, ++ {0x1181e, 0x0}, ++ {0x1181f, 0x0}, ++ {0x1100c, 0x0}, ++ {0x1100d, 0x0}, ++ {0x11015, 0x0}, ++ {0x11016, 0x0}, ++ {0x11019, 0x0}, ++ {0x1101b, 0x0}, ++ {0x11022, 0x0}, ++ {0x11023, 0x0}, ++ {0x110d0, 0x0}, ++ {0x110d1, 0x0}, ++ {0x110d2, 0x0}, ++ {0x110d3, 0x0}, ++ {0x110d4, 0x0}, ++ {0x12000, 0x0}, ++ {0x120ad, 0x0}, ++ {0x120af, 0x0}, ++ {0x12020, 0x0}, ++ {0x12021, 0x0}, ++ {0x12028, 0x0}, ++ {0x12029, 0x0}, ++ {0x12066, 0x0}, ++ {0x12067, 0x0}, ++ {0x1205a, 0x0}, ++ {0x1205b, 0x0}, ++ {0x1205c, 0x0}, ++ {0x1205d, 0x0}, ++ {0x1202a, 0x0}, ++ {0x1202b, 0x0}, ++ {0x12024, 0x0}, ++ {0x12025, 0x0}, ++ {0x12026, 0x0}, ++ {0x12027, 0x0}, ++ {0x12010, 0x0}, ++ {0x12011, 0x0}, ++ {0x12012, 0x0}, ++ {0x12013, 0x0}, ++ {0x12068, 0x0}, ++ {0x12069, 0x0}, ++ {0x1206a, 0x0}, ++ {0x1206b, 0x0}, ++ {0x1206c, 0x0}, ++ {0x1206d, 0x0}, ++ {0x1206e, 0x0}, ++ {0x1206f, 0x0}, ++ {0x1201c, 0x0}, ++ {0x1201d, 0x0}, ++ {0x1201e, 0x0}, ++ {0x1201f, 0x0}, ++ {0x12124, 0x0}, ++ {0x12125, 0x0}, ++ {0x12126, 0x0}, ++ {0x12127, 0x0}, ++ {0x12110, 0x0}, ++ {0x12111, 0x0}, ++ {0x12112, 0x0}, ++ {0x12113, 0x0}, ++ {0x12168, 0x0}, ++ {0x12169, 0x0}, ++ {0x1216a, 0x0}, ++ {0x1216b, 0x0}, ++ {0x1216c, 0x0}, ++ {0x1216d, 0x0}, ++ {0x1216e, 0x0}, ++ {0x1216f, 0x0}, ++ {0x1211c, 0x0}, ++ {0x1211d, 0x0}, ++ {0x1211e, 0x0}, ++ {0x1211f, 0x0}, ++ {0x12224, 0x0}, ++ {0x12225, 0x0}, ++ {0x12226, 0x0}, ++ {0x12227, 0x0}, ++ {0x12210, 0x0}, ++ {0x12211, 0x0}, ++ {0x12212, 0x0}, ++ {0x12213, 0x0}, ++ {0x12268, 0x0}, ++ {0x12269, 0x0}, ++ {0x1226a, 0x0}, ++ {0x1226b, 0x0}, ++ {0x1226c, 0x0}, ++ {0x1226d, 0x0}, ++ {0x1226e, 0x0}, ++ {0x1226f, 0x0}, ++ {0x1221c, 0x0}, ++ {0x1221d, 0x0}, ++ {0x1221e, 0x0}, ++ {0x1221f, 0x0}, ++ {0x12324, 0x0}, ++ {0x12325, 0x0}, ++ {0x12326, 0x0}, ++ {0x12327, 0x0}, ++ {0x12310, 0x0}, ++ {0x12311, 0x0}, ++ {0x12312, 0x0}, ++ {0x12313, 0x0}, ++ {0x12368, 0x0}, ++ {0x12369, 0x0}, ++ {0x1236a, 0x0}, ++ {0x1236b, 0x0}, ++ {0x1236c, 0x0}, ++ {0x1236d, 0x0}, ++ {0x1236e, 0x0}, ++ {0x1236f, 0x0}, ++ {0x1231c, 0x0}, ++ {0x1231d, 0x0}, ++ {0x1231e, 0x0}, ++ {0x1231f, 0x0}, ++ {0x12424, 0x0}, ++ {0x12425, 0x0}, ++ {0x12426, 0x0}, ++ {0x12427, 0x0}, ++ {0x12410, 0x0}, ++ {0x12411, 0x0}, ++ {0x12412, 0x0}, ++ {0x12413, 0x0}, ++ {0x12468, 0x0}, ++ {0x12469, 0x0}, ++ {0x1246a, 0x0}, ++ {0x1246b, 0x0}, ++ {0x1246c, 0x0}, ++ {0x1246d, 0x0}, ++ {0x1246e, 0x0}, ++ {0x1246f, 0x0}, ++ {0x1241c, 0x0}, ++ {0x1241d, 0x0}, ++ {0x1241e, 0x0}, ++ {0x1241f, 0x0}, ++ {0x12524, 0x0}, ++ {0x12525, 0x0}, ++ {0x12526, 0x0}, ++ {0x12527, 0x0}, ++ {0x12510, 0x0}, ++ {0x12511, 0x0}, ++ {0x12512, 0x0}, ++ {0x12513, 0x0}, ++ {0x12568, 0x0}, ++ {0x12569, 0x0}, ++ {0x1256a, 0x0}, ++ {0x1256b, 0x0}, ++ {0x1256c, 0x0}, ++ {0x1256d, 0x0}, ++ {0x1256e, 0x0}, ++ {0x1256f, 0x0}, ++ {0x1251c, 0x0}, ++ {0x1251d, 0x0}, ++ {0x1251e, 0x0}, ++ {0x1251f, 0x0}, ++ {0x12624, 0x0}, ++ {0x12625, 0x0}, ++ {0x12626, 0x0}, ++ {0x12627, 0x0}, ++ {0x12610, 0x0}, ++ {0x12611, 0x0}, ++ {0x12612, 0x0}, ++ {0x12613, 0x0}, ++ {0x12668, 0x0}, ++ {0x12669, 0x0}, ++ {0x1266a, 0x0}, ++ {0x1266b, 0x0}, ++ {0x1266c, 0x0}, ++ {0x1266d, 0x0}, ++ {0x1266e, 0x0}, ++ {0x1266f, 0x0}, ++ {0x1261c, 0x0}, ++ {0x1261d, 0x0}, ++ {0x1261e, 0x0}, ++ {0x1261f, 0x0}, ++ {0x12724, 0x0}, ++ {0x12725, 0x0}, ++ {0x12726, 0x0}, ++ {0x12727, 0x0}, ++ {0x12710, 0x0}, ++ {0x12711, 0x0}, ++ {0x12712, 0x0}, ++ {0x12713, 0x0}, ++ {0x12768, 0x0}, ++ {0x12769, 0x0}, ++ {0x1276a, 0x0}, ++ {0x1276b, 0x0}, ++ {0x1276c, 0x0}, ++ {0x1276d, 0x0}, ++ {0x1276e, 0x0}, ++ {0x1276f, 0x0}, ++ {0x1271c, 0x0}, ++ {0x1271d, 0x0}, ++ {0x1271e, 0x0}, ++ {0x1271f, 0x0}, ++ {0x12824, 0x0}, ++ {0x12825, 0x0}, ++ {0x12826, 0x0}, ++ {0x12827, 0x0}, ++ {0x12810, 0x0}, ++ {0x12811, 0x0}, ++ {0x12812, 0x0}, ++ {0x12813, 0x0}, ++ {0x12868, 0x0}, ++ {0x12869, 0x0}, ++ {0x1286a, 0x0}, ++ {0x1286b, 0x0}, ++ {0x1286c, 0x0}, ++ {0x1286d, 0x0}, ++ {0x1286e, 0x0}, ++ {0x1286f, 0x0}, ++ {0x1281c, 0x0}, ++ {0x1281d, 0x0}, ++ {0x1281e, 0x0}, ++ {0x1281f, 0x0}, ++ {0x1200c, 0x0}, ++ {0x1200d, 0x0}, ++ {0x12015, 0x0}, ++ {0x12016, 0x0}, ++ {0x12019, 0x0}, ++ {0x1201b, 0x0}, ++ {0x12022, 0x0}, ++ {0x12023, 0x0}, ++ {0x120d0, 0x0}, ++ {0x120d1, 0x0}, ++ {0x120d2, 0x0}, ++ {0x120d3, 0x0}, ++ {0x120d4, 0x0}, ++ {0x13000, 0x0}, ++ {0x130ad, 0x0}, ++ {0x130af, 0x0}, ++ {0x13020, 0x0}, ++ {0x13021, 0x0}, ++ {0x13028, 0x0}, ++ {0x13029, 0x0}, ++ {0x13066, 0x0}, ++ {0x13067, 0x0}, ++ {0x1305a, 0x0}, ++ {0x1305b, 0x0}, ++ {0x1305c, 0x0}, ++ {0x1305d, 0x0}, ++ {0x1302a, 0x0}, ++ {0x1302b, 0x0}, ++ {0x13024, 0x0}, ++ {0x13025, 0x0}, ++ {0x13026, 0x0}, ++ {0x13027, 0x0}, ++ {0x13010, 0x0}, ++ {0x13011, 0x0}, ++ {0x13012, 0x0}, ++ {0x13013, 0x0}, ++ {0x13068, 0x0}, ++ {0x13069, 0x0}, ++ {0x1306a, 0x0}, ++ {0x1306b, 0x0}, ++ {0x1306c, 0x0}, ++ {0x1306d, 0x0}, ++ {0x1306e, 0x0}, ++ {0x1306f, 0x0}, ++ {0x1301c, 0x0}, ++ {0x1301d, 0x0}, ++ {0x1301e, 0x0}, ++ {0x1301f, 0x0}, ++ {0x13124, 0x0}, ++ {0x13125, 0x0}, ++ {0x13126, 0x0}, ++ {0x13127, 0x0}, ++ {0x13110, 0x0}, ++ {0x13111, 0x0}, ++ {0x13112, 0x0}, ++ {0x13113, 0x0}, ++ {0x13168, 0x0}, ++ {0x13169, 0x0}, ++ {0x1316a, 0x0}, ++ {0x1316b, 0x0}, ++ {0x1316c, 0x0}, ++ {0x1316d, 0x0}, ++ {0x1316e, 0x0}, ++ {0x1316f, 0x0}, ++ {0x1311c, 0x0}, ++ {0x1311d, 0x0}, ++ {0x1311e, 0x0}, ++ {0x1311f, 0x0}, ++ {0x13224, 0x0}, ++ {0x13225, 0x0}, ++ {0x13226, 0x0}, ++ {0x13227, 0x0}, ++ {0x13210, 0x0}, ++ {0x13211, 0x0}, ++ {0x13212, 0x0}, ++ {0x13213, 0x0}, ++ {0x13268, 0x0}, ++ {0x13269, 0x0}, ++ {0x1326a, 0x0}, ++ {0x1326b, 0x0}, ++ {0x1326c, 0x0}, ++ {0x1326d, 0x0}, ++ {0x1326e, 0x0}, ++ {0x1326f, 0x0}, ++ {0x1321c, 0x0}, ++ {0x1321d, 0x0}, ++ {0x1321e, 0x0}, ++ {0x1321f, 0x0}, ++ {0x13324, 0x0}, ++ {0x13325, 0x0}, ++ {0x13326, 0x0}, ++ {0x13327, 0x0}, ++ {0x13310, 0x0}, ++ {0x13311, 0x0}, ++ {0x13312, 0x0}, ++ {0x13313, 0x0}, ++ {0x13368, 0x0}, ++ {0x13369, 0x0}, ++ {0x1336a, 0x0}, ++ {0x1336b, 0x0}, ++ {0x1336c, 0x0}, ++ {0x1336d, 0x0}, ++ {0x1336e, 0x0}, ++ {0x1336f, 0x0}, ++ {0x1331c, 0x0}, ++ {0x1331d, 0x0}, ++ {0x1331e, 0x0}, ++ {0x1331f, 0x0}, ++ {0x13424, 0x0}, ++ {0x13425, 0x0}, ++ {0x13426, 0x0}, ++ {0x13427, 0x0}, ++ {0x13410, 0x0}, ++ {0x13411, 0x0}, ++ {0x13412, 0x0}, ++ {0x13413, 0x0}, ++ {0x13468, 0x0}, ++ {0x13469, 0x0}, ++ {0x1346a, 0x0}, ++ {0x1346b, 0x0}, ++ {0x1346c, 0x0}, ++ {0x1346d, 0x0}, ++ {0x1346e, 0x0}, ++ {0x1346f, 0x0}, ++ {0x1341c, 0x0}, ++ {0x1341d, 0x0}, ++ {0x1341e, 0x0}, ++ {0x1341f, 0x0}, ++ {0x13524, 0x0}, ++ {0x13525, 0x0}, ++ {0x13526, 0x0}, ++ {0x13527, 0x0}, ++ {0x13510, 0x0}, ++ {0x13511, 0x0}, ++ {0x13512, 0x0}, ++ {0x13513, 0x0}, ++ {0x13568, 0x0}, ++ {0x13569, 0x0}, ++ {0x1356a, 0x0}, ++ {0x1356b, 0x0}, ++ {0x1356c, 0x0}, ++ {0x1356d, 0x0}, ++ {0x1356e, 0x0}, ++ {0x1356f, 0x0}, ++ {0x1351c, 0x0}, ++ {0x1351d, 0x0}, ++ {0x1351e, 0x0}, ++ {0x1351f, 0x0}, ++ {0x13624, 0x0}, ++ {0x13625, 0x0}, ++ {0x13626, 0x0}, ++ {0x13627, 0x0}, ++ {0x13610, 0x0}, ++ {0x13611, 0x0}, ++ {0x13612, 0x0}, ++ {0x13613, 0x0}, ++ {0x13668, 0x0}, ++ {0x13669, 0x0}, ++ {0x1366a, 0x0}, ++ {0x1366b, 0x0}, ++ {0x1366c, 0x0}, ++ {0x1366d, 0x0}, ++ {0x1366e, 0x0}, ++ {0x1366f, 0x0}, ++ {0x1361c, 0x0}, ++ {0x1361d, 0x0}, ++ {0x1361e, 0x0}, ++ {0x1361f, 0x0}, ++ {0x13724, 0x0}, ++ {0x13725, 0x0}, ++ {0x13726, 0x0}, ++ {0x13727, 0x0}, ++ {0x13710, 0x0}, ++ {0x13711, 0x0}, ++ {0x13712, 0x0}, ++ {0x13713, 0x0}, ++ {0x13768, 0x0}, ++ {0x13769, 0x0}, ++ {0x1376a, 0x0}, ++ {0x1376b, 0x0}, ++ {0x1376c, 0x0}, ++ {0x1376d, 0x0}, ++ {0x1376e, 0x0}, ++ {0x1376f, 0x0}, ++ {0x1371c, 0x0}, ++ {0x1371d, 0x0}, ++ {0x1371e, 0x0}, ++ {0x1371f, 0x0}, ++ {0x13824, 0x0}, ++ {0x13825, 0x0}, ++ {0x13826, 0x0}, ++ {0x13827, 0x0}, ++ {0x13810, 0x0}, ++ {0x13811, 0x0}, ++ {0x13812, 0x0}, ++ {0x13813, 0x0}, ++ {0x13868, 0x0}, ++ {0x13869, 0x0}, ++ {0x1386a, 0x0}, ++ {0x1386b, 0x0}, ++ {0x1386c, 0x0}, ++ {0x1386d, 0x0}, ++ {0x1386e, 0x0}, ++ {0x1386f, 0x0}, ++ {0x1381c, 0x0}, ++ {0x1381d, 0x0}, ++ {0x1381e, 0x0}, ++ {0x1381f, 0x0}, ++ {0x1300c, 0x0}, ++ {0x1300d, 0x0}, ++ {0x13015, 0x0}, ++ {0x13016, 0x0}, ++ {0x13019, 0x0}, ++ {0x1301b, 0x0}, ++ {0x13022, 0x0}, ++ {0x13023, 0x0}, ++ {0x130d0, 0x0}, ++ {0x130d1, 0x0}, ++ {0x130d2, 0x0}, ++ {0x130d3, 0x0}, ++ {0x130d4, 0x0}, ++ {0x90807, 0x0}, ++ {0x90808, 0x0}, ++ {0x90813, 0x0}, ++ {0x2004e, 0x0}, ++ {0x2000d, 0x0}, ++ {0x20077, 0x0}, ++}; ++ ++/* PHY Initialize Configuration for Pstate 0 */ ++static struct ddrphy_cfg_param ddr_phy_fsp0_cfg[] = { ++ {0x90802, 0x1}, ++ {0x2004a, 0x601}, ++ {0x2004b, 0x1c3e}, ++ {0x2004c, 0x2e8f}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x101}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20002, 0x2}, ++ {0x20000, 0x2}, ++ {0x90801, 0x4d}, ++ {0x90809, 0x6800}, ++ {0x1005e, 0x366}, ++ {0x10060, 0x366}, ++ {0x10062, 0x366}, ++ {0x10064, 0x366}, ++ {0x1005f, 0x366}, ++ {0x10061, 0x366}, ++ {0x10063, 0x366}, ++ {0x10065, 0x366}, ++ {0x1105e, 0x366}, ++ {0x11060, 0x366}, ++ {0x11062, 0x366}, ++ {0x11064, 0x366}, ++ {0x1105f, 0x366}, ++ {0x11061, 0x366}, ++ {0x11063, 0x366}, ++ {0x11065, 0x366}, ++ {0x1205e, 0x366}, ++ {0x12060, 0x366}, ++ {0x12062, 0x366}, ++ {0x12064, 0x366}, ++ {0x1205f, 0x366}, ++ {0x12061, 0x366}, ++ {0x12063, 0x366}, ++ {0x12065, 0x366}, ++ {0x1305e, 0x366}, ++ {0x13060, 0x366}, ++ {0x13062, 0x366}, ++ {0x13064, 0x366}, ++ {0x1305f, 0x366}, ++ {0x13061, 0x366}, ++ {0x13063, 0x366}, ++ {0x13065, 0x366}, ++ {0x10005, 0x0}, ++ {0x1000b, 0x0}, ++ {0x11005, 0x0}, ++ {0x1100b, 0x0}, ++ {0x12005, 0x0}, ++ {0x1200b, 0x0}, ++ {0x13005, 0x0}, ++ {0x1300b, 0x0}, ++ {0x20007, 0x200}, ++ {0x20013, 0x2c}, ++ {0x30038, 0x3}, ++ {0x30039, 0x3}, ++ {0x3003a, 0x3}, ++ {0x31038, 0x3}, ++ {0x31039, 0x3}, ++ {0x3103a, 0x3}, ++ {0x10038, 0x3}, ++ {0x1003a, 0x3}, ++ {0x11038, 0x3}, ++ {0x1103a, 0x3}, ++ {0x12038, 0x3}, ++ {0x1203a, 0x3}, ++ {0x13038, 0x3}, ++ {0x1303a, 0x3}, ++ {0x1003b, 0x3}, ++ {0x1103b, 0x3}, ++ {0x1203b, 0x3}, ++ {0x1303b, 0x3}, ++ {0x10009, 0x0}, ++ {0x10037, 0x0}, ++ {0x11009, 0x0}, ++ {0x11037, 0x0}, ++ {0x12009, 0x0}, ++ {0x12037, 0x0}, ++ {0x13009, 0x0}, ++ {0x13037, 0x0}, ++ {0x10004, 0x0}, ++ {0x10003, 0x0}, ++ {0x11004, 0x0}, ++ {0x11003, 0x0}, ++ {0x12004, 0x0}, ++ {0x12003, 0x0}, ++ {0x13004, 0x0}, ++ {0x13003, 0x0}, ++ {0x20004, 0x320}, ++ {0x30050, 0x15}, ++ {0x30051, 0x15}, ++ {0x30052, 0x15}, ++ {0x30053, 0x15}, ++ {0x31050, 0x15}, ++ {0x31051, 0x15}, ++ {0x31052, 0x15}, ++ {0x31053, 0x15}, ++ {0x1004e, 0x15}, ++ {0x1004f, 0x15}, ++ {0x10050, 0x15}, ++ {0x10051, 0x15}, ++ {0x1014e, 0x15}, ++ {0x1014f, 0x15}, ++ {0x10150, 0x15}, ++ {0x10151, 0x15}, ++ {0x1024e, 0x15}, ++ {0x1024f, 0x15}, ++ {0x10250, 0x15}, ++ {0x10251, 0x15}, ++ {0x1034e, 0x15}, ++ {0x1034f, 0x15}, ++ {0x10350, 0x15}, ++ {0x10351, 0x15}, ++ {0x1044e, 0x15}, ++ {0x1044f, 0x15}, ++ {0x10450, 0x15}, ++ {0x10451, 0x15}, ++ {0x1054e, 0x15}, ++ {0x1054f, 0x15}, ++ {0x10550, 0x15}, ++ {0x10551, 0x15}, ++ {0x1064e, 0x15}, ++ {0x1064f, 0x15}, ++ {0x10650, 0x15}, ++ {0x10651, 0x15}, ++ {0x1074e, 0x15}, ++ {0x1074f, 0x15}, ++ {0x10750, 0x15}, ++ {0x10751, 0x15}, ++ {0x1084e, 0x15}, ++ {0x1084f, 0x15}, ++ {0x10850, 0x15}, ++ {0x10851, 0x15}, ++ {0x1104e, 0x15}, ++ {0x1104f, 0x15}, ++ {0x11050, 0x15}, ++ {0x11051, 0x15}, ++ {0x1114e, 0x15}, ++ {0x1114f, 0x15}, ++ {0x11150, 0x15}, ++ {0x11151, 0x15}, ++ {0x1124e, 0x15}, ++ {0x1124f, 0x15}, ++ {0x11250, 0x15}, ++ {0x11251, 0x15}, ++ {0x1134e, 0x15}, ++ {0x1134f, 0x15}, ++ {0x11350, 0x15}, ++ {0x11351, 0x15}, ++ {0x1144e, 0x15}, ++ {0x1144f, 0x15}, ++ {0x11450, 0x15}, ++ {0x11451, 0x15}, ++ {0x1154e, 0x15}, ++ {0x1154f, 0x15}, ++ {0x11550, 0x15}, ++ {0x11551, 0x15}, ++ {0x1164e, 0x15}, ++ {0x1164f, 0x15}, ++ {0x11650, 0x15}, ++ {0x11651, 0x15}, ++ {0x1174e, 0x15}, ++ {0x1174f, 0x15}, ++ {0x11750, 0x15}, ++ {0x11751, 0x15}, ++ {0x1184e, 0x15}, ++ {0x1184f, 0x15}, ++ {0x11850, 0x15}, ++ {0x11851, 0x15}, ++ {0x1204e, 0x15}, ++ {0x1204f, 0x15}, ++ {0x12050, 0x15}, ++ {0x12051, 0x15}, ++ {0x1214e, 0x15}, ++ {0x1214f, 0x15}, ++ {0x12150, 0x15}, ++ {0x12151, 0x15}, ++ {0x1224e, 0x15}, ++ {0x1224f, 0x15}, ++ {0x12250, 0x15}, ++ {0x12251, 0x15}, ++ {0x1234e, 0x15}, ++ {0x1234f, 0x15}, ++ {0x12350, 0x15}, ++ {0x12351, 0x15}, ++ {0x1244e, 0x15}, ++ {0x1244f, 0x15}, ++ {0x12450, 0x15}, ++ {0x12451, 0x15}, ++ {0x1254e, 0x15}, ++ {0x1254f, 0x15}, ++ {0x12550, 0x15}, ++ {0x12551, 0x15}, ++ {0x1264e, 0x15}, ++ {0x1264f, 0x15}, ++ {0x12650, 0x15}, ++ {0x12651, 0x15}, ++ {0x1274e, 0x15}, ++ {0x1274f, 0x15}, ++ {0x12750, 0x15}, ++ {0x12751, 0x15}, ++ {0x1284e, 0x15}, ++ {0x1284f, 0x15}, ++ {0x12850, 0x15}, ++ {0x12851, 0x15}, ++ {0x1304e, 0x15}, ++ {0x1304f, 0x15}, ++ {0x13050, 0x15}, ++ {0x13051, 0x15}, ++ {0x1314e, 0x15}, ++ {0x1314f, 0x15}, ++ {0x13150, 0x15}, ++ {0x13151, 0x15}, ++ {0x1324e, 0x15}, ++ {0x1324f, 0x15}, ++ {0x13250, 0x15}, ++ {0x13251, 0x15}, ++ {0x1334e, 0x15}, ++ {0x1334f, 0x15}, ++ {0x13350, 0x15}, ++ {0x13351, 0x15}, ++ {0x1344e, 0x15}, ++ {0x1344f, 0x15}, ++ {0x13450, 0x15}, ++ {0x13451, 0x15}, ++ {0x1354e, 0x15}, ++ {0x1354f, 0x15}, ++ {0x13550, 0x15}, ++ {0x13551, 0x15}, ++ {0x1364e, 0x15}, ++ {0x1364f, 0x15}, ++ {0x13650, 0x15}, ++ {0x13651, 0x15}, ++ {0x1374e, 0x15}, ++ {0x1374f, 0x15}, ++ {0x13750, 0x15}, ++ {0x13751, 0x15}, ++ {0x1384e, 0x15}, ++ {0x1384f, 0x15}, ++ {0x13850, 0x15}, ++ {0x13851, 0x15}, ++ {0x30030, 0x0}, ++ {0x30031, 0x0}, ++ {0x30035, 0x0}, ++ {0x31030, 0x0}, ++ {0x31031, 0x0}, ++ {0x31035, 0x0}, ++ {0x10030, 0x0}, ++ {0x10035, 0x0}, ++ {0x10036, 0x0}, ++ {0x11030, 0x0}, ++ {0x11035, 0x0}, ++ {0x11036, 0x0}, ++ {0x12030, 0x0}, ++ {0x12035, 0x0}, ++ {0x12036, 0x0}, ++ {0x13030, 0x0}, ++ {0x13035, 0x0}, ++ {0x13036, 0x0}, ++ {0x3003c, 0x5}, ++ {0x3103c, 0x5}, ++ {0x1003c, 0x5}, ++ {0x1003d, 0x5}, ++ {0x1003e, 0x5}, ++ {0x1103c, 0x5}, ++ {0x1103d, 0x5}, ++ {0x1103e, 0x5}, ++ {0x1203c, 0x5}, ++ {0x1203d, 0x5}, ++ {0x1203e, 0x5}, ++ {0x1303c, 0x5}, ++ {0x1303d, 0x5}, ++ {0x1303e, 0x5}, ++ {0x20003, 0x1}, ++ {0x10006, 0x2}, ++ {0x11006, 0x2}, ++ {0x12006, 0x2}, ++ {0x13006, 0x2}, ++ {0x20001, 0x1122}, ++ {0x20009, 0x0}, ++ {0x20008, 0x0}, ++ {0x200d9, 0x1}, ++ {0x30eef, 0x0}, ++ {0x31eef, 0x0}, ++ {0x20014, 0x1301}, ++ {0x9080a, 0x1300}, ++ {0x10040, 0xe0e}, ++ {0x10042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x10043, 0x0}, ++ {0x10044, 0xe0e}, ++ {0x10045, 0xe0e}, ++ {0x11040, 0xe0e}, ++ {0x11042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x11043, 0x0}, ++ {0x11044, 0xe0e}, ++ {0x11045, 0xe0e}, ++ {0x12040, 0xe0e}, ++ {0x12042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x12043, 0x0}, ++ {0x12044, 0xe0e}, ++ {0x12045, 0xe0e}, ++ {0x13040, 0xe0e}, ++ {0x13042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x13043, 0x0}, ++ {0x13044, 0xe0e}, ++ {0x13045, 0xe0e}, ++ {0x30040, 0xe0e}, ++ {0x30041, 0xe0e}, ++ {0x30042, 0xe0e}, ++ {0x30043, 0xe0e}, ++ {0x30330, 0x33}, ++ {0x31040, 0xe0e}, ++ {0x31041, 0xe0e}, ++ {0x31042, 0xe0e}, ++ {0x31043, 0xe0e}, ++ {0x31330, 0x33}, ++ {0x20331, 0x33}, ++ {0x10048, 0xc00}, ++ {0x1004a, 0xc00}, ++ {0x1004b, 0xc00}, ++ {0x1004c, 0xe00}, ++ {0x1004d, 0xe00}, ++ {0x11048, 0xc00}, ++ {0x1104a, 0xc00}, ++ {0x1104b, 0xc00}, ++ {0x1104c, 0xe00}, ++ {0x1104d, 0xe00}, ++ {0x12048, 0xc00}, ++ {0x1204a, 0xc00}, ++ {0x1204b, 0xc00}, ++ {0x1204c, 0xe00}, ++ {0x1204d, 0xe00}, ++ {0x13048, 0xc00}, ++ {0x1304a, 0xc00}, ++ {0x1304b, 0xc00}, ++ {0x1304c, 0xe00}, ++ {0x1304d, 0xe00}, ++ {0x30048, 0xc00}, ++ {0x30049, 0xc00}, ++ {0x3004a, 0xc00}, ++ {0x3004b, 0xc00}, ++ {0x31048, 0xc00}, ++ {0x31049, 0xc00}, ++ {0x3104a, 0xc00}, ++ {0x3104b, 0xc00}, ++ {0x30033, 0xcc}, ++ {0x30034, 0xcc}, ++ {0x3002e, 0xcc}, ++ {0x31033, 0xcc}, ++ {0x31034, 0xcc}, ++ {0x3102e, 0xcc}, ++ {0x10033, 0xcc}, ++ {0x1002e, 0xcc}, ++ {0x1002f, 0xcc}, ++ {0x11033, 0xcc}, ++ {0x1102e, 0xcc}, ++ {0x1102f, 0xcc}, ++ {0x12033, 0xcc}, ++ {0x1202e, 0xcc}, ++ {0x1202f, 0xcc}, ++ {0x13033, 0xcc}, ++ {0x1302e, 0xcc}, ++ {0x1302f, 0xcc}, ++ {0x20015, 0x0}, ++ {0x90806, 0x0}, ++ {0x100e8, 0x0}, ++ {0x100e9, 0x15}, ++ {0x110e8, 0x0}, ++ {0x110e9, 0x15}, ++ {0x120e8, 0x0}, ++ {0x120e9, 0x15}, ++ {0x130e8, 0x0}, ++ {0x130e9, 0x15}, ++ {0x10001, 0x0}, ++ {0x11001, 0x0}, ++ {0x12001, 0x0}, ++ {0x13001, 0x0}, ++ {0x20012, 0xa1a1}, ++ {0x20017, 0x40}, ++ {0x2000a, 0x40}, ++ {0x20186, 0xa1}, ++ {0x20187, 0x40}, ++ {0x20010, 0x0}, ++ {0x20011, 0xf}, ++ {0x9080b, 0xf}, ++ {0x9080c, 0xf}, ++ {0x100a5, 0x1}, ++ {0x110a5, 0x1}, ++ {0x120a5, 0x1}, ++ {0x130a5, 0x1}, ++ {0x10014, 0x3232}, ++ {0x11014, 0x3232}, ++ {0x12014, 0x3232}, ++ {0x13014, 0x3232}, ++ {0x1000f, 0x1086}, ++ {0x1100f, 0x1086}, ++ {0x1200f, 0x1086}, ++ {0x1300f, 0x1086}, ++ {0x20035, 0x100c}, ++ {0x20036, 0x100c}, ++ {0x20037, 0x41c}, ++ {0x20037, 0x45c}, ++ {0x20038, 0x1920}, ++ {0x20039, 0x101c}, ++ {0x2003a, 0x101c}, ++ {0x2003b, 0x42c}, ++ {0x2003c, 0x2d30}, ++ {0x2003d, 0x1004}, ++ {0x2003e, 0x1004}, ++ {0x2003f, 0x414}, ++ {0x20040, 0x1118}, ++ {0x2002c, 0x843}, ++ {0x2002d, 0x843}, ++ {0x20030, 0x843}, ++ {0x2002e, 0x81f}, ++ {0x2002f, 0x81f}, ++ {0x2000c, 0x0}, ++ {0x2001b, 0x0}, ++ {0x10007, 0x0}, ++ {0x11007, 0x0}, ++ {0x12007, 0x0}, ++ {0x13007, 0x0}, ++ {0xc0080, 0x3}, ++}; ++ ++/* P0 message block parameter for training firmware */ ++static struct ddrphy_cfg_param ddr_phy_msgh_fsp0_cfg[] = { ++ {0x58000, 0x4000}, ++ {0x58002, 0x30}, ++ {0x58003, 0x1900}, ++ {0x58004, 0x4}, ++ {0x58005, 0x4}, ++ {0x58008, 0x17df}, ++ {0x58009, 0xc8}, ++ {0x5800b, 0x2}, ++ {0x5800d, 0x100}, ++ {0x5800e, 0xf}, ++ {0x58012, 0x310}, ++ {0x5801f, 0x1000}, ++ {0x58020, 0x3}, ++ {0x5802d, 0xb0b0}, ++ {0x5802e, 0xb0b0}, ++ {0x5802f, 0xbbbb}, ++ {0x58030, 0xbbbb}, ++ {0x58031, 0x606}, ++ {0x58032, 0x606}, ++ {0x58033, 0x5454}, ++ {0x58034, 0x5454}, ++ {0x58035, 0x4646}, ++ {0x58036, 0x4646}, ++ {0x58037, 0x2d2d}, ++ {0x58038, 0x2d2d}, ++ {0x58039, 0x8080}, ++ {0x5803a, 0x8080}, ++ {0x5803b, 0x1c1c}, ++ {0x5803c, 0x1c1c}, ++ {0x5803d, 0x1c1c}, ++ {0x5803e, 0x1c1c}, ++ {0x58041, 0xac84}, ++ {0x58042, 0xac84}, ++ {0x58043, 0x1b1b}, ++ {0x58044, 0x1b1b}, ++ {0x58045, 0x1010}, ++ {0x58046, 0x1010}, ++ {0x58047, 0x202}, ++ {0x58048, 0x202}, ++ {0x5804f, 0x8080}, ++ {0x58050, 0x8080}, ++ {0x58055, 0x404}, ++ {0x58056, 0x404}, ++ {0x58074, 0x2e}, ++ {0x58075, 0x50}, ++ {0x58080, 0x1}, ++ {0x58081, 0x4b00}, ++ {0x58082, 0x43}, ++}; ++ ++/* DRAM PHY init engine image for Pstate 0 */ ++static struct ddrphy_cfg_param ddr_phy_pie_fsp0_cfg[] = { ++ {0x908f0, 0x65}, ++ {0x908f1, 0x258}, ++ {0x908f2, 0x0}, ++ {0x908f3, 0x58}, ++ {0x908f4, 0x14}, ++ {0x908f5, 0x0}, ++ {0x908f6, 0xb0}, ++ {0x908f7, 0x0}, ++ {0x41008, 0xc9d8}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0xc808}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x2b00}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0xc958}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0xcd88}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x2b00}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0xc0d8}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0xd848}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x2b00}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0xc158}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0xddc8}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x2b00}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0xc1d8}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0xc308}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x2b00}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0xc558}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0xea08}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x2b00}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0xc5d8}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0xe308}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x2b00}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x48d8}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x4248}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x88d8}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x9648}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x2b00}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0xca58}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0xc108}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x2b00}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0xcb58}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0xc008}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x2b00}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0xd4d8}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0xc008}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0x20015, 0x0}, ++ {0x3004a, 0x0}, ++ {0x3004b, 0x0}, ++ {0x3104a, 0x0}, ++ {0x3104b, 0x0}, ++ {0x2004a, 0x1a3e}, ++ {0x2004b, 0x1a3e}, ++ {0x2004c, 0x2c0f}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x101}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20041, 0x1}, ++ {0x90802, 0x0}, ++ {0x20045, 0x2}, ++ {0x10057, 0x0}, ++ {0x11057, 0x0}, ++ {0x12057, 0x0}, ++ {0x13057, 0x0}, ++ {0x1000f, 0x1087}, ++ {0x1100f, 0x1087}, ++ {0x1200f, 0x1087}, ++ {0x1300f, 0x1087}, ++ {0x90803, 0x4}, ++ {0x90804, 0x82}, ++ {0x90805, 0x1}, ++ {0x90903, 0x0}, ++ {0x9090b, 0x2}, ++ {0x90811, 0x0}, ++ {0x90812, 0xff00}, ++ {0x20072, 0x3}, ++ {0x9080e, 0x3}, ++ {0x20073, 0x3}, ++ {0x9080f, 0x3}, ++}; ++ ++/* DRAM PHY init engine image */ ++static struct ddrphy_cfg_param ddr_phy_pie[] = { ++ {0x41000, 0x0}, ++ {0x41001, 0x0}, ++ {0x41002, 0x0}, ++ {0x41003, 0x0}, ++ {0x41004, 0x0}, ++ {0x41005, 0x0}, ++ {0x41006, 0x0}, ++ {0x41007, 0x0}, ++ {0x41388, 0xc028}, ++ {0x41389, 0x0}, ++ {0x4138a, 0x0}, ++ {0x4138b, 0x10}, ++ {0x4138c, 0x0}, ++ {0x4138d, 0x0}, ++ {0x4138e, 0x0}, ++ {0x4138f, 0x0}, ++ {0x41390, 0x0}, ++ {0x41391, 0x0}, ++ {0x41392, 0x0}, ++ {0x41393, 0x400}, ++ {0x41394, 0x0}, ++ {0x41395, 0x0}, ++ {0x41396, 0x0}, ++ {0x41397, 0x0}, ++ {0x41398, 0x0}, ++ {0x41399, 0x0}, ++ {0x4139a, 0x0}, ++ {0x4139b, 0x0}, ++ {0x4139c, 0x0}, ++ {0x4139d, 0x0}, ++ {0x4139e, 0x0}, ++ {0x4139f, 0x0}, ++ {0x413a0, 0xc858}, ++ {0x413a1, 0x0}, ++ {0x413a2, 0x0}, ++ {0x413a3, 0x10}, ++ {0x413a4, 0xe088}, ++ {0x413a5, 0x0}, ++ {0x413a6, 0x0}, ++ {0x413a7, 0x10}, ++ {0x413a8, 0xe038}, ++ {0x413a9, 0x0}, ++ {0x413aa, 0x0}, ++ {0x413ab, 0x10}, ++ {0x413ac, 0xc858}, ++ {0x413ad, 0x0}, ++ {0x413ae, 0x0}, ++ {0x413af, 0x10}, ++ {0x413b0, 0xc088}, ++ {0x413b1, 0x0}, ++ {0x413b2, 0x0}, ++ {0x413b3, 0x10}, ++ {0x413b4, 0x0}, ++ {0x413b5, 0x0}, ++ {0x413b6, 0x0}, ++ {0x413b7, 0x0}, ++ {0x413b8, 0xc028}, ++ {0x413b9, 0x0}, ++ {0x413ba, 0x0}, ++ {0x413bb, 0x10}, ++ {0x413bc, 0x0}, ++ {0x413bd, 0x0}, ++ {0x413be, 0x0}, ++ {0x413bf, 0x0}, ++ {0x413c0, 0x0}, ++ {0x413c1, 0x0}, ++ {0x413c2, 0x0}, ++ {0x413c3, 0x400}, ++ {0x413c4, 0x0}, ++ {0x413c5, 0x0}, ++ {0x413c6, 0x0}, ++ {0x413c7, 0x0}, ++ {0x413c8, 0x0}, ++ {0x413c9, 0x0}, ++ {0x413ca, 0x0}, ++ {0x413cb, 0x0}, ++ {0x413cc, 0x0}, ++ {0x413cd, 0x0}, ++ {0x413ce, 0x0}, ++ {0x413cf, 0x0}, ++ {0x413d0, 0xc858}, ++ {0x413d1, 0x0}, ++ {0x413d2, 0x0}, ++ {0x413d3, 0x10}, ++ {0x413d4, 0xe208}, ++ {0x413d5, 0x0}, ++ {0x413d6, 0x0}, ++ {0x413d7, 0x10}, ++ {0x413d8, 0xe038}, ++ {0x413d9, 0x0}, ++ {0x413da, 0x0}, ++ {0x413db, 0x10}, ++ {0x413dc, 0xc858}, ++ {0x413dd, 0x0}, ++ {0x413de, 0x0}, ++ {0x413df, 0x10}, ++ {0x413e0, 0xc208}, ++ {0x413e1, 0x0}, ++ {0x413e2, 0x0}, ++ {0x413e3, 0x10}, ++ {0x413e4, 0x0}, ++ {0x413e5, 0x0}, ++ {0x413e6, 0x0}, ++ {0x413e7, 0x0}, ++ {0x413e8, 0xce58}, ++ {0x413e9, 0x0}, ++ {0x413ea, 0x0}, ++ {0x413eb, 0x10}, ++ {0x413ec, 0xc208}, ++ {0x413ed, 0x0}, ++ {0x413ee, 0x0}, ++ {0x413ef, 0x10}, ++ {0x413f0, 0x0}, ++ {0x413f1, 0x0}, ++ {0x413f2, 0x0}, ++ {0x413f3, 0x0}, ++ {0x413f4, 0x0}, ++ {0x413f5, 0x0}, ++ {0x413f6, 0x0}, ++ {0x413f7, 0x0}, ++ {0x413f8, 0xc370}, ++ {0x413f9, 0x0}, ++ {0x413fa, 0x0}, ++ {0x413fb, 0x10}, ++ {0x413fc, 0x0}, ++ {0x413fd, 0x0}, ++ {0x413fe, 0x0}, ++ {0x413ff, 0x0}, ++ {0x41400, 0xc040}, ++ {0x41401, 0x0}, ++ {0x41402, 0x0}, ++ {0x41403, 0x10}, ++ {0x41404, 0x0}, ++ {0x41405, 0x0}, ++ {0x41406, 0x0}, ++ {0x41407, 0x10}, ++ {0x41408, 0xd2d8}, ++ {0x41409, 0x0}, ++ {0x4140a, 0x0}, ++ {0x4140b, 0x10}, ++ {0x4140c, 0xe008}, ++ {0x4140d, 0x0}, ++ {0x4140e, 0x0}, ++ {0x4140f, 0x10}, ++ {0x41410, 0x0}, ++ {0x41411, 0x0}, ++ {0x41412, 0x0}, ++ {0x41413, 0x5b00}, ++ {0x41414, 0x0}, ++ {0x41415, 0x0}, ++ {0x41416, 0x0}, ++ {0x41417, 0x0}, ++ {0x41418, 0xc0f0}, ++ {0x41419, 0x0}, ++ {0x4141a, 0x0}, ++ {0x4141b, 0x10}, ++ {0x4141c, 0x0}, ++ {0x4141d, 0x0}, ++ {0x4141e, 0x0}, ++ {0x4141f, 0x0}, ++ {0x41420, 0xcfd8}, ++ {0x41421, 0x0}, ++ {0x41422, 0x0}, ++ {0x41423, 0x10}, ++ {0x41424, 0xc008}, ++ {0x41425, 0x0}, ++ {0x41426, 0x0}, ++ {0x41427, 0x10}, ++ {0x41428, 0x0}, ++ {0x41429, 0x0}, ++ {0x4142a, 0x0}, ++ {0x4142b, 0x2b00}, ++ {0x4142c, 0x0}, ++ {0x4142d, 0x0}, ++ {0x4142e, 0x0}, ++ {0x4142f, 0x0}, ++ {0x41430, 0xd058}, ++ {0x41431, 0x0}, ++ {0x41432, 0x0}, ++ {0x41433, 0x10}, ++ {0x41434, 0xc008}, ++ {0x41435, 0x0}, ++ {0x41436, 0x0}, ++ {0x41437, 0x10}, ++ {0x41438, 0x0}, ++ {0x41439, 0x0}, ++ {0x4143a, 0x0}, ++ {0x4143b, 0x2b00}, ++ {0x4143c, 0x0}, ++ {0x4143d, 0x0}, ++ {0x4143e, 0x0}, ++ {0x4143f, 0x0}, ++ {0x41440, 0xd0d8}, ++ {0x41441, 0x0}, ++ {0x41442, 0x0}, ++ {0x41443, 0x10}, ++ {0x41444, 0xc088}, ++ {0x41445, 0x0}, ++ {0x41446, 0x0}, ++ {0x41447, 0x10}, ++ {0x41448, 0x0}, ++ {0x41449, 0x0}, ++ {0x4144a, 0x0}, ++ {0x4144b, 0x2b00}, ++ {0x4144c, 0x0}, ++ {0x4144d, 0x0}, ++ {0x4144e, 0x0}, ++ {0x4144f, 0x0}, ++ {0x41450, 0xd158}, ++ {0x41451, 0x0}, ++ {0x41452, 0x0}, ++ {0x41453, 0x10}, ++ {0x41454, 0xc008}, ++ {0x41455, 0x0}, ++ {0x41456, 0x0}, ++ {0x41457, 0x10}, ++ {0x41458, 0x0}, ++ {0x41459, 0x0}, ++ {0x4145a, 0x0}, ++ {0x4145b, 0x5b00}, ++ {0x4145c, 0x0}, ++ {0x4145d, 0x0}, ++ {0x4145e, 0x0}, ++ {0x4145f, 0x0}, ++ {0x41460, 0x402c}, ++ {0x41461, 0xd00}, ++ {0x41462, 0x1}, ++ {0x41463, 0x400}, ++ {0x41464, 0x4050}, ++ {0x41465, 0x800}, ++ {0x41466, 0x0}, ++ {0x41467, 0x0}, ++ {0x41468, 0x0}, ++ {0x41469, 0x0}, ++ {0x4146a, 0x0}, ++ {0x4146b, 0x400}, ++ {0x4146c, 0x0}, ++ {0x4146d, 0x0}, ++ {0x4146e, 0x0}, ++ {0x4146f, 0x0}, ++ {0x41470, 0x0}, ++ {0x41471, 0x0}, ++ {0x41472, 0x0}, ++ {0x41473, 0x400}, ++ {0x41474, 0x4050}, ++ {0x41475, 0x803}, ++ {0x41476, 0x0}, ++ {0x41477, 0x0}, ++ {0x41478, 0x0}, ++ {0x41479, 0x0}, ++ {0x4147a, 0x0}, ++ {0x4147b, 0x7f00}, ++ {0x4147c, 0x0}, ++ {0x4147d, 0x0}, ++ {0x4147e, 0x0}, ++ {0x4147f, 0x400}, ++ {0x41480, 0x407c}, ++ {0x41481, 0x0}, ++ {0x41482, 0x0}, ++ {0x41483, 0x400}, ++ {0x41484, 0x0}, ++ {0x41485, 0x0}, ++ {0x41486, 0x0}, ++ {0x41487, 0x0}, ++ {0x41488, 0x0}, ++ {0x41489, 0x0}, ++ {0x4148a, 0x0}, ++ {0x4148b, 0x400}, ++ {0x4148c, 0x0}, ++ {0x4148d, 0x0}, ++ {0x4148e, 0x1}, ++ {0x4148f, 0x0}, ++ {0x41490, 0x0}, ++ {0x41491, 0x0}, ++ {0x41492, 0x0}, ++ {0x41493, 0x400}, ++ {0x41494, 0x0}, ++ {0x41495, 0x0}, ++ {0x41496, 0x0}, ++ {0x41497, 0x0}, ++ {0x41498, 0x0}, ++ {0x41499, 0x0}, ++ {0x4149a, 0x0}, ++ {0x4149b, 0x0}, ++ {0x4149c, 0x0}, ++ {0x4149d, 0x0}, ++ {0x4149e, 0x0}, ++ {0x4149f, 0x0}, ++ {0x414a0, 0x802c}, ++ {0x414a1, 0xd00}, ++ {0x414a2, 0x1}, ++ {0x414a3, 0x410}, ++ {0x414a4, 0x8050}, ++ {0x414a5, 0x800}, ++ {0x414a6, 0x0}, ++ {0x414a7, 0x10}, ++ {0x414a8, 0x0}, ++ {0x414a9, 0x0}, ++ {0x414aa, 0x0}, ++ {0x414ab, 0x400}, ++ {0x414ac, 0x0}, ++ {0x414ad, 0x0}, ++ {0x414ae, 0x0}, ++ {0x414af, 0x0}, ++ {0x414b0, 0x0}, ++ {0x414b1, 0x0}, ++ {0x414b2, 0x0}, ++ {0x414b3, 0x400}, ++ {0x414b4, 0x8050}, ++ {0x414b5, 0x803}, ++ {0x414b6, 0x0}, ++ {0x414b7, 0x10}, ++ {0x414b8, 0x0}, ++ {0x414b9, 0x0}, ++ {0x414ba, 0x0}, ++ {0x414bb, 0x7f00}, ++ {0x414bc, 0x0}, ++ {0x414bd, 0x0}, ++ {0x414be, 0x0}, ++ {0x414bf, 0x400}, ++ {0x414c0, 0x807c}, ++ {0x414c1, 0x0}, ++ {0x414c2, 0x0}, ++ {0x414c3, 0x410}, ++ {0x414c4, 0x0}, ++ {0x414c5, 0x0}, ++ {0x414c6, 0x0}, ++ {0x414c7, 0x0}, ++ {0x414c8, 0x0}, ++ {0x414c9, 0x0}, ++ {0x414ca, 0x0}, ++ {0x414cb, 0x400}, ++ {0x414cc, 0x0}, ++ {0x414cd, 0x0}, ++ {0x414ce, 0x1}, ++ {0x414cf, 0x0}, ++ {0x414d0, 0x0}, ++ {0x414d1, 0x0}, ++ {0x414d2, 0x0}, ++ {0x414d3, 0x400}, ++ {0x414d4, 0x0}, ++ {0x414d5, 0x0}, ++ {0x414d6, 0x0}, ++ {0x414d7, 0x0}, ++ {0x414d8, 0x0}, ++ {0x414d9, 0x0}, ++ {0x414da, 0x0}, ++ {0x414db, 0x0}, ++ {0x414dc, 0x0}, ++ {0x414dd, 0x0}, ++ {0x414de, 0x0}, ++ {0x414df, 0x0}, ++ {0x414e0, 0x402c}, ++ {0x414e1, 0xd00}, ++ {0x414e2, 0x1}, ++ {0x414e3, 0x0}, ++ {0x414e4, 0x4050}, ++ {0x414e5, 0x800}, ++ {0x414e6, 0x0}, ++ {0x414e7, 0x0}, ++ {0x414e8, 0x0}, ++ {0x414e9, 0x0}, ++ {0x414ea, 0x0}, ++ {0x414eb, 0x0}, ++ {0x414ec, 0x0}, ++ {0x414ed, 0x0}, ++ {0x414ee, 0x0}, ++ {0x414ef, 0x0}, ++ {0x414f0, 0x0}, ++ {0x414f1, 0x0}, ++ {0x414f2, 0x0}, ++ {0x414f3, 0x0}, ++ {0x414f4, 0x4050}, ++ {0x414f5, 0x803}, ++ {0x414f6, 0x0}, ++ {0x414f7, 0x0}, ++ {0x414f8, 0x0}, ++ {0x414f9, 0x0}, ++ {0x414fa, 0x0}, ++ {0x414fb, 0x0}, ++ {0x414fc, 0x0}, ++ {0x414fd, 0x0}, ++ {0x414fe, 0x0}, ++ {0x414ff, 0x0}, ++ {0x41500, 0x0}, ++ {0x41501, 0x0}, ++ {0x41502, 0x0}, ++ {0x41503, 0x0}, ++ {0x41504, 0x4050}, ++ {0x41505, 0x800}, ++ {0x41506, 0x0}, ++ {0x41507, 0x0}, ++ {0x41508, 0x0}, ++ {0x41509, 0x0}, ++ {0x4150a, 0x0}, ++ {0x4150b, 0x6b00}, ++ {0x4150c, 0x0}, ++ {0x4150d, 0x0}, ++ {0x4150e, 0x0}, ++ {0x4150f, 0x400}, ++ {0x41510, 0x0}, ++ {0x41511, 0x0}, ++ {0x41512, 0x0}, ++ {0x41513, 0x0}, ++ {0x41514, 0x407c}, ++ {0x41515, 0x0}, ++ {0x41516, 0x0}, ++ {0x41517, 0x0}, ++ {0x41518, 0x0}, ++ {0x41519, 0x0}, ++ {0x4151a, 0x0}, ++ {0x4151b, 0x0}, ++ {0x4151c, 0x0}, ++ {0x4151d, 0x0}, ++ {0x4151e, 0x0}, ++ {0x4151f, 0x0}, ++ {0x41520, 0x0}, ++ {0x41521, 0x0}, ++ {0x41522, 0x1}, ++ {0x41523, 0x0}, ++ {0x41524, 0x0}, ++ {0x41525, 0x0}, ++ {0x41526, 0x0}, ++ {0x41527, 0x0}, ++ {0x41528, 0x0}, ++ {0x41529, 0x0}, ++ {0x4152a, 0x0}, ++ {0x4152b, 0x4b00}, ++ {0x4152c, 0x0}, ++ {0x4152d, 0x0}, ++ {0x4152e, 0x0}, ++ {0x4152f, 0x1800}, ++ {0x41530, 0x0}, ++ {0x41531, 0x0}, ++ {0x41532, 0x0}, ++ {0x41533, 0x0}, ++ {0x41534, 0x802c}, ++ {0x41535, 0xd00}, ++ {0x41536, 0x1}, ++ {0x41537, 0x10}, ++ {0x41538, 0x8050}, ++ {0x41539, 0x800}, ++ {0x4153a, 0x0}, ++ {0x4153b, 0x10}, ++ {0x4153c, 0x0}, ++ {0x4153d, 0x0}, ++ {0x4153e, 0x0}, ++ {0x4153f, 0x0}, ++ {0x41540, 0x0}, ++ {0x41541, 0x0}, ++ {0x41542, 0x0}, ++ {0x41543, 0x0}, ++ {0x41544, 0x0}, ++ {0x41545, 0x0}, ++ {0x41546, 0x0}, ++ {0x41547, 0x0}, ++ {0x41548, 0x8050}, ++ {0x41549, 0x803}, ++ {0x4154a, 0x0}, ++ {0x4154b, 0x10}, ++ {0x4154c, 0x0}, ++ {0x4154d, 0x0}, ++ {0x4154e, 0x0}, ++ {0x4154f, 0x0}, ++ {0x41550, 0x0}, ++ {0x41551, 0x0}, ++ {0x41552, 0x0}, ++ {0x41553, 0x0}, ++ {0x41554, 0x0}, ++ {0x41555, 0x0}, ++ {0x41556, 0x0}, ++ {0x41557, 0x0}, ++ {0x41558, 0x8050}, ++ {0x41559, 0x800}, ++ {0x4155a, 0x0}, ++ {0x4155b, 0x10}, ++ {0x4155c, 0x0}, ++ {0x4155d, 0x0}, ++ {0x4155e, 0x0}, ++ {0x4155f, 0x0}, ++ {0x41560, 0x0}, ++ {0x41561, 0x0}, ++ {0x41562, 0x0}, ++ {0x41563, 0x6b00}, ++ {0x41564, 0x0}, ++ {0x41565, 0x0}, ++ {0x41566, 0x0}, ++ {0x41567, 0x400}, ++ {0x41568, 0x807c}, ++ {0x41569, 0x0}, ++ {0x4156a, 0x0}, ++ {0x4156b, 0x10}, ++ {0x4156c, 0x0}, ++ {0x4156d, 0x0}, ++ {0x4156e, 0x0}, ++ {0x4156f, 0x0}, ++ {0x41570, 0x0}, ++ {0x41571, 0x0}, ++ {0x41572, 0x0}, ++ {0x41573, 0x0}, ++ {0x41574, 0x0}, ++ {0x41575, 0x0}, ++ {0x41576, 0x1}, ++ {0x41577, 0x0}, ++ {0x41578, 0x0}, ++ {0x41579, 0x0}, ++ {0x4157a, 0x0}, ++ {0x4157b, 0x7b00}, ++ {0x4157c, 0x0}, ++ {0x4157d, 0x0}, ++ {0x4157e, 0x0}, ++ {0x4157f, 0x2000}, ++ {0x41580, 0x402c}, ++ {0x41581, 0xd00}, ++ {0x41582, 0x1}, ++ {0x41583, 0x0}, ++ {0x41584, 0x5198}, ++ {0x41585, 0x803}, ++ {0x41586, 0x0}, ++ {0x41587, 0x0}, ++ {0x41588, 0x0}, ++ {0x41589, 0x0}, ++ {0x4158a, 0x0}, ++ {0x4158b, 0x3b00}, ++ {0x4158c, 0x0}, ++ {0x4158d, 0x0}, ++ {0x4158e, 0x0}, ++ {0x4158f, 0x0}, ++ {0x41590, 0x5218}, ++ {0x41591, 0x803}, ++ {0x41592, 0x0}, ++ {0x41593, 0x0}, ++ {0x41594, 0x0}, ++ {0x41595, 0x0}, ++ {0x41596, 0x0}, ++ {0x41597, 0x0}, ++ {0x41598, 0x0}, ++ {0x41599, 0x0}, ++ {0x4159a, 0x0}, ++ {0x4159b, 0x6b00}, ++ {0x4159c, 0x0}, ++ {0x4159d, 0x0}, ++ {0x4159e, 0x0}, ++ {0x4159f, 0x400}, ++ {0x415a0, 0x407c}, ++ {0x415a1, 0x0}, ++ {0x415a2, 0x0}, ++ {0x415a3, 0x0}, ++ {0x415a4, 0x0}, ++ {0x415a5, 0x0}, ++ {0x415a6, 0x0}, ++ {0x415a7, 0x0}, ++ {0x415a8, 0x0}, ++ {0x415a9, 0x0}, ++ {0x415aa, 0x0}, ++ {0x415ab, 0x0}, ++ {0x415ac, 0x0}, ++ {0x415ad, 0x0}, ++ {0x415ae, 0x1}, ++ {0x415af, 0x0}, ++ {0x415b0, 0x0}, ++ {0x415b1, 0x0}, ++ {0x415b2, 0x0}, ++ {0x415b3, 0x1b00}, ++ {0x415b4, 0x0}, ++ {0x415b5, 0x0}, ++ {0x415b6, 0x0}, ++ {0x415b7, 0x0}, ++ {0x415b8, 0x0}, ++ {0x415b9, 0x0}, ++ {0x415ba, 0x0}, ++ {0x415bb, 0x0}, ++ {0x415bc, 0x802c}, ++ {0x415bd, 0xd00}, ++ {0x415be, 0x1}, ++ {0x415bf, 0x10}, ++ {0x415c0, 0x9198}, ++ {0x415c1, 0x803}, ++ {0x415c2, 0x0}, ++ {0x415c3, 0x10}, ++ {0x415c4, 0x0}, ++ {0x415c5, 0x0}, ++ {0x415c6, 0x0}, ++ {0x415c7, 0x0}, ++ {0x415c8, 0x0}, ++ {0x415c9, 0x0}, ++ {0x415ca, 0x0}, ++ {0x415cb, 0x2b00}, ++ {0x415cc, 0x0}, ++ {0x415cd, 0x0}, ++ {0x415ce, 0x0}, ++ {0x415cf, 0x0}, ++ {0x415d0, 0x0}, ++ {0x415d1, 0x0}, ++ {0x415d2, 0x0}, ++ {0x415d3, 0x0}, ++ {0x415d4, 0x9218}, ++ {0x415d5, 0x803}, ++ {0x415d6, 0x0}, ++ {0x415d7, 0x10}, ++ {0x415d8, 0x0}, ++ {0x415d9, 0x0}, ++ {0x415da, 0x0}, ++ {0x415db, 0x6b00}, ++ {0x415dc, 0x0}, ++ {0x415dd, 0x0}, ++ {0x415de, 0x0}, ++ {0x415df, 0x400}, ++ {0x415e0, 0x0}, ++ {0x415e1, 0x0}, ++ {0x415e2, 0x0}, ++ {0x415e3, 0x0}, ++ {0x415e4, 0x807c}, ++ {0x415e5, 0x0}, ++ {0x415e6, 0x0}, ++ {0x415e7, 0x10}, ++ {0x415e8, 0x0}, ++ {0x415e9, 0x0}, ++ {0x415ea, 0x0}, ++ {0x415eb, 0x0}, ++ {0x415ec, 0x0}, ++ {0x415ed, 0x0}, ++ {0x415ee, 0x0}, ++ {0x415ef, 0x0}, ++ {0x415f0, 0x0}, ++ {0x415f1, 0x0}, ++ {0x415f2, 0x1}, ++ {0x415f3, 0x0}, ++ {0x415f4, 0x0}, ++ {0x415f5, 0x0}, ++ {0x415f6, 0x0}, ++ {0x415f7, 0x0}, ++ {0x415f8, 0x0}, ++ {0x415f9, 0x0}, ++ {0x415fa, 0x0}, ++ {0x415fb, 0xb00}, ++ {0x415fc, 0x0}, ++ {0x415fd, 0x0}, ++ {0x415fe, 0x0}, ++ {0x415ff, 0x400}, ++ {0x41600, 0x0}, ++ {0x41601, 0x0}, ++ {0x41602, 0x0}, ++ {0x41603, 0x0}, ++ {0x41604, 0x0}, ++ {0x41605, 0x0}, ++ {0x41606, 0x0}, ++ {0x41607, 0x0}, ++ {0x41608, 0x401c}, ++ {0x41609, 0xd0}, ++ {0x4160a, 0x1}, ++ {0x4160b, 0x0}, ++ {0x4160c, 0x4060}, ++ {0x4160d, 0x84}, ++ {0x4160e, 0x0}, ++ {0x4160f, 0x0}, ++ {0x41610, 0x0}, ++ {0x41611, 0x0}, ++ {0x41612, 0x0}, ++ {0x41613, 0xb00}, ++ {0x41614, 0x0}, ++ {0x41615, 0x0}, ++ {0x41616, 0x0}, ++ {0x41617, 0x800}, ++ {0x41618, 0x407c}, ++ {0x41619, 0x0}, ++ {0x4161a, 0x0}, ++ {0x4161b, 0x0}, ++ {0x4161c, 0x0}, ++ {0x4161d, 0x0}, ++ {0x4161e, 0x0}, ++ {0x4161f, 0x0}, ++ {0x41620, 0x0}, ++ {0x41621, 0x0}, ++ {0x41622, 0x0}, ++ {0x41623, 0x0}, ++ {0x41624, 0x4000}, ++ {0x41625, 0x0}, ++ {0x41626, 0x1}, ++ {0x41627, 0x0}, ++ {0x41628, 0x0}, ++ {0x41629, 0x0}, ++ {0x4162a, 0x0}, ++ {0x4162b, 0x0}, ++ {0x4162c, 0x402c}, ++ {0x4162d, 0xd00}, ++ {0x4162e, 0x1}, ++ {0x4162f, 0x0}, ++ {0x41630, 0x4020}, ++ {0x41631, 0x803}, ++ {0x41632, 0x0}, ++ {0x41633, 0x0}, ++ {0x41634, 0x0}, ++ {0x41635, 0x0}, ++ {0x41636, 0x0}, ++ {0x41637, 0x0}, ++ {0x41638, 0x0}, ++ {0x41639, 0x0}, ++ {0x4163a, 0x0}, ++ {0x4163b, 0x2b00}, ++ {0x4163c, 0x0}, ++ {0x4163d, 0x0}, ++ {0x4163e, 0x0}, ++ {0x4163f, 0x800}, ++ {0x41640, 0x0}, ++ {0x41641, 0x0}, ++ {0x41642, 0x0}, ++ {0x41643, 0x0}, ++ {0x41644, 0x407c}, ++ {0x41645, 0x0}, ++ {0x41646, 0x0}, ++ {0x41647, 0x0}, ++ {0x41648, 0x0}, ++ {0x41649, 0x0}, ++ {0x4164a, 0x0}, ++ {0x4164b, 0x0}, ++ {0x4164c, 0x0}, ++ {0x4164d, 0x0}, ++ {0x4164e, 0x0}, ++ {0x4164f, 0x0}, ++ {0x41650, 0x0}, ++ {0x41651, 0x0}, ++ {0x41652, 0x1}, ++ {0x41653, 0x0}, ++ {0x41654, 0x0}, ++ {0x41655, 0x0}, ++ {0x41656, 0x0}, ++ {0x41657, 0x0}, ++ {0x41658, 0x801c}, ++ {0x41659, 0xd0}, ++ {0x4165a, 0x1}, ++ {0x4165b, 0x10}, ++ {0x4165c, 0x8060}, ++ {0x4165d, 0x84}, ++ {0x4165e, 0x0}, ++ {0x4165f, 0x10}, ++ {0x41660, 0x0}, ++ {0x41661, 0x0}, ++ {0x41662, 0x0}, ++ {0x41663, 0xb00}, ++ {0x41664, 0x0}, ++ {0x41665, 0x0}, ++ {0x41666, 0x0}, ++ {0x41667, 0x800}, ++ {0x41668, 0x807c}, ++ {0x41669, 0x0}, ++ {0x4166a, 0x0}, ++ {0x4166b, 0x10}, ++ {0x4166c, 0x0}, ++ {0x4166d, 0x0}, ++ {0x4166e, 0x0}, ++ {0x4166f, 0x0}, ++ {0x41670, 0x0}, ++ {0x41671, 0x0}, ++ {0x41672, 0x0}, ++ {0x41673, 0x0}, ++ {0x41674, 0x8000}, ++ {0x41675, 0x0}, ++ {0x41676, 0x1}, ++ {0x41677, 0x10}, ++ {0x41678, 0x0}, ++ {0x41679, 0x0}, ++ {0x4167a, 0x0}, ++ {0x4167b, 0x0}, ++ {0x4167c, 0x802c}, ++ {0x4167d, 0xd00}, ++ {0x4167e, 0x1}, ++ {0x4167f, 0x10}, ++ {0x41680, 0x8020}, ++ {0x41681, 0x803}, ++ {0x41682, 0x0}, ++ {0x41683, 0x10}, ++ {0x41684, 0x0}, ++ {0x41685, 0x0}, ++ {0x41686, 0x0}, ++ {0x41687, 0x0}, ++ {0x41688, 0x0}, ++ {0x41689, 0x0}, ++ {0x4168a, 0x0}, ++ {0x4168b, 0x2b00}, ++ {0x4168c, 0x0}, ++ {0x4168d, 0x0}, ++ {0x4168e, 0x0}, ++ {0x4168f, 0x800}, ++ {0x41690, 0x0}, ++ {0x41691, 0x0}, ++ {0x41692, 0x0}, ++ {0x41693, 0x0}, ++ {0x41694, 0x807c}, ++ {0x41695, 0x0}, ++ {0x41696, 0x0}, ++ {0x41697, 0x10}, ++ {0x41698, 0x0}, ++ {0x41699, 0x0}, ++ {0x4169a, 0x0}, ++ {0x4169b, 0x0}, ++ {0x4169c, 0x0}, ++ {0x4169d, 0x0}, ++ {0x4169e, 0x0}, ++ {0x4169f, 0x0}, ++ {0x416a0, 0x0}, ++ {0x416a1, 0x0}, ++ {0x416a2, 0x1}, ++ {0x416a3, 0x0}, ++ {0x416a4, 0x0}, ++ {0x416a5, 0x0}, ++ {0x416a6, 0x0}, ++ {0x416a7, 0x0}, ++ {0x416a8, 0x402c}, ++ {0x416a9, 0xd00}, ++ {0x416aa, 0x1}, ++ {0x416ab, 0x0}, ++ {0x416ac, 0x4050}, ++ {0x416ad, 0x803}, ++ {0x416ae, 0x0}, ++ {0x416af, 0x0}, ++ {0x416b0, 0x0}, ++ {0x416b1, 0x0}, ++ {0x416b2, 0x0}, ++ {0x416b3, 0x1b00}, ++ {0x416b4, 0x0}, ++ {0x416b5, 0x0}, ++ {0x416b6, 0x0}, ++ {0x416b7, 0x0}, ++ {0x416b8, 0x0}, ++ {0x416b9, 0x0}, ++ {0x416ba, 0x0}, ++ {0x416bb, 0x0}, ++ {0x416bc, 0x0}, ++ {0x416bd, 0x0}, ++ {0x416be, 0x0}, ++ {0x416bf, 0x0}, ++ {0x416c0, 0x4050}, ++ {0x416c1, 0x803}, ++ {0x416c2, 0x0}, ++ {0x416c3, 0x5a00}, ++ {0x416c4, 0x0}, ++ {0x416c5, 0x0}, ++ {0x416c6, 0x0}, ++ {0x416c7, 0x0}, ++ {0x416c8, 0x0}, ++ {0x416c9, 0x0}, ++ {0x416ca, 0x0}, ++ {0x416cb, 0x0}, ++ {0x416cc, 0x0}, ++ {0x416cd, 0x0}, ++ {0x416ce, 0x0}, ++ {0x416cf, 0x0}, ++ {0x416d0, 0x0}, ++ {0x416d1, 0x0}, ++ {0x416d2, 0x0}, ++ {0x416d3, 0x100}, ++ {0x416d4, 0x0}, ++ {0x416d5, 0x0}, ++ {0x416d6, 0x0}, ++ {0x416d7, 0x0}, ++ {0x416d8, 0x4050}, ++ {0x416d9, 0x803}, ++ {0x416da, 0x0}, ++ {0x416db, 0x0}, ++ {0x416dc, 0x0}, ++ {0x416dd, 0x0}, ++ {0x416de, 0x0}, ++ {0x416df, 0x0}, ++ {0x416e0, 0x0}, ++ {0x416e1, 0x0}, ++ {0x416e2, 0x0}, ++ {0x416e3, 0x6b00}, ++ {0x416e4, 0x0}, ++ {0x416e5, 0x0}, ++ {0x416e6, 0x0}, ++ {0x416e7, 0x400}, ++ {0x416e8, 0x407c}, ++ {0x416e9, 0x0}, ++ {0x416ea, 0x0}, ++ {0x416eb, 0x0}, ++ {0x416ec, 0x0}, ++ {0x416ed, 0x0}, ++ {0x416ee, 0x0}, ++ {0x416ef, 0x0}, ++ {0x416f0, 0x0}, ++ {0x416f1, 0x0}, ++ {0x416f2, 0x0}, ++ {0x416f3, 0x3b00}, ++ {0x416f4, 0x0}, ++ {0x416f5, 0x0}, ++ {0x416f6, 0x0}, ++ {0x416f7, 0x0}, ++ {0x416f8, 0x0}, ++ {0x416f9, 0x0}, ++ {0x416fa, 0x0}, ++ {0x416fb, 0x0}, ++ {0x416fc, 0x0}, ++ {0x416fd, 0x0}, ++ {0x416fe, 0x1}, ++ {0x416ff, 0x0}, ++ {0x41700, 0x5758}, ++ {0x41701, 0x0}, ++ {0x41702, 0x0}, ++ {0x41703, 0x0}, ++ {0x41704, 0x4208}, ++ {0x41705, 0x0}, ++ {0x41706, 0x0}, ++ {0x41707, 0x0}, ++ {0x41708, 0x0}, ++ {0x41709, 0x0}, ++ {0x4170a, 0x0}, ++ {0x4170b, 0x4b00}, ++ {0x4170c, 0x0}, ++ {0x4170d, 0x0}, ++ {0x4170e, 0x0}, ++ {0x4170f, 0x0}, ++ {0x41710, 0x0}, ++ {0x41711, 0x0}, ++ {0x41712, 0x0}, ++ {0x41713, 0x0}, ++ {0x41714, 0x401c}, ++ {0x41715, 0xd0}, ++ {0x41716, 0x1}, ++ {0x41717, 0x0}, ++ {0x41718, 0x4060}, ++ {0x41719, 0x84}, ++ {0x4171a, 0x0}, ++ {0x4171b, 0x0}, ++ {0x4171c, 0x0}, ++ {0x4171d, 0x0}, ++ {0x4171e, 0x0}, ++ {0x4171f, 0x0}, ++ {0x41720, 0x0}, ++ {0x41721, 0x0}, ++ {0x41722, 0x0}, ++ {0x41723, 0x7b00}, ++ {0x41724, 0x0}, ++ {0x41725, 0x0}, ++ {0x41726, 0x0}, ++ {0x41727, 0x0}, ++ {0x41728, 0x407c}, ++ {0x41729, 0x0}, ++ {0x4172a, 0x0}, ++ {0x4172b, 0x0}, ++ {0x4172c, 0x0}, ++ {0x4172d, 0x0}, ++ {0x4172e, 0x0}, ++ {0x4172f, 0x0}, ++ {0x41730, 0x0}, ++ {0x41731, 0x0}, ++ {0x41732, 0x0}, ++ {0x41733, 0x0}, ++ {0x41734, 0x4000}, ++ {0x41735, 0x0}, ++ {0x41736, 0x1}, ++ {0x41737, 0x0}, ++ {0x41738, 0x0}, ++ {0x41739, 0x0}, ++ {0x4173a, 0x0}, ++ {0x4173b, 0x0}, ++ {0x4173c, 0x402c}, ++ {0x4173d, 0xd00}, ++ {0x4173e, 0x1}, ++ {0x4173f, 0x0}, ++ {0x41740, 0x4020}, ++ {0x41741, 0x803}, ++ {0x41742, 0x0}, ++ {0x41743, 0x0}, ++ {0x41744, 0x0}, ++ {0x41745, 0x0}, ++ {0x41746, 0x0}, ++ {0x41747, 0x0}, ++ {0x41748, 0x0}, ++ {0x41749, 0x0}, ++ {0x4174a, 0x0}, ++ {0x4174b, 0x2b00}, ++ {0x4174c, 0x0}, ++ {0x4174d, 0x0}, ++ {0x4174e, 0x0}, ++ {0x4174f, 0x800}, ++ {0x41750, 0x0}, ++ {0x41751, 0x0}, ++ {0x41752, 0x0}, ++ {0x41753, 0x0}, ++ {0x41754, 0x407c}, ++ {0x41755, 0x0}, ++ {0x41756, 0x0}, ++ {0x41757, 0x0}, ++ {0x41758, 0x0}, ++ {0x41759, 0x0}, ++ {0x4175a, 0x0}, ++ {0x4175b, 0x0}, ++ {0x4175c, 0x0}, ++ {0x4175d, 0x0}, ++ {0x4175e, 0x0}, ++ {0x4175f, 0x0}, ++ {0x41760, 0x4000}, ++ {0x41761, 0x0}, ++ {0x41762, 0x1}, ++ {0x41763, 0x0}, ++ {0x41764, 0x0}, ++ {0x41765, 0x0}, ++ {0x41766, 0x0}, ++ {0x41767, 0x0}, ++ {0x41768, 0x5758}, ++ {0x41769, 0x0}, ++ {0x4176a, 0x0}, ++ {0x4176b, 0x0}, ++ {0x4176c, 0x4008}, ++ {0x4176d, 0x0}, ++ {0x4176e, 0x0}, ++ {0x4176f, 0x0}, ++ {0x41770, 0x0}, ++ {0x41771, 0x0}, ++ {0x41772, 0x0}, ++ {0x41773, 0x0}, ++ {0x41774, 0x0}, ++ {0x41775, 0x0}, ++ {0x41776, 0x0}, ++ {0x41777, 0x0}, ++ {0x41778, 0x802c}, ++ {0x41779, 0xd00}, ++ {0x4177a, 0x1}, ++ {0x4177b, 0x10}, ++ {0x4177c, 0x8050}, ++ {0x4177d, 0x803}, ++ {0x4177e, 0x0}, ++ {0x4177f, 0x10}, ++ {0x41780, 0x0}, ++ {0x41781, 0x0}, ++ {0x41782, 0x0}, ++ {0x41783, 0x1b00}, ++ {0x41784, 0x0}, ++ {0x41785, 0x0}, ++ {0x41786, 0x0}, ++ {0x41787, 0x0}, ++ {0x41788, 0x0}, ++ {0x41789, 0x0}, ++ {0x4178a, 0x0}, ++ {0x4178b, 0x0}, ++ {0x4178c, 0x0}, ++ {0x4178d, 0x0}, ++ {0x4178e, 0x0}, ++ {0x4178f, 0x0}, ++ {0x41790, 0x8050}, ++ {0x41791, 0x803}, ++ {0x41792, 0x0}, ++ {0x41793, 0x5a10}, ++ {0x41794, 0x0}, ++ {0x41795, 0x0}, ++ {0x41796, 0x0}, ++ {0x41797, 0x0}, ++ {0x41798, 0x0}, ++ {0x41799, 0x0}, ++ {0x4179a, 0x0}, ++ {0x4179b, 0x0}, ++ {0x4179c, 0x0}, ++ {0x4179d, 0x0}, ++ {0x4179e, 0x0}, ++ {0x4179f, 0x0}, ++ {0x417a0, 0x0}, ++ {0x417a1, 0x0}, ++ {0x417a2, 0x0}, ++ {0x417a3, 0x100}, ++ {0x417a4, 0x0}, ++ {0x417a5, 0x0}, ++ {0x417a6, 0x0}, ++ {0x417a7, 0x0}, ++ {0x417a8, 0x8050}, ++ {0x417a9, 0x803}, ++ {0x417aa, 0x0}, ++ {0x417ab, 0x10}, ++ {0x417ac, 0x0}, ++ {0x417ad, 0x0}, ++ {0x417ae, 0x0}, ++ {0x417af, 0x0}, ++ {0x417b0, 0x0}, ++ {0x417b1, 0x0}, ++ {0x417b2, 0x0}, ++ {0x417b3, 0x6b00}, ++ {0x417b4, 0x0}, ++ {0x417b5, 0x0}, ++ {0x417b6, 0x0}, ++ {0x417b7, 0x400}, ++ {0x417b8, 0x807c}, ++ {0x417b9, 0x0}, ++ {0x417ba, 0x0}, ++ {0x417bb, 0x10}, ++ {0x417bc, 0x0}, ++ {0x417bd, 0x0}, ++ {0x417be, 0x0}, ++ {0x417bf, 0x0}, ++ {0x417c0, 0x0}, ++ {0x417c1, 0x0}, ++ {0x417c2, 0x0}, ++ {0x417c3, 0x3b00}, ++ {0x417c4, 0x0}, ++ {0x417c5, 0x0}, ++ {0x417c6, 0x0}, ++ {0x417c7, 0x0}, ++ {0x417c8, 0x0}, ++ {0x417c9, 0x0}, ++ {0x417ca, 0x0}, ++ {0x417cb, 0x0}, ++ {0x417cc, 0x0}, ++ {0x417cd, 0x0}, ++ {0x417ce, 0x1}, ++ {0x417cf, 0x0}, ++ {0x417d0, 0x9758}, ++ {0x417d1, 0x0}, ++ {0x417d2, 0x0}, ++ {0x417d3, 0x10}, ++ {0x417d4, 0x8208}, ++ {0x417d5, 0x0}, ++ {0x417d6, 0x0}, ++ {0x417d7, 0x10}, ++ {0x417d8, 0x0}, ++ {0x417d9, 0x0}, ++ {0x417da, 0x0}, ++ {0x417db, 0x4b00}, ++ {0x417dc, 0x0}, ++ {0x417dd, 0x0}, ++ {0x417de, 0x0}, ++ {0x417df, 0x0}, ++ {0x417e0, 0x0}, ++ {0x417e1, 0x0}, ++ {0x417e2, 0x0}, ++ {0x417e3, 0x0}, ++ {0x417e4, 0x801c}, ++ {0x417e5, 0xd0}, ++ {0x417e6, 0x1}, ++ {0x417e7, 0x10}, ++ {0x417e8, 0x8060}, ++ {0x417e9, 0x84}, ++ {0x417ea, 0x0}, ++ {0x417eb, 0x10}, ++ {0x417ec, 0x0}, ++ {0x417ed, 0x0}, ++ {0x417ee, 0x0}, ++ {0x417ef, 0x0}, ++ {0x417f0, 0x0}, ++ {0x417f1, 0x0}, ++ {0x417f2, 0x0}, ++ {0x417f3, 0x7b00}, ++ {0x417f4, 0x0}, ++ {0x417f5, 0x0}, ++ {0x417f6, 0x0}, ++ {0x417f7, 0x0}, ++ {0x417f8, 0x807c}, ++ {0x417f9, 0x0}, ++ {0x417fa, 0x0}, ++ {0x417fb, 0x10}, ++ {0x417fc, 0x0}, ++ {0x417fd, 0x0}, ++ {0x417fe, 0x0}, ++ {0x417ff, 0x0}, ++ {0x41800, 0x0}, ++ {0x41801, 0x0}, ++ {0x41802, 0x0}, ++ {0x41803, 0x0}, ++ {0x41804, 0x8000}, ++ {0x41805, 0x0}, ++ {0x41806, 0x1}, ++ {0x41807, 0x10}, ++ {0x41808, 0x0}, ++ {0x41809, 0x0}, ++ {0x4180a, 0x0}, ++ {0x4180b, 0x0}, ++ {0x4180c, 0x802c}, ++ {0x4180d, 0xd00}, ++ {0x4180e, 0x1}, ++ {0x4180f, 0x10}, ++ {0x41810, 0x8020}, ++ {0x41811, 0x803}, ++ {0x41812, 0x0}, ++ {0x41813, 0x10}, ++ {0x41814, 0x0}, ++ {0x41815, 0x0}, ++ {0x41816, 0x0}, ++ {0x41817, 0x0}, ++ {0x41818, 0x0}, ++ {0x41819, 0x0}, ++ {0x4181a, 0x0}, ++ {0x4181b, 0x2b00}, ++ {0x4181c, 0x0}, ++ {0x4181d, 0x0}, ++ {0x4181e, 0x0}, ++ {0x4181f, 0x800}, ++ {0x41820, 0x0}, ++ {0x41821, 0x0}, ++ {0x41822, 0x0}, ++ {0x41823, 0x0}, ++ {0x41824, 0x807c}, ++ {0x41825, 0x0}, ++ {0x41826, 0x0}, ++ {0x41827, 0x10}, ++ {0x41828, 0x0}, ++ {0x41829, 0x0}, ++ {0x4182a, 0x0}, ++ {0x4182b, 0x0}, ++ {0x4182c, 0x0}, ++ {0x4182d, 0x0}, ++ {0x4182e, 0x0}, ++ {0x4182f, 0x0}, ++ {0x41830, 0x8000}, ++ {0x41831, 0x0}, ++ {0x41832, 0x1}, ++ {0x41833, 0x10}, ++ {0x41834, 0x0}, ++ {0x41835, 0x0}, ++ {0x41836, 0x0}, ++ {0x41837, 0x0}, ++ {0x41838, 0x9758}, ++ {0x41839, 0x0}, ++ {0x4183a, 0x0}, ++ {0x4183b, 0x10}, ++ {0x4183c, 0x8008}, ++ {0x4183d, 0x0}, ++ {0x4183e, 0x0}, ++ {0x4183f, 0x10}, ++ {0x41840, 0x0}, ++ {0x41841, 0x0}, ++ {0x41842, 0x0}, ++ {0x41843, 0x0}, ++ {0x41844, 0x0}, ++ {0x41845, 0x0}, ++ {0x41846, 0x0}, ++ {0x41847, 0x0}, ++ {0x41848, 0xc068}, ++ {0x41849, 0x0}, ++ {0x4184a, 0x0}, ++ {0x4184b, 0x10}, ++ {0x4184c, 0x0}, ++ {0x4184d, 0x0}, ++ {0x4184e, 0x0}, ++ {0x4184f, 0x0}, ++ {0x41850, 0xd2d8}, ++ {0x41851, 0x0}, ++ {0x41852, 0x0}, ++ {0x41853, 0x10}, ++ {0x41854, 0xe008}, ++ {0x41855, 0x0}, ++ {0x41856, 0x0}, ++ {0x41857, 0x10}, ++ {0x41858, 0x0}, ++ {0x41859, 0x0}, ++ {0x4185a, 0x0}, ++ {0x4185b, 0x5b00}, ++ {0x4185c, 0x0}, ++ {0x4185d, 0x0}, ++ {0x4185e, 0x0}, ++ {0x4185f, 0x0}, ++ {0x41860, 0xc0f0}, ++ {0x41861, 0x0}, ++ {0x41862, 0x0}, ++ {0x41863, 0x10}, ++ {0x41864, 0x0}, ++ {0x41865, 0x0}, ++ {0x41866, 0x0}, ++ {0x41867, 0x0}, ++ {0x41868, 0xcfd8}, ++ {0x41869, 0x0}, ++ {0x4186a, 0x0}, ++ {0x4186b, 0x10}, ++ {0x4186c, 0xc008}, ++ {0x4186d, 0x0}, ++ {0x4186e, 0x0}, ++ {0x4186f, 0x10}, ++ {0x41870, 0x0}, ++ {0x41871, 0x0}, ++ {0x41872, 0x0}, ++ {0x41873, 0x2b00}, ++ {0x41874, 0x0}, ++ {0x41875, 0x0}, ++ {0x41876, 0x0}, ++ {0x41877, 0x0}, ++ {0x41878, 0xd058}, ++ {0x41879, 0x0}, ++ {0x4187a, 0x0}, ++ {0x4187b, 0x10}, ++ {0x4187c, 0xc008}, ++ {0x4187d, 0x0}, ++ {0x4187e, 0x0}, ++ {0x4187f, 0x10}, ++ {0x41880, 0x0}, ++ {0x41881, 0x0}, ++ {0x41882, 0x0}, ++ {0x41883, 0x2b00}, ++ {0x41884, 0x0}, ++ {0x41885, 0x0}, ++ {0x41886, 0x0}, ++ {0x41887, 0x0}, ++ {0x41888, 0xd0d8}, ++ {0x41889, 0x0}, ++ {0x4188a, 0x0}, ++ {0x4188b, 0x10}, ++ {0x4188c, 0xc088}, ++ {0x4188d, 0x0}, ++ {0x4188e, 0x0}, ++ {0x4188f, 0x10}, ++ {0x41890, 0x0}, ++ {0x41891, 0x0}, ++ {0x41892, 0x0}, ++ {0x41893, 0x2b00}, ++ {0x41894, 0x0}, ++ {0x41895, 0x0}, ++ {0x41896, 0x0}, ++ {0x41897, 0x0}, ++ {0x41898, 0xd158}, ++ {0x41899, 0x0}, ++ {0x4189a, 0x0}, ++ {0x4189b, 0x10}, ++ {0x4189c, 0xc008}, ++ {0x4189d, 0x0}, ++ {0x4189e, 0x0}, ++ {0x4189f, 0x10}, ++ {0x418a0, 0x0}, ++ {0x418a1, 0x0}, ++ {0x418a2, 0x0}, ++ {0x418a3, 0x5b00}, ++ {0x418a4, 0x0}, ++ {0x418a5, 0x0}, ++ {0x418a6, 0x0}, ++ {0x418a7, 0x0}, ++ {0x418a8, 0x402c}, ++ {0x418a9, 0xd00}, ++ {0x418aa, 0x1}, ++ {0x418ab, 0x400}, ++ {0x418ac, 0x4050}, ++ {0x418ad, 0x800}, ++ {0x418ae, 0x0}, ++ {0x418af, 0x0}, ++ {0x418b0, 0x0}, ++ {0x418b1, 0x0}, ++ {0x418b2, 0x0}, ++ {0x418b3, 0x400}, ++ {0x418b4, 0x4050}, ++ {0x418b5, 0x803}, ++ {0x418b6, 0x0}, ++ {0x418b7, 0x0}, ++ {0x418b8, 0x0}, ++ {0x418b9, 0x0}, ++ {0x418ba, 0x0}, ++ {0x418bb, 0x6f00}, ++ {0x418bc, 0x0}, ++ {0x418bd, 0x0}, ++ {0x418be, 0x0}, ++ {0x418bf, 0x400}, ++ {0x418c0, 0x407c}, ++ {0x418c1, 0x0}, ++ {0x418c2, 0x0}, ++ {0x418c3, 0x400}, ++ {0x418c4, 0x0}, ++ {0x418c5, 0x0}, ++ {0x418c6, 0x0}, ++ {0x418c7, 0x0}, ++ {0x418c8, 0x0}, ++ {0x418c9, 0x0}, ++ {0x418ca, 0x0}, ++ {0x418cb, 0x400}, ++ {0x418cc, 0x0}, ++ {0x418cd, 0x0}, ++ {0x418ce, 0x1}, ++ {0x418cf, 0x0}, ++ {0x418d0, 0x0}, ++ {0x418d1, 0x0}, ++ {0x418d2, 0x0}, ++ {0x418d3, 0x400}, ++ {0x418d4, 0x0}, ++ {0x418d5, 0x0}, ++ {0x418d6, 0x0}, ++ {0x418d7, 0x0}, ++ {0x418d8, 0x0}, ++ {0x418d9, 0x0}, ++ {0x418da, 0x0}, ++ {0x418db, 0x0}, ++ {0x418dc, 0x0}, ++ {0x418dd, 0x0}, ++ {0x418de, 0x0}, ++ {0x418df, 0x0}, ++ {0x418e0, 0x802c}, ++ {0x418e1, 0xd00}, ++ {0x418e2, 0x1}, ++ {0x418e3, 0x410}, ++ {0x418e4, 0x8050}, ++ {0x418e5, 0x800}, ++ {0x418e6, 0x0}, ++ {0x418e7, 0x10}, ++ {0x418e8, 0x0}, ++ {0x418e9, 0x0}, ++ {0x418ea, 0x0}, ++ {0x418eb, 0x400}, ++ {0x418ec, 0x8050}, ++ {0x418ed, 0x803}, ++ {0x418ee, 0x0}, ++ {0x418ef, 0x10}, ++ {0x418f0, 0x0}, ++ {0x418f1, 0x0}, ++ {0x418f2, 0x0}, ++ {0x418f3, 0x6f00}, ++ {0x418f4, 0x0}, ++ {0x418f5, 0x0}, ++ {0x418f6, 0x0}, ++ {0x418f7, 0x400}, ++ {0x418f8, 0x807c}, ++ {0x418f9, 0x0}, ++ {0x418fa, 0x0}, ++ {0x418fb, 0x410}, ++ {0x418fc, 0x0}, ++ {0x418fd, 0x0}, ++ {0x418fe, 0x0}, ++ {0x418ff, 0x0}, ++ {0x41900, 0x0}, ++ {0x41901, 0x0}, ++ {0x41902, 0x0}, ++ {0x41903, 0x400}, ++ {0x41904, 0x0}, ++ {0x41905, 0x0}, ++ {0x41906, 0x1}, ++ {0x41907, 0x0}, ++ {0x41908, 0x0}, ++ {0x41909, 0x0}, ++ {0x4190a, 0x0}, ++ {0x4190b, 0x400}, ++ {0x4190c, 0x0}, ++ {0x4190d, 0x0}, ++ {0x4190e, 0x0}, ++ {0x4190f, 0x0}, ++ {0x41910, 0x0}, ++ {0x41911, 0x0}, ++ {0x41912, 0x0}, ++ {0x41913, 0x0}, ++ {0x41914, 0x0}, ++ {0x41915, 0x0}, ++ {0x41916, 0x0}, ++ {0x41917, 0x0}, ++ {0x41918, 0x402c}, ++ {0x41919, 0xd00}, ++ {0x4191a, 0x1}, ++ {0x4191b, 0x0}, ++ {0x4191c, 0x4050}, ++ {0x4191d, 0x800}, ++ {0x4191e, 0x0}, ++ {0x4191f, 0x0}, ++ {0x41920, 0x0}, ++ {0x41921, 0x0}, ++ {0x41922, 0x0}, ++ {0x41923, 0x0}, ++ {0x41924, 0x4050}, ++ {0x41925, 0x803}, ++ {0x41926, 0x0}, ++ {0x41927, 0x0}, ++ {0x41928, 0x0}, ++ {0x41929, 0x0}, ++ {0x4192a, 0x0}, ++ {0x4192b, 0x0}, ++ {0x4192c, 0x4050}, ++ {0x4192d, 0x800}, ++ {0x4192e, 0x0}, ++ {0x4192f, 0x0}, ++ {0x41930, 0x0}, ++ {0x41931, 0x0}, ++ {0x41932, 0x0}, ++ {0x41933, 0x4b00}, ++ {0x41934, 0x0}, ++ {0x41935, 0x0}, ++ {0x41936, 0x0}, ++ {0x41937, 0x400}, ++ {0x41938, 0x0}, ++ {0x41939, 0x0}, ++ {0x4193a, 0x0}, ++ {0x4193b, 0x0}, ++ {0x4193c, 0x407c}, ++ {0x4193d, 0x0}, ++ {0x4193e, 0x0}, ++ {0x4193f, 0x0}, ++ {0x41940, 0x0}, ++ {0x41941, 0x0}, ++ {0x41942, 0x0}, ++ {0x41943, 0x0}, ++ {0x41944, 0x0}, ++ {0x41945, 0x0}, ++ {0x41946, 0x0}, ++ {0x41947, 0x0}, ++ {0x41948, 0x0}, ++ {0x41949, 0x0}, ++ {0x4194a, 0x1}, ++ {0x4194b, 0x0}, ++ {0x4194c, 0x0}, ++ {0x4194d, 0x0}, ++ {0x4194e, 0x0}, ++ {0x4194f, 0x0}, ++ {0x41950, 0x0}, ++ {0x41951, 0x0}, ++ {0x41952, 0x0}, ++ {0x41953, 0x4b00}, ++ {0x41954, 0x0}, ++ {0x41955, 0x0}, ++ {0x41956, 0x0}, ++ {0x41957, 0x1800}, ++ {0x41958, 0x0}, ++ {0x41959, 0x0}, ++ {0x4195a, 0x0}, ++ {0x4195b, 0x0}, ++ {0x4195c, 0x802c}, ++ {0x4195d, 0xd00}, ++ {0x4195e, 0x1}, ++ {0x4195f, 0x10}, ++ {0x41960, 0x8050}, ++ {0x41961, 0x800}, ++ {0x41962, 0x0}, ++ {0x41963, 0x10}, ++ {0x41964, 0x0}, ++ {0x41965, 0x0}, ++ {0x41966, 0x0}, ++ {0x41967, 0x0}, ++ {0x41968, 0x8050}, ++ {0x41969, 0x803}, ++ {0x4196a, 0x0}, ++ {0x4196b, 0x10}, ++ {0x4196c, 0x0}, ++ {0x4196d, 0x0}, ++ {0x4196e, 0x0}, ++ {0x4196f, 0x0}, ++ {0x41970, 0x8050}, ++ {0x41971, 0x800}, ++ {0x41972, 0x0}, ++ {0x41973, 0x10}, ++ {0x41974, 0x0}, ++ {0x41975, 0x0}, ++ {0x41976, 0x0}, ++ {0x41977, 0x0}, ++ {0x41978, 0x0}, ++ {0x41979, 0x0}, ++ {0x4197a, 0x0}, ++ {0x4197b, 0x4b00}, ++ {0x4197c, 0x0}, ++ {0x4197d, 0x0}, ++ {0x4197e, 0x0}, ++ {0x4197f, 0x400}, ++ {0x41980, 0x807c}, ++ {0x41981, 0x0}, ++ {0x41982, 0x0}, ++ {0x41983, 0x10}, ++ {0x41984, 0x0}, ++ {0x41985, 0x0}, ++ {0x41986, 0x0}, ++ {0x41987, 0x0}, ++ {0x41988, 0x0}, ++ {0x41989, 0x0}, ++ {0x4198a, 0x0}, ++ {0x4198b, 0x0}, ++ {0x4198c, 0x0}, ++ {0x4198d, 0x0}, ++ {0x4198e, 0x1}, ++ {0x4198f, 0x0}, ++ {0x41990, 0x0}, ++ {0x41991, 0x0}, ++ {0x41992, 0x0}, ++ {0x41993, 0x5b00}, ++ {0x41994, 0x0}, ++ {0x41995, 0x0}, ++ {0x41996, 0x0}, ++ {0x41997, 0x2000}, ++ {0x41998, 0x402c}, ++ {0x41999, 0xd00}, ++ {0x4199a, 0x1}, ++ {0x4199b, 0x0}, ++ {0x4199c, 0x5198}, ++ {0x4199d, 0x803}, ++ {0x4199e, 0x0}, ++ {0x4199f, 0x0}, ++ {0x419a0, 0x0}, ++ {0x419a1, 0x0}, ++ {0x419a2, 0x0}, ++ {0x419a3, 0x1b00}, ++ {0x419a4, 0x0}, ++ {0x419a5, 0x0}, ++ {0x419a6, 0x0}, ++ {0x419a7, 0x0}, ++ {0x419a8, 0x5218}, ++ {0x419a9, 0x803}, ++ {0x419aa, 0x0}, ++ {0x419ab, 0x0}, ++ {0x419ac, 0x0}, ++ {0x419ad, 0x0}, ++ {0x419ae, 0x0}, ++ {0x419af, 0x0}, ++ {0x419b0, 0x0}, ++ {0x419b1, 0x0}, ++ {0x419b2, 0x0}, ++ {0x419b3, 0x4b00}, ++ {0x419b4, 0x0}, ++ {0x419b5, 0x0}, ++ {0x419b6, 0x0}, ++ {0x419b7, 0x400}, ++ {0x419b8, 0x407c}, ++ {0x419b9, 0x0}, ++ {0x419ba, 0x0}, ++ {0x419bb, 0x0}, ++ {0x419bc, 0x0}, ++ {0x419bd, 0x0}, ++ {0x419be, 0x0}, ++ {0x419bf, 0x0}, ++ {0x419c0, 0x0}, ++ {0x419c1, 0x0}, ++ {0x419c2, 0x0}, ++ {0x419c3, 0x0}, ++ {0x419c4, 0x0}, ++ {0x419c5, 0x0}, ++ {0x419c6, 0x1}, ++ {0x419c7, 0x0}, ++ {0x419c8, 0x0}, ++ {0x419c9, 0x0}, ++ {0x419ca, 0x0}, ++ {0x419cb, 0x1b00}, ++ {0x419cc, 0x0}, ++ {0x419cd, 0x0}, ++ {0x419ce, 0x0}, ++ {0x419cf, 0x0}, ++ {0x419d0, 0x0}, ++ {0x419d1, 0x0}, ++ {0x419d2, 0x0}, ++ {0x419d3, 0x0}, ++ {0x419d4, 0x802c}, ++ {0x419d5, 0xd00}, ++ {0x419d6, 0x1}, ++ {0x419d7, 0x10}, ++ {0x419d8, 0x9198}, ++ {0x419d9, 0x803}, ++ {0x419da, 0x0}, ++ {0x419db, 0x10}, ++ {0x419dc, 0x0}, ++ {0x419dd, 0x0}, ++ {0x419de, 0x0}, ++ {0x419df, 0x0}, ++ {0x419e0, 0x0}, ++ {0x419e1, 0x0}, ++ {0x419e2, 0x0}, ++ {0x419e3, 0x0}, ++ {0x419e4, 0x0}, ++ {0x419e5, 0x0}, ++ {0x419e6, 0x0}, ++ {0x419e7, 0x0}, ++ {0x419e8, 0x0}, ++ {0x419e9, 0x0}, ++ {0x419ea, 0x0}, ++ {0x419eb, 0x0}, ++ {0x419ec, 0x9218}, ++ {0x419ed, 0x803}, ++ {0x419ee, 0x0}, ++ {0x419ef, 0x10}, ++ {0x419f0, 0x0}, ++ {0x419f1, 0x0}, ++ {0x419f2, 0x0}, ++ {0x419f3, 0x4b00}, ++ {0x419f4, 0x0}, ++ {0x419f5, 0x0}, ++ {0x419f6, 0x0}, ++ {0x419f7, 0x400}, ++ {0x419f8, 0x0}, ++ {0x419f9, 0x0}, ++ {0x419fa, 0x0}, ++ {0x419fb, 0x0}, ++ {0x419fc, 0x807c}, ++ {0x419fd, 0x0}, ++ {0x419fe, 0x0}, ++ {0x419ff, 0x10}, ++ {0x41a00, 0x0}, ++ {0x41a01, 0x0}, ++ {0x41a02, 0x0}, ++ {0x41a03, 0x0}, ++ {0x41a04, 0x0}, ++ {0x41a05, 0x0}, ++ {0x41a06, 0x0}, ++ {0x41a07, 0x0}, ++ {0x41a08, 0x0}, ++ {0x41a09, 0x0}, ++ {0x41a0a, 0x1}, ++ {0x41a0b, 0x0}, ++ {0x41a0c, 0x0}, ++ {0x41a0d, 0x0}, ++ {0x41a0e, 0x0}, ++ {0x41a0f, 0x0}, ++ {0x41a10, 0x0}, ++ {0x41a11, 0x0}, ++ {0x41a12, 0x0}, ++ {0x41a13, 0xb00}, ++ {0x41a14, 0x0}, ++ {0x41a15, 0x0}, ++ {0x41a16, 0x0}, ++ {0x41a17, 0x400}, ++ {0x41a18, 0x0}, ++ {0x41a19, 0x0}, ++ {0x41a1a, 0x0}, ++ {0x41a1b, 0x0}, ++ {0x41a1c, 0x0}, ++ {0x41a1d, 0x0}, ++ {0x41a1e, 0x0}, ++ {0x41a1f, 0x0}, ++ {0x41a20, 0x401c}, ++ {0x41a21, 0xd0}, ++ {0x41a22, 0x1}, ++ {0x41a23, 0x0}, ++ {0x41a24, 0x4060}, ++ {0x41a25, 0x84}, ++ {0x41a26, 0x0}, ++ {0x41a27, 0x0}, ++ {0x41a28, 0x0}, ++ {0x41a29, 0x0}, ++ {0x41a2a, 0x0}, ++ {0x41a2b, 0xb00}, ++ {0x41a2c, 0x0}, ++ {0x41a2d, 0x0}, ++ {0x41a2e, 0x0}, ++ {0x41a2f, 0x800}, ++ {0x41a30, 0x407c}, ++ {0x41a31, 0x0}, ++ {0x41a32, 0x0}, ++ {0x41a33, 0x0}, ++ {0x41a34, 0x0}, ++ {0x41a35, 0x0}, ++ {0x41a36, 0x0}, ++ {0x41a37, 0x0}, ++ {0x41a38, 0x0}, ++ {0x41a39, 0x0}, ++ {0x41a3a, 0x0}, ++ {0x41a3b, 0x0}, ++ {0x41a3c, 0x4000}, ++ {0x41a3d, 0x0}, ++ {0x41a3e, 0x1}, ++ {0x41a3f, 0x0}, ++ {0x41a40, 0x0}, ++ {0x41a41, 0x0}, ++ {0x41a42, 0x0}, ++ {0x41a43, 0x0}, ++ {0x41a44, 0x402c}, ++ {0x41a45, 0xd00}, ++ {0x41a46, 0x1}, ++ {0x41a47, 0x0}, ++ {0x41a48, 0x4020}, ++ {0x41a49, 0x803}, ++ {0x41a4a, 0x0}, ++ {0x41a4b, 0x0}, ++ {0x41a4c, 0x0}, ++ {0x41a4d, 0x0}, ++ {0x41a4e, 0x0}, ++ {0x41a4f, 0x0}, ++ {0x41a50, 0x0}, ++ {0x41a51, 0x0}, ++ {0x41a52, 0x0}, ++ {0x41a53, 0x2b00}, ++ {0x41a54, 0x0}, ++ {0x41a55, 0x0}, ++ {0x41a56, 0x0}, ++ {0x41a57, 0x800}, ++ {0x41a58, 0x0}, ++ {0x41a59, 0x0}, ++ {0x41a5a, 0x0}, ++ {0x41a5b, 0x0}, ++ {0x41a5c, 0x407c}, ++ {0x41a5d, 0x0}, ++ {0x41a5e, 0x0}, ++ {0x41a5f, 0x0}, ++ {0x41a60, 0x0}, ++ {0x41a61, 0x0}, ++ {0x41a62, 0x0}, ++ {0x41a63, 0x0}, ++ {0x41a64, 0x0}, ++ {0x41a65, 0x0}, ++ {0x41a66, 0x0}, ++ {0x41a67, 0x0}, ++ {0x41a68, 0x0}, ++ {0x41a69, 0x0}, ++ {0x41a6a, 0x1}, ++ {0x41a6b, 0x0}, ++ {0x41a6c, 0x0}, ++ {0x41a6d, 0x0}, ++ {0x41a6e, 0x0}, ++ {0x41a6f, 0x0}, ++ {0x41a70, 0x801c}, ++ {0x41a71, 0xd0}, ++ {0x41a72, 0x1}, ++ {0x41a73, 0x10}, ++ {0x41a74, 0x8060}, ++ {0x41a75, 0x84}, ++ {0x41a76, 0x0}, ++ {0x41a77, 0x10}, ++ {0x41a78, 0x0}, ++ {0x41a79, 0x0}, ++ {0x41a7a, 0x0}, ++ {0x41a7b, 0xb00}, ++ {0x41a7c, 0x0}, ++ {0x41a7d, 0x0}, ++ {0x41a7e, 0x0}, ++ {0x41a7f, 0x800}, ++ {0x41a80, 0x807c}, ++ {0x41a81, 0x0}, ++ {0x41a82, 0x0}, ++ {0x41a83, 0x10}, ++ {0x41a84, 0x0}, ++ {0x41a85, 0x0}, ++ {0x41a86, 0x0}, ++ {0x41a87, 0x0}, ++ {0x41a88, 0x0}, ++ {0x41a89, 0x0}, ++ {0x41a8a, 0x0}, ++ {0x41a8b, 0x0}, ++ {0x41a8c, 0x8000}, ++ {0x41a8d, 0x0}, ++ {0x41a8e, 0x1}, ++ {0x41a8f, 0x10}, ++ {0x41a90, 0x0}, ++ {0x41a91, 0x0}, ++ {0x41a92, 0x0}, ++ {0x41a93, 0x0}, ++ {0x41a94, 0x802c}, ++ {0x41a95, 0xd00}, ++ {0x41a96, 0x1}, ++ {0x41a97, 0x10}, ++ {0x41a98, 0x8020}, ++ {0x41a99, 0x803}, ++ {0x41a9a, 0x0}, ++ {0x41a9b, 0x10}, ++ {0x41a9c, 0x0}, ++ {0x41a9d, 0x0}, ++ {0x41a9e, 0x0}, ++ {0x41a9f, 0x0}, ++ {0x41aa0, 0x0}, ++ {0x41aa1, 0x0}, ++ {0x41aa2, 0x0}, ++ {0x41aa3, 0x2b00}, ++ {0x41aa4, 0x0}, ++ {0x41aa5, 0x0}, ++ {0x41aa6, 0x0}, ++ {0x41aa7, 0x800}, ++ {0x41aa8, 0x0}, ++ {0x41aa9, 0x0}, ++ {0x41aaa, 0x0}, ++ {0x41aab, 0x0}, ++ {0x41aac, 0x807c}, ++ {0x41aad, 0x0}, ++ {0x41aae, 0x0}, ++ {0x41aaf, 0x10}, ++ {0x41ab0, 0x0}, ++ {0x41ab1, 0x0}, ++ {0x41ab2, 0x0}, ++ {0x41ab3, 0x0}, ++ {0x41ab4, 0x0}, ++ {0x41ab5, 0x0}, ++ {0x41ab6, 0x0}, ++ {0x41ab7, 0x0}, ++ {0x41ab8, 0x0}, ++ {0x41ab9, 0x0}, ++ {0x41aba, 0x1}, ++ {0x41abb, 0x0}, ++ {0x41abc, 0x0}, ++ {0x41abd, 0x0}, ++ {0x41abe, 0x0}, ++ {0x41abf, 0x0}, ++ {0x41ac0, 0x402c}, ++ {0x41ac1, 0xd00}, ++ {0x41ac2, 0x1}, ++ {0x41ac3, 0x0}, ++ {0x41ac4, 0x4050}, ++ {0x41ac5, 0x803}, ++ {0x41ac6, 0x0}, ++ {0x41ac7, 0x0}, ++ {0x41ac8, 0x0}, ++ {0x41ac9, 0x0}, ++ {0x41aca, 0x0}, ++ {0x41acb, 0x0}, ++ {0x41acc, 0x0}, ++ {0x41acd, 0x0}, ++ {0x41ace, 0x0}, ++ {0x41acf, 0x0}, ++ {0x41ad0, 0x0}, ++ {0x41ad1, 0x0}, ++ {0x41ad2, 0x0}, ++ {0x41ad3, 0x0}, ++ {0x41ad4, 0x0}, ++ {0x41ad5, 0x0}, ++ {0x41ad6, 0x0}, ++ {0x41ad7, 0x0}, ++ {0x41ad8, 0x4050}, ++ {0x41ad9, 0x803}, ++ {0x41ada, 0x0}, ++ {0x41adb, 0x5a00}, ++ {0x41adc, 0x0}, ++ {0x41add, 0x0}, ++ {0x41ade, 0x0}, ++ {0x41adf, 0x0}, ++ {0x41ae0, 0x0}, ++ {0x41ae1, 0x0}, ++ {0x41ae2, 0x0}, ++ {0x41ae3, 0x100}, ++ {0x41ae4, 0x0}, ++ {0x41ae5, 0x0}, ++ {0x41ae6, 0x0}, ++ {0x41ae7, 0x0}, ++ {0x41ae8, 0x4050}, ++ {0x41ae9, 0x803}, ++ {0x41aea, 0x0}, ++ {0x41aeb, 0x0}, ++ {0x41aec, 0x0}, ++ {0x41aed, 0x0}, ++ {0x41aee, 0x0}, ++ {0x41aef, 0x0}, ++ {0x41af0, 0x0}, ++ {0x41af1, 0x0}, ++ {0x41af2, 0x0}, ++ {0x41af3, 0x4b00}, ++ {0x41af4, 0x0}, ++ {0x41af5, 0x0}, ++ {0x41af6, 0x0}, ++ {0x41af7, 0x400}, ++ {0x41af8, 0x407c}, ++ {0x41af9, 0x0}, ++ {0x41afa, 0x0}, ++ {0x41afb, 0x0}, ++ {0x41afc, 0x0}, ++ {0x41afd, 0x0}, ++ {0x41afe, 0x0}, ++ {0x41aff, 0x0}, ++ {0x41b00, 0x0}, ++ {0x41b01, 0x0}, ++ {0x41b02, 0x0}, ++ {0x41b03, 0x3b00}, ++ {0x41b04, 0x0}, ++ {0x41b05, 0x0}, ++ {0x41b06, 0x0}, ++ {0x41b07, 0x0}, ++ {0x41b08, 0x0}, ++ {0x41b09, 0x0}, ++ {0x41b0a, 0x0}, ++ {0x41b0b, 0x0}, ++ {0x41b0c, 0x0}, ++ {0x41b0d, 0x0}, ++ {0x41b0e, 0x1}, ++ {0x41b0f, 0x0}, ++ {0x41b10, 0x5758}, ++ {0x41b11, 0x0}, ++ {0x41b12, 0x0}, ++ {0x41b13, 0x0}, ++ {0x41b14, 0x4208}, ++ {0x41b15, 0x0}, ++ {0x41b16, 0x0}, ++ {0x41b17, 0x0}, ++ {0x41b18, 0x0}, ++ {0x41b19, 0x0}, ++ {0x41b1a, 0x0}, ++ {0x41b1b, 0x4b00}, ++ {0x41b1c, 0x0}, ++ {0x41b1d, 0x0}, ++ {0x41b1e, 0x0}, ++ {0x41b1f, 0x0}, ++ {0x41b20, 0x0}, ++ {0x41b21, 0x0}, ++ {0x41b22, 0x0}, ++ {0x41b23, 0x0}, ++ {0x41b24, 0x401c}, ++ {0x41b25, 0xd0}, ++ {0x41b26, 0x1}, ++ {0x41b27, 0x0}, ++ {0x41b28, 0x4060}, ++ {0x41b29, 0x84}, ++ {0x41b2a, 0x0}, ++ {0x41b2b, 0x0}, ++ {0x41b2c, 0x0}, ++ {0x41b2d, 0x0}, ++ {0x41b2e, 0x0}, ++ {0x41b2f, 0x0}, ++ {0x41b30, 0x0}, ++ {0x41b31, 0x0}, ++ {0x41b32, 0x0}, ++ {0x41b33, 0x7b00}, ++ {0x41b34, 0x0}, ++ {0x41b35, 0x0}, ++ {0x41b36, 0x0}, ++ {0x41b37, 0x0}, ++ {0x41b38, 0x407c}, ++ {0x41b39, 0x0}, ++ {0x41b3a, 0x0}, ++ {0x41b3b, 0x0}, ++ {0x41b3c, 0x0}, ++ {0x41b3d, 0x0}, ++ {0x41b3e, 0x0}, ++ {0x41b3f, 0x0}, ++ {0x41b40, 0x0}, ++ {0x41b41, 0x0}, ++ {0x41b42, 0x0}, ++ {0x41b43, 0x0}, ++ {0x41b44, 0x4000}, ++ {0x41b45, 0x0}, ++ {0x41b46, 0x1}, ++ {0x41b47, 0x0}, ++ {0x41b48, 0x0}, ++ {0x41b49, 0x0}, ++ {0x41b4a, 0x0}, ++ {0x41b4b, 0x0}, ++ {0x41b4c, 0x402c}, ++ {0x41b4d, 0xd00}, ++ {0x41b4e, 0x1}, ++ {0x41b4f, 0x0}, ++ {0x41b50, 0x4020}, ++ {0x41b51, 0x803}, ++ {0x41b52, 0x0}, ++ {0x41b53, 0x0}, ++ {0x41b54, 0x0}, ++ {0x41b55, 0x0}, ++ {0x41b56, 0x0}, ++ {0x41b57, 0x0}, ++ {0x41b58, 0x0}, ++ {0x41b59, 0x0}, ++ {0x41b5a, 0x0}, ++ {0x41b5b, 0x2b00}, ++ {0x41b5c, 0x0}, ++ {0x41b5d, 0x0}, ++ {0x41b5e, 0x0}, ++ {0x41b5f, 0x800}, ++ {0x41b60, 0x0}, ++ {0x41b61, 0x0}, ++ {0x41b62, 0x0}, ++ {0x41b63, 0x0}, ++ {0x41b64, 0x407c}, ++ {0x41b65, 0x0}, ++ {0x41b66, 0x0}, ++ {0x41b67, 0x0}, ++ {0x41b68, 0x0}, ++ {0x41b69, 0x0}, ++ {0x41b6a, 0x0}, ++ {0x41b6b, 0x0}, ++ {0x41b6c, 0x0}, ++ {0x41b6d, 0x0}, ++ {0x41b6e, 0x0}, ++ {0x41b6f, 0x0}, ++ {0x41b70, 0x4000}, ++ {0x41b71, 0x0}, ++ {0x41b72, 0x1}, ++ {0x41b73, 0x0}, ++ {0x41b74, 0x0}, ++ {0x41b75, 0x0}, ++ {0x41b76, 0x0}, ++ {0x41b77, 0x0}, ++ {0x41b78, 0x5758}, ++ {0x41b79, 0x0}, ++ {0x41b7a, 0x0}, ++ {0x41b7b, 0x0}, ++ {0x41b7c, 0x4008}, ++ {0x41b7d, 0x0}, ++ {0x41b7e, 0x0}, ++ {0x41b7f, 0x0}, ++ {0x41b80, 0x0}, ++ {0x41b81, 0x0}, ++ {0x41b82, 0x0}, ++ {0x41b83, 0x0}, ++ {0x41b84, 0x0}, ++ {0x41b85, 0x0}, ++ {0x41b86, 0x0}, ++ {0x41b87, 0x0}, ++ {0x41b88, 0x802c}, ++ {0x41b89, 0xd00}, ++ {0x41b8a, 0x1}, ++ {0x41b8b, 0x10}, ++ {0x41b8c, 0x8050}, ++ {0x41b8d, 0x803}, ++ {0x41b8e, 0x0}, ++ {0x41b8f, 0x10}, ++ {0x41b90, 0x0}, ++ {0x41b91, 0x0}, ++ {0x41b92, 0x0}, ++ {0x41b93, 0x0}, ++ {0x41b94, 0x0}, ++ {0x41b95, 0x0}, ++ {0x41b96, 0x0}, ++ {0x41b97, 0x0}, ++ {0x41b98, 0x0}, ++ {0x41b99, 0x0}, ++ {0x41b9a, 0x0}, ++ {0x41b9b, 0x0}, ++ {0x41b9c, 0x0}, ++ {0x41b9d, 0x0}, ++ {0x41b9e, 0x0}, ++ {0x41b9f, 0x0}, ++ {0x41ba0, 0x8050}, ++ {0x41ba1, 0x803}, ++ {0x41ba2, 0x0}, ++ {0x41ba3, 0x5a10}, ++ {0x41ba4, 0x0}, ++ {0x41ba5, 0x0}, ++ {0x41ba6, 0x0}, ++ {0x41ba7, 0x0}, ++ {0x41ba8, 0x0}, ++ {0x41ba9, 0x0}, ++ {0x41baa, 0x0}, ++ {0x41bab, 0x100}, ++ {0x41bac, 0x0}, ++ {0x41bad, 0x0}, ++ {0x41bae, 0x0}, ++ {0x41baf, 0x0}, ++ {0x41bb0, 0x8050}, ++ {0x41bb1, 0x803}, ++ {0x41bb2, 0x0}, ++ {0x41bb3, 0x10}, ++ {0x41bb4, 0x0}, ++ {0x41bb5, 0x0}, ++ {0x41bb6, 0x0}, ++ {0x41bb7, 0x0}, ++ {0x41bb8, 0x0}, ++ {0x41bb9, 0x0}, ++ {0x41bba, 0x0}, ++ {0x41bbb, 0x4b00}, ++ {0x41bbc, 0x0}, ++ {0x41bbd, 0x0}, ++ {0x41bbe, 0x0}, ++ {0x41bbf, 0x400}, ++ {0x41bc0, 0x807c}, ++ {0x41bc1, 0x0}, ++ {0x41bc2, 0x0}, ++ {0x41bc3, 0x10}, ++ {0x41bc4, 0x0}, ++ {0x41bc5, 0x0}, ++ {0x41bc6, 0x0}, ++ {0x41bc7, 0x0}, ++ {0x41bc8, 0x0}, ++ {0x41bc9, 0x0}, ++ {0x41bca, 0x0}, ++ {0x41bcb, 0x3b00}, ++ {0x41bcc, 0x0}, ++ {0x41bcd, 0x0}, ++ {0x41bce, 0x0}, ++ {0x41bcf, 0x0}, ++ {0x41bd0, 0x0}, ++ {0x41bd1, 0x0}, ++ {0x41bd2, 0x0}, ++ {0x41bd3, 0x0}, ++ {0x41bd4, 0x0}, ++ {0x41bd5, 0x0}, ++ {0x41bd6, 0x1}, ++ {0x41bd7, 0x0}, ++ {0x41bd8, 0x9758}, ++ {0x41bd9, 0x0}, ++ {0x41bda, 0x0}, ++ {0x41bdb, 0x10}, ++ {0x41bdc, 0x8208}, ++ {0x41bdd, 0x0}, ++ {0x41bde, 0x0}, ++ {0x41bdf, 0x10}, ++ {0x41be0, 0x0}, ++ {0x41be1, 0x0}, ++ {0x41be2, 0x0}, ++ {0x41be3, 0x4b00}, ++ {0x41be4, 0x0}, ++ {0x41be5, 0x0}, ++ {0x41be6, 0x0}, ++ {0x41be7, 0x0}, ++ {0x41be8, 0x0}, ++ {0x41be9, 0x0}, ++ {0x41bea, 0x0}, ++ {0x41beb, 0x0}, ++ {0x41bec, 0x801c}, ++ {0x41bed, 0xd0}, ++ {0x41bee, 0x1}, ++ {0x41bef, 0x10}, ++ {0x41bf0, 0x8060}, ++ {0x41bf1, 0x84}, ++ {0x41bf2, 0x0}, ++ {0x41bf3, 0x10}, ++ {0x41bf4, 0x0}, ++ {0x41bf5, 0x0}, ++ {0x41bf6, 0x0}, ++ {0x41bf7, 0x0}, ++ {0x41bf8, 0x0}, ++ {0x41bf9, 0x0}, ++ {0x41bfa, 0x0}, ++ {0x41bfb, 0x7b00}, ++ {0x41bfc, 0x0}, ++ {0x41bfd, 0x0}, ++ {0x41bfe, 0x0}, ++ {0x41bff, 0x0}, ++ {0x41c00, 0x807c}, ++ {0x41c01, 0x0}, ++ {0x41c02, 0x0}, ++ {0x41c03, 0x10}, ++ {0x41c04, 0x0}, ++ {0x41c05, 0x0}, ++ {0x41c06, 0x0}, ++ {0x41c07, 0x0}, ++ {0x41c08, 0x0}, ++ {0x41c09, 0x0}, ++ {0x41c0a, 0x0}, ++ {0x41c0b, 0x0}, ++ {0x41c0c, 0x8000}, ++ {0x41c0d, 0x0}, ++ {0x41c0e, 0x1}, ++ {0x41c0f, 0x10}, ++ {0x41c10, 0x0}, ++ {0x41c11, 0x0}, ++ {0x41c12, 0x0}, ++ {0x41c13, 0x0}, ++ {0x41c14, 0x802c}, ++ {0x41c15, 0xd00}, ++ {0x41c16, 0x1}, ++ {0x41c17, 0x10}, ++ {0x41c18, 0x8020}, ++ {0x41c19, 0x803}, ++ {0x41c1a, 0x0}, ++ {0x41c1b, 0x10}, ++ {0x41c1c, 0x0}, ++ {0x41c1d, 0x0}, ++ {0x41c1e, 0x0}, ++ {0x41c1f, 0x0}, ++ {0x41c20, 0x0}, ++ {0x41c21, 0x0}, ++ {0x41c22, 0x0}, ++ {0x41c23, 0x2b00}, ++ {0x41c24, 0x0}, ++ {0x41c25, 0x0}, ++ {0x41c26, 0x0}, ++ {0x41c27, 0x800}, ++ {0x41c28, 0x0}, ++ {0x41c29, 0x0}, ++ {0x41c2a, 0x0}, ++ {0x41c2b, 0x0}, ++ {0x41c2c, 0x807c}, ++ {0x41c2d, 0x0}, ++ {0x41c2e, 0x0}, ++ {0x41c2f, 0x10}, ++ {0x41c30, 0x0}, ++ {0x41c31, 0x0}, ++ {0x41c32, 0x0}, ++ {0x41c33, 0x0}, ++ {0x41c34, 0x0}, ++ {0x41c35, 0x0}, ++ {0x41c36, 0x0}, ++ {0x41c37, 0x0}, ++ {0x41c38, 0x8000}, ++ {0x41c39, 0x0}, ++ {0x41c3a, 0x1}, ++ {0x41c3b, 0x10}, ++ {0x41c3c, 0x0}, ++ {0x41c3d, 0x0}, ++ {0x41c3e, 0x0}, ++ {0x41c3f, 0x0}, ++ {0x41c40, 0x9758}, ++ {0x41c41, 0x0}, ++ {0x41c42, 0x0}, ++ {0x41c43, 0x10}, ++ {0x41c44, 0x8008}, ++ {0x41c45, 0x0}, ++ {0x41c46, 0x0}, ++ {0x41c47, 0x10}, ++ {0x41c48, 0x0}, ++ {0x41c49, 0x0}, ++ {0x41c4a, 0x0}, ++ {0x41c4b, 0x0}, ++ {0x41c4c, 0x0}, ++ {0x41c4d, 0x0}, ++ {0x41c4e, 0x0}, ++ {0x41c4f, 0x0}, ++ {0x41c50, 0xc068}, ++ {0x41c51, 0x0}, ++ {0x41c52, 0x0}, ++ {0x41c53, 0x10}, ++ {0x41c54, 0x0}, ++ {0x41c55, 0x0}, ++ {0x41c56, 0x0}, ++ {0x41c57, 0x0}, ++ {0x9002e, 0x10}, ++ {0x9002f, 0x400}, ++ {0x90030, 0x80e}, ++ {0x90031, 0xb}, ++ {0x90032, 0x480}, ++ {0x90033, 0x809}, ++ {0x90034, 0x9}, ++ {0x90035, 0x308}, ++ {0x90036, 0xc09}, ++ {0x90037, 0x28}, ++ {0x90038, 0x8160}, ++ {0x90039, 0x87c}, ++ {0x9003a, 0x98}, ++ {0x9003b, 0x820}, ++ {0x9003c, 0xc7e}, ++ {0x9003d, 0x2}, ++ {0x9003e, 0x1}, ++ {0x9003f, 0x78}, ++ {0x90040, 0xa}, ++ {0x90041, 0x370}, ++ {0x90042, 0x839}, ++ {0x90043, 0x18}, ++ {0x90044, 0x8160}, ++ {0x90045, 0x83c}, ++ {0x90046, 0x9}, ++ {0x90047, 0x150}, ++ {0x90048, 0x839}, ++ {0x90049, 0x70}, ++ {0x9004a, 0x392}, ++ {0x9004b, 0x39}, ++ {0x9004c, 0x78}, ++ {0x9004d, 0x39a}, ++ {0x9004e, 0x39}, ++ {0x9004f, 0xe09}, ++ {0x90050, 0x100}, ++ {0x90051, 0x839}, ++ {0x90052, 0x2}, ++ {0x90053, 0x1}, ++ {0x90054, 0x38}, ++ {0x90055, 0x0}, ++ {0x90056, 0x100}, ++ {0x90057, 0x839}, ++ {0x90058, 0x0}, ++ {0x90059, 0x398}, ++ {0x9005a, 0x839}, ++ {0x9005b, 0xe19}, ++ {0x9005c, 0x100}, ++ {0x9005d, 0x839}, ++ {0x9005e, 0x2}, ++ {0x9005f, 0x1}, ++ {0x90060, 0x38}, ++ {0x90061, 0x0}, ++ {0x90062, 0x100}, ++ {0x90063, 0x839}, ++ {0x90064, 0x0}, ++ {0x90065, 0x390}, ++ {0x90066, 0x839}, ++ {0x90067, 0x78}, ++ {0x90068, 0x39a}, ++ {0x90069, 0x39}, ++ {0x9006a, 0xe29}, ++ {0x9006b, 0x100}, ++ {0x9006c, 0x839}, ++ {0x9006d, 0x2}, ++ {0x9006e, 0x1}, ++ {0x9006f, 0x38}, ++ {0x90070, 0x0}, ++ {0x90071, 0x100}, ++ {0x90072, 0x839}, ++ {0x90073, 0x70}, ++ {0x90074, 0x392}, ++ {0x90075, 0x39}, ++ {0x90076, 0x0}, ++ {0x90077, 0xf0}, ++ {0x90078, 0x909}, ++ {0x90079, 0x18}, ++ {0x9007a, 0x8160}, ++ {0x9007b, 0x8bc}, ++ {0x9007c, 0x8}, ++ {0x9007d, 0x13a}, ++ {0x9007e, 0xb9}, ++ {0x9007f, 0x24b}, ++ {0x90080, 0x100}, ++ {0x90081, 0x8b9}, ++ {0x90082, 0x2}, ++ {0x90083, 0x1}, ++ {0x90084, 0xb8}, ++ {0x90085, 0x0}, ++ {0x90086, 0x100}, ++ {0x90087, 0x8b9}, ++ {0x90088, 0x20}, ++ {0x90089, 0x4}, ++ {0x9008a, 0xb8}, ++ {0x9008b, 0x20}, ++ {0x9008c, 0x4}, ++ {0x9008d, 0xb8}, ++ {0x9008e, 0x5}, ++ {0x9008f, 0x0}, ++ {0x90090, 0xb8}, ++ {0x90091, 0x479}, ++ {0x90092, 0xc7f8}, ++ {0x90093, 0x8bc}, ++ {0x90094, 0x0}, ++ {0x90095, 0x0}, ++ {0x90096, 0xb8}, ++ {0x90097, 0x0}, ++ {0x90098, 0xa8}, ++ {0x90099, 0x8b9}, ++ {0x9009a, 0x9}, ++ {0x9009b, 0xc9c0}, ++ {0x9009c, 0xcbc}, ++ {0x9009d, 0x0}, ++ {0x9009e, 0x0}, ++ {0x9009f, 0xb8}, ++ {0x900a0, 0x25b}, ++ {0x900a1, 0x100}, ++ {0x900a2, 0xcb9}, ++ {0x900a3, 0x20}, ++ {0x900a4, 0x4}, ++ {0x900a5, 0xb8}, ++ {0x900a6, 0x20}, ++ {0x900a7, 0x4}, ++ {0x900a8, 0xb8}, ++ {0x900a9, 0x20}, ++ {0x900aa, 0x4}, ++ {0x900ab, 0xb8}, ++ {0x900ac, 0x20}, ++ {0x900ad, 0x4}, ++ {0x900ae, 0xb8}, ++ {0x900af, 0x10}, ++ {0x900b0, 0x400}, ++ {0x900b1, 0x89e}, ++ {0x900b2, 0x8}, ++ {0x900b3, 0x370}, ++ {0x900b4, 0x839}, ++ {0x900b5, 0x0}, ++ {0x900b6, 0xf0}, ++ {0x900b7, 0x909}, ++ {0x900b8, 0x33b}, ++ {0x900b9, 0x100}, ++ {0x900ba, 0x8b9}, ++ {0x900bb, 0x0}, ++ {0x900bc, 0x100}, ++ {0x900bd, 0x8b9}, ++ {0x900be, 0x23b}, ++ {0x900bf, 0x100}, ++ {0x900c0, 0xc99}, ++ {0x900c1, 0x2}, ++ {0x900c2, 0x150}, ++ {0x900c3, 0x839}, ++ {0x900c4, 0x1800}, ++ {0x900c5, 0x8660}, ++ {0x900c6, 0x839}, ++ {0x900c7, 0x0}, ++ {0x900c8, 0x2a0}, ++ {0x900c9, 0x809}, ++ {0x900ca, 0x8}, ++ {0x900cb, 0x1880}, ++ {0x900cc, 0x839}, ++ {0x900cd, 0x0}, ++ {0x900ce, 0x82b0}, ++ {0x900cf, 0x838}, ++ {0x900d0, 0x18}, ++ {0x900d1, 0xe0}, ++ {0x900d2, 0x809}, ++ {0x900d3, 0x0}, ++ {0x900d4, 0xe0}, ++ {0x900d5, 0x869}, ++ {0x900d6, 0xf}, ++ {0x900d7, 0x7c0}, ++ {0x900d8, 0x839}, ++ {0x900d9, 0xa}, ++ {0x900da, 0x510}, ++ {0x900db, 0x839}, ++ {0x900dc, 0xa}, ++ {0x900dd, 0x700}, ++ {0x900de, 0x849}, ++ {0x900df, 0xa}, ++ {0x900e0, 0x700}, ++ {0x900e1, 0x859}, ++ {0x900e2, 0xa}, ++ {0x900e3, 0x708}, ++ {0x900e4, 0x859}, ++ {0x900e5, 0x2}, ++ {0x900e6, 0x708}, ++ {0x900e7, 0x849}, ++ {0x900e8, 0xff8}, ++ {0x900e9, 0x8410}, ++ {0x900ea, 0x839}, ++ {0x900eb, 0x7ff8}, ++ {0x900ec, 0x8498}, ++ {0x900ed, 0x838}, ++ {0x900ee, 0x10}, ++ {0x900ef, 0x8160}, ++ {0x900f0, 0x83c}, ++ {0x900f1, 0x0}, ++ {0x900f2, 0x7c8}, ++ {0x900f3, 0x809}, ++ {0x900f4, 0x0}, ++ {0x900f5, 0x1}, ++ {0x900f6, 0x8}, ++ {0x900f7, 0x0}, ++ {0x900f8, 0x45a}, ++ {0x900f9, 0x89}, ++ {0x900fa, 0x0}, ++ {0x900fb, 0x8018}, ++ {0x900fc, 0x808}, ++ {0x900fd, 0x0}, ++ {0x900fe, 0x8020}, ++ {0x900ff, 0x808}, ++ {0x90100, 0x479}, ++ {0x90101, 0xc7f8}, ++ {0x90102, 0x80c}, ++ {0x90103, 0x0}, ++ {0x90104, 0x0}, ++ {0x90105, 0x8}, ++ {0x90106, 0x0}, ++ {0x90107, 0x8018}, ++ {0x90108, 0x808}, ++ {0x90109, 0x0}, ++ {0x9010a, 0x8020}, ++ {0x9010b, 0x808}, ++ {0x9010c, 0x9}, ++ {0x9010d, 0xc9c0}, ++ {0x9010e, 0xc0c}, ++ {0x9010f, 0x0}, ++ {0x90110, 0xa8}, ++ {0x90111, 0x8c9}, ++ {0x90112, 0x29}, ++ {0x90113, 0x8160}, ++ {0x90114, 0x87c}, ++ {0x90115, 0xb8}, ++ {0x90116, 0x820}, ++ {0x90117, 0xc7e}, ++ {0x90118, 0x1}, ++ {0x90119, 0x0}, ++ {0x9011a, 0x78}, ++ {0x9011b, 0x0}, ++ {0x9011c, 0x1}, ++ {0x9011d, 0x78}, ++ {0x9011e, 0xd8}, ++ {0x9011f, 0x820}, ++ {0x90120, 0xc7e}, ++ {0x90121, 0x1}, ++ {0x90122, 0x0}, ++ {0x90123, 0x78}, ++ {0x90124, 0x0}, ++ {0x90125, 0x1}, ++ {0x90126, 0x78}, ++ {0x90127, 0xf8}, ++ {0x90128, 0x820}, ++ {0x90129, 0xc7e}, ++ {0x9012a, 0x1}, ++ {0x9012b, 0x0}, ++ {0x9012c, 0x78}, ++ {0x9012d, 0x0}, ++ {0x9012e, 0x1}, ++ {0x9012f, 0x78}, ++ {0x90130, 0x0}, ++ {0x90131, 0x700}, ++ {0x90132, 0x849}, ++ {0x90133, 0x0}, ++ {0x90134, 0x618}, ++ {0x90135, 0x809}, ++ {0x90136, 0x3ff8}, ++ {0x90137, 0x84b8}, ++ {0x90138, 0x808}, ++ {0x90139, 0x0}, ++ {0x9013a, 0x0}, ++ {0x9013b, 0x8}, ++ {0x9013c, 0x8}, ++ {0x9013d, 0xc870}, ++ {0x9013e, 0xc0c}, ++ {0x9013f, 0x18}, ++ {0x90140, 0x710}, ++ {0x90141, 0x849}, ++ {0x90142, 0x0}, ++ {0x90143, 0x4}, ++ {0x90144, 0x48}, ++ {0x90145, 0x0}, ++ {0x90146, 0x4}, ++ {0x90147, 0x48}, ++ {0x90148, 0x10}, ++ {0x90149, 0x710}, ++ {0x9014a, 0x849}, ++ {0x9014b, 0x0}, ++ {0x9014c, 0x4}, ++ {0x9014d, 0x48}, ++ {0x9014e, 0x0}, ++ {0x9014f, 0x710}, ++ {0x90150, 0x849}, ++ {0x90151, 0x0}, ++ {0x90152, 0x4}, ++ {0x90153, 0x48}, ++ {0x90154, 0x0}, ++ {0x90155, 0x4}, ++ {0x90156, 0x18}, ++ {0x90157, 0x0}, ++ {0x90158, 0x4}, ++ {0x90159, 0x18}, ++ {0x9015a, 0x0}, ++ {0x9015b, 0x4}, ++ {0x9015c, 0x18}, ++ {0x9015d, 0x0}, ++ {0x9015e, 0x8410}, ++ {0x9015f, 0x809}, ++ {0x90160, 0x0}, ++ {0x90161, 0x8498}, ++ {0x90162, 0x808}, ++ {0x90163, 0x5}, ++ {0x90164, 0x510}, ++ {0x90165, 0x809}, ++ {0x90166, 0x198}, ++ {0x90167, 0x1000}, ++ {0x90168, 0x809}, ++ {0x90169, 0x9}, ++ {0x9016a, 0x3c0}, ++ {0x9016b, 0x809}, ++ {0x9016c, 0x10}, ++ {0x9016d, 0x510}, ++ {0x9016e, 0x809}, ++ {0x9016f, 0x0}, ++ {0x90170, 0x3c0}, ++ {0x90171, 0x809}, ++ {0x90172, 0x18}, ++ {0x90173, 0x4}, ++ {0x90174, 0x8}, ++ {0x90175, 0x2}, ++ {0x90176, 0x510}, ++ {0x90177, 0x809}, ++ {0x90178, 0x2}, ++ {0x90179, 0x1000}, ++ {0x9017a, 0x809}, ++ {0x9017b, 0x68}, ++ {0x9017c, 0x801a}, ++ {0x9017d, 0x8}, ++ {0x9017e, 0x68}, ++ {0x9017f, 0x8022}, ++ {0x90180, 0x8}, ++ {0x90181, 0x479}, ++ {0x90182, 0xc7f8}, ++ {0x90183, 0x80c}, ++ {0x90184, 0x0}, ++ {0x90185, 0x0}, ++ {0x90186, 0x8}, ++ {0x90187, 0x68}, ++ {0x90188, 0x801a}, ++ {0x90189, 0x8}, ++ {0x9018a, 0x68}, ++ {0x9018b, 0x8022}, ++ {0x9018c, 0x8}, ++ {0x9018d, 0x9}, ++ {0x9018e, 0xc9c0}, ++ {0x9018f, 0xc0c}, ++ {0x90190, 0x0}, ++ {0x90191, 0xc870}, ++ {0x90192, 0xc0c}, ++ {0x90193, 0x0}, ++ {0x90194, 0x2a0}, ++ {0x90195, 0x809}, ++ {0x90196, 0x10}, ++ {0x90197, 0x8160}, ++ {0x90198, 0x89c}, ++ {0x90199, 0x2}, ++ {0x9019a, 0x7c8}, ++ {0x9019b, 0x809}, ++ {0x9019c, 0x0}, ++ {0x9019d, 0x1}, ++ {0x9019e, 0x8}, ++ {0x9019f, 0x40}, ++ {0x901a0, 0x1932}, ++ {0x901a1, 0x129}, ++ {0x901a2, 0xa}, ++ {0x901a3, 0xc140}, ++ {0x901a4, 0x80c}, ++ {0x901a5, 0x98}, ++ {0x901a6, 0x193a}, ++ {0x901a7, 0x129}, ++ {0x901a8, 0x90}, ++ {0x901a9, 0x1932}, ++ {0x901aa, 0x329}, ++ {0x901ab, 0x90}, ++ {0x901ac, 0x193a}, ++ {0x901ad, 0x329}, ++ {0x901ae, 0x88}, ++ {0x901af, 0x1882}, ++ {0x901b0, 0x9}, ++ {0x901b1, 0x0}, ++ {0x901b2, 0xc140}, ++ {0x901b3, 0x80c}, ++ {0x901b4, 0x10}, ++ {0x901b5, 0x400}, ++ {0x901b6, 0x80e}, ++ {0x901b7, 0xb}, ++ {0x901b8, 0x370}, ++ {0x901b9, 0x809}, ++ {0x901ba, 0x23b}, ++ {0x901bb, 0x100}, ++ {0x901bc, 0xcf9}, ++ {0x901bd, 0x0}, ++ {0x901be, 0x2a0}, ++ {0x901bf, 0x809}, ++ {0x901c0, 0x7800}, ++ {0x901c1, 0x8660}, ++ {0x901c2, 0x809}, ++ {0x901c3, 0xd}, ++ {0x901c4, 0x7c0}, ++ {0x901c5, 0x809}, ++ {0x901c6, 0x0}, ++ {0x901c7, 0x82b0}, ++ {0x901c8, 0x818}, ++ {0x901c9, 0x0}, ++ {0x901ca, 0x82b0}, ++ {0x901cb, 0x868}, ++ {0x901cc, 0x479}, ++ {0x901cd, 0xc7f8}, ++ {0x901ce, 0x91c}, ++ {0x901cf, 0x0}, ++ {0x901d0, 0x0}, ++ {0x901d1, 0x118}, ++ {0x901d2, 0x38}, ++ {0x901d3, 0x80a2}, ++ {0x901d4, 0x118}, ++ {0x901d5, 0x9}, ++ {0x901d6, 0xc9c0}, ++ {0x901d7, 0xd1c}, ++ {0x901d8, 0x0}, ++ {0x901d9, 0x0}, ++ {0x901da, 0x118}, ++ {0x901db, 0x8}, ++ {0x901dc, 0x508}, ++ {0x901dd, 0x809}, ++ {0x901de, 0x5}, ++ {0x901df, 0x7c0}, ++ {0x901e0, 0x809}, ++ {0x901e1, 0x8}, ++ {0x901e2, 0x82b0}, ++ {0x901e3, 0x868}, ++ {0x901e4, 0x8}, ++ {0x901e5, 0x82b0}, ++ {0x901e6, 0x818}, ++ {0x901e7, 0x8}, ++ {0x901e8, 0x82b0}, ++ {0x901e9, 0x888}, ++ {0x901ea, 0x10}, ++ {0x901eb, 0x510}, ++ {0x901ec, 0x809}, ++ {0x901ed, 0x0}, ++ {0x901ee, 0xa8}, ++ {0x901ef, 0x8c9}, ++ {0x901f0, 0x8}, ++ {0x901f1, 0x1900}, ++ {0x901f2, 0xc09}, ++ {0x901f3, 0x0}, ++ {0x901f4, 0x508}, ++ {0x901f5, 0x809}, ++ {0x901f6, 0x2}, ++ {0x901f7, 0x7c8}, ++ {0x901f8, 0x829}, ++ {0x901f9, 0xa}, ++ {0x901fa, 0x3c8}, ++ {0x901fb, 0xc29}, ++ {0x901fc, 0x199}, ++ {0x901fd, 0x3d0}, ++ {0x901fe, 0xc19}, ++ {0x901ff, 0x3}, ++ {0x90200, 0x0}, ++ {0x90201, 0x18}, ++ {0x90202, 0x38}, ++ {0x90203, 0x4}, ++ {0x90204, 0x18}, ++ {0x90205, 0x199}, ++ {0x90206, 0x3d0}, ++ {0x90207, 0xc09}, ++ {0x90208, 0x0}, ++ {0x90209, 0x0}, ++ {0x9020a, 0x8}, ++ {0x9020b, 0x9}, ++ {0x9020c, 0x150}, ++ {0x9020d, 0x809}, ++ {0x9020e, 0x9}, ++ {0x9020f, 0xc800}, ++ {0x90210, 0xc0c}, ++ {0x90211, 0x18}, ++ {0x90212, 0x8160}, ++ {0x90213, 0x8cc}, ++ {0x90214, 0x8}, ++ {0x90215, 0x13a}, ++ {0x90216, 0xc9}, ++ {0x90217, 0x24b}, ++ {0x90218, 0x100}, ++ {0x90219, 0x8c9}, ++ {0x9021a, 0x2}, ++ {0x9021b, 0x1}, ++ {0x9021c, 0xc8}, ++ {0x9021d, 0x0}, ++ {0x9021e, 0x100}, ++ {0x9021f, 0x8c9}, ++ {0x90220, 0x20}, ++ {0x90221, 0x4}, ++ {0x90222, 0xc8}, ++ {0x90223, 0x20}, ++ {0x90224, 0x4}, ++ {0x90225, 0xc8}, ++ {0x90226, 0x5}, ++ {0x90227, 0x0}, ++ {0x90228, 0xc8}, ++ {0x90229, 0x479}, ++ {0x9022a, 0xc7f8}, ++ {0x9022b, 0x8cc}, ++ {0x9022c, 0x0}, ++ {0x9022d, 0x0}, ++ {0x9022e, 0xc8}, ++ {0x9022f, 0x30}, ++ {0x90230, 0xaa}, ++ {0x90231, 0xc9}, ++ {0x90232, 0x9}, ++ {0x90233, 0xc9c0}, ++ {0x90234, 0xccc}, ++ {0x90235, 0x0}, ++ {0x90236, 0x0}, ++ {0x90237, 0xc8}, ++ {0x90238, 0x479}, ++ {0x90239, 0xc7f8}, ++ {0x9023a, 0x8bc}, ++ {0x9023b, 0x0}, ++ {0x9023c, 0x0}, ++ {0x9023d, 0xb8}, ++ {0x9023e, 0x30}, ++ {0x9023f, 0xaa}, ++ {0x90240, 0xb9}, ++ {0x90241, 0x9}, ++ {0x90242, 0xc9c0}, ++ {0x90243, 0xcbc}, ++ {0x90244, 0x0}, ++ {0x90245, 0x0}, ++ {0x90246, 0xb8}, ++ {0x90247, 0x25b}, ++ {0x90248, 0x100}, ++ {0x90249, 0xcc9}, ++ {0x9024a, 0x20}, ++ {0x9024b, 0x4}, ++ {0x9024c, 0xc8}, ++ {0x9024d, 0x20}, ++ {0x9024e, 0x4}, ++ {0x9024f, 0xc8}, ++ {0x90250, 0x20}, ++ {0x90251, 0x4}, ++ {0x90252, 0xa8}, ++ {0x90253, 0x4}, ++ {0x90254, 0x0}, ++ {0x90255, 0xc8}, ++ {0x90256, 0x9}, ++ {0x90257, 0xc800}, ++ {0x90258, 0xc6c}, ++ {0x90259, 0x26f}, ++ {0x9025a, 0x100}, ++ {0x9025b, 0xc19}, ++ {0x9025c, 0x8}, ++ {0x9025d, 0x4}, ++ {0x9025e, 0x18}, ++ {0x9025f, 0x27f}, ++ {0x90260, 0x100}, ++ {0x90261, 0xc19}, ++ {0x90262, 0x479}, ++ {0x90263, 0xc7f8}, ++ {0x90264, 0x80c}, ++ {0x90265, 0x0}, ++ {0x90266, 0x0}, ++ {0x90267, 0x8}, ++ {0x90268, 0x58}, ++ {0x90269, 0x8a}, ++ {0x9026a, 0x9}, ++ {0x9026b, 0x9}, ++ {0x9026c, 0xc9c0}, ++ {0x9026d, 0xc0c}, ++ {0x9026e, 0x0}, ++ {0x9026f, 0x0}, ++ {0x90270, 0x8}, ++ {0x90271, 0x18}, ++ {0x90272, 0x8160}, ++ {0x90273, 0x86c}, ++ {0x90274, 0x1008}, ++ {0x90275, 0x853b}, ++ {0x90276, 0x868}, ++ {0x90277, 0xc00}, ++ {0x90278, 0x8588}, ++ {0x90279, 0x868}, ++ {0x9027a, 0x8}, ++ {0x9027b, 0x85a8}, ++ {0x9027c, 0x868}, ++ {0x9027d, 0x8}, ++ {0x9027e, 0x85c8}, ++ {0x9027f, 0x868}, ++ {0x90280, 0x0}, ++ {0x90281, 0x8050}, ++ {0x90282, 0x868}, ++ {0x90283, 0x60}, ++ {0x90284, 0x138}, ++ {0x90285, 0x869}, ++ {0x90286, 0x18}, ++ {0x90287, 0x8510}, ++ {0x90288, 0x868}, ++ {0x90289, 0x18}, ++ {0x9028a, 0x2c8}, ++ {0x9028b, 0x869}, ++ {0x9028c, 0x10}, ++ {0x9028d, 0x8520}, ++ {0x9028e, 0x868}, ++ {0x9028f, 0x1ff8}, ++ {0x90290, 0x85d8}, ++ {0x90291, 0xc68}, ++ {0x90292, 0x0}, ++ {0x90293, 0xfdf0}, ++ {0x90294, 0x868}, ++ {0x90295, 0x8}, ++ {0x90296, 0x85f0}, ++ {0x90297, 0x868}, ++ {0x90298, 0x8}, ++ {0x90299, 0xa5f0}, ++ {0x9029a, 0x868}, ++ {0x9029b, 0x298}, ++ {0x9029c, 0x100}, ++ {0x9029d, 0x869}, ++ {0x9029e, 0x2}, ++ {0x9029f, 0x1}, ++ {0x902a0, 0x68}, ++ {0x902a1, 0x0}, ++ {0x902a2, 0x100}, ++ {0x902a3, 0x869}, ++ {0x902a4, 0x0}, ++ {0x902a5, 0x85f0}, ++ {0x902a6, 0x868}, ++ {0x902a7, 0x0}, ++ {0x902a8, 0xa5f0}, ++ {0x902a9, 0x868}, ++ {0x902aa, 0x33b}, ++ {0x902ab, 0x100}, ++ {0x902ac, 0x8c9}, ++ {0x902ad, 0x0}, ++ {0x902ae, 0x100}, ++ {0x902af, 0x8c9}, ++ {0x902b0, 0x1ff8}, ++ {0x902b1, 0x85d8}, ++ {0x902b2, 0xc68}, ++ {0x902b3, 0x8}, ++ {0x902b4, 0x8df0}, ++ {0x902b5, 0x868}, ++ {0x902b6, 0x8}, ++ {0x902b7, 0xadf0}, ++ {0x902b8, 0x868}, ++ {0x902b9, 0x2a8}, ++ {0x902ba, 0x100}, ++ {0x902bb, 0x869}, ++ {0x902bc, 0x2}, ++ {0x902bd, 0x1}, ++ {0x902be, 0x68}, ++ {0x902bf, 0x0}, ++ {0x902c0, 0x100}, ++ {0x902c1, 0x869}, ++ {0x902c2, 0x0}, ++ {0x902c3, 0x8df0}, ++ {0x902c4, 0x868}, ++ {0x902c5, 0x0}, ++ {0x902c6, 0xadf0}, ++ {0x902c7, 0x868}, ++ {0x902c8, 0x10}, ++ {0x902c9, 0x2c8}, ++ {0x902ca, 0x869}, ++ {0x902cb, 0x28}, ++ {0x902cc, 0x4}, ++ {0x902cd, 0x68}, ++ {0x902ce, 0xa}, ++ {0x902cf, 0x500}, ++ {0x902d0, 0xc69}, ++ {0x902d1, 0x0}, ++ {0x902d2, 0x8520}, ++ {0x902d3, 0x868}, ++ {0x902d4, 0x8}, ++ {0x902d5, 0x8530}, ++ {0x902d6, 0x868}, ++ {0x902d7, 0x2ba}, ++ {0x902d8, 0x100}, ++ {0x902d9, 0x869}, ++ {0x902da, 0x2}, ++ {0x902db, 0x1}, ++ {0x902dc, 0x68}, ++ {0x902dd, 0x2}, ++ {0x902de, 0x100}, ++ {0x902df, 0x869}, ++ {0x902e0, 0x0}, ++ {0x902e1, 0x8530}, ++ {0x902e2, 0x868}, ++ {0x902e3, 0x0}, ++ {0x902e4, 0x8510}, ++ {0x902e5, 0x868}, ++ {0x902e6, 0x0}, ++ {0x902e7, 0x2c8}, ++ {0x902e8, 0x869}, ++ {0x902e9, 0x8}, ++ {0x902ea, 0x8050}, ++ {0x902eb, 0x868}, ++ {0x902ec, 0x30}, ++ {0x902ed, 0x4}, ++ {0x902ee, 0x68}, ++ {0x902ef, 0x8}, ++ {0x902f0, 0x8520}, ++ {0x902f1, 0x868}, ++ {0x902f2, 0x0}, ++ {0x902f3, 0x8328}, ++ {0x902f4, 0x86b}, ++ {0x902f5, 0x2ca}, ++ {0x902f6, 0x100}, ++ {0x902f7, 0x869}, ++ {0x902f8, 0x2}, ++ {0x902f9, 0x1}, ++ {0x902fa, 0x68}, ++ {0x902fb, 0x4}, ++ {0x902fc, 0x100}, ++ {0x902fd, 0x869}, ++ {0x902fe, 0xff8}, ++ {0x902ff, 0x8328}, ++ {0x90300, 0x86b}, ++ {0x90301, 0x9}, ++ {0x90302, 0x500}, ++ {0x90303, 0xc29}, ++ {0x90304, 0x0}, ++ {0x90305, 0x8520}, ++ {0x90306, 0x868}, ++ {0x90307, 0x8}, ++ {0x90308, 0x3c8}, ++ {0x90309, 0xc29}, ++ {0x9030a, 0x0}, ++ {0x9030b, 0x150}, ++ {0x9030c, 0x809}, ++ {0x9030d, 0x2}, ++ {0x9030e, 0x370}, ++ {0x9030f, 0x809}, ++ {0x90310, 0x0}, ++ {0x90311, 0x400}, ++ {0x90312, 0x80e}, ++ {0x90313, 0x10}, ++ {0x90314, 0x4}, ++ {0x90315, 0x118}, ++ {0x90316, 0x20}, ++ {0x90317, 0x82b0}, ++ {0x90318, 0x808}, ++ {0x90319, 0x479}, ++ {0x9031a, 0xc7f8}, ++ {0x9031b, 0x80c}, ++ {0x9031c, 0x0}, ++ {0x9031d, 0x0}, ++ {0x9031e, 0x8}, ++ {0x9031f, 0x60}, ++ {0x90320, 0x8a}, ++ {0x90321, 0x9}, ++ {0x90322, 0x9}, ++ {0x90323, 0xc9c0}, ++ {0x90324, 0xc0c}, ++ {0x90325, 0x0}, ++ {0x90326, 0x0}, ++ {0x90327, 0x8}, ++ {0x90328, 0x8}, ++ {0x90329, 0x2a0}, ++ {0x9032a, 0x809}, ++ {0x9032b, 0x48}, ++ {0x9032c, 0xc822}, ++ {0x9032d, 0xc}, ++ {0x9032e, 0x48}, ++ {0x9032f, 0xcc32}, ++ {0x90330, 0xc}, ++ {0x90331, 0x9}, ++ {0x90332, 0xc800}, ++ {0x90333, 0xc0c}, ++ {0x90334, 0x0}, ++ {0x90335, 0x8168}, ++ {0x90336, 0x80c}, ++ {0x90337, 0x479}, ++ {0x90338, 0xc7f8}, ++ {0x90339, 0x91c}, ++ {0x9033a, 0x0}, ++ {0x9033b, 0x0}, ++ {0x9033c, 0x118}, ++ {0x9033d, 0x9190}, ++ {0x9033e, 0x80a1}, ++ {0x9033f, 0x918}, ++ {0x90340, 0x9}, ++ {0x90341, 0xc9c0}, ++ {0x90342, 0xd1c}, ++ {0x90343, 0x0}, ++ {0x90344, 0x0}, ++ {0x90345, 0x118}, ++ {0x90346, 0x18}, ++ {0x90347, 0xf0}, ++ {0x90348, 0x909}, ++ {0x90349, 0xa}, ++ {0x9034a, 0xc140}, ++ {0x9034b, 0x92c}, ++ {0x9034c, 0x88}, ++ {0x9034d, 0x1932}, ++ {0x9034e, 0x129}, ++ {0x9034f, 0x88}, ++ {0x90350, 0x193a}, ++ {0x90351, 0x129}, ++ {0x90352, 0x0}, ++ {0x90353, 0xc140}, ++ {0x90354, 0x92c}, ++ {0x90355, 0x8}, ++ {0x90356, 0x300}, ++ {0x90357, 0x819}, ++ {0x90358, 0x10}, ++ {0x90359, 0x8160}, ++ {0x9035a, 0x80c}, ++ {0x9035b, 0x8}, ++ {0x9035c, 0x7c8}, ++ {0x9035d, 0x801}, ++ {0x9035e, 0x8}, ++ {0x9035f, 0x0}, ++ {0x90360, 0x8}, ++ {0x90361, 0x8}, ++ {0x90362, 0x1880}, ++ {0x90363, 0x809}, ++ {0x90364, 0x10}, ++ {0x90365, 0x8160}, ++ {0x90366, 0x80c}, ++ {0x90367, 0x1800}, ++ {0x90368, 0x8660}, ++ {0x90369, 0x809}, ++ {0x9036a, 0x4000}, ++ {0x9036b, 0x8668}, ++ {0x9036c, 0x809}, ++ {0x9036d, 0x0}, ++ {0x9036e, 0xf0}, ++ {0x9036f, 0x909}, ++ {0x90370, 0xf}, ++ {0x90371, 0x7c0}, ++ {0x90372, 0x809}, ++ {0x90373, 0x0}, ++ {0x90374, 0x2a0}, ++ {0x90375, 0x809}, ++ {0x90376, 0x8}, ++ {0x90377, 0x618}, ++ {0x90378, 0x809}, ++ {0x90379, 0x0}, ++ {0x9037a, 0x84b8}, ++ {0x9037b, 0x808}, ++ {0x9037c, 0xff8}, ++ {0x9037d, 0x8410}, ++ {0x9037e, 0x809}, ++ {0x9037f, 0x7ff8}, ++ {0x90380, 0x8498}, ++ {0x90381, 0x808}, ++ {0x90382, 0x0}, ++ {0x90383, 0x7c8}, ++ {0x90384, 0x809}, ++ {0x90385, 0x8}, ++ {0x90386, 0x8168}, ++ {0x90387, 0x80c}, ++ {0x90388, 0x0}, ++ {0x90389, 0x1}, ++ {0x9038a, 0x8}, ++ {0x9038b, 0x0}, ++ {0x9038c, 0x4}, ++ {0x9038d, 0x8}, ++ {0x9038e, 0x0}, ++ {0x9038f, 0x4}, ++ {0x90390, 0x8}, ++ {0x90391, 0x18}, ++ {0x90392, 0x300}, ++ {0x90393, 0x809}, ++ {0x90394, 0x0}, ++ {0x90395, 0x480}, ++ {0x90396, 0x809}, ++ {0x90397, 0x8}, ++ {0x90398, 0x510}, ++ {0x90399, 0x809}, ++ {0x9039a, 0x7800}, ++ {0x9039b, 0x8660}, ++ {0x9039c, 0x809}, ++ {0x9039d, 0x18}, ++ {0x9039e, 0xf0}, ++ {0x9039f, 0x909}, ++ {0x903a0, 0x8}, ++ {0x903a1, 0x7c8}, ++ {0x903a2, 0x801}, ++ {0x903a3, 0x10}, ++ {0x903a4, 0x400}, ++ {0x903a5, 0x80e}, ++ {0x903a6, 0x8}, ++ {0x903a7, 0x150}, ++ {0x903a8, 0x809}, ++ {0x903a9, 0x9}, ++ {0x903aa, 0x370}, ++ {0x903ab, 0x809}, ++ {0x903ac, 0x18}, ++ {0x903ad, 0x8160}, ++ {0x903ae, 0x80c}, ++ {0x903af, 0x8}, ++ {0x903b0, 0xc800}, ++ {0x903b1, 0xc0c}, ++ {0x903b2, 0x8}, ++ {0x903b3, 0xc888}, ++ {0x903b4, 0xc04}, ++ {0x903b5, 0x20}, ++ {0x903b6, 0x8302}, ++ {0x903b7, 0xb}, ++ {0x903b8, 0x18}, ++ {0x903b9, 0x8582}, ++ {0x903ba, 0x8}, ++ {0x903bb, 0x9000}, ++ {0x903bc, 0x8539}, ++ {0x903bd, 0x808}, ++ {0x903be, 0x0}, ++ {0x903bf, 0x8588}, ++ {0x903c0, 0x808}, ++ {0x903c1, 0x40}, ++ {0x903c2, 0x85c8}, ++ {0x903c3, 0x808}, ++ {0x903c4, 0x0}, ++ {0x903c5, 0xfdf0}, ++ {0x903c6, 0x808}, ++ {0x903c7, 0x800}, ++ {0x903c8, 0xc5f0}, ++ {0x903c9, 0x808}, ++ {0x903ca, 0x1ff8}, ++ {0x903cb, 0xfdd8}, ++ {0x903cc, 0xc08}, ++ {0x903cd, 0x18}, ++ {0x903ce, 0xfda8}, ++ {0x903cf, 0x808}, ++ {0x903d0, 0x40}, ++ {0x903d1, 0x8520}, ++ {0x903d2, 0x8d8}, ++ {0x903d3, 0x80}, ++ {0x903d4, 0x8520}, ++ {0x903d5, 0x8e8}, ++ {0x903d6, 0x30a}, ++ {0x903d7, 0x100}, ++ {0x903d8, 0x8d9}, ++ {0x903d9, 0x32a}, ++ {0x903da, 0x100}, ++ {0x903db, 0x8e9}, ++ {0x903dc, 0x0}, ++ {0x903dd, 0x1}, ++ {0x903de, 0x8}, ++ {0x903df, 0x0}, ++ {0x903e0, 0x100}, ++ {0x903e1, 0x809}, ++ {0x903e2, 0x1ff8}, ++ {0x903e3, 0xfdd8}, ++ {0x903e4, 0xc08}, ++ {0x903e5, 0x8}, ++ {0x903e6, 0xfda8}, ++ {0x903e7, 0x808}, ++ {0x903e8, 0x140}, ++ {0x903e9, 0x8520}, ++ {0x903ea, 0x8d8}, ++ {0x903eb, 0x180}, ++ {0x903ec, 0x8520}, ++ {0x903ed, 0x8e8}, ++ {0x903ee, 0x30a}, ++ {0x903ef, 0x100}, ++ {0x903f0, 0x8d9}, ++ {0x903f1, 0x32a}, ++ {0x903f2, 0x100}, ++ {0x903f3, 0x8e9}, ++ {0x903f4, 0x0}, ++ {0x903f5, 0x1}, ++ {0x903f6, 0x8}, ++ {0x903f7, 0x0}, ++ {0x903f8, 0x100}, ++ {0x903f9, 0x809}, ++ {0x903fa, 0x9}, ++ {0x903fb, 0x500}, ++ {0x903fc, 0xc09}, ++ {0x903fd, 0x10}, ++ {0x903fe, 0x82b0}, ++ {0x903ff, 0x808}, ++ {0x90400, 0x0}, ++ {0x90401, 0x8520}, ++ {0x90402, 0x808}, ++ {0x90403, 0x8}, ++ {0x90404, 0x3c8}, ++ {0x90405, 0xc09}, ++ {0x90406, 0x0}, ++ {0x90407, 0x150}, ++ {0x90408, 0x809}, ++ {0x90409, 0x2}, ++ {0x9040a, 0x370}, ++ {0x9040b, 0x809}, ++ {0x9040c, 0x0}, ++ {0x9040d, 0x400}, ++ {0x9040e, 0x80e}, ++ {0x9040f, 0x8}, ++ {0x90410, 0xc848}, ++ {0x90411, 0xc0c}, ++ {0x90412, 0x0}, ++ {0x90413, 0xc890}, ++ {0x90414, 0x804}, ++ {0x90415, 0x20}, ++ {0x90416, 0x8302}, ++ {0x90417, 0xb}, ++ {0x90418, 0x18}, ++ {0x90419, 0x8582}, ++ {0x9041a, 0x8}, ++ {0x9041b, 0x0}, ++ {0x9041c, 0x82b0}, ++ {0x9041d, 0x808}, ++ {0x9041e, 0x1000}, ++ {0x9041f, 0x8539}, ++ {0x90420, 0x808}, ++ {0x90421, 0x0}, ++ {0x90422, 0x8588}, ++ {0x90423, 0x808}, ++ {0x90424, 0x40}, ++ {0x90425, 0x85c8}, ++ {0x90426, 0x808}, ++ {0x90427, 0x7f8}, ++ {0x90428, 0xfdf0}, ++ {0x90429, 0x808}, ++ {0x9042a, 0x800}, ++ {0x9042b, 0xc5f0}, ++ {0x9042c, 0x808}, ++ {0x9042d, 0x80}, ++ {0x9042e, 0x8088}, ++ {0x9042f, 0x80b}, ++ {0x90430, 0x1ff8}, ++ {0x90431, 0xfdd8}, ++ {0x90432, 0xc08}, ++ {0x90433, 0x18}, ++ {0x90434, 0xfda8}, ++ {0x90435, 0x808}, ++ {0x90436, 0x200}, ++ {0x90437, 0x8520}, ++ {0x90438, 0x8d8}, ++ {0x90439, 0x400}, ++ {0x9043a, 0x8520}, ++ {0x9043b, 0x8e8}, ++ {0x9043c, 0x2da}, ++ {0x9043d, 0x100}, ++ {0x9043e, 0x8d9}, ++ {0x9043f, 0x2ea}, ++ {0x90440, 0x100}, ++ {0x90441, 0x8e9}, ++ {0x90442, 0x2}, ++ {0x90443, 0x1}, ++ {0x90444, 0x8}, ++ {0x90445, 0x0}, ++ {0x90446, 0x100}, ++ {0x90447, 0x809}, ++ {0x90448, 0x1ff8}, ++ {0x90449, 0xfdd8}, ++ {0x9044a, 0xc08}, ++ {0x9044b, 0x8}, ++ {0x9044c, 0xfda8}, ++ {0x9044d, 0x808}, ++ {0x9044e, 0xa00}, ++ {0x9044f, 0x8520}, ++ {0x90450, 0x8d8}, ++ {0x90451, 0xc00}, ++ {0x90452, 0x8520}, ++ {0x90453, 0x8e8}, ++ {0x90454, 0x2da}, ++ {0x90455, 0x100}, ++ {0x90456, 0x8d9}, ++ {0x90457, 0x2ea}, ++ {0x90458, 0x100}, ++ {0x90459, 0x8e9}, ++ {0x9045a, 0x0}, ++ {0x9045b, 0x1}, ++ {0x9045c, 0x8}, ++ {0x9045d, 0x0}, ++ {0x9045e, 0x100}, ++ {0x9045f, 0x809}, ++ {0x90460, 0x9}, ++ {0x90461, 0x500}, ++ {0x90462, 0xc09}, ++ {0x90463, 0x10}, ++ {0x90464, 0x82b0}, ++ {0x90465, 0x808}, ++ {0x90466, 0x0}, ++ {0x90467, 0x8520}, ++ {0x90468, 0x808}, ++ {0x90469, 0x8}, ++ {0x9046a, 0x3c8}, ++ {0x9046b, 0xc09}, ++ {0x9046c, 0x0}, ++ {0x9046d, 0x150}, ++ {0x9046e, 0x809}, ++ {0x9046f, 0x2}, ++ {0x90470, 0x370}, ++ {0x90471, 0x809}, ++ {0x90472, 0x0}, ++ {0x90473, 0x400}, ++ {0x90474, 0x80e}, ++ {0x90475, 0x8}, ++ {0x90476, 0xc848}, ++ {0x90477, 0xc0c}, ++ {0x90478, 0x0}, ++ {0x90479, 0xc890}, ++ {0x9047a, 0x804}, ++ {0x9047b, 0x1008}, ++ {0x9047c, 0x853b}, ++ {0x9047d, 0x808}, ++ {0x9047e, 0xc00}, ++ {0x9047f, 0x8588}, ++ {0x90480, 0x808}, ++ {0x90481, 0x8}, ++ {0x90482, 0x85a8}, ++ {0x90483, 0x808}, ++ {0x90484, 0x8}, ++ {0x90485, 0x85c8}, ++ {0x90486, 0x808}, ++ {0x90487, 0x60}, ++ {0x90488, 0x138}, ++ {0x90489, 0x809}, ++ {0x9048a, 0x18}, ++ {0x9048b, 0xc8}, ++ {0x9048c, 0x809}, ++ {0x9048d, 0x0}, ++ {0x9048e, 0xa4}, ++ {0x9048f, 0x809}, ++ {0x90490, 0x0}, ++ {0x90491, 0x8510}, ++ {0x90492, 0x808}, ++ {0x90493, 0x2fa}, ++ {0x90494, 0x100}, ++ {0x90495, 0x8d9}, ++ {0x90496, 0x31a}, ++ {0x90497, 0x100}, ++ {0x90498, 0x8e9}, ++ {0x90499, 0x2}, ++ {0x9049a, 0x1}, ++ {0x9049b, 0x8}, ++ {0x9049c, 0x2}, ++ {0x9049d, 0x100}, ++ {0x9049e, 0x809}, ++ {0x9049f, 0x202}, ++ {0x904a0, 0x8510}, ++ {0x904a1, 0xc08}, ++ {0x904a2, 0x50}, ++ {0x904a3, 0xa2}, ++ {0x904a4, 0x9}, ++ {0x904a5, 0x0}, ++ {0x904a6, 0x0}, ++ {0x904a7, 0x8}, ++ {0x904a8, 0x0}, ++ {0x904a9, 0x0}, ++ {0x904aa, 0x8}, ++ {0x904ab, 0x0}, ++ {0x904ac, 0x0}, ++ {0x904ad, 0x8}, ++ {0x904ae, 0x0}, ++ {0x904af, 0xc8}, ++ {0x904b0, 0x809}, ++ {0x904b1, 0xb}, ++ {0x904b2, 0x508}, ++ {0x904b3, 0x809}, ++ {0x904b4, 0x8}, ++ {0x904b5, 0x1900}, ++ {0x904b6, 0xc09}, ++ {0x904b7, 0x2}, ++ {0x904b8, 0x0}, ++ {0x904b9, 0x8}, ++ {0x904ba, 0x0}, ++ {0x904bb, 0x508}, ++ {0x904bc, 0x809}, ++ {0x904bd, 0x9}, ++ {0x904be, 0x500}, ++ {0x904bf, 0xc09}, ++ {0x904c0, 0x10}, ++ {0x904c1, 0x82b0}, ++ {0x904c2, 0x808}, ++ {0x904c3, 0x0}, ++ {0x904c4, 0x8520}, ++ {0x904c5, 0x808}, ++ {0x904c6, 0x8}, ++ {0x904c7, 0x3c8}, ++ {0x904c8, 0xc09}, ++ {0x904c9, 0x0}, ++ {0x904ca, 0x150}, ++ {0x904cb, 0x809}, ++ {0x904cc, 0x2}, ++ {0x904cd, 0x370}, ++ {0x904ce, 0x809}, ++ {0x904cf, 0x0}, ++ {0x904d0, 0x400}, ++ {0x904d1, 0x80e}, ++ {0x904d2, 0x8}, ++ {0x904d3, 0xc848}, ++ {0x904d4, 0xc0c}, ++ {0x904d5, 0x0}, ++ {0x904d6, 0xc890}, ++ {0x904d7, 0x804}, ++ {0x904d8, 0x20}, ++ {0x904d9, 0x8302}, ++ {0x904da, 0xb}, ++ {0x904db, 0x18}, ++ {0x904dc, 0x8582}, ++ {0x904dd, 0x8}, ++ {0x904de, 0x1000}, ++ {0x904df, 0x8539}, ++ {0x904e0, 0x808}, ++ {0x904e1, 0x0}, ++ {0x904e2, 0x8588}, ++ {0x904e3, 0x808}, ++ {0x904e4, 0x40}, ++ {0x904e5, 0x85c8}, ++ {0x904e6, 0x808}, ++ {0x904e7, 0x8}, ++ {0x904e8, 0xfdf0}, ++ {0x904e9, 0x808}, ++ {0x904ea, 0x80}, ++ {0x904eb, 0x8088}, ++ {0x904ec, 0x80b}, ++ {0x904ed, 0x0}, ++ {0x904ee, 0x3b8}, ++ {0x904ef, 0x869}, ++ {0x904f0, 0x1ff8}, ++ {0x904f1, 0xfdd8}, ++ {0x904f2, 0xc08}, ++ {0x904f3, 0x18}, ++ {0x904f4, 0xfda8}, ++ {0x904f5, 0x808}, ++ {0x904f6, 0x40}, ++ {0x904f7, 0x8520}, ++ {0x904f8, 0x8d8}, ++ {0x904f9, 0x80}, ++ {0x904fa, 0x8520}, ++ {0x904fb, 0x8e8}, ++ {0x904fc, 0x2da}, ++ {0x904fd, 0x100}, ++ {0x904fe, 0x8d9}, ++ {0x904ff, 0x2ea}, ++ {0x90500, 0x100}, ++ {0x90501, 0x8e9}, ++ {0x90502, 0x2}, ++ {0x90503, 0x1}, ++ {0x90504, 0x8}, ++ {0x90505, 0x0}, ++ {0x90506, 0x100}, ++ {0x90507, 0x809}, ++ {0x90508, 0x1ff8}, ++ {0x90509, 0xfdd8}, ++ {0x9050a, 0xc08}, ++ {0x9050b, 0x8}, ++ {0x9050c, 0xfda8}, ++ {0x9050d, 0x808}, ++ {0x9050e, 0x140}, ++ {0x9050f, 0x8520}, ++ {0x90510, 0x8d8}, ++ {0x90511, 0x180}, ++ {0x90512, 0x8520}, ++ {0x90513, 0x8e8}, ++ {0x90514, 0x2da}, ++ {0x90515, 0x100}, ++ {0x90516, 0x8d9}, ++ {0x90517, 0x2ea}, ++ {0x90518, 0x100}, ++ {0x90519, 0x8e9}, ++ {0x9051a, 0x0}, ++ {0x9051b, 0x1}, ++ {0x9051c, 0x8}, ++ {0x9051d, 0x0}, ++ {0x9051e, 0x100}, ++ {0x9051f, 0x809}, ++ {0x90520, 0x9}, ++ {0x90521, 0x500}, ++ {0x90522, 0xc09}, ++ {0x90523, 0x10}, ++ {0x90524, 0x82b0}, ++ {0x90525, 0x808}, ++ {0x90526, 0x0}, ++ {0x90527, 0x8520}, ++ {0x90528, 0x808}, ++ {0x90529, 0x8}, ++ {0x9052a, 0x3c8}, ++ {0x9052b, 0xc09}, ++ {0x9052c, 0x0}, ++ {0x9052d, 0x150}, ++ {0x9052e, 0x809}, ++ {0x9052f, 0x2}, ++ {0x90530, 0x370}, ++ {0x90531, 0x809}, ++ {0x90532, 0x0}, ++ {0x90533, 0x400}, ++ {0x90534, 0x80e}, ++ {0x90535, 0x8}, ++ {0x90536, 0xc848}, ++ {0x90537, 0xc0c}, ++ {0x90538, 0x0}, ++ {0x90539, 0xc890}, ++ {0x9053a, 0x804}, ++ {0xd00e7, 0x600}, ++ {0x9001c, 0x0}, ++ {0x90020, 0x77}, ++ {0x90024, 0x82}, ++ {0x90025, 0x2b}, ++ {0x90026, 0x2b}, ++ {0x9002b, 0x110}, ++ {0x90708, 0x127}, ++ {0x90700, 0x14d}, ++ {0x90701, 0x16f}, ++ {0x90702, 0x18e}, ++ {0x90703, 0x12d}, ++ {0x90704, 0x0}, ++ {0x90705, 0x0}, ++ {0x90706, 0x0}, ++ {0x90707, 0x0}, ++ {0x2018a, 0x0}, ++ {0x20124, 0x1}, ++ {0x2018b, 0x16}, ++ {0x20125, 0x39}, ++ {0x2018c, 0x4e}, ++ {0x20126, 0x1}, ++ {0x2018d, 0x16}, ++ {0x20127, 0x39}, ++ {0x2018e, 0x4e}, ++ {0x20128, 0x17}, ++ {0x2018f, 0x27}, ++ {0x20129, 0x4f}, ++ {0x20190, 0x5f}, ++ {0x2012a, 0x17}, ++ {0x20191, 0x27}, ++ {0x2012b, 0x4f}, ++ {0x20192, 0x5f}, ++ {0x2012c, 0x28}, ++ {0x20193, 0x38}, ++ {0x2012d, 0x60}, ++ {0x20194, 0x70}, ++ {0x2012e, 0x28}, ++ {0x20195, 0x38}, ++ {0x2012f, 0x60}, ++ {0x20196, 0x70}, ++ {0x20130, 0x80}, ++ {0x20197, 0x80}, ++ {0x20131, 0x80}, ++ {0x20198, 0x80}, ++ {0x20132, 0x80}, ++ {0x20199, 0x80}, ++ {0x20133, 0x80}, ++ {0x2019a, 0x80}, ++ {0x20134, 0x71}, ++ {0x2019b, 0x74}, ++ {0x20135, 0x77}, ++ {0x2019c, 0x7a}, ++ {0x20136, 0x71}, ++ {0x2019d, 0x74}, ++ {0x20137, 0x77}, ++ {0x2019e, 0x7a}, ++ {0x20138, 0x75}, ++ {0x2019f, 0x76}, ++ {0x20139, 0x7b}, ++ {0x201a0, 0x7c}, ++ {0x2013a, 0x75}, ++ {0x201a1, 0x76}, ++ {0x2013b, 0x7b}, ++ {0x201a2, 0x7c}, ++ {0x2013c, 0x7d}, ++ {0x201a3, 0x7e}, ++ {0x2013d, 0x7d}, ++ {0x201a4, 0x7e}, ++ {0x2013e, 0x7d}, ++ {0x201a5, 0x7e}, ++ {0x2013f, 0x7d}, ++ {0x201a6, 0x7e}, ++ {0x20140, 0x7f}, ++ {0x201a7, 0x7f}, ++ {0x20141, 0x7f}, ++ {0x201a8, 0x7f}, ++ {0x20142, 0x7f}, ++ {0x201a9, 0x7f}, ++ {0x20143, 0x7f}, ++ {0x201aa, 0x7f}, ++ {0x20144, 0x80}, ++ {0x201ab, 0x7f}, ++ {0x20145, 0x80}, ++ {0x201ac, 0x7f}, ++ {0x20146, 0x80}, ++ {0x201ad, 0x7f}, ++ {0x20147, 0x80}, ++ {0x201ae, 0x7f}, ++ {0x20148, 0x81}, ++ {0x201af, 0x93}, ++ {0x20149, 0x81}, ++ {0x201b0, 0x93}, ++ {0x2014a, 0x10a}, ++ {0x201b1, 0x11b}, ++ {0x2014b, 0x10a}, ++ {0x201b2, 0x11b}, ++ {0x2014c, 0x94}, ++ {0x201b3, 0x9b}, ++ {0x2014d, 0x94}, ++ {0x201b4, 0x9b}, ++ {0x2014e, 0x11c}, ++ {0x201b5, 0x122}, ++ {0x2014f, 0x11c}, ++ {0x201b6, 0x122}, ++ {0x20150, 0x9c}, ++ {0x201b7, 0xaf}, ++ {0x20151, 0x9c}, ++ {0x201b8, 0xaf}, ++ {0x20152, 0x123}, ++ {0x201b9, 0x132}, ++ {0x20153, 0x123}, ++ {0x201ba, 0x132}, ++ {0x20154, 0xb0}, ++ {0x201bb, 0xc0}, ++ {0x20155, 0xb0}, ++ {0x201bc, 0xc0}, ++ {0x20156, 0x133}, ++ {0x201bd, 0x143}, ++ {0x20157, 0x133}, ++ {0x201be, 0x143}, ++ {0x20158, 0xc1}, ++ {0x201bf, 0xca}, ++ {0x20159, 0xc1}, ++ {0x201c0, 0xca}, ++ {0x2015a, 0x144}, ++ {0x201c1, 0x14d}, ++ {0x2015b, 0x144}, ++ {0x201c2, 0x14d}, ++ {0x2015c, 0xcb}, ++ {0x201c3, 0xd4}, ++ {0x2015d, 0xcb}, ++ {0x201c4, 0xd4}, ++ {0x2015e, 0x14e}, ++ {0x201c5, 0x157}, ++ {0x2015f, 0x14e}, ++ {0x201c6, 0x157}, ++ {0x20160, 0xd5}, ++ {0x201c7, 0xdf}, ++ {0x20161, 0xd5}, ++ {0x201c8, 0xdf}, ++ {0x20162, 0x158}, ++ {0x201c9, 0x161}, ++ {0x20163, 0x158}, ++ {0x201ca, 0x161}, ++ {0x20164, 0xe0}, ++ {0x201cb, 0xee}, ++ {0x20165, 0xe0}, ++ {0x201cc, 0xee}, ++ {0x20166, 0x162}, ++ {0x201cd, 0x170}, ++ {0x20167, 0x162}, ++ {0x201ce, 0x170}, ++ {0x20168, 0xef}, ++ {0x201cf, 0xf9}, ++ {0x20169, 0xef}, ++ {0x201d0, 0xf9}, ++ {0x2016a, 0x171}, ++ {0x201d1, 0x17a}, ++ {0x2016b, 0x171}, ++ {0x201d2, 0x17a}, ++ {0x2016c, 0xfa}, ++ {0x201d3, 0x108}, ++ {0x2016d, 0xfa}, ++ {0x201d4, 0x108}, ++ {0x2016e, 0x17b}, ++ {0x201d5, 0x189}, ++ {0x2016f, 0x17b}, ++ {0x201d6, 0x189}, ++ {0x20170, 0x109}, ++ {0x201d7, 0x109}, ++ {0x20171, 0x109}, ++ {0x201d8, 0x109}, ++ {0x20172, 0x18a}, ++ {0x201d9, 0x18a}, ++ {0x20173, 0x18a}, ++ {0x201da, 0x18a}, ++ {0x41613, 0xb00}, ++ {0x41617, 0x0}, ++ {0x4163b, 0xb00}, ++ {0x4163f, 0x0}, ++ {0x41663, 0xb00}, ++ {0x41667, 0x0}, ++ {0x4168b, 0xb00}, ++ {0x4168f, 0x0}, ++ {0x41723, 0xb00}, ++ {0x41727, 0x0}, ++ {0x4174b, 0xb00}, ++ {0x4174f, 0x0}, ++ {0x417f3, 0xb00}, ++ {0x417f7, 0x0}, ++ {0x4181b, 0xb00}, ++ {0x4181f, 0x0}, ++ {0x41a2b, 0x6b00}, ++ {0x41a2f, 0x0}, ++ {0x41a53, 0x3b00}, ++ {0x41a57, 0x800}, ++ {0x41a7b, 0x6b00}, ++ {0x41a7f, 0x0}, ++ {0x41aa3, 0x3b00}, ++ {0x41aa7, 0x800}, ++ {0x41b33, 0x6b00}, ++ {0x41b37, 0x0}, ++ {0x41b5b, 0x3b00}, ++ {0x41b5f, 0x800}, ++ {0x41bfb, 0x6b00}, ++ {0x41bff, 0x0}, ++ {0x41c23, 0x3b00}, ++ {0x41c27, 0x800}, ++ {0x41008, 0xc9d8}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0xc808}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x2b00}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0xc958}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0xcd88}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x2b00}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0xc0d8}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0xd848}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x2b00}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0xc158}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0xddc8}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x2b00}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0xc1d8}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0xc308}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x2b00}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0xc558}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0xea08}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x2b00}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0xc5d8}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0xe308}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x2b00}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x48d8}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x4248}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x88d8}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x9648}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x2b00}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0xca58}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0xc108}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x2b00}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0xcb58}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0xc008}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x2b00}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0xd4d8}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0xc008}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0xc0001, 0x5061}, ++ {0xc0002, 0x7098}, ++ {0xc0003, 0x0}, ++ {0xc0000, 0xbedc}, ++ {0xc0006, 0xb0db}, ++ {0xc0007, 0x0}, ++ {0x9070c, 0x0}, ++ {0x9070d, 0x7ff}, ++ {0x9070e, 0x668}, ++ {0x9070f, 0x7910}, ++ {0x90710, 0x355e}, ++ {0x90711, 0xcbb5}, ++ {0x90713, 0xffff}, ++ {0x90714, 0x710}, ++ {0x90715, 0x7800}, ++ {0x90c10, 0xffff}, ++ {0x90c12, 0xff10}, ++ {0x90712, 0x2ee8}, ++ {0x90c11, 0xffff}, ++ {0x90716, 0xffdf}, ++ {0x90717, 0x6f10}, ++ {0x90718, 0x6f10}, ++ {0x90719, 0x2868}, ++ {0x9071a, 0x2868}, ++ {0x9071b, 0xfeef}, ++ {0x90904, 0xe400}, ++ {0x90986, 0xe400}, ++ {0x90920, 0x0}, ++ {0x90921, 0x0}, ++ {0x90922, 0x0}, ++ {0x90923, 0x0}, ++ {0x90924, 0xff00}, ++ {0x90925, 0xff00}, ++ {0x90926, 0xff00}, ++ {0x90927, 0xff00}, ++ {0x90930, 0x4000}, ++ {0x90931, 0x2000}, ++ {0x90932, 0xff00}, ++ {0x90933, 0xff00}, ++ {0x9090a, 0x0}, ++ {0x9090c, 0x0}, ++ {0x9090d, 0x1}, ++ {0x200f0, 0x27f7}, ++ {0x200f1, 0x2108}, ++ {0x200f2, 0x2108}, ++ {0x100b9, 0x1}, ++ {0x100b1, 0x180}, ++ {0x100ba, 0x1}, ++ {0x100a2, 0x0}, ++ {0x100b5, 0x1}, ++ {0x110b9, 0x1}, ++ {0x110b1, 0x180}, ++ {0x110ba, 0x1}, ++ {0x110a2, 0x0}, ++ {0x110b5, 0x1}, ++ {0x120b9, 0x1}, ++ {0x120b1, 0x180}, ++ {0x120ba, 0x1}, ++ {0x120a2, 0x0}, ++ {0x120b5, 0x1}, ++ {0x130b9, 0x1}, ++ {0x130b1, 0x180}, ++ {0x130ba, 0x1}, ++ {0x130a2, 0x0}, ++ {0x130b5, 0x1}, ++ {0x70024, 0x5a3c}, ++ {0x70025, 0x5a3c}, ++ {0x70026, 0x5a3c}, ++ {0x70027, 0x5a3c}, ++ {0x70028, 0x5a3c}, ++ {0x70029, 0x5a3c}, ++ {0x7002a, 0x5a3c}, ++ {0x7002b, 0x5a3c}, ++ {0x70124, 0x5a3c}, ++ {0x70125, 0x5a3c}, ++ {0x70126, 0x5a3c}, ++ {0x70127, 0x5a3c}, ++ {0x70128, 0x5a3c}, ++ {0x70129, 0x5a3c}, ++ {0x7012a, 0x5a3c}, ++ {0x7012b, 0x5a3c}, ++ {0x70224, 0x5a3c}, ++ {0x70225, 0x5a3c}, ++ {0x70226, 0x5a3c}, ++ {0x70227, 0x5a3c}, ++ {0x70228, 0x5a3c}, ++ {0x70229, 0x5a3c}, ++ {0x7022a, 0x5a3c}, ++ {0x7022b, 0x5a3c}, ++ {0x70324, 0x5a3c}, ++ {0x70325, 0x5a3c}, ++ {0x70326, 0x5a3c}, ++ {0x70327, 0x5a3c}, ++ {0x70328, 0x5a3c}, ++ {0x70329, 0x5a3c}, ++ {0x7032a, 0x5a3c}, ++ {0x7032b, 0x5a3c}, ++ {0x70424, 0x5a3c}, ++ {0x70425, 0x5a3c}, ++ {0x70426, 0x5a3c}, ++ {0x70427, 0x5a3c}, ++ {0x70428, 0x5a3c}, ++ {0x70429, 0x5a3c}, ++ {0x7042a, 0x5a3c}, ++ {0x7042b, 0x5a3c}, ++ {0x70524, 0x5a3c}, ++ {0x70525, 0x5a3c}, ++ {0x70526, 0x5a3c}, ++ {0x70527, 0x5a3c}, ++ {0x70528, 0x5a3c}, ++ {0x70529, 0x5a3c}, ++ {0x7052a, 0x5a3c}, ++ {0x7052b, 0x5a3c}, ++ {0x70624, 0x5a3c}, ++ {0x70625, 0x5a3c}, ++ {0x70626, 0x5a3c}, ++ {0x70627, 0x5a3c}, ++ {0x70628, 0x5a3c}, ++ {0x70629, 0x5a3c}, ++ {0x7062a, 0x5a3c}, ++ {0x7062b, 0x5a3c}, ++ {0x70724, 0x5a3c}, ++ {0x70725, 0x5a3c}, ++ {0x70726, 0x5a3c}, ++ {0x70727, 0x5a3c}, ++ {0x70728, 0x5a3c}, ++ {0x70729, 0x5a3c}, ++ {0x7072a, 0x5a3c}, ++ {0x7072b, 0x5a3c}, ++ {0x70824, 0x5a3c}, ++ {0x70825, 0x5a3c}, ++ {0x70826, 0x5a3c}, ++ {0x70827, 0x5a3c}, ++ {0x70828, 0x5a3c}, ++ {0x70829, 0x5a3c}, ++ {0x7082a, 0x5a3c}, ++ {0x7082b, 0x5a3c}, ++ {0x70065, 0x1ff}, ++ {0x2007e, 0x33}, ++ {0x200ef, 0xffff}, ++ {0x90910, 0x2}, ++ {0x20310, 0x1}, ++ {0x20311, 0x1}, ++ {0xc0080, 0x2}, ++ {0xd0003, 0x0}, ++}; ++ ++static struct dram_fsp_msg ddr_dram_fsp_msg[] = { ++ { ++ /* P0 6400mbps */ ++ .drate = 6400, ++ .ssc = false, ++ .fsp_phy_cfg = ddr_phy_fsp0_cfg, ++ .fsp_phy_cfg_num = ARRAY_SIZE(ddr_phy_fsp0_cfg), ++ .fw_type = FW_1D_IMAGE, ++ .fsp_phy_msgh_cfg = ddr_phy_msgh_fsp0_cfg, ++ .fsp_phy_msgh_cfg_num = ARRAY_SIZE(ddr_phy_msgh_fsp0_cfg), ++ .fsp_phy_pie_cfg = ddr_phy_pie_fsp0_cfg, ++ .fsp_phy_pie_cfg_num = ARRAY_SIZE(ddr_phy_pie_fsp0_cfg), ++ }, ++}; ++ ++/* dram fsp cfg */ ++static struct dram_fsp_cfg ddr_dram_fsp_cfg[] = { ++ { ++ .ddrc_cfg = ddr_dram_fsp0_ddrc_cfg, ++ .ddrc_cfg_num = ARRAY_SIZE(ddr_dram_fsp0_ddrc_cfg), ++ .bypass = 0, ++ }, ++}; ++ ++/* ddr timing config params */ ++struct dram_timing_info dram_timing = { ++ .ddrc_cfg = ddr_ddrc_cfg, ++ .ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg), ++ .ddrphy_cfg = ddr_ddrphy_cfg, ++ .ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg), ++ .fsp_msg = ddr_dram_fsp_msg, ++ .fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg), ++ .ddrphy_trained_csr = ddr_ddrphy_trained_csr, ++ .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr), ++ .ddrphy_pie = ddr_phy_pie, ++ .ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie), ++ .fsp_table = { 6400, }, ++ .fsp_cfg = ddr_dram_fsp_cfg, ++ .fsp_cfg_num = ARRAY_SIZE(ddr_dram_fsp_cfg), ++}; +diff --git a/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_timing.c b/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_timing.c +new file mode 100644 +index 000000000000..59199b033b17 +--- /dev/null ++++ b/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_timing.c +@@ -0,0 +1,10752 @@ ++/* ++ * Copyright 2023-2025 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ * ++ * Code generated with DDR Tool v3.7.0_0.2-4600df02. ++ * DDR PHY FW2024.09 ++ * Chip revision: B0 ++ */ ++ ++#include "ddr.h" ++ ++/* Initialize DDRC registers */ ++static struct ddrc_cfg_param ddr_ddrc_cfg[] = { ++ {0x5e080110, 0x41114001U}, ++ {0x5e080000, 0x3ffU}, ++ {0x5e080008, 0x0U}, ++ {0x5e080010, 0x4U}, ++ {0x5e080014, 0x80000U}, ++ {0x5e080020, 0x80000000U}, ++ {0x5e080024, 0x80007ffU}, ++ {0x5e080028, 0x80000000U}, ++ {0x5e08002c, 0x7ffU}, ++ {0x5e080080, 0x80800522U}, ++ {0x5e080084, 0x80800522U}, ++ {0x5e080114, 0x201000U}, ++ {0x5e080260, 0x800a1U}, ++ {0x5e080268, 0x0U}, ++ {0x5e08026c, 0x3d04U}, ++ {0x5e080278, 0x10U}, ++ {0x5e080800, 0x43d3b000U}, ++ {0x5e080804, 0x1f1f1f1fU}, ++ {0x5e080810, 0x14084060U}, ++ {0x5e080c00, 0x40000000U}, ++ {0x5e081000, 0xe3U}, ++ {0x5e081220, 0x0U}, ++ {0x5e081224, 0x0U}, ++ {0x5e081228, 0x0U}, ++ {0x5e08122c, 0x0U}, ++ {0x5e081230, 0x0U}, ++ {0x5e081234, 0x0U}, ++ {0x5e081238, 0x0U}, ++ {0x5e08123c, 0x0U}, ++ {0x5e081240, 0x0U}, ++ {0x5e081244, 0x0U}, ++ {0x5e081248, 0x0U}, ++ {0x5e08124c, 0x0U}, ++ {0x5e081250, 0x0U}, ++ {0x5e081254, 0x0U}, ++ {0x5e081258, 0x0U}, ++ {0x5e08125c, 0x0U}, ++}; ++ ++/* DRAM fsp configurations */ ++static struct ddrc_cfg_param ddr_dram_fsp0_ddrc_cfg[] = { ++ {0x5e080100, 0x020D2100U}, ++ {0x5e080104, 0x4866000CU}, ++ {0x5e080108, 0xF2F28D47U}, ++ {0x5e08010C, 0x20488010U}, ++ {0x5e080124, 0x0C230000U}, ++ {0x5e080160, 0x00000101U}, ++ {0x5e08016C, 0x01300000U}, ++ {0x5e080170, 0x8C010509U}, ++ {0x5e080250, 0x00110C11U}, ++ {0x5e080254, 0x00680040U}, ++ {0x5e080258, 0x03003E80U}, ++ {0x5e08025C, 0x40520200U}, ++ {0x5e080300, 0x08110809U}, ++ {0x5e080304, 0x00680F02U}, ++ {0x5e080308, 0x06040603U}, ++ {0x5e08030C, 0x0030001CU}, ++ {0x5e080310, 0x20610000U}, ++ {0x5e080314, 0x0A0A0407U}, ++}; ++ ++/* PHY Initialize Configuration */ ++static struct ddrphy_cfg_param ddr_ddrphy_cfg[] = { ++ {0x10080, 0x7}, ++ {0x10081, 0x5}, ++ {0x10082, 0x6}, ++ {0x10083, 0x1}, ++ {0x10084, 0x2}, ++ {0x10085, 0x0}, ++ {0x10086, 0x3}, ++ {0x10087, 0x4}, ++ {0x11080, 0x0}, ++ {0x11081, 0x1}, ++ {0x11082, 0x2}, ++ {0x11083, 0x3}, ++ {0x11084, 0x4}, ++ {0x11085, 0x7}, ++ {0x11086, 0x6}, ++ {0x11087, 0x5}, ++ {0x12080, 0x5}, ++ {0x12081, 0x6}, ++ {0x12082, 0x1}, ++ {0x12083, 0x7}, ++ {0x12084, 0x4}, ++ {0x12085, 0x2}, ++ {0x12086, 0x0}, ++ {0x12087, 0x3}, ++ {0x13080, 0x0}, ++ {0x13081, 0x3}, ++ {0x13082, 0x2}, ++ {0x13083, 0x7}, ++ {0x13084, 0x4}, ++ {0x13085, 0x5}, ++ {0x13086, 0x6}, ++ {0x13087, 0x1}, ++ {0x30090, 0x4}, ++ {0x30091, 0x3}, ++ {0x30092, 0x6}, ++ {0x30093, 0x0}, ++ {0x30094, 0x5}, ++ {0x30095, 0x1}, ++ {0x30096, 0x2}, ++ {0x31090, 0x1}, ++ {0x31091, 0x3}, ++ {0x31092, 0x4}, ++ {0x31093, 0x6}, ++ {0x31094, 0x2}, ++ {0x31095, 0x0}, ++ {0x31096, 0x5}, ++ {0x20060, 0x2}, ++ {0x200a5, 0x1}, ++ {0xd0036, 0x0}, ++ {0x200bd, 0xff}, ++ {0x20300, 0x808}, ++ {0x20303, 0x9}, ++ {0x20302, 0x26}, ++ {0x20328, 0x0}, ++ {0x20301, 0x3}, ++ {0x2030b, 0x0}, ++ {0x300a7, 0x0}, ++ {0x310a7, 0x0}, ++ {0x300ae, 0x80}, ++ {0x300ad, 0x80}, ++ {0x300ac, 0x80}, ++ {0x310ae, 0x80}, ++ {0x310ad, 0x80}, ++ {0x310ac, 0x80}, ++ {0xc0086, 0x0}, ++ {0x100a3, 0xb33}, ++ {0x110a3, 0xb33}, ++ {0x120a3, 0xb33}, ++ {0x130a3, 0xb33}, ++ {0xc00f1, 0x6000}, ++ {0xc00f2, 0xa9}, ++ {0xc00f3, 0x8000}, ++ {0xc00f4, 0x5}, ++ {0xc00f5, 0x4000}, ++ {0xc00f6, 0x2}, ++ {0xc00f7, 0xf000}, ++ {0xc00f9, 0x6000}, ++ {0xc00fa, 0xa9}, ++ {0xc00fb, 0x8000}, ++ {0xc00fd, 0x4000}, ++ {0xc00ff, 0xf000}, ++ {0x908ff, 0xf}, ++ {0x10093, 0x0}, ++ {0x11093, 0x0}, ++ {0x12093, 0x0}, ++ {0x13093, 0x0}, ++ {0x20051, 0x3}, ++}; ++ ++/* PHY trained csr */ ++static struct ddrphy_cfg_param ddr_ddrphy_trained_csr[] = { ++ {0x200a5, 0x0}, ++ {0xd0036, 0x0}, ++ {0x200bd, 0x0}, ++ {0x20300, 0x0}, ++ {0x20303, 0x0}, ++ {0x20302, 0x0}, ++ {0x20328, 0x0}, ++ {0x20301, 0x0}, ++ {0x2030b, 0x0}, ++ {0x300a7, 0x0}, ++ {0x310a7, 0x0}, ++ {0x300ae, 0x0}, ++ {0x300ad, 0x0}, ++ {0x300ac, 0x0}, ++ {0x310ae, 0x0}, ++ {0x310ad, 0x0}, ++ {0x310ac, 0x0}, ++ {0xc0086, 0x0}, ++ {0x100a3, 0x0}, ++ {0x110a3, 0x0}, ++ {0x120a3, 0x0}, ++ {0x130a3, 0x0}, ++ {0xc00f1, 0x0}, ++ {0xc00f2, 0x0}, ++ {0xc00f3, 0x0}, ++ {0xc00f4, 0x0}, ++ {0xc00f5, 0x0}, ++ {0xc00f6, 0x0}, ++ {0xc00f7, 0x0}, ++ {0xc00f9, 0x0}, ++ {0xc00fa, 0x0}, ++ {0xc00fb, 0x0}, ++ {0xc00fd, 0x0}, ++ {0xc00ff, 0x0}, ++ {0x908ff, 0x0}, ++ {0x10093, 0x0}, ++ {0x11093, 0x0}, ++ {0x12093, 0x0}, ++ {0x13093, 0x0}, ++ {0x20051, 0x0}, ++ {0x90802, 0x0}, ++ {0x20002, 0x0}, ++ {0x20000, 0x0}, ++ {0x90801, 0x0}, ++ {0x90809, 0x0}, ++ {0x1005e, 0x0}, ++ {0x10060, 0x0}, ++ {0x10062, 0x0}, ++ {0x10064, 0x0}, ++ {0x1005f, 0x0}, ++ {0x10061, 0x0}, ++ {0x10063, 0x0}, ++ {0x10065, 0x0}, ++ {0x1105e, 0x0}, ++ {0x11060, 0x0}, ++ {0x11062, 0x0}, ++ {0x11064, 0x0}, ++ {0x1105f, 0x0}, ++ {0x11061, 0x0}, ++ {0x11063, 0x0}, ++ {0x11065, 0x0}, ++ {0x1205e, 0x0}, ++ {0x12060, 0x0}, ++ {0x12062, 0x0}, ++ {0x12064, 0x0}, ++ {0x1205f, 0x0}, ++ {0x12061, 0x0}, ++ {0x12063, 0x0}, ++ {0x12065, 0x0}, ++ {0x1305e, 0x0}, ++ {0x13060, 0x0}, ++ {0x13062, 0x0}, ++ {0x13064, 0x0}, ++ {0x1305f, 0x0}, ++ {0x13061, 0x0}, ++ {0x13063, 0x0}, ++ {0x13065, 0x0}, ++ {0x10005, 0x0}, ++ {0x1000b, 0x0}, ++ {0x11005, 0x0}, ++ {0x1100b, 0x0}, ++ {0x12005, 0x0}, ++ {0x1200b, 0x0}, ++ {0x13005, 0x0}, ++ {0x1300b, 0x0}, ++ {0x20007, 0x0}, ++ {0x20013, 0x0}, ++ {0x30038, 0x0}, ++ {0x30039, 0x0}, ++ {0x3003a, 0x0}, ++ {0x31038, 0x0}, ++ {0x31039, 0x0}, ++ {0x3103a, 0x0}, ++ {0x10038, 0x0}, ++ {0x1003a, 0x0}, ++ {0x11038, 0x0}, ++ {0x1103a, 0x0}, ++ {0x12038, 0x0}, ++ {0x1203a, 0x0}, ++ {0x13038, 0x0}, ++ {0x1303a, 0x0}, ++ {0x1003b, 0x0}, ++ {0x1103b, 0x0}, ++ {0x1203b, 0x0}, ++ {0x1303b, 0x0}, ++ {0x10009, 0x0}, ++ {0x10037, 0x0}, ++ {0x11009, 0x0}, ++ {0x11037, 0x0}, ++ {0x12009, 0x0}, ++ {0x12037, 0x0}, ++ {0x13009, 0x0}, ++ {0x13037, 0x0}, ++ {0x10004, 0x0}, ++ {0x10003, 0x0}, ++ {0x11004, 0x0}, ++ {0x11003, 0x0}, ++ {0x12004, 0x0}, ++ {0x12003, 0x0}, ++ {0x13004, 0x0}, ++ {0x13003, 0x0}, ++ {0x20004, 0x0}, ++ {0x30050, 0x0}, ++ {0x30051, 0x0}, ++ {0x30052, 0x0}, ++ {0x30053, 0x0}, ++ {0x31050, 0x0}, ++ {0x31051, 0x0}, ++ {0x31052, 0x0}, ++ {0x31053, 0x0}, ++ {0x1004e, 0x0}, ++ {0x1004f, 0x0}, ++ {0x10050, 0x0}, ++ {0x10051, 0x0}, ++ {0x1014e, 0x0}, ++ {0x1014f, 0x0}, ++ {0x10150, 0x0}, ++ {0x10151, 0x0}, ++ {0x1024e, 0x0}, ++ {0x1024f, 0x0}, ++ {0x10250, 0x0}, ++ {0x10251, 0x0}, ++ {0x1034e, 0x0}, ++ {0x1034f, 0x0}, ++ {0x10350, 0x0}, ++ {0x10351, 0x0}, ++ {0x1044e, 0x0}, ++ {0x1044f, 0x0}, ++ {0x10450, 0x0}, ++ {0x10451, 0x0}, ++ {0x1054e, 0x0}, ++ {0x1054f, 0x0}, ++ {0x10550, 0x0}, ++ {0x10551, 0x0}, ++ {0x1064e, 0x0}, ++ {0x1064f, 0x0}, ++ {0x10650, 0x0}, ++ {0x10651, 0x0}, ++ {0x1074e, 0x0}, ++ {0x1074f, 0x0}, ++ {0x10750, 0x0}, ++ {0x10751, 0x0}, ++ {0x1084e, 0x0}, ++ {0x1084f, 0x0}, ++ {0x10850, 0x0}, ++ {0x10851, 0x0}, ++ {0x1104e, 0x0}, ++ {0x1104f, 0x0}, ++ {0x11050, 0x0}, ++ {0x11051, 0x0}, ++ {0x1114e, 0x0}, ++ {0x1114f, 0x0}, ++ {0x11150, 0x0}, ++ {0x11151, 0x0}, ++ {0x1124e, 0x0}, ++ {0x1124f, 0x0}, ++ {0x11250, 0x0}, ++ {0x11251, 0x0}, ++ {0x1134e, 0x0}, ++ {0x1134f, 0x0}, ++ {0x11350, 0x0}, ++ {0x11351, 0x0}, ++ {0x1144e, 0x0}, ++ {0x1144f, 0x0}, ++ {0x11450, 0x0}, ++ {0x11451, 0x0}, ++ {0x1154e, 0x0}, ++ {0x1154f, 0x0}, ++ {0x11550, 0x0}, ++ {0x11551, 0x0}, ++ {0x1164e, 0x0}, ++ {0x1164f, 0x0}, ++ {0x11650, 0x0}, ++ {0x11651, 0x0}, ++ {0x1174e, 0x0}, ++ {0x1174f, 0x0}, ++ {0x11750, 0x0}, ++ {0x11751, 0x0}, ++ {0x1184e, 0x0}, ++ {0x1184f, 0x0}, ++ {0x11850, 0x0}, ++ {0x11851, 0x0}, ++ {0x1204e, 0x0}, ++ {0x1204f, 0x0}, ++ {0x12050, 0x0}, ++ {0x12051, 0x0}, ++ {0x1214e, 0x0}, ++ {0x1214f, 0x0}, ++ {0x12150, 0x0}, ++ {0x12151, 0x0}, ++ {0x1224e, 0x0}, ++ {0x1224f, 0x0}, ++ {0x12250, 0x0}, ++ {0x12251, 0x0}, ++ {0x1234e, 0x0}, ++ {0x1234f, 0x0}, ++ {0x12350, 0x0}, ++ {0x12351, 0x0}, ++ {0x1244e, 0x0}, ++ {0x1244f, 0x0}, ++ {0x12450, 0x0}, ++ {0x12451, 0x0}, ++ {0x1254e, 0x0}, ++ {0x1254f, 0x0}, ++ {0x12550, 0x0}, ++ {0x12551, 0x0}, ++ {0x1264e, 0x0}, ++ {0x1264f, 0x0}, ++ {0x12650, 0x0}, ++ {0x12651, 0x0}, ++ {0x1274e, 0x0}, ++ {0x1274f, 0x0}, ++ {0x12750, 0x0}, ++ {0x12751, 0x0}, ++ {0x1284e, 0x0}, ++ {0x1284f, 0x0}, ++ {0x12850, 0x0}, ++ {0x12851, 0x0}, ++ {0x1304e, 0x0}, ++ {0x1304f, 0x0}, ++ {0x13050, 0x0}, ++ {0x13051, 0x0}, ++ {0x1314e, 0x0}, ++ {0x1314f, 0x0}, ++ {0x13150, 0x0}, ++ {0x13151, 0x0}, ++ {0x1324e, 0x0}, ++ {0x1324f, 0x0}, ++ {0x13250, 0x0}, ++ {0x13251, 0x0}, ++ {0x1334e, 0x0}, ++ {0x1334f, 0x0}, ++ {0x13350, 0x0}, ++ {0x13351, 0x0}, ++ {0x1344e, 0x0}, ++ {0x1344f, 0x0}, ++ {0x13450, 0x0}, ++ {0x13451, 0x0}, ++ {0x1354e, 0x0}, ++ {0x1354f, 0x0}, ++ {0x13550, 0x0}, ++ {0x13551, 0x0}, ++ {0x1364e, 0x0}, ++ {0x1364f, 0x0}, ++ {0x13650, 0x0}, ++ {0x13651, 0x0}, ++ {0x1374e, 0x0}, ++ {0x1374f, 0x0}, ++ {0x13750, 0x0}, ++ {0x13751, 0x0}, ++ {0x1384e, 0x0}, ++ {0x1384f, 0x0}, ++ {0x13850, 0x0}, ++ {0x13851, 0x0}, ++ {0x30030, 0x0}, ++ {0x30031, 0x0}, ++ {0x30035, 0x0}, ++ {0x31030, 0x0}, ++ {0x31031, 0x0}, ++ {0x31035, 0x0}, ++ {0x10030, 0x0}, ++ {0x10035, 0x0}, ++ {0x10036, 0x0}, ++ {0x11030, 0x0}, ++ {0x11035, 0x0}, ++ {0x11036, 0x0}, ++ {0x12030, 0x0}, ++ {0x12035, 0x0}, ++ {0x12036, 0x0}, ++ {0x13030, 0x0}, ++ {0x13035, 0x0}, ++ {0x13036, 0x0}, ++ {0x3003c, 0x0}, ++ {0x3103c, 0x0}, ++ {0x1003c, 0x0}, ++ {0x1003d, 0x0}, ++ {0x1003e, 0x0}, ++ {0x1103c, 0x0}, ++ {0x1103d, 0x0}, ++ {0x1103e, 0x0}, ++ {0x1203c, 0x0}, ++ {0x1203d, 0x0}, ++ {0x1203e, 0x0}, ++ {0x1303c, 0x0}, ++ {0x1303d, 0x0}, ++ {0x1303e, 0x0}, ++ {0x20003, 0x0}, ++ {0x10006, 0x0}, ++ {0x11006, 0x0}, ++ {0x12006, 0x0}, ++ {0x13006, 0x0}, ++ {0x20001, 0x0}, ++ {0x20009, 0x0}, ++ {0x20008, 0x0}, ++ {0x200d9, 0x0}, ++ {0x30eef, 0x0}, ++ {0x31eef, 0x0}, ++ {0x20014, 0x0}, ++ {0x9080a, 0x0}, ++ {0x10040, 0x0}, ++ {0x10042, 0x0}, ++ {0x9080d, 0x0}, ++ {0x10043, 0x0}, ++ {0x10044, 0x0}, ++ {0x10045, 0x0}, ++ {0x11040, 0x0}, ++ {0x11042, 0x0}, ++ {0x11043, 0x0}, ++ {0x11044, 0x0}, ++ {0x11045, 0x0}, ++ {0x12040, 0x0}, ++ {0x12042, 0x0}, ++ {0x12043, 0x0}, ++ {0x12044, 0x0}, ++ {0x12045, 0x0}, ++ {0x13040, 0x0}, ++ {0x13042, 0x0}, ++ {0x13043, 0x0}, ++ {0x13044, 0x0}, ++ {0x13045, 0x0}, ++ {0x30040, 0x0}, ++ {0x30041, 0x0}, ++ {0x30042, 0x0}, ++ {0x30043, 0x0}, ++ {0x30330, 0x0}, ++ {0x31040, 0x0}, ++ {0x31041, 0x0}, ++ {0x31042, 0x0}, ++ {0x31043, 0x0}, ++ {0x31330, 0x0}, ++ {0x20331, 0x0}, ++ {0x10048, 0x0}, ++ {0x1004a, 0x0}, ++ {0x1004b, 0x0}, ++ {0x1004c, 0x0}, ++ {0x1004d, 0x0}, ++ {0x11048, 0x0}, ++ {0x1104a, 0x0}, ++ {0x1104b, 0x0}, ++ {0x1104c, 0x0}, ++ {0x1104d, 0x0}, ++ {0x12048, 0x0}, ++ {0x1204a, 0x0}, ++ {0x1204b, 0x0}, ++ {0x1204c, 0x0}, ++ {0x1204d, 0x0}, ++ {0x13048, 0x0}, ++ {0x1304a, 0x0}, ++ {0x1304b, 0x0}, ++ {0x1304c, 0x0}, ++ {0x1304d, 0x0}, ++ {0x30048, 0x0}, ++ {0x30049, 0x0}, ++ {0x3004a, 0x0}, ++ {0x3004b, 0x0}, ++ {0x31048, 0x0}, ++ {0x31049, 0x0}, ++ {0x3104a, 0x0}, ++ {0x3104b, 0x0}, ++ {0x30033, 0x0}, ++ {0x30034, 0x0}, ++ {0x3002e, 0x0}, ++ {0x31033, 0x0}, ++ {0x31034, 0x0}, ++ {0x3102e, 0x0}, ++ {0x10033, 0x0}, ++ {0x1002e, 0x0}, ++ {0x1002f, 0x0}, ++ {0x11033, 0x0}, ++ {0x1102e, 0x0}, ++ {0x1102f, 0x0}, ++ {0x12033, 0x0}, ++ {0x1202e, 0x0}, ++ {0x1202f, 0x0}, ++ {0x13033, 0x0}, ++ {0x1302e, 0x0}, ++ {0x1302f, 0x0}, ++ {0x90806, 0x0}, ++ {0x100e8, 0x0}, ++ {0x100e9, 0x0}, ++ {0x110e8, 0x0}, ++ {0x110e9, 0x0}, ++ {0x120e8, 0x0}, ++ {0x120e9, 0x0}, ++ {0x130e8, 0x0}, ++ {0x130e9, 0x0}, ++ {0x10001, 0x0}, ++ {0x11001, 0x0}, ++ {0x12001, 0x0}, ++ {0x13001, 0x0}, ++ {0x20012, 0x0}, ++ {0x20017, 0x0}, ++ {0x2000a, 0x0}, ++ {0x20186, 0x0}, ++ {0x20187, 0x0}, ++ {0x20010, 0x0}, ++ {0x20011, 0x0}, ++ {0x9080b, 0x0}, ++ {0x9080c, 0x0}, ++ {0x100a5, 0x0}, ++ {0x110a5, 0x0}, ++ {0x120a5, 0x0}, ++ {0x130a5, 0x0}, ++ {0x10014, 0x0}, ++ {0x11014, 0x0}, ++ {0x12014, 0x0}, ++ {0x13014, 0x0}, ++ {0x20035, 0x0}, ++ {0x20036, 0x0}, ++ {0x20037, 0x0}, ++ {0x20038, 0x0}, ++ {0x20039, 0x0}, ++ {0x2003a, 0x0}, ++ {0x2003b, 0x0}, ++ {0x2003c, 0x0}, ++ {0x2003d, 0x0}, ++ {0x2003e, 0x0}, ++ {0x2003f, 0x0}, ++ {0x20040, 0x0}, ++ {0x2002c, 0x0}, ++ {0x2002d, 0x0}, ++ {0x20030, 0x0}, ++ {0x2002e, 0x0}, ++ {0x2002f, 0x0}, ++ {0x2000c, 0x0}, ++ {0x2001b, 0x0}, ++ {0x10007, 0x0}, ++ {0x11007, 0x0}, ++ {0x12007, 0x0}, ++ {0x13007, 0x0}, ++ {0x908f0, 0x0}, ++ {0x908f1, 0x0}, ++ {0x908f2, 0x0}, ++ {0x908f3, 0x0}, ++ {0x908f4, 0x0}, ++ {0x908f5, 0x0}, ++ {0x908f6, 0x0}, ++ {0x908f7, 0x0}, ++ {0x41008, 0x0}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0x0}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x0}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0x0}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0x0}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x0}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0x0}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0x0}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x0}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0x0}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0x0}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x0}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0x0}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0x0}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x0}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0x0}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0x0}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x0}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0x0}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0x0}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x0}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x0}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x0}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x0}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x0}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x0}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0x0}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0x0}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x0}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0x0}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0x0}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x0}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0x0}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0x0}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0x410b8, 0x0}, ++ {0x410b9, 0x0}, ++ {0x410ba, 0x0}, ++ {0x410bb, 0x0}, ++ {0x410bc, 0x0}, ++ {0x410bd, 0x0}, ++ {0x410be, 0x0}, ++ {0x410bf, 0x0}, ++ {0x410c0, 0x0}, ++ {0x410c1, 0x0}, ++ {0x410c2, 0x0}, ++ {0x410c3, 0x0}, ++ {0x410c4, 0x0}, ++ {0x410c5, 0x0}, ++ {0x410c6, 0x0}, ++ {0x410c7, 0x0}, ++ {0x410c8, 0x0}, ++ {0x410c9, 0x0}, ++ {0x410ca, 0x0}, ++ {0x410cb, 0x0}, ++ {0x410cc, 0x0}, ++ {0x410cd, 0x0}, ++ {0x410ce, 0x0}, ++ {0x410cf, 0x0}, ++ {0x410d0, 0x0}, ++ {0x410d1, 0x0}, ++ {0x410d2, 0x0}, ++ {0x410d3, 0x0}, ++ {0x410d4, 0x0}, ++ {0x410d5, 0x0}, ++ {0x410d6, 0x0}, ++ {0x410d7, 0x0}, ++ {0x410d8, 0x0}, ++ {0x410d9, 0x0}, ++ {0x410da, 0x0}, ++ {0x410db, 0x0}, ++ {0x410dc, 0x0}, ++ {0x410dd, 0x0}, ++ {0x410de, 0x0}, ++ {0x410df, 0x0}, ++ {0x410e0, 0x0}, ++ {0x410e1, 0x0}, ++ {0x410e2, 0x0}, ++ {0x410e3, 0x0}, ++ {0x410e4, 0x0}, ++ {0x410e5, 0x0}, ++ {0x410e6, 0x0}, ++ {0x410e7, 0x0}, ++ {0x410e8, 0x0}, ++ {0x410e9, 0x0}, ++ {0x410ea, 0x0}, ++ {0x410eb, 0x0}, ++ {0x410ec, 0x0}, ++ {0x410ed, 0x0}, ++ {0x410ee, 0x0}, ++ {0x410ef, 0x0}, ++ {0x410f0, 0x0}, ++ {0x410f1, 0x0}, ++ {0x410f2, 0x0}, ++ {0x410f3, 0x0}, ++ {0x410f4, 0x0}, ++ {0x410f5, 0x0}, ++ {0x410f6, 0x0}, ++ {0x410f7, 0x0}, ++ {0x410f8, 0x0}, ++ {0x410f9, 0x0}, ++ {0x410fa, 0x0}, ++ {0x410fb, 0x0}, ++ {0x410fc, 0x0}, ++ {0x410fd, 0x0}, ++ {0x410fe, 0x0}, ++ {0x410ff, 0x0}, ++ {0x41100, 0x0}, ++ {0x41101, 0x0}, ++ {0x41102, 0x0}, ++ {0x41103, 0x0}, ++ {0x41104, 0x0}, ++ {0x41105, 0x0}, ++ {0x41106, 0x0}, ++ {0x41107, 0x0}, ++ {0x41108, 0x0}, ++ {0x41109, 0x0}, ++ {0x4110a, 0x0}, ++ {0x4110b, 0x0}, ++ {0x4110c, 0x0}, ++ {0x4110d, 0x0}, ++ {0x4110e, 0x0}, ++ {0x4110f, 0x0}, ++ {0x41110, 0x0}, ++ {0x41111, 0x0}, ++ {0x41112, 0x0}, ++ {0x41113, 0x0}, ++ {0x41114, 0x0}, ++ {0x41115, 0x0}, ++ {0x41116, 0x0}, ++ {0x41117, 0x0}, ++ {0x41118, 0x0}, ++ {0x41119, 0x0}, ++ {0x4111a, 0x0}, ++ {0x4111b, 0x0}, ++ {0x4111c, 0x0}, ++ {0x4111d, 0x0}, ++ {0x4111e, 0x0}, ++ {0x4111f, 0x0}, ++ {0x41120, 0x0}, ++ {0x41121, 0x0}, ++ {0x41122, 0x0}, ++ {0x41123, 0x0}, ++ {0x41124, 0x0}, ++ {0x41125, 0x0}, ++ {0x41126, 0x0}, ++ {0x41127, 0x0}, ++ {0x41128, 0x0}, ++ {0x41129, 0x0}, ++ {0x4112a, 0x0}, ++ {0x4112b, 0x0}, ++ {0x4112c, 0x0}, ++ {0x4112d, 0x0}, ++ {0x4112e, 0x0}, ++ {0x4112f, 0x0}, ++ {0x41130, 0x0}, ++ {0x41131, 0x0}, ++ {0x41132, 0x0}, ++ {0x41133, 0x0}, ++ {0x41134, 0x0}, ++ {0x41135, 0x0}, ++ {0x41136, 0x0}, ++ {0x41137, 0x0}, ++ {0x41138, 0x0}, ++ {0x41139, 0x0}, ++ {0x4113a, 0x0}, ++ {0x4113b, 0x0}, ++ {0x4113c, 0x0}, ++ {0x4113d, 0x0}, ++ {0x4113e, 0x0}, ++ {0x4113f, 0x0}, ++ {0x41140, 0x0}, ++ {0x41141, 0x0}, ++ {0x41142, 0x0}, ++ {0x41143, 0x0}, ++ {0x41144, 0x0}, ++ {0x41145, 0x0}, ++ {0x41146, 0x0}, ++ {0x41147, 0x0}, ++ {0x41148, 0x0}, ++ {0x41149, 0x0}, ++ {0x4114a, 0x0}, ++ {0x4114b, 0x0}, ++ {0x4114c, 0x0}, ++ {0x4114d, 0x0}, ++ {0x4114e, 0x0}, ++ {0x4114f, 0x0}, ++ {0x41150, 0x0}, ++ {0x41151, 0x0}, ++ {0x41152, 0x0}, ++ {0x41153, 0x0}, ++ {0x41154, 0x0}, ++ {0x41155, 0x0}, ++ {0x41156, 0x0}, ++ {0x41157, 0x0}, ++ {0x41158, 0x0}, ++ {0x41159, 0x0}, ++ {0x4115a, 0x0}, ++ {0x4115b, 0x0}, ++ {0x4115c, 0x0}, ++ {0x4115d, 0x0}, ++ {0x4115e, 0x0}, ++ {0x4115f, 0x0}, ++ {0x41160, 0x0}, ++ {0x41161, 0x0}, ++ {0x41162, 0x0}, ++ {0x41163, 0x0}, ++ {0x41164, 0x0}, ++ {0x41165, 0x0}, ++ {0x41166, 0x0}, ++ {0x41167, 0x0}, ++ {0x41168, 0x0}, ++ {0x41169, 0x0}, ++ {0x4116a, 0x0}, ++ {0x4116b, 0x0}, ++ {0x4116c, 0x0}, ++ {0x4116d, 0x0}, ++ {0x4116e, 0x0}, ++ {0x4116f, 0x0}, ++ {0x41170, 0x0}, ++ {0x41171, 0x0}, ++ {0x41172, 0x0}, ++ {0x41173, 0x0}, ++ {0x41174, 0x0}, ++ {0x41175, 0x0}, ++ {0x41176, 0x0}, ++ {0x41177, 0x0}, ++ {0x41178, 0x0}, ++ {0x41179, 0x0}, ++ {0x4117a, 0x0}, ++ {0x4117b, 0x0}, ++ {0x4117c, 0x0}, ++ {0x4117d, 0x0}, ++ {0x4117e, 0x0}, ++ {0x4117f, 0x0}, ++ {0x41180, 0x0}, ++ {0x41181, 0x0}, ++ {0x41182, 0x0}, ++ {0x41183, 0x0}, ++ {0x41184, 0x0}, ++ {0x41185, 0x0}, ++ {0x41186, 0x0}, ++ {0x41187, 0x0}, ++ {0x41188, 0x0}, ++ {0x41189, 0x0}, ++ {0x4118a, 0x0}, ++ {0x4118b, 0x0}, ++ {0x4118c, 0x0}, ++ {0x4118d, 0x0}, ++ {0x4118e, 0x0}, ++ {0x4118f, 0x0}, ++ {0x41190, 0x0}, ++ {0x41191, 0x0}, ++ {0x41192, 0x0}, ++ {0x41193, 0x0}, ++ {0x41194, 0x0}, ++ {0x41195, 0x0}, ++ {0x41196, 0x0}, ++ {0x41197, 0x0}, ++ {0x41198, 0x0}, ++ {0x41199, 0x0}, ++ {0x4119a, 0x0}, ++ {0x4119b, 0x0}, ++ {0x4119c, 0x0}, ++ {0x4119d, 0x0}, ++ {0x4119e, 0x0}, ++ {0x4119f, 0x0}, ++ {0x411a0, 0x0}, ++ {0x411a1, 0x0}, ++ {0x411a2, 0x0}, ++ {0x411a3, 0x0}, ++ {0x411a4, 0x0}, ++ {0x411a5, 0x0}, ++ {0x411a6, 0x0}, ++ {0x411a7, 0x0}, ++ {0x411a8, 0x0}, ++ {0x411a9, 0x0}, ++ {0x411aa, 0x0}, ++ {0x411ab, 0x0}, ++ {0x411ac, 0x0}, ++ {0x411ad, 0x0}, ++ {0x411ae, 0x0}, ++ {0x411af, 0x0}, ++ {0x411b0, 0x0}, ++ {0x411b1, 0x0}, ++ {0x411b2, 0x0}, ++ {0x411b3, 0x0}, ++ {0x411b4, 0x0}, ++ {0x411b5, 0x0}, ++ {0x411b6, 0x0}, ++ {0x411b7, 0x0}, ++ {0x411b8, 0x0}, ++ {0x411b9, 0x0}, ++ {0x411ba, 0x0}, ++ {0x411bb, 0x0}, ++ {0x411bc, 0x0}, ++ {0x411bd, 0x0}, ++ {0x411be, 0x0}, ++ {0x411bf, 0x0}, ++ {0x411c0, 0x0}, ++ {0x411c1, 0x0}, ++ {0x411c2, 0x0}, ++ {0x411c3, 0x0}, ++ {0x411c4, 0x0}, ++ {0x411c5, 0x0}, ++ {0x411c6, 0x0}, ++ {0x411c7, 0x0}, ++ {0x20015, 0x0}, ++ {0x2004a, 0x0}, ++ {0x2004b, 0x0}, ++ {0x2004c, 0x0}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x0}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20041, 0x0}, ++ {0x20045, 0x0}, ++ {0x10057, 0x0}, ++ {0x11057, 0x0}, ++ {0x12057, 0x0}, ++ {0x13057, 0x0}, ++ {0x1000f, 0x0}, ++ {0x1100f, 0x0}, ++ {0x1200f, 0x0}, ++ {0x1300f, 0x0}, ++ {0x90803, 0x0}, ++ {0x90804, 0x0}, ++ {0x90805, 0x0}, ++ {0x90903, 0x0}, ++ {0x9090b, 0x0}, ++ {0x90811, 0x0}, ++ {0x90812, 0x0}, ++ {0x20072, 0x0}, ++ {0x9080e, 0x0}, ++ {0x20073, 0x0}, ++ {0x9080f, 0x0}, ++ {0x41000, 0x0}, ++ {0x41001, 0x0}, ++ {0x41002, 0x0}, ++ {0x41003, 0x0}, ++ {0x41004, 0x0}, ++ {0x41005, 0x0}, ++ {0x41006, 0x0}, ++ {0x41007, 0x0}, ++ {0x41388, 0x0}, ++ {0x41389, 0x0}, ++ {0x4138a, 0x0}, ++ {0x4138b, 0x0}, ++ {0x4138c, 0x0}, ++ {0x4138d, 0x0}, ++ {0x4138e, 0x0}, ++ {0x4138f, 0x0}, ++ {0x41390, 0x0}, ++ {0x41391, 0x0}, ++ {0x41392, 0x0}, ++ {0x41393, 0x0}, ++ {0x41394, 0x0}, ++ {0x41395, 0x0}, ++ {0x41396, 0x0}, ++ {0x41397, 0x0}, ++ {0x41398, 0x0}, ++ {0x41399, 0x0}, ++ {0x4139a, 0x0}, ++ {0x4139b, 0x0}, ++ {0x4139c, 0x0}, ++ {0x4139d, 0x0}, ++ {0x4139e, 0x0}, ++ {0x4139f, 0x0}, ++ {0x413a0, 0x0}, ++ {0x413a1, 0x0}, ++ {0x413a2, 0x0}, ++ {0x413a3, 0x0}, ++ {0x413a4, 0x0}, ++ {0x413a5, 0x0}, ++ {0x413a6, 0x0}, ++ {0x413a7, 0x0}, ++ {0x413a8, 0x0}, ++ {0x413a9, 0x0}, ++ {0x413aa, 0x0}, ++ {0x413ab, 0x0}, ++ {0x413ac, 0x0}, ++ {0x413ad, 0x0}, ++ {0x413ae, 0x0}, ++ {0x413af, 0x0}, ++ {0x413b0, 0x0}, ++ {0x413b1, 0x0}, ++ {0x413b2, 0x0}, ++ {0x413b3, 0x0}, ++ {0x413b4, 0x0}, ++ {0x413b5, 0x0}, ++ {0x413b6, 0x0}, ++ {0x413b7, 0x0}, ++ {0x413b8, 0x0}, ++ {0x413b9, 0x0}, ++ {0x413ba, 0x0}, ++ {0x413bb, 0x0}, ++ {0x413bc, 0x0}, ++ {0x413bd, 0x0}, ++ {0x413be, 0x0}, ++ {0x413bf, 0x0}, ++ {0x413c0, 0x0}, ++ {0x413c1, 0x0}, ++ {0x413c2, 0x0}, ++ {0x413c3, 0x0}, ++ {0x413c4, 0x0}, ++ {0x413c5, 0x0}, ++ {0x413c6, 0x0}, ++ {0x413c7, 0x0}, ++ {0x413c8, 0x0}, ++ {0x413c9, 0x0}, ++ {0x413ca, 0x0}, ++ {0x413cb, 0x0}, ++ {0x413cc, 0x0}, ++ {0x413cd, 0x0}, ++ {0x413ce, 0x0}, ++ {0x413cf, 0x0}, ++ {0x413d0, 0x0}, ++ {0x413d1, 0x0}, ++ {0x413d2, 0x0}, ++ {0x413d3, 0x0}, ++ {0x413d4, 0x0}, ++ {0x413d5, 0x0}, ++ {0x413d6, 0x0}, ++ {0x413d7, 0x0}, ++ {0x413d8, 0x0}, ++ {0x413d9, 0x0}, ++ {0x413da, 0x0}, ++ {0x413db, 0x0}, ++ {0x413dc, 0x0}, ++ {0x413dd, 0x0}, ++ {0x413de, 0x0}, ++ {0x413df, 0x0}, ++ {0x413e0, 0x0}, ++ {0x413e1, 0x0}, ++ {0x413e2, 0x0}, ++ {0x413e3, 0x0}, ++ {0x413e4, 0x0}, ++ {0x413e5, 0x0}, ++ {0x413e6, 0x0}, ++ {0x413e7, 0x0}, ++ {0x413e8, 0x0}, ++ {0x413e9, 0x0}, ++ {0x413ea, 0x0}, ++ {0x413eb, 0x0}, ++ {0x413ec, 0x0}, ++ {0x413ed, 0x0}, ++ {0x413ee, 0x0}, ++ {0x413ef, 0x0}, ++ {0x413f0, 0x0}, ++ {0x413f1, 0x0}, ++ {0x413f2, 0x0}, ++ {0x413f3, 0x0}, ++ {0x413f4, 0x0}, ++ {0x413f5, 0x0}, ++ {0x413f6, 0x0}, ++ {0x413f7, 0x0}, ++ {0x413f8, 0x0}, ++ {0x413f9, 0x0}, ++ {0x413fa, 0x0}, ++ {0x413fb, 0x0}, ++ {0x413fc, 0x0}, ++ {0x413fd, 0x0}, ++ {0x413fe, 0x0}, ++ {0x413ff, 0x0}, ++ {0x41400, 0x0}, ++ {0x41401, 0x0}, ++ {0x41402, 0x0}, ++ {0x41403, 0x0}, ++ {0x41404, 0x0}, ++ {0x41405, 0x0}, ++ {0x41406, 0x0}, ++ {0x41407, 0x0}, ++ {0x41408, 0x0}, ++ {0x41409, 0x0}, ++ {0x4140a, 0x0}, ++ {0x4140b, 0x0}, ++ {0x4140c, 0x0}, ++ {0x4140d, 0x0}, ++ {0x4140e, 0x0}, ++ {0x4140f, 0x0}, ++ {0x41410, 0x0}, ++ {0x41411, 0x0}, ++ {0x41412, 0x0}, ++ {0x41413, 0x0}, ++ {0x41414, 0x0}, ++ {0x41415, 0x0}, ++ {0x41416, 0x0}, ++ {0x41417, 0x0}, ++ {0x41418, 0x0}, ++ {0x41419, 0x0}, ++ {0x4141a, 0x0}, ++ {0x4141b, 0x0}, ++ {0x4141c, 0x0}, ++ {0x4141d, 0x0}, ++ {0x4141e, 0x0}, ++ {0x4141f, 0x0}, ++ {0x41420, 0x0}, ++ {0x41421, 0x0}, ++ {0x41422, 0x0}, ++ {0x41423, 0x0}, ++ {0x41424, 0x0}, ++ {0x41425, 0x0}, ++ {0x41426, 0x0}, ++ {0x41427, 0x0}, ++ {0x41428, 0x0}, ++ {0x41429, 0x0}, ++ {0x4142a, 0x0}, ++ {0x4142b, 0x0}, ++ {0x4142c, 0x0}, ++ {0x4142d, 0x0}, ++ {0x4142e, 0x0}, ++ {0x4142f, 0x0}, ++ {0x41430, 0x0}, ++ {0x41431, 0x0}, ++ {0x41432, 0x0}, ++ {0x41433, 0x0}, ++ {0x41434, 0x0}, ++ {0x41435, 0x0}, ++ {0x41436, 0x0}, ++ {0x41437, 0x0}, ++ {0x41438, 0x0}, ++ {0x41439, 0x0}, ++ {0x4143a, 0x0}, ++ {0x4143b, 0x0}, ++ {0x4143c, 0x0}, ++ {0x4143d, 0x0}, ++ {0x4143e, 0x0}, ++ {0x4143f, 0x0}, ++ {0x41440, 0x0}, ++ {0x41441, 0x0}, ++ {0x41442, 0x0}, ++ {0x41443, 0x0}, ++ {0x41444, 0x0}, ++ {0x41445, 0x0}, ++ {0x41446, 0x0}, ++ {0x41447, 0x0}, ++ {0x41448, 0x0}, ++ {0x41449, 0x0}, ++ {0x4144a, 0x0}, ++ {0x4144b, 0x0}, ++ {0x4144c, 0x0}, ++ {0x4144d, 0x0}, ++ {0x4144e, 0x0}, ++ {0x4144f, 0x0}, ++ {0x41450, 0x0}, ++ {0x41451, 0x0}, ++ {0x41452, 0x0}, ++ {0x41453, 0x0}, ++ {0x41454, 0x0}, ++ {0x41455, 0x0}, ++ {0x41456, 0x0}, ++ {0x41457, 0x0}, ++ {0x41458, 0x0}, ++ {0x41459, 0x0}, ++ {0x4145a, 0x0}, ++ {0x4145b, 0x0}, ++ {0x4145c, 0x0}, ++ {0x4145d, 0x0}, ++ {0x4145e, 0x0}, ++ {0x4145f, 0x0}, ++ {0x41460, 0x0}, ++ {0x41461, 0x0}, ++ {0x41462, 0x0}, ++ {0x41463, 0x0}, ++ {0x41464, 0x0}, ++ {0x41465, 0x0}, ++ {0x41466, 0x0}, ++ {0x41467, 0x0}, ++ {0x41468, 0x0}, ++ {0x41469, 0x0}, ++ {0x4146a, 0x0}, ++ {0x4146b, 0x0}, ++ {0x4146c, 0x0}, ++ {0x4146d, 0x0}, ++ {0x4146e, 0x0}, ++ {0x4146f, 0x0}, ++ {0x41470, 0x0}, ++ {0x41471, 0x0}, ++ {0x41472, 0x0}, ++ {0x41473, 0x0}, ++ {0x41474, 0x0}, ++ {0x41475, 0x0}, ++ {0x41476, 0x0}, ++ {0x41477, 0x0}, ++ {0x41478, 0x0}, ++ {0x41479, 0x0}, ++ {0x4147a, 0x0}, ++ {0x4147b, 0x0}, ++ {0x4147c, 0x0}, ++ {0x4147d, 0x0}, ++ {0x4147e, 0x0}, ++ {0x4147f, 0x0}, ++ {0x41480, 0x0}, ++ {0x41481, 0x0}, ++ {0x41482, 0x0}, ++ {0x41483, 0x0}, ++ {0x41484, 0x0}, ++ {0x41485, 0x0}, ++ {0x41486, 0x0}, ++ {0x41487, 0x0}, ++ {0x41488, 0x0}, ++ {0x41489, 0x0}, ++ {0x4148a, 0x0}, ++ {0x4148b, 0x0}, ++ {0x4148c, 0x0}, ++ {0x4148d, 0x0}, ++ {0x4148e, 0x0}, ++ {0x4148f, 0x0}, ++ {0x41490, 0x0}, ++ {0x41491, 0x0}, ++ {0x41492, 0x0}, ++ {0x41493, 0x0}, ++ {0x41494, 0x0}, ++ {0x41495, 0x0}, ++ {0x41496, 0x0}, ++ {0x41497, 0x0}, ++ {0x41498, 0x0}, ++ {0x41499, 0x0}, ++ {0x4149a, 0x0}, ++ {0x4149b, 0x0}, ++ {0x4149c, 0x0}, ++ {0x4149d, 0x0}, ++ {0x4149e, 0x0}, ++ {0x4149f, 0x0}, ++ {0x414a0, 0x0}, ++ {0x414a1, 0x0}, ++ {0x414a2, 0x0}, ++ {0x414a3, 0x0}, ++ {0x414a4, 0x0}, ++ {0x414a5, 0x0}, ++ {0x414a6, 0x0}, ++ {0x414a7, 0x0}, ++ {0x414a8, 0x0}, ++ {0x414a9, 0x0}, ++ {0x414aa, 0x0}, ++ {0x414ab, 0x0}, ++ {0x414ac, 0x0}, ++ {0x414ad, 0x0}, ++ {0x414ae, 0x0}, ++ {0x414af, 0x0}, ++ {0x414b0, 0x0}, ++ {0x414b1, 0x0}, ++ {0x414b2, 0x0}, ++ {0x414b3, 0x0}, ++ {0x414b4, 0x0}, ++ {0x414b5, 0x0}, ++ {0x414b6, 0x0}, ++ {0x414b7, 0x0}, ++ {0x414b8, 0x0}, ++ {0x414b9, 0x0}, ++ {0x414ba, 0x0}, ++ {0x414bb, 0x0}, ++ {0x414bc, 0x0}, ++ {0x414bd, 0x0}, ++ {0x414be, 0x0}, ++ {0x414bf, 0x0}, ++ {0x414c0, 0x0}, ++ {0x414c1, 0x0}, ++ {0x414c2, 0x0}, ++ {0x414c3, 0x0}, ++ {0x414c4, 0x0}, ++ {0x414c5, 0x0}, ++ {0x414c6, 0x0}, ++ {0x414c7, 0x0}, ++ {0x414c8, 0x0}, ++ {0x414c9, 0x0}, ++ {0x414ca, 0x0}, ++ {0x414cb, 0x0}, ++ {0x414cc, 0x0}, ++ {0x414cd, 0x0}, ++ {0x414ce, 0x0}, ++ {0x414cf, 0x0}, ++ {0x414d0, 0x0}, ++ {0x414d1, 0x0}, ++ {0x414d2, 0x0}, ++ {0x414d3, 0x0}, ++ {0x414d4, 0x0}, ++ {0x414d5, 0x0}, ++ {0x414d6, 0x0}, ++ {0x414d7, 0x0}, ++ {0x414d8, 0x0}, ++ {0x414d9, 0x0}, ++ {0x414da, 0x0}, ++ {0x414db, 0x0}, ++ {0x414dc, 0x0}, ++ {0x414dd, 0x0}, ++ {0x414de, 0x0}, ++ {0x414df, 0x0}, ++ {0x414e0, 0x0}, ++ {0x414e1, 0x0}, ++ {0x414e2, 0x0}, ++ {0x414e3, 0x0}, ++ {0x414e4, 0x0}, ++ {0x414e5, 0x0}, ++ {0x414e6, 0x0}, ++ {0x414e7, 0x0}, ++ {0x414e8, 0x0}, ++ {0x414e9, 0x0}, ++ {0x414ea, 0x0}, ++ {0x414eb, 0x0}, ++ {0x414ec, 0x0}, ++ {0x414ed, 0x0}, ++ {0x414ee, 0x0}, ++ {0x414ef, 0x0}, ++ {0x414f0, 0x0}, ++ {0x414f1, 0x0}, ++ {0x414f2, 0x0}, ++ {0x414f3, 0x0}, ++ {0x414f4, 0x0}, ++ {0x414f5, 0x0}, ++ {0x414f6, 0x0}, ++ {0x414f7, 0x0}, ++ {0x414f8, 0x0}, ++ {0x414f9, 0x0}, ++ {0x414fa, 0x0}, ++ {0x414fb, 0x0}, ++ {0x414fc, 0x0}, ++ {0x414fd, 0x0}, ++ {0x414fe, 0x0}, ++ {0x414ff, 0x0}, ++ {0x41500, 0x0}, ++ {0x41501, 0x0}, ++ {0x41502, 0x0}, ++ {0x41503, 0x0}, ++ {0x41504, 0x0}, ++ {0x41505, 0x0}, ++ {0x41506, 0x0}, ++ {0x41507, 0x0}, ++ {0x41508, 0x0}, ++ {0x41509, 0x0}, ++ {0x4150a, 0x0}, ++ {0x4150b, 0x0}, ++ {0x4150c, 0x0}, ++ {0x4150d, 0x0}, ++ {0x4150e, 0x0}, ++ {0x4150f, 0x0}, ++ {0x41510, 0x0}, ++ {0x41511, 0x0}, ++ {0x41512, 0x0}, ++ {0x41513, 0x0}, ++ {0x41514, 0x0}, ++ {0x41515, 0x0}, ++ {0x41516, 0x0}, ++ {0x41517, 0x0}, ++ {0x41518, 0x0}, ++ {0x41519, 0x0}, ++ {0x4151a, 0x0}, ++ {0x4151b, 0x0}, ++ {0x4151c, 0x0}, ++ {0x4151d, 0x0}, ++ {0x4151e, 0x0}, ++ {0x4151f, 0x0}, ++ {0x41520, 0x0}, ++ {0x41521, 0x0}, ++ {0x41522, 0x0}, ++ {0x41523, 0x0}, ++ {0x41524, 0x0}, ++ {0x41525, 0x0}, ++ {0x41526, 0x0}, ++ {0x41527, 0x0}, ++ {0x41528, 0x0}, ++ {0x41529, 0x0}, ++ {0x4152a, 0x0}, ++ {0x4152b, 0x0}, ++ {0x4152c, 0x0}, ++ {0x4152d, 0x0}, ++ {0x4152e, 0x0}, ++ {0x4152f, 0x0}, ++ {0x41530, 0x0}, ++ {0x41531, 0x0}, ++ {0x41532, 0x0}, ++ {0x41533, 0x0}, ++ {0x41534, 0x0}, ++ {0x41535, 0x0}, ++ {0x41536, 0x0}, ++ {0x41537, 0x0}, ++ {0x41538, 0x0}, ++ {0x41539, 0x0}, ++ {0x4153a, 0x0}, ++ {0x4153b, 0x0}, ++ {0x4153c, 0x0}, ++ {0x4153d, 0x0}, ++ {0x4153e, 0x0}, ++ {0x4153f, 0x0}, ++ {0x41540, 0x0}, ++ {0x41541, 0x0}, ++ {0x41542, 0x0}, ++ {0x41543, 0x0}, ++ {0x41544, 0x0}, ++ {0x41545, 0x0}, ++ {0x41546, 0x0}, ++ {0x41547, 0x0}, ++ {0x41548, 0x0}, ++ {0x41549, 0x0}, ++ {0x4154a, 0x0}, ++ {0x4154b, 0x0}, ++ {0x4154c, 0x0}, ++ {0x4154d, 0x0}, ++ {0x4154e, 0x0}, ++ {0x4154f, 0x0}, ++ {0x41550, 0x0}, ++ {0x41551, 0x0}, ++ {0x41552, 0x0}, ++ {0x41553, 0x0}, ++ {0x41554, 0x0}, ++ {0x41555, 0x0}, ++ {0x41556, 0x0}, ++ {0x41557, 0x0}, ++ {0x41558, 0x0}, ++ {0x41559, 0x0}, ++ {0x4155a, 0x0}, ++ {0x4155b, 0x0}, ++ {0x4155c, 0x0}, ++ {0x4155d, 0x0}, ++ {0x4155e, 0x0}, ++ {0x4155f, 0x0}, ++ {0x41560, 0x0}, ++ {0x41561, 0x0}, ++ {0x41562, 0x0}, ++ {0x41563, 0x0}, ++ {0x41564, 0x0}, ++ {0x41565, 0x0}, ++ {0x41566, 0x0}, ++ {0x41567, 0x0}, ++ {0x41568, 0x0}, ++ {0x41569, 0x0}, ++ {0x4156a, 0x0}, ++ {0x4156b, 0x0}, ++ {0x4156c, 0x0}, ++ {0x4156d, 0x0}, ++ {0x4156e, 0x0}, ++ {0x4156f, 0x0}, ++ {0x41570, 0x0}, ++ {0x41571, 0x0}, ++ {0x41572, 0x0}, ++ {0x41573, 0x0}, ++ {0x41574, 0x0}, ++ {0x41575, 0x0}, ++ {0x41576, 0x0}, ++ {0x41577, 0x0}, ++ {0x41578, 0x0}, ++ {0x41579, 0x0}, ++ {0x4157a, 0x0}, ++ {0x4157b, 0x0}, ++ {0x4157c, 0x0}, ++ {0x4157d, 0x0}, ++ {0x4157e, 0x0}, ++ {0x4157f, 0x0}, ++ {0x41580, 0x0}, ++ {0x41581, 0x0}, ++ {0x41582, 0x0}, ++ {0x41583, 0x0}, ++ {0x41584, 0x0}, ++ {0x41585, 0x0}, ++ {0x41586, 0x0}, ++ {0x41587, 0x0}, ++ {0x41588, 0x0}, ++ {0x41589, 0x0}, ++ {0x4158a, 0x0}, ++ {0x4158b, 0x0}, ++ {0x4158c, 0x0}, ++ {0x4158d, 0x0}, ++ {0x4158e, 0x0}, ++ {0x4158f, 0x0}, ++ {0x41590, 0x0}, ++ {0x41591, 0x0}, ++ {0x41592, 0x0}, ++ {0x41593, 0x0}, ++ {0x41594, 0x0}, ++ {0x41595, 0x0}, ++ {0x41596, 0x0}, ++ {0x41597, 0x0}, ++ {0x41598, 0x0}, ++ {0x41599, 0x0}, ++ {0x4159a, 0x0}, ++ {0x4159b, 0x0}, ++ {0x4159c, 0x0}, ++ {0x4159d, 0x0}, ++ {0x4159e, 0x0}, ++ {0x4159f, 0x0}, ++ {0x415a0, 0x0}, ++ {0x415a1, 0x0}, ++ {0x415a2, 0x0}, ++ {0x415a3, 0x0}, ++ {0x415a4, 0x0}, ++ {0x415a5, 0x0}, ++ {0x415a6, 0x0}, ++ {0x415a7, 0x0}, ++ {0x415a8, 0x0}, ++ {0x415a9, 0x0}, ++ {0x415aa, 0x0}, ++ {0x415ab, 0x0}, ++ {0x415ac, 0x0}, ++ {0x415ad, 0x0}, ++ {0x415ae, 0x0}, ++ {0x415af, 0x0}, ++ {0x415b0, 0x0}, ++ {0x415b1, 0x0}, ++ {0x415b2, 0x0}, ++ {0x415b3, 0x0}, ++ {0x415b4, 0x0}, ++ {0x415b5, 0x0}, ++ {0x415b6, 0x0}, ++ {0x415b7, 0x0}, ++ {0x415b8, 0x0}, ++ {0x415b9, 0x0}, ++ {0x415ba, 0x0}, ++ {0x415bb, 0x0}, ++ {0x415bc, 0x0}, ++ {0x415bd, 0x0}, ++ {0x415be, 0x0}, ++ {0x415bf, 0x0}, ++ {0x415c0, 0x0}, ++ {0x415c1, 0x0}, ++ {0x415c2, 0x0}, ++ {0x415c3, 0x0}, ++ {0x415c4, 0x0}, ++ {0x415c5, 0x0}, ++ {0x415c6, 0x0}, ++ {0x415c7, 0x0}, ++ {0x415c8, 0x0}, ++ {0x415c9, 0x0}, ++ {0x415ca, 0x0}, ++ {0x415cb, 0x0}, ++ {0x415cc, 0x0}, ++ {0x415cd, 0x0}, ++ {0x415ce, 0x0}, ++ {0x415cf, 0x0}, ++ {0x415d0, 0x0}, ++ {0x415d1, 0x0}, ++ {0x415d2, 0x0}, ++ {0x415d3, 0x0}, ++ {0x415d4, 0x0}, ++ {0x415d5, 0x0}, ++ {0x415d6, 0x0}, ++ {0x415d7, 0x0}, ++ {0x415d8, 0x0}, ++ {0x415d9, 0x0}, ++ {0x415da, 0x0}, ++ {0x415db, 0x0}, ++ {0x415dc, 0x0}, ++ {0x415dd, 0x0}, ++ {0x415de, 0x0}, ++ {0x415df, 0x0}, ++ {0x415e0, 0x0}, ++ {0x415e1, 0x0}, ++ {0x415e2, 0x0}, ++ {0x415e3, 0x0}, ++ {0x415e4, 0x0}, ++ {0x415e5, 0x0}, ++ {0x415e6, 0x0}, ++ {0x415e7, 0x0}, ++ {0x415e8, 0x0}, ++ {0x415e9, 0x0}, ++ {0x415ea, 0x0}, ++ {0x415eb, 0x0}, ++ {0x415ec, 0x0}, ++ {0x415ed, 0x0}, ++ {0x415ee, 0x0}, ++ {0x415ef, 0x0}, ++ {0x415f0, 0x0}, ++ {0x415f1, 0x0}, ++ {0x415f2, 0x0}, ++ {0x415f3, 0x0}, ++ {0x415f4, 0x0}, ++ {0x415f5, 0x0}, ++ {0x415f6, 0x0}, ++ {0x415f7, 0x0}, ++ {0x415f8, 0x0}, ++ {0x415f9, 0x0}, ++ {0x415fa, 0x0}, ++ {0x415fb, 0x0}, ++ {0x415fc, 0x0}, ++ {0x415fd, 0x0}, ++ {0x415fe, 0x0}, ++ {0x415ff, 0x0}, ++ {0x41600, 0x0}, ++ {0x41601, 0x0}, ++ {0x41602, 0x0}, ++ {0x41603, 0x0}, ++ {0x41604, 0x0}, ++ {0x41605, 0x0}, ++ {0x41606, 0x0}, ++ {0x41607, 0x0}, ++ {0x41608, 0x0}, ++ {0x41609, 0x0}, ++ {0x4160a, 0x0}, ++ {0x4160b, 0x0}, ++ {0x4160c, 0x0}, ++ {0x4160d, 0x0}, ++ {0x4160e, 0x0}, ++ {0x4160f, 0x0}, ++ {0x41610, 0x0}, ++ {0x41611, 0x0}, ++ {0x41612, 0x0}, ++ {0x41613, 0x0}, ++ {0x41614, 0x0}, ++ {0x41615, 0x0}, ++ {0x41616, 0x0}, ++ {0x41617, 0x0}, ++ {0x41618, 0x0}, ++ {0x41619, 0x0}, ++ {0x4161a, 0x0}, ++ {0x4161b, 0x0}, ++ {0x4161c, 0x0}, ++ {0x4161d, 0x0}, ++ {0x4161e, 0x0}, ++ {0x4161f, 0x0}, ++ {0x41620, 0x0}, ++ {0x41621, 0x0}, ++ {0x41622, 0x0}, ++ {0x41623, 0x0}, ++ {0x41624, 0x0}, ++ {0x41625, 0x0}, ++ {0x41626, 0x0}, ++ {0x41627, 0x0}, ++ {0x41628, 0x0}, ++ {0x41629, 0x0}, ++ {0x4162a, 0x0}, ++ {0x4162b, 0x0}, ++ {0x4162c, 0x0}, ++ {0x4162d, 0x0}, ++ {0x4162e, 0x0}, ++ {0x4162f, 0x0}, ++ {0x41630, 0x0}, ++ {0x41631, 0x0}, ++ {0x41632, 0x0}, ++ {0x41633, 0x0}, ++ {0x41634, 0x0}, ++ {0x41635, 0x0}, ++ {0x41636, 0x0}, ++ {0x41637, 0x0}, ++ {0x41638, 0x0}, ++ {0x41639, 0x0}, ++ {0x4163a, 0x0}, ++ {0x4163b, 0x0}, ++ {0x4163c, 0x0}, ++ {0x4163d, 0x0}, ++ {0x4163e, 0x0}, ++ {0x4163f, 0x0}, ++ {0x41640, 0x0}, ++ {0x41641, 0x0}, ++ {0x41642, 0x0}, ++ {0x41643, 0x0}, ++ {0x41644, 0x0}, ++ {0x41645, 0x0}, ++ {0x41646, 0x0}, ++ {0x41647, 0x0}, ++ {0x41648, 0x0}, ++ {0x41649, 0x0}, ++ {0x4164a, 0x0}, ++ {0x4164b, 0x0}, ++ {0x4164c, 0x0}, ++ {0x4164d, 0x0}, ++ {0x4164e, 0x0}, ++ {0x4164f, 0x0}, ++ {0x41650, 0x0}, ++ {0x41651, 0x0}, ++ {0x41652, 0x0}, ++ {0x41653, 0x0}, ++ {0x41654, 0x0}, ++ {0x41655, 0x0}, ++ {0x41656, 0x0}, ++ {0x41657, 0x0}, ++ {0x41658, 0x0}, ++ {0x41659, 0x0}, ++ {0x4165a, 0x0}, ++ {0x4165b, 0x0}, ++ {0x4165c, 0x0}, ++ {0x4165d, 0x0}, ++ {0x4165e, 0x0}, ++ {0x4165f, 0x0}, ++ {0x41660, 0x0}, ++ {0x41661, 0x0}, ++ {0x41662, 0x0}, ++ {0x41663, 0x0}, ++ {0x41664, 0x0}, ++ {0x41665, 0x0}, ++ {0x41666, 0x0}, ++ {0x41667, 0x0}, ++ {0x41668, 0x0}, ++ {0x41669, 0x0}, ++ {0x4166a, 0x0}, ++ {0x4166b, 0x0}, ++ {0x4166c, 0x0}, ++ {0x4166d, 0x0}, ++ {0x4166e, 0x0}, ++ {0x4166f, 0x0}, ++ {0x41670, 0x0}, ++ {0x41671, 0x0}, ++ {0x41672, 0x0}, ++ {0x41673, 0x0}, ++ {0x41674, 0x0}, ++ {0x41675, 0x0}, ++ {0x41676, 0x0}, ++ {0x41677, 0x0}, ++ {0x41678, 0x0}, ++ {0x41679, 0x0}, ++ {0x4167a, 0x0}, ++ {0x4167b, 0x0}, ++ {0x4167c, 0x0}, ++ {0x4167d, 0x0}, ++ {0x4167e, 0x0}, ++ {0x4167f, 0x0}, ++ {0x41680, 0x0}, ++ {0x41681, 0x0}, ++ {0x41682, 0x0}, ++ {0x41683, 0x0}, ++ {0x41684, 0x0}, ++ {0x41685, 0x0}, ++ {0x41686, 0x0}, ++ {0x41687, 0x0}, ++ {0x41688, 0x0}, ++ {0x41689, 0x0}, ++ {0x4168a, 0x0}, ++ {0x4168b, 0x0}, ++ {0x4168c, 0x0}, ++ {0x4168d, 0x0}, ++ {0x4168e, 0x0}, ++ {0x4168f, 0x0}, ++ {0x41690, 0x0}, ++ {0x41691, 0x0}, ++ {0x41692, 0x0}, ++ {0x41693, 0x0}, ++ {0x41694, 0x0}, ++ {0x41695, 0x0}, ++ {0x41696, 0x0}, ++ {0x41697, 0x0}, ++ {0x41698, 0x0}, ++ {0x41699, 0x0}, ++ {0x4169a, 0x0}, ++ {0x4169b, 0x0}, ++ {0x4169c, 0x0}, ++ {0x4169d, 0x0}, ++ {0x4169e, 0x0}, ++ {0x4169f, 0x0}, ++ {0x416a0, 0x0}, ++ {0x416a1, 0x0}, ++ {0x416a2, 0x0}, ++ {0x416a3, 0x0}, ++ {0x416a4, 0x0}, ++ {0x416a5, 0x0}, ++ {0x416a6, 0x0}, ++ {0x416a7, 0x0}, ++ {0x416a8, 0x0}, ++ {0x416a9, 0x0}, ++ {0x416aa, 0x0}, ++ {0x416ab, 0x0}, ++ {0x416ac, 0x0}, ++ {0x416ad, 0x0}, ++ {0x416ae, 0x0}, ++ {0x416af, 0x0}, ++ {0x416b0, 0x0}, ++ {0x416b1, 0x0}, ++ {0x416b2, 0x0}, ++ {0x416b3, 0x0}, ++ {0x416b4, 0x0}, ++ {0x416b5, 0x0}, ++ {0x416b6, 0x0}, ++ {0x416b7, 0x0}, ++ {0x416b8, 0x0}, ++ {0x416b9, 0x0}, ++ {0x416ba, 0x0}, ++ {0x416bb, 0x0}, ++ {0x416bc, 0x0}, ++ {0x416bd, 0x0}, ++ {0x416be, 0x0}, ++ {0x416bf, 0x0}, ++ {0x416c0, 0x0}, ++ {0x416c1, 0x0}, ++ {0x416c2, 0x0}, ++ {0x416c3, 0x0}, ++ {0x416c4, 0x0}, ++ {0x416c5, 0x0}, ++ {0x416c6, 0x0}, ++ {0x416c7, 0x0}, ++ {0x416c8, 0x0}, ++ {0x416c9, 0x0}, ++ {0x416ca, 0x0}, ++ {0x416cb, 0x0}, ++ {0x416cc, 0x0}, ++ {0x416cd, 0x0}, ++ {0x416ce, 0x0}, ++ {0x416cf, 0x0}, ++ {0x416d0, 0x0}, ++ {0x416d1, 0x0}, ++ {0x416d2, 0x0}, ++ {0x416d3, 0x0}, ++ {0x416d4, 0x0}, ++ {0x416d5, 0x0}, ++ {0x416d6, 0x0}, ++ {0x416d7, 0x0}, ++ {0x416d8, 0x0}, ++ {0x416d9, 0x0}, ++ {0x416da, 0x0}, ++ {0x416db, 0x0}, ++ {0x416dc, 0x0}, ++ {0x416dd, 0x0}, ++ {0x416de, 0x0}, ++ {0x416df, 0x0}, ++ {0x416e0, 0x0}, ++ {0x416e1, 0x0}, ++ {0x416e2, 0x0}, ++ {0x416e3, 0x0}, ++ {0x416e4, 0x0}, ++ {0x416e5, 0x0}, ++ {0x416e6, 0x0}, ++ {0x416e7, 0x0}, ++ {0x416e8, 0x0}, ++ {0x416e9, 0x0}, ++ {0x416ea, 0x0}, ++ {0x416eb, 0x0}, ++ {0x416ec, 0x0}, ++ {0x416ed, 0x0}, ++ {0x416ee, 0x0}, ++ {0x416ef, 0x0}, ++ {0x416f0, 0x0}, ++ {0x416f1, 0x0}, ++ {0x416f2, 0x0}, ++ {0x416f3, 0x0}, ++ {0x416f4, 0x0}, ++ {0x416f5, 0x0}, ++ {0x416f6, 0x0}, ++ {0x416f7, 0x0}, ++ {0x416f8, 0x0}, ++ {0x416f9, 0x0}, ++ {0x416fa, 0x0}, ++ {0x416fb, 0x0}, ++ {0x416fc, 0x0}, ++ {0x416fd, 0x0}, ++ {0x416fe, 0x0}, ++ {0x416ff, 0x0}, ++ {0x41700, 0x0}, ++ {0x41701, 0x0}, ++ {0x41702, 0x0}, ++ {0x41703, 0x0}, ++ {0x41704, 0x0}, ++ {0x41705, 0x0}, ++ {0x41706, 0x0}, ++ {0x41707, 0x0}, ++ {0x41708, 0x0}, ++ {0x41709, 0x0}, ++ {0x4170a, 0x0}, ++ {0x4170b, 0x0}, ++ {0x4170c, 0x0}, ++ {0x4170d, 0x0}, ++ {0x4170e, 0x0}, ++ {0x4170f, 0x0}, ++ {0x41710, 0x0}, ++ {0x41711, 0x0}, ++ {0x41712, 0x0}, ++ {0x41713, 0x0}, ++ {0x41714, 0x0}, ++ {0x41715, 0x0}, ++ {0x41716, 0x0}, ++ {0x41717, 0x0}, ++ {0x41718, 0x0}, ++ {0x41719, 0x0}, ++ {0x4171a, 0x0}, ++ {0x4171b, 0x0}, ++ {0x4171c, 0x0}, ++ {0x4171d, 0x0}, ++ {0x4171e, 0x0}, ++ {0x4171f, 0x0}, ++ {0x41720, 0x0}, ++ {0x41721, 0x0}, ++ {0x41722, 0x0}, ++ {0x41723, 0x0}, ++ {0x41724, 0x0}, ++ {0x41725, 0x0}, ++ {0x41726, 0x0}, ++ {0x41727, 0x0}, ++ {0x41728, 0x0}, ++ {0x41729, 0x0}, ++ {0x4172a, 0x0}, ++ {0x4172b, 0x0}, ++ {0x4172c, 0x0}, ++ {0x4172d, 0x0}, ++ {0x4172e, 0x0}, ++ {0x4172f, 0x0}, ++ {0x41730, 0x0}, ++ {0x41731, 0x0}, ++ {0x41732, 0x0}, ++ {0x41733, 0x0}, ++ {0x41734, 0x0}, ++ {0x41735, 0x0}, ++ {0x41736, 0x0}, ++ {0x41737, 0x0}, ++ {0x41738, 0x0}, ++ {0x41739, 0x0}, ++ {0x4173a, 0x0}, ++ {0x4173b, 0x0}, ++ {0x4173c, 0x0}, ++ {0x4173d, 0x0}, ++ {0x4173e, 0x0}, ++ {0x4173f, 0x0}, ++ {0x41740, 0x0}, ++ {0x41741, 0x0}, ++ {0x41742, 0x0}, ++ {0x41743, 0x0}, ++ {0x41744, 0x0}, ++ {0x41745, 0x0}, ++ {0x41746, 0x0}, ++ {0x41747, 0x0}, ++ {0x41748, 0x0}, ++ {0x41749, 0x0}, ++ {0x4174a, 0x0}, ++ {0x4174b, 0x0}, ++ {0x4174c, 0x0}, ++ {0x4174d, 0x0}, ++ {0x4174e, 0x0}, ++ {0x4174f, 0x0}, ++ {0x41750, 0x0}, ++ {0x41751, 0x0}, ++ {0x41752, 0x0}, ++ {0x41753, 0x0}, ++ {0x41754, 0x0}, ++ {0x41755, 0x0}, ++ {0x41756, 0x0}, ++ {0x41757, 0x0}, ++ {0x41758, 0x0}, ++ {0x41759, 0x0}, ++ {0x4175a, 0x0}, ++ {0x4175b, 0x0}, ++ {0x4175c, 0x0}, ++ {0x4175d, 0x0}, ++ {0x4175e, 0x0}, ++ {0x4175f, 0x0}, ++ {0x41760, 0x0}, ++ {0x41761, 0x0}, ++ {0x41762, 0x0}, ++ {0x41763, 0x0}, ++ {0x41764, 0x0}, ++ {0x41765, 0x0}, ++ {0x41766, 0x0}, ++ {0x41767, 0x0}, ++ {0x41768, 0x0}, ++ {0x41769, 0x0}, ++ {0x4176a, 0x0}, ++ {0x4176b, 0x0}, ++ {0x4176c, 0x0}, ++ {0x4176d, 0x0}, ++ {0x4176e, 0x0}, ++ {0x4176f, 0x0}, ++ {0x41770, 0x0}, ++ {0x41771, 0x0}, ++ {0x41772, 0x0}, ++ {0x41773, 0x0}, ++ {0x41774, 0x0}, ++ {0x41775, 0x0}, ++ {0x41776, 0x0}, ++ {0x41777, 0x0}, ++ {0x41778, 0x0}, ++ {0x41779, 0x0}, ++ {0x4177a, 0x0}, ++ {0x4177b, 0x0}, ++ {0x4177c, 0x0}, ++ {0x4177d, 0x0}, ++ {0x4177e, 0x0}, ++ {0x4177f, 0x0}, ++ {0x41780, 0x0}, ++ {0x41781, 0x0}, ++ {0x41782, 0x0}, ++ {0x41783, 0x0}, ++ {0x41784, 0x0}, ++ {0x41785, 0x0}, ++ {0x41786, 0x0}, ++ {0x41787, 0x0}, ++ {0x41788, 0x0}, ++ {0x41789, 0x0}, ++ {0x4178a, 0x0}, ++ {0x4178b, 0x0}, ++ {0x4178c, 0x0}, ++ {0x4178d, 0x0}, ++ {0x4178e, 0x0}, ++ {0x4178f, 0x0}, ++ {0x41790, 0x0}, ++ {0x41791, 0x0}, ++ {0x41792, 0x0}, ++ {0x41793, 0x0}, ++ {0x41794, 0x0}, ++ {0x41795, 0x0}, ++ {0x41796, 0x0}, ++ {0x41797, 0x0}, ++ {0x41798, 0x0}, ++ {0x41799, 0x0}, ++ {0x4179a, 0x0}, ++ {0x4179b, 0x0}, ++ {0x4179c, 0x0}, ++ {0x4179d, 0x0}, ++ {0x4179e, 0x0}, ++ {0x4179f, 0x0}, ++ {0x417a0, 0x0}, ++ {0x417a1, 0x0}, ++ {0x417a2, 0x0}, ++ {0x417a3, 0x0}, ++ {0x417a4, 0x0}, ++ {0x417a5, 0x0}, ++ {0x417a6, 0x0}, ++ {0x417a7, 0x0}, ++ {0x417a8, 0x0}, ++ {0x417a9, 0x0}, ++ {0x417aa, 0x0}, ++ {0x417ab, 0x0}, ++ {0x417ac, 0x0}, ++ {0x417ad, 0x0}, ++ {0x417ae, 0x0}, ++ {0x417af, 0x0}, ++ {0x417b0, 0x0}, ++ {0x417b1, 0x0}, ++ {0x417b2, 0x0}, ++ {0x417b3, 0x0}, ++ {0x417b4, 0x0}, ++ {0x417b5, 0x0}, ++ {0x417b6, 0x0}, ++ {0x417b7, 0x0}, ++ {0x417b8, 0x0}, ++ {0x417b9, 0x0}, ++ {0x417ba, 0x0}, ++ {0x417bb, 0x0}, ++ {0x417bc, 0x0}, ++ {0x417bd, 0x0}, ++ {0x417be, 0x0}, ++ {0x417bf, 0x0}, ++ {0x417c0, 0x0}, ++ {0x417c1, 0x0}, ++ {0x417c2, 0x0}, ++ {0x417c3, 0x0}, ++ {0x417c4, 0x0}, ++ {0x417c5, 0x0}, ++ {0x417c6, 0x0}, ++ {0x417c7, 0x0}, ++ {0x417c8, 0x0}, ++ {0x417c9, 0x0}, ++ {0x417ca, 0x0}, ++ {0x417cb, 0x0}, ++ {0x417cc, 0x0}, ++ {0x417cd, 0x0}, ++ {0x417ce, 0x0}, ++ {0x417cf, 0x0}, ++ {0x417d0, 0x0}, ++ {0x417d1, 0x0}, ++ {0x417d2, 0x0}, ++ {0x417d3, 0x0}, ++ {0x417d4, 0x0}, ++ {0x417d5, 0x0}, ++ {0x417d6, 0x0}, ++ {0x417d7, 0x0}, ++ {0x417d8, 0x0}, ++ {0x417d9, 0x0}, ++ {0x417da, 0x0}, ++ {0x417db, 0x0}, ++ {0x417dc, 0x0}, ++ {0x417dd, 0x0}, ++ {0x417de, 0x0}, ++ {0x417df, 0x0}, ++ {0x417e0, 0x0}, ++ {0x417e1, 0x0}, ++ {0x417e2, 0x0}, ++ {0x417e3, 0x0}, ++ {0x417e4, 0x0}, ++ {0x417e5, 0x0}, ++ {0x417e6, 0x0}, ++ {0x417e7, 0x0}, ++ {0x417e8, 0x0}, ++ {0x417e9, 0x0}, ++ {0x417ea, 0x0}, ++ {0x417eb, 0x0}, ++ {0x417ec, 0x0}, ++ {0x417ed, 0x0}, ++ {0x417ee, 0x0}, ++ {0x417ef, 0x0}, ++ {0x417f0, 0x0}, ++ {0x417f1, 0x0}, ++ {0x417f2, 0x0}, ++ {0x417f3, 0x0}, ++ {0x417f4, 0x0}, ++ {0x417f5, 0x0}, ++ {0x417f6, 0x0}, ++ {0x417f7, 0x0}, ++ {0x417f8, 0x0}, ++ {0x417f9, 0x0}, ++ {0x417fa, 0x0}, ++ {0x417fb, 0x0}, ++ {0x417fc, 0x0}, ++ {0x417fd, 0x0}, ++ {0x417fe, 0x0}, ++ {0x417ff, 0x0}, ++ {0x41800, 0x0}, ++ {0x41801, 0x0}, ++ {0x41802, 0x0}, ++ {0x41803, 0x0}, ++ {0x41804, 0x0}, ++ {0x41805, 0x0}, ++ {0x41806, 0x0}, ++ {0x41807, 0x0}, ++ {0x41808, 0x0}, ++ {0x41809, 0x0}, ++ {0x4180a, 0x0}, ++ {0x4180b, 0x0}, ++ {0x4180c, 0x0}, ++ {0x4180d, 0x0}, ++ {0x4180e, 0x0}, ++ {0x4180f, 0x0}, ++ {0x41810, 0x0}, ++ {0x41811, 0x0}, ++ {0x41812, 0x0}, ++ {0x41813, 0x0}, ++ {0x41814, 0x0}, ++ {0x41815, 0x0}, ++ {0x41816, 0x0}, ++ {0x41817, 0x0}, ++ {0x41818, 0x0}, ++ {0x41819, 0x0}, ++ {0x4181a, 0x0}, ++ {0x4181b, 0x0}, ++ {0x4181c, 0x0}, ++ {0x4181d, 0x0}, ++ {0x4181e, 0x0}, ++ {0x4181f, 0x0}, ++ {0x41820, 0x0}, ++ {0x41821, 0x0}, ++ {0x41822, 0x0}, ++ {0x41823, 0x0}, ++ {0x41824, 0x0}, ++ {0x41825, 0x0}, ++ {0x41826, 0x0}, ++ {0x41827, 0x0}, ++ {0x41828, 0x0}, ++ {0x41829, 0x0}, ++ {0x4182a, 0x0}, ++ {0x4182b, 0x0}, ++ {0x4182c, 0x0}, ++ {0x4182d, 0x0}, ++ {0x4182e, 0x0}, ++ {0x4182f, 0x0}, ++ {0x41830, 0x0}, ++ {0x41831, 0x0}, ++ {0x41832, 0x0}, ++ {0x41833, 0x0}, ++ {0x41834, 0x0}, ++ {0x41835, 0x0}, ++ {0x41836, 0x0}, ++ {0x41837, 0x0}, ++ {0x41838, 0x0}, ++ {0x41839, 0x0}, ++ {0x4183a, 0x0}, ++ {0x4183b, 0x0}, ++ {0x4183c, 0x0}, ++ {0x4183d, 0x0}, ++ {0x4183e, 0x0}, ++ {0x4183f, 0x0}, ++ {0x41840, 0x0}, ++ {0x41841, 0x0}, ++ {0x41842, 0x0}, ++ {0x41843, 0x0}, ++ {0x41844, 0x0}, ++ {0x41845, 0x0}, ++ {0x41846, 0x0}, ++ {0x41847, 0x0}, ++ {0x41848, 0x0}, ++ {0x41849, 0x0}, ++ {0x4184a, 0x0}, ++ {0x4184b, 0x0}, ++ {0x4184c, 0x0}, ++ {0x4184d, 0x0}, ++ {0x4184e, 0x0}, ++ {0x4184f, 0x0}, ++ {0x41850, 0x0}, ++ {0x41851, 0x0}, ++ {0x41852, 0x0}, ++ {0x41853, 0x0}, ++ {0x41854, 0x0}, ++ {0x41855, 0x0}, ++ {0x41856, 0x0}, ++ {0x41857, 0x0}, ++ {0x41858, 0x0}, ++ {0x41859, 0x0}, ++ {0x4185a, 0x0}, ++ {0x4185b, 0x0}, ++ {0x4185c, 0x0}, ++ {0x4185d, 0x0}, ++ {0x4185e, 0x0}, ++ {0x4185f, 0x0}, ++ {0x41860, 0x0}, ++ {0x41861, 0x0}, ++ {0x41862, 0x0}, ++ {0x41863, 0x0}, ++ {0x41864, 0x0}, ++ {0x41865, 0x0}, ++ {0x41866, 0x0}, ++ {0x41867, 0x0}, ++ {0x41868, 0x0}, ++ {0x41869, 0x0}, ++ {0x4186a, 0x0}, ++ {0x4186b, 0x0}, ++ {0x4186c, 0x0}, ++ {0x4186d, 0x0}, ++ {0x4186e, 0x0}, ++ {0x4186f, 0x0}, ++ {0x41870, 0x0}, ++ {0x41871, 0x0}, ++ {0x41872, 0x0}, ++ {0x41873, 0x0}, ++ {0x41874, 0x0}, ++ {0x41875, 0x0}, ++ {0x41876, 0x0}, ++ {0x41877, 0x0}, ++ {0x41878, 0x0}, ++ {0x41879, 0x0}, ++ {0x4187a, 0x0}, ++ {0x4187b, 0x0}, ++ {0x4187c, 0x0}, ++ {0x4187d, 0x0}, ++ {0x4187e, 0x0}, ++ {0x4187f, 0x0}, ++ {0x41880, 0x0}, ++ {0x41881, 0x0}, ++ {0x41882, 0x0}, ++ {0x41883, 0x0}, ++ {0x41884, 0x0}, ++ {0x41885, 0x0}, ++ {0x41886, 0x0}, ++ {0x41887, 0x0}, ++ {0x41888, 0x0}, ++ {0x41889, 0x0}, ++ {0x4188a, 0x0}, ++ {0x4188b, 0x0}, ++ {0x4188c, 0x0}, ++ {0x4188d, 0x0}, ++ {0x4188e, 0x0}, ++ {0x4188f, 0x0}, ++ {0x41890, 0x0}, ++ {0x41891, 0x0}, ++ {0x41892, 0x0}, ++ {0x41893, 0x0}, ++ {0x41894, 0x0}, ++ {0x41895, 0x0}, ++ {0x41896, 0x0}, ++ {0x41897, 0x0}, ++ {0x41898, 0x0}, ++ {0x41899, 0x0}, ++ {0x4189a, 0x0}, ++ {0x4189b, 0x0}, ++ {0x4189c, 0x0}, ++ {0x4189d, 0x0}, ++ {0x4189e, 0x0}, ++ {0x4189f, 0x0}, ++ {0x418a0, 0x0}, ++ {0x418a1, 0x0}, ++ {0x418a2, 0x0}, ++ {0x418a3, 0x0}, ++ {0x418a4, 0x0}, ++ {0x418a5, 0x0}, ++ {0x418a6, 0x0}, ++ {0x418a7, 0x0}, ++ {0x418a8, 0x0}, ++ {0x418a9, 0x0}, ++ {0x418aa, 0x0}, ++ {0x418ab, 0x0}, ++ {0x418ac, 0x0}, ++ {0x418ad, 0x0}, ++ {0x418ae, 0x0}, ++ {0x418af, 0x0}, ++ {0x418b0, 0x0}, ++ {0x418b1, 0x0}, ++ {0x418b2, 0x0}, ++ {0x418b3, 0x0}, ++ {0x418b4, 0x0}, ++ {0x418b5, 0x0}, ++ {0x418b6, 0x0}, ++ {0x418b7, 0x0}, ++ {0x418b8, 0x0}, ++ {0x418b9, 0x0}, ++ {0x418ba, 0x0}, ++ {0x418bb, 0x0}, ++ {0x418bc, 0x0}, ++ {0x418bd, 0x0}, ++ {0x418be, 0x0}, ++ {0x418bf, 0x0}, ++ {0x418c0, 0x0}, ++ {0x418c1, 0x0}, ++ {0x418c2, 0x0}, ++ {0x418c3, 0x0}, ++ {0x418c4, 0x0}, ++ {0x418c5, 0x0}, ++ {0x418c6, 0x0}, ++ {0x418c7, 0x0}, ++ {0x418c8, 0x0}, ++ {0x418c9, 0x0}, ++ {0x418ca, 0x0}, ++ {0x418cb, 0x0}, ++ {0x418cc, 0x0}, ++ {0x418cd, 0x0}, ++ {0x418ce, 0x0}, ++ {0x418cf, 0x0}, ++ {0x418d0, 0x0}, ++ {0x418d1, 0x0}, ++ {0x418d2, 0x0}, ++ {0x418d3, 0x0}, ++ {0x418d4, 0x0}, ++ {0x418d5, 0x0}, ++ {0x418d6, 0x0}, ++ {0x418d7, 0x0}, ++ {0x418d8, 0x0}, ++ {0x418d9, 0x0}, ++ {0x418da, 0x0}, ++ {0x418db, 0x0}, ++ {0x418dc, 0x0}, ++ {0x418dd, 0x0}, ++ {0x418de, 0x0}, ++ {0x418df, 0x0}, ++ {0x418e0, 0x0}, ++ {0x418e1, 0x0}, ++ {0x418e2, 0x0}, ++ {0x418e3, 0x0}, ++ {0x418e4, 0x0}, ++ {0x418e5, 0x0}, ++ {0x418e6, 0x0}, ++ {0x418e7, 0x0}, ++ {0x418e8, 0x0}, ++ {0x418e9, 0x0}, ++ {0x418ea, 0x0}, ++ {0x418eb, 0x0}, ++ {0x418ec, 0x0}, ++ {0x418ed, 0x0}, ++ {0x418ee, 0x0}, ++ {0x418ef, 0x0}, ++ {0x418f0, 0x0}, ++ {0x418f1, 0x0}, ++ {0x418f2, 0x0}, ++ {0x418f3, 0x0}, ++ {0x418f4, 0x0}, ++ {0x418f5, 0x0}, ++ {0x418f6, 0x0}, ++ {0x418f7, 0x0}, ++ {0x418f8, 0x0}, ++ {0x418f9, 0x0}, ++ {0x418fa, 0x0}, ++ {0x418fb, 0x0}, ++ {0x418fc, 0x0}, ++ {0x418fd, 0x0}, ++ {0x418fe, 0x0}, ++ {0x418ff, 0x0}, ++ {0x41900, 0x0}, ++ {0x41901, 0x0}, ++ {0x41902, 0x0}, ++ {0x41903, 0x0}, ++ {0x41904, 0x0}, ++ {0x41905, 0x0}, ++ {0x41906, 0x0}, ++ {0x41907, 0x0}, ++ {0x41908, 0x0}, ++ {0x41909, 0x0}, ++ {0x4190a, 0x0}, ++ {0x4190b, 0x0}, ++ {0x4190c, 0x0}, ++ {0x4190d, 0x0}, ++ {0x4190e, 0x0}, ++ {0x4190f, 0x0}, ++ {0x41910, 0x0}, ++ {0x41911, 0x0}, ++ {0x41912, 0x0}, ++ {0x41913, 0x0}, ++ {0x41914, 0x0}, ++ {0x41915, 0x0}, ++ {0x41916, 0x0}, ++ {0x41917, 0x0}, ++ {0x41918, 0x0}, ++ {0x41919, 0x0}, ++ {0x4191a, 0x0}, ++ {0x4191b, 0x0}, ++ {0x4191c, 0x0}, ++ {0x4191d, 0x0}, ++ {0x4191e, 0x0}, ++ {0x4191f, 0x0}, ++ {0x41920, 0x0}, ++ {0x41921, 0x0}, ++ {0x41922, 0x0}, ++ {0x41923, 0x0}, ++ {0x41924, 0x0}, ++ {0x41925, 0x0}, ++ {0x41926, 0x0}, ++ {0x41927, 0x0}, ++ {0x41928, 0x0}, ++ {0x41929, 0x0}, ++ {0x4192a, 0x0}, ++ {0x4192b, 0x0}, ++ {0x4192c, 0x0}, ++ {0x4192d, 0x0}, ++ {0x4192e, 0x0}, ++ {0x4192f, 0x0}, ++ {0x41930, 0x0}, ++ {0x41931, 0x0}, ++ {0x41932, 0x0}, ++ {0x41933, 0x0}, ++ {0x41934, 0x0}, ++ {0x41935, 0x0}, ++ {0x41936, 0x0}, ++ {0x41937, 0x0}, ++ {0x41938, 0x0}, ++ {0x41939, 0x0}, ++ {0x4193a, 0x0}, ++ {0x4193b, 0x0}, ++ {0x4193c, 0x0}, ++ {0x4193d, 0x0}, ++ {0x4193e, 0x0}, ++ {0x4193f, 0x0}, ++ {0x41940, 0x0}, ++ {0x41941, 0x0}, ++ {0x41942, 0x0}, ++ {0x41943, 0x0}, ++ {0x41944, 0x0}, ++ {0x41945, 0x0}, ++ {0x41946, 0x0}, ++ {0x41947, 0x0}, ++ {0x41948, 0x0}, ++ {0x41949, 0x0}, ++ {0x4194a, 0x0}, ++ {0x4194b, 0x0}, ++ {0x4194c, 0x0}, ++ {0x4194d, 0x0}, ++ {0x4194e, 0x0}, ++ {0x4194f, 0x0}, ++ {0x41950, 0x0}, ++ {0x41951, 0x0}, ++ {0x41952, 0x0}, ++ {0x41953, 0x0}, ++ {0x41954, 0x0}, ++ {0x41955, 0x0}, ++ {0x41956, 0x0}, ++ {0x41957, 0x0}, ++ {0x41958, 0x0}, ++ {0x41959, 0x0}, ++ {0x4195a, 0x0}, ++ {0x4195b, 0x0}, ++ {0x4195c, 0x0}, ++ {0x4195d, 0x0}, ++ {0x4195e, 0x0}, ++ {0x4195f, 0x0}, ++ {0x41960, 0x0}, ++ {0x41961, 0x0}, ++ {0x41962, 0x0}, ++ {0x41963, 0x0}, ++ {0x41964, 0x0}, ++ {0x41965, 0x0}, ++ {0x41966, 0x0}, ++ {0x41967, 0x0}, ++ {0x41968, 0x0}, ++ {0x41969, 0x0}, ++ {0x4196a, 0x0}, ++ {0x4196b, 0x0}, ++ {0x4196c, 0x0}, ++ {0x4196d, 0x0}, ++ {0x4196e, 0x0}, ++ {0x4196f, 0x0}, ++ {0x41970, 0x0}, ++ {0x41971, 0x0}, ++ {0x41972, 0x0}, ++ {0x41973, 0x0}, ++ {0x41974, 0x0}, ++ {0x41975, 0x0}, ++ {0x41976, 0x0}, ++ {0x41977, 0x0}, ++ {0x41978, 0x0}, ++ {0x41979, 0x0}, ++ {0x4197a, 0x0}, ++ {0x4197b, 0x0}, ++ {0x4197c, 0x0}, ++ {0x4197d, 0x0}, ++ {0x4197e, 0x0}, ++ {0x4197f, 0x0}, ++ {0x41980, 0x0}, ++ {0x41981, 0x0}, ++ {0x41982, 0x0}, ++ {0x41983, 0x0}, ++ {0x41984, 0x0}, ++ {0x41985, 0x0}, ++ {0x41986, 0x0}, ++ {0x41987, 0x0}, ++ {0x41988, 0x0}, ++ {0x41989, 0x0}, ++ {0x4198a, 0x0}, ++ {0x4198b, 0x0}, ++ {0x4198c, 0x0}, ++ {0x4198d, 0x0}, ++ {0x4198e, 0x0}, ++ {0x4198f, 0x0}, ++ {0x41990, 0x0}, ++ {0x41991, 0x0}, ++ {0x41992, 0x0}, ++ {0x41993, 0x0}, ++ {0x41994, 0x0}, ++ {0x41995, 0x0}, ++ {0x41996, 0x0}, ++ {0x41997, 0x0}, ++ {0x41998, 0x0}, ++ {0x41999, 0x0}, ++ {0x4199a, 0x0}, ++ {0x4199b, 0x0}, ++ {0x4199c, 0x0}, ++ {0x4199d, 0x0}, ++ {0x4199e, 0x0}, ++ {0x4199f, 0x0}, ++ {0x419a0, 0x0}, ++ {0x419a1, 0x0}, ++ {0x419a2, 0x0}, ++ {0x419a3, 0x0}, ++ {0x419a4, 0x0}, ++ {0x419a5, 0x0}, ++ {0x419a6, 0x0}, ++ {0x419a7, 0x0}, ++ {0x419a8, 0x0}, ++ {0x419a9, 0x0}, ++ {0x419aa, 0x0}, ++ {0x419ab, 0x0}, ++ {0x419ac, 0x0}, ++ {0x419ad, 0x0}, ++ {0x419ae, 0x0}, ++ {0x419af, 0x0}, ++ {0x419b0, 0x0}, ++ {0x419b1, 0x0}, ++ {0x419b2, 0x0}, ++ {0x419b3, 0x0}, ++ {0x419b4, 0x0}, ++ {0x419b5, 0x0}, ++ {0x419b6, 0x0}, ++ {0x419b7, 0x0}, ++ {0x419b8, 0x0}, ++ {0x419b9, 0x0}, ++ {0x419ba, 0x0}, ++ {0x419bb, 0x0}, ++ {0x419bc, 0x0}, ++ {0x419bd, 0x0}, ++ {0x419be, 0x0}, ++ {0x419bf, 0x0}, ++ {0x419c0, 0x0}, ++ {0x419c1, 0x0}, ++ {0x419c2, 0x0}, ++ {0x419c3, 0x0}, ++ {0x419c4, 0x0}, ++ {0x419c5, 0x0}, ++ {0x419c6, 0x0}, ++ {0x419c7, 0x0}, ++ {0x419c8, 0x0}, ++ {0x419c9, 0x0}, ++ {0x419ca, 0x0}, ++ {0x419cb, 0x0}, ++ {0x419cc, 0x0}, ++ {0x419cd, 0x0}, ++ {0x419ce, 0x0}, ++ {0x419cf, 0x0}, ++ {0x419d0, 0x0}, ++ {0x419d1, 0x0}, ++ {0x419d2, 0x0}, ++ {0x419d3, 0x0}, ++ {0x419d4, 0x0}, ++ {0x419d5, 0x0}, ++ {0x419d6, 0x0}, ++ {0x419d7, 0x0}, ++ {0x419d8, 0x0}, ++ {0x419d9, 0x0}, ++ {0x419da, 0x0}, ++ {0x419db, 0x0}, ++ {0x419dc, 0x0}, ++ {0x419dd, 0x0}, ++ {0x419de, 0x0}, ++ {0x419df, 0x0}, ++ {0x419e0, 0x0}, ++ {0x419e1, 0x0}, ++ {0x419e2, 0x0}, ++ {0x419e3, 0x0}, ++ {0x419e4, 0x0}, ++ {0x419e5, 0x0}, ++ {0x419e6, 0x0}, ++ {0x419e7, 0x0}, ++ {0x419e8, 0x0}, ++ {0x419e9, 0x0}, ++ {0x419ea, 0x0}, ++ {0x419eb, 0x0}, ++ {0x419ec, 0x0}, ++ {0x419ed, 0x0}, ++ {0x419ee, 0x0}, ++ {0x419ef, 0x0}, ++ {0x419f0, 0x0}, ++ {0x419f1, 0x0}, ++ {0x419f2, 0x0}, ++ {0x419f3, 0x0}, ++ {0x419f4, 0x0}, ++ {0x419f5, 0x0}, ++ {0x419f6, 0x0}, ++ {0x419f7, 0x0}, ++ {0x419f8, 0x0}, ++ {0x419f9, 0x0}, ++ {0x419fa, 0x0}, ++ {0x419fb, 0x0}, ++ {0x419fc, 0x0}, ++ {0x419fd, 0x0}, ++ {0x419fe, 0x0}, ++ {0x419ff, 0x0}, ++ {0x41a00, 0x0}, ++ {0x41a01, 0x0}, ++ {0x41a02, 0x0}, ++ {0x41a03, 0x0}, ++ {0x41a04, 0x0}, ++ {0x41a05, 0x0}, ++ {0x41a06, 0x0}, ++ {0x41a07, 0x0}, ++ {0x41a08, 0x0}, ++ {0x41a09, 0x0}, ++ {0x41a0a, 0x0}, ++ {0x41a0b, 0x0}, ++ {0x41a0c, 0x0}, ++ {0x41a0d, 0x0}, ++ {0x41a0e, 0x0}, ++ {0x41a0f, 0x0}, ++ {0x41a10, 0x0}, ++ {0x41a11, 0x0}, ++ {0x41a12, 0x0}, ++ {0x41a13, 0x0}, ++ {0x41a14, 0x0}, ++ {0x41a15, 0x0}, ++ {0x41a16, 0x0}, ++ {0x41a17, 0x0}, ++ {0x41a18, 0x0}, ++ {0x41a19, 0x0}, ++ {0x41a1a, 0x0}, ++ {0x41a1b, 0x0}, ++ {0x41a1c, 0x0}, ++ {0x41a1d, 0x0}, ++ {0x41a1e, 0x0}, ++ {0x41a1f, 0x0}, ++ {0x41a20, 0x0}, ++ {0x41a21, 0x0}, ++ {0x41a22, 0x0}, ++ {0x41a23, 0x0}, ++ {0x41a24, 0x0}, ++ {0x41a25, 0x0}, ++ {0x41a26, 0x0}, ++ {0x41a27, 0x0}, ++ {0x41a28, 0x0}, ++ {0x41a29, 0x0}, ++ {0x41a2a, 0x0}, ++ {0x41a2b, 0x0}, ++ {0x41a2c, 0x0}, ++ {0x41a2d, 0x0}, ++ {0x41a2e, 0x0}, ++ {0x41a2f, 0x0}, ++ {0x41a30, 0x0}, ++ {0x41a31, 0x0}, ++ {0x41a32, 0x0}, ++ {0x41a33, 0x0}, ++ {0x41a34, 0x0}, ++ {0x41a35, 0x0}, ++ {0x41a36, 0x0}, ++ {0x41a37, 0x0}, ++ {0x41a38, 0x0}, ++ {0x41a39, 0x0}, ++ {0x41a3a, 0x0}, ++ {0x41a3b, 0x0}, ++ {0x41a3c, 0x0}, ++ {0x41a3d, 0x0}, ++ {0x41a3e, 0x0}, ++ {0x41a3f, 0x0}, ++ {0x41a40, 0x0}, ++ {0x41a41, 0x0}, ++ {0x41a42, 0x0}, ++ {0x41a43, 0x0}, ++ {0x41a44, 0x0}, ++ {0x41a45, 0x0}, ++ {0x41a46, 0x0}, ++ {0x41a47, 0x0}, ++ {0x41a48, 0x0}, ++ {0x41a49, 0x0}, ++ {0x41a4a, 0x0}, ++ {0x41a4b, 0x0}, ++ {0x41a4c, 0x0}, ++ {0x41a4d, 0x0}, ++ {0x41a4e, 0x0}, ++ {0x41a4f, 0x0}, ++ {0x41a50, 0x0}, ++ {0x41a51, 0x0}, ++ {0x41a52, 0x0}, ++ {0x41a53, 0x0}, ++ {0x41a54, 0x0}, ++ {0x41a55, 0x0}, ++ {0x41a56, 0x0}, ++ {0x41a57, 0x0}, ++ {0x41a58, 0x0}, ++ {0x41a59, 0x0}, ++ {0x41a5a, 0x0}, ++ {0x41a5b, 0x0}, ++ {0x41a5c, 0x0}, ++ {0x41a5d, 0x0}, ++ {0x41a5e, 0x0}, ++ {0x41a5f, 0x0}, ++ {0x41a60, 0x0}, ++ {0x41a61, 0x0}, ++ {0x41a62, 0x0}, ++ {0x41a63, 0x0}, ++ {0x41a64, 0x0}, ++ {0x41a65, 0x0}, ++ {0x41a66, 0x0}, ++ {0x41a67, 0x0}, ++ {0x41a68, 0x0}, ++ {0x41a69, 0x0}, ++ {0x41a6a, 0x0}, ++ {0x41a6b, 0x0}, ++ {0x41a6c, 0x0}, ++ {0x41a6d, 0x0}, ++ {0x41a6e, 0x0}, ++ {0x41a6f, 0x0}, ++ {0x41a70, 0x0}, ++ {0x41a71, 0x0}, ++ {0x41a72, 0x0}, ++ {0x41a73, 0x0}, ++ {0x41a74, 0x0}, ++ {0x41a75, 0x0}, ++ {0x41a76, 0x0}, ++ {0x41a77, 0x0}, ++ {0x41a78, 0x0}, ++ {0x41a79, 0x0}, ++ {0x41a7a, 0x0}, ++ {0x41a7b, 0x0}, ++ {0x41a7c, 0x0}, ++ {0x41a7d, 0x0}, ++ {0x41a7e, 0x0}, ++ {0x41a7f, 0x0}, ++ {0x41a80, 0x0}, ++ {0x41a81, 0x0}, ++ {0x41a82, 0x0}, ++ {0x41a83, 0x0}, ++ {0x41a84, 0x0}, ++ {0x41a85, 0x0}, ++ {0x41a86, 0x0}, ++ {0x41a87, 0x0}, ++ {0x41a88, 0x0}, ++ {0x41a89, 0x0}, ++ {0x41a8a, 0x0}, ++ {0x41a8b, 0x0}, ++ {0x41a8c, 0x0}, ++ {0x41a8d, 0x0}, ++ {0x41a8e, 0x0}, ++ {0x41a8f, 0x0}, ++ {0x41a90, 0x0}, ++ {0x41a91, 0x0}, ++ {0x41a92, 0x0}, ++ {0x41a93, 0x0}, ++ {0x41a94, 0x0}, ++ {0x41a95, 0x0}, ++ {0x41a96, 0x0}, ++ {0x41a97, 0x0}, ++ {0x41a98, 0x0}, ++ {0x41a99, 0x0}, ++ {0x41a9a, 0x0}, ++ {0x41a9b, 0x0}, ++ {0x41a9c, 0x0}, ++ {0x41a9d, 0x0}, ++ {0x41a9e, 0x0}, ++ {0x41a9f, 0x0}, ++ {0x41aa0, 0x0}, ++ {0x41aa1, 0x0}, ++ {0x41aa2, 0x0}, ++ {0x41aa3, 0x0}, ++ {0x41aa4, 0x0}, ++ {0x41aa5, 0x0}, ++ {0x41aa6, 0x0}, ++ {0x41aa7, 0x0}, ++ {0x41aa8, 0x0}, ++ {0x41aa9, 0x0}, ++ {0x41aaa, 0x0}, ++ {0x41aab, 0x0}, ++ {0x41aac, 0x0}, ++ {0x41aad, 0x0}, ++ {0x41aae, 0x0}, ++ {0x41aaf, 0x0}, ++ {0x41ab0, 0x0}, ++ {0x41ab1, 0x0}, ++ {0x41ab2, 0x0}, ++ {0x41ab3, 0x0}, ++ {0x41ab4, 0x0}, ++ {0x41ab5, 0x0}, ++ {0x41ab6, 0x0}, ++ {0x41ab7, 0x0}, ++ {0x41ab8, 0x0}, ++ {0x41ab9, 0x0}, ++ {0x41aba, 0x0}, ++ {0x41abb, 0x0}, ++ {0x41abc, 0x0}, ++ {0x41abd, 0x0}, ++ {0x41abe, 0x0}, ++ {0x41abf, 0x0}, ++ {0x41ac0, 0x0}, ++ {0x41ac1, 0x0}, ++ {0x41ac2, 0x0}, ++ {0x41ac3, 0x0}, ++ {0x41ac4, 0x0}, ++ {0x41ac5, 0x0}, ++ {0x41ac6, 0x0}, ++ {0x41ac7, 0x0}, ++ {0x41ac8, 0x0}, ++ {0x41ac9, 0x0}, ++ {0x41aca, 0x0}, ++ {0x41acb, 0x0}, ++ {0x41acc, 0x0}, ++ {0x41acd, 0x0}, ++ {0x41ace, 0x0}, ++ {0x41acf, 0x0}, ++ {0x41ad0, 0x0}, ++ {0x41ad1, 0x0}, ++ {0x41ad2, 0x0}, ++ {0x41ad3, 0x0}, ++ {0x41ad4, 0x0}, ++ {0x41ad5, 0x0}, ++ {0x41ad6, 0x0}, ++ {0x41ad7, 0x0}, ++ {0x41ad8, 0x0}, ++ {0x41ad9, 0x0}, ++ {0x41ada, 0x0}, ++ {0x41adb, 0x0}, ++ {0x41adc, 0x0}, ++ {0x41add, 0x0}, ++ {0x41ade, 0x0}, ++ {0x41adf, 0x0}, ++ {0x41ae0, 0x0}, ++ {0x41ae1, 0x0}, ++ {0x41ae2, 0x0}, ++ {0x41ae3, 0x0}, ++ {0x41ae4, 0x0}, ++ {0x41ae5, 0x0}, ++ {0x41ae6, 0x0}, ++ {0x41ae7, 0x0}, ++ {0x41ae8, 0x0}, ++ {0x41ae9, 0x0}, ++ {0x41aea, 0x0}, ++ {0x41aeb, 0x0}, ++ {0x41aec, 0x0}, ++ {0x41aed, 0x0}, ++ {0x41aee, 0x0}, ++ {0x41aef, 0x0}, ++ {0x41af0, 0x0}, ++ {0x41af1, 0x0}, ++ {0x41af2, 0x0}, ++ {0x41af3, 0x0}, ++ {0x41af4, 0x0}, ++ {0x41af5, 0x0}, ++ {0x41af6, 0x0}, ++ {0x41af7, 0x0}, ++ {0x41af8, 0x0}, ++ {0x41af9, 0x0}, ++ {0x41afa, 0x0}, ++ {0x41afb, 0x0}, ++ {0x41afc, 0x0}, ++ {0x41afd, 0x0}, ++ {0x41afe, 0x0}, ++ {0x41aff, 0x0}, ++ {0x41b00, 0x0}, ++ {0x41b01, 0x0}, ++ {0x41b02, 0x0}, ++ {0x41b03, 0x0}, ++ {0x41b04, 0x0}, ++ {0x41b05, 0x0}, ++ {0x41b06, 0x0}, ++ {0x41b07, 0x0}, ++ {0x41b08, 0x0}, ++ {0x41b09, 0x0}, ++ {0x41b0a, 0x0}, ++ {0x41b0b, 0x0}, ++ {0x41b0c, 0x0}, ++ {0x41b0d, 0x0}, ++ {0x41b0e, 0x0}, ++ {0x41b0f, 0x0}, ++ {0x41b10, 0x0}, ++ {0x41b11, 0x0}, ++ {0x41b12, 0x0}, ++ {0x41b13, 0x0}, ++ {0x41b14, 0x0}, ++ {0x41b15, 0x0}, ++ {0x41b16, 0x0}, ++ {0x41b17, 0x0}, ++ {0x41b18, 0x0}, ++ {0x41b19, 0x0}, ++ {0x41b1a, 0x0}, ++ {0x41b1b, 0x0}, ++ {0x41b1c, 0x0}, ++ {0x41b1d, 0x0}, ++ {0x41b1e, 0x0}, ++ {0x41b1f, 0x0}, ++ {0x41b20, 0x0}, ++ {0x41b21, 0x0}, ++ {0x41b22, 0x0}, ++ {0x41b23, 0x0}, ++ {0x41b24, 0x0}, ++ {0x41b25, 0x0}, ++ {0x41b26, 0x0}, ++ {0x41b27, 0x0}, ++ {0x41b28, 0x0}, ++ {0x41b29, 0x0}, ++ {0x41b2a, 0x0}, ++ {0x41b2b, 0x0}, ++ {0x41b2c, 0x0}, ++ {0x41b2d, 0x0}, ++ {0x41b2e, 0x0}, ++ {0x41b2f, 0x0}, ++ {0x41b30, 0x0}, ++ {0x41b31, 0x0}, ++ {0x41b32, 0x0}, ++ {0x41b33, 0x0}, ++ {0x41b34, 0x0}, ++ {0x41b35, 0x0}, ++ {0x41b36, 0x0}, ++ {0x41b37, 0x0}, ++ {0x41b38, 0x0}, ++ {0x41b39, 0x0}, ++ {0x41b3a, 0x0}, ++ {0x41b3b, 0x0}, ++ {0x41b3c, 0x0}, ++ {0x41b3d, 0x0}, ++ {0x41b3e, 0x0}, ++ {0x41b3f, 0x0}, ++ {0x41b40, 0x0}, ++ {0x41b41, 0x0}, ++ {0x41b42, 0x0}, ++ {0x41b43, 0x0}, ++ {0x41b44, 0x0}, ++ {0x41b45, 0x0}, ++ {0x41b46, 0x0}, ++ {0x41b47, 0x0}, ++ {0x41b48, 0x0}, ++ {0x41b49, 0x0}, ++ {0x41b4a, 0x0}, ++ {0x41b4b, 0x0}, ++ {0x41b4c, 0x0}, ++ {0x41b4d, 0x0}, ++ {0x41b4e, 0x0}, ++ {0x41b4f, 0x0}, ++ {0x41b50, 0x0}, ++ {0x41b51, 0x0}, ++ {0x41b52, 0x0}, ++ {0x41b53, 0x0}, ++ {0x41b54, 0x0}, ++ {0x41b55, 0x0}, ++ {0x41b56, 0x0}, ++ {0x41b57, 0x0}, ++ {0x41b58, 0x0}, ++ {0x41b59, 0x0}, ++ {0x41b5a, 0x0}, ++ {0x41b5b, 0x0}, ++ {0x41b5c, 0x0}, ++ {0x41b5d, 0x0}, ++ {0x41b5e, 0x0}, ++ {0x41b5f, 0x0}, ++ {0x41b60, 0x0}, ++ {0x41b61, 0x0}, ++ {0x41b62, 0x0}, ++ {0x41b63, 0x0}, ++ {0x41b64, 0x0}, ++ {0x41b65, 0x0}, ++ {0x41b66, 0x0}, ++ {0x41b67, 0x0}, ++ {0x41b68, 0x0}, ++ {0x41b69, 0x0}, ++ {0x41b6a, 0x0}, ++ {0x41b6b, 0x0}, ++ {0x41b6c, 0x0}, ++ {0x41b6d, 0x0}, ++ {0x41b6e, 0x0}, ++ {0x41b6f, 0x0}, ++ {0x41b70, 0x0}, ++ {0x41b71, 0x0}, ++ {0x41b72, 0x0}, ++ {0x41b73, 0x0}, ++ {0x41b74, 0x0}, ++ {0x41b75, 0x0}, ++ {0x41b76, 0x0}, ++ {0x41b77, 0x0}, ++ {0x41b78, 0x0}, ++ {0x41b79, 0x0}, ++ {0x41b7a, 0x0}, ++ {0x41b7b, 0x0}, ++ {0x41b7c, 0x0}, ++ {0x41b7d, 0x0}, ++ {0x41b7e, 0x0}, ++ {0x41b7f, 0x0}, ++ {0x41b80, 0x0}, ++ {0x41b81, 0x0}, ++ {0x41b82, 0x0}, ++ {0x41b83, 0x0}, ++ {0x41b84, 0x0}, ++ {0x41b85, 0x0}, ++ {0x41b86, 0x0}, ++ {0x41b87, 0x0}, ++ {0x41b88, 0x0}, ++ {0x41b89, 0x0}, ++ {0x41b8a, 0x0}, ++ {0x41b8b, 0x0}, ++ {0x41b8c, 0x0}, ++ {0x41b8d, 0x0}, ++ {0x41b8e, 0x0}, ++ {0x41b8f, 0x0}, ++ {0x41b90, 0x0}, ++ {0x41b91, 0x0}, ++ {0x41b92, 0x0}, ++ {0x41b93, 0x0}, ++ {0x41b94, 0x0}, ++ {0x41b95, 0x0}, ++ {0x41b96, 0x0}, ++ {0x41b97, 0x0}, ++ {0x41b98, 0x0}, ++ {0x41b99, 0x0}, ++ {0x41b9a, 0x0}, ++ {0x41b9b, 0x0}, ++ {0x41b9c, 0x0}, ++ {0x41b9d, 0x0}, ++ {0x41b9e, 0x0}, ++ {0x41b9f, 0x0}, ++ {0x41ba0, 0x0}, ++ {0x41ba1, 0x0}, ++ {0x41ba2, 0x0}, ++ {0x41ba3, 0x0}, ++ {0x41ba4, 0x0}, ++ {0x41ba5, 0x0}, ++ {0x41ba6, 0x0}, ++ {0x41ba7, 0x0}, ++ {0x41ba8, 0x0}, ++ {0x41ba9, 0x0}, ++ {0x41baa, 0x0}, ++ {0x41bab, 0x0}, ++ {0x41bac, 0x0}, ++ {0x41bad, 0x0}, ++ {0x41bae, 0x0}, ++ {0x41baf, 0x0}, ++ {0x41bb0, 0x0}, ++ {0x41bb1, 0x0}, ++ {0x41bb2, 0x0}, ++ {0x41bb3, 0x0}, ++ {0x41bb4, 0x0}, ++ {0x41bb5, 0x0}, ++ {0x41bb6, 0x0}, ++ {0x41bb7, 0x0}, ++ {0x41bb8, 0x0}, ++ {0x41bb9, 0x0}, ++ {0x41bba, 0x0}, ++ {0x41bbb, 0x0}, ++ {0x41bbc, 0x0}, ++ {0x41bbd, 0x0}, ++ {0x41bbe, 0x0}, ++ {0x41bbf, 0x0}, ++ {0x41bc0, 0x0}, ++ {0x41bc1, 0x0}, ++ {0x41bc2, 0x0}, ++ {0x41bc3, 0x0}, ++ {0x41bc4, 0x0}, ++ {0x41bc5, 0x0}, ++ {0x41bc6, 0x0}, ++ {0x41bc7, 0x0}, ++ {0x41bc8, 0x0}, ++ {0x41bc9, 0x0}, ++ {0x41bca, 0x0}, ++ {0x41bcb, 0x0}, ++ {0x41bcc, 0x0}, ++ {0x41bcd, 0x0}, ++ {0x41bce, 0x0}, ++ {0x41bcf, 0x0}, ++ {0x41bd0, 0x0}, ++ {0x41bd1, 0x0}, ++ {0x41bd2, 0x0}, ++ {0x41bd3, 0x0}, ++ {0x41bd4, 0x0}, ++ {0x41bd5, 0x0}, ++ {0x41bd6, 0x0}, ++ {0x41bd7, 0x0}, ++ {0x41bd8, 0x0}, ++ {0x41bd9, 0x0}, ++ {0x41bda, 0x0}, ++ {0x41bdb, 0x0}, ++ {0x41bdc, 0x0}, ++ {0x41bdd, 0x0}, ++ {0x41bde, 0x0}, ++ {0x41bdf, 0x0}, ++ {0x41be0, 0x0}, ++ {0x41be1, 0x0}, ++ {0x41be2, 0x0}, ++ {0x41be3, 0x0}, ++ {0x41be4, 0x0}, ++ {0x41be5, 0x0}, ++ {0x41be6, 0x0}, ++ {0x41be7, 0x0}, ++ {0x41be8, 0x0}, ++ {0x41be9, 0x0}, ++ {0x41bea, 0x0}, ++ {0x41beb, 0x0}, ++ {0x41bec, 0x0}, ++ {0x41bed, 0x0}, ++ {0x41bee, 0x0}, ++ {0x41bef, 0x0}, ++ {0x41bf0, 0x0}, ++ {0x41bf1, 0x0}, ++ {0x41bf2, 0x0}, ++ {0x41bf3, 0x0}, ++ {0x41bf4, 0x0}, ++ {0x41bf5, 0x0}, ++ {0x41bf6, 0x0}, ++ {0x41bf7, 0x0}, ++ {0x41bf8, 0x0}, ++ {0x41bf9, 0x0}, ++ {0x41bfa, 0x0}, ++ {0x41bfb, 0x0}, ++ {0x41bfc, 0x0}, ++ {0x41bfd, 0x0}, ++ {0x41bfe, 0x0}, ++ {0x41bff, 0x0}, ++ {0x41c00, 0x0}, ++ {0x41c01, 0x0}, ++ {0x41c02, 0x0}, ++ {0x41c03, 0x0}, ++ {0x41c04, 0x0}, ++ {0x41c05, 0x0}, ++ {0x41c06, 0x0}, ++ {0x41c07, 0x0}, ++ {0x41c08, 0x0}, ++ {0x41c09, 0x0}, ++ {0x41c0a, 0x0}, ++ {0x41c0b, 0x0}, ++ {0x41c0c, 0x0}, ++ {0x41c0d, 0x0}, ++ {0x41c0e, 0x0}, ++ {0x41c0f, 0x0}, ++ {0x41c10, 0x0}, ++ {0x41c11, 0x0}, ++ {0x41c12, 0x0}, ++ {0x41c13, 0x0}, ++ {0x41c14, 0x0}, ++ {0x41c15, 0x0}, ++ {0x41c16, 0x0}, ++ {0x41c17, 0x0}, ++ {0x41c18, 0x0}, ++ {0x41c19, 0x0}, ++ {0x41c1a, 0x0}, ++ {0x41c1b, 0x0}, ++ {0x41c1c, 0x0}, ++ {0x41c1d, 0x0}, ++ {0x41c1e, 0x0}, ++ {0x41c1f, 0x0}, ++ {0x41c20, 0x0}, ++ {0x41c21, 0x0}, ++ {0x41c22, 0x0}, ++ {0x41c23, 0x0}, ++ {0x41c24, 0x0}, ++ {0x41c25, 0x0}, ++ {0x41c26, 0x0}, ++ {0x41c27, 0x0}, ++ {0x41c28, 0x0}, ++ {0x41c29, 0x0}, ++ {0x41c2a, 0x0}, ++ {0x41c2b, 0x0}, ++ {0x41c2c, 0x0}, ++ {0x41c2d, 0x0}, ++ {0x41c2e, 0x0}, ++ {0x41c2f, 0x0}, ++ {0x41c30, 0x0}, ++ {0x41c31, 0x0}, ++ {0x41c32, 0x0}, ++ {0x41c33, 0x0}, ++ {0x41c34, 0x0}, ++ {0x41c35, 0x0}, ++ {0x41c36, 0x0}, ++ {0x41c37, 0x0}, ++ {0x41c38, 0x0}, ++ {0x41c39, 0x0}, ++ {0x41c3a, 0x0}, ++ {0x41c3b, 0x0}, ++ {0x41c3c, 0x0}, ++ {0x41c3d, 0x0}, ++ {0x41c3e, 0x0}, ++ {0x41c3f, 0x0}, ++ {0x41c40, 0x0}, ++ {0x41c41, 0x0}, ++ {0x41c42, 0x0}, ++ {0x41c43, 0x0}, ++ {0x41c44, 0x0}, ++ {0x41c45, 0x0}, ++ {0x41c46, 0x0}, ++ {0x41c47, 0x0}, ++ {0x41c48, 0x0}, ++ {0x41c49, 0x0}, ++ {0x41c4a, 0x0}, ++ {0x41c4b, 0x0}, ++ {0x41c4c, 0x0}, ++ {0x41c4d, 0x0}, ++ {0x41c4e, 0x0}, ++ {0x41c4f, 0x0}, ++ {0x41c50, 0x0}, ++ {0x41c51, 0x0}, ++ {0x41c52, 0x0}, ++ {0x41c53, 0x0}, ++ {0x41c54, 0x0}, ++ {0x41c55, 0x0}, ++ {0x41c56, 0x0}, ++ {0x41c57, 0x0}, ++ {0x9002e, 0x0}, ++ {0x9002f, 0x0}, ++ {0x90030, 0x0}, ++ {0x90031, 0x0}, ++ {0x90032, 0x0}, ++ {0x90033, 0x0}, ++ {0x90034, 0x0}, ++ {0x90035, 0x0}, ++ {0x90036, 0x0}, ++ {0x90037, 0x0}, ++ {0x90038, 0x0}, ++ {0x90039, 0x0}, ++ {0x9003a, 0x0}, ++ {0x9003b, 0x0}, ++ {0x9003c, 0x0}, ++ {0x9003d, 0x0}, ++ {0x9003e, 0x0}, ++ {0x9003f, 0x0}, ++ {0x90040, 0x0}, ++ {0x90041, 0x0}, ++ {0x90042, 0x0}, ++ {0x90043, 0x0}, ++ {0x90044, 0x0}, ++ {0x90045, 0x0}, ++ {0x90046, 0x0}, ++ {0x90047, 0x0}, ++ {0x90048, 0x0}, ++ {0x90049, 0x0}, ++ {0x9004a, 0x0}, ++ {0x9004b, 0x0}, ++ {0x9004c, 0x0}, ++ {0x9004d, 0x0}, ++ {0x9004e, 0x0}, ++ {0x9004f, 0x0}, ++ {0x90050, 0x0}, ++ {0x90051, 0x0}, ++ {0x90052, 0x0}, ++ {0x90053, 0x0}, ++ {0x90054, 0x0}, ++ {0x90055, 0x0}, ++ {0x90056, 0x0}, ++ {0x90057, 0x0}, ++ {0x90058, 0x0}, ++ {0x90059, 0x0}, ++ {0x9005a, 0x0}, ++ {0x9005b, 0x0}, ++ {0x9005c, 0x0}, ++ {0x9005d, 0x0}, ++ {0x9005e, 0x0}, ++ {0x9005f, 0x0}, ++ {0x90060, 0x0}, ++ {0x90061, 0x0}, ++ {0x90062, 0x0}, ++ {0x90063, 0x0}, ++ {0x90064, 0x0}, ++ {0x90065, 0x0}, ++ {0x90066, 0x0}, ++ {0x90067, 0x0}, ++ {0x90068, 0x0}, ++ {0x90069, 0x0}, ++ {0x9006a, 0x0}, ++ {0x9006b, 0x0}, ++ {0x9006c, 0x0}, ++ {0x9006d, 0x0}, ++ {0x9006e, 0x0}, ++ {0x9006f, 0x0}, ++ {0x90070, 0x0}, ++ {0x90071, 0x0}, ++ {0x90072, 0x0}, ++ {0x90073, 0x0}, ++ {0x90074, 0x0}, ++ {0x90075, 0x0}, ++ {0x90076, 0x0}, ++ {0x90077, 0x0}, ++ {0x90078, 0x0}, ++ {0x90079, 0x0}, ++ {0x9007a, 0x0}, ++ {0x9007b, 0x0}, ++ {0x9007c, 0x0}, ++ {0x9007d, 0x0}, ++ {0x9007e, 0x0}, ++ {0x9007f, 0x0}, ++ {0x90080, 0x0}, ++ {0x90081, 0x0}, ++ {0x90082, 0x0}, ++ {0x90083, 0x0}, ++ {0x90084, 0x0}, ++ {0x90085, 0x0}, ++ {0x90086, 0x0}, ++ {0x90087, 0x0}, ++ {0x90088, 0x0}, ++ {0x90089, 0x0}, ++ {0x9008a, 0x0}, ++ {0x9008b, 0x0}, ++ {0x9008c, 0x0}, ++ {0x9008d, 0x0}, ++ {0x9008e, 0x0}, ++ {0x9008f, 0x0}, ++ {0x90090, 0x0}, ++ {0x90091, 0x0}, ++ {0x90092, 0x0}, ++ {0x90093, 0x0}, ++ {0x90094, 0x0}, ++ {0x90095, 0x0}, ++ {0x90096, 0x0}, ++ {0x90097, 0x0}, ++ {0x90098, 0x0}, ++ {0x90099, 0x0}, ++ {0x9009a, 0x0}, ++ {0x9009b, 0x0}, ++ {0x9009c, 0x0}, ++ {0x9009d, 0x0}, ++ {0x9009e, 0x0}, ++ {0x9009f, 0x0}, ++ {0x900a0, 0x0}, ++ {0x900a1, 0x0}, ++ {0x900a2, 0x0}, ++ {0x900a3, 0x0}, ++ {0x900a4, 0x0}, ++ {0x900a5, 0x0}, ++ {0x900a6, 0x0}, ++ {0x900a7, 0x0}, ++ {0x900a8, 0x0}, ++ {0x900a9, 0x0}, ++ {0x900aa, 0x0}, ++ {0x900ab, 0x0}, ++ {0x900ac, 0x0}, ++ {0x900ad, 0x0}, ++ {0x900ae, 0x0}, ++ {0x900af, 0x0}, ++ {0x900b0, 0x0}, ++ {0x900b1, 0x0}, ++ {0x900b2, 0x0}, ++ {0x900b3, 0x0}, ++ {0x900b4, 0x0}, ++ {0x900b5, 0x0}, ++ {0x900b6, 0x0}, ++ {0x900b7, 0x0}, ++ {0x900b8, 0x0}, ++ {0x900b9, 0x0}, ++ {0x900ba, 0x0}, ++ {0x900bb, 0x0}, ++ {0x900bc, 0x0}, ++ {0x900bd, 0x0}, ++ {0x900be, 0x0}, ++ {0x900bf, 0x0}, ++ {0x900c0, 0x0}, ++ {0x900c1, 0x0}, ++ {0x900c2, 0x0}, ++ {0x900c3, 0x0}, ++ {0x900c4, 0x0}, ++ {0x900c5, 0x0}, ++ {0x900c6, 0x0}, ++ {0x900c7, 0x0}, ++ {0x900c8, 0x0}, ++ {0x900c9, 0x0}, ++ {0x900ca, 0x0}, ++ {0x900cb, 0x0}, ++ {0x900cc, 0x0}, ++ {0x900cd, 0x0}, ++ {0x900ce, 0x0}, ++ {0x900cf, 0x0}, ++ {0x900d0, 0x0}, ++ {0x900d1, 0x0}, ++ {0x900d2, 0x0}, ++ {0x900d3, 0x0}, ++ {0x900d4, 0x0}, ++ {0x900d5, 0x0}, ++ {0x900d6, 0x0}, ++ {0x900d7, 0x0}, ++ {0x900d8, 0x0}, ++ {0x900d9, 0x0}, ++ {0x900da, 0x0}, ++ {0x900db, 0x0}, ++ {0x900dc, 0x0}, ++ {0x900dd, 0x0}, ++ {0x900de, 0x0}, ++ {0x900df, 0x0}, ++ {0x900e0, 0x0}, ++ {0x900e1, 0x0}, ++ {0x900e2, 0x0}, ++ {0x900e3, 0x0}, ++ {0x900e4, 0x0}, ++ {0x900e5, 0x0}, ++ {0x900e6, 0x0}, ++ {0x900e7, 0x0}, ++ {0x900e8, 0x0}, ++ {0x900e9, 0x0}, ++ {0x900ea, 0x0}, ++ {0x900eb, 0x0}, ++ {0x900ec, 0x0}, ++ {0x900ed, 0x0}, ++ {0x900ee, 0x0}, ++ {0x900ef, 0x0}, ++ {0x900f0, 0x0}, ++ {0x900f1, 0x0}, ++ {0x900f2, 0x0}, ++ {0x900f3, 0x0}, ++ {0x900f4, 0x0}, ++ {0x900f5, 0x0}, ++ {0x900f6, 0x0}, ++ {0x900f7, 0x0}, ++ {0x900f8, 0x0}, ++ {0x900f9, 0x0}, ++ {0x900fa, 0x0}, ++ {0x900fb, 0x0}, ++ {0x900fc, 0x0}, ++ {0x900fd, 0x0}, ++ {0x900fe, 0x0}, ++ {0x900ff, 0x0}, ++ {0x90100, 0x0}, ++ {0x90101, 0x0}, ++ {0x90102, 0x0}, ++ {0x90103, 0x0}, ++ {0x90104, 0x0}, ++ {0x90105, 0x0}, ++ {0x90106, 0x0}, ++ {0x90107, 0x0}, ++ {0x90108, 0x0}, ++ {0x90109, 0x0}, ++ {0x9010a, 0x0}, ++ {0x9010b, 0x0}, ++ {0x9010c, 0x0}, ++ {0x9010d, 0x0}, ++ {0x9010e, 0x0}, ++ {0x9010f, 0x0}, ++ {0x90110, 0x0}, ++ {0x90111, 0x0}, ++ {0x90112, 0x0}, ++ {0x90113, 0x0}, ++ {0x90114, 0x0}, ++ {0x90115, 0x0}, ++ {0x90116, 0x0}, ++ {0x90117, 0x0}, ++ {0x90118, 0x0}, ++ {0x90119, 0x0}, ++ {0x9011a, 0x0}, ++ {0x9011b, 0x0}, ++ {0x9011c, 0x0}, ++ {0x9011d, 0x0}, ++ {0x9011e, 0x0}, ++ {0x9011f, 0x0}, ++ {0x90120, 0x0}, ++ {0x90121, 0x0}, ++ {0x90122, 0x0}, ++ {0x90123, 0x0}, ++ {0x90124, 0x0}, ++ {0x90125, 0x0}, ++ {0x90126, 0x0}, ++ {0x90127, 0x0}, ++ {0x90128, 0x0}, ++ {0x90129, 0x0}, ++ {0x9012a, 0x0}, ++ {0x9012b, 0x0}, ++ {0x9012c, 0x0}, ++ {0x9012d, 0x0}, ++ {0x9012e, 0x0}, ++ {0x9012f, 0x0}, ++ {0x90130, 0x0}, ++ {0x90131, 0x0}, ++ {0x90132, 0x0}, ++ {0x90133, 0x0}, ++ {0x90134, 0x0}, ++ {0x90135, 0x0}, ++ {0x90136, 0x0}, ++ {0x90137, 0x0}, ++ {0x90138, 0x0}, ++ {0x90139, 0x0}, ++ {0x9013a, 0x0}, ++ {0x9013b, 0x0}, ++ {0x9013c, 0x0}, ++ {0x9013d, 0x0}, ++ {0x9013e, 0x0}, ++ {0x9013f, 0x0}, ++ {0x90140, 0x0}, ++ {0x90141, 0x0}, ++ {0x90142, 0x0}, ++ {0x90143, 0x0}, ++ {0x90144, 0x0}, ++ {0x90145, 0x0}, ++ {0x90146, 0x0}, ++ {0x90147, 0x0}, ++ {0x90148, 0x0}, ++ {0x90149, 0x0}, ++ {0x9014a, 0x0}, ++ {0x9014b, 0x0}, ++ {0x9014c, 0x0}, ++ {0x9014d, 0x0}, ++ {0x9014e, 0x0}, ++ {0x9014f, 0x0}, ++ {0x90150, 0x0}, ++ {0x90151, 0x0}, ++ {0x90152, 0x0}, ++ {0x90153, 0x0}, ++ {0x90154, 0x0}, ++ {0x90155, 0x0}, ++ {0x90156, 0x0}, ++ {0x90157, 0x0}, ++ {0x90158, 0x0}, ++ {0x90159, 0x0}, ++ {0x9015a, 0x0}, ++ {0x9015b, 0x0}, ++ {0x9015c, 0x0}, ++ {0x9015d, 0x0}, ++ {0x9015e, 0x0}, ++ {0x9015f, 0x0}, ++ {0x90160, 0x0}, ++ {0x90161, 0x0}, ++ {0x90162, 0x0}, ++ {0x90163, 0x0}, ++ {0x90164, 0x0}, ++ {0x90165, 0x0}, ++ {0x90166, 0x0}, ++ {0x90167, 0x0}, ++ {0x90168, 0x0}, ++ {0x90169, 0x0}, ++ {0x9016a, 0x0}, ++ {0x9016b, 0x0}, ++ {0x9016c, 0x0}, ++ {0x9016d, 0x0}, ++ {0x9016e, 0x0}, ++ {0x9016f, 0x0}, ++ {0x90170, 0x0}, ++ {0x90171, 0x0}, ++ {0x90172, 0x0}, ++ {0x90173, 0x0}, ++ {0x90174, 0x0}, ++ {0x90175, 0x0}, ++ {0x90176, 0x0}, ++ {0x90177, 0x0}, ++ {0x90178, 0x0}, ++ {0x90179, 0x0}, ++ {0x9017a, 0x0}, ++ {0x9017b, 0x0}, ++ {0x9017c, 0x0}, ++ {0x9017d, 0x0}, ++ {0x9017e, 0x0}, ++ {0x9017f, 0x0}, ++ {0x90180, 0x0}, ++ {0x90181, 0x0}, ++ {0x90182, 0x0}, ++ {0x90183, 0x0}, ++ {0x90184, 0x0}, ++ {0x90185, 0x0}, ++ {0x90186, 0x0}, ++ {0x90187, 0x0}, ++ {0x90188, 0x0}, ++ {0x90189, 0x0}, ++ {0x9018a, 0x0}, ++ {0x9018b, 0x0}, ++ {0x9018c, 0x0}, ++ {0x9018d, 0x0}, ++ {0x9018e, 0x0}, ++ {0x9018f, 0x0}, ++ {0x90190, 0x0}, ++ {0x90191, 0x0}, ++ {0x90192, 0x0}, ++ {0x90193, 0x0}, ++ {0x90194, 0x0}, ++ {0x90195, 0x0}, ++ {0x90196, 0x0}, ++ {0x90197, 0x0}, ++ {0x90198, 0x0}, ++ {0x90199, 0x0}, ++ {0x9019a, 0x0}, ++ {0x9019b, 0x0}, ++ {0x9019c, 0x0}, ++ {0x9019d, 0x0}, ++ {0x9019e, 0x0}, ++ {0x9019f, 0x0}, ++ {0x901a0, 0x0}, ++ {0x901a1, 0x0}, ++ {0x901a2, 0x0}, ++ {0x901a3, 0x0}, ++ {0x901a4, 0x0}, ++ {0x901a5, 0x0}, ++ {0x901a6, 0x0}, ++ {0x901a7, 0x0}, ++ {0x901a8, 0x0}, ++ {0x901a9, 0x0}, ++ {0x901aa, 0x0}, ++ {0x901ab, 0x0}, ++ {0x901ac, 0x0}, ++ {0x901ad, 0x0}, ++ {0x901ae, 0x0}, ++ {0x901af, 0x0}, ++ {0x901b0, 0x0}, ++ {0x901b1, 0x0}, ++ {0x901b2, 0x0}, ++ {0x901b3, 0x0}, ++ {0x901b4, 0x0}, ++ {0x901b5, 0x0}, ++ {0x901b6, 0x0}, ++ {0x901b7, 0x0}, ++ {0x901b8, 0x0}, ++ {0x901b9, 0x0}, ++ {0x901ba, 0x0}, ++ {0x901bb, 0x0}, ++ {0x901bc, 0x0}, ++ {0x901bd, 0x0}, ++ {0x901be, 0x0}, ++ {0x901bf, 0x0}, ++ {0x901c0, 0x0}, ++ {0x901c1, 0x0}, ++ {0x901c2, 0x0}, ++ {0x901c3, 0x0}, ++ {0x901c4, 0x0}, ++ {0x901c5, 0x0}, ++ {0x901c6, 0x0}, ++ {0x901c7, 0x0}, ++ {0x901c8, 0x0}, ++ {0x901c9, 0x0}, ++ {0x901ca, 0x0}, ++ {0x901cb, 0x0}, ++ {0x901cc, 0x0}, ++ {0x901cd, 0x0}, ++ {0x901ce, 0x0}, ++ {0x901cf, 0x0}, ++ {0x901d0, 0x0}, ++ {0x901d1, 0x0}, ++ {0x901d2, 0x0}, ++ {0x901d3, 0x0}, ++ {0x901d4, 0x0}, ++ {0x901d5, 0x0}, ++ {0x901d6, 0x0}, ++ {0x901d7, 0x0}, ++ {0x901d8, 0x0}, ++ {0x901d9, 0x0}, ++ {0x901da, 0x0}, ++ {0x901db, 0x0}, ++ {0x901dc, 0x0}, ++ {0x901dd, 0x0}, ++ {0x901de, 0x0}, ++ {0x901df, 0x0}, ++ {0x901e0, 0x0}, ++ {0x901e1, 0x0}, ++ {0x901e2, 0x0}, ++ {0x901e3, 0x0}, ++ {0x901e4, 0x0}, ++ {0x901e5, 0x0}, ++ {0x901e6, 0x0}, ++ {0x901e7, 0x0}, ++ {0x901e8, 0x0}, ++ {0x901e9, 0x0}, ++ {0x901ea, 0x0}, ++ {0x901eb, 0x0}, ++ {0x901ec, 0x0}, ++ {0x901ed, 0x0}, ++ {0x901ee, 0x0}, ++ {0x901ef, 0x0}, ++ {0x901f0, 0x0}, ++ {0x901f1, 0x0}, ++ {0x901f2, 0x0}, ++ {0x901f3, 0x0}, ++ {0x901f4, 0x0}, ++ {0x901f5, 0x0}, ++ {0x901f6, 0x0}, ++ {0x901f7, 0x0}, ++ {0x901f8, 0x0}, ++ {0x901f9, 0x0}, ++ {0x901fa, 0x0}, ++ {0x901fb, 0x0}, ++ {0x901fc, 0x0}, ++ {0x901fd, 0x0}, ++ {0x901fe, 0x0}, ++ {0x901ff, 0x0}, ++ {0x90200, 0x0}, ++ {0x90201, 0x0}, ++ {0x90202, 0x0}, ++ {0x90203, 0x0}, ++ {0x90204, 0x0}, ++ {0x90205, 0x0}, ++ {0x90206, 0x0}, ++ {0x90207, 0x0}, ++ {0x90208, 0x0}, ++ {0x90209, 0x0}, ++ {0x9020a, 0x0}, ++ {0x9020b, 0x0}, ++ {0x9020c, 0x0}, ++ {0x9020d, 0x0}, ++ {0x9020e, 0x0}, ++ {0x9020f, 0x0}, ++ {0x90210, 0x0}, ++ {0x90211, 0x0}, ++ {0x90212, 0x0}, ++ {0x90213, 0x0}, ++ {0x90214, 0x0}, ++ {0x90215, 0x0}, ++ {0x90216, 0x0}, ++ {0x90217, 0x0}, ++ {0x90218, 0x0}, ++ {0x90219, 0x0}, ++ {0x9021a, 0x0}, ++ {0x9021b, 0x0}, ++ {0x9021c, 0x0}, ++ {0x9021d, 0x0}, ++ {0x9021e, 0x0}, ++ {0x9021f, 0x0}, ++ {0x90220, 0x0}, ++ {0x90221, 0x0}, ++ {0x90222, 0x0}, ++ {0x90223, 0x0}, ++ {0x90224, 0x0}, ++ {0x90225, 0x0}, ++ {0x90226, 0x0}, ++ {0x90227, 0x0}, ++ {0x90228, 0x0}, ++ {0x90229, 0x0}, ++ {0x9022a, 0x0}, ++ {0x9022b, 0x0}, ++ {0x9022c, 0x0}, ++ {0x9022d, 0x0}, ++ {0x9022e, 0x0}, ++ {0x9022f, 0x0}, ++ {0x90230, 0x0}, ++ {0x90231, 0x0}, ++ {0x90232, 0x0}, ++ {0x90233, 0x0}, ++ {0x90234, 0x0}, ++ {0x90235, 0x0}, ++ {0x90236, 0x0}, ++ {0x90237, 0x0}, ++ {0x90238, 0x0}, ++ {0x90239, 0x0}, ++ {0x9023a, 0x0}, ++ {0x9023b, 0x0}, ++ {0x9023c, 0x0}, ++ {0x9023d, 0x0}, ++ {0x9023e, 0x0}, ++ {0x9023f, 0x0}, ++ {0x90240, 0x0}, ++ {0x90241, 0x0}, ++ {0x90242, 0x0}, ++ {0x90243, 0x0}, ++ {0x90244, 0x0}, ++ {0x90245, 0x0}, ++ {0x90246, 0x0}, ++ {0x90247, 0x0}, ++ {0x90248, 0x0}, ++ {0x90249, 0x0}, ++ {0x9024a, 0x0}, ++ {0x9024b, 0x0}, ++ {0x9024c, 0x0}, ++ {0x9024d, 0x0}, ++ {0x9024e, 0x0}, ++ {0x9024f, 0x0}, ++ {0x90250, 0x0}, ++ {0x90251, 0x0}, ++ {0x90252, 0x0}, ++ {0x90253, 0x0}, ++ {0x90254, 0x0}, ++ {0x90255, 0x0}, ++ {0x90256, 0x0}, ++ {0x90257, 0x0}, ++ {0x90258, 0x0}, ++ {0x90259, 0x0}, ++ {0x9025a, 0x0}, ++ {0x9025b, 0x0}, ++ {0x9025c, 0x0}, ++ {0x9025d, 0x0}, ++ {0x9025e, 0x0}, ++ {0x9025f, 0x0}, ++ {0x90260, 0x0}, ++ {0x90261, 0x0}, ++ {0x90262, 0x0}, ++ {0x90263, 0x0}, ++ {0x90264, 0x0}, ++ {0x90265, 0x0}, ++ {0x90266, 0x0}, ++ {0x90267, 0x0}, ++ {0x90268, 0x0}, ++ {0x90269, 0x0}, ++ {0x9026a, 0x0}, ++ {0x9026b, 0x0}, ++ {0x9026c, 0x0}, ++ {0x9026d, 0x0}, ++ {0x9026e, 0x0}, ++ {0x9026f, 0x0}, ++ {0x90270, 0x0}, ++ {0x90271, 0x0}, ++ {0x90272, 0x0}, ++ {0x90273, 0x0}, ++ {0x90274, 0x0}, ++ {0x90275, 0x0}, ++ {0x90276, 0x0}, ++ {0x90277, 0x0}, ++ {0x90278, 0x0}, ++ {0x90279, 0x0}, ++ {0x9027a, 0x0}, ++ {0x9027b, 0x0}, ++ {0x9027c, 0x0}, ++ {0x9027d, 0x0}, ++ {0x9027e, 0x0}, ++ {0x9027f, 0x0}, ++ {0x90280, 0x0}, ++ {0x90281, 0x0}, ++ {0x90282, 0x0}, ++ {0x90283, 0x0}, ++ {0x90284, 0x0}, ++ {0x90285, 0x0}, ++ {0x90286, 0x0}, ++ {0x90287, 0x0}, ++ {0x90288, 0x0}, ++ {0x90289, 0x0}, ++ {0x9028a, 0x0}, ++ {0x9028b, 0x0}, ++ {0x9028c, 0x0}, ++ {0x9028d, 0x0}, ++ {0x9028e, 0x0}, ++ {0x9028f, 0x0}, ++ {0x90290, 0x0}, ++ {0x90291, 0x0}, ++ {0x90292, 0x0}, ++ {0x90293, 0x0}, ++ {0x90294, 0x0}, ++ {0x90295, 0x0}, ++ {0x90296, 0x0}, ++ {0x90297, 0x0}, ++ {0x90298, 0x0}, ++ {0x90299, 0x0}, ++ {0x9029a, 0x0}, ++ {0x9029b, 0x0}, ++ {0x9029c, 0x0}, ++ {0x9029d, 0x0}, ++ {0x9029e, 0x0}, ++ {0x9029f, 0x0}, ++ {0x902a0, 0x0}, ++ {0x902a1, 0x0}, ++ {0x902a2, 0x0}, ++ {0x902a3, 0x0}, ++ {0x902a4, 0x0}, ++ {0x902a5, 0x0}, ++ {0x902a6, 0x0}, ++ {0x902a7, 0x0}, ++ {0x902a8, 0x0}, ++ {0x902a9, 0x0}, ++ {0x902aa, 0x0}, ++ {0x902ab, 0x0}, ++ {0x902ac, 0x0}, ++ {0x902ad, 0x0}, ++ {0x902ae, 0x0}, ++ {0x902af, 0x0}, ++ {0x902b0, 0x0}, ++ {0x902b1, 0x0}, ++ {0x902b2, 0x0}, ++ {0x902b3, 0x0}, ++ {0x902b4, 0x0}, ++ {0x902b5, 0x0}, ++ {0x902b6, 0x0}, ++ {0x902b7, 0x0}, ++ {0x902b8, 0x0}, ++ {0x902b9, 0x0}, ++ {0x902ba, 0x0}, ++ {0x902bb, 0x0}, ++ {0x902bc, 0x0}, ++ {0x902bd, 0x0}, ++ {0x902be, 0x0}, ++ {0x902bf, 0x0}, ++ {0x902c0, 0x0}, ++ {0x902c1, 0x0}, ++ {0x902c2, 0x0}, ++ {0x902c3, 0x0}, ++ {0x902c4, 0x0}, ++ {0x902c5, 0x0}, ++ {0x902c6, 0x0}, ++ {0x902c7, 0x0}, ++ {0x902c8, 0x0}, ++ {0x902c9, 0x0}, ++ {0x902ca, 0x0}, ++ {0x902cb, 0x0}, ++ {0x902cc, 0x0}, ++ {0x902cd, 0x0}, ++ {0x902ce, 0x0}, ++ {0x902cf, 0x0}, ++ {0x902d0, 0x0}, ++ {0x902d1, 0x0}, ++ {0x902d2, 0x0}, ++ {0x902d3, 0x0}, ++ {0x902d4, 0x0}, ++ {0x902d5, 0x0}, ++ {0x902d6, 0x0}, ++ {0x902d7, 0x0}, ++ {0x902d8, 0x0}, ++ {0x902d9, 0x0}, ++ {0x902da, 0x0}, ++ {0x902db, 0x0}, ++ {0x902dc, 0x0}, ++ {0x902dd, 0x0}, ++ {0x902de, 0x0}, ++ {0x902df, 0x0}, ++ {0x902e0, 0x0}, ++ {0x902e1, 0x0}, ++ {0x902e2, 0x0}, ++ {0x902e3, 0x0}, ++ {0x902e4, 0x0}, ++ {0x902e5, 0x0}, ++ {0x902e6, 0x0}, ++ {0x902e7, 0x0}, ++ {0x902e8, 0x0}, ++ {0x902e9, 0x0}, ++ {0x902ea, 0x0}, ++ {0x902eb, 0x0}, ++ {0x902ec, 0x0}, ++ {0x902ed, 0x0}, ++ {0x902ee, 0x0}, ++ {0x902ef, 0x0}, ++ {0x902f0, 0x0}, ++ {0x902f1, 0x0}, ++ {0x902f2, 0x0}, ++ {0x902f3, 0x0}, ++ {0x902f4, 0x0}, ++ {0x902f5, 0x0}, ++ {0x902f6, 0x0}, ++ {0x902f7, 0x0}, ++ {0x902f8, 0x0}, ++ {0x902f9, 0x0}, ++ {0x902fa, 0x0}, ++ {0x902fb, 0x0}, ++ {0x902fc, 0x0}, ++ {0x902fd, 0x0}, ++ {0x902fe, 0x0}, ++ {0x902ff, 0x0}, ++ {0x90300, 0x0}, ++ {0x90301, 0x0}, ++ {0x90302, 0x0}, ++ {0x90303, 0x0}, ++ {0x90304, 0x0}, ++ {0x90305, 0x0}, ++ {0x90306, 0x0}, ++ {0x90307, 0x0}, ++ {0x90308, 0x0}, ++ {0x90309, 0x0}, ++ {0x9030a, 0x0}, ++ {0x9030b, 0x0}, ++ {0x9030c, 0x0}, ++ {0x9030d, 0x0}, ++ {0x9030e, 0x0}, ++ {0x9030f, 0x0}, ++ {0x90310, 0x0}, ++ {0x90311, 0x0}, ++ {0x90312, 0x0}, ++ {0x90313, 0x0}, ++ {0x90314, 0x0}, ++ {0x90315, 0x0}, ++ {0x90316, 0x0}, ++ {0x90317, 0x0}, ++ {0x90318, 0x0}, ++ {0x90319, 0x0}, ++ {0x9031a, 0x0}, ++ {0x9031b, 0x0}, ++ {0x9031c, 0x0}, ++ {0x9031d, 0x0}, ++ {0x9031e, 0x0}, ++ {0x9031f, 0x0}, ++ {0x90320, 0x0}, ++ {0x90321, 0x0}, ++ {0x90322, 0x0}, ++ {0x90323, 0x0}, ++ {0x90324, 0x0}, ++ {0x90325, 0x0}, ++ {0x90326, 0x0}, ++ {0x90327, 0x0}, ++ {0x90328, 0x0}, ++ {0x90329, 0x0}, ++ {0x9032a, 0x0}, ++ {0x9032b, 0x0}, ++ {0x9032c, 0x0}, ++ {0x9032d, 0x0}, ++ {0x9032e, 0x0}, ++ {0x9032f, 0x0}, ++ {0x90330, 0x0}, ++ {0x90331, 0x0}, ++ {0x90332, 0x0}, ++ {0x90333, 0x0}, ++ {0x90334, 0x0}, ++ {0x90335, 0x0}, ++ {0x90336, 0x0}, ++ {0x90337, 0x0}, ++ {0x90338, 0x0}, ++ {0x90339, 0x0}, ++ {0x9033a, 0x0}, ++ {0x9033b, 0x0}, ++ {0x9033c, 0x0}, ++ {0x9033d, 0x0}, ++ {0x9033e, 0x0}, ++ {0x9033f, 0x0}, ++ {0x90340, 0x0}, ++ {0x90341, 0x0}, ++ {0x90342, 0x0}, ++ {0x90343, 0x0}, ++ {0x90344, 0x0}, ++ {0x90345, 0x0}, ++ {0x90346, 0x0}, ++ {0x90347, 0x0}, ++ {0x90348, 0x0}, ++ {0x90349, 0x0}, ++ {0x9034a, 0x0}, ++ {0x9034b, 0x0}, ++ {0x9034c, 0x0}, ++ {0x9034d, 0x0}, ++ {0x9034e, 0x0}, ++ {0x9034f, 0x0}, ++ {0x90350, 0x0}, ++ {0x90351, 0x0}, ++ {0x90352, 0x0}, ++ {0x90353, 0x0}, ++ {0x90354, 0x0}, ++ {0x90355, 0x0}, ++ {0x90356, 0x0}, ++ {0x90357, 0x0}, ++ {0x90358, 0x0}, ++ {0x90359, 0x0}, ++ {0x9035a, 0x0}, ++ {0x9035b, 0x0}, ++ {0x9035c, 0x0}, ++ {0x9035d, 0x0}, ++ {0x9035e, 0x0}, ++ {0x9035f, 0x0}, ++ {0x90360, 0x0}, ++ {0x90361, 0x0}, ++ {0x90362, 0x0}, ++ {0x90363, 0x0}, ++ {0x90364, 0x0}, ++ {0x90365, 0x0}, ++ {0x90366, 0x0}, ++ {0x90367, 0x0}, ++ {0x90368, 0x0}, ++ {0x90369, 0x0}, ++ {0x9036a, 0x0}, ++ {0x9036b, 0x0}, ++ {0x9036c, 0x0}, ++ {0x9036d, 0x0}, ++ {0x9036e, 0x0}, ++ {0x9036f, 0x0}, ++ {0x90370, 0x0}, ++ {0x90371, 0x0}, ++ {0x90372, 0x0}, ++ {0x90373, 0x0}, ++ {0x90374, 0x0}, ++ {0x90375, 0x0}, ++ {0x90376, 0x0}, ++ {0x90377, 0x0}, ++ {0x90378, 0x0}, ++ {0x90379, 0x0}, ++ {0x9037a, 0x0}, ++ {0x9037b, 0x0}, ++ {0x9037c, 0x0}, ++ {0x9037d, 0x0}, ++ {0x9037e, 0x0}, ++ {0x9037f, 0x0}, ++ {0x90380, 0x0}, ++ {0x90381, 0x0}, ++ {0x90382, 0x0}, ++ {0x90383, 0x0}, ++ {0x90384, 0x0}, ++ {0x90385, 0x0}, ++ {0x90386, 0x0}, ++ {0x90387, 0x0}, ++ {0x90388, 0x0}, ++ {0x90389, 0x0}, ++ {0x9038a, 0x0}, ++ {0x9038b, 0x0}, ++ {0x9038c, 0x0}, ++ {0x9038d, 0x0}, ++ {0x9038e, 0x0}, ++ {0x9038f, 0x0}, ++ {0x90390, 0x0}, ++ {0x90391, 0x0}, ++ {0x90392, 0x0}, ++ {0x90393, 0x0}, ++ {0x90394, 0x0}, ++ {0x90395, 0x0}, ++ {0x90396, 0x0}, ++ {0x90397, 0x0}, ++ {0x90398, 0x0}, ++ {0x90399, 0x0}, ++ {0x9039a, 0x0}, ++ {0x9039b, 0x0}, ++ {0x9039c, 0x0}, ++ {0x9039d, 0x0}, ++ {0x9039e, 0x0}, ++ {0x9039f, 0x0}, ++ {0x903a0, 0x0}, ++ {0x903a1, 0x0}, ++ {0x903a2, 0x0}, ++ {0x903a3, 0x0}, ++ {0x903a4, 0x0}, ++ {0x903a5, 0x0}, ++ {0x903a6, 0x0}, ++ {0x903a7, 0x0}, ++ {0x903a8, 0x0}, ++ {0x903a9, 0x0}, ++ {0x903aa, 0x0}, ++ {0x903ab, 0x0}, ++ {0x903ac, 0x0}, ++ {0x903ad, 0x0}, ++ {0x903ae, 0x0}, ++ {0x903af, 0x0}, ++ {0x903b0, 0x0}, ++ {0x903b1, 0x0}, ++ {0x903b2, 0x0}, ++ {0x903b3, 0x0}, ++ {0x903b4, 0x0}, ++ {0x903b5, 0x0}, ++ {0x903b6, 0x0}, ++ {0x903b7, 0x0}, ++ {0x903b8, 0x0}, ++ {0x903b9, 0x0}, ++ {0x903ba, 0x0}, ++ {0x903bb, 0x0}, ++ {0x903bc, 0x0}, ++ {0x903bd, 0x0}, ++ {0x903be, 0x0}, ++ {0x903bf, 0x0}, ++ {0x903c0, 0x0}, ++ {0x903c1, 0x0}, ++ {0x903c2, 0x0}, ++ {0x903c3, 0x0}, ++ {0x903c4, 0x0}, ++ {0x903c5, 0x0}, ++ {0x903c6, 0x0}, ++ {0x903c7, 0x0}, ++ {0x903c8, 0x0}, ++ {0x903c9, 0x0}, ++ {0x903ca, 0x0}, ++ {0x903cb, 0x0}, ++ {0x903cc, 0x0}, ++ {0x903cd, 0x0}, ++ {0x903ce, 0x0}, ++ {0x903cf, 0x0}, ++ {0x903d0, 0x0}, ++ {0x903d1, 0x0}, ++ {0x903d2, 0x0}, ++ {0x903d3, 0x0}, ++ {0x903d4, 0x0}, ++ {0x903d5, 0x0}, ++ {0x903d6, 0x0}, ++ {0x903d7, 0x0}, ++ {0x903d8, 0x0}, ++ {0x903d9, 0x0}, ++ {0x903da, 0x0}, ++ {0x903db, 0x0}, ++ {0x903dc, 0x0}, ++ {0x903dd, 0x0}, ++ {0x903de, 0x0}, ++ {0x903df, 0x0}, ++ {0x903e0, 0x0}, ++ {0x903e1, 0x0}, ++ {0x903e2, 0x0}, ++ {0x903e3, 0x0}, ++ {0x903e4, 0x0}, ++ {0x903e5, 0x0}, ++ {0x903e6, 0x0}, ++ {0x903e7, 0x0}, ++ {0x903e8, 0x0}, ++ {0x903e9, 0x0}, ++ {0x903ea, 0x0}, ++ {0x903eb, 0x0}, ++ {0x903ec, 0x0}, ++ {0x903ed, 0x0}, ++ {0x903ee, 0x0}, ++ {0x903ef, 0x0}, ++ {0x903f0, 0x0}, ++ {0x903f1, 0x0}, ++ {0x903f2, 0x0}, ++ {0x903f3, 0x0}, ++ {0x903f4, 0x0}, ++ {0x903f5, 0x0}, ++ {0x903f6, 0x0}, ++ {0x903f7, 0x0}, ++ {0x903f8, 0x0}, ++ {0x903f9, 0x0}, ++ {0x903fa, 0x0}, ++ {0x903fb, 0x0}, ++ {0x903fc, 0x0}, ++ {0x903fd, 0x0}, ++ {0x903fe, 0x0}, ++ {0x903ff, 0x0}, ++ {0x90400, 0x0}, ++ {0x90401, 0x0}, ++ {0x90402, 0x0}, ++ {0x90403, 0x0}, ++ {0x90404, 0x0}, ++ {0x90405, 0x0}, ++ {0x90406, 0x0}, ++ {0x90407, 0x0}, ++ {0x90408, 0x0}, ++ {0x90409, 0x0}, ++ {0x9040a, 0x0}, ++ {0x9040b, 0x0}, ++ {0x9040c, 0x0}, ++ {0x9040d, 0x0}, ++ {0x9040e, 0x0}, ++ {0x9040f, 0x0}, ++ {0x90410, 0x0}, ++ {0x90411, 0x0}, ++ {0x90412, 0x0}, ++ {0x90413, 0x0}, ++ {0x90414, 0x0}, ++ {0x90415, 0x0}, ++ {0x90416, 0x0}, ++ {0x90417, 0x0}, ++ {0x90418, 0x0}, ++ {0x90419, 0x0}, ++ {0x9041a, 0x0}, ++ {0x9041b, 0x0}, ++ {0x9041c, 0x0}, ++ {0x9041d, 0x0}, ++ {0x9041e, 0x0}, ++ {0x9041f, 0x0}, ++ {0x90420, 0x0}, ++ {0x90421, 0x0}, ++ {0x90422, 0x0}, ++ {0x90423, 0x0}, ++ {0x90424, 0x0}, ++ {0x90425, 0x0}, ++ {0x90426, 0x0}, ++ {0x90427, 0x0}, ++ {0x90428, 0x0}, ++ {0x90429, 0x0}, ++ {0x9042a, 0x0}, ++ {0x9042b, 0x0}, ++ {0x9042c, 0x0}, ++ {0x9042d, 0x0}, ++ {0x9042e, 0x0}, ++ {0x9042f, 0x0}, ++ {0x90430, 0x0}, ++ {0x90431, 0x0}, ++ {0x90432, 0x0}, ++ {0x90433, 0x0}, ++ {0x90434, 0x0}, ++ {0x90435, 0x0}, ++ {0x90436, 0x0}, ++ {0x90437, 0x0}, ++ {0x90438, 0x0}, ++ {0x90439, 0x0}, ++ {0x9043a, 0x0}, ++ {0x9043b, 0x0}, ++ {0x9043c, 0x0}, ++ {0x9043d, 0x0}, ++ {0x9043e, 0x0}, ++ {0x9043f, 0x0}, ++ {0x90440, 0x0}, ++ {0x90441, 0x0}, ++ {0x90442, 0x0}, ++ {0x90443, 0x0}, ++ {0x90444, 0x0}, ++ {0x90445, 0x0}, ++ {0x90446, 0x0}, ++ {0x90447, 0x0}, ++ {0x90448, 0x0}, ++ {0x90449, 0x0}, ++ {0x9044a, 0x0}, ++ {0x9044b, 0x0}, ++ {0x9044c, 0x0}, ++ {0x9044d, 0x0}, ++ {0x9044e, 0x0}, ++ {0x9044f, 0x0}, ++ {0x90450, 0x0}, ++ {0x90451, 0x0}, ++ {0x90452, 0x0}, ++ {0x90453, 0x0}, ++ {0x90454, 0x0}, ++ {0x90455, 0x0}, ++ {0x90456, 0x0}, ++ {0x90457, 0x0}, ++ {0x90458, 0x0}, ++ {0x90459, 0x0}, ++ {0x9045a, 0x0}, ++ {0x9045b, 0x0}, ++ {0x9045c, 0x0}, ++ {0x9045d, 0x0}, ++ {0x9045e, 0x0}, ++ {0x9045f, 0x0}, ++ {0x90460, 0x0}, ++ {0x90461, 0x0}, ++ {0x90462, 0x0}, ++ {0x90463, 0x0}, ++ {0x90464, 0x0}, ++ {0x90465, 0x0}, ++ {0x90466, 0x0}, ++ {0x90467, 0x0}, ++ {0x90468, 0x0}, ++ {0x90469, 0x0}, ++ {0x9046a, 0x0}, ++ {0x9046b, 0x0}, ++ {0x9046c, 0x0}, ++ {0x9046d, 0x0}, ++ {0x9046e, 0x0}, ++ {0x9046f, 0x0}, ++ {0x90470, 0x0}, ++ {0x90471, 0x0}, ++ {0x90472, 0x0}, ++ {0x90473, 0x0}, ++ {0x90474, 0x0}, ++ {0x90475, 0x0}, ++ {0x90476, 0x0}, ++ {0x90477, 0x0}, ++ {0x90478, 0x0}, ++ {0x90479, 0x0}, ++ {0x9047a, 0x0}, ++ {0x9047b, 0x0}, ++ {0x9047c, 0x0}, ++ {0x9047d, 0x0}, ++ {0x9047e, 0x0}, ++ {0x9047f, 0x0}, ++ {0x90480, 0x0}, ++ {0x90481, 0x0}, ++ {0x90482, 0x0}, ++ {0x90483, 0x0}, ++ {0x90484, 0x0}, ++ {0x90485, 0x0}, ++ {0x90486, 0x0}, ++ {0x90487, 0x0}, ++ {0x90488, 0x0}, ++ {0x90489, 0x0}, ++ {0x9048a, 0x0}, ++ {0x9048b, 0x0}, ++ {0x9048c, 0x0}, ++ {0x9048d, 0x0}, ++ {0x9048e, 0x0}, ++ {0x9048f, 0x0}, ++ {0x90490, 0x0}, ++ {0x90491, 0x0}, ++ {0x90492, 0x0}, ++ {0x90493, 0x0}, ++ {0x90494, 0x0}, ++ {0x90495, 0x0}, ++ {0x90496, 0x0}, ++ {0x90497, 0x0}, ++ {0x90498, 0x0}, ++ {0x90499, 0x0}, ++ {0x9049a, 0x0}, ++ {0x9049b, 0x0}, ++ {0x9049c, 0x0}, ++ {0x9049d, 0x0}, ++ {0x9049e, 0x0}, ++ {0x9049f, 0x0}, ++ {0x904a0, 0x0}, ++ {0x904a1, 0x0}, ++ {0x904a2, 0x0}, ++ {0x904a3, 0x0}, ++ {0x904a4, 0x0}, ++ {0x904a5, 0x0}, ++ {0x904a6, 0x0}, ++ {0x904a7, 0x0}, ++ {0x904a8, 0x0}, ++ {0x904a9, 0x0}, ++ {0x904aa, 0x0}, ++ {0x904ab, 0x0}, ++ {0x904ac, 0x0}, ++ {0x904ad, 0x0}, ++ {0x904ae, 0x0}, ++ {0x904af, 0x0}, ++ {0x904b0, 0x0}, ++ {0x904b1, 0x0}, ++ {0x904b2, 0x0}, ++ {0x904b3, 0x0}, ++ {0x904b4, 0x0}, ++ {0x904b5, 0x0}, ++ {0x904b6, 0x0}, ++ {0x904b7, 0x0}, ++ {0x904b8, 0x0}, ++ {0x904b9, 0x0}, ++ {0x904ba, 0x0}, ++ {0x904bb, 0x0}, ++ {0x904bc, 0x0}, ++ {0x904bd, 0x0}, ++ {0x904be, 0x0}, ++ {0x904bf, 0x0}, ++ {0x904c0, 0x0}, ++ {0x904c1, 0x0}, ++ {0x904c2, 0x0}, ++ {0x904c3, 0x0}, ++ {0x904c4, 0x0}, ++ {0x904c5, 0x0}, ++ {0x904c6, 0x0}, ++ {0x904c7, 0x0}, ++ {0x904c8, 0x0}, ++ {0x904c9, 0x0}, ++ {0x904ca, 0x0}, ++ {0x904cb, 0x0}, ++ {0x904cc, 0x0}, ++ {0x904cd, 0x0}, ++ {0x904ce, 0x0}, ++ {0x904cf, 0x0}, ++ {0x904d0, 0x0}, ++ {0x904d1, 0x0}, ++ {0x904d2, 0x0}, ++ {0x904d3, 0x0}, ++ {0x904d4, 0x0}, ++ {0x904d5, 0x0}, ++ {0x904d6, 0x0}, ++ {0x904d7, 0x0}, ++ {0x904d8, 0x0}, ++ {0x904d9, 0x0}, ++ {0x904da, 0x0}, ++ {0x904db, 0x0}, ++ {0x904dc, 0x0}, ++ {0x904dd, 0x0}, ++ {0x904de, 0x0}, ++ {0x904df, 0x0}, ++ {0x904e0, 0x0}, ++ {0x904e1, 0x0}, ++ {0x904e2, 0x0}, ++ {0x904e3, 0x0}, ++ {0x904e4, 0x0}, ++ {0x904e5, 0x0}, ++ {0x904e6, 0x0}, ++ {0x904e7, 0x0}, ++ {0x904e8, 0x0}, ++ {0x904e9, 0x0}, ++ {0x904ea, 0x0}, ++ {0x904eb, 0x0}, ++ {0x904ec, 0x0}, ++ {0x904ed, 0x0}, ++ {0x904ee, 0x0}, ++ {0x904ef, 0x0}, ++ {0x904f0, 0x0}, ++ {0x904f1, 0x0}, ++ {0x904f2, 0x0}, ++ {0x904f3, 0x0}, ++ {0x904f4, 0x0}, ++ {0x904f5, 0x0}, ++ {0x904f6, 0x0}, ++ {0x904f7, 0x0}, ++ {0x904f8, 0x0}, ++ {0x904f9, 0x0}, ++ {0x904fa, 0x0}, ++ {0x904fb, 0x0}, ++ {0x904fc, 0x0}, ++ {0x904fd, 0x0}, ++ {0x904fe, 0x0}, ++ {0x904ff, 0x0}, ++ {0x90500, 0x0}, ++ {0x90501, 0x0}, ++ {0x90502, 0x0}, ++ {0x90503, 0x0}, ++ {0x90504, 0x0}, ++ {0x90505, 0x0}, ++ {0x90506, 0x0}, ++ {0x90507, 0x0}, ++ {0x90508, 0x0}, ++ {0x90509, 0x0}, ++ {0x9050a, 0x0}, ++ {0x9050b, 0x0}, ++ {0x9050c, 0x0}, ++ {0x9050d, 0x0}, ++ {0x9050e, 0x0}, ++ {0x9050f, 0x0}, ++ {0x90510, 0x0}, ++ {0x90511, 0x0}, ++ {0x90512, 0x0}, ++ {0x90513, 0x0}, ++ {0x90514, 0x0}, ++ {0x90515, 0x0}, ++ {0x90516, 0x0}, ++ {0x90517, 0x0}, ++ {0x90518, 0x0}, ++ {0x90519, 0x0}, ++ {0x9051a, 0x0}, ++ {0x9051b, 0x0}, ++ {0x9051c, 0x0}, ++ {0x9051d, 0x0}, ++ {0x9051e, 0x0}, ++ {0x9051f, 0x0}, ++ {0x90520, 0x0}, ++ {0x90521, 0x0}, ++ {0x90522, 0x0}, ++ {0x90523, 0x0}, ++ {0x90524, 0x0}, ++ {0x90525, 0x0}, ++ {0x90526, 0x0}, ++ {0x90527, 0x0}, ++ {0x90528, 0x0}, ++ {0x90529, 0x0}, ++ {0x9052a, 0x0}, ++ {0x9052b, 0x0}, ++ {0x9052c, 0x0}, ++ {0x9052d, 0x0}, ++ {0x9052e, 0x0}, ++ {0x9052f, 0x0}, ++ {0x90530, 0x0}, ++ {0x90531, 0x0}, ++ {0x90532, 0x0}, ++ {0x90533, 0x0}, ++ {0x90534, 0x0}, ++ {0x90535, 0x0}, ++ {0x90536, 0x0}, ++ {0x90537, 0x0}, ++ {0x90538, 0x0}, ++ {0x90539, 0x0}, ++ {0x9053a, 0x0}, ++ {0xd00e7, 0x0}, ++ {0x9001c, 0x0}, ++ {0x90020, 0x0}, ++ {0x90024, 0x0}, ++ {0x90025, 0x0}, ++ {0x90026, 0x0}, ++ {0x9002b, 0x0}, ++ {0x90708, 0x0}, ++ {0x90700, 0x0}, ++ {0x90701, 0x0}, ++ {0x90702, 0x0}, ++ {0x90703, 0x0}, ++ {0x90704, 0x0}, ++ {0x90705, 0x0}, ++ {0x90706, 0x0}, ++ {0x90707, 0x0}, ++ {0x2018a, 0x0}, ++ {0x20124, 0x0}, ++ {0x2018b, 0x0}, ++ {0x20125, 0x0}, ++ {0x2018c, 0x0}, ++ {0x20126, 0x0}, ++ {0x2018d, 0x0}, ++ {0x20127, 0x0}, ++ {0x2018e, 0x0}, ++ {0x20128, 0x0}, ++ {0x2018f, 0x0}, ++ {0x20129, 0x0}, ++ {0x20190, 0x0}, ++ {0x2012a, 0x0}, ++ {0x20191, 0x0}, ++ {0x2012b, 0x0}, ++ {0x20192, 0x0}, ++ {0x2012c, 0x0}, ++ {0x20193, 0x0}, ++ {0x2012d, 0x0}, ++ {0x20194, 0x0}, ++ {0x2012e, 0x0}, ++ {0x20195, 0x0}, ++ {0x2012f, 0x0}, ++ {0x20196, 0x0}, ++ {0x20130, 0x0}, ++ {0x20197, 0x0}, ++ {0x20131, 0x0}, ++ {0x20198, 0x0}, ++ {0x20132, 0x0}, ++ {0x20199, 0x0}, ++ {0x20133, 0x0}, ++ {0x2019a, 0x0}, ++ {0x20134, 0x0}, ++ {0x2019b, 0x0}, ++ {0x20135, 0x0}, ++ {0x2019c, 0x0}, ++ {0x20136, 0x0}, ++ {0x2019d, 0x0}, ++ {0x20137, 0x0}, ++ {0x2019e, 0x0}, ++ {0x20138, 0x0}, ++ {0x2019f, 0x0}, ++ {0x20139, 0x0}, ++ {0x201a0, 0x0}, ++ {0x2013a, 0x0}, ++ {0x201a1, 0x0}, ++ {0x2013b, 0x0}, ++ {0x201a2, 0x0}, ++ {0x2013c, 0x0}, ++ {0x201a3, 0x0}, ++ {0x2013d, 0x0}, ++ {0x201a4, 0x0}, ++ {0x2013e, 0x0}, ++ {0x201a5, 0x0}, ++ {0x2013f, 0x0}, ++ {0x201a6, 0x0}, ++ {0x20140, 0x0}, ++ {0x201a7, 0x0}, ++ {0x20141, 0x0}, ++ {0x201a8, 0x0}, ++ {0x20142, 0x0}, ++ {0x201a9, 0x0}, ++ {0x20143, 0x0}, ++ {0x201aa, 0x0}, ++ {0x20144, 0x0}, ++ {0x201ab, 0x0}, ++ {0x20145, 0x0}, ++ {0x201ac, 0x0}, ++ {0x20146, 0x0}, ++ {0x201ad, 0x0}, ++ {0x20147, 0x0}, ++ {0x201ae, 0x0}, ++ {0x20148, 0x0}, ++ {0x201af, 0x0}, ++ {0x20149, 0x0}, ++ {0x201b0, 0x0}, ++ {0x2014a, 0x0}, ++ {0x201b1, 0x0}, ++ {0x2014b, 0x0}, ++ {0x201b2, 0x0}, ++ {0x2014c, 0x0}, ++ {0x201b3, 0x0}, ++ {0x2014d, 0x0}, ++ {0x201b4, 0x0}, ++ {0x2014e, 0x0}, ++ {0x201b5, 0x0}, ++ {0x2014f, 0x0}, ++ {0x201b6, 0x0}, ++ {0x20150, 0x0}, ++ {0x201b7, 0x0}, ++ {0x20151, 0x0}, ++ {0x201b8, 0x0}, ++ {0x20152, 0x0}, ++ {0x201b9, 0x0}, ++ {0x20153, 0x0}, ++ {0x201ba, 0x0}, ++ {0x20154, 0x0}, ++ {0x201bb, 0x0}, ++ {0x20155, 0x0}, ++ {0x201bc, 0x0}, ++ {0x20156, 0x0}, ++ {0x201bd, 0x0}, ++ {0x20157, 0x0}, ++ {0x201be, 0x0}, ++ {0x20158, 0x0}, ++ {0x201bf, 0x0}, ++ {0x20159, 0x0}, ++ {0x201c0, 0x0}, ++ {0x2015a, 0x0}, ++ {0x201c1, 0x0}, ++ {0x2015b, 0x0}, ++ {0x201c2, 0x0}, ++ {0x2015c, 0x0}, ++ {0x201c3, 0x0}, ++ {0x2015d, 0x0}, ++ {0x201c4, 0x0}, ++ {0x2015e, 0x0}, ++ {0x201c5, 0x0}, ++ {0x2015f, 0x0}, ++ {0x201c6, 0x0}, ++ {0x20160, 0x0}, ++ {0x201c7, 0x0}, ++ {0x20161, 0x0}, ++ {0x201c8, 0x0}, ++ {0x20162, 0x0}, ++ {0x201c9, 0x0}, ++ {0x20163, 0x0}, ++ {0x201ca, 0x0}, ++ {0x20164, 0x0}, ++ {0x201cb, 0x0}, ++ {0x20165, 0x0}, ++ {0x201cc, 0x0}, ++ {0x20166, 0x0}, ++ {0x201cd, 0x0}, ++ {0x20167, 0x0}, ++ {0x201ce, 0x0}, ++ {0x20168, 0x0}, ++ {0x201cf, 0x0}, ++ {0x20169, 0x0}, ++ {0x201d0, 0x0}, ++ {0x2016a, 0x0}, ++ {0x201d1, 0x0}, ++ {0x2016b, 0x0}, ++ {0x201d2, 0x0}, ++ {0x2016c, 0x0}, ++ {0x201d3, 0x0}, ++ {0x2016d, 0x0}, ++ {0x201d4, 0x0}, ++ {0x2016e, 0x0}, ++ {0x201d5, 0x0}, ++ {0x2016f, 0x0}, ++ {0x201d6, 0x0}, ++ {0x20170, 0x0}, ++ {0x201d7, 0x0}, ++ {0x20171, 0x0}, ++ {0x201d8, 0x0}, ++ {0x20172, 0x0}, ++ {0x201d9, 0x0}, ++ {0x20173, 0x0}, ++ {0x201da, 0x0}, ++ {0xc0001, 0x0}, ++ {0xc0002, 0x0}, ++ {0xc0003, 0x0}, ++ {0xc0000, 0x0}, ++ {0xc0006, 0x0}, ++ {0xc0007, 0x0}, ++ {0x9070c, 0x0}, ++ {0x9070d, 0x0}, ++ {0x9070e, 0x0}, ++ {0x9070f, 0x0}, ++ {0x90710, 0x0}, ++ {0x90711, 0x0}, ++ {0x90713, 0x0}, ++ {0x90714, 0x0}, ++ {0x90715, 0x0}, ++ {0x90c10, 0x0}, ++ {0x90c12, 0x0}, ++ {0x90712, 0x0}, ++ {0x90c11, 0x0}, ++ {0x90716, 0x0}, ++ {0x90717, 0x0}, ++ {0x90718, 0x0}, ++ {0x90719, 0x0}, ++ {0x9071a, 0x0}, ++ {0x9071b, 0x0}, ++ {0x90904, 0x0}, ++ {0x90986, 0x0}, ++ {0x90920, 0x0}, ++ {0x90921, 0x0}, ++ {0x90922, 0x0}, ++ {0x90923, 0x0}, ++ {0x90924, 0x0}, ++ {0x90925, 0x0}, ++ {0x90926, 0x0}, ++ {0x90927, 0x0}, ++ {0x90930, 0x0}, ++ {0x90931, 0x0}, ++ {0x90932, 0x0}, ++ {0x90933, 0x0}, ++ {0x9090a, 0x0}, ++ {0x9090c, 0x0}, ++ {0x9090d, 0x0}, ++ {0x200f0, 0x0}, ++ {0x200f1, 0x0}, ++ {0x200f2, 0x0}, ++ {0x100b9, 0x0}, ++ {0x100b1, 0x0}, ++ {0x100ba, 0x0}, ++ {0x100a2, 0x0}, ++ {0x100b5, 0x0}, ++ {0x110b9, 0x0}, ++ {0x110b1, 0x0}, ++ {0x110ba, 0x0}, ++ {0x110a2, 0x0}, ++ {0x110b5, 0x0}, ++ {0x120b9, 0x0}, ++ {0x120b1, 0x0}, ++ {0x120ba, 0x0}, ++ {0x120a2, 0x0}, ++ {0x120b5, 0x0}, ++ {0x130b9, 0x0}, ++ {0x130b1, 0x0}, ++ {0x130ba, 0x0}, ++ {0x130a2, 0x0}, ++ {0x130b5, 0x0}, ++ {0x70024, 0x0}, ++ {0x70025, 0x0}, ++ {0x70026, 0x0}, ++ {0x70027, 0x0}, ++ {0x70028, 0x0}, ++ {0x70029, 0x0}, ++ {0x7002a, 0x0}, ++ {0x7002b, 0x0}, ++ {0x70124, 0x0}, ++ {0x70125, 0x0}, ++ {0x70126, 0x0}, ++ {0x70127, 0x0}, ++ {0x70128, 0x0}, ++ {0x70129, 0x0}, ++ {0x7012a, 0x0}, ++ {0x7012b, 0x0}, ++ {0x70224, 0x0}, ++ {0x70225, 0x0}, ++ {0x70226, 0x0}, ++ {0x70227, 0x0}, ++ {0x70228, 0x0}, ++ {0x70229, 0x0}, ++ {0x7022a, 0x0}, ++ {0x7022b, 0x0}, ++ {0x70324, 0x0}, ++ {0x70325, 0x0}, ++ {0x70326, 0x0}, ++ {0x70327, 0x0}, ++ {0x70328, 0x0}, ++ {0x70329, 0x0}, ++ {0x7032a, 0x0}, ++ {0x7032b, 0x0}, ++ {0x70424, 0x0}, ++ {0x70425, 0x0}, ++ {0x70426, 0x0}, ++ {0x70427, 0x0}, ++ {0x70428, 0x0}, ++ {0x70429, 0x0}, ++ {0x7042a, 0x0}, ++ {0x7042b, 0x0}, ++ {0x70524, 0x0}, ++ {0x70525, 0x0}, ++ {0x70526, 0x0}, ++ {0x70527, 0x0}, ++ {0x70528, 0x0}, ++ {0x70529, 0x0}, ++ {0x7052a, 0x0}, ++ {0x7052b, 0x0}, ++ {0x70624, 0x0}, ++ {0x70625, 0x0}, ++ {0x70626, 0x0}, ++ {0x70627, 0x0}, ++ {0x70628, 0x0}, ++ {0x70629, 0x0}, ++ {0x7062a, 0x0}, ++ {0x7062b, 0x0}, ++ {0x70724, 0x0}, ++ {0x70725, 0x0}, ++ {0x70726, 0x0}, ++ {0x70727, 0x0}, ++ {0x70728, 0x0}, ++ {0x70729, 0x0}, ++ {0x7072a, 0x0}, ++ {0x7072b, 0x0}, ++ {0x70824, 0x0}, ++ {0x70825, 0x0}, ++ {0x70826, 0x0}, ++ {0x70827, 0x0}, ++ {0x70828, 0x0}, ++ {0x70829, 0x0}, ++ {0x7082a, 0x0}, ++ {0x7082b, 0x0}, ++ {0x70065, 0x0}, ++ {0x2007e, 0x0}, ++ {0x200ef, 0x0}, ++ {0x90910, 0x0}, ++ {0x20310, 0x0}, ++ {0x20311, 0x0}, ++ {0x20049, 0x0}, ++ {0x100be, 0x0}, ++ {0x100b0, 0x0}, ++ {0x10080, 0x0}, ++ {0x10081, 0x0}, ++ {0x10082, 0x0}, ++ {0x10083, 0x0}, ++ {0x10084, 0x0}, ++ {0x10085, 0x0}, ++ {0x10086, 0x0}, ++ {0x10087, 0x0}, ++ {0x10056, 0x0}, ++ {0x100d9, 0x0}, ++ {0x110be, 0x0}, ++ {0x110b0, 0x0}, ++ {0x11080, 0x0}, ++ {0x11081, 0x0}, ++ {0x11082, 0x0}, ++ {0x11083, 0x0}, ++ {0x11084, 0x0}, ++ {0x11085, 0x0}, ++ {0x11086, 0x0}, ++ {0x11087, 0x0}, ++ {0x11056, 0x0}, ++ {0x110d9, 0x0}, ++ {0x120be, 0x0}, ++ {0x120b0, 0x0}, ++ {0x12080, 0x0}, ++ {0x12081, 0x0}, ++ {0x12082, 0x0}, ++ {0x12083, 0x0}, ++ {0x12084, 0x0}, ++ {0x12085, 0x0}, ++ {0x12086, 0x0}, ++ {0x12087, 0x0}, ++ {0x12056, 0x0}, ++ {0x120d9, 0x0}, ++ {0x130be, 0x0}, ++ {0x130b0, 0x0}, ++ {0x13080, 0x0}, ++ {0x13081, 0x0}, ++ {0x13082, 0x0}, ++ {0x13083, 0x0}, ++ {0x13084, 0x0}, ++ {0x13085, 0x0}, ++ {0x13086, 0x0}, ++ {0x13087, 0x0}, ++ {0x13056, 0x0}, ++ {0x130d9, 0x0}, ++ {0x30090, 0x0}, ++ {0x30091, 0x0}, ++ {0x30092, 0x0}, ++ {0x30093, 0x0}, ++ {0x30094, 0x0}, ++ {0x30095, 0x0}, ++ {0x30096, 0x0}, ++ {0x31090, 0x0}, ++ {0x31091, 0x0}, ++ {0x31092, 0x0}, ++ {0x31093, 0x0}, ++ {0x31094, 0x0}, ++ {0x31095, 0x0}, ++ {0x31096, 0x0}, ++ {0x30002, 0x0}, ++ {0x30007, 0x0}, ++ {0x30008, 0x0}, ++ {0x30005, 0x0}, ++ {0x30006, 0x0}, ++ {0x30001, 0x0}, ++ {0x30101, 0x0}, ++ {0x30201, 0x0}, ++ {0x30301, 0x0}, ++ {0x30401, 0x0}, ++ {0x30501, 0x0}, ++ {0x30601, 0x0}, ++ {0x30701, 0x0}, ++ {0x30801, 0x0}, ++ {0x30901, 0x0}, ++ {0x31002, 0x0}, ++ {0x31007, 0x0}, ++ {0x31008, 0x0}, ++ {0x31005, 0x0}, ++ {0x31006, 0x0}, ++ {0x31001, 0x0}, ++ {0x31101, 0x0}, ++ {0x31201, 0x0}, ++ {0x31301, 0x0}, ++ {0x31401, 0x0}, ++ {0x31501, 0x0}, ++ {0x31601, 0x0}, ++ {0x31701, 0x0}, ++ {0x31801, 0x0}, ++ {0x31901, 0x0}, ++ {0x10000, 0x0}, ++ {0x100ad, 0x0}, ++ {0x100af, 0x0}, ++ {0x10020, 0x0}, ++ {0x10021, 0x0}, ++ {0x10028, 0x0}, ++ {0x10029, 0x0}, ++ {0x10066, 0x0}, ++ {0x10067, 0x0}, ++ {0x1005a, 0x0}, ++ {0x1005b, 0x0}, ++ {0x1005c, 0x0}, ++ {0x1005d, 0x0}, ++ {0x1002a, 0x0}, ++ {0x1002b, 0x0}, ++ {0x10024, 0x0}, ++ {0x10025, 0x0}, ++ {0x10026, 0x0}, ++ {0x10027, 0x0}, ++ {0x10010, 0x0}, ++ {0x10011, 0x0}, ++ {0x10012, 0x0}, ++ {0x10013, 0x0}, ++ {0x10068, 0x0}, ++ {0x10069, 0x0}, ++ {0x1006a, 0x0}, ++ {0x1006b, 0x0}, ++ {0x1006c, 0x0}, ++ {0x1006d, 0x0}, ++ {0x1006e, 0x0}, ++ {0x1006f, 0x0}, ++ {0x1001c, 0x0}, ++ {0x1001d, 0x0}, ++ {0x1001e, 0x0}, ++ {0x1001f, 0x0}, ++ {0x10124, 0x0}, ++ {0x10125, 0x0}, ++ {0x10126, 0x0}, ++ {0x10127, 0x0}, ++ {0x10110, 0x0}, ++ {0x10111, 0x0}, ++ {0x10112, 0x0}, ++ {0x10113, 0x0}, ++ {0x10168, 0x0}, ++ {0x10169, 0x0}, ++ {0x1016a, 0x0}, ++ {0x1016b, 0x0}, ++ {0x1016c, 0x0}, ++ {0x1016d, 0x0}, ++ {0x1016e, 0x0}, ++ {0x1016f, 0x0}, ++ {0x1011c, 0x0}, ++ {0x1011d, 0x0}, ++ {0x1011e, 0x0}, ++ {0x1011f, 0x0}, ++ {0x10224, 0x0}, ++ {0x10225, 0x0}, ++ {0x10226, 0x0}, ++ {0x10227, 0x0}, ++ {0x10210, 0x0}, ++ {0x10211, 0x0}, ++ {0x10212, 0x0}, ++ {0x10213, 0x0}, ++ {0x10268, 0x0}, ++ {0x10269, 0x0}, ++ {0x1026a, 0x0}, ++ {0x1026b, 0x0}, ++ {0x1026c, 0x0}, ++ {0x1026d, 0x0}, ++ {0x1026e, 0x0}, ++ {0x1026f, 0x0}, ++ {0x1021c, 0x0}, ++ {0x1021d, 0x0}, ++ {0x1021e, 0x0}, ++ {0x1021f, 0x0}, ++ {0x10324, 0x0}, ++ {0x10325, 0x0}, ++ {0x10326, 0x0}, ++ {0x10327, 0x0}, ++ {0x10310, 0x0}, ++ {0x10311, 0x0}, ++ {0x10312, 0x0}, ++ {0x10313, 0x0}, ++ {0x10368, 0x0}, ++ {0x10369, 0x0}, ++ {0x1036a, 0x0}, ++ {0x1036b, 0x0}, ++ {0x1036c, 0x0}, ++ {0x1036d, 0x0}, ++ {0x1036e, 0x0}, ++ {0x1036f, 0x0}, ++ {0x1031c, 0x0}, ++ {0x1031d, 0x0}, ++ {0x1031e, 0x0}, ++ {0x1031f, 0x0}, ++ {0x10424, 0x0}, ++ {0x10425, 0x0}, ++ {0x10426, 0x0}, ++ {0x10427, 0x0}, ++ {0x10410, 0x0}, ++ {0x10411, 0x0}, ++ {0x10412, 0x0}, ++ {0x10413, 0x0}, ++ {0x10468, 0x0}, ++ {0x10469, 0x0}, ++ {0x1046a, 0x0}, ++ {0x1046b, 0x0}, ++ {0x1046c, 0x0}, ++ {0x1046d, 0x0}, ++ {0x1046e, 0x0}, ++ {0x1046f, 0x0}, ++ {0x1041c, 0x0}, ++ {0x1041d, 0x0}, ++ {0x1041e, 0x0}, ++ {0x1041f, 0x0}, ++ {0x10524, 0x0}, ++ {0x10525, 0x0}, ++ {0x10526, 0x0}, ++ {0x10527, 0x0}, ++ {0x10510, 0x0}, ++ {0x10511, 0x0}, ++ {0x10512, 0x0}, ++ {0x10513, 0x0}, ++ {0x10568, 0x0}, ++ {0x10569, 0x0}, ++ {0x1056a, 0x0}, ++ {0x1056b, 0x0}, ++ {0x1056c, 0x0}, ++ {0x1056d, 0x0}, ++ {0x1056e, 0x0}, ++ {0x1056f, 0x0}, ++ {0x1051c, 0x0}, ++ {0x1051d, 0x0}, ++ {0x1051e, 0x0}, ++ {0x1051f, 0x0}, ++ {0x10624, 0x0}, ++ {0x10625, 0x0}, ++ {0x10626, 0x0}, ++ {0x10627, 0x0}, ++ {0x10610, 0x0}, ++ {0x10611, 0x0}, ++ {0x10612, 0x0}, ++ {0x10613, 0x0}, ++ {0x10668, 0x0}, ++ {0x10669, 0x0}, ++ {0x1066a, 0x0}, ++ {0x1066b, 0x0}, ++ {0x1066c, 0x0}, ++ {0x1066d, 0x0}, ++ {0x1066e, 0x0}, ++ {0x1066f, 0x0}, ++ {0x1061c, 0x0}, ++ {0x1061d, 0x0}, ++ {0x1061e, 0x0}, ++ {0x1061f, 0x0}, ++ {0x10724, 0x0}, ++ {0x10725, 0x0}, ++ {0x10726, 0x0}, ++ {0x10727, 0x0}, ++ {0x10710, 0x0}, ++ {0x10711, 0x0}, ++ {0x10712, 0x0}, ++ {0x10713, 0x0}, ++ {0x10768, 0x0}, ++ {0x10769, 0x0}, ++ {0x1076a, 0x0}, ++ {0x1076b, 0x0}, ++ {0x1076c, 0x0}, ++ {0x1076d, 0x0}, ++ {0x1076e, 0x0}, ++ {0x1076f, 0x0}, ++ {0x1071c, 0x0}, ++ {0x1071d, 0x0}, ++ {0x1071e, 0x0}, ++ {0x1071f, 0x0}, ++ {0x10824, 0x0}, ++ {0x10825, 0x0}, ++ {0x10826, 0x0}, ++ {0x10827, 0x0}, ++ {0x10810, 0x0}, ++ {0x10811, 0x0}, ++ {0x10812, 0x0}, ++ {0x10813, 0x0}, ++ {0x10868, 0x0}, ++ {0x10869, 0x0}, ++ {0x1086a, 0x0}, ++ {0x1086b, 0x0}, ++ {0x1086c, 0x0}, ++ {0x1086d, 0x0}, ++ {0x1086e, 0x0}, ++ {0x1086f, 0x0}, ++ {0x1081c, 0x0}, ++ {0x1081d, 0x0}, ++ {0x1081e, 0x0}, ++ {0x1081f, 0x0}, ++ {0x1000c, 0x0}, ++ {0x1000d, 0x0}, ++ {0x10015, 0x0}, ++ {0x10016, 0x0}, ++ {0x10019, 0x0}, ++ {0x1001b, 0x0}, ++ {0x10022, 0x0}, ++ {0x10023, 0x0}, ++ {0x100d0, 0x0}, ++ {0x100d1, 0x0}, ++ {0x100d2, 0x0}, ++ {0x100d3, 0x0}, ++ {0x100d4, 0x0}, ++ {0x11000, 0x0}, ++ {0x110ad, 0x0}, ++ {0x110af, 0x0}, ++ {0x11020, 0x0}, ++ {0x11021, 0x0}, ++ {0x11028, 0x0}, ++ {0x11029, 0x0}, ++ {0x11066, 0x0}, ++ {0x11067, 0x0}, ++ {0x1105a, 0x0}, ++ {0x1105b, 0x0}, ++ {0x1105c, 0x0}, ++ {0x1105d, 0x0}, ++ {0x1102a, 0x0}, ++ {0x1102b, 0x0}, ++ {0x11024, 0x0}, ++ {0x11025, 0x0}, ++ {0x11026, 0x0}, ++ {0x11027, 0x0}, ++ {0x11010, 0x0}, ++ {0x11011, 0x0}, ++ {0x11012, 0x0}, ++ {0x11013, 0x0}, ++ {0x11068, 0x0}, ++ {0x11069, 0x0}, ++ {0x1106a, 0x0}, ++ {0x1106b, 0x0}, ++ {0x1106c, 0x0}, ++ {0x1106d, 0x0}, ++ {0x1106e, 0x0}, ++ {0x1106f, 0x0}, ++ {0x1101c, 0x0}, ++ {0x1101d, 0x0}, ++ {0x1101e, 0x0}, ++ {0x1101f, 0x0}, ++ {0x11124, 0x0}, ++ {0x11125, 0x0}, ++ {0x11126, 0x0}, ++ {0x11127, 0x0}, ++ {0x11110, 0x0}, ++ {0x11111, 0x0}, ++ {0x11112, 0x0}, ++ {0x11113, 0x0}, ++ {0x11168, 0x0}, ++ {0x11169, 0x0}, ++ {0x1116a, 0x0}, ++ {0x1116b, 0x0}, ++ {0x1116c, 0x0}, ++ {0x1116d, 0x0}, ++ {0x1116e, 0x0}, ++ {0x1116f, 0x0}, ++ {0x1111c, 0x0}, ++ {0x1111d, 0x0}, ++ {0x1111e, 0x0}, ++ {0x1111f, 0x0}, ++ {0x11224, 0x0}, ++ {0x11225, 0x0}, ++ {0x11226, 0x0}, ++ {0x11227, 0x0}, ++ {0x11210, 0x0}, ++ {0x11211, 0x0}, ++ {0x11212, 0x0}, ++ {0x11213, 0x0}, ++ {0x11268, 0x0}, ++ {0x11269, 0x0}, ++ {0x1126a, 0x0}, ++ {0x1126b, 0x0}, ++ {0x1126c, 0x0}, ++ {0x1126d, 0x0}, ++ {0x1126e, 0x0}, ++ {0x1126f, 0x0}, ++ {0x1121c, 0x0}, ++ {0x1121d, 0x0}, ++ {0x1121e, 0x0}, ++ {0x1121f, 0x0}, ++ {0x11324, 0x0}, ++ {0x11325, 0x0}, ++ {0x11326, 0x0}, ++ {0x11327, 0x0}, ++ {0x11310, 0x0}, ++ {0x11311, 0x0}, ++ {0x11312, 0x0}, ++ {0x11313, 0x0}, ++ {0x11368, 0x0}, ++ {0x11369, 0x0}, ++ {0x1136a, 0x0}, ++ {0x1136b, 0x0}, ++ {0x1136c, 0x0}, ++ {0x1136d, 0x0}, ++ {0x1136e, 0x0}, ++ {0x1136f, 0x0}, ++ {0x1131c, 0x0}, ++ {0x1131d, 0x0}, ++ {0x1131e, 0x0}, ++ {0x1131f, 0x0}, ++ {0x11424, 0x0}, ++ {0x11425, 0x0}, ++ {0x11426, 0x0}, ++ {0x11427, 0x0}, ++ {0x11410, 0x0}, ++ {0x11411, 0x0}, ++ {0x11412, 0x0}, ++ {0x11413, 0x0}, ++ {0x11468, 0x0}, ++ {0x11469, 0x0}, ++ {0x1146a, 0x0}, ++ {0x1146b, 0x0}, ++ {0x1146c, 0x0}, ++ {0x1146d, 0x0}, ++ {0x1146e, 0x0}, ++ {0x1146f, 0x0}, ++ {0x1141c, 0x0}, ++ {0x1141d, 0x0}, ++ {0x1141e, 0x0}, ++ {0x1141f, 0x0}, ++ {0x11524, 0x0}, ++ {0x11525, 0x0}, ++ {0x11526, 0x0}, ++ {0x11527, 0x0}, ++ {0x11510, 0x0}, ++ {0x11511, 0x0}, ++ {0x11512, 0x0}, ++ {0x11513, 0x0}, ++ {0x11568, 0x0}, ++ {0x11569, 0x0}, ++ {0x1156a, 0x0}, ++ {0x1156b, 0x0}, ++ {0x1156c, 0x0}, ++ {0x1156d, 0x0}, ++ {0x1156e, 0x0}, ++ {0x1156f, 0x0}, ++ {0x1151c, 0x0}, ++ {0x1151d, 0x0}, ++ {0x1151e, 0x0}, ++ {0x1151f, 0x0}, ++ {0x11624, 0x0}, ++ {0x11625, 0x0}, ++ {0x11626, 0x0}, ++ {0x11627, 0x0}, ++ {0x11610, 0x0}, ++ {0x11611, 0x0}, ++ {0x11612, 0x0}, ++ {0x11613, 0x0}, ++ {0x11668, 0x0}, ++ {0x11669, 0x0}, ++ {0x1166a, 0x0}, ++ {0x1166b, 0x0}, ++ {0x1166c, 0x0}, ++ {0x1166d, 0x0}, ++ {0x1166e, 0x0}, ++ {0x1166f, 0x0}, ++ {0x1161c, 0x0}, ++ {0x1161d, 0x0}, ++ {0x1161e, 0x0}, ++ {0x1161f, 0x0}, ++ {0x11724, 0x0}, ++ {0x11725, 0x0}, ++ {0x11726, 0x0}, ++ {0x11727, 0x0}, ++ {0x11710, 0x0}, ++ {0x11711, 0x0}, ++ {0x11712, 0x0}, ++ {0x11713, 0x0}, ++ {0x11768, 0x0}, ++ {0x11769, 0x0}, ++ {0x1176a, 0x0}, ++ {0x1176b, 0x0}, ++ {0x1176c, 0x0}, ++ {0x1176d, 0x0}, ++ {0x1176e, 0x0}, ++ {0x1176f, 0x0}, ++ {0x1171c, 0x0}, ++ {0x1171d, 0x0}, ++ {0x1171e, 0x0}, ++ {0x1171f, 0x0}, ++ {0x11824, 0x0}, ++ {0x11825, 0x0}, ++ {0x11826, 0x0}, ++ {0x11827, 0x0}, ++ {0x11810, 0x0}, ++ {0x11811, 0x0}, ++ {0x11812, 0x0}, ++ {0x11813, 0x0}, ++ {0x11868, 0x0}, ++ {0x11869, 0x0}, ++ {0x1186a, 0x0}, ++ {0x1186b, 0x0}, ++ {0x1186c, 0x0}, ++ {0x1186d, 0x0}, ++ {0x1186e, 0x0}, ++ {0x1186f, 0x0}, ++ {0x1181c, 0x0}, ++ {0x1181d, 0x0}, ++ {0x1181e, 0x0}, ++ {0x1181f, 0x0}, ++ {0x1100c, 0x0}, ++ {0x1100d, 0x0}, ++ {0x11015, 0x0}, ++ {0x11016, 0x0}, ++ {0x11019, 0x0}, ++ {0x1101b, 0x0}, ++ {0x11022, 0x0}, ++ {0x11023, 0x0}, ++ {0x110d0, 0x0}, ++ {0x110d1, 0x0}, ++ {0x110d2, 0x0}, ++ {0x110d3, 0x0}, ++ {0x110d4, 0x0}, ++ {0x12000, 0x0}, ++ {0x120ad, 0x0}, ++ {0x120af, 0x0}, ++ {0x12020, 0x0}, ++ {0x12021, 0x0}, ++ {0x12028, 0x0}, ++ {0x12029, 0x0}, ++ {0x12066, 0x0}, ++ {0x12067, 0x0}, ++ {0x1205a, 0x0}, ++ {0x1205b, 0x0}, ++ {0x1205c, 0x0}, ++ {0x1205d, 0x0}, ++ {0x1202a, 0x0}, ++ {0x1202b, 0x0}, ++ {0x12024, 0x0}, ++ {0x12025, 0x0}, ++ {0x12026, 0x0}, ++ {0x12027, 0x0}, ++ {0x12010, 0x0}, ++ {0x12011, 0x0}, ++ {0x12012, 0x0}, ++ {0x12013, 0x0}, ++ {0x12068, 0x0}, ++ {0x12069, 0x0}, ++ {0x1206a, 0x0}, ++ {0x1206b, 0x0}, ++ {0x1206c, 0x0}, ++ {0x1206d, 0x0}, ++ {0x1206e, 0x0}, ++ {0x1206f, 0x0}, ++ {0x1201c, 0x0}, ++ {0x1201d, 0x0}, ++ {0x1201e, 0x0}, ++ {0x1201f, 0x0}, ++ {0x12124, 0x0}, ++ {0x12125, 0x0}, ++ {0x12126, 0x0}, ++ {0x12127, 0x0}, ++ {0x12110, 0x0}, ++ {0x12111, 0x0}, ++ {0x12112, 0x0}, ++ {0x12113, 0x0}, ++ {0x12168, 0x0}, ++ {0x12169, 0x0}, ++ {0x1216a, 0x0}, ++ {0x1216b, 0x0}, ++ {0x1216c, 0x0}, ++ {0x1216d, 0x0}, ++ {0x1216e, 0x0}, ++ {0x1216f, 0x0}, ++ {0x1211c, 0x0}, ++ {0x1211d, 0x0}, ++ {0x1211e, 0x0}, ++ {0x1211f, 0x0}, ++ {0x12224, 0x0}, ++ {0x12225, 0x0}, ++ {0x12226, 0x0}, ++ {0x12227, 0x0}, ++ {0x12210, 0x0}, ++ {0x12211, 0x0}, ++ {0x12212, 0x0}, ++ {0x12213, 0x0}, ++ {0x12268, 0x0}, ++ {0x12269, 0x0}, ++ {0x1226a, 0x0}, ++ {0x1226b, 0x0}, ++ {0x1226c, 0x0}, ++ {0x1226d, 0x0}, ++ {0x1226e, 0x0}, ++ {0x1226f, 0x0}, ++ {0x1221c, 0x0}, ++ {0x1221d, 0x0}, ++ {0x1221e, 0x0}, ++ {0x1221f, 0x0}, ++ {0x12324, 0x0}, ++ {0x12325, 0x0}, ++ {0x12326, 0x0}, ++ {0x12327, 0x0}, ++ {0x12310, 0x0}, ++ {0x12311, 0x0}, ++ {0x12312, 0x0}, ++ {0x12313, 0x0}, ++ {0x12368, 0x0}, ++ {0x12369, 0x0}, ++ {0x1236a, 0x0}, ++ {0x1236b, 0x0}, ++ {0x1236c, 0x0}, ++ {0x1236d, 0x0}, ++ {0x1236e, 0x0}, ++ {0x1236f, 0x0}, ++ {0x1231c, 0x0}, ++ {0x1231d, 0x0}, ++ {0x1231e, 0x0}, ++ {0x1231f, 0x0}, ++ {0x12424, 0x0}, ++ {0x12425, 0x0}, ++ {0x12426, 0x0}, ++ {0x12427, 0x0}, ++ {0x12410, 0x0}, ++ {0x12411, 0x0}, ++ {0x12412, 0x0}, ++ {0x12413, 0x0}, ++ {0x12468, 0x0}, ++ {0x12469, 0x0}, ++ {0x1246a, 0x0}, ++ {0x1246b, 0x0}, ++ {0x1246c, 0x0}, ++ {0x1246d, 0x0}, ++ {0x1246e, 0x0}, ++ {0x1246f, 0x0}, ++ {0x1241c, 0x0}, ++ {0x1241d, 0x0}, ++ {0x1241e, 0x0}, ++ {0x1241f, 0x0}, ++ {0x12524, 0x0}, ++ {0x12525, 0x0}, ++ {0x12526, 0x0}, ++ {0x12527, 0x0}, ++ {0x12510, 0x0}, ++ {0x12511, 0x0}, ++ {0x12512, 0x0}, ++ {0x12513, 0x0}, ++ {0x12568, 0x0}, ++ {0x12569, 0x0}, ++ {0x1256a, 0x0}, ++ {0x1256b, 0x0}, ++ {0x1256c, 0x0}, ++ {0x1256d, 0x0}, ++ {0x1256e, 0x0}, ++ {0x1256f, 0x0}, ++ {0x1251c, 0x0}, ++ {0x1251d, 0x0}, ++ {0x1251e, 0x0}, ++ {0x1251f, 0x0}, ++ {0x12624, 0x0}, ++ {0x12625, 0x0}, ++ {0x12626, 0x0}, ++ {0x12627, 0x0}, ++ {0x12610, 0x0}, ++ {0x12611, 0x0}, ++ {0x12612, 0x0}, ++ {0x12613, 0x0}, ++ {0x12668, 0x0}, ++ {0x12669, 0x0}, ++ {0x1266a, 0x0}, ++ {0x1266b, 0x0}, ++ {0x1266c, 0x0}, ++ {0x1266d, 0x0}, ++ {0x1266e, 0x0}, ++ {0x1266f, 0x0}, ++ {0x1261c, 0x0}, ++ {0x1261d, 0x0}, ++ {0x1261e, 0x0}, ++ {0x1261f, 0x0}, ++ {0x12724, 0x0}, ++ {0x12725, 0x0}, ++ {0x12726, 0x0}, ++ {0x12727, 0x0}, ++ {0x12710, 0x0}, ++ {0x12711, 0x0}, ++ {0x12712, 0x0}, ++ {0x12713, 0x0}, ++ {0x12768, 0x0}, ++ {0x12769, 0x0}, ++ {0x1276a, 0x0}, ++ {0x1276b, 0x0}, ++ {0x1276c, 0x0}, ++ {0x1276d, 0x0}, ++ {0x1276e, 0x0}, ++ {0x1276f, 0x0}, ++ {0x1271c, 0x0}, ++ {0x1271d, 0x0}, ++ {0x1271e, 0x0}, ++ {0x1271f, 0x0}, ++ {0x12824, 0x0}, ++ {0x12825, 0x0}, ++ {0x12826, 0x0}, ++ {0x12827, 0x0}, ++ {0x12810, 0x0}, ++ {0x12811, 0x0}, ++ {0x12812, 0x0}, ++ {0x12813, 0x0}, ++ {0x12868, 0x0}, ++ {0x12869, 0x0}, ++ {0x1286a, 0x0}, ++ {0x1286b, 0x0}, ++ {0x1286c, 0x0}, ++ {0x1286d, 0x0}, ++ {0x1286e, 0x0}, ++ {0x1286f, 0x0}, ++ {0x1281c, 0x0}, ++ {0x1281d, 0x0}, ++ {0x1281e, 0x0}, ++ {0x1281f, 0x0}, ++ {0x1200c, 0x0}, ++ {0x1200d, 0x0}, ++ {0x12015, 0x0}, ++ {0x12016, 0x0}, ++ {0x12019, 0x0}, ++ {0x1201b, 0x0}, ++ {0x12022, 0x0}, ++ {0x12023, 0x0}, ++ {0x120d0, 0x0}, ++ {0x120d1, 0x0}, ++ {0x120d2, 0x0}, ++ {0x120d3, 0x0}, ++ {0x120d4, 0x0}, ++ {0x13000, 0x0}, ++ {0x130ad, 0x0}, ++ {0x130af, 0x0}, ++ {0x13020, 0x0}, ++ {0x13021, 0x0}, ++ {0x13028, 0x0}, ++ {0x13029, 0x0}, ++ {0x13066, 0x0}, ++ {0x13067, 0x0}, ++ {0x1305a, 0x0}, ++ {0x1305b, 0x0}, ++ {0x1305c, 0x0}, ++ {0x1305d, 0x0}, ++ {0x1302a, 0x0}, ++ {0x1302b, 0x0}, ++ {0x13024, 0x0}, ++ {0x13025, 0x0}, ++ {0x13026, 0x0}, ++ {0x13027, 0x0}, ++ {0x13010, 0x0}, ++ {0x13011, 0x0}, ++ {0x13012, 0x0}, ++ {0x13013, 0x0}, ++ {0x13068, 0x0}, ++ {0x13069, 0x0}, ++ {0x1306a, 0x0}, ++ {0x1306b, 0x0}, ++ {0x1306c, 0x0}, ++ {0x1306d, 0x0}, ++ {0x1306e, 0x0}, ++ {0x1306f, 0x0}, ++ {0x1301c, 0x0}, ++ {0x1301d, 0x0}, ++ {0x1301e, 0x0}, ++ {0x1301f, 0x0}, ++ {0x13124, 0x0}, ++ {0x13125, 0x0}, ++ {0x13126, 0x0}, ++ {0x13127, 0x0}, ++ {0x13110, 0x0}, ++ {0x13111, 0x0}, ++ {0x13112, 0x0}, ++ {0x13113, 0x0}, ++ {0x13168, 0x0}, ++ {0x13169, 0x0}, ++ {0x1316a, 0x0}, ++ {0x1316b, 0x0}, ++ {0x1316c, 0x0}, ++ {0x1316d, 0x0}, ++ {0x1316e, 0x0}, ++ {0x1316f, 0x0}, ++ {0x1311c, 0x0}, ++ {0x1311d, 0x0}, ++ {0x1311e, 0x0}, ++ {0x1311f, 0x0}, ++ {0x13224, 0x0}, ++ {0x13225, 0x0}, ++ {0x13226, 0x0}, ++ {0x13227, 0x0}, ++ {0x13210, 0x0}, ++ {0x13211, 0x0}, ++ {0x13212, 0x0}, ++ {0x13213, 0x0}, ++ {0x13268, 0x0}, ++ {0x13269, 0x0}, ++ {0x1326a, 0x0}, ++ {0x1326b, 0x0}, ++ {0x1326c, 0x0}, ++ {0x1326d, 0x0}, ++ {0x1326e, 0x0}, ++ {0x1326f, 0x0}, ++ {0x1321c, 0x0}, ++ {0x1321d, 0x0}, ++ {0x1321e, 0x0}, ++ {0x1321f, 0x0}, ++ {0x13324, 0x0}, ++ {0x13325, 0x0}, ++ {0x13326, 0x0}, ++ {0x13327, 0x0}, ++ {0x13310, 0x0}, ++ {0x13311, 0x0}, ++ {0x13312, 0x0}, ++ {0x13313, 0x0}, ++ {0x13368, 0x0}, ++ {0x13369, 0x0}, ++ {0x1336a, 0x0}, ++ {0x1336b, 0x0}, ++ {0x1336c, 0x0}, ++ {0x1336d, 0x0}, ++ {0x1336e, 0x0}, ++ {0x1336f, 0x0}, ++ {0x1331c, 0x0}, ++ {0x1331d, 0x0}, ++ {0x1331e, 0x0}, ++ {0x1331f, 0x0}, ++ {0x13424, 0x0}, ++ {0x13425, 0x0}, ++ {0x13426, 0x0}, ++ {0x13427, 0x0}, ++ {0x13410, 0x0}, ++ {0x13411, 0x0}, ++ {0x13412, 0x0}, ++ {0x13413, 0x0}, ++ {0x13468, 0x0}, ++ {0x13469, 0x0}, ++ {0x1346a, 0x0}, ++ {0x1346b, 0x0}, ++ {0x1346c, 0x0}, ++ {0x1346d, 0x0}, ++ {0x1346e, 0x0}, ++ {0x1346f, 0x0}, ++ {0x1341c, 0x0}, ++ {0x1341d, 0x0}, ++ {0x1341e, 0x0}, ++ {0x1341f, 0x0}, ++ {0x13524, 0x0}, ++ {0x13525, 0x0}, ++ {0x13526, 0x0}, ++ {0x13527, 0x0}, ++ {0x13510, 0x0}, ++ {0x13511, 0x0}, ++ {0x13512, 0x0}, ++ {0x13513, 0x0}, ++ {0x13568, 0x0}, ++ {0x13569, 0x0}, ++ {0x1356a, 0x0}, ++ {0x1356b, 0x0}, ++ {0x1356c, 0x0}, ++ {0x1356d, 0x0}, ++ {0x1356e, 0x0}, ++ {0x1356f, 0x0}, ++ {0x1351c, 0x0}, ++ {0x1351d, 0x0}, ++ {0x1351e, 0x0}, ++ {0x1351f, 0x0}, ++ {0x13624, 0x0}, ++ {0x13625, 0x0}, ++ {0x13626, 0x0}, ++ {0x13627, 0x0}, ++ {0x13610, 0x0}, ++ {0x13611, 0x0}, ++ {0x13612, 0x0}, ++ {0x13613, 0x0}, ++ {0x13668, 0x0}, ++ {0x13669, 0x0}, ++ {0x1366a, 0x0}, ++ {0x1366b, 0x0}, ++ {0x1366c, 0x0}, ++ {0x1366d, 0x0}, ++ {0x1366e, 0x0}, ++ {0x1366f, 0x0}, ++ {0x1361c, 0x0}, ++ {0x1361d, 0x0}, ++ {0x1361e, 0x0}, ++ {0x1361f, 0x0}, ++ {0x13724, 0x0}, ++ {0x13725, 0x0}, ++ {0x13726, 0x0}, ++ {0x13727, 0x0}, ++ {0x13710, 0x0}, ++ {0x13711, 0x0}, ++ {0x13712, 0x0}, ++ {0x13713, 0x0}, ++ {0x13768, 0x0}, ++ {0x13769, 0x0}, ++ {0x1376a, 0x0}, ++ {0x1376b, 0x0}, ++ {0x1376c, 0x0}, ++ {0x1376d, 0x0}, ++ {0x1376e, 0x0}, ++ {0x1376f, 0x0}, ++ {0x1371c, 0x0}, ++ {0x1371d, 0x0}, ++ {0x1371e, 0x0}, ++ {0x1371f, 0x0}, ++ {0x13824, 0x0}, ++ {0x13825, 0x0}, ++ {0x13826, 0x0}, ++ {0x13827, 0x0}, ++ {0x13810, 0x0}, ++ {0x13811, 0x0}, ++ {0x13812, 0x0}, ++ {0x13813, 0x0}, ++ {0x13868, 0x0}, ++ {0x13869, 0x0}, ++ {0x1386a, 0x0}, ++ {0x1386b, 0x0}, ++ {0x1386c, 0x0}, ++ {0x1386d, 0x0}, ++ {0x1386e, 0x0}, ++ {0x1386f, 0x0}, ++ {0x1381c, 0x0}, ++ {0x1381d, 0x0}, ++ {0x1381e, 0x0}, ++ {0x1381f, 0x0}, ++ {0x1300c, 0x0}, ++ {0x1300d, 0x0}, ++ {0x13015, 0x0}, ++ {0x13016, 0x0}, ++ {0x13019, 0x0}, ++ {0x1301b, 0x0}, ++ {0x13022, 0x0}, ++ {0x13023, 0x0}, ++ {0x130d0, 0x0}, ++ {0x130d1, 0x0}, ++ {0x130d2, 0x0}, ++ {0x130d3, 0x0}, ++ {0x130d4, 0x0}, ++ {0x90807, 0x0}, ++ {0x90808, 0x0}, ++ {0x90813, 0x0}, ++ {0x2004e, 0x0}, ++ {0x2000d, 0x0}, ++ {0x20077, 0x0}, ++}; ++ ++/* PHY Initialize Configuration for Pstate 0 */ ++static struct ddrphy_cfg_param ddr_phy_fsp0_cfg[] = { ++ {0x90802, 0x1}, ++ {0x2004a, 0x601}, ++ {0x2004b, 0x1c3e}, ++ {0x2004c, 0x2e8f}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x101}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20002, 0x2}, ++ {0x20000, 0x2}, ++ {0x90801, 0x4d}, ++ {0x90809, 0x6800}, ++ {0x1005e, 0x366}, ++ {0x10060, 0x366}, ++ {0x10062, 0x366}, ++ {0x10064, 0x366}, ++ {0x1005f, 0x366}, ++ {0x10061, 0x366}, ++ {0x10063, 0x366}, ++ {0x10065, 0x366}, ++ {0x1105e, 0x366}, ++ {0x11060, 0x366}, ++ {0x11062, 0x366}, ++ {0x11064, 0x366}, ++ {0x1105f, 0x366}, ++ {0x11061, 0x366}, ++ {0x11063, 0x366}, ++ {0x11065, 0x366}, ++ {0x1205e, 0x366}, ++ {0x12060, 0x366}, ++ {0x12062, 0x366}, ++ {0x12064, 0x366}, ++ {0x1205f, 0x366}, ++ {0x12061, 0x366}, ++ {0x12063, 0x366}, ++ {0x12065, 0x366}, ++ {0x1305e, 0x366}, ++ {0x13060, 0x366}, ++ {0x13062, 0x366}, ++ {0x13064, 0x366}, ++ {0x1305f, 0x366}, ++ {0x13061, 0x366}, ++ {0x13063, 0x366}, ++ {0x13065, 0x366}, ++ {0x10005, 0x0}, ++ {0x1000b, 0x0}, ++ {0x11005, 0x0}, ++ {0x1100b, 0x0}, ++ {0x12005, 0x0}, ++ {0x1200b, 0x0}, ++ {0x13005, 0x0}, ++ {0x1300b, 0x0}, ++ {0x20007, 0x200}, ++ {0x20013, 0x2c}, ++ {0x30038, 0x3}, ++ {0x30039, 0x3}, ++ {0x3003a, 0x3}, ++ {0x31038, 0x3}, ++ {0x31039, 0x3}, ++ {0x3103a, 0x3}, ++ {0x10038, 0x3}, ++ {0x1003a, 0x3}, ++ {0x11038, 0x3}, ++ {0x1103a, 0x3}, ++ {0x12038, 0x3}, ++ {0x1203a, 0x3}, ++ {0x13038, 0x3}, ++ {0x1303a, 0x3}, ++ {0x1003b, 0x3}, ++ {0x1103b, 0x3}, ++ {0x1203b, 0x3}, ++ {0x1303b, 0x3}, ++ {0x10009, 0x0}, ++ {0x10037, 0x0}, ++ {0x11009, 0x0}, ++ {0x11037, 0x0}, ++ {0x12009, 0x0}, ++ {0x12037, 0x0}, ++ {0x13009, 0x0}, ++ {0x13037, 0x0}, ++ {0x10004, 0x0}, ++ {0x10003, 0x0}, ++ {0x11004, 0x0}, ++ {0x11003, 0x0}, ++ {0x12004, 0x0}, ++ {0x12003, 0x0}, ++ {0x13004, 0x0}, ++ {0x13003, 0x0}, ++ {0x20004, 0x320}, ++ {0x30050, 0x15}, ++ {0x30051, 0x15}, ++ {0x30052, 0x15}, ++ {0x30053, 0x15}, ++ {0x31050, 0x15}, ++ {0x31051, 0x15}, ++ {0x31052, 0x15}, ++ {0x31053, 0x15}, ++ {0x1004e, 0x15}, ++ {0x1004f, 0x15}, ++ {0x10050, 0x15}, ++ {0x10051, 0x15}, ++ {0x1014e, 0x15}, ++ {0x1014f, 0x15}, ++ {0x10150, 0x15}, ++ {0x10151, 0x15}, ++ {0x1024e, 0x15}, ++ {0x1024f, 0x15}, ++ {0x10250, 0x15}, ++ {0x10251, 0x15}, ++ {0x1034e, 0x15}, ++ {0x1034f, 0x15}, ++ {0x10350, 0x15}, ++ {0x10351, 0x15}, ++ {0x1044e, 0x15}, ++ {0x1044f, 0x15}, ++ {0x10450, 0x15}, ++ {0x10451, 0x15}, ++ {0x1054e, 0x15}, ++ {0x1054f, 0x15}, ++ {0x10550, 0x15}, ++ {0x10551, 0x15}, ++ {0x1064e, 0x15}, ++ {0x1064f, 0x15}, ++ {0x10650, 0x15}, ++ {0x10651, 0x15}, ++ {0x1074e, 0x15}, ++ {0x1074f, 0x15}, ++ {0x10750, 0x15}, ++ {0x10751, 0x15}, ++ {0x1084e, 0x15}, ++ {0x1084f, 0x15}, ++ {0x10850, 0x15}, ++ {0x10851, 0x15}, ++ {0x1104e, 0x15}, ++ {0x1104f, 0x15}, ++ {0x11050, 0x15}, ++ {0x11051, 0x15}, ++ {0x1114e, 0x15}, ++ {0x1114f, 0x15}, ++ {0x11150, 0x15}, ++ {0x11151, 0x15}, ++ {0x1124e, 0x15}, ++ {0x1124f, 0x15}, ++ {0x11250, 0x15}, ++ {0x11251, 0x15}, ++ {0x1134e, 0x15}, ++ {0x1134f, 0x15}, ++ {0x11350, 0x15}, ++ {0x11351, 0x15}, ++ {0x1144e, 0x15}, ++ {0x1144f, 0x15}, ++ {0x11450, 0x15}, ++ {0x11451, 0x15}, ++ {0x1154e, 0x15}, ++ {0x1154f, 0x15}, ++ {0x11550, 0x15}, ++ {0x11551, 0x15}, ++ {0x1164e, 0x15}, ++ {0x1164f, 0x15}, ++ {0x11650, 0x15}, ++ {0x11651, 0x15}, ++ {0x1174e, 0x15}, ++ {0x1174f, 0x15}, ++ {0x11750, 0x15}, ++ {0x11751, 0x15}, ++ {0x1184e, 0x15}, ++ {0x1184f, 0x15}, ++ {0x11850, 0x15}, ++ {0x11851, 0x15}, ++ {0x1204e, 0x15}, ++ {0x1204f, 0x15}, ++ {0x12050, 0x15}, ++ {0x12051, 0x15}, ++ {0x1214e, 0x15}, ++ {0x1214f, 0x15}, ++ {0x12150, 0x15}, ++ {0x12151, 0x15}, ++ {0x1224e, 0x15}, ++ {0x1224f, 0x15}, ++ {0x12250, 0x15}, ++ {0x12251, 0x15}, ++ {0x1234e, 0x15}, ++ {0x1234f, 0x15}, ++ {0x12350, 0x15}, ++ {0x12351, 0x15}, ++ {0x1244e, 0x15}, ++ {0x1244f, 0x15}, ++ {0x12450, 0x15}, ++ {0x12451, 0x15}, ++ {0x1254e, 0x15}, ++ {0x1254f, 0x15}, ++ {0x12550, 0x15}, ++ {0x12551, 0x15}, ++ {0x1264e, 0x15}, ++ {0x1264f, 0x15}, ++ {0x12650, 0x15}, ++ {0x12651, 0x15}, ++ {0x1274e, 0x15}, ++ {0x1274f, 0x15}, ++ {0x12750, 0x15}, ++ {0x12751, 0x15}, ++ {0x1284e, 0x15}, ++ {0x1284f, 0x15}, ++ {0x12850, 0x15}, ++ {0x12851, 0x15}, ++ {0x1304e, 0x15}, ++ {0x1304f, 0x15}, ++ {0x13050, 0x15}, ++ {0x13051, 0x15}, ++ {0x1314e, 0x15}, ++ {0x1314f, 0x15}, ++ {0x13150, 0x15}, ++ {0x13151, 0x15}, ++ {0x1324e, 0x15}, ++ {0x1324f, 0x15}, ++ {0x13250, 0x15}, ++ {0x13251, 0x15}, ++ {0x1334e, 0x15}, ++ {0x1334f, 0x15}, ++ {0x13350, 0x15}, ++ {0x13351, 0x15}, ++ {0x1344e, 0x15}, ++ {0x1344f, 0x15}, ++ {0x13450, 0x15}, ++ {0x13451, 0x15}, ++ {0x1354e, 0x15}, ++ {0x1354f, 0x15}, ++ {0x13550, 0x15}, ++ {0x13551, 0x15}, ++ {0x1364e, 0x15}, ++ {0x1364f, 0x15}, ++ {0x13650, 0x15}, ++ {0x13651, 0x15}, ++ {0x1374e, 0x15}, ++ {0x1374f, 0x15}, ++ {0x13750, 0x15}, ++ {0x13751, 0x15}, ++ {0x1384e, 0x15}, ++ {0x1384f, 0x15}, ++ {0x13850, 0x15}, ++ {0x13851, 0x15}, ++ {0x30030, 0x0}, ++ {0x30031, 0x0}, ++ {0x30035, 0x0}, ++ {0x31030, 0x0}, ++ {0x31031, 0x0}, ++ {0x31035, 0x0}, ++ {0x10030, 0x0}, ++ {0x10035, 0x0}, ++ {0x10036, 0x0}, ++ {0x11030, 0x0}, ++ {0x11035, 0x0}, ++ {0x11036, 0x0}, ++ {0x12030, 0x0}, ++ {0x12035, 0x0}, ++ {0x12036, 0x0}, ++ {0x13030, 0x0}, ++ {0x13035, 0x0}, ++ {0x13036, 0x0}, ++ {0x3003c, 0x5}, ++ {0x3103c, 0x5}, ++ {0x1003c, 0x5}, ++ {0x1003d, 0x5}, ++ {0x1003e, 0x5}, ++ {0x1103c, 0x5}, ++ {0x1103d, 0x5}, ++ {0x1103e, 0x5}, ++ {0x1203c, 0x5}, ++ {0x1203d, 0x5}, ++ {0x1203e, 0x5}, ++ {0x1303c, 0x5}, ++ {0x1303d, 0x5}, ++ {0x1303e, 0x5}, ++ {0x20003, 0x1}, ++ {0x10006, 0x2}, ++ {0x11006, 0x2}, ++ {0x12006, 0x2}, ++ {0x13006, 0x2}, ++ {0x20001, 0x1122}, ++ {0x20009, 0x0}, ++ {0x20008, 0x0}, ++ {0x200d9, 0x1}, ++ {0x30eef, 0x0}, ++ {0x31eef, 0x0}, ++ {0x20014, 0x1301}, ++ {0x9080a, 0x1300}, ++ {0x10040, 0xe0e}, ++ {0x10042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x10043, 0x0}, ++ {0x10044, 0xe0e}, ++ {0x10045, 0xe0e}, ++ {0x11040, 0xe0e}, ++ {0x11042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x11043, 0x0}, ++ {0x11044, 0xe0e}, ++ {0x11045, 0xe0e}, ++ {0x12040, 0xe0e}, ++ {0x12042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x12043, 0x0}, ++ {0x12044, 0xe0e}, ++ {0x12045, 0xe0e}, ++ {0x13040, 0xe0e}, ++ {0x13042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x13043, 0x0}, ++ {0x13044, 0xe0e}, ++ {0x13045, 0xe0e}, ++ {0x30040, 0xe0e}, ++ {0x30041, 0xe0e}, ++ {0x30042, 0xe0e}, ++ {0x30043, 0xe0e}, ++ {0x30330, 0x33}, ++ {0x31040, 0xe0e}, ++ {0x31041, 0xe0e}, ++ {0x31042, 0xe0e}, ++ {0x31043, 0xe0e}, ++ {0x31330, 0x33}, ++ {0x20331, 0x33}, ++ {0x10048, 0xc00}, ++ {0x1004a, 0xc00}, ++ {0x1004b, 0xc00}, ++ {0x1004c, 0xe00}, ++ {0x1004d, 0xe00}, ++ {0x11048, 0xc00}, ++ {0x1104a, 0xc00}, ++ {0x1104b, 0xc00}, ++ {0x1104c, 0xe00}, ++ {0x1104d, 0xe00}, ++ {0x12048, 0xc00}, ++ {0x1204a, 0xc00}, ++ {0x1204b, 0xc00}, ++ {0x1204c, 0xe00}, ++ {0x1204d, 0xe00}, ++ {0x13048, 0xc00}, ++ {0x1304a, 0xc00}, ++ {0x1304b, 0xc00}, ++ {0x1304c, 0xe00}, ++ {0x1304d, 0xe00}, ++ {0x30048, 0xc00}, ++ {0x30049, 0xc00}, ++ {0x3004a, 0xc00}, ++ {0x3004b, 0xc00}, ++ {0x31048, 0xc00}, ++ {0x31049, 0xc00}, ++ {0x3104a, 0xc00}, ++ {0x3104b, 0xc00}, ++ {0x30033, 0xcc}, ++ {0x30034, 0xcc}, ++ {0x3002e, 0xcc}, ++ {0x31033, 0xcc}, ++ {0x31034, 0xcc}, ++ {0x3102e, 0xcc}, ++ {0x10033, 0xcc}, ++ {0x1002e, 0xcc}, ++ {0x1002f, 0xcc}, ++ {0x11033, 0xcc}, ++ {0x1102e, 0xcc}, ++ {0x1102f, 0xcc}, ++ {0x12033, 0xcc}, ++ {0x1202e, 0xcc}, ++ {0x1202f, 0xcc}, ++ {0x13033, 0xcc}, ++ {0x1302e, 0xcc}, ++ {0x1302f, 0xcc}, ++ {0x20015, 0x0}, ++ {0x90806, 0x0}, ++ {0x100e8, 0x0}, ++ {0x100e9, 0x15}, ++ {0x110e8, 0x0}, ++ {0x110e9, 0x15}, ++ {0x120e8, 0x0}, ++ {0x120e9, 0x15}, ++ {0x130e8, 0x0}, ++ {0x130e9, 0x15}, ++ {0x10001, 0x0}, ++ {0x11001, 0x0}, ++ {0x12001, 0x0}, ++ {0x13001, 0x0}, ++ {0x20012, 0xa1a1}, ++ {0x20017, 0x40}, ++ {0x2000a, 0x40}, ++ {0x20186, 0xa1}, ++ {0x20187, 0x40}, ++ {0x20010, 0x0}, ++ {0x20011, 0xf}, ++ {0x9080b, 0xf}, ++ {0x9080c, 0xf}, ++ {0x100a5, 0x1}, ++ {0x110a5, 0x1}, ++ {0x120a5, 0x1}, ++ {0x130a5, 0x1}, ++ {0x10014, 0x3232}, ++ {0x11014, 0x3232}, ++ {0x12014, 0x3232}, ++ {0x13014, 0x3232}, ++ {0x1000f, 0x1086}, ++ {0x1100f, 0x1086}, ++ {0x1200f, 0x1086}, ++ {0x1300f, 0x1086}, ++ {0x20035, 0x100c}, ++ {0x20036, 0x100c}, ++ {0x20037, 0x41c}, ++ {0x20037, 0x45c}, ++ {0x20038, 0x1920}, ++ {0x20039, 0x101c}, ++ {0x2003a, 0x101c}, ++ {0x2003b, 0x42c}, ++ {0x2003c, 0x2d30}, ++ {0x2003d, 0x1004}, ++ {0x2003e, 0x1004}, ++ {0x2003f, 0x414}, ++ {0x20040, 0x1118}, ++ {0x2002c, 0x843}, ++ {0x2002d, 0x843}, ++ {0x20030, 0x843}, ++ {0x2002e, 0x81f}, ++ {0x2002f, 0x81f}, ++ {0x2000c, 0x0}, ++ {0x2001b, 0x0}, ++ {0x10007, 0x0}, ++ {0x11007, 0x0}, ++ {0x12007, 0x0}, ++ {0x13007, 0x0}, ++ {0xc0080, 0x3}, ++}; ++ ++/* P0 message block parameter for training firmware */ ++static struct ddrphy_cfg_param ddr_phy_msgh_fsp0_cfg[] = { ++ {0x58000, 0x4000}, ++ {0x58002, 0x30}, ++ {0x58003, 0x1900}, ++ {0x58004, 0x4}, ++ {0x58005, 0x4}, ++ {0x58008, 0x17df}, ++ {0x58009, 0xc8}, ++ {0x5800b, 0x2}, ++ {0x5800d, 0x100}, ++ {0x5800e, 0xf}, ++ {0x58012, 0x310}, ++ {0x5801f, 0x1000}, ++ {0x58020, 0x3}, ++ {0x5802d, 0xb0b0}, ++ {0x5802e, 0xb0b0}, ++ {0x5802f, 0xbbbb}, ++ {0x58030, 0xbbbb}, ++ {0x58031, 0x606}, ++ {0x58032, 0x606}, ++ {0x58033, 0x5454}, ++ {0x58034, 0x5454}, ++ {0x58035, 0x4646}, ++ {0x58036, 0x4646}, ++ {0x58037, 0x2d2d}, ++ {0x58038, 0x2d2d}, ++ {0x58039, 0x8080}, ++ {0x5803a, 0x8080}, ++ {0x5803b, 0x1c1c}, ++ {0x5803c, 0x1c1c}, ++ {0x5803d, 0x1c1c}, ++ {0x5803e, 0x1c1c}, ++ {0x58041, 0xac84}, ++ {0x58042, 0xac84}, ++ {0x58043, 0x1b1b}, ++ {0x58044, 0x1b1b}, ++ {0x58045, 0x1010}, ++ {0x58046, 0x1010}, ++ {0x58047, 0x202}, ++ {0x58048, 0x202}, ++ {0x5804f, 0x8080}, ++ {0x58050, 0x8080}, ++ {0x58055, 0x404}, ++ {0x58056, 0x404}, ++ {0x58074, 0x2e}, ++ {0x58075, 0x50}, ++ {0x58080, 0x1}, ++ {0x58081, 0x4b00}, ++ {0x58082, 0x43}, ++}; ++ ++/* DRAM PHY init engine image for Pstate 0 */ ++static struct ddrphy_cfg_param ddr_phy_pie_fsp0_cfg[] = { ++ {0x908f0, 0x65}, ++ {0x908f1, 0x258}, ++ {0x908f2, 0x0}, ++ {0x908f3, 0x58}, ++ {0x908f4, 0x14}, ++ {0x908f5, 0x0}, ++ {0x908f6, 0xb0}, ++ {0x908f7, 0x0}, ++ {0x41008, 0xc9d8}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0xc808}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x2b00}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0xc958}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0xcd88}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x2b00}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0xc0d8}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0xd848}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x2b00}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0xc158}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0xddc8}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x2b00}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0xc1d8}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0xc308}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x2b00}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0xc558}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0xea08}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x2b00}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0xc5d8}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0xe308}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x2b00}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x48d8}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x4248}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x88d8}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x9648}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x2b00}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0xca58}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0xc108}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x2b00}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0xcb58}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0xc008}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x2b00}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0xd4d8}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0xc008}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0x20015, 0x0}, ++ {0x3004a, 0x0}, ++ {0x3004b, 0x0}, ++ {0x3104a, 0x0}, ++ {0x3104b, 0x0}, ++ {0x2004a, 0x1a3e}, ++ {0x2004b, 0x1a3e}, ++ {0x2004c, 0x2c0f}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x101}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20041, 0x1}, ++ {0x90802, 0x0}, ++ {0x20045, 0x2}, ++ {0x10057, 0x0}, ++ {0x11057, 0x0}, ++ {0x12057, 0x0}, ++ {0x13057, 0x0}, ++ {0x1000f, 0x1087}, ++ {0x1100f, 0x1087}, ++ {0x1200f, 0x1087}, ++ {0x1300f, 0x1087}, ++ {0x90803, 0x4}, ++ {0x90804, 0x82}, ++ {0x90805, 0x1}, ++ {0x90903, 0x0}, ++ {0x9090b, 0x2}, ++ {0x90811, 0x0}, ++ {0x90812, 0xff00}, ++ {0x20072, 0x3}, ++ {0x9080e, 0x3}, ++ {0x20073, 0x3}, ++ {0x9080f, 0x3}, ++}; ++ ++/* DRAM PHY init engine image */ ++static struct ddrphy_cfg_param ddr_phy_pie[] = { ++ {0x41000, 0x0}, ++ {0x41001, 0x0}, ++ {0x41002, 0x0}, ++ {0x41003, 0x0}, ++ {0x41004, 0x0}, ++ {0x41005, 0x0}, ++ {0x41006, 0x0}, ++ {0x41007, 0x0}, ++ {0x41388, 0xc028}, ++ {0x41389, 0x0}, ++ {0x4138a, 0x0}, ++ {0x4138b, 0x10}, ++ {0x4138c, 0x0}, ++ {0x4138d, 0x0}, ++ {0x4138e, 0x0}, ++ {0x4138f, 0x0}, ++ {0x41390, 0x0}, ++ {0x41391, 0x0}, ++ {0x41392, 0x0}, ++ {0x41393, 0x400}, ++ {0x41394, 0x0}, ++ {0x41395, 0x0}, ++ {0x41396, 0x0}, ++ {0x41397, 0x0}, ++ {0x41398, 0x0}, ++ {0x41399, 0x0}, ++ {0x4139a, 0x0}, ++ {0x4139b, 0x0}, ++ {0x4139c, 0x0}, ++ {0x4139d, 0x0}, ++ {0x4139e, 0x0}, ++ {0x4139f, 0x0}, ++ {0x413a0, 0xc858}, ++ {0x413a1, 0x0}, ++ {0x413a2, 0x0}, ++ {0x413a3, 0x10}, ++ {0x413a4, 0xe088}, ++ {0x413a5, 0x0}, ++ {0x413a6, 0x0}, ++ {0x413a7, 0x10}, ++ {0x413a8, 0xe038}, ++ {0x413a9, 0x0}, ++ {0x413aa, 0x0}, ++ {0x413ab, 0x10}, ++ {0x413ac, 0xc858}, ++ {0x413ad, 0x0}, ++ {0x413ae, 0x0}, ++ {0x413af, 0x10}, ++ {0x413b0, 0xc088}, ++ {0x413b1, 0x0}, ++ {0x413b2, 0x0}, ++ {0x413b3, 0x10}, ++ {0x413b4, 0x0}, ++ {0x413b5, 0x0}, ++ {0x413b6, 0x0}, ++ {0x413b7, 0x0}, ++ {0x413b8, 0xc028}, ++ {0x413b9, 0x0}, ++ {0x413ba, 0x0}, ++ {0x413bb, 0x10}, ++ {0x413bc, 0x0}, ++ {0x413bd, 0x0}, ++ {0x413be, 0x0}, ++ {0x413bf, 0x0}, ++ {0x413c0, 0x0}, ++ {0x413c1, 0x0}, ++ {0x413c2, 0x0}, ++ {0x413c3, 0x400}, ++ {0x413c4, 0x0}, ++ {0x413c5, 0x0}, ++ {0x413c6, 0x0}, ++ {0x413c7, 0x0}, ++ {0x413c8, 0x0}, ++ {0x413c9, 0x0}, ++ {0x413ca, 0x0}, ++ {0x413cb, 0x0}, ++ {0x413cc, 0x0}, ++ {0x413cd, 0x0}, ++ {0x413ce, 0x0}, ++ {0x413cf, 0x0}, ++ {0x413d0, 0xc858}, ++ {0x413d1, 0x0}, ++ {0x413d2, 0x0}, ++ {0x413d3, 0x10}, ++ {0x413d4, 0xe208}, ++ {0x413d5, 0x0}, ++ {0x413d6, 0x0}, ++ {0x413d7, 0x10}, ++ {0x413d8, 0xe038}, ++ {0x413d9, 0x0}, ++ {0x413da, 0x0}, ++ {0x413db, 0x10}, ++ {0x413dc, 0xc858}, ++ {0x413dd, 0x0}, ++ {0x413de, 0x0}, ++ {0x413df, 0x10}, ++ {0x413e0, 0xc208}, ++ {0x413e1, 0x0}, ++ {0x413e2, 0x0}, ++ {0x413e3, 0x10}, ++ {0x413e4, 0x0}, ++ {0x413e5, 0x0}, ++ {0x413e6, 0x0}, ++ {0x413e7, 0x0}, ++ {0x413e8, 0xce58}, ++ {0x413e9, 0x0}, ++ {0x413ea, 0x0}, ++ {0x413eb, 0x10}, ++ {0x413ec, 0xc208}, ++ {0x413ed, 0x0}, ++ {0x413ee, 0x0}, ++ {0x413ef, 0x10}, ++ {0x413f0, 0x0}, ++ {0x413f1, 0x0}, ++ {0x413f2, 0x0}, ++ {0x413f3, 0x0}, ++ {0x413f4, 0x0}, ++ {0x413f5, 0x0}, ++ {0x413f6, 0x0}, ++ {0x413f7, 0x0}, ++ {0x413f8, 0xc370}, ++ {0x413f9, 0x0}, ++ {0x413fa, 0x0}, ++ {0x413fb, 0x10}, ++ {0x413fc, 0x0}, ++ {0x413fd, 0x0}, ++ {0x413fe, 0x0}, ++ {0x413ff, 0x0}, ++ {0x41400, 0xc040}, ++ {0x41401, 0x0}, ++ {0x41402, 0x0}, ++ {0x41403, 0x10}, ++ {0x41404, 0x0}, ++ {0x41405, 0x0}, ++ {0x41406, 0x0}, ++ {0x41407, 0x10}, ++ {0x41408, 0xd2d8}, ++ {0x41409, 0x0}, ++ {0x4140a, 0x0}, ++ {0x4140b, 0x10}, ++ {0x4140c, 0xe008}, ++ {0x4140d, 0x0}, ++ {0x4140e, 0x0}, ++ {0x4140f, 0x10}, ++ {0x41410, 0x0}, ++ {0x41411, 0x0}, ++ {0x41412, 0x0}, ++ {0x41413, 0x5b00}, ++ {0x41414, 0x0}, ++ {0x41415, 0x0}, ++ {0x41416, 0x0}, ++ {0x41417, 0x0}, ++ {0x41418, 0xc0f0}, ++ {0x41419, 0x0}, ++ {0x4141a, 0x0}, ++ {0x4141b, 0x10}, ++ {0x4141c, 0x0}, ++ {0x4141d, 0x0}, ++ {0x4141e, 0x0}, ++ {0x4141f, 0x0}, ++ {0x41420, 0xcfd8}, ++ {0x41421, 0x0}, ++ {0x41422, 0x0}, ++ {0x41423, 0x10}, ++ {0x41424, 0xc008}, ++ {0x41425, 0x0}, ++ {0x41426, 0x0}, ++ {0x41427, 0x10}, ++ {0x41428, 0x0}, ++ {0x41429, 0x0}, ++ {0x4142a, 0x0}, ++ {0x4142b, 0x2b00}, ++ {0x4142c, 0x0}, ++ {0x4142d, 0x0}, ++ {0x4142e, 0x0}, ++ {0x4142f, 0x0}, ++ {0x41430, 0xd058}, ++ {0x41431, 0x0}, ++ {0x41432, 0x0}, ++ {0x41433, 0x10}, ++ {0x41434, 0xc008}, ++ {0x41435, 0x0}, ++ {0x41436, 0x0}, ++ {0x41437, 0x10}, ++ {0x41438, 0x0}, ++ {0x41439, 0x0}, ++ {0x4143a, 0x0}, ++ {0x4143b, 0x2b00}, ++ {0x4143c, 0x0}, ++ {0x4143d, 0x0}, ++ {0x4143e, 0x0}, ++ {0x4143f, 0x0}, ++ {0x41440, 0xd0d8}, ++ {0x41441, 0x0}, ++ {0x41442, 0x0}, ++ {0x41443, 0x10}, ++ {0x41444, 0xc088}, ++ {0x41445, 0x0}, ++ {0x41446, 0x0}, ++ {0x41447, 0x10}, ++ {0x41448, 0x0}, ++ {0x41449, 0x0}, ++ {0x4144a, 0x0}, ++ {0x4144b, 0x2b00}, ++ {0x4144c, 0x0}, ++ {0x4144d, 0x0}, ++ {0x4144e, 0x0}, ++ {0x4144f, 0x0}, ++ {0x41450, 0xd158}, ++ {0x41451, 0x0}, ++ {0x41452, 0x0}, ++ {0x41453, 0x10}, ++ {0x41454, 0xc008}, ++ {0x41455, 0x0}, ++ {0x41456, 0x0}, ++ {0x41457, 0x10}, ++ {0x41458, 0x0}, ++ {0x41459, 0x0}, ++ {0x4145a, 0x0}, ++ {0x4145b, 0x5b00}, ++ {0x4145c, 0x0}, ++ {0x4145d, 0x0}, ++ {0x4145e, 0x0}, ++ {0x4145f, 0x0}, ++ {0x41460, 0x402c}, ++ {0x41461, 0xd00}, ++ {0x41462, 0x1}, ++ {0x41463, 0x400}, ++ {0x41464, 0x4050}, ++ {0x41465, 0x800}, ++ {0x41466, 0x0}, ++ {0x41467, 0x0}, ++ {0x41468, 0x0}, ++ {0x41469, 0x0}, ++ {0x4146a, 0x0}, ++ {0x4146b, 0x400}, ++ {0x4146c, 0x0}, ++ {0x4146d, 0x0}, ++ {0x4146e, 0x0}, ++ {0x4146f, 0x0}, ++ {0x41470, 0x0}, ++ {0x41471, 0x0}, ++ {0x41472, 0x0}, ++ {0x41473, 0x400}, ++ {0x41474, 0x4050}, ++ {0x41475, 0x803}, ++ {0x41476, 0x0}, ++ {0x41477, 0x0}, ++ {0x41478, 0x0}, ++ {0x41479, 0x0}, ++ {0x4147a, 0x0}, ++ {0x4147b, 0x7f00}, ++ {0x4147c, 0x0}, ++ {0x4147d, 0x0}, ++ {0x4147e, 0x0}, ++ {0x4147f, 0x400}, ++ {0x41480, 0x407c}, ++ {0x41481, 0x0}, ++ {0x41482, 0x0}, ++ {0x41483, 0x400}, ++ {0x41484, 0x0}, ++ {0x41485, 0x0}, ++ {0x41486, 0x0}, ++ {0x41487, 0x0}, ++ {0x41488, 0x0}, ++ {0x41489, 0x0}, ++ {0x4148a, 0x0}, ++ {0x4148b, 0x400}, ++ {0x4148c, 0x0}, ++ {0x4148d, 0x0}, ++ {0x4148e, 0x1}, ++ {0x4148f, 0x0}, ++ {0x41490, 0x0}, ++ {0x41491, 0x0}, ++ {0x41492, 0x0}, ++ {0x41493, 0x400}, ++ {0x41494, 0x0}, ++ {0x41495, 0x0}, ++ {0x41496, 0x0}, ++ {0x41497, 0x0}, ++ {0x41498, 0x0}, ++ {0x41499, 0x0}, ++ {0x4149a, 0x0}, ++ {0x4149b, 0x0}, ++ {0x4149c, 0x0}, ++ {0x4149d, 0x0}, ++ {0x4149e, 0x0}, ++ {0x4149f, 0x0}, ++ {0x414a0, 0x802c}, ++ {0x414a1, 0xd00}, ++ {0x414a2, 0x1}, ++ {0x414a3, 0x410}, ++ {0x414a4, 0x8050}, ++ {0x414a5, 0x800}, ++ {0x414a6, 0x0}, ++ {0x414a7, 0x10}, ++ {0x414a8, 0x0}, ++ {0x414a9, 0x0}, ++ {0x414aa, 0x0}, ++ {0x414ab, 0x400}, ++ {0x414ac, 0x0}, ++ {0x414ad, 0x0}, ++ {0x414ae, 0x0}, ++ {0x414af, 0x0}, ++ {0x414b0, 0x0}, ++ {0x414b1, 0x0}, ++ {0x414b2, 0x0}, ++ {0x414b3, 0x400}, ++ {0x414b4, 0x8050}, ++ {0x414b5, 0x803}, ++ {0x414b6, 0x0}, ++ {0x414b7, 0x10}, ++ {0x414b8, 0x0}, ++ {0x414b9, 0x0}, ++ {0x414ba, 0x0}, ++ {0x414bb, 0x7f00}, ++ {0x414bc, 0x0}, ++ {0x414bd, 0x0}, ++ {0x414be, 0x0}, ++ {0x414bf, 0x400}, ++ {0x414c0, 0x807c}, ++ {0x414c1, 0x0}, ++ {0x414c2, 0x0}, ++ {0x414c3, 0x410}, ++ {0x414c4, 0x0}, ++ {0x414c5, 0x0}, ++ {0x414c6, 0x0}, ++ {0x414c7, 0x0}, ++ {0x414c8, 0x0}, ++ {0x414c9, 0x0}, ++ {0x414ca, 0x0}, ++ {0x414cb, 0x400}, ++ {0x414cc, 0x0}, ++ {0x414cd, 0x0}, ++ {0x414ce, 0x1}, ++ {0x414cf, 0x0}, ++ {0x414d0, 0x0}, ++ {0x414d1, 0x0}, ++ {0x414d2, 0x0}, ++ {0x414d3, 0x400}, ++ {0x414d4, 0x0}, ++ {0x414d5, 0x0}, ++ {0x414d6, 0x0}, ++ {0x414d7, 0x0}, ++ {0x414d8, 0x0}, ++ {0x414d9, 0x0}, ++ {0x414da, 0x0}, ++ {0x414db, 0x0}, ++ {0x414dc, 0x0}, ++ {0x414dd, 0x0}, ++ {0x414de, 0x0}, ++ {0x414df, 0x0}, ++ {0x414e0, 0x402c}, ++ {0x414e1, 0xd00}, ++ {0x414e2, 0x1}, ++ {0x414e3, 0x0}, ++ {0x414e4, 0x4050}, ++ {0x414e5, 0x800}, ++ {0x414e6, 0x0}, ++ {0x414e7, 0x0}, ++ {0x414e8, 0x0}, ++ {0x414e9, 0x0}, ++ {0x414ea, 0x0}, ++ {0x414eb, 0x0}, ++ {0x414ec, 0x0}, ++ {0x414ed, 0x0}, ++ {0x414ee, 0x0}, ++ {0x414ef, 0x0}, ++ {0x414f0, 0x0}, ++ {0x414f1, 0x0}, ++ {0x414f2, 0x0}, ++ {0x414f3, 0x0}, ++ {0x414f4, 0x4050}, ++ {0x414f5, 0x803}, ++ {0x414f6, 0x0}, ++ {0x414f7, 0x0}, ++ {0x414f8, 0x0}, ++ {0x414f9, 0x0}, ++ {0x414fa, 0x0}, ++ {0x414fb, 0x0}, ++ {0x414fc, 0x0}, ++ {0x414fd, 0x0}, ++ {0x414fe, 0x0}, ++ {0x414ff, 0x0}, ++ {0x41500, 0x0}, ++ {0x41501, 0x0}, ++ {0x41502, 0x0}, ++ {0x41503, 0x0}, ++ {0x41504, 0x4050}, ++ {0x41505, 0x800}, ++ {0x41506, 0x0}, ++ {0x41507, 0x0}, ++ {0x41508, 0x0}, ++ {0x41509, 0x0}, ++ {0x4150a, 0x0}, ++ {0x4150b, 0x6b00}, ++ {0x4150c, 0x0}, ++ {0x4150d, 0x0}, ++ {0x4150e, 0x0}, ++ {0x4150f, 0x400}, ++ {0x41510, 0x0}, ++ {0x41511, 0x0}, ++ {0x41512, 0x0}, ++ {0x41513, 0x0}, ++ {0x41514, 0x407c}, ++ {0x41515, 0x0}, ++ {0x41516, 0x0}, ++ {0x41517, 0x0}, ++ {0x41518, 0x0}, ++ {0x41519, 0x0}, ++ {0x4151a, 0x0}, ++ {0x4151b, 0x0}, ++ {0x4151c, 0x0}, ++ {0x4151d, 0x0}, ++ {0x4151e, 0x0}, ++ {0x4151f, 0x0}, ++ {0x41520, 0x0}, ++ {0x41521, 0x0}, ++ {0x41522, 0x1}, ++ {0x41523, 0x0}, ++ {0x41524, 0x0}, ++ {0x41525, 0x0}, ++ {0x41526, 0x0}, ++ {0x41527, 0x0}, ++ {0x41528, 0x0}, ++ {0x41529, 0x0}, ++ {0x4152a, 0x0}, ++ {0x4152b, 0x4b00}, ++ {0x4152c, 0x0}, ++ {0x4152d, 0x0}, ++ {0x4152e, 0x0}, ++ {0x4152f, 0x1800}, ++ {0x41530, 0x0}, ++ {0x41531, 0x0}, ++ {0x41532, 0x0}, ++ {0x41533, 0x0}, ++ {0x41534, 0x802c}, ++ {0x41535, 0xd00}, ++ {0x41536, 0x1}, ++ {0x41537, 0x10}, ++ {0x41538, 0x8050}, ++ {0x41539, 0x800}, ++ {0x4153a, 0x0}, ++ {0x4153b, 0x10}, ++ {0x4153c, 0x0}, ++ {0x4153d, 0x0}, ++ {0x4153e, 0x0}, ++ {0x4153f, 0x0}, ++ {0x41540, 0x0}, ++ {0x41541, 0x0}, ++ {0x41542, 0x0}, ++ {0x41543, 0x0}, ++ {0x41544, 0x0}, ++ {0x41545, 0x0}, ++ {0x41546, 0x0}, ++ {0x41547, 0x0}, ++ {0x41548, 0x8050}, ++ {0x41549, 0x803}, ++ {0x4154a, 0x0}, ++ {0x4154b, 0x10}, ++ {0x4154c, 0x0}, ++ {0x4154d, 0x0}, ++ {0x4154e, 0x0}, ++ {0x4154f, 0x0}, ++ {0x41550, 0x0}, ++ {0x41551, 0x0}, ++ {0x41552, 0x0}, ++ {0x41553, 0x0}, ++ {0x41554, 0x0}, ++ {0x41555, 0x0}, ++ {0x41556, 0x0}, ++ {0x41557, 0x0}, ++ {0x41558, 0x8050}, ++ {0x41559, 0x800}, ++ {0x4155a, 0x0}, ++ {0x4155b, 0x10}, ++ {0x4155c, 0x0}, ++ {0x4155d, 0x0}, ++ {0x4155e, 0x0}, ++ {0x4155f, 0x0}, ++ {0x41560, 0x0}, ++ {0x41561, 0x0}, ++ {0x41562, 0x0}, ++ {0x41563, 0x6b00}, ++ {0x41564, 0x0}, ++ {0x41565, 0x0}, ++ {0x41566, 0x0}, ++ {0x41567, 0x400}, ++ {0x41568, 0x807c}, ++ {0x41569, 0x0}, ++ {0x4156a, 0x0}, ++ {0x4156b, 0x10}, ++ {0x4156c, 0x0}, ++ {0x4156d, 0x0}, ++ {0x4156e, 0x0}, ++ {0x4156f, 0x0}, ++ {0x41570, 0x0}, ++ {0x41571, 0x0}, ++ {0x41572, 0x0}, ++ {0x41573, 0x0}, ++ {0x41574, 0x0}, ++ {0x41575, 0x0}, ++ {0x41576, 0x1}, ++ {0x41577, 0x0}, ++ {0x41578, 0x0}, ++ {0x41579, 0x0}, ++ {0x4157a, 0x0}, ++ {0x4157b, 0x7b00}, ++ {0x4157c, 0x0}, ++ {0x4157d, 0x0}, ++ {0x4157e, 0x0}, ++ {0x4157f, 0x2000}, ++ {0x41580, 0x402c}, ++ {0x41581, 0xd00}, ++ {0x41582, 0x1}, ++ {0x41583, 0x0}, ++ {0x41584, 0x5198}, ++ {0x41585, 0x803}, ++ {0x41586, 0x0}, ++ {0x41587, 0x0}, ++ {0x41588, 0x0}, ++ {0x41589, 0x0}, ++ {0x4158a, 0x0}, ++ {0x4158b, 0x3b00}, ++ {0x4158c, 0x0}, ++ {0x4158d, 0x0}, ++ {0x4158e, 0x0}, ++ {0x4158f, 0x0}, ++ {0x41590, 0x5218}, ++ {0x41591, 0x803}, ++ {0x41592, 0x0}, ++ {0x41593, 0x0}, ++ {0x41594, 0x0}, ++ {0x41595, 0x0}, ++ {0x41596, 0x0}, ++ {0x41597, 0x0}, ++ {0x41598, 0x0}, ++ {0x41599, 0x0}, ++ {0x4159a, 0x0}, ++ {0x4159b, 0x6b00}, ++ {0x4159c, 0x0}, ++ {0x4159d, 0x0}, ++ {0x4159e, 0x0}, ++ {0x4159f, 0x400}, ++ {0x415a0, 0x407c}, ++ {0x415a1, 0x0}, ++ {0x415a2, 0x0}, ++ {0x415a3, 0x0}, ++ {0x415a4, 0x0}, ++ {0x415a5, 0x0}, ++ {0x415a6, 0x0}, ++ {0x415a7, 0x0}, ++ {0x415a8, 0x0}, ++ {0x415a9, 0x0}, ++ {0x415aa, 0x0}, ++ {0x415ab, 0x0}, ++ {0x415ac, 0x0}, ++ {0x415ad, 0x0}, ++ {0x415ae, 0x1}, ++ {0x415af, 0x0}, ++ {0x415b0, 0x0}, ++ {0x415b1, 0x0}, ++ {0x415b2, 0x0}, ++ {0x415b3, 0x1b00}, ++ {0x415b4, 0x0}, ++ {0x415b5, 0x0}, ++ {0x415b6, 0x0}, ++ {0x415b7, 0x0}, ++ {0x415b8, 0x0}, ++ {0x415b9, 0x0}, ++ {0x415ba, 0x0}, ++ {0x415bb, 0x0}, ++ {0x415bc, 0x802c}, ++ {0x415bd, 0xd00}, ++ {0x415be, 0x1}, ++ {0x415bf, 0x10}, ++ {0x415c0, 0x9198}, ++ {0x415c1, 0x803}, ++ {0x415c2, 0x0}, ++ {0x415c3, 0x10}, ++ {0x415c4, 0x0}, ++ {0x415c5, 0x0}, ++ {0x415c6, 0x0}, ++ {0x415c7, 0x0}, ++ {0x415c8, 0x0}, ++ {0x415c9, 0x0}, ++ {0x415ca, 0x0}, ++ {0x415cb, 0x2b00}, ++ {0x415cc, 0x0}, ++ {0x415cd, 0x0}, ++ {0x415ce, 0x0}, ++ {0x415cf, 0x0}, ++ {0x415d0, 0x0}, ++ {0x415d1, 0x0}, ++ {0x415d2, 0x0}, ++ {0x415d3, 0x0}, ++ {0x415d4, 0x9218}, ++ {0x415d5, 0x803}, ++ {0x415d6, 0x0}, ++ {0x415d7, 0x10}, ++ {0x415d8, 0x0}, ++ {0x415d9, 0x0}, ++ {0x415da, 0x0}, ++ {0x415db, 0x6b00}, ++ {0x415dc, 0x0}, ++ {0x415dd, 0x0}, ++ {0x415de, 0x0}, ++ {0x415df, 0x400}, ++ {0x415e0, 0x0}, ++ {0x415e1, 0x0}, ++ {0x415e2, 0x0}, ++ {0x415e3, 0x0}, ++ {0x415e4, 0x807c}, ++ {0x415e5, 0x0}, ++ {0x415e6, 0x0}, ++ {0x415e7, 0x10}, ++ {0x415e8, 0x0}, ++ {0x415e9, 0x0}, ++ {0x415ea, 0x0}, ++ {0x415eb, 0x0}, ++ {0x415ec, 0x0}, ++ {0x415ed, 0x0}, ++ {0x415ee, 0x0}, ++ {0x415ef, 0x0}, ++ {0x415f0, 0x0}, ++ {0x415f1, 0x0}, ++ {0x415f2, 0x1}, ++ {0x415f3, 0x0}, ++ {0x415f4, 0x0}, ++ {0x415f5, 0x0}, ++ {0x415f6, 0x0}, ++ {0x415f7, 0x0}, ++ {0x415f8, 0x0}, ++ {0x415f9, 0x0}, ++ {0x415fa, 0x0}, ++ {0x415fb, 0xb00}, ++ {0x415fc, 0x0}, ++ {0x415fd, 0x0}, ++ {0x415fe, 0x0}, ++ {0x415ff, 0x400}, ++ {0x41600, 0x0}, ++ {0x41601, 0x0}, ++ {0x41602, 0x0}, ++ {0x41603, 0x0}, ++ {0x41604, 0x0}, ++ {0x41605, 0x0}, ++ {0x41606, 0x0}, ++ {0x41607, 0x0}, ++ {0x41608, 0x401c}, ++ {0x41609, 0xd0}, ++ {0x4160a, 0x1}, ++ {0x4160b, 0x0}, ++ {0x4160c, 0x4060}, ++ {0x4160d, 0x84}, ++ {0x4160e, 0x0}, ++ {0x4160f, 0x0}, ++ {0x41610, 0x0}, ++ {0x41611, 0x0}, ++ {0x41612, 0x0}, ++ {0x41613, 0xb00}, ++ {0x41614, 0x0}, ++ {0x41615, 0x0}, ++ {0x41616, 0x0}, ++ {0x41617, 0x800}, ++ {0x41618, 0x407c}, ++ {0x41619, 0x0}, ++ {0x4161a, 0x0}, ++ {0x4161b, 0x0}, ++ {0x4161c, 0x0}, ++ {0x4161d, 0x0}, ++ {0x4161e, 0x0}, ++ {0x4161f, 0x0}, ++ {0x41620, 0x0}, ++ {0x41621, 0x0}, ++ {0x41622, 0x0}, ++ {0x41623, 0x0}, ++ {0x41624, 0x4000}, ++ {0x41625, 0x0}, ++ {0x41626, 0x1}, ++ {0x41627, 0x0}, ++ {0x41628, 0x0}, ++ {0x41629, 0x0}, ++ {0x4162a, 0x0}, ++ {0x4162b, 0x0}, ++ {0x4162c, 0x402c}, ++ {0x4162d, 0xd00}, ++ {0x4162e, 0x1}, ++ {0x4162f, 0x0}, ++ {0x41630, 0x4020}, ++ {0x41631, 0x803}, ++ {0x41632, 0x0}, ++ {0x41633, 0x0}, ++ {0x41634, 0x0}, ++ {0x41635, 0x0}, ++ {0x41636, 0x0}, ++ {0x41637, 0x0}, ++ {0x41638, 0x0}, ++ {0x41639, 0x0}, ++ {0x4163a, 0x0}, ++ {0x4163b, 0x2b00}, ++ {0x4163c, 0x0}, ++ {0x4163d, 0x0}, ++ {0x4163e, 0x0}, ++ {0x4163f, 0x800}, ++ {0x41640, 0x0}, ++ {0x41641, 0x0}, ++ {0x41642, 0x0}, ++ {0x41643, 0x0}, ++ {0x41644, 0x407c}, ++ {0x41645, 0x0}, ++ {0x41646, 0x0}, ++ {0x41647, 0x0}, ++ {0x41648, 0x0}, ++ {0x41649, 0x0}, ++ {0x4164a, 0x0}, ++ {0x4164b, 0x0}, ++ {0x4164c, 0x0}, ++ {0x4164d, 0x0}, ++ {0x4164e, 0x0}, ++ {0x4164f, 0x0}, ++ {0x41650, 0x0}, ++ {0x41651, 0x0}, ++ {0x41652, 0x1}, ++ {0x41653, 0x0}, ++ {0x41654, 0x0}, ++ {0x41655, 0x0}, ++ {0x41656, 0x0}, ++ {0x41657, 0x0}, ++ {0x41658, 0x801c}, ++ {0x41659, 0xd0}, ++ {0x4165a, 0x1}, ++ {0x4165b, 0x10}, ++ {0x4165c, 0x8060}, ++ {0x4165d, 0x84}, ++ {0x4165e, 0x0}, ++ {0x4165f, 0x10}, ++ {0x41660, 0x0}, ++ {0x41661, 0x0}, ++ {0x41662, 0x0}, ++ {0x41663, 0xb00}, ++ {0x41664, 0x0}, ++ {0x41665, 0x0}, ++ {0x41666, 0x0}, ++ {0x41667, 0x800}, ++ {0x41668, 0x807c}, ++ {0x41669, 0x0}, ++ {0x4166a, 0x0}, ++ {0x4166b, 0x10}, ++ {0x4166c, 0x0}, ++ {0x4166d, 0x0}, ++ {0x4166e, 0x0}, ++ {0x4166f, 0x0}, ++ {0x41670, 0x0}, ++ {0x41671, 0x0}, ++ {0x41672, 0x0}, ++ {0x41673, 0x0}, ++ {0x41674, 0x8000}, ++ {0x41675, 0x0}, ++ {0x41676, 0x1}, ++ {0x41677, 0x10}, ++ {0x41678, 0x0}, ++ {0x41679, 0x0}, ++ {0x4167a, 0x0}, ++ {0x4167b, 0x0}, ++ {0x4167c, 0x802c}, ++ {0x4167d, 0xd00}, ++ {0x4167e, 0x1}, ++ {0x4167f, 0x10}, ++ {0x41680, 0x8020}, ++ {0x41681, 0x803}, ++ {0x41682, 0x0}, ++ {0x41683, 0x10}, ++ {0x41684, 0x0}, ++ {0x41685, 0x0}, ++ {0x41686, 0x0}, ++ {0x41687, 0x0}, ++ {0x41688, 0x0}, ++ {0x41689, 0x0}, ++ {0x4168a, 0x0}, ++ {0x4168b, 0x2b00}, ++ {0x4168c, 0x0}, ++ {0x4168d, 0x0}, ++ {0x4168e, 0x0}, ++ {0x4168f, 0x800}, ++ {0x41690, 0x0}, ++ {0x41691, 0x0}, ++ {0x41692, 0x0}, ++ {0x41693, 0x0}, ++ {0x41694, 0x807c}, ++ {0x41695, 0x0}, ++ {0x41696, 0x0}, ++ {0x41697, 0x10}, ++ {0x41698, 0x0}, ++ {0x41699, 0x0}, ++ {0x4169a, 0x0}, ++ {0x4169b, 0x0}, ++ {0x4169c, 0x0}, ++ {0x4169d, 0x0}, ++ {0x4169e, 0x0}, ++ {0x4169f, 0x0}, ++ {0x416a0, 0x0}, ++ {0x416a1, 0x0}, ++ {0x416a2, 0x1}, ++ {0x416a3, 0x0}, ++ {0x416a4, 0x0}, ++ {0x416a5, 0x0}, ++ {0x416a6, 0x0}, ++ {0x416a7, 0x0}, ++ {0x416a8, 0x402c}, ++ {0x416a9, 0xd00}, ++ {0x416aa, 0x1}, ++ {0x416ab, 0x0}, ++ {0x416ac, 0x4050}, ++ {0x416ad, 0x803}, ++ {0x416ae, 0x0}, ++ {0x416af, 0x0}, ++ {0x416b0, 0x0}, ++ {0x416b1, 0x0}, ++ {0x416b2, 0x0}, ++ {0x416b3, 0x1b00}, ++ {0x416b4, 0x0}, ++ {0x416b5, 0x0}, ++ {0x416b6, 0x0}, ++ {0x416b7, 0x0}, ++ {0x416b8, 0x0}, ++ {0x416b9, 0x0}, ++ {0x416ba, 0x0}, ++ {0x416bb, 0x0}, ++ {0x416bc, 0x0}, ++ {0x416bd, 0x0}, ++ {0x416be, 0x0}, ++ {0x416bf, 0x0}, ++ {0x416c0, 0x4050}, ++ {0x416c1, 0x803}, ++ {0x416c2, 0x0}, ++ {0x416c3, 0x5a00}, ++ {0x416c4, 0x0}, ++ {0x416c5, 0x0}, ++ {0x416c6, 0x0}, ++ {0x416c7, 0x0}, ++ {0x416c8, 0x0}, ++ {0x416c9, 0x0}, ++ {0x416ca, 0x0}, ++ {0x416cb, 0x0}, ++ {0x416cc, 0x0}, ++ {0x416cd, 0x0}, ++ {0x416ce, 0x0}, ++ {0x416cf, 0x0}, ++ {0x416d0, 0x0}, ++ {0x416d1, 0x0}, ++ {0x416d2, 0x0}, ++ {0x416d3, 0x100}, ++ {0x416d4, 0x0}, ++ {0x416d5, 0x0}, ++ {0x416d6, 0x0}, ++ {0x416d7, 0x0}, ++ {0x416d8, 0x4050}, ++ {0x416d9, 0x803}, ++ {0x416da, 0x0}, ++ {0x416db, 0x0}, ++ {0x416dc, 0x0}, ++ {0x416dd, 0x0}, ++ {0x416de, 0x0}, ++ {0x416df, 0x0}, ++ {0x416e0, 0x0}, ++ {0x416e1, 0x0}, ++ {0x416e2, 0x0}, ++ {0x416e3, 0x6b00}, ++ {0x416e4, 0x0}, ++ {0x416e5, 0x0}, ++ {0x416e6, 0x0}, ++ {0x416e7, 0x400}, ++ {0x416e8, 0x407c}, ++ {0x416e9, 0x0}, ++ {0x416ea, 0x0}, ++ {0x416eb, 0x0}, ++ {0x416ec, 0x0}, ++ {0x416ed, 0x0}, ++ {0x416ee, 0x0}, ++ {0x416ef, 0x0}, ++ {0x416f0, 0x0}, ++ {0x416f1, 0x0}, ++ {0x416f2, 0x0}, ++ {0x416f3, 0x3b00}, ++ {0x416f4, 0x0}, ++ {0x416f5, 0x0}, ++ {0x416f6, 0x0}, ++ {0x416f7, 0x0}, ++ {0x416f8, 0x0}, ++ {0x416f9, 0x0}, ++ {0x416fa, 0x0}, ++ {0x416fb, 0x0}, ++ {0x416fc, 0x0}, ++ {0x416fd, 0x0}, ++ {0x416fe, 0x1}, ++ {0x416ff, 0x0}, ++ {0x41700, 0x5758}, ++ {0x41701, 0x0}, ++ {0x41702, 0x0}, ++ {0x41703, 0x0}, ++ {0x41704, 0x4208}, ++ {0x41705, 0x0}, ++ {0x41706, 0x0}, ++ {0x41707, 0x0}, ++ {0x41708, 0x0}, ++ {0x41709, 0x0}, ++ {0x4170a, 0x0}, ++ {0x4170b, 0x4b00}, ++ {0x4170c, 0x0}, ++ {0x4170d, 0x0}, ++ {0x4170e, 0x0}, ++ {0x4170f, 0x0}, ++ {0x41710, 0x0}, ++ {0x41711, 0x0}, ++ {0x41712, 0x0}, ++ {0x41713, 0x0}, ++ {0x41714, 0x401c}, ++ {0x41715, 0xd0}, ++ {0x41716, 0x1}, ++ {0x41717, 0x0}, ++ {0x41718, 0x4060}, ++ {0x41719, 0x84}, ++ {0x4171a, 0x0}, ++ {0x4171b, 0x0}, ++ {0x4171c, 0x0}, ++ {0x4171d, 0x0}, ++ {0x4171e, 0x0}, ++ {0x4171f, 0x0}, ++ {0x41720, 0x0}, ++ {0x41721, 0x0}, ++ {0x41722, 0x0}, ++ {0x41723, 0x7b00}, ++ {0x41724, 0x0}, ++ {0x41725, 0x0}, ++ {0x41726, 0x0}, ++ {0x41727, 0x0}, ++ {0x41728, 0x407c}, ++ {0x41729, 0x0}, ++ {0x4172a, 0x0}, ++ {0x4172b, 0x0}, ++ {0x4172c, 0x0}, ++ {0x4172d, 0x0}, ++ {0x4172e, 0x0}, ++ {0x4172f, 0x0}, ++ {0x41730, 0x0}, ++ {0x41731, 0x0}, ++ {0x41732, 0x0}, ++ {0x41733, 0x0}, ++ {0x41734, 0x4000}, ++ {0x41735, 0x0}, ++ {0x41736, 0x1}, ++ {0x41737, 0x0}, ++ {0x41738, 0x0}, ++ {0x41739, 0x0}, ++ {0x4173a, 0x0}, ++ {0x4173b, 0x0}, ++ {0x4173c, 0x402c}, ++ {0x4173d, 0xd00}, ++ {0x4173e, 0x1}, ++ {0x4173f, 0x0}, ++ {0x41740, 0x4020}, ++ {0x41741, 0x803}, ++ {0x41742, 0x0}, ++ {0x41743, 0x0}, ++ {0x41744, 0x0}, ++ {0x41745, 0x0}, ++ {0x41746, 0x0}, ++ {0x41747, 0x0}, ++ {0x41748, 0x0}, ++ {0x41749, 0x0}, ++ {0x4174a, 0x0}, ++ {0x4174b, 0x2b00}, ++ {0x4174c, 0x0}, ++ {0x4174d, 0x0}, ++ {0x4174e, 0x0}, ++ {0x4174f, 0x800}, ++ {0x41750, 0x0}, ++ {0x41751, 0x0}, ++ {0x41752, 0x0}, ++ {0x41753, 0x0}, ++ {0x41754, 0x407c}, ++ {0x41755, 0x0}, ++ {0x41756, 0x0}, ++ {0x41757, 0x0}, ++ {0x41758, 0x0}, ++ {0x41759, 0x0}, ++ {0x4175a, 0x0}, ++ {0x4175b, 0x0}, ++ {0x4175c, 0x0}, ++ {0x4175d, 0x0}, ++ {0x4175e, 0x0}, ++ {0x4175f, 0x0}, ++ {0x41760, 0x4000}, ++ {0x41761, 0x0}, ++ {0x41762, 0x1}, ++ {0x41763, 0x0}, ++ {0x41764, 0x0}, ++ {0x41765, 0x0}, ++ {0x41766, 0x0}, ++ {0x41767, 0x0}, ++ {0x41768, 0x5758}, ++ {0x41769, 0x0}, ++ {0x4176a, 0x0}, ++ {0x4176b, 0x0}, ++ {0x4176c, 0x4008}, ++ {0x4176d, 0x0}, ++ {0x4176e, 0x0}, ++ {0x4176f, 0x0}, ++ {0x41770, 0x0}, ++ {0x41771, 0x0}, ++ {0x41772, 0x0}, ++ {0x41773, 0x0}, ++ {0x41774, 0x0}, ++ {0x41775, 0x0}, ++ {0x41776, 0x0}, ++ {0x41777, 0x0}, ++ {0x41778, 0x802c}, ++ {0x41779, 0xd00}, ++ {0x4177a, 0x1}, ++ {0x4177b, 0x10}, ++ {0x4177c, 0x8050}, ++ {0x4177d, 0x803}, ++ {0x4177e, 0x0}, ++ {0x4177f, 0x10}, ++ {0x41780, 0x0}, ++ {0x41781, 0x0}, ++ {0x41782, 0x0}, ++ {0x41783, 0x1b00}, ++ {0x41784, 0x0}, ++ {0x41785, 0x0}, ++ {0x41786, 0x0}, ++ {0x41787, 0x0}, ++ {0x41788, 0x0}, ++ {0x41789, 0x0}, ++ {0x4178a, 0x0}, ++ {0x4178b, 0x0}, ++ {0x4178c, 0x0}, ++ {0x4178d, 0x0}, ++ {0x4178e, 0x0}, ++ {0x4178f, 0x0}, ++ {0x41790, 0x8050}, ++ {0x41791, 0x803}, ++ {0x41792, 0x0}, ++ {0x41793, 0x5a10}, ++ {0x41794, 0x0}, ++ {0x41795, 0x0}, ++ {0x41796, 0x0}, ++ {0x41797, 0x0}, ++ {0x41798, 0x0}, ++ {0x41799, 0x0}, ++ {0x4179a, 0x0}, ++ {0x4179b, 0x0}, ++ {0x4179c, 0x0}, ++ {0x4179d, 0x0}, ++ {0x4179e, 0x0}, ++ {0x4179f, 0x0}, ++ {0x417a0, 0x0}, ++ {0x417a1, 0x0}, ++ {0x417a2, 0x0}, ++ {0x417a3, 0x100}, ++ {0x417a4, 0x0}, ++ {0x417a5, 0x0}, ++ {0x417a6, 0x0}, ++ {0x417a7, 0x0}, ++ {0x417a8, 0x8050}, ++ {0x417a9, 0x803}, ++ {0x417aa, 0x0}, ++ {0x417ab, 0x10}, ++ {0x417ac, 0x0}, ++ {0x417ad, 0x0}, ++ {0x417ae, 0x0}, ++ {0x417af, 0x0}, ++ {0x417b0, 0x0}, ++ {0x417b1, 0x0}, ++ {0x417b2, 0x0}, ++ {0x417b3, 0x6b00}, ++ {0x417b4, 0x0}, ++ {0x417b5, 0x0}, ++ {0x417b6, 0x0}, ++ {0x417b7, 0x400}, ++ {0x417b8, 0x807c}, ++ {0x417b9, 0x0}, ++ {0x417ba, 0x0}, ++ {0x417bb, 0x10}, ++ {0x417bc, 0x0}, ++ {0x417bd, 0x0}, ++ {0x417be, 0x0}, ++ {0x417bf, 0x0}, ++ {0x417c0, 0x0}, ++ {0x417c1, 0x0}, ++ {0x417c2, 0x0}, ++ {0x417c3, 0x3b00}, ++ {0x417c4, 0x0}, ++ {0x417c5, 0x0}, ++ {0x417c6, 0x0}, ++ {0x417c7, 0x0}, ++ {0x417c8, 0x0}, ++ {0x417c9, 0x0}, ++ {0x417ca, 0x0}, ++ {0x417cb, 0x0}, ++ {0x417cc, 0x0}, ++ {0x417cd, 0x0}, ++ {0x417ce, 0x1}, ++ {0x417cf, 0x0}, ++ {0x417d0, 0x9758}, ++ {0x417d1, 0x0}, ++ {0x417d2, 0x0}, ++ {0x417d3, 0x10}, ++ {0x417d4, 0x8208}, ++ {0x417d5, 0x0}, ++ {0x417d6, 0x0}, ++ {0x417d7, 0x10}, ++ {0x417d8, 0x0}, ++ {0x417d9, 0x0}, ++ {0x417da, 0x0}, ++ {0x417db, 0x4b00}, ++ {0x417dc, 0x0}, ++ {0x417dd, 0x0}, ++ {0x417de, 0x0}, ++ {0x417df, 0x0}, ++ {0x417e0, 0x0}, ++ {0x417e1, 0x0}, ++ {0x417e2, 0x0}, ++ {0x417e3, 0x0}, ++ {0x417e4, 0x801c}, ++ {0x417e5, 0xd0}, ++ {0x417e6, 0x1}, ++ {0x417e7, 0x10}, ++ {0x417e8, 0x8060}, ++ {0x417e9, 0x84}, ++ {0x417ea, 0x0}, ++ {0x417eb, 0x10}, ++ {0x417ec, 0x0}, ++ {0x417ed, 0x0}, ++ {0x417ee, 0x0}, ++ {0x417ef, 0x0}, ++ {0x417f0, 0x0}, ++ {0x417f1, 0x0}, ++ {0x417f2, 0x0}, ++ {0x417f3, 0x7b00}, ++ {0x417f4, 0x0}, ++ {0x417f5, 0x0}, ++ {0x417f6, 0x0}, ++ {0x417f7, 0x0}, ++ {0x417f8, 0x807c}, ++ {0x417f9, 0x0}, ++ {0x417fa, 0x0}, ++ {0x417fb, 0x10}, ++ {0x417fc, 0x0}, ++ {0x417fd, 0x0}, ++ {0x417fe, 0x0}, ++ {0x417ff, 0x0}, ++ {0x41800, 0x0}, ++ {0x41801, 0x0}, ++ {0x41802, 0x0}, ++ {0x41803, 0x0}, ++ {0x41804, 0x8000}, ++ {0x41805, 0x0}, ++ {0x41806, 0x1}, ++ {0x41807, 0x10}, ++ {0x41808, 0x0}, ++ {0x41809, 0x0}, ++ {0x4180a, 0x0}, ++ {0x4180b, 0x0}, ++ {0x4180c, 0x802c}, ++ {0x4180d, 0xd00}, ++ {0x4180e, 0x1}, ++ {0x4180f, 0x10}, ++ {0x41810, 0x8020}, ++ {0x41811, 0x803}, ++ {0x41812, 0x0}, ++ {0x41813, 0x10}, ++ {0x41814, 0x0}, ++ {0x41815, 0x0}, ++ {0x41816, 0x0}, ++ {0x41817, 0x0}, ++ {0x41818, 0x0}, ++ {0x41819, 0x0}, ++ {0x4181a, 0x0}, ++ {0x4181b, 0x2b00}, ++ {0x4181c, 0x0}, ++ {0x4181d, 0x0}, ++ {0x4181e, 0x0}, ++ {0x4181f, 0x800}, ++ {0x41820, 0x0}, ++ {0x41821, 0x0}, ++ {0x41822, 0x0}, ++ {0x41823, 0x0}, ++ {0x41824, 0x807c}, ++ {0x41825, 0x0}, ++ {0x41826, 0x0}, ++ {0x41827, 0x10}, ++ {0x41828, 0x0}, ++ {0x41829, 0x0}, ++ {0x4182a, 0x0}, ++ {0x4182b, 0x0}, ++ {0x4182c, 0x0}, ++ {0x4182d, 0x0}, ++ {0x4182e, 0x0}, ++ {0x4182f, 0x0}, ++ {0x41830, 0x8000}, ++ {0x41831, 0x0}, ++ {0x41832, 0x1}, ++ {0x41833, 0x10}, ++ {0x41834, 0x0}, ++ {0x41835, 0x0}, ++ {0x41836, 0x0}, ++ {0x41837, 0x0}, ++ {0x41838, 0x9758}, ++ {0x41839, 0x0}, ++ {0x4183a, 0x0}, ++ {0x4183b, 0x10}, ++ {0x4183c, 0x8008}, ++ {0x4183d, 0x0}, ++ {0x4183e, 0x0}, ++ {0x4183f, 0x10}, ++ {0x41840, 0x0}, ++ {0x41841, 0x0}, ++ {0x41842, 0x0}, ++ {0x41843, 0x0}, ++ {0x41844, 0x0}, ++ {0x41845, 0x0}, ++ {0x41846, 0x0}, ++ {0x41847, 0x0}, ++ {0x41848, 0xc068}, ++ {0x41849, 0x0}, ++ {0x4184a, 0x0}, ++ {0x4184b, 0x10}, ++ {0x4184c, 0x0}, ++ {0x4184d, 0x0}, ++ {0x4184e, 0x0}, ++ {0x4184f, 0x0}, ++ {0x41850, 0xd2d8}, ++ {0x41851, 0x0}, ++ {0x41852, 0x0}, ++ {0x41853, 0x10}, ++ {0x41854, 0xe008}, ++ {0x41855, 0x0}, ++ {0x41856, 0x0}, ++ {0x41857, 0x10}, ++ {0x41858, 0x0}, ++ {0x41859, 0x0}, ++ {0x4185a, 0x0}, ++ {0x4185b, 0x5b00}, ++ {0x4185c, 0x0}, ++ {0x4185d, 0x0}, ++ {0x4185e, 0x0}, ++ {0x4185f, 0x0}, ++ {0x41860, 0xc0f0}, ++ {0x41861, 0x0}, ++ {0x41862, 0x0}, ++ {0x41863, 0x10}, ++ {0x41864, 0x0}, ++ {0x41865, 0x0}, ++ {0x41866, 0x0}, ++ {0x41867, 0x0}, ++ {0x41868, 0xcfd8}, ++ {0x41869, 0x0}, ++ {0x4186a, 0x0}, ++ {0x4186b, 0x10}, ++ {0x4186c, 0xc008}, ++ {0x4186d, 0x0}, ++ {0x4186e, 0x0}, ++ {0x4186f, 0x10}, ++ {0x41870, 0x0}, ++ {0x41871, 0x0}, ++ {0x41872, 0x0}, ++ {0x41873, 0x2b00}, ++ {0x41874, 0x0}, ++ {0x41875, 0x0}, ++ {0x41876, 0x0}, ++ {0x41877, 0x0}, ++ {0x41878, 0xd058}, ++ {0x41879, 0x0}, ++ {0x4187a, 0x0}, ++ {0x4187b, 0x10}, ++ {0x4187c, 0xc008}, ++ {0x4187d, 0x0}, ++ {0x4187e, 0x0}, ++ {0x4187f, 0x10}, ++ {0x41880, 0x0}, ++ {0x41881, 0x0}, ++ {0x41882, 0x0}, ++ {0x41883, 0x2b00}, ++ {0x41884, 0x0}, ++ {0x41885, 0x0}, ++ {0x41886, 0x0}, ++ {0x41887, 0x0}, ++ {0x41888, 0xd0d8}, ++ {0x41889, 0x0}, ++ {0x4188a, 0x0}, ++ {0x4188b, 0x10}, ++ {0x4188c, 0xc088}, ++ {0x4188d, 0x0}, ++ {0x4188e, 0x0}, ++ {0x4188f, 0x10}, ++ {0x41890, 0x0}, ++ {0x41891, 0x0}, ++ {0x41892, 0x0}, ++ {0x41893, 0x2b00}, ++ {0x41894, 0x0}, ++ {0x41895, 0x0}, ++ {0x41896, 0x0}, ++ {0x41897, 0x0}, ++ {0x41898, 0xd158}, ++ {0x41899, 0x0}, ++ {0x4189a, 0x0}, ++ {0x4189b, 0x10}, ++ {0x4189c, 0xc008}, ++ {0x4189d, 0x0}, ++ {0x4189e, 0x0}, ++ {0x4189f, 0x10}, ++ {0x418a0, 0x0}, ++ {0x418a1, 0x0}, ++ {0x418a2, 0x0}, ++ {0x418a3, 0x5b00}, ++ {0x418a4, 0x0}, ++ {0x418a5, 0x0}, ++ {0x418a6, 0x0}, ++ {0x418a7, 0x0}, ++ {0x418a8, 0x402c}, ++ {0x418a9, 0xd00}, ++ {0x418aa, 0x1}, ++ {0x418ab, 0x400}, ++ {0x418ac, 0x4050}, ++ {0x418ad, 0x800}, ++ {0x418ae, 0x0}, ++ {0x418af, 0x0}, ++ {0x418b0, 0x0}, ++ {0x418b1, 0x0}, ++ {0x418b2, 0x0}, ++ {0x418b3, 0x400}, ++ {0x418b4, 0x4050}, ++ {0x418b5, 0x803}, ++ {0x418b6, 0x0}, ++ {0x418b7, 0x0}, ++ {0x418b8, 0x0}, ++ {0x418b9, 0x0}, ++ {0x418ba, 0x0}, ++ {0x418bb, 0x6f00}, ++ {0x418bc, 0x0}, ++ {0x418bd, 0x0}, ++ {0x418be, 0x0}, ++ {0x418bf, 0x400}, ++ {0x418c0, 0x407c}, ++ {0x418c1, 0x0}, ++ {0x418c2, 0x0}, ++ {0x418c3, 0x400}, ++ {0x418c4, 0x0}, ++ {0x418c5, 0x0}, ++ {0x418c6, 0x0}, ++ {0x418c7, 0x0}, ++ {0x418c8, 0x0}, ++ {0x418c9, 0x0}, ++ {0x418ca, 0x0}, ++ {0x418cb, 0x400}, ++ {0x418cc, 0x0}, ++ {0x418cd, 0x0}, ++ {0x418ce, 0x1}, ++ {0x418cf, 0x0}, ++ {0x418d0, 0x0}, ++ {0x418d1, 0x0}, ++ {0x418d2, 0x0}, ++ {0x418d3, 0x400}, ++ {0x418d4, 0x0}, ++ {0x418d5, 0x0}, ++ {0x418d6, 0x0}, ++ {0x418d7, 0x0}, ++ {0x418d8, 0x0}, ++ {0x418d9, 0x0}, ++ {0x418da, 0x0}, ++ {0x418db, 0x0}, ++ {0x418dc, 0x0}, ++ {0x418dd, 0x0}, ++ {0x418de, 0x0}, ++ {0x418df, 0x0}, ++ {0x418e0, 0x802c}, ++ {0x418e1, 0xd00}, ++ {0x418e2, 0x1}, ++ {0x418e3, 0x410}, ++ {0x418e4, 0x8050}, ++ {0x418e5, 0x800}, ++ {0x418e6, 0x0}, ++ {0x418e7, 0x10}, ++ {0x418e8, 0x0}, ++ {0x418e9, 0x0}, ++ {0x418ea, 0x0}, ++ {0x418eb, 0x400}, ++ {0x418ec, 0x8050}, ++ {0x418ed, 0x803}, ++ {0x418ee, 0x0}, ++ {0x418ef, 0x10}, ++ {0x418f0, 0x0}, ++ {0x418f1, 0x0}, ++ {0x418f2, 0x0}, ++ {0x418f3, 0x6f00}, ++ {0x418f4, 0x0}, ++ {0x418f5, 0x0}, ++ {0x418f6, 0x0}, ++ {0x418f7, 0x400}, ++ {0x418f8, 0x807c}, ++ {0x418f9, 0x0}, ++ {0x418fa, 0x0}, ++ {0x418fb, 0x410}, ++ {0x418fc, 0x0}, ++ {0x418fd, 0x0}, ++ {0x418fe, 0x0}, ++ {0x418ff, 0x0}, ++ {0x41900, 0x0}, ++ {0x41901, 0x0}, ++ {0x41902, 0x0}, ++ {0x41903, 0x400}, ++ {0x41904, 0x0}, ++ {0x41905, 0x0}, ++ {0x41906, 0x1}, ++ {0x41907, 0x0}, ++ {0x41908, 0x0}, ++ {0x41909, 0x0}, ++ {0x4190a, 0x0}, ++ {0x4190b, 0x400}, ++ {0x4190c, 0x0}, ++ {0x4190d, 0x0}, ++ {0x4190e, 0x0}, ++ {0x4190f, 0x0}, ++ {0x41910, 0x0}, ++ {0x41911, 0x0}, ++ {0x41912, 0x0}, ++ {0x41913, 0x0}, ++ {0x41914, 0x0}, ++ {0x41915, 0x0}, ++ {0x41916, 0x0}, ++ {0x41917, 0x0}, ++ {0x41918, 0x402c}, ++ {0x41919, 0xd00}, ++ {0x4191a, 0x1}, ++ {0x4191b, 0x0}, ++ {0x4191c, 0x4050}, ++ {0x4191d, 0x800}, ++ {0x4191e, 0x0}, ++ {0x4191f, 0x0}, ++ {0x41920, 0x0}, ++ {0x41921, 0x0}, ++ {0x41922, 0x0}, ++ {0x41923, 0x0}, ++ {0x41924, 0x4050}, ++ {0x41925, 0x803}, ++ {0x41926, 0x0}, ++ {0x41927, 0x0}, ++ {0x41928, 0x0}, ++ {0x41929, 0x0}, ++ {0x4192a, 0x0}, ++ {0x4192b, 0x0}, ++ {0x4192c, 0x4050}, ++ {0x4192d, 0x800}, ++ {0x4192e, 0x0}, ++ {0x4192f, 0x0}, ++ {0x41930, 0x0}, ++ {0x41931, 0x0}, ++ {0x41932, 0x0}, ++ {0x41933, 0x4b00}, ++ {0x41934, 0x0}, ++ {0x41935, 0x0}, ++ {0x41936, 0x0}, ++ {0x41937, 0x400}, ++ {0x41938, 0x0}, ++ {0x41939, 0x0}, ++ {0x4193a, 0x0}, ++ {0x4193b, 0x0}, ++ {0x4193c, 0x407c}, ++ {0x4193d, 0x0}, ++ {0x4193e, 0x0}, ++ {0x4193f, 0x0}, ++ {0x41940, 0x0}, ++ {0x41941, 0x0}, ++ {0x41942, 0x0}, ++ {0x41943, 0x0}, ++ {0x41944, 0x0}, ++ {0x41945, 0x0}, ++ {0x41946, 0x0}, ++ {0x41947, 0x0}, ++ {0x41948, 0x0}, ++ {0x41949, 0x0}, ++ {0x4194a, 0x1}, ++ {0x4194b, 0x0}, ++ {0x4194c, 0x0}, ++ {0x4194d, 0x0}, ++ {0x4194e, 0x0}, ++ {0x4194f, 0x0}, ++ {0x41950, 0x0}, ++ {0x41951, 0x0}, ++ {0x41952, 0x0}, ++ {0x41953, 0x4b00}, ++ {0x41954, 0x0}, ++ {0x41955, 0x0}, ++ {0x41956, 0x0}, ++ {0x41957, 0x1800}, ++ {0x41958, 0x0}, ++ {0x41959, 0x0}, ++ {0x4195a, 0x0}, ++ {0x4195b, 0x0}, ++ {0x4195c, 0x802c}, ++ {0x4195d, 0xd00}, ++ {0x4195e, 0x1}, ++ {0x4195f, 0x10}, ++ {0x41960, 0x8050}, ++ {0x41961, 0x800}, ++ {0x41962, 0x0}, ++ {0x41963, 0x10}, ++ {0x41964, 0x0}, ++ {0x41965, 0x0}, ++ {0x41966, 0x0}, ++ {0x41967, 0x0}, ++ {0x41968, 0x8050}, ++ {0x41969, 0x803}, ++ {0x4196a, 0x0}, ++ {0x4196b, 0x10}, ++ {0x4196c, 0x0}, ++ {0x4196d, 0x0}, ++ {0x4196e, 0x0}, ++ {0x4196f, 0x0}, ++ {0x41970, 0x8050}, ++ {0x41971, 0x800}, ++ {0x41972, 0x0}, ++ {0x41973, 0x10}, ++ {0x41974, 0x0}, ++ {0x41975, 0x0}, ++ {0x41976, 0x0}, ++ {0x41977, 0x0}, ++ {0x41978, 0x0}, ++ {0x41979, 0x0}, ++ {0x4197a, 0x0}, ++ {0x4197b, 0x4b00}, ++ {0x4197c, 0x0}, ++ {0x4197d, 0x0}, ++ {0x4197e, 0x0}, ++ {0x4197f, 0x400}, ++ {0x41980, 0x807c}, ++ {0x41981, 0x0}, ++ {0x41982, 0x0}, ++ {0x41983, 0x10}, ++ {0x41984, 0x0}, ++ {0x41985, 0x0}, ++ {0x41986, 0x0}, ++ {0x41987, 0x0}, ++ {0x41988, 0x0}, ++ {0x41989, 0x0}, ++ {0x4198a, 0x0}, ++ {0x4198b, 0x0}, ++ {0x4198c, 0x0}, ++ {0x4198d, 0x0}, ++ {0x4198e, 0x1}, ++ {0x4198f, 0x0}, ++ {0x41990, 0x0}, ++ {0x41991, 0x0}, ++ {0x41992, 0x0}, ++ {0x41993, 0x5b00}, ++ {0x41994, 0x0}, ++ {0x41995, 0x0}, ++ {0x41996, 0x0}, ++ {0x41997, 0x2000}, ++ {0x41998, 0x402c}, ++ {0x41999, 0xd00}, ++ {0x4199a, 0x1}, ++ {0x4199b, 0x0}, ++ {0x4199c, 0x5198}, ++ {0x4199d, 0x803}, ++ {0x4199e, 0x0}, ++ {0x4199f, 0x0}, ++ {0x419a0, 0x0}, ++ {0x419a1, 0x0}, ++ {0x419a2, 0x0}, ++ {0x419a3, 0x1b00}, ++ {0x419a4, 0x0}, ++ {0x419a5, 0x0}, ++ {0x419a6, 0x0}, ++ {0x419a7, 0x0}, ++ {0x419a8, 0x5218}, ++ {0x419a9, 0x803}, ++ {0x419aa, 0x0}, ++ {0x419ab, 0x0}, ++ {0x419ac, 0x0}, ++ {0x419ad, 0x0}, ++ {0x419ae, 0x0}, ++ {0x419af, 0x0}, ++ {0x419b0, 0x0}, ++ {0x419b1, 0x0}, ++ {0x419b2, 0x0}, ++ {0x419b3, 0x4b00}, ++ {0x419b4, 0x0}, ++ {0x419b5, 0x0}, ++ {0x419b6, 0x0}, ++ {0x419b7, 0x400}, ++ {0x419b8, 0x407c}, ++ {0x419b9, 0x0}, ++ {0x419ba, 0x0}, ++ {0x419bb, 0x0}, ++ {0x419bc, 0x0}, ++ {0x419bd, 0x0}, ++ {0x419be, 0x0}, ++ {0x419bf, 0x0}, ++ {0x419c0, 0x0}, ++ {0x419c1, 0x0}, ++ {0x419c2, 0x0}, ++ {0x419c3, 0x0}, ++ {0x419c4, 0x0}, ++ {0x419c5, 0x0}, ++ {0x419c6, 0x1}, ++ {0x419c7, 0x0}, ++ {0x419c8, 0x0}, ++ {0x419c9, 0x0}, ++ {0x419ca, 0x0}, ++ {0x419cb, 0x1b00}, ++ {0x419cc, 0x0}, ++ {0x419cd, 0x0}, ++ {0x419ce, 0x0}, ++ {0x419cf, 0x0}, ++ {0x419d0, 0x0}, ++ {0x419d1, 0x0}, ++ {0x419d2, 0x0}, ++ {0x419d3, 0x0}, ++ {0x419d4, 0x802c}, ++ {0x419d5, 0xd00}, ++ {0x419d6, 0x1}, ++ {0x419d7, 0x10}, ++ {0x419d8, 0x9198}, ++ {0x419d9, 0x803}, ++ {0x419da, 0x0}, ++ {0x419db, 0x10}, ++ {0x419dc, 0x0}, ++ {0x419dd, 0x0}, ++ {0x419de, 0x0}, ++ {0x419df, 0x0}, ++ {0x419e0, 0x0}, ++ {0x419e1, 0x0}, ++ {0x419e2, 0x0}, ++ {0x419e3, 0x0}, ++ {0x419e4, 0x0}, ++ {0x419e5, 0x0}, ++ {0x419e6, 0x0}, ++ {0x419e7, 0x0}, ++ {0x419e8, 0x0}, ++ {0x419e9, 0x0}, ++ {0x419ea, 0x0}, ++ {0x419eb, 0x0}, ++ {0x419ec, 0x9218}, ++ {0x419ed, 0x803}, ++ {0x419ee, 0x0}, ++ {0x419ef, 0x10}, ++ {0x419f0, 0x0}, ++ {0x419f1, 0x0}, ++ {0x419f2, 0x0}, ++ {0x419f3, 0x4b00}, ++ {0x419f4, 0x0}, ++ {0x419f5, 0x0}, ++ {0x419f6, 0x0}, ++ {0x419f7, 0x400}, ++ {0x419f8, 0x0}, ++ {0x419f9, 0x0}, ++ {0x419fa, 0x0}, ++ {0x419fb, 0x0}, ++ {0x419fc, 0x807c}, ++ {0x419fd, 0x0}, ++ {0x419fe, 0x0}, ++ {0x419ff, 0x10}, ++ {0x41a00, 0x0}, ++ {0x41a01, 0x0}, ++ {0x41a02, 0x0}, ++ {0x41a03, 0x0}, ++ {0x41a04, 0x0}, ++ {0x41a05, 0x0}, ++ {0x41a06, 0x0}, ++ {0x41a07, 0x0}, ++ {0x41a08, 0x0}, ++ {0x41a09, 0x0}, ++ {0x41a0a, 0x1}, ++ {0x41a0b, 0x0}, ++ {0x41a0c, 0x0}, ++ {0x41a0d, 0x0}, ++ {0x41a0e, 0x0}, ++ {0x41a0f, 0x0}, ++ {0x41a10, 0x0}, ++ {0x41a11, 0x0}, ++ {0x41a12, 0x0}, ++ {0x41a13, 0xb00}, ++ {0x41a14, 0x0}, ++ {0x41a15, 0x0}, ++ {0x41a16, 0x0}, ++ {0x41a17, 0x400}, ++ {0x41a18, 0x0}, ++ {0x41a19, 0x0}, ++ {0x41a1a, 0x0}, ++ {0x41a1b, 0x0}, ++ {0x41a1c, 0x0}, ++ {0x41a1d, 0x0}, ++ {0x41a1e, 0x0}, ++ {0x41a1f, 0x0}, ++ {0x41a20, 0x401c}, ++ {0x41a21, 0xd0}, ++ {0x41a22, 0x1}, ++ {0x41a23, 0x0}, ++ {0x41a24, 0x4060}, ++ {0x41a25, 0x84}, ++ {0x41a26, 0x0}, ++ {0x41a27, 0x0}, ++ {0x41a28, 0x0}, ++ {0x41a29, 0x0}, ++ {0x41a2a, 0x0}, ++ {0x41a2b, 0xb00}, ++ {0x41a2c, 0x0}, ++ {0x41a2d, 0x0}, ++ {0x41a2e, 0x0}, ++ {0x41a2f, 0x800}, ++ {0x41a30, 0x407c}, ++ {0x41a31, 0x0}, ++ {0x41a32, 0x0}, ++ {0x41a33, 0x0}, ++ {0x41a34, 0x0}, ++ {0x41a35, 0x0}, ++ {0x41a36, 0x0}, ++ {0x41a37, 0x0}, ++ {0x41a38, 0x0}, ++ {0x41a39, 0x0}, ++ {0x41a3a, 0x0}, ++ {0x41a3b, 0x0}, ++ {0x41a3c, 0x4000}, ++ {0x41a3d, 0x0}, ++ {0x41a3e, 0x1}, ++ {0x41a3f, 0x0}, ++ {0x41a40, 0x0}, ++ {0x41a41, 0x0}, ++ {0x41a42, 0x0}, ++ {0x41a43, 0x0}, ++ {0x41a44, 0x402c}, ++ {0x41a45, 0xd00}, ++ {0x41a46, 0x1}, ++ {0x41a47, 0x0}, ++ {0x41a48, 0x4020}, ++ {0x41a49, 0x803}, ++ {0x41a4a, 0x0}, ++ {0x41a4b, 0x0}, ++ {0x41a4c, 0x0}, ++ {0x41a4d, 0x0}, ++ {0x41a4e, 0x0}, ++ {0x41a4f, 0x0}, ++ {0x41a50, 0x0}, ++ {0x41a51, 0x0}, ++ {0x41a52, 0x0}, ++ {0x41a53, 0x2b00}, ++ {0x41a54, 0x0}, ++ {0x41a55, 0x0}, ++ {0x41a56, 0x0}, ++ {0x41a57, 0x800}, ++ {0x41a58, 0x0}, ++ {0x41a59, 0x0}, ++ {0x41a5a, 0x0}, ++ {0x41a5b, 0x0}, ++ {0x41a5c, 0x407c}, ++ {0x41a5d, 0x0}, ++ {0x41a5e, 0x0}, ++ {0x41a5f, 0x0}, ++ {0x41a60, 0x0}, ++ {0x41a61, 0x0}, ++ {0x41a62, 0x0}, ++ {0x41a63, 0x0}, ++ {0x41a64, 0x0}, ++ {0x41a65, 0x0}, ++ {0x41a66, 0x0}, ++ {0x41a67, 0x0}, ++ {0x41a68, 0x0}, ++ {0x41a69, 0x0}, ++ {0x41a6a, 0x1}, ++ {0x41a6b, 0x0}, ++ {0x41a6c, 0x0}, ++ {0x41a6d, 0x0}, ++ {0x41a6e, 0x0}, ++ {0x41a6f, 0x0}, ++ {0x41a70, 0x801c}, ++ {0x41a71, 0xd0}, ++ {0x41a72, 0x1}, ++ {0x41a73, 0x10}, ++ {0x41a74, 0x8060}, ++ {0x41a75, 0x84}, ++ {0x41a76, 0x0}, ++ {0x41a77, 0x10}, ++ {0x41a78, 0x0}, ++ {0x41a79, 0x0}, ++ {0x41a7a, 0x0}, ++ {0x41a7b, 0xb00}, ++ {0x41a7c, 0x0}, ++ {0x41a7d, 0x0}, ++ {0x41a7e, 0x0}, ++ {0x41a7f, 0x800}, ++ {0x41a80, 0x807c}, ++ {0x41a81, 0x0}, ++ {0x41a82, 0x0}, ++ {0x41a83, 0x10}, ++ {0x41a84, 0x0}, ++ {0x41a85, 0x0}, ++ {0x41a86, 0x0}, ++ {0x41a87, 0x0}, ++ {0x41a88, 0x0}, ++ {0x41a89, 0x0}, ++ {0x41a8a, 0x0}, ++ {0x41a8b, 0x0}, ++ {0x41a8c, 0x8000}, ++ {0x41a8d, 0x0}, ++ {0x41a8e, 0x1}, ++ {0x41a8f, 0x10}, ++ {0x41a90, 0x0}, ++ {0x41a91, 0x0}, ++ {0x41a92, 0x0}, ++ {0x41a93, 0x0}, ++ {0x41a94, 0x802c}, ++ {0x41a95, 0xd00}, ++ {0x41a96, 0x1}, ++ {0x41a97, 0x10}, ++ {0x41a98, 0x8020}, ++ {0x41a99, 0x803}, ++ {0x41a9a, 0x0}, ++ {0x41a9b, 0x10}, ++ {0x41a9c, 0x0}, ++ {0x41a9d, 0x0}, ++ {0x41a9e, 0x0}, ++ {0x41a9f, 0x0}, ++ {0x41aa0, 0x0}, ++ {0x41aa1, 0x0}, ++ {0x41aa2, 0x0}, ++ {0x41aa3, 0x2b00}, ++ {0x41aa4, 0x0}, ++ {0x41aa5, 0x0}, ++ {0x41aa6, 0x0}, ++ {0x41aa7, 0x800}, ++ {0x41aa8, 0x0}, ++ {0x41aa9, 0x0}, ++ {0x41aaa, 0x0}, ++ {0x41aab, 0x0}, ++ {0x41aac, 0x807c}, ++ {0x41aad, 0x0}, ++ {0x41aae, 0x0}, ++ {0x41aaf, 0x10}, ++ {0x41ab0, 0x0}, ++ {0x41ab1, 0x0}, ++ {0x41ab2, 0x0}, ++ {0x41ab3, 0x0}, ++ {0x41ab4, 0x0}, ++ {0x41ab5, 0x0}, ++ {0x41ab6, 0x0}, ++ {0x41ab7, 0x0}, ++ {0x41ab8, 0x0}, ++ {0x41ab9, 0x0}, ++ {0x41aba, 0x1}, ++ {0x41abb, 0x0}, ++ {0x41abc, 0x0}, ++ {0x41abd, 0x0}, ++ {0x41abe, 0x0}, ++ {0x41abf, 0x0}, ++ {0x41ac0, 0x402c}, ++ {0x41ac1, 0xd00}, ++ {0x41ac2, 0x1}, ++ {0x41ac3, 0x0}, ++ {0x41ac4, 0x4050}, ++ {0x41ac5, 0x803}, ++ {0x41ac6, 0x0}, ++ {0x41ac7, 0x0}, ++ {0x41ac8, 0x0}, ++ {0x41ac9, 0x0}, ++ {0x41aca, 0x0}, ++ {0x41acb, 0x0}, ++ {0x41acc, 0x0}, ++ {0x41acd, 0x0}, ++ {0x41ace, 0x0}, ++ {0x41acf, 0x0}, ++ {0x41ad0, 0x0}, ++ {0x41ad1, 0x0}, ++ {0x41ad2, 0x0}, ++ {0x41ad3, 0x0}, ++ {0x41ad4, 0x0}, ++ {0x41ad5, 0x0}, ++ {0x41ad6, 0x0}, ++ {0x41ad7, 0x0}, ++ {0x41ad8, 0x4050}, ++ {0x41ad9, 0x803}, ++ {0x41ada, 0x0}, ++ {0x41adb, 0x5a00}, ++ {0x41adc, 0x0}, ++ {0x41add, 0x0}, ++ {0x41ade, 0x0}, ++ {0x41adf, 0x0}, ++ {0x41ae0, 0x0}, ++ {0x41ae1, 0x0}, ++ {0x41ae2, 0x0}, ++ {0x41ae3, 0x100}, ++ {0x41ae4, 0x0}, ++ {0x41ae5, 0x0}, ++ {0x41ae6, 0x0}, ++ {0x41ae7, 0x0}, ++ {0x41ae8, 0x4050}, ++ {0x41ae9, 0x803}, ++ {0x41aea, 0x0}, ++ {0x41aeb, 0x0}, ++ {0x41aec, 0x0}, ++ {0x41aed, 0x0}, ++ {0x41aee, 0x0}, ++ {0x41aef, 0x0}, ++ {0x41af0, 0x0}, ++ {0x41af1, 0x0}, ++ {0x41af2, 0x0}, ++ {0x41af3, 0x4b00}, ++ {0x41af4, 0x0}, ++ {0x41af5, 0x0}, ++ {0x41af6, 0x0}, ++ {0x41af7, 0x400}, ++ {0x41af8, 0x407c}, ++ {0x41af9, 0x0}, ++ {0x41afa, 0x0}, ++ {0x41afb, 0x0}, ++ {0x41afc, 0x0}, ++ {0x41afd, 0x0}, ++ {0x41afe, 0x0}, ++ {0x41aff, 0x0}, ++ {0x41b00, 0x0}, ++ {0x41b01, 0x0}, ++ {0x41b02, 0x0}, ++ {0x41b03, 0x3b00}, ++ {0x41b04, 0x0}, ++ {0x41b05, 0x0}, ++ {0x41b06, 0x0}, ++ {0x41b07, 0x0}, ++ {0x41b08, 0x0}, ++ {0x41b09, 0x0}, ++ {0x41b0a, 0x0}, ++ {0x41b0b, 0x0}, ++ {0x41b0c, 0x0}, ++ {0x41b0d, 0x0}, ++ {0x41b0e, 0x1}, ++ {0x41b0f, 0x0}, ++ {0x41b10, 0x5758}, ++ {0x41b11, 0x0}, ++ {0x41b12, 0x0}, ++ {0x41b13, 0x0}, ++ {0x41b14, 0x4208}, ++ {0x41b15, 0x0}, ++ {0x41b16, 0x0}, ++ {0x41b17, 0x0}, ++ {0x41b18, 0x0}, ++ {0x41b19, 0x0}, ++ {0x41b1a, 0x0}, ++ {0x41b1b, 0x4b00}, ++ {0x41b1c, 0x0}, ++ {0x41b1d, 0x0}, ++ {0x41b1e, 0x0}, ++ {0x41b1f, 0x0}, ++ {0x41b20, 0x0}, ++ {0x41b21, 0x0}, ++ {0x41b22, 0x0}, ++ {0x41b23, 0x0}, ++ {0x41b24, 0x401c}, ++ {0x41b25, 0xd0}, ++ {0x41b26, 0x1}, ++ {0x41b27, 0x0}, ++ {0x41b28, 0x4060}, ++ {0x41b29, 0x84}, ++ {0x41b2a, 0x0}, ++ {0x41b2b, 0x0}, ++ {0x41b2c, 0x0}, ++ {0x41b2d, 0x0}, ++ {0x41b2e, 0x0}, ++ {0x41b2f, 0x0}, ++ {0x41b30, 0x0}, ++ {0x41b31, 0x0}, ++ {0x41b32, 0x0}, ++ {0x41b33, 0x7b00}, ++ {0x41b34, 0x0}, ++ {0x41b35, 0x0}, ++ {0x41b36, 0x0}, ++ {0x41b37, 0x0}, ++ {0x41b38, 0x407c}, ++ {0x41b39, 0x0}, ++ {0x41b3a, 0x0}, ++ {0x41b3b, 0x0}, ++ {0x41b3c, 0x0}, ++ {0x41b3d, 0x0}, ++ {0x41b3e, 0x0}, ++ {0x41b3f, 0x0}, ++ {0x41b40, 0x0}, ++ {0x41b41, 0x0}, ++ {0x41b42, 0x0}, ++ {0x41b43, 0x0}, ++ {0x41b44, 0x4000}, ++ {0x41b45, 0x0}, ++ {0x41b46, 0x1}, ++ {0x41b47, 0x0}, ++ {0x41b48, 0x0}, ++ {0x41b49, 0x0}, ++ {0x41b4a, 0x0}, ++ {0x41b4b, 0x0}, ++ {0x41b4c, 0x402c}, ++ {0x41b4d, 0xd00}, ++ {0x41b4e, 0x1}, ++ {0x41b4f, 0x0}, ++ {0x41b50, 0x4020}, ++ {0x41b51, 0x803}, ++ {0x41b52, 0x0}, ++ {0x41b53, 0x0}, ++ {0x41b54, 0x0}, ++ {0x41b55, 0x0}, ++ {0x41b56, 0x0}, ++ {0x41b57, 0x0}, ++ {0x41b58, 0x0}, ++ {0x41b59, 0x0}, ++ {0x41b5a, 0x0}, ++ {0x41b5b, 0x2b00}, ++ {0x41b5c, 0x0}, ++ {0x41b5d, 0x0}, ++ {0x41b5e, 0x0}, ++ {0x41b5f, 0x800}, ++ {0x41b60, 0x0}, ++ {0x41b61, 0x0}, ++ {0x41b62, 0x0}, ++ {0x41b63, 0x0}, ++ {0x41b64, 0x407c}, ++ {0x41b65, 0x0}, ++ {0x41b66, 0x0}, ++ {0x41b67, 0x0}, ++ {0x41b68, 0x0}, ++ {0x41b69, 0x0}, ++ {0x41b6a, 0x0}, ++ {0x41b6b, 0x0}, ++ {0x41b6c, 0x0}, ++ {0x41b6d, 0x0}, ++ {0x41b6e, 0x0}, ++ {0x41b6f, 0x0}, ++ {0x41b70, 0x4000}, ++ {0x41b71, 0x0}, ++ {0x41b72, 0x1}, ++ {0x41b73, 0x0}, ++ {0x41b74, 0x0}, ++ {0x41b75, 0x0}, ++ {0x41b76, 0x0}, ++ {0x41b77, 0x0}, ++ {0x41b78, 0x5758}, ++ {0x41b79, 0x0}, ++ {0x41b7a, 0x0}, ++ {0x41b7b, 0x0}, ++ {0x41b7c, 0x4008}, ++ {0x41b7d, 0x0}, ++ {0x41b7e, 0x0}, ++ {0x41b7f, 0x0}, ++ {0x41b80, 0x0}, ++ {0x41b81, 0x0}, ++ {0x41b82, 0x0}, ++ {0x41b83, 0x0}, ++ {0x41b84, 0x0}, ++ {0x41b85, 0x0}, ++ {0x41b86, 0x0}, ++ {0x41b87, 0x0}, ++ {0x41b88, 0x802c}, ++ {0x41b89, 0xd00}, ++ {0x41b8a, 0x1}, ++ {0x41b8b, 0x10}, ++ {0x41b8c, 0x8050}, ++ {0x41b8d, 0x803}, ++ {0x41b8e, 0x0}, ++ {0x41b8f, 0x10}, ++ {0x41b90, 0x0}, ++ {0x41b91, 0x0}, ++ {0x41b92, 0x0}, ++ {0x41b93, 0x0}, ++ {0x41b94, 0x0}, ++ {0x41b95, 0x0}, ++ {0x41b96, 0x0}, ++ {0x41b97, 0x0}, ++ {0x41b98, 0x0}, ++ {0x41b99, 0x0}, ++ {0x41b9a, 0x0}, ++ {0x41b9b, 0x0}, ++ {0x41b9c, 0x0}, ++ {0x41b9d, 0x0}, ++ {0x41b9e, 0x0}, ++ {0x41b9f, 0x0}, ++ {0x41ba0, 0x8050}, ++ {0x41ba1, 0x803}, ++ {0x41ba2, 0x0}, ++ {0x41ba3, 0x5a10}, ++ {0x41ba4, 0x0}, ++ {0x41ba5, 0x0}, ++ {0x41ba6, 0x0}, ++ {0x41ba7, 0x0}, ++ {0x41ba8, 0x0}, ++ {0x41ba9, 0x0}, ++ {0x41baa, 0x0}, ++ {0x41bab, 0x100}, ++ {0x41bac, 0x0}, ++ {0x41bad, 0x0}, ++ {0x41bae, 0x0}, ++ {0x41baf, 0x0}, ++ {0x41bb0, 0x8050}, ++ {0x41bb1, 0x803}, ++ {0x41bb2, 0x0}, ++ {0x41bb3, 0x10}, ++ {0x41bb4, 0x0}, ++ {0x41bb5, 0x0}, ++ {0x41bb6, 0x0}, ++ {0x41bb7, 0x0}, ++ {0x41bb8, 0x0}, ++ {0x41bb9, 0x0}, ++ {0x41bba, 0x0}, ++ {0x41bbb, 0x4b00}, ++ {0x41bbc, 0x0}, ++ {0x41bbd, 0x0}, ++ {0x41bbe, 0x0}, ++ {0x41bbf, 0x400}, ++ {0x41bc0, 0x807c}, ++ {0x41bc1, 0x0}, ++ {0x41bc2, 0x0}, ++ {0x41bc3, 0x10}, ++ {0x41bc4, 0x0}, ++ {0x41bc5, 0x0}, ++ {0x41bc6, 0x0}, ++ {0x41bc7, 0x0}, ++ {0x41bc8, 0x0}, ++ {0x41bc9, 0x0}, ++ {0x41bca, 0x0}, ++ {0x41bcb, 0x3b00}, ++ {0x41bcc, 0x0}, ++ {0x41bcd, 0x0}, ++ {0x41bce, 0x0}, ++ {0x41bcf, 0x0}, ++ {0x41bd0, 0x0}, ++ {0x41bd1, 0x0}, ++ {0x41bd2, 0x0}, ++ {0x41bd3, 0x0}, ++ {0x41bd4, 0x0}, ++ {0x41bd5, 0x0}, ++ {0x41bd6, 0x1}, ++ {0x41bd7, 0x0}, ++ {0x41bd8, 0x9758}, ++ {0x41bd9, 0x0}, ++ {0x41bda, 0x0}, ++ {0x41bdb, 0x10}, ++ {0x41bdc, 0x8208}, ++ {0x41bdd, 0x0}, ++ {0x41bde, 0x0}, ++ {0x41bdf, 0x10}, ++ {0x41be0, 0x0}, ++ {0x41be1, 0x0}, ++ {0x41be2, 0x0}, ++ {0x41be3, 0x4b00}, ++ {0x41be4, 0x0}, ++ {0x41be5, 0x0}, ++ {0x41be6, 0x0}, ++ {0x41be7, 0x0}, ++ {0x41be8, 0x0}, ++ {0x41be9, 0x0}, ++ {0x41bea, 0x0}, ++ {0x41beb, 0x0}, ++ {0x41bec, 0x801c}, ++ {0x41bed, 0xd0}, ++ {0x41bee, 0x1}, ++ {0x41bef, 0x10}, ++ {0x41bf0, 0x8060}, ++ {0x41bf1, 0x84}, ++ {0x41bf2, 0x0}, ++ {0x41bf3, 0x10}, ++ {0x41bf4, 0x0}, ++ {0x41bf5, 0x0}, ++ {0x41bf6, 0x0}, ++ {0x41bf7, 0x0}, ++ {0x41bf8, 0x0}, ++ {0x41bf9, 0x0}, ++ {0x41bfa, 0x0}, ++ {0x41bfb, 0x7b00}, ++ {0x41bfc, 0x0}, ++ {0x41bfd, 0x0}, ++ {0x41bfe, 0x0}, ++ {0x41bff, 0x0}, ++ {0x41c00, 0x807c}, ++ {0x41c01, 0x0}, ++ {0x41c02, 0x0}, ++ {0x41c03, 0x10}, ++ {0x41c04, 0x0}, ++ {0x41c05, 0x0}, ++ {0x41c06, 0x0}, ++ {0x41c07, 0x0}, ++ {0x41c08, 0x0}, ++ {0x41c09, 0x0}, ++ {0x41c0a, 0x0}, ++ {0x41c0b, 0x0}, ++ {0x41c0c, 0x8000}, ++ {0x41c0d, 0x0}, ++ {0x41c0e, 0x1}, ++ {0x41c0f, 0x10}, ++ {0x41c10, 0x0}, ++ {0x41c11, 0x0}, ++ {0x41c12, 0x0}, ++ {0x41c13, 0x0}, ++ {0x41c14, 0x802c}, ++ {0x41c15, 0xd00}, ++ {0x41c16, 0x1}, ++ {0x41c17, 0x10}, ++ {0x41c18, 0x8020}, ++ {0x41c19, 0x803}, ++ {0x41c1a, 0x0}, ++ {0x41c1b, 0x10}, ++ {0x41c1c, 0x0}, ++ {0x41c1d, 0x0}, ++ {0x41c1e, 0x0}, ++ {0x41c1f, 0x0}, ++ {0x41c20, 0x0}, ++ {0x41c21, 0x0}, ++ {0x41c22, 0x0}, ++ {0x41c23, 0x2b00}, ++ {0x41c24, 0x0}, ++ {0x41c25, 0x0}, ++ {0x41c26, 0x0}, ++ {0x41c27, 0x800}, ++ {0x41c28, 0x0}, ++ {0x41c29, 0x0}, ++ {0x41c2a, 0x0}, ++ {0x41c2b, 0x0}, ++ {0x41c2c, 0x807c}, ++ {0x41c2d, 0x0}, ++ {0x41c2e, 0x0}, ++ {0x41c2f, 0x10}, ++ {0x41c30, 0x0}, ++ {0x41c31, 0x0}, ++ {0x41c32, 0x0}, ++ {0x41c33, 0x0}, ++ {0x41c34, 0x0}, ++ {0x41c35, 0x0}, ++ {0x41c36, 0x0}, ++ {0x41c37, 0x0}, ++ {0x41c38, 0x8000}, ++ {0x41c39, 0x0}, ++ {0x41c3a, 0x1}, ++ {0x41c3b, 0x10}, ++ {0x41c3c, 0x0}, ++ {0x41c3d, 0x0}, ++ {0x41c3e, 0x0}, ++ {0x41c3f, 0x0}, ++ {0x41c40, 0x9758}, ++ {0x41c41, 0x0}, ++ {0x41c42, 0x0}, ++ {0x41c43, 0x10}, ++ {0x41c44, 0x8008}, ++ {0x41c45, 0x0}, ++ {0x41c46, 0x0}, ++ {0x41c47, 0x10}, ++ {0x41c48, 0x0}, ++ {0x41c49, 0x0}, ++ {0x41c4a, 0x0}, ++ {0x41c4b, 0x0}, ++ {0x41c4c, 0x0}, ++ {0x41c4d, 0x0}, ++ {0x41c4e, 0x0}, ++ {0x41c4f, 0x0}, ++ {0x41c50, 0xc068}, ++ {0x41c51, 0x0}, ++ {0x41c52, 0x0}, ++ {0x41c53, 0x10}, ++ {0x41c54, 0x0}, ++ {0x41c55, 0x0}, ++ {0x41c56, 0x0}, ++ {0x41c57, 0x0}, ++ {0x9002e, 0x10}, ++ {0x9002f, 0x400}, ++ {0x90030, 0x80e}, ++ {0x90031, 0xb}, ++ {0x90032, 0x480}, ++ {0x90033, 0x809}, ++ {0x90034, 0x9}, ++ {0x90035, 0x308}, ++ {0x90036, 0xc09}, ++ {0x90037, 0x28}, ++ {0x90038, 0x8160}, ++ {0x90039, 0x87c}, ++ {0x9003a, 0x98}, ++ {0x9003b, 0x820}, ++ {0x9003c, 0xc7e}, ++ {0x9003d, 0x2}, ++ {0x9003e, 0x1}, ++ {0x9003f, 0x78}, ++ {0x90040, 0xa}, ++ {0x90041, 0x370}, ++ {0x90042, 0x839}, ++ {0x90043, 0x18}, ++ {0x90044, 0x8160}, ++ {0x90045, 0x83c}, ++ {0x90046, 0x9}, ++ {0x90047, 0x150}, ++ {0x90048, 0x839}, ++ {0x90049, 0x70}, ++ {0x9004a, 0x392}, ++ {0x9004b, 0x39}, ++ {0x9004c, 0x78}, ++ {0x9004d, 0x39a}, ++ {0x9004e, 0x39}, ++ {0x9004f, 0xe09}, ++ {0x90050, 0x100}, ++ {0x90051, 0x839}, ++ {0x90052, 0x2}, ++ {0x90053, 0x1}, ++ {0x90054, 0x38}, ++ {0x90055, 0x0}, ++ {0x90056, 0x100}, ++ {0x90057, 0x839}, ++ {0x90058, 0x0}, ++ {0x90059, 0x398}, ++ {0x9005a, 0x839}, ++ {0x9005b, 0xe19}, ++ {0x9005c, 0x100}, ++ {0x9005d, 0x839}, ++ {0x9005e, 0x2}, ++ {0x9005f, 0x1}, ++ {0x90060, 0x38}, ++ {0x90061, 0x0}, ++ {0x90062, 0x100}, ++ {0x90063, 0x839}, ++ {0x90064, 0x0}, ++ {0x90065, 0x390}, ++ {0x90066, 0x839}, ++ {0x90067, 0x78}, ++ {0x90068, 0x39a}, ++ {0x90069, 0x39}, ++ {0x9006a, 0xe29}, ++ {0x9006b, 0x100}, ++ {0x9006c, 0x839}, ++ {0x9006d, 0x2}, ++ {0x9006e, 0x1}, ++ {0x9006f, 0x38}, ++ {0x90070, 0x0}, ++ {0x90071, 0x100}, ++ {0x90072, 0x839}, ++ {0x90073, 0x70}, ++ {0x90074, 0x392}, ++ {0x90075, 0x39}, ++ {0x90076, 0x0}, ++ {0x90077, 0xf0}, ++ {0x90078, 0x909}, ++ {0x90079, 0x18}, ++ {0x9007a, 0x8160}, ++ {0x9007b, 0x8bc}, ++ {0x9007c, 0x8}, ++ {0x9007d, 0x13a}, ++ {0x9007e, 0xb9}, ++ {0x9007f, 0x24b}, ++ {0x90080, 0x100}, ++ {0x90081, 0x8b9}, ++ {0x90082, 0x2}, ++ {0x90083, 0x1}, ++ {0x90084, 0xb8}, ++ {0x90085, 0x0}, ++ {0x90086, 0x100}, ++ {0x90087, 0x8b9}, ++ {0x90088, 0x20}, ++ {0x90089, 0x4}, ++ {0x9008a, 0xb8}, ++ {0x9008b, 0x20}, ++ {0x9008c, 0x4}, ++ {0x9008d, 0xb8}, ++ {0x9008e, 0x5}, ++ {0x9008f, 0x0}, ++ {0x90090, 0xb8}, ++ {0x90091, 0x479}, ++ {0x90092, 0xc7f8}, ++ {0x90093, 0x8bc}, ++ {0x90094, 0x0}, ++ {0x90095, 0x0}, ++ {0x90096, 0xb8}, ++ {0x90097, 0x0}, ++ {0x90098, 0xa8}, ++ {0x90099, 0x8b9}, ++ {0x9009a, 0x9}, ++ {0x9009b, 0xc9c0}, ++ {0x9009c, 0xcbc}, ++ {0x9009d, 0x0}, ++ {0x9009e, 0x0}, ++ {0x9009f, 0xb8}, ++ {0x900a0, 0x25b}, ++ {0x900a1, 0x100}, ++ {0x900a2, 0xcb9}, ++ {0x900a3, 0x20}, ++ {0x900a4, 0x4}, ++ {0x900a5, 0xb8}, ++ {0x900a6, 0x20}, ++ {0x900a7, 0x4}, ++ {0x900a8, 0xb8}, ++ {0x900a9, 0x20}, ++ {0x900aa, 0x4}, ++ {0x900ab, 0xb8}, ++ {0x900ac, 0x20}, ++ {0x900ad, 0x4}, ++ {0x900ae, 0xb8}, ++ {0x900af, 0x10}, ++ {0x900b0, 0x400}, ++ {0x900b1, 0x89e}, ++ {0x900b2, 0x8}, ++ {0x900b3, 0x370}, ++ {0x900b4, 0x839}, ++ {0x900b5, 0x0}, ++ {0x900b6, 0xf0}, ++ {0x900b7, 0x909}, ++ {0x900b8, 0x33b}, ++ {0x900b9, 0x100}, ++ {0x900ba, 0x8b9}, ++ {0x900bb, 0x0}, ++ {0x900bc, 0x100}, ++ {0x900bd, 0x8b9}, ++ {0x900be, 0x23b}, ++ {0x900bf, 0x100}, ++ {0x900c0, 0xc99}, ++ {0x900c1, 0x2}, ++ {0x900c2, 0x150}, ++ {0x900c3, 0x839}, ++ {0x900c4, 0x1800}, ++ {0x900c5, 0x8660}, ++ {0x900c6, 0x839}, ++ {0x900c7, 0x0}, ++ {0x900c8, 0x2a0}, ++ {0x900c9, 0x809}, ++ {0x900ca, 0x8}, ++ {0x900cb, 0x1880}, ++ {0x900cc, 0x839}, ++ {0x900cd, 0x0}, ++ {0x900ce, 0x82b0}, ++ {0x900cf, 0x838}, ++ {0x900d0, 0x18}, ++ {0x900d1, 0xe0}, ++ {0x900d2, 0x809}, ++ {0x900d3, 0x0}, ++ {0x900d4, 0xe0}, ++ {0x900d5, 0x869}, ++ {0x900d6, 0xf}, ++ {0x900d7, 0x7c0}, ++ {0x900d8, 0x839}, ++ {0x900d9, 0xa}, ++ {0x900da, 0x510}, ++ {0x900db, 0x839}, ++ {0x900dc, 0xa}, ++ {0x900dd, 0x700}, ++ {0x900de, 0x849}, ++ {0x900df, 0xa}, ++ {0x900e0, 0x700}, ++ {0x900e1, 0x859}, ++ {0x900e2, 0xa}, ++ {0x900e3, 0x708}, ++ {0x900e4, 0x859}, ++ {0x900e5, 0x2}, ++ {0x900e6, 0x708}, ++ {0x900e7, 0x849}, ++ {0x900e8, 0xff8}, ++ {0x900e9, 0x8410}, ++ {0x900ea, 0x839}, ++ {0x900eb, 0x7ff8}, ++ {0x900ec, 0x8498}, ++ {0x900ed, 0x838}, ++ {0x900ee, 0x10}, ++ {0x900ef, 0x8160}, ++ {0x900f0, 0x83c}, ++ {0x900f1, 0x0}, ++ {0x900f2, 0x7c8}, ++ {0x900f3, 0x809}, ++ {0x900f4, 0x0}, ++ {0x900f5, 0x1}, ++ {0x900f6, 0x8}, ++ {0x900f7, 0x0}, ++ {0x900f8, 0x45a}, ++ {0x900f9, 0x89}, ++ {0x900fa, 0x0}, ++ {0x900fb, 0x8018}, ++ {0x900fc, 0x808}, ++ {0x900fd, 0x0}, ++ {0x900fe, 0x8020}, ++ {0x900ff, 0x808}, ++ {0x90100, 0x479}, ++ {0x90101, 0xc7f8}, ++ {0x90102, 0x80c}, ++ {0x90103, 0x0}, ++ {0x90104, 0x0}, ++ {0x90105, 0x8}, ++ {0x90106, 0x0}, ++ {0x90107, 0x8018}, ++ {0x90108, 0x808}, ++ {0x90109, 0x0}, ++ {0x9010a, 0x8020}, ++ {0x9010b, 0x808}, ++ {0x9010c, 0x9}, ++ {0x9010d, 0xc9c0}, ++ {0x9010e, 0xc0c}, ++ {0x9010f, 0x0}, ++ {0x90110, 0xa8}, ++ {0x90111, 0x8c9}, ++ {0x90112, 0x29}, ++ {0x90113, 0x8160}, ++ {0x90114, 0x87c}, ++ {0x90115, 0xb8}, ++ {0x90116, 0x820}, ++ {0x90117, 0xc7e}, ++ {0x90118, 0x1}, ++ {0x90119, 0x0}, ++ {0x9011a, 0x78}, ++ {0x9011b, 0x0}, ++ {0x9011c, 0x1}, ++ {0x9011d, 0x78}, ++ {0x9011e, 0xd8}, ++ {0x9011f, 0x820}, ++ {0x90120, 0xc7e}, ++ {0x90121, 0x1}, ++ {0x90122, 0x0}, ++ {0x90123, 0x78}, ++ {0x90124, 0x0}, ++ {0x90125, 0x1}, ++ {0x90126, 0x78}, ++ {0x90127, 0xf8}, ++ {0x90128, 0x820}, ++ {0x90129, 0xc7e}, ++ {0x9012a, 0x1}, ++ {0x9012b, 0x0}, ++ {0x9012c, 0x78}, ++ {0x9012d, 0x0}, ++ {0x9012e, 0x1}, ++ {0x9012f, 0x78}, ++ {0x90130, 0x0}, ++ {0x90131, 0x700}, ++ {0x90132, 0x849}, ++ {0x90133, 0x0}, ++ {0x90134, 0x618}, ++ {0x90135, 0x809}, ++ {0x90136, 0x3ff8}, ++ {0x90137, 0x84b8}, ++ {0x90138, 0x808}, ++ {0x90139, 0x0}, ++ {0x9013a, 0x0}, ++ {0x9013b, 0x8}, ++ {0x9013c, 0x8}, ++ {0x9013d, 0xc870}, ++ {0x9013e, 0xc0c}, ++ {0x9013f, 0x18}, ++ {0x90140, 0x710}, ++ {0x90141, 0x849}, ++ {0x90142, 0x0}, ++ {0x90143, 0x4}, ++ {0x90144, 0x48}, ++ {0x90145, 0x0}, ++ {0x90146, 0x4}, ++ {0x90147, 0x48}, ++ {0x90148, 0x10}, ++ {0x90149, 0x710}, ++ {0x9014a, 0x849}, ++ {0x9014b, 0x0}, ++ {0x9014c, 0x4}, ++ {0x9014d, 0x48}, ++ {0x9014e, 0x0}, ++ {0x9014f, 0x710}, ++ {0x90150, 0x849}, ++ {0x90151, 0x0}, ++ {0x90152, 0x4}, ++ {0x90153, 0x48}, ++ {0x90154, 0x0}, ++ {0x90155, 0x4}, ++ {0x90156, 0x18}, ++ {0x90157, 0x0}, ++ {0x90158, 0x4}, ++ {0x90159, 0x18}, ++ {0x9015a, 0x0}, ++ {0x9015b, 0x4}, ++ {0x9015c, 0x18}, ++ {0x9015d, 0x0}, ++ {0x9015e, 0x8410}, ++ {0x9015f, 0x809}, ++ {0x90160, 0x0}, ++ {0x90161, 0x8498}, ++ {0x90162, 0x808}, ++ {0x90163, 0x5}, ++ {0x90164, 0x510}, ++ {0x90165, 0x809}, ++ {0x90166, 0x198}, ++ {0x90167, 0x1000}, ++ {0x90168, 0x809}, ++ {0x90169, 0x9}, ++ {0x9016a, 0x3c0}, ++ {0x9016b, 0x809}, ++ {0x9016c, 0x10}, ++ {0x9016d, 0x510}, ++ {0x9016e, 0x809}, ++ {0x9016f, 0x0}, ++ {0x90170, 0x3c0}, ++ {0x90171, 0x809}, ++ {0x90172, 0x18}, ++ {0x90173, 0x4}, ++ {0x90174, 0x8}, ++ {0x90175, 0x2}, ++ {0x90176, 0x510}, ++ {0x90177, 0x809}, ++ {0x90178, 0x2}, ++ {0x90179, 0x1000}, ++ {0x9017a, 0x809}, ++ {0x9017b, 0x68}, ++ {0x9017c, 0x801a}, ++ {0x9017d, 0x8}, ++ {0x9017e, 0x68}, ++ {0x9017f, 0x8022}, ++ {0x90180, 0x8}, ++ {0x90181, 0x479}, ++ {0x90182, 0xc7f8}, ++ {0x90183, 0x80c}, ++ {0x90184, 0x0}, ++ {0x90185, 0x0}, ++ {0x90186, 0x8}, ++ {0x90187, 0x68}, ++ {0x90188, 0x801a}, ++ {0x90189, 0x8}, ++ {0x9018a, 0x68}, ++ {0x9018b, 0x8022}, ++ {0x9018c, 0x8}, ++ {0x9018d, 0x9}, ++ {0x9018e, 0xc9c0}, ++ {0x9018f, 0xc0c}, ++ {0x90190, 0x0}, ++ {0x90191, 0xc870}, ++ {0x90192, 0xc0c}, ++ {0x90193, 0x0}, ++ {0x90194, 0x2a0}, ++ {0x90195, 0x809}, ++ {0x90196, 0x10}, ++ {0x90197, 0x8160}, ++ {0x90198, 0x89c}, ++ {0x90199, 0x2}, ++ {0x9019a, 0x7c8}, ++ {0x9019b, 0x809}, ++ {0x9019c, 0x0}, ++ {0x9019d, 0x1}, ++ {0x9019e, 0x8}, ++ {0x9019f, 0x40}, ++ {0x901a0, 0x1932}, ++ {0x901a1, 0x129}, ++ {0x901a2, 0xa}, ++ {0x901a3, 0xc140}, ++ {0x901a4, 0x80c}, ++ {0x901a5, 0x98}, ++ {0x901a6, 0x193a}, ++ {0x901a7, 0x129}, ++ {0x901a8, 0x90}, ++ {0x901a9, 0x1932}, ++ {0x901aa, 0x329}, ++ {0x901ab, 0x90}, ++ {0x901ac, 0x193a}, ++ {0x901ad, 0x329}, ++ {0x901ae, 0x88}, ++ {0x901af, 0x1882}, ++ {0x901b0, 0x9}, ++ {0x901b1, 0x0}, ++ {0x901b2, 0xc140}, ++ {0x901b3, 0x80c}, ++ {0x901b4, 0x10}, ++ {0x901b5, 0x400}, ++ {0x901b6, 0x80e}, ++ {0x901b7, 0xb}, ++ {0x901b8, 0x370}, ++ {0x901b9, 0x809}, ++ {0x901ba, 0x23b}, ++ {0x901bb, 0x100}, ++ {0x901bc, 0xcf9}, ++ {0x901bd, 0x0}, ++ {0x901be, 0x2a0}, ++ {0x901bf, 0x809}, ++ {0x901c0, 0x7800}, ++ {0x901c1, 0x8660}, ++ {0x901c2, 0x809}, ++ {0x901c3, 0xd}, ++ {0x901c4, 0x7c0}, ++ {0x901c5, 0x809}, ++ {0x901c6, 0x0}, ++ {0x901c7, 0x82b0}, ++ {0x901c8, 0x818}, ++ {0x901c9, 0x0}, ++ {0x901ca, 0x82b0}, ++ {0x901cb, 0x868}, ++ {0x901cc, 0x479}, ++ {0x901cd, 0xc7f8}, ++ {0x901ce, 0x91c}, ++ {0x901cf, 0x0}, ++ {0x901d0, 0x0}, ++ {0x901d1, 0x118}, ++ {0x901d2, 0x38}, ++ {0x901d3, 0x80a2}, ++ {0x901d4, 0x118}, ++ {0x901d5, 0x9}, ++ {0x901d6, 0xc9c0}, ++ {0x901d7, 0xd1c}, ++ {0x901d8, 0x0}, ++ {0x901d9, 0x0}, ++ {0x901da, 0x118}, ++ {0x901db, 0x8}, ++ {0x901dc, 0x508}, ++ {0x901dd, 0x809}, ++ {0x901de, 0x5}, ++ {0x901df, 0x7c0}, ++ {0x901e0, 0x809}, ++ {0x901e1, 0x8}, ++ {0x901e2, 0x82b0}, ++ {0x901e3, 0x868}, ++ {0x901e4, 0x8}, ++ {0x901e5, 0x82b0}, ++ {0x901e6, 0x818}, ++ {0x901e7, 0x8}, ++ {0x901e8, 0x82b0}, ++ {0x901e9, 0x888}, ++ {0x901ea, 0x10}, ++ {0x901eb, 0x510}, ++ {0x901ec, 0x809}, ++ {0x901ed, 0x0}, ++ {0x901ee, 0xa8}, ++ {0x901ef, 0x8c9}, ++ {0x901f0, 0x8}, ++ {0x901f1, 0x1900}, ++ {0x901f2, 0xc09}, ++ {0x901f3, 0x0}, ++ {0x901f4, 0x508}, ++ {0x901f5, 0x809}, ++ {0x901f6, 0x2}, ++ {0x901f7, 0x7c8}, ++ {0x901f8, 0x829}, ++ {0x901f9, 0xa}, ++ {0x901fa, 0x3c8}, ++ {0x901fb, 0xc29}, ++ {0x901fc, 0x199}, ++ {0x901fd, 0x3d0}, ++ {0x901fe, 0xc19}, ++ {0x901ff, 0x3}, ++ {0x90200, 0x0}, ++ {0x90201, 0x18}, ++ {0x90202, 0x38}, ++ {0x90203, 0x4}, ++ {0x90204, 0x18}, ++ {0x90205, 0x199}, ++ {0x90206, 0x3d0}, ++ {0x90207, 0xc09}, ++ {0x90208, 0x0}, ++ {0x90209, 0x0}, ++ {0x9020a, 0x8}, ++ {0x9020b, 0x9}, ++ {0x9020c, 0x150}, ++ {0x9020d, 0x809}, ++ {0x9020e, 0x9}, ++ {0x9020f, 0xc800}, ++ {0x90210, 0xc0c}, ++ {0x90211, 0x18}, ++ {0x90212, 0x8160}, ++ {0x90213, 0x8cc}, ++ {0x90214, 0x8}, ++ {0x90215, 0x13a}, ++ {0x90216, 0xc9}, ++ {0x90217, 0x24b}, ++ {0x90218, 0x100}, ++ {0x90219, 0x8c9}, ++ {0x9021a, 0x2}, ++ {0x9021b, 0x1}, ++ {0x9021c, 0xc8}, ++ {0x9021d, 0x0}, ++ {0x9021e, 0x100}, ++ {0x9021f, 0x8c9}, ++ {0x90220, 0x20}, ++ {0x90221, 0x4}, ++ {0x90222, 0xc8}, ++ {0x90223, 0x20}, ++ {0x90224, 0x4}, ++ {0x90225, 0xc8}, ++ {0x90226, 0x5}, ++ {0x90227, 0x0}, ++ {0x90228, 0xc8}, ++ {0x90229, 0x479}, ++ {0x9022a, 0xc7f8}, ++ {0x9022b, 0x8cc}, ++ {0x9022c, 0x0}, ++ {0x9022d, 0x0}, ++ {0x9022e, 0xc8}, ++ {0x9022f, 0x30}, ++ {0x90230, 0xaa}, ++ {0x90231, 0xc9}, ++ {0x90232, 0x9}, ++ {0x90233, 0xc9c0}, ++ {0x90234, 0xccc}, ++ {0x90235, 0x0}, ++ {0x90236, 0x0}, ++ {0x90237, 0xc8}, ++ {0x90238, 0x479}, ++ {0x90239, 0xc7f8}, ++ {0x9023a, 0x8bc}, ++ {0x9023b, 0x0}, ++ {0x9023c, 0x0}, ++ {0x9023d, 0xb8}, ++ {0x9023e, 0x30}, ++ {0x9023f, 0xaa}, ++ {0x90240, 0xb9}, ++ {0x90241, 0x9}, ++ {0x90242, 0xc9c0}, ++ {0x90243, 0xcbc}, ++ {0x90244, 0x0}, ++ {0x90245, 0x0}, ++ {0x90246, 0xb8}, ++ {0x90247, 0x25b}, ++ {0x90248, 0x100}, ++ {0x90249, 0xcc9}, ++ {0x9024a, 0x20}, ++ {0x9024b, 0x4}, ++ {0x9024c, 0xc8}, ++ {0x9024d, 0x20}, ++ {0x9024e, 0x4}, ++ {0x9024f, 0xc8}, ++ {0x90250, 0x20}, ++ {0x90251, 0x4}, ++ {0x90252, 0xa8}, ++ {0x90253, 0x4}, ++ {0x90254, 0x0}, ++ {0x90255, 0xc8}, ++ {0x90256, 0x9}, ++ {0x90257, 0xc800}, ++ {0x90258, 0xc6c}, ++ {0x90259, 0x26f}, ++ {0x9025a, 0x100}, ++ {0x9025b, 0xc19}, ++ {0x9025c, 0x8}, ++ {0x9025d, 0x4}, ++ {0x9025e, 0x18}, ++ {0x9025f, 0x27f}, ++ {0x90260, 0x100}, ++ {0x90261, 0xc19}, ++ {0x90262, 0x479}, ++ {0x90263, 0xc7f8}, ++ {0x90264, 0x80c}, ++ {0x90265, 0x0}, ++ {0x90266, 0x0}, ++ {0x90267, 0x8}, ++ {0x90268, 0x58}, ++ {0x90269, 0x8a}, ++ {0x9026a, 0x9}, ++ {0x9026b, 0x9}, ++ {0x9026c, 0xc9c0}, ++ {0x9026d, 0xc0c}, ++ {0x9026e, 0x0}, ++ {0x9026f, 0x0}, ++ {0x90270, 0x8}, ++ {0x90271, 0x18}, ++ {0x90272, 0x8160}, ++ {0x90273, 0x86c}, ++ {0x90274, 0x1008}, ++ {0x90275, 0x853b}, ++ {0x90276, 0x868}, ++ {0x90277, 0xc00}, ++ {0x90278, 0x8588}, ++ {0x90279, 0x868}, ++ {0x9027a, 0x8}, ++ {0x9027b, 0x85a8}, ++ {0x9027c, 0x868}, ++ {0x9027d, 0x8}, ++ {0x9027e, 0x85c8}, ++ {0x9027f, 0x868}, ++ {0x90280, 0x0}, ++ {0x90281, 0x8050}, ++ {0x90282, 0x868}, ++ {0x90283, 0x60}, ++ {0x90284, 0x138}, ++ {0x90285, 0x869}, ++ {0x90286, 0x18}, ++ {0x90287, 0x8510}, ++ {0x90288, 0x868}, ++ {0x90289, 0x18}, ++ {0x9028a, 0x2c8}, ++ {0x9028b, 0x869}, ++ {0x9028c, 0x10}, ++ {0x9028d, 0x8520}, ++ {0x9028e, 0x868}, ++ {0x9028f, 0x1ff8}, ++ {0x90290, 0x85d8}, ++ {0x90291, 0xc68}, ++ {0x90292, 0x0}, ++ {0x90293, 0xfdf0}, ++ {0x90294, 0x868}, ++ {0x90295, 0x8}, ++ {0x90296, 0x85f0}, ++ {0x90297, 0x868}, ++ {0x90298, 0x8}, ++ {0x90299, 0xa5f0}, ++ {0x9029a, 0x868}, ++ {0x9029b, 0x298}, ++ {0x9029c, 0x100}, ++ {0x9029d, 0x869}, ++ {0x9029e, 0x2}, ++ {0x9029f, 0x1}, ++ {0x902a0, 0x68}, ++ {0x902a1, 0x0}, ++ {0x902a2, 0x100}, ++ {0x902a3, 0x869}, ++ {0x902a4, 0x0}, ++ {0x902a5, 0x85f0}, ++ {0x902a6, 0x868}, ++ {0x902a7, 0x0}, ++ {0x902a8, 0xa5f0}, ++ {0x902a9, 0x868}, ++ {0x902aa, 0x33b}, ++ {0x902ab, 0x100}, ++ {0x902ac, 0x8c9}, ++ {0x902ad, 0x0}, ++ {0x902ae, 0x100}, ++ {0x902af, 0x8c9}, ++ {0x902b0, 0x1ff8}, ++ {0x902b1, 0x85d8}, ++ {0x902b2, 0xc68}, ++ {0x902b3, 0x8}, ++ {0x902b4, 0x8df0}, ++ {0x902b5, 0x868}, ++ {0x902b6, 0x8}, ++ {0x902b7, 0xadf0}, ++ {0x902b8, 0x868}, ++ {0x902b9, 0x2a8}, ++ {0x902ba, 0x100}, ++ {0x902bb, 0x869}, ++ {0x902bc, 0x2}, ++ {0x902bd, 0x1}, ++ {0x902be, 0x68}, ++ {0x902bf, 0x0}, ++ {0x902c0, 0x100}, ++ {0x902c1, 0x869}, ++ {0x902c2, 0x0}, ++ {0x902c3, 0x8df0}, ++ {0x902c4, 0x868}, ++ {0x902c5, 0x0}, ++ {0x902c6, 0xadf0}, ++ {0x902c7, 0x868}, ++ {0x902c8, 0x10}, ++ {0x902c9, 0x2c8}, ++ {0x902ca, 0x869}, ++ {0x902cb, 0x28}, ++ {0x902cc, 0x4}, ++ {0x902cd, 0x68}, ++ {0x902ce, 0xa}, ++ {0x902cf, 0x500}, ++ {0x902d0, 0xc69}, ++ {0x902d1, 0x0}, ++ {0x902d2, 0x8520}, ++ {0x902d3, 0x868}, ++ {0x902d4, 0x8}, ++ {0x902d5, 0x8530}, ++ {0x902d6, 0x868}, ++ {0x902d7, 0x2ba}, ++ {0x902d8, 0x100}, ++ {0x902d9, 0x869}, ++ {0x902da, 0x2}, ++ {0x902db, 0x1}, ++ {0x902dc, 0x68}, ++ {0x902dd, 0x2}, ++ {0x902de, 0x100}, ++ {0x902df, 0x869}, ++ {0x902e0, 0x0}, ++ {0x902e1, 0x8530}, ++ {0x902e2, 0x868}, ++ {0x902e3, 0x0}, ++ {0x902e4, 0x8510}, ++ {0x902e5, 0x868}, ++ {0x902e6, 0x0}, ++ {0x902e7, 0x2c8}, ++ {0x902e8, 0x869}, ++ {0x902e9, 0x8}, ++ {0x902ea, 0x8050}, ++ {0x902eb, 0x868}, ++ {0x902ec, 0x30}, ++ {0x902ed, 0x4}, ++ {0x902ee, 0x68}, ++ {0x902ef, 0x8}, ++ {0x902f0, 0x8520}, ++ {0x902f1, 0x868}, ++ {0x902f2, 0x0}, ++ {0x902f3, 0x8328}, ++ {0x902f4, 0x86b}, ++ {0x902f5, 0x2ca}, ++ {0x902f6, 0x100}, ++ {0x902f7, 0x869}, ++ {0x902f8, 0x2}, ++ {0x902f9, 0x1}, ++ {0x902fa, 0x68}, ++ {0x902fb, 0x4}, ++ {0x902fc, 0x100}, ++ {0x902fd, 0x869}, ++ {0x902fe, 0xff8}, ++ {0x902ff, 0x8328}, ++ {0x90300, 0x86b}, ++ {0x90301, 0x9}, ++ {0x90302, 0x500}, ++ {0x90303, 0xc29}, ++ {0x90304, 0x0}, ++ {0x90305, 0x8520}, ++ {0x90306, 0x868}, ++ {0x90307, 0x8}, ++ {0x90308, 0x3c8}, ++ {0x90309, 0xc29}, ++ {0x9030a, 0x0}, ++ {0x9030b, 0x150}, ++ {0x9030c, 0x809}, ++ {0x9030d, 0x2}, ++ {0x9030e, 0x370}, ++ {0x9030f, 0x809}, ++ {0x90310, 0x0}, ++ {0x90311, 0x400}, ++ {0x90312, 0x80e}, ++ {0x90313, 0x10}, ++ {0x90314, 0x4}, ++ {0x90315, 0x118}, ++ {0x90316, 0x20}, ++ {0x90317, 0x82b0}, ++ {0x90318, 0x808}, ++ {0x90319, 0x479}, ++ {0x9031a, 0xc7f8}, ++ {0x9031b, 0x80c}, ++ {0x9031c, 0x0}, ++ {0x9031d, 0x0}, ++ {0x9031e, 0x8}, ++ {0x9031f, 0x60}, ++ {0x90320, 0x8a}, ++ {0x90321, 0x9}, ++ {0x90322, 0x9}, ++ {0x90323, 0xc9c0}, ++ {0x90324, 0xc0c}, ++ {0x90325, 0x0}, ++ {0x90326, 0x0}, ++ {0x90327, 0x8}, ++ {0x90328, 0x8}, ++ {0x90329, 0x2a0}, ++ {0x9032a, 0x809}, ++ {0x9032b, 0x48}, ++ {0x9032c, 0xc822}, ++ {0x9032d, 0xc}, ++ {0x9032e, 0x48}, ++ {0x9032f, 0xcc32}, ++ {0x90330, 0xc}, ++ {0x90331, 0x9}, ++ {0x90332, 0xc800}, ++ {0x90333, 0xc0c}, ++ {0x90334, 0x0}, ++ {0x90335, 0x8168}, ++ {0x90336, 0x80c}, ++ {0x90337, 0x479}, ++ {0x90338, 0xc7f8}, ++ {0x90339, 0x91c}, ++ {0x9033a, 0x0}, ++ {0x9033b, 0x0}, ++ {0x9033c, 0x118}, ++ {0x9033d, 0x9190}, ++ {0x9033e, 0x80a1}, ++ {0x9033f, 0x918}, ++ {0x90340, 0x9}, ++ {0x90341, 0xc9c0}, ++ {0x90342, 0xd1c}, ++ {0x90343, 0x0}, ++ {0x90344, 0x0}, ++ {0x90345, 0x118}, ++ {0x90346, 0x18}, ++ {0x90347, 0xf0}, ++ {0x90348, 0x909}, ++ {0x90349, 0xa}, ++ {0x9034a, 0xc140}, ++ {0x9034b, 0x92c}, ++ {0x9034c, 0x88}, ++ {0x9034d, 0x1932}, ++ {0x9034e, 0x129}, ++ {0x9034f, 0x88}, ++ {0x90350, 0x193a}, ++ {0x90351, 0x129}, ++ {0x90352, 0x0}, ++ {0x90353, 0xc140}, ++ {0x90354, 0x92c}, ++ {0x90355, 0x8}, ++ {0x90356, 0x300}, ++ {0x90357, 0x819}, ++ {0x90358, 0x10}, ++ {0x90359, 0x8160}, ++ {0x9035a, 0x80c}, ++ {0x9035b, 0x8}, ++ {0x9035c, 0x7c8}, ++ {0x9035d, 0x801}, ++ {0x9035e, 0x8}, ++ {0x9035f, 0x0}, ++ {0x90360, 0x8}, ++ {0x90361, 0x8}, ++ {0x90362, 0x1880}, ++ {0x90363, 0x809}, ++ {0x90364, 0x10}, ++ {0x90365, 0x8160}, ++ {0x90366, 0x80c}, ++ {0x90367, 0x1800}, ++ {0x90368, 0x8660}, ++ {0x90369, 0x809}, ++ {0x9036a, 0x4000}, ++ {0x9036b, 0x8668}, ++ {0x9036c, 0x809}, ++ {0x9036d, 0x0}, ++ {0x9036e, 0xf0}, ++ {0x9036f, 0x909}, ++ {0x90370, 0xf}, ++ {0x90371, 0x7c0}, ++ {0x90372, 0x809}, ++ {0x90373, 0x0}, ++ {0x90374, 0x2a0}, ++ {0x90375, 0x809}, ++ {0x90376, 0x8}, ++ {0x90377, 0x618}, ++ {0x90378, 0x809}, ++ {0x90379, 0x0}, ++ {0x9037a, 0x84b8}, ++ {0x9037b, 0x808}, ++ {0x9037c, 0xff8}, ++ {0x9037d, 0x8410}, ++ {0x9037e, 0x809}, ++ {0x9037f, 0x7ff8}, ++ {0x90380, 0x8498}, ++ {0x90381, 0x808}, ++ {0x90382, 0x0}, ++ {0x90383, 0x7c8}, ++ {0x90384, 0x809}, ++ {0x90385, 0x8}, ++ {0x90386, 0x8168}, ++ {0x90387, 0x80c}, ++ {0x90388, 0x0}, ++ {0x90389, 0x1}, ++ {0x9038a, 0x8}, ++ {0x9038b, 0x0}, ++ {0x9038c, 0x4}, ++ {0x9038d, 0x8}, ++ {0x9038e, 0x0}, ++ {0x9038f, 0x4}, ++ {0x90390, 0x8}, ++ {0x90391, 0x18}, ++ {0x90392, 0x300}, ++ {0x90393, 0x809}, ++ {0x90394, 0x0}, ++ {0x90395, 0x480}, ++ {0x90396, 0x809}, ++ {0x90397, 0x8}, ++ {0x90398, 0x510}, ++ {0x90399, 0x809}, ++ {0x9039a, 0x7800}, ++ {0x9039b, 0x8660}, ++ {0x9039c, 0x809}, ++ {0x9039d, 0x18}, ++ {0x9039e, 0xf0}, ++ {0x9039f, 0x909}, ++ {0x903a0, 0x8}, ++ {0x903a1, 0x7c8}, ++ {0x903a2, 0x801}, ++ {0x903a3, 0x10}, ++ {0x903a4, 0x400}, ++ {0x903a5, 0x80e}, ++ {0x903a6, 0x8}, ++ {0x903a7, 0x150}, ++ {0x903a8, 0x809}, ++ {0x903a9, 0x9}, ++ {0x903aa, 0x370}, ++ {0x903ab, 0x809}, ++ {0x903ac, 0x18}, ++ {0x903ad, 0x8160}, ++ {0x903ae, 0x80c}, ++ {0x903af, 0x8}, ++ {0x903b0, 0xc800}, ++ {0x903b1, 0xc0c}, ++ {0x903b2, 0x8}, ++ {0x903b3, 0xc888}, ++ {0x903b4, 0xc04}, ++ {0x903b5, 0x20}, ++ {0x903b6, 0x8302}, ++ {0x903b7, 0xb}, ++ {0x903b8, 0x18}, ++ {0x903b9, 0x8582}, ++ {0x903ba, 0x8}, ++ {0x903bb, 0x9000}, ++ {0x903bc, 0x8539}, ++ {0x903bd, 0x808}, ++ {0x903be, 0x0}, ++ {0x903bf, 0x8588}, ++ {0x903c0, 0x808}, ++ {0x903c1, 0x40}, ++ {0x903c2, 0x85c8}, ++ {0x903c3, 0x808}, ++ {0x903c4, 0x0}, ++ {0x903c5, 0xfdf0}, ++ {0x903c6, 0x808}, ++ {0x903c7, 0x800}, ++ {0x903c8, 0xc5f0}, ++ {0x903c9, 0x808}, ++ {0x903ca, 0x1ff8}, ++ {0x903cb, 0xfdd8}, ++ {0x903cc, 0xc08}, ++ {0x903cd, 0x18}, ++ {0x903ce, 0xfda8}, ++ {0x903cf, 0x808}, ++ {0x903d0, 0x40}, ++ {0x903d1, 0x8520}, ++ {0x903d2, 0x8d8}, ++ {0x903d3, 0x80}, ++ {0x903d4, 0x8520}, ++ {0x903d5, 0x8e8}, ++ {0x903d6, 0x30a}, ++ {0x903d7, 0x100}, ++ {0x903d8, 0x8d9}, ++ {0x903d9, 0x32a}, ++ {0x903da, 0x100}, ++ {0x903db, 0x8e9}, ++ {0x903dc, 0x0}, ++ {0x903dd, 0x1}, ++ {0x903de, 0x8}, ++ {0x903df, 0x0}, ++ {0x903e0, 0x100}, ++ {0x903e1, 0x809}, ++ {0x903e2, 0x1ff8}, ++ {0x903e3, 0xfdd8}, ++ {0x903e4, 0xc08}, ++ {0x903e5, 0x8}, ++ {0x903e6, 0xfda8}, ++ {0x903e7, 0x808}, ++ {0x903e8, 0x140}, ++ {0x903e9, 0x8520}, ++ {0x903ea, 0x8d8}, ++ {0x903eb, 0x180}, ++ {0x903ec, 0x8520}, ++ {0x903ed, 0x8e8}, ++ {0x903ee, 0x30a}, ++ {0x903ef, 0x100}, ++ {0x903f0, 0x8d9}, ++ {0x903f1, 0x32a}, ++ {0x903f2, 0x100}, ++ {0x903f3, 0x8e9}, ++ {0x903f4, 0x0}, ++ {0x903f5, 0x1}, ++ {0x903f6, 0x8}, ++ {0x903f7, 0x0}, ++ {0x903f8, 0x100}, ++ {0x903f9, 0x809}, ++ {0x903fa, 0x9}, ++ {0x903fb, 0x500}, ++ {0x903fc, 0xc09}, ++ {0x903fd, 0x10}, ++ {0x903fe, 0x82b0}, ++ {0x903ff, 0x808}, ++ {0x90400, 0x0}, ++ {0x90401, 0x8520}, ++ {0x90402, 0x808}, ++ {0x90403, 0x8}, ++ {0x90404, 0x3c8}, ++ {0x90405, 0xc09}, ++ {0x90406, 0x0}, ++ {0x90407, 0x150}, ++ {0x90408, 0x809}, ++ {0x90409, 0x2}, ++ {0x9040a, 0x370}, ++ {0x9040b, 0x809}, ++ {0x9040c, 0x0}, ++ {0x9040d, 0x400}, ++ {0x9040e, 0x80e}, ++ {0x9040f, 0x8}, ++ {0x90410, 0xc848}, ++ {0x90411, 0xc0c}, ++ {0x90412, 0x0}, ++ {0x90413, 0xc890}, ++ {0x90414, 0x804}, ++ {0x90415, 0x20}, ++ {0x90416, 0x8302}, ++ {0x90417, 0xb}, ++ {0x90418, 0x18}, ++ {0x90419, 0x8582}, ++ {0x9041a, 0x8}, ++ {0x9041b, 0x0}, ++ {0x9041c, 0x82b0}, ++ {0x9041d, 0x808}, ++ {0x9041e, 0x1000}, ++ {0x9041f, 0x8539}, ++ {0x90420, 0x808}, ++ {0x90421, 0x0}, ++ {0x90422, 0x8588}, ++ {0x90423, 0x808}, ++ {0x90424, 0x40}, ++ {0x90425, 0x85c8}, ++ {0x90426, 0x808}, ++ {0x90427, 0x7f8}, ++ {0x90428, 0xfdf0}, ++ {0x90429, 0x808}, ++ {0x9042a, 0x800}, ++ {0x9042b, 0xc5f0}, ++ {0x9042c, 0x808}, ++ {0x9042d, 0x80}, ++ {0x9042e, 0x8088}, ++ {0x9042f, 0x80b}, ++ {0x90430, 0x1ff8}, ++ {0x90431, 0xfdd8}, ++ {0x90432, 0xc08}, ++ {0x90433, 0x18}, ++ {0x90434, 0xfda8}, ++ {0x90435, 0x808}, ++ {0x90436, 0x200}, ++ {0x90437, 0x8520}, ++ {0x90438, 0x8d8}, ++ {0x90439, 0x400}, ++ {0x9043a, 0x8520}, ++ {0x9043b, 0x8e8}, ++ {0x9043c, 0x2da}, ++ {0x9043d, 0x100}, ++ {0x9043e, 0x8d9}, ++ {0x9043f, 0x2ea}, ++ {0x90440, 0x100}, ++ {0x90441, 0x8e9}, ++ {0x90442, 0x2}, ++ {0x90443, 0x1}, ++ {0x90444, 0x8}, ++ {0x90445, 0x0}, ++ {0x90446, 0x100}, ++ {0x90447, 0x809}, ++ {0x90448, 0x1ff8}, ++ {0x90449, 0xfdd8}, ++ {0x9044a, 0xc08}, ++ {0x9044b, 0x8}, ++ {0x9044c, 0xfda8}, ++ {0x9044d, 0x808}, ++ {0x9044e, 0xa00}, ++ {0x9044f, 0x8520}, ++ {0x90450, 0x8d8}, ++ {0x90451, 0xc00}, ++ {0x90452, 0x8520}, ++ {0x90453, 0x8e8}, ++ {0x90454, 0x2da}, ++ {0x90455, 0x100}, ++ {0x90456, 0x8d9}, ++ {0x90457, 0x2ea}, ++ {0x90458, 0x100}, ++ {0x90459, 0x8e9}, ++ {0x9045a, 0x0}, ++ {0x9045b, 0x1}, ++ {0x9045c, 0x8}, ++ {0x9045d, 0x0}, ++ {0x9045e, 0x100}, ++ {0x9045f, 0x809}, ++ {0x90460, 0x9}, ++ {0x90461, 0x500}, ++ {0x90462, 0xc09}, ++ {0x90463, 0x10}, ++ {0x90464, 0x82b0}, ++ {0x90465, 0x808}, ++ {0x90466, 0x0}, ++ {0x90467, 0x8520}, ++ {0x90468, 0x808}, ++ {0x90469, 0x8}, ++ {0x9046a, 0x3c8}, ++ {0x9046b, 0xc09}, ++ {0x9046c, 0x0}, ++ {0x9046d, 0x150}, ++ {0x9046e, 0x809}, ++ {0x9046f, 0x2}, ++ {0x90470, 0x370}, ++ {0x90471, 0x809}, ++ {0x90472, 0x0}, ++ {0x90473, 0x400}, ++ {0x90474, 0x80e}, ++ {0x90475, 0x8}, ++ {0x90476, 0xc848}, ++ {0x90477, 0xc0c}, ++ {0x90478, 0x0}, ++ {0x90479, 0xc890}, ++ {0x9047a, 0x804}, ++ {0x9047b, 0x1008}, ++ {0x9047c, 0x853b}, ++ {0x9047d, 0x808}, ++ {0x9047e, 0xc00}, ++ {0x9047f, 0x8588}, ++ {0x90480, 0x808}, ++ {0x90481, 0x8}, ++ {0x90482, 0x85a8}, ++ {0x90483, 0x808}, ++ {0x90484, 0x8}, ++ {0x90485, 0x85c8}, ++ {0x90486, 0x808}, ++ {0x90487, 0x60}, ++ {0x90488, 0x138}, ++ {0x90489, 0x809}, ++ {0x9048a, 0x18}, ++ {0x9048b, 0xc8}, ++ {0x9048c, 0x809}, ++ {0x9048d, 0x0}, ++ {0x9048e, 0xa4}, ++ {0x9048f, 0x809}, ++ {0x90490, 0x0}, ++ {0x90491, 0x8510}, ++ {0x90492, 0x808}, ++ {0x90493, 0x2fa}, ++ {0x90494, 0x100}, ++ {0x90495, 0x8d9}, ++ {0x90496, 0x31a}, ++ {0x90497, 0x100}, ++ {0x90498, 0x8e9}, ++ {0x90499, 0x2}, ++ {0x9049a, 0x1}, ++ {0x9049b, 0x8}, ++ {0x9049c, 0x2}, ++ {0x9049d, 0x100}, ++ {0x9049e, 0x809}, ++ {0x9049f, 0x202}, ++ {0x904a0, 0x8510}, ++ {0x904a1, 0xc08}, ++ {0x904a2, 0x50}, ++ {0x904a3, 0xa2}, ++ {0x904a4, 0x9}, ++ {0x904a5, 0x0}, ++ {0x904a6, 0x0}, ++ {0x904a7, 0x8}, ++ {0x904a8, 0x0}, ++ {0x904a9, 0x0}, ++ {0x904aa, 0x8}, ++ {0x904ab, 0x0}, ++ {0x904ac, 0x0}, ++ {0x904ad, 0x8}, ++ {0x904ae, 0x0}, ++ {0x904af, 0xc8}, ++ {0x904b0, 0x809}, ++ {0x904b1, 0xb}, ++ {0x904b2, 0x508}, ++ {0x904b3, 0x809}, ++ {0x904b4, 0x8}, ++ {0x904b5, 0x1900}, ++ {0x904b6, 0xc09}, ++ {0x904b7, 0x2}, ++ {0x904b8, 0x0}, ++ {0x904b9, 0x8}, ++ {0x904ba, 0x0}, ++ {0x904bb, 0x508}, ++ {0x904bc, 0x809}, ++ {0x904bd, 0x9}, ++ {0x904be, 0x500}, ++ {0x904bf, 0xc09}, ++ {0x904c0, 0x10}, ++ {0x904c1, 0x82b0}, ++ {0x904c2, 0x808}, ++ {0x904c3, 0x0}, ++ {0x904c4, 0x8520}, ++ {0x904c5, 0x808}, ++ {0x904c6, 0x8}, ++ {0x904c7, 0x3c8}, ++ {0x904c8, 0xc09}, ++ {0x904c9, 0x0}, ++ {0x904ca, 0x150}, ++ {0x904cb, 0x809}, ++ {0x904cc, 0x2}, ++ {0x904cd, 0x370}, ++ {0x904ce, 0x809}, ++ {0x904cf, 0x0}, ++ {0x904d0, 0x400}, ++ {0x904d1, 0x80e}, ++ {0x904d2, 0x8}, ++ {0x904d3, 0xc848}, ++ {0x904d4, 0xc0c}, ++ {0x904d5, 0x0}, ++ {0x904d6, 0xc890}, ++ {0x904d7, 0x804}, ++ {0x904d8, 0x20}, ++ {0x904d9, 0x8302}, ++ {0x904da, 0xb}, ++ {0x904db, 0x18}, ++ {0x904dc, 0x8582}, ++ {0x904dd, 0x8}, ++ {0x904de, 0x1000}, ++ {0x904df, 0x8539}, ++ {0x904e0, 0x808}, ++ {0x904e1, 0x0}, ++ {0x904e2, 0x8588}, ++ {0x904e3, 0x808}, ++ {0x904e4, 0x40}, ++ {0x904e5, 0x85c8}, ++ {0x904e6, 0x808}, ++ {0x904e7, 0x8}, ++ {0x904e8, 0xfdf0}, ++ {0x904e9, 0x808}, ++ {0x904ea, 0x80}, ++ {0x904eb, 0x8088}, ++ {0x904ec, 0x80b}, ++ {0x904ed, 0x0}, ++ {0x904ee, 0x3b8}, ++ {0x904ef, 0x869}, ++ {0x904f0, 0x1ff8}, ++ {0x904f1, 0xfdd8}, ++ {0x904f2, 0xc08}, ++ {0x904f3, 0x18}, ++ {0x904f4, 0xfda8}, ++ {0x904f5, 0x808}, ++ {0x904f6, 0x40}, ++ {0x904f7, 0x8520}, ++ {0x904f8, 0x8d8}, ++ {0x904f9, 0x80}, ++ {0x904fa, 0x8520}, ++ {0x904fb, 0x8e8}, ++ {0x904fc, 0x2da}, ++ {0x904fd, 0x100}, ++ {0x904fe, 0x8d9}, ++ {0x904ff, 0x2ea}, ++ {0x90500, 0x100}, ++ {0x90501, 0x8e9}, ++ {0x90502, 0x2}, ++ {0x90503, 0x1}, ++ {0x90504, 0x8}, ++ {0x90505, 0x0}, ++ {0x90506, 0x100}, ++ {0x90507, 0x809}, ++ {0x90508, 0x1ff8}, ++ {0x90509, 0xfdd8}, ++ {0x9050a, 0xc08}, ++ {0x9050b, 0x8}, ++ {0x9050c, 0xfda8}, ++ {0x9050d, 0x808}, ++ {0x9050e, 0x140}, ++ {0x9050f, 0x8520}, ++ {0x90510, 0x8d8}, ++ {0x90511, 0x180}, ++ {0x90512, 0x8520}, ++ {0x90513, 0x8e8}, ++ {0x90514, 0x2da}, ++ {0x90515, 0x100}, ++ {0x90516, 0x8d9}, ++ {0x90517, 0x2ea}, ++ {0x90518, 0x100}, ++ {0x90519, 0x8e9}, ++ {0x9051a, 0x0}, ++ {0x9051b, 0x1}, ++ {0x9051c, 0x8}, ++ {0x9051d, 0x0}, ++ {0x9051e, 0x100}, ++ {0x9051f, 0x809}, ++ {0x90520, 0x9}, ++ {0x90521, 0x500}, ++ {0x90522, 0xc09}, ++ {0x90523, 0x10}, ++ {0x90524, 0x82b0}, ++ {0x90525, 0x808}, ++ {0x90526, 0x0}, ++ {0x90527, 0x8520}, ++ {0x90528, 0x808}, ++ {0x90529, 0x8}, ++ {0x9052a, 0x3c8}, ++ {0x9052b, 0xc09}, ++ {0x9052c, 0x0}, ++ {0x9052d, 0x150}, ++ {0x9052e, 0x809}, ++ {0x9052f, 0x2}, ++ {0x90530, 0x370}, ++ {0x90531, 0x809}, ++ {0x90532, 0x0}, ++ {0x90533, 0x400}, ++ {0x90534, 0x80e}, ++ {0x90535, 0x8}, ++ {0x90536, 0xc848}, ++ {0x90537, 0xc0c}, ++ {0x90538, 0x0}, ++ {0x90539, 0xc890}, ++ {0x9053a, 0x804}, ++ {0xd00e7, 0x600}, ++ {0x9001c, 0x0}, ++ {0x90020, 0x77}, ++ {0x90024, 0x82}, ++ {0x90025, 0x2b}, ++ {0x90026, 0x2b}, ++ {0x9002b, 0x110}, ++ {0x90708, 0x127}, ++ {0x90700, 0x14d}, ++ {0x90701, 0x16f}, ++ {0x90702, 0x18e}, ++ {0x90703, 0x12d}, ++ {0x90704, 0x0}, ++ {0x90705, 0x0}, ++ {0x90706, 0x0}, ++ {0x90707, 0x0}, ++ {0x2018a, 0x0}, ++ {0x20124, 0x1}, ++ {0x2018b, 0x16}, ++ {0x20125, 0x39}, ++ {0x2018c, 0x4e}, ++ {0x20126, 0x1}, ++ {0x2018d, 0x16}, ++ {0x20127, 0x39}, ++ {0x2018e, 0x4e}, ++ {0x20128, 0x17}, ++ {0x2018f, 0x27}, ++ {0x20129, 0x4f}, ++ {0x20190, 0x5f}, ++ {0x2012a, 0x17}, ++ {0x20191, 0x27}, ++ {0x2012b, 0x4f}, ++ {0x20192, 0x5f}, ++ {0x2012c, 0x28}, ++ {0x20193, 0x38}, ++ {0x2012d, 0x60}, ++ {0x20194, 0x70}, ++ {0x2012e, 0x28}, ++ {0x20195, 0x38}, ++ {0x2012f, 0x60}, ++ {0x20196, 0x70}, ++ {0x20130, 0x80}, ++ {0x20197, 0x80}, ++ {0x20131, 0x80}, ++ {0x20198, 0x80}, ++ {0x20132, 0x80}, ++ {0x20199, 0x80}, ++ {0x20133, 0x80}, ++ {0x2019a, 0x80}, ++ {0x20134, 0x71}, ++ {0x2019b, 0x74}, ++ {0x20135, 0x77}, ++ {0x2019c, 0x7a}, ++ {0x20136, 0x71}, ++ {0x2019d, 0x74}, ++ {0x20137, 0x77}, ++ {0x2019e, 0x7a}, ++ {0x20138, 0x75}, ++ {0x2019f, 0x76}, ++ {0x20139, 0x7b}, ++ {0x201a0, 0x7c}, ++ {0x2013a, 0x75}, ++ {0x201a1, 0x76}, ++ {0x2013b, 0x7b}, ++ {0x201a2, 0x7c}, ++ {0x2013c, 0x7d}, ++ {0x201a3, 0x7e}, ++ {0x2013d, 0x7d}, ++ {0x201a4, 0x7e}, ++ {0x2013e, 0x7d}, ++ {0x201a5, 0x7e}, ++ {0x2013f, 0x7d}, ++ {0x201a6, 0x7e}, ++ {0x20140, 0x7f}, ++ {0x201a7, 0x7f}, ++ {0x20141, 0x7f}, ++ {0x201a8, 0x7f}, ++ {0x20142, 0x7f}, ++ {0x201a9, 0x7f}, ++ {0x20143, 0x7f}, ++ {0x201aa, 0x7f}, ++ {0x20144, 0x80}, ++ {0x201ab, 0x7f}, ++ {0x20145, 0x80}, ++ {0x201ac, 0x7f}, ++ {0x20146, 0x80}, ++ {0x201ad, 0x7f}, ++ {0x20147, 0x80}, ++ {0x201ae, 0x7f}, ++ {0x20148, 0x81}, ++ {0x201af, 0x93}, ++ {0x20149, 0x81}, ++ {0x201b0, 0x93}, ++ {0x2014a, 0x10a}, ++ {0x201b1, 0x11b}, ++ {0x2014b, 0x10a}, ++ {0x201b2, 0x11b}, ++ {0x2014c, 0x94}, ++ {0x201b3, 0x9b}, ++ {0x2014d, 0x94}, ++ {0x201b4, 0x9b}, ++ {0x2014e, 0x11c}, ++ {0x201b5, 0x122}, ++ {0x2014f, 0x11c}, ++ {0x201b6, 0x122}, ++ {0x20150, 0x9c}, ++ {0x201b7, 0xaf}, ++ {0x20151, 0x9c}, ++ {0x201b8, 0xaf}, ++ {0x20152, 0x123}, ++ {0x201b9, 0x132}, ++ {0x20153, 0x123}, ++ {0x201ba, 0x132}, ++ {0x20154, 0xb0}, ++ {0x201bb, 0xc0}, ++ {0x20155, 0xb0}, ++ {0x201bc, 0xc0}, ++ {0x20156, 0x133}, ++ {0x201bd, 0x143}, ++ {0x20157, 0x133}, ++ {0x201be, 0x143}, ++ {0x20158, 0xc1}, ++ {0x201bf, 0xca}, ++ {0x20159, 0xc1}, ++ {0x201c0, 0xca}, ++ {0x2015a, 0x144}, ++ {0x201c1, 0x14d}, ++ {0x2015b, 0x144}, ++ {0x201c2, 0x14d}, ++ {0x2015c, 0xcb}, ++ {0x201c3, 0xd4}, ++ {0x2015d, 0xcb}, ++ {0x201c4, 0xd4}, ++ {0x2015e, 0x14e}, ++ {0x201c5, 0x157}, ++ {0x2015f, 0x14e}, ++ {0x201c6, 0x157}, ++ {0x20160, 0xd5}, ++ {0x201c7, 0xdf}, ++ {0x20161, 0xd5}, ++ {0x201c8, 0xdf}, ++ {0x20162, 0x158}, ++ {0x201c9, 0x161}, ++ {0x20163, 0x158}, ++ {0x201ca, 0x161}, ++ {0x20164, 0xe0}, ++ {0x201cb, 0xee}, ++ {0x20165, 0xe0}, ++ {0x201cc, 0xee}, ++ {0x20166, 0x162}, ++ {0x201cd, 0x170}, ++ {0x20167, 0x162}, ++ {0x201ce, 0x170}, ++ {0x20168, 0xef}, ++ {0x201cf, 0xf9}, ++ {0x20169, 0xef}, ++ {0x201d0, 0xf9}, ++ {0x2016a, 0x171}, ++ {0x201d1, 0x17a}, ++ {0x2016b, 0x171}, ++ {0x201d2, 0x17a}, ++ {0x2016c, 0xfa}, ++ {0x201d3, 0x108}, ++ {0x2016d, 0xfa}, ++ {0x201d4, 0x108}, ++ {0x2016e, 0x17b}, ++ {0x201d5, 0x189}, ++ {0x2016f, 0x17b}, ++ {0x201d6, 0x189}, ++ {0x20170, 0x109}, ++ {0x201d7, 0x109}, ++ {0x20171, 0x109}, ++ {0x201d8, 0x109}, ++ {0x20172, 0x18a}, ++ {0x201d9, 0x18a}, ++ {0x20173, 0x18a}, ++ {0x201da, 0x18a}, ++ {0x41613, 0xb00}, ++ {0x41617, 0x0}, ++ {0x4163b, 0xb00}, ++ {0x4163f, 0x0}, ++ {0x41663, 0xb00}, ++ {0x41667, 0x0}, ++ {0x4168b, 0xb00}, ++ {0x4168f, 0x0}, ++ {0x41723, 0xb00}, ++ {0x41727, 0x0}, ++ {0x4174b, 0xb00}, ++ {0x4174f, 0x0}, ++ {0x417f3, 0xb00}, ++ {0x417f7, 0x0}, ++ {0x4181b, 0xb00}, ++ {0x4181f, 0x0}, ++ {0x41a2b, 0x6b00}, ++ {0x41a2f, 0x0}, ++ {0x41a53, 0x3b00}, ++ {0x41a57, 0x800}, ++ {0x41a7b, 0x6b00}, ++ {0x41a7f, 0x0}, ++ {0x41aa3, 0x3b00}, ++ {0x41aa7, 0x800}, ++ {0x41b33, 0x6b00}, ++ {0x41b37, 0x0}, ++ {0x41b5b, 0x3b00}, ++ {0x41b5f, 0x800}, ++ {0x41bfb, 0x6b00}, ++ {0x41bff, 0x0}, ++ {0x41c23, 0x3b00}, ++ {0x41c27, 0x800}, ++ {0x41008, 0xc9d8}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0xc808}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x2b00}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0xc958}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0xcd88}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x2b00}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0xc0d8}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0xd848}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x2b00}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0xc158}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0xddc8}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x2b00}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0xc1d8}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0xc308}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x2b00}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0xc558}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0xea08}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x2b00}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0xc5d8}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0xe308}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x2b00}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x48d8}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x4248}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x88d8}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x9648}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x2b00}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0xca58}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0xc108}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x2b00}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0xcb58}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0xc008}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x2b00}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0xd4d8}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0xc008}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0xc0001, 0x5061}, ++ {0xc0002, 0x7098}, ++ {0xc0003, 0x0}, ++ {0xc0000, 0xbedc}, ++ {0xc0006, 0xb0db}, ++ {0xc0007, 0x0}, ++ {0x9070c, 0x0}, ++ {0x9070d, 0x7ff}, ++ {0x9070e, 0x668}, ++ {0x9070f, 0x7910}, ++ {0x90710, 0x355e}, ++ {0x90711, 0xcbb5}, ++ {0x90713, 0xffff}, ++ {0x90714, 0x710}, ++ {0x90715, 0x7800}, ++ {0x90c10, 0xffff}, ++ {0x90c12, 0xff10}, ++ {0x90712, 0x2ee8}, ++ {0x90c11, 0xffff}, ++ {0x90716, 0xffdf}, ++ {0x90717, 0x6f10}, ++ {0x90718, 0x6f10}, ++ {0x90719, 0x2868}, ++ {0x9071a, 0x2868}, ++ {0x9071b, 0xfeef}, ++ {0x90904, 0xe400}, ++ {0x90986, 0xe400}, ++ {0x90920, 0x0}, ++ {0x90921, 0x0}, ++ {0x90922, 0x0}, ++ {0x90923, 0x0}, ++ {0x90924, 0xff00}, ++ {0x90925, 0xff00}, ++ {0x90926, 0xff00}, ++ {0x90927, 0xff00}, ++ {0x90930, 0x4000}, ++ {0x90931, 0x2000}, ++ {0x90932, 0xff00}, ++ {0x90933, 0xff00}, ++ {0x9090a, 0x0}, ++ {0x9090c, 0x0}, ++ {0x9090d, 0x1}, ++ {0x200f0, 0x27f7}, ++ {0x200f1, 0x2108}, ++ {0x200f2, 0x2108}, ++ {0x100b9, 0x1}, ++ {0x100b1, 0x180}, ++ {0x100ba, 0x1}, ++ {0x100a2, 0x0}, ++ {0x100b5, 0x1}, ++ {0x110b9, 0x1}, ++ {0x110b1, 0x180}, ++ {0x110ba, 0x1}, ++ {0x110a2, 0x0}, ++ {0x110b5, 0x1}, ++ {0x120b9, 0x1}, ++ {0x120b1, 0x180}, ++ {0x120ba, 0x1}, ++ {0x120a2, 0x0}, ++ {0x120b5, 0x1}, ++ {0x130b9, 0x1}, ++ {0x130b1, 0x180}, ++ {0x130ba, 0x1}, ++ {0x130a2, 0x0}, ++ {0x130b5, 0x1}, ++ {0x70024, 0x5a3c}, ++ {0x70025, 0x5a3c}, ++ {0x70026, 0x5a3c}, ++ {0x70027, 0x5a3c}, ++ {0x70028, 0x5a3c}, ++ {0x70029, 0x5a3c}, ++ {0x7002a, 0x5a3c}, ++ {0x7002b, 0x5a3c}, ++ {0x70124, 0x5a3c}, ++ {0x70125, 0x5a3c}, ++ {0x70126, 0x5a3c}, ++ {0x70127, 0x5a3c}, ++ {0x70128, 0x5a3c}, ++ {0x70129, 0x5a3c}, ++ {0x7012a, 0x5a3c}, ++ {0x7012b, 0x5a3c}, ++ {0x70224, 0x5a3c}, ++ {0x70225, 0x5a3c}, ++ {0x70226, 0x5a3c}, ++ {0x70227, 0x5a3c}, ++ {0x70228, 0x5a3c}, ++ {0x70229, 0x5a3c}, ++ {0x7022a, 0x5a3c}, ++ {0x7022b, 0x5a3c}, ++ {0x70324, 0x5a3c}, ++ {0x70325, 0x5a3c}, ++ {0x70326, 0x5a3c}, ++ {0x70327, 0x5a3c}, ++ {0x70328, 0x5a3c}, ++ {0x70329, 0x5a3c}, ++ {0x7032a, 0x5a3c}, ++ {0x7032b, 0x5a3c}, ++ {0x70424, 0x5a3c}, ++ {0x70425, 0x5a3c}, ++ {0x70426, 0x5a3c}, ++ {0x70427, 0x5a3c}, ++ {0x70428, 0x5a3c}, ++ {0x70429, 0x5a3c}, ++ {0x7042a, 0x5a3c}, ++ {0x7042b, 0x5a3c}, ++ {0x70524, 0x5a3c}, ++ {0x70525, 0x5a3c}, ++ {0x70526, 0x5a3c}, ++ {0x70527, 0x5a3c}, ++ {0x70528, 0x5a3c}, ++ {0x70529, 0x5a3c}, ++ {0x7052a, 0x5a3c}, ++ {0x7052b, 0x5a3c}, ++ {0x70624, 0x5a3c}, ++ {0x70625, 0x5a3c}, ++ {0x70626, 0x5a3c}, ++ {0x70627, 0x5a3c}, ++ {0x70628, 0x5a3c}, ++ {0x70629, 0x5a3c}, ++ {0x7062a, 0x5a3c}, ++ {0x7062b, 0x5a3c}, ++ {0x70724, 0x5a3c}, ++ {0x70725, 0x5a3c}, ++ {0x70726, 0x5a3c}, ++ {0x70727, 0x5a3c}, ++ {0x70728, 0x5a3c}, ++ {0x70729, 0x5a3c}, ++ {0x7072a, 0x5a3c}, ++ {0x7072b, 0x5a3c}, ++ {0x70824, 0x5a3c}, ++ {0x70825, 0x5a3c}, ++ {0x70826, 0x5a3c}, ++ {0x70827, 0x5a3c}, ++ {0x70828, 0x5a3c}, ++ {0x70829, 0x5a3c}, ++ {0x7082a, 0x5a3c}, ++ {0x7082b, 0x5a3c}, ++ {0x70065, 0x1ff}, ++ {0x2007e, 0x33}, ++ {0x200ef, 0xffff}, ++ {0x90910, 0x2}, ++ {0x20310, 0x1}, ++ {0x20311, 0x1}, ++ {0xc0080, 0x2}, ++ {0xd0003, 0x0}, ++}; ++ ++static struct dram_fsp_msg ddr_dram_fsp_msg[] = { ++ { ++ /* P0 6400mbps */ ++ .drate = 6400, ++ .ssc = false, ++ .fsp_phy_cfg = ddr_phy_fsp0_cfg, ++ .fsp_phy_cfg_num = ARRAY_SIZE(ddr_phy_fsp0_cfg), ++ .fw_type = FW_1D_IMAGE, ++ .fsp_phy_msgh_cfg = ddr_phy_msgh_fsp0_cfg, ++ .fsp_phy_msgh_cfg_num = ARRAY_SIZE(ddr_phy_msgh_fsp0_cfg), ++ .fsp_phy_pie_cfg = ddr_phy_pie_fsp0_cfg, ++ .fsp_phy_pie_cfg_num = ARRAY_SIZE(ddr_phy_pie_fsp0_cfg), ++ }, ++}; ++ ++/* dram fsp cfg */ ++static struct dram_fsp_cfg ddr_dram_fsp_cfg[] = { ++ { ++ .ddrc_cfg = ddr_dram_fsp0_ddrc_cfg, ++ .ddrc_cfg_num = ARRAY_SIZE(ddr_dram_fsp0_ddrc_cfg), ++ .bypass = 0, ++ }, ++}; ++ ++/* ddr timing config params */ ++struct dram_timing_info dram_timing = { ++ .ddrc_cfg = ddr_ddrc_cfg, ++ .ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg), ++ .ddrphy_cfg = ddr_ddrphy_cfg, ++ .ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg), ++ .fsp_msg = ddr_dram_fsp_msg, ++ .fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg), ++ .ddrphy_trained_csr = ddr_ddrphy_trained_csr, ++ .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr), ++ .ddrphy_pie = ddr_phy_pie, ++ .ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie), ++ .fsp_table = { 6400, }, ++ .fsp_cfg = ddr_dram_fsp_cfg, ++ .fsp_cfg_num = ARRAY_SIZE(ddr_dram_fsp_cfg), ++}; +diff --git a/boards/ccimx95/ddr/Makefile b/boards/ccimx95/ddr/Makefile +new file mode 100644 +index 000000000000..646ed78e5aaf +--- /dev/null ++++ b/boards/ccimx95/ddr/Makefile +@@ -0,0 +1,4 @@ ++DDR_CONFIG ?= MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_timing ++OBJS += $(OUT)/$(DDR_CONFIG).o ++ ++VPATH += boards/ccimx95/ddr +diff --git a/boards/ccimx95/ddr/XIMX95LPD5EVK19_6400mbps_train_timing_a1.c b/boards/ccimx95/ddr/XIMX95LPD5EVK19_6400mbps_train_timing_a1.c +new file mode 100644 +index 000000000000..9bbb3c8c8ad7 +--- /dev/null ++++ b/boards/ccimx95/ddr/XIMX95LPD5EVK19_6400mbps_train_timing_a1.c +@@ -0,0 +1,10754 @@ ++/* ++ * Copyright 2023-2024 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ * ++ * Code generated with DDR Tool v3.5.0_7-ad54c9c4. ++ * DDR PHY FW2024.09 ++ */ ++ ++#include "ddr.h" ++ ++/* Initialize DDRC registers */ ++static struct ddrc_cfg_param ddr_ddrc_cfg[] = { ++ {0x5e080110, 0x41084001U}, ++ {0x5e080000, 0x3ffU}, ++ {0x5e080008, 0x0U}, ++ {0x5e080010, 0x4U}, ++ {0x5e080014, 0x80000U}, ++ {0x5e080020, 0x80000000U}, ++ {0x5e080024, 0x80007ffU}, ++ {0x5e080028, 0x80000000U}, ++ {0x5e08002c, 0x7ffU}, ++ {0x5e080080, 0x80000522U}, ++ {0x5e080084, 0x80000522U}, ++ {0x5e080114, 0x1000U}, ++ {0x5e080260, 0x21U}, ++ {0x5e080268, 0x0U}, ++ {0x5e08026c, 0x1004U}, ++ {0x5e080f00, 0x8U}, ++ {0x5e080f04, 0x800U}, ++ {0x5e080800, 0x43931002U}, ++ {0x5e080804, 0x3f1f1f1fU}, ++ {0x5e081000, 0x0U}, ++ {0x5e081220, 0x0U}, ++ {0x5e081224, 0x0U}, ++ {0x5e081228, 0x0U}, ++ {0x5e08122c, 0x0U}, ++ {0x5e081230, 0x0U}, ++ {0x5e081234, 0x0U}, ++ {0x5e081238, 0x0U}, ++ {0x5e08123c, 0x0U}, ++ {0x5e081240, 0x0U}, ++ {0x5e081244, 0x0U}, ++ {0x5e081248, 0x0U}, ++ {0x5e08124c, 0x0U}, ++ {0x5e081250, 0x0U}, ++ {0x5e081254, 0x0U}, ++ {0x5e081258, 0x0U}, ++ {0x5e08125c, 0x0U}, ++}; ++ ++/* DRAM fsp configurations */ ++static struct ddrc_cfg_param ddr_dram_fsp0_ddrc_cfg[] = { ++ {0x5e080100, 0x020D2100U}, ++ {0x5e080104, 0x4866000CU}, ++ {0x5e080108, 0xF2F28D47U}, ++ {0x5e08010C, 0x20488010U}, ++ {0x5e080124, 0x0C34030DU}, ++ {0x5e080160, 0x00000101U}, ++ {0x5e08016C, 0x01300000U}, ++ {0x5e080170, 0x8C010509U}, ++ {0x5e080250, 0x00110C11U}, ++ {0x5e080254, 0x00680040U}, ++ {0x5e080258, 0x03003E80U}, ++ {0x5e08025C, 0x40520200U}, ++ {0x5e080300, 0x08120809U}, ++ {0x5e080304, 0x00680F03U}, ++ {0x5e080308, 0x0604061AU}, ++ {0x5e08030C, 0x0030001CU}, ++ {0x5e080310, 0x20610000U}, ++ {0x5e080314, 0x0A0A0407U}, ++}; ++ ++/* PHY Initialize Configuration */ ++static struct ddrphy_cfg_param ddr_ddrphy_cfg[] = { ++ {0x10080, 0x7}, ++ {0x10081, 0x5}, ++ {0x10082, 0x6}, ++ {0x10083, 0x1}, ++ {0x10084, 0x2}, ++ {0x10085, 0x0}, ++ {0x10086, 0x3}, ++ {0x10087, 0x4}, ++ {0x11080, 0x0}, ++ {0x11081, 0x1}, ++ {0x11082, 0x2}, ++ {0x11083, 0x3}, ++ {0x11084, 0x4}, ++ {0x11085, 0x7}, ++ {0x11086, 0x6}, ++ {0x11087, 0x5}, ++ {0x12080, 0x5}, ++ {0x12081, 0x6}, ++ {0x12082, 0x1}, ++ {0x12083, 0x7}, ++ {0x12084, 0x4}, ++ {0x12085, 0x2}, ++ {0x12086, 0x0}, ++ {0x12087, 0x3}, ++ {0x13080, 0x0}, ++ {0x13081, 0x3}, ++ {0x13082, 0x2}, ++ {0x13083, 0x7}, ++ {0x13084, 0x4}, ++ {0x13085, 0x5}, ++ {0x13086, 0x6}, ++ {0x13087, 0x1}, ++ {0x30090, 0x4}, ++ {0x30091, 0x3}, ++ {0x30092, 0x6}, ++ {0x30093, 0x0}, ++ {0x30094, 0x5}, ++ {0x30095, 0x1}, ++ {0x30096, 0x2}, ++ {0x31090, 0x1}, ++ {0x31091, 0x3}, ++ {0x31092, 0x4}, ++ {0x31093, 0x6}, ++ {0x31094, 0x2}, ++ {0x31095, 0x0}, ++ {0x31096, 0x5}, ++ {0x20060, 0x2}, ++ {0x200a5, 0x1}, ++ {0xd0036, 0x0}, ++ {0x200bd, 0xff}, ++ {0x20300, 0x808}, ++ {0x20303, 0x9}, ++ {0x20302, 0x26}, ++ {0x20328, 0x0}, ++ {0x20301, 0x3}, ++ {0x2030b, 0x0}, ++ {0x300a7, 0x0}, ++ {0x310a7, 0x0}, ++ {0x300ae, 0x80}, ++ {0x300ad, 0x80}, ++ {0x300ac, 0x80}, ++ {0x310ae, 0x80}, ++ {0x310ad, 0x80}, ++ {0x310ac, 0x80}, ++ {0xc0086, 0x0}, ++ {0x100a3, 0x833}, ++ {0x110a3, 0x833}, ++ {0x120a3, 0x833}, ++ {0x130a3, 0x833}, ++ {0xc00f1, 0x6000}, ++ {0xc00f2, 0xa9}, ++ {0xc00f3, 0x8000}, ++ {0xc00f4, 0x5}, ++ {0xc00f5, 0x4000}, ++ {0xc00f6, 0x2}, ++ {0xc00f7, 0xf000}, ++ {0xc00f9, 0x6000}, ++ {0xc00fa, 0xa9}, ++ {0xc00fb, 0x8000}, ++ {0xc00fd, 0x4000}, ++ {0xc00ff, 0xf000}, ++ {0x908ff, 0xf}, ++ {0x10093, 0x0}, ++ {0x11093, 0x0}, ++ {0x12093, 0x0}, ++ {0x13093, 0x0}, ++ {0x20051, 0x3}, ++}; ++ ++/* PHY trained csr */ ++static struct ddrphy_cfg_param ddr_ddrphy_trained_csr[] = { ++ {0x200a5, 0x0}, ++ {0xd0036, 0x0}, ++ {0x200bd, 0x0}, ++ {0x20300, 0x0}, ++ {0x20303, 0x0}, ++ {0x20302, 0x0}, ++ {0x20328, 0x0}, ++ {0x20301, 0x0}, ++ {0x2030b, 0x0}, ++ {0x300a7, 0x0}, ++ {0x310a7, 0x0}, ++ {0x300ae, 0x0}, ++ {0x300ad, 0x0}, ++ {0x300ac, 0x0}, ++ {0x310ae, 0x0}, ++ {0x310ad, 0x0}, ++ {0x310ac, 0x0}, ++ {0xc0086, 0x0}, ++ {0x100a3, 0x0}, ++ {0x110a3, 0x0}, ++ {0x120a3, 0x0}, ++ {0x130a3, 0x0}, ++ {0xc00f1, 0x0}, ++ {0xc00f2, 0x0}, ++ {0xc00f3, 0x0}, ++ {0xc00f4, 0x0}, ++ {0xc00f5, 0x0}, ++ {0xc00f6, 0x0}, ++ {0xc00f7, 0x0}, ++ {0xc00f9, 0x0}, ++ {0xc00fa, 0x0}, ++ {0xc00fb, 0x0}, ++ {0xc00fd, 0x0}, ++ {0xc00ff, 0x0}, ++ {0x908ff, 0x0}, ++ {0x10093, 0x0}, ++ {0x11093, 0x0}, ++ {0x12093, 0x0}, ++ {0x13093, 0x0}, ++ {0x20051, 0x0}, ++ {0x90802, 0x0}, ++ {0x20002, 0x0}, ++ {0x20000, 0x0}, ++ {0x90801, 0x0}, ++ {0x90809, 0x0}, ++ {0x1005e, 0x0}, ++ {0x10060, 0x0}, ++ {0x10062, 0x0}, ++ {0x10064, 0x0}, ++ {0x1005f, 0x0}, ++ {0x10061, 0x0}, ++ {0x10063, 0x0}, ++ {0x10065, 0x0}, ++ {0x1105e, 0x0}, ++ {0x11060, 0x0}, ++ {0x11062, 0x0}, ++ {0x11064, 0x0}, ++ {0x1105f, 0x0}, ++ {0x11061, 0x0}, ++ {0x11063, 0x0}, ++ {0x11065, 0x0}, ++ {0x1205e, 0x0}, ++ {0x12060, 0x0}, ++ {0x12062, 0x0}, ++ {0x12064, 0x0}, ++ {0x1205f, 0x0}, ++ {0x12061, 0x0}, ++ {0x12063, 0x0}, ++ {0x12065, 0x0}, ++ {0x1305e, 0x0}, ++ {0x13060, 0x0}, ++ {0x13062, 0x0}, ++ {0x13064, 0x0}, ++ {0x1305f, 0x0}, ++ {0x13061, 0x0}, ++ {0x13063, 0x0}, ++ {0x13065, 0x0}, ++ {0x10005, 0x0}, ++ {0x1000b, 0x0}, ++ {0x11005, 0x0}, ++ {0x1100b, 0x0}, ++ {0x12005, 0x0}, ++ {0x1200b, 0x0}, ++ {0x13005, 0x0}, ++ {0x1300b, 0x0}, ++ {0x20007, 0x0}, ++ {0x20013, 0x0}, ++ {0x30038, 0x0}, ++ {0x30039, 0x0}, ++ {0x3003a, 0x0}, ++ {0x31038, 0x0}, ++ {0x31039, 0x0}, ++ {0x3103a, 0x0}, ++ {0x10038, 0x0}, ++ {0x1003a, 0x0}, ++ {0x11038, 0x0}, ++ {0x1103a, 0x0}, ++ {0x12038, 0x0}, ++ {0x1203a, 0x0}, ++ {0x13038, 0x0}, ++ {0x1303a, 0x0}, ++ {0x1003b, 0x0}, ++ {0x1103b, 0x0}, ++ {0x1203b, 0x0}, ++ {0x1303b, 0x0}, ++ {0x10009, 0x0}, ++ {0x10037, 0x0}, ++ {0x11009, 0x0}, ++ {0x11037, 0x0}, ++ {0x12009, 0x0}, ++ {0x12037, 0x0}, ++ {0x13009, 0x0}, ++ {0x13037, 0x0}, ++ {0x10004, 0x0}, ++ {0x10003, 0x0}, ++ {0x11004, 0x0}, ++ {0x11003, 0x0}, ++ {0x12004, 0x0}, ++ {0x12003, 0x0}, ++ {0x13004, 0x0}, ++ {0x13003, 0x0}, ++ {0x20004, 0x0}, ++ {0x30050, 0x0}, ++ {0x30051, 0x0}, ++ {0x30052, 0x0}, ++ {0x30053, 0x0}, ++ {0x31050, 0x0}, ++ {0x31051, 0x0}, ++ {0x31052, 0x0}, ++ {0x31053, 0x0}, ++ {0x1004e, 0x0}, ++ {0x1004f, 0x0}, ++ {0x10050, 0x0}, ++ {0x10051, 0x0}, ++ {0x1014e, 0x0}, ++ {0x1014f, 0x0}, ++ {0x10150, 0x0}, ++ {0x10151, 0x0}, ++ {0x1024e, 0x0}, ++ {0x1024f, 0x0}, ++ {0x10250, 0x0}, ++ {0x10251, 0x0}, ++ {0x1034e, 0x0}, ++ {0x1034f, 0x0}, ++ {0x10350, 0x0}, ++ {0x10351, 0x0}, ++ {0x1044e, 0x0}, ++ {0x1044f, 0x0}, ++ {0x10450, 0x0}, ++ {0x10451, 0x0}, ++ {0x1054e, 0x0}, ++ {0x1054f, 0x0}, ++ {0x10550, 0x0}, ++ {0x10551, 0x0}, ++ {0x1064e, 0x0}, ++ {0x1064f, 0x0}, ++ {0x10650, 0x0}, ++ {0x10651, 0x0}, ++ {0x1074e, 0x0}, ++ {0x1074f, 0x0}, ++ {0x10750, 0x0}, ++ {0x10751, 0x0}, ++ {0x1084e, 0x0}, ++ {0x1084f, 0x0}, ++ {0x10850, 0x0}, ++ {0x10851, 0x0}, ++ {0x1104e, 0x0}, ++ {0x1104f, 0x0}, ++ {0x11050, 0x0}, ++ {0x11051, 0x0}, ++ {0x1114e, 0x0}, ++ {0x1114f, 0x0}, ++ {0x11150, 0x0}, ++ {0x11151, 0x0}, ++ {0x1124e, 0x0}, ++ {0x1124f, 0x0}, ++ {0x11250, 0x0}, ++ {0x11251, 0x0}, ++ {0x1134e, 0x0}, ++ {0x1134f, 0x0}, ++ {0x11350, 0x0}, ++ {0x11351, 0x0}, ++ {0x1144e, 0x0}, ++ {0x1144f, 0x0}, ++ {0x11450, 0x0}, ++ {0x11451, 0x0}, ++ {0x1154e, 0x0}, ++ {0x1154f, 0x0}, ++ {0x11550, 0x0}, ++ {0x11551, 0x0}, ++ {0x1164e, 0x0}, ++ {0x1164f, 0x0}, ++ {0x11650, 0x0}, ++ {0x11651, 0x0}, ++ {0x1174e, 0x0}, ++ {0x1174f, 0x0}, ++ {0x11750, 0x0}, ++ {0x11751, 0x0}, ++ {0x1184e, 0x0}, ++ {0x1184f, 0x0}, ++ {0x11850, 0x0}, ++ {0x11851, 0x0}, ++ {0x1204e, 0x0}, ++ {0x1204f, 0x0}, ++ {0x12050, 0x0}, ++ {0x12051, 0x0}, ++ {0x1214e, 0x0}, ++ {0x1214f, 0x0}, ++ {0x12150, 0x0}, ++ {0x12151, 0x0}, ++ {0x1224e, 0x0}, ++ {0x1224f, 0x0}, ++ {0x12250, 0x0}, ++ {0x12251, 0x0}, ++ {0x1234e, 0x0}, ++ {0x1234f, 0x0}, ++ {0x12350, 0x0}, ++ {0x12351, 0x0}, ++ {0x1244e, 0x0}, ++ {0x1244f, 0x0}, ++ {0x12450, 0x0}, ++ {0x12451, 0x0}, ++ {0x1254e, 0x0}, ++ {0x1254f, 0x0}, ++ {0x12550, 0x0}, ++ {0x12551, 0x0}, ++ {0x1264e, 0x0}, ++ {0x1264f, 0x0}, ++ {0x12650, 0x0}, ++ {0x12651, 0x0}, ++ {0x1274e, 0x0}, ++ {0x1274f, 0x0}, ++ {0x12750, 0x0}, ++ {0x12751, 0x0}, ++ {0x1284e, 0x0}, ++ {0x1284f, 0x0}, ++ {0x12850, 0x0}, ++ {0x12851, 0x0}, ++ {0x1304e, 0x0}, ++ {0x1304f, 0x0}, ++ {0x13050, 0x0}, ++ {0x13051, 0x0}, ++ {0x1314e, 0x0}, ++ {0x1314f, 0x0}, ++ {0x13150, 0x0}, ++ {0x13151, 0x0}, ++ {0x1324e, 0x0}, ++ {0x1324f, 0x0}, ++ {0x13250, 0x0}, ++ {0x13251, 0x0}, ++ {0x1334e, 0x0}, ++ {0x1334f, 0x0}, ++ {0x13350, 0x0}, ++ {0x13351, 0x0}, ++ {0x1344e, 0x0}, ++ {0x1344f, 0x0}, ++ {0x13450, 0x0}, ++ {0x13451, 0x0}, ++ {0x1354e, 0x0}, ++ {0x1354f, 0x0}, ++ {0x13550, 0x0}, ++ {0x13551, 0x0}, ++ {0x1364e, 0x0}, ++ {0x1364f, 0x0}, ++ {0x13650, 0x0}, ++ {0x13651, 0x0}, ++ {0x1374e, 0x0}, ++ {0x1374f, 0x0}, ++ {0x13750, 0x0}, ++ {0x13751, 0x0}, ++ {0x1384e, 0x0}, ++ {0x1384f, 0x0}, ++ {0x13850, 0x0}, ++ {0x13851, 0x0}, ++ {0x30030, 0x0}, ++ {0x30031, 0x0}, ++ {0x30035, 0x0}, ++ {0x31030, 0x0}, ++ {0x31031, 0x0}, ++ {0x31035, 0x0}, ++ {0x10030, 0x0}, ++ {0x10035, 0x0}, ++ {0x10036, 0x0}, ++ {0x11030, 0x0}, ++ {0x11035, 0x0}, ++ {0x11036, 0x0}, ++ {0x12030, 0x0}, ++ {0x12035, 0x0}, ++ {0x12036, 0x0}, ++ {0x13030, 0x0}, ++ {0x13035, 0x0}, ++ {0x13036, 0x0}, ++ {0x3003c, 0x0}, ++ {0x3103c, 0x0}, ++ {0x1003c, 0x0}, ++ {0x1003d, 0x0}, ++ {0x1003e, 0x0}, ++ {0x1103c, 0x0}, ++ {0x1103d, 0x0}, ++ {0x1103e, 0x0}, ++ {0x1203c, 0x0}, ++ {0x1203d, 0x0}, ++ {0x1203e, 0x0}, ++ {0x1303c, 0x0}, ++ {0x1303d, 0x0}, ++ {0x1303e, 0x0}, ++ {0x20003, 0x0}, ++ {0x10006, 0x0}, ++ {0x11006, 0x0}, ++ {0x12006, 0x0}, ++ {0x13006, 0x0}, ++ {0x20001, 0x0}, ++ {0x20009, 0x0}, ++ {0x20008, 0x0}, ++ {0x200d9, 0x0}, ++ {0x30eef, 0x0}, ++ {0x31eef, 0x0}, ++ {0x20014, 0x0}, ++ {0x9080a, 0x0}, ++ {0x10040, 0x0}, ++ {0x10042, 0x0}, ++ {0x9080d, 0x0}, ++ {0x10043, 0x0}, ++ {0x10044, 0x0}, ++ {0x10045, 0x0}, ++ {0x11040, 0x0}, ++ {0x11042, 0x0}, ++ {0x11043, 0x0}, ++ {0x11044, 0x0}, ++ {0x11045, 0x0}, ++ {0x12040, 0x0}, ++ {0x12042, 0x0}, ++ {0x12043, 0x0}, ++ {0x12044, 0x0}, ++ {0x12045, 0x0}, ++ {0x13040, 0x0}, ++ {0x13042, 0x0}, ++ {0x13043, 0x0}, ++ {0x13044, 0x0}, ++ {0x13045, 0x0}, ++ {0x30040, 0x0}, ++ {0x30041, 0x0}, ++ {0x30042, 0x0}, ++ {0x30043, 0x0}, ++ {0x30330, 0x0}, ++ {0x31040, 0x0}, ++ {0x31041, 0x0}, ++ {0x31042, 0x0}, ++ {0x31043, 0x0}, ++ {0x31330, 0x0}, ++ {0x20331, 0x0}, ++ {0x10048, 0x0}, ++ {0x1004a, 0x0}, ++ {0x1004b, 0x0}, ++ {0x1004c, 0x0}, ++ {0x1004d, 0x0}, ++ {0x11048, 0x0}, ++ {0x1104a, 0x0}, ++ {0x1104b, 0x0}, ++ {0x1104c, 0x0}, ++ {0x1104d, 0x0}, ++ {0x12048, 0x0}, ++ {0x1204a, 0x0}, ++ {0x1204b, 0x0}, ++ {0x1204c, 0x0}, ++ {0x1204d, 0x0}, ++ {0x13048, 0x0}, ++ {0x1304a, 0x0}, ++ {0x1304b, 0x0}, ++ {0x1304c, 0x0}, ++ {0x1304d, 0x0}, ++ {0x30048, 0x0}, ++ {0x30049, 0x0}, ++ {0x3004a, 0x0}, ++ {0x3004b, 0x0}, ++ {0x31048, 0x0}, ++ {0x31049, 0x0}, ++ {0x3104a, 0x0}, ++ {0x3104b, 0x0}, ++ {0x30033, 0x0}, ++ {0x30034, 0x0}, ++ {0x3002e, 0x0}, ++ {0x31033, 0x0}, ++ {0x31034, 0x0}, ++ {0x3102e, 0x0}, ++ {0x10033, 0x0}, ++ {0x1002e, 0x0}, ++ {0x1002f, 0x0}, ++ {0x11033, 0x0}, ++ {0x1102e, 0x0}, ++ {0x1102f, 0x0}, ++ {0x12033, 0x0}, ++ {0x1202e, 0x0}, ++ {0x1202f, 0x0}, ++ {0x13033, 0x0}, ++ {0x1302e, 0x0}, ++ {0x1302f, 0x0}, ++ {0x90806, 0x0}, ++ {0x100e8, 0x0}, ++ {0x100e9, 0x0}, ++ {0x110e8, 0x0}, ++ {0x110e9, 0x0}, ++ {0x120e8, 0x0}, ++ {0x120e9, 0x0}, ++ {0x130e8, 0x0}, ++ {0x130e9, 0x0}, ++ {0x10001, 0x0}, ++ {0x11001, 0x0}, ++ {0x12001, 0x0}, ++ {0x13001, 0x0}, ++ {0x20012, 0x0}, ++ {0x20017, 0x0}, ++ {0x2000a, 0x0}, ++ {0x20186, 0x0}, ++ {0x20187, 0x0}, ++ {0x20010, 0x0}, ++ {0x20011, 0x0}, ++ {0x9080b, 0x0}, ++ {0x9080c, 0x0}, ++ {0x100a5, 0x0}, ++ {0x110a5, 0x0}, ++ {0x120a5, 0x0}, ++ {0x130a5, 0x0}, ++ {0x10014, 0x0}, ++ {0x11014, 0x0}, ++ {0x12014, 0x0}, ++ {0x13014, 0x0}, ++ {0x20035, 0x0}, ++ {0x20036, 0x0}, ++ {0x20037, 0x0}, ++ {0x20038, 0x0}, ++ {0x20039, 0x0}, ++ {0x2003a, 0x0}, ++ {0x2003b, 0x0}, ++ {0x2003c, 0x0}, ++ {0x2003d, 0x0}, ++ {0x2003e, 0x0}, ++ {0x2003f, 0x0}, ++ {0x20040, 0x0}, ++ {0x2002c, 0x0}, ++ {0x2002d, 0x0}, ++ {0x20030, 0x0}, ++ {0x2002e, 0x0}, ++ {0x2002f, 0x0}, ++ {0x2000c, 0x0}, ++ {0x2001b, 0x0}, ++ {0x10007, 0x0}, ++ {0x11007, 0x0}, ++ {0x12007, 0x0}, ++ {0x13007, 0x0}, ++ {0x908f0, 0x0}, ++ {0x908f1, 0x0}, ++ {0x908f2, 0x0}, ++ {0x908f3, 0x0}, ++ {0x908f4, 0x0}, ++ {0x908f5, 0x0}, ++ {0x908f6, 0x0}, ++ {0x908f7, 0x0}, ++ {0x41008, 0x0}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0x0}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x0}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0x0}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0x0}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x0}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0x0}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0x0}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x0}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0x0}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0x0}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x0}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0x0}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0x0}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x0}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0x0}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0x0}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x0}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0x0}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0x0}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x0}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x0}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x0}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x0}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x0}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x0}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0x0}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0x0}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x0}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0x0}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0x0}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x0}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0x0}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0x0}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0x410b8, 0x0}, ++ {0x410b9, 0x0}, ++ {0x410ba, 0x0}, ++ {0x410bb, 0x0}, ++ {0x410bc, 0x0}, ++ {0x410bd, 0x0}, ++ {0x410be, 0x0}, ++ {0x410bf, 0x0}, ++ {0x410c0, 0x0}, ++ {0x410c1, 0x0}, ++ {0x410c2, 0x0}, ++ {0x410c3, 0x0}, ++ {0x410c4, 0x0}, ++ {0x410c5, 0x0}, ++ {0x410c6, 0x0}, ++ {0x410c7, 0x0}, ++ {0x410c8, 0x0}, ++ {0x410c9, 0x0}, ++ {0x410ca, 0x0}, ++ {0x410cb, 0x0}, ++ {0x410cc, 0x0}, ++ {0x410cd, 0x0}, ++ {0x410ce, 0x0}, ++ {0x410cf, 0x0}, ++ {0x410d0, 0x0}, ++ {0x410d1, 0x0}, ++ {0x410d2, 0x0}, ++ {0x410d3, 0x0}, ++ {0x410d4, 0x0}, ++ {0x410d5, 0x0}, ++ {0x410d6, 0x0}, ++ {0x410d7, 0x0}, ++ {0x410d8, 0x0}, ++ {0x410d9, 0x0}, ++ {0x410da, 0x0}, ++ {0x410db, 0x0}, ++ {0x410dc, 0x0}, ++ {0x410dd, 0x0}, ++ {0x410de, 0x0}, ++ {0x410df, 0x0}, ++ {0x410e0, 0x0}, ++ {0x410e1, 0x0}, ++ {0x410e2, 0x0}, ++ {0x410e3, 0x0}, ++ {0x410e4, 0x0}, ++ {0x410e5, 0x0}, ++ {0x410e6, 0x0}, ++ {0x410e7, 0x0}, ++ {0x410e8, 0x0}, ++ {0x410e9, 0x0}, ++ {0x410ea, 0x0}, ++ {0x410eb, 0x0}, ++ {0x410ec, 0x0}, ++ {0x410ed, 0x0}, ++ {0x410ee, 0x0}, ++ {0x410ef, 0x0}, ++ {0x410f0, 0x0}, ++ {0x410f1, 0x0}, ++ {0x410f2, 0x0}, ++ {0x410f3, 0x0}, ++ {0x410f4, 0x0}, ++ {0x410f5, 0x0}, ++ {0x410f6, 0x0}, ++ {0x410f7, 0x0}, ++ {0x410f8, 0x0}, ++ {0x410f9, 0x0}, ++ {0x410fa, 0x0}, ++ {0x410fb, 0x0}, ++ {0x410fc, 0x0}, ++ {0x410fd, 0x0}, ++ {0x410fe, 0x0}, ++ {0x410ff, 0x0}, ++ {0x41100, 0x0}, ++ {0x41101, 0x0}, ++ {0x41102, 0x0}, ++ {0x41103, 0x0}, ++ {0x41104, 0x0}, ++ {0x41105, 0x0}, ++ {0x41106, 0x0}, ++ {0x41107, 0x0}, ++ {0x41108, 0x0}, ++ {0x41109, 0x0}, ++ {0x4110a, 0x0}, ++ {0x4110b, 0x0}, ++ {0x4110c, 0x0}, ++ {0x4110d, 0x0}, ++ {0x4110e, 0x0}, ++ {0x4110f, 0x0}, ++ {0x41110, 0x0}, ++ {0x41111, 0x0}, ++ {0x41112, 0x0}, ++ {0x41113, 0x0}, ++ {0x41114, 0x0}, ++ {0x41115, 0x0}, ++ {0x41116, 0x0}, ++ {0x41117, 0x0}, ++ {0x41118, 0x0}, ++ {0x41119, 0x0}, ++ {0x4111a, 0x0}, ++ {0x4111b, 0x0}, ++ {0x4111c, 0x0}, ++ {0x4111d, 0x0}, ++ {0x4111e, 0x0}, ++ {0x4111f, 0x0}, ++ {0x41120, 0x0}, ++ {0x41121, 0x0}, ++ {0x41122, 0x0}, ++ {0x41123, 0x0}, ++ {0x41124, 0x0}, ++ {0x41125, 0x0}, ++ {0x41126, 0x0}, ++ {0x41127, 0x0}, ++ {0x41128, 0x0}, ++ {0x41129, 0x0}, ++ {0x4112a, 0x0}, ++ {0x4112b, 0x0}, ++ {0x4112c, 0x0}, ++ {0x4112d, 0x0}, ++ {0x4112e, 0x0}, ++ {0x4112f, 0x0}, ++ {0x41130, 0x0}, ++ {0x41131, 0x0}, ++ {0x41132, 0x0}, ++ {0x41133, 0x0}, ++ {0x41134, 0x0}, ++ {0x41135, 0x0}, ++ {0x41136, 0x0}, ++ {0x41137, 0x0}, ++ {0x41138, 0x0}, ++ {0x41139, 0x0}, ++ {0x4113a, 0x0}, ++ {0x4113b, 0x0}, ++ {0x4113c, 0x0}, ++ {0x4113d, 0x0}, ++ {0x4113e, 0x0}, ++ {0x4113f, 0x0}, ++ {0x41140, 0x0}, ++ {0x41141, 0x0}, ++ {0x41142, 0x0}, ++ {0x41143, 0x0}, ++ {0x41144, 0x0}, ++ {0x41145, 0x0}, ++ {0x41146, 0x0}, ++ {0x41147, 0x0}, ++ {0x41148, 0x0}, ++ {0x41149, 0x0}, ++ {0x4114a, 0x0}, ++ {0x4114b, 0x0}, ++ {0x4114c, 0x0}, ++ {0x4114d, 0x0}, ++ {0x4114e, 0x0}, ++ {0x4114f, 0x0}, ++ {0x41150, 0x0}, ++ {0x41151, 0x0}, ++ {0x41152, 0x0}, ++ {0x41153, 0x0}, ++ {0x41154, 0x0}, ++ {0x41155, 0x0}, ++ {0x41156, 0x0}, ++ {0x41157, 0x0}, ++ {0x41158, 0x0}, ++ {0x41159, 0x0}, ++ {0x4115a, 0x0}, ++ {0x4115b, 0x0}, ++ {0x4115c, 0x0}, ++ {0x4115d, 0x0}, ++ {0x4115e, 0x0}, ++ {0x4115f, 0x0}, ++ {0x41160, 0x0}, ++ {0x41161, 0x0}, ++ {0x41162, 0x0}, ++ {0x41163, 0x0}, ++ {0x41164, 0x0}, ++ {0x41165, 0x0}, ++ {0x41166, 0x0}, ++ {0x41167, 0x0}, ++ {0x41168, 0x0}, ++ {0x41169, 0x0}, ++ {0x4116a, 0x0}, ++ {0x4116b, 0x0}, ++ {0x4116c, 0x0}, ++ {0x4116d, 0x0}, ++ {0x4116e, 0x0}, ++ {0x4116f, 0x0}, ++ {0x41170, 0x0}, ++ {0x41171, 0x0}, ++ {0x41172, 0x0}, ++ {0x41173, 0x0}, ++ {0x41174, 0x0}, ++ {0x41175, 0x0}, ++ {0x41176, 0x0}, ++ {0x41177, 0x0}, ++ {0x41178, 0x0}, ++ {0x41179, 0x0}, ++ {0x4117a, 0x0}, ++ {0x4117b, 0x0}, ++ {0x4117c, 0x0}, ++ {0x4117d, 0x0}, ++ {0x4117e, 0x0}, ++ {0x4117f, 0x0}, ++ {0x41180, 0x0}, ++ {0x41181, 0x0}, ++ {0x41182, 0x0}, ++ {0x41183, 0x0}, ++ {0x41184, 0x0}, ++ {0x41185, 0x0}, ++ {0x41186, 0x0}, ++ {0x41187, 0x0}, ++ {0x41188, 0x0}, ++ {0x41189, 0x0}, ++ {0x4118a, 0x0}, ++ {0x4118b, 0x0}, ++ {0x4118c, 0x0}, ++ {0x4118d, 0x0}, ++ {0x4118e, 0x0}, ++ {0x4118f, 0x0}, ++ {0x41190, 0x0}, ++ {0x41191, 0x0}, ++ {0x41192, 0x0}, ++ {0x41193, 0x0}, ++ {0x41194, 0x0}, ++ {0x41195, 0x0}, ++ {0x41196, 0x0}, ++ {0x41197, 0x0}, ++ {0x41198, 0x0}, ++ {0x41199, 0x0}, ++ {0x4119a, 0x0}, ++ {0x4119b, 0x0}, ++ {0x4119c, 0x0}, ++ {0x4119d, 0x0}, ++ {0x4119e, 0x0}, ++ {0x4119f, 0x0}, ++ {0x411a0, 0x0}, ++ {0x411a1, 0x0}, ++ {0x411a2, 0x0}, ++ {0x411a3, 0x0}, ++ {0x411a4, 0x0}, ++ {0x411a5, 0x0}, ++ {0x411a6, 0x0}, ++ {0x411a7, 0x0}, ++ {0x411a8, 0x0}, ++ {0x411a9, 0x0}, ++ {0x411aa, 0x0}, ++ {0x411ab, 0x0}, ++ {0x411ac, 0x0}, ++ {0x411ad, 0x0}, ++ {0x411ae, 0x0}, ++ {0x411af, 0x0}, ++ {0x411b0, 0x0}, ++ {0x411b1, 0x0}, ++ {0x411b2, 0x0}, ++ {0x411b3, 0x0}, ++ {0x411b4, 0x0}, ++ {0x411b5, 0x0}, ++ {0x411b6, 0x0}, ++ {0x411b7, 0x0}, ++ {0x411b8, 0x0}, ++ {0x411b9, 0x0}, ++ {0x411ba, 0x0}, ++ {0x411bb, 0x0}, ++ {0x411bc, 0x0}, ++ {0x411bd, 0x0}, ++ {0x411be, 0x0}, ++ {0x411bf, 0x0}, ++ {0x411c0, 0x0}, ++ {0x411c1, 0x0}, ++ {0x411c2, 0x0}, ++ {0x411c3, 0x0}, ++ {0x411c4, 0x0}, ++ {0x411c5, 0x0}, ++ {0x411c6, 0x0}, ++ {0x411c7, 0x0}, ++ {0x20015, 0x0}, ++ {0x2004a, 0x0}, ++ {0x2004b, 0x0}, ++ {0x2004c, 0x0}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x0}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20041, 0x0}, ++ {0x20045, 0x0}, ++ {0x10057, 0x0}, ++ {0x11057, 0x0}, ++ {0x12057, 0x0}, ++ {0x13057, 0x0}, ++ {0x1000f, 0x0}, ++ {0x1100f, 0x0}, ++ {0x1200f, 0x0}, ++ {0x1300f, 0x0}, ++ {0x90803, 0x0}, ++ {0x90804, 0x0}, ++ {0x90805, 0x0}, ++ {0x90903, 0x0}, ++ {0x9090b, 0x0}, ++ {0x90811, 0x0}, ++ {0x90812, 0x0}, ++ {0x20072, 0x0}, ++ {0x9080e, 0x0}, ++ {0x20073, 0x0}, ++ {0x9080f, 0x0}, ++ {0x41000, 0x0}, ++ {0x41001, 0x0}, ++ {0x41002, 0x0}, ++ {0x41003, 0x0}, ++ {0x41004, 0x0}, ++ {0x41005, 0x0}, ++ {0x41006, 0x0}, ++ {0x41007, 0x0}, ++ {0x41388, 0x0}, ++ {0x41389, 0x0}, ++ {0x4138a, 0x0}, ++ {0x4138b, 0x0}, ++ {0x4138c, 0x0}, ++ {0x4138d, 0x0}, ++ {0x4138e, 0x0}, ++ {0x4138f, 0x0}, ++ {0x41390, 0x0}, ++ {0x41391, 0x0}, ++ {0x41392, 0x0}, ++ {0x41393, 0x0}, ++ {0x41394, 0x0}, ++ {0x41395, 0x0}, ++ {0x41396, 0x0}, ++ {0x41397, 0x0}, ++ {0x41398, 0x0}, ++ {0x41399, 0x0}, ++ {0x4139a, 0x0}, ++ {0x4139b, 0x0}, ++ {0x4139c, 0x0}, ++ {0x4139d, 0x0}, ++ {0x4139e, 0x0}, ++ {0x4139f, 0x0}, ++ {0x413a0, 0x0}, ++ {0x413a1, 0x0}, ++ {0x413a2, 0x0}, ++ {0x413a3, 0x0}, ++ {0x413a4, 0x0}, ++ {0x413a5, 0x0}, ++ {0x413a6, 0x0}, ++ {0x413a7, 0x0}, ++ {0x413a8, 0x0}, ++ {0x413a9, 0x0}, ++ {0x413aa, 0x0}, ++ {0x413ab, 0x0}, ++ {0x413ac, 0x0}, ++ {0x413ad, 0x0}, ++ {0x413ae, 0x0}, ++ {0x413af, 0x0}, ++ {0x413b0, 0x0}, ++ {0x413b1, 0x0}, ++ {0x413b2, 0x0}, ++ {0x413b3, 0x0}, ++ {0x413b4, 0x0}, ++ {0x413b5, 0x0}, ++ {0x413b6, 0x0}, ++ {0x413b7, 0x0}, ++ {0x413b8, 0x0}, ++ {0x413b9, 0x0}, ++ {0x413ba, 0x0}, ++ {0x413bb, 0x0}, ++ {0x413bc, 0x0}, ++ {0x413bd, 0x0}, ++ {0x413be, 0x0}, ++ {0x413bf, 0x0}, ++ {0x413c0, 0x0}, ++ {0x413c1, 0x0}, ++ {0x413c2, 0x0}, ++ {0x413c3, 0x0}, ++ {0x413c4, 0x0}, ++ {0x413c5, 0x0}, ++ {0x413c6, 0x0}, ++ {0x413c7, 0x0}, ++ {0x413c8, 0x0}, ++ {0x413c9, 0x0}, ++ {0x413ca, 0x0}, ++ {0x413cb, 0x0}, ++ {0x413cc, 0x0}, ++ {0x413cd, 0x0}, ++ {0x413ce, 0x0}, ++ {0x413cf, 0x0}, ++ {0x413d0, 0x0}, ++ {0x413d1, 0x0}, ++ {0x413d2, 0x0}, ++ {0x413d3, 0x0}, ++ {0x413d4, 0x0}, ++ {0x413d5, 0x0}, ++ {0x413d6, 0x0}, ++ {0x413d7, 0x0}, ++ {0x413d8, 0x0}, ++ {0x413d9, 0x0}, ++ {0x413da, 0x0}, ++ {0x413db, 0x0}, ++ {0x413dc, 0x0}, ++ {0x413dd, 0x0}, ++ {0x413de, 0x0}, ++ {0x413df, 0x0}, ++ {0x413e0, 0x0}, ++ {0x413e1, 0x0}, ++ {0x413e2, 0x0}, ++ {0x413e3, 0x0}, ++ {0x413e4, 0x0}, ++ {0x413e5, 0x0}, ++ {0x413e6, 0x0}, ++ {0x413e7, 0x0}, ++ {0x413e8, 0x0}, ++ {0x413e9, 0x0}, ++ {0x413ea, 0x0}, ++ {0x413eb, 0x0}, ++ {0x413ec, 0x0}, ++ {0x413ed, 0x0}, ++ {0x413ee, 0x0}, ++ {0x413ef, 0x0}, ++ {0x413f0, 0x0}, ++ {0x413f1, 0x0}, ++ {0x413f2, 0x0}, ++ {0x413f3, 0x0}, ++ {0x413f4, 0x0}, ++ {0x413f5, 0x0}, ++ {0x413f6, 0x0}, ++ {0x413f7, 0x0}, ++ {0x413f8, 0x0}, ++ {0x413f9, 0x0}, ++ {0x413fa, 0x0}, ++ {0x413fb, 0x0}, ++ {0x413fc, 0x0}, ++ {0x413fd, 0x0}, ++ {0x413fe, 0x0}, ++ {0x413ff, 0x0}, ++ {0x41400, 0x0}, ++ {0x41401, 0x0}, ++ {0x41402, 0x0}, ++ {0x41403, 0x0}, ++ {0x41404, 0x0}, ++ {0x41405, 0x0}, ++ {0x41406, 0x0}, ++ {0x41407, 0x0}, ++ {0x41408, 0x0}, ++ {0x41409, 0x0}, ++ {0x4140a, 0x0}, ++ {0x4140b, 0x0}, ++ {0x4140c, 0x0}, ++ {0x4140d, 0x0}, ++ {0x4140e, 0x0}, ++ {0x4140f, 0x0}, ++ {0x41410, 0x0}, ++ {0x41411, 0x0}, ++ {0x41412, 0x0}, ++ {0x41413, 0x0}, ++ {0x41414, 0x0}, ++ {0x41415, 0x0}, ++ {0x41416, 0x0}, ++ {0x41417, 0x0}, ++ {0x41418, 0x0}, ++ {0x41419, 0x0}, ++ {0x4141a, 0x0}, ++ {0x4141b, 0x0}, ++ {0x4141c, 0x0}, ++ {0x4141d, 0x0}, ++ {0x4141e, 0x0}, ++ {0x4141f, 0x0}, ++ {0x41420, 0x0}, ++ {0x41421, 0x0}, ++ {0x41422, 0x0}, ++ {0x41423, 0x0}, ++ {0x41424, 0x0}, ++ {0x41425, 0x0}, ++ {0x41426, 0x0}, ++ {0x41427, 0x0}, ++ {0x41428, 0x0}, ++ {0x41429, 0x0}, ++ {0x4142a, 0x0}, ++ {0x4142b, 0x0}, ++ {0x4142c, 0x0}, ++ {0x4142d, 0x0}, ++ {0x4142e, 0x0}, ++ {0x4142f, 0x0}, ++ {0x41430, 0x0}, ++ {0x41431, 0x0}, ++ {0x41432, 0x0}, ++ {0x41433, 0x0}, ++ {0x41434, 0x0}, ++ {0x41435, 0x0}, ++ {0x41436, 0x0}, ++ {0x41437, 0x0}, ++ {0x41438, 0x0}, ++ {0x41439, 0x0}, ++ {0x4143a, 0x0}, ++ {0x4143b, 0x0}, ++ {0x4143c, 0x0}, ++ {0x4143d, 0x0}, ++ {0x4143e, 0x0}, ++ {0x4143f, 0x0}, ++ {0x41440, 0x0}, ++ {0x41441, 0x0}, ++ {0x41442, 0x0}, ++ {0x41443, 0x0}, ++ {0x41444, 0x0}, ++ {0x41445, 0x0}, ++ {0x41446, 0x0}, ++ {0x41447, 0x0}, ++ {0x41448, 0x0}, ++ {0x41449, 0x0}, ++ {0x4144a, 0x0}, ++ {0x4144b, 0x0}, ++ {0x4144c, 0x0}, ++ {0x4144d, 0x0}, ++ {0x4144e, 0x0}, ++ {0x4144f, 0x0}, ++ {0x41450, 0x0}, ++ {0x41451, 0x0}, ++ {0x41452, 0x0}, ++ {0x41453, 0x0}, ++ {0x41454, 0x0}, ++ {0x41455, 0x0}, ++ {0x41456, 0x0}, ++ {0x41457, 0x0}, ++ {0x41458, 0x0}, ++ {0x41459, 0x0}, ++ {0x4145a, 0x0}, ++ {0x4145b, 0x0}, ++ {0x4145c, 0x0}, ++ {0x4145d, 0x0}, ++ {0x4145e, 0x0}, ++ {0x4145f, 0x0}, ++ {0x41460, 0x0}, ++ {0x41461, 0x0}, ++ {0x41462, 0x0}, ++ {0x41463, 0x0}, ++ {0x41464, 0x0}, ++ {0x41465, 0x0}, ++ {0x41466, 0x0}, ++ {0x41467, 0x0}, ++ {0x41468, 0x0}, ++ {0x41469, 0x0}, ++ {0x4146a, 0x0}, ++ {0x4146b, 0x0}, ++ {0x4146c, 0x0}, ++ {0x4146d, 0x0}, ++ {0x4146e, 0x0}, ++ {0x4146f, 0x0}, ++ {0x41470, 0x0}, ++ {0x41471, 0x0}, ++ {0x41472, 0x0}, ++ {0x41473, 0x0}, ++ {0x41474, 0x0}, ++ {0x41475, 0x0}, ++ {0x41476, 0x0}, ++ {0x41477, 0x0}, ++ {0x41478, 0x0}, ++ {0x41479, 0x0}, ++ {0x4147a, 0x0}, ++ {0x4147b, 0x0}, ++ {0x4147c, 0x0}, ++ {0x4147d, 0x0}, ++ {0x4147e, 0x0}, ++ {0x4147f, 0x0}, ++ {0x41480, 0x0}, ++ {0x41481, 0x0}, ++ {0x41482, 0x0}, ++ {0x41483, 0x0}, ++ {0x41484, 0x0}, ++ {0x41485, 0x0}, ++ {0x41486, 0x0}, ++ {0x41487, 0x0}, ++ {0x41488, 0x0}, ++ {0x41489, 0x0}, ++ {0x4148a, 0x0}, ++ {0x4148b, 0x0}, ++ {0x4148c, 0x0}, ++ {0x4148d, 0x0}, ++ {0x4148e, 0x0}, ++ {0x4148f, 0x0}, ++ {0x41490, 0x0}, ++ {0x41491, 0x0}, ++ {0x41492, 0x0}, ++ {0x41493, 0x0}, ++ {0x41494, 0x0}, ++ {0x41495, 0x0}, ++ {0x41496, 0x0}, ++ {0x41497, 0x0}, ++ {0x41498, 0x0}, ++ {0x41499, 0x0}, ++ {0x4149a, 0x0}, ++ {0x4149b, 0x0}, ++ {0x4149c, 0x0}, ++ {0x4149d, 0x0}, ++ {0x4149e, 0x0}, ++ {0x4149f, 0x0}, ++ {0x414a0, 0x0}, ++ {0x414a1, 0x0}, ++ {0x414a2, 0x0}, ++ {0x414a3, 0x0}, ++ {0x414a4, 0x0}, ++ {0x414a5, 0x0}, ++ {0x414a6, 0x0}, ++ {0x414a7, 0x0}, ++ {0x414a8, 0x0}, ++ {0x414a9, 0x0}, ++ {0x414aa, 0x0}, ++ {0x414ab, 0x0}, ++ {0x414ac, 0x0}, ++ {0x414ad, 0x0}, ++ {0x414ae, 0x0}, ++ {0x414af, 0x0}, ++ {0x414b0, 0x0}, ++ {0x414b1, 0x0}, ++ {0x414b2, 0x0}, ++ {0x414b3, 0x0}, ++ {0x414b4, 0x0}, ++ {0x414b5, 0x0}, ++ {0x414b6, 0x0}, ++ {0x414b7, 0x0}, ++ {0x414b8, 0x0}, ++ {0x414b9, 0x0}, ++ {0x414ba, 0x0}, ++ {0x414bb, 0x0}, ++ {0x414bc, 0x0}, ++ {0x414bd, 0x0}, ++ {0x414be, 0x0}, ++ {0x414bf, 0x0}, ++ {0x414c0, 0x0}, ++ {0x414c1, 0x0}, ++ {0x414c2, 0x0}, ++ {0x414c3, 0x0}, ++ {0x414c4, 0x0}, ++ {0x414c5, 0x0}, ++ {0x414c6, 0x0}, ++ {0x414c7, 0x0}, ++ {0x414c8, 0x0}, ++ {0x414c9, 0x0}, ++ {0x414ca, 0x0}, ++ {0x414cb, 0x0}, ++ {0x414cc, 0x0}, ++ {0x414cd, 0x0}, ++ {0x414ce, 0x0}, ++ {0x414cf, 0x0}, ++ {0x414d0, 0x0}, ++ {0x414d1, 0x0}, ++ {0x414d2, 0x0}, ++ {0x414d3, 0x0}, ++ {0x414d4, 0x0}, ++ {0x414d5, 0x0}, ++ {0x414d6, 0x0}, ++ {0x414d7, 0x0}, ++ {0x414d8, 0x0}, ++ {0x414d9, 0x0}, ++ {0x414da, 0x0}, ++ {0x414db, 0x0}, ++ {0x414dc, 0x0}, ++ {0x414dd, 0x0}, ++ {0x414de, 0x0}, ++ {0x414df, 0x0}, ++ {0x414e0, 0x0}, ++ {0x414e1, 0x0}, ++ {0x414e2, 0x0}, ++ {0x414e3, 0x0}, ++ {0x414e4, 0x0}, ++ {0x414e5, 0x0}, ++ {0x414e6, 0x0}, ++ {0x414e7, 0x0}, ++ {0x414e8, 0x0}, ++ {0x414e9, 0x0}, ++ {0x414ea, 0x0}, ++ {0x414eb, 0x0}, ++ {0x414ec, 0x0}, ++ {0x414ed, 0x0}, ++ {0x414ee, 0x0}, ++ {0x414ef, 0x0}, ++ {0x414f0, 0x0}, ++ {0x414f1, 0x0}, ++ {0x414f2, 0x0}, ++ {0x414f3, 0x0}, ++ {0x414f4, 0x0}, ++ {0x414f5, 0x0}, ++ {0x414f6, 0x0}, ++ {0x414f7, 0x0}, ++ {0x414f8, 0x0}, ++ {0x414f9, 0x0}, ++ {0x414fa, 0x0}, ++ {0x414fb, 0x0}, ++ {0x414fc, 0x0}, ++ {0x414fd, 0x0}, ++ {0x414fe, 0x0}, ++ {0x414ff, 0x0}, ++ {0x41500, 0x0}, ++ {0x41501, 0x0}, ++ {0x41502, 0x0}, ++ {0x41503, 0x0}, ++ {0x41504, 0x0}, ++ {0x41505, 0x0}, ++ {0x41506, 0x0}, ++ {0x41507, 0x0}, ++ {0x41508, 0x0}, ++ {0x41509, 0x0}, ++ {0x4150a, 0x0}, ++ {0x4150b, 0x0}, ++ {0x4150c, 0x0}, ++ {0x4150d, 0x0}, ++ {0x4150e, 0x0}, ++ {0x4150f, 0x0}, ++ {0x41510, 0x0}, ++ {0x41511, 0x0}, ++ {0x41512, 0x0}, ++ {0x41513, 0x0}, ++ {0x41514, 0x0}, ++ {0x41515, 0x0}, ++ {0x41516, 0x0}, ++ {0x41517, 0x0}, ++ {0x41518, 0x0}, ++ {0x41519, 0x0}, ++ {0x4151a, 0x0}, ++ {0x4151b, 0x0}, ++ {0x4151c, 0x0}, ++ {0x4151d, 0x0}, ++ {0x4151e, 0x0}, ++ {0x4151f, 0x0}, ++ {0x41520, 0x0}, ++ {0x41521, 0x0}, ++ {0x41522, 0x0}, ++ {0x41523, 0x0}, ++ {0x41524, 0x0}, ++ {0x41525, 0x0}, ++ {0x41526, 0x0}, ++ {0x41527, 0x0}, ++ {0x41528, 0x0}, ++ {0x41529, 0x0}, ++ {0x4152a, 0x0}, ++ {0x4152b, 0x0}, ++ {0x4152c, 0x0}, ++ {0x4152d, 0x0}, ++ {0x4152e, 0x0}, ++ {0x4152f, 0x0}, ++ {0x41530, 0x0}, ++ {0x41531, 0x0}, ++ {0x41532, 0x0}, ++ {0x41533, 0x0}, ++ {0x41534, 0x0}, ++ {0x41535, 0x0}, ++ {0x41536, 0x0}, ++ {0x41537, 0x0}, ++ {0x41538, 0x0}, ++ {0x41539, 0x0}, ++ {0x4153a, 0x0}, ++ {0x4153b, 0x0}, ++ {0x4153c, 0x0}, ++ {0x4153d, 0x0}, ++ {0x4153e, 0x0}, ++ {0x4153f, 0x0}, ++ {0x41540, 0x0}, ++ {0x41541, 0x0}, ++ {0x41542, 0x0}, ++ {0x41543, 0x0}, ++ {0x41544, 0x0}, ++ {0x41545, 0x0}, ++ {0x41546, 0x0}, ++ {0x41547, 0x0}, ++ {0x41548, 0x0}, ++ {0x41549, 0x0}, ++ {0x4154a, 0x0}, ++ {0x4154b, 0x0}, ++ {0x4154c, 0x0}, ++ {0x4154d, 0x0}, ++ {0x4154e, 0x0}, ++ {0x4154f, 0x0}, ++ {0x41550, 0x0}, ++ {0x41551, 0x0}, ++ {0x41552, 0x0}, ++ {0x41553, 0x0}, ++ {0x41554, 0x0}, ++ {0x41555, 0x0}, ++ {0x41556, 0x0}, ++ {0x41557, 0x0}, ++ {0x41558, 0x0}, ++ {0x41559, 0x0}, ++ {0x4155a, 0x0}, ++ {0x4155b, 0x0}, ++ {0x4155c, 0x0}, ++ {0x4155d, 0x0}, ++ {0x4155e, 0x0}, ++ {0x4155f, 0x0}, ++ {0x41560, 0x0}, ++ {0x41561, 0x0}, ++ {0x41562, 0x0}, ++ {0x41563, 0x0}, ++ {0x41564, 0x0}, ++ {0x41565, 0x0}, ++ {0x41566, 0x0}, ++ {0x41567, 0x0}, ++ {0x41568, 0x0}, ++ {0x41569, 0x0}, ++ {0x4156a, 0x0}, ++ {0x4156b, 0x0}, ++ {0x4156c, 0x0}, ++ {0x4156d, 0x0}, ++ {0x4156e, 0x0}, ++ {0x4156f, 0x0}, ++ {0x41570, 0x0}, ++ {0x41571, 0x0}, ++ {0x41572, 0x0}, ++ {0x41573, 0x0}, ++ {0x41574, 0x0}, ++ {0x41575, 0x0}, ++ {0x41576, 0x0}, ++ {0x41577, 0x0}, ++ {0x41578, 0x0}, ++ {0x41579, 0x0}, ++ {0x4157a, 0x0}, ++ {0x4157b, 0x0}, ++ {0x4157c, 0x0}, ++ {0x4157d, 0x0}, ++ {0x4157e, 0x0}, ++ {0x4157f, 0x0}, ++ {0x41580, 0x0}, ++ {0x41581, 0x0}, ++ {0x41582, 0x0}, ++ {0x41583, 0x0}, ++ {0x41584, 0x0}, ++ {0x41585, 0x0}, ++ {0x41586, 0x0}, ++ {0x41587, 0x0}, ++ {0x41588, 0x0}, ++ {0x41589, 0x0}, ++ {0x4158a, 0x0}, ++ {0x4158b, 0x0}, ++ {0x4158c, 0x0}, ++ {0x4158d, 0x0}, ++ {0x4158e, 0x0}, ++ {0x4158f, 0x0}, ++ {0x41590, 0x0}, ++ {0x41591, 0x0}, ++ {0x41592, 0x0}, ++ {0x41593, 0x0}, ++ {0x41594, 0x0}, ++ {0x41595, 0x0}, ++ {0x41596, 0x0}, ++ {0x41597, 0x0}, ++ {0x41598, 0x0}, ++ {0x41599, 0x0}, ++ {0x4159a, 0x0}, ++ {0x4159b, 0x0}, ++ {0x4159c, 0x0}, ++ {0x4159d, 0x0}, ++ {0x4159e, 0x0}, ++ {0x4159f, 0x0}, ++ {0x415a0, 0x0}, ++ {0x415a1, 0x0}, ++ {0x415a2, 0x0}, ++ {0x415a3, 0x0}, ++ {0x415a4, 0x0}, ++ {0x415a5, 0x0}, ++ {0x415a6, 0x0}, ++ {0x415a7, 0x0}, ++ {0x415a8, 0x0}, ++ {0x415a9, 0x0}, ++ {0x415aa, 0x0}, ++ {0x415ab, 0x0}, ++ {0x415ac, 0x0}, ++ {0x415ad, 0x0}, ++ {0x415ae, 0x0}, ++ {0x415af, 0x0}, ++ {0x415b0, 0x0}, ++ {0x415b1, 0x0}, ++ {0x415b2, 0x0}, ++ {0x415b3, 0x0}, ++ {0x415b4, 0x0}, ++ {0x415b5, 0x0}, ++ {0x415b6, 0x0}, ++ {0x415b7, 0x0}, ++ {0x415b8, 0x0}, ++ {0x415b9, 0x0}, ++ {0x415ba, 0x0}, ++ {0x415bb, 0x0}, ++ {0x415bc, 0x0}, ++ {0x415bd, 0x0}, ++ {0x415be, 0x0}, ++ {0x415bf, 0x0}, ++ {0x415c0, 0x0}, ++ {0x415c1, 0x0}, ++ {0x415c2, 0x0}, ++ {0x415c3, 0x0}, ++ {0x415c4, 0x0}, ++ {0x415c5, 0x0}, ++ {0x415c6, 0x0}, ++ {0x415c7, 0x0}, ++ {0x415c8, 0x0}, ++ {0x415c9, 0x0}, ++ {0x415ca, 0x0}, ++ {0x415cb, 0x0}, ++ {0x415cc, 0x0}, ++ {0x415cd, 0x0}, ++ {0x415ce, 0x0}, ++ {0x415cf, 0x0}, ++ {0x415d0, 0x0}, ++ {0x415d1, 0x0}, ++ {0x415d2, 0x0}, ++ {0x415d3, 0x0}, ++ {0x415d4, 0x0}, ++ {0x415d5, 0x0}, ++ {0x415d6, 0x0}, ++ {0x415d7, 0x0}, ++ {0x415d8, 0x0}, ++ {0x415d9, 0x0}, ++ {0x415da, 0x0}, ++ {0x415db, 0x0}, ++ {0x415dc, 0x0}, ++ {0x415dd, 0x0}, ++ {0x415de, 0x0}, ++ {0x415df, 0x0}, ++ {0x415e0, 0x0}, ++ {0x415e1, 0x0}, ++ {0x415e2, 0x0}, ++ {0x415e3, 0x0}, ++ {0x415e4, 0x0}, ++ {0x415e5, 0x0}, ++ {0x415e6, 0x0}, ++ {0x415e7, 0x0}, ++ {0x415e8, 0x0}, ++ {0x415e9, 0x0}, ++ {0x415ea, 0x0}, ++ {0x415eb, 0x0}, ++ {0x415ec, 0x0}, ++ {0x415ed, 0x0}, ++ {0x415ee, 0x0}, ++ {0x415ef, 0x0}, ++ {0x415f0, 0x0}, ++ {0x415f1, 0x0}, ++ {0x415f2, 0x0}, ++ {0x415f3, 0x0}, ++ {0x415f4, 0x0}, ++ {0x415f5, 0x0}, ++ {0x415f6, 0x0}, ++ {0x415f7, 0x0}, ++ {0x415f8, 0x0}, ++ {0x415f9, 0x0}, ++ {0x415fa, 0x0}, ++ {0x415fb, 0x0}, ++ {0x415fc, 0x0}, ++ {0x415fd, 0x0}, ++ {0x415fe, 0x0}, ++ {0x415ff, 0x0}, ++ {0x41600, 0x0}, ++ {0x41601, 0x0}, ++ {0x41602, 0x0}, ++ {0x41603, 0x0}, ++ {0x41604, 0x0}, ++ {0x41605, 0x0}, ++ {0x41606, 0x0}, ++ {0x41607, 0x0}, ++ {0x41608, 0x0}, ++ {0x41609, 0x0}, ++ {0x4160a, 0x0}, ++ {0x4160b, 0x0}, ++ {0x4160c, 0x0}, ++ {0x4160d, 0x0}, ++ {0x4160e, 0x0}, ++ {0x4160f, 0x0}, ++ {0x41610, 0x0}, ++ {0x41611, 0x0}, ++ {0x41612, 0x0}, ++ {0x41613, 0x0}, ++ {0x41614, 0x0}, ++ {0x41615, 0x0}, ++ {0x41616, 0x0}, ++ {0x41617, 0x0}, ++ {0x41618, 0x0}, ++ {0x41619, 0x0}, ++ {0x4161a, 0x0}, ++ {0x4161b, 0x0}, ++ {0x4161c, 0x0}, ++ {0x4161d, 0x0}, ++ {0x4161e, 0x0}, ++ {0x4161f, 0x0}, ++ {0x41620, 0x0}, ++ {0x41621, 0x0}, ++ {0x41622, 0x0}, ++ {0x41623, 0x0}, ++ {0x41624, 0x0}, ++ {0x41625, 0x0}, ++ {0x41626, 0x0}, ++ {0x41627, 0x0}, ++ {0x41628, 0x0}, ++ {0x41629, 0x0}, ++ {0x4162a, 0x0}, ++ {0x4162b, 0x0}, ++ {0x4162c, 0x0}, ++ {0x4162d, 0x0}, ++ {0x4162e, 0x0}, ++ {0x4162f, 0x0}, ++ {0x41630, 0x0}, ++ {0x41631, 0x0}, ++ {0x41632, 0x0}, ++ {0x41633, 0x0}, ++ {0x41634, 0x0}, ++ {0x41635, 0x0}, ++ {0x41636, 0x0}, ++ {0x41637, 0x0}, ++ {0x41638, 0x0}, ++ {0x41639, 0x0}, ++ {0x4163a, 0x0}, ++ {0x4163b, 0x0}, ++ {0x4163c, 0x0}, ++ {0x4163d, 0x0}, ++ {0x4163e, 0x0}, ++ {0x4163f, 0x0}, ++ {0x41640, 0x0}, ++ {0x41641, 0x0}, ++ {0x41642, 0x0}, ++ {0x41643, 0x0}, ++ {0x41644, 0x0}, ++ {0x41645, 0x0}, ++ {0x41646, 0x0}, ++ {0x41647, 0x0}, ++ {0x41648, 0x0}, ++ {0x41649, 0x0}, ++ {0x4164a, 0x0}, ++ {0x4164b, 0x0}, ++ {0x4164c, 0x0}, ++ {0x4164d, 0x0}, ++ {0x4164e, 0x0}, ++ {0x4164f, 0x0}, ++ {0x41650, 0x0}, ++ {0x41651, 0x0}, ++ {0x41652, 0x0}, ++ {0x41653, 0x0}, ++ {0x41654, 0x0}, ++ {0x41655, 0x0}, ++ {0x41656, 0x0}, ++ {0x41657, 0x0}, ++ {0x41658, 0x0}, ++ {0x41659, 0x0}, ++ {0x4165a, 0x0}, ++ {0x4165b, 0x0}, ++ {0x4165c, 0x0}, ++ {0x4165d, 0x0}, ++ {0x4165e, 0x0}, ++ {0x4165f, 0x0}, ++ {0x41660, 0x0}, ++ {0x41661, 0x0}, ++ {0x41662, 0x0}, ++ {0x41663, 0x0}, ++ {0x41664, 0x0}, ++ {0x41665, 0x0}, ++ {0x41666, 0x0}, ++ {0x41667, 0x0}, ++ {0x41668, 0x0}, ++ {0x41669, 0x0}, ++ {0x4166a, 0x0}, ++ {0x4166b, 0x0}, ++ {0x4166c, 0x0}, ++ {0x4166d, 0x0}, ++ {0x4166e, 0x0}, ++ {0x4166f, 0x0}, ++ {0x41670, 0x0}, ++ {0x41671, 0x0}, ++ {0x41672, 0x0}, ++ {0x41673, 0x0}, ++ {0x41674, 0x0}, ++ {0x41675, 0x0}, ++ {0x41676, 0x0}, ++ {0x41677, 0x0}, ++ {0x41678, 0x0}, ++ {0x41679, 0x0}, ++ {0x4167a, 0x0}, ++ {0x4167b, 0x0}, ++ {0x4167c, 0x0}, ++ {0x4167d, 0x0}, ++ {0x4167e, 0x0}, ++ {0x4167f, 0x0}, ++ {0x41680, 0x0}, ++ {0x41681, 0x0}, ++ {0x41682, 0x0}, ++ {0x41683, 0x0}, ++ {0x41684, 0x0}, ++ {0x41685, 0x0}, ++ {0x41686, 0x0}, ++ {0x41687, 0x0}, ++ {0x41688, 0x0}, ++ {0x41689, 0x0}, ++ {0x4168a, 0x0}, ++ {0x4168b, 0x0}, ++ {0x4168c, 0x0}, ++ {0x4168d, 0x0}, ++ {0x4168e, 0x0}, ++ {0x4168f, 0x0}, ++ {0x41690, 0x0}, ++ {0x41691, 0x0}, ++ {0x41692, 0x0}, ++ {0x41693, 0x0}, ++ {0x41694, 0x0}, ++ {0x41695, 0x0}, ++ {0x41696, 0x0}, ++ {0x41697, 0x0}, ++ {0x41698, 0x0}, ++ {0x41699, 0x0}, ++ {0x4169a, 0x0}, ++ {0x4169b, 0x0}, ++ {0x4169c, 0x0}, ++ {0x4169d, 0x0}, ++ {0x4169e, 0x0}, ++ {0x4169f, 0x0}, ++ {0x416a0, 0x0}, ++ {0x416a1, 0x0}, ++ {0x416a2, 0x0}, ++ {0x416a3, 0x0}, ++ {0x416a4, 0x0}, ++ {0x416a5, 0x0}, ++ {0x416a6, 0x0}, ++ {0x416a7, 0x0}, ++ {0x416a8, 0x0}, ++ {0x416a9, 0x0}, ++ {0x416aa, 0x0}, ++ {0x416ab, 0x0}, ++ {0x416ac, 0x0}, ++ {0x416ad, 0x0}, ++ {0x416ae, 0x0}, ++ {0x416af, 0x0}, ++ {0x416b0, 0x0}, ++ {0x416b1, 0x0}, ++ {0x416b2, 0x0}, ++ {0x416b3, 0x0}, ++ {0x416b4, 0x0}, ++ {0x416b5, 0x0}, ++ {0x416b6, 0x0}, ++ {0x416b7, 0x0}, ++ {0x416b8, 0x0}, ++ {0x416b9, 0x0}, ++ {0x416ba, 0x0}, ++ {0x416bb, 0x0}, ++ {0x416bc, 0x0}, ++ {0x416bd, 0x0}, ++ {0x416be, 0x0}, ++ {0x416bf, 0x0}, ++ {0x416c0, 0x0}, ++ {0x416c1, 0x0}, ++ {0x416c2, 0x0}, ++ {0x416c3, 0x0}, ++ {0x416c4, 0x0}, ++ {0x416c5, 0x0}, ++ {0x416c6, 0x0}, ++ {0x416c7, 0x0}, ++ {0x416c8, 0x0}, ++ {0x416c9, 0x0}, ++ {0x416ca, 0x0}, ++ {0x416cb, 0x0}, ++ {0x416cc, 0x0}, ++ {0x416cd, 0x0}, ++ {0x416ce, 0x0}, ++ {0x416cf, 0x0}, ++ {0x416d0, 0x0}, ++ {0x416d1, 0x0}, ++ {0x416d2, 0x0}, ++ {0x416d3, 0x0}, ++ {0x416d4, 0x0}, ++ {0x416d5, 0x0}, ++ {0x416d6, 0x0}, ++ {0x416d7, 0x0}, ++ {0x416d8, 0x0}, ++ {0x416d9, 0x0}, ++ {0x416da, 0x0}, ++ {0x416db, 0x0}, ++ {0x416dc, 0x0}, ++ {0x416dd, 0x0}, ++ {0x416de, 0x0}, ++ {0x416df, 0x0}, ++ {0x416e0, 0x0}, ++ {0x416e1, 0x0}, ++ {0x416e2, 0x0}, ++ {0x416e3, 0x0}, ++ {0x416e4, 0x0}, ++ {0x416e5, 0x0}, ++ {0x416e6, 0x0}, ++ {0x416e7, 0x0}, ++ {0x416e8, 0x0}, ++ {0x416e9, 0x0}, ++ {0x416ea, 0x0}, ++ {0x416eb, 0x0}, ++ {0x416ec, 0x0}, ++ {0x416ed, 0x0}, ++ {0x416ee, 0x0}, ++ {0x416ef, 0x0}, ++ {0x416f0, 0x0}, ++ {0x416f1, 0x0}, ++ {0x416f2, 0x0}, ++ {0x416f3, 0x0}, ++ {0x416f4, 0x0}, ++ {0x416f5, 0x0}, ++ {0x416f6, 0x0}, ++ {0x416f7, 0x0}, ++ {0x416f8, 0x0}, ++ {0x416f9, 0x0}, ++ {0x416fa, 0x0}, ++ {0x416fb, 0x0}, ++ {0x416fc, 0x0}, ++ {0x416fd, 0x0}, ++ {0x416fe, 0x0}, ++ {0x416ff, 0x0}, ++ {0x41700, 0x0}, ++ {0x41701, 0x0}, ++ {0x41702, 0x0}, ++ {0x41703, 0x0}, ++ {0x41704, 0x0}, ++ {0x41705, 0x0}, ++ {0x41706, 0x0}, ++ {0x41707, 0x0}, ++ {0x41708, 0x0}, ++ {0x41709, 0x0}, ++ {0x4170a, 0x0}, ++ {0x4170b, 0x0}, ++ {0x4170c, 0x0}, ++ {0x4170d, 0x0}, ++ {0x4170e, 0x0}, ++ {0x4170f, 0x0}, ++ {0x41710, 0x0}, ++ {0x41711, 0x0}, ++ {0x41712, 0x0}, ++ {0x41713, 0x0}, ++ {0x41714, 0x0}, ++ {0x41715, 0x0}, ++ {0x41716, 0x0}, ++ {0x41717, 0x0}, ++ {0x41718, 0x0}, ++ {0x41719, 0x0}, ++ {0x4171a, 0x0}, ++ {0x4171b, 0x0}, ++ {0x4171c, 0x0}, ++ {0x4171d, 0x0}, ++ {0x4171e, 0x0}, ++ {0x4171f, 0x0}, ++ {0x41720, 0x0}, ++ {0x41721, 0x0}, ++ {0x41722, 0x0}, ++ {0x41723, 0x0}, ++ {0x41724, 0x0}, ++ {0x41725, 0x0}, ++ {0x41726, 0x0}, ++ {0x41727, 0x0}, ++ {0x41728, 0x0}, ++ {0x41729, 0x0}, ++ {0x4172a, 0x0}, ++ {0x4172b, 0x0}, ++ {0x4172c, 0x0}, ++ {0x4172d, 0x0}, ++ {0x4172e, 0x0}, ++ {0x4172f, 0x0}, ++ {0x41730, 0x0}, ++ {0x41731, 0x0}, ++ {0x41732, 0x0}, ++ {0x41733, 0x0}, ++ {0x41734, 0x0}, ++ {0x41735, 0x0}, ++ {0x41736, 0x0}, ++ {0x41737, 0x0}, ++ {0x41738, 0x0}, ++ {0x41739, 0x0}, ++ {0x4173a, 0x0}, ++ {0x4173b, 0x0}, ++ {0x4173c, 0x0}, ++ {0x4173d, 0x0}, ++ {0x4173e, 0x0}, ++ {0x4173f, 0x0}, ++ {0x41740, 0x0}, ++ {0x41741, 0x0}, ++ {0x41742, 0x0}, ++ {0x41743, 0x0}, ++ {0x41744, 0x0}, ++ {0x41745, 0x0}, ++ {0x41746, 0x0}, ++ {0x41747, 0x0}, ++ {0x41748, 0x0}, ++ {0x41749, 0x0}, ++ {0x4174a, 0x0}, ++ {0x4174b, 0x0}, ++ {0x4174c, 0x0}, ++ {0x4174d, 0x0}, ++ {0x4174e, 0x0}, ++ {0x4174f, 0x0}, ++ {0x41750, 0x0}, ++ {0x41751, 0x0}, ++ {0x41752, 0x0}, ++ {0x41753, 0x0}, ++ {0x41754, 0x0}, ++ {0x41755, 0x0}, ++ {0x41756, 0x0}, ++ {0x41757, 0x0}, ++ {0x41758, 0x0}, ++ {0x41759, 0x0}, ++ {0x4175a, 0x0}, ++ {0x4175b, 0x0}, ++ {0x4175c, 0x0}, ++ {0x4175d, 0x0}, ++ {0x4175e, 0x0}, ++ {0x4175f, 0x0}, ++ {0x41760, 0x0}, ++ {0x41761, 0x0}, ++ {0x41762, 0x0}, ++ {0x41763, 0x0}, ++ {0x41764, 0x0}, ++ {0x41765, 0x0}, ++ {0x41766, 0x0}, ++ {0x41767, 0x0}, ++ {0x41768, 0x0}, ++ {0x41769, 0x0}, ++ {0x4176a, 0x0}, ++ {0x4176b, 0x0}, ++ {0x4176c, 0x0}, ++ {0x4176d, 0x0}, ++ {0x4176e, 0x0}, ++ {0x4176f, 0x0}, ++ {0x41770, 0x0}, ++ {0x41771, 0x0}, ++ {0x41772, 0x0}, ++ {0x41773, 0x0}, ++ {0x41774, 0x0}, ++ {0x41775, 0x0}, ++ {0x41776, 0x0}, ++ {0x41777, 0x0}, ++ {0x41778, 0x0}, ++ {0x41779, 0x0}, ++ {0x4177a, 0x0}, ++ {0x4177b, 0x0}, ++ {0x4177c, 0x0}, ++ {0x4177d, 0x0}, ++ {0x4177e, 0x0}, ++ {0x4177f, 0x0}, ++ {0x41780, 0x0}, ++ {0x41781, 0x0}, ++ {0x41782, 0x0}, ++ {0x41783, 0x0}, ++ {0x41784, 0x0}, ++ {0x41785, 0x0}, ++ {0x41786, 0x0}, ++ {0x41787, 0x0}, ++ {0x41788, 0x0}, ++ {0x41789, 0x0}, ++ {0x4178a, 0x0}, ++ {0x4178b, 0x0}, ++ {0x4178c, 0x0}, ++ {0x4178d, 0x0}, ++ {0x4178e, 0x0}, ++ {0x4178f, 0x0}, ++ {0x41790, 0x0}, ++ {0x41791, 0x0}, ++ {0x41792, 0x0}, ++ {0x41793, 0x0}, ++ {0x41794, 0x0}, ++ {0x41795, 0x0}, ++ {0x41796, 0x0}, ++ {0x41797, 0x0}, ++ {0x41798, 0x0}, ++ {0x41799, 0x0}, ++ {0x4179a, 0x0}, ++ {0x4179b, 0x0}, ++ {0x4179c, 0x0}, ++ {0x4179d, 0x0}, ++ {0x4179e, 0x0}, ++ {0x4179f, 0x0}, ++ {0x417a0, 0x0}, ++ {0x417a1, 0x0}, ++ {0x417a2, 0x0}, ++ {0x417a3, 0x0}, ++ {0x417a4, 0x0}, ++ {0x417a5, 0x0}, ++ {0x417a6, 0x0}, ++ {0x417a7, 0x0}, ++ {0x417a8, 0x0}, ++ {0x417a9, 0x0}, ++ {0x417aa, 0x0}, ++ {0x417ab, 0x0}, ++ {0x417ac, 0x0}, ++ {0x417ad, 0x0}, ++ {0x417ae, 0x0}, ++ {0x417af, 0x0}, ++ {0x417b0, 0x0}, ++ {0x417b1, 0x0}, ++ {0x417b2, 0x0}, ++ {0x417b3, 0x0}, ++ {0x417b4, 0x0}, ++ {0x417b5, 0x0}, ++ {0x417b6, 0x0}, ++ {0x417b7, 0x0}, ++ {0x417b8, 0x0}, ++ {0x417b9, 0x0}, ++ {0x417ba, 0x0}, ++ {0x417bb, 0x0}, ++ {0x417bc, 0x0}, ++ {0x417bd, 0x0}, ++ {0x417be, 0x0}, ++ {0x417bf, 0x0}, ++ {0x417c0, 0x0}, ++ {0x417c1, 0x0}, ++ {0x417c2, 0x0}, ++ {0x417c3, 0x0}, ++ {0x417c4, 0x0}, ++ {0x417c5, 0x0}, ++ {0x417c6, 0x0}, ++ {0x417c7, 0x0}, ++ {0x417c8, 0x0}, ++ {0x417c9, 0x0}, ++ {0x417ca, 0x0}, ++ {0x417cb, 0x0}, ++ {0x417cc, 0x0}, ++ {0x417cd, 0x0}, ++ {0x417ce, 0x0}, ++ {0x417cf, 0x0}, ++ {0x417d0, 0x0}, ++ {0x417d1, 0x0}, ++ {0x417d2, 0x0}, ++ {0x417d3, 0x0}, ++ {0x417d4, 0x0}, ++ {0x417d5, 0x0}, ++ {0x417d6, 0x0}, ++ {0x417d7, 0x0}, ++ {0x417d8, 0x0}, ++ {0x417d9, 0x0}, ++ {0x417da, 0x0}, ++ {0x417db, 0x0}, ++ {0x417dc, 0x0}, ++ {0x417dd, 0x0}, ++ {0x417de, 0x0}, ++ {0x417df, 0x0}, ++ {0x417e0, 0x0}, ++ {0x417e1, 0x0}, ++ {0x417e2, 0x0}, ++ {0x417e3, 0x0}, ++ {0x417e4, 0x0}, ++ {0x417e5, 0x0}, ++ {0x417e6, 0x0}, ++ {0x417e7, 0x0}, ++ {0x417e8, 0x0}, ++ {0x417e9, 0x0}, ++ {0x417ea, 0x0}, ++ {0x417eb, 0x0}, ++ {0x417ec, 0x0}, ++ {0x417ed, 0x0}, ++ {0x417ee, 0x0}, ++ {0x417ef, 0x0}, ++ {0x417f0, 0x0}, ++ {0x417f1, 0x0}, ++ {0x417f2, 0x0}, ++ {0x417f3, 0x0}, ++ {0x417f4, 0x0}, ++ {0x417f5, 0x0}, ++ {0x417f6, 0x0}, ++ {0x417f7, 0x0}, ++ {0x417f8, 0x0}, ++ {0x417f9, 0x0}, ++ {0x417fa, 0x0}, ++ {0x417fb, 0x0}, ++ {0x417fc, 0x0}, ++ {0x417fd, 0x0}, ++ {0x417fe, 0x0}, ++ {0x417ff, 0x0}, ++ {0x41800, 0x0}, ++ {0x41801, 0x0}, ++ {0x41802, 0x0}, ++ {0x41803, 0x0}, ++ {0x41804, 0x0}, ++ {0x41805, 0x0}, ++ {0x41806, 0x0}, ++ {0x41807, 0x0}, ++ {0x41808, 0x0}, ++ {0x41809, 0x0}, ++ {0x4180a, 0x0}, ++ {0x4180b, 0x0}, ++ {0x4180c, 0x0}, ++ {0x4180d, 0x0}, ++ {0x4180e, 0x0}, ++ {0x4180f, 0x0}, ++ {0x41810, 0x0}, ++ {0x41811, 0x0}, ++ {0x41812, 0x0}, ++ {0x41813, 0x0}, ++ {0x41814, 0x0}, ++ {0x41815, 0x0}, ++ {0x41816, 0x0}, ++ {0x41817, 0x0}, ++ {0x41818, 0x0}, ++ {0x41819, 0x0}, ++ {0x4181a, 0x0}, ++ {0x4181b, 0x0}, ++ {0x4181c, 0x0}, ++ {0x4181d, 0x0}, ++ {0x4181e, 0x0}, ++ {0x4181f, 0x0}, ++ {0x41820, 0x0}, ++ {0x41821, 0x0}, ++ {0x41822, 0x0}, ++ {0x41823, 0x0}, ++ {0x41824, 0x0}, ++ {0x41825, 0x0}, ++ {0x41826, 0x0}, ++ {0x41827, 0x0}, ++ {0x41828, 0x0}, ++ {0x41829, 0x0}, ++ {0x4182a, 0x0}, ++ {0x4182b, 0x0}, ++ {0x4182c, 0x0}, ++ {0x4182d, 0x0}, ++ {0x4182e, 0x0}, ++ {0x4182f, 0x0}, ++ {0x41830, 0x0}, ++ {0x41831, 0x0}, ++ {0x41832, 0x0}, ++ {0x41833, 0x0}, ++ {0x41834, 0x0}, ++ {0x41835, 0x0}, ++ {0x41836, 0x0}, ++ {0x41837, 0x0}, ++ {0x41838, 0x0}, ++ {0x41839, 0x0}, ++ {0x4183a, 0x0}, ++ {0x4183b, 0x0}, ++ {0x4183c, 0x0}, ++ {0x4183d, 0x0}, ++ {0x4183e, 0x0}, ++ {0x4183f, 0x0}, ++ {0x41840, 0x0}, ++ {0x41841, 0x0}, ++ {0x41842, 0x0}, ++ {0x41843, 0x0}, ++ {0x41844, 0x0}, ++ {0x41845, 0x0}, ++ {0x41846, 0x0}, ++ {0x41847, 0x0}, ++ {0x41848, 0x0}, ++ {0x41849, 0x0}, ++ {0x4184a, 0x0}, ++ {0x4184b, 0x0}, ++ {0x4184c, 0x0}, ++ {0x4184d, 0x0}, ++ {0x4184e, 0x0}, ++ {0x4184f, 0x0}, ++ {0x41850, 0x0}, ++ {0x41851, 0x0}, ++ {0x41852, 0x0}, ++ {0x41853, 0x0}, ++ {0x41854, 0x0}, ++ {0x41855, 0x0}, ++ {0x41856, 0x0}, ++ {0x41857, 0x0}, ++ {0x41858, 0x0}, ++ {0x41859, 0x0}, ++ {0x4185a, 0x0}, ++ {0x4185b, 0x0}, ++ {0x4185c, 0x0}, ++ {0x4185d, 0x0}, ++ {0x4185e, 0x0}, ++ {0x4185f, 0x0}, ++ {0x41860, 0x0}, ++ {0x41861, 0x0}, ++ {0x41862, 0x0}, ++ {0x41863, 0x0}, ++ {0x41864, 0x0}, ++ {0x41865, 0x0}, ++ {0x41866, 0x0}, ++ {0x41867, 0x0}, ++ {0x41868, 0x0}, ++ {0x41869, 0x0}, ++ {0x4186a, 0x0}, ++ {0x4186b, 0x0}, ++ {0x4186c, 0x0}, ++ {0x4186d, 0x0}, ++ {0x4186e, 0x0}, ++ {0x4186f, 0x0}, ++ {0x41870, 0x0}, ++ {0x41871, 0x0}, ++ {0x41872, 0x0}, ++ {0x41873, 0x0}, ++ {0x41874, 0x0}, ++ {0x41875, 0x0}, ++ {0x41876, 0x0}, ++ {0x41877, 0x0}, ++ {0x41878, 0x0}, ++ {0x41879, 0x0}, ++ {0x4187a, 0x0}, ++ {0x4187b, 0x0}, ++ {0x4187c, 0x0}, ++ {0x4187d, 0x0}, ++ {0x4187e, 0x0}, ++ {0x4187f, 0x0}, ++ {0x41880, 0x0}, ++ {0x41881, 0x0}, ++ {0x41882, 0x0}, ++ {0x41883, 0x0}, ++ {0x41884, 0x0}, ++ {0x41885, 0x0}, ++ {0x41886, 0x0}, ++ {0x41887, 0x0}, ++ {0x41888, 0x0}, ++ {0x41889, 0x0}, ++ {0x4188a, 0x0}, ++ {0x4188b, 0x0}, ++ {0x4188c, 0x0}, ++ {0x4188d, 0x0}, ++ {0x4188e, 0x0}, ++ {0x4188f, 0x0}, ++ {0x41890, 0x0}, ++ {0x41891, 0x0}, ++ {0x41892, 0x0}, ++ {0x41893, 0x0}, ++ {0x41894, 0x0}, ++ {0x41895, 0x0}, ++ {0x41896, 0x0}, ++ {0x41897, 0x0}, ++ {0x41898, 0x0}, ++ {0x41899, 0x0}, ++ {0x4189a, 0x0}, ++ {0x4189b, 0x0}, ++ {0x4189c, 0x0}, ++ {0x4189d, 0x0}, ++ {0x4189e, 0x0}, ++ {0x4189f, 0x0}, ++ {0x418a0, 0x0}, ++ {0x418a1, 0x0}, ++ {0x418a2, 0x0}, ++ {0x418a3, 0x0}, ++ {0x418a4, 0x0}, ++ {0x418a5, 0x0}, ++ {0x418a6, 0x0}, ++ {0x418a7, 0x0}, ++ {0x418a8, 0x0}, ++ {0x418a9, 0x0}, ++ {0x418aa, 0x0}, ++ {0x418ab, 0x0}, ++ {0x418ac, 0x0}, ++ {0x418ad, 0x0}, ++ {0x418ae, 0x0}, ++ {0x418af, 0x0}, ++ {0x418b0, 0x0}, ++ {0x418b1, 0x0}, ++ {0x418b2, 0x0}, ++ {0x418b3, 0x0}, ++ {0x418b4, 0x0}, ++ {0x418b5, 0x0}, ++ {0x418b6, 0x0}, ++ {0x418b7, 0x0}, ++ {0x418b8, 0x0}, ++ {0x418b9, 0x0}, ++ {0x418ba, 0x0}, ++ {0x418bb, 0x0}, ++ {0x418bc, 0x0}, ++ {0x418bd, 0x0}, ++ {0x418be, 0x0}, ++ {0x418bf, 0x0}, ++ {0x418c0, 0x0}, ++ {0x418c1, 0x0}, ++ {0x418c2, 0x0}, ++ {0x418c3, 0x0}, ++ {0x418c4, 0x0}, ++ {0x418c5, 0x0}, ++ {0x418c6, 0x0}, ++ {0x418c7, 0x0}, ++ {0x418c8, 0x0}, ++ {0x418c9, 0x0}, ++ {0x418ca, 0x0}, ++ {0x418cb, 0x0}, ++ {0x418cc, 0x0}, ++ {0x418cd, 0x0}, ++ {0x418ce, 0x0}, ++ {0x418cf, 0x0}, ++ {0x418d0, 0x0}, ++ {0x418d1, 0x0}, ++ {0x418d2, 0x0}, ++ {0x418d3, 0x0}, ++ {0x418d4, 0x0}, ++ {0x418d5, 0x0}, ++ {0x418d6, 0x0}, ++ {0x418d7, 0x0}, ++ {0x418d8, 0x0}, ++ {0x418d9, 0x0}, ++ {0x418da, 0x0}, ++ {0x418db, 0x0}, ++ {0x418dc, 0x0}, ++ {0x418dd, 0x0}, ++ {0x418de, 0x0}, ++ {0x418df, 0x0}, ++ {0x418e0, 0x0}, ++ {0x418e1, 0x0}, ++ {0x418e2, 0x0}, ++ {0x418e3, 0x0}, ++ {0x418e4, 0x0}, ++ {0x418e5, 0x0}, ++ {0x418e6, 0x0}, ++ {0x418e7, 0x0}, ++ {0x418e8, 0x0}, ++ {0x418e9, 0x0}, ++ {0x418ea, 0x0}, ++ {0x418eb, 0x0}, ++ {0x418ec, 0x0}, ++ {0x418ed, 0x0}, ++ {0x418ee, 0x0}, ++ {0x418ef, 0x0}, ++ {0x418f0, 0x0}, ++ {0x418f1, 0x0}, ++ {0x418f2, 0x0}, ++ {0x418f3, 0x0}, ++ {0x418f4, 0x0}, ++ {0x418f5, 0x0}, ++ {0x418f6, 0x0}, ++ {0x418f7, 0x0}, ++ {0x418f8, 0x0}, ++ {0x418f9, 0x0}, ++ {0x418fa, 0x0}, ++ {0x418fb, 0x0}, ++ {0x418fc, 0x0}, ++ {0x418fd, 0x0}, ++ {0x418fe, 0x0}, ++ {0x418ff, 0x0}, ++ {0x41900, 0x0}, ++ {0x41901, 0x0}, ++ {0x41902, 0x0}, ++ {0x41903, 0x0}, ++ {0x41904, 0x0}, ++ {0x41905, 0x0}, ++ {0x41906, 0x0}, ++ {0x41907, 0x0}, ++ {0x41908, 0x0}, ++ {0x41909, 0x0}, ++ {0x4190a, 0x0}, ++ {0x4190b, 0x0}, ++ {0x4190c, 0x0}, ++ {0x4190d, 0x0}, ++ {0x4190e, 0x0}, ++ {0x4190f, 0x0}, ++ {0x41910, 0x0}, ++ {0x41911, 0x0}, ++ {0x41912, 0x0}, ++ {0x41913, 0x0}, ++ {0x41914, 0x0}, ++ {0x41915, 0x0}, ++ {0x41916, 0x0}, ++ {0x41917, 0x0}, ++ {0x41918, 0x0}, ++ {0x41919, 0x0}, ++ {0x4191a, 0x0}, ++ {0x4191b, 0x0}, ++ {0x4191c, 0x0}, ++ {0x4191d, 0x0}, ++ {0x4191e, 0x0}, ++ {0x4191f, 0x0}, ++ {0x41920, 0x0}, ++ {0x41921, 0x0}, ++ {0x41922, 0x0}, ++ {0x41923, 0x0}, ++ {0x41924, 0x0}, ++ {0x41925, 0x0}, ++ {0x41926, 0x0}, ++ {0x41927, 0x0}, ++ {0x41928, 0x0}, ++ {0x41929, 0x0}, ++ {0x4192a, 0x0}, ++ {0x4192b, 0x0}, ++ {0x4192c, 0x0}, ++ {0x4192d, 0x0}, ++ {0x4192e, 0x0}, ++ {0x4192f, 0x0}, ++ {0x41930, 0x0}, ++ {0x41931, 0x0}, ++ {0x41932, 0x0}, ++ {0x41933, 0x0}, ++ {0x41934, 0x0}, ++ {0x41935, 0x0}, ++ {0x41936, 0x0}, ++ {0x41937, 0x0}, ++ {0x41938, 0x0}, ++ {0x41939, 0x0}, ++ {0x4193a, 0x0}, ++ {0x4193b, 0x0}, ++ {0x4193c, 0x0}, ++ {0x4193d, 0x0}, ++ {0x4193e, 0x0}, ++ {0x4193f, 0x0}, ++ {0x41940, 0x0}, ++ {0x41941, 0x0}, ++ {0x41942, 0x0}, ++ {0x41943, 0x0}, ++ {0x41944, 0x0}, ++ {0x41945, 0x0}, ++ {0x41946, 0x0}, ++ {0x41947, 0x0}, ++ {0x41948, 0x0}, ++ {0x41949, 0x0}, ++ {0x4194a, 0x0}, ++ {0x4194b, 0x0}, ++ {0x4194c, 0x0}, ++ {0x4194d, 0x0}, ++ {0x4194e, 0x0}, ++ {0x4194f, 0x0}, ++ {0x41950, 0x0}, ++ {0x41951, 0x0}, ++ {0x41952, 0x0}, ++ {0x41953, 0x0}, ++ {0x41954, 0x0}, ++ {0x41955, 0x0}, ++ {0x41956, 0x0}, ++ {0x41957, 0x0}, ++ {0x41958, 0x0}, ++ {0x41959, 0x0}, ++ {0x4195a, 0x0}, ++ {0x4195b, 0x0}, ++ {0x4195c, 0x0}, ++ {0x4195d, 0x0}, ++ {0x4195e, 0x0}, ++ {0x4195f, 0x0}, ++ {0x41960, 0x0}, ++ {0x41961, 0x0}, ++ {0x41962, 0x0}, ++ {0x41963, 0x0}, ++ {0x41964, 0x0}, ++ {0x41965, 0x0}, ++ {0x41966, 0x0}, ++ {0x41967, 0x0}, ++ {0x41968, 0x0}, ++ {0x41969, 0x0}, ++ {0x4196a, 0x0}, ++ {0x4196b, 0x0}, ++ {0x4196c, 0x0}, ++ {0x4196d, 0x0}, ++ {0x4196e, 0x0}, ++ {0x4196f, 0x0}, ++ {0x41970, 0x0}, ++ {0x41971, 0x0}, ++ {0x41972, 0x0}, ++ {0x41973, 0x0}, ++ {0x41974, 0x0}, ++ {0x41975, 0x0}, ++ {0x41976, 0x0}, ++ {0x41977, 0x0}, ++ {0x41978, 0x0}, ++ {0x41979, 0x0}, ++ {0x4197a, 0x0}, ++ {0x4197b, 0x0}, ++ {0x4197c, 0x0}, ++ {0x4197d, 0x0}, ++ {0x4197e, 0x0}, ++ {0x4197f, 0x0}, ++ {0x41980, 0x0}, ++ {0x41981, 0x0}, ++ {0x41982, 0x0}, ++ {0x41983, 0x0}, ++ {0x41984, 0x0}, ++ {0x41985, 0x0}, ++ {0x41986, 0x0}, ++ {0x41987, 0x0}, ++ {0x41988, 0x0}, ++ {0x41989, 0x0}, ++ {0x4198a, 0x0}, ++ {0x4198b, 0x0}, ++ {0x4198c, 0x0}, ++ {0x4198d, 0x0}, ++ {0x4198e, 0x0}, ++ {0x4198f, 0x0}, ++ {0x41990, 0x0}, ++ {0x41991, 0x0}, ++ {0x41992, 0x0}, ++ {0x41993, 0x0}, ++ {0x41994, 0x0}, ++ {0x41995, 0x0}, ++ {0x41996, 0x0}, ++ {0x41997, 0x0}, ++ {0x41998, 0x0}, ++ {0x41999, 0x0}, ++ {0x4199a, 0x0}, ++ {0x4199b, 0x0}, ++ {0x4199c, 0x0}, ++ {0x4199d, 0x0}, ++ {0x4199e, 0x0}, ++ {0x4199f, 0x0}, ++ {0x419a0, 0x0}, ++ {0x419a1, 0x0}, ++ {0x419a2, 0x0}, ++ {0x419a3, 0x0}, ++ {0x419a4, 0x0}, ++ {0x419a5, 0x0}, ++ {0x419a6, 0x0}, ++ {0x419a7, 0x0}, ++ {0x419a8, 0x0}, ++ {0x419a9, 0x0}, ++ {0x419aa, 0x0}, ++ {0x419ab, 0x0}, ++ {0x419ac, 0x0}, ++ {0x419ad, 0x0}, ++ {0x419ae, 0x0}, ++ {0x419af, 0x0}, ++ {0x419b0, 0x0}, ++ {0x419b1, 0x0}, ++ {0x419b2, 0x0}, ++ {0x419b3, 0x0}, ++ {0x419b4, 0x0}, ++ {0x419b5, 0x0}, ++ {0x419b6, 0x0}, ++ {0x419b7, 0x0}, ++ {0x419b8, 0x0}, ++ {0x419b9, 0x0}, ++ {0x419ba, 0x0}, ++ {0x419bb, 0x0}, ++ {0x419bc, 0x0}, ++ {0x419bd, 0x0}, ++ {0x419be, 0x0}, ++ {0x419bf, 0x0}, ++ {0x419c0, 0x0}, ++ {0x419c1, 0x0}, ++ {0x419c2, 0x0}, ++ {0x419c3, 0x0}, ++ {0x419c4, 0x0}, ++ {0x419c5, 0x0}, ++ {0x419c6, 0x0}, ++ {0x419c7, 0x0}, ++ {0x419c8, 0x0}, ++ {0x419c9, 0x0}, ++ {0x419ca, 0x0}, ++ {0x419cb, 0x0}, ++ {0x419cc, 0x0}, ++ {0x419cd, 0x0}, ++ {0x419ce, 0x0}, ++ {0x419cf, 0x0}, ++ {0x419d0, 0x0}, ++ {0x419d1, 0x0}, ++ {0x419d2, 0x0}, ++ {0x419d3, 0x0}, ++ {0x419d4, 0x0}, ++ {0x419d5, 0x0}, ++ {0x419d6, 0x0}, ++ {0x419d7, 0x0}, ++ {0x419d8, 0x0}, ++ {0x419d9, 0x0}, ++ {0x419da, 0x0}, ++ {0x419db, 0x0}, ++ {0x419dc, 0x0}, ++ {0x419dd, 0x0}, ++ {0x419de, 0x0}, ++ {0x419df, 0x0}, ++ {0x419e0, 0x0}, ++ {0x419e1, 0x0}, ++ {0x419e2, 0x0}, ++ {0x419e3, 0x0}, ++ {0x419e4, 0x0}, ++ {0x419e5, 0x0}, ++ {0x419e6, 0x0}, ++ {0x419e7, 0x0}, ++ {0x419e8, 0x0}, ++ {0x419e9, 0x0}, ++ {0x419ea, 0x0}, ++ {0x419eb, 0x0}, ++ {0x419ec, 0x0}, ++ {0x419ed, 0x0}, ++ {0x419ee, 0x0}, ++ {0x419ef, 0x0}, ++ {0x419f0, 0x0}, ++ {0x419f1, 0x0}, ++ {0x419f2, 0x0}, ++ {0x419f3, 0x0}, ++ {0x419f4, 0x0}, ++ {0x419f5, 0x0}, ++ {0x419f6, 0x0}, ++ {0x419f7, 0x0}, ++ {0x419f8, 0x0}, ++ {0x419f9, 0x0}, ++ {0x419fa, 0x0}, ++ {0x419fb, 0x0}, ++ {0x419fc, 0x0}, ++ {0x419fd, 0x0}, ++ {0x419fe, 0x0}, ++ {0x419ff, 0x0}, ++ {0x41a00, 0x0}, ++ {0x41a01, 0x0}, ++ {0x41a02, 0x0}, ++ {0x41a03, 0x0}, ++ {0x41a04, 0x0}, ++ {0x41a05, 0x0}, ++ {0x41a06, 0x0}, ++ {0x41a07, 0x0}, ++ {0x41a08, 0x0}, ++ {0x41a09, 0x0}, ++ {0x41a0a, 0x0}, ++ {0x41a0b, 0x0}, ++ {0x41a0c, 0x0}, ++ {0x41a0d, 0x0}, ++ {0x41a0e, 0x0}, ++ {0x41a0f, 0x0}, ++ {0x41a10, 0x0}, ++ {0x41a11, 0x0}, ++ {0x41a12, 0x0}, ++ {0x41a13, 0x0}, ++ {0x41a14, 0x0}, ++ {0x41a15, 0x0}, ++ {0x41a16, 0x0}, ++ {0x41a17, 0x0}, ++ {0x41a18, 0x0}, ++ {0x41a19, 0x0}, ++ {0x41a1a, 0x0}, ++ {0x41a1b, 0x0}, ++ {0x41a1c, 0x0}, ++ {0x41a1d, 0x0}, ++ {0x41a1e, 0x0}, ++ {0x41a1f, 0x0}, ++ {0x41a20, 0x0}, ++ {0x41a21, 0x0}, ++ {0x41a22, 0x0}, ++ {0x41a23, 0x0}, ++ {0x41a24, 0x0}, ++ {0x41a25, 0x0}, ++ {0x41a26, 0x0}, ++ {0x41a27, 0x0}, ++ {0x41a28, 0x0}, ++ {0x41a29, 0x0}, ++ {0x41a2a, 0x0}, ++ {0x41a2b, 0x0}, ++ {0x41a2c, 0x0}, ++ {0x41a2d, 0x0}, ++ {0x41a2e, 0x0}, ++ {0x41a2f, 0x0}, ++ {0x41a30, 0x0}, ++ {0x41a31, 0x0}, ++ {0x41a32, 0x0}, ++ {0x41a33, 0x0}, ++ {0x41a34, 0x0}, ++ {0x41a35, 0x0}, ++ {0x41a36, 0x0}, ++ {0x41a37, 0x0}, ++ {0x41a38, 0x0}, ++ {0x41a39, 0x0}, ++ {0x41a3a, 0x0}, ++ {0x41a3b, 0x0}, ++ {0x41a3c, 0x0}, ++ {0x41a3d, 0x0}, ++ {0x41a3e, 0x0}, ++ {0x41a3f, 0x0}, ++ {0x41a40, 0x0}, ++ {0x41a41, 0x0}, ++ {0x41a42, 0x0}, ++ {0x41a43, 0x0}, ++ {0x41a44, 0x0}, ++ {0x41a45, 0x0}, ++ {0x41a46, 0x0}, ++ {0x41a47, 0x0}, ++ {0x41a48, 0x0}, ++ {0x41a49, 0x0}, ++ {0x41a4a, 0x0}, ++ {0x41a4b, 0x0}, ++ {0x41a4c, 0x0}, ++ {0x41a4d, 0x0}, ++ {0x41a4e, 0x0}, ++ {0x41a4f, 0x0}, ++ {0x41a50, 0x0}, ++ {0x41a51, 0x0}, ++ {0x41a52, 0x0}, ++ {0x41a53, 0x0}, ++ {0x41a54, 0x0}, ++ {0x41a55, 0x0}, ++ {0x41a56, 0x0}, ++ {0x41a57, 0x0}, ++ {0x41a58, 0x0}, ++ {0x41a59, 0x0}, ++ {0x41a5a, 0x0}, ++ {0x41a5b, 0x0}, ++ {0x41a5c, 0x0}, ++ {0x41a5d, 0x0}, ++ {0x41a5e, 0x0}, ++ {0x41a5f, 0x0}, ++ {0x41a60, 0x0}, ++ {0x41a61, 0x0}, ++ {0x41a62, 0x0}, ++ {0x41a63, 0x0}, ++ {0x41a64, 0x0}, ++ {0x41a65, 0x0}, ++ {0x41a66, 0x0}, ++ {0x41a67, 0x0}, ++ {0x41a68, 0x0}, ++ {0x41a69, 0x0}, ++ {0x41a6a, 0x0}, ++ {0x41a6b, 0x0}, ++ {0x41a6c, 0x0}, ++ {0x41a6d, 0x0}, ++ {0x41a6e, 0x0}, ++ {0x41a6f, 0x0}, ++ {0x41a70, 0x0}, ++ {0x41a71, 0x0}, ++ {0x41a72, 0x0}, ++ {0x41a73, 0x0}, ++ {0x41a74, 0x0}, ++ {0x41a75, 0x0}, ++ {0x41a76, 0x0}, ++ {0x41a77, 0x0}, ++ {0x41a78, 0x0}, ++ {0x41a79, 0x0}, ++ {0x41a7a, 0x0}, ++ {0x41a7b, 0x0}, ++ {0x41a7c, 0x0}, ++ {0x41a7d, 0x0}, ++ {0x41a7e, 0x0}, ++ {0x41a7f, 0x0}, ++ {0x41a80, 0x0}, ++ {0x41a81, 0x0}, ++ {0x41a82, 0x0}, ++ {0x41a83, 0x0}, ++ {0x41a84, 0x0}, ++ {0x41a85, 0x0}, ++ {0x41a86, 0x0}, ++ {0x41a87, 0x0}, ++ {0x41a88, 0x0}, ++ {0x41a89, 0x0}, ++ {0x41a8a, 0x0}, ++ {0x41a8b, 0x0}, ++ {0x41a8c, 0x0}, ++ {0x41a8d, 0x0}, ++ {0x41a8e, 0x0}, ++ {0x41a8f, 0x0}, ++ {0x41a90, 0x0}, ++ {0x41a91, 0x0}, ++ {0x41a92, 0x0}, ++ {0x41a93, 0x0}, ++ {0x41a94, 0x0}, ++ {0x41a95, 0x0}, ++ {0x41a96, 0x0}, ++ {0x41a97, 0x0}, ++ {0x41a98, 0x0}, ++ {0x41a99, 0x0}, ++ {0x41a9a, 0x0}, ++ {0x41a9b, 0x0}, ++ {0x41a9c, 0x0}, ++ {0x41a9d, 0x0}, ++ {0x41a9e, 0x0}, ++ {0x41a9f, 0x0}, ++ {0x41aa0, 0x0}, ++ {0x41aa1, 0x0}, ++ {0x41aa2, 0x0}, ++ {0x41aa3, 0x0}, ++ {0x41aa4, 0x0}, ++ {0x41aa5, 0x0}, ++ {0x41aa6, 0x0}, ++ {0x41aa7, 0x0}, ++ {0x41aa8, 0x0}, ++ {0x41aa9, 0x0}, ++ {0x41aaa, 0x0}, ++ {0x41aab, 0x0}, ++ {0x41aac, 0x0}, ++ {0x41aad, 0x0}, ++ {0x41aae, 0x0}, ++ {0x41aaf, 0x0}, ++ {0x41ab0, 0x0}, ++ {0x41ab1, 0x0}, ++ {0x41ab2, 0x0}, ++ {0x41ab3, 0x0}, ++ {0x41ab4, 0x0}, ++ {0x41ab5, 0x0}, ++ {0x41ab6, 0x0}, ++ {0x41ab7, 0x0}, ++ {0x41ab8, 0x0}, ++ {0x41ab9, 0x0}, ++ {0x41aba, 0x0}, ++ {0x41abb, 0x0}, ++ {0x41abc, 0x0}, ++ {0x41abd, 0x0}, ++ {0x41abe, 0x0}, ++ {0x41abf, 0x0}, ++ {0x41ac0, 0x0}, ++ {0x41ac1, 0x0}, ++ {0x41ac2, 0x0}, ++ {0x41ac3, 0x0}, ++ {0x41ac4, 0x0}, ++ {0x41ac5, 0x0}, ++ {0x41ac6, 0x0}, ++ {0x41ac7, 0x0}, ++ {0x41ac8, 0x0}, ++ {0x41ac9, 0x0}, ++ {0x41aca, 0x0}, ++ {0x41acb, 0x0}, ++ {0x41acc, 0x0}, ++ {0x41acd, 0x0}, ++ {0x41ace, 0x0}, ++ {0x41acf, 0x0}, ++ {0x41ad0, 0x0}, ++ {0x41ad1, 0x0}, ++ {0x41ad2, 0x0}, ++ {0x41ad3, 0x0}, ++ {0x41ad4, 0x0}, ++ {0x41ad5, 0x0}, ++ {0x41ad6, 0x0}, ++ {0x41ad7, 0x0}, ++ {0x41ad8, 0x0}, ++ {0x41ad9, 0x0}, ++ {0x41ada, 0x0}, ++ {0x41adb, 0x0}, ++ {0x41adc, 0x0}, ++ {0x41add, 0x0}, ++ {0x41ade, 0x0}, ++ {0x41adf, 0x0}, ++ {0x41ae0, 0x0}, ++ {0x41ae1, 0x0}, ++ {0x41ae2, 0x0}, ++ {0x41ae3, 0x0}, ++ {0x41ae4, 0x0}, ++ {0x41ae5, 0x0}, ++ {0x41ae6, 0x0}, ++ {0x41ae7, 0x0}, ++ {0x41ae8, 0x0}, ++ {0x41ae9, 0x0}, ++ {0x41aea, 0x0}, ++ {0x41aeb, 0x0}, ++ {0x41aec, 0x0}, ++ {0x41aed, 0x0}, ++ {0x41aee, 0x0}, ++ {0x41aef, 0x0}, ++ {0x41af0, 0x0}, ++ {0x41af1, 0x0}, ++ {0x41af2, 0x0}, ++ {0x41af3, 0x0}, ++ {0x41af4, 0x0}, ++ {0x41af5, 0x0}, ++ {0x41af6, 0x0}, ++ {0x41af7, 0x0}, ++ {0x41af8, 0x0}, ++ {0x41af9, 0x0}, ++ {0x41afa, 0x0}, ++ {0x41afb, 0x0}, ++ {0x41afc, 0x0}, ++ {0x41afd, 0x0}, ++ {0x41afe, 0x0}, ++ {0x41aff, 0x0}, ++ {0x41b00, 0x0}, ++ {0x41b01, 0x0}, ++ {0x41b02, 0x0}, ++ {0x41b03, 0x0}, ++ {0x41b04, 0x0}, ++ {0x41b05, 0x0}, ++ {0x41b06, 0x0}, ++ {0x41b07, 0x0}, ++ {0x41b08, 0x0}, ++ {0x41b09, 0x0}, ++ {0x41b0a, 0x0}, ++ {0x41b0b, 0x0}, ++ {0x41b0c, 0x0}, ++ {0x41b0d, 0x0}, ++ {0x41b0e, 0x0}, ++ {0x41b0f, 0x0}, ++ {0x41b10, 0x0}, ++ {0x41b11, 0x0}, ++ {0x41b12, 0x0}, ++ {0x41b13, 0x0}, ++ {0x41b14, 0x0}, ++ {0x41b15, 0x0}, ++ {0x41b16, 0x0}, ++ {0x41b17, 0x0}, ++ {0x41b18, 0x0}, ++ {0x41b19, 0x0}, ++ {0x41b1a, 0x0}, ++ {0x41b1b, 0x0}, ++ {0x41b1c, 0x0}, ++ {0x41b1d, 0x0}, ++ {0x41b1e, 0x0}, ++ {0x41b1f, 0x0}, ++ {0x41b20, 0x0}, ++ {0x41b21, 0x0}, ++ {0x41b22, 0x0}, ++ {0x41b23, 0x0}, ++ {0x41b24, 0x0}, ++ {0x41b25, 0x0}, ++ {0x41b26, 0x0}, ++ {0x41b27, 0x0}, ++ {0x41b28, 0x0}, ++ {0x41b29, 0x0}, ++ {0x41b2a, 0x0}, ++ {0x41b2b, 0x0}, ++ {0x41b2c, 0x0}, ++ {0x41b2d, 0x0}, ++ {0x41b2e, 0x0}, ++ {0x41b2f, 0x0}, ++ {0x41b30, 0x0}, ++ {0x41b31, 0x0}, ++ {0x41b32, 0x0}, ++ {0x41b33, 0x0}, ++ {0x41b34, 0x0}, ++ {0x41b35, 0x0}, ++ {0x41b36, 0x0}, ++ {0x41b37, 0x0}, ++ {0x41b38, 0x0}, ++ {0x41b39, 0x0}, ++ {0x41b3a, 0x0}, ++ {0x41b3b, 0x0}, ++ {0x41b3c, 0x0}, ++ {0x41b3d, 0x0}, ++ {0x41b3e, 0x0}, ++ {0x41b3f, 0x0}, ++ {0x41b40, 0x0}, ++ {0x41b41, 0x0}, ++ {0x41b42, 0x0}, ++ {0x41b43, 0x0}, ++ {0x41b44, 0x0}, ++ {0x41b45, 0x0}, ++ {0x41b46, 0x0}, ++ {0x41b47, 0x0}, ++ {0x41b48, 0x0}, ++ {0x41b49, 0x0}, ++ {0x41b4a, 0x0}, ++ {0x41b4b, 0x0}, ++ {0x41b4c, 0x0}, ++ {0x41b4d, 0x0}, ++ {0x41b4e, 0x0}, ++ {0x41b4f, 0x0}, ++ {0x41b50, 0x0}, ++ {0x41b51, 0x0}, ++ {0x41b52, 0x0}, ++ {0x41b53, 0x0}, ++ {0x41b54, 0x0}, ++ {0x41b55, 0x0}, ++ {0x41b56, 0x0}, ++ {0x41b57, 0x0}, ++ {0x41b58, 0x0}, ++ {0x41b59, 0x0}, ++ {0x41b5a, 0x0}, ++ {0x41b5b, 0x0}, ++ {0x41b5c, 0x0}, ++ {0x41b5d, 0x0}, ++ {0x41b5e, 0x0}, ++ {0x41b5f, 0x0}, ++ {0x41b60, 0x0}, ++ {0x41b61, 0x0}, ++ {0x41b62, 0x0}, ++ {0x41b63, 0x0}, ++ {0x41b64, 0x0}, ++ {0x41b65, 0x0}, ++ {0x41b66, 0x0}, ++ {0x41b67, 0x0}, ++ {0x41b68, 0x0}, ++ {0x41b69, 0x0}, ++ {0x41b6a, 0x0}, ++ {0x41b6b, 0x0}, ++ {0x41b6c, 0x0}, ++ {0x41b6d, 0x0}, ++ {0x41b6e, 0x0}, ++ {0x41b6f, 0x0}, ++ {0x41b70, 0x0}, ++ {0x41b71, 0x0}, ++ {0x41b72, 0x0}, ++ {0x41b73, 0x0}, ++ {0x41b74, 0x0}, ++ {0x41b75, 0x0}, ++ {0x41b76, 0x0}, ++ {0x41b77, 0x0}, ++ {0x41b78, 0x0}, ++ {0x41b79, 0x0}, ++ {0x41b7a, 0x0}, ++ {0x41b7b, 0x0}, ++ {0x41b7c, 0x0}, ++ {0x41b7d, 0x0}, ++ {0x41b7e, 0x0}, ++ {0x41b7f, 0x0}, ++ {0x41b80, 0x0}, ++ {0x41b81, 0x0}, ++ {0x41b82, 0x0}, ++ {0x41b83, 0x0}, ++ {0x41b84, 0x0}, ++ {0x41b85, 0x0}, ++ {0x41b86, 0x0}, ++ {0x41b87, 0x0}, ++ {0x41b88, 0x0}, ++ {0x41b89, 0x0}, ++ {0x41b8a, 0x0}, ++ {0x41b8b, 0x0}, ++ {0x41b8c, 0x0}, ++ {0x41b8d, 0x0}, ++ {0x41b8e, 0x0}, ++ {0x41b8f, 0x0}, ++ {0x41b90, 0x0}, ++ {0x41b91, 0x0}, ++ {0x41b92, 0x0}, ++ {0x41b93, 0x0}, ++ {0x41b94, 0x0}, ++ {0x41b95, 0x0}, ++ {0x41b96, 0x0}, ++ {0x41b97, 0x0}, ++ {0x41b98, 0x0}, ++ {0x41b99, 0x0}, ++ {0x41b9a, 0x0}, ++ {0x41b9b, 0x0}, ++ {0x41b9c, 0x0}, ++ {0x41b9d, 0x0}, ++ {0x41b9e, 0x0}, ++ {0x41b9f, 0x0}, ++ {0x41ba0, 0x0}, ++ {0x41ba1, 0x0}, ++ {0x41ba2, 0x0}, ++ {0x41ba3, 0x0}, ++ {0x41ba4, 0x0}, ++ {0x41ba5, 0x0}, ++ {0x41ba6, 0x0}, ++ {0x41ba7, 0x0}, ++ {0x41ba8, 0x0}, ++ {0x41ba9, 0x0}, ++ {0x41baa, 0x0}, ++ {0x41bab, 0x0}, ++ {0x41bac, 0x0}, ++ {0x41bad, 0x0}, ++ {0x41bae, 0x0}, ++ {0x41baf, 0x0}, ++ {0x41bb0, 0x0}, ++ {0x41bb1, 0x0}, ++ {0x41bb2, 0x0}, ++ {0x41bb3, 0x0}, ++ {0x41bb4, 0x0}, ++ {0x41bb5, 0x0}, ++ {0x41bb6, 0x0}, ++ {0x41bb7, 0x0}, ++ {0x41bb8, 0x0}, ++ {0x41bb9, 0x0}, ++ {0x41bba, 0x0}, ++ {0x41bbb, 0x0}, ++ {0x41bbc, 0x0}, ++ {0x41bbd, 0x0}, ++ {0x41bbe, 0x0}, ++ {0x41bbf, 0x0}, ++ {0x41bc0, 0x0}, ++ {0x41bc1, 0x0}, ++ {0x41bc2, 0x0}, ++ {0x41bc3, 0x0}, ++ {0x41bc4, 0x0}, ++ {0x41bc5, 0x0}, ++ {0x41bc6, 0x0}, ++ {0x41bc7, 0x0}, ++ {0x41bc8, 0x0}, ++ {0x41bc9, 0x0}, ++ {0x41bca, 0x0}, ++ {0x41bcb, 0x0}, ++ {0x41bcc, 0x0}, ++ {0x41bcd, 0x0}, ++ {0x41bce, 0x0}, ++ {0x41bcf, 0x0}, ++ {0x41bd0, 0x0}, ++ {0x41bd1, 0x0}, ++ {0x41bd2, 0x0}, ++ {0x41bd3, 0x0}, ++ {0x41bd4, 0x0}, ++ {0x41bd5, 0x0}, ++ {0x41bd6, 0x0}, ++ {0x41bd7, 0x0}, ++ {0x41bd8, 0x0}, ++ {0x41bd9, 0x0}, ++ {0x41bda, 0x0}, ++ {0x41bdb, 0x0}, ++ {0x41bdc, 0x0}, ++ {0x41bdd, 0x0}, ++ {0x41bde, 0x0}, ++ {0x41bdf, 0x0}, ++ {0x41be0, 0x0}, ++ {0x41be1, 0x0}, ++ {0x41be2, 0x0}, ++ {0x41be3, 0x0}, ++ {0x41be4, 0x0}, ++ {0x41be5, 0x0}, ++ {0x41be6, 0x0}, ++ {0x41be7, 0x0}, ++ {0x41be8, 0x0}, ++ {0x41be9, 0x0}, ++ {0x41bea, 0x0}, ++ {0x41beb, 0x0}, ++ {0x41bec, 0x0}, ++ {0x41bed, 0x0}, ++ {0x41bee, 0x0}, ++ {0x41bef, 0x0}, ++ {0x41bf0, 0x0}, ++ {0x41bf1, 0x0}, ++ {0x41bf2, 0x0}, ++ {0x41bf3, 0x0}, ++ {0x41bf4, 0x0}, ++ {0x41bf5, 0x0}, ++ {0x41bf6, 0x0}, ++ {0x41bf7, 0x0}, ++ {0x41bf8, 0x0}, ++ {0x41bf9, 0x0}, ++ {0x41bfa, 0x0}, ++ {0x41bfb, 0x0}, ++ {0x41bfc, 0x0}, ++ {0x41bfd, 0x0}, ++ {0x41bfe, 0x0}, ++ {0x41bff, 0x0}, ++ {0x41c00, 0x0}, ++ {0x41c01, 0x0}, ++ {0x41c02, 0x0}, ++ {0x41c03, 0x0}, ++ {0x41c04, 0x0}, ++ {0x41c05, 0x0}, ++ {0x41c06, 0x0}, ++ {0x41c07, 0x0}, ++ {0x41c08, 0x0}, ++ {0x41c09, 0x0}, ++ {0x41c0a, 0x0}, ++ {0x41c0b, 0x0}, ++ {0x41c0c, 0x0}, ++ {0x41c0d, 0x0}, ++ {0x41c0e, 0x0}, ++ {0x41c0f, 0x0}, ++ {0x41c10, 0x0}, ++ {0x41c11, 0x0}, ++ {0x41c12, 0x0}, ++ {0x41c13, 0x0}, ++ {0x41c14, 0x0}, ++ {0x41c15, 0x0}, ++ {0x41c16, 0x0}, ++ {0x41c17, 0x0}, ++ {0x41c18, 0x0}, ++ {0x41c19, 0x0}, ++ {0x41c1a, 0x0}, ++ {0x41c1b, 0x0}, ++ {0x41c1c, 0x0}, ++ {0x41c1d, 0x0}, ++ {0x41c1e, 0x0}, ++ {0x41c1f, 0x0}, ++ {0x41c20, 0x0}, ++ {0x41c21, 0x0}, ++ {0x41c22, 0x0}, ++ {0x41c23, 0x0}, ++ {0x41c24, 0x0}, ++ {0x41c25, 0x0}, ++ {0x41c26, 0x0}, ++ {0x41c27, 0x0}, ++ {0x41c28, 0x0}, ++ {0x41c29, 0x0}, ++ {0x41c2a, 0x0}, ++ {0x41c2b, 0x0}, ++ {0x41c2c, 0x0}, ++ {0x41c2d, 0x0}, ++ {0x41c2e, 0x0}, ++ {0x41c2f, 0x0}, ++ {0x41c30, 0x0}, ++ {0x41c31, 0x0}, ++ {0x41c32, 0x0}, ++ {0x41c33, 0x0}, ++ {0x41c34, 0x0}, ++ {0x41c35, 0x0}, ++ {0x41c36, 0x0}, ++ {0x41c37, 0x0}, ++ {0x41c38, 0x0}, ++ {0x41c39, 0x0}, ++ {0x41c3a, 0x0}, ++ {0x41c3b, 0x0}, ++ {0x41c3c, 0x0}, ++ {0x41c3d, 0x0}, ++ {0x41c3e, 0x0}, ++ {0x41c3f, 0x0}, ++ {0x41c40, 0x0}, ++ {0x41c41, 0x0}, ++ {0x41c42, 0x0}, ++ {0x41c43, 0x0}, ++ {0x41c44, 0x0}, ++ {0x41c45, 0x0}, ++ {0x41c46, 0x0}, ++ {0x41c47, 0x0}, ++ {0x41c48, 0x0}, ++ {0x41c49, 0x0}, ++ {0x41c4a, 0x0}, ++ {0x41c4b, 0x0}, ++ {0x41c4c, 0x0}, ++ {0x41c4d, 0x0}, ++ {0x41c4e, 0x0}, ++ {0x41c4f, 0x0}, ++ {0x41c50, 0x0}, ++ {0x41c51, 0x0}, ++ {0x41c52, 0x0}, ++ {0x41c53, 0x0}, ++ {0x41c54, 0x0}, ++ {0x41c55, 0x0}, ++ {0x41c56, 0x0}, ++ {0x41c57, 0x0}, ++ {0x9002e, 0x0}, ++ {0x9002f, 0x0}, ++ {0x90030, 0x0}, ++ {0x90031, 0x0}, ++ {0x90032, 0x0}, ++ {0x90033, 0x0}, ++ {0x90034, 0x0}, ++ {0x90035, 0x0}, ++ {0x90036, 0x0}, ++ {0x90037, 0x0}, ++ {0x90038, 0x0}, ++ {0x90039, 0x0}, ++ {0x9003a, 0x0}, ++ {0x9003b, 0x0}, ++ {0x9003c, 0x0}, ++ {0x9003d, 0x0}, ++ {0x9003e, 0x0}, ++ {0x9003f, 0x0}, ++ {0x90040, 0x0}, ++ {0x90041, 0x0}, ++ {0x90042, 0x0}, ++ {0x90043, 0x0}, ++ {0x90044, 0x0}, ++ {0x90045, 0x0}, ++ {0x90046, 0x0}, ++ {0x90047, 0x0}, ++ {0x90048, 0x0}, ++ {0x90049, 0x0}, ++ {0x9004a, 0x0}, ++ {0x9004b, 0x0}, ++ {0x9004c, 0x0}, ++ {0x9004d, 0x0}, ++ {0x9004e, 0x0}, ++ {0x9004f, 0x0}, ++ {0x90050, 0x0}, ++ {0x90051, 0x0}, ++ {0x90052, 0x0}, ++ {0x90053, 0x0}, ++ {0x90054, 0x0}, ++ {0x90055, 0x0}, ++ {0x90056, 0x0}, ++ {0x90057, 0x0}, ++ {0x90058, 0x0}, ++ {0x90059, 0x0}, ++ {0x9005a, 0x0}, ++ {0x9005b, 0x0}, ++ {0x9005c, 0x0}, ++ {0x9005d, 0x0}, ++ {0x9005e, 0x0}, ++ {0x9005f, 0x0}, ++ {0x90060, 0x0}, ++ {0x90061, 0x0}, ++ {0x90062, 0x0}, ++ {0x90063, 0x0}, ++ {0x90064, 0x0}, ++ {0x90065, 0x0}, ++ {0x90066, 0x0}, ++ {0x90067, 0x0}, ++ {0x90068, 0x0}, ++ {0x90069, 0x0}, ++ {0x9006a, 0x0}, ++ {0x9006b, 0x0}, ++ {0x9006c, 0x0}, ++ {0x9006d, 0x0}, ++ {0x9006e, 0x0}, ++ {0x9006f, 0x0}, ++ {0x90070, 0x0}, ++ {0x90071, 0x0}, ++ {0x90072, 0x0}, ++ {0x90073, 0x0}, ++ {0x90074, 0x0}, ++ {0x90075, 0x0}, ++ {0x90076, 0x0}, ++ {0x90077, 0x0}, ++ {0x90078, 0x0}, ++ {0x90079, 0x0}, ++ {0x9007a, 0x0}, ++ {0x9007b, 0x0}, ++ {0x9007c, 0x0}, ++ {0x9007d, 0x0}, ++ {0x9007e, 0x0}, ++ {0x9007f, 0x0}, ++ {0x90080, 0x0}, ++ {0x90081, 0x0}, ++ {0x90082, 0x0}, ++ {0x90083, 0x0}, ++ {0x90084, 0x0}, ++ {0x90085, 0x0}, ++ {0x90086, 0x0}, ++ {0x90087, 0x0}, ++ {0x90088, 0x0}, ++ {0x90089, 0x0}, ++ {0x9008a, 0x0}, ++ {0x9008b, 0x0}, ++ {0x9008c, 0x0}, ++ {0x9008d, 0x0}, ++ {0x9008e, 0x0}, ++ {0x9008f, 0x0}, ++ {0x90090, 0x0}, ++ {0x90091, 0x0}, ++ {0x90092, 0x0}, ++ {0x90093, 0x0}, ++ {0x90094, 0x0}, ++ {0x90095, 0x0}, ++ {0x90096, 0x0}, ++ {0x90097, 0x0}, ++ {0x90098, 0x0}, ++ {0x90099, 0x0}, ++ {0x9009a, 0x0}, ++ {0x9009b, 0x0}, ++ {0x9009c, 0x0}, ++ {0x9009d, 0x0}, ++ {0x9009e, 0x0}, ++ {0x9009f, 0x0}, ++ {0x900a0, 0x0}, ++ {0x900a1, 0x0}, ++ {0x900a2, 0x0}, ++ {0x900a3, 0x0}, ++ {0x900a4, 0x0}, ++ {0x900a5, 0x0}, ++ {0x900a6, 0x0}, ++ {0x900a7, 0x0}, ++ {0x900a8, 0x0}, ++ {0x900a9, 0x0}, ++ {0x900aa, 0x0}, ++ {0x900ab, 0x0}, ++ {0x900ac, 0x0}, ++ {0x900ad, 0x0}, ++ {0x900ae, 0x0}, ++ {0x900af, 0x0}, ++ {0x900b0, 0x0}, ++ {0x900b1, 0x0}, ++ {0x900b2, 0x0}, ++ {0x900b3, 0x0}, ++ {0x900b4, 0x0}, ++ {0x900b5, 0x0}, ++ {0x900b6, 0x0}, ++ {0x900b7, 0x0}, ++ {0x900b8, 0x0}, ++ {0x900b9, 0x0}, ++ {0x900ba, 0x0}, ++ {0x900bb, 0x0}, ++ {0x900bc, 0x0}, ++ {0x900bd, 0x0}, ++ {0x900be, 0x0}, ++ {0x900bf, 0x0}, ++ {0x900c0, 0x0}, ++ {0x900c1, 0x0}, ++ {0x900c2, 0x0}, ++ {0x900c3, 0x0}, ++ {0x900c4, 0x0}, ++ {0x900c5, 0x0}, ++ {0x900c6, 0x0}, ++ {0x900c7, 0x0}, ++ {0x900c8, 0x0}, ++ {0x900c9, 0x0}, ++ {0x900ca, 0x0}, ++ {0x900cb, 0x0}, ++ {0x900cc, 0x0}, ++ {0x900cd, 0x0}, ++ {0x900ce, 0x0}, ++ {0x900cf, 0x0}, ++ {0x900d0, 0x0}, ++ {0x900d1, 0x0}, ++ {0x900d2, 0x0}, ++ {0x900d3, 0x0}, ++ {0x900d4, 0x0}, ++ {0x900d5, 0x0}, ++ {0x900d6, 0x0}, ++ {0x900d7, 0x0}, ++ {0x900d8, 0x0}, ++ {0x900d9, 0x0}, ++ {0x900da, 0x0}, ++ {0x900db, 0x0}, ++ {0x900dc, 0x0}, ++ {0x900dd, 0x0}, ++ {0x900de, 0x0}, ++ {0x900df, 0x0}, ++ {0x900e0, 0x0}, ++ {0x900e1, 0x0}, ++ {0x900e2, 0x0}, ++ {0x900e3, 0x0}, ++ {0x900e4, 0x0}, ++ {0x900e5, 0x0}, ++ {0x900e6, 0x0}, ++ {0x900e7, 0x0}, ++ {0x900e8, 0x0}, ++ {0x900e9, 0x0}, ++ {0x900ea, 0x0}, ++ {0x900eb, 0x0}, ++ {0x900ec, 0x0}, ++ {0x900ed, 0x0}, ++ {0x900ee, 0x0}, ++ {0x900ef, 0x0}, ++ {0x900f0, 0x0}, ++ {0x900f1, 0x0}, ++ {0x900f2, 0x0}, ++ {0x900f3, 0x0}, ++ {0x900f4, 0x0}, ++ {0x900f5, 0x0}, ++ {0x900f6, 0x0}, ++ {0x900f7, 0x0}, ++ {0x900f8, 0x0}, ++ {0x900f9, 0x0}, ++ {0x900fa, 0x0}, ++ {0x900fb, 0x0}, ++ {0x900fc, 0x0}, ++ {0x900fd, 0x0}, ++ {0x900fe, 0x0}, ++ {0x900ff, 0x0}, ++ {0x90100, 0x0}, ++ {0x90101, 0x0}, ++ {0x90102, 0x0}, ++ {0x90103, 0x0}, ++ {0x90104, 0x0}, ++ {0x90105, 0x0}, ++ {0x90106, 0x0}, ++ {0x90107, 0x0}, ++ {0x90108, 0x0}, ++ {0x90109, 0x0}, ++ {0x9010a, 0x0}, ++ {0x9010b, 0x0}, ++ {0x9010c, 0x0}, ++ {0x9010d, 0x0}, ++ {0x9010e, 0x0}, ++ {0x9010f, 0x0}, ++ {0x90110, 0x0}, ++ {0x90111, 0x0}, ++ {0x90112, 0x0}, ++ {0x90113, 0x0}, ++ {0x90114, 0x0}, ++ {0x90115, 0x0}, ++ {0x90116, 0x0}, ++ {0x90117, 0x0}, ++ {0x90118, 0x0}, ++ {0x90119, 0x0}, ++ {0x9011a, 0x0}, ++ {0x9011b, 0x0}, ++ {0x9011c, 0x0}, ++ {0x9011d, 0x0}, ++ {0x9011e, 0x0}, ++ {0x9011f, 0x0}, ++ {0x90120, 0x0}, ++ {0x90121, 0x0}, ++ {0x90122, 0x0}, ++ {0x90123, 0x0}, ++ {0x90124, 0x0}, ++ {0x90125, 0x0}, ++ {0x90126, 0x0}, ++ {0x90127, 0x0}, ++ {0x90128, 0x0}, ++ {0x90129, 0x0}, ++ {0x9012a, 0x0}, ++ {0x9012b, 0x0}, ++ {0x9012c, 0x0}, ++ {0x9012d, 0x0}, ++ {0x9012e, 0x0}, ++ {0x9012f, 0x0}, ++ {0x90130, 0x0}, ++ {0x90131, 0x0}, ++ {0x90132, 0x0}, ++ {0x90133, 0x0}, ++ {0x90134, 0x0}, ++ {0x90135, 0x0}, ++ {0x90136, 0x0}, ++ {0x90137, 0x0}, ++ {0x90138, 0x0}, ++ {0x90139, 0x0}, ++ {0x9013a, 0x0}, ++ {0x9013b, 0x0}, ++ {0x9013c, 0x0}, ++ {0x9013d, 0x0}, ++ {0x9013e, 0x0}, ++ {0x9013f, 0x0}, ++ {0x90140, 0x0}, ++ {0x90141, 0x0}, ++ {0x90142, 0x0}, ++ {0x90143, 0x0}, ++ {0x90144, 0x0}, ++ {0x90145, 0x0}, ++ {0x90146, 0x0}, ++ {0x90147, 0x0}, ++ {0x90148, 0x0}, ++ {0x90149, 0x0}, ++ {0x9014a, 0x0}, ++ {0x9014b, 0x0}, ++ {0x9014c, 0x0}, ++ {0x9014d, 0x0}, ++ {0x9014e, 0x0}, ++ {0x9014f, 0x0}, ++ {0x90150, 0x0}, ++ {0x90151, 0x0}, ++ {0x90152, 0x0}, ++ {0x90153, 0x0}, ++ {0x90154, 0x0}, ++ {0x90155, 0x0}, ++ {0x90156, 0x0}, ++ {0x90157, 0x0}, ++ {0x90158, 0x0}, ++ {0x90159, 0x0}, ++ {0x9015a, 0x0}, ++ {0x9015b, 0x0}, ++ {0x9015c, 0x0}, ++ {0x9015d, 0x0}, ++ {0x9015e, 0x0}, ++ {0x9015f, 0x0}, ++ {0x90160, 0x0}, ++ {0x90161, 0x0}, ++ {0x90162, 0x0}, ++ {0x90163, 0x0}, ++ {0x90164, 0x0}, ++ {0x90165, 0x0}, ++ {0x90166, 0x0}, ++ {0x90167, 0x0}, ++ {0x90168, 0x0}, ++ {0x90169, 0x0}, ++ {0x9016a, 0x0}, ++ {0x9016b, 0x0}, ++ {0x9016c, 0x0}, ++ {0x9016d, 0x0}, ++ {0x9016e, 0x0}, ++ {0x9016f, 0x0}, ++ {0x90170, 0x0}, ++ {0x90171, 0x0}, ++ {0x90172, 0x0}, ++ {0x90173, 0x0}, ++ {0x90174, 0x0}, ++ {0x90175, 0x0}, ++ {0x90176, 0x0}, ++ {0x90177, 0x0}, ++ {0x90178, 0x0}, ++ {0x90179, 0x0}, ++ {0x9017a, 0x0}, ++ {0x9017b, 0x0}, ++ {0x9017c, 0x0}, ++ {0x9017d, 0x0}, ++ {0x9017e, 0x0}, ++ {0x9017f, 0x0}, ++ {0x90180, 0x0}, ++ {0x90181, 0x0}, ++ {0x90182, 0x0}, ++ {0x90183, 0x0}, ++ {0x90184, 0x0}, ++ {0x90185, 0x0}, ++ {0x90186, 0x0}, ++ {0x90187, 0x0}, ++ {0x90188, 0x0}, ++ {0x90189, 0x0}, ++ {0x9018a, 0x0}, ++ {0x9018b, 0x0}, ++ {0x9018c, 0x0}, ++ {0x9018d, 0x0}, ++ {0x9018e, 0x0}, ++ {0x9018f, 0x0}, ++ {0x90190, 0x0}, ++ {0x90191, 0x0}, ++ {0x90192, 0x0}, ++ {0x90193, 0x0}, ++ {0x90194, 0x0}, ++ {0x90195, 0x0}, ++ {0x90196, 0x0}, ++ {0x90197, 0x0}, ++ {0x90198, 0x0}, ++ {0x90199, 0x0}, ++ {0x9019a, 0x0}, ++ {0x9019b, 0x0}, ++ {0x9019c, 0x0}, ++ {0x9019d, 0x0}, ++ {0x9019e, 0x0}, ++ {0x9019f, 0x0}, ++ {0x901a0, 0x0}, ++ {0x901a1, 0x0}, ++ {0x901a2, 0x0}, ++ {0x901a3, 0x0}, ++ {0x901a4, 0x0}, ++ {0x901a5, 0x0}, ++ {0x901a6, 0x0}, ++ {0x901a7, 0x0}, ++ {0x901a8, 0x0}, ++ {0x901a9, 0x0}, ++ {0x901aa, 0x0}, ++ {0x901ab, 0x0}, ++ {0x901ac, 0x0}, ++ {0x901ad, 0x0}, ++ {0x901ae, 0x0}, ++ {0x901af, 0x0}, ++ {0x901b0, 0x0}, ++ {0x901b1, 0x0}, ++ {0x901b2, 0x0}, ++ {0x901b3, 0x0}, ++ {0x901b4, 0x0}, ++ {0x901b5, 0x0}, ++ {0x901b6, 0x0}, ++ {0x901b7, 0x0}, ++ {0x901b8, 0x0}, ++ {0x901b9, 0x0}, ++ {0x901ba, 0x0}, ++ {0x901bb, 0x0}, ++ {0x901bc, 0x0}, ++ {0x901bd, 0x0}, ++ {0x901be, 0x0}, ++ {0x901bf, 0x0}, ++ {0x901c0, 0x0}, ++ {0x901c1, 0x0}, ++ {0x901c2, 0x0}, ++ {0x901c3, 0x0}, ++ {0x901c4, 0x0}, ++ {0x901c5, 0x0}, ++ {0x901c6, 0x0}, ++ {0x901c7, 0x0}, ++ {0x901c8, 0x0}, ++ {0x901c9, 0x0}, ++ {0x901ca, 0x0}, ++ {0x901cb, 0x0}, ++ {0x901cc, 0x0}, ++ {0x901cd, 0x0}, ++ {0x901ce, 0x0}, ++ {0x901cf, 0x0}, ++ {0x901d0, 0x0}, ++ {0x901d1, 0x0}, ++ {0x901d2, 0x0}, ++ {0x901d3, 0x0}, ++ {0x901d4, 0x0}, ++ {0x901d5, 0x0}, ++ {0x901d6, 0x0}, ++ {0x901d7, 0x0}, ++ {0x901d8, 0x0}, ++ {0x901d9, 0x0}, ++ {0x901da, 0x0}, ++ {0x901db, 0x0}, ++ {0x901dc, 0x0}, ++ {0x901dd, 0x0}, ++ {0x901de, 0x0}, ++ {0x901df, 0x0}, ++ {0x901e0, 0x0}, ++ {0x901e1, 0x0}, ++ {0x901e2, 0x0}, ++ {0x901e3, 0x0}, ++ {0x901e4, 0x0}, ++ {0x901e5, 0x0}, ++ {0x901e6, 0x0}, ++ {0x901e7, 0x0}, ++ {0x901e8, 0x0}, ++ {0x901e9, 0x0}, ++ {0x901ea, 0x0}, ++ {0x901eb, 0x0}, ++ {0x901ec, 0x0}, ++ {0x901ed, 0x0}, ++ {0x901ee, 0x0}, ++ {0x901ef, 0x0}, ++ {0x901f0, 0x0}, ++ {0x901f1, 0x0}, ++ {0x901f2, 0x0}, ++ {0x901f3, 0x0}, ++ {0x901f4, 0x0}, ++ {0x901f5, 0x0}, ++ {0x901f6, 0x0}, ++ {0x901f7, 0x0}, ++ {0x901f8, 0x0}, ++ {0x901f9, 0x0}, ++ {0x901fa, 0x0}, ++ {0x901fb, 0x0}, ++ {0x901fc, 0x0}, ++ {0x901fd, 0x0}, ++ {0x901fe, 0x0}, ++ {0x901ff, 0x0}, ++ {0x90200, 0x0}, ++ {0x90201, 0x0}, ++ {0x90202, 0x0}, ++ {0x90203, 0x0}, ++ {0x90204, 0x0}, ++ {0x90205, 0x0}, ++ {0x90206, 0x0}, ++ {0x90207, 0x0}, ++ {0x90208, 0x0}, ++ {0x90209, 0x0}, ++ {0x9020a, 0x0}, ++ {0x9020b, 0x0}, ++ {0x9020c, 0x0}, ++ {0x9020d, 0x0}, ++ {0x9020e, 0x0}, ++ {0x9020f, 0x0}, ++ {0x90210, 0x0}, ++ {0x90211, 0x0}, ++ {0x90212, 0x0}, ++ {0x90213, 0x0}, ++ {0x90214, 0x0}, ++ {0x90215, 0x0}, ++ {0x90216, 0x0}, ++ {0x90217, 0x0}, ++ {0x90218, 0x0}, ++ {0x90219, 0x0}, ++ {0x9021a, 0x0}, ++ {0x9021b, 0x0}, ++ {0x9021c, 0x0}, ++ {0x9021d, 0x0}, ++ {0x9021e, 0x0}, ++ {0x9021f, 0x0}, ++ {0x90220, 0x0}, ++ {0x90221, 0x0}, ++ {0x90222, 0x0}, ++ {0x90223, 0x0}, ++ {0x90224, 0x0}, ++ {0x90225, 0x0}, ++ {0x90226, 0x0}, ++ {0x90227, 0x0}, ++ {0x90228, 0x0}, ++ {0x90229, 0x0}, ++ {0x9022a, 0x0}, ++ {0x9022b, 0x0}, ++ {0x9022c, 0x0}, ++ {0x9022d, 0x0}, ++ {0x9022e, 0x0}, ++ {0x9022f, 0x0}, ++ {0x90230, 0x0}, ++ {0x90231, 0x0}, ++ {0x90232, 0x0}, ++ {0x90233, 0x0}, ++ {0x90234, 0x0}, ++ {0x90235, 0x0}, ++ {0x90236, 0x0}, ++ {0x90237, 0x0}, ++ {0x90238, 0x0}, ++ {0x90239, 0x0}, ++ {0x9023a, 0x0}, ++ {0x9023b, 0x0}, ++ {0x9023c, 0x0}, ++ {0x9023d, 0x0}, ++ {0x9023e, 0x0}, ++ {0x9023f, 0x0}, ++ {0x90240, 0x0}, ++ {0x90241, 0x0}, ++ {0x90242, 0x0}, ++ {0x90243, 0x0}, ++ {0x90244, 0x0}, ++ {0x90245, 0x0}, ++ {0x90246, 0x0}, ++ {0x90247, 0x0}, ++ {0x90248, 0x0}, ++ {0x90249, 0x0}, ++ {0x9024a, 0x0}, ++ {0x9024b, 0x0}, ++ {0x9024c, 0x0}, ++ {0x9024d, 0x0}, ++ {0x9024e, 0x0}, ++ {0x9024f, 0x0}, ++ {0x90250, 0x0}, ++ {0x90251, 0x0}, ++ {0x90252, 0x0}, ++ {0x90253, 0x0}, ++ {0x90254, 0x0}, ++ {0x90255, 0x0}, ++ {0x90256, 0x0}, ++ {0x90257, 0x0}, ++ {0x90258, 0x0}, ++ {0x90259, 0x0}, ++ {0x9025a, 0x0}, ++ {0x9025b, 0x0}, ++ {0x9025c, 0x0}, ++ {0x9025d, 0x0}, ++ {0x9025e, 0x0}, ++ {0x9025f, 0x0}, ++ {0x90260, 0x0}, ++ {0x90261, 0x0}, ++ {0x90262, 0x0}, ++ {0x90263, 0x0}, ++ {0x90264, 0x0}, ++ {0x90265, 0x0}, ++ {0x90266, 0x0}, ++ {0x90267, 0x0}, ++ {0x90268, 0x0}, ++ {0x90269, 0x0}, ++ {0x9026a, 0x0}, ++ {0x9026b, 0x0}, ++ {0x9026c, 0x0}, ++ {0x9026d, 0x0}, ++ {0x9026e, 0x0}, ++ {0x9026f, 0x0}, ++ {0x90270, 0x0}, ++ {0x90271, 0x0}, ++ {0x90272, 0x0}, ++ {0x90273, 0x0}, ++ {0x90274, 0x0}, ++ {0x90275, 0x0}, ++ {0x90276, 0x0}, ++ {0x90277, 0x0}, ++ {0x90278, 0x0}, ++ {0x90279, 0x0}, ++ {0x9027a, 0x0}, ++ {0x9027b, 0x0}, ++ {0x9027c, 0x0}, ++ {0x9027d, 0x0}, ++ {0x9027e, 0x0}, ++ {0x9027f, 0x0}, ++ {0x90280, 0x0}, ++ {0x90281, 0x0}, ++ {0x90282, 0x0}, ++ {0x90283, 0x0}, ++ {0x90284, 0x0}, ++ {0x90285, 0x0}, ++ {0x90286, 0x0}, ++ {0x90287, 0x0}, ++ {0x90288, 0x0}, ++ {0x90289, 0x0}, ++ {0x9028a, 0x0}, ++ {0x9028b, 0x0}, ++ {0x9028c, 0x0}, ++ {0x9028d, 0x0}, ++ {0x9028e, 0x0}, ++ {0x9028f, 0x0}, ++ {0x90290, 0x0}, ++ {0x90291, 0x0}, ++ {0x90292, 0x0}, ++ {0x90293, 0x0}, ++ {0x90294, 0x0}, ++ {0x90295, 0x0}, ++ {0x90296, 0x0}, ++ {0x90297, 0x0}, ++ {0x90298, 0x0}, ++ {0x90299, 0x0}, ++ {0x9029a, 0x0}, ++ {0x9029b, 0x0}, ++ {0x9029c, 0x0}, ++ {0x9029d, 0x0}, ++ {0x9029e, 0x0}, ++ {0x9029f, 0x0}, ++ {0x902a0, 0x0}, ++ {0x902a1, 0x0}, ++ {0x902a2, 0x0}, ++ {0x902a3, 0x0}, ++ {0x902a4, 0x0}, ++ {0x902a5, 0x0}, ++ {0x902a6, 0x0}, ++ {0x902a7, 0x0}, ++ {0x902a8, 0x0}, ++ {0x902a9, 0x0}, ++ {0x902aa, 0x0}, ++ {0x902ab, 0x0}, ++ {0x902ac, 0x0}, ++ {0x902ad, 0x0}, ++ {0x902ae, 0x0}, ++ {0x902af, 0x0}, ++ {0x902b0, 0x0}, ++ {0x902b1, 0x0}, ++ {0x902b2, 0x0}, ++ {0x902b3, 0x0}, ++ {0x902b4, 0x0}, ++ {0x902b5, 0x0}, ++ {0x902b6, 0x0}, ++ {0x902b7, 0x0}, ++ {0x902b8, 0x0}, ++ {0x902b9, 0x0}, ++ {0x902ba, 0x0}, ++ {0x902bb, 0x0}, ++ {0x902bc, 0x0}, ++ {0x902bd, 0x0}, ++ {0x902be, 0x0}, ++ {0x902bf, 0x0}, ++ {0x902c0, 0x0}, ++ {0x902c1, 0x0}, ++ {0x902c2, 0x0}, ++ {0x902c3, 0x0}, ++ {0x902c4, 0x0}, ++ {0x902c5, 0x0}, ++ {0x902c6, 0x0}, ++ {0x902c7, 0x0}, ++ {0x902c8, 0x0}, ++ {0x902c9, 0x0}, ++ {0x902ca, 0x0}, ++ {0x902cb, 0x0}, ++ {0x902cc, 0x0}, ++ {0x902cd, 0x0}, ++ {0x902ce, 0x0}, ++ {0x902cf, 0x0}, ++ {0x902d0, 0x0}, ++ {0x902d1, 0x0}, ++ {0x902d2, 0x0}, ++ {0x902d3, 0x0}, ++ {0x902d4, 0x0}, ++ {0x902d5, 0x0}, ++ {0x902d6, 0x0}, ++ {0x902d7, 0x0}, ++ {0x902d8, 0x0}, ++ {0x902d9, 0x0}, ++ {0x902da, 0x0}, ++ {0x902db, 0x0}, ++ {0x902dc, 0x0}, ++ {0x902dd, 0x0}, ++ {0x902de, 0x0}, ++ {0x902df, 0x0}, ++ {0x902e0, 0x0}, ++ {0x902e1, 0x0}, ++ {0x902e2, 0x0}, ++ {0x902e3, 0x0}, ++ {0x902e4, 0x0}, ++ {0x902e5, 0x0}, ++ {0x902e6, 0x0}, ++ {0x902e7, 0x0}, ++ {0x902e8, 0x0}, ++ {0x902e9, 0x0}, ++ {0x902ea, 0x0}, ++ {0x902eb, 0x0}, ++ {0x902ec, 0x0}, ++ {0x902ed, 0x0}, ++ {0x902ee, 0x0}, ++ {0x902ef, 0x0}, ++ {0x902f0, 0x0}, ++ {0x902f1, 0x0}, ++ {0x902f2, 0x0}, ++ {0x902f3, 0x0}, ++ {0x902f4, 0x0}, ++ {0x902f5, 0x0}, ++ {0x902f6, 0x0}, ++ {0x902f7, 0x0}, ++ {0x902f8, 0x0}, ++ {0x902f9, 0x0}, ++ {0x902fa, 0x0}, ++ {0x902fb, 0x0}, ++ {0x902fc, 0x0}, ++ {0x902fd, 0x0}, ++ {0x902fe, 0x0}, ++ {0x902ff, 0x0}, ++ {0x90300, 0x0}, ++ {0x90301, 0x0}, ++ {0x90302, 0x0}, ++ {0x90303, 0x0}, ++ {0x90304, 0x0}, ++ {0x90305, 0x0}, ++ {0x90306, 0x0}, ++ {0x90307, 0x0}, ++ {0x90308, 0x0}, ++ {0x90309, 0x0}, ++ {0x9030a, 0x0}, ++ {0x9030b, 0x0}, ++ {0x9030c, 0x0}, ++ {0x9030d, 0x0}, ++ {0x9030e, 0x0}, ++ {0x9030f, 0x0}, ++ {0x90310, 0x0}, ++ {0x90311, 0x0}, ++ {0x90312, 0x0}, ++ {0x90313, 0x0}, ++ {0x90314, 0x0}, ++ {0x90315, 0x0}, ++ {0x90316, 0x0}, ++ {0x90317, 0x0}, ++ {0x90318, 0x0}, ++ {0x90319, 0x0}, ++ {0x9031a, 0x0}, ++ {0x9031b, 0x0}, ++ {0x9031c, 0x0}, ++ {0x9031d, 0x0}, ++ {0x9031e, 0x0}, ++ {0x9031f, 0x0}, ++ {0x90320, 0x0}, ++ {0x90321, 0x0}, ++ {0x90322, 0x0}, ++ {0x90323, 0x0}, ++ {0x90324, 0x0}, ++ {0x90325, 0x0}, ++ {0x90326, 0x0}, ++ {0x90327, 0x0}, ++ {0x90328, 0x0}, ++ {0x90329, 0x0}, ++ {0x9032a, 0x0}, ++ {0x9032b, 0x0}, ++ {0x9032c, 0x0}, ++ {0x9032d, 0x0}, ++ {0x9032e, 0x0}, ++ {0x9032f, 0x0}, ++ {0x90330, 0x0}, ++ {0x90331, 0x0}, ++ {0x90332, 0x0}, ++ {0x90333, 0x0}, ++ {0x90334, 0x0}, ++ {0x90335, 0x0}, ++ {0x90336, 0x0}, ++ {0x90337, 0x0}, ++ {0x90338, 0x0}, ++ {0x90339, 0x0}, ++ {0x9033a, 0x0}, ++ {0x9033b, 0x0}, ++ {0x9033c, 0x0}, ++ {0x9033d, 0x0}, ++ {0x9033e, 0x0}, ++ {0x9033f, 0x0}, ++ {0x90340, 0x0}, ++ {0x90341, 0x0}, ++ {0x90342, 0x0}, ++ {0x90343, 0x0}, ++ {0x90344, 0x0}, ++ {0x90345, 0x0}, ++ {0x90346, 0x0}, ++ {0x90347, 0x0}, ++ {0x90348, 0x0}, ++ {0x90349, 0x0}, ++ {0x9034a, 0x0}, ++ {0x9034b, 0x0}, ++ {0x9034c, 0x0}, ++ {0x9034d, 0x0}, ++ {0x9034e, 0x0}, ++ {0x9034f, 0x0}, ++ {0x90350, 0x0}, ++ {0x90351, 0x0}, ++ {0x90352, 0x0}, ++ {0x90353, 0x0}, ++ {0x90354, 0x0}, ++ {0x90355, 0x0}, ++ {0x90356, 0x0}, ++ {0x90357, 0x0}, ++ {0x90358, 0x0}, ++ {0x90359, 0x0}, ++ {0x9035a, 0x0}, ++ {0x9035b, 0x0}, ++ {0x9035c, 0x0}, ++ {0x9035d, 0x0}, ++ {0x9035e, 0x0}, ++ {0x9035f, 0x0}, ++ {0x90360, 0x0}, ++ {0x90361, 0x0}, ++ {0x90362, 0x0}, ++ {0x90363, 0x0}, ++ {0x90364, 0x0}, ++ {0x90365, 0x0}, ++ {0x90366, 0x0}, ++ {0x90367, 0x0}, ++ {0x90368, 0x0}, ++ {0x90369, 0x0}, ++ {0x9036a, 0x0}, ++ {0x9036b, 0x0}, ++ {0x9036c, 0x0}, ++ {0x9036d, 0x0}, ++ {0x9036e, 0x0}, ++ {0x9036f, 0x0}, ++ {0x90370, 0x0}, ++ {0x90371, 0x0}, ++ {0x90372, 0x0}, ++ {0x90373, 0x0}, ++ {0x90374, 0x0}, ++ {0x90375, 0x0}, ++ {0x90376, 0x0}, ++ {0x90377, 0x0}, ++ {0x90378, 0x0}, ++ {0x90379, 0x0}, ++ {0x9037a, 0x0}, ++ {0x9037b, 0x0}, ++ {0x9037c, 0x0}, ++ {0x9037d, 0x0}, ++ {0x9037e, 0x0}, ++ {0x9037f, 0x0}, ++ {0x90380, 0x0}, ++ {0x90381, 0x0}, ++ {0x90382, 0x0}, ++ {0x90383, 0x0}, ++ {0x90384, 0x0}, ++ {0x90385, 0x0}, ++ {0x90386, 0x0}, ++ {0x90387, 0x0}, ++ {0x90388, 0x0}, ++ {0x90389, 0x0}, ++ {0x9038a, 0x0}, ++ {0x9038b, 0x0}, ++ {0x9038c, 0x0}, ++ {0x9038d, 0x0}, ++ {0x9038e, 0x0}, ++ {0x9038f, 0x0}, ++ {0x90390, 0x0}, ++ {0x90391, 0x0}, ++ {0x90392, 0x0}, ++ {0x90393, 0x0}, ++ {0x90394, 0x0}, ++ {0x90395, 0x0}, ++ {0x90396, 0x0}, ++ {0x90397, 0x0}, ++ {0x90398, 0x0}, ++ {0x90399, 0x0}, ++ {0x9039a, 0x0}, ++ {0x9039b, 0x0}, ++ {0x9039c, 0x0}, ++ {0x9039d, 0x0}, ++ {0x9039e, 0x0}, ++ {0x9039f, 0x0}, ++ {0x903a0, 0x0}, ++ {0x903a1, 0x0}, ++ {0x903a2, 0x0}, ++ {0x903a3, 0x0}, ++ {0x903a4, 0x0}, ++ {0x903a5, 0x0}, ++ {0x903a6, 0x0}, ++ {0x903a7, 0x0}, ++ {0x903a8, 0x0}, ++ {0x903a9, 0x0}, ++ {0x903aa, 0x0}, ++ {0x903ab, 0x0}, ++ {0x903ac, 0x0}, ++ {0x903ad, 0x0}, ++ {0x903ae, 0x0}, ++ {0x903af, 0x0}, ++ {0x903b0, 0x0}, ++ {0x903b1, 0x0}, ++ {0x903b2, 0x0}, ++ {0x903b3, 0x0}, ++ {0x903b4, 0x0}, ++ {0x903b5, 0x0}, ++ {0x903b6, 0x0}, ++ {0x903b7, 0x0}, ++ {0x903b8, 0x0}, ++ {0x903b9, 0x0}, ++ {0x903ba, 0x0}, ++ {0x903bb, 0x0}, ++ {0x903bc, 0x0}, ++ {0x903bd, 0x0}, ++ {0x903be, 0x0}, ++ {0x903bf, 0x0}, ++ {0x903c0, 0x0}, ++ {0x903c1, 0x0}, ++ {0x903c2, 0x0}, ++ {0x903c3, 0x0}, ++ {0x903c4, 0x0}, ++ {0x903c5, 0x0}, ++ {0x903c6, 0x0}, ++ {0x903c7, 0x0}, ++ {0x903c8, 0x0}, ++ {0x903c9, 0x0}, ++ {0x903ca, 0x0}, ++ {0x903cb, 0x0}, ++ {0x903cc, 0x0}, ++ {0x903cd, 0x0}, ++ {0x903ce, 0x0}, ++ {0x903cf, 0x0}, ++ {0x903d0, 0x0}, ++ {0x903d1, 0x0}, ++ {0x903d2, 0x0}, ++ {0x903d3, 0x0}, ++ {0x903d4, 0x0}, ++ {0x903d5, 0x0}, ++ {0x903d6, 0x0}, ++ {0x903d7, 0x0}, ++ {0x903d8, 0x0}, ++ {0x903d9, 0x0}, ++ {0x903da, 0x0}, ++ {0x903db, 0x0}, ++ {0x903dc, 0x0}, ++ {0x903dd, 0x0}, ++ {0x903de, 0x0}, ++ {0x903df, 0x0}, ++ {0x903e0, 0x0}, ++ {0x903e1, 0x0}, ++ {0x903e2, 0x0}, ++ {0x903e3, 0x0}, ++ {0x903e4, 0x0}, ++ {0x903e5, 0x0}, ++ {0x903e6, 0x0}, ++ {0x903e7, 0x0}, ++ {0x903e8, 0x0}, ++ {0x903e9, 0x0}, ++ {0x903ea, 0x0}, ++ {0x903eb, 0x0}, ++ {0x903ec, 0x0}, ++ {0x903ed, 0x0}, ++ {0x903ee, 0x0}, ++ {0x903ef, 0x0}, ++ {0x903f0, 0x0}, ++ {0x903f1, 0x0}, ++ {0x903f2, 0x0}, ++ {0x903f3, 0x0}, ++ {0x903f4, 0x0}, ++ {0x903f5, 0x0}, ++ {0x903f6, 0x0}, ++ {0x903f7, 0x0}, ++ {0x903f8, 0x0}, ++ {0x903f9, 0x0}, ++ {0x903fa, 0x0}, ++ {0x903fb, 0x0}, ++ {0x903fc, 0x0}, ++ {0x903fd, 0x0}, ++ {0x903fe, 0x0}, ++ {0x903ff, 0x0}, ++ {0x90400, 0x0}, ++ {0x90401, 0x0}, ++ {0x90402, 0x0}, ++ {0x90403, 0x0}, ++ {0x90404, 0x0}, ++ {0x90405, 0x0}, ++ {0x90406, 0x0}, ++ {0x90407, 0x0}, ++ {0x90408, 0x0}, ++ {0x90409, 0x0}, ++ {0x9040a, 0x0}, ++ {0x9040b, 0x0}, ++ {0x9040c, 0x0}, ++ {0x9040d, 0x0}, ++ {0x9040e, 0x0}, ++ {0x9040f, 0x0}, ++ {0x90410, 0x0}, ++ {0x90411, 0x0}, ++ {0x90412, 0x0}, ++ {0x90413, 0x0}, ++ {0x90414, 0x0}, ++ {0x90415, 0x0}, ++ {0x90416, 0x0}, ++ {0x90417, 0x0}, ++ {0x90418, 0x0}, ++ {0x90419, 0x0}, ++ {0x9041a, 0x0}, ++ {0x9041b, 0x0}, ++ {0x9041c, 0x0}, ++ {0x9041d, 0x0}, ++ {0x9041e, 0x0}, ++ {0x9041f, 0x0}, ++ {0x90420, 0x0}, ++ {0x90421, 0x0}, ++ {0x90422, 0x0}, ++ {0x90423, 0x0}, ++ {0x90424, 0x0}, ++ {0x90425, 0x0}, ++ {0x90426, 0x0}, ++ {0x90427, 0x0}, ++ {0x90428, 0x0}, ++ {0x90429, 0x0}, ++ {0x9042a, 0x0}, ++ {0x9042b, 0x0}, ++ {0x9042c, 0x0}, ++ {0x9042d, 0x0}, ++ {0x9042e, 0x0}, ++ {0x9042f, 0x0}, ++ {0x90430, 0x0}, ++ {0x90431, 0x0}, ++ {0x90432, 0x0}, ++ {0x90433, 0x0}, ++ {0x90434, 0x0}, ++ {0x90435, 0x0}, ++ {0x90436, 0x0}, ++ {0x90437, 0x0}, ++ {0x90438, 0x0}, ++ {0x90439, 0x0}, ++ {0x9043a, 0x0}, ++ {0x9043b, 0x0}, ++ {0x9043c, 0x0}, ++ {0x9043d, 0x0}, ++ {0x9043e, 0x0}, ++ {0x9043f, 0x0}, ++ {0x90440, 0x0}, ++ {0x90441, 0x0}, ++ {0x90442, 0x0}, ++ {0x90443, 0x0}, ++ {0x90444, 0x0}, ++ {0x90445, 0x0}, ++ {0x90446, 0x0}, ++ {0x90447, 0x0}, ++ {0x90448, 0x0}, ++ {0x90449, 0x0}, ++ {0x9044a, 0x0}, ++ {0x9044b, 0x0}, ++ {0x9044c, 0x0}, ++ {0x9044d, 0x0}, ++ {0x9044e, 0x0}, ++ {0x9044f, 0x0}, ++ {0x90450, 0x0}, ++ {0x90451, 0x0}, ++ {0x90452, 0x0}, ++ {0x90453, 0x0}, ++ {0x90454, 0x0}, ++ {0x90455, 0x0}, ++ {0x90456, 0x0}, ++ {0x90457, 0x0}, ++ {0x90458, 0x0}, ++ {0x90459, 0x0}, ++ {0x9045a, 0x0}, ++ {0x9045b, 0x0}, ++ {0x9045c, 0x0}, ++ {0x9045d, 0x0}, ++ {0x9045e, 0x0}, ++ {0x9045f, 0x0}, ++ {0x90460, 0x0}, ++ {0x90461, 0x0}, ++ {0x90462, 0x0}, ++ {0x90463, 0x0}, ++ {0x90464, 0x0}, ++ {0x90465, 0x0}, ++ {0x90466, 0x0}, ++ {0x90467, 0x0}, ++ {0x90468, 0x0}, ++ {0x90469, 0x0}, ++ {0x9046a, 0x0}, ++ {0x9046b, 0x0}, ++ {0x9046c, 0x0}, ++ {0x9046d, 0x0}, ++ {0x9046e, 0x0}, ++ {0x9046f, 0x0}, ++ {0x90470, 0x0}, ++ {0x90471, 0x0}, ++ {0x90472, 0x0}, ++ {0x90473, 0x0}, ++ {0x90474, 0x0}, ++ {0x90475, 0x0}, ++ {0x90476, 0x0}, ++ {0x90477, 0x0}, ++ {0x90478, 0x0}, ++ {0x90479, 0x0}, ++ {0x9047a, 0x0}, ++ {0x9047b, 0x0}, ++ {0x9047c, 0x0}, ++ {0x9047d, 0x0}, ++ {0x9047e, 0x0}, ++ {0x9047f, 0x0}, ++ {0x90480, 0x0}, ++ {0x90481, 0x0}, ++ {0x90482, 0x0}, ++ {0x90483, 0x0}, ++ {0x90484, 0x0}, ++ {0x90485, 0x0}, ++ {0x90486, 0x0}, ++ {0x90487, 0x0}, ++ {0x90488, 0x0}, ++ {0x90489, 0x0}, ++ {0x9048a, 0x0}, ++ {0x9048b, 0x0}, ++ {0x9048c, 0x0}, ++ {0x9048d, 0x0}, ++ {0x9048e, 0x0}, ++ {0x9048f, 0x0}, ++ {0x90490, 0x0}, ++ {0x90491, 0x0}, ++ {0x90492, 0x0}, ++ {0x90493, 0x0}, ++ {0x90494, 0x0}, ++ {0x90495, 0x0}, ++ {0x90496, 0x0}, ++ {0x90497, 0x0}, ++ {0x90498, 0x0}, ++ {0x90499, 0x0}, ++ {0x9049a, 0x0}, ++ {0x9049b, 0x0}, ++ {0x9049c, 0x0}, ++ {0x9049d, 0x0}, ++ {0x9049e, 0x0}, ++ {0x9049f, 0x0}, ++ {0x904a0, 0x0}, ++ {0x904a1, 0x0}, ++ {0x904a2, 0x0}, ++ {0x904a3, 0x0}, ++ {0x904a4, 0x0}, ++ {0x904a5, 0x0}, ++ {0x904a6, 0x0}, ++ {0x904a7, 0x0}, ++ {0x904a8, 0x0}, ++ {0x904a9, 0x0}, ++ {0x904aa, 0x0}, ++ {0x904ab, 0x0}, ++ {0x904ac, 0x0}, ++ {0x904ad, 0x0}, ++ {0x904ae, 0x0}, ++ {0x904af, 0x0}, ++ {0x904b0, 0x0}, ++ {0x904b1, 0x0}, ++ {0x904b2, 0x0}, ++ {0x904b3, 0x0}, ++ {0x904b4, 0x0}, ++ {0x904b5, 0x0}, ++ {0x904b6, 0x0}, ++ {0x904b7, 0x0}, ++ {0x904b8, 0x0}, ++ {0x904b9, 0x0}, ++ {0x904ba, 0x0}, ++ {0x904bb, 0x0}, ++ {0x904bc, 0x0}, ++ {0x904bd, 0x0}, ++ {0x904be, 0x0}, ++ {0x904bf, 0x0}, ++ {0x904c0, 0x0}, ++ {0x904c1, 0x0}, ++ {0x904c2, 0x0}, ++ {0x904c3, 0x0}, ++ {0x904c4, 0x0}, ++ {0x904c5, 0x0}, ++ {0x904c6, 0x0}, ++ {0x904c7, 0x0}, ++ {0x904c8, 0x0}, ++ {0x904c9, 0x0}, ++ {0x904ca, 0x0}, ++ {0x904cb, 0x0}, ++ {0x904cc, 0x0}, ++ {0x904cd, 0x0}, ++ {0x904ce, 0x0}, ++ {0x904cf, 0x0}, ++ {0x904d0, 0x0}, ++ {0x904d1, 0x0}, ++ {0x904d2, 0x0}, ++ {0x904d3, 0x0}, ++ {0x904d4, 0x0}, ++ {0x904d5, 0x0}, ++ {0x904d6, 0x0}, ++ {0x904d7, 0x0}, ++ {0x904d8, 0x0}, ++ {0x904d9, 0x0}, ++ {0x904da, 0x0}, ++ {0x904db, 0x0}, ++ {0x904dc, 0x0}, ++ {0x904dd, 0x0}, ++ {0x904de, 0x0}, ++ {0x904df, 0x0}, ++ {0x904e0, 0x0}, ++ {0x904e1, 0x0}, ++ {0x904e2, 0x0}, ++ {0x904e3, 0x0}, ++ {0x904e4, 0x0}, ++ {0x904e5, 0x0}, ++ {0x904e6, 0x0}, ++ {0x904e7, 0x0}, ++ {0x904e8, 0x0}, ++ {0x904e9, 0x0}, ++ {0x904ea, 0x0}, ++ {0x904eb, 0x0}, ++ {0x904ec, 0x0}, ++ {0x904ed, 0x0}, ++ {0x904ee, 0x0}, ++ {0x904ef, 0x0}, ++ {0x904f0, 0x0}, ++ {0x904f1, 0x0}, ++ {0x904f2, 0x0}, ++ {0x904f3, 0x0}, ++ {0x904f4, 0x0}, ++ {0x904f5, 0x0}, ++ {0x904f6, 0x0}, ++ {0x904f7, 0x0}, ++ {0x904f8, 0x0}, ++ {0x904f9, 0x0}, ++ {0x904fa, 0x0}, ++ {0x904fb, 0x0}, ++ {0x904fc, 0x0}, ++ {0x904fd, 0x0}, ++ {0x904fe, 0x0}, ++ {0x904ff, 0x0}, ++ {0x90500, 0x0}, ++ {0x90501, 0x0}, ++ {0x90502, 0x0}, ++ {0x90503, 0x0}, ++ {0x90504, 0x0}, ++ {0x90505, 0x0}, ++ {0x90506, 0x0}, ++ {0x90507, 0x0}, ++ {0x90508, 0x0}, ++ {0x90509, 0x0}, ++ {0x9050a, 0x0}, ++ {0x9050b, 0x0}, ++ {0x9050c, 0x0}, ++ {0x9050d, 0x0}, ++ {0x9050e, 0x0}, ++ {0x9050f, 0x0}, ++ {0x90510, 0x0}, ++ {0x90511, 0x0}, ++ {0x90512, 0x0}, ++ {0x90513, 0x0}, ++ {0x90514, 0x0}, ++ {0x90515, 0x0}, ++ {0x90516, 0x0}, ++ {0x90517, 0x0}, ++ {0x90518, 0x0}, ++ {0x90519, 0x0}, ++ {0x9051a, 0x0}, ++ {0x9051b, 0x0}, ++ {0x9051c, 0x0}, ++ {0x9051d, 0x0}, ++ {0x9051e, 0x0}, ++ {0x9051f, 0x0}, ++ {0x90520, 0x0}, ++ {0x90521, 0x0}, ++ {0x90522, 0x0}, ++ {0x90523, 0x0}, ++ {0x90524, 0x0}, ++ {0x90525, 0x0}, ++ {0x90526, 0x0}, ++ {0x90527, 0x0}, ++ {0x90528, 0x0}, ++ {0x90529, 0x0}, ++ {0x9052a, 0x0}, ++ {0x9052b, 0x0}, ++ {0x9052c, 0x0}, ++ {0x9052d, 0x0}, ++ {0x9052e, 0x0}, ++ {0x9052f, 0x0}, ++ {0x90530, 0x0}, ++ {0x90531, 0x0}, ++ {0x90532, 0x0}, ++ {0x90533, 0x0}, ++ {0x90534, 0x0}, ++ {0x90535, 0x0}, ++ {0x90536, 0x0}, ++ {0x90537, 0x0}, ++ {0x90538, 0x0}, ++ {0x90539, 0x0}, ++ {0x9053a, 0x0}, ++ {0xd00e7, 0x0}, ++ {0x9001c, 0x0}, ++ {0x90020, 0x0}, ++ {0x90024, 0x0}, ++ {0x90025, 0x0}, ++ {0x90026, 0x0}, ++ {0x9002b, 0x0}, ++ {0x90708, 0x0}, ++ {0x90700, 0x0}, ++ {0x90701, 0x0}, ++ {0x90702, 0x0}, ++ {0x90703, 0x0}, ++ {0x90704, 0x0}, ++ {0x90705, 0x0}, ++ {0x90706, 0x0}, ++ {0x90707, 0x0}, ++ {0x2018a, 0x0}, ++ {0x20124, 0x0}, ++ {0x2018b, 0x0}, ++ {0x20125, 0x0}, ++ {0x2018c, 0x0}, ++ {0x20126, 0x0}, ++ {0x2018d, 0x0}, ++ {0x20127, 0x0}, ++ {0x2018e, 0x0}, ++ {0x20128, 0x0}, ++ {0x2018f, 0x0}, ++ {0x20129, 0x0}, ++ {0x20190, 0x0}, ++ {0x2012a, 0x0}, ++ {0x20191, 0x0}, ++ {0x2012b, 0x0}, ++ {0x20192, 0x0}, ++ {0x2012c, 0x0}, ++ {0x20193, 0x0}, ++ {0x2012d, 0x0}, ++ {0x20194, 0x0}, ++ {0x2012e, 0x0}, ++ {0x20195, 0x0}, ++ {0x2012f, 0x0}, ++ {0x20196, 0x0}, ++ {0x20130, 0x0}, ++ {0x20197, 0x0}, ++ {0x20131, 0x0}, ++ {0x20198, 0x0}, ++ {0x20132, 0x0}, ++ {0x20199, 0x0}, ++ {0x20133, 0x0}, ++ {0x2019a, 0x0}, ++ {0x20134, 0x0}, ++ {0x2019b, 0x0}, ++ {0x20135, 0x0}, ++ {0x2019c, 0x0}, ++ {0x20136, 0x0}, ++ {0x2019d, 0x0}, ++ {0x20137, 0x0}, ++ {0x2019e, 0x0}, ++ {0x20138, 0x0}, ++ {0x2019f, 0x0}, ++ {0x20139, 0x0}, ++ {0x201a0, 0x0}, ++ {0x2013a, 0x0}, ++ {0x201a1, 0x0}, ++ {0x2013b, 0x0}, ++ {0x201a2, 0x0}, ++ {0x2013c, 0x0}, ++ {0x201a3, 0x0}, ++ {0x2013d, 0x0}, ++ {0x201a4, 0x0}, ++ {0x2013e, 0x0}, ++ {0x201a5, 0x0}, ++ {0x2013f, 0x0}, ++ {0x201a6, 0x0}, ++ {0x20140, 0x0}, ++ {0x201a7, 0x0}, ++ {0x20141, 0x0}, ++ {0x201a8, 0x0}, ++ {0x20142, 0x0}, ++ {0x201a9, 0x0}, ++ {0x20143, 0x0}, ++ {0x201aa, 0x0}, ++ {0x20144, 0x0}, ++ {0x201ab, 0x0}, ++ {0x20145, 0x0}, ++ {0x201ac, 0x0}, ++ {0x20146, 0x0}, ++ {0x201ad, 0x0}, ++ {0x20147, 0x0}, ++ {0x201ae, 0x0}, ++ {0x20148, 0x0}, ++ {0x201af, 0x0}, ++ {0x20149, 0x0}, ++ {0x201b0, 0x0}, ++ {0x2014a, 0x0}, ++ {0x201b1, 0x0}, ++ {0x2014b, 0x0}, ++ {0x201b2, 0x0}, ++ {0x2014c, 0x0}, ++ {0x201b3, 0x0}, ++ {0x2014d, 0x0}, ++ {0x201b4, 0x0}, ++ {0x2014e, 0x0}, ++ {0x201b5, 0x0}, ++ {0x2014f, 0x0}, ++ {0x201b6, 0x0}, ++ {0x20150, 0x0}, ++ {0x201b7, 0x0}, ++ {0x20151, 0x0}, ++ {0x201b8, 0x0}, ++ {0x20152, 0x0}, ++ {0x201b9, 0x0}, ++ {0x20153, 0x0}, ++ {0x201ba, 0x0}, ++ {0x20154, 0x0}, ++ {0x201bb, 0x0}, ++ {0x20155, 0x0}, ++ {0x201bc, 0x0}, ++ {0x20156, 0x0}, ++ {0x201bd, 0x0}, ++ {0x20157, 0x0}, ++ {0x201be, 0x0}, ++ {0x20158, 0x0}, ++ {0x201bf, 0x0}, ++ {0x20159, 0x0}, ++ {0x201c0, 0x0}, ++ {0x2015a, 0x0}, ++ {0x201c1, 0x0}, ++ {0x2015b, 0x0}, ++ {0x201c2, 0x0}, ++ {0x2015c, 0x0}, ++ {0x201c3, 0x0}, ++ {0x2015d, 0x0}, ++ {0x201c4, 0x0}, ++ {0x2015e, 0x0}, ++ {0x201c5, 0x0}, ++ {0x2015f, 0x0}, ++ {0x201c6, 0x0}, ++ {0x20160, 0x0}, ++ {0x201c7, 0x0}, ++ {0x20161, 0x0}, ++ {0x201c8, 0x0}, ++ {0x20162, 0x0}, ++ {0x201c9, 0x0}, ++ {0x20163, 0x0}, ++ {0x201ca, 0x0}, ++ {0x20164, 0x0}, ++ {0x201cb, 0x0}, ++ {0x20165, 0x0}, ++ {0x201cc, 0x0}, ++ {0x20166, 0x0}, ++ {0x201cd, 0x0}, ++ {0x20167, 0x0}, ++ {0x201ce, 0x0}, ++ {0x20168, 0x0}, ++ {0x201cf, 0x0}, ++ {0x20169, 0x0}, ++ {0x201d0, 0x0}, ++ {0x2016a, 0x0}, ++ {0x201d1, 0x0}, ++ {0x2016b, 0x0}, ++ {0x201d2, 0x0}, ++ {0x2016c, 0x0}, ++ {0x201d3, 0x0}, ++ {0x2016d, 0x0}, ++ {0x201d4, 0x0}, ++ {0x2016e, 0x0}, ++ {0x201d5, 0x0}, ++ {0x2016f, 0x0}, ++ {0x201d6, 0x0}, ++ {0x20170, 0x0}, ++ {0x201d7, 0x0}, ++ {0x20171, 0x0}, ++ {0x201d8, 0x0}, ++ {0x20172, 0x0}, ++ {0x201d9, 0x0}, ++ {0x20173, 0x0}, ++ {0x201da, 0x0}, ++ {0xc0001, 0x0}, ++ {0xc0002, 0x0}, ++ {0xc0003, 0x0}, ++ {0xc0000, 0x0}, ++ {0xc0006, 0x0}, ++ {0xc0007, 0x0}, ++ {0x9070c, 0x0}, ++ {0x9070d, 0x0}, ++ {0x9070e, 0x0}, ++ {0x9070f, 0x0}, ++ {0x90710, 0x0}, ++ {0x90711, 0x0}, ++ {0x90713, 0x0}, ++ {0x90714, 0x0}, ++ {0x90715, 0x0}, ++ {0x90c10, 0x0}, ++ {0x90c12, 0x0}, ++ {0x90712, 0x0}, ++ {0x90716, 0x0}, ++ {0x90717, 0x0}, ++ {0x90718, 0x0}, ++ {0x90719, 0x0}, ++ {0x9071a, 0x0}, ++ {0x9071b, 0x0}, ++ {0x90c11, 0x0}, ++ {0x90904, 0x0}, ++ {0x90986, 0x0}, ++ {0x90920, 0x0}, ++ {0x90921, 0x0}, ++ {0x90922, 0x0}, ++ {0x90923, 0x0}, ++ {0x90924, 0x0}, ++ {0x90925, 0x0}, ++ {0x90926, 0x0}, ++ {0x90927, 0x0}, ++ {0x90930, 0x0}, ++ {0x90931, 0x0}, ++ {0x90932, 0x0}, ++ {0x90933, 0x0}, ++ {0x9090a, 0x0}, ++ {0x9090c, 0x0}, ++ {0x9090d, 0x0}, ++ {0x200f0, 0x0}, ++ {0x200f1, 0x0}, ++ {0x200f2, 0x0}, ++ {0x100b9, 0x0}, ++ {0x100b1, 0x0}, ++ {0x100ba, 0x0}, ++ {0x100a2, 0x0}, ++ {0x100b5, 0x0}, ++ {0x110b9, 0x0}, ++ {0x110b1, 0x0}, ++ {0x110ba, 0x0}, ++ {0x110a2, 0x0}, ++ {0x110b5, 0x0}, ++ {0x120b9, 0x0}, ++ {0x120b1, 0x0}, ++ {0x120ba, 0x0}, ++ {0x120a2, 0x0}, ++ {0x120b5, 0x0}, ++ {0x130b9, 0x0}, ++ {0x130b1, 0x0}, ++ {0x130ba, 0x0}, ++ {0x130a2, 0x0}, ++ {0x130b5, 0x0}, ++ {0x70024, 0x0}, ++ {0x70025, 0x0}, ++ {0x70026, 0x0}, ++ {0x70027, 0x0}, ++ {0x70028, 0x0}, ++ {0x70029, 0x0}, ++ {0x7002a, 0x0}, ++ {0x7002b, 0x0}, ++ {0x70124, 0x0}, ++ {0x70125, 0x0}, ++ {0x70126, 0x0}, ++ {0x70127, 0x0}, ++ {0x70128, 0x0}, ++ {0x70129, 0x0}, ++ {0x7012a, 0x0}, ++ {0x7012b, 0x0}, ++ {0x70224, 0x0}, ++ {0x70225, 0x0}, ++ {0x70226, 0x0}, ++ {0x70227, 0x0}, ++ {0x70228, 0x0}, ++ {0x70229, 0x0}, ++ {0x7022a, 0x0}, ++ {0x7022b, 0x0}, ++ {0x70324, 0x0}, ++ {0x70325, 0x0}, ++ {0x70326, 0x0}, ++ {0x70327, 0x0}, ++ {0x70328, 0x0}, ++ {0x70329, 0x0}, ++ {0x7032a, 0x0}, ++ {0x7032b, 0x0}, ++ {0x70424, 0x0}, ++ {0x70425, 0x0}, ++ {0x70426, 0x0}, ++ {0x70427, 0x0}, ++ {0x70428, 0x0}, ++ {0x70429, 0x0}, ++ {0x7042a, 0x0}, ++ {0x7042b, 0x0}, ++ {0x70524, 0x0}, ++ {0x70525, 0x0}, ++ {0x70526, 0x0}, ++ {0x70527, 0x0}, ++ {0x70528, 0x0}, ++ {0x70529, 0x0}, ++ {0x7052a, 0x0}, ++ {0x7052b, 0x0}, ++ {0x70624, 0x0}, ++ {0x70625, 0x0}, ++ {0x70626, 0x0}, ++ {0x70627, 0x0}, ++ {0x70628, 0x0}, ++ {0x70629, 0x0}, ++ {0x7062a, 0x0}, ++ {0x7062b, 0x0}, ++ {0x70724, 0x0}, ++ {0x70725, 0x0}, ++ {0x70726, 0x0}, ++ {0x70727, 0x0}, ++ {0x70728, 0x0}, ++ {0x70729, 0x0}, ++ {0x7072a, 0x0}, ++ {0x7072b, 0x0}, ++ {0x70824, 0x0}, ++ {0x70825, 0x0}, ++ {0x70826, 0x0}, ++ {0x70827, 0x0}, ++ {0x70828, 0x0}, ++ {0x70829, 0x0}, ++ {0x7082a, 0x0}, ++ {0x7082b, 0x0}, ++ {0x70065, 0x0}, ++ {0x2007e, 0x0}, ++ {0x200ef, 0x0}, ++ {0x90910, 0x0}, ++ {0x20310, 0x0}, ++ {0x20311, 0x0}, ++ {0x20049, 0x0}, ++ {0x100be, 0x0}, ++ {0x100b0, 0x0}, ++ {0x10080, 0x0}, ++ {0x10081, 0x0}, ++ {0x10082, 0x0}, ++ {0x10083, 0x0}, ++ {0x10084, 0x0}, ++ {0x10085, 0x0}, ++ {0x10086, 0x0}, ++ {0x10087, 0x0}, ++ {0x10056, 0x0}, ++ {0x100d9, 0x0}, ++ {0x110be, 0x0}, ++ {0x110b0, 0x0}, ++ {0x11080, 0x0}, ++ {0x11081, 0x0}, ++ {0x11082, 0x0}, ++ {0x11083, 0x0}, ++ {0x11084, 0x0}, ++ {0x11085, 0x0}, ++ {0x11086, 0x0}, ++ {0x11087, 0x0}, ++ {0x11056, 0x0}, ++ {0x110d9, 0x0}, ++ {0x120be, 0x0}, ++ {0x120b0, 0x0}, ++ {0x12080, 0x0}, ++ {0x12081, 0x0}, ++ {0x12082, 0x0}, ++ {0x12083, 0x0}, ++ {0x12084, 0x0}, ++ {0x12085, 0x0}, ++ {0x12086, 0x0}, ++ {0x12087, 0x0}, ++ {0x12056, 0x0}, ++ {0x120d9, 0x0}, ++ {0x130be, 0x0}, ++ {0x130b0, 0x0}, ++ {0x13080, 0x0}, ++ {0x13081, 0x0}, ++ {0x13082, 0x0}, ++ {0x13083, 0x0}, ++ {0x13084, 0x0}, ++ {0x13085, 0x0}, ++ {0x13086, 0x0}, ++ {0x13087, 0x0}, ++ {0x13056, 0x0}, ++ {0x130d9, 0x0}, ++ {0x30090, 0x0}, ++ {0x30091, 0x0}, ++ {0x30092, 0x0}, ++ {0x30093, 0x0}, ++ {0x30094, 0x0}, ++ {0x30095, 0x0}, ++ {0x30096, 0x0}, ++ {0x31090, 0x0}, ++ {0x31091, 0x0}, ++ {0x31092, 0x0}, ++ {0x31093, 0x0}, ++ {0x31094, 0x0}, ++ {0x31095, 0x0}, ++ {0x31096, 0x0}, ++ {0x30002, 0x0}, ++ {0x30007, 0x0}, ++ {0x30008, 0x0}, ++ {0x30005, 0x0}, ++ {0x30006, 0x0}, ++ {0x30001, 0x0}, ++ {0x30101, 0x0}, ++ {0x30201, 0x0}, ++ {0x30301, 0x0}, ++ {0x30401, 0x0}, ++ {0x30501, 0x0}, ++ {0x30601, 0x0}, ++ {0x30701, 0x0}, ++ {0x30801, 0x0}, ++ {0x30901, 0x0}, ++ {0x31002, 0x0}, ++ {0x31007, 0x0}, ++ {0x31008, 0x0}, ++ {0x31005, 0x0}, ++ {0x31006, 0x0}, ++ {0x31001, 0x0}, ++ {0x31101, 0x0}, ++ {0x31201, 0x0}, ++ {0x31301, 0x0}, ++ {0x31401, 0x0}, ++ {0x31501, 0x0}, ++ {0x31601, 0x0}, ++ {0x31701, 0x0}, ++ {0x31801, 0x0}, ++ {0x31901, 0x0}, ++ {0x10000, 0x0}, ++ {0x100ad, 0x0}, ++ {0x100af, 0x0}, ++ {0x10020, 0x0}, ++ {0x10021, 0x0}, ++ {0x10028, 0x0}, ++ {0x10029, 0x0}, ++ {0x10066, 0x0}, ++ {0x10067, 0x0}, ++ {0x1005a, 0x0}, ++ {0x1005b, 0x0}, ++ {0x1005c, 0x0}, ++ {0x1005d, 0x0}, ++ {0x1002a, 0x0}, ++ {0x1002b, 0x0}, ++ {0x10024, 0x0}, ++ {0x10025, 0x0}, ++ {0x10026, 0x0}, ++ {0x10027, 0x0}, ++ {0x10010, 0x0}, ++ {0x10011, 0x0}, ++ {0x10012, 0x0}, ++ {0x10013, 0x0}, ++ {0x10068, 0x0}, ++ {0x10069, 0x0}, ++ {0x1006a, 0x0}, ++ {0x1006b, 0x0}, ++ {0x1006c, 0x0}, ++ {0x1006d, 0x0}, ++ {0x1006e, 0x0}, ++ {0x1006f, 0x0}, ++ {0x1001c, 0x0}, ++ {0x1001d, 0x0}, ++ {0x1001e, 0x0}, ++ {0x1001f, 0x0}, ++ {0x10124, 0x0}, ++ {0x10125, 0x0}, ++ {0x10126, 0x0}, ++ {0x10127, 0x0}, ++ {0x10110, 0x0}, ++ {0x10111, 0x0}, ++ {0x10112, 0x0}, ++ {0x10113, 0x0}, ++ {0x10168, 0x0}, ++ {0x10169, 0x0}, ++ {0x1016a, 0x0}, ++ {0x1016b, 0x0}, ++ {0x1016c, 0x0}, ++ {0x1016d, 0x0}, ++ {0x1016e, 0x0}, ++ {0x1016f, 0x0}, ++ {0x1011c, 0x0}, ++ {0x1011d, 0x0}, ++ {0x1011e, 0x0}, ++ {0x1011f, 0x0}, ++ {0x10224, 0x0}, ++ {0x10225, 0x0}, ++ {0x10226, 0x0}, ++ {0x10227, 0x0}, ++ {0x10210, 0x0}, ++ {0x10211, 0x0}, ++ {0x10212, 0x0}, ++ {0x10213, 0x0}, ++ {0x10268, 0x0}, ++ {0x10269, 0x0}, ++ {0x1026a, 0x0}, ++ {0x1026b, 0x0}, ++ {0x1026c, 0x0}, ++ {0x1026d, 0x0}, ++ {0x1026e, 0x0}, ++ {0x1026f, 0x0}, ++ {0x1021c, 0x0}, ++ {0x1021d, 0x0}, ++ {0x1021e, 0x0}, ++ {0x1021f, 0x0}, ++ {0x10324, 0x0}, ++ {0x10325, 0x0}, ++ {0x10326, 0x0}, ++ {0x10327, 0x0}, ++ {0x10310, 0x0}, ++ {0x10311, 0x0}, ++ {0x10312, 0x0}, ++ {0x10313, 0x0}, ++ {0x10368, 0x0}, ++ {0x10369, 0x0}, ++ {0x1036a, 0x0}, ++ {0x1036b, 0x0}, ++ {0x1036c, 0x0}, ++ {0x1036d, 0x0}, ++ {0x1036e, 0x0}, ++ {0x1036f, 0x0}, ++ {0x1031c, 0x0}, ++ {0x1031d, 0x0}, ++ {0x1031e, 0x0}, ++ {0x1031f, 0x0}, ++ {0x10424, 0x0}, ++ {0x10425, 0x0}, ++ {0x10426, 0x0}, ++ {0x10427, 0x0}, ++ {0x10410, 0x0}, ++ {0x10411, 0x0}, ++ {0x10412, 0x0}, ++ {0x10413, 0x0}, ++ {0x10468, 0x0}, ++ {0x10469, 0x0}, ++ {0x1046a, 0x0}, ++ {0x1046b, 0x0}, ++ {0x1046c, 0x0}, ++ {0x1046d, 0x0}, ++ {0x1046e, 0x0}, ++ {0x1046f, 0x0}, ++ {0x1041c, 0x0}, ++ {0x1041d, 0x0}, ++ {0x1041e, 0x0}, ++ {0x1041f, 0x0}, ++ {0x10524, 0x0}, ++ {0x10525, 0x0}, ++ {0x10526, 0x0}, ++ {0x10527, 0x0}, ++ {0x10510, 0x0}, ++ {0x10511, 0x0}, ++ {0x10512, 0x0}, ++ {0x10513, 0x0}, ++ {0x10568, 0x0}, ++ {0x10569, 0x0}, ++ {0x1056a, 0x0}, ++ {0x1056b, 0x0}, ++ {0x1056c, 0x0}, ++ {0x1056d, 0x0}, ++ {0x1056e, 0x0}, ++ {0x1056f, 0x0}, ++ {0x1051c, 0x0}, ++ {0x1051d, 0x0}, ++ {0x1051e, 0x0}, ++ {0x1051f, 0x0}, ++ {0x10624, 0x0}, ++ {0x10625, 0x0}, ++ {0x10626, 0x0}, ++ {0x10627, 0x0}, ++ {0x10610, 0x0}, ++ {0x10611, 0x0}, ++ {0x10612, 0x0}, ++ {0x10613, 0x0}, ++ {0x10668, 0x0}, ++ {0x10669, 0x0}, ++ {0x1066a, 0x0}, ++ {0x1066b, 0x0}, ++ {0x1066c, 0x0}, ++ {0x1066d, 0x0}, ++ {0x1066e, 0x0}, ++ {0x1066f, 0x0}, ++ {0x1061c, 0x0}, ++ {0x1061d, 0x0}, ++ {0x1061e, 0x0}, ++ {0x1061f, 0x0}, ++ {0x10724, 0x0}, ++ {0x10725, 0x0}, ++ {0x10726, 0x0}, ++ {0x10727, 0x0}, ++ {0x10710, 0x0}, ++ {0x10711, 0x0}, ++ {0x10712, 0x0}, ++ {0x10713, 0x0}, ++ {0x10768, 0x0}, ++ {0x10769, 0x0}, ++ {0x1076a, 0x0}, ++ {0x1076b, 0x0}, ++ {0x1076c, 0x0}, ++ {0x1076d, 0x0}, ++ {0x1076e, 0x0}, ++ {0x1076f, 0x0}, ++ {0x1071c, 0x0}, ++ {0x1071d, 0x0}, ++ {0x1071e, 0x0}, ++ {0x1071f, 0x0}, ++ {0x10824, 0x0}, ++ {0x10825, 0x0}, ++ {0x10826, 0x0}, ++ {0x10827, 0x0}, ++ {0x10810, 0x0}, ++ {0x10811, 0x0}, ++ {0x10812, 0x0}, ++ {0x10813, 0x0}, ++ {0x10868, 0x0}, ++ {0x10869, 0x0}, ++ {0x1086a, 0x0}, ++ {0x1086b, 0x0}, ++ {0x1086c, 0x0}, ++ {0x1086d, 0x0}, ++ {0x1086e, 0x0}, ++ {0x1086f, 0x0}, ++ {0x1081c, 0x0}, ++ {0x1081d, 0x0}, ++ {0x1081e, 0x0}, ++ {0x1081f, 0x0}, ++ {0x1000c, 0x0}, ++ {0x1000d, 0x0}, ++ {0x10015, 0x0}, ++ {0x10016, 0x0}, ++ {0x10019, 0x0}, ++ {0x1001b, 0x0}, ++ {0x10022, 0x0}, ++ {0x10023, 0x0}, ++ {0x100d0, 0x0}, ++ {0x100d1, 0x0}, ++ {0x100d2, 0x0}, ++ {0x100d3, 0x0}, ++ {0x100d4, 0x0}, ++ {0x11000, 0x0}, ++ {0x110ad, 0x0}, ++ {0x110af, 0x0}, ++ {0x11020, 0x0}, ++ {0x11021, 0x0}, ++ {0x11028, 0x0}, ++ {0x11029, 0x0}, ++ {0x11066, 0x0}, ++ {0x11067, 0x0}, ++ {0x1105a, 0x0}, ++ {0x1105b, 0x0}, ++ {0x1105c, 0x0}, ++ {0x1105d, 0x0}, ++ {0x1102a, 0x0}, ++ {0x1102b, 0x0}, ++ {0x11024, 0x0}, ++ {0x11025, 0x0}, ++ {0x11026, 0x0}, ++ {0x11027, 0x0}, ++ {0x11010, 0x0}, ++ {0x11011, 0x0}, ++ {0x11012, 0x0}, ++ {0x11013, 0x0}, ++ {0x11068, 0x0}, ++ {0x11069, 0x0}, ++ {0x1106a, 0x0}, ++ {0x1106b, 0x0}, ++ {0x1106c, 0x0}, ++ {0x1106d, 0x0}, ++ {0x1106e, 0x0}, ++ {0x1106f, 0x0}, ++ {0x1101c, 0x0}, ++ {0x1101d, 0x0}, ++ {0x1101e, 0x0}, ++ {0x1101f, 0x0}, ++ {0x11124, 0x0}, ++ {0x11125, 0x0}, ++ {0x11126, 0x0}, ++ {0x11127, 0x0}, ++ {0x11110, 0x0}, ++ {0x11111, 0x0}, ++ {0x11112, 0x0}, ++ {0x11113, 0x0}, ++ {0x11168, 0x0}, ++ {0x11169, 0x0}, ++ {0x1116a, 0x0}, ++ {0x1116b, 0x0}, ++ {0x1116c, 0x0}, ++ {0x1116d, 0x0}, ++ {0x1116e, 0x0}, ++ {0x1116f, 0x0}, ++ {0x1111c, 0x0}, ++ {0x1111d, 0x0}, ++ {0x1111e, 0x0}, ++ {0x1111f, 0x0}, ++ {0x11224, 0x0}, ++ {0x11225, 0x0}, ++ {0x11226, 0x0}, ++ {0x11227, 0x0}, ++ {0x11210, 0x0}, ++ {0x11211, 0x0}, ++ {0x11212, 0x0}, ++ {0x11213, 0x0}, ++ {0x11268, 0x0}, ++ {0x11269, 0x0}, ++ {0x1126a, 0x0}, ++ {0x1126b, 0x0}, ++ {0x1126c, 0x0}, ++ {0x1126d, 0x0}, ++ {0x1126e, 0x0}, ++ {0x1126f, 0x0}, ++ {0x1121c, 0x0}, ++ {0x1121d, 0x0}, ++ {0x1121e, 0x0}, ++ {0x1121f, 0x0}, ++ {0x11324, 0x0}, ++ {0x11325, 0x0}, ++ {0x11326, 0x0}, ++ {0x11327, 0x0}, ++ {0x11310, 0x0}, ++ {0x11311, 0x0}, ++ {0x11312, 0x0}, ++ {0x11313, 0x0}, ++ {0x11368, 0x0}, ++ {0x11369, 0x0}, ++ {0x1136a, 0x0}, ++ {0x1136b, 0x0}, ++ {0x1136c, 0x0}, ++ {0x1136d, 0x0}, ++ {0x1136e, 0x0}, ++ {0x1136f, 0x0}, ++ {0x1131c, 0x0}, ++ {0x1131d, 0x0}, ++ {0x1131e, 0x0}, ++ {0x1131f, 0x0}, ++ {0x11424, 0x0}, ++ {0x11425, 0x0}, ++ {0x11426, 0x0}, ++ {0x11427, 0x0}, ++ {0x11410, 0x0}, ++ {0x11411, 0x0}, ++ {0x11412, 0x0}, ++ {0x11413, 0x0}, ++ {0x11468, 0x0}, ++ {0x11469, 0x0}, ++ {0x1146a, 0x0}, ++ {0x1146b, 0x0}, ++ {0x1146c, 0x0}, ++ {0x1146d, 0x0}, ++ {0x1146e, 0x0}, ++ {0x1146f, 0x0}, ++ {0x1141c, 0x0}, ++ {0x1141d, 0x0}, ++ {0x1141e, 0x0}, ++ {0x1141f, 0x0}, ++ {0x11524, 0x0}, ++ {0x11525, 0x0}, ++ {0x11526, 0x0}, ++ {0x11527, 0x0}, ++ {0x11510, 0x0}, ++ {0x11511, 0x0}, ++ {0x11512, 0x0}, ++ {0x11513, 0x0}, ++ {0x11568, 0x0}, ++ {0x11569, 0x0}, ++ {0x1156a, 0x0}, ++ {0x1156b, 0x0}, ++ {0x1156c, 0x0}, ++ {0x1156d, 0x0}, ++ {0x1156e, 0x0}, ++ {0x1156f, 0x0}, ++ {0x1151c, 0x0}, ++ {0x1151d, 0x0}, ++ {0x1151e, 0x0}, ++ {0x1151f, 0x0}, ++ {0x11624, 0x0}, ++ {0x11625, 0x0}, ++ {0x11626, 0x0}, ++ {0x11627, 0x0}, ++ {0x11610, 0x0}, ++ {0x11611, 0x0}, ++ {0x11612, 0x0}, ++ {0x11613, 0x0}, ++ {0x11668, 0x0}, ++ {0x11669, 0x0}, ++ {0x1166a, 0x0}, ++ {0x1166b, 0x0}, ++ {0x1166c, 0x0}, ++ {0x1166d, 0x0}, ++ {0x1166e, 0x0}, ++ {0x1166f, 0x0}, ++ {0x1161c, 0x0}, ++ {0x1161d, 0x0}, ++ {0x1161e, 0x0}, ++ {0x1161f, 0x0}, ++ {0x11724, 0x0}, ++ {0x11725, 0x0}, ++ {0x11726, 0x0}, ++ {0x11727, 0x0}, ++ {0x11710, 0x0}, ++ {0x11711, 0x0}, ++ {0x11712, 0x0}, ++ {0x11713, 0x0}, ++ {0x11768, 0x0}, ++ {0x11769, 0x0}, ++ {0x1176a, 0x0}, ++ {0x1176b, 0x0}, ++ {0x1176c, 0x0}, ++ {0x1176d, 0x0}, ++ {0x1176e, 0x0}, ++ {0x1176f, 0x0}, ++ {0x1171c, 0x0}, ++ {0x1171d, 0x0}, ++ {0x1171e, 0x0}, ++ {0x1171f, 0x0}, ++ {0x11824, 0x0}, ++ {0x11825, 0x0}, ++ {0x11826, 0x0}, ++ {0x11827, 0x0}, ++ {0x11810, 0x0}, ++ {0x11811, 0x0}, ++ {0x11812, 0x0}, ++ {0x11813, 0x0}, ++ {0x11868, 0x0}, ++ {0x11869, 0x0}, ++ {0x1186a, 0x0}, ++ {0x1186b, 0x0}, ++ {0x1186c, 0x0}, ++ {0x1186d, 0x0}, ++ {0x1186e, 0x0}, ++ {0x1186f, 0x0}, ++ {0x1181c, 0x0}, ++ {0x1181d, 0x0}, ++ {0x1181e, 0x0}, ++ {0x1181f, 0x0}, ++ {0x1100c, 0x0}, ++ {0x1100d, 0x0}, ++ {0x11015, 0x0}, ++ {0x11016, 0x0}, ++ {0x11019, 0x0}, ++ {0x1101b, 0x0}, ++ {0x11022, 0x0}, ++ {0x11023, 0x0}, ++ {0x110d0, 0x0}, ++ {0x110d1, 0x0}, ++ {0x110d2, 0x0}, ++ {0x110d3, 0x0}, ++ {0x110d4, 0x0}, ++ {0x12000, 0x0}, ++ {0x120ad, 0x0}, ++ {0x120af, 0x0}, ++ {0x12020, 0x0}, ++ {0x12021, 0x0}, ++ {0x12028, 0x0}, ++ {0x12029, 0x0}, ++ {0x12066, 0x0}, ++ {0x12067, 0x0}, ++ {0x1205a, 0x0}, ++ {0x1205b, 0x0}, ++ {0x1205c, 0x0}, ++ {0x1205d, 0x0}, ++ {0x1202a, 0x0}, ++ {0x1202b, 0x0}, ++ {0x12024, 0x0}, ++ {0x12025, 0x0}, ++ {0x12026, 0x0}, ++ {0x12027, 0x0}, ++ {0x12010, 0x0}, ++ {0x12011, 0x0}, ++ {0x12012, 0x0}, ++ {0x12013, 0x0}, ++ {0x12068, 0x0}, ++ {0x12069, 0x0}, ++ {0x1206a, 0x0}, ++ {0x1206b, 0x0}, ++ {0x1206c, 0x0}, ++ {0x1206d, 0x0}, ++ {0x1206e, 0x0}, ++ {0x1206f, 0x0}, ++ {0x1201c, 0x0}, ++ {0x1201d, 0x0}, ++ {0x1201e, 0x0}, ++ {0x1201f, 0x0}, ++ {0x12124, 0x0}, ++ {0x12125, 0x0}, ++ {0x12126, 0x0}, ++ {0x12127, 0x0}, ++ {0x12110, 0x0}, ++ {0x12111, 0x0}, ++ {0x12112, 0x0}, ++ {0x12113, 0x0}, ++ {0x12168, 0x0}, ++ {0x12169, 0x0}, ++ {0x1216a, 0x0}, ++ {0x1216b, 0x0}, ++ {0x1216c, 0x0}, ++ {0x1216d, 0x0}, ++ {0x1216e, 0x0}, ++ {0x1216f, 0x0}, ++ {0x1211c, 0x0}, ++ {0x1211d, 0x0}, ++ {0x1211e, 0x0}, ++ {0x1211f, 0x0}, ++ {0x12224, 0x0}, ++ {0x12225, 0x0}, ++ {0x12226, 0x0}, ++ {0x12227, 0x0}, ++ {0x12210, 0x0}, ++ {0x12211, 0x0}, ++ {0x12212, 0x0}, ++ {0x12213, 0x0}, ++ {0x12268, 0x0}, ++ {0x12269, 0x0}, ++ {0x1226a, 0x0}, ++ {0x1226b, 0x0}, ++ {0x1226c, 0x0}, ++ {0x1226d, 0x0}, ++ {0x1226e, 0x0}, ++ {0x1226f, 0x0}, ++ {0x1221c, 0x0}, ++ {0x1221d, 0x0}, ++ {0x1221e, 0x0}, ++ {0x1221f, 0x0}, ++ {0x12324, 0x0}, ++ {0x12325, 0x0}, ++ {0x12326, 0x0}, ++ {0x12327, 0x0}, ++ {0x12310, 0x0}, ++ {0x12311, 0x0}, ++ {0x12312, 0x0}, ++ {0x12313, 0x0}, ++ {0x12368, 0x0}, ++ {0x12369, 0x0}, ++ {0x1236a, 0x0}, ++ {0x1236b, 0x0}, ++ {0x1236c, 0x0}, ++ {0x1236d, 0x0}, ++ {0x1236e, 0x0}, ++ {0x1236f, 0x0}, ++ {0x1231c, 0x0}, ++ {0x1231d, 0x0}, ++ {0x1231e, 0x0}, ++ {0x1231f, 0x0}, ++ {0x12424, 0x0}, ++ {0x12425, 0x0}, ++ {0x12426, 0x0}, ++ {0x12427, 0x0}, ++ {0x12410, 0x0}, ++ {0x12411, 0x0}, ++ {0x12412, 0x0}, ++ {0x12413, 0x0}, ++ {0x12468, 0x0}, ++ {0x12469, 0x0}, ++ {0x1246a, 0x0}, ++ {0x1246b, 0x0}, ++ {0x1246c, 0x0}, ++ {0x1246d, 0x0}, ++ {0x1246e, 0x0}, ++ {0x1246f, 0x0}, ++ {0x1241c, 0x0}, ++ {0x1241d, 0x0}, ++ {0x1241e, 0x0}, ++ {0x1241f, 0x0}, ++ {0x12524, 0x0}, ++ {0x12525, 0x0}, ++ {0x12526, 0x0}, ++ {0x12527, 0x0}, ++ {0x12510, 0x0}, ++ {0x12511, 0x0}, ++ {0x12512, 0x0}, ++ {0x12513, 0x0}, ++ {0x12568, 0x0}, ++ {0x12569, 0x0}, ++ {0x1256a, 0x0}, ++ {0x1256b, 0x0}, ++ {0x1256c, 0x0}, ++ {0x1256d, 0x0}, ++ {0x1256e, 0x0}, ++ {0x1256f, 0x0}, ++ {0x1251c, 0x0}, ++ {0x1251d, 0x0}, ++ {0x1251e, 0x0}, ++ {0x1251f, 0x0}, ++ {0x12624, 0x0}, ++ {0x12625, 0x0}, ++ {0x12626, 0x0}, ++ {0x12627, 0x0}, ++ {0x12610, 0x0}, ++ {0x12611, 0x0}, ++ {0x12612, 0x0}, ++ {0x12613, 0x0}, ++ {0x12668, 0x0}, ++ {0x12669, 0x0}, ++ {0x1266a, 0x0}, ++ {0x1266b, 0x0}, ++ {0x1266c, 0x0}, ++ {0x1266d, 0x0}, ++ {0x1266e, 0x0}, ++ {0x1266f, 0x0}, ++ {0x1261c, 0x0}, ++ {0x1261d, 0x0}, ++ {0x1261e, 0x0}, ++ {0x1261f, 0x0}, ++ {0x12724, 0x0}, ++ {0x12725, 0x0}, ++ {0x12726, 0x0}, ++ {0x12727, 0x0}, ++ {0x12710, 0x0}, ++ {0x12711, 0x0}, ++ {0x12712, 0x0}, ++ {0x12713, 0x0}, ++ {0x12768, 0x0}, ++ {0x12769, 0x0}, ++ {0x1276a, 0x0}, ++ {0x1276b, 0x0}, ++ {0x1276c, 0x0}, ++ {0x1276d, 0x0}, ++ {0x1276e, 0x0}, ++ {0x1276f, 0x0}, ++ {0x1271c, 0x0}, ++ {0x1271d, 0x0}, ++ {0x1271e, 0x0}, ++ {0x1271f, 0x0}, ++ {0x12824, 0x0}, ++ {0x12825, 0x0}, ++ {0x12826, 0x0}, ++ {0x12827, 0x0}, ++ {0x12810, 0x0}, ++ {0x12811, 0x0}, ++ {0x12812, 0x0}, ++ {0x12813, 0x0}, ++ {0x12868, 0x0}, ++ {0x12869, 0x0}, ++ {0x1286a, 0x0}, ++ {0x1286b, 0x0}, ++ {0x1286c, 0x0}, ++ {0x1286d, 0x0}, ++ {0x1286e, 0x0}, ++ {0x1286f, 0x0}, ++ {0x1281c, 0x0}, ++ {0x1281d, 0x0}, ++ {0x1281e, 0x0}, ++ {0x1281f, 0x0}, ++ {0x1200c, 0x0}, ++ {0x1200d, 0x0}, ++ {0x12015, 0x0}, ++ {0x12016, 0x0}, ++ {0x12019, 0x0}, ++ {0x1201b, 0x0}, ++ {0x12022, 0x0}, ++ {0x12023, 0x0}, ++ {0x120d0, 0x0}, ++ {0x120d1, 0x0}, ++ {0x120d2, 0x0}, ++ {0x120d3, 0x0}, ++ {0x120d4, 0x0}, ++ {0x13000, 0x0}, ++ {0x130ad, 0x0}, ++ {0x130af, 0x0}, ++ {0x13020, 0x0}, ++ {0x13021, 0x0}, ++ {0x13028, 0x0}, ++ {0x13029, 0x0}, ++ {0x13066, 0x0}, ++ {0x13067, 0x0}, ++ {0x1305a, 0x0}, ++ {0x1305b, 0x0}, ++ {0x1305c, 0x0}, ++ {0x1305d, 0x0}, ++ {0x1302a, 0x0}, ++ {0x1302b, 0x0}, ++ {0x13024, 0x0}, ++ {0x13025, 0x0}, ++ {0x13026, 0x0}, ++ {0x13027, 0x0}, ++ {0x13010, 0x0}, ++ {0x13011, 0x0}, ++ {0x13012, 0x0}, ++ {0x13013, 0x0}, ++ {0x13068, 0x0}, ++ {0x13069, 0x0}, ++ {0x1306a, 0x0}, ++ {0x1306b, 0x0}, ++ {0x1306c, 0x0}, ++ {0x1306d, 0x0}, ++ {0x1306e, 0x0}, ++ {0x1306f, 0x0}, ++ {0x1301c, 0x0}, ++ {0x1301d, 0x0}, ++ {0x1301e, 0x0}, ++ {0x1301f, 0x0}, ++ {0x13124, 0x0}, ++ {0x13125, 0x0}, ++ {0x13126, 0x0}, ++ {0x13127, 0x0}, ++ {0x13110, 0x0}, ++ {0x13111, 0x0}, ++ {0x13112, 0x0}, ++ {0x13113, 0x0}, ++ {0x13168, 0x0}, ++ {0x13169, 0x0}, ++ {0x1316a, 0x0}, ++ {0x1316b, 0x0}, ++ {0x1316c, 0x0}, ++ {0x1316d, 0x0}, ++ {0x1316e, 0x0}, ++ {0x1316f, 0x0}, ++ {0x1311c, 0x0}, ++ {0x1311d, 0x0}, ++ {0x1311e, 0x0}, ++ {0x1311f, 0x0}, ++ {0x13224, 0x0}, ++ {0x13225, 0x0}, ++ {0x13226, 0x0}, ++ {0x13227, 0x0}, ++ {0x13210, 0x0}, ++ {0x13211, 0x0}, ++ {0x13212, 0x0}, ++ {0x13213, 0x0}, ++ {0x13268, 0x0}, ++ {0x13269, 0x0}, ++ {0x1326a, 0x0}, ++ {0x1326b, 0x0}, ++ {0x1326c, 0x0}, ++ {0x1326d, 0x0}, ++ {0x1326e, 0x0}, ++ {0x1326f, 0x0}, ++ {0x1321c, 0x0}, ++ {0x1321d, 0x0}, ++ {0x1321e, 0x0}, ++ {0x1321f, 0x0}, ++ {0x13324, 0x0}, ++ {0x13325, 0x0}, ++ {0x13326, 0x0}, ++ {0x13327, 0x0}, ++ {0x13310, 0x0}, ++ {0x13311, 0x0}, ++ {0x13312, 0x0}, ++ {0x13313, 0x0}, ++ {0x13368, 0x0}, ++ {0x13369, 0x0}, ++ {0x1336a, 0x0}, ++ {0x1336b, 0x0}, ++ {0x1336c, 0x0}, ++ {0x1336d, 0x0}, ++ {0x1336e, 0x0}, ++ {0x1336f, 0x0}, ++ {0x1331c, 0x0}, ++ {0x1331d, 0x0}, ++ {0x1331e, 0x0}, ++ {0x1331f, 0x0}, ++ {0x13424, 0x0}, ++ {0x13425, 0x0}, ++ {0x13426, 0x0}, ++ {0x13427, 0x0}, ++ {0x13410, 0x0}, ++ {0x13411, 0x0}, ++ {0x13412, 0x0}, ++ {0x13413, 0x0}, ++ {0x13468, 0x0}, ++ {0x13469, 0x0}, ++ {0x1346a, 0x0}, ++ {0x1346b, 0x0}, ++ {0x1346c, 0x0}, ++ {0x1346d, 0x0}, ++ {0x1346e, 0x0}, ++ {0x1346f, 0x0}, ++ {0x1341c, 0x0}, ++ {0x1341d, 0x0}, ++ {0x1341e, 0x0}, ++ {0x1341f, 0x0}, ++ {0x13524, 0x0}, ++ {0x13525, 0x0}, ++ {0x13526, 0x0}, ++ {0x13527, 0x0}, ++ {0x13510, 0x0}, ++ {0x13511, 0x0}, ++ {0x13512, 0x0}, ++ {0x13513, 0x0}, ++ {0x13568, 0x0}, ++ {0x13569, 0x0}, ++ {0x1356a, 0x0}, ++ {0x1356b, 0x0}, ++ {0x1356c, 0x0}, ++ {0x1356d, 0x0}, ++ {0x1356e, 0x0}, ++ {0x1356f, 0x0}, ++ {0x1351c, 0x0}, ++ {0x1351d, 0x0}, ++ {0x1351e, 0x0}, ++ {0x1351f, 0x0}, ++ {0x13624, 0x0}, ++ {0x13625, 0x0}, ++ {0x13626, 0x0}, ++ {0x13627, 0x0}, ++ {0x13610, 0x0}, ++ {0x13611, 0x0}, ++ {0x13612, 0x0}, ++ {0x13613, 0x0}, ++ {0x13668, 0x0}, ++ {0x13669, 0x0}, ++ {0x1366a, 0x0}, ++ {0x1366b, 0x0}, ++ {0x1366c, 0x0}, ++ {0x1366d, 0x0}, ++ {0x1366e, 0x0}, ++ {0x1366f, 0x0}, ++ {0x1361c, 0x0}, ++ {0x1361d, 0x0}, ++ {0x1361e, 0x0}, ++ {0x1361f, 0x0}, ++ {0x13724, 0x0}, ++ {0x13725, 0x0}, ++ {0x13726, 0x0}, ++ {0x13727, 0x0}, ++ {0x13710, 0x0}, ++ {0x13711, 0x0}, ++ {0x13712, 0x0}, ++ {0x13713, 0x0}, ++ {0x13768, 0x0}, ++ {0x13769, 0x0}, ++ {0x1376a, 0x0}, ++ {0x1376b, 0x0}, ++ {0x1376c, 0x0}, ++ {0x1376d, 0x0}, ++ {0x1376e, 0x0}, ++ {0x1376f, 0x0}, ++ {0x1371c, 0x0}, ++ {0x1371d, 0x0}, ++ {0x1371e, 0x0}, ++ {0x1371f, 0x0}, ++ {0x13824, 0x0}, ++ {0x13825, 0x0}, ++ {0x13826, 0x0}, ++ {0x13827, 0x0}, ++ {0x13810, 0x0}, ++ {0x13811, 0x0}, ++ {0x13812, 0x0}, ++ {0x13813, 0x0}, ++ {0x13868, 0x0}, ++ {0x13869, 0x0}, ++ {0x1386a, 0x0}, ++ {0x1386b, 0x0}, ++ {0x1386c, 0x0}, ++ {0x1386d, 0x0}, ++ {0x1386e, 0x0}, ++ {0x1386f, 0x0}, ++ {0x1381c, 0x0}, ++ {0x1381d, 0x0}, ++ {0x1381e, 0x0}, ++ {0x1381f, 0x0}, ++ {0x1300c, 0x0}, ++ {0x1300d, 0x0}, ++ {0x13015, 0x0}, ++ {0x13016, 0x0}, ++ {0x13019, 0x0}, ++ {0x1301b, 0x0}, ++ {0x13022, 0x0}, ++ {0x13023, 0x0}, ++ {0x130d0, 0x0}, ++ {0x130d1, 0x0}, ++ {0x130d2, 0x0}, ++ {0x130d3, 0x0}, ++ {0x130d4, 0x0}, ++ {0x90807, 0x0}, ++ {0x90808, 0x0}, ++ {0x90813, 0x0}, ++ {0x2004e, 0x0}, ++ {0x2000d, 0x0}, ++ {0x20077, 0x0}, ++}; ++ ++/* PHY Initialize Configuration for Pstate 0 */ ++static struct ddrphy_cfg_param ddr_phy_fsp0_cfg[] = { ++ {0x90802, 0x1}, ++ {0x2004a, 0x601}, ++ {0x2004b, 0x1c3e}, ++ {0x2004c, 0x2e8f}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x101}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20002, 0x2}, ++ {0x20000, 0x2}, ++ {0x90801, 0x4d}, ++ {0x90809, 0x6800}, ++ {0x1005e, 0x366}, ++ {0x10060, 0x366}, ++ {0x10062, 0x366}, ++ {0x10064, 0x366}, ++ {0x1005f, 0x366}, ++ {0x10061, 0x366}, ++ {0x10063, 0x366}, ++ {0x10065, 0x366}, ++ {0x1105e, 0x366}, ++ {0x11060, 0x366}, ++ {0x11062, 0x366}, ++ {0x11064, 0x366}, ++ {0x1105f, 0x366}, ++ {0x11061, 0x366}, ++ {0x11063, 0x366}, ++ {0x11065, 0x366}, ++ {0x1205e, 0x366}, ++ {0x12060, 0x366}, ++ {0x12062, 0x366}, ++ {0x12064, 0x366}, ++ {0x1205f, 0x366}, ++ {0x12061, 0x366}, ++ {0x12063, 0x366}, ++ {0x12065, 0x366}, ++ {0x1305e, 0x366}, ++ {0x13060, 0x366}, ++ {0x13062, 0x366}, ++ {0x13064, 0x366}, ++ {0x1305f, 0x366}, ++ {0x13061, 0x366}, ++ {0x13063, 0x366}, ++ {0x13065, 0x366}, ++ {0x10005, 0x0}, ++ {0x1000b, 0x0}, ++ {0x11005, 0x0}, ++ {0x1100b, 0x0}, ++ {0x12005, 0x0}, ++ {0x1200b, 0x0}, ++ {0x13005, 0x0}, ++ {0x1300b, 0x0}, ++ {0x20007, 0x200}, ++ {0x20013, 0x2c}, ++ {0x30038, 0x3}, ++ {0x30039, 0x3}, ++ {0x3003a, 0x3}, ++ {0x31038, 0x3}, ++ {0x31039, 0x3}, ++ {0x3103a, 0x3}, ++ {0x10038, 0x3}, ++ {0x1003a, 0x3}, ++ {0x11038, 0x3}, ++ {0x1103a, 0x3}, ++ {0x12038, 0x3}, ++ {0x1203a, 0x3}, ++ {0x13038, 0x3}, ++ {0x1303a, 0x3}, ++ {0x1003b, 0x3}, ++ {0x1103b, 0x3}, ++ {0x1203b, 0x3}, ++ {0x1303b, 0x3}, ++ {0x10009, 0x0}, ++ {0x10037, 0x0}, ++ {0x11009, 0x0}, ++ {0x11037, 0x0}, ++ {0x12009, 0x0}, ++ {0x12037, 0x0}, ++ {0x13009, 0x0}, ++ {0x13037, 0x0}, ++ {0x10004, 0x0}, ++ {0x10003, 0x0}, ++ {0x11004, 0x0}, ++ {0x11003, 0x0}, ++ {0x12004, 0x0}, ++ {0x12003, 0x0}, ++ {0x13004, 0x0}, ++ {0x13003, 0x0}, ++ {0x20004, 0x320}, ++ {0x30050, 0x15}, ++ {0x30051, 0x15}, ++ {0x30052, 0x15}, ++ {0x30053, 0x15}, ++ {0x31050, 0x15}, ++ {0x31051, 0x15}, ++ {0x31052, 0x15}, ++ {0x31053, 0x15}, ++ {0x1004e, 0x15}, ++ {0x1004f, 0x15}, ++ {0x10050, 0x15}, ++ {0x10051, 0x15}, ++ {0x1014e, 0x15}, ++ {0x1014f, 0x15}, ++ {0x10150, 0x15}, ++ {0x10151, 0x15}, ++ {0x1024e, 0x15}, ++ {0x1024f, 0x15}, ++ {0x10250, 0x15}, ++ {0x10251, 0x15}, ++ {0x1034e, 0x15}, ++ {0x1034f, 0x15}, ++ {0x10350, 0x15}, ++ {0x10351, 0x15}, ++ {0x1044e, 0x15}, ++ {0x1044f, 0x15}, ++ {0x10450, 0x15}, ++ {0x10451, 0x15}, ++ {0x1054e, 0x15}, ++ {0x1054f, 0x15}, ++ {0x10550, 0x15}, ++ {0x10551, 0x15}, ++ {0x1064e, 0x15}, ++ {0x1064f, 0x15}, ++ {0x10650, 0x15}, ++ {0x10651, 0x15}, ++ {0x1074e, 0x15}, ++ {0x1074f, 0x15}, ++ {0x10750, 0x15}, ++ {0x10751, 0x15}, ++ {0x1084e, 0x15}, ++ {0x1084f, 0x15}, ++ {0x10850, 0x15}, ++ {0x10851, 0x15}, ++ {0x1104e, 0x15}, ++ {0x1104f, 0x15}, ++ {0x11050, 0x15}, ++ {0x11051, 0x15}, ++ {0x1114e, 0x15}, ++ {0x1114f, 0x15}, ++ {0x11150, 0x15}, ++ {0x11151, 0x15}, ++ {0x1124e, 0x15}, ++ {0x1124f, 0x15}, ++ {0x11250, 0x15}, ++ {0x11251, 0x15}, ++ {0x1134e, 0x15}, ++ {0x1134f, 0x15}, ++ {0x11350, 0x15}, ++ {0x11351, 0x15}, ++ {0x1144e, 0x15}, ++ {0x1144f, 0x15}, ++ {0x11450, 0x15}, ++ {0x11451, 0x15}, ++ {0x1154e, 0x15}, ++ {0x1154f, 0x15}, ++ {0x11550, 0x15}, ++ {0x11551, 0x15}, ++ {0x1164e, 0x15}, ++ {0x1164f, 0x15}, ++ {0x11650, 0x15}, ++ {0x11651, 0x15}, ++ {0x1174e, 0x15}, ++ {0x1174f, 0x15}, ++ {0x11750, 0x15}, ++ {0x11751, 0x15}, ++ {0x1184e, 0x15}, ++ {0x1184f, 0x15}, ++ {0x11850, 0x15}, ++ {0x11851, 0x15}, ++ {0x1204e, 0x15}, ++ {0x1204f, 0x15}, ++ {0x12050, 0x15}, ++ {0x12051, 0x15}, ++ {0x1214e, 0x15}, ++ {0x1214f, 0x15}, ++ {0x12150, 0x15}, ++ {0x12151, 0x15}, ++ {0x1224e, 0x15}, ++ {0x1224f, 0x15}, ++ {0x12250, 0x15}, ++ {0x12251, 0x15}, ++ {0x1234e, 0x15}, ++ {0x1234f, 0x15}, ++ {0x12350, 0x15}, ++ {0x12351, 0x15}, ++ {0x1244e, 0x15}, ++ {0x1244f, 0x15}, ++ {0x12450, 0x15}, ++ {0x12451, 0x15}, ++ {0x1254e, 0x15}, ++ {0x1254f, 0x15}, ++ {0x12550, 0x15}, ++ {0x12551, 0x15}, ++ {0x1264e, 0x15}, ++ {0x1264f, 0x15}, ++ {0x12650, 0x15}, ++ {0x12651, 0x15}, ++ {0x1274e, 0x15}, ++ {0x1274f, 0x15}, ++ {0x12750, 0x15}, ++ {0x12751, 0x15}, ++ {0x1284e, 0x15}, ++ {0x1284f, 0x15}, ++ {0x12850, 0x15}, ++ {0x12851, 0x15}, ++ {0x1304e, 0x15}, ++ {0x1304f, 0x15}, ++ {0x13050, 0x15}, ++ {0x13051, 0x15}, ++ {0x1314e, 0x15}, ++ {0x1314f, 0x15}, ++ {0x13150, 0x15}, ++ {0x13151, 0x15}, ++ {0x1324e, 0x15}, ++ {0x1324f, 0x15}, ++ {0x13250, 0x15}, ++ {0x13251, 0x15}, ++ {0x1334e, 0x15}, ++ {0x1334f, 0x15}, ++ {0x13350, 0x15}, ++ {0x13351, 0x15}, ++ {0x1344e, 0x15}, ++ {0x1344f, 0x15}, ++ {0x13450, 0x15}, ++ {0x13451, 0x15}, ++ {0x1354e, 0x15}, ++ {0x1354f, 0x15}, ++ {0x13550, 0x15}, ++ {0x13551, 0x15}, ++ {0x1364e, 0x15}, ++ {0x1364f, 0x15}, ++ {0x13650, 0x15}, ++ {0x13651, 0x15}, ++ {0x1374e, 0x15}, ++ {0x1374f, 0x15}, ++ {0x13750, 0x15}, ++ {0x13751, 0x15}, ++ {0x1384e, 0x15}, ++ {0x1384f, 0x15}, ++ {0x13850, 0x15}, ++ {0x13851, 0x15}, ++ {0x30030, 0x0}, ++ {0x30031, 0x0}, ++ {0x30035, 0x0}, ++ {0x31030, 0x0}, ++ {0x31031, 0x0}, ++ {0x31035, 0x0}, ++ {0x10030, 0x0}, ++ {0x10035, 0x0}, ++ {0x10036, 0x0}, ++ {0x11030, 0x0}, ++ {0x11035, 0x0}, ++ {0x11036, 0x0}, ++ {0x12030, 0x0}, ++ {0x12035, 0x0}, ++ {0x12036, 0x0}, ++ {0x13030, 0x0}, ++ {0x13035, 0x0}, ++ {0x13036, 0x0}, ++ {0x3003c, 0x5}, ++ {0x3103c, 0x5}, ++ {0x1003c, 0x5}, ++ {0x1003d, 0x5}, ++ {0x1003e, 0x5}, ++ {0x1103c, 0x5}, ++ {0x1103d, 0x5}, ++ {0x1103e, 0x5}, ++ {0x1203c, 0x5}, ++ {0x1203d, 0x5}, ++ {0x1203e, 0x5}, ++ {0x1303c, 0x5}, ++ {0x1303d, 0x5}, ++ {0x1303e, 0x5}, ++ {0x20003, 0x1}, ++ {0x10006, 0x2}, ++ {0x11006, 0x2}, ++ {0x12006, 0x2}, ++ {0x13006, 0x2}, ++ {0x20001, 0x1122}, ++ {0x20009, 0x0}, ++ {0x20008, 0x0}, ++ {0x200d9, 0x0}, ++ {0x30eef, 0x0}, ++ {0x31eef, 0x0}, ++ {0x20014, 0x1300}, ++ {0x9080a, 0x1300}, ++ {0x10040, 0xe0e}, ++ {0x10042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x10043, 0x0}, ++ {0x10044, 0xe0e}, ++ {0x10045, 0xe0e}, ++ {0x11040, 0xe0e}, ++ {0x11042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x11043, 0x0}, ++ {0x11044, 0xe0e}, ++ {0x11045, 0xe0e}, ++ {0x12040, 0xe0e}, ++ {0x12042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x12043, 0x0}, ++ {0x12044, 0xe0e}, ++ {0x12045, 0xe0e}, ++ {0x13040, 0xe0e}, ++ {0x13042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x13043, 0x0}, ++ {0x13044, 0xe0e}, ++ {0x13045, 0xe0e}, ++ {0x30040, 0xe0e}, ++ {0x30041, 0xe0e}, ++ {0x30042, 0xe0e}, ++ {0x30043, 0xe0e}, ++ {0x30330, 0x33}, ++ {0x31040, 0xe0e}, ++ {0x31041, 0xe0e}, ++ {0x31042, 0xe0e}, ++ {0x31043, 0xe0e}, ++ {0x31330, 0x33}, ++ {0x20331, 0x33}, ++ {0x10048, 0xc00}, ++ {0x1004a, 0xc00}, ++ {0x1004b, 0xc00}, ++ {0x1004c, 0xe00}, ++ {0x1004d, 0xe00}, ++ {0x11048, 0xc00}, ++ {0x1104a, 0xc00}, ++ {0x1104b, 0xc00}, ++ {0x1104c, 0xe00}, ++ {0x1104d, 0xe00}, ++ {0x12048, 0xc00}, ++ {0x1204a, 0xc00}, ++ {0x1204b, 0xc00}, ++ {0x1204c, 0xe00}, ++ {0x1204d, 0xe00}, ++ {0x13048, 0xc00}, ++ {0x1304a, 0xc00}, ++ {0x1304b, 0xc00}, ++ {0x1304c, 0xe00}, ++ {0x1304d, 0xe00}, ++ {0x30048, 0xc00}, ++ {0x30049, 0xc00}, ++ {0x3004a, 0xc00}, ++ {0x3004b, 0xc00}, ++ {0x31048, 0xc00}, ++ {0x31049, 0xc00}, ++ {0x3104a, 0xc00}, ++ {0x3104b, 0xc00}, ++ {0x30033, 0xcc}, ++ {0x30034, 0xcc}, ++ {0x3002e, 0xcc}, ++ {0x31033, 0xcc}, ++ {0x31034, 0xcc}, ++ {0x3102e, 0xcc}, ++ {0x10033, 0xcc}, ++ {0x1002e, 0xcc}, ++ {0x1002f, 0xcc}, ++ {0x11033, 0xcc}, ++ {0x1102e, 0xcc}, ++ {0x1102f, 0xcc}, ++ {0x12033, 0xcc}, ++ {0x1202e, 0xcc}, ++ {0x1202f, 0xcc}, ++ {0x13033, 0xcc}, ++ {0x1302e, 0xcc}, ++ {0x1302f, 0xcc}, ++ {0x20015, 0x0}, ++ {0x90806, 0x0}, ++ {0x100e8, 0x0}, ++ {0x100e9, 0x15}, ++ {0x110e8, 0x0}, ++ {0x110e9, 0x15}, ++ {0x120e8, 0x0}, ++ {0x120e9, 0x15}, ++ {0x130e8, 0x0}, ++ {0x130e9, 0x15}, ++ {0x10001, 0x0}, ++ {0x11001, 0x0}, ++ {0x12001, 0x0}, ++ {0x13001, 0x0}, ++ {0x20012, 0xa1a1}, ++ {0x20017, 0x40}, ++ {0x2000a, 0x40}, ++ {0x20186, 0xa1}, ++ {0x20187, 0x40}, ++ {0x20010, 0x0}, ++ {0x20011, 0xf}, ++ {0x9080b, 0xf}, ++ {0x9080c, 0xf}, ++ {0x100a5, 0x1}, ++ {0x110a5, 0x1}, ++ {0x120a5, 0x1}, ++ {0x130a5, 0x1}, ++ {0x10014, 0x3232}, ++ {0x11014, 0x3232}, ++ {0x12014, 0x3232}, ++ {0x13014, 0x3232}, ++ {0x1000f, 0x1086}, ++ {0x1100f, 0x1086}, ++ {0x1200f, 0x1086}, ++ {0x1300f, 0x1086}, ++ {0x20035, 0x100c}, ++ {0x20036, 0x100c}, ++ {0x20037, 0x41c}, ++ {0x20037, 0x45c}, ++ {0x20038, 0x1920}, ++ {0x20039, 0x101c}, ++ {0x2003a, 0x101c}, ++ {0x2003b, 0x42c}, ++ {0x2003c, 0x2d30}, ++ {0x2003d, 0x1004}, ++ {0x2003e, 0x1004}, ++ {0x2003f, 0x414}, ++ {0x20040, 0x1118}, ++ {0x2002c, 0x843}, ++ {0x2002d, 0x843}, ++ {0x20030, 0x843}, ++ {0x2002e, 0x81f}, ++ {0x2002f, 0x81f}, ++ {0x2000c, 0x0}, ++ {0x2001b, 0x0}, ++ {0x10007, 0x0}, ++ {0x11007, 0x0}, ++ {0x12007, 0x0}, ++ {0x13007, 0x0}, ++ {0xc0080, 0x3}, ++}; ++ ++/* P0 message block parameter for training firmware */ ++static struct ddrphy_cfg_param ddr_phy_msgh_fsp0_cfg[] = { ++ {0x58000, 0x4000}, ++ {0x58002, 0x30}, ++ {0x58003, 0x1900}, ++ {0x58004, 0x4}, ++ {0x58005, 0x4}, ++ {0x58008, 0x17df}, ++ {0x58009, 0xff}, ++ {0x5800b, 0x2}, ++ {0x5800d, 0x100}, ++ {0x5800e, 0xf}, ++ {0x58012, 0x310}, ++ {0x5801f, 0x1000}, ++ {0x58020, 0x3}, ++ {0x5802d, 0xb0b0}, ++ {0x5802e, 0xb0b0}, ++ {0x5802f, 0xbbbb}, ++ {0x58030, 0xbbbb}, ++ {0x58031, 0x606}, ++ {0x58032, 0x606}, ++ {0x58033, 0x5454}, ++ {0x58034, 0x5454}, ++ {0x58035, 0x4646}, ++ {0x58036, 0x4646}, ++ {0x58037, 0x2d2d}, ++ {0x58038, 0x2d2d}, ++ {0x58039, 0x8080}, ++ {0x5803a, 0x8080}, ++ {0x5803b, 0x1c1c}, ++ {0x5803c, 0x1c1c}, ++ {0x5803d, 0x1c1c}, ++ {0x5803e, 0x1c1c}, ++ {0x58041, 0xac84}, ++ {0x58042, 0xac84}, ++ {0x58043, 0x1e1e}, ++ {0x58044, 0x1e1e}, ++ {0x58045, 0x1010}, ++ {0x58046, 0x1010}, ++ {0x58047, 0x202}, ++ {0x58048, 0x202}, ++ {0x5804f, 0x8080}, ++ {0x58050, 0x8080}, ++ {0x58055, 0x404}, ++ {0x58056, 0x404}, ++ {0x58074, 0x2e}, ++ {0x58075, 0x50}, ++ {0x58080, 0x1}, ++ {0x58081, 0x4b00}, ++ {0x58082, 0x43}, ++}; ++ ++/* DRAM PHY init engine image for Pstate 0 */ ++static struct ddrphy_cfg_param ddr_phy_pie_fsp0_cfg[] = { ++ {0x908f0, 0x65}, ++ {0x908f1, 0x258}, ++ {0x908f2, 0x0}, ++ {0x908f3, 0x58}, ++ {0x908f4, 0x14}, ++ {0x908f5, 0x0}, ++ {0x908f6, 0xb0}, ++ {0x908f7, 0x0}, ++ {0x41008, 0xc9d8}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0xc808}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x2b00}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0xc958}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0xcf08}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x2b00}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0xc0d8}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0xd848}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x2b00}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0xc158}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0xddc8}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x2b00}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0xc1d8}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0xc308}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x2b00}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0xc558}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0xea08}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x2b00}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0xc5d8}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0xe308}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x2b00}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x48d8}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x4248}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x88d8}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x9648}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x2b00}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0xca58}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0xc108}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x2b00}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0xcb58}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0xc008}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x2b00}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0xd4d8}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0xc008}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0x20015, 0x0}, ++ {0x3004a, 0x0}, ++ {0x3004b, 0x0}, ++ {0x3104a, 0x0}, ++ {0x3104b, 0x0}, ++ {0x2004a, 0x1a3e}, ++ {0x2004b, 0x1a3e}, ++ {0x2004c, 0x2c0f}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x101}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20041, 0x1}, ++ {0x90802, 0x1}, ++ {0x20045, 0x2}, ++ {0x10057, 0x0}, ++ {0x11057, 0x0}, ++ {0x12057, 0x0}, ++ {0x13057, 0x0}, ++ {0x1000f, 0x1086}, ++ {0x1100f, 0x1086}, ++ {0x1200f, 0x1086}, ++ {0x1300f, 0x1086}, ++ {0x90803, 0x4}, ++ {0x90804, 0x82}, ++ {0x90805, 0x1}, ++ {0x90903, 0x0}, ++ {0x9090b, 0x2}, ++ {0x90811, 0x0}, ++ {0x90812, 0xff00}, ++ {0x20072, 0x3}, ++ {0x9080e, 0x3}, ++ {0x20073, 0x3}, ++ {0x9080f, 0x3}, ++}; ++ ++/* DRAM PHY init engine image */ ++static struct ddrphy_cfg_param ddr_phy_pie[] = { ++ {0x41000, 0x0}, ++ {0x41001, 0x0}, ++ {0x41002, 0x0}, ++ {0x41003, 0x0}, ++ {0x41004, 0x0}, ++ {0x41005, 0x0}, ++ {0x41006, 0x0}, ++ {0x41007, 0x0}, ++ {0x41388, 0xc028}, ++ {0x41389, 0x0}, ++ {0x4138a, 0x0}, ++ {0x4138b, 0x10}, ++ {0x4138c, 0x0}, ++ {0x4138d, 0x0}, ++ {0x4138e, 0x0}, ++ {0x4138f, 0x0}, ++ {0x41390, 0x0}, ++ {0x41391, 0x0}, ++ {0x41392, 0x0}, ++ {0x41393, 0x400}, ++ {0x41394, 0x0}, ++ {0x41395, 0x0}, ++ {0x41396, 0x0}, ++ {0x41397, 0x0}, ++ {0x41398, 0x0}, ++ {0x41399, 0x0}, ++ {0x4139a, 0x0}, ++ {0x4139b, 0x0}, ++ {0x4139c, 0x0}, ++ {0x4139d, 0x0}, ++ {0x4139e, 0x0}, ++ {0x4139f, 0x0}, ++ {0x413a0, 0xc858}, ++ {0x413a1, 0x0}, ++ {0x413a2, 0x0}, ++ {0x413a3, 0x10}, ++ {0x413a4, 0xe088}, ++ {0x413a5, 0x0}, ++ {0x413a6, 0x0}, ++ {0x413a7, 0x10}, ++ {0x413a8, 0xe038}, ++ {0x413a9, 0x0}, ++ {0x413aa, 0x0}, ++ {0x413ab, 0x10}, ++ {0x413ac, 0xc858}, ++ {0x413ad, 0x0}, ++ {0x413ae, 0x0}, ++ {0x413af, 0x10}, ++ {0x413b0, 0xc088}, ++ {0x413b1, 0x0}, ++ {0x413b2, 0x0}, ++ {0x413b3, 0x10}, ++ {0x413b4, 0x0}, ++ {0x413b5, 0x0}, ++ {0x413b6, 0x0}, ++ {0x413b7, 0x0}, ++ {0x413b8, 0xc028}, ++ {0x413b9, 0x0}, ++ {0x413ba, 0x0}, ++ {0x413bb, 0x10}, ++ {0x413bc, 0x0}, ++ {0x413bd, 0x0}, ++ {0x413be, 0x0}, ++ {0x413bf, 0x0}, ++ {0x413c0, 0x0}, ++ {0x413c1, 0x0}, ++ {0x413c2, 0x0}, ++ {0x413c3, 0x400}, ++ {0x413c4, 0x0}, ++ {0x413c5, 0x0}, ++ {0x413c6, 0x0}, ++ {0x413c7, 0x0}, ++ {0x413c8, 0x0}, ++ {0x413c9, 0x0}, ++ {0x413ca, 0x0}, ++ {0x413cb, 0x0}, ++ {0x413cc, 0x0}, ++ {0x413cd, 0x0}, ++ {0x413ce, 0x0}, ++ {0x413cf, 0x0}, ++ {0x413d0, 0xc858}, ++ {0x413d1, 0x0}, ++ {0x413d2, 0x0}, ++ {0x413d3, 0x10}, ++ {0x413d4, 0xe208}, ++ {0x413d5, 0x0}, ++ {0x413d6, 0x0}, ++ {0x413d7, 0x10}, ++ {0x413d8, 0xe038}, ++ {0x413d9, 0x0}, ++ {0x413da, 0x0}, ++ {0x413db, 0x10}, ++ {0x413dc, 0xc858}, ++ {0x413dd, 0x0}, ++ {0x413de, 0x0}, ++ {0x413df, 0x10}, ++ {0x413e0, 0xc208}, ++ {0x413e1, 0x0}, ++ {0x413e2, 0x0}, ++ {0x413e3, 0x10}, ++ {0x413e4, 0x0}, ++ {0x413e5, 0x0}, ++ {0x413e6, 0x0}, ++ {0x413e7, 0x0}, ++ {0x413e8, 0xce58}, ++ {0x413e9, 0x0}, ++ {0x413ea, 0x0}, ++ {0x413eb, 0x10}, ++ {0x413ec, 0xc208}, ++ {0x413ed, 0x0}, ++ {0x413ee, 0x0}, ++ {0x413ef, 0x10}, ++ {0x413f0, 0x0}, ++ {0x413f1, 0x0}, ++ {0x413f2, 0x0}, ++ {0x413f3, 0x0}, ++ {0x413f4, 0x0}, ++ {0x413f5, 0x0}, ++ {0x413f6, 0x0}, ++ {0x413f7, 0x0}, ++ {0x413f8, 0xc370}, ++ {0x413f9, 0x0}, ++ {0x413fa, 0x0}, ++ {0x413fb, 0x10}, ++ {0x413fc, 0x0}, ++ {0x413fd, 0x0}, ++ {0x413fe, 0x0}, ++ {0x413ff, 0x0}, ++ {0x41400, 0xc040}, ++ {0x41401, 0x0}, ++ {0x41402, 0x0}, ++ {0x41403, 0x10}, ++ {0x41404, 0x0}, ++ {0x41405, 0x0}, ++ {0x41406, 0x0}, ++ {0x41407, 0x10}, ++ {0x41408, 0xd2d8}, ++ {0x41409, 0x0}, ++ {0x4140a, 0x0}, ++ {0x4140b, 0x10}, ++ {0x4140c, 0xe008}, ++ {0x4140d, 0x0}, ++ {0x4140e, 0x0}, ++ {0x4140f, 0x10}, ++ {0x41410, 0x0}, ++ {0x41411, 0x0}, ++ {0x41412, 0x0}, ++ {0x41413, 0x5b00}, ++ {0x41414, 0x0}, ++ {0x41415, 0x0}, ++ {0x41416, 0x0}, ++ {0x41417, 0x0}, ++ {0x41418, 0xc0f0}, ++ {0x41419, 0x0}, ++ {0x4141a, 0x0}, ++ {0x4141b, 0x10}, ++ {0x4141c, 0x0}, ++ {0x4141d, 0x0}, ++ {0x4141e, 0x0}, ++ {0x4141f, 0x0}, ++ {0x41420, 0xcfd8}, ++ {0x41421, 0x0}, ++ {0x41422, 0x0}, ++ {0x41423, 0x10}, ++ {0x41424, 0xc008}, ++ {0x41425, 0x0}, ++ {0x41426, 0x0}, ++ {0x41427, 0x10}, ++ {0x41428, 0x0}, ++ {0x41429, 0x0}, ++ {0x4142a, 0x0}, ++ {0x4142b, 0x2b00}, ++ {0x4142c, 0x0}, ++ {0x4142d, 0x0}, ++ {0x4142e, 0x0}, ++ {0x4142f, 0x0}, ++ {0x41430, 0xd058}, ++ {0x41431, 0x0}, ++ {0x41432, 0x0}, ++ {0x41433, 0x10}, ++ {0x41434, 0xc008}, ++ {0x41435, 0x0}, ++ {0x41436, 0x0}, ++ {0x41437, 0x10}, ++ {0x41438, 0x0}, ++ {0x41439, 0x0}, ++ {0x4143a, 0x0}, ++ {0x4143b, 0x2b00}, ++ {0x4143c, 0x0}, ++ {0x4143d, 0x0}, ++ {0x4143e, 0x0}, ++ {0x4143f, 0x0}, ++ {0x41440, 0xd0d8}, ++ {0x41441, 0x0}, ++ {0x41442, 0x0}, ++ {0x41443, 0x10}, ++ {0x41444, 0xc088}, ++ {0x41445, 0x0}, ++ {0x41446, 0x0}, ++ {0x41447, 0x10}, ++ {0x41448, 0x0}, ++ {0x41449, 0x0}, ++ {0x4144a, 0x0}, ++ {0x4144b, 0x2b00}, ++ {0x4144c, 0x0}, ++ {0x4144d, 0x0}, ++ {0x4144e, 0x0}, ++ {0x4144f, 0x0}, ++ {0x41450, 0xd158}, ++ {0x41451, 0x0}, ++ {0x41452, 0x0}, ++ {0x41453, 0x10}, ++ {0x41454, 0xc008}, ++ {0x41455, 0x0}, ++ {0x41456, 0x0}, ++ {0x41457, 0x10}, ++ {0x41458, 0x0}, ++ {0x41459, 0x0}, ++ {0x4145a, 0x0}, ++ {0x4145b, 0x5b00}, ++ {0x4145c, 0x0}, ++ {0x4145d, 0x0}, ++ {0x4145e, 0x0}, ++ {0x4145f, 0x0}, ++ {0x41460, 0x402c}, ++ {0x41461, 0xd00}, ++ {0x41462, 0x1}, ++ {0x41463, 0x400}, ++ {0x41464, 0x4050}, ++ {0x41465, 0x800}, ++ {0x41466, 0x0}, ++ {0x41467, 0x0}, ++ {0x41468, 0x0}, ++ {0x41469, 0x0}, ++ {0x4146a, 0x0}, ++ {0x4146b, 0x400}, ++ {0x4146c, 0x0}, ++ {0x4146d, 0x0}, ++ {0x4146e, 0x0}, ++ {0x4146f, 0x0}, ++ {0x41470, 0x0}, ++ {0x41471, 0x0}, ++ {0x41472, 0x0}, ++ {0x41473, 0x400}, ++ {0x41474, 0x4050}, ++ {0x41475, 0x803}, ++ {0x41476, 0x0}, ++ {0x41477, 0x0}, ++ {0x41478, 0x0}, ++ {0x41479, 0x0}, ++ {0x4147a, 0x0}, ++ {0x4147b, 0x7f00}, ++ {0x4147c, 0x0}, ++ {0x4147d, 0x0}, ++ {0x4147e, 0x0}, ++ {0x4147f, 0x400}, ++ {0x41480, 0x407c}, ++ {0x41481, 0x0}, ++ {0x41482, 0x0}, ++ {0x41483, 0x400}, ++ {0x41484, 0x0}, ++ {0x41485, 0x0}, ++ {0x41486, 0x0}, ++ {0x41487, 0x0}, ++ {0x41488, 0x0}, ++ {0x41489, 0x0}, ++ {0x4148a, 0x0}, ++ {0x4148b, 0x400}, ++ {0x4148c, 0x0}, ++ {0x4148d, 0x0}, ++ {0x4148e, 0x1}, ++ {0x4148f, 0x0}, ++ {0x41490, 0x0}, ++ {0x41491, 0x0}, ++ {0x41492, 0x0}, ++ {0x41493, 0x400}, ++ {0x41494, 0x0}, ++ {0x41495, 0x0}, ++ {0x41496, 0x0}, ++ {0x41497, 0x0}, ++ {0x41498, 0x0}, ++ {0x41499, 0x0}, ++ {0x4149a, 0x0}, ++ {0x4149b, 0x0}, ++ {0x4149c, 0x0}, ++ {0x4149d, 0x0}, ++ {0x4149e, 0x0}, ++ {0x4149f, 0x0}, ++ {0x414a0, 0x802c}, ++ {0x414a1, 0xd00}, ++ {0x414a2, 0x1}, ++ {0x414a3, 0x410}, ++ {0x414a4, 0x8050}, ++ {0x414a5, 0x800}, ++ {0x414a6, 0x0}, ++ {0x414a7, 0x10}, ++ {0x414a8, 0x0}, ++ {0x414a9, 0x0}, ++ {0x414aa, 0x0}, ++ {0x414ab, 0x400}, ++ {0x414ac, 0x0}, ++ {0x414ad, 0x0}, ++ {0x414ae, 0x0}, ++ {0x414af, 0x0}, ++ {0x414b0, 0x0}, ++ {0x414b1, 0x0}, ++ {0x414b2, 0x0}, ++ {0x414b3, 0x400}, ++ {0x414b4, 0x8050}, ++ {0x414b5, 0x803}, ++ {0x414b6, 0x0}, ++ {0x414b7, 0x10}, ++ {0x414b8, 0x0}, ++ {0x414b9, 0x0}, ++ {0x414ba, 0x0}, ++ {0x414bb, 0x7f00}, ++ {0x414bc, 0x0}, ++ {0x414bd, 0x0}, ++ {0x414be, 0x0}, ++ {0x414bf, 0x400}, ++ {0x414c0, 0x807c}, ++ {0x414c1, 0x0}, ++ {0x414c2, 0x0}, ++ {0x414c3, 0x410}, ++ {0x414c4, 0x0}, ++ {0x414c5, 0x0}, ++ {0x414c6, 0x0}, ++ {0x414c7, 0x0}, ++ {0x414c8, 0x0}, ++ {0x414c9, 0x0}, ++ {0x414ca, 0x0}, ++ {0x414cb, 0x400}, ++ {0x414cc, 0x0}, ++ {0x414cd, 0x0}, ++ {0x414ce, 0x1}, ++ {0x414cf, 0x0}, ++ {0x414d0, 0x0}, ++ {0x414d1, 0x0}, ++ {0x414d2, 0x0}, ++ {0x414d3, 0x400}, ++ {0x414d4, 0x0}, ++ {0x414d5, 0x0}, ++ {0x414d6, 0x0}, ++ {0x414d7, 0x0}, ++ {0x414d8, 0x0}, ++ {0x414d9, 0x0}, ++ {0x414da, 0x0}, ++ {0x414db, 0x0}, ++ {0x414dc, 0x0}, ++ {0x414dd, 0x0}, ++ {0x414de, 0x0}, ++ {0x414df, 0x0}, ++ {0x414e0, 0x402c}, ++ {0x414e1, 0xd00}, ++ {0x414e2, 0x1}, ++ {0x414e3, 0x0}, ++ {0x414e4, 0x4050}, ++ {0x414e5, 0x800}, ++ {0x414e6, 0x0}, ++ {0x414e7, 0x0}, ++ {0x414e8, 0x0}, ++ {0x414e9, 0x0}, ++ {0x414ea, 0x0}, ++ {0x414eb, 0x0}, ++ {0x414ec, 0x0}, ++ {0x414ed, 0x0}, ++ {0x414ee, 0x0}, ++ {0x414ef, 0x0}, ++ {0x414f0, 0x0}, ++ {0x414f1, 0x0}, ++ {0x414f2, 0x0}, ++ {0x414f3, 0x0}, ++ {0x414f4, 0x4050}, ++ {0x414f5, 0x803}, ++ {0x414f6, 0x0}, ++ {0x414f7, 0x0}, ++ {0x414f8, 0x0}, ++ {0x414f9, 0x0}, ++ {0x414fa, 0x0}, ++ {0x414fb, 0x0}, ++ {0x414fc, 0x0}, ++ {0x414fd, 0x0}, ++ {0x414fe, 0x0}, ++ {0x414ff, 0x0}, ++ {0x41500, 0x0}, ++ {0x41501, 0x0}, ++ {0x41502, 0x0}, ++ {0x41503, 0x0}, ++ {0x41504, 0x4050}, ++ {0x41505, 0x800}, ++ {0x41506, 0x0}, ++ {0x41507, 0x0}, ++ {0x41508, 0x0}, ++ {0x41509, 0x0}, ++ {0x4150a, 0x0}, ++ {0x4150b, 0x6b00}, ++ {0x4150c, 0x0}, ++ {0x4150d, 0x0}, ++ {0x4150e, 0x0}, ++ {0x4150f, 0x400}, ++ {0x41510, 0x0}, ++ {0x41511, 0x0}, ++ {0x41512, 0x0}, ++ {0x41513, 0x0}, ++ {0x41514, 0x407c}, ++ {0x41515, 0x0}, ++ {0x41516, 0x0}, ++ {0x41517, 0x0}, ++ {0x41518, 0x0}, ++ {0x41519, 0x0}, ++ {0x4151a, 0x0}, ++ {0x4151b, 0x0}, ++ {0x4151c, 0x0}, ++ {0x4151d, 0x0}, ++ {0x4151e, 0x0}, ++ {0x4151f, 0x0}, ++ {0x41520, 0x0}, ++ {0x41521, 0x0}, ++ {0x41522, 0x1}, ++ {0x41523, 0x0}, ++ {0x41524, 0x0}, ++ {0x41525, 0x0}, ++ {0x41526, 0x0}, ++ {0x41527, 0x0}, ++ {0x41528, 0x0}, ++ {0x41529, 0x0}, ++ {0x4152a, 0x0}, ++ {0x4152b, 0x4b00}, ++ {0x4152c, 0x0}, ++ {0x4152d, 0x0}, ++ {0x4152e, 0x0}, ++ {0x4152f, 0x1800}, ++ {0x41530, 0x0}, ++ {0x41531, 0x0}, ++ {0x41532, 0x0}, ++ {0x41533, 0x0}, ++ {0x41534, 0x802c}, ++ {0x41535, 0xd00}, ++ {0x41536, 0x1}, ++ {0x41537, 0x10}, ++ {0x41538, 0x8050}, ++ {0x41539, 0x800}, ++ {0x4153a, 0x0}, ++ {0x4153b, 0x10}, ++ {0x4153c, 0x0}, ++ {0x4153d, 0x0}, ++ {0x4153e, 0x0}, ++ {0x4153f, 0x0}, ++ {0x41540, 0x0}, ++ {0x41541, 0x0}, ++ {0x41542, 0x0}, ++ {0x41543, 0x0}, ++ {0x41544, 0x0}, ++ {0x41545, 0x0}, ++ {0x41546, 0x0}, ++ {0x41547, 0x0}, ++ {0x41548, 0x8050}, ++ {0x41549, 0x803}, ++ {0x4154a, 0x0}, ++ {0x4154b, 0x10}, ++ {0x4154c, 0x0}, ++ {0x4154d, 0x0}, ++ {0x4154e, 0x0}, ++ {0x4154f, 0x0}, ++ {0x41550, 0x0}, ++ {0x41551, 0x0}, ++ {0x41552, 0x0}, ++ {0x41553, 0x0}, ++ {0x41554, 0x0}, ++ {0x41555, 0x0}, ++ {0x41556, 0x0}, ++ {0x41557, 0x0}, ++ {0x41558, 0x8050}, ++ {0x41559, 0x800}, ++ {0x4155a, 0x0}, ++ {0x4155b, 0x10}, ++ {0x4155c, 0x0}, ++ {0x4155d, 0x0}, ++ {0x4155e, 0x0}, ++ {0x4155f, 0x0}, ++ {0x41560, 0x0}, ++ {0x41561, 0x0}, ++ {0x41562, 0x0}, ++ {0x41563, 0x6b00}, ++ {0x41564, 0x0}, ++ {0x41565, 0x0}, ++ {0x41566, 0x0}, ++ {0x41567, 0x400}, ++ {0x41568, 0x807c}, ++ {0x41569, 0x0}, ++ {0x4156a, 0x0}, ++ {0x4156b, 0x10}, ++ {0x4156c, 0x0}, ++ {0x4156d, 0x0}, ++ {0x4156e, 0x0}, ++ {0x4156f, 0x0}, ++ {0x41570, 0x0}, ++ {0x41571, 0x0}, ++ {0x41572, 0x0}, ++ {0x41573, 0x0}, ++ {0x41574, 0x0}, ++ {0x41575, 0x0}, ++ {0x41576, 0x1}, ++ {0x41577, 0x0}, ++ {0x41578, 0x0}, ++ {0x41579, 0x0}, ++ {0x4157a, 0x0}, ++ {0x4157b, 0x7b00}, ++ {0x4157c, 0x0}, ++ {0x4157d, 0x0}, ++ {0x4157e, 0x0}, ++ {0x4157f, 0x2000}, ++ {0x41580, 0x402c}, ++ {0x41581, 0xd00}, ++ {0x41582, 0x1}, ++ {0x41583, 0x0}, ++ {0x41584, 0x5198}, ++ {0x41585, 0x803}, ++ {0x41586, 0x0}, ++ {0x41587, 0x0}, ++ {0x41588, 0x0}, ++ {0x41589, 0x0}, ++ {0x4158a, 0x0}, ++ {0x4158b, 0x3b00}, ++ {0x4158c, 0x0}, ++ {0x4158d, 0x0}, ++ {0x4158e, 0x0}, ++ {0x4158f, 0x0}, ++ {0x41590, 0x5218}, ++ {0x41591, 0x803}, ++ {0x41592, 0x0}, ++ {0x41593, 0x0}, ++ {0x41594, 0x0}, ++ {0x41595, 0x0}, ++ {0x41596, 0x0}, ++ {0x41597, 0x0}, ++ {0x41598, 0x0}, ++ {0x41599, 0x0}, ++ {0x4159a, 0x0}, ++ {0x4159b, 0x6b00}, ++ {0x4159c, 0x0}, ++ {0x4159d, 0x0}, ++ {0x4159e, 0x0}, ++ {0x4159f, 0x400}, ++ {0x415a0, 0x407c}, ++ {0x415a1, 0x0}, ++ {0x415a2, 0x0}, ++ {0x415a3, 0x0}, ++ {0x415a4, 0x0}, ++ {0x415a5, 0x0}, ++ {0x415a6, 0x0}, ++ {0x415a7, 0x0}, ++ {0x415a8, 0x0}, ++ {0x415a9, 0x0}, ++ {0x415aa, 0x0}, ++ {0x415ab, 0x0}, ++ {0x415ac, 0x0}, ++ {0x415ad, 0x0}, ++ {0x415ae, 0x1}, ++ {0x415af, 0x0}, ++ {0x415b0, 0x0}, ++ {0x415b1, 0x0}, ++ {0x415b2, 0x0}, ++ {0x415b3, 0x1b00}, ++ {0x415b4, 0x0}, ++ {0x415b5, 0x0}, ++ {0x415b6, 0x0}, ++ {0x415b7, 0x0}, ++ {0x415b8, 0x0}, ++ {0x415b9, 0x0}, ++ {0x415ba, 0x0}, ++ {0x415bb, 0x0}, ++ {0x415bc, 0x802c}, ++ {0x415bd, 0xd00}, ++ {0x415be, 0x1}, ++ {0x415bf, 0x10}, ++ {0x415c0, 0x9198}, ++ {0x415c1, 0x803}, ++ {0x415c2, 0x0}, ++ {0x415c3, 0x10}, ++ {0x415c4, 0x0}, ++ {0x415c5, 0x0}, ++ {0x415c6, 0x0}, ++ {0x415c7, 0x0}, ++ {0x415c8, 0x0}, ++ {0x415c9, 0x0}, ++ {0x415ca, 0x0}, ++ {0x415cb, 0x2b00}, ++ {0x415cc, 0x0}, ++ {0x415cd, 0x0}, ++ {0x415ce, 0x0}, ++ {0x415cf, 0x0}, ++ {0x415d0, 0x0}, ++ {0x415d1, 0x0}, ++ {0x415d2, 0x0}, ++ {0x415d3, 0x0}, ++ {0x415d4, 0x9218}, ++ {0x415d5, 0x803}, ++ {0x415d6, 0x0}, ++ {0x415d7, 0x10}, ++ {0x415d8, 0x0}, ++ {0x415d9, 0x0}, ++ {0x415da, 0x0}, ++ {0x415db, 0x6b00}, ++ {0x415dc, 0x0}, ++ {0x415dd, 0x0}, ++ {0x415de, 0x0}, ++ {0x415df, 0x400}, ++ {0x415e0, 0x0}, ++ {0x415e1, 0x0}, ++ {0x415e2, 0x0}, ++ {0x415e3, 0x0}, ++ {0x415e4, 0x807c}, ++ {0x415e5, 0x0}, ++ {0x415e6, 0x0}, ++ {0x415e7, 0x10}, ++ {0x415e8, 0x0}, ++ {0x415e9, 0x0}, ++ {0x415ea, 0x0}, ++ {0x415eb, 0x0}, ++ {0x415ec, 0x0}, ++ {0x415ed, 0x0}, ++ {0x415ee, 0x0}, ++ {0x415ef, 0x0}, ++ {0x415f0, 0x0}, ++ {0x415f1, 0x0}, ++ {0x415f2, 0x1}, ++ {0x415f3, 0x0}, ++ {0x415f4, 0x0}, ++ {0x415f5, 0x0}, ++ {0x415f6, 0x0}, ++ {0x415f7, 0x0}, ++ {0x415f8, 0x0}, ++ {0x415f9, 0x0}, ++ {0x415fa, 0x0}, ++ {0x415fb, 0xb00}, ++ {0x415fc, 0x0}, ++ {0x415fd, 0x0}, ++ {0x415fe, 0x0}, ++ {0x415ff, 0x400}, ++ {0x41600, 0x0}, ++ {0x41601, 0x0}, ++ {0x41602, 0x0}, ++ {0x41603, 0x0}, ++ {0x41604, 0x0}, ++ {0x41605, 0x0}, ++ {0x41606, 0x0}, ++ {0x41607, 0x0}, ++ {0x41608, 0x401c}, ++ {0x41609, 0xd0}, ++ {0x4160a, 0x1}, ++ {0x4160b, 0x0}, ++ {0x4160c, 0x4060}, ++ {0x4160d, 0x84}, ++ {0x4160e, 0x0}, ++ {0x4160f, 0x0}, ++ {0x41610, 0x0}, ++ {0x41611, 0x0}, ++ {0x41612, 0x0}, ++ {0x41613, 0xb00}, ++ {0x41614, 0x0}, ++ {0x41615, 0x0}, ++ {0x41616, 0x0}, ++ {0x41617, 0x800}, ++ {0x41618, 0x407c}, ++ {0x41619, 0x0}, ++ {0x4161a, 0x0}, ++ {0x4161b, 0x0}, ++ {0x4161c, 0x0}, ++ {0x4161d, 0x0}, ++ {0x4161e, 0x0}, ++ {0x4161f, 0x0}, ++ {0x41620, 0x0}, ++ {0x41621, 0x0}, ++ {0x41622, 0x0}, ++ {0x41623, 0x0}, ++ {0x41624, 0x4000}, ++ {0x41625, 0x0}, ++ {0x41626, 0x1}, ++ {0x41627, 0x0}, ++ {0x41628, 0x0}, ++ {0x41629, 0x0}, ++ {0x4162a, 0x0}, ++ {0x4162b, 0x0}, ++ {0x4162c, 0x402c}, ++ {0x4162d, 0xd00}, ++ {0x4162e, 0x1}, ++ {0x4162f, 0x0}, ++ {0x41630, 0x4020}, ++ {0x41631, 0x803}, ++ {0x41632, 0x0}, ++ {0x41633, 0x0}, ++ {0x41634, 0x0}, ++ {0x41635, 0x0}, ++ {0x41636, 0x0}, ++ {0x41637, 0x0}, ++ {0x41638, 0x0}, ++ {0x41639, 0x0}, ++ {0x4163a, 0x0}, ++ {0x4163b, 0x2b00}, ++ {0x4163c, 0x0}, ++ {0x4163d, 0x0}, ++ {0x4163e, 0x0}, ++ {0x4163f, 0x800}, ++ {0x41640, 0x0}, ++ {0x41641, 0x0}, ++ {0x41642, 0x0}, ++ {0x41643, 0x0}, ++ {0x41644, 0x407c}, ++ {0x41645, 0x0}, ++ {0x41646, 0x0}, ++ {0x41647, 0x0}, ++ {0x41648, 0x0}, ++ {0x41649, 0x0}, ++ {0x4164a, 0x0}, ++ {0x4164b, 0x0}, ++ {0x4164c, 0x0}, ++ {0x4164d, 0x0}, ++ {0x4164e, 0x0}, ++ {0x4164f, 0x0}, ++ {0x41650, 0x0}, ++ {0x41651, 0x0}, ++ {0x41652, 0x1}, ++ {0x41653, 0x0}, ++ {0x41654, 0x0}, ++ {0x41655, 0x0}, ++ {0x41656, 0x0}, ++ {0x41657, 0x0}, ++ {0x41658, 0x801c}, ++ {0x41659, 0xd0}, ++ {0x4165a, 0x1}, ++ {0x4165b, 0x10}, ++ {0x4165c, 0x8060}, ++ {0x4165d, 0x84}, ++ {0x4165e, 0x0}, ++ {0x4165f, 0x10}, ++ {0x41660, 0x0}, ++ {0x41661, 0x0}, ++ {0x41662, 0x0}, ++ {0x41663, 0xb00}, ++ {0x41664, 0x0}, ++ {0x41665, 0x0}, ++ {0x41666, 0x0}, ++ {0x41667, 0x800}, ++ {0x41668, 0x807c}, ++ {0x41669, 0x0}, ++ {0x4166a, 0x0}, ++ {0x4166b, 0x10}, ++ {0x4166c, 0x0}, ++ {0x4166d, 0x0}, ++ {0x4166e, 0x0}, ++ {0x4166f, 0x0}, ++ {0x41670, 0x0}, ++ {0x41671, 0x0}, ++ {0x41672, 0x0}, ++ {0x41673, 0x0}, ++ {0x41674, 0x8000}, ++ {0x41675, 0x0}, ++ {0x41676, 0x1}, ++ {0x41677, 0x10}, ++ {0x41678, 0x0}, ++ {0x41679, 0x0}, ++ {0x4167a, 0x0}, ++ {0x4167b, 0x0}, ++ {0x4167c, 0x802c}, ++ {0x4167d, 0xd00}, ++ {0x4167e, 0x1}, ++ {0x4167f, 0x10}, ++ {0x41680, 0x8020}, ++ {0x41681, 0x803}, ++ {0x41682, 0x0}, ++ {0x41683, 0x10}, ++ {0x41684, 0x0}, ++ {0x41685, 0x0}, ++ {0x41686, 0x0}, ++ {0x41687, 0x0}, ++ {0x41688, 0x0}, ++ {0x41689, 0x0}, ++ {0x4168a, 0x0}, ++ {0x4168b, 0x2b00}, ++ {0x4168c, 0x0}, ++ {0x4168d, 0x0}, ++ {0x4168e, 0x0}, ++ {0x4168f, 0x800}, ++ {0x41690, 0x0}, ++ {0x41691, 0x0}, ++ {0x41692, 0x0}, ++ {0x41693, 0x0}, ++ {0x41694, 0x807c}, ++ {0x41695, 0x0}, ++ {0x41696, 0x0}, ++ {0x41697, 0x10}, ++ {0x41698, 0x0}, ++ {0x41699, 0x0}, ++ {0x4169a, 0x0}, ++ {0x4169b, 0x0}, ++ {0x4169c, 0x0}, ++ {0x4169d, 0x0}, ++ {0x4169e, 0x0}, ++ {0x4169f, 0x0}, ++ {0x416a0, 0x0}, ++ {0x416a1, 0x0}, ++ {0x416a2, 0x1}, ++ {0x416a3, 0x0}, ++ {0x416a4, 0x0}, ++ {0x416a5, 0x0}, ++ {0x416a6, 0x0}, ++ {0x416a7, 0x0}, ++ {0x416a8, 0x402c}, ++ {0x416a9, 0xd00}, ++ {0x416aa, 0x1}, ++ {0x416ab, 0x0}, ++ {0x416ac, 0x4050}, ++ {0x416ad, 0x803}, ++ {0x416ae, 0x0}, ++ {0x416af, 0x0}, ++ {0x416b0, 0x0}, ++ {0x416b1, 0x0}, ++ {0x416b2, 0x0}, ++ {0x416b3, 0x1b00}, ++ {0x416b4, 0x0}, ++ {0x416b5, 0x0}, ++ {0x416b6, 0x0}, ++ {0x416b7, 0x0}, ++ {0x416b8, 0x0}, ++ {0x416b9, 0x0}, ++ {0x416ba, 0x0}, ++ {0x416bb, 0x0}, ++ {0x416bc, 0x0}, ++ {0x416bd, 0x0}, ++ {0x416be, 0x0}, ++ {0x416bf, 0x0}, ++ {0x416c0, 0x4050}, ++ {0x416c1, 0x803}, ++ {0x416c2, 0x0}, ++ {0x416c3, 0x5a00}, ++ {0x416c4, 0x0}, ++ {0x416c5, 0x0}, ++ {0x416c6, 0x0}, ++ {0x416c7, 0x0}, ++ {0x416c8, 0x0}, ++ {0x416c9, 0x0}, ++ {0x416ca, 0x0}, ++ {0x416cb, 0x0}, ++ {0x416cc, 0x0}, ++ {0x416cd, 0x0}, ++ {0x416ce, 0x0}, ++ {0x416cf, 0x0}, ++ {0x416d0, 0x0}, ++ {0x416d1, 0x0}, ++ {0x416d2, 0x0}, ++ {0x416d3, 0x100}, ++ {0x416d4, 0x0}, ++ {0x416d5, 0x0}, ++ {0x416d6, 0x0}, ++ {0x416d7, 0x0}, ++ {0x416d8, 0x4050}, ++ {0x416d9, 0x803}, ++ {0x416da, 0x0}, ++ {0x416db, 0x0}, ++ {0x416dc, 0x0}, ++ {0x416dd, 0x0}, ++ {0x416de, 0x0}, ++ {0x416df, 0x0}, ++ {0x416e0, 0x0}, ++ {0x416e1, 0x0}, ++ {0x416e2, 0x0}, ++ {0x416e3, 0x6b00}, ++ {0x416e4, 0x0}, ++ {0x416e5, 0x0}, ++ {0x416e6, 0x0}, ++ {0x416e7, 0x400}, ++ {0x416e8, 0x407c}, ++ {0x416e9, 0x0}, ++ {0x416ea, 0x0}, ++ {0x416eb, 0x0}, ++ {0x416ec, 0x0}, ++ {0x416ed, 0x0}, ++ {0x416ee, 0x0}, ++ {0x416ef, 0x0}, ++ {0x416f0, 0x0}, ++ {0x416f1, 0x0}, ++ {0x416f2, 0x0}, ++ {0x416f3, 0x3b00}, ++ {0x416f4, 0x0}, ++ {0x416f5, 0x0}, ++ {0x416f6, 0x0}, ++ {0x416f7, 0x0}, ++ {0x416f8, 0x0}, ++ {0x416f9, 0x0}, ++ {0x416fa, 0x0}, ++ {0x416fb, 0x0}, ++ {0x416fc, 0x0}, ++ {0x416fd, 0x0}, ++ {0x416fe, 0x1}, ++ {0x416ff, 0x0}, ++ {0x41700, 0x5758}, ++ {0x41701, 0x0}, ++ {0x41702, 0x0}, ++ {0x41703, 0x0}, ++ {0x41704, 0x4208}, ++ {0x41705, 0x0}, ++ {0x41706, 0x0}, ++ {0x41707, 0x0}, ++ {0x41708, 0x0}, ++ {0x41709, 0x0}, ++ {0x4170a, 0x0}, ++ {0x4170b, 0x4b00}, ++ {0x4170c, 0x0}, ++ {0x4170d, 0x0}, ++ {0x4170e, 0x0}, ++ {0x4170f, 0x0}, ++ {0x41710, 0x0}, ++ {0x41711, 0x0}, ++ {0x41712, 0x0}, ++ {0x41713, 0x0}, ++ {0x41714, 0x401c}, ++ {0x41715, 0xd0}, ++ {0x41716, 0x1}, ++ {0x41717, 0x0}, ++ {0x41718, 0x4060}, ++ {0x41719, 0x84}, ++ {0x4171a, 0x0}, ++ {0x4171b, 0x0}, ++ {0x4171c, 0x0}, ++ {0x4171d, 0x0}, ++ {0x4171e, 0x0}, ++ {0x4171f, 0x0}, ++ {0x41720, 0x0}, ++ {0x41721, 0x0}, ++ {0x41722, 0x0}, ++ {0x41723, 0x7b00}, ++ {0x41724, 0x0}, ++ {0x41725, 0x0}, ++ {0x41726, 0x0}, ++ {0x41727, 0x0}, ++ {0x41728, 0x407c}, ++ {0x41729, 0x0}, ++ {0x4172a, 0x0}, ++ {0x4172b, 0x0}, ++ {0x4172c, 0x0}, ++ {0x4172d, 0x0}, ++ {0x4172e, 0x0}, ++ {0x4172f, 0x0}, ++ {0x41730, 0x0}, ++ {0x41731, 0x0}, ++ {0x41732, 0x0}, ++ {0x41733, 0x0}, ++ {0x41734, 0x4000}, ++ {0x41735, 0x0}, ++ {0x41736, 0x1}, ++ {0x41737, 0x0}, ++ {0x41738, 0x0}, ++ {0x41739, 0x0}, ++ {0x4173a, 0x0}, ++ {0x4173b, 0x0}, ++ {0x4173c, 0x402c}, ++ {0x4173d, 0xd00}, ++ {0x4173e, 0x1}, ++ {0x4173f, 0x0}, ++ {0x41740, 0x4020}, ++ {0x41741, 0x803}, ++ {0x41742, 0x0}, ++ {0x41743, 0x0}, ++ {0x41744, 0x0}, ++ {0x41745, 0x0}, ++ {0x41746, 0x0}, ++ {0x41747, 0x0}, ++ {0x41748, 0x0}, ++ {0x41749, 0x0}, ++ {0x4174a, 0x0}, ++ {0x4174b, 0x2b00}, ++ {0x4174c, 0x0}, ++ {0x4174d, 0x0}, ++ {0x4174e, 0x0}, ++ {0x4174f, 0x800}, ++ {0x41750, 0x0}, ++ {0x41751, 0x0}, ++ {0x41752, 0x0}, ++ {0x41753, 0x0}, ++ {0x41754, 0x407c}, ++ {0x41755, 0x0}, ++ {0x41756, 0x0}, ++ {0x41757, 0x0}, ++ {0x41758, 0x0}, ++ {0x41759, 0x0}, ++ {0x4175a, 0x0}, ++ {0x4175b, 0x0}, ++ {0x4175c, 0x0}, ++ {0x4175d, 0x0}, ++ {0x4175e, 0x0}, ++ {0x4175f, 0x0}, ++ {0x41760, 0x4000}, ++ {0x41761, 0x0}, ++ {0x41762, 0x1}, ++ {0x41763, 0x0}, ++ {0x41764, 0x0}, ++ {0x41765, 0x0}, ++ {0x41766, 0x0}, ++ {0x41767, 0x0}, ++ {0x41768, 0x5758}, ++ {0x41769, 0x0}, ++ {0x4176a, 0x0}, ++ {0x4176b, 0x0}, ++ {0x4176c, 0x4008}, ++ {0x4176d, 0x0}, ++ {0x4176e, 0x0}, ++ {0x4176f, 0x0}, ++ {0x41770, 0x0}, ++ {0x41771, 0x0}, ++ {0x41772, 0x0}, ++ {0x41773, 0x0}, ++ {0x41774, 0x0}, ++ {0x41775, 0x0}, ++ {0x41776, 0x0}, ++ {0x41777, 0x0}, ++ {0x41778, 0x802c}, ++ {0x41779, 0xd00}, ++ {0x4177a, 0x1}, ++ {0x4177b, 0x10}, ++ {0x4177c, 0x8050}, ++ {0x4177d, 0x803}, ++ {0x4177e, 0x0}, ++ {0x4177f, 0x10}, ++ {0x41780, 0x0}, ++ {0x41781, 0x0}, ++ {0x41782, 0x0}, ++ {0x41783, 0x1b00}, ++ {0x41784, 0x0}, ++ {0x41785, 0x0}, ++ {0x41786, 0x0}, ++ {0x41787, 0x0}, ++ {0x41788, 0x0}, ++ {0x41789, 0x0}, ++ {0x4178a, 0x0}, ++ {0x4178b, 0x0}, ++ {0x4178c, 0x0}, ++ {0x4178d, 0x0}, ++ {0x4178e, 0x0}, ++ {0x4178f, 0x0}, ++ {0x41790, 0x8050}, ++ {0x41791, 0x803}, ++ {0x41792, 0x0}, ++ {0x41793, 0x5a10}, ++ {0x41794, 0x0}, ++ {0x41795, 0x0}, ++ {0x41796, 0x0}, ++ {0x41797, 0x0}, ++ {0x41798, 0x0}, ++ {0x41799, 0x0}, ++ {0x4179a, 0x0}, ++ {0x4179b, 0x0}, ++ {0x4179c, 0x0}, ++ {0x4179d, 0x0}, ++ {0x4179e, 0x0}, ++ {0x4179f, 0x0}, ++ {0x417a0, 0x0}, ++ {0x417a1, 0x0}, ++ {0x417a2, 0x0}, ++ {0x417a3, 0x100}, ++ {0x417a4, 0x0}, ++ {0x417a5, 0x0}, ++ {0x417a6, 0x0}, ++ {0x417a7, 0x0}, ++ {0x417a8, 0x8050}, ++ {0x417a9, 0x803}, ++ {0x417aa, 0x0}, ++ {0x417ab, 0x10}, ++ {0x417ac, 0x0}, ++ {0x417ad, 0x0}, ++ {0x417ae, 0x0}, ++ {0x417af, 0x0}, ++ {0x417b0, 0x0}, ++ {0x417b1, 0x0}, ++ {0x417b2, 0x0}, ++ {0x417b3, 0x6b00}, ++ {0x417b4, 0x0}, ++ {0x417b5, 0x0}, ++ {0x417b6, 0x0}, ++ {0x417b7, 0x400}, ++ {0x417b8, 0x807c}, ++ {0x417b9, 0x0}, ++ {0x417ba, 0x0}, ++ {0x417bb, 0x10}, ++ {0x417bc, 0x0}, ++ {0x417bd, 0x0}, ++ {0x417be, 0x0}, ++ {0x417bf, 0x0}, ++ {0x417c0, 0x0}, ++ {0x417c1, 0x0}, ++ {0x417c2, 0x0}, ++ {0x417c3, 0x3b00}, ++ {0x417c4, 0x0}, ++ {0x417c5, 0x0}, ++ {0x417c6, 0x0}, ++ {0x417c7, 0x0}, ++ {0x417c8, 0x0}, ++ {0x417c9, 0x0}, ++ {0x417ca, 0x0}, ++ {0x417cb, 0x0}, ++ {0x417cc, 0x0}, ++ {0x417cd, 0x0}, ++ {0x417ce, 0x1}, ++ {0x417cf, 0x0}, ++ {0x417d0, 0x9758}, ++ {0x417d1, 0x0}, ++ {0x417d2, 0x0}, ++ {0x417d3, 0x10}, ++ {0x417d4, 0x8208}, ++ {0x417d5, 0x0}, ++ {0x417d6, 0x0}, ++ {0x417d7, 0x10}, ++ {0x417d8, 0x0}, ++ {0x417d9, 0x0}, ++ {0x417da, 0x0}, ++ {0x417db, 0x4b00}, ++ {0x417dc, 0x0}, ++ {0x417dd, 0x0}, ++ {0x417de, 0x0}, ++ {0x417df, 0x0}, ++ {0x417e0, 0x0}, ++ {0x417e1, 0x0}, ++ {0x417e2, 0x0}, ++ {0x417e3, 0x0}, ++ {0x417e4, 0x801c}, ++ {0x417e5, 0xd0}, ++ {0x417e6, 0x1}, ++ {0x417e7, 0x10}, ++ {0x417e8, 0x8060}, ++ {0x417e9, 0x84}, ++ {0x417ea, 0x0}, ++ {0x417eb, 0x10}, ++ {0x417ec, 0x0}, ++ {0x417ed, 0x0}, ++ {0x417ee, 0x0}, ++ {0x417ef, 0x0}, ++ {0x417f0, 0x0}, ++ {0x417f1, 0x0}, ++ {0x417f2, 0x0}, ++ {0x417f3, 0x7b00}, ++ {0x417f4, 0x0}, ++ {0x417f5, 0x0}, ++ {0x417f6, 0x0}, ++ {0x417f7, 0x0}, ++ {0x417f8, 0x807c}, ++ {0x417f9, 0x0}, ++ {0x417fa, 0x0}, ++ {0x417fb, 0x10}, ++ {0x417fc, 0x0}, ++ {0x417fd, 0x0}, ++ {0x417fe, 0x0}, ++ {0x417ff, 0x0}, ++ {0x41800, 0x0}, ++ {0x41801, 0x0}, ++ {0x41802, 0x0}, ++ {0x41803, 0x0}, ++ {0x41804, 0x8000}, ++ {0x41805, 0x0}, ++ {0x41806, 0x1}, ++ {0x41807, 0x10}, ++ {0x41808, 0x0}, ++ {0x41809, 0x0}, ++ {0x4180a, 0x0}, ++ {0x4180b, 0x0}, ++ {0x4180c, 0x802c}, ++ {0x4180d, 0xd00}, ++ {0x4180e, 0x1}, ++ {0x4180f, 0x10}, ++ {0x41810, 0x8020}, ++ {0x41811, 0x803}, ++ {0x41812, 0x0}, ++ {0x41813, 0x10}, ++ {0x41814, 0x0}, ++ {0x41815, 0x0}, ++ {0x41816, 0x0}, ++ {0x41817, 0x0}, ++ {0x41818, 0x0}, ++ {0x41819, 0x0}, ++ {0x4181a, 0x0}, ++ {0x4181b, 0x2b00}, ++ {0x4181c, 0x0}, ++ {0x4181d, 0x0}, ++ {0x4181e, 0x0}, ++ {0x4181f, 0x800}, ++ {0x41820, 0x0}, ++ {0x41821, 0x0}, ++ {0x41822, 0x0}, ++ {0x41823, 0x0}, ++ {0x41824, 0x807c}, ++ {0x41825, 0x0}, ++ {0x41826, 0x0}, ++ {0x41827, 0x10}, ++ {0x41828, 0x0}, ++ {0x41829, 0x0}, ++ {0x4182a, 0x0}, ++ {0x4182b, 0x0}, ++ {0x4182c, 0x0}, ++ {0x4182d, 0x0}, ++ {0x4182e, 0x0}, ++ {0x4182f, 0x0}, ++ {0x41830, 0x8000}, ++ {0x41831, 0x0}, ++ {0x41832, 0x1}, ++ {0x41833, 0x10}, ++ {0x41834, 0x0}, ++ {0x41835, 0x0}, ++ {0x41836, 0x0}, ++ {0x41837, 0x0}, ++ {0x41838, 0x9758}, ++ {0x41839, 0x0}, ++ {0x4183a, 0x0}, ++ {0x4183b, 0x10}, ++ {0x4183c, 0x8008}, ++ {0x4183d, 0x0}, ++ {0x4183e, 0x0}, ++ {0x4183f, 0x10}, ++ {0x41840, 0x0}, ++ {0x41841, 0x0}, ++ {0x41842, 0x0}, ++ {0x41843, 0x0}, ++ {0x41844, 0x0}, ++ {0x41845, 0x0}, ++ {0x41846, 0x0}, ++ {0x41847, 0x0}, ++ {0x41848, 0xc068}, ++ {0x41849, 0x0}, ++ {0x4184a, 0x0}, ++ {0x4184b, 0x10}, ++ {0x4184c, 0x0}, ++ {0x4184d, 0x0}, ++ {0x4184e, 0x0}, ++ {0x4184f, 0x0}, ++ {0x41850, 0xd2d8}, ++ {0x41851, 0x0}, ++ {0x41852, 0x0}, ++ {0x41853, 0x10}, ++ {0x41854, 0xe008}, ++ {0x41855, 0x0}, ++ {0x41856, 0x0}, ++ {0x41857, 0x10}, ++ {0x41858, 0x0}, ++ {0x41859, 0x0}, ++ {0x4185a, 0x0}, ++ {0x4185b, 0x5b00}, ++ {0x4185c, 0x0}, ++ {0x4185d, 0x0}, ++ {0x4185e, 0x0}, ++ {0x4185f, 0x0}, ++ {0x41860, 0xc0f0}, ++ {0x41861, 0x0}, ++ {0x41862, 0x0}, ++ {0x41863, 0x10}, ++ {0x41864, 0x0}, ++ {0x41865, 0x0}, ++ {0x41866, 0x0}, ++ {0x41867, 0x0}, ++ {0x41868, 0xcfd8}, ++ {0x41869, 0x0}, ++ {0x4186a, 0x0}, ++ {0x4186b, 0x10}, ++ {0x4186c, 0xc008}, ++ {0x4186d, 0x0}, ++ {0x4186e, 0x0}, ++ {0x4186f, 0x10}, ++ {0x41870, 0x0}, ++ {0x41871, 0x0}, ++ {0x41872, 0x0}, ++ {0x41873, 0x2b00}, ++ {0x41874, 0x0}, ++ {0x41875, 0x0}, ++ {0x41876, 0x0}, ++ {0x41877, 0x0}, ++ {0x41878, 0xd058}, ++ {0x41879, 0x0}, ++ {0x4187a, 0x0}, ++ {0x4187b, 0x10}, ++ {0x4187c, 0xc008}, ++ {0x4187d, 0x0}, ++ {0x4187e, 0x0}, ++ {0x4187f, 0x10}, ++ {0x41880, 0x0}, ++ {0x41881, 0x0}, ++ {0x41882, 0x0}, ++ {0x41883, 0x2b00}, ++ {0x41884, 0x0}, ++ {0x41885, 0x0}, ++ {0x41886, 0x0}, ++ {0x41887, 0x0}, ++ {0x41888, 0xd0d8}, ++ {0x41889, 0x0}, ++ {0x4188a, 0x0}, ++ {0x4188b, 0x10}, ++ {0x4188c, 0xc088}, ++ {0x4188d, 0x0}, ++ {0x4188e, 0x0}, ++ {0x4188f, 0x10}, ++ {0x41890, 0x0}, ++ {0x41891, 0x0}, ++ {0x41892, 0x0}, ++ {0x41893, 0x2b00}, ++ {0x41894, 0x0}, ++ {0x41895, 0x0}, ++ {0x41896, 0x0}, ++ {0x41897, 0x0}, ++ {0x41898, 0xd158}, ++ {0x41899, 0x0}, ++ {0x4189a, 0x0}, ++ {0x4189b, 0x10}, ++ {0x4189c, 0xc008}, ++ {0x4189d, 0x0}, ++ {0x4189e, 0x0}, ++ {0x4189f, 0x10}, ++ {0x418a0, 0x0}, ++ {0x418a1, 0x0}, ++ {0x418a2, 0x0}, ++ {0x418a3, 0x5b00}, ++ {0x418a4, 0x0}, ++ {0x418a5, 0x0}, ++ {0x418a6, 0x0}, ++ {0x418a7, 0x0}, ++ {0x418a8, 0x402c}, ++ {0x418a9, 0xd00}, ++ {0x418aa, 0x1}, ++ {0x418ab, 0x400}, ++ {0x418ac, 0x4050}, ++ {0x418ad, 0x800}, ++ {0x418ae, 0x0}, ++ {0x418af, 0x0}, ++ {0x418b0, 0x0}, ++ {0x418b1, 0x0}, ++ {0x418b2, 0x0}, ++ {0x418b3, 0x400}, ++ {0x418b4, 0x4050}, ++ {0x418b5, 0x803}, ++ {0x418b6, 0x0}, ++ {0x418b7, 0x0}, ++ {0x418b8, 0x0}, ++ {0x418b9, 0x0}, ++ {0x418ba, 0x0}, ++ {0x418bb, 0x6f00}, ++ {0x418bc, 0x0}, ++ {0x418bd, 0x0}, ++ {0x418be, 0x0}, ++ {0x418bf, 0x400}, ++ {0x418c0, 0x407c}, ++ {0x418c1, 0x0}, ++ {0x418c2, 0x0}, ++ {0x418c3, 0x400}, ++ {0x418c4, 0x0}, ++ {0x418c5, 0x0}, ++ {0x418c6, 0x0}, ++ {0x418c7, 0x0}, ++ {0x418c8, 0x0}, ++ {0x418c9, 0x0}, ++ {0x418ca, 0x0}, ++ {0x418cb, 0x400}, ++ {0x418cc, 0x0}, ++ {0x418cd, 0x0}, ++ {0x418ce, 0x1}, ++ {0x418cf, 0x0}, ++ {0x418d0, 0x0}, ++ {0x418d1, 0x0}, ++ {0x418d2, 0x0}, ++ {0x418d3, 0x400}, ++ {0x418d4, 0x0}, ++ {0x418d5, 0x0}, ++ {0x418d6, 0x0}, ++ {0x418d7, 0x0}, ++ {0x418d8, 0x0}, ++ {0x418d9, 0x0}, ++ {0x418da, 0x0}, ++ {0x418db, 0x0}, ++ {0x418dc, 0x0}, ++ {0x418dd, 0x0}, ++ {0x418de, 0x0}, ++ {0x418df, 0x0}, ++ {0x418e0, 0x802c}, ++ {0x418e1, 0xd00}, ++ {0x418e2, 0x1}, ++ {0x418e3, 0x410}, ++ {0x418e4, 0x8050}, ++ {0x418e5, 0x800}, ++ {0x418e6, 0x0}, ++ {0x418e7, 0x10}, ++ {0x418e8, 0x0}, ++ {0x418e9, 0x0}, ++ {0x418ea, 0x0}, ++ {0x418eb, 0x400}, ++ {0x418ec, 0x8050}, ++ {0x418ed, 0x803}, ++ {0x418ee, 0x0}, ++ {0x418ef, 0x10}, ++ {0x418f0, 0x0}, ++ {0x418f1, 0x0}, ++ {0x418f2, 0x0}, ++ {0x418f3, 0x6f00}, ++ {0x418f4, 0x0}, ++ {0x418f5, 0x0}, ++ {0x418f6, 0x0}, ++ {0x418f7, 0x400}, ++ {0x418f8, 0x807c}, ++ {0x418f9, 0x0}, ++ {0x418fa, 0x0}, ++ {0x418fb, 0x410}, ++ {0x418fc, 0x0}, ++ {0x418fd, 0x0}, ++ {0x418fe, 0x0}, ++ {0x418ff, 0x0}, ++ {0x41900, 0x0}, ++ {0x41901, 0x0}, ++ {0x41902, 0x0}, ++ {0x41903, 0x400}, ++ {0x41904, 0x0}, ++ {0x41905, 0x0}, ++ {0x41906, 0x1}, ++ {0x41907, 0x0}, ++ {0x41908, 0x0}, ++ {0x41909, 0x0}, ++ {0x4190a, 0x0}, ++ {0x4190b, 0x400}, ++ {0x4190c, 0x0}, ++ {0x4190d, 0x0}, ++ {0x4190e, 0x0}, ++ {0x4190f, 0x0}, ++ {0x41910, 0x0}, ++ {0x41911, 0x0}, ++ {0x41912, 0x0}, ++ {0x41913, 0x0}, ++ {0x41914, 0x0}, ++ {0x41915, 0x0}, ++ {0x41916, 0x0}, ++ {0x41917, 0x0}, ++ {0x41918, 0x402c}, ++ {0x41919, 0xd00}, ++ {0x4191a, 0x1}, ++ {0x4191b, 0x0}, ++ {0x4191c, 0x4050}, ++ {0x4191d, 0x800}, ++ {0x4191e, 0x0}, ++ {0x4191f, 0x0}, ++ {0x41920, 0x0}, ++ {0x41921, 0x0}, ++ {0x41922, 0x0}, ++ {0x41923, 0x0}, ++ {0x41924, 0x4050}, ++ {0x41925, 0x803}, ++ {0x41926, 0x0}, ++ {0x41927, 0x0}, ++ {0x41928, 0x0}, ++ {0x41929, 0x0}, ++ {0x4192a, 0x0}, ++ {0x4192b, 0x0}, ++ {0x4192c, 0x4050}, ++ {0x4192d, 0x800}, ++ {0x4192e, 0x0}, ++ {0x4192f, 0x0}, ++ {0x41930, 0x0}, ++ {0x41931, 0x0}, ++ {0x41932, 0x0}, ++ {0x41933, 0x4b00}, ++ {0x41934, 0x0}, ++ {0x41935, 0x0}, ++ {0x41936, 0x0}, ++ {0x41937, 0x400}, ++ {0x41938, 0x0}, ++ {0x41939, 0x0}, ++ {0x4193a, 0x0}, ++ {0x4193b, 0x0}, ++ {0x4193c, 0x407c}, ++ {0x4193d, 0x0}, ++ {0x4193e, 0x0}, ++ {0x4193f, 0x0}, ++ {0x41940, 0x0}, ++ {0x41941, 0x0}, ++ {0x41942, 0x0}, ++ {0x41943, 0x0}, ++ {0x41944, 0x0}, ++ {0x41945, 0x0}, ++ {0x41946, 0x0}, ++ {0x41947, 0x0}, ++ {0x41948, 0x0}, ++ {0x41949, 0x0}, ++ {0x4194a, 0x1}, ++ {0x4194b, 0x0}, ++ {0x4194c, 0x0}, ++ {0x4194d, 0x0}, ++ {0x4194e, 0x0}, ++ {0x4194f, 0x0}, ++ {0x41950, 0x0}, ++ {0x41951, 0x0}, ++ {0x41952, 0x0}, ++ {0x41953, 0x4b00}, ++ {0x41954, 0x0}, ++ {0x41955, 0x0}, ++ {0x41956, 0x0}, ++ {0x41957, 0x1800}, ++ {0x41958, 0x0}, ++ {0x41959, 0x0}, ++ {0x4195a, 0x0}, ++ {0x4195b, 0x0}, ++ {0x4195c, 0x802c}, ++ {0x4195d, 0xd00}, ++ {0x4195e, 0x1}, ++ {0x4195f, 0x10}, ++ {0x41960, 0x8050}, ++ {0x41961, 0x800}, ++ {0x41962, 0x0}, ++ {0x41963, 0x10}, ++ {0x41964, 0x0}, ++ {0x41965, 0x0}, ++ {0x41966, 0x0}, ++ {0x41967, 0x0}, ++ {0x41968, 0x8050}, ++ {0x41969, 0x803}, ++ {0x4196a, 0x0}, ++ {0x4196b, 0x10}, ++ {0x4196c, 0x0}, ++ {0x4196d, 0x0}, ++ {0x4196e, 0x0}, ++ {0x4196f, 0x0}, ++ {0x41970, 0x8050}, ++ {0x41971, 0x800}, ++ {0x41972, 0x0}, ++ {0x41973, 0x10}, ++ {0x41974, 0x0}, ++ {0x41975, 0x0}, ++ {0x41976, 0x0}, ++ {0x41977, 0x0}, ++ {0x41978, 0x0}, ++ {0x41979, 0x0}, ++ {0x4197a, 0x0}, ++ {0x4197b, 0x4b00}, ++ {0x4197c, 0x0}, ++ {0x4197d, 0x0}, ++ {0x4197e, 0x0}, ++ {0x4197f, 0x400}, ++ {0x41980, 0x807c}, ++ {0x41981, 0x0}, ++ {0x41982, 0x0}, ++ {0x41983, 0x10}, ++ {0x41984, 0x0}, ++ {0x41985, 0x0}, ++ {0x41986, 0x0}, ++ {0x41987, 0x0}, ++ {0x41988, 0x0}, ++ {0x41989, 0x0}, ++ {0x4198a, 0x0}, ++ {0x4198b, 0x0}, ++ {0x4198c, 0x0}, ++ {0x4198d, 0x0}, ++ {0x4198e, 0x1}, ++ {0x4198f, 0x0}, ++ {0x41990, 0x0}, ++ {0x41991, 0x0}, ++ {0x41992, 0x0}, ++ {0x41993, 0x5b00}, ++ {0x41994, 0x0}, ++ {0x41995, 0x0}, ++ {0x41996, 0x0}, ++ {0x41997, 0x2000}, ++ {0x41998, 0x402c}, ++ {0x41999, 0xd00}, ++ {0x4199a, 0x1}, ++ {0x4199b, 0x0}, ++ {0x4199c, 0x5198}, ++ {0x4199d, 0x803}, ++ {0x4199e, 0x0}, ++ {0x4199f, 0x0}, ++ {0x419a0, 0x0}, ++ {0x419a1, 0x0}, ++ {0x419a2, 0x0}, ++ {0x419a3, 0x1b00}, ++ {0x419a4, 0x0}, ++ {0x419a5, 0x0}, ++ {0x419a6, 0x0}, ++ {0x419a7, 0x0}, ++ {0x419a8, 0x5218}, ++ {0x419a9, 0x803}, ++ {0x419aa, 0x0}, ++ {0x419ab, 0x0}, ++ {0x419ac, 0x0}, ++ {0x419ad, 0x0}, ++ {0x419ae, 0x0}, ++ {0x419af, 0x0}, ++ {0x419b0, 0x0}, ++ {0x419b1, 0x0}, ++ {0x419b2, 0x0}, ++ {0x419b3, 0x4b00}, ++ {0x419b4, 0x0}, ++ {0x419b5, 0x0}, ++ {0x419b6, 0x0}, ++ {0x419b7, 0x400}, ++ {0x419b8, 0x407c}, ++ {0x419b9, 0x0}, ++ {0x419ba, 0x0}, ++ {0x419bb, 0x0}, ++ {0x419bc, 0x0}, ++ {0x419bd, 0x0}, ++ {0x419be, 0x0}, ++ {0x419bf, 0x0}, ++ {0x419c0, 0x0}, ++ {0x419c1, 0x0}, ++ {0x419c2, 0x0}, ++ {0x419c3, 0x0}, ++ {0x419c4, 0x0}, ++ {0x419c5, 0x0}, ++ {0x419c6, 0x1}, ++ {0x419c7, 0x0}, ++ {0x419c8, 0x0}, ++ {0x419c9, 0x0}, ++ {0x419ca, 0x0}, ++ {0x419cb, 0x1b00}, ++ {0x419cc, 0x0}, ++ {0x419cd, 0x0}, ++ {0x419ce, 0x0}, ++ {0x419cf, 0x0}, ++ {0x419d0, 0x0}, ++ {0x419d1, 0x0}, ++ {0x419d2, 0x0}, ++ {0x419d3, 0x0}, ++ {0x419d4, 0x802c}, ++ {0x419d5, 0xd00}, ++ {0x419d6, 0x1}, ++ {0x419d7, 0x10}, ++ {0x419d8, 0x9198}, ++ {0x419d9, 0x803}, ++ {0x419da, 0x0}, ++ {0x419db, 0x10}, ++ {0x419dc, 0x0}, ++ {0x419dd, 0x0}, ++ {0x419de, 0x0}, ++ {0x419df, 0x0}, ++ {0x419e0, 0x0}, ++ {0x419e1, 0x0}, ++ {0x419e2, 0x0}, ++ {0x419e3, 0x0}, ++ {0x419e4, 0x0}, ++ {0x419e5, 0x0}, ++ {0x419e6, 0x0}, ++ {0x419e7, 0x0}, ++ {0x419e8, 0x0}, ++ {0x419e9, 0x0}, ++ {0x419ea, 0x0}, ++ {0x419eb, 0x0}, ++ {0x419ec, 0x9218}, ++ {0x419ed, 0x803}, ++ {0x419ee, 0x0}, ++ {0x419ef, 0x10}, ++ {0x419f0, 0x0}, ++ {0x419f1, 0x0}, ++ {0x419f2, 0x0}, ++ {0x419f3, 0x4b00}, ++ {0x419f4, 0x0}, ++ {0x419f5, 0x0}, ++ {0x419f6, 0x0}, ++ {0x419f7, 0x400}, ++ {0x419f8, 0x0}, ++ {0x419f9, 0x0}, ++ {0x419fa, 0x0}, ++ {0x419fb, 0x0}, ++ {0x419fc, 0x807c}, ++ {0x419fd, 0x0}, ++ {0x419fe, 0x0}, ++ {0x419ff, 0x10}, ++ {0x41a00, 0x0}, ++ {0x41a01, 0x0}, ++ {0x41a02, 0x0}, ++ {0x41a03, 0x0}, ++ {0x41a04, 0x0}, ++ {0x41a05, 0x0}, ++ {0x41a06, 0x0}, ++ {0x41a07, 0x0}, ++ {0x41a08, 0x0}, ++ {0x41a09, 0x0}, ++ {0x41a0a, 0x1}, ++ {0x41a0b, 0x0}, ++ {0x41a0c, 0x0}, ++ {0x41a0d, 0x0}, ++ {0x41a0e, 0x0}, ++ {0x41a0f, 0x0}, ++ {0x41a10, 0x0}, ++ {0x41a11, 0x0}, ++ {0x41a12, 0x0}, ++ {0x41a13, 0xb00}, ++ {0x41a14, 0x0}, ++ {0x41a15, 0x0}, ++ {0x41a16, 0x0}, ++ {0x41a17, 0x400}, ++ {0x41a18, 0x0}, ++ {0x41a19, 0x0}, ++ {0x41a1a, 0x0}, ++ {0x41a1b, 0x0}, ++ {0x41a1c, 0x0}, ++ {0x41a1d, 0x0}, ++ {0x41a1e, 0x0}, ++ {0x41a1f, 0x0}, ++ {0x41a20, 0x401c}, ++ {0x41a21, 0xd0}, ++ {0x41a22, 0x1}, ++ {0x41a23, 0x0}, ++ {0x41a24, 0x4060}, ++ {0x41a25, 0x84}, ++ {0x41a26, 0x0}, ++ {0x41a27, 0x0}, ++ {0x41a28, 0x0}, ++ {0x41a29, 0x0}, ++ {0x41a2a, 0x0}, ++ {0x41a2b, 0xb00}, ++ {0x41a2c, 0x0}, ++ {0x41a2d, 0x0}, ++ {0x41a2e, 0x0}, ++ {0x41a2f, 0x800}, ++ {0x41a30, 0x407c}, ++ {0x41a31, 0x0}, ++ {0x41a32, 0x0}, ++ {0x41a33, 0x0}, ++ {0x41a34, 0x0}, ++ {0x41a35, 0x0}, ++ {0x41a36, 0x0}, ++ {0x41a37, 0x0}, ++ {0x41a38, 0x0}, ++ {0x41a39, 0x0}, ++ {0x41a3a, 0x0}, ++ {0x41a3b, 0x0}, ++ {0x41a3c, 0x4000}, ++ {0x41a3d, 0x0}, ++ {0x41a3e, 0x1}, ++ {0x41a3f, 0x0}, ++ {0x41a40, 0x0}, ++ {0x41a41, 0x0}, ++ {0x41a42, 0x0}, ++ {0x41a43, 0x0}, ++ {0x41a44, 0x402c}, ++ {0x41a45, 0xd00}, ++ {0x41a46, 0x1}, ++ {0x41a47, 0x0}, ++ {0x41a48, 0x4020}, ++ {0x41a49, 0x803}, ++ {0x41a4a, 0x0}, ++ {0x41a4b, 0x0}, ++ {0x41a4c, 0x0}, ++ {0x41a4d, 0x0}, ++ {0x41a4e, 0x0}, ++ {0x41a4f, 0x0}, ++ {0x41a50, 0x0}, ++ {0x41a51, 0x0}, ++ {0x41a52, 0x0}, ++ {0x41a53, 0x2b00}, ++ {0x41a54, 0x0}, ++ {0x41a55, 0x0}, ++ {0x41a56, 0x0}, ++ {0x41a57, 0x800}, ++ {0x41a58, 0x0}, ++ {0x41a59, 0x0}, ++ {0x41a5a, 0x0}, ++ {0x41a5b, 0x0}, ++ {0x41a5c, 0x407c}, ++ {0x41a5d, 0x0}, ++ {0x41a5e, 0x0}, ++ {0x41a5f, 0x0}, ++ {0x41a60, 0x0}, ++ {0x41a61, 0x0}, ++ {0x41a62, 0x0}, ++ {0x41a63, 0x0}, ++ {0x41a64, 0x0}, ++ {0x41a65, 0x0}, ++ {0x41a66, 0x0}, ++ {0x41a67, 0x0}, ++ {0x41a68, 0x0}, ++ {0x41a69, 0x0}, ++ {0x41a6a, 0x1}, ++ {0x41a6b, 0x0}, ++ {0x41a6c, 0x0}, ++ {0x41a6d, 0x0}, ++ {0x41a6e, 0x0}, ++ {0x41a6f, 0x0}, ++ {0x41a70, 0x801c}, ++ {0x41a71, 0xd0}, ++ {0x41a72, 0x1}, ++ {0x41a73, 0x10}, ++ {0x41a74, 0x8060}, ++ {0x41a75, 0x84}, ++ {0x41a76, 0x0}, ++ {0x41a77, 0x10}, ++ {0x41a78, 0x0}, ++ {0x41a79, 0x0}, ++ {0x41a7a, 0x0}, ++ {0x41a7b, 0xb00}, ++ {0x41a7c, 0x0}, ++ {0x41a7d, 0x0}, ++ {0x41a7e, 0x0}, ++ {0x41a7f, 0x800}, ++ {0x41a80, 0x807c}, ++ {0x41a81, 0x0}, ++ {0x41a82, 0x0}, ++ {0x41a83, 0x10}, ++ {0x41a84, 0x0}, ++ {0x41a85, 0x0}, ++ {0x41a86, 0x0}, ++ {0x41a87, 0x0}, ++ {0x41a88, 0x0}, ++ {0x41a89, 0x0}, ++ {0x41a8a, 0x0}, ++ {0x41a8b, 0x0}, ++ {0x41a8c, 0x8000}, ++ {0x41a8d, 0x0}, ++ {0x41a8e, 0x1}, ++ {0x41a8f, 0x10}, ++ {0x41a90, 0x0}, ++ {0x41a91, 0x0}, ++ {0x41a92, 0x0}, ++ {0x41a93, 0x0}, ++ {0x41a94, 0x802c}, ++ {0x41a95, 0xd00}, ++ {0x41a96, 0x1}, ++ {0x41a97, 0x10}, ++ {0x41a98, 0x8020}, ++ {0x41a99, 0x803}, ++ {0x41a9a, 0x0}, ++ {0x41a9b, 0x10}, ++ {0x41a9c, 0x0}, ++ {0x41a9d, 0x0}, ++ {0x41a9e, 0x0}, ++ {0x41a9f, 0x0}, ++ {0x41aa0, 0x0}, ++ {0x41aa1, 0x0}, ++ {0x41aa2, 0x0}, ++ {0x41aa3, 0x2b00}, ++ {0x41aa4, 0x0}, ++ {0x41aa5, 0x0}, ++ {0x41aa6, 0x0}, ++ {0x41aa7, 0x800}, ++ {0x41aa8, 0x0}, ++ {0x41aa9, 0x0}, ++ {0x41aaa, 0x0}, ++ {0x41aab, 0x0}, ++ {0x41aac, 0x807c}, ++ {0x41aad, 0x0}, ++ {0x41aae, 0x0}, ++ {0x41aaf, 0x10}, ++ {0x41ab0, 0x0}, ++ {0x41ab1, 0x0}, ++ {0x41ab2, 0x0}, ++ {0x41ab3, 0x0}, ++ {0x41ab4, 0x0}, ++ {0x41ab5, 0x0}, ++ {0x41ab6, 0x0}, ++ {0x41ab7, 0x0}, ++ {0x41ab8, 0x0}, ++ {0x41ab9, 0x0}, ++ {0x41aba, 0x1}, ++ {0x41abb, 0x0}, ++ {0x41abc, 0x0}, ++ {0x41abd, 0x0}, ++ {0x41abe, 0x0}, ++ {0x41abf, 0x0}, ++ {0x41ac0, 0x402c}, ++ {0x41ac1, 0xd00}, ++ {0x41ac2, 0x1}, ++ {0x41ac3, 0x0}, ++ {0x41ac4, 0x4050}, ++ {0x41ac5, 0x803}, ++ {0x41ac6, 0x0}, ++ {0x41ac7, 0x0}, ++ {0x41ac8, 0x0}, ++ {0x41ac9, 0x0}, ++ {0x41aca, 0x0}, ++ {0x41acb, 0x0}, ++ {0x41acc, 0x0}, ++ {0x41acd, 0x0}, ++ {0x41ace, 0x0}, ++ {0x41acf, 0x0}, ++ {0x41ad0, 0x0}, ++ {0x41ad1, 0x0}, ++ {0x41ad2, 0x0}, ++ {0x41ad3, 0x0}, ++ {0x41ad4, 0x0}, ++ {0x41ad5, 0x0}, ++ {0x41ad6, 0x0}, ++ {0x41ad7, 0x0}, ++ {0x41ad8, 0x4050}, ++ {0x41ad9, 0x803}, ++ {0x41ada, 0x0}, ++ {0x41adb, 0x5a00}, ++ {0x41adc, 0x0}, ++ {0x41add, 0x0}, ++ {0x41ade, 0x0}, ++ {0x41adf, 0x0}, ++ {0x41ae0, 0x0}, ++ {0x41ae1, 0x0}, ++ {0x41ae2, 0x0}, ++ {0x41ae3, 0x100}, ++ {0x41ae4, 0x0}, ++ {0x41ae5, 0x0}, ++ {0x41ae6, 0x0}, ++ {0x41ae7, 0x0}, ++ {0x41ae8, 0x4050}, ++ {0x41ae9, 0x803}, ++ {0x41aea, 0x0}, ++ {0x41aeb, 0x0}, ++ {0x41aec, 0x0}, ++ {0x41aed, 0x0}, ++ {0x41aee, 0x0}, ++ {0x41aef, 0x0}, ++ {0x41af0, 0x0}, ++ {0x41af1, 0x0}, ++ {0x41af2, 0x0}, ++ {0x41af3, 0x4b00}, ++ {0x41af4, 0x0}, ++ {0x41af5, 0x0}, ++ {0x41af6, 0x0}, ++ {0x41af7, 0x400}, ++ {0x41af8, 0x407c}, ++ {0x41af9, 0x0}, ++ {0x41afa, 0x0}, ++ {0x41afb, 0x0}, ++ {0x41afc, 0x0}, ++ {0x41afd, 0x0}, ++ {0x41afe, 0x0}, ++ {0x41aff, 0x0}, ++ {0x41b00, 0x0}, ++ {0x41b01, 0x0}, ++ {0x41b02, 0x0}, ++ {0x41b03, 0x3b00}, ++ {0x41b04, 0x0}, ++ {0x41b05, 0x0}, ++ {0x41b06, 0x0}, ++ {0x41b07, 0x0}, ++ {0x41b08, 0x0}, ++ {0x41b09, 0x0}, ++ {0x41b0a, 0x0}, ++ {0x41b0b, 0x0}, ++ {0x41b0c, 0x0}, ++ {0x41b0d, 0x0}, ++ {0x41b0e, 0x1}, ++ {0x41b0f, 0x0}, ++ {0x41b10, 0x5758}, ++ {0x41b11, 0x0}, ++ {0x41b12, 0x0}, ++ {0x41b13, 0x0}, ++ {0x41b14, 0x4208}, ++ {0x41b15, 0x0}, ++ {0x41b16, 0x0}, ++ {0x41b17, 0x0}, ++ {0x41b18, 0x0}, ++ {0x41b19, 0x0}, ++ {0x41b1a, 0x0}, ++ {0x41b1b, 0x4b00}, ++ {0x41b1c, 0x0}, ++ {0x41b1d, 0x0}, ++ {0x41b1e, 0x0}, ++ {0x41b1f, 0x0}, ++ {0x41b20, 0x0}, ++ {0x41b21, 0x0}, ++ {0x41b22, 0x0}, ++ {0x41b23, 0x0}, ++ {0x41b24, 0x401c}, ++ {0x41b25, 0xd0}, ++ {0x41b26, 0x1}, ++ {0x41b27, 0x0}, ++ {0x41b28, 0x4060}, ++ {0x41b29, 0x84}, ++ {0x41b2a, 0x0}, ++ {0x41b2b, 0x0}, ++ {0x41b2c, 0x0}, ++ {0x41b2d, 0x0}, ++ {0x41b2e, 0x0}, ++ {0x41b2f, 0x0}, ++ {0x41b30, 0x0}, ++ {0x41b31, 0x0}, ++ {0x41b32, 0x0}, ++ {0x41b33, 0x7b00}, ++ {0x41b34, 0x0}, ++ {0x41b35, 0x0}, ++ {0x41b36, 0x0}, ++ {0x41b37, 0x0}, ++ {0x41b38, 0x407c}, ++ {0x41b39, 0x0}, ++ {0x41b3a, 0x0}, ++ {0x41b3b, 0x0}, ++ {0x41b3c, 0x0}, ++ {0x41b3d, 0x0}, ++ {0x41b3e, 0x0}, ++ {0x41b3f, 0x0}, ++ {0x41b40, 0x0}, ++ {0x41b41, 0x0}, ++ {0x41b42, 0x0}, ++ {0x41b43, 0x0}, ++ {0x41b44, 0x4000}, ++ {0x41b45, 0x0}, ++ {0x41b46, 0x1}, ++ {0x41b47, 0x0}, ++ {0x41b48, 0x0}, ++ {0x41b49, 0x0}, ++ {0x41b4a, 0x0}, ++ {0x41b4b, 0x0}, ++ {0x41b4c, 0x402c}, ++ {0x41b4d, 0xd00}, ++ {0x41b4e, 0x1}, ++ {0x41b4f, 0x0}, ++ {0x41b50, 0x4020}, ++ {0x41b51, 0x803}, ++ {0x41b52, 0x0}, ++ {0x41b53, 0x0}, ++ {0x41b54, 0x0}, ++ {0x41b55, 0x0}, ++ {0x41b56, 0x0}, ++ {0x41b57, 0x0}, ++ {0x41b58, 0x0}, ++ {0x41b59, 0x0}, ++ {0x41b5a, 0x0}, ++ {0x41b5b, 0x2b00}, ++ {0x41b5c, 0x0}, ++ {0x41b5d, 0x0}, ++ {0x41b5e, 0x0}, ++ {0x41b5f, 0x800}, ++ {0x41b60, 0x0}, ++ {0x41b61, 0x0}, ++ {0x41b62, 0x0}, ++ {0x41b63, 0x0}, ++ {0x41b64, 0x407c}, ++ {0x41b65, 0x0}, ++ {0x41b66, 0x0}, ++ {0x41b67, 0x0}, ++ {0x41b68, 0x0}, ++ {0x41b69, 0x0}, ++ {0x41b6a, 0x0}, ++ {0x41b6b, 0x0}, ++ {0x41b6c, 0x0}, ++ {0x41b6d, 0x0}, ++ {0x41b6e, 0x0}, ++ {0x41b6f, 0x0}, ++ {0x41b70, 0x4000}, ++ {0x41b71, 0x0}, ++ {0x41b72, 0x1}, ++ {0x41b73, 0x0}, ++ {0x41b74, 0x0}, ++ {0x41b75, 0x0}, ++ {0x41b76, 0x0}, ++ {0x41b77, 0x0}, ++ {0x41b78, 0x5758}, ++ {0x41b79, 0x0}, ++ {0x41b7a, 0x0}, ++ {0x41b7b, 0x0}, ++ {0x41b7c, 0x4008}, ++ {0x41b7d, 0x0}, ++ {0x41b7e, 0x0}, ++ {0x41b7f, 0x0}, ++ {0x41b80, 0x0}, ++ {0x41b81, 0x0}, ++ {0x41b82, 0x0}, ++ {0x41b83, 0x0}, ++ {0x41b84, 0x0}, ++ {0x41b85, 0x0}, ++ {0x41b86, 0x0}, ++ {0x41b87, 0x0}, ++ {0x41b88, 0x802c}, ++ {0x41b89, 0xd00}, ++ {0x41b8a, 0x1}, ++ {0x41b8b, 0x10}, ++ {0x41b8c, 0x8050}, ++ {0x41b8d, 0x803}, ++ {0x41b8e, 0x0}, ++ {0x41b8f, 0x10}, ++ {0x41b90, 0x0}, ++ {0x41b91, 0x0}, ++ {0x41b92, 0x0}, ++ {0x41b93, 0x0}, ++ {0x41b94, 0x0}, ++ {0x41b95, 0x0}, ++ {0x41b96, 0x0}, ++ {0x41b97, 0x0}, ++ {0x41b98, 0x0}, ++ {0x41b99, 0x0}, ++ {0x41b9a, 0x0}, ++ {0x41b9b, 0x0}, ++ {0x41b9c, 0x0}, ++ {0x41b9d, 0x0}, ++ {0x41b9e, 0x0}, ++ {0x41b9f, 0x0}, ++ {0x41ba0, 0x8050}, ++ {0x41ba1, 0x803}, ++ {0x41ba2, 0x0}, ++ {0x41ba3, 0x5a10}, ++ {0x41ba4, 0x0}, ++ {0x41ba5, 0x0}, ++ {0x41ba6, 0x0}, ++ {0x41ba7, 0x0}, ++ {0x41ba8, 0x0}, ++ {0x41ba9, 0x0}, ++ {0x41baa, 0x0}, ++ {0x41bab, 0x100}, ++ {0x41bac, 0x0}, ++ {0x41bad, 0x0}, ++ {0x41bae, 0x0}, ++ {0x41baf, 0x0}, ++ {0x41bb0, 0x8050}, ++ {0x41bb1, 0x803}, ++ {0x41bb2, 0x0}, ++ {0x41bb3, 0x10}, ++ {0x41bb4, 0x0}, ++ {0x41bb5, 0x0}, ++ {0x41bb6, 0x0}, ++ {0x41bb7, 0x0}, ++ {0x41bb8, 0x0}, ++ {0x41bb9, 0x0}, ++ {0x41bba, 0x0}, ++ {0x41bbb, 0x4b00}, ++ {0x41bbc, 0x0}, ++ {0x41bbd, 0x0}, ++ {0x41bbe, 0x0}, ++ {0x41bbf, 0x400}, ++ {0x41bc0, 0x807c}, ++ {0x41bc1, 0x0}, ++ {0x41bc2, 0x0}, ++ {0x41bc3, 0x10}, ++ {0x41bc4, 0x0}, ++ {0x41bc5, 0x0}, ++ {0x41bc6, 0x0}, ++ {0x41bc7, 0x0}, ++ {0x41bc8, 0x0}, ++ {0x41bc9, 0x0}, ++ {0x41bca, 0x0}, ++ {0x41bcb, 0x3b00}, ++ {0x41bcc, 0x0}, ++ {0x41bcd, 0x0}, ++ {0x41bce, 0x0}, ++ {0x41bcf, 0x0}, ++ {0x41bd0, 0x0}, ++ {0x41bd1, 0x0}, ++ {0x41bd2, 0x0}, ++ {0x41bd3, 0x0}, ++ {0x41bd4, 0x0}, ++ {0x41bd5, 0x0}, ++ {0x41bd6, 0x1}, ++ {0x41bd7, 0x0}, ++ {0x41bd8, 0x9758}, ++ {0x41bd9, 0x0}, ++ {0x41bda, 0x0}, ++ {0x41bdb, 0x10}, ++ {0x41bdc, 0x8208}, ++ {0x41bdd, 0x0}, ++ {0x41bde, 0x0}, ++ {0x41bdf, 0x10}, ++ {0x41be0, 0x0}, ++ {0x41be1, 0x0}, ++ {0x41be2, 0x0}, ++ {0x41be3, 0x4b00}, ++ {0x41be4, 0x0}, ++ {0x41be5, 0x0}, ++ {0x41be6, 0x0}, ++ {0x41be7, 0x0}, ++ {0x41be8, 0x0}, ++ {0x41be9, 0x0}, ++ {0x41bea, 0x0}, ++ {0x41beb, 0x0}, ++ {0x41bec, 0x801c}, ++ {0x41bed, 0xd0}, ++ {0x41bee, 0x1}, ++ {0x41bef, 0x10}, ++ {0x41bf0, 0x8060}, ++ {0x41bf1, 0x84}, ++ {0x41bf2, 0x0}, ++ {0x41bf3, 0x10}, ++ {0x41bf4, 0x0}, ++ {0x41bf5, 0x0}, ++ {0x41bf6, 0x0}, ++ {0x41bf7, 0x0}, ++ {0x41bf8, 0x0}, ++ {0x41bf9, 0x0}, ++ {0x41bfa, 0x0}, ++ {0x41bfb, 0x7b00}, ++ {0x41bfc, 0x0}, ++ {0x41bfd, 0x0}, ++ {0x41bfe, 0x0}, ++ {0x41bff, 0x0}, ++ {0x41c00, 0x807c}, ++ {0x41c01, 0x0}, ++ {0x41c02, 0x0}, ++ {0x41c03, 0x10}, ++ {0x41c04, 0x0}, ++ {0x41c05, 0x0}, ++ {0x41c06, 0x0}, ++ {0x41c07, 0x0}, ++ {0x41c08, 0x0}, ++ {0x41c09, 0x0}, ++ {0x41c0a, 0x0}, ++ {0x41c0b, 0x0}, ++ {0x41c0c, 0x8000}, ++ {0x41c0d, 0x0}, ++ {0x41c0e, 0x1}, ++ {0x41c0f, 0x10}, ++ {0x41c10, 0x0}, ++ {0x41c11, 0x0}, ++ {0x41c12, 0x0}, ++ {0x41c13, 0x0}, ++ {0x41c14, 0x802c}, ++ {0x41c15, 0xd00}, ++ {0x41c16, 0x1}, ++ {0x41c17, 0x10}, ++ {0x41c18, 0x8020}, ++ {0x41c19, 0x803}, ++ {0x41c1a, 0x0}, ++ {0x41c1b, 0x10}, ++ {0x41c1c, 0x0}, ++ {0x41c1d, 0x0}, ++ {0x41c1e, 0x0}, ++ {0x41c1f, 0x0}, ++ {0x41c20, 0x0}, ++ {0x41c21, 0x0}, ++ {0x41c22, 0x0}, ++ {0x41c23, 0x2b00}, ++ {0x41c24, 0x0}, ++ {0x41c25, 0x0}, ++ {0x41c26, 0x0}, ++ {0x41c27, 0x800}, ++ {0x41c28, 0x0}, ++ {0x41c29, 0x0}, ++ {0x41c2a, 0x0}, ++ {0x41c2b, 0x0}, ++ {0x41c2c, 0x807c}, ++ {0x41c2d, 0x0}, ++ {0x41c2e, 0x0}, ++ {0x41c2f, 0x10}, ++ {0x41c30, 0x0}, ++ {0x41c31, 0x0}, ++ {0x41c32, 0x0}, ++ {0x41c33, 0x0}, ++ {0x41c34, 0x0}, ++ {0x41c35, 0x0}, ++ {0x41c36, 0x0}, ++ {0x41c37, 0x0}, ++ {0x41c38, 0x8000}, ++ {0x41c39, 0x0}, ++ {0x41c3a, 0x1}, ++ {0x41c3b, 0x10}, ++ {0x41c3c, 0x0}, ++ {0x41c3d, 0x0}, ++ {0x41c3e, 0x0}, ++ {0x41c3f, 0x0}, ++ {0x41c40, 0x9758}, ++ {0x41c41, 0x0}, ++ {0x41c42, 0x0}, ++ {0x41c43, 0x10}, ++ {0x41c44, 0x8008}, ++ {0x41c45, 0x0}, ++ {0x41c46, 0x0}, ++ {0x41c47, 0x10}, ++ {0x41c48, 0x0}, ++ {0x41c49, 0x0}, ++ {0x41c4a, 0x0}, ++ {0x41c4b, 0x0}, ++ {0x41c4c, 0x0}, ++ {0x41c4d, 0x0}, ++ {0x41c4e, 0x0}, ++ {0x41c4f, 0x0}, ++ {0x41c50, 0xc068}, ++ {0x41c51, 0x0}, ++ {0x41c52, 0x0}, ++ {0x41c53, 0x10}, ++ {0x41c54, 0x0}, ++ {0x41c55, 0x0}, ++ {0x41c56, 0x0}, ++ {0x41c57, 0x0}, ++ {0x9002e, 0x10}, ++ {0x9002f, 0x400}, ++ {0x90030, 0x80e}, ++ {0x90031, 0xb}, ++ {0x90032, 0x480}, ++ {0x90033, 0x809}, ++ {0x90034, 0x9}, ++ {0x90035, 0x308}, ++ {0x90036, 0xc09}, ++ {0x90037, 0x28}, ++ {0x90038, 0x8160}, ++ {0x90039, 0x87c}, ++ {0x9003a, 0x98}, ++ {0x9003b, 0x820}, ++ {0x9003c, 0xc7e}, ++ {0x9003d, 0x2}, ++ {0x9003e, 0x1}, ++ {0x9003f, 0x78}, ++ {0x90040, 0xa}, ++ {0x90041, 0x370}, ++ {0x90042, 0x839}, ++ {0x90043, 0x18}, ++ {0x90044, 0x8160}, ++ {0x90045, 0x83c}, ++ {0x90046, 0x9}, ++ {0x90047, 0x150}, ++ {0x90048, 0x839}, ++ {0x90049, 0x70}, ++ {0x9004a, 0x392}, ++ {0x9004b, 0x39}, ++ {0x9004c, 0x78}, ++ {0x9004d, 0x39a}, ++ {0x9004e, 0x39}, ++ {0x9004f, 0xe09}, ++ {0x90050, 0x100}, ++ {0x90051, 0x839}, ++ {0x90052, 0x2}, ++ {0x90053, 0x1}, ++ {0x90054, 0x38}, ++ {0x90055, 0x0}, ++ {0x90056, 0x100}, ++ {0x90057, 0x839}, ++ {0x90058, 0x0}, ++ {0x90059, 0x398}, ++ {0x9005a, 0x839}, ++ {0x9005b, 0xe19}, ++ {0x9005c, 0x100}, ++ {0x9005d, 0x839}, ++ {0x9005e, 0x2}, ++ {0x9005f, 0x1}, ++ {0x90060, 0x38}, ++ {0x90061, 0x0}, ++ {0x90062, 0x100}, ++ {0x90063, 0x839}, ++ {0x90064, 0x0}, ++ {0x90065, 0x390}, ++ {0x90066, 0x839}, ++ {0x90067, 0x78}, ++ {0x90068, 0x39a}, ++ {0x90069, 0x39}, ++ {0x9006a, 0xe29}, ++ {0x9006b, 0x100}, ++ {0x9006c, 0x839}, ++ {0x9006d, 0x2}, ++ {0x9006e, 0x1}, ++ {0x9006f, 0x38}, ++ {0x90070, 0x0}, ++ {0x90071, 0x100}, ++ {0x90072, 0x839}, ++ {0x90073, 0x70}, ++ {0x90074, 0x392}, ++ {0x90075, 0x39}, ++ {0x90076, 0x0}, ++ {0x90077, 0xf0}, ++ {0x90078, 0x909}, ++ {0x90079, 0x18}, ++ {0x9007a, 0x8160}, ++ {0x9007b, 0x8bc}, ++ {0x9007c, 0x8}, ++ {0x9007d, 0x13a}, ++ {0x9007e, 0xb9}, ++ {0x9007f, 0x24b}, ++ {0x90080, 0x100}, ++ {0x90081, 0x8b9}, ++ {0x90082, 0x2}, ++ {0x90083, 0x1}, ++ {0x90084, 0xb8}, ++ {0x90085, 0x0}, ++ {0x90086, 0x100}, ++ {0x90087, 0x8b9}, ++ {0x90088, 0x20}, ++ {0x90089, 0x4}, ++ {0x9008a, 0xb8}, ++ {0x9008b, 0x20}, ++ {0x9008c, 0x4}, ++ {0x9008d, 0xb8}, ++ {0x9008e, 0x5}, ++ {0x9008f, 0x0}, ++ {0x90090, 0xb8}, ++ {0x90091, 0x479}, ++ {0x90092, 0xc7f8}, ++ {0x90093, 0x8bc}, ++ {0x90094, 0x0}, ++ {0x90095, 0x0}, ++ {0x90096, 0xb8}, ++ {0x90097, 0x0}, ++ {0x90098, 0xa8}, ++ {0x90099, 0x8b9}, ++ {0x9009a, 0x9}, ++ {0x9009b, 0xc9c0}, ++ {0x9009c, 0xcbc}, ++ {0x9009d, 0x0}, ++ {0x9009e, 0x0}, ++ {0x9009f, 0xb8}, ++ {0x900a0, 0x25b}, ++ {0x900a1, 0x100}, ++ {0x900a2, 0xcb9}, ++ {0x900a3, 0x20}, ++ {0x900a4, 0x4}, ++ {0x900a5, 0xb8}, ++ {0x900a6, 0x20}, ++ {0x900a7, 0x4}, ++ {0x900a8, 0xb8}, ++ {0x900a9, 0x20}, ++ {0x900aa, 0x4}, ++ {0x900ab, 0xb8}, ++ {0x900ac, 0x20}, ++ {0x900ad, 0x4}, ++ {0x900ae, 0xb8}, ++ {0x900af, 0x10}, ++ {0x900b0, 0x400}, ++ {0x900b1, 0x89e}, ++ {0x900b2, 0x8}, ++ {0x900b3, 0x370}, ++ {0x900b4, 0x839}, ++ {0x900b5, 0x0}, ++ {0x900b6, 0xf0}, ++ {0x900b7, 0x909}, ++ {0x900b8, 0x33b}, ++ {0x900b9, 0x100}, ++ {0x900ba, 0x8b9}, ++ {0x900bb, 0x0}, ++ {0x900bc, 0x100}, ++ {0x900bd, 0x8b9}, ++ {0x900be, 0x23b}, ++ {0x900bf, 0x100}, ++ {0x900c0, 0xc99}, ++ {0x900c1, 0x2}, ++ {0x900c2, 0x150}, ++ {0x900c3, 0x839}, ++ {0x900c4, 0x1800}, ++ {0x900c5, 0x8660}, ++ {0x900c6, 0x839}, ++ {0x900c7, 0x0}, ++ {0x900c8, 0x2a0}, ++ {0x900c9, 0x809}, ++ {0x900ca, 0x8}, ++ {0x900cb, 0x1880}, ++ {0x900cc, 0x839}, ++ {0x900cd, 0x0}, ++ {0x900ce, 0x82b0}, ++ {0x900cf, 0x838}, ++ {0x900d0, 0x18}, ++ {0x900d1, 0xe0}, ++ {0x900d2, 0x809}, ++ {0x900d3, 0x0}, ++ {0x900d4, 0xe0}, ++ {0x900d5, 0x869}, ++ {0x900d6, 0xf}, ++ {0x900d7, 0x7c0}, ++ {0x900d8, 0x839}, ++ {0x900d9, 0xa}, ++ {0x900da, 0x510}, ++ {0x900db, 0x839}, ++ {0x900dc, 0xa}, ++ {0x900dd, 0x700}, ++ {0x900de, 0x849}, ++ {0x900df, 0xa}, ++ {0x900e0, 0x700}, ++ {0x900e1, 0x859}, ++ {0x900e2, 0xa}, ++ {0x900e3, 0x708}, ++ {0x900e4, 0x859}, ++ {0x900e5, 0x2}, ++ {0x900e6, 0x708}, ++ {0x900e7, 0x849}, ++ {0x900e8, 0xff8}, ++ {0x900e9, 0x8410}, ++ {0x900ea, 0x839}, ++ {0x900eb, 0x7ff8}, ++ {0x900ec, 0x8498}, ++ {0x900ed, 0x838}, ++ {0x900ee, 0x10}, ++ {0x900ef, 0x8160}, ++ {0x900f0, 0x83c}, ++ {0x900f1, 0x0}, ++ {0x900f2, 0x7c8}, ++ {0x900f3, 0x809}, ++ {0x900f4, 0x0}, ++ {0x900f5, 0x1}, ++ {0x900f6, 0x8}, ++ {0x900f7, 0x0}, ++ {0x900f8, 0x45a}, ++ {0x900f9, 0x89}, ++ {0x900fa, 0x0}, ++ {0x900fb, 0x8018}, ++ {0x900fc, 0x808}, ++ {0x900fd, 0x0}, ++ {0x900fe, 0x8020}, ++ {0x900ff, 0x808}, ++ {0x90100, 0x479}, ++ {0x90101, 0xc7f8}, ++ {0x90102, 0x80c}, ++ {0x90103, 0x0}, ++ {0x90104, 0x0}, ++ {0x90105, 0x8}, ++ {0x90106, 0x0}, ++ {0x90107, 0x8018}, ++ {0x90108, 0x808}, ++ {0x90109, 0x0}, ++ {0x9010a, 0x8020}, ++ {0x9010b, 0x808}, ++ {0x9010c, 0x9}, ++ {0x9010d, 0xc9c0}, ++ {0x9010e, 0xc0c}, ++ {0x9010f, 0x0}, ++ {0x90110, 0xa8}, ++ {0x90111, 0x8c9}, ++ {0x90112, 0x29}, ++ {0x90113, 0x8160}, ++ {0x90114, 0x87c}, ++ {0x90115, 0xb8}, ++ {0x90116, 0x820}, ++ {0x90117, 0xc7e}, ++ {0x90118, 0x1}, ++ {0x90119, 0x0}, ++ {0x9011a, 0x78}, ++ {0x9011b, 0x0}, ++ {0x9011c, 0x1}, ++ {0x9011d, 0x78}, ++ {0x9011e, 0xd8}, ++ {0x9011f, 0x820}, ++ {0x90120, 0xc7e}, ++ {0x90121, 0x1}, ++ {0x90122, 0x0}, ++ {0x90123, 0x78}, ++ {0x90124, 0x0}, ++ {0x90125, 0x1}, ++ {0x90126, 0x78}, ++ {0x90127, 0xf8}, ++ {0x90128, 0x820}, ++ {0x90129, 0xc7e}, ++ {0x9012a, 0x1}, ++ {0x9012b, 0x0}, ++ {0x9012c, 0x78}, ++ {0x9012d, 0x0}, ++ {0x9012e, 0x1}, ++ {0x9012f, 0x78}, ++ {0x90130, 0x0}, ++ {0x90131, 0x700}, ++ {0x90132, 0x849}, ++ {0x90133, 0x0}, ++ {0x90134, 0x618}, ++ {0x90135, 0x809}, ++ {0x90136, 0x3ff8}, ++ {0x90137, 0x84b8}, ++ {0x90138, 0x808}, ++ {0x90139, 0x0}, ++ {0x9013a, 0x0}, ++ {0x9013b, 0x8}, ++ {0x9013c, 0x8}, ++ {0x9013d, 0xc870}, ++ {0x9013e, 0xc0c}, ++ {0x9013f, 0x18}, ++ {0x90140, 0x710}, ++ {0x90141, 0x849}, ++ {0x90142, 0x0}, ++ {0x90143, 0x4}, ++ {0x90144, 0x48}, ++ {0x90145, 0x0}, ++ {0x90146, 0x4}, ++ {0x90147, 0x48}, ++ {0x90148, 0x10}, ++ {0x90149, 0x710}, ++ {0x9014a, 0x849}, ++ {0x9014b, 0x0}, ++ {0x9014c, 0x4}, ++ {0x9014d, 0x48}, ++ {0x9014e, 0x0}, ++ {0x9014f, 0x710}, ++ {0x90150, 0x849}, ++ {0x90151, 0x0}, ++ {0x90152, 0x4}, ++ {0x90153, 0x48}, ++ {0x90154, 0x0}, ++ {0x90155, 0x4}, ++ {0x90156, 0x18}, ++ {0x90157, 0x0}, ++ {0x90158, 0x4}, ++ {0x90159, 0x18}, ++ {0x9015a, 0x0}, ++ {0x9015b, 0x4}, ++ {0x9015c, 0x18}, ++ {0x9015d, 0x0}, ++ {0x9015e, 0x8410}, ++ {0x9015f, 0x809}, ++ {0x90160, 0x0}, ++ {0x90161, 0x8498}, ++ {0x90162, 0x808}, ++ {0x90163, 0x5}, ++ {0x90164, 0x510}, ++ {0x90165, 0x809}, ++ {0x90166, 0x198}, ++ {0x90167, 0x1000}, ++ {0x90168, 0x809}, ++ {0x90169, 0x9}, ++ {0x9016a, 0x3c0}, ++ {0x9016b, 0x809}, ++ {0x9016c, 0x10}, ++ {0x9016d, 0x510}, ++ {0x9016e, 0x809}, ++ {0x9016f, 0x0}, ++ {0x90170, 0x3c0}, ++ {0x90171, 0x809}, ++ {0x90172, 0x18}, ++ {0x90173, 0x4}, ++ {0x90174, 0x8}, ++ {0x90175, 0x2}, ++ {0x90176, 0x510}, ++ {0x90177, 0x809}, ++ {0x90178, 0x2}, ++ {0x90179, 0x1000}, ++ {0x9017a, 0x809}, ++ {0x9017b, 0x68}, ++ {0x9017c, 0x801a}, ++ {0x9017d, 0x8}, ++ {0x9017e, 0x68}, ++ {0x9017f, 0x8022}, ++ {0x90180, 0x8}, ++ {0x90181, 0x479}, ++ {0x90182, 0xc7f8}, ++ {0x90183, 0x80c}, ++ {0x90184, 0x0}, ++ {0x90185, 0x0}, ++ {0x90186, 0x8}, ++ {0x90187, 0x68}, ++ {0x90188, 0x801a}, ++ {0x90189, 0x8}, ++ {0x9018a, 0x68}, ++ {0x9018b, 0x8022}, ++ {0x9018c, 0x8}, ++ {0x9018d, 0x9}, ++ {0x9018e, 0xc9c0}, ++ {0x9018f, 0xc0c}, ++ {0x90190, 0x0}, ++ {0x90191, 0xc870}, ++ {0x90192, 0xc0c}, ++ {0x90193, 0x0}, ++ {0x90194, 0x2a0}, ++ {0x90195, 0x809}, ++ {0x90196, 0x10}, ++ {0x90197, 0x8160}, ++ {0x90198, 0x89c}, ++ {0x90199, 0x2}, ++ {0x9019a, 0x7c8}, ++ {0x9019b, 0x809}, ++ {0x9019c, 0x0}, ++ {0x9019d, 0x1}, ++ {0x9019e, 0x8}, ++ {0x9019f, 0x40}, ++ {0x901a0, 0x1932}, ++ {0x901a1, 0x129}, ++ {0x901a2, 0xa}, ++ {0x901a3, 0xc140}, ++ {0x901a4, 0x80c}, ++ {0x901a5, 0x98}, ++ {0x901a6, 0x193a}, ++ {0x901a7, 0x129}, ++ {0x901a8, 0x90}, ++ {0x901a9, 0x1932}, ++ {0x901aa, 0x329}, ++ {0x901ab, 0x90}, ++ {0x901ac, 0x193a}, ++ {0x901ad, 0x329}, ++ {0x901ae, 0x88}, ++ {0x901af, 0x1882}, ++ {0x901b0, 0x9}, ++ {0x901b1, 0x0}, ++ {0x901b2, 0xc140}, ++ {0x901b3, 0x80c}, ++ {0x901b4, 0x10}, ++ {0x901b5, 0x400}, ++ {0x901b6, 0x80e}, ++ {0x901b7, 0xb}, ++ {0x901b8, 0x370}, ++ {0x901b9, 0x809}, ++ {0x901ba, 0x23b}, ++ {0x901bb, 0x100}, ++ {0x901bc, 0xcf9}, ++ {0x901bd, 0x0}, ++ {0x901be, 0x2a0}, ++ {0x901bf, 0x809}, ++ {0x901c0, 0x7800}, ++ {0x901c1, 0x8660}, ++ {0x901c2, 0x809}, ++ {0x901c3, 0xd}, ++ {0x901c4, 0x7c0}, ++ {0x901c5, 0x809}, ++ {0x901c6, 0x0}, ++ {0x901c7, 0x82b0}, ++ {0x901c8, 0x818}, ++ {0x901c9, 0x0}, ++ {0x901ca, 0x82b0}, ++ {0x901cb, 0x868}, ++ {0x901cc, 0x479}, ++ {0x901cd, 0xc7f8}, ++ {0x901ce, 0x91c}, ++ {0x901cf, 0x0}, ++ {0x901d0, 0x0}, ++ {0x901d1, 0x118}, ++ {0x901d2, 0x38}, ++ {0x901d3, 0x80a2}, ++ {0x901d4, 0x118}, ++ {0x901d5, 0x9}, ++ {0x901d6, 0xc9c0}, ++ {0x901d7, 0xd1c}, ++ {0x901d8, 0x0}, ++ {0x901d9, 0x0}, ++ {0x901da, 0x118}, ++ {0x901db, 0x8}, ++ {0x901dc, 0x508}, ++ {0x901dd, 0x809}, ++ {0x901de, 0x5}, ++ {0x901df, 0x7c0}, ++ {0x901e0, 0x809}, ++ {0x901e1, 0x8}, ++ {0x901e2, 0x82b0}, ++ {0x901e3, 0x868}, ++ {0x901e4, 0x8}, ++ {0x901e5, 0x82b0}, ++ {0x901e6, 0x818}, ++ {0x901e7, 0x8}, ++ {0x901e8, 0x82b0}, ++ {0x901e9, 0x888}, ++ {0x901ea, 0x10}, ++ {0x901eb, 0x510}, ++ {0x901ec, 0x809}, ++ {0x901ed, 0x0}, ++ {0x901ee, 0xa8}, ++ {0x901ef, 0x8c9}, ++ {0x901f0, 0x8}, ++ {0x901f1, 0x1900}, ++ {0x901f2, 0xc09}, ++ {0x901f3, 0x0}, ++ {0x901f4, 0x508}, ++ {0x901f5, 0x809}, ++ {0x901f6, 0x2}, ++ {0x901f7, 0x7c8}, ++ {0x901f8, 0x829}, ++ {0x901f9, 0xa}, ++ {0x901fa, 0x3c8}, ++ {0x901fb, 0xc29}, ++ {0x901fc, 0x199}, ++ {0x901fd, 0x3d0}, ++ {0x901fe, 0xc19}, ++ {0x901ff, 0x3}, ++ {0x90200, 0x0}, ++ {0x90201, 0x18}, ++ {0x90202, 0x38}, ++ {0x90203, 0x4}, ++ {0x90204, 0x18}, ++ {0x90205, 0x199}, ++ {0x90206, 0x3d0}, ++ {0x90207, 0xc09}, ++ {0x90208, 0x0}, ++ {0x90209, 0x0}, ++ {0x9020a, 0x8}, ++ {0x9020b, 0x9}, ++ {0x9020c, 0x150}, ++ {0x9020d, 0x809}, ++ {0x9020e, 0x9}, ++ {0x9020f, 0xc800}, ++ {0x90210, 0xc0c}, ++ {0x90211, 0x18}, ++ {0x90212, 0x8160}, ++ {0x90213, 0x8cc}, ++ {0x90214, 0x8}, ++ {0x90215, 0x13a}, ++ {0x90216, 0xc9}, ++ {0x90217, 0x24b}, ++ {0x90218, 0x100}, ++ {0x90219, 0x8c9}, ++ {0x9021a, 0x2}, ++ {0x9021b, 0x1}, ++ {0x9021c, 0xc8}, ++ {0x9021d, 0x0}, ++ {0x9021e, 0x100}, ++ {0x9021f, 0x8c9}, ++ {0x90220, 0x20}, ++ {0x90221, 0x4}, ++ {0x90222, 0xc8}, ++ {0x90223, 0x20}, ++ {0x90224, 0x4}, ++ {0x90225, 0xc8}, ++ {0x90226, 0x5}, ++ {0x90227, 0x0}, ++ {0x90228, 0xc8}, ++ {0x90229, 0x479}, ++ {0x9022a, 0xc7f8}, ++ {0x9022b, 0x8cc}, ++ {0x9022c, 0x0}, ++ {0x9022d, 0x0}, ++ {0x9022e, 0xc8}, ++ {0x9022f, 0x30}, ++ {0x90230, 0xaa}, ++ {0x90231, 0xc9}, ++ {0x90232, 0x9}, ++ {0x90233, 0xc9c0}, ++ {0x90234, 0xccc}, ++ {0x90235, 0x0}, ++ {0x90236, 0x0}, ++ {0x90237, 0xc8}, ++ {0x90238, 0x479}, ++ {0x90239, 0xc7f8}, ++ {0x9023a, 0x8bc}, ++ {0x9023b, 0x0}, ++ {0x9023c, 0x0}, ++ {0x9023d, 0xb8}, ++ {0x9023e, 0x30}, ++ {0x9023f, 0xaa}, ++ {0x90240, 0xb9}, ++ {0x90241, 0x9}, ++ {0x90242, 0xc9c0}, ++ {0x90243, 0xcbc}, ++ {0x90244, 0x0}, ++ {0x90245, 0x0}, ++ {0x90246, 0xb8}, ++ {0x90247, 0x25b}, ++ {0x90248, 0x100}, ++ {0x90249, 0xcc9}, ++ {0x9024a, 0x20}, ++ {0x9024b, 0x4}, ++ {0x9024c, 0xc8}, ++ {0x9024d, 0x20}, ++ {0x9024e, 0x4}, ++ {0x9024f, 0xc8}, ++ {0x90250, 0x20}, ++ {0x90251, 0x4}, ++ {0x90252, 0xa8}, ++ {0x90253, 0x4}, ++ {0x90254, 0x0}, ++ {0x90255, 0xc8}, ++ {0x90256, 0x9}, ++ {0x90257, 0xc800}, ++ {0x90258, 0xc6c}, ++ {0x90259, 0x26f}, ++ {0x9025a, 0x100}, ++ {0x9025b, 0xc19}, ++ {0x9025c, 0x8}, ++ {0x9025d, 0x4}, ++ {0x9025e, 0x18}, ++ {0x9025f, 0x27f}, ++ {0x90260, 0x100}, ++ {0x90261, 0xc19}, ++ {0x90262, 0x479}, ++ {0x90263, 0xc7f8}, ++ {0x90264, 0x80c}, ++ {0x90265, 0x0}, ++ {0x90266, 0x0}, ++ {0x90267, 0x8}, ++ {0x90268, 0x58}, ++ {0x90269, 0x8a}, ++ {0x9026a, 0x9}, ++ {0x9026b, 0x9}, ++ {0x9026c, 0xc9c0}, ++ {0x9026d, 0xc0c}, ++ {0x9026e, 0x0}, ++ {0x9026f, 0x0}, ++ {0x90270, 0x8}, ++ {0x90271, 0x18}, ++ {0x90272, 0x8160}, ++ {0x90273, 0x86c}, ++ {0x90274, 0x1008}, ++ {0x90275, 0x853b}, ++ {0x90276, 0x868}, ++ {0x90277, 0xc00}, ++ {0x90278, 0x8588}, ++ {0x90279, 0x868}, ++ {0x9027a, 0x8}, ++ {0x9027b, 0x85a8}, ++ {0x9027c, 0x868}, ++ {0x9027d, 0x8}, ++ {0x9027e, 0x85c8}, ++ {0x9027f, 0x868}, ++ {0x90280, 0x0}, ++ {0x90281, 0x8050}, ++ {0x90282, 0x868}, ++ {0x90283, 0x60}, ++ {0x90284, 0x138}, ++ {0x90285, 0x869}, ++ {0x90286, 0x18}, ++ {0x90287, 0x8510}, ++ {0x90288, 0x868}, ++ {0x90289, 0x18}, ++ {0x9028a, 0x2c8}, ++ {0x9028b, 0x869}, ++ {0x9028c, 0x10}, ++ {0x9028d, 0x8520}, ++ {0x9028e, 0x868}, ++ {0x9028f, 0x1ff8}, ++ {0x90290, 0x85d8}, ++ {0x90291, 0xc68}, ++ {0x90292, 0x0}, ++ {0x90293, 0xfdf0}, ++ {0x90294, 0x868}, ++ {0x90295, 0x8}, ++ {0x90296, 0x85f0}, ++ {0x90297, 0x868}, ++ {0x90298, 0x8}, ++ {0x90299, 0xa5f0}, ++ {0x9029a, 0x868}, ++ {0x9029b, 0x298}, ++ {0x9029c, 0x100}, ++ {0x9029d, 0x869}, ++ {0x9029e, 0x2}, ++ {0x9029f, 0x1}, ++ {0x902a0, 0x68}, ++ {0x902a1, 0x0}, ++ {0x902a2, 0x100}, ++ {0x902a3, 0x869}, ++ {0x902a4, 0x0}, ++ {0x902a5, 0x85f0}, ++ {0x902a6, 0x868}, ++ {0x902a7, 0x0}, ++ {0x902a8, 0xa5f0}, ++ {0x902a9, 0x868}, ++ {0x902aa, 0x33b}, ++ {0x902ab, 0x100}, ++ {0x902ac, 0x8c9}, ++ {0x902ad, 0x0}, ++ {0x902ae, 0x100}, ++ {0x902af, 0x8c9}, ++ {0x902b0, 0x1ff8}, ++ {0x902b1, 0x85d8}, ++ {0x902b2, 0xc68}, ++ {0x902b3, 0x8}, ++ {0x902b4, 0x8df0}, ++ {0x902b5, 0x868}, ++ {0x902b6, 0x8}, ++ {0x902b7, 0xadf0}, ++ {0x902b8, 0x868}, ++ {0x902b9, 0x2a8}, ++ {0x902ba, 0x100}, ++ {0x902bb, 0x869}, ++ {0x902bc, 0x2}, ++ {0x902bd, 0x1}, ++ {0x902be, 0x68}, ++ {0x902bf, 0x0}, ++ {0x902c0, 0x100}, ++ {0x902c1, 0x869}, ++ {0x902c2, 0x0}, ++ {0x902c3, 0x8df0}, ++ {0x902c4, 0x868}, ++ {0x902c5, 0x0}, ++ {0x902c6, 0xadf0}, ++ {0x902c7, 0x868}, ++ {0x902c8, 0x10}, ++ {0x902c9, 0x2c8}, ++ {0x902ca, 0x869}, ++ {0x902cb, 0x28}, ++ {0x902cc, 0x4}, ++ {0x902cd, 0x68}, ++ {0x902ce, 0xa}, ++ {0x902cf, 0x500}, ++ {0x902d0, 0xc69}, ++ {0x902d1, 0x0}, ++ {0x902d2, 0x8520}, ++ {0x902d3, 0x868}, ++ {0x902d4, 0x8}, ++ {0x902d5, 0x8530}, ++ {0x902d6, 0x868}, ++ {0x902d7, 0x2ba}, ++ {0x902d8, 0x100}, ++ {0x902d9, 0x869}, ++ {0x902da, 0x2}, ++ {0x902db, 0x1}, ++ {0x902dc, 0x68}, ++ {0x902dd, 0x2}, ++ {0x902de, 0x100}, ++ {0x902df, 0x869}, ++ {0x902e0, 0x0}, ++ {0x902e1, 0x8530}, ++ {0x902e2, 0x868}, ++ {0x902e3, 0x0}, ++ {0x902e4, 0x8510}, ++ {0x902e5, 0x868}, ++ {0x902e6, 0x0}, ++ {0x902e7, 0x2c8}, ++ {0x902e8, 0x869}, ++ {0x902e9, 0x8}, ++ {0x902ea, 0x8050}, ++ {0x902eb, 0x868}, ++ {0x902ec, 0x30}, ++ {0x902ed, 0x4}, ++ {0x902ee, 0x68}, ++ {0x902ef, 0x8}, ++ {0x902f0, 0x8520}, ++ {0x902f1, 0x868}, ++ {0x902f2, 0x0}, ++ {0x902f3, 0x8328}, ++ {0x902f4, 0x86b}, ++ {0x902f5, 0x2ca}, ++ {0x902f6, 0x100}, ++ {0x902f7, 0x869}, ++ {0x902f8, 0x2}, ++ {0x902f9, 0x1}, ++ {0x902fa, 0x68}, ++ {0x902fb, 0x4}, ++ {0x902fc, 0x100}, ++ {0x902fd, 0x869}, ++ {0x902fe, 0xff8}, ++ {0x902ff, 0x8328}, ++ {0x90300, 0x86b}, ++ {0x90301, 0x9}, ++ {0x90302, 0x500}, ++ {0x90303, 0xc29}, ++ {0x90304, 0x0}, ++ {0x90305, 0x8520}, ++ {0x90306, 0x868}, ++ {0x90307, 0x8}, ++ {0x90308, 0x3c8}, ++ {0x90309, 0xc29}, ++ {0x9030a, 0x0}, ++ {0x9030b, 0x150}, ++ {0x9030c, 0x809}, ++ {0x9030d, 0x2}, ++ {0x9030e, 0x370}, ++ {0x9030f, 0x809}, ++ {0x90310, 0x0}, ++ {0x90311, 0x400}, ++ {0x90312, 0x80e}, ++ {0x90313, 0x10}, ++ {0x90314, 0x4}, ++ {0x90315, 0x118}, ++ {0x90316, 0x20}, ++ {0x90317, 0x82b0}, ++ {0x90318, 0x808}, ++ {0x90319, 0x479}, ++ {0x9031a, 0xc7f8}, ++ {0x9031b, 0x80c}, ++ {0x9031c, 0x0}, ++ {0x9031d, 0x0}, ++ {0x9031e, 0x8}, ++ {0x9031f, 0x60}, ++ {0x90320, 0x8a}, ++ {0x90321, 0x9}, ++ {0x90322, 0x9}, ++ {0x90323, 0xc9c0}, ++ {0x90324, 0xc0c}, ++ {0x90325, 0x0}, ++ {0x90326, 0x0}, ++ {0x90327, 0x8}, ++ {0x90328, 0x8}, ++ {0x90329, 0x2a0}, ++ {0x9032a, 0x809}, ++ {0x9032b, 0x48}, ++ {0x9032c, 0xc822}, ++ {0x9032d, 0xc}, ++ {0x9032e, 0x48}, ++ {0x9032f, 0xcc32}, ++ {0x90330, 0xc}, ++ {0x90331, 0x9}, ++ {0x90332, 0xc800}, ++ {0x90333, 0xc0c}, ++ {0x90334, 0x0}, ++ {0x90335, 0x8168}, ++ {0x90336, 0x80c}, ++ {0x90337, 0x479}, ++ {0x90338, 0xc7f8}, ++ {0x90339, 0x91c}, ++ {0x9033a, 0x0}, ++ {0x9033b, 0x0}, ++ {0x9033c, 0x118}, ++ {0x9033d, 0x9190}, ++ {0x9033e, 0x80a1}, ++ {0x9033f, 0x918}, ++ {0x90340, 0x9}, ++ {0x90341, 0xc9c0}, ++ {0x90342, 0xd1c}, ++ {0x90343, 0x0}, ++ {0x90344, 0x0}, ++ {0x90345, 0x118}, ++ {0x90346, 0x18}, ++ {0x90347, 0xf0}, ++ {0x90348, 0x909}, ++ {0x90349, 0xa}, ++ {0x9034a, 0xc140}, ++ {0x9034b, 0x92c}, ++ {0x9034c, 0x88}, ++ {0x9034d, 0x1932}, ++ {0x9034e, 0x129}, ++ {0x9034f, 0x88}, ++ {0x90350, 0x193a}, ++ {0x90351, 0x129}, ++ {0x90352, 0x0}, ++ {0x90353, 0xc140}, ++ {0x90354, 0x92c}, ++ {0x90355, 0x8}, ++ {0x90356, 0x300}, ++ {0x90357, 0x819}, ++ {0x90358, 0x10}, ++ {0x90359, 0x8160}, ++ {0x9035a, 0x80c}, ++ {0x9035b, 0x8}, ++ {0x9035c, 0x7c8}, ++ {0x9035d, 0x801}, ++ {0x9035e, 0x8}, ++ {0x9035f, 0x0}, ++ {0x90360, 0x8}, ++ {0x90361, 0x8}, ++ {0x90362, 0x1880}, ++ {0x90363, 0x809}, ++ {0x90364, 0x10}, ++ {0x90365, 0x8160}, ++ {0x90366, 0x80c}, ++ {0x90367, 0x1800}, ++ {0x90368, 0x8660}, ++ {0x90369, 0x809}, ++ {0x9036a, 0x4000}, ++ {0x9036b, 0x8668}, ++ {0x9036c, 0x809}, ++ {0x9036d, 0x0}, ++ {0x9036e, 0xf0}, ++ {0x9036f, 0x909}, ++ {0x90370, 0xf}, ++ {0x90371, 0x7c0}, ++ {0x90372, 0x809}, ++ {0x90373, 0x0}, ++ {0x90374, 0x2a0}, ++ {0x90375, 0x809}, ++ {0x90376, 0x8}, ++ {0x90377, 0x618}, ++ {0x90378, 0x809}, ++ {0x90379, 0x0}, ++ {0x9037a, 0x84b8}, ++ {0x9037b, 0x808}, ++ {0x9037c, 0xff8}, ++ {0x9037d, 0x8410}, ++ {0x9037e, 0x809}, ++ {0x9037f, 0x7ff8}, ++ {0x90380, 0x8498}, ++ {0x90381, 0x808}, ++ {0x90382, 0x0}, ++ {0x90383, 0x7c8}, ++ {0x90384, 0x809}, ++ {0x90385, 0x8}, ++ {0x90386, 0x8168}, ++ {0x90387, 0x80c}, ++ {0x90388, 0x0}, ++ {0x90389, 0x1}, ++ {0x9038a, 0x8}, ++ {0x9038b, 0x0}, ++ {0x9038c, 0x4}, ++ {0x9038d, 0x8}, ++ {0x9038e, 0x0}, ++ {0x9038f, 0x4}, ++ {0x90390, 0x8}, ++ {0x90391, 0x18}, ++ {0x90392, 0x300}, ++ {0x90393, 0x809}, ++ {0x90394, 0x0}, ++ {0x90395, 0x480}, ++ {0x90396, 0x809}, ++ {0x90397, 0x8}, ++ {0x90398, 0x510}, ++ {0x90399, 0x809}, ++ {0x9039a, 0x7800}, ++ {0x9039b, 0x8660}, ++ {0x9039c, 0x809}, ++ {0x9039d, 0x18}, ++ {0x9039e, 0xf0}, ++ {0x9039f, 0x909}, ++ {0x903a0, 0x8}, ++ {0x903a1, 0x7c8}, ++ {0x903a2, 0x801}, ++ {0x903a3, 0x10}, ++ {0x903a4, 0x400}, ++ {0x903a5, 0x80e}, ++ {0x903a6, 0x8}, ++ {0x903a7, 0x150}, ++ {0x903a8, 0x809}, ++ {0x903a9, 0x9}, ++ {0x903aa, 0x370}, ++ {0x903ab, 0x809}, ++ {0x903ac, 0x18}, ++ {0x903ad, 0x8160}, ++ {0x903ae, 0x80c}, ++ {0x903af, 0x8}, ++ {0x903b0, 0xc800}, ++ {0x903b1, 0xc0c}, ++ {0x903b2, 0x8}, ++ {0x903b3, 0xc888}, ++ {0x903b4, 0xc04}, ++ {0x903b5, 0x20}, ++ {0x903b6, 0x8302}, ++ {0x903b7, 0xb}, ++ {0x903b8, 0x18}, ++ {0x903b9, 0x8582}, ++ {0x903ba, 0x8}, ++ {0x903bb, 0x9000}, ++ {0x903bc, 0x8539}, ++ {0x903bd, 0x808}, ++ {0x903be, 0x0}, ++ {0x903bf, 0x8588}, ++ {0x903c0, 0x808}, ++ {0x903c1, 0x40}, ++ {0x903c2, 0x85c8}, ++ {0x903c3, 0x808}, ++ {0x903c4, 0x0}, ++ {0x903c5, 0xfdf0}, ++ {0x903c6, 0x808}, ++ {0x903c7, 0x800}, ++ {0x903c8, 0xc5f0}, ++ {0x903c9, 0x808}, ++ {0x903ca, 0x1ff8}, ++ {0x903cb, 0xfdd8}, ++ {0x903cc, 0xc08}, ++ {0x903cd, 0x18}, ++ {0x903ce, 0xfda8}, ++ {0x903cf, 0x808}, ++ {0x903d0, 0x40}, ++ {0x903d1, 0x8520}, ++ {0x903d2, 0x8d8}, ++ {0x903d3, 0x80}, ++ {0x903d4, 0x8520}, ++ {0x903d5, 0x8e8}, ++ {0x903d6, 0x30a}, ++ {0x903d7, 0x100}, ++ {0x903d8, 0x8d9}, ++ {0x903d9, 0x32a}, ++ {0x903da, 0x100}, ++ {0x903db, 0x8e9}, ++ {0x903dc, 0x0}, ++ {0x903dd, 0x1}, ++ {0x903de, 0x8}, ++ {0x903df, 0x0}, ++ {0x903e0, 0x100}, ++ {0x903e1, 0x809}, ++ {0x903e2, 0x1ff8}, ++ {0x903e3, 0xfdd8}, ++ {0x903e4, 0xc08}, ++ {0x903e5, 0x8}, ++ {0x903e6, 0xfda8}, ++ {0x903e7, 0x808}, ++ {0x903e8, 0x140}, ++ {0x903e9, 0x8520}, ++ {0x903ea, 0x8d8}, ++ {0x903eb, 0x180}, ++ {0x903ec, 0x8520}, ++ {0x903ed, 0x8e8}, ++ {0x903ee, 0x30a}, ++ {0x903ef, 0x100}, ++ {0x903f0, 0x8d9}, ++ {0x903f1, 0x32a}, ++ {0x903f2, 0x100}, ++ {0x903f3, 0x8e9}, ++ {0x903f4, 0x0}, ++ {0x903f5, 0x1}, ++ {0x903f6, 0x8}, ++ {0x903f7, 0x0}, ++ {0x903f8, 0x100}, ++ {0x903f9, 0x809}, ++ {0x903fa, 0x9}, ++ {0x903fb, 0x500}, ++ {0x903fc, 0xc09}, ++ {0x903fd, 0x10}, ++ {0x903fe, 0x82b0}, ++ {0x903ff, 0x808}, ++ {0x90400, 0x0}, ++ {0x90401, 0x8520}, ++ {0x90402, 0x808}, ++ {0x90403, 0x8}, ++ {0x90404, 0x3c8}, ++ {0x90405, 0xc09}, ++ {0x90406, 0x0}, ++ {0x90407, 0x150}, ++ {0x90408, 0x809}, ++ {0x90409, 0x2}, ++ {0x9040a, 0x370}, ++ {0x9040b, 0x809}, ++ {0x9040c, 0x0}, ++ {0x9040d, 0x400}, ++ {0x9040e, 0x80e}, ++ {0x9040f, 0x8}, ++ {0x90410, 0xc848}, ++ {0x90411, 0xc0c}, ++ {0x90412, 0x0}, ++ {0x90413, 0xc890}, ++ {0x90414, 0x804}, ++ {0x90415, 0x20}, ++ {0x90416, 0x8302}, ++ {0x90417, 0xb}, ++ {0x90418, 0x18}, ++ {0x90419, 0x8582}, ++ {0x9041a, 0x8}, ++ {0x9041b, 0x0}, ++ {0x9041c, 0x82b0}, ++ {0x9041d, 0x808}, ++ {0x9041e, 0x1000}, ++ {0x9041f, 0x8539}, ++ {0x90420, 0x808}, ++ {0x90421, 0x0}, ++ {0x90422, 0x8588}, ++ {0x90423, 0x808}, ++ {0x90424, 0x40}, ++ {0x90425, 0x85c8}, ++ {0x90426, 0x808}, ++ {0x90427, 0x7f8}, ++ {0x90428, 0xfdf0}, ++ {0x90429, 0x808}, ++ {0x9042a, 0x800}, ++ {0x9042b, 0xc5f0}, ++ {0x9042c, 0x808}, ++ {0x9042d, 0x80}, ++ {0x9042e, 0x8088}, ++ {0x9042f, 0x80b}, ++ {0x90430, 0x1ff8}, ++ {0x90431, 0xfdd8}, ++ {0x90432, 0xc08}, ++ {0x90433, 0x18}, ++ {0x90434, 0xfda8}, ++ {0x90435, 0x808}, ++ {0x90436, 0x200}, ++ {0x90437, 0x8520}, ++ {0x90438, 0x8d8}, ++ {0x90439, 0x400}, ++ {0x9043a, 0x8520}, ++ {0x9043b, 0x8e8}, ++ {0x9043c, 0x2da}, ++ {0x9043d, 0x100}, ++ {0x9043e, 0x8d9}, ++ {0x9043f, 0x2ea}, ++ {0x90440, 0x100}, ++ {0x90441, 0x8e9}, ++ {0x90442, 0x2}, ++ {0x90443, 0x1}, ++ {0x90444, 0x8}, ++ {0x90445, 0x0}, ++ {0x90446, 0x100}, ++ {0x90447, 0x809}, ++ {0x90448, 0x1ff8}, ++ {0x90449, 0xfdd8}, ++ {0x9044a, 0xc08}, ++ {0x9044b, 0x8}, ++ {0x9044c, 0xfda8}, ++ {0x9044d, 0x808}, ++ {0x9044e, 0xa00}, ++ {0x9044f, 0x8520}, ++ {0x90450, 0x8d8}, ++ {0x90451, 0xc00}, ++ {0x90452, 0x8520}, ++ {0x90453, 0x8e8}, ++ {0x90454, 0x2da}, ++ {0x90455, 0x100}, ++ {0x90456, 0x8d9}, ++ {0x90457, 0x2ea}, ++ {0x90458, 0x100}, ++ {0x90459, 0x8e9}, ++ {0x9045a, 0x0}, ++ {0x9045b, 0x1}, ++ {0x9045c, 0x8}, ++ {0x9045d, 0x0}, ++ {0x9045e, 0x100}, ++ {0x9045f, 0x809}, ++ {0x90460, 0x9}, ++ {0x90461, 0x500}, ++ {0x90462, 0xc09}, ++ {0x90463, 0x10}, ++ {0x90464, 0x82b0}, ++ {0x90465, 0x808}, ++ {0x90466, 0x0}, ++ {0x90467, 0x8520}, ++ {0x90468, 0x808}, ++ {0x90469, 0x8}, ++ {0x9046a, 0x3c8}, ++ {0x9046b, 0xc09}, ++ {0x9046c, 0x0}, ++ {0x9046d, 0x150}, ++ {0x9046e, 0x809}, ++ {0x9046f, 0x2}, ++ {0x90470, 0x370}, ++ {0x90471, 0x809}, ++ {0x90472, 0x0}, ++ {0x90473, 0x400}, ++ {0x90474, 0x80e}, ++ {0x90475, 0x8}, ++ {0x90476, 0xc848}, ++ {0x90477, 0xc0c}, ++ {0x90478, 0x0}, ++ {0x90479, 0xc890}, ++ {0x9047a, 0x804}, ++ {0x9047b, 0x1008}, ++ {0x9047c, 0x853b}, ++ {0x9047d, 0x808}, ++ {0x9047e, 0xc00}, ++ {0x9047f, 0x8588}, ++ {0x90480, 0x808}, ++ {0x90481, 0x8}, ++ {0x90482, 0x85a8}, ++ {0x90483, 0x808}, ++ {0x90484, 0x8}, ++ {0x90485, 0x85c8}, ++ {0x90486, 0x808}, ++ {0x90487, 0x60}, ++ {0x90488, 0x138}, ++ {0x90489, 0x809}, ++ {0x9048a, 0x18}, ++ {0x9048b, 0xc8}, ++ {0x9048c, 0x809}, ++ {0x9048d, 0x0}, ++ {0x9048e, 0xa4}, ++ {0x9048f, 0x809}, ++ {0x90490, 0x0}, ++ {0x90491, 0x8510}, ++ {0x90492, 0x808}, ++ {0x90493, 0x2fa}, ++ {0x90494, 0x100}, ++ {0x90495, 0x8d9}, ++ {0x90496, 0x31a}, ++ {0x90497, 0x100}, ++ {0x90498, 0x8e9}, ++ {0x90499, 0x2}, ++ {0x9049a, 0x1}, ++ {0x9049b, 0x8}, ++ {0x9049c, 0x2}, ++ {0x9049d, 0x100}, ++ {0x9049e, 0x809}, ++ {0x9049f, 0x202}, ++ {0x904a0, 0x8510}, ++ {0x904a1, 0xc08}, ++ {0x904a2, 0x50}, ++ {0x904a3, 0xa2}, ++ {0x904a4, 0x9}, ++ {0x904a5, 0x0}, ++ {0x904a6, 0x0}, ++ {0x904a7, 0x8}, ++ {0x904a8, 0x0}, ++ {0x904a9, 0x0}, ++ {0x904aa, 0x8}, ++ {0x904ab, 0x0}, ++ {0x904ac, 0x0}, ++ {0x904ad, 0x8}, ++ {0x904ae, 0x0}, ++ {0x904af, 0xc8}, ++ {0x904b0, 0x809}, ++ {0x904b1, 0xb}, ++ {0x904b2, 0x508}, ++ {0x904b3, 0x809}, ++ {0x904b4, 0x8}, ++ {0x904b5, 0x1900}, ++ {0x904b6, 0xc09}, ++ {0x904b7, 0x2}, ++ {0x904b8, 0x0}, ++ {0x904b9, 0x8}, ++ {0x904ba, 0x0}, ++ {0x904bb, 0x508}, ++ {0x904bc, 0x809}, ++ {0x904bd, 0x9}, ++ {0x904be, 0x500}, ++ {0x904bf, 0xc09}, ++ {0x904c0, 0x10}, ++ {0x904c1, 0x82b0}, ++ {0x904c2, 0x808}, ++ {0x904c3, 0x0}, ++ {0x904c4, 0x8520}, ++ {0x904c5, 0x808}, ++ {0x904c6, 0x8}, ++ {0x904c7, 0x3c8}, ++ {0x904c8, 0xc09}, ++ {0x904c9, 0x0}, ++ {0x904ca, 0x150}, ++ {0x904cb, 0x809}, ++ {0x904cc, 0x2}, ++ {0x904cd, 0x370}, ++ {0x904ce, 0x809}, ++ {0x904cf, 0x0}, ++ {0x904d0, 0x400}, ++ {0x904d1, 0x80e}, ++ {0x904d2, 0x8}, ++ {0x904d3, 0xc848}, ++ {0x904d4, 0xc0c}, ++ {0x904d5, 0x0}, ++ {0x904d6, 0xc890}, ++ {0x904d7, 0x804}, ++ {0x904d8, 0x20}, ++ {0x904d9, 0x8302}, ++ {0x904da, 0xb}, ++ {0x904db, 0x18}, ++ {0x904dc, 0x8582}, ++ {0x904dd, 0x8}, ++ {0x904de, 0x1000}, ++ {0x904df, 0x8539}, ++ {0x904e0, 0x808}, ++ {0x904e1, 0x0}, ++ {0x904e2, 0x8588}, ++ {0x904e3, 0x808}, ++ {0x904e4, 0x40}, ++ {0x904e5, 0x85c8}, ++ {0x904e6, 0x808}, ++ {0x904e7, 0x8}, ++ {0x904e8, 0xfdf0}, ++ {0x904e9, 0x808}, ++ {0x904ea, 0x80}, ++ {0x904eb, 0x8088}, ++ {0x904ec, 0x80b}, ++ {0x904ed, 0x0}, ++ {0x904ee, 0x3b8}, ++ {0x904ef, 0x869}, ++ {0x904f0, 0x1ff8}, ++ {0x904f1, 0xfdd8}, ++ {0x904f2, 0xc08}, ++ {0x904f3, 0x18}, ++ {0x904f4, 0xfda8}, ++ {0x904f5, 0x808}, ++ {0x904f6, 0x40}, ++ {0x904f7, 0x8520}, ++ {0x904f8, 0x8d8}, ++ {0x904f9, 0x80}, ++ {0x904fa, 0x8520}, ++ {0x904fb, 0x8e8}, ++ {0x904fc, 0x2da}, ++ {0x904fd, 0x100}, ++ {0x904fe, 0x8d9}, ++ {0x904ff, 0x2ea}, ++ {0x90500, 0x100}, ++ {0x90501, 0x8e9}, ++ {0x90502, 0x2}, ++ {0x90503, 0x1}, ++ {0x90504, 0x8}, ++ {0x90505, 0x0}, ++ {0x90506, 0x100}, ++ {0x90507, 0x809}, ++ {0x90508, 0x1ff8}, ++ {0x90509, 0xfdd8}, ++ {0x9050a, 0xc08}, ++ {0x9050b, 0x8}, ++ {0x9050c, 0xfda8}, ++ {0x9050d, 0x808}, ++ {0x9050e, 0x140}, ++ {0x9050f, 0x8520}, ++ {0x90510, 0x8d8}, ++ {0x90511, 0x180}, ++ {0x90512, 0x8520}, ++ {0x90513, 0x8e8}, ++ {0x90514, 0x2da}, ++ {0x90515, 0x100}, ++ {0x90516, 0x8d9}, ++ {0x90517, 0x2ea}, ++ {0x90518, 0x100}, ++ {0x90519, 0x8e9}, ++ {0x9051a, 0x0}, ++ {0x9051b, 0x1}, ++ {0x9051c, 0x8}, ++ {0x9051d, 0x0}, ++ {0x9051e, 0x100}, ++ {0x9051f, 0x809}, ++ {0x90520, 0x9}, ++ {0x90521, 0x500}, ++ {0x90522, 0xc09}, ++ {0x90523, 0x10}, ++ {0x90524, 0x82b0}, ++ {0x90525, 0x808}, ++ {0x90526, 0x0}, ++ {0x90527, 0x8520}, ++ {0x90528, 0x808}, ++ {0x90529, 0x8}, ++ {0x9052a, 0x3c8}, ++ {0x9052b, 0xc09}, ++ {0x9052c, 0x0}, ++ {0x9052d, 0x150}, ++ {0x9052e, 0x809}, ++ {0x9052f, 0x2}, ++ {0x90530, 0x370}, ++ {0x90531, 0x809}, ++ {0x90532, 0x0}, ++ {0x90533, 0x400}, ++ {0x90534, 0x80e}, ++ {0x90535, 0x8}, ++ {0x90536, 0xc848}, ++ {0x90537, 0xc0c}, ++ {0x90538, 0x0}, ++ {0x90539, 0xc890}, ++ {0x9053a, 0x804}, ++ {0xd00e7, 0x600}, ++ {0x9001c, 0x0}, ++ {0x90020, 0x77}, ++ {0x90024, 0x82}, ++ {0x90025, 0x2b}, ++ {0x90026, 0x2b}, ++ {0x9002b, 0x110}, ++ {0x90708, 0x127}, ++ {0x90700, 0x14d}, ++ {0x90701, 0x16f}, ++ {0x90702, 0x18e}, ++ {0x90703, 0x12d}, ++ {0x90704, 0x0}, ++ {0x90705, 0x0}, ++ {0x90706, 0x0}, ++ {0x90707, 0x0}, ++ {0x2018a, 0x0}, ++ {0x20124, 0x1}, ++ {0x2018b, 0x16}, ++ {0x20125, 0x39}, ++ {0x2018c, 0x4e}, ++ {0x20126, 0x1}, ++ {0x2018d, 0x16}, ++ {0x20127, 0x39}, ++ {0x2018e, 0x4e}, ++ {0x20128, 0x17}, ++ {0x2018f, 0x27}, ++ {0x20129, 0x4f}, ++ {0x20190, 0x5f}, ++ {0x2012a, 0x17}, ++ {0x20191, 0x27}, ++ {0x2012b, 0x4f}, ++ {0x20192, 0x5f}, ++ {0x2012c, 0x28}, ++ {0x20193, 0x38}, ++ {0x2012d, 0x60}, ++ {0x20194, 0x70}, ++ {0x2012e, 0x28}, ++ {0x20195, 0x38}, ++ {0x2012f, 0x60}, ++ {0x20196, 0x70}, ++ {0x20130, 0x80}, ++ {0x20197, 0x80}, ++ {0x20131, 0x80}, ++ {0x20198, 0x80}, ++ {0x20132, 0x80}, ++ {0x20199, 0x80}, ++ {0x20133, 0x80}, ++ {0x2019a, 0x80}, ++ {0x20134, 0x71}, ++ {0x2019b, 0x74}, ++ {0x20135, 0x77}, ++ {0x2019c, 0x7a}, ++ {0x20136, 0x71}, ++ {0x2019d, 0x74}, ++ {0x20137, 0x77}, ++ {0x2019e, 0x7a}, ++ {0x20138, 0x75}, ++ {0x2019f, 0x76}, ++ {0x20139, 0x7b}, ++ {0x201a0, 0x7c}, ++ {0x2013a, 0x75}, ++ {0x201a1, 0x76}, ++ {0x2013b, 0x7b}, ++ {0x201a2, 0x7c}, ++ {0x2013c, 0x7d}, ++ {0x201a3, 0x7e}, ++ {0x2013d, 0x7d}, ++ {0x201a4, 0x7e}, ++ {0x2013e, 0x7d}, ++ {0x201a5, 0x7e}, ++ {0x2013f, 0x7d}, ++ {0x201a6, 0x7e}, ++ {0x20140, 0x7f}, ++ {0x201a7, 0x7f}, ++ {0x20141, 0x7f}, ++ {0x201a8, 0x7f}, ++ {0x20142, 0x7f}, ++ {0x201a9, 0x7f}, ++ {0x20143, 0x7f}, ++ {0x201aa, 0x7f}, ++ {0x20144, 0x80}, ++ {0x201ab, 0x7f}, ++ {0x20145, 0x80}, ++ {0x201ac, 0x7f}, ++ {0x20146, 0x80}, ++ {0x201ad, 0x7f}, ++ {0x20147, 0x80}, ++ {0x201ae, 0x7f}, ++ {0x20148, 0x81}, ++ {0x201af, 0x93}, ++ {0x20149, 0x81}, ++ {0x201b0, 0x93}, ++ {0x2014a, 0x10a}, ++ {0x201b1, 0x11b}, ++ {0x2014b, 0x10a}, ++ {0x201b2, 0x11b}, ++ {0x2014c, 0x94}, ++ {0x201b3, 0x9b}, ++ {0x2014d, 0x94}, ++ {0x201b4, 0x9b}, ++ {0x2014e, 0x11c}, ++ {0x201b5, 0x122}, ++ {0x2014f, 0x11c}, ++ {0x201b6, 0x122}, ++ {0x20150, 0x9c}, ++ {0x201b7, 0xaf}, ++ {0x20151, 0x9c}, ++ {0x201b8, 0xaf}, ++ {0x20152, 0x123}, ++ {0x201b9, 0x132}, ++ {0x20153, 0x123}, ++ {0x201ba, 0x132}, ++ {0x20154, 0xb0}, ++ {0x201bb, 0xc0}, ++ {0x20155, 0xb0}, ++ {0x201bc, 0xc0}, ++ {0x20156, 0x133}, ++ {0x201bd, 0x143}, ++ {0x20157, 0x133}, ++ {0x201be, 0x143}, ++ {0x20158, 0xc1}, ++ {0x201bf, 0xca}, ++ {0x20159, 0xc1}, ++ {0x201c0, 0xca}, ++ {0x2015a, 0x144}, ++ {0x201c1, 0x14d}, ++ {0x2015b, 0x144}, ++ {0x201c2, 0x14d}, ++ {0x2015c, 0xcb}, ++ {0x201c3, 0xd4}, ++ {0x2015d, 0xcb}, ++ {0x201c4, 0xd4}, ++ {0x2015e, 0x14e}, ++ {0x201c5, 0x157}, ++ {0x2015f, 0x14e}, ++ {0x201c6, 0x157}, ++ {0x20160, 0xd5}, ++ {0x201c7, 0xdf}, ++ {0x20161, 0xd5}, ++ {0x201c8, 0xdf}, ++ {0x20162, 0x158}, ++ {0x201c9, 0x161}, ++ {0x20163, 0x158}, ++ {0x201ca, 0x161}, ++ {0x20164, 0xe0}, ++ {0x201cb, 0xee}, ++ {0x20165, 0xe0}, ++ {0x201cc, 0xee}, ++ {0x20166, 0x162}, ++ {0x201cd, 0x170}, ++ {0x20167, 0x162}, ++ {0x201ce, 0x170}, ++ {0x20168, 0xef}, ++ {0x201cf, 0xf9}, ++ {0x20169, 0xef}, ++ {0x201d0, 0xf9}, ++ {0x2016a, 0x171}, ++ {0x201d1, 0x17a}, ++ {0x2016b, 0x171}, ++ {0x201d2, 0x17a}, ++ {0x2016c, 0xfa}, ++ {0x201d3, 0x108}, ++ {0x2016d, 0xfa}, ++ {0x201d4, 0x108}, ++ {0x2016e, 0x17b}, ++ {0x201d5, 0x189}, ++ {0x2016f, 0x17b}, ++ {0x201d6, 0x189}, ++ {0x20170, 0x109}, ++ {0x201d7, 0x109}, ++ {0x20171, 0x109}, ++ {0x201d8, 0x109}, ++ {0x20172, 0x18a}, ++ {0x201d9, 0x18a}, ++ {0x20173, 0x18a}, ++ {0x201da, 0x18a}, ++ {0x41613, 0xb00}, ++ {0x41617, 0x0}, ++ {0x4163b, 0xb00}, ++ {0x4163f, 0x0}, ++ {0x41663, 0xb00}, ++ {0x41667, 0x0}, ++ {0x4168b, 0xb00}, ++ {0x4168f, 0x0}, ++ {0x41723, 0xb00}, ++ {0x41727, 0x0}, ++ {0x4174b, 0xb00}, ++ {0x4174f, 0x0}, ++ {0x417f3, 0xb00}, ++ {0x417f7, 0x0}, ++ {0x4181b, 0xb00}, ++ {0x4181f, 0x0}, ++ {0x41a2b, 0x6b00}, ++ {0x41a2f, 0x0}, ++ {0x41a53, 0x3b00}, ++ {0x41a57, 0x800}, ++ {0x41a7b, 0x6b00}, ++ {0x41a7f, 0x0}, ++ {0x41aa3, 0x3b00}, ++ {0x41aa7, 0x800}, ++ {0x41b33, 0x6b00}, ++ {0x41b37, 0x0}, ++ {0x41b5b, 0x3b00}, ++ {0x41b5f, 0x800}, ++ {0x41bfb, 0x6b00}, ++ {0x41bff, 0x0}, ++ {0x41c23, 0x3b00}, ++ {0x41c27, 0x800}, ++ {0x41008, 0xc9d8}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0xc808}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x2b00}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0xc958}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0xcf08}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x2b00}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0xc0d8}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0xd848}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x2b00}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0xc158}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0xddc8}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x2b00}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0xc1d8}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0xc308}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x2b00}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0xc558}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0xea08}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x2b00}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0xc5d8}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0xe308}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x2b00}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x48d8}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x4248}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x88d8}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x9648}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x2b00}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0xca58}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0xc108}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x2b00}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0xcb58}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0xc008}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x2b00}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0xd4d8}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0xc008}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0xc0001, 0x5061}, ++ {0xc0002, 0x7098}, ++ {0xc0003, 0x0}, ++ {0xc0000, 0xbedc}, ++ {0xc0006, 0xb0db}, ++ {0xc0007, 0x0}, ++ {0x9070c, 0x0}, ++ {0x9070d, 0x7ff}, ++ {0x9070e, 0x668}, ++ {0x9070f, 0x7910}, ++ {0x90710, 0x355e}, ++ {0x90711, 0xcbb5}, ++ {0x90713, 0xffff}, ++ {0x90714, 0x710}, ++ {0x90715, 0x7800}, ++ {0x90c10, 0xffff}, ++ {0x90c12, 0xff10}, ++ {0x90712, 0xffff}, ++ {0x90716, 0xff10}, ++ {0x90717, 0xff10}, ++ {0x90718, 0xff10}, ++ {0x90719, 0xffff}, ++ {0x9071a, 0xffff}, ++ {0x9071b, 0xfeef}, ++ {0x90c11, 0xffff}, ++ {0x90904, 0xe400}, ++ {0x90986, 0xe400}, ++ {0x90920, 0x0}, ++ {0x90921, 0x0}, ++ {0x90922, 0x0}, ++ {0x90923, 0x0}, ++ {0x90924, 0xff00}, ++ {0x90925, 0xff00}, ++ {0x90926, 0xff00}, ++ {0x90927, 0xff00}, ++ {0x90930, 0x4000}, ++ {0x90931, 0x2000}, ++ {0x90932, 0xff00}, ++ {0x90933, 0xff00}, ++ {0x9090a, 0x0}, ++ {0x9090c, 0x0}, ++ {0x9090d, 0x1}, ++ {0x200f0, 0x27f7}, ++ {0x200f1, 0x2108}, ++ {0x200f2, 0x2108}, ++ {0x100b9, 0x1}, ++ {0x100b1, 0x180}, ++ {0x100ba, 0x1}, ++ {0x100a2, 0x0}, ++ {0x100b5, 0x1}, ++ {0x110b9, 0x1}, ++ {0x110b1, 0x180}, ++ {0x110ba, 0x1}, ++ {0x110a2, 0x0}, ++ {0x110b5, 0x1}, ++ {0x120b9, 0x1}, ++ {0x120b1, 0x180}, ++ {0x120ba, 0x1}, ++ {0x120a2, 0x0}, ++ {0x120b5, 0x1}, ++ {0x130b9, 0x1}, ++ {0x130b1, 0x180}, ++ {0x130ba, 0x1}, ++ {0x130a2, 0x0}, ++ {0x130b5, 0x1}, ++ {0x70024, 0x5a3c}, ++ {0x70025, 0x5a3c}, ++ {0x70026, 0x5a3c}, ++ {0x70027, 0x5a3c}, ++ {0x70028, 0x5a3c}, ++ {0x70029, 0x5a3c}, ++ {0x7002a, 0x5a3c}, ++ {0x7002b, 0x5a3c}, ++ {0x70124, 0x5a3c}, ++ {0x70125, 0x5a3c}, ++ {0x70126, 0x5a3c}, ++ {0x70127, 0x5a3c}, ++ {0x70128, 0x5a3c}, ++ {0x70129, 0x5a3c}, ++ {0x7012a, 0x5a3c}, ++ {0x7012b, 0x5a3c}, ++ {0x70224, 0x5a3c}, ++ {0x70225, 0x5a3c}, ++ {0x70226, 0x5a3c}, ++ {0x70227, 0x5a3c}, ++ {0x70228, 0x5a3c}, ++ {0x70229, 0x5a3c}, ++ {0x7022a, 0x5a3c}, ++ {0x7022b, 0x5a3c}, ++ {0x70324, 0x5a3c}, ++ {0x70325, 0x5a3c}, ++ {0x70326, 0x5a3c}, ++ {0x70327, 0x5a3c}, ++ {0x70328, 0x5a3c}, ++ {0x70329, 0x5a3c}, ++ {0x7032a, 0x5a3c}, ++ {0x7032b, 0x5a3c}, ++ {0x70424, 0x5a3c}, ++ {0x70425, 0x5a3c}, ++ {0x70426, 0x5a3c}, ++ {0x70427, 0x5a3c}, ++ {0x70428, 0x5a3c}, ++ {0x70429, 0x5a3c}, ++ {0x7042a, 0x5a3c}, ++ {0x7042b, 0x5a3c}, ++ {0x70524, 0x5a3c}, ++ {0x70525, 0x5a3c}, ++ {0x70526, 0x5a3c}, ++ {0x70527, 0x5a3c}, ++ {0x70528, 0x5a3c}, ++ {0x70529, 0x5a3c}, ++ {0x7052a, 0x5a3c}, ++ {0x7052b, 0x5a3c}, ++ {0x70624, 0x5a3c}, ++ {0x70625, 0x5a3c}, ++ {0x70626, 0x5a3c}, ++ {0x70627, 0x5a3c}, ++ {0x70628, 0x5a3c}, ++ {0x70629, 0x5a3c}, ++ {0x7062a, 0x5a3c}, ++ {0x7062b, 0x5a3c}, ++ {0x70724, 0x5a3c}, ++ {0x70725, 0x5a3c}, ++ {0x70726, 0x5a3c}, ++ {0x70727, 0x5a3c}, ++ {0x70728, 0x5a3c}, ++ {0x70729, 0x5a3c}, ++ {0x7072a, 0x5a3c}, ++ {0x7072b, 0x5a3c}, ++ {0x70824, 0x5a3c}, ++ {0x70825, 0x5a3c}, ++ {0x70826, 0x5a3c}, ++ {0x70827, 0x5a3c}, ++ {0x70828, 0x5a3c}, ++ {0x70829, 0x5a3c}, ++ {0x7082a, 0x5a3c}, ++ {0x7082b, 0x5a3c}, ++ {0x70065, 0x1ff}, ++ {0x2007e, 0x33}, ++ {0x200ef, 0xffff}, ++ {0x90910, 0x2}, ++ {0x20310, 0x1}, ++ {0x20311, 0x1}, ++ {0xc0080, 0x2}, ++ {0xd0003, 0x0}, ++ {0x1000f, 0x1087}, ++ {0x1100f, 0x1087}, ++ {0x1200f, 0x1087}, ++ {0x1300f, 0x1087}, ++}; ++ ++static struct dram_fsp_msg ddr_dram_fsp_msg[] = { ++ { ++ /* P0 6400mbps */ ++ .drate = 6400, ++ .ssc = false, ++ .fsp_phy_cfg = ddr_phy_fsp0_cfg, ++ .fsp_phy_cfg_num = ARRAY_SIZE(ddr_phy_fsp0_cfg), ++ .fw_type = FW_1D_IMAGE, ++ .fsp_phy_msgh_cfg = ddr_phy_msgh_fsp0_cfg, ++ .fsp_phy_msgh_cfg_num = ARRAY_SIZE(ddr_phy_msgh_fsp0_cfg), ++ .fsp_phy_pie_cfg = ddr_phy_pie_fsp0_cfg, ++ .fsp_phy_pie_cfg_num = ARRAY_SIZE(ddr_phy_pie_fsp0_cfg), ++ }, ++}; ++ ++/* dram fsp cfg */ ++static struct dram_fsp_cfg ddr_dram_fsp_cfg[] = { ++ { ++ .ddrc_cfg = ddr_dram_fsp0_ddrc_cfg, ++ .ddrc_cfg_num = ARRAY_SIZE(ddr_dram_fsp0_ddrc_cfg), ++ .bypass = 0, ++ }, ++}; ++ ++/* ddr timing config params */ ++struct dram_timing_info dram_timing = { ++ .ddrc_cfg = ddr_ddrc_cfg, ++ .ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg), ++ .ddrphy_cfg = ddr_ddrphy_cfg, ++ .ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg), ++ .fsp_msg = ddr_dram_fsp_msg, ++ .fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg), ++ .ddrphy_trained_csr = ddr_ddrphy_trained_csr, ++ .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr), ++ .ddrphy_pie = ddr_phy_pie, ++ .ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie), ++ .fsp_table = { 6400, }, ++ .fsp_cfg = ddr_dram_fsp_cfg, ++ .fsp_cfg_num = ARRAY_SIZE(ddr_dram_fsp_cfg), ++}; +diff --git a/boards/ccimx95/pin_mux.c b/boards/ccimx95/pin_mux.c +new file mode 100644 +index 000000000000..a8c15513b578 +--- /dev/null ++++ b/boards/ccimx95/pin_mux.c +@@ -0,0 +1,33 @@ ++/* ++ * Copyright 2023-2024 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#include "pin_mux.h" ++#include "board.h" ++ ++/* FUNCTION ************************************************************************************************************ ++ * ++ * Function Name : BOARD_InitPins ++ * Description : Configures pin routing and optionally pin electrical features. ++ * ++ * END ****************************************************************************************************************/ ++void BOARD_InitPins(void) ++{ ++#if (BOARD_DEBUG_UART_INSTANCE == 1U) ++ /* Configure LPUART 1 */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_UART1_RXD__LPUART1_RX, 0U); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_UART1_RXD__LPUART1_RX, IOMUXC_PAD_PD(1U)); ++ ++ IOMUXC_SetPinMux(IOMUXC_PAD_UART1_TXD__LPUART1_TX, 0); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_UART1_TXD__LPUART1_TX, IOMUXC_PAD_DSE(0xFU)); ++#elif (BOARD_DEBUG_UART_INSTANCE == 2U) ++ /* Configure LPUART 2 */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_UART2_RXD__LPUART2_RX, 0); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_UART2_RXD__LPUART2_RX, IOMUXC_PAD_PD(1U)); ++ ++ IOMUXC_SetPinMux(IOMUXC_PAD_UART2_TXD__LPUART2_TX, 0); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_UART2_TXD__LPUART2_TX, IOMUXC_PAD_DSE(0xFU)); ++#endif ++} +diff --git a/boards/ccimx95/pin_mux.h b/boards/ccimx95/pin_mux.h +new file mode 100644 +index 000000000000..24cd7920d220 +--- /dev/null ++++ b/boards/ccimx95/pin_mux.h +@@ -0,0 +1,44 @@ ++/* ++ * Copyright 2023 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#ifndef PIN_MUX_H ++#define PIN_MUX_H ++ ++#include "fsl_iomuxc.h" ++ ++/*********************************************************************************************************************** ++ * Definitions ++ **********************************************************************************************************************/ ++ ++/*! ++ * @addtogroup BRD_SM_MX95EVK ++ * @file ++ * @{ ++ */ ++ ++/*********************************************************************************************************************** ++ * API ++ **********************************************************************************************************************/ ++ ++#if defined(__cplusplus) ++extern "C" { ++#endif ++ ++/*! ++ * @brief Configures pin routing and optionally pin electrical features. ++ * ++ */ ++void BOARD_InitPins(void); /*!< Function assigned for the core: Cortex-M33[cm33] */ ++ ++#if defined(__cplusplus) ++} ++#endif ++ ++/*! ++ * @} ++ */ ++#endif /* PIN_MUX_H */ ++ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0002-ddr-add-DDR-configuration-file-for-ccimx95.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0002-ddr-add-DDR-configuration-file-for-ccimx95.patch new file mode 100644 index 000000000..ffeaa80cb --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0002-ddr-add-DDR-configuration-file-for-ccimx95.patch @@ -0,0 +1,21814 @@ +From: Javier Viguera +Date: Mon, 15 Sep 2025 11:38:35 +0200 +Subject: [PATCH] ddr: add DDR configuration file for ccimx95 + +Also: +* manually disable ssc following the example configurations on the + NXP's EVK. +* delete configurations for NXP's EVK. + +Memory: MT62F2G32D4DS-023 AIT:B + +Using NXP Config Tools for i.MX version 25.03 + +*** About Config Tools for i.MX: +Version and Build id: 202503251451 +Installed tools: +Pins (17.0) +Clocks (16.0) +Peripherals (15.0) +TEE (9.0) +DDR (1.0) +SERDES (1.0) + +Data server: https://mcuxpresso.nxp.com + +Locally installed data: +C:\ProgramData\NXP\mcu_data_25.03 +Processors: +MIMX8MM6xxxKZ (25.03.10) - i.MX 8M Mini Quad +MIMX8MM6xxxLZ (25.03.10) - i.MX 8M Mini Quad +MIMX9596xxxxN (25.03.10) - i.MX 95 + +NOTICE: NEWER VERSIONS OF THE TOOL GENERATE CONFIGURATION FOR B0 SILICON + +A basic white space processing has been done on the file: + +fromdos lpddr5_timing_a1.c +sed -i -e '/^};$/{G;}' lpddr5_timing_a1.c +sed -i -e '/^$/N;/^\n$/D' lpddr5_timing_a1.c +sed -i -e '${/^[[:space:]]*$/d;}' lpddr5_timing_a1.c + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Javier Viguera +--- + ...X19_6400MTS_FW2024.09_ECC_enabled_timing.c | 10757 ---------------- + boards/ccimx95/ddr/Makefile | 2 +- + ...XIMX95LPD5EVK19_6400mbps_train_timing_a1.c | 10754 --------------- + ..._FW2024.09_timing.c => lpddr5_timing_a1.c} | 95 +- + 4 files changed, 47 insertions(+), 21561 deletions(-) + delete mode 100644 boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_ECC_enabled_timing.c + delete mode 100644 boards/ccimx95/ddr/XIMX95LPD5EVK19_6400mbps_train_timing_a1.c + rename boards/ccimx95/ddr/{MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_timing.c => lpddr5_timing_a1.c} (99%) + +diff --git a/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_ECC_enabled_timing.c b/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_ECC_enabled_timing.c +deleted file mode 100644 +index 99b2ec568cb8..000000000000 +--- a/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_ECC_enabled_timing.c ++++ /dev/null +@@ -1,10757 +0,0 @@ +-/* +- * Copyright 2025 NXP +- * +- * SPDX-License-Identifier: BSD-3-Clause +- * +- * Code generated with DDR Tool v3.7.0_0.2-4600df02. +- * DDR PHY FW2024.09 +- * Chip revision: B0 +- */ +- +-#include "ddr.h" +- +-/* Initialize DDRC registers */ +-static struct ddrc_cfg_param ddr_ddrc_cfg[] = { +- {0x5e080110, 0x41114001U}, +- {0x5e080000, 0x37fU}, +- {0x5e080008, 0x0U}, +- {0x5e080010, 0x3U}, +- {0x5e080014, 0x80000U}, +- {0x5e080020, 0x80000000U}, +- {0x5e080024, 0x8000fffU}, +- {0x5e080028, 0x80000000U}, +- {0x5e08002c, 0x7ffU}, +- {0x5e080080, 0x80800522U}, +- {0x5e080084, 0x80800522U}, +- {0x5e080114, 0x201000U}, +- {0x5e080260, 0x800a1U}, +- {0x5e080268, 0x0U}, +- {0x5e08026c, 0x3d04U}, +- {0x5e080278, 0x10U}, +- {0x5e080800, 0x43d3bd80U}, +- {0x5e080804, 0x1f1f1f1fU}, +- {0x5e080810, 0x14084060U}, +- {0x5e080c00, 0x40000000U}, +- {0x5e081000, 0xc00000e3U}, +- {0x5e080d00, 0x81000200U}, +- {0x5e080d60, 0x0U}, +- {0x5e080d64, 0x80000000U}, +- {0x5e080d68, 0x3U}, +- {0x5e080d6c, 0xffffffffU}, +- {0x5e081220, 0x0U}, +- {0x5e081224, 0x0U}, +- {0x5e081228, 0x0U}, +- {0x5e08122c, 0x0U}, +- {0x5e081230, 0x0U}, +- {0x5e081234, 0x0U}, +- {0x5e081238, 0x0U}, +- {0x5e08123c, 0x0U}, +- {0x5e081240, 0x0U}, +- {0x5e081244, 0x0U}, +- {0x5e081248, 0x0U}, +- {0x5e08124c, 0x0U}, +- {0x5e081250, 0x0U}, +- {0x5e081254, 0x0U}, +- {0x5e081258, 0x0U}, +- {0x5e08125c, 0x0U}, +-}; +- +-/* DRAM fsp configurations */ +-static struct ddrc_cfg_param ddr_dram_fsp0_ddrc_cfg[] = { +- {0x5e080100, 0x020D2100U}, +- {0x5e080104, 0x4866000CU}, +- {0x5e080108, 0xF2F28D47U}, +- {0x5e08010C, 0x20488010U}, +- {0x5e080124, 0x0C230000U}, +- {0x5e080160, 0x00000101U}, +- {0x5e08016C, 0x01300000U}, +- {0x5e080170, 0x8C010509U}, +- {0x5e080250, 0x00110C11U}, +- {0x5e080254, 0x00680040U}, +- {0x5e080258, 0x03003E80U}, +- {0x5e08025C, 0x40520200U}, +- {0x5e080300, 0x08110809U}, +- {0x5e080304, 0x00680F02U}, +- {0x5e080308, 0x06040603U}, +- {0x5e08030C, 0x0030001CU}, +- {0x5e080310, 0x20610000U}, +- {0x5e080314, 0x0A0A0407U}, +-}; +- +-/* PHY Initialize Configuration */ +-static struct ddrphy_cfg_param ddr_ddrphy_cfg[] = { +- {0x10080, 0x7}, +- {0x10081, 0x5}, +- {0x10082, 0x6}, +- {0x10083, 0x1}, +- {0x10084, 0x2}, +- {0x10085, 0x0}, +- {0x10086, 0x3}, +- {0x10087, 0x4}, +- {0x11080, 0x0}, +- {0x11081, 0x1}, +- {0x11082, 0x2}, +- {0x11083, 0x3}, +- {0x11084, 0x4}, +- {0x11085, 0x7}, +- {0x11086, 0x6}, +- {0x11087, 0x5}, +- {0x12080, 0x5}, +- {0x12081, 0x6}, +- {0x12082, 0x1}, +- {0x12083, 0x7}, +- {0x12084, 0x4}, +- {0x12085, 0x2}, +- {0x12086, 0x0}, +- {0x12087, 0x3}, +- {0x13080, 0x0}, +- {0x13081, 0x3}, +- {0x13082, 0x2}, +- {0x13083, 0x7}, +- {0x13084, 0x4}, +- {0x13085, 0x5}, +- {0x13086, 0x6}, +- {0x13087, 0x1}, +- {0x30090, 0x4}, +- {0x30091, 0x3}, +- {0x30092, 0x6}, +- {0x30093, 0x0}, +- {0x30094, 0x5}, +- {0x30095, 0x1}, +- {0x30096, 0x2}, +- {0x31090, 0x1}, +- {0x31091, 0x3}, +- {0x31092, 0x4}, +- {0x31093, 0x6}, +- {0x31094, 0x2}, +- {0x31095, 0x0}, +- {0x31096, 0x5}, +- {0x20060, 0x2}, +- {0x200a5, 0x1}, +- {0xd0036, 0x0}, +- {0x200bd, 0xff}, +- {0x20300, 0x808}, +- {0x20303, 0x9}, +- {0x20302, 0x26}, +- {0x20328, 0x0}, +- {0x20301, 0x3}, +- {0x2030b, 0x0}, +- {0x300a7, 0x0}, +- {0x310a7, 0x0}, +- {0x300ae, 0x80}, +- {0x300ad, 0x80}, +- {0x300ac, 0x80}, +- {0x310ae, 0x80}, +- {0x310ad, 0x80}, +- {0x310ac, 0x80}, +- {0xc0086, 0x0}, +- {0x100a3, 0xb33}, +- {0x110a3, 0xb33}, +- {0x120a3, 0xb33}, +- {0x130a3, 0xb33}, +- {0xc00f1, 0x6000}, +- {0xc00f2, 0xa9}, +- {0xc00f3, 0x8000}, +- {0xc00f4, 0x5}, +- {0xc00f5, 0x4000}, +- {0xc00f6, 0x2}, +- {0xc00f7, 0xf000}, +- {0xc00f9, 0x6000}, +- {0xc00fa, 0xa9}, +- {0xc00fb, 0x8000}, +- {0xc00fd, 0x4000}, +- {0xc00ff, 0xf000}, +- {0x908ff, 0xf}, +- {0x10093, 0x0}, +- {0x11093, 0x0}, +- {0x12093, 0x0}, +- {0x13093, 0x0}, +- {0x20051, 0x3}, +-}; +- +-/* PHY trained csr */ +-static struct ddrphy_cfg_param ddr_ddrphy_trained_csr[] = { +- {0x200a5, 0x0}, +- {0xd0036, 0x0}, +- {0x200bd, 0x0}, +- {0x20300, 0x0}, +- {0x20303, 0x0}, +- {0x20302, 0x0}, +- {0x20328, 0x0}, +- {0x20301, 0x0}, +- {0x2030b, 0x0}, +- {0x300a7, 0x0}, +- {0x310a7, 0x0}, +- {0x300ae, 0x0}, +- {0x300ad, 0x0}, +- {0x300ac, 0x0}, +- {0x310ae, 0x0}, +- {0x310ad, 0x0}, +- {0x310ac, 0x0}, +- {0xc0086, 0x0}, +- {0x100a3, 0x0}, +- {0x110a3, 0x0}, +- {0x120a3, 0x0}, +- {0x130a3, 0x0}, +- {0xc00f1, 0x0}, +- {0xc00f2, 0x0}, +- {0xc00f3, 0x0}, +- {0xc00f4, 0x0}, +- {0xc00f5, 0x0}, +- {0xc00f6, 0x0}, +- {0xc00f7, 0x0}, +- {0xc00f9, 0x0}, +- {0xc00fa, 0x0}, +- {0xc00fb, 0x0}, +- {0xc00fd, 0x0}, +- {0xc00ff, 0x0}, +- {0x908ff, 0x0}, +- {0x10093, 0x0}, +- {0x11093, 0x0}, +- {0x12093, 0x0}, +- {0x13093, 0x0}, +- {0x20051, 0x0}, +- {0x90802, 0x0}, +- {0x20002, 0x0}, +- {0x20000, 0x0}, +- {0x90801, 0x0}, +- {0x90809, 0x0}, +- {0x1005e, 0x0}, +- {0x10060, 0x0}, +- {0x10062, 0x0}, +- {0x10064, 0x0}, +- {0x1005f, 0x0}, +- {0x10061, 0x0}, +- {0x10063, 0x0}, +- {0x10065, 0x0}, +- {0x1105e, 0x0}, +- {0x11060, 0x0}, +- {0x11062, 0x0}, +- {0x11064, 0x0}, +- {0x1105f, 0x0}, +- {0x11061, 0x0}, +- {0x11063, 0x0}, +- {0x11065, 0x0}, +- {0x1205e, 0x0}, +- {0x12060, 0x0}, +- {0x12062, 0x0}, +- {0x12064, 0x0}, +- {0x1205f, 0x0}, +- {0x12061, 0x0}, +- {0x12063, 0x0}, +- {0x12065, 0x0}, +- {0x1305e, 0x0}, +- {0x13060, 0x0}, +- {0x13062, 0x0}, +- {0x13064, 0x0}, +- {0x1305f, 0x0}, +- {0x13061, 0x0}, +- {0x13063, 0x0}, +- {0x13065, 0x0}, +- {0x10005, 0x0}, +- {0x1000b, 0x0}, +- {0x11005, 0x0}, +- {0x1100b, 0x0}, +- {0x12005, 0x0}, +- {0x1200b, 0x0}, +- {0x13005, 0x0}, +- {0x1300b, 0x0}, +- {0x20007, 0x0}, +- {0x20013, 0x0}, +- {0x30038, 0x0}, +- {0x30039, 0x0}, +- {0x3003a, 0x0}, +- {0x31038, 0x0}, +- {0x31039, 0x0}, +- {0x3103a, 0x0}, +- {0x10038, 0x0}, +- {0x1003a, 0x0}, +- {0x11038, 0x0}, +- {0x1103a, 0x0}, +- {0x12038, 0x0}, +- {0x1203a, 0x0}, +- {0x13038, 0x0}, +- {0x1303a, 0x0}, +- {0x1003b, 0x0}, +- {0x1103b, 0x0}, +- {0x1203b, 0x0}, +- {0x1303b, 0x0}, +- {0x10009, 0x0}, +- {0x10037, 0x0}, +- {0x11009, 0x0}, +- {0x11037, 0x0}, +- {0x12009, 0x0}, +- {0x12037, 0x0}, +- {0x13009, 0x0}, +- {0x13037, 0x0}, +- {0x10004, 0x0}, +- {0x10003, 0x0}, +- {0x11004, 0x0}, +- {0x11003, 0x0}, +- {0x12004, 0x0}, +- {0x12003, 0x0}, +- {0x13004, 0x0}, +- {0x13003, 0x0}, +- {0x20004, 0x0}, +- {0x30050, 0x0}, +- {0x30051, 0x0}, +- {0x30052, 0x0}, +- {0x30053, 0x0}, +- {0x31050, 0x0}, +- {0x31051, 0x0}, +- {0x31052, 0x0}, +- {0x31053, 0x0}, +- {0x1004e, 0x0}, +- {0x1004f, 0x0}, +- {0x10050, 0x0}, +- {0x10051, 0x0}, +- {0x1014e, 0x0}, +- {0x1014f, 0x0}, +- {0x10150, 0x0}, +- {0x10151, 0x0}, +- {0x1024e, 0x0}, +- {0x1024f, 0x0}, +- {0x10250, 0x0}, +- {0x10251, 0x0}, +- {0x1034e, 0x0}, +- {0x1034f, 0x0}, +- {0x10350, 0x0}, +- {0x10351, 0x0}, +- {0x1044e, 0x0}, +- {0x1044f, 0x0}, +- {0x10450, 0x0}, +- {0x10451, 0x0}, +- {0x1054e, 0x0}, +- {0x1054f, 0x0}, +- {0x10550, 0x0}, +- {0x10551, 0x0}, +- {0x1064e, 0x0}, +- {0x1064f, 0x0}, +- {0x10650, 0x0}, +- {0x10651, 0x0}, +- {0x1074e, 0x0}, +- {0x1074f, 0x0}, +- {0x10750, 0x0}, +- {0x10751, 0x0}, +- {0x1084e, 0x0}, +- {0x1084f, 0x0}, +- {0x10850, 0x0}, +- {0x10851, 0x0}, +- {0x1104e, 0x0}, +- {0x1104f, 0x0}, +- {0x11050, 0x0}, +- {0x11051, 0x0}, +- {0x1114e, 0x0}, +- {0x1114f, 0x0}, +- {0x11150, 0x0}, +- {0x11151, 0x0}, +- {0x1124e, 0x0}, +- {0x1124f, 0x0}, +- {0x11250, 0x0}, +- {0x11251, 0x0}, +- {0x1134e, 0x0}, +- {0x1134f, 0x0}, +- {0x11350, 0x0}, +- {0x11351, 0x0}, +- {0x1144e, 0x0}, +- {0x1144f, 0x0}, +- {0x11450, 0x0}, +- {0x11451, 0x0}, +- {0x1154e, 0x0}, +- {0x1154f, 0x0}, +- {0x11550, 0x0}, +- {0x11551, 0x0}, +- {0x1164e, 0x0}, +- {0x1164f, 0x0}, +- {0x11650, 0x0}, +- {0x11651, 0x0}, +- {0x1174e, 0x0}, +- {0x1174f, 0x0}, +- {0x11750, 0x0}, +- {0x11751, 0x0}, +- {0x1184e, 0x0}, +- {0x1184f, 0x0}, +- {0x11850, 0x0}, +- {0x11851, 0x0}, +- {0x1204e, 0x0}, +- {0x1204f, 0x0}, +- {0x12050, 0x0}, +- {0x12051, 0x0}, +- {0x1214e, 0x0}, +- {0x1214f, 0x0}, +- {0x12150, 0x0}, +- {0x12151, 0x0}, +- {0x1224e, 0x0}, +- {0x1224f, 0x0}, +- {0x12250, 0x0}, +- {0x12251, 0x0}, +- {0x1234e, 0x0}, +- {0x1234f, 0x0}, +- {0x12350, 0x0}, +- {0x12351, 0x0}, +- {0x1244e, 0x0}, +- {0x1244f, 0x0}, +- {0x12450, 0x0}, +- {0x12451, 0x0}, +- {0x1254e, 0x0}, +- {0x1254f, 0x0}, +- {0x12550, 0x0}, +- {0x12551, 0x0}, +- {0x1264e, 0x0}, +- {0x1264f, 0x0}, +- {0x12650, 0x0}, +- {0x12651, 0x0}, +- {0x1274e, 0x0}, +- {0x1274f, 0x0}, +- {0x12750, 0x0}, +- {0x12751, 0x0}, +- {0x1284e, 0x0}, +- {0x1284f, 0x0}, +- {0x12850, 0x0}, +- {0x12851, 0x0}, +- {0x1304e, 0x0}, +- {0x1304f, 0x0}, +- {0x13050, 0x0}, +- {0x13051, 0x0}, +- {0x1314e, 0x0}, +- {0x1314f, 0x0}, +- {0x13150, 0x0}, +- {0x13151, 0x0}, +- {0x1324e, 0x0}, +- {0x1324f, 0x0}, +- {0x13250, 0x0}, +- {0x13251, 0x0}, +- {0x1334e, 0x0}, +- {0x1334f, 0x0}, +- {0x13350, 0x0}, +- {0x13351, 0x0}, +- {0x1344e, 0x0}, +- {0x1344f, 0x0}, +- {0x13450, 0x0}, +- {0x13451, 0x0}, +- {0x1354e, 0x0}, +- {0x1354f, 0x0}, +- {0x13550, 0x0}, +- {0x13551, 0x0}, +- {0x1364e, 0x0}, +- {0x1364f, 0x0}, +- {0x13650, 0x0}, +- {0x13651, 0x0}, +- {0x1374e, 0x0}, +- {0x1374f, 0x0}, +- {0x13750, 0x0}, +- {0x13751, 0x0}, +- {0x1384e, 0x0}, +- {0x1384f, 0x0}, +- {0x13850, 0x0}, +- {0x13851, 0x0}, +- {0x30030, 0x0}, +- {0x30031, 0x0}, +- {0x30035, 0x0}, +- {0x31030, 0x0}, +- {0x31031, 0x0}, +- {0x31035, 0x0}, +- {0x10030, 0x0}, +- {0x10035, 0x0}, +- {0x10036, 0x0}, +- {0x11030, 0x0}, +- {0x11035, 0x0}, +- {0x11036, 0x0}, +- {0x12030, 0x0}, +- {0x12035, 0x0}, +- {0x12036, 0x0}, +- {0x13030, 0x0}, +- {0x13035, 0x0}, +- {0x13036, 0x0}, +- {0x3003c, 0x0}, +- {0x3103c, 0x0}, +- {0x1003c, 0x0}, +- {0x1003d, 0x0}, +- {0x1003e, 0x0}, +- {0x1103c, 0x0}, +- {0x1103d, 0x0}, +- {0x1103e, 0x0}, +- {0x1203c, 0x0}, +- {0x1203d, 0x0}, +- {0x1203e, 0x0}, +- {0x1303c, 0x0}, +- {0x1303d, 0x0}, +- {0x1303e, 0x0}, +- {0x20003, 0x0}, +- {0x10006, 0x0}, +- {0x11006, 0x0}, +- {0x12006, 0x0}, +- {0x13006, 0x0}, +- {0x20001, 0x0}, +- {0x20009, 0x0}, +- {0x20008, 0x0}, +- {0x200d9, 0x0}, +- {0x30eef, 0x0}, +- {0x31eef, 0x0}, +- {0x20014, 0x0}, +- {0x9080a, 0x0}, +- {0x10040, 0x0}, +- {0x10042, 0x0}, +- {0x9080d, 0x0}, +- {0x10043, 0x0}, +- {0x10044, 0x0}, +- {0x10045, 0x0}, +- {0x11040, 0x0}, +- {0x11042, 0x0}, +- {0x11043, 0x0}, +- {0x11044, 0x0}, +- {0x11045, 0x0}, +- {0x12040, 0x0}, +- {0x12042, 0x0}, +- {0x12043, 0x0}, +- {0x12044, 0x0}, +- {0x12045, 0x0}, +- {0x13040, 0x0}, +- {0x13042, 0x0}, +- {0x13043, 0x0}, +- {0x13044, 0x0}, +- {0x13045, 0x0}, +- {0x30040, 0x0}, +- {0x30041, 0x0}, +- {0x30042, 0x0}, +- {0x30043, 0x0}, +- {0x30330, 0x0}, +- {0x31040, 0x0}, +- {0x31041, 0x0}, +- {0x31042, 0x0}, +- {0x31043, 0x0}, +- {0x31330, 0x0}, +- {0x20331, 0x0}, +- {0x10048, 0x0}, +- {0x1004a, 0x0}, +- {0x1004b, 0x0}, +- {0x1004c, 0x0}, +- {0x1004d, 0x0}, +- {0x11048, 0x0}, +- {0x1104a, 0x0}, +- {0x1104b, 0x0}, +- {0x1104c, 0x0}, +- {0x1104d, 0x0}, +- {0x12048, 0x0}, +- {0x1204a, 0x0}, +- {0x1204b, 0x0}, +- {0x1204c, 0x0}, +- {0x1204d, 0x0}, +- {0x13048, 0x0}, +- {0x1304a, 0x0}, +- {0x1304b, 0x0}, +- {0x1304c, 0x0}, +- {0x1304d, 0x0}, +- {0x30048, 0x0}, +- {0x30049, 0x0}, +- {0x3004a, 0x0}, +- {0x3004b, 0x0}, +- {0x31048, 0x0}, +- {0x31049, 0x0}, +- {0x3104a, 0x0}, +- {0x3104b, 0x0}, +- {0x30033, 0x0}, +- {0x30034, 0x0}, +- {0x3002e, 0x0}, +- {0x31033, 0x0}, +- {0x31034, 0x0}, +- {0x3102e, 0x0}, +- {0x10033, 0x0}, +- {0x1002e, 0x0}, +- {0x1002f, 0x0}, +- {0x11033, 0x0}, +- {0x1102e, 0x0}, +- {0x1102f, 0x0}, +- {0x12033, 0x0}, +- {0x1202e, 0x0}, +- {0x1202f, 0x0}, +- {0x13033, 0x0}, +- {0x1302e, 0x0}, +- {0x1302f, 0x0}, +- {0x90806, 0x0}, +- {0x100e8, 0x0}, +- {0x100e9, 0x0}, +- {0x110e8, 0x0}, +- {0x110e9, 0x0}, +- {0x120e8, 0x0}, +- {0x120e9, 0x0}, +- {0x130e8, 0x0}, +- {0x130e9, 0x0}, +- {0x10001, 0x0}, +- {0x11001, 0x0}, +- {0x12001, 0x0}, +- {0x13001, 0x0}, +- {0x20012, 0x0}, +- {0x20017, 0x0}, +- {0x2000a, 0x0}, +- {0x20186, 0x0}, +- {0x20187, 0x0}, +- {0x20010, 0x0}, +- {0x20011, 0x0}, +- {0x9080b, 0x0}, +- {0x9080c, 0x0}, +- {0x100a5, 0x0}, +- {0x110a5, 0x0}, +- {0x120a5, 0x0}, +- {0x130a5, 0x0}, +- {0x10014, 0x0}, +- {0x11014, 0x0}, +- {0x12014, 0x0}, +- {0x13014, 0x0}, +- {0x20035, 0x0}, +- {0x20036, 0x0}, +- {0x20037, 0x0}, +- {0x20038, 0x0}, +- {0x20039, 0x0}, +- {0x2003a, 0x0}, +- {0x2003b, 0x0}, +- {0x2003c, 0x0}, +- {0x2003d, 0x0}, +- {0x2003e, 0x0}, +- {0x2003f, 0x0}, +- {0x20040, 0x0}, +- {0x2002c, 0x0}, +- {0x2002d, 0x0}, +- {0x20030, 0x0}, +- {0x2002e, 0x0}, +- {0x2002f, 0x0}, +- {0x2000c, 0x0}, +- {0x2001b, 0x0}, +- {0x10007, 0x0}, +- {0x11007, 0x0}, +- {0x12007, 0x0}, +- {0x13007, 0x0}, +- {0x908f0, 0x0}, +- {0x908f1, 0x0}, +- {0x908f2, 0x0}, +- {0x908f3, 0x0}, +- {0x908f4, 0x0}, +- {0x908f5, 0x0}, +- {0x908f6, 0x0}, +- {0x908f7, 0x0}, +- {0x41008, 0x0}, +- {0x41009, 0x0}, +- {0x4100a, 0x0}, +- {0x4100b, 0x0}, +- {0x4100c, 0x0}, +- {0x4100d, 0x0}, +- {0x4100e, 0x0}, +- {0x4100f, 0x0}, +- {0x41010, 0x0}, +- {0x41011, 0x0}, +- {0x41012, 0x0}, +- {0x41013, 0x0}, +- {0x41014, 0x0}, +- {0x41015, 0x0}, +- {0x41016, 0x0}, +- {0x41017, 0x0}, +- {0x41018, 0x0}, +- {0x41019, 0x0}, +- {0x4101a, 0x0}, +- {0x4101b, 0x0}, +- {0x4101c, 0x0}, +- {0x4101d, 0x0}, +- {0x4101e, 0x0}, +- {0x4101f, 0x0}, +- {0x41020, 0x0}, +- {0x41021, 0x0}, +- {0x41022, 0x0}, +- {0x41023, 0x0}, +- {0x41024, 0x0}, +- {0x41025, 0x0}, +- {0x41026, 0x0}, +- {0x41027, 0x0}, +- {0x41028, 0x0}, +- {0x41029, 0x0}, +- {0x4102a, 0x0}, +- {0x4102b, 0x0}, +- {0x4102c, 0x0}, +- {0x4102d, 0x0}, +- {0x4102e, 0x0}, +- {0x4102f, 0x0}, +- {0x41030, 0x0}, +- {0x41031, 0x0}, +- {0x41032, 0x0}, +- {0x41033, 0x0}, +- {0x41034, 0x0}, +- {0x41035, 0x0}, +- {0x41036, 0x0}, +- {0x41037, 0x0}, +- {0x41038, 0x0}, +- {0x41039, 0x0}, +- {0x4103a, 0x0}, +- {0x4103b, 0x0}, +- {0x4103c, 0x0}, +- {0x4103d, 0x0}, +- {0x4103e, 0x0}, +- {0x4103f, 0x0}, +- {0x41040, 0x0}, +- {0x41041, 0x0}, +- {0x41042, 0x0}, +- {0x41043, 0x0}, +- {0x41044, 0x0}, +- {0x41045, 0x0}, +- {0x41046, 0x0}, +- {0x41047, 0x0}, +- {0x41048, 0x0}, +- {0x41049, 0x0}, +- {0x4104a, 0x0}, +- {0x4104b, 0x0}, +- {0x4104c, 0x0}, +- {0x4104d, 0x0}, +- {0x4104e, 0x0}, +- {0x4104f, 0x0}, +- {0x41050, 0x0}, +- {0x41051, 0x0}, +- {0x41052, 0x0}, +- {0x41053, 0x0}, +- {0x41054, 0x0}, +- {0x41055, 0x0}, +- {0x41056, 0x0}, +- {0x41057, 0x0}, +- {0x41058, 0x0}, +- {0x41059, 0x0}, +- {0x4105a, 0x0}, +- {0x4105b, 0x0}, +- {0x4105c, 0x0}, +- {0x4105d, 0x0}, +- {0x4105e, 0x0}, +- {0x4105f, 0x0}, +- {0x41060, 0x0}, +- {0x41061, 0x0}, +- {0x41062, 0x0}, +- {0x41063, 0x0}, +- {0x41064, 0x0}, +- {0x41065, 0x0}, +- {0x41066, 0x0}, +- {0x41067, 0x0}, +- {0x41068, 0x0}, +- {0x41069, 0x0}, +- {0x4106a, 0x0}, +- {0x4106b, 0x0}, +- {0x4106c, 0x0}, +- {0x4106d, 0x0}, +- {0x4106e, 0x0}, +- {0x4106f, 0x0}, +- {0x41070, 0x0}, +- {0x41071, 0x0}, +- {0x41072, 0x0}, +- {0x41073, 0x0}, +- {0x41074, 0x0}, +- {0x41075, 0x0}, +- {0x41076, 0x0}, +- {0x41077, 0x0}, +- {0x41078, 0x0}, +- {0x41079, 0x0}, +- {0x4107a, 0x0}, +- {0x4107b, 0x0}, +- {0x4107c, 0x0}, +- {0x4107d, 0x0}, +- {0x4107e, 0x0}, +- {0x4107f, 0x0}, +- {0x41080, 0x0}, +- {0x41081, 0x0}, +- {0x41082, 0x0}, +- {0x41083, 0x0}, +- {0x41084, 0x0}, +- {0x41085, 0x0}, +- {0x41086, 0x0}, +- {0x41087, 0x0}, +- {0x41088, 0x0}, +- {0x41089, 0x0}, +- {0x4108a, 0x0}, +- {0x4108b, 0x0}, +- {0x4108c, 0x0}, +- {0x4108d, 0x0}, +- {0x4108e, 0x0}, +- {0x4108f, 0x0}, +- {0x41090, 0x0}, +- {0x41091, 0x0}, +- {0x41092, 0x0}, +- {0x41093, 0x0}, +- {0x41094, 0x0}, +- {0x41095, 0x0}, +- {0x41096, 0x0}, +- {0x41097, 0x0}, +- {0x41098, 0x0}, +- {0x41099, 0x0}, +- {0x4109a, 0x0}, +- {0x4109b, 0x0}, +- {0x4109c, 0x0}, +- {0x4109d, 0x0}, +- {0x4109e, 0x0}, +- {0x4109f, 0x0}, +- {0x410a0, 0x0}, +- {0x410a1, 0x0}, +- {0x410a2, 0x0}, +- {0x410a3, 0x0}, +- {0x410a4, 0x0}, +- {0x410a5, 0x0}, +- {0x410a6, 0x0}, +- {0x410a7, 0x0}, +- {0x410a8, 0x0}, +- {0x410a9, 0x0}, +- {0x410aa, 0x0}, +- {0x410ab, 0x0}, +- {0x410ac, 0x0}, +- {0x410ad, 0x0}, +- {0x410ae, 0x0}, +- {0x410af, 0x0}, +- {0x410b0, 0x0}, +- {0x410b1, 0x0}, +- {0x410b2, 0x0}, +- {0x410b3, 0x0}, +- {0x410b4, 0x0}, +- {0x410b5, 0x0}, +- {0x410b6, 0x0}, +- {0x410b7, 0x0}, +- {0x410b8, 0x0}, +- {0x410b9, 0x0}, +- {0x410ba, 0x0}, +- {0x410bb, 0x0}, +- {0x410bc, 0x0}, +- {0x410bd, 0x0}, +- {0x410be, 0x0}, +- {0x410bf, 0x0}, +- {0x410c0, 0x0}, +- {0x410c1, 0x0}, +- {0x410c2, 0x0}, +- {0x410c3, 0x0}, +- {0x410c4, 0x0}, +- {0x410c5, 0x0}, +- {0x410c6, 0x0}, +- {0x410c7, 0x0}, +- {0x410c8, 0x0}, +- {0x410c9, 0x0}, +- {0x410ca, 0x0}, +- {0x410cb, 0x0}, +- {0x410cc, 0x0}, +- {0x410cd, 0x0}, +- {0x410ce, 0x0}, +- {0x410cf, 0x0}, +- {0x410d0, 0x0}, +- {0x410d1, 0x0}, +- {0x410d2, 0x0}, +- {0x410d3, 0x0}, +- {0x410d4, 0x0}, +- {0x410d5, 0x0}, +- {0x410d6, 0x0}, +- {0x410d7, 0x0}, +- {0x410d8, 0x0}, +- {0x410d9, 0x0}, +- {0x410da, 0x0}, +- {0x410db, 0x0}, +- {0x410dc, 0x0}, +- {0x410dd, 0x0}, +- {0x410de, 0x0}, +- {0x410df, 0x0}, +- {0x410e0, 0x0}, +- {0x410e1, 0x0}, +- {0x410e2, 0x0}, +- {0x410e3, 0x0}, +- {0x410e4, 0x0}, +- {0x410e5, 0x0}, +- {0x410e6, 0x0}, +- {0x410e7, 0x0}, +- {0x410e8, 0x0}, +- {0x410e9, 0x0}, +- {0x410ea, 0x0}, +- {0x410eb, 0x0}, +- {0x410ec, 0x0}, +- {0x410ed, 0x0}, +- {0x410ee, 0x0}, +- {0x410ef, 0x0}, +- {0x410f0, 0x0}, +- {0x410f1, 0x0}, +- {0x410f2, 0x0}, +- {0x410f3, 0x0}, +- {0x410f4, 0x0}, +- {0x410f5, 0x0}, +- {0x410f6, 0x0}, +- {0x410f7, 0x0}, +- {0x410f8, 0x0}, +- {0x410f9, 0x0}, +- {0x410fa, 0x0}, +- {0x410fb, 0x0}, +- {0x410fc, 0x0}, +- {0x410fd, 0x0}, +- {0x410fe, 0x0}, +- {0x410ff, 0x0}, +- {0x41100, 0x0}, +- {0x41101, 0x0}, +- {0x41102, 0x0}, +- {0x41103, 0x0}, +- {0x41104, 0x0}, +- {0x41105, 0x0}, +- {0x41106, 0x0}, +- {0x41107, 0x0}, +- {0x41108, 0x0}, +- {0x41109, 0x0}, +- {0x4110a, 0x0}, +- {0x4110b, 0x0}, +- {0x4110c, 0x0}, +- {0x4110d, 0x0}, +- {0x4110e, 0x0}, +- {0x4110f, 0x0}, +- {0x41110, 0x0}, +- {0x41111, 0x0}, +- {0x41112, 0x0}, +- {0x41113, 0x0}, +- {0x41114, 0x0}, +- {0x41115, 0x0}, +- {0x41116, 0x0}, +- {0x41117, 0x0}, +- {0x41118, 0x0}, +- {0x41119, 0x0}, +- {0x4111a, 0x0}, +- {0x4111b, 0x0}, +- {0x4111c, 0x0}, +- {0x4111d, 0x0}, +- {0x4111e, 0x0}, +- {0x4111f, 0x0}, +- {0x41120, 0x0}, +- {0x41121, 0x0}, +- {0x41122, 0x0}, +- {0x41123, 0x0}, +- {0x41124, 0x0}, +- {0x41125, 0x0}, +- {0x41126, 0x0}, +- {0x41127, 0x0}, +- {0x41128, 0x0}, +- {0x41129, 0x0}, +- {0x4112a, 0x0}, +- {0x4112b, 0x0}, +- {0x4112c, 0x0}, +- {0x4112d, 0x0}, +- {0x4112e, 0x0}, +- {0x4112f, 0x0}, +- {0x41130, 0x0}, +- {0x41131, 0x0}, +- {0x41132, 0x0}, +- {0x41133, 0x0}, +- {0x41134, 0x0}, +- {0x41135, 0x0}, +- {0x41136, 0x0}, +- {0x41137, 0x0}, +- {0x41138, 0x0}, +- {0x41139, 0x0}, +- {0x4113a, 0x0}, +- {0x4113b, 0x0}, +- {0x4113c, 0x0}, +- {0x4113d, 0x0}, +- {0x4113e, 0x0}, +- {0x4113f, 0x0}, +- {0x41140, 0x0}, +- {0x41141, 0x0}, +- {0x41142, 0x0}, +- {0x41143, 0x0}, +- {0x41144, 0x0}, +- {0x41145, 0x0}, +- {0x41146, 0x0}, +- {0x41147, 0x0}, +- {0x41148, 0x0}, +- {0x41149, 0x0}, +- {0x4114a, 0x0}, +- {0x4114b, 0x0}, +- {0x4114c, 0x0}, +- {0x4114d, 0x0}, +- {0x4114e, 0x0}, +- {0x4114f, 0x0}, +- {0x41150, 0x0}, +- {0x41151, 0x0}, +- {0x41152, 0x0}, +- {0x41153, 0x0}, +- {0x41154, 0x0}, +- {0x41155, 0x0}, +- {0x41156, 0x0}, +- {0x41157, 0x0}, +- {0x41158, 0x0}, +- {0x41159, 0x0}, +- {0x4115a, 0x0}, +- {0x4115b, 0x0}, +- {0x4115c, 0x0}, +- {0x4115d, 0x0}, +- {0x4115e, 0x0}, +- {0x4115f, 0x0}, +- {0x41160, 0x0}, +- {0x41161, 0x0}, +- {0x41162, 0x0}, +- {0x41163, 0x0}, +- {0x41164, 0x0}, +- {0x41165, 0x0}, +- {0x41166, 0x0}, +- {0x41167, 0x0}, +- {0x41168, 0x0}, +- {0x41169, 0x0}, +- {0x4116a, 0x0}, +- {0x4116b, 0x0}, +- {0x4116c, 0x0}, +- {0x4116d, 0x0}, +- {0x4116e, 0x0}, +- {0x4116f, 0x0}, +- {0x41170, 0x0}, +- {0x41171, 0x0}, +- {0x41172, 0x0}, +- {0x41173, 0x0}, +- {0x41174, 0x0}, +- {0x41175, 0x0}, +- {0x41176, 0x0}, +- {0x41177, 0x0}, +- {0x41178, 0x0}, +- {0x41179, 0x0}, +- {0x4117a, 0x0}, +- {0x4117b, 0x0}, +- {0x4117c, 0x0}, +- {0x4117d, 0x0}, +- {0x4117e, 0x0}, +- {0x4117f, 0x0}, +- {0x41180, 0x0}, +- {0x41181, 0x0}, +- {0x41182, 0x0}, +- {0x41183, 0x0}, +- {0x41184, 0x0}, +- {0x41185, 0x0}, +- {0x41186, 0x0}, +- {0x41187, 0x0}, +- {0x41188, 0x0}, +- {0x41189, 0x0}, +- {0x4118a, 0x0}, +- {0x4118b, 0x0}, +- {0x4118c, 0x0}, +- {0x4118d, 0x0}, +- {0x4118e, 0x0}, +- {0x4118f, 0x0}, +- {0x41190, 0x0}, +- {0x41191, 0x0}, +- {0x41192, 0x0}, +- {0x41193, 0x0}, +- {0x41194, 0x0}, +- {0x41195, 0x0}, +- {0x41196, 0x0}, +- {0x41197, 0x0}, +- {0x41198, 0x0}, +- {0x41199, 0x0}, +- {0x4119a, 0x0}, +- {0x4119b, 0x0}, +- {0x4119c, 0x0}, +- {0x4119d, 0x0}, +- {0x4119e, 0x0}, +- {0x4119f, 0x0}, +- {0x411a0, 0x0}, +- {0x411a1, 0x0}, +- {0x411a2, 0x0}, +- {0x411a3, 0x0}, +- {0x411a4, 0x0}, +- {0x411a5, 0x0}, +- {0x411a6, 0x0}, +- {0x411a7, 0x0}, +- {0x411a8, 0x0}, +- {0x411a9, 0x0}, +- {0x411aa, 0x0}, +- {0x411ab, 0x0}, +- {0x411ac, 0x0}, +- {0x411ad, 0x0}, +- {0x411ae, 0x0}, +- {0x411af, 0x0}, +- {0x411b0, 0x0}, +- {0x411b1, 0x0}, +- {0x411b2, 0x0}, +- {0x411b3, 0x0}, +- {0x411b4, 0x0}, +- {0x411b5, 0x0}, +- {0x411b6, 0x0}, +- {0x411b7, 0x0}, +- {0x411b8, 0x0}, +- {0x411b9, 0x0}, +- {0x411ba, 0x0}, +- {0x411bb, 0x0}, +- {0x411bc, 0x0}, +- {0x411bd, 0x0}, +- {0x411be, 0x0}, +- {0x411bf, 0x0}, +- {0x411c0, 0x0}, +- {0x411c1, 0x0}, +- {0x411c2, 0x0}, +- {0x411c3, 0x0}, +- {0x411c4, 0x0}, +- {0x411c5, 0x0}, +- {0x411c6, 0x0}, +- {0x411c7, 0x0}, +- {0x20015, 0x0}, +- {0x2004a, 0x0}, +- {0x2004b, 0x0}, +- {0x2004c, 0x0}, +- {0x2004d, 0x0}, +- {0x20088, 0x0}, +- {0x20089, 0x0}, +- {0x2008a, 0x0}, +- {0x2008c, 0x0}, +- {0x20041, 0x0}, +- {0x20045, 0x0}, +- {0x10057, 0x0}, +- {0x11057, 0x0}, +- {0x12057, 0x0}, +- {0x13057, 0x0}, +- {0x1000f, 0x0}, +- {0x1100f, 0x0}, +- {0x1200f, 0x0}, +- {0x1300f, 0x0}, +- {0x90803, 0x0}, +- {0x90804, 0x0}, +- {0x90805, 0x0}, +- {0x90903, 0x0}, +- {0x9090b, 0x0}, +- {0x90811, 0x0}, +- {0x90812, 0x0}, +- {0x20072, 0x0}, +- {0x9080e, 0x0}, +- {0x20073, 0x0}, +- {0x9080f, 0x0}, +- {0x41000, 0x0}, +- {0x41001, 0x0}, +- {0x41002, 0x0}, +- {0x41003, 0x0}, +- {0x41004, 0x0}, +- {0x41005, 0x0}, +- {0x41006, 0x0}, +- {0x41007, 0x0}, +- {0x41388, 0x0}, +- {0x41389, 0x0}, +- {0x4138a, 0x0}, +- {0x4138b, 0x0}, +- {0x4138c, 0x0}, +- {0x4138d, 0x0}, +- {0x4138e, 0x0}, +- {0x4138f, 0x0}, +- {0x41390, 0x0}, +- {0x41391, 0x0}, +- {0x41392, 0x0}, +- {0x41393, 0x0}, +- {0x41394, 0x0}, +- {0x41395, 0x0}, +- {0x41396, 0x0}, +- {0x41397, 0x0}, +- {0x41398, 0x0}, +- {0x41399, 0x0}, +- {0x4139a, 0x0}, +- {0x4139b, 0x0}, +- {0x4139c, 0x0}, +- {0x4139d, 0x0}, +- {0x4139e, 0x0}, +- {0x4139f, 0x0}, +- {0x413a0, 0x0}, +- {0x413a1, 0x0}, +- {0x413a2, 0x0}, +- {0x413a3, 0x0}, +- {0x413a4, 0x0}, +- {0x413a5, 0x0}, +- {0x413a6, 0x0}, +- {0x413a7, 0x0}, +- {0x413a8, 0x0}, +- {0x413a9, 0x0}, +- {0x413aa, 0x0}, +- {0x413ab, 0x0}, +- {0x413ac, 0x0}, +- {0x413ad, 0x0}, +- {0x413ae, 0x0}, +- {0x413af, 0x0}, +- {0x413b0, 0x0}, +- {0x413b1, 0x0}, +- {0x413b2, 0x0}, +- {0x413b3, 0x0}, +- {0x413b4, 0x0}, +- {0x413b5, 0x0}, +- {0x413b6, 0x0}, +- {0x413b7, 0x0}, +- {0x413b8, 0x0}, +- {0x413b9, 0x0}, +- {0x413ba, 0x0}, +- {0x413bb, 0x0}, +- {0x413bc, 0x0}, +- {0x413bd, 0x0}, +- {0x413be, 0x0}, +- {0x413bf, 0x0}, +- {0x413c0, 0x0}, +- {0x413c1, 0x0}, +- {0x413c2, 0x0}, +- {0x413c3, 0x0}, +- {0x413c4, 0x0}, +- {0x413c5, 0x0}, +- {0x413c6, 0x0}, +- {0x413c7, 0x0}, +- {0x413c8, 0x0}, +- {0x413c9, 0x0}, +- {0x413ca, 0x0}, +- {0x413cb, 0x0}, +- {0x413cc, 0x0}, +- {0x413cd, 0x0}, +- {0x413ce, 0x0}, +- {0x413cf, 0x0}, +- {0x413d0, 0x0}, +- {0x413d1, 0x0}, +- {0x413d2, 0x0}, +- {0x413d3, 0x0}, +- {0x413d4, 0x0}, +- {0x413d5, 0x0}, +- {0x413d6, 0x0}, +- {0x413d7, 0x0}, +- {0x413d8, 0x0}, +- {0x413d9, 0x0}, +- {0x413da, 0x0}, +- {0x413db, 0x0}, +- {0x413dc, 0x0}, +- {0x413dd, 0x0}, +- {0x413de, 0x0}, +- {0x413df, 0x0}, +- {0x413e0, 0x0}, +- {0x413e1, 0x0}, +- {0x413e2, 0x0}, +- {0x413e3, 0x0}, +- {0x413e4, 0x0}, +- {0x413e5, 0x0}, +- {0x413e6, 0x0}, +- {0x413e7, 0x0}, +- {0x413e8, 0x0}, +- {0x413e9, 0x0}, +- {0x413ea, 0x0}, +- {0x413eb, 0x0}, +- {0x413ec, 0x0}, +- {0x413ed, 0x0}, +- {0x413ee, 0x0}, +- {0x413ef, 0x0}, +- {0x413f0, 0x0}, +- {0x413f1, 0x0}, +- {0x413f2, 0x0}, +- {0x413f3, 0x0}, +- {0x413f4, 0x0}, +- {0x413f5, 0x0}, +- {0x413f6, 0x0}, +- {0x413f7, 0x0}, +- {0x413f8, 0x0}, +- {0x413f9, 0x0}, +- {0x413fa, 0x0}, +- {0x413fb, 0x0}, +- {0x413fc, 0x0}, +- {0x413fd, 0x0}, +- {0x413fe, 0x0}, +- {0x413ff, 0x0}, +- {0x41400, 0x0}, +- {0x41401, 0x0}, +- {0x41402, 0x0}, +- {0x41403, 0x0}, +- {0x41404, 0x0}, +- {0x41405, 0x0}, +- {0x41406, 0x0}, +- {0x41407, 0x0}, +- {0x41408, 0x0}, +- {0x41409, 0x0}, +- {0x4140a, 0x0}, +- {0x4140b, 0x0}, +- {0x4140c, 0x0}, +- {0x4140d, 0x0}, +- {0x4140e, 0x0}, +- {0x4140f, 0x0}, +- {0x41410, 0x0}, +- {0x41411, 0x0}, +- {0x41412, 0x0}, +- {0x41413, 0x0}, +- {0x41414, 0x0}, +- {0x41415, 0x0}, +- {0x41416, 0x0}, +- {0x41417, 0x0}, +- {0x41418, 0x0}, +- {0x41419, 0x0}, +- {0x4141a, 0x0}, +- {0x4141b, 0x0}, +- {0x4141c, 0x0}, +- {0x4141d, 0x0}, +- {0x4141e, 0x0}, +- {0x4141f, 0x0}, +- {0x41420, 0x0}, +- {0x41421, 0x0}, +- {0x41422, 0x0}, +- {0x41423, 0x0}, +- {0x41424, 0x0}, +- {0x41425, 0x0}, +- {0x41426, 0x0}, +- {0x41427, 0x0}, +- {0x41428, 0x0}, +- {0x41429, 0x0}, +- {0x4142a, 0x0}, +- {0x4142b, 0x0}, +- {0x4142c, 0x0}, +- {0x4142d, 0x0}, +- {0x4142e, 0x0}, +- {0x4142f, 0x0}, +- {0x41430, 0x0}, +- {0x41431, 0x0}, +- {0x41432, 0x0}, +- {0x41433, 0x0}, +- {0x41434, 0x0}, +- {0x41435, 0x0}, +- {0x41436, 0x0}, +- {0x41437, 0x0}, +- {0x41438, 0x0}, +- {0x41439, 0x0}, +- {0x4143a, 0x0}, +- {0x4143b, 0x0}, +- {0x4143c, 0x0}, +- {0x4143d, 0x0}, +- {0x4143e, 0x0}, +- {0x4143f, 0x0}, +- {0x41440, 0x0}, +- {0x41441, 0x0}, +- {0x41442, 0x0}, +- {0x41443, 0x0}, +- {0x41444, 0x0}, +- {0x41445, 0x0}, +- {0x41446, 0x0}, +- {0x41447, 0x0}, +- {0x41448, 0x0}, +- {0x41449, 0x0}, +- {0x4144a, 0x0}, +- {0x4144b, 0x0}, +- {0x4144c, 0x0}, +- {0x4144d, 0x0}, +- {0x4144e, 0x0}, +- {0x4144f, 0x0}, +- {0x41450, 0x0}, +- {0x41451, 0x0}, +- {0x41452, 0x0}, +- {0x41453, 0x0}, +- {0x41454, 0x0}, +- {0x41455, 0x0}, +- {0x41456, 0x0}, +- {0x41457, 0x0}, +- {0x41458, 0x0}, +- {0x41459, 0x0}, +- {0x4145a, 0x0}, +- {0x4145b, 0x0}, +- {0x4145c, 0x0}, +- {0x4145d, 0x0}, +- {0x4145e, 0x0}, +- {0x4145f, 0x0}, +- {0x41460, 0x0}, +- {0x41461, 0x0}, +- {0x41462, 0x0}, +- {0x41463, 0x0}, +- {0x41464, 0x0}, +- {0x41465, 0x0}, +- {0x41466, 0x0}, +- {0x41467, 0x0}, +- {0x41468, 0x0}, +- {0x41469, 0x0}, +- {0x4146a, 0x0}, +- {0x4146b, 0x0}, +- {0x4146c, 0x0}, +- {0x4146d, 0x0}, +- {0x4146e, 0x0}, +- {0x4146f, 0x0}, +- {0x41470, 0x0}, +- {0x41471, 0x0}, +- {0x41472, 0x0}, +- {0x41473, 0x0}, +- {0x41474, 0x0}, +- {0x41475, 0x0}, +- {0x41476, 0x0}, +- {0x41477, 0x0}, +- {0x41478, 0x0}, +- {0x41479, 0x0}, +- {0x4147a, 0x0}, +- {0x4147b, 0x0}, +- {0x4147c, 0x0}, +- {0x4147d, 0x0}, +- {0x4147e, 0x0}, +- {0x4147f, 0x0}, +- {0x41480, 0x0}, +- {0x41481, 0x0}, +- {0x41482, 0x0}, +- {0x41483, 0x0}, +- {0x41484, 0x0}, +- {0x41485, 0x0}, +- {0x41486, 0x0}, +- {0x41487, 0x0}, +- {0x41488, 0x0}, +- {0x41489, 0x0}, +- {0x4148a, 0x0}, +- {0x4148b, 0x0}, +- {0x4148c, 0x0}, +- {0x4148d, 0x0}, +- {0x4148e, 0x0}, +- {0x4148f, 0x0}, +- {0x41490, 0x0}, +- {0x41491, 0x0}, +- {0x41492, 0x0}, +- {0x41493, 0x0}, +- {0x41494, 0x0}, +- {0x41495, 0x0}, +- {0x41496, 0x0}, +- {0x41497, 0x0}, +- {0x41498, 0x0}, +- {0x41499, 0x0}, +- {0x4149a, 0x0}, +- {0x4149b, 0x0}, +- {0x4149c, 0x0}, +- {0x4149d, 0x0}, +- {0x4149e, 0x0}, +- {0x4149f, 0x0}, +- {0x414a0, 0x0}, +- {0x414a1, 0x0}, +- {0x414a2, 0x0}, +- {0x414a3, 0x0}, +- {0x414a4, 0x0}, +- {0x414a5, 0x0}, +- {0x414a6, 0x0}, +- {0x414a7, 0x0}, +- {0x414a8, 0x0}, +- {0x414a9, 0x0}, +- {0x414aa, 0x0}, +- {0x414ab, 0x0}, +- {0x414ac, 0x0}, +- {0x414ad, 0x0}, +- {0x414ae, 0x0}, +- {0x414af, 0x0}, +- {0x414b0, 0x0}, +- {0x414b1, 0x0}, +- {0x414b2, 0x0}, +- {0x414b3, 0x0}, +- {0x414b4, 0x0}, +- {0x414b5, 0x0}, +- {0x414b6, 0x0}, +- {0x414b7, 0x0}, +- {0x414b8, 0x0}, +- {0x414b9, 0x0}, +- {0x414ba, 0x0}, +- {0x414bb, 0x0}, +- {0x414bc, 0x0}, +- {0x414bd, 0x0}, +- {0x414be, 0x0}, +- {0x414bf, 0x0}, +- {0x414c0, 0x0}, +- {0x414c1, 0x0}, +- {0x414c2, 0x0}, +- {0x414c3, 0x0}, +- {0x414c4, 0x0}, +- {0x414c5, 0x0}, +- {0x414c6, 0x0}, +- {0x414c7, 0x0}, +- {0x414c8, 0x0}, +- {0x414c9, 0x0}, +- {0x414ca, 0x0}, +- {0x414cb, 0x0}, +- {0x414cc, 0x0}, +- {0x414cd, 0x0}, +- {0x414ce, 0x0}, +- {0x414cf, 0x0}, +- {0x414d0, 0x0}, +- {0x414d1, 0x0}, +- {0x414d2, 0x0}, +- {0x414d3, 0x0}, +- {0x414d4, 0x0}, +- {0x414d5, 0x0}, +- {0x414d6, 0x0}, +- {0x414d7, 0x0}, +- {0x414d8, 0x0}, +- {0x414d9, 0x0}, +- {0x414da, 0x0}, +- {0x414db, 0x0}, +- {0x414dc, 0x0}, +- {0x414dd, 0x0}, +- {0x414de, 0x0}, +- {0x414df, 0x0}, +- {0x414e0, 0x0}, +- {0x414e1, 0x0}, +- {0x414e2, 0x0}, +- {0x414e3, 0x0}, +- {0x414e4, 0x0}, +- {0x414e5, 0x0}, +- {0x414e6, 0x0}, +- {0x414e7, 0x0}, +- {0x414e8, 0x0}, +- {0x414e9, 0x0}, +- {0x414ea, 0x0}, +- {0x414eb, 0x0}, +- {0x414ec, 0x0}, +- {0x414ed, 0x0}, +- {0x414ee, 0x0}, +- {0x414ef, 0x0}, +- {0x414f0, 0x0}, +- {0x414f1, 0x0}, +- {0x414f2, 0x0}, +- {0x414f3, 0x0}, +- {0x414f4, 0x0}, +- {0x414f5, 0x0}, +- {0x414f6, 0x0}, +- {0x414f7, 0x0}, +- {0x414f8, 0x0}, +- {0x414f9, 0x0}, +- {0x414fa, 0x0}, +- {0x414fb, 0x0}, +- {0x414fc, 0x0}, +- {0x414fd, 0x0}, +- {0x414fe, 0x0}, +- {0x414ff, 0x0}, +- {0x41500, 0x0}, +- {0x41501, 0x0}, +- {0x41502, 0x0}, +- {0x41503, 0x0}, +- {0x41504, 0x0}, +- {0x41505, 0x0}, +- {0x41506, 0x0}, +- {0x41507, 0x0}, +- {0x41508, 0x0}, +- {0x41509, 0x0}, +- {0x4150a, 0x0}, +- {0x4150b, 0x0}, +- {0x4150c, 0x0}, +- {0x4150d, 0x0}, +- {0x4150e, 0x0}, +- {0x4150f, 0x0}, +- {0x41510, 0x0}, +- {0x41511, 0x0}, +- {0x41512, 0x0}, +- {0x41513, 0x0}, +- {0x41514, 0x0}, +- {0x41515, 0x0}, +- {0x41516, 0x0}, +- {0x41517, 0x0}, +- {0x41518, 0x0}, +- {0x41519, 0x0}, +- {0x4151a, 0x0}, +- {0x4151b, 0x0}, +- {0x4151c, 0x0}, +- {0x4151d, 0x0}, +- {0x4151e, 0x0}, +- {0x4151f, 0x0}, +- {0x41520, 0x0}, +- {0x41521, 0x0}, +- {0x41522, 0x0}, +- {0x41523, 0x0}, +- {0x41524, 0x0}, +- {0x41525, 0x0}, +- {0x41526, 0x0}, +- {0x41527, 0x0}, +- {0x41528, 0x0}, +- {0x41529, 0x0}, +- {0x4152a, 0x0}, +- {0x4152b, 0x0}, +- {0x4152c, 0x0}, +- {0x4152d, 0x0}, +- {0x4152e, 0x0}, +- {0x4152f, 0x0}, +- {0x41530, 0x0}, +- {0x41531, 0x0}, +- {0x41532, 0x0}, +- {0x41533, 0x0}, +- {0x41534, 0x0}, +- {0x41535, 0x0}, +- {0x41536, 0x0}, +- {0x41537, 0x0}, +- {0x41538, 0x0}, +- {0x41539, 0x0}, +- {0x4153a, 0x0}, +- {0x4153b, 0x0}, +- {0x4153c, 0x0}, +- {0x4153d, 0x0}, +- {0x4153e, 0x0}, +- {0x4153f, 0x0}, +- {0x41540, 0x0}, +- {0x41541, 0x0}, +- {0x41542, 0x0}, +- {0x41543, 0x0}, +- {0x41544, 0x0}, +- {0x41545, 0x0}, +- {0x41546, 0x0}, +- {0x41547, 0x0}, +- {0x41548, 0x0}, +- {0x41549, 0x0}, +- {0x4154a, 0x0}, +- {0x4154b, 0x0}, +- {0x4154c, 0x0}, +- {0x4154d, 0x0}, +- {0x4154e, 0x0}, +- {0x4154f, 0x0}, +- {0x41550, 0x0}, +- {0x41551, 0x0}, +- {0x41552, 0x0}, +- {0x41553, 0x0}, +- {0x41554, 0x0}, +- {0x41555, 0x0}, +- {0x41556, 0x0}, +- {0x41557, 0x0}, +- {0x41558, 0x0}, +- {0x41559, 0x0}, +- {0x4155a, 0x0}, +- {0x4155b, 0x0}, +- {0x4155c, 0x0}, +- {0x4155d, 0x0}, +- {0x4155e, 0x0}, +- {0x4155f, 0x0}, +- {0x41560, 0x0}, +- {0x41561, 0x0}, +- {0x41562, 0x0}, +- {0x41563, 0x0}, +- {0x41564, 0x0}, +- {0x41565, 0x0}, +- {0x41566, 0x0}, +- {0x41567, 0x0}, +- {0x41568, 0x0}, +- {0x41569, 0x0}, +- {0x4156a, 0x0}, +- {0x4156b, 0x0}, +- {0x4156c, 0x0}, +- {0x4156d, 0x0}, +- {0x4156e, 0x0}, +- {0x4156f, 0x0}, +- {0x41570, 0x0}, +- {0x41571, 0x0}, +- {0x41572, 0x0}, +- {0x41573, 0x0}, +- {0x41574, 0x0}, +- {0x41575, 0x0}, +- {0x41576, 0x0}, +- {0x41577, 0x0}, +- {0x41578, 0x0}, +- {0x41579, 0x0}, +- {0x4157a, 0x0}, +- {0x4157b, 0x0}, +- {0x4157c, 0x0}, +- {0x4157d, 0x0}, +- {0x4157e, 0x0}, +- {0x4157f, 0x0}, +- {0x41580, 0x0}, +- {0x41581, 0x0}, +- {0x41582, 0x0}, +- {0x41583, 0x0}, +- {0x41584, 0x0}, +- {0x41585, 0x0}, +- {0x41586, 0x0}, +- {0x41587, 0x0}, +- {0x41588, 0x0}, +- {0x41589, 0x0}, +- {0x4158a, 0x0}, +- {0x4158b, 0x0}, +- {0x4158c, 0x0}, +- {0x4158d, 0x0}, +- {0x4158e, 0x0}, +- {0x4158f, 0x0}, +- {0x41590, 0x0}, +- {0x41591, 0x0}, +- {0x41592, 0x0}, +- {0x41593, 0x0}, +- {0x41594, 0x0}, +- {0x41595, 0x0}, +- {0x41596, 0x0}, +- {0x41597, 0x0}, +- {0x41598, 0x0}, +- {0x41599, 0x0}, +- {0x4159a, 0x0}, +- {0x4159b, 0x0}, +- {0x4159c, 0x0}, +- {0x4159d, 0x0}, +- {0x4159e, 0x0}, +- {0x4159f, 0x0}, +- {0x415a0, 0x0}, +- {0x415a1, 0x0}, +- {0x415a2, 0x0}, +- {0x415a3, 0x0}, +- {0x415a4, 0x0}, +- {0x415a5, 0x0}, +- {0x415a6, 0x0}, +- {0x415a7, 0x0}, +- {0x415a8, 0x0}, +- {0x415a9, 0x0}, +- {0x415aa, 0x0}, +- {0x415ab, 0x0}, +- {0x415ac, 0x0}, +- {0x415ad, 0x0}, +- {0x415ae, 0x0}, +- {0x415af, 0x0}, +- {0x415b0, 0x0}, +- {0x415b1, 0x0}, +- {0x415b2, 0x0}, +- {0x415b3, 0x0}, +- {0x415b4, 0x0}, +- {0x415b5, 0x0}, +- {0x415b6, 0x0}, +- {0x415b7, 0x0}, +- {0x415b8, 0x0}, +- {0x415b9, 0x0}, +- {0x415ba, 0x0}, +- {0x415bb, 0x0}, +- {0x415bc, 0x0}, +- {0x415bd, 0x0}, +- {0x415be, 0x0}, +- {0x415bf, 0x0}, +- {0x415c0, 0x0}, +- {0x415c1, 0x0}, +- {0x415c2, 0x0}, +- {0x415c3, 0x0}, +- {0x415c4, 0x0}, +- {0x415c5, 0x0}, +- {0x415c6, 0x0}, +- {0x415c7, 0x0}, +- {0x415c8, 0x0}, +- {0x415c9, 0x0}, +- {0x415ca, 0x0}, +- {0x415cb, 0x0}, +- {0x415cc, 0x0}, +- {0x415cd, 0x0}, +- {0x415ce, 0x0}, +- {0x415cf, 0x0}, +- {0x415d0, 0x0}, +- {0x415d1, 0x0}, +- {0x415d2, 0x0}, +- {0x415d3, 0x0}, +- {0x415d4, 0x0}, +- {0x415d5, 0x0}, +- {0x415d6, 0x0}, +- {0x415d7, 0x0}, +- {0x415d8, 0x0}, +- {0x415d9, 0x0}, +- {0x415da, 0x0}, +- {0x415db, 0x0}, +- {0x415dc, 0x0}, +- {0x415dd, 0x0}, +- {0x415de, 0x0}, +- {0x415df, 0x0}, +- {0x415e0, 0x0}, +- {0x415e1, 0x0}, +- {0x415e2, 0x0}, +- {0x415e3, 0x0}, +- {0x415e4, 0x0}, +- {0x415e5, 0x0}, +- {0x415e6, 0x0}, +- {0x415e7, 0x0}, +- {0x415e8, 0x0}, +- {0x415e9, 0x0}, +- {0x415ea, 0x0}, +- {0x415eb, 0x0}, +- {0x415ec, 0x0}, +- {0x415ed, 0x0}, +- {0x415ee, 0x0}, +- {0x415ef, 0x0}, +- {0x415f0, 0x0}, +- {0x415f1, 0x0}, +- {0x415f2, 0x0}, +- {0x415f3, 0x0}, +- {0x415f4, 0x0}, +- {0x415f5, 0x0}, +- {0x415f6, 0x0}, +- {0x415f7, 0x0}, +- {0x415f8, 0x0}, +- {0x415f9, 0x0}, +- {0x415fa, 0x0}, +- {0x415fb, 0x0}, +- {0x415fc, 0x0}, +- {0x415fd, 0x0}, +- {0x415fe, 0x0}, +- {0x415ff, 0x0}, +- {0x41600, 0x0}, +- {0x41601, 0x0}, +- {0x41602, 0x0}, +- {0x41603, 0x0}, +- {0x41604, 0x0}, +- {0x41605, 0x0}, +- {0x41606, 0x0}, +- {0x41607, 0x0}, +- {0x41608, 0x0}, +- {0x41609, 0x0}, +- {0x4160a, 0x0}, +- {0x4160b, 0x0}, +- {0x4160c, 0x0}, +- {0x4160d, 0x0}, +- {0x4160e, 0x0}, +- {0x4160f, 0x0}, +- {0x41610, 0x0}, +- {0x41611, 0x0}, +- {0x41612, 0x0}, +- {0x41613, 0x0}, +- {0x41614, 0x0}, +- {0x41615, 0x0}, +- {0x41616, 0x0}, +- {0x41617, 0x0}, +- {0x41618, 0x0}, +- {0x41619, 0x0}, +- {0x4161a, 0x0}, +- {0x4161b, 0x0}, +- {0x4161c, 0x0}, +- {0x4161d, 0x0}, +- {0x4161e, 0x0}, +- {0x4161f, 0x0}, +- {0x41620, 0x0}, +- {0x41621, 0x0}, +- {0x41622, 0x0}, +- {0x41623, 0x0}, +- {0x41624, 0x0}, +- {0x41625, 0x0}, +- {0x41626, 0x0}, +- {0x41627, 0x0}, +- {0x41628, 0x0}, +- {0x41629, 0x0}, +- {0x4162a, 0x0}, +- {0x4162b, 0x0}, +- {0x4162c, 0x0}, +- {0x4162d, 0x0}, +- {0x4162e, 0x0}, +- {0x4162f, 0x0}, +- {0x41630, 0x0}, +- {0x41631, 0x0}, +- {0x41632, 0x0}, +- {0x41633, 0x0}, +- {0x41634, 0x0}, +- {0x41635, 0x0}, +- {0x41636, 0x0}, +- {0x41637, 0x0}, +- {0x41638, 0x0}, +- {0x41639, 0x0}, +- {0x4163a, 0x0}, +- {0x4163b, 0x0}, +- {0x4163c, 0x0}, +- {0x4163d, 0x0}, +- {0x4163e, 0x0}, +- {0x4163f, 0x0}, +- {0x41640, 0x0}, +- {0x41641, 0x0}, +- {0x41642, 0x0}, +- {0x41643, 0x0}, +- {0x41644, 0x0}, +- {0x41645, 0x0}, +- {0x41646, 0x0}, +- {0x41647, 0x0}, +- {0x41648, 0x0}, +- {0x41649, 0x0}, +- {0x4164a, 0x0}, +- {0x4164b, 0x0}, +- {0x4164c, 0x0}, +- {0x4164d, 0x0}, +- {0x4164e, 0x0}, +- {0x4164f, 0x0}, +- {0x41650, 0x0}, +- {0x41651, 0x0}, +- {0x41652, 0x0}, +- {0x41653, 0x0}, +- {0x41654, 0x0}, +- {0x41655, 0x0}, +- {0x41656, 0x0}, +- {0x41657, 0x0}, +- {0x41658, 0x0}, +- {0x41659, 0x0}, +- {0x4165a, 0x0}, +- {0x4165b, 0x0}, +- {0x4165c, 0x0}, +- {0x4165d, 0x0}, +- {0x4165e, 0x0}, +- {0x4165f, 0x0}, +- {0x41660, 0x0}, +- {0x41661, 0x0}, +- {0x41662, 0x0}, +- {0x41663, 0x0}, +- {0x41664, 0x0}, +- {0x41665, 0x0}, +- {0x41666, 0x0}, +- {0x41667, 0x0}, +- {0x41668, 0x0}, +- {0x41669, 0x0}, +- {0x4166a, 0x0}, +- {0x4166b, 0x0}, +- {0x4166c, 0x0}, +- {0x4166d, 0x0}, +- {0x4166e, 0x0}, +- {0x4166f, 0x0}, +- {0x41670, 0x0}, +- {0x41671, 0x0}, +- {0x41672, 0x0}, +- {0x41673, 0x0}, +- {0x41674, 0x0}, +- {0x41675, 0x0}, +- {0x41676, 0x0}, +- {0x41677, 0x0}, +- {0x41678, 0x0}, +- {0x41679, 0x0}, +- {0x4167a, 0x0}, +- {0x4167b, 0x0}, +- {0x4167c, 0x0}, +- {0x4167d, 0x0}, +- {0x4167e, 0x0}, +- {0x4167f, 0x0}, +- {0x41680, 0x0}, +- {0x41681, 0x0}, +- {0x41682, 0x0}, +- {0x41683, 0x0}, +- {0x41684, 0x0}, +- {0x41685, 0x0}, +- {0x41686, 0x0}, +- {0x41687, 0x0}, +- {0x41688, 0x0}, +- {0x41689, 0x0}, +- {0x4168a, 0x0}, +- {0x4168b, 0x0}, +- {0x4168c, 0x0}, +- {0x4168d, 0x0}, +- {0x4168e, 0x0}, +- {0x4168f, 0x0}, +- {0x41690, 0x0}, +- {0x41691, 0x0}, +- {0x41692, 0x0}, +- {0x41693, 0x0}, +- {0x41694, 0x0}, +- {0x41695, 0x0}, +- {0x41696, 0x0}, +- {0x41697, 0x0}, +- {0x41698, 0x0}, +- {0x41699, 0x0}, +- {0x4169a, 0x0}, +- {0x4169b, 0x0}, +- {0x4169c, 0x0}, +- {0x4169d, 0x0}, +- {0x4169e, 0x0}, +- {0x4169f, 0x0}, +- {0x416a0, 0x0}, +- {0x416a1, 0x0}, +- {0x416a2, 0x0}, +- {0x416a3, 0x0}, +- {0x416a4, 0x0}, +- {0x416a5, 0x0}, +- {0x416a6, 0x0}, +- {0x416a7, 0x0}, +- {0x416a8, 0x0}, +- {0x416a9, 0x0}, +- {0x416aa, 0x0}, +- {0x416ab, 0x0}, +- {0x416ac, 0x0}, +- {0x416ad, 0x0}, +- {0x416ae, 0x0}, +- {0x416af, 0x0}, +- {0x416b0, 0x0}, +- {0x416b1, 0x0}, +- {0x416b2, 0x0}, +- {0x416b3, 0x0}, +- {0x416b4, 0x0}, +- {0x416b5, 0x0}, +- {0x416b6, 0x0}, +- {0x416b7, 0x0}, +- {0x416b8, 0x0}, +- {0x416b9, 0x0}, +- {0x416ba, 0x0}, +- {0x416bb, 0x0}, +- {0x416bc, 0x0}, +- {0x416bd, 0x0}, +- {0x416be, 0x0}, +- {0x416bf, 0x0}, +- {0x416c0, 0x0}, +- {0x416c1, 0x0}, +- {0x416c2, 0x0}, +- {0x416c3, 0x0}, +- {0x416c4, 0x0}, +- {0x416c5, 0x0}, +- {0x416c6, 0x0}, +- {0x416c7, 0x0}, +- {0x416c8, 0x0}, +- {0x416c9, 0x0}, +- {0x416ca, 0x0}, +- {0x416cb, 0x0}, +- {0x416cc, 0x0}, +- {0x416cd, 0x0}, +- {0x416ce, 0x0}, +- {0x416cf, 0x0}, +- {0x416d0, 0x0}, +- {0x416d1, 0x0}, +- {0x416d2, 0x0}, +- {0x416d3, 0x0}, +- {0x416d4, 0x0}, +- {0x416d5, 0x0}, +- {0x416d6, 0x0}, +- {0x416d7, 0x0}, +- {0x416d8, 0x0}, +- {0x416d9, 0x0}, +- {0x416da, 0x0}, +- {0x416db, 0x0}, +- {0x416dc, 0x0}, +- {0x416dd, 0x0}, +- {0x416de, 0x0}, +- {0x416df, 0x0}, +- {0x416e0, 0x0}, +- {0x416e1, 0x0}, +- {0x416e2, 0x0}, +- {0x416e3, 0x0}, +- {0x416e4, 0x0}, +- {0x416e5, 0x0}, +- {0x416e6, 0x0}, +- {0x416e7, 0x0}, +- {0x416e8, 0x0}, +- {0x416e9, 0x0}, +- {0x416ea, 0x0}, +- {0x416eb, 0x0}, +- {0x416ec, 0x0}, +- {0x416ed, 0x0}, +- {0x416ee, 0x0}, +- {0x416ef, 0x0}, +- {0x416f0, 0x0}, +- {0x416f1, 0x0}, +- {0x416f2, 0x0}, +- {0x416f3, 0x0}, +- {0x416f4, 0x0}, +- {0x416f5, 0x0}, +- {0x416f6, 0x0}, +- {0x416f7, 0x0}, +- {0x416f8, 0x0}, +- {0x416f9, 0x0}, +- {0x416fa, 0x0}, +- {0x416fb, 0x0}, +- {0x416fc, 0x0}, +- {0x416fd, 0x0}, +- {0x416fe, 0x0}, +- {0x416ff, 0x0}, +- {0x41700, 0x0}, +- {0x41701, 0x0}, +- {0x41702, 0x0}, +- {0x41703, 0x0}, +- {0x41704, 0x0}, +- {0x41705, 0x0}, +- {0x41706, 0x0}, +- {0x41707, 0x0}, +- {0x41708, 0x0}, +- {0x41709, 0x0}, +- {0x4170a, 0x0}, +- {0x4170b, 0x0}, +- {0x4170c, 0x0}, +- {0x4170d, 0x0}, +- {0x4170e, 0x0}, +- {0x4170f, 0x0}, +- {0x41710, 0x0}, +- {0x41711, 0x0}, +- {0x41712, 0x0}, +- {0x41713, 0x0}, +- {0x41714, 0x0}, +- {0x41715, 0x0}, +- {0x41716, 0x0}, +- {0x41717, 0x0}, +- {0x41718, 0x0}, +- {0x41719, 0x0}, +- {0x4171a, 0x0}, +- {0x4171b, 0x0}, +- {0x4171c, 0x0}, +- {0x4171d, 0x0}, +- {0x4171e, 0x0}, +- {0x4171f, 0x0}, +- {0x41720, 0x0}, +- {0x41721, 0x0}, +- {0x41722, 0x0}, +- {0x41723, 0x0}, +- {0x41724, 0x0}, +- {0x41725, 0x0}, +- {0x41726, 0x0}, +- {0x41727, 0x0}, +- {0x41728, 0x0}, +- {0x41729, 0x0}, +- {0x4172a, 0x0}, +- {0x4172b, 0x0}, +- {0x4172c, 0x0}, +- {0x4172d, 0x0}, +- {0x4172e, 0x0}, +- {0x4172f, 0x0}, +- {0x41730, 0x0}, +- {0x41731, 0x0}, +- {0x41732, 0x0}, +- {0x41733, 0x0}, +- {0x41734, 0x0}, +- {0x41735, 0x0}, +- {0x41736, 0x0}, +- {0x41737, 0x0}, +- {0x41738, 0x0}, +- {0x41739, 0x0}, +- {0x4173a, 0x0}, +- {0x4173b, 0x0}, +- {0x4173c, 0x0}, +- {0x4173d, 0x0}, +- {0x4173e, 0x0}, +- {0x4173f, 0x0}, +- {0x41740, 0x0}, +- {0x41741, 0x0}, +- {0x41742, 0x0}, +- {0x41743, 0x0}, +- {0x41744, 0x0}, +- {0x41745, 0x0}, +- {0x41746, 0x0}, +- {0x41747, 0x0}, +- {0x41748, 0x0}, +- {0x41749, 0x0}, +- {0x4174a, 0x0}, +- {0x4174b, 0x0}, +- {0x4174c, 0x0}, +- {0x4174d, 0x0}, +- {0x4174e, 0x0}, +- {0x4174f, 0x0}, +- {0x41750, 0x0}, +- {0x41751, 0x0}, +- {0x41752, 0x0}, +- {0x41753, 0x0}, +- {0x41754, 0x0}, +- {0x41755, 0x0}, +- {0x41756, 0x0}, +- {0x41757, 0x0}, +- {0x41758, 0x0}, +- {0x41759, 0x0}, +- {0x4175a, 0x0}, +- {0x4175b, 0x0}, +- {0x4175c, 0x0}, +- {0x4175d, 0x0}, +- {0x4175e, 0x0}, +- {0x4175f, 0x0}, +- {0x41760, 0x0}, +- {0x41761, 0x0}, +- {0x41762, 0x0}, +- {0x41763, 0x0}, +- {0x41764, 0x0}, +- {0x41765, 0x0}, +- {0x41766, 0x0}, +- {0x41767, 0x0}, +- {0x41768, 0x0}, +- {0x41769, 0x0}, +- {0x4176a, 0x0}, +- {0x4176b, 0x0}, +- {0x4176c, 0x0}, +- {0x4176d, 0x0}, +- {0x4176e, 0x0}, +- {0x4176f, 0x0}, +- {0x41770, 0x0}, +- {0x41771, 0x0}, +- {0x41772, 0x0}, +- {0x41773, 0x0}, +- {0x41774, 0x0}, +- {0x41775, 0x0}, +- {0x41776, 0x0}, +- {0x41777, 0x0}, +- {0x41778, 0x0}, +- {0x41779, 0x0}, +- {0x4177a, 0x0}, +- {0x4177b, 0x0}, +- {0x4177c, 0x0}, +- {0x4177d, 0x0}, +- {0x4177e, 0x0}, +- {0x4177f, 0x0}, +- {0x41780, 0x0}, +- {0x41781, 0x0}, +- {0x41782, 0x0}, +- {0x41783, 0x0}, +- {0x41784, 0x0}, +- {0x41785, 0x0}, +- {0x41786, 0x0}, +- {0x41787, 0x0}, +- {0x41788, 0x0}, +- {0x41789, 0x0}, +- {0x4178a, 0x0}, +- {0x4178b, 0x0}, +- {0x4178c, 0x0}, +- {0x4178d, 0x0}, +- {0x4178e, 0x0}, +- {0x4178f, 0x0}, +- {0x41790, 0x0}, +- {0x41791, 0x0}, +- {0x41792, 0x0}, +- {0x41793, 0x0}, +- {0x41794, 0x0}, +- {0x41795, 0x0}, +- {0x41796, 0x0}, +- {0x41797, 0x0}, +- {0x41798, 0x0}, +- {0x41799, 0x0}, +- {0x4179a, 0x0}, +- {0x4179b, 0x0}, +- {0x4179c, 0x0}, +- {0x4179d, 0x0}, +- {0x4179e, 0x0}, +- {0x4179f, 0x0}, +- {0x417a0, 0x0}, +- {0x417a1, 0x0}, +- {0x417a2, 0x0}, +- {0x417a3, 0x0}, +- {0x417a4, 0x0}, +- {0x417a5, 0x0}, +- {0x417a6, 0x0}, +- {0x417a7, 0x0}, +- {0x417a8, 0x0}, +- {0x417a9, 0x0}, +- {0x417aa, 0x0}, +- {0x417ab, 0x0}, +- {0x417ac, 0x0}, +- {0x417ad, 0x0}, +- {0x417ae, 0x0}, +- {0x417af, 0x0}, +- {0x417b0, 0x0}, +- {0x417b1, 0x0}, +- {0x417b2, 0x0}, +- {0x417b3, 0x0}, +- {0x417b4, 0x0}, +- {0x417b5, 0x0}, +- {0x417b6, 0x0}, +- {0x417b7, 0x0}, +- {0x417b8, 0x0}, +- {0x417b9, 0x0}, +- {0x417ba, 0x0}, +- {0x417bb, 0x0}, +- {0x417bc, 0x0}, +- {0x417bd, 0x0}, +- {0x417be, 0x0}, +- {0x417bf, 0x0}, +- {0x417c0, 0x0}, +- {0x417c1, 0x0}, +- {0x417c2, 0x0}, +- {0x417c3, 0x0}, +- {0x417c4, 0x0}, +- {0x417c5, 0x0}, +- {0x417c6, 0x0}, +- {0x417c7, 0x0}, +- {0x417c8, 0x0}, +- {0x417c9, 0x0}, +- {0x417ca, 0x0}, +- {0x417cb, 0x0}, +- {0x417cc, 0x0}, +- {0x417cd, 0x0}, +- {0x417ce, 0x0}, +- {0x417cf, 0x0}, +- {0x417d0, 0x0}, +- {0x417d1, 0x0}, +- {0x417d2, 0x0}, +- {0x417d3, 0x0}, +- {0x417d4, 0x0}, +- {0x417d5, 0x0}, +- {0x417d6, 0x0}, +- {0x417d7, 0x0}, +- {0x417d8, 0x0}, +- {0x417d9, 0x0}, +- {0x417da, 0x0}, +- {0x417db, 0x0}, +- {0x417dc, 0x0}, +- {0x417dd, 0x0}, +- {0x417de, 0x0}, +- {0x417df, 0x0}, +- {0x417e0, 0x0}, +- {0x417e1, 0x0}, +- {0x417e2, 0x0}, +- {0x417e3, 0x0}, +- {0x417e4, 0x0}, +- {0x417e5, 0x0}, +- {0x417e6, 0x0}, +- {0x417e7, 0x0}, +- {0x417e8, 0x0}, +- {0x417e9, 0x0}, +- {0x417ea, 0x0}, +- {0x417eb, 0x0}, +- {0x417ec, 0x0}, +- {0x417ed, 0x0}, +- {0x417ee, 0x0}, +- {0x417ef, 0x0}, +- {0x417f0, 0x0}, +- {0x417f1, 0x0}, +- {0x417f2, 0x0}, +- {0x417f3, 0x0}, +- {0x417f4, 0x0}, +- {0x417f5, 0x0}, +- {0x417f6, 0x0}, +- {0x417f7, 0x0}, +- {0x417f8, 0x0}, +- {0x417f9, 0x0}, +- {0x417fa, 0x0}, +- {0x417fb, 0x0}, +- {0x417fc, 0x0}, +- {0x417fd, 0x0}, +- {0x417fe, 0x0}, +- {0x417ff, 0x0}, +- {0x41800, 0x0}, +- {0x41801, 0x0}, +- {0x41802, 0x0}, +- {0x41803, 0x0}, +- {0x41804, 0x0}, +- {0x41805, 0x0}, +- {0x41806, 0x0}, +- {0x41807, 0x0}, +- {0x41808, 0x0}, +- {0x41809, 0x0}, +- {0x4180a, 0x0}, +- {0x4180b, 0x0}, +- {0x4180c, 0x0}, +- {0x4180d, 0x0}, +- {0x4180e, 0x0}, +- {0x4180f, 0x0}, +- {0x41810, 0x0}, +- {0x41811, 0x0}, +- {0x41812, 0x0}, +- {0x41813, 0x0}, +- {0x41814, 0x0}, +- {0x41815, 0x0}, +- {0x41816, 0x0}, +- {0x41817, 0x0}, +- {0x41818, 0x0}, +- {0x41819, 0x0}, +- {0x4181a, 0x0}, +- {0x4181b, 0x0}, +- {0x4181c, 0x0}, +- {0x4181d, 0x0}, +- {0x4181e, 0x0}, +- {0x4181f, 0x0}, +- {0x41820, 0x0}, +- {0x41821, 0x0}, +- {0x41822, 0x0}, +- {0x41823, 0x0}, +- {0x41824, 0x0}, +- {0x41825, 0x0}, +- {0x41826, 0x0}, +- {0x41827, 0x0}, +- {0x41828, 0x0}, +- {0x41829, 0x0}, +- {0x4182a, 0x0}, +- {0x4182b, 0x0}, +- {0x4182c, 0x0}, +- {0x4182d, 0x0}, +- {0x4182e, 0x0}, +- {0x4182f, 0x0}, +- {0x41830, 0x0}, +- {0x41831, 0x0}, +- {0x41832, 0x0}, +- {0x41833, 0x0}, +- {0x41834, 0x0}, +- {0x41835, 0x0}, +- {0x41836, 0x0}, +- {0x41837, 0x0}, +- {0x41838, 0x0}, +- {0x41839, 0x0}, +- {0x4183a, 0x0}, +- {0x4183b, 0x0}, +- {0x4183c, 0x0}, +- {0x4183d, 0x0}, +- {0x4183e, 0x0}, +- {0x4183f, 0x0}, +- {0x41840, 0x0}, +- {0x41841, 0x0}, +- {0x41842, 0x0}, +- {0x41843, 0x0}, +- {0x41844, 0x0}, +- {0x41845, 0x0}, +- {0x41846, 0x0}, +- {0x41847, 0x0}, +- {0x41848, 0x0}, +- {0x41849, 0x0}, +- {0x4184a, 0x0}, +- {0x4184b, 0x0}, +- {0x4184c, 0x0}, +- {0x4184d, 0x0}, +- {0x4184e, 0x0}, +- {0x4184f, 0x0}, +- {0x41850, 0x0}, +- {0x41851, 0x0}, +- {0x41852, 0x0}, +- {0x41853, 0x0}, +- {0x41854, 0x0}, +- {0x41855, 0x0}, +- {0x41856, 0x0}, +- {0x41857, 0x0}, +- {0x41858, 0x0}, +- {0x41859, 0x0}, +- {0x4185a, 0x0}, +- {0x4185b, 0x0}, +- {0x4185c, 0x0}, +- {0x4185d, 0x0}, +- {0x4185e, 0x0}, +- {0x4185f, 0x0}, +- {0x41860, 0x0}, +- {0x41861, 0x0}, +- {0x41862, 0x0}, +- {0x41863, 0x0}, +- {0x41864, 0x0}, +- {0x41865, 0x0}, +- {0x41866, 0x0}, +- {0x41867, 0x0}, +- {0x41868, 0x0}, +- {0x41869, 0x0}, +- {0x4186a, 0x0}, +- {0x4186b, 0x0}, +- {0x4186c, 0x0}, +- {0x4186d, 0x0}, +- {0x4186e, 0x0}, +- {0x4186f, 0x0}, +- {0x41870, 0x0}, +- {0x41871, 0x0}, +- {0x41872, 0x0}, +- {0x41873, 0x0}, +- {0x41874, 0x0}, +- {0x41875, 0x0}, +- {0x41876, 0x0}, +- {0x41877, 0x0}, +- {0x41878, 0x0}, +- {0x41879, 0x0}, +- {0x4187a, 0x0}, +- {0x4187b, 0x0}, +- {0x4187c, 0x0}, +- {0x4187d, 0x0}, +- {0x4187e, 0x0}, +- {0x4187f, 0x0}, +- {0x41880, 0x0}, +- {0x41881, 0x0}, +- {0x41882, 0x0}, +- {0x41883, 0x0}, +- {0x41884, 0x0}, +- {0x41885, 0x0}, +- {0x41886, 0x0}, +- {0x41887, 0x0}, +- {0x41888, 0x0}, +- {0x41889, 0x0}, +- {0x4188a, 0x0}, +- {0x4188b, 0x0}, +- {0x4188c, 0x0}, +- {0x4188d, 0x0}, +- {0x4188e, 0x0}, +- {0x4188f, 0x0}, +- {0x41890, 0x0}, +- {0x41891, 0x0}, +- {0x41892, 0x0}, +- {0x41893, 0x0}, +- {0x41894, 0x0}, +- {0x41895, 0x0}, +- {0x41896, 0x0}, +- {0x41897, 0x0}, +- {0x41898, 0x0}, +- {0x41899, 0x0}, +- {0x4189a, 0x0}, +- {0x4189b, 0x0}, +- {0x4189c, 0x0}, +- {0x4189d, 0x0}, +- {0x4189e, 0x0}, +- {0x4189f, 0x0}, +- {0x418a0, 0x0}, +- {0x418a1, 0x0}, +- {0x418a2, 0x0}, +- {0x418a3, 0x0}, +- {0x418a4, 0x0}, +- {0x418a5, 0x0}, +- {0x418a6, 0x0}, +- {0x418a7, 0x0}, +- {0x418a8, 0x0}, +- {0x418a9, 0x0}, +- {0x418aa, 0x0}, +- {0x418ab, 0x0}, +- {0x418ac, 0x0}, +- {0x418ad, 0x0}, +- {0x418ae, 0x0}, +- {0x418af, 0x0}, +- {0x418b0, 0x0}, +- {0x418b1, 0x0}, +- {0x418b2, 0x0}, +- {0x418b3, 0x0}, +- {0x418b4, 0x0}, +- {0x418b5, 0x0}, +- {0x418b6, 0x0}, +- {0x418b7, 0x0}, +- {0x418b8, 0x0}, +- {0x418b9, 0x0}, +- {0x418ba, 0x0}, +- {0x418bb, 0x0}, +- {0x418bc, 0x0}, +- {0x418bd, 0x0}, +- {0x418be, 0x0}, +- {0x418bf, 0x0}, +- {0x418c0, 0x0}, +- {0x418c1, 0x0}, +- {0x418c2, 0x0}, +- {0x418c3, 0x0}, +- {0x418c4, 0x0}, +- {0x418c5, 0x0}, +- {0x418c6, 0x0}, +- {0x418c7, 0x0}, +- {0x418c8, 0x0}, +- {0x418c9, 0x0}, +- {0x418ca, 0x0}, +- {0x418cb, 0x0}, +- {0x418cc, 0x0}, +- {0x418cd, 0x0}, +- {0x418ce, 0x0}, +- {0x418cf, 0x0}, +- {0x418d0, 0x0}, +- {0x418d1, 0x0}, +- {0x418d2, 0x0}, +- {0x418d3, 0x0}, +- {0x418d4, 0x0}, +- {0x418d5, 0x0}, +- {0x418d6, 0x0}, +- {0x418d7, 0x0}, +- {0x418d8, 0x0}, +- {0x418d9, 0x0}, +- {0x418da, 0x0}, +- {0x418db, 0x0}, +- {0x418dc, 0x0}, +- {0x418dd, 0x0}, +- {0x418de, 0x0}, +- {0x418df, 0x0}, +- {0x418e0, 0x0}, +- {0x418e1, 0x0}, +- {0x418e2, 0x0}, +- {0x418e3, 0x0}, +- {0x418e4, 0x0}, +- {0x418e5, 0x0}, +- {0x418e6, 0x0}, +- {0x418e7, 0x0}, +- {0x418e8, 0x0}, +- {0x418e9, 0x0}, +- {0x418ea, 0x0}, +- {0x418eb, 0x0}, +- {0x418ec, 0x0}, +- {0x418ed, 0x0}, +- {0x418ee, 0x0}, +- {0x418ef, 0x0}, +- {0x418f0, 0x0}, +- {0x418f1, 0x0}, +- {0x418f2, 0x0}, +- {0x418f3, 0x0}, +- {0x418f4, 0x0}, +- {0x418f5, 0x0}, +- {0x418f6, 0x0}, +- {0x418f7, 0x0}, +- {0x418f8, 0x0}, +- {0x418f9, 0x0}, +- {0x418fa, 0x0}, +- {0x418fb, 0x0}, +- {0x418fc, 0x0}, +- {0x418fd, 0x0}, +- {0x418fe, 0x0}, +- {0x418ff, 0x0}, +- {0x41900, 0x0}, +- {0x41901, 0x0}, +- {0x41902, 0x0}, +- {0x41903, 0x0}, +- {0x41904, 0x0}, +- {0x41905, 0x0}, +- {0x41906, 0x0}, +- {0x41907, 0x0}, +- {0x41908, 0x0}, +- {0x41909, 0x0}, +- {0x4190a, 0x0}, +- {0x4190b, 0x0}, +- {0x4190c, 0x0}, +- {0x4190d, 0x0}, +- {0x4190e, 0x0}, +- {0x4190f, 0x0}, +- {0x41910, 0x0}, +- {0x41911, 0x0}, +- {0x41912, 0x0}, +- {0x41913, 0x0}, +- {0x41914, 0x0}, +- {0x41915, 0x0}, +- {0x41916, 0x0}, +- {0x41917, 0x0}, +- {0x41918, 0x0}, +- {0x41919, 0x0}, +- {0x4191a, 0x0}, +- {0x4191b, 0x0}, +- {0x4191c, 0x0}, +- {0x4191d, 0x0}, +- {0x4191e, 0x0}, +- {0x4191f, 0x0}, +- {0x41920, 0x0}, +- {0x41921, 0x0}, +- {0x41922, 0x0}, +- {0x41923, 0x0}, +- {0x41924, 0x0}, +- {0x41925, 0x0}, +- {0x41926, 0x0}, +- {0x41927, 0x0}, +- {0x41928, 0x0}, +- {0x41929, 0x0}, +- {0x4192a, 0x0}, +- {0x4192b, 0x0}, +- {0x4192c, 0x0}, +- {0x4192d, 0x0}, +- {0x4192e, 0x0}, +- {0x4192f, 0x0}, +- {0x41930, 0x0}, +- {0x41931, 0x0}, +- {0x41932, 0x0}, +- {0x41933, 0x0}, +- {0x41934, 0x0}, +- {0x41935, 0x0}, +- {0x41936, 0x0}, +- {0x41937, 0x0}, +- {0x41938, 0x0}, +- {0x41939, 0x0}, +- {0x4193a, 0x0}, +- {0x4193b, 0x0}, +- {0x4193c, 0x0}, +- {0x4193d, 0x0}, +- {0x4193e, 0x0}, +- {0x4193f, 0x0}, +- {0x41940, 0x0}, +- {0x41941, 0x0}, +- {0x41942, 0x0}, +- {0x41943, 0x0}, +- {0x41944, 0x0}, +- {0x41945, 0x0}, +- {0x41946, 0x0}, +- {0x41947, 0x0}, +- {0x41948, 0x0}, +- {0x41949, 0x0}, +- {0x4194a, 0x0}, +- {0x4194b, 0x0}, +- {0x4194c, 0x0}, +- {0x4194d, 0x0}, +- {0x4194e, 0x0}, +- {0x4194f, 0x0}, +- {0x41950, 0x0}, +- {0x41951, 0x0}, +- {0x41952, 0x0}, +- {0x41953, 0x0}, +- {0x41954, 0x0}, +- {0x41955, 0x0}, +- {0x41956, 0x0}, +- {0x41957, 0x0}, +- {0x41958, 0x0}, +- {0x41959, 0x0}, +- {0x4195a, 0x0}, +- {0x4195b, 0x0}, +- {0x4195c, 0x0}, +- {0x4195d, 0x0}, +- {0x4195e, 0x0}, +- {0x4195f, 0x0}, +- {0x41960, 0x0}, +- {0x41961, 0x0}, +- {0x41962, 0x0}, +- {0x41963, 0x0}, +- {0x41964, 0x0}, +- {0x41965, 0x0}, +- {0x41966, 0x0}, +- {0x41967, 0x0}, +- {0x41968, 0x0}, +- {0x41969, 0x0}, +- {0x4196a, 0x0}, +- {0x4196b, 0x0}, +- {0x4196c, 0x0}, +- {0x4196d, 0x0}, +- {0x4196e, 0x0}, +- {0x4196f, 0x0}, +- {0x41970, 0x0}, +- {0x41971, 0x0}, +- {0x41972, 0x0}, +- {0x41973, 0x0}, +- {0x41974, 0x0}, +- {0x41975, 0x0}, +- {0x41976, 0x0}, +- {0x41977, 0x0}, +- {0x41978, 0x0}, +- {0x41979, 0x0}, +- {0x4197a, 0x0}, +- {0x4197b, 0x0}, +- {0x4197c, 0x0}, +- {0x4197d, 0x0}, +- {0x4197e, 0x0}, +- {0x4197f, 0x0}, +- {0x41980, 0x0}, +- {0x41981, 0x0}, +- {0x41982, 0x0}, +- {0x41983, 0x0}, +- {0x41984, 0x0}, +- {0x41985, 0x0}, +- {0x41986, 0x0}, +- {0x41987, 0x0}, +- {0x41988, 0x0}, +- {0x41989, 0x0}, +- {0x4198a, 0x0}, +- {0x4198b, 0x0}, +- {0x4198c, 0x0}, +- {0x4198d, 0x0}, +- {0x4198e, 0x0}, +- {0x4198f, 0x0}, +- {0x41990, 0x0}, +- {0x41991, 0x0}, +- {0x41992, 0x0}, +- {0x41993, 0x0}, +- {0x41994, 0x0}, +- {0x41995, 0x0}, +- {0x41996, 0x0}, +- {0x41997, 0x0}, +- {0x41998, 0x0}, +- {0x41999, 0x0}, +- {0x4199a, 0x0}, +- {0x4199b, 0x0}, +- {0x4199c, 0x0}, +- {0x4199d, 0x0}, +- {0x4199e, 0x0}, +- {0x4199f, 0x0}, +- {0x419a0, 0x0}, +- {0x419a1, 0x0}, +- {0x419a2, 0x0}, +- {0x419a3, 0x0}, +- {0x419a4, 0x0}, +- {0x419a5, 0x0}, +- {0x419a6, 0x0}, +- {0x419a7, 0x0}, +- {0x419a8, 0x0}, +- {0x419a9, 0x0}, +- {0x419aa, 0x0}, +- {0x419ab, 0x0}, +- {0x419ac, 0x0}, +- {0x419ad, 0x0}, +- {0x419ae, 0x0}, +- {0x419af, 0x0}, +- {0x419b0, 0x0}, +- {0x419b1, 0x0}, +- {0x419b2, 0x0}, +- {0x419b3, 0x0}, +- {0x419b4, 0x0}, +- {0x419b5, 0x0}, +- {0x419b6, 0x0}, +- {0x419b7, 0x0}, +- {0x419b8, 0x0}, +- {0x419b9, 0x0}, +- {0x419ba, 0x0}, +- {0x419bb, 0x0}, +- {0x419bc, 0x0}, +- {0x419bd, 0x0}, +- {0x419be, 0x0}, +- {0x419bf, 0x0}, +- {0x419c0, 0x0}, +- {0x419c1, 0x0}, +- {0x419c2, 0x0}, +- {0x419c3, 0x0}, +- {0x419c4, 0x0}, +- {0x419c5, 0x0}, +- {0x419c6, 0x0}, +- {0x419c7, 0x0}, +- {0x419c8, 0x0}, +- {0x419c9, 0x0}, +- {0x419ca, 0x0}, +- {0x419cb, 0x0}, +- {0x419cc, 0x0}, +- {0x419cd, 0x0}, +- {0x419ce, 0x0}, +- {0x419cf, 0x0}, +- {0x419d0, 0x0}, +- {0x419d1, 0x0}, +- {0x419d2, 0x0}, +- {0x419d3, 0x0}, +- {0x419d4, 0x0}, +- {0x419d5, 0x0}, +- {0x419d6, 0x0}, +- {0x419d7, 0x0}, +- {0x419d8, 0x0}, +- {0x419d9, 0x0}, +- {0x419da, 0x0}, +- {0x419db, 0x0}, +- {0x419dc, 0x0}, +- {0x419dd, 0x0}, +- {0x419de, 0x0}, +- {0x419df, 0x0}, +- {0x419e0, 0x0}, +- {0x419e1, 0x0}, +- {0x419e2, 0x0}, +- {0x419e3, 0x0}, +- {0x419e4, 0x0}, +- {0x419e5, 0x0}, +- {0x419e6, 0x0}, +- {0x419e7, 0x0}, +- {0x419e8, 0x0}, +- {0x419e9, 0x0}, +- {0x419ea, 0x0}, +- {0x419eb, 0x0}, +- {0x419ec, 0x0}, +- {0x419ed, 0x0}, +- {0x419ee, 0x0}, +- {0x419ef, 0x0}, +- {0x419f0, 0x0}, +- {0x419f1, 0x0}, +- {0x419f2, 0x0}, +- {0x419f3, 0x0}, +- {0x419f4, 0x0}, +- {0x419f5, 0x0}, +- {0x419f6, 0x0}, +- {0x419f7, 0x0}, +- {0x419f8, 0x0}, +- {0x419f9, 0x0}, +- {0x419fa, 0x0}, +- {0x419fb, 0x0}, +- {0x419fc, 0x0}, +- {0x419fd, 0x0}, +- {0x419fe, 0x0}, +- {0x419ff, 0x0}, +- {0x41a00, 0x0}, +- {0x41a01, 0x0}, +- {0x41a02, 0x0}, +- {0x41a03, 0x0}, +- {0x41a04, 0x0}, +- {0x41a05, 0x0}, +- {0x41a06, 0x0}, +- {0x41a07, 0x0}, +- {0x41a08, 0x0}, +- {0x41a09, 0x0}, +- {0x41a0a, 0x0}, +- {0x41a0b, 0x0}, +- {0x41a0c, 0x0}, +- {0x41a0d, 0x0}, +- {0x41a0e, 0x0}, +- {0x41a0f, 0x0}, +- {0x41a10, 0x0}, +- {0x41a11, 0x0}, +- {0x41a12, 0x0}, +- {0x41a13, 0x0}, +- {0x41a14, 0x0}, +- {0x41a15, 0x0}, +- {0x41a16, 0x0}, +- {0x41a17, 0x0}, +- {0x41a18, 0x0}, +- {0x41a19, 0x0}, +- {0x41a1a, 0x0}, +- {0x41a1b, 0x0}, +- {0x41a1c, 0x0}, +- {0x41a1d, 0x0}, +- {0x41a1e, 0x0}, +- {0x41a1f, 0x0}, +- {0x41a20, 0x0}, +- {0x41a21, 0x0}, +- {0x41a22, 0x0}, +- {0x41a23, 0x0}, +- {0x41a24, 0x0}, +- {0x41a25, 0x0}, +- {0x41a26, 0x0}, +- {0x41a27, 0x0}, +- {0x41a28, 0x0}, +- {0x41a29, 0x0}, +- {0x41a2a, 0x0}, +- {0x41a2b, 0x0}, +- {0x41a2c, 0x0}, +- {0x41a2d, 0x0}, +- {0x41a2e, 0x0}, +- {0x41a2f, 0x0}, +- {0x41a30, 0x0}, +- {0x41a31, 0x0}, +- {0x41a32, 0x0}, +- {0x41a33, 0x0}, +- {0x41a34, 0x0}, +- {0x41a35, 0x0}, +- {0x41a36, 0x0}, +- {0x41a37, 0x0}, +- {0x41a38, 0x0}, +- {0x41a39, 0x0}, +- {0x41a3a, 0x0}, +- {0x41a3b, 0x0}, +- {0x41a3c, 0x0}, +- {0x41a3d, 0x0}, +- {0x41a3e, 0x0}, +- {0x41a3f, 0x0}, +- {0x41a40, 0x0}, +- {0x41a41, 0x0}, +- {0x41a42, 0x0}, +- {0x41a43, 0x0}, +- {0x41a44, 0x0}, +- {0x41a45, 0x0}, +- {0x41a46, 0x0}, +- {0x41a47, 0x0}, +- {0x41a48, 0x0}, +- {0x41a49, 0x0}, +- {0x41a4a, 0x0}, +- {0x41a4b, 0x0}, +- {0x41a4c, 0x0}, +- {0x41a4d, 0x0}, +- {0x41a4e, 0x0}, +- {0x41a4f, 0x0}, +- {0x41a50, 0x0}, +- {0x41a51, 0x0}, +- {0x41a52, 0x0}, +- {0x41a53, 0x0}, +- {0x41a54, 0x0}, +- {0x41a55, 0x0}, +- {0x41a56, 0x0}, +- {0x41a57, 0x0}, +- {0x41a58, 0x0}, +- {0x41a59, 0x0}, +- {0x41a5a, 0x0}, +- {0x41a5b, 0x0}, +- {0x41a5c, 0x0}, +- {0x41a5d, 0x0}, +- {0x41a5e, 0x0}, +- {0x41a5f, 0x0}, +- {0x41a60, 0x0}, +- {0x41a61, 0x0}, +- {0x41a62, 0x0}, +- {0x41a63, 0x0}, +- {0x41a64, 0x0}, +- {0x41a65, 0x0}, +- {0x41a66, 0x0}, +- {0x41a67, 0x0}, +- {0x41a68, 0x0}, +- {0x41a69, 0x0}, +- {0x41a6a, 0x0}, +- {0x41a6b, 0x0}, +- {0x41a6c, 0x0}, +- {0x41a6d, 0x0}, +- {0x41a6e, 0x0}, +- {0x41a6f, 0x0}, +- {0x41a70, 0x0}, +- {0x41a71, 0x0}, +- {0x41a72, 0x0}, +- {0x41a73, 0x0}, +- {0x41a74, 0x0}, +- {0x41a75, 0x0}, +- {0x41a76, 0x0}, +- {0x41a77, 0x0}, +- {0x41a78, 0x0}, +- {0x41a79, 0x0}, +- {0x41a7a, 0x0}, +- {0x41a7b, 0x0}, +- {0x41a7c, 0x0}, +- {0x41a7d, 0x0}, +- {0x41a7e, 0x0}, +- {0x41a7f, 0x0}, +- {0x41a80, 0x0}, +- {0x41a81, 0x0}, +- {0x41a82, 0x0}, +- {0x41a83, 0x0}, +- {0x41a84, 0x0}, +- {0x41a85, 0x0}, +- {0x41a86, 0x0}, +- {0x41a87, 0x0}, +- {0x41a88, 0x0}, +- {0x41a89, 0x0}, +- {0x41a8a, 0x0}, +- {0x41a8b, 0x0}, +- {0x41a8c, 0x0}, +- {0x41a8d, 0x0}, +- {0x41a8e, 0x0}, +- {0x41a8f, 0x0}, +- {0x41a90, 0x0}, +- {0x41a91, 0x0}, +- {0x41a92, 0x0}, +- {0x41a93, 0x0}, +- {0x41a94, 0x0}, +- {0x41a95, 0x0}, +- {0x41a96, 0x0}, +- {0x41a97, 0x0}, +- {0x41a98, 0x0}, +- {0x41a99, 0x0}, +- {0x41a9a, 0x0}, +- {0x41a9b, 0x0}, +- {0x41a9c, 0x0}, +- {0x41a9d, 0x0}, +- {0x41a9e, 0x0}, +- {0x41a9f, 0x0}, +- {0x41aa0, 0x0}, +- {0x41aa1, 0x0}, +- {0x41aa2, 0x0}, +- {0x41aa3, 0x0}, +- {0x41aa4, 0x0}, +- {0x41aa5, 0x0}, +- {0x41aa6, 0x0}, +- {0x41aa7, 0x0}, +- {0x41aa8, 0x0}, +- {0x41aa9, 0x0}, +- {0x41aaa, 0x0}, +- {0x41aab, 0x0}, +- {0x41aac, 0x0}, +- {0x41aad, 0x0}, +- {0x41aae, 0x0}, +- {0x41aaf, 0x0}, +- {0x41ab0, 0x0}, +- {0x41ab1, 0x0}, +- {0x41ab2, 0x0}, +- {0x41ab3, 0x0}, +- {0x41ab4, 0x0}, +- {0x41ab5, 0x0}, +- {0x41ab6, 0x0}, +- {0x41ab7, 0x0}, +- {0x41ab8, 0x0}, +- {0x41ab9, 0x0}, +- {0x41aba, 0x0}, +- {0x41abb, 0x0}, +- {0x41abc, 0x0}, +- {0x41abd, 0x0}, +- {0x41abe, 0x0}, +- {0x41abf, 0x0}, +- {0x41ac0, 0x0}, +- {0x41ac1, 0x0}, +- {0x41ac2, 0x0}, +- {0x41ac3, 0x0}, +- {0x41ac4, 0x0}, +- {0x41ac5, 0x0}, +- {0x41ac6, 0x0}, +- {0x41ac7, 0x0}, +- {0x41ac8, 0x0}, +- {0x41ac9, 0x0}, +- {0x41aca, 0x0}, +- {0x41acb, 0x0}, +- {0x41acc, 0x0}, +- {0x41acd, 0x0}, +- {0x41ace, 0x0}, +- {0x41acf, 0x0}, +- {0x41ad0, 0x0}, +- {0x41ad1, 0x0}, +- {0x41ad2, 0x0}, +- {0x41ad3, 0x0}, +- {0x41ad4, 0x0}, +- {0x41ad5, 0x0}, +- {0x41ad6, 0x0}, +- {0x41ad7, 0x0}, +- {0x41ad8, 0x0}, +- {0x41ad9, 0x0}, +- {0x41ada, 0x0}, +- {0x41adb, 0x0}, +- {0x41adc, 0x0}, +- {0x41add, 0x0}, +- {0x41ade, 0x0}, +- {0x41adf, 0x0}, +- {0x41ae0, 0x0}, +- {0x41ae1, 0x0}, +- {0x41ae2, 0x0}, +- {0x41ae3, 0x0}, +- {0x41ae4, 0x0}, +- {0x41ae5, 0x0}, +- {0x41ae6, 0x0}, +- {0x41ae7, 0x0}, +- {0x41ae8, 0x0}, +- {0x41ae9, 0x0}, +- {0x41aea, 0x0}, +- {0x41aeb, 0x0}, +- {0x41aec, 0x0}, +- {0x41aed, 0x0}, +- {0x41aee, 0x0}, +- {0x41aef, 0x0}, +- {0x41af0, 0x0}, +- {0x41af1, 0x0}, +- {0x41af2, 0x0}, +- {0x41af3, 0x0}, +- {0x41af4, 0x0}, +- {0x41af5, 0x0}, +- {0x41af6, 0x0}, +- {0x41af7, 0x0}, +- {0x41af8, 0x0}, +- {0x41af9, 0x0}, +- {0x41afa, 0x0}, +- {0x41afb, 0x0}, +- {0x41afc, 0x0}, +- {0x41afd, 0x0}, +- {0x41afe, 0x0}, +- {0x41aff, 0x0}, +- {0x41b00, 0x0}, +- {0x41b01, 0x0}, +- {0x41b02, 0x0}, +- {0x41b03, 0x0}, +- {0x41b04, 0x0}, +- {0x41b05, 0x0}, +- {0x41b06, 0x0}, +- {0x41b07, 0x0}, +- {0x41b08, 0x0}, +- {0x41b09, 0x0}, +- {0x41b0a, 0x0}, +- {0x41b0b, 0x0}, +- {0x41b0c, 0x0}, +- {0x41b0d, 0x0}, +- {0x41b0e, 0x0}, +- {0x41b0f, 0x0}, +- {0x41b10, 0x0}, +- {0x41b11, 0x0}, +- {0x41b12, 0x0}, +- {0x41b13, 0x0}, +- {0x41b14, 0x0}, +- {0x41b15, 0x0}, +- {0x41b16, 0x0}, +- {0x41b17, 0x0}, +- {0x41b18, 0x0}, +- {0x41b19, 0x0}, +- {0x41b1a, 0x0}, +- {0x41b1b, 0x0}, +- {0x41b1c, 0x0}, +- {0x41b1d, 0x0}, +- {0x41b1e, 0x0}, +- {0x41b1f, 0x0}, +- {0x41b20, 0x0}, +- {0x41b21, 0x0}, +- {0x41b22, 0x0}, +- {0x41b23, 0x0}, +- {0x41b24, 0x0}, +- {0x41b25, 0x0}, +- {0x41b26, 0x0}, +- {0x41b27, 0x0}, +- {0x41b28, 0x0}, +- {0x41b29, 0x0}, +- {0x41b2a, 0x0}, +- {0x41b2b, 0x0}, +- {0x41b2c, 0x0}, +- {0x41b2d, 0x0}, +- {0x41b2e, 0x0}, +- {0x41b2f, 0x0}, +- {0x41b30, 0x0}, +- {0x41b31, 0x0}, +- {0x41b32, 0x0}, +- {0x41b33, 0x0}, +- {0x41b34, 0x0}, +- {0x41b35, 0x0}, +- {0x41b36, 0x0}, +- {0x41b37, 0x0}, +- {0x41b38, 0x0}, +- {0x41b39, 0x0}, +- {0x41b3a, 0x0}, +- {0x41b3b, 0x0}, +- {0x41b3c, 0x0}, +- {0x41b3d, 0x0}, +- {0x41b3e, 0x0}, +- {0x41b3f, 0x0}, +- {0x41b40, 0x0}, +- {0x41b41, 0x0}, +- {0x41b42, 0x0}, +- {0x41b43, 0x0}, +- {0x41b44, 0x0}, +- {0x41b45, 0x0}, +- {0x41b46, 0x0}, +- {0x41b47, 0x0}, +- {0x41b48, 0x0}, +- {0x41b49, 0x0}, +- {0x41b4a, 0x0}, +- {0x41b4b, 0x0}, +- {0x41b4c, 0x0}, +- {0x41b4d, 0x0}, +- {0x41b4e, 0x0}, +- {0x41b4f, 0x0}, +- {0x41b50, 0x0}, +- {0x41b51, 0x0}, +- {0x41b52, 0x0}, +- {0x41b53, 0x0}, +- {0x41b54, 0x0}, +- {0x41b55, 0x0}, +- {0x41b56, 0x0}, +- {0x41b57, 0x0}, +- {0x41b58, 0x0}, +- {0x41b59, 0x0}, +- {0x41b5a, 0x0}, +- {0x41b5b, 0x0}, +- {0x41b5c, 0x0}, +- {0x41b5d, 0x0}, +- {0x41b5e, 0x0}, +- {0x41b5f, 0x0}, +- {0x41b60, 0x0}, +- {0x41b61, 0x0}, +- {0x41b62, 0x0}, +- {0x41b63, 0x0}, +- {0x41b64, 0x0}, +- {0x41b65, 0x0}, +- {0x41b66, 0x0}, +- {0x41b67, 0x0}, +- {0x41b68, 0x0}, +- {0x41b69, 0x0}, +- {0x41b6a, 0x0}, +- {0x41b6b, 0x0}, +- {0x41b6c, 0x0}, +- {0x41b6d, 0x0}, +- {0x41b6e, 0x0}, +- {0x41b6f, 0x0}, +- {0x41b70, 0x0}, +- {0x41b71, 0x0}, +- {0x41b72, 0x0}, +- {0x41b73, 0x0}, +- {0x41b74, 0x0}, +- {0x41b75, 0x0}, +- {0x41b76, 0x0}, +- {0x41b77, 0x0}, +- {0x41b78, 0x0}, +- {0x41b79, 0x0}, +- {0x41b7a, 0x0}, +- {0x41b7b, 0x0}, +- {0x41b7c, 0x0}, +- {0x41b7d, 0x0}, +- {0x41b7e, 0x0}, +- {0x41b7f, 0x0}, +- {0x41b80, 0x0}, +- {0x41b81, 0x0}, +- {0x41b82, 0x0}, +- {0x41b83, 0x0}, +- {0x41b84, 0x0}, +- {0x41b85, 0x0}, +- {0x41b86, 0x0}, +- {0x41b87, 0x0}, +- {0x41b88, 0x0}, +- {0x41b89, 0x0}, +- {0x41b8a, 0x0}, +- {0x41b8b, 0x0}, +- {0x41b8c, 0x0}, +- {0x41b8d, 0x0}, +- {0x41b8e, 0x0}, +- {0x41b8f, 0x0}, +- {0x41b90, 0x0}, +- {0x41b91, 0x0}, +- {0x41b92, 0x0}, +- {0x41b93, 0x0}, +- {0x41b94, 0x0}, +- {0x41b95, 0x0}, +- {0x41b96, 0x0}, +- {0x41b97, 0x0}, +- {0x41b98, 0x0}, +- {0x41b99, 0x0}, +- {0x41b9a, 0x0}, +- {0x41b9b, 0x0}, +- {0x41b9c, 0x0}, +- {0x41b9d, 0x0}, +- {0x41b9e, 0x0}, +- {0x41b9f, 0x0}, +- {0x41ba0, 0x0}, +- {0x41ba1, 0x0}, +- {0x41ba2, 0x0}, +- {0x41ba3, 0x0}, +- {0x41ba4, 0x0}, +- {0x41ba5, 0x0}, +- {0x41ba6, 0x0}, +- {0x41ba7, 0x0}, +- {0x41ba8, 0x0}, +- {0x41ba9, 0x0}, +- {0x41baa, 0x0}, +- {0x41bab, 0x0}, +- {0x41bac, 0x0}, +- {0x41bad, 0x0}, +- {0x41bae, 0x0}, +- {0x41baf, 0x0}, +- {0x41bb0, 0x0}, +- {0x41bb1, 0x0}, +- {0x41bb2, 0x0}, +- {0x41bb3, 0x0}, +- {0x41bb4, 0x0}, +- {0x41bb5, 0x0}, +- {0x41bb6, 0x0}, +- {0x41bb7, 0x0}, +- {0x41bb8, 0x0}, +- {0x41bb9, 0x0}, +- {0x41bba, 0x0}, +- {0x41bbb, 0x0}, +- {0x41bbc, 0x0}, +- {0x41bbd, 0x0}, +- {0x41bbe, 0x0}, +- {0x41bbf, 0x0}, +- {0x41bc0, 0x0}, +- {0x41bc1, 0x0}, +- {0x41bc2, 0x0}, +- {0x41bc3, 0x0}, +- {0x41bc4, 0x0}, +- {0x41bc5, 0x0}, +- {0x41bc6, 0x0}, +- {0x41bc7, 0x0}, +- {0x41bc8, 0x0}, +- {0x41bc9, 0x0}, +- {0x41bca, 0x0}, +- {0x41bcb, 0x0}, +- {0x41bcc, 0x0}, +- {0x41bcd, 0x0}, +- {0x41bce, 0x0}, +- {0x41bcf, 0x0}, +- {0x41bd0, 0x0}, +- {0x41bd1, 0x0}, +- {0x41bd2, 0x0}, +- {0x41bd3, 0x0}, +- {0x41bd4, 0x0}, +- {0x41bd5, 0x0}, +- {0x41bd6, 0x0}, +- {0x41bd7, 0x0}, +- {0x41bd8, 0x0}, +- {0x41bd9, 0x0}, +- {0x41bda, 0x0}, +- {0x41bdb, 0x0}, +- {0x41bdc, 0x0}, +- {0x41bdd, 0x0}, +- {0x41bde, 0x0}, +- {0x41bdf, 0x0}, +- {0x41be0, 0x0}, +- {0x41be1, 0x0}, +- {0x41be2, 0x0}, +- {0x41be3, 0x0}, +- {0x41be4, 0x0}, +- {0x41be5, 0x0}, +- {0x41be6, 0x0}, +- {0x41be7, 0x0}, +- {0x41be8, 0x0}, +- {0x41be9, 0x0}, +- {0x41bea, 0x0}, +- {0x41beb, 0x0}, +- {0x41bec, 0x0}, +- {0x41bed, 0x0}, +- {0x41bee, 0x0}, +- {0x41bef, 0x0}, +- {0x41bf0, 0x0}, +- {0x41bf1, 0x0}, +- {0x41bf2, 0x0}, +- {0x41bf3, 0x0}, +- {0x41bf4, 0x0}, +- {0x41bf5, 0x0}, +- {0x41bf6, 0x0}, +- {0x41bf7, 0x0}, +- {0x41bf8, 0x0}, +- {0x41bf9, 0x0}, +- {0x41bfa, 0x0}, +- {0x41bfb, 0x0}, +- {0x41bfc, 0x0}, +- {0x41bfd, 0x0}, +- {0x41bfe, 0x0}, +- {0x41bff, 0x0}, +- {0x41c00, 0x0}, +- {0x41c01, 0x0}, +- {0x41c02, 0x0}, +- {0x41c03, 0x0}, +- {0x41c04, 0x0}, +- {0x41c05, 0x0}, +- {0x41c06, 0x0}, +- {0x41c07, 0x0}, +- {0x41c08, 0x0}, +- {0x41c09, 0x0}, +- {0x41c0a, 0x0}, +- {0x41c0b, 0x0}, +- {0x41c0c, 0x0}, +- {0x41c0d, 0x0}, +- {0x41c0e, 0x0}, +- {0x41c0f, 0x0}, +- {0x41c10, 0x0}, +- {0x41c11, 0x0}, +- {0x41c12, 0x0}, +- {0x41c13, 0x0}, +- {0x41c14, 0x0}, +- {0x41c15, 0x0}, +- {0x41c16, 0x0}, +- {0x41c17, 0x0}, +- {0x41c18, 0x0}, +- {0x41c19, 0x0}, +- {0x41c1a, 0x0}, +- {0x41c1b, 0x0}, +- {0x41c1c, 0x0}, +- {0x41c1d, 0x0}, +- {0x41c1e, 0x0}, +- {0x41c1f, 0x0}, +- {0x41c20, 0x0}, +- {0x41c21, 0x0}, +- {0x41c22, 0x0}, +- {0x41c23, 0x0}, +- {0x41c24, 0x0}, +- {0x41c25, 0x0}, +- {0x41c26, 0x0}, +- {0x41c27, 0x0}, +- {0x41c28, 0x0}, +- {0x41c29, 0x0}, +- {0x41c2a, 0x0}, +- {0x41c2b, 0x0}, +- {0x41c2c, 0x0}, +- {0x41c2d, 0x0}, +- {0x41c2e, 0x0}, +- {0x41c2f, 0x0}, +- {0x41c30, 0x0}, +- {0x41c31, 0x0}, +- {0x41c32, 0x0}, +- {0x41c33, 0x0}, +- {0x41c34, 0x0}, +- {0x41c35, 0x0}, +- {0x41c36, 0x0}, +- {0x41c37, 0x0}, +- {0x41c38, 0x0}, +- {0x41c39, 0x0}, +- {0x41c3a, 0x0}, +- {0x41c3b, 0x0}, +- {0x41c3c, 0x0}, +- {0x41c3d, 0x0}, +- {0x41c3e, 0x0}, +- {0x41c3f, 0x0}, +- {0x41c40, 0x0}, +- {0x41c41, 0x0}, +- {0x41c42, 0x0}, +- {0x41c43, 0x0}, +- {0x41c44, 0x0}, +- {0x41c45, 0x0}, +- {0x41c46, 0x0}, +- {0x41c47, 0x0}, +- {0x41c48, 0x0}, +- {0x41c49, 0x0}, +- {0x41c4a, 0x0}, +- {0x41c4b, 0x0}, +- {0x41c4c, 0x0}, +- {0x41c4d, 0x0}, +- {0x41c4e, 0x0}, +- {0x41c4f, 0x0}, +- {0x41c50, 0x0}, +- {0x41c51, 0x0}, +- {0x41c52, 0x0}, +- {0x41c53, 0x0}, +- {0x41c54, 0x0}, +- {0x41c55, 0x0}, +- {0x41c56, 0x0}, +- {0x41c57, 0x0}, +- {0x9002e, 0x0}, +- {0x9002f, 0x0}, +- {0x90030, 0x0}, +- {0x90031, 0x0}, +- {0x90032, 0x0}, +- {0x90033, 0x0}, +- {0x90034, 0x0}, +- {0x90035, 0x0}, +- {0x90036, 0x0}, +- {0x90037, 0x0}, +- {0x90038, 0x0}, +- {0x90039, 0x0}, +- {0x9003a, 0x0}, +- {0x9003b, 0x0}, +- {0x9003c, 0x0}, +- {0x9003d, 0x0}, +- {0x9003e, 0x0}, +- {0x9003f, 0x0}, +- {0x90040, 0x0}, +- {0x90041, 0x0}, +- {0x90042, 0x0}, +- {0x90043, 0x0}, +- {0x90044, 0x0}, +- {0x90045, 0x0}, +- {0x90046, 0x0}, +- {0x90047, 0x0}, +- {0x90048, 0x0}, +- {0x90049, 0x0}, +- {0x9004a, 0x0}, +- {0x9004b, 0x0}, +- {0x9004c, 0x0}, +- {0x9004d, 0x0}, +- {0x9004e, 0x0}, +- {0x9004f, 0x0}, +- {0x90050, 0x0}, +- {0x90051, 0x0}, +- {0x90052, 0x0}, +- {0x90053, 0x0}, +- {0x90054, 0x0}, +- {0x90055, 0x0}, +- {0x90056, 0x0}, +- {0x90057, 0x0}, +- {0x90058, 0x0}, +- {0x90059, 0x0}, +- {0x9005a, 0x0}, +- {0x9005b, 0x0}, +- {0x9005c, 0x0}, +- {0x9005d, 0x0}, +- {0x9005e, 0x0}, +- {0x9005f, 0x0}, +- {0x90060, 0x0}, +- {0x90061, 0x0}, +- {0x90062, 0x0}, +- {0x90063, 0x0}, +- {0x90064, 0x0}, +- {0x90065, 0x0}, +- {0x90066, 0x0}, +- {0x90067, 0x0}, +- {0x90068, 0x0}, +- {0x90069, 0x0}, +- {0x9006a, 0x0}, +- {0x9006b, 0x0}, +- {0x9006c, 0x0}, +- {0x9006d, 0x0}, +- {0x9006e, 0x0}, +- {0x9006f, 0x0}, +- {0x90070, 0x0}, +- {0x90071, 0x0}, +- {0x90072, 0x0}, +- {0x90073, 0x0}, +- {0x90074, 0x0}, +- {0x90075, 0x0}, +- {0x90076, 0x0}, +- {0x90077, 0x0}, +- {0x90078, 0x0}, +- {0x90079, 0x0}, +- {0x9007a, 0x0}, +- {0x9007b, 0x0}, +- {0x9007c, 0x0}, +- {0x9007d, 0x0}, +- {0x9007e, 0x0}, +- {0x9007f, 0x0}, +- {0x90080, 0x0}, +- {0x90081, 0x0}, +- {0x90082, 0x0}, +- {0x90083, 0x0}, +- {0x90084, 0x0}, +- {0x90085, 0x0}, +- {0x90086, 0x0}, +- {0x90087, 0x0}, +- {0x90088, 0x0}, +- {0x90089, 0x0}, +- {0x9008a, 0x0}, +- {0x9008b, 0x0}, +- {0x9008c, 0x0}, +- {0x9008d, 0x0}, +- {0x9008e, 0x0}, +- {0x9008f, 0x0}, +- {0x90090, 0x0}, +- {0x90091, 0x0}, +- {0x90092, 0x0}, +- {0x90093, 0x0}, +- {0x90094, 0x0}, +- {0x90095, 0x0}, +- {0x90096, 0x0}, +- {0x90097, 0x0}, +- {0x90098, 0x0}, +- {0x90099, 0x0}, +- {0x9009a, 0x0}, +- {0x9009b, 0x0}, +- {0x9009c, 0x0}, +- {0x9009d, 0x0}, +- {0x9009e, 0x0}, +- {0x9009f, 0x0}, +- {0x900a0, 0x0}, +- {0x900a1, 0x0}, +- {0x900a2, 0x0}, +- {0x900a3, 0x0}, +- {0x900a4, 0x0}, +- {0x900a5, 0x0}, +- {0x900a6, 0x0}, +- {0x900a7, 0x0}, +- {0x900a8, 0x0}, +- {0x900a9, 0x0}, +- {0x900aa, 0x0}, +- {0x900ab, 0x0}, +- {0x900ac, 0x0}, +- {0x900ad, 0x0}, +- {0x900ae, 0x0}, +- {0x900af, 0x0}, +- {0x900b0, 0x0}, +- {0x900b1, 0x0}, +- {0x900b2, 0x0}, +- {0x900b3, 0x0}, +- {0x900b4, 0x0}, +- {0x900b5, 0x0}, +- {0x900b6, 0x0}, +- {0x900b7, 0x0}, +- {0x900b8, 0x0}, +- {0x900b9, 0x0}, +- {0x900ba, 0x0}, +- {0x900bb, 0x0}, +- {0x900bc, 0x0}, +- {0x900bd, 0x0}, +- {0x900be, 0x0}, +- {0x900bf, 0x0}, +- {0x900c0, 0x0}, +- {0x900c1, 0x0}, +- {0x900c2, 0x0}, +- {0x900c3, 0x0}, +- {0x900c4, 0x0}, +- {0x900c5, 0x0}, +- {0x900c6, 0x0}, +- {0x900c7, 0x0}, +- {0x900c8, 0x0}, +- {0x900c9, 0x0}, +- {0x900ca, 0x0}, +- {0x900cb, 0x0}, +- {0x900cc, 0x0}, +- {0x900cd, 0x0}, +- {0x900ce, 0x0}, +- {0x900cf, 0x0}, +- {0x900d0, 0x0}, +- {0x900d1, 0x0}, +- {0x900d2, 0x0}, +- {0x900d3, 0x0}, +- {0x900d4, 0x0}, +- {0x900d5, 0x0}, +- {0x900d6, 0x0}, +- {0x900d7, 0x0}, +- {0x900d8, 0x0}, +- {0x900d9, 0x0}, +- {0x900da, 0x0}, +- {0x900db, 0x0}, +- {0x900dc, 0x0}, +- {0x900dd, 0x0}, +- {0x900de, 0x0}, +- {0x900df, 0x0}, +- {0x900e0, 0x0}, +- {0x900e1, 0x0}, +- {0x900e2, 0x0}, +- {0x900e3, 0x0}, +- {0x900e4, 0x0}, +- {0x900e5, 0x0}, +- {0x900e6, 0x0}, +- {0x900e7, 0x0}, +- {0x900e8, 0x0}, +- {0x900e9, 0x0}, +- {0x900ea, 0x0}, +- {0x900eb, 0x0}, +- {0x900ec, 0x0}, +- {0x900ed, 0x0}, +- {0x900ee, 0x0}, +- {0x900ef, 0x0}, +- {0x900f0, 0x0}, +- {0x900f1, 0x0}, +- {0x900f2, 0x0}, +- {0x900f3, 0x0}, +- {0x900f4, 0x0}, +- {0x900f5, 0x0}, +- {0x900f6, 0x0}, +- {0x900f7, 0x0}, +- {0x900f8, 0x0}, +- {0x900f9, 0x0}, +- {0x900fa, 0x0}, +- {0x900fb, 0x0}, +- {0x900fc, 0x0}, +- {0x900fd, 0x0}, +- {0x900fe, 0x0}, +- {0x900ff, 0x0}, +- {0x90100, 0x0}, +- {0x90101, 0x0}, +- {0x90102, 0x0}, +- {0x90103, 0x0}, +- {0x90104, 0x0}, +- {0x90105, 0x0}, +- {0x90106, 0x0}, +- {0x90107, 0x0}, +- {0x90108, 0x0}, +- {0x90109, 0x0}, +- {0x9010a, 0x0}, +- {0x9010b, 0x0}, +- {0x9010c, 0x0}, +- {0x9010d, 0x0}, +- {0x9010e, 0x0}, +- {0x9010f, 0x0}, +- {0x90110, 0x0}, +- {0x90111, 0x0}, +- {0x90112, 0x0}, +- {0x90113, 0x0}, +- {0x90114, 0x0}, +- {0x90115, 0x0}, +- {0x90116, 0x0}, +- {0x90117, 0x0}, +- {0x90118, 0x0}, +- {0x90119, 0x0}, +- {0x9011a, 0x0}, +- {0x9011b, 0x0}, +- {0x9011c, 0x0}, +- {0x9011d, 0x0}, +- {0x9011e, 0x0}, +- {0x9011f, 0x0}, +- {0x90120, 0x0}, +- {0x90121, 0x0}, +- {0x90122, 0x0}, +- {0x90123, 0x0}, +- {0x90124, 0x0}, +- {0x90125, 0x0}, +- {0x90126, 0x0}, +- {0x90127, 0x0}, +- {0x90128, 0x0}, +- {0x90129, 0x0}, +- {0x9012a, 0x0}, +- {0x9012b, 0x0}, +- {0x9012c, 0x0}, +- {0x9012d, 0x0}, +- {0x9012e, 0x0}, +- {0x9012f, 0x0}, +- {0x90130, 0x0}, +- {0x90131, 0x0}, +- {0x90132, 0x0}, +- {0x90133, 0x0}, +- {0x90134, 0x0}, +- {0x90135, 0x0}, +- {0x90136, 0x0}, +- {0x90137, 0x0}, +- {0x90138, 0x0}, +- {0x90139, 0x0}, +- {0x9013a, 0x0}, +- {0x9013b, 0x0}, +- {0x9013c, 0x0}, +- {0x9013d, 0x0}, +- {0x9013e, 0x0}, +- {0x9013f, 0x0}, +- {0x90140, 0x0}, +- {0x90141, 0x0}, +- {0x90142, 0x0}, +- {0x90143, 0x0}, +- {0x90144, 0x0}, +- {0x90145, 0x0}, +- {0x90146, 0x0}, +- {0x90147, 0x0}, +- {0x90148, 0x0}, +- {0x90149, 0x0}, +- {0x9014a, 0x0}, +- {0x9014b, 0x0}, +- {0x9014c, 0x0}, +- {0x9014d, 0x0}, +- {0x9014e, 0x0}, +- {0x9014f, 0x0}, +- {0x90150, 0x0}, +- {0x90151, 0x0}, +- {0x90152, 0x0}, +- {0x90153, 0x0}, +- {0x90154, 0x0}, +- {0x90155, 0x0}, +- {0x90156, 0x0}, +- {0x90157, 0x0}, +- {0x90158, 0x0}, +- {0x90159, 0x0}, +- {0x9015a, 0x0}, +- {0x9015b, 0x0}, +- {0x9015c, 0x0}, +- {0x9015d, 0x0}, +- {0x9015e, 0x0}, +- {0x9015f, 0x0}, +- {0x90160, 0x0}, +- {0x90161, 0x0}, +- {0x90162, 0x0}, +- {0x90163, 0x0}, +- {0x90164, 0x0}, +- {0x90165, 0x0}, +- {0x90166, 0x0}, +- {0x90167, 0x0}, +- {0x90168, 0x0}, +- {0x90169, 0x0}, +- {0x9016a, 0x0}, +- {0x9016b, 0x0}, +- {0x9016c, 0x0}, +- {0x9016d, 0x0}, +- {0x9016e, 0x0}, +- {0x9016f, 0x0}, +- {0x90170, 0x0}, +- {0x90171, 0x0}, +- {0x90172, 0x0}, +- {0x90173, 0x0}, +- {0x90174, 0x0}, +- {0x90175, 0x0}, +- {0x90176, 0x0}, +- {0x90177, 0x0}, +- {0x90178, 0x0}, +- {0x90179, 0x0}, +- {0x9017a, 0x0}, +- {0x9017b, 0x0}, +- {0x9017c, 0x0}, +- {0x9017d, 0x0}, +- {0x9017e, 0x0}, +- {0x9017f, 0x0}, +- {0x90180, 0x0}, +- {0x90181, 0x0}, +- {0x90182, 0x0}, +- {0x90183, 0x0}, +- {0x90184, 0x0}, +- {0x90185, 0x0}, +- {0x90186, 0x0}, +- {0x90187, 0x0}, +- {0x90188, 0x0}, +- {0x90189, 0x0}, +- {0x9018a, 0x0}, +- {0x9018b, 0x0}, +- {0x9018c, 0x0}, +- {0x9018d, 0x0}, +- {0x9018e, 0x0}, +- {0x9018f, 0x0}, +- {0x90190, 0x0}, +- {0x90191, 0x0}, +- {0x90192, 0x0}, +- {0x90193, 0x0}, +- {0x90194, 0x0}, +- {0x90195, 0x0}, +- {0x90196, 0x0}, +- {0x90197, 0x0}, +- {0x90198, 0x0}, +- {0x90199, 0x0}, +- {0x9019a, 0x0}, +- {0x9019b, 0x0}, +- {0x9019c, 0x0}, +- {0x9019d, 0x0}, +- {0x9019e, 0x0}, +- {0x9019f, 0x0}, +- {0x901a0, 0x0}, +- {0x901a1, 0x0}, +- {0x901a2, 0x0}, +- {0x901a3, 0x0}, +- {0x901a4, 0x0}, +- {0x901a5, 0x0}, +- {0x901a6, 0x0}, +- {0x901a7, 0x0}, +- {0x901a8, 0x0}, +- {0x901a9, 0x0}, +- {0x901aa, 0x0}, +- {0x901ab, 0x0}, +- {0x901ac, 0x0}, +- {0x901ad, 0x0}, +- {0x901ae, 0x0}, +- {0x901af, 0x0}, +- {0x901b0, 0x0}, +- {0x901b1, 0x0}, +- {0x901b2, 0x0}, +- {0x901b3, 0x0}, +- {0x901b4, 0x0}, +- {0x901b5, 0x0}, +- {0x901b6, 0x0}, +- {0x901b7, 0x0}, +- {0x901b8, 0x0}, +- {0x901b9, 0x0}, +- {0x901ba, 0x0}, +- {0x901bb, 0x0}, +- {0x901bc, 0x0}, +- {0x901bd, 0x0}, +- {0x901be, 0x0}, +- {0x901bf, 0x0}, +- {0x901c0, 0x0}, +- {0x901c1, 0x0}, +- {0x901c2, 0x0}, +- {0x901c3, 0x0}, +- {0x901c4, 0x0}, +- {0x901c5, 0x0}, +- {0x901c6, 0x0}, +- {0x901c7, 0x0}, +- {0x901c8, 0x0}, +- {0x901c9, 0x0}, +- {0x901ca, 0x0}, +- {0x901cb, 0x0}, +- {0x901cc, 0x0}, +- {0x901cd, 0x0}, +- {0x901ce, 0x0}, +- {0x901cf, 0x0}, +- {0x901d0, 0x0}, +- {0x901d1, 0x0}, +- {0x901d2, 0x0}, +- {0x901d3, 0x0}, +- {0x901d4, 0x0}, +- {0x901d5, 0x0}, +- {0x901d6, 0x0}, +- {0x901d7, 0x0}, +- {0x901d8, 0x0}, +- {0x901d9, 0x0}, +- {0x901da, 0x0}, +- {0x901db, 0x0}, +- {0x901dc, 0x0}, +- {0x901dd, 0x0}, +- {0x901de, 0x0}, +- {0x901df, 0x0}, +- {0x901e0, 0x0}, +- {0x901e1, 0x0}, +- {0x901e2, 0x0}, +- {0x901e3, 0x0}, +- {0x901e4, 0x0}, +- {0x901e5, 0x0}, +- {0x901e6, 0x0}, +- {0x901e7, 0x0}, +- {0x901e8, 0x0}, +- {0x901e9, 0x0}, +- {0x901ea, 0x0}, +- {0x901eb, 0x0}, +- {0x901ec, 0x0}, +- {0x901ed, 0x0}, +- {0x901ee, 0x0}, +- {0x901ef, 0x0}, +- {0x901f0, 0x0}, +- {0x901f1, 0x0}, +- {0x901f2, 0x0}, +- {0x901f3, 0x0}, +- {0x901f4, 0x0}, +- {0x901f5, 0x0}, +- {0x901f6, 0x0}, +- {0x901f7, 0x0}, +- {0x901f8, 0x0}, +- {0x901f9, 0x0}, +- {0x901fa, 0x0}, +- {0x901fb, 0x0}, +- {0x901fc, 0x0}, +- {0x901fd, 0x0}, +- {0x901fe, 0x0}, +- {0x901ff, 0x0}, +- {0x90200, 0x0}, +- {0x90201, 0x0}, +- {0x90202, 0x0}, +- {0x90203, 0x0}, +- {0x90204, 0x0}, +- {0x90205, 0x0}, +- {0x90206, 0x0}, +- {0x90207, 0x0}, +- {0x90208, 0x0}, +- {0x90209, 0x0}, +- {0x9020a, 0x0}, +- {0x9020b, 0x0}, +- {0x9020c, 0x0}, +- {0x9020d, 0x0}, +- {0x9020e, 0x0}, +- {0x9020f, 0x0}, +- {0x90210, 0x0}, +- {0x90211, 0x0}, +- {0x90212, 0x0}, +- {0x90213, 0x0}, +- {0x90214, 0x0}, +- {0x90215, 0x0}, +- {0x90216, 0x0}, +- {0x90217, 0x0}, +- {0x90218, 0x0}, +- {0x90219, 0x0}, +- {0x9021a, 0x0}, +- {0x9021b, 0x0}, +- {0x9021c, 0x0}, +- {0x9021d, 0x0}, +- {0x9021e, 0x0}, +- {0x9021f, 0x0}, +- {0x90220, 0x0}, +- {0x90221, 0x0}, +- {0x90222, 0x0}, +- {0x90223, 0x0}, +- {0x90224, 0x0}, +- {0x90225, 0x0}, +- {0x90226, 0x0}, +- {0x90227, 0x0}, +- {0x90228, 0x0}, +- {0x90229, 0x0}, +- {0x9022a, 0x0}, +- {0x9022b, 0x0}, +- {0x9022c, 0x0}, +- {0x9022d, 0x0}, +- {0x9022e, 0x0}, +- {0x9022f, 0x0}, +- {0x90230, 0x0}, +- {0x90231, 0x0}, +- {0x90232, 0x0}, +- {0x90233, 0x0}, +- {0x90234, 0x0}, +- {0x90235, 0x0}, +- {0x90236, 0x0}, +- {0x90237, 0x0}, +- {0x90238, 0x0}, +- {0x90239, 0x0}, +- {0x9023a, 0x0}, +- {0x9023b, 0x0}, +- {0x9023c, 0x0}, +- {0x9023d, 0x0}, +- {0x9023e, 0x0}, +- {0x9023f, 0x0}, +- {0x90240, 0x0}, +- {0x90241, 0x0}, +- {0x90242, 0x0}, +- {0x90243, 0x0}, +- {0x90244, 0x0}, +- {0x90245, 0x0}, +- {0x90246, 0x0}, +- {0x90247, 0x0}, +- {0x90248, 0x0}, +- {0x90249, 0x0}, +- {0x9024a, 0x0}, +- {0x9024b, 0x0}, +- {0x9024c, 0x0}, +- {0x9024d, 0x0}, +- {0x9024e, 0x0}, +- {0x9024f, 0x0}, +- {0x90250, 0x0}, +- {0x90251, 0x0}, +- {0x90252, 0x0}, +- {0x90253, 0x0}, +- {0x90254, 0x0}, +- {0x90255, 0x0}, +- {0x90256, 0x0}, +- {0x90257, 0x0}, +- {0x90258, 0x0}, +- {0x90259, 0x0}, +- {0x9025a, 0x0}, +- {0x9025b, 0x0}, +- {0x9025c, 0x0}, +- {0x9025d, 0x0}, +- {0x9025e, 0x0}, +- {0x9025f, 0x0}, +- {0x90260, 0x0}, +- {0x90261, 0x0}, +- {0x90262, 0x0}, +- {0x90263, 0x0}, +- {0x90264, 0x0}, +- {0x90265, 0x0}, +- {0x90266, 0x0}, +- {0x90267, 0x0}, +- {0x90268, 0x0}, +- {0x90269, 0x0}, +- {0x9026a, 0x0}, +- {0x9026b, 0x0}, +- {0x9026c, 0x0}, +- {0x9026d, 0x0}, +- {0x9026e, 0x0}, +- {0x9026f, 0x0}, +- {0x90270, 0x0}, +- {0x90271, 0x0}, +- {0x90272, 0x0}, +- {0x90273, 0x0}, +- {0x90274, 0x0}, +- {0x90275, 0x0}, +- {0x90276, 0x0}, +- {0x90277, 0x0}, +- {0x90278, 0x0}, +- {0x90279, 0x0}, +- {0x9027a, 0x0}, +- {0x9027b, 0x0}, +- {0x9027c, 0x0}, +- {0x9027d, 0x0}, +- {0x9027e, 0x0}, +- {0x9027f, 0x0}, +- {0x90280, 0x0}, +- {0x90281, 0x0}, +- {0x90282, 0x0}, +- {0x90283, 0x0}, +- {0x90284, 0x0}, +- {0x90285, 0x0}, +- {0x90286, 0x0}, +- {0x90287, 0x0}, +- {0x90288, 0x0}, +- {0x90289, 0x0}, +- {0x9028a, 0x0}, +- {0x9028b, 0x0}, +- {0x9028c, 0x0}, +- {0x9028d, 0x0}, +- {0x9028e, 0x0}, +- {0x9028f, 0x0}, +- {0x90290, 0x0}, +- {0x90291, 0x0}, +- {0x90292, 0x0}, +- {0x90293, 0x0}, +- {0x90294, 0x0}, +- {0x90295, 0x0}, +- {0x90296, 0x0}, +- {0x90297, 0x0}, +- {0x90298, 0x0}, +- {0x90299, 0x0}, +- {0x9029a, 0x0}, +- {0x9029b, 0x0}, +- {0x9029c, 0x0}, +- {0x9029d, 0x0}, +- {0x9029e, 0x0}, +- {0x9029f, 0x0}, +- {0x902a0, 0x0}, +- {0x902a1, 0x0}, +- {0x902a2, 0x0}, +- {0x902a3, 0x0}, +- {0x902a4, 0x0}, +- {0x902a5, 0x0}, +- {0x902a6, 0x0}, +- {0x902a7, 0x0}, +- {0x902a8, 0x0}, +- {0x902a9, 0x0}, +- {0x902aa, 0x0}, +- {0x902ab, 0x0}, +- {0x902ac, 0x0}, +- {0x902ad, 0x0}, +- {0x902ae, 0x0}, +- {0x902af, 0x0}, +- {0x902b0, 0x0}, +- {0x902b1, 0x0}, +- {0x902b2, 0x0}, +- {0x902b3, 0x0}, +- {0x902b4, 0x0}, +- {0x902b5, 0x0}, +- {0x902b6, 0x0}, +- {0x902b7, 0x0}, +- {0x902b8, 0x0}, +- {0x902b9, 0x0}, +- {0x902ba, 0x0}, +- {0x902bb, 0x0}, +- {0x902bc, 0x0}, +- {0x902bd, 0x0}, +- {0x902be, 0x0}, +- {0x902bf, 0x0}, +- {0x902c0, 0x0}, +- {0x902c1, 0x0}, +- {0x902c2, 0x0}, +- {0x902c3, 0x0}, +- {0x902c4, 0x0}, +- {0x902c5, 0x0}, +- {0x902c6, 0x0}, +- {0x902c7, 0x0}, +- {0x902c8, 0x0}, +- {0x902c9, 0x0}, +- {0x902ca, 0x0}, +- {0x902cb, 0x0}, +- {0x902cc, 0x0}, +- {0x902cd, 0x0}, +- {0x902ce, 0x0}, +- {0x902cf, 0x0}, +- {0x902d0, 0x0}, +- {0x902d1, 0x0}, +- {0x902d2, 0x0}, +- {0x902d3, 0x0}, +- {0x902d4, 0x0}, +- {0x902d5, 0x0}, +- {0x902d6, 0x0}, +- {0x902d7, 0x0}, +- {0x902d8, 0x0}, +- {0x902d9, 0x0}, +- {0x902da, 0x0}, +- {0x902db, 0x0}, +- {0x902dc, 0x0}, +- {0x902dd, 0x0}, +- {0x902de, 0x0}, +- {0x902df, 0x0}, +- {0x902e0, 0x0}, +- {0x902e1, 0x0}, +- {0x902e2, 0x0}, +- {0x902e3, 0x0}, +- {0x902e4, 0x0}, +- {0x902e5, 0x0}, +- {0x902e6, 0x0}, +- {0x902e7, 0x0}, +- {0x902e8, 0x0}, +- {0x902e9, 0x0}, +- {0x902ea, 0x0}, +- {0x902eb, 0x0}, +- {0x902ec, 0x0}, +- {0x902ed, 0x0}, +- {0x902ee, 0x0}, +- {0x902ef, 0x0}, +- {0x902f0, 0x0}, +- {0x902f1, 0x0}, +- {0x902f2, 0x0}, +- {0x902f3, 0x0}, +- {0x902f4, 0x0}, +- {0x902f5, 0x0}, +- {0x902f6, 0x0}, +- {0x902f7, 0x0}, +- {0x902f8, 0x0}, +- {0x902f9, 0x0}, +- {0x902fa, 0x0}, +- {0x902fb, 0x0}, +- {0x902fc, 0x0}, +- {0x902fd, 0x0}, +- {0x902fe, 0x0}, +- {0x902ff, 0x0}, +- {0x90300, 0x0}, +- {0x90301, 0x0}, +- {0x90302, 0x0}, +- {0x90303, 0x0}, +- {0x90304, 0x0}, +- {0x90305, 0x0}, +- {0x90306, 0x0}, +- {0x90307, 0x0}, +- {0x90308, 0x0}, +- {0x90309, 0x0}, +- {0x9030a, 0x0}, +- {0x9030b, 0x0}, +- {0x9030c, 0x0}, +- {0x9030d, 0x0}, +- {0x9030e, 0x0}, +- {0x9030f, 0x0}, +- {0x90310, 0x0}, +- {0x90311, 0x0}, +- {0x90312, 0x0}, +- {0x90313, 0x0}, +- {0x90314, 0x0}, +- {0x90315, 0x0}, +- {0x90316, 0x0}, +- {0x90317, 0x0}, +- {0x90318, 0x0}, +- {0x90319, 0x0}, +- {0x9031a, 0x0}, +- {0x9031b, 0x0}, +- {0x9031c, 0x0}, +- {0x9031d, 0x0}, +- {0x9031e, 0x0}, +- {0x9031f, 0x0}, +- {0x90320, 0x0}, +- {0x90321, 0x0}, +- {0x90322, 0x0}, +- {0x90323, 0x0}, +- {0x90324, 0x0}, +- {0x90325, 0x0}, +- {0x90326, 0x0}, +- {0x90327, 0x0}, +- {0x90328, 0x0}, +- {0x90329, 0x0}, +- {0x9032a, 0x0}, +- {0x9032b, 0x0}, +- {0x9032c, 0x0}, +- {0x9032d, 0x0}, +- {0x9032e, 0x0}, +- {0x9032f, 0x0}, +- {0x90330, 0x0}, +- {0x90331, 0x0}, +- {0x90332, 0x0}, +- {0x90333, 0x0}, +- {0x90334, 0x0}, +- {0x90335, 0x0}, +- {0x90336, 0x0}, +- {0x90337, 0x0}, +- {0x90338, 0x0}, +- {0x90339, 0x0}, +- {0x9033a, 0x0}, +- {0x9033b, 0x0}, +- {0x9033c, 0x0}, +- {0x9033d, 0x0}, +- {0x9033e, 0x0}, +- {0x9033f, 0x0}, +- {0x90340, 0x0}, +- {0x90341, 0x0}, +- {0x90342, 0x0}, +- {0x90343, 0x0}, +- {0x90344, 0x0}, +- {0x90345, 0x0}, +- {0x90346, 0x0}, +- {0x90347, 0x0}, +- {0x90348, 0x0}, +- {0x90349, 0x0}, +- {0x9034a, 0x0}, +- {0x9034b, 0x0}, +- {0x9034c, 0x0}, +- {0x9034d, 0x0}, +- {0x9034e, 0x0}, +- {0x9034f, 0x0}, +- {0x90350, 0x0}, +- {0x90351, 0x0}, +- {0x90352, 0x0}, +- {0x90353, 0x0}, +- {0x90354, 0x0}, +- {0x90355, 0x0}, +- {0x90356, 0x0}, +- {0x90357, 0x0}, +- {0x90358, 0x0}, +- {0x90359, 0x0}, +- {0x9035a, 0x0}, +- {0x9035b, 0x0}, +- {0x9035c, 0x0}, +- {0x9035d, 0x0}, +- {0x9035e, 0x0}, +- {0x9035f, 0x0}, +- {0x90360, 0x0}, +- {0x90361, 0x0}, +- {0x90362, 0x0}, +- {0x90363, 0x0}, +- {0x90364, 0x0}, +- {0x90365, 0x0}, +- {0x90366, 0x0}, +- {0x90367, 0x0}, +- {0x90368, 0x0}, +- {0x90369, 0x0}, +- {0x9036a, 0x0}, +- {0x9036b, 0x0}, +- {0x9036c, 0x0}, +- {0x9036d, 0x0}, +- {0x9036e, 0x0}, +- {0x9036f, 0x0}, +- {0x90370, 0x0}, +- {0x90371, 0x0}, +- {0x90372, 0x0}, +- {0x90373, 0x0}, +- {0x90374, 0x0}, +- {0x90375, 0x0}, +- {0x90376, 0x0}, +- {0x90377, 0x0}, +- {0x90378, 0x0}, +- {0x90379, 0x0}, +- {0x9037a, 0x0}, +- {0x9037b, 0x0}, +- {0x9037c, 0x0}, +- {0x9037d, 0x0}, +- {0x9037e, 0x0}, +- {0x9037f, 0x0}, +- {0x90380, 0x0}, +- {0x90381, 0x0}, +- {0x90382, 0x0}, +- {0x90383, 0x0}, +- {0x90384, 0x0}, +- {0x90385, 0x0}, +- {0x90386, 0x0}, +- {0x90387, 0x0}, +- {0x90388, 0x0}, +- {0x90389, 0x0}, +- {0x9038a, 0x0}, +- {0x9038b, 0x0}, +- {0x9038c, 0x0}, +- {0x9038d, 0x0}, +- {0x9038e, 0x0}, +- {0x9038f, 0x0}, +- {0x90390, 0x0}, +- {0x90391, 0x0}, +- {0x90392, 0x0}, +- {0x90393, 0x0}, +- {0x90394, 0x0}, +- {0x90395, 0x0}, +- {0x90396, 0x0}, +- {0x90397, 0x0}, +- {0x90398, 0x0}, +- {0x90399, 0x0}, +- {0x9039a, 0x0}, +- {0x9039b, 0x0}, +- {0x9039c, 0x0}, +- {0x9039d, 0x0}, +- {0x9039e, 0x0}, +- {0x9039f, 0x0}, +- {0x903a0, 0x0}, +- {0x903a1, 0x0}, +- {0x903a2, 0x0}, +- {0x903a3, 0x0}, +- {0x903a4, 0x0}, +- {0x903a5, 0x0}, +- {0x903a6, 0x0}, +- {0x903a7, 0x0}, +- {0x903a8, 0x0}, +- {0x903a9, 0x0}, +- {0x903aa, 0x0}, +- {0x903ab, 0x0}, +- {0x903ac, 0x0}, +- {0x903ad, 0x0}, +- {0x903ae, 0x0}, +- {0x903af, 0x0}, +- {0x903b0, 0x0}, +- {0x903b1, 0x0}, +- {0x903b2, 0x0}, +- {0x903b3, 0x0}, +- {0x903b4, 0x0}, +- {0x903b5, 0x0}, +- {0x903b6, 0x0}, +- {0x903b7, 0x0}, +- {0x903b8, 0x0}, +- {0x903b9, 0x0}, +- {0x903ba, 0x0}, +- {0x903bb, 0x0}, +- {0x903bc, 0x0}, +- {0x903bd, 0x0}, +- {0x903be, 0x0}, +- {0x903bf, 0x0}, +- {0x903c0, 0x0}, +- {0x903c1, 0x0}, +- {0x903c2, 0x0}, +- {0x903c3, 0x0}, +- {0x903c4, 0x0}, +- {0x903c5, 0x0}, +- {0x903c6, 0x0}, +- {0x903c7, 0x0}, +- {0x903c8, 0x0}, +- {0x903c9, 0x0}, +- {0x903ca, 0x0}, +- {0x903cb, 0x0}, +- {0x903cc, 0x0}, +- {0x903cd, 0x0}, +- {0x903ce, 0x0}, +- {0x903cf, 0x0}, +- {0x903d0, 0x0}, +- {0x903d1, 0x0}, +- {0x903d2, 0x0}, +- {0x903d3, 0x0}, +- {0x903d4, 0x0}, +- {0x903d5, 0x0}, +- {0x903d6, 0x0}, +- {0x903d7, 0x0}, +- {0x903d8, 0x0}, +- {0x903d9, 0x0}, +- {0x903da, 0x0}, +- {0x903db, 0x0}, +- {0x903dc, 0x0}, +- {0x903dd, 0x0}, +- {0x903de, 0x0}, +- {0x903df, 0x0}, +- {0x903e0, 0x0}, +- {0x903e1, 0x0}, +- {0x903e2, 0x0}, +- {0x903e3, 0x0}, +- {0x903e4, 0x0}, +- {0x903e5, 0x0}, +- {0x903e6, 0x0}, +- {0x903e7, 0x0}, +- {0x903e8, 0x0}, +- {0x903e9, 0x0}, +- {0x903ea, 0x0}, +- {0x903eb, 0x0}, +- {0x903ec, 0x0}, +- {0x903ed, 0x0}, +- {0x903ee, 0x0}, +- {0x903ef, 0x0}, +- {0x903f0, 0x0}, +- {0x903f1, 0x0}, +- {0x903f2, 0x0}, +- {0x903f3, 0x0}, +- {0x903f4, 0x0}, +- {0x903f5, 0x0}, +- {0x903f6, 0x0}, +- {0x903f7, 0x0}, +- {0x903f8, 0x0}, +- {0x903f9, 0x0}, +- {0x903fa, 0x0}, +- {0x903fb, 0x0}, +- {0x903fc, 0x0}, +- {0x903fd, 0x0}, +- {0x903fe, 0x0}, +- {0x903ff, 0x0}, +- {0x90400, 0x0}, +- {0x90401, 0x0}, +- {0x90402, 0x0}, +- {0x90403, 0x0}, +- {0x90404, 0x0}, +- {0x90405, 0x0}, +- {0x90406, 0x0}, +- {0x90407, 0x0}, +- {0x90408, 0x0}, +- {0x90409, 0x0}, +- {0x9040a, 0x0}, +- {0x9040b, 0x0}, +- {0x9040c, 0x0}, +- {0x9040d, 0x0}, +- {0x9040e, 0x0}, +- {0x9040f, 0x0}, +- {0x90410, 0x0}, +- {0x90411, 0x0}, +- {0x90412, 0x0}, +- {0x90413, 0x0}, +- {0x90414, 0x0}, +- {0x90415, 0x0}, +- {0x90416, 0x0}, +- {0x90417, 0x0}, +- {0x90418, 0x0}, +- {0x90419, 0x0}, +- {0x9041a, 0x0}, +- {0x9041b, 0x0}, +- {0x9041c, 0x0}, +- {0x9041d, 0x0}, +- {0x9041e, 0x0}, +- {0x9041f, 0x0}, +- {0x90420, 0x0}, +- {0x90421, 0x0}, +- {0x90422, 0x0}, +- {0x90423, 0x0}, +- {0x90424, 0x0}, +- {0x90425, 0x0}, +- {0x90426, 0x0}, +- {0x90427, 0x0}, +- {0x90428, 0x0}, +- {0x90429, 0x0}, +- {0x9042a, 0x0}, +- {0x9042b, 0x0}, +- {0x9042c, 0x0}, +- {0x9042d, 0x0}, +- {0x9042e, 0x0}, +- {0x9042f, 0x0}, +- {0x90430, 0x0}, +- {0x90431, 0x0}, +- {0x90432, 0x0}, +- {0x90433, 0x0}, +- {0x90434, 0x0}, +- {0x90435, 0x0}, +- {0x90436, 0x0}, +- {0x90437, 0x0}, +- {0x90438, 0x0}, +- {0x90439, 0x0}, +- {0x9043a, 0x0}, +- {0x9043b, 0x0}, +- {0x9043c, 0x0}, +- {0x9043d, 0x0}, +- {0x9043e, 0x0}, +- {0x9043f, 0x0}, +- {0x90440, 0x0}, +- {0x90441, 0x0}, +- {0x90442, 0x0}, +- {0x90443, 0x0}, +- {0x90444, 0x0}, +- {0x90445, 0x0}, +- {0x90446, 0x0}, +- {0x90447, 0x0}, +- {0x90448, 0x0}, +- {0x90449, 0x0}, +- {0x9044a, 0x0}, +- {0x9044b, 0x0}, +- {0x9044c, 0x0}, +- {0x9044d, 0x0}, +- {0x9044e, 0x0}, +- {0x9044f, 0x0}, +- {0x90450, 0x0}, +- {0x90451, 0x0}, +- {0x90452, 0x0}, +- {0x90453, 0x0}, +- {0x90454, 0x0}, +- {0x90455, 0x0}, +- {0x90456, 0x0}, +- {0x90457, 0x0}, +- {0x90458, 0x0}, +- {0x90459, 0x0}, +- {0x9045a, 0x0}, +- {0x9045b, 0x0}, +- {0x9045c, 0x0}, +- {0x9045d, 0x0}, +- {0x9045e, 0x0}, +- {0x9045f, 0x0}, +- {0x90460, 0x0}, +- {0x90461, 0x0}, +- {0x90462, 0x0}, +- {0x90463, 0x0}, +- {0x90464, 0x0}, +- {0x90465, 0x0}, +- {0x90466, 0x0}, +- {0x90467, 0x0}, +- {0x90468, 0x0}, +- {0x90469, 0x0}, +- {0x9046a, 0x0}, +- {0x9046b, 0x0}, +- {0x9046c, 0x0}, +- {0x9046d, 0x0}, +- {0x9046e, 0x0}, +- {0x9046f, 0x0}, +- {0x90470, 0x0}, +- {0x90471, 0x0}, +- {0x90472, 0x0}, +- {0x90473, 0x0}, +- {0x90474, 0x0}, +- {0x90475, 0x0}, +- {0x90476, 0x0}, +- {0x90477, 0x0}, +- {0x90478, 0x0}, +- {0x90479, 0x0}, +- {0x9047a, 0x0}, +- {0x9047b, 0x0}, +- {0x9047c, 0x0}, +- {0x9047d, 0x0}, +- {0x9047e, 0x0}, +- {0x9047f, 0x0}, +- {0x90480, 0x0}, +- {0x90481, 0x0}, +- {0x90482, 0x0}, +- {0x90483, 0x0}, +- {0x90484, 0x0}, +- {0x90485, 0x0}, +- {0x90486, 0x0}, +- {0x90487, 0x0}, +- {0x90488, 0x0}, +- {0x90489, 0x0}, +- {0x9048a, 0x0}, +- {0x9048b, 0x0}, +- {0x9048c, 0x0}, +- {0x9048d, 0x0}, +- {0x9048e, 0x0}, +- {0x9048f, 0x0}, +- {0x90490, 0x0}, +- {0x90491, 0x0}, +- {0x90492, 0x0}, +- {0x90493, 0x0}, +- {0x90494, 0x0}, +- {0x90495, 0x0}, +- {0x90496, 0x0}, +- {0x90497, 0x0}, +- {0x90498, 0x0}, +- {0x90499, 0x0}, +- {0x9049a, 0x0}, +- {0x9049b, 0x0}, +- {0x9049c, 0x0}, +- {0x9049d, 0x0}, +- {0x9049e, 0x0}, +- {0x9049f, 0x0}, +- {0x904a0, 0x0}, +- {0x904a1, 0x0}, +- {0x904a2, 0x0}, +- {0x904a3, 0x0}, +- {0x904a4, 0x0}, +- {0x904a5, 0x0}, +- {0x904a6, 0x0}, +- {0x904a7, 0x0}, +- {0x904a8, 0x0}, +- {0x904a9, 0x0}, +- {0x904aa, 0x0}, +- {0x904ab, 0x0}, +- {0x904ac, 0x0}, +- {0x904ad, 0x0}, +- {0x904ae, 0x0}, +- {0x904af, 0x0}, +- {0x904b0, 0x0}, +- {0x904b1, 0x0}, +- {0x904b2, 0x0}, +- {0x904b3, 0x0}, +- {0x904b4, 0x0}, +- {0x904b5, 0x0}, +- {0x904b6, 0x0}, +- {0x904b7, 0x0}, +- {0x904b8, 0x0}, +- {0x904b9, 0x0}, +- {0x904ba, 0x0}, +- {0x904bb, 0x0}, +- {0x904bc, 0x0}, +- {0x904bd, 0x0}, +- {0x904be, 0x0}, +- {0x904bf, 0x0}, +- {0x904c0, 0x0}, +- {0x904c1, 0x0}, +- {0x904c2, 0x0}, +- {0x904c3, 0x0}, +- {0x904c4, 0x0}, +- {0x904c5, 0x0}, +- {0x904c6, 0x0}, +- {0x904c7, 0x0}, +- {0x904c8, 0x0}, +- {0x904c9, 0x0}, +- {0x904ca, 0x0}, +- {0x904cb, 0x0}, +- {0x904cc, 0x0}, +- {0x904cd, 0x0}, +- {0x904ce, 0x0}, +- {0x904cf, 0x0}, +- {0x904d0, 0x0}, +- {0x904d1, 0x0}, +- {0x904d2, 0x0}, +- {0x904d3, 0x0}, +- {0x904d4, 0x0}, +- {0x904d5, 0x0}, +- {0x904d6, 0x0}, +- {0x904d7, 0x0}, +- {0x904d8, 0x0}, +- {0x904d9, 0x0}, +- {0x904da, 0x0}, +- {0x904db, 0x0}, +- {0x904dc, 0x0}, +- {0x904dd, 0x0}, +- {0x904de, 0x0}, +- {0x904df, 0x0}, +- {0x904e0, 0x0}, +- {0x904e1, 0x0}, +- {0x904e2, 0x0}, +- {0x904e3, 0x0}, +- {0x904e4, 0x0}, +- {0x904e5, 0x0}, +- {0x904e6, 0x0}, +- {0x904e7, 0x0}, +- {0x904e8, 0x0}, +- {0x904e9, 0x0}, +- {0x904ea, 0x0}, +- {0x904eb, 0x0}, +- {0x904ec, 0x0}, +- {0x904ed, 0x0}, +- {0x904ee, 0x0}, +- {0x904ef, 0x0}, +- {0x904f0, 0x0}, +- {0x904f1, 0x0}, +- {0x904f2, 0x0}, +- {0x904f3, 0x0}, +- {0x904f4, 0x0}, +- {0x904f5, 0x0}, +- {0x904f6, 0x0}, +- {0x904f7, 0x0}, +- {0x904f8, 0x0}, +- {0x904f9, 0x0}, +- {0x904fa, 0x0}, +- {0x904fb, 0x0}, +- {0x904fc, 0x0}, +- {0x904fd, 0x0}, +- {0x904fe, 0x0}, +- {0x904ff, 0x0}, +- {0x90500, 0x0}, +- {0x90501, 0x0}, +- {0x90502, 0x0}, +- {0x90503, 0x0}, +- {0x90504, 0x0}, +- {0x90505, 0x0}, +- {0x90506, 0x0}, +- {0x90507, 0x0}, +- {0x90508, 0x0}, +- {0x90509, 0x0}, +- {0x9050a, 0x0}, +- {0x9050b, 0x0}, +- {0x9050c, 0x0}, +- {0x9050d, 0x0}, +- {0x9050e, 0x0}, +- {0x9050f, 0x0}, +- {0x90510, 0x0}, +- {0x90511, 0x0}, +- {0x90512, 0x0}, +- {0x90513, 0x0}, +- {0x90514, 0x0}, +- {0x90515, 0x0}, +- {0x90516, 0x0}, +- {0x90517, 0x0}, +- {0x90518, 0x0}, +- {0x90519, 0x0}, +- {0x9051a, 0x0}, +- {0x9051b, 0x0}, +- {0x9051c, 0x0}, +- {0x9051d, 0x0}, +- {0x9051e, 0x0}, +- {0x9051f, 0x0}, +- {0x90520, 0x0}, +- {0x90521, 0x0}, +- {0x90522, 0x0}, +- {0x90523, 0x0}, +- {0x90524, 0x0}, +- {0x90525, 0x0}, +- {0x90526, 0x0}, +- {0x90527, 0x0}, +- {0x90528, 0x0}, +- {0x90529, 0x0}, +- {0x9052a, 0x0}, +- {0x9052b, 0x0}, +- {0x9052c, 0x0}, +- {0x9052d, 0x0}, +- {0x9052e, 0x0}, +- {0x9052f, 0x0}, +- {0x90530, 0x0}, +- {0x90531, 0x0}, +- {0x90532, 0x0}, +- {0x90533, 0x0}, +- {0x90534, 0x0}, +- {0x90535, 0x0}, +- {0x90536, 0x0}, +- {0x90537, 0x0}, +- {0x90538, 0x0}, +- {0x90539, 0x0}, +- {0x9053a, 0x0}, +- {0xd00e7, 0x0}, +- {0x9001c, 0x0}, +- {0x90020, 0x0}, +- {0x90024, 0x0}, +- {0x90025, 0x0}, +- {0x90026, 0x0}, +- {0x9002b, 0x0}, +- {0x90708, 0x0}, +- {0x90700, 0x0}, +- {0x90701, 0x0}, +- {0x90702, 0x0}, +- {0x90703, 0x0}, +- {0x90704, 0x0}, +- {0x90705, 0x0}, +- {0x90706, 0x0}, +- {0x90707, 0x0}, +- {0x2018a, 0x0}, +- {0x20124, 0x0}, +- {0x2018b, 0x0}, +- {0x20125, 0x0}, +- {0x2018c, 0x0}, +- {0x20126, 0x0}, +- {0x2018d, 0x0}, +- {0x20127, 0x0}, +- {0x2018e, 0x0}, +- {0x20128, 0x0}, +- {0x2018f, 0x0}, +- {0x20129, 0x0}, +- {0x20190, 0x0}, +- {0x2012a, 0x0}, +- {0x20191, 0x0}, +- {0x2012b, 0x0}, +- {0x20192, 0x0}, +- {0x2012c, 0x0}, +- {0x20193, 0x0}, +- {0x2012d, 0x0}, +- {0x20194, 0x0}, +- {0x2012e, 0x0}, +- {0x20195, 0x0}, +- {0x2012f, 0x0}, +- {0x20196, 0x0}, +- {0x20130, 0x0}, +- {0x20197, 0x0}, +- {0x20131, 0x0}, +- {0x20198, 0x0}, +- {0x20132, 0x0}, +- {0x20199, 0x0}, +- {0x20133, 0x0}, +- {0x2019a, 0x0}, +- {0x20134, 0x0}, +- {0x2019b, 0x0}, +- {0x20135, 0x0}, +- {0x2019c, 0x0}, +- {0x20136, 0x0}, +- {0x2019d, 0x0}, +- {0x20137, 0x0}, +- {0x2019e, 0x0}, +- {0x20138, 0x0}, +- {0x2019f, 0x0}, +- {0x20139, 0x0}, +- {0x201a0, 0x0}, +- {0x2013a, 0x0}, +- {0x201a1, 0x0}, +- {0x2013b, 0x0}, +- {0x201a2, 0x0}, +- {0x2013c, 0x0}, +- {0x201a3, 0x0}, +- {0x2013d, 0x0}, +- {0x201a4, 0x0}, +- {0x2013e, 0x0}, +- {0x201a5, 0x0}, +- {0x2013f, 0x0}, +- {0x201a6, 0x0}, +- {0x20140, 0x0}, +- {0x201a7, 0x0}, +- {0x20141, 0x0}, +- {0x201a8, 0x0}, +- {0x20142, 0x0}, +- {0x201a9, 0x0}, +- {0x20143, 0x0}, +- {0x201aa, 0x0}, +- {0x20144, 0x0}, +- {0x201ab, 0x0}, +- {0x20145, 0x0}, +- {0x201ac, 0x0}, +- {0x20146, 0x0}, +- {0x201ad, 0x0}, +- {0x20147, 0x0}, +- {0x201ae, 0x0}, +- {0x20148, 0x0}, +- {0x201af, 0x0}, +- {0x20149, 0x0}, +- {0x201b0, 0x0}, +- {0x2014a, 0x0}, +- {0x201b1, 0x0}, +- {0x2014b, 0x0}, +- {0x201b2, 0x0}, +- {0x2014c, 0x0}, +- {0x201b3, 0x0}, +- {0x2014d, 0x0}, +- {0x201b4, 0x0}, +- {0x2014e, 0x0}, +- {0x201b5, 0x0}, +- {0x2014f, 0x0}, +- {0x201b6, 0x0}, +- {0x20150, 0x0}, +- {0x201b7, 0x0}, +- {0x20151, 0x0}, +- {0x201b8, 0x0}, +- {0x20152, 0x0}, +- {0x201b9, 0x0}, +- {0x20153, 0x0}, +- {0x201ba, 0x0}, +- {0x20154, 0x0}, +- {0x201bb, 0x0}, +- {0x20155, 0x0}, +- {0x201bc, 0x0}, +- {0x20156, 0x0}, +- {0x201bd, 0x0}, +- {0x20157, 0x0}, +- {0x201be, 0x0}, +- {0x20158, 0x0}, +- {0x201bf, 0x0}, +- {0x20159, 0x0}, +- {0x201c0, 0x0}, +- {0x2015a, 0x0}, +- {0x201c1, 0x0}, +- {0x2015b, 0x0}, +- {0x201c2, 0x0}, +- {0x2015c, 0x0}, +- {0x201c3, 0x0}, +- {0x2015d, 0x0}, +- {0x201c4, 0x0}, +- {0x2015e, 0x0}, +- {0x201c5, 0x0}, +- {0x2015f, 0x0}, +- {0x201c6, 0x0}, +- {0x20160, 0x0}, +- {0x201c7, 0x0}, +- {0x20161, 0x0}, +- {0x201c8, 0x0}, +- {0x20162, 0x0}, +- {0x201c9, 0x0}, +- {0x20163, 0x0}, +- {0x201ca, 0x0}, +- {0x20164, 0x0}, +- {0x201cb, 0x0}, +- {0x20165, 0x0}, +- {0x201cc, 0x0}, +- {0x20166, 0x0}, +- {0x201cd, 0x0}, +- {0x20167, 0x0}, +- {0x201ce, 0x0}, +- {0x20168, 0x0}, +- {0x201cf, 0x0}, +- {0x20169, 0x0}, +- {0x201d0, 0x0}, +- {0x2016a, 0x0}, +- {0x201d1, 0x0}, +- {0x2016b, 0x0}, +- {0x201d2, 0x0}, +- {0x2016c, 0x0}, +- {0x201d3, 0x0}, +- {0x2016d, 0x0}, +- {0x201d4, 0x0}, +- {0x2016e, 0x0}, +- {0x201d5, 0x0}, +- {0x2016f, 0x0}, +- {0x201d6, 0x0}, +- {0x20170, 0x0}, +- {0x201d7, 0x0}, +- {0x20171, 0x0}, +- {0x201d8, 0x0}, +- {0x20172, 0x0}, +- {0x201d9, 0x0}, +- {0x20173, 0x0}, +- {0x201da, 0x0}, +- {0xc0001, 0x0}, +- {0xc0002, 0x0}, +- {0xc0003, 0x0}, +- {0xc0000, 0x0}, +- {0xc0006, 0x0}, +- {0xc0007, 0x0}, +- {0x9070c, 0x0}, +- {0x9070d, 0x0}, +- {0x9070e, 0x0}, +- {0x9070f, 0x0}, +- {0x90710, 0x0}, +- {0x90711, 0x0}, +- {0x90713, 0x0}, +- {0x90714, 0x0}, +- {0x90715, 0x0}, +- {0x90c10, 0x0}, +- {0x90c12, 0x0}, +- {0x90712, 0x0}, +- {0x90c11, 0x0}, +- {0x90716, 0x0}, +- {0x90717, 0x0}, +- {0x90718, 0x0}, +- {0x90719, 0x0}, +- {0x9071a, 0x0}, +- {0x9071b, 0x0}, +- {0x90904, 0x0}, +- {0x90986, 0x0}, +- {0x90920, 0x0}, +- {0x90921, 0x0}, +- {0x90922, 0x0}, +- {0x90923, 0x0}, +- {0x90924, 0x0}, +- {0x90925, 0x0}, +- {0x90926, 0x0}, +- {0x90927, 0x0}, +- {0x90930, 0x0}, +- {0x90931, 0x0}, +- {0x90932, 0x0}, +- {0x90933, 0x0}, +- {0x9090a, 0x0}, +- {0x9090c, 0x0}, +- {0x9090d, 0x0}, +- {0x200f0, 0x0}, +- {0x200f1, 0x0}, +- {0x200f2, 0x0}, +- {0x100b9, 0x0}, +- {0x100b1, 0x0}, +- {0x100ba, 0x0}, +- {0x100a2, 0x0}, +- {0x100b5, 0x0}, +- {0x110b9, 0x0}, +- {0x110b1, 0x0}, +- {0x110ba, 0x0}, +- {0x110a2, 0x0}, +- {0x110b5, 0x0}, +- {0x120b9, 0x0}, +- {0x120b1, 0x0}, +- {0x120ba, 0x0}, +- {0x120a2, 0x0}, +- {0x120b5, 0x0}, +- {0x130b9, 0x0}, +- {0x130b1, 0x0}, +- {0x130ba, 0x0}, +- {0x130a2, 0x0}, +- {0x130b5, 0x0}, +- {0x70024, 0x0}, +- {0x70025, 0x0}, +- {0x70026, 0x0}, +- {0x70027, 0x0}, +- {0x70028, 0x0}, +- {0x70029, 0x0}, +- {0x7002a, 0x0}, +- {0x7002b, 0x0}, +- {0x70124, 0x0}, +- {0x70125, 0x0}, +- {0x70126, 0x0}, +- {0x70127, 0x0}, +- {0x70128, 0x0}, +- {0x70129, 0x0}, +- {0x7012a, 0x0}, +- {0x7012b, 0x0}, +- {0x70224, 0x0}, +- {0x70225, 0x0}, +- {0x70226, 0x0}, +- {0x70227, 0x0}, +- {0x70228, 0x0}, +- {0x70229, 0x0}, +- {0x7022a, 0x0}, +- {0x7022b, 0x0}, +- {0x70324, 0x0}, +- {0x70325, 0x0}, +- {0x70326, 0x0}, +- {0x70327, 0x0}, +- {0x70328, 0x0}, +- {0x70329, 0x0}, +- {0x7032a, 0x0}, +- {0x7032b, 0x0}, +- {0x70424, 0x0}, +- {0x70425, 0x0}, +- {0x70426, 0x0}, +- {0x70427, 0x0}, +- {0x70428, 0x0}, +- {0x70429, 0x0}, +- {0x7042a, 0x0}, +- {0x7042b, 0x0}, +- {0x70524, 0x0}, +- {0x70525, 0x0}, +- {0x70526, 0x0}, +- {0x70527, 0x0}, +- {0x70528, 0x0}, +- {0x70529, 0x0}, +- {0x7052a, 0x0}, +- {0x7052b, 0x0}, +- {0x70624, 0x0}, +- {0x70625, 0x0}, +- {0x70626, 0x0}, +- {0x70627, 0x0}, +- {0x70628, 0x0}, +- {0x70629, 0x0}, +- {0x7062a, 0x0}, +- {0x7062b, 0x0}, +- {0x70724, 0x0}, +- {0x70725, 0x0}, +- {0x70726, 0x0}, +- {0x70727, 0x0}, +- {0x70728, 0x0}, +- {0x70729, 0x0}, +- {0x7072a, 0x0}, +- {0x7072b, 0x0}, +- {0x70824, 0x0}, +- {0x70825, 0x0}, +- {0x70826, 0x0}, +- {0x70827, 0x0}, +- {0x70828, 0x0}, +- {0x70829, 0x0}, +- {0x7082a, 0x0}, +- {0x7082b, 0x0}, +- {0x70065, 0x0}, +- {0x2007e, 0x0}, +- {0x200ef, 0x0}, +- {0x90910, 0x0}, +- {0x20310, 0x0}, +- {0x20311, 0x0}, +- {0x20049, 0x0}, +- {0x100be, 0x0}, +- {0x100b0, 0x0}, +- {0x10080, 0x0}, +- {0x10081, 0x0}, +- {0x10082, 0x0}, +- {0x10083, 0x0}, +- {0x10084, 0x0}, +- {0x10085, 0x0}, +- {0x10086, 0x0}, +- {0x10087, 0x0}, +- {0x10056, 0x0}, +- {0x100d9, 0x0}, +- {0x110be, 0x0}, +- {0x110b0, 0x0}, +- {0x11080, 0x0}, +- {0x11081, 0x0}, +- {0x11082, 0x0}, +- {0x11083, 0x0}, +- {0x11084, 0x0}, +- {0x11085, 0x0}, +- {0x11086, 0x0}, +- {0x11087, 0x0}, +- {0x11056, 0x0}, +- {0x110d9, 0x0}, +- {0x120be, 0x0}, +- {0x120b0, 0x0}, +- {0x12080, 0x0}, +- {0x12081, 0x0}, +- {0x12082, 0x0}, +- {0x12083, 0x0}, +- {0x12084, 0x0}, +- {0x12085, 0x0}, +- {0x12086, 0x0}, +- {0x12087, 0x0}, +- {0x12056, 0x0}, +- {0x120d9, 0x0}, +- {0x130be, 0x0}, +- {0x130b0, 0x0}, +- {0x13080, 0x0}, +- {0x13081, 0x0}, +- {0x13082, 0x0}, +- {0x13083, 0x0}, +- {0x13084, 0x0}, +- {0x13085, 0x0}, +- {0x13086, 0x0}, +- {0x13087, 0x0}, +- {0x13056, 0x0}, +- {0x130d9, 0x0}, +- {0x30090, 0x0}, +- {0x30091, 0x0}, +- {0x30092, 0x0}, +- {0x30093, 0x0}, +- {0x30094, 0x0}, +- {0x30095, 0x0}, +- {0x30096, 0x0}, +- {0x31090, 0x0}, +- {0x31091, 0x0}, +- {0x31092, 0x0}, +- {0x31093, 0x0}, +- {0x31094, 0x0}, +- {0x31095, 0x0}, +- {0x31096, 0x0}, +- {0x30002, 0x0}, +- {0x30007, 0x0}, +- {0x30008, 0x0}, +- {0x30005, 0x0}, +- {0x30006, 0x0}, +- {0x30001, 0x0}, +- {0x30101, 0x0}, +- {0x30201, 0x0}, +- {0x30301, 0x0}, +- {0x30401, 0x0}, +- {0x30501, 0x0}, +- {0x30601, 0x0}, +- {0x30701, 0x0}, +- {0x30801, 0x0}, +- {0x30901, 0x0}, +- {0x31002, 0x0}, +- {0x31007, 0x0}, +- {0x31008, 0x0}, +- {0x31005, 0x0}, +- {0x31006, 0x0}, +- {0x31001, 0x0}, +- {0x31101, 0x0}, +- {0x31201, 0x0}, +- {0x31301, 0x0}, +- {0x31401, 0x0}, +- {0x31501, 0x0}, +- {0x31601, 0x0}, +- {0x31701, 0x0}, +- {0x31801, 0x0}, +- {0x31901, 0x0}, +- {0x10000, 0x0}, +- {0x100ad, 0x0}, +- {0x100af, 0x0}, +- {0x10020, 0x0}, +- {0x10021, 0x0}, +- {0x10028, 0x0}, +- {0x10029, 0x0}, +- {0x10066, 0x0}, +- {0x10067, 0x0}, +- {0x1005a, 0x0}, +- {0x1005b, 0x0}, +- {0x1005c, 0x0}, +- {0x1005d, 0x0}, +- {0x1002a, 0x0}, +- {0x1002b, 0x0}, +- {0x10024, 0x0}, +- {0x10025, 0x0}, +- {0x10026, 0x0}, +- {0x10027, 0x0}, +- {0x10010, 0x0}, +- {0x10011, 0x0}, +- {0x10012, 0x0}, +- {0x10013, 0x0}, +- {0x10068, 0x0}, +- {0x10069, 0x0}, +- {0x1006a, 0x0}, +- {0x1006b, 0x0}, +- {0x1006c, 0x0}, +- {0x1006d, 0x0}, +- {0x1006e, 0x0}, +- {0x1006f, 0x0}, +- {0x1001c, 0x0}, +- {0x1001d, 0x0}, +- {0x1001e, 0x0}, +- {0x1001f, 0x0}, +- {0x10124, 0x0}, +- {0x10125, 0x0}, +- {0x10126, 0x0}, +- {0x10127, 0x0}, +- {0x10110, 0x0}, +- {0x10111, 0x0}, +- {0x10112, 0x0}, +- {0x10113, 0x0}, +- {0x10168, 0x0}, +- {0x10169, 0x0}, +- {0x1016a, 0x0}, +- {0x1016b, 0x0}, +- {0x1016c, 0x0}, +- {0x1016d, 0x0}, +- {0x1016e, 0x0}, +- {0x1016f, 0x0}, +- {0x1011c, 0x0}, +- {0x1011d, 0x0}, +- {0x1011e, 0x0}, +- {0x1011f, 0x0}, +- {0x10224, 0x0}, +- {0x10225, 0x0}, +- {0x10226, 0x0}, +- {0x10227, 0x0}, +- {0x10210, 0x0}, +- {0x10211, 0x0}, +- {0x10212, 0x0}, +- {0x10213, 0x0}, +- {0x10268, 0x0}, +- {0x10269, 0x0}, +- {0x1026a, 0x0}, +- {0x1026b, 0x0}, +- {0x1026c, 0x0}, +- {0x1026d, 0x0}, +- {0x1026e, 0x0}, +- {0x1026f, 0x0}, +- {0x1021c, 0x0}, +- {0x1021d, 0x0}, +- {0x1021e, 0x0}, +- {0x1021f, 0x0}, +- {0x10324, 0x0}, +- {0x10325, 0x0}, +- {0x10326, 0x0}, +- {0x10327, 0x0}, +- {0x10310, 0x0}, +- {0x10311, 0x0}, +- {0x10312, 0x0}, +- {0x10313, 0x0}, +- {0x10368, 0x0}, +- {0x10369, 0x0}, +- {0x1036a, 0x0}, +- {0x1036b, 0x0}, +- {0x1036c, 0x0}, +- {0x1036d, 0x0}, +- {0x1036e, 0x0}, +- {0x1036f, 0x0}, +- {0x1031c, 0x0}, +- {0x1031d, 0x0}, +- {0x1031e, 0x0}, +- {0x1031f, 0x0}, +- {0x10424, 0x0}, +- {0x10425, 0x0}, +- {0x10426, 0x0}, +- {0x10427, 0x0}, +- {0x10410, 0x0}, +- {0x10411, 0x0}, +- {0x10412, 0x0}, +- {0x10413, 0x0}, +- {0x10468, 0x0}, +- {0x10469, 0x0}, +- {0x1046a, 0x0}, +- {0x1046b, 0x0}, +- {0x1046c, 0x0}, +- {0x1046d, 0x0}, +- {0x1046e, 0x0}, +- {0x1046f, 0x0}, +- {0x1041c, 0x0}, +- {0x1041d, 0x0}, +- {0x1041e, 0x0}, +- {0x1041f, 0x0}, +- {0x10524, 0x0}, +- {0x10525, 0x0}, +- {0x10526, 0x0}, +- {0x10527, 0x0}, +- {0x10510, 0x0}, +- {0x10511, 0x0}, +- {0x10512, 0x0}, +- {0x10513, 0x0}, +- {0x10568, 0x0}, +- {0x10569, 0x0}, +- {0x1056a, 0x0}, +- {0x1056b, 0x0}, +- {0x1056c, 0x0}, +- {0x1056d, 0x0}, +- {0x1056e, 0x0}, +- {0x1056f, 0x0}, +- {0x1051c, 0x0}, +- {0x1051d, 0x0}, +- {0x1051e, 0x0}, +- {0x1051f, 0x0}, +- {0x10624, 0x0}, +- {0x10625, 0x0}, +- {0x10626, 0x0}, +- {0x10627, 0x0}, +- {0x10610, 0x0}, +- {0x10611, 0x0}, +- {0x10612, 0x0}, +- {0x10613, 0x0}, +- {0x10668, 0x0}, +- {0x10669, 0x0}, +- {0x1066a, 0x0}, +- {0x1066b, 0x0}, +- {0x1066c, 0x0}, +- {0x1066d, 0x0}, +- {0x1066e, 0x0}, +- {0x1066f, 0x0}, +- {0x1061c, 0x0}, +- {0x1061d, 0x0}, +- {0x1061e, 0x0}, +- {0x1061f, 0x0}, +- {0x10724, 0x0}, +- {0x10725, 0x0}, +- {0x10726, 0x0}, +- {0x10727, 0x0}, +- {0x10710, 0x0}, +- {0x10711, 0x0}, +- {0x10712, 0x0}, +- {0x10713, 0x0}, +- {0x10768, 0x0}, +- {0x10769, 0x0}, +- {0x1076a, 0x0}, +- {0x1076b, 0x0}, +- {0x1076c, 0x0}, +- {0x1076d, 0x0}, +- {0x1076e, 0x0}, +- {0x1076f, 0x0}, +- {0x1071c, 0x0}, +- {0x1071d, 0x0}, +- {0x1071e, 0x0}, +- {0x1071f, 0x0}, +- {0x10824, 0x0}, +- {0x10825, 0x0}, +- {0x10826, 0x0}, +- {0x10827, 0x0}, +- {0x10810, 0x0}, +- {0x10811, 0x0}, +- {0x10812, 0x0}, +- {0x10813, 0x0}, +- {0x10868, 0x0}, +- {0x10869, 0x0}, +- {0x1086a, 0x0}, +- {0x1086b, 0x0}, +- {0x1086c, 0x0}, +- {0x1086d, 0x0}, +- {0x1086e, 0x0}, +- {0x1086f, 0x0}, +- {0x1081c, 0x0}, +- {0x1081d, 0x0}, +- {0x1081e, 0x0}, +- {0x1081f, 0x0}, +- {0x1000c, 0x0}, +- {0x1000d, 0x0}, +- {0x10015, 0x0}, +- {0x10016, 0x0}, +- {0x10019, 0x0}, +- {0x1001b, 0x0}, +- {0x10022, 0x0}, +- {0x10023, 0x0}, +- {0x100d0, 0x0}, +- {0x100d1, 0x0}, +- {0x100d2, 0x0}, +- {0x100d3, 0x0}, +- {0x100d4, 0x0}, +- {0x11000, 0x0}, +- {0x110ad, 0x0}, +- {0x110af, 0x0}, +- {0x11020, 0x0}, +- {0x11021, 0x0}, +- {0x11028, 0x0}, +- {0x11029, 0x0}, +- {0x11066, 0x0}, +- {0x11067, 0x0}, +- {0x1105a, 0x0}, +- {0x1105b, 0x0}, +- {0x1105c, 0x0}, +- {0x1105d, 0x0}, +- {0x1102a, 0x0}, +- {0x1102b, 0x0}, +- {0x11024, 0x0}, +- {0x11025, 0x0}, +- {0x11026, 0x0}, +- {0x11027, 0x0}, +- {0x11010, 0x0}, +- {0x11011, 0x0}, +- {0x11012, 0x0}, +- {0x11013, 0x0}, +- {0x11068, 0x0}, +- {0x11069, 0x0}, +- {0x1106a, 0x0}, +- {0x1106b, 0x0}, +- {0x1106c, 0x0}, +- {0x1106d, 0x0}, +- {0x1106e, 0x0}, +- {0x1106f, 0x0}, +- {0x1101c, 0x0}, +- {0x1101d, 0x0}, +- {0x1101e, 0x0}, +- {0x1101f, 0x0}, +- {0x11124, 0x0}, +- {0x11125, 0x0}, +- {0x11126, 0x0}, +- {0x11127, 0x0}, +- {0x11110, 0x0}, +- {0x11111, 0x0}, +- {0x11112, 0x0}, +- {0x11113, 0x0}, +- {0x11168, 0x0}, +- {0x11169, 0x0}, +- {0x1116a, 0x0}, +- {0x1116b, 0x0}, +- {0x1116c, 0x0}, +- {0x1116d, 0x0}, +- {0x1116e, 0x0}, +- {0x1116f, 0x0}, +- {0x1111c, 0x0}, +- {0x1111d, 0x0}, +- {0x1111e, 0x0}, +- {0x1111f, 0x0}, +- {0x11224, 0x0}, +- {0x11225, 0x0}, +- {0x11226, 0x0}, +- {0x11227, 0x0}, +- {0x11210, 0x0}, +- {0x11211, 0x0}, +- {0x11212, 0x0}, +- {0x11213, 0x0}, +- {0x11268, 0x0}, +- {0x11269, 0x0}, +- {0x1126a, 0x0}, +- {0x1126b, 0x0}, +- {0x1126c, 0x0}, +- {0x1126d, 0x0}, +- {0x1126e, 0x0}, +- {0x1126f, 0x0}, +- {0x1121c, 0x0}, +- {0x1121d, 0x0}, +- {0x1121e, 0x0}, +- {0x1121f, 0x0}, +- {0x11324, 0x0}, +- {0x11325, 0x0}, +- {0x11326, 0x0}, +- {0x11327, 0x0}, +- {0x11310, 0x0}, +- {0x11311, 0x0}, +- {0x11312, 0x0}, +- {0x11313, 0x0}, +- {0x11368, 0x0}, +- {0x11369, 0x0}, +- {0x1136a, 0x0}, +- {0x1136b, 0x0}, +- {0x1136c, 0x0}, +- {0x1136d, 0x0}, +- {0x1136e, 0x0}, +- {0x1136f, 0x0}, +- {0x1131c, 0x0}, +- {0x1131d, 0x0}, +- {0x1131e, 0x0}, +- {0x1131f, 0x0}, +- {0x11424, 0x0}, +- {0x11425, 0x0}, +- {0x11426, 0x0}, +- {0x11427, 0x0}, +- {0x11410, 0x0}, +- {0x11411, 0x0}, +- {0x11412, 0x0}, +- {0x11413, 0x0}, +- {0x11468, 0x0}, +- {0x11469, 0x0}, +- {0x1146a, 0x0}, +- {0x1146b, 0x0}, +- {0x1146c, 0x0}, +- {0x1146d, 0x0}, +- {0x1146e, 0x0}, +- {0x1146f, 0x0}, +- {0x1141c, 0x0}, +- {0x1141d, 0x0}, +- {0x1141e, 0x0}, +- {0x1141f, 0x0}, +- {0x11524, 0x0}, +- {0x11525, 0x0}, +- {0x11526, 0x0}, +- {0x11527, 0x0}, +- {0x11510, 0x0}, +- {0x11511, 0x0}, +- {0x11512, 0x0}, +- {0x11513, 0x0}, +- {0x11568, 0x0}, +- {0x11569, 0x0}, +- {0x1156a, 0x0}, +- {0x1156b, 0x0}, +- {0x1156c, 0x0}, +- {0x1156d, 0x0}, +- {0x1156e, 0x0}, +- {0x1156f, 0x0}, +- {0x1151c, 0x0}, +- {0x1151d, 0x0}, +- {0x1151e, 0x0}, +- {0x1151f, 0x0}, +- {0x11624, 0x0}, +- {0x11625, 0x0}, +- {0x11626, 0x0}, +- {0x11627, 0x0}, +- {0x11610, 0x0}, +- {0x11611, 0x0}, +- {0x11612, 0x0}, +- {0x11613, 0x0}, +- {0x11668, 0x0}, +- {0x11669, 0x0}, +- {0x1166a, 0x0}, +- {0x1166b, 0x0}, +- {0x1166c, 0x0}, +- {0x1166d, 0x0}, +- {0x1166e, 0x0}, +- {0x1166f, 0x0}, +- {0x1161c, 0x0}, +- {0x1161d, 0x0}, +- {0x1161e, 0x0}, +- {0x1161f, 0x0}, +- {0x11724, 0x0}, +- {0x11725, 0x0}, +- {0x11726, 0x0}, +- {0x11727, 0x0}, +- {0x11710, 0x0}, +- {0x11711, 0x0}, +- {0x11712, 0x0}, +- {0x11713, 0x0}, +- {0x11768, 0x0}, +- {0x11769, 0x0}, +- {0x1176a, 0x0}, +- {0x1176b, 0x0}, +- {0x1176c, 0x0}, +- {0x1176d, 0x0}, +- {0x1176e, 0x0}, +- {0x1176f, 0x0}, +- {0x1171c, 0x0}, +- {0x1171d, 0x0}, +- {0x1171e, 0x0}, +- {0x1171f, 0x0}, +- {0x11824, 0x0}, +- {0x11825, 0x0}, +- {0x11826, 0x0}, +- {0x11827, 0x0}, +- {0x11810, 0x0}, +- {0x11811, 0x0}, +- {0x11812, 0x0}, +- {0x11813, 0x0}, +- {0x11868, 0x0}, +- {0x11869, 0x0}, +- {0x1186a, 0x0}, +- {0x1186b, 0x0}, +- {0x1186c, 0x0}, +- {0x1186d, 0x0}, +- {0x1186e, 0x0}, +- {0x1186f, 0x0}, +- {0x1181c, 0x0}, +- {0x1181d, 0x0}, +- {0x1181e, 0x0}, +- {0x1181f, 0x0}, +- {0x1100c, 0x0}, +- {0x1100d, 0x0}, +- {0x11015, 0x0}, +- {0x11016, 0x0}, +- {0x11019, 0x0}, +- {0x1101b, 0x0}, +- {0x11022, 0x0}, +- {0x11023, 0x0}, +- {0x110d0, 0x0}, +- {0x110d1, 0x0}, +- {0x110d2, 0x0}, +- {0x110d3, 0x0}, +- {0x110d4, 0x0}, +- {0x12000, 0x0}, +- {0x120ad, 0x0}, +- {0x120af, 0x0}, +- {0x12020, 0x0}, +- {0x12021, 0x0}, +- {0x12028, 0x0}, +- {0x12029, 0x0}, +- {0x12066, 0x0}, +- {0x12067, 0x0}, +- {0x1205a, 0x0}, +- {0x1205b, 0x0}, +- {0x1205c, 0x0}, +- {0x1205d, 0x0}, +- {0x1202a, 0x0}, +- {0x1202b, 0x0}, +- {0x12024, 0x0}, +- {0x12025, 0x0}, +- {0x12026, 0x0}, +- {0x12027, 0x0}, +- {0x12010, 0x0}, +- {0x12011, 0x0}, +- {0x12012, 0x0}, +- {0x12013, 0x0}, +- {0x12068, 0x0}, +- {0x12069, 0x0}, +- {0x1206a, 0x0}, +- {0x1206b, 0x0}, +- {0x1206c, 0x0}, +- {0x1206d, 0x0}, +- {0x1206e, 0x0}, +- {0x1206f, 0x0}, +- {0x1201c, 0x0}, +- {0x1201d, 0x0}, +- {0x1201e, 0x0}, +- {0x1201f, 0x0}, +- {0x12124, 0x0}, +- {0x12125, 0x0}, +- {0x12126, 0x0}, +- {0x12127, 0x0}, +- {0x12110, 0x0}, +- {0x12111, 0x0}, +- {0x12112, 0x0}, +- {0x12113, 0x0}, +- {0x12168, 0x0}, +- {0x12169, 0x0}, +- {0x1216a, 0x0}, +- {0x1216b, 0x0}, +- {0x1216c, 0x0}, +- {0x1216d, 0x0}, +- {0x1216e, 0x0}, +- {0x1216f, 0x0}, +- {0x1211c, 0x0}, +- {0x1211d, 0x0}, +- {0x1211e, 0x0}, +- {0x1211f, 0x0}, +- {0x12224, 0x0}, +- {0x12225, 0x0}, +- {0x12226, 0x0}, +- {0x12227, 0x0}, +- {0x12210, 0x0}, +- {0x12211, 0x0}, +- {0x12212, 0x0}, +- {0x12213, 0x0}, +- {0x12268, 0x0}, +- {0x12269, 0x0}, +- {0x1226a, 0x0}, +- {0x1226b, 0x0}, +- {0x1226c, 0x0}, +- {0x1226d, 0x0}, +- {0x1226e, 0x0}, +- {0x1226f, 0x0}, +- {0x1221c, 0x0}, +- {0x1221d, 0x0}, +- {0x1221e, 0x0}, +- {0x1221f, 0x0}, +- {0x12324, 0x0}, +- {0x12325, 0x0}, +- {0x12326, 0x0}, +- {0x12327, 0x0}, +- {0x12310, 0x0}, +- {0x12311, 0x0}, +- {0x12312, 0x0}, +- {0x12313, 0x0}, +- {0x12368, 0x0}, +- {0x12369, 0x0}, +- {0x1236a, 0x0}, +- {0x1236b, 0x0}, +- {0x1236c, 0x0}, +- {0x1236d, 0x0}, +- {0x1236e, 0x0}, +- {0x1236f, 0x0}, +- {0x1231c, 0x0}, +- {0x1231d, 0x0}, +- {0x1231e, 0x0}, +- {0x1231f, 0x0}, +- {0x12424, 0x0}, +- {0x12425, 0x0}, +- {0x12426, 0x0}, +- {0x12427, 0x0}, +- {0x12410, 0x0}, +- {0x12411, 0x0}, +- {0x12412, 0x0}, +- {0x12413, 0x0}, +- {0x12468, 0x0}, +- {0x12469, 0x0}, +- {0x1246a, 0x0}, +- {0x1246b, 0x0}, +- {0x1246c, 0x0}, +- {0x1246d, 0x0}, +- {0x1246e, 0x0}, +- {0x1246f, 0x0}, +- {0x1241c, 0x0}, +- {0x1241d, 0x0}, +- {0x1241e, 0x0}, +- {0x1241f, 0x0}, +- {0x12524, 0x0}, +- {0x12525, 0x0}, +- {0x12526, 0x0}, +- {0x12527, 0x0}, +- {0x12510, 0x0}, +- {0x12511, 0x0}, +- {0x12512, 0x0}, +- {0x12513, 0x0}, +- {0x12568, 0x0}, +- {0x12569, 0x0}, +- {0x1256a, 0x0}, +- {0x1256b, 0x0}, +- {0x1256c, 0x0}, +- {0x1256d, 0x0}, +- {0x1256e, 0x0}, +- {0x1256f, 0x0}, +- {0x1251c, 0x0}, +- {0x1251d, 0x0}, +- {0x1251e, 0x0}, +- {0x1251f, 0x0}, +- {0x12624, 0x0}, +- {0x12625, 0x0}, +- {0x12626, 0x0}, +- {0x12627, 0x0}, +- {0x12610, 0x0}, +- {0x12611, 0x0}, +- {0x12612, 0x0}, +- {0x12613, 0x0}, +- {0x12668, 0x0}, +- {0x12669, 0x0}, +- {0x1266a, 0x0}, +- {0x1266b, 0x0}, +- {0x1266c, 0x0}, +- {0x1266d, 0x0}, +- {0x1266e, 0x0}, +- {0x1266f, 0x0}, +- {0x1261c, 0x0}, +- {0x1261d, 0x0}, +- {0x1261e, 0x0}, +- {0x1261f, 0x0}, +- {0x12724, 0x0}, +- {0x12725, 0x0}, +- {0x12726, 0x0}, +- {0x12727, 0x0}, +- {0x12710, 0x0}, +- {0x12711, 0x0}, +- {0x12712, 0x0}, +- {0x12713, 0x0}, +- {0x12768, 0x0}, +- {0x12769, 0x0}, +- {0x1276a, 0x0}, +- {0x1276b, 0x0}, +- {0x1276c, 0x0}, +- {0x1276d, 0x0}, +- {0x1276e, 0x0}, +- {0x1276f, 0x0}, +- {0x1271c, 0x0}, +- {0x1271d, 0x0}, +- {0x1271e, 0x0}, +- {0x1271f, 0x0}, +- {0x12824, 0x0}, +- {0x12825, 0x0}, +- {0x12826, 0x0}, +- {0x12827, 0x0}, +- {0x12810, 0x0}, +- {0x12811, 0x0}, +- {0x12812, 0x0}, +- {0x12813, 0x0}, +- {0x12868, 0x0}, +- {0x12869, 0x0}, +- {0x1286a, 0x0}, +- {0x1286b, 0x0}, +- {0x1286c, 0x0}, +- {0x1286d, 0x0}, +- {0x1286e, 0x0}, +- {0x1286f, 0x0}, +- {0x1281c, 0x0}, +- {0x1281d, 0x0}, +- {0x1281e, 0x0}, +- {0x1281f, 0x0}, +- {0x1200c, 0x0}, +- {0x1200d, 0x0}, +- {0x12015, 0x0}, +- {0x12016, 0x0}, +- {0x12019, 0x0}, +- {0x1201b, 0x0}, +- {0x12022, 0x0}, +- {0x12023, 0x0}, +- {0x120d0, 0x0}, +- {0x120d1, 0x0}, +- {0x120d2, 0x0}, +- {0x120d3, 0x0}, +- {0x120d4, 0x0}, +- {0x13000, 0x0}, +- {0x130ad, 0x0}, +- {0x130af, 0x0}, +- {0x13020, 0x0}, +- {0x13021, 0x0}, +- {0x13028, 0x0}, +- {0x13029, 0x0}, +- {0x13066, 0x0}, +- {0x13067, 0x0}, +- {0x1305a, 0x0}, +- {0x1305b, 0x0}, +- {0x1305c, 0x0}, +- {0x1305d, 0x0}, +- {0x1302a, 0x0}, +- {0x1302b, 0x0}, +- {0x13024, 0x0}, +- {0x13025, 0x0}, +- {0x13026, 0x0}, +- {0x13027, 0x0}, +- {0x13010, 0x0}, +- {0x13011, 0x0}, +- {0x13012, 0x0}, +- {0x13013, 0x0}, +- {0x13068, 0x0}, +- {0x13069, 0x0}, +- {0x1306a, 0x0}, +- {0x1306b, 0x0}, +- {0x1306c, 0x0}, +- {0x1306d, 0x0}, +- {0x1306e, 0x0}, +- {0x1306f, 0x0}, +- {0x1301c, 0x0}, +- {0x1301d, 0x0}, +- {0x1301e, 0x0}, +- {0x1301f, 0x0}, +- {0x13124, 0x0}, +- {0x13125, 0x0}, +- {0x13126, 0x0}, +- {0x13127, 0x0}, +- {0x13110, 0x0}, +- {0x13111, 0x0}, +- {0x13112, 0x0}, +- {0x13113, 0x0}, +- {0x13168, 0x0}, +- {0x13169, 0x0}, +- {0x1316a, 0x0}, +- {0x1316b, 0x0}, +- {0x1316c, 0x0}, +- {0x1316d, 0x0}, +- {0x1316e, 0x0}, +- {0x1316f, 0x0}, +- {0x1311c, 0x0}, +- {0x1311d, 0x0}, +- {0x1311e, 0x0}, +- {0x1311f, 0x0}, +- {0x13224, 0x0}, +- {0x13225, 0x0}, +- {0x13226, 0x0}, +- {0x13227, 0x0}, +- {0x13210, 0x0}, +- {0x13211, 0x0}, +- {0x13212, 0x0}, +- {0x13213, 0x0}, +- {0x13268, 0x0}, +- {0x13269, 0x0}, +- {0x1326a, 0x0}, +- {0x1326b, 0x0}, +- {0x1326c, 0x0}, +- {0x1326d, 0x0}, +- {0x1326e, 0x0}, +- {0x1326f, 0x0}, +- {0x1321c, 0x0}, +- {0x1321d, 0x0}, +- {0x1321e, 0x0}, +- {0x1321f, 0x0}, +- {0x13324, 0x0}, +- {0x13325, 0x0}, +- {0x13326, 0x0}, +- {0x13327, 0x0}, +- {0x13310, 0x0}, +- {0x13311, 0x0}, +- {0x13312, 0x0}, +- {0x13313, 0x0}, +- {0x13368, 0x0}, +- {0x13369, 0x0}, +- {0x1336a, 0x0}, +- {0x1336b, 0x0}, +- {0x1336c, 0x0}, +- {0x1336d, 0x0}, +- {0x1336e, 0x0}, +- {0x1336f, 0x0}, +- {0x1331c, 0x0}, +- {0x1331d, 0x0}, +- {0x1331e, 0x0}, +- {0x1331f, 0x0}, +- {0x13424, 0x0}, +- {0x13425, 0x0}, +- {0x13426, 0x0}, +- {0x13427, 0x0}, +- {0x13410, 0x0}, +- {0x13411, 0x0}, +- {0x13412, 0x0}, +- {0x13413, 0x0}, +- {0x13468, 0x0}, +- {0x13469, 0x0}, +- {0x1346a, 0x0}, +- {0x1346b, 0x0}, +- {0x1346c, 0x0}, +- {0x1346d, 0x0}, +- {0x1346e, 0x0}, +- {0x1346f, 0x0}, +- {0x1341c, 0x0}, +- {0x1341d, 0x0}, +- {0x1341e, 0x0}, +- {0x1341f, 0x0}, +- {0x13524, 0x0}, +- {0x13525, 0x0}, +- {0x13526, 0x0}, +- {0x13527, 0x0}, +- {0x13510, 0x0}, +- {0x13511, 0x0}, +- {0x13512, 0x0}, +- {0x13513, 0x0}, +- {0x13568, 0x0}, +- {0x13569, 0x0}, +- {0x1356a, 0x0}, +- {0x1356b, 0x0}, +- {0x1356c, 0x0}, +- {0x1356d, 0x0}, +- {0x1356e, 0x0}, +- {0x1356f, 0x0}, +- {0x1351c, 0x0}, +- {0x1351d, 0x0}, +- {0x1351e, 0x0}, +- {0x1351f, 0x0}, +- {0x13624, 0x0}, +- {0x13625, 0x0}, +- {0x13626, 0x0}, +- {0x13627, 0x0}, +- {0x13610, 0x0}, +- {0x13611, 0x0}, +- {0x13612, 0x0}, +- {0x13613, 0x0}, +- {0x13668, 0x0}, +- {0x13669, 0x0}, +- {0x1366a, 0x0}, +- {0x1366b, 0x0}, +- {0x1366c, 0x0}, +- {0x1366d, 0x0}, +- {0x1366e, 0x0}, +- {0x1366f, 0x0}, +- {0x1361c, 0x0}, +- {0x1361d, 0x0}, +- {0x1361e, 0x0}, +- {0x1361f, 0x0}, +- {0x13724, 0x0}, +- {0x13725, 0x0}, +- {0x13726, 0x0}, +- {0x13727, 0x0}, +- {0x13710, 0x0}, +- {0x13711, 0x0}, +- {0x13712, 0x0}, +- {0x13713, 0x0}, +- {0x13768, 0x0}, +- {0x13769, 0x0}, +- {0x1376a, 0x0}, +- {0x1376b, 0x0}, +- {0x1376c, 0x0}, +- {0x1376d, 0x0}, +- {0x1376e, 0x0}, +- {0x1376f, 0x0}, +- {0x1371c, 0x0}, +- {0x1371d, 0x0}, +- {0x1371e, 0x0}, +- {0x1371f, 0x0}, +- {0x13824, 0x0}, +- {0x13825, 0x0}, +- {0x13826, 0x0}, +- {0x13827, 0x0}, +- {0x13810, 0x0}, +- {0x13811, 0x0}, +- {0x13812, 0x0}, +- {0x13813, 0x0}, +- {0x13868, 0x0}, +- {0x13869, 0x0}, +- {0x1386a, 0x0}, +- {0x1386b, 0x0}, +- {0x1386c, 0x0}, +- {0x1386d, 0x0}, +- {0x1386e, 0x0}, +- {0x1386f, 0x0}, +- {0x1381c, 0x0}, +- {0x1381d, 0x0}, +- {0x1381e, 0x0}, +- {0x1381f, 0x0}, +- {0x1300c, 0x0}, +- {0x1300d, 0x0}, +- {0x13015, 0x0}, +- {0x13016, 0x0}, +- {0x13019, 0x0}, +- {0x1301b, 0x0}, +- {0x13022, 0x0}, +- {0x13023, 0x0}, +- {0x130d0, 0x0}, +- {0x130d1, 0x0}, +- {0x130d2, 0x0}, +- {0x130d3, 0x0}, +- {0x130d4, 0x0}, +- {0x90807, 0x0}, +- {0x90808, 0x0}, +- {0x90813, 0x0}, +- {0x2004e, 0x0}, +- {0x2000d, 0x0}, +- {0x20077, 0x0}, +-}; +- +-/* PHY Initialize Configuration for Pstate 0 */ +-static struct ddrphy_cfg_param ddr_phy_fsp0_cfg[] = { +- {0x90802, 0x1}, +- {0x2004a, 0x601}, +- {0x2004b, 0x1c3e}, +- {0x2004c, 0x2e8f}, +- {0x2004d, 0x0}, +- {0x20088, 0x101}, +- {0x20089, 0x0}, +- {0x2008a, 0x0}, +- {0x2008c, 0x0}, +- {0x20002, 0x2}, +- {0x20000, 0x2}, +- {0x90801, 0x4d}, +- {0x90809, 0x6800}, +- {0x1005e, 0x366}, +- {0x10060, 0x366}, +- {0x10062, 0x366}, +- {0x10064, 0x366}, +- {0x1005f, 0x366}, +- {0x10061, 0x366}, +- {0x10063, 0x366}, +- {0x10065, 0x366}, +- {0x1105e, 0x366}, +- {0x11060, 0x366}, +- {0x11062, 0x366}, +- {0x11064, 0x366}, +- {0x1105f, 0x366}, +- {0x11061, 0x366}, +- {0x11063, 0x366}, +- {0x11065, 0x366}, +- {0x1205e, 0x366}, +- {0x12060, 0x366}, +- {0x12062, 0x366}, +- {0x12064, 0x366}, +- {0x1205f, 0x366}, +- {0x12061, 0x366}, +- {0x12063, 0x366}, +- {0x12065, 0x366}, +- {0x1305e, 0x366}, +- {0x13060, 0x366}, +- {0x13062, 0x366}, +- {0x13064, 0x366}, +- {0x1305f, 0x366}, +- {0x13061, 0x366}, +- {0x13063, 0x366}, +- {0x13065, 0x366}, +- {0x10005, 0x0}, +- {0x1000b, 0x0}, +- {0x11005, 0x0}, +- {0x1100b, 0x0}, +- {0x12005, 0x0}, +- {0x1200b, 0x0}, +- {0x13005, 0x0}, +- {0x1300b, 0x0}, +- {0x20007, 0x200}, +- {0x20013, 0x2c}, +- {0x30038, 0x3}, +- {0x30039, 0x3}, +- {0x3003a, 0x3}, +- {0x31038, 0x3}, +- {0x31039, 0x3}, +- {0x3103a, 0x3}, +- {0x10038, 0x3}, +- {0x1003a, 0x3}, +- {0x11038, 0x3}, +- {0x1103a, 0x3}, +- {0x12038, 0x3}, +- {0x1203a, 0x3}, +- {0x13038, 0x3}, +- {0x1303a, 0x3}, +- {0x1003b, 0x3}, +- {0x1103b, 0x3}, +- {0x1203b, 0x3}, +- {0x1303b, 0x3}, +- {0x10009, 0x0}, +- {0x10037, 0x0}, +- {0x11009, 0x0}, +- {0x11037, 0x0}, +- {0x12009, 0x0}, +- {0x12037, 0x0}, +- {0x13009, 0x0}, +- {0x13037, 0x0}, +- {0x10004, 0x0}, +- {0x10003, 0x0}, +- {0x11004, 0x0}, +- {0x11003, 0x0}, +- {0x12004, 0x0}, +- {0x12003, 0x0}, +- {0x13004, 0x0}, +- {0x13003, 0x0}, +- {0x20004, 0x320}, +- {0x30050, 0x15}, +- {0x30051, 0x15}, +- {0x30052, 0x15}, +- {0x30053, 0x15}, +- {0x31050, 0x15}, +- {0x31051, 0x15}, +- {0x31052, 0x15}, +- {0x31053, 0x15}, +- {0x1004e, 0x15}, +- {0x1004f, 0x15}, +- {0x10050, 0x15}, +- {0x10051, 0x15}, +- {0x1014e, 0x15}, +- {0x1014f, 0x15}, +- {0x10150, 0x15}, +- {0x10151, 0x15}, +- {0x1024e, 0x15}, +- {0x1024f, 0x15}, +- {0x10250, 0x15}, +- {0x10251, 0x15}, +- {0x1034e, 0x15}, +- {0x1034f, 0x15}, +- {0x10350, 0x15}, +- {0x10351, 0x15}, +- {0x1044e, 0x15}, +- {0x1044f, 0x15}, +- {0x10450, 0x15}, +- {0x10451, 0x15}, +- {0x1054e, 0x15}, +- {0x1054f, 0x15}, +- {0x10550, 0x15}, +- {0x10551, 0x15}, +- {0x1064e, 0x15}, +- {0x1064f, 0x15}, +- {0x10650, 0x15}, +- {0x10651, 0x15}, +- {0x1074e, 0x15}, +- {0x1074f, 0x15}, +- {0x10750, 0x15}, +- {0x10751, 0x15}, +- {0x1084e, 0x15}, +- {0x1084f, 0x15}, +- {0x10850, 0x15}, +- {0x10851, 0x15}, +- {0x1104e, 0x15}, +- {0x1104f, 0x15}, +- {0x11050, 0x15}, +- {0x11051, 0x15}, +- {0x1114e, 0x15}, +- {0x1114f, 0x15}, +- {0x11150, 0x15}, +- {0x11151, 0x15}, +- {0x1124e, 0x15}, +- {0x1124f, 0x15}, +- {0x11250, 0x15}, +- {0x11251, 0x15}, +- {0x1134e, 0x15}, +- {0x1134f, 0x15}, +- {0x11350, 0x15}, +- {0x11351, 0x15}, +- {0x1144e, 0x15}, +- {0x1144f, 0x15}, +- {0x11450, 0x15}, +- {0x11451, 0x15}, +- {0x1154e, 0x15}, +- {0x1154f, 0x15}, +- {0x11550, 0x15}, +- {0x11551, 0x15}, +- {0x1164e, 0x15}, +- {0x1164f, 0x15}, +- {0x11650, 0x15}, +- {0x11651, 0x15}, +- {0x1174e, 0x15}, +- {0x1174f, 0x15}, +- {0x11750, 0x15}, +- {0x11751, 0x15}, +- {0x1184e, 0x15}, +- {0x1184f, 0x15}, +- {0x11850, 0x15}, +- {0x11851, 0x15}, +- {0x1204e, 0x15}, +- {0x1204f, 0x15}, +- {0x12050, 0x15}, +- {0x12051, 0x15}, +- {0x1214e, 0x15}, +- {0x1214f, 0x15}, +- {0x12150, 0x15}, +- {0x12151, 0x15}, +- {0x1224e, 0x15}, +- {0x1224f, 0x15}, +- {0x12250, 0x15}, +- {0x12251, 0x15}, +- {0x1234e, 0x15}, +- {0x1234f, 0x15}, +- {0x12350, 0x15}, +- {0x12351, 0x15}, +- {0x1244e, 0x15}, +- {0x1244f, 0x15}, +- {0x12450, 0x15}, +- {0x12451, 0x15}, +- {0x1254e, 0x15}, +- {0x1254f, 0x15}, +- {0x12550, 0x15}, +- {0x12551, 0x15}, +- {0x1264e, 0x15}, +- {0x1264f, 0x15}, +- {0x12650, 0x15}, +- {0x12651, 0x15}, +- {0x1274e, 0x15}, +- {0x1274f, 0x15}, +- {0x12750, 0x15}, +- {0x12751, 0x15}, +- {0x1284e, 0x15}, +- {0x1284f, 0x15}, +- {0x12850, 0x15}, +- {0x12851, 0x15}, +- {0x1304e, 0x15}, +- {0x1304f, 0x15}, +- {0x13050, 0x15}, +- {0x13051, 0x15}, +- {0x1314e, 0x15}, +- {0x1314f, 0x15}, +- {0x13150, 0x15}, +- {0x13151, 0x15}, +- {0x1324e, 0x15}, +- {0x1324f, 0x15}, +- {0x13250, 0x15}, +- {0x13251, 0x15}, +- {0x1334e, 0x15}, +- {0x1334f, 0x15}, +- {0x13350, 0x15}, +- {0x13351, 0x15}, +- {0x1344e, 0x15}, +- {0x1344f, 0x15}, +- {0x13450, 0x15}, +- {0x13451, 0x15}, +- {0x1354e, 0x15}, +- {0x1354f, 0x15}, +- {0x13550, 0x15}, +- {0x13551, 0x15}, +- {0x1364e, 0x15}, +- {0x1364f, 0x15}, +- {0x13650, 0x15}, +- {0x13651, 0x15}, +- {0x1374e, 0x15}, +- {0x1374f, 0x15}, +- {0x13750, 0x15}, +- {0x13751, 0x15}, +- {0x1384e, 0x15}, +- {0x1384f, 0x15}, +- {0x13850, 0x15}, +- {0x13851, 0x15}, +- {0x30030, 0x0}, +- {0x30031, 0x0}, +- {0x30035, 0x0}, +- {0x31030, 0x0}, +- {0x31031, 0x0}, +- {0x31035, 0x0}, +- {0x10030, 0x0}, +- {0x10035, 0x0}, +- {0x10036, 0x0}, +- {0x11030, 0x0}, +- {0x11035, 0x0}, +- {0x11036, 0x0}, +- {0x12030, 0x0}, +- {0x12035, 0x0}, +- {0x12036, 0x0}, +- {0x13030, 0x0}, +- {0x13035, 0x0}, +- {0x13036, 0x0}, +- {0x3003c, 0x5}, +- {0x3103c, 0x5}, +- {0x1003c, 0x5}, +- {0x1003d, 0x5}, +- {0x1003e, 0x5}, +- {0x1103c, 0x5}, +- {0x1103d, 0x5}, +- {0x1103e, 0x5}, +- {0x1203c, 0x5}, +- {0x1203d, 0x5}, +- {0x1203e, 0x5}, +- {0x1303c, 0x5}, +- {0x1303d, 0x5}, +- {0x1303e, 0x5}, +- {0x20003, 0x1}, +- {0x10006, 0x2}, +- {0x11006, 0x2}, +- {0x12006, 0x2}, +- {0x13006, 0x2}, +- {0x20001, 0x1122}, +- {0x20009, 0x0}, +- {0x20008, 0x0}, +- {0x200d9, 0x1}, +- {0x30eef, 0x0}, +- {0x31eef, 0x0}, +- {0x20014, 0x1301}, +- {0x9080a, 0x1300}, +- {0x10040, 0xe0e}, +- {0x10042, 0xe0e}, +- {0x9080d, 0x0}, +- {0x10043, 0x0}, +- {0x10044, 0xe0e}, +- {0x10045, 0xe0e}, +- {0x11040, 0xe0e}, +- {0x11042, 0xe0e}, +- {0x9080d, 0x0}, +- {0x11043, 0x0}, +- {0x11044, 0xe0e}, +- {0x11045, 0xe0e}, +- {0x12040, 0xe0e}, +- {0x12042, 0xe0e}, +- {0x9080d, 0x0}, +- {0x12043, 0x0}, +- {0x12044, 0xe0e}, +- {0x12045, 0xe0e}, +- {0x13040, 0xe0e}, +- {0x13042, 0xe0e}, +- {0x9080d, 0x0}, +- {0x13043, 0x0}, +- {0x13044, 0xe0e}, +- {0x13045, 0xe0e}, +- {0x30040, 0xe0e}, +- {0x30041, 0xe0e}, +- {0x30042, 0xe0e}, +- {0x30043, 0xe0e}, +- {0x30330, 0x33}, +- {0x31040, 0xe0e}, +- {0x31041, 0xe0e}, +- {0x31042, 0xe0e}, +- {0x31043, 0xe0e}, +- {0x31330, 0x33}, +- {0x20331, 0x33}, +- {0x10048, 0xc00}, +- {0x1004a, 0xc00}, +- {0x1004b, 0xc00}, +- {0x1004c, 0xe00}, +- {0x1004d, 0xe00}, +- {0x11048, 0xc00}, +- {0x1104a, 0xc00}, +- {0x1104b, 0xc00}, +- {0x1104c, 0xe00}, +- {0x1104d, 0xe00}, +- {0x12048, 0xc00}, +- {0x1204a, 0xc00}, +- {0x1204b, 0xc00}, +- {0x1204c, 0xe00}, +- {0x1204d, 0xe00}, +- {0x13048, 0xc00}, +- {0x1304a, 0xc00}, +- {0x1304b, 0xc00}, +- {0x1304c, 0xe00}, +- {0x1304d, 0xe00}, +- {0x30048, 0xc00}, +- {0x30049, 0xc00}, +- {0x3004a, 0xc00}, +- {0x3004b, 0xc00}, +- {0x31048, 0xc00}, +- {0x31049, 0xc00}, +- {0x3104a, 0xc00}, +- {0x3104b, 0xc00}, +- {0x30033, 0xcc}, +- {0x30034, 0xcc}, +- {0x3002e, 0xcc}, +- {0x31033, 0xcc}, +- {0x31034, 0xcc}, +- {0x3102e, 0xcc}, +- {0x10033, 0xcc}, +- {0x1002e, 0xcc}, +- {0x1002f, 0xcc}, +- {0x11033, 0xcc}, +- {0x1102e, 0xcc}, +- {0x1102f, 0xcc}, +- {0x12033, 0xcc}, +- {0x1202e, 0xcc}, +- {0x1202f, 0xcc}, +- {0x13033, 0xcc}, +- {0x1302e, 0xcc}, +- {0x1302f, 0xcc}, +- {0x20015, 0x0}, +- {0x90806, 0x0}, +- {0x100e8, 0x0}, +- {0x100e9, 0x15}, +- {0x110e8, 0x0}, +- {0x110e9, 0x15}, +- {0x120e8, 0x0}, +- {0x120e9, 0x15}, +- {0x130e8, 0x0}, +- {0x130e9, 0x15}, +- {0x10001, 0x0}, +- {0x11001, 0x0}, +- {0x12001, 0x0}, +- {0x13001, 0x0}, +- {0x20012, 0xa1a1}, +- {0x20017, 0x40}, +- {0x2000a, 0x40}, +- {0x20186, 0xa1}, +- {0x20187, 0x40}, +- {0x20010, 0x0}, +- {0x20011, 0xf}, +- {0x9080b, 0xf}, +- {0x9080c, 0xf}, +- {0x100a5, 0x1}, +- {0x110a5, 0x1}, +- {0x120a5, 0x1}, +- {0x130a5, 0x1}, +- {0x10014, 0x3232}, +- {0x11014, 0x3232}, +- {0x12014, 0x3232}, +- {0x13014, 0x3232}, +- {0x1000f, 0x1086}, +- {0x1100f, 0x1086}, +- {0x1200f, 0x1086}, +- {0x1300f, 0x1086}, +- {0x20035, 0x100c}, +- {0x20036, 0x100c}, +- {0x20037, 0x41c}, +- {0x20037, 0x45c}, +- {0x20038, 0x1920}, +- {0x20039, 0x101c}, +- {0x2003a, 0x101c}, +- {0x2003b, 0x42c}, +- {0x2003c, 0x2d30}, +- {0x2003d, 0x1004}, +- {0x2003e, 0x1004}, +- {0x2003f, 0x414}, +- {0x20040, 0x1118}, +- {0x2002c, 0x843}, +- {0x2002d, 0x843}, +- {0x20030, 0x843}, +- {0x2002e, 0x81f}, +- {0x2002f, 0x81f}, +- {0x2000c, 0x0}, +- {0x2001b, 0x0}, +- {0x10007, 0x0}, +- {0x11007, 0x0}, +- {0x12007, 0x0}, +- {0x13007, 0x0}, +- {0xc0080, 0x3}, +-}; +- +-/* P0 message block parameter for training firmware */ +-static struct ddrphy_cfg_param ddr_phy_msgh_fsp0_cfg[] = { +- {0x58000, 0x4000}, +- {0x58002, 0x30}, +- {0x58003, 0x1900}, +- {0x58004, 0x4}, +- {0x58005, 0x4}, +- {0x58008, 0x17df}, +- {0x58009, 0xc8}, +- {0x5800b, 0x2}, +- {0x5800d, 0x100}, +- {0x5800e, 0xf}, +- {0x58012, 0x310}, +- {0x5801f, 0x1000}, +- {0x58020, 0x3}, +- {0x5802d, 0xb0b0}, +- {0x5802e, 0xb0b0}, +- {0x5802f, 0xbbbb}, +- {0x58030, 0xbbbb}, +- {0x58031, 0x606}, +- {0x58032, 0x606}, +- {0x58033, 0x5454}, +- {0x58034, 0x5454}, +- {0x58035, 0x4646}, +- {0x58036, 0x4646}, +- {0x58037, 0x2d2d}, +- {0x58038, 0x2d2d}, +- {0x58039, 0x8080}, +- {0x5803a, 0x8080}, +- {0x5803b, 0x1c1c}, +- {0x5803c, 0x1c1c}, +- {0x5803d, 0x1c1c}, +- {0x5803e, 0x1c1c}, +- {0x58041, 0xac84}, +- {0x58042, 0xac84}, +- {0x58043, 0x1b1b}, +- {0x58044, 0x1b1b}, +- {0x58045, 0x1010}, +- {0x58046, 0x1010}, +- {0x58047, 0x202}, +- {0x58048, 0x202}, +- {0x5804f, 0x8080}, +- {0x58050, 0x8080}, +- {0x58055, 0x404}, +- {0x58056, 0x404}, +- {0x58074, 0x2e}, +- {0x58075, 0x50}, +- {0x58080, 0x1}, +- {0x58081, 0x4b00}, +- {0x58082, 0x43}, +-}; +- +-/* DRAM PHY init engine image for Pstate 0 */ +-static struct ddrphy_cfg_param ddr_phy_pie_fsp0_cfg[] = { +- {0x908f0, 0x65}, +- {0x908f1, 0x258}, +- {0x908f2, 0x0}, +- {0x908f3, 0x58}, +- {0x908f4, 0x14}, +- {0x908f5, 0x0}, +- {0x908f6, 0xb0}, +- {0x908f7, 0x0}, +- {0x41008, 0xc9d8}, +- {0x41009, 0x0}, +- {0x4100a, 0x0}, +- {0x4100b, 0x0}, +- {0x4100c, 0xc808}, +- {0x4100d, 0x0}, +- {0x4100e, 0x0}, +- {0x4100f, 0x0}, +- {0x41010, 0x0}, +- {0x41011, 0x0}, +- {0x41012, 0x0}, +- {0x41013, 0x2b00}, +- {0x41014, 0x0}, +- {0x41015, 0x0}, +- {0x41016, 0x0}, +- {0x41017, 0x0}, +- {0x41018, 0xc958}, +- {0x41019, 0x0}, +- {0x4101a, 0x0}, +- {0x4101b, 0x0}, +- {0x4101c, 0xcd88}, +- {0x4101d, 0x0}, +- {0x4101e, 0x0}, +- {0x4101f, 0x0}, +- {0x41020, 0x0}, +- {0x41021, 0x0}, +- {0x41022, 0x0}, +- {0x41023, 0x2b00}, +- {0x41024, 0x0}, +- {0x41025, 0x0}, +- {0x41026, 0x0}, +- {0x41027, 0x0}, +- {0x41028, 0xc0d8}, +- {0x41029, 0x0}, +- {0x4102a, 0x0}, +- {0x4102b, 0x0}, +- {0x4102c, 0xd848}, +- {0x4102d, 0x0}, +- {0x4102e, 0x0}, +- {0x4102f, 0x0}, +- {0x41030, 0x0}, +- {0x41031, 0x0}, +- {0x41032, 0x0}, +- {0x41033, 0x2b00}, +- {0x41034, 0x0}, +- {0x41035, 0x0}, +- {0x41036, 0x0}, +- {0x41037, 0x0}, +- {0x41038, 0xc158}, +- {0x41039, 0x0}, +- {0x4103a, 0x0}, +- {0x4103b, 0x0}, +- {0x4103c, 0xddc8}, +- {0x4103d, 0x0}, +- {0x4103e, 0x0}, +- {0x4103f, 0x0}, +- {0x41040, 0x0}, +- {0x41041, 0x0}, +- {0x41042, 0x0}, +- {0x41043, 0x2b00}, +- {0x41044, 0x0}, +- {0x41045, 0x0}, +- {0x41046, 0x0}, +- {0x41047, 0x0}, +- {0x41048, 0xc1d8}, +- {0x41049, 0x0}, +- {0x4104a, 0x0}, +- {0x4104b, 0x0}, +- {0x4104c, 0xc308}, +- {0x4104d, 0x0}, +- {0x4104e, 0x0}, +- {0x4104f, 0x0}, +- {0x41050, 0x0}, +- {0x41051, 0x0}, +- {0x41052, 0x0}, +- {0x41053, 0x2b00}, +- {0x41054, 0x0}, +- {0x41055, 0x0}, +- {0x41056, 0x0}, +- {0x41057, 0x0}, +- {0x41058, 0xc558}, +- {0x41059, 0x0}, +- {0x4105a, 0x0}, +- {0x4105b, 0x0}, +- {0x4105c, 0xea08}, +- {0x4105d, 0x0}, +- {0x4105e, 0x0}, +- {0x4105f, 0x0}, +- {0x41060, 0x0}, +- {0x41061, 0x0}, +- {0x41062, 0x0}, +- {0x41063, 0x2b00}, +- {0x41064, 0x0}, +- {0x41065, 0x0}, +- {0x41066, 0x0}, +- {0x41067, 0x0}, +- {0x41068, 0xc5d8}, +- {0x41069, 0x0}, +- {0x4106a, 0x0}, +- {0x4106b, 0x0}, +- {0x4106c, 0xe308}, +- {0x4106d, 0x0}, +- {0x4106e, 0x0}, +- {0x4106f, 0x0}, +- {0x41070, 0x0}, +- {0x41071, 0x0}, +- {0x41072, 0x0}, +- {0x41073, 0x2b00}, +- {0x41074, 0x0}, +- {0x41075, 0x0}, +- {0x41076, 0x0}, +- {0x41077, 0x0}, +- {0x41078, 0x48d8}, +- {0x41079, 0x0}, +- {0x4107a, 0x0}, +- {0x4107b, 0x0}, +- {0x4107c, 0x4248}, +- {0x4107d, 0x0}, +- {0x4107e, 0x0}, +- {0x4107f, 0x0}, +- {0x41080, 0x88d8}, +- {0x41081, 0x0}, +- {0x41082, 0x0}, +- {0x41083, 0x0}, +- {0x41084, 0x9648}, +- {0x41085, 0x0}, +- {0x41086, 0x0}, +- {0x41087, 0x0}, +- {0x41088, 0x0}, +- {0x41089, 0x0}, +- {0x4108a, 0x0}, +- {0x4108b, 0x2b00}, +- {0x4108c, 0x0}, +- {0x4108d, 0x0}, +- {0x4108e, 0x0}, +- {0x4108f, 0x0}, +- {0x41090, 0xca58}, +- {0x41091, 0x0}, +- {0x41092, 0x0}, +- {0x41093, 0x0}, +- {0x41094, 0xc108}, +- {0x41095, 0x0}, +- {0x41096, 0x0}, +- {0x41097, 0x0}, +- {0x41098, 0x0}, +- {0x41099, 0x0}, +- {0x4109a, 0x0}, +- {0x4109b, 0x2b00}, +- {0x4109c, 0x0}, +- {0x4109d, 0x0}, +- {0x4109e, 0x0}, +- {0x4109f, 0x0}, +- {0x410a0, 0xcb58}, +- {0x410a1, 0x0}, +- {0x410a2, 0x0}, +- {0x410a3, 0x0}, +- {0x410a4, 0xc008}, +- {0x410a5, 0x0}, +- {0x410a6, 0x0}, +- {0x410a7, 0x0}, +- {0x410a8, 0x0}, +- {0x410a9, 0x0}, +- {0x410aa, 0x0}, +- {0x410ab, 0x2b00}, +- {0x410ac, 0x0}, +- {0x410ad, 0x0}, +- {0x410ae, 0x0}, +- {0x410af, 0x0}, +- {0x410b0, 0xd4d8}, +- {0x410b1, 0x0}, +- {0x410b2, 0x0}, +- {0x410b3, 0x0}, +- {0x410b4, 0xc008}, +- {0x410b5, 0x0}, +- {0x410b6, 0x0}, +- {0x410b7, 0x0}, +- {0x20015, 0x0}, +- {0x3004a, 0x0}, +- {0x3004b, 0x0}, +- {0x3104a, 0x0}, +- {0x3104b, 0x0}, +- {0x2004a, 0x1a3e}, +- {0x2004b, 0x1a3e}, +- {0x2004c, 0x2c0f}, +- {0x2004d, 0x0}, +- {0x20088, 0x101}, +- {0x20089, 0x0}, +- {0x2008a, 0x0}, +- {0x2008c, 0x0}, +- {0x20041, 0x1}, +- {0x90802, 0x0}, +- {0x20045, 0x2}, +- {0x10057, 0x0}, +- {0x11057, 0x0}, +- {0x12057, 0x0}, +- {0x13057, 0x0}, +- {0x1000f, 0x1087}, +- {0x1100f, 0x1087}, +- {0x1200f, 0x1087}, +- {0x1300f, 0x1087}, +- {0x90803, 0x4}, +- {0x90804, 0x82}, +- {0x90805, 0x1}, +- {0x90903, 0x0}, +- {0x9090b, 0x2}, +- {0x90811, 0x0}, +- {0x90812, 0xff00}, +- {0x20072, 0x3}, +- {0x9080e, 0x3}, +- {0x20073, 0x3}, +- {0x9080f, 0x3}, +-}; +- +-/* DRAM PHY init engine image */ +-static struct ddrphy_cfg_param ddr_phy_pie[] = { +- {0x41000, 0x0}, +- {0x41001, 0x0}, +- {0x41002, 0x0}, +- {0x41003, 0x0}, +- {0x41004, 0x0}, +- {0x41005, 0x0}, +- {0x41006, 0x0}, +- {0x41007, 0x0}, +- {0x41388, 0xc028}, +- {0x41389, 0x0}, +- {0x4138a, 0x0}, +- {0x4138b, 0x10}, +- {0x4138c, 0x0}, +- {0x4138d, 0x0}, +- {0x4138e, 0x0}, +- {0x4138f, 0x0}, +- {0x41390, 0x0}, +- {0x41391, 0x0}, +- {0x41392, 0x0}, +- {0x41393, 0x400}, +- {0x41394, 0x0}, +- {0x41395, 0x0}, +- {0x41396, 0x0}, +- {0x41397, 0x0}, +- {0x41398, 0x0}, +- {0x41399, 0x0}, +- {0x4139a, 0x0}, +- {0x4139b, 0x0}, +- {0x4139c, 0x0}, +- {0x4139d, 0x0}, +- {0x4139e, 0x0}, +- {0x4139f, 0x0}, +- {0x413a0, 0xc858}, +- {0x413a1, 0x0}, +- {0x413a2, 0x0}, +- {0x413a3, 0x10}, +- {0x413a4, 0xe088}, +- {0x413a5, 0x0}, +- {0x413a6, 0x0}, +- {0x413a7, 0x10}, +- {0x413a8, 0xe038}, +- {0x413a9, 0x0}, +- {0x413aa, 0x0}, +- {0x413ab, 0x10}, +- {0x413ac, 0xc858}, +- {0x413ad, 0x0}, +- {0x413ae, 0x0}, +- {0x413af, 0x10}, +- {0x413b0, 0xc088}, +- {0x413b1, 0x0}, +- {0x413b2, 0x0}, +- {0x413b3, 0x10}, +- {0x413b4, 0x0}, +- {0x413b5, 0x0}, +- {0x413b6, 0x0}, +- {0x413b7, 0x0}, +- {0x413b8, 0xc028}, +- {0x413b9, 0x0}, +- {0x413ba, 0x0}, +- {0x413bb, 0x10}, +- {0x413bc, 0x0}, +- {0x413bd, 0x0}, +- {0x413be, 0x0}, +- {0x413bf, 0x0}, +- {0x413c0, 0x0}, +- {0x413c1, 0x0}, +- {0x413c2, 0x0}, +- {0x413c3, 0x400}, +- {0x413c4, 0x0}, +- {0x413c5, 0x0}, +- {0x413c6, 0x0}, +- {0x413c7, 0x0}, +- {0x413c8, 0x0}, +- {0x413c9, 0x0}, +- {0x413ca, 0x0}, +- {0x413cb, 0x0}, +- {0x413cc, 0x0}, +- {0x413cd, 0x0}, +- {0x413ce, 0x0}, +- {0x413cf, 0x0}, +- {0x413d0, 0xc858}, +- {0x413d1, 0x0}, +- {0x413d2, 0x0}, +- {0x413d3, 0x10}, +- {0x413d4, 0xe208}, +- {0x413d5, 0x0}, +- {0x413d6, 0x0}, +- {0x413d7, 0x10}, +- {0x413d8, 0xe038}, +- {0x413d9, 0x0}, +- {0x413da, 0x0}, +- {0x413db, 0x10}, +- {0x413dc, 0xc858}, +- {0x413dd, 0x0}, +- {0x413de, 0x0}, +- {0x413df, 0x10}, +- {0x413e0, 0xc208}, +- {0x413e1, 0x0}, +- {0x413e2, 0x0}, +- {0x413e3, 0x10}, +- {0x413e4, 0x0}, +- {0x413e5, 0x0}, +- {0x413e6, 0x0}, +- {0x413e7, 0x0}, +- {0x413e8, 0xce58}, +- {0x413e9, 0x0}, +- {0x413ea, 0x0}, +- {0x413eb, 0x10}, +- {0x413ec, 0xc208}, +- {0x413ed, 0x0}, +- {0x413ee, 0x0}, +- {0x413ef, 0x10}, +- {0x413f0, 0x0}, +- {0x413f1, 0x0}, +- {0x413f2, 0x0}, +- {0x413f3, 0x0}, +- {0x413f4, 0x0}, +- {0x413f5, 0x0}, +- {0x413f6, 0x0}, +- {0x413f7, 0x0}, +- {0x413f8, 0xc370}, +- {0x413f9, 0x0}, +- {0x413fa, 0x0}, +- {0x413fb, 0x10}, +- {0x413fc, 0x0}, +- {0x413fd, 0x0}, +- {0x413fe, 0x0}, +- {0x413ff, 0x0}, +- {0x41400, 0xc040}, +- {0x41401, 0x0}, +- {0x41402, 0x0}, +- {0x41403, 0x10}, +- {0x41404, 0x0}, +- {0x41405, 0x0}, +- {0x41406, 0x0}, +- {0x41407, 0x10}, +- {0x41408, 0xd2d8}, +- {0x41409, 0x0}, +- {0x4140a, 0x0}, +- {0x4140b, 0x10}, +- {0x4140c, 0xe008}, +- {0x4140d, 0x0}, +- {0x4140e, 0x0}, +- {0x4140f, 0x10}, +- {0x41410, 0x0}, +- {0x41411, 0x0}, +- {0x41412, 0x0}, +- {0x41413, 0x5b00}, +- {0x41414, 0x0}, +- {0x41415, 0x0}, +- {0x41416, 0x0}, +- {0x41417, 0x0}, +- {0x41418, 0xc0f0}, +- {0x41419, 0x0}, +- {0x4141a, 0x0}, +- {0x4141b, 0x10}, +- {0x4141c, 0x0}, +- {0x4141d, 0x0}, +- {0x4141e, 0x0}, +- {0x4141f, 0x0}, +- {0x41420, 0xcfd8}, +- {0x41421, 0x0}, +- {0x41422, 0x0}, +- {0x41423, 0x10}, +- {0x41424, 0xc008}, +- {0x41425, 0x0}, +- {0x41426, 0x0}, +- {0x41427, 0x10}, +- {0x41428, 0x0}, +- {0x41429, 0x0}, +- {0x4142a, 0x0}, +- {0x4142b, 0x2b00}, +- {0x4142c, 0x0}, +- {0x4142d, 0x0}, +- {0x4142e, 0x0}, +- {0x4142f, 0x0}, +- {0x41430, 0xd058}, +- {0x41431, 0x0}, +- {0x41432, 0x0}, +- {0x41433, 0x10}, +- {0x41434, 0xc008}, +- {0x41435, 0x0}, +- {0x41436, 0x0}, +- {0x41437, 0x10}, +- {0x41438, 0x0}, +- {0x41439, 0x0}, +- {0x4143a, 0x0}, +- {0x4143b, 0x2b00}, +- {0x4143c, 0x0}, +- {0x4143d, 0x0}, +- {0x4143e, 0x0}, +- {0x4143f, 0x0}, +- {0x41440, 0xd0d8}, +- {0x41441, 0x0}, +- {0x41442, 0x0}, +- {0x41443, 0x10}, +- {0x41444, 0xc088}, +- {0x41445, 0x0}, +- {0x41446, 0x0}, +- {0x41447, 0x10}, +- {0x41448, 0x0}, +- {0x41449, 0x0}, +- {0x4144a, 0x0}, +- {0x4144b, 0x2b00}, +- {0x4144c, 0x0}, +- {0x4144d, 0x0}, +- {0x4144e, 0x0}, +- {0x4144f, 0x0}, +- {0x41450, 0xd158}, +- {0x41451, 0x0}, +- {0x41452, 0x0}, +- {0x41453, 0x10}, +- {0x41454, 0xc008}, +- {0x41455, 0x0}, +- {0x41456, 0x0}, +- {0x41457, 0x10}, +- {0x41458, 0x0}, +- {0x41459, 0x0}, +- {0x4145a, 0x0}, +- {0x4145b, 0x5b00}, +- {0x4145c, 0x0}, +- {0x4145d, 0x0}, +- {0x4145e, 0x0}, +- {0x4145f, 0x0}, +- {0x41460, 0x402c}, +- {0x41461, 0xd00}, +- {0x41462, 0x1}, +- {0x41463, 0x400}, +- {0x41464, 0x4050}, +- {0x41465, 0x800}, +- {0x41466, 0x0}, +- {0x41467, 0x0}, +- {0x41468, 0x0}, +- {0x41469, 0x0}, +- {0x4146a, 0x0}, +- {0x4146b, 0x400}, +- {0x4146c, 0x0}, +- {0x4146d, 0x0}, +- {0x4146e, 0x0}, +- {0x4146f, 0x0}, +- {0x41470, 0x0}, +- {0x41471, 0x0}, +- {0x41472, 0x0}, +- {0x41473, 0x400}, +- {0x41474, 0x4050}, +- {0x41475, 0x803}, +- {0x41476, 0x0}, +- {0x41477, 0x0}, +- {0x41478, 0x0}, +- {0x41479, 0x0}, +- {0x4147a, 0x0}, +- {0x4147b, 0x7f00}, +- {0x4147c, 0x0}, +- {0x4147d, 0x0}, +- {0x4147e, 0x0}, +- {0x4147f, 0x400}, +- {0x41480, 0x407c}, +- {0x41481, 0x0}, +- {0x41482, 0x0}, +- {0x41483, 0x400}, +- {0x41484, 0x0}, +- {0x41485, 0x0}, +- {0x41486, 0x0}, +- {0x41487, 0x0}, +- {0x41488, 0x0}, +- {0x41489, 0x0}, +- {0x4148a, 0x0}, +- {0x4148b, 0x400}, +- {0x4148c, 0x0}, +- {0x4148d, 0x0}, +- {0x4148e, 0x1}, +- {0x4148f, 0x0}, +- {0x41490, 0x0}, +- {0x41491, 0x0}, +- {0x41492, 0x0}, +- {0x41493, 0x400}, +- {0x41494, 0x0}, +- {0x41495, 0x0}, +- {0x41496, 0x0}, +- {0x41497, 0x0}, +- {0x41498, 0x0}, +- {0x41499, 0x0}, +- {0x4149a, 0x0}, +- {0x4149b, 0x0}, +- {0x4149c, 0x0}, +- {0x4149d, 0x0}, +- {0x4149e, 0x0}, +- {0x4149f, 0x0}, +- {0x414a0, 0x802c}, +- {0x414a1, 0xd00}, +- {0x414a2, 0x1}, +- {0x414a3, 0x410}, +- {0x414a4, 0x8050}, +- {0x414a5, 0x800}, +- {0x414a6, 0x0}, +- {0x414a7, 0x10}, +- {0x414a8, 0x0}, +- {0x414a9, 0x0}, +- {0x414aa, 0x0}, +- {0x414ab, 0x400}, +- {0x414ac, 0x0}, +- {0x414ad, 0x0}, +- {0x414ae, 0x0}, +- {0x414af, 0x0}, +- {0x414b0, 0x0}, +- {0x414b1, 0x0}, +- {0x414b2, 0x0}, +- {0x414b3, 0x400}, +- {0x414b4, 0x8050}, +- {0x414b5, 0x803}, +- {0x414b6, 0x0}, +- {0x414b7, 0x10}, +- {0x414b8, 0x0}, +- {0x414b9, 0x0}, +- {0x414ba, 0x0}, +- {0x414bb, 0x7f00}, +- {0x414bc, 0x0}, +- {0x414bd, 0x0}, +- {0x414be, 0x0}, +- {0x414bf, 0x400}, +- {0x414c0, 0x807c}, +- {0x414c1, 0x0}, +- {0x414c2, 0x0}, +- {0x414c3, 0x410}, +- {0x414c4, 0x0}, +- {0x414c5, 0x0}, +- {0x414c6, 0x0}, +- {0x414c7, 0x0}, +- {0x414c8, 0x0}, +- {0x414c9, 0x0}, +- {0x414ca, 0x0}, +- {0x414cb, 0x400}, +- {0x414cc, 0x0}, +- {0x414cd, 0x0}, +- {0x414ce, 0x1}, +- {0x414cf, 0x0}, +- {0x414d0, 0x0}, +- {0x414d1, 0x0}, +- {0x414d2, 0x0}, +- {0x414d3, 0x400}, +- {0x414d4, 0x0}, +- {0x414d5, 0x0}, +- {0x414d6, 0x0}, +- {0x414d7, 0x0}, +- {0x414d8, 0x0}, +- {0x414d9, 0x0}, +- {0x414da, 0x0}, +- {0x414db, 0x0}, +- {0x414dc, 0x0}, +- {0x414dd, 0x0}, +- {0x414de, 0x0}, +- {0x414df, 0x0}, +- {0x414e0, 0x402c}, +- {0x414e1, 0xd00}, +- {0x414e2, 0x1}, +- {0x414e3, 0x0}, +- {0x414e4, 0x4050}, +- {0x414e5, 0x800}, +- {0x414e6, 0x0}, +- {0x414e7, 0x0}, +- {0x414e8, 0x0}, +- {0x414e9, 0x0}, +- {0x414ea, 0x0}, +- {0x414eb, 0x0}, +- {0x414ec, 0x0}, +- {0x414ed, 0x0}, +- {0x414ee, 0x0}, +- {0x414ef, 0x0}, +- {0x414f0, 0x0}, +- {0x414f1, 0x0}, +- {0x414f2, 0x0}, +- {0x414f3, 0x0}, +- {0x414f4, 0x4050}, +- {0x414f5, 0x803}, +- {0x414f6, 0x0}, +- {0x414f7, 0x0}, +- {0x414f8, 0x0}, +- {0x414f9, 0x0}, +- {0x414fa, 0x0}, +- {0x414fb, 0x0}, +- {0x414fc, 0x0}, +- {0x414fd, 0x0}, +- {0x414fe, 0x0}, +- {0x414ff, 0x0}, +- {0x41500, 0x0}, +- {0x41501, 0x0}, +- {0x41502, 0x0}, +- {0x41503, 0x0}, +- {0x41504, 0x4050}, +- {0x41505, 0x800}, +- {0x41506, 0x0}, +- {0x41507, 0x0}, +- {0x41508, 0x0}, +- {0x41509, 0x0}, +- {0x4150a, 0x0}, +- {0x4150b, 0x6b00}, +- {0x4150c, 0x0}, +- {0x4150d, 0x0}, +- {0x4150e, 0x0}, +- {0x4150f, 0x400}, +- {0x41510, 0x0}, +- {0x41511, 0x0}, +- {0x41512, 0x0}, +- {0x41513, 0x0}, +- {0x41514, 0x407c}, +- {0x41515, 0x0}, +- {0x41516, 0x0}, +- {0x41517, 0x0}, +- {0x41518, 0x0}, +- {0x41519, 0x0}, +- {0x4151a, 0x0}, +- {0x4151b, 0x0}, +- {0x4151c, 0x0}, +- {0x4151d, 0x0}, +- {0x4151e, 0x0}, +- {0x4151f, 0x0}, +- {0x41520, 0x0}, +- {0x41521, 0x0}, +- {0x41522, 0x1}, +- {0x41523, 0x0}, +- {0x41524, 0x0}, +- {0x41525, 0x0}, +- {0x41526, 0x0}, +- {0x41527, 0x0}, +- {0x41528, 0x0}, +- {0x41529, 0x0}, +- {0x4152a, 0x0}, +- {0x4152b, 0x4b00}, +- {0x4152c, 0x0}, +- {0x4152d, 0x0}, +- {0x4152e, 0x0}, +- {0x4152f, 0x1800}, +- {0x41530, 0x0}, +- {0x41531, 0x0}, +- {0x41532, 0x0}, +- {0x41533, 0x0}, +- {0x41534, 0x802c}, +- {0x41535, 0xd00}, +- {0x41536, 0x1}, +- {0x41537, 0x10}, +- {0x41538, 0x8050}, +- {0x41539, 0x800}, +- {0x4153a, 0x0}, +- {0x4153b, 0x10}, +- {0x4153c, 0x0}, +- {0x4153d, 0x0}, +- {0x4153e, 0x0}, +- {0x4153f, 0x0}, +- {0x41540, 0x0}, +- {0x41541, 0x0}, +- {0x41542, 0x0}, +- {0x41543, 0x0}, +- {0x41544, 0x0}, +- {0x41545, 0x0}, +- {0x41546, 0x0}, +- {0x41547, 0x0}, +- {0x41548, 0x8050}, +- {0x41549, 0x803}, +- {0x4154a, 0x0}, +- {0x4154b, 0x10}, +- {0x4154c, 0x0}, +- {0x4154d, 0x0}, +- {0x4154e, 0x0}, +- {0x4154f, 0x0}, +- {0x41550, 0x0}, +- {0x41551, 0x0}, +- {0x41552, 0x0}, +- {0x41553, 0x0}, +- {0x41554, 0x0}, +- {0x41555, 0x0}, +- {0x41556, 0x0}, +- {0x41557, 0x0}, +- {0x41558, 0x8050}, +- {0x41559, 0x800}, +- {0x4155a, 0x0}, +- {0x4155b, 0x10}, +- {0x4155c, 0x0}, +- {0x4155d, 0x0}, +- {0x4155e, 0x0}, +- {0x4155f, 0x0}, +- {0x41560, 0x0}, +- {0x41561, 0x0}, +- {0x41562, 0x0}, +- {0x41563, 0x6b00}, +- {0x41564, 0x0}, +- {0x41565, 0x0}, +- {0x41566, 0x0}, +- {0x41567, 0x400}, +- {0x41568, 0x807c}, +- {0x41569, 0x0}, +- {0x4156a, 0x0}, +- {0x4156b, 0x10}, +- {0x4156c, 0x0}, +- {0x4156d, 0x0}, +- {0x4156e, 0x0}, +- {0x4156f, 0x0}, +- {0x41570, 0x0}, +- {0x41571, 0x0}, +- {0x41572, 0x0}, +- {0x41573, 0x0}, +- {0x41574, 0x0}, +- {0x41575, 0x0}, +- {0x41576, 0x1}, +- {0x41577, 0x0}, +- {0x41578, 0x0}, +- {0x41579, 0x0}, +- {0x4157a, 0x0}, +- {0x4157b, 0x7b00}, +- {0x4157c, 0x0}, +- {0x4157d, 0x0}, +- {0x4157e, 0x0}, +- {0x4157f, 0x2000}, +- {0x41580, 0x402c}, +- {0x41581, 0xd00}, +- {0x41582, 0x1}, +- {0x41583, 0x0}, +- {0x41584, 0x5198}, +- {0x41585, 0x803}, +- {0x41586, 0x0}, +- {0x41587, 0x0}, +- {0x41588, 0x0}, +- {0x41589, 0x0}, +- {0x4158a, 0x0}, +- {0x4158b, 0x3b00}, +- {0x4158c, 0x0}, +- {0x4158d, 0x0}, +- {0x4158e, 0x0}, +- {0x4158f, 0x0}, +- {0x41590, 0x5218}, +- {0x41591, 0x803}, +- {0x41592, 0x0}, +- {0x41593, 0x0}, +- {0x41594, 0x0}, +- {0x41595, 0x0}, +- {0x41596, 0x0}, +- {0x41597, 0x0}, +- {0x41598, 0x0}, +- {0x41599, 0x0}, +- {0x4159a, 0x0}, +- {0x4159b, 0x6b00}, +- {0x4159c, 0x0}, +- {0x4159d, 0x0}, +- {0x4159e, 0x0}, +- {0x4159f, 0x400}, +- {0x415a0, 0x407c}, +- {0x415a1, 0x0}, +- {0x415a2, 0x0}, +- {0x415a3, 0x0}, +- {0x415a4, 0x0}, +- {0x415a5, 0x0}, +- {0x415a6, 0x0}, +- {0x415a7, 0x0}, +- {0x415a8, 0x0}, +- {0x415a9, 0x0}, +- {0x415aa, 0x0}, +- {0x415ab, 0x0}, +- {0x415ac, 0x0}, +- {0x415ad, 0x0}, +- {0x415ae, 0x1}, +- {0x415af, 0x0}, +- {0x415b0, 0x0}, +- {0x415b1, 0x0}, +- {0x415b2, 0x0}, +- {0x415b3, 0x1b00}, +- {0x415b4, 0x0}, +- {0x415b5, 0x0}, +- {0x415b6, 0x0}, +- {0x415b7, 0x0}, +- {0x415b8, 0x0}, +- {0x415b9, 0x0}, +- {0x415ba, 0x0}, +- {0x415bb, 0x0}, +- {0x415bc, 0x802c}, +- {0x415bd, 0xd00}, +- {0x415be, 0x1}, +- {0x415bf, 0x10}, +- {0x415c0, 0x9198}, +- {0x415c1, 0x803}, +- {0x415c2, 0x0}, +- {0x415c3, 0x10}, +- {0x415c4, 0x0}, +- {0x415c5, 0x0}, +- {0x415c6, 0x0}, +- {0x415c7, 0x0}, +- {0x415c8, 0x0}, +- {0x415c9, 0x0}, +- {0x415ca, 0x0}, +- {0x415cb, 0x2b00}, +- {0x415cc, 0x0}, +- {0x415cd, 0x0}, +- {0x415ce, 0x0}, +- {0x415cf, 0x0}, +- {0x415d0, 0x0}, +- {0x415d1, 0x0}, +- {0x415d2, 0x0}, +- {0x415d3, 0x0}, +- {0x415d4, 0x9218}, +- {0x415d5, 0x803}, +- {0x415d6, 0x0}, +- {0x415d7, 0x10}, +- {0x415d8, 0x0}, +- {0x415d9, 0x0}, +- {0x415da, 0x0}, +- {0x415db, 0x6b00}, +- {0x415dc, 0x0}, +- {0x415dd, 0x0}, +- {0x415de, 0x0}, +- {0x415df, 0x400}, +- {0x415e0, 0x0}, +- {0x415e1, 0x0}, +- {0x415e2, 0x0}, +- {0x415e3, 0x0}, +- {0x415e4, 0x807c}, +- {0x415e5, 0x0}, +- {0x415e6, 0x0}, +- {0x415e7, 0x10}, +- {0x415e8, 0x0}, +- {0x415e9, 0x0}, +- {0x415ea, 0x0}, +- {0x415eb, 0x0}, +- {0x415ec, 0x0}, +- {0x415ed, 0x0}, +- {0x415ee, 0x0}, +- {0x415ef, 0x0}, +- {0x415f0, 0x0}, +- {0x415f1, 0x0}, +- {0x415f2, 0x1}, +- {0x415f3, 0x0}, +- {0x415f4, 0x0}, +- {0x415f5, 0x0}, +- {0x415f6, 0x0}, +- {0x415f7, 0x0}, +- {0x415f8, 0x0}, +- {0x415f9, 0x0}, +- {0x415fa, 0x0}, +- {0x415fb, 0xb00}, +- {0x415fc, 0x0}, +- {0x415fd, 0x0}, +- {0x415fe, 0x0}, +- {0x415ff, 0x400}, +- {0x41600, 0x0}, +- {0x41601, 0x0}, +- {0x41602, 0x0}, +- {0x41603, 0x0}, +- {0x41604, 0x0}, +- {0x41605, 0x0}, +- {0x41606, 0x0}, +- {0x41607, 0x0}, +- {0x41608, 0x401c}, +- {0x41609, 0xd0}, +- {0x4160a, 0x1}, +- {0x4160b, 0x0}, +- {0x4160c, 0x4060}, +- {0x4160d, 0x84}, +- {0x4160e, 0x0}, +- {0x4160f, 0x0}, +- {0x41610, 0x0}, +- {0x41611, 0x0}, +- {0x41612, 0x0}, +- {0x41613, 0xb00}, +- {0x41614, 0x0}, +- {0x41615, 0x0}, +- {0x41616, 0x0}, +- {0x41617, 0x800}, +- {0x41618, 0x407c}, +- {0x41619, 0x0}, +- {0x4161a, 0x0}, +- {0x4161b, 0x0}, +- {0x4161c, 0x0}, +- {0x4161d, 0x0}, +- {0x4161e, 0x0}, +- {0x4161f, 0x0}, +- {0x41620, 0x0}, +- {0x41621, 0x0}, +- {0x41622, 0x0}, +- {0x41623, 0x0}, +- {0x41624, 0x4000}, +- {0x41625, 0x0}, +- {0x41626, 0x1}, +- {0x41627, 0x0}, +- {0x41628, 0x0}, +- {0x41629, 0x0}, +- {0x4162a, 0x0}, +- {0x4162b, 0x0}, +- {0x4162c, 0x402c}, +- {0x4162d, 0xd00}, +- {0x4162e, 0x1}, +- {0x4162f, 0x0}, +- {0x41630, 0x4020}, +- {0x41631, 0x803}, +- {0x41632, 0x0}, +- {0x41633, 0x0}, +- {0x41634, 0x0}, +- {0x41635, 0x0}, +- {0x41636, 0x0}, +- {0x41637, 0x0}, +- {0x41638, 0x0}, +- {0x41639, 0x0}, +- {0x4163a, 0x0}, +- {0x4163b, 0x2b00}, +- {0x4163c, 0x0}, +- {0x4163d, 0x0}, +- {0x4163e, 0x0}, +- {0x4163f, 0x800}, +- {0x41640, 0x0}, +- {0x41641, 0x0}, +- {0x41642, 0x0}, +- {0x41643, 0x0}, +- {0x41644, 0x407c}, +- {0x41645, 0x0}, +- {0x41646, 0x0}, +- {0x41647, 0x0}, +- {0x41648, 0x0}, +- {0x41649, 0x0}, +- {0x4164a, 0x0}, +- {0x4164b, 0x0}, +- {0x4164c, 0x0}, +- {0x4164d, 0x0}, +- {0x4164e, 0x0}, +- {0x4164f, 0x0}, +- {0x41650, 0x0}, +- {0x41651, 0x0}, +- {0x41652, 0x1}, +- {0x41653, 0x0}, +- {0x41654, 0x0}, +- {0x41655, 0x0}, +- {0x41656, 0x0}, +- {0x41657, 0x0}, +- {0x41658, 0x801c}, +- {0x41659, 0xd0}, +- {0x4165a, 0x1}, +- {0x4165b, 0x10}, +- {0x4165c, 0x8060}, +- {0x4165d, 0x84}, +- {0x4165e, 0x0}, +- {0x4165f, 0x10}, +- {0x41660, 0x0}, +- {0x41661, 0x0}, +- {0x41662, 0x0}, +- {0x41663, 0xb00}, +- {0x41664, 0x0}, +- {0x41665, 0x0}, +- {0x41666, 0x0}, +- {0x41667, 0x800}, +- {0x41668, 0x807c}, +- {0x41669, 0x0}, +- {0x4166a, 0x0}, +- {0x4166b, 0x10}, +- {0x4166c, 0x0}, +- {0x4166d, 0x0}, +- {0x4166e, 0x0}, +- {0x4166f, 0x0}, +- {0x41670, 0x0}, +- {0x41671, 0x0}, +- {0x41672, 0x0}, +- {0x41673, 0x0}, +- {0x41674, 0x8000}, +- {0x41675, 0x0}, +- {0x41676, 0x1}, +- {0x41677, 0x10}, +- {0x41678, 0x0}, +- {0x41679, 0x0}, +- {0x4167a, 0x0}, +- {0x4167b, 0x0}, +- {0x4167c, 0x802c}, +- {0x4167d, 0xd00}, +- {0x4167e, 0x1}, +- {0x4167f, 0x10}, +- {0x41680, 0x8020}, +- {0x41681, 0x803}, +- {0x41682, 0x0}, +- {0x41683, 0x10}, +- {0x41684, 0x0}, +- {0x41685, 0x0}, +- {0x41686, 0x0}, +- {0x41687, 0x0}, +- {0x41688, 0x0}, +- {0x41689, 0x0}, +- {0x4168a, 0x0}, +- {0x4168b, 0x2b00}, +- {0x4168c, 0x0}, +- {0x4168d, 0x0}, +- {0x4168e, 0x0}, +- {0x4168f, 0x800}, +- {0x41690, 0x0}, +- {0x41691, 0x0}, +- {0x41692, 0x0}, +- {0x41693, 0x0}, +- {0x41694, 0x807c}, +- {0x41695, 0x0}, +- {0x41696, 0x0}, +- {0x41697, 0x10}, +- {0x41698, 0x0}, +- {0x41699, 0x0}, +- {0x4169a, 0x0}, +- {0x4169b, 0x0}, +- {0x4169c, 0x0}, +- {0x4169d, 0x0}, +- {0x4169e, 0x0}, +- {0x4169f, 0x0}, +- {0x416a0, 0x0}, +- {0x416a1, 0x0}, +- {0x416a2, 0x1}, +- {0x416a3, 0x0}, +- {0x416a4, 0x0}, +- {0x416a5, 0x0}, +- {0x416a6, 0x0}, +- {0x416a7, 0x0}, +- {0x416a8, 0x402c}, +- {0x416a9, 0xd00}, +- {0x416aa, 0x1}, +- {0x416ab, 0x0}, +- {0x416ac, 0x4050}, +- {0x416ad, 0x803}, +- {0x416ae, 0x0}, +- {0x416af, 0x0}, +- {0x416b0, 0x0}, +- {0x416b1, 0x0}, +- {0x416b2, 0x0}, +- {0x416b3, 0x1b00}, +- {0x416b4, 0x0}, +- {0x416b5, 0x0}, +- {0x416b6, 0x0}, +- {0x416b7, 0x0}, +- {0x416b8, 0x0}, +- {0x416b9, 0x0}, +- {0x416ba, 0x0}, +- {0x416bb, 0x0}, +- {0x416bc, 0x0}, +- {0x416bd, 0x0}, +- {0x416be, 0x0}, +- {0x416bf, 0x0}, +- {0x416c0, 0x4050}, +- {0x416c1, 0x803}, +- {0x416c2, 0x0}, +- {0x416c3, 0x5a00}, +- {0x416c4, 0x0}, +- {0x416c5, 0x0}, +- {0x416c6, 0x0}, +- {0x416c7, 0x0}, +- {0x416c8, 0x0}, +- {0x416c9, 0x0}, +- {0x416ca, 0x0}, +- {0x416cb, 0x0}, +- {0x416cc, 0x0}, +- {0x416cd, 0x0}, +- {0x416ce, 0x0}, +- {0x416cf, 0x0}, +- {0x416d0, 0x0}, +- {0x416d1, 0x0}, +- {0x416d2, 0x0}, +- {0x416d3, 0x100}, +- {0x416d4, 0x0}, +- {0x416d5, 0x0}, +- {0x416d6, 0x0}, +- {0x416d7, 0x0}, +- {0x416d8, 0x4050}, +- {0x416d9, 0x803}, +- {0x416da, 0x0}, +- {0x416db, 0x0}, +- {0x416dc, 0x0}, +- {0x416dd, 0x0}, +- {0x416de, 0x0}, +- {0x416df, 0x0}, +- {0x416e0, 0x0}, +- {0x416e1, 0x0}, +- {0x416e2, 0x0}, +- {0x416e3, 0x6b00}, +- {0x416e4, 0x0}, +- {0x416e5, 0x0}, +- {0x416e6, 0x0}, +- {0x416e7, 0x400}, +- {0x416e8, 0x407c}, +- {0x416e9, 0x0}, +- {0x416ea, 0x0}, +- {0x416eb, 0x0}, +- {0x416ec, 0x0}, +- {0x416ed, 0x0}, +- {0x416ee, 0x0}, +- {0x416ef, 0x0}, +- {0x416f0, 0x0}, +- {0x416f1, 0x0}, +- {0x416f2, 0x0}, +- {0x416f3, 0x3b00}, +- {0x416f4, 0x0}, +- {0x416f5, 0x0}, +- {0x416f6, 0x0}, +- {0x416f7, 0x0}, +- {0x416f8, 0x0}, +- {0x416f9, 0x0}, +- {0x416fa, 0x0}, +- {0x416fb, 0x0}, +- {0x416fc, 0x0}, +- {0x416fd, 0x0}, +- {0x416fe, 0x1}, +- {0x416ff, 0x0}, +- {0x41700, 0x5758}, +- {0x41701, 0x0}, +- {0x41702, 0x0}, +- {0x41703, 0x0}, +- {0x41704, 0x4208}, +- {0x41705, 0x0}, +- {0x41706, 0x0}, +- {0x41707, 0x0}, +- {0x41708, 0x0}, +- {0x41709, 0x0}, +- {0x4170a, 0x0}, +- {0x4170b, 0x4b00}, +- {0x4170c, 0x0}, +- {0x4170d, 0x0}, +- {0x4170e, 0x0}, +- {0x4170f, 0x0}, +- {0x41710, 0x0}, +- {0x41711, 0x0}, +- {0x41712, 0x0}, +- {0x41713, 0x0}, +- {0x41714, 0x401c}, +- {0x41715, 0xd0}, +- {0x41716, 0x1}, +- {0x41717, 0x0}, +- {0x41718, 0x4060}, +- {0x41719, 0x84}, +- {0x4171a, 0x0}, +- {0x4171b, 0x0}, +- {0x4171c, 0x0}, +- {0x4171d, 0x0}, +- {0x4171e, 0x0}, +- {0x4171f, 0x0}, +- {0x41720, 0x0}, +- {0x41721, 0x0}, +- {0x41722, 0x0}, +- {0x41723, 0x7b00}, +- {0x41724, 0x0}, +- {0x41725, 0x0}, +- {0x41726, 0x0}, +- {0x41727, 0x0}, +- {0x41728, 0x407c}, +- {0x41729, 0x0}, +- {0x4172a, 0x0}, +- {0x4172b, 0x0}, +- {0x4172c, 0x0}, +- {0x4172d, 0x0}, +- {0x4172e, 0x0}, +- {0x4172f, 0x0}, +- {0x41730, 0x0}, +- {0x41731, 0x0}, +- {0x41732, 0x0}, +- {0x41733, 0x0}, +- {0x41734, 0x4000}, +- {0x41735, 0x0}, +- {0x41736, 0x1}, +- {0x41737, 0x0}, +- {0x41738, 0x0}, +- {0x41739, 0x0}, +- {0x4173a, 0x0}, +- {0x4173b, 0x0}, +- {0x4173c, 0x402c}, +- {0x4173d, 0xd00}, +- {0x4173e, 0x1}, +- {0x4173f, 0x0}, +- {0x41740, 0x4020}, +- {0x41741, 0x803}, +- {0x41742, 0x0}, +- {0x41743, 0x0}, +- {0x41744, 0x0}, +- {0x41745, 0x0}, +- {0x41746, 0x0}, +- {0x41747, 0x0}, +- {0x41748, 0x0}, +- {0x41749, 0x0}, +- {0x4174a, 0x0}, +- {0x4174b, 0x2b00}, +- {0x4174c, 0x0}, +- {0x4174d, 0x0}, +- {0x4174e, 0x0}, +- {0x4174f, 0x800}, +- {0x41750, 0x0}, +- {0x41751, 0x0}, +- {0x41752, 0x0}, +- {0x41753, 0x0}, +- {0x41754, 0x407c}, +- {0x41755, 0x0}, +- {0x41756, 0x0}, +- {0x41757, 0x0}, +- {0x41758, 0x0}, +- {0x41759, 0x0}, +- {0x4175a, 0x0}, +- {0x4175b, 0x0}, +- {0x4175c, 0x0}, +- {0x4175d, 0x0}, +- {0x4175e, 0x0}, +- {0x4175f, 0x0}, +- {0x41760, 0x4000}, +- {0x41761, 0x0}, +- {0x41762, 0x1}, +- {0x41763, 0x0}, +- {0x41764, 0x0}, +- {0x41765, 0x0}, +- {0x41766, 0x0}, +- {0x41767, 0x0}, +- {0x41768, 0x5758}, +- {0x41769, 0x0}, +- {0x4176a, 0x0}, +- {0x4176b, 0x0}, +- {0x4176c, 0x4008}, +- {0x4176d, 0x0}, +- {0x4176e, 0x0}, +- {0x4176f, 0x0}, +- {0x41770, 0x0}, +- {0x41771, 0x0}, +- {0x41772, 0x0}, +- {0x41773, 0x0}, +- {0x41774, 0x0}, +- {0x41775, 0x0}, +- {0x41776, 0x0}, +- {0x41777, 0x0}, +- {0x41778, 0x802c}, +- {0x41779, 0xd00}, +- {0x4177a, 0x1}, +- {0x4177b, 0x10}, +- {0x4177c, 0x8050}, +- {0x4177d, 0x803}, +- {0x4177e, 0x0}, +- {0x4177f, 0x10}, +- {0x41780, 0x0}, +- {0x41781, 0x0}, +- {0x41782, 0x0}, +- {0x41783, 0x1b00}, +- {0x41784, 0x0}, +- {0x41785, 0x0}, +- {0x41786, 0x0}, +- {0x41787, 0x0}, +- {0x41788, 0x0}, +- {0x41789, 0x0}, +- {0x4178a, 0x0}, +- {0x4178b, 0x0}, +- {0x4178c, 0x0}, +- {0x4178d, 0x0}, +- {0x4178e, 0x0}, +- {0x4178f, 0x0}, +- {0x41790, 0x8050}, +- {0x41791, 0x803}, +- {0x41792, 0x0}, +- {0x41793, 0x5a10}, +- {0x41794, 0x0}, +- {0x41795, 0x0}, +- {0x41796, 0x0}, +- {0x41797, 0x0}, +- {0x41798, 0x0}, +- {0x41799, 0x0}, +- {0x4179a, 0x0}, +- {0x4179b, 0x0}, +- {0x4179c, 0x0}, +- {0x4179d, 0x0}, +- {0x4179e, 0x0}, +- {0x4179f, 0x0}, +- {0x417a0, 0x0}, +- {0x417a1, 0x0}, +- {0x417a2, 0x0}, +- {0x417a3, 0x100}, +- {0x417a4, 0x0}, +- {0x417a5, 0x0}, +- {0x417a6, 0x0}, +- {0x417a7, 0x0}, +- {0x417a8, 0x8050}, +- {0x417a9, 0x803}, +- {0x417aa, 0x0}, +- {0x417ab, 0x10}, +- {0x417ac, 0x0}, +- {0x417ad, 0x0}, +- {0x417ae, 0x0}, +- {0x417af, 0x0}, +- {0x417b0, 0x0}, +- {0x417b1, 0x0}, +- {0x417b2, 0x0}, +- {0x417b3, 0x6b00}, +- {0x417b4, 0x0}, +- {0x417b5, 0x0}, +- {0x417b6, 0x0}, +- {0x417b7, 0x400}, +- {0x417b8, 0x807c}, +- {0x417b9, 0x0}, +- {0x417ba, 0x0}, +- {0x417bb, 0x10}, +- {0x417bc, 0x0}, +- {0x417bd, 0x0}, +- {0x417be, 0x0}, +- {0x417bf, 0x0}, +- {0x417c0, 0x0}, +- {0x417c1, 0x0}, +- {0x417c2, 0x0}, +- {0x417c3, 0x3b00}, +- {0x417c4, 0x0}, +- {0x417c5, 0x0}, +- {0x417c6, 0x0}, +- {0x417c7, 0x0}, +- {0x417c8, 0x0}, +- {0x417c9, 0x0}, +- {0x417ca, 0x0}, +- {0x417cb, 0x0}, +- {0x417cc, 0x0}, +- {0x417cd, 0x0}, +- {0x417ce, 0x1}, +- {0x417cf, 0x0}, +- {0x417d0, 0x9758}, +- {0x417d1, 0x0}, +- {0x417d2, 0x0}, +- {0x417d3, 0x10}, +- {0x417d4, 0x8208}, +- {0x417d5, 0x0}, +- {0x417d6, 0x0}, +- {0x417d7, 0x10}, +- {0x417d8, 0x0}, +- {0x417d9, 0x0}, +- {0x417da, 0x0}, +- {0x417db, 0x4b00}, +- {0x417dc, 0x0}, +- {0x417dd, 0x0}, +- {0x417de, 0x0}, +- {0x417df, 0x0}, +- {0x417e0, 0x0}, +- {0x417e1, 0x0}, +- {0x417e2, 0x0}, +- {0x417e3, 0x0}, +- {0x417e4, 0x801c}, +- {0x417e5, 0xd0}, +- {0x417e6, 0x1}, +- {0x417e7, 0x10}, +- {0x417e8, 0x8060}, +- {0x417e9, 0x84}, +- {0x417ea, 0x0}, +- {0x417eb, 0x10}, +- {0x417ec, 0x0}, +- {0x417ed, 0x0}, +- {0x417ee, 0x0}, +- {0x417ef, 0x0}, +- {0x417f0, 0x0}, +- {0x417f1, 0x0}, +- {0x417f2, 0x0}, +- {0x417f3, 0x7b00}, +- {0x417f4, 0x0}, +- {0x417f5, 0x0}, +- {0x417f6, 0x0}, +- {0x417f7, 0x0}, +- {0x417f8, 0x807c}, +- {0x417f9, 0x0}, +- {0x417fa, 0x0}, +- {0x417fb, 0x10}, +- {0x417fc, 0x0}, +- {0x417fd, 0x0}, +- {0x417fe, 0x0}, +- {0x417ff, 0x0}, +- {0x41800, 0x0}, +- {0x41801, 0x0}, +- {0x41802, 0x0}, +- {0x41803, 0x0}, +- {0x41804, 0x8000}, +- {0x41805, 0x0}, +- {0x41806, 0x1}, +- {0x41807, 0x10}, +- {0x41808, 0x0}, +- {0x41809, 0x0}, +- {0x4180a, 0x0}, +- {0x4180b, 0x0}, +- {0x4180c, 0x802c}, +- {0x4180d, 0xd00}, +- {0x4180e, 0x1}, +- {0x4180f, 0x10}, +- {0x41810, 0x8020}, +- {0x41811, 0x803}, +- {0x41812, 0x0}, +- {0x41813, 0x10}, +- {0x41814, 0x0}, +- {0x41815, 0x0}, +- {0x41816, 0x0}, +- {0x41817, 0x0}, +- {0x41818, 0x0}, +- {0x41819, 0x0}, +- {0x4181a, 0x0}, +- {0x4181b, 0x2b00}, +- {0x4181c, 0x0}, +- {0x4181d, 0x0}, +- {0x4181e, 0x0}, +- {0x4181f, 0x800}, +- {0x41820, 0x0}, +- {0x41821, 0x0}, +- {0x41822, 0x0}, +- {0x41823, 0x0}, +- {0x41824, 0x807c}, +- {0x41825, 0x0}, +- {0x41826, 0x0}, +- {0x41827, 0x10}, +- {0x41828, 0x0}, +- {0x41829, 0x0}, +- {0x4182a, 0x0}, +- {0x4182b, 0x0}, +- {0x4182c, 0x0}, +- {0x4182d, 0x0}, +- {0x4182e, 0x0}, +- {0x4182f, 0x0}, +- {0x41830, 0x8000}, +- {0x41831, 0x0}, +- {0x41832, 0x1}, +- {0x41833, 0x10}, +- {0x41834, 0x0}, +- {0x41835, 0x0}, +- {0x41836, 0x0}, +- {0x41837, 0x0}, +- {0x41838, 0x9758}, +- {0x41839, 0x0}, +- {0x4183a, 0x0}, +- {0x4183b, 0x10}, +- {0x4183c, 0x8008}, +- {0x4183d, 0x0}, +- {0x4183e, 0x0}, +- {0x4183f, 0x10}, +- {0x41840, 0x0}, +- {0x41841, 0x0}, +- {0x41842, 0x0}, +- {0x41843, 0x0}, +- {0x41844, 0x0}, +- {0x41845, 0x0}, +- {0x41846, 0x0}, +- {0x41847, 0x0}, +- {0x41848, 0xc068}, +- {0x41849, 0x0}, +- {0x4184a, 0x0}, +- {0x4184b, 0x10}, +- {0x4184c, 0x0}, +- {0x4184d, 0x0}, +- {0x4184e, 0x0}, +- {0x4184f, 0x0}, +- {0x41850, 0xd2d8}, +- {0x41851, 0x0}, +- {0x41852, 0x0}, +- {0x41853, 0x10}, +- {0x41854, 0xe008}, +- {0x41855, 0x0}, +- {0x41856, 0x0}, +- {0x41857, 0x10}, +- {0x41858, 0x0}, +- {0x41859, 0x0}, +- {0x4185a, 0x0}, +- {0x4185b, 0x5b00}, +- {0x4185c, 0x0}, +- {0x4185d, 0x0}, +- {0x4185e, 0x0}, +- {0x4185f, 0x0}, +- {0x41860, 0xc0f0}, +- {0x41861, 0x0}, +- {0x41862, 0x0}, +- {0x41863, 0x10}, +- {0x41864, 0x0}, +- {0x41865, 0x0}, +- {0x41866, 0x0}, +- {0x41867, 0x0}, +- {0x41868, 0xcfd8}, +- {0x41869, 0x0}, +- {0x4186a, 0x0}, +- {0x4186b, 0x10}, +- {0x4186c, 0xc008}, +- {0x4186d, 0x0}, +- {0x4186e, 0x0}, +- {0x4186f, 0x10}, +- {0x41870, 0x0}, +- {0x41871, 0x0}, +- {0x41872, 0x0}, +- {0x41873, 0x2b00}, +- {0x41874, 0x0}, +- {0x41875, 0x0}, +- {0x41876, 0x0}, +- {0x41877, 0x0}, +- {0x41878, 0xd058}, +- {0x41879, 0x0}, +- {0x4187a, 0x0}, +- {0x4187b, 0x10}, +- {0x4187c, 0xc008}, +- {0x4187d, 0x0}, +- {0x4187e, 0x0}, +- {0x4187f, 0x10}, +- {0x41880, 0x0}, +- {0x41881, 0x0}, +- {0x41882, 0x0}, +- {0x41883, 0x2b00}, +- {0x41884, 0x0}, +- {0x41885, 0x0}, +- {0x41886, 0x0}, +- {0x41887, 0x0}, +- {0x41888, 0xd0d8}, +- {0x41889, 0x0}, +- {0x4188a, 0x0}, +- {0x4188b, 0x10}, +- {0x4188c, 0xc088}, +- {0x4188d, 0x0}, +- {0x4188e, 0x0}, +- {0x4188f, 0x10}, +- {0x41890, 0x0}, +- {0x41891, 0x0}, +- {0x41892, 0x0}, +- {0x41893, 0x2b00}, +- {0x41894, 0x0}, +- {0x41895, 0x0}, +- {0x41896, 0x0}, +- {0x41897, 0x0}, +- {0x41898, 0xd158}, +- {0x41899, 0x0}, +- {0x4189a, 0x0}, +- {0x4189b, 0x10}, +- {0x4189c, 0xc008}, +- {0x4189d, 0x0}, +- {0x4189e, 0x0}, +- {0x4189f, 0x10}, +- {0x418a0, 0x0}, +- {0x418a1, 0x0}, +- {0x418a2, 0x0}, +- {0x418a3, 0x5b00}, +- {0x418a4, 0x0}, +- {0x418a5, 0x0}, +- {0x418a6, 0x0}, +- {0x418a7, 0x0}, +- {0x418a8, 0x402c}, +- {0x418a9, 0xd00}, +- {0x418aa, 0x1}, +- {0x418ab, 0x400}, +- {0x418ac, 0x4050}, +- {0x418ad, 0x800}, +- {0x418ae, 0x0}, +- {0x418af, 0x0}, +- {0x418b0, 0x0}, +- {0x418b1, 0x0}, +- {0x418b2, 0x0}, +- {0x418b3, 0x400}, +- {0x418b4, 0x4050}, +- {0x418b5, 0x803}, +- {0x418b6, 0x0}, +- {0x418b7, 0x0}, +- {0x418b8, 0x0}, +- {0x418b9, 0x0}, +- {0x418ba, 0x0}, +- {0x418bb, 0x6f00}, +- {0x418bc, 0x0}, +- {0x418bd, 0x0}, +- {0x418be, 0x0}, +- {0x418bf, 0x400}, +- {0x418c0, 0x407c}, +- {0x418c1, 0x0}, +- {0x418c2, 0x0}, +- {0x418c3, 0x400}, +- {0x418c4, 0x0}, +- {0x418c5, 0x0}, +- {0x418c6, 0x0}, +- {0x418c7, 0x0}, +- {0x418c8, 0x0}, +- {0x418c9, 0x0}, +- {0x418ca, 0x0}, +- {0x418cb, 0x400}, +- {0x418cc, 0x0}, +- {0x418cd, 0x0}, +- {0x418ce, 0x1}, +- {0x418cf, 0x0}, +- {0x418d0, 0x0}, +- {0x418d1, 0x0}, +- {0x418d2, 0x0}, +- {0x418d3, 0x400}, +- {0x418d4, 0x0}, +- {0x418d5, 0x0}, +- {0x418d6, 0x0}, +- {0x418d7, 0x0}, +- {0x418d8, 0x0}, +- {0x418d9, 0x0}, +- {0x418da, 0x0}, +- {0x418db, 0x0}, +- {0x418dc, 0x0}, +- {0x418dd, 0x0}, +- {0x418de, 0x0}, +- {0x418df, 0x0}, +- {0x418e0, 0x802c}, +- {0x418e1, 0xd00}, +- {0x418e2, 0x1}, +- {0x418e3, 0x410}, +- {0x418e4, 0x8050}, +- {0x418e5, 0x800}, +- {0x418e6, 0x0}, +- {0x418e7, 0x10}, +- {0x418e8, 0x0}, +- {0x418e9, 0x0}, +- {0x418ea, 0x0}, +- {0x418eb, 0x400}, +- {0x418ec, 0x8050}, +- {0x418ed, 0x803}, +- {0x418ee, 0x0}, +- {0x418ef, 0x10}, +- {0x418f0, 0x0}, +- {0x418f1, 0x0}, +- {0x418f2, 0x0}, +- {0x418f3, 0x6f00}, +- {0x418f4, 0x0}, +- {0x418f5, 0x0}, +- {0x418f6, 0x0}, +- {0x418f7, 0x400}, +- {0x418f8, 0x807c}, +- {0x418f9, 0x0}, +- {0x418fa, 0x0}, +- {0x418fb, 0x410}, +- {0x418fc, 0x0}, +- {0x418fd, 0x0}, +- {0x418fe, 0x0}, +- {0x418ff, 0x0}, +- {0x41900, 0x0}, +- {0x41901, 0x0}, +- {0x41902, 0x0}, +- {0x41903, 0x400}, +- {0x41904, 0x0}, +- {0x41905, 0x0}, +- {0x41906, 0x1}, +- {0x41907, 0x0}, +- {0x41908, 0x0}, +- {0x41909, 0x0}, +- {0x4190a, 0x0}, +- {0x4190b, 0x400}, +- {0x4190c, 0x0}, +- {0x4190d, 0x0}, +- {0x4190e, 0x0}, +- {0x4190f, 0x0}, +- {0x41910, 0x0}, +- {0x41911, 0x0}, +- {0x41912, 0x0}, +- {0x41913, 0x0}, +- {0x41914, 0x0}, +- {0x41915, 0x0}, +- {0x41916, 0x0}, +- {0x41917, 0x0}, +- {0x41918, 0x402c}, +- {0x41919, 0xd00}, +- {0x4191a, 0x1}, +- {0x4191b, 0x0}, +- {0x4191c, 0x4050}, +- {0x4191d, 0x800}, +- {0x4191e, 0x0}, +- {0x4191f, 0x0}, +- {0x41920, 0x0}, +- {0x41921, 0x0}, +- {0x41922, 0x0}, +- {0x41923, 0x0}, +- {0x41924, 0x4050}, +- {0x41925, 0x803}, +- {0x41926, 0x0}, +- {0x41927, 0x0}, +- {0x41928, 0x0}, +- {0x41929, 0x0}, +- {0x4192a, 0x0}, +- {0x4192b, 0x0}, +- {0x4192c, 0x4050}, +- {0x4192d, 0x800}, +- {0x4192e, 0x0}, +- {0x4192f, 0x0}, +- {0x41930, 0x0}, +- {0x41931, 0x0}, +- {0x41932, 0x0}, +- {0x41933, 0x4b00}, +- {0x41934, 0x0}, +- {0x41935, 0x0}, +- {0x41936, 0x0}, +- {0x41937, 0x400}, +- {0x41938, 0x0}, +- {0x41939, 0x0}, +- {0x4193a, 0x0}, +- {0x4193b, 0x0}, +- {0x4193c, 0x407c}, +- {0x4193d, 0x0}, +- {0x4193e, 0x0}, +- {0x4193f, 0x0}, +- {0x41940, 0x0}, +- {0x41941, 0x0}, +- {0x41942, 0x0}, +- {0x41943, 0x0}, +- {0x41944, 0x0}, +- {0x41945, 0x0}, +- {0x41946, 0x0}, +- {0x41947, 0x0}, +- {0x41948, 0x0}, +- {0x41949, 0x0}, +- {0x4194a, 0x1}, +- {0x4194b, 0x0}, +- {0x4194c, 0x0}, +- {0x4194d, 0x0}, +- {0x4194e, 0x0}, +- {0x4194f, 0x0}, +- {0x41950, 0x0}, +- {0x41951, 0x0}, +- {0x41952, 0x0}, +- {0x41953, 0x4b00}, +- {0x41954, 0x0}, +- {0x41955, 0x0}, +- {0x41956, 0x0}, +- {0x41957, 0x1800}, +- {0x41958, 0x0}, +- {0x41959, 0x0}, +- {0x4195a, 0x0}, +- {0x4195b, 0x0}, +- {0x4195c, 0x802c}, +- {0x4195d, 0xd00}, +- {0x4195e, 0x1}, +- {0x4195f, 0x10}, +- {0x41960, 0x8050}, +- {0x41961, 0x800}, +- {0x41962, 0x0}, +- {0x41963, 0x10}, +- {0x41964, 0x0}, +- {0x41965, 0x0}, +- {0x41966, 0x0}, +- {0x41967, 0x0}, +- {0x41968, 0x8050}, +- {0x41969, 0x803}, +- {0x4196a, 0x0}, +- {0x4196b, 0x10}, +- {0x4196c, 0x0}, +- {0x4196d, 0x0}, +- {0x4196e, 0x0}, +- {0x4196f, 0x0}, +- {0x41970, 0x8050}, +- {0x41971, 0x800}, +- {0x41972, 0x0}, +- {0x41973, 0x10}, +- {0x41974, 0x0}, +- {0x41975, 0x0}, +- {0x41976, 0x0}, +- {0x41977, 0x0}, +- {0x41978, 0x0}, +- {0x41979, 0x0}, +- {0x4197a, 0x0}, +- {0x4197b, 0x4b00}, +- {0x4197c, 0x0}, +- {0x4197d, 0x0}, +- {0x4197e, 0x0}, +- {0x4197f, 0x400}, +- {0x41980, 0x807c}, +- {0x41981, 0x0}, +- {0x41982, 0x0}, +- {0x41983, 0x10}, +- {0x41984, 0x0}, +- {0x41985, 0x0}, +- {0x41986, 0x0}, +- {0x41987, 0x0}, +- {0x41988, 0x0}, +- {0x41989, 0x0}, +- {0x4198a, 0x0}, +- {0x4198b, 0x0}, +- {0x4198c, 0x0}, +- {0x4198d, 0x0}, +- {0x4198e, 0x1}, +- {0x4198f, 0x0}, +- {0x41990, 0x0}, +- {0x41991, 0x0}, +- {0x41992, 0x0}, +- {0x41993, 0x5b00}, +- {0x41994, 0x0}, +- {0x41995, 0x0}, +- {0x41996, 0x0}, +- {0x41997, 0x2000}, +- {0x41998, 0x402c}, +- {0x41999, 0xd00}, +- {0x4199a, 0x1}, +- {0x4199b, 0x0}, +- {0x4199c, 0x5198}, +- {0x4199d, 0x803}, +- {0x4199e, 0x0}, +- {0x4199f, 0x0}, +- {0x419a0, 0x0}, +- {0x419a1, 0x0}, +- {0x419a2, 0x0}, +- {0x419a3, 0x1b00}, +- {0x419a4, 0x0}, +- {0x419a5, 0x0}, +- {0x419a6, 0x0}, +- {0x419a7, 0x0}, +- {0x419a8, 0x5218}, +- {0x419a9, 0x803}, +- {0x419aa, 0x0}, +- {0x419ab, 0x0}, +- {0x419ac, 0x0}, +- {0x419ad, 0x0}, +- {0x419ae, 0x0}, +- {0x419af, 0x0}, +- {0x419b0, 0x0}, +- {0x419b1, 0x0}, +- {0x419b2, 0x0}, +- {0x419b3, 0x4b00}, +- {0x419b4, 0x0}, +- {0x419b5, 0x0}, +- {0x419b6, 0x0}, +- {0x419b7, 0x400}, +- {0x419b8, 0x407c}, +- {0x419b9, 0x0}, +- {0x419ba, 0x0}, +- {0x419bb, 0x0}, +- {0x419bc, 0x0}, +- {0x419bd, 0x0}, +- {0x419be, 0x0}, +- {0x419bf, 0x0}, +- {0x419c0, 0x0}, +- {0x419c1, 0x0}, +- {0x419c2, 0x0}, +- {0x419c3, 0x0}, +- {0x419c4, 0x0}, +- {0x419c5, 0x0}, +- {0x419c6, 0x1}, +- {0x419c7, 0x0}, +- {0x419c8, 0x0}, +- {0x419c9, 0x0}, +- {0x419ca, 0x0}, +- {0x419cb, 0x1b00}, +- {0x419cc, 0x0}, +- {0x419cd, 0x0}, +- {0x419ce, 0x0}, +- {0x419cf, 0x0}, +- {0x419d0, 0x0}, +- {0x419d1, 0x0}, +- {0x419d2, 0x0}, +- {0x419d3, 0x0}, +- {0x419d4, 0x802c}, +- {0x419d5, 0xd00}, +- {0x419d6, 0x1}, +- {0x419d7, 0x10}, +- {0x419d8, 0x9198}, +- {0x419d9, 0x803}, +- {0x419da, 0x0}, +- {0x419db, 0x10}, +- {0x419dc, 0x0}, +- {0x419dd, 0x0}, +- {0x419de, 0x0}, +- {0x419df, 0x0}, +- {0x419e0, 0x0}, +- {0x419e1, 0x0}, +- {0x419e2, 0x0}, +- {0x419e3, 0x0}, +- {0x419e4, 0x0}, +- {0x419e5, 0x0}, +- {0x419e6, 0x0}, +- {0x419e7, 0x0}, +- {0x419e8, 0x0}, +- {0x419e9, 0x0}, +- {0x419ea, 0x0}, +- {0x419eb, 0x0}, +- {0x419ec, 0x9218}, +- {0x419ed, 0x803}, +- {0x419ee, 0x0}, +- {0x419ef, 0x10}, +- {0x419f0, 0x0}, +- {0x419f1, 0x0}, +- {0x419f2, 0x0}, +- {0x419f3, 0x4b00}, +- {0x419f4, 0x0}, +- {0x419f5, 0x0}, +- {0x419f6, 0x0}, +- {0x419f7, 0x400}, +- {0x419f8, 0x0}, +- {0x419f9, 0x0}, +- {0x419fa, 0x0}, +- {0x419fb, 0x0}, +- {0x419fc, 0x807c}, +- {0x419fd, 0x0}, +- {0x419fe, 0x0}, +- {0x419ff, 0x10}, +- {0x41a00, 0x0}, +- {0x41a01, 0x0}, +- {0x41a02, 0x0}, +- {0x41a03, 0x0}, +- {0x41a04, 0x0}, +- {0x41a05, 0x0}, +- {0x41a06, 0x0}, +- {0x41a07, 0x0}, +- {0x41a08, 0x0}, +- {0x41a09, 0x0}, +- {0x41a0a, 0x1}, +- {0x41a0b, 0x0}, +- {0x41a0c, 0x0}, +- {0x41a0d, 0x0}, +- {0x41a0e, 0x0}, +- {0x41a0f, 0x0}, +- {0x41a10, 0x0}, +- {0x41a11, 0x0}, +- {0x41a12, 0x0}, +- {0x41a13, 0xb00}, +- {0x41a14, 0x0}, +- {0x41a15, 0x0}, +- {0x41a16, 0x0}, +- {0x41a17, 0x400}, +- {0x41a18, 0x0}, +- {0x41a19, 0x0}, +- {0x41a1a, 0x0}, +- {0x41a1b, 0x0}, +- {0x41a1c, 0x0}, +- {0x41a1d, 0x0}, +- {0x41a1e, 0x0}, +- {0x41a1f, 0x0}, +- {0x41a20, 0x401c}, +- {0x41a21, 0xd0}, +- {0x41a22, 0x1}, +- {0x41a23, 0x0}, +- {0x41a24, 0x4060}, +- {0x41a25, 0x84}, +- {0x41a26, 0x0}, +- {0x41a27, 0x0}, +- {0x41a28, 0x0}, +- {0x41a29, 0x0}, +- {0x41a2a, 0x0}, +- {0x41a2b, 0xb00}, +- {0x41a2c, 0x0}, +- {0x41a2d, 0x0}, +- {0x41a2e, 0x0}, +- {0x41a2f, 0x800}, +- {0x41a30, 0x407c}, +- {0x41a31, 0x0}, +- {0x41a32, 0x0}, +- {0x41a33, 0x0}, +- {0x41a34, 0x0}, +- {0x41a35, 0x0}, +- {0x41a36, 0x0}, +- {0x41a37, 0x0}, +- {0x41a38, 0x0}, +- {0x41a39, 0x0}, +- {0x41a3a, 0x0}, +- {0x41a3b, 0x0}, +- {0x41a3c, 0x4000}, +- {0x41a3d, 0x0}, +- {0x41a3e, 0x1}, +- {0x41a3f, 0x0}, +- {0x41a40, 0x0}, +- {0x41a41, 0x0}, +- {0x41a42, 0x0}, +- {0x41a43, 0x0}, +- {0x41a44, 0x402c}, +- {0x41a45, 0xd00}, +- {0x41a46, 0x1}, +- {0x41a47, 0x0}, +- {0x41a48, 0x4020}, +- {0x41a49, 0x803}, +- {0x41a4a, 0x0}, +- {0x41a4b, 0x0}, +- {0x41a4c, 0x0}, +- {0x41a4d, 0x0}, +- {0x41a4e, 0x0}, +- {0x41a4f, 0x0}, +- {0x41a50, 0x0}, +- {0x41a51, 0x0}, +- {0x41a52, 0x0}, +- {0x41a53, 0x2b00}, +- {0x41a54, 0x0}, +- {0x41a55, 0x0}, +- {0x41a56, 0x0}, +- {0x41a57, 0x800}, +- {0x41a58, 0x0}, +- {0x41a59, 0x0}, +- {0x41a5a, 0x0}, +- {0x41a5b, 0x0}, +- {0x41a5c, 0x407c}, +- {0x41a5d, 0x0}, +- {0x41a5e, 0x0}, +- {0x41a5f, 0x0}, +- {0x41a60, 0x0}, +- {0x41a61, 0x0}, +- {0x41a62, 0x0}, +- {0x41a63, 0x0}, +- {0x41a64, 0x0}, +- {0x41a65, 0x0}, +- {0x41a66, 0x0}, +- {0x41a67, 0x0}, +- {0x41a68, 0x0}, +- {0x41a69, 0x0}, +- {0x41a6a, 0x1}, +- {0x41a6b, 0x0}, +- {0x41a6c, 0x0}, +- {0x41a6d, 0x0}, +- {0x41a6e, 0x0}, +- {0x41a6f, 0x0}, +- {0x41a70, 0x801c}, +- {0x41a71, 0xd0}, +- {0x41a72, 0x1}, +- {0x41a73, 0x10}, +- {0x41a74, 0x8060}, +- {0x41a75, 0x84}, +- {0x41a76, 0x0}, +- {0x41a77, 0x10}, +- {0x41a78, 0x0}, +- {0x41a79, 0x0}, +- {0x41a7a, 0x0}, +- {0x41a7b, 0xb00}, +- {0x41a7c, 0x0}, +- {0x41a7d, 0x0}, +- {0x41a7e, 0x0}, +- {0x41a7f, 0x800}, +- {0x41a80, 0x807c}, +- {0x41a81, 0x0}, +- {0x41a82, 0x0}, +- {0x41a83, 0x10}, +- {0x41a84, 0x0}, +- {0x41a85, 0x0}, +- {0x41a86, 0x0}, +- {0x41a87, 0x0}, +- {0x41a88, 0x0}, +- {0x41a89, 0x0}, +- {0x41a8a, 0x0}, +- {0x41a8b, 0x0}, +- {0x41a8c, 0x8000}, +- {0x41a8d, 0x0}, +- {0x41a8e, 0x1}, +- {0x41a8f, 0x10}, +- {0x41a90, 0x0}, +- {0x41a91, 0x0}, +- {0x41a92, 0x0}, +- {0x41a93, 0x0}, +- {0x41a94, 0x802c}, +- {0x41a95, 0xd00}, +- {0x41a96, 0x1}, +- {0x41a97, 0x10}, +- {0x41a98, 0x8020}, +- {0x41a99, 0x803}, +- {0x41a9a, 0x0}, +- {0x41a9b, 0x10}, +- {0x41a9c, 0x0}, +- {0x41a9d, 0x0}, +- {0x41a9e, 0x0}, +- {0x41a9f, 0x0}, +- {0x41aa0, 0x0}, +- {0x41aa1, 0x0}, +- {0x41aa2, 0x0}, +- {0x41aa3, 0x2b00}, +- {0x41aa4, 0x0}, +- {0x41aa5, 0x0}, +- {0x41aa6, 0x0}, +- {0x41aa7, 0x800}, +- {0x41aa8, 0x0}, +- {0x41aa9, 0x0}, +- {0x41aaa, 0x0}, +- {0x41aab, 0x0}, +- {0x41aac, 0x807c}, +- {0x41aad, 0x0}, +- {0x41aae, 0x0}, +- {0x41aaf, 0x10}, +- {0x41ab0, 0x0}, +- {0x41ab1, 0x0}, +- {0x41ab2, 0x0}, +- {0x41ab3, 0x0}, +- {0x41ab4, 0x0}, +- {0x41ab5, 0x0}, +- {0x41ab6, 0x0}, +- {0x41ab7, 0x0}, +- {0x41ab8, 0x0}, +- {0x41ab9, 0x0}, +- {0x41aba, 0x1}, +- {0x41abb, 0x0}, +- {0x41abc, 0x0}, +- {0x41abd, 0x0}, +- {0x41abe, 0x0}, +- {0x41abf, 0x0}, +- {0x41ac0, 0x402c}, +- {0x41ac1, 0xd00}, +- {0x41ac2, 0x1}, +- {0x41ac3, 0x0}, +- {0x41ac4, 0x4050}, +- {0x41ac5, 0x803}, +- {0x41ac6, 0x0}, +- {0x41ac7, 0x0}, +- {0x41ac8, 0x0}, +- {0x41ac9, 0x0}, +- {0x41aca, 0x0}, +- {0x41acb, 0x0}, +- {0x41acc, 0x0}, +- {0x41acd, 0x0}, +- {0x41ace, 0x0}, +- {0x41acf, 0x0}, +- {0x41ad0, 0x0}, +- {0x41ad1, 0x0}, +- {0x41ad2, 0x0}, +- {0x41ad3, 0x0}, +- {0x41ad4, 0x0}, +- {0x41ad5, 0x0}, +- {0x41ad6, 0x0}, +- {0x41ad7, 0x0}, +- {0x41ad8, 0x4050}, +- {0x41ad9, 0x803}, +- {0x41ada, 0x0}, +- {0x41adb, 0x5a00}, +- {0x41adc, 0x0}, +- {0x41add, 0x0}, +- {0x41ade, 0x0}, +- {0x41adf, 0x0}, +- {0x41ae0, 0x0}, +- {0x41ae1, 0x0}, +- {0x41ae2, 0x0}, +- {0x41ae3, 0x100}, +- {0x41ae4, 0x0}, +- {0x41ae5, 0x0}, +- {0x41ae6, 0x0}, +- {0x41ae7, 0x0}, +- {0x41ae8, 0x4050}, +- {0x41ae9, 0x803}, +- {0x41aea, 0x0}, +- {0x41aeb, 0x0}, +- {0x41aec, 0x0}, +- {0x41aed, 0x0}, +- {0x41aee, 0x0}, +- {0x41aef, 0x0}, +- {0x41af0, 0x0}, +- {0x41af1, 0x0}, +- {0x41af2, 0x0}, +- {0x41af3, 0x4b00}, +- {0x41af4, 0x0}, +- {0x41af5, 0x0}, +- {0x41af6, 0x0}, +- {0x41af7, 0x400}, +- {0x41af8, 0x407c}, +- {0x41af9, 0x0}, +- {0x41afa, 0x0}, +- {0x41afb, 0x0}, +- {0x41afc, 0x0}, +- {0x41afd, 0x0}, +- {0x41afe, 0x0}, +- {0x41aff, 0x0}, +- {0x41b00, 0x0}, +- {0x41b01, 0x0}, +- {0x41b02, 0x0}, +- {0x41b03, 0x3b00}, +- {0x41b04, 0x0}, +- {0x41b05, 0x0}, +- {0x41b06, 0x0}, +- {0x41b07, 0x0}, +- {0x41b08, 0x0}, +- {0x41b09, 0x0}, +- {0x41b0a, 0x0}, +- {0x41b0b, 0x0}, +- {0x41b0c, 0x0}, +- {0x41b0d, 0x0}, +- {0x41b0e, 0x1}, +- {0x41b0f, 0x0}, +- {0x41b10, 0x5758}, +- {0x41b11, 0x0}, +- {0x41b12, 0x0}, +- {0x41b13, 0x0}, +- {0x41b14, 0x4208}, +- {0x41b15, 0x0}, +- {0x41b16, 0x0}, +- {0x41b17, 0x0}, +- {0x41b18, 0x0}, +- {0x41b19, 0x0}, +- {0x41b1a, 0x0}, +- {0x41b1b, 0x4b00}, +- {0x41b1c, 0x0}, +- {0x41b1d, 0x0}, +- {0x41b1e, 0x0}, +- {0x41b1f, 0x0}, +- {0x41b20, 0x0}, +- {0x41b21, 0x0}, +- {0x41b22, 0x0}, +- {0x41b23, 0x0}, +- {0x41b24, 0x401c}, +- {0x41b25, 0xd0}, +- {0x41b26, 0x1}, +- {0x41b27, 0x0}, +- {0x41b28, 0x4060}, +- {0x41b29, 0x84}, +- {0x41b2a, 0x0}, +- {0x41b2b, 0x0}, +- {0x41b2c, 0x0}, +- {0x41b2d, 0x0}, +- {0x41b2e, 0x0}, +- {0x41b2f, 0x0}, +- {0x41b30, 0x0}, +- {0x41b31, 0x0}, +- {0x41b32, 0x0}, +- {0x41b33, 0x7b00}, +- {0x41b34, 0x0}, +- {0x41b35, 0x0}, +- {0x41b36, 0x0}, +- {0x41b37, 0x0}, +- {0x41b38, 0x407c}, +- {0x41b39, 0x0}, +- {0x41b3a, 0x0}, +- {0x41b3b, 0x0}, +- {0x41b3c, 0x0}, +- {0x41b3d, 0x0}, +- {0x41b3e, 0x0}, +- {0x41b3f, 0x0}, +- {0x41b40, 0x0}, +- {0x41b41, 0x0}, +- {0x41b42, 0x0}, +- {0x41b43, 0x0}, +- {0x41b44, 0x4000}, +- {0x41b45, 0x0}, +- {0x41b46, 0x1}, +- {0x41b47, 0x0}, +- {0x41b48, 0x0}, +- {0x41b49, 0x0}, +- {0x41b4a, 0x0}, +- {0x41b4b, 0x0}, +- {0x41b4c, 0x402c}, +- {0x41b4d, 0xd00}, +- {0x41b4e, 0x1}, +- {0x41b4f, 0x0}, +- {0x41b50, 0x4020}, +- {0x41b51, 0x803}, +- {0x41b52, 0x0}, +- {0x41b53, 0x0}, +- {0x41b54, 0x0}, +- {0x41b55, 0x0}, +- {0x41b56, 0x0}, +- {0x41b57, 0x0}, +- {0x41b58, 0x0}, +- {0x41b59, 0x0}, +- {0x41b5a, 0x0}, +- {0x41b5b, 0x2b00}, +- {0x41b5c, 0x0}, +- {0x41b5d, 0x0}, +- {0x41b5e, 0x0}, +- {0x41b5f, 0x800}, +- {0x41b60, 0x0}, +- {0x41b61, 0x0}, +- {0x41b62, 0x0}, +- {0x41b63, 0x0}, +- {0x41b64, 0x407c}, +- {0x41b65, 0x0}, +- {0x41b66, 0x0}, +- {0x41b67, 0x0}, +- {0x41b68, 0x0}, +- {0x41b69, 0x0}, +- {0x41b6a, 0x0}, +- {0x41b6b, 0x0}, +- {0x41b6c, 0x0}, +- {0x41b6d, 0x0}, +- {0x41b6e, 0x0}, +- {0x41b6f, 0x0}, +- {0x41b70, 0x4000}, +- {0x41b71, 0x0}, +- {0x41b72, 0x1}, +- {0x41b73, 0x0}, +- {0x41b74, 0x0}, +- {0x41b75, 0x0}, +- {0x41b76, 0x0}, +- {0x41b77, 0x0}, +- {0x41b78, 0x5758}, +- {0x41b79, 0x0}, +- {0x41b7a, 0x0}, +- {0x41b7b, 0x0}, +- {0x41b7c, 0x4008}, +- {0x41b7d, 0x0}, +- {0x41b7e, 0x0}, +- {0x41b7f, 0x0}, +- {0x41b80, 0x0}, +- {0x41b81, 0x0}, +- {0x41b82, 0x0}, +- {0x41b83, 0x0}, +- {0x41b84, 0x0}, +- {0x41b85, 0x0}, +- {0x41b86, 0x0}, +- {0x41b87, 0x0}, +- {0x41b88, 0x802c}, +- {0x41b89, 0xd00}, +- {0x41b8a, 0x1}, +- {0x41b8b, 0x10}, +- {0x41b8c, 0x8050}, +- {0x41b8d, 0x803}, +- {0x41b8e, 0x0}, +- {0x41b8f, 0x10}, +- {0x41b90, 0x0}, +- {0x41b91, 0x0}, +- {0x41b92, 0x0}, +- {0x41b93, 0x0}, +- {0x41b94, 0x0}, +- {0x41b95, 0x0}, +- {0x41b96, 0x0}, +- {0x41b97, 0x0}, +- {0x41b98, 0x0}, +- {0x41b99, 0x0}, +- {0x41b9a, 0x0}, +- {0x41b9b, 0x0}, +- {0x41b9c, 0x0}, +- {0x41b9d, 0x0}, +- {0x41b9e, 0x0}, +- {0x41b9f, 0x0}, +- {0x41ba0, 0x8050}, +- {0x41ba1, 0x803}, +- {0x41ba2, 0x0}, +- {0x41ba3, 0x5a10}, +- {0x41ba4, 0x0}, +- {0x41ba5, 0x0}, +- {0x41ba6, 0x0}, +- {0x41ba7, 0x0}, +- {0x41ba8, 0x0}, +- {0x41ba9, 0x0}, +- {0x41baa, 0x0}, +- {0x41bab, 0x100}, +- {0x41bac, 0x0}, +- {0x41bad, 0x0}, +- {0x41bae, 0x0}, +- {0x41baf, 0x0}, +- {0x41bb0, 0x8050}, +- {0x41bb1, 0x803}, +- {0x41bb2, 0x0}, +- {0x41bb3, 0x10}, +- {0x41bb4, 0x0}, +- {0x41bb5, 0x0}, +- {0x41bb6, 0x0}, +- {0x41bb7, 0x0}, +- {0x41bb8, 0x0}, +- {0x41bb9, 0x0}, +- {0x41bba, 0x0}, +- {0x41bbb, 0x4b00}, +- {0x41bbc, 0x0}, +- {0x41bbd, 0x0}, +- {0x41bbe, 0x0}, +- {0x41bbf, 0x400}, +- {0x41bc0, 0x807c}, +- {0x41bc1, 0x0}, +- {0x41bc2, 0x0}, +- {0x41bc3, 0x10}, +- {0x41bc4, 0x0}, +- {0x41bc5, 0x0}, +- {0x41bc6, 0x0}, +- {0x41bc7, 0x0}, +- {0x41bc8, 0x0}, +- {0x41bc9, 0x0}, +- {0x41bca, 0x0}, +- {0x41bcb, 0x3b00}, +- {0x41bcc, 0x0}, +- {0x41bcd, 0x0}, +- {0x41bce, 0x0}, +- {0x41bcf, 0x0}, +- {0x41bd0, 0x0}, +- {0x41bd1, 0x0}, +- {0x41bd2, 0x0}, +- {0x41bd3, 0x0}, +- {0x41bd4, 0x0}, +- {0x41bd5, 0x0}, +- {0x41bd6, 0x1}, +- {0x41bd7, 0x0}, +- {0x41bd8, 0x9758}, +- {0x41bd9, 0x0}, +- {0x41bda, 0x0}, +- {0x41bdb, 0x10}, +- {0x41bdc, 0x8208}, +- {0x41bdd, 0x0}, +- {0x41bde, 0x0}, +- {0x41bdf, 0x10}, +- {0x41be0, 0x0}, +- {0x41be1, 0x0}, +- {0x41be2, 0x0}, +- {0x41be3, 0x4b00}, +- {0x41be4, 0x0}, +- {0x41be5, 0x0}, +- {0x41be6, 0x0}, +- {0x41be7, 0x0}, +- {0x41be8, 0x0}, +- {0x41be9, 0x0}, +- {0x41bea, 0x0}, +- {0x41beb, 0x0}, +- {0x41bec, 0x801c}, +- {0x41bed, 0xd0}, +- {0x41bee, 0x1}, +- {0x41bef, 0x10}, +- {0x41bf0, 0x8060}, +- {0x41bf1, 0x84}, +- {0x41bf2, 0x0}, +- {0x41bf3, 0x10}, +- {0x41bf4, 0x0}, +- {0x41bf5, 0x0}, +- {0x41bf6, 0x0}, +- {0x41bf7, 0x0}, +- {0x41bf8, 0x0}, +- {0x41bf9, 0x0}, +- {0x41bfa, 0x0}, +- {0x41bfb, 0x7b00}, +- {0x41bfc, 0x0}, +- {0x41bfd, 0x0}, +- {0x41bfe, 0x0}, +- {0x41bff, 0x0}, +- {0x41c00, 0x807c}, +- {0x41c01, 0x0}, +- {0x41c02, 0x0}, +- {0x41c03, 0x10}, +- {0x41c04, 0x0}, +- {0x41c05, 0x0}, +- {0x41c06, 0x0}, +- {0x41c07, 0x0}, +- {0x41c08, 0x0}, +- {0x41c09, 0x0}, +- {0x41c0a, 0x0}, +- {0x41c0b, 0x0}, +- {0x41c0c, 0x8000}, +- {0x41c0d, 0x0}, +- {0x41c0e, 0x1}, +- {0x41c0f, 0x10}, +- {0x41c10, 0x0}, +- {0x41c11, 0x0}, +- {0x41c12, 0x0}, +- {0x41c13, 0x0}, +- {0x41c14, 0x802c}, +- {0x41c15, 0xd00}, +- {0x41c16, 0x1}, +- {0x41c17, 0x10}, +- {0x41c18, 0x8020}, +- {0x41c19, 0x803}, +- {0x41c1a, 0x0}, +- {0x41c1b, 0x10}, +- {0x41c1c, 0x0}, +- {0x41c1d, 0x0}, +- {0x41c1e, 0x0}, +- {0x41c1f, 0x0}, +- {0x41c20, 0x0}, +- {0x41c21, 0x0}, +- {0x41c22, 0x0}, +- {0x41c23, 0x2b00}, +- {0x41c24, 0x0}, +- {0x41c25, 0x0}, +- {0x41c26, 0x0}, +- {0x41c27, 0x800}, +- {0x41c28, 0x0}, +- {0x41c29, 0x0}, +- {0x41c2a, 0x0}, +- {0x41c2b, 0x0}, +- {0x41c2c, 0x807c}, +- {0x41c2d, 0x0}, +- {0x41c2e, 0x0}, +- {0x41c2f, 0x10}, +- {0x41c30, 0x0}, +- {0x41c31, 0x0}, +- {0x41c32, 0x0}, +- {0x41c33, 0x0}, +- {0x41c34, 0x0}, +- {0x41c35, 0x0}, +- {0x41c36, 0x0}, +- {0x41c37, 0x0}, +- {0x41c38, 0x8000}, +- {0x41c39, 0x0}, +- {0x41c3a, 0x1}, +- {0x41c3b, 0x10}, +- {0x41c3c, 0x0}, +- {0x41c3d, 0x0}, +- {0x41c3e, 0x0}, +- {0x41c3f, 0x0}, +- {0x41c40, 0x9758}, +- {0x41c41, 0x0}, +- {0x41c42, 0x0}, +- {0x41c43, 0x10}, +- {0x41c44, 0x8008}, +- {0x41c45, 0x0}, +- {0x41c46, 0x0}, +- {0x41c47, 0x10}, +- {0x41c48, 0x0}, +- {0x41c49, 0x0}, +- {0x41c4a, 0x0}, +- {0x41c4b, 0x0}, +- {0x41c4c, 0x0}, +- {0x41c4d, 0x0}, +- {0x41c4e, 0x0}, +- {0x41c4f, 0x0}, +- {0x41c50, 0xc068}, +- {0x41c51, 0x0}, +- {0x41c52, 0x0}, +- {0x41c53, 0x10}, +- {0x41c54, 0x0}, +- {0x41c55, 0x0}, +- {0x41c56, 0x0}, +- {0x41c57, 0x0}, +- {0x9002e, 0x10}, +- {0x9002f, 0x400}, +- {0x90030, 0x80e}, +- {0x90031, 0xb}, +- {0x90032, 0x480}, +- {0x90033, 0x809}, +- {0x90034, 0x9}, +- {0x90035, 0x308}, +- {0x90036, 0xc09}, +- {0x90037, 0x28}, +- {0x90038, 0x8160}, +- {0x90039, 0x87c}, +- {0x9003a, 0x98}, +- {0x9003b, 0x820}, +- {0x9003c, 0xc7e}, +- {0x9003d, 0x2}, +- {0x9003e, 0x1}, +- {0x9003f, 0x78}, +- {0x90040, 0xa}, +- {0x90041, 0x370}, +- {0x90042, 0x839}, +- {0x90043, 0x18}, +- {0x90044, 0x8160}, +- {0x90045, 0x83c}, +- {0x90046, 0x9}, +- {0x90047, 0x150}, +- {0x90048, 0x839}, +- {0x90049, 0x70}, +- {0x9004a, 0x392}, +- {0x9004b, 0x39}, +- {0x9004c, 0x78}, +- {0x9004d, 0x39a}, +- {0x9004e, 0x39}, +- {0x9004f, 0xe09}, +- {0x90050, 0x100}, +- {0x90051, 0x839}, +- {0x90052, 0x2}, +- {0x90053, 0x1}, +- {0x90054, 0x38}, +- {0x90055, 0x0}, +- {0x90056, 0x100}, +- {0x90057, 0x839}, +- {0x90058, 0x0}, +- {0x90059, 0x398}, +- {0x9005a, 0x839}, +- {0x9005b, 0xe19}, +- {0x9005c, 0x100}, +- {0x9005d, 0x839}, +- {0x9005e, 0x2}, +- {0x9005f, 0x1}, +- {0x90060, 0x38}, +- {0x90061, 0x0}, +- {0x90062, 0x100}, +- {0x90063, 0x839}, +- {0x90064, 0x0}, +- {0x90065, 0x390}, +- {0x90066, 0x839}, +- {0x90067, 0x78}, +- {0x90068, 0x39a}, +- {0x90069, 0x39}, +- {0x9006a, 0xe29}, +- {0x9006b, 0x100}, +- {0x9006c, 0x839}, +- {0x9006d, 0x2}, +- {0x9006e, 0x1}, +- {0x9006f, 0x38}, +- {0x90070, 0x0}, +- {0x90071, 0x100}, +- {0x90072, 0x839}, +- {0x90073, 0x70}, +- {0x90074, 0x392}, +- {0x90075, 0x39}, +- {0x90076, 0x0}, +- {0x90077, 0xf0}, +- {0x90078, 0x909}, +- {0x90079, 0x18}, +- {0x9007a, 0x8160}, +- {0x9007b, 0x8bc}, +- {0x9007c, 0x8}, +- {0x9007d, 0x13a}, +- {0x9007e, 0xb9}, +- {0x9007f, 0x24b}, +- {0x90080, 0x100}, +- {0x90081, 0x8b9}, +- {0x90082, 0x2}, +- {0x90083, 0x1}, +- {0x90084, 0xb8}, +- {0x90085, 0x0}, +- {0x90086, 0x100}, +- {0x90087, 0x8b9}, +- {0x90088, 0x20}, +- {0x90089, 0x4}, +- {0x9008a, 0xb8}, +- {0x9008b, 0x20}, +- {0x9008c, 0x4}, +- {0x9008d, 0xb8}, +- {0x9008e, 0x5}, +- {0x9008f, 0x0}, +- {0x90090, 0xb8}, +- {0x90091, 0x479}, +- {0x90092, 0xc7f8}, +- {0x90093, 0x8bc}, +- {0x90094, 0x0}, +- {0x90095, 0x0}, +- {0x90096, 0xb8}, +- {0x90097, 0x0}, +- {0x90098, 0xa8}, +- {0x90099, 0x8b9}, +- {0x9009a, 0x9}, +- {0x9009b, 0xc9c0}, +- {0x9009c, 0xcbc}, +- {0x9009d, 0x0}, +- {0x9009e, 0x0}, +- {0x9009f, 0xb8}, +- {0x900a0, 0x25b}, +- {0x900a1, 0x100}, +- {0x900a2, 0xcb9}, +- {0x900a3, 0x20}, +- {0x900a4, 0x4}, +- {0x900a5, 0xb8}, +- {0x900a6, 0x20}, +- {0x900a7, 0x4}, +- {0x900a8, 0xb8}, +- {0x900a9, 0x20}, +- {0x900aa, 0x4}, +- {0x900ab, 0xb8}, +- {0x900ac, 0x20}, +- {0x900ad, 0x4}, +- {0x900ae, 0xb8}, +- {0x900af, 0x10}, +- {0x900b0, 0x400}, +- {0x900b1, 0x89e}, +- {0x900b2, 0x8}, +- {0x900b3, 0x370}, +- {0x900b4, 0x839}, +- {0x900b5, 0x0}, +- {0x900b6, 0xf0}, +- {0x900b7, 0x909}, +- {0x900b8, 0x33b}, +- {0x900b9, 0x100}, +- {0x900ba, 0x8b9}, +- {0x900bb, 0x0}, +- {0x900bc, 0x100}, +- {0x900bd, 0x8b9}, +- {0x900be, 0x23b}, +- {0x900bf, 0x100}, +- {0x900c0, 0xc99}, +- {0x900c1, 0x2}, +- {0x900c2, 0x150}, +- {0x900c3, 0x839}, +- {0x900c4, 0x1800}, +- {0x900c5, 0x8660}, +- {0x900c6, 0x839}, +- {0x900c7, 0x0}, +- {0x900c8, 0x2a0}, +- {0x900c9, 0x809}, +- {0x900ca, 0x8}, +- {0x900cb, 0x1880}, +- {0x900cc, 0x839}, +- {0x900cd, 0x0}, +- {0x900ce, 0x82b0}, +- {0x900cf, 0x838}, +- {0x900d0, 0x18}, +- {0x900d1, 0xe0}, +- {0x900d2, 0x809}, +- {0x900d3, 0x0}, +- {0x900d4, 0xe0}, +- {0x900d5, 0x869}, +- {0x900d6, 0xf}, +- {0x900d7, 0x7c0}, +- {0x900d8, 0x839}, +- {0x900d9, 0xa}, +- {0x900da, 0x510}, +- {0x900db, 0x839}, +- {0x900dc, 0xa}, +- {0x900dd, 0x700}, +- {0x900de, 0x849}, +- {0x900df, 0xa}, +- {0x900e0, 0x700}, +- {0x900e1, 0x859}, +- {0x900e2, 0xa}, +- {0x900e3, 0x708}, +- {0x900e4, 0x859}, +- {0x900e5, 0x2}, +- {0x900e6, 0x708}, +- {0x900e7, 0x849}, +- {0x900e8, 0xff8}, +- {0x900e9, 0x8410}, +- {0x900ea, 0x839}, +- {0x900eb, 0x7ff8}, +- {0x900ec, 0x8498}, +- {0x900ed, 0x838}, +- {0x900ee, 0x10}, +- {0x900ef, 0x8160}, +- {0x900f0, 0x83c}, +- {0x900f1, 0x0}, +- {0x900f2, 0x7c8}, +- {0x900f3, 0x809}, +- {0x900f4, 0x0}, +- {0x900f5, 0x1}, +- {0x900f6, 0x8}, +- {0x900f7, 0x0}, +- {0x900f8, 0x45a}, +- {0x900f9, 0x89}, +- {0x900fa, 0x0}, +- {0x900fb, 0x8018}, +- {0x900fc, 0x808}, +- {0x900fd, 0x0}, +- {0x900fe, 0x8020}, +- {0x900ff, 0x808}, +- {0x90100, 0x479}, +- {0x90101, 0xc7f8}, +- {0x90102, 0x80c}, +- {0x90103, 0x0}, +- {0x90104, 0x0}, +- {0x90105, 0x8}, +- {0x90106, 0x0}, +- {0x90107, 0x8018}, +- {0x90108, 0x808}, +- {0x90109, 0x0}, +- {0x9010a, 0x8020}, +- {0x9010b, 0x808}, +- {0x9010c, 0x9}, +- {0x9010d, 0xc9c0}, +- {0x9010e, 0xc0c}, +- {0x9010f, 0x0}, +- {0x90110, 0xa8}, +- {0x90111, 0x8c9}, +- {0x90112, 0x29}, +- {0x90113, 0x8160}, +- {0x90114, 0x87c}, +- {0x90115, 0xb8}, +- {0x90116, 0x820}, +- {0x90117, 0xc7e}, +- {0x90118, 0x1}, +- {0x90119, 0x0}, +- {0x9011a, 0x78}, +- {0x9011b, 0x0}, +- {0x9011c, 0x1}, +- {0x9011d, 0x78}, +- {0x9011e, 0xd8}, +- {0x9011f, 0x820}, +- {0x90120, 0xc7e}, +- {0x90121, 0x1}, +- {0x90122, 0x0}, +- {0x90123, 0x78}, +- {0x90124, 0x0}, +- {0x90125, 0x1}, +- {0x90126, 0x78}, +- {0x90127, 0xf8}, +- {0x90128, 0x820}, +- {0x90129, 0xc7e}, +- {0x9012a, 0x1}, +- {0x9012b, 0x0}, +- {0x9012c, 0x78}, +- {0x9012d, 0x0}, +- {0x9012e, 0x1}, +- {0x9012f, 0x78}, +- {0x90130, 0x0}, +- {0x90131, 0x700}, +- {0x90132, 0x849}, +- {0x90133, 0x0}, +- {0x90134, 0x618}, +- {0x90135, 0x809}, +- {0x90136, 0x3ff8}, +- {0x90137, 0x84b8}, +- {0x90138, 0x808}, +- {0x90139, 0x0}, +- {0x9013a, 0x0}, +- {0x9013b, 0x8}, +- {0x9013c, 0x8}, +- {0x9013d, 0xc870}, +- {0x9013e, 0xc0c}, +- {0x9013f, 0x18}, +- {0x90140, 0x710}, +- {0x90141, 0x849}, +- {0x90142, 0x0}, +- {0x90143, 0x4}, +- {0x90144, 0x48}, +- {0x90145, 0x0}, +- {0x90146, 0x4}, +- {0x90147, 0x48}, +- {0x90148, 0x10}, +- {0x90149, 0x710}, +- {0x9014a, 0x849}, +- {0x9014b, 0x0}, +- {0x9014c, 0x4}, +- {0x9014d, 0x48}, +- {0x9014e, 0x0}, +- {0x9014f, 0x710}, +- {0x90150, 0x849}, +- {0x90151, 0x0}, +- {0x90152, 0x4}, +- {0x90153, 0x48}, +- {0x90154, 0x0}, +- {0x90155, 0x4}, +- {0x90156, 0x18}, +- {0x90157, 0x0}, +- {0x90158, 0x4}, +- {0x90159, 0x18}, +- {0x9015a, 0x0}, +- {0x9015b, 0x4}, +- {0x9015c, 0x18}, +- {0x9015d, 0x0}, +- {0x9015e, 0x8410}, +- {0x9015f, 0x809}, +- {0x90160, 0x0}, +- {0x90161, 0x8498}, +- {0x90162, 0x808}, +- {0x90163, 0x5}, +- {0x90164, 0x510}, +- {0x90165, 0x809}, +- {0x90166, 0x198}, +- {0x90167, 0x1000}, +- {0x90168, 0x809}, +- {0x90169, 0x9}, +- {0x9016a, 0x3c0}, +- {0x9016b, 0x809}, +- {0x9016c, 0x10}, +- {0x9016d, 0x510}, +- {0x9016e, 0x809}, +- {0x9016f, 0x0}, +- {0x90170, 0x3c0}, +- {0x90171, 0x809}, +- {0x90172, 0x18}, +- {0x90173, 0x4}, +- {0x90174, 0x8}, +- {0x90175, 0x2}, +- {0x90176, 0x510}, +- {0x90177, 0x809}, +- {0x90178, 0x2}, +- {0x90179, 0x1000}, +- {0x9017a, 0x809}, +- {0x9017b, 0x68}, +- {0x9017c, 0x801a}, +- {0x9017d, 0x8}, +- {0x9017e, 0x68}, +- {0x9017f, 0x8022}, +- {0x90180, 0x8}, +- {0x90181, 0x479}, +- {0x90182, 0xc7f8}, +- {0x90183, 0x80c}, +- {0x90184, 0x0}, +- {0x90185, 0x0}, +- {0x90186, 0x8}, +- {0x90187, 0x68}, +- {0x90188, 0x801a}, +- {0x90189, 0x8}, +- {0x9018a, 0x68}, +- {0x9018b, 0x8022}, +- {0x9018c, 0x8}, +- {0x9018d, 0x9}, +- {0x9018e, 0xc9c0}, +- {0x9018f, 0xc0c}, +- {0x90190, 0x0}, +- {0x90191, 0xc870}, +- {0x90192, 0xc0c}, +- {0x90193, 0x0}, +- {0x90194, 0x2a0}, +- {0x90195, 0x809}, +- {0x90196, 0x10}, +- {0x90197, 0x8160}, +- {0x90198, 0x89c}, +- {0x90199, 0x2}, +- {0x9019a, 0x7c8}, +- {0x9019b, 0x809}, +- {0x9019c, 0x0}, +- {0x9019d, 0x1}, +- {0x9019e, 0x8}, +- {0x9019f, 0x40}, +- {0x901a0, 0x1932}, +- {0x901a1, 0x129}, +- {0x901a2, 0xa}, +- {0x901a3, 0xc140}, +- {0x901a4, 0x80c}, +- {0x901a5, 0x98}, +- {0x901a6, 0x193a}, +- {0x901a7, 0x129}, +- {0x901a8, 0x90}, +- {0x901a9, 0x1932}, +- {0x901aa, 0x329}, +- {0x901ab, 0x90}, +- {0x901ac, 0x193a}, +- {0x901ad, 0x329}, +- {0x901ae, 0x88}, +- {0x901af, 0x1882}, +- {0x901b0, 0x9}, +- {0x901b1, 0x0}, +- {0x901b2, 0xc140}, +- {0x901b3, 0x80c}, +- {0x901b4, 0x10}, +- {0x901b5, 0x400}, +- {0x901b6, 0x80e}, +- {0x901b7, 0xb}, +- {0x901b8, 0x370}, +- {0x901b9, 0x809}, +- {0x901ba, 0x23b}, +- {0x901bb, 0x100}, +- {0x901bc, 0xcf9}, +- {0x901bd, 0x0}, +- {0x901be, 0x2a0}, +- {0x901bf, 0x809}, +- {0x901c0, 0x7800}, +- {0x901c1, 0x8660}, +- {0x901c2, 0x809}, +- {0x901c3, 0xd}, +- {0x901c4, 0x7c0}, +- {0x901c5, 0x809}, +- {0x901c6, 0x0}, +- {0x901c7, 0x82b0}, +- {0x901c8, 0x818}, +- {0x901c9, 0x0}, +- {0x901ca, 0x82b0}, +- {0x901cb, 0x868}, +- {0x901cc, 0x479}, +- {0x901cd, 0xc7f8}, +- {0x901ce, 0x91c}, +- {0x901cf, 0x0}, +- {0x901d0, 0x0}, +- {0x901d1, 0x118}, +- {0x901d2, 0x38}, +- {0x901d3, 0x80a2}, +- {0x901d4, 0x118}, +- {0x901d5, 0x9}, +- {0x901d6, 0xc9c0}, +- {0x901d7, 0xd1c}, +- {0x901d8, 0x0}, +- {0x901d9, 0x0}, +- {0x901da, 0x118}, +- {0x901db, 0x8}, +- {0x901dc, 0x508}, +- {0x901dd, 0x809}, +- {0x901de, 0x5}, +- {0x901df, 0x7c0}, +- {0x901e0, 0x809}, +- {0x901e1, 0x8}, +- {0x901e2, 0x82b0}, +- {0x901e3, 0x868}, +- {0x901e4, 0x8}, +- {0x901e5, 0x82b0}, +- {0x901e6, 0x818}, +- {0x901e7, 0x8}, +- {0x901e8, 0x82b0}, +- {0x901e9, 0x888}, +- {0x901ea, 0x10}, +- {0x901eb, 0x510}, +- {0x901ec, 0x809}, +- {0x901ed, 0x0}, +- {0x901ee, 0xa8}, +- {0x901ef, 0x8c9}, +- {0x901f0, 0x8}, +- {0x901f1, 0x1900}, +- {0x901f2, 0xc09}, +- {0x901f3, 0x0}, +- {0x901f4, 0x508}, +- {0x901f5, 0x809}, +- {0x901f6, 0x2}, +- {0x901f7, 0x7c8}, +- {0x901f8, 0x829}, +- {0x901f9, 0xa}, +- {0x901fa, 0x3c8}, +- {0x901fb, 0xc29}, +- {0x901fc, 0x199}, +- {0x901fd, 0x3d0}, +- {0x901fe, 0xc19}, +- {0x901ff, 0x3}, +- {0x90200, 0x0}, +- {0x90201, 0x18}, +- {0x90202, 0x38}, +- {0x90203, 0x4}, +- {0x90204, 0x18}, +- {0x90205, 0x199}, +- {0x90206, 0x3d0}, +- {0x90207, 0xc09}, +- {0x90208, 0x0}, +- {0x90209, 0x0}, +- {0x9020a, 0x8}, +- {0x9020b, 0x9}, +- {0x9020c, 0x150}, +- {0x9020d, 0x809}, +- {0x9020e, 0x9}, +- {0x9020f, 0xc800}, +- {0x90210, 0xc0c}, +- {0x90211, 0x18}, +- {0x90212, 0x8160}, +- {0x90213, 0x8cc}, +- {0x90214, 0x8}, +- {0x90215, 0x13a}, +- {0x90216, 0xc9}, +- {0x90217, 0x24b}, +- {0x90218, 0x100}, +- {0x90219, 0x8c9}, +- {0x9021a, 0x2}, +- {0x9021b, 0x1}, +- {0x9021c, 0xc8}, +- {0x9021d, 0x0}, +- {0x9021e, 0x100}, +- {0x9021f, 0x8c9}, +- {0x90220, 0x20}, +- {0x90221, 0x4}, +- {0x90222, 0xc8}, +- {0x90223, 0x20}, +- {0x90224, 0x4}, +- {0x90225, 0xc8}, +- {0x90226, 0x5}, +- {0x90227, 0x0}, +- {0x90228, 0xc8}, +- {0x90229, 0x479}, +- {0x9022a, 0xc7f8}, +- {0x9022b, 0x8cc}, +- {0x9022c, 0x0}, +- {0x9022d, 0x0}, +- {0x9022e, 0xc8}, +- {0x9022f, 0x30}, +- {0x90230, 0xaa}, +- {0x90231, 0xc9}, +- {0x90232, 0x9}, +- {0x90233, 0xc9c0}, +- {0x90234, 0xccc}, +- {0x90235, 0x0}, +- {0x90236, 0x0}, +- {0x90237, 0xc8}, +- {0x90238, 0x479}, +- {0x90239, 0xc7f8}, +- {0x9023a, 0x8bc}, +- {0x9023b, 0x0}, +- {0x9023c, 0x0}, +- {0x9023d, 0xb8}, +- {0x9023e, 0x30}, +- {0x9023f, 0xaa}, +- {0x90240, 0xb9}, +- {0x90241, 0x9}, +- {0x90242, 0xc9c0}, +- {0x90243, 0xcbc}, +- {0x90244, 0x0}, +- {0x90245, 0x0}, +- {0x90246, 0xb8}, +- {0x90247, 0x25b}, +- {0x90248, 0x100}, +- {0x90249, 0xcc9}, +- {0x9024a, 0x20}, +- {0x9024b, 0x4}, +- {0x9024c, 0xc8}, +- {0x9024d, 0x20}, +- {0x9024e, 0x4}, +- {0x9024f, 0xc8}, +- {0x90250, 0x20}, +- {0x90251, 0x4}, +- {0x90252, 0xa8}, +- {0x90253, 0x4}, +- {0x90254, 0x0}, +- {0x90255, 0xc8}, +- {0x90256, 0x9}, +- {0x90257, 0xc800}, +- {0x90258, 0xc6c}, +- {0x90259, 0x26f}, +- {0x9025a, 0x100}, +- {0x9025b, 0xc19}, +- {0x9025c, 0x8}, +- {0x9025d, 0x4}, +- {0x9025e, 0x18}, +- {0x9025f, 0x27f}, +- {0x90260, 0x100}, +- {0x90261, 0xc19}, +- {0x90262, 0x479}, +- {0x90263, 0xc7f8}, +- {0x90264, 0x80c}, +- {0x90265, 0x0}, +- {0x90266, 0x0}, +- {0x90267, 0x8}, +- {0x90268, 0x58}, +- {0x90269, 0x8a}, +- {0x9026a, 0x9}, +- {0x9026b, 0x9}, +- {0x9026c, 0xc9c0}, +- {0x9026d, 0xc0c}, +- {0x9026e, 0x0}, +- {0x9026f, 0x0}, +- {0x90270, 0x8}, +- {0x90271, 0x18}, +- {0x90272, 0x8160}, +- {0x90273, 0x86c}, +- {0x90274, 0x1008}, +- {0x90275, 0x853b}, +- {0x90276, 0x868}, +- {0x90277, 0xc00}, +- {0x90278, 0x8588}, +- {0x90279, 0x868}, +- {0x9027a, 0x8}, +- {0x9027b, 0x85a8}, +- {0x9027c, 0x868}, +- {0x9027d, 0x8}, +- {0x9027e, 0x85c8}, +- {0x9027f, 0x868}, +- {0x90280, 0x0}, +- {0x90281, 0x8050}, +- {0x90282, 0x868}, +- {0x90283, 0x60}, +- {0x90284, 0x138}, +- {0x90285, 0x869}, +- {0x90286, 0x18}, +- {0x90287, 0x8510}, +- {0x90288, 0x868}, +- {0x90289, 0x18}, +- {0x9028a, 0x2c8}, +- {0x9028b, 0x869}, +- {0x9028c, 0x10}, +- {0x9028d, 0x8520}, +- {0x9028e, 0x868}, +- {0x9028f, 0x1ff8}, +- {0x90290, 0x85d8}, +- {0x90291, 0xc68}, +- {0x90292, 0x0}, +- {0x90293, 0xfdf0}, +- {0x90294, 0x868}, +- {0x90295, 0x8}, +- {0x90296, 0x85f0}, +- {0x90297, 0x868}, +- {0x90298, 0x8}, +- {0x90299, 0xa5f0}, +- {0x9029a, 0x868}, +- {0x9029b, 0x298}, +- {0x9029c, 0x100}, +- {0x9029d, 0x869}, +- {0x9029e, 0x2}, +- {0x9029f, 0x1}, +- {0x902a0, 0x68}, +- {0x902a1, 0x0}, +- {0x902a2, 0x100}, +- {0x902a3, 0x869}, +- {0x902a4, 0x0}, +- {0x902a5, 0x85f0}, +- {0x902a6, 0x868}, +- {0x902a7, 0x0}, +- {0x902a8, 0xa5f0}, +- {0x902a9, 0x868}, +- {0x902aa, 0x33b}, +- {0x902ab, 0x100}, +- {0x902ac, 0x8c9}, +- {0x902ad, 0x0}, +- {0x902ae, 0x100}, +- {0x902af, 0x8c9}, +- {0x902b0, 0x1ff8}, +- {0x902b1, 0x85d8}, +- {0x902b2, 0xc68}, +- {0x902b3, 0x8}, +- {0x902b4, 0x8df0}, +- {0x902b5, 0x868}, +- {0x902b6, 0x8}, +- {0x902b7, 0xadf0}, +- {0x902b8, 0x868}, +- {0x902b9, 0x2a8}, +- {0x902ba, 0x100}, +- {0x902bb, 0x869}, +- {0x902bc, 0x2}, +- {0x902bd, 0x1}, +- {0x902be, 0x68}, +- {0x902bf, 0x0}, +- {0x902c0, 0x100}, +- {0x902c1, 0x869}, +- {0x902c2, 0x0}, +- {0x902c3, 0x8df0}, +- {0x902c4, 0x868}, +- {0x902c5, 0x0}, +- {0x902c6, 0xadf0}, +- {0x902c7, 0x868}, +- {0x902c8, 0x10}, +- {0x902c9, 0x2c8}, +- {0x902ca, 0x869}, +- {0x902cb, 0x28}, +- {0x902cc, 0x4}, +- {0x902cd, 0x68}, +- {0x902ce, 0xa}, +- {0x902cf, 0x500}, +- {0x902d0, 0xc69}, +- {0x902d1, 0x0}, +- {0x902d2, 0x8520}, +- {0x902d3, 0x868}, +- {0x902d4, 0x8}, +- {0x902d5, 0x8530}, +- {0x902d6, 0x868}, +- {0x902d7, 0x2ba}, +- {0x902d8, 0x100}, +- {0x902d9, 0x869}, +- {0x902da, 0x2}, +- {0x902db, 0x1}, +- {0x902dc, 0x68}, +- {0x902dd, 0x2}, +- {0x902de, 0x100}, +- {0x902df, 0x869}, +- {0x902e0, 0x0}, +- {0x902e1, 0x8530}, +- {0x902e2, 0x868}, +- {0x902e3, 0x0}, +- {0x902e4, 0x8510}, +- {0x902e5, 0x868}, +- {0x902e6, 0x0}, +- {0x902e7, 0x2c8}, +- {0x902e8, 0x869}, +- {0x902e9, 0x8}, +- {0x902ea, 0x8050}, +- {0x902eb, 0x868}, +- {0x902ec, 0x30}, +- {0x902ed, 0x4}, +- {0x902ee, 0x68}, +- {0x902ef, 0x8}, +- {0x902f0, 0x8520}, +- {0x902f1, 0x868}, +- {0x902f2, 0x0}, +- {0x902f3, 0x8328}, +- {0x902f4, 0x86b}, +- {0x902f5, 0x2ca}, +- {0x902f6, 0x100}, +- {0x902f7, 0x869}, +- {0x902f8, 0x2}, +- {0x902f9, 0x1}, +- {0x902fa, 0x68}, +- {0x902fb, 0x4}, +- {0x902fc, 0x100}, +- {0x902fd, 0x869}, +- {0x902fe, 0xff8}, +- {0x902ff, 0x8328}, +- {0x90300, 0x86b}, +- {0x90301, 0x9}, +- {0x90302, 0x500}, +- {0x90303, 0xc29}, +- {0x90304, 0x0}, +- {0x90305, 0x8520}, +- {0x90306, 0x868}, +- {0x90307, 0x8}, +- {0x90308, 0x3c8}, +- {0x90309, 0xc29}, +- {0x9030a, 0x0}, +- {0x9030b, 0x150}, +- {0x9030c, 0x809}, +- {0x9030d, 0x2}, +- {0x9030e, 0x370}, +- {0x9030f, 0x809}, +- {0x90310, 0x0}, +- {0x90311, 0x400}, +- {0x90312, 0x80e}, +- {0x90313, 0x10}, +- {0x90314, 0x4}, +- {0x90315, 0x118}, +- {0x90316, 0x20}, +- {0x90317, 0x82b0}, +- {0x90318, 0x808}, +- {0x90319, 0x479}, +- {0x9031a, 0xc7f8}, +- {0x9031b, 0x80c}, +- {0x9031c, 0x0}, +- {0x9031d, 0x0}, +- {0x9031e, 0x8}, +- {0x9031f, 0x60}, +- {0x90320, 0x8a}, +- {0x90321, 0x9}, +- {0x90322, 0x9}, +- {0x90323, 0xc9c0}, +- {0x90324, 0xc0c}, +- {0x90325, 0x0}, +- {0x90326, 0x0}, +- {0x90327, 0x8}, +- {0x90328, 0x8}, +- {0x90329, 0x2a0}, +- {0x9032a, 0x809}, +- {0x9032b, 0x48}, +- {0x9032c, 0xc822}, +- {0x9032d, 0xc}, +- {0x9032e, 0x48}, +- {0x9032f, 0xcc32}, +- {0x90330, 0xc}, +- {0x90331, 0x9}, +- {0x90332, 0xc800}, +- {0x90333, 0xc0c}, +- {0x90334, 0x0}, +- {0x90335, 0x8168}, +- {0x90336, 0x80c}, +- {0x90337, 0x479}, +- {0x90338, 0xc7f8}, +- {0x90339, 0x91c}, +- {0x9033a, 0x0}, +- {0x9033b, 0x0}, +- {0x9033c, 0x118}, +- {0x9033d, 0x9190}, +- {0x9033e, 0x80a1}, +- {0x9033f, 0x918}, +- {0x90340, 0x9}, +- {0x90341, 0xc9c0}, +- {0x90342, 0xd1c}, +- {0x90343, 0x0}, +- {0x90344, 0x0}, +- {0x90345, 0x118}, +- {0x90346, 0x18}, +- {0x90347, 0xf0}, +- {0x90348, 0x909}, +- {0x90349, 0xa}, +- {0x9034a, 0xc140}, +- {0x9034b, 0x92c}, +- {0x9034c, 0x88}, +- {0x9034d, 0x1932}, +- {0x9034e, 0x129}, +- {0x9034f, 0x88}, +- {0x90350, 0x193a}, +- {0x90351, 0x129}, +- {0x90352, 0x0}, +- {0x90353, 0xc140}, +- {0x90354, 0x92c}, +- {0x90355, 0x8}, +- {0x90356, 0x300}, +- {0x90357, 0x819}, +- {0x90358, 0x10}, +- {0x90359, 0x8160}, +- {0x9035a, 0x80c}, +- {0x9035b, 0x8}, +- {0x9035c, 0x7c8}, +- {0x9035d, 0x801}, +- {0x9035e, 0x8}, +- {0x9035f, 0x0}, +- {0x90360, 0x8}, +- {0x90361, 0x8}, +- {0x90362, 0x1880}, +- {0x90363, 0x809}, +- {0x90364, 0x10}, +- {0x90365, 0x8160}, +- {0x90366, 0x80c}, +- {0x90367, 0x1800}, +- {0x90368, 0x8660}, +- {0x90369, 0x809}, +- {0x9036a, 0x4000}, +- {0x9036b, 0x8668}, +- {0x9036c, 0x809}, +- {0x9036d, 0x0}, +- {0x9036e, 0xf0}, +- {0x9036f, 0x909}, +- {0x90370, 0xf}, +- {0x90371, 0x7c0}, +- {0x90372, 0x809}, +- {0x90373, 0x0}, +- {0x90374, 0x2a0}, +- {0x90375, 0x809}, +- {0x90376, 0x8}, +- {0x90377, 0x618}, +- {0x90378, 0x809}, +- {0x90379, 0x0}, +- {0x9037a, 0x84b8}, +- {0x9037b, 0x808}, +- {0x9037c, 0xff8}, +- {0x9037d, 0x8410}, +- {0x9037e, 0x809}, +- {0x9037f, 0x7ff8}, +- {0x90380, 0x8498}, +- {0x90381, 0x808}, +- {0x90382, 0x0}, +- {0x90383, 0x7c8}, +- {0x90384, 0x809}, +- {0x90385, 0x8}, +- {0x90386, 0x8168}, +- {0x90387, 0x80c}, +- {0x90388, 0x0}, +- {0x90389, 0x1}, +- {0x9038a, 0x8}, +- {0x9038b, 0x0}, +- {0x9038c, 0x4}, +- {0x9038d, 0x8}, +- {0x9038e, 0x0}, +- {0x9038f, 0x4}, +- {0x90390, 0x8}, +- {0x90391, 0x18}, +- {0x90392, 0x300}, +- {0x90393, 0x809}, +- {0x90394, 0x0}, +- {0x90395, 0x480}, +- {0x90396, 0x809}, +- {0x90397, 0x8}, +- {0x90398, 0x510}, +- {0x90399, 0x809}, +- {0x9039a, 0x7800}, +- {0x9039b, 0x8660}, +- {0x9039c, 0x809}, +- {0x9039d, 0x18}, +- {0x9039e, 0xf0}, +- {0x9039f, 0x909}, +- {0x903a0, 0x8}, +- {0x903a1, 0x7c8}, +- {0x903a2, 0x801}, +- {0x903a3, 0x10}, +- {0x903a4, 0x400}, +- {0x903a5, 0x80e}, +- {0x903a6, 0x8}, +- {0x903a7, 0x150}, +- {0x903a8, 0x809}, +- {0x903a9, 0x9}, +- {0x903aa, 0x370}, +- {0x903ab, 0x809}, +- {0x903ac, 0x18}, +- {0x903ad, 0x8160}, +- {0x903ae, 0x80c}, +- {0x903af, 0x8}, +- {0x903b0, 0xc800}, +- {0x903b1, 0xc0c}, +- {0x903b2, 0x8}, +- {0x903b3, 0xc888}, +- {0x903b4, 0xc04}, +- {0x903b5, 0x20}, +- {0x903b6, 0x8302}, +- {0x903b7, 0xb}, +- {0x903b8, 0x18}, +- {0x903b9, 0x8582}, +- {0x903ba, 0x8}, +- {0x903bb, 0x9000}, +- {0x903bc, 0x8539}, +- {0x903bd, 0x808}, +- {0x903be, 0x0}, +- {0x903bf, 0x8588}, +- {0x903c0, 0x808}, +- {0x903c1, 0x40}, +- {0x903c2, 0x85c8}, +- {0x903c3, 0x808}, +- {0x903c4, 0x0}, +- {0x903c5, 0xfdf0}, +- {0x903c6, 0x808}, +- {0x903c7, 0x800}, +- {0x903c8, 0xc5f0}, +- {0x903c9, 0x808}, +- {0x903ca, 0x1ff8}, +- {0x903cb, 0xfdd8}, +- {0x903cc, 0xc08}, +- {0x903cd, 0x18}, +- {0x903ce, 0xfda8}, +- {0x903cf, 0x808}, +- {0x903d0, 0x40}, +- {0x903d1, 0x8520}, +- {0x903d2, 0x8d8}, +- {0x903d3, 0x80}, +- {0x903d4, 0x8520}, +- {0x903d5, 0x8e8}, +- {0x903d6, 0x30a}, +- {0x903d7, 0x100}, +- {0x903d8, 0x8d9}, +- {0x903d9, 0x32a}, +- {0x903da, 0x100}, +- {0x903db, 0x8e9}, +- {0x903dc, 0x0}, +- {0x903dd, 0x1}, +- {0x903de, 0x8}, +- {0x903df, 0x0}, +- {0x903e0, 0x100}, +- {0x903e1, 0x809}, +- {0x903e2, 0x1ff8}, +- {0x903e3, 0xfdd8}, +- {0x903e4, 0xc08}, +- {0x903e5, 0x8}, +- {0x903e6, 0xfda8}, +- {0x903e7, 0x808}, +- {0x903e8, 0x140}, +- {0x903e9, 0x8520}, +- {0x903ea, 0x8d8}, +- {0x903eb, 0x180}, +- {0x903ec, 0x8520}, +- {0x903ed, 0x8e8}, +- {0x903ee, 0x30a}, +- {0x903ef, 0x100}, +- {0x903f0, 0x8d9}, +- {0x903f1, 0x32a}, +- {0x903f2, 0x100}, +- {0x903f3, 0x8e9}, +- {0x903f4, 0x0}, +- {0x903f5, 0x1}, +- {0x903f6, 0x8}, +- {0x903f7, 0x0}, +- {0x903f8, 0x100}, +- {0x903f9, 0x809}, +- {0x903fa, 0x9}, +- {0x903fb, 0x500}, +- {0x903fc, 0xc09}, +- {0x903fd, 0x10}, +- {0x903fe, 0x82b0}, +- {0x903ff, 0x808}, +- {0x90400, 0x0}, +- {0x90401, 0x8520}, +- {0x90402, 0x808}, +- {0x90403, 0x8}, +- {0x90404, 0x3c8}, +- {0x90405, 0xc09}, +- {0x90406, 0x0}, +- {0x90407, 0x150}, +- {0x90408, 0x809}, +- {0x90409, 0x2}, +- {0x9040a, 0x370}, +- {0x9040b, 0x809}, +- {0x9040c, 0x0}, +- {0x9040d, 0x400}, +- {0x9040e, 0x80e}, +- {0x9040f, 0x8}, +- {0x90410, 0xc848}, +- {0x90411, 0xc0c}, +- {0x90412, 0x0}, +- {0x90413, 0xc890}, +- {0x90414, 0x804}, +- {0x90415, 0x20}, +- {0x90416, 0x8302}, +- {0x90417, 0xb}, +- {0x90418, 0x18}, +- {0x90419, 0x8582}, +- {0x9041a, 0x8}, +- {0x9041b, 0x0}, +- {0x9041c, 0x82b0}, +- {0x9041d, 0x808}, +- {0x9041e, 0x1000}, +- {0x9041f, 0x8539}, +- {0x90420, 0x808}, +- {0x90421, 0x0}, +- {0x90422, 0x8588}, +- {0x90423, 0x808}, +- {0x90424, 0x40}, +- {0x90425, 0x85c8}, +- {0x90426, 0x808}, +- {0x90427, 0x7f8}, +- {0x90428, 0xfdf0}, +- {0x90429, 0x808}, +- {0x9042a, 0x800}, +- {0x9042b, 0xc5f0}, +- {0x9042c, 0x808}, +- {0x9042d, 0x80}, +- {0x9042e, 0x8088}, +- {0x9042f, 0x80b}, +- {0x90430, 0x1ff8}, +- {0x90431, 0xfdd8}, +- {0x90432, 0xc08}, +- {0x90433, 0x18}, +- {0x90434, 0xfda8}, +- {0x90435, 0x808}, +- {0x90436, 0x200}, +- {0x90437, 0x8520}, +- {0x90438, 0x8d8}, +- {0x90439, 0x400}, +- {0x9043a, 0x8520}, +- {0x9043b, 0x8e8}, +- {0x9043c, 0x2da}, +- {0x9043d, 0x100}, +- {0x9043e, 0x8d9}, +- {0x9043f, 0x2ea}, +- {0x90440, 0x100}, +- {0x90441, 0x8e9}, +- {0x90442, 0x2}, +- {0x90443, 0x1}, +- {0x90444, 0x8}, +- {0x90445, 0x0}, +- {0x90446, 0x100}, +- {0x90447, 0x809}, +- {0x90448, 0x1ff8}, +- {0x90449, 0xfdd8}, +- {0x9044a, 0xc08}, +- {0x9044b, 0x8}, +- {0x9044c, 0xfda8}, +- {0x9044d, 0x808}, +- {0x9044e, 0xa00}, +- {0x9044f, 0x8520}, +- {0x90450, 0x8d8}, +- {0x90451, 0xc00}, +- {0x90452, 0x8520}, +- {0x90453, 0x8e8}, +- {0x90454, 0x2da}, +- {0x90455, 0x100}, +- {0x90456, 0x8d9}, +- {0x90457, 0x2ea}, +- {0x90458, 0x100}, +- {0x90459, 0x8e9}, +- {0x9045a, 0x0}, +- {0x9045b, 0x1}, +- {0x9045c, 0x8}, +- {0x9045d, 0x0}, +- {0x9045e, 0x100}, +- {0x9045f, 0x809}, +- {0x90460, 0x9}, +- {0x90461, 0x500}, +- {0x90462, 0xc09}, +- {0x90463, 0x10}, +- {0x90464, 0x82b0}, +- {0x90465, 0x808}, +- {0x90466, 0x0}, +- {0x90467, 0x8520}, +- {0x90468, 0x808}, +- {0x90469, 0x8}, +- {0x9046a, 0x3c8}, +- {0x9046b, 0xc09}, +- {0x9046c, 0x0}, +- {0x9046d, 0x150}, +- {0x9046e, 0x809}, +- {0x9046f, 0x2}, +- {0x90470, 0x370}, +- {0x90471, 0x809}, +- {0x90472, 0x0}, +- {0x90473, 0x400}, +- {0x90474, 0x80e}, +- {0x90475, 0x8}, +- {0x90476, 0xc848}, +- {0x90477, 0xc0c}, +- {0x90478, 0x0}, +- {0x90479, 0xc890}, +- {0x9047a, 0x804}, +- {0x9047b, 0x1008}, +- {0x9047c, 0x853b}, +- {0x9047d, 0x808}, +- {0x9047e, 0xc00}, +- {0x9047f, 0x8588}, +- {0x90480, 0x808}, +- {0x90481, 0x8}, +- {0x90482, 0x85a8}, +- {0x90483, 0x808}, +- {0x90484, 0x8}, +- {0x90485, 0x85c8}, +- {0x90486, 0x808}, +- {0x90487, 0x60}, +- {0x90488, 0x138}, +- {0x90489, 0x809}, +- {0x9048a, 0x18}, +- {0x9048b, 0xc8}, +- {0x9048c, 0x809}, +- {0x9048d, 0x0}, +- {0x9048e, 0xa4}, +- {0x9048f, 0x809}, +- {0x90490, 0x0}, +- {0x90491, 0x8510}, +- {0x90492, 0x808}, +- {0x90493, 0x2fa}, +- {0x90494, 0x100}, +- {0x90495, 0x8d9}, +- {0x90496, 0x31a}, +- {0x90497, 0x100}, +- {0x90498, 0x8e9}, +- {0x90499, 0x2}, +- {0x9049a, 0x1}, +- {0x9049b, 0x8}, +- {0x9049c, 0x2}, +- {0x9049d, 0x100}, +- {0x9049e, 0x809}, +- {0x9049f, 0x202}, +- {0x904a0, 0x8510}, +- {0x904a1, 0xc08}, +- {0x904a2, 0x50}, +- {0x904a3, 0xa2}, +- {0x904a4, 0x9}, +- {0x904a5, 0x0}, +- {0x904a6, 0x0}, +- {0x904a7, 0x8}, +- {0x904a8, 0x0}, +- {0x904a9, 0x0}, +- {0x904aa, 0x8}, +- {0x904ab, 0x0}, +- {0x904ac, 0x0}, +- {0x904ad, 0x8}, +- {0x904ae, 0x0}, +- {0x904af, 0xc8}, +- {0x904b0, 0x809}, +- {0x904b1, 0xb}, +- {0x904b2, 0x508}, +- {0x904b3, 0x809}, +- {0x904b4, 0x8}, +- {0x904b5, 0x1900}, +- {0x904b6, 0xc09}, +- {0x904b7, 0x2}, +- {0x904b8, 0x0}, +- {0x904b9, 0x8}, +- {0x904ba, 0x0}, +- {0x904bb, 0x508}, +- {0x904bc, 0x809}, +- {0x904bd, 0x9}, +- {0x904be, 0x500}, +- {0x904bf, 0xc09}, +- {0x904c0, 0x10}, +- {0x904c1, 0x82b0}, +- {0x904c2, 0x808}, +- {0x904c3, 0x0}, +- {0x904c4, 0x8520}, +- {0x904c5, 0x808}, +- {0x904c6, 0x8}, +- {0x904c7, 0x3c8}, +- {0x904c8, 0xc09}, +- {0x904c9, 0x0}, +- {0x904ca, 0x150}, +- {0x904cb, 0x809}, +- {0x904cc, 0x2}, +- {0x904cd, 0x370}, +- {0x904ce, 0x809}, +- {0x904cf, 0x0}, +- {0x904d0, 0x400}, +- {0x904d1, 0x80e}, +- {0x904d2, 0x8}, +- {0x904d3, 0xc848}, +- {0x904d4, 0xc0c}, +- {0x904d5, 0x0}, +- {0x904d6, 0xc890}, +- {0x904d7, 0x804}, +- {0x904d8, 0x20}, +- {0x904d9, 0x8302}, +- {0x904da, 0xb}, +- {0x904db, 0x18}, +- {0x904dc, 0x8582}, +- {0x904dd, 0x8}, +- {0x904de, 0x1000}, +- {0x904df, 0x8539}, +- {0x904e0, 0x808}, +- {0x904e1, 0x0}, +- {0x904e2, 0x8588}, +- {0x904e3, 0x808}, +- {0x904e4, 0x40}, +- {0x904e5, 0x85c8}, +- {0x904e6, 0x808}, +- {0x904e7, 0x8}, +- {0x904e8, 0xfdf0}, +- {0x904e9, 0x808}, +- {0x904ea, 0x80}, +- {0x904eb, 0x8088}, +- {0x904ec, 0x80b}, +- {0x904ed, 0x0}, +- {0x904ee, 0x3b8}, +- {0x904ef, 0x869}, +- {0x904f0, 0x1ff8}, +- {0x904f1, 0xfdd8}, +- {0x904f2, 0xc08}, +- {0x904f3, 0x18}, +- {0x904f4, 0xfda8}, +- {0x904f5, 0x808}, +- {0x904f6, 0x40}, +- {0x904f7, 0x8520}, +- {0x904f8, 0x8d8}, +- {0x904f9, 0x80}, +- {0x904fa, 0x8520}, +- {0x904fb, 0x8e8}, +- {0x904fc, 0x2da}, +- {0x904fd, 0x100}, +- {0x904fe, 0x8d9}, +- {0x904ff, 0x2ea}, +- {0x90500, 0x100}, +- {0x90501, 0x8e9}, +- {0x90502, 0x2}, +- {0x90503, 0x1}, +- {0x90504, 0x8}, +- {0x90505, 0x0}, +- {0x90506, 0x100}, +- {0x90507, 0x809}, +- {0x90508, 0x1ff8}, +- {0x90509, 0xfdd8}, +- {0x9050a, 0xc08}, +- {0x9050b, 0x8}, +- {0x9050c, 0xfda8}, +- {0x9050d, 0x808}, +- {0x9050e, 0x140}, +- {0x9050f, 0x8520}, +- {0x90510, 0x8d8}, +- {0x90511, 0x180}, +- {0x90512, 0x8520}, +- {0x90513, 0x8e8}, +- {0x90514, 0x2da}, +- {0x90515, 0x100}, +- {0x90516, 0x8d9}, +- {0x90517, 0x2ea}, +- {0x90518, 0x100}, +- {0x90519, 0x8e9}, +- {0x9051a, 0x0}, +- {0x9051b, 0x1}, +- {0x9051c, 0x8}, +- {0x9051d, 0x0}, +- {0x9051e, 0x100}, +- {0x9051f, 0x809}, +- {0x90520, 0x9}, +- {0x90521, 0x500}, +- {0x90522, 0xc09}, +- {0x90523, 0x10}, +- {0x90524, 0x82b0}, +- {0x90525, 0x808}, +- {0x90526, 0x0}, +- {0x90527, 0x8520}, +- {0x90528, 0x808}, +- {0x90529, 0x8}, +- {0x9052a, 0x3c8}, +- {0x9052b, 0xc09}, +- {0x9052c, 0x0}, +- {0x9052d, 0x150}, +- {0x9052e, 0x809}, +- {0x9052f, 0x2}, +- {0x90530, 0x370}, +- {0x90531, 0x809}, +- {0x90532, 0x0}, +- {0x90533, 0x400}, +- {0x90534, 0x80e}, +- {0x90535, 0x8}, +- {0x90536, 0xc848}, +- {0x90537, 0xc0c}, +- {0x90538, 0x0}, +- {0x90539, 0xc890}, +- {0x9053a, 0x804}, +- {0xd00e7, 0x600}, +- {0x9001c, 0x0}, +- {0x90020, 0x77}, +- {0x90024, 0x82}, +- {0x90025, 0x2b}, +- {0x90026, 0x2b}, +- {0x9002b, 0x110}, +- {0x90708, 0x127}, +- {0x90700, 0x14d}, +- {0x90701, 0x16f}, +- {0x90702, 0x18e}, +- {0x90703, 0x12d}, +- {0x90704, 0x0}, +- {0x90705, 0x0}, +- {0x90706, 0x0}, +- {0x90707, 0x0}, +- {0x2018a, 0x0}, +- {0x20124, 0x1}, +- {0x2018b, 0x16}, +- {0x20125, 0x39}, +- {0x2018c, 0x4e}, +- {0x20126, 0x1}, +- {0x2018d, 0x16}, +- {0x20127, 0x39}, +- {0x2018e, 0x4e}, +- {0x20128, 0x17}, +- {0x2018f, 0x27}, +- {0x20129, 0x4f}, +- {0x20190, 0x5f}, +- {0x2012a, 0x17}, +- {0x20191, 0x27}, +- {0x2012b, 0x4f}, +- {0x20192, 0x5f}, +- {0x2012c, 0x28}, +- {0x20193, 0x38}, +- {0x2012d, 0x60}, +- {0x20194, 0x70}, +- {0x2012e, 0x28}, +- {0x20195, 0x38}, +- {0x2012f, 0x60}, +- {0x20196, 0x70}, +- {0x20130, 0x80}, +- {0x20197, 0x80}, +- {0x20131, 0x80}, +- {0x20198, 0x80}, +- {0x20132, 0x80}, +- {0x20199, 0x80}, +- {0x20133, 0x80}, +- {0x2019a, 0x80}, +- {0x20134, 0x71}, +- {0x2019b, 0x74}, +- {0x20135, 0x77}, +- {0x2019c, 0x7a}, +- {0x20136, 0x71}, +- {0x2019d, 0x74}, +- {0x20137, 0x77}, +- {0x2019e, 0x7a}, +- {0x20138, 0x75}, +- {0x2019f, 0x76}, +- {0x20139, 0x7b}, +- {0x201a0, 0x7c}, +- {0x2013a, 0x75}, +- {0x201a1, 0x76}, +- {0x2013b, 0x7b}, +- {0x201a2, 0x7c}, +- {0x2013c, 0x7d}, +- {0x201a3, 0x7e}, +- {0x2013d, 0x7d}, +- {0x201a4, 0x7e}, +- {0x2013e, 0x7d}, +- {0x201a5, 0x7e}, +- {0x2013f, 0x7d}, +- {0x201a6, 0x7e}, +- {0x20140, 0x7f}, +- {0x201a7, 0x7f}, +- {0x20141, 0x7f}, +- {0x201a8, 0x7f}, +- {0x20142, 0x7f}, +- {0x201a9, 0x7f}, +- {0x20143, 0x7f}, +- {0x201aa, 0x7f}, +- {0x20144, 0x80}, +- {0x201ab, 0x7f}, +- {0x20145, 0x80}, +- {0x201ac, 0x7f}, +- {0x20146, 0x80}, +- {0x201ad, 0x7f}, +- {0x20147, 0x80}, +- {0x201ae, 0x7f}, +- {0x20148, 0x81}, +- {0x201af, 0x93}, +- {0x20149, 0x81}, +- {0x201b0, 0x93}, +- {0x2014a, 0x10a}, +- {0x201b1, 0x11b}, +- {0x2014b, 0x10a}, +- {0x201b2, 0x11b}, +- {0x2014c, 0x94}, +- {0x201b3, 0x9b}, +- {0x2014d, 0x94}, +- {0x201b4, 0x9b}, +- {0x2014e, 0x11c}, +- {0x201b5, 0x122}, +- {0x2014f, 0x11c}, +- {0x201b6, 0x122}, +- {0x20150, 0x9c}, +- {0x201b7, 0xaf}, +- {0x20151, 0x9c}, +- {0x201b8, 0xaf}, +- {0x20152, 0x123}, +- {0x201b9, 0x132}, +- {0x20153, 0x123}, +- {0x201ba, 0x132}, +- {0x20154, 0xb0}, +- {0x201bb, 0xc0}, +- {0x20155, 0xb0}, +- {0x201bc, 0xc0}, +- {0x20156, 0x133}, +- {0x201bd, 0x143}, +- {0x20157, 0x133}, +- {0x201be, 0x143}, +- {0x20158, 0xc1}, +- {0x201bf, 0xca}, +- {0x20159, 0xc1}, +- {0x201c0, 0xca}, +- {0x2015a, 0x144}, +- {0x201c1, 0x14d}, +- {0x2015b, 0x144}, +- {0x201c2, 0x14d}, +- {0x2015c, 0xcb}, +- {0x201c3, 0xd4}, +- {0x2015d, 0xcb}, +- {0x201c4, 0xd4}, +- {0x2015e, 0x14e}, +- {0x201c5, 0x157}, +- {0x2015f, 0x14e}, +- {0x201c6, 0x157}, +- {0x20160, 0xd5}, +- {0x201c7, 0xdf}, +- {0x20161, 0xd5}, +- {0x201c8, 0xdf}, +- {0x20162, 0x158}, +- {0x201c9, 0x161}, +- {0x20163, 0x158}, +- {0x201ca, 0x161}, +- {0x20164, 0xe0}, +- {0x201cb, 0xee}, +- {0x20165, 0xe0}, +- {0x201cc, 0xee}, +- {0x20166, 0x162}, +- {0x201cd, 0x170}, +- {0x20167, 0x162}, +- {0x201ce, 0x170}, +- {0x20168, 0xef}, +- {0x201cf, 0xf9}, +- {0x20169, 0xef}, +- {0x201d0, 0xf9}, +- {0x2016a, 0x171}, +- {0x201d1, 0x17a}, +- {0x2016b, 0x171}, +- {0x201d2, 0x17a}, +- {0x2016c, 0xfa}, +- {0x201d3, 0x108}, +- {0x2016d, 0xfa}, +- {0x201d4, 0x108}, +- {0x2016e, 0x17b}, +- {0x201d5, 0x189}, +- {0x2016f, 0x17b}, +- {0x201d6, 0x189}, +- {0x20170, 0x109}, +- {0x201d7, 0x109}, +- {0x20171, 0x109}, +- {0x201d8, 0x109}, +- {0x20172, 0x18a}, +- {0x201d9, 0x18a}, +- {0x20173, 0x18a}, +- {0x201da, 0x18a}, +- {0x41613, 0xb00}, +- {0x41617, 0x0}, +- {0x4163b, 0xb00}, +- {0x4163f, 0x0}, +- {0x41663, 0xb00}, +- {0x41667, 0x0}, +- {0x4168b, 0xb00}, +- {0x4168f, 0x0}, +- {0x41723, 0xb00}, +- {0x41727, 0x0}, +- {0x4174b, 0xb00}, +- {0x4174f, 0x0}, +- {0x417f3, 0xb00}, +- {0x417f7, 0x0}, +- {0x4181b, 0xb00}, +- {0x4181f, 0x0}, +- {0x41a2b, 0x6b00}, +- {0x41a2f, 0x0}, +- {0x41a53, 0x3b00}, +- {0x41a57, 0x800}, +- {0x41a7b, 0x6b00}, +- {0x41a7f, 0x0}, +- {0x41aa3, 0x3b00}, +- {0x41aa7, 0x800}, +- {0x41b33, 0x6b00}, +- {0x41b37, 0x0}, +- {0x41b5b, 0x3b00}, +- {0x41b5f, 0x800}, +- {0x41bfb, 0x6b00}, +- {0x41bff, 0x0}, +- {0x41c23, 0x3b00}, +- {0x41c27, 0x800}, +- {0x41008, 0xc9d8}, +- {0x41009, 0x0}, +- {0x4100a, 0x0}, +- {0x4100b, 0x0}, +- {0x4100c, 0xc808}, +- {0x4100d, 0x0}, +- {0x4100e, 0x0}, +- {0x4100f, 0x0}, +- {0x41010, 0x0}, +- {0x41011, 0x0}, +- {0x41012, 0x0}, +- {0x41013, 0x2b00}, +- {0x41014, 0x0}, +- {0x41015, 0x0}, +- {0x41016, 0x0}, +- {0x41017, 0x0}, +- {0x41018, 0xc958}, +- {0x41019, 0x0}, +- {0x4101a, 0x0}, +- {0x4101b, 0x0}, +- {0x4101c, 0xcd88}, +- {0x4101d, 0x0}, +- {0x4101e, 0x0}, +- {0x4101f, 0x0}, +- {0x41020, 0x0}, +- {0x41021, 0x0}, +- {0x41022, 0x0}, +- {0x41023, 0x2b00}, +- {0x41024, 0x0}, +- {0x41025, 0x0}, +- {0x41026, 0x0}, +- {0x41027, 0x0}, +- {0x41028, 0xc0d8}, +- {0x41029, 0x0}, +- {0x4102a, 0x0}, +- {0x4102b, 0x0}, +- {0x4102c, 0xd848}, +- {0x4102d, 0x0}, +- {0x4102e, 0x0}, +- {0x4102f, 0x0}, +- {0x41030, 0x0}, +- {0x41031, 0x0}, +- {0x41032, 0x0}, +- {0x41033, 0x2b00}, +- {0x41034, 0x0}, +- {0x41035, 0x0}, +- {0x41036, 0x0}, +- {0x41037, 0x0}, +- {0x41038, 0xc158}, +- {0x41039, 0x0}, +- {0x4103a, 0x0}, +- {0x4103b, 0x0}, +- {0x4103c, 0xddc8}, +- {0x4103d, 0x0}, +- {0x4103e, 0x0}, +- {0x4103f, 0x0}, +- {0x41040, 0x0}, +- {0x41041, 0x0}, +- {0x41042, 0x0}, +- {0x41043, 0x2b00}, +- {0x41044, 0x0}, +- {0x41045, 0x0}, +- {0x41046, 0x0}, +- {0x41047, 0x0}, +- {0x41048, 0xc1d8}, +- {0x41049, 0x0}, +- {0x4104a, 0x0}, +- {0x4104b, 0x0}, +- {0x4104c, 0xc308}, +- {0x4104d, 0x0}, +- {0x4104e, 0x0}, +- {0x4104f, 0x0}, +- {0x41050, 0x0}, +- {0x41051, 0x0}, +- {0x41052, 0x0}, +- {0x41053, 0x2b00}, +- {0x41054, 0x0}, +- {0x41055, 0x0}, +- {0x41056, 0x0}, +- {0x41057, 0x0}, +- {0x41058, 0xc558}, +- {0x41059, 0x0}, +- {0x4105a, 0x0}, +- {0x4105b, 0x0}, +- {0x4105c, 0xea08}, +- {0x4105d, 0x0}, +- {0x4105e, 0x0}, +- {0x4105f, 0x0}, +- {0x41060, 0x0}, +- {0x41061, 0x0}, +- {0x41062, 0x0}, +- {0x41063, 0x2b00}, +- {0x41064, 0x0}, +- {0x41065, 0x0}, +- {0x41066, 0x0}, +- {0x41067, 0x0}, +- {0x41068, 0xc5d8}, +- {0x41069, 0x0}, +- {0x4106a, 0x0}, +- {0x4106b, 0x0}, +- {0x4106c, 0xe308}, +- {0x4106d, 0x0}, +- {0x4106e, 0x0}, +- {0x4106f, 0x0}, +- {0x41070, 0x0}, +- {0x41071, 0x0}, +- {0x41072, 0x0}, +- {0x41073, 0x2b00}, +- {0x41074, 0x0}, +- {0x41075, 0x0}, +- {0x41076, 0x0}, +- {0x41077, 0x0}, +- {0x41078, 0x48d8}, +- {0x41079, 0x0}, +- {0x4107a, 0x0}, +- {0x4107b, 0x0}, +- {0x4107c, 0x4248}, +- {0x4107d, 0x0}, +- {0x4107e, 0x0}, +- {0x4107f, 0x0}, +- {0x41080, 0x88d8}, +- {0x41081, 0x0}, +- {0x41082, 0x0}, +- {0x41083, 0x0}, +- {0x41084, 0x9648}, +- {0x41085, 0x0}, +- {0x41086, 0x0}, +- {0x41087, 0x0}, +- {0x41088, 0x0}, +- {0x41089, 0x0}, +- {0x4108a, 0x0}, +- {0x4108b, 0x2b00}, +- {0x4108c, 0x0}, +- {0x4108d, 0x0}, +- {0x4108e, 0x0}, +- {0x4108f, 0x0}, +- {0x41090, 0xca58}, +- {0x41091, 0x0}, +- {0x41092, 0x0}, +- {0x41093, 0x0}, +- {0x41094, 0xc108}, +- {0x41095, 0x0}, +- {0x41096, 0x0}, +- {0x41097, 0x0}, +- {0x41098, 0x0}, +- {0x41099, 0x0}, +- {0x4109a, 0x0}, +- {0x4109b, 0x2b00}, +- {0x4109c, 0x0}, +- {0x4109d, 0x0}, +- {0x4109e, 0x0}, +- {0x4109f, 0x0}, +- {0x410a0, 0xcb58}, +- {0x410a1, 0x0}, +- {0x410a2, 0x0}, +- {0x410a3, 0x0}, +- {0x410a4, 0xc008}, +- {0x410a5, 0x0}, +- {0x410a6, 0x0}, +- {0x410a7, 0x0}, +- {0x410a8, 0x0}, +- {0x410a9, 0x0}, +- {0x410aa, 0x0}, +- {0x410ab, 0x2b00}, +- {0x410ac, 0x0}, +- {0x410ad, 0x0}, +- {0x410ae, 0x0}, +- {0x410af, 0x0}, +- {0x410b0, 0xd4d8}, +- {0x410b1, 0x0}, +- {0x410b2, 0x0}, +- {0x410b3, 0x0}, +- {0x410b4, 0xc008}, +- {0x410b5, 0x0}, +- {0x410b6, 0x0}, +- {0x410b7, 0x0}, +- {0xc0001, 0x5061}, +- {0xc0002, 0x7098}, +- {0xc0003, 0x0}, +- {0xc0000, 0xbedc}, +- {0xc0006, 0xb0db}, +- {0xc0007, 0x0}, +- {0x9070c, 0x0}, +- {0x9070d, 0x7ff}, +- {0x9070e, 0x668}, +- {0x9070f, 0x7910}, +- {0x90710, 0x355e}, +- {0x90711, 0xcbb5}, +- {0x90713, 0xffff}, +- {0x90714, 0x710}, +- {0x90715, 0x7800}, +- {0x90c10, 0xffff}, +- {0x90c12, 0xff10}, +- {0x90712, 0x2ee8}, +- {0x90c11, 0xffff}, +- {0x90716, 0xffdf}, +- {0x90717, 0x6f10}, +- {0x90718, 0x6f10}, +- {0x90719, 0x2868}, +- {0x9071a, 0x2868}, +- {0x9071b, 0xfeef}, +- {0x90904, 0xe400}, +- {0x90986, 0xe400}, +- {0x90920, 0x0}, +- {0x90921, 0x0}, +- {0x90922, 0x0}, +- {0x90923, 0x0}, +- {0x90924, 0xff00}, +- {0x90925, 0xff00}, +- {0x90926, 0xff00}, +- {0x90927, 0xff00}, +- {0x90930, 0x4000}, +- {0x90931, 0x2000}, +- {0x90932, 0xff00}, +- {0x90933, 0xff00}, +- {0x9090a, 0x0}, +- {0x9090c, 0x0}, +- {0x9090d, 0x1}, +- {0x200f0, 0x27f7}, +- {0x200f1, 0x2108}, +- {0x200f2, 0x2108}, +- {0x100b9, 0x1}, +- {0x100b1, 0x180}, +- {0x100ba, 0x1}, +- {0x100a2, 0x0}, +- {0x100b5, 0x1}, +- {0x110b9, 0x1}, +- {0x110b1, 0x180}, +- {0x110ba, 0x1}, +- {0x110a2, 0x0}, +- {0x110b5, 0x1}, +- {0x120b9, 0x1}, +- {0x120b1, 0x180}, +- {0x120ba, 0x1}, +- {0x120a2, 0x0}, +- {0x120b5, 0x1}, +- {0x130b9, 0x1}, +- {0x130b1, 0x180}, +- {0x130ba, 0x1}, +- {0x130a2, 0x0}, +- {0x130b5, 0x1}, +- {0x70024, 0x5a3c}, +- {0x70025, 0x5a3c}, +- {0x70026, 0x5a3c}, +- {0x70027, 0x5a3c}, +- {0x70028, 0x5a3c}, +- {0x70029, 0x5a3c}, +- {0x7002a, 0x5a3c}, +- {0x7002b, 0x5a3c}, +- {0x70124, 0x5a3c}, +- {0x70125, 0x5a3c}, +- {0x70126, 0x5a3c}, +- {0x70127, 0x5a3c}, +- {0x70128, 0x5a3c}, +- {0x70129, 0x5a3c}, +- {0x7012a, 0x5a3c}, +- {0x7012b, 0x5a3c}, +- {0x70224, 0x5a3c}, +- {0x70225, 0x5a3c}, +- {0x70226, 0x5a3c}, +- {0x70227, 0x5a3c}, +- {0x70228, 0x5a3c}, +- {0x70229, 0x5a3c}, +- {0x7022a, 0x5a3c}, +- {0x7022b, 0x5a3c}, +- {0x70324, 0x5a3c}, +- {0x70325, 0x5a3c}, +- {0x70326, 0x5a3c}, +- {0x70327, 0x5a3c}, +- {0x70328, 0x5a3c}, +- {0x70329, 0x5a3c}, +- {0x7032a, 0x5a3c}, +- {0x7032b, 0x5a3c}, +- {0x70424, 0x5a3c}, +- {0x70425, 0x5a3c}, +- {0x70426, 0x5a3c}, +- {0x70427, 0x5a3c}, +- {0x70428, 0x5a3c}, +- {0x70429, 0x5a3c}, +- {0x7042a, 0x5a3c}, +- {0x7042b, 0x5a3c}, +- {0x70524, 0x5a3c}, +- {0x70525, 0x5a3c}, +- {0x70526, 0x5a3c}, +- {0x70527, 0x5a3c}, +- {0x70528, 0x5a3c}, +- {0x70529, 0x5a3c}, +- {0x7052a, 0x5a3c}, +- {0x7052b, 0x5a3c}, +- {0x70624, 0x5a3c}, +- {0x70625, 0x5a3c}, +- {0x70626, 0x5a3c}, +- {0x70627, 0x5a3c}, +- {0x70628, 0x5a3c}, +- {0x70629, 0x5a3c}, +- {0x7062a, 0x5a3c}, +- {0x7062b, 0x5a3c}, +- {0x70724, 0x5a3c}, +- {0x70725, 0x5a3c}, +- {0x70726, 0x5a3c}, +- {0x70727, 0x5a3c}, +- {0x70728, 0x5a3c}, +- {0x70729, 0x5a3c}, +- {0x7072a, 0x5a3c}, +- {0x7072b, 0x5a3c}, +- {0x70824, 0x5a3c}, +- {0x70825, 0x5a3c}, +- {0x70826, 0x5a3c}, +- {0x70827, 0x5a3c}, +- {0x70828, 0x5a3c}, +- {0x70829, 0x5a3c}, +- {0x7082a, 0x5a3c}, +- {0x7082b, 0x5a3c}, +- {0x70065, 0x1ff}, +- {0x2007e, 0x33}, +- {0x200ef, 0xffff}, +- {0x90910, 0x2}, +- {0x20310, 0x1}, +- {0x20311, 0x1}, +- {0xc0080, 0x2}, +- {0xd0003, 0x0}, +-}; +- +-static struct dram_fsp_msg ddr_dram_fsp_msg[] = { +- { +- /* P0 6400mbps */ +- .drate = 6400, +- .ssc = false, +- .fsp_phy_cfg = ddr_phy_fsp0_cfg, +- .fsp_phy_cfg_num = ARRAY_SIZE(ddr_phy_fsp0_cfg), +- .fw_type = FW_1D_IMAGE, +- .fsp_phy_msgh_cfg = ddr_phy_msgh_fsp0_cfg, +- .fsp_phy_msgh_cfg_num = ARRAY_SIZE(ddr_phy_msgh_fsp0_cfg), +- .fsp_phy_pie_cfg = ddr_phy_pie_fsp0_cfg, +- .fsp_phy_pie_cfg_num = ARRAY_SIZE(ddr_phy_pie_fsp0_cfg), +- }, +-}; +- +-/* dram fsp cfg */ +-static struct dram_fsp_cfg ddr_dram_fsp_cfg[] = { +- { +- .ddrc_cfg = ddr_dram_fsp0_ddrc_cfg, +- .ddrc_cfg_num = ARRAY_SIZE(ddr_dram_fsp0_ddrc_cfg), +- .bypass = 0, +- }, +-}; +- +-/* ddr timing config params */ +-struct dram_timing_info dram_timing = { +- .ddrc_cfg = ddr_ddrc_cfg, +- .ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg), +- .ddrphy_cfg = ddr_ddrphy_cfg, +- .ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg), +- .fsp_msg = ddr_dram_fsp_msg, +- .fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg), +- .ddrphy_trained_csr = ddr_ddrphy_trained_csr, +- .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr), +- .ddrphy_pie = ddr_phy_pie, +- .ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie), +- .fsp_table = { 6400, }, +- .fsp_cfg = ddr_dram_fsp_cfg, +- .fsp_cfg_num = ARRAY_SIZE(ddr_dram_fsp_cfg), +-}; +diff --git a/boards/ccimx95/ddr/Makefile b/boards/ccimx95/ddr/Makefile +index 646ed78e5aaf..8cceb6e345d5 100644 +--- a/boards/ccimx95/ddr/Makefile ++++ b/boards/ccimx95/ddr/Makefile +@@ -1,4 +1,4 @@ +-DDR_CONFIG ?= MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_timing ++DDR_CONFIG ?= lpddr5_timing_a1 + OBJS += $(OUT)/$(DDR_CONFIG).o + + VPATH += boards/ccimx95/ddr +diff --git a/boards/ccimx95/ddr/XIMX95LPD5EVK19_6400mbps_train_timing_a1.c b/boards/ccimx95/ddr/XIMX95LPD5EVK19_6400mbps_train_timing_a1.c +deleted file mode 100644 +index 9bbb3c8c8ad7..000000000000 +--- a/boards/ccimx95/ddr/XIMX95LPD5EVK19_6400mbps_train_timing_a1.c ++++ /dev/null +@@ -1,10754 +0,0 @@ +-/* +- * Copyright 2023-2024 NXP +- * +- * SPDX-License-Identifier: BSD-3-Clause +- * +- * Code generated with DDR Tool v3.5.0_7-ad54c9c4. +- * DDR PHY FW2024.09 +- */ +- +-#include "ddr.h" +- +-/* Initialize DDRC registers */ +-static struct ddrc_cfg_param ddr_ddrc_cfg[] = { +- {0x5e080110, 0x41084001U}, +- {0x5e080000, 0x3ffU}, +- {0x5e080008, 0x0U}, +- {0x5e080010, 0x4U}, +- {0x5e080014, 0x80000U}, +- {0x5e080020, 0x80000000U}, +- {0x5e080024, 0x80007ffU}, +- {0x5e080028, 0x80000000U}, +- {0x5e08002c, 0x7ffU}, +- {0x5e080080, 0x80000522U}, +- {0x5e080084, 0x80000522U}, +- {0x5e080114, 0x1000U}, +- {0x5e080260, 0x21U}, +- {0x5e080268, 0x0U}, +- {0x5e08026c, 0x1004U}, +- {0x5e080f00, 0x8U}, +- {0x5e080f04, 0x800U}, +- {0x5e080800, 0x43931002U}, +- {0x5e080804, 0x3f1f1f1fU}, +- {0x5e081000, 0x0U}, +- {0x5e081220, 0x0U}, +- {0x5e081224, 0x0U}, +- {0x5e081228, 0x0U}, +- {0x5e08122c, 0x0U}, +- {0x5e081230, 0x0U}, +- {0x5e081234, 0x0U}, +- {0x5e081238, 0x0U}, +- {0x5e08123c, 0x0U}, +- {0x5e081240, 0x0U}, +- {0x5e081244, 0x0U}, +- {0x5e081248, 0x0U}, +- {0x5e08124c, 0x0U}, +- {0x5e081250, 0x0U}, +- {0x5e081254, 0x0U}, +- {0x5e081258, 0x0U}, +- {0x5e08125c, 0x0U}, +-}; +- +-/* DRAM fsp configurations */ +-static struct ddrc_cfg_param ddr_dram_fsp0_ddrc_cfg[] = { +- {0x5e080100, 0x020D2100U}, +- {0x5e080104, 0x4866000CU}, +- {0x5e080108, 0xF2F28D47U}, +- {0x5e08010C, 0x20488010U}, +- {0x5e080124, 0x0C34030DU}, +- {0x5e080160, 0x00000101U}, +- {0x5e08016C, 0x01300000U}, +- {0x5e080170, 0x8C010509U}, +- {0x5e080250, 0x00110C11U}, +- {0x5e080254, 0x00680040U}, +- {0x5e080258, 0x03003E80U}, +- {0x5e08025C, 0x40520200U}, +- {0x5e080300, 0x08120809U}, +- {0x5e080304, 0x00680F03U}, +- {0x5e080308, 0x0604061AU}, +- {0x5e08030C, 0x0030001CU}, +- {0x5e080310, 0x20610000U}, +- {0x5e080314, 0x0A0A0407U}, +-}; +- +-/* PHY Initialize Configuration */ +-static struct ddrphy_cfg_param ddr_ddrphy_cfg[] = { +- {0x10080, 0x7}, +- {0x10081, 0x5}, +- {0x10082, 0x6}, +- {0x10083, 0x1}, +- {0x10084, 0x2}, +- {0x10085, 0x0}, +- {0x10086, 0x3}, +- {0x10087, 0x4}, +- {0x11080, 0x0}, +- {0x11081, 0x1}, +- {0x11082, 0x2}, +- {0x11083, 0x3}, +- {0x11084, 0x4}, +- {0x11085, 0x7}, +- {0x11086, 0x6}, +- {0x11087, 0x5}, +- {0x12080, 0x5}, +- {0x12081, 0x6}, +- {0x12082, 0x1}, +- {0x12083, 0x7}, +- {0x12084, 0x4}, +- {0x12085, 0x2}, +- {0x12086, 0x0}, +- {0x12087, 0x3}, +- {0x13080, 0x0}, +- {0x13081, 0x3}, +- {0x13082, 0x2}, +- {0x13083, 0x7}, +- {0x13084, 0x4}, +- {0x13085, 0x5}, +- {0x13086, 0x6}, +- {0x13087, 0x1}, +- {0x30090, 0x4}, +- {0x30091, 0x3}, +- {0x30092, 0x6}, +- {0x30093, 0x0}, +- {0x30094, 0x5}, +- {0x30095, 0x1}, +- {0x30096, 0x2}, +- {0x31090, 0x1}, +- {0x31091, 0x3}, +- {0x31092, 0x4}, +- {0x31093, 0x6}, +- {0x31094, 0x2}, +- {0x31095, 0x0}, +- {0x31096, 0x5}, +- {0x20060, 0x2}, +- {0x200a5, 0x1}, +- {0xd0036, 0x0}, +- {0x200bd, 0xff}, +- {0x20300, 0x808}, +- {0x20303, 0x9}, +- {0x20302, 0x26}, +- {0x20328, 0x0}, +- {0x20301, 0x3}, +- {0x2030b, 0x0}, +- {0x300a7, 0x0}, +- {0x310a7, 0x0}, +- {0x300ae, 0x80}, +- {0x300ad, 0x80}, +- {0x300ac, 0x80}, +- {0x310ae, 0x80}, +- {0x310ad, 0x80}, +- {0x310ac, 0x80}, +- {0xc0086, 0x0}, +- {0x100a3, 0x833}, +- {0x110a3, 0x833}, +- {0x120a3, 0x833}, +- {0x130a3, 0x833}, +- {0xc00f1, 0x6000}, +- {0xc00f2, 0xa9}, +- {0xc00f3, 0x8000}, +- {0xc00f4, 0x5}, +- {0xc00f5, 0x4000}, +- {0xc00f6, 0x2}, +- {0xc00f7, 0xf000}, +- {0xc00f9, 0x6000}, +- {0xc00fa, 0xa9}, +- {0xc00fb, 0x8000}, +- {0xc00fd, 0x4000}, +- {0xc00ff, 0xf000}, +- {0x908ff, 0xf}, +- {0x10093, 0x0}, +- {0x11093, 0x0}, +- {0x12093, 0x0}, +- {0x13093, 0x0}, +- {0x20051, 0x3}, +-}; +- +-/* PHY trained csr */ +-static struct ddrphy_cfg_param ddr_ddrphy_trained_csr[] = { +- {0x200a5, 0x0}, +- {0xd0036, 0x0}, +- {0x200bd, 0x0}, +- {0x20300, 0x0}, +- {0x20303, 0x0}, +- {0x20302, 0x0}, +- {0x20328, 0x0}, +- {0x20301, 0x0}, +- {0x2030b, 0x0}, +- {0x300a7, 0x0}, +- {0x310a7, 0x0}, +- {0x300ae, 0x0}, +- {0x300ad, 0x0}, +- {0x300ac, 0x0}, +- {0x310ae, 0x0}, +- {0x310ad, 0x0}, +- {0x310ac, 0x0}, +- {0xc0086, 0x0}, +- {0x100a3, 0x0}, +- {0x110a3, 0x0}, +- {0x120a3, 0x0}, +- {0x130a3, 0x0}, +- {0xc00f1, 0x0}, +- {0xc00f2, 0x0}, +- {0xc00f3, 0x0}, +- {0xc00f4, 0x0}, +- {0xc00f5, 0x0}, +- {0xc00f6, 0x0}, +- {0xc00f7, 0x0}, +- {0xc00f9, 0x0}, +- {0xc00fa, 0x0}, +- {0xc00fb, 0x0}, +- {0xc00fd, 0x0}, +- {0xc00ff, 0x0}, +- {0x908ff, 0x0}, +- {0x10093, 0x0}, +- {0x11093, 0x0}, +- {0x12093, 0x0}, +- {0x13093, 0x0}, +- {0x20051, 0x0}, +- {0x90802, 0x0}, +- {0x20002, 0x0}, +- {0x20000, 0x0}, +- {0x90801, 0x0}, +- {0x90809, 0x0}, +- {0x1005e, 0x0}, +- {0x10060, 0x0}, +- {0x10062, 0x0}, +- {0x10064, 0x0}, +- {0x1005f, 0x0}, +- {0x10061, 0x0}, +- {0x10063, 0x0}, +- {0x10065, 0x0}, +- {0x1105e, 0x0}, +- {0x11060, 0x0}, +- {0x11062, 0x0}, +- {0x11064, 0x0}, +- {0x1105f, 0x0}, +- {0x11061, 0x0}, +- {0x11063, 0x0}, +- {0x11065, 0x0}, +- {0x1205e, 0x0}, +- {0x12060, 0x0}, +- {0x12062, 0x0}, +- {0x12064, 0x0}, +- {0x1205f, 0x0}, +- {0x12061, 0x0}, +- {0x12063, 0x0}, +- {0x12065, 0x0}, +- {0x1305e, 0x0}, +- {0x13060, 0x0}, +- {0x13062, 0x0}, +- {0x13064, 0x0}, +- {0x1305f, 0x0}, +- {0x13061, 0x0}, +- {0x13063, 0x0}, +- {0x13065, 0x0}, +- {0x10005, 0x0}, +- {0x1000b, 0x0}, +- {0x11005, 0x0}, +- {0x1100b, 0x0}, +- {0x12005, 0x0}, +- {0x1200b, 0x0}, +- {0x13005, 0x0}, +- {0x1300b, 0x0}, +- {0x20007, 0x0}, +- {0x20013, 0x0}, +- {0x30038, 0x0}, +- {0x30039, 0x0}, +- {0x3003a, 0x0}, +- {0x31038, 0x0}, +- {0x31039, 0x0}, +- {0x3103a, 0x0}, +- {0x10038, 0x0}, +- {0x1003a, 0x0}, +- {0x11038, 0x0}, +- {0x1103a, 0x0}, +- {0x12038, 0x0}, +- {0x1203a, 0x0}, +- {0x13038, 0x0}, +- {0x1303a, 0x0}, +- {0x1003b, 0x0}, +- {0x1103b, 0x0}, +- {0x1203b, 0x0}, +- {0x1303b, 0x0}, +- {0x10009, 0x0}, +- {0x10037, 0x0}, +- {0x11009, 0x0}, +- {0x11037, 0x0}, +- {0x12009, 0x0}, +- {0x12037, 0x0}, +- {0x13009, 0x0}, +- {0x13037, 0x0}, +- {0x10004, 0x0}, +- {0x10003, 0x0}, +- {0x11004, 0x0}, +- {0x11003, 0x0}, +- {0x12004, 0x0}, +- {0x12003, 0x0}, +- {0x13004, 0x0}, +- {0x13003, 0x0}, +- {0x20004, 0x0}, +- {0x30050, 0x0}, +- {0x30051, 0x0}, +- {0x30052, 0x0}, +- {0x30053, 0x0}, +- {0x31050, 0x0}, +- {0x31051, 0x0}, +- {0x31052, 0x0}, +- {0x31053, 0x0}, +- {0x1004e, 0x0}, +- {0x1004f, 0x0}, +- {0x10050, 0x0}, +- {0x10051, 0x0}, +- {0x1014e, 0x0}, +- {0x1014f, 0x0}, +- {0x10150, 0x0}, +- {0x10151, 0x0}, +- {0x1024e, 0x0}, +- {0x1024f, 0x0}, +- {0x10250, 0x0}, +- {0x10251, 0x0}, +- {0x1034e, 0x0}, +- {0x1034f, 0x0}, +- {0x10350, 0x0}, +- {0x10351, 0x0}, +- {0x1044e, 0x0}, +- {0x1044f, 0x0}, +- {0x10450, 0x0}, +- {0x10451, 0x0}, +- {0x1054e, 0x0}, +- {0x1054f, 0x0}, +- {0x10550, 0x0}, +- {0x10551, 0x0}, +- {0x1064e, 0x0}, +- {0x1064f, 0x0}, +- {0x10650, 0x0}, +- {0x10651, 0x0}, +- {0x1074e, 0x0}, +- {0x1074f, 0x0}, +- {0x10750, 0x0}, +- {0x10751, 0x0}, +- {0x1084e, 0x0}, +- {0x1084f, 0x0}, +- {0x10850, 0x0}, +- {0x10851, 0x0}, +- {0x1104e, 0x0}, +- {0x1104f, 0x0}, +- {0x11050, 0x0}, +- {0x11051, 0x0}, +- {0x1114e, 0x0}, +- {0x1114f, 0x0}, +- {0x11150, 0x0}, +- {0x11151, 0x0}, +- {0x1124e, 0x0}, +- {0x1124f, 0x0}, +- {0x11250, 0x0}, +- {0x11251, 0x0}, +- {0x1134e, 0x0}, +- {0x1134f, 0x0}, +- {0x11350, 0x0}, +- {0x11351, 0x0}, +- {0x1144e, 0x0}, +- {0x1144f, 0x0}, +- {0x11450, 0x0}, +- {0x11451, 0x0}, +- {0x1154e, 0x0}, +- {0x1154f, 0x0}, +- {0x11550, 0x0}, +- {0x11551, 0x0}, +- {0x1164e, 0x0}, +- {0x1164f, 0x0}, +- {0x11650, 0x0}, +- {0x11651, 0x0}, +- {0x1174e, 0x0}, +- {0x1174f, 0x0}, +- {0x11750, 0x0}, +- {0x11751, 0x0}, +- {0x1184e, 0x0}, +- {0x1184f, 0x0}, +- {0x11850, 0x0}, +- {0x11851, 0x0}, +- {0x1204e, 0x0}, +- {0x1204f, 0x0}, +- {0x12050, 0x0}, +- {0x12051, 0x0}, +- {0x1214e, 0x0}, +- {0x1214f, 0x0}, +- {0x12150, 0x0}, +- {0x12151, 0x0}, +- {0x1224e, 0x0}, +- {0x1224f, 0x0}, +- {0x12250, 0x0}, +- {0x12251, 0x0}, +- {0x1234e, 0x0}, +- {0x1234f, 0x0}, +- {0x12350, 0x0}, +- {0x12351, 0x0}, +- {0x1244e, 0x0}, +- {0x1244f, 0x0}, +- {0x12450, 0x0}, +- {0x12451, 0x0}, +- {0x1254e, 0x0}, +- {0x1254f, 0x0}, +- {0x12550, 0x0}, +- {0x12551, 0x0}, +- {0x1264e, 0x0}, +- {0x1264f, 0x0}, +- {0x12650, 0x0}, +- {0x12651, 0x0}, +- {0x1274e, 0x0}, +- {0x1274f, 0x0}, +- {0x12750, 0x0}, +- {0x12751, 0x0}, +- {0x1284e, 0x0}, +- {0x1284f, 0x0}, +- {0x12850, 0x0}, +- {0x12851, 0x0}, +- {0x1304e, 0x0}, +- {0x1304f, 0x0}, +- {0x13050, 0x0}, +- {0x13051, 0x0}, +- {0x1314e, 0x0}, +- {0x1314f, 0x0}, +- {0x13150, 0x0}, +- {0x13151, 0x0}, +- {0x1324e, 0x0}, +- {0x1324f, 0x0}, +- {0x13250, 0x0}, +- {0x13251, 0x0}, +- {0x1334e, 0x0}, +- {0x1334f, 0x0}, +- {0x13350, 0x0}, +- {0x13351, 0x0}, +- {0x1344e, 0x0}, +- {0x1344f, 0x0}, +- {0x13450, 0x0}, +- {0x13451, 0x0}, +- {0x1354e, 0x0}, +- {0x1354f, 0x0}, +- {0x13550, 0x0}, +- {0x13551, 0x0}, +- {0x1364e, 0x0}, +- {0x1364f, 0x0}, +- {0x13650, 0x0}, +- {0x13651, 0x0}, +- {0x1374e, 0x0}, +- {0x1374f, 0x0}, +- {0x13750, 0x0}, +- {0x13751, 0x0}, +- {0x1384e, 0x0}, +- {0x1384f, 0x0}, +- {0x13850, 0x0}, +- {0x13851, 0x0}, +- {0x30030, 0x0}, +- {0x30031, 0x0}, +- {0x30035, 0x0}, +- {0x31030, 0x0}, +- {0x31031, 0x0}, +- {0x31035, 0x0}, +- {0x10030, 0x0}, +- {0x10035, 0x0}, +- {0x10036, 0x0}, +- {0x11030, 0x0}, +- {0x11035, 0x0}, +- {0x11036, 0x0}, +- {0x12030, 0x0}, +- {0x12035, 0x0}, +- {0x12036, 0x0}, +- {0x13030, 0x0}, +- {0x13035, 0x0}, +- {0x13036, 0x0}, +- {0x3003c, 0x0}, +- {0x3103c, 0x0}, +- {0x1003c, 0x0}, +- {0x1003d, 0x0}, +- {0x1003e, 0x0}, +- {0x1103c, 0x0}, +- {0x1103d, 0x0}, +- {0x1103e, 0x0}, +- {0x1203c, 0x0}, +- {0x1203d, 0x0}, +- {0x1203e, 0x0}, +- {0x1303c, 0x0}, +- {0x1303d, 0x0}, +- {0x1303e, 0x0}, +- {0x20003, 0x0}, +- {0x10006, 0x0}, +- {0x11006, 0x0}, +- {0x12006, 0x0}, +- {0x13006, 0x0}, +- {0x20001, 0x0}, +- {0x20009, 0x0}, +- {0x20008, 0x0}, +- {0x200d9, 0x0}, +- {0x30eef, 0x0}, +- {0x31eef, 0x0}, +- {0x20014, 0x0}, +- {0x9080a, 0x0}, +- {0x10040, 0x0}, +- {0x10042, 0x0}, +- {0x9080d, 0x0}, +- {0x10043, 0x0}, +- {0x10044, 0x0}, +- {0x10045, 0x0}, +- {0x11040, 0x0}, +- {0x11042, 0x0}, +- {0x11043, 0x0}, +- {0x11044, 0x0}, +- {0x11045, 0x0}, +- {0x12040, 0x0}, +- {0x12042, 0x0}, +- {0x12043, 0x0}, +- {0x12044, 0x0}, +- {0x12045, 0x0}, +- {0x13040, 0x0}, +- {0x13042, 0x0}, +- {0x13043, 0x0}, +- {0x13044, 0x0}, +- {0x13045, 0x0}, +- {0x30040, 0x0}, +- {0x30041, 0x0}, +- {0x30042, 0x0}, +- {0x30043, 0x0}, +- {0x30330, 0x0}, +- {0x31040, 0x0}, +- {0x31041, 0x0}, +- {0x31042, 0x0}, +- {0x31043, 0x0}, +- {0x31330, 0x0}, +- {0x20331, 0x0}, +- {0x10048, 0x0}, +- {0x1004a, 0x0}, +- {0x1004b, 0x0}, +- {0x1004c, 0x0}, +- {0x1004d, 0x0}, +- {0x11048, 0x0}, +- {0x1104a, 0x0}, +- {0x1104b, 0x0}, +- {0x1104c, 0x0}, +- {0x1104d, 0x0}, +- {0x12048, 0x0}, +- {0x1204a, 0x0}, +- {0x1204b, 0x0}, +- {0x1204c, 0x0}, +- {0x1204d, 0x0}, +- {0x13048, 0x0}, +- {0x1304a, 0x0}, +- {0x1304b, 0x0}, +- {0x1304c, 0x0}, +- {0x1304d, 0x0}, +- {0x30048, 0x0}, +- {0x30049, 0x0}, +- {0x3004a, 0x0}, +- {0x3004b, 0x0}, +- {0x31048, 0x0}, +- {0x31049, 0x0}, +- {0x3104a, 0x0}, +- {0x3104b, 0x0}, +- {0x30033, 0x0}, +- {0x30034, 0x0}, +- {0x3002e, 0x0}, +- {0x31033, 0x0}, +- {0x31034, 0x0}, +- {0x3102e, 0x0}, +- {0x10033, 0x0}, +- {0x1002e, 0x0}, +- {0x1002f, 0x0}, +- {0x11033, 0x0}, +- {0x1102e, 0x0}, +- {0x1102f, 0x0}, +- {0x12033, 0x0}, +- {0x1202e, 0x0}, +- {0x1202f, 0x0}, +- {0x13033, 0x0}, +- {0x1302e, 0x0}, +- {0x1302f, 0x0}, +- {0x90806, 0x0}, +- {0x100e8, 0x0}, +- {0x100e9, 0x0}, +- {0x110e8, 0x0}, +- {0x110e9, 0x0}, +- {0x120e8, 0x0}, +- {0x120e9, 0x0}, +- {0x130e8, 0x0}, +- {0x130e9, 0x0}, +- {0x10001, 0x0}, +- {0x11001, 0x0}, +- {0x12001, 0x0}, +- {0x13001, 0x0}, +- {0x20012, 0x0}, +- {0x20017, 0x0}, +- {0x2000a, 0x0}, +- {0x20186, 0x0}, +- {0x20187, 0x0}, +- {0x20010, 0x0}, +- {0x20011, 0x0}, +- {0x9080b, 0x0}, +- {0x9080c, 0x0}, +- {0x100a5, 0x0}, +- {0x110a5, 0x0}, +- {0x120a5, 0x0}, +- {0x130a5, 0x0}, +- {0x10014, 0x0}, +- {0x11014, 0x0}, +- {0x12014, 0x0}, +- {0x13014, 0x0}, +- {0x20035, 0x0}, +- {0x20036, 0x0}, +- {0x20037, 0x0}, +- {0x20038, 0x0}, +- {0x20039, 0x0}, +- {0x2003a, 0x0}, +- {0x2003b, 0x0}, +- {0x2003c, 0x0}, +- {0x2003d, 0x0}, +- {0x2003e, 0x0}, +- {0x2003f, 0x0}, +- {0x20040, 0x0}, +- {0x2002c, 0x0}, +- {0x2002d, 0x0}, +- {0x20030, 0x0}, +- {0x2002e, 0x0}, +- {0x2002f, 0x0}, +- {0x2000c, 0x0}, +- {0x2001b, 0x0}, +- {0x10007, 0x0}, +- {0x11007, 0x0}, +- {0x12007, 0x0}, +- {0x13007, 0x0}, +- {0x908f0, 0x0}, +- {0x908f1, 0x0}, +- {0x908f2, 0x0}, +- {0x908f3, 0x0}, +- {0x908f4, 0x0}, +- {0x908f5, 0x0}, +- {0x908f6, 0x0}, +- {0x908f7, 0x0}, +- {0x41008, 0x0}, +- {0x41009, 0x0}, +- {0x4100a, 0x0}, +- {0x4100b, 0x0}, +- {0x4100c, 0x0}, +- {0x4100d, 0x0}, +- {0x4100e, 0x0}, +- {0x4100f, 0x0}, +- {0x41010, 0x0}, +- {0x41011, 0x0}, +- {0x41012, 0x0}, +- {0x41013, 0x0}, +- {0x41014, 0x0}, +- {0x41015, 0x0}, +- {0x41016, 0x0}, +- {0x41017, 0x0}, +- {0x41018, 0x0}, +- {0x41019, 0x0}, +- {0x4101a, 0x0}, +- {0x4101b, 0x0}, +- {0x4101c, 0x0}, +- {0x4101d, 0x0}, +- {0x4101e, 0x0}, +- {0x4101f, 0x0}, +- {0x41020, 0x0}, +- {0x41021, 0x0}, +- {0x41022, 0x0}, +- {0x41023, 0x0}, +- {0x41024, 0x0}, +- {0x41025, 0x0}, +- {0x41026, 0x0}, +- {0x41027, 0x0}, +- {0x41028, 0x0}, +- {0x41029, 0x0}, +- {0x4102a, 0x0}, +- {0x4102b, 0x0}, +- {0x4102c, 0x0}, +- {0x4102d, 0x0}, +- {0x4102e, 0x0}, +- {0x4102f, 0x0}, +- {0x41030, 0x0}, +- {0x41031, 0x0}, +- {0x41032, 0x0}, +- {0x41033, 0x0}, +- {0x41034, 0x0}, +- {0x41035, 0x0}, +- {0x41036, 0x0}, +- {0x41037, 0x0}, +- {0x41038, 0x0}, +- {0x41039, 0x0}, +- {0x4103a, 0x0}, +- {0x4103b, 0x0}, +- {0x4103c, 0x0}, +- {0x4103d, 0x0}, +- {0x4103e, 0x0}, +- {0x4103f, 0x0}, +- {0x41040, 0x0}, +- {0x41041, 0x0}, +- {0x41042, 0x0}, +- {0x41043, 0x0}, +- {0x41044, 0x0}, +- {0x41045, 0x0}, +- {0x41046, 0x0}, +- {0x41047, 0x0}, +- {0x41048, 0x0}, +- {0x41049, 0x0}, +- {0x4104a, 0x0}, +- {0x4104b, 0x0}, +- {0x4104c, 0x0}, +- {0x4104d, 0x0}, +- {0x4104e, 0x0}, +- {0x4104f, 0x0}, +- {0x41050, 0x0}, +- {0x41051, 0x0}, +- {0x41052, 0x0}, +- {0x41053, 0x0}, +- {0x41054, 0x0}, +- {0x41055, 0x0}, +- {0x41056, 0x0}, +- {0x41057, 0x0}, +- {0x41058, 0x0}, +- {0x41059, 0x0}, +- {0x4105a, 0x0}, +- {0x4105b, 0x0}, +- {0x4105c, 0x0}, +- {0x4105d, 0x0}, +- {0x4105e, 0x0}, +- {0x4105f, 0x0}, +- {0x41060, 0x0}, +- {0x41061, 0x0}, +- {0x41062, 0x0}, +- {0x41063, 0x0}, +- {0x41064, 0x0}, +- {0x41065, 0x0}, +- {0x41066, 0x0}, +- {0x41067, 0x0}, +- {0x41068, 0x0}, +- {0x41069, 0x0}, +- {0x4106a, 0x0}, +- {0x4106b, 0x0}, +- {0x4106c, 0x0}, +- {0x4106d, 0x0}, +- {0x4106e, 0x0}, +- {0x4106f, 0x0}, +- {0x41070, 0x0}, +- {0x41071, 0x0}, +- {0x41072, 0x0}, +- {0x41073, 0x0}, +- {0x41074, 0x0}, +- {0x41075, 0x0}, +- {0x41076, 0x0}, +- {0x41077, 0x0}, +- {0x41078, 0x0}, +- {0x41079, 0x0}, +- {0x4107a, 0x0}, +- {0x4107b, 0x0}, +- {0x4107c, 0x0}, +- {0x4107d, 0x0}, +- {0x4107e, 0x0}, +- {0x4107f, 0x0}, +- {0x41080, 0x0}, +- {0x41081, 0x0}, +- {0x41082, 0x0}, +- {0x41083, 0x0}, +- {0x41084, 0x0}, +- {0x41085, 0x0}, +- {0x41086, 0x0}, +- {0x41087, 0x0}, +- {0x41088, 0x0}, +- {0x41089, 0x0}, +- {0x4108a, 0x0}, +- {0x4108b, 0x0}, +- {0x4108c, 0x0}, +- {0x4108d, 0x0}, +- {0x4108e, 0x0}, +- {0x4108f, 0x0}, +- {0x41090, 0x0}, +- {0x41091, 0x0}, +- {0x41092, 0x0}, +- {0x41093, 0x0}, +- {0x41094, 0x0}, +- {0x41095, 0x0}, +- {0x41096, 0x0}, +- {0x41097, 0x0}, +- {0x41098, 0x0}, +- {0x41099, 0x0}, +- {0x4109a, 0x0}, +- {0x4109b, 0x0}, +- {0x4109c, 0x0}, +- {0x4109d, 0x0}, +- {0x4109e, 0x0}, +- {0x4109f, 0x0}, +- {0x410a0, 0x0}, +- {0x410a1, 0x0}, +- {0x410a2, 0x0}, +- {0x410a3, 0x0}, +- {0x410a4, 0x0}, +- {0x410a5, 0x0}, +- {0x410a6, 0x0}, +- {0x410a7, 0x0}, +- {0x410a8, 0x0}, +- {0x410a9, 0x0}, +- {0x410aa, 0x0}, +- {0x410ab, 0x0}, +- {0x410ac, 0x0}, +- {0x410ad, 0x0}, +- {0x410ae, 0x0}, +- {0x410af, 0x0}, +- {0x410b0, 0x0}, +- {0x410b1, 0x0}, +- {0x410b2, 0x0}, +- {0x410b3, 0x0}, +- {0x410b4, 0x0}, +- {0x410b5, 0x0}, +- {0x410b6, 0x0}, +- {0x410b7, 0x0}, +- {0x410b8, 0x0}, +- {0x410b9, 0x0}, +- {0x410ba, 0x0}, +- {0x410bb, 0x0}, +- {0x410bc, 0x0}, +- {0x410bd, 0x0}, +- {0x410be, 0x0}, +- {0x410bf, 0x0}, +- {0x410c0, 0x0}, +- {0x410c1, 0x0}, +- {0x410c2, 0x0}, +- {0x410c3, 0x0}, +- {0x410c4, 0x0}, +- {0x410c5, 0x0}, +- {0x410c6, 0x0}, +- {0x410c7, 0x0}, +- {0x410c8, 0x0}, +- {0x410c9, 0x0}, +- {0x410ca, 0x0}, +- {0x410cb, 0x0}, +- {0x410cc, 0x0}, +- {0x410cd, 0x0}, +- {0x410ce, 0x0}, +- {0x410cf, 0x0}, +- {0x410d0, 0x0}, +- {0x410d1, 0x0}, +- {0x410d2, 0x0}, +- {0x410d3, 0x0}, +- {0x410d4, 0x0}, +- {0x410d5, 0x0}, +- {0x410d6, 0x0}, +- {0x410d7, 0x0}, +- {0x410d8, 0x0}, +- {0x410d9, 0x0}, +- {0x410da, 0x0}, +- {0x410db, 0x0}, +- {0x410dc, 0x0}, +- {0x410dd, 0x0}, +- {0x410de, 0x0}, +- {0x410df, 0x0}, +- {0x410e0, 0x0}, +- {0x410e1, 0x0}, +- {0x410e2, 0x0}, +- {0x410e3, 0x0}, +- {0x410e4, 0x0}, +- {0x410e5, 0x0}, +- {0x410e6, 0x0}, +- {0x410e7, 0x0}, +- {0x410e8, 0x0}, +- {0x410e9, 0x0}, +- {0x410ea, 0x0}, +- {0x410eb, 0x0}, +- {0x410ec, 0x0}, +- {0x410ed, 0x0}, +- {0x410ee, 0x0}, +- {0x410ef, 0x0}, +- {0x410f0, 0x0}, +- {0x410f1, 0x0}, +- {0x410f2, 0x0}, +- {0x410f3, 0x0}, +- {0x410f4, 0x0}, +- {0x410f5, 0x0}, +- {0x410f6, 0x0}, +- {0x410f7, 0x0}, +- {0x410f8, 0x0}, +- {0x410f9, 0x0}, +- {0x410fa, 0x0}, +- {0x410fb, 0x0}, +- {0x410fc, 0x0}, +- {0x410fd, 0x0}, +- {0x410fe, 0x0}, +- {0x410ff, 0x0}, +- {0x41100, 0x0}, +- {0x41101, 0x0}, +- {0x41102, 0x0}, +- {0x41103, 0x0}, +- {0x41104, 0x0}, +- {0x41105, 0x0}, +- {0x41106, 0x0}, +- {0x41107, 0x0}, +- {0x41108, 0x0}, +- {0x41109, 0x0}, +- {0x4110a, 0x0}, +- {0x4110b, 0x0}, +- {0x4110c, 0x0}, +- {0x4110d, 0x0}, +- {0x4110e, 0x0}, +- {0x4110f, 0x0}, +- {0x41110, 0x0}, +- {0x41111, 0x0}, +- {0x41112, 0x0}, +- {0x41113, 0x0}, +- {0x41114, 0x0}, +- {0x41115, 0x0}, +- {0x41116, 0x0}, +- {0x41117, 0x0}, +- {0x41118, 0x0}, +- {0x41119, 0x0}, +- {0x4111a, 0x0}, +- {0x4111b, 0x0}, +- {0x4111c, 0x0}, +- {0x4111d, 0x0}, +- {0x4111e, 0x0}, +- {0x4111f, 0x0}, +- {0x41120, 0x0}, +- {0x41121, 0x0}, +- {0x41122, 0x0}, +- {0x41123, 0x0}, +- {0x41124, 0x0}, +- {0x41125, 0x0}, +- {0x41126, 0x0}, +- {0x41127, 0x0}, +- {0x41128, 0x0}, +- {0x41129, 0x0}, +- {0x4112a, 0x0}, +- {0x4112b, 0x0}, +- {0x4112c, 0x0}, +- {0x4112d, 0x0}, +- {0x4112e, 0x0}, +- {0x4112f, 0x0}, +- {0x41130, 0x0}, +- {0x41131, 0x0}, +- {0x41132, 0x0}, +- {0x41133, 0x0}, +- {0x41134, 0x0}, +- {0x41135, 0x0}, +- {0x41136, 0x0}, +- {0x41137, 0x0}, +- {0x41138, 0x0}, +- {0x41139, 0x0}, +- {0x4113a, 0x0}, +- {0x4113b, 0x0}, +- {0x4113c, 0x0}, +- {0x4113d, 0x0}, +- {0x4113e, 0x0}, +- {0x4113f, 0x0}, +- {0x41140, 0x0}, +- {0x41141, 0x0}, +- {0x41142, 0x0}, +- {0x41143, 0x0}, +- {0x41144, 0x0}, +- {0x41145, 0x0}, +- {0x41146, 0x0}, +- {0x41147, 0x0}, +- {0x41148, 0x0}, +- {0x41149, 0x0}, +- {0x4114a, 0x0}, +- {0x4114b, 0x0}, +- {0x4114c, 0x0}, +- {0x4114d, 0x0}, +- {0x4114e, 0x0}, +- {0x4114f, 0x0}, +- {0x41150, 0x0}, +- {0x41151, 0x0}, +- {0x41152, 0x0}, +- {0x41153, 0x0}, +- {0x41154, 0x0}, +- {0x41155, 0x0}, +- {0x41156, 0x0}, +- {0x41157, 0x0}, +- {0x41158, 0x0}, +- {0x41159, 0x0}, +- {0x4115a, 0x0}, +- {0x4115b, 0x0}, +- {0x4115c, 0x0}, +- {0x4115d, 0x0}, +- {0x4115e, 0x0}, +- {0x4115f, 0x0}, +- {0x41160, 0x0}, +- {0x41161, 0x0}, +- {0x41162, 0x0}, +- {0x41163, 0x0}, +- {0x41164, 0x0}, +- {0x41165, 0x0}, +- {0x41166, 0x0}, +- {0x41167, 0x0}, +- {0x41168, 0x0}, +- {0x41169, 0x0}, +- {0x4116a, 0x0}, +- {0x4116b, 0x0}, +- {0x4116c, 0x0}, +- {0x4116d, 0x0}, +- {0x4116e, 0x0}, +- {0x4116f, 0x0}, +- {0x41170, 0x0}, +- {0x41171, 0x0}, +- {0x41172, 0x0}, +- {0x41173, 0x0}, +- {0x41174, 0x0}, +- {0x41175, 0x0}, +- {0x41176, 0x0}, +- {0x41177, 0x0}, +- {0x41178, 0x0}, +- {0x41179, 0x0}, +- {0x4117a, 0x0}, +- {0x4117b, 0x0}, +- {0x4117c, 0x0}, +- {0x4117d, 0x0}, +- {0x4117e, 0x0}, +- {0x4117f, 0x0}, +- {0x41180, 0x0}, +- {0x41181, 0x0}, +- {0x41182, 0x0}, +- {0x41183, 0x0}, +- {0x41184, 0x0}, +- {0x41185, 0x0}, +- {0x41186, 0x0}, +- {0x41187, 0x0}, +- {0x41188, 0x0}, +- {0x41189, 0x0}, +- {0x4118a, 0x0}, +- {0x4118b, 0x0}, +- {0x4118c, 0x0}, +- {0x4118d, 0x0}, +- {0x4118e, 0x0}, +- {0x4118f, 0x0}, +- {0x41190, 0x0}, +- {0x41191, 0x0}, +- {0x41192, 0x0}, +- {0x41193, 0x0}, +- {0x41194, 0x0}, +- {0x41195, 0x0}, +- {0x41196, 0x0}, +- {0x41197, 0x0}, +- {0x41198, 0x0}, +- {0x41199, 0x0}, +- {0x4119a, 0x0}, +- {0x4119b, 0x0}, +- {0x4119c, 0x0}, +- {0x4119d, 0x0}, +- {0x4119e, 0x0}, +- {0x4119f, 0x0}, +- {0x411a0, 0x0}, +- {0x411a1, 0x0}, +- {0x411a2, 0x0}, +- {0x411a3, 0x0}, +- {0x411a4, 0x0}, +- {0x411a5, 0x0}, +- {0x411a6, 0x0}, +- {0x411a7, 0x0}, +- {0x411a8, 0x0}, +- {0x411a9, 0x0}, +- {0x411aa, 0x0}, +- {0x411ab, 0x0}, +- {0x411ac, 0x0}, +- {0x411ad, 0x0}, +- {0x411ae, 0x0}, +- {0x411af, 0x0}, +- {0x411b0, 0x0}, +- {0x411b1, 0x0}, +- {0x411b2, 0x0}, +- {0x411b3, 0x0}, +- {0x411b4, 0x0}, +- {0x411b5, 0x0}, +- {0x411b6, 0x0}, +- {0x411b7, 0x0}, +- {0x411b8, 0x0}, +- {0x411b9, 0x0}, +- {0x411ba, 0x0}, +- {0x411bb, 0x0}, +- {0x411bc, 0x0}, +- {0x411bd, 0x0}, +- {0x411be, 0x0}, +- {0x411bf, 0x0}, +- {0x411c0, 0x0}, +- {0x411c1, 0x0}, +- {0x411c2, 0x0}, +- {0x411c3, 0x0}, +- {0x411c4, 0x0}, +- {0x411c5, 0x0}, +- {0x411c6, 0x0}, +- {0x411c7, 0x0}, +- {0x20015, 0x0}, +- {0x2004a, 0x0}, +- {0x2004b, 0x0}, +- {0x2004c, 0x0}, +- {0x2004d, 0x0}, +- {0x20088, 0x0}, +- {0x20089, 0x0}, +- {0x2008a, 0x0}, +- {0x2008c, 0x0}, +- {0x20041, 0x0}, +- {0x20045, 0x0}, +- {0x10057, 0x0}, +- {0x11057, 0x0}, +- {0x12057, 0x0}, +- {0x13057, 0x0}, +- {0x1000f, 0x0}, +- {0x1100f, 0x0}, +- {0x1200f, 0x0}, +- {0x1300f, 0x0}, +- {0x90803, 0x0}, +- {0x90804, 0x0}, +- {0x90805, 0x0}, +- {0x90903, 0x0}, +- {0x9090b, 0x0}, +- {0x90811, 0x0}, +- {0x90812, 0x0}, +- {0x20072, 0x0}, +- {0x9080e, 0x0}, +- {0x20073, 0x0}, +- {0x9080f, 0x0}, +- {0x41000, 0x0}, +- {0x41001, 0x0}, +- {0x41002, 0x0}, +- {0x41003, 0x0}, +- {0x41004, 0x0}, +- {0x41005, 0x0}, +- {0x41006, 0x0}, +- {0x41007, 0x0}, +- {0x41388, 0x0}, +- {0x41389, 0x0}, +- {0x4138a, 0x0}, +- {0x4138b, 0x0}, +- {0x4138c, 0x0}, +- {0x4138d, 0x0}, +- {0x4138e, 0x0}, +- {0x4138f, 0x0}, +- {0x41390, 0x0}, +- {0x41391, 0x0}, +- {0x41392, 0x0}, +- {0x41393, 0x0}, +- {0x41394, 0x0}, +- {0x41395, 0x0}, +- {0x41396, 0x0}, +- {0x41397, 0x0}, +- {0x41398, 0x0}, +- {0x41399, 0x0}, +- {0x4139a, 0x0}, +- {0x4139b, 0x0}, +- {0x4139c, 0x0}, +- {0x4139d, 0x0}, +- {0x4139e, 0x0}, +- {0x4139f, 0x0}, +- {0x413a0, 0x0}, +- {0x413a1, 0x0}, +- {0x413a2, 0x0}, +- {0x413a3, 0x0}, +- {0x413a4, 0x0}, +- {0x413a5, 0x0}, +- {0x413a6, 0x0}, +- {0x413a7, 0x0}, +- {0x413a8, 0x0}, +- {0x413a9, 0x0}, +- {0x413aa, 0x0}, +- {0x413ab, 0x0}, +- {0x413ac, 0x0}, +- {0x413ad, 0x0}, +- {0x413ae, 0x0}, +- {0x413af, 0x0}, +- {0x413b0, 0x0}, +- {0x413b1, 0x0}, +- {0x413b2, 0x0}, +- {0x413b3, 0x0}, +- {0x413b4, 0x0}, +- {0x413b5, 0x0}, +- {0x413b6, 0x0}, +- {0x413b7, 0x0}, +- {0x413b8, 0x0}, +- {0x413b9, 0x0}, +- {0x413ba, 0x0}, +- {0x413bb, 0x0}, +- {0x413bc, 0x0}, +- {0x413bd, 0x0}, +- {0x413be, 0x0}, +- {0x413bf, 0x0}, +- {0x413c0, 0x0}, +- {0x413c1, 0x0}, +- {0x413c2, 0x0}, +- {0x413c3, 0x0}, +- {0x413c4, 0x0}, +- {0x413c5, 0x0}, +- {0x413c6, 0x0}, +- {0x413c7, 0x0}, +- {0x413c8, 0x0}, +- {0x413c9, 0x0}, +- {0x413ca, 0x0}, +- {0x413cb, 0x0}, +- {0x413cc, 0x0}, +- {0x413cd, 0x0}, +- {0x413ce, 0x0}, +- {0x413cf, 0x0}, +- {0x413d0, 0x0}, +- {0x413d1, 0x0}, +- {0x413d2, 0x0}, +- {0x413d3, 0x0}, +- {0x413d4, 0x0}, +- {0x413d5, 0x0}, +- {0x413d6, 0x0}, +- {0x413d7, 0x0}, +- {0x413d8, 0x0}, +- {0x413d9, 0x0}, +- {0x413da, 0x0}, +- {0x413db, 0x0}, +- {0x413dc, 0x0}, +- {0x413dd, 0x0}, +- {0x413de, 0x0}, +- {0x413df, 0x0}, +- {0x413e0, 0x0}, +- {0x413e1, 0x0}, +- {0x413e2, 0x0}, +- {0x413e3, 0x0}, +- {0x413e4, 0x0}, +- {0x413e5, 0x0}, +- {0x413e6, 0x0}, +- {0x413e7, 0x0}, +- {0x413e8, 0x0}, +- {0x413e9, 0x0}, +- {0x413ea, 0x0}, +- {0x413eb, 0x0}, +- {0x413ec, 0x0}, +- {0x413ed, 0x0}, +- {0x413ee, 0x0}, +- {0x413ef, 0x0}, +- {0x413f0, 0x0}, +- {0x413f1, 0x0}, +- {0x413f2, 0x0}, +- {0x413f3, 0x0}, +- {0x413f4, 0x0}, +- {0x413f5, 0x0}, +- {0x413f6, 0x0}, +- {0x413f7, 0x0}, +- {0x413f8, 0x0}, +- {0x413f9, 0x0}, +- {0x413fa, 0x0}, +- {0x413fb, 0x0}, +- {0x413fc, 0x0}, +- {0x413fd, 0x0}, +- {0x413fe, 0x0}, +- {0x413ff, 0x0}, +- {0x41400, 0x0}, +- {0x41401, 0x0}, +- {0x41402, 0x0}, +- {0x41403, 0x0}, +- {0x41404, 0x0}, +- {0x41405, 0x0}, +- {0x41406, 0x0}, +- {0x41407, 0x0}, +- {0x41408, 0x0}, +- {0x41409, 0x0}, +- {0x4140a, 0x0}, +- {0x4140b, 0x0}, +- {0x4140c, 0x0}, +- {0x4140d, 0x0}, +- {0x4140e, 0x0}, +- {0x4140f, 0x0}, +- {0x41410, 0x0}, +- {0x41411, 0x0}, +- {0x41412, 0x0}, +- {0x41413, 0x0}, +- {0x41414, 0x0}, +- {0x41415, 0x0}, +- {0x41416, 0x0}, +- {0x41417, 0x0}, +- {0x41418, 0x0}, +- {0x41419, 0x0}, +- {0x4141a, 0x0}, +- {0x4141b, 0x0}, +- {0x4141c, 0x0}, +- {0x4141d, 0x0}, +- {0x4141e, 0x0}, +- {0x4141f, 0x0}, +- {0x41420, 0x0}, +- {0x41421, 0x0}, +- {0x41422, 0x0}, +- {0x41423, 0x0}, +- {0x41424, 0x0}, +- {0x41425, 0x0}, +- {0x41426, 0x0}, +- {0x41427, 0x0}, +- {0x41428, 0x0}, +- {0x41429, 0x0}, +- {0x4142a, 0x0}, +- {0x4142b, 0x0}, +- {0x4142c, 0x0}, +- {0x4142d, 0x0}, +- {0x4142e, 0x0}, +- {0x4142f, 0x0}, +- {0x41430, 0x0}, +- {0x41431, 0x0}, +- {0x41432, 0x0}, +- {0x41433, 0x0}, +- {0x41434, 0x0}, +- {0x41435, 0x0}, +- {0x41436, 0x0}, +- {0x41437, 0x0}, +- {0x41438, 0x0}, +- {0x41439, 0x0}, +- {0x4143a, 0x0}, +- {0x4143b, 0x0}, +- {0x4143c, 0x0}, +- {0x4143d, 0x0}, +- {0x4143e, 0x0}, +- {0x4143f, 0x0}, +- {0x41440, 0x0}, +- {0x41441, 0x0}, +- {0x41442, 0x0}, +- {0x41443, 0x0}, +- {0x41444, 0x0}, +- {0x41445, 0x0}, +- {0x41446, 0x0}, +- {0x41447, 0x0}, +- {0x41448, 0x0}, +- {0x41449, 0x0}, +- {0x4144a, 0x0}, +- {0x4144b, 0x0}, +- {0x4144c, 0x0}, +- {0x4144d, 0x0}, +- {0x4144e, 0x0}, +- {0x4144f, 0x0}, +- {0x41450, 0x0}, +- {0x41451, 0x0}, +- {0x41452, 0x0}, +- {0x41453, 0x0}, +- {0x41454, 0x0}, +- {0x41455, 0x0}, +- {0x41456, 0x0}, +- {0x41457, 0x0}, +- {0x41458, 0x0}, +- {0x41459, 0x0}, +- {0x4145a, 0x0}, +- {0x4145b, 0x0}, +- {0x4145c, 0x0}, +- {0x4145d, 0x0}, +- {0x4145e, 0x0}, +- {0x4145f, 0x0}, +- {0x41460, 0x0}, +- {0x41461, 0x0}, +- {0x41462, 0x0}, +- {0x41463, 0x0}, +- {0x41464, 0x0}, +- {0x41465, 0x0}, +- {0x41466, 0x0}, +- {0x41467, 0x0}, +- {0x41468, 0x0}, +- {0x41469, 0x0}, +- {0x4146a, 0x0}, +- {0x4146b, 0x0}, +- {0x4146c, 0x0}, +- {0x4146d, 0x0}, +- {0x4146e, 0x0}, +- {0x4146f, 0x0}, +- {0x41470, 0x0}, +- {0x41471, 0x0}, +- {0x41472, 0x0}, +- {0x41473, 0x0}, +- {0x41474, 0x0}, +- {0x41475, 0x0}, +- {0x41476, 0x0}, +- {0x41477, 0x0}, +- {0x41478, 0x0}, +- {0x41479, 0x0}, +- {0x4147a, 0x0}, +- {0x4147b, 0x0}, +- {0x4147c, 0x0}, +- {0x4147d, 0x0}, +- {0x4147e, 0x0}, +- {0x4147f, 0x0}, +- {0x41480, 0x0}, +- {0x41481, 0x0}, +- {0x41482, 0x0}, +- {0x41483, 0x0}, +- {0x41484, 0x0}, +- {0x41485, 0x0}, +- {0x41486, 0x0}, +- {0x41487, 0x0}, +- {0x41488, 0x0}, +- {0x41489, 0x0}, +- {0x4148a, 0x0}, +- {0x4148b, 0x0}, +- {0x4148c, 0x0}, +- {0x4148d, 0x0}, +- {0x4148e, 0x0}, +- {0x4148f, 0x0}, +- {0x41490, 0x0}, +- {0x41491, 0x0}, +- {0x41492, 0x0}, +- {0x41493, 0x0}, +- {0x41494, 0x0}, +- {0x41495, 0x0}, +- {0x41496, 0x0}, +- {0x41497, 0x0}, +- {0x41498, 0x0}, +- {0x41499, 0x0}, +- {0x4149a, 0x0}, +- {0x4149b, 0x0}, +- {0x4149c, 0x0}, +- {0x4149d, 0x0}, +- {0x4149e, 0x0}, +- {0x4149f, 0x0}, +- {0x414a0, 0x0}, +- {0x414a1, 0x0}, +- {0x414a2, 0x0}, +- {0x414a3, 0x0}, +- {0x414a4, 0x0}, +- {0x414a5, 0x0}, +- {0x414a6, 0x0}, +- {0x414a7, 0x0}, +- {0x414a8, 0x0}, +- {0x414a9, 0x0}, +- {0x414aa, 0x0}, +- {0x414ab, 0x0}, +- {0x414ac, 0x0}, +- {0x414ad, 0x0}, +- {0x414ae, 0x0}, +- {0x414af, 0x0}, +- {0x414b0, 0x0}, +- {0x414b1, 0x0}, +- {0x414b2, 0x0}, +- {0x414b3, 0x0}, +- {0x414b4, 0x0}, +- {0x414b5, 0x0}, +- {0x414b6, 0x0}, +- {0x414b7, 0x0}, +- {0x414b8, 0x0}, +- {0x414b9, 0x0}, +- {0x414ba, 0x0}, +- {0x414bb, 0x0}, +- {0x414bc, 0x0}, +- {0x414bd, 0x0}, +- {0x414be, 0x0}, +- {0x414bf, 0x0}, +- {0x414c0, 0x0}, +- {0x414c1, 0x0}, +- {0x414c2, 0x0}, +- {0x414c3, 0x0}, +- {0x414c4, 0x0}, +- {0x414c5, 0x0}, +- {0x414c6, 0x0}, +- {0x414c7, 0x0}, +- {0x414c8, 0x0}, +- {0x414c9, 0x0}, +- {0x414ca, 0x0}, +- {0x414cb, 0x0}, +- {0x414cc, 0x0}, +- {0x414cd, 0x0}, +- {0x414ce, 0x0}, +- {0x414cf, 0x0}, +- {0x414d0, 0x0}, +- {0x414d1, 0x0}, +- {0x414d2, 0x0}, +- {0x414d3, 0x0}, +- {0x414d4, 0x0}, +- {0x414d5, 0x0}, +- {0x414d6, 0x0}, +- {0x414d7, 0x0}, +- {0x414d8, 0x0}, +- {0x414d9, 0x0}, +- {0x414da, 0x0}, +- {0x414db, 0x0}, +- {0x414dc, 0x0}, +- {0x414dd, 0x0}, +- {0x414de, 0x0}, +- {0x414df, 0x0}, +- {0x414e0, 0x0}, +- {0x414e1, 0x0}, +- {0x414e2, 0x0}, +- {0x414e3, 0x0}, +- {0x414e4, 0x0}, +- {0x414e5, 0x0}, +- {0x414e6, 0x0}, +- {0x414e7, 0x0}, +- {0x414e8, 0x0}, +- {0x414e9, 0x0}, +- {0x414ea, 0x0}, +- {0x414eb, 0x0}, +- {0x414ec, 0x0}, +- {0x414ed, 0x0}, +- {0x414ee, 0x0}, +- {0x414ef, 0x0}, +- {0x414f0, 0x0}, +- {0x414f1, 0x0}, +- {0x414f2, 0x0}, +- {0x414f3, 0x0}, +- {0x414f4, 0x0}, +- {0x414f5, 0x0}, +- {0x414f6, 0x0}, +- {0x414f7, 0x0}, +- {0x414f8, 0x0}, +- {0x414f9, 0x0}, +- {0x414fa, 0x0}, +- {0x414fb, 0x0}, +- {0x414fc, 0x0}, +- {0x414fd, 0x0}, +- {0x414fe, 0x0}, +- {0x414ff, 0x0}, +- {0x41500, 0x0}, +- {0x41501, 0x0}, +- {0x41502, 0x0}, +- {0x41503, 0x0}, +- {0x41504, 0x0}, +- {0x41505, 0x0}, +- {0x41506, 0x0}, +- {0x41507, 0x0}, +- {0x41508, 0x0}, +- {0x41509, 0x0}, +- {0x4150a, 0x0}, +- {0x4150b, 0x0}, +- {0x4150c, 0x0}, +- {0x4150d, 0x0}, +- {0x4150e, 0x0}, +- {0x4150f, 0x0}, +- {0x41510, 0x0}, +- {0x41511, 0x0}, +- {0x41512, 0x0}, +- {0x41513, 0x0}, +- {0x41514, 0x0}, +- {0x41515, 0x0}, +- {0x41516, 0x0}, +- {0x41517, 0x0}, +- {0x41518, 0x0}, +- {0x41519, 0x0}, +- {0x4151a, 0x0}, +- {0x4151b, 0x0}, +- {0x4151c, 0x0}, +- {0x4151d, 0x0}, +- {0x4151e, 0x0}, +- {0x4151f, 0x0}, +- {0x41520, 0x0}, +- {0x41521, 0x0}, +- {0x41522, 0x0}, +- {0x41523, 0x0}, +- {0x41524, 0x0}, +- {0x41525, 0x0}, +- {0x41526, 0x0}, +- {0x41527, 0x0}, +- {0x41528, 0x0}, +- {0x41529, 0x0}, +- {0x4152a, 0x0}, +- {0x4152b, 0x0}, +- {0x4152c, 0x0}, +- {0x4152d, 0x0}, +- {0x4152e, 0x0}, +- {0x4152f, 0x0}, +- {0x41530, 0x0}, +- {0x41531, 0x0}, +- {0x41532, 0x0}, +- {0x41533, 0x0}, +- {0x41534, 0x0}, +- {0x41535, 0x0}, +- {0x41536, 0x0}, +- {0x41537, 0x0}, +- {0x41538, 0x0}, +- {0x41539, 0x0}, +- {0x4153a, 0x0}, +- {0x4153b, 0x0}, +- {0x4153c, 0x0}, +- {0x4153d, 0x0}, +- {0x4153e, 0x0}, +- {0x4153f, 0x0}, +- {0x41540, 0x0}, +- {0x41541, 0x0}, +- {0x41542, 0x0}, +- {0x41543, 0x0}, +- {0x41544, 0x0}, +- {0x41545, 0x0}, +- {0x41546, 0x0}, +- {0x41547, 0x0}, +- {0x41548, 0x0}, +- {0x41549, 0x0}, +- {0x4154a, 0x0}, +- {0x4154b, 0x0}, +- {0x4154c, 0x0}, +- {0x4154d, 0x0}, +- {0x4154e, 0x0}, +- {0x4154f, 0x0}, +- {0x41550, 0x0}, +- {0x41551, 0x0}, +- {0x41552, 0x0}, +- {0x41553, 0x0}, +- {0x41554, 0x0}, +- {0x41555, 0x0}, +- {0x41556, 0x0}, +- {0x41557, 0x0}, +- {0x41558, 0x0}, +- {0x41559, 0x0}, +- {0x4155a, 0x0}, +- {0x4155b, 0x0}, +- {0x4155c, 0x0}, +- {0x4155d, 0x0}, +- {0x4155e, 0x0}, +- {0x4155f, 0x0}, +- {0x41560, 0x0}, +- {0x41561, 0x0}, +- {0x41562, 0x0}, +- {0x41563, 0x0}, +- {0x41564, 0x0}, +- {0x41565, 0x0}, +- {0x41566, 0x0}, +- {0x41567, 0x0}, +- {0x41568, 0x0}, +- {0x41569, 0x0}, +- {0x4156a, 0x0}, +- {0x4156b, 0x0}, +- {0x4156c, 0x0}, +- {0x4156d, 0x0}, +- {0x4156e, 0x0}, +- {0x4156f, 0x0}, +- {0x41570, 0x0}, +- {0x41571, 0x0}, +- {0x41572, 0x0}, +- {0x41573, 0x0}, +- {0x41574, 0x0}, +- {0x41575, 0x0}, +- {0x41576, 0x0}, +- {0x41577, 0x0}, +- {0x41578, 0x0}, +- {0x41579, 0x0}, +- {0x4157a, 0x0}, +- {0x4157b, 0x0}, +- {0x4157c, 0x0}, +- {0x4157d, 0x0}, +- {0x4157e, 0x0}, +- {0x4157f, 0x0}, +- {0x41580, 0x0}, +- {0x41581, 0x0}, +- {0x41582, 0x0}, +- {0x41583, 0x0}, +- {0x41584, 0x0}, +- {0x41585, 0x0}, +- {0x41586, 0x0}, +- {0x41587, 0x0}, +- {0x41588, 0x0}, +- {0x41589, 0x0}, +- {0x4158a, 0x0}, +- {0x4158b, 0x0}, +- {0x4158c, 0x0}, +- {0x4158d, 0x0}, +- {0x4158e, 0x0}, +- {0x4158f, 0x0}, +- {0x41590, 0x0}, +- {0x41591, 0x0}, +- {0x41592, 0x0}, +- {0x41593, 0x0}, +- {0x41594, 0x0}, +- {0x41595, 0x0}, +- {0x41596, 0x0}, +- {0x41597, 0x0}, +- {0x41598, 0x0}, +- {0x41599, 0x0}, +- {0x4159a, 0x0}, +- {0x4159b, 0x0}, +- {0x4159c, 0x0}, +- {0x4159d, 0x0}, +- {0x4159e, 0x0}, +- {0x4159f, 0x0}, +- {0x415a0, 0x0}, +- {0x415a1, 0x0}, +- {0x415a2, 0x0}, +- {0x415a3, 0x0}, +- {0x415a4, 0x0}, +- {0x415a5, 0x0}, +- {0x415a6, 0x0}, +- {0x415a7, 0x0}, +- {0x415a8, 0x0}, +- {0x415a9, 0x0}, +- {0x415aa, 0x0}, +- {0x415ab, 0x0}, +- {0x415ac, 0x0}, +- {0x415ad, 0x0}, +- {0x415ae, 0x0}, +- {0x415af, 0x0}, +- {0x415b0, 0x0}, +- {0x415b1, 0x0}, +- {0x415b2, 0x0}, +- {0x415b3, 0x0}, +- {0x415b4, 0x0}, +- {0x415b5, 0x0}, +- {0x415b6, 0x0}, +- {0x415b7, 0x0}, +- {0x415b8, 0x0}, +- {0x415b9, 0x0}, +- {0x415ba, 0x0}, +- {0x415bb, 0x0}, +- {0x415bc, 0x0}, +- {0x415bd, 0x0}, +- {0x415be, 0x0}, +- {0x415bf, 0x0}, +- {0x415c0, 0x0}, +- {0x415c1, 0x0}, +- {0x415c2, 0x0}, +- {0x415c3, 0x0}, +- {0x415c4, 0x0}, +- {0x415c5, 0x0}, +- {0x415c6, 0x0}, +- {0x415c7, 0x0}, +- {0x415c8, 0x0}, +- {0x415c9, 0x0}, +- {0x415ca, 0x0}, +- {0x415cb, 0x0}, +- {0x415cc, 0x0}, +- {0x415cd, 0x0}, +- {0x415ce, 0x0}, +- {0x415cf, 0x0}, +- {0x415d0, 0x0}, +- {0x415d1, 0x0}, +- {0x415d2, 0x0}, +- {0x415d3, 0x0}, +- {0x415d4, 0x0}, +- {0x415d5, 0x0}, +- {0x415d6, 0x0}, +- {0x415d7, 0x0}, +- {0x415d8, 0x0}, +- {0x415d9, 0x0}, +- {0x415da, 0x0}, +- {0x415db, 0x0}, +- {0x415dc, 0x0}, +- {0x415dd, 0x0}, +- {0x415de, 0x0}, +- {0x415df, 0x0}, +- {0x415e0, 0x0}, +- {0x415e1, 0x0}, +- {0x415e2, 0x0}, +- {0x415e3, 0x0}, +- {0x415e4, 0x0}, +- {0x415e5, 0x0}, +- {0x415e6, 0x0}, +- {0x415e7, 0x0}, +- {0x415e8, 0x0}, +- {0x415e9, 0x0}, +- {0x415ea, 0x0}, +- {0x415eb, 0x0}, +- {0x415ec, 0x0}, +- {0x415ed, 0x0}, +- {0x415ee, 0x0}, +- {0x415ef, 0x0}, +- {0x415f0, 0x0}, +- {0x415f1, 0x0}, +- {0x415f2, 0x0}, +- {0x415f3, 0x0}, +- {0x415f4, 0x0}, +- {0x415f5, 0x0}, +- {0x415f6, 0x0}, +- {0x415f7, 0x0}, +- {0x415f8, 0x0}, +- {0x415f9, 0x0}, +- {0x415fa, 0x0}, +- {0x415fb, 0x0}, +- {0x415fc, 0x0}, +- {0x415fd, 0x0}, +- {0x415fe, 0x0}, +- {0x415ff, 0x0}, +- {0x41600, 0x0}, +- {0x41601, 0x0}, +- {0x41602, 0x0}, +- {0x41603, 0x0}, +- {0x41604, 0x0}, +- {0x41605, 0x0}, +- {0x41606, 0x0}, +- {0x41607, 0x0}, +- {0x41608, 0x0}, +- {0x41609, 0x0}, +- {0x4160a, 0x0}, +- {0x4160b, 0x0}, +- {0x4160c, 0x0}, +- {0x4160d, 0x0}, +- {0x4160e, 0x0}, +- {0x4160f, 0x0}, +- {0x41610, 0x0}, +- {0x41611, 0x0}, +- {0x41612, 0x0}, +- {0x41613, 0x0}, +- {0x41614, 0x0}, +- {0x41615, 0x0}, +- {0x41616, 0x0}, +- {0x41617, 0x0}, +- {0x41618, 0x0}, +- {0x41619, 0x0}, +- {0x4161a, 0x0}, +- {0x4161b, 0x0}, +- {0x4161c, 0x0}, +- {0x4161d, 0x0}, +- {0x4161e, 0x0}, +- {0x4161f, 0x0}, +- {0x41620, 0x0}, +- {0x41621, 0x0}, +- {0x41622, 0x0}, +- {0x41623, 0x0}, +- {0x41624, 0x0}, +- {0x41625, 0x0}, +- {0x41626, 0x0}, +- {0x41627, 0x0}, +- {0x41628, 0x0}, +- {0x41629, 0x0}, +- {0x4162a, 0x0}, +- {0x4162b, 0x0}, +- {0x4162c, 0x0}, +- {0x4162d, 0x0}, +- {0x4162e, 0x0}, +- {0x4162f, 0x0}, +- {0x41630, 0x0}, +- {0x41631, 0x0}, +- {0x41632, 0x0}, +- {0x41633, 0x0}, +- {0x41634, 0x0}, +- {0x41635, 0x0}, +- {0x41636, 0x0}, +- {0x41637, 0x0}, +- {0x41638, 0x0}, +- {0x41639, 0x0}, +- {0x4163a, 0x0}, +- {0x4163b, 0x0}, +- {0x4163c, 0x0}, +- {0x4163d, 0x0}, +- {0x4163e, 0x0}, +- {0x4163f, 0x0}, +- {0x41640, 0x0}, +- {0x41641, 0x0}, +- {0x41642, 0x0}, +- {0x41643, 0x0}, +- {0x41644, 0x0}, +- {0x41645, 0x0}, +- {0x41646, 0x0}, +- {0x41647, 0x0}, +- {0x41648, 0x0}, +- {0x41649, 0x0}, +- {0x4164a, 0x0}, +- {0x4164b, 0x0}, +- {0x4164c, 0x0}, +- {0x4164d, 0x0}, +- {0x4164e, 0x0}, +- {0x4164f, 0x0}, +- {0x41650, 0x0}, +- {0x41651, 0x0}, +- {0x41652, 0x0}, +- {0x41653, 0x0}, +- {0x41654, 0x0}, +- {0x41655, 0x0}, +- {0x41656, 0x0}, +- {0x41657, 0x0}, +- {0x41658, 0x0}, +- {0x41659, 0x0}, +- {0x4165a, 0x0}, +- {0x4165b, 0x0}, +- {0x4165c, 0x0}, +- {0x4165d, 0x0}, +- {0x4165e, 0x0}, +- {0x4165f, 0x0}, +- {0x41660, 0x0}, +- {0x41661, 0x0}, +- {0x41662, 0x0}, +- {0x41663, 0x0}, +- {0x41664, 0x0}, +- {0x41665, 0x0}, +- {0x41666, 0x0}, +- {0x41667, 0x0}, +- {0x41668, 0x0}, +- {0x41669, 0x0}, +- {0x4166a, 0x0}, +- {0x4166b, 0x0}, +- {0x4166c, 0x0}, +- {0x4166d, 0x0}, +- {0x4166e, 0x0}, +- {0x4166f, 0x0}, +- {0x41670, 0x0}, +- {0x41671, 0x0}, +- {0x41672, 0x0}, +- {0x41673, 0x0}, +- {0x41674, 0x0}, +- {0x41675, 0x0}, +- {0x41676, 0x0}, +- {0x41677, 0x0}, +- {0x41678, 0x0}, +- {0x41679, 0x0}, +- {0x4167a, 0x0}, +- {0x4167b, 0x0}, +- {0x4167c, 0x0}, +- {0x4167d, 0x0}, +- {0x4167e, 0x0}, +- {0x4167f, 0x0}, +- {0x41680, 0x0}, +- {0x41681, 0x0}, +- {0x41682, 0x0}, +- {0x41683, 0x0}, +- {0x41684, 0x0}, +- {0x41685, 0x0}, +- {0x41686, 0x0}, +- {0x41687, 0x0}, +- {0x41688, 0x0}, +- {0x41689, 0x0}, +- {0x4168a, 0x0}, +- {0x4168b, 0x0}, +- {0x4168c, 0x0}, +- {0x4168d, 0x0}, +- {0x4168e, 0x0}, +- {0x4168f, 0x0}, +- {0x41690, 0x0}, +- {0x41691, 0x0}, +- {0x41692, 0x0}, +- {0x41693, 0x0}, +- {0x41694, 0x0}, +- {0x41695, 0x0}, +- {0x41696, 0x0}, +- {0x41697, 0x0}, +- {0x41698, 0x0}, +- {0x41699, 0x0}, +- {0x4169a, 0x0}, +- {0x4169b, 0x0}, +- {0x4169c, 0x0}, +- {0x4169d, 0x0}, +- {0x4169e, 0x0}, +- {0x4169f, 0x0}, +- {0x416a0, 0x0}, +- {0x416a1, 0x0}, +- {0x416a2, 0x0}, +- {0x416a3, 0x0}, +- {0x416a4, 0x0}, +- {0x416a5, 0x0}, +- {0x416a6, 0x0}, +- {0x416a7, 0x0}, +- {0x416a8, 0x0}, +- {0x416a9, 0x0}, +- {0x416aa, 0x0}, +- {0x416ab, 0x0}, +- {0x416ac, 0x0}, +- {0x416ad, 0x0}, +- {0x416ae, 0x0}, +- {0x416af, 0x0}, +- {0x416b0, 0x0}, +- {0x416b1, 0x0}, +- {0x416b2, 0x0}, +- {0x416b3, 0x0}, +- {0x416b4, 0x0}, +- {0x416b5, 0x0}, +- {0x416b6, 0x0}, +- {0x416b7, 0x0}, +- {0x416b8, 0x0}, +- {0x416b9, 0x0}, +- {0x416ba, 0x0}, +- {0x416bb, 0x0}, +- {0x416bc, 0x0}, +- {0x416bd, 0x0}, +- {0x416be, 0x0}, +- {0x416bf, 0x0}, +- {0x416c0, 0x0}, +- {0x416c1, 0x0}, +- {0x416c2, 0x0}, +- {0x416c3, 0x0}, +- {0x416c4, 0x0}, +- {0x416c5, 0x0}, +- {0x416c6, 0x0}, +- {0x416c7, 0x0}, +- {0x416c8, 0x0}, +- {0x416c9, 0x0}, +- {0x416ca, 0x0}, +- {0x416cb, 0x0}, +- {0x416cc, 0x0}, +- {0x416cd, 0x0}, +- {0x416ce, 0x0}, +- {0x416cf, 0x0}, +- {0x416d0, 0x0}, +- {0x416d1, 0x0}, +- {0x416d2, 0x0}, +- {0x416d3, 0x0}, +- {0x416d4, 0x0}, +- {0x416d5, 0x0}, +- {0x416d6, 0x0}, +- {0x416d7, 0x0}, +- {0x416d8, 0x0}, +- {0x416d9, 0x0}, +- {0x416da, 0x0}, +- {0x416db, 0x0}, +- {0x416dc, 0x0}, +- {0x416dd, 0x0}, +- {0x416de, 0x0}, +- {0x416df, 0x0}, +- {0x416e0, 0x0}, +- {0x416e1, 0x0}, +- {0x416e2, 0x0}, +- {0x416e3, 0x0}, +- {0x416e4, 0x0}, +- {0x416e5, 0x0}, +- {0x416e6, 0x0}, +- {0x416e7, 0x0}, +- {0x416e8, 0x0}, +- {0x416e9, 0x0}, +- {0x416ea, 0x0}, +- {0x416eb, 0x0}, +- {0x416ec, 0x0}, +- {0x416ed, 0x0}, +- {0x416ee, 0x0}, +- {0x416ef, 0x0}, +- {0x416f0, 0x0}, +- {0x416f1, 0x0}, +- {0x416f2, 0x0}, +- {0x416f3, 0x0}, +- {0x416f4, 0x0}, +- {0x416f5, 0x0}, +- {0x416f6, 0x0}, +- {0x416f7, 0x0}, +- {0x416f8, 0x0}, +- {0x416f9, 0x0}, +- {0x416fa, 0x0}, +- {0x416fb, 0x0}, +- {0x416fc, 0x0}, +- {0x416fd, 0x0}, +- {0x416fe, 0x0}, +- {0x416ff, 0x0}, +- {0x41700, 0x0}, +- {0x41701, 0x0}, +- {0x41702, 0x0}, +- {0x41703, 0x0}, +- {0x41704, 0x0}, +- {0x41705, 0x0}, +- {0x41706, 0x0}, +- {0x41707, 0x0}, +- {0x41708, 0x0}, +- {0x41709, 0x0}, +- {0x4170a, 0x0}, +- {0x4170b, 0x0}, +- {0x4170c, 0x0}, +- {0x4170d, 0x0}, +- {0x4170e, 0x0}, +- {0x4170f, 0x0}, +- {0x41710, 0x0}, +- {0x41711, 0x0}, +- {0x41712, 0x0}, +- {0x41713, 0x0}, +- {0x41714, 0x0}, +- {0x41715, 0x0}, +- {0x41716, 0x0}, +- {0x41717, 0x0}, +- {0x41718, 0x0}, +- {0x41719, 0x0}, +- {0x4171a, 0x0}, +- {0x4171b, 0x0}, +- {0x4171c, 0x0}, +- {0x4171d, 0x0}, +- {0x4171e, 0x0}, +- {0x4171f, 0x0}, +- {0x41720, 0x0}, +- {0x41721, 0x0}, +- {0x41722, 0x0}, +- {0x41723, 0x0}, +- {0x41724, 0x0}, +- {0x41725, 0x0}, +- {0x41726, 0x0}, +- {0x41727, 0x0}, +- {0x41728, 0x0}, +- {0x41729, 0x0}, +- {0x4172a, 0x0}, +- {0x4172b, 0x0}, +- {0x4172c, 0x0}, +- {0x4172d, 0x0}, +- {0x4172e, 0x0}, +- {0x4172f, 0x0}, +- {0x41730, 0x0}, +- {0x41731, 0x0}, +- {0x41732, 0x0}, +- {0x41733, 0x0}, +- {0x41734, 0x0}, +- {0x41735, 0x0}, +- {0x41736, 0x0}, +- {0x41737, 0x0}, +- {0x41738, 0x0}, +- {0x41739, 0x0}, +- {0x4173a, 0x0}, +- {0x4173b, 0x0}, +- {0x4173c, 0x0}, +- {0x4173d, 0x0}, +- {0x4173e, 0x0}, +- {0x4173f, 0x0}, +- {0x41740, 0x0}, +- {0x41741, 0x0}, +- {0x41742, 0x0}, +- {0x41743, 0x0}, +- {0x41744, 0x0}, +- {0x41745, 0x0}, +- {0x41746, 0x0}, +- {0x41747, 0x0}, +- {0x41748, 0x0}, +- {0x41749, 0x0}, +- {0x4174a, 0x0}, +- {0x4174b, 0x0}, +- {0x4174c, 0x0}, +- {0x4174d, 0x0}, +- {0x4174e, 0x0}, +- {0x4174f, 0x0}, +- {0x41750, 0x0}, +- {0x41751, 0x0}, +- {0x41752, 0x0}, +- {0x41753, 0x0}, +- {0x41754, 0x0}, +- {0x41755, 0x0}, +- {0x41756, 0x0}, +- {0x41757, 0x0}, +- {0x41758, 0x0}, +- {0x41759, 0x0}, +- {0x4175a, 0x0}, +- {0x4175b, 0x0}, +- {0x4175c, 0x0}, +- {0x4175d, 0x0}, +- {0x4175e, 0x0}, +- {0x4175f, 0x0}, +- {0x41760, 0x0}, +- {0x41761, 0x0}, +- {0x41762, 0x0}, +- {0x41763, 0x0}, +- {0x41764, 0x0}, +- {0x41765, 0x0}, +- {0x41766, 0x0}, +- {0x41767, 0x0}, +- {0x41768, 0x0}, +- {0x41769, 0x0}, +- {0x4176a, 0x0}, +- {0x4176b, 0x0}, +- {0x4176c, 0x0}, +- {0x4176d, 0x0}, +- {0x4176e, 0x0}, +- {0x4176f, 0x0}, +- {0x41770, 0x0}, +- {0x41771, 0x0}, +- {0x41772, 0x0}, +- {0x41773, 0x0}, +- {0x41774, 0x0}, +- {0x41775, 0x0}, +- {0x41776, 0x0}, +- {0x41777, 0x0}, +- {0x41778, 0x0}, +- {0x41779, 0x0}, +- {0x4177a, 0x0}, +- {0x4177b, 0x0}, +- {0x4177c, 0x0}, +- {0x4177d, 0x0}, +- {0x4177e, 0x0}, +- {0x4177f, 0x0}, +- {0x41780, 0x0}, +- {0x41781, 0x0}, +- {0x41782, 0x0}, +- {0x41783, 0x0}, +- {0x41784, 0x0}, +- {0x41785, 0x0}, +- {0x41786, 0x0}, +- {0x41787, 0x0}, +- {0x41788, 0x0}, +- {0x41789, 0x0}, +- {0x4178a, 0x0}, +- {0x4178b, 0x0}, +- {0x4178c, 0x0}, +- {0x4178d, 0x0}, +- {0x4178e, 0x0}, +- {0x4178f, 0x0}, +- {0x41790, 0x0}, +- {0x41791, 0x0}, +- {0x41792, 0x0}, +- {0x41793, 0x0}, +- {0x41794, 0x0}, +- {0x41795, 0x0}, +- {0x41796, 0x0}, +- {0x41797, 0x0}, +- {0x41798, 0x0}, +- {0x41799, 0x0}, +- {0x4179a, 0x0}, +- {0x4179b, 0x0}, +- {0x4179c, 0x0}, +- {0x4179d, 0x0}, +- {0x4179e, 0x0}, +- {0x4179f, 0x0}, +- {0x417a0, 0x0}, +- {0x417a1, 0x0}, +- {0x417a2, 0x0}, +- {0x417a3, 0x0}, +- {0x417a4, 0x0}, +- {0x417a5, 0x0}, +- {0x417a6, 0x0}, +- {0x417a7, 0x0}, +- {0x417a8, 0x0}, +- {0x417a9, 0x0}, +- {0x417aa, 0x0}, +- {0x417ab, 0x0}, +- {0x417ac, 0x0}, +- {0x417ad, 0x0}, +- {0x417ae, 0x0}, +- {0x417af, 0x0}, +- {0x417b0, 0x0}, +- {0x417b1, 0x0}, +- {0x417b2, 0x0}, +- {0x417b3, 0x0}, +- {0x417b4, 0x0}, +- {0x417b5, 0x0}, +- {0x417b6, 0x0}, +- {0x417b7, 0x0}, +- {0x417b8, 0x0}, +- {0x417b9, 0x0}, +- {0x417ba, 0x0}, +- {0x417bb, 0x0}, +- {0x417bc, 0x0}, +- {0x417bd, 0x0}, +- {0x417be, 0x0}, +- {0x417bf, 0x0}, +- {0x417c0, 0x0}, +- {0x417c1, 0x0}, +- {0x417c2, 0x0}, +- {0x417c3, 0x0}, +- {0x417c4, 0x0}, +- {0x417c5, 0x0}, +- {0x417c6, 0x0}, +- {0x417c7, 0x0}, +- {0x417c8, 0x0}, +- {0x417c9, 0x0}, +- {0x417ca, 0x0}, +- {0x417cb, 0x0}, +- {0x417cc, 0x0}, +- {0x417cd, 0x0}, +- {0x417ce, 0x0}, +- {0x417cf, 0x0}, +- {0x417d0, 0x0}, +- {0x417d1, 0x0}, +- {0x417d2, 0x0}, +- {0x417d3, 0x0}, +- {0x417d4, 0x0}, +- {0x417d5, 0x0}, +- {0x417d6, 0x0}, +- {0x417d7, 0x0}, +- {0x417d8, 0x0}, +- {0x417d9, 0x0}, +- {0x417da, 0x0}, +- {0x417db, 0x0}, +- {0x417dc, 0x0}, +- {0x417dd, 0x0}, +- {0x417de, 0x0}, +- {0x417df, 0x0}, +- {0x417e0, 0x0}, +- {0x417e1, 0x0}, +- {0x417e2, 0x0}, +- {0x417e3, 0x0}, +- {0x417e4, 0x0}, +- {0x417e5, 0x0}, +- {0x417e6, 0x0}, +- {0x417e7, 0x0}, +- {0x417e8, 0x0}, +- {0x417e9, 0x0}, +- {0x417ea, 0x0}, +- {0x417eb, 0x0}, +- {0x417ec, 0x0}, +- {0x417ed, 0x0}, +- {0x417ee, 0x0}, +- {0x417ef, 0x0}, +- {0x417f0, 0x0}, +- {0x417f1, 0x0}, +- {0x417f2, 0x0}, +- {0x417f3, 0x0}, +- {0x417f4, 0x0}, +- {0x417f5, 0x0}, +- {0x417f6, 0x0}, +- {0x417f7, 0x0}, +- {0x417f8, 0x0}, +- {0x417f9, 0x0}, +- {0x417fa, 0x0}, +- {0x417fb, 0x0}, +- {0x417fc, 0x0}, +- {0x417fd, 0x0}, +- {0x417fe, 0x0}, +- {0x417ff, 0x0}, +- {0x41800, 0x0}, +- {0x41801, 0x0}, +- {0x41802, 0x0}, +- {0x41803, 0x0}, +- {0x41804, 0x0}, +- {0x41805, 0x0}, +- {0x41806, 0x0}, +- {0x41807, 0x0}, +- {0x41808, 0x0}, +- {0x41809, 0x0}, +- {0x4180a, 0x0}, +- {0x4180b, 0x0}, +- {0x4180c, 0x0}, +- {0x4180d, 0x0}, +- {0x4180e, 0x0}, +- {0x4180f, 0x0}, +- {0x41810, 0x0}, +- {0x41811, 0x0}, +- {0x41812, 0x0}, +- {0x41813, 0x0}, +- {0x41814, 0x0}, +- {0x41815, 0x0}, +- {0x41816, 0x0}, +- {0x41817, 0x0}, +- {0x41818, 0x0}, +- {0x41819, 0x0}, +- {0x4181a, 0x0}, +- {0x4181b, 0x0}, +- {0x4181c, 0x0}, +- {0x4181d, 0x0}, +- {0x4181e, 0x0}, +- {0x4181f, 0x0}, +- {0x41820, 0x0}, +- {0x41821, 0x0}, +- {0x41822, 0x0}, +- {0x41823, 0x0}, +- {0x41824, 0x0}, +- {0x41825, 0x0}, +- {0x41826, 0x0}, +- {0x41827, 0x0}, +- {0x41828, 0x0}, +- {0x41829, 0x0}, +- {0x4182a, 0x0}, +- {0x4182b, 0x0}, +- {0x4182c, 0x0}, +- {0x4182d, 0x0}, +- {0x4182e, 0x0}, +- {0x4182f, 0x0}, +- {0x41830, 0x0}, +- {0x41831, 0x0}, +- {0x41832, 0x0}, +- {0x41833, 0x0}, +- {0x41834, 0x0}, +- {0x41835, 0x0}, +- {0x41836, 0x0}, +- {0x41837, 0x0}, +- {0x41838, 0x0}, +- {0x41839, 0x0}, +- {0x4183a, 0x0}, +- {0x4183b, 0x0}, +- {0x4183c, 0x0}, +- {0x4183d, 0x0}, +- {0x4183e, 0x0}, +- {0x4183f, 0x0}, +- {0x41840, 0x0}, +- {0x41841, 0x0}, +- {0x41842, 0x0}, +- {0x41843, 0x0}, +- {0x41844, 0x0}, +- {0x41845, 0x0}, +- {0x41846, 0x0}, +- {0x41847, 0x0}, +- {0x41848, 0x0}, +- {0x41849, 0x0}, +- {0x4184a, 0x0}, +- {0x4184b, 0x0}, +- {0x4184c, 0x0}, +- {0x4184d, 0x0}, +- {0x4184e, 0x0}, +- {0x4184f, 0x0}, +- {0x41850, 0x0}, +- {0x41851, 0x0}, +- {0x41852, 0x0}, +- {0x41853, 0x0}, +- {0x41854, 0x0}, +- {0x41855, 0x0}, +- {0x41856, 0x0}, +- {0x41857, 0x0}, +- {0x41858, 0x0}, +- {0x41859, 0x0}, +- {0x4185a, 0x0}, +- {0x4185b, 0x0}, +- {0x4185c, 0x0}, +- {0x4185d, 0x0}, +- {0x4185e, 0x0}, +- {0x4185f, 0x0}, +- {0x41860, 0x0}, +- {0x41861, 0x0}, +- {0x41862, 0x0}, +- {0x41863, 0x0}, +- {0x41864, 0x0}, +- {0x41865, 0x0}, +- {0x41866, 0x0}, +- {0x41867, 0x0}, +- {0x41868, 0x0}, +- {0x41869, 0x0}, +- {0x4186a, 0x0}, +- {0x4186b, 0x0}, +- {0x4186c, 0x0}, +- {0x4186d, 0x0}, +- {0x4186e, 0x0}, +- {0x4186f, 0x0}, +- {0x41870, 0x0}, +- {0x41871, 0x0}, +- {0x41872, 0x0}, +- {0x41873, 0x0}, +- {0x41874, 0x0}, +- {0x41875, 0x0}, +- {0x41876, 0x0}, +- {0x41877, 0x0}, +- {0x41878, 0x0}, +- {0x41879, 0x0}, +- {0x4187a, 0x0}, +- {0x4187b, 0x0}, +- {0x4187c, 0x0}, +- {0x4187d, 0x0}, +- {0x4187e, 0x0}, +- {0x4187f, 0x0}, +- {0x41880, 0x0}, +- {0x41881, 0x0}, +- {0x41882, 0x0}, +- {0x41883, 0x0}, +- {0x41884, 0x0}, +- {0x41885, 0x0}, +- {0x41886, 0x0}, +- {0x41887, 0x0}, +- {0x41888, 0x0}, +- {0x41889, 0x0}, +- {0x4188a, 0x0}, +- {0x4188b, 0x0}, +- {0x4188c, 0x0}, +- {0x4188d, 0x0}, +- {0x4188e, 0x0}, +- {0x4188f, 0x0}, +- {0x41890, 0x0}, +- {0x41891, 0x0}, +- {0x41892, 0x0}, +- {0x41893, 0x0}, +- {0x41894, 0x0}, +- {0x41895, 0x0}, +- {0x41896, 0x0}, +- {0x41897, 0x0}, +- {0x41898, 0x0}, +- {0x41899, 0x0}, +- {0x4189a, 0x0}, +- {0x4189b, 0x0}, +- {0x4189c, 0x0}, +- {0x4189d, 0x0}, +- {0x4189e, 0x0}, +- {0x4189f, 0x0}, +- {0x418a0, 0x0}, +- {0x418a1, 0x0}, +- {0x418a2, 0x0}, +- {0x418a3, 0x0}, +- {0x418a4, 0x0}, +- {0x418a5, 0x0}, +- {0x418a6, 0x0}, +- {0x418a7, 0x0}, +- {0x418a8, 0x0}, +- {0x418a9, 0x0}, +- {0x418aa, 0x0}, +- {0x418ab, 0x0}, +- {0x418ac, 0x0}, +- {0x418ad, 0x0}, +- {0x418ae, 0x0}, +- {0x418af, 0x0}, +- {0x418b0, 0x0}, +- {0x418b1, 0x0}, +- {0x418b2, 0x0}, +- {0x418b3, 0x0}, +- {0x418b4, 0x0}, +- {0x418b5, 0x0}, +- {0x418b6, 0x0}, +- {0x418b7, 0x0}, +- {0x418b8, 0x0}, +- {0x418b9, 0x0}, +- {0x418ba, 0x0}, +- {0x418bb, 0x0}, +- {0x418bc, 0x0}, +- {0x418bd, 0x0}, +- {0x418be, 0x0}, +- {0x418bf, 0x0}, +- {0x418c0, 0x0}, +- {0x418c1, 0x0}, +- {0x418c2, 0x0}, +- {0x418c3, 0x0}, +- {0x418c4, 0x0}, +- {0x418c5, 0x0}, +- {0x418c6, 0x0}, +- {0x418c7, 0x0}, +- {0x418c8, 0x0}, +- {0x418c9, 0x0}, +- {0x418ca, 0x0}, +- {0x418cb, 0x0}, +- {0x418cc, 0x0}, +- {0x418cd, 0x0}, +- {0x418ce, 0x0}, +- {0x418cf, 0x0}, +- {0x418d0, 0x0}, +- {0x418d1, 0x0}, +- {0x418d2, 0x0}, +- {0x418d3, 0x0}, +- {0x418d4, 0x0}, +- {0x418d5, 0x0}, +- {0x418d6, 0x0}, +- {0x418d7, 0x0}, +- {0x418d8, 0x0}, +- {0x418d9, 0x0}, +- {0x418da, 0x0}, +- {0x418db, 0x0}, +- {0x418dc, 0x0}, +- {0x418dd, 0x0}, +- {0x418de, 0x0}, +- {0x418df, 0x0}, +- {0x418e0, 0x0}, +- {0x418e1, 0x0}, +- {0x418e2, 0x0}, +- {0x418e3, 0x0}, +- {0x418e4, 0x0}, +- {0x418e5, 0x0}, +- {0x418e6, 0x0}, +- {0x418e7, 0x0}, +- {0x418e8, 0x0}, +- {0x418e9, 0x0}, +- {0x418ea, 0x0}, +- {0x418eb, 0x0}, +- {0x418ec, 0x0}, +- {0x418ed, 0x0}, +- {0x418ee, 0x0}, +- {0x418ef, 0x0}, +- {0x418f0, 0x0}, +- {0x418f1, 0x0}, +- {0x418f2, 0x0}, +- {0x418f3, 0x0}, +- {0x418f4, 0x0}, +- {0x418f5, 0x0}, +- {0x418f6, 0x0}, +- {0x418f7, 0x0}, +- {0x418f8, 0x0}, +- {0x418f9, 0x0}, +- {0x418fa, 0x0}, +- {0x418fb, 0x0}, +- {0x418fc, 0x0}, +- {0x418fd, 0x0}, +- {0x418fe, 0x0}, +- {0x418ff, 0x0}, +- {0x41900, 0x0}, +- {0x41901, 0x0}, +- {0x41902, 0x0}, +- {0x41903, 0x0}, +- {0x41904, 0x0}, +- {0x41905, 0x0}, +- {0x41906, 0x0}, +- {0x41907, 0x0}, +- {0x41908, 0x0}, +- {0x41909, 0x0}, +- {0x4190a, 0x0}, +- {0x4190b, 0x0}, +- {0x4190c, 0x0}, +- {0x4190d, 0x0}, +- {0x4190e, 0x0}, +- {0x4190f, 0x0}, +- {0x41910, 0x0}, +- {0x41911, 0x0}, +- {0x41912, 0x0}, +- {0x41913, 0x0}, +- {0x41914, 0x0}, +- {0x41915, 0x0}, +- {0x41916, 0x0}, +- {0x41917, 0x0}, +- {0x41918, 0x0}, +- {0x41919, 0x0}, +- {0x4191a, 0x0}, +- {0x4191b, 0x0}, +- {0x4191c, 0x0}, +- {0x4191d, 0x0}, +- {0x4191e, 0x0}, +- {0x4191f, 0x0}, +- {0x41920, 0x0}, +- {0x41921, 0x0}, +- {0x41922, 0x0}, +- {0x41923, 0x0}, +- {0x41924, 0x0}, +- {0x41925, 0x0}, +- {0x41926, 0x0}, +- {0x41927, 0x0}, +- {0x41928, 0x0}, +- {0x41929, 0x0}, +- {0x4192a, 0x0}, +- {0x4192b, 0x0}, +- {0x4192c, 0x0}, +- {0x4192d, 0x0}, +- {0x4192e, 0x0}, +- {0x4192f, 0x0}, +- {0x41930, 0x0}, +- {0x41931, 0x0}, +- {0x41932, 0x0}, +- {0x41933, 0x0}, +- {0x41934, 0x0}, +- {0x41935, 0x0}, +- {0x41936, 0x0}, +- {0x41937, 0x0}, +- {0x41938, 0x0}, +- {0x41939, 0x0}, +- {0x4193a, 0x0}, +- {0x4193b, 0x0}, +- {0x4193c, 0x0}, +- {0x4193d, 0x0}, +- {0x4193e, 0x0}, +- {0x4193f, 0x0}, +- {0x41940, 0x0}, +- {0x41941, 0x0}, +- {0x41942, 0x0}, +- {0x41943, 0x0}, +- {0x41944, 0x0}, +- {0x41945, 0x0}, +- {0x41946, 0x0}, +- {0x41947, 0x0}, +- {0x41948, 0x0}, +- {0x41949, 0x0}, +- {0x4194a, 0x0}, +- {0x4194b, 0x0}, +- {0x4194c, 0x0}, +- {0x4194d, 0x0}, +- {0x4194e, 0x0}, +- {0x4194f, 0x0}, +- {0x41950, 0x0}, +- {0x41951, 0x0}, +- {0x41952, 0x0}, +- {0x41953, 0x0}, +- {0x41954, 0x0}, +- {0x41955, 0x0}, +- {0x41956, 0x0}, +- {0x41957, 0x0}, +- {0x41958, 0x0}, +- {0x41959, 0x0}, +- {0x4195a, 0x0}, +- {0x4195b, 0x0}, +- {0x4195c, 0x0}, +- {0x4195d, 0x0}, +- {0x4195e, 0x0}, +- {0x4195f, 0x0}, +- {0x41960, 0x0}, +- {0x41961, 0x0}, +- {0x41962, 0x0}, +- {0x41963, 0x0}, +- {0x41964, 0x0}, +- {0x41965, 0x0}, +- {0x41966, 0x0}, +- {0x41967, 0x0}, +- {0x41968, 0x0}, +- {0x41969, 0x0}, +- {0x4196a, 0x0}, +- {0x4196b, 0x0}, +- {0x4196c, 0x0}, +- {0x4196d, 0x0}, +- {0x4196e, 0x0}, +- {0x4196f, 0x0}, +- {0x41970, 0x0}, +- {0x41971, 0x0}, +- {0x41972, 0x0}, +- {0x41973, 0x0}, +- {0x41974, 0x0}, +- {0x41975, 0x0}, +- {0x41976, 0x0}, +- {0x41977, 0x0}, +- {0x41978, 0x0}, +- {0x41979, 0x0}, +- {0x4197a, 0x0}, +- {0x4197b, 0x0}, +- {0x4197c, 0x0}, +- {0x4197d, 0x0}, +- {0x4197e, 0x0}, +- {0x4197f, 0x0}, +- {0x41980, 0x0}, +- {0x41981, 0x0}, +- {0x41982, 0x0}, +- {0x41983, 0x0}, +- {0x41984, 0x0}, +- {0x41985, 0x0}, +- {0x41986, 0x0}, +- {0x41987, 0x0}, +- {0x41988, 0x0}, +- {0x41989, 0x0}, +- {0x4198a, 0x0}, +- {0x4198b, 0x0}, +- {0x4198c, 0x0}, +- {0x4198d, 0x0}, +- {0x4198e, 0x0}, +- {0x4198f, 0x0}, +- {0x41990, 0x0}, +- {0x41991, 0x0}, +- {0x41992, 0x0}, +- {0x41993, 0x0}, +- {0x41994, 0x0}, +- {0x41995, 0x0}, +- {0x41996, 0x0}, +- {0x41997, 0x0}, +- {0x41998, 0x0}, +- {0x41999, 0x0}, +- {0x4199a, 0x0}, +- {0x4199b, 0x0}, +- {0x4199c, 0x0}, +- {0x4199d, 0x0}, +- {0x4199e, 0x0}, +- {0x4199f, 0x0}, +- {0x419a0, 0x0}, +- {0x419a1, 0x0}, +- {0x419a2, 0x0}, +- {0x419a3, 0x0}, +- {0x419a4, 0x0}, +- {0x419a5, 0x0}, +- {0x419a6, 0x0}, +- {0x419a7, 0x0}, +- {0x419a8, 0x0}, +- {0x419a9, 0x0}, +- {0x419aa, 0x0}, +- {0x419ab, 0x0}, +- {0x419ac, 0x0}, +- {0x419ad, 0x0}, +- {0x419ae, 0x0}, +- {0x419af, 0x0}, +- {0x419b0, 0x0}, +- {0x419b1, 0x0}, +- {0x419b2, 0x0}, +- {0x419b3, 0x0}, +- {0x419b4, 0x0}, +- {0x419b5, 0x0}, +- {0x419b6, 0x0}, +- {0x419b7, 0x0}, +- {0x419b8, 0x0}, +- {0x419b9, 0x0}, +- {0x419ba, 0x0}, +- {0x419bb, 0x0}, +- {0x419bc, 0x0}, +- {0x419bd, 0x0}, +- {0x419be, 0x0}, +- {0x419bf, 0x0}, +- {0x419c0, 0x0}, +- {0x419c1, 0x0}, +- {0x419c2, 0x0}, +- {0x419c3, 0x0}, +- {0x419c4, 0x0}, +- {0x419c5, 0x0}, +- {0x419c6, 0x0}, +- {0x419c7, 0x0}, +- {0x419c8, 0x0}, +- {0x419c9, 0x0}, +- {0x419ca, 0x0}, +- {0x419cb, 0x0}, +- {0x419cc, 0x0}, +- {0x419cd, 0x0}, +- {0x419ce, 0x0}, +- {0x419cf, 0x0}, +- {0x419d0, 0x0}, +- {0x419d1, 0x0}, +- {0x419d2, 0x0}, +- {0x419d3, 0x0}, +- {0x419d4, 0x0}, +- {0x419d5, 0x0}, +- {0x419d6, 0x0}, +- {0x419d7, 0x0}, +- {0x419d8, 0x0}, +- {0x419d9, 0x0}, +- {0x419da, 0x0}, +- {0x419db, 0x0}, +- {0x419dc, 0x0}, +- {0x419dd, 0x0}, +- {0x419de, 0x0}, +- {0x419df, 0x0}, +- {0x419e0, 0x0}, +- {0x419e1, 0x0}, +- {0x419e2, 0x0}, +- {0x419e3, 0x0}, +- {0x419e4, 0x0}, +- {0x419e5, 0x0}, +- {0x419e6, 0x0}, +- {0x419e7, 0x0}, +- {0x419e8, 0x0}, +- {0x419e9, 0x0}, +- {0x419ea, 0x0}, +- {0x419eb, 0x0}, +- {0x419ec, 0x0}, +- {0x419ed, 0x0}, +- {0x419ee, 0x0}, +- {0x419ef, 0x0}, +- {0x419f0, 0x0}, +- {0x419f1, 0x0}, +- {0x419f2, 0x0}, +- {0x419f3, 0x0}, +- {0x419f4, 0x0}, +- {0x419f5, 0x0}, +- {0x419f6, 0x0}, +- {0x419f7, 0x0}, +- {0x419f8, 0x0}, +- {0x419f9, 0x0}, +- {0x419fa, 0x0}, +- {0x419fb, 0x0}, +- {0x419fc, 0x0}, +- {0x419fd, 0x0}, +- {0x419fe, 0x0}, +- {0x419ff, 0x0}, +- {0x41a00, 0x0}, +- {0x41a01, 0x0}, +- {0x41a02, 0x0}, +- {0x41a03, 0x0}, +- {0x41a04, 0x0}, +- {0x41a05, 0x0}, +- {0x41a06, 0x0}, +- {0x41a07, 0x0}, +- {0x41a08, 0x0}, +- {0x41a09, 0x0}, +- {0x41a0a, 0x0}, +- {0x41a0b, 0x0}, +- {0x41a0c, 0x0}, +- {0x41a0d, 0x0}, +- {0x41a0e, 0x0}, +- {0x41a0f, 0x0}, +- {0x41a10, 0x0}, +- {0x41a11, 0x0}, +- {0x41a12, 0x0}, +- {0x41a13, 0x0}, +- {0x41a14, 0x0}, +- {0x41a15, 0x0}, +- {0x41a16, 0x0}, +- {0x41a17, 0x0}, +- {0x41a18, 0x0}, +- {0x41a19, 0x0}, +- {0x41a1a, 0x0}, +- {0x41a1b, 0x0}, +- {0x41a1c, 0x0}, +- {0x41a1d, 0x0}, +- {0x41a1e, 0x0}, +- {0x41a1f, 0x0}, +- {0x41a20, 0x0}, +- {0x41a21, 0x0}, +- {0x41a22, 0x0}, +- {0x41a23, 0x0}, +- {0x41a24, 0x0}, +- {0x41a25, 0x0}, +- {0x41a26, 0x0}, +- {0x41a27, 0x0}, +- {0x41a28, 0x0}, +- {0x41a29, 0x0}, +- {0x41a2a, 0x0}, +- {0x41a2b, 0x0}, +- {0x41a2c, 0x0}, +- {0x41a2d, 0x0}, +- {0x41a2e, 0x0}, +- {0x41a2f, 0x0}, +- {0x41a30, 0x0}, +- {0x41a31, 0x0}, +- {0x41a32, 0x0}, +- {0x41a33, 0x0}, +- {0x41a34, 0x0}, +- {0x41a35, 0x0}, +- {0x41a36, 0x0}, +- {0x41a37, 0x0}, +- {0x41a38, 0x0}, +- {0x41a39, 0x0}, +- {0x41a3a, 0x0}, +- {0x41a3b, 0x0}, +- {0x41a3c, 0x0}, +- {0x41a3d, 0x0}, +- {0x41a3e, 0x0}, +- {0x41a3f, 0x0}, +- {0x41a40, 0x0}, +- {0x41a41, 0x0}, +- {0x41a42, 0x0}, +- {0x41a43, 0x0}, +- {0x41a44, 0x0}, +- {0x41a45, 0x0}, +- {0x41a46, 0x0}, +- {0x41a47, 0x0}, +- {0x41a48, 0x0}, +- {0x41a49, 0x0}, +- {0x41a4a, 0x0}, +- {0x41a4b, 0x0}, +- {0x41a4c, 0x0}, +- {0x41a4d, 0x0}, +- {0x41a4e, 0x0}, +- {0x41a4f, 0x0}, +- {0x41a50, 0x0}, +- {0x41a51, 0x0}, +- {0x41a52, 0x0}, +- {0x41a53, 0x0}, +- {0x41a54, 0x0}, +- {0x41a55, 0x0}, +- {0x41a56, 0x0}, +- {0x41a57, 0x0}, +- {0x41a58, 0x0}, +- {0x41a59, 0x0}, +- {0x41a5a, 0x0}, +- {0x41a5b, 0x0}, +- {0x41a5c, 0x0}, +- {0x41a5d, 0x0}, +- {0x41a5e, 0x0}, +- {0x41a5f, 0x0}, +- {0x41a60, 0x0}, +- {0x41a61, 0x0}, +- {0x41a62, 0x0}, +- {0x41a63, 0x0}, +- {0x41a64, 0x0}, +- {0x41a65, 0x0}, +- {0x41a66, 0x0}, +- {0x41a67, 0x0}, +- {0x41a68, 0x0}, +- {0x41a69, 0x0}, +- {0x41a6a, 0x0}, +- {0x41a6b, 0x0}, +- {0x41a6c, 0x0}, +- {0x41a6d, 0x0}, +- {0x41a6e, 0x0}, +- {0x41a6f, 0x0}, +- {0x41a70, 0x0}, +- {0x41a71, 0x0}, +- {0x41a72, 0x0}, +- {0x41a73, 0x0}, +- {0x41a74, 0x0}, +- {0x41a75, 0x0}, +- {0x41a76, 0x0}, +- {0x41a77, 0x0}, +- {0x41a78, 0x0}, +- {0x41a79, 0x0}, +- {0x41a7a, 0x0}, +- {0x41a7b, 0x0}, +- {0x41a7c, 0x0}, +- {0x41a7d, 0x0}, +- {0x41a7e, 0x0}, +- {0x41a7f, 0x0}, +- {0x41a80, 0x0}, +- {0x41a81, 0x0}, +- {0x41a82, 0x0}, +- {0x41a83, 0x0}, +- {0x41a84, 0x0}, +- {0x41a85, 0x0}, +- {0x41a86, 0x0}, +- {0x41a87, 0x0}, +- {0x41a88, 0x0}, +- {0x41a89, 0x0}, +- {0x41a8a, 0x0}, +- {0x41a8b, 0x0}, +- {0x41a8c, 0x0}, +- {0x41a8d, 0x0}, +- {0x41a8e, 0x0}, +- {0x41a8f, 0x0}, +- {0x41a90, 0x0}, +- {0x41a91, 0x0}, +- {0x41a92, 0x0}, +- {0x41a93, 0x0}, +- {0x41a94, 0x0}, +- {0x41a95, 0x0}, +- {0x41a96, 0x0}, +- {0x41a97, 0x0}, +- {0x41a98, 0x0}, +- {0x41a99, 0x0}, +- {0x41a9a, 0x0}, +- {0x41a9b, 0x0}, +- {0x41a9c, 0x0}, +- {0x41a9d, 0x0}, +- {0x41a9e, 0x0}, +- {0x41a9f, 0x0}, +- {0x41aa0, 0x0}, +- {0x41aa1, 0x0}, +- {0x41aa2, 0x0}, +- {0x41aa3, 0x0}, +- {0x41aa4, 0x0}, +- {0x41aa5, 0x0}, +- {0x41aa6, 0x0}, +- {0x41aa7, 0x0}, +- {0x41aa8, 0x0}, +- {0x41aa9, 0x0}, +- {0x41aaa, 0x0}, +- {0x41aab, 0x0}, +- {0x41aac, 0x0}, +- {0x41aad, 0x0}, +- {0x41aae, 0x0}, +- {0x41aaf, 0x0}, +- {0x41ab0, 0x0}, +- {0x41ab1, 0x0}, +- {0x41ab2, 0x0}, +- {0x41ab3, 0x0}, +- {0x41ab4, 0x0}, +- {0x41ab5, 0x0}, +- {0x41ab6, 0x0}, +- {0x41ab7, 0x0}, +- {0x41ab8, 0x0}, +- {0x41ab9, 0x0}, +- {0x41aba, 0x0}, +- {0x41abb, 0x0}, +- {0x41abc, 0x0}, +- {0x41abd, 0x0}, +- {0x41abe, 0x0}, +- {0x41abf, 0x0}, +- {0x41ac0, 0x0}, +- {0x41ac1, 0x0}, +- {0x41ac2, 0x0}, +- {0x41ac3, 0x0}, +- {0x41ac4, 0x0}, +- {0x41ac5, 0x0}, +- {0x41ac6, 0x0}, +- {0x41ac7, 0x0}, +- {0x41ac8, 0x0}, +- {0x41ac9, 0x0}, +- {0x41aca, 0x0}, +- {0x41acb, 0x0}, +- {0x41acc, 0x0}, +- {0x41acd, 0x0}, +- {0x41ace, 0x0}, +- {0x41acf, 0x0}, +- {0x41ad0, 0x0}, +- {0x41ad1, 0x0}, +- {0x41ad2, 0x0}, +- {0x41ad3, 0x0}, +- {0x41ad4, 0x0}, +- {0x41ad5, 0x0}, +- {0x41ad6, 0x0}, +- {0x41ad7, 0x0}, +- {0x41ad8, 0x0}, +- {0x41ad9, 0x0}, +- {0x41ada, 0x0}, +- {0x41adb, 0x0}, +- {0x41adc, 0x0}, +- {0x41add, 0x0}, +- {0x41ade, 0x0}, +- {0x41adf, 0x0}, +- {0x41ae0, 0x0}, +- {0x41ae1, 0x0}, +- {0x41ae2, 0x0}, +- {0x41ae3, 0x0}, +- {0x41ae4, 0x0}, +- {0x41ae5, 0x0}, +- {0x41ae6, 0x0}, +- {0x41ae7, 0x0}, +- {0x41ae8, 0x0}, +- {0x41ae9, 0x0}, +- {0x41aea, 0x0}, +- {0x41aeb, 0x0}, +- {0x41aec, 0x0}, +- {0x41aed, 0x0}, +- {0x41aee, 0x0}, +- {0x41aef, 0x0}, +- {0x41af0, 0x0}, +- {0x41af1, 0x0}, +- {0x41af2, 0x0}, +- {0x41af3, 0x0}, +- {0x41af4, 0x0}, +- {0x41af5, 0x0}, +- {0x41af6, 0x0}, +- {0x41af7, 0x0}, +- {0x41af8, 0x0}, +- {0x41af9, 0x0}, +- {0x41afa, 0x0}, +- {0x41afb, 0x0}, +- {0x41afc, 0x0}, +- {0x41afd, 0x0}, +- {0x41afe, 0x0}, +- {0x41aff, 0x0}, +- {0x41b00, 0x0}, +- {0x41b01, 0x0}, +- {0x41b02, 0x0}, +- {0x41b03, 0x0}, +- {0x41b04, 0x0}, +- {0x41b05, 0x0}, +- {0x41b06, 0x0}, +- {0x41b07, 0x0}, +- {0x41b08, 0x0}, +- {0x41b09, 0x0}, +- {0x41b0a, 0x0}, +- {0x41b0b, 0x0}, +- {0x41b0c, 0x0}, +- {0x41b0d, 0x0}, +- {0x41b0e, 0x0}, +- {0x41b0f, 0x0}, +- {0x41b10, 0x0}, +- {0x41b11, 0x0}, +- {0x41b12, 0x0}, +- {0x41b13, 0x0}, +- {0x41b14, 0x0}, +- {0x41b15, 0x0}, +- {0x41b16, 0x0}, +- {0x41b17, 0x0}, +- {0x41b18, 0x0}, +- {0x41b19, 0x0}, +- {0x41b1a, 0x0}, +- {0x41b1b, 0x0}, +- {0x41b1c, 0x0}, +- {0x41b1d, 0x0}, +- {0x41b1e, 0x0}, +- {0x41b1f, 0x0}, +- {0x41b20, 0x0}, +- {0x41b21, 0x0}, +- {0x41b22, 0x0}, +- {0x41b23, 0x0}, +- {0x41b24, 0x0}, +- {0x41b25, 0x0}, +- {0x41b26, 0x0}, +- {0x41b27, 0x0}, +- {0x41b28, 0x0}, +- {0x41b29, 0x0}, +- {0x41b2a, 0x0}, +- {0x41b2b, 0x0}, +- {0x41b2c, 0x0}, +- {0x41b2d, 0x0}, +- {0x41b2e, 0x0}, +- {0x41b2f, 0x0}, +- {0x41b30, 0x0}, +- {0x41b31, 0x0}, +- {0x41b32, 0x0}, +- {0x41b33, 0x0}, +- {0x41b34, 0x0}, +- {0x41b35, 0x0}, +- {0x41b36, 0x0}, +- {0x41b37, 0x0}, +- {0x41b38, 0x0}, +- {0x41b39, 0x0}, +- {0x41b3a, 0x0}, +- {0x41b3b, 0x0}, +- {0x41b3c, 0x0}, +- {0x41b3d, 0x0}, +- {0x41b3e, 0x0}, +- {0x41b3f, 0x0}, +- {0x41b40, 0x0}, +- {0x41b41, 0x0}, +- {0x41b42, 0x0}, +- {0x41b43, 0x0}, +- {0x41b44, 0x0}, +- {0x41b45, 0x0}, +- {0x41b46, 0x0}, +- {0x41b47, 0x0}, +- {0x41b48, 0x0}, +- {0x41b49, 0x0}, +- {0x41b4a, 0x0}, +- {0x41b4b, 0x0}, +- {0x41b4c, 0x0}, +- {0x41b4d, 0x0}, +- {0x41b4e, 0x0}, +- {0x41b4f, 0x0}, +- {0x41b50, 0x0}, +- {0x41b51, 0x0}, +- {0x41b52, 0x0}, +- {0x41b53, 0x0}, +- {0x41b54, 0x0}, +- {0x41b55, 0x0}, +- {0x41b56, 0x0}, +- {0x41b57, 0x0}, +- {0x41b58, 0x0}, +- {0x41b59, 0x0}, +- {0x41b5a, 0x0}, +- {0x41b5b, 0x0}, +- {0x41b5c, 0x0}, +- {0x41b5d, 0x0}, +- {0x41b5e, 0x0}, +- {0x41b5f, 0x0}, +- {0x41b60, 0x0}, +- {0x41b61, 0x0}, +- {0x41b62, 0x0}, +- {0x41b63, 0x0}, +- {0x41b64, 0x0}, +- {0x41b65, 0x0}, +- {0x41b66, 0x0}, +- {0x41b67, 0x0}, +- {0x41b68, 0x0}, +- {0x41b69, 0x0}, +- {0x41b6a, 0x0}, +- {0x41b6b, 0x0}, +- {0x41b6c, 0x0}, +- {0x41b6d, 0x0}, +- {0x41b6e, 0x0}, +- {0x41b6f, 0x0}, +- {0x41b70, 0x0}, +- {0x41b71, 0x0}, +- {0x41b72, 0x0}, +- {0x41b73, 0x0}, +- {0x41b74, 0x0}, +- {0x41b75, 0x0}, +- {0x41b76, 0x0}, +- {0x41b77, 0x0}, +- {0x41b78, 0x0}, +- {0x41b79, 0x0}, +- {0x41b7a, 0x0}, +- {0x41b7b, 0x0}, +- {0x41b7c, 0x0}, +- {0x41b7d, 0x0}, +- {0x41b7e, 0x0}, +- {0x41b7f, 0x0}, +- {0x41b80, 0x0}, +- {0x41b81, 0x0}, +- {0x41b82, 0x0}, +- {0x41b83, 0x0}, +- {0x41b84, 0x0}, +- {0x41b85, 0x0}, +- {0x41b86, 0x0}, +- {0x41b87, 0x0}, +- {0x41b88, 0x0}, +- {0x41b89, 0x0}, +- {0x41b8a, 0x0}, +- {0x41b8b, 0x0}, +- {0x41b8c, 0x0}, +- {0x41b8d, 0x0}, +- {0x41b8e, 0x0}, +- {0x41b8f, 0x0}, +- {0x41b90, 0x0}, +- {0x41b91, 0x0}, +- {0x41b92, 0x0}, +- {0x41b93, 0x0}, +- {0x41b94, 0x0}, +- {0x41b95, 0x0}, +- {0x41b96, 0x0}, +- {0x41b97, 0x0}, +- {0x41b98, 0x0}, +- {0x41b99, 0x0}, +- {0x41b9a, 0x0}, +- {0x41b9b, 0x0}, +- {0x41b9c, 0x0}, +- {0x41b9d, 0x0}, +- {0x41b9e, 0x0}, +- {0x41b9f, 0x0}, +- {0x41ba0, 0x0}, +- {0x41ba1, 0x0}, +- {0x41ba2, 0x0}, +- {0x41ba3, 0x0}, +- {0x41ba4, 0x0}, +- {0x41ba5, 0x0}, +- {0x41ba6, 0x0}, +- {0x41ba7, 0x0}, +- {0x41ba8, 0x0}, +- {0x41ba9, 0x0}, +- {0x41baa, 0x0}, +- {0x41bab, 0x0}, +- {0x41bac, 0x0}, +- {0x41bad, 0x0}, +- {0x41bae, 0x0}, +- {0x41baf, 0x0}, +- {0x41bb0, 0x0}, +- {0x41bb1, 0x0}, +- {0x41bb2, 0x0}, +- {0x41bb3, 0x0}, +- {0x41bb4, 0x0}, +- {0x41bb5, 0x0}, +- {0x41bb6, 0x0}, +- {0x41bb7, 0x0}, +- {0x41bb8, 0x0}, +- {0x41bb9, 0x0}, +- {0x41bba, 0x0}, +- {0x41bbb, 0x0}, +- {0x41bbc, 0x0}, +- {0x41bbd, 0x0}, +- {0x41bbe, 0x0}, +- {0x41bbf, 0x0}, +- {0x41bc0, 0x0}, +- {0x41bc1, 0x0}, +- {0x41bc2, 0x0}, +- {0x41bc3, 0x0}, +- {0x41bc4, 0x0}, +- {0x41bc5, 0x0}, +- {0x41bc6, 0x0}, +- {0x41bc7, 0x0}, +- {0x41bc8, 0x0}, +- {0x41bc9, 0x0}, +- {0x41bca, 0x0}, +- {0x41bcb, 0x0}, +- {0x41bcc, 0x0}, +- {0x41bcd, 0x0}, +- {0x41bce, 0x0}, +- {0x41bcf, 0x0}, +- {0x41bd0, 0x0}, +- {0x41bd1, 0x0}, +- {0x41bd2, 0x0}, +- {0x41bd3, 0x0}, +- {0x41bd4, 0x0}, +- {0x41bd5, 0x0}, +- {0x41bd6, 0x0}, +- {0x41bd7, 0x0}, +- {0x41bd8, 0x0}, +- {0x41bd9, 0x0}, +- {0x41bda, 0x0}, +- {0x41bdb, 0x0}, +- {0x41bdc, 0x0}, +- {0x41bdd, 0x0}, +- {0x41bde, 0x0}, +- {0x41bdf, 0x0}, +- {0x41be0, 0x0}, +- {0x41be1, 0x0}, +- {0x41be2, 0x0}, +- {0x41be3, 0x0}, +- {0x41be4, 0x0}, +- {0x41be5, 0x0}, +- {0x41be6, 0x0}, +- {0x41be7, 0x0}, +- {0x41be8, 0x0}, +- {0x41be9, 0x0}, +- {0x41bea, 0x0}, +- {0x41beb, 0x0}, +- {0x41bec, 0x0}, +- {0x41bed, 0x0}, +- {0x41bee, 0x0}, +- {0x41bef, 0x0}, +- {0x41bf0, 0x0}, +- {0x41bf1, 0x0}, +- {0x41bf2, 0x0}, +- {0x41bf3, 0x0}, +- {0x41bf4, 0x0}, +- {0x41bf5, 0x0}, +- {0x41bf6, 0x0}, +- {0x41bf7, 0x0}, +- {0x41bf8, 0x0}, +- {0x41bf9, 0x0}, +- {0x41bfa, 0x0}, +- {0x41bfb, 0x0}, +- {0x41bfc, 0x0}, +- {0x41bfd, 0x0}, +- {0x41bfe, 0x0}, +- {0x41bff, 0x0}, +- {0x41c00, 0x0}, +- {0x41c01, 0x0}, +- {0x41c02, 0x0}, +- {0x41c03, 0x0}, +- {0x41c04, 0x0}, +- {0x41c05, 0x0}, +- {0x41c06, 0x0}, +- {0x41c07, 0x0}, +- {0x41c08, 0x0}, +- {0x41c09, 0x0}, +- {0x41c0a, 0x0}, +- {0x41c0b, 0x0}, +- {0x41c0c, 0x0}, +- {0x41c0d, 0x0}, +- {0x41c0e, 0x0}, +- {0x41c0f, 0x0}, +- {0x41c10, 0x0}, +- {0x41c11, 0x0}, +- {0x41c12, 0x0}, +- {0x41c13, 0x0}, +- {0x41c14, 0x0}, +- {0x41c15, 0x0}, +- {0x41c16, 0x0}, +- {0x41c17, 0x0}, +- {0x41c18, 0x0}, +- {0x41c19, 0x0}, +- {0x41c1a, 0x0}, +- {0x41c1b, 0x0}, +- {0x41c1c, 0x0}, +- {0x41c1d, 0x0}, +- {0x41c1e, 0x0}, +- {0x41c1f, 0x0}, +- {0x41c20, 0x0}, +- {0x41c21, 0x0}, +- {0x41c22, 0x0}, +- {0x41c23, 0x0}, +- {0x41c24, 0x0}, +- {0x41c25, 0x0}, +- {0x41c26, 0x0}, +- {0x41c27, 0x0}, +- {0x41c28, 0x0}, +- {0x41c29, 0x0}, +- {0x41c2a, 0x0}, +- {0x41c2b, 0x0}, +- {0x41c2c, 0x0}, +- {0x41c2d, 0x0}, +- {0x41c2e, 0x0}, +- {0x41c2f, 0x0}, +- {0x41c30, 0x0}, +- {0x41c31, 0x0}, +- {0x41c32, 0x0}, +- {0x41c33, 0x0}, +- {0x41c34, 0x0}, +- {0x41c35, 0x0}, +- {0x41c36, 0x0}, +- {0x41c37, 0x0}, +- {0x41c38, 0x0}, +- {0x41c39, 0x0}, +- {0x41c3a, 0x0}, +- {0x41c3b, 0x0}, +- {0x41c3c, 0x0}, +- {0x41c3d, 0x0}, +- {0x41c3e, 0x0}, +- {0x41c3f, 0x0}, +- {0x41c40, 0x0}, +- {0x41c41, 0x0}, +- {0x41c42, 0x0}, +- {0x41c43, 0x0}, +- {0x41c44, 0x0}, +- {0x41c45, 0x0}, +- {0x41c46, 0x0}, +- {0x41c47, 0x0}, +- {0x41c48, 0x0}, +- {0x41c49, 0x0}, +- {0x41c4a, 0x0}, +- {0x41c4b, 0x0}, +- {0x41c4c, 0x0}, +- {0x41c4d, 0x0}, +- {0x41c4e, 0x0}, +- {0x41c4f, 0x0}, +- {0x41c50, 0x0}, +- {0x41c51, 0x0}, +- {0x41c52, 0x0}, +- {0x41c53, 0x0}, +- {0x41c54, 0x0}, +- {0x41c55, 0x0}, +- {0x41c56, 0x0}, +- {0x41c57, 0x0}, +- {0x9002e, 0x0}, +- {0x9002f, 0x0}, +- {0x90030, 0x0}, +- {0x90031, 0x0}, +- {0x90032, 0x0}, +- {0x90033, 0x0}, +- {0x90034, 0x0}, +- {0x90035, 0x0}, +- {0x90036, 0x0}, +- {0x90037, 0x0}, +- {0x90038, 0x0}, +- {0x90039, 0x0}, +- {0x9003a, 0x0}, +- {0x9003b, 0x0}, +- {0x9003c, 0x0}, +- {0x9003d, 0x0}, +- {0x9003e, 0x0}, +- {0x9003f, 0x0}, +- {0x90040, 0x0}, +- {0x90041, 0x0}, +- {0x90042, 0x0}, +- {0x90043, 0x0}, +- {0x90044, 0x0}, +- {0x90045, 0x0}, +- {0x90046, 0x0}, +- {0x90047, 0x0}, +- {0x90048, 0x0}, +- {0x90049, 0x0}, +- {0x9004a, 0x0}, +- {0x9004b, 0x0}, +- {0x9004c, 0x0}, +- {0x9004d, 0x0}, +- {0x9004e, 0x0}, +- {0x9004f, 0x0}, +- {0x90050, 0x0}, +- {0x90051, 0x0}, +- {0x90052, 0x0}, +- {0x90053, 0x0}, +- {0x90054, 0x0}, +- {0x90055, 0x0}, +- {0x90056, 0x0}, +- {0x90057, 0x0}, +- {0x90058, 0x0}, +- {0x90059, 0x0}, +- {0x9005a, 0x0}, +- {0x9005b, 0x0}, +- {0x9005c, 0x0}, +- {0x9005d, 0x0}, +- {0x9005e, 0x0}, +- {0x9005f, 0x0}, +- {0x90060, 0x0}, +- {0x90061, 0x0}, +- {0x90062, 0x0}, +- {0x90063, 0x0}, +- {0x90064, 0x0}, +- {0x90065, 0x0}, +- {0x90066, 0x0}, +- {0x90067, 0x0}, +- {0x90068, 0x0}, +- {0x90069, 0x0}, +- {0x9006a, 0x0}, +- {0x9006b, 0x0}, +- {0x9006c, 0x0}, +- {0x9006d, 0x0}, +- {0x9006e, 0x0}, +- {0x9006f, 0x0}, +- {0x90070, 0x0}, +- {0x90071, 0x0}, +- {0x90072, 0x0}, +- {0x90073, 0x0}, +- {0x90074, 0x0}, +- {0x90075, 0x0}, +- {0x90076, 0x0}, +- {0x90077, 0x0}, +- {0x90078, 0x0}, +- {0x90079, 0x0}, +- {0x9007a, 0x0}, +- {0x9007b, 0x0}, +- {0x9007c, 0x0}, +- {0x9007d, 0x0}, +- {0x9007e, 0x0}, +- {0x9007f, 0x0}, +- {0x90080, 0x0}, +- {0x90081, 0x0}, +- {0x90082, 0x0}, +- {0x90083, 0x0}, +- {0x90084, 0x0}, +- {0x90085, 0x0}, +- {0x90086, 0x0}, +- {0x90087, 0x0}, +- {0x90088, 0x0}, +- {0x90089, 0x0}, +- {0x9008a, 0x0}, +- {0x9008b, 0x0}, +- {0x9008c, 0x0}, +- {0x9008d, 0x0}, +- {0x9008e, 0x0}, +- {0x9008f, 0x0}, +- {0x90090, 0x0}, +- {0x90091, 0x0}, +- {0x90092, 0x0}, +- {0x90093, 0x0}, +- {0x90094, 0x0}, +- {0x90095, 0x0}, +- {0x90096, 0x0}, +- {0x90097, 0x0}, +- {0x90098, 0x0}, +- {0x90099, 0x0}, +- {0x9009a, 0x0}, +- {0x9009b, 0x0}, +- {0x9009c, 0x0}, +- {0x9009d, 0x0}, +- {0x9009e, 0x0}, +- {0x9009f, 0x0}, +- {0x900a0, 0x0}, +- {0x900a1, 0x0}, +- {0x900a2, 0x0}, +- {0x900a3, 0x0}, +- {0x900a4, 0x0}, +- {0x900a5, 0x0}, +- {0x900a6, 0x0}, +- {0x900a7, 0x0}, +- {0x900a8, 0x0}, +- {0x900a9, 0x0}, +- {0x900aa, 0x0}, +- {0x900ab, 0x0}, +- {0x900ac, 0x0}, +- {0x900ad, 0x0}, +- {0x900ae, 0x0}, +- {0x900af, 0x0}, +- {0x900b0, 0x0}, +- {0x900b1, 0x0}, +- {0x900b2, 0x0}, +- {0x900b3, 0x0}, +- {0x900b4, 0x0}, +- {0x900b5, 0x0}, +- {0x900b6, 0x0}, +- {0x900b7, 0x0}, +- {0x900b8, 0x0}, +- {0x900b9, 0x0}, +- {0x900ba, 0x0}, +- {0x900bb, 0x0}, +- {0x900bc, 0x0}, +- {0x900bd, 0x0}, +- {0x900be, 0x0}, +- {0x900bf, 0x0}, +- {0x900c0, 0x0}, +- {0x900c1, 0x0}, +- {0x900c2, 0x0}, +- {0x900c3, 0x0}, +- {0x900c4, 0x0}, +- {0x900c5, 0x0}, +- {0x900c6, 0x0}, +- {0x900c7, 0x0}, +- {0x900c8, 0x0}, +- {0x900c9, 0x0}, +- {0x900ca, 0x0}, +- {0x900cb, 0x0}, +- {0x900cc, 0x0}, +- {0x900cd, 0x0}, +- {0x900ce, 0x0}, +- {0x900cf, 0x0}, +- {0x900d0, 0x0}, +- {0x900d1, 0x0}, +- {0x900d2, 0x0}, +- {0x900d3, 0x0}, +- {0x900d4, 0x0}, +- {0x900d5, 0x0}, +- {0x900d6, 0x0}, +- {0x900d7, 0x0}, +- {0x900d8, 0x0}, +- {0x900d9, 0x0}, +- {0x900da, 0x0}, +- {0x900db, 0x0}, +- {0x900dc, 0x0}, +- {0x900dd, 0x0}, +- {0x900de, 0x0}, +- {0x900df, 0x0}, +- {0x900e0, 0x0}, +- {0x900e1, 0x0}, +- {0x900e2, 0x0}, +- {0x900e3, 0x0}, +- {0x900e4, 0x0}, +- {0x900e5, 0x0}, +- {0x900e6, 0x0}, +- {0x900e7, 0x0}, +- {0x900e8, 0x0}, +- {0x900e9, 0x0}, +- {0x900ea, 0x0}, +- {0x900eb, 0x0}, +- {0x900ec, 0x0}, +- {0x900ed, 0x0}, +- {0x900ee, 0x0}, +- {0x900ef, 0x0}, +- {0x900f0, 0x0}, +- {0x900f1, 0x0}, +- {0x900f2, 0x0}, +- {0x900f3, 0x0}, +- {0x900f4, 0x0}, +- {0x900f5, 0x0}, +- {0x900f6, 0x0}, +- {0x900f7, 0x0}, +- {0x900f8, 0x0}, +- {0x900f9, 0x0}, +- {0x900fa, 0x0}, +- {0x900fb, 0x0}, +- {0x900fc, 0x0}, +- {0x900fd, 0x0}, +- {0x900fe, 0x0}, +- {0x900ff, 0x0}, +- {0x90100, 0x0}, +- {0x90101, 0x0}, +- {0x90102, 0x0}, +- {0x90103, 0x0}, +- {0x90104, 0x0}, +- {0x90105, 0x0}, +- {0x90106, 0x0}, +- {0x90107, 0x0}, +- {0x90108, 0x0}, +- {0x90109, 0x0}, +- {0x9010a, 0x0}, +- {0x9010b, 0x0}, +- {0x9010c, 0x0}, +- {0x9010d, 0x0}, +- {0x9010e, 0x0}, +- {0x9010f, 0x0}, +- {0x90110, 0x0}, +- {0x90111, 0x0}, +- {0x90112, 0x0}, +- {0x90113, 0x0}, +- {0x90114, 0x0}, +- {0x90115, 0x0}, +- {0x90116, 0x0}, +- {0x90117, 0x0}, +- {0x90118, 0x0}, +- {0x90119, 0x0}, +- {0x9011a, 0x0}, +- {0x9011b, 0x0}, +- {0x9011c, 0x0}, +- {0x9011d, 0x0}, +- {0x9011e, 0x0}, +- {0x9011f, 0x0}, +- {0x90120, 0x0}, +- {0x90121, 0x0}, +- {0x90122, 0x0}, +- {0x90123, 0x0}, +- {0x90124, 0x0}, +- {0x90125, 0x0}, +- {0x90126, 0x0}, +- {0x90127, 0x0}, +- {0x90128, 0x0}, +- {0x90129, 0x0}, +- {0x9012a, 0x0}, +- {0x9012b, 0x0}, +- {0x9012c, 0x0}, +- {0x9012d, 0x0}, +- {0x9012e, 0x0}, +- {0x9012f, 0x0}, +- {0x90130, 0x0}, +- {0x90131, 0x0}, +- {0x90132, 0x0}, +- {0x90133, 0x0}, +- {0x90134, 0x0}, +- {0x90135, 0x0}, +- {0x90136, 0x0}, +- {0x90137, 0x0}, +- {0x90138, 0x0}, +- {0x90139, 0x0}, +- {0x9013a, 0x0}, +- {0x9013b, 0x0}, +- {0x9013c, 0x0}, +- {0x9013d, 0x0}, +- {0x9013e, 0x0}, +- {0x9013f, 0x0}, +- {0x90140, 0x0}, +- {0x90141, 0x0}, +- {0x90142, 0x0}, +- {0x90143, 0x0}, +- {0x90144, 0x0}, +- {0x90145, 0x0}, +- {0x90146, 0x0}, +- {0x90147, 0x0}, +- {0x90148, 0x0}, +- {0x90149, 0x0}, +- {0x9014a, 0x0}, +- {0x9014b, 0x0}, +- {0x9014c, 0x0}, +- {0x9014d, 0x0}, +- {0x9014e, 0x0}, +- {0x9014f, 0x0}, +- {0x90150, 0x0}, +- {0x90151, 0x0}, +- {0x90152, 0x0}, +- {0x90153, 0x0}, +- {0x90154, 0x0}, +- {0x90155, 0x0}, +- {0x90156, 0x0}, +- {0x90157, 0x0}, +- {0x90158, 0x0}, +- {0x90159, 0x0}, +- {0x9015a, 0x0}, +- {0x9015b, 0x0}, +- {0x9015c, 0x0}, +- {0x9015d, 0x0}, +- {0x9015e, 0x0}, +- {0x9015f, 0x0}, +- {0x90160, 0x0}, +- {0x90161, 0x0}, +- {0x90162, 0x0}, +- {0x90163, 0x0}, +- {0x90164, 0x0}, +- {0x90165, 0x0}, +- {0x90166, 0x0}, +- {0x90167, 0x0}, +- {0x90168, 0x0}, +- {0x90169, 0x0}, +- {0x9016a, 0x0}, +- {0x9016b, 0x0}, +- {0x9016c, 0x0}, +- {0x9016d, 0x0}, +- {0x9016e, 0x0}, +- {0x9016f, 0x0}, +- {0x90170, 0x0}, +- {0x90171, 0x0}, +- {0x90172, 0x0}, +- {0x90173, 0x0}, +- {0x90174, 0x0}, +- {0x90175, 0x0}, +- {0x90176, 0x0}, +- {0x90177, 0x0}, +- {0x90178, 0x0}, +- {0x90179, 0x0}, +- {0x9017a, 0x0}, +- {0x9017b, 0x0}, +- {0x9017c, 0x0}, +- {0x9017d, 0x0}, +- {0x9017e, 0x0}, +- {0x9017f, 0x0}, +- {0x90180, 0x0}, +- {0x90181, 0x0}, +- {0x90182, 0x0}, +- {0x90183, 0x0}, +- {0x90184, 0x0}, +- {0x90185, 0x0}, +- {0x90186, 0x0}, +- {0x90187, 0x0}, +- {0x90188, 0x0}, +- {0x90189, 0x0}, +- {0x9018a, 0x0}, +- {0x9018b, 0x0}, +- {0x9018c, 0x0}, +- {0x9018d, 0x0}, +- {0x9018e, 0x0}, +- {0x9018f, 0x0}, +- {0x90190, 0x0}, +- {0x90191, 0x0}, +- {0x90192, 0x0}, +- {0x90193, 0x0}, +- {0x90194, 0x0}, +- {0x90195, 0x0}, +- {0x90196, 0x0}, +- {0x90197, 0x0}, +- {0x90198, 0x0}, +- {0x90199, 0x0}, +- {0x9019a, 0x0}, +- {0x9019b, 0x0}, +- {0x9019c, 0x0}, +- {0x9019d, 0x0}, +- {0x9019e, 0x0}, +- {0x9019f, 0x0}, +- {0x901a0, 0x0}, +- {0x901a1, 0x0}, +- {0x901a2, 0x0}, +- {0x901a3, 0x0}, +- {0x901a4, 0x0}, +- {0x901a5, 0x0}, +- {0x901a6, 0x0}, +- {0x901a7, 0x0}, +- {0x901a8, 0x0}, +- {0x901a9, 0x0}, +- {0x901aa, 0x0}, +- {0x901ab, 0x0}, +- {0x901ac, 0x0}, +- {0x901ad, 0x0}, +- {0x901ae, 0x0}, +- {0x901af, 0x0}, +- {0x901b0, 0x0}, +- {0x901b1, 0x0}, +- {0x901b2, 0x0}, +- {0x901b3, 0x0}, +- {0x901b4, 0x0}, +- {0x901b5, 0x0}, +- {0x901b6, 0x0}, +- {0x901b7, 0x0}, +- {0x901b8, 0x0}, +- {0x901b9, 0x0}, +- {0x901ba, 0x0}, +- {0x901bb, 0x0}, +- {0x901bc, 0x0}, +- {0x901bd, 0x0}, +- {0x901be, 0x0}, +- {0x901bf, 0x0}, +- {0x901c0, 0x0}, +- {0x901c1, 0x0}, +- {0x901c2, 0x0}, +- {0x901c3, 0x0}, +- {0x901c4, 0x0}, +- {0x901c5, 0x0}, +- {0x901c6, 0x0}, +- {0x901c7, 0x0}, +- {0x901c8, 0x0}, +- {0x901c9, 0x0}, +- {0x901ca, 0x0}, +- {0x901cb, 0x0}, +- {0x901cc, 0x0}, +- {0x901cd, 0x0}, +- {0x901ce, 0x0}, +- {0x901cf, 0x0}, +- {0x901d0, 0x0}, +- {0x901d1, 0x0}, +- {0x901d2, 0x0}, +- {0x901d3, 0x0}, +- {0x901d4, 0x0}, +- {0x901d5, 0x0}, +- {0x901d6, 0x0}, +- {0x901d7, 0x0}, +- {0x901d8, 0x0}, +- {0x901d9, 0x0}, +- {0x901da, 0x0}, +- {0x901db, 0x0}, +- {0x901dc, 0x0}, +- {0x901dd, 0x0}, +- {0x901de, 0x0}, +- {0x901df, 0x0}, +- {0x901e0, 0x0}, +- {0x901e1, 0x0}, +- {0x901e2, 0x0}, +- {0x901e3, 0x0}, +- {0x901e4, 0x0}, +- {0x901e5, 0x0}, +- {0x901e6, 0x0}, +- {0x901e7, 0x0}, +- {0x901e8, 0x0}, +- {0x901e9, 0x0}, +- {0x901ea, 0x0}, +- {0x901eb, 0x0}, +- {0x901ec, 0x0}, +- {0x901ed, 0x0}, +- {0x901ee, 0x0}, +- {0x901ef, 0x0}, +- {0x901f0, 0x0}, +- {0x901f1, 0x0}, +- {0x901f2, 0x0}, +- {0x901f3, 0x0}, +- {0x901f4, 0x0}, +- {0x901f5, 0x0}, +- {0x901f6, 0x0}, +- {0x901f7, 0x0}, +- {0x901f8, 0x0}, +- {0x901f9, 0x0}, +- {0x901fa, 0x0}, +- {0x901fb, 0x0}, +- {0x901fc, 0x0}, +- {0x901fd, 0x0}, +- {0x901fe, 0x0}, +- {0x901ff, 0x0}, +- {0x90200, 0x0}, +- {0x90201, 0x0}, +- {0x90202, 0x0}, +- {0x90203, 0x0}, +- {0x90204, 0x0}, +- {0x90205, 0x0}, +- {0x90206, 0x0}, +- {0x90207, 0x0}, +- {0x90208, 0x0}, +- {0x90209, 0x0}, +- {0x9020a, 0x0}, +- {0x9020b, 0x0}, +- {0x9020c, 0x0}, +- {0x9020d, 0x0}, +- {0x9020e, 0x0}, +- {0x9020f, 0x0}, +- {0x90210, 0x0}, +- {0x90211, 0x0}, +- {0x90212, 0x0}, +- {0x90213, 0x0}, +- {0x90214, 0x0}, +- {0x90215, 0x0}, +- {0x90216, 0x0}, +- {0x90217, 0x0}, +- {0x90218, 0x0}, +- {0x90219, 0x0}, +- {0x9021a, 0x0}, +- {0x9021b, 0x0}, +- {0x9021c, 0x0}, +- {0x9021d, 0x0}, +- {0x9021e, 0x0}, +- {0x9021f, 0x0}, +- {0x90220, 0x0}, +- {0x90221, 0x0}, +- {0x90222, 0x0}, +- {0x90223, 0x0}, +- {0x90224, 0x0}, +- {0x90225, 0x0}, +- {0x90226, 0x0}, +- {0x90227, 0x0}, +- {0x90228, 0x0}, +- {0x90229, 0x0}, +- {0x9022a, 0x0}, +- {0x9022b, 0x0}, +- {0x9022c, 0x0}, +- {0x9022d, 0x0}, +- {0x9022e, 0x0}, +- {0x9022f, 0x0}, +- {0x90230, 0x0}, +- {0x90231, 0x0}, +- {0x90232, 0x0}, +- {0x90233, 0x0}, +- {0x90234, 0x0}, +- {0x90235, 0x0}, +- {0x90236, 0x0}, +- {0x90237, 0x0}, +- {0x90238, 0x0}, +- {0x90239, 0x0}, +- {0x9023a, 0x0}, +- {0x9023b, 0x0}, +- {0x9023c, 0x0}, +- {0x9023d, 0x0}, +- {0x9023e, 0x0}, +- {0x9023f, 0x0}, +- {0x90240, 0x0}, +- {0x90241, 0x0}, +- {0x90242, 0x0}, +- {0x90243, 0x0}, +- {0x90244, 0x0}, +- {0x90245, 0x0}, +- {0x90246, 0x0}, +- {0x90247, 0x0}, +- {0x90248, 0x0}, +- {0x90249, 0x0}, +- {0x9024a, 0x0}, +- {0x9024b, 0x0}, +- {0x9024c, 0x0}, +- {0x9024d, 0x0}, +- {0x9024e, 0x0}, +- {0x9024f, 0x0}, +- {0x90250, 0x0}, +- {0x90251, 0x0}, +- {0x90252, 0x0}, +- {0x90253, 0x0}, +- {0x90254, 0x0}, +- {0x90255, 0x0}, +- {0x90256, 0x0}, +- {0x90257, 0x0}, +- {0x90258, 0x0}, +- {0x90259, 0x0}, +- {0x9025a, 0x0}, +- {0x9025b, 0x0}, +- {0x9025c, 0x0}, +- {0x9025d, 0x0}, +- {0x9025e, 0x0}, +- {0x9025f, 0x0}, +- {0x90260, 0x0}, +- {0x90261, 0x0}, +- {0x90262, 0x0}, +- {0x90263, 0x0}, +- {0x90264, 0x0}, +- {0x90265, 0x0}, +- {0x90266, 0x0}, +- {0x90267, 0x0}, +- {0x90268, 0x0}, +- {0x90269, 0x0}, +- {0x9026a, 0x0}, +- {0x9026b, 0x0}, +- {0x9026c, 0x0}, +- {0x9026d, 0x0}, +- {0x9026e, 0x0}, +- {0x9026f, 0x0}, +- {0x90270, 0x0}, +- {0x90271, 0x0}, +- {0x90272, 0x0}, +- {0x90273, 0x0}, +- {0x90274, 0x0}, +- {0x90275, 0x0}, +- {0x90276, 0x0}, +- {0x90277, 0x0}, +- {0x90278, 0x0}, +- {0x90279, 0x0}, +- {0x9027a, 0x0}, +- {0x9027b, 0x0}, +- {0x9027c, 0x0}, +- {0x9027d, 0x0}, +- {0x9027e, 0x0}, +- {0x9027f, 0x0}, +- {0x90280, 0x0}, +- {0x90281, 0x0}, +- {0x90282, 0x0}, +- {0x90283, 0x0}, +- {0x90284, 0x0}, +- {0x90285, 0x0}, +- {0x90286, 0x0}, +- {0x90287, 0x0}, +- {0x90288, 0x0}, +- {0x90289, 0x0}, +- {0x9028a, 0x0}, +- {0x9028b, 0x0}, +- {0x9028c, 0x0}, +- {0x9028d, 0x0}, +- {0x9028e, 0x0}, +- {0x9028f, 0x0}, +- {0x90290, 0x0}, +- {0x90291, 0x0}, +- {0x90292, 0x0}, +- {0x90293, 0x0}, +- {0x90294, 0x0}, +- {0x90295, 0x0}, +- {0x90296, 0x0}, +- {0x90297, 0x0}, +- {0x90298, 0x0}, +- {0x90299, 0x0}, +- {0x9029a, 0x0}, +- {0x9029b, 0x0}, +- {0x9029c, 0x0}, +- {0x9029d, 0x0}, +- {0x9029e, 0x0}, +- {0x9029f, 0x0}, +- {0x902a0, 0x0}, +- {0x902a1, 0x0}, +- {0x902a2, 0x0}, +- {0x902a3, 0x0}, +- {0x902a4, 0x0}, +- {0x902a5, 0x0}, +- {0x902a6, 0x0}, +- {0x902a7, 0x0}, +- {0x902a8, 0x0}, +- {0x902a9, 0x0}, +- {0x902aa, 0x0}, +- {0x902ab, 0x0}, +- {0x902ac, 0x0}, +- {0x902ad, 0x0}, +- {0x902ae, 0x0}, +- {0x902af, 0x0}, +- {0x902b0, 0x0}, +- {0x902b1, 0x0}, +- {0x902b2, 0x0}, +- {0x902b3, 0x0}, +- {0x902b4, 0x0}, +- {0x902b5, 0x0}, +- {0x902b6, 0x0}, +- {0x902b7, 0x0}, +- {0x902b8, 0x0}, +- {0x902b9, 0x0}, +- {0x902ba, 0x0}, +- {0x902bb, 0x0}, +- {0x902bc, 0x0}, +- {0x902bd, 0x0}, +- {0x902be, 0x0}, +- {0x902bf, 0x0}, +- {0x902c0, 0x0}, +- {0x902c1, 0x0}, +- {0x902c2, 0x0}, +- {0x902c3, 0x0}, +- {0x902c4, 0x0}, +- {0x902c5, 0x0}, +- {0x902c6, 0x0}, +- {0x902c7, 0x0}, +- {0x902c8, 0x0}, +- {0x902c9, 0x0}, +- {0x902ca, 0x0}, +- {0x902cb, 0x0}, +- {0x902cc, 0x0}, +- {0x902cd, 0x0}, +- {0x902ce, 0x0}, +- {0x902cf, 0x0}, +- {0x902d0, 0x0}, +- {0x902d1, 0x0}, +- {0x902d2, 0x0}, +- {0x902d3, 0x0}, +- {0x902d4, 0x0}, +- {0x902d5, 0x0}, +- {0x902d6, 0x0}, +- {0x902d7, 0x0}, +- {0x902d8, 0x0}, +- {0x902d9, 0x0}, +- {0x902da, 0x0}, +- {0x902db, 0x0}, +- {0x902dc, 0x0}, +- {0x902dd, 0x0}, +- {0x902de, 0x0}, +- {0x902df, 0x0}, +- {0x902e0, 0x0}, +- {0x902e1, 0x0}, +- {0x902e2, 0x0}, +- {0x902e3, 0x0}, +- {0x902e4, 0x0}, +- {0x902e5, 0x0}, +- {0x902e6, 0x0}, +- {0x902e7, 0x0}, +- {0x902e8, 0x0}, +- {0x902e9, 0x0}, +- {0x902ea, 0x0}, +- {0x902eb, 0x0}, +- {0x902ec, 0x0}, +- {0x902ed, 0x0}, +- {0x902ee, 0x0}, +- {0x902ef, 0x0}, +- {0x902f0, 0x0}, +- {0x902f1, 0x0}, +- {0x902f2, 0x0}, +- {0x902f3, 0x0}, +- {0x902f4, 0x0}, +- {0x902f5, 0x0}, +- {0x902f6, 0x0}, +- {0x902f7, 0x0}, +- {0x902f8, 0x0}, +- {0x902f9, 0x0}, +- {0x902fa, 0x0}, +- {0x902fb, 0x0}, +- {0x902fc, 0x0}, +- {0x902fd, 0x0}, +- {0x902fe, 0x0}, +- {0x902ff, 0x0}, +- {0x90300, 0x0}, +- {0x90301, 0x0}, +- {0x90302, 0x0}, +- {0x90303, 0x0}, +- {0x90304, 0x0}, +- {0x90305, 0x0}, +- {0x90306, 0x0}, +- {0x90307, 0x0}, +- {0x90308, 0x0}, +- {0x90309, 0x0}, +- {0x9030a, 0x0}, +- {0x9030b, 0x0}, +- {0x9030c, 0x0}, +- {0x9030d, 0x0}, +- {0x9030e, 0x0}, +- {0x9030f, 0x0}, +- {0x90310, 0x0}, +- {0x90311, 0x0}, +- {0x90312, 0x0}, +- {0x90313, 0x0}, +- {0x90314, 0x0}, +- {0x90315, 0x0}, +- {0x90316, 0x0}, +- {0x90317, 0x0}, +- {0x90318, 0x0}, +- {0x90319, 0x0}, +- {0x9031a, 0x0}, +- {0x9031b, 0x0}, +- {0x9031c, 0x0}, +- {0x9031d, 0x0}, +- {0x9031e, 0x0}, +- {0x9031f, 0x0}, +- {0x90320, 0x0}, +- {0x90321, 0x0}, +- {0x90322, 0x0}, +- {0x90323, 0x0}, +- {0x90324, 0x0}, +- {0x90325, 0x0}, +- {0x90326, 0x0}, +- {0x90327, 0x0}, +- {0x90328, 0x0}, +- {0x90329, 0x0}, +- {0x9032a, 0x0}, +- {0x9032b, 0x0}, +- {0x9032c, 0x0}, +- {0x9032d, 0x0}, +- {0x9032e, 0x0}, +- {0x9032f, 0x0}, +- {0x90330, 0x0}, +- {0x90331, 0x0}, +- {0x90332, 0x0}, +- {0x90333, 0x0}, +- {0x90334, 0x0}, +- {0x90335, 0x0}, +- {0x90336, 0x0}, +- {0x90337, 0x0}, +- {0x90338, 0x0}, +- {0x90339, 0x0}, +- {0x9033a, 0x0}, +- {0x9033b, 0x0}, +- {0x9033c, 0x0}, +- {0x9033d, 0x0}, +- {0x9033e, 0x0}, +- {0x9033f, 0x0}, +- {0x90340, 0x0}, +- {0x90341, 0x0}, +- {0x90342, 0x0}, +- {0x90343, 0x0}, +- {0x90344, 0x0}, +- {0x90345, 0x0}, +- {0x90346, 0x0}, +- {0x90347, 0x0}, +- {0x90348, 0x0}, +- {0x90349, 0x0}, +- {0x9034a, 0x0}, +- {0x9034b, 0x0}, +- {0x9034c, 0x0}, +- {0x9034d, 0x0}, +- {0x9034e, 0x0}, +- {0x9034f, 0x0}, +- {0x90350, 0x0}, +- {0x90351, 0x0}, +- {0x90352, 0x0}, +- {0x90353, 0x0}, +- {0x90354, 0x0}, +- {0x90355, 0x0}, +- {0x90356, 0x0}, +- {0x90357, 0x0}, +- {0x90358, 0x0}, +- {0x90359, 0x0}, +- {0x9035a, 0x0}, +- {0x9035b, 0x0}, +- {0x9035c, 0x0}, +- {0x9035d, 0x0}, +- {0x9035e, 0x0}, +- {0x9035f, 0x0}, +- {0x90360, 0x0}, +- {0x90361, 0x0}, +- {0x90362, 0x0}, +- {0x90363, 0x0}, +- {0x90364, 0x0}, +- {0x90365, 0x0}, +- {0x90366, 0x0}, +- {0x90367, 0x0}, +- {0x90368, 0x0}, +- {0x90369, 0x0}, +- {0x9036a, 0x0}, +- {0x9036b, 0x0}, +- {0x9036c, 0x0}, +- {0x9036d, 0x0}, +- {0x9036e, 0x0}, +- {0x9036f, 0x0}, +- {0x90370, 0x0}, +- {0x90371, 0x0}, +- {0x90372, 0x0}, +- {0x90373, 0x0}, +- {0x90374, 0x0}, +- {0x90375, 0x0}, +- {0x90376, 0x0}, +- {0x90377, 0x0}, +- {0x90378, 0x0}, +- {0x90379, 0x0}, +- {0x9037a, 0x0}, +- {0x9037b, 0x0}, +- {0x9037c, 0x0}, +- {0x9037d, 0x0}, +- {0x9037e, 0x0}, +- {0x9037f, 0x0}, +- {0x90380, 0x0}, +- {0x90381, 0x0}, +- {0x90382, 0x0}, +- {0x90383, 0x0}, +- {0x90384, 0x0}, +- {0x90385, 0x0}, +- {0x90386, 0x0}, +- {0x90387, 0x0}, +- {0x90388, 0x0}, +- {0x90389, 0x0}, +- {0x9038a, 0x0}, +- {0x9038b, 0x0}, +- {0x9038c, 0x0}, +- {0x9038d, 0x0}, +- {0x9038e, 0x0}, +- {0x9038f, 0x0}, +- {0x90390, 0x0}, +- {0x90391, 0x0}, +- {0x90392, 0x0}, +- {0x90393, 0x0}, +- {0x90394, 0x0}, +- {0x90395, 0x0}, +- {0x90396, 0x0}, +- {0x90397, 0x0}, +- {0x90398, 0x0}, +- {0x90399, 0x0}, +- {0x9039a, 0x0}, +- {0x9039b, 0x0}, +- {0x9039c, 0x0}, +- {0x9039d, 0x0}, +- {0x9039e, 0x0}, +- {0x9039f, 0x0}, +- {0x903a0, 0x0}, +- {0x903a1, 0x0}, +- {0x903a2, 0x0}, +- {0x903a3, 0x0}, +- {0x903a4, 0x0}, +- {0x903a5, 0x0}, +- {0x903a6, 0x0}, +- {0x903a7, 0x0}, +- {0x903a8, 0x0}, +- {0x903a9, 0x0}, +- {0x903aa, 0x0}, +- {0x903ab, 0x0}, +- {0x903ac, 0x0}, +- {0x903ad, 0x0}, +- {0x903ae, 0x0}, +- {0x903af, 0x0}, +- {0x903b0, 0x0}, +- {0x903b1, 0x0}, +- {0x903b2, 0x0}, +- {0x903b3, 0x0}, +- {0x903b4, 0x0}, +- {0x903b5, 0x0}, +- {0x903b6, 0x0}, +- {0x903b7, 0x0}, +- {0x903b8, 0x0}, +- {0x903b9, 0x0}, +- {0x903ba, 0x0}, +- {0x903bb, 0x0}, +- {0x903bc, 0x0}, +- {0x903bd, 0x0}, +- {0x903be, 0x0}, +- {0x903bf, 0x0}, +- {0x903c0, 0x0}, +- {0x903c1, 0x0}, +- {0x903c2, 0x0}, +- {0x903c3, 0x0}, +- {0x903c4, 0x0}, +- {0x903c5, 0x0}, +- {0x903c6, 0x0}, +- {0x903c7, 0x0}, +- {0x903c8, 0x0}, +- {0x903c9, 0x0}, +- {0x903ca, 0x0}, +- {0x903cb, 0x0}, +- {0x903cc, 0x0}, +- {0x903cd, 0x0}, +- {0x903ce, 0x0}, +- {0x903cf, 0x0}, +- {0x903d0, 0x0}, +- {0x903d1, 0x0}, +- {0x903d2, 0x0}, +- {0x903d3, 0x0}, +- {0x903d4, 0x0}, +- {0x903d5, 0x0}, +- {0x903d6, 0x0}, +- {0x903d7, 0x0}, +- {0x903d8, 0x0}, +- {0x903d9, 0x0}, +- {0x903da, 0x0}, +- {0x903db, 0x0}, +- {0x903dc, 0x0}, +- {0x903dd, 0x0}, +- {0x903de, 0x0}, +- {0x903df, 0x0}, +- {0x903e0, 0x0}, +- {0x903e1, 0x0}, +- {0x903e2, 0x0}, +- {0x903e3, 0x0}, +- {0x903e4, 0x0}, +- {0x903e5, 0x0}, +- {0x903e6, 0x0}, +- {0x903e7, 0x0}, +- {0x903e8, 0x0}, +- {0x903e9, 0x0}, +- {0x903ea, 0x0}, +- {0x903eb, 0x0}, +- {0x903ec, 0x0}, +- {0x903ed, 0x0}, +- {0x903ee, 0x0}, +- {0x903ef, 0x0}, +- {0x903f0, 0x0}, +- {0x903f1, 0x0}, +- {0x903f2, 0x0}, +- {0x903f3, 0x0}, +- {0x903f4, 0x0}, +- {0x903f5, 0x0}, +- {0x903f6, 0x0}, +- {0x903f7, 0x0}, +- {0x903f8, 0x0}, +- {0x903f9, 0x0}, +- {0x903fa, 0x0}, +- {0x903fb, 0x0}, +- {0x903fc, 0x0}, +- {0x903fd, 0x0}, +- {0x903fe, 0x0}, +- {0x903ff, 0x0}, +- {0x90400, 0x0}, +- {0x90401, 0x0}, +- {0x90402, 0x0}, +- {0x90403, 0x0}, +- {0x90404, 0x0}, +- {0x90405, 0x0}, +- {0x90406, 0x0}, +- {0x90407, 0x0}, +- {0x90408, 0x0}, +- {0x90409, 0x0}, +- {0x9040a, 0x0}, +- {0x9040b, 0x0}, +- {0x9040c, 0x0}, +- {0x9040d, 0x0}, +- {0x9040e, 0x0}, +- {0x9040f, 0x0}, +- {0x90410, 0x0}, +- {0x90411, 0x0}, +- {0x90412, 0x0}, +- {0x90413, 0x0}, +- {0x90414, 0x0}, +- {0x90415, 0x0}, +- {0x90416, 0x0}, +- {0x90417, 0x0}, +- {0x90418, 0x0}, +- {0x90419, 0x0}, +- {0x9041a, 0x0}, +- {0x9041b, 0x0}, +- {0x9041c, 0x0}, +- {0x9041d, 0x0}, +- {0x9041e, 0x0}, +- {0x9041f, 0x0}, +- {0x90420, 0x0}, +- {0x90421, 0x0}, +- {0x90422, 0x0}, +- {0x90423, 0x0}, +- {0x90424, 0x0}, +- {0x90425, 0x0}, +- {0x90426, 0x0}, +- {0x90427, 0x0}, +- {0x90428, 0x0}, +- {0x90429, 0x0}, +- {0x9042a, 0x0}, +- {0x9042b, 0x0}, +- {0x9042c, 0x0}, +- {0x9042d, 0x0}, +- {0x9042e, 0x0}, +- {0x9042f, 0x0}, +- {0x90430, 0x0}, +- {0x90431, 0x0}, +- {0x90432, 0x0}, +- {0x90433, 0x0}, +- {0x90434, 0x0}, +- {0x90435, 0x0}, +- {0x90436, 0x0}, +- {0x90437, 0x0}, +- {0x90438, 0x0}, +- {0x90439, 0x0}, +- {0x9043a, 0x0}, +- {0x9043b, 0x0}, +- {0x9043c, 0x0}, +- {0x9043d, 0x0}, +- {0x9043e, 0x0}, +- {0x9043f, 0x0}, +- {0x90440, 0x0}, +- {0x90441, 0x0}, +- {0x90442, 0x0}, +- {0x90443, 0x0}, +- {0x90444, 0x0}, +- {0x90445, 0x0}, +- {0x90446, 0x0}, +- {0x90447, 0x0}, +- {0x90448, 0x0}, +- {0x90449, 0x0}, +- {0x9044a, 0x0}, +- {0x9044b, 0x0}, +- {0x9044c, 0x0}, +- {0x9044d, 0x0}, +- {0x9044e, 0x0}, +- {0x9044f, 0x0}, +- {0x90450, 0x0}, +- {0x90451, 0x0}, +- {0x90452, 0x0}, +- {0x90453, 0x0}, +- {0x90454, 0x0}, +- {0x90455, 0x0}, +- {0x90456, 0x0}, +- {0x90457, 0x0}, +- {0x90458, 0x0}, +- {0x90459, 0x0}, +- {0x9045a, 0x0}, +- {0x9045b, 0x0}, +- {0x9045c, 0x0}, +- {0x9045d, 0x0}, +- {0x9045e, 0x0}, +- {0x9045f, 0x0}, +- {0x90460, 0x0}, +- {0x90461, 0x0}, +- {0x90462, 0x0}, +- {0x90463, 0x0}, +- {0x90464, 0x0}, +- {0x90465, 0x0}, +- {0x90466, 0x0}, +- {0x90467, 0x0}, +- {0x90468, 0x0}, +- {0x90469, 0x0}, +- {0x9046a, 0x0}, +- {0x9046b, 0x0}, +- {0x9046c, 0x0}, +- {0x9046d, 0x0}, +- {0x9046e, 0x0}, +- {0x9046f, 0x0}, +- {0x90470, 0x0}, +- {0x90471, 0x0}, +- {0x90472, 0x0}, +- {0x90473, 0x0}, +- {0x90474, 0x0}, +- {0x90475, 0x0}, +- {0x90476, 0x0}, +- {0x90477, 0x0}, +- {0x90478, 0x0}, +- {0x90479, 0x0}, +- {0x9047a, 0x0}, +- {0x9047b, 0x0}, +- {0x9047c, 0x0}, +- {0x9047d, 0x0}, +- {0x9047e, 0x0}, +- {0x9047f, 0x0}, +- {0x90480, 0x0}, +- {0x90481, 0x0}, +- {0x90482, 0x0}, +- {0x90483, 0x0}, +- {0x90484, 0x0}, +- {0x90485, 0x0}, +- {0x90486, 0x0}, +- {0x90487, 0x0}, +- {0x90488, 0x0}, +- {0x90489, 0x0}, +- {0x9048a, 0x0}, +- {0x9048b, 0x0}, +- {0x9048c, 0x0}, +- {0x9048d, 0x0}, +- {0x9048e, 0x0}, +- {0x9048f, 0x0}, +- {0x90490, 0x0}, +- {0x90491, 0x0}, +- {0x90492, 0x0}, +- {0x90493, 0x0}, +- {0x90494, 0x0}, +- {0x90495, 0x0}, +- {0x90496, 0x0}, +- {0x90497, 0x0}, +- {0x90498, 0x0}, +- {0x90499, 0x0}, +- {0x9049a, 0x0}, +- {0x9049b, 0x0}, +- {0x9049c, 0x0}, +- {0x9049d, 0x0}, +- {0x9049e, 0x0}, +- {0x9049f, 0x0}, +- {0x904a0, 0x0}, +- {0x904a1, 0x0}, +- {0x904a2, 0x0}, +- {0x904a3, 0x0}, +- {0x904a4, 0x0}, +- {0x904a5, 0x0}, +- {0x904a6, 0x0}, +- {0x904a7, 0x0}, +- {0x904a8, 0x0}, +- {0x904a9, 0x0}, +- {0x904aa, 0x0}, +- {0x904ab, 0x0}, +- {0x904ac, 0x0}, +- {0x904ad, 0x0}, +- {0x904ae, 0x0}, +- {0x904af, 0x0}, +- {0x904b0, 0x0}, +- {0x904b1, 0x0}, +- {0x904b2, 0x0}, +- {0x904b3, 0x0}, +- {0x904b4, 0x0}, +- {0x904b5, 0x0}, +- {0x904b6, 0x0}, +- {0x904b7, 0x0}, +- {0x904b8, 0x0}, +- {0x904b9, 0x0}, +- {0x904ba, 0x0}, +- {0x904bb, 0x0}, +- {0x904bc, 0x0}, +- {0x904bd, 0x0}, +- {0x904be, 0x0}, +- {0x904bf, 0x0}, +- {0x904c0, 0x0}, +- {0x904c1, 0x0}, +- {0x904c2, 0x0}, +- {0x904c3, 0x0}, +- {0x904c4, 0x0}, +- {0x904c5, 0x0}, +- {0x904c6, 0x0}, +- {0x904c7, 0x0}, +- {0x904c8, 0x0}, +- {0x904c9, 0x0}, +- {0x904ca, 0x0}, +- {0x904cb, 0x0}, +- {0x904cc, 0x0}, +- {0x904cd, 0x0}, +- {0x904ce, 0x0}, +- {0x904cf, 0x0}, +- {0x904d0, 0x0}, +- {0x904d1, 0x0}, +- {0x904d2, 0x0}, +- {0x904d3, 0x0}, +- {0x904d4, 0x0}, +- {0x904d5, 0x0}, +- {0x904d6, 0x0}, +- {0x904d7, 0x0}, +- {0x904d8, 0x0}, +- {0x904d9, 0x0}, +- {0x904da, 0x0}, +- {0x904db, 0x0}, +- {0x904dc, 0x0}, +- {0x904dd, 0x0}, +- {0x904de, 0x0}, +- {0x904df, 0x0}, +- {0x904e0, 0x0}, +- {0x904e1, 0x0}, +- {0x904e2, 0x0}, +- {0x904e3, 0x0}, +- {0x904e4, 0x0}, +- {0x904e5, 0x0}, +- {0x904e6, 0x0}, +- {0x904e7, 0x0}, +- {0x904e8, 0x0}, +- {0x904e9, 0x0}, +- {0x904ea, 0x0}, +- {0x904eb, 0x0}, +- {0x904ec, 0x0}, +- {0x904ed, 0x0}, +- {0x904ee, 0x0}, +- {0x904ef, 0x0}, +- {0x904f0, 0x0}, +- {0x904f1, 0x0}, +- {0x904f2, 0x0}, +- {0x904f3, 0x0}, +- {0x904f4, 0x0}, +- {0x904f5, 0x0}, +- {0x904f6, 0x0}, +- {0x904f7, 0x0}, +- {0x904f8, 0x0}, +- {0x904f9, 0x0}, +- {0x904fa, 0x0}, +- {0x904fb, 0x0}, +- {0x904fc, 0x0}, +- {0x904fd, 0x0}, +- {0x904fe, 0x0}, +- {0x904ff, 0x0}, +- {0x90500, 0x0}, +- {0x90501, 0x0}, +- {0x90502, 0x0}, +- {0x90503, 0x0}, +- {0x90504, 0x0}, +- {0x90505, 0x0}, +- {0x90506, 0x0}, +- {0x90507, 0x0}, +- {0x90508, 0x0}, +- {0x90509, 0x0}, +- {0x9050a, 0x0}, +- {0x9050b, 0x0}, +- {0x9050c, 0x0}, +- {0x9050d, 0x0}, +- {0x9050e, 0x0}, +- {0x9050f, 0x0}, +- {0x90510, 0x0}, +- {0x90511, 0x0}, +- {0x90512, 0x0}, +- {0x90513, 0x0}, +- {0x90514, 0x0}, +- {0x90515, 0x0}, +- {0x90516, 0x0}, +- {0x90517, 0x0}, +- {0x90518, 0x0}, +- {0x90519, 0x0}, +- {0x9051a, 0x0}, +- {0x9051b, 0x0}, +- {0x9051c, 0x0}, +- {0x9051d, 0x0}, +- {0x9051e, 0x0}, +- {0x9051f, 0x0}, +- {0x90520, 0x0}, +- {0x90521, 0x0}, +- {0x90522, 0x0}, +- {0x90523, 0x0}, +- {0x90524, 0x0}, +- {0x90525, 0x0}, +- {0x90526, 0x0}, +- {0x90527, 0x0}, +- {0x90528, 0x0}, +- {0x90529, 0x0}, +- {0x9052a, 0x0}, +- {0x9052b, 0x0}, +- {0x9052c, 0x0}, +- {0x9052d, 0x0}, +- {0x9052e, 0x0}, +- {0x9052f, 0x0}, +- {0x90530, 0x0}, +- {0x90531, 0x0}, +- {0x90532, 0x0}, +- {0x90533, 0x0}, +- {0x90534, 0x0}, +- {0x90535, 0x0}, +- {0x90536, 0x0}, +- {0x90537, 0x0}, +- {0x90538, 0x0}, +- {0x90539, 0x0}, +- {0x9053a, 0x0}, +- {0xd00e7, 0x0}, +- {0x9001c, 0x0}, +- {0x90020, 0x0}, +- {0x90024, 0x0}, +- {0x90025, 0x0}, +- {0x90026, 0x0}, +- {0x9002b, 0x0}, +- {0x90708, 0x0}, +- {0x90700, 0x0}, +- {0x90701, 0x0}, +- {0x90702, 0x0}, +- {0x90703, 0x0}, +- {0x90704, 0x0}, +- {0x90705, 0x0}, +- {0x90706, 0x0}, +- {0x90707, 0x0}, +- {0x2018a, 0x0}, +- {0x20124, 0x0}, +- {0x2018b, 0x0}, +- {0x20125, 0x0}, +- {0x2018c, 0x0}, +- {0x20126, 0x0}, +- {0x2018d, 0x0}, +- {0x20127, 0x0}, +- {0x2018e, 0x0}, +- {0x20128, 0x0}, +- {0x2018f, 0x0}, +- {0x20129, 0x0}, +- {0x20190, 0x0}, +- {0x2012a, 0x0}, +- {0x20191, 0x0}, +- {0x2012b, 0x0}, +- {0x20192, 0x0}, +- {0x2012c, 0x0}, +- {0x20193, 0x0}, +- {0x2012d, 0x0}, +- {0x20194, 0x0}, +- {0x2012e, 0x0}, +- {0x20195, 0x0}, +- {0x2012f, 0x0}, +- {0x20196, 0x0}, +- {0x20130, 0x0}, +- {0x20197, 0x0}, +- {0x20131, 0x0}, +- {0x20198, 0x0}, +- {0x20132, 0x0}, +- {0x20199, 0x0}, +- {0x20133, 0x0}, +- {0x2019a, 0x0}, +- {0x20134, 0x0}, +- {0x2019b, 0x0}, +- {0x20135, 0x0}, +- {0x2019c, 0x0}, +- {0x20136, 0x0}, +- {0x2019d, 0x0}, +- {0x20137, 0x0}, +- {0x2019e, 0x0}, +- {0x20138, 0x0}, +- {0x2019f, 0x0}, +- {0x20139, 0x0}, +- {0x201a0, 0x0}, +- {0x2013a, 0x0}, +- {0x201a1, 0x0}, +- {0x2013b, 0x0}, +- {0x201a2, 0x0}, +- {0x2013c, 0x0}, +- {0x201a3, 0x0}, +- {0x2013d, 0x0}, +- {0x201a4, 0x0}, +- {0x2013e, 0x0}, +- {0x201a5, 0x0}, +- {0x2013f, 0x0}, +- {0x201a6, 0x0}, +- {0x20140, 0x0}, +- {0x201a7, 0x0}, +- {0x20141, 0x0}, +- {0x201a8, 0x0}, +- {0x20142, 0x0}, +- {0x201a9, 0x0}, +- {0x20143, 0x0}, +- {0x201aa, 0x0}, +- {0x20144, 0x0}, +- {0x201ab, 0x0}, +- {0x20145, 0x0}, +- {0x201ac, 0x0}, +- {0x20146, 0x0}, +- {0x201ad, 0x0}, +- {0x20147, 0x0}, +- {0x201ae, 0x0}, +- {0x20148, 0x0}, +- {0x201af, 0x0}, +- {0x20149, 0x0}, +- {0x201b0, 0x0}, +- {0x2014a, 0x0}, +- {0x201b1, 0x0}, +- {0x2014b, 0x0}, +- {0x201b2, 0x0}, +- {0x2014c, 0x0}, +- {0x201b3, 0x0}, +- {0x2014d, 0x0}, +- {0x201b4, 0x0}, +- {0x2014e, 0x0}, +- {0x201b5, 0x0}, +- {0x2014f, 0x0}, +- {0x201b6, 0x0}, +- {0x20150, 0x0}, +- {0x201b7, 0x0}, +- {0x20151, 0x0}, +- {0x201b8, 0x0}, +- {0x20152, 0x0}, +- {0x201b9, 0x0}, +- {0x20153, 0x0}, +- {0x201ba, 0x0}, +- {0x20154, 0x0}, +- {0x201bb, 0x0}, +- {0x20155, 0x0}, +- {0x201bc, 0x0}, +- {0x20156, 0x0}, +- {0x201bd, 0x0}, +- {0x20157, 0x0}, +- {0x201be, 0x0}, +- {0x20158, 0x0}, +- {0x201bf, 0x0}, +- {0x20159, 0x0}, +- {0x201c0, 0x0}, +- {0x2015a, 0x0}, +- {0x201c1, 0x0}, +- {0x2015b, 0x0}, +- {0x201c2, 0x0}, +- {0x2015c, 0x0}, +- {0x201c3, 0x0}, +- {0x2015d, 0x0}, +- {0x201c4, 0x0}, +- {0x2015e, 0x0}, +- {0x201c5, 0x0}, +- {0x2015f, 0x0}, +- {0x201c6, 0x0}, +- {0x20160, 0x0}, +- {0x201c7, 0x0}, +- {0x20161, 0x0}, +- {0x201c8, 0x0}, +- {0x20162, 0x0}, +- {0x201c9, 0x0}, +- {0x20163, 0x0}, +- {0x201ca, 0x0}, +- {0x20164, 0x0}, +- {0x201cb, 0x0}, +- {0x20165, 0x0}, +- {0x201cc, 0x0}, +- {0x20166, 0x0}, +- {0x201cd, 0x0}, +- {0x20167, 0x0}, +- {0x201ce, 0x0}, +- {0x20168, 0x0}, +- {0x201cf, 0x0}, +- {0x20169, 0x0}, +- {0x201d0, 0x0}, +- {0x2016a, 0x0}, +- {0x201d1, 0x0}, +- {0x2016b, 0x0}, +- {0x201d2, 0x0}, +- {0x2016c, 0x0}, +- {0x201d3, 0x0}, +- {0x2016d, 0x0}, +- {0x201d4, 0x0}, +- {0x2016e, 0x0}, +- {0x201d5, 0x0}, +- {0x2016f, 0x0}, +- {0x201d6, 0x0}, +- {0x20170, 0x0}, +- {0x201d7, 0x0}, +- {0x20171, 0x0}, +- {0x201d8, 0x0}, +- {0x20172, 0x0}, +- {0x201d9, 0x0}, +- {0x20173, 0x0}, +- {0x201da, 0x0}, +- {0xc0001, 0x0}, +- {0xc0002, 0x0}, +- {0xc0003, 0x0}, +- {0xc0000, 0x0}, +- {0xc0006, 0x0}, +- {0xc0007, 0x0}, +- {0x9070c, 0x0}, +- {0x9070d, 0x0}, +- {0x9070e, 0x0}, +- {0x9070f, 0x0}, +- {0x90710, 0x0}, +- {0x90711, 0x0}, +- {0x90713, 0x0}, +- {0x90714, 0x0}, +- {0x90715, 0x0}, +- {0x90c10, 0x0}, +- {0x90c12, 0x0}, +- {0x90712, 0x0}, +- {0x90716, 0x0}, +- {0x90717, 0x0}, +- {0x90718, 0x0}, +- {0x90719, 0x0}, +- {0x9071a, 0x0}, +- {0x9071b, 0x0}, +- {0x90c11, 0x0}, +- {0x90904, 0x0}, +- {0x90986, 0x0}, +- {0x90920, 0x0}, +- {0x90921, 0x0}, +- {0x90922, 0x0}, +- {0x90923, 0x0}, +- {0x90924, 0x0}, +- {0x90925, 0x0}, +- {0x90926, 0x0}, +- {0x90927, 0x0}, +- {0x90930, 0x0}, +- {0x90931, 0x0}, +- {0x90932, 0x0}, +- {0x90933, 0x0}, +- {0x9090a, 0x0}, +- {0x9090c, 0x0}, +- {0x9090d, 0x0}, +- {0x200f0, 0x0}, +- {0x200f1, 0x0}, +- {0x200f2, 0x0}, +- {0x100b9, 0x0}, +- {0x100b1, 0x0}, +- {0x100ba, 0x0}, +- {0x100a2, 0x0}, +- {0x100b5, 0x0}, +- {0x110b9, 0x0}, +- {0x110b1, 0x0}, +- {0x110ba, 0x0}, +- {0x110a2, 0x0}, +- {0x110b5, 0x0}, +- {0x120b9, 0x0}, +- {0x120b1, 0x0}, +- {0x120ba, 0x0}, +- {0x120a2, 0x0}, +- {0x120b5, 0x0}, +- {0x130b9, 0x0}, +- {0x130b1, 0x0}, +- {0x130ba, 0x0}, +- {0x130a2, 0x0}, +- {0x130b5, 0x0}, +- {0x70024, 0x0}, +- {0x70025, 0x0}, +- {0x70026, 0x0}, +- {0x70027, 0x0}, +- {0x70028, 0x0}, +- {0x70029, 0x0}, +- {0x7002a, 0x0}, +- {0x7002b, 0x0}, +- {0x70124, 0x0}, +- {0x70125, 0x0}, +- {0x70126, 0x0}, +- {0x70127, 0x0}, +- {0x70128, 0x0}, +- {0x70129, 0x0}, +- {0x7012a, 0x0}, +- {0x7012b, 0x0}, +- {0x70224, 0x0}, +- {0x70225, 0x0}, +- {0x70226, 0x0}, +- {0x70227, 0x0}, +- {0x70228, 0x0}, +- {0x70229, 0x0}, +- {0x7022a, 0x0}, +- {0x7022b, 0x0}, +- {0x70324, 0x0}, +- {0x70325, 0x0}, +- {0x70326, 0x0}, +- {0x70327, 0x0}, +- {0x70328, 0x0}, +- {0x70329, 0x0}, +- {0x7032a, 0x0}, +- {0x7032b, 0x0}, +- {0x70424, 0x0}, +- {0x70425, 0x0}, +- {0x70426, 0x0}, +- {0x70427, 0x0}, +- {0x70428, 0x0}, +- {0x70429, 0x0}, +- {0x7042a, 0x0}, +- {0x7042b, 0x0}, +- {0x70524, 0x0}, +- {0x70525, 0x0}, +- {0x70526, 0x0}, +- {0x70527, 0x0}, +- {0x70528, 0x0}, +- {0x70529, 0x0}, +- {0x7052a, 0x0}, +- {0x7052b, 0x0}, +- {0x70624, 0x0}, +- {0x70625, 0x0}, +- {0x70626, 0x0}, +- {0x70627, 0x0}, +- {0x70628, 0x0}, +- {0x70629, 0x0}, +- {0x7062a, 0x0}, +- {0x7062b, 0x0}, +- {0x70724, 0x0}, +- {0x70725, 0x0}, +- {0x70726, 0x0}, +- {0x70727, 0x0}, +- {0x70728, 0x0}, +- {0x70729, 0x0}, +- {0x7072a, 0x0}, +- {0x7072b, 0x0}, +- {0x70824, 0x0}, +- {0x70825, 0x0}, +- {0x70826, 0x0}, +- {0x70827, 0x0}, +- {0x70828, 0x0}, +- {0x70829, 0x0}, +- {0x7082a, 0x0}, +- {0x7082b, 0x0}, +- {0x70065, 0x0}, +- {0x2007e, 0x0}, +- {0x200ef, 0x0}, +- {0x90910, 0x0}, +- {0x20310, 0x0}, +- {0x20311, 0x0}, +- {0x20049, 0x0}, +- {0x100be, 0x0}, +- {0x100b0, 0x0}, +- {0x10080, 0x0}, +- {0x10081, 0x0}, +- {0x10082, 0x0}, +- {0x10083, 0x0}, +- {0x10084, 0x0}, +- {0x10085, 0x0}, +- {0x10086, 0x0}, +- {0x10087, 0x0}, +- {0x10056, 0x0}, +- {0x100d9, 0x0}, +- {0x110be, 0x0}, +- {0x110b0, 0x0}, +- {0x11080, 0x0}, +- {0x11081, 0x0}, +- {0x11082, 0x0}, +- {0x11083, 0x0}, +- {0x11084, 0x0}, +- {0x11085, 0x0}, +- {0x11086, 0x0}, +- {0x11087, 0x0}, +- {0x11056, 0x0}, +- {0x110d9, 0x0}, +- {0x120be, 0x0}, +- {0x120b0, 0x0}, +- {0x12080, 0x0}, +- {0x12081, 0x0}, +- {0x12082, 0x0}, +- {0x12083, 0x0}, +- {0x12084, 0x0}, +- {0x12085, 0x0}, +- {0x12086, 0x0}, +- {0x12087, 0x0}, +- {0x12056, 0x0}, +- {0x120d9, 0x0}, +- {0x130be, 0x0}, +- {0x130b0, 0x0}, +- {0x13080, 0x0}, +- {0x13081, 0x0}, +- {0x13082, 0x0}, +- {0x13083, 0x0}, +- {0x13084, 0x0}, +- {0x13085, 0x0}, +- {0x13086, 0x0}, +- {0x13087, 0x0}, +- {0x13056, 0x0}, +- {0x130d9, 0x0}, +- {0x30090, 0x0}, +- {0x30091, 0x0}, +- {0x30092, 0x0}, +- {0x30093, 0x0}, +- {0x30094, 0x0}, +- {0x30095, 0x0}, +- {0x30096, 0x0}, +- {0x31090, 0x0}, +- {0x31091, 0x0}, +- {0x31092, 0x0}, +- {0x31093, 0x0}, +- {0x31094, 0x0}, +- {0x31095, 0x0}, +- {0x31096, 0x0}, +- {0x30002, 0x0}, +- {0x30007, 0x0}, +- {0x30008, 0x0}, +- {0x30005, 0x0}, +- {0x30006, 0x0}, +- {0x30001, 0x0}, +- {0x30101, 0x0}, +- {0x30201, 0x0}, +- {0x30301, 0x0}, +- {0x30401, 0x0}, +- {0x30501, 0x0}, +- {0x30601, 0x0}, +- {0x30701, 0x0}, +- {0x30801, 0x0}, +- {0x30901, 0x0}, +- {0x31002, 0x0}, +- {0x31007, 0x0}, +- {0x31008, 0x0}, +- {0x31005, 0x0}, +- {0x31006, 0x0}, +- {0x31001, 0x0}, +- {0x31101, 0x0}, +- {0x31201, 0x0}, +- {0x31301, 0x0}, +- {0x31401, 0x0}, +- {0x31501, 0x0}, +- {0x31601, 0x0}, +- {0x31701, 0x0}, +- {0x31801, 0x0}, +- {0x31901, 0x0}, +- {0x10000, 0x0}, +- {0x100ad, 0x0}, +- {0x100af, 0x0}, +- {0x10020, 0x0}, +- {0x10021, 0x0}, +- {0x10028, 0x0}, +- {0x10029, 0x0}, +- {0x10066, 0x0}, +- {0x10067, 0x0}, +- {0x1005a, 0x0}, +- {0x1005b, 0x0}, +- {0x1005c, 0x0}, +- {0x1005d, 0x0}, +- {0x1002a, 0x0}, +- {0x1002b, 0x0}, +- {0x10024, 0x0}, +- {0x10025, 0x0}, +- {0x10026, 0x0}, +- {0x10027, 0x0}, +- {0x10010, 0x0}, +- {0x10011, 0x0}, +- {0x10012, 0x0}, +- {0x10013, 0x0}, +- {0x10068, 0x0}, +- {0x10069, 0x0}, +- {0x1006a, 0x0}, +- {0x1006b, 0x0}, +- {0x1006c, 0x0}, +- {0x1006d, 0x0}, +- {0x1006e, 0x0}, +- {0x1006f, 0x0}, +- {0x1001c, 0x0}, +- {0x1001d, 0x0}, +- {0x1001e, 0x0}, +- {0x1001f, 0x0}, +- {0x10124, 0x0}, +- {0x10125, 0x0}, +- {0x10126, 0x0}, +- {0x10127, 0x0}, +- {0x10110, 0x0}, +- {0x10111, 0x0}, +- {0x10112, 0x0}, +- {0x10113, 0x0}, +- {0x10168, 0x0}, +- {0x10169, 0x0}, +- {0x1016a, 0x0}, +- {0x1016b, 0x0}, +- {0x1016c, 0x0}, +- {0x1016d, 0x0}, +- {0x1016e, 0x0}, +- {0x1016f, 0x0}, +- {0x1011c, 0x0}, +- {0x1011d, 0x0}, +- {0x1011e, 0x0}, +- {0x1011f, 0x0}, +- {0x10224, 0x0}, +- {0x10225, 0x0}, +- {0x10226, 0x0}, +- {0x10227, 0x0}, +- {0x10210, 0x0}, +- {0x10211, 0x0}, +- {0x10212, 0x0}, +- {0x10213, 0x0}, +- {0x10268, 0x0}, +- {0x10269, 0x0}, +- {0x1026a, 0x0}, +- {0x1026b, 0x0}, +- {0x1026c, 0x0}, +- {0x1026d, 0x0}, +- {0x1026e, 0x0}, +- {0x1026f, 0x0}, +- {0x1021c, 0x0}, +- {0x1021d, 0x0}, +- {0x1021e, 0x0}, +- {0x1021f, 0x0}, +- {0x10324, 0x0}, +- {0x10325, 0x0}, +- {0x10326, 0x0}, +- {0x10327, 0x0}, +- {0x10310, 0x0}, +- {0x10311, 0x0}, +- {0x10312, 0x0}, +- {0x10313, 0x0}, +- {0x10368, 0x0}, +- {0x10369, 0x0}, +- {0x1036a, 0x0}, +- {0x1036b, 0x0}, +- {0x1036c, 0x0}, +- {0x1036d, 0x0}, +- {0x1036e, 0x0}, +- {0x1036f, 0x0}, +- {0x1031c, 0x0}, +- {0x1031d, 0x0}, +- {0x1031e, 0x0}, +- {0x1031f, 0x0}, +- {0x10424, 0x0}, +- {0x10425, 0x0}, +- {0x10426, 0x0}, +- {0x10427, 0x0}, +- {0x10410, 0x0}, +- {0x10411, 0x0}, +- {0x10412, 0x0}, +- {0x10413, 0x0}, +- {0x10468, 0x0}, +- {0x10469, 0x0}, +- {0x1046a, 0x0}, +- {0x1046b, 0x0}, +- {0x1046c, 0x0}, +- {0x1046d, 0x0}, +- {0x1046e, 0x0}, +- {0x1046f, 0x0}, +- {0x1041c, 0x0}, +- {0x1041d, 0x0}, +- {0x1041e, 0x0}, +- {0x1041f, 0x0}, +- {0x10524, 0x0}, +- {0x10525, 0x0}, +- {0x10526, 0x0}, +- {0x10527, 0x0}, +- {0x10510, 0x0}, +- {0x10511, 0x0}, +- {0x10512, 0x0}, +- {0x10513, 0x0}, +- {0x10568, 0x0}, +- {0x10569, 0x0}, +- {0x1056a, 0x0}, +- {0x1056b, 0x0}, +- {0x1056c, 0x0}, +- {0x1056d, 0x0}, +- {0x1056e, 0x0}, +- {0x1056f, 0x0}, +- {0x1051c, 0x0}, +- {0x1051d, 0x0}, +- {0x1051e, 0x0}, +- {0x1051f, 0x0}, +- {0x10624, 0x0}, +- {0x10625, 0x0}, +- {0x10626, 0x0}, +- {0x10627, 0x0}, +- {0x10610, 0x0}, +- {0x10611, 0x0}, +- {0x10612, 0x0}, +- {0x10613, 0x0}, +- {0x10668, 0x0}, +- {0x10669, 0x0}, +- {0x1066a, 0x0}, +- {0x1066b, 0x0}, +- {0x1066c, 0x0}, +- {0x1066d, 0x0}, +- {0x1066e, 0x0}, +- {0x1066f, 0x0}, +- {0x1061c, 0x0}, +- {0x1061d, 0x0}, +- {0x1061e, 0x0}, +- {0x1061f, 0x0}, +- {0x10724, 0x0}, +- {0x10725, 0x0}, +- {0x10726, 0x0}, +- {0x10727, 0x0}, +- {0x10710, 0x0}, +- {0x10711, 0x0}, +- {0x10712, 0x0}, +- {0x10713, 0x0}, +- {0x10768, 0x0}, +- {0x10769, 0x0}, +- {0x1076a, 0x0}, +- {0x1076b, 0x0}, +- {0x1076c, 0x0}, +- {0x1076d, 0x0}, +- {0x1076e, 0x0}, +- {0x1076f, 0x0}, +- {0x1071c, 0x0}, +- {0x1071d, 0x0}, +- {0x1071e, 0x0}, +- {0x1071f, 0x0}, +- {0x10824, 0x0}, +- {0x10825, 0x0}, +- {0x10826, 0x0}, +- {0x10827, 0x0}, +- {0x10810, 0x0}, +- {0x10811, 0x0}, +- {0x10812, 0x0}, +- {0x10813, 0x0}, +- {0x10868, 0x0}, +- {0x10869, 0x0}, +- {0x1086a, 0x0}, +- {0x1086b, 0x0}, +- {0x1086c, 0x0}, +- {0x1086d, 0x0}, +- {0x1086e, 0x0}, +- {0x1086f, 0x0}, +- {0x1081c, 0x0}, +- {0x1081d, 0x0}, +- {0x1081e, 0x0}, +- {0x1081f, 0x0}, +- {0x1000c, 0x0}, +- {0x1000d, 0x0}, +- {0x10015, 0x0}, +- {0x10016, 0x0}, +- {0x10019, 0x0}, +- {0x1001b, 0x0}, +- {0x10022, 0x0}, +- {0x10023, 0x0}, +- {0x100d0, 0x0}, +- {0x100d1, 0x0}, +- {0x100d2, 0x0}, +- {0x100d3, 0x0}, +- {0x100d4, 0x0}, +- {0x11000, 0x0}, +- {0x110ad, 0x0}, +- {0x110af, 0x0}, +- {0x11020, 0x0}, +- {0x11021, 0x0}, +- {0x11028, 0x0}, +- {0x11029, 0x0}, +- {0x11066, 0x0}, +- {0x11067, 0x0}, +- {0x1105a, 0x0}, +- {0x1105b, 0x0}, +- {0x1105c, 0x0}, +- {0x1105d, 0x0}, +- {0x1102a, 0x0}, +- {0x1102b, 0x0}, +- {0x11024, 0x0}, +- {0x11025, 0x0}, +- {0x11026, 0x0}, +- {0x11027, 0x0}, +- {0x11010, 0x0}, +- {0x11011, 0x0}, +- {0x11012, 0x0}, +- {0x11013, 0x0}, +- {0x11068, 0x0}, +- {0x11069, 0x0}, +- {0x1106a, 0x0}, +- {0x1106b, 0x0}, +- {0x1106c, 0x0}, +- {0x1106d, 0x0}, +- {0x1106e, 0x0}, +- {0x1106f, 0x0}, +- {0x1101c, 0x0}, +- {0x1101d, 0x0}, +- {0x1101e, 0x0}, +- {0x1101f, 0x0}, +- {0x11124, 0x0}, +- {0x11125, 0x0}, +- {0x11126, 0x0}, +- {0x11127, 0x0}, +- {0x11110, 0x0}, +- {0x11111, 0x0}, +- {0x11112, 0x0}, +- {0x11113, 0x0}, +- {0x11168, 0x0}, +- {0x11169, 0x0}, +- {0x1116a, 0x0}, +- {0x1116b, 0x0}, +- {0x1116c, 0x0}, +- {0x1116d, 0x0}, +- {0x1116e, 0x0}, +- {0x1116f, 0x0}, +- {0x1111c, 0x0}, +- {0x1111d, 0x0}, +- {0x1111e, 0x0}, +- {0x1111f, 0x0}, +- {0x11224, 0x0}, +- {0x11225, 0x0}, +- {0x11226, 0x0}, +- {0x11227, 0x0}, +- {0x11210, 0x0}, +- {0x11211, 0x0}, +- {0x11212, 0x0}, +- {0x11213, 0x0}, +- {0x11268, 0x0}, +- {0x11269, 0x0}, +- {0x1126a, 0x0}, +- {0x1126b, 0x0}, +- {0x1126c, 0x0}, +- {0x1126d, 0x0}, +- {0x1126e, 0x0}, +- {0x1126f, 0x0}, +- {0x1121c, 0x0}, +- {0x1121d, 0x0}, +- {0x1121e, 0x0}, +- {0x1121f, 0x0}, +- {0x11324, 0x0}, +- {0x11325, 0x0}, +- {0x11326, 0x0}, +- {0x11327, 0x0}, +- {0x11310, 0x0}, +- {0x11311, 0x0}, +- {0x11312, 0x0}, +- {0x11313, 0x0}, +- {0x11368, 0x0}, +- {0x11369, 0x0}, +- {0x1136a, 0x0}, +- {0x1136b, 0x0}, +- {0x1136c, 0x0}, +- {0x1136d, 0x0}, +- {0x1136e, 0x0}, +- {0x1136f, 0x0}, +- {0x1131c, 0x0}, +- {0x1131d, 0x0}, +- {0x1131e, 0x0}, +- {0x1131f, 0x0}, +- {0x11424, 0x0}, +- {0x11425, 0x0}, +- {0x11426, 0x0}, +- {0x11427, 0x0}, +- {0x11410, 0x0}, +- {0x11411, 0x0}, +- {0x11412, 0x0}, +- {0x11413, 0x0}, +- {0x11468, 0x0}, +- {0x11469, 0x0}, +- {0x1146a, 0x0}, +- {0x1146b, 0x0}, +- {0x1146c, 0x0}, +- {0x1146d, 0x0}, +- {0x1146e, 0x0}, +- {0x1146f, 0x0}, +- {0x1141c, 0x0}, +- {0x1141d, 0x0}, +- {0x1141e, 0x0}, +- {0x1141f, 0x0}, +- {0x11524, 0x0}, +- {0x11525, 0x0}, +- {0x11526, 0x0}, +- {0x11527, 0x0}, +- {0x11510, 0x0}, +- {0x11511, 0x0}, +- {0x11512, 0x0}, +- {0x11513, 0x0}, +- {0x11568, 0x0}, +- {0x11569, 0x0}, +- {0x1156a, 0x0}, +- {0x1156b, 0x0}, +- {0x1156c, 0x0}, +- {0x1156d, 0x0}, +- {0x1156e, 0x0}, +- {0x1156f, 0x0}, +- {0x1151c, 0x0}, +- {0x1151d, 0x0}, +- {0x1151e, 0x0}, +- {0x1151f, 0x0}, +- {0x11624, 0x0}, +- {0x11625, 0x0}, +- {0x11626, 0x0}, +- {0x11627, 0x0}, +- {0x11610, 0x0}, +- {0x11611, 0x0}, +- {0x11612, 0x0}, +- {0x11613, 0x0}, +- {0x11668, 0x0}, +- {0x11669, 0x0}, +- {0x1166a, 0x0}, +- {0x1166b, 0x0}, +- {0x1166c, 0x0}, +- {0x1166d, 0x0}, +- {0x1166e, 0x0}, +- {0x1166f, 0x0}, +- {0x1161c, 0x0}, +- {0x1161d, 0x0}, +- {0x1161e, 0x0}, +- {0x1161f, 0x0}, +- {0x11724, 0x0}, +- {0x11725, 0x0}, +- {0x11726, 0x0}, +- {0x11727, 0x0}, +- {0x11710, 0x0}, +- {0x11711, 0x0}, +- {0x11712, 0x0}, +- {0x11713, 0x0}, +- {0x11768, 0x0}, +- {0x11769, 0x0}, +- {0x1176a, 0x0}, +- {0x1176b, 0x0}, +- {0x1176c, 0x0}, +- {0x1176d, 0x0}, +- {0x1176e, 0x0}, +- {0x1176f, 0x0}, +- {0x1171c, 0x0}, +- {0x1171d, 0x0}, +- {0x1171e, 0x0}, +- {0x1171f, 0x0}, +- {0x11824, 0x0}, +- {0x11825, 0x0}, +- {0x11826, 0x0}, +- {0x11827, 0x0}, +- {0x11810, 0x0}, +- {0x11811, 0x0}, +- {0x11812, 0x0}, +- {0x11813, 0x0}, +- {0x11868, 0x0}, +- {0x11869, 0x0}, +- {0x1186a, 0x0}, +- {0x1186b, 0x0}, +- {0x1186c, 0x0}, +- {0x1186d, 0x0}, +- {0x1186e, 0x0}, +- {0x1186f, 0x0}, +- {0x1181c, 0x0}, +- {0x1181d, 0x0}, +- {0x1181e, 0x0}, +- {0x1181f, 0x0}, +- {0x1100c, 0x0}, +- {0x1100d, 0x0}, +- {0x11015, 0x0}, +- {0x11016, 0x0}, +- {0x11019, 0x0}, +- {0x1101b, 0x0}, +- {0x11022, 0x0}, +- {0x11023, 0x0}, +- {0x110d0, 0x0}, +- {0x110d1, 0x0}, +- {0x110d2, 0x0}, +- {0x110d3, 0x0}, +- {0x110d4, 0x0}, +- {0x12000, 0x0}, +- {0x120ad, 0x0}, +- {0x120af, 0x0}, +- {0x12020, 0x0}, +- {0x12021, 0x0}, +- {0x12028, 0x0}, +- {0x12029, 0x0}, +- {0x12066, 0x0}, +- {0x12067, 0x0}, +- {0x1205a, 0x0}, +- {0x1205b, 0x0}, +- {0x1205c, 0x0}, +- {0x1205d, 0x0}, +- {0x1202a, 0x0}, +- {0x1202b, 0x0}, +- {0x12024, 0x0}, +- {0x12025, 0x0}, +- {0x12026, 0x0}, +- {0x12027, 0x0}, +- {0x12010, 0x0}, +- {0x12011, 0x0}, +- {0x12012, 0x0}, +- {0x12013, 0x0}, +- {0x12068, 0x0}, +- {0x12069, 0x0}, +- {0x1206a, 0x0}, +- {0x1206b, 0x0}, +- {0x1206c, 0x0}, +- {0x1206d, 0x0}, +- {0x1206e, 0x0}, +- {0x1206f, 0x0}, +- {0x1201c, 0x0}, +- {0x1201d, 0x0}, +- {0x1201e, 0x0}, +- {0x1201f, 0x0}, +- {0x12124, 0x0}, +- {0x12125, 0x0}, +- {0x12126, 0x0}, +- {0x12127, 0x0}, +- {0x12110, 0x0}, +- {0x12111, 0x0}, +- {0x12112, 0x0}, +- {0x12113, 0x0}, +- {0x12168, 0x0}, +- {0x12169, 0x0}, +- {0x1216a, 0x0}, +- {0x1216b, 0x0}, +- {0x1216c, 0x0}, +- {0x1216d, 0x0}, +- {0x1216e, 0x0}, +- {0x1216f, 0x0}, +- {0x1211c, 0x0}, +- {0x1211d, 0x0}, +- {0x1211e, 0x0}, +- {0x1211f, 0x0}, +- {0x12224, 0x0}, +- {0x12225, 0x0}, +- {0x12226, 0x0}, +- {0x12227, 0x0}, +- {0x12210, 0x0}, +- {0x12211, 0x0}, +- {0x12212, 0x0}, +- {0x12213, 0x0}, +- {0x12268, 0x0}, +- {0x12269, 0x0}, +- {0x1226a, 0x0}, +- {0x1226b, 0x0}, +- {0x1226c, 0x0}, +- {0x1226d, 0x0}, +- {0x1226e, 0x0}, +- {0x1226f, 0x0}, +- {0x1221c, 0x0}, +- {0x1221d, 0x0}, +- {0x1221e, 0x0}, +- {0x1221f, 0x0}, +- {0x12324, 0x0}, +- {0x12325, 0x0}, +- {0x12326, 0x0}, +- {0x12327, 0x0}, +- {0x12310, 0x0}, +- {0x12311, 0x0}, +- {0x12312, 0x0}, +- {0x12313, 0x0}, +- {0x12368, 0x0}, +- {0x12369, 0x0}, +- {0x1236a, 0x0}, +- {0x1236b, 0x0}, +- {0x1236c, 0x0}, +- {0x1236d, 0x0}, +- {0x1236e, 0x0}, +- {0x1236f, 0x0}, +- {0x1231c, 0x0}, +- {0x1231d, 0x0}, +- {0x1231e, 0x0}, +- {0x1231f, 0x0}, +- {0x12424, 0x0}, +- {0x12425, 0x0}, +- {0x12426, 0x0}, +- {0x12427, 0x0}, +- {0x12410, 0x0}, +- {0x12411, 0x0}, +- {0x12412, 0x0}, +- {0x12413, 0x0}, +- {0x12468, 0x0}, +- {0x12469, 0x0}, +- {0x1246a, 0x0}, +- {0x1246b, 0x0}, +- {0x1246c, 0x0}, +- {0x1246d, 0x0}, +- {0x1246e, 0x0}, +- {0x1246f, 0x0}, +- {0x1241c, 0x0}, +- {0x1241d, 0x0}, +- {0x1241e, 0x0}, +- {0x1241f, 0x0}, +- {0x12524, 0x0}, +- {0x12525, 0x0}, +- {0x12526, 0x0}, +- {0x12527, 0x0}, +- {0x12510, 0x0}, +- {0x12511, 0x0}, +- {0x12512, 0x0}, +- {0x12513, 0x0}, +- {0x12568, 0x0}, +- {0x12569, 0x0}, +- {0x1256a, 0x0}, +- {0x1256b, 0x0}, +- {0x1256c, 0x0}, +- {0x1256d, 0x0}, +- {0x1256e, 0x0}, +- {0x1256f, 0x0}, +- {0x1251c, 0x0}, +- {0x1251d, 0x0}, +- {0x1251e, 0x0}, +- {0x1251f, 0x0}, +- {0x12624, 0x0}, +- {0x12625, 0x0}, +- {0x12626, 0x0}, +- {0x12627, 0x0}, +- {0x12610, 0x0}, +- {0x12611, 0x0}, +- {0x12612, 0x0}, +- {0x12613, 0x0}, +- {0x12668, 0x0}, +- {0x12669, 0x0}, +- {0x1266a, 0x0}, +- {0x1266b, 0x0}, +- {0x1266c, 0x0}, +- {0x1266d, 0x0}, +- {0x1266e, 0x0}, +- {0x1266f, 0x0}, +- {0x1261c, 0x0}, +- {0x1261d, 0x0}, +- {0x1261e, 0x0}, +- {0x1261f, 0x0}, +- {0x12724, 0x0}, +- {0x12725, 0x0}, +- {0x12726, 0x0}, +- {0x12727, 0x0}, +- {0x12710, 0x0}, +- {0x12711, 0x0}, +- {0x12712, 0x0}, +- {0x12713, 0x0}, +- {0x12768, 0x0}, +- {0x12769, 0x0}, +- {0x1276a, 0x0}, +- {0x1276b, 0x0}, +- {0x1276c, 0x0}, +- {0x1276d, 0x0}, +- {0x1276e, 0x0}, +- {0x1276f, 0x0}, +- {0x1271c, 0x0}, +- {0x1271d, 0x0}, +- {0x1271e, 0x0}, +- {0x1271f, 0x0}, +- {0x12824, 0x0}, +- {0x12825, 0x0}, +- {0x12826, 0x0}, +- {0x12827, 0x0}, +- {0x12810, 0x0}, +- {0x12811, 0x0}, +- {0x12812, 0x0}, +- {0x12813, 0x0}, +- {0x12868, 0x0}, +- {0x12869, 0x0}, +- {0x1286a, 0x0}, +- {0x1286b, 0x0}, +- {0x1286c, 0x0}, +- {0x1286d, 0x0}, +- {0x1286e, 0x0}, +- {0x1286f, 0x0}, +- {0x1281c, 0x0}, +- {0x1281d, 0x0}, +- {0x1281e, 0x0}, +- {0x1281f, 0x0}, +- {0x1200c, 0x0}, +- {0x1200d, 0x0}, +- {0x12015, 0x0}, +- {0x12016, 0x0}, +- {0x12019, 0x0}, +- {0x1201b, 0x0}, +- {0x12022, 0x0}, +- {0x12023, 0x0}, +- {0x120d0, 0x0}, +- {0x120d1, 0x0}, +- {0x120d2, 0x0}, +- {0x120d3, 0x0}, +- {0x120d4, 0x0}, +- {0x13000, 0x0}, +- {0x130ad, 0x0}, +- {0x130af, 0x0}, +- {0x13020, 0x0}, +- {0x13021, 0x0}, +- {0x13028, 0x0}, +- {0x13029, 0x0}, +- {0x13066, 0x0}, +- {0x13067, 0x0}, +- {0x1305a, 0x0}, +- {0x1305b, 0x0}, +- {0x1305c, 0x0}, +- {0x1305d, 0x0}, +- {0x1302a, 0x0}, +- {0x1302b, 0x0}, +- {0x13024, 0x0}, +- {0x13025, 0x0}, +- {0x13026, 0x0}, +- {0x13027, 0x0}, +- {0x13010, 0x0}, +- {0x13011, 0x0}, +- {0x13012, 0x0}, +- {0x13013, 0x0}, +- {0x13068, 0x0}, +- {0x13069, 0x0}, +- {0x1306a, 0x0}, +- {0x1306b, 0x0}, +- {0x1306c, 0x0}, +- {0x1306d, 0x0}, +- {0x1306e, 0x0}, +- {0x1306f, 0x0}, +- {0x1301c, 0x0}, +- {0x1301d, 0x0}, +- {0x1301e, 0x0}, +- {0x1301f, 0x0}, +- {0x13124, 0x0}, +- {0x13125, 0x0}, +- {0x13126, 0x0}, +- {0x13127, 0x0}, +- {0x13110, 0x0}, +- {0x13111, 0x0}, +- {0x13112, 0x0}, +- {0x13113, 0x0}, +- {0x13168, 0x0}, +- {0x13169, 0x0}, +- {0x1316a, 0x0}, +- {0x1316b, 0x0}, +- {0x1316c, 0x0}, +- {0x1316d, 0x0}, +- {0x1316e, 0x0}, +- {0x1316f, 0x0}, +- {0x1311c, 0x0}, +- {0x1311d, 0x0}, +- {0x1311e, 0x0}, +- {0x1311f, 0x0}, +- {0x13224, 0x0}, +- {0x13225, 0x0}, +- {0x13226, 0x0}, +- {0x13227, 0x0}, +- {0x13210, 0x0}, +- {0x13211, 0x0}, +- {0x13212, 0x0}, +- {0x13213, 0x0}, +- {0x13268, 0x0}, +- {0x13269, 0x0}, +- {0x1326a, 0x0}, +- {0x1326b, 0x0}, +- {0x1326c, 0x0}, +- {0x1326d, 0x0}, +- {0x1326e, 0x0}, +- {0x1326f, 0x0}, +- {0x1321c, 0x0}, +- {0x1321d, 0x0}, +- {0x1321e, 0x0}, +- {0x1321f, 0x0}, +- {0x13324, 0x0}, +- {0x13325, 0x0}, +- {0x13326, 0x0}, +- {0x13327, 0x0}, +- {0x13310, 0x0}, +- {0x13311, 0x0}, +- {0x13312, 0x0}, +- {0x13313, 0x0}, +- {0x13368, 0x0}, +- {0x13369, 0x0}, +- {0x1336a, 0x0}, +- {0x1336b, 0x0}, +- {0x1336c, 0x0}, +- {0x1336d, 0x0}, +- {0x1336e, 0x0}, +- {0x1336f, 0x0}, +- {0x1331c, 0x0}, +- {0x1331d, 0x0}, +- {0x1331e, 0x0}, +- {0x1331f, 0x0}, +- {0x13424, 0x0}, +- {0x13425, 0x0}, +- {0x13426, 0x0}, +- {0x13427, 0x0}, +- {0x13410, 0x0}, +- {0x13411, 0x0}, +- {0x13412, 0x0}, +- {0x13413, 0x0}, +- {0x13468, 0x0}, +- {0x13469, 0x0}, +- {0x1346a, 0x0}, +- {0x1346b, 0x0}, +- {0x1346c, 0x0}, +- {0x1346d, 0x0}, +- {0x1346e, 0x0}, +- {0x1346f, 0x0}, +- {0x1341c, 0x0}, +- {0x1341d, 0x0}, +- {0x1341e, 0x0}, +- {0x1341f, 0x0}, +- {0x13524, 0x0}, +- {0x13525, 0x0}, +- {0x13526, 0x0}, +- {0x13527, 0x0}, +- {0x13510, 0x0}, +- {0x13511, 0x0}, +- {0x13512, 0x0}, +- {0x13513, 0x0}, +- {0x13568, 0x0}, +- {0x13569, 0x0}, +- {0x1356a, 0x0}, +- {0x1356b, 0x0}, +- {0x1356c, 0x0}, +- {0x1356d, 0x0}, +- {0x1356e, 0x0}, +- {0x1356f, 0x0}, +- {0x1351c, 0x0}, +- {0x1351d, 0x0}, +- {0x1351e, 0x0}, +- {0x1351f, 0x0}, +- {0x13624, 0x0}, +- {0x13625, 0x0}, +- {0x13626, 0x0}, +- {0x13627, 0x0}, +- {0x13610, 0x0}, +- {0x13611, 0x0}, +- {0x13612, 0x0}, +- {0x13613, 0x0}, +- {0x13668, 0x0}, +- {0x13669, 0x0}, +- {0x1366a, 0x0}, +- {0x1366b, 0x0}, +- {0x1366c, 0x0}, +- {0x1366d, 0x0}, +- {0x1366e, 0x0}, +- {0x1366f, 0x0}, +- {0x1361c, 0x0}, +- {0x1361d, 0x0}, +- {0x1361e, 0x0}, +- {0x1361f, 0x0}, +- {0x13724, 0x0}, +- {0x13725, 0x0}, +- {0x13726, 0x0}, +- {0x13727, 0x0}, +- {0x13710, 0x0}, +- {0x13711, 0x0}, +- {0x13712, 0x0}, +- {0x13713, 0x0}, +- {0x13768, 0x0}, +- {0x13769, 0x0}, +- {0x1376a, 0x0}, +- {0x1376b, 0x0}, +- {0x1376c, 0x0}, +- {0x1376d, 0x0}, +- {0x1376e, 0x0}, +- {0x1376f, 0x0}, +- {0x1371c, 0x0}, +- {0x1371d, 0x0}, +- {0x1371e, 0x0}, +- {0x1371f, 0x0}, +- {0x13824, 0x0}, +- {0x13825, 0x0}, +- {0x13826, 0x0}, +- {0x13827, 0x0}, +- {0x13810, 0x0}, +- {0x13811, 0x0}, +- {0x13812, 0x0}, +- {0x13813, 0x0}, +- {0x13868, 0x0}, +- {0x13869, 0x0}, +- {0x1386a, 0x0}, +- {0x1386b, 0x0}, +- {0x1386c, 0x0}, +- {0x1386d, 0x0}, +- {0x1386e, 0x0}, +- {0x1386f, 0x0}, +- {0x1381c, 0x0}, +- {0x1381d, 0x0}, +- {0x1381e, 0x0}, +- {0x1381f, 0x0}, +- {0x1300c, 0x0}, +- {0x1300d, 0x0}, +- {0x13015, 0x0}, +- {0x13016, 0x0}, +- {0x13019, 0x0}, +- {0x1301b, 0x0}, +- {0x13022, 0x0}, +- {0x13023, 0x0}, +- {0x130d0, 0x0}, +- {0x130d1, 0x0}, +- {0x130d2, 0x0}, +- {0x130d3, 0x0}, +- {0x130d4, 0x0}, +- {0x90807, 0x0}, +- {0x90808, 0x0}, +- {0x90813, 0x0}, +- {0x2004e, 0x0}, +- {0x2000d, 0x0}, +- {0x20077, 0x0}, +-}; +- +-/* PHY Initialize Configuration for Pstate 0 */ +-static struct ddrphy_cfg_param ddr_phy_fsp0_cfg[] = { +- {0x90802, 0x1}, +- {0x2004a, 0x601}, +- {0x2004b, 0x1c3e}, +- {0x2004c, 0x2e8f}, +- {0x2004d, 0x0}, +- {0x20088, 0x101}, +- {0x20089, 0x0}, +- {0x2008a, 0x0}, +- {0x2008c, 0x0}, +- {0x20002, 0x2}, +- {0x20000, 0x2}, +- {0x90801, 0x4d}, +- {0x90809, 0x6800}, +- {0x1005e, 0x366}, +- {0x10060, 0x366}, +- {0x10062, 0x366}, +- {0x10064, 0x366}, +- {0x1005f, 0x366}, +- {0x10061, 0x366}, +- {0x10063, 0x366}, +- {0x10065, 0x366}, +- {0x1105e, 0x366}, +- {0x11060, 0x366}, +- {0x11062, 0x366}, +- {0x11064, 0x366}, +- {0x1105f, 0x366}, +- {0x11061, 0x366}, +- {0x11063, 0x366}, +- {0x11065, 0x366}, +- {0x1205e, 0x366}, +- {0x12060, 0x366}, +- {0x12062, 0x366}, +- {0x12064, 0x366}, +- {0x1205f, 0x366}, +- {0x12061, 0x366}, +- {0x12063, 0x366}, +- {0x12065, 0x366}, +- {0x1305e, 0x366}, +- {0x13060, 0x366}, +- {0x13062, 0x366}, +- {0x13064, 0x366}, +- {0x1305f, 0x366}, +- {0x13061, 0x366}, +- {0x13063, 0x366}, +- {0x13065, 0x366}, +- {0x10005, 0x0}, +- {0x1000b, 0x0}, +- {0x11005, 0x0}, +- {0x1100b, 0x0}, +- {0x12005, 0x0}, +- {0x1200b, 0x0}, +- {0x13005, 0x0}, +- {0x1300b, 0x0}, +- {0x20007, 0x200}, +- {0x20013, 0x2c}, +- {0x30038, 0x3}, +- {0x30039, 0x3}, +- {0x3003a, 0x3}, +- {0x31038, 0x3}, +- {0x31039, 0x3}, +- {0x3103a, 0x3}, +- {0x10038, 0x3}, +- {0x1003a, 0x3}, +- {0x11038, 0x3}, +- {0x1103a, 0x3}, +- {0x12038, 0x3}, +- {0x1203a, 0x3}, +- {0x13038, 0x3}, +- {0x1303a, 0x3}, +- {0x1003b, 0x3}, +- {0x1103b, 0x3}, +- {0x1203b, 0x3}, +- {0x1303b, 0x3}, +- {0x10009, 0x0}, +- {0x10037, 0x0}, +- {0x11009, 0x0}, +- {0x11037, 0x0}, +- {0x12009, 0x0}, +- {0x12037, 0x0}, +- {0x13009, 0x0}, +- {0x13037, 0x0}, +- {0x10004, 0x0}, +- {0x10003, 0x0}, +- {0x11004, 0x0}, +- {0x11003, 0x0}, +- {0x12004, 0x0}, +- {0x12003, 0x0}, +- {0x13004, 0x0}, +- {0x13003, 0x0}, +- {0x20004, 0x320}, +- {0x30050, 0x15}, +- {0x30051, 0x15}, +- {0x30052, 0x15}, +- {0x30053, 0x15}, +- {0x31050, 0x15}, +- {0x31051, 0x15}, +- {0x31052, 0x15}, +- {0x31053, 0x15}, +- {0x1004e, 0x15}, +- {0x1004f, 0x15}, +- {0x10050, 0x15}, +- {0x10051, 0x15}, +- {0x1014e, 0x15}, +- {0x1014f, 0x15}, +- {0x10150, 0x15}, +- {0x10151, 0x15}, +- {0x1024e, 0x15}, +- {0x1024f, 0x15}, +- {0x10250, 0x15}, +- {0x10251, 0x15}, +- {0x1034e, 0x15}, +- {0x1034f, 0x15}, +- {0x10350, 0x15}, +- {0x10351, 0x15}, +- {0x1044e, 0x15}, +- {0x1044f, 0x15}, +- {0x10450, 0x15}, +- {0x10451, 0x15}, +- {0x1054e, 0x15}, +- {0x1054f, 0x15}, +- {0x10550, 0x15}, +- {0x10551, 0x15}, +- {0x1064e, 0x15}, +- {0x1064f, 0x15}, +- {0x10650, 0x15}, +- {0x10651, 0x15}, +- {0x1074e, 0x15}, +- {0x1074f, 0x15}, +- {0x10750, 0x15}, +- {0x10751, 0x15}, +- {0x1084e, 0x15}, +- {0x1084f, 0x15}, +- {0x10850, 0x15}, +- {0x10851, 0x15}, +- {0x1104e, 0x15}, +- {0x1104f, 0x15}, +- {0x11050, 0x15}, +- {0x11051, 0x15}, +- {0x1114e, 0x15}, +- {0x1114f, 0x15}, +- {0x11150, 0x15}, +- {0x11151, 0x15}, +- {0x1124e, 0x15}, +- {0x1124f, 0x15}, +- {0x11250, 0x15}, +- {0x11251, 0x15}, +- {0x1134e, 0x15}, +- {0x1134f, 0x15}, +- {0x11350, 0x15}, +- {0x11351, 0x15}, +- {0x1144e, 0x15}, +- {0x1144f, 0x15}, +- {0x11450, 0x15}, +- {0x11451, 0x15}, +- {0x1154e, 0x15}, +- {0x1154f, 0x15}, +- {0x11550, 0x15}, +- {0x11551, 0x15}, +- {0x1164e, 0x15}, +- {0x1164f, 0x15}, +- {0x11650, 0x15}, +- {0x11651, 0x15}, +- {0x1174e, 0x15}, +- {0x1174f, 0x15}, +- {0x11750, 0x15}, +- {0x11751, 0x15}, +- {0x1184e, 0x15}, +- {0x1184f, 0x15}, +- {0x11850, 0x15}, +- {0x11851, 0x15}, +- {0x1204e, 0x15}, +- {0x1204f, 0x15}, +- {0x12050, 0x15}, +- {0x12051, 0x15}, +- {0x1214e, 0x15}, +- {0x1214f, 0x15}, +- {0x12150, 0x15}, +- {0x12151, 0x15}, +- {0x1224e, 0x15}, +- {0x1224f, 0x15}, +- {0x12250, 0x15}, +- {0x12251, 0x15}, +- {0x1234e, 0x15}, +- {0x1234f, 0x15}, +- {0x12350, 0x15}, +- {0x12351, 0x15}, +- {0x1244e, 0x15}, +- {0x1244f, 0x15}, +- {0x12450, 0x15}, +- {0x12451, 0x15}, +- {0x1254e, 0x15}, +- {0x1254f, 0x15}, +- {0x12550, 0x15}, +- {0x12551, 0x15}, +- {0x1264e, 0x15}, +- {0x1264f, 0x15}, +- {0x12650, 0x15}, +- {0x12651, 0x15}, +- {0x1274e, 0x15}, +- {0x1274f, 0x15}, +- {0x12750, 0x15}, +- {0x12751, 0x15}, +- {0x1284e, 0x15}, +- {0x1284f, 0x15}, +- {0x12850, 0x15}, +- {0x12851, 0x15}, +- {0x1304e, 0x15}, +- {0x1304f, 0x15}, +- {0x13050, 0x15}, +- {0x13051, 0x15}, +- {0x1314e, 0x15}, +- {0x1314f, 0x15}, +- {0x13150, 0x15}, +- {0x13151, 0x15}, +- {0x1324e, 0x15}, +- {0x1324f, 0x15}, +- {0x13250, 0x15}, +- {0x13251, 0x15}, +- {0x1334e, 0x15}, +- {0x1334f, 0x15}, +- {0x13350, 0x15}, +- {0x13351, 0x15}, +- {0x1344e, 0x15}, +- {0x1344f, 0x15}, +- {0x13450, 0x15}, +- {0x13451, 0x15}, +- {0x1354e, 0x15}, +- {0x1354f, 0x15}, +- {0x13550, 0x15}, +- {0x13551, 0x15}, +- {0x1364e, 0x15}, +- {0x1364f, 0x15}, +- {0x13650, 0x15}, +- {0x13651, 0x15}, +- {0x1374e, 0x15}, +- {0x1374f, 0x15}, +- {0x13750, 0x15}, +- {0x13751, 0x15}, +- {0x1384e, 0x15}, +- {0x1384f, 0x15}, +- {0x13850, 0x15}, +- {0x13851, 0x15}, +- {0x30030, 0x0}, +- {0x30031, 0x0}, +- {0x30035, 0x0}, +- {0x31030, 0x0}, +- {0x31031, 0x0}, +- {0x31035, 0x0}, +- {0x10030, 0x0}, +- {0x10035, 0x0}, +- {0x10036, 0x0}, +- {0x11030, 0x0}, +- {0x11035, 0x0}, +- {0x11036, 0x0}, +- {0x12030, 0x0}, +- {0x12035, 0x0}, +- {0x12036, 0x0}, +- {0x13030, 0x0}, +- {0x13035, 0x0}, +- {0x13036, 0x0}, +- {0x3003c, 0x5}, +- {0x3103c, 0x5}, +- {0x1003c, 0x5}, +- {0x1003d, 0x5}, +- {0x1003e, 0x5}, +- {0x1103c, 0x5}, +- {0x1103d, 0x5}, +- {0x1103e, 0x5}, +- {0x1203c, 0x5}, +- {0x1203d, 0x5}, +- {0x1203e, 0x5}, +- {0x1303c, 0x5}, +- {0x1303d, 0x5}, +- {0x1303e, 0x5}, +- {0x20003, 0x1}, +- {0x10006, 0x2}, +- {0x11006, 0x2}, +- {0x12006, 0x2}, +- {0x13006, 0x2}, +- {0x20001, 0x1122}, +- {0x20009, 0x0}, +- {0x20008, 0x0}, +- {0x200d9, 0x0}, +- {0x30eef, 0x0}, +- {0x31eef, 0x0}, +- {0x20014, 0x1300}, +- {0x9080a, 0x1300}, +- {0x10040, 0xe0e}, +- {0x10042, 0xe0e}, +- {0x9080d, 0x0}, +- {0x10043, 0x0}, +- {0x10044, 0xe0e}, +- {0x10045, 0xe0e}, +- {0x11040, 0xe0e}, +- {0x11042, 0xe0e}, +- {0x9080d, 0x0}, +- {0x11043, 0x0}, +- {0x11044, 0xe0e}, +- {0x11045, 0xe0e}, +- {0x12040, 0xe0e}, +- {0x12042, 0xe0e}, +- {0x9080d, 0x0}, +- {0x12043, 0x0}, +- {0x12044, 0xe0e}, +- {0x12045, 0xe0e}, +- {0x13040, 0xe0e}, +- {0x13042, 0xe0e}, +- {0x9080d, 0x0}, +- {0x13043, 0x0}, +- {0x13044, 0xe0e}, +- {0x13045, 0xe0e}, +- {0x30040, 0xe0e}, +- {0x30041, 0xe0e}, +- {0x30042, 0xe0e}, +- {0x30043, 0xe0e}, +- {0x30330, 0x33}, +- {0x31040, 0xe0e}, +- {0x31041, 0xe0e}, +- {0x31042, 0xe0e}, +- {0x31043, 0xe0e}, +- {0x31330, 0x33}, +- {0x20331, 0x33}, +- {0x10048, 0xc00}, +- {0x1004a, 0xc00}, +- {0x1004b, 0xc00}, +- {0x1004c, 0xe00}, +- {0x1004d, 0xe00}, +- {0x11048, 0xc00}, +- {0x1104a, 0xc00}, +- {0x1104b, 0xc00}, +- {0x1104c, 0xe00}, +- {0x1104d, 0xe00}, +- {0x12048, 0xc00}, +- {0x1204a, 0xc00}, +- {0x1204b, 0xc00}, +- {0x1204c, 0xe00}, +- {0x1204d, 0xe00}, +- {0x13048, 0xc00}, +- {0x1304a, 0xc00}, +- {0x1304b, 0xc00}, +- {0x1304c, 0xe00}, +- {0x1304d, 0xe00}, +- {0x30048, 0xc00}, +- {0x30049, 0xc00}, +- {0x3004a, 0xc00}, +- {0x3004b, 0xc00}, +- {0x31048, 0xc00}, +- {0x31049, 0xc00}, +- {0x3104a, 0xc00}, +- {0x3104b, 0xc00}, +- {0x30033, 0xcc}, +- {0x30034, 0xcc}, +- {0x3002e, 0xcc}, +- {0x31033, 0xcc}, +- {0x31034, 0xcc}, +- {0x3102e, 0xcc}, +- {0x10033, 0xcc}, +- {0x1002e, 0xcc}, +- {0x1002f, 0xcc}, +- {0x11033, 0xcc}, +- {0x1102e, 0xcc}, +- {0x1102f, 0xcc}, +- {0x12033, 0xcc}, +- {0x1202e, 0xcc}, +- {0x1202f, 0xcc}, +- {0x13033, 0xcc}, +- {0x1302e, 0xcc}, +- {0x1302f, 0xcc}, +- {0x20015, 0x0}, +- {0x90806, 0x0}, +- {0x100e8, 0x0}, +- {0x100e9, 0x15}, +- {0x110e8, 0x0}, +- {0x110e9, 0x15}, +- {0x120e8, 0x0}, +- {0x120e9, 0x15}, +- {0x130e8, 0x0}, +- {0x130e9, 0x15}, +- {0x10001, 0x0}, +- {0x11001, 0x0}, +- {0x12001, 0x0}, +- {0x13001, 0x0}, +- {0x20012, 0xa1a1}, +- {0x20017, 0x40}, +- {0x2000a, 0x40}, +- {0x20186, 0xa1}, +- {0x20187, 0x40}, +- {0x20010, 0x0}, +- {0x20011, 0xf}, +- {0x9080b, 0xf}, +- {0x9080c, 0xf}, +- {0x100a5, 0x1}, +- {0x110a5, 0x1}, +- {0x120a5, 0x1}, +- {0x130a5, 0x1}, +- {0x10014, 0x3232}, +- {0x11014, 0x3232}, +- {0x12014, 0x3232}, +- {0x13014, 0x3232}, +- {0x1000f, 0x1086}, +- {0x1100f, 0x1086}, +- {0x1200f, 0x1086}, +- {0x1300f, 0x1086}, +- {0x20035, 0x100c}, +- {0x20036, 0x100c}, +- {0x20037, 0x41c}, +- {0x20037, 0x45c}, +- {0x20038, 0x1920}, +- {0x20039, 0x101c}, +- {0x2003a, 0x101c}, +- {0x2003b, 0x42c}, +- {0x2003c, 0x2d30}, +- {0x2003d, 0x1004}, +- {0x2003e, 0x1004}, +- {0x2003f, 0x414}, +- {0x20040, 0x1118}, +- {0x2002c, 0x843}, +- {0x2002d, 0x843}, +- {0x20030, 0x843}, +- {0x2002e, 0x81f}, +- {0x2002f, 0x81f}, +- {0x2000c, 0x0}, +- {0x2001b, 0x0}, +- {0x10007, 0x0}, +- {0x11007, 0x0}, +- {0x12007, 0x0}, +- {0x13007, 0x0}, +- {0xc0080, 0x3}, +-}; +- +-/* P0 message block parameter for training firmware */ +-static struct ddrphy_cfg_param ddr_phy_msgh_fsp0_cfg[] = { +- {0x58000, 0x4000}, +- {0x58002, 0x30}, +- {0x58003, 0x1900}, +- {0x58004, 0x4}, +- {0x58005, 0x4}, +- {0x58008, 0x17df}, +- {0x58009, 0xff}, +- {0x5800b, 0x2}, +- {0x5800d, 0x100}, +- {0x5800e, 0xf}, +- {0x58012, 0x310}, +- {0x5801f, 0x1000}, +- {0x58020, 0x3}, +- {0x5802d, 0xb0b0}, +- {0x5802e, 0xb0b0}, +- {0x5802f, 0xbbbb}, +- {0x58030, 0xbbbb}, +- {0x58031, 0x606}, +- {0x58032, 0x606}, +- {0x58033, 0x5454}, +- {0x58034, 0x5454}, +- {0x58035, 0x4646}, +- {0x58036, 0x4646}, +- {0x58037, 0x2d2d}, +- {0x58038, 0x2d2d}, +- {0x58039, 0x8080}, +- {0x5803a, 0x8080}, +- {0x5803b, 0x1c1c}, +- {0x5803c, 0x1c1c}, +- {0x5803d, 0x1c1c}, +- {0x5803e, 0x1c1c}, +- {0x58041, 0xac84}, +- {0x58042, 0xac84}, +- {0x58043, 0x1e1e}, +- {0x58044, 0x1e1e}, +- {0x58045, 0x1010}, +- {0x58046, 0x1010}, +- {0x58047, 0x202}, +- {0x58048, 0x202}, +- {0x5804f, 0x8080}, +- {0x58050, 0x8080}, +- {0x58055, 0x404}, +- {0x58056, 0x404}, +- {0x58074, 0x2e}, +- {0x58075, 0x50}, +- {0x58080, 0x1}, +- {0x58081, 0x4b00}, +- {0x58082, 0x43}, +-}; +- +-/* DRAM PHY init engine image for Pstate 0 */ +-static struct ddrphy_cfg_param ddr_phy_pie_fsp0_cfg[] = { +- {0x908f0, 0x65}, +- {0x908f1, 0x258}, +- {0x908f2, 0x0}, +- {0x908f3, 0x58}, +- {0x908f4, 0x14}, +- {0x908f5, 0x0}, +- {0x908f6, 0xb0}, +- {0x908f7, 0x0}, +- {0x41008, 0xc9d8}, +- {0x41009, 0x0}, +- {0x4100a, 0x0}, +- {0x4100b, 0x0}, +- {0x4100c, 0xc808}, +- {0x4100d, 0x0}, +- {0x4100e, 0x0}, +- {0x4100f, 0x0}, +- {0x41010, 0x0}, +- {0x41011, 0x0}, +- {0x41012, 0x0}, +- {0x41013, 0x2b00}, +- {0x41014, 0x0}, +- {0x41015, 0x0}, +- {0x41016, 0x0}, +- {0x41017, 0x0}, +- {0x41018, 0xc958}, +- {0x41019, 0x0}, +- {0x4101a, 0x0}, +- {0x4101b, 0x0}, +- {0x4101c, 0xcf08}, +- {0x4101d, 0x0}, +- {0x4101e, 0x0}, +- {0x4101f, 0x0}, +- {0x41020, 0x0}, +- {0x41021, 0x0}, +- {0x41022, 0x0}, +- {0x41023, 0x2b00}, +- {0x41024, 0x0}, +- {0x41025, 0x0}, +- {0x41026, 0x0}, +- {0x41027, 0x0}, +- {0x41028, 0xc0d8}, +- {0x41029, 0x0}, +- {0x4102a, 0x0}, +- {0x4102b, 0x0}, +- {0x4102c, 0xd848}, +- {0x4102d, 0x0}, +- {0x4102e, 0x0}, +- {0x4102f, 0x0}, +- {0x41030, 0x0}, +- {0x41031, 0x0}, +- {0x41032, 0x0}, +- {0x41033, 0x2b00}, +- {0x41034, 0x0}, +- {0x41035, 0x0}, +- {0x41036, 0x0}, +- {0x41037, 0x0}, +- {0x41038, 0xc158}, +- {0x41039, 0x0}, +- {0x4103a, 0x0}, +- {0x4103b, 0x0}, +- {0x4103c, 0xddc8}, +- {0x4103d, 0x0}, +- {0x4103e, 0x0}, +- {0x4103f, 0x0}, +- {0x41040, 0x0}, +- {0x41041, 0x0}, +- {0x41042, 0x0}, +- {0x41043, 0x2b00}, +- {0x41044, 0x0}, +- {0x41045, 0x0}, +- {0x41046, 0x0}, +- {0x41047, 0x0}, +- {0x41048, 0xc1d8}, +- {0x41049, 0x0}, +- {0x4104a, 0x0}, +- {0x4104b, 0x0}, +- {0x4104c, 0xc308}, +- {0x4104d, 0x0}, +- {0x4104e, 0x0}, +- {0x4104f, 0x0}, +- {0x41050, 0x0}, +- {0x41051, 0x0}, +- {0x41052, 0x0}, +- {0x41053, 0x2b00}, +- {0x41054, 0x0}, +- {0x41055, 0x0}, +- {0x41056, 0x0}, +- {0x41057, 0x0}, +- {0x41058, 0xc558}, +- {0x41059, 0x0}, +- {0x4105a, 0x0}, +- {0x4105b, 0x0}, +- {0x4105c, 0xea08}, +- {0x4105d, 0x0}, +- {0x4105e, 0x0}, +- {0x4105f, 0x0}, +- {0x41060, 0x0}, +- {0x41061, 0x0}, +- {0x41062, 0x0}, +- {0x41063, 0x2b00}, +- {0x41064, 0x0}, +- {0x41065, 0x0}, +- {0x41066, 0x0}, +- {0x41067, 0x0}, +- {0x41068, 0xc5d8}, +- {0x41069, 0x0}, +- {0x4106a, 0x0}, +- {0x4106b, 0x0}, +- {0x4106c, 0xe308}, +- {0x4106d, 0x0}, +- {0x4106e, 0x0}, +- {0x4106f, 0x0}, +- {0x41070, 0x0}, +- {0x41071, 0x0}, +- {0x41072, 0x0}, +- {0x41073, 0x2b00}, +- {0x41074, 0x0}, +- {0x41075, 0x0}, +- {0x41076, 0x0}, +- {0x41077, 0x0}, +- {0x41078, 0x48d8}, +- {0x41079, 0x0}, +- {0x4107a, 0x0}, +- {0x4107b, 0x0}, +- {0x4107c, 0x4248}, +- {0x4107d, 0x0}, +- {0x4107e, 0x0}, +- {0x4107f, 0x0}, +- {0x41080, 0x88d8}, +- {0x41081, 0x0}, +- {0x41082, 0x0}, +- {0x41083, 0x0}, +- {0x41084, 0x9648}, +- {0x41085, 0x0}, +- {0x41086, 0x0}, +- {0x41087, 0x0}, +- {0x41088, 0x0}, +- {0x41089, 0x0}, +- {0x4108a, 0x0}, +- {0x4108b, 0x2b00}, +- {0x4108c, 0x0}, +- {0x4108d, 0x0}, +- {0x4108e, 0x0}, +- {0x4108f, 0x0}, +- {0x41090, 0xca58}, +- {0x41091, 0x0}, +- {0x41092, 0x0}, +- {0x41093, 0x0}, +- {0x41094, 0xc108}, +- {0x41095, 0x0}, +- {0x41096, 0x0}, +- {0x41097, 0x0}, +- {0x41098, 0x0}, +- {0x41099, 0x0}, +- {0x4109a, 0x0}, +- {0x4109b, 0x2b00}, +- {0x4109c, 0x0}, +- {0x4109d, 0x0}, +- {0x4109e, 0x0}, +- {0x4109f, 0x0}, +- {0x410a0, 0xcb58}, +- {0x410a1, 0x0}, +- {0x410a2, 0x0}, +- {0x410a3, 0x0}, +- {0x410a4, 0xc008}, +- {0x410a5, 0x0}, +- {0x410a6, 0x0}, +- {0x410a7, 0x0}, +- {0x410a8, 0x0}, +- {0x410a9, 0x0}, +- {0x410aa, 0x0}, +- {0x410ab, 0x2b00}, +- {0x410ac, 0x0}, +- {0x410ad, 0x0}, +- {0x410ae, 0x0}, +- {0x410af, 0x0}, +- {0x410b0, 0xd4d8}, +- {0x410b1, 0x0}, +- {0x410b2, 0x0}, +- {0x410b3, 0x0}, +- {0x410b4, 0xc008}, +- {0x410b5, 0x0}, +- {0x410b6, 0x0}, +- {0x410b7, 0x0}, +- {0x20015, 0x0}, +- {0x3004a, 0x0}, +- {0x3004b, 0x0}, +- {0x3104a, 0x0}, +- {0x3104b, 0x0}, +- {0x2004a, 0x1a3e}, +- {0x2004b, 0x1a3e}, +- {0x2004c, 0x2c0f}, +- {0x2004d, 0x0}, +- {0x20088, 0x101}, +- {0x20089, 0x0}, +- {0x2008a, 0x0}, +- {0x2008c, 0x0}, +- {0x20041, 0x1}, +- {0x90802, 0x1}, +- {0x20045, 0x2}, +- {0x10057, 0x0}, +- {0x11057, 0x0}, +- {0x12057, 0x0}, +- {0x13057, 0x0}, +- {0x1000f, 0x1086}, +- {0x1100f, 0x1086}, +- {0x1200f, 0x1086}, +- {0x1300f, 0x1086}, +- {0x90803, 0x4}, +- {0x90804, 0x82}, +- {0x90805, 0x1}, +- {0x90903, 0x0}, +- {0x9090b, 0x2}, +- {0x90811, 0x0}, +- {0x90812, 0xff00}, +- {0x20072, 0x3}, +- {0x9080e, 0x3}, +- {0x20073, 0x3}, +- {0x9080f, 0x3}, +-}; +- +-/* DRAM PHY init engine image */ +-static struct ddrphy_cfg_param ddr_phy_pie[] = { +- {0x41000, 0x0}, +- {0x41001, 0x0}, +- {0x41002, 0x0}, +- {0x41003, 0x0}, +- {0x41004, 0x0}, +- {0x41005, 0x0}, +- {0x41006, 0x0}, +- {0x41007, 0x0}, +- {0x41388, 0xc028}, +- {0x41389, 0x0}, +- {0x4138a, 0x0}, +- {0x4138b, 0x10}, +- {0x4138c, 0x0}, +- {0x4138d, 0x0}, +- {0x4138e, 0x0}, +- {0x4138f, 0x0}, +- {0x41390, 0x0}, +- {0x41391, 0x0}, +- {0x41392, 0x0}, +- {0x41393, 0x400}, +- {0x41394, 0x0}, +- {0x41395, 0x0}, +- {0x41396, 0x0}, +- {0x41397, 0x0}, +- {0x41398, 0x0}, +- {0x41399, 0x0}, +- {0x4139a, 0x0}, +- {0x4139b, 0x0}, +- {0x4139c, 0x0}, +- {0x4139d, 0x0}, +- {0x4139e, 0x0}, +- {0x4139f, 0x0}, +- {0x413a0, 0xc858}, +- {0x413a1, 0x0}, +- {0x413a2, 0x0}, +- {0x413a3, 0x10}, +- {0x413a4, 0xe088}, +- {0x413a5, 0x0}, +- {0x413a6, 0x0}, +- {0x413a7, 0x10}, +- {0x413a8, 0xe038}, +- {0x413a9, 0x0}, +- {0x413aa, 0x0}, +- {0x413ab, 0x10}, +- {0x413ac, 0xc858}, +- {0x413ad, 0x0}, +- {0x413ae, 0x0}, +- {0x413af, 0x10}, +- {0x413b0, 0xc088}, +- {0x413b1, 0x0}, +- {0x413b2, 0x0}, +- {0x413b3, 0x10}, +- {0x413b4, 0x0}, +- {0x413b5, 0x0}, +- {0x413b6, 0x0}, +- {0x413b7, 0x0}, +- {0x413b8, 0xc028}, +- {0x413b9, 0x0}, +- {0x413ba, 0x0}, +- {0x413bb, 0x10}, +- {0x413bc, 0x0}, +- {0x413bd, 0x0}, +- {0x413be, 0x0}, +- {0x413bf, 0x0}, +- {0x413c0, 0x0}, +- {0x413c1, 0x0}, +- {0x413c2, 0x0}, +- {0x413c3, 0x400}, +- {0x413c4, 0x0}, +- {0x413c5, 0x0}, +- {0x413c6, 0x0}, +- {0x413c7, 0x0}, +- {0x413c8, 0x0}, +- {0x413c9, 0x0}, +- {0x413ca, 0x0}, +- {0x413cb, 0x0}, +- {0x413cc, 0x0}, +- {0x413cd, 0x0}, +- {0x413ce, 0x0}, +- {0x413cf, 0x0}, +- {0x413d0, 0xc858}, +- {0x413d1, 0x0}, +- {0x413d2, 0x0}, +- {0x413d3, 0x10}, +- {0x413d4, 0xe208}, +- {0x413d5, 0x0}, +- {0x413d6, 0x0}, +- {0x413d7, 0x10}, +- {0x413d8, 0xe038}, +- {0x413d9, 0x0}, +- {0x413da, 0x0}, +- {0x413db, 0x10}, +- {0x413dc, 0xc858}, +- {0x413dd, 0x0}, +- {0x413de, 0x0}, +- {0x413df, 0x10}, +- {0x413e0, 0xc208}, +- {0x413e1, 0x0}, +- {0x413e2, 0x0}, +- {0x413e3, 0x10}, +- {0x413e4, 0x0}, +- {0x413e5, 0x0}, +- {0x413e6, 0x0}, +- {0x413e7, 0x0}, +- {0x413e8, 0xce58}, +- {0x413e9, 0x0}, +- {0x413ea, 0x0}, +- {0x413eb, 0x10}, +- {0x413ec, 0xc208}, +- {0x413ed, 0x0}, +- {0x413ee, 0x0}, +- {0x413ef, 0x10}, +- {0x413f0, 0x0}, +- {0x413f1, 0x0}, +- {0x413f2, 0x0}, +- {0x413f3, 0x0}, +- {0x413f4, 0x0}, +- {0x413f5, 0x0}, +- {0x413f6, 0x0}, +- {0x413f7, 0x0}, +- {0x413f8, 0xc370}, +- {0x413f9, 0x0}, +- {0x413fa, 0x0}, +- {0x413fb, 0x10}, +- {0x413fc, 0x0}, +- {0x413fd, 0x0}, +- {0x413fe, 0x0}, +- {0x413ff, 0x0}, +- {0x41400, 0xc040}, +- {0x41401, 0x0}, +- {0x41402, 0x0}, +- {0x41403, 0x10}, +- {0x41404, 0x0}, +- {0x41405, 0x0}, +- {0x41406, 0x0}, +- {0x41407, 0x10}, +- {0x41408, 0xd2d8}, +- {0x41409, 0x0}, +- {0x4140a, 0x0}, +- {0x4140b, 0x10}, +- {0x4140c, 0xe008}, +- {0x4140d, 0x0}, +- {0x4140e, 0x0}, +- {0x4140f, 0x10}, +- {0x41410, 0x0}, +- {0x41411, 0x0}, +- {0x41412, 0x0}, +- {0x41413, 0x5b00}, +- {0x41414, 0x0}, +- {0x41415, 0x0}, +- {0x41416, 0x0}, +- {0x41417, 0x0}, +- {0x41418, 0xc0f0}, +- {0x41419, 0x0}, +- {0x4141a, 0x0}, +- {0x4141b, 0x10}, +- {0x4141c, 0x0}, +- {0x4141d, 0x0}, +- {0x4141e, 0x0}, +- {0x4141f, 0x0}, +- {0x41420, 0xcfd8}, +- {0x41421, 0x0}, +- {0x41422, 0x0}, +- {0x41423, 0x10}, +- {0x41424, 0xc008}, +- {0x41425, 0x0}, +- {0x41426, 0x0}, +- {0x41427, 0x10}, +- {0x41428, 0x0}, +- {0x41429, 0x0}, +- {0x4142a, 0x0}, +- {0x4142b, 0x2b00}, +- {0x4142c, 0x0}, +- {0x4142d, 0x0}, +- {0x4142e, 0x0}, +- {0x4142f, 0x0}, +- {0x41430, 0xd058}, +- {0x41431, 0x0}, +- {0x41432, 0x0}, +- {0x41433, 0x10}, +- {0x41434, 0xc008}, +- {0x41435, 0x0}, +- {0x41436, 0x0}, +- {0x41437, 0x10}, +- {0x41438, 0x0}, +- {0x41439, 0x0}, +- {0x4143a, 0x0}, +- {0x4143b, 0x2b00}, +- {0x4143c, 0x0}, +- {0x4143d, 0x0}, +- {0x4143e, 0x0}, +- {0x4143f, 0x0}, +- {0x41440, 0xd0d8}, +- {0x41441, 0x0}, +- {0x41442, 0x0}, +- {0x41443, 0x10}, +- {0x41444, 0xc088}, +- {0x41445, 0x0}, +- {0x41446, 0x0}, +- {0x41447, 0x10}, +- {0x41448, 0x0}, +- {0x41449, 0x0}, +- {0x4144a, 0x0}, +- {0x4144b, 0x2b00}, +- {0x4144c, 0x0}, +- {0x4144d, 0x0}, +- {0x4144e, 0x0}, +- {0x4144f, 0x0}, +- {0x41450, 0xd158}, +- {0x41451, 0x0}, +- {0x41452, 0x0}, +- {0x41453, 0x10}, +- {0x41454, 0xc008}, +- {0x41455, 0x0}, +- {0x41456, 0x0}, +- {0x41457, 0x10}, +- {0x41458, 0x0}, +- {0x41459, 0x0}, +- {0x4145a, 0x0}, +- {0x4145b, 0x5b00}, +- {0x4145c, 0x0}, +- {0x4145d, 0x0}, +- {0x4145e, 0x0}, +- {0x4145f, 0x0}, +- {0x41460, 0x402c}, +- {0x41461, 0xd00}, +- {0x41462, 0x1}, +- {0x41463, 0x400}, +- {0x41464, 0x4050}, +- {0x41465, 0x800}, +- {0x41466, 0x0}, +- {0x41467, 0x0}, +- {0x41468, 0x0}, +- {0x41469, 0x0}, +- {0x4146a, 0x0}, +- {0x4146b, 0x400}, +- {0x4146c, 0x0}, +- {0x4146d, 0x0}, +- {0x4146e, 0x0}, +- {0x4146f, 0x0}, +- {0x41470, 0x0}, +- {0x41471, 0x0}, +- {0x41472, 0x0}, +- {0x41473, 0x400}, +- {0x41474, 0x4050}, +- {0x41475, 0x803}, +- {0x41476, 0x0}, +- {0x41477, 0x0}, +- {0x41478, 0x0}, +- {0x41479, 0x0}, +- {0x4147a, 0x0}, +- {0x4147b, 0x7f00}, +- {0x4147c, 0x0}, +- {0x4147d, 0x0}, +- {0x4147e, 0x0}, +- {0x4147f, 0x400}, +- {0x41480, 0x407c}, +- {0x41481, 0x0}, +- {0x41482, 0x0}, +- {0x41483, 0x400}, +- {0x41484, 0x0}, +- {0x41485, 0x0}, +- {0x41486, 0x0}, +- {0x41487, 0x0}, +- {0x41488, 0x0}, +- {0x41489, 0x0}, +- {0x4148a, 0x0}, +- {0x4148b, 0x400}, +- {0x4148c, 0x0}, +- {0x4148d, 0x0}, +- {0x4148e, 0x1}, +- {0x4148f, 0x0}, +- {0x41490, 0x0}, +- {0x41491, 0x0}, +- {0x41492, 0x0}, +- {0x41493, 0x400}, +- {0x41494, 0x0}, +- {0x41495, 0x0}, +- {0x41496, 0x0}, +- {0x41497, 0x0}, +- {0x41498, 0x0}, +- {0x41499, 0x0}, +- {0x4149a, 0x0}, +- {0x4149b, 0x0}, +- {0x4149c, 0x0}, +- {0x4149d, 0x0}, +- {0x4149e, 0x0}, +- {0x4149f, 0x0}, +- {0x414a0, 0x802c}, +- {0x414a1, 0xd00}, +- {0x414a2, 0x1}, +- {0x414a3, 0x410}, +- {0x414a4, 0x8050}, +- {0x414a5, 0x800}, +- {0x414a6, 0x0}, +- {0x414a7, 0x10}, +- {0x414a8, 0x0}, +- {0x414a9, 0x0}, +- {0x414aa, 0x0}, +- {0x414ab, 0x400}, +- {0x414ac, 0x0}, +- {0x414ad, 0x0}, +- {0x414ae, 0x0}, +- {0x414af, 0x0}, +- {0x414b0, 0x0}, +- {0x414b1, 0x0}, +- {0x414b2, 0x0}, +- {0x414b3, 0x400}, +- {0x414b4, 0x8050}, +- {0x414b5, 0x803}, +- {0x414b6, 0x0}, +- {0x414b7, 0x10}, +- {0x414b8, 0x0}, +- {0x414b9, 0x0}, +- {0x414ba, 0x0}, +- {0x414bb, 0x7f00}, +- {0x414bc, 0x0}, +- {0x414bd, 0x0}, +- {0x414be, 0x0}, +- {0x414bf, 0x400}, +- {0x414c0, 0x807c}, +- {0x414c1, 0x0}, +- {0x414c2, 0x0}, +- {0x414c3, 0x410}, +- {0x414c4, 0x0}, +- {0x414c5, 0x0}, +- {0x414c6, 0x0}, +- {0x414c7, 0x0}, +- {0x414c8, 0x0}, +- {0x414c9, 0x0}, +- {0x414ca, 0x0}, +- {0x414cb, 0x400}, +- {0x414cc, 0x0}, +- {0x414cd, 0x0}, +- {0x414ce, 0x1}, +- {0x414cf, 0x0}, +- {0x414d0, 0x0}, +- {0x414d1, 0x0}, +- {0x414d2, 0x0}, +- {0x414d3, 0x400}, +- {0x414d4, 0x0}, +- {0x414d5, 0x0}, +- {0x414d6, 0x0}, +- {0x414d7, 0x0}, +- {0x414d8, 0x0}, +- {0x414d9, 0x0}, +- {0x414da, 0x0}, +- {0x414db, 0x0}, +- {0x414dc, 0x0}, +- {0x414dd, 0x0}, +- {0x414de, 0x0}, +- {0x414df, 0x0}, +- {0x414e0, 0x402c}, +- {0x414e1, 0xd00}, +- {0x414e2, 0x1}, +- {0x414e3, 0x0}, +- {0x414e4, 0x4050}, +- {0x414e5, 0x800}, +- {0x414e6, 0x0}, +- {0x414e7, 0x0}, +- {0x414e8, 0x0}, +- {0x414e9, 0x0}, +- {0x414ea, 0x0}, +- {0x414eb, 0x0}, +- {0x414ec, 0x0}, +- {0x414ed, 0x0}, +- {0x414ee, 0x0}, +- {0x414ef, 0x0}, +- {0x414f0, 0x0}, +- {0x414f1, 0x0}, +- {0x414f2, 0x0}, +- {0x414f3, 0x0}, +- {0x414f4, 0x4050}, +- {0x414f5, 0x803}, +- {0x414f6, 0x0}, +- {0x414f7, 0x0}, +- {0x414f8, 0x0}, +- {0x414f9, 0x0}, +- {0x414fa, 0x0}, +- {0x414fb, 0x0}, +- {0x414fc, 0x0}, +- {0x414fd, 0x0}, +- {0x414fe, 0x0}, +- {0x414ff, 0x0}, +- {0x41500, 0x0}, +- {0x41501, 0x0}, +- {0x41502, 0x0}, +- {0x41503, 0x0}, +- {0x41504, 0x4050}, +- {0x41505, 0x800}, +- {0x41506, 0x0}, +- {0x41507, 0x0}, +- {0x41508, 0x0}, +- {0x41509, 0x0}, +- {0x4150a, 0x0}, +- {0x4150b, 0x6b00}, +- {0x4150c, 0x0}, +- {0x4150d, 0x0}, +- {0x4150e, 0x0}, +- {0x4150f, 0x400}, +- {0x41510, 0x0}, +- {0x41511, 0x0}, +- {0x41512, 0x0}, +- {0x41513, 0x0}, +- {0x41514, 0x407c}, +- {0x41515, 0x0}, +- {0x41516, 0x0}, +- {0x41517, 0x0}, +- {0x41518, 0x0}, +- {0x41519, 0x0}, +- {0x4151a, 0x0}, +- {0x4151b, 0x0}, +- {0x4151c, 0x0}, +- {0x4151d, 0x0}, +- {0x4151e, 0x0}, +- {0x4151f, 0x0}, +- {0x41520, 0x0}, +- {0x41521, 0x0}, +- {0x41522, 0x1}, +- {0x41523, 0x0}, +- {0x41524, 0x0}, +- {0x41525, 0x0}, +- {0x41526, 0x0}, +- {0x41527, 0x0}, +- {0x41528, 0x0}, +- {0x41529, 0x0}, +- {0x4152a, 0x0}, +- {0x4152b, 0x4b00}, +- {0x4152c, 0x0}, +- {0x4152d, 0x0}, +- {0x4152e, 0x0}, +- {0x4152f, 0x1800}, +- {0x41530, 0x0}, +- {0x41531, 0x0}, +- {0x41532, 0x0}, +- {0x41533, 0x0}, +- {0x41534, 0x802c}, +- {0x41535, 0xd00}, +- {0x41536, 0x1}, +- {0x41537, 0x10}, +- {0x41538, 0x8050}, +- {0x41539, 0x800}, +- {0x4153a, 0x0}, +- {0x4153b, 0x10}, +- {0x4153c, 0x0}, +- {0x4153d, 0x0}, +- {0x4153e, 0x0}, +- {0x4153f, 0x0}, +- {0x41540, 0x0}, +- {0x41541, 0x0}, +- {0x41542, 0x0}, +- {0x41543, 0x0}, +- {0x41544, 0x0}, +- {0x41545, 0x0}, +- {0x41546, 0x0}, +- {0x41547, 0x0}, +- {0x41548, 0x8050}, +- {0x41549, 0x803}, +- {0x4154a, 0x0}, +- {0x4154b, 0x10}, +- {0x4154c, 0x0}, +- {0x4154d, 0x0}, +- {0x4154e, 0x0}, +- {0x4154f, 0x0}, +- {0x41550, 0x0}, +- {0x41551, 0x0}, +- {0x41552, 0x0}, +- {0x41553, 0x0}, +- {0x41554, 0x0}, +- {0x41555, 0x0}, +- {0x41556, 0x0}, +- {0x41557, 0x0}, +- {0x41558, 0x8050}, +- {0x41559, 0x800}, +- {0x4155a, 0x0}, +- {0x4155b, 0x10}, +- {0x4155c, 0x0}, +- {0x4155d, 0x0}, +- {0x4155e, 0x0}, +- {0x4155f, 0x0}, +- {0x41560, 0x0}, +- {0x41561, 0x0}, +- {0x41562, 0x0}, +- {0x41563, 0x6b00}, +- {0x41564, 0x0}, +- {0x41565, 0x0}, +- {0x41566, 0x0}, +- {0x41567, 0x400}, +- {0x41568, 0x807c}, +- {0x41569, 0x0}, +- {0x4156a, 0x0}, +- {0x4156b, 0x10}, +- {0x4156c, 0x0}, +- {0x4156d, 0x0}, +- {0x4156e, 0x0}, +- {0x4156f, 0x0}, +- {0x41570, 0x0}, +- {0x41571, 0x0}, +- {0x41572, 0x0}, +- {0x41573, 0x0}, +- {0x41574, 0x0}, +- {0x41575, 0x0}, +- {0x41576, 0x1}, +- {0x41577, 0x0}, +- {0x41578, 0x0}, +- {0x41579, 0x0}, +- {0x4157a, 0x0}, +- {0x4157b, 0x7b00}, +- {0x4157c, 0x0}, +- {0x4157d, 0x0}, +- {0x4157e, 0x0}, +- {0x4157f, 0x2000}, +- {0x41580, 0x402c}, +- {0x41581, 0xd00}, +- {0x41582, 0x1}, +- {0x41583, 0x0}, +- {0x41584, 0x5198}, +- {0x41585, 0x803}, +- {0x41586, 0x0}, +- {0x41587, 0x0}, +- {0x41588, 0x0}, +- {0x41589, 0x0}, +- {0x4158a, 0x0}, +- {0x4158b, 0x3b00}, +- {0x4158c, 0x0}, +- {0x4158d, 0x0}, +- {0x4158e, 0x0}, +- {0x4158f, 0x0}, +- {0x41590, 0x5218}, +- {0x41591, 0x803}, +- {0x41592, 0x0}, +- {0x41593, 0x0}, +- {0x41594, 0x0}, +- {0x41595, 0x0}, +- {0x41596, 0x0}, +- {0x41597, 0x0}, +- {0x41598, 0x0}, +- {0x41599, 0x0}, +- {0x4159a, 0x0}, +- {0x4159b, 0x6b00}, +- {0x4159c, 0x0}, +- {0x4159d, 0x0}, +- {0x4159e, 0x0}, +- {0x4159f, 0x400}, +- {0x415a0, 0x407c}, +- {0x415a1, 0x0}, +- {0x415a2, 0x0}, +- {0x415a3, 0x0}, +- {0x415a4, 0x0}, +- {0x415a5, 0x0}, +- {0x415a6, 0x0}, +- {0x415a7, 0x0}, +- {0x415a8, 0x0}, +- {0x415a9, 0x0}, +- {0x415aa, 0x0}, +- {0x415ab, 0x0}, +- {0x415ac, 0x0}, +- {0x415ad, 0x0}, +- {0x415ae, 0x1}, +- {0x415af, 0x0}, +- {0x415b0, 0x0}, +- {0x415b1, 0x0}, +- {0x415b2, 0x0}, +- {0x415b3, 0x1b00}, +- {0x415b4, 0x0}, +- {0x415b5, 0x0}, +- {0x415b6, 0x0}, +- {0x415b7, 0x0}, +- {0x415b8, 0x0}, +- {0x415b9, 0x0}, +- {0x415ba, 0x0}, +- {0x415bb, 0x0}, +- {0x415bc, 0x802c}, +- {0x415bd, 0xd00}, +- {0x415be, 0x1}, +- {0x415bf, 0x10}, +- {0x415c0, 0x9198}, +- {0x415c1, 0x803}, +- {0x415c2, 0x0}, +- {0x415c3, 0x10}, +- {0x415c4, 0x0}, +- {0x415c5, 0x0}, +- {0x415c6, 0x0}, +- {0x415c7, 0x0}, +- {0x415c8, 0x0}, +- {0x415c9, 0x0}, +- {0x415ca, 0x0}, +- {0x415cb, 0x2b00}, +- {0x415cc, 0x0}, +- {0x415cd, 0x0}, +- {0x415ce, 0x0}, +- {0x415cf, 0x0}, +- {0x415d0, 0x0}, +- {0x415d1, 0x0}, +- {0x415d2, 0x0}, +- {0x415d3, 0x0}, +- {0x415d4, 0x9218}, +- {0x415d5, 0x803}, +- {0x415d6, 0x0}, +- {0x415d7, 0x10}, +- {0x415d8, 0x0}, +- {0x415d9, 0x0}, +- {0x415da, 0x0}, +- {0x415db, 0x6b00}, +- {0x415dc, 0x0}, +- {0x415dd, 0x0}, +- {0x415de, 0x0}, +- {0x415df, 0x400}, +- {0x415e0, 0x0}, +- {0x415e1, 0x0}, +- {0x415e2, 0x0}, +- {0x415e3, 0x0}, +- {0x415e4, 0x807c}, +- {0x415e5, 0x0}, +- {0x415e6, 0x0}, +- {0x415e7, 0x10}, +- {0x415e8, 0x0}, +- {0x415e9, 0x0}, +- {0x415ea, 0x0}, +- {0x415eb, 0x0}, +- {0x415ec, 0x0}, +- {0x415ed, 0x0}, +- {0x415ee, 0x0}, +- {0x415ef, 0x0}, +- {0x415f0, 0x0}, +- {0x415f1, 0x0}, +- {0x415f2, 0x1}, +- {0x415f3, 0x0}, +- {0x415f4, 0x0}, +- {0x415f5, 0x0}, +- {0x415f6, 0x0}, +- {0x415f7, 0x0}, +- {0x415f8, 0x0}, +- {0x415f9, 0x0}, +- {0x415fa, 0x0}, +- {0x415fb, 0xb00}, +- {0x415fc, 0x0}, +- {0x415fd, 0x0}, +- {0x415fe, 0x0}, +- {0x415ff, 0x400}, +- {0x41600, 0x0}, +- {0x41601, 0x0}, +- {0x41602, 0x0}, +- {0x41603, 0x0}, +- {0x41604, 0x0}, +- {0x41605, 0x0}, +- {0x41606, 0x0}, +- {0x41607, 0x0}, +- {0x41608, 0x401c}, +- {0x41609, 0xd0}, +- {0x4160a, 0x1}, +- {0x4160b, 0x0}, +- {0x4160c, 0x4060}, +- {0x4160d, 0x84}, +- {0x4160e, 0x0}, +- {0x4160f, 0x0}, +- {0x41610, 0x0}, +- {0x41611, 0x0}, +- {0x41612, 0x0}, +- {0x41613, 0xb00}, +- {0x41614, 0x0}, +- {0x41615, 0x0}, +- {0x41616, 0x0}, +- {0x41617, 0x800}, +- {0x41618, 0x407c}, +- {0x41619, 0x0}, +- {0x4161a, 0x0}, +- {0x4161b, 0x0}, +- {0x4161c, 0x0}, +- {0x4161d, 0x0}, +- {0x4161e, 0x0}, +- {0x4161f, 0x0}, +- {0x41620, 0x0}, +- {0x41621, 0x0}, +- {0x41622, 0x0}, +- {0x41623, 0x0}, +- {0x41624, 0x4000}, +- {0x41625, 0x0}, +- {0x41626, 0x1}, +- {0x41627, 0x0}, +- {0x41628, 0x0}, +- {0x41629, 0x0}, +- {0x4162a, 0x0}, +- {0x4162b, 0x0}, +- {0x4162c, 0x402c}, +- {0x4162d, 0xd00}, +- {0x4162e, 0x1}, +- {0x4162f, 0x0}, +- {0x41630, 0x4020}, +- {0x41631, 0x803}, +- {0x41632, 0x0}, +- {0x41633, 0x0}, +- {0x41634, 0x0}, +- {0x41635, 0x0}, +- {0x41636, 0x0}, +- {0x41637, 0x0}, +- {0x41638, 0x0}, +- {0x41639, 0x0}, +- {0x4163a, 0x0}, +- {0x4163b, 0x2b00}, +- {0x4163c, 0x0}, +- {0x4163d, 0x0}, +- {0x4163e, 0x0}, +- {0x4163f, 0x800}, +- {0x41640, 0x0}, +- {0x41641, 0x0}, +- {0x41642, 0x0}, +- {0x41643, 0x0}, +- {0x41644, 0x407c}, +- {0x41645, 0x0}, +- {0x41646, 0x0}, +- {0x41647, 0x0}, +- {0x41648, 0x0}, +- {0x41649, 0x0}, +- {0x4164a, 0x0}, +- {0x4164b, 0x0}, +- {0x4164c, 0x0}, +- {0x4164d, 0x0}, +- {0x4164e, 0x0}, +- {0x4164f, 0x0}, +- {0x41650, 0x0}, +- {0x41651, 0x0}, +- {0x41652, 0x1}, +- {0x41653, 0x0}, +- {0x41654, 0x0}, +- {0x41655, 0x0}, +- {0x41656, 0x0}, +- {0x41657, 0x0}, +- {0x41658, 0x801c}, +- {0x41659, 0xd0}, +- {0x4165a, 0x1}, +- {0x4165b, 0x10}, +- {0x4165c, 0x8060}, +- {0x4165d, 0x84}, +- {0x4165e, 0x0}, +- {0x4165f, 0x10}, +- {0x41660, 0x0}, +- {0x41661, 0x0}, +- {0x41662, 0x0}, +- {0x41663, 0xb00}, +- {0x41664, 0x0}, +- {0x41665, 0x0}, +- {0x41666, 0x0}, +- {0x41667, 0x800}, +- {0x41668, 0x807c}, +- {0x41669, 0x0}, +- {0x4166a, 0x0}, +- {0x4166b, 0x10}, +- {0x4166c, 0x0}, +- {0x4166d, 0x0}, +- {0x4166e, 0x0}, +- {0x4166f, 0x0}, +- {0x41670, 0x0}, +- {0x41671, 0x0}, +- {0x41672, 0x0}, +- {0x41673, 0x0}, +- {0x41674, 0x8000}, +- {0x41675, 0x0}, +- {0x41676, 0x1}, +- {0x41677, 0x10}, +- {0x41678, 0x0}, +- {0x41679, 0x0}, +- {0x4167a, 0x0}, +- {0x4167b, 0x0}, +- {0x4167c, 0x802c}, +- {0x4167d, 0xd00}, +- {0x4167e, 0x1}, +- {0x4167f, 0x10}, +- {0x41680, 0x8020}, +- {0x41681, 0x803}, +- {0x41682, 0x0}, +- {0x41683, 0x10}, +- {0x41684, 0x0}, +- {0x41685, 0x0}, +- {0x41686, 0x0}, +- {0x41687, 0x0}, +- {0x41688, 0x0}, +- {0x41689, 0x0}, +- {0x4168a, 0x0}, +- {0x4168b, 0x2b00}, +- {0x4168c, 0x0}, +- {0x4168d, 0x0}, +- {0x4168e, 0x0}, +- {0x4168f, 0x800}, +- {0x41690, 0x0}, +- {0x41691, 0x0}, +- {0x41692, 0x0}, +- {0x41693, 0x0}, +- {0x41694, 0x807c}, +- {0x41695, 0x0}, +- {0x41696, 0x0}, +- {0x41697, 0x10}, +- {0x41698, 0x0}, +- {0x41699, 0x0}, +- {0x4169a, 0x0}, +- {0x4169b, 0x0}, +- {0x4169c, 0x0}, +- {0x4169d, 0x0}, +- {0x4169e, 0x0}, +- {0x4169f, 0x0}, +- {0x416a0, 0x0}, +- {0x416a1, 0x0}, +- {0x416a2, 0x1}, +- {0x416a3, 0x0}, +- {0x416a4, 0x0}, +- {0x416a5, 0x0}, +- {0x416a6, 0x0}, +- {0x416a7, 0x0}, +- {0x416a8, 0x402c}, +- {0x416a9, 0xd00}, +- {0x416aa, 0x1}, +- {0x416ab, 0x0}, +- {0x416ac, 0x4050}, +- {0x416ad, 0x803}, +- {0x416ae, 0x0}, +- {0x416af, 0x0}, +- {0x416b0, 0x0}, +- {0x416b1, 0x0}, +- {0x416b2, 0x0}, +- {0x416b3, 0x1b00}, +- {0x416b4, 0x0}, +- {0x416b5, 0x0}, +- {0x416b6, 0x0}, +- {0x416b7, 0x0}, +- {0x416b8, 0x0}, +- {0x416b9, 0x0}, +- {0x416ba, 0x0}, +- {0x416bb, 0x0}, +- {0x416bc, 0x0}, +- {0x416bd, 0x0}, +- {0x416be, 0x0}, +- {0x416bf, 0x0}, +- {0x416c0, 0x4050}, +- {0x416c1, 0x803}, +- {0x416c2, 0x0}, +- {0x416c3, 0x5a00}, +- {0x416c4, 0x0}, +- {0x416c5, 0x0}, +- {0x416c6, 0x0}, +- {0x416c7, 0x0}, +- {0x416c8, 0x0}, +- {0x416c9, 0x0}, +- {0x416ca, 0x0}, +- {0x416cb, 0x0}, +- {0x416cc, 0x0}, +- {0x416cd, 0x0}, +- {0x416ce, 0x0}, +- {0x416cf, 0x0}, +- {0x416d0, 0x0}, +- {0x416d1, 0x0}, +- {0x416d2, 0x0}, +- {0x416d3, 0x100}, +- {0x416d4, 0x0}, +- {0x416d5, 0x0}, +- {0x416d6, 0x0}, +- {0x416d7, 0x0}, +- {0x416d8, 0x4050}, +- {0x416d9, 0x803}, +- {0x416da, 0x0}, +- {0x416db, 0x0}, +- {0x416dc, 0x0}, +- {0x416dd, 0x0}, +- {0x416de, 0x0}, +- {0x416df, 0x0}, +- {0x416e0, 0x0}, +- {0x416e1, 0x0}, +- {0x416e2, 0x0}, +- {0x416e3, 0x6b00}, +- {0x416e4, 0x0}, +- {0x416e5, 0x0}, +- {0x416e6, 0x0}, +- {0x416e7, 0x400}, +- {0x416e8, 0x407c}, +- {0x416e9, 0x0}, +- {0x416ea, 0x0}, +- {0x416eb, 0x0}, +- {0x416ec, 0x0}, +- {0x416ed, 0x0}, +- {0x416ee, 0x0}, +- {0x416ef, 0x0}, +- {0x416f0, 0x0}, +- {0x416f1, 0x0}, +- {0x416f2, 0x0}, +- {0x416f3, 0x3b00}, +- {0x416f4, 0x0}, +- {0x416f5, 0x0}, +- {0x416f6, 0x0}, +- {0x416f7, 0x0}, +- {0x416f8, 0x0}, +- {0x416f9, 0x0}, +- {0x416fa, 0x0}, +- {0x416fb, 0x0}, +- {0x416fc, 0x0}, +- {0x416fd, 0x0}, +- {0x416fe, 0x1}, +- {0x416ff, 0x0}, +- {0x41700, 0x5758}, +- {0x41701, 0x0}, +- {0x41702, 0x0}, +- {0x41703, 0x0}, +- {0x41704, 0x4208}, +- {0x41705, 0x0}, +- {0x41706, 0x0}, +- {0x41707, 0x0}, +- {0x41708, 0x0}, +- {0x41709, 0x0}, +- {0x4170a, 0x0}, +- {0x4170b, 0x4b00}, +- {0x4170c, 0x0}, +- {0x4170d, 0x0}, +- {0x4170e, 0x0}, +- {0x4170f, 0x0}, +- {0x41710, 0x0}, +- {0x41711, 0x0}, +- {0x41712, 0x0}, +- {0x41713, 0x0}, +- {0x41714, 0x401c}, +- {0x41715, 0xd0}, +- {0x41716, 0x1}, +- {0x41717, 0x0}, +- {0x41718, 0x4060}, +- {0x41719, 0x84}, +- {0x4171a, 0x0}, +- {0x4171b, 0x0}, +- {0x4171c, 0x0}, +- {0x4171d, 0x0}, +- {0x4171e, 0x0}, +- {0x4171f, 0x0}, +- {0x41720, 0x0}, +- {0x41721, 0x0}, +- {0x41722, 0x0}, +- {0x41723, 0x7b00}, +- {0x41724, 0x0}, +- {0x41725, 0x0}, +- {0x41726, 0x0}, +- {0x41727, 0x0}, +- {0x41728, 0x407c}, +- {0x41729, 0x0}, +- {0x4172a, 0x0}, +- {0x4172b, 0x0}, +- {0x4172c, 0x0}, +- {0x4172d, 0x0}, +- {0x4172e, 0x0}, +- {0x4172f, 0x0}, +- {0x41730, 0x0}, +- {0x41731, 0x0}, +- {0x41732, 0x0}, +- {0x41733, 0x0}, +- {0x41734, 0x4000}, +- {0x41735, 0x0}, +- {0x41736, 0x1}, +- {0x41737, 0x0}, +- {0x41738, 0x0}, +- {0x41739, 0x0}, +- {0x4173a, 0x0}, +- {0x4173b, 0x0}, +- {0x4173c, 0x402c}, +- {0x4173d, 0xd00}, +- {0x4173e, 0x1}, +- {0x4173f, 0x0}, +- {0x41740, 0x4020}, +- {0x41741, 0x803}, +- {0x41742, 0x0}, +- {0x41743, 0x0}, +- {0x41744, 0x0}, +- {0x41745, 0x0}, +- {0x41746, 0x0}, +- {0x41747, 0x0}, +- {0x41748, 0x0}, +- {0x41749, 0x0}, +- {0x4174a, 0x0}, +- {0x4174b, 0x2b00}, +- {0x4174c, 0x0}, +- {0x4174d, 0x0}, +- {0x4174e, 0x0}, +- {0x4174f, 0x800}, +- {0x41750, 0x0}, +- {0x41751, 0x0}, +- {0x41752, 0x0}, +- {0x41753, 0x0}, +- {0x41754, 0x407c}, +- {0x41755, 0x0}, +- {0x41756, 0x0}, +- {0x41757, 0x0}, +- {0x41758, 0x0}, +- {0x41759, 0x0}, +- {0x4175a, 0x0}, +- {0x4175b, 0x0}, +- {0x4175c, 0x0}, +- {0x4175d, 0x0}, +- {0x4175e, 0x0}, +- {0x4175f, 0x0}, +- {0x41760, 0x4000}, +- {0x41761, 0x0}, +- {0x41762, 0x1}, +- {0x41763, 0x0}, +- {0x41764, 0x0}, +- {0x41765, 0x0}, +- {0x41766, 0x0}, +- {0x41767, 0x0}, +- {0x41768, 0x5758}, +- {0x41769, 0x0}, +- {0x4176a, 0x0}, +- {0x4176b, 0x0}, +- {0x4176c, 0x4008}, +- {0x4176d, 0x0}, +- {0x4176e, 0x0}, +- {0x4176f, 0x0}, +- {0x41770, 0x0}, +- {0x41771, 0x0}, +- {0x41772, 0x0}, +- {0x41773, 0x0}, +- {0x41774, 0x0}, +- {0x41775, 0x0}, +- {0x41776, 0x0}, +- {0x41777, 0x0}, +- {0x41778, 0x802c}, +- {0x41779, 0xd00}, +- {0x4177a, 0x1}, +- {0x4177b, 0x10}, +- {0x4177c, 0x8050}, +- {0x4177d, 0x803}, +- {0x4177e, 0x0}, +- {0x4177f, 0x10}, +- {0x41780, 0x0}, +- {0x41781, 0x0}, +- {0x41782, 0x0}, +- {0x41783, 0x1b00}, +- {0x41784, 0x0}, +- {0x41785, 0x0}, +- {0x41786, 0x0}, +- {0x41787, 0x0}, +- {0x41788, 0x0}, +- {0x41789, 0x0}, +- {0x4178a, 0x0}, +- {0x4178b, 0x0}, +- {0x4178c, 0x0}, +- {0x4178d, 0x0}, +- {0x4178e, 0x0}, +- {0x4178f, 0x0}, +- {0x41790, 0x8050}, +- {0x41791, 0x803}, +- {0x41792, 0x0}, +- {0x41793, 0x5a10}, +- {0x41794, 0x0}, +- {0x41795, 0x0}, +- {0x41796, 0x0}, +- {0x41797, 0x0}, +- {0x41798, 0x0}, +- {0x41799, 0x0}, +- {0x4179a, 0x0}, +- {0x4179b, 0x0}, +- {0x4179c, 0x0}, +- {0x4179d, 0x0}, +- {0x4179e, 0x0}, +- {0x4179f, 0x0}, +- {0x417a0, 0x0}, +- {0x417a1, 0x0}, +- {0x417a2, 0x0}, +- {0x417a3, 0x100}, +- {0x417a4, 0x0}, +- {0x417a5, 0x0}, +- {0x417a6, 0x0}, +- {0x417a7, 0x0}, +- {0x417a8, 0x8050}, +- {0x417a9, 0x803}, +- {0x417aa, 0x0}, +- {0x417ab, 0x10}, +- {0x417ac, 0x0}, +- {0x417ad, 0x0}, +- {0x417ae, 0x0}, +- {0x417af, 0x0}, +- {0x417b0, 0x0}, +- {0x417b1, 0x0}, +- {0x417b2, 0x0}, +- {0x417b3, 0x6b00}, +- {0x417b4, 0x0}, +- {0x417b5, 0x0}, +- {0x417b6, 0x0}, +- {0x417b7, 0x400}, +- {0x417b8, 0x807c}, +- {0x417b9, 0x0}, +- {0x417ba, 0x0}, +- {0x417bb, 0x10}, +- {0x417bc, 0x0}, +- {0x417bd, 0x0}, +- {0x417be, 0x0}, +- {0x417bf, 0x0}, +- {0x417c0, 0x0}, +- {0x417c1, 0x0}, +- {0x417c2, 0x0}, +- {0x417c3, 0x3b00}, +- {0x417c4, 0x0}, +- {0x417c5, 0x0}, +- {0x417c6, 0x0}, +- {0x417c7, 0x0}, +- {0x417c8, 0x0}, +- {0x417c9, 0x0}, +- {0x417ca, 0x0}, +- {0x417cb, 0x0}, +- {0x417cc, 0x0}, +- {0x417cd, 0x0}, +- {0x417ce, 0x1}, +- {0x417cf, 0x0}, +- {0x417d0, 0x9758}, +- {0x417d1, 0x0}, +- {0x417d2, 0x0}, +- {0x417d3, 0x10}, +- {0x417d4, 0x8208}, +- {0x417d5, 0x0}, +- {0x417d6, 0x0}, +- {0x417d7, 0x10}, +- {0x417d8, 0x0}, +- {0x417d9, 0x0}, +- {0x417da, 0x0}, +- {0x417db, 0x4b00}, +- {0x417dc, 0x0}, +- {0x417dd, 0x0}, +- {0x417de, 0x0}, +- {0x417df, 0x0}, +- {0x417e0, 0x0}, +- {0x417e1, 0x0}, +- {0x417e2, 0x0}, +- {0x417e3, 0x0}, +- {0x417e4, 0x801c}, +- {0x417e5, 0xd0}, +- {0x417e6, 0x1}, +- {0x417e7, 0x10}, +- {0x417e8, 0x8060}, +- {0x417e9, 0x84}, +- {0x417ea, 0x0}, +- {0x417eb, 0x10}, +- {0x417ec, 0x0}, +- {0x417ed, 0x0}, +- {0x417ee, 0x0}, +- {0x417ef, 0x0}, +- {0x417f0, 0x0}, +- {0x417f1, 0x0}, +- {0x417f2, 0x0}, +- {0x417f3, 0x7b00}, +- {0x417f4, 0x0}, +- {0x417f5, 0x0}, +- {0x417f6, 0x0}, +- {0x417f7, 0x0}, +- {0x417f8, 0x807c}, +- {0x417f9, 0x0}, +- {0x417fa, 0x0}, +- {0x417fb, 0x10}, +- {0x417fc, 0x0}, +- {0x417fd, 0x0}, +- {0x417fe, 0x0}, +- {0x417ff, 0x0}, +- {0x41800, 0x0}, +- {0x41801, 0x0}, +- {0x41802, 0x0}, +- {0x41803, 0x0}, +- {0x41804, 0x8000}, +- {0x41805, 0x0}, +- {0x41806, 0x1}, +- {0x41807, 0x10}, +- {0x41808, 0x0}, +- {0x41809, 0x0}, +- {0x4180a, 0x0}, +- {0x4180b, 0x0}, +- {0x4180c, 0x802c}, +- {0x4180d, 0xd00}, +- {0x4180e, 0x1}, +- {0x4180f, 0x10}, +- {0x41810, 0x8020}, +- {0x41811, 0x803}, +- {0x41812, 0x0}, +- {0x41813, 0x10}, +- {0x41814, 0x0}, +- {0x41815, 0x0}, +- {0x41816, 0x0}, +- {0x41817, 0x0}, +- {0x41818, 0x0}, +- {0x41819, 0x0}, +- {0x4181a, 0x0}, +- {0x4181b, 0x2b00}, +- {0x4181c, 0x0}, +- {0x4181d, 0x0}, +- {0x4181e, 0x0}, +- {0x4181f, 0x800}, +- {0x41820, 0x0}, +- {0x41821, 0x0}, +- {0x41822, 0x0}, +- {0x41823, 0x0}, +- {0x41824, 0x807c}, +- {0x41825, 0x0}, +- {0x41826, 0x0}, +- {0x41827, 0x10}, +- {0x41828, 0x0}, +- {0x41829, 0x0}, +- {0x4182a, 0x0}, +- {0x4182b, 0x0}, +- {0x4182c, 0x0}, +- {0x4182d, 0x0}, +- {0x4182e, 0x0}, +- {0x4182f, 0x0}, +- {0x41830, 0x8000}, +- {0x41831, 0x0}, +- {0x41832, 0x1}, +- {0x41833, 0x10}, +- {0x41834, 0x0}, +- {0x41835, 0x0}, +- {0x41836, 0x0}, +- {0x41837, 0x0}, +- {0x41838, 0x9758}, +- {0x41839, 0x0}, +- {0x4183a, 0x0}, +- {0x4183b, 0x10}, +- {0x4183c, 0x8008}, +- {0x4183d, 0x0}, +- {0x4183e, 0x0}, +- {0x4183f, 0x10}, +- {0x41840, 0x0}, +- {0x41841, 0x0}, +- {0x41842, 0x0}, +- {0x41843, 0x0}, +- {0x41844, 0x0}, +- {0x41845, 0x0}, +- {0x41846, 0x0}, +- {0x41847, 0x0}, +- {0x41848, 0xc068}, +- {0x41849, 0x0}, +- {0x4184a, 0x0}, +- {0x4184b, 0x10}, +- {0x4184c, 0x0}, +- {0x4184d, 0x0}, +- {0x4184e, 0x0}, +- {0x4184f, 0x0}, +- {0x41850, 0xd2d8}, +- {0x41851, 0x0}, +- {0x41852, 0x0}, +- {0x41853, 0x10}, +- {0x41854, 0xe008}, +- {0x41855, 0x0}, +- {0x41856, 0x0}, +- {0x41857, 0x10}, +- {0x41858, 0x0}, +- {0x41859, 0x0}, +- {0x4185a, 0x0}, +- {0x4185b, 0x5b00}, +- {0x4185c, 0x0}, +- {0x4185d, 0x0}, +- {0x4185e, 0x0}, +- {0x4185f, 0x0}, +- {0x41860, 0xc0f0}, +- {0x41861, 0x0}, +- {0x41862, 0x0}, +- {0x41863, 0x10}, +- {0x41864, 0x0}, +- {0x41865, 0x0}, +- {0x41866, 0x0}, +- {0x41867, 0x0}, +- {0x41868, 0xcfd8}, +- {0x41869, 0x0}, +- {0x4186a, 0x0}, +- {0x4186b, 0x10}, +- {0x4186c, 0xc008}, +- {0x4186d, 0x0}, +- {0x4186e, 0x0}, +- {0x4186f, 0x10}, +- {0x41870, 0x0}, +- {0x41871, 0x0}, +- {0x41872, 0x0}, +- {0x41873, 0x2b00}, +- {0x41874, 0x0}, +- {0x41875, 0x0}, +- {0x41876, 0x0}, +- {0x41877, 0x0}, +- {0x41878, 0xd058}, +- {0x41879, 0x0}, +- {0x4187a, 0x0}, +- {0x4187b, 0x10}, +- {0x4187c, 0xc008}, +- {0x4187d, 0x0}, +- {0x4187e, 0x0}, +- {0x4187f, 0x10}, +- {0x41880, 0x0}, +- {0x41881, 0x0}, +- {0x41882, 0x0}, +- {0x41883, 0x2b00}, +- {0x41884, 0x0}, +- {0x41885, 0x0}, +- {0x41886, 0x0}, +- {0x41887, 0x0}, +- {0x41888, 0xd0d8}, +- {0x41889, 0x0}, +- {0x4188a, 0x0}, +- {0x4188b, 0x10}, +- {0x4188c, 0xc088}, +- {0x4188d, 0x0}, +- {0x4188e, 0x0}, +- {0x4188f, 0x10}, +- {0x41890, 0x0}, +- {0x41891, 0x0}, +- {0x41892, 0x0}, +- {0x41893, 0x2b00}, +- {0x41894, 0x0}, +- {0x41895, 0x0}, +- {0x41896, 0x0}, +- {0x41897, 0x0}, +- {0x41898, 0xd158}, +- {0x41899, 0x0}, +- {0x4189a, 0x0}, +- {0x4189b, 0x10}, +- {0x4189c, 0xc008}, +- {0x4189d, 0x0}, +- {0x4189e, 0x0}, +- {0x4189f, 0x10}, +- {0x418a0, 0x0}, +- {0x418a1, 0x0}, +- {0x418a2, 0x0}, +- {0x418a3, 0x5b00}, +- {0x418a4, 0x0}, +- {0x418a5, 0x0}, +- {0x418a6, 0x0}, +- {0x418a7, 0x0}, +- {0x418a8, 0x402c}, +- {0x418a9, 0xd00}, +- {0x418aa, 0x1}, +- {0x418ab, 0x400}, +- {0x418ac, 0x4050}, +- {0x418ad, 0x800}, +- {0x418ae, 0x0}, +- {0x418af, 0x0}, +- {0x418b0, 0x0}, +- {0x418b1, 0x0}, +- {0x418b2, 0x0}, +- {0x418b3, 0x400}, +- {0x418b4, 0x4050}, +- {0x418b5, 0x803}, +- {0x418b6, 0x0}, +- {0x418b7, 0x0}, +- {0x418b8, 0x0}, +- {0x418b9, 0x0}, +- {0x418ba, 0x0}, +- {0x418bb, 0x6f00}, +- {0x418bc, 0x0}, +- {0x418bd, 0x0}, +- {0x418be, 0x0}, +- {0x418bf, 0x400}, +- {0x418c0, 0x407c}, +- {0x418c1, 0x0}, +- {0x418c2, 0x0}, +- {0x418c3, 0x400}, +- {0x418c4, 0x0}, +- {0x418c5, 0x0}, +- {0x418c6, 0x0}, +- {0x418c7, 0x0}, +- {0x418c8, 0x0}, +- {0x418c9, 0x0}, +- {0x418ca, 0x0}, +- {0x418cb, 0x400}, +- {0x418cc, 0x0}, +- {0x418cd, 0x0}, +- {0x418ce, 0x1}, +- {0x418cf, 0x0}, +- {0x418d0, 0x0}, +- {0x418d1, 0x0}, +- {0x418d2, 0x0}, +- {0x418d3, 0x400}, +- {0x418d4, 0x0}, +- {0x418d5, 0x0}, +- {0x418d6, 0x0}, +- {0x418d7, 0x0}, +- {0x418d8, 0x0}, +- {0x418d9, 0x0}, +- {0x418da, 0x0}, +- {0x418db, 0x0}, +- {0x418dc, 0x0}, +- {0x418dd, 0x0}, +- {0x418de, 0x0}, +- {0x418df, 0x0}, +- {0x418e0, 0x802c}, +- {0x418e1, 0xd00}, +- {0x418e2, 0x1}, +- {0x418e3, 0x410}, +- {0x418e4, 0x8050}, +- {0x418e5, 0x800}, +- {0x418e6, 0x0}, +- {0x418e7, 0x10}, +- {0x418e8, 0x0}, +- {0x418e9, 0x0}, +- {0x418ea, 0x0}, +- {0x418eb, 0x400}, +- {0x418ec, 0x8050}, +- {0x418ed, 0x803}, +- {0x418ee, 0x0}, +- {0x418ef, 0x10}, +- {0x418f0, 0x0}, +- {0x418f1, 0x0}, +- {0x418f2, 0x0}, +- {0x418f3, 0x6f00}, +- {0x418f4, 0x0}, +- {0x418f5, 0x0}, +- {0x418f6, 0x0}, +- {0x418f7, 0x400}, +- {0x418f8, 0x807c}, +- {0x418f9, 0x0}, +- {0x418fa, 0x0}, +- {0x418fb, 0x410}, +- {0x418fc, 0x0}, +- {0x418fd, 0x0}, +- {0x418fe, 0x0}, +- {0x418ff, 0x0}, +- {0x41900, 0x0}, +- {0x41901, 0x0}, +- {0x41902, 0x0}, +- {0x41903, 0x400}, +- {0x41904, 0x0}, +- {0x41905, 0x0}, +- {0x41906, 0x1}, +- {0x41907, 0x0}, +- {0x41908, 0x0}, +- {0x41909, 0x0}, +- {0x4190a, 0x0}, +- {0x4190b, 0x400}, +- {0x4190c, 0x0}, +- {0x4190d, 0x0}, +- {0x4190e, 0x0}, +- {0x4190f, 0x0}, +- {0x41910, 0x0}, +- {0x41911, 0x0}, +- {0x41912, 0x0}, +- {0x41913, 0x0}, +- {0x41914, 0x0}, +- {0x41915, 0x0}, +- {0x41916, 0x0}, +- {0x41917, 0x0}, +- {0x41918, 0x402c}, +- {0x41919, 0xd00}, +- {0x4191a, 0x1}, +- {0x4191b, 0x0}, +- {0x4191c, 0x4050}, +- {0x4191d, 0x800}, +- {0x4191e, 0x0}, +- {0x4191f, 0x0}, +- {0x41920, 0x0}, +- {0x41921, 0x0}, +- {0x41922, 0x0}, +- {0x41923, 0x0}, +- {0x41924, 0x4050}, +- {0x41925, 0x803}, +- {0x41926, 0x0}, +- {0x41927, 0x0}, +- {0x41928, 0x0}, +- {0x41929, 0x0}, +- {0x4192a, 0x0}, +- {0x4192b, 0x0}, +- {0x4192c, 0x4050}, +- {0x4192d, 0x800}, +- {0x4192e, 0x0}, +- {0x4192f, 0x0}, +- {0x41930, 0x0}, +- {0x41931, 0x0}, +- {0x41932, 0x0}, +- {0x41933, 0x4b00}, +- {0x41934, 0x0}, +- {0x41935, 0x0}, +- {0x41936, 0x0}, +- {0x41937, 0x400}, +- {0x41938, 0x0}, +- {0x41939, 0x0}, +- {0x4193a, 0x0}, +- {0x4193b, 0x0}, +- {0x4193c, 0x407c}, +- {0x4193d, 0x0}, +- {0x4193e, 0x0}, +- {0x4193f, 0x0}, +- {0x41940, 0x0}, +- {0x41941, 0x0}, +- {0x41942, 0x0}, +- {0x41943, 0x0}, +- {0x41944, 0x0}, +- {0x41945, 0x0}, +- {0x41946, 0x0}, +- {0x41947, 0x0}, +- {0x41948, 0x0}, +- {0x41949, 0x0}, +- {0x4194a, 0x1}, +- {0x4194b, 0x0}, +- {0x4194c, 0x0}, +- {0x4194d, 0x0}, +- {0x4194e, 0x0}, +- {0x4194f, 0x0}, +- {0x41950, 0x0}, +- {0x41951, 0x0}, +- {0x41952, 0x0}, +- {0x41953, 0x4b00}, +- {0x41954, 0x0}, +- {0x41955, 0x0}, +- {0x41956, 0x0}, +- {0x41957, 0x1800}, +- {0x41958, 0x0}, +- {0x41959, 0x0}, +- {0x4195a, 0x0}, +- {0x4195b, 0x0}, +- {0x4195c, 0x802c}, +- {0x4195d, 0xd00}, +- {0x4195e, 0x1}, +- {0x4195f, 0x10}, +- {0x41960, 0x8050}, +- {0x41961, 0x800}, +- {0x41962, 0x0}, +- {0x41963, 0x10}, +- {0x41964, 0x0}, +- {0x41965, 0x0}, +- {0x41966, 0x0}, +- {0x41967, 0x0}, +- {0x41968, 0x8050}, +- {0x41969, 0x803}, +- {0x4196a, 0x0}, +- {0x4196b, 0x10}, +- {0x4196c, 0x0}, +- {0x4196d, 0x0}, +- {0x4196e, 0x0}, +- {0x4196f, 0x0}, +- {0x41970, 0x8050}, +- {0x41971, 0x800}, +- {0x41972, 0x0}, +- {0x41973, 0x10}, +- {0x41974, 0x0}, +- {0x41975, 0x0}, +- {0x41976, 0x0}, +- {0x41977, 0x0}, +- {0x41978, 0x0}, +- {0x41979, 0x0}, +- {0x4197a, 0x0}, +- {0x4197b, 0x4b00}, +- {0x4197c, 0x0}, +- {0x4197d, 0x0}, +- {0x4197e, 0x0}, +- {0x4197f, 0x400}, +- {0x41980, 0x807c}, +- {0x41981, 0x0}, +- {0x41982, 0x0}, +- {0x41983, 0x10}, +- {0x41984, 0x0}, +- {0x41985, 0x0}, +- {0x41986, 0x0}, +- {0x41987, 0x0}, +- {0x41988, 0x0}, +- {0x41989, 0x0}, +- {0x4198a, 0x0}, +- {0x4198b, 0x0}, +- {0x4198c, 0x0}, +- {0x4198d, 0x0}, +- {0x4198e, 0x1}, +- {0x4198f, 0x0}, +- {0x41990, 0x0}, +- {0x41991, 0x0}, +- {0x41992, 0x0}, +- {0x41993, 0x5b00}, +- {0x41994, 0x0}, +- {0x41995, 0x0}, +- {0x41996, 0x0}, +- {0x41997, 0x2000}, +- {0x41998, 0x402c}, +- {0x41999, 0xd00}, +- {0x4199a, 0x1}, +- {0x4199b, 0x0}, +- {0x4199c, 0x5198}, +- {0x4199d, 0x803}, +- {0x4199e, 0x0}, +- {0x4199f, 0x0}, +- {0x419a0, 0x0}, +- {0x419a1, 0x0}, +- {0x419a2, 0x0}, +- {0x419a3, 0x1b00}, +- {0x419a4, 0x0}, +- {0x419a5, 0x0}, +- {0x419a6, 0x0}, +- {0x419a7, 0x0}, +- {0x419a8, 0x5218}, +- {0x419a9, 0x803}, +- {0x419aa, 0x0}, +- {0x419ab, 0x0}, +- {0x419ac, 0x0}, +- {0x419ad, 0x0}, +- {0x419ae, 0x0}, +- {0x419af, 0x0}, +- {0x419b0, 0x0}, +- {0x419b1, 0x0}, +- {0x419b2, 0x0}, +- {0x419b3, 0x4b00}, +- {0x419b4, 0x0}, +- {0x419b5, 0x0}, +- {0x419b6, 0x0}, +- {0x419b7, 0x400}, +- {0x419b8, 0x407c}, +- {0x419b9, 0x0}, +- {0x419ba, 0x0}, +- {0x419bb, 0x0}, +- {0x419bc, 0x0}, +- {0x419bd, 0x0}, +- {0x419be, 0x0}, +- {0x419bf, 0x0}, +- {0x419c0, 0x0}, +- {0x419c1, 0x0}, +- {0x419c2, 0x0}, +- {0x419c3, 0x0}, +- {0x419c4, 0x0}, +- {0x419c5, 0x0}, +- {0x419c6, 0x1}, +- {0x419c7, 0x0}, +- {0x419c8, 0x0}, +- {0x419c9, 0x0}, +- {0x419ca, 0x0}, +- {0x419cb, 0x1b00}, +- {0x419cc, 0x0}, +- {0x419cd, 0x0}, +- {0x419ce, 0x0}, +- {0x419cf, 0x0}, +- {0x419d0, 0x0}, +- {0x419d1, 0x0}, +- {0x419d2, 0x0}, +- {0x419d3, 0x0}, +- {0x419d4, 0x802c}, +- {0x419d5, 0xd00}, +- {0x419d6, 0x1}, +- {0x419d7, 0x10}, +- {0x419d8, 0x9198}, +- {0x419d9, 0x803}, +- {0x419da, 0x0}, +- {0x419db, 0x10}, +- {0x419dc, 0x0}, +- {0x419dd, 0x0}, +- {0x419de, 0x0}, +- {0x419df, 0x0}, +- {0x419e0, 0x0}, +- {0x419e1, 0x0}, +- {0x419e2, 0x0}, +- {0x419e3, 0x0}, +- {0x419e4, 0x0}, +- {0x419e5, 0x0}, +- {0x419e6, 0x0}, +- {0x419e7, 0x0}, +- {0x419e8, 0x0}, +- {0x419e9, 0x0}, +- {0x419ea, 0x0}, +- {0x419eb, 0x0}, +- {0x419ec, 0x9218}, +- {0x419ed, 0x803}, +- {0x419ee, 0x0}, +- {0x419ef, 0x10}, +- {0x419f0, 0x0}, +- {0x419f1, 0x0}, +- {0x419f2, 0x0}, +- {0x419f3, 0x4b00}, +- {0x419f4, 0x0}, +- {0x419f5, 0x0}, +- {0x419f6, 0x0}, +- {0x419f7, 0x400}, +- {0x419f8, 0x0}, +- {0x419f9, 0x0}, +- {0x419fa, 0x0}, +- {0x419fb, 0x0}, +- {0x419fc, 0x807c}, +- {0x419fd, 0x0}, +- {0x419fe, 0x0}, +- {0x419ff, 0x10}, +- {0x41a00, 0x0}, +- {0x41a01, 0x0}, +- {0x41a02, 0x0}, +- {0x41a03, 0x0}, +- {0x41a04, 0x0}, +- {0x41a05, 0x0}, +- {0x41a06, 0x0}, +- {0x41a07, 0x0}, +- {0x41a08, 0x0}, +- {0x41a09, 0x0}, +- {0x41a0a, 0x1}, +- {0x41a0b, 0x0}, +- {0x41a0c, 0x0}, +- {0x41a0d, 0x0}, +- {0x41a0e, 0x0}, +- {0x41a0f, 0x0}, +- {0x41a10, 0x0}, +- {0x41a11, 0x0}, +- {0x41a12, 0x0}, +- {0x41a13, 0xb00}, +- {0x41a14, 0x0}, +- {0x41a15, 0x0}, +- {0x41a16, 0x0}, +- {0x41a17, 0x400}, +- {0x41a18, 0x0}, +- {0x41a19, 0x0}, +- {0x41a1a, 0x0}, +- {0x41a1b, 0x0}, +- {0x41a1c, 0x0}, +- {0x41a1d, 0x0}, +- {0x41a1e, 0x0}, +- {0x41a1f, 0x0}, +- {0x41a20, 0x401c}, +- {0x41a21, 0xd0}, +- {0x41a22, 0x1}, +- {0x41a23, 0x0}, +- {0x41a24, 0x4060}, +- {0x41a25, 0x84}, +- {0x41a26, 0x0}, +- {0x41a27, 0x0}, +- {0x41a28, 0x0}, +- {0x41a29, 0x0}, +- {0x41a2a, 0x0}, +- {0x41a2b, 0xb00}, +- {0x41a2c, 0x0}, +- {0x41a2d, 0x0}, +- {0x41a2e, 0x0}, +- {0x41a2f, 0x800}, +- {0x41a30, 0x407c}, +- {0x41a31, 0x0}, +- {0x41a32, 0x0}, +- {0x41a33, 0x0}, +- {0x41a34, 0x0}, +- {0x41a35, 0x0}, +- {0x41a36, 0x0}, +- {0x41a37, 0x0}, +- {0x41a38, 0x0}, +- {0x41a39, 0x0}, +- {0x41a3a, 0x0}, +- {0x41a3b, 0x0}, +- {0x41a3c, 0x4000}, +- {0x41a3d, 0x0}, +- {0x41a3e, 0x1}, +- {0x41a3f, 0x0}, +- {0x41a40, 0x0}, +- {0x41a41, 0x0}, +- {0x41a42, 0x0}, +- {0x41a43, 0x0}, +- {0x41a44, 0x402c}, +- {0x41a45, 0xd00}, +- {0x41a46, 0x1}, +- {0x41a47, 0x0}, +- {0x41a48, 0x4020}, +- {0x41a49, 0x803}, +- {0x41a4a, 0x0}, +- {0x41a4b, 0x0}, +- {0x41a4c, 0x0}, +- {0x41a4d, 0x0}, +- {0x41a4e, 0x0}, +- {0x41a4f, 0x0}, +- {0x41a50, 0x0}, +- {0x41a51, 0x0}, +- {0x41a52, 0x0}, +- {0x41a53, 0x2b00}, +- {0x41a54, 0x0}, +- {0x41a55, 0x0}, +- {0x41a56, 0x0}, +- {0x41a57, 0x800}, +- {0x41a58, 0x0}, +- {0x41a59, 0x0}, +- {0x41a5a, 0x0}, +- {0x41a5b, 0x0}, +- {0x41a5c, 0x407c}, +- {0x41a5d, 0x0}, +- {0x41a5e, 0x0}, +- {0x41a5f, 0x0}, +- {0x41a60, 0x0}, +- {0x41a61, 0x0}, +- {0x41a62, 0x0}, +- {0x41a63, 0x0}, +- {0x41a64, 0x0}, +- {0x41a65, 0x0}, +- {0x41a66, 0x0}, +- {0x41a67, 0x0}, +- {0x41a68, 0x0}, +- {0x41a69, 0x0}, +- {0x41a6a, 0x1}, +- {0x41a6b, 0x0}, +- {0x41a6c, 0x0}, +- {0x41a6d, 0x0}, +- {0x41a6e, 0x0}, +- {0x41a6f, 0x0}, +- {0x41a70, 0x801c}, +- {0x41a71, 0xd0}, +- {0x41a72, 0x1}, +- {0x41a73, 0x10}, +- {0x41a74, 0x8060}, +- {0x41a75, 0x84}, +- {0x41a76, 0x0}, +- {0x41a77, 0x10}, +- {0x41a78, 0x0}, +- {0x41a79, 0x0}, +- {0x41a7a, 0x0}, +- {0x41a7b, 0xb00}, +- {0x41a7c, 0x0}, +- {0x41a7d, 0x0}, +- {0x41a7e, 0x0}, +- {0x41a7f, 0x800}, +- {0x41a80, 0x807c}, +- {0x41a81, 0x0}, +- {0x41a82, 0x0}, +- {0x41a83, 0x10}, +- {0x41a84, 0x0}, +- {0x41a85, 0x0}, +- {0x41a86, 0x0}, +- {0x41a87, 0x0}, +- {0x41a88, 0x0}, +- {0x41a89, 0x0}, +- {0x41a8a, 0x0}, +- {0x41a8b, 0x0}, +- {0x41a8c, 0x8000}, +- {0x41a8d, 0x0}, +- {0x41a8e, 0x1}, +- {0x41a8f, 0x10}, +- {0x41a90, 0x0}, +- {0x41a91, 0x0}, +- {0x41a92, 0x0}, +- {0x41a93, 0x0}, +- {0x41a94, 0x802c}, +- {0x41a95, 0xd00}, +- {0x41a96, 0x1}, +- {0x41a97, 0x10}, +- {0x41a98, 0x8020}, +- {0x41a99, 0x803}, +- {0x41a9a, 0x0}, +- {0x41a9b, 0x10}, +- {0x41a9c, 0x0}, +- {0x41a9d, 0x0}, +- {0x41a9e, 0x0}, +- {0x41a9f, 0x0}, +- {0x41aa0, 0x0}, +- {0x41aa1, 0x0}, +- {0x41aa2, 0x0}, +- {0x41aa3, 0x2b00}, +- {0x41aa4, 0x0}, +- {0x41aa5, 0x0}, +- {0x41aa6, 0x0}, +- {0x41aa7, 0x800}, +- {0x41aa8, 0x0}, +- {0x41aa9, 0x0}, +- {0x41aaa, 0x0}, +- {0x41aab, 0x0}, +- {0x41aac, 0x807c}, +- {0x41aad, 0x0}, +- {0x41aae, 0x0}, +- {0x41aaf, 0x10}, +- {0x41ab0, 0x0}, +- {0x41ab1, 0x0}, +- {0x41ab2, 0x0}, +- {0x41ab3, 0x0}, +- {0x41ab4, 0x0}, +- {0x41ab5, 0x0}, +- {0x41ab6, 0x0}, +- {0x41ab7, 0x0}, +- {0x41ab8, 0x0}, +- {0x41ab9, 0x0}, +- {0x41aba, 0x1}, +- {0x41abb, 0x0}, +- {0x41abc, 0x0}, +- {0x41abd, 0x0}, +- {0x41abe, 0x0}, +- {0x41abf, 0x0}, +- {0x41ac0, 0x402c}, +- {0x41ac1, 0xd00}, +- {0x41ac2, 0x1}, +- {0x41ac3, 0x0}, +- {0x41ac4, 0x4050}, +- {0x41ac5, 0x803}, +- {0x41ac6, 0x0}, +- {0x41ac7, 0x0}, +- {0x41ac8, 0x0}, +- {0x41ac9, 0x0}, +- {0x41aca, 0x0}, +- {0x41acb, 0x0}, +- {0x41acc, 0x0}, +- {0x41acd, 0x0}, +- {0x41ace, 0x0}, +- {0x41acf, 0x0}, +- {0x41ad0, 0x0}, +- {0x41ad1, 0x0}, +- {0x41ad2, 0x0}, +- {0x41ad3, 0x0}, +- {0x41ad4, 0x0}, +- {0x41ad5, 0x0}, +- {0x41ad6, 0x0}, +- {0x41ad7, 0x0}, +- {0x41ad8, 0x4050}, +- {0x41ad9, 0x803}, +- {0x41ada, 0x0}, +- {0x41adb, 0x5a00}, +- {0x41adc, 0x0}, +- {0x41add, 0x0}, +- {0x41ade, 0x0}, +- {0x41adf, 0x0}, +- {0x41ae0, 0x0}, +- {0x41ae1, 0x0}, +- {0x41ae2, 0x0}, +- {0x41ae3, 0x100}, +- {0x41ae4, 0x0}, +- {0x41ae5, 0x0}, +- {0x41ae6, 0x0}, +- {0x41ae7, 0x0}, +- {0x41ae8, 0x4050}, +- {0x41ae9, 0x803}, +- {0x41aea, 0x0}, +- {0x41aeb, 0x0}, +- {0x41aec, 0x0}, +- {0x41aed, 0x0}, +- {0x41aee, 0x0}, +- {0x41aef, 0x0}, +- {0x41af0, 0x0}, +- {0x41af1, 0x0}, +- {0x41af2, 0x0}, +- {0x41af3, 0x4b00}, +- {0x41af4, 0x0}, +- {0x41af5, 0x0}, +- {0x41af6, 0x0}, +- {0x41af7, 0x400}, +- {0x41af8, 0x407c}, +- {0x41af9, 0x0}, +- {0x41afa, 0x0}, +- {0x41afb, 0x0}, +- {0x41afc, 0x0}, +- {0x41afd, 0x0}, +- {0x41afe, 0x0}, +- {0x41aff, 0x0}, +- {0x41b00, 0x0}, +- {0x41b01, 0x0}, +- {0x41b02, 0x0}, +- {0x41b03, 0x3b00}, +- {0x41b04, 0x0}, +- {0x41b05, 0x0}, +- {0x41b06, 0x0}, +- {0x41b07, 0x0}, +- {0x41b08, 0x0}, +- {0x41b09, 0x0}, +- {0x41b0a, 0x0}, +- {0x41b0b, 0x0}, +- {0x41b0c, 0x0}, +- {0x41b0d, 0x0}, +- {0x41b0e, 0x1}, +- {0x41b0f, 0x0}, +- {0x41b10, 0x5758}, +- {0x41b11, 0x0}, +- {0x41b12, 0x0}, +- {0x41b13, 0x0}, +- {0x41b14, 0x4208}, +- {0x41b15, 0x0}, +- {0x41b16, 0x0}, +- {0x41b17, 0x0}, +- {0x41b18, 0x0}, +- {0x41b19, 0x0}, +- {0x41b1a, 0x0}, +- {0x41b1b, 0x4b00}, +- {0x41b1c, 0x0}, +- {0x41b1d, 0x0}, +- {0x41b1e, 0x0}, +- {0x41b1f, 0x0}, +- {0x41b20, 0x0}, +- {0x41b21, 0x0}, +- {0x41b22, 0x0}, +- {0x41b23, 0x0}, +- {0x41b24, 0x401c}, +- {0x41b25, 0xd0}, +- {0x41b26, 0x1}, +- {0x41b27, 0x0}, +- {0x41b28, 0x4060}, +- {0x41b29, 0x84}, +- {0x41b2a, 0x0}, +- {0x41b2b, 0x0}, +- {0x41b2c, 0x0}, +- {0x41b2d, 0x0}, +- {0x41b2e, 0x0}, +- {0x41b2f, 0x0}, +- {0x41b30, 0x0}, +- {0x41b31, 0x0}, +- {0x41b32, 0x0}, +- {0x41b33, 0x7b00}, +- {0x41b34, 0x0}, +- {0x41b35, 0x0}, +- {0x41b36, 0x0}, +- {0x41b37, 0x0}, +- {0x41b38, 0x407c}, +- {0x41b39, 0x0}, +- {0x41b3a, 0x0}, +- {0x41b3b, 0x0}, +- {0x41b3c, 0x0}, +- {0x41b3d, 0x0}, +- {0x41b3e, 0x0}, +- {0x41b3f, 0x0}, +- {0x41b40, 0x0}, +- {0x41b41, 0x0}, +- {0x41b42, 0x0}, +- {0x41b43, 0x0}, +- {0x41b44, 0x4000}, +- {0x41b45, 0x0}, +- {0x41b46, 0x1}, +- {0x41b47, 0x0}, +- {0x41b48, 0x0}, +- {0x41b49, 0x0}, +- {0x41b4a, 0x0}, +- {0x41b4b, 0x0}, +- {0x41b4c, 0x402c}, +- {0x41b4d, 0xd00}, +- {0x41b4e, 0x1}, +- {0x41b4f, 0x0}, +- {0x41b50, 0x4020}, +- {0x41b51, 0x803}, +- {0x41b52, 0x0}, +- {0x41b53, 0x0}, +- {0x41b54, 0x0}, +- {0x41b55, 0x0}, +- {0x41b56, 0x0}, +- {0x41b57, 0x0}, +- {0x41b58, 0x0}, +- {0x41b59, 0x0}, +- {0x41b5a, 0x0}, +- {0x41b5b, 0x2b00}, +- {0x41b5c, 0x0}, +- {0x41b5d, 0x0}, +- {0x41b5e, 0x0}, +- {0x41b5f, 0x800}, +- {0x41b60, 0x0}, +- {0x41b61, 0x0}, +- {0x41b62, 0x0}, +- {0x41b63, 0x0}, +- {0x41b64, 0x407c}, +- {0x41b65, 0x0}, +- {0x41b66, 0x0}, +- {0x41b67, 0x0}, +- {0x41b68, 0x0}, +- {0x41b69, 0x0}, +- {0x41b6a, 0x0}, +- {0x41b6b, 0x0}, +- {0x41b6c, 0x0}, +- {0x41b6d, 0x0}, +- {0x41b6e, 0x0}, +- {0x41b6f, 0x0}, +- {0x41b70, 0x4000}, +- {0x41b71, 0x0}, +- {0x41b72, 0x1}, +- {0x41b73, 0x0}, +- {0x41b74, 0x0}, +- {0x41b75, 0x0}, +- {0x41b76, 0x0}, +- {0x41b77, 0x0}, +- {0x41b78, 0x5758}, +- {0x41b79, 0x0}, +- {0x41b7a, 0x0}, +- {0x41b7b, 0x0}, +- {0x41b7c, 0x4008}, +- {0x41b7d, 0x0}, +- {0x41b7e, 0x0}, +- {0x41b7f, 0x0}, +- {0x41b80, 0x0}, +- {0x41b81, 0x0}, +- {0x41b82, 0x0}, +- {0x41b83, 0x0}, +- {0x41b84, 0x0}, +- {0x41b85, 0x0}, +- {0x41b86, 0x0}, +- {0x41b87, 0x0}, +- {0x41b88, 0x802c}, +- {0x41b89, 0xd00}, +- {0x41b8a, 0x1}, +- {0x41b8b, 0x10}, +- {0x41b8c, 0x8050}, +- {0x41b8d, 0x803}, +- {0x41b8e, 0x0}, +- {0x41b8f, 0x10}, +- {0x41b90, 0x0}, +- {0x41b91, 0x0}, +- {0x41b92, 0x0}, +- {0x41b93, 0x0}, +- {0x41b94, 0x0}, +- {0x41b95, 0x0}, +- {0x41b96, 0x0}, +- {0x41b97, 0x0}, +- {0x41b98, 0x0}, +- {0x41b99, 0x0}, +- {0x41b9a, 0x0}, +- {0x41b9b, 0x0}, +- {0x41b9c, 0x0}, +- {0x41b9d, 0x0}, +- {0x41b9e, 0x0}, +- {0x41b9f, 0x0}, +- {0x41ba0, 0x8050}, +- {0x41ba1, 0x803}, +- {0x41ba2, 0x0}, +- {0x41ba3, 0x5a10}, +- {0x41ba4, 0x0}, +- {0x41ba5, 0x0}, +- {0x41ba6, 0x0}, +- {0x41ba7, 0x0}, +- {0x41ba8, 0x0}, +- {0x41ba9, 0x0}, +- {0x41baa, 0x0}, +- {0x41bab, 0x100}, +- {0x41bac, 0x0}, +- {0x41bad, 0x0}, +- {0x41bae, 0x0}, +- {0x41baf, 0x0}, +- {0x41bb0, 0x8050}, +- {0x41bb1, 0x803}, +- {0x41bb2, 0x0}, +- {0x41bb3, 0x10}, +- {0x41bb4, 0x0}, +- {0x41bb5, 0x0}, +- {0x41bb6, 0x0}, +- {0x41bb7, 0x0}, +- {0x41bb8, 0x0}, +- {0x41bb9, 0x0}, +- {0x41bba, 0x0}, +- {0x41bbb, 0x4b00}, +- {0x41bbc, 0x0}, +- {0x41bbd, 0x0}, +- {0x41bbe, 0x0}, +- {0x41bbf, 0x400}, +- {0x41bc0, 0x807c}, +- {0x41bc1, 0x0}, +- {0x41bc2, 0x0}, +- {0x41bc3, 0x10}, +- {0x41bc4, 0x0}, +- {0x41bc5, 0x0}, +- {0x41bc6, 0x0}, +- {0x41bc7, 0x0}, +- {0x41bc8, 0x0}, +- {0x41bc9, 0x0}, +- {0x41bca, 0x0}, +- {0x41bcb, 0x3b00}, +- {0x41bcc, 0x0}, +- {0x41bcd, 0x0}, +- {0x41bce, 0x0}, +- {0x41bcf, 0x0}, +- {0x41bd0, 0x0}, +- {0x41bd1, 0x0}, +- {0x41bd2, 0x0}, +- {0x41bd3, 0x0}, +- {0x41bd4, 0x0}, +- {0x41bd5, 0x0}, +- {0x41bd6, 0x1}, +- {0x41bd7, 0x0}, +- {0x41bd8, 0x9758}, +- {0x41bd9, 0x0}, +- {0x41bda, 0x0}, +- {0x41bdb, 0x10}, +- {0x41bdc, 0x8208}, +- {0x41bdd, 0x0}, +- {0x41bde, 0x0}, +- {0x41bdf, 0x10}, +- {0x41be0, 0x0}, +- {0x41be1, 0x0}, +- {0x41be2, 0x0}, +- {0x41be3, 0x4b00}, +- {0x41be4, 0x0}, +- {0x41be5, 0x0}, +- {0x41be6, 0x0}, +- {0x41be7, 0x0}, +- {0x41be8, 0x0}, +- {0x41be9, 0x0}, +- {0x41bea, 0x0}, +- {0x41beb, 0x0}, +- {0x41bec, 0x801c}, +- {0x41bed, 0xd0}, +- {0x41bee, 0x1}, +- {0x41bef, 0x10}, +- {0x41bf0, 0x8060}, +- {0x41bf1, 0x84}, +- {0x41bf2, 0x0}, +- {0x41bf3, 0x10}, +- {0x41bf4, 0x0}, +- {0x41bf5, 0x0}, +- {0x41bf6, 0x0}, +- {0x41bf7, 0x0}, +- {0x41bf8, 0x0}, +- {0x41bf9, 0x0}, +- {0x41bfa, 0x0}, +- {0x41bfb, 0x7b00}, +- {0x41bfc, 0x0}, +- {0x41bfd, 0x0}, +- {0x41bfe, 0x0}, +- {0x41bff, 0x0}, +- {0x41c00, 0x807c}, +- {0x41c01, 0x0}, +- {0x41c02, 0x0}, +- {0x41c03, 0x10}, +- {0x41c04, 0x0}, +- {0x41c05, 0x0}, +- {0x41c06, 0x0}, +- {0x41c07, 0x0}, +- {0x41c08, 0x0}, +- {0x41c09, 0x0}, +- {0x41c0a, 0x0}, +- {0x41c0b, 0x0}, +- {0x41c0c, 0x8000}, +- {0x41c0d, 0x0}, +- {0x41c0e, 0x1}, +- {0x41c0f, 0x10}, +- {0x41c10, 0x0}, +- {0x41c11, 0x0}, +- {0x41c12, 0x0}, +- {0x41c13, 0x0}, +- {0x41c14, 0x802c}, +- {0x41c15, 0xd00}, +- {0x41c16, 0x1}, +- {0x41c17, 0x10}, +- {0x41c18, 0x8020}, +- {0x41c19, 0x803}, +- {0x41c1a, 0x0}, +- {0x41c1b, 0x10}, +- {0x41c1c, 0x0}, +- {0x41c1d, 0x0}, +- {0x41c1e, 0x0}, +- {0x41c1f, 0x0}, +- {0x41c20, 0x0}, +- {0x41c21, 0x0}, +- {0x41c22, 0x0}, +- {0x41c23, 0x2b00}, +- {0x41c24, 0x0}, +- {0x41c25, 0x0}, +- {0x41c26, 0x0}, +- {0x41c27, 0x800}, +- {0x41c28, 0x0}, +- {0x41c29, 0x0}, +- {0x41c2a, 0x0}, +- {0x41c2b, 0x0}, +- {0x41c2c, 0x807c}, +- {0x41c2d, 0x0}, +- {0x41c2e, 0x0}, +- {0x41c2f, 0x10}, +- {0x41c30, 0x0}, +- {0x41c31, 0x0}, +- {0x41c32, 0x0}, +- {0x41c33, 0x0}, +- {0x41c34, 0x0}, +- {0x41c35, 0x0}, +- {0x41c36, 0x0}, +- {0x41c37, 0x0}, +- {0x41c38, 0x8000}, +- {0x41c39, 0x0}, +- {0x41c3a, 0x1}, +- {0x41c3b, 0x10}, +- {0x41c3c, 0x0}, +- {0x41c3d, 0x0}, +- {0x41c3e, 0x0}, +- {0x41c3f, 0x0}, +- {0x41c40, 0x9758}, +- {0x41c41, 0x0}, +- {0x41c42, 0x0}, +- {0x41c43, 0x10}, +- {0x41c44, 0x8008}, +- {0x41c45, 0x0}, +- {0x41c46, 0x0}, +- {0x41c47, 0x10}, +- {0x41c48, 0x0}, +- {0x41c49, 0x0}, +- {0x41c4a, 0x0}, +- {0x41c4b, 0x0}, +- {0x41c4c, 0x0}, +- {0x41c4d, 0x0}, +- {0x41c4e, 0x0}, +- {0x41c4f, 0x0}, +- {0x41c50, 0xc068}, +- {0x41c51, 0x0}, +- {0x41c52, 0x0}, +- {0x41c53, 0x10}, +- {0x41c54, 0x0}, +- {0x41c55, 0x0}, +- {0x41c56, 0x0}, +- {0x41c57, 0x0}, +- {0x9002e, 0x10}, +- {0x9002f, 0x400}, +- {0x90030, 0x80e}, +- {0x90031, 0xb}, +- {0x90032, 0x480}, +- {0x90033, 0x809}, +- {0x90034, 0x9}, +- {0x90035, 0x308}, +- {0x90036, 0xc09}, +- {0x90037, 0x28}, +- {0x90038, 0x8160}, +- {0x90039, 0x87c}, +- {0x9003a, 0x98}, +- {0x9003b, 0x820}, +- {0x9003c, 0xc7e}, +- {0x9003d, 0x2}, +- {0x9003e, 0x1}, +- {0x9003f, 0x78}, +- {0x90040, 0xa}, +- {0x90041, 0x370}, +- {0x90042, 0x839}, +- {0x90043, 0x18}, +- {0x90044, 0x8160}, +- {0x90045, 0x83c}, +- {0x90046, 0x9}, +- {0x90047, 0x150}, +- {0x90048, 0x839}, +- {0x90049, 0x70}, +- {0x9004a, 0x392}, +- {0x9004b, 0x39}, +- {0x9004c, 0x78}, +- {0x9004d, 0x39a}, +- {0x9004e, 0x39}, +- {0x9004f, 0xe09}, +- {0x90050, 0x100}, +- {0x90051, 0x839}, +- {0x90052, 0x2}, +- {0x90053, 0x1}, +- {0x90054, 0x38}, +- {0x90055, 0x0}, +- {0x90056, 0x100}, +- {0x90057, 0x839}, +- {0x90058, 0x0}, +- {0x90059, 0x398}, +- {0x9005a, 0x839}, +- {0x9005b, 0xe19}, +- {0x9005c, 0x100}, +- {0x9005d, 0x839}, +- {0x9005e, 0x2}, +- {0x9005f, 0x1}, +- {0x90060, 0x38}, +- {0x90061, 0x0}, +- {0x90062, 0x100}, +- {0x90063, 0x839}, +- {0x90064, 0x0}, +- {0x90065, 0x390}, +- {0x90066, 0x839}, +- {0x90067, 0x78}, +- {0x90068, 0x39a}, +- {0x90069, 0x39}, +- {0x9006a, 0xe29}, +- {0x9006b, 0x100}, +- {0x9006c, 0x839}, +- {0x9006d, 0x2}, +- {0x9006e, 0x1}, +- {0x9006f, 0x38}, +- {0x90070, 0x0}, +- {0x90071, 0x100}, +- {0x90072, 0x839}, +- {0x90073, 0x70}, +- {0x90074, 0x392}, +- {0x90075, 0x39}, +- {0x90076, 0x0}, +- {0x90077, 0xf0}, +- {0x90078, 0x909}, +- {0x90079, 0x18}, +- {0x9007a, 0x8160}, +- {0x9007b, 0x8bc}, +- {0x9007c, 0x8}, +- {0x9007d, 0x13a}, +- {0x9007e, 0xb9}, +- {0x9007f, 0x24b}, +- {0x90080, 0x100}, +- {0x90081, 0x8b9}, +- {0x90082, 0x2}, +- {0x90083, 0x1}, +- {0x90084, 0xb8}, +- {0x90085, 0x0}, +- {0x90086, 0x100}, +- {0x90087, 0x8b9}, +- {0x90088, 0x20}, +- {0x90089, 0x4}, +- {0x9008a, 0xb8}, +- {0x9008b, 0x20}, +- {0x9008c, 0x4}, +- {0x9008d, 0xb8}, +- {0x9008e, 0x5}, +- {0x9008f, 0x0}, +- {0x90090, 0xb8}, +- {0x90091, 0x479}, +- {0x90092, 0xc7f8}, +- {0x90093, 0x8bc}, +- {0x90094, 0x0}, +- {0x90095, 0x0}, +- {0x90096, 0xb8}, +- {0x90097, 0x0}, +- {0x90098, 0xa8}, +- {0x90099, 0x8b9}, +- {0x9009a, 0x9}, +- {0x9009b, 0xc9c0}, +- {0x9009c, 0xcbc}, +- {0x9009d, 0x0}, +- {0x9009e, 0x0}, +- {0x9009f, 0xb8}, +- {0x900a0, 0x25b}, +- {0x900a1, 0x100}, +- {0x900a2, 0xcb9}, +- {0x900a3, 0x20}, +- {0x900a4, 0x4}, +- {0x900a5, 0xb8}, +- {0x900a6, 0x20}, +- {0x900a7, 0x4}, +- {0x900a8, 0xb8}, +- {0x900a9, 0x20}, +- {0x900aa, 0x4}, +- {0x900ab, 0xb8}, +- {0x900ac, 0x20}, +- {0x900ad, 0x4}, +- {0x900ae, 0xb8}, +- {0x900af, 0x10}, +- {0x900b0, 0x400}, +- {0x900b1, 0x89e}, +- {0x900b2, 0x8}, +- {0x900b3, 0x370}, +- {0x900b4, 0x839}, +- {0x900b5, 0x0}, +- {0x900b6, 0xf0}, +- {0x900b7, 0x909}, +- {0x900b8, 0x33b}, +- {0x900b9, 0x100}, +- {0x900ba, 0x8b9}, +- {0x900bb, 0x0}, +- {0x900bc, 0x100}, +- {0x900bd, 0x8b9}, +- {0x900be, 0x23b}, +- {0x900bf, 0x100}, +- {0x900c0, 0xc99}, +- {0x900c1, 0x2}, +- {0x900c2, 0x150}, +- {0x900c3, 0x839}, +- {0x900c4, 0x1800}, +- {0x900c5, 0x8660}, +- {0x900c6, 0x839}, +- {0x900c7, 0x0}, +- {0x900c8, 0x2a0}, +- {0x900c9, 0x809}, +- {0x900ca, 0x8}, +- {0x900cb, 0x1880}, +- {0x900cc, 0x839}, +- {0x900cd, 0x0}, +- {0x900ce, 0x82b0}, +- {0x900cf, 0x838}, +- {0x900d0, 0x18}, +- {0x900d1, 0xe0}, +- {0x900d2, 0x809}, +- {0x900d3, 0x0}, +- {0x900d4, 0xe0}, +- {0x900d5, 0x869}, +- {0x900d6, 0xf}, +- {0x900d7, 0x7c0}, +- {0x900d8, 0x839}, +- {0x900d9, 0xa}, +- {0x900da, 0x510}, +- {0x900db, 0x839}, +- {0x900dc, 0xa}, +- {0x900dd, 0x700}, +- {0x900de, 0x849}, +- {0x900df, 0xa}, +- {0x900e0, 0x700}, +- {0x900e1, 0x859}, +- {0x900e2, 0xa}, +- {0x900e3, 0x708}, +- {0x900e4, 0x859}, +- {0x900e5, 0x2}, +- {0x900e6, 0x708}, +- {0x900e7, 0x849}, +- {0x900e8, 0xff8}, +- {0x900e9, 0x8410}, +- {0x900ea, 0x839}, +- {0x900eb, 0x7ff8}, +- {0x900ec, 0x8498}, +- {0x900ed, 0x838}, +- {0x900ee, 0x10}, +- {0x900ef, 0x8160}, +- {0x900f0, 0x83c}, +- {0x900f1, 0x0}, +- {0x900f2, 0x7c8}, +- {0x900f3, 0x809}, +- {0x900f4, 0x0}, +- {0x900f5, 0x1}, +- {0x900f6, 0x8}, +- {0x900f7, 0x0}, +- {0x900f8, 0x45a}, +- {0x900f9, 0x89}, +- {0x900fa, 0x0}, +- {0x900fb, 0x8018}, +- {0x900fc, 0x808}, +- {0x900fd, 0x0}, +- {0x900fe, 0x8020}, +- {0x900ff, 0x808}, +- {0x90100, 0x479}, +- {0x90101, 0xc7f8}, +- {0x90102, 0x80c}, +- {0x90103, 0x0}, +- {0x90104, 0x0}, +- {0x90105, 0x8}, +- {0x90106, 0x0}, +- {0x90107, 0x8018}, +- {0x90108, 0x808}, +- {0x90109, 0x0}, +- {0x9010a, 0x8020}, +- {0x9010b, 0x808}, +- {0x9010c, 0x9}, +- {0x9010d, 0xc9c0}, +- {0x9010e, 0xc0c}, +- {0x9010f, 0x0}, +- {0x90110, 0xa8}, +- {0x90111, 0x8c9}, +- {0x90112, 0x29}, +- {0x90113, 0x8160}, +- {0x90114, 0x87c}, +- {0x90115, 0xb8}, +- {0x90116, 0x820}, +- {0x90117, 0xc7e}, +- {0x90118, 0x1}, +- {0x90119, 0x0}, +- {0x9011a, 0x78}, +- {0x9011b, 0x0}, +- {0x9011c, 0x1}, +- {0x9011d, 0x78}, +- {0x9011e, 0xd8}, +- {0x9011f, 0x820}, +- {0x90120, 0xc7e}, +- {0x90121, 0x1}, +- {0x90122, 0x0}, +- {0x90123, 0x78}, +- {0x90124, 0x0}, +- {0x90125, 0x1}, +- {0x90126, 0x78}, +- {0x90127, 0xf8}, +- {0x90128, 0x820}, +- {0x90129, 0xc7e}, +- {0x9012a, 0x1}, +- {0x9012b, 0x0}, +- {0x9012c, 0x78}, +- {0x9012d, 0x0}, +- {0x9012e, 0x1}, +- {0x9012f, 0x78}, +- {0x90130, 0x0}, +- {0x90131, 0x700}, +- {0x90132, 0x849}, +- {0x90133, 0x0}, +- {0x90134, 0x618}, +- {0x90135, 0x809}, +- {0x90136, 0x3ff8}, +- {0x90137, 0x84b8}, +- {0x90138, 0x808}, +- {0x90139, 0x0}, +- {0x9013a, 0x0}, +- {0x9013b, 0x8}, +- {0x9013c, 0x8}, +- {0x9013d, 0xc870}, +- {0x9013e, 0xc0c}, +- {0x9013f, 0x18}, +- {0x90140, 0x710}, +- {0x90141, 0x849}, +- {0x90142, 0x0}, +- {0x90143, 0x4}, +- {0x90144, 0x48}, +- {0x90145, 0x0}, +- {0x90146, 0x4}, +- {0x90147, 0x48}, +- {0x90148, 0x10}, +- {0x90149, 0x710}, +- {0x9014a, 0x849}, +- {0x9014b, 0x0}, +- {0x9014c, 0x4}, +- {0x9014d, 0x48}, +- {0x9014e, 0x0}, +- {0x9014f, 0x710}, +- {0x90150, 0x849}, +- {0x90151, 0x0}, +- {0x90152, 0x4}, +- {0x90153, 0x48}, +- {0x90154, 0x0}, +- {0x90155, 0x4}, +- {0x90156, 0x18}, +- {0x90157, 0x0}, +- {0x90158, 0x4}, +- {0x90159, 0x18}, +- {0x9015a, 0x0}, +- {0x9015b, 0x4}, +- {0x9015c, 0x18}, +- {0x9015d, 0x0}, +- {0x9015e, 0x8410}, +- {0x9015f, 0x809}, +- {0x90160, 0x0}, +- {0x90161, 0x8498}, +- {0x90162, 0x808}, +- {0x90163, 0x5}, +- {0x90164, 0x510}, +- {0x90165, 0x809}, +- {0x90166, 0x198}, +- {0x90167, 0x1000}, +- {0x90168, 0x809}, +- {0x90169, 0x9}, +- {0x9016a, 0x3c0}, +- {0x9016b, 0x809}, +- {0x9016c, 0x10}, +- {0x9016d, 0x510}, +- {0x9016e, 0x809}, +- {0x9016f, 0x0}, +- {0x90170, 0x3c0}, +- {0x90171, 0x809}, +- {0x90172, 0x18}, +- {0x90173, 0x4}, +- {0x90174, 0x8}, +- {0x90175, 0x2}, +- {0x90176, 0x510}, +- {0x90177, 0x809}, +- {0x90178, 0x2}, +- {0x90179, 0x1000}, +- {0x9017a, 0x809}, +- {0x9017b, 0x68}, +- {0x9017c, 0x801a}, +- {0x9017d, 0x8}, +- {0x9017e, 0x68}, +- {0x9017f, 0x8022}, +- {0x90180, 0x8}, +- {0x90181, 0x479}, +- {0x90182, 0xc7f8}, +- {0x90183, 0x80c}, +- {0x90184, 0x0}, +- {0x90185, 0x0}, +- {0x90186, 0x8}, +- {0x90187, 0x68}, +- {0x90188, 0x801a}, +- {0x90189, 0x8}, +- {0x9018a, 0x68}, +- {0x9018b, 0x8022}, +- {0x9018c, 0x8}, +- {0x9018d, 0x9}, +- {0x9018e, 0xc9c0}, +- {0x9018f, 0xc0c}, +- {0x90190, 0x0}, +- {0x90191, 0xc870}, +- {0x90192, 0xc0c}, +- {0x90193, 0x0}, +- {0x90194, 0x2a0}, +- {0x90195, 0x809}, +- {0x90196, 0x10}, +- {0x90197, 0x8160}, +- {0x90198, 0x89c}, +- {0x90199, 0x2}, +- {0x9019a, 0x7c8}, +- {0x9019b, 0x809}, +- {0x9019c, 0x0}, +- {0x9019d, 0x1}, +- {0x9019e, 0x8}, +- {0x9019f, 0x40}, +- {0x901a0, 0x1932}, +- {0x901a1, 0x129}, +- {0x901a2, 0xa}, +- {0x901a3, 0xc140}, +- {0x901a4, 0x80c}, +- {0x901a5, 0x98}, +- {0x901a6, 0x193a}, +- {0x901a7, 0x129}, +- {0x901a8, 0x90}, +- {0x901a9, 0x1932}, +- {0x901aa, 0x329}, +- {0x901ab, 0x90}, +- {0x901ac, 0x193a}, +- {0x901ad, 0x329}, +- {0x901ae, 0x88}, +- {0x901af, 0x1882}, +- {0x901b0, 0x9}, +- {0x901b1, 0x0}, +- {0x901b2, 0xc140}, +- {0x901b3, 0x80c}, +- {0x901b4, 0x10}, +- {0x901b5, 0x400}, +- {0x901b6, 0x80e}, +- {0x901b7, 0xb}, +- {0x901b8, 0x370}, +- {0x901b9, 0x809}, +- {0x901ba, 0x23b}, +- {0x901bb, 0x100}, +- {0x901bc, 0xcf9}, +- {0x901bd, 0x0}, +- {0x901be, 0x2a0}, +- {0x901bf, 0x809}, +- {0x901c0, 0x7800}, +- {0x901c1, 0x8660}, +- {0x901c2, 0x809}, +- {0x901c3, 0xd}, +- {0x901c4, 0x7c0}, +- {0x901c5, 0x809}, +- {0x901c6, 0x0}, +- {0x901c7, 0x82b0}, +- {0x901c8, 0x818}, +- {0x901c9, 0x0}, +- {0x901ca, 0x82b0}, +- {0x901cb, 0x868}, +- {0x901cc, 0x479}, +- {0x901cd, 0xc7f8}, +- {0x901ce, 0x91c}, +- {0x901cf, 0x0}, +- {0x901d0, 0x0}, +- {0x901d1, 0x118}, +- {0x901d2, 0x38}, +- {0x901d3, 0x80a2}, +- {0x901d4, 0x118}, +- {0x901d5, 0x9}, +- {0x901d6, 0xc9c0}, +- {0x901d7, 0xd1c}, +- {0x901d8, 0x0}, +- {0x901d9, 0x0}, +- {0x901da, 0x118}, +- {0x901db, 0x8}, +- {0x901dc, 0x508}, +- {0x901dd, 0x809}, +- {0x901de, 0x5}, +- {0x901df, 0x7c0}, +- {0x901e0, 0x809}, +- {0x901e1, 0x8}, +- {0x901e2, 0x82b0}, +- {0x901e3, 0x868}, +- {0x901e4, 0x8}, +- {0x901e5, 0x82b0}, +- {0x901e6, 0x818}, +- {0x901e7, 0x8}, +- {0x901e8, 0x82b0}, +- {0x901e9, 0x888}, +- {0x901ea, 0x10}, +- {0x901eb, 0x510}, +- {0x901ec, 0x809}, +- {0x901ed, 0x0}, +- {0x901ee, 0xa8}, +- {0x901ef, 0x8c9}, +- {0x901f0, 0x8}, +- {0x901f1, 0x1900}, +- {0x901f2, 0xc09}, +- {0x901f3, 0x0}, +- {0x901f4, 0x508}, +- {0x901f5, 0x809}, +- {0x901f6, 0x2}, +- {0x901f7, 0x7c8}, +- {0x901f8, 0x829}, +- {0x901f9, 0xa}, +- {0x901fa, 0x3c8}, +- {0x901fb, 0xc29}, +- {0x901fc, 0x199}, +- {0x901fd, 0x3d0}, +- {0x901fe, 0xc19}, +- {0x901ff, 0x3}, +- {0x90200, 0x0}, +- {0x90201, 0x18}, +- {0x90202, 0x38}, +- {0x90203, 0x4}, +- {0x90204, 0x18}, +- {0x90205, 0x199}, +- {0x90206, 0x3d0}, +- {0x90207, 0xc09}, +- {0x90208, 0x0}, +- {0x90209, 0x0}, +- {0x9020a, 0x8}, +- {0x9020b, 0x9}, +- {0x9020c, 0x150}, +- {0x9020d, 0x809}, +- {0x9020e, 0x9}, +- {0x9020f, 0xc800}, +- {0x90210, 0xc0c}, +- {0x90211, 0x18}, +- {0x90212, 0x8160}, +- {0x90213, 0x8cc}, +- {0x90214, 0x8}, +- {0x90215, 0x13a}, +- {0x90216, 0xc9}, +- {0x90217, 0x24b}, +- {0x90218, 0x100}, +- {0x90219, 0x8c9}, +- {0x9021a, 0x2}, +- {0x9021b, 0x1}, +- {0x9021c, 0xc8}, +- {0x9021d, 0x0}, +- {0x9021e, 0x100}, +- {0x9021f, 0x8c9}, +- {0x90220, 0x20}, +- {0x90221, 0x4}, +- {0x90222, 0xc8}, +- {0x90223, 0x20}, +- {0x90224, 0x4}, +- {0x90225, 0xc8}, +- {0x90226, 0x5}, +- {0x90227, 0x0}, +- {0x90228, 0xc8}, +- {0x90229, 0x479}, +- {0x9022a, 0xc7f8}, +- {0x9022b, 0x8cc}, +- {0x9022c, 0x0}, +- {0x9022d, 0x0}, +- {0x9022e, 0xc8}, +- {0x9022f, 0x30}, +- {0x90230, 0xaa}, +- {0x90231, 0xc9}, +- {0x90232, 0x9}, +- {0x90233, 0xc9c0}, +- {0x90234, 0xccc}, +- {0x90235, 0x0}, +- {0x90236, 0x0}, +- {0x90237, 0xc8}, +- {0x90238, 0x479}, +- {0x90239, 0xc7f8}, +- {0x9023a, 0x8bc}, +- {0x9023b, 0x0}, +- {0x9023c, 0x0}, +- {0x9023d, 0xb8}, +- {0x9023e, 0x30}, +- {0x9023f, 0xaa}, +- {0x90240, 0xb9}, +- {0x90241, 0x9}, +- {0x90242, 0xc9c0}, +- {0x90243, 0xcbc}, +- {0x90244, 0x0}, +- {0x90245, 0x0}, +- {0x90246, 0xb8}, +- {0x90247, 0x25b}, +- {0x90248, 0x100}, +- {0x90249, 0xcc9}, +- {0x9024a, 0x20}, +- {0x9024b, 0x4}, +- {0x9024c, 0xc8}, +- {0x9024d, 0x20}, +- {0x9024e, 0x4}, +- {0x9024f, 0xc8}, +- {0x90250, 0x20}, +- {0x90251, 0x4}, +- {0x90252, 0xa8}, +- {0x90253, 0x4}, +- {0x90254, 0x0}, +- {0x90255, 0xc8}, +- {0x90256, 0x9}, +- {0x90257, 0xc800}, +- {0x90258, 0xc6c}, +- {0x90259, 0x26f}, +- {0x9025a, 0x100}, +- {0x9025b, 0xc19}, +- {0x9025c, 0x8}, +- {0x9025d, 0x4}, +- {0x9025e, 0x18}, +- {0x9025f, 0x27f}, +- {0x90260, 0x100}, +- {0x90261, 0xc19}, +- {0x90262, 0x479}, +- {0x90263, 0xc7f8}, +- {0x90264, 0x80c}, +- {0x90265, 0x0}, +- {0x90266, 0x0}, +- {0x90267, 0x8}, +- {0x90268, 0x58}, +- {0x90269, 0x8a}, +- {0x9026a, 0x9}, +- {0x9026b, 0x9}, +- {0x9026c, 0xc9c0}, +- {0x9026d, 0xc0c}, +- {0x9026e, 0x0}, +- {0x9026f, 0x0}, +- {0x90270, 0x8}, +- {0x90271, 0x18}, +- {0x90272, 0x8160}, +- {0x90273, 0x86c}, +- {0x90274, 0x1008}, +- {0x90275, 0x853b}, +- {0x90276, 0x868}, +- {0x90277, 0xc00}, +- {0x90278, 0x8588}, +- {0x90279, 0x868}, +- {0x9027a, 0x8}, +- {0x9027b, 0x85a8}, +- {0x9027c, 0x868}, +- {0x9027d, 0x8}, +- {0x9027e, 0x85c8}, +- {0x9027f, 0x868}, +- {0x90280, 0x0}, +- {0x90281, 0x8050}, +- {0x90282, 0x868}, +- {0x90283, 0x60}, +- {0x90284, 0x138}, +- {0x90285, 0x869}, +- {0x90286, 0x18}, +- {0x90287, 0x8510}, +- {0x90288, 0x868}, +- {0x90289, 0x18}, +- {0x9028a, 0x2c8}, +- {0x9028b, 0x869}, +- {0x9028c, 0x10}, +- {0x9028d, 0x8520}, +- {0x9028e, 0x868}, +- {0x9028f, 0x1ff8}, +- {0x90290, 0x85d8}, +- {0x90291, 0xc68}, +- {0x90292, 0x0}, +- {0x90293, 0xfdf0}, +- {0x90294, 0x868}, +- {0x90295, 0x8}, +- {0x90296, 0x85f0}, +- {0x90297, 0x868}, +- {0x90298, 0x8}, +- {0x90299, 0xa5f0}, +- {0x9029a, 0x868}, +- {0x9029b, 0x298}, +- {0x9029c, 0x100}, +- {0x9029d, 0x869}, +- {0x9029e, 0x2}, +- {0x9029f, 0x1}, +- {0x902a0, 0x68}, +- {0x902a1, 0x0}, +- {0x902a2, 0x100}, +- {0x902a3, 0x869}, +- {0x902a4, 0x0}, +- {0x902a5, 0x85f0}, +- {0x902a6, 0x868}, +- {0x902a7, 0x0}, +- {0x902a8, 0xa5f0}, +- {0x902a9, 0x868}, +- {0x902aa, 0x33b}, +- {0x902ab, 0x100}, +- {0x902ac, 0x8c9}, +- {0x902ad, 0x0}, +- {0x902ae, 0x100}, +- {0x902af, 0x8c9}, +- {0x902b0, 0x1ff8}, +- {0x902b1, 0x85d8}, +- {0x902b2, 0xc68}, +- {0x902b3, 0x8}, +- {0x902b4, 0x8df0}, +- {0x902b5, 0x868}, +- {0x902b6, 0x8}, +- {0x902b7, 0xadf0}, +- {0x902b8, 0x868}, +- {0x902b9, 0x2a8}, +- {0x902ba, 0x100}, +- {0x902bb, 0x869}, +- {0x902bc, 0x2}, +- {0x902bd, 0x1}, +- {0x902be, 0x68}, +- {0x902bf, 0x0}, +- {0x902c0, 0x100}, +- {0x902c1, 0x869}, +- {0x902c2, 0x0}, +- {0x902c3, 0x8df0}, +- {0x902c4, 0x868}, +- {0x902c5, 0x0}, +- {0x902c6, 0xadf0}, +- {0x902c7, 0x868}, +- {0x902c8, 0x10}, +- {0x902c9, 0x2c8}, +- {0x902ca, 0x869}, +- {0x902cb, 0x28}, +- {0x902cc, 0x4}, +- {0x902cd, 0x68}, +- {0x902ce, 0xa}, +- {0x902cf, 0x500}, +- {0x902d0, 0xc69}, +- {0x902d1, 0x0}, +- {0x902d2, 0x8520}, +- {0x902d3, 0x868}, +- {0x902d4, 0x8}, +- {0x902d5, 0x8530}, +- {0x902d6, 0x868}, +- {0x902d7, 0x2ba}, +- {0x902d8, 0x100}, +- {0x902d9, 0x869}, +- {0x902da, 0x2}, +- {0x902db, 0x1}, +- {0x902dc, 0x68}, +- {0x902dd, 0x2}, +- {0x902de, 0x100}, +- {0x902df, 0x869}, +- {0x902e0, 0x0}, +- {0x902e1, 0x8530}, +- {0x902e2, 0x868}, +- {0x902e3, 0x0}, +- {0x902e4, 0x8510}, +- {0x902e5, 0x868}, +- {0x902e6, 0x0}, +- {0x902e7, 0x2c8}, +- {0x902e8, 0x869}, +- {0x902e9, 0x8}, +- {0x902ea, 0x8050}, +- {0x902eb, 0x868}, +- {0x902ec, 0x30}, +- {0x902ed, 0x4}, +- {0x902ee, 0x68}, +- {0x902ef, 0x8}, +- {0x902f0, 0x8520}, +- {0x902f1, 0x868}, +- {0x902f2, 0x0}, +- {0x902f3, 0x8328}, +- {0x902f4, 0x86b}, +- {0x902f5, 0x2ca}, +- {0x902f6, 0x100}, +- {0x902f7, 0x869}, +- {0x902f8, 0x2}, +- {0x902f9, 0x1}, +- {0x902fa, 0x68}, +- {0x902fb, 0x4}, +- {0x902fc, 0x100}, +- {0x902fd, 0x869}, +- {0x902fe, 0xff8}, +- {0x902ff, 0x8328}, +- {0x90300, 0x86b}, +- {0x90301, 0x9}, +- {0x90302, 0x500}, +- {0x90303, 0xc29}, +- {0x90304, 0x0}, +- {0x90305, 0x8520}, +- {0x90306, 0x868}, +- {0x90307, 0x8}, +- {0x90308, 0x3c8}, +- {0x90309, 0xc29}, +- {0x9030a, 0x0}, +- {0x9030b, 0x150}, +- {0x9030c, 0x809}, +- {0x9030d, 0x2}, +- {0x9030e, 0x370}, +- {0x9030f, 0x809}, +- {0x90310, 0x0}, +- {0x90311, 0x400}, +- {0x90312, 0x80e}, +- {0x90313, 0x10}, +- {0x90314, 0x4}, +- {0x90315, 0x118}, +- {0x90316, 0x20}, +- {0x90317, 0x82b0}, +- {0x90318, 0x808}, +- {0x90319, 0x479}, +- {0x9031a, 0xc7f8}, +- {0x9031b, 0x80c}, +- {0x9031c, 0x0}, +- {0x9031d, 0x0}, +- {0x9031e, 0x8}, +- {0x9031f, 0x60}, +- {0x90320, 0x8a}, +- {0x90321, 0x9}, +- {0x90322, 0x9}, +- {0x90323, 0xc9c0}, +- {0x90324, 0xc0c}, +- {0x90325, 0x0}, +- {0x90326, 0x0}, +- {0x90327, 0x8}, +- {0x90328, 0x8}, +- {0x90329, 0x2a0}, +- {0x9032a, 0x809}, +- {0x9032b, 0x48}, +- {0x9032c, 0xc822}, +- {0x9032d, 0xc}, +- {0x9032e, 0x48}, +- {0x9032f, 0xcc32}, +- {0x90330, 0xc}, +- {0x90331, 0x9}, +- {0x90332, 0xc800}, +- {0x90333, 0xc0c}, +- {0x90334, 0x0}, +- {0x90335, 0x8168}, +- {0x90336, 0x80c}, +- {0x90337, 0x479}, +- {0x90338, 0xc7f8}, +- {0x90339, 0x91c}, +- {0x9033a, 0x0}, +- {0x9033b, 0x0}, +- {0x9033c, 0x118}, +- {0x9033d, 0x9190}, +- {0x9033e, 0x80a1}, +- {0x9033f, 0x918}, +- {0x90340, 0x9}, +- {0x90341, 0xc9c0}, +- {0x90342, 0xd1c}, +- {0x90343, 0x0}, +- {0x90344, 0x0}, +- {0x90345, 0x118}, +- {0x90346, 0x18}, +- {0x90347, 0xf0}, +- {0x90348, 0x909}, +- {0x90349, 0xa}, +- {0x9034a, 0xc140}, +- {0x9034b, 0x92c}, +- {0x9034c, 0x88}, +- {0x9034d, 0x1932}, +- {0x9034e, 0x129}, +- {0x9034f, 0x88}, +- {0x90350, 0x193a}, +- {0x90351, 0x129}, +- {0x90352, 0x0}, +- {0x90353, 0xc140}, +- {0x90354, 0x92c}, +- {0x90355, 0x8}, +- {0x90356, 0x300}, +- {0x90357, 0x819}, +- {0x90358, 0x10}, +- {0x90359, 0x8160}, +- {0x9035a, 0x80c}, +- {0x9035b, 0x8}, +- {0x9035c, 0x7c8}, +- {0x9035d, 0x801}, +- {0x9035e, 0x8}, +- {0x9035f, 0x0}, +- {0x90360, 0x8}, +- {0x90361, 0x8}, +- {0x90362, 0x1880}, +- {0x90363, 0x809}, +- {0x90364, 0x10}, +- {0x90365, 0x8160}, +- {0x90366, 0x80c}, +- {0x90367, 0x1800}, +- {0x90368, 0x8660}, +- {0x90369, 0x809}, +- {0x9036a, 0x4000}, +- {0x9036b, 0x8668}, +- {0x9036c, 0x809}, +- {0x9036d, 0x0}, +- {0x9036e, 0xf0}, +- {0x9036f, 0x909}, +- {0x90370, 0xf}, +- {0x90371, 0x7c0}, +- {0x90372, 0x809}, +- {0x90373, 0x0}, +- {0x90374, 0x2a0}, +- {0x90375, 0x809}, +- {0x90376, 0x8}, +- {0x90377, 0x618}, +- {0x90378, 0x809}, +- {0x90379, 0x0}, +- {0x9037a, 0x84b8}, +- {0x9037b, 0x808}, +- {0x9037c, 0xff8}, +- {0x9037d, 0x8410}, +- {0x9037e, 0x809}, +- {0x9037f, 0x7ff8}, +- {0x90380, 0x8498}, +- {0x90381, 0x808}, +- {0x90382, 0x0}, +- {0x90383, 0x7c8}, +- {0x90384, 0x809}, +- {0x90385, 0x8}, +- {0x90386, 0x8168}, +- {0x90387, 0x80c}, +- {0x90388, 0x0}, +- {0x90389, 0x1}, +- {0x9038a, 0x8}, +- {0x9038b, 0x0}, +- {0x9038c, 0x4}, +- {0x9038d, 0x8}, +- {0x9038e, 0x0}, +- {0x9038f, 0x4}, +- {0x90390, 0x8}, +- {0x90391, 0x18}, +- {0x90392, 0x300}, +- {0x90393, 0x809}, +- {0x90394, 0x0}, +- {0x90395, 0x480}, +- {0x90396, 0x809}, +- {0x90397, 0x8}, +- {0x90398, 0x510}, +- {0x90399, 0x809}, +- {0x9039a, 0x7800}, +- {0x9039b, 0x8660}, +- {0x9039c, 0x809}, +- {0x9039d, 0x18}, +- {0x9039e, 0xf0}, +- {0x9039f, 0x909}, +- {0x903a0, 0x8}, +- {0x903a1, 0x7c8}, +- {0x903a2, 0x801}, +- {0x903a3, 0x10}, +- {0x903a4, 0x400}, +- {0x903a5, 0x80e}, +- {0x903a6, 0x8}, +- {0x903a7, 0x150}, +- {0x903a8, 0x809}, +- {0x903a9, 0x9}, +- {0x903aa, 0x370}, +- {0x903ab, 0x809}, +- {0x903ac, 0x18}, +- {0x903ad, 0x8160}, +- {0x903ae, 0x80c}, +- {0x903af, 0x8}, +- {0x903b0, 0xc800}, +- {0x903b1, 0xc0c}, +- {0x903b2, 0x8}, +- {0x903b3, 0xc888}, +- {0x903b4, 0xc04}, +- {0x903b5, 0x20}, +- {0x903b6, 0x8302}, +- {0x903b7, 0xb}, +- {0x903b8, 0x18}, +- {0x903b9, 0x8582}, +- {0x903ba, 0x8}, +- {0x903bb, 0x9000}, +- {0x903bc, 0x8539}, +- {0x903bd, 0x808}, +- {0x903be, 0x0}, +- {0x903bf, 0x8588}, +- {0x903c0, 0x808}, +- {0x903c1, 0x40}, +- {0x903c2, 0x85c8}, +- {0x903c3, 0x808}, +- {0x903c4, 0x0}, +- {0x903c5, 0xfdf0}, +- {0x903c6, 0x808}, +- {0x903c7, 0x800}, +- {0x903c8, 0xc5f0}, +- {0x903c9, 0x808}, +- {0x903ca, 0x1ff8}, +- {0x903cb, 0xfdd8}, +- {0x903cc, 0xc08}, +- {0x903cd, 0x18}, +- {0x903ce, 0xfda8}, +- {0x903cf, 0x808}, +- {0x903d0, 0x40}, +- {0x903d1, 0x8520}, +- {0x903d2, 0x8d8}, +- {0x903d3, 0x80}, +- {0x903d4, 0x8520}, +- {0x903d5, 0x8e8}, +- {0x903d6, 0x30a}, +- {0x903d7, 0x100}, +- {0x903d8, 0x8d9}, +- {0x903d9, 0x32a}, +- {0x903da, 0x100}, +- {0x903db, 0x8e9}, +- {0x903dc, 0x0}, +- {0x903dd, 0x1}, +- {0x903de, 0x8}, +- {0x903df, 0x0}, +- {0x903e0, 0x100}, +- {0x903e1, 0x809}, +- {0x903e2, 0x1ff8}, +- {0x903e3, 0xfdd8}, +- {0x903e4, 0xc08}, +- {0x903e5, 0x8}, +- {0x903e6, 0xfda8}, +- {0x903e7, 0x808}, +- {0x903e8, 0x140}, +- {0x903e9, 0x8520}, +- {0x903ea, 0x8d8}, +- {0x903eb, 0x180}, +- {0x903ec, 0x8520}, +- {0x903ed, 0x8e8}, +- {0x903ee, 0x30a}, +- {0x903ef, 0x100}, +- {0x903f0, 0x8d9}, +- {0x903f1, 0x32a}, +- {0x903f2, 0x100}, +- {0x903f3, 0x8e9}, +- {0x903f4, 0x0}, +- {0x903f5, 0x1}, +- {0x903f6, 0x8}, +- {0x903f7, 0x0}, +- {0x903f8, 0x100}, +- {0x903f9, 0x809}, +- {0x903fa, 0x9}, +- {0x903fb, 0x500}, +- {0x903fc, 0xc09}, +- {0x903fd, 0x10}, +- {0x903fe, 0x82b0}, +- {0x903ff, 0x808}, +- {0x90400, 0x0}, +- {0x90401, 0x8520}, +- {0x90402, 0x808}, +- {0x90403, 0x8}, +- {0x90404, 0x3c8}, +- {0x90405, 0xc09}, +- {0x90406, 0x0}, +- {0x90407, 0x150}, +- {0x90408, 0x809}, +- {0x90409, 0x2}, +- {0x9040a, 0x370}, +- {0x9040b, 0x809}, +- {0x9040c, 0x0}, +- {0x9040d, 0x400}, +- {0x9040e, 0x80e}, +- {0x9040f, 0x8}, +- {0x90410, 0xc848}, +- {0x90411, 0xc0c}, +- {0x90412, 0x0}, +- {0x90413, 0xc890}, +- {0x90414, 0x804}, +- {0x90415, 0x20}, +- {0x90416, 0x8302}, +- {0x90417, 0xb}, +- {0x90418, 0x18}, +- {0x90419, 0x8582}, +- {0x9041a, 0x8}, +- {0x9041b, 0x0}, +- {0x9041c, 0x82b0}, +- {0x9041d, 0x808}, +- {0x9041e, 0x1000}, +- {0x9041f, 0x8539}, +- {0x90420, 0x808}, +- {0x90421, 0x0}, +- {0x90422, 0x8588}, +- {0x90423, 0x808}, +- {0x90424, 0x40}, +- {0x90425, 0x85c8}, +- {0x90426, 0x808}, +- {0x90427, 0x7f8}, +- {0x90428, 0xfdf0}, +- {0x90429, 0x808}, +- {0x9042a, 0x800}, +- {0x9042b, 0xc5f0}, +- {0x9042c, 0x808}, +- {0x9042d, 0x80}, +- {0x9042e, 0x8088}, +- {0x9042f, 0x80b}, +- {0x90430, 0x1ff8}, +- {0x90431, 0xfdd8}, +- {0x90432, 0xc08}, +- {0x90433, 0x18}, +- {0x90434, 0xfda8}, +- {0x90435, 0x808}, +- {0x90436, 0x200}, +- {0x90437, 0x8520}, +- {0x90438, 0x8d8}, +- {0x90439, 0x400}, +- {0x9043a, 0x8520}, +- {0x9043b, 0x8e8}, +- {0x9043c, 0x2da}, +- {0x9043d, 0x100}, +- {0x9043e, 0x8d9}, +- {0x9043f, 0x2ea}, +- {0x90440, 0x100}, +- {0x90441, 0x8e9}, +- {0x90442, 0x2}, +- {0x90443, 0x1}, +- {0x90444, 0x8}, +- {0x90445, 0x0}, +- {0x90446, 0x100}, +- {0x90447, 0x809}, +- {0x90448, 0x1ff8}, +- {0x90449, 0xfdd8}, +- {0x9044a, 0xc08}, +- {0x9044b, 0x8}, +- {0x9044c, 0xfda8}, +- {0x9044d, 0x808}, +- {0x9044e, 0xa00}, +- {0x9044f, 0x8520}, +- {0x90450, 0x8d8}, +- {0x90451, 0xc00}, +- {0x90452, 0x8520}, +- {0x90453, 0x8e8}, +- {0x90454, 0x2da}, +- {0x90455, 0x100}, +- {0x90456, 0x8d9}, +- {0x90457, 0x2ea}, +- {0x90458, 0x100}, +- {0x90459, 0x8e9}, +- {0x9045a, 0x0}, +- {0x9045b, 0x1}, +- {0x9045c, 0x8}, +- {0x9045d, 0x0}, +- {0x9045e, 0x100}, +- {0x9045f, 0x809}, +- {0x90460, 0x9}, +- {0x90461, 0x500}, +- {0x90462, 0xc09}, +- {0x90463, 0x10}, +- {0x90464, 0x82b0}, +- {0x90465, 0x808}, +- {0x90466, 0x0}, +- {0x90467, 0x8520}, +- {0x90468, 0x808}, +- {0x90469, 0x8}, +- {0x9046a, 0x3c8}, +- {0x9046b, 0xc09}, +- {0x9046c, 0x0}, +- {0x9046d, 0x150}, +- {0x9046e, 0x809}, +- {0x9046f, 0x2}, +- {0x90470, 0x370}, +- {0x90471, 0x809}, +- {0x90472, 0x0}, +- {0x90473, 0x400}, +- {0x90474, 0x80e}, +- {0x90475, 0x8}, +- {0x90476, 0xc848}, +- {0x90477, 0xc0c}, +- {0x90478, 0x0}, +- {0x90479, 0xc890}, +- {0x9047a, 0x804}, +- {0x9047b, 0x1008}, +- {0x9047c, 0x853b}, +- {0x9047d, 0x808}, +- {0x9047e, 0xc00}, +- {0x9047f, 0x8588}, +- {0x90480, 0x808}, +- {0x90481, 0x8}, +- {0x90482, 0x85a8}, +- {0x90483, 0x808}, +- {0x90484, 0x8}, +- {0x90485, 0x85c8}, +- {0x90486, 0x808}, +- {0x90487, 0x60}, +- {0x90488, 0x138}, +- {0x90489, 0x809}, +- {0x9048a, 0x18}, +- {0x9048b, 0xc8}, +- {0x9048c, 0x809}, +- {0x9048d, 0x0}, +- {0x9048e, 0xa4}, +- {0x9048f, 0x809}, +- {0x90490, 0x0}, +- {0x90491, 0x8510}, +- {0x90492, 0x808}, +- {0x90493, 0x2fa}, +- {0x90494, 0x100}, +- {0x90495, 0x8d9}, +- {0x90496, 0x31a}, +- {0x90497, 0x100}, +- {0x90498, 0x8e9}, +- {0x90499, 0x2}, +- {0x9049a, 0x1}, +- {0x9049b, 0x8}, +- {0x9049c, 0x2}, +- {0x9049d, 0x100}, +- {0x9049e, 0x809}, +- {0x9049f, 0x202}, +- {0x904a0, 0x8510}, +- {0x904a1, 0xc08}, +- {0x904a2, 0x50}, +- {0x904a3, 0xa2}, +- {0x904a4, 0x9}, +- {0x904a5, 0x0}, +- {0x904a6, 0x0}, +- {0x904a7, 0x8}, +- {0x904a8, 0x0}, +- {0x904a9, 0x0}, +- {0x904aa, 0x8}, +- {0x904ab, 0x0}, +- {0x904ac, 0x0}, +- {0x904ad, 0x8}, +- {0x904ae, 0x0}, +- {0x904af, 0xc8}, +- {0x904b0, 0x809}, +- {0x904b1, 0xb}, +- {0x904b2, 0x508}, +- {0x904b3, 0x809}, +- {0x904b4, 0x8}, +- {0x904b5, 0x1900}, +- {0x904b6, 0xc09}, +- {0x904b7, 0x2}, +- {0x904b8, 0x0}, +- {0x904b9, 0x8}, +- {0x904ba, 0x0}, +- {0x904bb, 0x508}, +- {0x904bc, 0x809}, +- {0x904bd, 0x9}, +- {0x904be, 0x500}, +- {0x904bf, 0xc09}, +- {0x904c0, 0x10}, +- {0x904c1, 0x82b0}, +- {0x904c2, 0x808}, +- {0x904c3, 0x0}, +- {0x904c4, 0x8520}, +- {0x904c5, 0x808}, +- {0x904c6, 0x8}, +- {0x904c7, 0x3c8}, +- {0x904c8, 0xc09}, +- {0x904c9, 0x0}, +- {0x904ca, 0x150}, +- {0x904cb, 0x809}, +- {0x904cc, 0x2}, +- {0x904cd, 0x370}, +- {0x904ce, 0x809}, +- {0x904cf, 0x0}, +- {0x904d0, 0x400}, +- {0x904d1, 0x80e}, +- {0x904d2, 0x8}, +- {0x904d3, 0xc848}, +- {0x904d4, 0xc0c}, +- {0x904d5, 0x0}, +- {0x904d6, 0xc890}, +- {0x904d7, 0x804}, +- {0x904d8, 0x20}, +- {0x904d9, 0x8302}, +- {0x904da, 0xb}, +- {0x904db, 0x18}, +- {0x904dc, 0x8582}, +- {0x904dd, 0x8}, +- {0x904de, 0x1000}, +- {0x904df, 0x8539}, +- {0x904e0, 0x808}, +- {0x904e1, 0x0}, +- {0x904e2, 0x8588}, +- {0x904e3, 0x808}, +- {0x904e4, 0x40}, +- {0x904e5, 0x85c8}, +- {0x904e6, 0x808}, +- {0x904e7, 0x8}, +- {0x904e8, 0xfdf0}, +- {0x904e9, 0x808}, +- {0x904ea, 0x80}, +- {0x904eb, 0x8088}, +- {0x904ec, 0x80b}, +- {0x904ed, 0x0}, +- {0x904ee, 0x3b8}, +- {0x904ef, 0x869}, +- {0x904f0, 0x1ff8}, +- {0x904f1, 0xfdd8}, +- {0x904f2, 0xc08}, +- {0x904f3, 0x18}, +- {0x904f4, 0xfda8}, +- {0x904f5, 0x808}, +- {0x904f6, 0x40}, +- {0x904f7, 0x8520}, +- {0x904f8, 0x8d8}, +- {0x904f9, 0x80}, +- {0x904fa, 0x8520}, +- {0x904fb, 0x8e8}, +- {0x904fc, 0x2da}, +- {0x904fd, 0x100}, +- {0x904fe, 0x8d9}, +- {0x904ff, 0x2ea}, +- {0x90500, 0x100}, +- {0x90501, 0x8e9}, +- {0x90502, 0x2}, +- {0x90503, 0x1}, +- {0x90504, 0x8}, +- {0x90505, 0x0}, +- {0x90506, 0x100}, +- {0x90507, 0x809}, +- {0x90508, 0x1ff8}, +- {0x90509, 0xfdd8}, +- {0x9050a, 0xc08}, +- {0x9050b, 0x8}, +- {0x9050c, 0xfda8}, +- {0x9050d, 0x808}, +- {0x9050e, 0x140}, +- {0x9050f, 0x8520}, +- {0x90510, 0x8d8}, +- {0x90511, 0x180}, +- {0x90512, 0x8520}, +- {0x90513, 0x8e8}, +- {0x90514, 0x2da}, +- {0x90515, 0x100}, +- {0x90516, 0x8d9}, +- {0x90517, 0x2ea}, +- {0x90518, 0x100}, +- {0x90519, 0x8e9}, +- {0x9051a, 0x0}, +- {0x9051b, 0x1}, +- {0x9051c, 0x8}, +- {0x9051d, 0x0}, +- {0x9051e, 0x100}, +- {0x9051f, 0x809}, +- {0x90520, 0x9}, +- {0x90521, 0x500}, +- {0x90522, 0xc09}, +- {0x90523, 0x10}, +- {0x90524, 0x82b0}, +- {0x90525, 0x808}, +- {0x90526, 0x0}, +- {0x90527, 0x8520}, +- {0x90528, 0x808}, +- {0x90529, 0x8}, +- {0x9052a, 0x3c8}, +- {0x9052b, 0xc09}, +- {0x9052c, 0x0}, +- {0x9052d, 0x150}, +- {0x9052e, 0x809}, +- {0x9052f, 0x2}, +- {0x90530, 0x370}, +- {0x90531, 0x809}, +- {0x90532, 0x0}, +- {0x90533, 0x400}, +- {0x90534, 0x80e}, +- {0x90535, 0x8}, +- {0x90536, 0xc848}, +- {0x90537, 0xc0c}, +- {0x90538, 0x0}, +- {0x90539, 0xc890}, +- {0x9053a, 0x804}, +- {0xd00e7, 0x600}, +- {0x9001c, 0x0}, +- {0x90020, 0x77}, +- {0x90024, 0x82}, +- {0x90025, 0x2b}, +- {0x90026, 0x2b}, +- {0x9002b, 0x110}, +- {0x90708, 0x127}, +- {0x90700, 0x14d}, +- {0x90701, 0x16f}, +- {0x90702, 0x18e}, +- {0x90703, 0x12d}, +- {0x90704, 0x0}, +- {0x90705, 0x0}, +- {0x90706, 0x0}, +- {0x90707, 0x0}, +- {0x2018a, 0x0}, +- {0x20124, 0x1}, +- {0x2018b, 0x16}, +- {0x20125, 0x39}, +- {0x2018c, 0x4e}, +- {0x20126, 0x1}, +- {0x2018d, 0x16}, +- {0x20127, 0x39}, +- {0x2018e, 0x4e}, +- {0x20128, 0x17}, +- {0x2018f, 0x27}, +- {0x20129, 0x4f}, +- {0x20190, 0x5f}, +- {0x2012a, 0x17}, +- {0x20191, 0x27}, +- {0x2012b, 0x4f}, +- {0x20192, 0x5f}, +- {0x2012c, 0x28}, +- {0x20193, 0x38}, +- {0x2012d, 0x60}, +- {0x20194, 0x70}, +- {0x2012e, 0x28}, +- {0x20195, 0x38}, +- {0x2012f, 0x60}, +- {0x20196, 0x70}, +- {0x20130, 0x80}, +- {0x20197, 0x80}, +- {0x20131, 0x80}, +- {0x20198, 0x80}, +- {0x20132, 0x80}, +- {0x20199, 0x80}, +- {0x20133, 0x80}, +- {0x2019a, 0x80}, +- {0x20134, 0x71}, +- {0x2019b, 0x74}, +- {0x20135, 0x77}, +- {0x2019c, 0x7a}, +- {0x20136, 0x71}, +- {0x2019d, 0x74}, +- {0x20137, 0x77}, +- {0x2019e, 0x7a}, +- {0x20138, 0x75}, +- {0x2019f, 0x76}, +- {0x20139, 0x7b}, +- {0x201a0, 0x7c}, +- {0x2013a, 0x75}, +- {0x201a1, 0x76}, +- {0x2013b, 0x7b}, +- {0x201a2, 0x7c}, +- {0x2013c, 0x7d}, +- {0x201a3, 0x7e}, +- {0x2013d, 0x7d}, +- {0x201a4, 0x7e}, +- {0x2013e, 0x7d}, +- {0x201a5, 0x7e}, +- {0x2013f, 0x7d}, +- {0x201a6, 0x7e}, +- {0x20140, 0x7f}, +- {0x201a7, 0x7f}, +- {0x20141, 0x7f}, +- {0x201a8, 0x7f}, +- {0x20142, 0x7f}, +- {0x201a9, 0x7f}, +- {0x20143, 0x7f}, +- {0x201aa, 0x7f}, +- {0x20144, 0x80}, +- {0x201ab, 0x7f}, +- {0x20145, 0x80}, +- {0x201ac, 0x7f}, +- {0x20146, 0x80}, +- {0x201ad, 0x7f}, +- {0x20147, 0x80}, +- {0x201ae, 0x7f}, +- {0x20148, 0x81}, +- {0x201af, 0x93}, +- {0x20149, 0x81}, +- {0x201b0, 0x93}, +- {0x2014a, 0x10a}, +- {0x201b1, 0x11b}, +- {0x2014b, 0x10a}, +- {0x201b2, 0x11b}, +- {0x2014c, 0x94}, +- {0x201b3, 0x9b}, +- {0x2014d, 0x94}, +- {0x201b4, 0x9b}, +- {0x2014e, 0x11c}, +- {0x201b5, 0x122}, +- {0x2014f, 0x11c}, +- {0x201b6, 0x122}, +- {0x20150, 0x9c}, +- {0x201b7, 0xaf}, +- {0x20151, 0x9c}, +- {0x201b8, 0xaf}, +- {0x20152, 0x123}, +- {0x201b9, 0x132}, +- {0x20153, 0x123}, +- {0x201ba, 0x132}, +- {0x20154, 0xb0}, +- {0x201bb, 0xc0}, +- {0x20155, 0xb0}, +- {0x201bc, 0xc0}, +- {0x20156, 0x133}, +- {0x201bd, 0x143}, +- {0x20157, 0x133}, +- {0x201be, 0x143}, +- {0x20158, 0xc1}, +- {0x201bf, 0xca}, +- {0x20159, 0xc1}, +- {0x201c0, 0xca}, +- {0x2015a, 0x144}, +- {0x201c1, 0x14d}, +- {0x2015b, 0x144}, +- {0x201c2, 0x14d}, +- {0x2015c, 0xcb}, +- {0x201c3, 0xd4}, +- {0x2015d, 0xcb}, +- {0x201c4, 0xd4}, +- {0x2015e, 0x14e}, +- {0x201c5, 0x157}, +- {0x2015f, 0x14e}, +- {0x201c6, 0x157}, +- {0x20160, 0xd5}, +- {0x201c7, 0xdf}, +- {0x20161, 0xd5}, +- {0x201c8, 0xdf}, +- {0x20162, 0x158}, +- {0x201c9, 0x161}, +- {0x20163, 0x158}, +- {0x201ca, 0x161}, +- {0x20164, 0xe0}, +- {0x201cb, 0xee}, +- {0x20165, 0xe0}, +- {0x201cc, 0xee}, +- {0x20166, 0x162}, +- {0x201cd, 0x170}, +- {0x20167, 0x162}, +- {0x201ce, 0x170}, +- {0x20168, 0xef}, +- {0x201cf, 0xf9}, +- {0x20169, 0xef}, +- {0x201d0, 0xf9}, +- {0x2016a, 0x171}, +- {0x201d1, 0x17a}, +- {0x2016b, 0x171}, +- {0x201d2, 0x17a}, +- {0x2016c, 0xfa}, +- {0x201d3, 0x108}, +- {0x2016d, 0xfa}, +- {0x201d4, 0x108}, +- {0x2016e, 0x17b}, +- {0x201d5, 0x189}, +- {0x2016f, 0x17b}, +- {0x201d6, 0x189}, +- {0x20170, 0x109}, +- {0x201d7, 0x109}, +- {0x20171, 0x109}, +- {0x201d8, 0x109}, +- {0x20172, 0x18a}, +- {0x201d9, 0x18a}, +- {0x20173, 0x18a}, +- {0x201da, 0x18a}, +- {0x41613, 0xb00}, +- {0x41617, 0x0}, +- {0x4163b, 0xb00}, +- {0x4163f, 0x0}, +- {0x41663, 0xb00}, +- {0x41667, 0x0}, +- {0x4168b, 0xb00}, +- {0x4168f, 0x0}, +- {0x41723, 0xb00}, +- {0x41727, 0x0}, +- {0x4174b, 0xb00}, +- {0x4174f, 0x0}, +- {0x417f3, 0xb00}, +- {0x417f7, 0x0}, +- {0x4181b, 0xb00}, +- {0x4181f, 0x0}, +- {0x41a2b, 0x6b00}, +- {0x41a2f, 0x0}, +- {0x41a53, 0x3b00}, +- {0x41a57, 0x800}, +- {0x41a7b, 0x6b00}, +- {0x41a7f, 0x0}, +- {0x41aa3, 0x3b00}, +- {0x41aa7, 0x800}, +- {0x41b33, 0x6b00}, +- {0x41b37, 0x0}, +- {0x41b5b, 0x3b00}, +- {0x41b5f, 0x800}, +- {0x41bfb, 0x6b00}, +- {0x41bff, 0x0}, +- {0x41c23, 0x3b00}, +- {0x41c27, 0x800}, +- {0x41008, 0xc9d8}, +- {0x41009, 0x0}, +- {0x4100a, 0x0}, +- {0x4100b, 0x0}, +- {0x4100c, 0xc808}, +- {0x4100d, 0x0}, +- {0x4100e, 0x0}, +- {0x4100f, 0x0}, +- {0x41010, 0x0}, +- {0x41011, 0x0}, +- {0x41012, 0x0}, +- {0x41013, 0x2b00}, +- {0x41014, 0x0}, +- {0x41015, 0x0}, +- {0x41016, 0x0}, +- {0x41017, 0x0}, +- {0x41018, 0xc958}, +- {0x41019, 0x0}, +- {0x4101a, 0x0}, +- {0x4101b, 0x0}, +- {0x4101c, 0xcf08}, +- {0x4101d, 0x0}, +- {0x4101e, 0x0}, +- {0x4101f, 0x0}, +- {0x41020, 0x0}, +- {0x41021, 0x0}, +- {0x41022, 0x0}, +- {0x41023, 0x2b00}, +- {0x41024, 0x0}, +- {0x41025, 0x0}, +- {0x41026, 0x0}, +- {0x41027, 0x0}, +- {0x41028, 0xc0d8}, +- {0x41029, 0x0}, +- {0x4102a, 0x0}, +- {0x4102b, 0x0}, +- {0x4102c, 0xd848}, +- {0x4102d, 0x0}, +- {0x4102e, 0x0}, +- {0x4102f, 0x0}, +- {0x41030, 0x0}, +- {0x41031, 0x0}, +- {0x41032, 0x0}, +- {0x41033, 0x2b00}, +- {0x41034, 0x0}, +- {0x41035, 0x0}, +- {0x41036, 0x0}, +- {0x41037, 0x0}, +- {0x41038, 0xc158}, +- {0x41039, 0x0}, +- {0x4103a, 0x0}, +- {0x4103b, 0x0}, +- {0x4103c, 0xddc8}, +- {0x4103d, 0x0}, +- {0x4103e, 0x0}, +- {0x4103f, 0x0}, +- {0x41040, 0x0}, +- {0x41041, 0x0}, +- {0x41042, 0x0}, +- {0x41043, 0x2b00}, +- {0x41044, 0x0}, +- {0x41045, 0x0}, +- {0x41046, 0x0}, +- {0x41047, 0x0}, +- {0x41048, 0xc1d8}, +- {0x41049, 0x0}, +- {0x4104a, 0x0}, +- {0x4104b, 0x0}, +- {0x4104c, 0xc308}, +- {0x4104d, 0x0}, +- {0x4104e, 0x0}, +- {0x4104f, 0x0}, +- {0x41050, 0x0}, +- {0x41051, 0x0}, +- {0x41052, 0x0}, +- {0x41053, 0x2b00}, +- {0x41054, 0x0}, +- {0x41055, 0x0}, +- {0x41056, 0x0}, +- {0x41057, 0x0}, +- {0x41058, 0xc558}, +- {0x41059, 0x0}, +- {0x4105a, 0x0}, +- {0x4105b, 0x0}, +- {0x4105c, 0xea08}, +- {0x4105d, 0x0}, +- {0x4105e, 0x0}, +- {0x4105f, 0x0}, +- {0x41060, 0x0}, +- {0x41061, 0x0}, +- {0x41062, 0x0}, +- {0x41063, 0x2b00}, +- {0x41064, 0x0}, +- {0x41065, 0x0}, +- {0x41066, 0x0}, +- {0x41067, 0x0}, +- {0x41068, 0xc5d8}, +- {0x41069, 0x0}, +- {0x4106a, 0x0}, +- {0x4106b, 0x0}, +- {0x4106c, 0xe308}, +- {0x4106d, 0x0}, +- {0x4106e, 0x0}, +- {0x4106f, 0x0}, +- {0x41070, 0x0}, +- {0x41071, 0x0}, +- {0x41072, 0x0}, +- {0x41073, 0x2b00}, +- {0x41074, 0x0}, +- {0x41075, 0x0}, +- {0x41076, 0x0}, +- {0x41077, 0x0}, +- {0x41078, 0x48d8}, +- {0x41079, 0x0}, +- {0x4107a, 0x0}, +- {0x4107b, 0x0}, +- {0x4107c, 0x4248}, +- {0x4107d, 0x0}, +- {0x4107e, 0x0}, +- {0x4107f, 0x0}, +- {0x41080, 0x88d8}, +- {0x41081, 0x0}, +- {0x41082, 0x0}, +- {0x41083, 0x0}, +- {0x41084, 0x9648}, +- {0x41085, 0x0}, +- {0x41086, 0x0}, +- {0x41087, 0x0}, +- {0x41088, 0x0}, +- {0x41089, 0x0}, +- {0x4108a, 0x0}, +- {0x4108b, 0x2b00}, +- {0x4108c, 0x0}, +- {0x4108d, 0x0}, +- {0x4108e, 0x0}, +- {0x4108f, 0x0}, +- {0x41090, 0xca58}, +- {0x41091, 0x0}, +- {0x41092, 0x0}, +- {0x41093, 0x0}, +- {0x41094, 0xc108}, +- {0x41095, 0x0}, +- {0x41096, 0x0}, +- {0x41097, 0x0}, +- {0x41098, 0x0}, +- {0x41099, 0x0}, +- {0x4109a, 0x0}, +- {0x4109b, 0x2b00}, +- {0x4109c, 0x0}, +- {0x4109d, 0x0}, +- {0x4109e, 0x0}, +- {0x4109f, 0x0}, +- {0x410a0, 0xcb58}, +- {0x410a1, 0x0}, +- {0x410a2, 0x0}, +- {0x410a3, 0x0}, +- {0x410a4, 0xc008}, +- {0x410a5, 0x0}, +- {0x410a6, 0x0}, +- {0x410a7, 0x0}, +- {0x410a8, 0x0}, +- {0x410a9, 0x0}, +- {0x410aa, 0x0}, +- {0x410ab, 0x2b00}, +- {0x410ac, 0x0}, +- {0x410ad, 0x0}, +- {0x410ae, 0x0}, +- {0x410af, 0x0}, +- {0x410b0, 0xd4d8}, +- {0x410b1, 0x0}, +- {0x410b2, 0x0}, +- {0x410b3, 0x0}, +- {0x410b4, 0xc008}, +- {0x410b5, 0x0}, +- {0x410b6, 0x0}, +- {0x410b7, 0x0}, +- {0xc0001, 0x5061}, +- {0xc0002, 0x7098}, +- {0xc0003, 0x0}, +- {0xc0000, 0xbedc}, +- {0xc0006, 0xb0db}, +- {0xc0007, 0x0}, +- {0x9070c, 0x0}, +- {0x9070d, 0x7ff}, +- {0x9070e, 0x668}, +- {0x9070f, 0x7910}, +- {0x90710, 0x355e}, +- {0x90711, 0xcbb5}, +- {0x90713, 0xffff}, +- {0x90714, 0x710}, +- {0x90715, 0x7800}, +- {0x90c10, 0xffff}, +- {0x90c12, 0xff10}, +- {0x90712, 0xffff}, +- {0x90716, 0xff10}, +- {0x90717, 0xff10}, +- {0x90718, 0xff10}, +- {0x90719, 0xffff}, +- {0x9071a, 0xffff}, +- {0x9071b, 0xfeef}, +- {0x90c11, 0xffff}, +- {0x90904, 0xe400}, +- {0x90986, 0xe400}, +- {0x90920, 0x0}, +- {0x90921, 0x0}, +- {0x90922, 0x0}, +- {0x90923, 0x0}, +- {0x90924, 0xff00}, +- {0x90925, 0xff00}, +- {0x90926, 0xff00}, +- {0x90927, 0xff00}, +- {0x90930, 0x4000}, +- {0x90931, 0x2000}, +- {0x90932, 0xff00}, +- {0x90933, 0xff00}, +- {0x9090a, 0x0}, +- {0x9090c, 0x0}, +- {0x9090d, 0x1}, +- {0x200f0, 0x27f7}, +- {0x200f1, 0x2108}, +- {0x200f2, 0x2108}, +- {0x100b9, 0x1}, +- {0x100b1, 0x180}, +- {0x100ba, 0x1}, +- {0x100a2, 0x0}, +- {0x100b5, 0x1}, +- {0x110b9, 0x1}, +- {0x110b1, 0x180}, +- {0x110ba, 0x1}, +- {0x110a2, 0x0}, +- {0x110b5, 0x1}, +- {0x120b9, 0x1}, +- {0x120b1, 0x180}, +- {0x120ba, 0x1}, +- {0x120a2, 0x0}, +- {0x120b5, 0x1}, +- {0x130b9, 0x1}, +- {0x130b1, 0x180}, +- {0x130ba, 0x1}, +- {0x130a2, 0x0}, +- {0x130b5, 0x1}, +- {0x70024, 0x5a3c}, +- {0x70025, 0x5a3c}, +- {0x70026, 0x5a3c}, +- {0x70027, 0x5a3c}, +- {0x70028, 0x5a3c}, +- {0x70029, 0x5a3c}, +- {0x7002a, 0x5a3c}, +- {0x7002b, 0x5a3c}, +- {0x70124, 0x5a3c}, +- {0x70125, 0x5a3c}, +- {0x70126, 0x5a3c}, +- {0x70127, 0x5a3c}, +- {0x70128, 0x5a3c}, +- {0x70129, 0x5a3c}, +- {0x7012a, 0x5a3c}, +- {0x7012b, 0x5a3c}, +- {0x70224, 0x5a3c}, +- {0x70225, 0x5a3c}, +- {0x70226, 0x5a3c}, +- {0x70227, 0x5a3c}, +- {0x70228, 0x5a3c}, +- {0x70229, 0x5a3c}, +- {0x7022a, 0x5a3c}, +- {0x7022b, 0x5a3c}, +- {0x70324, 0x5a3c}, +- {0x70325, 0x5a3c}, +- {0x70326, 0x5a3c}, +- {0x70327, 0x5a3c}, +- {0x70328, 0x5a3c}, +- {0x70329, 0x5a3c}, +- {0x7032a, 0x5a3c}, +- {0x7032b, 0x5a3c}, +- {0x70424, 0x5a3c}, +- {0x70425, 0x5a3c}, +- {0x70426, 0x5a3c}, +- {0x70427, 0x5a3c}, +- {0x70428, 0x5a3c}, +- {0x70429, 0x5a3c}, +- {0x7042a, 0x5a3c}, +- {0x7042b, 0x5a3c}, +- {0x70524, 0x5a3c}, +- {0x70525, 0x5a3c}, +- {0x70526, 0x5a3c}, +- {0x70527, 0x5a3c}, +- {0x70528, 0x5a3c}, +- {0x70529, 0x5a3c}, +- {0x7052a, 0x5a3c}, +- {0x7052b, 0x5a3c}, +- {0x70624, 0x5a3c}, +- {0x70625, 0x5a3c}, +- {0x70626, 0x5a3c}, +- {0x70627, 0x5a3c}, +- {0x70628, 0x5a3c}, +- {0x70629, 0x5a3c}, +- {0x7062a, 0x5a3c}, +- {0x7062b, 0x5a3c}, +- {0x70724, 0x5a3c}, +- {0x70725, 0x5a3c}, +- {0x70726, 0x5a3c}, +- {0x70727, 0x5a3c}, +- {0x70728, 0x5a3c}, +- {0x70729, 0x5a3c}, +- {0x7072a, 0x5a3c}, +- {0x7072b, 0x5a3c}, +- {0x70824, 0x5a3c}, +- {0x70825, 0x5a3c}, +- {0x70826, 0x5a3c}, +- {0x70827, 0x5a3c}, +- {0x70828, 0x5a3c}, +- {0x70829, 0x5a3c}, +- {0x7082a, 0x5a3c}, +- {0x7082b, 0x5a3c}, +- {0x70065, 0x1ff}, +- {0x2007e, 0x33}, +- {0x200ef, 0xffff}, +- {0x90910, 0x2}, +- {0x20310, 0x1}, +- {0x20311, 0x1}, +- {0xc0080, 0x2}, +- {0xd0003, 0x0}, +- {0x1000f, 0x1087}, +- {0x1100f, 0x1087}, +- {0x1200f, 0x1087}, +- {0x1300f, 0x1087}, +-}; +- +-static struct dram_fsp_msg ddr_dram_fsp_msg[] = { +- { +- /* P0 6400mbps */ +- .drate = 6400, +- .ssc = false, +- .fsp_phy_cfg = ddr_phy_fsp0_cfg, +- .fsp_phy_cfg_num = ARRAY_SIZE(ddr_phy_fsp0_cfg), +- .fw_type = FW_1D_IMAGE, +- .fsp_phy_msgh_cfg = ddr_phy_msgh_fsp0_cfg, +- .fsp_phy_msgh_cfg_num = ARRAY_SIZE(ddr_phy_msgh_fsp0_cfg), +- .fsp_phy_pie_cfg = ddr_phy_pie_fsp0_cfg, +- .fsp_phy_pie_cfg_num = ARRAY_SIZE(ddr_phy_pie_fsp0_cfg), +- }, +-}; +- +-/* dram fsp cfg */ +-static struct dram_fsp_cfg ddr_dram_fsp_cfg[] = { +- { +- .ddrc_cfg = ddr_dram_fsp0_ddrc_cfg, +- .ddrc_cfg_num = ARRAY_SIZE(ddr_dram_fsp0_ddrc_cfg), +- .bypass = 0, +- }, +-}; +- +-/* ddr timing config params */ +-struct dram_timing_info dram_timing = { +- .ddrc_cfg = ddr_ddrc_cfg, +- .ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg), +- .ddrphy_cfg = ddr_ddrphy_cfg, +- .ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg), +- .fsp_msg = ddr_dram_fsp_msg, +- .fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg), +- .ddrphy_trained_csr = ddr_ddrphy_trained_csr, +- .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr), +- .ddrphy_pie = ddr_phy_pie, +- .ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie), +- .fsp_table = { 6400, }, +- .fsp_cfg = ddr_dram_fsp_cfg, +- .fsp_cfg_num = ARRAY_SIZE(ddr_dram_fsp_cfg), +-}; +diff --git a/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_timing.c b/boards/ccimx95/ddr/lpddr5_timing_a1.c +similarity index 99% +rename from boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_timing.c +rename to boards/ccimx95/ddr/lpddr5_timing_a1.c +index 59199b033b17..d85865bd5e6a 100644 +--- a/boards/ccimx95/ddr/MIMX95_LPDDR5_EVK_19X19_6400MTS_FW2024.09_timing.c ++++ b/boards/ccimx95/ddr/lpddr5_timing_a1.c +@@ -3,36 +3,34 @@ + * + * SPDX-License-Identifier: BSD-3-Clause + * +- * Code generated with DDR Tool v3.7.0_0.2-4600df02. ++ * Code generated with DDR Tool v3.6.0_7.9-aa018543. + * DDR PHY FW2024.09 +- * Chip revision: B0 + */ + + #include "ddr.h" + + /* Initialize DDRC registers */ + static struct ddrc_cfg_param ddr_ddrc_cfg[] = { +- {0x5e080110, 0x41114001U}, +- {0x5e080000, 0x3ffU}, ++ {0x5e080110, 0x41084001U}, ++ {0x5e080000, 0x1ffU}, + {0x5e080008, 0x0U}, +- {0x5e080010, 0x4U}, ++ {0x5e080010, 0x2U}, + {0x5e080014, 0x80000U}, + {0x5e080020, 0x80000000U}, + {0x5e080024, 0x80007ffU}, + {0x5e080028, 0x80000000U}, + {0x5e08002c, 0x7ffU}, +- {0x5e080080, 0x80800522U}, +- {0x5e080084, 0x80800522U}, +- {0x5e080114, 0x201000U}, +- {0x5e080260, 0x800a1U}, ++ {0x5e080080, 0x80000422U}, ++ {0x5e080084, 0x80000422U}, ++ {0x5e080114, 0x1000U}, ++ {0x5e080260, 0x21U}, + {0x5e080268, 0x0U}, +- {0x5e08026c, 0x3d04U}, +- {0x5e080278, 0x10U}, +- {0x5e080800, 0x43d3b000U}, +- {0x5e080804, 0x1f1f1f1fU}, +- {0x5e080810, 0x14084060U}, +- {0x5e080c00, 0x40000000U}, +- {0x5e081000, 0xe3U}, ++ {0x5e08026c, 0x1004U}, ++ {0x5e080f00, 0x8U}, ++ {0x5e080f04, 0x0U}, ++ {0x5e080800, 0x43931002U}, ++ {0x5e080804, 0x3f1f1f1fU}, ++ {0x5e081000, 0x0U}, + {0x5e081220, 0x0U}, + {0x5e081224, 0x0U}, + {0x5e081228, 0x0U}, +@@ -55,18 +53,18 @@ static struct ddrc_cfg_param ddr_ddrc_cfg[] = { + static struct ddrc_cfg_param ddr_dram_fsp0_ddrc_cfg[] = { + {0x5e080100, 0x020D2100U}, + {0x5e080104, 0x4866000CU}, +- {0x5e080108, 0xF2F28D47U}, ++ {0x5e080108, 0xF2F08C45U}, + {0x5e08010C, 0x20488010U}, +- {0x5e080124, 0x0C230000U}, ++ {0x5e080124, 0x0C230308U}, + {0x5e080160, 0x00000101U}, + {0x5e08016C, 0x01300000U}, +- {0x5e080170, 0x8C010509U}, +- {0x5e080250, 0x00110C11U}, ++ {0x5e080170, 0x8B010509U}, ++ {0x5e080250, 0x00110A11U}, + {0x5e080254, 0x00680040U}, + {0x5e080258, 0x03003E80U}, + {0x5e08025C, 0x40520200U}, +- {0x5e080300, 0x08110809U}, +- {0x5e080304, 0x00680F02U}, ++ {0x5e080300, 0x08110808U}, ++ {0x5e080304, 0x00680E02U}, + {0x5e080308, 0x06040603U}, + {0x5e08030C, 0x0030001CU}, + {0x5e080310, 0x20610000U}, +@@ -141,9 +139,9 @@ static struct ddrphy_cfg_param ddr_ddrphy_cfg[] = { + {0x310ac, 0x80}, + {0xc0086, 0x0}, + {0x100a3, 0xb33}, +- {0x110a3, 0xb33}, ++ {0x110a3, 0xb3f}, + {0x120a3, 0xb33}, +- {0x130a3, 0xb33}, ++ {0x130a3, 0xb3f}, + {0xc00f1, 0x6000}, + {0xc00f2, 0xa9}, + {0xc00f3, 0x8000}, +@@ -6196,10 +6194,10 @@ static struct ddrphy_cfg_param ddr_phy_fsp0_cfg[] = { + {0x20001, 0x1122}, + {0x20009, 0x0}, + {0x20008, 0x0}, +- {0x200d9, 0x1}, ++ {0x200d9, 0x0}, + {0x30eef, 0x0}, + {0x31eef, 0x0}, +- {0x20014, 0x1301}, ++ {0x20014, 0x1300}, + {0x9080a, 0x1300}, + {0x10040, 0xe0e}, + {0x10042, 0xe0e}, +@@ -6322,17 +6320,17 @@ static struct ddrphy_cfg_param ddr_phy_fsp0_cfg[] = { + {0x20037, 0x41c}, + {0x20037, 0x45c}, + {0x20038, 0x1920}, +- {0x20039, 0x101c}, +- {0x2003a, 0x101c}, +- {0x2003b, 0x42c}, +- {0x2003c, 0x2d30}, ++ {0x20039, 0x1018}, ++ {0x2003a, 0x1018}, ++ {0x2003b, 0x428}, ++ {0x2003c, 0x2d2c}, + {0x2003d, 0x1004}, + {0x2003e, 0x1004}, + {0x2003f, 0x414}, + {0x20040, 0x1118}, +- {0x2002c, 0x843}, +- {0x2002d, 0x843}, +- {0x20030, 0x843}, ++ {0x2002c, 0x83f}, ++ {0x2002d, 0x83f}, ++ {0x20030, 0x83f}, + {0x2002e, 0x81f}, + {0x2002f, 0x81f}, + {0x2000c, 0x0}, +@@ -6355,7 +6353,6 @@ static struct ddrphy_cfg_param ddr_phy_msgh_fsp0_cfg[] = { + {0x58009, 0xc8}, + {0x5800b, 0x2}, + {0x5800d, 0x100}, +- {0x5800e, 0xf}, + {0x58012, 0x310}, + {0x5801f, 0x1000}, + {0x58020, 0x3}, +@@ -6379,8 +6376,8 @@ static struct ddrphy_cfg_param ddr_phy_msgh_fsp0_cfg[] = { + {0x5803e, 0x1c1c}, + {0x58041, 0xac84}, + {0x58042, 0xac84}, +- {0x58043, 0x1b1b}, +- {0x58044, 0x1b1b}, ++ {0x58043, 0x1e1e}, ++ {0x58044, 0x1e1e}, + {0x58045, 0x1010}, + {0x58046, 0x1010}, + {0x58047, 0x202}, +@@ -6392,8 +6389,8 @@ static struct ddrphy_cfg_param ddr_phy_msgh_fsp0_cfg[] = { + {0x58074, 0x2e}, + {0x58075, 0x50}, + {0x58080, 0x1}, +- {0x58081, 0x4b00}, +- {0x58082, 0x43}, ++ {0x58081, 0x4300}, ++ {0x58082, 0x3f}, + }; + + /* DRAM PHY init engine image for Pstate 0 */ +@@ -6426,7 +6423,7 @@ static struct ddrphy_cfg_param ddr_phy_pie_fsp0_cfg[] = { + {0x41019, 0x0}, + {0x4101a, 0x0}, + {0x4101b, 0x0}, +- {0x4101c, 0xcd88}, ++ {0x4101c, 0xcf08}, + {0x4101d, 0x0}, + {0x4101e, 0x0}, + {0x4101f, 0x0}, +@@ -6596,16 +6593,16 @@ static struct ddrphy_cfg_param ddr_phy_pie_fsp0_cfg[] = { + {0x2008a, 0x0}, + {0x2008c, 0x0}, + {0x20041, 0x1}, +- {0x90802, 0x0}, ++ {0x90802, 0x1}, + {0x20045, 0x2}, + {0x10057, 0x0}, + {0x11057, 0x0}, + {0x12057, 0x0}, + {0x13057, 0x0}, +- {0x1000f, 0x1087}, +- {0x1100f, 0x1087}, +- {0x1200f, 0x1087}, +- {0x1300f, 0x1087}, ++ {0x1000f, 0x1088}, ++ {0x1100f, 0x1088}, ++ {0x1200f, 0x1088}, ++ {0x1300f, 0x1088}, + {0x90803, 0x4}, + {0x90804, 0x82}, + {0x90805, 0x1}, +@@ -10373,19 +10370,19 @@ static struct ddrphy_cfg_param ddr_phy_pie[] = { + {0x4181f, 0x0}, + {0x41a2b, 0x6b00}, + {0x41a2f, 0x0}, +- {0x41a53, 0x3b00}, ++ {0x41a53, 0x2b00}, + {0x41a57, 0x800}, + {0x41a7b, 0x6b00}, + {0x41a7f, 0x0}, +- {0x41aa3, 0x3b00}, ++ {0x41aa3, 0x2b00}, + {0x41aa7, 0x800}, + {0x41b33, 0x6b00}, + {0x41b37, 0x0}, +- {0x41b5b, 0x3b00}, ++ {0x41b5b, 0x2b00}, + {0x41b5f, 0x800}, + {0x41bfb, 0x6b00}, + {0x41bff, 0x0}, +- {0x41c23, 0x3b00}, ++ {0x41c23, 0x2b00}, + {0x41c27, 0x800}, + {0x41008, 0xc9d8}, + {0x41009, 0x0}, +@@ -10407,7 +10404,7 @@ static struct ddrphy_cfg_param ddr_phy_pie[] = { + {0x41019, 0x0}, + {0x4101a, 0x0}, + {0x4101b, 0x0}, +- {0x4101c, 0xcd88}, ++ {0x4101c, 0xcf08}, + {0x4101d, 0x0}, + {0x4101e, 0x0}, + {0x4101f, 0x0}, diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0003-ccimx95-configure-console-on-LPUART6.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0003-ccimx95-configure-console-on-LPUART6.patch new file mode 100644 index 000000000..a2ff57b68 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0003-ccimx95-configure-console-on-LPUART6.patch @@ -0,0 +1,56 @@ +From: Isaac Hermida +Date: Mon, 15 Sep 2025 11:38:55 +0200 +Subject: [PATCH] ccimx95: configure console on LPUART6 + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Javier Viguera +--- + boards/ccimx95/config_board.h | 2 +- + boards/ccimx95/pin_mux.c | 7 +++++++ + devices/MIMX95/oei/soc_clock.c | 2 ++ + 3 files changed, 10 insertions(+), 1 deletion(-) + +diff --git a/boards/ccimx95/config_board.h b/boards/ccimx95/config_board.h +index 3095ebf1d8ce..ec97626a2a28 100644 +--- a/boards/ccimx95/config_board.h ++++ b/boards/ccimx95/config_board.h +@@ -52,7 +52,7 @@ + /* Defines */ + + /*! Config for UART instance */ +-#define BOARD_DEBUG_UART_INSTANCE 2U ++#define BOARD_DEBUG_UART_INSTANCE 6U + /*! Config for UART baudrate */ + #define BOARD_DEBUG_UART_BAUDRATE 115200U + +diff --git a/boards/ccimx95/pin_mux.c b/boards/ccimx95/pin_mux.c +index a8c15513b578..3cb33909f740 100644 +--- a/boards/ccimx95/pin_mux.c ++++ b/boards/ccimx95/pin_mux.c +@@ -29,5 +29,12 @@ void BOARD_InitPins(void) + + IOMUXC_SetPinMux(IOMUXC_PAD_UART2_TXD__LPUART2_TX, 0); + IOMUXC_SetPinConfig(IOMUXC_PAD_UART2_TXD__LPUART2_TX, IOMUXC_PAD_DSE(0xFU)); ++#elif (BOARD_DEBUG_UART_INSTANCE == 6U) ++ /* Configure LPUART 6 */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_GPIO_IO05__LPUART6_RX, 0); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_GPIO_IO05__LPUART6_RX, IOMUXC_PAD_PD(1U)); ++ ++ IOMUXC_SetPinMux(IOMUXC_PAD_GPIO_IO04__LPUART6_TX, 0); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_GPIO_IO04__LPUART6_TX, IOMUXC_PAD_DSE(0xFU)); + #endif + } +diff --git a/devices/MIMX95/oei/soc_clock.c b/devices/MIMX95/oei/soc_clock.c +index 3421e3efe143..9205b9a12782 100644 +--- a/devices/MIMX95/oei/soc_clock.c ++++ b/devices/MIMX95/oei/soc_clock.c +@@ -25,6 +25,8 @@ static struct clk_root_cfg clk_root_cfgs[] = { + { CLOCK_ROOT_LPUART1, CLOCK_SRC_OSC24M, 1}, /* 24MHz */ + #elif (BOARD_DEBUG_UART_INSTANCE == 2) + { CLOCK_ROOT_LPUART2, CLOCK_SRC_OSC24M, 1}, /* 24MHz */ ++#elif (BOARD_DEBUG_UART_INSTANCE == 6) ++ { CLOCK_ROOT_LPUART6, CLOCK_SRC_OSC24M, 1}, /* 24MHz */ + #endif + #endif + }; diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0004-ccimx95-add-DDR-configuration-file-for-ccimx95-B0-si.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0004-ccimx95-add-DDR-configuration-file-for-ccimx95-B0-si.patch new file mode 100644 index 000000000..f225cf02a --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei/0004-ccimx95-add-DDR-configuration-file-for-ccimx95-B0-si.patch @@ -0,0 +1,10713 @@ +From: Javier Viguera +Date: Mon, 27 Oct 2025 13:11:44 +0100 +Subject: [PATCH] ccimx95: add DDR configuration file for ccimx95 B0 silicon + +*** About Config Tools for i.MX: +Version and Build id: 202509170918 +Installed tools: +Pins (17.0) +Clocks (18.0) +System Manager (1.0) +Peripherals (15.0) +TEE (10.0) +DDR (1.0) +SERDES (1.0) + +Data server: https://mcuxpresso.nxp.com + +Locally installed data: +C:\ProgramData\NXP\mcu_data_25.09 +Processors: +MIMX9596xxxxN (25.09.20) - i.MX 95 + +A basic white space processing has been done on the file: + +fromdos lpddr5_timing.c +sed -i -e '/^};$/{G;}' lpddr5_timing.c +sed -i -e '/^$/N;/^\n$/D' lpddr5_timing.c +sed -i -e '${/^[[:space:]]*$/d;}' lpddr5_timing.c + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Javier Viguera +--- + boards/ccimx95/ddr/Makefile | 2 +- + boards/ccimx95/ddr/lpddr5_timing.c | 10659 +++++++++++++++++++++++++++ + 2 files changed, 10660 insertions(+), 1 deletion(-) + create mode 100644 boards/ccimx95/ddr/lpddr5_timing.c + +diff --git a/boards/ccimx95/ddr/Makefile b/boards/ccimx95/ddr/Makefile +index 8cceb6e345d5..39095fb6d0c8 100644 +--- a/boards/ccimx95/ddr/Makefile ++++ b/boards/ccimx95/ddr/Makefile +@@ -1,4 +1,4 @@ +-DDR_CONFIG ?= lpddr5_timing_a1 ++DDR_CONFIG ?= lpddr5_timing + OBJS += $(OUT)/$(DDR_CONFIG).o + + VPATH += boards/ccimx95/ddr +diff --git a/boards/ccimx95/ddr/lpddr5_timing.c b/boards/ccimx95/ddr/lpddr5_timing.c +new file mode 100644 +index 000000000000..108fbcdefe6d +--- /dev/null ++++ b/boards/ccimx95/ddr/lpddr5_timing.c +@@ -0,0 +1,10659 @@ ++/* ++ * Copyright 2025 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ * ++ * Code generated with DDR Tool v3.8.0_0.7-7343b64b3. ++ * DDR PHY FW2024.09-SP2 ++ * Chip revision: B0 ++ * Part number: MT62F2G32D4DS-023 ++ */ ++ ++#include "ddr.h" ++ ++/* Initialize DDRC registers */ ++static struct ddrc_cfg_param ddr_ddrc_cfg[] = { ++ {0x5e080110, 0x41114001U}, ++ {0x5e080000, 0x1ffU}, ++ {0x5e080008, 0x0U}, ++ {0x5e080010, 0x2U}, ++ {0x5e080014, 0x80000U}, ++ {0x5e080020, 0x80000000U}, ++ {0x5e080024, 0x80007ffU}, ++ {0x5e080028, 0x80000000U}, ++ {0x5e08002c, 0x7ffU}, ++ {0x5e080080, 0x80800422U}, ++ {0x5e080084, 0x80800422U}, ++ {0x5e080114, 0x1000U}, ++ {0x5e080260, 0x800a1U}, ++ {0x5e080268, 0x0U}, ++ {0x5e08026c, 0x3d04U}, ++ {0x5e080278, 0x10U}, ++ {0x5e080800, 0x43d3b000U}, ++ {0x5e080804, 0x1f1f1f1fU}, ++ {0x5e080810, 0x14084060U}, ++ {0x5e080c00, 0x40000000U}, ++ {0x5e081000, 0xe3U}, ++ {0x5e081220, 0x0U}, ++ {0x5e081224, 0x0U}, ++ {0x5e081228, 0x0U}, ++ {0x5e08122c, 0x0U}, ++ {0x5e081230, 0x0U}, ++ {0x5e081234, 0x0U}, ++ {0x5e081238, 0x0U}, ++ {0x5e08123c, 0x0U}, ++ {0x5e081240, 0x0U}, ++ {0x5e081244, 0x0U}, ++ {0x5e081248, 0x0U}, ++ {0x5e08124c, 0x0U}, ++ {0x5e081250, 0x0U}, ++ {0x5e081254, 0x0U}, ++ {0x5e081258, 0x0U}, ++ {0x5e08125c, 0x0U}, ++}; ++ ++/* DRAM fsp configurations */ ++static struct ddrc_cfg_param ddr_dram_fsp0_ddrc_cfg[] = { ++ {0x5e080100, 0x020D2100U}, ++ {0x5e080104, 0x4866000CU}, ++ {0x5e080108, 0xF2F08C45U}, ++ {0x5e08010C, 0x20488010U}, ++ {0x5e080124, 0x0C230000U}, ++ {0x5e080160, 0x00000101U}, ++ {0x5e08016C, 0x01300000U}, ++ {0x5e080170, 0x8B010509U}, ++ {0x5e080250, 0x00110A11U}, ++ {0x5e080254, 0x00680040U}, ++ {0x5e080258, 0x03003E80U}, ++ {0x5e08025C, 0x40520200U}, ++ {0x5e080300, 0x08110808U}, ++ {0x5e080304, 0x00680E02U}, ++ {0x5e080308, 0x06040603U}, ++ {0x5e08030C, 0x0030001CU}, ++ {0x5e080310, 0x20610000U}, ++ {0x5e080314, 0x0A0A0407U}, ++}; ++ ++/* PHY Initialize Configuration */ ++static struct ddrphy_cfg_param ddr_ddrphy_cfg[] = { ++ {0x10080, 0x7}, ++ {0x10081, 0x5}, ++ {0x10082, 0x6}, ++ {0x10083, 0x1}, ++ {0x10084, 0x2}, ++ {0x10085, 0x0}, ++ {0x10086, 0x3}, ++ {0x10087, 0x4}, ++ {0x11080, 0x0}, ++ {0x11081, 0x1}, ++ {0x11082, 0x2}, ++ {0x11083, 0x3}, ++ {0x11084, 0x4}, ++ {0x11085, 0x7}, ++ {0x11086, 0x6}, ++ {0x11087, 0x5}, ++ {0x12080, 0x5}, ++ {0x12081, 0x6}, ++ {0x12082, 0x1}, ++ {0x12083, 0x7}, ++ {0x12084, 0x4}, ++ {0x12085, 0x2}, ++ {0x12086, 0x0}, ++ {0x12087, 0x3}, ++ {0x13080, 0x0}, ++ {0x13081, 0x3}, ++ {0x13082, 0x2}, ++ {0x13083, 0x7}, ++ {0x13084, 0x4}, ++ {0x13085, 0x5}, ++ {0x13086, 0x6}, ++ {0x13087, 0x1}, ++ {0x30090, 0x4}, ++ {0x30091, 0x3}, ++ {0x30092, 0x6}, ++ {0x30093, 0x0}, ++ {0x30094, 0x5}, ++ {0x30095, 0x1}, ++ {0x30096, 0x2}, ++ {0x31090, 0x1}, ++ {0x31091, 0x3}, ++ {0x31092, 0x4}, ++ {0x31093, 0x6}, ++ {0x31094, 0x2}, ++ {0x31095, 0x0}, ++ {0x31096, 0x5}, ++ {0x20060, 0x2}, ++ {0x200a5, 0x1}, ++ {0xd0036, 0x0}, ++ {0x200bd, 0xff}, ++ {0x20300, 0x808}, ++ {0x20303, 0x9}, ++ {0x20302, 0x26}, ++ {0x20328, 0x0}, ++ {0x20301, 0x3}, ++ {0x2030b, 0x0}, ++ {0x300a7, 0x0}, ++ {0x310a7, 0x0}, ++ {0x300ae, 0x80}, ++ {0x300ad, 0x80}, ++ {0x300ac, 0x80}, ++ {0x310ae, 0x80}, ++ {0x310ad, 0x80}, ++ {0x310ac, 0x80}, ++ {0xc0086, 0x0}, ++ {0x100a3, 0xb33}, ++ {0x110a3, 0xb3f}, ++ {0x120a3, 0xb33}, ++ {0x130a3, 0xb3f}, ++ {0xc00f1, 0x6000}, ++ {0xc00f2, 0xa9}, ++ {0xc00f3, 0x8000}, ++ {0xc00f4, 0x5}, ++ {0xc00f5, 0x4000}, ++ {0xc00f6, 0x2}, ++ {0xc00f7, 0xf000}, ++ {0xc00f9, 0x6000}, ++ {0xc00fa, 0xa9}, ++ {0xc00fb, 0x8000}, ++ {0xc00fd, 0x4000}, ++ {0xc00ff, 0xf000}, ++ {0x908ff, 0xf}, ++ {0x10093, 0x0}, ++ {0x11093, 0x0}, ++ {0x12093, 0x0}, ++ {0x13093, 0x0}, ++ {0x20051, 0x3}, ++}; ++ ++/* PHY trained csr */ ++static struct ddrphy_cfg_param ddr_ddrphy_trained_csr[] = { ++ {0x200a5, 0x0}, ++ {0xd0036, 0x0}, ++ {0x200bd, 0x0}, ++ {0x20300, 0x0}, ++ {0x20303, 0x0}, ++ {0x20302, 0x0}, ++ {0x20328, 0x0}, ++ {0x20301, 0x0}, ++ {0x2030b, 0x0}, ++ {0x300a7, 0x0}, ++ {0x310a7, 0x0}, ++ {0x300ae, 0x0}, ++ {0x300ad, 0x0}, ++ {0x300ac, 0x0}, ++ {0x310ae, 0x0}, ++ {0x310ad, 0x0}, ++ {0x310ac, 0x0}, ++ {0xc0086, 0x0}, ++ {0x100a3, 0x0}, ++ {0x110a3, 0x0}, ++ {0x120a3, 0x0}, ++ {0x130a3, 0x0}, ++ {0xc00f1, 0x0}, ++ {0xc00f2, 0x0}, ++ {0xc00f3, 0x0}, ++ {0xc00f4, 0x0}, ++ {0xc00f5, 0x0}, ++ {0xc00f6, 0x0}, ++ {0xc00f7, 0x0}, ++ {0xc00f9, 0x0}, ++ {0xc00fa, 0x0}, ++ {0xc00fb, 0x0}, ++ {0xc00fd, 0x0}, ++ {0xc00ff, 0x0}, ++ {0x908ff, 0x0}, ++ {0x10093, 0x0}, ++ {0x11093, 0x0}, ++ {0x12093, 0x0}, ++ {0x13093, 0x0}, ++ {0x20051, 0x0}, ++ {0x90802, 0x0}, ++ {0x20002, 0x0}, ++ {0x20000, 0x0}, ++ {0x90801, 0x0}, ++ {0x90809, 0x0}, ++ {0x1005e, 0x0}, ++ {0x10060, 0x0}, ++ {0x10062, 0x0}, ++ {0x10064, 0x0}, ++ {0x1005f, 0x0}, ++ {0x10061, 0x0}, ++ {0x10063, 0x0}, ++ {0x10065, 0x0}, ++ {0x1105e, 0x0}, ++ {0x11060, 0x0}, ++ {0x11062, 0x0}, ++ {0x11064, 0x0}, ++ {0x1105f, 0x0}, ++ {0x11061, 0x0}, ++ {0x11063, 0x0}, ++ {0x11065, 0x0}, ++ {0x1205e, 0x0}, ++ {0x12060, 0x0}, ++ {0x12062, 0x0}, ++ {0x12064, 0x0}, ++ {0x1205f, 0x0}, ++ {0x12061, 0x0}, ++ {0x12063, 0x0}, ++ {0x12065, 0x0}, ++ {0x1305e, 0x0}, ++ {0x13060, 0x0}, ++ {0x13062, 0x0}, ++ {0x13064, 0x0}, ++ {0x1305f, 0x0}, ++ {0x13061, 0x0}, ++ {0x13063, 0x0}, ++ {0x13065, 0x0}, ++ {0x10005, 0x0}, ++ {0x1000b, 0x0}, ++ {0x11005, 0x0}, ++ {0x1100b, 0x0}, ++ {0x12005, 0x0}, ++ {0x1200b, 0x0}, ++ {0x13005, 0x0}, ++ {0x1300b, 0x0}, ++ {0x20007, 0x0}, ++ {0x20013, 0x0}, ++ {0x30038, 0x0}, ++ {0x30039, 0x0}, ++ {0x3003a, 0x0}, ++ {0x31038, 0x0}, ++ {0x31039, 0x0}, ++ {0x3103a, 0x0}, ++ {0x10038, 0x0}, ++ {0x1003a, 0x0}, ++ {0x11038, 0x0}, ++ {0x1103a, 0x0}, ++ {0x12038, 0x0}, ++ {0x1203a, 0x0}, ++ {0x13038, 0x0}, ++ {0x1303a, 0x0}, ++ {0x1003b, 0x0}, ++ {0x1103b, 0x0}, ++ {0x1203b, 0x0}, ++ {0x1303b, 0x0}, ++ {0x10009, 0x0}, ++ {0x10037, 0x0}, ++ {0x11009, 0x0}, ++ {0x11037, 0x0}, ++ {0x12009, 0x0}, ++ {0x12037, 0x0}, ++ {0x13009, 0x0}, ++ {0x13037, 0x0}, ++ {0x10004, 0x0}, ++ {0x10003, 0x0}, ++ {0x11004, 0x0}, ++ {0x11003, 0x0}, ++ {0x12004, 0x0}, ++ {0x12003, 0x0}, ++ {0x13004, 0x0}, ++ {0x13003, 0x0}, ++ {0x20004, 0x0}, ++ {0x30050, 0x0}, ++ {0x30051, 0x0}, ++ {0x30052, 0x0}, ++ {0x30053, 0x0}, ++ {0x31050, 0x0}, ++ {0x31051, 0x0}, ++ {0x31052, 0x0}, ++ {0x31053, 0x0}, ++ {0x1004e, 0x0}, ++ {0x1004f, 0x0}, ++ {0x10050, 0x0}, ++ {0x10051, 0x0}, ++ {0x1014e, 0x0}, ++ {0x1014f, 0x0}, ++ {0x10150, 0x0}, ++ {0x10151, 0x0}, ++ {0x1024e, 0x0}, ++ {0x1024f, 0x0}, ++ {0x10250, 0x0}, ++ {0x10251, 0x0}, ++ {0x1034e, 0x0}, ++ {0x1034f, 0x0}, ++ {0x10350, 0x0}, ++ {0x10351, 0x0}, ++ {0x1044e, 0x0}, ++ {0x1044f, 0x0}, ++ {0x10450, 0x0}, ++ {0x10451, 0x0}, ++ {0x1054e, 0x0}, ++ {0x1054f, 0x0}, ++ {0x10550, 0x0}, ++ {0x10551, 0x0}, ++ {0x1064e, 0x0}, ++ {0x1064f, 0x0}, ++ {0x10650, 0x0}, ++ {0x10651, 0x0}, ++ {0x1074e, 0x0}, ++ {0x1074f, 0x0}, ++ {0x10750, 0x0}, ++ {0x10751, 0x0}, ++ {0x1084e, 0x0}, ++ {0x1084f, 0x0}, ++ {0x10850, 0x0}, ++ {0x10851, 0x0}, ++ {0x1104e, 0x0}, ++ {0x1104f, 0x0}, ++ {0x11050, 0x0}, ++ {0x11051, 0x0}, ++ {0x1114e, 0x0}, ++ {0x1114f, 0x0}, ++ {0x11150, 0x0}, ++ {0x11151, 0x0}, ++ {0x1124e, 0x0}, ++ {0x1124f, 0x0}, ++ {0x11250, 0x0}, ++ {0x11251, 0x0}, ++ {0x1134e, 0x0}, ++ {0x1134f, 0x0}, ++ {0x11350, 0x0}, ++ {0x11351, 0x0}, ++ {0x1144e, 0x0}, ++ {0x1144f, 0x0}, ++ {0x11450, 0x0}, ++ {0x11451, 0x0}, ++ {0x1154e, 0x0}, ++ {0x1154f, 0x0}, ++ {0x11550, 0x0}, ++ {0x11551, 0x0}, ++ {0x1164e, 0x0}, ++ {0x1164f, 0x0}, ++ {0x11650, 0x0}, ++ {0x11651, 0x0}, ++ {0x1174e, 0x0}, ++ {0x1174f, 0x0}, ++ {0x11750, 0x0}, ++ {0x11751, 0x0}, ++ {0x1184e, 0x0}, ++ {0x1184f, 0x0}, ++ {0x11850, 0x0}, ++ {0x11851, 0x0}, ++ {0x1204e, 0x0}, ++ {0x1204f, 0x0}, ++ {0x12050, 0x0}, ++ {0x12051, 0x0}, ++ {0x1214e, 0x0}, ++ {0x1214f, 0x0}, ++ {0x12150, 0x0}, ++ {0x12151, 0x0}, ++ {0x1224e, 0x0}, ++ {0x1224f, 0x0}, ++ {0x12250, 0x0}, ++ {0x12251, 0x0}, ++ {0x1234e, 0x0}, ++ {0x1234f, 0x0}, ++ {0x12350, 0x0}, ++ {0x12351, 0x0}, ++ {0x1244e, 0x0}, ++ {0x1244f, 0x0}, ++ {0x12450, 0x0}, ++ {0x12451, 0x0}, ++ {0x1254e, 0x0}, ++ {0x1254f, 0x0}, ++ {0x12550, 0x0}, ++ {0x12551, 0x0}, ++ {0x1264e, 0x0}, ++ {0x1264f, 0x0}, ++ {0x12650, 0x0}, ++ {0x12651, 0x0}, ++ {0x1274e, 0x0}, ++ {0x1274f, 0x0}, ++ {0x12750, 0x0}, ++ {0x12751, 0x0}, ++ {0x1284e, 0x0}, ++ {0x1284f, 0x0}, ++ {0x12850, 0x0}, ++ {0x12851, 0x0}, ++ {0x1304e, 0x0}, ++ {0x1304f, 0x0}, ++ {0x13050, 0x0}, ++ {0x13051, 0x0}, ++ {0x1314e, 0x0}, ++ {0x1314f, 0x0}, ++ {0x13150, 0x0}, ++ {0x13151, 0x0}, ++ {0x1324e, 0x0}, ++ {0x1324f, 0x0}, ++ {0x13250, 0x0}, ++ {0x13251, 0x0}, ++ {0x1334e, 0x0}, ++ {0x1334f, 0x0}, ++ {0x13350, 0x0}, ++ {0x13351, 0x0}, ++ {0x1344e, 0x0}, ++ {0x1344f, 0x0}, ++ {0x13450, 0x0}, ++ {0x13451, 0x0}, ++ {0x1354e, 0x0}, ++ {0x1354f, 0x0}, ++ {0x13550, 0x0}, ++ {0x13551, 0x0}, ++ {0x1364e, 0x0}, ++ {0x1364f, 0x0}, ++ {0x13650, 0x0}, ++ {0x13651, 0x0}, ++ {0x1374e, 0x0}, ++ {0x1374f, 0x0}, ++ {0x13750, 0x0}, ++ {0x13751, 0x0}, ++ {0x1384e, 0x0}, ++ {0x1384f, 0x0}, ++ {0x13850, 0x0}, ++ {0x13851, 0x0}, ++ {0x30030, 0x0}, ++ {0x30031, 0x0}, ++ {0x30035, 0x0}, ++ {0x31030, 0x0}, ++ {0x31031, 0x0}, ++ {0x31035, 0x0}, ++ {0x10030, 0x0}, ++ {0x10035, 0x0}, ++ {0x10036, 0x0}, ++ {0x11030, 0x0}, ++ {0x11035, 0x0}, ++ {0x11036, 0x0}, ++ {0x12030, 0x0}, ++ {0x12035, 0x0}, ++ {0x12036, 0x0}, ++ {0x13030, 0x0}, ++ {0x13035, 0x0}, ++ {0x13036, 0x0}, ++ {0x3003c, 0x0}, ++ {0x3103c, 0x0}, ++ {0x1003c, 0x0}, ++ {0x1003d, 0x0}, ++ {0x1003e, 0x0}, ++ {0x1103c, 0x0}, ++ {0x1103d, 0x0}, ++ {0x1103e, 0x0}, ++ {0x1203c, 0x0}, ++ {0x1203d, 0x0}, ++ {0x1203e, 0x0}, ++ {0x1303c, 0x0}, ++ {0x1303d, 0x0}, ++ {0x1303e, 0x0}, ++ {0x20003, 0x0}, ++ {0x10006, 0x0}, ++ {0x11006, 0x0}, ++ {0x12006, 0x0}, ++ {0x13006, 0x0}, ++ {0x20001, 0x0}, ++ {0x20009, 0x0}, ++ {0x20008, 0x0}, ++ {0x200d9, 0x0}, ++ {0x30eef, 0x0}, ++ {0x31eef, 0x0}, ++ {0x20014, 0x0}, ++ {0x9080a, 0x0}, ++ {0x10040, 0x0}, ++ {0x10042, 0x0}, ++ {0x9080d, 0x0}, ++ {0x10043, 0x0}, ++ {0x10044, 0x0}, ++ {0x10045, 0x0}, ++ {0x11040, 0x0}, ++ {0x11042, 0x0}, ++ {0x11043, 0x0}, ++ {0x11044, 0x0}, ++ {0x11045, 0x0}, ++ {0x12040, 0x0}, ++ {0x12042, 0x0}, ++ {0x12043, 0x0}, ++ {0x12044, 0x0}, ++ {0x12045, 0x0}, ++ {0x13040, 0x0}, ++ {0x13042, 0x0}, ++ {0x13043, 0x0}, ++ {0x13044, 0x0}, ++ {0x13045, 0x0}, ++ {0x30040, 0x0}, ++ {0x30041, 0x0}, ++ {0x30042, 0x0}, ++ {0x30043, 0x0}, ++ {0x30330, 0x0}, ++ {0x31040, 0x0}, ++ {0x31041, 0x0}, ++ {0x31042, 0x0}, ++ {0x31043, 0x0}, ++ {0x31330, 0x0}, ++ {0x20331, 0x0}, ++ {0x10048, 0x0}, ++ {0x1004a, 0x0}, ++ {0x1004b, 0x0}, ++ {0x1004c, 0x0}, ++ {0x1004d, 0x0}, ++ {0x11048, 0x0}, ++ {0x1104a, 0x0}, ++ {0x1104b, 0x0}, ++ {0x1104c, 0x0}, ++ {0x1104d, 0x0}, ++ {0x12048, 0x0}, ++ {0x1204a, 0x0}, ++ {0x1204b, 0x0}, ++ {0x1204c, 0x0}, ++ {0x1204d, 0x0}, ++ {0x13048, 0x0}, ++ {0x1304a, 0x0}, ++ {0x1304b, 0x0}, ++ {0x1304c, 0x0}, ++ {0x1304d, 0x0}, ++ {0x30048, 0x0}, ++ {0x30049, 0x0}, ++ {0x3004a, 0x0}, ++ {0x3004b, 0x0}, ++ {0x31048, 0x0}, ++ {0x31049, 0x0}, ++ {0x3104a, 0x0}, ++ {0x3104b, 0x0}, ++ {0x30033, 0x0}, ++ {0x30034, 0x0}, ++ {0x3002e, 0x0}, ++ {0x31033, 0x0}, ++ {0x31034, 0x0}, ++ {0x3102e, 0x0}, ++ {0x10033, 0x0}, ++ {0x1002e, 0x0}, ++ {0x1002f, 0x0}, ++ {0x11033, 0x0}, ++ {0x1102e, 0x0}, ++ {0x1102f, 0x0}, ++ {0x12033, 0x0}, ++ {0x1202e, 0x0}, ++ {0x1202f, 0x0}, ++ {0x13033, 0x0}, ++ {0x1302e, 0x0}, ++ {0x1302f, 0x0}, ++ {0x90806, 0x0}, ++ {0x100e8, 0x0}, ++ {0x100e9, 0x0}, ++ {0x110e8, 0x0}, ++ {0x110e9, 0x0}, ++ {0x120e8, 0x0}, ++ {0x120e9, 0x0}, ++ {0x130e8, 0x0}, ++ {0x130e9, 0x0}, ++ {0x10001, 0x0}, ++ {0x11001, 0x0}, ++ {0x12001, 0x0}, ++ {0x13001, 0x0}, ++ {0x20012, 0x0}, ++ {0x20017, 0x0}, ++ {0x2000a, 0x0}, ++ {0x20186, 0x0}, ++ {0x20187, 0x0}, ++ {0x20010, 0x0}, ++ {0x20011, 0x0}, ++ {0x9080b, 0x0}, ++ {0x9080c, 0x0}, ++ {0x100a5, 0x0}, ++ {0x110a5, 0x0}, ++ {0x120a5, 0x0}, ++ {0x130a5, 0x0}, ++ {0x10014, 0x0}, ++ {0x11014, 0x0}, ++ {0x12014, 0x0}, ++ {0x13014, 0x0}, ++ {0x20035, 0x0}, ++ {0x20036, 0x0}, ++ {0x20037, 0x0}, ++ {0x20038, 0x0}, ++ {0x20039, 0x0}, ++ {0x2003a, 0x0}, ++ {0x2003b, 0x0}, ++ {0x2003c, 0x0}, ++ {0x2003d, 0x0}, ++ {0x2003e, 0x0}, ++ {0x2003f, 0x0}, ++ {0x20040, 0x0}, ++ {0x2002c, 0x0}, ++ {0x2002d, 0x0}, ++ {0x20030, 0x0}, ++ {0x2002e, 0x0}, ++ {0x2002f, 0x0}, ++ {0x2000c, 0x0}, ++ {0x2001b, 0x0}, ++ {0x10007, 0x0}, ++ {0x11007, 0x0}, ++ {0x12007, 0x0}, ++ {0x13007, 0x0}, ++ {0x908f0, 0x0}, ++ {0x908f1, 0x0}, ++ {0x908f2, 0x0}, ++ {0x908f3, 0x0}, ++ {0x908f4, 0x0}, ++ {0x908f5, 0x0}, ++ {0x908f6, 0x0}, ++ {0x908f7, 0x0}, ++ {0x41008, 0x0}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0x0}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x0}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0x0}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0x0}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x0}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0x0}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0x0}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x0}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0x0}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0x0}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x0}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0x0}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0x0}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x0}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0x0}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0x0}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x0}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0x0}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0x0}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x0}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x0}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x0}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x0}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x0}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x0}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0x0}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0x0}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x0}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0x0}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0x0}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x0}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0x0}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0x0}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0x410b8, 0x0}, ++ {0x410b9, 0x0}, ++ {0x410ba, 0x0}, ++ {0x410bb, 0x0}, ++ {0x410bc, 0x0}, ++ {0x410bd, 0x0}, ++ {0x410be, 0x0}, ++ {0x410bf, 0x0}, ++ {0x410c0, 0x0}, ++ {0x410c1, 0x0}, ++ {0x410c2, 0x0}, ++ {0x410c3, 0x0}, ++ {0x410c4, 0x0}, ++ {0x410c5, 0x0}, ++ {0x410c6, 0x0}, ++ {0x410c7, 0x0}, ++ {0x410c8, 0x0}, ++ {0x410c9, 0x0}, ++ {0x410ca, 0x0}, ++ {0x410cb, 0x0}, ++ {0x410cc, 0x0}, ++ {0x410cd, 0x0}, ++ {0x410ce, 0x0}, ++ {0x410cf, 0x0}, ++ {0x410d0, 0x0}, ++ {0x410d1, 0x0}, ++ {0x410d2, 0x0}, ++ {0x410d3, 0x0}, ++ {0x410d4, 0x0}, ++ {0x410d5, 0x0}, ++ {0x410d6, 0x0}, ++ {0x410d7, 0x0}, ++ {0x410d8, 0x0}, ++ {0x410d9, 0x0}, ++ {0x410da, 0x0}, ++ {0x410db, 0x0}, ++ {0x410dc, 0x0}, ++ {0x410dd, 0x0}, ++ {0x410de, 0x0}, ++ {0x410df, 0x0}, ++ {0x410e0, 0x0}, ++ {0x410e1, 0x0}, ++ {0x410e2, 0x0}, ++ {0x410e3, 0x0}, ++ {0x410e4, 0x0}, ++ {0x410e5, 0x0}, ++ {0x410e6, 0x0}, ++ {0x410e7, 0x0}, ++ {0x410e8, 0x0}, ++ {0x410e9, 0x0}, ++ {0x410ea, 0x0}, ++ {0x410eb, 0x0}, ++ {0x410ec, 0x0}, ++ {0x410ed, 0x0}, ++ {0x410ee, 0x0}, ++ {0x410ef, 0x0}, ++ {0x410f0, 0x0}, ++ {0x410f1, 0x0}, ++ {0x410f2, 0x0}, ++ {0x410f3, 0x0}, ++ {0x410f4, 0x0}, ++ {0x410f5, 0x0}, ++ {0x410f6, 0x0}, ++ {0x410f7, 0x0}, ++ {0x410f8, 0x0}, ++ {0x410f9, 0x0}, ++ {0x410fa, 0x0}, ++ {0x410fb, 0x0}, ++ {0x410fc, 0x0}, ++ {0x410fd, 0x0}, ++ {0x410fe, 0x0}, ++ {0x410ff, 0x0}, ++ {0x41100, 0x0}, ++ {0x41101, 0x0}, ++ {0x41102, 0x0}, ++ {0x41103, 0x0}, ++ {0x41104, 0x0}, ++ {0x41105, 0x0}, ++ {0x41106, 0x0}, ++ {0x41107, 0x0}, ++ {0x41108, 0x0}, ++ {0x41109, 0x0}, ++ {0x4110a, 0x0}, ++ {0x4110b, 0x0}, ++ {0x4110c, 0x0}, ++ {0x4110d, 0x0}, ++ {0x4110e, 0x0}, ++ {0x4110f, 0x0}, ++ {0x41110, 0x0}, ++ {0x41111, 0x0}, ++ {0x41112, 0x0}, ++ {0x41113, 0x0}, ++ {0x41114, 0x0}, ++ {0x41115, 0x0}, ++ {0x41116, 0x0}, ++ {0x41117, 0x0}, ++ {0x41118, 0x0}, ++ {0x41119, 0x0}, ++ {0x4111a, 0x0}, ++ {0x4111b, 0x0}, ++ {0x4111c, 0x0}, ++ {0x4111d, 0x0}, ++ {0x4111e, 0x0}, ++ {0x4111f, 0x0}, ++ {0x41120, 0x0}, ++ {0x41121, 0x0}, ++ {0x41122, 0x0}, ++ {0x41123, 0x0}, ++ {0x41124, 0x0}, ++ {0x41125, 0x0}, ++ {0x41126, 0x0}, ++ {0x41127, 0x0}, ++ {0x41128, 0x0}, ++ {0x41129, 0x0}, ++ {0x4112a, 0x0}, ++ {0x4112b, 0x0}, ++ {0x4112c, 0x0}, ++ {0x4112d, 0x0}, ++ {0x4112e, 0x0}, ++ {0x4112f, 0x0}, ++ {0x41130, 0x0}, ++ {0x41131, 0x0}, ++ {0x41132, 0x0}, ++ {0x41133, 0x0}, ++ {0x41134, 0x0}, ++ {0x41135, 0x0}, ++ {0x41136, 0x0}, ++ {0x41137, 0x0}, ++ {0x41138, 0x0}, ++ {0x41139, 0x0}, ++ {0x4113a, 0x0}, ++ {0x4113b, 0x0}, ++ {0x4113c, 0x0}, ++ {0x4113d, 0x0}, ++ {0x4113e, 0x0}, ++ {0x4113f, 0x0}, ++ {0x41140, 0x0}, ++ {0x41141, 0x0}, ++ {0x41142, 0x0}, ++ {0x41143, 0x0}, ++ {0x41144, 0x0}, ++ {0x41145, 0x0}, ++ {0x41146, 0x0}, ++ {0x41147, 0x0}, ++ {0x41148, 0x0}, ++ {0x41149, 0x0}, ++ {0x4114a, 0x0}, ++ {0x4114b, 0x0}, ++ {0x4114c, 0x0}, ++ {0x4114d, 0x0}, ++ {0x4114e, 0x0}, ++ {0x4114f, 0x0}, ++ {0x41150, 0x0}, ++ {0x41151, 0x0}, ++ {0x41152, 0x0}, ++ {0x41153, 0x0}, ++ {0x41154, 0x0}, ++ {0x41155, 0x0}, ++ {0x41156, 0x0}, ++ {0x41157, 0x0}, ++ {0x41158, 0x0}, ++ {0x41159, 0x0}, ++ {0x4115a, 0x0}, ++ {0x4115b, 0x0}, ++ {0x4115c, 0x0}, ++ {0x4115d, 0x0}, ++ {0x4115e, 0x0}, ++ {0x4115f, 0x0}, ++ {0x41160, 0x0}, ++ {0x41161, 0x0}, ++ {0x41162, 0x0}, ++ {0x41163, 0x0}, ++ {0x41164, 0x0}, ++ {0x41165, 0x0}, ++ {0x41166, 0x0}, ++ {0x41167, 0x0}, ++ {0x41168, 0x0}, ++ {0x41169, 0x0}, ++ {0x4116a, 0x0}, ++ {0x4116b, 0x0}, ++ {0x4116c, 0x0}, ++ {0x4116d, 0x0}, ++ {0x4116e, 0x0}, ++ {0x4116f, 0x0}, ++ {0x41170, 0x0}, ++ {0x41171, 0x0}, ++ {0x41172, 0x0}, ++ {0x41173, 0x0}, ++ {0x41174, 0x0}, ++ {0x41175, 0x0}, ++ {0x41176, 0x0}, ++ {0x41177, 0x0}, ++ {0x41178, 0x0}, ++ {0x41179, 0x0}, ++ {0x4117a, 0x0}, ++ {0x4117b, 0x0}, ++ {0x4117c, 0x0}, ++ {0x4117d, 0x0}, ++ {0x4117e, 0x0}, ++ {0x4117f, 0x0}, ++ {0x41180, 0x0}, ++ {0x41181, 0x0}, ++ {0x41182, 0x0}, ++ {0x41183, 0x0}, ++ {0x41184, 0x0}, ++ {0x41185, 0x0}, ++ {0x41186, 0x0}, ++ {0x41187, 0x0}, ++ {0x41188, 0x0}, ++ {0x41189, 0x0}, ++ {0x4118a, 0x0}, ++ {0x4118b, 0x0}, ++ {0x4118c, 0x0}, ++ {0x4118d, 0x0}, ++ {0x4118e, 0x0}, ++ {0x4118f, 0x0}, ++ {0x41190, 0x0}, ++ {0x41191, 0x0}, ++ {0x41192, 0x0}, ++ {0x41193, 0x0}, ++ {0x41194, 0x0}, ++ {0x41195, 0x0}, ++ {0x41196, 0x0}, ++ {0x41197, 0x0}, ++ {0x41198, 0x0}, ++ {0x41199, 0x0}, ++ {0x4119a, 0x0}, ++ {0x4119b, 0x0}, ++ {0x4119c, 0x0}, ++ {0x4119d, 0x0}, ++ {0x4119e, 0x0}, ++ {0x4119f, 0x0}, ++ {0x411a0, 0x0}, ++ {0x411a1, 0x0}, ++ {0x411a2, 0x0}, ++ {0x411a3, 0x0}, ++ {0x411a4, 0x0}, ++ {0x411a5, 0x0}, ++ {0x411a6, 0x0}, ++ {0x411a7, 0x0}, ++ {0x411a8, 0x0}, ++ {0x411a9, 0x0}, ++ {0x411aa, 0x0}, ++ {0x411ab, 0x0}, ++ {0x411ac, 0x0}, ++ {0x411ad, 0x0}, ++ {0x411ae, 0x0}, ++ {0x411af, 0x0}, ++ {0x411b0, 0x0}, ++ {0x411b1, 0x0}, ++ {0x411b2, 0x0}, ++ {0x411b3, 0x0}, ++ {0x411b4, 0x0}, ++ {0x411b5, 0x0}, ++ {0x411b6, 0x0}, ++ {0x411b7, 0x0}, ++ {0x411b8, 0x0}, ++ {0x411b9, 0x0}, ++ {0x411ba, 0x0}, ++ {0x411bb, 0x0}, ++ {0x411bc, 0x0}, ++ {0x411bd, 0x0}, ++ {0x411be, 0x0}, ++ {0x411bf, 0x0}, ++ {0x411c0, 0x0}, ++ {0x411c1, 0x0}, ++ {0x411c2, 0x0}, ++ {0x411c3, 0x0}, ++ {0x411c4, 0x0}, ++ {0x411c5, 0x0}, ++ {0x411c6, 0x0}, ++ {0x411c7, 0x0}, ++ {0x20015, 0x0}, ++ {0x2004a, 0x0}, ++ {0x2004b, 0x0}, ++ {0x2004c, 0x0}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x0}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20041, 0x0}, ++ {0x20045, 0x0}, ++ {0x10057, 0x0}, ++ {0x11057, 0x0}, ++ {0x12057, 0x0}, ++ {0x13057, 0x0}, ++ {0x1000f, 0x0}, ++ {0x1100f, 0x0}, ++ {0x1200f, 0x0}, ++ {0x1300f, 0x0}, ++ {0x90803, 0x0}, ++ {0x90804, 0x0}, ++ {0x90805, 0x0}, ++ {0x90903, 0x0}, ++ {0x9090b, 0x0}, ++ {0x90811, 0x0}, ++ {0x90812, 0x0}, ++ {0x20072, 0x0}, ++ {0x9080e, 0x0}, ++ {0x20073, 0x0}, ++ {0x9080f, 0x0}, ++ {0x41000, 0x0}, ++ {0x41001, 0x0}, ++ {0x41002, 0x0}, ++ {0x41003, 0x0}, ++ {0x41004, 0x0}, ++ {0x41005, 0x0}, ++ {0x41006, 0x0}, ++ {0x41007, 0x0}, ++ {0x41388, 0x0}, ++ {0x41389, 0x0}, ++ {0x4138a, 0x0}, ++ {0x4138b, 0x0}, ++ {0x4138c, 0x0}, ++ {0x4138d, 0x0}, ++ {0x4138e, 0x0}, ++ {0x4138f, 0x0}, ++ {0x41390, 0x0}, ++ {0x41391, 0x0}, ++ {0x41392, 0x0}, ++ {0x41393, 0x0}, ++ {0x41394, 0x0}, ++ {0x41395, 0x0}, ++ {0x41396, 0x0}, ++ {0x41397, 0x0}, ++ {0x41398, 0x0}, ++ {0x41399, 0x0}, ++ {0x4139a, 0x0}, ++ {0x4139b, 0x0}, ++ {0x4139c, 0x0}, ++ {0x4139d, 0x0}, ++ {0x4139e, 0x0}, ++ {0x4139f, 0x0}, ++ {0x413a0, 0x0}, ++ {0x413a1, 0x0}, ++ {0x413a2, 0x0}, ++ {0x413a3, 0x0}, ++ {0x413a4, 0x0}, ++ {0x413a5, 0x0}, ++ {0x413a6, 0x0}, ++ {0x413a7, 0x0}, ++ {0x413a8, 0x0}, ++ {0x413a9, 0x0}, ++ {0x413aa, 0x0}, ++ {0x413ab, 0x0}, ++ {0x413ac, 0x0}, ++ {0x413ad, 0x0}, ++ {0x413ae, 0x0}, ++ {0x413af, 0x0}, ++ {0x413b0, 0x0}, ++ {0x413b1, 0x0}, ++ {0x413b2, 0x0}, ++ {0x413b3, 0x0}, ++ {0x413b4, 0x0}, ++ {0x413b5, 0x0}, ++ {0x413b6, 0x0}, ++ {0x413b7, 0x0}, ++ {0x413b8, 0x0}, ++ {0x413b9, 0x0}, ++ {0x413ba, 0x0}, ++ {0x413bb, 0x0}, ++ {0x413bc, 0x0}, ++ {0x413bd, 0x0}, ++ {0x413be, 0x0}, ++ {0x413bf, 0x0}, ++ {0x413c0, 0x0}, ++ {0x413c1, 0x0}, ++ {0x413c2, 0x0}, ++ {0x413c3, 0x0}, ++ {0x413c4, 0x0}, ++ {0x413c5, 0x0}, ++ {0x413c6, 0x0}, ++ {0x413c7, 0x0}, ++ {0x413c8, 0x0}, ++ {0x413c9, 0x0}, ++ {0x413ca, 0x0}, ++ {0x413cb, 0x0}, ++ {0x413cc, 0x0}, ++ {0x413cd, 0x0}, ++ {0x413ce, 0x0}, ++ {0x413cf, 0x0}, ++ {0x413d0, 0x0}, ++ {0x413d1, 0x0}, ++ {0x413d2, 0x0}, ++ {0x413d3, 0x0}, ++ {0x413d4, 0x0}, ++ {0x413d5, 0x0}, ++ {0x413d6, 0x0}, ++ {0x413d7, 0x0}, ++ {0x413d8, 0x0}, ++ {0x413d9, 0x0}, ++ {0x413da, 0x0}, ++ {0x413db, 0x0}, ++ {0x413dc, 0x0}, ++ {0x413dd, 0x0}, ++ {0x413de, 0x0}, ++ {0x413df, 0x0}, ++ {0x413e0, 0x0}, ++ {0x413e1, 0x0}, ++ {0x413e2, 0x0}, ++ {0x413e3, 0x0}, ++ {0x413e4, 0x0}, ++ {0x413e5, 0x0}, ++ {0x413e6, 0x0}, ++ {0x413e7, 0x0}, ++ {0x413e8, 0x0}, ++ {0x413e9, 0x0}, ++ {0x413ea, 0x0}, ++ {0x413eb, 0x0}, ++ {0x413ec, 0x0}, ++ {0x413ed, 0x0}, ++ {0x413ee, 0x0}, ++ {0x413ef, 0x0}, ++ {0x413f0, 0x0}, ++ {0x413f1, 0x0}, ++ {0x413f2, 0x0}, ++ {0x413f3, 0x0}, ++ {0x413f4, 0x0}, ++ {0x413f5, 0x0}, ++ {0x413f6, 0x0}, ++ {0x413f7, 0x0}, ++ {0x413f8, 0x0}, ++ {0x413f9, 0x0}, ++ {0x413fa, 0x0}, ++ {0x413fb, 0x0}, ++ {0x413fc, 0x0}, ++ {0x413fd, 0x0}, ++ {0x413fe, 0x0}, ++ {0x413ff, 0x0}, ++ {0x41400, 0x0}, ++ {0x41401, 0x0}, ++ {0x41402, 0x0}, ++ {0x41403, 0x0}, ++ {0x41404, 0x0}, ++ {0x41405, 0x0}, ++ {0x41406, 0x0}, ++ {0x41407, 0x0}, ++ {0x41408, 0x0}, ++ {0x41409, 0x0}, ++ {0x4140a, 0x0}, ++ {0x4140b, 0x0}, ++ {0x4140c, 0x0}, ++ {0x4140d, 0x0}, ++ {0x4140e, 0x0}, ++ {0x4140f, 0x0}, ++ {0x41410, 0x0}, ++ {0x41411, 0x0}, ++ {0x41412, 0x0}, ++ {0x41413, 0x0}, ++ {0x41414, 0x0}, ++ {0x41415, 0x0}, ++ {0x41416, 0x0}, ++ {0x41417, 0x0}, ++ {0x41418, 0x0}, ++ {0x41419, 0x0}, ++ {0x4141a, 0x0}, ++ {0x4141b, 0x0}, ++ {0x4141c, 0x0}, ++ {0x4141d, 0x0}, ++ {0x4141e, 0x0}, ++ {0x4141f, 0x0}, ++ {0x41420, 0x0}, ++ {0x41421, 0x0}, ++ {0x41422, 0x0}, ++ {0x41423, 0x0}, ++ {0x41424, 0x0}, ++ {0x41425, 0x0}, ++ {0x41426, 0x0}, ++ {0x41427, 0x0}, ++ {0x41428, 0x0}, ++ {0x41429, 0x0}, ++ {0x4142a, 0x0}, ++ {0x4142b, 0x0}, ++ {0x4142c, 0x0}, ++ {0x4142d, 0x0}, ++ {0x4142e, 0x0}, ++ {0x4142f, 0x0}, ++ {0x41430, 0x0}, ++ {0x41431, 0x0}, ++ {0x41432, 0x0}, ++ {0x41433, 0x0}, ++ {0x41434, 0x0}, ++ {0x41435, 0x0}, ++ {0x41436, 0x0}, ++ {0x41437, 0x0}, ++ {0x41438, 0x0}, ++ {0x41439, 0x0}, ++ {0x4143a, 0x0}, ++ {0x4143b, 0x0}, ++ {0x4143c, 0x0}, ++ {0x4143d, 0x0}, ++ {0x4143e, 0x0}, ++ {0x4143f, 0x0}, ++ {0x41440, 0x0}, ++ {0x41441, 0x0}, ++ {0x41442, 0x0}, ++ {0x41443, 0x0}, ++ {0x41444, 0x0}, ++ {0x41445, 0x0}, ++ {0x41446, 0x0}, ++ {0x41447, 0x0}, ++ {0x41448, 0x0}, ++ {0x41449, 0x0}, ++ {0x4144a, 0x0}, ++ {0x4144b, 0x0}, ++ {0x4144c, 0x0}, ++ {0x4144d, 0x0}, ++ {0x4144e, 0x0}, ++ {0x4144f, 0x0}, ++ {0x41450, 0x0}, ++ {0x41451, 0x0}, ++ {0x41452, 0x0}, ++ {0x41453, 0x0}, ++ {0x41454, 0x0}, ++ {0x41455, 0x0}, ++ {0x41456, 0x0}, ++ {0x41457, 0x0}, ++ {0x41458, 0x0}, ++ {0x41459, 0x0}, ++ {0x4145a, 0x0}, ++ {0x4145b, 0x0}, ++ {0x4145c, 0x0}, ++ {0x4145d, 0x0}, ++ {0x4145e, 0x0}, ++ {0x4145f, 0x0}, ++ {0x41460, 0x0}, ++ {0x41461, 0x0}, ++ {0x41462, 0x0}, ++ {0x41463, 0x0}, ++ {0x41464, 0x0}, ++ {0x41465, 0x0}, ++ {0x41466, 0x0}, ++ {0x41467, 0x0}, ++ {0x41468, 0x0}, ++ {0x41469, 0x0}, ++ {0x4146a, 0x0}, ++ {0x4146b, 0x0}, ++ {0x4146c, 0x0}, ++ {0x4146d, 0x0}, ++ {0x4146e, 0x0}, ++ {0x4146f, 0x0}, ++ {0x41470, 0x0}, ++ {0x41471, 0x0}, ++ {0x41472, 0x0}, ++ {0x41473, 0x0}, ++ {0x41474, 0x0}, ++ {0x41475, 0x0}, ++ {0x41476, 0x0}, ++ {0x41477, 0x0}, ++ {0x41478, 0x0}, ++ {0x41479, 0x0}, ++ {0x4147a, 0x0}, ++ {0x4147b, 0x0}, ++ {0x4147c, 0x0}, ++ {0x4147d, 0x0}, ++ {0x4147e, 0x0}, ++ {0x4147f, 0x0}, ++ {0x41480, 0x0}, ++ {0x41481, 0x0}, ++ {0x41482, 0x0}, ++ {0x41483, 0x0}, ++ {0x41484, 0x0}, ++ {0x41485, 0x0}, ++ {0x41486, 0x0}, ++ {0x41487, 0x0}, ++ {0x41488, 0x0}, ++ {0x41489, 0x0}, ++ {0x4148a, 0x0}, ++ {0x4148b, 0x0}, ++ {0x4148c, 0x0}, ++ {0x4148d, 0x0}, ++ {0x4148e, 0x0}, ++ {0x4148f, 0x0}, ++ {0x41490, 0x0}, ++ {0x41491, 0x0}, ++ {0x41492, 0x0}, ++ {0x41493, 0x0}, ++ {0x41494, 0x0}, ++ {0x41495, 0x0}, ++ {0x41496, 0x0}, ++ {0x41497, 0x0}, ++ {0x41498, 0x0}, ++ {0x41499, 0x0}, ++ {0x4149a, 0x0}, ++ {0x4149b, 0x0}, ++ {0x4149c, 0x0}, ++ {0x4149d, 0x0}, ++ {0x4149e, 0x0}, ++ {0x4149f, 0x0}, ++ {0x414a0, 0x0}, ++ {0x414a1, 0x0}, ++ {0x414a2, 0x0}, ++ {0x414a3, 0x0}, ++ {0x414a4, 0x0}, ++ {0x414a5, 0x0}, ++ {0x414a6, 0x0}, ++ {0x414a7, 0x0}, ++ {0x414a8, 0x0}, ++ {0x414a9, 0x0}, ++ {0x414aa, 0x0}, ++ {0x414ab, 0x0}, ++ {0x414ac, 0x0}, ++ {0x414ad, 0x0}, ++ {0x414ae, 0x0}, ++ {0x414af, 0x0}, ++ {0x414b0, 0x0}, ++ {0x414b1, 0x0}, ++ {0x414b2, 0x0}, ++ {0x414b3, 0x0}, ++ {0x414b4, 0x0}, ++ {0x414b5, 0x0}, ++ {0x414b6, 0x0}, ++ {0x414b7, 0x0}, ++ {0x414b8, 0x0}, ++ {0x414b9, 0x0}, ++ {0x414ba, 0x0}, ++ {0x414bb, 0x0}, ++ {0x414bc, 0x0}, ++ {0x414bd, 0x0}, ++ {0x414be, 0x0}, ++ {0x414bf, 0x0}, ++ {0x414c0, 0x0}, ++ {0x414c1, 0x0}, ++ {0x414c2, 0x0}, ++ {0x414c3, 0x0}, ++ {0x414c4, 0x0}, ++ {0x414c5, 0x0}, ++ {0x414c6, 0x0}, ++ {0x414c7, 0x0}, ++ {0x414c8, 0x0}, ++ {0x414c9, 0x0}, ++ {0x414ca, 0x0}, ++ {0x414cb, 0x0}, ++ {0x414cc, 0x0}, ++ {0x414cd, 0x0}, ++ {0x414ce, 0x0}, ++ {0x414cf, 0x0}, ++ {0x414d0, 0x0}, ++ {0x414d1, 0x0}, ++ {0x414d2, 0x0}, ++ {0x414d3, 0x0}, ++ {0x414d4, 0x0}, ++ {0x414d5, 0x0}, ++ {0x414d6, 0x0}, ++ {0x414d7, 0x0}, ++ {0x414d8, 0x0}, ++ {0x414d9, 0x0}, ++ {0x414da, 0x0}, ++ {0x414db, 0x0}, ++ {0x414dc, 0x0}, ++ {0x414dd, 0x0}, ++ {0x414de, 0x0}, ++ {0x414df, 0x0}, ++ {0x414e0, 0x0}, ++ {0x414e1, 0x0}, ++ {0x414e2, 0x0}, ++ {0x414e3, 0x0}, ++ {0x414e4, 0x0}, ++ {0x414e5, 0x0}, ++ {0x414e6, 0x0}, ++ {0x414e7, 0x0}, ++ {0x414e8, 0x0}, ++ {0x414e9, 0x0}, ++ {0x414ea, 0x0}, ++ {0x414eb, 0x0}, ++ {0x414ec, 0x0}, ++ {0x414ed, 0x0}, ++ {0x414ee, 0x0}, ++ {0x414ef, 0x0}, ++ {0x414f0, 0x0}, ++ {0x414f1, 0x0}, ++ {0x414f2, 0x0}, ++ {0x414f3, 0x0}, ++ {0x414f4, 0x0}, ++ {0x414f5, 0x0}, ++ {0x414f6, 0x0}, ++ {0x414f7, 0x0}, ++ {0x414f8, 0x0}, ++ {0x414f9, 0x0}, ++ {0x414fa, 0x0}, ++ {0x414fb, 0x0}, ++ {0x414fc, 0x0}, ++ {0x414fd, 0x0}, ++ {0x414fe, 0x0}, ++ {0x414ff, 0x0}, ++ {0x41500, 0x0}, ++ {0x41501, 0x0}, ++ {0x41502, 0x0}, ++ {0x41503, 0x0}, ++ {0x41504, 0x0}, ++ {0x41505, 0x0}, ++ {0x41506, 0x0}, ++ {0x41507, 0x0}, ++ {0x41508, 0x0}, ++ {0x41509, 0x0}, ++ {0x4150a, 0x0}, ++ {0x4150b, 0x0}, ++ {0x4150c, 0x0}, ++ {0x4150d, 0x0}, ++ {0x4150e, 0x0}, ++ {0x4150f, 0x0}, ++ {0x41510, 0x0}, ++ {0x41511, 0x0}, ++ {0x41512, 0x0}, ++ {0x41513, 0x0}, ++ {0x41514, 0x0}, ++ {0x41515, 0x0}, ++ {0x41516, 0x0}, ++ {0x41517, 0x0}, ++ {0x41518, 0x0}, ++ {0x41519, 0x0}, ++ {0x4151a, 0x0}, ++ {0x4151b, 0x0}, ++ {0x4151c, 0x0}, ++ {0x4151d, 0x0}, ++ {0x4151e, 0x0}, ++ {0x4151f, 0x0}, ++ {0x41520, 0x0}, ++ {0x41521, 0x0}, ++ {0x41522, 0x0}, ++ {0x41523, 0x0}, ++ {0x41524, 0x0}, ++ {0x41525, 0x0}, ++ {0x41526, 0x0}, ++ {0x41527, 0x0}, ++ {0x41528, 0x0}, ++ {0x41529, 0x0}, ++ {0x4152a, 0x0}, ++ {0x4152b, 0x0}, ++ {0x4152c, 0x0}, ++ {0x4152d, 0x0}, ++ {0x4152e, 0x0}, ++ {0x4152f, 0x0}, ++ {0x41530, 0x0}, ++ {0x41531, 0x0}, ++ {0x41532, 0x0}, ++ {0x41533, 0x0}, ++ {0x41534, 0x0}, ++ {0x41535, 0x0}, ++ {0x41536, 0x0}, ++ {0x41537, 0x0}, ++ {0x41538, 0x0}, ++ {0x41539, 0x0}, ++ {0x4153a, 0x0}, ++ {0x4153b, 0x0}, ++ {0x4153c, 0x0}, ++ {0x4153d, 0x0}, ++ {0x4153e, 0x0}, ++ {0x4153f, 0x0}, ++ {0x41540, 0x0}, ++ {0x41541, 0x0}, ++ {0x41542, 0x0}, ++ {0x41543, 0x0}, ++ {0x41544, 0x0}, ++ {0x41545, 0x0}, ++ {0x41546, 0x0}, ++ {0x41547, 0x0}, ++ {0x41548, 0x0}, ++ {0x41549, 0x0}, ++ {0x4154a, 0x0}, ++ {0x4154b, 0x0}, ++ {0x4154c, 0x0}, ++ {0x4154d, 0x0}, ++ {0x4154e, 0x0}, ++ {0x4154f, 0x0}, ++ {0x41550, 0x0}, ++ {0x41551, 0x0}, ++ {0x41552, 0x0}, ++ {0x41553, 0x0}, ++ {0x41554, 0x0}, ++ {0x41555, 0x0}, ++ {0x41556, 0x0}, ++ {0x41557, 0x0}, ++ {0x41558, 0x0}, ++ {0x41559, 0x0}, ++ {0x4155a, 0x0}, ++ {0x4155b, 0x0}, ++ {0x4155c, 0x0}, ++ {0x4155d, 0x0}, ++ {0x4155e, 0x0}, ++ {0x4155f, 0x0}, ++ {0x41560, 0x0}, ++ {0x41561, 0x0}, ++ {0x41562, 0x0}, ++ {0x41563, 0x0}, ++ {0x41564, 0x0}, ++ {0x41565, 0x0}, ++ {0x41566, 0x0}, ++ {0x41567, 0x0}, ++ {0x41568, 0x0}, ++ {0x41569, 0x0}, ++ {0x4156a, 0x0}, ++ {0x4156b, 0x0}, ++ {0x4156c, 0x0}, ++ {0x4156d, 0x0}, ++ {0x4156e, 0x0}, ++ {0x4156f, 0x0}, ++ {0x41570, 0x0}, ++ {0x41571, 0x0}, ++ {0x41572, 0x0}, ++ {0x41573, 0x0}, ++ {0x41574, 0x0}, ++ {0x41575, 0x0}, ++ {0x41576, 0x0}, ++ {0x41577, 0x0}, ++ {0x41578, 0x0}, ++ {0x41579, 0x0}, ++ {0x4157a, 0x0}, ++ {0x4157b, 0x0}, ++ {0x4157c, 0x0}, ++ {0x4157d, 0x0}, ++ {0x4157e, 0x0}, ++ {0x4157f, 0x0}, ++ {0x41580, 0x0}, ++ {0x41581, 0x0}, ++ {0x41582, 0x0}, ++ {0x41583, 0x0}, ++ {0x41584, 0x0}, ++ {0x41585, 0x0}, ++ {0x41586, 0x0}, ++ {0x41587, 0x0}, ++ {0x41588, 0x0}, ++ {0x41589, 0x0}, ++ {0x4158a, 0x0}, ++ {0x4158b, 0x0}, ++ {0x4158c, 0x0}, ++ {0x4158d, 0x0}, ++ {0x4158e, 0x0}, ++ {0x4158f, 0x0}, ++ {0x41590, 0x0}, ++ {0x41591, 0x0}, ++ {0x41592, 0x0}, ++ {0x41593, 0x0}, ++ {0x41594, 0x0}, ++ {0x41595, 0x0}, ++ {0x41596, 0x0}, ++ {0x41597, 0x0}, ++ {0x41598, 0x0}, ++ {0x41599, 0x0}, ++ {0x4159a, 0x0}, ++ {0x4159b, 0x0}, ++ {0x4159c, 0x0}, ++ {0x4159d, 0x0}, ++ {0x4159e, 0x0}, ++ {0x4159f, 0x0}, ++ {0x415a0, 0x0}, ++ {0x415a1, 0x0}, ++ {0x415a2, 0x0}, ++ {0x415a3, 0x0}, ++ {0x415a4, 0x0}, ++ {0x415a5, 0x0}, ++ {0x415a6, 0x0}, ++ {0x415a7, 0x0}, ++ {0x415a8, 0x0}, ++ {0x415a9, 0x0}, ++ {0x415aa, 0x0}, ++ {0x415ab, 0x0}, ++ {0x415ac, 0x0}, ++ {0x415ad, 0x0}, ++ {0x415ae, 0x0}, ++ {0x415af, 0x0}, ++ {0x415b0, 0x0}, ++ {0x415b1, 0x0}, ++ {0x415b2, 0x0}, ++ {0x415b3, 0x0}, ++ {0x415b4, 0x0}, ++ {0x415b5, 0x0}, ++ {0x415b6, 0x0}, ++ {0x415b7, 0x0}, ++ {0x415b8, 0x0}, ++ {0x415b9, 0x0}, ++ {0x415ba, 0x0}, ++ {0x415bb, 0x0}, ++ {0x415bc, 0x0}, ++ {0x415bd, 0x0}, ++ {0x415be, 0x0}, ++ {0x415bf, 0x0}, ++ {0x415c0, 0x0}, ++ {0x415c1, 0x0}, ++ {0x415c2, 0x0}, ++ {0x415c3, 0x0}, ++ {0x415c4, 0x0}, ++ {0x415c5, 0x0}, ++ {0x415c6, 0x0}, ++ {0x415c7, 0x0}, ++ {0x415c8, 0x0}, ++ {0x415c9, 0x0}, ++ {0x415ca, 0x0}, ++ {0x415cb, 0x0}, ++ {0x415cc, 0x0}, ++ {0x415cd, 0x0}, ++ {0x415ce, 0x0}, ++ {0x415cf, 0x0}, ++ {0x415d0, 0x0}, ++ {0x415d1, 0x0}, ++ {0x415d2, 0x0}, ++ {0x415d3, 0x0}, ++ {0x415d4, 0x0}, ++ {0x415d5, 0x0}, ++ {0x415d6, 0x0}, ++ {0x415d7, 0x0}, ++ {0x415d8, 0x0}, ++ {0x415d9, 0x0}, ++ {0x415da, 0x0}, ++ {0x415db, 0x0}, ++ {0x415dc, 0x0}, ++ {0x415dd, 0x0}, ++ {0x415de, 0x0}, ++ {0x415df, 0x0}, ++ {0x415e0, 0x0}, ++ {0x415e1, 0x0}, ++ {0x415e2, 0x0}, ++ {0x415e3, 0x0}, ++ {0x415e4, 0x0}, ++ {0x415e5, 0x0}, ++ {0x415e6, 0x0}, ++ {0x415e7, 0x0}, ++ {0x415e8, 0x0}, ++ {0x415e9, 0x0}, ++ {0x415ea, 0x0}, ++ {0x415eb, 0x0}, ++ {0x415ec, 0x0}, ++ {0x415ed, 0x0}, ++ {0x415ee, 0x0}, ++ {0x415ef, 0x0}, ++ {0x415f0, 0x0}, ++ {0x415f1, 0x0}, ++ {0x415f2, 0x0}, ++ {0x415f3, 0x0}, ++ {0x415f4, 0x0}, ++ {0x415f5, 0x0}, ++ {0x415f6, 0x0}, ++ {0x415f7, 0x0}, ++ {0x415f8, 0x0}, ++ {0x415f9, 0x0}, ++ {0x415fa, 0x0}, ++ {0x415fb, 0x0}, ++ {0x415fc, 0x0}, ++ {0x415fd, 0x0}, ++ {0x415fe, 0x0}, ++ {0x415ff, 0x0}, ++ {0x41600, 0x0}, ++ {0x41601, 0x0}, ++ {0x41602, 0x0}, ++ {0x41603, 0x0}, ++ {0x41604, 0x0}, ++ {0x41605, 0x0}, ++ {0x41606, 0x0}, ++ {0x41607, 0x0}, ++ {0x41608, 0x0}, ++ {0x41609, 0x0}, ++ {0x4160a, 0x0}, ++ {0x4160b, 0x0}, ++ {0x4160c, 0x0}, ++ {0x4160d, 0x0}, ++ {0x4160e, 0x0}, ++ {0x4160f, 0x0}, ++ {0x41610, 0x0}, ++ {0x41611, 0x0}, ++ {0x41612, 0x0}, ++ {0x41613, 0x0}, ++ {0x41614, 0x0}, ++ {0x41615, 0x0}, ++ {0x41616, 0x0}, ++ {0x41617, 0x0}, ++ {0x41618, 0x0}, ++ {0x41619, 0x0}, ++ {0x4161a, 0x0}, ++ {0x4161b, 0x0}, ++ {0x4161c, 0x0}, ++ {0x4161d, 0x0}, ++ {0x4161e, 0x0}, ++ {0x4161f, 0x0}, ++ {0x41620, 0x0}, ++ {0x41621, 0x0}, ++ {0x41622, 0x0}, ++ {0x41623, 0x0}, ++ {0x41624, 0x0}, ++ {0x41625, 0x0}, ++ {0x41626, 0x0}, ++ {0x41627, 0x0}, ++ {0x41628, 0x0}, ++ {0x41629, 0x0}, ++ {0x4162a, 0x0}, ++ {0x4162b, 0x0}, ++ {0x4162c, 0x0}, ++ {0x4162d, 0x0}, ++ {0x4162e, 0x0}, ++ {0x4162f, 0x0}, ++ {0x41630, 0x0}, ++ {0x41631, 0x0}, ++ {0x41632, 0x0}, ++ {0x41633, 0x0}, ++ {0x41634, 0x0}, ++ {0x41635, 0x0}, ++ {0x41636, 0x0}, ++ {0x41637, 0x0}, ++ {0x41638, 0x0}, ++ {0x41639, 0x0}, ++ {0x4163a, 0x0}, ++ {0x4163b, 0x0}, ++ {0x4163c, 0x0}, ++ {0x4163d, 0x0}, ++ {0x4163e, 0x0}, ++ {0x4163f, 0x0}, ++ {0x41640, 0x0}, ++ {0x41641, 0x0}, ++ {0x41642, 0x0}, ++ {0x41643, 0x0}, ++ {0x41644, 0x0}, ++ {0x41645, 0x0}, ++ {0x41646, 0x0}, ++ {0x41647, 0x0}, ++ {0x41648, 0x0}, ++ {0x41649, 0x0}, ++ {0x4164a, 0x0}, ++ {0x4164b, 0x0}, ++ {0x4164c, 0x0}, ++ {0x4164d, 0x0}, ++ {0x4164e, 0x0}, ++ {0x4164f, 0x0}, ++ {0x41650, 0x0}, ++ {0x41651, 0x0}, ++ {0x41652, 0x0}, ++ {0x41653, 0x0}, ++ {0x41654, 0x0}, ++ {0x41655, 0x0}, ++ {0x41656, 0x0}, ++ {0x41657, 0x0}, ++ {0x41658, 0x0}, ++ {0x41659, 0x0}, ++ {0x4165a, 0x0}, ++ {0x4165b, 0x0}, ++ {0x4165c, 0x0}, ++ {0x4165d, 0x0}, ++ {0x4165e, 0x0}, ++ {0x4165f, 0x0}, ++ {0x41660, 0x0}, ++ {0x41661, 0x0}, ++ {0x41662, 0x0}, ++ {0x41663, 0x0}, ++ {0x41664, 0x0}, ++ {0x41665, 0x0}, ++ {0x41666, 0x0}, ++ {0x41667, 0x0}, ++ {0x41668, 0x0}, ++ {0x41669, 0x0}, ++ {0x4166a, 0x0}, ++ {0x4166b, 0x0}, ++ {0x4166c, 0x0}, ++ {0x4166d, 0x0}, ++ {0x4166e, 0x0}, ++ {0x4166f, 0x0}, ++ {0x41670, 0x0}, ++ {0x41671, 0x0}, ++ {0x41672, 0x0}, ++ {0x41673, 0x0}, ++ {0x41674, 0x0}, ++ {0x41675, 0x0}, ++ {0x41676, 0x0}, ++ {0x41677, 0x0}, ++ {0x41678, 0x0}, ++ {0x41679, 0x0}, ++ {0x4167a, 0x0}, ++ {0x4167b, 0x0}, ++ {0x4167c, 0x0}, ++ {0x4167d, 0x0}, ++ {0x4167e, 0x0}, ++ {0x4167f, 0x0}, ++ {0x41680, 0x0}, ++ {0x41681, 0x0}, ++ {0x41682, 0x0}, ++ {0x41683, 0x0}, ++ {0x41684, 0x0}, ++ {0x41685, 0x0}, ++ {0x41686, 0x0}, ++ {0x41687, 0x0}, ++ {0x41688, 0x0}, ++ {0x41689, 0x0}, ++ {0x4168a, 0x0}, ++ {0x4168b, 0x0}, ++ {0x4168c, 0x0}, ++ {0x4168d, 0x0}, ++ {0x4168e, 0x0}, ++ {0x4168f, 0x0}, ++ {0x41690, 0x0}, ++ {0x41691, 0x0}, ++ {0x41692, 0x0}, ++ {0x41693, 0x0}, ++ {0x41694, 0x0}, ++ {0x41695, 0x0}, ++ {0x41696, 0x0}, ++ {0x41697, 0x0}, ++ {0x41698, 0x0}, ++ {0x41699, 0x0}, ++ {0x4169a, 0x0}, ++ {0x4169b, 0x0}, ++ {0x4169c, 0x0}, ++ {0x4169d, 0x0}, ++ {0x4169e, 0x0}, ++ {0x4169f, 0x0}, ++ {0x416a0, 0x0}, ++ {0x416a1, 0x0}, ++ {0x416a2, 0x0}, ++ {0x416a3, 0x0}, ++ {0x416a4, 0x0}, ++ {0x416a5, 0x0}, ++ {0x416a6, 0x0}, ++ {0x416a7, 0x0}, ++ {0x416a8, 0x0}, ++ {0x416a9, 0x0}, ++ {0x416aa, 0x0}, ++ {0x416ab, 0x0}, ++ {0x416ac, 0x0}, ++ {0x416ad, 0x0}, ++ {0x416ae, 0x0}, ++ {0x416af, 0x0}, ++ {0x416b0, 0x0}, ++ {0x416b1, 0x0}, ++ {0x416b2, 0x0}, ++ {0x416b3, 0x0}, ++ {0x416b4, 0x0}, ++ {0x416b5, 0x0}, ++ {0x416b6, 0x0}, ++ {0x416b7, 0x0}, ++ {0x416b8, 0x0}, ++ {0x416b9, 0x0}, ++ {0x416ba, 0x0}, ++ {0x416bb, 0x0}, ++ {0x416bc, 0x0}, ++ {0x416bd, 0x0}, ++ {0x416be, 0x0}, ++ {0x416bf, 0x0}, ++ {0x416c0, 0x0}, ++ {0x416c1, 0x0}, ++ {0x416c2, 0x0}, ++ {0x416c3, 0x0}, ++ {0x416c4, 0x0}, ++ {0x416c5, 0x0}, ++ {0x416c6, 0x0}, ++ {0x416c7, 0x0}, ++ {0x416c8, 0x0}, ++ {0x416c9, 0x0}, ++ {0x416ca, 0x0}, ++ {0x416cb, 0x0}, ++ {0x416cc, 0x0}, ++ {0x416cd, 0x0}, ++ {0x416ce, 0x0}, ++ {0x416cf, 0x0}, ++ {0x416d0, 0x0}, ++ {0x416d1, 0x0}, ++ {0x416d2, 0x0}, ++ {0x416d3, 0x0}, ++ {0x416d4, 0x0}, ++ {0x416d5, 0x0}, ++ {0x416d6, 0x0}, ++ {0x416d7, 0x0}, ++ {0x416d8, 0x0}, ++ {0x416d9, 0x0}, ++ {0x416da, 0x0}, ++ {0x416db, 0x0}, ++ {0x416dc, 0x0}, ++ {0x416dd, 0x0}, ++ {0x416de, 0x0}, ++ {0x416df, 0x0}, ++ {0x416e0, 0x0}, ++ {0x416e1, 0x0}, ++ {0x416e2, 0x0}, ++ {0x416e3, 0x0}, ++ {0x416e4, 0x0}, ++ {0x416e5, 0x0}, ++ {0x416e6, 0x0}, ++ {0x416e7, 0x0}, ++ {0x416e8, 0x0}, ++ {0x416e9, 0x0}, ++ {0x416ea, 0x0}, ++ {0x416eb, 0x0}, ++ {0x416ec, 0x0}, ++ {0x416ed, 0x0}, ++ {0x416ee, 0x0}, ++ {0x416ef, 0x0}, ++ {0x416f0, 0x0}, ++ {0x416f1, 0x0}, ++ {0x416f2, 0x0}, ++ {0x416f3, 0x0}, ++ {0x416f4, 0x0}, ++ {0x416f5, 0x0}, ++ {0x416f6, 0x0}, ++ {0x416f7, 0x0}, ++ {0x416f8, 0x0}, ++ {0x416f9, 0x0}, ++ {0x416fa, 0x0}, ++ {0x416fb, 0x0}, ++ {0x416fc, 0x0}, ++ {0x416fd, 0x0}, ++ {0x416fe, 0x0}, ++ {0x416ff, 0x0}, ++ {0x41700, 0x0}, ++ {0x41701, 0x0}, ++ {0x41702, 0x0}, ++ {0x41703, 0x0}, ++ {0x41704, 0x0}, ++ {0x41705, 0x0}, ++ {0x41706, 0x0}, ++ {0x41707, 0x0}, ++ {0x41708, 0x0}, ++ {0x41709, 0x0}, ++ {0x4170a, 0x0}, ++ {0x4170b, 0x0}, ++ {0x4170c, 0x0}, ++ {0x4170d, 0x0}, ++ {0x4170e, 0x0}, ++ {0x4170f, 0x0}, ++ {0x41710, 0x0}, ++ {0x41711, 0x0}, ++ {0x41712, 0x0}, ++ {0x41713, 0x0}, ++ {0x41714, 0x0}, ++ {0x41715, 0x0}, ++ {0x41716, 0x0}, ++ {0x41717, 0x0}, ++ {0x41718, 0x0}, ++ {0x41719, 0x0}, ++ {0x4171a, 0x0}, ++ {0x4171b, 0x0}, ++ {0x4171c, 0x0}, ++ {0x4171d, 0x0}, ++ {0x4171e, 0x0}, ++ {0x4171f, 0x0}, ++ {0x41720, 0x0}, ++ {0x41721, 0x0}, ++ {0x41722, 0x0}, ++ {0x41723, 0x0}, ++ {0x41724, 0x0}, ++ {0x41725, 0x0}, ++ {0x41726, 0x0}, ++ {0x41727, 0x0}, ++ {0x41728, 0x0}, ++ {0x41729, 0x0}, ++ {0x4172a, 0x0}, ++ {0x4172b, 0x0}, ++ {0x4172c, 0x0}, ++ {0x4172d, 0x0}, ++ {0x4172e, 0x0}, ++ {0x4172f, 0x0}, ++ {0x41730, 0x0}, ++ {0x41731, 0x0}, ++ {0x41732, 0x0}, ++ {0x41733, 0x0}, ++ {0x41734, 0x0}, ++ {0x41735, 0x0}, ++ {0x41736, 0x0}, ++ {0x41737, 0x0}, ++ {0x41738, 0x0}, ++ {0x41739, 0x0}, ++ {0x4173a, 0x0}, ++ {0x4173b, 0x0}, ++ {0x4173c, 0x0}, ++ {0x4173d, 0x0}, ++ {0x4173e, 0x0}, ++ {0x4173f, 0x0}, ++ {0x41740, 0x0}, ++ {0x41741, 0x0}, ++ {0x41742, 0x0}, ++ {0x41743, 0x0}, ++ {0x41744, 0x0}, ++ {0x41745, 0x0}, ++ {0x41746, 0x0}, ++ {0x41747, 0x0}, ++ {0x41748, 0x0}, ++ {0x41749, 0x0}, ++ {0x4174a, 0x0}, ++ {0x4174b, 0x0}, ++ {0x4174c, 0x0}, ++ {0x4174d, 0x0}, ++ {0x4174e, 0x0}, ++ {0x4174f, 0x0}, ++ {0x41750, 0x0}, ++ {0x41751, 0x0}, ++ {0x41752, 0x0}, ++ {0x41753, 0x0}, ++ {0x41754, 0x0}, ++ {0x41755, 0x0}, ++ {0x41756, 0x0}, ++ {0x41757, 0x0}, ++ {0x41758, 0x0}, ++ {0x41759, 0x0}, ++ {0x4175a, 0x0}, ++ {0x4175b, 0x0}, ++ {0x4175c, 0x0}, ++ {0x4175d, 0x0}, ++ {0x4175e, 0x0}, ++ {0x4175f, 0x0}, ++ {0x41760, 0x0}, ++ {0x41761, 0x0}, ++ {0x41762, 0x0}, ++ {0x41763, 0x0}, ++ {0x41764, 0x0}, ++ {0x41765, 0x0}, ++ {0x41766, 0x0}, ++ {0x41767, 0x0}, ++ {0x41768, 0x0}, ++ {0x41769, 0x0}, ++ {0x4176a, 0x0}, ++ {0x4176b, 0x0}, ++ {0x4176c, 0x0}, ++ {0x4176d, 0x0}, ++ {0x4176e, 0x0}, ++ {0x4176f, 0x0}, ++ {0x41770, 0x0}, ++ {0x41771, 0x0}, ++ {0x41772, 0x0}, ++ {0x41773, 0x0}, ++ {0x41774, 0x0}, ++ {0x41775, 0x0}, ++ {0x41776, 0x0}, ++ {0x41777, 0x0}, ++ {0x41778, 0x0}, ++ {0x41779, 0x0}, ++ {0x4177a, 0x0}, ++ {0x4177b, 0x0}, ++ {0x4177c, 0x0}, ++ {0x4177d, 0x0}, ++ {0x4177e, 0x0}, ++ {0x4177f, 0x0}, ++ {0x41780, 0x0}, ++ {0x41781, 0x0}, ++ {0x41782, 0x0}, ++ {0x41783, 0x0}, ++ {0x41784, 0x0}, ++ {0x41785, 0x0}, ++ {0x41786, 0x0}, ++ {0x41787, 0x0}, ++ {0x41788, 0x0}, ++ {0x41789, 0x0}, ++ {0x4178a, 0x0}, ++ {0x4178b, 0x0}, ++ {0x4178c, 0x0}, ++ {0x4178d, 0x0}, ++ {0x4178e, 0x0}, ++ {0x4178f, 0x0}, ++ {0x41790, 0x0}, ++ {0x41791, 0x0}, ++ {0x41792, 0x0}, ++ {0x41793, 0x0}, ++ {0x41794, 0x0}, ++ {0x41795, 0x0}, ++ {0x41796, 0x0}, ++ {0x41797, 0x0}, ++ {0x41798, 0x0}, ++ {0x41799, 0x0}, ++ {0x4179a, 0x0}, ++ {0x4179b, 0x0}, ++ {0x4179c, 0x0}, ++ {0x4179d, 0x0}, ++ {0x4179e, 0x0}, ++ {0x4179f, 0x0}, ++ {0x417a0, 0x0}, ++ {0x417a1, 0x0}, ++ {0x417a2, 0x0}, ++ {0x417a3, 0x0}, ++ {0x417a4, 0x0}, ++ {0x417a5, 0x0}, ++ {0x417a6, 0x0}, ++ {0x417a7, 0x0}, ++ {0x417a8, 0x0}, ++ {0x417a9, 0x0}, ++ {0x417aa, 0x0}, ++ {0x417ab, 0x0}, ++ {0x417ac, 0x0}, ++ {0x417ad, 0x0}, ++ {0x417ae, 0x0}, ++ {0x417af, 0x0}, ++ {0x417b0, 0x0}, ++ {0x417b1, 0x0}, ++ {0x417b2, 0x0}, ++ {0x417b3, 0x0}, ++ {0x417b4, 0x0}, ++ {0x417b5, 0x0}, ++ {0x417b6, 0x0}, ++ {0x417b7, 0x0}, ++ {0x417b8, 0x0}, ++ {0x417b9, 0x0}, ++ {0x417ba, 0x0}, ++ {0x417bb, 0x0}, ++ {0x417bc, 0x0}, ++ {0x417bd, 0x0}, ++ {0x417be, 0x0}, ++ {0x417bf, 0x0}, ++ {0x417c0, 0x0}, ++ {0x417c1, 0x0}, ++ {0x417c2, 0x0}, ++ {0x417c3, 0x0}, ++ {0x417c4, 0x0}, ++ {0x417c5, 0x0}, ++ {0x417c6, 0x0}, ++ {0x417c7, 0x0}, ++ {0x417c8, 0x0}, ++ {0x417c9, 0x0}, ++ {0x417ca, 0x0}, ++ {0x417cb, 0x0}, ++ {0x417cc, 0x0}, ++ {0x417cd, 0x0}, ++ {0x417ce, 0x0}, ++ {0x417cf, 0x0}, ++ {0x417d0, 0x0}, ++ {0x417d1, 0x0}, ++ {0x417d2, 0x0}, ++ {0x417d3, 0x0}, ++ {0x417d4, 0x0}, ++ {0x417d5, 0x0}, ++ {0x417d6, 0x0}, ++ {0x417d7, 0x0}, ++ {0x417d8, 0x0}, ++ {0x417d9, 0x0}, ++ {0x417da, 0x0}, ++ {0x417db, 0x0}, ++ {0x417dc, 0x0}, ++ {0x417dd, 0x0}, ++ {0x417de, 0x0}, ++ {0x417df, 0x0}, ++ {0x417e0, 0x0}, ++ {0x417e1, 0x0}, ++ {0x417e2, 0x0}, ++ {0x417e3, 0x0}, ++ {0x417e4, 0x0}, ++ {0x417e5, 0x0}, ++ {0x417e6, 0x0}, ++ {0x417e7, 0x0}, ++ {0x417e8, 0x0}, ++ {0x417e9, 0x0}, ++ {0x417ea, 0x0}, ++ {0x417eb, 0x0}, ++ {0x417ec, 0x0}, ++ {0x417ed, 0x0}, ++ {0x417ee, 0x0}, ++ {0x417ef, 0x0}, ++ {0x417f0, 0x0}, ++ {0x417f1, 0x0}, ++ {0x417f2, 0x0}, ++ {0x417f3, 0x0}, ++ {0x417f4, 0x0}, ++ {0x417f5, 0x0}, ++ {0x417f6, 0x0}, ++ {0x417f7, 0x0}, ++ {0x417f8, 0x0}, ++ {0x417f9, 0x0}, ++ {0x417fa, 0x0}, ++ {0x417fb, 0x0}, ++ {0x417fc, 0x0}, ++ {0x417fd, 0x0}, ++ {0x417fe, 0x0}, ++ {0x417ff, 0x0}, ++ {0x41800, 0x0}, ++ {0x41801, 0x0}, ++ {0x41802, 0x0}, ++ {0x41803, 0x0}, ++ {0x41804, 0x0}, ++ {0x41805, 0x0}, ++ {0x41806, 0x0}, ++ {0x41807, 0x0}, ++ {0x41808, 0x0}, ++ {0x41809, 0x0}, ++ {0x4180a, 0x0}, ++ {0x4180b, 0x0}, ++ {0x4180c, 0x0}, ++ {0x4180d, 0x0}, ++ {0x4180e, 0x0}, ++ {0x4180f, 0x0}, ++ {0x41810, 0x0}, ++ {0x41811, 0x0}, ++ {0x41812, 0x0}, ++ {0x41813, 0x0}, ++ {0x41814, 0x0}, ++ {0x41815, 0x0}, ++ {0x41816, 0x0}, ++ {0x41817, 0x0}, ++ {0x41818, 0x0}, ++ {0x41819, 0x0}, ++ {0x4181a, 0x0}, ++ {0x4181b, 0x0}, ++ {0x4181c, 0x0}, ++ {0x4181d, 0x0}, ++ {0x4181e, 0x0}, ++ {0x4181f, 0x0}, ++ {0x41820, 0x0}, ++ {0x41821, 0x0}, ++ {0x41822, 0x0}, ++ {0x41823, 0x0}, ++ {0x41824, 0x0}, ++ {0x41825, 0x0}, ++ {0x41826, 0x0}, ++ {0x41827, 0x0}, ++ {0x41828, 0x0}, ++ {0x41829, 0x0}, ++ {0x4182a, 0x0}, ++ {0x4182b, 0x0}, ++ {0x4182c, 0x0}, ++ {0x4182d, 0x0}, ++ {0x4182e, 0x0}, ++ {0x4182f, 0x0}, ++ {0x41830, 0x0}, ++ {0x41831, 0x0}, ++ {0x41832, 0x0}, ++ {0x41833, 0x0}, ++ {0x41834, 0x0}, ++ {0x41835, 0x0}, ++ {0x41836, 0x0}, ++ {0x41837, 0x0}, ++ {0x41838, 0x0}, ++ {0x41839, 0x0}, ++ {0x4183a, 0x0}, ++ {0x4183b, 0x0}, ++ {0x4183c, 0x0}, ++ {0x4183d, 0x0}, ++ {0x4183e, 0x0}, ++ {0x4183f, 0x0}, ++ {0x41840, 0x0}, ++ {0x41841, 0x0}, ++ {0x41842, 0x0}, ++ {0x41843, 0x0}, ++ {0x41844, 0x0}, ++ {0x41845, 0x0}, ++ {0x41846, 0x0}, ++ {0x41847, 0x0}, ++ {0x41848, 0x0}, ++ {0x41849, 0x0}, ++ {0x4184a, 0x0}, ++ {0x4184b, 0x0}, ++ {0x4184c, 0x0}, ++ {0x4184d, 0x0}, ++ {0x4184e, 0x0}, ++ {0x4184f, 0x0}, ++ {0x41850, 0x0}, ++ {0x41851, 0x0}, ++ {0x41852, 0x0}, ++ {0x41853, 0x0}, ++ {0x41854, 0x0}, ++ {0x41855, 0x0}, ++ {0x41856, 0x0}, ++ {0x41857, 0x0}, ++ {0x41858, 0x0}, ++ {0x41859, 0x0}, ++ {0x4185a, 0x0}, ++ {0x4185b, 0x0}, ++ {0x4185c, 0x0}, ++ {0x4185d, 0x0}, ++ {0x4185e, 0x0}, ++ {0x4185f, 0x0}, ++ {0x41860, 0x0}, ++ {0x41861, 0x0}, ++ {0x41862, 0x0}, ++ {0x41863, 0x0}, ++ {0x41864, 0x0}, ++ {0x41865, 0x0}, ++ {0x41866, 0x0}, ++ {0x41867, 0x0}, ++ {0x41868, 0x0}, ++ {0x41869, 0x0}, ++ {0x4186a, 0x0}, ++ {0x4186b, 0x0}, ++ {0x4186c, 0x0}, ++ {0x4186d, 0x0}, ++ {0x4186e, 0x0}, ++ {0x4186f, 0x0}, ++ {0x41870, 0x0}, ++ {0x41871, 0x0}, ++ {0x41872, 0x0}, ++ {0x41873, 0x0}, ++ {0x41874, 0x0}, ++ {0x41875, 0x0}, ++ {0x41876, 0x0}, ++ {0x41877, 0x0}, ++ {0x41878, 0x0}, ++ {0x41879, 0x0}, ++ {0x4187a, 0x0}, ++ {0x4187b, 0x0}, ++ {0x4187c, 0x0}, ++ {0x4187d, 0x0}, ++ {0x4187e, 0x0}, ++ {0x4187f, 0x0}, ++ {0x41880, 0x0}, ++ {0x41881, 0x0}, ++ {0x41882, 0x0}, ++ {0x41883, 0x0}, ++ {0x41884, 0x0}, ++ {0x41885, 0x0}, ++ {0x41886, 0x0}, ++ {0x41887, 0x0}, ++ {0x41888, 0x0}, ++ {0x41889, 0x0}, ++ {0x4188a, 0x0}, ++ {0x4188b, 0x0}, ++ {0x4188c, 0x0}, ++ {0x4188d, 0x0}, ++ {0x4188e, 0x0}, ++ {0x4188f, 0x0}, ++ {0x41890, 0x0}, ++ {0x41891, 0x0}, ++ {0x41892, 0x0}, ++ {0x41893, 0x0}, ++ {0x41894, 0x0}, ++ {0x41895, 0x0}, ++ {0x41896, 0x0}, ++ {0x41897, 0x0}, ++ {0x41898, 0x0}, ++ {0x41899, 0x0}, ++ {0x4189a, 0x0}, ++ {0x4189b, 0x0}, ++ {0x4189c, 0x0}, ++ {0x4189d, 0x0}, ++ {0x4189e, 0x0}, ++ {0x4189f, 0x0}, ++ {0x418a0, 0x0}, ++ {0x418a1, 0x0}, ++ {0x418a2, 0x0}, ++ {0x418a3, 0x0}, ++ {0x418a4, 0x0}, ++ {0x418a5, 0x0}, ++ {0x418a6, 0x0}, ++ {0x418a7, 0x0}, ++ {0x418a8, 0x0}, ++ {0x418a9, 0x0}, ++ {0x418aa, 0x0}, ++ {0x418ab, 0x0}, ++ {0x418ac, 0x0}, ++ {0x418ad, 0x0}, ++ {0x418ae, 0x0}, ++ {0x418af, 0x0}, ++ {0x418b0, 0x0}, ++ {0x418b1, 0x0}, ++ {0x418b2, 0x0}, ++ {0x418b3, 0x0}, ++ {0x418b4, 0x0}, ++ {0x418b5, 0x0}, ++ {0x418b6, 0x0}, ++ {0x418b7, 0x0}, ++ {0x418b8, 0x0}, ++ {0x418b9, 0x0}, ++ {0x418ba, 0x0}, ++ {0x418bb, 0x0}, ++ {0x418bc, 0x0}, ++ {0x418bd, 0x0}, ++ {0x418be, 0x0}, ++ {0x418bf, 0x0}, ++ {0x418c0, 0x0}, ++ {0x418c1, 0x0}, ++ {0x418c2, 0x0}, ++ {0x418c3, 0x0}, ++ {0x418c4, 0x0}, ++ {0x418c5, 0x0}, ++ {0x418c6, 0x0}, ++ {0x418c7, 0x0}, ++ {0x418c8, 0x0}, ++ {0x418c9, 0x0}, ++ {0x418ca, 0x0}, ++ {0x418cb, 0x0}, ++ {0x418cc, 0x0}, ++ {0x418cd, 0x0}, ++ {0x418ce, 0x0}, ++ {0x418cf, 0x0}, ++ {0x418d0, 0x0}, ++ {0x418d1, 0x0}, ++ {0x418d2, 0x0}, ++ {0x418d3, 0x0}, ++ {0x418d4, 0x0}, ++ {0x418d5, 0x0}, ++ {0x418d6, 0x0}, ++ {0x418d7, 0x0}, ++ {0x418d8, 0x0}, ++ {0x418d9, 0x0}, ++ {0x418da, 0x0}, ++ {0x418db, 0x0}, ++ {0x418dc, 0x0}, ++ {0x418dd, 0x0}, ++ {0x418de, 0x0}, ++ {0x418df, 0x0}, ++ {0x418e0, 0x0}, ++ {0x418e1, 0x0}, ++ {0x418e2, 0x0}, ++ {0x418e3, 0x0}, ++ {0x418e4, 0x0}, ++ {0x418e5, 0x0}, ++ {0x418e6, 0x0}, ++ {0x418e7, 0x0}, ++ {0x418e8, 0x0}, ++ {0x418e9, 0x0}, ++ {0x418ea, 0x0}, ++ {0x418eb, 0x0}, ++ {0x418ec, 0x0}, ++ {0x418ed, 0x0}, ++ {0x418ee, 0x0}, ++ {0x418ef, 0x0}, ++ {0x418f0, 0x0}, ++ {0x418f1, 0x0}, ++ {0x418f2, 0x0}, ++ {0x418f3, 0x0}, ++ {0x418f4, 0x0}, ++ {0x418f5, 0x0}, ++ {0x418f6, 0x0}, ++ {0x418f7, 0x0}, ++ {0x418f8, 0x0}, ++ {0x418f9, 0x0}, ++ {0x418fa, 0x0}, ++ {0x418fb, 0x0}, ++ {0x418fc, 0x0}, ++ {0x418fd, 0x0}, ++ {0x418fe, 0x0}, ++ {0x418ff, 0x0}, ++ {0x41900, 0x0}, ++ {0x41901, 0x0}, ++ {0x41902, 0x0}, ++ {0x41903, 0x0}, ++ {0x41904, 0x0}, ++ {0x41905, 0x0}, ++ {0x41906, 0x0}, ++ {0x41907, 0x0}, ++ {0x41908, 0x0}, ++ {0x41909, 0x0}, ++ {0x4190a, 0x0}, ++ {0x4190b, 0x0}, ++ {0x4190c, 0x0}, ++ {0x4190d, 0x0}, ++ {0x4190e, 0x0}, ++ {0x4190f, 0x0}, ++ {0x41910, 0x0}, ++ {0x41911, 0x0}, ++ {0x41912, 0x0}, ++ {0x41913, 0x0}, ++ {0x41914, 0x0}, ++ {0x41915, 0x0}, ++ {0x41916, 0x0}, ++ {0x41917, 0x0}, ++ {0x41918, 0x0}, ++ {0x41919, 0x0}, ++ {0x4191a, 0x0}, ++ {0x4191b, 0x0}, ++ {0x4191c, 0x0}, ++ {0x4191d, 0x0}, ++ {0x4191e, 0x0}, ++ {0x4191f, 0x0}, ++ {0x41920, 0x0}, ++ {0x41921, 0x0}, ++ {0x41922, 0x0}, ++ {0x41923, 0x0}, ++ {0x41924, 0x0}, ++ {0x41925, 0x0}, ++ {0x41926, 0x0}, ++ {0x41927, 0x0}, ++ {0x41928, 0x0}, ++ {0x41929, 0x0}, ++ {0x4192a, 0x0}, ++ {0x4192b, 0x0}, ++ {0x4192c, 0x0}, ++ {0x4192d, 0x0}, ++ {0x4192e, 0x0}, ++ {0x4192f, 0x0}, ++ {0x41930, 0x0}, ++ {0x41931, 0x0}, ++ {0x41932, 0x0}, ++ {0x41933, 0x0}, ++ {0x41934, 0x0}, ++ {0x41935, 0x0}, ++ {0x41936, 0x0}, ++ {0x41937, 0x0}, ++ {0x41938, 0x0}, ++ {0x41939, 0x0}, ++ {0x4193a, 0x0}, ++ {0x4193b, 0x0}, ++ {0x4193c, 0x0}, ++ {0x4193d, 0x0}, ++ {0x4193e, 0x0}, ++ {0x4193f, 0x0}, ++ {0x41940, 0x0}, ++ {0x41941, 0x0}, ++ {0x41942, 0x0}, ++ {0x41943, 0x0}, ++ {0x41944, 0x0}, ++ {0x41945, 0x0}, ++ {0x41946, 0x0}, ++ {0x41947, 0x0}, ++ {0x41948, 0x0}, ++ {0x41949, 0x0}, ++ {0x4194a, 0x0}, ++ {0x4194b, 0x0}, ++ {0x4194c, 0x0}, ++ {0x4194d, 0x0}, ++ {0x4194e, 0x0}, ++ {0x4194f, 0x0}, ++ {0x41950, 0x0}, ++ {0x41951, 0x0}, ++ {0x41952, 0x0}, ++ {0x41953, 0x0}, ++ {0x41954, 0x0}, ++ {0x41955, 0x0}, ++ {0x41956, 0x0}, ++ {0x41957, 0x0}, ++ {0x41958, 0x0}, ++ {0x41959, 0x0}, ++ {0x4195a, 0x0}, ++ {0x4195b, 0x0}, ++ {0x4195c, 0x0}, ++ {0x4195d, 0x0}, ++ {0x4195e, 0x0}, ++ {0x4195f, 0x0}, ++ {0x41960, 0x0}, ++ {0x41961, 0x0}, ++ {0x41962, 0x0}, ++ {0x41963, 0x0}, ++ {0x41964, 0x0}, ++ {0x41965, 0x0}, ++ {0x41966, 0x0}, ++ {0x41967, 0x0}, ++ {0x41968, 0x0}, ++ {0x41969, 0x0}, ++ {0x4196a, 0x0}, ++ {0x4196b, 0x0}, ++ {0x4196c, 0x0}, ++ {0x4196d, 0x0}, ++ {0x4196e, 0x0}, ++ {0x4196f, 0x0}, ++ {0x41970, 0x0}, ++ {0x41971, 0x0}, ++ {0x41972, 0x0}, ++ {0x41973, 0x0}, ++ {0x41974, 0x0}, ++ {0x41975, 0x0}, ++ {0x41976, 0x0}, ++ {0x41977, 0x0}, ++ {0x41978, 0x0}, ++ {0x41979, 0x0}, ++ {0x4197a, 0x0}, ++ {0x4197b, 0x0}, ++ {0x4197c, 0x0}, ++ {0x4197d, 0x0}, ++ {0x4197e, 0x0}, ++ {0x4197f, 0x0}, ++ {0x41980, 0x0}, ++ {0x41981, 0x0}, ++ {0x41982, 0x0}, ++ {0x41983, 0x0}, ++ {0x41984, 0x0}, ++ {0x41985, 0x0}, ++ {0x41986, 0x0}, ++ {0x41987, 0x0}, ++ {0x41988, 0x0}, ++ {0x41989, 0x0}, ++ {0x4198a, 0x0}, ++ {0x4198b, 0x0}, ++ {0x4198c, 0x0}, ++ {0x4198d, 0x0}, ++ {0x4198e, 0x0}, ++ {0x4198f, 0x0}, ++ {0x41990, 0x0}, ++ {0x41991, 0x0}, ++ {0x41992, 0x0}, ++ {0x41993, 0x0}, ++ {0x41994, 0x0}, ++ {0x41995, 0x0}, ++ {0x41996, 0x0}, ++ {0x41997, 0x0}, ++ {0x41998, 0x0}, ++ {0x41999, 0x0}, ++ {0x4199a, 0x0}, ++ {0x4199b, 0x0}, ++ {0x4199c, 0x0}, ++ {0x4199d, 0x0}, ++ {0x4199e, 0x0}, ++ {0x4199f, 0x0}, ++ {0x419a0, 0x0}, ++ {0x419a1, 0x0}, ++ {0x419a2, 0x0}, ++ {0x419a3, 0x0}, ++ {0x419a4, 0x0}, ++ {0x419a5, 0x0}, ++ {0x419a6, 0x0}, ++ {0x419a7, 0x0}, ++ {0x419a8, 0x0}, ++ {0x419a9, 0x0}, ++ {0x419aa, 0x0}, ++ {0x419ab, 0x0}, ++ {0x419ac, 0x0}, ++ {0x419ad, 0x0}, ++ {0x419ae, 0x0}, ++ {0x419af, 0x0}, ++ {0x419b0, 0x0}, ++ {0x419b1, 0x0}, ++ {0x419b2, 0x0}, ++ {0x419b3, 0x0}, ++ {0x419b4, 0x0}, ++ {0x419b5, 0x0}, ++ {0x419b6, 0x0}, ++ {0x419b7, 0x0}, ++ {0x419b8, 0x0}, ++ {0x419b9, 0x0}, ++ {0x419ba, 0x0}, ++ {0x419bb, 0x0}, ++ {0x419bc, 0x0}, ++ {0x419bd, 0x0}, ++ {0x419be, 0x0}, ++ {0x419bf, 0x0}, ++ {0x419c0, 0x0}, ++ {0x419c1, 0x0}, ++ {0x419c2, 0x0}, ++ {0x419c3, 0x0}, ++ {0x419c4, 0x0}, ++ {0x419c5, 0x0}, ++ {0x419c6, 0x0}, ++ {0x419c7, 0x0}, ++ {0x419c8, 0x0}, ++ {0x419c9, 0x0}, ++ {0x419ca, 0x0}, ++ {0x419cb, 0x0}, ++ {0x419cc, 0x0}, ++ {0x419cd, 0x0}, ++ {0x419ce, 0x0}, ++ {0x419cf, 0x0}, ++ {0x419d0, 0x0}, ++ {0x419d1, 0x0}, ++ {0x419d2, 0x0}, ++ {0x419d3, 0x0}, ++ {0x419d4, 0x0}, ++ {0x419d5, 0x0}, ++ {0x419d6, 0x0}, ++ {0x419d7, 0x0}, ++ {0x419d8, 0x0}, ++ {0x419d9, 0x0}, ++ {0x419da, 0x0}, ++ {0x419db, 0x0}, ++ {0x419dc, 0x0}, ++ {0x419dd, 0x0}, ++ {0x419de, 0x0}, ++ {0x419df, 0x0}, ++ {0x419e0, 0x0}, ++ {0x419e1, 0x0}, ++ {0x419e2, 0x0}, ++ {0x419e3, 0x0}, ++ {0x419e4, 0x0}, ++ {0x419e5, 0x0}, ++ {0x419e6, 0x0}, ++ {0x419e7, 0x0}, ++ {0x419e8, 0x0}, ++ {0x419e9, 0x0}, ++ {0x419ea, 0x0}, ++ {0x419eb, 0x0}, ++ {0x419ec, 0x0}, ++ {0x419ed, 0x0}, ++ {0x419ee, 0x0}, ++ {0x419ef, 0x0}, ++ {0x419f0, 0x0}, ++ {0x419f1, 0x0}, ++ {0x419f2, 0x0}, ++ {0x419f3, 0x0}, ++ {0x419f4, 0x0}, ++ {0x419f5, 0x0}, ++ {0x419f6, 0x0}, ++ {0x419f7, 0x0}, ++ {0x419f8, 0x0}, ++ {0x419f9, 0x0}, ++ {0x419fa, 0x0}, ++ {0x419fb, 0x0}, ++ {0x419fc, 0x0}, ++ {0x419fd, 0x0}, ++ {0x419fe, 0x0}, ++ {0x419ff, 0x0}, ++ {0x41a00, 0x0}, ++ {0x41a01, 0x0}, ++ {0x41a02, 0x0}, ++ {0x41a03, 0x0}, ++ {0x41a04, 0x0}, ++ {0x41a05, 0x0}, ++ {0x41a06, 0x0}, ++ {0x41a07, 0x0}, ++ {0x41a08, 0x0}, ++ {0x41a09, 0x0}, ++ {0x41a0a, 0x0}, ++ {0x41a0b, 0x0}, ++ {0x41a0c, 0x0}, ++ {0x41a0d, 0x0}, ++ {0x41a0e, 0x0}, ++ {0x41a0f, 0x0}, ++ {0x41a10, 0x0}, ++ {0x41a11, 0x0}, ++ {0x41a12, 0x0}, ++ {0x41a13, 0x0}, ++ {0x41a14, 0x0}, ++ {0x41a15, 0x0}, ++ {0x41a16, 0x0}, ++ {0x41a17, 0x0}, ++ {0x41a18, 0x0}, ++ {0x41a19, 0x0}, ++ {0x41a1a, 0x0}, ++ {0x41a1b, 0x0}, ++ {0x41a1c, 0x0}, ++ {0x41a1d, 0x0}, ++ {0x41a1e, 0x0}, ++ {0x41a1f, 0x0}, ++ {0x41a20, 0x0}, ++ {0x41a21, 0x0}, ++ {0x41a22, 0x0}, ++ {0x41a23, 0x0}, ++ {0x41a24, 0x0}, ++ {0x41a25, 0x0}, ++ {0x41a26, 0x0}, ++ {0x41a27, 0x0}, ++ {0x41a28, 0x0}, ++ {0x41a29, 0x0}, ++ {0x41a2a, 0x0}, ++ {0x41a2b, 0x0}, ++ {0x41a2c, 0x0}, ++ {0x41a2d, 0x0}, ++ {0x41a2e, 0x0}, ++ {0x41a2f, 0x0}, ++ {0x41a30, 0x0}, ++ {0x41a31, 0x0}, ++ {0x41a32, 0x0}, ++ {0x41a33, 0x0}, ++ {0x41a34, 0x0}, ++ {0x41a35, 0x0}, ++ {0x41a36, 0x0}, ++ {0x41a37, 0x0}, ++ {0x41a38, 0x0}, ++ {0x41a39, 0x0}, ++ {0x41a3a, 0x0}, ++ {0x41a3b, 0x0}, ++ {0x41a3c, 0x0}, ++ {0x41a3d, 0x0}, ++ {0x41a3e, 0x0}, ++ {0x41a3f, 0x0}, ++ {0x41a40, 0x0}, ++ {0x41a41, 0x0}, ++ {0x41a42, 0x0}, ++ {0x41a43, 0x0}, ++ {0x41a44, 0x0}, ++ {0x41a45, 0x0}, ++ {0x41a46, 0x0}, ++ {0x41a47, 0x0}, ++ {0x41a48, 0x0}, ++ {0x41a49, 0x0}, ++ {0x41a4a, 0x0}, ++ {0x41a4b, 0x0}, ++ {0x41a4c, 0x0}, ++ {0x41a4d, 0x0}, ++ {0x41a4e, 0x0}, ++ {0x41a4f, 0x0}, ++ {0x41a50, 0x0}, ++ {0x41a51, 0x0}, ++ {0x41a52, 0x0}, ++ {0x41a53, 0x0}, ++ {0x41a54, 0x0}, ++ {0x41a55, 0x0}, ++ {0x41a56, 0x0}, ++ {0x41a57, 0x0}, ++ {0x41a58, 0x0}, ++ {0x41a59, 0x0}, ++ {0x41a5a, 0x0}, ++ {0x41a5b, 0x0}, ++ {0x41a5c, 0x0}, ++ {0x41a5d, 0x0}, ++ {0x41a5e, 0x0}, ++ {0x41a5f, 0x0}, ++ {0x41a60, 0x0}, ++ {0x41a61, 0x0}, ++ {0x41a62, 0x0}, ++ {0x41a63, 0x0}, ++ {0x41a64, 0x0}, ++ {0x41a65, 0x0}, ++ {0x41a66, 0x0}, ++ {0x41a67, 0x0}, ++ {0x41a68, 0x0}, ++ {0x41a69, 0x0}, ++ {0x41a6a, 0x0}, ++ {0x41a6b, 0x0}, ++ {0x41a6c, 0x0}, ++ {0x41a6d, 0x0}, ++ {0x41a6e, 0x0}, ++ {0x41a6f, 0x0}, ++ {0x41a70, 0x0}, ++ {0x41a71, 0x0}, ++ {0x41a72, 0x0}, ++ {0x41a73, 0x0}, ++ {0x41a74, 0x0}, ++ {0x41a75, 0x0}, ++ {0x41a76, 0x0}, ++ {0x41a77, 0x0}, ++ {0x41a78, 0x0}, ++ {0x41a79, 0x0}, ++ {0x41a7a, 0x0}, ++ {0x41a7b, 0x0}, ++ {0x41a7c, 0x0}, ++ {0x41a7d, 0x0}, ++ {0x41a7e, 0x0}, ++ {0x41a7f, 0x0}, ++ {0x41a80, 0x0}, ++ {0x41a81, 0x0}, ++ {0x41a82, 0x0}, ++ {0x41a83, 0x0}, ++ {0x41a84, 0x0}, ++ {0x41a85, 0x0}, ++ {0x41a86, 0x0}, ++ {0x41a87, 0x0}, ++ {0x41a88, 0x0}, ++ {0x41a89, 0x0}, ++ {0x41a8a, 0x0}, ++ {0x41a8b, 0x0}, ++ {0x41a8c, 0x0}, ++ {0x41a8d, 0x0}, ++ {0x41a8e, 0x0}, ++ {0x41a8f, 0x0}, ++ {0x41a90, 0x0}, ++ {0x41a91, 0x0}, ++ {0x41a92, 0x0}, ++ {0x41a93, 0x0}, ++ {0x41a94, 0x0}, ++ {0x41a95, 0x0}, ++ {0x41a96, 0x0}, ++ {0x41a97, 0x0}, ++ {0x41a98, 0x0}, ++ {0x41a99, 0x0}, ++ {0x41a9a, 0x0}, ++ {0x41a9b, 0x0}, ++ {0x41a9c, 0x0}, ++ {0x41a9d, 0x0}, ++ {0x41a9e, 0x0}, ++ {0x41a9f, 0x0}, ++ {0x41aa0, 0x0}, ++ {0x41aa1, 0x0}, ++ {0x41aa2, 0x0}, ++ {0x41aa3, 0x0}, ++ {0x41aa4, 0x0}, ++ {0x41aa5, 0x0}, ++ {0x41aa6, 0x0}, ++ {0x41aa7, 0x0}, ++ {0x41aa8, 0x0}, ++ {0x41aa9, 0x0}, ++ {0x41aaa, 0x0}, ++ {0x41aab, 0x0}, ++ {0x41aac, 0x0}, ++ {0x41aad, 0x0}, ++ {0x41aae, 0x0}, ++ {0x41aaf, 0x0}, ++ {0x41ab0, 0x0}, ++ {0x41ab1, 0x0}, ++ {0x41ab2, 0x0}, ++ {0x41ab3, 0x0}, ++ {0x41ab4, 0x0}, ++ {0x41ab5, 0x0}, ++ {0x41ab6, 0x0}, ++ {0x41ab7, 0x0}, ++ {0x41ab8, 0x0}, ++ {0x41ab9, 0x0}, ++ {0x41aba, 0x0}, ++ {0x41abb, 0x0}, ++ {0x41abc, 0x0}, ++ {0x41abd, 0x0}, ++ {0x41abe, 0x0}, ++ {0x41abf, 0x0}, ++ {0x41ac0, 0x0}, ++ {0x41ac1, 0x0}, ++ {0x41ac2, 0x0}, ++ {0x41ac3, 0x0}, ++ {0x41ac4, 0x0}, ++ {0x41ac5, 0x0}, ++ {0x41ac6, 0x0}, ++ {0x41ac7, 0x0}, ++ {0x41ac8, 0x0}, ++ {0x41ac9, 0x0}, ++ {0x41aca, 0x0}, ++ {0x41acb, 0x0}, ++ {0x41acc, 0x0}, ++ {0x41acd, 0x0}, ++ {0x41ace, 0x0}, ++ {0x41acf, 0x0}, ++ {0x41ad0, 0x0}, ++ {0x41ad1, 0x0}, ++ {0x41ad2, 0x0}, ++ {0x41ad3, 0x0}, ++ {0x41ad4, 0x0}, ++ {0x41ad5, 0x0}, ++ {0x41ad6, 0x0}, ++ {0x41ad7, 0x0}, ++ {0x41ad8, 0x0}, ++ {0x41ad9, 0x0}, ++ {0x41ada, 0x0}, ++ {0x41adb, 0x0}, ++ {0x41adc, 0x0}, ++ {0x41add, 0x0}, ++ {0x41ade, 0x0}, ++ {0x41adf, 0x0}, ++ {0x41ae0, 0x0}, ++ {0x41ae1, 0x0}, ++ {0x41ae2, 0x0}, ++ {0x41ae3, 0x0}, ++ {0x41ae4, 0x0}, ++ {0x41ae5, 0x0}, ++ {0x41ae6, 0x0}, ++ {0x41ae7, 0x0}, ++ {0x41ae8, 0x0}, ++ {0x41ae9, 0x0}, ++ {0x41aea, 0x0}, ++ {0x41aeb, 0x0}, ++ {0x41aec, 0x0}, ++ {0x41aed, 0x0}, ++ {0x41aee, 0x0}, ++ {0x41aef, 0x0}, ++ {0x41af0, 0x0}, ++ {0x41af1, 0x0}, ++ {0x41af2, 0x0}, ++ {0x41af3, 0x0}, ++ {0x41af4, 0x0}, ++ {0x41af5, 0x0}, ++ {0x41af6, 0x0}, ++ {0x41af7, 0x0}, ++ {0x41af8, 0x0}, ++ {0x41af9, 0x0}, ++ {0x41afa, 0x0}, ++ {0x41afb, 0x0}, ++ {0x41afc, 0x0}, ++ {0x41afd, 0x0}, ++ {0x41afe, 0x0}, ++ {0x41aff, 0x0}, ++ {0x41b00, 0x0}, ++ {0x41b01, 0x0}, ++ {0x41b02, 0x0}, ++ {0x41b03, 0x0}, ++ {0x41b04, 0x0}, ++ {0x41b05, 0x0}, ++ {0x41b06, 0x0}, ++ {0x41b07, 0x0}, ++ {0x41b08, 0x0}, ++ {0x41b09, 0x0}, ++ {0x41b0a, 0x0}, ++ {0x41b0b, 0x0}, ++ {0x41b0c, 0x0}, ++ {0x41b0d, 0x0}, ++ {0x41b0e, 0x0}, ++ {0x41b0f, 0x0}, ++ {0x41b10, 0x0}, ++ {0x41b11, 0x0}, ++ {0x41b12, 0x0}, ++ {0x41b13, 0x0}, ++ {0x41b14, 0x0}, ++ {0x41b15, 0x0}, ++ {0x41b16, 0x0}, ++ {0x41b17, 0x0}, ++ {0x41b18, 0x0}, ++ {0x41b19, 0x0}, ++ {0x41b1a, 0x0}, ++ {0x41b1b, 0x0}, ++ {0x41b1c, 0x0}, ++ {0x41b1d, 0x0}, ++ {0x41b1e, 0x0}, ++ {0x41b1f, 0x0}, ++ {0x41b20, 0x0}, ++ {0x41b21, 0x0}, ++ {0x41b22, 0x0}, ++ {0x41b23, 0x0}, ++ {0x41b24, 0x0}, ++ {0x41b25, 0x0}, ++ {0x41b26, 0x0}, ++ {0x41b27, 0x0}, ++ {0x41b28, 0x0}, ++ {0x41b29, 0x0}, ++ {0x41b2a, 0x0}, ++ {0x41b2b, 0x0}, ++ {0x41b2c, 0x0}, ++ {0x41b2d, 0x0}, ++ {0x41b2e, 0x0}, ++ {0x41b2f, 0x0}, ++ {0x41b30, 0x0}, ++ {0x41b31, 0x0}, ++ {0x41b32, 0x0}, ++ {0x41b33, 0x0}, ++ {0x41b34, 0x0}, ++ {0x41b35, 0x0}, ++ {0x41b36, 0x0}, ++ {0x41b37, 0x0}, ++ {0x41b38, 0x0}, ++ {0x41b39, 0x0}, ++ {0x41b3a, 0x0}, ++ {0x41b3b, 0x0}, ++ {0x41b3c, 0x0}, ++ {0x41b3d, 0x0}, ++ {0x41b3e, 0x0}, ++ {0x41b3f, 0x0}, ++ {0x41b40, 0x0}, ++ {0x41b41, 0x0}, ++ {0x41b42, 0x0}, ++ {0x41b43, 0x0}, ++ {0x41b44, 0x0}, ++ {0x41b45, 0x0}, ++ {0x41b46, 0x0}, ++ {0x41b47, 0x0}, ++ {0x41b48, 0x0}, ++ {0x41b49, 0x0}, ++ {0x41b4a, 0x0}, ++ {0x41b4b, 0x0}, ++ {0x41b4c, 0x0}, ++ {0x41b4d, 0x0}, ++ {0x41b4e, 0x0}, ++ {0x41b4f, 0x0}, ++ {0x41b50, 0x0}, ++ {0x41b51, 0x0}, ++ {0x41b52, 0x0}, ++ {0x41b53, 0x0}, ++ {0x41b54, 0x0}, ++ {0x41b55, 0x0}, ++ {0x41b56, 0x0}, ++ {0x41b57, 0x0}, ++ {0x41b58, 0x0}, ++ {0x41b59, 0x0}, ++ {0x41b5a, 0x0}, ++ {0x41b5b, 0x0}, ++ {0x41b5c, 0x0}, ++ {0x41b5d, 0x0}, ++ {0x41b5e, 0x0}, ++ {0x41b5f, 0x0}, ++ {0x41b60, 0x0}, ++ {0x41b61, 0x0}, ++ {0x41b62, 0x0}, ++ {0x41b63, 0x0}, ++ {0x41b64, 0x0}, ++ {0x41b65, 0x0}, ++ {0x41b66, 0x0}, ++ {0x41b67, 0x0}, ++ {0x41b68, 0x0}, ++ {0x41b69, 0x0}, ++ {0x41b6a, 0x0}, ++ {0x41b6b, 0x0}, ++ {0x41b6c, 0x0}, ++ {0x41b6d, 0x0}, ++ {0x41b6e, 0x0}, ++ {0x41b6f, 0x0}, ++ {0x41b70, 0x0}, ++ {0x41b71, 0x0}, ++ {0x41b72, 0x0}, ++ {0x41b73, 0x0}, ++ {0x41b74, 0x0}, ++ {0x41b75, 0x0}, ++ {0x41b76, 0x0}, ++ {0x41b77, 0x0}, ++ {0x41b78, 0x0}, ++ {0x41b79, 0x0}, ++ {0x41b7a, 0x0}, ++ {0x41b7b, 0x0}, ++ {0x41b7c, 0x0}, ++ {0x41b7d, 0x0}, ++ {0x41b7e, 0x0}, ++ {0x41b7f, 0x0}, ++ {0x41b80, 0x0}, ++ {0x41b81, 0x0}, ++ {0x41b82, 0x0}, ++ {0x41b83, 0x0}, ++ {0x41b84, 0x0}, ++ {0x41b85, 0x0}, ++ {0x41b86, 0x0}, ++ {0x41b87, 0x0}, ++ {0x41b88, 0x0}, ++ {0x41b89, 0x0}, ++ {0x41b8a, 0x0}, ++ {0x41b8b, 0x0}, ++ {0x41b8c, 0x0}, ++ {0x41b8d, 0x0}, ++ {0x41b8e, 0x0}, ++ {0x41b8f, 0x0}, ++ {0x41b90, 0x0}, ++ {0x41b91, 0x0}, ++ {0x41b92, 0x0}, ++ {0x41b93, 0x0}, ++ {0x41b94, 0x0}, ++ {0x41b95, 0x0}, ++ {0x41b96, 0x0}, ++ {0x41b97, 0x0}, ++ {0x41b98, 0x0}, ++ {0x41b99, 0x0}, ++ {0x41b9a, 0x0}, ++ {0x41b9b, 0x0}, ++ {0x41b9c, 0x0}, ++ {0x41b9d, 0x0}, ++ {0x41b9e, 0x0}, ++ {0x41b9f, 0x0}, ++ {0x41ba0, 0x0}, ++ {0x41ba1, 0x0}, ++ {0x41ba2, 0x0}, ++ {0x41ba3, 0x0}, ++ {0x41ba4, 0x0}, ++ {0x41ba5, 0x0}, ++ {0x41ba6, 0x0}, ++ {0x41ba7, 0x0}, ++ {0x41ba8, 0x0}, ++ {0x41ba9, 0x0}, ++ {0x41baa, 0x0}, ++ {0x41bab, 0x0}, ++ {0x41bac, 0x0}, ++ {0x41bad, 0x0}, ++ {0x41bae, 0x0}, ++ {0x41baf, 0x0}, ++ {0x41bb0, 0x0}, ++ {0x41bb1, 0x0}, ++ {0x41bb2, 0x0}, ++ {0x41bb3, 0x0}, ++ {0x41bb4, 0x0}, ++ {0x41bb5, 0x0}, ++ {0x41bb6, 0x0}, ++ {0x41bb7, 0x0}, ++ {0x41bb8, 0x0}, ++ {0x41bb9, 0x0}, ++ {0x41bba, 0x0}, ++ {0x41bbb, 0x0}, ++ {0x41bbc, 0x0}, ++ {0x41bbd, 0x0}, ++ {0x41bbe, 0x0}, ++ {0x41bbf, 0x0}, ++ {0x41bc0, 0x0}, ++ {0x41bc1, 0x0}, ++ {0x41bc2, 0x0}, ++ {0x41bc3, 0x0}, ++ {0x41bc4, 0x0}, ++ {0x41bc5, 0x0}, ++ {0x41bc6, 0x0}, ++ {0x41bc7, 0x0}, ++ {0x41bc8, 0x0}, ++ {0x41bc9, 0x0}, ++ {0x41bca, 0x0}, ++ {0x41bcb, 0x0}, ++ {0x41bcc, 0x0}, ++ {0x41bcd, 0x0}, ++ {0x41bce, 0x0}, ++ {0x41bcf, 0x0}, ++ {0x41bd0, 0x0}, ++ {0x41bd1, 0x0}, ++ {0x41bd2, 0x0}, ++ {0x41bd3, 0x0}, ++ {0x41bd4, 0x0}, ++ {0x41bd5, 0x0}, ++ {0x41bd6, 0x0}, ++ {0x41bd7, 0x0}, ++ {0x41bd8, 0x0}, ++ {0x41bd9, 0x0}, ++ {0x41bda, 0x0}, ++ {0x41bdb, 0x0}, ++ {0x41bdc, 0x0}, ++ {0x41bdd, 0x0}, ++ {0x41bde, 0x0}, ++ {0x41bdf, 0x0}, ++ {0x41be0, 0x0}, ++ {0x41be1, 0x0}, ++ {0x41be2, 0x0}, ++ {0x41be3, 0x0}, ++ {0x41be4, 0x0}, ++ {0x41be5, 0x0}, ++ {0x41be6, 0x0}, ++ {0x41be7, 0x0}, ++ {0x41be8, 0x0}, ++ {0x41be9, 0x0}, ++ {0x41bea, 0x0}, ++ {0x41beb, 0x0}, ++ {0x41bec, 0x0}, ++ {0x41bed, 0x0}, ++ {0x41bee, 0x0}, ++ {0x41bef, 0x0}, ++ {0x41bf0, 0x0}, ++ {0x41bf1, 0x0}, ++ {0x41bf2, 0x0}, ++ {0x41bf3, 0x0}, ++ {0x41bf4, 0x0}, ++ {0x41bf5, 0x0}, ++ {0x41bf6, 0x0}, ++ {0x41bf7, 0x0}, ++ {0x41bf8, 0x0}, ++ {0x41bf9, 0x0}, ++ {0x41bfa, 0x0}, ++ {0x41bfb, 0x0}, ++ {0x41bfc, 0x0}, ++ {0x41bfd, 0x0}, ++ {0x41bfe, 0x0}, ++ {0x41bff, 0x0}, ++ {0x41c00, 0x0}, ++ {0x41c01, 0x0}, ++ {0x41c02, 0x0}, ++ {0x41c03, 0x0}, ++ {0x41c04, 0x0}, ++ {0x41c05, 0x0}, ++ {0x41c06, 0x0}, ++ {0x41c07, 0x0}, ++ {0x41c08, 0x0}, ++ {0x41c09, 0x0}, ++ {0x41c0a, 0x0}, ++ {0x41c0b, 0x0}, ++ {0x41c0c, 0x0}, ++ {0x41c0d, 0x0}, ++ {0x41c0e, 0x0}, ++ {0x41c0f, 0x0}, ++ {0x41c10, 0x0}, ++ {0x41c11, 0x0}, ++ {0x41c12, 0x0}, ++ {0x41c13, 0x0}, ++ {0x41c14, 0x0}, ++ {0x41c15, 0x0}, ++ {0x41c16, 0x0}, ++ {0x41c17, 0x0}, ++ {0x41c18, 0x0}, ++ {0x41c19, 0x0}, ++ {0x41c1a, 0x0}, ++ {0x41c1b, 0x0}, ++ {0x41c1c, 0x0}, ++ {0x41c1d, 0x0}, ++ {0x41c1e, 0x0}, ++ {0x41c1f, 0x0}, ++ {0x41c20, 0x0}, ++ {0x41c21, 0x0}, ++ {0x41c22, 0x0}, ++ {0x41c23, 0x0}, ++ {0x41c24, 0x0}, ++ {0x41c25, 0x0}, ++ {0x41c26, 0x0}, ++ {0x41c27, 0x0}, ++ {0x41c28, 0x0}, ++ {0x41c29, 0x0}, ++ {0x41c2a, 0x0}, ++ {0x41c2b, 0x0}, ++ {0x41c2c, 0x0}, ++ {0x41c2d, 0x0}, ++ {0x41c2e, 0x0}, ++ {0x41c2f, 0x0}, ++ {0x41c30, 0x0}, ++ {0x41c31, 0x0}, ++ {0x41c32, 0x0}, ++ {0x41c33, 0x0}, ++ {0x41c34, 0x0}, ++ {0x41c35, 0x0}, ++ {0x41c36, 0x0}, ++ {0x41c37, 0x0}, ++ {0x41c38, 0x0}, ++ {0x41c39, 0x0}, ++ {0x41c3a, 0x0}, ++ {0x41c3b, 0x0}, ++ {0x41c3c, 0x0}, ++ {0x41c3d, 0x0}, ++ {0x41c3e, 0x0}, ++ {0x41c3f, 0x0}, ++ {0x41c40, 0x0}, ++ {0x41c41, 0x0}, ++ {0x41c42, 0x0}, ++ {0x41c43, 0x0}, ++ {0x41c44, 0x0}, ++ {0x41c45, 0x0}, ++ {0x41c46, 0x0}, ++ {0x41c47, 0x0}, ++ {0x41c48, 0x0}, ++ {0x41c49, 0x0}, ++ {0x41c4a, 0x0}, ++ {0x41c4b, 0x0}, ++ {0x41c4c, 0x0}, ++ {0x41c4d, 0x0}, ++ {0x41c4e, 0x0}, ++ {0x41c4f, 0x0}, ++ {0x41c50, 0x0}, ++ {0x41c51, 0x0}, ++ {0x41c52, 0x0}, ++ {0x41c53, 0x0}, ++ {0x41c54, 0x0}, ++ {0x41c55, 0x0}, ++ {0x41c56, 0x0}, ++ {0x41c57, 0x0}, ++ {0x9002e, 0x0}, ++ {0x9002f, 0x0}, ++ {0x90030, 0x0}, ++ {0x90031, 0x0}, ++ {0x90032, 0x0}, ++ {0x90033, 0x0}, ++ {0x90034, 0x0}, ++ {0x90035, 0x0}, ++ {0x90036, 0x0}, ++ {0x90037, 0x0}, ++ {0x90038, 0x0}, ++ {0x90039, 0x0}, ++ {0x9003a, 0x0}, ++ {0x9003b, 0x0}, ++ {0x9003c, 0x0}, ++ {0x9003d, 0x0}, ++ {0x9003e, 0x0}, ++ {0x9003f, 0x0}, ++ {0x90040, 0x0}, ++ {0x90041, 0x0}, ++ {0x90042, 0x0}, ++ {0x90043, 0x0}, ++ {0x90044, 0x0}, ++ {0x90045, 0x0}, ++ {0x90046, 0x0}, ++ {0x90047, 0x0}, ++ {0x90048, 0x0}, ++ {0x90049, 0x0}, ++ {0x9004a, 0x0}, ++ {0x9004b, 0x0}, ++ {0x9004c, 0x0}, ++ {0x9004d, 0x0}, ++ {0x9004e, 0x0}, ++ {0x9004f, 0x0}, ++ {0x90050, 0x0}, ++ {0x90051, 0x0}, ++ {0x90052, 0x0}, ++ {0x90053, 0x0}, ++ {0x90054, 0x0}, ++ {0x90055, 0x0}, ++ {0x90056, 0x0}, ++ {0x90057, 0x0}, ++ {0x90058, 0x0}, ++ {0x90059, 0x0}, ++ {0x9005a, 0x0}, ++ {0x9005b, 0x0}, ++ {0x9005c, 0x0}, ++ {0x9005d, 0x0}, ++ {0x9005e, 0x0}, ++ {0x9005f, 0x0}, ++ {0x90060, 0x0}, ++ {0x90061, 0x0}, ++ {0x90062, 0x0}, ++ {0x90063, 0x0}, ++ {0x90064, 0x0}, ++ {0x90065, 0x0}, ++ {0x90066, 0x0}, ++ {0x90067, 0x0}, ++ {0x90068, 0x0}, ++ {0x90069, 0x0}, ++ {0x9006a, 0x0}, ++ {0x9006b, 0x0}, ++ {0x9006c, 0x0}, ++ {0x9006d, 0x0}, ++ {0x9006e, 0x0}, ++ {0x9006f, 0x0}, ++ {0x90070, 0x0}, ++ {0x90071, 0x0}, ++ {0x90072, 0x0}, ++ {0x90073, 0x0}, ++ {0x90074, 0x0}, ++ {0x90075, 0x0}, ++ {0x90076, 0x0}, ++ {0x90077, 0x0}, ++ {0x90078, 0x0}, ++ {0x90079, 0x0}, ++ {0x9007a, 0x0}, ++ {0x9007b, 0x0}, ++ {0x9007c, 0x0}, ++ {0x9007d, 0x0}, ++ {0x9007e, 0x0}, ++ {0x9007f, 0x0}, ++ {0x90080, 0x0}, ++ {0x90081, 0x0}, ++ {0x90082, 0x0}, ++ {0x90083, 0x0}, ++ {0x90084, 0x0}, ++ {0x90085, 0x0}, ++ {0x90086, 0x0}, ++ {0x90087, 0x0}, ++ {0x90088, 0x0}, ++ {0x90089, 0x0}, ++ {0x9008a, 0x0}, ++ {0x9008b, 0x0}, ++ {0x9008c, 0x0}, ++ {0x9008d, 0x0}, ++ {0x9008e, 0x0}, ++ {0x9008f, 0x0}, ++ {0x90090, 0x0}, ++ {0x90091, 0x0}, ++ {0x90092, 0x0}, ++ {0x90093, 0x0}, ++ {0x90094, 0x0}, ++ {0x90095, 0x0}, ++ {0x90096, 0x0}, ++ {0x90097, 0x0}, ++ {0x90098, 0x0}, ++ {0x90099, 0x0}, ++ {0x9009a, 0x0}, ++ {0x9009b, 0x0}, ++ {0x9009c, 0x0}, ++ {0x9009d, 0x0}, ++ {0x9009e, 0x0}, ++ {0x9009f, 0x0}, ++ {0x900a0, 0x0}, ++ {0x900a1, 0x0}, ++ {0x900a2, 0x0}, ++ {0x900a3, 0x0}, ++ {0x900a4, 0x0}, ++ {0x900a5, 0x0}, ++ {0x900a6, 0x0}, ++ {0x900a7, 0x0}, ++ {0x900a8, 0x0}, ++ {0x900a9, 0x0}, ++ {0x900aa, 0x0}, ++ {0x900ab, 0x0}, ++ {0x900ac, 0x0}, ++ {0x900ad, 0x0}, ++ {0x900ae, 0x0}, ++ {0x900af, 0x0}, ++ {0x900b0, 0x0}, ++ {0x900b1, 0x0}, ++ {0x900b2, 0x0}, ++ {0x900b3, 0x0}, ++ {0x900b4, 0x0}, ++ {0x900b5, 0x0}, ++ {0x900b6, 0x0}, ++ {0x900b7, 0x0}, ++ {0x900b8, 0x0}, ++ {0x900b9, 0x0}, ++ {0x900ba, 0x0}, ++ {0x900bb, 0x0}, ++ {0x900bc, 0x0}, ++ {0x900bd, 0x0}, ++ {0x900be, 0x0}, ++ {0x900bf, 0x0}, ++ {0x900c0, 0x0}, ++ {0x900c1, 0x0}, ++ {0x900c2, 0x0}, ++ {0x900c3, 0x0}, ++ {0x900c4, 0x0}, ++ {0x900c5, 0x0}, ++ {0x900c6, 0x0}, ++ {0x900c7, 0x0}, ++ {0x900c8, 0x0}, ++ {0x900c9, 0x0}, ++ {0x900ca, 0x0}, ++ {0x900cb, 0x0}, ++ {0x900cc, 0x0}, ++ {0x900cd, 0x0}, ++ {0x900ce, 0x0}, ++ {0x900cf, 0x0}, ++ {0x900d0, 0x0}, ++ {0x900d1, 0x0}, ++ {0x900d2, 0x0}, ++ {0x900d3, 0x0}, ++ {0x900d4, 0x0}, ++ {0x900d5, 0x0}, ++ {0x900d6, 0x0}, ++ {0x900d7, 0x0}, ++ {0x900d8, 0x0}, ++ {0x900d9, 0x0}, ++ {0x900da, 0x0}, ++ {0x900db, 0x0}, ++ {0x900dc, 0x0}, ++ {0x900dd, 0x0}, ++ {0x900de, 0x0}, ++ {0x900df, 0x0}, ++ {0x900e0, 0x0}, ++ {0x900e1, 0x0}, ++ {0x900e2, 0x0}, ++ {0x900e3, 0x0}, ++ {0x900e4, 0x0}, ++ {0x900e5, 0x0}, ++ {0x900e6, 0x0}, ++ {0x900e7, 0x0}, ++ {0x900e8, 0x0}, ++ {0x900e9, 0x0}, ++ {0x900ea, 0x0}, ++ {0x900eb, 0x0}, ++ {0x900ec, 0x0}, ++ {0x900ed, 0x0}, ++ {0x900ee, 0x0}, ++ {0x900ef, 0x0}, ++ {0x900f0, 0x0}, ++ {0x900f1, 0x0}, ++ {0x900f2, 0x0}, ++ {0x900f3, 0x0}, ++ {0x900f4, 0x0}, ++ {0x900f5, 0x0}, ++ {0x900f6, 0x0}, ++ {0x900f7, 0x0}, ++ {0x900f8, 0x0}, ++ {0x900f9, 0x0}, ++ {0x900fa, 0x0}, ++ {0x900fb, 0x0}, ++ {0x900fc, 0x0}, ++ {0x900fd, 0x0}, ++ {0x900fe, 0x0}, ++ {0x900ff, 0x0}, ++ {0x90100, 0x0}, ++ {0x90101, 0x0}, ++ {0x90102, 0x0}, ++ {0x90103, 0x0}, ++ {0x90104, 0x0}, ++ {0x90105, 0x0}, ++ {0x90106, 0x0}, ++ {0x90107, 0x0}, ++ {0x90108, 0x0}, ++ {0x90109, 0x0}, ++ {0x9010a, 0x0}, ++ {0x9010b, 0x0}, ++ {0x9010c, 0x0}, ++ {0x9010d, 0x0}, ++ {0x9010e, 0x0}, ++ {0x9010f, 0x0}, ++ {0x90110, 0x0}, ++ {0x90111, 0x0}, ++ {0x90112, 0x0}, ++ {0x90113, 0x0}, ++ {0x90114, 0x0}, ++ {0x90115, 0x0}, ++ {0x90116, 0x0}, ++ {0x90117, 0x0}, ++ {0x90118, 0x0}, ++ {0x90119, 0x0}, ++ {0x9011a, 0x0}, ++ {0x9011b, 0x0}, ++ {0x9011c, 0x0}, ++ {0x9011d, 0x0}, ++ {0x9011e, 0x0}, ++ {0x9011f, 0x0}, ++ {0x90120, 0x0}, ++ {0x90121, 0x0}, ++ {0x90122, 0x0}, ++ {0x90123, 0x0}, ++ {0x90124, 0x0}, ++ {0x90125, 0x0}, ++ {0x90126, 0x0}, ++ {0x90127, 0x0}, ++ {0x90128, 0x0}, ++ {0x90129, 0x0}, ++ {0x9012a, 0x0}, ++ {0x9012b, 0x0}, ++ {0x9012c, 0x0}, ++ {0x9012d, 0x0}, ++ {0x9012e, 0x0}, ++ {0x9012f, 0x0}, ++ {0x90130, 0x0}, ++ {0x90131, 0x0}, ++ {0x90132, 0x0}, ++ {0x90133, 0x0}, ++ {0x90134, 0x0}, ++ {0x90135, 0x0}, ++ {0x90136, 0x0}, ++ {0x90137, 0x0}, ++ {0x90138, 0x0}, ++ {0x90139, 0x0}, ++ {0x9013a, 0x0}, ++ {0x9013b, 0x0}, ++ {0x9013c, 0x0}, ++ {0x9013d, 0x0}, ++ {0x9013e, 0x0}, ++ {0x9013f, 0x0}, ++ {0x90140, 0x0}, ++ {0x90141, 0x0}, ++ {0x90142, 0x0}, ++ {0x90143, 0x0}, ++ {0x90144, 0x0}, ++ {0x90145, 0x0}, ++ {0x90146, 0x0}, ++ {0x90147, 0x0}, ++ {0x90148, 0x0}, ++ {0x90149, 0x0}, ++ {0x9014a, 0x0}, ++ {0x9014b, 0x0}, ++ {0x9014c, 0x0}, ++ {0x9014d, 0x0}, ++ {0x9014e, 0x0}, ++ {0x9014f, 0x0}, ++ {0x90150, 0x0}, ++ {0x90151, 0x0}, ++ {0x90152, 0x0}, ++ {0x90153, 0x0}, ++ {0x90154, 0x0}, ++ {0x90155, 0x0}, ++ {0x90156, 0x0}, ++ {0x90157, 0x0}, ++ {0x90158, 0x0}, ++ {0x90159, 0x0}, ++ {0x9015a, 0x0}, ++ {0x9015b, 0x0}, ++ {0x9015c, 0x0}, ++ {0x9015d, 0x0}, ++ {0x9015e, 0x0}, ++ {0x9015f, 0x0}, ++ {0x90160, 0x0}, ++ {0x90161, 0x0}, ++ {0x90162, 0x0}, ++ {0x90163, 0x0}, ++ {0x90164, 0x0}, ++ {0x90165, 0x0}, ++ {0x90166, 0x0}, ++ {0x90167, 0x0}, ++ {0x90168, 0x0}, ++ {0x90169, 0x0}, ++ {0x9016a, 0x0}, ++ {0x9016b, 0x0}, ++ {0x9016c, 0x0}, ++ {0x9016d, 0x0}, ++ {0x9016e, 0x0}, ++ {0x9016f, 0x0}, ++ {0x90170, 0x0}, ++ {0x90171, 0x0}, ++ {0x90172, 0x0}, ++ {0x90173, 0x0}, ++ {0x90174, 0x0}, ++ {0x90175, 0x0}, ++ {0x90176, 0x0}, ++ {0x90177, 0x0}, ++ {0x90178, 0x0}, ++ {0x90179, 0x0}, ++ {0x9017a, 0x0}, ++ {0x9017b, 0x0}, ++ {0x9017c, 0x0}, ++ {0x9017d, 0x0}, ++ {0x9017e, 0x0}, ++ {0x9017f, 0x0}, ++ {0x90180, 0x0}, ++ {0x90181, 0x0}, ++ {0x90182, 0x0}, ++ {0x90183, 0x0}, ++ {0x90184, 0x0}, ++ {0x90185, 0x0}, ++ {0x90186, 0x0}, ++ {0x90187, 0x0}, ++ {0x90188, 0x0}, ++ {0x90189, 0x0}, ++ {0x9018a, 0x0}, ++ {0x9018b, 0x0}, ++ {0x9018c, 0x0}, ++ {0x9018d, 0x0}, ++ {0x9018e, 0x0}, ++ {0x9018f, 0x0}, ++ {0x90190, 0x0}, ++ {0x90191, 0x0}, ++ {0x90192, 0x0}, ++ {0x90193, 0x0}, ++ {0x90194, 0x0}, ++ {0x90195, 0x0}, ++ {0x90196, 0x0}, ++ {0x90197, 0x0}, ++ {0x90198, 0x0}, ++ {0x90199, 0x0}, ++ {0x9019a, 0x0}, ++ {0x9019b, 0x0}, ++ {0x9019c, 0x0}, ++ {0x9019d, 0x0}, ++ {0x9019e, 0x0}, ++ {0x9019f, 0x0}, ++ {0x901a0, 0x0}, ++ {0x901a1, 0x0}, ++ {0x901a2, 0x0}, ++ {0x901a3, 0x0}, ++ {0x901a4, 0x0}, ++ {0x901a5, 0x0}, ++ {0x901a6, 0x0}, ++ {0x901a7, 0x0}, ++ {0x901a8, 0x0}, ++ {0x901a9, 0x0}, ++ {0x901aa, 0x0}, ++ {0x901ab, 0x0}, ++ {0x901ac, 0x0}, ++ {0x901ad, 0x0}, ++ {0x901ae, 0x0}, ++ {0x901af, 0x0}, ++ {0x901b0, 0x0}, ++ {0x901b1, 0x0}, ++ {0x901b2, 0x0}, ++ {0x901b3, 0x0}, ++ {0x901b4, 0x0}, ++ {0x901b5, 0x0}, ++ {0x901b6, 0x0}, ++ {0x901b7, 0x0}, ++ {0x901b8, 0x0}, ++ {0x901b9, 0x0}, ++ {0x901ba, 0x0}, ++ {0x901bb, 0x0}, ++ {0x901bc, 0x0}, ++ {0x901bd, 0x0}, ++ {0x901be, 0x0}, ++ {0x901bf, 0x0}, ++ {0x901c0, 0x0}, ++ {0x901c1, 0x0}, ++ {0x901c2, 0x0}, ++ {0x901c3, 0x0}, ++ {0x901c4, 0x0}, ++ {0x901c5, 0x0}, ++ {0x901c6, 0x0}, ++ {0x901c7, 0x0}, ++ {0x901c8, 0x0}, ++ {0x901c9, 0x0}, ++ {0x901ca, 0x0}, ++ {0x901cb, 0x0}, ++ {0x901cc, 0x0}, ++ {0x901cd, 0x0}, ++ {0x901ce, 0x0}, ++ {0x901cf, 0x0}, ++ {0x901d0, 0x0}, ++ {0x901d1, 0x0}, ++ {0x901d2, 0x0}, ++ {0x901d3, 0x0}, ++ {0x901d4, 0x0}, ++ {0x901d5, 0x0}, ++ {0x901d6, 0x0}, ++ {0x901d7, 0x0}, ++ {0x901d8, 0x0}, ++ {0x901d9, 0x0}, ++ {0x901da, 0x0}, ++ {0x901db, 0x0}, ++ {0x901dc, 0x0}, ++ {0x901dd, 0x0}, ++ {0x901de, 0x0}, ++ {0x901df, 0x0}, ++ {0x901e0, 0x0}, ++ {0x901e1, 0x0}, ++ {0x901e2, 0x0}, ++ {0x901e3, 0x0}, ++ {0x901e4, 0x0}, ++ {0x901e5, 0x0}, ++ {0x901e6, 0x0}, ++ {0x901e7, 0x0}, ++ {0x901e8, 0x0}, ++ {0x901e9, 0x0}, ++ {0x901ea, 0x0}, ++ {0x901eb, 0x0}, ++ {0x901ec, 0x0}, ++ {0x901ed, 0x0}, ++ {0x901ee, 0x0}, ++ {0x901ef, 0x0}, ++ {0x901f0, 0x0}, ++ {0x901f1, 0x0}, ++ {0x901f2, 0x0}, ++ {0x901f3, 0x0}, ++ {0x901f4, 0x0}, ++ {0x901f5, 0x0}, ++ {0x901f6, 0x0}, ++ {0x901f7, 0x0}, ++ {0x901f8, 0x0}, ++ {0x901f9, 0x0}, ++ {0x901fa, 0x0}, ++ {0x901fb, 0x0}, ++ {0x901fc, 0x0}, ++ {0x901fd, 0x0}, ++ {0x901fe, 0x0}, ++ {0x901ff, 0x0}, ++ {0x90200, 0x0}, ++ {0x90201, 0x0}, ++ {0x90202, 0x0}, ++ {0x90203, 0x0}, ++ {0x90204, 0x0}, ++ {0x90205, 0x0}, ++ {0x90206, 0x0}, ++ {0x90207, 0x0}, ++ {0x90208, 0x0}, ++ {0x90209, 0x0}, ++ {0x9020a, 0x0}, ++ {0x9020b, 0x0}, ++ {0x9020c, 0x0}, ++ {0x9020d, 0x0}, ++ {0x9020e, 0x0}, ++ {0x9020f, 0x0}, ++ {0x90210, 0x0}, ++ {0x90211, 0x0}, ++ {0x90212, 0x0}, ++ {0x90213, 0x0}, ++ {0x90214, 0x0}, ++ {0x90215, 0x0}, ++ {0x90216, 0x0}, ++ {0x90217, 0x0}, ++ {0x90218, 0x0}, ++ {0x90219, 0x0}, ++ {0x9021a, 0x0}, ++ {0x9021b, 0x0}, ++ {0x9021c, 0x0}, ++ {0x9021d, 0x0}, ++ {0x9021e, 0x0}, ++ {0x9021f, 0x0}, ++ {0x90220, 0x0}, ++ {0x90221, 0x0}, ++ {0x90222, 0x0}, ++ {0x90223, 0x0}, ++ {0x90224, 0x0}, ++ {0x90225, 0x0}, ++ {0x90226, 0x0}, ++ {0x90227, 0x0}, ++ {0x90228, 0x0}, ++ {0x90229, 0x0}, ++ {0x9022a, 0x0}, ++ {0x9022b, 0x0}, ++ {0x9022c, 0x0}, ++ {0x9022d, 0x0}, ++ {0x9022e, 0x0}, ++ {0x9022f, 0x0}, ++ {0x90230, 0x0}, ++ {0x90231, 0x0}, ++ {0x90232, 0x0}, ++ {0x90233, 0x0}, ++ {0x90234, 0x0}, ++ {0x90235, 0x0}, ++ {0x90236, 0x0}, ++ {0x90237, 0x0}, ++ {0x90238, 0x0}, ++ {0x90239, 0x0}, ++ {0x9023a, 0x0}, ++ {0x9023b, 0x0}, ++ {0x9023c, 0x0}, ++ {0x9023d, 0x0}, ++ {0x9023e, 0x0}, ++ {0x9023f, 0x0}, ++ {0x90240, 0x0}, ++ {0x90241, 0x0}, ++ {0x90242, 0x0}, ++ {0x90243, 0x0}, ++ {0x90244, 0x0}, ++ {0x90245, 0x0}, ++ {0x90246, 0x0}, ++ {0x90247, 0x0}, ++ {0x90248, 0x0}, ++ {0x90249, 0x0}, ++ {0x9024a, 0x0}, ++ {0x9024b, 0x0}, ++ {0x9024c, 0x0}, ++ {0x9024d, 0x0}, ++ {0x9024e, 0x0}, ++ {0x9024f, 0x0}, ++ {0x90250, 0x0}, ++ {0x90251, 0x0}, ++ {0x90252, 0x0}, ++ {0x90253, 0x0}, ++ {0x90254, 0x0}, ++ {0x90255, 0x0}, ++ {0x90256, 0x0}, ++ {0x90257, 0x0}, ++ {0x90258, 0x0}, ++ {0x90259, 0x0}, ++ {0x9025a, 0x0}, ++ {0x9025b, 0x0}, ++ {0x9025c, 0x0}, ++ {0x9025d, 0x0}, ++ {0x9025e, 0x0}, ++ {0x9025f, 0x0}, ++ {0x90260, 0x0}, ++ {0x90261, 0x0}, ++ {0x90262, 0x0}, ++ {0x90263, 0x0}, ++ {0x90264, 0x0}, ++ {0x90265, 0x0}, ++ {0x90266, 0x0}, ++ {0x90267, 0x0}, ++ {0x90268, 0x0}, ++ {0x90269, 0x0}, ++ {0x9026a, 0x0}, ++ {0x9026b, 0x0}, ++ {0x9026c, 0x0}, ++ {0x9026d, 0x0}, ++ {0x9026e, 0x0}, ++ {0x9026f, 0x0}, ++ {0x90270, 0x0}, ++ {0x90271, 0x0}, ++ {0x90272, 0x0}, ++ {0x90273, 0x0}, ++ {0x90274, 0x0}, ++ {0x90275, 0x0}, ++ {0x90276, 0x0}, ++ {0x90277, 0x0}, ++ {0x90278, 0x0}, ++ {0x90279, 0x0}, ++ {0x9027a, 0x0}, ++ {0x9027b, 0x0}, ++ {0x9027c, 0x0}, ++ {0x9027d, 0x0}, ++ {0x9027e, 0x0}, ++ {0x9027f, 0x0}, ++ {0x90280, 0x0}, ++ {0x90281, 0x0}, ++ {0x90282, 0x0}, ++ {0x90283, 0x0}, ++ {0x90284, 0x0}, ++ {0x90285, 0x0}, ++ {0x90286, 0x0}, ++ {0x90287, 0x0}, ++ {0x90288, 0x0}, ++ {0x90289, 0x0}, ++ {0x9028a, 0x0}, ++ {0x9028b, 0x0}, ++ {0x9028c, 0x0}, ++ {0x9028d, 0x0}, ++ {0x9028e, 0x0}, ++ {0x9028f, 0x0}, ++ {0x90290, 0x0}, ++ {0x90291, 0x0}, ++ {0x90292, 0x0}, ++ {0x90293, 0x0}, ++ {0x90294, 0x0}, ++ {0x90295, 0x0}, ++ {0x90296, 0x0}, ++ {0x90297, 0x0}, ++ {0x90298, 0x0}, ++ {0x90299, 0x0}, ++ {0x9029a, 0x0}, ++ {0x9029b, 0x0}, ++ {0x9029c, 0x0}, ++ {0x9029d, 0x0}, ++ {0x9029e, 0x0}, ++ {0x9029f, 0x0}, ++ {0x902a0, 0x0}, ++ {0x902a1, 0x0}, ++ {0x902a2, 0x0}, ++ {0x902a3, 0x0}, ++ {0x902a4, 0x0}, ++ {0x902a5, 0x0}, ++ {0x902a6, 0x0}, ++ {0x902a7, 0x0}, ++ {0x902a8, 0x0}, ++ {0x902a9, 0x0}, ++ {0x902aa, 0x0}, ++ {0x902ab, 0x0}, ++ {0x902ac, 0x0}, ++ {0x902ad, 0x0}, ++ {0x902ae, 0x0}, ++ {0x902af, 0x0}, ++ {0x902b0, 0x0}, ++ {0x902b1, 0x0}, ++ {0x902b2, 0x0}, ++ {0x902b3, 0x0}, ++ {0x902b4, 0x0}, ++ {0x902b5, 0x0}, ++ {0x902b6, 0x0}, ++ {0x902b7, 0x0}, ++ {0x902b8, 0x0}, ++ {0x902b9, 0x0}, ++ {0x902ba, 0x0}, ++ {0x902bb, 0x0}, ++ {0x902bc, 0x0}, ++ {0x902bd, 0x0}, ++ {0x902be, 0x0}, ++ {0x902bf, 0x0}, ++ {0x902c0, 0x0}, ++ {0x902c1, 0x0}, ++ {0x902c2, 0x0}, ++ {0x902c3, 0x0}, ++ {0x902c4, 0x0}, ++ {0x902c5, 0x0}, ++ {0x902c6, 0x0}, ++ {0x902c7, 0x0}, ++ {0x902c8, 0x0}, ++ {0x902c9, 0x0}, ++ {0x902ca, 0x0}, ++ {0x902cb, 0x0}, ++ {0x902cc, 0x0}, ++ {0x902cd, 0x0}, ++ {0x902ce, 0x0}, ++ {0x902cf, 0x0}, ++ {0x902d0, 0x0}, ++ {0x902d1, 0x0}, ++ {0x902d2, 0x0}, ++ {0x902d3, 0x0}, ++ {0x902d4, 0x0}, ++ {0x902d5, 0x0}, ++ {0x902d6, 0x0}, ++ {0x902d7, 0x0}, ++ {0x902d8, 0x0}, ++ {0x902d9, 0x0}, ++ {0x902da, 0x0}, ++ {0x902db, 0x0}, ++ {0x902dc, 0x0}, ++ {0x902dd, 0x0}, ++ {0x902de, 0x0}, ++ {0x902df, 0x0}, ++ {0x902e0, 0x0}, ++ {0x902e1, 0x0}, ++ {0x902e2, 0x0}, ++ {0x902e3, 0x0}, ++ {0x902e4, 0x0}, ++ {0x902e5, 0x0}, ++ {0x902e6, 0x0}, ++ {0x902e7, 0x0}, ++ {0x902e8, 0x0}, ++ {0x902e9, 0x0}, ++ {0x902ea, 0x0}, ++ {0x902eb, 0x0}, ++ {0x902ec, 0x0}, ++ {0x902ed, 0x0}, ++ {0x902ee, 0x0}, ++ {0x902ef, 0x0}, ++ {0x902f0, 0x0}, ++ {0x902f1, 0x0}, ++ {0x902f2, 0x0}, ++ {0x902f3, 0x0}, ++ {0x902f4, 0x0}, ++ {0x902f5, 0x0}, ++ {0x902f6, 0x0}, ++ {0x902f7, 0x0}, ++ {0x902f8, 0x0}, ++ {0x902f9, 0x0}, ++ {0x902fa, 0x0}, ++ {0x902fb, 0x0}, ++ {0x902fc, 0x0}, ++ {0x902fd, 0x0}, ++ {0x902fe, 0x0}, ++ {0x902ff, 0x0}, ++ {0x90300, 0x0}, ++ {0x90301, 0x0}, ++ {0x90302, 0x0}, ++ {0x90303, 0x0}, ++ {0x90304, 0x0}, ++ {0x90305, 0x0}, ++ {0x90306, 0x0}, ++ {0x90307, 0x0}, ++ {0x90308, 0x0}, ++ {0x90309, 0x0}, ++ {0x9030a, 0x0}, ++ {0x9030b, 0x0}, ++ {0x9030c, 0x0}, ++ {0x9030d, 0x0}, ++ {0x9030e, 0x0}, ++ {0x9030f, 0x0}, ++ {0x90310, 0x0}, ++ {0x90311, 0x0}, ++ {0x90312, 0x0}, ++ {0x90313, 0x0}, ++ {0x90314, 0x0}, ++ {0x90315, 0x0}, ++ {0x90316, 0x0}, ++ {0x90317, 0x0}, ++ {0x90318, 0x0}, ++ {0x90319, 0x0}, ++ {0x9031a, 0x0}, ++ {0x9031b, 0x0}, ++ {0x9031c, 0x0}, ++ {0x9031d, 0x0}, ++ {0x9031e, 0x0}, ++ {0x9031f, 0x0}, ++ {0x90320, 0x0}, ++ {0x90321, 0x0}, ++ {0x90322, 0x0}, ++ {0x90323, 0x0}, ++ {0x90324, 0x0}, ++ {0x90325, 0x0}, ++ {0x90326, 0x0}, ++ {0x90327, 0x0}, ++ {0x90328, 0x0}, ++ {0x90329, 0x0}, ++ {0x9032a, 0x0}, ++ {0x9032b, 0x0}, ++ {0x9032c, 0x0}, ++ {0x9032d, 0x0}, ++ {0x9032e, 0x0}, ++ {0x9032f, 0x0}, ++ {0x90330, 0x0}, ++ {0x90331, 0x0}, ++ {0x90332, 0x0}, ++ {0x90333, 0x0}, ++ {0x90334, 0x0}, ++ {0x90335, 0x0}, ++ {0x90336, 0x0}, ++ {0x90337, 0x0}, ++ {0x90338, 0x0}, ++ {0x90339, 0x0}, ++ {0x9033a, 0x0}, ++ {0x9033b, 0x0}, ++ {0x9033c, 0x0}, ++ {0x9033d, 0x0}, ++ {0x9033e, 0x0}, ++ {0x9033f, 0x0}, ++ {0x90340, 0x0}, ++ {0x90341, 0x0}, ++ {0x90342, 0x0}, ++ {0x90343, 0x0}, ++ {0x90344, 0x0}, ++ {0x90345, 0x0}, ++ {0x90346, 0x0}, ++ {0x90347, 0x0}, ++ {0x90348, 0x0}, ++ {0x90349, 0x0}, ++ {0x9034a, 0x0}, ++ {0x9034b, 0x0}, ++ {0x9034c, 0x0}, ++ {0x9034d, 0x0}, ++ {0x9034e, 0x0}, ++ {0x9034f, 0x0}, ++ {0x90350, 0x0}, ++ {0x90351, 0x0}, ++ {0x90352, 0x0}, ++ {0x90353, 0x0}, ++ {0x90354, 0x0}, ++ {0x90355, 0x0}, ++ {0x90356, 0x0}, ++ {0x90357, 0x0}, ++ {0x90358, 0x0}, ++ {0x90359, 0x0}, ++ {0x9035a, 0x0}, ++ {0x9035b, 0x0}, ++ {0x9035c, 0x0}, ++ {0x9035d, 0x0}, ++ {0x9035e, 0x0}, ++ {0x9035f, 0x0}, ++ {0x90360, 0x0}, ++ {0x90361, 0x0}, ++ {0x90362, 0x0}, ++ {0x90363, 0x0}, ++ {0x90364, 0x0}, ++ {0x90365, 0x0}, ++ {0x90366, 0x0}, ++ {0x90367, 0x0}, ++ {0x90368, 0x0}, ++ {0x90369, 0x0}, ++ {0x9036a, 0x0}, ++ {0x9036b, 0x0}, ++ {0x9036c, 0x0}, ++ {0x9036d, 0x0}, ++ {0x9036e, 0x0}, ++ {0x9036f, 0x0}, ++ {0x90370, 0x0}, ++ {0x90371, 0x0}, ++ {0x90372, 0x0}, ++ {0x90373, 0x0}, ++ {0x90374, 0x0}, ++ {0x90375, 0x0}, ++ {0x90376, 0x0}, ++ {0x90377, 0x0}, ++ {0x90378, 0x0}, ++ {0x90379, 0x0}, ++ {0x9037a, 0x0}, ++ {0x9037b, 0x0}, ++ {0x9037c, 0x0}, ++ {0x9037d, 0x0}, ++ {0x9037e, 0x0}, ++ {0x9037f, 0x0}, ++ {0x90380, 0x0}, ++ {0x90381, 0x0}, ++ {0x90382, 0x0}, ++ {0x90383, 0x0}, ++ {0x90384, 0x0}, ++ {0x90385, 0x0}, ++ {0x90386, 0x0}, ++ {0x90387, 0x0}, ++ {0x90388, 0x0}, ++ {0x90389, 0x0}, ++ {0x9038a, 0x0}, ++ {0x9038b, 0x0}, ++ {0x9038c, 0x0}, ++ {0x9038d, 0x0}, ++ {0x9038e, 0x0}, ++ {0x9038f, 0x0}, ++ {0x90390, 0x0}, ++ {0x90391, 0x0}, ++ {0x90392, 0x0}, ++ {0x90393, 0x0}, ++ {0x90394, 0x0}, ++ {0x90395, 0x0}, ++ {0x90396, 0x0}, ++ {0x90397, 0x0}, ++ {0x90398, 0x0}, ++ {0x90399, 0x0}, ++ {0x9039a, 0x0}, ++ {0x9039b, 0x0}, ++ {0x9039c, 0x0}, ++ {0x9039d, 0x0}, ++ {0x9039e, 0x0}, ++ {0x9039f, 0x0}, ++ {0x903a0, 0x0}, ++ {0x903a1, 0x0}, ++ {0x903a2, 0x0}, ++ {0x903a3, 0x0}, ++ {0x903a4, 0x0}, ++ {0x903a5, 0x0}, ++ {0x903a6, 0x0}, ++ {0x903a7, 0x0}, ++ {0x903a8, 0x0}, ++ {0x903a9, 0x0}, ++ {0x903aa, 0x0}, ++ {0x903ab, 0x0}, ++ {0x903ac, 0x0}, ++ {0x903ad, 0x0}, ++ {0x903ae, 0x0}, ++ {0x903af, 0x0}, ++ {0x903b0, 0x0}, ++ {0x903b1, 0x0}, ++ {0x903b2, 0x0}, ++ {0x903b3, 0x0}, ++ {0x903b4, 0x0}, ++ {0x903b5, 0x0}, ++ {0x903b6, 0x0}, ++ {0x903b7, 0x0}, ++ {0x903b8, 0x0}, ++ {0x903b9, 0x0}, ++ {0x903ba, 0x0}, ++ {0x903bb, 0x0}, ++ {0x903bc, 0x0}, ++ {0x903bd, 0x0}, ++ {0x903be, 0x0}, ++ {0x903bf, 0x0}, ++ {0x903c0, 0x0}, ++ {0x903c1, 0x0}, ++ {0x903c2, 0x0}, ++ {0x903c3, 0x0}, ++ {0x903c4, 0x0}, ++ {0x903c5, 0x0}, ++ {0x903c6, 0x0}, ++ {0x903c7, 0x0}, ++ {0x903c8, 0x0}, ++ {0x903c9, 0x0}, ++ {0x903ca, 0x0}, ++ {0x903cb, 0x0}, ++ {0x903cc, 0x0}, ++ {0x903cd, 0x0}, ++ {0x903ce, 0x0}, ++ {0x903cf, 0x0}, ++ {0x903d0, 0x0}, ++ {0x903d1, 0x0}, ++ {0x903d2, 0x0}, ++ {0x903d3, 0x0}, ++ {0x903d4, 0x0}, ++ {0x903d5, 0x0}, ++ {0x903d6, 0x0}, ++ {0x903d7, 0x0}, ++ {0x903d8, 0x0}, ++ {0x903d9, 0x0}, ++ {0x903da, 0x0}, ++ {0x903db, 0x0}, ++ {0x903dc, 0x0}, ++ {0x903dd, 0x0}, ++ {0x903de, 0x0}, ++ {0x903df, 0x0}, ++ {0x903e0, 0x0}, ++ {0x903e1, 0x0}, ++ {0x903e2, 0x0}, ++ {0x903e3, 0x0}, ++ {0x903e4, 0x0}, ++ {0x903e5, 0x0}, ++ {0x903e6, 0x0}, ++ {0x903e7, 0x0}, ++ {0x903e8, 0x0}, ++ {0x903e9, 0x0}, ++ {0x903ea, 0x0}, ++ {0x903eb, 0x0}, ++ {0x903ec, 0x0}, ++ {0x903ed, 0x0}, ++ {0x903ee, 0x0}, ++ {0x903ef, 0x0}, ++ {0x903f0, 0x0}, ++ {0x903f1, 0x0}, ++ {0x903f2, 0x0}, ++ {0x903f3, 0x0}, ++ {0x903f4, 0x0}, ++ {0x903f5, 0x0}, ++ {0x903f6, 0x0}, ++ {0x903f7, 0x0}, ++ {0x903f8, 0x0}, ++ {0x903f9, 0x0}, ++ {0x903fa, 0x0}, ++ {0x903fb, 0x0}, ++ {0x903fc, 0x0}, ++ {0x903fd, 0x0}, ++ {0x903fe, 0x0}, ++ {0x903ff, 0x0}, ++ {0x90400, 0x0}, ++ {0x90401, 0x0}, ++ {0x90402, 0x0}, ++ {0x90403, 0x0}, ++ {0x90404, 0x0}, ++ {0x90405, 0x0}, ++ {0x90406, 0x0}, ++ {0x90407, 0x0}, ++ {0x90408, 0x0}, ++ {0x90409, 0x0}, ++ {0x9040a, 0x0}, ++ {0x9040b, 0x0}, ++ {0x9040c, 0x0}, ++ {0x9040d, 0x0}, ++ {0x9040e, 0x0}, ++ {0x9040f, 0x0}, ++ {0x90410, 0x0}, ++ {0x90411, 0x0}, ++ {0x90412, 0x0}, ++ {0x90413, 0x0}, ++ {0x90414, 0x0}, ++ {0x90415, 0x0}, ++ {0x90416, 0x0}, ++ {0x90417, 0x0}, ++ {0x90418, 0x0}, ++ {0x90419, 0x0}, ++ {0x9041a, 0x0}, ++ {0x9041b, 0x0}, ++ {0x9041c, 0x0}, ++ {0x9041d, 0x0}, ++ {0x9041e, 0x0}, ++ {0x9041f, 0x0}, ++ {0x90420, 0x0}, ++ {0x90421, 0x0}, ++ {0x90422, 0x0}, ++ {0x90423, 0x0}, ++ {0x90424, 0x0}, ++ {0x90425, 0x0}, ++ {0x90426, 0x0}, ++ {0x90427, 0x0}, ++ {0x90428, 0x0}, ++ {0x90429, 0x0}, ++ {0x9042a, 0x0}, ++ {0x9042b, 0x0}, ++ {0x9042c, 0x0}, ++ {0x9042d, 0x0}, ++ {0x9042e, 0x0}, ++ {0x9042f, 0x0}, ++ {0x90430, 0x0}, ++ {0x90431, 0x0}, ++ {0x90432, 0x0}, ++ {0x90433, 0x0}, ++ {0x90434, 0x0}, ++ {0x90435, 0x0}, ++ {0x90436, 0x0}, ++ {0x90437, 0x0}, ++ {0x90438, 0x0}, ++ {0x90439, 0x0}, ++ {0x9043a, 0x0}, ++ {0x9043b, 0x0}, ++ {0x9043c, 0x0}, ++ {0x9043d, 0x0}, ++ {0x9043e, 0x0}, ++ {0x9043f, 0x0}, ++ {0x90440, 0x0}, ++ {0x90441, 0x0}, ++ {0x90442, 0x0}, ++ {0x90443, 0x0}, ++ {0x90444, 0x0}, ++ {0x90445, 0x0}, ++ {0x90446, 0x0}, ++ {0x90447, 0x0}, ++ {0x90448, 0x0}, ++ {0x90449, 0x0}, ++ {0x9044a, 0x0}, ++ {0x9044b, 0x0}, ++ {0x9044c, 0x0}, ++ {0x9044d, 0x0}, ++ {0x9044e, 0x0}, ++ {0x9044f, 0x0}, ++ {0x90450, 0x0}, ++ {0x90451, 0x0}, ++ {0x90452, 0x0}, ++ {0x90453, 0x0}, ++ {0x90454, 0x0}, ++ {0x90455, 0x0}, ++ {0x90456, 0x0}, ++ {0x90457, 0x0}, ++ {0x90458, 0x0}, ++ {0x90459, 0x0}, ++ {0x9045a, 0x0}, ++ {0x9045b, 0x0}, ++ {0x9045c, 0x0}, ++ {0x9045d, 0x0}, ++ {0x9045e, 0x0}, ++ {0x9045f, 0x0}, ++ {0x90460, 0x0}, ++ {0x90461, 0x0}, ++ {0x90462, 0x0}, ++ {0x90463, 0x0}, ++ {0x90464, 0x0}, ++ {0x90465, 0x0}, ++ {0x90466, 0x0}, ++ {0x90467, 0x0}, ++ {0x90468, 0x0}, ++ {0x90469, 0x0}, ++ {0x9046a, 0x0}, ++ {0x9046b, 0x0}, ++ {0x9046c, 0x0}, ++ {0x9046d, 0x0}, ++ {0x9046e, 0x0}, ++ {0x9046f, 0x0}, ++ {0x90470, 0x0}, ++ {0x90471, 0x0}, ++ {0x90472, 0x0}, ++ {0x90473, 0x0}, ++ {0x90474, 0x0}, ++ {0x90475, 0x0}, ++ {0x90476, 0x0}, ++ {0x90477, 0x0}, ++ {0x90478, 0x0}, ++ {0x90479, 0x0}, ++ {0x9047a, 0x0}, ++ {0x9047b, 0x0}, ++ {0x9047c, 0x0}, ++ {0x9047d, 0x0}, ++ {0x9047e, 0x0}, ++ {0x9047f, 0x0}, ++ {0x90480, 0x0}, ++ {0x90481, 0x0}, ++ {0x90482, 0x0}, ++ {0x90483, 0x0}, ++ {0x90484, 0x0}, ++ {0x90485, 0x0}, ++ {0x90486, 0x0}, ++ {0x90487, 0x0}, ++ {0x90488, 0x0}, ++ {0x90489, 0x0}, ++ {0x9048a, 0x0}, ++ {0x9048b, 0x0}, ++ {0x9048c, 0x0}, ++ {0x9048d, 0x0}, ++ {0x9048e, 0x0}, ++ {0x9048f, 0x0}, ++ {0x90490, 0x0}, ++ {0x90491, 0x0}, ++ {0x90492, 0x0}, ++ {0x90493, 0x0}, ++ {0x90494, 0x0}, ++ {0x90495, 0x0}, ++ {0x90496, 0x0}, ++ {0x90497, 0x0}, ++ {0x90498, 0x0}, ++ {0x90499, 0x0}, ++ {0x9049a, 0x0}, ++ {0x9049b, 0x0}, ++ {0x9049c, 0x0}, ++ {0x9049d, 0x0}, ++ {0x9049e, 0x0}, ++ {0x9049f, 0x0}, ++ {0x904a0, 0x0}, ++ {0x904a1, 0x0}, ++ {0x904a2, 0x0}, ++ {0x904a3, 0x0}, ++ {0x904a4, 0x0}, ++ {0x904a5, 0x0}, ++ {0x904a6, 0x0}, ++ {0x904a7, 0x0}, ++ {0x904a8, 0x0}, ++ {0x904a9, 0x0}, ++ {0x904aa, 0x0}, ++ {0x904ab, 0x0}, ++ {0x904ac, 0x0}, ++ {0x904ad, 0x0}, ++ {0x904ae, 0x0}, ++ {0x904af, 0x0}, ++ {0x904b0, 0x0}, ++ {0x904b1, 0x0}, ++ {0x904b2, 0x0}, ++ {0x904b3, 0x0}, ++ {0x904b4, 0x0}, ++ {0x904b5, 0x0}, ++ {0x904b6, 0x0}, ++ {0x904b7, 0x0}, ++ {0x904b8, 0x0}, ++ {0x904b9, 0x0}, ++ {0x904ba, 0x0}, ++ {0x904bb, 0x0}, ++ {0x904bc, 0x0}, ++ {0x904bd, 0x0}, ++ {0x904be, 0x0}, ++ {0x904bf, 0x0}, ++ {0x904c0, 0x0}, ++ {0x904c1, 0x0}, ++ {0x904c2, 0x0}, ++ {0x904c3, 0x0}, ++ {0x904c4, 0x0}, ++ {0x904c5, 0x0}, ++ {0x904c6, 0x0}, ++ {0x904c7, 0x0}, ++ {0x904c8, 0x0}, ++ {0x904c9, 0x0}, ++ {0x904ca, 0x0}, ++ {0x904cb, 0x0}, ++ {0x904cc, 0x0}, ++ {0x904cd, 0x0}, ++ {0x904ce, 0x0}, ++ {0x904cf, 0x0}, ++ {0x904d0, 0x0}, ++ {0x904d1, 0x0}, ++ {0x904d2, 0x0}, ++ {0x904d3, 0x0}, ++ {0x904d4, 0x0}, ++ {0x904d5, 0x0}, ++ {0x904d6, 0x0}, ++ {0x904d7, 0x0}, ++ {0x904d8, 0x0}, ++ {0x904d9, 0x0}, ++ {0x904da, 0x0}, ++ {0x904db, 0x0}, ++ {0x904dc, 0x0}, ++ {0x904dd, 0x0}, ++ {0x904de, 0x0}, ++ {0x904df, 0x0}, ++ {0x904e0, 0x0}, ++ {0x904e1, 0x0}, ++ {0x904e2, 0x0}, ++ {0x904e3, 0x0}, ++ {0x904e4, 0x0}, ++ {0x904e5, 0x0}, ++ {0x904e6, 0x0}, ++ {0x904e7, 0x0}, ++ {0x904e8, 0x0}, ++ {0x904e9, 0x0}, ++ {0x904ea, 0x0}, ++ {0x904eb, 0x0}, ++ {0x904ec, 0x0}, ++ {0x904ed, 0x0}, ++ {0x904ee, 0x0}, ++ {0x904ef, 0x0}, ++ {0x904f0, 0x0}, ++ {0x904f1, 0x0}, ++ {0x904f2, 0x0}, ++ {0x904f3, 0x0}, ++ {0x904f4, 0x0}, ++ {0x904f5, 0x0}, ++ {0x904f6, 0x0}, ++ {0x904f7, 0x0}, ++ {0x904f8, 0x0}, ++ {0x904f9, 0x0}, ++ {0x904fa, 0x0}, ++ {0x904fb, 0x0}, ++ {0x904fc, 0x0}, ++ {0x904fd, 0x0}, ++ {0x904fe, 0x0}, ++ {0x904ff, 0x0}, ++ {0x90500, 0x0}, ++ {0x90501, 0x0}, ++ {0x90502, 0x0}, ++ {0x90503, 0x0}, ++ {0x90504, 0x0}, ++ {0x90505, 0x0}, ++ {0x90506, 0x0}, ++ {0x90507, 0x0}, ++ {0x90508, 0x0}, ++ {0x90509, 0x0}, ++ {0x9050a, 0x0}, ++ {0x9050b, 0x0}, ++ {0x9050c, 0x0}, ++ {0x9050d, 0x0}, ++ {0xd00e7, 0x0}, ++ {0x9001c, 0x0}, ++ {0x90020, 0x0}, ++ {0x90024, 0x0}, ++ {0x90025, 0x0}, ++ {0x90026, 0x0}, ++ {0x9002b, 0x0}, ++ {0x90708, 0x0}, ++ {0x90700, 0x0}, ++ {0x90701, 0x0}, ++ {0x90702, 0x0}, ++ {0x90703, 0x0}, ++ {0x90704, 0x0}, ++ {0x90705, 0x0}, ++ {0x90706, 0x0}, ++ {0x90707, 0x0}, ++ {0x2018a, 0x0}, ++ {0x20124, 0x0}, ++ {0x2018b, 0x0}, ++ {0x20125, 0x0}, ++ {0x2018c, 0x0}, ++ {0x20126, 0x0}, ++ {0x2018d, 0x0}, ++ {0x20127, 0x0}, ++ {0x2018e, 0x0}, ++ {0x20128, 0x0}, ++ {0x2018f, 0x0}, ++ {0x20129, 0x0}, ++ {0x20190, 0x0}, ++ {0x2012a, 0x0}, ++ {0x20191, 0x0}, ++ {0x2012b, 0x0}, ++ {0x20192, 0x0}, ++ {0x2012c, 0x0}, ++ {0x20193, 0x0}, ++ {0x2012d, 0x0}, ++ {0x20194, 0x0}, ++ {0x2012e, 0x0}, ++ {0x20195, 0x0}, ++ {0x2012f, 0x0}, ++ {0x20196, 0x0}, ++ {0x20130, 0x0}, ++ {0x20197, 0x0}, ++ {0x20131, 0x0}, ++ {0x20198, 0x0}, ++ {0x20132, 0x0}, ++ {0x20199, 0x0}, ++ {0x20133, 0x0}, ++ {0x2019a, 0x0}, ++ {0x20134, 0x0}, ++ {0x2019b, 0x0}, ++ {0x20135, 0x0}, ++ {0x2019c, 0x0}, ++ {0x20136, 0x0}, ++ {0x2019d, 0x0}, ++ {0x20137, 0x0}, ++ {0x2019e, 0x0}, ++ {0x20138, 0x0}, ++ {0x2019f, 0x0}, ++ {0x20139, 0x0}, ++ {0x201a0, 0x0}, ++ {0x2013a, 0x0}, ++ {0x201a1, 0x0}, ++ {0x2013b, 0x0}, ++ {0x201a2, 0x0}, ++ {0x2013c, 0x0}, ++ {0x201a3, 0x0}, ++ {0x2013d, 0x0}, ++ {0x201a4, 0x0}, ++ {0x2013e, 0x0}, ++ {0x201a5, 0x0}, ++ {0x2013f, 0x0}, ++ {0x201a6, 0x0}, ++ {0x20140, 0x0}, ++ {0x201a7, 0x0}, ++ {0x20141, 0x0}, ++ {0x201a8, 0x0}, ++ {0x20142, 0x0}, ++ {0x201a9, 0x0}, ++ {0x20143, 0x0}, ++ {0x201aa, 0x0}, ++ {0x20144, 0x0}, ++ {0x201ab, 0x0}, ++ {0x20145, 0x0}, ++ {0x201ac, 0x0}, ++ {0x20146, 0x0}, ++ {0x201ad, 0x0}, ++ {0x20147, 0x0}, ++ {0x201ae, 0x0}, ++ {0x20148, 0x0}, ++ {0x201af, 0x0}, ++ {0x20149, 0x0}, ++ {0x201b0, 0x0}, ++ {0x2014a, 0x0}, ++ {0x201b1, 0x0}, ++ {0x2014b, 0x0}, ++ {0x201b2, 0x0}, ++ {0x2014c, 0x0}, ++ {0x201b3, 0x0}, ++ {0x2014d, 0x0}, ++ {0x201b4, 0x0}, ++ {0x2014e, 0x0}, ++ {0x201b5, 0x0}, ++ {0x2014f, 0x0}, ++ {0x201b6, 0x0}, ++ {0x20150, 0x0}, ++ {0x201b7, 0x0}, ++ {0x20151, 0x0}, ++ {0x201b8, 0x0}, ++ {0x20152, 0x0}, ++ {0x201b9, 0x0}, ++ {0x20153, 0x0}, ++ {0x201ba, 0x0}, ++ {0x20154, 0x0}, ++ {0x201bb, 0x0}, ++ {0x20155, 0x0}, ++ {0x201bc, 0x0}, ++ {0x20156, 0x0}, ++ {0x201bd, 0x0}, ++ {0x20157, 0x0}, ++ {0x201be, 0x0}, ++ {0x20158, 0x0}, ++ {0x201bf, 0x0}, ++ {0x20159, 0x0}, ++ {0x201c0, 0x0}, ++ {0x2015a, 0x0}, ++ {0x201c1, 0x0}, ++ {0x2015b, 0x0}, ++ {0x201c2, 0x0}, ++ {0x2015c, 0x0}, ++ {0x201c3, 0x0}, ++ {0x2015d, 0x0}, ++ {0x201c4, 0x0}, ++ {0x2015e, 0x0}, ++ {0x201c5, 0x0}, ++ {0x2015f, 0x0}, ++ {0x201c6, 0x0}, ++ {0x20160, 0x0}, ++ {0x201c7, 0x0}, ++ {0x20161, 0x0}, ++ {0x201c8, 0x0}, ++ {0x20162, 0x0}, ++ {0x201c9, 0x0}, ++ {0x20163, 0x0}, ++ {0x201ca, 0x0}, ++ {0x20164, 0x0}, ++ {0x201cb, 0x0}, ++ {0x20165, 0x0}, ++ {0x201cc, 0x0}, ++ {0x20166, 0x0}, ++ {0x201cd, 0x0}, ++ {0x20167, 0x0}, ++ {0x201ce, 0x0}, ++ {0x20168, 0x0}, ++ {0x201cf, 0x0}, ++ {0x20169, 0x0}, ++ {0x201d0, 0x0}, ++ {0x2016a, 0x0}, ++ {0x201d1, 0x0}, ++ {0x2016b, 0x0}, ++ {0x201d2, 0x0}, ++ {0x2016c, 0x0}, ++ {0x201d3, 0x0}, ++ {0x2016d, 0x0}, ++ {0x201d4, 0x0}, ++ {0x2016e, 0x0}, ++ {0x201d5, 0x0}, ++ {0x2016f, 0x0}, ++ {0x201d6, 0x0}, ++ {0x20170, 0x0}, ++ {0x201d7, 0x0}, ++ {0x20171, 0x0}, ++ {0x201d8, 0x0}, ++ {0x20172, 0x0}, ++ {0x201d9, 0x0}, ++ {0x20173, 0x0}, ++ {0x201da, 0x0}, ++ {0xc0001, 0x0}, ++ {0xc0002, 0x0}, ++ {0xc0003, 0x0}, ++ {0xc0000, 0x0}, ++ {0xc0006, 0x0}, ++ {0xc0007, 0x0}, ++ {0x9070c, 0x0}, ++ {0x9070d, 0x0}, ++ {0x9070e, 0x0}, ++ {0x90c13, 0x0}, ++ {0x9070f, 0x0}, ++ {0x90710, 0x0}, ++ {0x90711, 0x0}, ++ {0x90713, 0x0}, ++ {0x90714, 0x0}, ++ {0x90715, 0x0}, ++ {0x90c12, 0x0}, ++ {0x90712, 0x0}, ++ {0x90716, 0x0}, ++ {0x90717, 0x0}, ++ {0x90718, 0x0}, ++ {0x90719, 0x0}, ++ {0x9071a, 0x0}, ++ {0x9071b, 0x0}, ++ {0x90904, 0x0}, ++ {0x90986, 0x0}, ++ {0x90920, 0x0}, ++ {0x90921, 0x0}, ++ {0x90922, 0x0}, ++ {0x90923, 0x0}, ++ {0x90924, 0x0}, ++ {0x90925, 0x0}, ++ {0x90926, 0x0}, ++ {0x90927, 0x0}, ++ {0x90930, 0x0}, ++ {0x90931, 0x0}, ++ {0x90932, 0x0}, ++ {0x90933, 0x0}, ++ {0x9090a, 0x0}, ++ {0x9090c, 0x0}, ++ {0x9090d, 0x0}, ++ {0x200f0, 0x0}, ++ {0x200f1, 0x0}, ++ {0x200f2, 0x0}, ++ {0x100b9, 0x0}, ++ {0x100b1, 0x0}, ++ {0x100ba, 0x0}, ++ {0x100a2, 0x0}, ++ {0x100b5, 0x0}, ++ {0x110b9, 0x0}, ++ {0x110b1, 0x0}, ++ {0x110ba, 0x0}, ++ {0x110a2, 0x0}, ++ {0x110b5, 0x0}, ++ {0x120b9, 0x0}, ++ {0x120b1, 0x0}, ++ {0x120ba, 0x0}, ++ {0x120a2, 0x0}, ++ {0x120b5, 0x0}, ++ {0x130b9, 0x0}, ++ {0x130b1, 0x0}, ++ {0x130ba, 0x0}, ++ {0x130a2, 0x0}, ++ {0x130b5, 0x0}, ++ {0x70024, 0x0}, ++ {0x70025, 0x0}, ++ {0x70026, 0x0}, ++ {0x70027, 0x0}, ++ {0x70028, 0x0}, ++ {0x70029, 0x0}, ++ {0x7002a, 0x0}, ++ {0x7002b, 0x0}, ++ {0x70124, 0x0}, ++ {0x70125, 0x0}, ++ {0x70126, 0x0}, ++ {0x70127, 0x0}, ++ {0x70128, 0x0}, ++ {0x70129, 0x0}, ++ {0x7012a, 0x0}, ++ {0x7012b, 0x0}, ++ {0x70224, 0x0}, ++ {0x70225, 0x0}, ++ {0x70226, 0x0}, ++ {0x70227, 0x0}, ++ {0x70228, 0x0}, ++ {0x70229, 0x0}, ++ {0x7022a, 0x0}, ++ {0x7022b, 0x0}, ++ {0x70324, 0x0}, ++ {0x70325, 0x0}, ++ {0x70326, 0x0}, ++ {0x70327, 0x0}, ++ {0x70328, 0x0}, ++ {0x70329, 0x0}, ++ {0x7032a, 0x0}, ++ {0x7032b, 0x0}, ++ {0x70424, 0x0}, ++ {0x70425, 0x0}, ++ {0x70426, 0x0}, ++ {0x70427, 0x0}, ++ {0x70428, 0x0}, ++ {0x70429, 0x0}, ++ {0x7042a, 0x0}, ++ {0x7042b, 0x0}, ++ {0x70524, 0x0}, ++ {0x70525, 0x0}, ++ {0x70526, 0x0}, ++ {0x70527, 0x0}, ++ {0x70528, 0x0}, ++ {0x70529, 0x0}, ++ {0x7052a, 0x0}, ++ {0x7052b, 0x0}, ++ {0x70624, 0x0}, ++ {0x70625, 0x0}, ++ {0x70626, 0x0}, ++ {0x70627, 0x0}, ++ {0x70628, 0x0}, ++ {0x70629, 0x0}, ++ {0x7062a, 0x0}, ++ {0x7062b, 0x0}, ++ {0x70724, 0x0}, ++ {0x70725, 0x0}, ++ {0x70726, 0x0}, ++ {0x70727, 0x0}, ++ {0x70728, 0x0}, ++ {0x70729, 0x0}, ++ {0x7072a, 0x0}, ++ {0x7072b, 0x0}, ++ {0x70824, 0x0}, ++ {0x70825, 0x0}, ++ {0x70826, 0x0}, ++ {0x70827, 0x0}, ++ {0x70828, 0x0}, ++ {0x70829, 0x0}, ++ {0x7082a, 0x0}, ++ {0x7082b, 0x0}, ++ {0x70065, 0x0}, ++ {0x2007e, 0x0}, ++ {0x200ef, 0x0}, ++ {0x90910, 0x0}, ++ {0x20310, 0x0}, ++ {0x20311, 0x0}, ++ {0x20049, 0x0}, ++ {0x100be, 0x0}, ++ {0x100b0, 0x0}, ++ {0x10080, 0x0}, ++ {0x10081, 0x0}, ++ {0x10082, 0x0}, ++ {0x10083, 0x0}, ++ {0x10084, 0x0}, ++ {0x10085, 0x0}, ++ {0x10086, 0x0}, ++ {0x10087, 0x0}, ++ {0x10056, 0x0}, ++ {0x100d9, 0x0}, ++ {0x110be, 0x0}, ++ {0x110b0, 0x0}, ++ {0x11080, 0x0}, ++ {0x11081, 0x0}, ++ {0x11082, 0x0}, ++ {0x11083, 0x0}, ++ {0x11084, 0x0}, ++ {0x11085, 0x0}, ++ {0x11086, 0x0}, ++ {0x11087, 0x0}, ++ {0x11056, 0x0}, ++ {0x110d9, 0x0}, ++ {0x120be, 0x0}, ++ {0x120b0, 0x0}, ++ {0x12080, 0x0}, ++ {0x12081, 0x0}, ++ {0x12082, 0x0}, ++ {0x12083, 0x0}, ++ {0x12084, 0x0}, ++ {0x12085, 0x0}, ++ {0x12086, 0x0}, ++ {0x12087, 0x0}, ++ {0x12056, 0x0}, ++ {0x120d9, 0x0}, ++ {0x130be, 0x0}, ++ {0x130b0, 0x0}, ++ {0x13080, 0x0}, ++ {0x13081, 0x0}, ++ {0x13082, 0x0}, ++ {0x13083, 0x0}, ++ {0x13084, 0x0}, ++ {0x13085, 0x0}, ++ {0x13086, 0x0}, ++ {0x13087, 0x0}, ++ {0x13056, 0x0}, ++ {0x130d9, 0x0}, ++ {0x30090, 0x0}, ++ {0x30091, 0x0}, ++ {0x30092, 0x0}, ++ {0x30093, 0x0}, ++ {0x30094, 0x0}, ++ {0x30095, 0x0}, ++ {0x30096, 0x0}, ++ {0x31090, 0x0}, ++ {0x31091, 0x0}, ++ {0x31092, 0x0}, ++ {0x31093, 0x0}, ++ {0x31094, 0x0}, ++ {0x31095, 0x0}, ++ {0x31096, 0x0}, ++ {0x30002, 0x0}, ++ {0x30007, 0x0}, ++ {0x30008, 0x0}, ++ {0x30005, 0x0}, ++ {0x30006, 0x0}, ++ {0x30001, 0x0}, ++ {0x30101, 0x0}, ++ {0x30201, 0x0}, ++ {0x30301, 0x0}, ++ {0x30401, 0x0}, ++ {0x30501, 0x0}, ++ {0x30601, 0x0}, ++ {0x30701, 0x0}, ++ {0x30801, 0x0}, ++ {0x30901, 0x0}, ++ {0x31002, 0x0}, ++ {0x31007, 0x0}, ++ {0x31008, 0x0}, ++ {0x31005, 0x0}, ++ {0x31006, 0x0}, ++ {0x31001, 0x0}, ++ {0x31101, 0x0}, ++ {0x31201, 0x0}, ++ {0x31301, 0x0}, ++ {0x31401, 0x0}, ++ {0x31501, 0x0}, ++ {0x31601, 0x0}, ++ {0x31701, 0x0}, ++ {0x31801, 0x0}, ++ {0x31901, 0x0}, ++ {0x10000, 0x0}, ++ {0x100ad, 0x0}, ++ {0x100af, 0x0}, ++ {0x10020, 0x0}, ++ {0x10021, 0x0}, ++ {0x10028, 0x0}, ++ {0x10029, 0x0}, ++ {0x10066, 0x0}, ++ {0x10067, 0x0}, ++ {0x1005a, 0x0}, ++ {0x1005b, 0x0}, ++ {0x1005c, 0x0}, ++ {0x1005d, 0x0}, ++ {0x1002a, 0x0}, ++ {0x1002b, 0x0}, ++ {0x10024, 0x0}, ++ {0x10025, 0x0}, ++ {0x10026, 0x0}, ++ {0x10027, 0x0}, ++ {0x10010, 0x0}, ++ {0x10011, 0x0}, ++ {0x10012, 0x0}, ++ {0x10013, 0x0}, ++ {0x10068, 0x0}, ++ {0x10069, 0x0}, ++ {0x1006a, 0x0}, ++ {0x1006b, 0x0}, ++ {0x1006c, 0x0}, ++ {0x1006d, 0x0}, ++ {0x1006e, 0x0}, ++ {0x1006f, 0x0}, ++ {0x1001c, 0x0}, ++ {0x1001d, 0x0}, ++ {0x1001e, 0x0}, ++ {0x1001f, 0x0}, ++ {0x10124, 0x0}, ++ {0x10125, 0x0}, ++ {0x10126, 0x0}, ++ {0x10127, 0x0}, ++ {0x10110, 0x0}, ++ {0x10111, 0x0}, ++ {0x10112, 0x0}, ++ {0x10113, 0x0}, ++ {0x10168, 0x0}, ++ {0x10169, 0x0}, ++ {0x1016a, 0x0}, ++ {0x1016b, 0x0}, ++ {0x1016c, 0x0}, ++ {0x1016d, 0x0}, ++ {0x1016e, 0x0}, ++ {0x1016f, 0x0}, ++ {0x1011c, 0x0}, ++ {0x1011d, 0x0}, ++ {0x1011e, 0x0}, ++ {0x1011f, 0x0}, ++ {0x10224, 0x0}, ++ {0x10225, 0x0}, ++ {0x10226, 0x0}, ++ {0x10227, 0x0}, ++ {0x10210, 0x0}, ++ {0x10211, 0x0}, ++ {0x10212, 0x0}, ++ {0x10213, 0x0}, ++ {0x10268, 0x0}, ++ {0x10269, 0x0}, ++ {0x1026a, 0x0}, ++ {0x1026b, 0x0}, ++ {0x1026c, 0x0}, ++ {0x1026d, 0x0}, ++ {0x1026e, 0x0}, ++ {0x1026f, 0x0}, ++ {0x1021c, 0x0}, ++ {0x1021d, 0x0}, ++ {0x1021e, 0x0}, ++ {0x1021f, 0x0}, ++ {0x10324, 0x0}, ++ {0x10325, 0x0}, ++ {0x10326, 0x0}, ++ {0x10327, 0x0}, ++ {0x10310, 0x0}, ++ {0x10311, 0x0}, ++ {0x10312, 0x0}, ++ {0x10313, 0x0}, ++ {0x10368, 0x0}, ++ {0x10369, 0x0}, ++ {0x1036a, 0x0}, ++ {0x1036b, 0x0}, ++ {0x1036c, 0x0}, ++ {0x1036d, 0x0}, ++ {0x1036e, 0x0}, ++ {0x1036f, 0x0}, ++ {0x1031c, 0x0}, ++ {0x1031d, 0x0}, ++ {0x1031e, 0x0}, ++ {0x1031f, 0x0}, ++ {0x10424, 0x0}, ++ {0x10425, 0x0}, ++ {0x10426, 0x0}, ++ {0x10427, 0x0}, ++ {0x10410, 0x0}, ++ {0x10411, 0x0}, ++ {0x10412, 0x0}, ++ {0x10413, 0x0}, ++ {0x10468, 0x0}, ++ {0x10469, 0x0}, ++ {0x1046a, 0x0}, ++ {0x1046b, 0x0}, ++ {0x1046c, 0x0}, ++ {0x1046d, 0x0}, ++ {0x1046e, 0x0}, ++ {0x1046f, 0x0}, ++ {0x1041c, 0x0}, ++ {0x1041d, 0x0}, ++ {0x1041e, 0x0}, ++ {0x1041f, 0x0}, ++ {0x10524, 0x0}, ++ {0x10525, 0x0}, ++ {0x10526, 0x0}, ++ {0x10527, 0x0}, ++ {0x10510, 0x0}, ++ {0x10511, 0x0}, ++ {0x10512, 0x0}, ++ {0x10513, 0x0}, ++ {0x10568, 0x0}, ++ {0x10569, 0x0}, ++ {0x1056a, 0x0}, ++ {0x1056b, 0x0}, ++ {0x1056c, 0x0}, ++ {0x1056d, 0x0}, ++ {0x1056e, 0x0}, ++ {0x1056f, 0x0}, ++ {0x1051c, 0x0}, ++ {0x1051d, 0x0}, ++ {0x1051e, 0x0}, ++ {0x1051f, 0x0}, ++ {0x10624, 0x0}, ++ {0x10625, 0x0}, ++ {0x10626, 0x0}, ++ {0x10627, 0x0}, ++ {0x10610, 0x0}, ++ {0x10611, 0x0}, ++ {0x10612, 0x0}, ++ {0x10613, 0x0}, ++ {0x10668, 0x0}, ++ {0x10669, 0x0}, ++ {0x1066a, 0x0}, ++ {0x1066b, 0x0}, ++ {0x1066c, 0x0}, ++ {0x1066d, 0x0}, ++ {0x1066e, 0x0}, ++ {0x1066f, 0x0}, ++ {0x1061c, 0x0}, ++ {0x1061d, 0x0}, ++ {0x1061e, 0x0}, ++ {0x1061f, 0x0}, ++ {0x10724, 0x0}, ++ {0x10725, 0x0}, ++ {0x10726, 0x0}, ++ {0x10727, 0x0}, ++ {0x10710, 0x0}, ++ {0x10711, 0x0}, ++ {0x10712, 0x0}, ++ {0x10713, 0x0}, ++ {0x10768, 0x0}, ++ {0x10769, 0x0}, ++ {0x1076a, 0x0}, ++ {0x1076b, 0x0}, ++ {0x1076c, 0x0}, ++ {0x1076d, 0x0}, ++ {0x1076e, 0x0}, ++ {0x1076f, 0x0}, ++ {0x1071c, 0x0}, ++ {0x1071d, 0x0}, ++ {0x1071e, 0x0}, ++ {0x1071f, 0x0}, ++ {0x10824, 0x0}, ++ {0x10825, 0x0}, ++ {0x10826, 0x0}, ++ {0x10827, 0x0}, ++ {0x10810, 0x0}, ++ {0x10811, 0x0}, ++ {0x10812, 0x0}, ++ {0x10813, 0x0}, ++ {0x10868, 0x0}, ++ {0x10869, 0x0}, ++ {0x1086a, 0x0}, ++ {0x1086b, 0x0}, ++ {0x1086c, 0x0}, ++ {0x1086d, 0x0}, ++ {0x1086e, 0x0}, ++ {0x1086f, 0x0}, ++ {0x1081c, 0x0}, ++ {0x1081d, 0x0}, ++ {0x1081e, 0x0}, ++ {0x1081f, 0x0}, ++ {0x1000c, 0x0}, ++ {0x1000d, 0x0}, ++ {0x10015, 0x0}, ++ {0x10016, 0x0}, ++ {0x10019, 0x0}, ++ {0x1001b, 0x0}, ++ {0x10022, 0x0}, ++ {0x10023, 0x0}, ++ {0x100d0, 0x0}, ++ {0x100d1, 0x0}, ++ {0x100d2, 0x0}, ++ {0x100d3, 0x0}, ++ {0x100d4, 0x0}, ++ {0x11000, 0x0}, ++ {0x110ad, 0x0}, ++ {0x110af, 0x0}, ++ {0x11020, 0x0}, ++ {0x11021, 0x0}, ++ {0x11028, 0x0}, ++ {0x11029, 0x0}, ++ {0x11066, 0x0}, ++ {0x11067, 0x0}, ++ {0x1105a, 0x0}, ++ {0x1105b, 0x0}, ++ {0x1105c, 0x0}, ++ {0x1105d, 0x0}, ++ {0x1102a, 0x0}, ++ {0x1102b, 0x0}, ++ {0x11024, 0x0}, ++ {0x11025, 0x0}, ++ {0x11026, 0x0}, ++ {0x11027, 0x0}, ++ {0x11010, 0x0}, ++ {0x11011, 0x0}, ++ {0x11012, 0x0}, ++ {0x11013, 0x0}, ++ {0x11068, 0x0}, ++ {0x11069, 0x0}, ++ {0x1106a, 0x0}, ++ {0x1106b, 0x0}, ++ {0x1106c, 0x0}, ++ {0x1106d, 0x0}, ++ {0x1106e, 0x0}, ++ {0x1106f, 0x0}, ++ {0x1101c, 0x0}, ++ {0x1101d, 0x0}, ++ {0x1101e, 0x0}, ++ {0x1101f, 0x0}, ++ {0x11124, 0x0}, ++ {0x11125, 0x0}, ++ {0x11126, 0x0}, ++ {0x11127, 0x0}, ++ {0x11110, 0x0}, ++ {0x11111, 0x0}, ++ {0x11112, 0x0}, ++ {0x11113, 0x0}, ++ {0x11168, 0x0}, ++ {0x11169, 0x0}, ++ {0x1116a, 0x0}, ++ {0x1116b, 0x0}, ++ {0x1116c, 0x0}, ++ {0x1116d, 0x0}, ++ {0x1116e, 0x0}, ++ {0x1116f, 0x0}, ++ {0x1111c, 0x0}, ++ {0x1111d, 0x0}, ++ {0x1111e, 0x0}, ++ {0x1111f, 0x0}, ++ {0x11224, 0x0}, ++ {0x11225, 0x0}, ++ {0x11226, 0x0}, ++ {0x11227, 0x0}, ++ {0x11210, 0x0}, ++ {0x11211, 0x0}, ++ {0x11212, 0x0}, ++ {0x11213, 0x0}, ++ {0x11268, 0x0}, ++ {0x11269, 0x0}, ++ {0x1126a, 0x0}, ++ {0x1126b, 0x0}, ++ {0x1126c, 0x0}, ++ {0x1126d, 0x0}, ++ {0x1126e, 0x0}, ++ {0x1126f, 0x0}, ++ {0x1121c, 0x0}, ++ {0x1121d, 0x0}, ++ {0x1121e, 0x0}, ++ {0x1121f, 0x0}, ++ {0x11324, 0x0}, ++ {0x11325, 0x0}, ++ {0x11326, 0x0}, ++ {0x11327, 0x0}, ++ {0x11310, 0x0}, ++ {0x11311, 0x0}, ++ {0x11312, 0x0}, ++ {0x11313, 0x0}, ++ {0x11368, 0x0}, ++ {0x11369, 0x0}, ++ {0x1136a, 0x0}, ++ {0x1136b, 0x0}, ++ {0x1136c, 0x0}, ++ {0x1136d, 0x0}, ++ {0x1136e, 0x0}, ++ {0x1136f, 0x0}, ++ {0x1131c, 0x0}, ++ {0x1131d, 0x0}, ++ {0x1131e, 0x0}, ++ {0x1131f, 0x0}, ++ {0x11424, 0x0}, ++ {0x11425, 0x0}, ++ {0x11426, 0x0}, ++ {0x11427, 0x0}, ++ {0x11410, 0x0}, ++ {0x11411, 0x0}, ++ {0x11412, 0x0}, ++ {0x11413, 0x0}, ++ {0x11468, 0x0}, ++ {0x11469, 0x0}, ++ {0x1146a, 0x0}, ++ {0x1146b, 0x0}, ++ {0x1146c, 0x0}, ++ {0x1146d, 0x0}, ++ {0x1146e, 0x0}, ++ {0x1146f, 0x0}, ++ {0x1141c, 0x0}, ++ {0x1141d, 0x0}, ++ {0x1141e, 0x0}, ++ {0x1141f, 0x0}, ++ {0x11524, 0x0}, ++ {0x11525, 0x0}, ++ {0x11526, 0x0}, ++ {0x11527, 0x0}, ++ {0x11510, 0x0}, ++ {0x11511, 0x0}, ++ {0x11512, 0x0}, ++ {0x11513, 0x0}, ++ {0x11568, 0x0}, ++ {0x11569, 0x0}, ++ {0x1156a, 0x0}, ++ {0x1156b, 0x0}, ++ {0x1156c, 0x0}, ++ {0x1156d, 0x0}, ++ {0x1156e, 0x0}, ++ {0x1156f, 0x0}, ++ {0x1151c, 0x0}, ++ {0x1151d, 0x0}, ++ {0x1151e, 0x0}, ++ {0x1151f, 0x0}, ++ {0x11624, 0x0}, ++ {0x11625, 0x0}, ++ {0x11626, 0x0}, ++ {0x11627, 0x0}, ++ {0x11610, 0x0}, ++ {0x11611, 0x0}, ++ {0x11612, 0x0}, ++ {0x11613, 0x0}, ++ {0x11668, 0x0}, ++ {0x11669, 0x0}, ++ {0x1166a, 0x0}, ++ {0x1166b, 0x0}, ++ {0x1166c, 0x0}, ++ {0x1166d, 0x0}, ++ {0x1166e, 0x0}, ++ {0x1166f, 0x0}, ++ {0x1161c, 0x0}, ++ {0x1161d, 0x0}, ++ {0x1161e, 0x0}, ++ {0x1161f, 0x0}, ++ {0x11724, 0x0}, ++ {0x11725, 0x0}, ++ {0x11726, 0x0}, ++ {0x11727, 0x0}, ++ {0x11710, 0x0}, ++ {0x11711, 0x0}, ++ {0x11712, 0x0}, ++ {0x11713, 0x0}, ++ {0x11768, 0x0}, ++ {0x11769, 0x0}, ++ {0x1176a, 0x0}, ++ {0x1176b, 0x0}, ++ {0x1176c, 0x0}, ++ {0x1176d, 0x0}, ++ {0x1176e, 0x0}, ++ {0x1176f, 0x0}, ++ {0x1171c, 0x0}, ++ {0x1171d, 0x0}, ++ {0x1171e, 0x0}, ++ {0x1171f, 0x0}, ++ {0x11824, 0x0}, ++ {0x11825, 0x0}, ++ {0x11826, 0x0}, ++ {0x11827, 0x0}, ++ {0x11810, 0x0}, ++ {0x11811, 0x0}, ++ {0x11812, 0x0}, ++ {0x11813, 0x0}, ++ {0x11868, 0x0}, ++ {0x11869, 0x0}, ++ {0x1186a, 0x0}, ++ {0x1186b, 0x0}, ++ {0x1186c, 0x0}, ++ {0x1186d, 0x0}, ++ {0x1186e, 0x0}, ++ {0x1186f, 0x0}, ++ {0x1181c, 0x0}, ++ {0x1181d, 0x0}, ++ {0x1181e, 0x0}, ++ {0x1181f, 0x0}, ++ {0x1100c, 0x0}, ++ {0x1100d, 0x0}, ++ {0x11015, 0x0}, ++ {0x11016, 0x0}, ++ {0x11019, 0x0}, ++ {0x1101b, 0x0}, ++ {0x11022, 0x0}, ++ {0x11023, 0x0}, ++ {0x110d0, 0x0}, ++ {0x110d1, 0x0}, ++ {0x110d2, 0x0}, ++ {0x110d3, 0x0}, ++ {0x110d4, 0x0}, ++ {0x12000, 0x0}, ++ {0x120ad, 0x0}, ++ {0x120af, 0x0}, ++ {0x12020, 0x0}, ++ {0x12021, 0x0}, ++ {0x12028, 0x0}, ++ {0x12029, 0x0}, ++ {0x12066, 0x0}, ++ {0x12067, 0x0}, ++ {0x1205a, 0x0}, ++ {0x1205b, 0x0}, ++ {0x1205c, 0x0}, ++ {0x1205d, 0x0}, ++ {0x1202a, 0x0}, ++ {0x1202b, 0x0}, ++ {0x12024, 0x0}, ++ {0x12025, 0x0}, ++ {0x12026, 0x0}, ++ {0x12027, 0x0}, ++ {0x12010, 0x0}, ++ {0x12011, 0x0}, ++ {0x12012, 0x0}, ++ {0x12013, 0x0}, ++ {0x12068, 0x0}, ++ {0x12069, 0x0}, ++ {0x1206a, 0x0}, ++ {0x1206b, 0x0}, ++ {0x1206c, 0x0}, ++ {0x1206d, 0x0}, ++ {0x1206e, 0x0}, ++ {0x1206f, 0x0}, ++ {0x1201c, 0x0}, ++ {0x1201d, 0x0}, ++ {0x1201e, 0x0}, ++ {0x1201f, 0x0}, ++ {0x12124, 0x0}, ++ {0x12125, 0x0}, ++ {0x12126, 0x0}, ++ {0x12127, 0x0}, ++ {0x12110, 0x0}, ++ {0x12111, 0x0}, ++ {0x12112, 0x0}, ++ {0x12113, 0x0}, ++ {0x12168, 0x0}, ++ {0x12169, 0x0}, ++ {0x1216a, 0x0}, ++ {0x1216b, 0x0}, ++ {0x1216c, 0x0}, ++ {0x1216d, 0x0}, ++ {0x1216e, 0x0}, ++ {0x1216f, 0x0}, ++ {0x1211c, 0x0}, ++ {0x1211d, 0x0}, ++ {0x1211e, 0x0}, ++ {0x1211f, 0x0}, ++ {0x12224, 0x0}, ++ {0x12225, 0x0}, ++ {0x12226, 0x0}, ++ {0x12227, 0x0}, ++ {0x12210, 0x0}, ++ {0x12211, 0x0}, ++ {0x12212, 0x0}, ++ {0x12213, 0x0}, ++ {0x12268, 0x0}, ++ {0x12269, 0x0}, ++ {0x1226a, 0x0}, ++ {0x1226b, 0x0}, ++ {0x1226c, 0x0}, ++ {0x1226d, 0x0}, ++ {0x1226e, 0x0}, ++ {0x1226f, 0x0}, ++ {0x1221c, 0x0}, ++ {0x1221d, 0x0}, ++ {0x1221e, 0x0}, ++ {0x1221f, 0x0}, ++ {0x12324, 0x0}, ++ {0x12325, 0x0}, ++ {0x12326, 0x0}, ++ {0x12327, 0x0}, ++ {0x12310, 0x0}, ++ {0x12311, 0x0}, ++ {0x12312, 0x0}, ++ {0x12313, 0x0}, ++ {0x12368, 0x0}, ++ {0x12369, 0x0}, ++ {0x1236a, 0x0}, ++ {0x1236b, 0x0}, ++ {0x1236c, 0x0}, ++ {0x1236d, 0x0}, ++ {0x1236e, 0x0}, ++ {0x1236f, 0x0}, ++ {0x1231c, 0x0}, ++ {0x1231d, 0x0}, ++ {0x1231e, 0x0}, ++ {0x1231f, 0x0}, ++ {0x12424, 0x0}, ++ {0x12425, 0x0}, ++ {0x12426, 0x0}, ++ {0x12427, 0x0}, ++ {0x12410, 0x0}, ++ {0x12411, 0x0}, ++ {0x12412, 0x0}, ++ {0x12413, 0x0}, ++ {0x12468, 0x0}, ++ {0x12469, 0x0}, ++ {0x1246a, 0x0}, ++ {0x1246b, 0x0}, ++ {0x1246c, 0x0}, ++ {0x1246d, 0x0}, ++ {0x1246e, 0x0}, ++ {0x1246f, 0x0}, ++ {0x1241c, 0x0}, ++ {0x1241d, 0x0}, ++ {0x1241e, 0x0}, ++ {0x1241f, 0x0}, ++ {0x12524, 0x0}, ++ {0x12525, 0x0}, ++ {0x12526, 0x0}, ++ {0x12527, 0x0}, ++ {0x12510, 0x0}, ++ {0x12511, 0x0}, ++ {0x12512, 0x0}, ++ {0x12513, 0x0}, ++ {0x12568, 0x0}, ++ {0x12569, 0x0}, ++ {0x1256a, 0x0}, ++ {0x1256b, 0x0}, ++ {0x1256c, 0x0}, ++ {0x1256d, 0x0}, ++ {0x1256e, 0x0}, ++ {0x1256f, 0x0}, ++ {0x1251c, 0x0}, ++ {0x1251d, 0x0}, ++ {0x1251e, 0x0}, ++ {0x1251f, 0x0}, ++ {0x12624, 0x0}, ++ {0x12625, 0x0}, ++ {0x12626, 0x0}, ++ {0x12627, 0x0}, ++ {0x12610, 0x0}, ++ {0x12611, 0x0}, ++ {0x12612, 0x0}, ++ {0x12613, 0x0}, ++ {0x12668, 0x0}, ++ {0x12669, 0x0}, ++ {0x1266a, 0x0}, ++ {0x1266b, 0x0}, ++ {0x1266c, 0x0}, ++ {0x1266d, 0x0}, ++ {0x1266e, 0x0}, ++ {0x1266f, 0x0}, ++ {0x1261c, 0x0}, ++ {0x1261d, 0x0}, ++ {0x1261e, 0x0}, ++ {0x1261f, 0x0}, ++ {0x12724, 0x0}, ++ {0x12725, 0x0}, ++ {0x12726, 0x0}, ++ {0x12727, 0x0}, ++ {0x12710, 0x0}, ++ {0x12711, 0x0}, ++ {0x12712, 0x0}, ++ {0x12713, 0x0}, ++ {0x12768, 0x0}, ++ {0x12769, 0x0}, ++ {0x1276a, 0x0}, ++ {0x1276b, 0x0}, ++ {0x1276c, 0x0}, ++ {0x1276d, 0x0}, ++ {0x1276e, 0x0}, ++ {0x1276f, 0x0}, ++ {0x1271c, 0x0}, ++ {0x1271d, 0x0}, ++ {0x1271e, 0x0}, ++ {0x1271f, 0x0}, ++ {0x12824, 0x0}, ++ {0x12825, 0x0}, ++ {0x12826, 0x0}, ++ {0x12827, 0x0}, ++ {0x12810, 0x0}, ++ {0x12811, 0x0}, ++ {0x12812, 0x0}, ++ {0x12813, 0x0}, ++ {0x12868, 0x0}, ++ {0x12869, 0x0}, ++ {0x1286a, 0x0}, ++ {0x1286b, 0x0}, ++ {0x1286c, 0x0}, ++ {0x1286d, 0x0}, ++ {0x1286e, 0x0}, ++ {0x1286f, 0x0}, ++ {0x1281c, 0x0}, ++ {0x1281d, 0x0}, ++ {0x1281e, 0x0}, ++ {0x1281f, 0x0}, ++ {0x1200c, 0x0}, ++ {0x1200d, 0x0}, ++ {0x12015, 0x0}, ++ {0x12016, 0x0}, ++ {0x12019, 0x0}, ++ {0x1201b, 0x0}, ++ {0x12022, 0x0}, ++ {0x12023, 0x0}, ++ {0x120d0, 0x0}, ++ {0x120d1, 0x0}, ++ {0x120d2, 0x0}, ++ {0x120d3, 0x0}, ++ {0x120d4, 0x0}, ++ {0x13000, 0x0}, ++ {0x130ad, 0x0}, ++ {0x130af, 0x0}, ++ {0x13020, 0x0}, ++ {0x13021, 0x0}, ++ {0x13028, 0x0}, ++ {0x13029, 0x0}, ++ {0x13066, 0x0}, ++ {0x13067, 0x0}, ++ {0x1305a, 0x0}, ++ {0x1305b, 0x0}, ++ {0x1305c, 0x0}, ++ {0x1305d, 0x0}, ++ {0x1302a, 0x0}, ++ {0x1302b, 0x0}, ++ {0x13024, 0x0}, ++ {0x13025, 0x0}, ++ {0x13026, 0x0}, ++ {0x13027, 0x0}, ++ {0x13010, 0x0}, ++ {0x13011, 0x0}, ++ {0x13012, 0x0}, ++ {0x13013, 0x0}, ++ {0x13068, 0x0}, ++ {0x13069, 0x0}, ++ {0x1306a, 0x0}, ++ {0x1306b, 0x0}, ++ {0x1306c, 0x0}, ++ {0x1306d, 0x0}, ++ {0x1306e, 0x0}, ++ {0x1306f, 0x0}, ++ {0x1301c, 0x0}, ++ {0x1301d, 0x0}, ++ {0x1301e, 0x0}, ++ {0x1301f, 0x0}, ++ {0x13124, 0x0}, ++ {0x13125, 0x0}, ++ {0x13126, 0x0}, ++ {0x13127, 0x0}, ++ {0x13110, 0x0}, ++ {0x13111, 0x0}, ++ {0x13112, 0x0}, ++ {0x13113, 0x0}, ++ {0x13168, 0x0}, ++ {0x13169, 0x0}, ++ {0x1316a, 0x0}, ++ {0x1316b, 0x0}, ++ {0x1316c, 0x0}, ++ {0x1316d, 0x0}, ++ {0x1316e, 0x0}, ++ {0x1316f, 0x0}, ++ {0x1311c, 0x0}, ++ {0x1311d, 0x0}, ++ {0x1311e, 0x0}, ++ {0x1311f, 0x0}, ++ {0x13224, 0x0}, ++ {0x13225, 0x0}, ++ {0x13226, 0x0}, ++ {0x13227, 0x0}, ++ {0x13210, 0x0}, ++ {0x13211, 0x0}, ++ {0x13212, 0x0}, ++ {0x13213, 0x0}, ++ {0x13268, 0x0}, ++ {0x13269, 0x0}, ++ {0x1326a, 0x0}, ++ {0x1326b, 0x0}, ++ {0x1326c, 0x0}, ++ {0x1326d, 0x0}, ++ {0x1326e, 0x0}, ++ {0x1326f, 0x0}, ++ {0x1321c, 0x0}, ++ {0x1321d, 0x0}, ++ {0x1321e, 0x0}, ++ {0x1321f, 0x0}, ++ {0x13324, 0x0}, ++ {0x13325, 0x0}, ++ {0x13326, 0x0}, ++ {0x13327, 0x0}, ++ {0x13310, 0x0}, ++ {0x13311, 0x0}, ++ {0x13312, 0x0}, ++ {0x13313, 0x0}, ++ {0x13368, 0x0}, ++ {0x13369, 0x0}, ++ {0x1336a, 0x0}, ++ {0x1336b, 0x0}, ++ {0x1336c, 0x0}, ++ {0x1336d, 0x0}, ++ {0x1336e, 0x0}, ++ {0x1336f, 0x0}, ++ {0x1331c, 0x0}, ++ {0x1331d, 0x0}, ++ {0x1331e, 0x0}, ++ {0x1331f, 0x0}, ++ {0x13424, 0x0}, ++ {0x13425, 0x0}, ++ {0x13426, 0x0}, ++ {0x13427, 0x0}, ++ {0x13410, 0x0}, ++ {0x13411, 0x0}, ++ {0x13412, 0x0}, ++ {0x13413, 0x0}, ++ {0x13468, 0x0}, ++ {0x13469, 0x0}, ++ {0x1346a, 0x0}, ++ {0x1346b, 0x0}, ++ {0x1346c, 0x0}, ++ {0x1346d, 0x0}, ++ {0x1346e, 0x0}, ++ {0x1346f, 0x0}, ++ {0x1341c, 0x0}, ++ {0x1341d, 0x0}, ++ {0x1341e, 0x0}, ++ {0x1341f, 0x0}, ++ {0x13524, 0x0}, ++ {0x13525, 0x0}, ++ {0x13526, 0x0}, ++ {0x13527, 0x0}, ++ {0x13510, 0x0}, ++ {0x13511, 0x0}, ++ {0x13512, 0x0}, ++ {0x13513, 0x0}, ++ {0x13568, 0x0}, ++ {0x13569, 0x0}, ++ {0x1356a, 0x0}, ++ {0x1356b, 0x0}, ++ {0x1356c, 0x0}, ++ {0x1356d, 0x0}, ++ {0x1356e, 0x0}, ++ {0x1356f, 0x0}, ++ {0x1351c, 0x0}, ++ {0x1351d, 0x0}, ++ {0x1351e, 0x0}, ++ {0x1351f, 0x0}, ++ {0x13624, 0x0}, ++ {0x13625, 0x0}, ++ {0x13626, 0x0}, ++ {0x13627, 0x0}, ++ {0x13610, 0x0}, ++ {0x13611, 0x0}, ++ {0x13612, 0x0}, ++ {0x13613, 0x0}, ++ {0x13668, 0x0}, ++ {0x13669, 0x0}, ++ {0x1366a, 0x0}, ++ {0x1366b, 0x0}, ++ {0x1366c, 0x0}, ++ {0x1366d, 0x0}, ++ {0x1366e, 0x0}, ++ {0x1366f, 0x0}, ++ {0x1361c, 0x0}, ++ {0x1361d, 0x0}, ++ {0x1361e, 0x0}, ++ {0x1361f, 0x0}, ++ {0x13724, 0x0}, ++ {0x13725, 0x0}, ++ {0x13726, 0x0}, ++ {0x13727, 0x0}, ++ {0x13710, 0x0}, ++ {0x13711, 0x0}, ++ {0x13712, 0x0}, ++ {0x13713, 0x0}, ++ {0x13768, 0x0}, ++ {0x13769, 0x0}, ++ {0x1376a, 0x0}, ++ {0x1376b, 0x0}, ++ {0x1376c, 0x0}, ++ {0x1376d, 0x0}, ++ {0x1376e, 0x0}, ++ {0x1376f, 0x0}, ++ {0x1371c, 0x0}, ++ {0x1371d, 0x0}, ++ {0x1371e, 0x0}, ++ {0x1371f, 0x0}, ++ {0x13824, 0x0}, ++ {0x13825, 0x0}, ++ {0x13826, 0x0}, ++ {0x13827, 0x0}, ++ {0x13810, 0x0}, ++ {0x13811, 0x0}, ++ {0x13812, 0x0}, ++ {0x13813, 0x0}, ++ {0x13868, 0x0}, ++ {0x13869, 0x0}, ++ {0x1386a, 0x0}, ++ {0x1386b, 0x0}, ++ {0x1386c, 0x0}, ++ {0x1386d, 0x0}, ++ {0x1386e, 0x0}, ++ {0x1386f, 0x0}, ++ {0x1381c, 0x0}, ++ {0x1381d, 0x0}, ++ {0x1381e, 0x0}, ++ {0x1381f, 0x0}, ++ {0x1300c, 0x0}, ++ {0x1300d, 0x0}, ++ {0x13015, 0x0}, ++ {0x13016, 0x0}, ++ {0x13019, 0x0}, ++ {0x1301b, 0x0}, ++ {0x13022, 0x0}, ++ {0x13023, 0x0}, ++ {0x130d0, 0x0}, ++ {0x130d1, 0x0}, ++ {0x130d2, 0x0}, ++ {0x130d3, 0x0}, ++ {0x130d4, 0x0}, ++ {0x90807, 0x0}, ++ {0x90808, 0x0}, ++ {0x90813, 0x0}, ++ {0x2004e, 0x0}, ++ {0x2000d, 0x0}, ++ {0x20077, 0x0}, ++}; ++ ++/* PHY Initialize Configuration for Pstate 0 */ ++static struct ddrphy_cfg_param ddr_phy_fsp0_cfg[] = { ++ {0x90802, 0x1}, ++ {0x2004a, 0x601}, ++ {0x2004b, 0x1c3e}, ++ {0x2004c, 0x2e8f}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x101}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20002, 0x2}, ++ {0x20000, 0x2}, ++ {0x90801, 0x4d}, ++ {0x90809, 0x6800}, ++ {0x1005e, 0x366}, ++ {0x10060, 0x366}, ++ {0x10062, 0x366}, ++ {0x10064, 0x366}, ++ {0x1005f, 0x366}, ++ {0x10061, 0x366}, ++ {0x10063, 0x366}, ++ {0x10065, 0x366}, ++ {0x1105e, 0x366}, ++ {0x11060, 0x366}, ++ {0x11062, 0x366}, ++ {0x11064, 0x366}, ++ {0x1105f, 0x366}, ++ {0x11061, 0x366}, ++ {0x11063, 0x366}, ++ {0x11065, 0x366}, ++ {0x1205e, 0x366}, ++ {0x12060, 0x366}, ++ {0x12062, 0x366}, ++ {0x12064, 0x366}, ++ {0x1205f, 0x366}, ++ {0x12061, 0x366}, ++ {0x12063, 0x366}, ++ {0x12065, 0x366}, ++ {0x1305e, 0x366}, ++ {0x13060, 0x366}, ++ {0x13062, 0x366}, ++ {0x13064, 0x366}, ++ {0x1305f, 0x366}, ++ {0x13061, 0x366}, ++ {0x13063, 0x366}, ++ {0x13065, 0x366}, ++ {0x10005, 0x0}, ++ {0x1000b, 0x0}, ++ {0x11005, 0x0}, ++ {0x1100b, 0x0}, ++ {0x12005, 0x0}, ++ {0x1200b, 0x0}, ++ {0x13005, 0x0}, ++ {0x1300b, 0x0}, ++ {0x20007, 0x200}, ++ {0x20013, 0x2c}, ++ {0x30038, 0x3}, ++ {0x30039, 0x3}, ++ {0x3003a, 0x3}, ++ {0x31038, 0x3}, ++ {0x31039, 0x3}, ++ {0x3103a, 0x3}, ++ {0x10038, 0x3}, ++ {0x1003a, 0x3}, ++ {0x11038, 0x3}, ++ {0x1103a, 0x3}, ++ {0x12038, 0x3}, ++ {0x1203a, 0x3}, ++ {0x13038, 0x3}, ++ {0x1303a, 0x3}, ++ {0x1003b, 0x3}, ++ {0x1103b, 0x3}, ++ {0x1203b, 0x3}, ++ {0x1303b, 0x3}, ++ {0x10009, 0x0}, ++ {0x10037, 0x0}, ++ {0x11009, 0x0}, ++ {0x11037, 0x0}, ++ {0x12009, 0x0}, ++ {0x12037, 0x0}, ++ {0x13009, 0x0}, ++ {0x13037, 0x0}, ++ {0x10004, 0x0}, ++ {0x10003, 0x0}, ++ {0x11004, 0x0}, ++ {0x11003, 0x0}, ++ {0x12004, 0x0}, ++ {0x12003, 0x0}, ++ {0x13004, 0x0}, ++ {0x13003, 0x0}, ++ {0x20004, 0x320}, ++ {0x30050, 0x15}, ++ {0x30051, 0x15}, ++ {0x30052, 0x15}, ++ {0x30053, 0x15}, ++ {0x31050, 0x15}, ++ {0x31051, 0x15}, ++ {0x31052, 0x15}, ++ {0x31053, 0x15}, ++ {0x1004e, 0x15}, ++ {0x1004f, 0x15}, ++ {0x10050, 0x15}, ++ {0x10051, 0x15}, ++ {0x1014e, 0x15}, ++ {0x1014f, 0x15}, ++ {0x10150, 0x15}, ++ {0x10151, 0x15}, ++ {0x1024e, 0x15}, ++ {0x1024f, 0x15}, ++ {0x10250, 0x15}, ++ {0x10251, 0x15}, ++ {0x1034e, 0x15}, ++ {0x1034f, 0x15}, ++ {0x10350, 0x15}, ++ {0x10351, 0x15}, ++ {0x1044e, 0x15}, ++ {0x1044f, 0x15}, ++ {0x10450, 0x15}, ++ {0x10451, 0x15}, ++ {0x1054e, 0x15}, ++ {0x1054f, 0x15}, ++ {0x10550, 0x15}, ++ {0x10551, 0x15}, ++ {0x1064e, 0x15}, ++ {0x1064f, 0x15}, ++ {0x10650, 0x15}, ++ {0x10651, 0x15}, ++ {0x1074e, 0x15}, ++ {0x1074f, 0x15}, ++ {0x10750, 0x15}, ++ {0x10751, 0x15}, ++ {0x1084e, 0x15}, ++ {0x1084f, 0x15}, ++ {0x10850, 0x15}, ++ {0x10851, 0x15}, ++ {0x1104e, 0x15}, ++ {0x1104f, 0x15}, ++ {0x11050, 0x15}, ++ {0x11051, 0x15}, ++ {0x1114e, 0x15}, ++ {0x1114f, 0x15}, ++ {0x11150, 0x15}, ++ {0x11151, 0x15}, ++ {0x1124e, 0x15}, ++ {0x1124f, 0x15}, ++ {0x11250, 0x15}, ++ {0x11251, 0x15}, ++ {0x1134e, 0x15}, ++ {0x1134f, 0x15}, ++ {0x11350, 0x15}, ++ {0x11351, 0x15}, ++ {0x1144e, 0x15}, ++ {0x1144f, 0x15}, ++ {0x11450, 0x15}, ++ {0x11451, 0x15}, ++ {0x1154e, 0x15}, ++ {0x1154f, 0x15}, ++ {0x11550, 0x15}, ++ {0x11551, 0x15}, ++ {0x1164e, 0x15}, ++ {0x1164f, 0x15}, ++ {0x11650, 0x15}, ++ {0x11651, 0x15}, ++ {0x1174e, 0x15}, ++ {0x1174f, 0x15}, ++ {0x11750, 0x15}, ++ {0x11751, 0x15}, ++ {0x1184e, 0x15}, ++ {0x1184f, 0x15}, ++ {0x11850, 0x15}, ++ {0x11851, 0x15}, ++ {0x1204e, 0x15}, ++ {0x1204f, 0x15}, ++ {0x12050, 0x15}, ++ {0x12051, 0x15}, ++ {0x1214e, 0x15}, ++ {0x1214f, 0x15}, ++ {0x12150, 0x15}, ++ {0x12151, 0x15}, ++ {0x1224e, 0x15}, ++ {0x1224f, 0x15}, ++ {0x12250, 0x15}, ++ {0x12251, 0x15}, ++ {0x1234e, 0x15}, ++ {0x1234f, 0x15}, ++ {0x12350, 0x15}, ++ {0x12351, 0x15}, ++ {0x1244e, 0x15}, ++ {0x1244f, 0x15}, ++ {0x12450, 0x15}, ++ {0x12451, 0x15}, ++ {0x1254e, 0x15}, ++ {0x1254f, 0x15}, ++ {0x12550, 0x15}, ++ {0x12551, 0x15}, ++ {0x1264e, 0x15}, ++ {0x1264f, 0x15}, ++ {0x12650, 0x15}, ++ {0x12651, 0x15}, ++ {0x1274e, 0x15}, ++ {0x1274f, 0x15}, ++ {0x12750, 0x15}, ++ {0x12751, 0x15}, ++ {0x1284e, 0x15}, ++ {0x1284f, 0x15}, ++ {0x12850, 0x15}, ++ {0x12851, 0x15}, ++ {0x1304e, 0x15}, ++ {0x1304f, 0x15}, ++ {0x13050, 0x15}, ++ {0x13051, 0x15}, ++ {0x1314e, 0x15}, ++ {0x1314f, 0x15}, ++ {0x13150, 0x15}, ++ {0x13151, 0x15}, ++ {0x1324e, 0x15}, ++ {0x1324f, 0x15}, ++ {0x13250, 0x15}, ++ {0x13251, 0x15}, ++ {0x1334e, 0x15}, ++ {0x1334f, 0x15}, ++ {0x13350, 0x15}, ++ {0x13351, 0x15}, ++ {0x1344e, 0x15}, ++ {0x1344f, 0x15}, ++ {0x13450, 0x15}, ++ {0x13451, 0x15}, ++ {0x1354e, 0x15}, ++ {0x1354f, 0x15}, ++ {0x13550, 0x15}, ++ {0x13551, 0x15}, ++ {0x1364e, 0x15}, ++ {0x1364f, 0x15}, ++ {0x13650, 0x15}, ++ {0x13651, 0x15}, ++ {0x1374e, 0x15}, ++ {0x1374f, 0x15}, ++ {0x13750, 0x15}, ++ {0x13751, 0x15}, ++ {0x1384e, 0x15}, ++ {0x1384f, 0x15}, ++ {0x13850, 0x15}, ++ {0x13851, 0x15}, ++ {0x30030, 0x0}, ++ {0x30031, 0x0}, ++ {0x30035, 0x0}, ++ {0x31030, 0x0}, ++ {0x31031, 0x0}, ++ {0x31035, 0x0}, ++ {0x10030, 0x0}, ++ {0x10035, 0x0}, ++ {0x10036, 0x0}, ++ {0x11030, 0x0}, ++ {0x11035, 0x0}, ++ {0x11036, 0x0}, ++ {0x12030, 0x0}, ++ {0x12035, 0x0}, ++ {0x12036, 0x0}, ++ {0x13030, 0x0}, ++ {0x13035, 0x0}, ++ {0x13036, 0x0}, ++ {0x3003c, 0x5}, ++ {0x3103c, 0x5}, ++ {0x1003c, 0x5}, ++ {0x1003d, 0x5}, ++ {0x1003e, 0x5}, ++ {0x1103c, 0x5}, ++ {0x1103d, 0x5}, ++ {0x1103e, 0x5}, ++ {0x1203c, 0x5}, ++ {0x1203d, 0x5}, ++ {0x1203e, 0x5}, ++ {0x1303c, 0x5}, ++ {0x1303d, 0x5}, ++ {0x1303e, 0x5}, ++ {0x20003, 0x1}, ++ {0x10006, 0x2}, ++ {0x11006, 0x2}, ++ {0x12006, 0x2}, ++ {0x13006, 0x2}, ++ {0x20001, 0x1122}, ++ {0x20009, 0x0}, ++ {0x20008, 0x0}, ++ {0x200d9, 0x1}, ++ {0x30eef, 0x0}, ++ {0x31eef, 0x0}, ++ {0x20014, 0x1301}, ++ {0x9080a, 0x1300}, ++ {0x10040, 0xe0e}, ++ {0x10042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x10043, 0x0}, ++ {0x10044, 0xe0e}, ++ {0x10045, 0xe0e}, ++ {0x11040, 0xe0e}, ++ {0x11042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x11043, 0x0}, ++ {0x11044, 0xe0e}, ++ {0x11045, 0xe0e}, ++ {0x12040, 0xe0e}, ++ {0x12042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x12043, 0x0}, ++ {0x12044, 0xe0e}, ++ {0x12045, 0xe0e}, ++ {0x13040, 0xe0e}, ++ {0x13042, 0xe0e}, ++ {0x9080d, 0x0}, ++ {0x13043, 0x0}, ++ {0x13044, 0xe0e}, ++ {0x13045, 0xe0e}, ++ {0x30040, 0xe0e}, ++ {0x30041, 0xe0e}, ++ {0x30042, 0xe0e}, ++ {0x30043, 0xe0e}, ++ {0x30330, 0x33}, ++ {0x31040, 0xe0e}, ++ {0x31041, 0xe0e}, ++ {0x31042, 0xe0e}, ++ {0x31043, 0xe0e}, ++ {0x31330, 0x33}, ++ {0x20331, 0x33}, ++ {0x10048, 0xc00}, ++ {0x1004a, 0xc00}, ++ {0x1004b, 0xc00}, ++ {0x1004c, 0xe00}, ++ {0x1004d, 0xe00}, ++ {0x11048, 0xc00}, ++ {0x1104a, 0xc00}, ++ {0x1104b, 0xc00}, ++ {0x1104c, 0xe00}, ++ {0x1104d, 0xe00}, ++ {0x12048, 0xc00}, ++ {0x1204a, 0xc00}, ++ {0x1204b, 0xc00}, ++ {0x1204c, 0xe00}, ++ {0x1204d, 0xe00}, ++ {0x13048, 0xc00}, ++ {0x1304a, 0xc00}, ++ {0x1304b, 0xc00}, ++ {0x1304c, 0xe00}, ++ {0x1304d, 0xe00}, ++ {0x30048, 0xc00}, ++ {0x30049, 0xc00}, ++ {0x3004a, 0xc00}, ++ {0x3004b, 0xc00}, ++ {0x31048, 0xc00}, ++ {0x31049, 0xc00}, ++ {0x3104a, 0xc00}, ++ {0x3104b, 0xc00}, ++ {0x30033, 0xcc}, ++ {0x30034, 0xcc}, ++ {0x3002e, 0xcc}, ++ {0x31033, 0xcc}, ++ {0x31034, 0xcc}, ++ {0x3102e, 0xcc}, ++ {0x10033, 0xcc}, ++ {0x1002e, 0xcc}, ++ {0x1002f, 0xcc}, ++ {0x11033, 0xcc}, ++ {0x1102e, 0xcc}, ++ {0x1102f, 0xcc}, ++ {0x12033, 0xcc}, ++ {0x1202e, 0xcc}, ++ {0x1202f, 0xcc}, ++ {0x13033, 0xcc}, ++ {0x1302e, 0xcc}, ++ {0x1302f, 0xcc}, ++ {0x20015, 0x0}, ++ {0x90806, 0x0}, ++ {0x100e8, 0x0}, ++ {0x100e9, 0x15}, ++ {0x110e8, 0x0}, ++ {0x110e9, 0x15}, ++ {0x120e8, 0x0}, ++ {0x120e9, 0x15}, ++ {0x130e8, 0x0}, ++ {0x130e9, 0x15}, ++ {0x10001, 0x0}, ++ {0x11001, 0x0}, ++ {0x12001, 0x0}, ++ {0x13001, 0x0}, ++ {0x20012, 0xa1a1}, ++ {0x20017, 0x40}, ++ {0x2000a, 0x40}, ++ {0x20186, 0xa1}, ++ {0x20187, 0x40}, ++ {0x20010, 0x0}, ++ {0x20011, 0xf}, ++ {0x9080b, 0xf}, ++ {0x9080c, 0xf}, ++ {0x100a5, 0x1}, ++ {0x110a5, 0x1}, ++ {0x120a5, 0x1}, ++ {0x130a5, 0x1}, ++ {0x10014, 0x3232}, ++ {0x11014, 0x3232}, ++ {0x12014, 0x3232}, ++ {0x13014, 0x3232}, ++ {0x1000f, 0x1086}, ++ {0x1100f, 0x1086}, ++ {0x1200f, 0x1086}, ++ {0x1300f, 0x1086}, ++ {0x20035, 0x100c}, ++ {0x20036, 0x100c}, ++ {0x20037, 0x41c}, ++ {0x20038, 0x1920}, ++ {0x20039, 0x1018}, ++ {0x2003a, 0x1018}, ++ {0x2003b, 0x428}, ++ {0x2003c, 0x2d2c}, ++ {0x2003d, 0x1004}, ++ {0x2003e, 0x1004}, ++ {0x2003f, 0x414}, ++ {0x20040, 0x1118}, ++ {0x2002c, 0x83f}, ++ {0x2002d, 0x83f}, ++ {0x20030, 0x83f}, ++ {0x2002e, 0x81f}, ++ {0x2002f, 0x81f}, ++ {0x2000c, 0x0}, ++ {0x2001b, 0x0}, ++ {0x10007, 0x0}, ++ {0x11007, 0x0}, ++ {0x12007, 0x0}, ++ {0x13007, 0x0}, ++ {0xc0080, 0x3}, ++}; ++ ++/* P0 message block parameter for training firmware */ ++static struct ddrphy_cfg_param ddr_phy_msgh_fsp0_cfg[] = { ++ {0x58000, 0x4000}, ++ {0x58002, 0x30}, ++ {0x58003, 0x1900}, ++ {0x58004, 0x4}, ++ {0x58005, 0x4}, ++ {0x58008, 0x17df}, ++ {0x58009, 0xc8}, ++ {0x5800b, 0x2}, ++ {0x5800d, 0x100}, ++ {0x58012, 0x310}, ++ {0x5801f, 0x1000}, ++ {0x58020, 0x3}, ++ {0x5802d, 0xb0b0}, ++ {0x5802e, 0xb0b0}, ++ {0x5802f, 0xbbbb}, ++ {0x58030, 0xbbbb}, ++ {0x58031, 0x606}, ++ {0x58032, 0x606}, ++ {0x58033, 0x5454}, ++ {0x58034, 0x5454}, ++ {0x58035, 0x4646}, ++ {0x58036, 0x4646}, ++ {0x58037, 0x2d2d}, ++ {0x58038, 0x2d2d}, ++ {0x58039, 0x8080}, ++ {0x5803a, 0x8080}, ++ {0x5803b, 0x1c1c}, ++ {0x5803c, 0x1c1c}, ++ {0x5803d, 0x1c1c}, ++ {0x5803e, 0x1c1c}, ++ {0x58041, 0x2c04}, ++ {0x58042, 0x2c04}, ++ {0x58043, 0x1b1b}, ++ {0x58044, 0x1b1b}, ++ {0x58045, 0x1010}, ++ {0x58046, 0x1010}, ++ {0x58047, 0x202}, ++ {0x58048, 0x202}, ++ {0x5804f, 0x8080}, ++ {0x58050, 0x8080}, ++ {0x58055, 0x404}, ++ {0x58056, 0x404}, ++ {0x58074, 0x2e}, ++ {0x58075, 0x50}, ++ {0x58080, 0x1}, ++ {0x58081, 0x4300}, ++ {0x58082, 0x3f}, ++}; ++ ++/* DRAM PHY init engine image for Pstate 0 */ ++static struct ddrphy_cfg_param ddr_phy_pie_fsp0_cfg[] = { ++ {0x908f0, 0x65}, ++ {0x908f1, 0x258}, ++ {0x908f2, 0x0}, ++ {0x908f3, 0x58}, ++ {0x908f4, 0x14}, ++ {0x908f5, 0x0}, ++ {0x908f6, 0xb0}, ++ {0x908f7, 0x0}, ++ {0x41008, 0xc9d8}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0xc808}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x2b00}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0xc958}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0xcd88}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x2b00}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0xc0d8}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0xd848}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x2b00}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0xc158}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0xddc8}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x2b00}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0xc1d8}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0xc308}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x2b00}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0xc558}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0xea08}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x2b00}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0xc5d8}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0xe308}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x2b00}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x48d8}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x4208}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x88d8}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x9608}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x2b00}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0xca58}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0xc108}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x2b00}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0xcb58}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0xc008}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x2b00}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0xd4d8}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0xc008}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0x20015, 0x0}, ++ {0x3004a, 0x0}, ++ {0x3004b, 0x0}, ++ {0x3104a, 0x0}, ++ {0x3104b, 0x0}, ++ {0x2004a, 0x1a3e}, ++ {0x2004b, 0x1a3e}, ++ {0x2004c, 0x2c0f}, ++ {0x2004d, 0x0}, ++ {0x20088, 0x101}, ++ {0x20089, 0x0}, ++ {0x2008a, 0x0}, ++ {0x2008c, 0x0}, ++ {0x20041, 0x1}, ++ {0x90802, 0x0}, ++ {0x20045, 0x2}, ++ {0x10057, 0x0}, ++ {0x11057, 0x0}, ++ {0x12057, 0x0}, ++ {0x13057, 0x0}, ++ {0x1000f, 0x1087}, ++ {0x1100f, 0x1087}, ++ {0x1200f, 0x1087}, ++ {0x1300f, 0x1087}, ++ {0x90803, 0x4}, ++ {0x90804, 0x82}, ++ {0x90805, 0x1}, ++ {0x90903, 0x0}, ++ {0x9090b, 0x2}, ++ {0x90811, 0x0}, ++ {0x90812, 0xff00}, ++ {0x20072, 0x3}, ++ {0x9080e, 0x3}, ++ {0x20073, 0x3}, ++ {0x9080f, 0x3}, ++}; ++ ++/* DRAM PHY init engine image */ ++static struct ddrphy_cfg_param ddr_phy_pie[] = { ++ {0x41000, 0x0}, ++ {0x41001, 0x0}, ++ {0x41002, 0x0}, ++ {0x41003, 0x0}, ++ {0x41004, 0x0}, ++ {0x41005, 0x0}, ++ {0x41006, 0x0}, ++ {0x41007, 0x0}, ++ {0x41388, 0xc028}, ++ {0x41389, 0x0}, ++ {0x4138a, 0x0}, ++ {0x4138b, 0x10}, ++ {0x4138c, 0x0}, ++ {0x4138d, 0x0}, ++ {0x4138e, 0x0}, ++ {0x4138f, 0x0}, ++ {0x41390, 0x0}, ++ {0x41391, 0x0}, ++ {0x41392, 0x0}, ++ {0x41393, 0x400}, ++ {0x41394, 0x0}, ++ {0x41395, 0x0}, ++ {0x41396, 0x0}, ++ {0x41397, 0x0}, ++ {0x41398, 0x0}, ++ {0x41399, 0x0}, ++ {0x4139a, 0x0}, ++ {0x4139b, 0x0}, ++ {0x4139c, 0x0}, ++ {0x4139d, 0x0}, ++ {0x4139e, 0x0}, ++ {0x4139f, 0x0}, ++ {0x413a0, 0xc858}, ++ {0x413a1, 0x0}, ++ {0x413a2, 0x0}, ++ {0x413a3, 0x10}, ++ {0x413a4, 0xe088}, ++ {0x413a5, 0x0}, ++ {0x413a6, 0x0}, ++ {0x413a7, 0x10}, ++ {0x413a8, 0xe038}, ++ {0x413a9, 0x0}, ++ {0x413aa, 0x0}, ++ {0x413ab, 0x10}, ++ {0x413ac, 0xc858}, ++ {0x413ad, 0x0}, ++ {0x413ae, 0x0}, ++ {0x413af, 0x10}, ++ {0x413b0, 0xc088}, ++ {0x413b1, 0x0}, ++ {0x413b2, 0x0}, ++ {0x413b3, 0x10}, ++ {0x413b4, 0x0}, ++ {0x413b5, 0x0}, ++ {0x413b6, 0x0}, ++ {0x413b7, 0x0}, ++ {0x413b8, 0xc028}, ++ {0x413b9, 0x0}, ++ {0x413ba, 0x0}, ++ {0x413bb, 0x10}, ++ {0x413bc, 0x0}, ++ {0x413bd, 0x0}, ++ {0x413be, 0x0}, ++ {0x413bf, 0x0}, ++ {0x413c0, 0x0}, ++ {0x413c1, 0x0}, ++ {0x413c2, 0x0}, ++ {0x413c3, 0x400}, ++ {0x413c4, 0x0}, ++ {0x413c5, 0x0}, ++ {0x413c6, 0x0}, ++ {0x413c7, 0x0}, ++ {0x413c8, 0x0}, ++ {0x413c9, 0x0}, ++ {0x413ca, 0x0}, ++ {0x413cb, 0x0}, ++ {0x413cc, 0x0}, ++ {0x413cd, 0x0}, ++ {0x413ce, 0x0}, ++ {0x413cf, 0x0}, ++ {0x413d0, 0xc858}, ++ {0x413d1, 0x0}, ++ {0x413d2, 0x0}, ++ {0x413d3, 0x10}, ++ {0x413d4, 0xe208}, ++ {0x413d5, 0x0}, ++ {0x413d6, 0x0}, ++ {0x413d7, 0x10}, ++ {0x413d8, 0xe038}, ++ {0x413d9, 0x0}, ++ {0x413da, 0x0}, ++ {0x413db, 0x10}, ++ {0x413dc, 0xc858}, ++ {0x413dd, 0x0}, ++ {0x413de, 0x0}, ++ {0x413df, 0x10}, ++ {0x413e0, 0xc208}, ++ {0x413e1, 0x0}, ++ {0x413e2, 0x0}, ++ {0x413e3, 0x10}, ++ {0x413e4, 0x0}, ++ {0x413e5, 0x0}, ++ {0x413e6, 0x0}, ++ {0x413e7, 0x0}, ++ {0x413e8, 0xce58}, ++ {0x413e9, 0x0}, ++ {0x413ea, 0x0}, ++ {0x413eb, 0x10}, ++ {0x413ec, 0xc208}, ++ {0x413ed, 0x0}, ++ {0x413ee, 0x0}, ++ {0x413ef, 0x10}, ++ {0x413f0, 0x0}, ++ {0x413f1, 0x0}, ++ {0x413f2, 0x0}, ++ {0x413f3, 0x0}, ++ {0x413f4, 0x0}, ++ {0x413f5, 0x0}, ++ {0x413f6, 0x0}, ++ {0x413f7, 0x0}, ++ {0x413f8, 0xc370}, ++ {0x413f9, 0x0}, ++ {0x413fa, 0x0}, ++ {0x413fb, 0x10}, ++ {0x413fc, 0x0}, ++ {0x413fd, 0x0}, ++ {0x413fe, 0x0}, ++ {0x413ff, 0x0}, ++ {0x41400, 0xc040}, ++ {0x41401, 0x0}, ++ {0x41402, 0x0}, ++ {0x41403, 0x10}, ++ {0x41404, 0x0}, ++ {0x41405, 0x0}, ++ {0x41406, 0x0}, ++ {0x41407, 0x10}, ++ {0x41408, 0xd2d8}, ++ {0x41409, 0x0}, ++ {0x4140a, 0x0}, ++ {0x4140b, 0x10}, ++ {0x4140c, 0xe008}, ++ {0x4140d, 0x0}, ++ {0x4140e, 0x0}, ++ {0x4140f, 0x10}, ++ {0x41410, 0x0}, ++ {0x41411, 0x0}, ++ {0x41412, 0x0}, ++ {0x41413, 0x5b00}, ++ {0x41414, 0x0}, ++ {0x41415, 0x0}, ++ {0x41416, 0x0}, ++ {0x41417, 0x0}, ++ {0x41418, 0xc0f0}, ++ {0x41419, 0x0}, ++ {0x4141a, 0x0}, ++ {0x4141b, 0x10}, ++ {0x4141c, 0x0}, ++ {0x4141d, 0x0}, ++ {0x4141e, 0x0}, ++ {0x4141f, 0x0}, ++ {0x41420, 0xcfd8}, ++ {0x41421, 0x0}, ++ {0x41422, 0x0}, ++ {0x41423, 0x10}, ++ {0x41424, 0xc008}, ++ {0x41425, 0x0}, ++ {0x41426, 0x0}, ++ {0x41427, 0x10}, ++ {0x41428, 0x0}, ++ {0x41429, 0x0}, ++ {0x4142a, 0x0}, ++ {0x4142b, 0x2b00}, ++ {0x4142c, 0x0}, ++ {0x4142d, 0x0}, ++ {0x4142e, 0x0}, ++ {0x4142f, 0x0}, ++ {0x41430, 0xd058}, ++ {0x41431, 0x0}, ++ {0x41432, 0x0}, ++ {0x41433, 0x10}, ++ {0x41434, 0xc008}, ++ {0x41435, 0x0}, ++ {0x41436, 0x0}, ++ {0x41437, 0x10}, ++ {0x41438, 0x0}, ++ {0x41439, 0x0}, ++ {0x4143a, 0x0}, ++ {0x4143b, 0x2b00}, ++ {0x4143c, 0x0}, ++ {0x4143d, 0x0}, ++ {0x4143e, 0x0}, ++ {0x4143f, 0x0}, ++ {0x41440, 0xd0d8}, ++ {0x41441, 0x0}, ++ {0x41442, 0x0}, ++ {0x41443, 0x10}, ++ {0x41444, 0xc088}, ++ {0x41445, 0x0}, ++ {0x41446, 0x0}, ++ {0x41447, 0x10}, ++ {0x41448, 0x0}, ++ {0x41449, 0x0}, ++ {0x4144a, 0x0}, ++ {0x4144b, 0x2b00}, ++ {0x4144c, 0x0}, ++ {0x4144d, 0x0}, ++ {0x4144e, 0x0}, ++ {0x4144f, 0x0}, ++ {0x41450, 0xd158}, ++ {0x41451, 0x0}, ++ {0x41452, 0x0}, ++ {0x41453, 0x10}, ++ {0x41454, 0xc008}, ++ {0x41455, 0x0}, ++ {0x41456, 0x0}, ++ {0x41457, 0x10}, ++ {0x41458, 0x0}, ++ {0x41459, 0x0}, ++ {0x4145a, 0x0}, ++ {0x4145b, 0x5b00}, ++ {0x4145c, 0x0}, ++ {0x4145d, 0x0}, ++ {0x4145e, 0x0}, ++ {0x4145f, 0x0}, ++ {0x41460, 0x402c}, ++ {0x41461, 0xd00}, ++ {0x41462, 0x1}, ++ {0x41463, 0x400}, ++ {0x41464, 0x4050}, ++ {0x41465, 0x800}, ++ {0x41466, 0x0}, ++ {0x41467, 0x0}, ++ {0x41468, 0x0}, ++ {0x41469, 0x0}, ++ {0x4146a, 0x0}, ++ {0x4146b, 0x400}, ++ {0x4146c, 0x0}, ++ {0x4146d, 0x0}, ++ {0x4146e, 0x0}, ++ {0x4146f, 0x0}, ++ {0x41470, 0x0}, ++ {0x41471, 0x0}, ++ {0x41472, 0x0}, ++ {0x41473, 0x400}, ++ {0x41474, 0x4050}, ++ {0x41475, 0x803}, ++ {0x41476, 0x0}, ++ {0x41477, 0x0}, ++ {0x41478, 0x0}, ++ {0x41479, 0x0}, ++ {0x4147a, 0x0}, ++ {0x4147b, 0x7f00}, ++ {0x4147c, 0x0}, ++ {0x4147d, 0x0}, ++ {0x4147e, 0x0}, ++ {0x4147f, 0x400}, ++ {0x41480, 0x407c}, ++ {0x41481, 0x0}, ++ {0x41482, 0x0}, ++ {0x41483, 0x400}, ++ {0x41484, 0x0}, ++ {0x41485, 0x0}, ++ {0x41486, 0x0}, ++ {0x41487, 0x0}, ++ {0x41488, 0x0}, ++ {0x41489, 0x0}, ++ {0x4148a, 0x0}, ++ {0x4148b, 0x400}, ++ {0x4148c, 0x0}, ++ {0x4148d, 0x0}, ++ {0x4148e, 0x1}, ++ {0x4148f, 0x0}, ++ {0x41490, 0x0}, ++ {0x41491, 0x0}, ++ {0x41492, 0x0}, ++ {0x41493, 0x400}, ++ {0x41494, 0x0}, ++ {0x41495, 0x0}, ++ {0x41496, 0x0}, ++ {0x41497, 0x0}, ++ {0x41498, 0x0}, ++ {0x41499, 0x0}, ++ {0x4149a, 0x0}, ++ {0x4149b, 0x0}, ++ {0x4149c, 0x0}, ++ {0x4149d, 0x0}, ++ {0x4149e, 0x0}, ++ {0x4149f, 0x0}, ++ {0x414a0, 0x802c}, ++ {0x414a1, 0xd00}, ++ {0x414a2, 0x1}, ++ {0x414a3, 0x410}, ++ {0x414a4, 0x8050}, ++ {0x414a5, 0x800}, ++ {0x414a6, 0x0}, ++ {0x414a7, 0x10}, ++ {0x414a8, 0x0}, ++ {0x414a9, 0x0}, ++ {0x414aa, 0x0}, ++ {0x414ab, 0x400}, ++ {0x414ac, 0x0}, ++ {0x414ad, 0x0}, ++ {0x414ae, 0x0}, ++ {0x414af, 0x0}, ++ {0x414b0, 0x0}, ++ {0x414b1, 0x0}, ++ {0x414b2, 0x0}, ++ {0x414b3, 0x400}, ++ {0x414b4, 0x8050}, ++ {0x414b5, 0x803}, ++ {0x414b6, 0x0}, ++ {0x414b7, 0x10}, ++ {0x414b8, 0x0}, ++ {0x414b9, 0x0}, ++ {0x414ba, 0x0}, ++ {0x414bb, 0x7f00}, ++ {0x414bc, 0x0}, ++ {0x414bd, 0x0}, ++ {0x414be, 0x0}, ++ {0x414bf, 0x400}, ++ {0x414c0, 0x807c}, ++ {0x414c1, 0x0}, ++ {0x414c2, 0x0}, ++ {0x414c3, 0x410}, ++ {0x414c4, 0x0}, ++ {0x414c5, 0x0}, ++ {0x414c6, 0x0}, ++ {0x414c7, 0x0}, ++ {0x414c8, 0x0}, ++ {0x414c9, 0x0}, ++ {0x414ca, 0x0}, ++ {0x414cb, 0x400}, ++ {0x414cc, 0x0}, ++ {0x414cd, 0x0}, ++ {0x414ce, 0x1}, ++ {0x414cf, 0x0}, ++ {0x414d0, 0x0}, ++ {0x414d1, 0x0}, ++ {0x414d2, 0x0}, ++ {0x414d3, 0x400}, ++ {0x414d4, 0x0}, ++ {0x414d5, 0x0}, ++ {0x414d6, 0x0}, ++ {0x414d7, 0x0}, ++ {0x414d8, 0x0}, ++ {0x414d9, 0x0}, ++ {0x414da, 0x0}, ++ {0x414db, 0x0}, ++ {0x414dc, 0x0}, ++ {0x414dd, 0x0}, ++ {0x414de, 0x0}, ++ {0x414df, 0x0}, ++ {0x414e0, 0x402c}, ++ {0x414e1, 0xd00}, ++ {0x414e2, 0x1}, ++ {0x414e3, 0x0}, ++ {0x414e4, 0x4050}, ++ {0x414e5, 0x800}, ++ {0x414e6, 0x0}, ++ {0x414e7, 0x0}, ++ {0x414e8, 0x0}, ++ {0x414e9, 0x0}, ++ {0x414ea, 0x0}, ++ {0x414eb, 0x0}, ++ {0x414ec, 0x0}, ++ {0x414ed, 0x0}, ++ {0x414ee, 0x0}, ++ {0x414ef, 0x0}, ++ {0x414f0, 0x0}, ++ {0x414f1, 0x0}, ++ {0x414f2, 0x0}, ++ {0x414f3, 0x0}, ++ {0x414f4, 0x4050}, ++ {0x414f5, 0x803}, ++ {0x414f6, 0x0}, ++ {0x414f7, 0x0}, ++ {0x414f8, 0x0}, ++ {0x414f9, 0x0}, ++ {0x414fa, 0x0}, ++ {0x414fb, 0x0}, ++ {0x414fc, 0x0}, ++ {0x414fd, 0x0}, ++ {0x414fe, 0x0}, ++ {0x414ff, 0x0}, ++ {0x41500, 0x0}, ++ {0x41501, 0x0}, ++ {0x41502, 0x0}, ++ {0x41503, 0x0}, ++ {0x41504, 0x4050}, ++ {0x41505, 0x800}, ++ {0x41506, 0x0}, ++ {0x41507, 0x0}, ++ {0x41508, 0x0}, ++ {0x41509, 0x0}, ++ {0x4150a, 0x0}, ++ {0x4150b, 0x6b00}, ++ {0x4150c, 0x0}, ++ {0x4150d, 0x0}, ++ {0x4150e, 0x0}, ++ {0x4150f, 0x400}, ++ {0x41510, 0x0}, ++ {0x41511, 0x0}, ++ {0x41512, 0x0}, ++ {0x41513, 0x0}, ++ {0x41514, 0x407c}, ++ {0x41515, 0x0}, ++ {0x41516, 0x0}, ++ {0x41517, 0x0}, ++ {0x41518, 0x0}, ++ {0x41519, 0x0}, ++ {0x4151a, 0x0}, ++ {0x4151b, 0x0}, ++ {0x4151c, 0x0}, ++ {0x4151d, 0x0}, ++ {0x4151e, 0x0}, ++ {0x4151f, 0x0}, ++ {0x41520, 0x0}, ++ {0x41521, 0x0}, ++ {0x41522, 0x1}, ++ {0x41523, 0x0}, ++ {0x41524, 0x0}, ++ {0x41525, 0x0}, ++ {0x41526, 0x0}, ++ {0x41527, 0x0}, ++ {0x41528, 0x0}, ++ {0x41529, 0x0}, ++ {0x4152a, 0x0}, ++ {0x4152b, 0x4b00}, ++ {0x4152c, 0x0}, ++ {0x4152d, 0x0}, ++ {0x4152e, 0x0}, ++ {0x4152f, 0x1800}, ++ {0x41530, 0x0}, ++ {0x41531, 0x0}, ++ {0x41532, 0x0}, ++ {0x41533, 0x0}, ++ {0x41534, 0x802c}, ++ {0x41535, 0xd00}, ++ {0x41536, 0x1}, ++ {0x41537, 0x10}, ++ {0x41538, 0x8050}, ++ {0x41539, 0x800}, ++ {0x4153a, 0x0}, ++ {0x4153b, 0x10}, ++ {0x4153c, 0x0}, ++ {0x4153d, 0x0}, ++ {0x4153e, 0x0}, ++ {0x4153f, 0x0}, ++ {0x41540, 0x0}, ++ {0x41541, 0x0}, ++ {0x41542, 0x0}, ++ {0x41543, 0x0}, ++ {0x41544, 0x0}, ++ {0x41545, 0x0}, ++ {0x41546, 0x0}, ++ {0x41547, 0x0}, ++ {0x41548, 0x8050}, ++ {0x41549, 0x803}, ++ {0x4154a, 0x0}, ++ {0x4154b, 0x10}, ++ {0x4154c, 0x0}, ++ {0x4154d, 0x0}, ++ {0x4154e, 0x0}, ++ {0x4154f, 0x0}, ++ {0x41550, 0x0}, ++ {0x41551, 0x0}, ++ {0x41552, 0x0}, ++ {0x41553, 0x0}, ++ {0x41554, 0x0}, ++ {0x41555, 0x0}, ++ {0x41556, 0x0}, ++ {0x41557, 0x0}, ++ {0x41558, 0x8050}, ++ {0x41559, 0x800}, ++ {0x4155a, 0x0}, ++ {0x4155b, 0x10}, ++ {0x4155c, 0x0}, ++ {0x4155d, 0x0}, ++ {0x4155e, 0x0}, ++ {0x4155f, 0x0}, ++ {0x41560, 0x0}, ++ {0x41561, 0x0}, ++ {0x41562, 0x0}, ++ {0x41563, 0x6b00}, ++ {0x41564, 0x0}, ++ {0x41565, 0x0}, ++ {0x41566, 0x0}, ++ {0x41567, 0x400}, ++ {0x41568, 0x807c}, ++ {0x41569, 0x0}, ++ {0x4156a, 0x0}, ++ {0x4156b, 0x10}, ++ {0x4156c, 0x0}, ++ {0x4156d, 0x0}, ++ {0x4156e, 0x0}, ++ {0x4156f, 0x0}, ++ {0x41570, 0x0}, ++ {0x41571, 0x0}, ++ {0x41572, 0x0}, ++ {0x41573, 0x0}, ++ {0x41574, 0x0}, ++ {0x41575, 0x0}, ++ {0x41576, 0x1}, ++ {0x41577, 0x0}, ++ {0x41578, 0x0}, ++ {0x41579, 0x0}, ++ {0x4157a, 0x0}, ++ {0x4157b, 0x7b00}, ++ {0x4157c, 0x0}, ++ {0x4157d, 0x0}, ++ {0x4157e, 0x0}, ++ {0x4157f, 0x2000}, ++ {0x41580, 0x402c}, ++ {0x41581, 0xd00}, ++ {0x41582, 0x1}, ++ {0x41583, 0x0}, ++ {0x41584, 0x5198}, ++ {0x41585, 0x803}, ++ {0x41586, 0x0}, ++ {0x41587, 0x0}, ++ {0x41588, 0x0}, ++ {0x41589, 0x0}, ++ {0x4158a, 0x0}, ++ {0x4158b, 0x3b00}, ++ {0x4158c, 0x0}, ++ {0x4158d, 0x0}, ++ {0x4158e, 0x0}, ++ {0x4158f, 0x0}, ++ {0x41590, 0x5218}, ++ {0x41591, 0x803}, ++ {0x41592, 0x0}, ++ {0x41593, 0x0}, ++ {0x41594, 0x0}, ++ {0x41595, 0x0}, ++ {0x41596, 0x0}, ++ {0x41597, 0x0}, ++ {0x41598, 0x0}, ++ {0x41599, 0x0}, ++ {0x4159a, 0x0}, ++ {0x4159b, 0x6b00}, ++ {0x4159c, 0x0}, ++ {0x4159d, 0x0}, ++ {0x4159e, 0x0}, ++ {0x4159f, 0x400}, ++ {0x415a0, 0x407c}, ++ {0x415a1, 0x0}, ++ {0x415a2, 0x0}, ++ {0x415a3, 0x0}, ++ {0x415a4, 0x0}, ++ {0x415a5, 0x0}, ++ {0x415a6, 0x0}, ++ {0x415a7, 0x0}, ++ {0x415a8, 0x0}, ++ {0x415a9, 0x0}, ++ {0x415aa, 0x0}, ++ {0x415ab, 0x0}, ++ {0x415ac, 0x0}, ++ {0x415ad, 0x0}, ++ {0x415ae, 0x1}, ++ {0x415af, 0x0}, ++ {0x415b0, 0x0}, ++ {0x415b1, 0x0}, ++ {0x415b2, 0x0}, ++ {0x415b3, 0x1b00}, ++ {0x415b4, 0x0}, ++ {0x415b5, 0x0}, ++ {0x415b6, 0x0}, ++ {0x415b7, 0x0}, ++ {0x415b8, 0x0}, ++ {0x415b9, 0x0}, ++ {0x415ba, 0x0}, ++ {0x415bb, 0x0}, ++ {0x415bc, 0x802c}, ++ {0x415bd, 0xd00}, ++ {0x415be, 0x1}, ++ {0x415bf, 0x10}, ++ {0x415c0, 0x9198}, ++ {0x415c1, 0x803}, ++ {0x415c2, 0x0}, ++ {0x415c3, 0x10}, ++ {0x415c4, 0x0}, ++ {0x415c5, 0x0}, ++ {0x415c6, 0x0}, ++ {0x415c7, 0x0}, ++ {0x415c8, 0x0}, ++ {0x415c9, 0x0}, ++ {0x415ca, 0x0}, ++ {0x415cb, 0x2b00}, ++ {0x415cc, 0x0}, ++ {0x415cd, 0x0}, ++ {0x415ce, 0x0}, ++ {0x415cf, 0x0}, ++ {0x415d0, 0x0}, ++ {0x415d1, 0x0}, ++ {0x415d2, 0x0}, ++ {0x415d3, 0x0}, ++ {0x415d4, 0x9218}, ++ {0x415d5, 0x803}, ++ {0x415d6, 0x0}, ++ {0x415d7, 0x10}, ++ {0x415d8, 0x0}, ++ {0x415d9, 0x0}, ++ {0x415da, 0x0}, ++ {0x415db, 0x6b00}, ++ {0x415dc, 0x0}, ++ {0x415dd, 0x0}, ++ {0x415de, 0x0}, ++ {0x415df, 0x400}, ++ {0x415e0, 0x0}, ++ {0x415e1, 0x0}, ++ {0x415e2, 0x0}, ++ {0x415e3, 0x0}, ++ {0x415e4, 0x807c}, ++ {0x415e5, 0x0}, ++ {0x415e6, 0x0}, ++ {0x415e7, 0x10}, ++ {0x415e8, 0x0}, ++ {0x415e9, 0x0}, ++ {0x415ea, 0x0}, ++ {0x415eb, 0x0}, ++ {0x415ec, 0x0}, ++ {0x415ed, 0x0}, ++ {0x415ee, 0x0}, ++ {0x415ef, 0x0}, ++ {0x415f0, 0x0}, ++ {0x415f1, 0x0}, ++ {0x415f2, 0x1}, ++ {0x415f3, 0x0}, ++ {0x415f4, 0x0}, ++ {0x415f5, 0x0}, ++ {0x415f6, 0x0}, ++ {0x415f7, 0x0}, ++ {0x415f8, 0x0}, ++ {0x415f9, 0x0}, ++ {0x415fa, 0x0}, ++ {0x415fb, 0xb00}, ++ {0x415fc, 0x0}, ++ {0x415fd, 0x0}, ++ {0x415fe, 0x0}, ++ {0x415ff, 0x400}, ++ {0x41600, 0x0}, ++ {0x41601, 0x0}, ++ {0x41602, 0x0}, ++ {0x41603, 0x0}, ++ {0x41604, 0x0}, ++ {0x41605, 0x0}, ++ {0x41606, 0x0}, ++ {0x41607, 0x0}, ++ {0x41608, 0x401c}, ++ {0x41609, 0xd0}, ++ {0x4160a, 0x1}, ++ {0x4160b, 0x0}, ++ {0x4160c, 0x4060}, ++ {0x4160d, 0x84}, ++ {0x4160e, 0x0}, ++ {0x4160f, 0x0}, ++ {0x41610, 0x0}, ++ {0x41611, 0x0}, ++ {0x41612, 0x0}, ++ {0x41613, 0xb00}, ++ {0x41614, 0x0}, ++ {0x41615, 0x0}, ++ {0x41616, 0x0}, ++ {0x41617, 0x800}, ++ {0x41618, 0x407c}, ++ {0x41619, 0x0}, ++ {0x4161a, 0x0}, ++ {0x4161b, 0x0}, ++ {0x4161c, 0x0}, ++ {0x4161d, 0x0}, ++ {0x4161e, 0x0}, ++ {0x4161f, 0x0}, ++ {0x41620, 0x0}, ++ {0x41621, 0x0}, ++ {0x41622, 0x0}, ++ {0x41623, 0x0}, ++ {0x41624, 0x4000}, ++ {0x41625, 0x0}, ++ {0x41626, 0x1}, ++ {0x41627, 0x0}, ++ {0x41628, 0x0}, ++ {0x41629, 0x0}, ++ {0x4162a, 0x0}, ++ {0x4162b, 0x0}, ++ {0x4162c, 0x402c}, ++ {0x4162d, 0xd00}, ++ {0x4162e, 0x1}, ++ {0x4162f, 0x0}, ++ {0x41630, 0x4020}, ++ {0x41631, 0x803}, ++ {0x41632, 0x0}, ++ {0x41633, 0x0}, ++ {0x41634, 0x0}, ++ {0x41635, 0x0}, ++ {0x41636, 0x0}, ++ {0x41637, 0x0}, ++ {0x41638, 0x0}, ++ {0x41639, 0x0}, ++ {0x4163a, 0x0}, ++ {0x4163b, 0x2b00}, ++ {0x4163c, 0x0}, ++ {0x4163d, 0x0}, ++ {0x4163e, 0x0}, ++ {0x4163f, 0x800}, ++ {0x41640, 0x0}, ++ {0x41641, 0x0}, ++ {0x41642, 0x0}, ++ {0x41643, 0x0}, ++ {0x41644, 0x407c}, ++ {0x41645, 0x0}, ++ {0x41646, 0x0}, ++ {0x41647, 0x0}, ++ {0x41648, 0x0}, ++ {0x41649, 0x0}, ++ {0x4164a, 0x0}, ++ {0x4164b, 0x0}, ++ {0x4164c, 0x0}, ++ {0x4164d, 0x0}, ++ {0x4164e, 0x0}, ++ {0x4164f, 0x0}, ++ {0x41650, 0x0}, ++ {0x41651, 0x0}, ++ {0x41652, 0x1}, ++ {0x41653, 0x0}, ++ {0x41654, 0x0}, ++ {0x41655, 0x0}, ++ {0x41656, 0x0}, ++ {0x41657, 0x0}, ++ {0x41658, 0x801c}, ++ {0x41659, 0xd0}, ++ {0x4165a, 0x1}, ++ {0x4165b, 0x10}, ++ {0x4165c, 0x8060}, ++ {0x4165d, 0x84}, ++ {0x4165e, 0x0}, ++ {0x4165f, 0x10}, ++ {0x41660, 0x0}, ++ {0x41661, 0x0}, ++ {0x41662, 0x0}, ++ {0x41663, 0xb00}, ++ {0x41664, 0x0}, ++ {0x41665, 0x0}, ++ {0x41666, 0x0}, ++ {0x41667, 0x800}, ++ {0x41668, 0x807c}, ++ {0x41669, 0x0}, ++ {0x4166a, 0x0}, ++ {0x4166b, 0x10}, ++ {0x4166c, 0x0}, ++ {0x4166d, 0x0}, ++ {0x4166e, 0x0}, ++ {0x4166f, 0x0}, ++ {0x41670, 0x0}, ++ {0x41671, 0x0}, ++ {0x41672, 0x0}, ++ {0x41673, 0x0}, ++ {0x41674, 0x8000}, ++ {0x41675, 0x0}, ++ {0x41676, 0x1}, ++ {0x41677, 0x10}, ++ {0x41678, 0x0}, ++ {0x41679, 0x0}, ++ {0x4167a, 0x0}, ++ {0x4167b, 0x0}, ++ {0x4167c, 0x802c}, ++ {0x4167d, 0xd00}, ++ {0x4167e, 0x1}, ++ {0x4167f, 0x10}, ++ {0x41680, 0x8020}, ++ {0x41681, 0x803}, ++ {0x41682, 0x0}, ++ {0x41683, 0x10}, ++ {0x41684, 0x0}, ++ {0x41685, 0x0}, ++ {0x41686, 0x0}, ++ {0x41687, 0x0}, ++ {0x41688, 0x0}, ++ {0x41689, 0x0}, ++ {0x4168a, 0x0}, ++ {0x4168b, 0x2b00}, ++ {0x4168c, 0x0}, ++ {0x4168d, 0x0}, ++ {0x4168e, 0x0}, ++ {0x4168f, 0x800}, ++ {0x41690, 0x0}, ++ {0x41691, 0x0}, ++ {0x41692, 0x0}, ++ {0x41693, 0x0}, ++ {0x41694, 0x807c}, ++ {0x41695, 0x0}, ++ {0x41696, 0x0}, ++ {0x41697, 0x10}, ++ {0x41698, 0x0}, ++ {0x41699, 0x0}, ++ {0x4169a, 0x0}, ++ {0x4169b, 0x0}, ++ {0x4169c, 0x0}, ++ {0x4169d, 0x0}, ++ {0x4169e, 0x0}, ++ {0x4169f, 0x0}, ++ {0x416a0, 0x0}, ++ {0x416a1, 0x0}, ++ {0x416a2, 0x1}, ++ {0x416a3, 0x0}, ++ {0x416a4, 0x0}, ++ {0x416a5, 0x0}, ++ {0x416a6, 0x0}, ++ {0x416a7, 0x0}, ++ {0x416a8, 0x402c}, ++ {0x416a9, 0xd00}, ++ {0x416aa, 0x1}, ++ {0x416ab, 0x0}, ++ {0x416ac, 0x4050}, ++ {0x416ad, 0x803}, ++ {0x416ae, 0x0}, ++ {0x416af, 0x0}, ++ {0x416b0, 0x0}, ++ {0x416b1, 0x0}, ++ {0x416b2, 0x0}, ++ {0x416b3, 0x1b00}, ++ {0x416b4, 0x0}, ++ {0x416b5, 0x0}, ++ {0x416b6, 0x0}, ++ {0x416b7, 0x0}, ++ {0x416b8, 0x0}, ++ {0x416b9, 0x0}, ++ {0x416ba, 0x0}, ++ {0x416bb, 0x0}, ++ {0x416bc, 0x0}, ++ {0x416bd, 0x0}, ++ {0x416be, 0x0}, ++ {0x416bf, 0x0}, ++ {0x416c0, 0x4050}, ++ {0x416c1, 0x803}, ++ {0x416c2, 0x0}, ++ {0x416c3, 0x5a00}, ++ {0x416c4, 0x0}, ++ {0x416c5, 0x0}, ++ {0x416c6, 0x0}, ++ {0x416c7, 0x0}, ++ {0x416c8, 0x0}, ++ {0x416c9, 0x0}, ++ {0x416ca, 0x0}, ++ {0x416cb, 0x0}, ++ {0x416cc, 0x0}, ++ {0x416cd, 0x0}, ++ {0x416ce, 0x0}, ++ {0x416cf, 0x0}, ++ {0x416d0, 0x0}, ++ {0x416d1, 0x0}, ++ {0x416d2, 0x0}, ++ {0x416d3, 0x100}, ++ {0x416d4, 0x0}, ++ {0x416d5, 0x0}, ++ {0x416d6, 0x0}, ++ {0x416d7, 0x0}, ++ {0x416d8, 0x4050}, ++ {0x416d9, 0x803}, ++ {0x416da, 0x0}, ++ {0x416db, 0x0}, ++ {0x416dc, 0x0}, ++ {0x416dd, 0x0}, ++ {0x416de, 0x0}, ++ {0x416df, 0x0}, ++ {0x416e0, 0x0}, ++ {0x416e1, 0x0}, ++ {0x416e2, 0x0}, ++ {0x416e3, 0x6b00}, ++ {0x416e4, 0x0}, ++ {0x416e5, 0x0}, ++ {0x416e6, 0x0}, ++ {0x416e7, 0x400}, ++ {0x416e8, 0x407c}, ++ {0x416e9, 0x0}, ++ {0x416ea, 0x0}, ++ {0x416eb, 0x0}, ++ {0x416ec, 0x0}, ++ {0x416ed, 0x0}, ++ {0x416ee, 0x0}, ++ {0x416ef, 0x0}, ++ {0x416f0, 0x0}, ++ {0x416f1, 0x0}, ++ {0x416f2, 0x0}, ++ {0x416f3, 0x3b00}, ++ {0x416f4, 0x0}, ++ {0x416f5, 0x0}, ++ {0x416f6, 0x0}, ++ {0x416f7, 0x0}, ++ {0x416f8, 0x0}, ++ {0x416f9, 0x0}, ++ {0x416fa, 0x0}, ++ {0x416fb, 0x0}, ++ {0x416fc, 0x0}, ++ {0x416fd, 0x0}, ++ {0x416fe, 0x1}, ++ {0x416ff, 0x0}, ++ {0x41700, 0x5758}, ++ {0x41701, 0x0}, ++ {0x41702, 0x0}, ++ {0x41703, 0x0}, ++ {0x41704, 0x4208}, ++ {0x41705, 0x0}, ++ {0x41706, 0x0}, ++ {0x41707, 0x0}, ++ {0x41708, 0x0}, ++ {0x41709, 0x0}, ++ {0x4170a, 0x0}, ++ {0x4170b, 0x4b00}, ++ {0x4170c, 0x0}, ++ {0x4170d, 0x0}, ++ {0x4170e, 0x0}, ++ {0x4170f, 0x0}, ++ {0x41710, 0x0}, ++ {0x41711, 0x0}, ++ {0x41712, 0x0}, ++ {0x41713, 0x0}, ++ {0x41714, 0x401c}, ++ {0x41715, 0xd0}, ++ {0x41716, 0x1}, ++ {0x41717, 0x0}, ++ {0x41718, 0x4060}, ++ {0x41719, 0x84}, ++ {0x4171a, 0x0}, ++ {0x4171b, 0x0}, ++ {0x4171c, 0x0}, ++ {0x4171d, 0x0}, ++ {0x4171e, 0x0}, ++ {0x4171f, 0x0}, ++ {0x41720, 0x0}, ++ {0x41721, 0x0}, ++ {0x41722, 0x0}, ++ {0x41723, 0x7b00}, ++ {0x41724, 0x0}, ++ {0x41725, 0x0}, ++ {0x41726, 0x0}, ++ {0x41727, 0x0}, ++ {0x41728, 0x407c}, ++ {0x41729, 0x0}, ++ {0x4172a, 0x0}, ++ {0x4172b, 0x0}, ++ {0x4172c, 0x0}, ++ {0x4172d, 0x0}, ++ {0x4172e, 0x0}, ++ {0x4172f, 0x0}, ++ {0x41730, 0x0}, ++ {0x41731, 0x0}, ++ {0x41732, 0x0}, ++ {0x41733, 0x0}, ++ {0x41734, 0x4000}, ++ {0x41735, 0x0}, ++ {0x41736, 0x1}, ++ {0x41737, 0x0}, ++ {0x41738, 0x0}, ++ {0x41739, 0x0}, ++ {0x4173a, 0x0}, ++ {0x4173b, 0x0}, ++ {0x4173c, 0x402c}, ++ {0x4173d, 0xd00}, ++ {0x4173e, 0x1}, ++ {0x4173f, 0x0}, ++ {0x41740, 0x4020}, ++ {0x41741, 0x803}, ++ {0x41742, 0x0}, ++ {0x41743, 0x0}, ++ {0x41744, 0x0}, ++ {0x41745, 0x0}, ++ {0x41746, 0x0}, ++ {0x41747, 0x0}, ++ {0x41748, 0x0}, ++ {0x41749, 0x0}, ++ {0x4174a, 0x0}, ++ {0x4174b, 0x2b00}, ++ {0x4174c, 0x0}, ++ {0x4174d, 0x0}, ++ {0x4174e, 0x0}, ++ {0x4174f, 0x800}, ++ {0x41750, 0x0}, ++ {0x41751, 0x0}, ++ {0x41752, 0x0}, ++ {0x41753, 0x0}, ++ {0x41754, 0x407c}, ++ {0x41755, 0x0}, ++ {0x41756, 0x0}, ++ {0x41757, 0x0}, ++ {0x41758, 0x0}, ++ {0x41759, 0x0}, ++ {0x4175a, 0x0}, ++ {0x4175b, 0x0}, ++ {0x4175c, 0x0}, ++ {0x4175d, 0x0}, ++ {0x4175e, 0x0}, ++ {0x4175f, 0x0}, ++ {0x41760, 0x4000}, ++ {0x41761, 0x0}, ++ {0x41762, 0x1}, ++ {0x41763, 0x0}, ++ {0x41764, 0x0}, ++ {0x41765, 0x0}, ++ {0x41766, 0x0}, ++ {0x41767, 0x0}, ++ {0x41768, 0x5758}, ++ {0x41769, 0x0}, ++ {0x4176a, 0x0}, ++ {0x4176b, 0x0}, ++ {0x4176c, 0x4008}, ++ {0x4176d, 0x0}, ++ {0x4176e, 0x0}, ++ {0x4176f, 0x0}, ++ {0x41770, 0x0}, ++ {0x41771, 0x0}, ++ {0x41772, 0x0}, ++ {0x41773, 0x0}, ++ {0x41774, 0x0}, ++ {0x41775, 0x0}, ++ {0x41776, 0x0}, ++ {0x41777, 0x0}, ++ {0x41778, 0x802c}, ++ {0x41779, 0xd00}, ++ {0x4177a, 0x1}, ++ {0x4177b, 0x10}, ++ {0x4177c, 0x8050}, ++ {0x4177d, 0x803}, ++ {0x4177e, 0x0}, ++ {0x4177f, 0x10}, ++ {0x41780, 0x0}, ++ {0x41781, 0x0}, ++ {0x41782, 0x0}, ++ {0x41783, 0x1b00}, ++ {0x41784, 0x0}, ++ {0x41785, 0x0}, ++ {0x41786, 0x0}, ++ {0x41787, 0x0}, ++ {0x41788, 0x0}, ++ {0x41789, 0x0}, ++ {0x4178a, 0x0}, ++ {0x4178b, 0x0}, ++ {0x4178c, 0x0}, ++ {0x4178d, 0x0}, ++ {0x4178e, 0x0}, ++ {0x4178f, 0x0}, ++ {0x41790, 0x8050}, ++ {0x41791, 0x803}, ++ {0x41792, 0x0}, ++ {0x41793, 0x5a10}, ++ {0x41794, 0x0}, ++ {0x41795, 0x0}, ++ {0x41796, 0x0}, ++ {0x41797, 0x0}, ++ {0x41798, 0x0}, ++ {0x41799, 0x0}, ++ {0x4179a, 0x0}, ++ {0x4179b, 0x0}, ++ {0x4179c, 0x0}, ++ {0x4179d, 0x0}, ++ {0x4179e, 0x0}, ++ {0x4179f, 0x0}, ++ {0x417a0, 0x0}, ++ {0x417a1, 0x0}, ++ {0x417a2, 0x0}, ++ {0x417a3, 0x100}, ++ {0x417a4, 0x0}, ++ {0x417a5, 0x0}, ++ {0x417a6, 0x0}, ++ {0x417a7, 0x0}, ++ {0x417a8, 0x8050}, ++ {0x417a9, 0x803}, ++ {0x417aa, 0x0}, ++ {0x417ab, 0x10}, ++ {0x417ac, 0x0}, ++ {0x417ad, 0x0}, ++ {0x417ae, 0x0}, ++ {0x417af, 0x0}, ++ {0x417b0, 0x0}, ++ {0x417b1, 0x0}, ++ {0x417b2, 0x0}, ++ {0x417b3, 0x6b00}, ++ {0x417b4, 0x0}, ++ {0x417b5, 0x0}, ++ {0x417b6, 0x0}, ++ {0x417b7, 0x400}, ++ {0x417b8, 0x807c}, ++ {0x417b9, 0x0}, ++ {0x417ba, 0x0}, ++ {0x417bb, 0x10}, ++ {0x417bc, 0x0}, ++ {0x417bd, 0x0}, ++ {0x417be, 0x0}, ++ {0x417bf, 0x0}, ++ {0x417c0, 0x0}, ++ {0x417c1, 0x0}, ++ {0x417c2, 0x0}, ++ {0x417c3, 0x3b00}, ++ {0x417c4, 0x0}, ++ {0x417c5, 0x0}, ++ {0x417c6, 0x0}, ++ {0x417c7, 0x0}, ++ {0x417c8, 0x0}, ++ {0x417c9, 0x0}, ++ {0x417ca, 0x0}, ++ {0x417cb, 0x0}, ++ {0x417cc, 0x0}, ++ {0x417cd, 0x0}, ++ {0x417ce, 0x1}, ++ {0x417cf, 0x0}, ++ {0x417d0, 0x9758}, ++ {0x417d1, 0x0}, ++ {0x417d2, 0x0}, ++ {0x417d3, 0x10}, ++ {0x417d4, 0x8208}, ++ {0x417d5, 0x0}, ++ {0x417d6, 0x0}, ++ {0x417d7, 0x10}, ++ {0x417d8, 0x0}, ++ {0x417d9, 0x0}, ++ {0x417da, 0x0}, ++ {0x417db, 0x4b00}, ++ {0x417dc, 0x0}, ++ {0x417dd, 0x0}, ++ {0x417de, 0x0}, ++ {0x417df, 0x0}, ++ {0x417e0, 0x0}, ++ {0x417e1, 0x0}, ++ {0x417e2, 0x0}, ++ {0x417e3, 0x0}, ++ {0x417e4, 0x801c}, ++ {0x417e5, 0xd0}, ++ {0x417e6, 0x1}, ++ {0x417e7, 0x10}, ++ {0x417e8, 0x8060}, ++ {0x417e9, 0x84}, ++ {0x417ea, 0x0}, ++ {0x417eb, 0x10}, ++ {0x417ec, 0x0}, ++ {0x417ed, 0x0}, ++ {0x417ee, 0x0}, ++ {0x417ef, 0x0}, ++ {0x417f0, 0x0}, ++ {0x417f1, 0x0}, ++ {0x417f2, 0x0}, ++ {0x417f3, 0x7b00}, ++ {0x417f4, 0x0}, ++ {0x417f5, 0x0}, ++ {0x417f6, 0x0}, ++ {0x417f7, 0x0}, ++ {0x417f8, 0x807c}, ++ {0x417f9, 0x0}, ++ {0x417fa, 0x0}, ++ {0x417fb, 0x10}, ++ {0x417fc, 0x0}, ++ {0x417fd, 0x0}, ++ {0x417fe, 0x0}, ++ {0x417ff, 0x0}, ++ {0x41800, 0x0}, ++ {0x41801, 0x0}, ++ {0x41802, 0x0}, ++ {0x41803, 0x0}, ++ {0x41804, 0x8000}, ++ {0x41805, 0x0}, ++ {0x41806, 0x1}, ++ {0x41807, 0x10}, ++ {0x41808, 0x0}, ++ {0x41809, 0x0}, ++ {0x4180a, 0x0}, ++ {0x4180b, 0x0}, ++ {0x4180c, 0x802c}, ++ {0x4180d, 0xd00}, ++ {0x4180e, 0x1}, ++ {0x4180f, 0x10}, ++ {0x41810, 0x8020}, ++ {0x41811, 0x803}, ++ {0x41812, 0x0}, ++ {0x41813, 0x10}, ++ {0x41814, 0x0}, ++ {0x41815, 0x0}, ++ {0x41816, 0x0}, ++ {0x41817, 0x0}, ++ {0x41818, 0x0}, ++ {0x41819, 0x0}, ++ {0x4181a, 0x0}, ++ {0x4181b, 0x2b00}, ++ {0x4181c, 0x0}, ++ {0x4181d, 0x0}, ++ {0x4181e, 0x0}, ++ {0x4181f, 0x800}, ++ {0x41820, 0x0}, ++ {0x41821, 0x0}, ++ {0x41822, 0x0}, ++ {0x41823, 0x0}, ++ {0x41824, 0x807c}, ++ {0x41825, 0x0}, ++ {0x41826, 0x0}, ++ {0x41827, 0x10}, ++ {0x41828, 0x0}, ++ {0x41829, 0x0}, ++ {0x4182a, 0x0}, ++ {0x4182b, 0x0}, ++ {0x4182c, 0x0}, ++ {0x4182d, 0x0}, ++ {0x4182e, 0x0}, ++ {0x4182f, 0x0}, ++ {0x41830, 0x8000}, ++ {0x41831, 0x0}, ++ {0x41832, 0x1}, ++ {0x41833, 0x10}, ++ {0x41834, 0x0}, ++ {0x41835, 0x0}, ++ {0x41836, 0x0}, ++ {0x41837, 0x0}, ++ {0x41838, 0x9758}, ++ {0x41839, 0x0}, ++ {0x4183a, 0x0}, ++ {0x4183b, 0x10}, ++ {0x4183c, 0x8008}, ++ {0x4183d, 0x0}, ++ {0x4183e, 0x0}, ++ {0x4183f, 0x10}, ++ {0x41840, 0x0}, ++ {0x41841, 0x0}, ++ {0x41842, 0x0}, ++ {0x41843, 0x0}, ++ {0x41844, 0x0}, ++ {0x41845, 0x0}, ++ {0x41846, 0x0}, ++ {0x41847, 0x0}, ++ {0x41848, 0xc068}, ++ {0x41849, 0x0}, ++ {0x4184a, 0x0}, ++ {0x4184b, 0x10}, ++ {0x4184c, 0x0}, ++ {0x4184d, 0x0}, ++ {0x4184e, 0x0}, ++ {0x4184f, 0x0}, ++ {0x41850, 0xd2d8}, ++ {0x41851, 0x0}, ++ {0x41852, 0x0}, ++ {0x41853, 0x10}, ++ {0x41854, 0xe008}, ++ {0x41855, 0x0}, ++ {0x41856, 0x0}, ++ {0x41857, 0x10}, ++ {0x41858, 0x0}, ++ {0x41859, 0x0}, ++ {0x4185a, 0x0}, ++ {0x4185b, 0x5b00}, ++ {0x4185c, 0x0}, ++ {0x4185d, 0x0}, ++ {0x4185e, 0x0}, ++ {0x4185f, 0x0}, ++ {0x41860, 0xc0f0}, ++ {0x41861, 0x0}, ++ {0x41862, 0x0}, ++ {0x41863, 0x10}, ++ {0x41864, 0x0}, ++ {0x41865, 0x0}, ++ {0x41866, 0x0}, ++ {0x41867, 0x0}, ++ {0x41868, 0xcfd8}, ++ {0x41869, 0x0}, ++ {0x4186a, 0x0}, ++ {0x4186b, 0x10}, ++ {0x4186c, 0xc008}, ++ {0x4186d, 0x0}, ++ {0x4186e, 0x0}, ++ {0x4186f, 0x10}, ++ {0x41870, 0x0}, ++ {0x41871, 0x0}, ++ {0x41872, 0x0}, ++ {0x41873, 0x2b00}, ++ {0x41874, 0x0}, ++ {0x41875, 0x0}, ++ {0x41876, 0x0}, ++ {0x41877, 0x0}, ++ {0x41878, 0xd058}, ++ {0x41879, 0x0}, ++ {0x4187a, 0x0}, ++ {0x4187b, 0x10}, ++ {0x4187c, 0xc008}, ++ {0x4187d, 0x0}, ++ {0x4187e, 0x0}, ++ {0x4187f, 0x10}, ++ {0x41880, 0x0}, ++ {0x41881, 0x0}, ++ {0x41882, 0x0}, ++ {0x41883, 0x2b00}, ++ {0x41884, 0x0}, ++ {0x41885, 0x0}, ++ {0x41886, 0x0}, ++ {0x41887, 0x0}, ++ {0x41888, 0xd0d8}, ++ {0x41889, 0x0}, ++ {0x4188a, 0x0}, ++ {0x4188b, 0x10}, ++ {0x4188c, 0xc088}, ++ {0x4188d, 0x0}, ++ {0x4188e, 0x0}, ++ {0x4188f, 0x10}, ++ {0x41890, 0x0}, ++ {0x41891, 0x0}, ++ {0x41892, 0x0}, ++ {0x41893, 0x2b00}, ++ {0x41894, 0x0}, ++ {0x41895, 0x0}, ++ {0x41896, 0x0}, ++ {0x41897, 0x0}, ++ {0x41898, 0xd158}, ++ {0x41899, 0x0}, ++ {0x4189a, 0x0}, ++ {0x4189b, 0x10}, ++ {0x4189c, 0xc008}, ++ {0x4189d, 0x0}, ++ {0x4189e, 0x0}, ++ {0x4189f, 0x10}, ++ {0x418a0, 0x0}, ++ {0x418a1, 0x0}, ++ {0x418a2, 0x0}, ++ {0x418a3, 0x5b00}, ++ {0x418a4, 0x0}, ++ {0x418a5, 0x0}, ++ {0x418a6, 0x0}, ++ {0x418a7, 0x0}, ++ {0x418a8, 0x402c}, ++ {0x418a9, 0xd00}, ++ {0x418aa, 0x1}, ++ {0x418ab, 0x400}, ++ {0x418ac, 0x4050}, ++ {0x418ad, 0x800}, ++ {0x418ae, 0x0}, ++ {0x418af, 0x0}, ++ {0x418b0, 0x0}, ++ {0x418b1, 0x0}, ++ {0x418b2, 0x0}, ++ {0x418b3, 0x400}, ++ {0x418b4, 0x4050}, ++ {0x418b5, 0x803}, ++ {0x418b6, 0x0}, ++ {0x418b7, 0x0}, ++ {0x418b8, 0x0}, ++ {0x418b9, 0x0}, ++ {0x418ba, 0x0}, ++ {0x418bb, 0x6f00}, ++ {0x418bc, 0x0}, ++ {0x418bd, 0x0}, ++ {0x418be, 0x0}, ++ {0x418bf, 0x400}, ++ {0x418c0, 0x407c}, ++ {0x418c1, 0x0}, ++ {0x418c2, 0x0}, ++ {0x418c3, 0x400}, ++ {0x418c4, 0x0}, ++ {0x418c5, 0x0}, ++ {0x418c6, 0x0}, ++ {0x418c7, 0x0}, ++ {0x418c8, 0x0}, ++ {0x418c9, 0x0}, ++ {0x418ca, 0x0}, ++ {0x418cb, 0x400}, ++ {0x418cc, 0x0}, ++ {0x418cd, 0x0}, ++ {0x418ce, 0x1}, ++ {0x418cf, 0x0}, ++ {0x418d0, 0x0}, ++ {0x418d1, 0x0}, ++ {0x418d2, 0x0}, ++ {0x418d3, 0x400}, ++ {0x418d4, 0x0}, ++ {0x418d5, 0x0}, ++ {0x418d6, 0x0}, ++ {0x418d7, 0x0}, ++ {0x418d8, 0x0}, ++ {0x418d9, 0x0}, ++ {0x418da, 0x0}, ++ {0x418db, 0x0}, ++ {0x418dc, 0x0}, ++ {0x418dd, 0x0}, ++ {0x418de, 0x0}, ++ {0x418df, 0x0}, ++ {0x418e0, 0x802c}, ++ {0x418e1, 0xd00}, ++ {0x418e2, 0x1}, ++ {0x418e3, 0x410}, ++ {0x418e4, 0x8050}, ++ {0x418e5, 0x800}, ++ {0x418e6, 0x0}, ++ {0x418e7, 0x10}, ++ {0x418e8, 0x0}, ++ {0x418e9, 0x0}, ++ {0x418ea, 0x0}, ++ {0x418eb, 0x400}, ++ {0x418ec, 0x8050}, ++ {0x418ed, 0x803}, ++ {0x418ee, 0x0}, ++ {0x418ef, 0x10}, ++ {0x418f0, 0x0}, ++ {0x418f1, 0x0}, ++ {0x418f2, 0x0}, ++ {0x418f3, 0x6f00}, ++ {0x418f4, 0x0}, ++ {0x418f5, 0x0}, ++ {0x418f6, 0x0}, ++ {0x418f7, 0x400}, ++ {0x418f8, 0x807c}, ++ {0x418f9, 0x0}, ++ {0x418fa, 0x0}, ++ {0x418fb, 0x410}, ++ {0x418fc, 0x0}, ++ {0x418fd, 0x0}, ++ {0x418fe, 0x0}, ++ {0x418ff, 0x0}, ++ {0x41900, 0x0}, ++ {0x41901, 0x0}, ++ {0x41902, 0x0}, ++ {0x41903, 0x400}, ++ {0x41904, 0x0}, ++ {0x41905, 0x0}, ++ {0x41906, 0x1}, ++ {0x41907, 0x0}, ++ {0x41908, 0x0}, ++ {0x41909, 0x0}, ++ {0x4190a, 0x0}, ++ {0x4190b, 0x400}, ++ {0x4190c, 0x0}, ++ {0x4190d, 0x0}, ++ {0x4190e, 0x0}, ++ {0x4190f, 0x0}, ++ {0x41910, 0x0}, ++ {0x41911, 0x0}, ++ {0x41912, 0x0}, ++ {0x41913, 0x0}, ++ {0x41914, 0x0}, ++ {0x41915, 0x0}, ++ {0x41916, 0x0}, ++ {0x41917, 0x0}, ++ {0x41918, 0x402c}, ++ {0x41919, 0xd00}, ++ {0x4191a, 0x1}, ++ {0x4191b, 0x0}, ++ {0x4191c, 0x4050}, ++ {0x4191d, 0x800}, ++ {0x4191e, 0x0}, ++ {0x4191f, 0x0}, ++ {0x41920, 0x0}, ++ {0x41921, 0x0}, ++ {0x41922, 0x0}, ++ {0x41923, 0x0}, ++ {0x41924, 0x4050}, ++ {0x41925, 0x803}, ++ {0x41926, 0x0}, ++ {0x41927, 0x0}, ++ {0x41928, 0x0}, ++ {0x41929, 0x0}, ++ {0x4192a, 0x0}, ++ {0x4192b, 0x0}, ++ {0x4192c, 0x4050}, ++ {0x4192d, 0x800}, ++ {0x4192e, 0x0}, ++ {0x4192f, 0x0}, ++ {0x41930, 0x0}, ++ {0x41931, 0x0}, ++ {0x41932, 0x0}, ++ {0x41933, 0x4b00}, ++ {0x41934, 0x0}, ++ {0x41935, 0x0}, ++ {0x41936, 0x0}, ++ {0x41937, 0x400}, ++ {0x41938, 0x0}, ++ {0x41939, 0x0}, ++ {0x4193a, 0x0}, ++ {0x4193b, 0x0}, ++ {0x4193c, 0x407c}, ++ {0x4193d, 0x0}, ++ {0x4193e, 0x0}, ++ {0x4193f, 0x0}, ++ {0x41940, 0x0}, ++ {0x41941, 0x0}, ++ {0x41942, 0x0}, ++ {0x41943, 0x0}, ++ {0x41944, 0x0}, ++ {0x41945, 0x0}, ++ {0x41946, 0x0}, ++ {0x41947, 0x0}, ++ {0x41948, 0x0}, ++ {0x41949, 0x0}, ++ {0x4194a, 0x1}, ++ {0x4194b, 0x0}, ++ {0x4194c, 0x0}, ++ {0x4194d, 0x0}, ++ {0x4194e, 0x0}, ++ {0x4194f, 0x0}, ++ {0x41950, 0x0}, ++ {0x41951, 0x0}, ++ {0x41952, 0x0}, ++ {0x41953, 0x4b00}, ++ {0x41954, 0x0}, ++ {0x41955, 0x0}, ++ {0x41956, 0x0}, ++ {0x41957, 0x1800}, ++ {0x41958, 0x0}, ++ {0x41959, 0x0}, ++ {0x4195a, 0x0}, ++ {0x4195b, 0x0}, ++ {0x4195c, 0x802c}, ++ {0x4195d, 0xd00}, ++ {0x4195e, 0x1}, ++ {0x4195f, 0x10}, ++ {0x41960, 0x8050}, ++ {0x41961, 0x800}, ++ {0x41962, 0x0}, ++ {0x41963, 0x10}, ++ {0x41964, 0x0}, ++ {0x41965, 0x0}, ++ {0x41966, 0x0}, ++ {0x41967, 0x0}, ++ {0x41968, 0x8050}, ++ {0x41969, 0x803}, ++ {0x4196a, 0x0}, ++ {0x4196b, 0x10}, ++ {0x4196c, 0x0}, ++ {0x4196d, 0x0}, ++ {0x4196e, 0x0}, ++ {0x4196f, 0x0}, ++ {0x41970, 0x8050}, ++ {0x41971, 0x800}, ++ {0x41972, 0x0}, ++ {0x41973, 0x10}, ++ {0x41974, 0x0}, ++ {0x41975, 0x0}, ++ {0x41976, 0x0}, ++ {0x41977, 0x0}, ++ {0x41978, 0x0}, ++ {0x41979, 0x0}, ++ {0x4197a, 0x0}, ++ {0x4197b, 0x4b00}, ++ {0x4197c, 0x0}, ++ {0x4197d, 0x0}, ++ {0x4197e, 0x0}, ++ {0x4197f, 0x400}, ++ {0x41980, 0x807c}, ++ {0x41981, 0x0}, ++ {0x41982, 0x0}, ++ {0x41983, 0x10}, ++ {0x41984, 0x0}, ++ {0x41985, 0x0}, ++ {0x41986, 0x0}, ++ {0x41987, 0x0}, ++ {0x41988, 0x0}, ++ {0x41989, 0x0}, ++ {0x4198a, 0x0}, ++ {0x4198b, 0x0}, ++ {0x4198c, 0x0}, ++ {0x4198d, 0x0}, ++ {0x4198e, 0x1}, ++ {0x4198f, 0x0}, ++ {0x41990, 0x0}, ++ {0x41991, 0x0}, ++ {0x41992, 0x0}, ++ {0x41993, 0x5b00}, ++ {0x41994, 0x0}, ++ {0x41995, 0x0}, ++ {0x41996, 0x0}, ++ {0x41997, 0x2000}, ++ {0x41998, 0x402c}, ++ {0x41999, 0xd00}, ++ {0x4199a, 0x1}, ++ {0x4199b, 0x0}, ++ {0x4199c, 0x5198}, ++ {0x4199d, 0x803}, ++ {0x4199e, 0x0}, ++ {0x4199f, 0x0}, ++ {0x419a0, 0x0}, ++ {0x419a1, 0x0}, ++ {0x419a2, 0x0}, ++ {0x419a3, 0x1b00}, ++ {0x419a4, 0x0}, ++ {0x419a5, 0x0}, ++ {0x419a6, 0x0}, ++ {0x419a7, 0x0}, ++ {0x419a8, 0x5218}, ++ {0x419a9, 0x803}, ++ {0x419aa, 0x0}, ++ {0x419ab, 0x0}, ++ {0x419ac, 0x0}, ++ {0x419ad, 0x0}, ++ {0x419ae, 0x0}, ++ {0x419af, 0x0}, ++ {0x419b0, 0x0}, ++ {0x419b1, 0x0}, ++ {0x419b2, 0x0}, ++ {0x419b3, 0x4b00}, ++ {0x419b4, 0x0}, ++ {0x419b5, 0x0}, ++ {0x419b6, 0x0}, ++ {0x419b7, 0x400}, ++ {0x419b8, 0x407c}, ++ {0x419b9, 0x0}, ++ {0x419ba, 0x0}, ++ {0x419bb, 0x0}, ++ {0x419bc, 0x0}, ++ {0x419bd, 0x0}, ++ {0x419be, 0x0}, ++ {0x419bf, 0x0}, ++ {0x419c0, 0x0}, ++ {0x419c1, 0x0}, ++ {0x419c2, 0x0}, ++ {0x419c3, 0x0}, ++ {0x419c4, 0x0}, ++ {0x419c5, 0x0}, ++ {0x419c6, 0x1}, ++ {0x419c7, 0x0}, ++ {0x419c8, 0x0}, ++ {0x419c9, 0x0}, ++ {0x419ca, 0x0}, ++ {0x419cb, 0x1b00}, ++ {0x419cc, 0x0}, ++ {0x419cd, 0x0}, ++ {0x419ce, 0x0}, ++ {0x419cf, 0x0}, ++ {0x419d0, 0x0}, ++ {0x419d1, 0x0}, ++ {0x419d2, 0x0}, ++ {0x419d3, 0x0}, ++ {0x419d4, 0x802c}, ++ {0x419d5, 0xd00}, ++ {0x419d6, 0x1}, ++ {0x419d7, 0x10}, ++ {0x419d8, 0x9198}, ++ {0x419d9, 0x803}, ++ {0x419da, 0x0}, ++ {0x419db, 0x10}, ++ {0x419dc, 0x0}, ++ {0x419dd, 0x0}, ++ {0x419de, 0x0}, ++ {0x419df, 0x0}, ++ {0x419e0, 0x0}, ++ {0x419e1, 0x0}, ++ {0x419e2, 0x0}, ++ {0x419e3, 0x0}, ++ {0x419e4, 0x0}, ++ {0x419e5, 0x0}, ++ {0x419e6, 0x0}, ++ {0x419e7, 0x0}, ++ {0x419e8, 0x0}, ++ {0x419e9, 0x0}, ++ {0x419ea, 0x0}, ++ {0x419eb, 0x0}, ++ {0x419ec, 0x9218}, ++ {0x419ed, 0x803}, ++ {0x419ee, 0x0}, ++ {0x419ef, 0x10}, ++ {0x419f0, 0x0}, ++ {0x419f1, 0x0}, ++ {0x419f2, 0x0}, ++ {0x419f3, 0x4b00}, ++ {0x419f4, 0x0}, ++ {0x419f5, 0x0}, ++ {0x419f6, 0x0}, ++ {0x419f7, 0x400}, ++ {0x419f8, 0x0}, ++ {0x419f9, 0x0}, ++ {0x419fa, 0x0}, ++ {0x419fb, 0x0}, ++ {0x419fc, 0x807c}, ++ {0x419fd, 0x0}, ++ {0x419fe, 0x0}, ++ {0x419ff, 0x10}, ++ {0x41a00, 0x0}, ++ {0x41a01, 0x0}, ++ {0x41a02, 0x0}, ++ {0x41a03, 0x0}, ++ {0x41a04, 0x0}, ++ {0x41a05, 0x0}, ++ {0x41a06, 0x0}, ++ {0x41a07, 0x0}, ++ {0x41a08, 0x0}, ++ {0x41a09, 0x0}, ++ {0x41a0a, 0x1}, ++ {0x41a0b, 0x0}, ++ {0x41a0c, 0x0}, ++ {0x41a0d, 0x0}, ++ {0x41a0e, 0x0}, ++ {0x41a0f, 0x0}, ++ {0x41a10, 0x0}, ++ {0x41a11, 0x0}, ++ {0x41a12, 0x0}, ++ {0x41a13, 0xb00}, ++ {0x41a14, 0x0}, ++ {0x41a15, 0x0}, ++ {0x41a16, 0x0}, ++ {0x41a17, 0x400}, ++ {0x41a18, 0x0}, ++ {0x41a19, 0x0}, ++ {0x41a1a, 0x0}, ++ {0x41a1b, 0x0}, ++ {0x41a1c, 0x0}, ++ {0x41a1d, 0x0}, ++ {0x41a1e, 0x0}, ++ {0x41a1f, 0x0}, ++ {0x41a20, 0x401c}, ++ {0x41a21, 0xd0}, ++ {0x41a22, 0x1}, ++ {0x41a23, 0x0}, ++ {0x41a24, 0x4060}, ++ {0x41a25, 0x84}, ++ {0x41a26, 0x0}, ++ {0x41a27, 0x0}, ++ {0x41a28, 0x0}, ++ {0x41a29, 0x0}, ++ {0x41a2a, 0x0}, ++ {0x41a2b, 0xb00}, ++ {0x41a2c, 0x0}, ++ {0x41a2d, 0x0}, ++ {0x41a2e, 0x0}, ++ {0x41a2f, 0x800}, ++ {0x41a30, 0x407c}, ++ {0x41a31, 0x0}, ++ {0x41a32, 0x0}, ++ {0x41a33, 0x0}, ++ {0x41a34, 0x0}, ++ {0x41a35, 0x0}, ++ {0x41a36, 0x0}, ++ {0x41a37, 0x0}, ++ {0x41a38, 0x0}, ++ {0x41a39, 0x0}, ++ {0x41a3a, 0x0}, ++ {0x41a3b, 0x0}, ++ {0x41a3c, 0x4000}, ++ {0x41a3d, 0x0}, ++ {0x41a3e, 0x1}, ++ {0x41a3f, 0x0}, ++ {0x41a40, 0x0}, ++ {0x41a41, 0x0}, ++ {0x41a42, 0x0}, ++ {0x41a43, 0x0}, ++ {0x41a44, 0x402c}, ++ {0x41a45, 0xd00}, ++ {0x41a46, 0x1}, ++ {0x41a47, 0x0}, ++ {0x41a48, 0x4020}, ++ {0x41a49, 0x803}, ++ {0x41a4a, 0x0}, ++ {0x41a4b, 0x0}, ++ {0x41a4c, 0x0}, ++ {0x41a4d, 0x0}, ++ {0x41a4e, 0x0}, ++ {0x41a4f, 0x0}, ++ {0x41a50, 0x0}, ++ {0x41a51, 0x0}, ++ {0x41a52, 0x0}, ++ {0x41a53, 0x2b00}, ++ {0x41a54, 0x0}, ++ {0x41a55, 0x0}, ++ {0x41a56, 0x0}, ++ {0x41a57, 0x800}, ++ {0x41a58, 0x0}, ++ {0x41a59, 0x0}, ++ {0x41a5a, 0x0}, ++ {0x41a5b, 0x0}, ++ {0x41a5c, 0x407c}, ++ {0x41a5d, 0x0}, ++ {0x41a5e, 0x0}, ++ {0x41a5f, 0x0}, ++ {0x41a60, 0x0}, ++ {0x41a61, 0x0}, ++ {0x41a62, 0x0}, ++ {0x41a63, 0x0}, ++ {0x41a64, 0x0}, ++ {0x41a65, 0x0}, ++ {0x41a66, 0x0}, ++ {0x41a67, 0x0}, ++ {0x41a68, 0x0}, ++ {0x41a69, 0x0}, ++ {0x41a6a, 0x1}, ++ {0x41a6b, 0x0}, ++ {0x41a6c, 0x0}, ++ {0x41a6d, 0x0}, ++ {0x41a6e, 0x0}, ++ {0x41a6f, 0x0}, ++ {0x41a70, 0x801c}, ++ {0x41a71, 0xd0}, ++ {0x41a72, 0x1}, ++ {0x41a73, 0x10}, ++ {0x41a74, 0x8060}, ++ {0x41a75, 0x84}, ++ {0x41a76, 0x0}, ++ {0x41a77, 0x10}, ++ {0x41a78, 0x0}, ++ {0x41a79, 0x0}, ++ {0x41a7a, 0x0}, ++ {0x41a7b, 0xb00}, ++ {0x41a7c, 0x0}, ++ {0x41a7d, 0x0}, ++ {0x41a7e, 0x0}, ++ {0x41a7f, 0x800}, ++ {0x41a80, 0x807c}, ++ {0x41a81, 0x0}, ++ {0x41a82, 0x0}, ++ {0x41a83, 0x10}, ++ {0x41a84, 0x0}, ++ {0x41a85, 0x0}, ++ {0x41a86, 0x0}, ++ {0x41a87, 0x0}, ++ {0x41a88, 0x0}, ++ {0x41a89, 0x0}, ++ {0x41a8a, 0x0}, ++ {0x41a8b, 0x0}, ++ {0x41a8c, 0x8000}, ++ {0x41a8d, 0x0}, ++ {0x41a8e, 0x1}, ++ {0x41a8f, 0x10}, ++ {0x41a90, 0x0}, ++ {0x41a91, 0x0}, ++ {0x41a92, 0x0}, ++ {0x41a93, 0x0}, ++ {0x41a94, 0x802c}, ++ {0x41a95, 0xd00}, ++ {0x41a96, 0x1}, ++ {0x41a97, 0x10}, ++ {0x41a98, 0x8020}, ++ {0x41a99, 0x803}, ++ {0x41a9a, 0x0}, ++ {0x41a9b, 0x10}, ++ {0x41a9c, 0x0}, ++ {0x41a9d, 0x0}, ++ {0x41a9e, 0x0}, ++ {0x41a9f, 0x0}, ++ {0x41aa0, 0x0}, ++ {0x41aa1, 0x0}, ++ {0x41aa2, 0x0}, ++ {0x41aa3, 0x2b00}, ++ {0x41aa4, 0x0}, ++ {0x41aa5, 0x0}, ++ {0x41aa6, 0x0}, ++ {0x41aa7, 0x800}, ++ {0x41aa8, 0x0}, ++ {0x41aa9, 0x0}, ++ {0x41aaa, 0x0}, ++ {0x41aab, 0x0}, ++ {0x41aac, 0x807c}, ++ {0x41aad, 0x0}, ++ {0x41aae, 0x0}, ++ {0x41aaf, 0x10}, ++ {0x41ab0, 0x0}, ++ {0x41ab1, 0x0}, ++ {0x41ab2, 0x0}, ++ {0x41ab3, 0x0}, ++ {0x41ab4, 0x0}, ++ {0x41ab5, 0x0}, ++ {0x41ab6, 0x0}, ++ {0x41ab7, 0x0}, ++ {0x41ab8, 0x0}, ++ {0x41ab9, 0x0}, ++ {0x41aba, 0x1}, ++ {0x41abb, 0x0}, ++ {0x41abc, 0x0}, ++ {0x41abd, 0x0}, ++ {0x41abe, 0x0}, ++ {0x41abf, 0x0}, ++ {0x41ac0, 0x402c}, ++ {0x41ac1, 0xd00}, ++ {0x41ac2, 0x1}, ++ {0x41ac3, 0x0}, ++ {0x41ac4, 0x4050}, ++ {0x41ac5, 0x803}, ++ {0x41ac6, 0x0}, ++ {0x41ac7, 0x0}, ++ {0x41ac8, 0x0}, ++ {0x41ac9, 0x0}, ++ {0x41aca, 0x0}, ++ {0x41acb, 0x0}, ++ {0x41acc, 0x0}, ++ {0x41acd, 0x0}, ++ {0x41ace, 0x0}, ++ {0x41acf, 0x0}, ++ {0x41ad0, 0x0}, ++ {0x41ad1, 0x0}, ++ {0x41ad2, 0x0}, ++ {0x41ad3, 0x0}, ++ {0x41ad4, 0x0}, ++ {0x41ad5, 0x0}, ++ {0x41ad6, 0x0}, ++ {0x41ad7, 0x0}, ++ {0x41ad8, 0x4050}, ++ {0x41ad9, 0x803}, ++ {0x41ada, 0x0}, ++ {0x41adb, 0x5a00}, ++ {0x41adc, 0x0}, ++ {0x41add, 0x0}, ++ {0x41ade, 0x0}, ++ {0x41adf, 0x0}, ++ {0x41ae0, 0x0}, ++ {0x41ae1, 0x0}, ++ {0x41ae2, 0x0}, ++ {0x41ae3, 0x100}, ++ {0x41ae4, 0x0}, ++ {0x41ae5, 0x0}, ++ {0x41ae6, 0x0}, ++ {0x41ae7, 0x0}, ++ {0x41ae8, 0x4050}, ++ {0x41ae9, 0x803}, ++ {0x41aea, 0x0}, ++ {0x41aeb, 0x0}, ++ {0x41aec, 0x0}, ++ {0x41aed, 0x0}, ++ {0x41aee, 0x0}, ++ {0x41aef, 0x0}, ++ {0x41af0, 0x0}, ++ {0x41af1, 0x0}, ++ {0x41af2, 0x0}, ++ {0x41af3, 0x4b00}, ++ {0x41af4, 0x0}, ++ {0x41af5, 0x0}, ++ {0x41af6, 0x0}, ++ {0x41af7, 0x400}, ++ {0x41af8, 0x407c}, ++ {0x41af9, 0x0}, ++ {0x41afa, 0x0}, ++ {0x41afb, 0x0}, ++ {0x41afc, 0x0}, ++ {0x41afd, 0x0}, ++ {0x41afe, 0x0}, ++ {0x41aff, 0x0}, ++ {0x41b00, 0x0}, ++ {0x41b01, 0x0}, ++ {0x41b02, 0x0}, ++ {0x41b03, 0x3b00}, ++ {0x41b04, 0x0}, ++ {0x41b05, 0x0}, ++ {0x41b06, 0x0}, ++ {0x41b07, 0x0}, ++ {0x41b08, 0x0}, ++ {0x41b09, 0x0}, ++ {0x41b0a, 0x0}, ++ {0x41b0b, 0x0}, ++ {0x41b0c, 0x0}, ++ {0x41b0d, 0x0}, ++ {0x41b0e, 0x1}, ++ {0x41b0f, 0x0}, ++ {0x41b10, 0x5758}, ++ {0x41b11, 0x0}, ++ {0x41b12, 0x0}, ++ {0x41b13, 0x0}, ++ {0x41b14, 0x4208}, ++ {0x41b15, 0x0}, ++ {0x41b16, 0x0}, ++ {0x41b17, 0x0}, ++ {0x41b18, 0x0}, ++ {0x41b19, 0x0}, ++ {0x41b1a, 0x0}, ++ {0x41b1b, 0x4b00}, ++ {0x41b1c, 0x0}, ++ {0x41b1d, 0x0}, ++ {0x41b1e, 0x0}, ++ {0x41b1f, 0x0}, ++ {0x41b20, 0x0}, ++ {0x41b21, 0x0}, ++ {0x41b22, 0x0}, ++ {0x41b23, 0x0}, ++ {0x41b24, 0x401c}, ++ {0x41b25, 0xd0}, ++ {0x41b26, 0x1}, ++ {0x41b27, 0x0}, ++ {0x41b28, 0x4060}, ++ {0x41b29, 0x84}, ++ {0x41b2a, 0x0}, ++ {0x41b2b, 0x0}, ++ {0x41b2c, 0x0}, ++ {0x41b2d, 0x0}, ++ {0x41b2e, 0x0}, ++ {0x41b2f, 0x0}, ++ {0x41b30, 0x0}, ++ {0x41b31, 0x0}, ++ {0x41b32, 0x0}, ++ {0x41b33, 0x7b00}, ++ {0x41b34, 0x0}, ++ {0x41b35, 0x0}, ++ {0x41b36, 0x0}, ++ {0x41b37, 0x0}, ++ {0x41b38, 0x407c}, ++ {0x41b39, 0x0}, ++ {0x41b3a, 0x0}, ++ {0x41b3b, 0x0}, ++ {0x41b3c, 0x0}, ++ {0x41b3d, 0x0}, ++ {0x41b3e, 0x0}, ++ {0x41b3f, 0x0}, ++ {0x41b40, 0x0}, ++ {0x41b41, 0x0}, ++ {0x41b42, 0x0}, ++ {0x41b43, 0x0}, ++ {0x41b44, 0x4000}, ++ {0x41b45, 0x0}, ++ {0x41b46, 0x1}, ++ {0x41b47, 0x0}, ++ {0x41b48, 0x0}, ++ {0x41b49, 0x0}, ++ {0x41b4a, 0x0}, ++ {0x41b4b, 0x0}, ++ {0x41b4c, 0x402c}, ++ {0x41b4d, 0xd00}, ++ {0x41b4e, 0x1}, ++ {0x41b4f, 0x0}, ++ {0x41b50, 0x4020}, ++ {0x41b51, 0x803}, ++ {0x41b52, 0x0}, ++ {0x41b53, 0x0}, ++ {0x41b54, 0x0}, ++ {0x41b55, 0x0}, ++ {0x41b56, 0x0}, ++ {0x41b57, 0x0}, ++ {0x41b58, 0x0}, ++ {0x41b59, 0x0}, ++ {0x41b5a, 0x0}, ++ {0x41b5b, 0x2b00}, ++ {0x41b5c, 0x0}, ++ {0x41b5d, 0x0}, ++ {0x41b5e, 0x0}, ++ {0x41b5f, 0x800}, ++ {0x41b60, 0x0}, ++ {0x41b61, 0x0}, ++ {0x41b62, 0x0}, ++ {0x41b63, 0x0}, ++ {0x41b64, 0x407c}, ++ {0x41b65, 0x0}, ++ {0x41b66, 0x0}, ++ {0x41b67, 0x0}, ++ {0x41b68, 0x0}, ++ {0x41b69, 0x0}, ++ {0x41b6a, 0x0}, ++ {0x41b6b, 0x0}, ++ {0x41b6c, 0x0}, ++ {0x41b6d, 0x0}, ++ {0x41b6e, 0x0}, ++ {0x41b6f, 0x0}, ++ {0x41b70, 0x4000}, ++ {0x41b71, 0x0}, ++ {0x41b72, 0x1}, ++ {0x41b73, 0x0}, ++ {0x41b74, 0x0}, ++ {0x41b75, 0x0}, ++ {0x41b76, 0x0}, ++ {0x41b77, 0x0}, ++ {0x41b78, 0x5758}, ++ {0x41b79, 0x0}, ++ {0x41b7a, 0x0}, ++ {0x41b7b, 0x0}, ++ {0x41b7c, 0x4008}, ++ {0x41b7d, 0x0}, ++ {0x41b7e, 0x0}, ++ {0x41b7f, 0x0}, ++ {0x41b80, 0x0}, ++ {0x41b81, 0x0}, ++ {0x41b82, 0x0}, ++ {0x41b83, 0x0}, ++ {0x41b84, 0x0}, ++ {0x41b85, 0x0}, ++ {0x41b86, 0x0}, ++ {0x41b87, 0x0}, ++ {0x41b88, 0x802c}, ++ {0x41b89, 0xd00}, ++ {0x41b8a, 0x1}, ++ {0x41b8b, 0x10}, ++ {0x41b8c, 0x8050}, ++ {0x41b8d, 0x803}, ++ {0x41b8e, 0x0}, ++ {0x41b8f, 0x10}, ++ {0x41b90, 0x0}, ++ {0x41b91, 0x0}, ++ {0x41b92, 0x0}, ++ {0x41b93, 0x0}, ++ {0x41b94, 0x0}, ++ {0x41b95, 0x0}, ++ {0x41b96, 0x0}, ++ {0x41b97, 0x0}, ++ {0x41b98, 0x0}, ++ {0x41b99, 0x0}, ++ {0x41b9a, 0x0}, ++ {0x41b9b, 0x0}, ++ {0x41b9c, 0x0}, ++ {0x41b9d, 0x0}, ++ {0x41b9e, 0x0}, ++ {0x41b9f, 0x0}, ++ {0x41ba0, 0x8050}, ++ {0x41ba1, 0x803}, ++ {0x41ba2, 0x0}, ++ {0x41ba3, 0x5a10}, ++ {0x41ba4, 0x0}, ++ {0x41ba5, 0x0}, ++ {0x41ba6, 0x0}, ++ {0x41ba7, 0x0}, ++ {0x41ba8, 0x0}, ++ {0x41ba9, 0x0}, ++ {0x41baa, 0x0}, ++ {0x41bab, 0x100}, ++ {0x41bac, 0x0}, ++ {0x41bad, 0x0}, ++ {0x41bae, 0x0}, ++ {0x41baf, 0x0}, ++ {0x41bb0, 0x8050}, ++ {0x41bb1, 0x803}, ++ {0x41bb2, 0x0}, ++ {0x41bb3, 0x10}, ++ {0x41bb4, 0x0}, ++ {0x41bb5, 0x0}, ++ {0x41bb6, 0x0}, ++ {0x41bb7, 0x0}, ++ {0x41bb8, 0x0}, ++ {0x41bb9, 0x0}, ++ {0x41bba, 0x0}, ++ {0x41bbb, 0x4b00}, ++ {0x41bbc, 0x0}, ++ {0x41bbd, 0x0}, ++ {0x41bbe, 0x0}, ++ {0x41bbf, 0x400}, ++ {0x41bc0, 0x807c}, ++ {0x41bc1, 0x0}, ++ {0x41bc2, 0x0}, ++ {0x41bc3, 0x10}, ++ {0x41bc4, 0x0}, ++ {0x41bc5, 0x0}, ++ {0x41bc6, 0x0}, ++ {0x41bc7, 0x0}, ++ {0x41bc8, 0x0}, ++ {0x41bc9, 0x0}, ++ {0x41bca, 0x0}, ++ {0x41bcb, 0x3b00}, ++ {0x41bcc, 0x0}, ++ {0x41bcd, 0x0}, ++ {0x41bce, 0x0}, ++ {0x41bcf, 0x0}, ++ {0x41bd0, 0x0}, ++ {0x41bd1, 0x0}, ++ {0x41bd2, 0x0}, ++ {0x41bd3, 0x0}, ++ {0x41bd4, 0x0}, ++ {0x41bd5, 0x0}, ++ {0x41bd6, 0x1}, ++ {0x41bd7, 0x0}, ++ {0x41bd8, 0x9758}, ++ {0x41bd9, 0x0}, ++ {0x41bda, 0x0}, ++ {0x41bdb, 0x10}, ++ {0x41bdc, 0x8208}, ++ {0x41bdd, 0x0}, ++ {0x41bde, 0x0}, ++ {0x41bdf, 0x10}, ++ {0x41be0, 0x0}, ++ {0x41be1, 0x0}, ++ {0x41be2, 0x0}, ++ {0x41be3, 0x4b00}, ++ {0x41be4, 0x0}, ++ {0x41be5, 0x0}, ++ {0x41be6, 0x0}, ++ {0x41be7, 0x0}, ++ {0x41be8, 0x0}, ++ {0x41be9, 0x0}, ++ {0x41bea, 0x0}, ++ {0x41beb, 0x0}, ++ {0x41bec, 0x801c}, ++ {0x41bed, 0xd0}, ++ {0x41bee, 0x1}, ++ {0x41bef, 0x10}, ++ {0x41bf0, 0x8060}, ++ {0x41bf1, 0x84}, ++ {0x41bf2, 0x0}, ++ {0x41bf3, 0x10}, ++ {0x41bf4, 0x0}, ++ {0x41bf5, 0x0}, ++ {0x41bf6, 0x0}, ++ {0x41bf7, 0x0}, ++ {0x41bf8, 0x0}, ++ {0x41bf9, 0x0}, ++ {0x41bfa, 0x0}, ++ {0x41bfb, 0x7b00}, ++ {0x41bfc, 0x0}, ++ {0x41bfd, 0x0}, ++ {0x41bfe, 0x0}, ++ {0x41bff, 0x0}, ++ {0x41c00, 0x807c}, ++ {0x41c01, 0x0}, ++ {0x41c02, 0x0}, ++ {0x41c03, 0x10}, ++ {0x41c04, 0x0}, ++ {0x41c05, 0x0}, ++ {0x41c06, 0x0}, ++ {0x41c07, 0x0}, ++ {0x41c08, 0x0}, ++ {0x41c09, 0x0}, ++ {0x41c0a, 0x0}, ++ {0x41c0b, 0x0}, ++ {0x41c0c, 0x8000}, ++ {0x41c0d, 0x0}, ++ {0x41c0e, 0x1}, ++ {0x41c0f, 0x10}, ++ {0x41c10, 0x0}, ++ {0x41c11, 0x0}, ++ {0x41c12, 0x0}, ++ {0x41c13, 0x0}, ++ {0x41c14, 0x802c}, ++ {0x41c15, 0xd00}, ++ {0x41c16, 0x1}, ++ {0x41c17, 0x10}, ++ {0x41c18, 0x8020}, ++ {0x41c19, 0x803}, ++ {0x41c1a, 0x0}, ++ {0x41c1b, 0x10}, ++ {0x41c1c, 0x0}, ++ {0x41c1d, 0x0}, ++ {0x41c1e, 0x0}, ++ {0x41c1f, 0x0}, ++ {0x41c20, 0x0}, ++ {0x41c21, 0x0}, ++ {0x41c22, 0x0}, ++ {0x41c23, 0x2b00}, ++ {0x41c24, 0x0}, ++ {0x41c25, 0x0}, ++ {0x41c26, 0x0}, ++ {0x41c27, 0x800}, ++ {0x41c28, 0x0}, ++ {0x41c29, 0x0}, ++ {0x41c2a, 0x0}, ++ {0x41c2b, 0x0}, ++ {0x41c2c, 0x807c}, ++ {0x41c2d, 0x0}, ++ {0x41c2e, 0x0}, ++ {0x41c2f, 0x10}, ++ {0x41c30, 0x0}, ++ {0x41c31, 0x0}, ++ {0x41c32, 0x0}, ++ {0x41c33, 0x0}, ++ {0x41c34, 0x0}, ++ {0x41c35, 0x0}, ++ {0x41c36, 0x0}, ++ {0x41c37, 0x0}, ++ {0x41c38, 0x8000}, ++ {0x41c39, 0x0}, ++ {0x41c3a, 0x1}, ++ {0x41c3b, 0x10}, ++ {0x41c3c, 0x0}, ++ {0x41c3d, 0x0}, ++ {0x41c3e, 0x0}, ++ {0x41c3f, 0x0}, ++ {0x41c40, 0x9758}, ++ {0x41c41, 0x0}, ++ {0x41c42, 0x0}, ++ {0x41c43, 0x10}, ++ {0x41c44, 0x8008}, ++ {0x41c45, 0x0}, ++ {0x41c46, 0x0}, ++ {0x41c47, 0x10}, ++ {0x41c48, 0x0}, ++ {0x41c49, 0x0}, ++ {0x41c4a, 0x0}, ++ {0x41c4b, 0x0}, ++ {0x41c4c, 0x0}, ++ {0x41c4d, 0x0}, ++ {0x41c4e, 0x0}, ++ {0x41c4f, 0x0}, ++ {0x41c50, 0xc068}, ++ {0x41c51, 0x0}, ++ {0x41c52, 0x0}, ++ {0x41c53, 0x10}, ++ {0x41c54, 0x0}, ++ {0x41c55, 0x0}, ++ {0x41c56, 0x0}, ++ {0x41c57, 0x0}, ++ {0x9002e, 0x10}, ++ {0x9002f, 0x400}, ++ {0x90030, 0x80e}, ++ {0x90031, 0xb}, ++ {0x90032, 0x480}, ++ {0x90033, 0x809}, ++ {0x90034, 0x9}, ++ {0x90035, 0x308}, ++ {0x90036, 0xc09}, ++ {0x90037, 0x28}, ++ {0x90038, 0x8160}, ++ {0x90039, 0x87c}, ++ {0x9003a, 0x98}, ++ {0x9003b, 0x820}, ++ {0x9003c, 0xc7e}, ++ {0x9003d, 0x2}, ++ {0x9003e, 0x1}, ++ {0x9003f, 0x78}, ++ {0x90040, 0xa}, ++ {0x90041, 0x370}, ++ {0x90042, 0x839}, ++ {0x90043, 0x18}, ++ {0x90044, 0x8160}, ++ {0x90045, 0x83c}, ++ {0x90046, 0x9}, ++ {0x90047, 0x150}, ++ {0x90048, 0x839}, ++ {0x90049, 0x70}, ++ {0x9004a, 0x392}, ++ {0x9004b, 0x39}, ++ {0x9004c, 0x78}, ++ {0x9004d, 0x39a}, ++ {0x9004e, 0x39}, ++ {0x9004f, 0xe09}, ++ {0x90050, 0x100}, ++ {0x90051, 0x839}, ++ {0x90052, 0x2}, ++ {0x90053, 0x1}, ++ {0x90054, 0x38}, ++ {0x90055, 0x0}, ++ {0x90056, 0x100}, ++ {0x90057, 0x839}, ++ {0x90058, 0x0}, ++ {0x90059, 0x398}, ++ {0x9005a, 0x839}, ++ {0x9005b, 0xe19}, ++ {0x9005c, 0x100}, ++ {0x9005d, 0x839}, ++ {0x9005e, 0x2}, ++ {0x9005f, 0x1}, ++ {0x90060, 0x38}, ++ {0x90061, 0x0}, ++ {0x90062, 0x100}, ++ {0x90063, 0x839}, ++ {0x90064, 0x0}, ++ {0x90065, 0x390}, ++ {0x90066, 0x839}, ++ {0x90067, 0x78}, ++ {0x90068, 0x39a}, ++ {0x90069, 0x39}, ++ {0x9006a, 0xe29}, ++ {0x9006b, 0x100}, ++ {0x9006c, 0x839}, ++ {0x9006d, 0x2}, ++ {0x9006e, 0x1}, ++ {0x9006f, 0x38}, ++ {0x90070, 0x0}, ++ {0x90071, 0x100}, ++ {0x90072, 0x839}, ++ {0x90073, 0x70}, ++ {0x90074, 0x392}, ++ {0x90075, 0x39}, ++ {0x90076, 0x18}, ++ {0x90077, 0x8160}, ++ {0x90078, 0x8bc}, ++ {0x90079, 0x8}, ++ {0x9007a, 0x13a}, ++ {0x9007b, 0xb9}, ++ {0x9007c, 0x24b}, ++ {0x9007d, 0x100}, ++ {0x9007e, 0x8b9}, ++ {0x9007f, 0x2}, ++ {0x90080, 0x1}, ++ {0x90081, 0xb8}, ++ {0x90082, 0x0}, ++ {0x90083, 0x100}, ++ {0x90084, 0x8b9}, ++ {0x90085, 0x20}, ++ {0x90086, 0x4}, ++ {0x90087, 0xb8}, ++ {0x90088, 0x20}, ++ {0x90089, 0x4}, ++ {0x9008a, 0xb8}, ++ {0x9008b, 0x5}, ++ {0x9008c, 0x0}, ++ {0x9008d, 0xb8}, ++ {0x9008e, 0x479}, ++ {0x9008f, 0xc7f8}, ++ {0x90090, 0x8bc}, ++ {0x90091, 0x0}, ++ {0x90092, 0x0}, ++ {0x90093, 0xb8}, ++ {0x90094, 0x0}, ++ {0x90095, 0xa8}, ++ {0x90096, 0x8b9}, ++ {0x90097, 0x9}, ++ {0x90098, 0xc9c0}, ++ {0x90099, 0xcbc}, ++ {0x9009a, 0x0}, ++ {0x9009b, 0x0}, ++ {0x9009c, 0xb8}, ++ {0x9009d, 0x25b}, ++ {0x9009e, 0x100}, ++ {0x9009f, 0xcb9}, ++ {0x900a0, 0x20}, ++ {0x900a1, 0x4}, ++ {0x900a2, 0xb8}, ++ {0x900a3, 0x20}, ++ {0x900a4, 0x4}, ++ {0x900a5, 0xb8}, ++ {0x900a6, 0x20}, ++ {0x900a7, 0x4}, ++ {0x900a8, 0xb8}, ++ {0x900a9, 0x20}, ++ {0x900aa, 0x4}, ++ {0x900ab, 0xb8}, ++ {0x900ac, 0x10}, ++ {0x900ad, 0x400}, ++ {0x900ae, 0x89e}, ++ {0x900af, 0x8}, ++ {0x900b0, 0x370}, ++ {0x900b1, 0x839}, ++ {0x900b2, 0x33b}, ++ {0x900b3, 0x100}, ++ {0x900b4, 0x8b9}, ++ {0x900b5, 0x0}, ++ {0x900b6, 0x100}, ++ {0x900b7, 0x8b9}, ++ {0x900b8, 0x23b}, ++ {0x900b9, 0x100}, ++ {0x900ba, 0xc99}, ++ {0x900bb, 0x2}, ++ {0x900bc, 0x150}, ++ {0x900bd, 0x839}, ++ {0x900be, 0x1800}, ++ {0x900bf, 0x8660}, ++ {0x900c0, 0x839}, ++ {0x900c1, 0x0}, ++ {0x900c2, 0x2a0}, ++ {0x900c3, 0x809}, ++ {0x900c4, 0x8}, ++ {0x900c5, 0x1880}, ++ {0x900c6, 0x839}, ++ {0x900c7, 0x8}, ++ {0x900c8, 0x82b0}, ++ {0x900c9, 0x838}, ++ {0x900ca, 0x18}, ++ {0x900cb, 0xe0}, ++ {0x900cc, 0x809}, ++ {0x900cd, 0x0}, ++ {0x900ce, 0xe0}, ++ {0x900cf, 0x869}, ++ {0x900d0, 0xf}, ++ {0x900d1, 0x7c0}, ++ {0x900d2, 0x839}, ++ {0x900d3, 0xa}, ++ {0x900d4, 0x510}, ++ {0x900d5, 0x839}, ++ {0x900d6, 0xa}, ++ {0x900d7, 0x700}, ++ {0x900d8, 0x849}, ++ {0x900d9, 0xa}, ++ {0x900da, 0x700}, ++ {0x900db, 0x859}, ++ {0x900dc, 0xa}, ++ {0x900dd, 0x708}, ++ {0x900de, 0x859}, ++ {0x900df, 0x2}, ++ {0x900e0, 0x708}, ++ {0x900e1, 0x849}, ++ {0x900e2, 0xff8}, ++ {0x900e3, 0x8410}, ++ {0x900e4, 0x839}, ++ {0x900e5, 0x7ff8}, ++ {0x900e6, 0x8498}, ++ {0x900e7, 0x838}, ++ {0x900e8, 0x10}, ++ {0x900e9, 0x8160}, ++ {0x900ea, 0x83c}, ++ {0x900eb, 0x0}, ++ {0x900ec, 0x7c8}, ++ {0x900ed, 0x809}, ++ {0x900ee, 0x0}, ++ {0x900ef, 0x1}, ++ {0x900f0, 0x8}, ++ {0x900f1, 0x0}, ++ {0x900f2, 0x45a}, ++ {0x900f3, 0x89}, ++ {0x900f4, 0x0}, ++ {0x900f5, 0x8018}, ++ {0x900f6, 0x808}, ++ {0x900f7, 0x0}, ++ {0x900f8, 0x8020}, ++ {0x900f9, 0x808}, ++ {0x900fa, 0x479}, ++ {0x900fb, 0xc7f8}, ++ {0x900fc, 0x80c}, ++ {0x900fd, 0x0}, ++ {0x900fe, 0x0}, ++ {0x900ff, 0x8}, ++ {0x90100, 0x0}, ++ {0x90101, 0x8018}, ++ {0x90102, 0x808}, ++ {0x90103, 0x0}, ++ {0x90104, 0x8020}, ++ {0x90105, 0x808}, ++ {0x90106, 0x9}, ++ {0x90107, 0xc9c0}, ++ {0x90108, 0xc0c}, ++ {0x90109, 0x0}, ++ {0x9010a, 0xa8}, ++ {0x9010b, 0x8c9}, ++ {0x9010c, 0x29}, ++ {0x9010d, 0x8160}, ++ {0x9010e, 0x87c}, ++ {0x9010f, 0xb8}, ++ {0x90110, 0x820}, ++ {0x90111, 0xc7e}, ++ {0x90112, 0x1}, ++ {0x90113, 0x0}, ++ {0x90114, 0x78}, ++ {0x90115, 0x0}, ++ {0x90116, 0x1}, ++ {0x90117, 0x78}, ++ {0x90118, 0xd8}, ++ {0x90119, 0x820}, ++ {0x9011a, 0xc7e}, ++ {0x9011b, 0x1}, ++ {0x9011c, 0x0}, ++ {0x9011d, 0x78}, ++ {0x9011e, 0x0}, ++ {0x9011f, 0x1}, ++ {0x90120, 0x78}, ++ {0x90121, 0xf8}, ++ {0x90122, 0x820}, ++ {0x90123, 0xc7e}, ++ {0x90124, 0x1}, ++ {0x90125, 0x0}, ++ {0x90126, 0x78}, ++ {0x90127, 0x0}, ++ {0x90128, 0x1}, ++ {0x90129, 0x78}, ++ {0x9012a, 0x0}, ++ {0x9012b, 0x700}, ++ {0x9012c, 0x849}, ++ {0x9012d, 0x0}, ++ {0x9012e, 0x618}, ++ {0x9012f, 0x809}, ++ {0x90130, 0x3ff8}, ++ {0x90131, 0x84b8}, ++ {0x90132, 0x808}, ++ {0x90133, 0x0}, ++ {0x90134, 0x0}, ++ {0x90135, 0x8}, ++ {0x90136, 0x8}, ++ {0x90137, 0xc870}, ++ {0x90138, 0xc0c}, ++ {0x90139, 0x18}, ++ {0x9013a, 0x710}, ++ {0x9013b, 0x849}, ++ {0x9013c, 0x0}, ++ {0x9013d, 0x4}, ++ {0x9013e, 0x48}, ++ {0x9013f, 0x0}, ++ {0x90140, 0x4}, ++ {0x90141, 0x48}, ++ {0x90142, 0x10}, ++ {0x90143, 0x710}, ++ {0x90144, 0x849}, ++ {0x90145, 0x0}, ++ {0x90146, 0x4}, ++ {0x90147, 0x48}, ++ {0x90148, 0x0}, ++ {0x90149, 0x710}, ++ {0x9014a, 0x849}, ++ {0x9014b, 0x0}, ++ {0x9014c, 0x4}, ++ {0x9014d, 0x48}, ++ {0x9014e, 0x0}, ++ {0x9014f, 0x4}, ++ {0x90150, 0x18}, ++ {0x90151, 0x0}, ++ {0x90152, 0x4}, ++ {0x90153, 0x18}, ++ {0x90154, 0x0}, ++ {0x90155, 0x4}, ++ {0x90156, 0x18}, ++ {0x90157, 0x0}, ++ {0x90158, 0x8410}, ++ {0x90159, 0x809}, ++ {0x9015a, 0x0}, ++ {0x9015b, 0x8498}, ++ {0x9015c, 0x808}, ++ {0x9015d, 0x5}, ++ {0x9015e, 0x510}, ++ {0x9015f, 0x809}, ++ {0x90160, 0x198}, ++ {0x90161, 0x1000}, ++ {0x90162, 0x809}, ++ {0x90163, 0x9}, ++ {0x90164, 0x3c0}, ++ {0x90165, 0x809}, ++ {0x90166, 0x10}, ++ {0x90167, 0x510}, ++ {0x90168, 0x809}, ++ {0x90169, 0x0}, ++ {0x9016a, 0x3c0}, ++ {0x9016b, 0x809}, ++ {0x9016c, 0x18}, ++ {0x9016d, 0x4}, ++ {0x9016e, 0x8}, ++ {0x9016f, 0x2}, ++ {0x90170, 0x510}, ++ {0x90171, 0x809}, ++ {0x90172, 0x2}, ++ {0x90173, 0x1000}, ++ {0x90174, 0x809}, ++ {0x90175, 0x68}, ++ {0x90176, 0x801a}, ++ {0x90177, 0x8}, ++ {0x90178, 0x68}, ++ {0x90179, 0x8022}, ++ {0x9017a, 0x8}, ++ {0x9017b, 0x479}, ++ {0x9017c, 0xc7f8}, ++ {0x9017d, 0x80c}, ++ {0x9017e, 0x0}, ++ {0x9017f, 0x0}, ++ {0x90180, 0x8}, ++ {0x90181, 0x68}, ++ {0x90182, 0x801a}, ++ {0x90183, 0x8}, ++ {0x90184, 0x68}, ++ {0x90185, 0x8022}, ++ {0x90186, 0x8}, ++ {0x90187, 0x9}, ++ {0x90188, 0xc9c0}, ++ {0x90189, 0xc0c}, ++ {0x9018a, 0x0}, ++ {0x9018b, 0xc870}, ++ {0x9018c, 0xc0c}, ++ {0x9018d, 0x0}, ++ {0x9018e, 0x2a0}, ++ {0x9018f, 0x809}, ++ {0x90190, 0x10}, ++ {0x90191, 0x8160}, ++ {0x90192, 0x89c}, ++ {0x90193, 0x2}, ++ {0x90194, 0x7c8}, ++ {0x90195, 0x809}, ++ {0x90196, 0x0}, ++ {0x90197, 0x1}, ++ {0x90198, 0x8}, ++ {0x90199, 0x40}, ++ {0x9019a, 0x1932}, ++ {0x9019b, 0x129}, ++ {0x9019c, 0xa}, ++ {0x9019d, 0xc140}, ++ {0x9019e, 0x80c}, ++ {0x9019f, 0x98}, ++ {0x901a0, 0x193a}, ++ {0x901a1, 0x129}, ++ {0x901a2, 0x90}, ++ {0x901a3, 0x1932}, ++ {0x901a4, 0x329}, ++ {0x901a5, 0x90}, ++ {0x901a6, 0x193a}, ++ {0x901a7, 0x329}, ++ {0x901a8, 0x88}, ++ {0x901a9, 0x1882}, ++ {0x901aa, 0x9}, ++ {0x901ab, 0x0}, ++ {0x901ac, 0xc140}, ++ {0x901ad, 0x80c}, ++ {0x901ae, 0x10}, ++ {0x901af, 0x400}, ++ {0x901b0, 0x80e}, ++ {0x901b1, 0xb}, ++ {0x901b2, 0x370}, ++ {0x901b3, 0x809}, ++ {0x901b4, 0x23b}, ++ {0x901b5, 0x100}, ++ {0x901b6, 0xcf9}, ++ {0x901b7, 0x0}, ++ {0x901b8, 0x2a0}, ++ {0x901b9, 0x809}, ++ {0x901ba, 0x7800}, ++ {0x901bb, 0x8660}, ++ {0x901bc, 0x809}, ++ {0x901bd, 0xd}, ++ {0x901be, 0x7c0}, ++ {0x901bf, 0x809}, ++ {0x901c0, 0x0}, ++ {0x901c1, 0x82b0}, ++ {0x901c2, 0x818}, ++ {0x901c3, 0x0}, ++ {0x901c4, 0x82b0}, ++ {0x901c5, 0x868}, ++ {0x901c6, 0x2}, ++ {0x901c7, 0x7c8}, ++ {0x901c8, 0xa09}, ++ {0x901c9, 0x8}, ++ {0x901ca, 0x508}, ++ {0x901cb, 0x939}, ++ {0x901cc, 0x5}, ++ {0x901cd, 0x7c0}, ++ {0x901ce, 0x809}, ++ {0x901cf, 0x8}, ++ {0x901d0, 0x82b0}, ++ {0x901d1, 0x868}, ++ {0x901d2, 0x8}, ++ {0x901d3, 0x82b0}, ++ {0x901d4, 0x818}, ++ {0x901d5, 0x8}, ++ {0x901d6, 0x82b0}, ++ {0x901d7, 0x888}, ++ {0x901d8, 0x10}, ++ {0x901d9, 0x510}, ++ {0x901da, 0x809}, ++ {0x901db, 0x0}, ++ {0x901dc, 0xa8}, ++ {0x901dd, 0x8c9}, ++ {0x901de, 0x9}, ++ {0x901df, 0x1900}, ++ {0x901e0, 0xd39}, ++ {0x901e1, 0x0}, ++ {0x901e2, 0x508}, ++ {0x901e3, 0x939}, ++ {0x901e4, 0x2}, ++ {0x901e5, 0x7c8}, ++ {0x901e6, 0x829}, ++ {0x901e7, 0xa}, ++ {0x901e8, 0x3c8}, ++ {0x901e9, 0xc29}, ++ {0x901ea, 0x199}, ++ {0x901eb, 0x3d0}, ++ {0x901ec, 0xc19}, ++ {0x901ed, 0x3}, ++ {0x901ee, 0x0}, ++ {0x901ef, 0x18}, ++ {0x901f0, 0x38}, ++ {0x901f1, 0x4}, ++ {0x901f2, 0x18}, ++ {0x901f3, 0x199}, ++ {0x901f4, 0x3d0}, ++ {0x901f5, 0xc09}, ++ {0x901f6, 0x0}, ++ {0x901f7, 0x0}, ++ {0x901f8, 0x8}, ++ {0x901f9, 0x9}, ++ {0x901fa, 0x150}, ++ {0x901fb, 0x809}, ++ {0x901fc, 0x9}, ++ {0x901fd, 0xc800}, ++ {0x901fe, 0xc0c}, ++ {0x901ff, 0x18}, ++ {0x90200, 0x8160}, ++ {0x90201, 0x8cc}, ++ {0x90202, 0x8}, ++ {0x90203, 0x13a}, ++ {0x90204, 0xc9}, ++ {0x90205, 0x24b}, ++ {0x90206, 0x100}, ++ {0x90207, 0x8c9}, ++ {0x90208, 0x2}, ++ {0x90209, 0x1}, ++ {0x9020a, 0xc8}, ++ {0x9020b, 0x0}, ++ {0x9020c, 0x100}, ++ {0x9020d, 0x8c9}, ++ {0x9020e, 0x20}, ++ {0x9020f, 0x4}, ++ {0x90210, 0xc8}, ++ {0x90211, 0x20}, ++ {0x90212, 0x4}, ++ {0x90213, 0xc8}, ++ {0x90214, 0x5}, ++ {0x90215, 0x0}, ++ {0x90216, 0xc8}, ++ {0x90217, 0x479}, ++ {0x90218, 0xc7f8}, ++ {0x90219, 0x8cc}, ++ {0x9021a, 0x0}, ++ {0x9021b, 0x0}, ++ {0x9021c, 0xc8}, ++ {0x9021d, 0x30}, ++ {0x9021e, 0xaa}, ++ {0x9021f, 0xc9}, ++ {0x90220, 0x9}, ++ {0x90221, 0xc9c0}, ++ {0x90222, 0xccc}, ++ {0x90223, 0x0}, ++ {0x90224, 0x0}, ++ {0x90225, 0xc8}, ++ {0x90226, 0x479}, ++ {0x90227, 0xc7f8}, ++ {0x90228, 0x8bc}, ++ {0x90229, 0x0}, ++ {0x9022a, 0x0}, ++ {0x9022b, 0xb8}, ++ {0x9022c, 0x30}, ++ {0x9022d, 0xaa}, ++ {0x9022e, 0xb9}, ++ {0x9022f, 0x9}, ++ {0x90230, 0xc9c0}, ++ {0x90231, 0xcbc}, ++ {0x90232, 0x0}, ++ {0x90233, 0x0}, ++ {0x90234, 0xb8}, ++ {0x90235, 0x25b}, ++ {0x90236, 0x100}, ++ {0x90237, 0xcc9}, ++ {0x90238, 0x20}, ++ {0x90239, 0x4}, ++ {0x9023a, 0xc8}, ++ {0x9023b, 0x20}, ++ {0x9023c, 0x4}, ++ {0x9023d, 0xc8}, ++ {0x9023e, 0x20}, ++ {0x9023f, 0x4}, ++ {0x90240, 0xa8}, ++ {0x90241, 0x4}, ++ {0x90242, 0x0}, ++ {0x90243, 0xc8}, ++ {0x90244, 0x9}, ++ {0x90245, 0xc800}, ++ {0x90246, 0xc6c}, ++ {0x90247, 0x26f}, ++ {0x90248, 0x100}, ++ {0x90249, 0xc19}, ++ {0x9024a, 0x8}, ++ {0x9024b, 0x4}, ++ {0x9024c, 0x18}, ++ {0x9024d, 0x27f}, ++ {0x9024e, 0x100}, ++ {0x9024f, 0xc19}, ++ {0x90250, 0x479}, ++ {0x90251, 0xc7f8}, ++ {0x90252, 0x80c}, ++ {0x90253, 0x0}, ++ {0x90254, 0x0}, ++ {0x90255, 0x8}, ++ {0x90256, 0x58}, ++ {0x90257, 0x8a}, ++ {0x90258, 0x9}, ++ {0x90259, 0x9}, ++ {0x9025a, 0xc9c0}, ++ {0x9025b, 0xc0c}, ++ {0x9025c, 0x0}, ++ {0x9025d, 0x0}, ++ {0x9025e, 0x8}, ++ {0x9025f, 0x18}, ++ {0x90260, 0x8160}, ++ {0x90261, 0x86c}, ++ {0x90262, 0x1008}, ++ {0x90263, 0x853b}, ++ {0x90264, 0x868}, ++ {0x90265, 0xc00}, ++ {0x90266, 0x8588}, ++ {0x90267, 0x868}, ++ {0x90268, 0x8}, ++ {0x90269, 0x85a8}, ++ {0x9026a, 0x868}, ++ {0x9026b, 0x8}, ++ {0x9026c, 0x85c8}, ++ {0x9026d, 0x868}, ++ {0x9026e, 0x0}, ++ {0x9026f, 0x8050}, ++ {0x90270, 0x868}, ++ {0x90271, 0x60}, ++ {0x90272, 0x138}, ++ {0x90273, 0x869}, ++ {0x90274, 0x18}, ++ {0x90275, 0x8510}, ++ {0x90276, 0x868}, ++ {0x90277, 0x18}, ++ {0x90278, 0x2c8}, ++ {0x90279, 0x869}, ++ {0x9027a, 0x10}, ++ {0x9027b, 0x8520}, ++ {0x9027c, 0x868}, ++ {0x9027d, 0x1ff8}, ++ {0x9027e, 0x85d8}, ++ {0x9027f, 0xc68}, ++ {0x90280, 0x0}, ++ {0x90281, 0xfdf0}, ++ {0x90282, 0x868}, ++ {0x90283, 0x8}, ++ {0x90284, 0x85f0}, ++ {0x90285, 0x868}, ++ {0x90286, 0x8}, ++ {0x90287, 0xa5f0}, ++ {0x90288, 0x868}, ++ {0x90289, 0x298}, ++ {0x9028a, 0x100}, ++ {0x9028b, 0x869}, ++ {0x9028c, 0x2}, ++ {0x9028d, 0x1}, ++ {0x9028e, 0x68}, ++ {0x9028f, 0x0}, ++ {0x90290, 0x100}, ++ {0x90291, 0x869}, ++ {0x90292, 0x0}, ++ {0x90293, 0x85f0}, ++ {0x90294, 0x868}, ++ {0x90295, 0x0}, ++ {0x90296, 0xa5f0}, ++ {0x90297, 0x868}, ++ {0x90298, 0x33b}, ++ {0x90299, 0x100}, ++ {0x9029a, 0x8c9}, ++ {0x9029b, 0x0}, ++ {0x9029c, 0x100}, ++ {0x9029d, 0x8c9}, ++ {0x9029e, 0x1ff8}, ++ {0x9029f, 0x85d8}, ++ {0x902a0, 0xc68}, ++ {0x902a1, 0x8}, ++ {0x902a2, 0x8df0}, ++ {0x902a3, 0x868}, ++ {0x902a4, 0x8}, ++ {0x902a5, 0xadf0}, ++ {0x902a6, 0x868}, ++ {0x902a7, 0x2a8}, ++ {0x902a8, 0x100}, ++ {0x902a9, 0x869}, ++ {0x902aa, 0x2}, ++ {0x902ab, 0x1}, ++ {0x902ac, 0x68}, ++ {0x902ad, 0x0}, ++ {0x902ae, 0x100}, ++ {0x902af, 0x869}, ++ {0x902b0, 0x0}, ++ {0x902b1, 0x8df0}, ++ {0x902b2, 0x868}, ++ {0x902b3, 0x0}, ++ {0x902b4, 0xadf0}, ++ {0x902b5, 0x868}, ++ {0x902b6, 0x10}, ++ {0x902b7, 0x2c8}, ++ {0x902b8, 0x869}, ++ {0x902b9, 0x28}, ++ {0x902ba, 0x4}, ++ {0x902bb, 0x68}, ++ {0x902bc, 0xa}, ++ {0x902bd, 0x500}, ++ {0x902be, 0xc69}, ++ {0x902bf, 0x0}, ++ {0x902c0, 0x8520}, ++ {0x902c1, 0x868}, ++ {0x902c2, 0x8}, ++ {0x902c3, 0x8530}, ++ {0x902c4, 0x868}, ++ {0x902c5, 0x2ba}, ++ {0x902c6, 0x100}, ++ {0x902c7, 0x869}, ++ {0x902c8, 0x2}, ++ {0x902c9, 0x1}, ++ {0x902ca, 0x68}, ++ {0x902cb, 0x2}, ++ {0x902cc, 0x100}, ++ {0x902cd, 0x869}, ++ {0x902ce, 0x0}, ++ {0x902cf, 0x8530}, ++ {0x902d0, 0x868}, ++ {0x902d1, 0x0}, ++ {0x902d2, 0x8510}, ++ {0x902d3, 0x868}, ++ {0x902d4, 0x0}, ++ {0x902d5, 0x2c8}, ++ {0x902d6, 0x869}, ++ {0x902d7, 0x8}, ++ {0x902d8, 0x8050}, ++ {0x902d9, 0x868}, ++ {0x902da, 0x30}, ++ {0x902db, 0x4}, ++ {0x902dc, 0x68}, ++ {0x902dd, 0x8}, ++ {0x902de, 0x8520}, ++ {0x902df, 0x868}, ++ {0x902e0, 0x0}, ++ {0x902e1, 0x8328}, ++ {0x902e2, 0x86b}, ++ {0x902e3, 0x2ca}, ++ {0x902e4, 0x100}, ++ {0x902e5, 0x869}, ++ {0x902e6, 0x2}, ++ {0x902e7, 0x1}, ++ {0x902e8, 0x68}, ++ {0x902e9, 0x4}, ++ {0x902ea, 0x100}, ++ {0x902eb, 0x869}, ++ {0x902ec, 0xff8}, ++ {0x902ed, 0x8328}, ++ {0x902ee, 0x86b}, ++ {0x902ef, 0x9}, ++ {0x902f0, 0x500}, ++ {0x902f1, 0xc29}, ++ {0x902f2, 0x0}, ++ {0x902f3, 0x8520}, ++ {0x902f4, 0x868}, ++ {0x902f5, 0x8}, ++ {0x902f6, 0x3c8}, ++ {0x902f7, 0xc29}, ++ {0x902f8, 0x0}, ++ {0x902f9, 0x150}, ++ {0x902fa, 0x809}, ++ {0x902fb, 0x2}, ++ {0x902fc, 0x370}, ++ {0x902fd, 0x809}, ++ {0x902fe, 0x0}, ++ {0x902ff, 0x400}, ++ {0x90300, 0x80e}, ++ {0x90301, 0x20}, ++ {0x90302, 0x82b0}, ++ {0x90303, 0x808}, ++ {0x90304, 0x479}, ++ {0x90305, 0xc7f8}, ++ {0x90306, 0x80c}, ++ {0x90307, 0x0}, ++ {0x90308, 0x0}, ++ {0x90309, 0x8}, ++ {0x9030a, 0x60}, ++ {0x9030b, 0x8a}, ++ {0x9030c, 0x9}, ++ {0x9030d, 0x9}, ++ {0x9030e, 0xc9c0}, ++ {0x9030f, 0xc0c}, ++ {0x90310, 0x0}, ++ {0x90311, 0x0}, ++ {0x90312, 0x8}, ++ {0x90313, 0x8}, ++ {0x90314, 0x2a0}, ++ {0x90315, 0x809}, ++ {0x90316, 0x48}, ++ {0x90317, 0xc822}, ++ {0x90318, 0xc}, ++ {0x90319, 0x48}, ++ {0x9031a, 0xcc32}, ++ {0x9031b, 0xc}, ++ {0x9031c, 0x9}, ++ {0x9031d, 0xc800}, ++ {0x9031e, 0xc0c}, ++ {0x9031f, 0x0}, ++ {0x90320, 0x8168}, ++ {0x90321, 0x80c}, ++ {0x90322, 0xa}, ++ {0x90323, 0xc140}, ++ {0x90324, 0x92c}, ++ {0x90325, 0x88}, ++ {0x90326, 0x1932}, ++ {0x90327, 0x129}, ++ {0x90328, 0x88}, ++ {0x90329, 0x193a}, ++ {0x9032a, 0x129}, ++ {0x9032b, 0x0}, ++ {0x9032c, 0xc140}, ++ {0x9032d, 0x92c}, ++ {0x9032e, 0x8}, ++ {0x9032f, 0x300}, ++ {0x90330, 0x819}, ++ {0x90331, 0x10}, ++ {0x90332, 0x8160}, ++ {0x90333, 0x80c}, ++ {0x90334, 0x8}, ++ {0x90335, 0x7c8}, ++ {0x90336, 0x931}, ++ {0x90337, 0x8}, ++ {0x90338, 0x0}, ++ {0x90339, 0x8}, ++ {0x9033a, 0x8}, ++ {0x9033b, 0x1880}, ++ {0x9033c, 0x809}, ++ {0x9033d, 0x10}, ++ {0x9033e, 0x8160}, ++ {0x9033f, 0x80c}, ++ {0x90340, 0x1800}, ++ {0x90341, 0x8660}, ++ {0x90342, 0x809}, ++ {0x90343, 0x4000}, ++ {0x90344, 0x8668}, ++ {0x90345, 0x809}, ++ {0x90346, 0xf}, ++ {0x90347, 0x7c0}, ++ {0x90348, 0x809}, ++ {0x90349, 0x0}, ++ {0x9034a, 0x2a0}, ++ {0x9034b, 0x809}, ++ {0x9034c, 0x8}, ++ {0x9034d, 0x618}, ++ {0x9034e, 0x809}, ++ {0x9034f, 0x0}, ++ {0x90350, 0x84b8}, ++ {0x90351, 0x808}, ++ {0x90352, 0xff8}, ++ {0x90353, 0x8410}, ++ {0x90354, 0x809}, ++ {0x90355, 0x7ff8}, ++ {0x90356, 0x8498}, ++ {0x90357, 0x808}, ++ {0x90358, 0x0}, ++ {0x90359, 0x7c8}, ++ {0x9035a, 0x809}, ++ {0x9035b, 0x8}, ++ {0x9035c, 0x8168}, ++ {0x9035d, 0x80c}, ++ {0x9035e, 0x0}, ++ {0x9035f, 0x1}, ++ {0x90360, 0x8}, ++ {0x90361, 0x0}, ++ {0x90362, 0x4}, ++ {0x90363, 0x8}, ++ {0x90364, 0x0}, ++ {0x90365, 0x4}, ++ {0x90366, 0x8}, ++ {0x90367, 0x18}, ++ {0x90368, 0x300}, ++ {0x90369, 0x809}, ++ {0x9036a, 0x0}, ++ {0x9036b, 0x480}, ++ {0x9036c, 0x809}, ++ {0x9036d, 0x8}, ++ {0x9036e, 0x510}, ++ {0x9036f, 0x809}, ++ {0x90370, 0x7800}, ++ {0x90371, 0x8660}, ++ {0x90372, 0x809}, ++ {0x90373, 0x8}, ++ {0x90374, 0x7c8}, ++ {0x90375, 0x801}, ++ {0x90376, 0x10}, ++ {0x90377, 0x400}, ++ {0x90378, 0x80e}, ++ {0x90379, 0x8}, ++ {0x9037a, 0x150}, ++ {0x9037b, 0x809}, ++ {0x9037c, 0x9}, ++ {0x9037d, 0x370}, ++ {0x9037e, 0x809}, ++ {0x9037f, 0x18}, ++ {0x90380, 0x8160}, ++ {0x90381, 0x80c}, ++ {0x90382, 0x8}, ++ {0x90383, 0xc800}, ++ {0x90384, 0xc0c}, ++ {0x90385, 0x8}, ++ {0x90386, 0xc888}, ++ {0x90387, 0xc04}, ++ {0x90388, 0x20}, ++ {0x90389, 0x8302}, ++ {0x9038a, 0xb}, ++ {0x9038b, 0x18}, ++ {0x9038c, 0x8582}, ++ {0x9038d, 0x8}, ++ {0x9038e, 0x9000}, ++ {0x9038f, 0x8539}, ++ {0x90390, 0x808}, ++ {0x90391, 0x0}, ++ {0x90392, 0x8588}, ++ {0x90393, 0x808}, ++ {0x90394, 0x40}, ++ {0x90395, 0x85c8}, ++ {0x90396, 0x808}, ++ {0x90397, 0x0}, ++ {0x90398, 0xfdf0}, ++ {0x90399, 0x808}, ++ {0x9039a, 0x800}, ++ {0x9039b, 0xc5f0}, ++ {0x9039c, 0x808}, ++ {0x9039d, 0x1ff8}, ++ {0x9039e, 0xfdd8}, ++ {0x9039f, 0xc08}, ++ {0x903a0, 0x18}, ++ {0x903a1, 0xfda8}, ++ {0x903a2, 0x808}, ++ {0x903a3, 0x40}, ++ {0x903a4, 0x8520}, ++ {0x903a5, 0x8d8}, ++ {0x903a6, 0x80}, ++ {0x903a7, 0x8520}, ++ {0x903a8, 0x8e8}, ++ {0x903a9, 0x30a}, ++ {0x903aa, 0x100}, ++ {0x903ab, 0x8d9}, ++ {0x903ac, 0x32a}, ++ {0x903ad, 0x100}, ++ {0x903ae, 0x8e9}, ++ {0x903af, 0x0}, ++ {0x903b0, 0x1}, ++ {0x903b1, 0x8}, ++ {0x903b2, 0x0}, ++ {0x903b3, 0x100}, ++ {0x903b4, 0x809}, ++ {0x903b5, 0x1ff8}, ++ {0x903b6, 0xfdd8}, ++ {0x903b7, 0xc08}, ++ {0x903b8, 0x8}, ++ {0x903b9, 0xfda8}, ++ {0x903ba, 0x808}, ++ {0x903bb, 0x140}, ++ {0x903bc, 0x8520}, ++ {0x903bd, 0x8d8}, ++ {0x903be, 0x180}, ++ {0x903bf, 0x8520}, ++ {0x903c0, 0x8e8}, ++ {0x903c1, 0x30a}, ++ {0x903c2, 0x100}, ++ {0x903c3, 0x8d9}, ++ {0x903c4, 0x32a}, ++ {0x903c5, 0x100}, ++ {0x903c6, 0x8e9}, ++ {0x903c7, 0x0}, ++ {0x903c8, 0x1}, ++ {0x903c9, 0x8}, ++ {0x903ca, 0x0}, ++ {0x903cb, 0x100}, ++ {0x903cc, 0x809}, ++ {0x903cd, 0x9}, ++ {0x903ce, 0x500}, ++ {0x903cf, 0xc09}, ++ {0x903d0, 0x10}, ++ {0x903d1, 0x82b0}, ++ {0x903d2, 0x808}, ++ {0x903d3, 0x0}, ++ {0x903d4, 0x8520}, ++ {0x903d5, 0x808}, ++ {0x903d6, 0x8}, ++ {0x903d7, 0x3c8}, ++ {0x903d8, 0xc09}, ++ {0x903d9, 0x0}, ++ {0x903da, 0x150}, ++ {0x903db, 0x809}, ++ {0x903dc, 0x2}, ++ {0x903dd, 0x370}, ++ {0x903de, 0x809}, ++ {0x903df, 0x0}, ++ {0x903e0, 0x400}, ++ {0x903e1, 0x80e}, ++ {0x903e2, 0x8}, ++ {0x903e3, 0xc848}, ++ {0x903e4, 0xc0c}, ++ {0x903e5, 0x0}, ++ {0x903e6, 0xc890}, ++ {0x903e7, 0x804}, ++ {0x903e8, 0x20}, ++ {0x903e9, 0x8302}, ++ {0x903ea, 0xb}, ++ {0x903eb, 0x18}, ++ {0x903ec, 0x8582}, ++ {0x903ed, 0x8}, ++ {0x903ee, 0x0}, ++ {0x903ef, 0x82b0}, ++ {0x903f0, 0x808}, ++ {0x903f1, 0x1000}, ++ {0x903f2, 0x8539}, ++ {0x903f3, 0x808}, ++ {0x903f4, 0x0}, ++ {0x903f5, 0x8588}, ++ {0x903f6, 0x808}, ++ {0x903f7, 0x40}, ++ {0x903f8, 0x85c8}, ++ {0x903f9, 0x808}, ++ {0x903fa, 0x7f8}, ++ {0x903fb, 0xfdf0}, ++ {0x903fc, 0x808}, ++ {0x903fd, 0x800}, ++ {0x903fe, 0xc5f0}, ++ {0x903ff, 0x808}, ++ {0x90400, 0x80}, ++ {0x90401, 0x8088}, ++ {0x90402, 0x80b}, ++ {0x90403, 0x1ff8}, ++ {0x90404, 0xfdd8}, ++ {0x90405, 0xc08}, ++ {0x90406, 0x18}, ++ {0x90407, 0xfda8}, ++ {0x90408, 0x808}, ++ {0x90409, 0x200}, ++ {0x9040a, 0x8520}, ++ {0x9040b, 0x8d8}, ++ {0x9040c, 0x400}, ++ {0x9040d, 0x8520}, ++ {0x9040e, 0x8e8}, ++ {0x9040f, 0x2da}, ++ {0x90410, 0x100}, ++ {0x90411, 0x8d9}, ++ {0x90412, 0x2ea}, ++ {0x90413, 0x100}, ++ {0x90414, 0x8e9}, ++ {0x90415, 0x2}, ++ {0x90416, 0x1}, ++ {0x90417, 0x8}, ++ {0x90418, 0x0}, ++ {0x90419, 0x100}, ++ {0x9041a, 0x809}, ++ {0x9041b, 0x1ff8}, ++ {0x9041c, 0xfdd8}, ++ {0x9041d, 0xc08}, ++ {0x9041e, 0x8}, ++ {0x9041f, 0xfda8}, ++ {0x90420, 0x808}, ++ {0x90421, 0xa00}, ++ {0x90422, 0x8520}, ++ {0x90423, 0x8d8}, ++ {0x90424, 0xc00}, ++ {0x90425, 0x8520}, ++ {0x90426, 0x8e8}, ++ {0x90427, 0x2da}, ++ {0x90428, 0x100}, ++ {0x90429, 0x8d9}, ++ {0x9042a, 0x2ea}, ++ {0x9042b, 0x100}, ++ {0x9042c, 0x8e9}, ++ {0x9042d, 0x0}, ++ {0x9042e, 0x1}, ++ {0x9042f, 0x8}, ++ {0x90430, 0x0}, ++ {0x90431, 0x100}, ++ {0x90432, 0x809}, ++ {0x90433, 0x9}, ++ {0x90434, 0x500}, ++ {0x90435, 0xc09}, ++ {0x90436, 0x10}, ++ {0x90437, 0x82b0}, ++ {0x90438, 0x808}, ++ {0x90439, 0x0}, ++ {0x9043a, 0x8520}, ++ {0x9043b, 0x808}, ++ {0x9043c, 0x8}, ++ {0x9043d, 0x3c8}, ++ {0x9043e, 0xc09}, ++ {0x9043f, 0x0}, ++ {0x90440, 0x150}, ++ {0x90441, 0x809}, ++ {0x90442, 0x2}, ++ {0x90443, 0x370}, ++ {0x90444, 0x809}, ++ {0x90445, 0x0}, ++ {0x90446, 0x400}, ++ {0x90447, 0x80e}, ++ {0x90448, 0x8}, ++ {0x90449, 0xc848}, ++ {0x9044a, 0xc0c}, ++ {0x9044b, 0x0}, ++ {0x9044c, 0xc890}, ++ {0x9044d, 0x804}, ++ {0x9044e, 0x1008}, ++ {0x9044f, 0x853b}, ++ {0x90450, 0x808}, ++ {0x90451, 0xc00}, ++ {0x90452, 0x8588}, ++ {0x90453, 0x808}, ++ {0x90454, 0x8}, ++ {0x90455, 0x85a8}, ++ {0x90456, 0x808}, ++ {0x90457, 0x8}, ++ {0x90458, 0x85c8}, ++ {0x90459, 0x808}, ++ {0x9045a, 0x60}, ++ {0x9045b, 0x138}, ++ {0x9045c, 0x809}, ++ {0x9045d, 0x18}, ++ {0x9045e, 0xc8}, ++ {0x9045f, 0x809}, ++ {0x90460, 0x0}, ++ {0x90461, 0xa4}, ++ {0x90462, 0x809}, ++ {0x90463, 0x0}, ++ {0x90464, 0x8510}, ++ {0x90465, 0x808}, ++ {0x90466, 0x2fa}, ++ {0x90467, 0x100}, ++ {0x90468, 0x8d9}, ++ {0x90469, 0x31a}, ++ {0x9046a, 0x100}, ++ {0x9046b, 0x8e9}, ++ {0x9046c, 0x2}, ++ {0x9046d, 0x1}, ++ {0x9046e, 0x8}, ++ {0x9046f, 0x2}, ++ {0x90470, 0x100}, ++ {0x90471, 0x809}, ++ {0x90472, 0x202}, ++ {0x90473, 0x8510}, ++ {0x90474, 0xc08}, ++ {0x90475, 0x50}, ++ {0x90476, 0xa2}, ++ {0x90477, 0x9}, ++ {0x90478, 0x0}, ++ {0x90479, 0x0}, ++ {0x9047a, 0x8}, ++ {0x9047b, 0x0}, ++ {0x9047c, 0x0}, ++ {0x9047d, 0x8}, ++ {0x9047e, 0x0}, ++ {0x9047f, 0x0}, ++ {0x90480, 0x8}, ++ {0x90481, 0x0}, ++ {0x90482, 0xc8}, ++ {0x90483, 0x809}, ++ {0x90484, 0xb}, ++ {0x90485, 0x508}, ++ {0x90486, 0x809}, ++ {0x90487, 0x8}, ++ {0x90488, 0x1900}, ++ {0x90489, 0xc09}, ++ {0x9048a, 0x2}, ++ {0x9048b, 0x0}, ++ {0x9048c, 0x8}, ++ {0x9048d, 0x0}, ++ {0x9048e, 0x508}, ++ {0x9048f, 0x809}, ++ {0x90490, 0x9}, ++ {0x90491, 0x500}, ++ {0x90492, 0xc09}, ++ {0x90493, 0x10}, ++ {0x90494, 0x82b0}, ++ {0x90495, 0x808}, ++ {0x90496, 0x0}, ++ {0x90497, 0x8520}, ++ {0x90498, 0x808}, ++ {0x90499, 0x8}, ++ {0x9049a, 0x3c8}, ++ {0x9049b, 0xc09}, ++ {0x9049c, 0x0}, ++ {0x9049d, 0x150}, ++ {0x9049e, 0x809}, ++ {0x9049f, 0x2}, ++ {0x904a0, 0x370}, ++ {0x904a1, 0x809}, ++ {0x904a2, 0x0}, ++ {0x904a3, 0x400}, ++ {0x904a4, 0x80e}, ++ {0x904a5, 0x8}, ++ {0x904a6, 0xc848}, ++ {0x904a7, 0xc0c}, ++ {0x904a8, 0x0}, ++ {0x904a9, 0xc890}, ++ {0x904aa, 0x804}, ++ {0x904ab, 0x20}, ++ {0x904ac, 0x8302}, ++ {0x904ad, 0xb}, ++ {0x904ae, 0x18}, ++ {0x904af, 0x8582}, ++ {0x904b0, 0x8}, ++ {0x904b1, 0x1000}, ++ {0x904b2, 0x8539}, ++ {0x904b3, 0x808}, ++ {0x904b4, 0x0}, ++ {0x904b5, 0x8588}, ++ {0x904b6, 0x808}, ++ {0x904b7, 0x40}, ++ {0x904b8, 0x85c8}, ++ {0x904b9, 0x808}, ++ {0x904ba, 0x8}, ++ {0x904bb, 0xfdf0}, ++ {0x904bc, 0x808}, ++ {0x904bd, 0x80}, ++ {0x904be, 0x8088}, ++ {0x904bf, 0x80b}, ++ {0x904c0, 0x0}, ++ {0x904c1, 0x3b8}, ++ {0x904c2, 0x869}, ++ {0x904c3, 0x1ff8}, ++ {0x904c4, 0xfdd8}, ++ {0x904c5, 0xc08}, ++ {0x904c6, 0x18}, ++ {0x904c7, 0xfda8}, ++ {0x904c8, 0x808}, ++ {0x904c9, 0x40}, ++ {0x904ca, 0x8520}, ++ {0x904cb, 0x8d8}, ++ {0x904cc, 0x80}, ++ {0x904cd, 0x8520}, ++ {0x904ce, 0x8e8}, ++ {0x904cf, 0x2da}, ++ {0x904d0, 0x100}, ++ {0x904d1, 0x8d9}, ++ {0x904d2, 0x2ea}, ++ {0x904d3, 0x100}, ++ {0x904d4, 0x8e9}, ++ {0x904d5, 0x2}, ++ {0x904d6, 0x1}, ++ {0x904d7, 0x8}, ++ {0x904d8, 0x0}, ++ {0x904d9, 0x100}, ++ {0x904da, 0x809}, ++ {0x904db, 0x1ff8}, ++ {0x904dc, 0xfdd8}, ++ {0x904dd, 0xc08}, ++ {0x904de, 0x8}, ++ {0x904df, 0xfda8}, ++ {0x904e0, 0x808}, ++ {0x904e1, 0x140}, ++ {0x904e2, 0x8520}, ++ {0x904e3, 0x8d8}, ++ {0x904e4, 0x180}, ++ {0x904e5, 0x8520}, ++ {0x904e6, 0x8e8}, ++ {0x904e7, 0x2da}, ++ {0x904e8, 0x100}, ++ {0x904e9, 0x8d9}, ++ {0x904ea, 0x2ea}, ++ {0x904eb, 0x100}, ++ {0x904ec, 0x8e9}, ++ {0x904ed, 0x0}, ++ {0x904ee, 0x1}, ++ {0x904ef, 0x8}, ++ {0x904f0, 0x0}, ++ {0x904f1, 0x100}, ++ {0x904f2, 0x809}, ++ {0x904f3, 0x9}, ++ {0x904f4, 0x500}, ++ {0x904f5, 0xc09}, ++ {0x904f6, 0x10}, ++ {0x904f7, 0x82b0}, ++ {0x904f8, 0x808}, ++ {0x904f9, 0x0}, ++ {0x904fa, 0x8520}, ++ {0x904fb, 0x808}, ++ {0x904fc, 0x8}, ++ {0x904fd, 0x3c8}, ++ {0x904fe, 0xc09}, ++ {0x904ff, 0x0}, ++ {0x90500, 0x150}, ++ {0x90501, 0x809}, ++ {0x90502, 0x2}, ++ {0x90503, 0x370}, ++ {0x90504, 0x809}, ++ {0x90505, 0x0}, ++ {0x90506, 0x400}, ++ {0x90507, 0x80e}, ++ {0x90508, 0x8}, ++ {0x90509, 0xc848}, ++ {0x9050a, 0xc0c}, ++ {0x9050b, 0x0}, ++ {0x9050c, 0xc890}, ++ {0x9050d, 0x804}, ++ {0xd00e7, 0x600}, ++ {0x9001c, 0x0}, ++ {0x90020, 0x75}, ++ {0x90024, 0x80}, ++ {0x90025, 0x2a}, ++ {0x90026, 0x2a}, ++ {0x9002b, 0x103}, ++ {0x90708, 0x118}, ++ {0x90700, 0x13e}, ++ {0x90701, 0x160}, ++ {0x90702, 0x17f}, ++ {0x90703, 0x11e}, ++ {0x90704, 0x0}, ++ {0x90705, 0x0}, ++ {0x90706, 0x0}, ++ {0x90707, 0x0}, ++ {0x2018a, 0x0}, ++ {0x20124, 0x1}, ++ {0x2018b, 0x16}, ++ {0x20125, 0x39}, ++ {0x2018c, 0x4e}, ++ {0x20126, 0x1}, ++ {0x2018d, 0x16}, ++ {0x20127, 0x39}, ++ {0x2018e, 0x4e}, ++ {0x20128, 0x17}, ++ {0x2018f, 0x27}, ++ {0x20129, 0x4f}, ++ {0x20190, 0x5f}, ++ {0x2012a, 0x17}, ++ {0x20191, 0x27}, ++ {0x2012b, 0x4f}, ++ {0x20192, 0x5f}, ++ {0x2012c, 0x28}, ++ {0x20193, 0x38}, ++ {0x2012d, 0x60}, ++ {0x20194, 0x70}, ++ {0x2012e, 0x28}, ++ {0x20195, 0x38}, ++ {0x2012f, 0x60}, ++ {0x20196, 0x70}, ++ {0x20130, 0x80}, ++ {0x20197, 0x80}, ++ {0x20131, 0x80}, ++ {0x20198, 0x80}, ++ {0x20132, 0x80}, ++ {0x20199, 0x80}, ++ {0x20133, 0x80}, ++ {0x2019a, 0x80}, ++ {0x20134, 0x71}, ++ {0x2019b, 0x74}, ++ {0x20135, 0x77}, ++ {0x2019c, 0x7a}, ++ {0x20136, 0x71}, ++ {0x2019d, 0x74}, ++ {0x20137, 0x77}, ++ {0x2019e, 0x7a}, ++ {0x20138, 0x75}, ++ {0x2019f, 0x76}, ++ {0x20139, 0x7b}, ++ {0x201a0, 0x7c}, ++ {0x2013a, 0x75}, ++ {0x201a1, 0x76}, ++ {0x2013b, 0x7b}, ++ {0x201a2, 0x7c}, ++ {0x2013c, 0x7d}, ++ {0x201a3, 0x7e}, ++ {0x2013d, 0x7d}, ++ {0x201a4, 0x7e}, ++ {0x2013e, 0x7d}, ++ {0x201a5, 0x7e}, ++ {0x2013f, 0x7d}, ++ {0x201a6, 0x7e}, ++ {0x20140, 0x7f}, ++ {0x201a7, 0x7f}, ++ {0x20141, 0x7f}, ++ {0x201a8, 0x7f}, ++ {0x20142, 0x7f}, ++ {0x201a9, 0x7f}, ++ {0x20143, 0x7f}, ++ {0x201aa, 0x7f}, ++ {0x20144, 0x80}, ++ {0x201ab, 0x7f}, ++ {0x20145, 0x80}, ++ {0x201ac, 0x7f}, ++ {0x20146, 0x80}, ++ {0x201ad, 0x7f}, ++ {0x20147, 0x80}, ++ {0x201ae, 0x7f}, ++ {0x20148, 0x81}, ++ {0x201af, 0x93}, ++ {0x20149, 0x81}, ++ {0x201b0, 0x93}, ++ {0x2014a, 0x10a}, ++ {0x201b1, 0x11b}, ++ {0x2014b, 0x10a}, ++ {0x201b2, 0x11b}, ++ {0x2014c, 0x94}, ++ {0x201b3, 0x9b}, ++ {0x2014d, 0x94}, ++ {0x201b4, 0x9b}, ++ {0x2014e, 0x11c}, ++ {0x201b5, 0x122}, ++ {0x2014f, 0x11c}, ++ {0x201b6, 0x122}, ++ {0x20150, 0x9c}, ++ {0x201b7, 0xaf}, ++ {0x20151, 0x9c}, ++ {0x201b8, 0xaf}, ++ {0x20152, 0x123}, ++ {0x201b9, 0x132}, ++ {0x20153, 0x123}, ++ {0x201ba, 0x132}, ++ {0x20154, 0xb0}, ++ {0x201bb, 0xc0}, ++ {0x20155, 0xb0}, ++ {0x201bc, 0xc0}, ++ {0x20156, 0x133}, ++ {0x201bd, 0x143}, ++ {0x20157, 0x133}, ++ {0x201be, 0x143}, ++ {0x20158, 0xc1}, ++ {0x201bf, 0xca}, ++ {0x20159, 0xc1}, ++ {0x201c0, 0xca}, ++ {0x2015a, 0x144}, ++ {0x201c1, 0x14d}, ++ {0x2015b, 0x144}, ++ {0x201c2, 0x14d}, ++ {0x2015c, 0xcb}, ++ {0x201c3, 0xd4}, ++ {0x2015d, 0xcb}, ++ {0x201c4, 0xd4}, ++ {0x2015e, 0x14e}, ++ {0x201c5, 0x157}, ++ {0x2015f, 0x14e}, ++ {0x201c6, 0x157}, ++ {0x20160, 0xd5}, ++ {0x201c7, 0xdf}, ++ {0x20161, 0xd5}, ++ {0x201c8, 0xdf}, ++ {0x20162, 0x158}, ++ {0x201c9, 0x161}, ++ {0x20163, 0x158}, ++ {0x201ca, 0x161}, ++ {0x20164, 0xe0}, ++ {0x201cb, 0xee}, ++ {0x20165, 0xe0}, ++ {0x201cc, 0xee}, ++ {0x20166, 0x162}, ++ {0x201cd, 0x170}, ++ {0x20167, 0x162}, ++ {0x201ce, 0x170}, ++ {0x20168, 0xef}, ++ {0x201cf, 0xf9}, ++ {0x20169, 0xef}, ++ {0x201d0, 0xf9}, ++ {0x2016a, 0x171}, ++ {0x201d1, 0x17a}, ++ {0x2016b, 0x171}, ++ {0x201d2, 0x17a}, ++ {0x2016c, 0xfa}, ++ {0x201d3, 0x108}, ++ {0x2016d, 0xfa}, ++ {0x201d4, 0x108}, ++ {0x2016e, 0x17b}, ++ {0x201d5, 0x189}, ++ {0x2016f, 0x17b}, ++ {0x201d6, 0x189}, ++ {0x20170, 0x109}, ++ {0x201d7, 0x109}, ++ {0x20171, 0x109}, ++ {0x201d8, 0x109}, ++ {0x20172, 0x18a}, ++ {0x201d9, 0x18a}, ++ {0x20173, 0x18a}, ++ {0x201da, 0x18a}, ++ {0x41613, 0xb00}, ++ {0x41617, 0x0}, ++ {0x4163b, 0xb00}, ++ {0x4163f, 0x0}, ++ {0x41663, 0xb00}, ++ {0x41667, 0x0}, ++ {0x4168b, 0xb00}, ++ {0x4168f, 0x0}, ++ {0x41723, 0xb00}, ++ {0x41727, 0x0}, ++ {0x4174b, 0xb00}, ++ {0x4174f, 0x0}, ++ {0x417f3, 0xb00}, ++ {0x417f7, 0x0}, ++ {0x4181b, 0xb00}, ++ {0x4181f, 0x0}, ++ {0x41a2b, 0x6b00}, ++ {0x41a2f, 0x0}, ++ {0x41a53, 0x2b00}, ++ {0x41a57, 0x800}, ++ {0x41a7b, 0x6b00}, ++ {0x41a7f, 0x0}, ++ {0x41aa3, 0x2b00}, ++ {0x41aa7, 0x800}, ++ {0x41b33, 0x6b00}, ++ {0x41b37, 0x0}, ++ {0x41b5b, 0x2b00}, ++ {0x41b5f, 0x800}, ++ {0x41bfb, 0x6b00}, ++ {0x41bff, 0x0}, ++ {0x41c23, 0x2b00}, ++ {0x41c27, 0x800}, ++ {0x41008, 0xc9d8}, ++ {0x41009, 0x0}, ++ {0x4100a, 0x0}, ++ {0x4100b, 0x0}, ++ {0x4100c, 0xc808}, ++ {0x4100d, 0x0}, ++ {0x4100e, 0x0}, ++ {0x4100f, 0x0}, ++ {0x41010, 0x0}, ++ {0x41011, 0x0}, ++ {0x41012, 0x0}, ++ {0x41013, 0x2b00}, ++ {0x41014, 0x0}, ++ {0x41015, 0x0}, ++ {0x41016, 0x0}, ++ {0x41017, 0x0}, ++ {0x41018, 0xc958}, ++ {0x41019, 0x0}, ++ {0x4101a, 0x0}, ++ {0x4101b, 0x0}, ++ {0x4101c, 0xcd88}, ++ {0x4101d, 0x0}, ++ {0x4101e, 0x0}, ++ {0x4101f, 0x0}, ++ {0x41020, 0x0}, ++ {0x41021, 0x0}, ++ {0x41022, 0x0}, ++ {0x41023, 0x2b00}, ++ {0x41024, 0x0}, ++ {0x41025, 0x0}, ++ {0x41026, 0x0}, ++ {0x41027, 0x0}, ++ {0x41028, 0xc0d8}, ++ {0x41029, 0x0}, ++ {0x4102a, 0x0}, ++ {0x4102b, 0x0}, ++ {0x4102c, 0xd848}, ++ {0x4102d, 0x0}, ++ {0x4102e, 0x0}, ++ {0x4102f, 0x0}, ++ {0x41030, 0x0}, ++ {0x41031, 0x0}, ++ {0x41032, 0x0}, ++ {0x41033, 0x2b00}, ++ {0x41034, 0x0}, ++ {0x41035, 0x0}, ++ {0x41036, 0x0}, ++ {0x41037, 0x0}, ++ {0x41038, 0xc158}, ++ {0x41039, 0x0}, ++ {0x4103a, 0x0}, ++ {0x4103b, 0x0}, ++ {0x4103c, 0xddc8}, ++ {0x4103d, 0x0}, ++ {0x4103e, 0x0}, ++ {0x4103f, 0x0}, ++ {0x41040, 0x0}, ++ {0x41041, 0x0}, ++ {0x41042, 0x0}, ++ {0x41043, 0x2b00}, ++ {0x41044, 0x0}, ++ {0x41045, 0x0}, ++ {0x41046, 0x0}, ++ {0x41047, 0x0}, ++ {0x41048, 0xc1d8}, ++ {0x41049, 0x0}, ++ {0x4104a, 0x0}, ++ {0x4104b, 0x0}, ++ {0x4104c, 0xc308}, ++ {0x4104d, 0x0}, ++ {0x4104e, 0x0}, ++ {0x4104f, 0x0}, ++ {0x41050, 0x0}, ++ {0x41051, 0x0}, ++ {0x41052, 0x0}, ++ {0x41053, 0x2b00}, ++ {0x41054, 0x0}, ++ {0x41055, 0x0}, ++ {0x41056, 0x0}, ++ {0x41057, 0x0}, ++ {0x41058, 0xc558}, ++ {0x41059, 0x0}, ++ {0x4105a, 0x0}, ++ {0x4105b, 0x0}, ++ {0x4105c, 0xea08}, ++ {0x4105d, 0x0}, ++ {0x4105e, 0x0}, ++ {0x4105f, 0x0}, ++ {0x41060, 0x0}, ++ {0x41061, 0x0}, ++ {0x41062, 0x0}, ++ {0x41063, 0x2b00}, ++ {0x41064, 0x0}, ++ {0x41065, 0x0}, ++ {0x41066, 0x0}, ++ {0x41067, 0x0}, ++ {0x41068, 0xc5d8}, ++ {0x41069, 0x0}, ++ {0x4106a, 0x0}, ++ {0x4106b, 0x0}, ++ {0x4106c, 0xe308}, ++ {0x4106d, 0x0}, ++ {0x4106e, 0x0}, ++ {0x4106f, 0x0}, ++ {0x41070, 0x0}, ++ {0x41071, 0x0}, ++ {0x41072, 0x0}, ++ {0x41073, 0x2b00}, ++ {0x41074, 0x0}, ++ {0x41075, 0x0}, ++ {0x41076, 0x0}, ++ {0x41077, 0x0}, ++ {0x41078, 0x48d8}, ++ {0x41079, 0x0}, ++ {0x4107a, 0x0}, ++ {0x4107b, 0x0}, ++ {0x4107c, 0x4208}, ++ {0x4107d, 0x0}, ++ {0x4107e, 0x0}, ++ {0x4107f, 0x0}, ++ {0x41080, 0x88d8}, ++ {0x41081, 0x0}, ++ {0x41082, 0x0}, ++ {0x41083, 0x0}, ++ {0x41084, 0x9608}, ++ {0x41085, 0x0}, ++ {0x41086, 0x0}, ++ {0x41087, 0x0}, ++ {0x41088, 0x0}, ++ {0x41089, 0x0}, ++ {0x4108a, 0x0}, ++ {0x4108b, 0x2b00}, ++ {0x4108c, 0x0}, ++ {0x4108d, 0x0}, ++ {0x4108e, 0x0}, ++ {0x4108f, 0x0}, ++ {0x41090, 0xca58}, ++ {0x41091, 0x0}, ++ {0x41092, 0x0}, ++ {0x41093, 0x0}, ++ {0x41094, 0xc108}, ++ {0x41095, 0x0}, ++ {0x41096, 0x0}, ++ {0x41097, 0x0}, ++ {0x41098, 0x0}, ++ {0x41099, 0x0}, ++ {0x4109a, 0x0}, ++ {0x4109b, 0x2b00}, ++ {0x4109c, 0x0}, ++ {0x4109d, 0x0}, ++ {0x4109e, 0x0}, ++ {0x4109f, 0x0}, ++ {0x410a0, 0xcb58}, ++ {0x410a1, 0x0}, ++ {0x410a2, 0x0}, ++ {0x410a3, 0x0}, ++ {0x410a4, 0xc008}, ++ {0x410a5, 0x0}, ++ {0x410a6, 0x0}, ++ {0x410a7, 0x0}, ++ {0x410a8, 0x0}, ++ {0x410a9, 0x0}, ++ {0x410aa, 0x0}, ++ {0x410ab, 0x2b00}, ++ {0x410ac, 0x0}, ++ {0x410ad, 0x0}, ++ {0x410ae, 0x0}, ++ {0x410af, 0x0}, ++ {0x410b0, 0xd4d8}, ++ {0x410b1, 0x0}, ++ {0x410b2, 0x0}, ++ {0x410b3, 0x0}, ++ {0x410b4, 0xc008}, ++ {0x410b5, 0x0}, ++ {0x410b6, 0x0}, ++ {0x410b7, 0x0}, ++ {0xc0001, 0x5061}, ++ {0xc0002, 0x7098}, ++ {0xc0003, 0x0}, ++ {0xc0000, 0xbedc}, ++ {0xc0006, 0xb0db}, ++ {0xc0007, 0x0}, ++ {0x9070c, 0x0}, ++ {0x9070d, 0x7ff}, ++ {0x9070e, 0x668}, ++ {0x90c13, 0x0}, ++ {0x9070f, 0x7910}, ++ {0x90710, 0x355e}, ++ {0x90711, 0xcbb5}, ++ {0x90713, 0xffff}, ++ {0x90714, 0x710}, ++ {0x90715, 0x7800}, ++ {0x90c12, 0xff10}, ++ {0x90712, 0x2ee8}, ++ {0x90716, 0xffdf}, ++ {0x90717, 0x6f10}, ++ {0x90718, 0x6f10}, ++ {0x90719, 0x2868}, ++ {0x9071a, 0x2868}, ++ {0x9071b, 0xfeef}, ++ {0x90904, 0xe400}, ++ {0x90986, 0xe400}, ++ {0x90920, 0x0}, ++ {0x90921, 0x0}, ++ {0x90922, 0x0}, ++ {0x90923, 0x0}, ++ {0x90924, 0xff00}, ++ {0x90925, 0xff00}, ++ {0x90926, 0xff00}, ++ {0x90927, 0xff00}, ++ {0x90930, 0x4000}, ++ {0x90931, 0x2000}, ++ {0x90932, 0xff00}, ++ {0x90933, 0xff00}, ++ {0x9090a, 0x0}, ++ {0x9090c, 0x0}, ++ {0x9090d, 0x1}, ++ {0x200f0, 0x27f7}, ++ {0x200f1, 0x2108}, ++ {0x200f2, 0x2108}, ++ {0x100b9, 0x1}, ++ {0x100b1, 0x180}, ++ {0x100ba, 0x1}, ++ {0x100a2, 0x0}, ++ {0x100b5, 0x1}, ++ {0x110b9, 0x1}, ++ {0x110b1, 0x180}, ++ {0x110ba, 0x1}, ++ {0x110a2, 0x0}, ++ {0x110b5, 0x1}, ++ {0x120b9, 0x1}, ++ {0x120b1, 0x180}, ++ {0x120ba, 0x1}, ++ {0x120a2, 0x0}, ++ {0x120b5, 0x1}, ++ {0x130b9, 0x1}, ++ {0x130b1, 0x180}, ++ {0x130ba, 0x1}, ++ {0x130a2, 0x0}, ++ {0x130b5, 0x1}, ++ {0x70024, 0x5a3c}, ++ {0x70025, 0x5a3c}, ++ {0x70026, 0x5a3c}, ++ {0x70027, 0x5a3c}, ++ {0x70028, 0x5a3c}, ++ {0x70029, 0x5a3c}, ++ {0x7002a, 0x5a3c}, ++ {0x7002b, 0x5a3c}, ++ {0x70124, 0x5a3c}, ++ {0x70125, 0x5a3c}, ++ {0x70126, 0x5a3c}, ++ {0x70127, 0x5a3c}, ++ {0x70128, 0x5a3c}, ++ {0x70129, 0x5a3c}, ++ {0x7012a, 0x5a3c}, ++ {0x7012b, 0x5a3c}, ++ {0x70224, 0x5a3c}, ++ {0x70225, 0x5a3c}, ++ {0x70226, 0x5a3c}, ++ {0x70227, 0x5a3c}, ++ {0x70228, 0x5a3c}, ++ {0x70229, 0x5a3c}, ++ {0x7022a, 0x5a3c}, ++ {0x7022b, 0x5a3c}, ++ {0x70324, 0x5a3c}, ++ {0x70325, 0x5a3c}, ++ {0x70326, 0x5a3c}, ++ {0x70327, 0x5a3c}, ++ {0x70328, 0x5a3c}, ++ {0x70329, 0x5a3c}, ++ {0x7032a, 0x5a3c}, ++ {0x7032b, 0x5a3c}, ++ {0x70424, 0x5a3c}, ++ {0x70425, 0x5a3c}, ++ {0x70426, 0x5a3c}, ++ {0x70427, 0x5a3c}, ++ {0x70428, 0x5a3c}, ++ {0x70429, 0x5a3c}, ++ {0x7042a, 0x5a3c}, ++ {0x7042b, 0x5a3c}, ++ {0x70524, 0x5a3c}, ++ {0x70525, 0x5a3c}, ++ {0x70526, 0x5a3c}, ++ {0x70527, 0x5a3c}, ++ {0x70528, 0x5a3c}, ++ {0x70529, 0x5a3c}, ++ {0x7052a, 0x5a3c}, ++ {0x7052b, 0x5a3c}, ++ {0x70624, 0x5a3c}, ++ {0x70625, 0x5a3c}, ++ {0x70626, 0x5a3c}, ++ {0x70627, 0x5a3c}, ++ {0x70628, 0x5a3c}, ++ {0x70629, 0x5a3c}, ++ {0x7062a, 0x5a3c}, ++ {0x7062b, 0x5a3c}, ++ {0x70724, 0x5a3c}, ++ {0x70725, 0x5a3c}, ++ {0x70726, 0x5a3c}, ++ {0x70727, 0x5a3c}, ++ {0x70728, 0x5a3c}, ++ {0x70729, 0x5a3c}, ++ {0x7072a, 0x5a3c}, ++ {0x7072b, 0x5a3c}, ++ {0x70824, 0x5a3c}, ++ {0x70825, 0x5a3c}, ++ {0x70826, 0x5a3c}, ++ {0x70827, 0x5a3c}, ++ {0x70828, 0x5a3c}, ++ {0x70829, 0x5a3c}, ++ {0x7082a, 0x5a3c}, ++ {0x7082b, 0x5a3c}, ++ {0x70065, 0x1ff}, ++ {0x2007e, 0x33}, ++ {0x200ef, 0xffff}, ++ {0x90910, 0x2}, ++ {0x20310, 0x1}, ++ {0x20311, 0x1}, ++ {0xc0080, 0x2}, ++ {0xd0003, 0x0}, ++}; ++ ++static struct dram_fsp_msg ddr_dram_fsp_msg[] = { ++ { ++ /* P0 6400mts */ ++ .drate = 6400, ++ .ssc = false, ++ .fsp_phy_cfg = ddr_phy_fsp0_cfg, ++ .fsp_phy_cfg_num = ARRAY_SIZE(ddr_phy_fsp0_cfg), ++ .fw_type = FW_1D_IMAGE, ++ .fsp_phy_msgh_cfg = ddr_phy_msgh_fsp0_cfg, ++ .fsp_phy_msgh_cfg_num = ARRAY_SIZE(ddr_phy_msgh_fsp0_cfg), ++ .fsp_phy_pie_cfg = ddr_phy_pie_fsp0_cfg, ++ .fsp_phy_pie_cfg_num = ARRAY_SIZE(ddr_phy_pie_fsp0_cfg), ++ }, ++}; ++ ++/* dram fsp cfg */ ++static struct dram_fsp_cfg ddr_dram_fsp_cfg[] = { ++ { ++ .ddrc_cfg = ddr_dram_fsp0_ddrc_cfg, ++ .ddrc_cfg_num = ARRAY_SIZE(ddr_dram_fsp0_ddrc_cfg), ++ .bypass = 0, ++ }, ++}; ++ ++/* ddr timing config params */ ++struct dram_timing_info dram_timing = { ++ .ddrc_cfg = ddr_ddrc_cfg, ++ .ddrc_cfg_num = ARRAY_SIZE(ddr_ddrc_cfg), ++ .ddrphy_cfg = ddr_ddrphy_cfg, ++ .ddrphy_cfg_num = ARRAY_SIZE(ddr_ddrphy_cfg), ++ .fsp_msg = ddr_dram_fsp_msg, ++ .fsp_msg_num = ARRAY_SIZE(ddr_dram_fsp_msg), ++ .ddrphy_trained_csr = ddr_ddrphy_trained_csr, ++ .ddrphy_trained_csr_num = ARRAY_SIZE(ddr_ddrphy_trained_csr), ++ .ddrphy_pie = ddr_phy_pie, ++ .ddrphy_pie_num = ARRAY_SIZE(ddr_phy_pie), ++ .fsp_table = { 6400, }, ++ .fsp_cfg = ddr_dram_fsp_cfg, ++ .fsp_cfg_num = ARRAY_SIZE(ddr_dram_fsp_cfg), ++}; diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei_1.0.0.bbappend b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei_1.0.0.bbappend new file mode 100644 index 000000000..7dc2208b5 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-oei/imx-oei_1.0.0.bbappend @@ -0,0 +1,10 @@ +# Copyright (C) 2025, Digi International Inc. + +FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" + +SRC_URI:append:dey = " \ + file://0001-boards-ccimx95-add-platform-as-a-clone-of-mx95lp5.patch \ + file://0002-ddr-add-DDR-configuration-file-for-ccimx95.patch \ + file://0003-ccimx95-configure-console-on-LPUART6.patch \ + file://0004-ccimx95-add-DDR-configuration-file-for-ccimx95-B0-si.patch \ +" diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0001-ccimx95dvk-add-new-platform-config-and-board.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0001-ccimx95dvk-add-new-platform-config-and-board.patch new file mode 100644 index 000000000..1600622b0 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0001-ccimx95dvk-add-new-platform-config-and-board.patch @@ -0,0 +1,6195 @@ +From: Javier Viguera +Date: Mon, 15 Sep 2025 11:54:08 +0200 +Subject: [PATCH] ccimx95dvk: add new platform (config and board) + +Verbatim copy of the mx95evk + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Javier Viguera +--- + boards/ccimx95dvk/board.c | 579 ++++++++++++++ + boards/ccimx95dvk/board.h | 164 ++++ + boards/ccimx95dvk/pin_mux.c | 58 ++ + boards/ccimx95dvk/pin_mux.h | 44 ++ + boards/ccimx95dvk/sm/Makefile | 70 ++ + boards/ccimx95dvk/sm/brd_sm.c | 665 +++++++++++++++++ + boards/ccimx95dvk/sm/brd_sm.dox | 55 ++ + boards/ccimx95dvk/sm/brd_sm.h | 100 +++ + boards/ccimx95dvk/sm/brd_sm_bbm.c | 674 +++++++++++++++++ + boards/ccimx95dvk/sm/brd_sm_bbm.h | 242 ++++++ + boards/ccimx95dvk/sm/brd_sm_control.c | 317 ++++++++ + boards/ccimx95dvk/sm/brd_sm_control.h | 202 +++++ + boards/ccimx95dvk/sm/brd_sm_handlers.c | 372 +++++++++ + boards/ccimx95dvk/sm/brd_sm_handlers.h | 129 ++++ + boards/ccimx95dvk/sm/brd_sm_sensor.c | 375 ++++++++++ + boards/ccimx95dvk/sm/brd_sm_sensor.h | 210 ++++++ + boards/ccimx95dvk/sm/brd_sm_voltage.c | 565 ++++++++++++++ + boards/ccimx95dvk/sm/brd_sm_voltage.h | 213 ++++++ + configs/ccimx95dvk.cfg | 997 +++++++++++++++++++++++++ + 19 files changed, 6031 insertions(+) + create mode 100755 boards/ccimx95dvk/board.c + create mode 100755 boards/ccimx95dvk/board.h + create mode 100755 boards/ccimx95dvk/pin_mux.c + create mode 100755 boards/ccimx95dvk/pin_mux.h + create mode 100755 boards/ccimx95dvk/sm/Makefile + create mode 100755 boards/ccimx95dvk/sm/brd_sm.c + create mode 100755 boards/ccimx95dvk/sm/brd_sm.dox + create mode 100755 boards/ccimx95dvk/sm/brd_sm.h + create mode 100755 boards/ccimx95dvk/sm/brd_sm_bbm.c + create mode 100755 boards/ccimx95dvk/sm/brd_sm_bbm.h + create mode 100755 boards/ccimx95dvk/sm/brd_sm_control.c + create mode 100755 boards/ccimx95dvk/sm/brd_sm_control.h + create mode 100755 boards/ccimx95dvk/sm/brd_sm_handlers.c + create mode 100755 boards/ccimx95dvk/sm/brd_sm_handlers.h + create mode 100755 boards/ccimx95dvk/sm/brd_sm_sensor.c + create mode 100755 boards/ccimx95dvk/sm/brd_sm_sensor.h + create mode 100755 boards/ccimx95dvk/sm/brd_sm_voltage.c + create mode 100755 boards/ccimx95dvk/sm/brd_sm_voltage.h + create mode 100755 configs/ccimx95dvk.cfg + +diff --git a/boards/ccimx95dvk/board.c b/boards/ccimx95dvk/board.c +new file mode 100755 +index 000000000000..d4a671f6d7f8 +--- /dev/null ++++ b/boards/ccimx95dvk/board.c +@@ -0,0 +1,579 @@ ++/* ++ * Copyright 2023-2025 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#include "sm.h" ++#include "board.h" ++#include "brd_sm_voltage.h" ++#include "fsl_lpuart.h" ++#include "fsl_lpi2c.h" ++#include "fsl_ccm.h" ++#include "fsl_clock.h" ++#include "fsl_bbnsm.h" ++#include "fsl_reset.h" ++#include "fsl_sysctr.h" ++#include "fsl_systick.h" ++#include "fsl_wdog32.h" ++#include "fsl_cache.h" ++#include "fsl_iomuxc.h" ++#include "fsl_fro.h" ++ ++/******************************************************************************* ++ * Definitions ++ ******************************************************************************/ ++ ++/* External board-level clock rates */ ++#define BOARD_EXT_CLK_RATE 25000000UL /* 25MHz */ ++ ++/* ADC clck rate */ ++#define BOARD_ADC_CLK_RATE 80000000UL /* 80MHz */ ++ ++/* SM SysTick parameters */ ++#define BOARD_SYSTICK_CLKSRC 0U /* 0 = external ref */ ++#define BOARD_SYSTICK_CLK_ROOT CLOCK_ROOT_M33SYSTICK /* Dedicated CCM root */ ++ ++/* SM WDOG */ ++#define BOARD_WDOG_BASE_PTR WDOG2 ++#define BOARD_WDOG_IRQn WDOG2_IRQn ++#define BOARD_WDOG_CLK_SRC kWDOG32_ClockSource1 /* lpo_clk @ 32K */ ++#define BOARD_WDOG_TIMEOUT 0xFFFFU /* 65535 ticks @ 32K = 2 sec */ ++#define BOARD_WDOG_SRMASK (1UL << RST_REASON_WDOG2) ++#define BOARD_WDOG_ANY_INIT ~(BLK_CTRL_S_AONMIX_WDOG_ANY_MASK_WDOG2_MASK) ++#define BOARD_WDOG_ANY_MASK BLK_CTRL_S_AONMIX_WDOG_ANY_MASK_WDOG2_MASK ++#define BOARD_WDOG_IPG_DEBUG BLK_CTRL_NS_AONMIX_IPG_DEBUG_CM33_WDOG2_MASK ++ ++/* Board UART */ ++#ifdef INC_LIBC ++#define BOARD_UART BOARD_DEBUG_UART_INSTANCE ++#else ++#define BOARD_UART 0U ++#endif ++ ++/******************************************************************************* ++ * Variables ++ ******************************************************************************/ ++static wdog32_config_t s_wdogConfig; ++ ++/* Debug UART base pointer list */ ++static LPUART_Type *const s_uartBases[] = LPUART_BASE_PTRS; ++ ++/* Debug UART base pointer list */ ++static IRQn_Type const s_uartIrqs[] = LPUART_RX_TX_IRQS; ++ ++/* Debug UART clock list */ ++static uint32_t const s_uartClks[] = ++{ ++ 0U, ++ CLOCK_ROOT_LPUART1, ++ CLOCK_ROOT_LPUART2, ++ CLOCK_ROOT_LPUART3, ++ CLOCK_ROOT_LPUART4, ++ CLOCK_ROOT_LPUART5, ++ CLOCK_ROOT_LPUART6, ++ CLOCK_ROOT_LPUART7, ++ CLOCK_ROOT_LPUART8 ++}; ++ ++/* Debug UART peripheral LPI list */ ++static uint32_t const s_uartPerLpi[] = ++{ ++ 0U, ++ CPU_PER_LPI_IDX_LPUART1, ++ CPU_PER_LPI_IDX_LPUART2, ++ CPU_PER_LPI_IDX_LPUART3, ++ CPU_PER_LPI_IDX_LPUART4, ++ CPU_PER_LPI_IDX_LPUART5, ++ CPU_PER_LPI_IDX_LPUART6, ++ CPU_PER_LPI_IDX_LPUART7, ++ CPU_PER_LPI_IDX_LPUART8 ++}; ++ ++/* Debug UART configuration info */ ++static board_uart_config_t const s_uartConfig = ++{ ++ .base = s_uartBases[BOARD_UART], ++ .irq = s_uartIrqs[BOARD_UART], ++ .clockId = s_uartClks[BOARD_UART], ++ .perLpiId = s_uartPerLpi[BOARD_UART], ++ .baud = BOARD_DEBUG_UART_BAUDRATE, ++ .inst = BOARD_UART ++}; ++ ++/******************************************************************************* ++ * Code ++ ******************************************************************************/ ++ ++/*--------------------------------------------------------------------------*/ ++/* Configure CM33 MPU and XCACHE controller */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_ConfigMPU(void) ++{ ++ uint8_t attr; ++ ++ /* Disable code cache(ICache) and system cache(DCache) */ ++ XCACHE_DisableCache(LPCAC_PC); ++ XCACHE_DisableCache(LPCAC_PS); ++ ++ /* NOTE: All TCRAM is non-cacheable regardless of MPU setting. */ ++ ++ /* ++ * default cache policy(default memory access behavior) after enable ++ * mpu on cortex-m33(according to RM of cortex-m33): ++ * 0x00000000-0x1FFFFFFF Normal memory, Non-shareable, Write-Through, ++ * not Write Allocate ++ * 0x20000000-0x3FFFFFFF Normal memory, Non-shareable, Write-Back, ++ * Write Allocate ++ * 0x40000000-0x5FFFFFFF Device, Shareable ++ * 0x60000000-0x7FFFFFFF Normal memory, Non-shareable, Write-Back, ++ * Write Allocate ++ * 0x80000000-0x9FFFFFFF Normal memory, Non-shareable, Write-Through, ++ * not Write Allocate ++ * 0xA0000000-0xDFFFFFFF Device, Shareable ++ * 0xE0000000-0xE003FFFF Device, Shareable ++ * 0xE0040000-0xE0043FFF Device, Shareable ++ * 0xE0044000-0xE00EFFFF Device, Shareable ++ * 0xF0000000-0xFFFFFFFF Device, Shareable ++ */ ++ /* Disable MPU */ ++ ARM_MPU_Disable(); ++ ++ /* Attr0: Device-nGnRnE */ ++ // coverity[misra_c_2012_rule_14_3_violation:FALSE] ++ ARM_MPU_SetMemAttr(0U, ARM_MPU_ATTR(ARM_MPU_ATTR_DEVICE, ++ ARM_MPU_ATTR_DEVICE)); ++ ++ /* Attr1: Normal memory, Outer non-cacheable, Inner non-cacheable */ ++ // coverity[misra_c_2012_rule_14_3_violation:FALSE] ++ ARM_MPU_SetMemAttr(1U, ARM_MPU_ATTR(ARM_MPU_ATTR_NON_CACHEABLE, ++ ARM_MPU_ATTR_NON_CACHEABLE)); ++ ++ /* Attr2: Normal memory, Inner write-through transient, read allocate. ++ * Inner write-through transient, read allocate ++ */ ++ attr = ARM_MPU_ATTR_MEMORY_(0U, 0U, 1U, 0U); ++ ARM_MPU_SetMemAttr(2U, ARM_MPU_ATTR(attr, attr)); ++ ++ /* Attr3: Normal memory, Outer write-back transient, read/write allocate. ++ * Inner write-back transient, read/write ++ * allocate */ ++ attr = ARM_MPU_ATTR_MEMORY_(0U, 1U, 1U, 1U); ++ ARM_MPU_SetMemAttr(3U, ARM_MPU_ATTR(attr, attr)); ++ ++ /* ++ * Change macro definitions as follows when choose cache policy ++ * as non-cacheable: ++ * #define DDR_NONCACHEABLE (1U) ++ * #define DDR_WRITE_THROUGH (0U) ++ * #define DDR_WRITE_BACK (0U) ++ * ++ * ++ * Change macro definitions as follows when choose cache policy ++ * as Write-Through: ++ * #define DDR_NONCACHEABLE (0U) ++ * #define DDR_WRITE_THROUGH (1U) ++ * #define DDR_WRITE_BACK (0U) ++ * ++ * ++ * Change macro definitions as follows when choose cache policy ++ * as Write-Back: ++ * #define DDR_NONCACHEABLE (0U) ++ * #define DDR_WRITE_THROUGH (0U) ++ * #define DDR_WRITE_BACK (1U) ++ */ ++#define DDR_NONCACHEABLE (1U) ++#define DDR_WRITE_THROUGH (0U) ++#define DDR_WRITE_BACK (0U) ++#if DDR_NONCACHEABLE ++ /* NOTE: DDR is used as shared memory for A/M core communication, ++ * set it to non-cacheable. */ ++ /* Region 0: [0x80000000, 0xDFFFFFFF](DRAM), outer shareable, ++ * read/write, any privileged, executable. Attr 1 (non-cacheable). */ ++ ARM_MPU_SetRegion(0U, ARM_MPU_RBAR(0x80000000U, ARM_MPU_SH_OUTER, 0U, ++ 1U, 0U), ARM_MPU_RLAR(0xDFFFFFFFU, 1U)); ++#elif DDR_WRITE_THROUGH ++ /* Region 0: [0x80000000, 0xDFFFFFFF](DRAM), outer shareable, read/write, ++ * any privileged, executable. Attr 2 ++ * (Normal memory, Inner write-through transient, read allocate. Inner ++ * write-through transient, read allocate). */ ++ ARM_MPU_SetRegion(0U, ARM_MPU_RBAR(0x80000000U, ARM_MPU_SH_OUTER, 0U, ++ 1U, 0U), ARM_MPU_RLAR(0xDFFFFFFFU, 2U)); ++#elif DDR_WRITE_BACK ++ /* Region 0: [0x80000000, 0xDFFFFFFF](DRAM), outer shareable, read/write, ++ * any privileged, executable. Attr 3 ++ * (Normal memory, Outer write-back transient, read/write allocate. Inner ++ * write-back transient, read/write allocate). */ ++ ARM_MPU_SetRegion(0U, ARM_MPU_RBAR(0x80000000U, ARM_MPU_SH_OUTER, 0U, ++ 1U, 0U), ARM_MPU_RLAR(0xDFFFFFFFU, 3U)); ++#endif ++ ++#define OCRAM_NONCACHEABLE (1U) ++#define OCRAM_WRITE_THROUGH (0U) ++#define OCRAM_WRITE_BACK (0U) ++#if OCRAM_NONCACHEABLE ++ /* Region 1: [0x20480000, 0x2051FFFF](OCRAM), outer shareable, read/write, ++ * any privileged, executable. Attr 1 (non-cacheable). */ ++ ARM_MPU_SetRegion(1U, ARM_MPU_RBAR(0x20480000U, ARM_MPU_SH_OUTER, 0U, ++ 1U, 0U), ARM_MPU_RLAR(0x2051FFFFU, 1U)); ++#elif OCRAM_WRITE_THROUGH ++ /* Region 1: [0x20480000, 0x2051FFFF](OCRAM), outer shareable, ++ * read/write, any privileged, executable. Attr 2 (Normal memory, Inner ++ * write-through transient, read allocate. Inner write-through transient, ++ * read allocate). */ ++ ARM_MPU_SetRegion(1U, ARM_MPU_RBAR(0x20480000U, ARM_MPU_SH_OUTER, 0U, ++ 1U, 0U), ARM_MPU_RLAR(0x2051FFFFU, 2U)); ++#elif OCRAM_WRITE_BACK ++ /* Region 1: [0x20480000, 0x2051FFFF](OCRAM), outer shareable, ++ * read/write, any privileged, executable. Attr 3 (Normal memory, ++ * Outer write-back transient, read/write allocate. Inner write-back ++ * transient, read/write allocate). */ ++ ARM_MPU_SetRegion(1U, ARM_MPU_RBAR(0x20480000U, ARM_MPU_SH_OUTER, 0U, ++ 1U, 0U), ARM_MPU_RLAR(0x2051FFFFU, 3U)); ++#endif ++ ++ /* Enable MPU(use default memory map when access the memory within ++ * region) */ ++ ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk); ++ ++ /* Enable ICache and DCache */ ++ XCACHE_EnableCache(LPCAC_PC); ++ XCACHE_EnableCache(LPCAC_PS); ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Initialize clocking */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_InitClocks(void) ++{ ++ uint32_t fuseTrim = DEV_SM_FuseGet(DEV_SM_FUSE_FRO_TRIM); ++ ++ if (fuseTrim == 0U) ++ { ++ /* Enable the FRO clock with default value */ ++ (void) FRO_SetEnable(true); ++ } ++ else ++ { ++ /* Set the Trim value read from the fuses */ ++ bool status = FRO_SetTrim(fuseTrim); ++ ++ if (status) ++ { ++ /* Enable the FRO clock with default value */ ++ (void) FRO_SetEnable(true); ++ } ++ } ++ ++ /* Configure default EXT_CLK1 rate tied to XTAL_OUT/EXT_CLK pin */ ++ (void) CLOCK_SourceSetRate(CLOCK_SRC_EXT1, BOARD_EXT_CLK_RATE, 0U); ++ ++ /* Configure ADC clock */ ++ (void) CCM_RootSetParent(CLOCK_ROOT_ADC, CLOCK_SRC_SYSPLL1_PFD1_DIV2); ++ (void) CCM_RootSetRate(CLOCK_ROOT_ADC, BOARD_ADC_CLK_RATE, ++ CLOCK_ROUND_RULE_CEILING); ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Return the debug UART info */ ++/*--------------------------------------------------------------------------*/ ++const board_uart_config_t *BOARD_GetDebugUart(void) ++{ ++ return &s_uartConfig; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Initialize debug console */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_InitDebugConsole(void) ++{ ++ if (s_uartConfig.base != NULL) ++ { ++ uint64_t rate = CCM_RootGetRate(s_uartConfig.clockId); ++ ++ /* Configure debug UART */ ++ lpuart_config_t lpuart_config; ++ LPUART_GetDefaultConfig(&lpuart_config); ++ lpuart_config.baudRate_Bps = s_uartConfig.baud; ++ lpuart_config.rxFifoWatermark = ((uint8_t) ++ FSL_FEATURE_LPUART_FIFO_SIZEn(s_uartConfig.base)) - 1U; ++ lpuart_config.txFifoWatermark = ((uint8_t) ++ FSL_FEATURE_LPUART_FIFO_SIZEn(s_uartConfig.base)) - 1U; ++ lpuart_config.enableTx = true; ++ lpuart_config.enableRx = true; ++ (void) LPUART_Init(s_uartConfig.base, &lpuart_config, ++ U64_U32(rate)); ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Initialize IRQ handlers */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_InitHandlers(void) ++{ ++ /* Configure default priority of exceptions and IRQs */ ++ for (int32_t irq = ((int32_t) SVCall_IRQn); irq < ((int32_t) ++ NUMBER_OF_INT_VECTORS); irq++) ++ { ++ // coverity[misra_c_2012_rule_10_5_violation:FALSE] ++ NVIC_SetPriority((IRQn_Type) irq, IRQ_PRIO_NOPREEMPT_NORMAL); ++ } ++ ++ /* Configure SWI handler */ ++ NVIC_EnableIRQ(BOARD_SWI_IRQn); ++ ++ /* Enable BBNSM handler */ ++ NVIC_EnableIRQ(BBNSM_IRQn); ++ ++ /* Enable GPC SM handler */ ++ NVIC_SetPriority(GPC_SM_REQ_IRQn, IRQ_PRIO_NOPREEMPT_VERY_HIGH); ++ NVIC_EnableIRQ(GPC_SM_REQ_IRQn); ++ ++ /* Enable ELE Group IRQ handlers */ ++ NVIC_EnableIRQ(ELE_Group1_IRQn); ++ NVIC_EnableIRQ(ELE_Group2_IRQn); ++ NVIC_EnableIRQ(ELE_Group3_IRQn); ++ ++ /* Enable FCCU handler */ ++ NVIC_SetPriority(FCCU_INT0_IRQn, IRQ_PRIO_NOPREEMPT_CRITICAL); ++ NVIC_EnableIRQ(FCCU_INT0_IRQn); ++ ++ /* Enable GPIO1 handler */ ++ NVIC_EnableIRQ(GPIO1_0_IRQn); ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Initialize timers */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_InitTimers(void) ++{ ++ /* Configure and enable the BBNSM RTC */ ++ bbnsm_rtc_config_t rtcConfig; ++ BBNSM_RTC_GetDefaultConfig(&rtcConfig); ++ BBNSM_RTC_Init(BBNSM, &rtcConfig); ++ ++ /* Configure and enable system counter */ ++ SYSCTR_Init(); ++ ++ /* Configure and enable M33 SysTick */ ++ uint64_t rate = CCM_RootGetRate(BOARD_SYSTICK_CLK_ROOT); ++ uint32_t reloadVal = (uint32_t) (rate & 0xFFFFFFFFU); ++ reloadVal = ((reloadVal * BOARD_TICK_PERIOD_MSEC) + 999U) / 1000U; ++ SYSTICK_Init(1U, BOARD_SYSTICK_CLKSRC, (uint32_t) (rate & 0xFFFFFFFFU), ++ reloadVal); ++ NVIC_EnableIRQ(SysTick_IRQn); ++ ++ /* Configure and enable the WDOG */ ++ WDOG32_GetDefaultConfig(&s_wdogConfig); ++ s_wdogConfig.clockSource = BOARD_WDOG_CLK_SRC; ++ s_wdogConfig.timeoutValue = BOARD_WDOG_TIMEOUT; ++ s_wdogConfig.enableInterrupt = true; ++ WDOG32_Init(BOARD_WDOG_BASE_PTR, &s_wdogConfig); ++ NVIC_SetPriority(BOARD_WDOG_IRQn, IRQ_PRIO_PREEMPT_CRITICAL); ++ ++ /* Configure to just non-FCCU SM watchdogs */ ++ BLK_CTRL_S_AONMIX->WDOG_ANY_MASK = BOARD_WDOG_ANY_INIT; ++ ++ /* Switch WDOG to COLD mode */ ++ BOARD_WdogModeSet(BOARD_WDOG_MODE_COLD); ++ ++ /* Halt SM WDOG on M33 debug entry */ ++ BLK_CTRL_NS_AONMIX->IPG_DEBUG_CM33 = (BOARD_WDOG_IPG_DEBUG); ++ ++ /* Halt CM7 WDOG on CM7 debug entry */ ++ BLK_CTRL_WAKEUPMIX->IPG_DEBUG_CM7 = ++ BLK_CTRL_WAKEUPMIX_IPG_DEBUG_CM7_WDOG5_MASK; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Set watchdog mode */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_WdogModeSet(uint32_t mode) ++{ ++ switch (mode) ++ { ++ case BOARD_WDOG_MODE_WARM: /* warm */ ++ /* Allow WDOG to generate internal warm reset */ ++ SRC_GEN->SRMASK &= (~BOARD_WDOG_SRMASK); ++ ++ /* Enable WDOG interrupt */ ++ NVIC_EnableIRQ(BOARD_WDOG_IRQn); ++ ++ /* Disable WDOG_ANY */ ++ BLK_CTRL_S_AONMIX->WDOG_ANY_MASK |= BOARD_WDOG_ANY_MASK; ++ ++ /* Drive WDOG_ANY from WDOG */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_WDOG_ANY__WDOG_ANY, 0U); ++ break; ++ case BOARD_WDOG_MODE_COLD: /* cold */ ++ /* Allow WDOG to generate internal warm reset */ ++ SRC_GEN->SRMASK &= (~BOARD_WDOG_SRMASK); ++ ++ /* Enable WDOG interrupt */ ++ NVIC_EnableIRQ(BOARD_WDOG_IRQn); ++ ++ /* Enable WDOG_ANY */ ++ BLK_CTRL_S_AONMIX->WDOG_ANY_MASK &= ~BOARD_WDOG_ANY_MASK; ++ ++ /* Drive WDOG_ANY from WDOG */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_WDOG_ANY__WDOG_ANY, 0U); ++ break; ++ case BOARD_WDOG_MODE_IRQ: /* irq */ ++ /* Enable WDOG interrupt */ ++ NVIC_EnableIRQ(BOARD_WDOG_IRQn); ++ ++ /* Disallow WDOG to generate internal warm reset */ ++ SRC_GEN->SRMASK |= BOARD_WDOG_SRMASK; ++ ++ /* Disable WDOG_ANY */ ++ BLK_CTRL_S_AONMIX->WDOG_ANY_MASK |= BOARD_WDOG_ANY_MASK; ++ ++ /* Drive WDOG_ANY from WDOG */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_WDOG_ANY__WDOG_ANY, 0U); ++ break; ++ case BOARD_WDOG_MODE_OFF: /* off */ ++ s_wdogConfig.enableWdog32 = false; ++ WDOG32_Deinit(BOARD_WDOG_BASE_PTR); ++ break; ++ case BOARD_WDOG_MODE_TRIGGER: /* trigger */ ++ BOARD_WDOG_BASE_PTR->CNT = 0U; ++ break; ++ case BOARD_WDOG_MODE_FCCU: /* fccu */ ++ /* Drive WDOG_ANY from FCCU */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_WDOG_ANY__FCCU_EOUT1, 0U); ++ ++ /* Disallow WDOG to generate internal warm reset */ ++ SRC_GEN->SRMASK |= BOARD_WDOG_SRMASK; ++ ++ /* Disable WDOG interrupt */ ++ NVIC_DisableIRQ(BOARD_WDOG_IRQn); ++ break; ++ default: ++ ; /* Intentional empty default */ ++ break; ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Kick the watchdog timer */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_WdogRefresh(void) ++{ ++ WDOG32_Refresh(BOARD_WDOG_BASE_PTR); ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Initialize serial bus for external devices */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_InitSerialBus(void) ++{ ++ static LPI2C_Type *const s_i2cBases[] = LPI2C_BASE_PTRS; ++ LPI2C_Type *base = s_i2cBases[BOARD_I2C_INSTANCE]; ++ lpi2c_master_config_t lpi2cConfig = {0}; ++ static uint32_t const s_i2cClks[] = ++ { ++ 0U, ++ CLOCK_ROOT_LPI2C1, ++ CLOCK_ROOT_LPI2C2 ++ }; ++ uint32_t clockId = s_i2cClks[BOARD_I2C_INSTANCE]; ++ ++ uint32_t rate = U64_U32(CCM_RootGetRate(clockId)); ++ ++ LPI2C_MasterGetDefaultConfig(&lpi2cConfig); ++ ++ lpi2cConfig.baudRate_Hz = BOARD_I2C_BAUDRATE; ++ lpi2cConfig.enableDoze = false; ++ ++ LPI2C_MasterInit(base, &lpi2cConfig, rate); ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* System sleep prepare */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_SystemSleepPrepare(uint32_t sleepMode, uint32_t sleepFlags) ++{ ++ BRD_SM_VoltageSuspend(true); ++ ++ /* Configure SM LPUART for wakeup */ ++ if (s_uartConfig.base != NULL) ++ { ++ /* Enable edge-detect IRQ */ ++ (void) LPUART_ClearStatusFlags(s_uartConfig.base, ++ (uint32_t)kLPUART_RxActiveEdgeFlag); ++ LPUART_EnableInterrupts(s_uartConfig.base, ++ (uint32_t)kLPUART_RxActiveEdgeInterruptEnable); ++ NVIC_EnableIRQ(s_uartConfig.irq); ++ ++ /* Configure LPI of SM LPUART */ ++ (void) CPU_PerLpiConfigSet(CPU_IDX_M33P, s_uartConfig.perLpiId, ++ CPU_PER_LPI_ON_RUN_WAIT_STOP); ++ } ++ ++ /* Configure LPI for GPIO1 */ ++ (void) CPU_PerLpiConfigSet(CPU_IDX_M33P, CPU_PER_LPI_IDX_GPIO1, ++ CPU_PER_LPI_ON_RUN_WAIT_STOP); ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* System sleep entry */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_SystemSleepEnter(uint32_t sleepMode, uint32_t sleepFlags) ++{ ++ /* Disable SysTick */ ++ uint32_t sysTickMask = SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; ++ SysTick->CTRL &= (~sysTickMask); ++ ++ /* Clear pending SysTick exception */ ++ SCB->ICSR = SCB_ICSR_PENDSTCLR_Msk; ++ ++ if (s_wdogConfig.enableWdog32) ++ { ++ /* Disable WDOG */ ++ WDOG32_Deinit(BOARD_WDOG_BASE_PTR); ++ ++ /* Waits for new configuration to take effect. */ ++ while (0U == ((BOARD_WDOG_BASE_PTR->CS) & WDOG_CS_RCS_MASK)) ++ { ++ ; /* Intentional empty while */ ++ } ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* System sleep exit */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_SystemSleepExit(uint32_t sleepMode, uint32_t sleepFlags) ++{ ++ if (s_wdogConfig.enableWdog32) ++ { ++ /* Enable WDOG */ ++ WDOG32_Init(BOARD_WDOG_BASE_PTR, &s_wdogConfig); ++ } ++ ++ /* Enable SysTick */ ++ uint32_t sysTickMask = SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; ++ SysTick->VAL = 0U; ++ SysTick->CTRL |= (sysTickMask); ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* System sleep unprepare */ ++/*--------------------------------------------------------------------------*/ ++void BOARD_SystemSleepUnprepare(uint32_t sleepMode, uint32_t sleepFlags) ++{ ++ BRD_SM_VoltageRestore(); ++ ++ /* Service SM LPUART wakeup events */ ++ if (s_uartConfig.base != NULL) ++ { ++ (void) LPUART_ClearStatusFlags(s_uartConfig.base, ++ (uint32_t)kLPUART_RxActiveEdgeFlag); ++ LPUART_DisableInterrupts(s_uartConfig.base, ++ (uint32_t)kLPUART_RxActiveEdgeInterruptEnable); ++ ++ NVIC_DisableIRQ(s_uartConfig.irq); ++ NVIC_ClearPendingIRQ(s_uartConfig.irq); ++ } ++} ++ +diff --git a/boards/ccimx95dvk/board.h b/boards/ccimx95dvk/board.h +new file mode 100755 +index 000000000000..d6b450b92f10 +--- /dev/null ++++ b/boards/ccimx95dvk/board.h +@@ -0,0 +1,164 @@ ++/* ++ * Copyright 2023-2024 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#ifndef BOARD_H ++#define BOARD_H ++ ++#include "fsl_common.h" ++#include "config_board.h" ++#include "dev_sm.h" ++ ++/*! ++ * @addtogroup BRD_SM_MX95EVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing the board API. ++ */ ++ ++/******************************************************************************* ++ * Definitions ++ ******************************************************************************/ ++ ++/*! ++ * @name Board general parameters ++ */ ++/** @{ */ ++#define BOARD_TICK_PERIOD_MSEC 10U /*!< Tick period */ ++#define BOARD_SWI_IRQn Reserved110_IRQn /*!< SWI IRQ */ ++#define BOARD_HAS_WDOG /*!< Has a watchdog */ ++#define BOARD_HAS_PMIC /*!< Has a PMIC */ ++#define BOARD_PMIC_RESUME_TICKS ((20U * 32768U) / 10000U) /*!< 2ms in 32K ticks */ ++/** @} */ ++ ++/*! ++ * @name Board PF09 OTP voltages (uV) ++ */ ++/** @{ */ ++#define BOARD_VOLT_SOC 920000 /*!< SOC OTP */ ++#define BOARD_VOLT_ARM 920000 /*!< ARM OTP */ ++/** @} */ ++ ++/*! ++ * @name Watchdog modes ++ */ ++/** @{ */ ++#define BOARD_WDOG_MODE_WARM 0U /*!< Wdog generate warm reset */ ++#define BOARD_WDOG_MODE_COLD 1U /*!< Wdog generate cold reset */ ++#define BOARD_WDOG_MODE_IRQ 2U /*!< Wdog generate IRQ only */ ++#define BOARD_WDOG_MODE_OFF 3U /*!< Wdog disabled */ ++#define BOARD_WDOG_MODE_TRIGGER 4U /*!< Trigger wdog */ ++#define BOARD_WDOG_MODE_FCCU 5U /*!< Wdog generate FCCU fault */ ++/** @} */ ++ ++/******************************************************************************* ++ * Types ++ ******************************************************************************/ ++ ++/*! ++ * Debug UART configuration info ++ */ ++typedef struct ++{ ++ LPUART_Type *const base; /*!< LPUART base pointer */ ++ IRQn_Type irq; /*!< Interrupt number */ ++ uint32_t clockId; /*!< Clock ID */ ++ uint32_t perLpiId; /*!< Peripheral LPI ID */ ++ uint32_t baud; /*!< Baud rate */ ++ uint8_t inst; /*!< Instance number */ ++} board_uart_config_t; ++ ++#if defined(__cplusplus) ++extern "C" { ++#endif /* __cplusplus */ ++ ++/******************************************************************************* ++ * API ++ ******************************************************************************/ ++ ++/*! Configure the M33 MPU */ ++void BOARD_ConfigMPU(void); ++ ++/*! Init hardware */ ++void BOARD_InitHardware(void); ++ ++/*! Init clocks */ ++void BOARD_InitClocks(void); ++ ++/*! ++ * Get a device clock debug UART info. ++ * ++ * This function returns the UART info for the UART used for SM ++ * debug. ++ * ++ * @return Returns the debug UART config info. ++ */ ++const board_uart_config_t *BOARD_GetDebugUart(void); ++ ++/*! Init the debug UART */ ++void BOARD_InitDebugConsole(void); ++ ++/*! Init interrupt handlers */ ++void BOARD_InitHandlers(void); ++ ++/*! Init timers */ ++void BOARD_InitTimers(void); ++ ++/*! Init serial buses */ ++void BOARD_InitSerialBus(void); ++ ++/*! ++ * Board-level prepare for system sleep entry ++ * ++ * @param sleepMode Sleep mode being entered. ++ * @param sleepFlags Sleep flag options. ++ */ ++void BOARD_SystemSleepPrepare(uint32_t sleepMode, uint32_t sleepFlags); ++ ++/*! ++ * Board-level system sleep entry ++ * ++ * @param sleepMode Sleep mode being entered. ++ * @param sleepFlags Sleep flag options. ++ */ ++void BOARD_SystemSleepEnter(uint32_t sleepMode, uint32_t sleepFlags); ++ ++/*! ++ * Board-level system sleep exit ++ * ++ * @param sleepMode Sleep mode being exited. ++ * @param sleepFlags Sleep flag options. ++ */ ++void BOARD_SystemSleepExit(uint32_t sleepMode, uint32_t sleepFlags); ++ ++/*! ++ * Board-level unprepare for system sleep entry ++ * ++ * @param sleepMode Sleep mode being entered. ++ * @param sleepFlags Sleep flag options. ++ */ ++void BOARD_SystemSleepUnprepare(uint32_t sleepMode, uint32_t sleepFlags); ++ ++/*! ++ * Set the watchdog mode ++ * ++ * @param mode Mode to set. ++ */ ++void BOARD_WdogModeSet(uint32_t mode); ++ ++/*! Service the watchdog */ ++void BOARD_WdogRefresh(void); ++ ++#if defined(__cplusplus) ++} ++#endif /* __cplusplus */ ++ ++/** @} */ ++ ++#endif /* BOARD_H */ ++ +diff --git a/boards/ccimx95dvk/pin_mux.c b/boards/ccimx95dvk/pin_mux.c +new file mode 100755 +index 000000000000..b40d897fbcdc +--- /dev/null ++++ b/boards/ccimx95dvk/pin_mux.c +@@ -0,0 +1,58 @@ ++/* ++ * Copyright 2023 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#include "pin_mux.h" ++#include "board.h" ++ ++/* FUNCTION ************************************************************************************************************ ++ * ++ * Function Name : BOARD_InitPins ++ * Description : Configures pin routing and optionally pin electrical features. ++ * ++ * END ****************************************************************************************************************/ ++void BOARD_InitPins(void) ++{ ++#if (BOARD_DEBUG_UART_INSTANCE == 1U) ++ /* Configure LPUART 1 */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_UART1_RXD__LPUART1_RX, 0U); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_UART1_RXD__LPUART1_RX, IOMUXC_PAD_PD(1U)); ++ ++ IOMUXC_SetPinMux(IOMUXC_PAD_UART1_TXD__LPUART1_TX, 0); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_UART1_TXD__LPUART1_TX, IOMUXC_PAD_DSE(0xFU)); ++#elif (BOARD_DEBUG_UART_INSTANCE == 2U) ++ /* Configure LPUART 2 */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_UART2_RXD__LPUART2_RX, 0); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_UART2_RXD__LPUART2_RX, IOMUXC_PAD_PD(1U)); ++ ++ IOMUXC_SetPinMux(IOMUXC_PAD_UART2_TXD__LPUART2_TX, 0); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_UART2_TXD__LPUART2_TX, IOMUXC_PAD_DSE(0xFU)); ++#endif ++ ++#if (BOARD_I2C_INSTANCE == 1U) ++ /* Configure LPI2C 1 */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_I2C1_SCL__LPI2C1_SCL, 1U); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_I2C1_SCL__LPI2C1_SCL, IOMUXC_PAD_DSE(0xFU) ++ | IOMUXC_PAD_FSEL1(0x3U) | IOMUXC_PAD_PU(0x1U) | IOMUXC_PAD_OD(0x1U)); ++ ++ IOMUXC_SetPinMux(IOMUXC_PAD_I2C1_SDA__LPI2C1_SDA, 1U); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_I2C1_SDA__LPI2C1_SDA, IOMUXC_PAD_DSE(0xFU) ++ | IOMUXC_PAD_FSEL1(0x3U) | IOMUXC_PAD_PU(0x1U) | IOMUXC_PAD_OD(0x1U)); ++#elif (BOARD_I2C_INSTANCE == 2U) ++ /* Configure LPI2C 2 */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_I2C2_SCL__LPI2C2_SCL, 1U); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_I2C2_SCL__LPI2C2_SCL, IOMUXC_PAD_DSE(0xFU) ++ | IOMUXC_PAD_FSEL1(0x3U) | IOMUXC_PAD_PU(0x1U) | IOMUXC_PAD_OD(0x1U)); ++ ++ IOMUXC_SetPinMux(IOMUXC_PAD_I2C2_SDA__LPI2C2_SDA, 1U); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_I2C2_SDA__LPI2C2_SDA, IOMUXC_PAD_DSE(0xFU) ++ | IOMUXC_PAD_FSEL1(0x3U) | IOMUXC_PAD_PU(0x1U) | IOMUXC_PAD_OD(0x1U)); ++#endif ++ ++ /* Configure GPIO1-10 (INT from the PCAL6408A */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_PDM_BIT_STREAM1__GPIO1_IO_BIT10, 0U); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_PDM_BIT_STREAM1__GPIO1_IO_BIT10, 0U); ++} ++ +diff --git a/boards/ccimx95dvk/pin_mux.h b/boards/ccimx95dvk/pin_mux.h +new file mode 100755 +index 000000000000..24cd7920d220 +--- /dev/null ++++ b/boards/ccimx95dvk/pin_mux.h +@@ -0,0 +1,44 @@ ++/* ++ * Copyright 2023 NXP ++ * ++ * SPDX-License-Identifier: BSD-3-Clause ++ */ ++ ++#ifndef PIN_MUX_H ++#define PIN_MUX_H ++ ++#include "fsl_iomuxc.h" ++ ++/*********************************************************************************************************************** ++ * Definitions ++ **********************************************************************************************************************/ ++ ++/*! ++ * @addtogroup BRD_SM_MX95EVK ++ * @file ++ * @{ ++ */ ++ ++/*********************************************************************************************************************** ++ * API ++ **********************************************************************************************************************/ ++ ++#if defined(__cplusplus) ++extern "C" { ++#endif ++ ++/*! ++ * @brief Configures pin routing and optionally pin electrical features. ++ * ++ */ ++void BOARD_InitPins(void); /*!< Function assigned for the core: Cortex-M33[cm33] */ ++ ++#if defined(__cplusplus) ++} ++#endif ++ ++/*! ++ * @} ++ */ ++#endif /* PIN_MUX_H */ ++ +diff --git a/boards/ccimx95dvk/sm/Makefile b/boards/ccimx95dvk/sm/Makefile +new file mode 100755 +index 000000000000..d5b576737636 +--- /dev/null ++++ b/boards/ccimx95dvk/sm/Makefile +@@ -0,0 +1,70 @@ ++## ################################################################### ++## ++## Copyright 2023 NXP ++## ++## Redistribution and use in source and binary forms, with or without modification, ++## are permitted provided that the following conditions are met: ++## ++## o Redistributions of source code must retain the above copyright notice, this list ++## of conditions and the following disclaimer. ++## ++## o Redistributions in binary form must reproduce the above copyright notice, this ++## list of conditions and the following disclaimer in the documentation and/or ++## other materials provided with the distribution. ++## ++## o Neither the name of the copyright holder nor the names of its ++## contributors may be used to endorse or promote products derived from this ++## software without specific prior written permission. ++## ++## 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 HOLDER 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. ++## ++## ++## ################################################################### ++ ++BOARD ?= mcimx95evk ++BRD_SM_API_DIR = $(ROOT_DIR)/sm/brd ++BOARDS_DIR = $(ROOT_DIR)/boards ++BOARD_DIR = $(BOARDS_DIR)/$(BOARD) ++ ++INCLUDE += \ ++ -I$(BRD_SM_API_DIR) \ ++ -I$(BOARDS_DIR) \ ++ -I$(BOARD_DIR) \ ++ -I$(BOARD_DIR)/sm \ ++ -I$(COMPONENTS_DIR)/pcal6408a \ ++ -I$(COMPONENTS_DIR)/pf09 \ ++ -I$(COMPONENTS_DIR)/pf53 \ ++ -I$(COMPONENTS_DIR)/pca2131 ++ ++VPATH += \ ++ $(BRD_SM_API_DIR) \ ++ $(BOARDS_DIR) \ ++ $(BOARD_DIR) \ ++ $(BOARD_DIR)/sm \ ++ $(COMPONENTS_DIR)/pcal6408a \ ++ $(COMPONENTS_DIR)/pf09 \ ++ $(COMPONENTS_DIR)/pf53 \ ++ $(COMPONENTS_DIR)/pca2131 ++ ++OBJS += \ ++ $(OUT)/board.o \ ++ $(OUT)/brd_sm.o \ ++ $(OUT)/brd_sm_handlers.o \ ++ $(OUT)/brd_sm_control.o \ ++ $(OUT)/brd_sm_sensor.o \ ++ $(OUT)/brd_sm_voltage.o \ ++ $(OUT)/brd_sm_bbm.o \ ++ $(OUT)/fsl_pcal6408a.o \ ++ $(OUT)/fsl_pf09.o \ ++ $(OUT)/fsl_pf53.o \ ++ $(OUT)/fsl_pca2131.o ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm.c b/boards/ccimx95dvk/sm/brd_sm.c +new file mode 100755 +index 000000000000..cd48b590cd26 +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm.c +@@ -0,0 +1,665 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/* File containing the implementation of the SM abstraction for the board. */ ++/*==========================================================================*/ ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "brd_sm.h" ++#include "dev_sm.h" ++#include "lmm.h" ++#include "fsl_lpi2c.h" ++#include "fsl_bbnsm.h" ++#include "fsl_rgpio.h" ++#include "fsl_iomuxc.h" ++ ++/* Local defines */ ++ ++#define BRD_SM_RST_REC_FIRST 4U /* First GPR for shutdown record */ ++#define BRD_SM_RST_REC_NUM 4U /* Number of GPR for shutdown record */ ++ ++/* Defines to encode the reason */ ++#define BRD_SM_REC_REASON_MASK (0x000000FFU) ++#define BRD_SM_REC_REASON_SHIFT (0U) ++#define BRD_SM_REC_REASON(x) \ ++ (((uint32_t)(((uint32_t)(x)) << BRD_SM_REC_REASON_SHIFT)) & \ ++ BRD_SM_REC_REASON_MASK) ++ ++/* Defines to encode the error ID */ ++#define BRD_SM_REC_EID_MASK (0x007FFF00U) ++#define BRD_SM_REC_EID_SHIFT (8U) ++#define BRD_SM_REC_EID(x) \ ++ (((uint32_t)(((uint32_t)(x)) << BRD_SM_REC_EID_SHIFT)) & \ ++ BRD_SM_REC_EID_MASK) ++#define BRD_SM_REC_EID_SIGN (0x00004000U) ++#define BRD_SM_REC_EID_EXT (0xFFFF8000U) ++ ++/* Defines to encode the valid flag for the errId */ ++#define BRD_SM_REC_VERR_MASK (0x00800000U) ++#define BRD_SM_REC_VERR_SHIFT (23U) ++#define BRD_SM_REC_VERR(x) \ ++ (((uint32_t)(((uint32_t)(x)) << BRD_SM_REC_VERR_SHIFT)) & \ ++ BRD_SM_REC_VERR_MASK) ++ ++/* Defines to encode the source/origin */ ++#define BRD_SM_REC_SRC_MASK (0x0F000000U) ++#define BRD_SM_REC_SRC_SHIFT (24U) ++#define BRD_SM_REC_SRC(x) \ ++ (((uint32_t)(((uint32_t)(x)) << BRD_SM_REC_SRC_SHIFT)) & \ ++ BRD_SM_REC_SRC_MASK) ++ ++/* Defines to encode the valid flag for the source */ ++#define BRD_SM_REC_VSRC_MASK (0x10000000U) ++#define BRD_SM_REC_VSRC_SHIFT (28U) ++#define BRD_SM_REC_VSRC(x) \ ++ (((uint32_t)(((uint32_t)(x)) << BRD_SM_REC_VSRC_SHIFT)) & \ ++ BRD_SM_REC_VSRC_MASK) ++ ++/* Defines to encode the extended info length */ ++#define BRD_SM_REC_LEN_MASK (0x60000000U) ++#define BRD_SM_REC_LEN_SHIFT (29U) ++#define BRD_SM_REC_LEN(x) \ ++ (((uint32_t)(((uint32_t)(x)) << BRD_SM_REC_LEN_SHIFT)) & \ ++ BRD_SM_REC_LEN_MASK) ++ ++/* Defines to encode the valid */ ++#define BRD_SM_REC_VLD_MASK (0x80000000U) ++#define BRD_SM_REC_VLD_SHIFT (31U) ++#define BRD_SM_REC_VLD(x) \ ++ (((uint32_t)(((uint32_t)(x)) << BRD_SM_REC_VLD_SHIFT)) & \ ++ BRD_SM_REC_VLD_MASK) ++ ++/* Performance parameters */ ++#define BOARD_PERF_LEVEL DEV_SM_PERF_LVL_ODV /* Target perf level */ ++#if BOARD_VOLT_SOC >= ES_ODV_UV_VDD_SOC ++#define BOARD_BOOT_LEVEL DEV_SM_PERF_LVL_ODV /* Boot perf overdrive */ ++#elif BOARD_VOLT_SOC >= ES_NOM_UV_VDD_SOC ++#define BOARD_BOOT_LEVEL DEV_SM_PERF_LVL_NOM /* Boot perf nominal */ ++#else ++#define BOARD_BOOT_LEVEL DEV_SM_PERF_LVL_LOW /* Boot perf low */ ++#endif ++ ++/* Local types */ ++ ++/* Local variables */ ++ ++/* Local functions */ ++ ++static int32_t BRD_SM_InitComplete(uint32_t mSel); ++ ++/*--------------------------------------------------------------------------*/ ++/* Init board */ ++/*--------------------------------------------------------------------------*/ ++// coverity[misra_c_2012_directive_4_6_violation:FALSE] ++int32_t BRD_SM_Init(int argc, const char * const argv[], uint32_t *mSel) ++{ ++ int32_t status; ++ uint64_t addr; ++ uint32_t ms; ++ uint32_t flags; ++ ++ /* Init board hardware */ ++ BOARD_InitHardware(); ++ ++ /* Get the boot mode select */ ++ if (DEV_SM_RomBootCpuGet(DEV_SM_CPU_M33P, &addr, &ms, &flags) ++ == SM_ERR_SUCCESS) ++ { ++ *mSel = ms; ++ } ++ ++ /* Initialize devices connected to serial buses (PMIC, IOExp, etc) */ ++ status = BRD_SM_SerialDevicesInit(); ++ ++ if (status == SM_ERR_SUCCESS) ++ { ++ /* Init the device */ ++ status = DEV_SM_Init(BOARD_BOOT_LEVEL, BOARD_PERF_LEVEL); ++ } ++ ++ if (status == SM_ERR_SUCCESS) ++ { ++ /* Complete board init after device init */ ++ status = BRD_SM_InitComplete(*mSel); ++ } ++ ++ if (status == SM_ERR_SUCCESS) ++ { ++ /* Disallow ANA TMPSNS to generate internal warm reset */ ++ SRC_GEN->SRMASK |= BIT32(RST_REASON_TEMPSENSE); ++ ++ /* Switch WDOG to FCCU mode */ ++ BOARD_WdogModeSet(BOARD_WDOG_MODE_FCCU); ++ } ++ ++ /* TODO: Remove when A0 support dropped */ ++ /* Configure ISO controls based on feature fuses */ ++ uint32_t ipIsoMask = 0U; ++ ++ /* PCIe1 is tied to HSIO ISO[0] */ ++ if (DEV_SM_FuseGet(DEV_SM_FUSE_PCIE1_DISABLE) == 0U) ++ { ++ ipIsoMask |= SRC_XSPR_SLICE_SW_CTRL_ISO_CTRL_0_MASK; ++ } ++ ++ /* PCIe2 is tied to HSIO ISO[1] */ ++ if (DEV_SM_FuseGet(DEV_SM_FUSE_PCIE2_DISABLE) == 0U) ++ { ++ ipIsoMask |= SRC_XSPR_SLICE_SW_CTRL_ISO_CTRL_1_MASK; ++ } ++ ++ /* Apply ISO mask */ ++ if (ipIsoMask != 0U) ++ { ++ SRC_XSPR_HSIOMIX_TOP->SLICE_SW_CTRL &= (~ipIsoMask); ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Exit function */ ++/*--------------------------------------------------------------------------*/ ++_Noreturn void BRD_SM_Exit(int32_t status, uint32_t pc) ++{ ++#if defined(MONITOR) || defined(RUN_TEST) ++ printf("exit %d, 0x%08X\n", status, pc); ++ ++ /* Disable watchdog */ ++ BOARD_WdogModeSet(BOARD_WDOG_MODE_OFF); ++#else ++ SM_SYSTEMERROR(status, pc); ++ // coverity[misra_c_2012_rule_2_2_violation:FALSE] ++ SystemExit(); ++#endif ++ ++ /* Hang */ ++ // coverity[infinite_loop:FALSE] ++ while (true) ++ { ++ ; /* Intentional empty while */ ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Board timer tick */ ++/*--------------------------------------------------------------------------*/ ++void BRD_SM_TimerTick(uint32_t msec) ++{ ++ /* Kick the dog */ ++ BOARD_WdogRefresh(); ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Custom monitor function */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_Custom(int32_t argc, const char * const argv[]) ++{ ++ return SM_ERR_SUCCESS; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get fault reaction */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_FaultReactionGet(dev_sm_rst_rec_t resetRec, ++ // coverity[misra_c_2012_rule_8_13_violation:FALSE] ++ uint32_t *reaction, uint32_t *lm) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Print reaction */ ++ switch (*reaction) ++ { ++ case LMM_REACT_SYS_RESET: ++ case LMM_REACT_SYS_SHUTDOWN: ++ ; /* Intentional empty as will print elsewhere */ ++ break; ++ case LMM_REACT_GRP_RESET: ++ printf("\nReset group %u", *lm); ++ BRD_SM_ResetRecordPrint(",", resetRec); ++ break; ++ case LMM_REACT_GRP_SHUTDOWN: ++ printf("\nShutdown group %u", *lm); ++ BRD_SM_ResetRecordPrint(",", resetRec); ++ break; ++ case LMM_REACT_LM_RESET: ++ printf("\nReset LM %u", *lm); ++ BRD_SM_ResetRecordPrint(",", resetRec); ++ break; ++ case LMM_REACT_LM_SHUTDOWN: ++ printf("\nShutdown LM %u", *lm); ++ BRD_SM_ResetRecordPrint(",", resetRec); ++ break; ++ case LMM_REACT_BOARD: ++ printf("\nBoard %u", *lm); ++ BRD_SM_ResetRecordPrint(",", resetRec); ++ break; ++ case LMM_REACT_FUSA: ++ printf("\nFuSa %u", *lm); ++ BRD_SM_ResetRecordPrint(",", resetRec); ++ break; ++ case LMM_REACT_NONE: ++ ; /* Intentional empty case */ ++ break; ++ default: ++ status = SM_ERR_INVALID_PARAMETERS; ++ break; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Custom fault handler */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_CustomFault(dev_sm_rst_rec_t resetRec, uint32_t lm) ++{ ++ /* Return status */ ++ return SM_ERR_SUCCESS; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Print reset record */ ++/*--------------------------------------------------------------------------*/ ++void BRD_SM_ResetRecordPrint(string name, dev_sm_rst_rec_t resetRec) ++{ ++ if (resetRec.valid) ++ { ++ int32_t status; ++ string reasonNameAddr; ++ ++ /* Get name */ ++ status = LMM_SystemReasonNameGet(0U, resetRec.reason, ++ &reasonNameAddr, NULL); ++ ++ /* Print reason */ ++ printf("%s reason=", name); ++ if (status == SM_ERR_SUCCESS) ++ { ++ printf("%s", reasonNameAddr); ++ } ++ else ++ { ++ printf("%u", resetRec.reason); ++ } ++ if (resetRec.validErr) ++ { ++ printf(", errId=%d", (int32_t) resetRec.errId); ++ } ++ if (resetRec.validOrigin) ++ { ++ printf(", srcLm=%u", resetRec.origin); ++ } ++ printf("\n"); ++ ++ /* Print extended info */ ++ for (uint32_t ex = 0U; ex < resetRec.extLen; ex++) ++ { ++ printf(" 0x%08X\n", resetRec.extInfo[ex]); ++ } ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Load and clear persistent shutdown record of previous boot */ ++/*--------------------------------------------------------------------------*/ ++void BRD_SM_ShutdownRecordLoad(dev_sm_rst_rec_t *shutdownRec) ++{ ++#if BRD_SM_RST_REC_NUM > 0 ++ uint32_t hdr = 0U; ++ uint32_t *ePtr = &(shutdownRec->extInfo[0]); ++ ++ /* Read and clear header */ ++ (void) BBNSM_GprGetValue(BBNSM, BRD_SM_RST_REC_FIRST, &hdr); ++ (void) BBNSM_GprSetValue(BBNSM, BRD_SM_RST_REC_FIRST, 0U); ++ ++ /* Valid? */ ++ if (((hdr & BRD_SM_REC_VLD_MASK ) >> BRD_SM_REC_VLD_SHIFT) != 0U) ++ { ++ shutdownRec->valid = true; ++ ++ /* Parse header */ ++ shutdownRec->reason = (hdr & BRD_SM_REC_REASON_MASK ) >> ++ BRD_SM_REC_REASON_SHIFT; ++ shutdownRec->errId = (hdr & BRD_SM_REC_EID_MASK ) >> ++ BRD_SM_REC_EID_SHIFT; ++ shutdownRec->validErr = ((hdr & BRD_SM_REC_VERR_MASK ) != 0U); ++ shutdownRec->origin = (hdr & BRD_SM_REC_SRC_MASK ) >> ++ BRD_SM_REC_SRC_SHIFT; ++ shutdownRec->validOrigin = ((hdr & BRD_SM_REC_VSRC_MASK ) != 0U); ++ shutdownRec->extLen = (hdr & BRD_SM_REC_LEN_MASK ) >> ++ BRD_SM_REC_LEN_SHIFT; ++ ++ /* Sign extend */ ++ if ((shutdownRec->errId & BRD_SM_REC_EID_SIGN) != 0U) ++ { ++ shutdownRec->errId |= BRD_SM_REC_EID_EXT; ++ } ++ ++ shutdownRec->extLen = MIN(shutdownRec->extLen, DEV_SM_NUM_EXT_INFO); ++ } ++ ++ /* Copy out extended info */ ++ for (uint8_t idx = 1U; idx < BRD_SM_RST_REC_NUM; idx++) ++ { ++ if (idx <= shutdownRec->extLen) ++ { ++ (void) BBNSM_GprGetValue(BBNSM, idx + BRD_SM_RST_REC_FIRST, ++ ePtr); ++ ePtr++; ++ } ++ else ++ { ++ break; ++ } ++ } ++#endif ++ ++ /* PMIC reset? */ ++ if ((g_pmicFaultFlags & (PF09_XFAIL_FLG | PF09_WD_FLG ++ | PF09_HFAULT_FLG)) != 0U) ++ { ++ shutdownRec->valid = true; ++ shutdownRec->reset = true; ++ shutdownRec->reason = DEV_SM_REASON_PMIC; ++ shutdownRec->validErr = false; ++ shutdownRec->validOrigin = false; ++ shutdownRec->extLen = 1U; ++ shutdownRec->extInfo[0] = g_pmicFaultFlags; ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Save shutdown record to persistent storage */ ++/*--------------------------------------------------------------------------*/ ++void BRD_SM_ShutdownRecordSave(dev_sm_rst_rec_t shutdownRec) ++{ ++#if BRD_SM_RST_REC_NUM > 0 ++ uint32_t hdr; ++ const uint32_t *ePtr = &(shutdownRec.extInfo[0]); ++ ++ /* Store extended info */ ++ for (uint8_t idx = 1U; idx < BRD_SM_RST_REC_NUM; idx++) ++ { ++ if (idx <= shutdownRec.extLen) ++ { ++ (void) BBNSM_GprSetValue(BBNSM, idx + BRD_SM_RST_REC_FIRST, ++ *ePtr); ++ ePtr++; ++ } ++ else ++ { ++ break; ++ } ++ } ++ ++ /* Create header */ ++ hdr = BRD_SM_REC_REASON(shutdownRec.reason) ++ | BRD_SM_REC_EID(shutdownRec.errId) ++ | BRD_SM_REC_VERR(shutdownRec.validErr ? 1U : 0U) ++ | BRD_SM_REC_SRC(shutdownRec.origin) ++ | BRD_SM_REC_VSRC(shutdownRec.validOrigin ? 1U : 0U) ++ | BRD_SM_REC_LEN(shutdownRec.extLen) ++ | BRD_SM_REC_VLD(shutdownRec.valid ? 1U : 0U); ++ ++ /* Save header */ ++ (void) BBNSM_GprSetValue(BBNSM, BRD_SM_RST_REC_FIRST, hdr); ++#endif ++ ++ /* Print shutdown record */ ++ if (shutdownRec.reset) ++ { ++ BRD_SM_ResetRecordPrint("\nReset request:", shutdownRec); ++ } ++ else ++ { ++ BRD_SM_ResetRecordPrint("\nShutdown request:", shutdownRec); ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Reset board */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SystemReset(void) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ rgpio_pin_config_t gpioConfig = ++ { ++ kRGPIO_DigitalOutput, ++ 0U ++ }; ++ ++ /* Drive WDOG_ANY to reset PMIC */ ++ RGPIO_PinInit(GPIO1, 15U, &gpioConfig); ++ IOMUXC_SetPinMux(IOMUXC_PAD_WDOG_ANY__GPIO1_IO_BIT15, 0U); ++ ++ /* Wait for PMIC to react */ ++ SystemTimeDelay(1000U); ++ ++ /* Fall back to warm reset of the device */ ++ status = DEV_SM_SystemReset(); ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get PMIC info */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_PmicInfoGet(uint32_t idx, uint8_t *devAddr, uint8_t **info, ++ uint8_t *len) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Call PMIC driver to get info */ ++ switch (idx) ++ { ++ case 0U: ++ *devAddr = g_pf09Dev.devAddr; ++ if (!PF09_PmicInfoGet(&g_pf09Dev, info, len)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ break; ++ case 1U: ++ *devAddr = g_pf5301Dev.devAddr; ++ if (!PF53_PmicInfoGet(&g_pf5301Dev, info, len)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ break; ++ case 2U: ++ *devAddr = g_pf5302Dev.devAddr; ++ if (!PF53_PmicInfoGet(&g_pf5302Dev, info, len)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ break; ++ default: ++ status = SM_ERR_NOT_FOUND; ++ break; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* PMIC register write */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_PmicWrite(uint8_t devAddr, uint8_t regAddr, uint8_t val, ++ uint8_t mask) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Call PF09 driver write data */ ++ if (devAddr == g_pf09Dev.devAddr) ++ { ++ if (!PF09_PmicWrite(&g_pf09Dev, regAddr, val, mask)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ /* Call PF5301 driver write data */ ++ else if (devAddr == g_pf5301Dev.devAddr) ++ { ++ if (!PF53_PmicWrite(&g_pf5301Dev, regAddr, val, mask)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ /* Call PF5302 driver write data */ ++ else if (devAddr == g_pf5302Dev.devAddr) ++ { ++ if (!PF53_PmicWrite(&g_pf5302Dev, regAddr, val, mask)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ /* Invalid device address */ ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* PMIC register read */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_PmicRead(uint8_t devAddr, uint8_t regAddr, uint8_t *val) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Call PF09 driver read data */ ++ if (devAddr == g_pf09Dev.devAddr) ++ { ++ if (!PF09_PmicRead(&g_pf09Dev, regAddr, val)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ /* Call PF5301 driver read data */ ++ else if (devAddr == g_pf5301Dev.devAddr) ++ { ++ if (!PF53_PmicRead(&g_pf5301Dev, regAddr, val)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ /* Call PF5302 driver read data */ ++ else if (devAddr == g_pf5302Dev.devAddr) ++ { ++ if (!PF53_PmicRead(&g_pf5302Dev, regAddr, val)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ /* Invalid device address */ ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Set mode of specified SoC supply */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SupplyModeSet(uint32_t domain, uint8_t voltMode) ++{ ++ /* Set voltage mode */ ++ return BRD_SM_VoltageModeSet(domain, voltMode); ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get mode of specified SoC supply */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SupplyModeGet(uint32_t domain, uint8_t *voltMode) ++{ ++ /* Get voltage mode */ ++ return BRD_SM_VoltageModeGet(domain, voltMode); ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Set voltage of specified SoC supply */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SupplyLevelSet(uint32_t domain, int32_t microVolt) ++{ ++ int32_t status = SM_ERR_INVALID_PARAMETERS; ++ ++ /* Check for wrap */ ++ if (microVolt <= (INT32_MAX - BOARD_PERF_VDROP)) ++ { ++ /* Set voltage level */ ++ status = BRD_SM_VoltageLevelSet(domain, microVolt ++ + BOARD_PERF_VDROP); ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get voltage of specified SoC supply */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SupplyLevelGet(uint32_t domain, int32_t *microVolt) ++{ ++ /* Get voltage level */ ++ return BRD_SM_VoltageLevelGet(domain, microVolt); ++} ++ ++/*==========================================================================*/ ++ ++/*--------------------------------------------------------------------------*/ ++/* Complete init after DEV_SM init */ ++/*--------------------------------------------------------------------------*/ ++static int32_t BRD_SM_InitComplete(uint32_t mSel) ++{ ++ /* Safe to call DEV_SM functions to init hardware. For example, to ++ enabled a power domain, configure a clock SSC, clock rate, or pin. ++ Not safe to call LMM functions! */ ++ ++ return SM_ERR_SUCCESS; ++} ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm.dox b/boards/ccimx95dvk/sm/brd_sm.dox +new file mode 100755 +index 000000000000..b7b0c14b322e +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm.dox +@@ -0,0 +1,55 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*! ++ * @addtogroup BRD_SM ++ * @{ ++ */ ++ ++/*! ++ ++@defgroup BRD_SM_MX95EVK BOARD_MX95EVK: i.MX95 EVK SM Implementation ++ ++@brief Module for the i.MX95 EVK for the SM. ++ ++Board Module ++============ ++ ++This port supports i.MX95 on both the LPDDR4X and LPDDR5 EVKs. See ++the @ref PORT_MX95_EVK section for more information. ++ ++*/ ++ ++/** @} */ ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm.h b/boards/ccimx95dvk/sm/brd_sm.h +new file mode 100755 +index 000000000000..ce758e1e4c64 +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm.h +@@ -0,0 +1,100 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2024 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++#ifndef BRD_SM_H ++#define BRD_SM_H ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup BRD_SM_MX95EVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing the API for the SM abstraction of the board. ++ */ ++/*==========================================================================*/ ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "brd_sm_handlers.h" ++#include "brd_sm_control.h" ++#include "brd_sm_sensor.h" ++#include "brd_sm_voltage.h" ++#include "brd_sm_bbm.h" ++#include "board.h" ++#include "brd_sm_api.h" ++ ++/* Defines */ ++ ++/*! Board name string */ ++#define BRD_SM_NAME "i.MX95 EVK" ++ ++/*! Board attributes */ ++#define BRD_SM_ATTR 0x0 ++ ++/*! Perf voltage drop */ ++#define BOARD_PERF_VDROP 20000 ++ ++/*! ++ * @name Board redirection defines ++ * @{ ++ */ ++#define SM_SYSTEMRESET BRD_SM_SystemReset /*!< Reset */ ++/** @} */ ++ ++/* Types */ ++ ++/* External variables */ ++ ++/* Functions */ ++ ++/*! ++ * Reset the system. ++ * ++ * Redirect to just spin. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_SUCCESS ++ */ ++int32_t BRD_SM_SystemReset(void); ++ ++/** @} */ ++ ++#endif /* BRD_SM_H */ ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm_bbm.c b/boards/ccimx95dvk/sm/brd_sm_bbm.c +new file mode 100755 +index 000000000000..c2e5cd61dc9f +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm_bbm.c +@@ -0,0 +1,674 @@ ++/* ++** ################################################################### ++** ++** Copyright 2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/* File containing the implementation of the PCA2131 RTC. */ ++/*==========================================================================*/ ++ ++/* Note this code is an example. The conversion functions between date and ++ seconds have not been fully tested to match The PCA2131 and calling ++ agents. */ ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "brd_sm.h" ++#include "lmm.h" ++ ++/* Local defines */ ++ ++/* Local types */ ++ ++/* Local variables */ ++ ++/* Local functions */ ++ ++static bool days2date(uint32_t days, uint32_t *year, uint32_t *month, ++ uint32_t *day, uint32_t *weekday); ++static void date2days(uint32_t year, uint32_t month, uint32_t day, ++ uint32_t *days); ++ ++/*--------------------------------------------------------------------------*/ ++/* Write RTC raw data */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_BbmRtcWrite(uint32_t addr, uint32_t numVal, ++ const uint32_t *val) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check read size */ ++ if (numVal > 24U) ++ { ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ else ++ { ++ uint8_t buf[24]; ++ ++ /* Copy buffer (convert to 8-bit) */ ++ for (uint32_t idx = 0U; idx < numVal; idx++) ++ { ++ buf[idx] = U32_U8(val[idx]); ++ } ++ ++ /* Write data */ ++ if (!PCA2131_RtcWrite(&g_pca2131Dev, U32_U8(addr), ++ U32_U8(numVal), buf)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Read RTC raw data */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_BbmRtcRead(uint32_t addr, uint32_t numVal, uint32_t *val) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check read size */ ++ if (numVal > 24U) ++ { ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ else ++ { ++ uint8_t buf[24] = { 0 }; ++ ++ /* Read data */ ++ if (PCA2131_RtcRead(&g_pca2131Dev, U32_U8(addr), ++ U32_U8(numVal), buf)) ++ { ++ /* Copy buffer (convert to 32-bit) */ ++ for (uint32_t idx = 0U; idx < numVal; idx++) ++ { ++ val[idx] = (uint32_t) buf[idx]; ++ } ++ } ++ else ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Return RTC name */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_BbmRtcNameGet(uint32_t rtcId, string *rtcNameAddr, ++ int32_t *len) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ static int32_t s_maxLen = 0; ++ ++ static string const s_name[BRD_SM_NUM_RTC] = ++ { ++ "pca2131" ++ }; ++ ++ /* Get max string width */ ++ DEV_SM_MaxStringGet(len, &s_maxLen, s_name, BRD_SM_NUM_RTC); ++ ++ if (rtcId < DEV_SM_NUM_RTC) ++ { ++ status = DEV_SM_BbmRtcNameGet(rtcId, rtcNameAddr, len); ++ } ++ else ++ { ++ /* Return pointer to name */ ++ *rtcNameAddr = s_name[rtcId - DEV_SM_NUM_RTC]; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Return RTC info */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_BbmRtcDescribe(uint32_t rtcId, uint32_t *secWidth, ++ uint32_t *tickWidth, uint32_t *ticksPerSec) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ if (rtcId < DEV_SM_NUM_RTC) ++ { ++ status = DEV_SM_BbmRtcDescribe(rtcId, secWidth, tickWidth, ++ ticksPerSec); ++ } ++ else ++ { ++ /* Return RTC info */ ++ *secWidth = 32U; ++ *tickWidth = 39U; ++ *ticksPerSec = 100U; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Set RTC time */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_BbmRtcTimeSet(uint32_t rtcId, uint64_t val, bool ticks) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ if (rtcId < DEV_SM_NUM_RTC) ++ { ++ status = DEV_SM_BbmRtcTimeSet(rtcId, val, ticks); ++ } ++ else ++ { ++ uint32_t year, month, day, hour, min, sec, hun, weekday; ++ uint32_t days, hours, mins, secs; ++ ++ /* Convert to hundredths of seconds */ ++ if (ticks) ++ { ++ uint64_t sec64, hun64; ++ ++ sec64 = val / 100U; ++ hun64 = val - (sec64 * 100U); ++ ++ secs = U64_U32(sec64); ++ hun = U64_U32(hun64); ++ } ++ else ++ { ++ hun = 0U; ++ secs = U64_U32(val); ++ } ++ ++ /* Calculate totals */ ++ mins = secs / 60U; ++ hours = secs / 3600U; ++ days = secs / 86400U; ++ ++ /* Calculate time */ ++ sec = secs % 60U; ++ min = mins % 60U; ++ hour = hours % 24U; ++ ++ /* Convert to date */ ++ if (days2date(days, &year, &month, &day, &weekday) ++ && (year <= 2069U)) ++ { ++ /* Convert year */ ++ year %= 100U; ++ ++ /* Write RTC */ ++ if (!PCA2131_RtcSet(&g_pca2131Dev, year, month, day, hour, ++ min, sec, hun, weekday)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ else ++ { ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ } ++ ++ if (status == SM_ERR_SUCCESS) ++ { ++ /* Enable battery */ ++ (void) PCA2131_PowerModeSet(&g_pca2131Dev, 0U); ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get RTC time */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_BbmRtcTimeGet(uint32_t rtcId, uint64_t *val, bool ticks) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ if (rtcId < DEV_SM_NUM_RTC) ++ { ++ status = DEV_SM_BbmRtcTimeGet(rtcId, val, ticks); ++ } ++ else ++ { ++ uint32_t year, month, day, hour, min, sec, hun, weekday; ++ ++ /* Read RTC */ ++ if (PCA2131_RtcGet(&g_pca2131Dev, &year, &month, &day, &hour, &min, ++ &sec, &hun, &weekday)) ++ { ++ uint32_t days, secs; ++ ++ /* Convert year */ ++ if (year >= 70U) ++ { ++ year = year + 1900U; ++ } ++ else ++ { ++ year = year + 2000U; ++ } ++ ++ /* Convert to days */ ++ date2days(year, month, day, &days); ++ ++ /* Calculate seconds */ ++ secs = sec + (min * 60U) + (hour * 3600U); ++ secs += (days * 86400U); ++ ++ /* Check time format */ ++ if (ticks) ++ { ++ *val = (((uint64_t) secs) * 100U) + hun; ++ } ++ else ++ { ++ *val = ((uint64_t) secs); ++ } ++ } ++ else ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get BBM RTC state */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_BbmRtcStateGet(uint32_t rtcId, uint32_t *state) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ if (rtcId < DEV_SM_NUM_RTC) ++ { ++ status = DEV_SM_BbmRtcStateGet(rtcId, state); ++ } ++ else ++ { ++ bool st; ++ ++ /* Default state */ ++ *state = 0U; ++ ++ /* Enable battery */ ++ (void) PCA2131_PowerModeSet(&g_pca2131Dev, 0U); ++ ++ /* Get battery state */ ++ if (PCA2131_TimeStatusGet(&g_pca2131Dev, &st)) ++ { ++ if (st) ++ { ++ *state |= LMM_BBM_STATE_RESET; ++ } ++ } ++ else ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ ++ /* Get battery state */ ++ if (PCA2131_BattStatusGet(&g_pca2131Dev, &st)) ++ { ++ if (st) ++ { ++ *state |= LMM_BBM_STATE_BATT_LOW; ++ } ++ } ++ else ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Set RTC alarm */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_BbmRtcAlarmSet(uint32_t rtcId, bool enable, uint64_t val) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ if (rtcId < DEV_SM_NUM_RTC) ++ { ++ status = DEV_SM_BbmRtcAlarmSet(rtcId, enable, val); ++ } ++ else ++ { ++ /* Enable? */ ++ if (enable) ++ { ++ uint32_t year, month, day, hour, min, sec, weekday; ++ uint32_t days, hours, mins, secs; ++ ++ /* Convert to seconds */ ++ secs = U64_U32(val); ++ ++ /* Calculate totals */ ++ mins = secs / 60U; ++ hours = secs / 3600U; ++ days = secs / 86400U; ++ ++ /* Calculate time */ ++ sec = secs % 60U; ++ min = mins % 60U; ++ hour = hours % 24U; ++ ++ /* Convert to date */ ++ if (days2date(days, &year, &month, &day, &weekday) ++ && (year <= 2069U)) ++ { ++ /* Convert year */ ++ year %= 100U; ++ ++ /* Write to RTC */ ++ if (PCA2131_AlarmSet(&g_pca2131Dev, day, hour, min, sec, ++ weekday)) ++ { ++ /* Enable interrupt */ ++ if (PCA2131_IntEnable(&g_pca2131Dev, true)) ++ { ++ /* Enable bus expander interrupt */ ++ status = BRD_SM_BusExpMaskSet(0U, BIT8(6)); ++ } ++ else ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ } ++ else ++ { ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ ++ /* Track if enabled for PCA2131 use */ ++ if (status == SM_ERR_SUCCESS) ++ { ++ g_pca2131Used = true; ++ } ++ } ++ else ++ { ++ /* Disable interrupt */ ++ if (PCA2131_IntEnable(&g_pca2131Dev, false)) ++ { ++ /* Disable bus expander interrupt */ ++ status = BRD_SM_BusExpMaskSet(BIT8(6), BIT8(6)); ++ } ++ else ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* PCA2131 interrupt handler */ ++/*--------------------------------------------------------------------------*/ ++void BRD_SM_BbmHandler(void) ++{ ++ /* Handle alarm */ ++ LMM_BbmRtcAlarmEvent(BRD_SM_RTC_PCA2131); ++ ++ /* Clear status flags */ ++ (void) PCA2131_IntClear(&g_pca2131Dev); ++} ++ ++/*==========================================================================*/ ++ ++/*--------------------------------------------------------------------------*/ ++/* Convert days since 1-1-1970 to date/time */ ++/*--------------------------------------------------------------------------*/ ++static bool days2date(uint32_t days, uint32_t *year, uint32_t *month, ++ uint32_t *day, uint32_t *weekday) ++{ ++ bool rc = true; ++ uint32_t newDays = 0U; ++ uint32_t era = 0U; ++ uint32_t doe = 0U; ++ uint32_t yoe = 0U; ++ uint32_t doy = 0U; ++ uint32_t moy = 0U; ++ ++ /* Check days value doesn't wrap */ ++ if (days <= (UINT32_MAX - 719468U)) ++ { ++ /* Adjust to 1-1-1970) */ ++ newDays = days + 719468U; ++ } ++ else ++ { ++ /* Set the return code incase value wraps */ ++ rc = false; ++ } ++ ++ if (rc) ++ { ++ /* Calculate the era */ ++ era = newDays / 146097U; ++ ++ /* Check the expression doesn't wrap due to negative value */ ++ if (newDays >= (era * 146097U)) ++ { ++ /* Calculate the day in the era */ ++ doe = newDays - (era * 146097U); ++ } ++ else ++ { ++ /* Set the return code if the expression value wraps */ ++ rc = false; ++ } ++ } ++ ++ if (rc) ++ { ++ /* Check the expression doesn't wrap due to negative value */ ++ if (doe >= (doe / 1460U)) ++ { ++ /* Calculate the year of era */ ++ yoe = (doe - (doe / 1460U) + (doe / 36524U)); ++ ++ /* Check the expression doesn't wrap due to negative value */ ++ if (yoe >= (doe / 146096U)) ++ { ++ yoe -= (doe / 146096U); ++ yoe /= 365U; ++ } ++ else ++ { ++ /* Set the return code if the expression value wraps */ ++ rc = false; ++ } ++ } ++ else ++ { ++ /* Set the return code if the expression value wraps */ ++ rc = false; ++ } ++ } ++ ++ if (rc) ++ { ++ /* Check the expression doesn't wrap due to negative value */ ++ if (yoe <= (UINT32_MAX - (era * 400U))) ++ { ++ /* Calculate year */ ++ *year = yoe + (era * 400U); ++ } ++ else ++ { ++ /* Set the return code if the expression value wraps */ ++ rc = false; ++ } ++ } ++ ++ if (rc) ++ { ++ /* Check the expression doesn't wrap due to negative value */ ++ if (doe >= (365U * yoe)) ++ { ++ /* Calculate day of the year */ ++ doy = doe - (365U * yoe); ++ ++ /* Check the expression doesn't wrap due to negative value */ ++ if (doy >= (yoe / 4U)) ++ { ++ doy -= (yoe / 4U); ++ doy += (yoe / 100U); ++ } ++ else ++ { ++ /* Set the return code if the expression value wraps */ ++ rc = false; ++ } ++ } ++ else ++ { ++ /* Set the return code if the expression value wraps */ ++ rc = false; ++ } ++ } ++ ++ if (rc) ++ { ++ /* Check the expression doesn't wrap due to negative value */ ++ if (doy <= (UINT32_MAX / 5U)) ++ { ++ /* Calculate month of year */ ++ moy = ((5U * doy) + 2U) / 153U; ++ } ++ else ++ { ++ /* Set the return code if the expression value wraps */ ++ rc = false; ++ } ++ } ++ ++ ++ if (rc) ++ { ++ /* Check the expression doesn't wrap due to negative value */ ++ if (moy <= ((UINT32_MAX - 2U) / 153U)) ++ { ++ /* Calculate day */ ++ *day = (((153U * moy) + 2U) / 5U) - 1U; ++ if (doy >= *day) ++ { ++ *day = doy - *day; ++ } ++ else ++ { ++ /* Set the return code if the expression value wraps */ ++ rc = false; ++ } ++ } ++ else ++ { ++ /* Set the return code if the expression value wraps */ ++ rc = false; ++ } ++ } ++ ++ if (rc) ++ { ++ /* Calculate month */ ++ *month= (moy < 10U) ? (moy + 3U) : (moy - 9U); ++ ++ /* Calculate day of the week */ ++ *weekday = (days + 4U) % 7U; ++ ++ /* Adjust year */ ++ *year += (*month <= 2U) ? 1U : 0U; ++ } ++ ++ /* Return code */ ++ return rc; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Convert date/time to days since 1-1-1970 */ ++/*--------------------------------------------------------------------------*/ ++static void date2days(uint32_t year, uint32_t month, uint32_t day, ++ uint32_t *days) ++{ ++ uint32_t newYear; ++ uint32_t era; ++ uint32_t doe; ++ uint32_t yoe; ++ uint32_t doy; ++ uint32_t moy; ++ ++ /* Adjust year */ ++ newYear = year - ((month <= 2U) ? 1U : 0U); ++ ++ /* Calculate era */ ++ era = newYear / 400U; ++ ++ /* Calculate the year of era */ ++ yoe = newYear - (era * 400U); ++ ++ /* Calculate month of year */ ++ moy = (month > 2U) ? (month - 3U) : (month + 9U); ++ ++ /* Calculate day of the year */ ++ doy = (((153U * moy) + 2U) / 5U) + (day - 1U); ++ ++ /* Calculate the day in the era */ ++ doe = (yoe * 365U) + (yoe / 4U) - (yoe / 100U) + doy; ++ ++ /* Calculate days */ ++ *days = (era * 146097U) + doe - 719468U; ++} ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm_bbm.h b/boards/ccimx95dvk/sm/brd_sm_bbm.h +new file mode 100755 +index 000000000000..a96a8e1cc901 +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm_bbm.h +@@ -0,0 +1,242 @@ ++/* ++** ################################################################### ++** ++** Copyright 2024 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup BRD_SM_MX95EVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing the SM API for the board PCA2131. ++ */ ++/*==========================================================================*/ ++ ++#ifndef BRD_SM_BBM_H ++#define BRD_SM_BBM_H ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "dev_sm.h" ++#include "fsl_pca2131.h" ++ ++/* Defines */ ++ ++/*! ++ * @name Board redirection defines ++ * @{ ++ */ ++#define SM_BBMRTCNAMEGET BRD_SM_BbmRtcNameGet /*!< RTC name */ ++#define SM_BBMRTCDESCRIBE BRD_SM_BbmRtcDescribe /*!< RTC describe */ ++#define SM_BBMRTCTIMESET BRD_SM_BbmRtcTimeSet /*!< RTC time set */ ++#define SM_BBMRTCTIMEGET BRD_SM_BbmRtcTimeGet /*!< RTC time get */ ++#define SM_BBMRTCSTATEGET BRD_SM_BbmRtcStateGet /*!< RTC state get */ ++#define SM_BBMRTCALARMSET BRD_SM_BbmRtcAlarmSet /*!< RTC alarm set */ ++/** @} */ ++ ++/*! Number of board RTC */ ++#define BRD_SM_NUM_RTC 1UL ++ ++/*! Total number of RTC */ ++#define SM_NUM_RTC (DEV_SM_NUM_RTC + BRD_SM_NUM_RTC) ++ ++/*! ++ * @name BRD_SM bbm domain indexes ++ */ ++/** @{ */ ++#define BRD_SM_RTC_PCA2131 (BRD_SM_NUM_RTC + 0U) /*!< PCA2131 RTC */ ++/** @} */ ++ ++/* Types */ ++ ++/* Functions */ ++ ++/*! ++ * @name Board sensor functions ++ * @{ ++ */ ++ ++/*! ++ * Read raw byte data from the RTC. ++ * ++ * @param[in] addr I2C address to read ++ * @param[in] numVal Number of bytes to read ++ * @param[out] val Return pointer for data ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_INVALID_PARAMETERS: if \a numVal is invalid. ++ * - ::SM_ERR_HARDWARE_ERROR: if I2C transfer fails. ++ */ ++int32_t BRD_SM_BbmRtcWrite(uint32_t addr, uint32_t numVal, ++ const uint32_t *val); ++ ++/*! ++ * Write raw byte data to the RTC. ++ * ++ * @param[in] addr I2C address to write ++ * @param[in] numVal Number of bytes to write ++ * @param[in] val Pointer to data ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_INVALID_PARAMETERS: if \a numVal is invalid. ++ * - ::SM_ERR_HARDWARE_ERROR: if I2C transfer fails. ++ */ ++int32_t BRD_SM_BbmRtcRead(uint32_t addr, uint32_t numVal, uint32_t *val); ++ ++/*! ++ * Get a board RTC name. ++ * ++ * @param[in] rtcId RTC name to get ++ * @param[out] rtcNameAddr Return pointer to name ++ * @param[out] len Return max length of all RTC names ++ * ++ * This function allows the caller to get the name of an RTC. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a rtcId is invalid. ++ */ ++int32_t BRD_SM_BbmRtcNameGet(uint32_t rtcId, string *rtcNameAddr, ++ int32_t *len); ++ ++/*! ++ * Get a board RTC description. ++ * ++ * @param[in] rtcId RTC description to get ++ * @param[out] secWidth Return pointer to seconds width ++ * @param[out] tickWidth Return pointer to tick width ++ * @param[out] ticksPerSec Return pointer to ticks per second ++ * ++ * This function allows the caller to get the description of an RTC. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a rtcId is invalid. ++ */ ++int32_t BRD_SM_BbmRtcDescribe(uint32_t rtcId, uint32_t *secWidth, ++ uint32_t *tickWidth, uint32_t *ticksPerSec); ++ ++/*! ++ * Set a board RTC time. ++ * ++ * @param[in] rtcId Identifier of the RTC ++ * @param[in] val Time in seconds/ticks to write to the RTC ++ * @param[in] ticks true = ticks, false = seconds ++ * ++ * This function allows a caller to set the RTC time. Time can be set in units ++ * of ticks or seconds. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_SUCCESS: if the RTC time was successfully set. ++ * - ::SM_ERR_NOT_FOUND: if \a rtcId pertains to a non-existent RTC. ++ * - ::SM_ERR_INVALID_PARAMETERS: if the time is not valid (beyond the ++ * range of the RTC). ++ */ ++int32_t BRD_SM_BbmRtcTimeSet(uint32_t rtcId, uint64_t val, bool ticks); ++ ++/*! ++ * Get a board RTC time. ++ * ++ * @param[in] rtcId Identifier of the RTC ++ * @param[out] val Time in seconds/ticks read from the RTC ++ * @param[in] ticks true = ticks, false = seconds ++ * ++ * This function allows a caller to read the RTC time. Time can be read in ++ * units of ticks or seconds. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_SUCCESS: if the RTC time was successfully read. ++ * - ::SM_ERR_NOT_FOUND: if \a rtcId pertains to a non-existent RTC. ++ */ ++int32_t BRD_SM_BbmRtcTimeGet(uint32_t rtcId, uint64_t *val, bool ticks); ++ ++/*! ++ * Get a board RTC state. ++ * ++ * @param[in] rtcId Identifier of the RTC ++ * @param[out] state Bit mask of state flags ++ * ++ * This function allows a caller to read the RTC state. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_SUCCESS: if the RTC state was successfully read. ++ * - ::SM_ERR_NOT_FOUND: if \a rtcId pertains to a non-existent RTC. ++ */ ++int32_t BRD_SM_BbmRtcStateGet(uint32_t rtcId, uint32_t *state); ++ ++/*! ++ * Set a board RTC alarm. ++ * ++ * @param[in] rtcId Identifier of the RTC ++ * @param[in] enable Enable flag (1=enabled, 0=disabled) ++ * @param[in] val Alarm time in seconds to write to the RTC ++ * ++ * This function allows a caller to enable/disable and set the time for the RTC ++ * alarm. The alarm can be set in seconds only. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_SUCCESS: if the alarm was successfully set. ++ * - ::SM_ERR_NOT_FOUND: if \a rtcId pertains to a non-existent RTC. ++ * - ::SM_ERR_INVALID_PARAMETERS: if the time is not valid (beyond the ++ * range of the RTC alarm). ++ */ ++int32_t BRD_SM_BbmRtcAlarmSet(uint32_t rtcId, bool enable, uint64_t val); ++ ++/*! ++ * Handle PCA2131 interrupt. ++ */ ++void BRD_SM_BbmHandler(void); ++ ++/** @} */ ++ ++#endif /* BRD_SM_BBM_H */ ++ ++/** @} */ ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm_control.c b/boards/ccimx95dvk/sm/brd_sm_control.c +new file mode 100755 +index 000000000000..5b36c66c593c +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm_control.c +@@ -0,0 +1,317 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2024 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/* File containing the implementation of the board controls. */ ++/*==========================================================================*/ ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "brd_sm.h" ++#include "lmm.h" ++ ++/* Local defines */ ++ ++/* PCAL6408A input signals */ ++#define PCAL6408A_INPUT_SD3_WAKE 0U ++#define PCAL6408A_INPUT_PCIE1_WAKE 4U ++#define PCAL6408A_INPUT_BT_WAKE 5U ++#define PCAL6408A_INPUT_PCIE2_WAKE 6U ++#define PCAL6408A_INPUT_BUTTON 7U ++ ++/* Local types */ ++ ++/* Local variables */ ++ ++/*--------------------------------------------------------------------------*/ ++/* Set a control value */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_ControlSet(uint32_t ctrlId, uint32_t numVal, ++ const uint32_t *val) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check to see if ctrlId is within bounds*/ ++ if (ctrlId < SM_NUM_CTRL) ++ { ++ /* Check if device or board */ ++ if (ctrlId < DEV_SM_NUM_CTRL) ++ { ++ status = DEV_SM_ControlSet(ctrlId, numVal, val); ++ } ++ else if (ctrlId == BRD_SM_CTRL_PCA2131) ++ { ++ status = SM_ERR_NOT_SUPPORTED; ++ } ++ else if (ctrlId == BRD_SM_CTRL_TEST) ++ { ++ /* Test response to an reported SM error */ ++ SM_Error(SM_ERR_GENERIC_ERROR); ++ } ++ else ++ { ++ status = SM_ERR_NOT_SUPPORTED; ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get a control value */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_ControlGet(uint32_t ctrlId, uint32_t *numRtn, uint32_t *rtn) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check to see if ctrlId is within bounds*/ ++ if (ctrlId < SM_NUM_CTRL) ++ { ++ /* Check if device or board */ ++ if (ctrlId < DEV_SM_NUM_CTRL) ++ { ++ status = DEV_SM_ControlGet(ctrlId, numRtn, rtn); ++ } ++ else if ((ctrlId == BRD_SM_CTRL_PCA2131) ++ || (ctrlId == BRD_SM_CTRL_TEST)) ++ { ++ *numRtn = 0U; ++ status = SM_ERR_NOT_SUPPORTED; ++ } ++ else ++ { ++ uint8_t data; ++ ++ /* Read expander data input */ ++ if (PCAL6408A_InputGet(&g_pcal6408aDev, &data)) ++ { ++ uint32_t shift = ctrlId - DEV_SM_NUM_CTRL; ++ ++ /* Adjust bit position */ ++ if (shift > 0U) ++ { ++ shift += 3U; ++ } ++ ++ *numRtn = 1U; ++ rtn[0] = (((uint32_t) data) >> shift) & 0x1UL; ++ } ++ else ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ } ++ else ++ { ++ *numRtn = 0U; ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Set an extended control value */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_ControlExtSet(uint32_t ctrlId, uint32_t addr, ++ uint32_t numVal, const uint32_t *val) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check to see if ctrlId is within bounds*/ ++ if (ctrlId < SM_NUM_CTRL) ++ { ++ /* Check if device or board */ ++ if (ctrlId < DEV_SM_NUM_CTRL) ++ { ++ status = DEV_SM_ControlExtSet(ctrlId, addr, numVal, val); ++ } ++ else if (ctrlId == BRD_SM_CTRL_PCA2131) ++ { ++ status = BRD_SM_BbmRtcWrite(addr, numVal, val); ++ } ++ else ++ { ++ status = SM_ERR_NOT_SUPPORTED; ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get an extended control value */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_ControlExtGet(uint32_t ctrlId, uint32_t addr, ++ uint32_t numRtn, uint32_t *rtn) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check to see if ctrlId is within bounds*/ ++ if (ctrlId < SM_NUM_CTRL) ++ { ++ /* Check if device or board */ ++ if (ctrlId < DEV_SM_NUM_CTRL) ++ { ++ status = DEV_SM_ControlExtGet(ctrlId, addr, numRtn, rtn); ++ } ++ else if (ctrlId == BRD_SM_CTRL_PCA2131) ++ { ++ status = BRD_SM_BbmRtcRead(addr, numRtn, rtn); ++ } ++ else ++ { ++ status = SM_ERR_NOT_SUPPORTED; ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Configure notification flags */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_ControlFlagsSet(uint32_t ctrlId, uint32_t flags) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check if device or board */ ++ if (ctrlId < DEV_SM_NUM_CTRL) ++ { ++ status = DEV_SM_ControlFlagsSet(ctrlId, flags); ++ } ++ else ++ { ++ uint8_t mask; ++ uint32_t val; ++ uint32_t enb = (flags != 0U) ? 0U : 1U; ++ ++ switch (ctrlId) ++ { ++ case BRD_SM_CTRL_SD3_WAKE: ++ mask = BIT8(PCAL6408A_INPUT_SD3_WAKE); ++ val = (enb & 0x1U) << PCAL6408A_INPUT_SD3_WAKE; ++ break; ++ case BRD_SM_CTRL_PCIE1_WAKE: ++ mask = BIT8(PCAL6408A_INPUT_PCIE1_WAKE); ++ val = (enb & 0x1U) << PCAL6408A_INPUT_PCIE1_WAKE; ++ break; ++ case BRD_SM_CTRL_BT_WAKE: ++ mask = BIT8(PCAL6408A_INPUT_BT_WAKE); ++ val = (enb & 0x1U) << PCAL6408A_INPUT_BT_WAKE; ++ break; ++ case BRD_SM_CTRL_PCIE2_WAKE: ++ mask = BIT8(PCAL6408A_INPUT_PCIE2_WAKE); ++ val = (enb & 0x1U) << PCAL6408A_INPUT_PCIE2_WAKE; ++ break; ++ case BRD_SM_CTRL_BUTTON: ++ mask = BIT8(PCAL6408A_INPUT_BUTTON); ++ val = (enb & 0x1U) << PCAL6408A_INPUT_BUTTON; ++ break; ++ default: ++ status = SM_ERR_NOT_FOUND; ++ break; ++ } ++ ++ if (status == SM_ERR_SUCCESS) ++ { ++ status = BRD_SM_BusExpMaskSet((uint8_t) val, mask); ++ } ++ } ++ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Control handler */ ++/*--------------------------------------------------------------------------*/ ++void BRD_SM_ControlHandler(uint8_t status, uint8_t val) ++{ ++ uint32_t data = (uint32_t) val; ++ ++ /* Handle SD3 wake */ ++ if ((status & BIT8(PCAL6408A_INPUT_SD3_WAKE)) != 0U) ++ { ++ LMM_MiscControlEvent(BRD_SM_CTRL_SD3_WAKE, ++ ((data >> PCAL6408A_INPUT_SD3_WAKE) & 0x1U) + 1U); ++ } ++ ++ /* Handle PCIe1 wake */ ++ if ((status & BIT8(PCAL6408A_INPUT_PCIE1_WAKE)) != 0U) ++ { ++ LMM_MiscControlEvent(BRD_SM_CTRL_PCIE1_WAKE, ++ ((data >> PCAL6408A_INPUT_PCIE1_WAKE) & 0x1U) + 1U); ++ } ++ ++ /* Handle BT wake */ ++ if ((status & BIT8(PCAL6408A_INPUT_BT_WAKE)) != 0U) ++ { ++ LMM_MiscControlEvent(BRD_SM_CTRL_BT_WAKE, ++ ((data >> PCAL6408A_INPUT_BT_WAKE) & 0x1U) + 1U); ++ } ++ ++ /* Handle PCIe2 wake */ ++ if (((status & BIT8(PCAL6408A_INPUT_PCIE2_WAKE)) != 0U) ++ && !g_pca2131Used) ++ { ++ LMM_MiscControlEvent(BRD_SM_CTRL_PCIE2_WAKE, ++ ((data >> PCAL6408A_INPUT_PCIE2_WAKE) & 0x1U) + 1U); ++ } ++ ++ /* Handle button */ ++ if ((status & BIT8(PCAL6408A_INPUT_BUTTON)) != 0U) ++ { ++ LMM_MiscControlEvent(BRD_SM_CTRL_BUTTON, ++ ((data >> PCAL6408A_INPUT_BUTTON) & 0x1U) + 1U); ++ } ++} ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm_control.h b/boards/ccimx95dvk/sm/brd_sm_control.h +new file mode 100755 +index 000000000000..bf893782e1d7 +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm_control.h +@@ -0,0 +1,202 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2024 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup BRD_SM_MX95EVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing the SM API for the board controls. ++ */ ++/*==========================================================================*/ ++ ++#ifndef BRD_SM_CONTROL_H ++#define BRD_SM_CONTROL_H ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "dev_sm.h" ++ ++/* Defines */ ++ ++/*! ++ * @name Board redirection defines ++ * @{ ++ */ ++#define SM_CONTROLSET BRD_SM_ControlSet /*!< Control set */ ++#define SM_CONTROLGET BRD_SM_ControlGet /*!< Control get */ ++#define SM_CONTROLEXTSET BRD_SM_ControlExtSet /*!< Extended control set */ ++#define SM_CONTROLEXTGET BRD_SM_ControlExtGet /*!< Extended control get */ ++#define SM_CONTROLFLAGSSET BRD_SM_ControlFlagsSet /*!< Control flags */ ++/** @} */ ++ ++/*! Number of board controls */ ++#define BRD_SM_NUM_CTRL 7UL ++ ++/*! Total number of controls */ ++#define SM_NUM_CTRL (DEV_SM_NUM_CTRL + BRD_SM_NUM_CTRL) ++ ++/*! ++ * @name BRD_SM control domain indexes ++ */ ++/** @{ */ ++#define BRD_SM_CTRL_SD3_WAKE (DEV_SM_NUM_CTRL + 0U) /*!< PCAL6408A-0 */ ++#define BRD_SM_CTRL_PCIE1_WAKE (DEV_SM_NUM_CTRL + 1U) /*!< PCAL6408A-4 */ ++#define BRD_SM_CTRL_BT_WAKE (DEV_SM_NUM_CTRL + 2U) /*!< PCAL6408A-5 */ ++#define BRD_SM_CTRL_PCIE2_WAKE (DEV_SM_NUM_CTRL + 3U) /*!< PCAL6408A-6 */ ++#define BRD_SM_CTRL_BUTTON (DEV_SM_NUM_CTRL + 4U) /*!< PCAL6408A-7 */ ++#define BRD_SM_CTRL_TEST (DEV_SM_NUM_CTRL + 5U) /*!< Test */ ++#define BRD_SM_CTRL_PCA2131 (DEV_SM_NUM_CTRL + 6U) /*!< PCA2131 raw access */ ++/** @} */ ++ ++/* Types */ ++ ++/* Functions */ ++ ++/*! ++ * @name Board control functions ++ * @{ ++ */ ++ ++/*! ++ * Set a board control value. ++ * ++ * @param[in] ctrlId Index of control to write ++ * @param[in] numVal Number of array elements ++ * @param[in] val Pointer to array of values to set ++ * ++ * This function allows a caller to write an array of values for ++ * a control. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if ctrlId is not valid. ++ */ ++int32_t BRD_SM_ControlSet(uint32_t ctrlId, uint32_t numVal, ++ const uint32_t *val); ++ ++/*! ++ * Get a board control value. ++ * ++ * @param[in] ctrlId Index of control to read ++ * @param[out] numRtn Return pointer to number of array elements ++ * @param[out] rtn Pointer to array to store return ++ * ++ * This function allows a caller to read an array of values for ++ * a control. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if ctrlId is not valid. ++ */ ++int32_t BRD_SM_ControlGet(uint32_t ctrlId, uint32_t *numRtn, uint32_t *rtn); ++ ++/*! ++ * Set an extended board control value. ++ * ++ * @param[in] ctrlId Index of control to write ++ * @param[in] addr Address of write ++ * @param[in] numVal Number of array elements ++ * @param[in] val Pointer to array of values to set ++ * ++ * This function allows a caller to write an array of values for ++ * a control. Extra parameters allow this write to be more complex ++ * such as to an I2C. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if ctrlId is not valid. ++ * - ::SM_ERR_INVALID_PARAMETERS: if addr or numVal are not valid. ++ */ ++int32_t BRD_SM_ControlExtSet(uint32_t ctrlId, uint32_t addr, ++ uint32_t numVal, const uint32_t *val); ++ ++/*! ++ * Get an extended board control value. ++ * ++ * @param[in] ctrlId Index of control to read ++ * @param[in] addr Address of read ++ * @param[in] numRtn Number of array elements ++ * @param[out] rtn Pointer to array to store return ++ * ++ * This function allows a caller to read an array of values for ++ * a control. Extra parameters allow this read to be more complex ++ * such as from an I2C. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if ctrlId is not valid. ++ * - ::SM_ERR_INVALID_PARAMETERS: if addr or numRtn are not valid. ++ */ ++int32_t BRD_SM_ControlExtGet(uint32_t ctrlId, uint32_t addr, ++ uint32_t numRtn, uint32_t *rtn); ++ ++/*! ++ * Configure notification flags for a control. ++ * ++ * @param[in] ctrlId Index of control to take action ++ * @param[in] flags Action to take ++ * ++ * This function allows a caller to configure the notification flags. ++ * These often enable/disable hardware interrupts. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if ctrlId is not valid. ++ */ ++int32_t BRD_SM_ControlFlagsSet(uint32_t ctrlId, uint32_t flags); ++ ++/*! ++ * Control handler. ++ * ++ * @param[in] status Interrupt status ++ * @param[in] val Signal state ++ */ ++void BRD_SM_ControlHandler(uint8_t status, uint8_t val); ++ ++/** @} */ ++ ++#endif /* BRD_SM_CONTROL_H */ ++ ++/** @} */ ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm_handlers.c b/boards/ccimx95dvk/sm/brd_sm_handlers.c +new file mode 100755 +index 000000000000..a96f6ce0e2f4 +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm_handlers.c +@@ -0,0 +1,372 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/* File containing the implementation of the handlers for the board. */ ++/*==========================================================================*/ ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "brd_sm.h" ++#include "dev_sm.h" ++#include "fsl_lpi2c.h" ++#include "fsl_rgpio.h" ++ ++/* Local defines */ ++ ++/* I2C device addresses */ ++#define BOARD_PF09_DEV_ADDR 0x08U ++#define BOARD_PCAL6408A_DEV_ADDR 0x20U ++#define BOARD_PF5301_DEV_ADDR 0x2AU ++#define BOARD_PF5302_DEV_ADDR 0x29U ++#define BOARD_PCA2131_DEV_ADDR 0x53U ++ ++#define PCAL6408A_INPUT_PF53_ARM_PG 1U ++#define PCAL6408A_INPUT_PF53_SOC_PG 2U ++#define PCAL6408A_INPUT_PF09_INT 3U ++#define PCAL6408A_INPUT_PCA2131_INT 6U ++ ++/* Local types */ ++ ++/* Local variables */ ++ ++/* Global variables */ ++ ++PCAL6408A_Type g_pcal6408aDev; ++PF09_Type g_pf09Dev; ++PF53_Type g_pf5301Dev; ++PF53_Type g_pf5302Dev; ++PCA2131_Type g_pca2131Dev; ++ ++irq_prio_info_t g_brdIrqPrioInfo[BOARD_NUM_IRQ_PRIO_IDX] = ++{ ++ [BOARD_IRQ_PRIO_IDX_GPIO1_0] = ++ { ++ .irqId = GPIO1_0_IRQn, ++ .irqCntr = 0U, ++ .basePrio = 0U, ++ .dynPrioEn = false ++ } ++}; ++ ++bool g_pca2131Used = false; ++ ++uint32_t g_pmicFaultFlags = 0U; ++ ++/* Local functions */ ++ ++static void BRD_SM_Pf09Handler(void); ++ ++/*--------------------------------------------------------------------------*/ ++/* Init serial devices */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SerialDevicesInit(void) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ LPI2C_Type *const s_i2cBases[] = LPI2C_BASE_PTRS; ++ pcal6408a_config_t pcal6408Config; ++ ++ /* Fill in PCAL6408A dev */ ++ g_pcal6408aDev.i2cBase = s_i2cBases[BOARD_I2C_INSTANCE]; ++ g_pcal6408aDev.devAddr = BOARD_PCAL6408A_DEV_ADDR; ++ ++ /* Init the bus expander */ ++ PCAL6408A_GetDefaultConfig(&pcal6408Config); ++ pcal6408Config.inputLatch = 0xFFU; ++ if (!PCAL6408A_Init(&g_pcal6408aDev, &pcal6408Config)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ else ++ { ++ if (!PCAL6408A_IntMaskSet(&g_pcal6408aDev, PCAL6408A_INITIAL_MASK)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ if (status == SM_ERR_SUCCESS) ++ { ++ /* Fill in PF09 PMIC handle */ ++ g_pf09Dev.i2cBase = s_i2cBases[BOARD_I2C_INSTANCE]; ++ g_pf09Dev.devAddr = BOARD_PF09_DEV_ADDR; ++ g_pf09Dev.crcEn = true; ++ ++ /* Initialize PF09 PMIC */ ++ if (!PF09_Init(&g_pf09Dev)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ ++ /* Disable voltage monitor 1 */ ++ if (status == SM_ERR_SUCCESS) ++ { ++ if (!PF09_MonitorEnable(&g_pf09Dev, PF09_VMON1, false)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Disable voltage monitor 2 */ ++ if (status == SM_ERR_SUCCESS) ++ { ++ if (!PF09_MonitorEnable(&g_pf09Dev, PF09_VMON2, false)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Disable the PWRUP interrupt */ ++ if (status == SM_ERR_SUCCESS) ++ { ++ const uint8_t mask[PF09_MASK_LEN] = ++ { ++ [PF09_MASK_IDX_STATUS1] = 0x08U ++ }; ++ ++ if (!PF09_IntEnable(&g_pf09Dev, mask, PF09_MASK_LEN, false)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Change the LDO3 sequence */ ++ if (status == SM_ERR_SUCCESS) ++ { ++ if (!PF09_PmicWrite(&g_pf09Dev, 0x4AU, 0x1EU, 0xFFU)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Set the LDO3 OV bypass */ ++ if (status == SM_ERR_SUCCESS) ++ { ++ if (!PF09_PmicWrite(&g_pf09Dev, 0x7FU, 0xFCU, 0xFFU)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Enable the LDO3 in RUN mode */ ++ if (status == SM_ERR_SUCCESS) ++ { ++ if (!PF09_PmicWrite(&g_pf09Dev, 0x7DU, 0x20U, 0xFFU)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Set the OV debounce to 50us due to errata ER011/12 */ ++ if (status == SM_ERR_SUCCESS) ++ { ++ if (!PF09_PmicWrite(&g_pf09Dev, 0x37U, 0x94U, 0xFFU)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Save and clear any fault flags */ ++ if (status == SM_ERR_SUCCESS) ++ { ++ if (!PF09_FaultFlags(&g_pf09Dev, &g_pmicFaultFlags, true)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Handle any already pending PF09 interrupts */ ++ if (status == SM_ERR_SUCCESS) ++ { ++ BRD_SM_Pf09Handler(); ++ } ++ } ++ ++ if (status == SM_ERR_SUCCESS) ++ { ++ /* Fill in PF5301 PMIC handle */ ++ g_pf5301Dev.i2cBase = s_i2cBases[BOARD_I2C_INSTANCE]; ++ g_pf5301Dev.devAddr = BOARD_PF5301_DEV_ADDR; ++ ++ /* Initialize PF5301 PMIC */ ++ if (!PF53_Init(&g_pf5301Dev)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ ++ } ++ ++ if (status == SM_ERR_SUCCESS) ++ { ++ /* Fill in PF5302 PMIC handle */ ++ g_pf5302Dev.i2cBase = s_i2cBases[BOARD_I2C_INSTANCE]; ++ g_pf5302Dev.devAddr = BOARD_PF5302_DEV_ADDR; ++ ++ /* Initialize PF5302 PMIC */ ++ if (!PF53_Init(&g_pf5302Dev)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ if (status == SM_ERR_SUCCESS) ++ { ++ /* Fill in PCA2131 RTC handle */ ++ g_pca2131Dev.i2cBase = s_i2cBases[BOARD_I2C_INSTANCE]; ++ g_pca2131Dev.devAddr = BOARD_PCA2131_DEV_ADDR; ++ ++ /* Initialize PCA2131 RTC */ ++ if (!PCA2131_Init(&g_pca2131Dev)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ if (status == SM_ERR_SUCCESS) ++ { ++ rgpio_pin_config_t gpioConfig = ++ { ++ kRGPIO_DigitalInput, ++ 0U ++ }; ++ ++ /* Init GPIO1-10 */ ++ RGPIO_PinInit(GPIO1, 10U, &gpioConfig); ++ RGPIO_SetPinInterruptConfig(GPIO1, 10U, kRGPIO_InterruptOutput0, ++ kRGPIO_InterruptLogicZero); ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Set bus expander interrupt mask */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_BusExpMaskSet(uint8_t val, uint8_t mask) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ static uint8_t cachedMask = PCAL6408A_INITIAL_MASK; ++ uint8_t newMask = (cachedMask & ~mask); ++ ++ newMask |= val; ++ ++ /* Mask changed? */ ++ if (cachedMask != newMask) ++ { ++ if (PCAL6408A_IntMaskSet(&g_pcal6408aDev, newMask)) ++ { ++ cachedMask = newMask; ++ } ++ else ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* GPIO1 handler */ ++/*--------------------------------------------------------------------------*/ ++void GPIO1_0_IRQHandler(void) ++{ ++ uint32_t flags; ++ uint8_t status, val; ++ ++ /* Get GPIO status */ ++ flags = RGPIO_GetPinsInterruptFlags(GPIO1, kRGPIO_InterruptOutput0); ++ ++ /* Get PCAL6408A status */ ++ (void) PCAL6408A_IntStatusGet(&g_pcal6408aDev, &status); ++ ++ /* Get value and Clear PCAL6408A interrupts */ ++ (void) PCAL6408A_InputGet(&g_pcal6408aDev, &val); ++ ++ /* Clear GPIO interrupts */ ++ RGPIO_ClearPinsInterruptFlags(GPIO1, kRGPIO_InterruptOutput0, flags); ++ ++ /* Handle PF09 interrupt */ ++ if ((status & BIT8(PCAL6408A_INPUT_PF09_INT)) != 0U) ++ { ++ /* Asserts low */ ++ if ((val & BIT8(PCAL6408A_INPUT_PF09_INT)) == 0U) ++ { ++ BRD_SM_Pf09Handler(); ++ } ++ } ++ ++ /* Handle PCA2131 interrupt */ ++ if (g_pca2131Used && ((status & BIT8(PCAL6408A_INPUT_PCA2131_INT)) ++ != 0U)) ++ { ++ /* Asserts low */ ++ if ((val & BIT8(PCAL6408A_INPUT_PCA2131_INT)) == 0U) ++ { ++ BRD_SM_BbmHandler(); ++ } ++ } ++ ++ /* Handle controls interrupts */ ++ BRD_SM_ControlHandler(status, val); ++ ++ /* Adjust dynamic IRQ priority */ ++ (void) DEV_SM_IrqPrioUpdate(); ++} ++ ++/*==========================================================================*/ ++ ++/*--------------------------------------------------------------------------*/ ++/* PF09 handler */ ++/*--------------------------------------------------------------------------*/ ++static void BRD_SM_Pf09Handler(void) ++{ ++ uint8_t stat[PF09_MASK_LEN] = { 0 }; ++ ++ /* Read status of interrupts */ ++ (void) PF09_IntStatus(&g_pf09Dev, stat, PF09_MASK_LEN); ++ ++ /* Clear pending */ ++ (void) PF09_IntClear(&g_pf09Dev, stat, PF09_MASK_LEN); ++ ++ /* Handle pending temp interrupts */ ++ if ((stat[PF09_MASK_IDX_STATUS2] & 0x0FU) != 0U) ++ { ++ BRD_SM_SensorHandler(); ++ } ++} ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm_handlers.h b/boards/ccimx95dvk/sm/brd_sm_handlers.h +new file mode 100755 +index 000000000000..e34d52b50f7a +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm_handlers.h +@@ -0,0 +1,129 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2024 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++#ifndef BRD_SM_HANDLERS_H ++#define BRD_SM_HANDLERS_H ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup BRD_SM_MX95EVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing the implementation of interrupt handlers for the ++ * board. ++ */ ++/*==========================================================================*/ ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "dev_sm.h" ++#include "fsl_pcal6408a.h" ++#include "fsl_pf09.h" ++#include "fsl_pf53.h" ++#include "fsl_pca2131.h" ++ ++/* Defines */ ++ ++/*! Initial PCAL6408A interrupt mask */ ++#define PCAL6408A_INITIAL_MASK 0xF7U ++ ++/*! Number of board IRQs participating dynamic prioritization */ ++#define BOARD_NUM_IRQ_PRIO_IDX 1U ++ ++/*! Dynamic IRQ priority table index for GPIO1 */ ++#define BOARD_IRQ_PRIO_IDX_GPIO1_0 0U ++ ++/* Types */ ++ ++/* External variables */ ++ ++/*! Handle to access PCAL6408A */ ++extern PCAL6408A_Type g_pcal6408aDev; ++ ++/*! Handle to access PF09 */ ++extern PF09_Type g_pf09Dev; ++ ++/*! Handle to access PF5301 */ ++extern PF53_Type g_pf5301Dev; ++ ++/*! Handle to access PF5302 */ ++extern PF53_Type g_pf5302Dev; ++ ++/*! Handle to access PCA2131 */ ++extern PCA2131_Type g_pca2131Dev; ++ ++/*! Array of dynamic priority info for board IRQs */ ++extern irq_prio_info_t g_brdIrqPrioInfo[BOARD_NUM_IRQ_PRIO_IDX]; ++ ++/*! Indicator if bus expander bit[6] is used for the PF2131 RTC */ ++extern bool g_pca2131Used; ++ ++/*! Fault flags from the PMICs */ ++extern uint32_t g_pmicFaultFlags; ++ ++/* Functions */ ++ ++/*! ++ * Init serial devices. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ */ ++int32_t BRD_SM_SerialDevicesInit(void); ++ ++/*! ++ * Enable/disable bus expander interrupts. ++ * ++ * @param[in] val Value to write ++ * @param[in] mask Mask of bits to modify ++ * ++ * This function allows a caller to configure the bus expander. ++ * interrupts. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ */ ++int32_t BRD_SM_BusExpMaskSet(uint8_t val, uint8_t mask); ++ ++/*! ++ * GPIO 1 interrupt 0 handler. ++ */ ++void GPIO1_0_IRQHandler(void); ++ ++/** @} */ ++ ++#endif /* BRD_SM_HANDLERS_H */ ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm_sensor.c b/boards/ccimx95dvk/sm/brd_sm_sensor.c +new file mode 100755 +index 000000000000..92e415459477 +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm_sensor.c +@@ -0,0 +1,375 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/* File containing the implementation of the board sensors. */ ++/*==========================================================================*/ ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "brd_sm.h" ++#include "lmm.h" ++ ++/* Local defines */ ++ ++/* Local types */ ++ ++/* Local variables */ ++ ++static bool sensorEnb[BRD_SM_NUM_SENSOR]; ++ ++/*--------------------------------------------------------------------------*/ ++/* Return sensor name */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SensorNameGet(uint32_t sensorId, string *sensorNameAddr, ++ int32_t *len) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ static int32_t s_maxLen = 0; ++ ++ static string const s_name[BRD_SM_NUM_SENSOR] = ++ { ++ "temp_pf09", ++ "temp_pf53_soc", ++ "temp_pf53_arm" ++ }; ++ ++ /* Get max string width */ ++ DEV_SM_MaxStringGet(len, &s_maxLen, s_name, BRD_SM_NUM_SENSOR); ++ ++ /* Check to see if sensorId is within bounds */ ++ if (sensorId < SM_NUM_SENSOR) ++ { ++ /* Check if device or board */ ++ if (sensorId < DEV_SM_NUM_SENSOR) ++ { ++ status = DEV_SM_SensorNameGet(sensorId, sensorNameAddr, len); ++ } ++ else ++ { ++ uint32_t brdSensorId = sensorId - DEV_SM_NUM_SENSOR; ++ ++ /* Return pointer to name */ ++ *sensorNameAddr = s_name[brdSensorId]; ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Return sensor description */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SensorDescribe(uint32_t sensorId, ++ dev_sm_sensor_desc_t *desc) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check to see if sensorId is within bounds */ ++ if (sensorId < SM_NUM_SENSOR) ++ { ++ /* Check if device or board */ ++ if (sensorId < DEV_SM_NUM_SENSOR) ++ { ++ status = DEV_SM_SensorDescribe(sensorId, desc); ++ } ++ else ++ { ++ desc->sensorType = 2U; ++ desc->sensorExponent = 0; ++ desc->numTripPoints = 0U; ++ desc->timestampSupport = false; ++ desc->timestampExponent = 0; ++ ++ /* PF09? */ ++ if (sensorId == BRD_SM_SENSOR_TEMP_PF09) ++ { ++ desc->numTripPoints = 1U; ++ } ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get sensor reading */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SensorReadingGet(uint32_t sensorId, int64_t *sensorValue, ++ uint64_t *sensorTimestamp) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check to see if sensorId is within bounds */ ++ if (sensorId < SM_NUM_SENSOR) ++ { ++ /* Check if device or board */ ++ if (sensorId < DEV_SM_NUM_SENSOR) ++ { ++ status = DEV_SM_SensorReadingGet(sensorId, sensorValue, ++ sensorTimestamp); ++ } ++ else ++ { ++ uint32_t brdSensorId = sensorId - DEV_SM_NUM_SENSOR; ++ ++ /* Check if enabled */ ++ if (sensorEnb[brdSensorId]) ++ { ++ int32_t temp; ++ bool rc = false; ++ ++ /* Read sensor */ ++ switch (sensorId) ++ { ++ case BRD_SM_SENSOR_TEMP_PF09: ++ rc = PF09_TempGet(&g_pf09Dev, &temp); ++ break; ++ case BRD_SM_SENSOR_TEMP_PF5301: ++ rc = PF53_TempGet(&g_pf5301Dev, &temp); ++ break; ++ default: ++ rc = PF53_TempGet(&g_pf5302Dev, &temp); ++ break; ++ } ++ ++ if (rc) ++ { ++ *sensorValue = (int64_t) temp; ++ *sensorTimestamp = 0ULL; ++ } ++ else ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_SUPPORTED; ++ } ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Set sensor trippoint */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SensorTripPointSet(uint32_t sensorId, uint8_t tripPoint, ++ int64_t value, uint8_t eventControl) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check to see if sensorId is within bounds */ ++ if (sensorId < SM_NUM_SENSOR) ++ { ++ /* Check if device or board */ ++ if (sensorId < DEV_SM_NUM_SENSOR) ++ { ++ status = DEV_SM_SensorTripPointSet(sensorId, tripPoint, ++ value, eventControl); ++ } ++ else ++ { ++ uint32_t brdSensorId = sensorId - DEV_SM_NUM_SENSOR; ++ ++ /* Check if enabled */ ++ if ((sensorId == BRD_SM_SENSOR_TEMP_PF09) ++ && sensorEnb[brdSensorId]) ++ { ++ /* Check trip point */ ++ if (tripPoint == 0U) ++ { ++ if (eventControl == DEV_SM_SENSOR_TP_NONE) ++ { ++ if (!PF09_TempAlarmSet(&g_pf09Dev, 500)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ else if (eventControl == DEV_SM_SENSOR_TP_RISING) ++ { ++ /* Check value is within int32_t range */ ++ if (CHECK_I64_FIT_I32(value)) ++ { ++ int32_t temp = (int32_t) value; ++ ++ if (!PF09_TempAlarmSet(&g_pf09Dev, temp)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ else ++ { ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ } ++ else ++ { ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ } ++ else ++ { ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_SUPPORTED; ++ } ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Enable/disable sensor */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SensorEnable(uint32_t sensorId, bool enable, ++ bool timestampReporting) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check to see if sensorId is within bounds */ ++ if (sensorId < SM_NUM_SENSOR) ++ { ++ /* Check if device or board */ ++ if (sensorId < DEV_SM_NUM_SENSOR) ++ { ++ status = DEV_SM_SensorEnable(sensorId, enable, ++ timestampReporting); ++ } ++ else ++ { ++ uint32_t brdSensorId = sensorId - DEV_SM_NUM_SENSOR; ++ ++ /* Timestamp not supported */ ++ if (timestampReporting) ++ { ++ status = SM_ERR_NOT_SUPPORTED; ++ } ++ else ++ { ++ /* Record sensor enable */ ++ sensorEnb[brdSensorId] = enable; ++ ++ /* Disable alarm */ ++ if ((sensorId == BRD_SM_SENSOR_TEMP_PF09) ++ && !sensorEnb[brdSensorId]) ++ { ++ if (!PF09_TempAlarmSet(&g_pf09Dev, 500)) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ } ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Return sensor enable status */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_SensorIsEnabled(uint32_t sensorId, bool *enabled, ++ bool *timestampReporting) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check to see if sensorId is within bounds */ ++ if (sensorId < SM_NUM_SENSOR) ++ { ++ uint32_t brdSensorId = sensorId - DEV_SM_NUM_SENSOR; ++ ++ /* Check if device or board */ ++ if (sensorId < DEV_SM_NUM_SENSOR) ++ { ++ status = DEV_SM_SensorIsEnabled(sensorId, enabled, ++ timestampReporting); ++ } ++ else ++ { ++ /* Return sensor enable */ ++ *enabled = sensorEnb[brdSensorId]; ++ *timestampReporting = false; ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* PMIC sensor handler */ ++/*--------------------------------------------------------------------------*/ ++void BRD_SM_SensorHandler(void) ++{ ++ /* Send sensor event */ ++ LMM_SensorEvent(BRD_SM_SENSOR_TEMP_PF09, 0U, 1U); ++} ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm_sensor.h b/boards/ccimx95dvk/sm/brd_sm_sensor.h +new file mode 100755 +index 000000000000..98b68ae9d53a +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm_sensor.h +@@ -0,0 +1,210 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup BRD_SM_MX95EVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing the SM API for the board sensors. ++ */ ++/*==========================================================================*/ ++ ++#ifndef BRD_SM_SENSOR_H ++#define BRD_SM_SENSOR_H ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "dev_sm.h" ++ ++/* Defines */ ++ ++/*! ++ * @name Board redirection defines ++ * @{ ++ */ ++#define SM_SENSORNAMEGET BRD_SM_SensorNameGet /*!< Sensor name */ ++#define SM_SENSORDESCRIBE BRD_SM_SensorDescribe /*!< Sensor describe */ ++#define SM_SENSORREADINGGET BRD_SM_SensorReadingGet /*!< Sensor read */ ++#define SM_SENSORTRIPPOINTSET BRD_SM_SensorTripPointSet /*!< Sensor trip point */ ++#define SM_SENSORENABLE BRD_SM_SensorEnable /*!< Sensor enable */ ++#define SM_SENSORISENABLED BRD_SM_SensorIsEnabled /*!< Sensor status */ ++/** @} */ ++ ++/*! Number of board sensors */ ++#define BRD_SM_NUM_SENSOR 3UL ++ ++/*! Total number of sensors */ ++#define SM_NUM_SENSOR (DEV_SM_NUM_SENSOR + BRD_SM_NUM_SENSOR) ++ ++/*! ++ * @name BRD_SM sensor domain indexes ++ */ ++/** @{ */ ++#define BRD_SM_SENSOR_TEMP_PF09 (DEV_SM_NUM_SENSOR + 0U) /*!< PF09 temp sensor */ ++#define BRD_SM_SENSOR_TEMP_PF5302 (DEV_SM_NUM_SENSOR + 1U) /*!< PF5302 temp sensor */ ++#define BRD_SM_SENSOR_TEMP_PF5301 (DEV_SM_NUM_SENSOR + 2U) /*!< PF5301 temp sensor */ ++/** @} */ ++ ++/* Types */ ++ ++/* Functions */ ++ ++/*! ++ * @name Board sensor functions ++ * @{ ++ */ ++ ++/*! ++ * Get a board sensor name. ++ * ++ * @param[in] sensorId Sensor name to get ++ * @param[out] sensorNameAddr Return pointer to name ++ * @param[out] len Return max length of all sensor names ++ * ++ * This function allows the caller to get the name of a sensor. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a sensorId is invalid. ++ */ ++int32_t BRD_SM_SensorNameGet(uint32_t sensorId, string *sensorNameAddr, ++ int32_t *len); ++ ++/*! ++ * Get a board sensor description. ++ * ++ * @param[in] sensorId Sensor description to get ++ * @param[out] desc Return pointer to the description ++ * ++ * This function allows the caller to get the description of a sensor. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a sensorId is invalid. ++ */ ++int32_t BRD_SM_SensorDescribe(uint32_t sensorId, ++ dev_sm_sensor_desc_t *desc); ++ ++/*! ++ * Read a board sensor. ++ * ++ * @param[in] sensorId Sensor to read ++ * @param[out] sensorValue Return pointer to sensor value ++ * @param[out] sensorTimestamp Return pointer to timestamp ++ * ++ * This function allows the caller to read the value of a sensor. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a sensorId is invalid. ++ */ ++int32_t BRD_SM_SensorReadingGet(uint32_t sensorId, int64_t *sensorValue, ++ uint64_t *sensorTimestamp); ++ ++/*! ++ * Configure a trip point for a board sensor. ++ * ++ * @param[in] sensorId Sensor to configure TP ++ * @param[in] tripPoint Trip point ID ++ * @param[in] value Value to trip at ++ * @param[in] eventControl Event control (notifications) ++ * ++ * This function allows the caller to configure one of the trip ++ * points for a sensor. The caller can also configure which crossing ++ * direction will generate a notification. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a sensorId is invalid. ++ */ ++int32_t BRD_SM_SensorTripPointSet(uint32_t sensorId, uint8_t tripPoint, ++ int64_t value, uint8_t eventControl); ++ ++/*! ++ * Enable/disable a board sensor. ++ * ++ * @param[in] sensorId Sensor to enable/disable ++ * @param[in] enable True to enable ++ * @param[in] timestampReporting True to enable timestamp reporting ++ * ++ * This function allows the caller to enable/disable a sensor. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a sensorId is invalid. ++ */ ++int32_t BRD_SM_SensorEnable(uint32_t sensorId, bool enable, ++ bool timestampReporting); ++ ++/*! ++ * Get enable/disable state of a board sensor. ++ * ++ * @param[in] sensorId Sensor to get state ++ * @param[out] enabled Return pointer to enable ++ * @param[out] timestampReporting Return pointer to reporting ++ * ++ * This function allows the caller to get the enable/disable ++ * state of a sensor. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a sensorId is invalid. ++ */ ++int32_t BRD_SM_SensorIsEnabled(uint32_t sensorId, bool *enabled, ++ bool *timestampReporting); ++ ++/*! ++ * Sensor interrupt handler. ++ * ++ * Called by PF09 interrupt handler. ++ */ ++void BRD_SM_SensorHandler(void); ++ ++/** @} */ ++ ++#endif /* BRD_SM_SENSOR_H */ ++ ++/** @} */ ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm_voltage.c b/boards/ccimx95dvk/sm/brd_sm_voltage.c +new file mode 100755 +index 000000000000..b81ffd970294 +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm_voltage.c +@@ -0,0 +1,565 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/* File containing the implementation of the board voltages. */ ++/*==========================================================================*/ ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "brd_sm.h" ++ ++/* Local defines */ ++ ++/* Local types */ ++ ++/* Local variables */ ++ ++static int32_t s_levelSoc = BOARD_VOLT_SOC; ++static int32_t s_levelArm = BOARD_VOLT_ARM; ++static uint32_t s_modeArm = DEV_SM_VOLT_MODE_ON; ++static uint32_t s_modeArmSave = DEV_SM_VOLT_MODE_ON; ++ ++/*--------------------------------------------------------------------------*/ ++/* Return voltage name */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_VoltageNameGet(uint32_t domainId, string *voltNameAddr, ++ int32_t *len) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ static int32_t s_maxLen = 0; ++ ++ static string const s_name[BRD_SM_NUM_VOLT] = ++ { ++ "vdd_gpio_3p3", ++ "vdd_ana_0p8", ++ "vdd_gpio_1p8", ++ "vddq_ddr", ++ "vdd2_ddr", ++ "sd_card", ++ "nvcc_sd2" ++ }; ++ ++ /* Get max string width */ ++ DEV_SM_MaxStringGet(len, &s_maxLen, s_name, BRD_SM_NUM_VOLT); ++ ++ /* Check to see if domain is within bounds*/ ++ if (domainId < SM_NUM_VOLT) ++ { ++ /* Check if device or board */ ++ if (domainId < DEV_SM_NUM_VOLT) ++ { ++ status = DEV_SM_VoltageNameGet(domainId, voltNameAddr, len); ++ } ++ else ++ { ++ /* Return pointer to name */ ++ *voltNameAddr = s_name[domainId - DEV_SM_NUM_VOLT]; ++ } ++ } ++ else ++ { ++ status = SM_ERR_NOT_FOUND; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Return supported voltage range */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_VoltageDescribe(uint32_t domainId, ++ dev_sm_voltage_range_t *range) ++{ ++ int32_t status = SM_ERR_HARDWARE_ERROR; ++ bool rc = false; ++ PF09_RegInfo info; ++ ++ /* Get voltage range/info */ ++ switch (domainId) ++ { ++ case DEV_SM_VOLT_SOC: ++ status = DEV_SM_VoltageDescribe(domainId, range); ++ break; ++ case DEV_SM_VOLT_ARM: ++ status = DEV_SM_VoltageDescribe(domainId, range); ++ break; ++ case BRD_SM_VOLT_VDD_GPIO_3P3: ++ rc = PF09_RegulatorInfoGet(PF09_REG_SW1, &info); ++ break; ++ case BRD_SM_VOLT_VDD_ANA_0P8: ++ rc = PF09_RegulatorInfoGet(PF09_REG_SW2, &info); ++ break; ++ case BRD_SM_VOLT_VDD_GPIO_1P8: ++ rc = PF09_RegulatorInfoGet(PF09_REG_SW3, &info); ++ break; ++ case BRD_SM_VOLT_VDDQ_DDR: ++ rc = PF09_RegulatorInfoGet(PF09_REG_SW4, &info); ++ break; ++ case BRD_SM_VOLT_VDD2_DDR: ++ rc = PF09_RegulatorInfoGet(PF09_REG_SW5, &info); ++ break; ++ case BRD_SM_VOLT_SD_CARD: ++ rc = PF09_RegulatorInfoGet(PF09_REG_LDO1, &info); ++ break; ++ case BRD_SM_VOLT_NVCC_SD2: ++ rc = PF09_RegulatorInfoGet(PF09_REG_LDO2, &info); ++ break; ++ default: ++ status = SM_ERR_NOT_FOUND; ++ break; ++ } ++ ++ /* Return results */ ++ if ((status != SM_ERR_SUCCESS) && rc) ++ { ++ /* Validate the parameters values are with in int32 range */ ++ if (CHECK_U32_FIT_I32(info.maxV) && ++ CHECK_U32_FIT_I32(info.minV) && ++ CHECK_U32_FIT_I32(info.stepV)) ++ { ++ range->highestVolt = (int32_t) info.maxV; ++ range->lowestVolt = (int32_t) info.minV; ++ range->stepSize = (int32_t) info.stepV; ++ status = SM_ERR_SUCCESS; ++ } ++ else ++ { ++ /* Set the status if parameters are out of range */ ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Set voltage mode */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_VoltageModeSet(uint32_t domainId, uint8_t voltMode) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ bool enable = (voltMode == DEV_SM_VOLT_MODE_ON); ++ uint8_t mode = ((voltMode == DEV_SM_VOLT_MODE_OFF) ++ ? PF09_SW_MODE_OFF : PF09_SW_MODE_PWM); ++ bool rc; ++ ++ /* Set mode */ ++ switch (domainId) ++ { ++ case DEV_SM_VOLT_SOC: ++ mode = ((voltMode == DEV_SM_VOLT_MODE_OFF) ++ ? PF53_SW_MODE_OFF : PF53_SW_MODE_PWM); ++ rc = PF53_SwModeSet(&g_pf5302Dev, PF53_REG_SW1, PF53_STATE_VRUN, ++ mode); ++ break; ++ case DEV_SM_VOLT_ARM: ++ rc = PF09_GpioCtrlSet(&g_pf09Dev, PF09_GPIO4, PF53_STATE_VRUN, ++ enable); ++ if (enable && rc) ++ { ++ /* Wait for PF53 power up and ramp */ ++ SystemTimeDelay(1000U); ++ ++ if (s_levelArm != BOARD_VOLT_ARM) ++ { ++ /* Restore voltage as enable resets the PF53 */ ++ status = BRD_SM_VoltageLevelSet(domainId, s_levelArm); ++ } ++ } ++ if (rc) ++ { ++ s_modeArm = voltMode; ++ } ++ break; ++ case BRD_SM_VOLT_VDD_GPIO_3P3: ++ rc = PF09_SwModeSet(&g_pf09Dev, PF09_REG_SW1, PF09_STATE_VRUN, ++ mode); ++ break; ++ case BRD_SM_VOLT_VDD_ANA_0P8: ++ rc = PF09_SwModeSet(&g_pf09Dev, PF09_REG_SW2, PF09_STATE_VRUN, ++ mode); ++ break; ++ case BRD_SM_VOLT_VDD_GPIO_1P8: ++ rc = PF09_SwModeSet(&g_pf09Dev, PF09_REG_SW3, PF09_STATE_VRUN, ++ mode); ++ break; ++ case BRD_SM_VOLT_VDDQ_DDR: ++ rc = PF09_SwModeSet(&g_pf09Dev, PF09_REG_SW4, PF09_STATE_VRUN, ++ mode); ++ break; ++ case BRD_SM_VOLT_VDD2_DDR: ++ rc = PF09_SwModeSet(&g_pf09Dev, PF09_REG_SW5, PF09_STATE_VRUN, ++ mode); ++ break; ++ case BRD_SM_VOLT_SD_CARD: ++ rc = PF09_LdoEnable(&g_pf09Dev, PF09_REG_LDO1, PF09_STATE_VRUN, ++ enable); ++ break; ++ case BRD_SM_VOLT_NVCC_SD2: ++ rc = PF09_LdoEnable(&g_pf09Dev, PF09_REG_LDO2, PF09_STATE_VRUN, ++ enable); ++ break; ++ default: ++ status = SM_ERR_NOT_FOUND; ++ break; ++ } ++ ++ /* Translate error */ ++ if ((status == SM_ERR_SUCCESS) && !rc) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get voltage mode */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_VoltageModeGet(uint32_t domainId, uint8_t *voltMode) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ bool enable; ++ uint8_t mode; ++ bool rc; ++ ++ /* Get mode */ ++ switch (domainId) ++ { ++ case DEV_SM_VOLT_SOC: ++ rc = PF53_SwModeGet(&g_pf5302Dev, PF53_REG_SW1, PF53_STATE_VRUN, ++ &mode); ++ enable = (mode != PF53_SW_MODE_OFF); ++ break; ++ case DEV_SM_VOLT_ARM: ++ rc = PF09_GpioCtrlGet(&g_pf09Dev, PF09_GPIO4, PF53_STATE_VRUN, ++ &enable); ++ break; ++ case BRD_SM_VOLT_VDD_GPIO_3P3: ++ rc = PF09_SwModeGet(&g_pf09Dev, PF09_REG_SW1, PF09_STATE_VRUN, ++ &mode); ++ enable = (mode != PF09_SW_MODE_OFF); ++ break; ++ case BRD_SM_VOLT_VDD_ANA_0P8: ++ rc = PF09_SwModeGet(&g_pf09Dev, PF09_REG_SW2, PF09_STATE_VRUN, ++ &mode); ++ enable = (mode != PF09_SW_MODE_OFF); ++ break; ++ case BRD_SM_VOLT_VDD_GPIO_1P8: ++ rc = PF09_SwModeGet(&g_pf09Dev, PF09_REG_SW3, PF09_STATE_VRUN, ++ &mode); ++ enable = (mode != PF09_SW_MODE_OFF); ++ break; ++ case BRD_SM_VOLT_VDDQ_DDR: ++ rc = PF09_SwModeGet(&g_pf09Dev, PF09_REG_SW4, PF09_STATE_VRUN, ++ &mode); ++ enable = (mode != PF09_SW_MODE_OFF); ++ break; ++ case BRD_SM_VOLT_VDD2_DDR: ++ rc = PF09_SwModeGet(&g_pf09Dev, PF09_REG_SW5, PF09_STATE_VRUN, ++ &mode); ++ enable = (mode != PF09_SW_MODE_OFF); ++ break; ++ case BRD_SM_VOLT_SD_CARD: ++ rc = PF09_LdoIsEnabled(&g_pf09Dev, PF09_REG_LDO1, PF09_STATE_VRUN, ++ &enable); ++ break; ++ case BRD_SM_VOLT_NVCC_SD2: ++ rc = PF09_LdoIsEnabled(&g_pf09Dev, PF09_REG_LDO2, PF09_STATE_VRUN, ++ &enable); ++ break; ++ default: ++ status = SM_ERR_NOT_FOUND; ++ break; ++ } ++ ++ /* Return result */ ++ if ((status == SM_ERR_SUCCESS) && rc) ++ { ++ *voltMode = enable ? DEV_SM_VOLT_MODE_ON : DEV_SM_VOLT_MODE_OFF; ++ } ++ ++ /* Translate error */ ++ if ((status == SM_ERR_SUCCESS) && !rc) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Set voltage level */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_VoltageLevelSet(uint32_t domainId, int32_t voltageLevel) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ ++ /* Check voltageLevel is positive */ ++ if (CHECK_I32_POSITIVE(voltageLevel)) ++ { ++ bool rc; ++ uint32_t level = (uint32_t) voltageLevel; ++ ++ /* Set level */ ++ switch (domainId) ++ { ++ case DEV_SM_VOLT_SOC: ++ rc = PF53_VoltageSet(&g_pf5302Dev, PF53_REG_SW1, PF53_STATE_VRUN, ++ level); ++ ++ if (rc) ++ { ++ /* Save level to restore */ ++ s_levelSoc = (int32_t) level; ++ } ++ break; ++ case DEV_SM_VOLT_ARM: ++ (void) PF53_VoltageSet(&g_pf5301Dev, PF53_REG_SW1, PF53_STATE_VRUN, ++ level); ++ ++ /* Save level to restore */ ++ s_levelArm = (int32_t) level; ++ rc = true; ++ break; ++ case BRD_SM_VOLT_VDD_GPIO_3P3: ++ rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_SW1, PF09_STATE_VRUN, ++ level); ++ break; ++ case BRD_SM_VOLT_VDD_ANA_0P8: ++ rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_SW2, PF09_STATE_VRUN, ++ level); ++ break; ++ case BRD_SM_VOLT_VDD_GPIO_1P8: ++ rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_SW3, PF09_STATE_VRUN, ++ level); ++ break; ++ case BRD_SM_VOLT_VDDQ_DDR: ++ rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_SW4, PF09_STATE_VRUN, ++ level); ++ break; ++ case BRD_SM_VOLT_VDD2_DDR: ++ rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_SW5, PF09_STATE_VRUN, ++ level); ++ break; ++ case BRD_SM_VOLT_SD_CARD: ++ rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_LDO1, PF09_STATE_VRUN, ++ level); ++ break; ++ case BRD_SM_VOLT_NVCC_SD2: ++ rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_LDO2, PF09_STATE_VRUN, ++ level); ++ break; ++ default: ++ status = SM_ERR_NOT_FOUND; ++ break; ++ } ++ ++ /* Translate error */ ++ if ((status == SM_ERR_SUCCESS) && !rc) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ } ++ else ++ { ++ /* Set the status if voltageLevel is negative */ ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Get voltage level */ ++/*--------------------------------------------------------------------------*/ ++int32_t BRD_SM_VoltageLevelGet(uint32_t domainId, int32_t *voltageLevel) ++{ ++ int32_t status = SM_ERR_SUCCESS; ++ bool rc; ++ uint32_t level = 0U; ++ ++ /* Get level */ ++ switch (domainId) ++ { ++ case DEV_SM_VOLT_SOC: ++ rc = PF53_VoltageGet(&g_pf5302Dev, PF53_REG_SW1, PF53_STATE_VRUN, ++ &level); ++ break; ++ case DEV_SM_VOLT_ARM: ++ rc = PF53_VoltageGet(&g_pf5301Dev, PF53_REG_SW1, PF53_STATE_VRUN, ++ &level); ++ if (rc) ++ { ++ /* Check level is within int32_t range */ ++ if (CHECK_U32_FIT_I32(level)) ++ { ++ /* Save level to restore */ ++ s_levelArm = (int32_t) level; ++ } ++ else ++ { ++ /* Set status if level is not within int32_t range */ ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ } ++ else ++ { ++ /* Check s_levelArm has positive value */ ++ if (CHECK_I32_POSITIVE(s_levelArm)) ++ { ++ /* Return saved level */ ++ level = (uint32_t) s_levelArm; ++ rc = true; ++ } ++ else ++ { ++ /* Set the status if s_levelArm is negative */ ++ status = SM_ERR_INVALID_PARAMETERS; ++ rc = false; ++ } ++ } ++ break; ++ case BRD_SM_VOLT_VDD_GPIO_3P3: ++ rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_SW1, PF09_STATE_VRUN, ++ &level); ++ break; ++ case BRD_SM_VOLT_VDD_ANA_0P8: ++ rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_SW2, PF09_STATE_VRUN, ++ &level); ++ break; ++ case BRD_SM_VOLT_VDD_GPIO_1P8: ++ rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_SW3, PF09_STATE_VRUN, ++ &level); ++ break; ++ case BRD_SM_VOLT_VDDQ_DDR: ++ rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_SW4, PF09_STATE_VRUN, ++ &level); ++ break; ++ case BRD_SM_VOLT_VDD2_DDR: ++ rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_SW5, PF09_STATE_VRUN, ++ &level); ++ break; ++ case BRD_SM_VOLT_SD_CARD: ++ rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_LDO1, PF09_STATE_VRUN, ++ &level); ++ break; ++ case BRD_SM_VOLT_NVCC_SD2: ++ rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_LDO2, PF09_STATE_VRUN, ++ &level); ++ break; ++ default: ++ status = SM_ERR_NOT_FOUND; ++ break; ++ } ++ ++ /* Return result */ ++ if ((status == SM_ERR_SUCCESS) && rc) ++ { ++ /* Check level value within int32_t range */ ++ if (CHECK_U32_FIT_I32(level)) ++ { ++ *voltageLevel = (int32_t) level; ++ } ++ else ++ { ++ status = SM_ERR_INVALID_PARAMETERS; ++ } ++ } ++ ++ /* Translate error */ ++ if ((status == SM_ERR_SUCCESS) && !rc) ++ { ++ status = SM_ERR_HARDWARE_ERROR; ++ } ++ ++ /* Return status */ ++ return status; ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Suspend SoC voltages */ ++/*--------------------------------------------------------------------------*/ ++void BRD_SM_VoltageSuspend(bool offArm) ++{ ++ /* Turn off VDD_ARM */ ++ if (offArm && (s_modeArm != DEV_SM_VOLT_MODE_OFF)) ++ { ++ /* Save VDD_ARM mode */ ++ s_modeArmSave = s_modeArm; ++ ++ (void) BRD_SM_VoltageModeSet(DEV_SM_VOLT_ARM, DEV_SM_VOLT_MODE_OFF); ++ } ++} ++ ++/*--------------------------------------------------------------------------*/ ++/* Restore SoC voltages */ ++/*--------------------------------------------------------------------------*/ ++void BRD_SM_VoltageRestore(void) ++{ ++ /* Restore VDD_SOC level */ ++ if (s_levelSoc != BOARD_VOLT_SOC) ++ { ++ /* Restore voltage as enable resets the PF53 */ ++ (void) BRD_SM_VoltageLevelSet(DEV_SM_VOLT_SOC, s_levelSoc); ++ } ++ ++ /* Restore VDD_ARM mode */ ++ if (s_modeArm != s_modeArmSave) ++ { ++ if (PF09_GpioCtrlSet(&g_pf09Dev, PF09_GPIO4, PF53_STATE_VRUN, ++ true)) ++ { ++ /* Wait for PF53 power up and ramp */ ++ SystemTimeDelay(1000U); ++ ++ s_modeArm = DEV_SM_VOLT_MODE_ON; ++ } ++ } ++ ++ /* Restore VDD_ARM level */ ++ if (s_levelArm != BOARD_VOLT_ARM) ++ { ++ /* Restore voltage as enable resets the PF53 */ ++ (void) BRD_SM_VoltageLevelSet(DEV_SM_VOLT_ARM, s_levelArm); ++ } ++} ++ +diff --git a/boards/ccimx95dvk/sm/brd_sm_voltage.h b/boards/ccimx95dvk/sm/brd_sm_voltage.h +new file mode 100755 +index 000000000000..6c9e01286e7e +--- /dev/null ++++ b/boards/ccimx95dvk/sm/brd_sm_voltage.h +@@ -0,0 +1,213 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2024 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup BRD_SM_MX95EVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing the SM API for the board voltages. ++ */ ++/*==========================================================================*/ ++ ++#ifndef BRD_SM_VOLTAGE_H ++#define BRD_SM_VOLTAGE_H ++ ++/* Includes */ ++ ++#include "sm.h" ++#include "dev_sm.h" ++ ++/* Defines */ ++ ++/*! ++ * @name Board redirection defines ++ * @{ ++ */ ++#define SM_VOLTAGENAMEGET BRD_SM_VoltageNameGet /*!< Voltage name */ ++#define SM_VOLTAGEDESCRIBE BRD_SM_VoltageDescribe /*!< Voltage describe */ ++#define SM_VOLTAGEMODESET BRD_SM_VoltageModeSet /*!< Set voltage mode */ ++#define SM_VOLTAGEMODEGET BRD_SM_VoltageModeGet /*!< Get coltage mode */ ++#define SM_VOLTAGELEVELSET BRD_SM_VoltageLevelSet /*!< Set voltage level */ ++#define SM_VOLTAGELEVELGET BRD_SM_VoltageLevelGet /*!< Get voltage level */ ++/** @} */ ++ ++/*! Number of board voltages */ ++#define BRD_SM_NUM_VOLT 7UL ++ ++/*! Total number of sensors */ ++#define SM_NUM_VOLT (DEV_SM_NUM_VOLT + BRD_SM_NUM_VOLT) ++ ++/*! ++ * @name BRD_SM voltage domains ++ */ ++/** @{ */ ++#define BRD_SM_VOLT_VDD_GPIO_3P3 (DEV_SM_NUM_VOLT + 0U) /*!< VDD GPIO 3.3v */ ++#define BRD_SM_VOLT_VDD_ANA_0P8 (DEV_SM_NUM_VOLT + 1U) /*!< VDD ANA 0.8v */ ++#define BRD_SM_VOLT_VDD_GPIO_1P8 (DEV_SM_NUM_VOLT + 2U) /*!< VDD GPIO 1.8v */ ++#define BRD_SM_VOLT_VDDQ_DDR (DEV_SM_NUM_VOLT + 3U) /*!< DDR VDDQ */ ++#define BRD_SM_VOLT_VDD2_DDR (DEV_SM_NUM_VOLT + 4U) /*!< DDR VDD2 */ ++#define BRD_SM_VOLT_SD_CARD (DEV_SM_NUM_VOLT + 5U) /*!< SD1 */ ++#define BRD_SM_VOLT_NVCC_SD2 (DEV_SM_NUM_VOLT + 6U) /*!< SD2 */ ++/** @} */ ++ ++/* Types */ ++ ++/* Functions */ ++ ++/*! ++ * Get a board voltage domain name. ++ * ++ * @param[in] domainId Domain name to get ++ * @param[out] voltNameAddr Return pointer to name ++ * @param[out] len Return max length of all domain names ++ * ++ * This function allows the caller to get the name of a voltage domain. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a domainId is invalid. ++ */ ++int32_t BRD_SM_VoltageNameGet(uint32_t domainId, string *voltNameAddr, ++ int32_t *len); ++ ++/*! ++ * Get a board voltage domain description. ++ * ++ * @param[in] domainId Voltage description to get ++ * @param[out] range Pointer to return range ++ * ++ * This function allows the caller to get the voltage range for ++ * a voltage. The range contains the high, low, and step voltage ++ * in microvolts (uV). ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a domainId is invalid. ++ */ ++int32_t BRD_SM_VoltageDescribe(uint32_t domainId, ++ dev_sm_voltage_range_t *range); ++ ++/*! ++ * Set a board voltage mode. ++ * ++ * @param[in] domainId Identifier for the voltage domain ++ * @param[in] voltMode Voltage mode to set ++ * ++ * This function allows the caller to set the current mode of ++ * a voltage domain. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a domainId is invalid. ++ */ ++int32_t BRD_SM_VoltageModeSet(uint32_t domainId, uint8_t voltMode); ++ ++/*! ++ * Get a board voltage mode. ++ * ++ * @param[in] domainId Identifier for the voltage domain ++ * @param[out] voltMode Pointer to return the voltage mode ++ * ++ * This function allows the caller to request the current mode of ++ * a voltage domain. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a domainId is invalid. ++ */ ++int32_t BRD_SM_VoltageModeGet(uint32_t domainId, uint8_t *voltMode); ++ ++/*! ++ * Set a board voltage level. ++ * ++ * @param[in] domainId Identifier for the voltage domain ++ * @param[in] voltageLevel Voltage level to set ++ * ++ * This function allows the caller to set the current level of ++ * a voltage domain. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a domainId is invalid. ++ * - ::SM_ERR_INVALID_PARAMETERS: if \a voltageLevel is negative. ++ * - other from BRD_SM_SupplyLevelSet() ++ */ ++int32_t BRD_SM_VoltageLevelSet(uint32_t domainId, int32_t voltageLevel); ++ ++/*! ++ * Get a board voltage level. ++ * ++ * @param[in] domainId Identifier for the voltage domain ++ * @param[out] voltageLevel Pointer to return the voltage level ++ * ++ * This function allows the caller to request the current level of ++ * a voltage domain. ++ * ++ * @return Returns the status (::SM_ERR_SUCCESS = success). ++ * ++ * Return errors (see @ref STATUS "SM error codes"): ++ * - ::SM_ERR_NOT_FOUND: if \a domainId is invalid. ++ * - other from BRD_SM_SupplyLevelGet() ++ */ ++int32_t BRD_SM_VoltageLevelGet(uint32_t domainId, int32_t *voltageLevel); ++ ++/*! ++ * Suspend voltage modes/levels. ++ * ++ * @param[in] offArm Turn off VDD_ARM if on ++ * ++ * This function saves and disabled the ARM voltage. ++ */ ++void BRD_SM_VoltageSuspend(bool offArm); ++ ++/*! ++ * Restore voltage modes/levels. ++ * ++ * This function writes the last set voltage levels back to the PMICs. ++ */ ++void BRD_SM_VoltageRestore(void); ++ ++#endif /* BRD_SM_VOLTAGE_H */ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk.cfg b/configs/ccimx95dvk.cfg +new file mode 100755 +index 000000000000..d05e1214df8a +--- /dev/null ++++ b/configs/ccimx95dvk.cfg +@@ -0,0 +1,997 @@ ++## ################################################################### ++## ++## Copyright 2023-2025 NXP ++## ++## Redistribution and use in source and binary forms, with or without modification, ++## are permitted provided that the following conditions are met: ++## ++## o Redistributions of source code must retain the above copyright notice, this list ++## of conditions and the following disclaimer. ++## ++## o Redistributions in binary form must reproduce the above copyright notice, this ++## list of conditions and the following disclaimer in the documentation and/or ++## other materials provided with the distribution. ++## ++## o Neither the name of the copyright holder nor the names of its ++## contributors may be used to endorse or promote products derived from this ++## software without specific prior written permission. ++## ++## 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 HOLDER 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. ++## ++## ++## ################################################################### ++ ++# SM configuration file for the MX95 EVK ++ ++MAKE soc=MIMX95, board=mcimx95evk, build=gcc_cross ++DOX name=MX95EVK, desc="i.MX95 EVK Configuration Data" ++ ++include ../devices/MIMX95/configtool/device.cfg ++ ++#==========================================================================# ++# Board # ++#==========================================================================# ++ ++BOARD DEBUG_UART_INSTANCE=2 ++BOARD DEBUG_UART_BAUDRATE=115200 ++ ++BOARD I2C_INSTANCE=1 ++BOARD I2C_BAUDRATE=400000 ++ ++#==========================================================================# ++# Common Defines # ++#==========================================================================# ++ ++NOTIFY: api=notify ++GET: api=get ++SET: api=set ++PRIV: api=priv ++ALL: api=all ++READONLY: perm=ro ++ ++#==========================================================================# ++# ELE Domain # ++#==========================================================================# ++ ++DOM0 did=0 ++ ++DATA: perm=rw ++ ++# Resources ++ ++# Memory ++ ++M33_TCM_SYS DATA, begin=0x020200000, size=256K ++OCRAM DATA, begin=0x020480000, size=352K ++DDR DATA, begin=0x080000000, end=0x87FFFFFFF, nodbg ++ ++#==========================================================================# ++# ISP Domain # ++#==========================================================================# ++ ++DOM10 did=10 ++ ++OWNER: perm=rw ++ ++#==========================================================================# ++# V2X Domain # ++#==========================================================================# ++ ++DOM12 did=12 ++ ++DFMT1: sa=bypass, pa=bypass ++OWNER: ++ ++# Resources ++ ++V2X_FH OWNER ++ ++# Memory ++ ++DDR DATA, begin=0x08B000000, end=0x08BFFFFFF, nodbg ++ ++#==========================================================================# ++# SM M33 EENV # ++#==========================================================================# ++ ++LM0 name="SM", rpc=none, boot=1, did=2, safe=feenv ++ ++DFMT0: sa=secure ++DFMT1: sa=secure, pa=privileged ++OWNER: perm=sec_rw, api=all ++ACCESS: perm=sec_rw, api=all, mdid=none ++TEST_MU: perm=sec_rw ++ ++EXEC: perm=sec_rwx ++DATA: perm=sec_rw ++ ++MODE msel=1, boot=1 ++MODE msel=2, boot=1 ++ ++# API ++ ++# Modified via PERF protocol ++CLK_A55MTRBUS ALL ++CLK_ADC ALL ++CLK_BUSAON ALL ++CLK_BUSM7 ALL ++CLK_BUSNETCMIX ALL ++CLK_BUSWAKEUP ALL ++CLK_CAMAPB ALL ++CLK_CAMAXI ALL ++CLK_CAMCM0 ALL ++CLK_CAMISI ALL ++CLK_DISPAPB ALL ++CLK_DISPAXI ALL ++CLK_ELE ALL ++CLK_ENET ALL ++CLK_ENETPHYTEST200M ALL ++CLK_ENETPHYTEST500M ALL ++CLK_ENETPHYTEST667M ALL ++CLK_FRO ALL ++CLK_GPU ALL ++CLK_GPUAPB ALL ++CLK_HSIO ALL ++CLK_HSIOACSCAN480M ALL ++CLK_HSIOACSCAN80M ALL ++CLK_HSIOPCIETEST160M ALL ++CLK_HSIOPCIETEST400M ALL ++CLK_HSIOPCIETEST500M ALL ++CLK_HSIOUSBTEST50M ALL ++CLK_HSIOUSBTEST60M ALL ++CLK_NOC ALL ++CLK_NOCAPB ALL ++CLK_NPU ALL ++CLK_NPUAPB ALL ++CLK_OSC24M ALL ++CLK_OSC32K ALL ++CLK_SYSPLL1_PFD0 ALL ++CLK_SYSPLL1_PFD0_DIV2 ALL ++CLK_SYSPLL1_PFD0_UNGATED ALL ++CLK_SYSPLL1_PFD1 ALL ++CLK_SYSPLL1_PFD1_DIV2 ALL ++CLK_SYSPLL1_PFD1_UNGATED ALL ++CLK_SYSPLL1_PFD2 ALL ++CLK_SYSPLL1_PFD2_DIV2 ALL ++CLK_SYSPLL1_PFD2_UNGATED ALL ++CLK_SYSPLL1_VCO ALL ++CLK_TEMPSENSE_GPR_SEL ALL ++CLK_TMU ALL ++CLK_V2XPK ALL ++CLK_VPU ALL ++CLK_VPUAPB ALL ++CLK_VPUJPEG ALL ++CLK_WAKEUPAXI ALL ++ ++# Resources ++ ++M33P OWNER # CPUs must be first ++ANATOP OWNER ++ATU_A OWNER ++ATU_M OWNER ++AXBS_AON OWNER ++BBNSM OWNER ++BLK_CTRL_BBSMMIX OWNER ++BLK_CTRL_DDRMIX OWNER ++BLK_CTRL_GPUMIX OWNER ++BLK_CTRL_NOCMIX OWNER ++BLK_CTRL_NS_AONMIX OWNER ++BLK_CTRL_S_AONMIX OWNER ++BLK_CTRL_WAKEUPMIX OWNER ++CCM OWNER ++DAP OWNER ++DDR_CTRL OWNER ++DDR_PHY OWNER ++DDR_PM OWNER ++DRAM_PLL OWNER ++ELE OWNER ++FSB READONLY ++GIC ACCESS ++GPC OWNER ++GPIO1 OWNER ++GPR0 OWNER ++GPR1 OWNER ++GPR2 OWNER ++GPR3 OWNER ++GPV_CAMERA OWNER ++GPV_CENTRAL OWNER ++GPV_DISPLAY OWNER ++GPV_HSIO OWNER ++GPV_MAIN OWNER ++GPV_MEGA OWNER ++GPV_VPU OWNER ++IOMUXC OWNER ++IOMUX_GPR OWNER ++JTAG OWNER ++LPI2C1 OWNER ++LPUART2 OWNER ++M33_CACHE_CTRL OWNER ++M33_PCF OWNER ++M33_PSF OWNER ++M33_TCM_ECC OWNER ++MU1_A TEST_MU ++MU1_B OWNER ++MU2_A TEST_MU ++MU2_B OWNER ++MU3_A TEST_MU ++MU3_B OWNER ++MU4_A TEST_MU ++MU4_B OWNER ++MU5_A TEST_MU ++MU5_B OWNER ++MU6_A TEST_MU ++MU6_B OWNER ++MU_ELE0 OWNER ++ROMCP_M33 OWNER ++SRAM_CTL_1 OWNER ++SRAM_CTL_N OWNER ++SRC OWNER ++SYSCTR_CTL OWNER ++SYSCTR_RD OWNER ++TEMP_A55 OWNER ++TRDC_A OWNER ++TRDC_C OWNER ++TRDC_D OWNER ++TRDC_E OWNER ++TRDC_G OWNER ++TRDC_H OWNER ++TRDC_M OWNER ++TRDC_N OWNER ++TRDC_V OWNER ++TRDC_W OWNER ++TSTMR1 OWNER ++WDOG1 OWNER ++WDOG2 OWNER ++ ++# SAF ++ ++CMU_A1 OWNER ++CMU_A2 OWNER ++CMU_ANA OWNER ++CMU_DDR1 OWNER ++CMU_DDR2 OWNER ++CMU_N1 OWNER ++CMU_N2 OWNER ++CMU_W1 OWNER ++CMU_W2 OWNER ++CRC_A OWNER ++C_STCU OWNER ++DMA_CRC OWNER ++EIM_A OWNER ++EIM_N OWNER ++EIM_NPU OWNER ++EIM_W OWNER ++ERM_A OWNER ++ERM_NPU OWNER ++ERM_W OWNER ++FCCU OWNER ++FCCU_FHID OWNER ++INTM OWNER ++L_STCU_A OWNER ++L_STCU_DDR OWNER ++L_STCU_N OWNER ++L_STCU_NPUMIX OWNER ++ ++# Pins ++ ++PIN_FCCU_ERR0 OWNER ++PIN_I2C1_SCL OWNER ++PIN_I2C1_SDA OWNER ++PIN_PDM_BIT_STREAM1 OWNER ++PIN_UART2_RXD OWNER ++PIN_UART2_TXD OWNER ++PIN_WDOG_ANY OWNER ++ ++# Memory ++ ++M33_ROM EXEC, begin=0x000000000, end=0x00003FFFF ++M33_TCM_CODE EXEC, begin=0x0201C0000, size=256K ++M33_TCM_SYS EXEC, begin=0x020200000, size=256K ++M7MIX DATA, begin=0x04A050000, end=0x04A0AFFFF ++ ++# Faults ++ ++FAULT_SW3 OWNER, reaction=grp_reset ++FAULT_SW4 OWNER, reaction=sys_reset ++ ++#==========================================================================# ++# M7 EENV # ++#==========================================================================# ++ ++LM1 name="M7", rpc=scmi, boot=2, skip=1, did=4, safe=seenv ++ ++DFMT0: sa=secure ++DFMT1: sa=secure, pa=privileged ++OWNER: perm=rw, api=all ++ ++EXEC: perm=full ++DATA: perm=rw ++ ++# Start/Stop (mSel=0) ++ ++PD_M7 start=1, stop=2 ++CPU_M7P start=2, stop=1 ++ ++# Start/Stop (mSel=1) ++ ++MODE msel=1, boot=2 ++ ++PD_M7 msel=1, start=1, stop=2 ++CPU_M7P msel=1, start=2, stop=1 ++ ++# Start/Stop (mSel=2) ++ ++PD_M7 msel=2, start=1, stop=2 ++CPU_M7P msel=2, start=2, stop=1 ++ ++# RPC Interface ++ ++SCMI_AGENT0 name="M7" ++MAILBOX type=mu, mu=9, test=8, priority=high ++CHANNEL db=0, xport=smt, check=crc32, rpc=scmi, type=a2p, \ ++ test=default ++CHANNEL db=1, xport=smt, check=crc32, rpc=scmi, \ ++ type=p2a_notify, notify=24 ++CHANNEL db=2, xport=smt, check=crc32, rpc=scmi, \ ++ type=p2a_priority ++ ++# API ++ ++BRD_SM_CTRL_BUTTON NOTIFY ++BRD_SM_CTRL_PCA2131 ALL ++BRD_SM_CTRL_TEST ALL ++BRD_SM_RTC_PCA2131 ALL ++BRD_SM_SENSOR_TEMP_PF09 SET ++BRD_SM_SENSOR_TEMP_PF5301 SET ++BRD_SM_SENSOR_TEMP_PF5302 SET ++BUTTON NOTIFY ++FUSA ALL ++LMM_2 ALL ++RTC PRIV ++SENSOR_TEMP_ANA ALL, test ++SYS ALL ++ ++# Resources ++ ++M7P OWNER # CPUs must be first ++CAN_FD1 OWNER ++FSB READONLY ++IRQSTEER_M7 OWNER ++LPIT1 OWNER ++LPTMR1 OWNER ++LPTMR2 OWNER ++LPTPM1 OWNER ++LPUART3 OWNER, test ++MSGINTR1 OWNER ++MSGINTR2 OWNER ++MU5_A OWNER ++MU7_B OWNER ++MU8_B OWNER ++MU_ELE5 OWNER ++PD_M7 test ++SYSCTR_RD READONLY ++TSTMR2 OWNER ++V2X_SHE1 OWNER ++WDOG5 OWNER ++ ++# Pins ++ ++PIN_GPIO_IO14 OWNER ++PIN_GPIO_IO15 OWNER ++ ++# Memory ++ ++M7MIX DATA, begin=0x020380000, end=0x02047FFFF ++M7MIX DATA, begin=0x04A060000, end=0x04A09FFFF ++DDR EXEC, begin=0x080000000, end=0x089FFFFFF ++ ++# Faults ++ ++FAULT_M7_LOCKUP OWNER, reaction=lm_reset ++FAULT_M7_RESET OWNER, reaction=lm_reset ++FAULT_SW0 OWNER, reaction=fusa ++FAULT_SW1 OWNER, reaction=lm_reset ++FAULT_WDOG5 OWNER, reaction=lm_reset ++ ++#==========================================================================# ++# A55 secure EENV # ++#==========================================================================# ++ ++LM2 name="AP", rpc=scmi, boot=3, skip=1, did=3, default ++ ++DFMT0: sa=bypass ++DFMT1: sa=secure, pa=privileged ++OWNER: perm=sec_rw, api=all ++ ++EXEC: perm=sec_rwx ++DATA: perm=rw ++ ++# Start/Stop (mSel=0) ++ ++VOLT_ARM start=1|1, stop=9 ++PD_A55P start=2, stop=8, test ++PD_A55C0 stop=7 ++PD_A55C1 stop=6 ++PD_A55C2 stop=5 ++PD_A55C3 stop=4 ++PD_A55C4 stop=3 ++PD_A55C5 stop=2 ++PERF_A55 start=3|3 ++CPU_A55C0 start=4 ++CPU_A55P stop=1 ++ ++# Start/Stop (mSel=1) ++ ++VOLT_ARM msel=1, start=1|1, stop=9 ++PD_A55P msel=1, start=2, stop=8 ++PD_A55C0 msel=1, stop=7 ++PD_A55C1 msel=1, stop=6 ++PD_A55C2 msel=1, stop=5 ++PD_A55C3 msel=1, stop=4 ++PD_A55C4 msel=1, stop=3 ++PD_A55C5 msel=1, stop=2 ++PERF_A55 msel=1, start=3|3 ++CPU_A55C0 msel=1, start=4 ++CPU_A55P msel=1, stop=1 ++ ++# Start/Stop (mSel=2) ++ ++VOLT_ARM msel=2, start=1|1, stop=9 ++PD_A55P msel=2, start=2, stop=8 ++PD_A55C0 msel=2, stop=7 ++PD_A55C1 msel=2, stop=6 ++PD_A55C2 msel=2, stop=5 ++PD_A55C3 msel=2, stop=4 ++PD_A55C4 msel=2, stop=3 ++PD_A55C5 msel=2, stop=2 ++PERF_A55 msel=2, start=3|3 ++CPU_A55C0 msel=2, start=4 ++CPU_A55P msel=2, stop=1 ++ ++# RPC Interface ++ ++SCMI_AGENT1 name="AP-S", secure ++MAILBOX type=mu, mu=1, test=0 ++CHANNEL db=0, xport=smt, rpc=scmi, type=a2p ++CHANNEL db=1, xport=smt, rpc=scmi, type=p2a_notify ++ ++# API ++ ++PERF_A55 ALL ++PERF_DRAM ALL ++PERLPI_CAN2 ALL ++PERLPI_CAN3 ALL ++PERLPI_CAN4 ALL ++PERLPI_CAN5 ALL ++PERLPI_GPIO2 ALL ++PERLPI_GPIO3 ALL ++PERLPI_GPIO4 ALL ++PERLPI_GPIO5 ALL ++PERLPI_LPUART1 ALL ++PERLPI_LPUART4 ALL ++PERLPI_LPUART5 ALL ++PERLPI_LPUART6 ALL ++PERLPI_LPUART7 ALL ++PERLPI_LPUART8 ALL ++PERLPI_WDOG3 ALL ++PERLPI_WDOG4 ALL ++SYS ALL ++ ++# Resources ++ ++A55C0 OWNER # CPUs must be first ++A55C1 OWNER # CPUs must be first ++A55C2 OWNER # CPUs must be first ++A55C3 OWNER # CPUs must be first ++A55C4 OWNER # CPUs must be first ++A55C5 OWNER # CPUs must be first ++A55P OWNER, sema=0x442313F8 ++ARM_PLL OWNER ++MU1_A OWNER ++MU_ELE1 OWNER ++MU_ELE2 OWNER ++ ++# Pins ++ ++# Memory ++ ++OCRAM EXEC, begin=0x020480000, size=256K ++DDR EXEC, begin=0x08A000000, end=0x08DFFFFFF ++ ++# Faults ++ ++FAULT_SW2 OWNER, reaction=lm_reset ++FAULT_WDOG3 OWNER, reaction=lm_reset ++FAULT_WDOG4 OWNER, reaction=lm_reset ++ ++#==========================================================================# ++# A55 non-secure EENV # ++#==========================================================================# ++ ++DFMT0: sa=nonsecure ++DFMT1: sa=nonsecure, pa=privileged ++ ++OWNER: perm=rw, api=all ++ACCESS: perm=rw, api=all, mdid=none ++ ++EXEC: perm=full ++DATA: perm=rw ++ ++# RPC Interface ++ ++SCMI_AGENT2 name="AP-NS" ++MAILBOX type=mu, mu=3, test=2 ++CHANNEL db=0, xport=smt, rpc=scmi, type=a2p ++CHANNEL db=1, xport=smt, rpc=scmi, type=p2a_notify ++ ++# API ++ ++AUDIO_PLL1 ALL ++AUDIO_PLL2 ALL ++BRD_SM_CTRL_BT_WAKE NOTIFY ++BRD_SM_CTRL_BUTTON NOTIFY ++BRD_SM_CTRL_PCIE1_WAKE NOTIFY ++BRD_SM_CTRL_PCIE2_WAKE NOTIFY ++BRD_SM_CTRL_SD3_WAKE NOTIFY ++BRD_SM_RTC_PCA2131 PRIV ++BRD_SM_SENSOR_TEMP_PF09 ALL ++BRD_SM_SENSOR_TEMP_PF5301 SET ++BRD_SM_SENSOR_TEMP_PF5302 SET ++BUTTON ALL, test ++CLOCK_DISP1PIX ALL ++CLOCK_DISP2PIX ALL ++CLOCK_DISP3PIX ALL ++CLOCK_EXT ALL ++CLOCK_EXT1 ALL ++CLOCK_EXT2 ALL ++CLOCK_HSIOPCIEAUX ALL ++CLOCK_OUT1 ALL ++CLOCK_OUT2 ALL ++CLOCK_OUT3 ALL ++CLOCK_OUT4 ALL ++CLOCK_USBPHYBURUNIN ALL ++CLOCK_VPUDSP ALL ++HSIO_PLL ALL ++LDB_PLL ALL ++LMM_1 NOTIFY ++PERF_A55 ALL ++PERF_DRAM ALL ++RTC ALL, test ++SENSOR_TEMP_A55 ALL ++SENSOR_TEMP_ANA SET ++SYS NOTIFY ++ ++# Resources ++ ++ADC OWNER ++BLK_CTRL_CAMERAMIX OWNER ++BLK_CTRL_DISPLAYMIX OWNER ++BLK_CTRL_HSIOMIX OWNER ++BLK_CTRL_NETCMIX OWNER ++BLK_CTRL_NPUMIX OWNER ++BLK_CTRL_VPUMIX OWNER ++CAMERA1 OWNER ++CAMERA2 OWNER ++CAMERA3 OWNER ++CAMERA4 OWNER ++CAMERA5 OWNER ++CAMERA6 OWNER ++CAMERA7 OWNER ++CAMERA8 OWNER ++CAN_FD2 OWNER ++CAN_FD3 OWNER ++CAN_FD4 OWNER ++CAN_FD5 OWNER ++DC OWNER, test ++DC0 OWNER ++DC1 OWNER ++DC_2DBLIT OWNER ++DC_BLITINT OWNER ++DC_CMDSEQ OWNER ++DC_DISPENG OWNER ++DC_DISPENG_INT OWNER ++DC_FL0 OWNER ++DC_FL1 OWNER ++DC_INT_CTL OWNER ++DC_PIXENGINE OWNER ++DC_XPC OWNER ++DC_YUV0 OWNER ++DC_YUV1 OWNER ++DC_YUV2 OWNER ++DC_YUV3 OWNER ++DDR_PM ACCESS ++EDMA1_MP OWNER ++EDMA1_CH0 OWNER ++EDMA1_CH1 OWNER ++EDMA1_CH2 OWNER ++EDMA1_CH3 OWNER ++EDMA1_CH4 OWNER ++EDMA1_CH5 OWNER ++EDMA1_CH6 OWNER ++EDMA1_CH7 OWNER ++EDMA1_CH8 OWNER ++EDMA1_CH9 OWNER ++EDMA1_CH10 OWNER ++EDMA1_CH11 OWNER ++EDMA1_CH12 OWNER ++EDMA1_CH13 OWNER ++EDMA1_CH14 OWNER ++EDMA1_CH15 OWNER ++EDMA1_CH16 OWNER ++EDMA1_CH17 OWNER ++EDMA1_CH18 OWNER ++EDMA1_CH19 OWNER ++EDMA1_CH20 OWNER ++EDMA1_CH21 OWNER ++EDMA1_CH22 OWNER ++EDMA1_CH23 OWNER ++EDMA1_CH24 OWNER ++EDMA1_CH25 OWNER ++EDMA1_CH26 OWNER ++EDMA1_CH27 OWNER ++EDMA1_CH28 OWNER ++EDMA1_CH29 OWNER ++EDMA1_CH30 OWNER ++EDMA1_CH31 OWNER ++EDMA2_MP OWNER ++EDMA2_CH0_1 OWNER ++EDMA2_CH2_3 OWNER ++EDMA2_CH4_5 OWNER ++EDMA2_CH6_7 OWNER ++EDMA2_CH8_9 OWNER ++EDMA2_CH10_11 OWNER ++EDMA2_CH12_13 OWNER ++EDMA2_CH14_15 OWNER ++EDMA2_CH16_17 OWNER ++EDMA2_CH18_19 OWNER ++EDMA2_CH20_21 OWNER ++EDMA2_CH22_23 OWNER ++EDMA2_CH24_25 OWNER ++EDMA2_CH26_27 OWNER ++EDMA2_CH28_29 OWNER ++EDMA2_CH30_31 OWNER ++EDMA2_CH32_33 OWNER ++EDMA2_CH34_35 OWNER ++EDMA2_CH36_37 OWNER ++EDMA2_CH38_39 OWNER ++EDMA2_CH40_41 OWNER ++EDMA2_CH42_43 OWNER ++EDMA2_CH44_45 OWNER ++EDMA2_CH46_47 OWNER ++EDMA2_CH48_49 OWNER ++EDMA2_CH50_51 OWNER ++EDMA2_CH52_53 OWNER ++EDMA2_CH54_55 OWNER ++EDMA2_CH56_57 OWNER ++EDMA2_CH58_59 OWNER ++EDMA2_CH60_61_A OWNER ++EDMA2_CH60_61_B OWNER ++EDMA2_CH62_63_A OWNER ++EDMA2_CH62_63_B OWNER ++EDMA3_MP OWNER ++EDMA3_CH0_1 OWNER ++EDMA3_CH2_3 OWNER ++EDMA3_CH4_5 OWNER ++EDMA3_CH6_7 OWNER ++EDMA3_CH8_9 OWNER ++EDMA3_CH10_11 OWNER ++EDMA3_CH12_13 OWNER ++EDMA3_CH14_15 OWNER ++EDMA3_CH16_17 OWNER ++EDMA3_CH18_19 OWNER ++EDMA3_CH20_21 OWNER ++EDMA3_CH22_23 OWNER ++EDMA3_CH24_25 OWNER ++EDMA3_CH26_27 OWNER ++EDMA3_CH28_29 OWNER ++EDMA3_CH30_31 OWNER ++EDMA3_CH32_33 OWNER ++EDMA3_CH34_35 OWNER ++EDMA3_CH36_37 OWNER ++EDMA3_CH38_39 OWNER ++EDMA3_CH40_41 OWNER ++EDMA3_CH42_43 OWNER ++EDMA3_CH44_45 OWNER ++EDMA3_CH46_47 OWNER ++EDMA3_CH48_49 OWNER ++EDMA3_CH50_51 OWNER ++EDMA3_CH52_53 OWNER ++EDMA3_CH54_55 OWNER ++EDMA3_CH56_57 OWNER ++EDMA3_CH58_59 OWNER ++EDMA3_CH60_61 OWNER ++EDMA3_CH62_63 OWNER ++FLEXIO1 OWNER ++FLEXIO2 OWNER ++FLEXSPI1 OWNER ++FSB READONLY ++GIC OWNER ++GPIO2 OWNER ++GPIO3 OWNER ++GPIO4 OWNER ++GPIO5 OWNER ++GPR4 OWNER, test ++GPR5 OWNER ++GPR6 OWNER ++GPR7 OWNER ++GPU_NPROT OWNER ++GPU_PROT OWNER, test ++I3C1 OWNER ++I3C2 OWNER ++ISI1 OWNER ++ISI2 OWNER ++ISI3 OWNER ++ISI4 OWNER ++ISI5 OWNER ++ISI6 OWNER ++ISI7 OWNER ++ISI8 OWNER ++ISP_CPU OWNER ++ISP_MGR OWNER, test ++JPEG_DEC OWNER ++LPI2C2 OWNER ++LPI2C3 OWNER ++LPI2C4 OWNER ++LPI2C5 OWNER ++LPI2C6 OWNER ++LPI2C7 OWNER ++LPI2C8 OWNER ++LPIT2 OWNER ++LPSPI1 OWNER ++LPSPI2 OWNER ++LPSPI3 OWNER ++LPSPI4 OWNER ++LPSPI5 OWNER ++LPSPI6 OWNER ++LPSPI7 OWNER ++LPSPI8 OWNER ++LPTPM2 OWNER ++LPTPM3 OWNER ++LPTPM4 OWNER ++LPTPM5 OWNER ++LPTPM6 OWNER ++LPUART1 OWNER ++LPUART4 OWNER ++LPUART5 OWNER ++LPUART6 OWNER ++LPUART7 OWNER ++LPUART8 OWNER, test ++LVDS OWNER ++MIPI_CSI0 OWNER ++MIPI_CSI1 OWNER ++MIPI_DSI OWNER ++MIPI_PHY OWNER ++MJPEG_DEC1 OWNER ++MJPEG_DEC2 OWNER ++MJPEG_DEC3 OWNER ++MJPEG_DEC4 OWNER ++MJPEG_ENC OWNER ++MJPEG_ENC1 OWNER ++MJPEG_ENC2 OWNER ++MJPEG_ENC3 OWNER ++MJPEG_ENC4 OWNER ++MU2_A OWNER ++MU3_A OWNER ++MU4_A OWNER ++MU6_A OWNER ++MU7_A OWNER ++MU8_A OWNER ++MU_ELE3 OWNER ++MU_ELE4 OWNER ++NETC OWNER, test ++NETC0 OWNER ++NETC1 OWNER ++NETC2 OWNER ++NETC_ECAM OWNER ++NETC_EMDIO0 OWNER ++NETC_IERB OWNER ++NETC_LDID1 OWNER, kpa=0, sid=0x20 ++NETC_LDID2 OWNER, kpa=0, sid=0x21 ++NETC_LDID3 OWNER, kpa=0, sid=0x22 ++NETC_LDID4 OWNER, kpa=0, sid=0x23 ++NETC_LDID5 OWNER, kpa=0, sid=0x24 ++NETC_LDID6 OWNER, kpa=0, sid=0x25 ++NETC_LDID7 OWNER, kpa=0, sid=0x26 ++NETC_LDID8 OWNER, kpa=0, sid=0x27 ++NETC_PRB OWNER ++NETC_TIMER0 OWNER ++NETC_VSI0 OWNER ++NETC_VSI1 OWNER ++NETC_VSI2 OWNER ++NETC_VSI3 OWNER ++NETC_VSI4 OWNER ++NETC_VSI5 OWNER ++NPU OWNER, kpa=0, sid=0x0d, test ++PCI1_LUT0 OWNER, kpa=0, sid=0x10 ++PCI1_LUT1 OWNER, kpa=0, sid=0x11 ++PCI1_LUT2 OWNER, kpa=0, sid=0x12 ++PCI1_LUT3 OWNER, kpa=0, sid=0x13 ++PCI1_LUT4 OWNER, kpa=0, sid=0x14 ++PCI1_LUT5 OWNER, kpa=0, sid=0x15 ++PCI1_LUT6 OWNER, kpa=0, sid=0x16 ++PCI1_LUT7 OWNER, kpa=0, sid=0x17 ++PCI2_LUT0 OWNER, kpa=0, sid=0x18 ++PCI2_LUT1 OWNER, kpa=0, sid=0x19 ++PCI2_LUT2 OWNER, kpa=0, sid=0x1a ++PCI2_LUT3 OWNER, kpa=0, sid=0x1b ++PCI2_LUT4 OWNER, kpa=0, sid=0x1c ++PCI2_LUT5 OWNER, kpa=0, sid=0x1d ++PCI2_LUT6 OWNER, kpa=0, sid=0x1e ++PCI2_LUT7 OWNER, kpa=0, sid=0x1f ++PCIE1_OUT OWNER ++PCIE1_ROOT OWNER ++PCIE2_OUT OWNER ++PCIE2_ROOT OWNER ++PDM OWNER ++SAI1 OWNER, test ++SAI2 OWNER ++SAI3 OWNER ++SAI4 OWNER ++SAI5 OWNER ++SEMA41 OWNER ++SEMA42 OWNER ++SMMU OWNER ++SPDIF1 OWNER ++SYSCTR_CMP OWNER ++SYSCTR_RD_STOP READONLY ++USB1 OWNER, kpa=0, sid=0xe, test ++USB2 OWNER, kpa=0, sid=0xf ++USDHC1 OWNER, kpa=0, sid=0x1 ++USDHC2 OWNER, kpa=0, sid=0x2 ++USDHC3 OWNER, kpa=0, sid=0x3 ++V2X_APP0 OWNER ++V2X_DEBUG OWNER ++V2X_HSM1 OWNER ++V2X_HSM2 OWNER ++V2X_SHE0 OWNER ++VIDEO_PLL1 OWNER ++VPU OWNER, test ++VPU1 OWNER ++VPU2 OWNER ++VPU3 OWNER ++VPU4 OWNER ++WDOG3 OWNER ++WDOG4 OWNER ++XSPI OWNER ++ ++# Pins ++ ++PIN_CCM_CLKO1 OWNER ++PIN_CCM_CLKO2 OWNER ++PIN_CCM_CLKO3 OWNER ++PIN_CCM_CLKO4 OWNER ++PIN_DAP_TCLK_SWCLK OWNER ++PIN_DAP_TDI OWNER ++PIN_DAP_TDO_TRACESWO OWNER ++PIN_DAP_TMS_SWDIO OWNER ++PIN_ENET1_MDC OWNER ++PIN_ENET1_MDIO OWNER ++PIN_ENET1_RD0 OWNER ++PIN_ENET1_RD1 OWNER ++PIN_ENET1_RD2 OWNER ++PIN_ENET1_RD3 OWNER ++PIN_ENET1_RX_CTL OWNER ++PIN_ENET1_RXC OWNER ++PIN_ENET1_TD0 OWNER ++PIN_ENET1_TD1 OWNER ++PIN_ENET1_TD2 OWNER ++PIN_ENET1_TD3 OWNER ++PIN_ENET1_TX_CTL OWNER ++PIN_ENET1_TXC OWNER ++PIN_ENET2_MDC OWNER ++PIN_ENET2_MDIO OWNER ++PIN_ENET2_RD0 OWNER ++PIN_ENET2_RD1 OWNER ++PIN_ENET2_RD2 OWNER ++PIN_ENET2_RD3 OWNER ++PIN_ENET2_RX_CTL OWNER ++PIN_ENET2_RXC OWNER ++PIN_ENET2_TD0 OWNER ++PIN_ENET2_TD1 OWNER ++PIN_ENET2_TD2 OWNER ++PIN_ENET2_TD3 OWNER ++PIN_ENET2_TX_CTL OWNER ++PIN_ENET2_TXC OWNER ++PIN_GPIO_IO00 OWNER ++PIN_GPIO_IO01 OWNER ++PIN_GPIO_IO02 OWNER ++PIN_GPIO_IO03 OWNER ++PIN_GPIO_IO04 OWNER ++PIN_GPIO_IO05 OWNER ++PIN_GPIO_IO06 OWNER ++PIN_GPIO_IO07 OWNER ++PIN_GPIO_IO08 OWNER ++PIN_GPIO_IO09 OWNER ++PIN_GPIO_IO10 OWNER ++PIN_GPIO_IO11 OWNER ++PIN_GPIO_IO12 OWNER ++PIN_GPIO_IO13 OWNER ++PIN_GPIO_IO16 OWNER ++PIN_GPIO_IO17 OWNER ++PIN_GPIO_IO18 OWNER ++PIN_GPIO_IO19 OWNER ++PIN_GPIO_IO20 OWNER ++PIN_GPIO_IO21 OWNER ++PIN_GPIO_IO22 OWNER ++PIN_GPIO_IO23 OWNER ++PIN_GPIO_IO24 OWNER ++PIN_GPIO_IO25 OWNER ++PIN_GPIO_IO26 OWNER ++PIN_GPIO_IO27 OWNER ++PIN_GPIO_IO28 OWNER ++PIN_GPIO_IO29 OWNER ++PIN_GPIO_IO30 OWNER ++PIN_GPIO_IO31 OWNER ++PIN_GPIO_IO32 OWNER ++PIN_GPIO_IO33 OWNER ++PIN_GPIO_IO34 OWNER ++PIN_GPIO_IO35 OWNER ++PIN_GPIO_IO36 OWNER ++PIN_GPIO_IO37 OWNER ++PIN_I2C2_SCL OWNER ++PIN_I2C2_SDA OWNER ++PIN_PDM_BIT_STREAM0 OWNER ++PIN_PDM_CLK OWNER ++PIN_SAI1_RXD0 OWNER ++PIN_SAI1_TXC OWNER ++PIN_SAI1_TXD0 OWNER ++PIN_SAI1_TXFS OWNER ++PIN_SD1_CLK OWNER ++PIN_SD1_CMD OWNER ++PIN_SD1_DATA0 OWNER ++PIN_SD1_DATA1 OWNER ++PIN_SD1_DATA2 OWNER ++PIN_SD1_DATA3 OWNER ++PIN_SD1_DATA4 OWNER ++PIN_SD1_DATA5 OWNER ++PIN_SD1_DATA6 OWNER ++PIN_SD1_DATA7 OWNER ++PIN_SD1_STROBE OWNER ++PIN_SD2_CD_B OWNER ++PIN_SD2_CLK OWNER ++PIN_SD2_CMD OWNER ++PIN_SD2_DATA0 OWNER ++PIN_SD2_DATA1 OWNER ++PIN_SD2_DATA2 OWNER ++PIN_SD2_DATA3 OWNER ++PIN_SD2_RESET_B OWNER ++PIN_SD2_VSELECT OWNER ++PIN_SD3_CLK OWNER ++PIN_SD3_CMD OWNER ++PIN_SD3_DATA0 OWNER ++PIN_SD3_DATA1 OWNER ++PIN_SD3_DATA2 OWNER ++PIN_SD3_DATA3 OWNER ++PIN_UART1_RXD OWNER, test ++PIN_UART1_TXD OWNER ++PIN_XSPI1_DATA0 OWNER ++PIN_XSPI1_DATA1 OWNER ++PIN_XSPI1_DATA2 OWNER ++PIN_XSPI1_DATA3 OWNER ++PIN_XSPI1_DATA4 OWNER ++PIN_XSPI1_DATA5 OWNER ++PIN_XSPI1_DATA6 OWNER ++PIN_XSPI1_DATA7 OWNER ++PIN_XSPI1_DQS OWNER ++PIN_XSPI1_SCLK OWNER ++PIN_XSPI1_SS0_B OWNER ++PIN_XSPI1_SS1_B OWNER ++ ++# Memory ++ ++FLEXSPI1_MEM EXEC, begin=0x000000000, end=0x0FFFFFFFF ++OCRAM_C EXEC, begin=0x001000000, end=0x001017FFF ++OCRAM EXEC, begin=0x0204C0000, size=96K ++GPU DATA, begin=0x04D900000, end=0x04DD7FFFF ++DDR EXEC, begin=0x088000000, end=0x089FFFFFF ++DDR EXEC, begin=0x08E000000, end=0x87FFFFFFF ++ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0002-ccimx95dvk-configure-board-and-switch-debug-UART-to-.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0002-ccimx95dvk-configure-board-and-switch-debug-UART-to-.patch new file mode 100644 index 000000000..5a4f9b775 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0002-ccimx95dvk-configure-board-and-switch-debug-UART-to-.patch @@ -0,0 +1,3541 @@ +From: Javier Viguera +Date: Mon, 15 Sep 2025 12:17:01 +0200 +Subject: [PATCH] ccimx95dvk: configure board and switch debug UART to LPUART7 + +Assign the UART7 resources to the M33 CPU and the UART2 resources to the +AP CPU. + +Generate configuration tree (configs/ccimx95dvk) with: + + make CONFIG=ccimx95dvk cfg + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Javier Viguera +--- + boards/ccimx95dvk/pin_mux.c | 7 + + configs/ccimx95dvk.cfg | 18 +- + configs/ccimx95dvk/config.dox | 49 + + configs/ccimx95dvk/config.mak | 44 + + configs/ccimx95dvk/config_bctrl.h | 100 +++ + configs/ccimx95dvk/config_board.h | 69 ++ + configs/ccimx95dvk/config_dev.h | 65 ++ + configs/ccimx95dvk/config_lmm.h | 223 +++++ + configs/ccimx95dvk/config_mb_mu.h | 118 +++ + configs/ccimx95dvk/config_scmi.h | 695 +++++++++++++++ + configs/ccimx95dvk/config_smt.h | 168 ++++ + configs/ccimx95dvk/config_test.h | 197 +++++ + configs/ccimx95dvk/config_trdc.h | 1373 +++++++++++++++++++++++++++++ + configs/ccimx95dvk/config_user.h | 230 +++++ + 14 files changed, 3346 insertions(+), 10 deletions(-) + create mode 100644 configs/ccimx95dvk/config.dox + create mode 100644 configs/ccimx95dvk/config.mak + create mode 100644 configs/ccimx95dvk/config_bctrl.h + create mode 100644 configs/ccimx95dvk/config_board.h + create mode 100644 configs/ccimx95dvk/config_dev.h + create mode 100644 configs/ccimx95dvk/config_lmm.h + create mode 100644 configs/ccimx95dvk/config_mb_mu.h + create mode 100644 configs/ccimx95dvk/config_scmi.h + create mode 100644 configs/ccimx95dvk/config_smt.h + create mode 100644 configs/ccimx95dvk/config_test.h + create mode 100644 configs/ccimx95dvk/config_trdc.h + create mode 100644 configs/ccimx95dvk/config_user.h + +diff --git a/boards/ccimx95dvk/pin_mux.c b/boards/ccimx95dvk/pin_mux.c +index b40d897fbcdc..60f6d27c41c5 100755 +--- a/boards/ccimx95dvk/pin_mux.c ++++ b/boards/ccimx95dvk/pin_mux.c +@@ -29,6 +29,13 @@ void BOARD_InitPins(void) + + IOMUXC_SetPinMux(IOMUXC_PAD_UART2_TXD__LPUART2_TX, 0); + IOMUXC_SetPinConfig(IOMUXC_PAD_UART2_TXD__LPUART2_TX, IOMUXC_PAD_DSE(0xFU)); ++#elif (BOARD_DEBUG_UART_INSTANCE == 7U) ++ /* Configure LPUART 7 */ ++ IOMUXC_SetPinMux(IOMUXC_PAD_GPIO_IO09__LPUART7_RX, 0); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_GPIO_IO09__LPUART7_RX, IOMUXC_PAD_PD(1U)); ++ ++ IOMUXC_SetPinMux(IOMUXC_PAD_GPIO_IO08__LPUART7_TX, 0); ++ IOMUXC_SetPinConfig(IOMUXC_PAD_GPIO_IO08__LPUART7_TX, IOMUXC_PAD_DSE(0xFU)); + #endif + + #if (BOARD_I2C_INSTANCE == 1U) +diff --git a/configs/ccimx95dvk.cfg b/configs/ccimx95dvk.cfg +index d05e1214df8a..da383aab036c 100755 +--- a/configs/ccimx95dvk.cfg ++++ b/configs/ccimx95dvk.cfg +@@ -32,8 +32,8 @@ + + # SM configuration file for the MX95 EVK + +-MAKE soc=MIMX95, board=mcimx95evk, build=gcc_cross +-DOX name=MX95EVK, desc="i.MX95 EVK Configuration Data" ++MAKE soc=MIMX95, board=ccimx95dvk, build=gcc_cross ++DOX name=CCIMX95DVK, desc="ConnectCore 95 DVK Configuration Data" + + include ../devices/MIMX95/configtool/device.cfg + +@@ -41,7 +41,7 @@ include ../devices/MIMX95/configtool/device.cfg + # Board # + #==========================================================================# + +-BOARD DEBUG_UART_INSTANCE=2 ++BOARD DEBUG_UART_INSTANCE=7 + BOARD DEBUG_UART_BAUDRATE=115200 + + BOARD I2C_INSTANCE=1 +@@ -213,7 +213,7 @@ IOMUXC OWNER + IOMUX_GPR OWNER + JTAG OWNER + LPI2C1 OWNER +-LPUART2 OWNER ++LPUART7 OWNER + M33_CACHE_CTRL OWNER + M33_PCF OWNER + M33_PSF OWNER +@@ -287,8 +287,8 @@ PIN_FCCU_ERR0 OWNER + PIN_I2C1_SCL OWNER + PIN_I2C1_SDA OWNER + PIN_PDM_BIT_STREAM1 OWNER +-PIN_UART2_RXD OWNER +-PIN_UART2_TXD OWNER ++PIN_GPIO_IO08 OWNER # LPUART7_TX ++PIN_GPIO_IO09 OWNER # LPUART7_RX + PIN_WDOG_ANY OWNER + + # Memory +@@ -477,10 +477,10 @@ PERLPI_GPIO3 ALL + PERLPI_GPIO4 ALL + PERLPI_GPIO5 ALL + PERLPI_LPUART1 ALL ++PERLPI_LPUART2 ALL + PERLPI_LPUART4 ALL + PERLPI_LPUART5 ALL + PERLPI_LPUART6 ALL +-PERLPI_LPUART7 ALL + PERLPI_LPUART8 ALL + PERLPI_WDOG3 ALL + PERLPI_WDOG4 ALL +@@ -760,10 +760,10 @@ LPTPM4 OWNER + LPTPM5 OWNER + LPTPM6 OWNER + LPUART1 OWNER ++LPUART2 OWNER + LPUART4 OWNER + LPUART5 OWNER + LPUART6 OWNER +-LPUART7 OWNER + LPUART8 OWNER, test + LVDS OWNER + MIPI_CSI0 OWNER +@@ -909,8 +909,6 @@ PIN_GPIO_IO04 OWNER + PIN_GPIO_IO05 OWNER + PIN_GPIO_IO06 OWNER + PIN_GPIO_IO07 OWNER +-PIN_GPIO_IO08 OWNER +-PIN_GPIO_IO09 OWNER + PIN_GPIO_IO10 OWNER + PIN_GPIO_IO11 OWNER + PIN_GPIO_IO12 OWNER +diff --git a/configs/ccimx95dvk/config.dox b/configs/ccimx95dvk/config.dox +new file mode 100644 +index 000000000000..09aa69cf4697 +--- /dev/null ++++ b/configs/ccimx95dvk/config.dox +@@ -0,0 +1,49 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*! ++ * @addtogroup SM_CONFIG ++ * @{ ++ */ ++ ++/*! ++ ++@defgroup CONFIG_CCIMX95DVK CONFIG_CCIMX95DVK: ConnectCore 95 DVK Configuration Data ++ ++@brief Module for ConnectCore 95 DVK Configuration Data. ++ ++*/ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk/config.mak b/configs/ccimx95dvk/config.mak +new file mode 100644 +index 000000000000..01730d54a9b3 +--- /dev/null ++++ b/configs/ccimx95dvk/config.mak +@@ -0,0 +1,44 @@ ++## ################################################################### ++## ++## Copyright 2023-2025 NXP ++## ++## Redistribution and use in source and binary forms, with or without modification, ++## are permitted provided that the following conditions are met: ++## ++## o Redistributions of source code must retain the above copyright notice, this list ++## of conditions and the following disclaimer. ++## ++## o Redistributions in binary form must reproduce the above copyright notice, this ++## list of conditions and the following disclaimer in the documentation and/or ++## other materials provided with the distribution. ++## ++## o Neither the name of the copyright holder nor the names of its ++## contributors may be used to endorse or promote products derived from this ++## software without specific prior written permission. ++## ++## 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 HOLDER 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. ++## ++## ++## ################################################################### ++ ++GEN_CONFIG_VER ?= 2U ++BOARD ?= ccimx95dvk ++USES_FUSA ?= 1 ++ ++include ./devices/MIMX95/sm/Makefile ++include ./boards/$(BOARD)/sm/Makefile ++include ./sm/lmm/Makefile ++include ./sm/rpc/mb_mu/Makefile ++include ./sm/rpc/scmi/Makefile ++include ./sm/rpc/smt/Makefile ++include ./sm/makefiles/gcc_cross.mak ++ +diff --git a/configs/ccimx95dvk/config_bctrl.h b/configs/ccimx95dvk/config_bctrl.h +new file mode 100644 +index 000000000000..a757834c32ab +--- /dev/null ++++ b/configs/ccimx95dvk/config_bctrl.h +@@ -0,0 +1,100 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_CCIMX95DVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing configuration info for the device block controls. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_BCTRL_H ++#define CONFIG_BCTRL_H ++ ++/* Includes */ ++ ++#include "config_user.h" ++ ++/* Defines */ ++ ++/*--------------------------------------------------------------------------*/ ++/* BCTRL A Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for BCTRL A */ ++#define SM_BCTRL_A_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000008U), 0x00001804U, \ ++ SM_CFG_W1(0x0000000CU), 0x0000E56AU, \ ++ SM_CFG_W1(0x00000010U), 0x0000E56AU, \ ++ SM_CFG_W1(0x00000014U), 0x0000E56AU, \ ++ SM_CFG_W1(0x00000018U), 0x0000E56AU, \ ++ SM_CFG_W1(0x0000001CU), 0x0000E56AU, \ ++ SM_CFG_W1(0x00000020U), 0x0000E56AU, \ ++ SM_CFG_W1(0x00000024U), 0x00000291U, \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* BCTRL W Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for BCTRL W */ ++#define SM_BCTRL_W_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000030U), 0xFBF7FFFFU, \ ++ SM_CFG_W1(0x00000034U), 0xFBF7FFFFU, \ ++ SM_CFG_W1(0x00000038U), 0xFBF7FFFFU, \ ++ SM_CFG_W1(0x0000003CU), 0xFBF7FFFFU, \ ++ SM_CFG_W1(0x00000040U), 0xFBF7FFFFU, \ ++ SM_CFG_W1(0x00000044U), 0xFBF7FFFFU, \ ++ SM_CFG_W1(0x00000048U), 0x04080000U, \ ++ SM_CFG_W1(0x00000050U), 0x00000001U, \ ++ SM_CFG_W1(0x00000054U), 0x00000001U, \ ++ SM_CFG_W1(0x00000058U), 0x00000001U, \ ++ SM_CFG_W1(0x0000005CU), 0x00000001U, \ ++ SM_CFG_W1(0x00000060U), 0x00000001U, \ ++ SM_CFG_W1(0x00000064U), 0x00000001U, \ ++ SM_CFG_END \ ++ } ++ ++#endif /* CONFIG_BCTRL_H */ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk/config_board.h b/configs/ccimx95dvk/config_board.h +new file mode 100644 +index 000000000000..23ecae56cf78 +--- /dev/null ++++ b/configs/ccimx95dvk/config_board.h +@@ -0,0 +1,69 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_CCIMX95DVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing configuration info for the board abstraction. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_BOARD_H ++#define CONFIG_BOARD_H ++ ++/* Includes */ ++ ++#include "config_user.h" ++ ++/* Defines */ ++ ++/*! Config for UART instance */ ++#define BOARD_DEBUG_UART_INSTANCE 7U ++/*! Config for UART baudrate */ ++#define BOARD_DEBUG_UART_BAUDRATE 115200U ++ ++/*! Config for PMIC I2C instance */ ++#define BOARD_I2C_INSTANCE 1U ++/*! Config for PMIC I2C baudrate */ ++#define BOARD_I2C_BAUDRATE 400000U ++ ++#endif /* CONFIG_BOARD_H */ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk/config_dev.h b/configs/ccimx95dvk/config_dev.h +new file mode 100644 +index 000000000000..1768fa8b16ab +--- /dev/null ++++ b/configs/ccimx95dvk/config_dev.h +@@ -0,0 +1,65 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_CCIMX95DVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing configuration info for the device abstraction. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_DEV_H ++#define CONFIG_DEV_H ++ ++/* Includes */ ++ ++#include "config_user.h" ++ ++/* Defines */ ++ ++/*! Config for device */ ++#define SM_DEV_CONFIG_DATA \ ++ { \ ++ .cpuSemaAddr[DEV_SM_CPU_A55P] = 0x442313F8U, \ ++ } ++ ++#endif /* CONFIG_DEV_H */ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk/config_lmm.h b/configs/ccimx95dvk/config_lmm.h +new file mode 100644 +index 000000000000..4c7693ee8b81 +--- /dev/null ++++ b/configs/ccimx95dvk/config_lmm.h +@@ -0,0 +1,223 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_CCIMX95DVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing configuration info for the logical machine manager. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_LMM_H ++#define CONFIG_LMM_H ++ ++/* Includes */ ++ ++#include "config_user.h" ++ ++/* Defines */ ++ ++/*--------------------------------------------------------------------------*/ ++/* LM0 Config (SM) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for LM0 */ ++#define SM_LM0_CONFIG \ ++ { \ ++ .name = "SM", \ ++ .rpcType = SM_RPC_NONE, \ ++ .boot[0] = 1U, \ ++ .safeType = LMM_SAFE_TYPE_FEENV, \ ++ .boot[1] = 1U, \ ++ .boot[2] = 1U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* LM1 Config (M7) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for LM1 */ ++#define SM_LM1_CONFIG \ ++ { \ ++ .name = "M7", \ ++ .rpcType = SM_RPC_SCMI, \ ++ .rpcInst = 0U, \ ++ .boot[0] = 2U, \ ++ .bootSkip[0] = 1U, \ ++ .safeType = LMM_SAFE_TYPE_SEENV, \ ++ .start = 1U, \ ++ .stop = 1U, \ ++ .boot[1] = 2U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* LM2 Config (AP) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for LM2 */ ++#define SM_LM2_CONFIG \ ++ { \ ++ .name = "AP", \ ++ .rpcType = SM_RPC_SCMI, \ ++ .rpcInst = 1U, \ ++ .boot[0] = 3U, \ ++ .bootSkip[0] = 1U, \ ++ .start = 7U, \ ++ .stop = 7U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* LM Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for number of LM */ ++#define SM_NUM_LM 3U ++ ++/*! Config data array for LM */ ++#define SM_LM_CONFIG_DATA \ ++ SM_LM0_CONFIG, \ ++ SM_LM1_CONFIG, \ ++ SM_LM2_CONFIG ++ ++/*! Number of mSel */ ++#define SM_LM_NUM_MSEL 3U ++ ++/*! Number of S-EENV */ ++#define SM_LM_NUM_SEENV 1U ++ ++/*! Config name */ ++#define SM_LM_CFG_NAME "ccimx95dvk" ++ ++/*! Default LM for monitor */ ++#define SM_LM_DEFAULT 2U ++ ++/*--------------------------------------------------------------------------*/ ++/* LM Start/Stop Lists */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for number of start */ ++#define SM_LM_NUM_START 18U ++ ++/*! LM start list */ ++#define SM_LM_START_DATA \ ++ {.lmId = 1U, .mSel = 0U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_M7}, \ ++ {.lmId = 1U, .mSel = 1U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_M7}, \ ++ {.lmId = 1U, .mSel = 2U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_M7}, \ ++ {.lmId = 1U, .mSel = 0U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_M7P}, \ ++ {.lmId = 1U, .mSel = 1U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_M7P}, \ ++ {.lmId = 1U, .mSel = 2U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_M7P}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_VOLT, .rsrc = DEV_SM_VOLT_ARM, \ ++ .numArg = 1, .arg[0] = 1U,}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_VOLT, .rsrc = DEV_SM_VOLT_ARM, \ ++ .numArg = 1, .arg[0] = 1U,}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_VOLT, .rsrc = DEV_SM_VOLT_ARM, \ ++ .numArg = 1, .arg[0] = 1U,}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55P}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55P}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55P}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_PERF, .rsrc = DEV_SM_PERF_A55, \ ++ .numArg = 1, .arg[0] = 3U,}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_PERF, .rsrc = DEV_SM_PERF_A55, \ ++ .numArg = 1, .arg[0] = 3U,}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_PERF, .rsrc = DEV_SM_PERF_A55, \ ++ .numArg = 1, .arg[0] = 3U,}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_A55C0}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_A55C0}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_A55C0}, ++ ++/*! Config for number of stop */ ++#define SM_LM_NUM_STOP 33U ++ ++/*! LM stop list */ ++#define SM_LM_STOP_DATA \ ++ {.lmId = 1U, .mSel = 0U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_M7P}, \ ++ {.lmId = 1U, .mSel = 1U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_M7P}, \ ++ {.lmId = 1U, .mSel = 2U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_M7P}, \ ++ {.lmId = 1U, .mSel = 0U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_M7}, \ ++ {.lmId = 1U, .mSel = 1U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_M7}, \ ++ {.lmId = 1U, .mSel = 2U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_M7}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_A55P}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_A55P}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_CPU, .rsrc = DEV_SM_CPU_A55P}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C5}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C5}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C5}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C4}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C4}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C4}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C3}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C3}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C3}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C2}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C2}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C2}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C1}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C1}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C1}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C0}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C0}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55C0}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55P}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55P}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_PD, .rsrc = DEV_SM_PD_A55P}, \ ++ {.lmId = 2U, .mSel = 0U, .ss = LMM_SS_VOLT, .rsrc = DEV_SM_VOLT_ARM}, \ ++ {.lmId = 2U, .mSel = 1U, .ss = LMM_SS_VOLT, .rsrc = DEV_SM_VOLT_ARM}, \ ++ {.lmId = 2U, .mSel = 2U, .ss = LMM_SS_VOLT, .rsrc = DEV_SM_VOLT_ARM}, ++ ++/*--------------------------------------------------------------------------*/ ++/* LM Fault Lists */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! LM fault reactions */ ++#define SM_LM_FAULT_DATA \ ++ [DEV_SM_FAULT_SW3] = {.reaction = LMM_REACT_GRP_RESET, .lm = 0U}, \ ++ [DEV_SM_FAULT_SW4] = {.reaction = LMM_REACT_SYS_RESET, .lm = 0U}, \ ++ [DEV_SM_FAULT_M7_LOCKUP] = {.reaction = LMM_REACT_LM_RESET, .lm = 1U}, \ ++ [DEV_SM_FAULT_M7_RESET] = {.reaction = LMM_REACT_LM_RESET, .lm = 1U}, \ ++ [DEV_SM_FAULT_SW0] = {.reaction = LMM_REACT_FUSA, .lm = 1U}, \ ++ [DEV_SM_FAULT_SW1] = {.reaction = LMM_REACT_LM_RESET, .lm = 1U}, \ ++ [DEV_SM_FAULT_WDOG5] = {.reaction = LMM_REACT_LM_RESET, .lm = 1U}, \ ++ [DEV_SM_FAULT_SW2] = {.reaction = LMM_REACT_LM_RESET, .lm = 2U}, \ ++ [DEV_SM_FAULT_WDOG3] = {.reaction = LMM_REACT_LM_RESET, .lm = 2U}, \ ++ [DEV_SM_FAULT_WDOG4] = {.reaction = LMM_REACT_LM_RESET, .lm = 2U}, ++ ++#endif /* CONFIG_LMM_H */ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk/config_mb_mu.h b/configs/ccimx95dvk/config_mb_mu.h +new file mode 100644 +index 000000000000..e78f2dca1216 +--- /dev/null ++++ b/configs/ccimx95dvk/config_mb_mu.h +@@ -0,0 +1,118 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_CCIMX95DVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing configuration info for the MB_MU. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_MB_MU_H ++#define CONFIG_MB_MU_H ++ ++/* Includes */ ++ ++#include "config_user.h" ++#include "mb_mu_config.h" ++ ++/* Defines */ ++ ++/*--------------------------------------------------------------------------*/ ++/* LM0 MB_MU Config (SM) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*--------------------------------------------------------------------------*/ ++/* LM1 MB_MU Config (M7) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for MU9 MB */ ++#define SM_MB_MU9_CONFIG \ ++ { \ ++ .mu = 9U, \ ++ .priority = IRQ_PRIO_NOPREEMPT_HIGH, \ ++ .xportType[0] = SM_XPORT_SMT, \ ++ .xportChannel[0] = 0U, \ ++ .xportType[1] = SM_XPORT_SMT, \ ++ .xportChannel[1] = 1U, \ ++ .xportType[2] = SM_XPORT_SMT, \ ++ .xportChannel[2] = 2U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* LM2 MB_MU Config (AP) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for MU1 MB */ ++#define SM_MB_MU1_CONFIG \ ++ { \ ++ .mu = 1U, \ ++ .xportType[0] = SM_XPORT_SMT, \ ++ .xportChannel[0] = 3U, \ ++ .xportType[1] = SM_XPORT_SMT, \ ++ .xportChannel[1] = 4U, \ ++ } ++ ++/*! Config for MU3 MB */ ++#define SM_MB_MU3_CONFIG \ ++ { \ ++ .mu = 3U, \ ++ .xportType[0] = SM_XPORT_SMT, \ ++ .xportChannel[0] = 5U, \ ++ .xportType[1] = SM_XPORT_SMT, \ ++ .xportChannel[1] = 6U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* MB MU Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for number of MU MB */ ++#define SM_NUM_MB_MU 3U ++ ++/*! Config data array for MU MB */ ++#define SM_MB_MU_CONFIG_DATA \ ++ SM_MB_MU9_CONFIG, \ ++ SM_MB_MU1_CONFIG, \ ++ SM_MB_MU3_CONFIG ++ ++#endif /* CONFIG_MB_MU_H */ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk/config_scmi.h b/configs/ccimx95dvk/config_scmi.h +new file mode 100644 +index 000000000000..e1b81cc03f58 +--- /dev/null ++++ b/configs/ccimx95dvk/config_scmi.h +@@ -0,0 +1,695 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_CCIMX95DVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing configuration info for the SCMI RPC. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_SCMI_H ++#define CONFIG_SCMI_H ++ ++/* Includes */ ++ ++#include "config_user.h" ++ ++/* Defines */ ++ ++/*--------------------------------------------------------------------------*/ ++/* SCMI AGENT0 Config (M7) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for SCMI agent 0 */ ++#define SM_SCMI_AGNT0_CONFIG \ ++ { \ ++ .name = "M7", \ ++ .scmiInst = 0U, \ ++ .domId = 4U, \ ++ .secure = 0U, \ ++ .seenvId = 1U, \ ++ .buttonPerms[DEV_SM_BUTTON_0] = SM_SCMI_PERM_NOTIFY, \ ++ .clkPerms[DEV_SM_CLK_CAN1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPTMR1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPTMR2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPUART3] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_M7SYSTICK] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_M7] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_TSTMR2] = SM_SCMI_PERM_ALL, \ ++ .cpuPerms[DEV_SM_CPU_M7P] = SM_SCMI_PERM_ALL, \ ++ .ctrlPerms[BRD_SM_CTRL_BUTTON] = SM_SCMI_PERM_NOTIFY, \ ++ .ctrlPerms[BRD_SM_CTRL_PCA2131] = SM_SCMI_PERM_ALL, \ ++ .ctrlPerms[BRD_SM_CTRL_TEST] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_CAN1_RX] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPTMR2_0] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPTMR2_1] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPTMR2_2] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART3_CTS] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART3_RXD] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART3_TXD] = SM_SCMI_PERM_ALL, \ ++ .faultPerms[DEV_SM_FAULT_M7_LOCKUP] = SM_SCMI_PERM_ALL, \ ++ .faultPerms[DEV_SM_FAULT_M7_RESET] = SM_SCMI_PERM_ALL, \ ++ .faultPerms[DEV_SM_FAULT_SW0] = SM_SCMI_PERM_ALL, \ ++ .faultPerms[DEV_SM_FAULT_SW1] = SM_SCMI_PERM_ALL, \ ++ .faultPerms[DEV_SM_FAULT_WDOG5] = SM_SCMI_PERM_ALL, \ ++ .fusaPerms = SM_SCMI_PERM_ALL, \ ++ .lmmPerms[2] = SM_SCMI_PERM_ALL, \ ++ .pdPerms[DEV_SM_PD_M7] = SM_SCMI_PERM_ALL, \ ++ .perfPerms[DEV_SM_PERF_M7] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN1] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART3] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_WDOG5] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO14] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO15] = SM_SCMI_PERM_ALL, \ ++ .rtcPerms[BRD_SM_RTC_PCA2131] = SM_SCMI_PERM_ALL, \ ++ .rtcPerms[DEV_SM_RTC_BBNSM] = SM_SCMI_PERM_PRIV, \ ++ .sensorPerms[BRD_SM_SENSOR_TEMP_PF09] = SM_SCMI_PERM_SET, \ ++ .sensorPerms[BRD_SM_SENSOR_TEMP_PF5301] = SM_SCMI_PERM_SET, \ ++ .sensorPerms[BRD_SM_SENSOR_TEMP_PF5302] = SM_SCMI_PERM_SET, \ ++ .sensorPerms[DEV_SM_SENSOR_TEMP_ANA] = SM_SCMI_PERM_ALL, \ ++ .sysPerms = SM_SCMI_PERM_ALL, \ ++ } ++ ++/*! Config for SCMI channel 0 */ ++#define SM_SCMI_CHN0_CONFIG \ ++ { \ ++ .agentId = 0U, \ ++ .type = SM_SCMI_CHN_A2P, \ ++ .xportType = SM_XPORT_SMT, \ ++ .xportChannel = 0U, \ ++ } ++ ++/*! Config for SCMI channel 1 */ ++#define SM_SCMI_CHN1_CONFIG \ ++ { \ ++ .agentId = 0U, \ ++ .type = SM_SCMI_CHN_P2A_NOTIFY, \ ++ .xportType = SM_XPORT_SMT, \ ++ .xportChannel = 1U, \ ++ } ++ ++/*! Config for SCMI channel 2 */ ++#define SM_SCMI_CHN2_CONFIG \ ++ { \ ++ .agentId = 0U, \ ++ .type = SM_SCMI_CHN_P2A_PRIORITY, \ ++ .xportType = SM_XPORT_SMT, \ ++ .xportChannel = 2U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* SCMI Instance 0 Config (M7) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for SCMI instance 0 */ ++#define SM_SCMI0_CONFIG \ ++ { \ ++ .lmId = 1U, \ ++ .numAgents = 1U, \ ++ .firstAgent = 0U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* SCMI AGENT1 Config (AP-S) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for SCMI agent 1 */ ++#define SM_SCMI_AGNT1_CONFIG \ ++ { \ ++ .name = "AP-S", \ ++ .scmiInst = 1U, \ ++ .domId = 3U, \ ++ .secure = 1U, \ ++ .clkPerms[DEV_SM_CLK_A55C0_GPR_SEL] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_A55C1_GPR_SEL] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_A55C2_GPR_SEL] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_A55C3_GPR_SEL] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_A55C4_GPR_SEL] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_A55C5_GPR_SEL] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_A55PERIPH] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_A55P_GPR_SEL] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_A55] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ARMPLL_PFD0] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ARMPLL_PFD0_UNGATED] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ARMPLL_PFD1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ARMPLL_PFD1_UNGATED] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ARMPLL_PFD2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ARMPLL_PFD2_UNGATED] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ARMPLL_PFD3] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ARMPLL_PFD3_UNGATED] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ARMPLL_VCO] = SM_SCMI_PERM_ALL, \ ++ .cpuPerms[DEV_SM_CPU_A55C0] = SM_SCMI_PERM_ALL, \ ++ .cpuPerms[DEV_SM_CPU_A55C1] = SM_SCMI_PERM_ALL, \ ++ .cpuPerms[DEV_SM_CPU_A55C2] = SM_SCMI_PERM_ALL, \ ++ .cpuPerms[DEV_SM_CPU_A55C3] = SM_SCMI_PERM_ALL, \ ++ .cpuPerms[DEV_SM_CPU_A55C4] = SM_SCMI_PERM_ALL, \ ++ .cpuPerms[DEV_SM_CPU_A55C5] = SM_SCMI_PERM_ALL, \ ++ .cpuPerms[DEV_SM_CPU_A55P] = SM_SCMI_PERM_ALL, \ ++ .faultPerms[DEV_SM_FAULT_SW2] = SM_SCMI_PERM_ALL, \ ++ .faultPerms[DEV_SM_FAULT_WDOG3] = SM_SCMI_PERM_ALL, \ ++ .faultPerms[DEV_SM_FAULT_WDOG4] = SM_SCMI_PERM_ALL, \ ++ .pdPerms[DEV_SM_PD_A55P] = SM_SCMI_PERM_ALL, \ ++ .perfPerms[DEV_SM_PERF_A55] = SM_SCMI_PERM_ALL, \ ++ .perfPerms[DEV_SM_PERF_DRAM] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN2] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN3] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN4] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN5] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_GPIO2] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_GPIO3] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_GPIO4] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_GPIO5] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART1] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART2] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART4] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART5] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART6] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART8] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_WDOG3] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_WDOG4] = SM_SCMI_PERM_ALL, \ ++ .sysPerms = SM_SCMI_PERM_ALL, \ ++ } ++ ++/*! Config for SCMI channel 3 */ ++#define SM_SCMI_CHN3_CONFIG \ ++ { \ ++ .agentId = 1U, \ ++ .type = SM_SCMI_CHN_A2P, \ ++ .xportType = SM_XPORT_SMT, \ ++ .xportChannel = 3U, \ ++ } ++ ++/*! Config for SCMI channel 4 */ ++#define SM_SCMI_CHN4_CONFIG \ ++ { \ ++ .agentId = 1U, \ ++ .type = SM_SCMI_CHN_P2A_NOTIFY, \ ++ .xportType = SM_XPORT_SMT, \ ++ .xportChannel = 4U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* SCMI AGENT2 Config (AP-NS) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for SCMI agent 2 */ ++#define SM_SCMI_AGNT2_CONFIG \ ++ { \ ++ .name = "AP-NS", \ ++ .scmiInst = 1U, \ ++ .domId = 3U, \ ++ .secure = 0U, \ ++ .buttonPerms[DEV_SM_BUTTON_0] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_AUDIOPLL1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_AUDIOPLL1_VCO] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_AUDIOPLL2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_AUDIOPLL2_VCO] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_AUDIOXCVR] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_CAN2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_CAN3] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_CAN4] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_CAN5] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_CCMCKO1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_CCMCKO2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_CCMCKO3] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_CCMCKO4] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_DISP1PIX] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_DISP2PIX] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_DISP3PIX] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_DISPOCRAM] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ENETREF] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_ENETTIMER1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_EXT1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_EXT2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_EXT] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_EXT_GPR_SEL] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_FLEXIO1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_FLEXIO2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_FLEXSPI1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_GPU_CGC] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_HSIOPCIEAUX] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_HSIOPLL] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_HSIOPLL_VCO] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_I3C1SLOW] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_I3C1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_I3C2SLOW] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_I3C2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LDBPLL] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LDBPLL_VCO] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPI2C2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPI2C3] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPI2C4] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPI2C5] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPI2C6] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPI2C7] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPI2C8] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPSPI1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPSPI2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPSPI3] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPSPI4] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPSPI5] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPSPI6] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPSPI7] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPSPI8] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPUART1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPUART2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPUART4] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPUART5] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPUART6] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPUART8] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_MIPIPHYCFG] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_MIPIPHYPLLBYPASS] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_MIPIPHYPLLREF] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_MIPITESTBYTE] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_MQS1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_MQS2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_PDM] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_SAI1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_SAI2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_SAI3] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_SAI4] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_SAI5] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_SPDIF] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_TPM2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_TPM4] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_TPM5] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_TPM6] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_USBPHYBURUNIN] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_USDHC1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_USDHC2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_USDHC3] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_VIDEOPLL1] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_VIDEOPLL1_VCO] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_VPUDSP] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_XSPISLVROOT] = SM_SCMI_PERM_ALL, \ ++ .ctrlPerms[BRD_SM_CTRL_BT_WAKE] = SM_SCMI_PERM_NOTIFY, \ ++ .ctrlPerms[BRD_SM_CTRL_BUTTON] = SM_SCMI_PERM_NOTIFY, \ ++ .ctrlPerms[BRD_SM_CTRL_PCIE1_WAKE] = SM_SCMI_PERM_NOTIFY, \ ++ .ctrlPerms[BRD_SM_CTRL_PCIE2_WAKE] = SM_SCMI_PERM_NOTIFY, \ ++ .ctrlPerms[BRD_SM_CTRL_SD3_WAKE] = SM_SCMI_PERM_NOTIFY, \ ++ .ctrlPerms[DEV_SM_CTRL_ADC_TEST] = SM_SCMI_PERM_ALL, \ ++ .ctrlPerms[DEV_SM_CTRL_MQS1_SETTINGS] = SM_SCMI_PERM_ALL, \ ++ .ctrlPerms[DEV_SM_CTRL_PDM_CLK_SEL] = SM_SCMI_PERM_ALL, \ ++ .ctrlPerms[DEV_SM_CTRL_SAI1_MCLK] = SM_SCMI_PERM_ALL, \ ++ .ctrlPerms[DEV_SM_CTRL_SAI3_MCLK] = SM_SCMI_PERM_ALL, \ ++ .ctrlPerms[DEV_SM_CTRL_SAI4_MCLK] = SM_SCMI_PERM_ALL, \ ++ .ctrlPerms[DEV_SM_CTRL_SAI5_MCLK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_CAN2_RX] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_CAN3_RX] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_CAN4_RX] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_CAN5_RX] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_EARC_PHY_SPDIF] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_EXT1_CLK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_0] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_10] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_11] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_12] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_13] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_14] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_15] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_16] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_17] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_18] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_19] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_1] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_20] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_21] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_22] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_23] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_24] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_25] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_26] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_27] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_2] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_30] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_31] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_3] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_4] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_5] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_6] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_7] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_8] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXIO1_9] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXSPI1_0] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXSPI1_1] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXSPI1_2] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXSPI1_3] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXSPI1_4] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXSPI1_5] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXSPI1_6] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXSPI1_7] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXSPI1_DQS] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_FLEXSPI1_SCK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_I3C2_SCL] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_I3C2_SDA] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C3_SCL] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C3_SDA] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C4_SCL] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C4_SDA] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C5_SCL] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C5_SDA] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C6_SCL] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C6_SDA] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C7_SCL] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C7_SDA] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C8_SCL] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPI2C8_SDA] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPSPI4_PCS_0] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPSPI4_PCS_1] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPSPI4_PCS_2] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPSPI4_SCK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPSPI4_SDI] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPSPI4_SDO] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART4_CTS] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART4_RXD] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART4_TXD] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART5_CTS] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART5_RXD] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART5_TXD] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART6_CTS] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART6_RXD] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART6_TXD] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_NETC_EMDC] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_NETC_EMDIO] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_NETC_ETH0_RMII_RX_ER] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_NETC_ETH1_RMII_RX_ER] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_NETC_TMR_1588_TRIG1] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_NETC_TMR_1588_TRIG2] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_PDM_BITSTREAM_0] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_PDM_BITSTREAM_1] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_PDM_BITSTREAM_2] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_PDM_BITSTREAM_3] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI1_MCLK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI2_RXDATA_6] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI2_RXDATA_7] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI3_RXBCLK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI3_RXSYNC] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI4_RXBCLK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI4_RXDATA_0] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI4_RXSYNC] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI4_TXBCLK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI4_TXSYNC] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI5_RXBCLK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI5_RXDATA_0] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI5_RXDATA_1] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI5_RXDATA_2] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI5_RXDATA_3] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI5_RXSYNC] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI5_TXBCLK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_SAI5_TXSYNC] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_USDHC3_CLK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_USDHC3_CMD] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_USDHC3_DAT0] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_USDHC3_DAT1] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_USDHC3_DAT2] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_USDHC3_DAT3] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_0] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_1] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_2] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_3] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_4] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_5] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_6] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_7] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_CS] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_DQS] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_XSPI_SCK] = SM_SCMI_PERM_ALL, \ ++ .gprPerms[DEV_SM_GPR_4] = SM_SCMI_PERM_ALL, \ ++ .gprPerms[DEV_SM_GPR_5] = SM_SCMI_PERM_ALL, \ ++ .gprPerms[DEV_SM_GPR_6] = SM_SCMI_PERM_ALL, \ ++ .gprPerms[DEV_SM_GPR_7] = SM_SCMI_PERM_ALL, \ ++ .lmmPerms[1] = SM_SCMI_PERM_NOTIFY, \ ++ .pdPerms[DEV_SM_PD_CAMERA] = SM_SCMI_PERM_ALL, \ ++ .pdPerms[DEV_SM_PD_DISPLAY] = SM_SCMI_PERM_ALL, \ ++ .pdPerms[DEV_SM_PD_GPU] = SM_SCMI_PERM_ALL, \ ++ .pdPerms[DEV_SM_PD_HSIO_TOP] = SM_SCMI_PERM_ALL, \ ++ .pdPerms[DEV_SM_PD_NETC] = SM_SCMI_PERM_ALL, \ ++ .pdPerms[DEV_SM_PD_NPU] = SM_SCMI_PERM_ALL, \ ++ .pdPerms[DEV_SM_PD_VPU] = SM_SCMI_PERM_ALL, \ ++ .perfPerms[DEV_SM_PERF_A55] = SM_SCMI_PERM_ALL, \ ++ .perfPerms[DEV_SM_PERF_CAM] = SM_SCMI_PERM_ALL, \ ++ .perfPerms[DEV_SM_PERF_DISP] = SM_SCMI_PERM_ALL, \ ++ .perfPerms[DEV_SM_PERF_DRAM] = SM_SCMI_PERM_ALL, \ ++ .perfPerms[DEV_SM_PERF_GPU] = SM_SCMI_PERM_ALL, \ ++ .perfPerms[DEV_SM_PERF_NPU] = SM_SCMI_PERM_ALL, \ ++ .perfPerms[DEV_SM_PERF_VPU] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN2] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN3] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN4] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN5] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_GPIO2] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_GPIO3] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_GPIO4] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_GPIO5] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART1] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART2] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART4] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART5] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART6] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART8] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_WDOG3] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_WDOG4] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_CCM_CLKO1] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_CCM_CLKO2] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_CCM_CLKO3] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_CCM_CLKO4] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_DAP_TCLK_SWCLK] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_DAP_TDI] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_DAP_TDO_TRACESWO] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_DAP_TMS_SWDIO] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_MDC] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_MDIO] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_RD0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_RD1] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_RD2] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_RD3] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_RXC] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_RX_CTL] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_TD0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_TD1] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_TD2] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_TD3] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_TXC] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET1_TX_CTL] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_MDC] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_MDIO] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_RD0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_RD1] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_RD2] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_RD3] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_RXC] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_RX_CTL] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_TD0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_TD1] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_TD2] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_TD3] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_TXC] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_ENET2_TX_CTL] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO00] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO01] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO02] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO03] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO04] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO05] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO06] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO07] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO10] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO11] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO12] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO13] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO16] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO17] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO18] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO19] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO20] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO21] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO22] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO23] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO24] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO25] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO26] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO27] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO28] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO29] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO30] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO31] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO32] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO33] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO34] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO35] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO36] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO37] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_I2C2_SCL] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_I2C2_SDA] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_PDM_BIT_STREAM0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_PDM_CLK] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SAI1_RXD0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SAI1_TXC] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SAI1_TXD0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SAI1_TXFS] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_CLK] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_CMD] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_DATA0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_DATA1] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_DATA2] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_DATA3] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_DATA4] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_DATA5] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_DATA6] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_DATA7] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD1_STROBE] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD2_CD_B] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD2_CLK] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD2_CMD] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD2_DATA0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD2_DATA1] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD2_DATA2] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD2_DATA3] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD2_RESET_B] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD2_VSELECT] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD3_CLK] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD3_CMD] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD3_DATA0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD3_DATA1] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD3_DATA2] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_SD3_DATA3] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_UART1_RXD] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_UART1_TXD] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_DATA0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_DATA1] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_DATA2] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_DATA3] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_DATA4] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_DATA5] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_DATA6] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_DATA7] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_DQS] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_SCLK] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_SS0_B] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_XSPI1_SS1_B] = SM_SCMI_PERM_ALL, \ ++ .rtcPerms[BRD_SM_RTC_PCA2131] = SM_SCMI_PERM_PRIV, \ ++ .rtcPerms[DEV_SM_RTC_BBNSM] = SM_SCMI_PERM_ALL, \ ++ .sensorPerms[BRD_SM_SENSOR_TEMP_PF09] = SM_SCMI_PERM_ALL, \ ++ .sensorPerms[BRD_SM_SENSOR_TEMP_PF5301] = SM_SCMI_PERM_SET, \ ++ .sensorPerms[BRD_SM_SENSOR_TEMP_PF5302] = SM_SCMI_PERM_SET, \ ++ .sensorPerms[DEV_SM_SENSOR_TEMP_A55] = SM_SCMI_PERM_ALL, \ ++ .sensorPerms[DEV_SM_SENSOR_TEMP_ANA] = SM_SCMI_PERM_SET, \ ++ .sysPerms = SM_SCMI_PERM_NOTIFY, \ ++ } ++ ++/*! Config for SCMI channel 5 */ ++#define SM_SCMI_CHN5_CONFIG \ ++ { \ ++ .agentId = 2U, \ ++ .type = SM_SCMI_CHN_A2P, \ ++ .xportType = SM_XPORT_SMT, \ ++ .xportChannel = 5U, \ ++ } ++ ++/*! Config for SCMI channel 6 */ ++#define SM_SCMI_CHN6_CONFIG \ ++ { \ ++ .agentId = 2U, \ ++ .type = SM_SCMI_CHN_P2A_NOTIFY, \ ++ .xportType = SM_XPORT_SMT, \ ++ .xportChannel = 6U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* SCMI Instance 1 Config (AP) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for SCMI instance 1 */ ++#define SM_SCMI1_CONFIG \ ++ { \ ++ .lmId = 2U, \ ++ .numAgents = 2U, \ ++ .firstAgent = 1U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* SCMI Agent Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for number of SCMI agents */ ++#define SM_SCMI_NUM_AGNT 3U ++ ++/*! Config data array for SCMI agents */ ++#define SM_SCMI_AGNT_CONFIG_DATA \ ++ SM_SCMI_AGNT0_CONFIG, \ ++ SM_SCMI_AGNT1_CONFIG, \ ++ SM_SCMI_AGNT2_CONFIG ++ ++/*--------------------------------------------------------------------------*/ ++/* SCMI Channel Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for number of SCMI channels */ ++#define SM_SCMI_NUM_CHN 7U ++ ++/*! Config data array for SCMI channels */ ++#define SM_SCMI_CHN_CONFIG_DATA \ ++ SM_SCMI_CHN0_CONFIG, \ ++ SM_SCMI_CHN1_CONFIG, \ ++ SM_SCMI_CHN2_CONFIG, \ ++ SM_SCMI_CHN3_CONFIG, \ ++ SM_SCMI_CHN4_CONFIG, \ ++ SM_SCMI_CHN5_CONFIG, \ ++ SM_SCMI_CHN6_CONFIG ++ ++/*--------------------------------------------------------------------------*/ ++/* SCMI Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for number of SCMI instances */ ++#define SM_NUM_SCMI 2U ++ ++/*! Config data array for SCMI instances */ ++#define SM_SCMI_CONFIG_DATA \ ++ SM_SCMI0_CONFIG, \ ++ SM_SCMI1_CONFIG ++ ++/*! Max words to buffer for notification messages */ ++#define SM_SCMI_MAX_NOTIFY 24U ++ ++#endif /* CONFIG_SCMI_H */ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk/config_smt.h b/configs/ccimx95dvk/config_smt.h +new file mode 100644 +index 000000000000..7da4e43af886 +--- /dev/null ++++ b/configs/ccimx95dvk/config_smt.h +@@ -0,0 +1,168 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_CCIMX95DVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing configuration info for the SMT. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_SMT_H ++#define CONFIG_SMT_H ++ ++/* Includes */ ++ ++#include "config_user.h" ++#include "rpc_smt_config.h" ++ ++/* Defines */ ++ ++/*--------------------------------------------------------------------------*/ ++/* LM0 SMT Config (SM) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*--------------------------------------------------------------------------*/ ++/* LM1 SMT Config (M7) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for SMT channel 0 */ ++#define SM_SMT_CHN0_CONFIG \ ++ { \ ++ .rpcType = SM_RPC_SCMI, \ ++ .rpcChannel = 0U, \ ++ .mbType = SM_MB_MU, \ ++ .mbInst = 0U, \ ++ .mbDoorbell = 0U, \ ++ .crc = SM_SMT_CRC_CRC32, \ ++ } ++ ++/*! Config for SMT channel 1 */ ++#define SM_SMT_CHN1_CONFIG \ ++ { \ ++ .rpcType = SM_RPC_SCMI, \ ++ .rpcChannel = 1U, \ ++ .mbType = SM_MB_MU, \ ++ .mbInst = 0U, \ ++ .mbDoorbell = 1U, \ ++ .crc = SM_SMT_CRC_CRC32, \ ++ } ++ ++/*! Config for SMT channel 2 */ ++#define SM_SMT_CHN2_CONFIG \ ++ { \ ++ .rpcType = SM_RPC_SCMI, \ ++ .rpcChannel = 2U, \ ++ .mbType = SM_MB_MU, \ ++ .mbInst = 0U, \ ++ .mbDoorbell = 2U, \ ++ .crc = SM_SMT_CRC_CRC32, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* LM2 SMT Config (AP) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for SMT channel 3 */ ++#define SM_SMT_CHN3_CONFIG \ ++ { \ ++ .rpcType = SM_RPC_SCMI, \ ++ .rpcChannel = 3U, \ ++ .mbType = SM_MB_MU, \ ++ .mbInst = 1U, \ ++ .mbDoorbell = 0U, \ ++ } ++ ++/*! Config for SMT channel 4 */ ++#define SM_SMT_CHN4_CONFIG \ ++ { \ ++ .rpcType = SM_RPC_SCMI, \ ++ .rpcChannel = 4U, \ ++ .mbType = SM_MB_MU, \ ++ .mbInst = 1U, \ ++ .mbDoorbell = 1U, \ ++ } ++ ++/*! Config for SMT channel 5 */ ++#define SM_SMT_CHN5_CONFIG \ ++ { \ ++ .rpcType = SM_RPC_SCMI, \ ++ .rpcChannel = 5U, \ ++ .mbType = SM_MB_MU, \ ++ .mbInst = 2U, \ ++ .mbDoorbell = 0U, \ ++ } ++ ++/*! Config for SMT channel 6 */ ++#define SM_SMT_CHN6_CONFIG \ ++ { \ ++ .rpcType = SM_RPC_SCMI, \ ++ .rpcChannel = 6U, \ ++ .mbType = SM_MB_MU, \ ++ .mbInst = 2U, \ ++ .mbDoorbell = 1U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* SMT Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for number of SMT channels */ ++#define SM_NUM_SMT_CHN 7U ++ ++/*! Config data array for SMT channels */ ++#define SM_SMT_CHN_CONFIG_DATA \ ++ SM_SMT_CHN0_CONFIG, \ ++ SM_SMT_CHN1_CONFIG, \ ++ SM_SMT_CHN2_CONFIG, \ ++ SM_SMT_CHN3_CONFIG, \ ++ SM_SMT_CHN4_CONFIG, \ ++ SM_SMT_CHN5_CONFIG, \ ++ SM_SMT_CHN6_CONFIG ++ ++/* Mailbox and CRC types to support */ ++/*! Config for MB_MU USE */ ++#define USES_MB_MU ++/*! Config for CRC32 CRC USE */ ++#define USES_CRC_CRC32 ++ ++#endif /* CONFIG_SMT_H */ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk/config_test.h b/configs/ccimx95dvk/config_test.h +new file mode 100644 +index 000000000000..cb737f33eede +--- /dev/null ++++ b/configs/ccimx95dvk/config_test.h +@@ -0,0 +1,197 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_CCIMX95DVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing configuration info for the unit tests. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_TEST_H ++#define CONFIG_TEST_H ++ ++/* Includes */ ++ ++#include "config_user.h" ++ ++/* Defines */ ++ ++/*--------------------------------------------------------------------------*/ ++/* LM0 Test Config (SM) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*--------------------------------------------------------------------------*/ ++/* LM1 Test Config (M7) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for test channel 0 */ ++#define SM_TEST_CHN0_CONFIG \ ++ { \ ++ .mbInst = 8U, \ ++ .mbDoorbell = 0U, \ ++ .agentId = 0U, \ ++ } ++ ++/*! Config for test channel 1 */ ++#define SM_TEST_CHN1_CONFIG \ ++ { \ ++ .mbInst = 8U, \ ++ .mbDoorbell = 1U, \ ++ .agentId = 0U, \ ++ } ++ ++/*! Config for test channel 2 */ ++#define SM_TEST_CHN2_CONFIG \ ++ { \ ++ .mbInst = 8U, \ ++ .mbDoorbell = 2U, \ ++ .agentId = 0U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* LM2 Test Config (AP) */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for test channel 3 */ ++#define SM_TEST_CHN3_CONFIG \ ++ { \ ++ .mbInst = 0U, \ ++ .mbDoorbell = 0U, \ ++ .agentId = 1U, \ ++ } ++ ++/*! Config for test channel 4 */ ++#define SM_TEST_CHN4_CONFIG \ ++ { \ ++ .mbInst = 0U, \ ++ .mbDoorbell = 1U, \ ++ .agentId = 1U, \ ++ } ++ ++/*! Config for test channel 5 */ ++#define SM_TEST_CHN5_CONFIG \ ++ { \ ++ .mbInst = 2U, \ ++ .mbDoorbell = 0U, \ ++ .agentId = 2U, \ ++ } ++ ++/*! Config for test channel 6 */ ++#define SM_TEST_CHN6_CONFIG \ ++ { \ ++ .mbInst = 2U, \ ++ .mbDoorbell = 1U, \ ++ .agentId = 2U, \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* Test Channel Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for number of test channels */ ++#define SM_NUM_TEST_CHN 7U ++ ++/*! Config data array for test channels */ ++#define SM_TEST_CHN_CONFIG_DATA \ ++ SM_TEST_CHN0_CONFIG, \ ++ SM_TEST_CHN1_CONFIG, \ ++ SM_TEST_CHN2_CONFIG, \ ++ SM_TEST_CHN3_CONFIG, \ ++ SM_TEST_CHN4_CONFIG, \ ++ SM_TEST_CHN5_CONFIG, \ ++ SM_TEST_CHN6_CONFIG ++ ++/*--------------------------------------------------------------------------*/ ++/* Test Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for number of tests */ ++#define SM_SCMI_NUM_TEST 40U ++ ++/*! Config data array for tests */ ++#define SM_SCMI_TEST_CONFIG_DATA \ ++ {.testId = TEST_BUTTON, .channel = 5U, .rsrc = DEV_SM_BUTTON_0}, \ ++ {.testId = TEST_CLK, .channel = 0U, .rsrc = DEV_SM_CLK_LPUART3}, \ ++ {.testId = TEST_CLK, .channel = 5U, .rsrc = DEV_SM_CLK_DISPOCRAM}, \ ++ {.testId = TEST_CLK, .channel = 5U, .rsrc = DEV_SM_CLK_ENETREF}, \ ++ {.testId = TEST_CLK, .channel = 5U, .rsrc = DEV_SM_CLK_ENETTIMER1}, \ ++ {.testId = TEST_CLK, .channel = 5U, .rsrc = DEV_SM_CLK_LPUART8}, \ ++ {.testId = TEST_CLK, .channel = 5U, .rsrc = DEV_SM_CLK_MQS1}, \ ++ {.testId = TEST_CLK, .channel = 5U, .rsrc = DEV_SM_CLK_SAI1}, \ ++ {.testId = TEST_CTRL, .channel = 5U, .rsrc = DEV_SM_CTRL_MQS1_SETTINGS}, \ ++ {.testId = TEST_CTRL, .channel = 5U, .rsrc = DEV_SM_CTRL_SAI1_MCLK}, \ ++ {.testId = TEST_DAISY, .channel = 0U, .rsrc = DEV_SM_DAISY_LPUART3_CTS}, \ ++ {.testId = TEST_DAISY, .channel = 0U, .rsrc = DEV_SM_DAISY_LPUART3_RXD}, \ ++ {.testId = TEST_DAISY, .channel = 0U, .rsrc = DEV_SM_DAISY_LPUART3_TXD}, \ ++ {.testId = TEST_DAISY, .channel = 5U, .rsrc = DEV_SM_DAISY_NETC_EMDC}, \ ++ {.testId = TEST_DAISY, .channel = 5U, .rsrc = DEV_SM_DAISY_NETC_EMDIO}, \ ++ {.testId = TEST_DAISY, .channel = 5U, .rsrc = DEV_SM_DAISY_NETC_ETH0_RMII_RX_ER}, \ ++ {.testId = TEST_DAISY, .channel = 5U, .rsrc = DEV_SM_DAISY_NETC_ETH1_RMII_RX_ER}, \ ++ {.testId = TEST_DAISY, .channel = 5U, .rsrc = DEV_SM_DAISY_NETC_TMR_1588_TRIG1}, \ ++ {.testId = TEST_DAISY, .channel = 5U, .rsrc = DEV_SM_DAISY_NETC_TMR_1588_TRIG2}, \ ++ {.testId = TEST_DAISY, .channel = 5U, .rsrc = DEV_SM_DAISY_SAI1_MCLK}, \ ++ {.testId = TEST_GPR, .channel = 5U, .rsrc = DEV_SM_GPR_4}, \ ++ {.testId = TEST_PD, .channel = 0U, .rsrc = DEV_SM_PD_A55P}, \ ++ {.testId = TEST_PD, .channel = 0U, .rsrc = DEV_SM_PD_M7}, \ ++ {.testId = TEST_PD, .channel = 5U, .rsrc = DEV_SM_PD_CAMERA}, \ ++ {.testId = TEST_PD, .channel = 5U, .rsrc = DEV_SM_PD_CAMERA}, \ ++ {.testId = TEST_PD, .channel = 5U, .rsrc = DEV_SM_PD_DISPLAY}, \ ++ {.testId = TEST_PD, .channel = 5U, .rsrc = DEV_SM_PD_GPU}, \ ++ {.testId = TEST_PD, .channel = 5U, .rsrc = DEV_SM_PD_HSIO_TOP}, \ ++ {.testId = TEST_PD, .channel = 5U, .rsrc = DEV_SM_PD_NPU}, \ ++ {.testId = TEST_PD, .channel = 5U, .rsrc = DEV_SM_PD_VPU}, \ ++ {.testId = TEST_PERF, .channel = 5U, .rsrc = DEV_SM_PERF_CAM}, \ ++ {.testId = TEST_PERF, .channel = 5U, .rsrc = DEV_SM_PERF_DISP}, \ ++ {.testId = TEST_PERF, .channel = 5U, .rsrc = DEV_SM_PERF_GPU}, \ ++ {.testId = TEST_PERF, .channel = 5U, .rsrc = DEV_SM_PERF_NPU}, \ ++ {.testId = TEST_PERF, .channel = 5U, .rsrc = DEV_SM_PERF_VPU}, \ ++ {.testId = TEST_PERLPI, .channel = 0U, .rsrc = DEV_SM_PERLPI_LPUART3}, \ ++ {.testId = TEST_PERLPI, .channel = 5U, .rsrc = DEV_SM_PERLPI_LPUART8}, \ ++ {.testId = TEST_PIN, .channel = 5U, .rsrc = DEV_SM_PIN_UART1_RXD}, \ ++ {.testId = TEST_RTC, .channel = 5U, .rsrc = DEV_SM_RTC_BBNSM}, \ ++ {.testId = TEST_SENSOR, .channel = 0U, .rsrc = DEV_SM_SENSOR_TEMP_ANA} ++ ++/*! Default channel for non-agent specific tests */ ++#define SM_TEST_DEFAULT_CHN 0U ++ ++#endif /* CONFIG_TEST_H */ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk/config_trdc.h b/configs/ccimx95dvk/config_trdc.h +new file mode 100644 +index 000000000000..1d8ed0b6fc95 +--- /dev/null ++++ b/configs/ccimx95dvk/config_trdc.h +@@ -0,0 +1,1373 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_CCIMX95DVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing configuration info for the TRDC SM abstraction. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_TRDC_H ++#define CONFIG_TRDC_H ++ ++/* Includes */ ++ ++#include "config_user.h" ++ ++/* Defines */ ++ ++/*--------------------------------------------------------------------------*/ ++/* TRDC A Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for TRDC A */ ++#define SM_TRDC_A_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000800U), 0xB00000A0U, \ ++ SM_CFG_W1(0x00000820U), 0xB0000012U, \ ++ SM_CFG_W1(0x00000840U), 0xB0000013U, \ ++ SM_CFG_W1(0x00000860U), 0xB0000013U, \ ++ SM_CFG_W1(0x00000880U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008a0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008c0U), 0xB0000014U, \ ++ SM_CFG_W1(0x00000a00U), 0x90000002U, \ ++ SM_CFG_W1(0x00000a04U), 0x90000002U, \ ++ SM_CFG_W1(0x00000a08U), 0x90000002U, \ ++ SM_CFG_W1(0x00000a20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a60U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a80U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000aa0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ac0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ae0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b60U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b80U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ba0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000bc0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000be0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c60U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c80U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ca0U), 0xB00000A1U, \ ++ SM_CFG_W1(0x00000cc0U), 0xB00000A1U, \ ++ SM_CFG_W1(0x00010024U), 0x6666U, \ ++ SM_CFG_W1(0x00010028U), 0x7777U, \ ++ SM_CFG_W1(0x0001002cU), 0x6600U, \ ++ SM_CFG_W1(0x00010030U), 0x4444U, \ ++ SM_CFG_Z1(0x00010050U), \ ++ SM_CFG_Z1(0x00010054U), \ ++ SM_CFG_W1(0x00010064U), 0x00000003U, \ ++ SM_CFG_W1(0x00010068U), 0x00000003U, \ ++ SM_CFG_W1(0x00010180U), 0x000000C0U, \ ++ SM_CFG_Z1(0x00010250U), \ ++ SM_CFG_Z1(0x00010254U), \ ++ SM_CFG_W1(0x00010264U), 0x00000900U, \ ++ SM_CFG_W1(0x00010380U), 0x000000C0U, \ ++ SM_CFG_W1(0x00010450U), 0x30003330U, \ ++ SM_CFG_W1(0x00010454U), 0x03333033U, \ ++ SM_CFG_W1(0x00010458U), 0x00030000U, \ ++ SM_CFG_W1(0x0001045cU), 0x33330000U, \ ++ SM_CFG_W1(0x00010460U), 0x33333333U, \ ++ SM_CFG_W1(0x00010464U), 0x30000003U, \ ++ SM_CFG_W1(0x00010468U), 0x33330030U, \ ++ SM_CFG_W1(0x0001046cU), 0x33333333U, \ ++ SM_CFG_W1(0x00010470U), 0x33333333U, \ ++ SM_CFG_W1(0x00010474U), 0x00003000U, \ ++ SM_CFG_W1(0x00010580U), 0x000003C0U, \ ++ SM_CFG_W1(0x000105a8U), 0x00000003U, \ ++ SM_CFG_W1(0x00010640U), 0x99999999U, \ ++ SM_CFG_W1(0x00010644U), 0x99999999U, \ ++ SM_CFG_W1(0x00010648U), 0x99999999U, \ ++ SM_CFG_W1(0x0001064cU), 0x99999999U, \ ++ SM_CFG_W1(0x00010650U), 0x09000309U, \ ++ SM_CFG_W1(0x00010654U), 0x0000C900U, \ ++ SM_CFG_W1(0x00010658U), 0x99909900U, \ ++ SM_CFG_W1(0x0001065cU), 0x00009099U, \ ++ SM_CFG_W1(0x00010668U), 0x00009900U, \ ++ SM_CFG_W1(0x0001066cU), 0x90909000U, \ ++ SM_CFG_W1(0x00010670U), 0x00009000U, \ ++ SM_CFG_W1(0x00010780U), 0x099330C0U, \ ++ SM_CFG_Z1(0x00010850U), \ ++ SM_CFG_W1(0x00010854U), 0x9000C000U, \ ++ SM_CFG_W1(0x00010858U), 0x00000099U, \ ++ SM_CFG_W1(0x0001085cU), 0x00000900U, \ ++ SM_CFG_W1(0x00010870U), 0x00000090U, \ ++ SM_CFG_W1(0x00010874U), 0x00000999U, \ ++ SM_CFG_W1(0x00010980U), 0x900000C0U, \ ++ SM_CFG_Z1(0x00010a50U), \ ++ SM_CFG_Z1(0x00010a54U), \ ++ SM_CFG_W1(0x00010b80U), 0x000000C0U, \ ++ SM_CFG_Z1(0x00010c50U), \ ++ SM_CFG_Z1(0x00010c54U), \ ++ SM_CFG_W1(0x00010d80U), 0x000000C0U, \ ++ SM_CFG_Z1(0x00010e50U), \ ++ SM_CFG_Z1(0x00010e54U), \ ++ SM_CFG_W1(0x00010f80U), 0x000000C0U, \ ++ SM_CFG_Z1(0x00011050U), \ ++ SM_CFG_Z1(0x00011054U), \ ++ SM_CFG_W1(0x00011064U), 0x09999000U, \ ++ SM_CFG_W1(0x00011180U), 0x000000C0U, \ ++ SM_CFG_W1(0x00011240U), 0x99999999U, \ ++ SM_CFG_W1(0x00011244U), 0x99999999U, \ ++ SM_CFG_W1(0x00011248U), 0x99999999U, \ ++ SM_CFG_W1(0x0001124cU), 0x99999999U, \ ++ SM_CFG_W1(0x00011250U), 0x99009999U, \ ++ SM_CFG_W1(0x00011254U), 0x99999999U, \ ++ SM_CFG_W1(0x00011258U), 0x99999999U, \ ++ SM_CFG_W1(0x0001125cU), 0x99999999U, \ ++ SM_CFG_W1(0x00011260U), 0x99999999U, \ ++ SM_CFG_W1(0x00011264U), 0x99999909U, \ ++ SM_CFG_W1(0x00011268U), 0x99999999U, \ ++ SM_CFG_W1(0x0001126cU), 0x99999999U, \ ++ SM_CFG_W1(0x00011270U), 0x99999999U, \ ++ SM_CFG_W1(0x00011274U), 0x00009999U, \ ++ SM_CFG_W1(0x00011380U), 0x99999990U, \ ++ SM_CFG_W1(0x000113a8U), 0x00000009U, \ ++ SM_CFG_Z1(0x00011450U), \ ++ SM_CFG_Z1(0x00011454U), \ ++ SM_CFG_W1(0x00011580U), 0x000000C0U, \ ++ SM_CFG_Z1(0x00011650U), \ ++ SM_CFG_Z1(0x00011654U), \ ++ SM_CFG_W1(0x00011780U), 0x000000C0U, \ ++ SM_CFG_Z1(0x00011850U), \ ++ SM_CFG_Z1(0x00011854U), \ ++ SM_CFG_W1(0x00011980U), 0x000000C0U, \ ++ SM_CFG_Z1(0x00011a50U), \ ++ SM_CFG_Z1(0x00011a54U), \ ++ SM_CFG_W1(0x00011b80U), 0x000000C0U, \ ++ SM_CFG_Z1(0x00011c50U), \ ++ SM_CFG_Z1(0x00011c54U), \ ++ SM_CFG_W1(0x00011d80U), 0x000000C0U, \ ++ SM_CFG_Z1(0x00011e50U), \ ++ SM_CFG_Z1(0x00011e54U), \ ++ SM_CFG_W1(0x00011f80U), 0x000000C0U, \ ++ SM_CFG_W1(0x00012024U), 0x6666U, \ ++ SM_CFG_W1(0x00012028U), 0x7777U, \ ++ SM_CFG_W1(0x0001202cU), 0x7700U, \ ++ SM_CFG_W1(0x00012180U), 0x99999999U, \ ++ SM_CFG_W1(0x00012184U), 0x99999999U, \ ++ SM_CFG_W1(0x00012188U), 0x99999999U, \ ++ SM_CFG_W1(0x0001218cU), 0x99999999U, \ ++ SM_CFG_Z1(0x00012240U), \ ++ SM_CFG_Z1(0x00012244U), \ ++ SM_CFG_Z1(0x00012248U), \ ++ SM_CFG_Z1(0x0001224cU), \ ++ SM_CFG_Z1(0x00012380U), \ ++ SM_CFG_Z1(0x00012384U), \ ++ SM_CFG_Z1(0x00012388U), \ ++ SM_CFG_Z1(0x0001238cU), \ ++ SM_CFG_W1(0x00012440U), 0x33333333U, \ ++ SM_CFG_W1(0x00012444U), 0x33333333U, \ ++ SM_CFG_W1(0x00012448U), 0x33333333U, \ ++ SM_CFG_W1(0x0001244cU), 0x33333333U, \ ++ SM_CFG_W1(0x00012580U), 0x33333333U, \ ++ SM_CFG_W1(0x00012584U), 0x33333333U, \ ++ SM_CFG_W1(0x00012588U), 0x33333333U, \ ++ SM_CFG_W1(0x0001258cU), 0x33333333U, \ ++ SM_CFG_Z1(0x00012640U), \ ++ SM_CFG_Z1(0x00012644U), \ ++ SM_CFG_Z1(0x00012648U), \ ++ SM_CFG_Z1(0x0001264cU), \ ++ SM_CFG_Z1(0x00012780U), \ ++ SM_CFG_Z1(0x00012784U), \ ++ SM_CFG_Z1(0x00012788U), \ ++ SM_CFG_Z1(0x0001278cU), \ ++ SM_CFG_Z1(0x00012840U), \ ++ SM_CFG_Z1(0x00012844U), \ ++ SM_CFG_Z1(0x00012848U), \ ++ SM_CFG_Z1(0x0001284cU), \ ++ SM_CFG_Z1(0x00012980U), \ ++ SM_CFG_Z1(0x00012984U), \ ++ SM_CFG_Z1(0x00012988U), \ ++ SM_CFG_Z1(0x0001298cU), \ ++ SM_CFG_Z1(0x00012a40U), \ ++ SM_CFG_Z1(0x00012a44U), \ ++ SM_CFG_Z1(0x00012a48U), \ ++ SM_CFG_Z1(0x00012a4cU), \ ++ SM_CFG_Z1(0x00012b80U), \ ++ SM_CFG_Z1(0x00012b84U), \ ++ SM_CFG_Z1(0x00012b88U), \ ++ SM_CFG_Z1(0x00012b8cU), \ ++ SM_CFG_Z1(0x00012c40U), \ ++ SM_CFG_Z1(0x00012c44U), \ ++ SM_CFG_Z1(0x00012c48U), \ ++ SM_CFG_Z1(0x00012c4cU), \ ++ SM_CFG_Z1(0x00012d80U), \ ++ SM_CFG_Z1(0x00012d84U), \ ++ SM_CFG_Z1(0x00012d88U), \ ++ SM_CFG_Z1(0x00012d8cU), \ ++ SM_CFG_Z1(0x00012e40U), \ ++ SM_CFG_Z1(0x00012e44U), \ ++ SM_CFG_Z1(0x00012e48U), \ ++ SM_CFG_Z1(0x00012e4cU), \ ++ SM_CFG_Z1(0x00012f80U), \ ++ SM_CFG_Z1(0x00012f84U), \ ++ SM_CFG_Z1(0x00012f88U), \ ++ SM_CFG_Z1(0x00012f8cU), \ ++ SM_CFG_Z1(0x00013040U), \ ++ SM_CFG_Z1(0x00013044U), \ ++ SM_CFG_Z1(0x00013048U), \ ++ SM_CFG_Z1(0x0001304cU), \ ++ SM_CFG_Z1(0x00013180U), \ ++ SM_CFG_Z1(0x00013184U), \ ++ SM_CFG_Z1(0x00013188U), \ ++ SM_CFG_Z1(0x0001318cU), \ ++ SM_CFG_W1(0x00013240U), 0x99999999U, \ ++ SM_CFG_W1(0x00013244U), 0x99999999U, \ ++ SM_CFG_W1(0x00013248U), 0x99999999U, \ ++ SM_CFG_W1(0x0001324cU), 0x99999999U, \ ++ SM_CFG_W1(0x00013380U), 0x99999999U, \ ++ SM_CFG_W1(0x00013384U), 0x99999999U, \ ++ SM_CFG_W1(0x00013388U), 0x99999999U, \ ++ SM_CFG_W1(0x0001338cU), 0x99999999U, \ ++ SM_CFG_Z1(0x00013440U), \ ++ SM_CFG_Z1(0x00013444U), \ ++ SM_CFG_Z1(0x00013448U), \ ++ SM_CFG_Z1(0x0001344cU), \ ++ SM_CFG_Z1(0x00013580U), \ ++ SM_CFG_Z1(0x00013584U), \ ++ SM_CFG_Z1(0x00013588U), \ ++ SM_CFG_Z1(0x0001358cU), \ ++ SM_CFG_Z1(0x00013640U), \ ++ SM_CFG_Z1(0x00013644U), \ ++ SM_CFG_Z1(0x00013648U), \ ++ SM_CFG_Z1(0x0001364cU), \ ++ SM_CFG_Z1(0x00013780U), \ ++ SM_CFG_Z1(0x00013784U), \ ++ SM_CFG_Z1(0x00013788U), \ ++ SM_CFG_Z1(0x0001378cU), \ ++ SM_CFG_Z1(0x00013840U), \ ++ SM_CFG_Z1(0x00013844U), \ ++ SM_CFG_Z1(0x00013848U), \ ++ SM_CFG_Z1(0x0001384cU), \ ++ SM_CFG_Z1(0x00013980U), \ ++ SM_CFG_Z1(0x00013984U), \ ++ SM_CFG_Z1(0x00013988U), \ ++ SM_CFG_Z1(0x0001398cU), \ ++ SM_CFG_W1(0x00014024U), 0x6666U, \ ++ SM_CFG_Z1(0x00014240U), \ ++ SM_CFG_W1(0x00014244U), 0x0003C001U, \ ++ SM_CFG_Z1(0x0001424cU), \ ++ SM_CFG_Z1(0x00014254U), \ ++ SM_CFG_Z1(0x0001425cU), \ ++ SM_CFG_W1(0x00014940U), 0x00000001U, \ ++ SM_CFG_W1(0x00014944U), 0x0003C011U, \ ++ SM_CFG_Z1(0x0001494cU), \ ++ SM_CFG_Z1(0x00014954U), \ ++ SM_CFG_Z1(0x0001495cU), \ ++ SM_CFG_Z1(0x00010020U), \ ++ SM_CFG_Z1(0x00012020U), \ ++ SM_CFG_W1(0x00014020U), 0x7700U, \ ++ SM_CFG_C1(0x00000000U), 0x0000C001U, \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* TRDC C Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for TRDC C */ ++#define SM_TRDC_C_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000800U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000820U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000840U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000860U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000880U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008a0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008c0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008e0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000900U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000920U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000940U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000960U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000980U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009a0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009c0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009e0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a60U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a80U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000aa0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ac0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ae0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00010024U), 0x6666U, \ ++ SM_CFG_W1(0x00010028U), 0x7777U, \ ++ SM_CFG_W1(0x0001002cU), 0x6600U, \ ++ SM_CFG_W1(0x00010040U), 0x00003000U, \ ++ SM_CFG_W1(0x00010240U), 0x00000900U, \ ++ SM_CFG_W1(0x00010440U), 0x00330000U, \ ++ SM_CFG_W1(0x00010640U), 0x99000090U, \ ++ SM_CFG_W1(0x00010644U), 0x99999999U, \ ++ SM_CFG_W1(0x00010648U), 0x99999999U, \ ++ SM_CFG_W1(0x0001064cU), 0x09999999U, \ ++ SM_CFG_W1(0x00010650U), 0x99999999U, \ ++ SM_CFG_W1(0x00010654U), 0x99999999U, \ ++ SM_CFG_W1(0x00010658U), 0x00000999U, \ ++ SM_CFG_Z1(0x00010840U), \ ++ SM_CFG_Z1(0x00010a40U), \ ++ SM_CFG_Z1(0x00010c40U), \ ++ SM_CFG_Z1(0x00010e40U), \ ++ SM_CFG_W1(0x00011040U), 0x00000009U, \ ++ SM_CFG_W1(0x00011240U), 0x99999999U, \ ++ SM_CFG_W1(0x00011244U), 0x99999999U, \ ++ SM_CFG_W1(0x00011248U), 0x99999999U, \ ++ SM_CFG_W1(0x0001124cU), 0x09999999U, \ ++ SM_CFG_W1(0x00011250U), 0x99999999U, \ ++ SM_CFG_W1(0x00011254U), 0x99999999U, \ ++ SM_CFG_W1(0x00011258U), 0x00000999U, \ ++ SM_CFG_Z1(0x00011440U), \ ++ SM_CFG_Z1(0x00011640U), \ ++ SM_CFG_Z1(0x00011840U), \ ++ SM_CFG_Z1(0x00011a40U), \ ++ SM_CFG_Z1(0x00011c40U), \ ++ SM_CFG_Z1(0x00011e40U), \ ++ SM_CFG_W1(0x00012024U), 0x6666U, \ ++ SM_CFG_W1(0x00012028U), 0x7777U, \ ++ SM_CFG_W1(0x0001202cU), 0x6600U, \ ++ SM_CFG_W1(0x00012440U), 0x00000003U, \ ++ SM_CFG_W1(0x00013240U), 0x00000009U, \ ++ SM_CFG_W1(0x00014024U), 0x6666U, \ ++ SM_CFG_W1(0x00014028U), 0x7777U, \ ++ SM_CFG_W1(0x00014640U), 0x00000009U, \ ++ SM_CFG_W1(0x00015240U), 0x00000009U, \ ++ SM_CFG_W1(0x00016024U), 0x6666U, \ ++ SM_CFG_W1(0x00016340U), 0x01000000U, \ ++ SM_CFG_W1(0x00016344U), 0x01014011U, \ ++ SM_CFG_Z1(0x0001634cU), \ ++ SM_CFG_W1(0x00016940U), 0x01000001U, \ ++ SM_CFG_W1(0x00016944U), 0x01014011U, \ ++ SM_CFG_Z1(0x0001694cU), \ ++ SM_CFG_Z1(0x00010020U), \ ++ SM_CFG_Z1(0x00012020U), \ ++ SM_CFG_Z1(0x00014020U), \ ++ SM_CFG_W1(0x00016020U), 0x7777U, \ ++ SM_CFG_C1(0x00000000U), 0x0000C001U, \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* TRDC D Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for TRDC D */ ++#define SM_TRDC_D_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000800U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000820U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000840U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000860U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000880U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008a0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008c0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008e0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00010024U), 0x6666U, \ ++ SM_CFG_W1(0x00010028U), 0x7777U, \ ++ SM_CFG_W1(0x0001002cU), 0x6600U, \ ++ SM_CFG_W1(0x00010040U), 0x00003000U, \ ++ SM_CFG_W1(0x00010180U), 0x00003000U, \ ++ SM_CFG_W1(0x00010240U), 0x00000900U, \ ++ SM_CFG_W1(0x00010380U), 0x00000900U, \ ++ SM_CFG_W1(0x00010440U), 0x00330000U, \ ++ SM_CFG_W1(0x0001045cU), 0x30000000U, \ ++ SM_CFG_W1(0x00010580U), 0x00330000U, \ ++ SM_CFG_W1(0x0001059cU), 0x30000000U, \ ++ SM_CFG_W1(0x00010640U), 0x90000090U, \ ++ SM_CFG_W1(0x00010644U), 0x99999999U, \ ++ SM_CFG_W1(0x00010648U), 0x00000009U, \ ++ SM_CFG_W1(0x00010658U), 0x00000009U, \ ++ SM_CFG_W1(0x00010780U), 0x90000090U, \ ++ SM_CFG_W1(0x00010784U), 0x99999999U, \ ++ SM_CFG_W1(0x00010788U), 0x00000009U, \ ++ SM_CFG_W1(0x00010798U), 0x00000009U, \ ++ SM_CFG_W1(0x000107a8U), 0x99999999U, \ ++ SM_CFG_W1(0x000107acU), 0x99999999U, \ ++ SM_CFG_W1(0x000107b0U), 0x99999999U, \ ++ SM_CFG_W1(0x000107b4U), 0x99999999U, \ ++ SM_CFG_W1(0x000107b8U), 0x99999999U, \ ++ SM_CFG_W1(0x000107bcU), 0x99999999U, \ ++ SM_CFG_W1(0x000107c0U), 0x99999999U, \ ++ SM_CFG_W1(0x000107c4U), 0x99999999U, \ ++ SM_CFG_W1(0x000107d0U), 0x99999999U, \ ++ SM_CFG_W1(0x000107d4U), 0x99999999U, \ ++ SM_CFG_W1(0x000107d8U), 0x99999999U, \ ++ SM_CFG_W1(0x000107dcU), 0x99999999U, \ ++ SM_CFG_W1(0x000107e0U), 0x99999999U, \ ++ SM_CFG_W1(0x000107e4U), 0x99999999U, \ ++ SM_CFG_W1(0x000107e8U), 0x99999999U, \ ++ SM_CFG_W1(0x000107ecU), 0x99999999U, \ ++ SM_CFG_Z1(0x00010840U), \ ++ SM_CFG_Z1(0x00010980U), \ ++ SM_CFG_Z1(0x00010a40U), \ ++ SM_CFG_Z1(0x00010b80U), \ ++ SM_CFG_Z1(0x00010c40U), \ ++ SM_CFG_Z1(0x00010d80U), \ ++ SM_CFG_Z1(0x00010e40U), \ ++ SM_CFG_Z1(0x00010f80U), \ ++ SM_CFG_W1(0x00011040U), 0x00000009U, \ ++ SM_CFG_W1(0x00011180U), 0x00000009U, \ ++ SM_CFG_W1(0x00011240U), 0x90999999U, \ ++ SM_CFG_W1(0x00011244U), 0x99999999U, \ ++ SM_CFG_W1(0x00011248U), 0x00000009U, \ ++ SM_CFG_W1(0x00011258U), 0x00000009U, \ ++ SM_CFG_W1(0x0001125cU), 0x90000000U, \ ++ SM_CFG_W1(0x00011380U), 0x90999999U, \ ++ SM_CFG_W1(0x00011384U), 0x99999999U, \ ++ SM_CFG_W1(0x00011388U), 0x00000009U, \ ++ SM_CFG_W1(0x00011398U), 0x00000009U, \ ++ SM_CFG_W1(0x0001139cU), 0x90000000U, \ ++ SM_CFG_W1(0x000113a8U), 0x99999999U, \ ++ SM_CFG_W1(0x000113acU), 0x99999999U, \ ++ SM_CFG_W1(0x000113b0U), 0x99999999U, \ ++ SM_CFG_W1(0x000113b4U), 0x99999999U, \ ++ SM_CFG_W1(0x000113b8U), 0x99999999U, \ ++ SM_CFG_W1(0x000113bcU), 0x99999999U, \ ++ SM_CFG_W1(0x000113c0U), 0x99999999U, \ ++ SM_CFG_W1(0x000113c4U), 0x99999999U, \ ++ SM_CFG_W1(0x000113d0U), 0x99999999U, \ ++ SM_CFG_W1(0x000113d4U), 0x99999999U, \ ++ SM_CFG_W1(0x000113d8U), 0x99999999U, \ ++ SM_CFG_W1(0x000113dcU), 0x99999999U, \ ++ SM_CFG_W1(0x000113e0U), 0x99999999U, \ ++ SM_CFG_W1(0x000113e4U), 0x99999999U, \ ++ SM_CFG_W1(0x000113e8U), 0x99999999U, \ ++ SM_CFG_W1(0x000113ecU), 0x99999999U, \ ++ SM_CFG_Z1(0x00011440U), \ ++ SM_CFG_Z1(0x00011580U), \ ++ SM_CFG_Z1(0x00011640U), \ ++ SM_CFG_Z1(0x00011780U), \ ++ SM_CFG_Z1(0x00011840U), \ ++ SM_CFG_Z1(0x00011980U), \ ++ SM_CFG_Z1(0x00011a40U), \ ++ SM_CFG_Z1(0x00011b80U), \ ++ SM_CFG_Z1(0x00011c40U), \ ++ SM_CFG_Z1(0x00011d80U), \ ++ SM_CFG_Z1(0x00011e40U), \ ++ SM_CFG_Z1(0x00011f80U), \ ++ SM_CFG_Z1(0x00010020U), \ ++ SM_CFG_C1(0x00000000U), 0x0000C001U, \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* TRDC E Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for TRDC E */ ++#define SM_TRDC_E_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000800U), 0xA8000053U, \ ++ SM_CFG_W1(0x00000820U), 0xA8400053U, \ ++ SM_CFG_W1(0x00000840U), 0xA8800053U, \ ++ SM_CFG_W1(0x00000860U), 0xA8C00053U, \ ++ SM_CFG_W1(0x00000880U), 0xA9000053U, \ ++ SM_CFG_W1(0x000008a0U), 0xA9400053U, \ ++ SM_CFG_W1(0x000008c0U), 0xA9800053U, \ ++ SM_CFG_W1(0x000008e0U), 0xA9C00053U, \ ++ SM_CFG_W1(0x00010024U), 0x6666U, \ ++ SM_CFG_W1(0x00010028U), 0x7777U, \ ++ SM_CFG_W1(0x0001002cU), 0x6600U, \ ++ SM_CFG_W1(0x000101a8U), 0x00003000U, \ ++ SM_CFG_W1(0x000103a8U), 0x00000900U, \ ++ SM_CFG_W1(0x000105a8U), 0x00330000U, \ ++ SM_CFG_W1(0x00010640U), 0x99999999U, \ ++ SM_CFG_W1(0x00010644U), 0x99999999U, \ ++ SM_CFG_W1(0x00010648U), 0x99999999U, \ ++ SM_CFG_W1(0x0001064cU), 0x99999999U, \ ++ SM_CFG_W1(0x00010780U), 0x99999999U, \ ++ SM_CFG_W1(0x000107a8U), 0x00000090U, \ ++ SM_CFG_W1(0x000107acU), 0x00009909U, \ ++ SM_CFG_Z1(0x000109a8U), \ ++ SM_CFG_Z1(0x00010ba8U), \ ++ SM_CFG_Z1(0x00010da8U), \ ++ SM_CFG_Z1(0x00010fa8U), \ ++ SM_CFG_W1(0x000111a8U), 0x00000009U, \ ++ SM_CFG_W1(0x00011240U), 0x99999999U, \ ++ SM_CFG_W1(0x00011244U), 0x99999999U, \ ++ SM_CFG_W1(0x00011248U), 0x99999999U, \ ++ SM_CFG_W1(0x0001124cU), 0x99999999U, \ ++ SM_CFG_W1(0x00011380U), 0x99999999U, \ ++ SM_CFG_W1(0x000113a8U), 0x00999999U, \ ++ SM_CFG_W1(0x000113acU), 0x00009909U, \ ++ SM_CFG_Z1(0x000115a8U), \ ++ SM_CFG_Z1(0x000117a8U), \ ++ SM_CFG_Z1(0x000119a8U), \ ++ SM_CFG_Z1(0x00011ba8U), \ ++ SM_CFG_Z1(0x00011da8U), \ ++ SM_CFG_Z1(0x00011fa8U), \ ++ SM_CFG_Z1(0x00010020U), \ ++ SM_CFG_C1(0x00000000U), 0x0000C001U, \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* TRDC G Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for TRDC G */ ++#define SM_TRDC_G_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000800U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000820U), 0xB0000053U, \ ++ SM_CFG_W1(0x00010024U), 0x6666U, \ ++ SM_CFG_W1(0x00010028U), 0x7777U, \ ++ SM_CFG_W1(0x0001002cU), 0x6600U, \ ++ SM_CFG_W1(0x00010040U), 0x00003000U, \ ++ SM_CFG_W1(0x00010240U), 0x00000900U, \ ++ SM_CFG_W1(0x00010440U), 0x00330030U, \ ++ SM_CFG_Z1(0x00010640U), \ ++ SM_CFG_Z1(0x00010840U), \ ++ SM_CFG_Z1(0x00010a40U), \ ++ SM_CFG_Z1(0x00010c40U), \ ++ SM_CFG_Z1(0x00010e40U), \ ++ SM_CFG_W1(0x00011040U), 0x00000009U, \ ++ SM_CFG_W1(0x00011240U), 0x00999999U, \ ++ SM_CFG_Z1(0x00011440U), \ ++ SM_CFG_Z1(0x00011640U), \ ++ SM_CFG_Z1(0x00011840U), \ ++ SM_CFG_Z1(0x00011a40U), \ ++ SM_CFG_Z1(0x00011c40U), \ ++ SM_CFG_Z1(0x00011e40U), \ ++ SM_CFG_W1(0x00012340U), 0x4D900000U, \ ++ SM_CFG_W1(0x00012344U), 0x4DD7C011U, \ ++ SM_CFG_Z1(0x0001234cU), \ ++ SM_CFG_Z1(0x00012354U), \ ++ SM_CFG_Z1(0x0001235cU), \ ++ SM_CFG_W1(0x00012940U), 0x4D900000U, \ ++ SM_CFG_W1(0x00012944U), 0x4DD7C011U, \ ++ SM_CFG_Z1(0x0001294cU), \ ++ SM_CFG_Z1(0x00012954U), \ ++ SM_CFG_Z1(0x0001295cU), \ ++ SM_CFG_Z1(0x00010020U), \ ++ SM_CFG_W1(0x00012020U), 0x6666U, \ ++ SM_CFG_C1(0x00000000U), 0x0000C001U, \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* TRDC H Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for TRDC H */ ++#define SM_TRDC_H_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000800U), 0xA3800053U, \ ++ SM_CFG_W1(0x00000820U), 0xA3C00053U, \ ++ SM_CFG_W1(0x00000840U), 0xA4000053U, \ ++ SM_CFG_W1(0x00000860U), 0xA4400053U, \ ++ SM_CFG_W1(0x00000880U), 0xA4800053U, \ ++ SM_CFG_W1(0x000008a0U), 0xA4C00053U, \ ++ SM_CFG_W1(0x000008c0U), 0xA5000053U, \ ++ SM_CFG_W1(0x000008e0U), 0xA5400053U, \ ++ SM_CFG_W1(0x00000900U), 0xA5800053U, \ ++ SM_CFG_W1(0x00000920U), 0xA5C00053U, \ ++ SM_CFG_W1(0x00000940U), 0xA6000053U, \ ++ SM_CFG_W1(0x00000960U), 0xA6400053U, \ ++ SM_CFG_W1(0x00000980U), 0xA6800053U, \ ++ SM_CFG_W1(0x000009a0U), 0xA6C00053U, \ ++ SM_CFG_W1(0x000009c0U), 0xA7000053U, \ ++ SM_CFG_W1(0x000009e0U), 0xA7400053U, \ ++ SM_CFG_W1(0x00000a00U), 0xA7800053U, \ ++ SM_CFG_W1(0x00000a20U), 0xA7C00053U, \ ++ SM_CFG_W1(0x00010024U), 0x6666U, \ ++ SM_CFG_W1(0x00010028U), 0x7777U, \ ++ SM_CFG_W1(0x0001002cU), 0x6600U, \ ++ SM_CFG_W1(0x000101a8U), 0x00003000U, \ ++ SM_CFG_W1(0x000103a8U), 0x00000900U, \ ++ SM_CFG_W1(0x000105a8U), 0x03330000U, \ ++ SM_CFG_W1(0x00010640U), 0x99999999U, \ ++ SM_CFG_W1(0x00010644U), 0x99999999U, \ ++ SM_CFG_W1(0x00010780U), 0x99999999U, \ ++ SM_CFG_W1(0x00010784U), 0x99999999U, \ ++ SM_CFG_W1(0x000107a8U), 0x00000090U, \ ++ SM_CFG_W1(0x000107d0U), 0x99999999U, \ ++ SM_CFG_W1(0x000107d4U), 0x99999999U, \ ++ SM_CFG_W1(0x000107d8U), 0x99999999U, \ ++ SM_CFG_Z1(0x000109a8U), \ ++ SM_CFG_Z1(0x00010ba8U), \ ++ SM_CFG_Z1(0x00010da8U), \ ++ SM_CFG_Z1(0x00010fa8U), \ ++ SM_CFG_W1(0x000111a8U), 0x00000009U, \ ++ SM_CFG_W1(0x00011240U), 0x99999999U, \ ++ SM_CFG_W1(0x00011244U), 0x99999999U, \ ++ SM_CFG_W1(0x00011380U), 0x99999999U, \ ++ SM_CFG_W1(0x00011384U), 0x99999999U, \ ++ SM_CFG_W1(0x000113a8U), 0x09999999U, \ ++ SM_CFG_W1(0x000113d0U), 0x99999999U, \ ++ SM_CFG_W1(0x000113d4U), 0x99999999U, \ ++ SM_CFG_W1(0x000113d8U), 0x99999999U, \ ++ SM_CFG_Z1(0x000115a8U), \ ++ SM_CFG_Z1(0x000117a8U), \ ++ SM_CFG_Z1(0x000119a8U), \ ++ SM_CFG_Z1(0x00011ba8U), \ ++ SM_CFG_Z1(0x00011da8U), \ ++ SM_CFG_Z1(0x00011fa8U), \ ++ SM_CFG_W1(0x00012024U), 0x6666U, \ ++ SM_CFG_W1(0x00012028U), 0x7777U, \ ++ SM_CFG_W1(0x00012640U), 0x00099999U, \ ++ SM_CFG_W1(0x00012780U), 0x00099999U, \ ++ SM_CFG_W1(0x000127a8U), 0x00099999U, \ ++ SM_CFG_W1(0x000127d0U), 0x00099999U, \ ++ SM_CFG_W1(0x00013240U), 0x00099999U, \ ++ SM_CFG_W1(0x00013380U), 0x00099999U, \ ++ SM_CFG_W1(0x000133a8U), 0x00099999U, \ ++ SM_CFG_W1(0x000133d0U), 0x00099999U, \ ++ SM_CFG_W1(0x00014024U), 0x6666U, \ ++ SM_CFG_W1(0x00014028U), 0x7777U, \ ++ SM_CFG_W1(0x00014640U), 0x99999999U, \ ++ SM_CFG_W1(0x00014644U), 0x99999999U, \ ++ SM_CFG_W1(0x00014648U), 0x99999999U, \ ++ SM_CFG_W1(0x00015240U), 0x99999999U, \ ++ SM_CFG_W1(0x00015244U), 0x99999999U, \ ++ SM_CFG_W1(0x00015248U), 0x99999999U, \ ++ SM_CFG_Z1(0x00010020U), \ ++ SM_CFG_Z1(0x00012020U), \ ++ SM_CFG_Z1(0x00014020U), \ ++ SM_CFG_C1(0x00000000U), 0x0000C001U, \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* TRDC M Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for TRDC M */ ++#define SM_TRDC_M_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000800U), 0xA0400053U, \ ++ SM_CFG_W1(0x00000820U), 0xA0800053U, \ ++ SM_CFG_W1(0x00000840U), 0xB00000A8U, \ ++ SM_CFG_W1(0x00000860U), 0xA0C00053U, \ ++ SM_CFG_W1(0x00000880U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008a0U), 0xB00000A9U, \ ++ SM_CFG_W1(0x000008c0U), 0xB00000A9U, \ ++ SM_CFG_W1(0x000008e0U), 0xB00000ACU, \ ++ SM_CFG_W1(0x00000900U), 0x90000004U, \ ++ SM_CFG_W1(0x00000920U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000940U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000960U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000980U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009a0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009c0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009e0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a60U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a80U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000aa0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ac0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ae0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b60U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b80U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ba0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000bc0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000be0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c60U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c80U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ca0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000cc0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ce0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000d00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000d20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000d40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000d60U), 0xB00000ACU, \ ++ SM_CFG_W1(0x00000d80U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000da0U), 0xB0000014U, \ ++ SM_CFG_W1(0x00000dc0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000de0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000e00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000e20U), 0xB0000053U, \ ++ SM_CFG_C1(0x00000000U), 0x0000C001U, \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* TRDC N Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for TRDC N */ ++#define SM_TRDC_N_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000800U), 0x90008003U, \ ++ SM_CFG_W1(0x00000804U), 0x90008003U, \ ++ SM_CFG_W1(0x00000808U), 0x90008003U, \ ++ SM_CFG_W1(0x0000080cU), 0x90008003U, \ ++ SM_CFG_W1(0x00000820U), 0x90008003U, \ ++ SM_CFG_W1(0x00000824U), 0x90008003U, \ ++ SM_CFG_W1(0x00000828U), 0x90008003U, \ ++ SM_CFG_W1(0x0000082cU), 0x90008003U, \ ++ SM_CFG_W1(0x00000840U), 0x90008003U, \ ++ SM_CFG_W1(0x00000844U), 0x90008003U, \ ++ SM_CFG_W1(0x00000848U), 0x90008003U, \ ++ SM_CFG_W1(0x0000084cU), 0x90008003U, \ ++ SM_CFG_W1(0x00000860U), 0x90008003U, \ ++ SM_CFG_W1(0x00000864U), 0x90008003U, \ ++ SM_CFG_W1(0x00000868U), 0x90008003U, \ ++ SM_CFG_W1(0x0000086cU), 0x90008003U, \ ++ SM_CFG_W1(0x00000880U), 0xA3400053U, \ ++ SM_CFG_W1(0x000008a0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008c0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00010024U), 0x6666U, \ ++ SM_CFG_W1(0x00010028U), 0x7777U, \ ++ SM_CFG_W1(0x0001002cU), 0x6600U, \ ++ SM_CFG_W1(0x00010040U), 0x00300000U, \ ++ SM_CFG_W1(0x00010180U), 0x00300000U, \ ++ SM_CFG_W1(0x000101a8U), 0x00003000U, \ ++ SM_CFG_W1(0x000101d0U), 0x00003000U, \ ++ SM_CFG_W1(0x00010240U), 0x00009000U, \ ++ SM_CFG_W1(0x00010380U), 0x00009000U, \ ++ SM_CFG_W1(0x000103a8U), 0x00000900U, \ ++ SM_CFG_W1(0x000103d0U), 0x00000900U, \ ++ SM_CFG_W1(0x00010440U), 0x33000333U, \ ++ SM_CFG_W1(0x00010444U), 0x00033303U, \ ++ SM_CFG_W1(0x00010450U), 0x30000000U, \ ++ SM_CFG_W1(0x00010580U), 0x33000333U, \ ++ SM_CFG_W1(0x00010584U), 0x00033303U, \ ++ SM_CFG_W1(0x00010590U), 0x30000000U, \ ++ SM_CFG_W1(0x000105a8U), 0x00030000U, \ ++ SM_CFG_W1(0x000105d0U), 0x00030000U, \ ++ SM_CFG_Z1(0x00010640U), \ ++ SM_CFG_W1(0x00010644U), 0x99900000U, \ ++ SM_CFG_W1(0x00010648U), 0x99999990U, \ ++ SM_CFG_W1(0x0001064cU), 0x99999999U, \ ++ SM_CFG_W1(0x00010650U), 0x09999999U, \ ++ SM_CFG_Z1(0x00010780U), \ ++ SM_CFG_W1(0x00010784U), 0x99900000U, \ ++ SM_CFG_W1(0x00010788U), 0x99999990U, \ ++ SM_CFG_W1(0x0001078cU), 0x99999999U, \ ++ SM_CFG_W1(0x00010790U), 0x09999999U, \ ++ SM_CFG_Z1(0x00010840U), \ ++ SM_CFG_Z1(0x00010980U), \ ++ SM_CFG_Z1(0x00010a40U), \ ++ SM_CFG_Z1(0x00010b80U), \ ++ SM_CFG_Z1(0x00010c40U), \ ++ SM_CFG_Z1(0x00010d80U), \ ++ SM_CFG_Z1(0x00010e40U), \ ++ SM_CFG_Z1(0x00010f80U), \ ++ SM_CFG_W1(0x00011040U), 0x00090000U, \ ++ SM_CFG_W1(0x00011180U), 0x00090000U, \ ++ SM_CFG_W1(0x000111a8U), 0x00000009U, \ ++ SM_CFG_W1(0x000111d0U), 0x00000009U, \ ++ SM_CFG_W1(0x00011240U), 0x99999999U, \ ++ SM_CFG_W1(0x00011244U), 0x99999909U, \ ++ SM_CFG_W1(0x00011248U), 0x99999990U, \ ++ SM_CFG_W1(0x0001124cU), 0x99999999U, \ ++ SM_CFG_W1(0x00011250U), 0x99999999U, \ ++ SM_CFG_W1(0x00011380U), 0x99999999U, \ ++ SM_CFG_W1(0x00011384U), 0x99999909U, \ ++ SM_CFG_W1(0x00011388U), 0x99999990U, \ ++ SM_CFG_W1(0x0001138cU), 0x99999999U, \ ++ SM_CFG_W1(0x00011390U), 0x99999999U, \ ++ SM_CFG_W1(0x000113a8U), 0x00099909U, \ ++ SM_CFG_W1(0x000113d0U), 0x00099909U, \ ++ SM_CFG_Z1(0x00011440U), \ ++ SM_CFG_Z1(0x00011580U), \ ++ SM_CFG_Z1(0x00011640U), \ ++ SM_CFG_Z1(0x00011780U), \ ++ SM_CFG_Z1(0x00011840U), \ ++ SM_CFG_Z1(0x00011980U), \ ++ SM_CFG_Z1(0x00011a40U), \ ++ SM_CFG_Z1(0x00011b80U), \ ++ SM_CFG_Z1(0x00011c40U), \ ++ SM_CFG_Z1(0x00011d80U), \ ++ SM_CFG_Z1(0x00011e40U), \ ++ SM_CFG_Z1(0x00011f80U), \ ++ SM_CFG_W1(0x00012024U), 0x6666U, \ ++ SM_CFG_W1(0x00012028U), 0x7777U, \ ++ SM_CFG_W1(0x0001202cU), 0x6600U, \ ++ SM_CFG_W1(0x00012440U), 0x33333333U, \ ++ SM_CFG_W1(0x00012444U), 0x33333333U, \ ++ SM_CFG_W1(0x00012448U), 0x00000333U, \ ++ SM_CFG_W1(0x00012580U), 0x33333333U, \ ++ SM_CFG_W1(0x00012584U), 0x33333333U, \ ++ SM_CFG_W1(0x00012588U), 0x00000333U, \ ++ SM_CFG_W1(0x00012640U), 0x99999999U, \ ++ SM_CFG_W1(0x00012644U), 0x99999999U, \ ++ SM_CFG_W1(0x00012648U), 0x00000999U, \ ++ SM_CFG_W1(0x00012780U), 0x99999999U, \ ++ SM_CFG_W1(0x00012784U), 0x99999999U, \ ++ SM_CFG_W1(0x00012788U), 0x00000999U, \ ++ SM_CFG_W1(0x00013240U), 0x99999999U, \ ++ SM_CFG_W1(0x00013244U), 0x99999999U, \ ++ SM_CFG_W1(0x00013248U), 0x00000999U, \ ++ SM_CFG_W1(0x00013380U), 0x99999999U, \ ++ SM_CFG_W1(0x00013384U), 0x99999999U, \ ++ SM_CFG_W1(0x00013388U), 0x00000999U, \ ++ SM_CFG_W1(0x00014024U), 0x6666U, \ ++ SM_CFG_W1(0x00014028U), 0x7777U, \ ++ SM_CFG_W1(0x0001402cU), 0x7700U, \ ++ SM_CFG_W1(0x00014040U), 0x99999999U, \ ++ SM_CFG_W1(0x00014044U), 0x99999999U, \ ++ SM_CFG_W1(0x00014048U), 0x00999999U, \ ++ SM_CFG_W1(0x00014180U), 0x99999999U, \ ++ SM_CFG_W1(0x00014184U), 0x99999999U, \ ++ SM_CFG_W1(0x00014188U), 0x00999999U, \ ++ SM_CFG_Z1(0x00014440U), \ ++ SM_CFG_Z1(0x00014444U), \ ++ SM_CFG_Z1(0x00014448U), \ ++ SM_CFG_Z1(0x00014580U), \ ++ SM_CFG_Z1(0x00014584U), \ ++ SM_CFG_Z1(0x00014588U), \ ++ SM_CFG_W1(0x00014640U), 0x33333333U, \ ++ SM_CFG_W1(0x00014644U), 0x33333333U, \ ++ SM_CFG_W1(0x00014648U), 0x00AAAAAAU, \ ++ SM_CFG_W1(0x00014780U), 0x33333333U, \ ++ SM_CFG_W1(0x00014784U), 0x33333333U, \ ++ SM_CFG_W1(0x00014788U), 0x00AAAAAAU, \ ++ SM_CFG_W1(0x000147a8U), 0x99999999U, \ ++ SM_CFG_W1(0x000147acU), 0x00000009U, \ ++ SM_CFG_W1(0x000147d0U), 0x99999999U, \ ++ SM_CFG_W1(0x000147d4U), 0x00000009U, \ ++ SM_CFG_Z1(0x00014840U), \ ++ SM_CFG_Z1(0x00014844U), \ ++ SM_CFG_Z1(0x00014848U), \ ++ SM_CFG_Z1(0x00014980U), \ ++ SM_CFG_Z1(0x00014984U), \ ++ SM_CFG_Z1(0x00014988U), \ ++ SM_CFG_Z1(0x00014a40U), \ ++ SM_CFG_Z1(0x00014a44U), \ ++ SM_CFG_Z1(0x00014a48U), \ ++ SM_CFG_Z1(0x00014b80U), \ ++ SM_CFG_Z1(0x00014b84U), \ ++ SM_CFG_Z1(0x00014b88U), \ ++ SM_CFG_Z1(0x00014c40U), \ ++ SM_CFG_Z1(0x00014c44U), \ ++ SM_CFG_Z1(0x00014c48U), \ ++ SM_CFG_Z1(0x00014d80U), \ ++ SM_CFG_Z1(0x00014d84U), \ ++ SM_CFG_Z1(0x00014d88U), \ ++ SM_CFG_Z1(0x00014e40U), \ ++ SM_CFG_Z1(0x00014e44U), \ ++ SM_CFG_Z1(0x00014e48U), \ ++ SM_CFG_Z1(0x00014f80U), \ ++ SM_CFG_Z1(0x00014f84U), \ ++ SM_CFG_Z1(0x00014f88U), \ ++ SM_CFG_W1(0x00015240U), 0x99999999U, \ ++ SM_CFG_W1(0x00015244U), 0x99999999U, \ ++ SM_CFG_W1(0x00015248U), 0x00999999U, \ ++ SM_CFG_W1(0x00015380U), 0x99999999U, \ ++ SM_CFG_W1(0x00015384U), 0x99999999U, \ ++ SM_CFG_W1(0x00015388U), 0x00999999U, \ ++ SM_CFG_W1(0x000153a8U), 0x99999999U, \ ++ SM_CFG_W1(0x000153acU), 0x00000009U, \ ++ SM_CFG_W1(0x000153d0U), 0x99999999U, \ ++ SM_CFG_W1(0x000153d4U), 0x00000009U, \ ++ SM_CFG_Z1(0x00015440U), \ ++ SM_CFG_Z1(0x00015444U), \ ++ SM_CFG_Z1(0x00015448U), \ ++ SM_CFG_Z1(0x00015580U), \ ++ SM_CFG_Z1(0x00015584U), \ ++ SM_CFG_Z1(0x00015588U), \ ++ SM_CFG_Z1(0x00015640U), \ ++ SM_CFG_Z1(0x00015644U), \ ++ SM_CFG_Z1(0x00015648U), \ ++ SM_CFG_Z1(0x00015780U), \ ++ SM_CFG_Z1(0x00015784U), \ ++ SM_CFG_Z1(0x00015788U), \ ++ SM_CFG_W1(0x00016024U), 0x6666U, \ ++ SM_CFG_W1(0x00016028U), 0x7777U, \ ++ SM_CFG_W1(0x0001602cU), 0x6600U, \ ++ SM_CFG_W1(0x000161a8U), 0x00003000U, \ ++ SM_CFG_W1(0x000161d0U), 0x00003000U, \ ++ SM_CFG_W1(0x00016240U), 0x00000900U, \ ++ SM_CFG_W1(0x00016380U), 0x00000900U, \ ++ SM_CFG_W1(0x000163a8U), 0x00000900U, \ ++ SM_CFG_W1(0x000163d0U), 0x00000900U, \ ++ SM_CFG_W1(0x00016440U), 0x33300030U, \ ++ SM_CFG_W1(0x00016444U), 0x00000033U, \ ++ SM_CFG_W1(0x00016580U), 0x33300030U, \ ++ SM_CFG_W1(0x00016584U), 0x00000033U, \ ++ SM_CFG_W1(0x000165a8U), 0x33300000U, \ ++ SM_CFG_W1(0x000165d0U), 0x33300000U, \ ++ SM_CFG_W1(0x00016644U), 0x00000090U, \ ++ SM_CFG_W1(0x00016784U), 0x00000090U, \ ++ SM_CFG_W1(0x000167a8U), 0x00000090U, \ ++ SM_CFG_W1(0x000167d0U), 0x00000090U, \ ++ SM_CFG_W1(0x00017040U), 0x00000009U, \ ++ SM_CFG_W1(0x00017180U), 0x00000009U, \ ++ SM_CFG_W1(0x000171a8U), 0x00000009U, \ ++ SM_CFG_W1(0x000171d0U), 0x00000009U, \ ++ SM_CFG_W1(0x00017240U), 0x99900999U, \ ++ SM_CFG_W1(0x00017244U), 0x00000099U, \ ++ SM_CFG_W1(0x00017380U), 0x99900999U, \ ++ SM_CFG_W1(0x00017384U), 0x00000099U, \ ++ SM_CFG_W1(0x000173a8U), 0x99909999U, \ ++ SM_CFG_W1(0x000173d0U), 0x99909999U, \ ++ SM_CFG_W1(0x00018024U), 0x6666U, \ ++ SM_CFG_W1(0x00018028U), 0x7777U, \ ++ SM_CFG_W1(0x0001802cU), 0x6600U, \ ++ SM_CFG_W1(0x00018440U), 0x33333333U, \ ++ SM_CFG_W1(0x00018580U), 0x33333333U, \ ++ SM_CFG_W1(0x00019240U), 0x99999999U, \ ++ SM_CFG_W1(0x00019380U), 0x99999999U, \ ++ SM_CFG_W1(0x0001a024U), 0x7777U, \ ++ SM_CFG_W1(0x0001a028U), 0x7700U, \ ++ SM_CFG_W1(0x0001a040U), 0x08000000U, \ ++ SM_CFG_W1(0x0001a044U), 0x87FFFC11U, \ ++ SM_CFG_Z1(0x0001a04cU), \ ++ SM_CFG_Z1(0x0001a054U), \ ++ SM_CFG_Z1(0x0001a05cU), \ ++ SM_CFG_Z1(0x0001a244U), \ ++ SM_CFG_Z1(0x0001a24cU), \ ++ SM_CFG_Z1(0x0001a254U), \ ++ SM_CFG_Z1(0x0001a25cU), \ ++ SM_CFG_W1(0x0001a340U), 0x08800001U, \ ++ SM_CFG_W1(0x0001a344U), 0x089FFC11U, \ ++ SM_CFG_W1(0x0001a348U), 0x08A00002U, \ ++ SM_CFG_W1(0x0001a34cU), 0x08DFFC01U, \ ++ SM_CFG_W1(0x0001a350U), 0x08E00001U, \ ++ SM_CFG_W1(0x0001a354U), 0x87FFFC11U, \ ++ SM_CFG_Z1(0x0001a35cU), \ ++ SM_CFG_W1(0x0001a440U), 0x08000001U, \ ++ SM_CFG_W1(0x0001a444U), 0x089FFC11U, \ ++ SM_CFG_Z1(0x0001a44cU), \ ++ SM_CFG_Z1(0x0001a454U), \ ++ SM_CFG_Z1(0x0001a45cU), \ ++ SM_CFG_Z1(0x0001a544U), \ ++ SM_CFG_Z1(0x0001a54cU), \ ++ SM_CFG_Z1(0x0001a554U), \ ++ SM_CFG_Z1(0x0001a55cU), \ ++ SM_CFG_Z1(0x0001a644U), \ ++ SM_CFG_Z1(0x0001a64cU), \ ++ SM_CFG_Z1(0x0001a654U), \ ++ SM_CFG_Z1(0x0001a65cU), \ ++ SM_CFG_Z1(0x0001a744U), \ ++ SM_CFG_Z1(0x0001a74cU), \ ++ SM_CFG_Z1(0x0001a754U), \ ++ SM_CFG_Z1(0x0001a75cU), \ ++ SM_CFG_Z1(0x0001a844U), \ ++ SM_CFG_Z1(0x0001a84cU), \ ++ SM_CFG_Z1(0x0001a854U), \ ++ SM_CFG_Z1(0x0001a85cU), \ ++ SM_CFG_W1(0x0001a940U), 0x08000000U, \ ++ SM_CFG_W1(0x0001a944U), 0x089FFC11U, \ ++ SM_CFG_W1(0x0001a948U), 0x08800000U, \ ++ SM_CFG_W1(0x0001a94cU), 0x089FFC11U, \ ++ SM_CFG_W1(0x0001a950U), 0x08A00000U, \ ++ SM_CFG_W1(0x0001a954U), 0x08DFFC11U, \ ++ SM_CFG_W1(0x0001a958U), 0x08E00000U, \ ++ SM_CFG_W1(0x0001a95cU), 0x87FFFC11U, \ ++ SM_CFG_Z1(0x0001aa44U), \ ++ SM_CFG_Z1(0x0001aa4cU), \ ++ SM_CFG_Z1(0x0001aa54U), \ ++ SM_CFG_Z1(0x0001aa5cU), \ ++ SM_CFG_Z1(0x0001ab44U), \ ++ SM_CFG_Z1(0x0001ab4cU), \ ++ SM_CFG_Z1(0x0001ab54U), \ ++ SM_CFG_Z1(0x0001ab5cU), \ ++ SM_CFG_W1(0x0001ac40U), 0x08B00000U, \ ++ SM_CFG_W1(0x0001ac44U), 0x08BFFC11U, \ ++ SM_CFG_Z1(0x0001ac4cU), \ ++ SM_CFG_Z1(0x0001ac54U), \ ++ SM_CFG_Z1(0x0001ac5cU), \ ++ SM_CFG_Z1(0x00010020U), \ ++ SM_CFG_Z1(0x00012020U), \ ++ SM_CFG_Z1(0x00014020U), \ ++ SM_CFG_Z1(0x00016020U), \ ++ SM_CFG_Z1(0x00018020U), \ ++ SM_CFG_W1(0x0001a020U), 0x6666U, \ ++ SM_CFG_C1(0x00000000U), 0x0000C001U, \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* TRDC V Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for TRDC V */ ++#define SM_TRDC_V_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000800U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000820U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000840U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000860U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000880U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008a0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008c0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008e0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000900U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000920U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000940U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000960U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000980U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009a0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009c0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009e0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00010024U), 0x6666U, \ ++ SM_CFG_W1(0x00010028U), 0x7777U, \ ++ SM_CFG_W1(0x0001002cU), 0x6600U, \ ++ SM_CFG_W1(0x00010040U), 0x00003000U, \ ++ SM_CFG_W1(0x00010180U), 0x00003000U, \ ++ SM_CFG_W1(0x00010240U), 0x00000900U, \ ++ SM_CFG_W1(0x00010380U), 0x00000900U, \ ++ SM_CFG_W1(0x00010440U), 0x00330000U, \ ++ SM_CFG_W1(0x00010450U), 0x00000003U, \ ++ SM_CFG_W1(0x00010580U), 0x00330000U, \ ++ SM_CFG_W1(0x00010590U), 0x00000003U, \ ++ SM_CFG_W1(0x00010640U), 0x00000090U, \ ++ SM_CFG_W1(0x00010644U), 0x00099999U, \ ++ SM_CFG_W1(0x00010648U), 0x99999999U, \ ++ SM_CFG_W1(0x0001064cU), 0x00000099U, \ ++ SM_CFG_W1(0x00010780U), 0x00000090U, \ ++ SM_CFG_W1(0x00010784U), 0x00099999U, \ ++ SM_CFG_W1(0x00010788U), 0x99999999U, \ ++ SM_CFG_W1(0x0001078cU), 0x00000099U, \ ++ SM_CFG_Z1(0x00010840U), \ ++ SM_CFG_Z1(0x00010980U), \ ++ SM_CFG_Z1(0x00010a40U), \ ++ SM_CFG_Z1(0x00010b80U), \ ++ SM_CFG_Z1(0x00010c40U), \ ++ SM_CFG_Z1(0x00010d80U), \ ++ SM_CFG_Z1(0x00010e40U), \ ++ SM_CFG_Z1(0x00010f80U), \ ++ SM_CFG_W1(0x00011040U), 0x00000009U, \ ++ SM_CFG_W1(0x00011180U), 0x00000009U, \ ++ SM_CFG_W1(0x00011240U), 0x00999999U, \ ++ SM_CFG_W1(0x00011244U), 0x00099999U, \ ++ SM_CFG_W1(0x00011248U), 0x99999999U, \ ++ SM_CFG_W1(0x0001124cU), 0x00000099U, \ ++ SM_CFG_W1(0x00011250U), 0x00000009U, \ ++ SM_CFG_W1(0x00011380U), 0x00999999U, \ ++ SM_CFG_W1(0x00011384U), 0x00099999U, \ ++ SM_CFG_W1(0x00011388U), 0x99999999U, \ ++ SM_CFG_W1(0x0001138cU), 0x00000099U, \ ++ SM_CFG_W1(0x00011390U), 0x00000009U, \ ++ SM_CFG_Z1(0x00011440U), \ ++ SM_CFG_Z1(0x00011580U), \ ++ SM_CFG_Z1(0x00011640U), \ ++ SM_CFG_Z1(0x00011780U), \ ++ SM_CFG_Z1(0x00011840U), \ ++ SM_CFG_Z1(0x00011980U), \ ++ SM_CFG_Z1(0x00011a40U), \ ++ SM_CFG_Z1(0x00011b80U), \ ++ SM_CFG_Z1(0x00011c40U), \ ++ SM_CFG_Z1(0x00011d80U), \ ++ SM_CFG_Z1(0x00011e40U), \ ++ SM_CFG_Z1(0x00011f80U), \ ++ SM_CFG_Z1(0x00010020U), \ ++ SM_CFG_C1(0x00000000U), 0x0000C001U, \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* TRDC W Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Config for TRDC W */ ++#define SM_TRDC_W_CONFIG \ ++ { \ ++ SM_CFG_W1(0x00000800U), 0x90000004U, \ ++ SM_CFG_W1(0x00000820U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000840U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000860U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000880U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008a0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008c0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000008e0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000900U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000920U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000940U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000960U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000980U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009a0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009c0U), 0xB0000053U, \ ++ SM_CFG_W1(0x000009e0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a60U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000a80U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000aa0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ac0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ae0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b60U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000b80U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000ba0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000bc0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000be0U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c00U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c20U), 0xB0000053U, \ ++ SM_CFG_W1(0x00000c40U), 0xB0000053U, \ ++ SM_CFG_W1(0x00010024U), 0x6666U, \ ++ SM_CFG_W1(0x00010028U), 0x7777U, \ ++ SM_CFG_W1(0x0001002cU), 0x6600U, \ ++ SM_CFG_Z1(0x00010060U), \ ++ SM_CFG_W1(0x00010070U), 0x00003000U, \ ++ SM_CFG_Z1(0x00010260U), \ ++ SM_CFG_W1(0x00010270U), 0x00000090U, \ ++ SM_CFG_W1(0x00010460U), 0x33000300U, \ ++ SM_CFG_W1(0x00010474U), 0x00000030U, \ ++ SM_CFG_W1(0x00010478U), 0x33300000U, \ ++ SM_CFG_W1(0x0001047cU), 0x00003333U, \ ++ SM_CFG_W1(0x000105d0U), 0x33333333U, \ ++ SM_CFG_W1(0x000105d4U), 0x33333333U, \ ++ SM_CFG_W1(0x000105d8U), 0x00000003U, \ ++ SM_CFG_W1(0x00010640U), 0x99999999U, \ ++ SM_CFG_W1(0x00010644U), 0x99999999U, \ ++ SM_CFG_W1(0x00010648U), 0x99999999U, \ ++ SM_CFG_W1(0x0001064cU), 0x99999999U, \ ++ SM_CFG_W1(0x00010650U), 0x99999999U, \ ++ SM_CFG_W1(0x00010654U), 0x99999999U, \ ++ SM_CFG_W1(0x00010658U), 0x99999999U, \ ++ SM_CFG_W1(0x0001065cU), 0x99999999U, \ ++ SM_CFG_W1(0x00010660U), 0x00909099U, \ ++ SM_CFG_W1(0x00010664U), 0x99090990U, \ ++ SM_CFG_W1(0x00010668U), 0x09999999U, \ ++ SM_CFG_W1(0x0001066cU), 0x09999999U, \ ++ SM_CFG_W1(0x00010670U), 0x99900009U, \ ++ SM_CFG_W1(0x00010674U), 0x99999909U, \ ++ SM_CFG_W1(0x00010678U), 0x00009999U, \ ++ SM_CFG_W1(0x0001067cU), 0x00990000U, \ ++ SM_CFG_W1(0x00010780U), 0x00000009U, \ ++ SM_CFG_W1(0x000107a8U), 0x00000009U, \ ++ SM_CFG_W1(0x00010860U), 0x00090000U, \ ++ SM_CFG_W1(0x00010864U), 0x00909009U, \ ++ SM_CFG_W1(0x00010868U), 0x90000000U, \ ++ SM_CFG_W1(0x00010878U), 0x00090000U, \ ++ SM_CFG_Z1(0x00010a60U), \ ++ SM_CFG_Z1(0x00010c60U), \ ++ SM_CFG_Z1(0x00010e60U), \ ++ SM_CFG_Z1(0x00011060U), \ ++ SM_CFG_W1(0x00011070U), 0x00000900U, \ ++ SM_CFG_W1(0x00011240U), 0x99999999U, \ ++ SM_CFG_W1(0x00011244U), 0x99999999U, \ ++ SM_CFG_W1(0x00011248U), 0x99999999U, \ ++ SM_CFG_W1(0x0001124cU), 0x99999999U, \ ++ SM_CFG_W1(0x00011250U), 0x99999999U, \ ++ SM_CFG_W1(0x00011254U), 0x99999999U, \ ++ SM_CFG_W1(0x00011258U), 0x99999999U, \ ++ SM_CFG_W1(0x0001125cU), 0x99999999U, \ ++ SM_CFG_W1(0x00011260U), 0x99999999U, \ ++ SM_CFG_W1(0x00011264U), 0x99999999U, \ ++ SM_CFG_W1(0x00011268U), 0x99999999U, \ ++ SM_CFG_W1(0x0001126cU), 0x09999999U, \ ++ SM_CFG_W1(0x00011270U), 0x99909999U, \ ++ SM_CFG_W1(0x00011274U), 0x99999999U, \ ++ SM_CFG_W1(0x00011278U), 0x99999999U, \ ++ SM_CFG_W1(0x0001127cU), 0x00999999U, \ ++ SM_CFG_W1(0x00011380U), 0x00000009U, \ ++ SM_CFG_W1(0x000113a8U), 0x00000009U, \ ++ SM_CFG_W1(0x000113d0U), 0x99999999U, \ ++ SM_CFG_W1(0x000113d4U), 0x99999999U, \ ++ SM_CFG_W1(0x000113d8U), 0x00000009U, \ ++ SM_CFG_Z1(0x00011460U), \ ++ SM_CFG_Z1(0x00011660U), \ ++ SM_CFG_Z1(0x00011860U), \ ++ SM_CFG_Z1(0x00011a60U), \ ++ SM_CFG_Z1(0x00011c60U), \ ++ SM_CFG_Z1(0x00011e60U), \ ++ SM_CFG_W1(0x00012024U), 0x6666U, \ ++ SM_CFG_W1(0x00012028U), 0x7777U, \ ++ SM_CFG_W1(0x0001202cU), 0x6600U, \ ++ SM_CFG_Z1(0x00012040U), \ ++ SM_CFG_W1(0x00012180U), 0x00000003U, \ ++ SM_CFG_W1(0x00012240U), 0x90000000U, \ ++ SM_CFG_W1(0x00012440U), 0x00003330U, \ ++ SM_CFG_W1(0x000125a8U), 0x00000003U, \ ++ SM_CFG_W1(0x00012640U), 0x09900000U, \ ++ SM_CFG_W1(0x00012644U), 0x00009900U, \ ++ SM_CFG_W1(0x000127d0U), 0x00000099U, \ ++ SM_CFG_Z1(0x00012840U), \ ++ SM_CFG_Z1(0x00012a40U), \ ++ SM_CFG_Z1(0x00012c40U), \ ++ SM_CFG_Z1(0x00012e40U), \ ++ SM_CFG_Z1(0x00013040U), \ ++ SM_CFG_W1(0x00013240U), 0x99909990U, \ ++ SM_CFG_W1(0x00013244U), 0x00009900U, \ ++ SM_CFG_W1(0x00013380U), 0x00000009U, \ ++ SM_CFG_W1(0x000133a8U), 0x00000009U, \ ++ SM_CFG_W1(0x000133d0U), 0x00000099U, \ ++ SM_CFG_Z1(0x00013440U), \ ++ SM_CFG_Z1(0x00013640U), \ ++ SM_CFG_Z1(0x00013840U), \ ++ SM_CFG_Z1(0x00013a40U), \ ++ SM_CFG_Z1(0x00013c40U), \ ++ SM_CFG_Z1(0x00013e40U), \ ++ SM_CFG_W1(0x00014024U), 0x6666U, \ ++ SM_CFG_W1(0x00014028U), 0x7777U, \ ++ SM_CFG_W1(0x00014640U), 0x00999909U, \ ++ SM_CFG_W1(0x00014780U), 0x00999909U, \ ++ SM_CFG_W1(0x00014840U), 0x00000090U, \ ++ SM_CFG_W1(0x00014980U), 0x00000090U, \ ++ SM_CFG_W1(0x00015240U), 0x00999999U, \ ++ SM_CFG_W1(0x00015380U), 0x00999999U, \ ++ SM_CFG_W1(0x00017024U), 0x6666U, \ ++ SM_CFG_Z1(0x00017244U), \ ++ SM_CFG_Z1(0x0001724cU), \ ++ SM_CFG_Z1(0x00017254U), \ ++ SM_CFG_Z1(0x0001725cU), \ ++ SM_CFG_Z1(0x00017340U), \ ++ SM_CFG_W1(0x00017344U), 0xFFFFC011U, \ ++ SM_CFG_Z1(0x0001734cU), \ ++ SM_CFG_Z1(0x00017354U), \ ++ SM_CFG_Z1(0x0001735cU), \ ++ SM_CFG_Z1(0x00017444U), \ ++ SM_CFG_Z1(0x0001744cU), \ ++ SM_CFG_Z1(0x00017454U), \ ++ SM_CFG_Z1(0x0001745cU), \ ++ SM_CFG_Z1(0x00017544U), \ ++ SM_CFG_Z1(0x0001754cU), \ ++ SM_CFG_Z1(0x00017554U), \ ++ SM_CFG_Z1(0x0001755cU), \ ++ SM_CFG_Z1(0x00017644U), \ ++ SM_CFG_Z1(0x0001764cU), \ ++ SM_CFG_Z1(0x00017654U), \ ++ SM_CFG_Z1(0x0001765cU), \ ++ SM_CFG_Z1(0x00017744U), \ ++ SM_CFG_Z1(0x0001774cU), \ ++ SM_CFG_Z1(0x00017754U), \ ++ SM_CFG_Z1(0x0001775cU), \ ++ SM_CFG_Z1(0x00017844U), \ ++ SM_CFG_Z1(0x0001784cU), \ ++ SM_CFG_Z1(0x00017854U), \ ++ SM_CFG_Z1(0x0001785cU), \ ++ SM_CFG_W1(0x00017940U), 0x00000001U, \ ++ SM_CFG_W1(0x00017944U), 0xFFFFC011U, \ ++ SM_CFG_Z1(0x0001794cU), \ ++ SM_CFG_Z1(0x00017954U), \ ++ SM_CFG_Z1(0x0001795cU), \ ++ SM_CFG_Z1(0x00017a44U), \ ++ SM_CFG_Z1(0x00017a4cU), \ ++ SM_CFG_Z1(0x00017a54U), \ ++ SM_CFG_Z1(0x00017a5cU), \ ++ SM_CFG_Z1(0x00017b44U), \ ++ SM_CFG_Z1(0x00017b4cU), \ ++ SM_CFG_Z1(0x00017b54U), \ ++ SM_CFG_Z1(0x00017b5cU), \ ++ SM_CFG_Z1(0x00017c44U), \ ++ SM_CFG_Z1(0x00017c4cU), \ ++ SM_CFG_Z1(0x00017c54U), \ ++ SM_CFG_Z1(0x00017c5cU), \ ++ SM_CFG_W1(0x00018024U), 0x6666U, \ ++ SM_CFG_W1(0x00018040U), 0x4A030000U, \ ++ SM_CFG_W1(0x00018044U), 0x4A03C001U, \ ++ SM_CFG_Z1(0x0001804cU), \ ++ SM_CFG_Z1(0x00018054U), \ ++ SM_CFG_Z1(0x0001805cU), \ ++ SM_CFG_W1(0x00018140U), 0x4A020001U, \ ++ SM_CFG_W1(0x00018144U), 0x4A02C011U, \ ++ SM_CFG_Z1(0x0001814cU), \ ++ SM_CFG_Z1(0x00018154U), \ ++ SM_CFG_Z1(0x0001815cU), \ ++ SM_CFG_W1(0x00018240U), 0x4A050000U, \ ++ SM_CFG_W1(0x00018244U), 0x4A0AC001U, \ ++ SM_CFG_Z1(0x0001824cU), \ ++ SM_CFG_Z1(0x00018254U), \ ++ SM_CFG_Z1(0x0001825cU), \ ++ SM_CFG_Z1(0x00018344U), \ ++ SM_CFG_Z1(0x0001834cU), \ ++ SM_CFG_Z1(0x00018354U), \ ++ SM_CFG_Z1(0x0001835cU), \ ++ SM_CFG_W1(0x00018440U), 0x4A060001U, \ ++ SM_CFG_W1(0x00018444U), 0x4A09C011U, \ ++ SM_CFG_W1(0x00018448U), 0x20380001U, \ ++ SM_CFG_W1(0x0001844cU), 0x2047C011U, \ ++ SM_CFG_Z1(0x00018454U), \ ++ SM_CFG_Z1(0x0001845cU), \ ++ SM_CFG_Z1(0x00018544U), \ ++ SM_CFG_Z1(0x0001854cU), \ ++ SM_CFG_Z1(0x00018554U), \ ++ SM_CFG_Z1(0x0001855cU), \ ++ SM_CFG_Z1(0x00018644U), \ ++ SM_CFG_Z1(0x0001864cU), \ ++ SM_CFG_Z1(0x00018654U), \ ++ SM_CFG_Z1(0x0001865cU), \ ++ SM_CFG_Z1(0x00018744U), \ ++ SM_CFG_Z1(0x0001874cU), \ ++ SM_CFG_Z1(0x00018754U), \ ++ SM_CFG_Z1(0x0001875cU), \ ++ SM_CFG_Z1(0x00018844U), \ ++ SM_CFG_Z1(0x0001884cU), \ ++ SM_CFG_Z1(0x00018854U), \ ++ SM_CFG_Z1(0x0001885cU), \ ++ SM_CFG_W1(0x00018940U), 0x4A020001U, \ ++ SM_CFG_W1(0x00018944U), 0x4A02C011U, \ ++ SM_CFG_W1(0x00018948U), 0x4A030001U, \ ++ SM_CFG_W1(0x0001894cU), 0x4A03C011U, \ ++ SM_CFG_W1(0x00018950U), 0x4A050001U, \ ++ SM_CFG_W1(0x00018954U), 0x4A0AC011U, \ ++ SM_CFG_W1(0x00018958U), 0x4A060001U, \ ++ SM_CFG_W1(0x0001895cU), 0x4A09C011U, \ ++ SM_CFG_W1(0x00018960U), 0x20380001U, \ ++ SM_CFG_W1(0x00018964U), 0x2047C011U, \ ++ SM_CFG_Z1(0x00018a44U), \ ++ SM_CFG_Z1(0x00018a4cU), \ ++ SM_CFG_Z1(0x00018a54U), \ ++ SM_CFG_Z1(0x00018a5cU), \ ++ SM_CFG_Z1(0x00018b44U), \ ++ SM_CFG_Z1(0x00018b4cU), \ ++ SM_CFG_Z1(0x00018b54U), \ ++ SM_CFG_Z1(0x00018b5cU), \ ++ SM_CFG_Z1(0x00018c44U), \ ++ SM_CFG_Z1(0x00018c4cU), \ ++ SM_CFG_Z1(0x00018c54U), \ ++ SM_CFG_Z1(0x00018c5cU), \ ++ SM_CFG_Z1(0x00010020U), \ ++ SM_CFG_Z1(0x00012020U), \ ++ SM_CFG_Z1(0x00014020U), \ ++ SM_CFG_W1(0x00017020U), 0x7777U, \ ++ SM_CFG_W1(0x00018020U), 0x6600U, \ ++ SM_CFG_C1(0x00000000U), 0x0000C001U, \ ++ SM_CFG_END \ ++ } ++ ++#endif /* CONFIG_TRDC_H */ ++ ++/** @} */ ++ +diff --git a/configs/ccimx95dvk/config_user.h b/configs/ccimx95dvk/config_user.h +new file mode 100644 +index 000000000000..bb1bdba57765 +--- /dev/null ++++ b/configs/ccimx95dvk/config_user.h +@@ -0,0 +1,230 @@ ++/* ++** ################################################################### ++** ++** Copyright 2023-2025 NXP ++** ++** Redistribution and use in source and binary forms, with or without modification, ++** are permitted provided that the following conditions are met: ++** ++** o Redistributions of source code must retain the above copyright notice, this list ++** of conditions and the following disclaimer. ++** ++** o Redistributions in binary form must reproduce the above copyright notice, this ++** list of conditions and the following disclaimer in the documentation and/or ++** other materials provided with the distribution. ++** ++** o Neither the name of the copyright holder nor the names of its ++** contributors may be used to endorse or promote products derived from this ++** software without specific prior written permission. ++** ++** 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 HOLDER 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. ++** ++** ++** ################################################################### ++*/ ++ ++/*==========================================================================*/ ++/*! ++ * @addtogroup CONFIG_CCIMX95DVK ++ * @{ ++ * ++ * @file ++ * @brief ++ * ++ * Header file containing configuration info for the manual user settings. ++ */ ++/*==========================================================================*/ ++ ++#ifndef CONFIG_USER_H ++#define CONFIG_USER_H ++ ++/* Includes */ ++ ++#include "config.h" ++ ++/* Defines */ ++ ++ ++/*--------------------------------------------------------------------------*/ ++/* CAMERA Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the CAMERA mix */ ++#define SM_CAMERA_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* A55P Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the A55P mix */ ++#define SM_A55P_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* DDR Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the DDR mix */ ++#define SM_DDR_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* DISPLAY Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the DISPLAY mix */ ++#define SM_DISPLAY_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* GPU Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the GPU mix */ ++#define SM_GPU_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* HSIO_TOP Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the HSIO_TOP mix */ ++#define SM_HSIO_TOP_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* HSIO_WAON Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the HSIO_WAON mix */ ++#define SM_HSIO_WAON_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* M7 Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the M7 mix */ ++#define SM_M7_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* NETC Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the NETC mix */ ++#define SM_NETC_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* NOC Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the NOC mix */ ++#define SM_NOC_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* NPU Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the NPU mix */ ++#define SM_NPU_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* VPU Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the VPU mix */ ++#define SM_VPU_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* WKUP Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the WKUP mix */ ++#define SM_WKUP_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* ANA Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the ANA mix */ ++#define SM_ANA_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* AON Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the AON mix */ ++#define SM_AON_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* BBSM Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the BBSM mix */ ++#define SM_BBSM_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++/*--------------------------------------------------------------------------*/ ++/* CCMSRCGPC Config */ ++/*--------------------------------------------------------------------------*/ ++ ++/*! Data load config for the CCMSRCGPC mix */ ++#define SM_CCMSRCGPC_CONFIG \ ++ { \ ++ SM_CFG_END \ ++ } ++ ++#endif /* CONFIG_USER_H */ ++ ++/** @} */ ++ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0003-ccimx95dvk-disable-PCAL6408A-expander-and-move-GPIO1.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0003-ccimx95dvk-disable-PCAL6408A-expander-and-move-GPIO1.patch new file mode 100644 index 000000000..550bfb35b --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0003-ccimx95dvk-disable-PCAL6408A-expander-and-move-GPIO1.patch @@ -0,0 +1,254 @@ +From: Javier Viguera +Date: Mon, 15 Sep 2025 12:37:05 +0200 +Subject: [PATCH] ccimx95dvk: disable PCAL6408A expander and move GPIO1 to A55 + +Our board does not populate that expander, so disable the initialization +and assign GPIO1 to be used by the A55 cpu. + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Javier Viguera +--- + boards/ccimx95dvk/board.c | 7 --- + boards/ccimx95dvk/pin_mux.c | 4 -- + boards/ccimx95dvk/sm/brd_sm.c | 9 --- + boards/ccimx95dvk/sm/brd_sm_handlers.c | 82 -------------------------- + configs/ccimx95dvk.cfg | 3 +- + configs/ccimx95dvk/config_scmi.h | 2 + + configs/ccimx95dvk/config_trdc.h | 2 +- + 7 files changed, 5 insertions(+), 104 deletions(-) + +diff --git a/boards/ccimx95dvk/board.c b/boards/ccimx95dvk/board.c +index d4a671f6d7f8..012a04540fd1 100755 +--- a/boards/ccimx95dvk/board.c ++++ b/boards/ccimx95dvk/board.c +@@ -337,9 +337,6 @@ void BOARD_InitHandlers(void) + /* Enable FCCU handler */ + NVIC_SetPriority(FCCU_INT0_IRQn, IRQ_PRIO_NOPREEMPT_CRITICAL); + NVIC_EnableIRQ(FCCU_INT0_IRQn); +- +- /* Enable GPIO1 handler */ +- NVIC_EnableIRQ(GPIO1_0_IRQn); + } + + /*--------------------------------------------------------------------------*/ +@@ -509,10 +506,6 @@ void BOARD_SystemSleepPrepare(uint32_t sleepMode, uint32_t sleepFlags) + (void) CPU_PerLpiConfigSet(CPU_IDX_M33P, s_uartConfig.perLpiId, + CPU_PER_LPI_ON_RUN_WAIT_STOP); + } +- +- /* Configure LPI for GPIO1 */ +- (void) CPU_PerLpiConfigSet(CPU_IDX_M33P, CPU_PER_LPI_IDX_GPIO1, +- CPU_PER_LPI_ON_RUN_WAIT_STOP); + } + + /*--------------------------------------------------------------------------*/ +diff --git a/boards/ccimx95dvk/pin_mux.c b/boards/ccimx95dvk/pin_mux.c +index 60f6d27c41c5..800126f3814b 100755 +--- a/boards/ccimx95dvk/pin_mux.c ++++ b/boards/ccimx95dvk/pin_mux.c +@@ -57,9 +57,5 @@ void BOARD_InitPins(void) + IOMUXC_SetPinConfig(IOMUXC_PAD_I2C2_SDA__LPI2C2_SDA, IOMUXC_PAD_DSE(0xFU) + | IOMUXC_PAD_FSEL1(0x3U) | IOMUXC_PAD_PU(0x1U) | IOMUXC_PAD_OD(0x1U)); + #endif +- +- /* Configure GPIO1-10 (INT from the PCAL6408A */ +- IOMUXC_SetPinMux(IOMUXC_PAD_PDM_BIT_STREAM1__GPIO1_IO_BIT10, 0U); +- IOMUXC_SetPinConfig(IOMUXC_PAD_PDM_BIT_STREAM1__GPIO1_IO_BIT10, 0U); + } + +diff --git a/boards/ccimx95dvk/sm/brd_sm.c b/boards/ccimx95dvk/sm/brd_sm.c +index cd48b590cd26..48a8486a2acd 100755 +--- a/boards/ccimx95dvk/sm/brd_sm.c ++++ b/boards/ccimx95dvk/sm/brd_sm.c +@@ -459,15 +459,6 @@ void BRD_SM_ShutdownRecordSave(dev_sm_rst_rec_t shutdownRec) + int32_t BRD_SM_SystemReset(void) + { + int32_t status = SM_ERR_SUCCESS; +- rgpio_pin_config_t gpioConfig = +- { +- kRGPIO_DigitalOutput, +- 0U +- }; +- +- /* Drive WDOG_ANY to reset PMIC */ +- RGPIO_PinInit(GPIO1, 15U, &gpioConfig); +- IOMUXC_SetPinMux(IOMUXC_PAD_WDOG_ANY__GPIO1_IO_BIT15, 0U); + + /* Wait for PMIC to react */ + SystemTimeDelay(1000U); +diff --git a/boards/ccimx95dvk/sm/brd_sm_handlers.c b/boards/ccimx95dvk/sm/brd_sm_handlers.c +index a96f6ce0e2f4..19ee28e93134 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_handlers.c ++++ b/boards/ccimx95dvk/sm/brd_sm_handlers.c +@@ -96,26 +96,6 @@ int32_t BRD_SM_SerialDevicesInit(void) + { + int32_t status = SM_ERR_SUCCESS; + LPI2C_Type *const s_i2cBases[] = LPI2C_BASE_PTRS; +- pcal6408a_config_t pcal6408Config; +- +- /* Fill in PCAL6408A dev */ +- g_pcal6408aDev.i2cBase = s_i2cBases[BOARD_I2C_INSTANCE]; +- g_pcal6408aDev.devAddr = BOARD_PCAL6408A_DEV_ADDR; +- +- /* Init the bus expander */ +- PCAL6408A_GetDefaultConfig(&pcal6408Config); +- pcal6408Config.inputLatch = 0xFFU; +- if (!PCAL6408A_Init(&g_pcal6408aDev, &pcal6408Config)) +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- else +- { +- if (!PCAL6408A_IntMaskSet(&g_pcal6408aDev, PCAL6408A_INITIAL_MASK)) +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- } + + if (status == SM_ERR_SUCCESS) + { +@@ -254,20 +234,6 @@ int32_t BRD_SM_SerialDevicesInit(void) + } + } + +- if (status == SM_ERR_SUCCESS) +- { +- rgpio_pin_config_t gpioConfig = +- { +- kRGPIO_DigitalInput, +- 0U +- }; +- +- /* Init GPIO1-10 */ +- RGPIO_PinInit(GPIO1, 10U, &gpioConfig); +- RGPIO_SetPinInterruptConfig(GPIO1, 10U, kRGPIO_InterruptOutput0, +- kRGPIO_InterruptLogicZero); +- } +- + /* Return status */ + return status; + } +@@ -300,54 +266,6 @@ int32_t BRD_SM_BusExpMaskSet(uint8_t val, uint8_t mask) + return status; + } + +-/*--------------------------------------------------------------------------*/ +-/* GPIO1 handler */ +-/*--------------------------------------------------------------------------*/ +-void GPIO1_0_IRQHandler(void) +-{ +- uint32_t flags; +- uint8_t status, val; +- +- /* Get GPIO status */ +- flags = RGPIO_GetPinsInterruptFlags(GPIO1, kRGPIO_InterruptOutput0); +- +- /* Get PCAL6408A status */ +- (void) PCAL6408A_IntStatusGet(&g_pcal6408aDev, &status); +- +- /* Get value and Clear PCAL6408A interrupts */ +- (void) PCAL6408A_InputGet(&g_pcal6408aDev, &val); +- +- /* Clear GPIO interrupts */ +- RGPIO_ClearPinsInterruptFlags(GPIO1, kRGPIO_InterruptOutput0, flags); +- +- /* Handle PF09 interrupt */ +- if ((status & BIT8(PCAL6408A_INPUT_PF09_INT)) != 0U) +- { +- /* Asserts low */ +- if ((val & BIT8(PCAL6408A_INPUT_PF09_INT)) == 0U) +- { +- BRD_SM_Pf09Handler(); +- } +- } +- +- /* Handle PCA2131 interrupt */ +- if (g_pca2131Used && ((status & BIT8(PCAL6408A_INPUT_PCA2131_INT)) +- != 0U)) +- { +- /* Asserts low */ +- if ((val & BIT8(PCAL6408A_INPUT_PCA2131_INT)) == 0U) +- { +- BRD_SM_BbmHandler(); +- } +- } +- +- /* Handle controls interrupts */ +- BRD_SM_ControlHandler(status, val); +- +- /* Adjust dynamic IRQ priority */ +- (void) DEV_SM_IrqPrioUpdate(); +-} +- + /*==========================================================================*/ + + /*--------------------------------------------------------------------------*/ +diff --git a/configs/ccimx95dvk.cfg b/configs/ccimx95dvk.cfg +index da383aab036c..86d39e6e1fba 100755 +--- a/configs/ccimx95dvk.cfg ++++ b/configs/ccimx95dvk.cfg +@@ -197,7 +197,6 @@ ELE OWNER + FSB READONLY + GIC ACCESS + GPC OWNER +-GPIO1 OWNER + GPR0 OWNER + GPR1 OWNER + GPR2 OWNER +@@ -482,6 +481,7 @@ PERLPI_LPUART4 ALL + PERLPI_LPUART5 ALL + PERLPI_LPUART6 ALL + PERLPI_LPUART8 ALL ++PERLPI_GPIO1 ALL + PERLPI_WDOG3 ALL + PERLPI_WDOG4 ALL + SYS ALL +@@ -715,6 +715,7 @@ FLEXIO2 OWNER + FLEXSPI1 OWNER + FSB READONLY + GIC OWNER ++GPIO1 OWNER + GPIO2 OWNER + GPIO3 OWNER + GPIO4 OWNER +diff --git a/configs/ccimx95dvk/config_scmi.h b/configs/ccimx95dvk/config_scmi.h +index e1b81cc03f58..c1cc90313174 100644 +--- a/configs/ccimx95dvk/config_scmi.h ++++ b/configs/ccimx95dvk/config_scmi.h +@@ -192,6 +192,7 @@ + .perlpiPerms[DEV_SM_PERLPI_CAN3] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN4] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN5] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_GPIO1] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_GPIO2] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_GPIO3] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_GPIO4] = SM_SCMI_PERM_ALL, \ +@@ -474,6 +475,7 @@ + .perlpiPerms[DEV_SM_PERLPI_CAN3] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN4] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN5] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_GPIO1] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_GPIO2] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_GPIO3] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_GPIO4] = SM_SCMI_PERM_ALL, \ +diff --git a/configs/ccimx95dvk/config_trdc.h b/configs/ccimx95dvk/config_trdc.h +index 1d8ed0b6fc95..47df6a7577d5 100644 +--- a/configs/ccimx95dvk/config_trdc.h ++++ b/configs/ccimx95dvk/config_trdc.h +@@ -116,7 +116,6 @@ + SM_CFG_W1(0x00010470U), 0x33333333U, \ + SM_CFG_W1(0x00010474U), 0x00003000U, \ + SM_CFG_W1(0x00010580U), 0x000003C0U, \ +- SM_CFG_W1(0x000105a8U), 0x00000003U, \ + SM_CFG_W1(0x00010640U), 0x99999999U, \ + SM_CFG_W1(0x00010644U), 0x99999999U, \ + SM_CFG_W1(0x00010648U), 0x99999999U, \ +@@ -129,6 +128,7 @@ + SM_CFG_W1(0x0001066cU), 0x90909000U, \ + SM_CFG_W1(0x00010670U), 0x00009000U, \ + SM_CFG_W1(0x00010780U), 0x099330C0U, \ ++ SM_CFG_W1(0x000107a8U), 0x00000009U, \ + SM_CFG_Z1(0x00010850U), \ + SM_CFG_W1(0x00010854U), 0x9000C000U, \ + SM_CFG_W1(0x00010858U), 0x00000099U, \ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0004-ccimx95dvk-move-resources-from-M7-to-A55.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0004-ccimx95dvk-move-resources-from-M7-to-A55.patch new file mode 100644 index 000000000..e961ad24b --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0004-ccimx95dvk-move-resources-from-M7-to-A55.patch @@ -0,0 +1,206 @@ +From: Javier Viguera +Date: Tue, 16 Sep 2025 17:51:14 +0200 +Subject: [PATCH] ccimx95dvk: move resources from M7 to A55 + +Moved from M7 to A55 domain: +* LPUART7 +* PIN_GPIO_IO14 +* PIN_GPIO_IO15 + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Javier Viguera +--- + configs/ccimx95dvk.cfg | 11 ++++------- + configs/ccimx95dvk/config_scmi.h | 15 ++++++++------- + configs/ccimx95dvk/config_test.h | 7 +------ + configs/ccimx95dvk/config_trdc.h | 3 +-- + 4 files changed, 14 insertions(+), 22 deletions(-) + +diff --git a/configs/ccimx95dvk.cfg b/configs/ccimx95dvk.cfg +index 86d39e6e1fba..393c29436894 100755 +--- a/configs/ccimx95dvk.cfg ++++ b/configs/ccimx95dvk.cfg +@@ -369,7 +369,6 @@ LPIT1 OWNER + LPTMR1 OWNER + LPTMR2 OWNER + LPTPM1 OWNER +-LPUART3 OWNER, test + MSGINTR1 OWNER + MSGINTR2 OWNER + MU5_A OWNER +@@ -382,11 +381,6 @@ TSTMR2 OWNER + V2X_SHE1 OWNER + WDOG5 OWNER + +-# Pins +- +-PIN_GPIO_IO14 OWNER +-PIN_GPIO_IO15 OWNER +- + # Memory + + M7MIX DATA, begin=0x020380000, end=0x02047FFFF +@@ -477,6 +471,7 @@ PERLPI_GPIO4 ALL + PERLPI_GPIO5 ALL + PERLPI_LPUART1 ALL + PERLPI_LPUART2 ALL ++PERLPI_LPUART3 ALL + PERLPI_LPUART4 ALL + PERLPI_LPUART5 ALL + PERLPI_LPUART6 ALL +@@ -762,6 +757,7 @@ LPTPM5 OWNER + LPTPM6 OWNER + LPUART1 OWNER + LPUART2 OWNER ++LPUART3 OWNER + LPUART4 OWNER + LPUART5 OWNER + LPUART6 OWNER +@@ -914,6 +910,8 @@ PIN_GPIO_IO10 OWNER + PIN_GPIO_IO11 OWNER + PIN_GPIO_IO12 OWNER + PIN_GPIO_IO13 OWNER ++PIN_GPIO_IO14 OWNER ++PIN_GPIO_IO15 OWNER + PIN_GPIO_IO16 OWNER + PIN_GPIO_IO17 OWNER + PIN_GPIO_IO18 OWNER +@@ -993,4 +991,3 @@ OCRAM EXEC, begin=0x0204C0000, size=96K + GPU DATA, begin=0x04D900000, end=0x04DD7FFFF + DDR EXEC, begin=0x088000000, end=0x089FFFFFF + DDR EXEC, begin=0x08E000000, end=0x87FFFFFFF +- +diff --git a/configs/ccimx95dvk/config_scmi.h b/configs/ccimx95dvk/config_scmi.h +index c1cc90313174..0913c1339af0 100644 +--- a/configs/ccimx95dvk/config_scmi.h ++++ b/configs/ccimx95dvk/config_scmi.h +@@ -69,7 +69,6 @@ + .clkPerms[DEV_SM_CLK_CAN1] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_LPTMR1] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_LPTMR2] = SM_SCMI_PERM_ALL, \ +- .clkPerms[DEV_SM_CLK_LPUART3] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_M7SYSTICK] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_M7] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_TSTMR2] = SM_SCMI_PERM_ALL, \ +@@ -81,9 +80,6 @@ + .daisyPerms[DEV_SM_DAISY_LPTMR2_0] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPTMR2_1] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPTMR2_2] = SM_SCMI_PERM_ALL, \ +- .daisyPerms[DEV_SM_DAISY_LPUART3_CTS] = SM_SCMI_PERM_ALL, \ +- .daisyPerms[DEV_SM_DAISY_LPUART3_RXD] = SM_SCMI_PERM_ALL, \ +- .daisyPerms[DEV_SM_DAISY_LPUART3_TXD] = SM_SCMI_PERM_ALL, \ + .faultPerms[DEV_SM_FAULT_M7_LOCKUP] = SM_SCMI_PERM_ALL, \ + .faultPerms[DEV_SM_FAULT_M7_RESET] = SM_SCMI_PERM_ALL, \ + .faultPerms[DEV_SM_FAULT_SW0] = SM_SCMI_PERM_ALL, \ +@@ -94,10 +90,7 @@ + .pdPerms[DEV_SM_PD_M7] = SM_SCMI_PERM_ALL, \ + .perfPerms[DEV_SM_PERF_M7] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN1] = SM_SCMI_PERM_ALL, \ +- .perlpiPerms[DEV_SM_PERLPI_LPUART3] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_WDOG5] = SM_SCMI_PERM_ALL, \ +- .pinPerms[DEV_SM_PIN_GPIO_IO14] = SM_SCMI_PERM_ALL, \ +- .pinPerms[DEV_SM_PIN_GPIO_IO15] = SM_SCMI_PERM_ALL, \ + .rtcPerms[BRD_SM_RTC_PCA2131] = SM_SCMI_PERM_ALL, \ + .rtcPerms[DEV_SM_RTC_BBNSM] = SM_SCMI_PERM_PRIV, \ + .sensorPerms[BRD_SM_SENSOR_TEMP_PF09] = SM_SCMI_PERM_SET, \ +@@ -199,6 +192,7 @@ + .perlpiPerms[DEV_SM_PERLPI_GPIO5] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_LPUART1] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_LPUART2] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART3] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_LPUART4] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_LPUART5] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_LPUART6] = SM_SCMI_PERM_ALL, \ +@@ -291,6 +285,7 @@ + .clkPerms[DEV_SM_CLK_LPSPI8] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_LPUART1] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_LPUART2] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_LPUART3] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_LPUART4] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_LPUART5] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_LPUART6] = SM_SCMI_PERM_ALL, \ +@@ -398,6 +393,9 @@ + .daisyPerms[DEV_SM_DAISY_LPSPI4_SCK] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPSPI4_SDI] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPSPI4_SDO] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART3_CTS] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART3_RXD] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_LPUART3_TXD] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPUART4_CTS] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPUART4_RXD] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPUART4_TXD] = SM_SCMI_PERM_ALL, \ +@@ -482,6 +480,7 @@ + .perlpiPerms[DEV_SM_PERLPI_GPIO5] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_LPUART1] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_LPUART2] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_LPUART3] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_LPUART4] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_LPUART5] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_LPUART6] = SM_SCMI_PERM_ALL, \ +@@ -536,6 +535,8 @@ + .pinPerms[DEV_SM_PIN_GPIO_IO11] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_GPIO_IO12] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_GPIO_IO13] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO14] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_GPIO_IO15] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_GPIO_IO16] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_GPIO_IO17] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_GPIO_IO18] = SM_SCMI_PERM_ALL, \ +diff --git a/configs/ccimx95dvk/config_test.h b/configs/ccimx95dvk/config_test.h +index cb737f33eede..efc15c56ffe9 100644 +--- a/configs/ccimx95dvk/config_test.h ++++ b/configs/ccimx95dvk/config_test.h +@@ -143,12 +143,11 @@ + /*--------------------------------------------------------------------------*/ + + /*! Config for number of tests */ +-#define SM_SCMI_NUM_TEST 40U ++#define SM_SCMI_NUM_TEST 35U + + /*! Config data array for tests */ + #define SM_SCMI_TEST_CONFIG_DATA \ + {.testId = TEST_BUTTON, .channel = 5U, .rsrc = DEV_SM_BUTTON_0}, \ +- {.testId = TEST_CLK, .channel = 0U, .rsrc = DEV_SM_CLK_LPUART3}, \ + {.testId = TEST_CLK, .channel = 5U, .rsrc = DEV_SM_CLK_DISPOCRAM}, \ + {.testId = TEST_CLK, .channel = 5U, .rsrc = DEV_SM_CLK_ENETREF}, \ + {.testId = TEST_CLK, .channel = 5U, .rsrc = DEV_SM_CLK_ENETTIMER1}, \ +@@ -157,9 +156,6 @@ + {.testId = TEST_CLK, .channel = 5U, .rsrc = DEV_SM_CLK_SAI1}, \ + {.testId = TEST_CTRL, .channel = 5U, .rsrc = DEV_SM_CTRL_MQS1_SETTINGS}, \ + {.testId = TEST_CTRL, .channel = 5U, .rsrc = DEV_SM_CTRL_SAI1_MCLK}, \ +- {.testId = TEST_DAISY, .channel = 0U, .rsrc = DEV_SM_DAISY_LPUART3_CTS}, \ +- {.testId = TEST_DAISY, .channel = 0U, .rsrc = DEV_SM_DAISY_LPUART3_RXD}, \ +- {.testId = TEST_DAISY, .channel = 0U, .rsrc = DEV_SM_DAISY_LPUART3_TXD}, \ + {.testId = TEST_DAISY, .channel = 5U, .rsrc = DEV_SM_DAISY_NETC_EMDC}, \ + {.testId = TEST_DAISY, .channel = 5U, .rsrc = DEV_SM_DAISY_NETC_EMDIO}, \ + {.testId = TEST_DAISY, .channel = 5U, .rsrc = DEV_SM_DAISY_NETC_ETH0_RMII_RX_ER}, \ +@@ -182,7 +178,6 @@ + {.testId = TEST_PERF, .channel = 5U, .rsrc = DEV_SM_PERF_GPU}, \ + {.testId = TEST_PERF, .channel = 5U, .rsrc = DEV_SM_PERF_NPU}, \ + {.testId = TEST_PERF, .channel = 5U, .rsrc = DEV_SM_PERF_VPU}, \ +- {.testId = TEST_PERLPI, .channel = 0U, .rsrc = DEV_SM_PERLPI_LPUART3}, \ + {.testId = TEST_PERLPI, .channel = 5U, .rsrc = DEV_SM_PERLPI_LPUART8}, \ + {.testId = TEST_PIN, .channel = 5U, .rsrc = DEV_SM_PIN_UART1_RXD}, \ + {.testId = TEST_RTC, .channel = 5U, .rsrc = DEV_SM_RTC_BBNSM}, \ +diff --git a/configs/ccimx95dvk/config_trdc.h b/configs/ccimx95dvk/config_trdc.h +index 47df6a7577d5..dc6245097316 100644 +--- a/configs/ccimx95dvk/config_trdc.h ++++ b/configs/ccimx95dvk/config_trdc.h +@@ -1168,7 +1168,7 @@ + SM_CFG_W1(0x0001065cU), 0x99999999U, \ + SM_CFG_W1(0x00010660U), 0x00909099U, \ + SM_CFG_W1(0x00010664U), 0x99090990U, \ +- SM_CFG_W1(0x00010668U), 0x09999999U, \ ++ SM_CFG_W1(0x00010668U), 0x99999999U, \ + SM_CFG_W1(0x0001066cU), 0x09999999U, \ + SM_CFG_W1(0x00010670U), 0x99900009U, \ + SM_CFG_W1(0x00010674U), 0x99999909U, \ +@@ -1178,7 +1178,6 @@ + SM_CFG_W1(0x000107a8U), 0x00000009U, \ + SM_CFG_W1(0x00010860U), 0x00090000U, \ + SM_CFG_W1(0x00010864U), 0x00909009U, \ +- SM_CFG_W1(0x00010868U), 0x90000000U, \ + SM_CFG_W1(0x00010878U), 0x00090000U, \ + SM_CFG_Z1(0x00010a60U), \ + SM_CFG_Z1(0x00010c60U), \ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0005-ccimx95dvk-move-pads-to-non-secure-A55.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0005-ccimx95dvk-move-pads-to-non-secure-A55.patch new file mode 100644 index 000000000..3441991b9 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0005-ccimx95dvk-move-pads-to-non-secure-A55.patch @@ -0,0 +1,75 @@ +From: Hector Palacios +Date: Wed, 24 Sep 2025 12:26:07 +0200 +Subject: [PATCH] ccimx95dvk: move pads to non-secure A55 + +The following pads are multiplexed and used by A55 in Linux: +- PIN_UART2_RXD is used as LPUART1 CTS +- PIN_UART2_TXD is used as LPUART1 RTS +- PIN_PDM_BIT_STREAM1 is used as MIKROBUS_RST + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Hector Palacios +--- + configs/ccimx95dvk.cfg | 5 ++++- + configs/ccimx95dvk/config_scmi.h | 3 +++ + 2 files changed, 7 insertions(+), 1 deletion(-) + +diff --git a/configs/ccimx95dvk.cfg b/configs/ccimx95dvk.cfg +index 393c29436894..bf5f0739f526 100755 +--- a/configs/ccimx95dvk.cfg ++++ b/configs/ccimx95dvk.cfg +@@ -1,6 +1,7 @@ + ## ################################################################### + ## + ## Copyright 2023-2025 NXP ++## Copyright 2025 Digi International Inc. + ## + ## Redistribution and use in source and binary forms, with or without modification, + ## are permitted provided that the following conditions are met: +@@ -285,7 +286,6 @@ L_STCU_NPUMIX OWNER + PIN_FCCU_ERR0 OWNER + PIN_I2C1_SCL OWNER + PIN_I2C1_SDA OWNER +-PIN_PDM_BIT_STREAM1 OWNER + PIN_GPIO_IO08 OWNER # LPUART7_TX + PIN_GPIO_IO09 OWNER # LPUART7_RX + PIN_WDOG_ANY OWNER +@@ -937,6 +937,7 @@ PIN_GPIO_IO37 OWNER + PIN_I2C2_SCL OWNER + PIN_I2C2_SDA OWNER + PIN_PDM_BIT_STREAM0 OWNER ++PIN_PDM_BIT_STREAM1 OWNER + PIN_PDM_CLK OWNER + PIN_SAI1_RXD0 OWNER + PIN_SAI1_TXC OWNER +@@ -970,6 +971,8 @@ PIN_SD3_DATA2 OWNER + PIN_SD3_DATA3 OWNER + PIN_UART1_RXD OWNER, test + PIN_UART1_TXD OWNER ++PIN_UART2_RXD OWNER ++PIN_UART2_TXD OWNER + PIN_XSPI1_DATA0 OWNER + PIN_XSPI1_DATA1 OWNER + PIN_XSPI1_DATA2 OWNER +diff --git a/configs/ccimx95dvk/config_scmi.h b/configs/ccimx95dvk/config_scmi.h +index 0913c1339af0..510de3d252a2 100644 +--- a/configs/ccimx95dvk/config_scmi.h ++++ b/configs/ccimx95dvk/config_scmi.h +@@ -562,6 +562,7 @@ + .pinPerms[DEV_SM_PIN_I2C2_SCL] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_I2C2_SDA] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_PDM_BIT_STREAM0] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_PDM_BIT_STREAM1] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_PDM_CLK] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_SAI1_RXD0] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_SAI1_TXC] = SM_SCMI_PERM_ALL, \ +@@ -595,6 +596,8 @@ + .pinPerms[DEV_SM_PIN_SD3_DATA3] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_UART1_RXD] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_UART1_TXD] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_UART2_RXD] = SM_SCMI_PERM_ALL, \ ++ .pinPerms[DEV_SM_PIN_UART2_TXD] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_XSPI1_DATA0] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_XSPI1_DATA1] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_XSPI1_DATA2] = SM_SCMI_PERM_ALL, \ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0006-ccimx95dvk-move-CAN1-to-be-used-by-A55.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0006-ccimx95dvk-move-CAN1-to-be-used-by-A55.patch new file mode 100644 index 000000000..a40b3976a --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0006-ccimx95dvk-move-CAN1-to-be-used-by-A55.patch @@ -0,0 +1,151 @@ +From: Hector Palacios +Date: Wed, 24 Sep 2025 13:01:57 +0200 +Subject: [PATCH] ccimx95dvk: move CAN1 to be used by A55 + +CAN1 is no longer reserved by M7 but instead moved to +non-secure A55 so that it can be used by Linux. + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Hector Palacios +--- + configs/ccimx95dvk.cfg | 3 ++- + configs/ccimx95dvk/config_bctrl.h | 14 +++++++------- + configs/ccimx95dvk/config_scmi.h | 7 ++++--- + configs/ccimx95dvk/config_trdc.h | 3 +-- + 4 files changed, 14 insertions(+), 13 deletions(-) + +diff --git a/configs/ccimx95dvk.cfg b/configs/ccimx95dvk.cfg +index bf5f0739f526..afec8eb5b738 100755 +--- a/configs/ccimx95dvk.cfg ++++ b/configs/ccimx95dvk.cfg +@@ -362,7 +362,6 @@ SYS ALL + # Resources + + M7P OWNER # CPUs must be first +-CAN_FD1 OWNER + FSB READONLY + IRQSTEER_M7 OWNER + LPIT1 OWNER +@@ -461,6 +460,7 @@ CHANNEL db=1, xport=smt, rpc=scmi, type=p2a_notify + + PERF_A55 ALL + PERF_DRAM ALL ++PERLPI_CAN1 ALL + PERLPI_CAN2 ALL + PERLPI_CAN3 ALL + PERLPI_CAN4 ALL +@@ -582,6 +582,7 @@ CAMERA5 OWNER + CAMERA6 OWNER + CAMERA7 OWNER + CAMERA8 OWNER ++CAN_FD1 OWNER + CAN_FD2 OWNER + CAN_FD3 OWNER + CAN_FD4 OWNER +diff --git a/configs/ccimx95dvk/config_bctrl.h b/configs/ccimx95dvk/config_bctrl.h +index a757834c32ab..a55abe03ec02 100644 +--- a/configs/ccimx95dvk/config_bctrl.h ++++ b/configs/ccimx95dvk/config_bctrl.h +@@ -61,13 +61,13 @@ + #define SM_BCTRL_A_CONFIG \ + { \ + SM_CFG_W1(0x00000008U), 0x00001804U, \ +- SM_CFG_W1(0x0000000CU), 0x0000E56AU, \ +- SM_CFG_W1(0x00000010U), 0x0000E56AU, \ +- SM_CFG_W1(0x00000014U), 0x0000E56AU, \ +- SM_CFG_W1(0x00000018U), 0x0000E56AU, \ +- SM_CFG_W1(0x0000001CU), 0x0000E56AU, \ +- SM_CFG_W1(0x00000020U), 0x0000E56AU, \ +- SM_CFG_W1(0x00000024U), 0x00000291U, \ ++ SM_CFG_W1(0x0000000CU), 0x0000E56BU, \ ++ SM_CFG_W1(0x00000010U), 0x0000E56BU, \ ++ SM_CFG_W1(0x00000014U), 0x0000E56BU, \ ++ SM_CFG_W1(0x00000018U), 0x0000E56BU, \ ++ SM_CFG_W1(0x0000001CU), 0x0000E56BU, \ ++ SM_CFG_W1(0x00000020U), 0x0000E56BU, \ ++ SM_CFG_W1(0x00000024U), 0x00000290U, \ + SM_CFG_END \ + } + +diff --git a/configs/ccimx95dvk/config_scmi.h b/configs/ccimx95dvk/config_scmi.h +index 510de3d252a2..36cbb06126fe 100644 +--- a/configs/ccimx95dvk/config_scmi.h ++++ b/configs/ccimx95dvk/config_scmi.h +@@ -66,7 +66,6 @@ + .secure = 0U, \ + .seenvId = 1U, \ + .buttonPerms[DEV_SM_BUTTON_0] = SM_SCMI_PERM_NOTIFY, \ +- .clkPerms[DEV_SM_CLK_CAN1] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_LPTMR1] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_LPTMR2] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_M7SYSTICK] = SM_SCMI_PERM_ALL, \ +@@ -76,7 +75,6 @@ + .ctrlPerms[BRD_SM_CTRL_BUTTON] = SM_SCMI_PERM_NOTIFY, \ + .ctrlPerms[BRD_SM_CTRL_PCA2131] = SM_SCMI_PERM_ALL, \ + .ctrlPerms[BRD_SM_CTRL_TEST] = SM_SCMI_PERM_ALL, \ +- .daisyPerms[DEV_SM_DAISY_CAN1_RX] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPTMR2_0] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPTMR2_1] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPTMR2_2] = SM_SCMI_PERM_ALL, \ +@@ -89,7 +87,6 @@ + .lmmPerms[2] = SM_SCMI_PERM_ALL, \ + .pdPerms[DEV_SM_PD_M7] = SM_SCMI_PERM_ALL, \ + .perfPerms[DEV_SM_PERF_M7] = SM_SCMI_PERM_ALL, \ +- .perlpiPerms[DEV_SM_PERLPI_CAN1] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_WDOG5] = SM_SCMI_PERM_ALL, \ + .rtcPerms[BRD_SM_RTC_PCA2131] = SM_SCMI_PERM_ALL, \ + .rtcPerms[DEV_SM_RTC_BBNSM] = SM_SCMI_PERM_PRIV, \ +@@ -181,6 +178,7 @@ + .pdPerms[DEV_SM_PD_A55P] = SM_SCMI_PERM_ALL, \ + .perfPerms[DEV_SM_PERF_A55] = SM_SCMI_PERM_ALL, \ + .perfPerms[DEV_SM_PERF_DRAM] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN1] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN2] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN3] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN4] = SM_SCMI_PERM_ALL, \ +@@ -237,6 +235,7 @@ + .clkPerms[DEV_SM_CLK_AUDIOPLL2] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_AUDIOPLL2_VCO] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_AUDIOXCVR] = SM_SCMI_PERM_ALL, \ ++ .clkPerms[DEV_SM_CLK_CAN1] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_CAN2] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_CAN3] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_CAN4] = SM_SCMI_PERM_ALL, \ +@@ -327,6 +326,7 @@ + .ctrlPerms[DEV_SM_CTRL_SAI3_MCLK] = SM_SCMI_PERM_ALL, \ + .ctrlPerms[DEV_SM_CTRL_SAI4_MCLK] = SM_SCMI_PERM_ALL, \ + .ctrlPerms[DEV_SM_CTRL_SAI5_MCLK] = SM_SCMI_PERM_ALL, \ ++ .daisyPerms[DEV_SM_DAISY_CAN1_RX] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_CAN2_RX] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_CAN3_RX] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_CAN4_RX] = SM_SCMI_PERM_ALL, \ +@@ -469,6 +469,7 @@ + .perfPerms[DEV_SM_PERF_GPU] = SM_SCMI_PERM_ALL, \ + .perfPerms[DEV_SM_PERF_NPU] = SM_SCMI_PERM_ALL, \ + .perfPerms[DEV_SM_PERF_VPU] = SM_SCMI_PERM_ALL, \ ++ .perlpiPerms[DEV_SM_PERLPI_CAN1] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN2] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN3] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_CAN4] = SM_SCMI_PERM_ALL, \ +diff --git a/configs/ccimx95dvk/config_trdc.h b/configs/ccimx95dvk/config_trdc.h +index dc6245097316..12ebbc61ca64 100644 +--- a/configs/ccimx95dvk/config_trdc.h ++++ b/configs/ccimx95dvk/config_trdc.h +@@ -123,7 +123,7 @@ + SM_CFG_W1(0x00010650U), 0x09000309U, \ + SM_CFG_W1(0x00010654U), 0x0000C900U, \ + SM_CFG_W1(0x00010658U), 0x99909900U, \ +- SM_CFG_W1(0x0001065cU), 0x00009099U, \ ++ SM_CFG_W1(0x0001065cU), 0x00009999U, \ + SM_CFG_W1(0x00010668U), 0x00009900U, \ + SM_CFG_W1(0x0001066cU), 0x90909000U, \ + SM_CFG_W1(0x00010670U), 0x00009000U, \ +@@ -132,7 +132,6 @@ + SM_CFG_Z1(0x00010850U), \ + SM_CFG_W1(0x00010854U), 0x9000C000U, \ + SM_CFG_W1(0x00010858U), 0x00000099U, \ +- SM_CFG_W1(0x0001085cU), 0x00000900U, \ + SM_CFG_W1(0x00010870U), 0x00000090U, \ + SM_CFG_W1(0x00010874U), 0x00000999U, \ + SM_CFG_W1(0x00010980U), 0x900000C0U, \ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0007-ccimx95dvk-remove-PCAL6408A-IO-expander-from-EVK.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0007-ccimx95dvk-remove-PCAL6408A-IO-expander-from-EVK.patch new file mode 100644 index 000000000..04e5f58e5 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0007-ccimx95dvk-remove-PCAL6408A-IO-expander-from-EVK.patch @@ -0,0 +1,453 @@ +From: Hector Palacios +Date: Thu, 25 Sep 2025 11:11:20 +0200 +Subject: [PATCH 7/8] ccimx95dvk: remove PCAL6408A IO expander from EVK + +NXP used this I2C IO expander on their EVK to process +wakeup interrupt lines. +This chip is not available on the DVK. + +Signed-off-by: Hector Palacios +--- + boards/ccimx95dvk/board.c | 1 + + boards/ccimx95dvk/sm/Makefile | 4 +- + boards/ccimx95dvk/sm/brd_sm_bbm.c | 5 +- + boards/ccimx95dvk/sm/brd_sm_control.c | 96 +------------------------- + boards/ccimx95dvk/sm/brd_sm_control.h | 12 ++-- + boards/ccimx95dvk/sm/brd_sm_handlers.c | 36 +--------- + boards/ccimx95dvk/sm/brd_sm_handlers.h | 21 +----- + configs/ccimx95dvk.cfg | 6 -- + configs/ccimx95dvk/config_scmi.h | 6 -- + 9 files changed, 12 insertions(+), 175 deletions(-) + +diff --git a/boards/ccimx95dvk/board.c b/boards/ccimx95dvk/board.c +index 012a04540fd1..1f3c8cd3fdb9 100755 +--- a/boards/ccimx95dvk/board.c ++++ b/boards/ccimx95dvk/board.c +@@ -1,5 +1,6 @@ + /* + * Copyright 2023-2025 NXP ++ * Copyright 2025 Digi International Inc. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +diff --git a/boards/ccimx95dvk/sm/Makefile b/boards/ccimx95dvk/sm/Makefile +index d5b576737636..db27ea922733 100755 +--- a/boards/ccimx95dvk/sm/Makefile ++++ b/boards/ccimx95dvk/sm/Makefile +@@ -1,6 +1,7 @@ + ## ################################################################### + ## + ## Copyright 2023 NXP ++## Copyright 2025 Digi International Inc. + ## + ## Redistribution and use in source and binary forms, with or without modification, + ## are permitted provided that the following conditions are met: +@@ -40,7 +41,6 @@ INCLUDE += \ + -I$(BOARDS_DIR) \ + -I$(BOARD_DIR) \ + -I$(BOARD_DIR)/sm \ +- -I$(COMPONENTS_DIR)/pcal6408a \ + -I$(COMPONENTS_DIR)/pf09 \ + -I$(COMPONENTS_DIR)/pf53 \ + -I$(COMPONENTS_DIR)/pca2131 +@@ -50,7 +50,6 @@ VPATH += \ + $(BOARDS_DIR) \ + $(BOARD_DIR) \ + $(BOARD_DIR)/sm \ +- $(COMPONENTS_DIR)/pcal6408a \ + $(COMPONENTS_DIR)/pf09 \ + $(COMPONENTS_DIR)/pf53 \ + $(COMPONENTS_DIR)/pca2131 +@@ -63,7 +62,6 @@ OBJS += \ + $(OUT)/brd_sm_sensor.o \ + $(OUT)/brd_sm_voltage.o \ + $(OUT)/brd_sm_bbm.o \ +- $(OUT)/fsl_pcal6408a.o \ + $(OUT)/fsl_pf09.o \ + $(OUT)/fsl_pf53.o \ + $(OUT)/fsl_pca2131.o +diff --git a/boards/ccimx95dvk/sm/brd_sm_bbm.c b/boards/ccimx95dvk/sm/brd_sm_bbm.c +index c2e5cd61dc9f..2b13931c7749 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_bbm.c ++++ b/boards/ccimx95dvk/sm/brd_sm_bbm.c +@@ -2,6 +2,7 @@ + ** ################################################################### + ** + ** Copyright 2025 NXP ++** Copyright 2025 Digi International Inc. + ** + ** Redistribution and use in source and binary forms, with or without modification, + ** are permitted provided that the following conditions are met: +@@ -415,8 +416,6 @@ int32_t BRD_SM_BbmRtcAlarmSet(uint32_t rtcId, bool enable, uint64_t val) + /* Enable interrupt */ + if (PCA2131_IntEnable(&g_pca2131Dev, true)) + { +- /* Enable bus expander interrupt */ +- status = BRD_SM_BusExpMaskSet(0U, BIT8(6)); + } + else + { +@@ -440,8 +439,6 @@ int32_t BRD_SM_BbmRtcAlarmSet(uint32_t rtcId, bool enable, uint64_t val) + /* Disable interrupt */ + if (PCA2131_IntEnable(&g_pca2131Dev, false)) + { +- /* Disable bus expander interrupt */ +- status = BRD_SM_BusExpMaskSet(BIT8(6), BIT8(6)); + } + else + { +diff --git a/boards/ccimx95dvk/sm/brd_sm_control.c b/boards/ccimx95dvk/sm/brd_sm_control.c +index 5b36c66c593c..8484a6895a3d 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_control.c ++++ b/boards/ccimx95dvk/sm/brd_sm_control.c +@@ -2,6 +2,7 @@ + ** ################################################################### + ** + ** Copyright 2023-2024 NXP ++** Copyright 2025 Digi International Inc. + ** + ** Redistribution and use in source and binary forms, with or without modification, + ** are permitted provided that the following conditions are met: +@@ -44,13 +45,6 @@ + + /* Local defines */ + +-/* PCAL6408A input signals */ +-#define PCAL6408A_INPUT_SD3_WAKE 0U +-#define PCAL6408A_INPUT_PCIE1_WAKE 4U +-#define PCAL6408A_INPUT_BT_WAKE 5U +-#define PCAL6408A_INPUT_PCIE2_WAKE 6U +-#define PCAL6408A_INPUT_BUTTON 7U +- + /* Local types */ + + /* Local variables */ +@@ -117,26 +111,7 @@ int32_t BRD_SM_ControlGet(uint32_t ctrlId, uint32_t *numRtn, uint32_t *rtn) + } + else + { +- uint8_t data; +- +- /* Read expander data input */ +- if (PCAL6408A_InputGet(&g_pcal6408aDev, &data)) +- { +- uint32_t shift = ctrlId - DEV_SM_NUM_CTRL; +- +- /* Adjust bit position */ +- if (shift > 0U) +- { +- shift += 3U; +- } +- +- *numRtn = 1U; +- rtn[0] = (((uint32_t) data) >> shift) & 0x1UL; +- } +- else +- { +- status = SM_ERR_HARDWARE_ERROR; +- } ++ status = SM_ERR_HARDWARE_ERROR; + } + } + else +@@ -231,41 +206,12 @@ int32_t BRD_SM_ControlFlagsSet(uint32_t ctrlId, uint32_t flags) + } + else + { +- uint8_t mask; +- uint32_t val; +- uint32_t enb = (flags != 0U) ? 0U : 1U; +- + switch (ctrlId) + { +- case BRD_SM_CTRL_SD3_WAKE: +- mask = BIT8(PCAL6408A_INPUT_SD3_WAKE); +- val = (enb & 0x1U) << PCAL6408A_INPUT_SD3_WAKE; +- break; +- case BRD_SM_CTRL_PCIE1_WAKE: +- mask = BIT8(PCAL6408A_INPUT_PCIE1_WAKE); +- val = (enb & 0x1U) << PCAL6408A_INPUT_PCIE1_WAKE; +- break; +- case BRD_SM_CTRL_BT_WAKE: +- mask = BIT8(PCAL6408A_INPUT_BT_WAKE); +- val = (enb & 0x1U) << PCAL6408A_INPUT_BT_WAKE; +- break; +- case BRD_SM_CTRL_PCIE2_WAKE: +- mask = BIT8(PCAL6408A_INPUT_PCIE2_WAKE); +- val = (enb & 0x1U) << PCAL6408A_INPUT_PCIE2_WAKE; +- break; +- case BRD_SM_CTRL_BUTTON: +- mask = BIT8(PCAL6408A_INPUT_BUTTON); +- val = (enb & 0x1U) << PCAL6408A_INPUT_BUTTON; +- break; + default: + status = SM_ERR_NOT_FOUND; + break; + } +- +- if (status == SM_ERR_SUCCESS) +- { +- status = BRD_SM_BusExpMaskSet((uint8_t) val, mask); +- } + } + + return status; +@@ -276,42 +222,6 @@ int32_t BRD_SM_ControlFlagsSet(uint32_t ctrlId, uint32_t flags) + /*--------------------------------------------------------------------------*/ + void BRD_SM_ControlHandler(uint8_t status, uint8_t val) + { +- uint32_t data = (uint32_t) val; +- +- /* Handle SD3 wake */ +- if ((status & BIT8(PCAL6408A_INPUT_SD3_WAKE)) != 0U) +- { +- LMM_MiscControlEvent(BRD_SM_CTRL_SD3_WAKE, +- ((data >> PCAL6408A_INPUT_SD3_WAKE) & 0x1U) + 1U); +- } +- +- /* Handle PCIe1 wake */ +- if ((status & BIT8(PCAL6408A_INPUT_PCIE1_WAKE)) != 0U) +- { +- LMM_MiscControlEvent(BRD_SM_CTRL_PCIE1_WAKE, +- ((data >> PCAL6408A_INPUT_PCIE1_WAKE) & 0x1U) + 1U); +- } +- +- /* Handle BT wake */ +- if ((status & BIT8(PCAL6408A_INPUT_BT_WAKE)) != 0U) +- { +- LMM_MiscControlEvent(BRD_SM_CTRL_BT_WAKE, +- ((data >> PCAL6408A_INPUT_BT_WAKE) & 0x1U) + 1U); +- } +- +- /* Handle PCIe2 wake */ +- if (((status & BIT8(PCAL6408A_INPUT_PCIE2_WAKE)) != 0U) +- && !g_pca2131Used) +- { +- LMM_MiscControlEvent(BRD_SM_CTRL_PCIE2_WAKE, +- ((data >> PCAL6408A_INPUT_PCIE2_WAKE) & 0x1U) + 1U); +- } +- +- /* Handle button */ +- if ((status & BIT8(PCAL6408A_INPUT_BUTTON)) != 0U) +- { +- LMM_MiscControlEvent(BRD_SM_CTRL_BUTTON, +- ((data >> PCAL6408A_INPUT_BUTTON) & 0x1U) + 1U); +- } ++ // Call pertinent LMM_MiscControlEvent() + } + +diff --git a/boards/ccimx95dvk/sm/brd_sm_control.h b/boards/ccimx95dvk/sm/brd_sm_control.h +index bf893782e1d7..12365e56d7e4 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_control.h ++++ b/boards/ccimx95dvk/sm/brd_sm_control.h +@@ -2,6 +2,7 @@ + ** ################################################################### + ** + ** Copyright 2023-2024 NXP ++** Copyright 2025 Digi International Inc. + ** + ** Redistribution and use in source and binary forms, with or without modification, + ** are permitted provided that the following conditions are met: +@@ -66,7 +67,7 @@ + /** @} */ + + /*! Number of board controls */ +-#define BRD_SM_NUM_CTRL 7UL ++#define BRD_SM_NUM_CTRL 2UL + + /*! Total number of controls */ + #define SM_NUM_CTRL (DEV_SM_NUM_CTRL + BRD_SM_NUM_CTRL) +@@ -75,13 +76,8 @@ + * @name BRD_SM control domain indexes + */ + /** @{ */ +-#define BRD_SM_CTRL_SD3_WAKE (DEV_SM_NUM_CTRL + 0U) /*!< PCAL6408A-0 */ +-#define BRD_SM_CTRL_PCIE1_WAKE (DEV_SM_NUM_CTRL + 1U) /*!< PCAL6408A-4 */ +-#define BRD_SM_CTRL_BT_WAKE (DEV_SM_NUM_CTRL + 2U) /*!< PCAL6408A-5 */ +-#define BRD_SM_CTRL_PCIE2_WAKE (DEV_SM_NUM_CTRL + 3U) /*!< PCAL6408A-6 */ +-#define BRD_SM_CTRL_BUTTON (DEV_SM_NUM_CTRL + 4U) /*!< PCAL6408A-7 */ +-#define BRD_SM_CTRL_TEST (DEV_SM_NUM_CTRL + 5U) /*!< Test */ +-#define BRD_SM_CTRL_PCA2131 (DEV_SM_NUM_CTRL + 6U) /*!< PCA2131 raw access */ ++#define BRD_SM_CTRL_TEST (DEV_SM_NUM_CTRL + 0U) /*!< Test */ ++#define BRD_SM_CTRL_PCA2131 (DEV_SM_NUM_CTRL + 1U) /*!< PCA2131 raw access */ + /** @} */ + + /* Types */ +diff --git a/boards/ccimx95dvk/sm/brd_sm_handlers.c b/boards/ccimx95dvk/sm/brd_sm_handlers.c +index 19ee28e93134..a42359f15e8b 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_handlers.c ++++ b/boards/ccimx95dvk/sm/brd_sm_handlers.c +@@ -2,6 +2,7 @@ + ** ################################################################### + ** + ** Copyright 2023-2025 NXP ++** Copyright 2025 Digi International Inc. + ** + ** Redistribution and use in source and binary forms, with or without modification, + ** are permitted provided that the following conditions are met: +@@ -48,23 +49,16 @@ + + /* I2C device addresses */ + #define BOARD_PF09_DEV_ADDR 0x08U +-#define BOARD_PCAL6408A_DEV_ADDR 0x20U + #define BOARD_PF5301_DEV_ADDR 0x2AU + #define BOARD_PF5302_DEV_ADDR 0x29U + #define BOARD_PCA2131_DEV_ADDR 0x53U + +-#define PCAL6408A_INPUT_PF53_ARM_PG 1U +-#define PCAL6408A_INPUT_PF53_SOC_PG 2U +-#define PCAL6408A_INPUT_PF09_INT 3U +-#define PCAL6408A_INPUT_PCA2131_INT 6U +- + /* Local types */ + + /* Local variables */ + + /* Global variables */ + +-PCAL6408A_Type g_pcal6408aDev; + PF09_Type g_pf09Dev; + PF53_Type g_pf5301Dev; + PF53_Type g_pf5302Dev; +@@ -238,34 +232,6 @@ int32_t BRD_SM_SerialDevicesInit(void) + return status; + } + +-/*--------------------------------------------------------------------------*/ +-/* Set bus expander interrupt mask */ +-/*--------------------------------------------------------------------------*/ +-int32_t BRD_SM_BusExpMaskSet(uint8_t val, uint8_t mask) +-{ +- int32_t status = SM_ERR_SUCCESS; +- static uint8_t cachedMask = PCAL6408A_INITIAL_MASK; +- uint8_t newMask = (cachedMask & ~mask); +- +- newMask |= val; +- +- /* Mask changed? */ +- if (cachedMask != newMask) +- { +- if (PCAL6408A_IntMaskSet(&g_pcal6408aDev, newMask)) +- { +- cachedMask = newMask; +- } +- else +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- } +- +- /* Return status */ +- return status; +-} +- + /*==========================================================================*/ + + /*--------------------------------------------------------------------------*/ +diff --git a/boards/ccimx95dvk/sm/brd_sm_handlers.h b/boards/ccimx95dvk/sm/brd_sm_handlers.h +index e34d52b50f7a..781a443e8444 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_handlers.h ++++ b/boards/ccimx95dvk/sm/brd_sm_handlers.h +@@ -2,6 +2,7 @@ + ** ################################################################### + ** + ** Copyright 2023-2024 NXP ++** Copyright 2025 Digi International Inc. + ** + ** Redistribution and use in source and binary forms, with or without modification, + ** are permitted provided that the following conditions are met: +@@ -52,16 +53,12 @@ + + #include "sm.h" + #include "dev_sm.h" +-#include "fsl_pcal6408a.h" + #include "fsl_pf09.h" + #include "fsl_pf53.h" + #include "fsl_pca2131.h" + + /* Defines */ + +-/*! Initial PCAL6408A interrupt mask */ +-#define PCAL6408A_INITIAL_MASK 0xF7U +- + /*! Number of board IRQs participating dynamic prioritization */ + #define BOARD_NUM_IRQ_PRIO_IDX 1U + +@@ -72,9 +69,6 @@ + + /* External variables */ + +-/*! Handle to access PCAL6408A */ +-extern PCAL6408A_Type g_pcal6408aDev; +- + /*! Handle to access PF09 */ + extern PF09_Type g_pf09Dev; + +@@ -105,19 +99,6 @@ extern uint32_t g_pmicFaultFlags; + */ + int32_t BRD_SM_SerialDevicesInit(void); + +-/*! +- * Enable/disable bus expander interrupts. +- * +- * @param[in] val Value to write +- * @param[in] mask Mask of bits to modify +- * +- * This function allows a caller to configure the bus expander. +- * interrupts. +- * +- * @return Returns the status (::SM_ERR_SUCCESS = success). +- */ +-int32_t BRD_SM_BusExpMaskSet(uint8_t val, uint8_t mask); +- + /*! + * GPIO 1 interrupt 0 handler. + */ +diff --git a/configs/ccimx95dvk.cfg b/configs/ccimx95dvk.cfg +index afec8eb5b738..4af5cea789d9 100755 +--- a/configs/ccimx95dvk.cfg ++++ b/configs/ccimx95dvk.cfg +@@ -345,7 +345,6 @@ CHANNEL db=2, xport=smt, check=crc32, rpc=scmi, \ + + # API + +-BRD_SM_CTRL_BUTTON NOTIFY + BRD_SM_CTRL_PCA2131 ALL + BRD_SM_CTRL_TEST ALL + BRD_SM_RTC_PCA2131 ALL +@@ -532,11 +531,6 @@ CHANNEL db=1, xport=smt, rpc=scmi, type=p2a_notify + + AUDIO_PLL1 ALL + AUDIO_PLL2 ALL +-BRD_SM_CTRL_BT_WAKE NOTIFY +-BRD_SM_CTRL_BUTTON NOTIFY +-BRD_SM_CTRL_PCIE1_WAKE NOTIFY +-BRD_SM_CTRL_PCIE2_WAKE NOTIFY +-BRD_SM_CTRL_SD3_WAKE NOTIFY + BRD_SM_RTC_PCA2131 PRIV + BRD_SM_SENSOR_TEMP_PF09 ALL + BRD_SM_SENSOR_TEMP_PF5301 SET +diff --git a/configs/ccimx95dvk/config_scmi.h b/configs/ccimx95dvk/config_scmi.h +index 36cbb06126fe..d251f7910b39 100644 +--- a/configs/ccimx95dvk/config_scmi.h ++++ b/configs/ccimx95dvk/config_scmi.h +@@ -72,7 +72,6 @@ + .clkPerms[DEV_SM_CLK_M7] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_TSTMR2] = SM_SCMI_PERM_ALL, \ + .cpuPerms[DEV_SM_CPU_M7P] = SM_SCMI_PERM_ALL, \ +- .ctrlPerms[BRD_SM_CTRL_BUTTON] = SM_SCMI_PERM_NOTIFY, \ + .ctrlPerms[BRD_SM_CTRL_PCA2131] = SM_SCMI_PERM_ALL, \ + .ctrlPerms[BRD_SM_CTRL_TEST] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPTMR2_0] = SM_SCMI_PERM_ALL, \ +@@ -314,11 +313,6 @@ + .clkPerms[DEV_SM_CLK_VIDEOPLL1_VCO] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_VPUDSP] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_XSPISLVROOT] = SM_SCMI_PERM_ALL, \ +- .ctrlPerms[BRD_SM_CTRL_BT_WAKE] = SM_SCMI_PERM_NOTIFY, \ +- .ctrlPerms[BRD_SM_CTRL_BUTTON] = SM_SCMI_PERM_NOTIFY, \ +- .ctrlPerms[BRD_SM_CTRL_PCIE1_WAKE] = SM_SCMI_PERM_NOTIFY, \ +- .ctrlPerms[BRD_SM_CTRL_PCIE2_WAKE] = SM_SCMI_PERM_NOTIFY, \ +- .ctrlPerms[BRD_SM_CTRL_SD3_WAKE] = SM_SCMI_PERM_NOTIFY, \ + .ctrlPerms[DEV_SM_CTRL_ADC_TEST] = SM_SCMI_PERM_ALL, \ + .ctrlPerms[DEV_SM_CTRL_MQS1_SETTINGS] = SM_SCMI_PERM_ALL, \ + .ctrlPerms[DEV_SM_CTRL_PDM_CLK_SEL] = SM_SCMI_PERM_ALL, \ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0008-ccimx95dvk-remove-PCA2123-RTC-from-EVK.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0008-ccimx95dvk-remove-PCA2123-RTC-from-EVK.patch new file mode 100644 index 000000000..84048c6b0 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0008-ccimx95dvk-remove-PCA2123-RTC-from-EVK.patch @@ -0,0 +1,1197 @@ +From: Hector Palacios +Date: Thu, 25 Sep 2025 11:41:51 +0200 +Subject: [PATCH 8/8] ccimx95dvk: remove PCA2123 RTC from EVK + +NXP used this external RTC on its 15x15 EVK. +This chip is not present on the DVK. + +Signed-off-by: Hector Palacios +--- + boards/ccimx95dvk/sm/Makefile | 11 +- + boards/ccimx95dvk/sm/brd_sm.h | 2 +- + boards/ccimx95dvk/sm/brd_sm_bbm.c | 671 ------------------------- + boards/ccimx95dvk/sm/brd_sm_bbm.h | 242 --------- + boards/ccimx95dvk/sm/brd_sm_control.c | 15 +- + boards/ccimx95dvk/sm/brd_sm_control.h | 3 +- + boards/ccimx95dvk/sm/brd_sm_handlers.c | 17 - + boards/ccimx95dvk/sm/brd_sm_handlers.h | 7 - + configs/ccimx95dvk.cfg | 3 - + configs/ccimx95dvk/config_scmi.h | 3 - + 10 files changed, 6 insertions(+), 968 deletions(-) + delete mode 100755 boards/ccimx95dvk/sm/brd_sm_bbm.c + delete mode 100755 boards/ccimx95dvk/sm/brd_sm_bbm.h + +diff --git a/boards/ccimx95dvk/sm/Makefile b/boards/ccimx95dvk/sm/Makefile +index db27ea922733..05fc7febba4c 100755 +--- a/boards/ccimx95dvk/sm/Makefile ++++ b/boards/ccimx95dvk/sm/Makefile +@@ -42,8 +42,7 @@ INCLUDE += \ + -I$(BOARD_DIR) \ + -I$(BOARD_DIR)/sm \ + -I$(COMPONENTS_DIR)/pf09 \ +- -I$(COMPONENTS_DIR)/pf53 \ +- -I$(COMPONENTS_DIR)/pca2131 ++ -I$(COMPONENTS_DIR)/pf53 + + VPATH += \ + $(BRD_SM_API_DIR) \ +@@ -51,8 +50,7 @@ VPATH += \ + $(BOARD_DIR) \ + $(BOARD_DIR)/sm \ + $(COMPONENTS_DIR)/pf09 \ +- $(COMPONENTS_DIR)/pf53 \ +- $(COMPONENTS_DIR)/pca2131 ++ $(COMPONENTS_DIR)/pf53 + + OBJS += \ + $(OUT)/board.o \ +@@ -61,8 +59,5 @@ OBJS += \ + $(OUT)/brd_sm_control.o \ + $(OUT)/brd_sm_sensor.o \ + $(OUT)/brd_sm_voltage.o \ +- $(OUT)/brd_sm_bbm.o \ + $(OUT)/fsl_pf09.o \ +- $(OUT)/fsl_pf53.o \ +- $(OUT)/fsl_pca2131.o +- ++ $(OUT)/fsl_pf53.o +diff --git a/boards/ccimx95dvk/sm/brd_sm.h b/boards/ccimx95dvk/sm/brd_sm.h +index ce758e1e4c64..0c8050646fba 100755 +--- a/boards/ccimx95dvk/sm/brd_sm.h ++++ b/boards/ccimx95dvk/sm/brd_sm.h +@@ -2,6 +2,7 @@ + ** ################################################################### + ** + ** Copyright 2023-2024 NXP ++** Copyright 2025 Digi International Inc. + ** + ** Redistribution and use in source and binary forms, with or without modification, + ** are permitted provided that the following conditions are met: +@@ -54,7 +55,6 @@ + #include "brd_sm_control.h" + #include "brd_sm_sensor.h" + #include "brd_sm_voltage.h" +-#include "brd_sm_bbm.h" + #include "board.h" + #include "brd_sm_api.h" + +diff --git a/boards/ccimx95dvk/sm/brd_sm_bbm.c b/boards/ccimx95dvk/sm/brd_sm_bbm.c +deleted file mode 100755 +index 2b13931c7749..000000000000 +--- a/boards/ccimx95dvk/sm/brd_sm_bbm.c ++++ /dev/null +@@ -1,671 +0,0 @@ +-/* +-** ################################################################### +-** +-** Copyright 2025 NXP +-** Copyright 2025 Digi International Inc. +-** +-** Redistribution and use in source and binary forms, with or without modification, +-** are permitted provided that the following conditions are met: +-** +-** o Redistributions of source code must retain the above copyright notice, this list +-** of conditions and the following disclaimer. +-** +-** o Redistributions in binary form must reproduce the above copyright notice, this +-** list of conditions and the following disclaimer in the documentation and/or +-** other materials provided with the distribution. +-** +-** o Neither the name of the copyright holder nor the names of its +-** contributors may be used to endorse or promote products derived from this +-** software without specific prior written permission. +-** +-** 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 HOLDER 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. +-** +-** +-** ################################################################### +-*/ +- +-/*==========================================================================*/ +-/* File containing the implementation of the PCA2131 RTC. */ +-/*==========================================================================*/ +- +-/* Note this code is an example. The conversion functions between date and +- seconds have not been fully tested to match The PCA2131 and calling +- agents. */ +- +-/* Includes */ +- +-#include "sm.h" +-#include "brd_sm.h" +-#include "lmm.h" +- +-/* Local defines */ +- +-/* Local types */ +- +-/* Local variables */ +- +-/* Local functions */ +- +-static bool days2date(uint32_t days, uint32_t *year, uint32_t *month, +- uint32_t *day, uint32_t *weekday); +-static void date2days(uint32_t year, uint32_t month, uint32_t day, +- uint32_t *days); +- +-/*--------------------------------------------------------------------------*/ +-/* Write RTC raw data */ +-/*--------------------------------------------------------------------------*/ +-int32_t BRD_SM_BbmRtcWrite(uint32_t addr, uint32_t numVal, +- const uint32_t *val) +-{ +- int32_t status = SM_ERR_SUCCESS; +- +- /* Check read size */ +- if (numVal > 24U) +- { +- status = SM_ERR_INVALID_PARAMETERS; +- } +- else +- { +- uint8_t buf[24]; +- +- /* Copy buffer (convert to 8-bit) */ +- for (uint32_t idx = 0U; idx < numVal; idx++) +- { +- buf[idx] = U32_U8(val[idx]); +- } +- +- /* Write data */ +- if (!PCA2131_RtcWrite(&g_pca2131Dev, U32_U8(addr), +- U32_U8(numVal), buf)) +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- } +- +- /* Return status */ +- return status; +-} +- +-/*--------------------------------------------------------------------------*/ +-/* Read RTC raw data */ +-/*--------------------------------------------------------------------------*/ +-int32_t BRD_SM_BbmRtcRead(uint32_t addr, uint32_t numVal, uint32_t *val) +-{ +- int32_t status = SM_ERR_SUCCESS; +- +- /* Check read size */ +- if (numVal > 24U) +- { +- status = SM_ERR_INVALID_PARAMETERS; +- } +- else +- { +- uint8_t buf[24] = { 0 }; +- +- /* Read data */ +- if (PCA2131_RtcRead(&g_pca2131Dev, U32_U8(addr), +- U32_U8(numVal), buf)) +- { +- /* Copy buffer (convert to 32-bit) */ +- for (uint32_t idx = 0U; idx < numVal; idx++) +- { +- val[idx] = (uint32_t) buf[idx]; +- } +- } +- else +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- } +- +- /* Return status */ +- return status; +-} +- +-/*--------------------------------------------------------------------------*/ +-/* Return RTC name */ +-/*--------------------------------------------------------------------------*/ +-int32_t BRD_SM_BbmRtcNameGet(uint32_t rtcId, string *rtcNameAddr, +- int32_t *len) +-{ +- int32_t status = SM_ERR_SUCCESS; +- static int32_t s_maxLen = 0; +- +- static string const s_name[BRD_SM_NUM_RTC] = +- { +- "pca2131" +- }; +- +- /* Get max string width */ +- DEV_SM_MaxStringGet(len, &s_maxLen, s_name, BRD_SM_NUM_RTC); +- +- if (rtcId < DEV_SM_NUM_RTC) +- { +- status = DEV_SM_BbmRtcNameGet(rtcId, rtcNameAddr, len); +- } +- else +- { +- /* Return pointer to name */ +- *rtcNameAddr = s_name[rtcId - DEV_SM_NUM_RTC]; +- } +- +- /* Return status */ +- return status; +-} +- +-/*--------------------------------------------------------------------------*/ +-/* Return RTC info */ +-/*--------------------------------------------------------------------------*/ +-int32_t BRD_SM_BbmRtcDescribe(uint32_t rtcId, uint32_t *secWidth, +- uint32_t *tickWidth, uint32_t *ticksPerSec) +-{ +- int32_t status = SM_ERR_SUCCESS; +- +- if (rtcId < DEV_SM_NUM_RTC) +- { +- status = DEV_SM_BbmRtcDescribe(rtcId, secWidth, tickWidth, +- ticksPerSec); +- } +- else +- { +- /* Return RTC info */ +- *secWidth = 32U; +- *tickWidth = 39U; +- *ticksPerSec = 100U; +- } +- +- /* Return status */ +- return status; +-} +- +-/*--------------------------------------------------------------------------*/ +-/* Set RTC time */ +-/*--------------------------------------------------------------------------*/ +-int32_t BRD_SM_BbmRtcTimeSet(uint32_t rtcId, uint64_t val, bool ticks) +-{ +- int32_t status = SM_ERR_SUCCESS; +- +- if (rtcId < DEV_SM_NUM_RTC) +- { +- status = DEV_SM_BbmRtcTimeSet(rtcId, val, ticks); +- } +- else +- { +- uint32_t year, month, day, hour, min, sec, hun, weekday; +- uint32_t days, hours, mins, secs; +- +- /* Convert to hundredths of seconds */ +- if (ticks) +- { +- uint64_t sec64, hun64; +- +- sec64 = val / 100U; +- hun64 = val - (sec64 * 100U); +- +- secs = U64_U32(sec64); +- hun = U64_U32(hun64); +- } +- else +- { +- hun = 0U; +- secs = U64_U32(val); +- } +- +- /* Calculate totals */ +- mins = secs / 60U; +- hours = secs / 3600U; +- days = secs / 86400U; +- +- /* Calculate time */ +- sec = secs % 60U; +- min = mins % 60U; +- hour = hours % 24U; +- +- /* Convert to date */ +- if (days2date(days, &year, &month, &day, &weekday) +- && (year <= 2069U)) +- { +- /* Convert year */ +- year %= 100U; +- +- /* Write RTC */ +- if (!PCA2131_RtcSet(&g_pca2131Dev, year, month, day, hour, +- min, sec, hun, weekday)) +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- } +- else +- { +- status = SM_ERR_INVALID_PARAMETERS; +- } +- } +- +- if (status == SM_ERR_SUCCESS) +- { +- /* Enable battery */ +- (void) PCA2131_PowerModeSet(&g_pca2131Dev, 0U); +- } +- +- /* Return status */ +- return status; +-} +- +-/*--------------------------------------------------------------------------*/ +-/* Get RTC time */ +-/*--------------------------------------------------------------------------*/ +-int32_t BRD_SM_BbmRtcTimeGet(uint32_t rtcId, uint64_t *val, bool ticks) +-{ +- int32_t status = SM_ERR_SUCCESS; +- +- if (rtcId < DEV_SM_NUM_RTC) +- { +- status = DEV_SM_BbmRtcTimeGet(rtcId, val, ticks); +- } +- else +- { +- uint32_t year, month, day, hour, min, sec, hun, weekday; +- +- /* Read RTC */ +- if (PCA2131_RtcGet(&g_pca2131Dev, &year, &month, &day, &hour, &min, +- &sec, &hun, &weekday)) +- { +- uint32_t days, secs; +- +- /* Convert year */ +- if (year >= 70U) +- { +- year = year + 1900U; +- } +- else +- { +- year = year + 2000U; +- } +- +- /* Convert to days */ +- date2days(year, month, day, &days); +- +- /* Calculate seconds */ +- secs = sec + (min * 60U) + (hour * 3600U); +- secs += (days * 86400U); +- +- /* Check time format */ +- if (ticks) +- { +- *val = (((uint64_t) secs) * 100U) + hun; +- } +- else +- { +- *val = ((uint64_t) secs); +- } +- } +- else +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- } +- +- /* Return status */ +- return status; +-} +- +-/*--------------------------------------------------------------------------*/ +-/* Get BBM RTC state */ +-/*--------------------------------------------------------------------------*/ +-int32_t BRD_SM_BbmRtcStateGet(uint32_t rtcId, uint32_t *state) +-{ +- int32_t status = SM_ERR_SUCCESS; +- +- if (rtcId < DEV_SM_NUM_RTC) +- { +- status = DEV_SM_BbmRtcStateGet(rtcId, state); +- } +- else +- { +- bool st; +- +- /* Default state */ +- *state = 0U; +- +- /* Enable battery */ +- (void) PCA2131_PowerModeSet(&g_pca2131Dev, 0U); +- +- /* Get battery state */ +- if (PCA2131_TimeStatusGet(&g_pca2131Dev, &st)) +- { +- if (st) +- { +- *state |= LMM_BBM_STATE_RESET; +- } +- } +- else +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- +- /* Get battery state */ +- if (PCA2131_BattStatusGet(&g_pca2131Dev, &st)) +- { +- if (st) +- { +- *state |= LMM_BBM_STATE_BATT_LOW; +- } +- } +- else +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- } +- +- /* Return status */ +- return status; +-} +- +-/*--------------------------------------------------------------------------*/ +-/* Set RTC alarm */ +-/*--------------------------------------------------------------------------*/ +-int32_t BRD_SM_BbmRtcAlarmSet(uint32_t rtcId, bool enable, uint64_t val) +-{ +- int32_t status = SM_ERR_SUCCESS; +- +- if (rtcId < DEV_SM_NUM_RTC) +- { +- status = DEV_SM_BbmRtcAlarmSet(rtcId, enable, val); +- } +- else +- { +- /* Enable? */ +- if (enable) +- { +- uint32_t year, month, day, hour, min, sec, weekday; +- uint32_t days, hours, mins, secs; +- +- /* Convert to seconds */ +- secs = U64_U32(val); +- +- /* Calculate totals */ +- mins = secs / 60U; +- hours = secs / 3600U; +- days = secs / 86400U; +- +- /* Calculate time */ +- sec = secs % 60U; +- min = mins % 60U; +- hour = hours % 24U; +- +- /* Convert to date */ +- if (days2date(days, &year, &month, &day, &weekday) +- && (year <= 2069U)) +- { +- /* Convert year */ +- year %= 100U; +- +- /* Write to RTC */ +- if (PCA2131_AlarmSet(&g_pca2131Dev, day, hour, min, sec, +- weekday)) +- { +- /* Enable interrupt */ +- if (PCA2131_IntEnable(&g_pca2131Dev, true)) +- { +- } +- else +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- } +- } +- else +- { +- status = SM_ERR_INVALID_PARAMETERS; +- } +- +- /* Track if enabled for PCA2131 use */ +- if (status == SM_ERR_SUCCESS) +- { +- g_pca2131Used = true; +- } +- } +- else +- { +- /* Disable interrupt */ +- if (PCA2131_IntEnable(&g_pca2131Dev, false)) +- { +- } +- else +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- } +- } +- +- /* Return status */ +- return status; +-} +- +-/*--------------------------------------------------------------------------*/ +-/* PCA2131 interrupt handler */ +-/*--------------------------------------------------------------------------*/ +-void BRD_SM_BbmHandler(void) +-{ +- /* Handle alarm */ +- LMM_BbmRtcAlarmEvent(BRD_SM_RTC_PCA2131); +- +- /* Clear status flags */ +- (void) PCA2131_IntClear(&g_pca2131Dev); +-} +- +-/*==========================================================================*/ +- +-/*--------------------------------------------------------------------------*/ +-/* Convert days since 1-1-1970 to date/time */ +-/*--------------------------------------------------------------------------*/ +-static bool days2date(uint32_t days, uint32_t *year, uint32_t *month, +- uint32_t *day, uint32_t *weekday) +-{ +- bool rc = true; +- uint32_t newDays = 0U; +- uint32_t era = 0U; +- uint32_t doe = 0U; +- uint32_t yoe = 0U; +- uint32_t doy = 0U; +- uint32_t moy = 0U; +- +- /* Check days value doesn't wrap */ +- if (days <= (UINT32_MAX - 719468U)) +- { +- /* Adjust to 1-1-1970) */ +- newDays = days + 719468U; +- } +- else +- { +- /* Set the return code incase value wraps */ +- rc = false; +- } +- +- if (rc) +- { +- /* Calculate the era */ +- era = newDays / 146097U; +- +- /* Check the expression doesn't wrap due to negative value */ +- if (newDays >= (era * 146097U)) +- { +- /* Calculate the day in the era */ +- doe = newDays - (era * 146097U); +- } +- else +- { +- /* Set the return code if the expression value wraps */ +- rc = false; +- } +- } +- +- if (rc) +- { +- /* Check the expression doesn't wrap due to negative value */ +- if (doe >= (doe / 1460U)) +- { +- /* Calculate the year of era */ +- yoe = (doe - (doe / 1460U) + (doe / 36524U)); +- +- /* Check the expression doesn't wrap due to negative value */ +- if (yoe >= (doe / 146096U)) +- { +- yoe -= (doe / 146096U); +- yoe /= 365U; +- } +- else +- { +- /* Set the return code if the expression value wraps */ +- rc = false; +- } +- } +- else +- { +- /* Set the return code if the expression value wraps */ +- rc = false; +- } +- } +- +- if (rc) +- { +- /* Check the expression doesn't wrap due to negative value */ +- if (yoe <= (UINT32_MAX - (era * 400U))) +- { +- /* Calculate year */ +- *year = yoe + (era * 400U); +- } +- else +- { +- /* Set the return code if the expression value wraps */ +- rc = false; +- } +- } +- +- if (rc) +- { +- /* Check the expression doesn't wrap due to negative value */ +- if (doe >= (365U * yoe)) +- { +- /* Calculate day of the year */ +- doy = doe - (365U * yoe); +- +- /* Check the expression doesn't wrap due to negative value */ +- if (doy >= (yoe / 4U)) +- { +- doy -= (yoe / 4U); +- doy += (yoe / 100U); +- } +- else +- { +- /* Set the return code if the expression value wraps */ +- rc = false; +- } +- } +- else +- { +- /* Set the return code if the expression value wraps */ +- rc = false; +- } +- } +- +- if (rc) +- { +- /* Check the expression doesn't wrap due to negative value */ +- if (doy <= (UINT32_MAX / 5U)) +- { +- /* Calculate month of year */ +- moy = ((5U * doy) + 2U) / 153U; +- } +- else +- { +- /* Set the return code if the expression value wraps */ +- rc = false; +- } +- } +- +- +- if (rc) +- { +- /* Check the expression doesn't wrap due to negative value */ +- if (moy <= ((UINT32_MAX - 2U) / 153U)) +- { +- /* Calculate day */ +- *day = (((153U * moy) + 2U) / 5U) - 1U; +- if (doy >= *day) +- { +- *day = doy - *day; +- } +- else +- { +- /* Set the return code if the expression value wraps */ +- rc = false; +- } +- } +- else +- { +- /* Set the return code if the expression value wraps */ +- rc = false; +- } +- } +- +- if (rc) +- { +- /* Calculate month */ +- *month= (moy < 10U) ? (moy + 3U) : (moy - 9U); +- +- /* Calculate day of the week */ +- *weekday = (days + 4U) % 7U; +- +- /* Adjust year */ +- *year += (*month <= 2U) ? 1U : 0U; +- } +- +- /* Return code */ +- return rc; +-} +- +-/*--------------------------------------------------------------------------*/ +-/* Convert date/time to days since 1-1-1970 */ +-/*--------------------------------------------------------------------------*/ +-static void date2days(uint32_t year, uint32_t month, uint32_t day, +- uint32_t *days) +-{ +- uint32_t newYear; +- uint32_t era; +- uint32_t doe; +- uint32_t yoe; +- uint32_t doy; +- uint32_t moy; +- +- /* Adjust year */ +- newYear = year - ((month <= 2U) ? 1U : 0U); +- +- /* Calculate era */ +- era = newYear / 400U; +- +- /* Calculate the year of era */ +- yoe = newYear - (era * 400U); +- +- /* Calculate month of year */ +- moy = (month > 2U) ? (month - 3U) : (month + 9U); +- +- /* Calculate day of the year */ +- doy = (((153U * moy) + 2U) / 5U) + (day - 1U); +- +- /* Calculate the day in the era */ +- doe = (yoe * 365U) + (yoe / 4U) - (yoe / 100U) + doy; +- +- /* Calculate days */ +- *days = (era * 146097U) + doe - 719468U; +-} +- +diff --git a/boards/ccimx95dvk/sm/brd_sm_bbm.h b/boards/ccimx95dvk/sm/brd_sm_bbm.h +deleted file mode 100755 +index a96a8e1cc901..000000000000 +--- a/boards/ccimx95dvk/sm/brd_sm_bbm.h ++++ /dev/null +@@ -1,242 +0,0 @@ +-/* +-** ################################################################### +-** +-** Copyright 2024 NXP +-** +-** Redistribution and use in source and binary forms, with or without modification, +-** are permitted provided that the following conditions are met: +-** +-** o Redistributions of source code must retain the above copyright notice, this list +-** of conditions and the following disclaimer. +-** +-** o Redistributions in binary form must reproduce the above copyright notice, this +-** list of conditions and the following disclaimer in the documentation and/or +-** other materials provided with the distribution. +-** +-** o Neither the name of the copyright holder nor the names of its +-** contributors may be used to endorse or promote products derived from this +-** software without specific prior written permission. +-** +-** 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 HOLDER 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. +-** +-** +-** ################################################################### +-*/ +- +-/*==========================================================================*/ +-/*! +- * @addtogroup BRD_SM_MX95EVK +- * @{ +- * +- * @file +- * @brief +- * +- * Header file containing the SM API for the board PCA2131. +- */ +-/*==========================================================================*/ +- +-#ifndef BRD_SM_BBM_H +-#define BRD_SM_BBM_H +- +-/* Includes */ +- +-#include "sm.h" +-#include "dev_sm.h" +-#include "fsl_pca2131.h" +- +-/* Defines */ +- +-/*! +- * @name Board redirection defines +- * @{ +- */ +-#define SM_BBMRTCNAMEGET BRD_SM_BbmRtcNameGet /*!< RTC name */ +-#define SM_BBMRTCDESCRIBE BRD_SM_BbmRtcDescribe /*!< RTC describe */ +-#define SM_BBMRTCTIMESET BRD_SM_BbmRtcTimeSet /*!< RTC time set */ +-#define SM_BBMRTCTIMEGET BRD_SM_BbmRtcTimeGet /*!< RTC time get */ +-#define SM_BBMRTCSTATEGET BRD_SM_BbmRtcStateGet /*!< RTC state get */ +-#define SM_BBMRTCALARMSET BRD_SM_BbmRtcAlarmSet /*!< RTC alarm set */ +-/** @} */ +- +-/*! Number of board RTC */ +-#define BRD_SM_NUM_RTC 1UL +- +-/*! Total number of RTC */ +-#define SM_NUM_RTC (DEV_SM_NUM_RTC + BRD_SM_NUM_RTC) +- +-/*! +- * @name BRD_SM bbm domain indexes +- */ +-/** @{ */ +-#define BRD_SM_RTC_PCA2131 (BRD_SM_NUM_RTC + 0U) /*!< PCA2131 RTC */ +-/** @} */ +- +-/* Types */ +- +-/* Functions */ +- +-/*! +- * @name Board sensor functions +- * @{ +- */ +- +-/*! +- * Read raw byte data from the RTC. +- * +- * @param[in] addr I2C address to read +- * @param[in] numVal Number of bytes to read +- * @param[out] val Return pointer for data +- * +- * @return Returns the status (::SM_ERR_SUCCESS = success). +- * +- * Return errors (see @ref STATUS "SM error codes"): +- * - ::SM_ERR_INVALID_PARAMETERS: if \a numVal is invalid. +- * - ::SM_ERR_HARDWARE_ERROR: if I2C transfer fails. +- */ +-int32_t BRD_SM_BbmRtcWrite(uint32_t addr, uint32_t numVal, +- const uint32_t *val); +- +-/*! +- * Write raw byte data to the RTC. +- * +- * @param[in] addr I2C address to write +- * @param[in] numVal Number of bytes to write +- * @param[in] val Pointer to data +- * +- * @return Returns the status (::SM_ERR_SUCCESS = success). +- * +- * Return errors (see @ref STATUS "SM error codes"): +- * - ::SM_ERR_INVALID_PARAMETERS: if \a numVal is invalid. +- * - ::SM_ERR_HARDWARE_ERROR: if I2C transfer fails. +- */ +-int32_t BRD_SM_BbmRtcRead(uint32_t addr, uint32_t numVal, uint32_t *val); +- +-/*! +- * Get a board RTC name. +- * +- * @param[in] rtcId RTC name to get +- * @param[out] rtcNameAddr Return pointer to name +- * @param[out] len Return max length of all RTC names +- * +- * This function allows the caller to get the name of an RTC. +- * +- * @return Returns the status (::SM_ERR_SUCCESS = success). +- * +- * Return errors (see @ref STATUS "SM error codes"): +- * - ::SM_ERR_NOT_FOUND: if \a rtcId is invalid. +- */ +-int32_t BRD_SM_BbmRtcNameGet(uint32_t rtcId, string *rtcNameAddr, +- int32_t *len); +- +-/*! +- * Get a board RTC description. +- * +- * @param[in] rtcId RTC description to get +- * @param[out] secWidth Return pointer to seconds width +- * @param[out] tickWidth Return pointer to tick width +- * @param[out] ticksPerSec Return pointer to ticks per second +- * +- * This function allows the caller to get the description of an RTC. +- * +- * @return Returns the status (::SM_ERR_SUCCESS = success). +- * +- * Return errors (see @ref STATUS "SM error codes"): +- * - ::SM_ERR_NOT_FOUND: if \a rtcId is invalid. +- */ +-int32_t BRD_SM_BbmRtcDescribe(uint32_t rtcId, uint32_t *secWidth, +- uint32_t *tickWidth, uint32_t *ticksPerSec); +- +-/*! +- * Set a board RTC time. +- * +- * @param[in] rtcId Identifier of the RTC +- * @param[in] val Time in seconds/ticks to write to the RTC +- * @param[in] ticks true = ticks, false = seconds +- * +- * This function allows a caller to set the RTC time. Time can be set in units +- * of ticks or seconds. +- * +- * @return Returns the status (::SM_ERR_SUCCESS = success). +- * +- * Return errors (see @ref STATUS "SM error codes"): +- * - ::SM_ERR_SUCCESS: if the RTC time was successfully set. +- * - ::SM_ERR_NOT_FOUND: if \a rtcId pertains to a non-existent RTC. +- * - ::SM_ERR_INVALID_PARAMETERS: if the time is not valid (beyond the +- * range of the RTC). +- */ +-int32_t BRD_SM_BbmRtcTimeSet(uint32_t rtcId, uint64_t val, bool ticks); +- +-/*! +- * Get a board RTC time. +- * +- * @param[in] rtcId Identifier of the RTC +- * @param[out] val Time in seconds/ticks read from the RTC +- * @param[in] ticks true = ticks, false = seconds +- * +- * This function allows a caller to read the RTC time. Time can be read in +- * units of ticks or seconds. +- * +- * @return Returns the status (::SM_ERR_SUCCESS = success). +- * +- * Return errors (see @ref STATUS "SM error codes"): +- * - ::SM_ERR_SUCCESS: if the RTC time was successfully read. +- * - ::SM_ERR_NOT_FOUND: if \a rtcId pertains to a non-existent RTC. +- */ +-int32_t BRD_SM_BbmRtcTimeGet(uint32_t rtcId, uint64_t *val, bool ticks); +- +-/*! +- * Get a board RTC state. +- * +- * @param[in] rtcId Identifier of the RTC +- * @param[out] state Bit mask of state flags +- * +- * This function allows a caller to read the RTC state. +- * +- * @return Returns the status (::SM_ERR_SUCCESS = success). +- * +- * Return errors (see @ref STATUS "SM error codes"): +- * - ::SM_ERR_SUCCESS: if the RTC state was successfully read. +- * - ::SM_ERR_NOT_FOUND: if \a rtcId pertains to a non-existent RTC. +- */ +-int32_t BRD_SM_BbmRtcStateGet(uint32_t rtcId, uint32_t *state); +- +-/*! +- * Set a board RTC alarm. +- * +- * @param[in] rtcId Identifier of the RTC +- * @param[in] enable Enable flag (1=enabled, 0=disabled) +- * @param[in] val Alarm time in seconds to write to the RTC +- * +- * This function allows a caller to enable/disable and set the time for the RTC +- * alarm. The alarm can be set in seconds only. +- * +- * @return Returns the status (::SM_ERR_SUCCESS = success). +- * +- * Return errors (see @ref STATUS "SM error codes"): +- * - ::SM_ERR_SUCCESS: if the alarm was successfully set. +- * - ::SM_ERR_NOT_FOUND: if \a rtcId pertains to a non-existent RTC. +- * - ::SM_ERR_INVALID_PARAMETERS: if the time is not valid (beyond the +- * range of the RTC alarm). +- */ +-int32_t BRD_SM_BbmRtcAlarmSet(uint32_t rtcId, bool enable, uint64_t val); +- +-/*! +- * Handle PCA2131 interrupt. +- */ +-void BRD_SM_BbmHandler(void); +- +-/** @} */ +- +-#endif /* BRD_SM_BBM_H */ +- +-/** @} */ +- +diff --git a/boards/ccimx95dvk/sm/brd_sm_control.c b/boards/ccimx95dvk/sm/brd_sm_control.c +index 8484a6895a3d..564159c1ad7b 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_control.c ++++ b/boards/ccimx95dvk/sm/brd_sm_control.c +@@ -65,10 +65,6 @@ int32_t BRD_SM_ControlSet(uint32_t ctrlId, uint32_t numVal, + { + status = DEV_SM_ControlSet(ctrlId, numVal, val); + } +- else if (ctrlId == BRD_SM_CTRL_PCA2131) +- { +- status = SM_ERR_NOT_SUPPORTED; +- } + else if (ctrlId == BRD_SM_CTRL_TEST) + { + /* Test response to an reported SM error */ +@@ -103,8 +99,7 @@ int32_t BRD_SM_ControlGet(uint32_t ctrlId, uint32_t *numRtn, uint32_t *rtn) + { + status = DEV_SM_ControlGet(ctrlId, numRtn, rtn); + } +- else if ((ctrlId == BRD_SM_CTRL_PCA2131) +- || (ctrlId == BRD_SM_CTRL_TEST)) ++ else if (ctrlId == BRD_SM_CTRL_TEST) + { + *numRtn = 0U; + status = SM_ERR_NOT_SUPPORTED; +@@ -140,10 +135,6 @@ int32_t BRD_SM_ControlExtSet(uint32_t ctrlId, uint32_t addr, + { + status = DEV_SM_ControlExtSet(ctrlId, addr, numVal, val); + } +- else if (ctrlId == BRD_SM_CTRL_PCA2131) +- { +- status = BRD_SM_BbmRtcWrite(addr, numVal, val); +- } + else + { + status = SM_ERR_NOT_SUPPORTED; +@@ -174,10 +165,6 @@ int32_t BRD_SM_ControlExtGet(uint32_t ctrlId, uint32_t addr, + { + status = DEV_SM_ControlExtGet(ctrlId, addr, numRtn, rtn); + } +- else if (ctrlId == BRD_SM_CTRL_PCA2131) +- { +- status = BRD_SM_BbmRtcRead(addr, numRtn, rtn); +- } + else + { + status = SM_ERR_NOT_SUPPORTED; +diff --git a/boards/ccimx95dvk/sm/brd_sm_control.h b/boards/ccimx95dvk/sm/brd_sm_control.h +index 12365e56d7e4..be764f4cb1e7 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_control.h ++++ b/boards/ccimx95dvk/sm/brd_sm_control.h +@@ -67,7 +67,7 @@ + /** @} */ + + /*! Number of board controls */ +-#define BRD_SM_NUM_CTRL 2UL ++#define BRD_SM_NUM_CTRL 1UL + + /*! Total number of controls */ + #define SM_NUM_CTRL (DEV_SM_NUM_CTRL + BRD_SM_NUM_CTRL) +@@ -77,7 +77,6 @@ + */ + /** @{ */ + #define BRD_SM_CTRL_TEST (DEV_SM_NUM_CTRL + 0U) /*!< Test */ +-#define BRD_SM_CTRL_PCA2131 (DEV_SM_NUM_CTRL + 1U) /*!< PCA2131 raw access */ + /** @} */ + + /* Types */ +diff --git a/boards/ccimx95dvk/sm/brd_sm_handlers.c b/boards/ccimx95dvk/sm/brd_sm_handlers.c +index a42359f15e8b..1c02541a589b 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_handlers.c ++++ b/boards/ccimx95dvk/sm/brd_sm_handlers.c +@@ -51,7 +51,6 @@ + #define BOARD_PF09_DEV_ADDR 0x08U + #define BOARD_PF5301_DEV_ADDR 0x2AU + #define BOARD_PF5302_DEV_ADDR 0x29U +-#define BOARD_PCA2131_DEV_ADDR 0x53U + + /* Local types */ + +@@ -62,7 +61,6 @@ + PF09_Type g_pf09Dev; + PF53_Type g_pf5301Dev; + PF53_Type g_pf5302Dev; +-PCA2131_Type g_pca2131Dev; + + irq_prio_info_t g_brdIrqPrioInfo[BOARD_NUM_IRQ_PRIO_IDX] = + { +@@ -75,8 +73,6 @@ irq_prio_info_t g_brdIrqPrioInfo[BOARD_NUM_IRQ_PRIO_IDX] = + } + }; + +-bool g_pca2131Used = false; +- + uint32_t g_pmicFaultFlags = 0U; + + /* Local functions */ +@@ -215,19 +211,6 @@ int32_t BRD_SM_SerialDevicesInit(void) + } + } + +- if (status == SM_ERR_SUCCESS) +- { +- /* Fill in PCA2131 RTC handle */ +- g_pca2131Dev.i2cBase = s_i2cBases[BOARD_I2C_INSTANCE]; +- g_pca2131Dev.devAddr = BOARD_PCA2131_DEV_ADDR; +- +- /* Initialize PCA2131 RTC */ +- if (!PCA2131_Init(&g_pca2131Dev)) +- { +- status = SM_ERR_HARDWARE_ERROR; +- } +- } +- + /* Return status */ + return status; + } +diff --git a/boards/ccimx95dvk/sm/brd_sm_handlers.h b/boards/ccimx95dvk/sm/brd_sm_handlers.h +index 781a443e8444..967d41d61b53 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_handlers.h ++++ b/boards/ccimx95dvk/sm/brd_sm_handlers.h +@@ -55,7 +55,6 @@ + #include "dev_sm.h" + #include "fsl_pf09.h" + #include "fsl_pf53.h" +-#include "fsl_pca2131.h" + + /* Defines */ + +@@ -78,15 +77,9 @@ extern PF53_Type g_pf5301Dev; + /*! Handle to access PF5302 */ + extern PF53_Type g_pf5302Dev; + +-/*! Handle to access PCA2131 */ +-extern PCA2131_Type g_pca2131Dev; +- + /*! Array of dynamic priority info for board IRQs */ + extern irq_prio_info_t g_brdIrqPrioInfo[BOARD_NUM_IRQ_PRIO_IDX]; + +-/*! Indicator if bus expander bit[6] is used for the PF2131 RTC */ +-extern bool g_pca2131Used; +- + /*! Fault flags from the PMICs */ + extern uint32_t g_pmicFaultFlags; + +diff --git a/configs/ccimx95dvk.cfg b/configs/ccimx95dvk.cfg +index 4af5cea789d9..b324e0fb0e45 100755 +--- a/configs/ccimx95dvk.cfg ++++ b/configs/ccimx95dvk.cfg +@@ -345,9 +345,7 @@ CHANNEL db=2, xport=smt, check=crc32, rpc=scmi, \ + + # API + +-BRD_SM_CTRL_PCA2131 ALL + BRD_SM_CTRL_TEST ALL +-BRD_SM_RTC_PCA2131 ALL + BRD_SM_SENSOR_TEMP_PF09 SET + BRD_SM_SENSOR_TEMP_PF5301 SET + BRD_SM_SENSOR_TEMP_PF5302 SET +@@ -531,7 +529,6 @@ CHANNEL db=1, xport=smt, rpc=scmi, type=p2a_notify + + AUDIO_PLL1 ALL + AUDIO_PLL2 ALL +-BRD_SM_RTC_PCA2131 PRIV + BRD_SM_SENSOR_TEMP_PF09 ALL + BRD_SM_SENSOR_TEMP_PF5301 SET + BRD_SM_SENSOR_TEMP_PF5302 SET +diff --git a/configs/ccimx95dvk/config_scmi.h b/configs/ccimx95dvk/config_scmi.h +index d251f7910b39..b23958f33138 100644 +--- a/configs/ccimx95dvk/config_scmi.h ++++ b/configs/ccimx95dvk/config_scmi.h +@@ -72,7 +72,6 @@ + .clkPerms[DEV_SM_CLK_M7] = SM_SCMI_PERM_ALL, \ + .clkPerms[DEV_SM_CLK_TSTMR2] = SM_SCMI_PERM_ALL, \ + .cpuPerms[DEV_SM_CPU_M7P] = SM_SCMI_PERM_ALL, \ +- .ctrlPerms[BRD_SM_CTRL_PCA2131] = SM_SCMI_PERM_ALL, \ + .ctrlPerms[BRD_SM_CTRL_TEST] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPTMR2_0] = SM_SCMI_PERM_ALL, \ + .daisyPerms[DEV_SM_DAISY_LPTMR2_1] = SM_SCMI_PERM_ALL, \ +@@ -87,7 +86,6 @@ + .pdPerms[DEV_SM_PD_M7] = SM_SCMI_PERM_ALL, \ + .perfPerms[DEV_SM_PERF_M7] = SM_SCMI_PERM_ALL, \ + .perlpiPerms[DEV_SM_PERLPI_WDOG5] = SM_SCMI_PERM_ALL, \ +- .rtcPerms[BRD_SM_RTC_PCA2131] = SM_SCMI_PERM_ALL, \ + .rtcPerms[DEV_SM_RTC_BBNSM] = SM_SCMI_PERM_PRIV, \ + .sensorPerms[BRD_SM_SENSOR_TEMP_PF09] = SM_SCMI_PERM_SET, \ + .sensorPerms[BRD_SM_SENSOR_TEMP_PF5301] = SM_SCMI_PERM_SET, \ +@@ -605,7 +603,6 @@ + .pinPerms[DEV_SM_PIN_XSPI1_SCLK] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_XSPI1_SS0_B] = SM_SCMI_PERM_ALL, \ + .pinPerms[DEV_SM_PIN_XSPI1_SS1_B] = SM_SCMI_PERM_ALL, \ +- .rtcPerms[BRD_SM_RTC_PCA2131] = SM_SCMI_PERM_PRIV, \ + .rtcPerms[DEV_SM_RTC_BBNSM] = SM_SCMI_PERM_ALL, \ + .sensorPerms[BRD_SM_SENSOR_TEMP_PF09] = SM_SCMI_PERM_ALL, \ + .sensorPerms[BRD_SM_SENSOR_TEMP_PF5301] = SM_SCMI_PERM_SET, \ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0009-ccimx95-change-names-of-voltage-regulators.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0009-ccimx95-change-names-of-voltage-regulators.patch new file mode 100644 index 000000000..e64e38706 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0009-ccimx95-change-names-of-voltage-regulators.patch @@ -0,0 +1,274 @@ +From: Hector Palacios +Date: Mon, 29 Sep 2025 13:02:02 +0200 +Subject: [PATCH 09/11] ccimx95: change names of voltage regulators + +Change the names of voltage regulators for easier identification. +Use the PMIC regulator (SW1, SW2, LDO1...) and then the name of the power +rail used in the SOM. + +Signed-off-by: Hector Palacios +--- + boards/ccimx95dvk/sm/brd_sm_voltage.c | 85 ++++++++++++++------------- + boards/ccimx95dvk/sm/brd_sm_voltage.h | 15 ++--- + 2 files changed, 51 insertions(+), 49 deletions(-) + +diff --git a/boards/ccimx95dvk/sm/brd_sm_voltage.c b/boards/ccimx95dvk/sm/brd_sm_voltage.c +index b81ffd970294..d7e7c9b3ea27 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_voltage.c ++++ b/boards/ccimx95dvk/sm/brd_sm_voltage.c +@@ -2,6 +2,7 @@ + ** ################################################################### + ** + ** Copyright 2023-2025 NXP ++** Copyright 2025 Digi International Inc. + ** + ** Redistribution and use in source and binary forms, with or without modification, + ** are permitted provided that the following conditions are met: +@@ -63,13 +64,13 @@ int32_t BRD_SM_VoltageNameGet(uint32_t domainId, string *voltNameAddr, + + static string const s_name[BRD_SM_NUM_VOLT] = + { +- "vdd_gpio_3p3", +- "vdd_ana_0p8", +- "vdd_gpio_1p8", +- "vddq_ddr", +- "vdd2_ddr", +- "sd_card", +- "nvcc_sd2" ++ "vdd_3v3", ++ "vdd_ana_0v8", ++ "vdd_1v8", ++ "lpd5_vddq", ++ "lpd5_vdd2", ++ "vdd_ldo1", ++ "vdd_sdio2" + }; + + /* Get max string width */ +@@ -117,25 +118,25 @@ int32_t BRD_SM_VoltageDescribe(uint32_t domainId, + case DEV_SM_VOLT_ARM: + status = DEV_SM_VoltageDescribe(domainId, range); + break; +- case BRD_SM_VOLT_VDD_GPIO_3P3: ++ case BRD_SM_VOLT_SW1_VDD_3V3: + rc = PF09_RegulatorInfoGet(PF09_REG_SW1, &info); + break; +- case BRD_SM_VOLT_VDD_ANA_0P8: ++ case BRD_SM_VOLT_SW2_VDD_ANA_0V8: + rc = PF09_RegulatorInfoGet(PF09_REG_SW2, &info); + break; +- case BRD_SM_VOLT_VDD_GPIO_1P8: ++ case BRD_SM_VOLT_SW3_VDD_1V8: + rc = PF09_RegulatorInfoGet(PF09_REG_SW3, &info); + break; +- case BRD_SM_VOLT_VDDQ_DDR: ++ case BRD_SM_VOLT_SW4_LPD5_VDDQ: + rc = PF09_RegulatorInfoGet(PF09_REG_SW4, &info); + break; +- case BRD_SM_VOLT_VDD2_DDR: ++ case BRD_SM_VOLT_SW5_LPD5_VDD2: + rc = PF09_RegulatorInfoGet(PF09_REG_SW5, &info); + break; +- case BRD_SM_VOLT_SD_CARD: ++ case BRD_SM_VOLT_LDO1_VDD_LDO1: + rc = PF09_RegulatorInfoGet(PF09_REG_LDO1, &info); + break; +- case BRD_SM_VOLT_NVCC_SD2: ++ case BRD_SM_VOLT_LDO2_VDD_SDIO2: + rc = PF09_RegulatorInfoGet(PF09_REG_LDO2, &info); + break; + default: +@@ -206,31 +207,31 @@ int32_t BRD_SM_VoltageModeSet(uint32_t domainId, uint8_t voltMode) + s_modeArm = voltMode; + } + break; +- case BRD_SM_VOLT_VDD_GPIO_3P3: ++ case BRD_SM_VOLT_SW1_VDD_3V3: + rc = PF09_SwModeSet(&g_pf09Dev, PF09_REG_SW1, PF09_STATE_VRUN, + mode); + break; +- case BRD_SM_VOLT_VDD_ANA_0P8: ++ case BRD_SM_VOLT_SW2_VDD_ANA_0V8: + rc = PF09_SwModeSet(&g_pf09Dev, PF09_REG_SW2, PF09_STATE_VRUN, + mode); + break; +- case BRD_SM_VOLT_VDD_GPIO_1P8: ++ case BRD_SM_VOLT_SW3_VDD_1V8: + rc = PF09_SwModeSet(&g_pf09Dev, PF09_REG_SW3, PF09_STATE_VRUN, + mode); + break; +- case BRD_SM_VOLT_VDDQ_DDR: ++ case BRD_SM_VOLT_SW4_LPD5_VDDQ: + rc = PF09_SwModeSet(&g_pf09Dev, PF09_REG_SW4, PF09_STATE_VRUN, + mode); + break; +- case BRD_SM_VOLT_VDD2_DDR: ++ case BRD_SM_VOLT_SW5_LPD5_VDD2: + rc = PF09_SwModeSet(&g_pf09Dev, PF09_REG_SW5, PF09_STATE_VRUN, + mode); + break; +- case BRD_SM_VOLT_SD_CARD: ++ case BRD_SM_VOLT_LDO1_VDD_LDO1: + rc = PF09_LdoEnable(&g_pf09Dev, PF09_REG_LDO1, PF09_STATE_VRUN, + enable); + break; +- case BRD_SM_VOLT_NVCC_SD2: ++ case BRD_SM_VOLT_LDO2_VDD_SDIO2: + rc = PF09_LdoEnable(&g_pf09Dev, PF09_REG_LDO2, PF09_STATE_VRUN, + enable); + break; +@@ -271,36 +272,36 @@ int32_t BRD_SM_VoltageModeGet(uint32_t domainId, uint8_t *voltMode) + rc = PF09_GpioCtrlGet(&g_pf09Dev, PF09_GPIO4, PF53_STATE_VRUN, + &enable); + break; +- case BRD_SM_VOLT_VDD_GPIO_3P3: ++ case BRD_SM_VOLT_SW1_VDD_3V3: + rc = PF09_SwModeGet(&g_pf09Dev, PF09_REG_SW1, PF09_STATE_VRUN, + &mode); + enable = (mode != PF09_SW_MODE_OFF); + break; +- case BRD_SM_VOLT_VDD_ANA_0P8: ++ case BRD_SM_VOLT_SW2_VDD_ANA_0V8: + rc = PF09_SwModeGet(&g_pf09Dev, PF09_REG_SW2, PF09_STATE_VRUN, + &mode); + enable = (mode != PF09_SW_MODE_OFF); + break; +- case BRD_SM_VOLT_VDD_GPIO_1P8: ++ case BRD_SM_VOLT_SW3_VDD_1V8: + rc = PF09_SwModeGet(&g_pf09Dev, PF09_REG_SW3, PF09_STATE_VRUN, + &mode); + enable = (mode != PF09_SW_MODE_OFF); + break; +- case BRD_SM_VOLT_VDDQ_DDR: ++ case BRD_SM_VOLT_SW4_LPD5_VDDQ: + rc = PF09_SwModeGet(&g_pf09Dev, PF09_REG_SW4, PF09_STATE_VRUN, + &mode); + enable = (mode != PF09_SW_MODE_OFF); + break; +- case BRD_SM_VOLT_VDD2_DDR: ++ case BRD_SM_VOLT_SW5_LPD5_VDD2: + rc = PF09_SwModeGet(&g_pf09Dev, PF09_REG_SW5, PF09_STATE_VRUN, + &mode); + enable = (mode != PF09_SW_MODE_OFF); + break; +- case BRD_SM_VOLT_SD_CARD: ++ case BRD_SM_VOLT_LDO1_VDD_LDO1: + rc = PF09_LdoIsEnabled(&g_pf09Dev, PF09_REG_LDO1, PF09_STATE_VRUN, + &enable); + break; +- case BRD_SM_VOLT_NVCC_SD2: ++ case BRD_SM_VOLT_LDO2_VDD_SDIO2: + rc = PF09_LdoIsEnabled(&g_pf09Dev, PF09_REG_LDO2, PF09_STATE_VRUN, + &enable); + break; +@@ -359,31 +360,31 @@ int32_t BRD_SM_VoltageLevelSet(uint32_t domainId, int32_t voltageLevel) + s_levelArm = (int32_t) level; + rc = true; + break; +- case BRD_SM_VOLT_VDD_GPIO_3P3: ++ case BRD_SM_VOLT_SW1_VDD_3V3: + rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_SW1, PF09_STATE_VRUN, + level); + break; +- case BRD_SM_VOLT_VDD_ANA_0P8: ++ case BRD_SM_VOLT_SW2_VDD_ANA_0V8: + rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_SW2, PF09_STATE_VRUN, + level); + break; +- case BRD_SM_VOLT_VDD_GPIO_1P8: ++ case BRD_SM_VOLT_SW3_VDD_1V8: + rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_SW3, PF09_STATE_VRUN, + level); + break; +- case BRD_SM_VOLT_VDDQ_DDR: ++ case BRD_SM_VOLT_SW4_LPD5_VDDQ: + rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_SW4, PF09_STATE_VRUN, + level); + break; +- case BRD_SM_VOLT_VDD2_DDR: ++ case BRD_SM_VOLT_SW5_LPD5_VDD2: + rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_SW5, PF09_STATE_VRUN, + level); + break; +- case BRD_SM_VOLT_SD_CARD: ++ case BRD_SM_VOLT_LDO1_VDD_LDO1: + rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_LDO1, PF09_STATE_VRUN, + level); + break; +- case BRD_SM_VOLT_NVCC_SD2: ++ case BRD_SM_VOLT_LDO2_VDD_SDIO2: + rc = PF09_VoltageSet(&g_pf09Dev, PF09_REG_LDO2, PF09_STATE_VRUN, + level); + break; +@@ -458,31 +459,31 @@ int32_t BRD_SM_VoltageLevelGet(uint32_t domainId, int32_t *voltageLevel) + } + } + break; +- case BRD_SM_VOLT_VDD_GPIO_3P3: ++ case BRD_SM_VOLT_SW1_VDD_3V3: + rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_SW1, PF09_STATE_VRUN, + &level); + break; +- case BRD_SM_VOLT_VDD_ANA_0P8: ++ case BRD_SM_VOLT_SW2_VDD_ANA_0V8: + rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_SW2, PF09_STATE_VRUN, + &level); + break; +- case BRD_SM_VOLT_VDD_GPIO_1P8: ++ case BRD_SM_VOLT_SW3_VDD_1V8: + rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_SW3, PF09_STATE_VRUN, + &level); + break; +- case BRD_SM_VOLT_VDDQ_DDR: ++ case BRD_SM_VOLT_SW4_LPD5_VDDQ: + rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_SW4, PF09_STATE_VRUN, + &level); + break; +- case BRD_SM_VOLT_VDD2_DDR: ++ case BRD_SM_VOLT_SW5_LPD5_VDD2: + rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_SW5, PF09_STATE_VRUN, + &level); + break; +- case BRD_SM_VOLT_SD_CARD: ++ case BRD_SM_VOLT_LDO1_VDD_LDO1: + rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_LDO1, PF09_STATE_VRUN, + &level); + break; +- case BRD_SM_VOLT_NVCC_SD2: ++ case BRD_SM_VOLT_LDO2_VDD_SDIO2: + rc = PF09_VoltageGet(&g_pf09Dev, PF09_REG_LDO2, PF09_STATE_VRUN, + &level); + break; +diff --git a/boards/ccimx95dvk/sm/brd_sm_voltage.h b/boards/ccimx95dvk/sm/brd_sm_voltage.h +index 6c9e01286e7e..46ddc9d89096 100755 +--- a/boards/ccimx95dvk/sm/brd_sm_voltage.h ++++ b/boards/ccimx95dvk/sm/brd_sm_voltage.h +@@ -2,6 +2,7 @@ + ** ################################################################### + ** + ** Copyright 2023-2024 NXP ++** Copyright 2025 Digi International Inc. + ** + ** Redistribution and use in source and binary forms, with or without modification, + ** are permitted provided that the following conditions are met: +@@ -76,13 +77,13 @@ + * @name BRD_SM voltage domains + */ + /** @{ */ +-#define BRD_SM_VOLT_VDD_GPIO_3P3 (DEV_SM_NUM_VOLT + 0U) /*!< VDD GPIO 3.3v */ +-#define BRD_SM_VOLT_VDD_ANA_0P8 (DEV_SM_NUM_VOLT + 1U) /*!< VDD ANA 0.8v */ +-#define BRD_SM_VOLT_VDD_GPIO_1P8 (DEV_SM_NUM_VOLT + 2U) /*!< VDD GPIO 1.8v */ +-#define BRD_SM_VOLT_VDDQ_DDR (DEV_SM_NUM_VOLT + 3U) /*!< DDR VDDQ */ +-#define BRD_SM_VOLT_VDD2_DDR (DEV_SM_NUM_VOLT + 4U) /*!< DDR VDD2 */ +-#define BRD_SM_VOLT_SD_CARD (DEV_SM_NUM_VOLT + 5U) /*!< SD1 */ +-#define BRD_SM_VOLT_NVCC_SD2 (DEV_SM_NUM_VOLT + 6U) /*!< SD2 */ ++#define BRD_SM_VOLT_SW1_VDD_3V3 (DEV_SM_NUM_VOLT + 0U) /*!< VDD 3V3 */ ++#define BRD_SM_VOLT_SW2_VDD_ANA_0V8 (DEV_SM_NUM_VOLT + 1U) /*!< VDD ANA 0V8 */ ++#define BRD_SM_VOLT_SW3_VDD_1V8 (DEV_SM_NUM_VOLT + 2U) /*!< VDD 1V8 */ ++#define BRD_SM_VOLT_SW4_LPD5_VDDQ (DEV_SM_NUM_VOLT + 3U) /*!< DDR VDDQ */ ++#define BRD_SM_VOLT_SW5_LPD5_VDD2 (DEV_SM_NUM_VOLT + 4U) /*!< DDR VDD2 */ ++#define BRD_SM_VOLT_LDO1_VDD_LDO1 (DEV_SM_NUM_VOLT + 5U) /*!< LDO1 */ ++#define BRD_SM_VOLT_LDO2_VDD_SDIO2 (DEV_SM_NUM_VOLT + 6U) /*!< LDO2 (VDD_SDIO2) */ + /** @} */ + + /* Types */ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0010-ccimx95dvk-enable-full-access-to-certain-regulators-.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0010-ccimx95dvk-enable-full-access-to-certain-regulators-.patch new file mode 100644 index 000000000..0afda46a6 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0010-ccimx95dvk-enable-full-access-to-certain-regulators-.patch @@ -0,0 +1,47 @@ +From: Hector Palacios +Date: Thu, 9 Oct 2025 13:16:00 +0200 +Subject: [PATCH 10/11] ccimx95dvk: enable full access to certain regulators + from non-secure LVM + +The following PMIC regulators are used by the DVK: +- VDD_3V3 (SW1) +- VDD_1V8 (SW3) +- VDD_LDO1 (LDO1) +- VDD_SDIO2 (LDO2) + +Signed-off-by: Hector Palacios +--- + configs/ccimx95dvk.cfg | 4 ++++ + configs/ccimx95dvk/config_scmi.h | 4 ++++ + 2 files changed, 8 insertions(+) + +diff --git a/configs/ccimx95dvk.cfg b/configs/ccimx95dvk.cfg +index b324e0fb0e45..b7c33f8d7e9a 100755 +--- a/configs/ccimx95dvk.cfg ++++ b/configs/ccimx95dvk.cfg +@@ -532,6 +532,10 @@ AUDIO_PLL2 ALL + BRD_SM_SENSOR_TEMP_PF09 ALL + BRD_SM_SENSOR_TEMP_PF5301 SET + BRD_SM_SENSOR_TEMP_PF5302 SET ++BRD_SM_VOLT_SW1_VDD_3V3 ALL ++BRD_SM_VOLT_SW3_VDD_1V8 ALL ++BRD_SM_VOLT_LDO1_VDD_LDO1 ALL ++BRD_SM_VOLT_LDO2_VDD_SDIO2 ALL + BUTTON ALL, test + CLOCK_DISP1PIX ALL + CLOCK_DISP2PIX ALL +diff --git a/configs/ccimx95dvk/config_scmi.h b/configs/ccimx95dvk/config_scmi.h +index b23958f33138..18a4e5ef6360 100644 +--- a/configs/ccimx95dvk/config_scmi.h ++++ b/configs/ccimx95dvk/config_scmi.h +@@ -610,6 +610,10 @@ + .sensorPerms[DEV_SM_SENSOR_TEMP_A55] = SM_SCMI_PERM_ALL, \ + .sensorPerms[DEV_SM_SENSOR_TEMP_ANA] = SM_SCMI_PERM_SET, \ + .sysPerms = SM_SCMI_PERM_NOTIFY, \ ++ .voltPerms[BRD_SM_VOLT_LDO1_VDD_LDO1] = SM_SCMI_PERM_ALL, \ ++ .voltPerms[BRD_SM_VOLT_LDO2_VDD_SDIO2] = SM_SCMI_PERM_ALL, \ ++ .voltPerms[BRD_SM_VOLT_SW1_VDD_3V3] = SM_SCMI_PERM_ALL, \ ++ .voltPerms[BRD_SM_VOLT_SW3_VDD_1V8] = SM_SCMI_PERM_ALL, \ + } + + /*! Config for SCMI channel 5 */ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0011-components-pf09-reduce-LDOs-step-to-50mV.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0011-components-pf09-reduce-LDOs-step-to-50mV.patch new file mode 100644 index 000000000..0d0185fbb --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0011-components-pf09-reduce-LDOs-step-to-50mV.patch @@ -0,0 +1,37 @@ +From: Hector Palacios +Date: Mon, 13 Oct 2025 08:49:57 +0200 +Subject: [PATCH 11/11] components: pf09: reduce LDOs step to 50mV + +The voltage values that can be programmed to the LDOs are not linear. +For low voltages, the step is 50mV, but for higher voltages it is 100mV. +Setting the step as 100mV fools the Linux kernel regulator framework +which does not properly calculate the selector it must call when using +the SCMI regulator framework, resulting in -EINVAL errors. + +Signed-off-by: Hector Palacios +--- + components/pf09/fsl_pf09.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/components/pf09/fsl_pf09.c b/components/pf09/fsl_pf09.c +index 21a0b5557244..3e1887158d7d 100755 +--- a/components/pf09/fsl_pf09.c ++++ b/components/pf09/fsl_pf09.c +@@ -528,7 +528,7 @@ bool PF09_RegulatorInfoGet(uint8_t regulator, PF09_RegInfo *regInfo) + /* set min/max/step in microvolts */ + regInfo->minV = 750000U; + regInfo->maxV = 3300000U; +- regInfo->stepV = 100000U; ++ regInfo->stepV = 50000U; + } + break; + case PF09_REG_LDO2: +@@ -537,7 +537,7 @@ bool PF09_RegulatorInfoGet(uint8_t regulator, PF09_RegInfo *regInfo) + /* set min/max/step in microvolts */ + regInfo->minV = 650000U; + regInfo->maxV = 3300000U; +- regInfo->stepV = 100000U; ++ regInfo->stepV = 50000U; + } + break; + default: diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0012-ccimx95dvk-remove-access-to-VDD_3V3-and-VDD_1V8-from.patch b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0012-ccimx95dvk-remove-access-to-VDD_3V3-and-VDD_1V8-from.patch new file mode 100644 index 000000000..a7fc79342 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager/0012-ccimx95dvk-remove-access-to-VDD_3V3-and-VDD_1V8-from.patch @@ -0,0 +1,58 @@ +From: Hector Palacios +Date: Wed, 29 Oct 2025 16:54:45 +0100 +Subject: [PATCH] ccimx95dvk: remove access to VDD_3V3 and VDD_1V8 from + non-secure world +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +There doesn't seem to be a clear registered handler for reboot or shutdown +path from Linux to SM. +When a 'reboot' is requested, Linux falls back to run the global +device_shutdown() path. +The SM will turn these regulators off in their shutdown path or via a +global “disable regulators on reboot” policy. The current SM firmware +doesn't get to know if Linux has marked these regulators as "always-on". + +Powering these regulators off removes power to the SOM who is then not +able to continue the reset (it is not powered). + +By removing access to Linux, we fully rely on SM managing these regulators, +though apparently support is incomplete (for instance they are not powered +off on the poweroff path from Linux), so this may need to be revisited in +future BSP upgrades. + +Signed-off-by: Hector Palacios + +https://onedigi.atlassian.net/browse/DEL-9804 +--- + configs/ccimx95dvk.cfg | 2 -- + configs/ccimx95dvk/config_scmi.h | 2 -- + 2 files changed, 4 deletions(-) + +diff --git a/configs/ccimx95dvk.cfg b/configs/ccimx95dvk.cfg +index b7c33f8d7e9a..19d3b0ab27b4 100755 +--- a/configs/ccimx95dvk.cfg ++++ b/configs/ccimx95dvk.cfg +@@ -532,8 +532,6 @@ AUDIO_PLL2 ALL + BRD_SM_SENSOR_TEMP_PF09 ALL + BRD_SM_SENSOR_TEMP_PF5301 SET + BRD_SM_SENSOR_TEMP_PF5302 SET +-BRD_SM_VOLT_SW1_VDD_3V3 ALL +-BRD_SM_VOLT_SW3_VDD_1V8 ALL + BRD_SM_VOLT_LDO1_VDD_LDO1 ALL + BRD_SM_VOLT_LDO2_VDD_SDIO2 ALL + BUTTON ALL, test +diff --git a/configs/ccimx95dvk/config_scmi.h b/configs/ccimx95dvk/config_scmi.h +index 18a4e5ef6360..8094e9a9ef77 100644 +--- a/configs/ccimx95dvk/config_scmi.h ++++ b/configs/ccimx95dvk/config_scmi.h +@@ -612,8 +612,6 @@ + .sysPerms = SM_SCMI_PERM_NOTIFY, \ + .voltPerms[BRD_SM_VOLT_LDO1_VDD_LDO1] = SM_SCMI_PERM_ALL, \ + .voltPerms[BRD_SM_VOLT_LDO2_VDD_SDIO2] = SM_SCMI_PERM_ALL, \ +- .voltPerms[BRD_SM_VOLT_SW1_VDD_3V3] = SM_SCMI_PERM_ALL, \ +- .voltPerms[BRD_SM_VOLT_SW3_VDD_1V8] = SM_SCMI_PERM_ALL, \ + } + + /*! Config for SCMI channel 5 */ diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager_1.0.0.bbappend b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager_1.0.0.bbappend new file mode 100644 index 000000000..7cca3cd6f --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-bsp/imx-system-manager/imx-system-manager_1.0.0.bbappend @@ -0,0 +1,21 @@ +# Copyright (C) 2025, Digi International Inc. + +FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" + +SRC_URI:append:dey = " \ + file://0001-ccimx95dvk-add-new-platform-config-and-board.patch \ + file://0002-ccimx95dvk-configure-board-and-switch-debug-UART-to-.patch \ + file://0003-ccimx95dvk-disable-PCAL6408A-expander-and-move-GPIO1.patch \ + file://0004-ccimx95dvk-move-resources-from-M7-to-A55.patch \ + file://0005-ccimx95dvk-move-pads-to-non-secure-A55.patch \ + file://0006-ccimx95dvk-move-CAN1-to-be-used-by-A55.patch \ + file://0007-ccimx95dvk-remove-PCAL6408A-IO-expander-from-EVK.patch \ + file://0008-ccimx95dvk-remove-PCA2123-RTC-from-EVK.patch \ + file://0009-ccimx95-change-names-of-voltage-regulators.patch \ + file://0010-ccimx95dvk-enable-full-access-to-certain-regulators-.patch \ + file://0011-components-pf09-reduce-LDOs-step-to-50mV.patch \ + file://0012-ccimx95dvk-remove-access-to-VDD_3V3-and-VDD_1V8-from.patch \ +" + +# Disable debug monitor by default +PACKAGECONFIG ??= "m0" diff --git a/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-devtools/external-arm-toolchain/gcc-arm-none-eabi_14.2.rel1.bb b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-devtools/external-arm-toolchain/gcc-arm-none-eabi_14.2.rel1.bb new file mode 100644 index 000000000..d069ccb4e --- /dev/null +++ b/meta-digi-arm/dynamic-layers/arm-toolchain/recipes-devtools/external-arm-toolchain/gcc-arm-none-eabi_14.2.rel1.bb @@ -0,0 +1,21 @@ +# Copyright (C) 2019 Garmin Ltd. or its subsidiaries +# Released under the MIT license (see COPYING.MIT for the terms) + +require recipes-devtools/external-arm-toolchain/arm-binary-toolchain.inc + +COMPATIBLE_HOST = "(x86_64|aarch64).*-linux" + +SUMMARY = "Arm GNU Toolchain - AArch32 bare-metal target (arm-none-eabi)" +LICENSE = "GPL-3.0-with-GCC-exception & GPL-3.0-only" + +LIC_FILES_CHKSUM:aarch64 = "file://share/doc/gcc/Copying.html;md5=b58b1e79cb685387c684bf647c848b82" +LIC_FILES_CHKSUM:x86-64 = "file://share/doc/gcc/Copying.html;md5=b58b1e79cb685387c684bf647c848b82" + +SRC_URI = "https://developer.arm.com/-/media/Files/downloads/gnu/${PV}/binrel/arm-gnu-toolchain-${PV}-${HOST_ARCH}-${BINNAME}.tar.xz;name=gcc-${HOST_ARCH}" +SRC_URI[gcc-aarch64.sha256sum] = "87330bab085dd8749d4ed0ad633674b9dc48b237b61069e3b481abd364d0a684" +SRC_URI[gcc-x86_64.sha256sum] = "62a63b981fe391a9cbad7ef51b17e49aeaa3e7b0d029b36ca1e9c3b2a9b78823" + +S = "${WORKDIR}/arm-gnu-toolchain-${PV}-${HOST_ARCH}-${BINNAME}" + +UPSTREAM_CHECK_URI = "https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads" +UPSTREAM_CHECK_REGEX = "arm-gnu-toolchain-(?P\d+\.\d*\.[A-z]*\d*).*-${HOST_ARCH}-${BINNAME}\.tar\.\w+" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-ele-imx_%.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-ele-imx_%.bbappend index 78bbf712f..09a78ed71 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-ele-imx_%.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/firmware-imx/firmware-ele-imx_%.bbappend @@ -1,12 +1,9 @@ -# Copyright 2024 Digi International Inc. +# Copyright 2024,2025 Digi International Inc. FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" # Forward-port the i.MX93 A0 fw from v0.1.0 SRC_URI:append:ccimx93 = " file://mx93a0-ahab-container.img" -IMX_SRCREV_ABBREV = "7b1e150" -SRC_URI[sha256sum] = "09165fe5df75ad665df304e89d494a02c5f379624604d230e1b595cb5ae3b5b8" - UNPACK_POSTFUNC = "" UNPACK_POSTFUNC:ccimx93 = "copy_ele_a0_fw" copy_ele_a0_fw() { diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-imx8mm-Define-UART1-as-console-for-boot-stage.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-imx8mm-Define-UART1-as-console-for-boot-stage.patch index a65a1d6c4..60fd9e1b6 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-imx8mm-Define-UART1-as-console-for-boot-stage.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-imx8mm-Define-UART1-as-console-for-boot-stage.patch @@ -13,7 +13,7 @@ Signed-off-by: Gabriel Valcazar 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plat/imx/imx8m/imx8mm/platform.mk b/plat/imx/imx8m/imx8mm/platform.mk -index 41fc3507f..1de30f40f 100644 +index 41fc3507f796..1de30f40f397 100644 --- a/plat/imx/imx8m/imx8mm/platform.mk +++ b/plat/imx/imx8m/imx8mm/platform.mk @@ -172,7 +172,7 @@ $(eval $(call add_define,BL32_BASE)) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0002-imx8mm-Disable-M4-debug-console.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0002-imx8mm-Disable-M4-debug-console.patch index 015ea5826..4523fd8a7 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0002-imx8mm-Disable-M4-debug-console.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0002-imx8mm-Disable-M4-debug-console.patch @@ -14,7 +14,7 @@ Signed-off-by: Arturo Buzarra 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plat/imx/imx8m/imx8mm/imx8mm_bl31_setup.c b/plat/imx/imx8m/imx8mm/imx8mm_bl31_setup.c -index 179b6226f..388deae2b 100644 +index 179b6226f00f..388deae2b0e8 100644 --- a/plat/imx/imx8m/imx8mm/imx8mm_bl31_setup.c +++ b/plat/imx/imx8m/imx8mm/imx8mm_bl31_setup.c @@ -117,7 +117,7 @@ static const struct imx_rdc_cfg rdc[] = { diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0003-imx8mn-Define-UART1-as-console-for-boot-stage.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0003-imx8mn-Define-UART1-as-console-for-boot-stage.patch index ca6f033ae..a179bddb6 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0003-imx8mn-Define-UART1-as-console-for-boot-stage.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0003-imx8mn-Define-UART1-as-console-for-boot-stage.patch @@ -14,7 +14,7 @@ Signed-off-by: Gabriel Valcazar 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c b/plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c -index 312eb32d1..9a82be010 100644 +index 312eb32d1cb5..9a82be010e49 100644 --- a/plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c +++ b/plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c @@ -110,7 +110,7 @@ static const struct imx_rdc_cfg rdc[] = { @@ -27,7 +27,7 @@ index 312eb32d1..9a82be010 100644 /* memory region */ diff --git a/plat/imx/imx8m/imx8mn/platform.mk b/plat/imx/imx8m/imx8mn/platform.mk -index 84519426c..964ed9e5c 100644 +index 84519426c68a..964ed9e5c2d1 100644 --- a/plat/imx/imx8m/imx8mn/platform.mk +++ b/plat/imx/imx8m/imx8mn/platform.mk @@ -77,7 +77,7 @@ $(eval $(call add_define,BL32_BASE)) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0004-imx8mn-Disable-M7-debug-console.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0004-imx8mn-Disable-M7-debug-console.patch index f74e227e2..968cb1279 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0004-imx8mn-Disable-M7-debug-console.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0004-imx8mn-Disable-M7-debug-console.patch @@ -15,7 +15,7 @@ Signed-off-by: Gabriel Valcazar 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c b/plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c -index 9a82be010..7f9a0f5f4 100644 +index 9a82be010e49..7f9a0f5f4c85 100644 --- a/plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c +++ b/plat/imx/imx8m/imx8mn/imx8mn_bl31_setup.c @@ -109,7 +109,7 @@ static const struct imx_rdc_cfg rdc[] = { diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-ccimx93-use-UART6-for-the-default-console.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0006-ccimx93-use-UART6-for-the-default-console.patch similarity index 95% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-ccimx93-use-UART6-for-the-default-console.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0006-ccimx93-use-UART6-for-the-default-console.patch index bee73ebcd..bea255efb 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-ccimx93-use-UART6-for-the-default-console.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0006-ccimx93-use-UART6-for-the-default-console.patch @@ -10,7 +10,7 @@ Signed-off-by: Javier Viguera 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plat/imx/imx93/include/platform_def.h b/plat/imx/imx93/include/platform_def.h -index 2d140400d97e..cb5b6eba061c 100644 +index 82e904b2c962..ef74d847decd 100644 --- a/plat/imx/imx93/include/platform_def.h +++ b/plat/imx/imx93/include/platform_def.h @@ -53,7 +53,7 @@ diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0002-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0007-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch similarity index 100% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0002-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0007-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-ccimx91-use-UART6-for-the-default-console.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0008-ccimx91-use-UART6-for-the-default-console.patch similarity index 100% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0001-ccimx91-use-UART6-for-the-default-console.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0008-ccimx91-use-UART6-for-the-default-console.patch diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0009-ccimx95-set-DVK-console-to-LPUART6.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0009-ccimx95-set-DVK-console-to-LPUART6.patch new file mode 100644 index 000000000..cd76130e3 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0009-ccimx95-set-DVK-console-to-LPUART6.patch @@ -0,0 +1,26 @@ +From: Hector Palacios +Date: Wed, 10 Sep 2025 09:21:43 +0200 +Subject: [PATCH] ccimx95: set DVK console to LPUART6 + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Hector Palacios +Signed-off-by: Isaac Hermida +Signed-off-by: Javier Viguera +--- + plat/imx/imx95/include/platform_def.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/plat/imx/imx95/include/platform_def.h b/plat/imx/imx95/include/platform_def.h +index d2eff001f548..3f0a43e49694 100644 +--- a/plat/imx/imx95/include/platform_def.h ++++ b/plat/imx/imx95/include/platform_def.h +@@ -55,7 +55,7 @@ + #ifdef IMX_EMU + #define IMX_LPUART_BASE 0x42570000 + #else +-#define IMX_LPUART_BASE 0x44380000 ++#define IMX_LPUART_BASE 0x425A0000 /* LPUART6 */ + #endif + + #define IMX_BOOT_UART_CLK_IN_HZ 24000000 /* Select 24MHz oscillator */ diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0010-ccimx95-enable-non-secure-non-privilege-access-to-GP.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0010-ccimx95-enable-non-secure-non-privilege-access-to-GP.patch new file mode 100644 index 000000000..4559040de --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf/0010-ccimx95-enable-non-secure-non-privilege-access-to-GP.patch @@ -0,0 +1,30 @@ +From: Hector Palacios +Date: Fri, 21 Nov 2025 11:30:35 +0100 +Subject: [PATCH] ccimx95: enable non-secure, non-privilege access to GPIO1 + +GPIO1 port is reserved on NXP EVK but we want to enable +full access to the port from the non-secure world. + +Signed-off-by: Hector Palacios + +https://onedigi.atlassian.net/browse/DEL-9839 +--- + plat/imx/imx95/imx95_bl31_setup.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/plat/imx/imx95/imx95_bl31_setup.c b/plat/imx/imx95/imx95_bl31_setup.c +index 175a78a20021..fcf41a0ffa5b 100644 +--- a/plat/imx/imx95/imx95_bl31_setup.c ++++ b/plat/imx/imx95/imx95_bl31_setup.c +@@ -108,6 +108,11 @@ void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1, + void bl31_plat_arch_setup(void) + { + /* Assign all the GPIO pins to non-secure world by default */ ++ mmio_write_32(GPIO1_BASE + 0x10, 0xffffffff); ++ mmio_write_32(GPIO1_BASE + 0x14, 0x3); ++ mmio_write_32(GPIO1_BASE + 0x18, 0xffffffff); ++ mmio_write_32(GPIO1_BASE + 0x1c, 0x3); ++ + mmio_write_32(GPIO2_BASE + 0x10, 0xffffffff); + mmio_write_32(GPIO2_BASE + 0x14, 0x3); + mmio_write_32(GPIO2_BASE + 0x18, 0xffffffff); diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend index 336f4cf98..7522fda59 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-atf/imx-atf_%.bbappend @@ -2,22 +2,18 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" -SRC_URI:append:ccimx8m = " \ +SRC_URI:append:dey = " \ file://0001-imx8mm-Define-UART1-as-console-for-boot-stage.patch \ file://0002-imx8mm-Disable-M4-debug-console.patch \ file://0003-imx8mn-Define-UART1-as-console-for-boot-stage.patch \ file://0004-imx8mn-Disable-M7-debug-console.patch \ file://0005-imx8mm-set-BL32_BASE-and-map-high-DRAM-for-ccimx8mm-.patch \ + file://0006-ccimx93-use-UART6-for-the-default-console.patch \ + file://0007-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch \ + file://0008-ccimx91-use-UART6-for-the-default-console.patch \ + file://0009-ccimx95-set-DVK-console-to-LPUART6.patch \ + file://0010-ccimx95-enable-non-secure-non-privilege-access-to-GP.patch \ " -SRC_URI:append:ccimx91 = " \ - file://0001-ccimx91-use-UART6-for-the-default-console.patch \ -" -SRC_URI:append:ccimx93 = " \ - file://0001-ccimx93-use-UART6-for-the-default-console.patch \ - file://0002-imx93-bring-back-ELE-clock-workaround-for-soc-revisi.patch \ -" - -SRCREV = "1b27ee3edbb40ef9432c69ccaa744d1ac5d54c5d" BOOT_TOOLS = "imx-boot-tools" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-iMX8M-soc.mak-use-native-mkimage-from-sysroot.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-iMX8M-soc.mak-use-native-mkimage-from-sysroot.patch index a7719ea6f..f182a2f14 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-iMX8M-soc.mak-use-native-mkimage-from-sysroot.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-iMX8M-soc.mak-use-native-mkimage-from-sysroot.patch @@ -1,3 +1,4 @@ +From 3e0f78a4efeac4ea0651ac763099d780447a18b4 Mon Sep 17 00:00:00 2001 From: Oleksandr Suvorov Date: Wed, 19 Jul 2023 18:34:32 +0300 Subject: [PATCH] iMX8M: soc.mak: use native mkimage from sysroot @@ -17,13 +18,14 @@ Reinjected the original patch from Andrey Zhizhikin Upstream-Status: Inappropriate [OE-specific] Signed-off-by: Oleksandr Suvorov --- + iMX8M/soc.mak | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) -diff --git a/iMX8M/soc.mak b/iMX8M/soc.mak -index e7c762b748a1..f1b37a4f425a 100644 ---- a/iMX8M/soc.mak -+++ b/iMX8M/soc.mak +Index: git/iMX8M/soc.mak +=================================================================== +--- git.orig/iMX8M/soc.mak ++++ git/iMX8M/soc.mak @@ -160,7 +160,7 @@ u-boot.itb: $(dtb) $(supp_dtbs) ./$(PAD_IMAGE) bl31.bin ./$(PAD_IMAGE) u-boot-nodtb.bin $(dtb) $(supp_dtbs) @@ -33,7 +35,7 @@ index e7c762b748a1..f1b37a4f425a 100644 @rm -f u-boot.its $(dtb) dtb_ddr3l = valddr3l.dtb -@@ -172,7 +172,7 @@ u-boot-ddr3l.itb: $(dtb_ddr3l) $(supp_dtbs) +@@ -172,7 +172,7 @@ u-boot-ddr3l.itb: $(dtb_ddr3l) $(supp_dt ./$(PAD_IMAGE) bl31.bin ./$(PAD_IMAGE) u-boot-nodtb.bin $(dtb_ddr3l) $(supp_dtbs) DEK_BLOB_LOAD_ADDR=$(DEK_BLOB_LOAD_ADDR) TEE_LOAD_ADDR=$(TEE_LOAD_ADDR) ATF_LOAD_ADDR=$(ATF_LOAD_ADDR) ../$(SOC_DIR)/mkimage_fit_atf.sh $(dtb_ddr3l) $(supp_dtbs) > u-boot-ddr3l.its @@ -42,7 +44,7 @@ index e7c762b748a1..f1b37a4f425a 100644 @rm -f u-boot.its $(dtb_ddr3l) dtb_ddr3l_evk = evkddr3l.dtb -@@ -184,7 +184,7 @@ u-boot-ddr3l-evk.itb: $(dtb_ddr3l_evk) $(supp_dtbs) +@@ -184,7 +184,7 @@ u-boot-ddr3l-evk.itb: $(dtb_ddr3l_evk) $ ./$(PAD_IMAGE) bl31.bin ./$(PAD_IMAGE) u-boot-nodtb.bin $(dtb_ddr3l_evk) $(supp_dtbs) DEK_BLOB_LOAD_ADDR=$(DEK_BLOB_LOAD_ADDR) TEE_LOAD_ADDR=$(TEE_LOAD_ADDR) ATF_LOAD_ADDR=$(ATF_LOAD_ADDR) ../$(SOC_DIR)/mkimage_fit_atf.sh $(dtb_ddr3l_evk) $(supp_dtbs) > u-boot-ddr3l-evk.its @@ -51,7 +53,7 @@ index e7c762b748a1..f1b37a4f425a 100644 @rm -f u-boot.its $(dtb_ddr3l_evk) dtb_ddr4 = valddr4.dtb -@@ -196,7 +196,7 @@ u-boot-ddr4.itb: $(dtb_ddr4) $(supp_dtbs) +@@ -196,7 +196,7 @@ u-boot-ddr4.itb: $(dtb_ddr4) $(supp_dtbs ./$(PAD_IMAGE) bl31.bin ./$(PAD_IMAGE) u-boot-nodtb.bin $(dtb_ddr4) $(supp_dtbs) DEK_BLOB_LOAD_ADDR=$(DEK_BLOB_LOAD_ADDR) TEE_LOAD_ADDR=$(TEE_LOAD_ADDR) ATF_LOAD_ADDR=$(ATF_LOAD_ADDR) ../$(SOC_DIR)/mkimage_fit_atf.sh $(dtb_ddr4) $(supp_dtbs) > u-boot-ddr4.its @@ -60,7 +62,7 @@ index e7c762b748a1..f1b37a4f425a 100644 @rm -f u-boot.its $(dtb_ddr4) dtb_ddr4_evk = evkddr4.dtb -@@ -208,7 +208,7 @@ u-boot-ddr4-evk.itb: $(dtb_ddr4_evk) $(supp_dtbs) +@@ -208,7 +208,7 @@ u-boot-ddr4-evk.itb: $(dtb_ddr4_evk) $(s ./$(PAD_IMAGE) bl31.bin ./$(PAD_IMAGE) u-boot-nodtb.bin $(dtb_ddr4_evk) $(supp_dtbs) DEK_BLOB_LOAD_ADDR=$(DEK_BLOB_LOAD_ADDR) TEE_LOAD_ADDR=$(TEE_LOAD_ADDR) ATF_LOAD_ADDR=$(ATF_LOAD_ADDR) ../$(SOC_DIR)/mkimage_fit_atf.sh $(dtb_ddr4_evk) $(supp_dtbs) > u-boot-ddr4-evk.its diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx8m-soc.mak-capture-commands-output-into-a-log-fil.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx8m-soc.mak-capture-commands-output-into-a-log-fil.patch index c519ee55f..1f4603f97 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx8m-soc.mak-capture-commands-output-into-a-log-fil.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx8m-soc.mak-capture-commands-output-into-a-log-fil.patch @@ -13,7 +13,7 @@ Signed-off-by: Javier Viguera 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iMX8M/soc.mak b/iMX8M/soc.mak -index f1b37a4f425a..ffd70af8ac7d 100644 +index e7c762b748a1..3b0b6b603cd5 100644 --- a/iMX8M/soc.mak +++ b/iMX8M/soc.mak @@ -1,5 +1,6 @@ diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0004-imx8mm-adjust-TEE_LOAD_ADDR-for-ccimx8mm.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0004-imx8mm-adjust-TEE_LOAD_ADDR-for-ccimx8mm.patch index da4184245..d50114b26 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0004-imx8mm-adjust-TEE_LOAD_ADDR-for-ccimx8mm.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0004-imx8mm-adjust-TEE_LOAD_ADDR-for-ccimx8mm.patch @@ -12,7 +12,7 @@ Signed-off-by: Javier Viguera 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iMX8M/soc.mak b/iMX8M/soc.mak -index ffd70af8ac7d..7ab1ea099894 100644 +index 3b0b6b603cd5..aea1dbef3f85 100644 --- a/iMX8M/soc.mak +++ b/iMX8M/soc.mak @@ -35,7 +35,7 @@ PLAT = imx8mm diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx93-soc.mak-capture-commands-output-into-a-log-fil.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0005-imx93-soc.mak-capture-commands-output-into-a-log-fil.patch similarity index 100% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx93-soc.mak-capture-commands-output-into-a-log-fil.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0005-imx93-soc.mak-capture-commands-output-into-a-log-fil.patch diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx93-soc.mak-add-makefile-target-to-build-A0-revisi.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0006-imx93-soc.mak-add-makefile-target-to-build-A0-revisi.patch similarity index 100% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0002-imx93-soc.mak-add-makefile-target-to-build-A0-revisi.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0006-imx93-soc.mak-add-makefile-target-to-build-A0-revisi.patch diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx91-soc.mak-capture-commands-output-into-a-log-fil.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0007-imx91-soc.mak-capture-commands-output-into-a-log-fil.patch similarity index 93% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx91-soc.mak-capture-commands-output-into-a-log-fil.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0007-imx91-soc.mak-capture-commands-output-into-a-log-fil.patch index 95e593f58..2376e7871 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0001-imx91-soc.mak-capture-commands-output-into-a-log-fil.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0007-imx91-soc.mak-capture-commands-output-into-a-log-fil.patch @@ -13,7 +13,7 @@ Signed-off-by: Javier Viguera 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/iMX91/soc.mak b/iMX91/soc.mak -index b87a5bef79ce..3db3760c546d 100644 +index fca7fdc447b0..2b884d0b3c69 100644 --- a/iMX91/soc.mak +++ b/iMX91/soc.mak @@ -1,4 +1,5 @@ @@ -48,4 +48,4 @@ index b87a5bef79ce..3db3760c546d 100644 + ./$(MKIMG) -soc IMX9 -append $(AHAB_IMG) -c -ap $(SPL_A55_IMG) a55 $(SPL_LOAD_ADDR) -out flash.bin | tee -a $(MKIMAGE_LOG) $(call append_container,u-boot-atf-container.img,1) - flash_singleboot_no_ahabfw: $(MKIMG) $(SPL_A55_IMG) u-boot-atf-container.img + flash_singleboot_gdet: $(MKIMG) $(AHAB_IMG) $(SPL_A55_IMG) u-boot-atf-container.img diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0008-imx95-soc.mak-capture-commands-output-into-a-log-fil.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0008-imx95-soc.mak-capture-commands-output-into-a-log-fil.patch new file mode 100644 index 000000000..f95d4f6cd --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/files/0008-imx95-soc.mak-capture-commands-output-into-a-log-fil.patch @@ -0,0 +1,60 @@ +From: Javier Viguera +Date: Wed, 24 Sep 2025 18:27:36 +0200 +Subject: [PATCH] imx95: soc.mak: capture commands output into a log file + +This is later used to get the needed information for the signing of the +boot artifacts. + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Javier Viguera +--- + iMX95/soc.mak | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/iMX95/soc.mak b/iMX95/soc.mak +index a3eaa2e93b98..a7cf6c4363a3 100644 +--- a/iMX95/soc.mak ++++ b/iMX95/soc.mak +@@ -1,4 +1,5 @@ + MKIMG = ../mkimage_imx8 ++MKIMAGE_LOG = "mkimage-$(firstword $(MAKECMDGOALS)).log" + + CC ?= gcc + REV ?= A1 +@@ -182,7 +183,7 @@ define append_container + @flashbin_size=`wc -c flash.bin | awk '{print $$1}'`; \ + psize=$$((0x400 * $(2))); \ + pad_cnt=$$(((flashbin_size + psize - 1) / psize)); \ +- echo "append $(1) at $$((pad_cnt * $(2))) KB, psize=$$psize"; \ ++ echo "append $(1) at $$((pad_cnt * $(2))) KB, psize=$$psize" | tee -a $(MKIMAGE_LOG); \ + dd if=$(1) of=flash.bin bs=1K seek=$$((pad_cnt * $(2))); + endef + +@@ -271,7 +272,7 @@ u-boot-atf-container.img: bl31.bin u-boot-hash.bin + -ap bl31.bin a55 $(ATF_LOAD_ADDR) \ + -ap u-boot-hash.bin a55 $(UBOOT_LOAD_ADDR) \ + -out u-boot-atf-container.img; \ +- fi ++ fi | tee $(MKIMAGE_LOG) + + u-boot-atf-container-spinand.img: bl31.bin u-boot-hash.bin + if [ -f $(TEE) ]; then \ +@@ -335,7 +336,7 @@ flash_lpboot_flexspi_xip: $(MKIMG) $(AHAB_IMG) $(MCU_IMG) $(OEI_IMG_M33) + flash_a55: $(MKIMG) $(AHAB_IMG) $(MCU_IMG) u-boot-atf-container.img $(SPL_A55_IMG) $(OEI_IMG_M33) $(OEI_M33_DDR_IMG) + ./$(MKIMG) -soc IMX9 -cntr_version $(CTNR_VERSION) $(MMC_FAST_HASH) -append $(AHAB_IMG) -c $(OEI_OPT_M33) -msel $(MSEL) \ + -m33 $(MCU_IMG) 0 $(MCU_TCM_ADDR) \ +- -ap $(SPL_A55_IMG) a55 $(SPL_LOAD_ADDR_M33_VIEW) $(V2X_DUMMY) -out flash.bin ++ -ap $(SPL_A55_IMG) a55 $(SPL_LOAD_ADDR_M33_VIEW) $(V2X_DUMMY) -out flash.bin | tee -a $(MKIMAGE_LOG) + $(call append_container,u-boot-atf-container.img,1) + + flash_a55_no_ahabfw: $(MKIMG) $(MCU_IMG) u-boot-atf-container.img $(SPL_A55_IMG) $(OEI_IMG_M33) +@@ -386,7 +387,7 @@ flash_all: $(MKIMG) $(AHAB_IMG) $(MCU_IMG) $(M7_IMG) u-boot-atf-container.img $( + ./$(MKIMG) -soc IMX9 -cntr_version $(CTNR_VERSION) $(MMC_FAST_HASH) -append $(AHAB_IMG) -c $(OEI_OPT_M33) -msel $(MSEL) \ + -m33 $(MCU_IMG) 0 $(MCU_TCM_ADDR) \ + -m7 $(M7_IMG) 0 $(M7_TCM_ADDR) $(M7_TCM_ADDR_ALIAS) \ +- -ap $(SPL_A55_IMG) a55 $(SPL_LOAD_ADDR_M33_VIEW) $(V2X_DUMMY) -out flash.bin ++ -ap $(SPL_A55_IMG) a55 $(SPL_LOAD_ADDR_M33_VIEW) $(V2X_DUMMY) -out flash.bin | tee -a $(MKIMAGE_LOG) + $(call append_container,u-boot-atf-container.img,1) + + flash_all_ddr: $(MKIMG) $(AHAB_IMG) $(MCU_IMG) $(M7_IMG) u-boot-atf-container.img $(SPL_A55_IMG) $(OEI_IMG_M33) diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend index f73e80ea6..b132a77ce 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-boot_1.0.bbappend @@ -2,37 +2,30 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/files:" -SRC_URI:append:ccimx8m = " \ +DEPENDS += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'trustfence-sign-tools-native', '', d)}" + +SRC_URI:append:dey = " \ + file://0001-iMX8QX-soc.mak-capture-commands-output-into-a-log-fi.patch \ file://0002-imx8m-soc.mak-capture-commands-output-into-a-log-fil.patch \ file://0003-imx8m-print_fit_hab-follow-symlinks.patch \ file://0004-imx8mm-adjust-TEE_LOAD_ADDR-for-ccimx8mm.patch \ + file://0005-imx93-soc.mak-capture-commands-output-into-a-log-fil.patch \ + file://0006-imx93-soc.mak-add-makefile-target-to-build-A0-revisi.patch \ + file://0007-imx91-soc.mak-capture-commands-output-into-a-log-fil.patch \ + file://0008-imx95-soc.mak-capture-commands-output-into-a-log-fil.patch \ " -SRC_URI:append:ccimx8x = " \ - file://0001-iMX8QX-soc.mak-capture-commands-output-into-a-log-fi.patch \ -" -SRC_URI:append:ccimx91 = " \ - file://0001-imx91-soc.mak-capture-commands-output-into-a-log-fil.patch \ -" -SRC_URI:append:ccimx93 = " \ - file://0001-imx93-soc.mak-capture-commands-output-into-a-log-fil.patch \ - file://0002-imx93-soc.mak-add-makefile-target-to-build-A0-revisi.patch \ -" -SRCBRANCH = "lf-6.6.52_2.2.0" -SRCREV = "71b8c18af93a5eb972d80fbec290006066cff24f" -DEPENDS += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'trustfence-sign-tools-native', '', d)}" +IMX_CORTEXM_DEMOS = "" +IMX_CORTEXM_DEMOS:ccimx95 = "imx-m7-demos:do_deploy" -# Do not tag imx-boot -UUU_BOOTLOADER:mx8-generic-bsp = "" -UUU_BOOTLOADER:mx9-generic-bsp = "" -BOOT_STAGING:mx91-generic-bsp = "${S}/iMX91" -BOOT_STAGING:mx93-generic-bsp = "${S}/iMX93" +CORTEXM_DEFAULT_IMAGE = "" +CORTEXM_DEFAULT_IMAGE:ccimx95 = "imx95-19x19-evk_m7_TCM_power_mode_switch.bin" -# Add SOC family -SOC_FAMILY:mx91-generic-bsp = "mx91" +do_compile[depends] += "${IMX_CORTEXM_DEMOS}" -REV_OPTION:ccimx91 = "REV=A0" -REV_OPTION:ccimx93 = "REV=A1" +compile_mx95:append:ccimx95() { + cp ${DEPLOY_DIR_IMAGE}/mcore-demos/${CORTEXM_DEFAULT_IMAGE} ${BOOT_STAGING}/m7_image.bin +} # Revert compile_mx8m() to how it was in kirkstone branch of meta-freescale, # otherwise, a dead symlink is created in place of the dtb @@ -66,7 +59,7 @@ compile_mx8m() { compile_mx8m:append:ccimx8m() { # Create dummy DEK blob to support building with encrypted u-boot - if [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then dd if=/dev/zero of=${BOOT_STAGING}/dek_blob_fit_dummy.bin bs=96 count=1 oflag=sync fi } @@ -83,11 +76,6 @@ compile_mx93:append:ccimx93() { fi } -compile_mx91() { - bbnote i.MX 91 boot binary build - compile_mx93 -} - do_compile:append:ccimx8m() { bbnote "building ${IMX_BOOT_SOC_TARGET} - print_fit_hab" make SOC=${IMX_BOOT_SOC_TARGET} dtbs=${UBOOT_DTB_NAME} print_fit_hab @@ -127,10 +115,6 @@ do_install:ccimx8x () { done } -deploy_mx91() { - deploy_mx93 -} - generate_symlinks() { # imx-boot recipe in meta-freescale supports *multiple* build configurations. # We assume here only ONE build configuration for our platforms (otherwise @@ -142,6 +126,10 @@ generate_symlinks() { ln -sf imx-boot-${MACHINE}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/imx-boot } +deploy_mx95:append:ccimx95() { + install -m 0644 ${DEPLOY_DIR_IMAGE}/mcore-demos/${CORTEXM_DEFAULT_IMAGE} ${DEPLOYDIR}/${BOOT_TOOLS} +} + do_deploy:append:ccimx8m() { generate_symlinks for target in ${IMXBOOT_TARGETS}; do @@ -173,6 +161,13 @@ do_deploy:append:ccimx93() { fi } +do_deploy:append:ccimx95() { + generate_symlinks + for target in ${IMXBOOT_TARGETS}; do + install -m 0644 ${BOOT_STAGING}/mkimage-${target}.log ${DEPLOYDIR}/${BOOT_TOOLS} + done +} + do_deploy:ccimx8x () { deploy_${SOC_FAMILY} # copy tee.bin to deploy path @@ -196,16 +191,16 @@ do_deploy:ccimx8x () { done cd ${DEPLOYDIR} ln -sf ${UBOOT_PREFIX}-${MACHINE}-${rev}.bin-${IMAGE_IMXBOOT_TARGET} ${UBOOT_PREFIX}-${MACHINE}-${rev}.bin - # Link to default bootable U-Boot filename. It gets overwritten - # on every loop so the only last RAM_CONFIG will survive. - ln -sf ${UBOOT_PREFIX}-${MACHINE}-${rev}.bin-${IMAGE_IMXBOOT_TARGET} ${BOOTABLE_FILENAME} cd - done + + # Generate an imx-boot symlink to the last SOC_REVISION. This is required for WIC images + ln -sf ${UBOOT_PREFIX}-${MACHINE}-${rev}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/imx-boot } do_deploy[postfuncs] += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'trustfence_sign_imxboot', '', d)}" trustfence_sign_imxboot() { - TF_SIGN_ENV="CONFIG_SIGN_KEYS_PATH=${TRUSTFENCE_SIGN_KEYS_PATH}" + TF_SIGN_ENV="CONFIG_SIGN_KEYS_PATH=${TRUSTFENCE_KEYS_PATH}" TF_SIGN_ENV="$TF_SIGN_ENV CONFIG_FIT_HAB_LOG_PATH=${DEPLOYDIR}/${BOOT_TOOLS}/mkimage-print_fit_hab.log" [ -n "${TRUSTFENCE_KEY_INDEX}" ] && TF_SIGN_ENV="$TF_SIGN_ENV CONFIG_KEY_INDEX=${TRUSTFENCE_KEY_INDEX}" [ -n "${TRUSTFENCE_SIGN_MODE}" ] && TF_SIGN_ENV="$TF_SIGN_ENV CONFIG_SIGN_MODE=${TRUSTFENCE_SIGN_MODE}" @@ -221,21 +216,21 @@ trustfence_sign_imxboot() { fi TF_SIGN_ENV="$TF_SIGN_ENV CONFIG_MKIMAGE_LOG_PATH=${DEPLOYDIR}/${BOOT_TOOLS}/mkimage-${target}.log" env $TF_SIGN_ENV trustfence-sign-uboot.sh imx-boot-${MACHINE}.bin-${target} imx-boot-signed-${MACHINE}.bin-${target} - if [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then - TF_ENC_ENV="CONFIG_DEK_PATH=${TRUSTFENCE_DEK_PATH} ENABLE_ENCRYPTION=y" + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then + TF_ENC_ENV="CONFIG_DEK_PATH=${TRUSTFENCE_KEYS_PATH}/${TRUSTFENCE_DEK_ENCRYPT_KEYNAME} ENABLE_ENCRYPTION=y" env $TF_SIGN_ENV $TF_ENC_ENV trustfence-sign-uboot.sh imx-boot-${MACHINE}.bin-${target} imx-boot-encrypted-${MACHINE}.bin-${target} fi done # Generate symlinks for trustfence artifacts. ln -sf imx-boot-signed-${MACHINE}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/imx-boot-signed-${MACHINE}.bin - if [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then ln -sf imx-boot-encrypted-${MACHINE}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/imx-boot-encrypted-${MACHINE}.bin fi } trustfence_sign_imxboot:ccimx8x() { - TF_SIGN_ENV="CONFIG_SIGN_KEYS_PATH=${TRUSTFENCE_SIGN_KEYS_PATH}" + TF_SIGN_ENV="CONFIG_SIGN_KEYS_PATH=${TRUSTFENCE_KEYS_PATH}" [ -n "${TRUSTFENCE_KEY_INDEX}" ] && TF_SIGN_ENV="$TF_SIGN_ENV CONFIG_KEY_INDEX=${TRUSTFENCE_KEY_INDEX}" [ -n "${TRUSTFENCE_SIGN_MODE}" ] && TF_SIGN_ENV="$TF_SIGN_ENV CONFIG_SIGN_MODE=${TRUSTFENCE_SIGN_MODE}" [ -n "${TRUSTFENCE_SRK_REVOKE_MASK}" ] && TF_SIGN_ENV="$TF_SIGN_ENV SRK_REVOKE_MASK=${TRUSTFENCE_SRK_REVOKE_MASK}" @@ -250,8 +245,8 @@ trustfence_sign_imxboot:ccimx8x() { for rev in ${SOC_REVISIONS}; do TF_SIGN_ENV="$TF_SIGN_ENV CONFIG_MKIMAGE_LOG_PATH=${DEPLOYDIR}/${BOOT_TOOLS}/mkimage-${rev}-${target}.log" env $TF_SIGN_ENV trustfence-sign-uboot.sh imx-boot-${MACHINE}-${rev}.bin-${target} imx-boot-signed-${MACHINE}-${rev}.bin-${target} - if [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then - TF_ENC_ENV="CONFIG_DEK_PATH=${TRUSTFENCE_DEK_PATH} ENABLE_ENCRYPTION=y" + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then + TF_ENC_ENV="CONFIG_DEK_PATH=${TRUSTFENCE_KEYS_PATH}/${TRUSTFENCE_DEK_ENCRYPT_KEYNAME} ENABLE_ENCRYPTION=y" env $TF_SIGN_ENV $TF_ENC_ENV trustfence-sign-uboot.sh imx-boot-${MACHINE}-${rev}.bin-${target} imx-boot-encrypted-${MACHINE}-${rev}.bin-${target} fi done @@ -260,11 +255,11 @@ trustfence_sign_imxboot:ccimx8x() { # Generate symlinks for trustfence artifacts. for rev in ${SOC_REVISIONS}; do ln -sf ${UBOOT_PREFIX}-signed-${MACHINE}-${rev}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/${UBOOT_PREFIX}-signed-${MACHINE}-${rev}.bin - if [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then ln -sf ${UBOOT_PREFIX}-encrypted-${MACHINE}-${rev}.bin-${IMAGE_IMXBOOT_TARGET} ${DEPLOYDIR}/${UBOOT_PREFIX}-encrypted-${MACHINE}-${rev}.bin fi done } trustfence_sign_imxboot[dirs] = "${DEPLOYDIR}" -trustfence_sign_imxboot[vardeps] += "TRUSTFENCE_SIGN_KEYS_PATH TRUSTFENCE_KEY_INDEX TRUSTFENCE_DEK_PATH TRUSTFENCE_SIGN_MODE TRUSTFENCE_SRK_REVOKE_MASK TRUSTFENCE_UNLOCK_KEY_REVOCATION" +trustfence_sign_imxboot[vardeps] += "TRUSTFENCE_KEYS_PATH TRUSTFENCE_KEY_INDEX TRUSTFENCE_ENCRYPT TRUSTFENCE_SIGN_MODE TRUSTFENCE_SRK_REVOKE_MASK TRUSTFENCE_UNLOCK_KEY_REVOCATION" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.inc b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.inc index 90081835e..558c06d29 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.inc +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-mkimage/imx-mkimage_git.inc @@ -1,12 +1,14 @@ # Copyright 2017-2023 NXP +# Keep the depends "not-native" so they get properly transformed +# for native/nativesdk packages DEPENDS = "zlib openssl" SRC_URI = "git://github.com/nxp-imx/imx-mkimage.git;protocol=https;branch=${SRCBRANCH} \ file://0001-iMX8M-soc.mak-use-native-mkimage-from-sysroot.patch \ " -SRCBRANCH = "lf-6.6.52_2.2.0" -SRCREV = "71b8c18af93a5eb972d80fbec290006066cff24f" +SRCBRANCH = "lf-6.6.52_2.2.1" +SRCREV = "81fca6434be0610f3f9216a762aadc4dc3e8d8db" S = "${WORKDIR}/git" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-seco/imx-seco_5.9.4.1.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-seco/imx-seco_5.9.4.1.bb index 916854e94..3126e4729 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-seco/imx-seco_5.9.4.1.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-seco/imx-seco_5.9.4.1.bb @@ -7,7 +7,6 @@ require recipes-bsp/imx-seco/imx-seco_5.9.4.bb LIC_FILES_CHKSUM = "file://COPYING;md5=ca53281cc0caa7e320d4945a896fb837" -SRC_URI[md5sum] = "2a8fcdd322713bc127398ee66bf9b50a" SRC_URI[sha256sum] = "bd8dc01966076836aabff53f2463295294166595006e1db430db21b6ffa6b667" IMX_SRCREV_ABBREV = "0333596" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-secure-enclave/imx-secure-enclave-seco_git.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-secure-enclave/imx-secure-enclave-seco_git.bb index bab785365..867d7d55e 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-secure-enclave/imx-secure-enclave-seco_git.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-secure-enclave/imx-secure-enclave-seco_git.bb @@ -5,7 +5,9 @@ DESCRIPTION += "SECO" PLAT = "seco" -do_install:append() { +EXTRA_OEMAKE:append:mx8x-nxp-bsp = " COMPATIBLE_MACHINE=mx8dxl-nxp-bsp" + +do_install:append:mx95-nxp-bsp() { # Remove common content that is to be installed by imx-secure-enclave for i in common hsm nvm.h; do rm -rf ${D}${includedir}/$i @@ -14,4 +16,4 @@ do_install:append() { rm ${D}${bindir}/nvmd_conf_setup.sh } -COMPATIBLE_MACHINE = "(mx95-nxp-bsp)" +COMPATIBLE_MACHINE = "(mx8x-nxp-bsp|mx95-nxp-bsp)" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-secure-enclave/imx-secure-enclave.inc b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-secure-enclave/imx-secure-enclave.inc index 42c02da62..01cc21ac6 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-secure-enclave/imx-secure-enclave.inc +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-bsp/imx-secure-enclave/imx-secure-enclave.inc @@ -1,4 +1,4 @@ -# Copyright 2021-2024 NXP +# Copyright 2021-2025 NXP SUMMARY = "NXP i.MX SECURE ENCLAVE library" DESCRIPTION = "NXP IMX SECURE ENCLAVE library" @@ -10,8 +10,11 @@ DEPENDS = " mbedtls openssl" SRC_URI = "${SECURE_ENCLAVE_LIB_SRC};branch=${SRCBRANCH}" SECURE_ENCLAVE_LIB_SRC ?= "git://github.com/NXP/imx-secure-enclave.git;protocol=https" -SRCBRANCH = "lf-6.6.52_2.2.0" -SRCREV = "dffbb844e86f4a49058ffbb40548474059969c27" +SRCBRANCH = "lf-6.6.52_2.2.1" +SRCREV = "4f0340fb4cf6b16a64c7d65281b4880c5d1cd453" + +# Set package version to the release, so it overrides the recipe in meta-freescale +PV = "lf-6.6.52_2.2.1" S = "${WORKDIR}/git" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_12.0.5.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_12.0.5.imx.bb new file mode 100644 index 000000000..b35897613 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_12.0.5.imx.bb @@ -0,0 +1,15 @@ +# Copyright (C) 2025, Digi International Inc. + +# +# Reuse meta-freescale's weston_12.0.4.imx.bb +# +require recipes-graphics/wayland/weston_12.0.4.imx.bb + +# +# We need to get the rest of SRC_URI artifacts from meta-freescale, so +# "abuse" COREBASE to get the path to "meta-freescale" +# +FILESEXTRAPATHS:prepend := "${COREBASE}/../meta-freescale/recipes-graphics/wayland/weston:" + +SRCBRANCH = "weston-imx-12.0.5" +SRCREV = "fce3595b96eab0b2b432ceae070a65db7d16d866" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/0001-mxm_wifiex-do-not-process-countryIE-internally.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/0001-mxm_wifiex-do-not-process-countryIE-internally.patch new file mode 100644 index 000000000..c248dfcd5 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/0001-mxm_wifiex-do-not-process-countryIE-internally.patch @@ -0,0 +1,47 @@ +From: Gonzalo Ruiz +Date: Fri, 25 Jul 2025 09:44:32 +0200 +Subject: [PATCH 1/1] mxm_wifiex: do not process countryIE internally + +Driver does not support processing countryIE, however when argument +'country_ie_ignore=0' was set, driver could receive and store the +country code but not apply the country power table. + +If a regulatory change was issued afterwards by the user (i.e. iw reg +set) for the same country, change request was ignored and the power +table was still not applied. + +Correct that by ignoring the countryIE when there is a self-managed +wiphy registered. + +Patch provided by NXP. + +Signed-off-by: Gonzalo Ruiz +--- + mlinux/moal_sta_cfg80211.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/mlinux/moal_sta_cfg80211.c b/mlinux/moal_sta_cfg80211.c +index f30134c..32822ac 100644 +--- a/mlinux/moal_sta_cfg80211.c ++++ b/mlinux/moal_sta_cfg80211.c +@@ -1847,6 +1847,20 @@ static int woal_process_country_ie(moal_private *priv, struct cfg80211_bss *bss) + mlan_status status = MLAN_STATUS_SUCCESS; + + ENTER(); ++ ++ if (!priv) { ++ PRINTM(MERROR, "%s(): priv is NULL!\n", __func__); ++ LEAVE(); ++ return 0; ++ } ++#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 0, 0) ++ if (priv->wdev && priv->wdev->wiphy && ++ (priv->wdev->wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)) { ++ LEAVE(); ++ return 0; ++ } ++#endif ++ + rcu_read_lock(); + country_ie = (u8 *)ieee80211_bss_get_ie(bss, WLAN_EID_COUNTRY); + if (!country_ie) { diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/watch-regdomain.service b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/watch-regdomain.service new file mode 100644 index 000000000..91916656c --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/watch-regdomain.service @@ -0,0 +1,7 @@ +[Unit] +Description=Monitor for global regulatory domain changes +After=network.target + +[Service] +Type=oneshot +ExecStart=/usr/sbin/watch_regdomain.sh diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/watch-regdomain.timer b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/watch-regdomain.timer new file mode 100644 index 000000000..0d67a6f3f --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/watch-regdomain.timer @@ -0,0 +1,11 @@ +[Unit] +Description=Check regdomain every 5 seconds + +[Timer] +OnBootSec=5sec +OnUnitInactiveSec=5sec +AccuracySec=1s +Unit=watch-regdomain.service + +[Install] +WantedBy=timers.target diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/watch_regdomain.sh b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/watch_regdomain.sh new file mode 100755 index 000000000..2724dec29 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan/watch_regdomain.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +REGDOMAIN_FILE="/var/run/regdomain" + +previous=$(cat "${REGDOMAIN_FILE}" 2>/dev/null) + +# Extract the 'global' regulatory domain +current=$(iw reg get | grep -m1 '^country' | cut -d' ' -f2 | tr -d ':') + +if [ -n "${current}" ] && [ "${current}" != "${previous}" ]; then + echo "Global regulatory domain changed to '${current}'" + echo "${current}" > "${REGDOMAIN_FILE}" + iw reg set ${current} +fi diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan_git.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan_git.bbappend index 4c5b73ed1..33b3b80c9 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan_git.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-kernel/kernel-modules/kernel-module-nxp-wlan_git.bbappend @@ -5,6 +5,10 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" SRC_URI:append = " \ file://81-iw612-wifi.rules \ file://load_iw612.sh \ + file://watch_regdomain.sh \ + file://watch-regdomain.service \ + file://watch-regdomain.timer \ + file://0001-mxm_wifiex-do-not-process-countryIE-internally.patch \ " do_install:append () { @@ -12,11 +16,23 @@ do_install:append () { install -m 0644 ${WORKDIR}/81-iw612-wifi.rules ${D}${sysconfdir}/udev/rules.d/ install -d ${D}${sysconfdir}/udev/scripts install -m 0777 ${WORKDIR}/load_iw612.sh ${D}${sysconfdir}/udev/scripts/ + + if ${@bb.utils.contains('DISTRO_FEATURES','systemd','true','false',d)}; then + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${WORKDIR}/watch-regdomain.service ${D}${systemd_system_unitdir}/watch-regdomain.service + install -m 0644 ${WORKDIR}/watch-regdomain.timer ${D}${systemd_system_unitdir}/watch-regdomain.timer + fi + + install -d ${D}${sbindir} + install -m 0755 ${WORKDIR}/watch_regdomain.sh ${D}${sbindir}/ } FILES:${PN}:append = " \ ${sysconfdir}/udev/rules.d \ ${sysconfdir}/udev/scripts \ + ${sbindir}/watch_regdomain.sh \ + ${systemd_system_unitdir}/watch-regdomain.service \ + ${systemd_system_unitdir}/watch-regdomain.timer \ " RDEPENDS:${PN}:append = " firmware-murata-nxp" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client/tee-supplicant.service b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client/tee-supplicant.service deleted file mode 100644 index c273832d7..000000000 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client/tee-supplicant.service +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=TEE Supplicant - -[Service] -User=root -EnvironmentFile=-@sysconfdir@/default/tee-supplicant -ExecStart=@sbindir@/tee-supplicant $OPTARGS - -[Install] -WantedBy=basic.target diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.4.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.4.0.imx.bb deleted file mode 100644 index 3227e8633..000000000 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.4.0.imx.bb +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (C) 2025, Digi International Inc. - -# -# Reuse meta-freescale's optee-client_4.2.0.imx.bb -# -require recipes-security/optee-imx/optee-client_4.2.0.imx.bb - -SRCBRANCH = "lf-6.6.52_2.2.0" -SRCREV = "d221676a58b305bddbf97db00395205b3038de8e" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.4.0.imx.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.4.0.imx.bbappend index 683fe915b..f7176e46b 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.4.0.imx.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-client_4.4.0.imx.bbappend @@ -1,19 +1,12 @@ # Copyright (C) 2024, 2025, Digi International Inc. + FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" SRC_URI += "${@oe.utils.vartrue('TRUSTFENCE_FILE_BASED_ENCRYPT', 'file://tee-supplicant', '', d)}" -EXTRA_OEMAKE += "PKG_CONFIG=pkg-config CFG_TEE_FS_PARENT_PATH='${localstatedir}/lib/tee'" - -do_install() { - oe_runmake DESTDIR=${D} install - install -D -p -m0644 ${WORKDIR}/tee-supplicant.service ${D}${systemd_system_unitdir}/tee-supplicant.service - sed -i -e s:@sysconfdir@:${sysconfdir}:g \ - -e s:@sbindir@:${sbindir}:g \ - ${D}${systemd_system_unitdir}/tee-supplicant.service - - if ${@oe.utils.vartrue('TRUSTFENCE_FILE_BASED_ENCRYPT', 'true', 'false',d)}; then - install -d ${D}${sysconfdir}/default/ - install -m 0644 ${WORKDIR}/tee-supplicant ${D}${sysconfdir}/default/tee-supplicant - fi +do_install:append(){ + if ${@oe.utils.vartrue('TRUSTFENCE_FILE_BASED_ENCRYPT', 'true', 'false',d)}; then + install -d ${D}${sysconfdir}/default/ + install -m 0644 ${WORKDIR}/tee-supplicant ${D}${sysconfdir}/default/tee-supplicant + fi } diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-Define-section-attributes-for-clang.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-Define-section-attributes-for-clang.patch deleted file mode 100644 index 54fbe5419..000000000 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-Define-section-attributes-for-clang.patch +++ /dev/null @@ -1,245 +0,0 @@ -From ef83625c9a5f50610e25aa860c4b9c5e64723a66 Mon Sep 17 00:00:00 2001 -From: Emekcan Aras -Date: Wed, 21 Dec 2022 10:55:58 +0000 -Subject: [PATCH 1/4] core: Define section attributes for clang - -Clang's attribute section is not same as gcc, here we need to add flags -to sections so they can be eventually collected by linker into final -output segments. Only way to do so with clang is to use - -pragma clang section ... - -The behavious is described here [1], this allows us to define names bss -sections. This was not an issue until clang-15 where LLD linker starts -to detect the section flags before merging them and throws the following -errors - -| ld.lld: error: section type mismatch for .nozi.kdata_page -| >>> /mnt/b/yoe/master/build/tmp/work/qemuarm64-yoe-linux/optee-os-tadevkit/3.17.0-r0/build/core/arch/arm/kernel/thread.o:(.nozi.kdata_page): SHT_PROGBITS -| >>> output section .nozi: SHT_NOBITS -| -| ld.lld: error: section type mismatch for .nozi.mmu.l2 -| >>> /mnt/b/yoe/master/build/tmp/work/qemuarm64-yoe-linux/optee-os-tadevkit/3.17.0-r0/build/core/arch/arm/mm/core_mmu_lpae.o:(.nozi.mmu.l2): SHT_PROGBITS -| >>> output section .nozi: SHT_NOBITS - -These sections should be carrying SHT_NOBITS but so far it was not -possible to do so, this patch tries to use clangs pragma to get this -going and match the functionality with gcc. - -[1] https://intel.github.io/llvm-docs/clang/LanguageExtensions.html#specifying-section-names-for-global-objects-pragma-clang-section - -Upstream-Status: Pending -Signed-off-by: Khem Raj -Signed-off-by: Oleksandr Suvorov ---- - - core/arch/arm/kernel/thread.c | 19 +++++++++++++++-- - core/arch/arm/mm/core_mmu_lpae.c | 35 +++++++++++++++++++++++++++---- - core/arch/arm/mm/core_mmu_v7.c | 36 +++++++++++++++++++++++++++++--- - core/kernel/thread.c | 13 +++++++++++- - core/mm/pgt_cache.c | 12 ++++++++++- - 5 files changed, 104 insertions(+), 11 deletions(-) - -diff --git a/core/arch/arm/kernel/thread.c b/core/arch/arm/kernel/thread.c -index 66833b3a0..b3eb9cf9a 100644 ---- a/core/arch/arm/kernel/thread.c -+++ b/core/arch/arm/kernel/thread.c -@@ -45,15 +45,30 @@ static size_t thread_user_kcode_size __nex_bss; - #if defined(CFG_CORE_UNMAP_CORE_AT_EL0) && \ - defined(CFG_CORE_WORKAROUND_SPECTRE_BP_SEC) && defined(ARM64) - long thread_user_kdata_sp_offset __nex_bss; -+#ifdef __clang__ -+#ifndef CFG_VIRTUALIZATION -+#pragma clang section bss=".nozi.kdata_page" -+#else -+#pragma clang section bss=".nex_nozi.kdata_page" -+#endif -+#endif - static uint8_t thread_user_kdata_page[ - ROUNDUP(sizeof(struct thread_core_local) * CFG_TEE_CORE_NB_CORE, - SMALL_PAGE_SIZE)] - __aligned(SMALL_PAGE_SIZE) -+#ifndef __clang__ - #ifndef CFG_NS_VIRTUALIZATION -- __section(".nozi.kdata_page"); -+ __section(".nozi.kdata_page") - #else -- __section(".nex_nozi.kdata_page"); -+ __section(".nex_nozi.kdata_page") - #endif -+#endif -+ ; -+#endif -+ -+/* reset BSS section to default ( .bss ) */ -+#ifdef __clang__ -+#pragma clang section bss="" - #endif - - #ifdef ARM32 -diff --git a/core/arch/arm/mm/core_mmu_lpae.c b/core/arch/arm/mm/core_mmu_lpae.c -index 4c8b85e39..1885e1d3f 100644 ---- a/core/arch/arm/mm/core_mmu_lpae.c -+++ b/core/arch/arm/mm/core_mmu_lpae.c -@@ -234,19 +234,46 @@ typedef uint16_t l1_idx_t; - typedef uint64_t base_xlat_tbls_t[CFG_TEE_CORE_NB_CORE][NUM_BASE_LEVEL_ENTRIES]; - typedef uint64_t xlat_tbl_t[XLAT_TABLE_ENTRIES]; - -+#ifdef __clang__ -+#pragma clang section bss=".nozi.mmu.base_table" -+#endif - static base_xlat_tbls_t base_xlation_table[NUM_BASE_TABLES] - __aligned(NUM_BASE_LEVEL_ENTRIES * XLAT_ENTRY_SIZE) -- __section(".nozi.mmu.base_table"); -+#ifndef __clang__ -+ __section(".nozi.mmu.base_table") -+#endif -+; -+#ifdef __clang__ -+#pragma clang section bss="" -+#endif - -+#ifdef __clang__ -+#pragma clang section bss=".nozi.mmu.l2" -+#endif - static xlat_tbl_t xlat_tables[MAX_XLAT_TABLES] -- __aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2"); -+ __aligned(XLAT_TABLE_SIZE) -+#ifndef __clang__ -+ __section(".nozi.mmu.l2") -+#endif -+; -+#ifdef __clang__ -+#pragma clang section bss="" -+#endif - - #define XLAT_TABLES_SIZE (sizeof(xlat_tbl_t) * MAX_XLAT_TABLES) - -+#ifdef __clang__ -+#pragma clang section bss=".nozi.mmu.l2" -+#endif - /* MMU L2 table for TAs, one for each thread */ - static xlat_tbl_t xlat_tables_ul1[CFG_NUM_THREADS] -- __aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2"); -- -+#ifndef __clang__ -+ __aligned(XLAT_TABLE_SIZE) __section(".nozi.mmu.l2") -+#endif -+; -+#ifdef __clang__ -+#pragma clang section bss="" -+#endif - /* - * TAs page table entry inside a level 1 page table. - * -diff --git a/core/arch/arm/mm/core_mmu_v7.c b/core/arch/arm/mm/core_mmu_v7.c -index 61e703da8..1960c08ca 100644 ---- a/core/arch/arm/mm/core_mmu_v7.c -+++ b/core/arch/arm/mm/core_mmu_v7.c -@@ -204,16 +204,46 @@ typedef uint32_t l1_xlat_tbl_t[NUM_L1_ENTRIES]; - typedef uint32_t l2_xlat_tbl_t[NUM_L2_ENTRIES]; - typedef uint32_t ul1_xlat_tbl_t[NUM_UL1_ENTRIES]; - -+#ifdef __clang__ -+#pragma clang section bss=".nozi.mmu.l1" -+#endif - static l1_xlat_tbl_t main_mmu_l1_ttb -- __aligned(L1_ALIGNMENT) __section(".nozi.mmu.l1"); -+ __aligned(L1_ALIGNMENT) -+#ifndef __clang__ -+ __section(".nozi.mmu.l1") -+#endif -+; -+#ifdef __clang__ -+#pragma clang section bss="" -+#endif - - /* L2 MMU tables */ -+#ifdef __clang__ -+#pragma clang section bss=".nozi.mmu.l2" -+#endif - static l2_xlat_tbl_t main_mmu_l2_ttb[MAX_XLAT_TABLES] -- __aligned(L2_ALIGNMENT) __section(".nozi.mmu.l2"); -+ __aligned(L2_ALIGNMENT) -+#ifndef __clang__ -+ __section(".nozi.mmu.l2") -+#endif -+; -+#ifdef __clang__ -+#pragma clang section bss="" -+#endif - - /* MMU L1 table for TAs, one for each thread */ -+#ifdef __clang__ -+#pragma clang section bss=".nozi.mmu.ul1" -+#endif - static ul1_xlat_tbl_t main_mmu_ul1_ttb[CFG_NUM_THREADS] -- __aligned(UL1_ALIGNMENT) __section(".nozi.mmu.ul1"); -+ __aligned(UL1_ALIGNMENT) -+#ifndef __clang__ -+ __section(".nozi.mmu.ul1") -+#endif -+; -+#ifdef __clang__ -+#pragma clang section bss="" -+#endif - - struct mmu_partition { - l1_xlat_tbl_t *l1_table; -diff --git a/core/kernel/thread.c b/core/kernel/thread.c -index 2a1f22dce..5516b6771 100644 ---- a/core/kernel/thread.c -+++ b/core/kernel/thread.c -@@ -39,13 +39,24 @@ static uint32_t end_canary_value = 0xababab00; - name[stack_num][sizeof(name[stack_num]) / sizeof(uint32_t) - 1] - #endif - -+#define DO_PRAGMA(x) _Pragma (#x) -+ -+#ifdef __clang__ -+#define DECLARE_STACK(name, num_stacks, stack_size, linkage) \ -+DO_PRAGMA (clang section bss=".nozi_stack." #name) \ -+linkage uint32_t name[num_stacks] \ -+ [ROUNDUP(stack_size + STACK_CANARY_SIZE + STACK_CHECK_EXTRA, \ -+ STACK_ALIGNMENT) / sizeof(uint32_t)] \ -+ __attribute__((aligned(STACK_ALIGNMENT))); \ -+DO_PRAGMA(clang section bss="") -+#else - #define DECLARE_STACK(name, num_stacks, stack_size, linkage) \ - linkage uint32_t name[num_stacks] \ - [ROUNDUP(stack_size + STACK_CANARY_SIZE + STACK_CHECK_EXTRA, \ - STACK_ALIGNMENT) / sizeof(uint32_t)] \ - __attribute__((section(".nozi_stack." # name), \ - aligned(STACK_ALIGNMENT))) -- -+#endif - #define GET_STACK(stack) ((vaddr_t)(stack) + STACK_SIZE(stack)) - - DECLARE_STACK(stack_tmp, CFG_TEE_CORE_NB_CORE, STACK_TMP_SIZE, -diff --git a/core/mm/pgt_cache.c b/core/mm/pgt_cache.c -index 79553c6d2..b9efdf427 100644 ---- a/core/mm/pgt_cache.c -+++ b/core/mm/pgt_cache.c -@@ -410,8 +410,18 @@ void pgt_init(void) - * has a large alignment, while .bss has a small alignment. The current - * link script is optimized for small alignment in .bss - */ -+#ifdef __clang__ -+#pragma clang section bss=".nozi.mmu.l2" -+#endif - static uint8_t pgt_tables[PGT_CACHE_SIZE][PGT_SIZE] -- __aligned(PGT_SIZE) __section(".nozi.pgt_cache"); -+ __aligned(PGT_SIZE) -+#ifndef __clang__ -+ __section(".nozi.pgt_cache") -+#endif -+ ; -+#ifdef __clang__ -+#pragma clang section bss="" -+#endif - size_t n; - - for (n = 0; n < ARRAY_SIZE(pgt_tables); n++) { --- -2.43.2 - diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx91-dvk.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0002-core-imx-support-ccimx91-dvk.patch similarity index 91% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx91-dvk.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0002-core-imx-support-ccimx91-dvk.patch index c19a7d443..965e69660 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx91-dvk.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0002-core-imx-support-ccimx91-dvk.patch @@ -11,10 +11,10 @@ Signed-off-by: Javier Viguera 2 files changed, 7 insertions(+) diff --git a/core/arch/arm/plat-imx/conf.mk b/core/arch/arm/plat-imx/conf.mk -index 33647835f2fb..ca0a718ba6e5 100644 +index 62cc51b61063..c65e383edf38 100644 --- a/core/arch/arm/plat-imx/conf.mk +++ b/core/arch/arm/plat-imx/conf.mk -@@ -95,6 +95,7 @@ mx95-flavorlist = \ +@@ -96,6 +96,7 @@ mx95-flavorlist = \ mx95evk \ mx91-flavorlist = \ @@ -22,7 +22,7 @@ index 33647835f2fb..ca0a718ba6e5 100644 mx91evk \ ifneq (,$(filter $(PLATFORM_FLAVOR),$(mx6ul-flavorlist))) -@@ -493,6 +494,11 @@ CFG_DDR_SIZE ?= 0x80000000 +@@ -504,6 +505,11 @@ CFG_DDR_SIZE ?= 0x80000000 CFG_UART_BASE ?= UART1_BASE endif diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0002-optee-enable-clang-support.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0002-optee-enable-clang-support.patch deleted file mode 100644 index dbc53542e..000000000 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0002-optee-enable-clang-support.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 2ba573c9763329fbfdfacc8393d565ab747cac4d Mon Sep 17 00:00:00 2001 -From: Brett Warren -Date: Wed, 23 Sep 2020 09:27:34 +0100 -Subject: [PATCH 2/4] optee: enable clang support - -When compiling with clang, the LIBGCC_LOCATE_CFLAG variable used -to provide a sysroot wasn't included, which results in not locating -compiler-rt. This is mitigated by including the variable as ammended. - -Upstream-Status: Pending -ChangeId: 8ba69a4b2eb8ebaa047cb266c9aa6c2c3da45701 -Signed-off-by: Brett Warren -Signed-off-by: Oleksandr Suvorov ---- - - mk/clang.mk | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/mk/clang.mk b/mk/clang.mk -index a045beee8..1ebe2f702 100644 ---- a/mk/clang.mk -+++ b/mk/clang.mk -@@ -30,7 +30,7 @@ comp-cflags-warns-clang := -Wno-language-extension-token \ - - # Note, use the compiler runtime library (libclang_rt.builtins.*.a) instead of - # libgcc for clang --libgcc$(sm) := $(shell $(CC$(sm)) $(CFLAGS$(arch-bits-$(sm))) \ -+libgcc$(sm) := $(shell $(CC$(sm)) $(LIBGCC_LOCATE_CFLAGS) $(CFLAGS$(arch-bits-$(sm))) \ - -rtlib=compiler-rt -print-libgcc-file-name 2> /dev/null) - - # Core ASLR relies on the executable being ready to run from its preferred load --- -2.43.2 - diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0003-arm32-libutils-libutee-ta-add-.note.GNU-stack-sectio.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0003-arm32-libutils-libutee-ta-add-.note.GNU-stack-sectio.patch deleted file mode 100644 index 1c5753c7f..000000000 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0003-arm32-libutils-libutee-ta-add-.note.GNU-stack-sectio.patch +++ /dev/null @@ -1,133 +0,0 @@ -From 6f738803a59613ec4a683ddbc1747ebffd75a4e6 Mon Sep 17 00:00:00 2001 -From: Jerome Forissier -Date: Tue, 23 Aug 2022 12:31:46 +0000 -Subject: [PATCH 3/4] arm32: libutils, libutee, ta: add .note.GNU-stack section - to - - .S files - -When building for arm32 with GNU binutils 2.39, the linker outputs -warnings when linking Trusted Applications: - - arm-unknown-linux-uclibcgnueabihf-ld.bfd: warning: utee_syscalls_a32.o: missing .note.GNU-stack section implies executable stack - arm-unknown-linux-uclibcgnueabihf-ld.bfd: NOTE: This behaviour is deprecated and will be removed in a future version of the linker - -We could silence the warning by adding the '-z execstack' option to the -TA link flags, like we did in the parent commit for the TEE core and -ldelf. Indeed, ldelf always allocates a non-executable piece of memory -for the TA to use as a stack. - -However it seems preferable to comply with the common ELF practices in -this case. A better fix is therefore to add the missing .note.GNU-stack -sections in the assembler files. - -Signed-off-by: Jerome Forissier - -Signed-off-by: Anton Antonov -Upstream-Status: Backport [https://github.com/OP-TEE/optee_os/pull/5499] -Signed-off-by: Oleksandr Suvorov ---- - - lib/libutee/arch/arm/utee_syscalls_a32.S | 2 ++ - lib/libutils/ext/arch/arm/atomic_a32.S | 2 ++ - lib/libutils/ext/arch/arm/mcount_a32.S | 2 ++ - lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S | 2 ++ - lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S | 2 ++ - lib/libutils/isoc/arch/arm/setjmp_a32.S | 2 ++ - ta/arch/arm/ta_entry_a32.S | 2 ++ - 7 files changed, 14 insertions(+) - -diff --git a/lib/libutee/arch/arm/utee_syscalls_a32.S b/lib/libutee/arch/arm/utee_syscalls_a32.S -index 2dea83ab8..668b65a86 100644 ---- a/lib/libutee/arch/arm/utee_syscalls_a32.S -+++ b/lib/libutee/arch/arm/utee_syscalls_a32.S -@@ -9,6 +9,8 @@ - - .section .note.GNU-stack,"",%progbits - -+ .section .note.GNU-stack,"",%progbits -+ - .section .text - .balign 4 - .code 32 -diff --git a/lib/libutils/ext/arch/arm/atomic_a32.S b/lib/libutils/ext/arch/arm/atomic_a32.S -index 2be73ffad..87ddf1065 100644 ---- a/lib/libutils/ext/arch/arm/atomic_a32.S -+++ b/lib/libutils/ext/arch/arm/atomic_a32.S -@@ -7,6 +7,8 @@ - - .section .note.GNU-stack,"",%progbits - -+ .section .note.GNU-stack,"",%progbits -+ - /* uint32_t atomic_inc32(uint32_t *v); */ - FUNC atomic_inc32 , : - ldrex r1, [r0] -diff --git a/lib/libutils/ext/arch/arm/mcount_a32.S b/lib/libutils/ext/arch/arm/mcount_a32.S -index 54dc3c02d..2f24632b8 100644 ---- a/lib/libutils/ext/arch/arm/mcount_a32.S -+++ b/lib/libutils/ext/arch/arm/mcount_a32.S -@@ -9,6 +9,8 @@ - - .section .note.GNU-stack,"",%progbits - -+ .section .note.GNU-stack,"",%progbits -+ - /* - * Convert return address to call site address by subtracting the size of the - * mcount call instruction (blx __gnu_mcount_nc). -diff --git a/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S b/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S -index 37ae9ec6f..bc6c48b1a 100644 ---- a/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S -+++ b/lib/libutils/isoc/arch/arm/arm32_aeabi_divmod_a32.S -@@ -7,6 +7,8 @@ - - .section .note.GNU-stack,"",%progbits - -+ .section .note.GNU-stack,"",%progbits -+ - /* - * signed ret_idivmod_values(signed quot, signed rem); - * return quotient and remaining the EABI way (regs r0,r1) -diff --git a/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S b/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S -index 5c3353e2c..9fb5e0283 100644 ---- a/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S -+++ b/lib/libutils/isoc/arch/arm/arm32_aeabi_ldivmod_a32.S -@@ -7,6 +7,8 @@ - - .section .note.GNU-stack,"",%progbits - -+ .section .note.GNU-stack,"",%progbits -+ - /* - * __value_in_regs lldiv_t __aeabi_ldivmod( long long n, long long d) - */ -diff --git a/lib/libutils/isoc/arch/arm/setjmp_a32.S b/lib/libutils/isoc/arch/arm/setjmp_a32.S -index f8a0b70df..37d7cb88e 100644 ---- a/lib/libutils/isoc/arch/arm/setjmp_a32.S -+++ b/lib/libutils/isoc/arch/arm/setjmp_a32.S -@@ -53,6 +53,8 @@ - - .section .note.GNU-stack,"",%progbits - -+ .section .note.GNU-stack,"",%progbits -+ - /* Arm/Thumb interworking support: - - The interworking scheme expects functions to use a BX instruction -diff --git a/ta/arch/arm/ta_entry_a32.S b/ta/arch/arm/ta_entry_a32.S -index cd9a12f9d..ccdc19928 100644 ---- a/ta/arch/arm/ta_entry_a32.S -+++ b/ta/arch/arm/ta_entry_a32.S -@@ -7,6 +7,8 @@ - - .section .note.GNU-stack,"",%progbits - -+ .section .note.GNU-stack,"",%progbits -+ - /* - * This function is the bottom of the user call stack. Mark it as such so that - * the unwinding code won't try to go further down. --- -2.43.2 - diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0003-core-imx-support-ccimx93-dvk.patch similarity index 78% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0003-core-imx-support-ccimx93-dvk.patch index a892cb8d6..c691a777a 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0001-core-imx-support-ccimx93-dvk.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0003-core-imx-support-ccimx93-dvk.patch @@ -7,16 +7,17 @@ SOC revision A0 requires a different build. Upstream-Status: Inappropriate [DEY specific] Signed-off-by: Javier Viguera +Signed-off-by: Hector Palacios --- core/arch/arm/plat-imx/conf.mk | 13 +++++++++++++ - core/arch/arm/plat-imx/registers/imx93.h | 5 +++++ - 2 files changed, 18 insertions(+) + core/arch/arm/plat-imx/registers/imx93.h | 4 ++++ + 2 files changed, 17 insertions(+) diff --git a/core/arch/arm/plat-imx/conf.mk b/core/arch/arm/plat-imx/conf.mk -index 33647835f2fb..8d065a3d3db3 100644 +index c65e383edf38..ee0b6d6a0463 100644 --- a/core/arch/arm/plat-imx/conf.mk +++ b/core/arch/arm/plat-imx/conf.mk -@@ -89,6 +89,8 @@ mx8ulp-flavorlist = \ +@@ -90,6 +90,8 @@ mx8ulp-flavorlist = \ mx8ulpevk \ mx93-flavorlist = \ @@ -25,8 +26,8 @@ index 33647835f2fb..8d065a3d3db3 100644 mx93evk \ mx95-flavorlist = \ -@@ -493,6 +495,17 @@ CFG_DDR_SIZE ?= 0x80000000 - CFG_UART_BASE ?= UART1_BASE +@@ -510,6 +512,17 @@ CFG_DDR_SIZE ?= 0x20000000 + CFG_UART_BASE ?= UART6_BASE endif +ifneq (,$(filter $(PLATFORM_FLAVOR),ccimx93dvk)) @@ -44,15 +45,10 @@ index 33647835f2fb..8d065a3d3db3 100644 CFG_DDR_SIZE ?= 0x80000000 CFG_UART_BASE ?= UART1_BASE diff --git a/core/arch/arm/plat-imx/registers/imx93.h b/core/arch/arm/plat-imx/registers/imx93.h -index 21080da82d04..29070eb917ac 100644 +index 17f4d8f5755e..29070eb917ac 100644 --- a/core/arch/arm/plat-imx/registers/imx93.h +++ b/core/arch/arm/plat-imx/registers/imx93.h -@@ -9,11 +9,16 @@ - #define GICR_BASE 0x48040000 - - #define UART1_BASE 0x44380000 -+#define UART6_BASE 0x425a0000 - /* +@@ -14,7 +14,11 @@ * For Normal MU - Use MU_BASE as 0x47520000 * For Trust MU - Use MU_BASE as 0x47530000 */ diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0002-core-ccimx93-enable-AES_HUK-trusted-application.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0004-core-ccimx93-enable-AES_HUK-trusted-application.patch similarity index 99% rename from meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0002-core-ccimx93-enable-AES_HUK-trusted-application.patch rename to meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0004-core-ccimx93-enable-AES_HUK-trusted-application.patch index 057576a2e..86a99bce9 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0002-core-ccimx93-enable-AES_HUK-trusted-application.patch +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0004-core-ccimx93-enable-AES_HUK-trusted-application.patch @@ -26,10 +26,10 @@ Signed-off-by: Javier Viguera create mode 100644 ta/aes_huk/user_ta_header_defines.h diff --git a/core/arch/arm/plat-imx/conf.mk b/core/arch/arm/plat-imx/conf.mk -index 8d065a3d3db3..de1cf45ca9b6 100644 +index ee0b6d6a0463..916b6b6a1fbb 100644 --- a/core/arch/arm/plat-imx/conf.mk +++ b/core/arch/arm/plat-imx/conf.mk -@@ -498,12 +498,14 @@ endif +@@ -515,12 +515,14 @@ endif ifneq (,$(filter $(PLATFORM_FLAVOR),ccimx93dvk)) CFG_DDR_SIZE ?= 0x40000000 CFG_UART_BASE ?= UART6_BASE diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0004-core-link-add-no-warn-rwx-segments.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0004-core-link-add-no-warn-rwx-segments.patch deleted file mode 100644 index f32b2284f..000000000 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0004-core-link-add-no-warn-rwx-segments.patch +++ /dev/null @@ -1,67 +0,0 @@ -From a63f82f74e015eb662242cdb51ef814e3f576829 Mon Sep 17 00:00:00 2001 -From: Jerome Forissier -Date: Fri, 5 Aug 2022 09:48:03 +0200 -Subject: [PATCH 4/4] core: link: add --no-warn-rwx-segments - -Signed-off-by: Anton Antonov -Upstream-Status: Backport [https://github.com/OP-TEE/optee_os/pull/5474] - -binutils ld.bfd generates one RWX LOAD segment by merging several sections -with mixed R/W/X attributes (.text, .rodata, .data). After version 2.38 it -also warns by default when that happens [1], which breaks the build due to ---fatal-warnings. The RWX segment is not a problem for the TEE core, since -that information is not used to set memory permissions. Therefore, silence -the warning. - -Link: [1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=ba951afb99912da01a6e8434126b8fac7aa75107 -Link: https://sourceware.org/bugzilla/show_bug.cgi?id=29448 -Reported-by: Dominique Martinet -Signed-off-by: Jerome Forissier -Acked-by: Jens Wiklander -Signed-off-by: Oleksandr Suvorov ---- - - core/arch/arm/kernel/link.mk | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/core/arch/arm/kernel/link.mk b/core/arch/arm/kernel/link.mk -index 49e9f4fa1..9e1cc172f 100644 ---- a/core/arch/arm/kernel/link.mk -+++ b/core/arch/arm/kernel/link.mk -@@ -37,6 +37,7 @@ link-ldflags += --sort-section=alignment - link-ldflags += --fatal-warnings - link-ldflags += --gc-sections - link-ldflags += $(link-ldflags-common) -+link-ldflags += $(call ld-option,--no-warn-rwx-segments) - - link-ldadd = $(LDADD) - link-ldadd += $(ldflags-external) -@@ -61,6 +62,7 @@ link-script-cppflags := \ - $(cppflagscore)) - - ldargs-all_objs := -T $(link-script-dummy) --no-check-sections \ -+ $(call ld-option,--no-warn-rwx-segments) \ - $(link-ldflags-common) \ - $(link-objs) $(link-ldadd) $(libgcccore) - cleanfiles += $(link-out-dir)/all_objs.o -@@ -75,7 +77,7 @@ $(link-out-dir)/unpaged_entries.txt: $(link-out-dir)/all_objs.o - $(AWK) '/ ____keep_pager/ { printf "-u%s ", $$3 }' > $@ - - unpaged-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \ -- $(link-ldflags-common) -+ $(link-ldflags-common) $(call ld-option,--no-warn-rwx-segments) - unpaged-ldadd := $(objs) $(link-ldadd) $(libgcccore) - cleanfiles += $(link-out-dir)/unpaged.o - $(link-out-dir)/unpaged.o: $(link-out-dir)/unpaged_entries.txt -@@ -104,7 +106,7 @@ $(link-out-dir)/init_entries.txt: $(link-out-dir)/all_objs.o - $(AWK) '/ ____keep_init/ { printf "-u%s ", $$3 }' > $@ - - init-ldargs := -T $(link-script-dummy) --no-check-sections --gc-sections \ -- $(link-ldflags-common) -+ $(link-ldflags-common) $(call ld-option,--no-warn-rwx-segments) - init-ldadd := $(link-objs-init) $(link-out-dir)/version.o $(link-ldadd) \ - $(libgcccore) - cleanfiles += $(link-out-dir)/init.o --- -2.43.2 - diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0005-core-imx-support-ccimx95-dvk.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0005-core-imx-support-ccimx95-dvk.patch new file mode 100644 index 000000000..e5162010a --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os/0005-core-imx-support-ccimx95-dvk.patch @@ -0,0 +1,51 @@ +From: Javier Viguera +Date: Wed, 10 Sep 2025 14:19:01 +0200 +Subject: [PATCH] core: imx: support ccimx95-dvk + +Upstream-Status: Inappropriate [DEY specific] + +Signed-off-by: Javier Viguera +--- + core/arch/arm/plat-imx/conf.mk | 9 +++++++++ + core/arch/arm/plat-imx/registers/imx95.h | 1 + + 2 files changed, 10 insertions(+) + +diff --git a/core/arch/arm/plat-imx/conf.mk b/core/arch/arm/plat-imx/conf.mk +index 916b6b6a1fbb..55f4c21d0321 100644 +--- a/core/arch/arm/plat-imx/conf.mk ++++ b/core/arch/arm/plat-imx/conf.mk +@@ -95,6 +95,7 @@ mx93-flavorlist = \ + mx93evk \ + + mx95-flavorlist = \ ++ ccimx95dvk \ + mx95evk \ + + mx91-flavorlist = \ +@@ -525,6 +526,14 @@ $(call force,CFG_SOC_REV_A0,y) + CFG_IN_TREE_EARLY_TAS += aes_huk/c2fad363-5d9f-4fc4-a417-555841e05745 + endif + ++ifneq (,$(filter $(PLATFORM_FLAVOR),ccimx95dvk)) ++CFG_DDR_SIZE ?= 0x80000000 ++CFG_UART_BASE ?= UART6_BASE ++CFG_NSEC_DDR_1_BASE ?= 0x100000000UL ++CFG_NSEC_DDR_1_SIZE ?= 0x180000000UL ++CFG_CORE_ARM64_PA_BITS ?= 40 ++endif ++ + ifneq (,$(filter $(PLATFORM_FLAVOR),mx95evk)) + CFG_DDR_SIZE ?= 0x80000000 + CFG_UART_BASE ?= UART1_BASE +diff --git a/core/arch/arm/plat-imx/registers/imx95.h b/core/arch/arm/plat-imx/registers/imx95.h +index b0382e682c17..05d8efad2cdc 100644 +--- a/core/arch/arm/plat-imx/registers/imx95.h ++++ b/core/arch/arm/plat-imx/registers/imx95.h +@@ -9,6 +9,7 @@ + #define GICR_BASE 0x48060000 + + #define UART1_BASE 0x44380000 ++#define UART6_BASE 0x425A0000 + + #define MU_BASE 0x47530000 + #define MU_SIZE 0x10000 diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.4.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.4.0.imx.bb deleted file mode 100644 index f3fb5cab5..000000000 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.4.0.imx.bb +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (C) 2025, Digi International Inc. - -# -# Reuse meta-freescale's optee-os_4.2.0.imx.bb -# -require recipes-security/optee-imx/optee-os_4.2.0.imx.bb - -SRCBRANCH = "lf-6.6.52_2.2.0" -SRCREV = "60beb308810f9561a67fdb435388a64c85eb6dcb" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.4.0.imx.bbappend b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.4.0.imx.bbappend index be5ab0543..49463446c 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.4.0.imx.bbappend +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-os_4.4.0.imx.bbappend @@ -3,25 +3,21 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" SRC_URI += "file://environment.d-optee-sdk.sh" -SRC_URI:append:ccimx8mm = " \ +SRC_URI:append:dey = " \ file://0001-plat-imx-add-support-for-ConnectCore-8M-Mini.patch \ + file://0002-core-imx-support-ccimx91-dvk.patch \ + file://0003-core-imx-support-ccimx93-dvk.patch \ + file://0004-core-ccimx93-enable-AES_HUK-trusted-application.patch \ + file://0005-core-imx-support-ccimx95-dvk.patch \ " -SRC_URI:append:ccimx91 = " \ - file://0001-core-imx-support-ccimx91-dvk.patch \ -" - -SRC_URI:append:ccimx93 = " \ - file://0001-core-imx-support-ccimx93-dvk.patch \ - file://0002-core-ccimx93-enable-AES_HUK-trusted-application.patch \ -" - -PLATFORM_FLAVOR:ccimx8mm = "ccimx8mmdvk" -PLATFORM_FLAVOR:ccimx91 = "ccimx91dvk" -PLATFORM_FLAVOR:ccimx93 = "ccimx93dvk" +OPTEEMACHINE:ccimx8mm = "imx-ccimx8mmdvk" +OPTEEMACHINE:ccimx91 = "imx-ccimx91dvk" +OPTEEMACHINE:ccimx93 = "imx-ccimx93dvk" +OPTEEMACHINE:ccimx95 = "imx-ccimx95dvk" do_compile:append:ccimx93 () { - oe_runmake PLATFORM=imx-${PLATFORM_FLAVOR}_a0 O=${B}-A0 all + oe_runmake -C ${S} PLATFORM=imx-${PLATFORM_FLAVOR}_a0 O=${B}-A0 } do_compile:ccimx93[cleandirs] += "${B}-A0" @@ -29,10 +25,10 @@ do_deploy:append:ccimx93 () { cp ${B}-A0/core/tee-raw.bin ${DEPLOYDIR}/tee.${PLATFORM_FLAVOR}_a0.bin } -do_install:append () { - mkdir -p ${D}/environment-setup.d - sed -e "s,#OPTEE_ARCH#,${OPTEE_ARCH},g" ${WORKDIR}/environment.d-optee-sdk.sh > ${D}/environment-setup.d/optee-sdk.sh +do_install:append() { + mkdir -p ${D}/environment-setup.d + sed -e "s,#OPTEE_ARCH#,${OPTEE_ARCH},g" ${WORKDIR}/environment.d-optee-sdk.sh >${D}/environment-setup.d/optee-sdk.sh } -FILES:${PN}-staticdev += " /environment-setup.d/" +FILES:${PN}-staticdev += "/environment-setup.d/" INSANE_SKIP:${PN}-staticdev += "buildpaths" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-test_4.4.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-test_4.4.0.imx.bb deleted file mode 100644 index c171a57c2..000000000 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-security/optee-imx/optee-test_4.4.0.imx.bb +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (C) 2025, Digi International Inc. - -# -# Reuse meta-freescale's optee-test_4.2.0.imx.bb -# -require recipes-security/optee-imx/optee-test_4.2.0.imx.bb - -# The BSD and GPL license files are now included in the source -# https://github.com/OP-TEE/optee_test/commit/a748f5fcd9ec8a574dc86a5aa56d05bc6ac174e7 -LIC_FILES_CHKSUM = "file://LICENSE.md;md5=a8fa504109e4cd7ea575bc49ea4be560 \ - file://LICENSE-BSD;md5=dca16d6efa93b55d0fd662ae5cd6feeb \ - file://LICENSE-GPL;md5=10e86b5d2a6cb0e2b9dcfdd26a9ac58d" - -SRCBRANCH = "lf-6.6.52_2.2.0" -SRCREV = "dafc98ed8364d7281a9a7f0788dd0a2067844a59" diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0101-MGS-6470-ccc-Modify-host-ptr-alignment-size-in-UMAT.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0101-MGS-6470-ccc-Modify-host-ptr-alignment-size-in-UMAT.patch new file mode 100644 index 000000000..82afd5c72 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0101-MGS-6470-ccc-Modify-host-ptr-alignment-size-in-UMAT.patch @@ -0,0 +1,29 @@ +From 0a1c77e4c810999632d648f63775b7ea265bc25c Mon Sep 17 00:00:00 2001 +From: Eric Guo +Date: Tue, 9 Nov 2021 14:38:00 +0800 +Subject: [PATCH 1/4] MGS-6470 [#ccc] Modify host ptr alignment size in UMAT + +change CV_OPENCL_ALIGNMENT_MEM_USE_HOST_PTR from 4 to 64 + +Upstream-Status: Inappropriate [i.MX specific] +Signed-off-by: Eric Guo +--- + modules/core/src/ocl.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp +index 8479667fd7..6eb7b5e425 100644 +--- a/modules/core/src/ocl.cpp ++++ b/modules/core/src/ocl.cpp +@@ -245,7 +245,7 @@ static String getBuildExtraOptions() + } + + static const bool CV_OPENCL_ENABLE_MEM_USE_HOST_PTR = utils::getConfigurationParameterBool("OPENCV_OPENCL_ENABLE_MEM_USE_HOST_PTR", true); +-static const size_t CV_OPENCL_ALIGNMENT_MEM_USE_HOST_PTR = utils::getConfigurationParameterSizeT("OPENCV_OPENCL_ALIGNMENT_MEM_USE_HOST_PTR", 4); ++static const size_t CV_OPENCL_ALIGNMENT_MEM_USE_HOST_PTR = utils::getConfigurationParameterSizeT("OPENCV_OPENCL_ALIGNMENT_MEM_USE_HOST_PTR", 64); + + + struct UMat2D +-- +2.34.1 + diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0102-MGS-6470-ccc-Add-configuration-parameter-to-force-en.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0102-MGS-6470-ccc-Add-configuration-parameter-to-force-en.patch new file mode 100644 index 000000000..50240093c --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0102-MGS-6470-ccc-Add-configuration-parameter-to-force-en.patch @@ -0,0 +1,32 @@ +From 965365fff0815b8afc9833102d8e4e6c4ee1dda3 Mon Sep 17 00:00:00 2001 +From: Eric Guo +Date: Wed, 17 Nov 2021 15:04:23 +0800 +Subject: [PATCH 2/4] MGS-6470 [#ccc] Add configuration parameter to force + enable hostptr in OpenCL + +USAGE: `set OPENCV_OPENCL_ALIGNMENT_MEM_ALLOC_HOST_PTR=true` + +Upstream-Status: Inappropriate [i.MX specific] +Signed-off-by: Eric Guo +--- + modules/core/src/ocl.cpp | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp +index 6eb7b5e425..5c50b06865 100644 +--- a/modules/core/src/ocl.cpp ++++ b/modules/core/src/ocl.cpp +@@ -5416,7 +5416,9 @@ public: + { + const Device& dev = ctx.device(0); + createFlags = 0; +- if ((usageFlags & USAGE_ALLOCATE_HOST_MEMORY) != 0) ++ bool allocHostPtr = utils::getConfigurationParameterBool("OPENCV_OPENCL_ALIGNMENT_MEM_ALLOC_HOST_PTR", false); ++ ++ if ((usageFlags & USAGE_ALLOCATE_HOST_MEMORY) != 0 || allocHostPtr) + createFlags |= CL_MEM_ALLOC_HOST_PTR; + + if (!isOpenCLCopyingForced() && +-- +2.34.1 + diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0103-MGS-6470-ccc-Change-configuration-to-enable-hostptr-.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0103-MGS-6470-ccc-Change-configuration-to-enable-hostptr-.patch new file mode 100644 index 000000000..3b429b383 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0103-MGS-6470-ccc-Change-configuration-to-enable-hostptr-.patch @@ -0,0 +1,28 @@ +From 352b992c7daeeede261cf52e06b5beac485df897 Mon Sep 17 00:00:00 2001 +From: Eric Guo +Date: Thu, 9 Dec 2021 15:25:42 +0800 +Subject: [PATCH 3/4] MGS-6470 [#ccc] Change configuration to enable hostptr in + OpenCL by default. + +Upstream-Status: Inappropriate [i.MX specific] +Signed-off-by: Eric Guo +--- + modules/core/src/ocl.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp +index 5c50b06865..db75190f13 100644 +--- a/modules/core/src/ocl.cpp ++++ b/modules/core/src/ocl.cpp +@@ -5416,7 +5416,7 @@ public: + { + const Device& dev = ctx.device(0); + createFlags = 0; +- bool allocHostPtr = utils::getConfigurationParameterBool("OPENCV_OPENCL_ALIGNMENT_MEM_ALLOC_HOST_PTR", false); ++ bool allocHostPtr = utils::getConfigurationParameterBool("OPENCV_OPENCL_ALIGNMENT_MEM_ALLOC_HOST_PTR", true); + + if ((usageFlags & USAGE_ALLOCATE_HOST_MEMORY) != 0 || allocHostPtr) + createFlags |= CL_MEM_ALLOC_HOST_PTR; +-- +2.34.1 + diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0104-MGS-8011-ccc-Fix-the-problem-of-syntax-error-at-doub.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0104-MGS-8011-ccc-Fix-the-problem-of-syntax-error-at-doub.patch new file mode 100644 index 000000000..ebca4ce35 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/0104-MGS-8011-ccc-Fix-the-problem-of-syntax-error-at-doub.patch @@ -0,0 +1,43 @@ +From 2766330540d5106e1cc5c44ab14f021e306859cb Mon Sep 17 00:00:00 2001 +From: jiajia Qian +Date: Tue, 7 Jan 2025 16:42:34 +0800 +Subject: [PATCH 4/4] MGS-8011 [#ccc] Fix the problem of syntax error at + 'double4' in opencv_test_imgproc. + +Since our driver does not support cl_khr_fp64 format data, + +disabled the related ocl function in opencv_test_imgproc to avoid the following error log: + +error: syntax error at 'double4' + +Upstream-Status: Inappropriate [i.MX specific] +Signed-off-by: jiajia Qian +--- + modules/imgproc/src/imgwarp.cpp | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp +index dfc718bf87..0e8b9ce142 100644 +--- a/modules/imgproc/src/imgwarp.cpp ++++ b/modules/imgproc/src/imgwarp.cpp +@@ -1349,6 +1349,7 @@ static bool ocl_remap(InputArray _src, OutputArray _dst, InputArray _map1, Input + interpolation &= ~WARP_RELATIVE_MAP; + + const ocl::Device & dev = ocl::Device::getDefault(); ++ bool doubleSupport = dev.doubleFPConfig() > 0; + int cn = _src.channels(), type = _src.type(), depth = _src.depth(), + rowsPerWI = dev.isIntel() ? 4 : 1; + +@@ -1356,6 +1357,9 @@ static bool ocl_remap(InputArray _src, OutputArray _dst, InputArray _map1, Input + || _map1.type() == CV_16SC1 || _map2.type() == CV_16SC1) + return false; + ++ if (!doubleSupport && depth == CV_64F ) ++ return false; ++ + UMat src = _src.getUMat(), map1 = _map1.getUMat(), map2 = _map2.getUMat(); + + if( (map1.type() == CV_16SC2 && (map2.type() == CV_16UC1 || map2.empty())) || +-- +2.34.1 + diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/fix-build-with-protobuf-v22.patch b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/fix-build-with-protobuf-v22.patch deleted file mode 100644 index 265d723c6..000000000 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv/fix-build-with-protobuf-v22.patch +++ /dev/null @@ -1,203 +0,0 @@ -From 75f7475fcfb35cbe4d8f5ccf5c4ac8bc78f2dc30 Mon Sep 17 00:00:00 2001 -From: Kumataro -Date: Thu, 19 Oct 2023 14:45:08 +0900 -Subject: [PATCH] Merge pull request #24372 from Kumataro:fix24369 - -Supporting protobuf v22 and later(with abseil-cpp/C++17) #24372 - -fix https://github.com/opencv/opencv/issues/24369 -related https://github.com/opencv/opencv/issues/23791 - -1. This patch supports external protobuf v22 and later, it required abseil-cpp and c++17. - Even if the built-in protobuf is upgraded to v22 or later, - the dependency on abseil-cpp and the requirement for C++17 will continue. -2. Some test for caffe required patched protobuf, so this patch disable them. - -This patch is tested by following libraries. -- Protobuf: /usr/local/lib/libprotobuf.so (4.24.4) -- abseil-cpp: YES (20230125) - -See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - -- [x] I agree to contribute to the project under Apache 2 License. -- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV -- [x] The PR is proposed to the proper branch -- [x] There is a reference to the original bug report and related work -- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable - Patch to opencv_extra has the same branch name. -- [x] The feature is well documented and sample code can be built with the project CMake - -Upstream-Status: Backport [https://github.com/opencv/opencv/commit/6e4280ea81b59c6dca45bb9801b758377beead55] ---- - cmake/OpenCVFindProtobuf.cmake | 35 +++++++++++++++++++++++++++----- - modules/dnn/CMakeLists.txt | 6 ++++++ - modules/dnn/test/test_layers.cpp | 24 ++++++++++++++++++---- - 3 files changed, 56 insertions(+), 9 deletions(-) - -diff --git a/cmake/OpenCVFindProtobuf.cmake b/cmake/OpenCVFindProtobuf.cmake -index 8835347d1d..5b1e17529f 100644 ---- a/cmake/OpenCVFindProtobuf.cmake -+++ b/cmake/OpenCVFindProtobuf.cmake -@@ -30,8 +30,14 @@ if(BUILD_PROTOBUF) - set(Protobuf_LIBRARIES "libprotobuf") - set(HAVE_PROTOBUF TRUE) - else() -+ # we still need this for command PROTOBUF_GENERATE_CPP. -+ set(protobuf_MODULE_COMPATIBLE ON) -+ - unset(Protobuf_VERSION CACHE) -- find_package(Protobuf QUIET) -+ find_package(Protobuf QUIET CONFIG) -+ if(NOT Protobuf_FOUND) -+ find_package(Protobuf QUIET) -+ endif() - - # Backwards compatibility - # Define camel case versions of input variables -@@ -67,6 +73,20 @@ else() - endif() - endif() - -+# See https://github.com/opencv/opencv/issues/24369 -+# In Protocol Buffers v22.0 and later drops C++11 support and depends abseil-cpp. -+# Details: https://protobuf.dev/news/2022-08-03/ -+# And if std::text_view is in abseil-cpp requests C++17 and later. -+ -+if(HAVE_PROTOBUF) -+ if(NOT (Protobuf_VERSION VERSION_LESS 22)) -+ if((CMAKE_CXX_STANDARD EQUAL 98) OR (CMAKE_CXX_STANDARD LESS 17)) -+ message(STATUS "CMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} is too old to support protobuf(${Protobuf_VERSION}) and/or abseil-cpp. Use C++17 or later. Turning HAVE_PROTOBUF off") -+ set(HAVE_PROTOBUF FALSE) -+ endif() -+ endif() -+endif() -+ - if(HAVE_PROTOBUF AND PROTOBUF_UPDATE_FILES AND NOT COMMAND PROTOBUF_GENERATE_CPP) - message(FATAL_ERROR "Can't configure protobuf dependency (BUILD_PROTOBUF=${BUILD_PROTOBUF} PROTOBUF_UPDATE_FILES=${PROTOBUF_UPDATE_FILES})") - endif() -@@ -74,15 +94,20 @@ endif() - if(HAVE_PROTOBUF) - list(APPEND CUSTOM_STATUS protobuf) - if(NOT BUILD_PROTOBUF) -+ unset( __location) - if(TARGET "${Protobuf_LIBRARIES}") - get_target_property(__location "${Protobuf_LIBRARIES}" IMPORTED_LOCATION_RELEASE) - if(NOT __location) - get_target_property(__location "${Protobuf_LIBRARIES}" IMPORTED_LOCATION) - endif() -- elseif(Protobuf_LIBRARY) -- set(__location "${Protobuf_LIBRARY}") -- else() -- set(__location "${Protobuf_LIBRARIES}") -+ endif() -+ -+ if(NOT __location) -+ if(Protobuf_LIBRARY) -+ set(__location "${Protobuf_LIBRARY}") -+ else() -+ set(__location "${Protobuf_LIBRARIES}") -+ endif() - endif() - endif() - list(APPEND CUSTOM_STATUS_protobuf " Protobuf:" -diff --git a/modules/dnn/CMakeLists.txt b/modules/dnn/CMakeLists.txt -index 804b78ead2..9fcc460909 100644 ---- a/modules/dnn/CMakeLists.txt -+++ b/modules/dnn/CMakeLists.txt -@@ -245,6 +245,12 @@ ocv_create_module(${libs} ${dnn_runtime_libs}) - ocv_add_samples() - ocv_add_accuracy_tests(${dnn_runtime_libs}) - -+if(NOT BUILD_PROTOBUF) -+ if(TARGET opencv_test_dnn) -+ ocv_target_compile_definitions(opencv_test_dnn PRIVATE "OPENCV_DNN_EXTERNAL_PROTOBUF=1") -+ endif() -+endif() -+ - set(perf_path "${CMAKE_CURRENT_LIST_DIR}/perf") - file(GLOB_RECURSE perf_srcs "${perf_path}/*.cpp") - file(GLOB_RECURSE perf_hdrs "${perf_path}/*.hpp" "${perf_path}/*.h") -diff --git a/modules/dnn/test/test_layers.cpp b/modules/dnn/test/test_layers.cpp -index 763d94b99c..6cb6d54b3f 100644 ---- a/modules/dnn/test/test_layers.cpp -+++ b/modules/dnn/test/test_layers.cpp -@@ -756,11 +756,15 @@ TEST_F(Layer_RNN_Test, get_set_test) - - TEST_P(Test_Caffe_layers, Accum) - { -+#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF -+ throw SkipTestException("Requires patched protobuf"); -+#else - if (backend == DNN_BACKEND_OPENCV && target != DNN_TARGET_CPU) - applyTestTag(CV_TEST_TAG_DNN_SKIP_OPENCL, CV_TEST_TAG_DNN_SKIP_OPENCL_FP16); - - testLayerUsingCaffeModels("accum", false, false, 0.0, 0.0, 2); - testLayerUsingCaffeModels("accum_ref", false, false, 0.0, 0.0, 2); -+#endif - } - - TEST_P(Test_Caffe_layers, FlowWarp) -@@ -780,27 +784,39 @@ TEST_P(Test_Caffe_layers, ChannelNorm) - - TEST_P(Test_Caffe_layers, DataAugmentation) - { -+#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF -+ throw SkipTestException("Requires patched protobuf"); -+#else - if (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16) - applyTestTag(CV_TEST_TAG_DNN_SKIP_OPENCL_FP16); - testLayerUsingCaffeModels("data_augmentation", true, false); - testLayerUsingCaffeModels("data_augmentation_2x1", true, false); - testLayerUsingCaffeModels("data_augmentation_8x6", true, false); -+#endif - } - - TEST_P(Test_Caffe_layers, Resample) - { -+#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF -+ throw SkipTestException("Requires patched protobuf"); -+#else - if (backend != DNN_BACKEND_OPENCV) - applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_NN_BUILDER, CV_TEST_TAG_DNN_SKIP_IE_NGRAPH); - testLayerUsingCaffeModels("nearest_2inps", false, false, 0.0, 0.0, 2); - testLayerUsingCaffeModels("nearest", false, false); -+#endif - } - - TEST_P(Test_Caffe_layers, Correlation) - { -+#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF -+ throw SkipTestException("Requires patched protobuf"); -+#else - if (backend == DNN_BACKEND_OPENCV && target == DNN_TARGET_OPENCL_FP16) - applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_NGRAPH, CV_TEST_TAG_DNN_SKIP_IE_NN_BUILDER, - CV_TEST_TAG_DNN_SKIP_OPENCL, CV_TEST_TAG_DNN_SKIP_OPENCL_FP16); - testLayerUsingCaffeModels("correlation", false, false, 0.0, 0.0, 2); -+#endif - } - - TEST_P(Test_Caffe_layers, Convolution2Inputs) -@@ -1641,12 +1657,11 @@ private: - int outWidth, outHeight, zoomFactor; - }; - --#ifndef OPENCV_DNN_EXTERNAL_PROTOBUF - TEST_P(Test_Caffe_layers, Interp) --#else --TEST_P(Test_Caffe_layers, DISABLED_Interp) // requires patched protobuf (available in OpenCV source tree only) --#endif - { -+#ifdef OPENCV_DNN_EXTERNAL_PROTOBUF -+ throw SkipTestException("Requires patched protobuf"); -+#else - #if defined(INF_ENGINE_RELEASE) && INF_ENGINE_VER_MAJOR_EQ(2021030000) - if (backend == DNN_BACKEND_INFERENCE_ENGINE_NGRAPH && target == DNN_TARGET_MYRIAD) - applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_MYRIAD, CV_TEST_TAG_DNN_SKIP_IE_NGRAPH); // exception -@@ -1670,6 +1685,7 @@ TEST_P(Test_Caffe_layers, DISABLED_Interp) // requires patched protobuf (availa - - // Test an implemented layer. - testLayerUsingCaffeModels("layer_interp", false, false); -+#endif - } - - INSTANTIATE_TEST_CASE_P(/*nothing*/, Test_Caffe_layers, dnnBackendsAndTargets()); diff --git a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv_4.10.0.imx.bb b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv_4.10.0.imx.bb index 1f7649f28..98cd85356 100644 --- a/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv_4.10.0.imx.bb +++ b/meta-digi-arm/dynamic-layers/freescale-layer/recipes-support/opencv/opencv_4.10.0.imx.bb @@ -1,6 +1,7 @@ -# This recipe is for the i.MX fork of opencv. For ease of -# maintenance, the top section is a verbatim copy of an OE-core -# recipe. The second section customizes the recipe for i.MX. +# This recipe is modified for i.MX. +# For ease of maintenance, the top section is a verbatim copy +# of an OE-core recipe, and the second section customizes the +# recipe for i.MX. ########## meta-openembedded copy ########### # Upstream hash: b149b1e6a1de2bdea10b0a6de34d5a5bbba4a657 @@ -17,7 +18,7 @@ ARM_INSTRUCTION_SET:armv5 = "arm" DEPENDS = "libtool swig-native bzip2 zlib glib-2.0 libwebp" -SRCREV_opencv = "93bb210db7cb5ae3dcd80dd6e3f8e5cfb42aa5fa" +SRCREV_opencv = "1ebbfb4aeeb558d03a76f3efa5bd9020f3e4397c" SRCREV_contrib = "c7602a8f74205e44389bd6a4e8d727d32e7e27b4" SRCREV_boostdesc = "34e4206aef44d50e6bbcd0ab06354b52e7466d26" SRCREV_vgg = "fccf7cd6a4b12079f73bbfb21745f9babcd4eb1d" @@ -224,12 +225,15 @@ SUMMARY = "Opencv : The Open Computer Vision Library, i.MX Fork" LIC_FILES_CHKSUM = "file://LICENSE;md5=3b83ef96387f14655fc854ddc3c6bd57" -# Replace the opencv URL with the fork -SRC_URI:remove = "git://github.com/opencv/opencv.git;name=opencv;branch=4.x;protocol=https" -SRC_URI =+ "${OPENCV_SRC};branch=${SRCBRANCH_opencv};name=opencv" -OPENCV_SRC ?= "git://github.com/nxp-imx/opencv-imx.git;protocol=https;branch=master" -SRCBRANCH_opencv = "4.10.0_imx" -SRCREV_opencv = "93bb210db7cb5ae3dcd80dd6e3f8e5cfb42aa5fa" +# i.MX patches +SRC_URI += " \ + file://0101-MGS-6470-ccc-Modify-host-ptr-alignment-size-in-UMAT.patch \ + file://0102-MGS-6470-ccc-Add-configuration-parameter-to-force-en.patch \ + file://0103-MGS-6470-ccc-Change-configuration-to-enable-hostptr-.patch \ + file://0104-MGS-8011-ccc-Fix-the-problem-of-syntax-error-at-doub.patch \ +" + +SRCREV_opencv = "71d3237a093b60a27601c20e9ee6c3e52154e8b1" SRCREV_contrib = "1ed3dd2c53888e3289afdb22ec4e9ebbff3dba87" # Add opencv_extra diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/fip-stm32mp/fip-stm32mp.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/fip-stm32mp/fip-stm32mp.bbappend index a81d717a9..2d08cd9c7 100644 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/fip-stm32mp/fip-stm32mp.bbappend +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/fip-stm32mp/fip-stm32mp.bbappend @@ -7,8 +7,8 @@ inherit sign-stm32mp-digi # Add optee-usb FIP configuration STM32MP_DEVICETREE_USB = " ${@' '.join('%s' % dt_file for dt_file in list(dict.fromkeys((d.getVar('STM32MP_DT_FILES_USB') or '').split())))} " -FIP_CONFIG[optee-usb] ?= "optee,${STM32MP_DEVICETREE_USB},default:optee,usb" -FIP_CONFIG += "${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', bb.utils.contains('BOOTDEVICE_LABELS', 'usb', 'optee-usb', '', d), '', d)}" +FIP_CONFIG[optee-usb] ?= "optee,${STM32MP_DEVICETREE_USB},,default:optee,usb" +FIP_CONFIG_ALL += "${@bb.utils.contains('BOOTSCHEME_LABELS', 'optee', bb.utils.contains('BOOTDEVICE_LABELS', 'usb', 'optee-usb', '', d), '', d)}" # Obtain password to use in FIP generation # Get password from file using the given key index @@ -37,6 +37,8 @@ do_deploy() { i=$(expr $i + 1) bl32_conf=$(echo ${FIP_BL32_CONF} | cut -d',' -f${i}) dt_config=$(echo ${FIP_DEVICETREE} | cut -d',' -f${i}) + dt_suffix=$(echo ${FIP_DEVICETREE_SUFFIX} | cut -d',' -f${i}) + [ "${EXTDT_USE_SUFFIX}" = "1" ] || dt_suffix="" search_conf=$(echo ${FIP_SEARCH_CONF} | cut -d',' -f${i}) device_conf=$(echo ${FIP_DEVICE_CONF} | cut -d',' -f${i}) for dt in ${dt_config}; do @@ -54,7 +56,9 @@ do_deploy() { unset k for soc in ${STM32MP_ENCRYPT_SOC_NAME}; do k=$(expr $k + 1) - [ "$(echo ${dt} | grep -c ${soc})" -eq 1 ] && encrypt_key=$(echo ${ENCRYPT_FIP_KEY_PATH_LIST} | cut -d',' -f${k}) + if [ "$(echo ${dt} | grep -c ${soc})" -eq 1 ] || [ "$(echo ${dt} | grep -c ${FIP_SOC_MATCH})" -eq 1 ] ;then + encrypt_key=$(echo ${ENCRYPT_FIP_KEY_PATH_LIST} | cut -d',' -f${k}) + fi done fi fi @@ -101,21 +105,26 @@ do_deploy() { STORAGE_SEARCH="" [ -z "${device_conf}" ] || STORAGE_SEARCH="--search-storage ${device_conf}" + # Configure devicetree suffix search + DT_SUFFIX_SEARCH="" + [ -z "${dt_suffix}" ] || DT_SUFFIX_SEARCH="--search-devicetree-suffix ${dt_suffix}" + FIP_PARAM_ddr="" if [ -d "${RECIPE_SYSROOT}/${FIP_DIR_TFA_BASE}/${FIP_DIR_FWDDR}" ]; then FIP_PARAM_ddr="--use-ddr" echo "********************************************" bbnote "[fip-utils-stm32mp] FIP DDR command details:\ - FIP_DEPLOYDIR_ROOT=${RECIPE_SYSROOT} \ - ${FIP_WRAPPER} \ - ${FIP_PARAM_BLxx} \ - ${FIP_PARAM_SIGN} \ - ${STORAGE_SEARCH} \ - --use-ddr --generate-only-ddr \ - --search-configuration ${config}\ - --search-devicetree ${dt} \ - --search-soc-name ${soc_suffix} \ - --output ${DEPLOYDIR}/${FIP_DIR_FIP}" + \nFIP_DEPLOYDIR_ROOT=${RECIPE_SYSROOT} \ + \n${FIP_WRAPPER} \ + \n${FIP_PARAM_BLxx} \ + \n${FIP_PARAM_SIGN} \ + \n${STORAGE_SEARCH} \ + \n--use-ddr --generate-only-ddr \ + \n--search-configuration ${config}\ + \n--search-devicetree ${dt} \ + \n${DT_SUFFIX_SEARCH} \ + \n--search-soc-name ${soc_suffix} \ + \n--output ${DEPLOYDIR}/${FIP_DIR_FIP}" echo "********************************************" FIP_DEPLOYDIR_ROOT="${RECIPE_SYSROOT}" \ ${FIP_WRAPPER} \ @@ -125,6 +134,7 @@ do_deploy() { --use-ddr --generate-only-ddr \ --search-configuration ${config}\ --search-devicetree ${dt} \ + ${DT_SUFFIX_SEARCH} \ --search-soc-name ${soc_suffix} \ --output ${DEPLOYDIR}/${FIP_DIR_FIP} fi @@ -142,6 +152,7 @@ do_deploy() { \n${SECOND_CONFSEARCH} \ \n--search-configuration ${config} \ \n--search-devicetree ${dt} \ + \n${DT_SUFFIX_SEARCH} \ \n--search-soc-name ${soc_suffix} \ \n--output ${DEPLOYDIR}/${FIP_DIR_FIP}" echo "****************************************" @@ -154,6 +165,7 @@ do_deploy() { ${SECOND_CONFSEARCH} \ --search-configuration ${config} \ --search-devicetree ${dt} \ + ${DT_SUFFIX_SEARCH} \ --search-soc-name ${soc_suffix} \ --output ${DEPLOYDIR}/${FIP_DIR_FIP} done diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_2.10.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_2.10.bbappend index 36f5e376b..539664690 100644 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_2.10.bbappend +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-bsp/trusted-firmware-a/tf-a-stm32mp_2.10.bbappend @@ -36,16 +36,16 @@ TF_A_CONFIG[opteemin-nand] ?= "\ ${TF_A_CONFIG_BASENAME_BIN},\ ${TF_A_CONFIG_MAKE_TARGET},\ ${TF_A_CONFIG_DEPLOY_FTYPE} ${TF_A_CONFIG_DEPLOY_EXTRA}" -# TF_A_CONFIG[uart] (same as 'optee-programmer-uart') -TF_A_CONFIG[uart] ?= "\ - ${STM32MP_DEVICETREE_PROGRAMMER},\ +# TF_A_CONFIG[optee-uart] (same as 'optee-programmer-uart') +TF_A_CONFIG[optee-uart] ?= "\ + ${STM32MP_DT_FILES_UART},\ ${TF_A_CONFIG_OPTS_optee} STM32MP_UART_PROGRAMMER=1,\ ${TF_A_CONFIG_BASENAME_BIN},\ ${TF_A_CONFIG_MAKE_TARGET} ${TF_A_CONFIG_MAKE_EXTRAS},\ ${TF_A_CONFIG_DEPLOY_FTYPE} ${TF_A_CONFIG_DEPLOY_EXTRA}" -# TF_A_CONFIG[usb] (same as 'optee-programmer-uart') -TF_A_CONFIG[usb] ?= "\ - ${STM32MP_DEVICETREE_PROGRAMMER},\ +# TF_A_CONFIG[optee-usb] (same as 'optee-programmer-usb') +TF_A_CONFIG[optee-usb] ?= "\ + ${STM32MP_DT_FILES_USB},\ ${TF_A_CONFIG_OPTS_optee} STM32MP_USB_PROGRAMMER=1,\ ${TF_A_CONFIG_BASENAME_BIN},\ ${TF_A_CONFIG_MAKE_TARGET} ${TF_A_CONFIG_MAKE_EXTRAS},\ @@ -97,6 +97,8 @@ do_compile() { i=$(expr $i + 1) # Initialize devicetree list, extra make options and tf-a basename dt_config=$(echo ${TF_A_DEVICETREE} | cut -d',' -f${i}) + dt_suffix=$(echo ${TF_A_DT_SUFFIX} | cut -d',' -f${i}) + [ "${EXTDT_USE_SUFFIX}" = "1" ] || dt_suffix="" extra_opt=$(echo ${TF_A_EXTRA_OPTFLAGS} | cut -d',' -f${i}) tfa_basename=$(echo ${TF_A_BINARIES} | cut -d',' -f${i}) tf_a_make_target=$(echo ${TF_A_MAKE_TARGET} | cut -d',' -f${i}) @@ -107,7 +109,7 @@ do_compile() { soc_name="" if [ -n "${STM32MP_SOC_NAME}" ]; then for soc in ${STM32MP_SOC_NAME}; do - if [ "$(echo ${dt} | grep -c ${soc})" -eq 1 ]; then + if [ "$(echo ${dt} | grep -c ${soc})" -eq 1 ] || [ "$(echo ${dt} | grep -c ${TF_A_SOC_MATCH})" -eq 1 ] ;then soc_extra_opt="$(echo ${soc} | awk '{print toupper($0)}')=1" soc_suffix="-${soc}" @@ -135,19 +137,20 @@ do_compile() { fi done fi - mkdir -p ${B}/${config}${soc_suffix}-${dt} + build_dir="${B}/${config}${soc_suffix}-${dt}${dt_suffix}" + mkdir -p "${build_dir}" if [ "${TF_A_ENABLE_METADATA}" = "1" ]; then - rm -rf "${B}/${config}${soc_suffix}-${dt}/${TF_A_METADATA_NAME}.${TF_A_METADATA_SUFFIX}" + rm -rf "${build_dir}/${TF_A_METADATA_NAME}.${TF_A_METADATA_SUFFIX}" ${TF_A_METADATA_TOOL} ${TF_A_METADATA_TOOL_ARGS} "${B}/${TF_A_METADATA_NAME}.${TF_A_METADATA_SUFFIX}" fi # generate dt to check the content - oe_runmake -C "${S}" BUILD_PLAT="${B}/${config}${soc_suffix}-${dt}" DTB_FILE_NAME="${dt}.dtb" ${extra_opt} ${soc_extra_opt} dtbs + oe_runmake -C "${S}" BUILD_PLAT="${build_dir}" DTB_FILE_NAME="${dt}${dt_suffix}.dtb" ${extra_opt} ${soc_extra_opt} dtbs # check which pmic1l is present on dtb - pcmi1_present=$(${STAGING_BINDIR_NATIVE}/fdtdump ${B}/${config}${soc_suffix}-${dt}/fdts/${dt}-bl2.dtb 2>/dev/null | grep -c "st,stpmic1l" || ${HOSTTOOLS_DIR}/true) - if [ -f "${B}/${config}${soc_suffix}-${dt}/fdts/${dt}-bl2.dtb" ]; then - if [ $pcmi1_present -gt 0 ]; then + if [ -f "${build_dir}/fdts/${dt}${dt_suffix}-bl2.dtb" ]; then + pcmi1_present=$(${STAGING_BINDIR_NATIVE}/fdtdump ${build_dir}/fdts/${dt}${dt_suffix}-bl2.dtb 2>/dev/null | grep -c "st,stpmic1l" || ${HOSTTOOLS_DIR}/true) + if [ "${pcmi1_present}" -gt 0 ]; then # st pmic1l is present, need to force to compilation with specific pcmi1l optionn soc_extra_opt="${soc_extra_opt} STM32MP_STPMIC1L=1" fi @@ -157,9 +160,9 @@ do_compile() { ddr_extra_opt="" if [ "${TF_A_FWDDR}" = "1" ]; then # Detect ddr type if it's present - if [ -f "${B}/${config}${soc_suffix}-${dt}/fdts/${dt}-bl2.dtb" ]; then - ddr_dtb_node=$(${STAGING_BINDIR_NATIVE}/fdtget -l ${B}/${config}${soc_suffix}-${dt}/fdts/${dt}-bl2.dtb /soc | grep ddr | head -n 1) - ddr_propertie=$(${STAGING_BINDIR_NATIVE}/fdtget ${B}/${config}${soc_suffix}-${dt}/fdts/${dt}-bl2.dtb /soc/${ddr_dtb_node} st,mem-name || echo "none") + if [ -f "${build_dir}/fdts/${dt}${dt_suffix}-bl2.dtb" ]; then + ddr_dtb_node=$(${STAGING_BINDIR_NATIVE}/fdtget -l ${build_dir}/fdts/${dt}${dt_suffix}-bl2.dtb /soc | grep ddr | head -n 1) + ddr_propertie=$(${STAGING_BINDIR_NATIVE}/fdtget ${build_dir}/fdts/${dt}${dt_suffix}-bl2.dtb /soc/${ddr_dtb_node} st,mem-name || echo "none") ddr_target="" # potentials value of ddr_propertie: # DDR3 16bits @@ -180,15 +183,15 @@ do_compile() { ddr_target="lpddr4" ;; *) - bbfatal "Missing st,mem-name information for ${dt}" + bbfatal "Missing st,mem-name information for ${dt}${dt_suffix}" ;; esac - bbnote "${dt}: ${tf_a_make_target} -> ${ddr_extra_opt}" + bbnote "${dt}${dt_suffix}: ${tf_a_make_target} -> ${ddr_extra_opt}" # Copy TF-A ddr binary with explicit devicetree filename if [ -s "${FWDDR_DIR}/${ddr_target}_pmu_train.bin" ]; then - install -m 644 "${FWDDR_DIR}/${ddr_target}_pmu_train.bin" "${B}/${config}${soc_suffix}-${dt}/${FWDDR_NAME}-${dt}-${config}.${FWDDR_SUFFIX}" + install -m 644 "${FWDDR_DIR}/${ddr_target}_pmu_train.bin" "${build_dir}/${FWDDR_NAME}-${dt}-${config}.${FWDDR_SUFFIX}" else - bbfatal "Missing ddr firmware file ${ddr_target}_pmu_train.bin for ${dt}" + bbfatal "Missing ddr firmware file ${ddr_target}_pmu_train.bin for ${dt}${dt_suffix}" fi fi fi @@ -200,7 +203,9 @@ do_compile() { unset k for soc in ${STM32MP_ENCRYPT_SOC_NAME}; do k=$(expr $k + 1) - [ "$(echo ${dt} | grep -c ${soc})" -eq 1 ] && encrypt_key=$(echo ${ENCRYPT_FIP_KEY_PATH_LIST} | cut -d',' -f${k}) + if [ "$(echo ${dt} | grep -c ${soc})" -eq 1 ] || [ "$(echo ${dt} | grep -c ${TF_A_SOC_MATCH})" -eq 1 ] ;then + encrypt_key=$(echo ${ENCRYPT_FIP_KEY_PATH_LIST} | cut -d',' -f${k}) + fi done fi if [ "$(file "${encrypt_key}" | sed 's#.*: \(.*\)$#\1#')" = "ASCII text" ]; then @@ -212,15 +217,15 @@ do_compile() { encrypt_extra_opt="ENC_KEY=${encrypt_key}" fi - oe_runmake -C "${S}" BUILD_PLAT="${B}/${config}${soc_suffix}-${dt}" DTB_FILE_NAME="${dt}.dtb" ${extra_opt} ${soc_extra_opt} ${ddr_extra_opt} ${encrypt_extra_opt} ${tf_a_make_target} - if [ -f "${B}/${config}${soc_suffix}-${dt}/bl2.bin" ]; then - cp "${B}/${config}${soc_suffix}-${dt}/bl2.bin" "${B}/${config}${soc_suffix}-${dt}/${tfa_basename}-${dt}-${config}.bin" + oe_runmake -C "${S}" BUILD_PLAT="${build_dir}" DTB_FILE_NAME="${dt}${dt_suffix}.dtb" ${extra_opt} ${soc_extra_opt} ${ddr_extra_opt} ${encrypt_extra_opt} ${tf_a_make_target} + if [ -f "${build_dir}/bl2.bin" ]; then + cp "${build_dir}/bl2.bin" "${build_dir}/${tfa_basename}-${dt}-${config}.bin" fi # Copy TF-A binary with explicit devicetree filename - if [ -f "${B}/${config}${soc_suffix}-${dt}/${tfa_basename}-${dt}.${TF_A_SUFFIX}" ]; then - cp "${B}/${config}${soc_suffix}-${dt}/${tfa_basename}-${dt}.${TF_A_SUFFIX}" "${B}/${config}${soc_suffix}-${dt}/${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" + if [ -f "${build_dir}/${tfa_basename}-${dt}${dt_suffix}.${TF_A_SUFFIX}" ]; then + cp "${build_dir}/${tfa_basename}-${dt}${dt_suffix}.${TF_A_SUFFIX}" "${build_dir}/${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" if [ "${TF_A_ENABLE_DEBUG_WRAPPER}" = "1" ]; then - stm32wrapper4dbg -s "${B}/${config}${soc_suffix}-${dt}/${tfa_basename}-${dt}.${TF_A_SUFFIX}" -d "${B}/${config}${soc_suffix}-${dt}/debug-${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" + stm32wrapper4dbg -s "${build_dir}/${tfa_basename}-${dt}${dt_suffix}.${TF_A_SUFFIX}" -d "${build_dir}/debug-${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" fi if [ "${SIGN_ENABLE}" = "1" ]; then @@ -244,7 +249,9 @@ do_compile() { unset k for soc in ${STM32MP_ENCRYPT_SOC_NAME}; do k=$(expr $k + 1) - [ "$(echo ${dt} | grep -c ${soc})" -eq 1 ] && encrypt_key=$(echo ${ENCRYPT_FSBL_KEY_PATH_LIST} | cut -d',' -f${k}) + if [ "$(echo ${dt} | grep -c ${soc})" -eq 1 ] || [ "$(echo ${dt} | grep -c ${TF_A_SOC_MATCH})" -eq 1 ] ;then + encrypt_key=$(echo ${ENCRYPT_FSBL_KEY_PATH_LIST} | cut -d',' -f${k}) + fi done fi # Set encryption options for signing tools @@ -256,8 +263,8 @@ do_compile() { fi # Sign tf-a binary bbnote "${SIGN_TOOL} \ - -bin "${B}/${config}${soc_suffix}-${dt}/${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" \ - -o "${B}/${config}${soc_suffix}-${dt}/${tfa_basename}-${dt}-${config}${TF_A_ENCRYPT_SUFFIX}${TF_A_SIGN_SUFFIX}.${TF_A_SUFFIX}" \ + -bin "${build_dir}/${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" \ + -o "${build_dir}/${tfa_basename}-${dt}-${config}${TF_A_ENCRYPT_SUFFIX}${TF_A_SIGN_SUFFIX}.${TF_A_SUFFIX}" \ --password ${SIGN_KEY_PASS} \ --public-key $(ls -1 $(dirname ${sign_key})/publicKey*.pem | tr '\n' '\t') \ --private-key ${sign_key} \ @@ -267,8 +274,8 @@ do_compile() { ${tf_a_encrypt_opts} " ${SIGN_TOOL} \ - -bin "${B}/${config}${soc_suffix}-${dt}/${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" \ - -o "${B}/${config}${soc_suffix}-${dt}/${tfa_basename}-${dt}-${config}${TF_A_ENCRYPT_SUFFIX}${TF_A_SIGN_SUFFIX}.${TF_A_SUFFIX}" \ + -bin "${build_dir}/${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" \ + -o "${build_dir}/${tfa_basename}-${dt}-${config}${TF_A_ENCRYPT_SUFFIX}${TF_A_SIGN_SUFFIX}.${TF_A_SUFFIX}" \ --password ${SIGN_KEY_PASS} \ --public-key $(ls -1 $(dirname ${sign_key})/publicKey*.pem | tr '\n' '\t') \ --private-key ${sign_key} \ @@ -278,8 +285,8 @@ do_compile() { ${tf_a_encrypt_opts} if [ "${TF_A_ENABLE_DEBUG_WRAPPER}" = "1" ]; then bbnote "${SIGN_TOOL} \ - -bin "${B}/${config}${soc_suffix}-${dt}/debug-${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" \ - -o "${B}/${config}${soc_suffix}-${dt}/debug-${tfa_basename}-${dt}-${config}${TF_A_ENCRYPT_SUFFIX}${TF_A_SIGN_SUFFIX}.${TF_A_SUFFIX}" \ + -bin "${build_dir}/debug-${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" \ + -o "${build_dir}/debug-${tfa_basename}-${dt}-${config}${TF_A_ENCRYPT_SUFFIX}${TF_A_SIGN_SUFFIX}.${TF_A_SUFFIX}" \ --password ${SIGN_KEY_PASS} \ --public-key $(ls -1 $(dirname ${sign_key})/publicKey*.pem | tr '\n' '\t') \ --private-key "${sign_key}" \ @@ -289,8 +296,8 @@ do_compile() { ${tf_a_encrypt_opts}" ${SIGN_TOOL} \ - -bin "${B}/${config}${soc_suffix}-${dt}/debug-${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" \ - -o "${B}/${config}${soc_suffix}-${dt}/debug-${tfa_basename}-${dt}-${config}${TF_A_ENCRYPT_SUFFIX}${TF_A_SIGN_SUFFIX}.${TF_A_SUFFIX}" \ + -bin "${build_dir}/debug-${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" \ + -o "${build_dir}/debug-${tfa_basename}-${dt}-${config}${TF_A_ENCRYPT_SUFFIX}${TF_A_SIGN_SUFFIX}.${TF_A_SUFFIX}" \ --password ${SIGN_KEY_PASS} \ --public-key $(ls -1 $(dirname ${sign_key})/publicKey*.pem | tr '\n' '\t') \ --private-key "${sign_key}" \ @@ -339,6 +346,125 @@ deploy_symlinks_atf() { fi } +export_binaries() { + local dest="${1}" + local fip_deploydir_tfa_base="${dest}" + local fip_deploydir_bl31="${dest}${FIP_DIR_BL31}" + local fip_deploydir_tfa="${dest}${FIP_DIR_TFA}" + local fip_deploydir_fwconf="${dest}${FIP_DIR_FWCONF}" + local fip_deploydir_fwddr="${dest}${FIP_DIR_FWDDR}" + + install -d ${fip_deploydir_tfa_base} + + unset i + for config in ${TF_A_CONFIG}; do + i=$(expr $i + 1) + # Initialize devicetree list and tf-a basename + dt_config=$(echo ${TF_A_DEVICETREE} | cut -d',' -f${i}) + dt_suffix=$(echo ${TF_A_DT_SUFFIX} | cut -d',' -f${i}) + [ "${EXTDT_USE_SUFFIX}" = "1" ] || dt_suffix="" + tfa_basename=$(echo ${TF_A_BINARIES} | cut -d',' -f${i}) + tfa_file_type=$(echo ${TF_A_FILES} | cut -d',' -f${i}) + for dt in ${dt_config}; do + # Init soc suffix + soc_suffix="" + if [ -n "${STM32MP_SOC_NAME}" ]; then + for soc in ${STM32MP_SOC_NAME}; do + [ "$(echo ${dt} | grep -c ${soc})" -eq 1 ] || [ "$(echo ${dt} | grep -c ${TF_A_SOC_MATCH})" -eq 1 ] && soc_suffix="-${soc}" + done + fi + build_dir="${B}/${config}${soc_suffix}-${dt}${dt_suffix}" + for file_type in ${tfa_file_type}; do + case "${file_type}" in + bl2) + # Install TF-A binary + if [ -f "${build_dir}/${tfa_basename}-${dt}-${config}.${TF_A_SUFFIX}" ]; then + install -m 644 "${build_dir}/${tfa_basename}-${dt}-${config}${TF_A_ENCRYPT_SUFFIX}${TF_A_SIGN_SUFFIX}.${TF_A_SUFFIX}" "${fip_deploydir_tfa_base}/" + if [ "${TF_A_ENABLE_DEBUG_WRAPPER}" = "1" ]; then + install -d "${fip_deploydir_tfa_base}/debug" + install -m 644 "${build_dir}/debug-${tfa_basename}-${dt}-${config}${TF_A_ENCRYPT_SUFFIX}${TF_A_SIGN_SUFFIX}.${TF_A_SUFFIX}" "${fip_deploydir_tfa_base}/debug/" + fi + fi + if [ -f "${build_dir}/${tfa_basename}-${dt}-${config}.bin" ]; then + install -d "${fip_deploydir_tfa_base}/bl2" + install -m 644 "${build_dir}/${tfa_basename}-${dt}-${config}.bin" "${fip_deploydir_tfa_base}/bl2/" + fi + if [ -n "${ELF_DEBUG_ENABLE}" ]; then + install -d "${fip_deploydir_tfa_base}/debug" + if [ -f "${build_dir}/${BL2_ELF}" ]; then + install -m 644 "${build_dir}/${BL2_ELF}" "${fip_deploydir_tfa_base}/debug/${tfa_basename}-${BL2_BASENAME_DEPLOY}${soc_suffix}-${config}.${TF_A_ELF_SUFFIX}" + fi + fi + if [ "${TF_A_FWDDR}" = "1" ]; then + install -d "${fip_deploydir_fwddr}" + # Install DDR firmware binary + if [ -f "${build_dir}/${FWDDR_NAME}-${dt}-${config}.${FWDDR_SUFFIX}" ]; then + install -m 644 "${build_dir}/${FWDDR_NAME}-${dt}-${config}.${FWDDR_SUFFIX}" "${fip_deploydir_fwddr}/" + fi + fi + ;; + bl31) + # Install BL31 files + install -d "${fip_deploydir_bl31}" + # Install BL31 binary + if [ -f "${build_dir}/${BL31_BASENAME}.${BL31_SUFFIX}" ]; then + install -m 644 "${build_dir}/${BL31_BASENAME}.${BL31_SUFFIX}" "${fip_deploydir_bl31}/${tfa_basename}-${BL31_BASENAME_DEPLOY}-${dt}${dt_suffix}-${config}.${BL31_SUFFIX}" + fi + # Install BL31 devicetree + if [ -f "${build_dir}/fdts/${dt}${dt_suffix}-${BL31_BASENAME}.${DT_SUFFIX}" ]; then + install -m 644 "${build_dir}/fdts/${dt}${dt_suffix}-${BL31_BASENAME}.${DT_SUFFIX}" "${fip_deploydir_bl31}/${dt}${dt_suffix}-${BL31_BASENAME}-${config}.${DT_SUFFIX}" + fi + if [ -n "${ELF_DEBUG_ENABLE}" ]; then + install -d "${fip_deploydir_bl31}/debug" + if [ -f "${build_dir}/${BL31_ELF}" ]; then + install -m 644 "${build_dir}/${BL31_ELF}" "${fip_deploydir_bl31}/debug/${tfa_basename}-${BL31_BASENAME_DEPLOY}-${dt}${dt_suffix}-${config}.${TF_A_ELF_SUFFIX}" + fi + fi + ;; + bl32) + # Install BL32 files + install -d "${fip_deploydir_tfa}" + # Install BL32 binary + if [ -f "${build_dir}/${BL32_BASENAME}.${BL32_SUFFIX}" ]; then + install -m 644 "${build_dir}/${BL32_BASENAME}.${BL32_SUFFIX}" "${fip_deploydir_tfa}/${tfa_basename}-${BL32_BASENAME_DEPLOY}${soc_suffix}-${config}.${BL32_SUFFIX}" + fi + # Install BL32 devicetree + if [ -f "${build_dir}/fdts/${dt}${dt_suffix}-${BL32_BASENAME}.${DT_SUFFIX}" ]; then + install -m 644 "${build_dir}/fdts/${dt}${dt_suffix}-${BL32_BASENAME}.${DT_SUFFIX}" "${fip_deploydir_tfa}/${dt}${dt_suffix}-${BL32_BASENAME}-${config}.${DT_SUFFIX}" + fi + if [ -n "${ELF_DEBUG_ENABLE}" ]; then + install -d "${fip_deploydir_tfa}/debug" + if [ -f "${build_dir}/${BL32_ELF}" ]; then + install -m 644 "${build_dir}/${BL32_ELF}" "${fip_deploydir_tfa}/debug/${tfa_basename}-${BL32_BASENAME_DEPLOY}${soc_suffix}-${config}.${TF_A_ELF_SUFFIX}" + fi + fi + ;; + fwconfig) + # Install fwconfig + install -d "${fip_deploydir_fwconf}" + if [ -f "${build_dir}/fdts/${dt}${dt_suffix}-${FWCONFIG_NAME}.${DT_SUFFIX}" ]; then + install -m 644 "${build_dir}/fdts/${dt}${dt_suffix}-${FWCONFIG_NAME}.${DT_SUFFIX}" "${fip_deploydir_fwconf}/${dt}${dt_suffix}-${FWCONFIG_NAME}-${config}.${DT_SUFFIX}" + fi + ;; + esac + done # for file_type in ${tfa_file_type} + done # for dt in ${dt_config} + if [ -n "${ELF_DEBUG_ENABLE}" ]; then + install -d "${fip_deploydir_tfa_base}/debug" + if [ -f "${build_dir}/${BL1_ELF}" ]; then + install -m 644 "${build_dir}/${BL1_ELF}" "${fip_deploydir_tfa_base}/debug/${tfa_basename}-${BL1_BASENAME_DEPLOY}-${config}.${TF_A_ELF_SUFFIX}" + fi + fi + done # for config in ${TF_A_CONFIG} + + if [ "${TF_A_ENABLE_METADATA}" = "1" ]; then + install -d "${fip_deploydir_tfa_base}" + if [ -f "${B}/${TF_A_METADATA_NAME}.${TF_A_METADATA_SUFFIX}" ]; then + install -m 644 "${B}/${TF_A_METADATA_NAME}.${TF_A_METADATA_SUFFIX}" "${fip_deploydir_tfa_base}/${TF_A_METADATA_BINARY}" + fi + fi +} + do_deploy[sstate-outputdirs] = "${DEPLOY_DIR_IMAGE}" do_deploy() { export_binaries ${DEPLOYDIR}${FIP_DIR_TFA_BASE} diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-extended/stm32mp2projects/m33projects-stm32mp2.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-extended/stm32mp2projects/m33projects-stm32mp2.bbappend new file mode 100644 index 000000000..ad26a9273 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-extended/stm32mp2projects/m33projects-stm32mp2.bbappend @@ -0,0 +1,18 @@ +# +# Copyright (C) 2025, Digi International Inc. +# + +# Inherit custom DIGI sign class to skip signing tool and key parsing restrictions +inherit sign-stm32mp-digi + +# Obtain password to use in m33 generation +# Get password from file using the given key index +do_compile[prefuncs] += "${@oe.utils.conditional('TRUSTFENCE_SIGN', '1', 'set_m33_sign_key', '', d)}" +python set_m33_sign_key() { + passfile = d.getVar('TRUSTFENCE_COPRO_PASSWORD_FILE') + if (os.path.isfile(passfile)): + with open(passfile, "r") as file: + p = file.read().strip() + if (p): + d.setVar('SIGN_COPRO_ECC_PASS_%s' % (d.getVar('STM32MP_SOC_NAME').strip()), p); +} diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0005-Revert-libweston-libinput-device-Enable-Set-pointer-.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0005-Revert-libweston-libinput-device-Enable-Set-pointer-.patch deleted file mode 100644 index 756dbd546..000000000 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0005-Revert-libweston-libinput-device-Enable-Set-pointer-.patch +++ /dev/null @@ -1,92 +0,0 @@ -From: Haihua Hu -Date: Wed, 3 Aug 2022 16:34:47 +0800 -Subject: [PATCH] Revert "libweston/libinput-device: Enable/Set pointer - capabilities only on pointer movement" - -This reverts commit e825fe389ebd63470028abd828019840c1170a03. - -This commit will cause waylandsink cannot register pointer seat. -As a result, mouse cannot move waylandsink window - -(cherry picked from commit 3f8f336b5d2cf7ea7aa4e047d669d093fc46dfe6) - -Upstream-Status: Inappropriate [DEY specific] ---- - libweston/libinput-device.c | 29 +++++------------------------ - 1 file changed, 5 insertions(+), 24 deletions(-) - -diff --git a/libweston/libinput-device.c b/libweston/libinput-device.c -index 4ea89de0..2d7a7d5f 100644 ---- a/libweston/libinput-device.c -+++ b/libweston/libinput-device.c -@@ -60,21 +60,6 @@ evdev_led_update(struct evdev_device *device, enum weston_led weston_leds) - libinput_device_led_update(device->device, leds); - } - --static void --ensure_pointer_capability(struct libinput_device *libinput_device) --{ -- struct evdev_device *device = libinput_device_get_user_data(libinput_device); -- struct weston_seat *seat = device->seat; -- -- if (!libinput_device_has_capability(libinput_device, LIBINPUT_DEVICE_CAP_POINTER)) -- return; -- -- if (!(device->seat_caps & EVDEV_SEAT_POINTER)) { -- weston_seat_init_pointer(seat); -- device->seat_caps |= EVDEV_SEAT_POINTER; -- } --} -- - static void - handle_keyboard_key(struct libinput_device *libinput_device, - struct libinput_event_keyboard *keyboard_event) -@@ -112,8 +97,6 @@ handle_pointer_motion(struct libinput_device *libinput_device, - struct timespec time; - double dx_unaccel, dy_unaccel; - -- ensure_pointer_capability(libinput_device); -- - timespec_from_usec(&time, - libinput_event_pointer_get_time_usec(pointer_event)); - dx_unaccel = libinput_event_pointer_get_dx_unaccelerated(pointer_event); -@@ -146,8 +129,6 @@ handle_pointer_motion_absolute( - double x, y; - uint32_t width, height; - -- ensure_pointer_capability(libinput_device); -- - if (!output) - return false; - -@@ -179,8 +160,6 @@ handle_pointer_button(struct libinput_device *libinput_device, - libinput_event_pointer_get_seat_button_count(pointer_event); - struct timespec time; - -- ensure_pointer_capability(libinput_device); -- - /* Ignore button events that are not seat wide state changes. */ - if ((button_state == LIBINPUT_BUTTON_STATE_PRESSED && - seat_button_count != 1) || -@@ -260,8 +239,6 @@ handle_pointer_axis(struct libinput_device *libinput_device, - bool has_vert, has_horiz; - struct timespec time; - -- ensure_pointer_capability(libinput_device); -- - has_vert = libinput_event_pointer_has_axis(pointer_event, - LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL); - has_horiz = libinput_event_pointer_has_axis(pointer_event, -@@ -738,7 +715,11 @@ evdev_device_create(struct libinput_device *libinput_device, - - device->seat_caps |= EVDEV_SEAT_KEYBOARD; - } -- -+ if (libinput_device_has_capability(libinput_device, -+ LIBINPUT_DEVICE_CAP_POINTER)) { -+ weston_seat_init_pointer(seat); -+ device->seat_caps |= EVDEV_SEAT_POINTER; -+ } - if (libinput_device_has_capability(libinput_device, - LIBINPUT_DEVICE_CAP_TOUCH)) { - if (weston_seat_init_touch(seat) < 0) { diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0006-Restore-wl_shell-to-weston-13.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0006-Restore-wl_shell-to-weston-13.patch deleted file mode 100644 index 3a05c5708..000000000 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston/0006-Restore-wl_shell-to-weston-13.patch +++ /dev/null @@ -1,943 +0,0 @@ -From: Gabriel Valcazar -Date: Fri, 19 Jan 2024 09:45:19 +0100 -Subject: [PATCH] Restore wl_shell to weston 13 - -This shell was deprecated some time ago and removed in weston 11, but it's the -default shell used by LVGL's wayland backend. Until we migrate said backend to -use xdg_shell, restore wl_shell in weston 13. - -This reverts the following commits: - - * d40cedc8af9a42e1f6746fb58f4556080c6ff133 - * 7cae2a1fb0aeec24ca33ac4c7cbb268f77095cb5 - * e6b8f5a5e40cd6c0b934e8ae079c86d5193efa96 - -Upstream-Status: Inappropriate [DEY specific] - -Signed-off-by: Gabriel Valcazar ---- - desktop-shell/shell.c | 26 +- - libweston/backend-wayland/wayland.c | 87 ++++- - libweston/desktop/internal.h | 4 + - libweston/desktop/libweston-desktop.c | 19 + - libweston/desktop/meson.build | 1 + - libweston/desktop/wl-shell.c | 505 ++++++++++++++++++++++++++ - meson.build | 6 + - meson_options.txt | 7 + - 8 files changed, 638 insertions(+), 17 deletions(-) - create mode 100644 libweston/desktop/wl-shell.c - -diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c -index 084e6029..ed394ff8 100644 ---- a/desktop-shell/shell.c -+++ b/desktop-shell/shell.c -@@ -1337,16 +1337,16 @@ resize_grab_motion(struct weston_pointer_grab *grab, - to_y = wl_fixed_from_double(tmp_s.c.y); - - width = resize->width; -- if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_LEFT) { -+ if (resize->edges & WL_SHELL_SURFACE_RESIZE_LEFT) { - width += wl_fixed_to_int(from_x - to_x); -- } else if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_RIGHT) { -+ } else if (resize->edges & WL_SHELL_SURFACE_RESIZE_RIGHT) { - width += wl_fixed_to_int(to_x - from_x); - } - - height = resize->height; -- if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_TOP) { -+ if (resize->edges & WL_SHELL_SURFACE_RESIZE_TOP) { - height += wl_fixed_to_int(from_y - to_y); -- } else if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_BOTTOM) { -+ } else if (resize->edges & WL_SHELL_SURFACE_RESIZE_BOTTOM) { - height += wl_fixed_to_int(to_y - from_y); - } - -@@ -1424,9 +1424,9 @@ surface_resize(struct shell_surface *shsurf, - { - struct weston_resize_grab *resize; - const unsigned resize_topbottom = -- WESTON_DESKTOP_SURFACE_EDGE_TOP | WESTON_DESKTOP_SURFACE_EDGE_BOTTOM; -+ WL_SHELL_SURFACE_RESIZE_TOP | WL_SHELL_SURFACE_RESIZE_BOTTOM; - const unsigned resize_leftright = -- WESTON_DESKTOP_SURFACE_EDGE_LEFT | WESTON_DESKTOP_SURFACE_EDGE_RIGHT; -+ WL_SHELL_SURFACE_RESIZE_LEFT | WL_SHELL_SURFACE_RESIZE_RIGHT; - const unsigned resize_any = resize_topbottom | resize_leftright; - struct weston_geometry geometry; - -@@ -1434,7 +1434,7 @@ surface_resize(struct shell_surface *shsurf, - return 0; - - /* Check for invalid edge combinations. */ -- if (edges == WESTON_DESKTOP_SURFACE_EDGE_NONE || edges > resize_any || -+ if (edges == WL_SHELL_SURFACE_RESIZE_NONE || edges > resize_any || - (edges & resize_topbottom) == resize_topbottom || - (edges & resize_leftright) == resize_leftright) - return 0; -@@ -2385,9 +2385,9 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface, - offset.c.y = 0; - } - -- if (shsurf->resize_edges & WESTON_DESKTOP_SURFACE_EDGE_LEFT) -+ if (shsurf->resize_edges & WL_SHELL_SURFACE_RESIZE_LEFT) - offset.c.x = shsurf->last_width - surface->width; -- if (shsurf->resize_edges & WESTON_DESKTOP_SURFACE_EDGE_TOP) -+ if (shsurf->resize_edges & WL_SHELL_SURFACE_RESIZE_TOP) - offset.c.y = shsurf->last_height - surface->height; - - pos = weston_view_get_pos_offset_global(view); -@@ -3312,18 +3312,18 @@ resize_binding(struct weston_pointer *pointer, const struct timespec *time, - y = surf_pos.c.y; - - if (x < surface->width / 3) -- edges |= WESTON_DESKTOP_SURFACE_EDGE_LEFT; -+ edges |= WL_SHELL_SURFACE_RESIZE_LEFT; - else if (x < 2 * surface->width / 3) - edges |= 0; - else -- edges |= WESTON_DESKTOP_SURFACE_EDGE_RIGHT; -+ edges |= WL_SHELL_SURFACE_RESIZE_RIGHT; - - if (y < surface->height / 3) -- edges |= WESTON_DESKTOP_SURFACE_EDGE_TOP; -+ edges |= WL_SHELL_SURFACE_RESIZE_TOP; - else if (y < 2 * surface->height / 3) - edges |= 0; - else -- edges |= WESTON_DESKTOP_SURFACE_EDGE_BOTTOM; -+ edges |= WL_SHELL_SURFACE_RESIZE_BOTTOM; - - surface_resize(shsurf, pointer, edges); - } -diff --git a/libweston/backend-wayland/wayland.c b/libweston/backend-wayland/wayland.c -index 892c5b0c..733931ff 100644 ---- a/libweston/backend-wayland/wayland.c -+++ b/libweston/backend-wayland/wayland.c -@@ -85,6 +85,7 @@ struct wayland_backend { - struct wl_display *wl_display; - struct wl_registry *registry; - struct wl_compositor *compositor; -+ struct wl_shell *shell; - struct xdg_wm_base *xdg_wm_base; - struct zwp_fullscreen_shell_v1 *fshell; - struct wl_shm *shm; -@@ -123,6 +124,7 @@ struct wayland_output { - struct wl_output *output; - uint32_t global_id; - -+ struct wl_shell_surface *shell_surface; - struct xdg_surface *xdg_surface; - struct xdg_toplevel *xdg_toplevel; - int configure_width, configure_height; -@@ -666,6 +668,11 @@ wayland_backend_destroy_output_surface(struct wayland_output *output) - output->parent.xdg_surface = NULL; - } - -+ if (output->parent.shell_surface) { -+ wl_shell_surface_destroy(output->parent.shell_surface); -+ output->parent.shell_surface = NULL; -+ } -+ - wl_surface_destroy(output->parent.surface); - output->parent.surface = NULL; - } -@@ -743,6 +750,8 @@ wayland_output_destroy(struct weston_output *base) - free(output); - } - -+static const struct wl_shell_surface_listener shell_surface_listener; -+ - #ifdef ENABLE_EGL - static int - wayland_output_init_gl_renderer(struct wayland_output *output) -@@ -905,6 +914,8 @@ wayland_output_set_windowed(struct wayland_output *output) - - if (output->parent.xdg_toplevel) { - xdg_toplevel_unset_fullscreen(output->parent.xdg_toplevel); -+ } else if (output->parent.shell_surface) { -+ wl_shell_surface_set_toplevel(output->parent.shell_surface); - } else { - abort(); - } -@@ -914,6 +925,7 @@ wayland_output_set_windowed(struct wayland_output *output) - - static void - wayland_output_set_fullscreen(struct wayland_output *output, -+ enum wl_shell_surface_fullscreen_method method, - uint32_t framerate, struct wl_output *target) - { - if (output->frame) { -@@ -925,6 +937,9 @@ wayland_output_set_fullscreen(struct wayland_output *output, - - if (output->parent.xdg_toplevel) { - xdg_toplevel_set_fullscreen(output->parent.xdg_toplevel, target); -+ } else if (output->parent.shell_surface) { -+ wl_shell_surface_set_fullscreen(output->parent.shell_surface, -+ method, framerate, target); - } else { - abort(); - } -@@ -1150,7 +1165,7 @@ wayland_output_switch_mode(struct weston_output *output_base, - - if (output->parent.xdg_surface) - return wayland_output_switch_mode_xdg(output, mode); -- if (output->backend->parent.fshell) -+ if (output->backend->parent.fshell || output->parent.shell_surface) - return wayland_output_switch_mode_fshell(output, mode); - - return -1; -@@ -1263,6 +1278,20 @@ wayland_backend_create_output_surface(struct wayland_output *output) - - weston_log("wayland-backend: Using xdg_wm_base\n"); - } -+ else if (b->parent.shell) { -+ output->parent.shell_surface = -+ wl_shell_get_shell_surface(b->parent.shell, -+ output->parent.surface); -+ if (!output->parent.shell_surface) { -+ wl_surface_destroy(output->parent.surface); -+ return -1; -+ } -+ -+ wl_shell_surface_add_listener(output->parent.shell_surface, -+ &shell_surface_listener, output); -+ -+ weston_log("wayland-backend: Using wl_shell\n"); -+ } - - return 0; - } -@@ -1334,9 +1363,13 @@ wayland_output_enable(struct weston_output *base) - - output->parent.draw_initial_frame = true; - } -+ } else { -+ wayland_output_set_fullscreen(output, -+ WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER, -+ output->mode.refresh, output->parent.output); - } - } else if (b->fullscreen) { -- wayland_output_set_fullscreen(output, 0, NULL); -+ wayland_output_set_fullscreen(output, 0, 0, NULL); - } else { - wayland_output_set_windowed(output); - } -@@ -1625,10 +1658,13 @@ wayland_output_setup_fullscreen(struct wayland_output *output, - return -1; - - /* What should size be set if conditional is false? */ -- if (b->parent.xdg_wm_base) { -+ if (b->parent.xdg_wm_base || b->parent.shell) { - if (output->parent.xdg_toplevel) - xdg_toplevel_set_fullscreen(output->parent.xdg_toplevel, - output->parent.output); -+ else if (output->parent.shell_surface) -+ wl_shell_surface_set_fullscreen(output->parent.shell_surface, -+ 0, 0, NULL); - - wl_display_roundtrip(b->parent.wl_display); - -@@ -1652,6 +1688,36 @@ err_set_size: - return -1; - } - -+static void -+shell_surface_ping(void *data, struct wl_shell_surface *shell_surface, -+ uint32_t serial) -+{ -+ wl_shell_surface_pong(shell_surface, serial); -+} -+ -+static void -+shell_surface_configure(void *data, struct wl_shell_surface *shell_surface, -+ uint32_t edges, int32_t width, int32_t height) -+{ -+ struct wayland_output *output = data; -+ -+ output->parent.configure_width = width; -+ output->parent.configure_height = height; -+ -+ /* FIXME: implement resizing */ -+} -+ -+static void -+shell_surface_popup_done(void *data, struct wl_shell_surface *shell_surface) -+{ -+} -+ -+static const struct wl_shell_surface_listener shell_surface_listener = { -+ shell_surface_ping, -+ shell_surface_configure, -+ shell_surface_popup_done -+}; -+ - /* Events received from the wayland-server this compositor is client of: */ - - /* parent input interface */ -@@ -1833,6 +1899,9 @@ input_handle_button(void *data, struct wl_pointer *pointer, - if (input->output->parent.xdg_toplevel) - xdg_toplevel_move(input->output->parent.xdg_toplevel, - input->parent.seat, serial); -+ else if (input->output->parent.shell_surface) -+ wl_shell_surface_move(input->output->parent.shell_surface, -+ input->parent.seat, serial); - frame_status_clear(input->output->frame, - FRAME_STATUS_MOVE); - return; -@@ -2194,6 +2263,9 @@ input_handle_touch_down(void *data, struct wl_touch *wl_touch, - if (output->parent.xdg_toplevel) - xdg_toplevel_move(output->parent.xdg_toplevel, - input->parent.seat, serial); -+ else if (output->parent.shell_surface) -+ wl_shell_surface_move(output->parent.shell_surface, -+ input->parent.seat, serial); - frame_status_clear(output->frame, - FRAME_STATUS_MOVE); - return; -@@ -2708,6 +2780,10 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t name, - &xdg_wm_base_interface, 1); - xdg_wm_base_add_listener(b->parent.xdg_wm_base, - &wm_base_listener, b); -+ } else if (strcmp(interface, "wl_shell") == 0) { -+ b->parent.shell = -+ wl_registry_bind(registry, name, -+ &wl_shell_interface, 1); - } else if (strcmp(interface, "zwp_fullscreen_shell_v1") == 0) { - b->parent.fshell = - wl_registry_bind(registry, name, -@@ -2809,6 +2885,9 @@ wayland_destroy(struct weston_backend *backend) - if (b->parent.xdg_wm_base) - xdg_wm_base_destroy(b->parent.xdg_wm_base); - -+ if (b->parent.shell) -+ wl_shell_destroy(b->parent.shell); -+ - if (b->parent.fshell) - zwp_fullscreen_shell_v1_release(b->parent.fshell); - -@@ -2880,7 +2959,7 @@ fullscreen_binding(struct weston_keyboard *keyboard, - return; - - if (input->output->frame) -- wayland_output_set_fullscreen(input->output, 0, NULL); -+ wayland_output_set_fullscreen(input->output, 0, 0, NULL); - else - wayland_output_set_windowed(input->output); - -diff --git a/libweston/desktop/internal.h b/libweston/desktop/internal.h -index 74a65f96..a7a39046 100644 ---- a/libweston/desktop/internal.h -+++ b/libweston/desktop/internal.h -@@ -249,6 +249,10 @@ weston_desktop_xdg_wm_base_create(struct weston_desktop *desktop, - struct wl_global * - weston_desktop_xdg_shell_v6_create(struct weston_desktop *desktop, - struct wl_display *display); -+struct wl_global * -+weston_desktop_wl_shell_create(struct weston_desktop *desktop, -+ struct wl_display *display); -+ - void - weston_desktop_xwayland_init(struct weston_desktop *desktop); - void -diff --git a/libweston/desktop/libweston-desktop.c b/libweston/desktop/libweston-desktop.c -index 5923e40f..f01678d1 100644 ---- a/libweston/desktop/libweston-desktop.c -+++ b/libweston/desktop/libweston-desktop.c -@@ -42,6 +42,7 @@ struct weston_desktop { - void *user_data; - struct wl_global *xdg_wm_base; /* Stable protocol xdg_shell replaces xdg_shell_unstable_v6 */ - struct wl_global *xdg_shell_v6; /* Unstable xdg_shell_unstable_v6 protocol. */ -+ struct wl_global *wl_shell; - }; - - void -@@ -76,6 +77,22 @@ weston_desktop_create(struct weston_compositor *compositor, - return NULL; - } - -+#ifdef HAVE_DEPRECATED_WL_SHELL -+ weston_log("Warning: support for deprecated wl_shell interface is " -+ "enabled. Please migrate legacy clients to xdg-shell.\n"); -+ desktop->wl_shell = -+ weston_desktop_wl_shell_create(desktop, display); -+ if (desktop->wl_shell == NULL) { -+ weston_desktop_destroy(desktop); -+ return NULL; -+ } -+#else -+ weston_log("Note: support for the deprecated wl_shell interface is " -+ "disabled. If a legacy client still needs it, it can be " -+ "re-enabled by passing -Ddeprecated-wl-shell=true to Meson " -+ "when building Weston.\n"); -+#endif -+ - weston_desktop_xwayland_init(desktop); - - return desktop; -@@ -89,6 +106,8 @@ weston_desktop_destroy(struct weston_desktop *desktop) - - weston_desktop_xwayland_fini(desktop); - -+ if (desktop->wl_shell != NULL) -+ wl_global_destroy(desktop->wl_shell); - if (desktop->xdg_shell_v6 != NULL) - wl_global_destroy(desktop->xdg_shell_v6); - if (desktop->xdg_wm_base != NULL) -diff --git a/libweston/desktop/meson.build b/libweston/desktop/meson.build -index 4588ad10..d8e1a709 100644 ---- a/libweston/desktop/meson.build -+++ b/libweston/desktop/meson.build -@@ -4,6 +4,7 @@ srcs_libweston += files([ - 'seat.c', - 'surface.c', - 'xwayland.c', -+ 'wl-shell.c', - 'xdg-shell.c', - 'xdg-shell-v6.c', - ]) -diff --git a/libweston/desktop/wl-shell.c b/libweston/desktop/wl-shell.c -new file mode 100644 -index 00000000..74140b4d ---- /dev/null -+++ b/libweston/desktop/wl-shell.c -@@ -0,0 +1,505 @@ -+/* -+ * Copyright © 2010-2012 Intel Corporation -+ * Copyright © 2011-2012 Collabora, Ltd. -+ * Copyright © 2013 Raspberry Pi Foundation -+ * Copyright © 2016 Quentin "Sardem FF7" Glidic -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the "Software"), -+ * to deal in the Software without restriction, including without limitation -+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, -+ * and/or sell copies of the Software, and to permit persons to whom the -+ * Software is furnished to do so, subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the next -+ * paragraph) shall be included in all copies or substantial portions of the -+ * Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ * DEALINGS IN THE SOFTWARE. -+ */ -+ -+#include "config.h" -+ -+#include -+ -+#include -+ -+#include -+#include -+ -+#include -+#include "internal.h" -+ -+#define WD_WL_SHELL_PROTOCOL_VERSION 1 -+ -+enum weston_desktop_wl_shell_surface_state { -+ NONE, -+ TOPLEVEL, -+ MAXIMIZED, -+ FULLSCREEN, -+ TRANSIENT, -+ POPUP, -+}; -+ -+struct weston_desktop_wl_shell_surface { -+ struct wl_resource *resource; -+ struct weston_desktop *desktop; -+ struct wl_display *display; -+ struct weston_desktop_surface *surface; -+ struct weston_desktop_surface *parent; -+ bool added; -+ struct weston_desktop_seat *popup_seat; -+ enum weston_desktop_wl_shell_surface_state state; -+ struct wl_listener wl_surface_resource_destroy_listener; -+}; -+ -+static void -+weston_desktop_wl_shell_surface_set_size(struct weston_desktop_surface *dsurface, -+ void *user_data, -+ int32_t width, int32_t height) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ struct weston_surface *wsurface = -+ weston_desktop_surface_get_surface(surface->surface); -+ -+ if ((wsurface->width == width && wsurface->height == height) || -+ (width == 0 && height == 0)) -+ return; -+ -+ wl_shell_surface_send_configure(surface->resource, -+ WL_SHELL_SURFACE_RESIZE_NONE, -+ width, height); -+} -+ -+static void -+weston_desktop_wl_shell_surface_maybe_ungrab(struct weston_desktop_wl_shell_surface *surface) -+{ -+ if (surface->state != POPUP || -+ !weston_desktop_surface_get_grab(surface->surface)) -+ return; -+ -+ weston_desktop_surface_popup_ungrab(surface->surface, -+ surface->popup_seat); -+ surface->popup_seat = NULL; -+} -+ -+static void -+weston_desktop_wl_shell_surface_committed(struct weston_desktop_surface *dsurface, -+ void *user_data, -+ struct weston_coord_surface c) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ struct weston_surface *wsurface = -+ weston_desktop_surface_get_surface(dsurface); -+ -+ if (wsurface->buffer_ref.buffer == NULL) -+ weston_desktop_wl_shell_surface_maybe_ungrab(surface); -+ -+ if (surface->added) -+ weston_desktop_api_committed(surface->desktop, surface->surface, -+ c); -+} -+ -+static void -+weston_desktop_wl_shell_surface_ping(struct weston_desktop_surface *dsurface, -+ uint32_t serial, void *user_data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ -+ wl_shell_surface_send_ping(surface->resource, serial); -+} -+ -+static void -+weston_desktop_wl_shell_surface_close(struct weston_desktop_surface *dsurface, -+ void *user_data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ -+ if (surface->state == POPUP) -+ wl_shell_surface_send_popup_done(surface->resource); -+} -+ -+static bool -+weston_desktop_wl_shell_surface_get_maximized(struct weston_desktop_surface *dsurface, -+ void *user_data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ -+ return surface->state == MAXIMIZED; -+} -+ -+static bool -+weston_desktop_wl_shell_surface_get_fullscreen(struct weston_desktop_surface *dsurface, -+ void *user_data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ -+ return surface->state == FULLSCREEN; -+} -+ -+static void -+weston_desktop_wl_shell_change_state(struct weston_desktop_wl_shell_surface *surface, -+ enum weston_desktop_wl_shell_surface_state state, -+ struct weston_desktop_surface *parent, -+ const struct weston_coord_surface *offset) -+{ -+ bool to_add = (parent == NULL); -+ -+ assert(state != NONE); -+ -+ if (to_add && surface->added) { -+ surface->state = state; -+ return; -+ } -+ -+ if (surface->state != state) { -+ if (surface->state == POPUP) -+ weston_desktop_wl_shell_surface_maybe_ungrab(surface); -+ -+ if (to_add) { -+ weston_desktop_surface_unset_relative_to(surface->surface); -+ weston_desktop_api_surface_added(surface->desktop, -+ surface->surface); -+ } else if (surface->added) { -+ weston_desktop_api_surface_removed(surface->desktop, -+ surface->surface); -+ } -+ -+ surface->state = state; -+ surface->added = to_add; -+ } -+ -+ if (parent != NULL) -+ weston_desktop_surface_set_relative_to(surface->surface, parent, -+ *offset, false); -+} -+ -+static void -+weston_desktop_wl_shell_surface_destroy(struct weston_desktop_surface *dsurface, -+ void *user_data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ -+ wl_list_remove(&surface->wl_surface_resource_destroy_listener.link); -+ -+ weston_desktop_wl_shell_surface_maybe_ungrab(surface); -+ weston_desktop_surface_unset_relative_to(surface->surface); -+ if (surface->added) -+ weston_desktop_api_surface_removed(surface->desktop, -+ surface->surface); -+ -+ free(surface); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_pong(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ uint32_t serial) -+{ -+ struct weston_desktop_surface *surface = wl_resource_get_user_data(resource); -+ -+ weston_desktop_client_pong(weston_desktop_surface_get_client(surface), serial); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_move(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ struct wl_resource *seat_resource, -+ uint32_t serial) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_seat *seat = -+ wl_resource_get_user_data(seat_resource); -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ -+ if (seat == NULL) -+ return; -+ -+ weston_desktop_api_move(surface->desktop, dsurface, seat, serial); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_resize(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ struct wl_resource *seat_resource, -+ uint32_t serial, -+ enum wl_shell_surface_resize edges) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_seat *seat = wl_resource_get_user_data(seat_resource); -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ enum weston_desktop_surface_edge surf_edges = -+ (enum weston_desktop_surface_edge) edges; -+ -+ if (seat == NULL) -+ return; -+ -+ weston_desktop_api_resize(surface->desktop, dsurface, seat, serial, surf_edges); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_toplevel(struct wl_client *wl_client, -+ struct wl_resource *resource) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ -+ weston_desktop_wl_shell_change_state(surface, TOPLEVEL, NULL, NULL); -+ if (surface->parent == NULL) -+ return; -+ surface->parent = NULL; -+ weston_desktop_api_set_parent(surface->desktop, surface->surface, NULL); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_transient(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ struct wl_resource *parent_resource, -+ int32_t x, int32_t y, -+ enum wl_shell_surface_transient flags) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_surface *wparent = -+ wl_resource_get_user_data(parent_resource); -+ struct weston_desktop_surface *parent; -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ struct weston_surface *wsurface; -+ struct weston_coord_surface offset; -+ -+ if (!weston_surface_is_desktop_surface(wparent)) -+ return; -+ -+ parent = weston_surface_get_desktop_surface(wparent); -+ wsurface = weston_desktop_surface_get_surface(dsurface); -+ offset = weston_coord_surface(x, y, wsurface); -+ if (flags & WL_SHELL_SURFACE_TRANSIENT_INACTIVE) { -+ weston_desktop_wl_shell_change_state(surface, TRANSIENT, parent, -+ &offset); -+ } else { -+ weston_desktop_wl_shell_change_state(surface, TOPLEVEL, NULL, -+ NULL); -+ surface->parent = parent; -+ weston_desktop_api_set_parent(surface->desktop, -+ surface->surface, parent); -+ } -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_fullscreen(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ enum wl_shell_surface_fullscreen_method method, -+ uint32_t framerate, -+ struct wl_resource *output_resource) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ struct weston_output *output = NULL; -+ -+ if (output_resource != NULL) -+ output = weston_head_from_resource(output_resource)->output; -+ -+ weston_desktop_wl_shell_change_state(surface, FULLSCREEN, NULL, NULL); -+ weston_desktop_api_fullscreen_requested(surface->desktop, dsurface, -+ true, output); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_popup(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ struct wl_resource *seat_resource, -+ uint32_t serial, -+ struct wl_resource *parent_resource, -+ int32_t x, int32_t y, -+ enum wl_shell_surface_transient flags) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_seat *wseat = wl_resource_get_user_data(seat_resource); -+ struct weston_desktop_seat *seat = weston_desktop_seat_from_seat(wseat); -+ struct weston_surface *parent = -+ wl_resource_get_user_data(parent_resource); -+ struct weston_desktop_surface *parent_surface; -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ struct weston_surface *wsurface; -+ struct weston_coord_surface offset; -+ -+ /* Check that if we have a valid wseat we also got a valid desktop seat */ -+ if (wseat != NULL && seat == NULL) { -+ wl_client_post_no_memory(wl_client); -+ return; -+ } -+ -+ if (!weston_surface_is_desktop_surface(parent)) -+ return; -+ -+ parent_surface = weston_surface_get_desktop_surface(parent); -+ wsurface = weston_desktop_surface_get_surface(dsurface); -+ offset = weston_coord_surface(x, y, wsurface); -+ -+ weston_desktop_wl_shell_change_state(surface, POPUP, -+ parent_surface, &offset); -+ weston_desktop_surface_popup_grab(surface->surface, parent_surface, seat, serial); -+ surface->popup_seat = seat; -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_maximized(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ struct wl_resource *output_resource) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ -+ weston_desktop_wl_shell_change_state(surface, MAXIMIZED, NULL, NULL); -+ weston_desktop_api_maximized_requested(surface->desktop, dsurface, true); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_title(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ const char *title) -+{ -+ struct weston_desktop_surface *surface = -+ wl_resource_get_user_data(resource); -+ -+ weston_desktop_surface_set_title(surface, title); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_class(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ const char *class_) -+{ -+ struct weston_desktop_surface *surface = -+ wl_resource_get_user_data(resource); -+ -+ weston_desktop_surface_set_app_id(surface, class_); -+} -+ -+ -+static const struct wl_shell_surface_interface weston_desktop_wl_shell_surface_implementation = { -+ .pong = weston_desktop_wl_shell_surface_protocol_pong, -+ .move = weston_desktop_wl_shell_surface_protocol_move, -+ .resize = weston_desktop_wl_shell_surface_protocol_resize, -+ .set_toplevel = weston_desktop_wl_shell_surface_protocol_set_toplevel, -+ .set_transient = weston_desktop_wl_shell_surface_protocol_set_transient, -+ .set_fullscreen = weston_desktop_wl_shell_surface_protocol_set_fullscreen, -+ .set_popup = weston_desktop_wl_shell_surface_protocol_set_popup, -+ .set_maximized = weston_desktop_wl_shell_surface_protocol_set_maximized, -+ .set_title = weston_desktop_wl_shell_surface_protocol_set_title, -+ .set_class = weston_desktop_wl_shell_surface_protocol_set_class, -+}; -+ -+static const struct weston_desktop_surface_implementation weston_desktop_wl_shell_surface_internal_implementation = { -+ .set_size = weston_desktop_wl_shell_surface_set_size, -+ .committed = weston_desktop_wl_shell_surface_committed, -+ .ping = weston_desktop_wl_shell_surface_ping, -+ .close = weston_desktop_wl_shell_surface_close, -+ -+ .get_maximized = weston_desktop_wl_shell_surface_get_maximized, -+ .get_fullscreen = weston_desktop_wl_shell_surface_get_fullscreen, -+ -+ .destroy = weston_desktop_wl_shell_surface_destroy, -+}; -+ -+static void -+wl_surface_resource_destroyed(struct wl_listener *listener, -+ void *data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = -+ wl_container_of(listener, surface, -+ wl_surface_resource_destroy_listener); -+ -+ /* the wl_shell_surface spec says that wl_shell_surfaces are to be -+ * destroyed automatically when the wl_surface is destroyed. */ -+ weston_desktop_surface_destroy(surface->surface); -+} -+ -+static void -+weston_desktop_wl_shell_protocol_get_shell_surface(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ uint32_t id, -+ struct wl_resource *surface_resource) -+{ -+ struct weston_desktop_client *client = wl_resource_get_user_data(resource); -+ struct weston_surface *wsurface = wl_resource_get_user_data(surface_resource); -+ struct weston_desktop_wl_shell_surface *surface; -+ -+ -+ if (weston_surface_set_role(wsurface, "wl_shell_surface", resource, WL_SHELL_ERROR_ROLE) < 0) -+ return; -+ -+ surface = zalloc(sizeof(struct weston_desktop_wl_shell_surface)); -+ if (surface == NULL) { -+ wl_client_post_no_memory(wl_client); -+ return; -+ } -+ -+ surface->desktop = weston_desktop_client_get_desktop(client); -+ surface->display = weston_desktop_get_display(surface->desktop); -+ -+ surface->surface = -+ weston_desktop_surface_create(surface->desktop, client, wsurface, -+ &weston_desktop_wl_shell_surface_internal_implementation, -+ surface); -+ if (surface->surface == NULL) { -+ free(surface); -+ return; -+ } -+ -+ surface->wl_surface_resource_destroy_listener.notify = -+ wl_surface_resource_destroyed; -+ wl_resource_add_destroy_listener(wsurface->resource, -+ &surface->wl_surface_resource_destroy_listener); -+ -+ surface->resource = -+ weston_desktop_surface_add_resource(surface->surface, -+ &wl_shell_surface_interface, -+ &weston_desktop_wl_shell_surface_implementation, -+ id, NULL); -+} -+ -+ -+static const struct wl_shell_interface weston_desktop_wl_shell_implementation = { -+ .get_shell_surface = weston_desktop_wl_shell_protocol_get_shell_surface, -+}; -+ -+static void -+weston_desktop_wl_shell_bind(struct wl_client *client, void *data, -+ uint32_t version, uint32_t id) -+{ -+ struct weston_desktop *desktop = data; -+ -+ weston_desktop_client_create(desktop, client, NULL, &wl_shell_interface, -+ &weston_desktop_wl_shell_implementation, -+ version, id); -+} -+ -+struct wl_global * -+weston_desktop_wl_shell_create(struct weston_desktop *desktop, -+ struct wl_display *display) -+{ -+ return wl_global_create(display, -+ &wl_shell_interface, -+ WD_WL_SHELL_PROTOCOL_VERSION, desktop, -+ weston_desktop_wl_shell_bind); -+} -diff --git a/meson.build b/meson.build -index 2383273d..6adf97be 100644 ---- a/meson.build -+++ b/meson.build -@@ -133,6 +133,12 @@ if dep_xkbcommon.version().version_compare('>= 0.5.0') - config_h.set('HAVE_XKBCOMMON_COMPOSE', '1') - endif - -+if get_option('deprecated-wl-shell') -+ warning('Support for the deprecated wl_shell interface is enabled.') -+ warning('This feature will be removed in a future version.') -+ config_h.set('HAVE_DEPRECATED_WL_SHELL', '1') -+endif -+ - dep_wayland_server = dependency('wayland-server', version: '>= 1.22.0') - dep_wayland_client = dependency('wayland-client', version: '>= 1.22.0') - dep_pixman = dependency('pixman-1', version: '>= 0.25.2') -diff --git a/meson_options.txt b/meson_options.txt -index ac355f15..45dd733a 100644 ---- a/meson_options.txt -+++ b/meson_options.txt -@@ -137,6 +137,13 @@ option( - description: 'Weston desktop shell: default helper client selection' - ) - -+option( -+ 'deprecated-wl-shell', -+ type: 'boolean', -+ value: false, -+ description: 'Enable the deprecated wl_shell protocol' -+) -+ - option( - 'color-management-lcms', - type: 'boolean', - diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_13.0.1.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_13.0.1.bbappend index e7ecf7255..0c1369353 100644 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_13.0.1.bbappend +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-graphics/wayland/weston_13.0.1.bbappend @@ -5,8 +5,6 @@ SRC_URI:append:stm32mpcommon = " \ file://0002-Disable-request-to-EGL_DRM_RENDER_NODE_FILE_EXT.patch \ file://0003-Revert-compositor-improve-opacity-handling-for-scale.patch \ file://0004-Revert-compositor-set-transform.opaque-for-surfaces-.patch \ - file://0005-Revert-libweston-libinput-device-Enable-Set-pointer-.patch \ - file://0006-Restore-wl_shell-to-weston-13.patch \ " SIMPLECLIENTS="egl,touch,dmabuf-v4l,dmabuf-egl" @@ -24,4 +22,3 @@ PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'kms wayla remoting \ " -EXTRA_OEMESON += "-Ddeprecated-wl-shell=true" diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.12.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.12.bbappend index 95a873c4e..ae8ae137d 100644 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.12.bbappend +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.12.bbappend @@ -85,7 +85,7 @@ SRC_URI:append = " \ PACKAGECONFIG_GL ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl', '', d)}" PACKAGECONFIG[gtk3] = "-Dgtk3=enabled,-Dgtk3=disabled,gtk+3" -PACKAGECONFIG ?= " \ +PACKAGECONFIG = " \ ${GSTREAMER_ORC} \ ${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} \ ${@bb.utils.filter('DISTRO_FEATURES', 'directfb vulkan', d)} \ diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0001-0.3.0-stm32mp-add-dcmipp-ipa.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0001-0.3.0-stm32mp-add-dcmipp-ipa.patch new file mode 100644 index 000000000..d40f145a3 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0001-0.3.0-stm32mp-add-dcmipp-ipa.patch @@ -0,0 +1,8385 @@ +From 3a1b1068ecae127ab97cf4b3f6fd638893a8380a Mon Sep 17 00:00:00 2001 +From: Christophe Priouzeau +Date: Wed, 4 Jun 2025 13:47:46 +0200 +Subject: [PATCH] 0.3.0-stm32mp-add-dcmipp-ipa + +--- + README.rst | 16 + + include/libcamera/internal/media_device.h | 2 +- + include/libcamera/ipa/dcmipp.mojom | 36 + + include/libcamera/ipa/meson.build | 1 + + include/linux/stm32-dcmipp-config.h | 196 +++ + include/linux/v4l2-controls.h | 41 + + include/linux/videodev2.h | 5 + + meson.build | 1 + + meson_options.txt | 10 +- + src/apps/cam/camera_session.cpp | 11 +- + src/apps/common/options.cpp | 12 +- + src/gstreamer/gstlibcamera-utils.cpp | 16 + + src/gstreamer/gstlibcamerapad.cpp | 4 + + src/gstreamer/gstlibcamerasrc.cpp | 1124 +++++++++++++- + src/ipa/dcmipp/algorithms/aec.cpp | 704 +++++++++ + src/ipa/dcmipp/algorithms/aec.h | 68 + + src/ipa/dcmipp/algorithms/algorithm.h | 35 + + src/ipa/dcmipp/algorithms/awb.cpp | 948 ++++++++++++ + src/ipa/dcmipp/algorithms/awb.h | 65 + + src/ipa/dcmipp/algorithms/badpixel.cpp | 185 +++ + src/ipa/dcmipp/algorithms/badpixel.h | 50 + + src/ipa/dcmipp/algorithms/blc.cpp | 145 ++ + src/ipa/dcmipp/algorithms/blc.h | 44 + + src/ipa/dcmipp/algorithms/contrast.cpp | 141 ++ + src/ipa/dcmipp/algorithms/contrast.h | 44 + + src/ipa/dcmipp/algorithms/demosaicing.cpp | 146 ++ + src/ipa/dcmipp/algorithms/demosaicing.h | 44 + + src/ipa/dcmipp/algorithms/gamma.cpp | 91 ++ + src/ipa/dcmipp/algorithms/gamma.h | 44 + + src/ipa/dcmipp/algorithms/meson.build | 12 + + src/ipa/dcmipp/algorithms/statistic.cpp | 215 +++ + src/ipa/dcmipp/algorithms/statistic.h | 44 + + src/ipa/dcmipp/data/imx335.yaml | 57 + + .../dcmipp/data/imx335_judge2_light_box.yaml | 54 + + .../dcmipp/data/imx335_mini_light_box.yaml | 54 + + src/ipa/dcmipp/data/meson.build | 9 + + src/ipa/dcmipp/dcmipp.cpp | 567 +++++++ + src/ipa/dcmipp/ipa_context.h | 132 ++ + src/ipa/dcmipp/meson.build | 39 + + src/ipa/dcmipp/module.h | 27 + + src/ipa/rpi/controller/rpi/alsc.cpp | 7 +- + src/libcamera/control_ids_draft.yaml | 244 +++ + src/libcamera/ipc_unixsocket.cpp | 13 +- + src/libcamera/media_device.cpp | 6 +- + src/libcamera/pipeline/dcmipp/dcmipp.cpp | 1363 +++++++++++++++++ + src/libcamera/pipeline/dcmipp/dcmipp.h | 120 ++ + src/libcamera/pipeline/dcmipp/dcmipp_path.cpp | 496 ++++++ + src/libcamera/pipeline/dcmipp/meson.build | 5 + + src/libcamera/v4l2_device.cpp | 20 +- + 49 files changed, 7674 insertions(+), 39 deletions(-) + create mode 100644 include/libcamera/ipa/dcmipp.mojom + create mode 100644 include/linux/stm32-dcmipp-config.h + create mode 100644 src/ipa/dcmipp/algorithms/aec.cpp + create mode 100644 src/ipa/dcmipp/algorithms/aec.h + create mode 100644 src/ipa/dcmipp/algorithms/algorithm.h + create mode 100644 src/ipa/dcmipp/algorithms/awb.cpp + create mode 100644 src/ipa/dcmipp/algorithms/awb.h + create mode 100644 src/ipa/dcmipp/algorithms/badpixel.cpp + create mode 100644 src/ipa/dcmipp/algorithms/badpixel.h + create mode 100644 src/ipa/dcmipp/algorithms/blc.cpp + create mode 100644 src/ipa/dcmipp/algorithms/blc.h + create mode 100644 src/ipa/dcmipp/algorithms/contrast.cpp + create mode 100644 src/ipa/dcmipp/algorithms/contrast.h + create mode 100644 src/ipa/dcmipp/algorithms/demosaicing.cpp + create mode 100644 src/ipa/dcmipp/algorithms/demosaicing.h + create mode 100644 src/ipa/dcmipp/algorithms/gamma.cpp + create mode 100644 src/ipa/dcmipp/algorithms/gamma.h + create mode 100644 src/ipa/dcmipp/algorithms/meson.build + create mode 100644 src/ipa/dcmipp/algorithms/statistic.cpp + create mode 100644 src/ipa/dcmipp/algorithms/statistic.h + create mode 100644 src/ipa/dcmipp/data/imx335.yaml + create mode 100644 src/ipa/dcmipp/data/imx335_judge2_light_box.yaml + create mode 100644 src/ipa/dcmipp/data/imx335_mini_light_box.yaml + create mode 100644 src/ipa/dcmipp/data/meson.build + create mode 100644 src/ipa/dcmipp/dcmipp.cpp + create mode 100644 src/ipa/dcmipp/ipa_context.h + create mode 100644 src/ipa/dcmipp/meson.build + create mode 100644 src/ipa/dcmipp/module.h + create mode 100644 src/libcamera/pipeline/dcmipp/dcmipp.cpp + create mode 100644 src/libcamera/pipeline/dcmipp/dcmipp.h + create mode 100644 src/libcamera/pipeline/dcmipp/dcmipp_path.cpp + create mode 100644 src/libcamera/pipeline/dcmipp/meson.build + +diff --git a/README.rst b/README.rst +index 1da7a3d6..d605182b 100644 +--- a/README.rst ++++ b/README.rst +@@ -178,6 +178,22 @@ Which can be received on another device over the network with: + gst-launch-1.0 tcpclientsrc host=$DEVICE_IP port=5000 ! \ + multipartdemux ! jpegdec ! autovideosink + ++The GStreamer element also supports multiple streams. This is achieved by ++requesting additionnal source pads. Downstream caps filteris can be used ++to choose specific parameters like resolution and pixel format. The pad ++property ``stream-role`` can be used to select a role. ++ ++The following example displayis a 640x480 view finder while streamiing JPEG ++encoded 800x600 video. You can use the receiver pipleine above to view the ++remote stream from another device. ++ ++.. code:: ++ ++ gst-launch-1.0 libcamerasrc name=cs src::stream-role=view-finder src_0::stream-role=video-recording \ ++ cs.src ! queue ! video/x-raw,width=640,height=480 ! videoconvert ! autovideosink \ ++ cs.src_0 ! queue ! video/x-raw,width=800,height=600 ! videoconvert ! \ ++ jpegenc ! multipartmux ! tcpserversink host=0.0.0.0 port=5000 ++ + .. section-end-getting-started + + Troubleshooting +diff --git a/include/libcamera/internal/media_device.h b/include/libcamera/internal/media_device.h +index 3b624e00..bf2e475d 100644 +--- a/include/libcamera/internal/media_device.h ++++ b/include/libcamera/internal/media_device.h +@@ -33,7 +33,7 @@ public: + bool busy() const { return acquired_; } + + bool lock(); +- bool unlock(); ++ void unlock(); + + int populate(); + bool isValid() const { return valid_; } +diff --git a/include/libcamera/ipa/dcmipp.mojom b/include/libcamera/ipa/dcmipp.mojom +new file mode 100644 +index 00000000..810c0f6c +--- /dev/null ++++ b/include/libcamera/ipa/dcmipp.mojom +@@ -0,0 +1,36 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++ ++module ipa.dcmipp; ++ ++import "include/libcamera/ipa/core.mojom"; ++ ++interface IPADcmippInterface { ++ init(libcamera.IPASettings settings, ++ uint32 hwRevision, ++ libcamera.IPACameraSensorInfo sensorInfo, ++ libcamera.ControlInfoMap sensorControls) ++ => (int32 ret, libcamera.ControlInfoMap ipaControls); ++ configure(libcamera.IPACameraSensorInfo sensorInfo, ++ libcamera.ControlInfoMap sensorControls, ++ uint32 ispDecimationRatio) ++ => (int32 ret, libcamera.ControlInfoMap ipaControls); ++ ++ start() => (int32 ret); ++ stop(); ++ ++ mapBuffers(array buffers); ++ unmapBuffers(array ids); ++ ++ [async] processStatsBuffer(uint32 frame, uint32 bufferId); ++ [async] fillParamsBuffer(uint32 frame, uint32 bufferId); ++ [async] queueRequest(uint32 frame, libcamera.ControlList controls); ++}; ++ ++interface IPADcmippEventInterface { ++ statsBufferProcessed(uint32 bufferId); ++ paramsBufferReady(uint32 bufferId); ++ metadataReady(uint32 frame, libcamera.ControlList sensorControls); ++ setSensorControls(uint32 frame, libcamera.ControlList sensorControls); ++ setIspControls(uint32 frame, libcamera.ControlList ispControls); ++ setPostprocControls(uint32 frame, libcamera.ControlList postprocControls); ++}; +diff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build +index 3352d08f..925aad2b 100644 +--- a/include/libcamera/ipa/meson.build ++++ b/include/libcamera/ipa/meson.build +@@ -62,6 +62,7 @@ libcamera_generated_ipa_headers += custom_target('core_ipa_serializer_h', + + # Mapping from pipeline handler name to mojom file + pipeline_ipa_mojom_mapping = { ++ 'dcmipp': 'dcmipp.mojom', + 'ipu3': 'ipu3.mojom', + 'rkisp1': 'rkisp1.mojom', + 'rpi/vc4': 'raspberrypi.mojom', +diff --git a/include/linux/stm32-dcmipp-config.h b/include/linux/stm32-dcmipp-config.h +new file mode 100644 +index 00000000..85b4cf73 +--- /dev/null ++++ b/include/linux/stm32-dcmipp-config.h +@@ -0,0 +1,196 @@ ++/* SPDX-License-Identifier: ((GPL-2.0+ WITH Linux-syscall-note) OR MIT) */ ++/* ++ * STM32 DCMIPP ISP userspace API ++ * Copyright (C) STMicroelectronics SA 2023 ++ */ ++ ++#ifndef _UAPI_STM32_DCMIPP_CONFIG_H ++#define _UAPI_STM32_DCMIPP_CONFIG_H ++ ++#include ++ ++/* Bad Pixel Removal */ ++#define STM32_DCMIPP_ISP_BPR (1U << 0) ++/* Black Level Correction */ ++#define STM32_DCMIPP_ISP_BLC (1U << 1) ++/* Exposure Control */ ++#define STM32_DCMIPP_ISP_EX (1U << 2) ++/* Demosaicing filters */ ++#define STM32_DCMIPP_ISP_DM (1U << 3) ++/* Color conversion Control */ ++#define STM32_DCMIPP_ISP_CC (1U << 4) ++/* Contrast Enhancement */ ++#define STM32_DCMIPP_ISP_CE (1U << 5) ++ ++/** ++ * struct stm32_dcmipp_isp_bpr_cfg - STM32 DCMIPP ISP bad pixel removal ++ * ++ * @en: enable / disable the bad pixel removal block ++ * @strength: strength (aggressiveness) of the bad pixel detection ++ */ ++struct stm32_dcmipp_isp_bpr_cfg { ++ __u32 en; ++ __u32 strength; ++}; ++ ++/** ++ * struct stm32_dcmipp_isp_blc_cfg - STM32 DCMIPP ISP black level correction ++ * ++ * @en: enable / disable the black level correction block ++ * @blc_r: Correction on the red component ++ * @blc_g: Correction on the green component ++ * @blc_b: Correction on the blue component ++ */ ++struct stm32_dcmipp_isp_blc_cfg { ++ __u32 en; ++ __u8 blc_r; ++ __u8 blc_g; ++ __u8 blc_b; ++}; ++ ++/** ++ * struct stm32_dcmipp_isp_ex_cfg - STM32 DCMIPP ISP exposure control ++ * ++ * @en: enable / disable the exposure control block ++ * @shift_r: red component exposure shift ++ * @mult_r: red component exposure multiplier ++ * @shift_g: green component exposure shift ++ * @mult_g: green component exposure multiplier ++ * @shift_b: blue component exposure shift ++ * @mult_b: blue component exposure multiplier ++ */ ++struct stm32_dcmipp_isp_ex_cfg { ++ __u32 en; ++ __u8 shift_r; ++ __u8 mult_r; ++ __u8 shift_g; ++ __u8 mult_g; ++ __u8 shift_b; ++ __u8 mult_b; ++}; ++ ++/** ++ * struct stm32_dcmipp_isp_dm_cfg - STM32 DCMIPP ISP demosaicing filters ++ * ++ * @en: enable / disable the demosaicing block ++ * @edge: strength of the edge detection ++ * @lineh: strength of the horizontal line detection ++ * @linev: strength of the vertical line detection ++ * @peak: strength of the peak detection ++ */ ++struct stm32_dcmipp_isp_dm_cfg { ++ __u32 en; ++ __u8 edge; ++ __u8 lineh; ++ __u8 linev; ++ __u8 peak; ++}; ++ ++enum stm32_dcmipp_isp_cc_clamp { ++ STM32_DCMIPP_ISP_CC_CLAMP_DISABLED, ++ STM32_DCMIPP_ISP_CC_CLAMP_Y235_U240_V240, ++ STM32_DCMIPP_ISP_CC_CLAMP_YUV235, ++}; ++ ++/** ++ * struct stm32_dcmipp_isp_cc_cfg - STM32 DCMIPP ISP color conversion ++ * ++ * @en: enable / disable the color conversion block ++ * @clamp: clamp configuration (from enum stm32_dcmipp_isp_cc_clamp) ++ * @rr: row 1 col 1 value of the matrix ++ * @rg: row 1 col 2 value of the matrix ++ * @rb: row 1 col 3 value of the matrix ++ * @ra: row 1 added value of the matrix ++ * @gr: row 2 col 1 value of the matrix ++ * @gg: row 2 col 2 value of the matrix ++ * @gb: row 2 col 3 value of the matrix ++ * @ga: row 2 added value of the matrix ++ * @br: row 3 col 1 value of the matrix ++ * @bg: row 3 col 2 value of the matrix ++ * @bb: row 3 col 3 value of the matrix ++ * @ba: row 3 added value of the matrix ++ */ ++struct stm32_dcmipp_isp_cc_cfg { ++ __u32 en; ++ __u32 clamp; ++ __u16 rr; ++ __u16 rg; ++ __u16 rb; ++ __u16 ra; ++ __u16 gr; ++ __u16 gg; ++ __u16 gb; ++ __u16 ga; ++ __u16 br; ++ __u16 bg; ++ __u16 bb; ++ __u16 ba; ++}; ++ ++/** ++ * struct stm32_dcmipp_isp_ce_cfg - STM32 DCMIPP ISP contrast enhancement ++ * ++ * @en: enable / disable the contrast enhancement block ++ * @lum: 9 elements table of luminance enhancement (value 16 is neutral) ++ */ ++struct stm32_dcmipp_isp_ce_cfg { ++ __u32 en; ++ __u8 lum[9]; ++}; ++ ++/** ++ * struct stm32_dcmipp_isp_ctrls_cfg - STM32 DCMIPP ISP Controls ++ * ++ * @bpr_cfg: configuration of the bad pixel removal block ++ * @blc_cfg: configuration of the black level correction block ++ * @ex_cfg: configuration of the exposure block ++ * @dm_cfg: configuration of the demosaicing filters block ++ * @cc_cfg: configuration of the color conversion block ++ * @ce_cfg: configuration of the contrast enhancement block ++ */ ++struct stm32_dcmipp_isp_ctrls_cfg { ++ struct stm32_dcmipp_isp_bpr_cfg bpr_cfg; ++ struct stm32_dcmipp_isp_blc_cfg blc_cfg; ++ struct stm32_dcmipp_isp_ex_cfg ex_cfg; ++ struct stm32_dcmipp_isp_dm_cfg dm_cfg; ++ struct stm32_dcmipp_isp_cc_cfg cc_cfg; ++ struct stm32_dcmipp_isp_ce_cfg ce_cfg; ++}; ++ ++/** ++ * struct stm32_dcmipp_params_cfg - STM32 DCMIPP ISP Input Parameters Meta Data ++ * ++ * @module_cfg_update: mask the config bits of which module should be updated ++ * @ctrls: configuration of other ISP blocks ++ */ ++struct stm32_dcmipp_params_cfg { ++ __u32 module_cfg_update; ++ ++ struct stm32_dcmipp_isp_ctrls_cfg ctrls; ++}; ++ ++/** ++ * struct stm32_dcmipp_stat_avr_bins - average & bins statistics ++ * ++ * @average_rgb[3]: average value of R/G/B components ++ * @bins[12]: 12 values histogram ++ */ ++struct stm32_dcmipp_stat_avr_bins { ++ __u32 average_RGB[3]; ++ __u32 bins[12]; ++}; ++ ++/** ++ * struct stm32_dcmipp_stat_buf - statistics buffer ++ * ++ * @pre: average & bins statistics at pre-demosaicing location ++ * @post: average & bins statistics at post-demosaicing location ++ * @bad_pixel_count: number of bad pixels detected in the frame ++ */ ++struct stm32_dcmipp_stat_buf { ++ struct stm32_dcmipp_stat_avr_bins pre; ++ struct stm32_dcmipp_stat_avr_bins post; ++ __u32 bad_pixel_count; ++}; ++ ++#endif +diff --git a/include/linux/v4l2-controls.h b/include/linux/v4l2-controls.h +index b9f64810..23772e04 100644 +--- a/include/linux/v4l2-controls.h ++++ b/include/linux/v4l2-controls.h +@@ -1218,6 +1218,47 @@ enum v4l2_jpeg_chroma_subsampling { + #define V4L2_CID_DEINTERLACING_MODE (V4L2_CID_IMAGE_PROC_CLASS_BASE + 4) + #define V4L2_CID_DIGITAL_GAIN (V4L2_CID_IMAGE_PROC_CLASS_BASE + 5) + ++#define V4L2_CID_ISP_STAT_REGION (V4L2_CID_IMAGE_PROC_CLASS_BASE + 10) ++/** ++ * struct v4l2_ctrl_isp_stat_region - Region where ISP statistics are collected ++ * ++ * @nb_regions: number of regions ++ * @top: top coordinate of a region ++ * @left: left coordinate of a region ++ * @width: width of a region ++ * @height: height of a region ++ */ ++struct v4l2_ctrl_isp_stat_region { ++ __u8 nb_regions; ++ __u32 top[25]; ++ __u32 left[25]; ++ __u32 width[25]; ++ __u32 height[25]; ++}; ++ ++#define V4L2_CID_ISP_STAT_AVG_FILTER (V4L2_CID_IMAGE_PROC_CLASS_BASE + 12) ++enum v4l2_isp_stat_avg_filter { ++ V4L2_STAT_AVG_FILTER_NONE = 0, ++ V4L2_STAT_AVG_FILTER_EXCL16 = 1, ++ V4L2_STAT_AVG_FILTER_EXCL32 = 2, ++ V4L2_STAT_AVG_FILTER_EXCL64 = 3, ++}; ++ ++#define V4L2_CID_ISP_STAT_BIN_COMP (V4L2_CID_IMAGE_PROC_CLASS_BASE + 13) ++enum v4l2_isp_stat_bin_comp { ++ V4L2_STAT_BIN_COMP_R = 0, ++ V4L2_STAT_BIN_COMP_G = 1, ++ V4L2_STAT_BIN_COMP_B = 2, ++ V4L2_STAT_BIN_COMP_L = 3, ++}; ++ ++#define V4L2_CID_ISP_STAT_PROFILE (V4L2_CID_IMAGE_PROC_CLASS_BASE + 14) ++enum v4l2_isp_stat_profile { ++ V4L2_STAT_PROFILE_FULL = 0, ++ V4L2_STAT_PROFILE_AVERAGE_PRE = 1, ++ V4L2_STAT_PROFILE_AVERAGE_POST = 2, ++}; ++ + /* DV-class control IDs defined by V4L2 */ + #define V4L2_CID_DV_CLASS_BASE (V4L2_CTRL_CLASS_DV | 0x900) + #define V4L2_CID_DV_CLASS (V4L2_CTRL_CLASS_DV | 1) +diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h +index 0b5482a0..acc17e57 100644 +--- a/include/linux/videodev2.h ++++ b/include/linux/videodev2.h +@@ -837,6 +837,10 @@ struct v4l2_pix_format { + /* The metadata format identifier for FE stats buffers. */ + #define V4L2_META_FMT_RPI_FE_STATS v4l2_fourcc('R', 'P', 'F', 'S') + ++/* Vendor specific - used for STM32_DCMIPP camera sub-system */ ++#define V4L2_META_FMT_ST_DCMIPP_ISP_PARAMS v4l2_fourcc('S', 'T', 'I', 'P') /* STM32 DCMIPP ISP Parameters */ ++#define V4L2_META_FMT_ST_DCMIPP_ISP_STAT v4l2_fourcc('S', 'T', 'I', 'S') /* STM32 DCMIPP ISP Statistics */ ++ + /* priv field value to indicates that subsequent fields are valid. */ + #define V4L2_PIX_FMT_PRIV_MAGIC 0xfeedcafe + +@@ -1880,6 +1884,7 @@ enum v4l2_ctrl_type { + V4L2_CTRL_TYPE_HEVC_SCALING_MATRIX = 0x0273, + V4L2_CTRL_TYPE_HEVC_DECODE_PARAMS = 0x0274, + ++ V4L2_CTRL_TYPE_ISP_STAT_REGION = 0x0310, + V4L2_CTRL_TYPE_AV1_SEQUENCE = 0x280, + V4L2_CTRL_TYPE_AV1_TILE_GROUP_ENTRY = 0x281, + V4L2_CTRL_TYPE_AV1_FRAME = 0x282, +diff --git a/meson.build b/meson.build +index 1902ea2f..c0f49810 100644 +--- a/meson.build ++++ b/meson.build +@@ -206,6 +206,7 @@ pipelines_support = { + 'rkisp1': arch_arm, + 'rpi/vc4': arch_arm, + 'simple': arch_arm, ++ 'dcmipp': arch_arm, + 'uvcvideo': ['any'], + 'vimc': ['test'], + } +diff --git a/meson_options.txt b/meson_options.txt +index 7aa41249..0674d2b2 100644 +--- a/meson_options.txt ++++ b/meson_options.txt +@@ -32,7 +32,7 @@ option('gstreamer', + + option('ipas', + type : 'array', +- choices : ['ipu3', 'rkisp1', 'rpi/vc4', 'simple', 'vimc'], ++ choices : ['dcmipp', 'ipu3', 'rkisp1', 'rpi/vc4', 'simple', 'vimc'], + description : 'Select which IPA modules to build') + + option('lc-compliance', +@@ -53,7 +53,8 @@ option('pipelines', + 'rpi/vc4', + 'simple', + 'uvcvideo', +- 'vimc' ++ 'vimc', ++ 'dcmipp' + ], + description : 'Select which pipeline handlers to build. If this is set to "auto", all the pipelines applicable to the target architecture will be built. If this is set to "all", all the pipelines will be built. If both are selected then "all" will take precedence.') + +@@ -86,3 +87,8 @@ option('v4l2', + type : 'boolean', + value : false, + description : 'Compile the V4L2 compatibility layer') ++ ++option('evision_algo', ++ type : 'boolean', ++ value : false, ++ description : 'Compile dcmipp with algorithms from evision libraries') +diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp +index f13355ba..35e2451a 100644 +--- a/src/apps/cam/camera_session.cpp ++++ b/src/apps/cam/camera_session.cpp +@@ -360,8 +360,15 @@ int CameraSession::queueRequest(Request *request) + if (captureLimit_ && queueCount_ >= captureLimit_) + return 0; + +- if (script_) +- request->controls() = script_->frameControls(queueCount_); ++ if (script_) { ++ const ControlList &controls = script_->frameControls(queueCount_); ++ for (auto const &ctrl : controls) ++ std::cout << "\tRequest ctrl: " ++ << controls::controls.at(ctrl.first)->name() ++ << " = " << ctrl.second.toString() ++ << std::endl; ++ request->controls() = controls; ++ } + + queueCount_++; + +diff --git a/src/apps/common/options.cpp b/src/apps/common/options.cpp +index f6d4f006..ab19aa3d 100644 +--- a/src/apps/common/options.cpp ++++ b/src/apps/common/options.cpp +@@ -879,8 +879,8 @@ OptionsParser::Options OptionsParser::parse(int argc, char **argv) + * Allocate short and long options arrays large enough to contain all + * options. + */ +- char *shortOptions = (char*)malloc(optionsMap_.size() * 3 + 2); +- struct option *longOptions = (struct option*)malloc(sizeof(struct option) * (optionsMap_.size() + 1)); ++ char shortOptions[optionsMap_.size() * 3 + 2]; ++ struct option longOptions[optionsMap_.size() + 1]; + unsigned int ids = 0; + unsigned int idl = 0; + +@@ -935,16 +935,12 @@ OptionsParser::Options OptionsParser::parse(int argc, char **argv) + std::cerr << argv[optind - 1] << std::endl; + + usage(); +- free(shortOptions); +- free(longOptions); + return options; + } + + const Option &option = *optionsMap_[c]; + if (!parseValue(option, optarg, &options)) { + usage(); +- free(shortOptions); +- free(longOptions); + return options; + } + } +@@ -953,14 +949,10 @@ OptionsParser::Options OptionsParser::parse(int argc, char **argv) + std::cerr << "Invalid non-option argument '" << argv[optind] + << "'" << std::endl; + usage(); +- free(shortOptions); +- free(longOptions); + return options; + } + + options.valid_ = true; +- free(shortOptions); +- free(longOptions); + return options; + } + +diff --git a/src/gstreamer/gstlibcamera-utils.cpp b/src/gstreamer/gstlibcamera-utils.cpp +index ec4da435..d7ac64cb 100644 +--- a/src/gstreamer/gstlibcamera-utils.cpp ++++ b/src/gstreamer/gstlibcamera-utils.cpp +@@ -322,6 +322,22 @@ bare_structure_from_format(const PixelFormat &format) + case formats::SGBRG8: + case formats::SGRBG8: + case formats::SRGGB8: ++ case formats::SBGGR10: ++ case formats::SGBRG10: ++ case formats::SGRBG10: ++ case formats::SRGGB10: ++ case formats::SBGGR12: ++ case formats::SGBRG12: ++ case formats::SGRBG12: ++ case formats::SRGGB12: ++ case formats::SBGGR14: ++ case formats::SGBRG14: ++ case formats::SGRBG14: ++ case formats::SRGGB14: ++ case formats::SBGGR16: ++ case formats::SGBRG16: ++ case formats::SGRBG16: ++ case formats::SRGGB16: + return gst_structure_new("video/x-bayer", "format", G_TYPE_STRING, + bayer_format_to_string(format), nullptr); + +diff --git a/src/gstreamer/gstlibcamerapad.cpp b/src/gstreamer/gstlibcamerapad.cpp +index 7b22aebe..af0fe477 100644 +--- a/src/gstreamer/gstlibcamerapad.cpp ++++ b/src/gstreamer/gstlibcamerapad.cpp +@@ -99,6 +99,10 @@ gst_libcamera_stream_role_get_type() + static_cast(StreamRole::Viewfinder), + "libcamera::Viewfinder", + "view-finder", ++ }, { ++ static_cast(StreamRole::Raw), ++ "libcamera::Raw", ++ "raw", + }, + { 0, NULL, NULL } + }; +diff --git a/src/gstreamer/gstlibcamerasrc.cpp b/src/gstreamer/gstlibcamerasrc.cpp +index 6a95b6af..164092bc 100644 +--- a/src/gstreamer/gstlibcamerasrc.cpp ++++ b/src/gstreamer/gstlibcamerasrc.cpp +@@ -30,6 +30,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -129,6 +130,9 @@ struct GstLibcameraSrcState { + ControlList initControls_; + guint group_id_; + ++ GMutex controlsLock_; /* Protects pendingControls_ */ ++ ControlList pendingControls_; ++ + int queueRequest(); + void requestCompleted(Request *request); + int processRequest(); +@@ -144,6 +148,48 @@ struct _GstLibcameraSrc { + gchar *camera_name; + controls::AfModeEnum auto_focus_mode = controls::AfModeManual; + ++ struct LibCameraControls { ++ /* Add all ISP controls */ ++ int hwrevision[2]; ++ int decimation; ++ bool black_level_enable; ++ int black_level_values[3]; ++ libcamera::Rectangle statistic_area; ++ bool contrast_enable; ++ int contrast_values[9]; ++ bool aec_algo_enable; ++ float aec_algo_exposure_compensation; ++ int aec_algo_exposure_target; ++ int aec_algo_antiflicker_frequency; ++ float sensor_gain_dB; ++ int sensor_exposure; ++ int sensor_delay; ++ int sensor_delay_measure; ++ bool badpix_enable; ++ int badpix_strength; ++ int badpix_count; ++ int badpix_algo_threshold; ++ bool ispgain_enable; ++ int ispgain_values[3]; ++ bool ccm_enable; ++ int ccm_values[9]; ++ bool awb_algo_enable; ++ std::array awb_algo_profile_names; ++ std::array awb_algo_profile_color_temps; ++ std::array awb_algo_profile_isp_gains; ++ std::array awb_algo_profile_ccms; ++ std::string awb_current_profile_name; ++ int awb_current_profile_color_temp; ++ bool demosaicing_enable; ++ std::array demosaicing_filters; ++ int statistic_profile; ++ std::array statistic_avg_up; ++ std::array statistic_avg_down; ++ std::array statistic_hist_up; ++ std::array statistic_hist_down; ++ bool gamma_enable; ++ } ctrl; ++ + std::atomic pending_eos; + + GstLibcameraSrcState *state; +@@ -155,9 +201,53 @@ enum { + PROP_0, + PROP_CAMERA_NAME, + PROP_AUTO_FOCUS_MODE, ++ PROP_HW_REVISION, ++ PROP_DECIMATION, ++ PROP_BLACK_LEVEL_ENABLE, ++ PROP_BLACK_LEVEL_VALUES, ++ PROP_STATISTIC_AREA, ++ PROP_CONTRAST_ENABLE, ++ PROP_CONTRAST_VALUES, ++ PROP_AEC_ALGO_ENABLE, ++ PROP_AEC_ALGO_EXPOSURE_COMPENSATION, ++ PROP_AEC_ALGO_EXPOSURE_TARGET, ++ PROP_AEC_ALGO_ANTIFLICKER_FREQUENCY, ++ PROP_SENSOR_GAIN, ++ PROP_SENSOR_EXPOSURE, ++ PROP_SENSOR_DELAY, ++ PROP_SENSOR_DELAY_MEASURE, ++ PROP_DO_SENSOR_DELAY_MEASURE, ++ PROP_BADPIX_ENABLE, ++ PROP_BADPIX_STRENGTH, ++ PROP_BADPIX_COUNT, ++ PROP_BADPIX_ALGO_THRESHOLD, ++ PROP_ISP_GAIN_ENABLE, ++ PROP_ISP_GAIN_VALUES, ++ PROP_CCM_ENABLE, ++ PROP_CCM_VALUES, ++ PROP_AWB_ALGO_ENABLE, ++ PROP_AWB_ALGO_PROFILE_NAMES, ++ PROP_AWB_ALGO_PROFILE_COLOR_TEMPS, ++ PROP_AWB_ALGO_PROFILE_ISP_GAINS, ++ PROP_AWB_ALGO_PROFILE_CCMS, ++ PROP_AWB_CURRENT_PROFILE_NAME, ++ PROP_AWB_CURRENT_PROFILE_COLOR_TEMP, ++ PROP_DEMOSAICING_ENABLE, ++ PROP_DEMOSAICING_FILTERS, ++ PROP_STATISTIC_PROFILE, ++ PROP_STATISTIC_GET_AVERAGE_UP, ++ PROP_STATISTIC_GET_AVERAGE_DOWN, ++ PROP_STATISTIC_GET_HISTOGRAM_UP, ++ PROP_STATISTIC_GET_HISTOGRAM_DOWN, ++ PROP_GAMMA_ENABLE, + }; + ++static void gst_libcamera_src_child_proxy_init(gpointer g_iface, ++ gpointer iface_data); ++ + G_DEFINE_TYPE_WITH_CODE(GstLibcameraSrc, gst_libcamera_src, GST_TYPE_ELEMENT, ++ G_IMPLEMENT_INTERFACE(GST_TYPE_CHILD_PROXY, ++ gst_libcamera_src_child_proxy_init) + GST_DEBUG_CATEGORY_INIT(source_debug, "libcamerasrc", 0, + "libcamera Source")) + +@@ -203,7 +293,19 @@ int GstLibcameraSrcState::queueRequest() + } + + GST_TRACE_OBJECT(src_, "Requesting buffers"); +- cam_->queueRequest(wrap->request_.get()); ++ ++ Request *req = wrap->request_.get(); ++ ++ /* Add then clear pending controls to the request */ ++ ControlList controls; ++ { ++ GLibLocker locker(&src_->state->controlsLock_); ++ controls = src_->state->pendingControls_; ++ src_->state->pendingControls_.clear(); ++ } ++ req->controls() = controls; ++ ++ cam_->queueRequest(req); + + { + GLibLocker locker(&lock_); +@@ -234,6 +336,176 @@ GstLibcameraSrcState::requestCompleted(Request *request) + return; + } + ++ /* Update the properties from the libcamera metadata */ ++ const auto HwRevision = request->metadata().get(controls::draft::PipelineHwRevision); ++ if (HwRevision) { ++ src_->ctrl.hwrevision[0] = *HwRevision >> 4; /* Major */ ++ src_->ctrl.hwrevision[1] = *HwRevision & 0x0F; /* Minor */ ++ } ++ const auto IspDecimation = request->metadata().get(controls::draft::IspDecimationRatio); ++ if (IspDecimation) { ++ src_->ctrl.decimation = *IspDecimation; ++ } ++ const auto BlackLevelEnable = request->metadata().get(controls::draft::BlackLevelCorrectionEnable); ++ if (BlackLevelEnable) { ++ src_->ctrl.black_level_enable = *BlackLevelEnable; ++ } ++ const auto BlackLevel = request->metadata().get(controls::draft::BlackLevelCorrectionLevels); ++ if (BlackLevel) { ++ src_->ctrl.black_level_values[0] = (*BlackLevel)[0]; ++ src_->ctrl.black_level_values[1] = (*BlackLevel)[1]; ++ src_->ctrl.black_level_values[2] = (*BlackLevel)[2]; ++ } ++ const auto StatisticArea = request->metadata().get(controls::draft::StatisticArea); ++ if (StatisticArea) { ++ src_->ctrl.statistic_area = *StatisticArea; ++ } ++ const auto ContrastEnable = request->metadata().get(controls::draft::ContrastLuminanceEnable); ++ if (ContrastEnable) { ++ src_->ctrl.contrast_enable = *ContrastEnable; ++ } ++ const auto ContrastLevel = request->metadata().get(controls::draft::ContrastLuminance); ++ if (ContrastLevel) { ++ for (unsigned int i = 0; i < 9; i++) { ++ src_->ctrl.contrast_values[i] = (*ContrastLevel)[i]; ++ } ++ } ++ const auto AecAlgoEnable = request->metadata().get(controls::AeEnable); ++ if (AecAlgoEnable) { ++ src_->ctrl.aec_algo_enable = *AecAlgoEnable; ++ } ++ const auto AecAlgoExposureCompensation = request->metadata().get(controls::ExposureValue); ++ if (AecAlgoExposureCompensation) { ++ src_->ctrl.aec_algo_exposure_compensation = *AecAlgoExposureCompensation; ++ } ++ const auto AecAlgoExposureTarget = request->metadata().get(controls::draft::AeExposureTarget); ++ if (AecAlgoExposureTarget) { ++ src_->ctrl.aec_algo_exposure_target = *AecAlgoExposureTarget; ++ } ++ const auto AecAntiFlickerFrequency = request->metadata().get(controls::draft::AntiFlickerFreq); ++ if (AecAntiFlickerFrequency) { ++ src_->ctrl.aec_algo_antiflicker_frequency = *AecAntiFlickerFrequency; ++ } ++ const auto SensorGaindB = request->metadata().get(controls::draft::AnalogueGain_dB); ++ if (SensorGaindB) { ++ src_->ctrl.sensor_gain_dB = *SensorGaindB; ++ } ++ const auto SensorExposure = request->metadata().get(controls::ExposureTime); ++ if (SensorExposure) { ++ src_->ctrl.sensor_exposure = *SensorExposure; ++ } ++ const auto SensorDelay = request->metadata().get(controls::draft::SensorDelay); ++ if (SensorDelay) { ++ src_->ctrl.sensor_delay = *SensorDelay; ++ } ++ const auto SensorDelayMeasure = request->metadata().get(controls::draft::SensorDelayMeasure); ++ if (SensorDelayMeasure) { ++ src_->ctrl.sensor_delay_measure = *SensorDelayMeasure; ++ } ++ const auto BadPixEnable = request->metadata().get(controls::draft::BadPixelRemovalEnable); ++ if (BadPixEnable) { ++ src_->ctrl.badpix_enable = *BadPixEnable; ++ } ++ const auto BadPixStrength = request->metadata().get(controls::draft::BadPixelRemovalStrength); ++ if (BadPixStrength) { ++ src_->ctrl.badpix_strength = *BadPixStrength; ++ } ++ const auto BadPixCount = request->metadata().get(controls::draft::BadPixelRemovalCount); ++ if (BadPixCount) { ++ src_->ctrl.badpix_count = *BadPixCount; ++ } ++ const auto BadPixAlgoThreshold = request->metadata().get(controls::draft::BadPixelRemovalThreshold); ++ if (BadPixAlgoThreshold) { ++ src_->ctrl.badpix_algo_threshold = *BadPixAlgoThreshold; ++ } ++ const auto IspGainEnable = request->metadata().get(controls::draft::ColourGains3Enable); ++ if (IspGainEnable) { ++ src_->ctrl.ispgain_enable = *IspGainEnable; ++ } ++ const auto IspGainValues = request->metadata().get(controls::draft::ColourGains3); ++ if (IspGainValues) { ++ for (unsigned int i = 0; i < 3; i++) { ++ src_->ctrl.ispgain_values[i] = (*IspGainValues)[i]; ++ } ++ } ++ const auto CcmEnable = request->metadata().get(controls::draft::ColourCorrectionEnable); ++ if (CcmEnable) { ++ src_->ctrl.ccm_enable = *CcmEnable; ++ } ++ const auto CcmValues = request->metadata().get(controls::draft::ColourCorrection); ++ if (CcmValues) { ++ for (unsigned int i = 0; i < 9; i++) { ++ src_->ctrl.ccm_values[i] = (*CcmValues)[i]; ++ } ++ } ++ const auto AwbAlgoEnable = request->metadata().get(controls::AwbEnable); ++ if (AwbAlgoEnable) { ++ src_->ctrl.awb_algo_enable = *AwbAlgoEnable; ++ } ++ const auto AwbAlgoProfileNames = request->metadata().get(controls::draft::AwbProfileName); ++ if (AwbAlgoProfileNames) { ++ /* The Controls class does not support array of string. So, split the concatenated string */ ++ std::string token; ++ std::stringstream ss(*AwbAlgoProfileNames); ++ for (int i = 0; i < (int)src_->ctrl.awb_algo_profile_names.size(); i++) { ++ if (!getline(ss, token, '$')) ++ token = ""; ++ src_->ctrl.awb_algo_profile_names[i] = token; ++ } ++ } ++ const auto AwbAlgoProfileColorTemps = request->metadata().get(controls::draft::AwbReferenceColorTemperature); ++ if (AwbAlgoProfileColorTemps) { ++ std::copy(std::begin(*AwbAlgoProfileColorTemps), std::end(*AwbAlgoProfileColorTemps), src_->ctrl.awb_algo_profile_color_temps.begin()); ++ } ++ const auto AwbAlgoProfileIspGains = request->metadata().get(controls::draft::AwbColourGains3); ++ if (AwbAlgoProfileIspGains) { ++ std::copy(std::begin(*AwbAlgoProfileIspGains), std::end(*AwbAlgoProfileIspGains), src_->ctrl.awb_algo_profile_isp_gains.begin()); ++ } ++ const auto AwbAlgoProfilesCcms = request->metadata().get(controls::draft::AwbColourCorrection); ++ if (AwbAlgoProfilesCcms) { ++ std::copy(std::begin(*AwbAlgoProfilesCcms), std::end(*AwbAlgoProfilesCcms), src_->ctrl.awb_algo_profile_ccms.begin()); ++ } ++ const auto AwbCurProfileName = request->metadata().get(controls::draft::AwbCurrentProfileName); ++ if (AwbCurProfileName) { ++ src_->ctrl.awb_current_profile_name = *AwbCurProfileName; ++ } ++ const auto AwbCurProfileColorTemp = request->metadata().get(controls::ColourTemperature); ++ if (AwbCurProfileColorTemp) { ++ src_->ctrl.awb_current_profile_color_temp = *AwbCurProfileColorTemp; ++ } ++ const auto DemosaicingEnable = request->metadata().get(controls::draft::DemosaicingEnable); ++ if (DemosaicingEnable) { ++ src_->ctrl.demosaicing_enable = *DemosaicingEnable; ++ } ++ const auto DemosaicingFilters = request->metadata().get(controls::draft::DemosaicingFilter); ++ if (DemosaicingFilters) { ++ std::copy(std::begin(*DemosaicingFilters), std::end(*DemosaicingFilters), src_->ctrl.demosaicing_filters.begin()); ++ } ++ const auto StatProfile = request->metadata().get(controls::draft::StatisticProfile); ++ if (StatProfile) { ++ src_->ctrl.statistic_profile = *StatProfile; ++ } ++ const auto StatAvgUp = request->metadata().get(controls::draft::StatisticAverageUp); ++ if (StatAvgUp) { ++ std::copy(std::begin(*StatAvgUp), std::end(*StatAvgUp), src_->ctrl.statistic_avg_up.begin()); ++ } ++ const auto StatAvgDown = request->metadata().get(controls::draft::StatisticAverageDown); ++ if (StatAvgDown) { ++ std::copy(std::begin(*StatAvgDown), std::end(*StatAvgDown), src_->ctrl.statistic_avg_down.begin()); ++ } ++ const auto StatHistUp = request->metadata().get(controls::draft::StatisticBinsUp); ++ if (StatHistUp) { ++ std::copy(std::begin(*StatHistUp), std::end(*StatHistUp), src_->ctrl.statistic_hist_up.begin()); ++ } ++ const auto StatHistDown = request->metadata().get(controls::draft::StatisticBinsDown); ++ if (StatHistDown) { ++ std::copy(std::begin(*StatHistDown), std::end(*StatHistDown), src_->ctrl.statistic_hist_down.begin()); ++ } ++ const auto GammaEnable = request->metadata().get(controls::draft::GammaCorrectionEnable); ++ if (GammaEnable) { ++ src_->ctrl.gamma_enable = *GammaEnable; ++ } ++ + if (GST_ELEMENT_CLOCK(src_)) { + int64_t timestamp = request->metadata().get(controls::SensorTimestamp).value_or(0); + +@@ -669,6 +941,7 @@ gst_libcamera_src_task_enter(GstTask *task, [[maybe_unused]] GThread *thread, + } + } + ++ /* Note: controls provided at start() are dropped by IPA */ + ret = state->cam_->start(&state->initControls_); + if (ret) { + GST_ELEMENT_ERROR(self, RESOURCE, SETTINGS, +@@ -730,6 +1003,7 @@ gst_libcamera_src_set_property(GObject *object, guint prop_id, + { + GLibLocker lock(GST_OBJECT(object)); + GstLibcameraSrc *self = GST_LIBCAMERA_SRC(object); ++ GstLibcameraSrcState *state = self->state; + + switch (prop_id) { + case PROP_CAMERA_NAME: +@@ -739,6 +1013,252 @@ gst_libcamera_src_set_property(GObject *object, guint prop_id, + case PROP_AUTO_FOCUS_MODE: + self->auto_focus_mode = static_cast(g_value_get_enum(value)); + break; ++ case PROP_BLACK_LEVEL_ENABLE: ++ { ++ bool enable = g_value_get_boolean(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::BlackLevelCorrectionEnable, ++ enable); ++ break; ++ } ++ case PROP_BLACK_LEVEL_VALUES: ++ { ++ int blR = g_value_get_int(gst_value_array_get_value(value, 0)); ++ int blG = g_value_get_int(gst_value_array_get_value(value, 1)); ++ int blB = g_value_get_int(gst_value_array_get_value(value, 2)); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::BlackLevelCorrectionLevels, ++ { blR, blG, blB }); ++ break; ++ } ++ case PROP_STATISTIC_AREA: ++ { ++ libcamera::Rectangle statarea; ++ statarea.x = g_value_get_int(gst_value_array_get_value(value, 0)); ++ statarea.y = g_value_get_int(gst_value_array_get_value(value, 1)); ++ statarea.width = g_value_get_int(gst_value_array_get_value(value, 2)); ++ statarea.height = g_value_get_int(gst_value_array_get_value(value, 3)); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::StatisticArea, statarea); ++ break; ++ } ++ case PROP_CONTRAST_ENABLE: ++ { ++ bool enable = g_value_get_boolean(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::ContrastLuminanceEnable, ++ enable); ++ break; ++ } ++ case PROP_CONTRAST_VALUES: ++ { ++ int LUM[9]; ++ for (unsigned int i = 0; i < 9; i++) { ++ LUM[i] = g_value_get_int(gst_value_array_get_value(value, i)); ++ } ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::ContrastLuminance, ++ { LUM[0], LUM[1], LUM[2], LUM[3], LUM[4], LUM[5], LUM[6], LUM[7], LUM[8] }); ++ break; ++ } ++ case PROP_AEC_ALGO_ENABLE: ++ { ++ bool enable = g_value_get_boolean(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::AeEnable, ++ enable); ++ break; ++ } ++ case PROP_AEC_ALGO_EXPOSURE_COMPENSATION: ++ { ++ float aec_algo_exposure_compensation; ++ aec_algo_exposure_compensation = g_value_get_float(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::ExposureValue, aec_algo_exposure_compensation); ++ break; ++ } ++ case PROP_AEC_ALGO_ANTIFLICKER_FREQUENCY: ++ { ++ int aec_algo_antiflicker_frequency = g_value_get_int(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::AntiFlickerFreq, aec_algo_antiflicker_frequency); ++ break; ++ } ++ case PROP_SENSOR_GAIN: ++ { ++ float gain_dB; ++ gain_dB = g_value_get_float(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::AnalogueGain_dB, gain_dB); ++ break; ++ } ++ case PROP_SENSOR_EXPOSURE: ++ { ++ int exposure_time; ++ exposure_time = g_value_get_int(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::ExposureTime, exposure_time); ++ break; ++ } ++ case PROP_SENSOR_DELAY: ++ { ++ int sensor_delay; ++ sensor_delay = g_value_get_int(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::SensorDelay, sensor_delay); ++ break; ++ } ++ case PROP_DO_SENSOR_DELAY_MEASURE: ++ { ++ bool do_sensor_delay_measure; ++ do_sensor_delay_measure = g_value_get_boolean(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::DoSensorDelayMeasure, do_sensor_delay_measure); ++ break; ++ } ++ case PROP_BADPIX_ENABLE: ++ { ++ bool enable = g_value_get_boolean(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::BadPixelRemovalEnable, enable); ++ break; ++ } ++ case PROP_BADPIX_STRENGTH: ++ { ++ int strength; ++ strength = g_value_get_int(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::BadPixelRemovalStrength, strength); ++ break; ++ } ++ case PROP_BADPIX_ALGO_THRESHOLD: ++ { ++ int threshold; ++ threshold = g_value_get_int(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::BadPixelRemovalThreshold, threshold); ++ break; ++ } ++ case PROP_ISP_GAIN_ENABLE: ++ { ++ bool enable = g_value_get_boolean(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::ColourGains3Enable, enable); ++ break; ++ } ++ case PROP_ISP_GAIN_VALUES: ++ { ++ int ISPGain[3]; ++ for (unsigned int i = 0; i < 3; i++) { ++ ISPGain[i] = g_value_get_int(gst_value_array_get_value(value, i)); ++ } ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::ColourGains3, ++ { ISPGain[0], ISPGain[1], ISPGain[2] }); ++ break; ++ } ++ case PROP_CCM_ENABLE: ++ { ++ bool enable = g_value_get_boolean(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::ColourCorrectionEnable, enable); ++ break; ++ } ++ case PROP_CCM_VALUES: ++ { ++ int CCMCoeff[9]; ++ for (unsigned int i = 0; i < 9; i++) { ++ CCMCoeff[i] = g_value_get_int(gst_value_array_get_value(value, i)); ++ } ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::ColourCorrection, ++ { CCMCoeff[0], CCMCoeff[1], CCMCoeff[2], ++ CCMCoeff[3], CCMCoeff[4], CCMCoeff[5], ++ CCMCoeff[6], CCMCoeff[7], CCMCoeff[8] }); ++ break; ++ } ++ case PROP_AWB_ALGO_ENABLE: ++ { ++ bool enable = g_value_get_boolean(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::AwbEnable, enable); ++ break; ++ } ++ case PROP_AWB_ALGO_PROFILE_NAMES: ++ { ++ /* The Controls class does not support array of string. So, concatenate the strings in a single one */ ++ std::string concatProfileNames = ""; ++ for (unsigned int i = 0; i < 5; i++) { ++ if (!concatProfileNames.empty()) ++ concatProfileNames += '$'; ++ concatProfileNames += g_value_get_string(gst_value_array_get_value(value, i)); ++ } ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::AwbProfileName, concatProfileNames); ++ break; ++ } ++ case PROP_AWB_ALGO_PROFILE_COLOR_TEMPS: ++ { ++ std::array ColorTemps; ++ for (unsigned int i = 0; i < ColorTemps.size(); i++) { ++ ColorTemps[i] = g_value_get_int(gst_value_array_get_value(value, i)); ++ } ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::AwbReferenceColorTemperature, ColorTemps); ++ break; ++ } ++ case PROP_AWB_ALGO_PROFILE_ISP_GAINS: ++ { ++ std::array IspGains; ++ for (unsigned int i = 0; i < IspGains.size(); i++) { ++ IspGains[i] = g_value_get_int(gst_value_array_get_value(value, i)); ++ } ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::AwbColourGains3, IspGains); ++ break; ++ } ++ case PROP_AWB_ALGO_PROFILE_CCMS: ++ { ++ std::array Ccms; ++ for (unsigned int i = 0; i < Ccms.size(); i++) { ++ Ccms[i] = g_value_get_int(gst_value_array_get_value(value, i)); ++ } ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::AwbColourCorrection, Ccms); ++ break; ++ } ++ case PROP_DEMOSAICING_ENABLE: ++ { ++ bool enable = g_value_get_boolean(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::DemosaicingEnable, enable); ++ break; ++ } ++ case PROP_DEMOSAICING_FILTERS: ++ { ++ std::array Filters; ++ for (unsigned int i = 0; i < Filters.size(); i++) { ++ Filters[i] = g_value_get_int(gst_value_array_get_value(value, i)); ++ } ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::DemosaicingFilter, Filters); ++ break; ++ } ++ case PROP_STATISTIC_PROFILE: ++ { ++ int StatProfile; ++ StatProfile = g_value_get_int(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::StatisticProfile, StatProfile); ++ break; ++ } ++ case PROP_GAMMA_ENABLE: ++ { ++ bool enable = g_value_get_boolean(value); ++ GLibLocker locker(&state->controlsLock_); ++ state->pendingControls_.set(controls::draft::GammaCorrectionEnable, enable); ++ break; ++ } + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; +@@ -759,6 +1279,262 @@ gst_libcamera_src_get_property(GObject *object, guint prop_id, GValue *value, + case PROP_AUTO_FOCUS_MODE: + g_value_set_enum(value, static_cast(self->auto_focus_mode)); + break; ++ case PROP_HW_REVISION: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < 2; ++i) { ++ g_value_set_int(&val, self->ctrl.hwrevision[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_DECIMATION: ++ g_value_set_int(value, self->ctrl.decimation); ++ break; ++ case PROP_BLACK_LEVEL_ENABLE: ++ g_value_set_boolean(value, self->ctrl.black_level_enable); ++ break; ++ case PROP_BLACK_LEVEL_VALUES: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < 3; ++i) { ++ g_value_set_int(&val, self->ctrl.black_level_values[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_STATISTIC_AREA: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ g_value_set_int(&val, self->ctrl.statistic_area.x); ++ gst_value_array_append_value(value, &val); ++ g_value_set_int(&val, self->ctrl.statistic_area.y); ++ gst_value_array_append_value(value, &val); ++ g_value_set_int(&val, self->ctrl.statistic_area.width); ++ gst_value_array_append_value(value, &val); ++ g_value_set_int(&val, self->ctrl.statistic_area.height); ++ gst_value_array_append_value(value, &val); ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_CONTRAST_ENABLE: ++ g_value_set_boolean(value, self->ctrl.contrast_enable); ++ break; ++ case PROP_CONTRAST_VALUES: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < 9; ++i) { ++ g_value_set_int(&val, self->ctrl.contrast_values[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_AEC_ALGO_ENABLE: ++ g_value_set_boolean(value, self->ctrl.aec_algo_enable); ++ break; ++ case PROP_AEC_ALGO_EXPOSURE_COMPENSATION: ++ g_value_set_float(value, self->ctrl.aec_algo_exposure_compensation); ++ break; ++ case PROP_AEC_ALGO_EXPOSURE_TARGET: ++ g_value_set_int(value, self->ctrl.aec_algo_exposure_target); ++ break; ++ case PROP_AEC_ALGO_ANTIFLICKER_FREQUENCY: ++ g_value_set_int(value, self->ctrl.aec_algo_antiflicker_frequency); ++ break; ++ case PROP_SENSOR_GAIN: ++ g_value_set_float(value, self->ctrl.sensor_gain_dB); ++ break; ++ case PROP_SENSOR_EXPOSURE: ++ g_value_set_int(value, self->ctrl.sensor_exposure); ++ break; ++ case PROP_SENSOR_DELAY: ++ g_value_set_int(value, self->ctrl.sensor_delay); ++ break; ++ case PROP_SENSOR_DELAY_MEASURE: ++ g_value_set_int(value, self->ctrl.sensor_delay_measure); ++ break; ++ case PROP_BADPIX_ENABLE: ++ g_value_set_boolean(value, self->ctrl.badpix_enable); ++ break; ++ case PROP_BADPIX_STRENGTH: ++ g_value_set_int(value, self->ctrl.badpix_strength); ++ break; ++ case PROP_BADPIX_COUNT: ++ g_value_set_int(value, self->ctrl.badpix_count); ++ break; ++ case PROP_BADPIX_ALGO_THRESHOLD: ++ g_value_set_int(value, self->ctrl.badpix_algo_threshold); ++ break; ++ case PROP_ISP_GAIN_ENABLE: ++ g_value_set_boolean(value, self->ctrl.ispgain_enable); ++ break; ++ case PROP_ISP_GAIN_VALUES: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < 3; ++i) { ++ g_value_set_int(&val, self->ctrl.ispgain_values[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_CCM_ENABLE: ++ g_value_set_boolean(value, self->ctrl.ccm_enable); ++ break; ++ case PROP_CCM_VALUES: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < 9; ++i) { ++ g_value_set_int(&val, self->ctrl.ccm_values[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_AWB_ALGO_ENABLE: ++ g_value_set_boolean(value, self->ctrl.awb_algo_enable); ++ break; ++ case PROP_AWB_ALGO_PROFILE_NAMES: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_STRING); ++ for (guint i = 0; i < self->ctrl.awb_algo_profile_names.size(); ++i) { ++ if (self->ctrl.awb_algo_profile_names[i].empty()) ++ g_value_set_string(&val, ""); ++ else ++ g_value_set_string(&val, self->ctrl.awb_algo_profile_names[i].c_str()); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_AWB_ALGO_PROFILE_COLOR_TEMPS: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < self->ctrl.awb_algo_profile_color_temps.size(); ++i) { ++ g_value_set_int(&val, self->ctrl.awb_algo_profile_color_temps[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_AWB_ALGO_PROFILE_ISP_GAINS: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < self->ctrl.awb_algo_profile_isp_gains.size(); ++i) { ++ g_value_set_int(&val, self->ctrl.awb_algo_profile_isp_gains[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_AWB_ALGO_PROFILE_CCMS: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < self->ctrl.awb_algo_profile_ccms.size(); ++i) { ++ g_value_set_int(&val, self->ctrl.awb_algo_profile_ccms[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_AWB_CURRENT_PROFILE_NAME: ++ g_value_set_string(value, self->ctrl.awb_current_profile_name.c_str()); ++ break; ++ case PROP_AWB_CURRENT_PROFILE_COLOR_TEMP: ++ g_value_set_int(value, self->ctrl.awb_current_profile_color_temp); ++ break; ++ case PROP_DEMOSAICING_ENABLE: ++ g_value_set_boolean(value, self->ctrl.demosaicing_enable); ++ break; ++ case PROP_DEMOSAICING_FILTERS: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < self->ctrl.demosaicing_filters.size(); ++i) { ++ g_value_set_int(&val, self->ctrl.demosaicing_filters[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_STATISTIC_PROFILE: ++ g_value_set_int(value, self->ctrl.statistic_profile); ++ break; ++ case PROP_STATISTIC_GET_AVERAGE_UP: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < self->ctrl.statistic_avg_up.size(); ++i) { ++ g_value_set_int(&val, self->ctrl.statistic_avg_up[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_STATISTIC_GET_AVERAGE_DOWN: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < self->ctrl.statistic_avg_down.size(); ++i) { ++ g_value_set_int(&val, self->ctrl.statistic_avg_down[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_STATISTIC_GET_HISTOGRAM_UP: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < self->ctrl.statistic_hist_up.size(); ++i) { ++ g_value_set_int(&val, self->ctrl.statistic_hist_up[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_STATISTIC_GET_HISTOGRAM_DOWN: ++ { ++ GValue val = G_VALUE_INIT; ++ g_value_reset (value); ++ g_value_init (&val, G_TYPE_INT); ++ for (guint i = 0; i < self->ctrl.statistic_hist_down.size(); ++i) { ++ g_value_set_int(&val, self->ctrl.statistic_hist_down[i]); ++ gst_value_array_append_value(value, &val); ++ } ++ g_value_unset (&val); ++ break; ++ } ++ case PROP_GAMMA_ENABLE: ++ g_value_set_boolean(value, self->ctrl.gamma_enable); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; +@@ -844,6 +1620,7 @@ gst_libcamera_src_finalize(GObject *object) + g_rec_mutex_clear(&self->stream_lock); + g_clear_object(&self->task); + g_mutex_clear(&self->state->lock_); ++ g_mutex_clear(&self->state->controlsLock_); + g_free(self->camera_name); + delete self->state; + +@@ -863,9 +1640,12 @@ gst_libcamera_src_init(GstLibcameraSrc *self) + gst_task_set_lock(self->task, &self->stream_lock); + + g_mutex_init(&state->lock_); ++ g_mutex_init(&state->controlsLock_); + +- state->srcpads_.push_back(gst_pad_new_from_template(templ, "src")); +- gst_element_add_pad(GST_ELEMENT(self), state->srcpads_.back()); ++ GstPad *pad = gst_pad_new_from_template(templ, "src"); ++ state->srcpads_.push_back(pad); ++ gst_element_add_pad(GST_ELEMENT(self), pad); ++ gst_child_proxy_child_added(GST_CHILD_PROXY(self), G_OBJECT(pad), GST_OBJECT_NAME(pad)); + + GST_OBJECT_FLAG_SET(self, GST_ELEMENT_FLAG_SOURCE); + +@@ -896,6 +1676,8 @@ gst_libcamera_src_request_new_pad(GstElement *element, GstPadTemplate *templ, + return NULL; + } + ++ gst_child_proxy_child_added(GST_CHILD_PROXY(self), G_OBJECT(pad), GST_OBJECT_NAME(pad)); ++ + return reinterpret_cast(g_steal_pointer(&pad)); + } + +@@ -904,6 +1686,8 @@ gst_libcamera_src_release_pad(GstElement *element, GstPad *pad) + { + GstLibcameraSrc *self = GST_LIBCAMERA_SRC(element); + ++ gst_child_proxy_child_removed(GST_CHILD_PROXY(self), G_OBJECT(pad), GST_OBJECT_NAME(pad)); ++ + GST_DEBUG_OBJECT(self, "Pad %" GST_PTR_FORMAT " being released", pad); + + { +@@ -963,4 +1747,338 @@ gst_libcamera_src_class_init(GstLibcameraSrcClass *klass) + static_cast(controls::AfModeManual), + G_PARAM_WRITABLE); + g_object_class_install_property(object_class, PROP_AUTO_FOCUS_MODE, spec); ++ ++ /* Add ISP properties */ ++ /* HW Revision values read property */ ++ spec = gst_param_spec_array("hw-revision", ++ "Hardware revsion ID", ++ "ISP Hardware revsion ID ('Major, Minor')", ++ g_param_spec_int ("hw-revision-value", "ISP Hardware revsion ID", ++ "One of Major, Minor value.", 0, 255, 0, ++ G_PARAM_READABLE), ++ G_PARAM_READABLE); ++ g_object_class_install_property(object_class, PROP_HW_REVISION, spec); ++ /* Decimation values read property */ ++ spec = g_param_spec_int("decimation-factor", ++ "Decimation factor", ++ "ISP Decimation factor ('1, 2, 4 or 8')", ++ 1, 8, 1, ++ G_PARAM_READABLE); ++ g_object_class_install_property(object_class, PROP_DECIMATION, spec); ++ /* Black level enable property */ ++ spec = g_param_spec_boolean("black-level-enable", ++ "Black level enable", ++ "ISP Black Level correction bloc activation", ++ false, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_BLACK_LEVEL_ENABLE, spec); ++ /* Black level values property */ ++ spec = gst_param_spec_array("black-level-values", ++ "Black level RGB values", ++ "ISP Black Level correction values ('')", ++ g_param_spec_int ("black-level-value", "Black level value", ++ "One of R, G, B value.", 0, 255, 0, ++ G_PARAM_READWRITE), ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_BLACK_LEVEL_VALUES, spec); ++ /* Satistic area property */ ++ spec = gst_param_spec_array("statistic-area", ++ "Statistic Area", ++ "ISP Statistic Area ('')", ++ g_param_spec_int ("statarea-value", "Satistic Area value", ++ "One of X0, Y0, XSize, YSize", 0, 4096, 0, ++ G_PARAM_READWRITE), ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_STATISTIC_AREA, spec); ++ /* Contrast enable property */ ++ spec = g_param_spec_boolean("contrast-enable", ++ "Contrast enable", ++ "ISP Contrast bloc activation", ++ false, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_CONTRAST_ENABLE, spec); ++ /* Contrast values property */ ++ spec = gst_param_spec_array("contrast-values", ++ "Contrast multiplication factor values", ++ "ISP Contrast multiplication factor values ('')", ++ g_param_spec_int ("contrast-value", "Contrast value", ++ "One of LUM_0, LUM_32, LUM_64, LUM_96, LUM_128, LUM_160, LUM_192, LUM_224, LUM_256 value.", 0, 394, 0, ++ G_PARAM_READWRITE), ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_CONTRAST_VALUES, spec); ++ /* AEC algo enable property */ ++ spec = g_param_spec_boolean("aec-algo-enable", ++ "AEC algo enable", ++ "Activation of the AEC algorithm", ++ false, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_AEC_ALGO_ENABLE, spec); ++ /* AEC algo exposure compensation */ ++ spec = g_param_spec_float("aec-algo-exposure-compensation", ++ "AEC exposure compensation", ++ "AEC exposure compensation when algo is enabled ('-2EV, -1.5EV, -1EV, -0.5EV, 0EV, +0.5EV, +1EV, +1.5EV, +2EV')", ++ -2, 2, 0, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_AEC_ALGO_EXPOSURE_COMPENSATION, spec); ++ /* AEC algo exposure target */ ++ spec = g_param_spec_int("aec-algo-exposure-target", ++ "AEC exposure target", ++ "AEC exposure target that depends on exposure compensation set", ++ 0, 255, 56, ++ G_PARAM_READABLE); ++ g_object_class_install_property(object_class, PROP_AEC_ALGO_EXPOSURE_TARGET, spec); ++ /* AEC anti-flicker frequency */ ++ spec = g_param_spec_int("aec-algo-antiflicker-frequency", ++ "AEC anti-flicker frequency", ++ "AEC anti-flicker frequency (0 for disabling the feature, 50Hz or 60Hz)", ++ 0, 60, 0, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_AEC_ALGO_ANTIFLICKER_FREQUENCY, spec); ++ /* Sensor gain property */ ++ spec = g_param_spec_float("sensor-gain", ++ "Sensor analog gain", ++ "Gain of the sensor in dB", ++ 0, 100, 0, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_SENSOR_GAIN, spec); ++ /* Sensor exposure time property */ ++ spec = g_param_spec_int("sensor-exposure", ++ "Sensor exposure time", ++ "Sensor exposure time in us", ++ 0, 100000, 0, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_SENSOR_EXPOSURE, spec); ++ /* Sensor delay property */ ++ spec = g_param_spec_int("sensor-delay", ++ "Sensor delay", ++ "Sensor delay in number of VSync", ++ 1, 255, 1, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_SENSOR_DELAY, spec); ++ /* Sensor delay measure property */ ++ spec = g_param_spec_int("sensor-delay-measure", ++ "Sensor delay measure", ++ "Sensor delay in number of VSync", ++ -1, 255, -1, ++ G_PARAM_READABLE); ++ g_object_class_install_property(object_class, PROP_SENSOR_DELAY_MEASURE, spec); ++ /* Do sensor delay measure property */ ++ spec = g_param_spec_boolean("do-sensor-delay-measure", ++ "Do sensor delay measure", ++ "Do sensor delay measure", ++ false, ++ G_PARAM_WRITABLE); ++ g_object_class_install_property(object_class, PROP_DO_SENSOR_DELAY_MEASURE, spec); ++ /* Bad pixel removal enable property */ ++ spec = g_param_spec_boolean("badpixel-enable", ++ "Bad pixel removal enable", ++ "Activation of the bad pixel removel block", ++ false, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_BADPIX_ENABLE, spec); ++ /* Bad pixel removal strength property */ ++ spec = g_param_spec_int("badpixel-strength", ++ "Bad pixel removal strength", ++ "Bad pixel removal filter strength", ++ 0, 7, 0, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_BADPIX_STRENGTH, spec); ++ /* Bad pixel removal count property */ ++ spec = g_param_spec_int("badpixel-count", ++ "Bad pixel removal count", ++ "Count of the number of bad pixel detected", ++ 0, 4095, 0, ++ G_PARAM_READABLE); ++ g_object_class_install_property(object_class, PROP_BADPIX_COUNT, spec); ++ /* Bad pixel removal algo threshold */ ++ spec = g_param_spec_int("badpixel-algo-threshold", ++ "Bad pixel removal algorithm threshold", ++ "Threshold defining the maximum number of bad pixel expected to be detected", ++ 0, 4095, 0, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_BADPIX_ALGO_THRESHOLD, spec); ++ /* ISP gain enable property */ ++ spec = g_param_spec_boolean("isp-gain-enable", ++ "ISP gain enable", ++ "ISP gain bloc activation", ++ false, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_ISP_GAIN_ENABLE, spec); ++ /* ISP gain values property */ ++ spec = gst_param_spec_array("isp-gain-values", ++ "ISP gain values", ++ "ISP gain multiplication factor values ('')", ++ g_param_spec_int ("isp-gain-value", "ISP gain value", ++ "One of ISPGainR, ISPGainG, ISPGainB value.", 0, 1600000000, 100000000, ++ G_PARAM_READWRITE), ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_ISP_GAIN_VALUES, spec); ++ /* CCM enable property */ ++ spec = g_param_spec_boolean("ccm-enable", ++ "Color correction matrix enable", ++ "ISP color correction matrix bloc activation", ++ false, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_CCM_ENABLE, spec); ++ /* CCM values property */ ++ spec = gst_param_spec_array("ccm-values", ++ "Color correction matrix values", ++ "ISP color correction matrix values ('')", ++ g_param_spec_int ("ccm-value", "CCM value", ++ "One of CCMCoeff11, CCMCoeff12, CCMCoeff13, CCMCoeff21, CCMCoeff22, CCMCoeff23, CCMCoeff31, CCMCoeff32, CCMCoeff33 value.", -399000000, 399000000, 0, ++ G_PARAM_READWRITE), ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_CCM_VALUES, spec); ++ /* AWB algo enable property */ ++ spec = g_param_spec_boolean("awb-algo-enable", ++ "AWB algo enable", ++ "Activation of the AWB algorithm", ++ false, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_AWB_ALGO_ENABLE, spec); ++ /* AWB algo profileID values property */ ++ spec = gst_param_spec_array("awb-algo-profile-names", ++ "AWB algo profile names", ++ "Array of AWB profile name (one entry per profile) used by the AWB algorithm ('')", ++ g_param_spec_string ("awb-algo-profile-name", "AWB profile name strings of 32bytes maximum", ++ "One of Name0, Name1, Name2, Name3, Name4", NULL, ++ G_PARAM_READWRITE), ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_AWB_ALGO_PROFILE_NAMES, spec); ++ /* AWB algo color temperature values property */ ++ spec = gst_param_spec_array("awb-algo-profile-color-temps", ++ "AWB algo color temperatures", ++ "Array of reference color tempeartures (one entry per profile) used by the AWB algorithm ('')", ++ g_param_spec_int ("awb-algo-profile-color-temp", "AWB profile color temperature value", ++ "One of ColorTemp0, ColorTemp1, ColorTemp2, ColorTemp3, ColorTemp4 value.", 0, 12000, 0, ++ G_PARAM_READWRITE), ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_AWB_ALGO_PROFILE_COLOR_TEMPS, spec); ++ /* AWB algo ISP gain values property */ ++ spec = gst_param_spec_array("awb-algo-profile-isp-gains", ++ "AWB algo ISP gains", ++ "Array of ISP gains (one entry per profile) used by the AWB algorithm ('')", ++ g_param_spec_int ("awb-algo-profile-isp-gain", "AWB profile ISP Gain value", ++ "One of ISPGain0R, ISPGain0G, ISPGain0B, ..., ISPGain4R, ISPGain4G, ISPGain4B value.", 0, 1600000000, 100000000, ++ G_PARAM_READWRITE), ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_AWB_ALGO_PROFILE_ISP_GAINS, spec); ++ /* AWB algo color correction matrix values property */ ++ spec = gst_param_spec_array("awb-algo-profile-ccms", ++ "AWB algo color correction matrix values", ++ "Array of color convertion matrices (one entry per profile) used by the AWB algorithm ('')", ++ g_param_spec_int ("awb-algo-profile-ccm", "AWB profile CCM value", ++ "One of CCM0Coeff11, CCM0Coeff12, ... , CCM0Coeff32, CCM0Coeff33, ... , CCM4Coeff11, CCM4Coeff12, ... , CCM4Coeff32, CCM4Coeff33 value.", -399000000, 399000000, 0, ++ G_PARAM_READWRITE), ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_AWB_ALGO_PROFILE_CCMS, spec); ++ /* AWB current profile name */ ++ spec = g_param_spec_string("awb-current-profile-name", ++ "AWB current profile name", ++ "Name of the current profile applied by the AWB (string of 32bytes maximum)", NULL, ++ G_PARAM_READABLE); ++ g_object_class_install_property(object_class, PROP_AWB_CURRENT_PROFILE_NAME, spec); ++ /* AWB current profile name */ ++ spec = g_param_spec_int ("awb-current-profile-color-temp", ++ "AWB current color temperature", ++ "Color temperature of the current profile applied by the AWB", ++ 0, 12000, 0, ++ G_PARAM_READABLE), ++ g_object_class_install_property(object_class, PROP_AWB_CURRENT_PROFILE_COLOR_TEMP, spec); ++ /* Demosaicing enable property */ ++ spec = g_param_spec_boolean("demosaicing-enable", ++ "Demosaicing enable", ++ "ISP demosaicing bloc activation", ++ false, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_DEMOSAICING_ENABLE, spec); ++ /* Demosaicing filter values property */ ++ spec = gst_param_spec_array("demosaicing-filters", ++ "Demosaicing filter values", ++ "ISP demosaicing filter values ('')", ++ g_param_spec_int ("demosaicing-filter", "Demosaicing filter value", ++ "One of Peak, LineV, LineH, Edge value.", 0, 7, 0, ++ G_PARAM_READWRITE), ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_DEMOSAICING_FILTERS, spec); ++ /* Statistic profile property */ ++ spec = g_param_spec_int("statistic-profile", ++ "Statistic profile", ++ "ISP statistic extraction profile ('<0 = Full stats (histogram and average, up and down), 1 = average up stats, 2 = average down stats>')", ++ 0, 2, 0, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_STATISTIC_PROFILE, spec); ++ /* Statistic up average property */ ++ spec = gst_param_spec_array("statistic-get-average-up", ++ "Get statistic average at up level", ++ "Up ISP average statistic results values ('')", ++ g_param_spec_int ("statistic-average-up", "Average statistic results value", ++ "One of R, G, B, L average statistic value", 0, 255, 0, ++ G_PARAM_READABLE), ++ G_PARAM_READABLE); ++ g_object_class_install_property(object_class, PROP_STATISTIC_GET_AVERAGE_UP, spec); ++ /* Statistic down average property */ ++ spec = gst_param_spec_array("statistic-get-average-down", ++ "Get statistic average at down level", ++ "Down ISP average statistic results values ('')", ++ g_param_spec_int ("statistic-average-down", "Average statistic results value", ++ "One of R, G, B, L average statistic value", 0, 255, 0, ++ G_PARAM_READABLE), ++ G_PARAM_READABLE); ++ g_object_class_install_property(object_class, PROP_STATISTIC_GET_AVERAGE_DOWN, spec); ++ /* Statistic up histogram property */ ++ spec = gst_param_spec_array("statistic-get-histogram-up", ++ "Get statistic histogram at up level", ++ "Up ISP histogram statistic results values ('')", ++ g_param_spec_int ("statistic-histogram-up", "Histogram statistic results value", ++ "One of bin0, ... , bin11 statistic value", 0, 16777215, 0, ++ G_PARAM_READABLE), ++ G_PARAM_READABLE); ++ g_object_class_install_property(object_class, PROP_STATISTIC_GET_HISTOGRAM_UP, spec); ++ /* Statistic down histogram property */ ++ spec = gst_param_spec_array("statistic-get-histogram-down", ++ "Get statistic histogram at down level", ++ "Down ISP histogram statistic results values ('')", ++ g_param_spec_int ("statistic-histogram-down", "Histogram statistic results value", ++ "One of bin0, ... , bin11 statistic value", 0, 16777215, 0, ++ G_PARAM_READABLE), ++ G_PARAM_READABLE); ++ g_object_class_install_property(object_class, PROP_STATISTIC_GET_HISTOGRAM_DOWN, spec); ++ /* Gamma enable property */ ++ spec = g_param_spec_boolean("gamma-enable", ++ "Gamma correction enable", ++ "Gamma correction bloc activation", ++ false, ++ G_PARAM_READWRITE); ++ g_object_class_install_property(object_class, PROP_GAMMA_ENABLE, spec); ++} ++ ++/* GstChildProxy implementation */ ++static GObject * ++gst_libcamera_src_child_proxy_get_child_by_index(GstChildProxy * child_proxy, ++ guint index) ++{ ++ GLibLocker lock(GST_OBJECT(child_proxy)); ++ GObject *obj = nullptr; ++ ++ obj = reinterpret_cast(g_list_nth_data(GST_ELEMENT(child_proxy)->srcpads, index)); ++ if (obj) ++ gst_object_ref(obj); ++ ++ return obj; ++} ++ ++static guint ++gst_libcamera_src_child_proxy_get_children_count(GstChildProxy * child_proxy) ++{ ++ GLibLocker lock(GST_OBJECT(child_proxy)); ++ return GST_ELEMENT_CAST(child_proxy)->numsrcpads; ++} ++ ++static void ++gst_libcamera_src_child_proxy_init(gpointer g_iface, [[maybe_unused]] gpointer iface_data) ++{ ++ GstChildProxyInterface *iface = reinterpret_cast(g_iface); ++ iface->get_child_by_index = gst_libcamera_src_child_proxy_get_child_by_index; ++ iface->get_children_count = gst_libcamera_src_child_proxy_get_children_count; + } +diff --git a/src/ipa/dcmipp/algorithms/aec.cpp b/src/ipa/dcmipp/algorithms/aec.cpp +new file mode 100644 +index 00000000..546cd672 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/aec.cpp +@@ -0,0 +1,704 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * Copyright (C) 2024 LACROIX - Impulse ++ * ++ * aec.cpp - STM32 DCMIPP AE control ++ */ ++ ++#include "aec.h" ++ ++#include ++ ++#include ++ ++#include ++ ++#ifdef EVISION_ALGO_ENABLED ++#include ++#include ++ ++#include "evision-api-st-ae.h" ++#endif /* EVISION_ALGO_ENABLED */ ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++LOG_DEFINE_CATEGORY(DcmippAec) ++ ++static constexpr uint8_t kAlgoIdealExposureTarget = 56; ++static constexpr float kEVMin = -2.0f; ++static constexpr float kEVMax = 2.0f; ++static constexpr float kEVDef = 0.0f; ++static constexpr uint32_t kAntiflickerFreqMin = 0; ++static constexpr uint32_t kAntiflickerFreqMax = 60; ++static constexpr uint32_t kAntiflickerFreqDef = 0; ++static constexpr int32_t kSensorDelayMin = 1; ++static constexpr int32_t kSensorDelayMax = 255; ++static constexpr int32_t kSensorDelayDef = 1; ++ ++#ifdef EVISION_ALGO_ENABLED ++static constexpr uint32_t kmdB = 1000; ++ ++static void *plib_handle = nullptr; ++static evision_st_ae_process_t *pIspAEprocess = nullptr; ++ ++typedef evision_st_ae_process_t *(*evision_api_st_ae_new_t)(evision_api_log_callback log_cb); ++typedef evision_return_t (*evision_api_st_ae_delete_t)(evision_st_ae_process_t *self); ++typedef evision_return_t (*evision_api_st_ae_init_t)(evision_st_ae_process_t *const self); ++typedef evision_return_t (*evision_api_st_ae_process_t)(evision_st_ae_process_t *const self, uint32_t current_gain, uint32_t current_exposure, uint8_t average_lum); ++ ++static evision_api_st_ae_new_t evision_api_st_ae_new = nullptr; ++static evision_api_st_ae_init_t evision_api_st_ae_init = nullptr; ++static evision_api_st_ae_delete_t evision_api_st_ae_delete = nullptr; ++static evision_api_st_ae_process_t evision_api_st_ae_process = nullptr; ++#endif /* EVISION_ALGO_ENABLED */ ++ ++static bool process_simple_algo = true; ++ ++static bool isExposureValueValid(float exposureValue) ++{ ++ return exposureValue >= kEVMin && exposureValue <= kEVMax; ++} ++ ++static bool isAntiflickerFreqValid(uint32_t antiflickerFreq) ++{ ++ return antiflickerFreq >= kAntiflickerFreqMin && antiflickerFreq <= kAntiflickerFreqMax; ++} ++ ++static bool isExposureTimeValid(int32_t exposureTime, IPAContext &context) ++{ ++ return exposureTime >= context.info.sensorExposureMin && exposureTime <= context.info.sensorExposureMax; ++} ++ ++static bool isGainValid(double gain, IPAContext &context) ++{ ++ return gain >= context.info.sensorGainMin && gain <= context.info.sensorGainMax; ++} ++ ++static bool isSensorDelayValid(int32_t delay) ++{ ++ return delay >= kSensorDelayMin && delay <= kSensorDelayMax; ++} ++ ++#ifdef EVISION_ALGO_ENABLED ++static bool initializeLibrary() ++{ ++ const char *lib_dir = "/usr/lib/"; ++ const char *lib_name = "libevision-st-ae.so.1"; ++ std::string lib_path = std::string(lib_dir) + lib_name; ++ ++ plib_handle = dlopen(lib_path.c_str(), RTLD_LAZY); ++ if (!plib_handle) { ++ LOG(DcmippAec, Warning) << "Cannot open library: " << dlerror(); ++ LOG(DcmippAec, Warning) << "Fall back to simple AEC algorithm processing"; ++ return true; ++ } ++ ++ dlerror(); // Clear any existing error ++ ++ process_simple_algo = false; ++ evision_api_st_ae_new = (evision_api_st_ae_new_t)dlsym(plib_handle, "evision_api_st_ae_new"); ++ const char *dlsym_error = dlerror(); ++ if (dlsym_error) { ++ LOG(DcmippAec, Error) << "Cannot load symbol 'evision_api_st_ae_new': " << dlsym_error; ++ dlclose(plib_handle); ++ return false; ++ } ++ ++ evision_api_st_ae_init = (evision_api_st_ae_init_t)dlsym(plib_handle, "evision_api_st_ae_init"); ++ dlsym_error = dlerror(); ++ if (dlsym_error) { ++ LOG(DcmippAec, Error) << "Cannot load symbol 'evision_api_st_ae_init': " << dlsym_error; ++ dlclose(plib_handle); ++ return false; ++ } ++ ++ evision_api_st_ae_delete = (evision_api_st_ae_delete_t)dlsym(plib_handle, "evision_api_st_ae_delete"); ++ dlsym_error = dlerror(); ++ if (dlsym_error) { ++ LOG(DcmippAec, Error) << "Cannot load symbol 'evision_api_st_ae_delete': " << dlsym_error; ++ dlclose(plib_handle); ++ return false; ++ } ++ ++ evision_api_st_ae_process = (evision_api_st_ae_process_t)dlsym(plib_handle, "evision_api_st_ae_process"); ++ dlsym_error = dlerror(); ++ if (dlsym_error) { ++ LOG(DcmippAec, Error) << "Cannot load symbol 'evision_api_st_ae_process': " << dlsym_error; ++ dlclose(plib_handle); ++ return false; ++ } ++ ++ return true; ++} ++ ++static void log_cb(const char *const msg) ++{ ++ LOG(DcmippAec, Debug) << msg; ++} ++ ++static bool initializeAeInstance() ++{ ++ if (!plib_handle) { ++ LOG(DcmippAec, Error) << "Library not loaded"; ++ return false; ++ } ++ ++ pIspAEprocess = evision_api_st_ae_new(log_cb); ++ if (pIspAEprocess == nullptr) { ++ LOG(DcmippAec, Error) << "Failed to create pIspAEprocess"; ++ return false; ++ } ++ ++ evision_return_t init_result = evision_api_st_ae_init(pIspAEprocess); ++ if (init_result != EVISION_RET_SUCCESS) { ++ LOG(DcmippAec, Error) << "Failed to initialize pIspAEprocess"; ++ evision_api_st_ae_delete(pIspAEprocess); ++ pIspAEprocess = nullptr; ++ return false; ++ } ++ ++ return true; ++} ++ ++static void deinitializeAeInstance() ++{ ++ if (pIspAEprocess) { ++ evision_api_st_ae_delete(pIspAEprocess); ++ pIspAEprocess = nullptr; ++ } ++} ++ ++static void deinitializeLibrary() ++{ ++ if (plib_handle) { ++ dlclose(plib_handle); ++ plib_handle = nullptr; ++ } ++} ++ ++evision_return_t processAeInstance(double *gain, int32_t *exposure, uint32_t average_lum) ++{ ++ if (!pIspAEprocess) { ++ LOG(DcmippAec, Error) << "AE instance not initialized"; ++ return EVISION_RET_PARAM_ERR; ++ } ++ ++ if (!gain || !exposure) { ++ LOG(DcmippAec, Error) << "Null pointer passed for gain or exposure"; ++ return EVISION_RET_PARAM_ERR; ++ } ++ ++ evision_return_t e_ret = evision_api_st_ae_process(pIspAEprocess, static_cast(*gain * kmdB), static_cast(*exposure), static_cast(average_lum)); ++ if (e_ret != EVISION_RET_SUCCESS) { ++ LOG(DcmippAec, Error) << "AE process failed"; ++ return EVISION_RET_FAILURE; ++ } ++ ++ *gain = static_cast(pIspAEprocess->new_gain) / kmdB; ++ *exposure = static_cast(pIspAEprocess->new_exposure); ++ ++ return EVISION_RET_SUCCESS; ++} ++#endif /* EVISION_ALGO_ENABLED */ ++ ++const int32_t kAecTolerance = 15; ++const float kAecCoeffLumGain = 0.1f; ++const float kAecGainUpdateMax = 5.0f; ++const float kAecExposureUpdateRatio = 1.2f; ++const int32_t kAecExposureMin = 400; ++const int32_t kAecSensorDelayMax = 10; ++const int32_t kAecSensorDelayLMargin = 2; ++const int32_t kAecSensorStartupFrames = 30; ++ ++int Aec::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData) ++{ ++ /* Check for AEC algo config */ ++ params_.algoEnable = tuningData["AeEnable"].get(0); ++ params_.algoExposureValue = tuningData["ExposureValue"].get(kEVDef); ++ if (!isExposureValueValid(params_.algoExposureValue)) { ++ LOG(DcmippAec, Error) << "Invalid Exposure value: " << params_.algoExposureValue; ++ return -EINVAL; ++ } ++ ++ params_.algoTarget = kAlgoIdealExposureTarget * pow(2, params_.algoExposureValue); ++ ++ /* Check for sensor static config (exposure time in microseconds, gain in dB) */ ++ params_.sensorStatic.exposure = tuningData["ExposureTime"].get(10000); ++ if (!isExposureTimeValid(params_.sensorStatic.exposure, context)) { ++ LOG(DcmippAec, Error) << "Invalid Exposure time: " << params_.sensorStatic.exposure; ++ return -EINVAL; ++ } ++ params_.sensorStatic.gain = tuningData["AnalogueGain_dB"].get(1); ++ if (!isGainValid(params_.sensorStatic.gain, context)) { ++ LOG(DcmippAec, Error) << "Invalid Gain: " << params_.sensorStatic.gain; ++ return -EINVAL; ++ } ++ ++ /* Check for sensor delay */ ++ params_.sensorDelay = tuningData["SensorDelay"].get(kSensorDelayDef); ++ if (!isSensorDelayValid(params_.sensorDelay)) { ++ LOG(DcmippAec, Error) << "Invalid Sensor delay: " << params_.sensorDelay; ++ return -EINVAL; ++ } ++ ++ /* Prepare sensor delay test config */ ++ /* Config 0: Exposure = 0% - Gain = 0% ++ * .................. +20% ........... ++ * Config 5: Exposure = 100% - Gain = 0% ++ * ................................. +10% ++ * Config 11: Exposure = 100% - Gain = 60% ++ */ ++ for (int i = 0; i < kAecNbTestConfig / 2; i++) { ++ internal_.measure.testConfig[i].exposure = i ? (context.info.sensorExposureMax * 20 * i) / 100 : context.info.sensorExposureMin; ++ internal_.measure.testConfig[i].gain = context.info.sensorGainMin; ++ internal_.measure.testConfig[i + kAecNbTestConfig / 2].exposure = context.info.sensorExposureMax; ++ internal_.measure.testConfig[i + kAecNbTestConfig / 2].gain = (context.info.sensorGainMax * 10 * (i + 1)) / 100; ++ } ++ internal_.measure.sensorDelayMeasure = -1; ++ ++ /* Check for anti-flicker frequency */ ++ params_.antiFlickerFreq = tuningData["AntiFlickerFreq"].get(0); ++ if (!isAntiflickerFreqValid(params_.antiFlickerFreq)) { ++ LOG(DcmippAec, Error) << "Invalid Anti-flicker frequency: " << params_.antiFlickerFreq; ++ return -EINVAL; ++ } ++ ++#ifdef EVISION_ALGO_ENABLED ++ /* Iniitialize the ST AE algorithm library */ ++ if (params_.algoEnable) { ++ if (!initializeLibrary()) { ++ return 1; ++ } ++ ++ if (!process_simple_algo) { ++ if (!initializeAeInstance()) { ++ deinitializeLibrary(); ++ return 1; ++ } ++ ++ /* Configure algo (AEC target) */ ++ pIspAEprocess->hyper_params.target = (int32_t)params_.algoTarget; ++ ++ /* Configure algo (sensor config) */ ++ pIspAEprocess->hyper_params.exposure_min = context.info.sensorExposureMin; ++ pIspAEprocess->hyper_params.exposure_max = context.info.sensorExposureMax; ++ pIspAEprocess->hyper_params.gain_min = (uint32_t)(context.info.sensorGainMin * kmdB); ++ pIspAEprocess->hyper_params.gain_max = (uint32_t)(context.info.sensorGainMax * kmdB); ++ pIspAEprocess->hyper_params.compat_freq = (uint32_t)params_.antiFlickerFreq; ++ } ++ } else { ++ if (!process_simple_algo) { ++ deinitializeAeInstance(); ++ deinitializeLibrary(); ++ } ++ } ++#endif /* EVISION_ALGO_ENABLED */ ++ ++ /* Configure exposed controls */ ++ context.dcmippControls[&controls::AeEnable] = ControlInfo(false, true); ++ context.dcmippControls[&controls::ExposureValue] = ControlInfo(kEVMin, kEVMax, kEVDef); ++ context.dcmippControls[&controls::ExposureTime] = ControlInfo(context.info.sensorExposureMin, ++ context.info.sensorExposureMax, ++ context.info.sensorExposureDef); ++ context.dcmippControls[&controls::draft::AnalogueGain_dB] = ControlInfo((float)context.info.sensorGainMin, ++ (float)context.info.sensorGainMax, ++ (float)context.info.sensorGainDef); ++ context.dcmippControls[&controls::draft::SensorDelay] = ControlInfo(kSensorDelayMin, ++ kSensorDelayMax, ++ kSensorDelayDef); ++ context.dcmippControls[&controls::draft::DoSensorDelayMeasure] = ControlInfo(false, true); ++ context.dcmippControls[&controls::draft::AntiFlickerFreq] = ControlInfo((int32_t)kAntiflickerFreqMin, ++ (int32_t)kAntiflickerFreqMax, ++ (int32_t)kAntiflickerFreqDef); ++ ++ return 0; ++} ++ ++int Aec::configure(IPAContext &context, ++ [[maybe_unused]] const IPACameraSensorInfo &configInfo) ++{ ++ /* Set the initial ISP/sensor values in the pending config */ ++ if (params_.algoEnable) { ++ /* Start with gain and exposure = min */ ++ config_.sensor.gain = context.info.sensorGainMin; ++ if (process_simple_algo) { ++ config_.sensor.exposure = context.info.sensorExposureMax; ++ } else { ++ config_.sensor.exposure = context.info.sensorExposureMin; ++ } ++ } else { ++ /* Static config */ ++ config_.sensor = params_.sensorStatic; ++ } ++ ++ /* Update context immediately, so IPA can apply the sensor settings at start up */ ++ context.sensor = config_.sensor; ++ config_.pending = true; ++ ++ /* Update sensor exposed controls */ ++ context.dcmippControls.emplace(std::piecewise_construct, ++ std::forward_as_tuple(&controls::ExposureTime), ++ std::forward_as_tuple(context.info.sensorExposureMin, ++ context.info.sensorExposureMax, ++ context.info.sensorExposureDef)); ++ context.dcmippControls.emplace(std::piecewise_construct, ++ std::forward_as_tuple(&controls::draft::AnalogueGain_dB), ++ std::forward_as_tuple((float)context.info.sensorGainMin, ++ (float)context.info.sensorGainMax, ++ (float)context.info.sensorGainDef)); ++ return 0; ++} ++ ++void Aec::queueRequest([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ const ControlList &controls) ++{ ++ /* Algo ctrl: only update params_ which will be considered upon the next process() call */ ++ const auto &algoEnable = controls.get(controls::AeEnable); ++ const auto &algoExposureValue = controls.get(controls::ExposureValue); ++ const auto &algoAntiFlickerFreq = controls.get(controls::draft::AntiFlickerFreq); ++ const auto &sensorDelay = controls.get(controls::draft::SensorDelay); ++ const auto &doSensorDelayMeasure = controls.get(controls::draft::DoSensorDelayMeasure); ++ ++ if (algoEnable) { ++ params_.algoEnable = *algoEnable; ++ LOG(DcmippAec, Debug) << "Updating AeEnable to " << *algoEnable; ++ } ++ ++ if (algoExposureValue) { ++ if (!isExposureValueValid(*algoExposureValue)) { ++ LOG(DcmippAec, Error) << "Invalid Exposure value: " << *algoExposureValue; ++ return; ++ } ++ params_.algoExposureValue = *algoExposureValue; ++ LOG(DcmippAec, Debug) << "Updating ExposureValue to " << params_.algoExposureValue; ++ ++ params_.algoTarget = kAlgoIdealExposureTarget * pow(2, *algoExposureValue); ++ LOG(DcmippAec, Debug) << "Updating AeTarget to " << params_.algoTarget; ++ } ++ ++ if (algoAntiFlickerFreq) { ++ if (!isAntiflickerFreqValid(*algoAntiFlickerFreq)) { ++ LOG(DcmippAec, Error) << "Invalid Anti-flicker frequency: " << *algoAntiFlickerFreq; ++ return; ++ } ++ params_.antiFlickerFreq = *algoAntiFlickerFreq; ++ LOG(DcmippAec, Debug) << "Updating Anti-flicker frequency to " << params_.antiFlickerFreq; ++ } ++ ++ if (sensorDelay) { ++ if (!isSensorDelayValid(*sensorDelay)) { ++ LOG(DcmippAec, Error) << "Invalid Sensor delay: " << *sensorDelay; ++ return; ++ } ++ params_.sensorDelay = *sensorDelay; ++ LOG(DcmippAec, Debug) << "Updating Sensor Delay to " << params_.sensorDelay; ++ } ++ ++ if (doSensorDelayMeasure && *doSensorDelayMeasure) { ++ /* Start Measure */ ++ internal_.measure.doSensorDelayMeasure = true; ++ internal_.measure.sensorDelayMeasure = -1; ++ internal_.measure.testConfigId = 0; ++ internal_.measure.delay = 0; ++ internal_.measure.refL = 0; ++ internal_.measure.delays.fill(0); ++ ++ /* Apply the first test config */ ++ internal_.measure.initialConfig = config_.sensor; ++ config_.sensor.gain = internal_.measure.testConfig[internal_.measure.testConfigId].gain; ++ config_.sensor.exposure = internal_.measure.testConfig[internal_.measure.testConfigId].exposure; ++ config_.pending = true; ++ ++ LOG(DcmippAec, Debug) << "Starting sensor delay measure"; ++ } ++ ++ /* Static config: update params_ and if applicable force config_ update now */ ++ const auto &gain = controls.get(controls::draft::AnalogueGain_dB); ++ const auto &exposure = controls.get(controls::ExposureTime); ++ ++ if (gain) { ++ if (!isGainValid(*gain, context)) { ++ LOG(DcmippAec, Error) << "Invalid Gain: " << *gain; ++ return; ++ } ++ params_.sensorStatic.gain = *gain; ++ if (!params_.algoEnable) { ++ config_.sensor.gain = params_.sensorStatic.gain; ++ config_.pending = true; ++ } ++ LOG(DcmippAec, Debug) << "Updating static sensor gain to " << *gain; ++ } ++ ++ if (exposure) { ++ if (!isExposureTimeValid(*exposure, context)) { ++ LOG(DcmippAec, Error) << "Invalid Exposure time: " << *exposure; ++ return; ++ } ++ params_.sensorStatic.exposure = *exposure; ++ if (!params_.algoEnable) { ++ config_.sensor.exposure = *exposure; ++ config_.pending = true; ++ } ++ LOG(DcmippAec, Debug) << "Updating static sensor exposure to " << *exposure; ++ } ++} ++ ++void Aec::prepare(IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ [[maybe_unused]] stm32_dcmipp_params_cfg *params, ++ ControlList &sensorControls, ++ [[maybe_unused]] ControlList &ispControls) ++{ ++ /* Copy the pending config to the isp_params and sensor_ctrl. Update the IPAContext */ ++ if (config_.pending) { ++ /* Configure sensor controls */ ++ sensorControls.set(controls::draft::AnalogueGain_dB, config_.sensor.gain); ++ sensorControls.set(controls::ExposureTime, config_.sensor.exposure); ++ ++ /* Update context */ ++ context.sensor = config_.sensor; ++ ++ /* Start the invalid stats counter from this update. Consider both ISP and sensor */ ++ if (!internal_.measure.doSensorDelayMeasure) { ++ /* Nominal processing (not measuring delay) */ ++ internal_.invalidStats = context.info.ispStatLatency + params_.sensorDelay; ++ /* Our definition of 'sensorDelay' is the delay between a sensor control is updated ++ * and the time the stats are available. So this delay includes 1 VSYNC for the stat ++ * update, which is also considered in the definition of ispStatLatency. ++ * So at the end we shall decrease by one the summed value */ ++ internal_.invalidStats--; ++ ++ /* Increase this delay during the startup phase because the sensor response ++ * time may be greater here */ ++ if (frame <= kAecSensorStartupFrames) ++ internal_.invalidStats++; ++ } else { ++ /* During measure */ ++ if (internal_.measure.testConfigId != 0) ++ /* We'll check measure at next frame */ ++ internal_.invalidStats = 1; ++ else ++ /* First measure: wait for several frames to set up the initial point */ ++ internal_.invalidStats = kAecSensorDelayMax; ++ } ++ ++ /* Clear the pending request */ ++ config_.pending = false; ++ } ++} ++ ++void Aec::processSensorDelayMeasure(const stm32_dcmipp_stat_buf *stats) ++{ ++ int32_t avgL; ++ ++ /* Check if stats can be considered as valid */ ++ if (internal_.invalidStats) ++ internal_.invalidStats--; ++ ++ if (internal_.invalidStats) ++ return; ++ ++ avgL = (3 * stats->post.average_RGB[0] + 6 * stats->post.average_RGB[1] + 1 * stats->post.average_RGB[2]) / 10; ++ ++ if (internal_.measure.testConfigId > 0) { ++ /* New stat available, check if Luminance has changed */ ++ internal_.measure.delay++; ++ if (abs(avgL - internal_.measure.refL) <= kAecSensorDelayLMargin && internal_.measure.delay != kAecSensorDelayMax) { ++ /* No change, wait for next frame */ ++ internal_.invalidStats = 1; ++ return; ++ } ++ ++ /* Luminance was updated since we applied a new sensor configuration : store the result for this test. ++ * Reaching kAecSensorDelayMax happens when we have a totally black or white frame, the measure shall be ++ * considered as invalid. ++ */ ++ internal_.measure.delays[internal_.measure.testConfigId - 1] = internal_.measure.delay; ++ } ++ ++ /* New delay measure available */ ++ if (++internal_.measure.testConfigId != kAecNbTestConfig) { ++ /* Apply new sensor test configuration */ ++ config_.sensor.gain = internal_.measure.testConfig[internal_.measure.testConfigId].gain; ++ config_.sensor.exposure = internal_.measure.testConfig[internal_.measure.testConfigId].exposure; ++ config_.pending = true; ++ ++ /* Wait for stats at next frame */ ++ internal_.measure.delay = 0; ++ internal_.measure.refL = avgL; ++ internal_.invalidStats = 1; ++ } else { ++ /* All the configurations have been tested, finalize the test procedure */ ++ int32_t sum = 0; ++ int n_valid = 0; ++ /* Find the average delay among the valid (!= kAecSensorDelayMax) values */ ++ for (int i = 0; i < kAecNbTestConfig - 1; i++) ++ if (internal_.measure.delays[i] != kAecSensorDelayMax) { ++ sum += internal_.measure.delays[i]; ++ n_valid++; ++ } ++ if (n_valid) { ++ internal_.measure.sensorDelayMeasure = round((float)sum / n_valid); ++ /* Apply the measure internally */ ++ params_.sensorDelay = internal_.measure.sensorDelayMeasure; ++ } else { ++ internal_.measure.sensorDelayMeasure = 0; ++ } ++ ++ /* Restore initial sensor config and stop measure */ ++ config_.sensor = internal_.measure.initialConfig; ++ config_.pending = true; ++ internal_.measure.doSensorDelayMeasure = false; ++ } ++} ++ ++void Aec::process(IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ const stm32_dcmipp_stat_buf *stats, ++ ControlList &metadata) ++{ ++ /* Compute a new pending config from stats */ ++ if (internal_.measure.doSensorDelayMeasure) { ++ /* Special case: prosess sensor delay measure */ ++ processSensorDelayMeasure(stats); ++ } else if (params_.algoEnable) { ++ /* Check if stats can be considered as valid */ ++ if (internal_.invalidStats) ++ internal_.invalidStats--; ++ ++ if (internal_.invalidStats) { ++ LOG(DcmippAec, Debug) << "Can't update now"; ++ } else { ++ if (process_simple_algo) { ++ bool do_exposure_update; ++ float gain_update; ++ double gain = context.sensor.gain; ++ int32_t exposure = context.sensor.exposure; ++ int32_t target = (int32_t)params_.algoTarget; ++ int32_t avgL = (3 * stats->post.average_RGB[0] + ++ 6 * stats->post.average_RGB[1] + ++ 1 * stats->post.average_RGB[2]) / ++ 10; ++ ++ LOG(DcmippAec, Debug) << "Status: L = " << avgL << " - " ++ << "Gain = " << gain << " db - " ++ << "Exposure = " << exposure << " us"; ++ ++ /* Compare the average luminance with the target */ ++ gain_update = 0.0f; ++ if (avgL > target + kAecTolerance) { ++ /* Too bright, decrease gain */ ++ gain_update = (float)(target - avgL) * kAecCoeffLumGain; ++ if (gain_update < -kAecGainUpdateMax) ++ gain_update = -kAecGainUpdateMax; ++ } else if (avgL < target - kAecTolerance) { ++ /* Too dark vador, call a Jedi and increase gain */ ++ gain_update = (float)(target - avgL) * kAecCoeffLumGain; ++ if (gain_update > kAecGainUpdateMax) ++ gain_update = kAecGainUpdateMax; ++ } ++ ++ if (gain_update == 0.0f) { ++ LOG(DcmippAec, Debug) << "No change required"; ++ } else { ++ /* Need to change something (gain or exposure) */ ++ /* Check current exposure to decide whether we shall update gain or exposure */ ++ if ((gain == context.info.sensorGainMin) && ++ ((exposure != context.info.sensorExposureMax) || (gain_update < 0))) ++ do_exposure_update = true; ++ else ++ do_exposure_update = false; ++ ++ if (!do_exposure_update) { ++ /* Update gain as it has not reached its min value */ ++ gain += gain_update; ++ if (gain < context.info.sensorGainMin) ++ gain = context.info.sensorGainMin; ++ else if (gain > context.info.sensorGainMax) ++ gain = context.info.sensorGainMax; ++ ++ LOG(DcmippAec, Debug) << "New gain: " << gain << " db"; ++ config_.sensor.gain = gain; ++ config_.pending = true; ++ } else { ++ /* Update exposure since gain has reached its min value */ ++ if (gain_update < 0) { ++ /* Decrease exposure */ ++ exposure /= kAecExposureUpdateRatio; ++ /* Note: sensorExposureMin for IMX335 is wrong: use alternate value */ ++ if (exposure < kAecExposureMin) ++ exposure = kAecExposureMin; ++ } else { ++ /* Increase exposure */ ++ exposure *= kAecExposureUpdateRatio; ++ if (exposure > context.info.sensorExposureMax) ++ exposure = context.info.sensorExposureMax; ++ } ++ ++ LOG(DcmippAec, Debug) << "New exposure: " << exposure << " us"; ++ config_.sensor.exposure = exposure; ++ config_.pending = true; ++ } ++ } ++ } ++#ifdef EVISION_ALGO_ENABLED ++ else { ++ double gain = context.sensor.gain; ++ int32_t exposure = context.sensor.exposure; ++ int32_t avgL = (3 * stats->post.average_RGB[0] + ++ 6 * stats->post.average_RGB[1] + ++ 1 * stats->post.average_RGB[2]) / ++ 10; ++ ++ LOG(DcmippAec, Debug) << "Status: L = " << avgL << " - " ++ << "Gain = " << gain << " db - " ++ << "Exposure = " << exposure << " us"; ++ ++ /* Align on the target update (may have been updated with ISP_SetExposureTarget()) */ ++ pIspAEprocess->hyper_params.target = (uint8_t)params_.algoTarget; ++ pIspAEprocess->hyper_params.compat_freq = (uint32_t)params_.antiFlickerFreq; ++ ++ evision_return_t process_result = processAeInstance(&gain, &exposure, avgL); ++ if (process_result != EVISION_RET_SUCCESS) { ++ LOG(DcmippAec, Error) << "Failed to process pIspAEprocess"; ++ } ++ ++ if (config_.sensor.exposure != exposure) { ++ LOG(DcmippAec, Debug) << "New exposure: " << exposure << " us"; ++ config_.sensor.exposure = exposure; ++ config_.pending = true; ++ } ++ ++ if (config_.sensor.gain != gain) { ++ LOG(DcmippAec, Debug) << "New gain: " << gain << " db"; ++ config_.sensor.gain = gain; ++ config_.pending = true; ++ } ++ } ++#endif /* EVISION_ALGO_ENABLED */ ++ } ++ } ++ ++ /* Set metadata */ ++ metadata.set(controls::AeEnable, params_.algoEnable); ++ metadata.set(controls::draft::AeExposureTarget, params_.algoTarget); ++ metadata.set(controls::ExposureValue, params_.algoExposureValue); ++ metadata.set(controls::draft::AntiFlickerFreq, params_.antiFlickerFreq); ++ metadata.set(controls::draft::AnalogueGain_dB, (float)config_.sensor.gain); ++ metadata.set(controls::ExposureTime, config_.sensor.exposure); ++ metadata.set(controls::draft::SensorDelay, params_.sensorDelay); ++ metadata.set(controls::draft::SensorDelayMeasure, internal_.measure.sensorDelayMeasure); ++} ++ ++REGISTER_IPA_ALGORITHM(Aec, "Aec") ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/aec.h b/src/ipa/dcmipp/algorithms/aec.h +new file mode 100644 +index 00000000..27cc5735 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/aec.h +@@ -0,0 +1,68 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * Copyright (C) 2024 LACROIX - Impulse ++ * ++ * aec.h - STM32 DCMIPP AE control ++ */ ++ ++#pragma once ++ ++#include "algorithm.h" ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++class Aec : public Algorithm ++{ ++public: ++ Aec() = default; ++ ++ int init(IPAContext &context, const YamlObject &tuningData) override; ++ int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override; ++ void queueRequest(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const ControlList &controls) override; ++ void prepare(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ControlList &sensorControls, ++ ControlList &ispControls) override; ++ void process(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const stm32_dcmipp_stat_buf *stats, ControlList &metadata) override; ++ ++private: ++ static constexpr int32_t kAecNbTestConfig = 12; ++ ++ struct algoParams { ++ bool algoEnable; ++ uint32_t algoTarget; ++ float algoExposureValue; ++ uint32_t antiFlickerFreq; ++ struct IPASensor sensorStatic; ++ int32_t sensorDelay; ++ } params_; ++ ++ struct algoInternal { ++ int32_t invalidStats; ++ struct measure { ++ bool doSensorDelayMeasure; ++ int32_t sensorDelayMeasure; ++ struct IPASensor initialConfig; ++ std::array testConfig; ++ int32_t testConfigId; ++ std::array delays; ++ int32_t delay; ++ int32_t refL; ++ } measure; ++ } internal_; ++ ++ struct algoConfig { ++ bool pending; ++ struct IPASensor sensor; ++ } config_; ++ ++ void processSensorDelayMeasure(const stm32_dcmipp_stat_buf *stats); ++}; ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/algorithm.h b/src/ipa/dcmipp/algorithms/algorithm.h +new file mode 100644 +index 00000000..8c59ceb0 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/algorithm.h +@@ -0,0 +1,35 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * algorithm.h - STM32 DCMIPP control algorithm interface ++ */ ++ ++#pragma once ++ ++#include ++ ++#include "../module.h" ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp { ++ ++class Algorithm : public libcamera::ipa::Algorithm ++{ ++ using libcamera::ipa::Algorithm::prepare; ++public: ++ /* prepare ISP params / controls and Sensor controls */ ++ virtual void prepare([[maybe_unused]] typename Module::Context &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] typename Module::FrameContext &frameContext, ++ [[maybe_unused]] typename Module::Params *params, ++ [[maybe_unused]] ControlList &sensorControls, ++ [[maybe_unused]] ControlList &ispControls) ++ { ++ } ++}; ++ ++} /* namespace ipa::dcmipp */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/awb.cpp b/src/ipa/dcmipp/algorithms/awb.cpp +new file mode 100644 +index 00000000..006ad4b8 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/awb.cpp +@@ -0,0 +1,948 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * Copyright (C) 2024 LACROIX - Impulse ++ * ++ * awb.cpp - STM32 DCMIPP AWB control ++ */ ++ ++#include "awb.h" ++ ++#include ++#include ++ ++#include ++ ++#include ++ ++#ifdef EVISION_ALGO_ENABLED ++#include ++#include ++ ++#include "evision-api-awb.h" ++#endif /* EVISION_ALGO_ENABLED */ ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++LOG_DEFINE_CATEGORY(DcmippAwb) ++ ++static constexpr uint32_t kPrecisionFactor = 100000000; ++static constexpr uint32_t kIdle = 128; ++static constexpr char kDelimiter = '$'; ++static constexpr int kColGainMin = 0; ++static constexpr int kColGainMax = 1600000000; ++static constexpr int kColGainDef = 100000000; ++static constexpr int kColCorrectionMin = -400000000; ++static constexpr int kColCorrectionMax = 400000000; ++static constexpr int kColCorrectionDef = 0; ++static constexpr int kProfileNameLen = 32; ++static constexpr int kColTemperatureMin = 0; ++static constexpr int kColTemperatureMax = 10000; ++static constexpr int kColTemperatureDef = 0; ++static constexpr int kIspApplyConfigLatency = 4; ++static constexpr int kColorTempAlgoDefaultMin = 4500; ++ ++#ifdef EVISION_ALGO_ENABLED ++static void *plib_handle = nullptr; ++static evision_awb_estimator_t *pIspAWBestimator = nullptr; ++static evision_awb_profile_t awbProfiles[EVISION_AWB_MAX_PROFILE_COUNT]; ++static float colorTempThresholds[EVISION_AWB_MAX_PROFILE_COUNT - 1]; ++ ++typedef evision_awb_estimator_t *(*evision_api_awb_new_t)(evision_api_log_callback log_cb); ++typedef evision_return_t (*evision_api_awb_delete_t)(evision_awb_estimator_t *self); ++typedef void (*evision_api_awb_set_profile_t)(evision_awb_profile_t *awb_profile, ++ float color_temperature, const float cfa_gains[EVISION_AWB_NB_DG_CFA_GAINS], ++ const float ccm_coefficients[EVISION_AWB_CCM_SIZE][EVISION_AWB_CCM_SIZE], ++ const float ccm_offsets[EVISION_AWB_CCM_SIZE]); ++typedef evision_return_t (*evision_api_awb_init_profiles_t)(evision_awb_estimator_t *const self, ++ double min_temp, double max_temp, ++ uint16_t nb_profiles, float decision_thresholds[EVISION_AWB_MAX_PROFILE_COUNT - 1], ++ evision_awb_profile_t awb_profiles[EVISION_AWB_MAX_PROFILE_COUNT]); ++typedef evision_return_t (*evision_api_awb_run_average_t)(evision_awb_estimator_t *const self, const evision_image_t *const image, ++ uint8_t use_ext_meas, double ext_meas[EVISION_AWB_EXT_MEAS_SIZE]); ++ ++static evision_api_awb_new_t evision_api_awb_new = nullptr; ++static evision_api_awb_delete_t evision_api_awb_delete = nullptr; ++static evision_api_awb_set_profile_t evision_api_awb_set_profile = nullptr; ++static evision_api_awb_init_profiles_t evision_api_awb_init_profiles = nullptr; ++static evision_api_awb_run_average_t evision_api_awb_run_average = nullptr; ++ ++static constexpr uint8_t kIspStatCheckSkipAfterInit = 10; ++static constexpr uint8_t kIspStatCheckSkipAfterCTEstimation = 4; ++static constexpr int32_t kIspStatDeltaMax = 2; ++ ++static int32_t stats_history[3][3] = { 0 }; ++static int32_t color_temperature_history[2] = { 0 }; ++static uint8_t skip_stat_check_count = kIspStatCheckSkipAfterInit; ++#endif ++ ++static bool process_simple_algo = true; ++ ++static bool isColourGainValid(int32_t gain) ++{ ++ return gain >= kColGainMin && gain <= kColGainMax; ++} ++ ++static bool isColourGainValid(Span gain) ++{ ++ for (auto const &g : gain) ++ if (!isColourGainValid(g)) ++ return false; ++ return true; ++} ++ ++static bool isColourCorrectionValid(int32_t correction) ++{ ++ return correction >= kColCorrectionMin && correction <= kColCorrectionMax; ++} ++ ++static bool isColourCorrectionValid(std::vector matrix) ++{ ++ for (auto const &c : matrix) ++ if (!isColourCorrectionValid(c)) ++ return false; ++ return true; ++} ++ ++static bool isColourCorrectionValid(Span matrix) ++{ ++ for (auto const &c : matrix) ++ if (!isColourCorrectionValid(c)) ++ return false; ++ return true; ++} ++ ++static bool isColourTemperatureValid(int32_t temperature) ++{ ++ return temperature >= kColTemperatureMin && temperature <= kColTemperatureMax; ++} ++ ++static bool isColourTemperatureValid(std::vector temperature) ++{ ++ for (auto const &t : temperature) ++ if (!isColourTemperatureValid(t)) ++ return false; ++ return true; ++} ++ ++static bool isColourTemperatureValid(Span temperature) ++{ ++ for (auto const &t : temperature) ++ if (!isColourTemperatureValid(t)) ++ return false; ++ return true; ++} ++ ++static void toShiftMultiplier(uint32_t gain, uint8_t *shift, uint8_t *multiplier) ++{ ++ /* Convert gain (Unit = 100000000 for "x1.0") to Multiplier (where 128 means "x1.0") */ ++ uint64_t mult64 = gain; ++ mult64 = (mult64 * kIdle) / kPrecisionFactor; ++ ++ /* Get Shift + Multiplier where Multiplier < 256 */ ++ *shift = 0; ++ while (mult64 >= 256) { ++ mult64 /= 2; ++ (*shift)++; ++ } ++ *multiplier = (uint8_t)mult64; ++} ++ ++static int16_t toCConvReg(int32_t coeff) ++{ ++ /* Convert coefficient (Unit = 100000000 for "x1.0") to register format */ ++ int64_t val = coeff; ++ int16_t reg; ++ ++ val = (val * 256) / kPrecisionFactor; ++ if (val >= 0) ++ reg = val; ++ else ++ reg = ((-val ^ 0x7FF) + 1) & 0x7FF; ++ ++ return reg; ++} ++ ++#ifdef EVISION_ALGO_ENABLED ++static void getStatUp(IPAContext &context, const __u32 average_RGB[3], ++ int32_t avgUpRGB[3]) ++{ ++ uint64_t R, G, B; ++ ++ /* Read the current ISP gain */ ++ if (context.isp.gain.enable == 1) { ++ R = ((uint64_t)average_RGB[0] * kPrecisionFactor) / context.isp.gain.gainR; ++ avgUpRGB[0] = (int32_t)R; ++ ++ G = ((uint64_t)average_RGB[1] * kPrecisionFactor) / context.isp.gain.gainG; ++ avgUpRGB[1] = (int32_t)G; ++ ++ B = ((uint64_t)average_RGB[2] * kPrecisionFactor) / context.isp.gain.gainB; ++ avgUpRGB[2] = (int32_t)B; ++ ++ if (context.isp.blackLevel.enable == 1) { ++ avgUpRGB[0] += context.isp.blackLevel.blcR; ++ avgUpRGB[1] += context.isp.blackLevel.blcG; ++ avgUpRGB[2] += context.isp.blackLevel.blcB; ++ } ++ } else { ++ avgUpRGB[0] = (int32_t)average_RGB[0]; ++ avgUpRGB[1] = (int32_t)average_RGB[1]; ++ avgUpRGB[2] = (int32_t)average_RGB[2]; ++ } ++} ++ ++double applyGammaInverse(uint32_t comp) ++{ ++ return 255 * std::pow(static_cast(comp) / 255, 1.0 / 2.2); ++} ++ ++void applyCConv(IPAContext &context, const uint32_t inRGB[3], uint32_t outRGB[3]) ++{ ++ if (context.isp.cconv.enable) { ++ const int32_t(*coeff)[3] = context.isp.cconv.coeff; ++ int64_t ccR, ccG, ccB; ++ ++ // Apply ColorConversion matrix to the input components ++ ccR = static_cast(inRGB[0]) * coeff[0][0] + static_cast(inRGB[1]) * coeff[0][1] + static_cast(inRGB[2]) * coeff[0][2]; ++ ccG = static_cast(inRGB[0]) * coeff[1][0] + static_cast(inRGB[1]) * coeff[1][1] + static_cast(inRGB[2]) * coeff[1][2]; ++ ccB = static_cast(inRGB[0]) * coeff[2][0] + static_cast(inRGB[1]) * coeff[2][1] + static_cast(inRGB[2]) * coeff[2][2]; ++ ++ ccR /= kPrecisionFactor; ++ ccG /= kPrecisionFactor; ++ ccB /= kPrecisionFactor; ++ ++ // Clamp values to 0-255 ++ ccR = std::clamp(ccR, static_cast(0), static_cast(255)); ++ ccG = std::clamp(ccG, static_cast(0), static_cast(255)); ++ ccB = std::clamp(ccB, static_cast(0), static_cast(255)); ++ ++ outRGB[0] = static_cast(ccR); ++ outRGB[1] = static_cast(ccG); ++ outRGB[2] = static_cast(ccB); ++ } else { ++ outRGB[0] = inRGB[0]; ++ outRGB[1] = inRGB[1]; ++ outRGB[2] = inRGB[2]; ++ } ++} ++ ++static bool initializeLibrary() ++{ ++ const char *lib_dir = "/usr/lib/"; ++ const char *lib_name = "libevision-awb.so.1"; ++ std::string lib_path = std::string(lib_dir) + lib_name; ++ ++ plib_handle = dlopen(lib_path.c_str(), RTLD_LAZY); ++ if (!plib_handle) { ++ LOG(DcmippAwb, Warning) << "Cannot open library: " << dlerror(); ++ LOG(DcmippAwb, Warning) << "Fall back to simple AWB algorithm processing"; ++ return true; ++ } ++ ++ dlerror(); // Clear any existing error ++ ++ process_simple_algo = false; ++ evision_api_awb_new = (evision_api_awb_new_t)dlsym(plib_handle, "evision_api_awb_new"); ++ const char *dlsym_error = dlerror(); ++ if (dlsym_error) { ++ LOG(DcmippAwb, Error) << "Cannot load symbol 'evision_api_awb_new': " << dlsym_error; ++ dlclose(plib_handle); ++ return false; ++ } ++ ++ evision_api_awb_delete = (evision_api_awb_delete_t)dlsym(plib_handle, "evision_api_awb_delete"); ++ dlsym_error = dlerror(); ++ if (dlsym_error) { ++ LOG(DcmippAwb, Error) << "Cannot load symbol 'evision_api_awb_delete': " << dlsym_error; ++ dlclose(plib_handle); ++ return false; ++ } ++ ++ evision_api_awb_set_profile = (evision_api_awb_set_profile_t)dlsym(plib_handle, "evision_api_awb_set_profile"); ++ dlsym_error = dlerror(); ++ if (dlsym_error) { ++ LOG(DcmippAwb, Error) << "Cannot load symbol 'evision_api_awb_set_profile': " << dlsym_error; ++ dlclose(plib_handle); ++ return false; ++ } ++ ++ evision_api_awb_init_profiles = (evision_api_awb_init_profiles_t)dlsym(plib_handle, "evision_api_awb_init_profiles"); ++ dlsym_error = dlerror(); ++ if (dlsym_error) { ++ LOG(DcmippAwb, Error) << "Cannot load symbol 'evision_api_awb_init_profiles': " << dlsym_error; ++ dlclose(plib_handle); ++ return false; ++ } ++ ++ evision_api_awb_run_average = (evision_api_awb_run_average_t)dlsym(plib_handle, "evision_api_awb_run_average"); ++ dlsym_error = dlerror(); ++ if (dlsym_error) { ++ LOG(DcmippAwb, Error) << "Cannot load symbol 'evision_api_awb_run_average': " << dlsym_error; ++ dlclose(plib_handle); ++ return false; ++ } ++ ++ return true; ++} ++ ++static void log_cb(const char *const msg) ++{ ++ LOG(DcmippAwb, Debug) << msg; ++} ++ ++bool initializeAwbInstance() ++{ ++ if (!plib_handle) { ++ LOG(DcmippAwb, Error) << "Library not loaded"; ++ return false; ++ } ++ ++ pIspAWBestimator = evision_api_awb_new(log_cb); ++ if (pIspAWBestimator == nullptr) { ++ LOG(DcmippAwb, Error) << "Failed to create pIspAWBestimator"; ++ return false; ++ } ++ ++ return true; ++} ++ ++bool Awb::configureAwbAlgo() ++{ ++ if (process_simple_algo) { ++ LOG(DcmippAwb, Debug) << "No algorithm reconfiguration needed"; ++ return true; ++ } ++ ++ evision_return_t e_ret; ++ uint32_t colorTemp, profId, profNb = 0; ++ float cfaGains[4], ccmCoeffs[3][3], ccmOffsets[3] = { 0 }; ++ ++ if (pIspAWBestimator == nullptr) { ++ LOG(DcmippAwb, Error) << "pIspAWBestimator not found"; ++ return false; ++ } ++ ++ /* Set profiles (color temperature, gains, color conv matrix) */ ++ for (profId = 0; profId < EVISION_AWB_MAX_PROFILE_COUNT; profId++) { ++ colorTemp = static_cast(params_.referenceColorTemp[profId]); ++ if (colorTemp == 0) ++ break; ++ ++ if (profNb > 0) { ++ /* Profile decision threshold = lowest ref. temperature + 1/4 of the distance between two reference temperatures */ ++ colorTempThresholds[profNb - 1] = static_cast((colorTemp + 3 * params_.referenceColorTemp[profId - 1]) / 4); ++ } ++ ++ /* Set cfa gains (RGGB) */ ++ cfaGains[0] = static_cast(params_.gainRGB[profId + 0 * kAwbNbRef]) / kPrecisionFactor; ++ cfaGains[1] = static_cast(params_.gainRGB[profId + 1 * kAwbNbRef]) / kPrecisionFactor; ++ cfaGains[2] = cfaGains[1]; ++ cfaGains[3] = static_cast(params_.gainRGB[profId + 2 * kAwbNbRef]) / kPrecisionFactor; ++ ++ /* Set CCM Coeff */ ++ for (uint32_t i = 0; i < 3; i++) { ++ for (uint32_t j = 0; j < 3; j++) { ++ ccmCoeffs[i][j] = static_cast(params_.cconv[profId * 9 + i * 3 + j]) / kPrecisionFactor; ++ } ++ } ++ ++ /* Set profile */ ++ evision_api_awb_set_profile(&awbProfiles[profId], static_cast(colorTemp), cfaGains, ccmCoeffs, ccmOffsets); ++ profNb++; ++ } ++ ++ if (profNb == 0) { ++ LOG(DcmippAwb, Error) << "No valid AWB profiles found"; ++ return false; ++ } ++ ++ /* Register profiles */ ++ e_ret = evision_api_awb_init_profiles(pIspAWBestimator, static_cast(params_.referenceColorTemp[0]), ++ static_cast(params_.referenceColorTemp[profNb - 1]), profNb, ++ colorTempThresholds, awbProfiles); ++ if (e_ret != EVISION_RET_SUCCESS) { ++ LOG(DcmippAwb, Error) << "Failed to initialize AWB profiles"; ++ return false; ++ } ++ ++ /* Configure algo */ ++ /* TODO: check if this shall be an IQ tuning parameter (like the LUT tables of AE algo) */ ++ pIspAWBestimator->hyper_params.speed_p_min = 1.35; ++ pIspAWBestimator->hyper_params.speed_p_max = (profNb < 4) ? 1.8 : 2.0; ++ pIspAWBestimator->hyper_params.gm_tolerance = 1; ++ pIspAWBestimator->hyper_params.conv_criterion = 3; ++ ++ return true; ++} ++ ++static void deinitializeAwbInstance() ++{ ++ if (pIspAWBestimator) { ++ evision_api_awb_delete(pIspAWBestimator); ++ pIspAWBestimator = nullptr; ++ } ++} ++ ++static void deinitializeLibrary() ++{ ++ if (plib_handle) { ++ dlclose(plib_handle); ++ plib_handle = nullptr; ++ } ++} ++#endif /* EVISION_ALGO_ENABLED */ ++ ++void Awb::applyProfile(int profId) ++{ ++ LOG(DcmippAwb, Debug) << "Changing AWB profile to " << params_.profileName[profId] ++ << " (" << params_.referenceColorTemp[profId] << ")"; ++ internal_.colorTemp = params_.referenceColorTemp[profId]; ++ internal_.profileName = params_.profileName[profId]; ++ ++ config_.gain.enable = 1; ++ config_.gain.gainR = params_.gainRGB[profId + 0 * kAwbNbRef]; ++ config_.gain.gainG = params_.gainRGB[profId + 1 * kAwbNbRef]; ++ config_.gain.gainB = params_.gainRGB[profId + 2 * kAwbNbRef]; ++ ++ config_.cconv.enable = 1; ++ int offset = 3 * 3 * profId; ++ std::copy(params_.cconv.begin() + offset, params_.cconv.begin() + offset + 3 * 3, ++ &config_.cconv.coeff[0][0]); ++ ++ internal_.profileDirty = false; ++ config_.pending = true; ++} ++ ++int Awb::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData) ++{ ++ /* Check for AWB algo config */ ++ params_.algoEnable = tuningData["AwbEnable"].get(0); ++ ++ std::vector name = tuningData["ProfileName"].getList().value_or(std::vector{}); ++ if (name.size() == kAwbNbRef) { ++ std::copy(name.begin(), name.end(), params_.profileName.begin()); ++ } else if (name.size() != 0) { ++ LOG(DcmippAwb, Error) << "Invalid ProfileName"; ++ return -EINVAL; ++ } ++ ++ std::vector data = tuningData["RefColorTemp"].getList().value_or(std::vector{}); ++ if (data.size() == kAwbNbRef) { ++ if (!isColourTemperatureValid(data)) { ++ LOG(DcmippAwb, Error) << "Invalid RefColorTemp values"; ++ return -EINVAL; ++ } ++ std::copy(data.begin(), data.end(), params_.referenceColorTemp.begin()); ++ } else if (data.size() != 0) { ++ LOG(DcmippAwb, Error) << "Invalid RefColorTemp"; ++ return -EINVAL; ++ } ++ ++ std::vector dataR = tuningData["GainR"].getList().value_or(std::vector{}); ++ std::vector dataG = tuningData["GainG"].getList().value_or(std::vector{}); ++ std::vector dataB = tuningData["GainB"].getList().value_or(std::vector{}); ++ if ((dataR.size() == kAwbNbRef) && (dataG.size() == kAwbNbRef) && (dataB.size() == kAwbNbRef)) { ++ std::copy(dataR.begin(), dataR.end(), params_.gainRGB.begin() + 0 * dataR.size()); ++ std::copy(dataG.begin(), dataG.end(), params_.gainRGB.begin() + 1 * dataR.size()); ++ std::copy(dataB.begin(), dataB.end(), params_.gainRGB.begin() + 2 * dataR.size()); ++ if (!isColourGainValid(Span{ params_.gainRGB })) { ++ LOG(DcmippAwb, Error) << "Invalid GainR/G/B"; ++ return -EINVAL; ++ } ++ } else if ((dataR.size() != 0) || (dataG.size() != 0) || (dataB.size() != 0)) { ++ LOG(DcmippAwb, Error) << "Invalid GainR/G/B"; ++ return -EINVAL; ++ } ++ ++ std::vector matrix = tuningData["Cconv"].getList().value_or(std::vector{}); ++ if (matrix.size() == kAwbNbRef * 3 * 3) { ++ if (!isColourCorrectionValid(matrix)) { ++ LOG(DcmippAwb, Error) << "Invalid Cconv values"; ++ return -EINVAL; ++ } ++ std::copy(matrix.begin(), matrix.end(), params_.cconv.begin()); ++ } else if (matrix.size() != 0) { ++ LOG(DcmippAwb, Error) << "Invalid Cconv"; ++ return -EINVAL; ++ } ++ ++ /* Check for ISP Gain / ColorConv static config */ ++ params_.gainStatic.gainR = tuningData["FixedGainR"].get(0); ++ params_.gainStatic.gainG = tuningData["FixedGainG"].get(0); ++ params_.gainStatic.gainB = tuningData["FixedGainB"].get(0); ++ if (!isColourGainValid(params_.gainStatic.gainR) || !isColourGainValid(params_.gainStatic.gainG) || !isColourGainValid(params_.gainStatic.gainB)) { ++ LOG(DcmippAwb, Error) << "Invalid FixedGainR/G/B"; ++ return -EINVAL; ++ } ++ if (!params_.gainStatic.gainR && !params_.gainStatic.gainG && !params_.gainStatic.gainB) { ++ params_.gainStatic.enable = false; ++ } else { ++ params_.gainStatic.enable = tuningData["FixedGainEnable"].get(true); ++ } ++ ++ matrix = tuningData["FixedCconv"].getList().value_or(std::vector{}); ++ if (!matrix.size()) { ++ memset(params_.cconvStatic.coeff, 0, sizeof(params_.cconvStatic.coeff)); ++ params_.cconvStatic.enable = false; ++ } else if (matrix.size() == 3 * 3) { ++ if (!isColourCorrectionValid(matrix)) { ++ LOG(DcmippAwb, Error) << "Invalid FixedCconv values"; ++ return -EINVAL; ++ } ++ for (unsigned int i = 0; i < 3; i++) ++ for (unsigned int j = 0; j < 3; j++) ++ params_.cconvStatic.coeff[i][j] = matrix[i * 3 + j]; ++ params_.cconvStatic.enable = tuningData["FixedCconvEnable"].get(true); ++ } else { ++ LOG(DcmippAwb, Error) << "Invalid FixedCconv"; ++ return -EINVAL; ++ } ++ ++#ifdef EVISION_ALGO_ENABLED ++ if (params_.algoEnable) { ++ if (!initializeLibrary()) { ++ LOG(DcmippAwb, Error) << "Initialize library failed"; ++ return -EINVAL; ++ } ++ ++ if (!process_simple_algo) { ++ if (!initializeAwbInstance()) { ++ LOG(DcmippAwb, Error) << "Cannot initialize awb instance"; ++ deinitializeLibrary(); ++ return -EINVAL; ++ } ++ ++ if (!configureAwbAlgo()) { ++ LOG(DcmippAwb, Error) << "Cannot configure awb algorithm"; ++ deinitializeAwbInstance(); ++ deinitializeLibrary(); ++ return -EINVAL; ++ } ++ } ++ } ++#endif /* EVISION_ALGO_ENABLED */ ++ ++ /* Configure exposed controls */ ++ context.dcmippControls[&controls::draft::ColourGains3Enable] = ControlInfo(false, true); ++ context.dcmippControls[&controls::draft::ColourGains3] = ControlInfo(kColGainMin, kColGainMax, kColGainDef); ++ context.dcmippControls[&controls::draft::ColourCorrectionEnable] = ControlInfo(false, true); ++ context.dcmippControls[&controls::draft::ColourCorrection] = ControlInfo(kColCorrectionMin, kColCorrectionMax, kColCorrectionDef); ++ context.dcmippControls[&controls::AwbEnable] = ControlInfo(false, true); ++ context.dcmippControls[&controls::AwbMode] = ControlInfo(controls::AwbModeValues); ++ context.dcmippControls[&controls::draft::AwbProfileName] = ControlInfo(0, kProfileNameLen, kProfileNameLen); ++ context.dcmippControls[&controls::draft::AwbReferenceColorTemperature] = ControlInfo(kColTemperatureMin, kColTemperatureMax, kColTemperatureDef); ++ context.dcmippControls[&controls::draft::AwbColourGains3] = ControlInfo(kColGainMin, kColGainMax, kColGainDef); ++ context.dcmippControls[&controls::draft::AwbColourCorrection] = ControlInfo(kColCorrectionMin, kColCorrectionMax, kColCorrectionDef); ++ context.dcmippControls[&controls::draft::AwbCustomColorTemperature] = ControlInfo(kColTemperatureMin, kColTemperatureMax, kColTemperatureDef); ++ ++ return 0; ++} ++ ++int Awb::configure([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const IPACameraSensorInfo &configInfo) ++{ ++ /* Set the initial ISP values in the pending config */ ++ if (!params_.algoEnable) { ++ /* Apply static ISP Gain / ColorConv config */ ++ config_.gain = params_.gainStatic; ++ config_.cconv = params_.cconvStatic; ++ } else { ++ int i, profId; ++ /* Apply the first profile with color temp above minimum value before first processing of the algorithm */ ++ profId = 0; ++ for (i = 0; i < kAwbNbRef; i++) { ++ if (params_.referenceColorTemp[i] >= kColorTempAlgoDefaultMin) { ++ profId = i; ++ break; ++ } ++ } ++ applyProfile(profId); ++ } ++ ++ config_.pending = true; ++ ++ return 0; ++} ++ ++void Awb::queueRequest([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ const ControlList &controls) ++{ ++ bool awbModeAutoDisabling = false; ++ ++ /* Algo ctrl: only update params_ which will be considered upon the next process() call */ ++ const auto &algoEnable = controls.get(controls::AwbEnable); ++ const auto &awbMode = controls.get(controls::AwbMode); ++ const auto &profileName = controls.get(controls::draft::AwbProfileName); ++ const auto &referenceColorTemp = controls.get(controls::draft::AwbReferenceColorTemperature); ++ const auto &gainRGB = controls.get(controls::draft::AwbColourGains3); ++ const auto &cconv = controls.get(controls::draft::AwbColourCorrection); ++ ++ if (algoEnable) { ++ params_.algoEnable = *algoEnable; ++ LOG(DcmippAwb, Debug) << "Updating AwbEnable to " << *algoEnable; ++ } ++ ++ if (awbMode) { ++ if (*awbMode == controls::AwbAuto) { ++ params_.algoEnable = true; ++ /* mark the current profile as dirty so it will be applied at next algo run */ ++ internal_.profileDirty = true; ++ LOG(DcmippAwb, Debug) << "Updating AwbMode / AwbEnable to " ++ << params_.algoEnable; ++ } else if (*awbMode == controls::AwbCustom) { ++ if (params_.algoEnable) ++ awbModeAutoDisabling = true; ++ params_.algoEnable = false; ++ LOG(DcmippAwb, Debug) << "Updating AwbMode / AwbEnable to " ++ << params_.algoEnable; ++ } else { ++ LOG(DcmippAwb, Error) << "Unsupported AwbMode: " << *awbMode; ++ } ++ } ++ ++ if (profileName) { ++ /* The Controls class does not support array of string. So, split the concatenated string */ ++ std::string token; ++ std::stringstream ss(*profileName); ++ for (int i = 0; i < kAwbNbRef; i++) { ++ if (!getline(ss, token, kDelimiter)) ++ token = ""; ++ params_.profileName[i] = token; ++ } ++ /* mark the current profile as dirty so it will be applied at next algo run */ ++ internal_.profileDirty = true; ++ LOG(DcmippAwb, Debug) << "Updating AwbProfileName to " << *profileName; ++ } ++ ++ if (referenceColorTemp) { ++ if (!isColourTemperatureValid(*referenceColorTemp)) { ++ LOG(DcmippAwb, Error) << "Invalid RefColorTemp values"; ++ return; ++ } ++ std::copy(std::begin(*referenceColorTemp), std::end(*referenceColorTemp), params_.referenceColorTemp.begin()); ++ /* mark the current profile as dirty so it will be applied at next algo run */ ++ internal_.profileDirty = true; ++ LOG(DcmippAwb, Debug) << "Updating AwbRefColorTemp to " << (*referenceColorTemp)[0] << "..."; ++ } ++ ++ if (gainRGB) { ++ if (!isColourGainValid(*gainRGB)) { ++ LOG(DcmippAwb, Error) << "Invalid AwbColourGain values"; ++ return; ++ } ++ std::copy(std::begin(*gainRGB), std::end(*gainRGB), params_.gainRGB.begin()); ++ /* mark the current profile as dirty so it will be applied at next algo run */ ++ internal_.profileDirty = true; ++ LOG(DcmippAwb, Debug) << "Updating AwbColourGains3 to " << (*gainRGB)[0] << "..."; ++ } ++ ++ if (cconv) { ++ if (!isColourCorrectionValid(*cconv)) { ++ LOG(DcmippAwb, Error) << "Invalid CConv value"; ++ return; ++ } ++ std::copy(std::begin(*cconv), std::end(*cconv), params_.cconv.begin()); ++ /* mark the current profile as dirty so it will be applied at next algo run */ ++ internal_.profileDirty = true; ++ LOG(DcmippAwb, Debug) << "Updating AwbColourConv to " << (*cconv)[0] << "..."; ++ } ++ ++ if (internal_.profileDirty && !configureAwbAlgo()) { ++ LOG(DcmippAwb, Error) << "Cannot reconfigure awb algorithm"; ++ return; ++ } ++ ++ /* Static config: update params_ and if applicable force config_ update now */ ++ const auto &customColorTemp = controls.get(controls::draft::AwbCustomColorTemperature); ++ const auto &staticGainEnable = controls.get(controls::draft::ColourGains3Enable); ++ const auto &staticGain = controls.get(controls::draft::ColourGains3); ++ const auto &staticCconvEnable = controls.get(controls::draft::ColourCorrectionEnable); ++ const auto &staticCconv = controls.get(controls::draft::ColourCorrection); ++ ++ if (customColorTemp && !params_.algoEnable) { ++ /* Search for the corresponding profile and apply it */ ++ int profId; ++ for (profId = 0; profId < kAwbNbRef; profId++) ++ if (params_.referenceColorTemp[profId] == *customColorTemp) ++ break; ++ ++ if (profId >= kAwbNbRef) { ++ LOG(DcmippAwb, Error) << "Invalid Custom Colour Temp: " << *customColorTemp; ++ /* Revert the 'awbMode = AwbCustom' request if needed */ ++ if (awbModeAutoDisabling) ++ params_.algoEnable = true; ++ } else { ++ applyProfile(profId); ++ } ++ ++ internal_.customColorTemp = *customColorTemp; ++ } ++ ++ if (staticGainEnable) { ++ params_.gainStatic.enable = *staticGainEnable; ++ if (!params_.algoEnable) { ++ config_.gain.enable = *staticGainEnable; ++ config_.pending = true; ++ } ++ LOG(DcmippAwb, Debug) << "Updating ColourGains3Enable to " << *staticGainEnable; ++ } ++ ++ if (staticGain) { ++ if (!isColourGainValid(*staticGain)) { ++ LOG(DcmippAwb, Error) << "Invalid FixedGainR/G/B"; ++ return; ++ } ++ params_.gainStatic.gainR = (*staticGain)[0]; ++ params_.gainStatic.gainG = (*staticGain)[1]; ++ params_.gainStatic.gainB = (*staticGain)[2]; ++ if (!params_.algoEnable) { ++ config_.gain.gainR = (*staticGain)[0]; ++ config_.gain.gainG = (*staticGain)[1]; ++ config_.gain.gainB = (*staticGain)[2]; ++ config_.pending = true; ++ } ++ LOG(DcmippAwb, Debug) << "Updating ColourGains3 to " ++ << (*staticGain)[0] << " / " ++ << (*staticGain)[1] << " / " ++ << (*staticGain)[2]; ++ } ++ ++ if (staticCconvEnable) { ++ params_.cconvStatic.enable = *staticCconvEnable; ++ if (!params_.algoEnable) { ++ config_.cconv.enable = *staticCconvEnable; ++ config_.pending = true; ++ } ++ LOG(DcmippAwb, Debug) << "Updating ColourConvEnable to " << *staticCconvEnable; ++ } ++ ++ if (staticCconv) { ++ if (!isColourCorrectionValid(*staticCconv)) { ++ LOG(DcmippAwb, Error) << "Invalid staticCconv value"; ++ return; ++ } ++ for (unsigned int i = 0; i < 3; i++) ++ for (unsigned int j = 0; j < 3; j++) ++ params_.cconvStatic.coeff[i][j] = (*staticCconv)[i * 3 + j]; ++ if (!params_.algoEnable) { ++ memcpy(config_.cconv.coeff, params_.cconvStatic.coeff, sizeof(config_.cconv.coeff)); ++ config_.pending = true; ++ } ++ LOG(DcmippAwb, Debug) << "Updating ColourConv to " << (*staticCconv)[0] << "..."; ++ } ++} ++ ++void Awb::prepare(IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ++ [[maybe_unused]] ControlList &sensorControls, ++ [[maybe_unused]] ControlList &ispControls) ++{ ++ /* Copy the pending config to the isp_params. Update the IPAContext */ ++ if (config_.pending) { ++ /* Configure Gain params */ ++ params->module_cfg_update |= STM32_DCMIPP_ISP_EX; ++ toShiftMultiplier(config_.gain.gainR, ¶ms->ctrls.ex_cfg.shift_r, ¶ms->ctrls.ex_cfg.mult_r); ++ toShiftMultiplier(config_.gain.gainG, ¶ms->ctrls.ex_cfg.shift_g, ¶ms->ctrls.ex_cfg.mult_g); ++ toShiftMultiplier(config_.gain.gainB, ¶ms->ctrls.ex_cfg.shift_b, ¶ms->ctrls.ex_cfg.mult_b); ++ params->ctrls.ex_cfg.en = config_.gain.enable; ++ ++ /* Configure Color Conv params */ ++ params->module_cfg_update |= STM32_DCMIPP_ISP_CC; ++ params->ctrls.cc_cfg.ra = 0; ++ params->ctrls.cc_cfg.ga = 0; ++ params->ctrls.cc_cfg.ba = 0; ++ params->ctrls.cc_cfg.clamp = 0; ++ params->ctrls.cc_cfg.rr = toCConvReg(config_.cconv.coeff[0][0]); ++ params->ctrls.cc_cfg.rg = toCConvReg(config_.cconv.coeff[0][1]); ++ params->ctrls.cc_cfg.rb = toCConvReg(config_.cconv.coeff[0][2]); ++ params->ctrls.cc_cfg.gr = toCConvReg(config_.cconv.coeff[1][0]); ++ params->ctrls.cc_cfg.gg = toCConvReg(config_.cconv.coeff[1][1]); ++ params->ctrls.cc_cfg.gb = toCConvReg(config_.cconv.coeff[1][2]); ++ params->ctrls.cc_cfg.br = toCConvReg(config_.cconv.coeff[2][0]); ++ params->ctrls.cc_cfg.bg = toCConvReg(config_.cconv.coeff[2][1]); ++ params->ctrls.cc_cfg.bb = toCConvReg(config_.cconv.coeff[2][2]); ++ params->ctrls.cc_cfg.en = config_.cconv.enable; ++ ++ /* Update context */ ++ context.isp.gain = config_.gain; ++ context.isp.cconv = config_.cconv; ++ ++ /* Start the invalid stats counter from this update. Consider only ISP, not sensor */ ++ internal_.invalidStats = context.info.ispStatLatency + kIspApplyConfigLatency; ++ ++ /* Clear the pending request */ ++ config_.pending = false; ++ } ++} ++ ++void Awb::process([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ [[maybe_unused]] const stm32_dcmipp_stat_buf *stats, ++ ControlList &metadata) ++{ ++ /* Compute a new pending config from stats */ ++ if (params_.algoEnable) { ++ if (process_simple_algo) { ++ /* Fall back to simple AWB algorithm if evision library is not found or used. ++ In this case, we apply the first profile with color temp above the minimum value */ ++ int i, profId; ++ ++ profId = 0; ++ for (i = 0; i < kAwbNbRef; i++) { ++ if (params_.referenceColorTemp[i] >= kColorTempAlgoDefaultMin) { ++ profId = i; ++ break; ++ } ++ } ++ ++ /* Apply the first profile with color temperature higher than 4500. ++ If no such profile has been found, apply the first profile by default (id = 0) */ ++ applyProfile(profId); ++ } ++#ifdef EVISION_ALGO_ENABLED ++ else { ++ int32_t colorTemp = 0; ++ uint32_t ccAvgRGB[3]; ++ double meas[3]; ++ uint32_t profId = 0; ++ int32_t avgUpGain[3]; ++ ++ /* Check if stats can be considered as valid */ ++ if (internal_.invalidStats) ++ internal_.invalidStats--; ++ ++ if (!internal_.invalidStats) { ++ evision_return_t e_ret; ++ ++ /* Get RGB before ISP gain and Black level */ ++ getStatUp(context, stats->post.average_RGB, avgUpGain); ++ ++ bool stat_has_changed = false; ++ if (internal_.profileDirty) { ++ skip_stat_check_count = kIspStatCheckSkipAfterCTEstimation; ++ color_temperature_history[0] = 0; ++ color_temperature_history[1] = 0; ++ } else { ++ for (int i = 0; i < 3; ++i) ++ for (int j = 0; j < 3; ++j) ++ if (abs(avgUpGain[j] - stats_history[i][j]) > kIspStatDeltaMax) ++ stat_has_changed = true; ++ } ++ ++ if (skip_stat_check_count || stat_has_changed) { ++ stats_history[2][0] = avgUpGain[0]; ++ stats_history[2][1] = avgUpGain[1]; ++ stats_history[2][2] = avgUpGain[2]; ++ ++ /* Apply the current color conversion matrix to get stats after color conversion ISP block*/ ++ applyCConv(context, stats->post.average_RGB, ccAvgRGB); ++ ++ /* Invert gamma */ ++ for (int i = 0; i < 3; ++i) { ++ meas[i] = applyGammaInverse(ccAvgRGB[i]); ++ } ++ ++ /* Run algo to estimate gain and color conversion to apply */ ++ e_ret = evision_api_awb_run_average(pIspAWBestimator, NULL, 1, meas); ++ if (e_ret == EVISION_RET_SUCCESS) { ++ if (pIspAWBestimator->out_temp != internal_.colorTemp) { ++ if (pIspAWBestimator->out_temp == color_temperature_history[1]) { ++ skip_stat_check_count = 0; //oscillation detected ++ LOG(DcmippAwb, Debug) << "Oscillation detected"; ++ } else { ++ if (skip_stat_check_count <= kIspStatCheckSkipAfterCTEstimation) ++ skip_stat_check_count = kIspStatCheckSkipAfterCTEstimation; ++ /* Find the index profile for this referenceColorTemp */ ++ for (profId = 0; profId < EVISION_AWB_MAX_PROFILE_COUNT; profId++) { ++ if (pIspAWBestimator->out_temp == params_.referenceColorTemp[profId]) ++ break; ++ } ++ ++ if (profId == EVISION_AWB_MAX_PROFILE_COUNT) { ++ LOG(DcmippAwb, Error) << "Unknown AWB profile"; ++ return; ++ } else { ++ /* Apply new ISP Color Conversion */ ++ colorTemp = params_.referenceColorTemp[profId]; ++ } ++ } ++ } ++ ++ if (colorTemp || internal_.profileDirty) { ++ applyProfile((int)profId); ++ } ++ ++ } else { ++ LOG(DcmippAwb, Error) << "Unable to run evivion library"; ++ return; ++ } ++ } ++ ++ /* Decrease counter to limit the number of estmations before reaching convergence */ ++ if (skip_stat_check_count > 0) { ++ skip_stat_check_count--; ++ } ++ ++ /* Store history to be able to detect variation */ ++ stats_history[1][0] = stats_history[0][0]; ++ stats_history[1][1] = stats_history[0][1]; ++ stats_history[1][2] = stats_history[0][2]; ++ stats_history[0][0] = avgUpGain[0]; ++ stats_history[0][1] = avgUpGain[1]; ++ stats_history[0][2] = avgUpGain[2]; ++ color_temperature_history[1] = color_temperature_history[0]; ++ color_temperature_history[0] = colorTemp ? colorTemp : internal_.colorTemp; ++ } ++ } ++#endif /* EVISION_ALGO_ENABLED */ ++ } ++ ++ /* Set metadata */ ++ metadata.set(controls::draft::ColourGains3Enable, config_.gain.enable); ++ metadata.set(controls::draft::ColourGains3, ++ { static_cast(config_.gain.gainR), ++ static_cast(config_.gain.gainG), ++ static_cast(config_.gain.gainB) }); ++ ++ metadata.set(controls::draft::ColourCorrectionEnable, config_.cconv.enable); ++ metadata.set(controls::draft::ColourCorrection, ++ { config_.cconv.coeff[0][0], config_.cconv.coeff[0][1], config_.cconv.coeff[0][2], ++ config_.cconv.coeff[1][0], config_.cconv.coeff[1][1], config_.cconv.coeff[1][2], ++ config_.cconv.coeff[2][0], config_.cconv.coeff[2][1], config_.cconv.coeff[2][2] }); ++ ++ /* The Controls class does not support array of string. So, concatenate the strings in a single one */ ++ std::string concatProfiles = ""; ++ for (auto const &profile : params_.profileName) { ++ if (!concatProfiles.empty()) ++ concatProfiles += kDelimiter; ++ concatProfiles += profile; ++ } ++ metadata.set(controls::draft::AwbProfileName, concatProfiles); ++ ++ metadata.set(controls::AwbEnable, params_.algoEnable); ++ metadata.set(controls::AwbMode, params_.algoEnable ? controls::AwbAuto : controls::AwbCustom); ++ metadata.set(controls::draft::AwbReferenceColorTemperature, params_.referenceColorTemp); ++ metadata.set(controls::draft::AwbColourGains3, params_.gainRGB); ++ metadata.set(controls::draft::AwbColourCorrection, params_.cconv); ++ ++ if (internal_.colorTemp) ++ metadata.set(controls::ColourTemperature, internal_.colorTemp); ++ if (!internal_.profileName.empty()) ++ metadata.set(controls::draft::AwbCurrentProfileName, internal_.profileName); ++ if (internal_.customColorTemp && !params_.algoEnable) ++ metadata.set(controls::draft::AwbCustomColorTemperature, internal_.customColorTemp); ++} ++ ++REGISTER_IPA_ALGORITHM(Awb, "Awb") ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/awb.h b/src/ipa/dcmipp/algorithms/awb.h +new file mode 100644 +index 00000000..239868c9 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/awb.h +@@ -0,0 +1,65 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * Copyright (C) 2024 LACROIX - Impulse ++ * ++ * awb.h - STM32 DCMIPP AWB control ++ */ ++ ++#pragma once ++ ++#include "algorithm.h" ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++class Awb : public Algorithm ++{ ++public: ++ Awb() = default; ++ ++ int init(IPAContext &context, const YamlObject &tuningData) override; ++ int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override; ++ void queueRequest(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const ControlList &controls) override; ++ void prepare(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ControlList &sensorControls, ++ ControlList &ispControls) override; ++ void process(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const stm32_dcmipp_stat_buf *stats, ControlList &metadata) override; ++ ++private: ++ static constexpr int32_t kAwbNbRef = 5; ++ ++ struct algoParams { ++ bool algoEnable; ++ std::array profileName; ++ std::array referenceColorTemp; ++ std::array gainRGB; ++ std::array cconv; ++ struct IPAIspGain gainStatic; ++ struct IPAIspColorConv cconvStatic; ++ } params_; ++ ++ struct algoInternal { ++ int32_t invalidStats; ++ int32_t colorTemp; ++ std::string profileName; ++ int32_t customColorTemp; ++ bool profileDirty; ++ } internal_; ++ ++ struct algoConfig { ++ bool pending; ++ struct IPAIspGain gain; ++ struct IPAIspColorConv cconv; ++ } config_; ++ ++ bool configureAwbAlgo(); ++ void applyProfile(int profId); ++}; ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/badpixel.cpp b/src/ipa/dcmipp/algorithms/badpixel.cpp +new file mode 100644 +index 00000000..eb681c13 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/badpixel.cpp +@@ -0,0 +1,185 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * badpixel.cpp - STM32 DCMIPP Bad Pixel Removal ++ */ ++ ++#include "badpixel.h" ++ ++#include ++#include ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++LOG_DEFINE_CATEGORY(DcmippBadPixel) ++ ++static constexpr int kStrengthMin = 0; ++static constexpr int kStrengthMax = 7; ++static constexpr int kStrengthDef = 0; ++static constexpr int kThresholdMin = 0; ++static constexpr int kThresholdMax = 4094 * 4094; ++static constexpr int kThresholdDef = 0; ++ ++static bool isStrengthValid(int8_t strength) ++{ ++ return (strength >= kStrengthMin && strength <= kStrengthMax) || strength == -1; ++} ++ ++static bool isThresholdValid(int32_t threshold) ++{ ++ return threshold >= kThresholdMin && threshold <= kThresholdMax; ++} ++ ++int BadPixel::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData) ++{ ++ /* Parse Tuning Data to get algo parameters */ ++ int8_t strength = tuningData["Strength"].get(-1); ++ int32_t threshold = tuningData["Threshold"].get(kThresholdDef); ++ if (!isStrengthValid(strength)) { ++ LOG(DcmippBadPixel, Error) << "Invalid Strength: " << strength; ++ return -EINVAL; ++ } ++ if (!isThresholdValid(threshold)) { ++ LOG(DcmippBadPixel, Error) << "Invalid Threshold: " << threshold; ++ return -EINVAL; ++ } ++ if (strength == -1 && !threshold) { ++ internal_.threshold = 0; ++ params_.badpixel.strength = 0; ++ params_.badpixel.enable = false; ++ } else { ++ internal_.threshold = threshold; ++ internal_.countAccu = 0; ++ internal_.measureNb = 0; ++ params_.badpixel.strength = strength < 0 ? 0 : strength; ++ params_.badpixel.enable = tuningData["Enable"].get(true); ++ } ++ ++ /* Configure exposed controls */ ++ context.dcmippControls[&controls::draft::BadPixelRemovalEnable] = ControlInfo(false, true); ++ context.dcmippControls[&controls::draft::BadPixelRemovalStrength] = ControlInfo(kStrengthMin, kStrengthMax, kStrengthDef); ++ context.dcmippControls[&controls::draft::BadPixelRemovalThreshold] = ControlInfo(kThresholdMin, kThresholdMax, kThresholdDef); ++ ++ return 0; ++} ++ ++int BadPixel::configure([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const IPACameraSensorInfo &configInfo) ++{ ++ /* Set the initial ISP values in the pending config */ ++ config_.badpixel = params_.badpixel; ++ config_.pending = true; ++ ++ return 0; ++} ++ ++void BadPixel::queueRequest([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ const ControlList &controls) ++{ ++ /* Algo ctrl: only update internal_ which will be considered upon the next process() call */ ++ const auto &threshold = controls.get(controls::draft::BadPixelRemovalThreshold); ++ if (threshold) { ++ if (!isThresholdValid(*threshold)) { ++ LOG(DcmippBadPixel, Error) << "Invalid Threshold: " << *threshold; ++ return; ++ } ++ internal_.threshold = *threshold; ++ internal_.measureNb = 0; ++ internal_.countAccu = 0; ++ LOG(DcmippBadPixel, Debug) << "Updating threshold to " << *threshold; ++ } ++ ++ /* Update params_ and force config_ update now */ ++ const auto &enable = controls.get(controls::draft::BadPixelRemovalEnable); ++ const auto &strength = controls.get(controls::draft::BadPixelRemovalStrength); ++ ++ if (enable) { ++ params_.badpixel.enable = *enable; ++ config_.badpixel.enable = params_.badpixel.enable; ++ config_.pending = true; ++ LOG(DcmippBadPixel, Debug) << "Updating Bad Pixel status to " << *enable; ++ } ++ ++ if (strength) { ++ if (!isStrengthValid(*strength)) { ++ LOG(DcmippBadPixel, Error) << "Invalid Strength: " << *strength; ++ return; ++ } ++ params_.badpixel.strength = *strength; ++ if (!internal_.threshold) { ++ config_.badpixel.strength = params_.badpixel.strength; ++ config_.pending = true; ++ } ++ LOG(DcmippBadPixel, Debug) << "Updating strength to " << *strength; ++ } ++} ++ ++void BadPixel::prepare(IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ++ [[maybe_unused]] ControlList &sensorControls, ++ [[maybe_unused]] ControlList &ispControls) ++{ ++ /* Copy the pending config to the isp_params. Update the IPAContext */ ++ if (config_.pending) { ++ /* Configure Bad Pixel params */ ++ params->module_cfg_update |= STM32_DCMIPP_ISP_BPR; ++ params->ctrls.bpr_cfg.en = config_.badpixel.enable; ++ params->ctrls.bpr_cfg.strength = config_.badpixel.strength; ++ ++ /* Update context */ ++ context.isp.badpixel = config_.badpixel; ++ ++ /* Clear the pending request */ ++ config_.pending = false; ++ } ++} ++ ++const int32_t kBadPixelMeasures = 30; ++ ++void BadPixel::process(IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ [[maybe_unused]] const stm32_dcmipp_stat_buf *stats, ++ ControlList &metadata) ++{ ++ /* Adjust strength according to threshold */ ++ if (params_.badpixel.enable && internal_.threshold) { ++ /* Make kBadPixelMeasures measures before computing the average */ ++ internal_.countAccu += stats->bad_pixel_count; ++ if (++internal_.measureNb == kBadPixelMeasures) { ++ uint8_t strength = context.isp.badpixel.strength; ++ internal_.countAccu /= kBadPixelMeasures; ++ ++ /* Increase or decrease strength */ ++ if (internal_.countAccu > internal_.threshold && strength > 0) ++ strength--; ++ else if (internal_.countAccu < internal_.threshold && strength < kStrengthMax - 1) ++ strength++; ++ ++ /* Update config */ ++ config_.badpixel.strength = strength; ++ config_.pending = true; ++ internal_.measureNb = 0; ++ internal_.countAccu = 0; ++ } ++ } ++ ++ /* Set bad pixel metadata */ ++ metadata.set(controls::draft::BadPixelRemovalEnable, config_.badpixel.enable); ++ metadata.set(controls::draft::BadPixelRemovalStrength, config_.badpixel.strength); ++ metadata.set(controls::draft::BadPixelRemovalThreshold, internal_.threshold); ++ metadata.set(controls::draft::BadPixelRemovalCount, stats->bad_pixel_count); ++} ++ ++REGISTER_IPA_ALGORITHM(BadPixel, "BadPixel") ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/badpixel.h b/src/ipa/dcmipp/algorithms/badpixel.h +new file mode 100644 +index 00000000..0db7645a +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/badpixel.h +@@ -0,0 +1,50 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * badpixel.h - STM32 DCMIPP Bad Pixel Removal ++ */ ++ ++#pragma once ++ ++#include "algorithm.h" ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++class BadPixel : public Algorithm ++{ ++public: ++ BadPixel() = default; ++ ++ int init(IPAContext &context, const YamlObject &tuningData) override; ++ int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override; ++ void queueRequest(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const ControlList &controls) override; ++ void prepare(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ControlList &sensorControls, ++ ControlList &ispControls) override; ++ void process(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const stm32_dcmipp_stat_buf *stats, ControlList &metadata) override; ++ ++private: ++ struct algoParams { ++ struct IPAIspBadpixel badpixel; ++ } params_; ++ ++ struct algoInternal { ++ int32_t threshold; ++ int32_t countAccu; ++ int32_t measureNb; ++ } internal_; ++ ++ struct algoConfig { ++ bool pending; ++ struct IPAIspBadpixel badpixel; ++ } config_; ++}; ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/blc.cpp b/src/ipa/dcmipp/algorithms/blc.cpp +new file mode 100644 +index 00000000..9b40dd5f +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/blc.cpp +@@ -0,0 +1,145 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * blc.cpp - STM32 DCMIPP Black Level Correction ++ */ ++ ++#include "blc.h" ++ ++#include ++#include ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++LOG_DEFINE_CATEGORY(DcmippBlc) ++ ++static constexpr int kBLMin = 0; ++static constexpr int kBLMax = 255; ++static constexpr int kBLDef = 0; ++ ++static bool isValid(int32_t level) ++{ ++ return level >= kBLMin && level <= kBLMax; ++} ++ ++int BlackLevelCorrection::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData) ++{ ++ /* Parse Tuning Data to get algo parameters */ ++ std::vector level = tuningData["Level"].getList().value_or(std::vector{}); ++ if (!level.size()) { ++ params_.blackLevel.blcR = kBLDef; ++ params_.blackLevel.blcG = kBLDef; ++ params_.blackLevel.blcB = kBLDef; ++ params_.blackLevel.enable = false; ++ } else if (level.size() == 3) { ++ for (auto const &l : level) ++ if (!isValid(l)) { ++ LOG(DcmippBlc, Error) << "Invalid black level value: " << l; ++ return -EINVAL; ++ } ++ params_.blackLevel.blcR = level[0]; ++ params_.blackLevel.blcG = level[1]; ++ params_.blackLevel.blcB = level[2]; ++ params_.blackLevel.enable = false; ++ params_.blackLevel.enable = tuningData["Enable"].get(true); ++ } else { ++ LOG(DcmippBlc, Error) << "Invalid nubmer of black levels"; ++ return -EINVAL; ++ } ++ ++ /* Configure exposed controls */ ++ context.dcmippControls[&controls::draft::BlackLevelCorrectionEnable] = ControlInfo(false, true); ++ context.dcmippControls[&controls::draft::BlackLevelCorrectionLevels] = ControlInfo(kBLMin, kBLMax, kBLDef); ++ ++ return 0; ++} ++ ++int BlackLevelCorrection::configure([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const IPACameraSensorInfo &configInfo) ++{ ++ /* Set the initial ISP/sensor values in the pending config */ ++ config_.blackLevel = params_.blackLevel; ++ config_.pending = true; ++ ++ return 0; ++} ++ ++void BlackLevelCorrection::queueRequest([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ const ControlList &controls) ++{ ++ /* Update params_ and force config_ update now */ ++ const auto &enable = controls.get(controls::draft::BlackLevelCorrectionEnable); ++ const auto &level = controls.get(controls::draft::BlackLevelCorrectionLevels); ++ ++ if (enable) { ++ params_.blackLevel.enable = *enable; ++ config_.blackLevel.enable = params_.blackLevel.enable; ++ config_.pending = true; ++ LOG(DcmippBlc, Debug) << "Updating black level status to " << *enable; ++ } ++ ++ if (level) { ++ for (auto const &l : *level) ++ if (!isValid(l)) { ++ LOG(DcmippBlc, Error) << "Invalid black level value: " << l; ++ return; ++ } ++ params_.blackLevel.blcR = (*level)[0]; ++ params_.blackLevel.blcG = (*level)[1]; ++ params_.blackLevel.blcB = (*level)[2]; ++ config_.blackLevel.blcR = params_.blackLevel.blcR; ++ config_.blackLevel.blcG = params_.blackLevel.blcG; ++ config_.blackLevel.blcB = params_.blackLevel.blcB; ++ config_.pending = true; ++ LOG(DcmippBlc, Debug) << "Updating black level to " << (*level)[0] << "..."; ++ } ++} ++ ++void BlackLevelCorrection::prepare([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ++ [[maybe_unused]] ControlList &sensorControls, ++ [[maybe_unused]] ControlList &ispControls) ++{ ++ /* Copy the pending config to the isp_params. Update the IPAContext */ ++ if (config_.pending) { ++ /* Configure Black Level params */ ++ params->module_cfg_update |= STM32_DCMIPP_ISP_BLC; ++ params->ctrls.blc_cfg.blc_r = config_.blackLevel.blcR; ++ params->ctrls.blc_cfg.blc_g = config_.blackLevel.blcG; ++ params->ctrls.blc_cfg.blc_b = config_.blackLevel.blcB; ++ params->ctrls.blc_cfg.en = config_.blackLevel.enable; ++ ++ /* Update context */ ++ context.isp.blackLevel = config_.blackLevel; ++ ++ /* Clear the pending request */ ++ config_.pending = false; ++ } ++} ++ ++void BlackLevelCorrection::process([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ [[maybe_unused]] const stm32_dcmipp_stat_buf *stats, ++ ControlList &metadata) ++{ ++ /* Set BlackLevel metadata */ ++ metadata.set(controls::draft::BlackLevelCorrectionEnable, config_.blackLevel.enable); ++ metadata.set(controls::draft::BlackLevelCorrectionLevels, ++ { static_cast(config_.blackLevel.blcR), ++ static_cast(config_.blackLevel.blcG), ++ static_cast(config_.blackLevel.blcB) }); ++} ++ ++REGISTER_IPA_ALGORITHM(BlackLevelCorrection, "BlackLevelCorrection") ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/blc.h b/src/ipa/dcmipp/algorithms/blc.h +new file mode 100644 +index 00000000..968d5ce3 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/blc.h +@@ -0,0 +1,44 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * blc.h - STM32 DCMIPP Black Level Correction ++ */ ++ ++#pragma once ++ ++#include "algorithm.h" ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++class BlackLevelCorrection : public Algorithm ++{ ++public: ++ BlackLevelCorrection() = default; ++ ++ int init(IPAContext &context, const YamlObject &tuningData) override; ++ int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override; ++ void queueRequest(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const ControlList &controls) override; ++ void prepare(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ControlList &sensorControls, ++ ControlList &ispControls) override; ++ void process(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const stm32_dcmipp_stat_buf *stats, ControlList &metadata) override; ++ ++private: ++ struct algoParams { ++ struct IPAIspBlackLevel blackLevel; ++ } params_; ++ ++ struct algoConfig { ++ bool pending; ++ struct IPAIspBlackLevel blackLevel; ++ } config_; ++}; ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/contrast.cpp b/src/ipa/dcmipp/algorithms/contrast.cpp +new file mode 100644 +index 00000000..412d9888 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/contrast.cpp +@@ -0,0 +1,141 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * contrast.cpp - STM32 DCMIPP Contrast Enhancement ++ */ ++ ++#include "contrast.h" ++ ++#include ++#include ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++LOG_DEFINE_CATEGORY(DcmippContrast) ++ ++static constexpr uint32_t kPrecisionFactor = 100; ++static constexpr uint32_t kIdle = 16; ++static constexpr int kContrastSize = 9; ++static constexpr int kFactorMin = 0; ++static constexpr int kFactorMax = 394; ++static constexpr int kFactorDef = 0; ++ ++static bool isFactorValid(int32_t factor) ++{ ++ return factor >= kFactorMin && factor <= kFactorMax; ++} ++ ++int Contrast::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData) ++{ ++ /* Parse Tuning Data to get algo parameters */ ++ /* ISP Contrast */ ++ std::vector lum = tuningData["LuminanceFactor"].getList().value_or(std::vector{}); ++ if (!lum.size()) { ++ memset(params_.contrast.coeff, kFactorDef, kNbContrastFactor * sizeof(params_.contrast.coeff[0])); ++ params_.contrast.enable = false; ++ } else if (lum.size() == kNbContrastFactor) { ++ for (auto const &l : lum) ++ if (!isFactorValid(l)) { ++ LOG(DcmippContrast, Error) << "Invalid luminance factor: " << l; ++ return -EINVAL; ++ } ++ for (unsigned int i = 0; i < kNbContrastFactor; i++) ++ params_.contrast.coeff[i] = lum[i]; ++ params_.contrast.enable = tuningData["Enable"].get(true); ++ } else { ++ LOG(DcmippContrast, Error) << "Invalid LuminanceFactor"; ++ return -EINVAL; ++ } ++ ++ /* Configure exposed controls */ ++ context.dcmippControls[&controls::draft::ContrastLuminanceEnable] = ControlInfo(false, true); ++ context.dcmippControls[&controls::draft::ContrastLuminance] = ControlInfo(0, 394, 0); ++ ++ return 0; ++} ++ ++int Contrast::configure([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const IPACameraSensorInfo &configInfo) ++{ ++ /* Set the initial ISP values in the pending config */ ++ config_.contrast = params_.contrast; ++ config_.pending = true; ++ ++ return 0; ++} ++ ++void Contrast::queueRequest([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ const ControlList &controls) ++{ ++ /* Update params_ and force config_ update now */ ++ const auto &enable = controls.get(controls::draft::ContrastLuminanceEnable); ++ const auto &luminance = controls.get(controls::draft::ContrastLuminance); ++ ++ if (enable) { ++ params_.contrast.enable = *enable; ++ config_.contrast.enable = params_.contrast.enable; ++ config_.pending = true; ++ LOG(DcmippContrast, Debug) << "Updating contrast status to " << *enable; ++ } ++ ++ if (luminance) { ++ for (auto const &l : *luminance) ++ if (!isFactorValid(l)) { ++ LOG(DcmippContrast, Error) << "Invalid luminance factor: " << l; ++ return; ++ } ++ std::copy(std::begin(*luminance), std::end(*luminance), params_.contrast.coeff); ++ memcpy(config_.contrast.coeff, params_.contrast.coeff, sizeof(config_.contrast.coeff)); ++ config_.pending = true; ++ LOG(DcmippContrast, Debug) << "Updating contrast status to " << (*luminance)[0] << "..."; ++ } ++} ++ ++void Contrast::prepare(IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ++ [[maybe_unused]] ControlList &sensorControls, ++ [[maybe_unused]] ControlList &ispControls) ++{ ++ /* Copy the pending config to the isp_params. Update the IPAContext */ ++ if (config_.pending) { ++ /* Configure Contrast params */ ++ params->module_cfg_update |= STM32_DCMIPP_ISP_CE; ++ params->ctrls.ce_cfg.en = config_.contrast.enable; ++ for (unsigned int i = 0; i < kNbContrastFactor; i++) ++ /* Convert factor (Unit = 100 for "x1.0") to register format (where 16 means "x1.0") */ ++ params->ctrls.ce_cfg.lum[i] = (config_.contrast.coeff[i] * kIdle) / kPrecisionFactor; ++ ++ /* Update context */ ++ context.isp.contrast = config_.contrast; ++ ++ /* Clear the pending request */ ++ config_.pending = false; ++ } ++} ++ ++void Contrast::process([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ [[maybe_unused]] const stm32_dcmipp_stat_buf *stats, ++ ControlList &metadata) ++{ ++ /* Set contrast metadata */ ++ std::array contrast; ++ ++ metadata.set(controls::draft::ContrastLuminanceEnable, config_.contrast.enable); ++ std::copy(params_.contrast.coeff, params_.contrast.coeff + kContrastSize, contrast.begin()); ++ metadata.set(controls::draft::ContrastLuminance, contrast); ++} ++ ++REGISTER_IPA_ALGORITHM(Contrast, "Contrast") ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/contrast.h b/src/ipa/dcmipp/algorithms/contrast.h +new file mode 100644 +index 00000000..51dc85e7 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/contrast.h +@@ -0,0 +1,44 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * contrast.h - STM32 DCMIPP Contrast Enhancement ++ */ ++ ++#pragma once ++ ++#include "algorithm.h" ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++class Contrast : public Algorithm ++{ ++public: ++ Contrast() = default; ++ ++ int init(IPAContext &context, const YamlObject &tuningData) override; ++ int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override; ++ void queueRequest(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const ControlList &controls) override; ++ void prepare(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ControlList &sensorControls, ++ ControlList &ispControls) override; ++ void process(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const stm32_dcmipp_stat_buf *stats, ControlList &metadata) override; ++ ++private: ++ struct algoParams { ++ struct IPAIspContrast contrast; ++ } params_; ++ ++ struct algoConfig { ++ bool pending; ++ struct IPAIspContrast contrast; ++ } config_; ++}; ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/demosaicing.cpp b/src/ipa/dcmipp/algorithms/demosaicing.cpp +new file mode 100644 +index 00000000..b0c7915a +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/demosaicing.cpp +@@ -0,0 +1,146 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * demosaicing.cpp - STM32 DCMIPP Demosaicing Filter ++ */ ++ ++#include "demosaicing.h" ++ ++#include ++#include ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++LOG_DEFINE_CATEGORY(DcmippDemosaicing) ++ ++static constexpr unsigned int kNbFilters = 4; ++static constexpr int kFilterMin = 0; ++static constexpr int kFilterMax = 7; ++static constexpr int kFilterDef = 0; ++ ++static bool isValid(int32_t filter) ++{ ++ return filter >= kFilterMin && filter <= kFilterMax; ++} ++ ++int Demosaicing::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData) ++{ ++ /* Parse Tuning Data to get algo parameters */ ++ params_.demosaicing.enable = tuningData["Enable"].get(true); ++ /* ISP Demosaicing Filter */ ++ std::vector filter = tuningData["Filter"].getList().value_or(std::vector(kNbFilters, kFilterDef)); ++ if (filter.size() != kNbFilters) { ++ LOG(DcmippDemosaicing, Error) << "Invalid number of filters"; ++ return -EINVAL; ++ } ++ for (auto const &f : filter) ++ if (!isValid(f)) { ++ LOG(DcmippDemosaicing, Error) << "Invalid filter value: " << f; ++ return -EINVAL; ++ } ++ ++ params_.demosaicing.peak = filter[0]; ++ params_.demosaicing.linev = filter[1]; ++ params_.demosaicing.lineh = filter[2]; ++ params_.demosaicing.edge = filter[3]; ++ ++ /* Configure exposed controls */ ++ context.dcmippControls[&controls::draft::DemosaicingEnable] = ControlInfo(false, true); ++ context.dcmippControls[&controls::draft::DemosaicingFilter] = ControlInfo(kFilterMin, kFilterMax, kFilterDef); ++ ++ return 0; ++} ++ ++int Demosaicing::configure([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const IPACameraSensorInfo &configInfo) ++{ ++ /* Set the initial ISP values in the pending config */ ++ config_.demosaicing = params_.demosaicing; ++ config_.pending = true; ++ ++ return 0; ++} ++ ++void Demosaicing::queueRequest([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ const ControlList &controls) ++{ ++ /* Update params_ and force config_ update now */ ++ const auto &enable = controls.get(controls::draft::DemosaicingEnable); ++ const auto &filter = controls.get(controls::draft::DemosaicingFilter); ++ ++ if (enable) { ++ params_.demosaicing.enable = *enable; ++ config_.demosaicing.enable = params_.demosaicing.enable; ++ config_.pending = true; ++ LOG(DcmippDemosaicing, Debug) << "Updating demosaicing status to " << *enable; ++ } ++ ++ if (filter) { ++ for (auto const &f : *filter) ++ if (!isValid(f)) { ++ LOG(DcmippDemosaicing, Error) << "Invalid filter value: " << f; ++ return; ++ } ++ params_.demosaicing.peak = (*filter)[0]; ++ params_.demosaicing.linev = (*filter)[1]; ++ params_.demosaicing.lineh = (*filter)[2]; ++ params_.demosaicing.edge = (*filter)[3]; ++ config_.demosaicing.peak = params_.demosaicing.peak; ++ config_.demosaicing.linev = params_.demosaicing.linev; ++ config_.demosaicing.lineh = params_.demosaicing.lineh; ++ config_.demosaicing.edge = params_.demosaicing.edge; ++ config_.pending = true; ++ LOG(DcmippDemosaicing, Debug) << "Updating demosaicing filter to " << (*filter)[0] << "..."; ++ } ++} ++ ++void Demosaicing::prepare(IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ++ [[maybe_unused]] ControlList &sensorControls, ++ [[maybe_unused]] ControlList &ispControls) ++{ ++ /* Copy the pending config to the isp_params. Update the IPAContext */ ++ if (config_.pending) { ++ /* Configure Demosaicing filter params */ ++ params->module_cfg_update |= STM32_DCMIPP_ISP_DM; ++ params->ctrls.dm_cfg.en = config_.demosaicing.enable; ++ params->ctrls.dm_cfg.edge = config_.demosaicing.edge; ++ params->ctrls.dm_cfg.lineh = config_.demosaicing.lineh; ++ params->ctrls.dm_cfg.linev = config_.demosaicing.linev; ++ params->ctrls.dm_cfg.peak = config_.demosaicing.peak; ++ ++ /* Update context */ ++ context.isp.demosaicing = config_.demosaicing; ++ ++ /* Clear the pending request */ ++ config_.pending = false; ++ } ++} ++ ++void Demosaicing::process([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ [[maybe_unused]] const stm32_dcmipp_stat_buf *stats, ++ ControlList &metadata) ++{ ++ /* Set demosaicing metadata */ ++ metadata.set(controls::draft::DemosaicingEnable, config_.demosaicing.enable); ++ metadata.set(controls::draft::DemosaicingFilter, ++ { static_cast(config_.demosaicing.peak), ++ static_cast(config_.demosaicing.linev), ++ static_cast(config_.demosaicing.lineh), ++ static_cast(config_.demosaicing.edge) }); ++} ++ ++REGISTER_IPA_ALGORITHM(Demosaicing, "Demosaicing") ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/demosaicing.h b/src/ipa/dcmipp/algorithms/demosaicing.h +new file mode 100644 +index 00000000..9b407485 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/demosaicing.h +@@ -0,0 +1,44 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * demosaicing.h - STM32 DCMIPP Deomsaicing Filter ++ */ ++ ++#pragma once ++ ++#include "algorithm.h" ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++class Demosaicing : public Algorithm ++{ ++public: ++ Demosaicing() = default; ++ ++ int init(IPAContext &context, const YamlObject &tuningData) override; ++ int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override; ++ void queueRequest(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const ControlList &controls) override; ++ void prepare(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ControlList &sensorControls, ++ ControlList &ispControls) override; ++ void process(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const stm32_dcmipp_stat_buf *stats, ControlList &metadata) override; ++ ++private: ++ struct algoParams { ++ struct IPAIspDemosaicing demosaicing; ++ } params_; ++ ++ struct algoConfig { ++ bool pending; ++ struct IPAIspDemosaicing demosaicing; ++ } config_; ++}; ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/gamma.cpp b/src/ipa/dcmipp/algorithms/gamma.cpp +new file mode 100644 +index 00000000..fd595479 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/gamma.cpp +@@ -0,0 +1,91 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2025 ST Microelectronics ++ * ++ * gamma.cpp - STM32 DCMIPP Gamma Correction configuration ++ */ ++ ++#include "gamma.h" ++ ++#include ++#include ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++LOG_DEFINE_CATEGORY(DcmippGamma) ++ ++int GammaCorrection::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData) ++{ ++ /* Parse Tuning Data to get algo parameters */ ++ /* ISP Gamma Correction config */ ++ params_.gamma.enable = tuningData["Enable"].get(true); ++ ++ /* Configure exposed controls */ ++ context.dcmippControls[&controls::draft::GammaCorrectionEnable] = ControlInfo(false, true); ++ ++ return 0; ++} ++ ++int GammaCorrection::configure([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const IPACameraSensorInfo &configInfo) ++{ ++ /* Set the initial ISP values in the pending config */ ++ config_.gamma = params_.gamma; ++ config_.pending = true; ++ ++ return 0; ++} ++ ++void GammaCorrection::queueRequest([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ const ControlList &controls) ++{ ++ /* Update params_ and force config_ update now */ ++ const auto &enable = controls.get(controls::draft::GammaCorrectionEnable); ++ ++ if (enable) { ++ params_.gamma.enable = *enable; ++ config_.gamma = params_.gamma; ++ config_.pending = true; ++ LOG(DcmippGamma, Debug) << "Updating gamma correction to " << *enable; ++ } ++} ++ ++void GammaCorrection::prepare(IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ [[maybe_unused]] stm32_dcmipp_params_cfg *params, ++ [[maybe_unused]] ControlList &sensorControls, ++ ControlList &ispControls) ++{ ++ /* Copy the pending config to the isp controls (not isp_params). Update the IPAContext */ ++ if (config_.pending) { ++ /* Configure Gamma */ ++ ispControls.set(controls::draft::GammaCorrectionEnable, config_.gamma.enable); ++ ++ /* Update context */ ++ context.isp.gamma = config_.gamma; ++ ++ /* Clear the pending request */ ++ config_.pending = false; ++ } ++} ++ ++void GammaCorrection::process([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ [[maybe_unused]] const stm32_dcmipp_stat_buf *stats, ++ ControlList &metadata) ++{ ++ /* Set gamma metadata */ ++ metadata.set(controls::draft::GammaCorrectionEnable, config_.gamma.enable); ++} ++ ++REGISTER_IPA_ALGORITHM(GammaCorrection, "GammaCorrection") ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/gamma.h b/src/ipa/dcmipp/algorithms/gamma.h +new file mode 100644 +index 00000000..04449bd0 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/gamma.h +@@ -0,0 +1,44 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2025 ST Microelectronics ++ * ++ * gamma.h - STM32 DCMIPP Gamma Correction configuration ++ */ ++ ++#pragma once ++ ++#include "algorithm.h" ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++class GammaCorrection : public Algorithm ++{ ++public: ++ GammaCorrection() = default; ++ ++ int init(IPAContext &context, const YamlObject &tuningData) override; ++ int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override; ++ void queueRequest(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const ControlList &controls) override; ++ void prepare(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ControlList &sensorControls, ++ ControlList &ispControls) override; ++ void process(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const stm32_dcmipp_stat_buf *stats, ControlList &metadata) override; ++ ++private: ++ struct algoParams { ++ struct IPAIspGammaCorrection gamma; ++ } params_; ++ ++ struct algoConfig { ++ bool pending; ++ struct IPAIspGammaCorrection gamma; ++ } config_; ++}; ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/meson.build b/src/ipa/dcmipp/algorithms/meson.build +new file mode 100644 +index 00000000..55c62894 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/meson.build +@@ -0,0 +1,12 @@ ++# SPDX-License-Identifier: CC0-1.0 ++ ++dcmipp_ipa_algorithms = files([ ++ 'statistic.cpp', ++ 'badpixel.cpp', ++ 'blc.cpp', ++ 'demosaicing.cpp', ++ 'contrast.cpp', ++ 'aec.cpp', ++ 'awb.cpp', ++ 'gamma.cpp', ++]) +diff --git a/src/ipa/dcmipp/algorithms/statistic.cpp b/src/ipa/dcmipp/algorithms/statistic.cpp +new file mode 100644 +index 00000000..9cba1960 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/statistic.cpp +@@ -0,0 +1,215 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * statistic.cpp - STM32 DCMIPP Statistic configuration ++ */ ++ ++#include "statistic.h" ++ ++#include ++#include ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++LOG_DEFINE_CATEGORY(DcmippStatistic) ++ ++enum StatProfile { ++ ProfileFull = 0, ++ ProfileAvgUp, ++ ProfileAvgDown ++}; ++ ++static constexpr int kBinsSize = 12; ++static constexpr int kSizeMin = 0; ++static constexpr int kSizeMax = 4094; ++static constexpr int kSizeDef = 0; ++static constexpr int kProfileMin = ProfileFull; ++static constexpr int kProfileMax = ProfileAvgDown; ++static constexpr int kProfileDef = ProfileFull; ++ ++static bool isSizeValid(int32_t size) ++{ ++ return size >= kSizeMin && size <= kSizeMax; ++} ++ ++static bool isProfileValid(int32_t profile) ++{ ++ return profile >= kProfileMin && profile <= kProfileMax; ++} ++ ++static int32_t getCycleDuration(uint32_t profile) ++{ ++ int32_t duration; ++ ++ switch (profile) { ++ default: ++ case ProfileFull: ++ /* 10 requests to get all stats: (up[1] + down[1]) * (avg[1] + bins[4]) */ ++ duration = (1 + 1) * (1 + 4); ++ break; ++ case ProfileAvgUp: ++ case ProfileAvgDown: ++ /* 1 single request to get AVG for up or down */ ++ duration = 1; ++ } ++ return duration; ++} ++ ++static int32_t luminanceFromRgb(const __u32 RGB[3]) ++{ ++ return (int32_t)((3 * RGB[0] + 6 * RGB[1] + RGB[2]) / 10); ++} ++ ++int Statistic::init([[maybe_unused]] IPAContext &context, const YamlObject &tuningData) ++{ ++ /* Parse Tuning Data to get algo parameters */ ++ /* ISP Statistic config */ ++ params_.statistic.profile = tuningData["Profile"].get(kProfileDef); ++ if (!isProfileValid(params_.statistic.profile)) { ++ LOG(DcmippStatistic, Error) << "Invalid Profile: " << params_.statistic.profile; ++ return -EINVAL; ++ } ++ ++ /* Update ispStatLatency now, so it can be used by other algos from startup */ ++ context.info.ispStatLatency = getCycleDuration(params_.statistic.profile); ++ ++ std::vector rect = tuningData["Area"].getList().value_or(std::vector(4, kSizeDef)); ++ if (rect.size() != 4) { ++ LOG(DcmippStatistic, Error) << "Invalid Area"; ++ return -EINVAL; ++ } ++ for (auto const &s : rect) ++ if (!isSizeValid(s)) { ++ LOG(DcmippStatistic, Error) << "Invalid stat area"; ++ return -EINVAL; ++ } ++ params_.statistic.area.x0 = rect[0]; ++ params_.statistic.area.y0 = rect[1]; ++ params_.statistic.area.xSize = rect[2]; ++ params_.statistic.area.ySize = rect[3]; ++ ++ /* Configure exposed controls */ ++ context.dcmippControls[&controls::draft::StatisticArea] = ControlInfo(Rectangle{}, Rectangle(kSizeMax, kSizeMax, kSizeMax, kSizeMax), Rectangle{}); ++ context.dcmippControls[&controls::draft::StatisticProfile] = ControlInfo(0, 2, 0); ++ ++ return 0; ++} ++ ++int Statistic::configure([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const IPACameraSensorInfo &configInfo) ++{ ++ /* Set the initial ISP values in the pending config */ ++ config_.statistic = params_.statistic; ++ config_.pending = true; ++ ++ return 0; ++} ++ ++void Statistic::queueRequest([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ const ControlList &controls) ++{ ++ /* Update params_ and force config_ update now */ ++ const auto &profile = controls.get(controls::draft::StatisticProfile); ++ const auto &area = controls.get(controls::draft::StatisticArea); ++ ++ if (profile) { ++ if (!isProfileValid(*profile)) { ++ LOG(DcmippStatistic, Error) << "Invalid Profile: " << *profile; ++ return; ++ } ++ params_.statistic.profile = *profile; ++ config_.statistic.profile = params_.statistic.profile; ++ config_.pending = true; ++ LOG(DcmippStatistic, Debug) << "Updating static profile to " << *profile; ++ } ++ ++ if (area) { ++ if (!isSizeValid((*area).x) || !isSizeValid((*area).y) || !isSizeValid((*area).width) || !isSizeValid((*area).height)) { ++ LOG(DcmippStatistic, Error) << "Invalid stat area"; ++ return; ++ } ++ params_.statistic.area.x0 = (*area).x; ++ params_.statistic.area.y0 = (*area).y; ++ params_.statistic.area.xSize = (*area).width; ++ params_.statistic.area.ySize = (*area).height; ++ config_.statistic.area = params_.statistic.area; ++ config_.pending = true; ++ LOG(DcmippStatistic, Debug) << "Updating static area to " << *area; ++ } ++} ++ ++void Statistic::prepare(IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ [[maybe_unused]] stm32_dcmipp_params_cfg *params, ++ [[maybe_unused]] ControlList &sensorControls, ++ ControlList &ispControls) ++{ ++ /* Copy the pending config to the isp controls (not isp_params). Update the IPAContext */ ++ if (config_.pending) { ++ /* Configure Statistic area */ ++ Rectangle area(config_.statistic.area.x0, config_.statistic.area.y0, ++ config_.statistic.area.xSize, config_.statistic.area.ySize); ++ ispControls.set(controls::draft::StatisticArea, area); ++ ispControls.set(controls::draft::StatisticProfile, config_.statistic.profile); ++ ++ /* Update context */ ++ context.isp.statistic = config_.statistic; ++ ++ /* Stat Latency = stat gathering cycle length */ ++ context.info.ispStatLatency = getCycleDuration(config_.statistic.profile); ++ ++ /* Clear the pending request */ ++ config_.pending = false; ++ } ++} ++ ++void Statistic::process([[maybe_unused]] IPAContext &context, ++ [[maybe_unused]] const uint32_t frame, ++ [[maybe_unused]] IPAFrameContext &frameContext, ++ const stm32_dcmipp_stat_buf *stats, ++ ControlList &metadata) ++{ ++ /* Set statistic metadata */ ++ Rectangle area(config_.statistic.area.x0, config_.statistic.area.y0, ++ config_.statistic.area.xSize, config_.statistic.area.ySize); ++ metadata.set(controls::draft::StatisticArea, area); ++ metadata.set(controls::draft::StatisticProfile, config_.statistic.profile); ++ ++ if ((config_.statistic.profile == ProfileAvgUp) || ++ (config_.statistic.profile == ProfileFull)) { ++ metadata.set(controls::draft::StatisticAverageUp, ++ { static_cast(stats->pre.average_RGB[0]), ++ static_cast(stats->pre.average_RGB[1]), ++ static_cast(stats->pre.average_RGB[2]), ++ luminanceFromRgb(stats->pre.average_RGB) }); ++ } ++ if ((config_.statistic.profile == ProfileAvgDown) || ++ (config_.statistic.profile == ProfileFull)) { ++ metadata.set(controls::draft::StatisticAverageDown, ++ { static_cast(stats->post.average_RGB[0]), ++ static_cast(stats->post.average_RGB[1]), ++ static_cast(stats->post.average_RGB[2]), ++ luminanceFromRgb(stats->post.average_RGB) }); ++ } ++ if (config_.statistic.profile == ProfileFull) { ++ std::array bins; ++ ++ std::copy(stats->pre.bins, stats->pre.bins + kBinsSize, bins.begin()); ++ metadata.set(controls::draft::StatisticBinsUp, bins); ++ ++ std::copy(stats->post.bins, stats->post.bins + kBinsSize, bins.begin()); ++ metadata.set(controls::draft::StatisticBinsDown, bins); ++ } ++} ++ ++REGISTER_IPA_ALGORITHM(Statistic, "Statistic") ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/algorithms/statistic.h b/src/ipa/dcmipp/algorithms/statistic.h +new file mode 100644 +index 00000000..1185b1a6 +--- /dev/null ++++ b/src/ipa/dcmipp/algorithms/statistic.h +@@ -0,0 +1,44 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * statistic.h - STM32 DCMIPP Statistic configuration ++ */ ++ ++#pragma once ++ ++#include "algorithm.h" ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp::algorithms { ++ ++class Statistic : public Algorithm ++{ ++public: ++ Statistic() = default; ++ ++ int init(IPAContext &context, const YamlObject &tuningData) override; ++ int configure(IPAContext &context, const IPACameraSensorInfo &configInfo) override; ++ void queueRequest(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const ControlList &controls) override; ++ void prepare(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ stm32_dcmipp_params_cfg *params, ControlList &sensorControls, ++ ControlList &ispControls) override; ++ void process(IPAContext &context, const uint32_t frame, IPAFrameContext &frameContext, ++ const stm32_dcmipp_stat_buf *stats, ControlList &metadata) override; ++ ++private: ++ struct algoParams { ++ struct IPAIspStatistic statistic; ++ } params_; ++ ++ struct algoConfig { ++ bool pending; ++ struct IPAIspStatistic statistic; ++ } config_; ++}; ++ ++} /* namespace ipa::dcmipp::algorithms */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/data/imx335.yaml b/src/ipa/dcmipp/data/imx335.yaml +new file mode 100644 +index 00000000..3de5a11b +--- /dev/null ++++ b/src/ipa/dcmipp/data/imx335.yaml +@@ -0,0 +1,57 @@ ++# Copyright (c) 2024 STMicroelectronics. ++# All rights reserved. ++# ++# This software is licensed under SLA0044 terms that can be found here: ++# https://www.st.com/resource/en/license_agreement/SLA0044.txt ++# ++# imx335 configuration file for the STM32 dcmipp IPA. ++# ++# THIS FILE WAS GENERATED BY THE STM32 ISP IQTune ON 2024-10-09 12:13:15 ++# ++ ++%YAML 1.1 ++--- ++version: 1 ++algorithms: ++ - Aec: ++ AnalogueGain_dB: 0.0 ++ ExposureTime: 6318 ++ AeEnable: true ++ AntiFlickerFreq: 0 ++ ExposureValue: 0.0 ++ SensorDelay: 3 ++ - Awb: ++ FixedGainEnable: true ++ FixedGainR: 220000000 ++ FixedGainG: 100000000 ++ FixedGainB: 180000000 ++ FixedCconvEnable: true ++ FixedCconv: [180080000, -64840000, -15230000, -35550000, 169920000, -34380000, 9770000, -95700000, 185940000] ++ AwbEnable: true ++ ProfileName: ["IMX335-A", "IMX335-TL84", "IMX335-D50", "IMX335-D65", "Free Slot"] ++ RefColorTemp: [2856, 4000, 5000, 6500, 0] ++ GainR: [140000000, 177000000, 220000000, 245000000, 0] ++ GainG: [100000000, 100000000, 100000000, 100000000, 0] ++ GainB: [275000000, 235000000, 180000000, 155000000, 0] ++ Cconv: [151460000, -102340000, 50892000, -85991000, 210980000, -24984000, 25000000, -261000000, 341000000, 155134500, -69370000, 13106000, -38671000, 167689800, -33936000, 5546200, -66769999, 159944200, 180080000, -64840000, -15230000, -35550000, 169920000, -34380000, 9770000, -95700000, 185940000, 180080000, -64840000, -15230000, -35550000, 169920000, -34380000, 9770000, -95700000, 185940000, 0, 0, 0, 0, 0, 0, 0, 0, 0] ++ - BadPixel: ++ Enable: false ++ Strength: 0 ++ Threhsold: 0 ++ - BlackLevelCorrection: ++ Enable: true ++ Level: [12, 12, 12] ++ - Contrast: ++ Enable: false ++ LuminanceFactor: [100, 100, 100, 100, 100, 100, 100, 100, 100] ++ - Demosaicing: ++ Enable: true ++ Filter: [2, 4, 4, 6] ++ - Statistic: ++ Area: [648, 486, 1296, 972] ++ Profile: 2 ++ - GammaCorrection: ++ Enable: true ++# NOTE : parameters of 'statRemoval' are not handled in libcamera ++# NOTE : parameters of 'decimation' are not handled in libcamera ++# NOTE : parameter 'demosaicing.type' is not handled in libcamera +diff --git a/src/ipa/dcmipp/data/imx335_judge2_light_box.yaml b/src/ipa/dcmipp/data/imx335_judge2_light_box.yaml +new file mode 100644 +index 00000000..6e72e38c +--- /dev/null ++++ b/src/ipa/dcmipp/data/imx335_judge2_light_box.yaml +@@ -0,0 +1,54 @@ ++# Copyright (c) 2025 STMicroelectronics. ++# All rights reserved. ++# ++# This software is licensed under SLA0044 terms that can be found here: ++# https://www.st.com/resource/en/license_agreement/SLA0044.txt ++# ++# imx335 configuration file for the STM32 dcmipp IPA. ++# Tuned with the Mini Light Box ++# ++ ++%YAML 1.1 ++--- ++version: 1 ++algorithms: ++ - Aec: ++ AeEnable: true ++ AntiFlickerFreq: 0 ++ ExposureValue: 0.0 ++ SensorDelay: 3 ++ - Awb: ++ FixedGainEnable: true ++ FixedGainR: 1.77 ++ FixedGainG: 1.0 ++ FixedGainB: 2.35 ++ FixedCconvEnable: true ++ FixedCconv: [155134500, -69370000, 13106000, -38671000, 167689800, -33936000, 5546200, -66769999, 159944200] ++ AwbEnable: true ++ ProfileName: ["JudegeII-A", "JudegeII-TL84", "JudgeII-D65", "Free slot", "Free slot"] ++ RefColorTemp: [2810, 4015, 6650, 0, 0] ++ GainR: [137000000, 182000000, 244000000, 0, 0] ++ GainG: [100000000, 100000000, 100000000, 0, 0] ++ GainB: [287000000, 212000000, 143000000, 0, 0] ++ Cconv: [159760000, -9780000, -49990000, -45530000, 171540000, -26000000, -3300000, -110120000, 213430000, 164670000, -20970000, -43700000, -51330000, 178670000, -27339999, -12490000, -48170000, 160670000, 150570000, 2440000, -53010000, -37350000, 193760000, -56420000, -11100000, -35490000, 146590000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ++ - BadPixel: ++ Enable: false ++ Strength: 0 ++ Threhsold: 0 ++ - BlackLevelCorrection: ++ Enable: true ++ Level: [12, 12, 12] ++ - Contrast: ++ Enable: false ++ LuminanceFactor: [100, 100, 100, 100, 100, 100, 100, 100, 100] ++ - Demosaicing: ++ Enable: true ++ Filter: [2, 4, 4, 6] ++ - Statistic: ++ Area: [648, 486, 1296, 972] ++ Profile: 2 ++ - GammaCorrection: ++ Enable: true ++# NOTE : parameters of 'statRemoval' are not handled in libcamera ++# NOTE : parameters of 'decimation' are not handled in libcamera ++# NOTE : parameter 'demosaicing.type' is not handled in libcamera +diff --git a/src/ipa/dcmipp/data/imx335_mini_light_box.yaml b/src/ipa/dcmipp/data/imx335_mini_light_box.yaml +new file mode 100644 +index 00000000..11f1949d +--- /dev/null ++++ b/src/ipa/dcmipp/data/imx335_mini_light_box.yaml +@@ -0,0 +1,54 @@ ++# Copyright (c) 2025 STMicroelectronics. ++# All rights reserved. ++# ++# This software is licensed under SLA0044 terms that can be found here: ++# https://www.st.com/resource/en/license_agreement/SLA0044.txt ++# ++# imx335 configuration file for the STM32 dcmipp IPA. ++# Tuned with the Mini Light Box ++# ++ ++%YAML 1.1 ++--- ++version: 1 ++algorithms: ++ - Aec: ++ AeEnable: true ++ AntiFlickerFreq: 0 ++ ExposureValue: 0.0 ++ SensorDelay: 3 ++ - Awb: ++ FixedGainEnable: true ++ FixedGainR: 1.77 ++ FixedGainG: 1.0 ++ FixedGainB: 2.35 ++ FixedCconvEnable: true ++ FixedCconv: [155134500, -69370000, 13106000, -38671000, 167689800, -33936000, 5546200, -66769999, 159944200] ++ AwbEnable: true ++ ProfileName: ["MiniLBox A", "MiniLBox TL84", "MiniLBox D65", "Free slot", "Free slot"] ++ RefColorTemp: [2665, 3750, 6140, 0, 0] ++ GainR: [126000000, 157000000, 210000000, 0, 0] ++ GainG: [100000000, 100000000, 100000000, 0, 0] ++ GainB: [279000000, 199000000, 155000000, 0, 0] ++ Cconv: [277500000, -75420000, -46310000, -91640000, 272360000, -29450000, -1060000, -126200000, 334070000, 178510000, -54460000, -19030000, -46390000, 162010000, -21660000, 1520000, -56399999, 168130000, 176680000, -60550000, -15590000, -33130000, 138950000, -21970000, -1080000, -40140000, 135020000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ++ - BadPixel: ++ Enable: false ++ Strength: 0 ++ Threhsold: 0 ++ - BlackLevelCorrection: ++ Enable: true ++ Level: [12, 12, 12] ++ - Contrast: ++ Enable: false ++ LuminanceFactor: [100, 100, 100, 100, 100, 100, 100, 100, 100] ++ - Demosaicing: ++ Enable: true ++ Filter: [2, 4, 4, 6] ++ - Statistic: ++ Area: [648, 486, 1296, 972] ++ Profile: 2 ++ - GammaCorrection: ++ Enable: true ++# NOTE : parameters of 'statRemoval' are not handled in libcamera ++# NOTE : parameters of 'decimation' are not handled in libcamera ++# NOTE : parameter 'demosaicing.type' is not handled in libcamera +diff --git a/src/ipa/dcmipp/data/meson.build b/src/ipa/dcmipp/data/meson.build +new file mode 100644 +index 00000000..2a4f455c +--- /dev/null ++++ b/src/ipa/dcmipp/data/meson.build +@@ -0,0 +1,9 @@ ++# SPDX-License-Identifier: CC0-1.0 ++ ++conf_files = files([ ++ 'imx335.yaml', ++]) ++ ++install_data(conf_files, ++ install_dir : ipa_data_dir / 'dcmipp', ++ install_tag : 'runtime') +diff --git a/src/ipa/dcmipp/dcmipp.cpp b/src/ipa/dcmipp/dcmipp.cpp +new file mode 100644 +index 00000000..9aa30cd1 +--- /dev/null ++++ b/src/ipa/dcmipp/dcmipp.cpp +@@ -0,0 +1,567 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * dcmipp.cpp - STM32 DCMIPP Image Processing Algorithm module ++ */ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++ ++#include "libcamera/internal/mapped_framebuffer.h" ++#include "libcamera/internal/yaml_parser.h" ++ ++#include "algorithms/algorithm.h" ++#include "libipa/camera_sensor_helper.h" ++#include "linux/stm32-dcmipp-config.h" ++ ++#include "ipa_context.h" ++#include "module.h" ++ ++/* ++* DCMIPP driver doesn't export (yet) the postproc Gamma control CID macro ++* hence define it here instead ++* TODO: to be removed once the V4L2_CID is exported by the kernel ++*/ ++#ifndef V4L2_CID_PIXELPROC_GAMMA_CORRECTION ++#define V4L2_CID_PIXELPROC_GAMMA_CORRECTION (V4L2_CID_USER_BASE | 0x1001) ++#endif ++ ++namespace libcamera { ++ ++LOG_DEFINE_CATEGORY(IPADcmipp) ++ ++namespace ipa::dcmipp { ++ ++class IPADcmipp : public IPADcmippInterface, public Module ++{ ++public: ++ IPADcmipp(); ++ ++ int init(const IPASettings &settings, unsigned int hwRevision, ++ const IPACameraSensorInfo &sensorInfo, const ControlInfoMap &sensorControls, ++ ControlInfoMap *ipaControls) override; ++ ++ int start() override; ++ void stop() override; ++ ++ int configure(const IPACameraSensorInfo &sensorInfo, const ControlInfoMap &sensorControls, ++ uint32_t decimation, ControlInfoMap *ipaControls) override; ++ ++ void mapBuffers(const std::vector &buffers) override; ++ void unmapBuffers(const std::vector &ids) override; ++ ++ void processStatsBuffer(uint32_t frame, uint32_t bufferId) override; ++ void fillParamsBuffer(uint32_t frame, uint32_t bufferId) override; ++ void queueRequest(uint32_t frame, const ControlList &controls) override; ++ ++protected: ++ std::string logPrefix() const override; ++ ++private: ++ float linearTodB(float gain); ++ float dBToLinear(float gain); ++ void convertControls(ControlList &controls, ControlList &v4l2Controls); ++ void setSensorProperties(const IPACameraSensorInfo &sensorInfo, ++ const ControlInfoMap &sensorControls); ++ void updateControls(ControlInfoMap *ipaControls); ++ void logConfig(struct stm32_dcmipp_params_cfg *isp_params, ControlList &sensorControls, ++ ControlList &ispControls); ++ float exposureFactor(struct stm32_dcmipp_isp_ex_cfg *exp, int comp); ++ float cconvCoeff(__u16 reg); ++ ++ std::map buffers_; ++ std::map mappedBuffers_; ++ ++ ControlInfoMap sensorControls_; ++ ++ std::unique_ptr camHelper_; ++ ++ struct IPAContext context_; ++ struct IPAFrameContext frameContext_; /* not used, kept for compatibility with module */ ++}; ++ ++IPADcmipp::IPADcmipp() ++ : context_({}) ++{ ++} ++ ++std::string IPADcmipp::logPrefix() const ++{ ++ return "DCMIPP"; ++} ++ ++int IPADcmipp::init(const IPASettings &settings, unsigned int hwRevision, ++ const IPACameraSensorInfo &sensorInfo, const ControlInfoMap &sensorControls, ++ ControlInfoMap *ipaControls) ++{ ++ LOG(IPADcmipp, Debug) << __func__; ++ ++ context_ = {}; ++ ++ context_.info.hwRevision = hwRevision; ++ sensorControls_ = sensorControls; ++ camHelper_ = CameraSensorHelperFactoryBase::create(settings.sensorModel); ++ if (!camHelper_) ++ LOG(IPADcmipp, Warning) << "No camera sensor helper for " << settings.sensorModel; ++ ++ /* Get sensor exposure/time properties */ ++ setSensorProperties(sensorInfo, sensorControls); ++ ++ /* Load and parse the tuning data file */ ++ if (!settings.configurationFile.empty()) { ++ LOG(IPADcmipp, Debug) << "Parsing IPA settings from " << settings.configurationFile; ++ File file(settings.configurationFile); ++ if (!file.open(File::OpenModeFlag::ReadOnly)) { ++ int ret = file.error(); ++ LOG(IPADcmipp, Error) << "Failed to open " << settings.configurationFile << ": " ++ << strerror(-ret); ++ return ret; ++ } ++ ++ std::unique_ptr data = YamlParser::parse(file); ++ if (!data) ++ return -EINVAL; ++ int ret = createAlgorithms(context_, (*data)["algorithms"]); ++ if (ret) ++ return ret; ++ } ++ ++ /* Set controls supported by the algorithms */ ++ updateControls(ipaControls); ++ ++ return 0; ++} ++ ++int IPADcmipp::start() ++{ ++ LOG(IPADcmipp, Debug) << __func__; ++ ++ /* Apply the sensors settings before capturing the first frame */ ++ ControlList v4l2SensorControls(sensorControls_), sensorControls; ++ sensorControls.set(controls::draft::AnalogueGain_dB, context_.sensor.gain); ++ sensorControls.set(controls::ExposureTime, context_.sensor.exposure); ++ convertControls(sensorControls, v4l2SensorControls); ++ setSensorControls.emit(0, v4l2SensorControls); ++ ++ return 0; ++} ++ ++void IPADcmipp::stop() ++{ ++ LOG(IPADcmipp, Debug) << __func__; ++} ++ ++int IPADcmipp::configure(const IPACameraSensorInfo &sensorInfo, ++ const ControlInfoMap &sensorControls, ++ uint32_t decimation, ++ ControlInfoMap *ipaControls) ++{ ++ LOG(IPADcmipp, Debug) << __func__; ++ ++ /* Get sensor exposure/time properties */ ++ setSensorProperties(sensorInfo, sensorControls); ++ ++ /* Configure algorithms */ ++ for (auto const &algo : algorithms()) { ++ int ret = algo->configure(context_, sensorInfo); ++ if (ret) { ++ LOG(IPADcmipp, Error) << "Failed to configure algorithm: " << strerror(ret); ++ return ret; ++ } ++ } ++ ++ context_.isp.decimationRatio = decimation; ++ context_.info.sensorBitsPerPixel = sensorInfo.bitsPerPixel; ++ ++ /* Update the camera controls using the new sensor settings. */ ++ updateControls(ipaControls); ++ ++ return 0; ++} ++ ++void IPADcmipp::mapBuffers(const std::vector &buffers) ++{ ++ LOG(IPADcmipp, Debug) << __func__; ++ ++ for (const IPABuffer &buffer : buffers) { ++ auto elem = buffers_.emplace(std::piecewise_construct, ++ std::forward_as_tuple(buffer.id), ++ std::forward_as_tuple(buffer.planes)); ++ const FrameBuffer &fb = elem.first->second; ++ ++ MappedFrameBuffer mappedBuffer(&fb, MappedFrameBuffer::MapFlag::ReadWrite); ++ if (!mappedBuffer.isValid()) ++ LOG(IPADcmipp, Error) << "Failed to mmap buffer: " << strerror(mappedBuffer.error()); ++ ++ mappedBuffers_.emplace(buffer.id, std::move(mappedBuffer)); ++ } ++} ++ ++void IPADcmipp::unmapBuffers(const std::vector &ids) ++{ ++ LOG(IPADcmipp, Debug) << __func__; ++ ++ for (unsigned int id : ids) { ++ const auto fb = buffers_.find(id); ++ if (fb == buffers_.end()) ++ continue; ++ ++ mappedBuffers_.erase(id); ++ buffers_.erase(id); ++ } ++} ++ ++void IPADcmipp::queueRequest(uint32_t frame, const ControlList &controls) ++{ ++ LOG(IPADcmipp, Debug) << __func__ << " frame: " << frame; ++ ++ /* Send request to algorithms */ ++ for (auto const &algo : algorithms()) ++ algo->queueRequest(context_, frame, frameContext_, controls); ++} ++ ++void IPADcmipp::processStatsBuffer(uint32_t frame, uint32_t bufferId) ++{ ++ LOG(IPADcmipp, Debug) << __func__ << " frame: " << frame << " bufferId: " << bufferId; ++ ++ /* Check bufferId validity */ ++ auto it = buffers_.find(bufferId); ++ if (it == buffers_.end()) { ++ LOG(IPADcmipp, Error) << "Could not find stats buffer"; ++ return; ++ } ++ ++ /* Get buffer */ ++ struct stm32_dcmipp_stat_buf *stats = reinterpret_cast( ++ mappedBuffers_.at(bufferId).planes()[0].data()); ++ ++ /* Ask algo to process stats */ ++ LOG(IPADcmipp, Debug) << "Calling algo process"; ++ ControlList metadata; ++ for (auto const &algo : algorithms()) ++ algo->process(context_, frame, frameContext_, stats, metadata); ++ ++ /* Add additional information */ ++ metadata.set(controls::draft::IspDecimationRatio, context_.isp.decimationRatio); ++ metadata.set(controls::draft::SensorBitsPerPixel, context_.info.sensorBitsPerPixel); ++ metadata.set(controls::draft::PipelineHwRevision, context_.info.hwRevision); ++ ++ /* Send metadata (controls) */ ++ metadataReady.emit(frame, metadata); ++ ++ /* Inform that the buffer can be freed now */ ++ statsBufferProcessed.emit(bufferId); ++} ++ ++void IPADcmipp::fillParamsBuffer(uint32_t frame, uint32_t bufferId) ++{ ++ LOG(IPADcmipp, Debug) << __func__ << " frame: " << frame << " bufferId: " << bufferId; ++ ++ /* Check bufferId validity */ ++ auto it = buffers_.find(bufferId); ++ if (it == buffers_.end()) { ++ LOG(IPADcmipp, Error) << "Could not find parameter buffer"; ++ return; ++ } ++ ++ /* Get buffer */ ++ struct stm32_dcmipp_params_cfg *isp_params = reinterpret_cast( ++ mappedBuffers_.at(bufferId).planes()[0].data()); ++ ++ /* Ask algo to provide new configuration */ ++ ControlList ispControls, sensorControls; ++ memset(isp_params, 0, sizeof(struct stm32_dcmipp_params_cfg)); ++ ++ LOG(IPADcmipp, Debug) << "Calling algo prepare"; ++ for (auto const &a : algorithms()) { ++ Algorithm *algo = static_cast(a.get()); ++ algo->prepare(context_, frame, frameContext_, isp_params, sensorControls, ispControls); ++ } ++ ++ /* Log new isp and sensor config */ ++ logConfig(isp_params, sensorControls, ispControls); ++ ++ /* Inform that the sensor config can be applied */ ++ ControlList v4l2SensorControls(sensorControls_); ++ convertControls(sensorControls, v4l2SensorControls); ++ setSensorControls.emit(0, v4l2SensorControls); ++ ++ /* Inform that the buffer can be applied for ISP HW update (optional v4l2 ctrl) */ ++ if (!ispControls.empty()) { ++ /* Convert and split into two lists: an ISP one and a Postproc (Gamma) one */ ++ ControlList v4l2Controls, v4l2IspControls, v4l2PostprocControls; ++ convertControls(ispControls, v4l2Controls); ++ for (const auto &control : v4l2Controls) { ++ if (control.first != V4L2_CID_PIXELPROC_GAMMA_CORRECTION) ++ v4l2IspControls.set(control.first, control.second); ++ else ++ v4l2PostprocControls.set(control.first, control.second); ++ } ++ if (!v4l2IspControls.empty()) ++ setIspControls.emit(0, v4l2IspControls); ++ if (!v4l2PostprocControls.empty()) ++ setPostprocControls.emit(0, v4l2PostprocControls); ++ } ++ ++ /* Inform that the buffer can be applied for ISP HW update (buff params) */ ++ paramsBufferReady.emit(bufferId); ++} ++ ++float IPADcmipp::linearTodB(float gain) ++{ ++ return 20 * std::log10(gain); ++} ++ ++float IPADcmipp::dBToLinear(float gain) ++{ ++ return std::pow(10, gain / 20); ++} ++ ++void IPADcmipp::convertControls(ControlList &controls, ControlList &v4l2Controls) ++{ ++ /* Converts exposure to V4L2 control unit (number of lines) */ ++ const auto &exposure = controls.get(controls::ExposureTime); ++ if (exposure) ++ v4l2Controls.set(V4L2_CID_EXPOSURE, (int32_t)(*exposure / context_.info.sensorLineDuration_us)); ++ ++ /* Converts gain to V4L2 control unit (eg 0.3 dB step for IMX335 sensor) */ ++ const auto &gain = controls.get(controls::draft::AnalogueGain_dB); ++ if (gain && camHelper_) { ++ float gainLinear = dBToLinear(*gain); ++ v4l2Controls.set(V4L2_CID_ANALOGUE_GAIN, (int32_t)(camHelper_->gainCode(gainLinear))); ++ } ++ ++ /* Converts statistic area */ ++ const auto &area = controls.get(controls::draft::StatisticArea); ++ if (area) { ++ struct v4l2_ctrl_isp_stat_region region; ++ ++ region.nb_regions = 1; ++ region.top[0] = area->y / context_.isp.decimationRatio; ++ region.left[0] = area->x / context_.isp.decimationRatio; ++ region.width[0] = area->width / context_.isp.decimationRatio; ++ region.height[0] = area->height / context_.isp.decimationRatio; ++ ++ ControlValue c(Span{ reinterpret_cast(®ion), sizeof(region) }); ++ v4l2Controls.set(V4L2_CID_ISP_STAT_REGION, c); ++ } ++ ++ /* Converts statistic profile */ ++ const auto &profile = controls.get(controls::draft::StatisticProfile); ++ if (profile) ++ v4l2Controls.set(V4L2_CID_ISP_STAT_PROFILE, *profile); ++ ++ /* Converts gamma correction */ ++ const auto &gamma = controls.get(controls::draft::GammaCorrectionEnable); ++ if (gamma) ++ v4l2Controls.set(V4L2_CID_PIXELPROC_GAMMA_CORRECTION, (int32_t)*gamma); ++} ++ ++void IPADcmipp::setSensorProperties(const IPACameraSensorInfo &sensorInfo, ++ const ControlInfoMap &sensorControls) ++{ ++ /* Compute sensor exposure time properties */ ++ const ControlInfo &v4l2Exposure = sensorControls.find(V4L2_CID_EXPOSURE)->second; ++ double lineDuration_us = sensorInfo.minLineLength / (sensorInfo.pixelRate / 1000000.0f); ++ context_.info.sensorLineDuration_us = lineDuration_us; ++ context_.info.sensorExposureMin = v4l2Exposure.min().get() * lineDuration_us; ++ context_.info.sensorExposureMax = v4l2Exposure.max().get() * lineDuration_us; ++ context_.info.sensorExposureDef = v4l2Exposure.def().get() * lineDuration_us; ++ ++ /* Compute sensor analogue gain properties */ ++ if (camHelper_) { ++ const ControlInfo &v4l2Gain = sensorControls.find(V4L2_CID_ANALOGUE_GAIN)->second; ++ context_.info.sensorGainMin = linearTodB(camHelper_->gain(v4l2Gain.min().get())); ++ context_.info.sensorGainMax = linearTodB(camHelper_->gain(v4l2Gain.max().get())); ++ context_.info.sensorGainDef = linearTodB(camHelper_->gain(v4l2Gain.def().get())); ++ } ++ ++ /* Compute frame duration properties */ ++ const ControlInfo &v4l2HBlank = sensorControls.find(V4L2_CID_HBLANK)->second; ++ const ControlInfo &v4l2VBlank = sensorControls.find(V4L2_CID_VBLANK)->second; ++ ++ uint32_t hblank = v4l2HBlank.def().get(); ++ uint32_t lineLength = sensorInfo.outputSize.width + hblank; ++ uint32_t sizeHeight = sensorInfo.outputSize.height; ++ ++ uint64_t minFrameSize = (uint64_t)(v4l2VBlank.min().get() + sizeHeight) * lineLength; ++ uint64_t maxFrameSize = (uint64_t)(v4l2VBlank.max().get() + sizeHeight) * lineLength; ++ uint64_t defFrameSize = (uint64_t)(v4l2VBlank.def().get() + sizeHeight) * lineLength; ++ ++ context_.info.frameDurationsMin = minFrameSize / (sensorInfo.pixelRate / 1000000U); ++ context_.info.frameDurationsMax = maxFrameSize / (sensorInfo.pixelRate / 1000000U); ++ context_.info.frameDurationsDef = defFrameSize / (sensorInfo.pixelRate / 1000000U); ++} ++ ++void IPADcmipp::updateControls(ControlInfoMap *ipaControls) ++{ ++ ControlInfoMap::Map ctrlMap = context_.dcmippControls; ++ ++ /* Add the frame duration limits */ ++ ctrlMap.emplace(std::piecewise_construct, ++ std::forward_as_tuple(&controls::FrameDurationLimits), ++ std::forward_as_tuple(context_.info.frameDurationsMin, ++ context_.info.frameDurationsMax, ++ context_.info.frameDurationsDef)); ++ ++ *ipaControls = ControlInfoMap(std::move(ctrlMap), controls::controls); ++} ++ ++void IPADcmipp::logConfig(struct stm32_dcmipp_params_cfg *p, ControlList &sensorControls, ++ ControlList &ispControls) ++{ ++ if (p->module_cfg_update & STM32_DCMIPP_ISP_BPR) ++ LOG(IPADcmipp, Debug) << "ISP update - BAD PIXEL: " ++ << (p->ctrls.bpr_cfg.en ? "enabled" : "disabled") << " (" ++ << p->ctrls.bpr_cfg.strength << ")"; ++ ++ if (p->module_cfg_update & STM32_DCMIPP_ISP_BLC) ++ LOG(IPADcmipp, Debug) << "ISP update - BLACK LEVEL: " ++ << (p->ctrls.blc_cfg.en ? "enabled" : "disabled") << " (" ++ << (int)p->ctrls.blc_cfg.blc_r << " / " ++ << (int)p->ctrls.blc_cfg.blc_g << " / " ++ << (int)p->ctrls.blc_cfg.blc_b << ")"; ++ ++ if (p->module_cfg_update & STM32_DCMIPP_ISP_EX) ++ LOG(IPADcmipp, Debug) << "ISP update - EXPOSURE: " ++ << (p->ctrls.ex_cfg.en ? "enabled" : "disabled") << " (" ++ << "R x" << exposureFactor(&p->ctrls.ex_cfg, 0) << " /" ++ << "G x" << exposureFactor(&p->ctrls.ex_cfg, 1) << " /" ++ << "B x" << exposureFactor(&p->ctrls.ex_cfg, 2) << ")"; ++ ++ if (p->module_cfg_update & STM32_DCMIPP_ISP_CC) ++ LOG(IPADcmipp, Debug) << "ISP update - COLOR CONVERSION: " ++ << (p->ctrls.cc_cfg.en ? "enabled" : "disabled") << " (" ++ << " (" << cconvCoeff(p->ctrls.cc_cfg.rr) ++ << " , " << cconvCoeff(p->ctrls.cc_cfg.rg) ++ << " , " << cconvCoeff(p->ctrls.cc_cfg.rb) ++ << ") , (" << cconvCoeff(p->ctrls.cc_cfg.gr) ++ << " , " << cconvCoeff(p->ctrls.cc_cfg.gg) ++ << " , " << cconvCoeff(p->ctrls.cc_cfg.gb) ++ << ") , (" << cconvCoeff(p->ctrls.cc_cfg.br) ++ << " , " << cconvCoeff(p->ctrls.cc_cfg.bg) ++ << " , " << cconvCoeff(p->ctrls.cc_cfg.bb) << ")"; ++ ++ if (p->module_cfg_update & STM32_DCMIPP_ISP_DM) ++ LOG(IPADcmipp, Debug) << "ISP update - DEMOSAICING: " ++ << (p->ctrls.dm_cfg.en ? "enabled" : "disabled") << " (" ++ << (int)p->ctrls.dm_cfg.edge << " / " ++ << (int)p->ctrls.dm_cfg.lineh << " / " ++ << (int)p->ctrls.dm_cfg.linev << " / " ++ << (int)p->ctrls.dm_cfg.peak; ++ ++ if (p->module_cfg_update & STM32_DCMIPP_ISP_CE) ++ LOG(IPADcmipp, Debug) << "ISP update - CONTRAST: " ++ << (p->ctrls.ce_cfg.en ? "enabled" : "disabled") << " (" ++ << (float)p->ctrls.ce_cfg.lum[0] / 16 << ", " ++ << (float)p->ctrls.ce_cfg.lum[1] / 16 << ", " ++ << (float)p->ctrls.ce_cfg.lum[2] / 16 << ", " ++ << (float)p->ctrls.ce_cfg.lum[3] / 16 << ", " ++ << (float)p->ctrls.ce_cfg.lum[4] / 16 << ", " ++ << (float)p->ctrls.ce_cfg.lum[5] / 16 << ", " ++ << (float)p->ctrls.ce_cfg.lum[6] / 16 << ", " ++ << (float)p->ctrls.ce_cfg.lum[7] / 16 << ", " ++ << (float)p->ctrls.ce_cfg.lum[8] / 16 << ")"; ++ ++ /* ISP control updates */ ++ const auto &area = ispControls.get(controls::draft::StatisticArea); ++ if (area) ++ LOG(IPADcmipp, Debug) << "ISP update - STAT AREA: (" ++ << area->width << " x " ++ << area->height << ") @ (" ++ << area->x << ", " ++ << area->y << ")"; ++ ++ const auto &profile = ispControls.get(controls::draft::StatisticProfile); ++ if (profile) ++ LOG(IPADcmipp, Debug) << "ISP update - STAT PROFILE: " << *profile; ++ ++ const auto &gamma = ispControls.get(controls::draft::GammaCorrectionEnable); ++ if (gamma) ++ LOG(IPADcmipp, Debug) << "ISP update - GAMMA: " ++ << (*gamma ? "enabled" : "disabled"); ++ ++ /* Sensor Updates (exposure and gain) */ ++ const auto &exposure = sensorControls.get(controls::ExposureTime); ++ if (exposure) ++ LOG(IPADcmipp, Debug) << "SENSOR update - EXPOSURE: " << *exposure << " us"; ++ ++ const auto &gain = sensorControls.get(controls::draft::AnalogueGain_dB); ++ if (gain) ++ LOG(IPADcmipp, Debug) << "SENSOR update - GAIN: " << *gain << " dB"; ++} ++ ++float IPADcmipp::exposureFactor(struct stm32_dcmipp_isp_ex_cfg *exp, int comp) ++{ ++ /* Convert Shift + Multiplier to Factor */ ++ uint32_t shift, mult; ++ ++ switch (comp) { ++ default: ++ case 0: ++ shift = exp->shift_r; ++ mult = exp->mult_r; ++ break; ++ case 1: ++ shift = exp->shift_g; ++ mult = exp->mult_g; ++ break; ++ case 2: ++ shift = exp->shift_b; ++ mult = exp->mult_b; ++ break; ++ } ++ float factor = 1 << shift; ++ factor = (factor * mult) / 128; ++ return factor; ++} ++ ++float IPADcmipp::cconvCoeff(__u16 reg) ++{ ++ /* Convert from register format to float format */ ++ float coeff; ++ ++ if (reg & 0x400) { ++ int32_t val = reg; ++ val = (val - 1) ^ 0x7FF; ++ coeff = -(float)val / 256; ++ } else { ++ coeff = (float)reg / 256; ++ } ++ ++ return coeff; ++} ++ ++} /* namespace ipa::dcmipp */ ++ ++/* ++ * External IPA module interface ++ */ ++ ++extern "C" { ++const struct IPAModuleInfo ipaModuleInfo = { ++ IPA_MODULE_API_VERSION, ++ 0, ++ "dcmipp", ++ "dcmipp", ++}; ++ ++IPAInterface *ipaCreate() ++{ ++ LOG(IPADcmipp, Debug) << __func__; ++ ++ return new ipa::dcmipp::IPADcmipp(); ++} ++} ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/ipa_context.h b/src/ipa/dcmipp/ipa_context.h +new file mode 100644 +index 00000000..3a826f1c +--- /dev/null ++++ b/src/ipa/dcmipp/ipa_context.h +@@ -0,0 +1,132 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * ipa_context.h - STM32 DCMIPP IPA Context ++ */ ++ ++#pragma once ++ ++#include ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp { ++ ++static constexpr unsigned int kNbContrastFactor = 9; ++ ++/* Sensor config */ ++struct IPASensor { ++ double gain; /* Analogue gain in dB */ ++ int32_t exposure; /* Exposure time in microseconds */ ++}; ++ ++/* ISP Statistic */ ++struct IPAIspStatistic { ++ struct { /* Coordinates */ ++ uint32_t x0; ++ uint32_t y0; ++ uint32_t xSize; ++ uint32_t ySize; ++ } area; ++ uint32_t profile; /* Reported Stats (0:Full 1:AvgUp 2:AvgDown) */ ++}; ++ ++/* ISP Bad pixel */ ++struct IPAIspBadpixel { ++ uint8_t enable; /* Enable or disable */ ++ uint8_t strength; /* Strength of the bad pixel removal algorithm */ ++}; ++ ++/* ISP Black Level */ ++struct IPAIspBlackLevel { ++ uint8_t enable; /* Enable or disable */ ++ uint8_t blcR; /* Level offset for the red component */ ++ uint8_t blcG; /* Level offset for the green component */ ++ uint8_t blcB; /* Level offset for the blue component */ ++}; ++ ++/* ISP Demosaicing */ ++struct IPAIspDemosaicing { ++ uint8_t enable; /* Enable or disable */ ++ uint8_t edge; /* Edge detection strength */ ++ uint8_t lineh; /* Horizontal line detection strength */ ++ uint8_t linev; /* Vertical line detection strength */ ++ uint8_t peak; /* Peak detection strength */ ++}; ++ ++/* ISP Contrast */ ++struct IPAIspContrast { ++ uint8_t enable; /* Enable or disable */ ++ uint32_t coeff[kNbContrastFactor]; /* Luminance amplification factor. Unit = 100 for "x1.0" */ ++}; ++ ++/* ISP Gain ('exposure') */ ++struct IPAIspGain { ++ uint8_t enable; /* Enable or disable */ ++ uint32_t gainR; /* Gain of the red component. Unit = 100000000 for "x1.0", 150000000 for "x1.5". Max gain is "x16" */ ++ uint32_t gainG; /* Gain of the green component */ ++ uint32_t gainB; /* Gain of the blue component */ ++}; ++ ++/* ISP Color Conversion */ ++struct IPAIspColorConv { ++ uint8_t enable; /* Enable or disable */ ++ int32_t coeff[3][3]; /* 3x3 RGB to RGB matrix coefficients. Unit = 100000000 for "x1.0", -150000000 for "x-1.5". Range is "x-4.0" to "x4.0" */ ++}; ++ ++/* ISP / PostProc Gamma Correction */ ++struct IPAIspGammaCorrection { ++ uint8_t enable; /* Enable or disable */ ++}; ++ ++/* IPA context */ ++struct IPAContext { ++ /* ISP config */ ++ struct IPAIsp { ++ struct IPAIspStatistic statistic; ++ struct IPAIspBadpixel badpixel; ++ struct IPAIspBlackLevel blackLevel; ++ struct IPAIspDemosaicing demosaicing; ++ struct IPAIspContrast contrast; ++ struct IPAIspGain gain; ++ struct IPAIspColorConv cconv; ++ struct IPAIspGammaCorrection gamma; ++ uint32_t decimationRatio; ++ } isp; ++ ++ /* Sensor config */ ++ struct IPASensor sensor; ++ ++ /* General information */ ++ struct IPAInfo { ++ uint8_t AECEnable; /* AEC algo enable or disable */ ++ uint32_t AECExposureTarget; /* AEC Exposure Target */ ++ uint8_t AWBEnable; /* AWB algo enable or disable */ ++ uint32_t CCT; /* Estimated Correlated Color Temperature */ ++ int32_t ispStatLatency; /* Nb of Vsync to get stats after ISP update */ ++ uint32_t sensorBitsPerPixel; /* Nb of bpp from the sensor */ ++ uint32_t hwRevision; /* DCMIPP HW version */ ++ double sensorGainMin; /* Sensor min analogue gain in dB */ ++ double sensorGainMax; /* Sensor max analogue gain in dB */ ++ double sensorGainDef; /* Sensor default analogue gain in dB */ ++ double sensorLineDuration_us; /* Sensor line duration in microseconds */ ++ int32_t sensorExposureMin; /* Sensor min exposure time in microseconds */ ++ int32_t sensorExposureMax; /* Sensor max exposure time in microseconds */ ++ int32_t sensorExposureDef; /* Sensor default exposure time in microseconds */ ++ int64_t frameDurationsMin; /* Min frame duration in microseconds */ ++ int64_t frameDurationsMax; /* Max frame duration in microseconds */ ++ int64_t frameDurationsDef; /* Default frame duration in microseconds */ ++ } info; ++ ++ /* Supported controls */ ++ ControlInfoMap::Map dcmippControls; ++}; ++ ++/* Frame context, not used for the time being. Declaration required to use module */ ++struct IPAFrameContext { ++}; ++ ++} /* namespace ipa::dcmipp */ ++ ++} /* namespace libcamera */ +diff --git a/src/ipa/dcmipp/meson.build b/src/ipa/dcmipp/meson.build +new file mode 100644 +index 00000000..911372d0 +--- /dev/null ++++ b/src/ipa/dcmipp/meson.build +@@ -0,0 +1,39 @@ ++# SPDX-License-Identifier: CC0-1.0 ++ ++subdir('algorithms') ++subdir('data') ++ ++ipa_name = 'ipa_dcmipp' ++ ++dcmipp_ipa_sources = files([ ++ 'dcmipp.cpp', ++]) ++ ++dcmipp_ipa_sources += dcmipp_ipa_algorithms ++ ++dcmipp_cpp_arguments = [] ++ ++if get_option('evision_algo') ++ dcmipp_cpp_arguments += ['-DEVISION_ALGO_ENABLED'] ++endif ++ ++mod = shared_module(ipa_name, ++ [dcmipp_ipa_sources, libcamera_generated_ipa_headers], ++ name_prefix : '', ++ include_directories : [ipa_includes, libipa_includes], ++ dependencies : libcamera_private, ++ cpp_args : dcmipp_cpp_arguments, ++ link_with : libipa, ++ install : true, ++ install_dir : ipa_install_dir) ++ ++if ipa_sign_module ++ custom_target(ipa_name + '.so.sign', ++ input : mod, ++ output : ipa_name + '.so.sign', ++ command : [ipa_sign, ipa_priv_key, '@INPUT@', '@OUTPUT@'], ++ install : false, ++ build_by_default : true) ++endif ++ ++ipa_names += ipa_name +diff --git a/src/ipa/dcmipp/module.h b/src/ipa/dcmipp/module.h +new file mode 100644 +index 00000000..2faecf85 +--- /dev/null ++++ b/src/ipa/dcmipp/module.h +@@ -0,0 +1,27 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024 ST Microelectronics ++ * ++ * module.h - STM32 DCCMIPP IPA Module ++ */ ++ ++#pragma once ++ ++#include ++ ++#include ++ ++#include "linux/stm32-dcmipp-config.h" ++ ++#include "ipa_context.h" ++ ++namespace libcamera { ++ ++namespace ipa::dcmipp { ++ ++using Module = ipa::Module; ++ ++} /* namespace ipa::dcmipp */ ++ ++} /* namespace libcamera*/ +diff --git a/src/ipa/rpi/controller/rpi/alsc.cpp b/src/ipa/rpi/controller/rpi/alsc.cpp +index 961209ea..67029fc3 100644 +--- a/src/ipa/rpi/controller/rpi/alsc.cpp ++++ b/src/ipa/rpi/controller/rpi/alsc.cpp +@@ -496,8 +496,8 @@ void resampleCalTable(const Array2D &calTableIn, + * Precalculate and cache the x sampling locations and phases to save + * recomputing them on every row. + */ +- int *xLo = (int*)malloc(X), *xHi = (int*)malloc(X); +- double *xf = (double*)malloc(X); ++ int xLo[X], xHi[X]; ++ double xf[X]; + double scaleX = cameraMode.sensorWidth / + (cameraMode.width * cameraMode.scaleX); + double xOff = cameraMode.cropX / (double)cameraMode.sensorWidth; +@@ -539,9 +539,6 @@ void resampleCalTable(const Array2D &calTableIn, + *(out++) = above * (1 - yf) + below * yf; + } + } +- free(xf); +- free(xHi); +- free(xLo); + } + + /* Calculate chrominance statistics (R/G and B/G) for each region. */ +diff --git a/src/libcamera/control_ids_draft.yaml b/src/libcamera/control_ids_draft.yaml +index 9bef5bf1..f2993fcd 100644 +--- a/src/libcamera/control_ids_draft.yaml ++++ b/src/libcamera/control_ids_draft.yaml +@@ -227,4 +227,248 @@ controls: + value. All of the custom test patterns will be static (that is the + raw image must not vary from frame to frame). + ++ - AnalogueGain_dB: ++ type: float ++ description: | ++ Analogue gain value applied in the sensor device expressed in decibel. ++ The value of the control specifies the gain multiplier applied to all ++ colour channels. This value cannot be lower than 0.0. ++ ++ Setting this value means that it is now fixed and the AE algorithm may ++ not change it. Setting it back to a negative value returns it to the ++ control of the AE algorithm. ++ ++ - AeExposureTarget: ++ type: int32_t ++ description: | ++ Exposure target for the AE algorithm to use. ++ ++ - AntiFlickerFreq: ++ type: int32_t ++ description: | ++ Anti-flickering frequency for the AE algorithm to use. ++ ++ - ColourGains3Enable: ++ type: bool ++ description: | ++ ColourGains3 feature enable status. ++ ++ - ColourGains3: ++ type: int32_t ++ description: | ++ Gain values for the 3 colour channels, Red, Green and Blue in that ++ order. ++ Unit = 100000000 for "x1.0", 150000000 for "x1.5". ++ size: [3] ++ ++ - ColourCorrectionEnable: ++ type: bool ++ description: | ++ ColourCorrection feature enable status. ++ ++ - ColourCorrection: ++ type: int32_t ++ description: | ++ The 3x3 matrix that converts camera RGB to sRGB within the ++ imaging pipeline. This should describe the matrix that is used ++ after pixels have been white-balanced, but before any gamma ++ transformation. The 3x3 matrix is stored in conventional reading ++ order in an array of 9 values. ++ Unit = 100000000 for "x1.0", 150000000 for "x1.5". ++ size: [3,3] ++ ++ - AwbProfileName: ++ type: string ++ description: | ++ Array of AWB profile name (one entry per profile) used by the AWB ++ algorithm. ++ size: [5] ++ ++ - AwbCurrentProfileName: ++ type: string ++ description: Report the current profile name, for this frame. The ++ AwbCurrentProfileName control can only be returned in metadata. ++ ++ - AwbReferenceColorTemperature: ++ type: int32_t ++ description: | ++ Array of reference color tempeartures (one entry per profile) used by ++ the AWB algorithm. ++ size: [5] ++ ++ - AwbColourGains3: ++ type: int32_t ++ description: | ++ Array of ColourGains3 (one entry per profile) used by the AWB algorithm. ++ size: [5,3] ++ ++ - AwbColourCorrection: ++ type: int32_t ++ description: | ++ Array of ColourCorrection (one entry per profile) used by the AWB ++ algorithm. ++ size: [5,3,3] ++ ++ - AwbCustomColorTemperature: ++ type: int32_t ++ description: | ++ Color Temperature specifying a custom Awb mode. Must be a value of ++ AwbReferenceColorTemperature[]. ++ Applicable when AwbMode is set to AwbCustom. ++ ++ - BadPixelRemovalEnable: ++ type: bool ++ description: | ++ BadPixelRemoval feature enable status. ++ ++ - BadPixelRemovalStrength: ++ type: int32_t ++ description: | ++ Strength of the detection and correction artifacts generated by a bad ++ pixel on the sensor array. ++ If BadPixelRemovalThreshold is set to a positive value, then this ++ setting is under control of the BadPixelRemoval algorithm. ++ ++ - BadPixelRemovalThreshold: ++ type: int32_t ++ description: | ++ If set to a positive value, the BadPixelRemoval algorithm adjusts the ++ strength of detection so the amount of expected bad pixel corrected is ++ as close as possible to that threshold. ++ ++ - BadPixelRemovalCount: ++ type: int32_t ++ description: | ++ Report of the amount of bad components corrected. ++ ++ - BlackLevelCorrectionEnable: ++ type: bool ++ description: | ++ BlackLevelCorrection feature enable status. ++ ++ - BlackLevelCorrectionLevels: ++ type: int32_t ++ description: | ++ Black levels correction of the Red, Green and Blue colour channels, in ++ that order. ++ size: [3] ++ ++ - DemosaicingEnable: ++ type: bool ++ description: | ++ Demosaicing feature enable status. ++ ++ - DemosaicingFilter: ++ type: int32_t ++ description: | ++ Demosaicing filter parameters (strength of the detection) to adapt to ++ specific shapes in this order: Peak, Vertical line, Horizontal line, ++ Edge ++ size: [4] ++ ++ - ContrastLuminanceEnable: ++ type: bool ++ description: | ++ ContrastLuminance feature enable status. ++ ++ - ContrastLuminance: ++ type: int32_t ++ description: | ++ Luminance amplification factor table for preset luminance segments. ++ Entry 0 is for pixel with luminance of 0, entry 1 is for pixel with ++ luminance of 32, ..., entry 8 is for pixel with luminance of 256. ++ Unit = 100 for "x1.0", 150 for "x1.5". ++ size: [9] ++ ++ - IspDecimationRatio: ++ type: int32_t ++ description: | ++ ISP decimation ratio. This control can only be returned in metadata. ++ ++ - StatisticArea: ++ type: Rectangle ++ description: | ++ Area defining where the statistics are extracted within the frame. ++ If not defined, the statistics are extracted within the whole frame. ++ ++ - StatisticProfile: ++ type: int32_t ++ description: | ++ Defines which statistics are reported. ++ enum: ++ - name: Full ++ value: 0 ++ description: | ++ Bins and Average on Up and Down location are reported. The ISP needs ++ several VSYNC cycles to report such statistics. ++ - name: AverageUp ++ value: 1 ++ description: Only Average on Up location are reported (fast report). ++ - name: AverageDown ++ value: 2 ++ description: Only Average on Down location are reported (fast report). ++ ++ - StatisticAverageUp: ++ type: int32_t ++ description: | ++ Reported average value (from 0 to 255) measured at the up part of the ++ ISP pipeline. Red, Green, Blue colour channels and Luminance in that ++ order. ++ size: [4] ++ ++ - StatisticAverageDown: ++ type: int32_t ++ description: | ++ Reported average value (from 0 to 255) measured at the down part of the ++ ISP pipeline. Red, Green, Blue colour channels and Luminance in that ++ order. ++ size: [4] ++ ++ - StatisticBinsUp: ++ type: int32_t ++ description: | ++ Reported bins (number of pixels in one of the 12 ranges of luminance) ++ measured at the up part of the ISP pipeline. ++ size: [12] ++ ++ - StatisticBinsDown: ++ type: int32_t ++ description: | ++ Reported bins (number of pixels in one of the 12 ranges of luminance) ++ measured at the up part of the ISP pipeline. ++ size: [12] ++ ++ - SensorBitsPerPixel: ++ type: int32_t ++ description: | ++ Number of bits per pixel of the sensor. ++ This control can only be returned in metadata. ++ ++ - SensorDelay: ++ type: int32_t ++ description: | ++ Delay (in number of VSYNC) between the time a sensor control (gain or ++ exposure) is updated, and the time the frame is actually updated. ++ ++ - SensorDelayMeasure: ++ type: int32_t ++ description: | ++ Reported sensor delay measured by the IPA. -1 if the measure is not ++ available ++ ++ - DoSensorDelayMeasure: ++ type: bool ++ description: | ++ When set to True, order the IPA to perform the sensor delay measure ++ ++ - PipelineHwRevision: ++ type: int32_t ++ description: | ++ IPA hardware revision identifier. ++ ++ - GammaCorrectionEnable: ++ type: bool ++ description: | ++ GammaCorrection feature enable status. ++ + ... +diff --git a/src/libcamera/ipc_unixsocket.cpp b/src/libcamera/ipc_unixsocket.cpp +index 0163deed..75285b67 100644 +--- a/src/libcamera/ipc_unixsocket.cpp ++++ b/src/libcamera/ipc_unixsocket.cpp +@@ -8,7 +8,6 @@ + #include "libcamera/internal/ipc_unixsocket.h" + + #include +-#include + #include + #include + #include +@@ -248,8 +247,8 @@ int IPCUnixSocket::sendData(const void *buffer, size_t length, + iov[0].iov_base = const_cast(buffer); + iov[0].iov_len = length; + +- char *buf = (char*)malloc(CMSG_SPACE(num * sizeof(uint32_t))); +- memset((void*)buf, 0, sizeof(buf)); ++ char buf[CMSG_SPACE(num * sizeof(uint32_t))]; ++ memset(buf, 0, sizeof(buf)); + + struct cmsghdr *cmsg = (struct cmsghdr *)buf; + cmsg->cmsg_len = CMSG_LEN(num * sizeof(uint32_t)); +@@ -271,11 +270,9 @@ int IPCUnixSocket::sendData(const void *buffer, size_t length, + int ret = -errno; + LOG(IPCUnixSocket, Error) + << "Failed to sendmsg: " << strerror(-ret); +- free(buf); + return ret; + } + +- free(buf); + return 0; + } + +@@ -286,8 +283,8 @@ int IPCUnixSocket::recvData(void *buffer, size_t length, + iov[0].iov_base = buffer; + iov[0].iov_len = length; + +- char *buf = (char*)malloc(CMSG_SPACE(num * sizeof(uint32_t))); +- memset((void*)buf, 0, sizeof(buf)); ++ char buf[CMSG_SPACE(num * sizeof(uint32_t))]; ++ memset(buf, 0, sizeof(buf)); + + struct cmsghdr *cmsg = (struct cmsghdr *)buf; + cmsg->cmsg_len = CMSG_LEN(num * sizeof(uint32_t)); +@@ -308,14 +305,12 @@ int IPCUnixSocket::recvData(void *buffer, size_t length, + if (ret != -EAGAIN) + LOG(IPCUnixSocket, Error) + << "Failed to recvmsg: " << strerror(-ret); +- free(buf); + return ret; + } + + if (fds) + memcpy(fds, CMSG_DATA(cmsg), num * sizeof(uint32_t)); + +- free(buf); + return 0; + } + +diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp +index 04f40132..bd054552 100644 +--- a/src/libcamera/media_device.cpp ++++ b/src/libcamera/media_device.cpp +@@ -159,12 +159,12 @@ bool MediaDevice::lock() + * + * \sa lock() + */ +-bool MediaDevice::unlock() ++void MediaDevice::unlock() + { + if (!fd_.isValid()) +- return false; ++ return; + +- return lockf(fd_.get(), F_ULOCK, 0) == 0; ++ lockf(fd_.get(), F_ULOCK, 0); + } + + /** +diff --git a/src/libcamera/pipeline/dcmipp/dcmipp.cpp b/src/libcamera/pipeline/dcmipp/dcmipp.cpp +new file mode 100644 +index 00000000..a7353fe2 +--- /dev/null ++++ b/src/libcamera/pipeline/dcmipp/dcmipp.cpp +@@ -0,0 +1,1363 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024, ST Microelectronics ++ * ++ * dcmipp.cpp - Pipeline handler for the stm32 DCMIPP device ++ * Originally based on the vimc pipeline handler ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include "libcamera/internal/camera.h" ++#include "libcamera/internal/camera_sensor.h" ++#include "libcamera/internal/device_enumerator.h" ++#include "libcamera/internal/framebuffer.h" ++#include "libcamera/internal/ipa_manager.h" ++#include "libcamera/internal/media_device.h" ++#include "libcamera/internal/pipeline_handler.h" ++#include "libcamera/internal/v4l2_subdevice.h" ++#include "libcamera/internal/v4l2_videodevice.h" ++ ++#include "linux/stm32-dcmipp-config.h" ++#include "dcmipp.h" ++ ++namespace libcamera { ++ ++LOG_DEFINE_CATEGORY(DCMIPP) ++ ++class PipelineHandlerDcmipp; ++class DcmippCameraData; ++ ++struct DcmippFrameInfo { ++ unsigned int frame; ++ Request *request; ++ ++ FrameBuffer *dumpPathBuffer; ++ FrameBuffer *mainPathBuffer; ++ FrameBuffer *auxPathBuffer; ++ ++ FrameBuffer *statsBuffer; ++ ++ bool metadataProcessed; ++}; ++ ++class DcmippFrames ++{ ++public: ++ DcmippFrames(PipelineHandler *pipe); ++ ++ DcmippFrameInfo *create(const DcmippCameraData *data, Request *request); ++ int destroy(unsigned int frame); ++ void clear(); ++ ++ DcmippFrameInfo *find(unsigned int frame); ++ DcmippFrameInfo *find(FrameBuffer *buffer); ++ ++private: ++ PipelineHandlerDcmipp *pipe_; ++ std::map frameInfo_; ++}; ++ ++class DcmippCameraData : public Camera::Private ++{ ++public: ++ DcmippCameraData(PipelineHandler *pipe, DcmippDumpPath *dumpPath, ++ DcmippMainPath *mainPath, DcmippAuxPath *auxPath) ++ : Camera::Private(pipe), dumpPath_(dumpPath), ++ mainPath_(mainPath), auxPath_(auxPath), frameInfo_(pipe) ++ { ++ } ++ ++ PipelineHandlerDcmipp *pipe(); ++ ++ void paramsFilled(unsigned int id); ++ void statsFreed(unsigned int id); ++ void metadataReady(unsigned int frame, const ControlList &metadata); ++ void setSensorControls(unsigned int id, const ControlList &sensorControls); ++ void setIspControls(unsigned int id, const ControlList &ispControls); ++ void setPostprocControls(unsigned int id, const ControlList &ispControls); ++ ++ std::unique_ptr sensor_; ++ std::unique_ptr input_; ++ Stream Dumpstream_; ++ Stream Mainstream_; ++ Stream Auxstream_; ++ ++ DcmippDumpPath *dumpPath_; ++ DcmippMainPath *mainPath_; ++ DcmippAuxPath *auxPath_; ++ ++ std::vector ipaBuffers_; ++ std::unique_ptr ipa_; ++ DcmippFrames frameInfo_; ++ ++ std::queue requests_; ++}; ++ ++class DcmippCameraConfiguration : public CameraConfiguration ++{ ++public: ++ DcmippCameraConfiguration(DcmippCameraData *data); ++ ++ Status validate() override; ++ ++ const V4L2SubdeviceFormat &sensorFormat() { return sensorFormat_; } ++ ++ unsigned int isp_decimation_ratio; ++ ++private: ++ bool fitsAllPaths(const StreamConfiguration &cfg); ++ ++ DcmippCameraData *data_; ++ V4L2SubdeviceFormat sensorFormat_; ++}; ++ ++class PipelineHandlerDcmipp : public PipelineHandler ++{ ++public: ++ PipelineHandlerDcmipp(CameraManager *manager); ++ ++ std::unique_ptr generateConfiguration(Camera *camera, ++ Span roles) override; ++ int configure(Camera *camera, CameraConfiguration *config) override; ++ ++ int exportFrameBuffers(Camera *camera, Stream *stream, ++ std::vector> *buffers) override; ++ ++ int start(Camera *camera, const ControlList *controls) override; ++ void stopDevice(Camera *camera) override; ++ ++ int queueRequestDevice(Camera *camera, Request *request) override; ++ ++ bool match(DeviceEnumerator *enumerator) override; ++ ++private: ++ int init(std::unique_ptr &data); ++ ++ DcmippCameraData *cameraData(Camera *camera) ++ { ++ return static_cast(camera->_d()); ++ } ++ ++ friend DcmippCameraData; ++ friend DcmippCameraConfiguration; ++ ++ int allocateBuffers(Camera *camera); ++ int freeBuffers(Camera *camera); ++ ++ void bufferReady(FrameBuffer *buffer); ++ void statsReady(FrameBuffer *buffer); ++ void paramsReady(FrameBuffer *buffer); ++ ++ DcmippDumpPath dumpPath_; ++ DcmippMainPath mainPath_; ++ DcmippAuxPath auxPath_; ++ ++ MediaDevice *media_; ++ std::unique_ptr bridge_; ++ std::unique_ptr input_; ++ ++ std::unique_ptr params_; ++ std::unique_ptr stats_; ++ ++ std::vector> isp_params_; ++ std::queue available_isp_params_; ++ std::vector> isp_stats_; ++ std::queue available_isp_stats_; ++ ++ void tryCompleteRequest(DcmippFrameInfo *info); ++ ++ Camera *activeCamera_; ++ ++ unsigned int ipaBufferCount_; ++}; ++ ++namespace { ++ ++static const std::map rawFormatToMediaBus{ ++ { formats::SBGGR8, MEDIA_BUS_FMT_SBGGR8_1X8 }, ++ { formats::SGBRG8, MEDIA_BUS_FMT_SGBRG8_1X8 }, ++ { formats::SGRBG8, MEDIA_BUS_FMT_SGRBG8_1X8 }, ++ { formats::SRGGB8, MEDIA_BUS_FMT_SRGGB8_1X8 }, ++ { formats::SBGGR10, MEDIA_BUS_FMT_SBGGR10_1X10 }, ++ { formats::SGBRG10, MEDIA_BUS_FMT_SGBRG10_1X10 }, ++ { formats::SGRBG10, MEDIA_BUS_FMT_SGRBG10_1X10 }, ++ { formats::SRGGB10, MEDIA_BUS_FMT_SRGGB10_1X10 }, ++ { formats::SBGGR12, MEDIA_BUS_FMT_SBGGR12_1X12 }, ++ { formats::SGBRG12, MEDIA_BUS_FMT_SGBRG12_1X12 }, ++ { formats::SGRBG12, MEDIA_BUS_FMT_SGRBG12_1X12 }, ++ { formats::SRGGB12, MEDIA_BUS_FMT_SRGGB12_1X12 }, ++ { formats::SBGGR14, MEDIA_BUS_FMT_SBGGR14_1X14 }, ++ { formats::SGBRG14, MEDIA_BUS_FMT_SGBRG14_1X14 }, ++ { formats::SGRBG14, MEDIA_BUS_FMT_SGRBG14_1X14 }, ++ { formats::SRGGB14, MEDIA_BUS_FMT_SRGGB14_1X14 }, ++}; ++ ++} /* namespace */ ++ ++DcmippFrames::DcmippFrames(PipelineHandler *pipe) ++ : pipe_(static_cast(pipe)) ++{ ++} ++ ++DcmippFrameInfo *DcmippFrames::create(const DcmippCameraData *data, Request *request) ++{ ++ FrameBuffer *dumpPathBuffer = nullptr; ++ FrameBuffer *mainPathBuffer = nullptr; ++ FrameBuffer *auxPathBuffer = nullptr; ++ ++ if (data->dumpPath_->isEnabled()) { ++ dumpPathBuffer = request->findBuffer(&data->Dumpstream_); ++ if (!dumpPathBuffer) { ++ LOG(DCMIPP, Error) << "Attempt to queue request with invalid stream"; ++ return nullptr; ++ } ++ } ++ ++ if (data->mainPath_->isEnabled()) { ++ mainPathBuffer = request->findBuffer(&data->Mainstream_); ++ if (!mainPathBuffer) { ++ LOG(DCMIPP, Error) << "Attempt to queue request with invalid stream"; ++ return nullptr; ++ } ++ } ++ ++ if (data->auxPath_->isEnabled()) { ++ auxPathBuffer = request->findBuffer(&data->Auxstream_); ++ if (!auxPathBuffer) { ++ LOG(DCMIPP, Error) << "Attempt to queue request with invalid stream"; ++ return nullptr; ++ } ++ } ++ ++ DcmippFrameInfo *info = new DcmippFrameInfo; ++ ++ info->frame = request->sequence(); ++ info->request = request; ++ info->dumpPathBuffer = dumpPathBuffer; ++ info->mainPathBuffer = mainPathBuffer; ++ info->auxPathBuffer = auxPathBuffer; ++ ++ info->statsBuffer = nullptr; ++ info->metadataProcessed = false; ++ ++ frameInfo_[info->frame] = info; ++ ++ return info; ++} ++ ++int DcmippFrames::destroy(unsigned int frame) ++{ ++ DcmippFrameInfo *info = find(frame); ++ if (!info) ++ return -ENOENT; ++ ++ frameInfo_.erase(info->frame); ++ ++ delete info; ++ ++ return 0; ++} ++ ++void DcmippFrames::clear() ++{ ++ for (const auto &entry : frameInfo_) { ++ DcmippFrameInfo *info = entry.second; ++ ++ delete info; ++ } ++ ++ frameInfo_.clear(); ++} ++ ++DcmippFrameInfo *DcmippFrames::find(unsigned int frame) ++{ ++ auto itInfo = frameInfo_.find(frame); ++ ++ if (itInfo != frameInfo_.end()) ++ return itInfo->second; ++ ++ LOG(DCMIPP, Error) << "Frame #" << frame << " unknown in frameInfo list"; ++ ++ return nullptr; ++} ++ ++DcmippFrameInfo *DcmippFrames::find(FrameBuffer *buffer) ++{ ++ for (auto &itInfo : frameInfo_) { ++ DcmippFrameInfo *info = itInfo.second; ++ ++ if (info->dumpPathBuffer == buffer || ++ info->mainPathBuffer == buffer || ++ info->auxPathBuffer == buffer || ++ info->statsBuffer == buffer) ++ return info; ++ } ++ ++ LOG(DCMIPP, Error) << "FrameBuffer " << buffer << " unknown in frameInfo list"; ++ ++ return nullptr; ++} ++ ++DcmippCameraConfiguration::DcmippCameraConfiguration(DcmippCameraData *data) ++ : CameraConfiguration(), data_(data) ++{ ++} ++ ++bool DcmippCameraConfiguration::fitsAllPaths(const StreamConfiguration &cfg) ++{ ++ const CameraSensor *sensor = data_->sensor_.get(); ++ StreamConfiguration config; ++ ++ /* ++ * We only check for non-RAW configuration using Main / Aux pipes since anyway ++ * we dedicate the Dump pipe for RAW ++ */ ++ if (PixelFormatInfo::info(cfg.pixelFormat).colourEncoding == PixelFormatInfo::ColourEncodingRAW) ++ return false; ++ ++ config = cfg; ++ if (data_->mainPath_->validate(sensor, &config, 1) != Valid) ++ return false; ++ ++ config = cfg; ++ if (data_->auxPath_->validate(sensor, &config, 1) != Valid) ++ return false; ++ ++ return true; ++} ++ ++CameraConfiguration::Status DcmippCameraConfiguration::validate() ++{ ++ const CameraSensor *sensor = data_->sensor_.get(); ++ PipelineHandlerDcmipp *pipe = ++ static_cast(data_->pipe()); ++ V4L2SubdeviceFormat sensorFormat; ++ Status status = Valid; ++ ++ /* ++ * List of RAW formats supported by the input subdevice ++ * sorted from the best quality to the lowest quality so ++ * that the pipeline handler will pick up the best quality ++ * possible by both sensor & dcmipp ++ */ ++ const std::vector mbusRAWInputCodes = { ++ MEDIA_BUS_FMT_SRGGB14_1X14, ++ MEDIA_BUS_FMT_SGRBG14_1X14, ++ MEDIA_BUS_FMT_SGBRG14_1X14, ++ MEDIA_BUS_FMT_SBGGR14_1X14, ++ MEDIA_BUS_FMT_SRGGB12_1X12, ++ MEDIA_BUS_FMT_SGRBG12_1X12, ++ MEDIA_BUS_FMT_SGBRG12_1X12, ++ MEDIA_BUS_FMT_SBGGR12_1X12, ++ MEDIA_BUS_FMT_SRGGB10_1X10, ++ MEDIA_BUS_FMT_SGRBG10_1X10, ++ MEDIA_BUS_FMT_SGBRG10_1X10, ++ MEDIA_BUS_FMT_SBGGR10_1X10, ++ MEDIA_BUS_FMT_SRGGB8_1X8, ++ MEDIA_BUS_FMT_SGRBG8_1X8, ++ MEDIA_BUS_FMT_SGBRG8_1X8, ++ MEDIA_BUS_FMT_SBGGR8_1X8, ++ }; ++ ++ LOG(DCMIPP, Debug) << "validate"; ++ ++ if (config_.empty()) ++ return Invalid; ++ ++ /* Cap the number of entries to the available streams. */ ++ if (config_.size() > 3) { ++ config_.resize(3); ++ status = Adjusted; ++ } ++ ++ /* ++ * Reorder the list of streams based on compatibility with pipes. Evaluate first ++ * streams that cannot work on all pipes. Create an order list, and push at the ++ * back of the list pipes that can run on both main & aux pipes ++ */ ++ std::vector order; ++ order.reserve(config_.size()); ++ for (unsigned int index = 0; index < config_.size(); index++) { ++ if (fitsAllPaths(config_[index])) ++ order.emplace(order.end(), index); ++ else ++ order.emplace(order.begin(), index); ++ } ++ ++ /* ++ * First walk through all Non-RAW (going through ISP) config to figure out the ++ * necessary ISP decimation factor to be applied ++ */ ++ Size post_isp_resolution = sensor->resolution(); ++ isp_decimation_ratio = 1; ++ ++ for (unsigned int index : order) { ++ StreamConfiguration &cfg = config_[index]; ++ ++ if (PixelFormatInfo::info(cfg.pixelFormat).colourEncoding == PixelFormatInfo::ColourEncodingRAW) ++ continue; ++ ++ /* ++ * For Main & Aux pipe postproc can perform decimate-downsize hence 8 * 8 reduction ++ * ++ * ISP decimation can also perform a maximum of 8 reduction. It is also mandatory ++ * to ensure that RAW frame size does not exceed 2688 width prior demosaicing. ++ */ ++ /* Ensure to not exceed maximum width for demosaicing */ ++ while (post_isp_resolution.width > DCMIPP_RAW_MAX_WIDTH || ++ post_isp_resolution.width / cfg.size.width > (8 * 8) || ++ post_isp_resolution.height / cfg.size.height > (8 * 8)) { ++ isp_decimation_ratio *= 2; ++ if (isp_decimation_ratio > 8) { ++ LOG(DCMIPP, Error) << "Necessary decimation factor too big."; ++ return Invalid; ++ } ++ post_isp_resolution /= 2; ++ } ++ } ++ ++ /* Pick a pipe and validate each configuration */ ++ bool dumpAllocated = false, mainAllocated = false, auxAllocated = false; ++ for (unsigned int index : order) { ++ StreamConfiguration &cfg = config_[index]; ++ DcmippPath *path; ++ Stream *stream; ++ ++ if (PixelFormatInfo::info(cfg.pixelFormat).colourEncoding == PixelFormatInfo::ColourEncodingRAW) { ++ if (dumpAllocated) { ++ LOG(DCMIPP, Error) << "Cannot perform RAW capture since Dump pipe already allocated"; ++ return Invalid; ++ } ++ LOG(DCMIPP, Debug) << "Select Dump pipe for config: pixelformat: " << cfg.pixelFormat << " size: " << cfg.size; ++ path = &pipe->dumpPath_; ++ stream = &data_->Dumpstream_; ++ dumpAllocated = true; ++ } else { ++ if (!mainAllocated) { ++ LOG(DCMIPP, Debug) << "Select Main pipe for config: pixelformat: " << cfg.pixelFormat << " size: " << cfg.size; ++ path = &pipe->mainPath_; ++ stream = &data_->Mainstream_; ++ mainAllocated = true; ++ } else if (!auxAllocated) { ++ LOG(DCMIPP, Debug) << "Select Aux pipe for config: pixelformat: " << cfg.pixelFormat << " size: " << cfg.size; ++ path = &pipe->auxPath_; ++ stream = &data_->Auxstream_; ++ auxAllocated = true; ++ } else { ++ LOG(DCMIPP, Error) << "No more pipe available"; ++ return Invalid; ++ } ++ } ++ ++ StreamConfiguration tryCfg = cfg; ++ if (path->validate(sensor, &tryCfg, isp_decimation_ratio) != Valid) ++ return Invalid; ++ ++ cfg = std::move(tryCfg); ++ cfg.setStream(stream); ++ ++ /* If we have validate a RAW format, this should be the sensor format */ ++ if (PixelFormatInfo::info(cfg.pixelFormat).colourEncoding == PixelFormatInfo::ColourEncodingRAW) { ++ /* Check that the format is supported */ ++ if (rawFormatToMediaBus.find(cfg.pixelFormat) == rawFormatToMediaBus.end()) { ++ LOG(DCMIPP, Debug) << "Format " << cfg.pixelFormat << " not supported"; ++ return Invalid; ++ } ++ ++ sensorFormat.code = rawFormatToMediaBus.find(cfg.pixelFormat)->second; ++ sensorFormat.size = sensor->resolution(); ++ } ++ } ++ ++ /* If we haven't got yet a sensorFormat, then pick the best one for us */ ++ if (sensorFormat.size.isNull()) { ++ sensorFormat = sensor->getFormat(mbusRAWInputCodes, sensor->resolution()); ++ if (sensorFormat.size.isNull()) { ++ LOG(DCMIPP, Debug) << __func__ << "Failed to get compatible RAW format"; ++ return Invalid; ++ } ++ } ++ ++ LOG(DCMIPP, Debug) << __func__ << " sensor MBUS format is " << sensorFormat.code << "/" << sensorFormat.size; ++ sensorFormat_ = sensorFormat; ++ ++ return status; ++} ++ ++PipelineHandlerDcmipp::PipelineHandlerDcmipp(CameraManager *manager) ++ : PipelineHandler(manager), media_(nullptr), activeCamera_(nullptr) ++{ ++} ++ ++std::unique_ptr ++PipelineHandlerDcmipp::generateConfiguration(Camera *camera, ++ Span roles) ++{ ++ DcmippCameraData *data = cameraData(camera); ++ std::unique_ptr config = ++ std::make_unique(data); ++ bool dumpAllocated = false, mainAllocated = false, auxAllocated = false; ++ int i = 0; ++ ++ LOG(DCMIPP, Debug) << "generateConfiguration"; ++ ++ /* It is allowed to not indicate a role, in which case we return a empty config */ ++ if (roles.empty()) ++ return config; ++ ++ /* DCMIPP can handle a maximum of 3 streams */ ++ if (roles.size() > 3) { ++ LOG(DCMIPP, Error) << "More streams requested than supported"; ++ return nullptr; ++ } ++ ++ /* ++ * We can allocate pipes depending on the role since preferred configuration for ++ * each role define the pipe to be used due to their HW capabilities ++ * ++ * StillCapture: targetting best image, with JPEG output via SW encoder behind hence ++ * YUV420 Planar format. That is MEDIA_BUS_FMT_UYVY8_1_5X8 in DCMIPP ++ * driver and V4L2_PIX_FMT_YUV420. ++ * This is exclusively done via the Main pipe. ++ * Viewfinder: targetting a display, hence limited size of the image to fit into the ++ * display and xRGB32 output (for the time being we use RGB888 instead. ++ * Hence MEDIA_BUS_FMT_RGB888_1X24 and V4L2_PIX_FMT_RGB24. ++ * This can be done by both Main & Aux pipe however we use Aux pipe here. ++ * VideoRecording: targetting a video encoder with a maximum resolution of HD. ++ * Hence MEDIA_BUS_FMT_YUYV8_1_5X8 and V4L2_PIX_FMT_NV12. ++ * This is exclusively done via the Main pipe. ++ * Raw: targetting RawBayer extraction of the image from a sensor. Format depends on ++ * the format of the sensor. This is only done by the Dump pipe. ++ */ ++ for (const StreamRole role : roles) { ++ DcmippPath *path; ++ Size maxSize; ++ PixelFormat pixelFormat; ++ ++ switch (role) { ++ case StreamRole::StillCapture: ++ maxSize = data->sensor_->resolution(); ++ pixelFormat = formats::YUV420; ++ if (mainAllocated) { ++ LOG(DCMIPP, Error) << "Main pipe already allocated, ABORT"; ++ return nullptr; ++ } ++ path = data->mainPath_; ++ mainAllocated = true; ++ break; ++ case StreamRole::Viewfinder: ++ maxSize = { 1024, 600 }; ++ pixelFormat = formats::RGB888; ++ if (auxAllocated) { ++ LOG(DCMIPP, Error) << "Aux pipe already allocated, ABORT"; ++ return nullptr; ++ } ++ path = data->auxPath_; ++ auxAllocated = true; ++ break; ++ case StreamRole::VideoRecording: ++ maxSize = { 1920, 1080 }; ++ pixelFormat = formats::NV12; ++ if (mainAllocated) { ++ LOG(DCMIPP, Error) << "Main pipe already allocated, ABORT"; ++ return nullptr; ++ } ++ path = data->mainPath_; ++ mainAllocated = true; ++ break; ++ case StreamRole::Raw: ++ maxSize = data->sensor_->resolution(); ++ /* ++ * In case of Raw role, the pixelFormat is actually given by the ++ * dcmipp_path generateConfiguration since it depends on sensor format ++ */ ++ pixelFormat = formats::SBGGR8; ++ if (dumpAllocated) { ++ LOG(DCMIPP, Error) << "Dump pipe already allocated, ABORT"; ++ return nullptr; ++ } ++ path = data->dumpPath_; ++ dumpAllocated = true; ++ break; ++ default: ++ LOG(DCMIPP, Error) << "Requested stream role not supported: " << roles[0]; ++ return nullptr; ++ } ++ ++ /* ++ * role is given here mainly for the ViewFinder role case since we need to figure ++ * out a way to indicate that we need to enable the GammaCorrection ++ */ ++ StreamConfiguration cfg = ++ path->generateConfiguration(data->sensor_.get(), maxSize, pixelFormat); ++ if (!cfg.pixelFormat.isValid()) ++ return nullptr; ++ ++ config->addConfiguration(cfg); ++ i++; ++ } ++ ++ config->validate(); ++ ++ return config; ++} ++ ++int PipelineHandlerDcmipp::configure(Camera *camera, CameraConfiguration *c) ++{ ++ DcmippCameraConfiguration *config = ++ static_cast(c); ++ DcmippCameraData *data = cameraData(camera); ++ int ret; ++ ++ LOG(DCMIPP, Debug) << "configure"; ++ ++ /* Disable all paths */ ++ dumpPath_.setEnabled(false); ++ mainPath_.setEnabled(false); ++ auxPath_.setEnabled(false); ++ ++ /* ++ * Only enable the relevant link between dcmipp_input and its ++ * source entity (bridge or sensor) ++ */ ++ const MediaEntity *source; ++ if (bridge_) ++ source = bridge_->entity(); ++ else ++ source = data->sensor_->entity(); ++ ++ const MediaPad *input_sinkPad = data->input_->entity()->getPadByIndex(0); ++ for (MediaLink *link : input_sinkPad->links()) { ++ if (link->source()->entity()->name().compare(source->name())) ++ link->setEnabled(false); ++ else ++ link->setEnabled(true); ++ } ++ ++ /* Get the sensor configuration and apply it */ ++ V4L2SubdeviceFormat subformat = config->sensorFormat(); ++ ret = data->sensor_->setFormat(&subformat); ++ if (ret) ++ return ret; ++ ++ /* Same configuration on both side of the bridge */ ++ if (bridge_) { ++ ret = bridge_->setFormat(0, &subformat); ++ if (ret) ++ return ret; ++ ret = bridge_->setFormat(1, &subformat); ++ if (ret) ++ return ret; ++ } ++ ++ /* Initialize links after input depending on the config */ ++ for (const StreamConfiguration &cfg : *config) { ++ if (cfg.stream() == &data->Dumpstream_) ++ ret = dumpPath_.setEnabled(true); ++ else if (cfg.stream() == &data->Mainstream_) ++ ret = mainPath_.setEnabled(true); ++ else if (cfg.stream() == &data->Auxstream_) ++ ret = auxPath_.setEnabled(true); ++ } ++ ++ /* Same configuration on both side of the input subdev */ ++ ret = input_->setFormat(0, &subformat); ++ if (ret) ++ return ret; ++ ++ /* ++ * Configuration of each path ++ * If main and/or aux are used, store the number of necessary ipa buffers ++ * this is set to the number of path buffer + 1 ++ */ ++ ipaBufferCount_ = 0; ++ for (const StreamConfiguration &cfg : *config) { ++ if (cfg.stream() == &data->Dumpstream_) ++ ret = dumpPath_.configure(cfg, subformat, 0); ++ else if (cfg.stream() == &data->Mainstream_) { ++ ret = mainPath_.configure(cfg, subformat, config->isp_decimation_ratio); ++ if (!ret && cfg.bufferCount > ipaBufferCount_ + 1) ++ ipaBufferCount_ = cfg.bufferCount + 1; ++ } else if (cfg.stream() == &data->Auxstream_) { ++ ret = auxPath_.configure(cfg, subformat, config->isp_decimation_ratio); ++ if (!ret && cfg.bufferCount > ipaBufferCount_ + 1) ++ ipaBufferCount_ = cfg.bufferCount + 1; ++ } ++ if (ret) { ++ LOG(DCMIPP, Error) << "Failed to configure path"; ++ return ret; ++ } ++ } ++ ++ /* Configure the IPA if we have one and use Main or Aux paths */ ++ if (data->ipa_ && (data->mainPath_->isEnabled() || data->auxPath_->isEnabled())) { ++ /* Configure the param & stat video devices */ ++ V4L2DeviceFormat paramFormat; ++ paramFormat.fourcc = V4L2PixelFormat(V4L2_META_FMT_ST_DCMIPP_ISP_PARAMS); ++ ret = params_->setFormat(¶mFormat); ++ if (ret) ++ return ret; ++ ++ V4L2DeviceFormat statFormat; ++ statFormat.fourcc = V4L2PixelFormat(V4L2_META_FMT_ST_DCMIPP_ISP_STAT); ++ ret = stats_->setFormat(&statFormat); ++ if (ret) ++ return ret; ++ ++ /* Disable the stat region by default */ ++ struct v4l2_ctrl_isp_stat_region region; ++ ++ region.nb_regions = 0; ++ ++ ControlValue ctrl(Span{ reinterpret_cast(®ion), sizeof(region) }); ++ ControlList statAreaControl; ++ statAreaControl.set(V4L2_CID_ISP_STAT_REGION, ctrl); ++ ret = stats_->setControls(&statAreaControl); ++ if (ret) { ++ LOG(DCMIPP, Error) << "Failed to set control of ISP Stat Area"; ++ return ret; ++ } ++ ++ /* ++ * Inform IPA of sensor controls. IPA will update ++ * data->controlInfo_ which specifies the list of controls supported by the camera. ++ */ ++ IPACameraSensorInfo sensorInfo; ++ data->sensor_->sensorInfo(&sensorInfo); ++ ++ ret = data->ipa_->configure(sensorInfo, data->sensor_->controls(), ++ config->isp_decimation_ratio, ++ &data->controlInfo_); ++ if (ret) { ++ LOG(DCMIPP, Error) << "Failed to configure IPA"; ++ return ret; ++ } ++ } ++ ++ return 0; ++} ++ ++int PipelineHandlerDcmipp::exportFrameBuffers([[maybe_unused]] Camera *camera, Stream *stream, ++ std::vector> *buffers) ++{ ++ DcmippCameraData *data = cameraData(camera); ++ unsigned int count = stream->configuration().bufferCount; ++ ++ if (stream == &data->Dumpstream_) ++ return dumpPath_.exportBuffers(count, buffers); ++ else if (stream == &data->Mainstream_) ++ return mainPath_.exportBuffers(count, buffers); ++ else if (stream == &data->Auxstream_) ++ return auxPath_.exportBuffers(count, buffers); ++ ++ return -EINVAL; ++} ++ ++int PipelineHandlerDcmipp::allocateBuffers(Camera *camera) ++{ ++ DcmippCameraData *data = cameraData(camera); ++ unsigned int ipaBufferId = 0; ++ int ret; ++ ++ ret = params_->allocateBuffers(ipaBufferCount_, &isp_params_); ++ if (ret < 0) ++ goto error; ++ ++ ret = stats_->allocateBuffers(ipaBufferCount_, &isp_stats_); ++ if (ret < 0) ++ goto error; ++ ++ for (std::unique_ptr &buffer : isp_stats_) { ++ buffer->setCookie(ipaBufferId++); ++ data->ipaBuffers_.emplace_back(buffer->cookie(), buffer->planes()); ++ available_isp_stats_.push(buffer.get()); ++ } ++ ++ for (std::unique_ptr &buffer : isp_params_) { ++ buffer->setCookie(ipaBufferId++); ++ buffer->_d()->metadata().planes()[0].bytesused = sizeof(struct stm32_dcmipp_params_cfg); ++ data->ipaBuffers_.emplace_back(buffer->cookie(), buffer->planes()); ++ available_isp_params_.push(buffer.get()); ++ } ++ ++ data->ipa_->mapBuffers(data->ipaBuffers_); ++ ++ return 0; ++ ++error: ++ isp_params_.clear(); ++ isp_stats_.clear(); ++ ++ return ret; ++} ++ ++int PipelineHandlerDcmipp::freeBuffers(Camera *camera) ++{ ++ DcmippCameraData *data = cameraData(camera); ++ ++ while (!available_isp_stats_.empty()) ++ available_isp_stats_.pop(); ++ ++ while (!available_isp_params_.empty()) ++ available_isp_params_.pop(); ++ ++ isp_params_.clear(); ++ isp_stats_.clear(); ++ ++ std::vector ids; ++ for (IPABuffer &ipabuf : data->ipaBuffers_) ++ ids.push_back(ipabuf.id); ++ ++ data->ipa_->unmapBuffers(ids); ++ data->ipaBuffers_.clear(); ++ ++ params_->releaseBuffers(); ++ stats_->releaseBuffers(); ++ ++ return 0; ++} ++ ++int PipelineHandlerDcmipp::start(Camera *camera, [[maybe_unused]] const ControlList *controls) ++{ ++ DcmippCameraData *data = cameraData(camera); ++ int ret; ++ ++ LOG(DCMIPP, Debug) << "start"; ++ ++ activeCamera_ = camera; ++ ++ if (data->dumpPath_->isEnabled()) { ++ ret = data->dumpPath_->start(); ++ if (ret < 0) { ++ LOG(DCMIPP, Error) << "Cannot start bytecapture"; ++ return ret; ++ } ++ } ++ ++ /* Nothing else to do if there is neither main or aux paths */ ++ if (!data->mainPath_->isEnabled() && !data->auxPath_->isEnabled()) ++ return 0; ++ ++ ret = allocateBuffers(camera); ++ if (ret < 0) { ++ freeBuffers(camera); ++ if (data->dumpPath_->isEnabled()) ++ data->dumpPath_->stop(); ++ LOG(DCMIPP, Error) << "Cannot allocate stats & params buffers for IPA"; ++ return ret; ++ } ++ ++ ret = data->ipa_->start(); ++ if (ret) { ++ LOG(DCMIPP, Error) << "Cannot start IPA"; ++ freeBuffers(camera); ++ if (data->dumpPath_->isEnabled()) ++ data->dumpPath_->stop(); ++ return ret; ++ } ++ ++ if (data->mainPath_->isEnabled()) { ++ ret = data->mainPath_->start(); ++ if (ret < 0) { ++ LOG(DCMIPP, Error) << "Cannot start pixelcapture"; ++ data->ipa_->stop(); ++ freeBuffers(camera); ++ if (data->dumpPath_->isEnabled()) ++ data->dumpPath_->stop(); ++ return ret; ++ } ++ } ++ ++ if (data->auxPath_->isEnabled()) { ++ ret = data->auxPath_->start(); ++ if (ret < 0) { ++ LOG(DCMIPP, Error) << "Cannot start pixelcapture"; ++ if (data->mainPath_->isEnabled()) ++ data->mainPath_->stop(); ++ data->ipa_->stop(); ++ freeBuffers(camera); ++ if (data->dumpPath_->isEnabled()) ++ data->dumpPath_->stop(); ++ return ret; ++ } ++ } ++ ++ ret = stats_->streamOn(); ++ if (ret < 0) { ++ LOG(DCMIPP, Error) << "Cannot start stat buffers"; ++ mainPath_.stop(); ++ data->ipa_->stop(); ++ freeBuffers(camera); ++ if (data->dumpPath_->isEnabled()) ++ data->dumpPath_->stop(); ++ return ret; ++ } ++ ++ ret = params_->streamOn(); ++ if (ret < 0) { ++ LOG(DCMIPP, Error) << "Cannot start params buffers"; ++ stats_->streamOff(); ++ mainPath_.stop(); ++ data->ipa_->stop(); ++ freeBuffers(camera); ++ if (data->dumpPath_->isEnabled()) ++ data->dumpPath_->stop(); ++ return ret; ++ } ++ ++ return 0; ++} ++ ++void PipelineHandlerDcmipp::stopDevice(Camera *camera) ++{ ++ DcmippCameraData *data = cameraData(camera); ++ ++ LOG(DCMIPP, Debug) << "stop"; ++ ++ if (data->mainPath_->isEnabled() || data->mainPath_->isEnabled()) { ++ params_->streamOff(); ++ stats_->streamOff(); ++ if (data->auxPath_->isEnabled()) ++ data->auxPath_->stop(); ++ if (data->mainPath_->isEnabled()) ++ data->mainPath_->stop(); ++ data->ipa_->stop(); ++ freeBuffers(camera); ++ } ++ if (data->dumpPath_->isEnabled()) ++ data->dumpPath_->stop(); ++ ++ data->frameInfo_.clear(); ++ ++ activeCamera_ = nullptr; ++} ++ ++int PipelineHandlerDcmipp::queueRequestDevice(Camera *camera, Request *request) ++{ ++ DcmippCameraData *data = cameraData(camera); ++ FrameBuffer *paramBuffer; ++ int ret; ++ ++ LOG(DCMIPP, Debug) << "Function: " << __func__ << " sequence: " << request->sequence(); ++ ++ DcmippFrameInfo *info = data->frameInfo_.create(data, request); ++ if (!info) ++ return -ENOENT; ++ ++ /* ++ * DCMIPP driver does not output statistics frames from the very beginning. ++ * This depends on the profile being selected via the STAT_PROFILE control, ++ * however in order to keep the pipeline handler code simpler, set the longest ++ * delay here, which leads to libcamera not trying to get statistics from the ++ * DCMIPP driver during the first requests ++ */ ++ if (!available_isp_stats_.empty() && request->sequence() > DCMIPP_STATS_FRAME_DELAY) { ++ info->statsBuffer = available_isp_stats_.front(); ++ available_isp_stats_.pop(); ++ } ++ ++ if (info->dumpPathBuffer) { ++ ret = data->dumpPath_->queueBuffer(info->dumpPathBuffer); ++ if (ret < 0) { ++ LOG(DCMIPP, Error) << "Can not queue dumpPath buffer"; ++ return ret; ++ } ++ } ++ ++ /* Nothing else to do if there is neither main or aux paths */ ++ if (!info->mainPathBuffer && !info->auxPathBuffer) ++ return 0; ++ ++ /* Inform IPA of control update */ ++ data->ipa_->queueRequest(request->sequence(), request->controls()); ++ ++ /* Sends the params buffer to the IPA for filling */ ++ if (available_isp_params_.empty()) { ++ LOG(DCMIPP, Error) << "ISP parameters buffer underrun"; ++ } else { ++ paramBuffer = available_isp_params_.front(); ++ available_isp_params_.pop(); ++ data->ipa_->fillParamsBuffer(request->sequence(), paramBuffer->cookie()); ++ } ++ ++ /* Queue pipeline buffers */ ++ if (info->mainPathBuffer) { ++ ret = data->mainPath_->queueBuffer(info->mainPathBuffer); ++ if (ret < 0) { ++ LOG(DCMIPP, Error) << "Can not queue mainPath buffer"; ++ return ret; ++ } ++ } ++ ++ if (info->auxPathBuffer) { ++ ret = data->auxPath_->queueBuffer(info->auxPathBuffer); ++ if (ret < 0) { ++ LOG(DCMIPP, Error) << "Can not queue auxPath buffer"; ++ return ret; ++ } ++ } ++ ++ if (info->statsBuffer) { ++ ret = stats_->queueBuffer(info->statsBuffer); ++ if (ret < 0) { ++ LOG(DCMIPP, Error) << "Can not queue ISP stats buffer"; ++ return ret; ++ } ++ } ++ ++ return 0; ++} ++ ++bool PipelineHandlerDcmipp::match(DeviceEnumerator *enumerator) ++{ ++ LOG(DCMIPP, Debug) << "match"; ++ ++ DeviceMatch dm("dcmipp"); ++ ++ dm.add("dcmipp_input"); ++ dm.add("dcmipp_main_isp"); ++ dm.add("dcmipp_main_postproc"); ++ dm.add("dcmipp_main_capture"); ++ ++ media_ = acquireMediaDevice(enumerator, dm); ++ if (!media_) ++ return false; ++ ++ std::unique_ptr data = std::make_unique(this, ++ &dumpPath_, ++ &mainPath_, ++ &auxPath_); ++ ++ /* Locate and open all subdevices and video nodes */ ++ if (init(data)) ++ return false; ++ ++ data->ipa_ = IPAManager::createIPA(this, 0, 0); ++ if (!data->ipa_) { ++ LOG(DCMIPP, Error) << "no matching IPA found"; ++ return false; ++ } ++ ++ /* Connect the two event callback from IPA */ ++ data->ipa_->paramsBufferReady.connect(data.get(), &DcmippCameraData::paramsFilled); ++ data->ipa_->statsBufferProcessed.connect(data.get(), &DcmippCameraData::statsFreed); ++ data->ipa_->metadataReady.connect(data.get(), &DcmippCameraData::metadataReady); ++ data->ipa_->setSensorControls.connect(data.get(), &DcmippCameraData::setSensorControls); ++ data->ipa_->setIspControls.connect(data.get(), &DcmippCameraData::setIspControls); ++ data->ipa_->setPostprocControls.connect(data.get(), &DcmippCameraData::setPostprocControls); ++ ++ /* ++ * Initialize IPA. IPA is reponsible for setting data->controlInfo_ which ++ * specifies the list of controls supported by the camera. ++ */ ++ IPACameraSensorInfo sensorInfo; ++ if (data->sensor_->sensorInfo(&sensorInfo)) { ++ LOG(DCMIPP, Error) << "Camera sensor information not available"; ++ return false; ++ } ++ ++ /* Tuning file made from sensor name or from environment variable */ ++ std::string ipaTuningFile; ++ char const *configFromEnv = utils::secure_getenv("LIBCAMERA_DCMIPP_TUNING_FILE"); ++ if (configFromEnv && *configFromEnv != '\0') { ++ ipaTuningFile = std::string(configFromEnv); ++ } else { ++ ipaTuningFile = data->ipa_->configurationFile(data->sensor_->model() + ".yaml"); ++ } ++ ++ if (data->ipa_->init(IPASettings{ ipaTuningFile, data->sensor_->model() }, ++ media_->hwRevision(), sensorInfo, data->sensor_->controls(), ++ &data->controlInfo_) < 0) { ++ LOG(DCMIPP, Error) << "IPA initialization failure"; ++ return false; ++ } ++ ++ /* Create and register the camera. */ ++ std::set streams{ &data->Dumpstream_, &data->Mainstream_, &data->Auxstream_ }; ++ const std::string &id = data->sensor_->id(); ++ std::shared_ptr camera = ++ Camera::create(std::move(data), id, streams); ++ registerCamera(std::move(camera)); ++ ++ return true; ++} ++ ++int PipelineHandlerDcmipp::init(std::unique_ptr &data) ++{ ++ const MediaPad *sinkPad; ++ const MediaPad *remotePad; ++ ++ LOG(DCMIPP, Debug) << "init"; ++ ++ input_ = V4L2Subdevice::fromEntityName(media_, "dcmipp_input"); ++ if (input_->open()) ++ return -ENODEV; ++ ++ /* Locate and open the optional CSI-2 receiver */ ++ sinkPad = input_->entity()->getPadByIndex(0); ++ if (!sinkPad || sinkPad->links().empty()) ++ return false; ++ ++ /* Look at links going to input entity sink pad */ ++ for (MediaLink *link : sinkPad->links()) { ++ remotePad = link->source(); ++ if (remotePad->entity()->function() == MEDIA_ENT_F_VID_IF_BRIDGE) { ++ bridge_ = std::make_unique(remotePad->entity()); ++ if (bridge_->open()) ++ return false; ++ ++ sinkPad = bridge_->entity()->getPadByIndex(0); ++ if (!sinkPad || sinkPad->links().empty()) ++ return false; ++ ++ remotePad = sinkPad->links().at(0)->source(); ++ } ++ ++ /* Select the sensor which is not the TPG */ ++ if (remotePad->entity()->name().compare("dcmipp_tpg")) ++ break; ++ } ++ ++ /* Open the sensor subdev */ ++ data->sensor_ = std::make_unique(remotePad->entity()); ++ if (data->sensor_->init()) ++ return -ENODEV; ++ ++ data->input_ = V4L2Subdevice::fromEntityName(media_, "dcmipp_input"); ++ if (data->input_->open() < 0) ++ return -ENODEV; ++ ++ /* Initialize all path */ ++ if (!dumpPath_.init(media_)) ++ return -ENODEV; ++ dumpPath_.bufferReady().connect(this, &PipelineHandlerDcmipp::bufferReady); ++ ++ if (!mainPath_.init(media_)) ++ return -ENODEV; ++ mainPath_.bufferReady().connect(this, &PipelineHandlerDcmipp::bufferReady); ++ ++ if (!auxPath_.init(media_)) ++ return -ENODEV; ++ auxPath_.bufferReady().connect(this, &PipelineHandlerDcmipp::bufferReady); ++ ++ /* Initialize ISP video devices */ ++ params_ = V4L2VideoDevice::fromEntityName(media_, "dcmipp_main_isp_params_output"); ++ if (params_->open()) ++ return -ENODEV; ++ params_->bufferReady.connect(this, &PipelineHandlerDcmipp::paramsReady); ++ ++ stats_ = V4L2VideoDevice::fromEntityName(media_, "dcmipp_main_isp_stat_capture"); ++ if (stats_->open()) ++ return -ENODEV; ++ stats_->bufferReady.connect(this, &PipelineHandlerDcmipp::statsReady); ++ ++ /* Initialize the camera properties. */ ++ data->properties_ = data->sensor_->properties(); ++ ++ return 0; ++} ++ ++PipelineHandlerDcmipp *DcmippCameraData::pipe() ++{ ++ return static_cast(Camera::Private::pipe()); ++} ++ ++void PipelineHandlerDcmipp::tryCompleteRequest(DcmippFrameInfo *info) ++{ ++ DcmippCameraData *data = cameraData(activeCamera_); ++ Request *request = info->request; ++ ++ LOG(DCMIPP, Debug) << "Function: " << __func__; ++ ++ if (request->hasPendingBuffers()) ++ return; ++ ++ if (info->statsBuffer && !info->metadataProcessed) ++ return; ++ ++ data->frameInfo_.destroy(info->frame); ++ ++ completeRequest(request); ++} ++ ++void PipelineHandlerDcmipp::bufferReady(FrameBuffer *buffer) ++{ ++ ASSERT(activeCamera_); ++ DcmippCameraData *data = cameraData(activeCamera_); ++ Request *request = buffer->request(); ++ ++ LOG(DCMIPP, Debug) << "Function: " << __func__; ++ ++ DcmippFrameInfo *info = data->frameInfo_.find(buffer); ++ if (!info) ++ return; ++ ++ /* If the buffer is cancelled force a complete of the whole request. */ ++ if (buffer->metadata().status == FrameMetadata::FrameCancelled) { ++ for (auto &it : request->buffers()) { ++ FrameBuffer *b = it.second; ++ b->_d()->cancel(); ++ completeBuffer(request, b); ++ } ++ ++ info->metadataProcessed = true; ++ tryCompleteRequest(info); ++ ++ return; ++ } ++ ++ /* Record the sensor's timestamp in the request metadata. */ ++ request->metadata().set(controls::SensorTimestamp, ++ buffer->metadata().timestamp); ++ ++ completeBuffer(request, buffer); ++ tryCompleteRequest(info); ++} ++ ++void PipelineHandlerDcmipp::statsReady(FrameBuffer *buffer) ++{ ++ ASSERT(activeCamera_); ++ DcmippCameraData *data = cameraData(activeCamera_); ++ ++ DcmippFrameInfo *info = data->frameInfo_.find(buffer); ++ if (!info) { ++ LOG(DCMIPP, Error) << "Stats buffer not found"; ++ return; ++ } ++ ++ LOG(DCMIPP, Debug) << "Function: " << __func__; ++ ++ /* Sends the stats buffer to the IPA for analysis */ ++ data->ipa_->processStatsBuffer(info->frame, buffer->cookie()); ++} ++ ++void PipelineHandlerDcmipp::paramsReady(FrameBuffer *buffer) ++{ ++ LOG(DCMIPP, Debug) << "Function: " << __func__; ++ ++ /* Push this buffer into the available buffer list */ ++ available_isp_params_.push(buffer); ++} ++ ++void DcmippCameraData::paramsFilled(unsigned int id) ++{ ++ PipelineHandlerDcmipp *pipe = ++ static_cast(Camera::Private::pipe()); ++ ++ LOG(DCMIPP, Debug) << "Function: " << __func__ << " buffer cookie: " << id; ++ ++ /* Search the buffer and queue it back */ ++ for (std::unique_ptr &buffer : pipe->isp_params_) { ++ if (buffer.get()->cookie() == id) { ++ if (pipe->params_->queueBuffer(buffer.get()) < 0) ++ LOG(DCMIPP, Error) << "Could not queue back stats buffer"; ++ return; ++ } ++ } ++ ++ LOG(DCMIPP, Error) << "Could not find params buffer"; ++} ++ ++void DcmippCameraData::statsFreed(unsigned int id) ++{ ++ PipelineHandlerDcmipp *pipe = ++ static_cast(Camera::Private::pipe()); ++ ++ LOG(DCMIPP, Debug) << "Function: " << __func__ << " buffer cookie: " << id; ++ ++ /* Search the buffer and queue it back */ ++ for (std::unique_ptr &buffer : pipe->isp_stats_) { ++ if (buffer.get()->cookie() == id) { ++ pipe->available_isp_stats_.push(buffer.get()); ++ return; ++ } ++ } ++ ++ LOG(DCMIPP, Error) << "Could not find stats buffer"; ++} ++ ++void DcmippCameraData::metadataReady(unsigned int frame, const ControlList &metadata) ++{ ++ LOG(DCMIPP, Debug) << "Function: " << __func__ << " frame: " << frame; ++ ++ DcmippFrameInfo *info = frameInfo_.find(frame); ++ if (!info) ++ return; ++ ++ info->request->metadata().merge(metadata); ++ info->metadataProcessed = true; ++ ++ pipe()->tryCompleteRequest(info); ++} ++ ++void DcmippCameraData::setSensorControls([[maybe_unused]] unsigned int id, ++ const ControlList &sensorControls) ++{ ++ LOG(DCMIPP, Debug) << "Function: " << __func__; ++ ++ ControlList ctrls = sensorControls; ++ ++ int ret = sensor_->setControls(&ctrls); ++ if (ret) ++ LOG(DCMIPP, Error) << "Failed to set sensor controls: " << ret; ++} ++ ++void DcmippCameraData::setIspControls([[maybe_unused]] unsigned int id, ++ const ControlList &ispControls) ++{ ++ PipelineHandlerDcmipp *pipe = ++ static_cast(Camera::Private::pipe()); ++ ++ LOG(DCMIPP, Debug) << "Function: " << __func__; ++ ++ ControlList ctrls = ispControls; ++ ++ int ret = pipe->stats_->setControls(&ctrls); ++ if (ret) ++ LOG(DCMIPP, Error) << "Failed to set ISP controls: " << ret; ++} ++ ++void DcmippCameraData::setPostprocControls([[maybe_unused]] unsigned int id, ++ const ControlList &postprocControls) ++{ ++ PipelineHandlerDcmipp *pipe = ++ static_cast(Camera::Private::pipe()); ++ ++ LOG(DCMIPP, Debug) << "Function: " << __func__; ++ ++ int ret = pipe->mainPath_.setControls(postprocControls); ++ if (ret) ++ LOG(DCMIPP, Error) << "Failed to set main postproc controls: " << ret; ++ ++ ret = pipe->auxPath_.setControls(postprocControls); ++ if (ret) ++ LOG(DCMIPP, Error) << "Failed to set aux postproc controls: " << ret; ++} ++ ++ ++REGISTER_PIPELINE_HANDLER(PipelineHandlerDcmipp, "dcmipp") ++ ++} /* namespace libcamera */ +diff --git a/src/libcamera/pipeline/dcmipp/dcmipp.h b/src/libcamera/pipeline/dcmipp/dcmipp.h +new file mode 100644 +index 00000000..eaa668f3 +--- /dev/null ++++ b/src/libcamera/pipeline/dcmipp/dcmipp.h +@@ -0,0 +1,120 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024, ST Microelectronics ++ * ++ * dcmipp.h - STM32 DCMIPP common definitions ++ */ ++ ++#pragma once ++ ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "libcamera/internal/media_object.h" ++#include "libcamera/internal/v4l2_videodevice.h" ++ ++namespace libcamera { ++ ++class CameraSensor; ++class MediaDevice; ++class V4L2Subdevice; ++struct StreamConfiguration; ++struct V4L2SubdeviceFormat; ++ ++class DcmippPath ++{ ++public: ++ DcmippPath(const char *name); ++ DcmippPath(const char *name, const Span &formats); ++ ++ bool init(MediaDevice *media); ++ ++ int setEnabled(bool enable); ++ bool isEnabled() const { return enabled_; } ++ int setControls(const ControlList &postprocControls); ++ ++ StreamConfiguration generateConfiguration(const CameraSensor *sensor, ++ const Size &maxSize, ++ PixelFormat rolePixelFormat); ++ CameraConfiguration::Status validate(const CameraSensor *sensor, ++ StreamConfiguration *cfg, ++ unsigned int isp_decimation_ratio); ++ ++ int configure(const StreamConfiguration &config, ++ const V4L2SubdeviceFormat &inputFormat, ++ unsigned int isp_decimation_ratio); ++ ++ int exportBuffers(unsigned int bufferCount, ++ std::vector> *buffers) ++ { ++ return video_->exportBuffers(bufferCount, buffers); ++ } ++ ++ int start(); ++ void stop(); ++ ++ int queueBuffer(FrameBuffer *buffer) { return video_->queueBuffer(buffer); } ++ Signal &bufferReady() { return video_->bufferReady; } ++ ++private: ++ void populateFormats(); ++ ++ static constexpr unsigned int DCMIPP_BUFFER_COUNT = 4; ++ ++ const char *name_; ++ bool enabled_; ++ bool running_; ++ ++ const Span pathFormats_; ++ ++ std::unique_ptr input_; ++ std::unique_ptr isp_; ++ std::unique_ptr postproc_; ++ std::unique_ptr video_; ++ ++ unsigned int input_source_pad_; ++ ++ MediaLink *link_; ++ unsigned int bufferCount_; ++}; ++ ++class DcmippDumpPath : public DcmippPath ++{ ++public: ++ DcmippDumpPath(); ++}; ++ ++class DcmippMainPath : public DcmippPath ++{ ++public: ++ DcmippMainPath(); ++}; ++ ++class DcmippAuxPath : public DcmippPath ++{ ++public: ++ DcmippAuxPath(); ++}; ++ ++} /* namespace libcamera */ ++ ++#define DCMIPP_V4L2_BUFFER_NB 4 ++ ++#define DCMIPP_RAW_MAX_WIDTH 2688 ++ ++/* ++ * DCMIPP driver does not output statistics frames from the very beginning. ++ * This depends on the profile being selected via the STAT_PROFILE control, ++ * however in order to keep the pipeline handler code simpler, set the longest ++ * delay here, which leads to libcamera not trying to get statistics from the ++ * DCMIPP driver during the first requests ++ */ ++#define DCMIPP_STATS_FRAME_DELAY 10 +diff --git a/src/libcamera/pipeline/dcmipp/dcmipp_path.cpp b/src/libcamera/pipeline/dcmipp/dcmipp_path.cpp +new file mode 100644 +index 00000000..7f053792 +--- /dev/null ++++ b/src/libcamera/pipeline/dcmipp/dcmipp_path.cpp +@@ -0,0 +1,496 @@ ++/* SPDX-License-Identifier: LGPL-2.1-or-later */ ++/* ++ * Copyright (C) 2024, ST Microelectronics ++ * ++ * dcmipp_path.cpp - STM32 DCMIPP path helper ++ * Based on rkisp1_path.cpp ++ */ ++ ++#include "dcmipp.h" ++ ++#include ++ ++#include ++#include ++ ++#include "libcamera/internal/camera_sensor.h" ++#include "libcamera/internal/media_device.h" ++#include "libcamera/internal/v4l2_subdevice.h" ++#include "libcamera/internal/v4l2_videodevice.h" ++ ++namespace libcamera { ++ ++LOG_DECLARE_CATEGORY(DCMIPP) ++ ++namespace { ++ ++constexpr std::array pixelformats_dump{ ++ formats::RGB565, ++ formats::YUYV, ++ formats::YVYU, ++ formats::UYVY, ++ formats::VYUY, ++ formats::R8, ++ formats::SBGGR8, ++ formats::SGBRG8, ++ formats::SGRBG8, ++ formats::SRGGB8, ++ formats::SBGGR10, ++ formats::SGBRG10, ++ formats::SGRBG10, ++ formats::SRGGB10, ++ formats::SBGGR12, ++ formats::SGBRG12, ++ formats::SGRBG12, ++ formats::SRGGB12, ++ formats::SBGGR14, ++ formats::SGBRG14, ++ formats::SGRBG14, ++ formats::SRGGB14, ++ formats::SBGGR16, ++ formats::SGBRG16, ++ formats::SGRBG16, ++ formats::SRGGB16, ++ formats::MJPEG, ++}; ++ ++constexpr std::array pixelformats_main{ ++ formats::RGB565, ++ formats::YUYV, ++ formats::YVYU, ++ formats::UYVY, ++ formats::VYUY, ++ formats::R8, ++ formats::RGB888, ++ formats::BGR888, ++ formats::NV12, ++ formats::NV21, ++ formats::NV16, ++ formats::NV61, ++ formats::YUV420, ++ formats::YVU420, ++}; ++ ++/* ++ * Since we only concentrate on RAW input and AUX doesn't have ++ * RGB to YUV conversion, AUX will only output RGB formats ++ * until we also add support for non-raw sensors. ++ */ ++constexpr std::array pixelformats_aux{ ++ formats::RGB565, ++ formats::RGB888, ++ formats::BGR888, ++}; ++ ++const std::map formatToMediaBus = { ++ { formats::RGB565, MEDIA_BUS_FMT_RGB888_1X24 }, ++ { formats::YUYV, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::YVYU, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::UYVY, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::VYUY, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::R8, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::RGB888, MEDIA_BUS_FMT_RGB888_1X24 }, ++ { formats::BGR888, MEDIA_BUS_FMT_RGB888_1X24 }, ++ { formats::ARGB8888, MEDIA_BUS_FMT_RGB888_1X24 }, ++ { formats::AVUY8888, MEDIA_BUS_FMT_RGB888_1X24 }, ++ { formats::NV12, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::NV21, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::NV16, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::NV61, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::YUV420, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::YVU420, MEDIA_BUS_FMT_YUV8_1X24 }, ++ { formats::SBGGR8, MEDIA_BUS_FMT_SBGGR8_1X8 }, ++ { formats::SGBRG8, MEDIA_BUS_FMT_SGBRG8_1X8 }, ++ { formats::SGRBG8, MEDIA_BUS_FMT_SGRBG8_1X8 }, ++ { formats::SRGGB8, MEDIA_BUS_FMT_SRGGB8_1X8 }, ++ { formats::SBGGR10, MEDIA_BUS_FMT_SBGGR10_1X10 }, ++ { formats::SGBRG10, MEDIA_BUS_FMT_SGBRG10_1X10 }, ++ { formats::SGRBG10, MEDIA_BUS_FMT_SGRBG10_1X10 }, ++ { formats::SRGGB10, MEDIA_BUS_FMT_SRGGB10_1X10 }, ++ { formats::SBGGR12, MEDIA_BUS_FMT_SBGGR12_1X12 }, ++ { formats::SGBRG12, MEDIA_BUS_FMT_SGBRG12_1X12 }, ++ { formats::SGRBG12, MEDIA_BUS_FMT_SGRBG12_1X12 }, ++ { formats::SRGGB12, MEDIA_BUS_FMT_SRGGB12_1X12 }, ++ { formats::SBGGR14, MEDIA_BUS_FMT_SBGGR14_1X14 }, ++ { formats::SGBRG14, MEDIA_BUS_FMT_SGBRG14_1X14 }, ++ { formats::SGRBG14, MEDIA_BUS_FMT_SGRBG14_1X14 }, ++ { formats::SRGGB14, MEDIA_BUS_FMT_SRGGB14_1X14 }, ++ { formats::SBGGR16, MEDIA_BUS_FMT_SBGGR16_1X16 }, ++ { formats::SGBRG16, MEDIA_BUS_FMT_SGBRG16_1X16 }, ++ { formats::SGRBG16, MEDIA_BUS_FMT_SGRBG16_1X16 }, ++ { formats::SRGGB16, MEDIA_BUS_FMT_SRGGB16_1X16 }, ++ { formats::MJPEG, MEDIA_BUS_FMT_JPEG_1X8 }, ++}; ++ ++} /* namespace */ ++ ++DcmippPath::DcmippPath(const char *name) ++ : name_(name), enabled_(false), running_(false), input_source_pad_(1), link_(nullptr) ++{ ++} ++ ++DcmippPath::DcmippPath(const char *name, const Span &formats) ++ : name_(name), enabled_(false), running_(false), pathFormats_(formats), input_source_pad_(1), link_(nullptr) ++{ ++} ++ ++int DcmippPath::setEnabled(bool enable) ++{ ++ enabled_ = enable; ++ ++ if (link_->flags() & MEDIA_LNK_FL_IMMUTABLE) ++ return 0; ++ ++ return link_->setEnabled(enable); ++} ++ ++bool DcmippPath::init(MediaDevice *media) ++{ ++ std::string postproc = std::string("dcmipp_") + name_ + "_postproc"; ++ std::string video = std::string("dcmipp_") + name_ + "_capture"; ++ ++ LOG(DCMIPP, Debug) << "DcmippPath::init " << name_; ++ ++ input_ = V4L2Subdevice::fromEntityName(media, "dcmipp_input"); ++ if (input_->open() < 0) ++ return false; ++ ++ postproc_ = V4L2Subdevice::fromEntityName(media, postproc); ++ if (postproc_->open() < 0) ++ return false; ++ ++ video_ = V4L2VideoDevice::fromEntityName(media, video); ++ if (video_->open() < 0) ++ return false; ++ ++ if (name_ == std::string("dump")) { ++ link_ = media->link("dcmipp_input", 1, "dcmipp_dump_postproc", 0); ++ if (!link_) ++ return false; ++ input_source_pad_ = 1; ++ } else if (name_ == std::string("main")) { ++ isp_ = V4L2Subdevice::fromEntityName(media, "dcmipp_main_isp"); ++ if (isp_->open() < 0) ++ return false; ++ link_ = media->link("dcmipp_input", 2, "dcmipp_main_isp", 0); ++ if (!link_) ++ return false; ++ input_source_pad_ = 2; ++ } else if (name_ == std::string("aux")) { ++ link_ = media->link("dcmipp_main_isp", 1, "dcmipp_aux_postproc", 0); ++ if (!link_) ++ return false; ++ input_source_pad_ = 3; ++ } ++ ++ return true; ++} ++ ++/* ++ * This function is in charge of ++ * - list up all configuration that could be achieved by a path, taking into ++ * consideration sensor format, decimate of the ISP block, decimate / downsize ++ * of the postproc block and color conversion of the main pipe then available ++ * formats of the pixel cap video device ++ * - set a default configuration depending on the role, that matches the above ++ * constraint as well ++ * - as far as the Dump pipe is concerned, this is a matter of checking the ++ * sensor pipe & and bytecap available formats ++ * - we should not care about role at the path level, the decision being done ++ * at upper level ++ */ ++StreamConfiguration ++DcmippPath::generateConfiguration(const CameraSensor *sensor, const Size &maxSize, ++ PixelFormat rolePixelFormat) ++{ ++ const std::vector &mbusCodes = sensor->mbusCodes(); ++ Size resolution = sensor->resolution(); ++ Size minSize; ++ ++ LOG(DCMIPP, Debug) << "DcmippPath::generateConfiguration " << name_; ++ ++ /* ++ * For Main & Aux pipe postproc can perform decimate-downsize hence 8 * 8 reduction ++ * ++ * ISP decimation can also perform a maximum of 8 reduction. It is also mandatory ++ * to ensure that RAW frame size does not exceed 2688 width prior demosaicing. ++ */ ++ if (name_ != std::string("dump")) { ++ /* Ensure to not exceed maximum width for demosaicing */ ++ while (resolution.width > DCMIPP_RAW_MAX_WIDTH) ++ resolution /= 2; ++ ++ minSize = sensor->resolution() / (8 * 8 * 8); ++ minSize.expandTo({ 16, minSize.height }); ++ } ++ ++ std::map> formats; ++ ++ for (const auto &format : pathFormats_) { ++ const PixelFormatInfo &info = PixelFormatInfo::info(format); ++ ++ if (name_ != std::string("dump")) { ++ /* Handling of Pixel pipes (Main / Aux) */ ++ std::vector sizesRange{ ++ SizeRange{ minSize, resolution } ++ }; ++ formats[format] = std::move(sizesRange); ++ continue; ++ } else if (name_ == std::string("dump") && ++ info.colourEncoding == PixelFormatInfo::ColourEncodingRAW) { ++ /* Handling of Byte pipe (Dump) exclusively for RAW formats */ ++ uint32_t mbusCode = formatToMediaBus.at(format); ++ if (std::find(mbusCodes.begin(), mbusCodes.end(), mbusCode) == ++ mbusCodes.end()) ++ /* Skip formats not supported by sensor. */ ++ continue; ++ else ++ rolePixelFormat = format; ++ ++ /* ++ * \todo DUMP pipe is also able to perform byte based reduction ++ * by skipping lines or bytes ++ * */ ++ formats[format] = { resolution, resolution }; ++ } ++ } ++ ++ StreamConfiguration cfg(formats); ++ cfg.size = maxSize; ++ cfg.pixelFormat = rolePixelFormat; ++ cfg.bufferCount = DCMIPP_V4L2_BUFFER_NB; ++ ++ return cfg; ++} ++ ++CameraConfiguration::Status DcmippPath::validate(const CameraSensor *sensor, ++ StreamConfiguration *cfg, ++ unsigned int isp_decimation_ratio) ++{ ++ bool format_found = false; ++ ++ LOG(DCMIPP, Debug) << "DcmippPath::validate " << name_; ++ ++ /* Check that configured size can be achieved */ ++ Size post_isp_resolution = sensor->resolution(); ++ ++ /* ++ * For Main & Aux pipe postproc can perform decimate-downsize hence 8 * 8 reduction ++ * ++ * ISP decimation can also perform a maximum of 8 reduction. It is also mandatory ++ * to ensure that RAW frame size does not exceed 2688 width prior demosaicing. ++ */ ++ if (name_ != std::string("dump")) { ++ /* ++ * Ensure that the isp output resolution is still larger or equal to ++ * requested size ++ */ ++ post_isp_resolution /= isp_decimation_ratio; ++ ++ if (post_isp_resolution.width < cfg->size.width || ++ post_isp_resolution.height < cfg->size.height) { ++ LOG(DCMIPP, Error) << "Can't reach requested resolution of " << cfg->size << " since ISP output resolution is " << post_isp_resolution; ++ return CameraConfiguration::Invalid; ++ } ++ } ++ ++ for (const auto &format : pathFormats_) { ++ if (format == cfg->pixelFormat) { ++ format_found = true; ++ break; ++ } ++ } ++ ++ if (!format_found) ++ return CameraConfiguration::Invalid; ++ ++ V4L2DeviceFormat format; ++ format.fourcc = video_->toV4L2PixelFormat(cfg->pixelFormat); ++ format.size = cfg->size; ++ ++ int ret = video_->tryFormat(&format); ++ if (ret) ++ return CameraConfiguration::Invalid; ++ ++ cfg->stride = format.planes[0].bpl; ++ cfg->frameSize = format.planes[0].size; ++ ++ return CameraConfiguration::Valid; ++} ++ ++int DcmippPath::configure(const StreamConfiguration &config, ++ const V4L2SubdeviceFormat &inputFormat, ++ unsigned int isp_decimation_ratio) ++{ ++ int ret; ++ V4L2SubdeviceFormat subformat = inputFormat; ++ ++ LOG(DCMIPP, Debug) << "DcmippPath::configure " << name_; ++ LOG(DCMIPP, Debug) << "Configuration: Size: " << config.size << " pixelFormat: " << config.pixelFormat << " bufferCount: " << config.bufferCount; ++ ++ ret = input_->setFormat(input_source_pad_, &subformat); ++ if (ret < 0) ++ return ret; ++ ++ if (name_ == std::string("dump")) { ++ /* Configuration of the postproc block */ ++ ret = postproc_->setFormat(0, &subformat); ++ if (ret) ++ return ret; ++ ret = postproc_->setFormat(1, &subformat); ++ if (ret) ++ return ret; ++ LOG(DCMIPP, Debug) ++ << "Configured pipe " << name_ << " with format " << subformat; ++ } else if (name_ == std::string("main")) { ++ /* Configuration of the ISP block */ ++ ret = isp_->setFormat(0, &subformat); ++ if (ret) ++ return ret; ++ ++ subformat.code = MEDIA_BUS_FMT_RGB888_1X24; ++ subformat.size /= isp_decimation_ratio; ++ Rectangle compose_isp{ 0, 0, subformat.size }; ++ ret = isp_->setSelection(0, V4L2_SEL_TGT_COMPOSE, &compose_isp); ++ if (ret) ++ return ret; ++ ++ LOG(DCMIPP, Debug) ++ << "Configured pipe " << name_ << " with ISP output format " ++ << subformat; ++ ++ /* Configuration of the postproc block */ ++ ret = postproc_->setFormat(0, &subformat); ++ if (ret) ++ return ret; ++ ++ /* This should not happen since config.pixelFormat has already been validated */ ++ if (formatToMediaBus.find(config.pixelFormat) == formatToMediaBus.end()) ++ return -EINVAL; ++ ++ subformat.code = formatToMediaBus.find(config.pixelFormat)->second; ++ ret = postproc_->setFormat(1, &subformat); ++ if (ret) ++ return ret; ++ ++ Rectangle compose{ 0, 0, config.size }; ++ ret = postproc_->setSelection(0, V4L2_SEL_TGT_COMPOSE, &compose); ++ if (ret) ++ return ret; ++ ++ LOG(DCMIPP, Debug) ++ << "Configured pipe " << name_ << " with format input format " ++ << inputFormat << " and output format " << subformat; ++ } else if (name_ == std::string("aux")) { ++ subformat.code = MEDIA_BUS_FMT_RGB888_1X24; ++ subformat.size /= isp_decimation_ratio; ++ ++ /* Configuration of the postproc block */ ++ ret = postproc_->setFormat(0, &subformat); ++ if (ret) ++ return ret; ++ Rectangle compose{ 0, 0, config.size }; ++ ret = postproc_->setSelection(0, V4L2_SEL_TGT_COMPOSE, &compose); ++ if (ret) ++ return ret; ++ ++ /* This should not happen since config.pixelFormat has already been validated */ ++ if (formatToMediaBus.find(config.pixelFormat) == formatToMediaBus.end()) ++ return -EINVAL; ++ ++ subformat.code = formatToMediaBus.find(config.pixelFormat)->second; ++ ret = postproc_->setFormat(1, &subformat); ++ if (ret) ++ return ret; ++ ++ LOG(DCMIPP, Debug) ++ << "Configured pipe " << name_ << " with output format " ++ << subformat; ++ } ++ ++ const PixelFormatInfo &info = PixelFormatInfo::info(config.pixelFormat); ++ V4L2DeviceFormat outputFormat; ++ outputFormat.fourcc = video_->toV4L2PixelFormat(config.pixelFormat); ++ outputFormat.size = config.size; ++ outputFormat.planesCount = info.numPlanes(); ++ ++ ret = video_->setFormat(&outputFormat); ++ if (ret) ++ return ret; ++ ++ bufferCount_ = config.bufferCount; ++ ++ return 0; ++} ++ ++int DcmippPath::setControls(const ControlList &postprocControls) ++{ ++ LOG(DCMIPP, Debug) << "Function: " << __func__; ++ ++ ControlList ctrls = postprocControls; ++ ++ int ret = postproc_->setControls(&ctrls); ++ if (ret) ++ LOG(DCMIPP, Error) << "Failed to set postproc controls: " << ret; ++ ++ return ret; ++} ++ ++int DcmippPath::start() ++{ ++ int ret; ++ ++ LOG(DCMIPP, Debug) << "DcmippPath::start " << name_; ++ ++ if (running_) ++ return -EBUSY; ++ ++ ret = video_->importBuffers(bufferCount_); ++ if (ret) ++ return ret; ++ ++ ret = video_->streamOn(); ++ if (ret) { ++ LOG(DCMIPP, Error) ++ << "Failed to start " << name_ << " path"; ++ ++ video_->releaseBuffers(); ++ return ret; ++ } ++ ++ running_ = true; ++ ++ return 0; ++} ++ ++void DcmippPath::stop() ++{ ++ LOG(DCMIPP, Debug) << "DcmippPath::stop " << name_; ++ ++ if (!running_) ++ return; ++ ++ if (video_->streamOff()) ++ LOG(DCMIPP, Warning) << "Failed to stop " << name_ << " path"; ++ ++ video_->releaseBuffers(); ++ ++ running_ = false; ++} ++ ++DcmippDumpPath::DcmippDumpPath() ++ : DcmippPath("dump", pixelformats_dump) ++{ ++} ++ ++DcmippMainPath::DcmippMainPath() ++ : DcmippPath("main", pixelformats_main) ++{ ++} ++ ++DcmippAuxPath::DcmippAuxPath() ++ : DcmippPath("aux", pixelformats_aux) ++{ ++} ++ ++} /* namespace libcamera */ +diff --git a/src/libcamera/pipeline/dcmipp/meson.build b/src/libcamera/pipeline/dcmipp/meson.build +new file mode 100644 +index 00000000..4f1555d9 +--- /dev/null ++++ b/src/libcamera/pipeline/dcmipp/meson.build +@@ -0,0 +1,5 @@ ++# SPDX-License-Identifier: CC0-1.0 ++ ++libcamera_sources += files([ ++ 'dcmipp.cpp', 'dcmipp_path.cpp' ++]) +diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp +index 4a2048cf..3131243a 100644 +--- a/src/libcamera/v4l2_device.cpp ++++ b/src/libcamera/v4l2_device.cpp +@@ -334,7 +334,13 @@ int V4L2Device::setControls(ControlList *ctrls) + + default: + /* \todo To be changed to support strings. */ +- v4l2Ctrl.value = value.get(); ++ if (value.isArray()) { ++ Span data = value.data(); ++ v4l2Ctrl.p_u32 = reinterpret_cast(data.data()); ++ v4l2Ctrl.size = data.size(); ++ } else { ++ v4l2Ctrl.value = value.get(); ++ } + break; + } + } +@@ -553,9 +559,13 @@ std::optional V4L2Device::v4l2ControlInfo(const v4l2_query_ext_ctrl + return v4l2MenuControlInfo(ctrl); + + default: +- return ControlInfo(static_cast(ctrl.minimum), +- static_cast(ctrl.maximum), +- static_cast(ctrl.default_value)); ++ if (ctrl.type >= V4L2_CTRL_COMPOUND_TYPES) ++ /* ControlInfo "None" for such control */ ++ return ControlInfo(); ++ else ++ return ControlInfo(static_cast(ctrl.minimum), ++ static_cast(ctrl.maximum), ++ static_cast(ctrl.default_value)); + } + } + +@@ -627,6 +637,8 @@ void V4L2Device::listControls() + break; + /* \todo Support other control types. */ + default: ++ if (ctrl.type >= V4L2_CTRL_COMPOUND_TYPES) ++ break; + LOG(V4L2, Debug) + << "Control " << utils::hex(ctrl.id) + << " has unsupported type " << ctrl.type; +-- +2.43.0 + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0001-media_device-Add-bool-return-type-to-unlock.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0001-media_device-Add-bool-return-type-to-unlock.patch new file mode 100644 index 000000000..12f034eff --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0001-media_device-Add-bool-return-type-to-unlock.patch @@ -0,0 +1,59 @@ +From 6914c4fd3d53c0c6ea304123bf57429bb64ec16f Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 31 Jan 2024 21:01:27 -0800 +Subject: [PATCH 1/2] media_device: Add bool return type to unlock() + +unlock uses lockf which is marked with __attribute__ +((warn_unused_result)) and compilers warn about it and some treat +-Wunused-result as error with -Werror turned on, It would be good to +check if lockf failed or succeeded, however, that piece is not changed +with this, this fixes build with clang++ 18 + + ../git/src/libcamera/media_device.cpp:167:2: error: ignoring return value of function declared with 'warn_unused_result' attribute [-Werror,-Wunused-result] + 167 | lockf(fd_.get(), F_ULOCK, 0); + | ^~~~~ ~~~~~~~~~~~~~~~~~~~~~ + 1 error generated. + +Upstream-Status: Submitted [https://lists.libcamera.org/pipermail/libcamera-devel/2024-February/040380.html] +Signed-off-by: Khem Raj +--- + include/libcamera/internal/media_device.h | 2 +- + src/libcamera/media_device.cpp | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/include/libcamera/internal/media_device.h b/include/libcamera/internal/media_device.h +index eb8cfde4..b09dfd16 100644 +--- a/include/libcamera/internal/media_device.h ++++ b/include/libcamera/internal/media_device.h +@@ -33,7 +33,7 @@ public: + bool busy() const { return acquired_; } + + bool lock(); +- void unlock(); ++ bool unlock(); + + int populate(); + bool isValid() const { return valid_; } +diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp +index 2949816b..eaa2fdb0 100644 +--- a/src/libcamera/media_device.cpp ++++ b/src/libcamera/media_device.cpp +@@ -159,12 +159,12 @@ bool MediaDevice::lock() + * + * \sa lock() + */ +-void MediaDevice::unlock() ++bool MediaDevice::unlock() + { + if (!fd_.isValid()) +- return; ++ return false; + +- lockf(fd_.get(), F_ULOCK, 0); ++ return lockf(fd_.get(), F_ULOCK, 0) == 0; + } + + /** +-- +2.43.0 + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0001-rpi-Use-alloca-instead-of-variable-length-arrays.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0001-rpi-Use-alloca-instead-of-variable-length-arrays.patch new file mode 100644 index 000000000..c336e9254 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0001-rpi-Use-alloca-instead-of-variable-length-arrays.patch @@ -0,0 +1,43 @@ +From 11cc6dbd45f0880beea64cdc514f57484b90bc39 Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Tue, 20 Feb 2024 18:44:23 -0800 +Subject: [PATCH] rpi: Use malloc instead of variable length arrays + +Clang-18+ diagnoses this as error + +| ../git/src/ipa/rpi/controller/rpi/alsc.cpp:499:10: error: variable length arrays in C++ are a Clang extension [-Werror,-Wvla-cxx-extension] | 499 | int xLo[X], xHi[X]; +| | ^ + +Upstream-Status: Submitted [https://lists.libcamera.org/pipermail/libcamera-devel/2024-February/040529.html] +Signed-off-by: Khem Raj + +s +--- + src/ipa/rpi/controller/rpi/alsc.cpp | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/src/ipa/rpi/controller/rpi/alsc.cpp b/src/ipa/rpi/controller/rpi/alsc.cpp +index 8a205c60..a7d42614 100644 +--- a/src/ipa/rpi/controller/rpi/alsc.cpp ++++ b/src/ipa/rpi/controller/rpi/alsc.cpp +@@ -496,8 +496,8 @@ void resampleCalTable(const Array2D &calTableIn, + * Precalculate and cache the x sampling locations and phases to save + * recomputing them on every row. + */ +- int xLo[X], xHi[X]; +- double xf[X]; ++ int *xLo = (int*)malloc(X), *xHi = (int*)malloc(X); ++ double *xf = (double*)malloc(X); + double scaleX = cameraMode.sensorWidth / + (cameraMode.width * cameraMode.scaleX); + double xOff = cameraMode.cropX / (double)cameraMode.sensorWidth; +@@ -539,6 +539,9 @@ void resampleCalTable(const Array2D &calTableIn, + *(out++) = above * (1 - yf) + below * yf; + } + } ++ free(xf); ++ free(xHi); ++ free(xLo); + } + + /* Calculate chrominance statistics (R/G and B/G) for each region. */ diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0002-dcmipp-Fix-configureAwbAlgo-encapsulation-under-EVIS.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0002-dcmipp-Fix-configureAwbAlgo-encapsulation-under-EVIS.patch new file mode 100644 index 000000000..c454b1d49 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0002-dcmipp-Fix-configureAwbAlgo-encapsulation-under-EVIS.patch @@ -0,0 +1,33 @@ +From: Arturo Buzarra +Date: Wed, 19 Nov 2025 11:58:43 +0100 +Subject: [PATCH] dcmipp: Fix configureAwbAlgo() encapsulation under + EVISION_ALGO_ENABLED + +Awb::queueRequest() unconditionally calls configureAwbAlgo(), but it is +compiled only when EVISION_ALGO_ENABLED is defined. With EVISION_ALGO_ENABLED +disabled, this leads to an undefined symbol at runtime when loading the DCMIPP +IPA. This commit guards the call under EVISION_ALGO_ENABLED so that non-EVISION +builds no longer reference the helper. + +Signed-off-by: Arturo Buzarra +--- + src/ipa/dcmipp/algorithms/awb.cpp | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/ipa/dcmipp/algorithms/awb.cpp b/src/ipa/dcmipp/algorithms/awb.cpp +index 006ad4b8..4444ac98 100644 +--- a/src/ipa/dcmipp/algorithms/awb.cpp ++++ b/src/ipa/dcmipp/algorithms/awb.cpp +@@ -652,10 +652,12 @@ void Awb::queueRequest([[maybe_unused]] IPAContext &context, + LOG(DcmippAwb, Debug) << "Updating AwbColourConv to " << (*cconv)[0] << "..."; + } + ++#ifdef EVISION_ALGO_ENABLED + if (internal_.profileDirty && !configureAwbAlgo()) { + LOG(DcmippAwb, Error) << "Cannot reconfigure awb algorithm"; + return; + } ++#endif /* EVISION_ALGO_ENABLED */ + + /* Static config: update params_ and if applicable force config_ update now */ + const auto &customColorTemp = controls.get(controls::draft::AwbCustomColorTemperature); diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0002-options-Replace-use-of-VLAs-in-C.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0002-options-Replace-use-of-VLAs-in-C.patch new file mode 100644 index 000000000..473820653 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/files/0002-options-Replace-use-of-VLAs-in-C.patch @@ -0,0 +1,128 @@ +From 6e4736180fcaffdb06acf52fd3eb50ba5baa3d2a Mon Sep 17 00:00:00 2001 +From: Khem Raj +Date: Wed, 31 Jan 2024 21:04:28 -0800 +Subject: [PATCH] options: Replace use of VLAs in C++ + +Clang++ 18 is fussy about this with new warning checks. + + ../git/src/apps/common/options.cpp:882:20: error: variable length arrays in C++ are a Clang extension [-Werror,-Wvla-cxx-extension] + 882 | char shortOptions[optionsMap_.size() * 3 + 2]; + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ + +Therefore replace using VLAs with alloca and malloc/free + +Upstream-Status: Submitted [https://lists.libcamera.org/pipermail/libcamera-devel/2024-February/040381.html] +Signed-off-by: Khem Raj +--- + src/apps/common/options.cpp | 12 ++++++++++-- + src/libcamera/ipc_unixsocket.cpp | 13 +++++++++---- + 2 files changed, 19 insertions(+), 6 deletions(-) + +diff --git a/src/apps/common/options.cpp b/src/apps/common/options.cpp +index 4f7e8691..3656f3c1 100644 +--- a/src/apps/common/options.cpp ++++ b/src/apps/common/options.cpp +@@ -879,8 +879,8 @@ OptionsParser::Options OptionsParser::parse(int argc, char **argv) + * Allocate short and long options arrays large enough to contain all + * options. + */ +- char shortOptions[optionsMap_.size() * 3 + 2]; +- struct option longOptions[optionsMap_.size() + 1]; ++ char *shortOptions = (char*)malloc(optionsMap_.size() * 3 + 2); ++ struct option *longOptions = (struct option*)malloc(sizeof(struct option) * (optionsMap_.size() + 1)); + unsigned int ids = 0; + unsigned int idl = 0; + +@@ -935,12 +935,16 @@ OptionsParser::Options OptionsParser::parse(int argc, char **argv) + std::cerr << argv[optind - 1] << std::endl; + + usage(); ++ free(shortOptions); ++ free(longOptions); + return options; + } + + const Option &option = *optionsMap_[c]; + if (!parseValue(option, optarg, &options)) { + usage(); ++ free(shortOptions); ++ free(longOptions); + return options; + } + } +@@ -949,10 +953,14 @@ OptionsParser::Options OptionsParser::parse(int argc, char **argv) + std::cerr << "Invalid non-option argument '" << argv[optind] + << "'" << std::endl; + usage(); ++ free(shortOptions); ++ free(longOptions); + return options; + } + + options.valid_ = true; ++ free(shortOptions); ++ free(longOptions); + return options; + } + +diff --git a/src/libcamera/ipc_unixsocket.cpp b/src/libcamera/ipc_unixsocket.cpp +index 1980d374..3bd861cb 100644 +--- a/src/libcamera/ipc_unixsocket.cpp ++++ b/src/libcamera/ipc_unixsocket.cpp +@@ -8,6 +8,7 @@ + #include "libcamera/internal/ipc_unixsocket.h" + + #include ++#include + #include + #include + #include +@@ -247,8 +248,8 @@ int IPCUnixSocket::sendData(const void *buffer, size_t length, + iov[0].iov_base = const_cast(buffer); + iov[0].iov_len = length; + +- char buf[CMSG_SPACE(num * sizeof(uint32_t))]; +- memset(buf, 0, sizeof(buf)); ++ char *buf = (char*)malloc(CMSG_SPACE(num * sizeof(uint32_t))); ++ memset((void*)buf, 0, sizeof(buf)); + + struct cmsghdr *cmsg = (struct cmsghdr *)buf; + cmsg->cmsg_len = CMSG_LEN(num * sizeof(uint32_t)); +@@ -270,9 +271,11 @@ int IPCUnixSocket::sendData(const void *buffer, size_t length, + int ret = -errno; + LOG(IPCUnixSocket, Error) + << "Failed to sendmsg: " << strerror(-ret); ++ free(buf); + return ret; + } + ++ free(buf); + return 0; + } + +@@ -283,8 +286,8 @@ int IPCUnixSocket::recvData(void *buffer, size_t length, + iov[0].iov_base = buffer; + iov[0].iov_len = length; + +- char buf[CMSG_SPACE(num * sizeof(uint32_t))]; +- memset(buf, 0, sizeof(buf)); ++ char *buf = (char*)malloc(CMSG_SPACE(num * sizeof(uint32_t))); ++ memset((void*)buf, 0, sizeof(buf)); + + struct cmsghdr *cmsg = (struct cmsghdr *)buf; + cmsg->cmsg_len = CMSG_LEN(num * sizeof(uint32_t)); +@@ -305,12 +308,14 @@ int IPCUnixSocket::recvData(void *buffer, size_t length, + if (ret != -EAGAIN) + LOG(IPCUnixSocket, Error) + << "Failed to recvmsg: " << strerror(-ret); ++ free(buf); + return ret; + } + + if (fds) + memcpy(fds, CMSG_DATA(cmsg), num * sizeof(uint32_t)); + ++ free(buf); + return 0; + } + diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/libcamera-stm32mp_0.3.0.bb b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/libcamera-stm32mp_0.3.0.bb new file mode 100644 index 000000000..086788731 --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-multimedia/libcamera/libcamera-stm32mp_0.3.0.bb @@ -0,0 +1,92 @@ +SUMMARY = "Linux libcamera framework" +SECTION = "libs" + +LICENSE = "GPL-2.0-or-later & LGPL-2.1-or-later" + +LIC_FILES_CHKSUM = "\ + file://LICENSES/GPL-2.0-or-later.txt;md5=fed54355545ffd980b814dab4a3b312c \ + file://LICENSES/LGPL-2.1-or-later.txt;md5=2a4f4fd2128ea2f65047ee63fbca9f68 \ +" + +# 0.3.0 +SRC_URI = " \ + git://git.libcamera.org/libcamera/libcamera.git;protocol=https;branch=master \ + file://0001-media_device-Add-bool-return-type-to-unlock.patch \ + file://0002-options-Replace-use-of-VLAs-in-C.patch \ + file://0001-rpi-Use-alloca-instead-of-variable-length-arrays.patch \ +" +SRCREV = "aee16c06913422a0ac84ee3217f87a9795e3c2d9" + +SRC_URI += " \ + file://0001-0.3.0-stm32mp-add-dcmipp-ipa.patch \ + file://0002-dcmipp-Fix-configureAwbAlgo-encapsulation-under-EVIS.patch \ +" +PV = "v0.3.0-stm32mp" + +PROVIDES += "libcamera" + +PE = "1" + +S = "${WORKDIR}/git" + +DEPENDS = "python3-pyyaml-native python3-jinja2-native python3-ply-native python3-jinja2-native udev gnutls chrpath-native libevent libyaml" +DEPENDS += "${@bb.utils.contains('DISTRO_FEATURES', 'qt', 'qtbase qtbase-native', '', d)}" + +PACKAGES =+ "${PN}-gst" + +PACKAGECONFIG ??= "gst python" +PACKAGECONFIG[gst] = "-Dgstreamer=enabled,-Dgstreamer=disabled,gstreamer1.0 gstreamer1.0-plugins-base" +PACKAGECONFIG[python] = "-Dpycamera=enabled,-Dpycamera=disabled,python3-pybind11" + +LIBCAMERA_PIPELINES ??= "dcmipp" +LIBCAMERA_IPAS = "dcmipp" + +EXTRA_OEMESON = " \ + -Dpipelines=${LIBCAMERA_PIPELINES} \ + -Dv4l2=true \ + -Dcam=enabled \ + -Dlc-compliance=disabled \ + -Dtest=false \ + -Ddocumentation=disabled \ +" +EXTRA_OEMESON += " \ + -Dipas=${LIBCAMERA_IPAS} \ +" + + +RDEPENDS:${PN} = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland qt', 'qtwayland', '', d)}" + +inherit meson pkgconfig python3native python3-dir + +do_configure:prepend() { + sed -i -e 's|py_compile=True,||' ${S}/utils/ipc/mojo/public/tools/mojom/mojom/generate/template_expander.py +} + +do_install:append() { + chrpath -d ${D}${libdir}/libcamera.so + chrpath -d ${D}${libexecdir}/libcamera/v4l2-compat.so +} + +do_package:append() { + bb.build.exec_func("do_package_recalculate_ipa_signatures", d) +} + +do_package_recalculate_ipa_signatures() { + local modules + for module in $(find ${PKGD}/usr/lib/libcamera -name "*.so.sign"); do + module="${module%.sign}" + if [ -f "${module}" ] ; then + modules="${modules} ${module}" + fi + done + + ${S}/src/ipa/ipa-sign-install.sh ${B}/src/ipa-priv-key.pem "${modules}" +} + +FILES:${PN} += " ${libexecdir}/libcamera/v4l2-compat.so" +FILES:${PN} += "${datadir} ${libdir} ${PYTHON_SITEPACKAGES_DIR}" +FILES:${PN}-gst = "${libdir}/gstreamer-1.0" + +# libcamera-v4l2 explicitly sets _FILE_OFFSET_BITS=32 to get access to +# both 32 and 64 bit file APIs. +GLIBC_64BIT_TIME_FLAGS = "" diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-client_4.0.bb b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-client_4.0.bb index 0d12e5d77..56cd5d197 100755 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-client_4.0.bb +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-client_4.0.bb @@ -23,7 +23,7 @@ DEPENDS += "util-linux-libuuid" SYSTEMD_SERVICE:${PN} = "tee-supplicant.service" SECURE_STORAGE_PATH ?= "${@oe.utils.vartrue('TRUSTFENCE_FILE_BASED_ENCRYPT', \ - '-DCFG_TEE_FS_PARENT_PATH=/mnt/data/tee', \ + '/mnt/data/tee', \ '${localstatedir}/lib/tee', d)}" EXTRA_OECMAKE = " \ @@ -48,7 +48,11 @@ do_install:append() { install -m 0644 ${WORKDIR}/optee-udev.rules ${D}${sysconfdir}/udev/rules.d/optee.rules install -d -m770 -o root -g tee ${D}${SECURE_STORAGE_PATH} } -FILES:${PN} += "${sysconfdir} ${localstatedir}" +FILES:${PN} += " \ + ${sysconfdir} \ + ${localstatedir} \ + ${@oe.utils.vartrue('TRUSTFENCE_FILE_BASED_ENCRYPT', '/mnt/data/tee', '', d)} \ +" inherit useradd diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-os-stm32mp/0001-ARM-dts-ccmp25-add-signed-firmware-support-for-RPROC.patch b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-os-stm32mp/0001-ARM-dts-ccmp25-add-signed-firmware-support-for-RPROC.patch new file mode 100644 index 000000000..dc1679b5c --- /dev/null +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-os-stm32mp/0001-ARM-dts-ccmp25-add-signed-firmware-support-for-RPROC.patch @@ -0,0 +1,76 @@ +From: Arturo Buzarra +Date: Fri, 31 Oct 2025 09:26:02 +0100 +Subject: [PATCH] ARM: dts: ccmp25: add signed firmware support for RPROC + +Enable device-tree bindings required to load/authenticate signed +Cortex-M33 firmware via remoteproc. + +https://onedigi.atlassian.net/browse/DEL-9813 + +Signed-off-by: Arturo Buzarra +--- + core/arch/arm/dts/ccmp25-dvk-rif.dtsi | 12 ++++++++++++ + core/arch/arm/dts/ccmp25-dvk.dts | 4 ++++ + 2 files changed, 16 insertions(+) + +diff --git a/core/arch/arm/dts/ccmp25-dvk-rif.dtsi b/core/arch/arm/dts/ccmp25-dvk-rif.dtsi +index f2f31dcdf..15121de46 100644 +--- a/core/arch/arm/dts/ccmp25-dvk-rif.dtsi ++++ b/core/arch/arm/dts/ccmp25-dvk-rif.dtsi +@@ -869,6 +869,8 @@ + + &cm33_sram2 { + st,protreg = ; ++ access-controllers-conf-default = <&risab4 RISABPROT(RIF_DDCID_DIS, RIF_UNUSED, RIF_NSEC, RIF_UNUSED, RIF_CFEN, RIF_CID2_BF, RIF_CID2_BF, 0)>; ++ access-controllers-conf-load = <&risab4 RISABPROT(RIF_DDCID_DIS, RIF_UNUSED, RIF_SEC, RIF_PRIV, RIF_CFEN, RIF_CID1_BF, RIF_CID1_BF, RIF_CID1_BF)>; + }; + + &cm33_retram { +@@ -948,22 +950,32 @@ + + &tfm_code { + st,protreg = ; ++ access-controllers-conf-default = <&risaf4 RISAFPROT(RISAF_REG_ID(1), RIF_CID2_BF, RIF_CID2_BF, RIF_UNUSED, RIF_NSEC, RIF_ENC_DIS, RIF_BREN_EN)>; ++ access-controllers-conf-load = <&risaf4 RISAFPROT(RISAF_REG_ID(1), RIF_CID1_BF, RIF_CID1_BF, RIF_PRIV, RIF_SEC, RIF_ENC_DIS, RIF_BREN_EN)>; + }; + + &cm33_cube_fw { + st,protreg = ; ++ access-controllers-conf-default = <&risaf4 RISAFPROT(RISAF_REG_ID(2), RIF_CID2_BF, RIF_CID2_BF, RIF_UNUSED, RIF_NSEC, RIF_ENC_DIS, RIF_BREN_EN)>; ++ access-controllers-conf-load = <&risaf4 RISAFPROT(RISAF_REG_ID(2), RIF_CID1_BF, RIF_CID1_BF, RIF_PRIV, RIF_SEC, RIF_ENC_DIS, RIF_BREN_EN)>; + }; + + &tfm_data { + st,protreg = ; ++ access-controllers-conf-default = <&risaf4 RISAFPROT(RISAF_REG_ID(3), RIF_CID2_BF, RIF_CID2_BF, RIF_UNUSED, RIF_NSEC, RIF_ENC_DIS, RIF_BREN_EN)>; ++ access-controllers-conf-load = <&risaf4 RISAFPROT(RISAF_REG_ID(3), RIF_CID1_BF, RIF_CID1_BF, RIF_PRIV, RIF_SEC, RIF_ENC_DIS, RIF_BREN_EN)>; + }; + + &cm33_cube_data { + st,protreg = ; ++ access-controllers-conf-default = <&risaf4 RISAFPROT(RISAF_REG_ID(4), RIF_CID2_BF, RIF_CID2_BF, RIF_UNUSED, RIF_NSEC, RIF_ENC_DIS, RIF_BREN_EN)>; ++ access-controllers-conf-load = <&risaf4 RISAFPROT(RISAF_REG_ID(4), RIF_CID1_BF, RIF_CID1_BF, RIF_PRIV, RIF_SEC, RIF_ENC_DIS, RIF_BREN_EN)>; + }; + + &ipc_shmem { + st,protreg = ; ++ access-controllers-conf-default = <&risaf4 RISAFPROT(RISAF_REG_ID(5), RIF_CID1_BF|RIF_CID2_BF, RIF_CID1_BF|RIF_CID2_BF, RIF_UNUSED, RIF_NSEC, RIF_ENC_DIS, RIF_BREN_EN)>; ++ access-controllers-conf-load = <&risaf4 RISAFPROT(RISAF_REG_ID(5), RIF_CID1_BF, RIF_CID1_BF, RIF_PRIV, RIF_SEC, RIF_ENC_DIS, RIF_BREN_EN)>; + }; + + &spare1 { +diff --git a/core/arch/arm/dts/ccmp25-dvk.dts b/core/arch/arm/dts/ccmp25-dvk.dts +index 7292b9be8..3ce64ccff 100644 +--- a/core/arch/arm/dts/ccmp25-dvk.dts ++++ b/core/arch/arm/dts/ccmp25-dvk.dts +@@ -437,6 +437,10 @@ + + &m33_rproc { + status = "okay"; ++ compatible = "st,stm32mp2-m33-tee"; ++ memory-region = <&cm33_cube_fw>, <&cm33_cube_data>, ++ <&ipc_shmem>, <&tfm_code>, <&tfm_data>, ++ <&cm33_sram2>; + }; + + &ommanager { diff --git a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-os-stm32mp_4.0.0.bbappend b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-os-stm32mp_4.0.0.bbappend index 244c79843..adef75396 100644 --- a/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-os-stm32mp_4.0.0.bbappend +++ b/meta-digi-arm/dynamic-layers/stm-st-stm32mp/recipes-security/optee/optee-os-stm32mp_4.0.0.bbappend @@ -2,6 +2,8 @@ # Copyright (C) 2022-2025, Digi International Inc. # +FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" + # Inherit custom DIGI sign class to skip signing tool and key parsing restrictions inherit sign-stm32mp-digi @@ -17,3 +19,10 @@ SRC_URI = " \ ${OPTEE_GIT_URI};branch=${SRCBRANCH};name=os \ file://fonts.tar.gz;subdir=git;name=fonts \ " + +SRC_URI:append:ccmp25 = " \ + ${@oe.utils.conditional('TRUSTFENCE_ENABLED', '1' , 'file://0001-ARM-dts-ccmp25-add-signed-firmware-support-for-RPROC.patch', '', d)} \ +" + +# Enable remoteproc OTP public key verification for signed firmware support +EXTRA_OEMAKE:append:ccmp25 = " ${@oe.utils.conditional('TRUSTFENCE_ENABLED', '1', 'CFG_REMOTEPROC_PUB_KEY_VERIFY=y', '', d)}" diff --git a/meta-digi-arm/recipes-bsp/libubootenv/libubootenv_%.bbappend b/meta-digi-arm/recipes-bsp/libubootenv/libubootenv_%.bbappend index 8f69db3de..6914711fa 100644 --- a/meta-digi-arm/recipes-bsp/libubootenv/libubootenv_%.bbappend +++ b/meta-digi-arm/recipes-bsp/libubootenv/libubootenv_%.bbappend @@ -41,9 +41,9 @@ UBOOT_ENV_PARTITION = "environment" UBOOT_ENV_PARTITION:ccmp1 = "UBI" pkg_postinst_ontarget:${PN}() { - CONFIG_FILE="/etc/fw_env.config" + CONFIG_FILE="${sysconfdir}/fw_env.config" MMCDEV="$(sed -ne 's,.*root=/dev/mmcblk\([0-9]\)p.*,\1,g;T;p' /proc/cmdline)" - if [ -n "${MMCDEV}" ]; then + if [ -n "${MMCDEV}" ] && ! [ -b "/dev/mmcblk${MMCDEV}boot0" ]; then sed -i -e "s,^/dev/mmcblk[^[:blank:]]\+,/dev/mmcblk${MMCDEV},g" ${CONFIG_FILE} fi @@ -90,4 +90,4 @@ pkg_postinst_ontarget:${PN}() { sync ${CONFIG_FILE} } -inherit ${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "remove-pkg-postinst-ontarget", "", d)} +inherit_defer ${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "remove-pkg-postinst-ontarget", "", d)} diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/nativesdk-trustfence-cst_3.4.1.bb b/meta-digi-arm/recipes-bsp/trustfence-cst/nativesdk-trustfence-cst_3.4.1.bb index a52f1529c..c2909924b 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/nativesdk-trustfence-cst_3.4.1.bb +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/nativesdk-trustfence-cst_3.4.1.bb @@ -1,5 +1,7 @@ -# Copyright (C) 2022, Digi International Inc. +# Copyright (C) 2022-2025, Digi International Inc. require trustfence-cst-${PV}.inc +DEPENDS += "nativesdk-openssl" + inherit nativesdk diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.4.1.inc b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.4.1.inc index f76b9b549..5373e9276 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.4.1.inc +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-3.4.1.inc @@ -7,7 +7,7 @@ HOMEPAGE = "https://www.nxp.com/webapp/Download?colCode=IMX_CST_TOOL" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE.bsd3;md5=14aba05f9fa6c25527297c8aac95fcf6" -DEPENDS = "byacc-native flex-native openssl-native" +DEPENDS = "byacc-native flex-native" SRC_URI = " \ ${DIGI_PKG_SRC}/cst-${PV}.tgz;name=cst \ diff --git a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-native_3.4.1.bb b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-native_3.4.1.bb index 96efddadd..8c84ced72 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-native_3.4.1.bb +++ b/meta-digi-arm/recipes-bsp/trustfence-cst/trustfence-cst-native_3.4.1.bb @@ -1,5 +1,7 @@ -# Copyright (C) 2022, Digi International Inc. +# Copyright (C) 2022-2025, Digi International Inc. require trustfence-cst-${PV}.inc +DEPENDS += "openssl-native" + inherit native diff --git a/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/nativesdk-trustfence-stm-signtools_1.4.bb b/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/nativesdk-trustfence-stm-signtools_1.5.bb similarity index 100% rename from meta-digi-arm/recipes-bsp/trustfence-stm-signtools/nativesdk-trustfence-stm-signtools_1.4.bb rename to meta-digi-arm/recipes-bsp/trustfence-stm-signtools/nativesdk-trustfence-stm-signtools_1.5.bb diff --git a/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools-native_1.4.bb b/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools-native_1.5.bb similarity index 100% rename from meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools-native_1.4.bb rename to meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools-native_1.5.bb diff --git a/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools.inc b/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools.inc index 937801845..11ac48f5d 100644 --- a/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools.inc +++ b/meta-digi-arm/recipes-bsp/trustfence-stm-signtools/trustfence-stm-signtools.inc @@ -4,14 +4,14 @@ SUMMARY = "STM key generation and signing tools" SECTION = "console/tools" LICENSE = "Proprietary" -LIC_FILES_CHKSUM = "file://licenses/en.SLA0048.txt;md5=108361d167deef887d204830aba9cf94" +LIC_FILES_CHKSUM = "file://licenses/en.SLA0048.txt;md5=45cb993af0ee0a0df02181b29e244eec" PKGNAME = "trustfence-stm-signtools" # tarball SRC_URI = "${DIGI_PKG_SRC}/${PKGNAME}-${PV}.tar.gz" -SRC_URI[md5sum] = "a9277220a763b85efac2506dc2ad16f9" -SRC_URI[sha256sum] = "b45ceff90fde83f3e536a84bd7d2ae5ca95d695f35edbdab148f78d3cc31ce5c" +SRC_URI[md5sum] = "2865f224d9ed3e3d3f3ad4f1a96c1ec8" +SRC_URI[sha256sum] = "e7a862e1c6847906d11de67fa7d4ba9efd2448094b41cf3dccb78300dcd839df" inherit bin_package diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc index dc0cc52d2..c325cceb8 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey.inc @@ -35,17 +35,19 @@ SRC_URI = " \ BUILD_UBOOT_SCRIPTS ?= "true" -BOOTLOADER_IMAGE_RECIPE ?= "u-boot" - LOCALVERSION ?= "" -inherit ${@oe.utils.conditional('DEY_SOC_VENDOR', 'NXP', 'fsl-u-boot-localversion', '', d)} +inherit ${@oe.utils.conditional('DEY_SOC_VENDOR', 'NXP', 'fsl-u-boot-localversion uuu_bootloader_tag', '', d)} + +# Disable u-boot tagging for imx8/9, as the boot image is imx-boot +UUU_BOOTLOADER:mx8-generic-bsp = "" +UUU_BOOTLOADER:mx9-generic-bsp = "" # Disable u-boot environment artifacts UBOOT_INITIAL_ENV = "" python __anonymous() { - if (d.getVar("TRUSTFENCE_DEK_PATH") not in ["0", None]) and (d.getVar("TRUSTFENCE_SIGN") != "1"): - 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_ENCRYPT") == "1") and (d.getVar("TRUSTFENCE_SIGN") != "1"): + bb.fatal("Only signed U-Boot images can be encrypted. Generate signed images (TRUSTFENCE_SIGN = \"1\") or remove encryption (TRUSTFENCE_ENCRYPT = \"0\")") } do_configure[prefuncs] += "${@oe.utils.ifelse(d.getVar('UBOOT_TF_CONF'), 'trustfence_config', '')}" @@ -100,13 +102,17 @@ build_uboot_scripts() { # Change the u-boot name when TrustFence is enabled if [ "${TRUSTFENCE_SIGN}" = "1" ]; then if [ "${DEY_SOC_VENDOR}" = "NXP" ]; then - if [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then sed -i -e 's,##SIGNED##,encrypted,g' ${TMP_INSTALL_SCR} else sed -i -e 's,##SIGNED##,signed,g' ${TMP_INSTALL_SCR} fi else - sed -i -e 's,##SIGNED##,_Signed,g' ${TMP_INSTALL_SCR} + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then + sed -i -e 's,##SIGNED##,_Encrypted_Signed,g' ${TMP_INSTALL_SCR} + else + sed -i -e 's,##SIGNED##,_Signed,g' ${TMP_INSTALL_SCR} + fi fi else sed -i -e 's,-##SIGNED##,,g' -e 's,##SIGNED##,,g' ${TMP_INSTALL_SCR} @@ -127,10 +133,10 @@ build_uboot_scripts() { # Sign the boot script if not contained in a FIT image if [ "${TRUSTFENCE_SIGN_ARTIFACTS}" = "1" ] && [ "${TRUSTFENCE_SIGN_FIT_NXP}" = "0" ]; then - export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" + export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_KEYS_PATH}" [ -n "${TRUSTFENCE_KEY_INDEX}" ] && export CONFIG_KEY_INDEX="${TRUSTFENCE_KEY_INDEX}" [ -n "${TRUSTFENCE_SRK_REVOKE_MASK}" ] && export SRK_REVOKE_MASK="${TRUSTFENCE_SRK_REVOKE_MASK}" - [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ] && export CONFIG_DEK_PATH="${TRUSTFENCE_DEK_PATH}" + [ "${TRUSTFENCE_ENCRYPT}" = "1" ] && export CONFIG_DEK_PATH="${TRUSTFENCE_KEYS_PATH}/${TRUSTFENCE_DEK_ENCRYPT_KEYNAME}" # Sign boot script TMP_SIGNED_BOOTSCR="$(mktemp ${WORKDIR}/bootscr-signed.XXXXXX)" @@ -148,9 +154,12 @@ build_uboot_scripts() { # u-boot-spl.bin-- (needed for imx-boot) # uboot_deploy_config:append() { - rm -f ${DEPLOYDIR}/${UBOOT_SYMLINK} \ - ${DEPLOYDIR}/${UBOOT_BINARY}-${type} \ - ${DEPLOYDIR}/${UBOOT_BINARY} + if [ "${MACHINE}" != "ccimx6sbc" ] && [ "${MACHINE}" != "ccimx6qpsbc" ]; then + # U-Boot symlink is only required for ccimx6/ccimx6qp platforms during + # SD card image generation + rm -f ${DEPLOYDIR}/${UBOOT_SYMLINK} + fi + rm -f ${DEPLOYDIR}/${UBOOT_BINARY}-${type} ln -sf ${UBOOT_BINARYNAME}-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${DEPLOYDIR}/${UBOOT_BINARYNAME}-${type}.${UBOOT_SUFFIX} } uboot_deploy_spl_config:append() { @@ -181,7 +190,7 @@ sign_uboot() { ln -sf ${UBOOT_BINARYNAME}-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${UBOOT_BINARYNAME}-signed-${type}.${UBOOT_SUFFIX} cp -fp ${B}/${config}/${UBOOT_BINARYNAME}-dtb-usb-signed.imx ${UBOOT_BINARYNAME}-usb-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ln -sf ${UBOOT_BINARYNAME}-usb-signed-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${UBOOT_BINARYNAME}-usb-signed-${type}.${UBOOT_SUFFIX} - if [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then cp -fp ${B}/${config}/${UBOOT_BINARYNAME}-dtb-encrypted.imx ${UBOOT_BINARYNAME}-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ln -sf ${UBOOT_BINARYNAME}-encrypted-${type}-${PV}-${PR}.${UBOOT_SUFFIX} ${UBOOT_BINARYNAME}-encrypted-${type}.${UBOOT_SUFFIX} fi diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh index a358e6d92..88f4f04e8 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6qpsbc/install_linux_fw_uuu.sh @@ -157,12 +157,11 @@ if [ -z ${INSTALL_UBOOT_FILENAME} ]; then echo "" echo "[ERROR] Cannot determine U-Boot file for this module!" echo "" - echo "1. Set variable 'INSTALL_UBOOT_FILENAME' depending on your ConnectCore 6 QuadPlus variant:" + echo "1. Add U-boot file name, depending on your on your ConnectCore 6 QuadPlus variant, to script command line:" echo " - For a QuadPlus CPU with 2GB DDR3, run:" - echo " => setenv INSTALL_UBOOT_FILENAME u-boot-##SIGNED##-##MACHINE##2GB.imx" + echo " => ./install_linux_fw_uuu.sh -u u-boot-##SIGNED##-##MACHINE##2GB.imx" echo " - For a DualPlus CPU with 1GB DDR3, run:" - echo " => setenv INSTALL_UBOOT_FILENAME u-boot-##SIGNED##-##MACHINE##1GB.imx" - echo "" + echo " => ./install_linux_fw_uuu.sh -u u-boot-##SIGNED##-##MACHINE##1GB.imx" echo "" echo "2. Run the install script again." echo "" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh index 1c358dd80..f37dc8f7f 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccimx6sbc/install_linux_fw_uuu.sh @@ -171,17 +171,17 @@ if [ -z ${INSTALL_UBOOT_FILENAME} ]; then echo "" echo "[ERROR] Cannot determine U-Boot file for this module!" echo "" - echo "1. Set variable 'INSTALL_UBOOT_FILENAME' depending on your ConnectCore 6 variant:" + echo "1. Add U-boot file name, depending on your ConnectCore 6 variant, to script command line:" echo " - For a Quad/Dual CPU with 2GB DDR3, run:" - echo " => setenv INSTALL_UBOOT_FILENAME u-boot-##SIGNED##-ccimx6qsbc2GB.imx" + echo " => ./install_linux_fw_uuu.sh -u u-boot-##SIGNED##-ccimx6qsbc2GB.imx" echo " - For a Quad/Dual CPU with 1GB DDR3, run:" - echo " => setenv INSTALL_UBOOT_FILENAME u-boot-##SIGNED##-ccimx6qsbc.imx" + echo " => ./install_linux_fw_uuu.sh -u u-boot-##SIGNED##-ccimx6qsbc.imx" echo " - For a Quad/Dual CPU with 512MB DDR3, run:" - echo " => setenv INSTALL_UBOOT_FILENAME u-boot-##SIGNED##-ccimx6qsbc512MB.imx" + echo " => ./install_linux_fw_uuu.sh -u u-boot-##SIGNED##-ccimx6qsbc512MB.imx" echo " - For a DualLite/Solo CPU with 1GB DDR3, run:" - echo " => setenv INSTALL_UBOOT_FILENAME u-boot-##SIGNED##-ccimx6dlsbc.imx" + echo " => ./install_linux_fw_uuu.sh -u u-boot-##SIGNED##-ccimx6dlsbc.imx" echo " - For a DualLite/Solo CPU with 512MB DDR3, run:" - echo " => setenv INSTALL_UBOOT_FILENAME u-boot-##SIGNED##-ccimx6dlsbc512MB.imx" + echo " => ./install_linux_fw_uuu.sh -u u-boot-##SIGNED##-ccimx6dlsbc512MB.imx" echo "" echo "2. Run the install script again." echo "" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp25-dvk/0001-ARM-dts-ccmp25-add-signed-firmware-support-for-RPROC.patch b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp25-dvk/0001-ARM-dts-ccmp25-add-signed-firmware-support-for-RPROC.patch new file mode 100644 index 000000000..d910e2096 --- /dev/null +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey/ccmp25-dvk/0001-ARM-dts-ccmp25-add-signed-firmware-support-for-RPROC.patch @@ -0,0 +1,32 @@ +From: Arturo Buzarra +Date: Thu, 30 Oct 2025 14:35:29 +0100 +Subject: [PATCH] ARM: dts: ccmp25: add signed firmware support for RPROC + +Declare only the shared memory used for inter-processor communication +(including the resource table) to allow remoteproc to load/authenticate signed +Cortex-M33 firmware. + +https://onedigi.atlassian.net/browse/DEL-9813 + +Signed-off-by: Arturo Buzarra +--- + arch/arm/dts/ccmp25.dtsi | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/arch/arm/dts/ccmp25.dtsi b/arch/arm/dts/ccmp25.dtsi +index 913eac366b9..51b65f2408a 100644 +--- a/arch/arm/dts/ccmp25.dtsi ++++ b/arch/arm/dts/ccmp25.dtsi +@@ -246,11 +246,8 @@ + &m33_rproc { + mboxes = <&ipcc1 0x100>, <&ipcc1 0x101>, <&ipcc1 2>; + mbox-names = "vq0", "vq1", "shutdown"; +- memory-region = <&cm33_cube_fw>, <&cm33_cube_data>, +- <&ipc_shmem_1>, <&vdev0vring0>, +- <&vdev0vring1>, <&vdev0buffer>, +- <&cm33_sram2>; +- st,syscfg-nsvtor = <&a35ss_syscfg 0xa8 0xffffff80>; ++ compatible = "st,stm32mp2-m33-tee"; ++ memory-region = <&vdev0vring0>, <&vdev0vring1>, <&vdev0buffer>, <&ipc_shmem_1>; + status = "okay"; + }; diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2017.03.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2017.03.bb deleted file mode 100644 index 2eb261940..000000000 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2017.03.bb +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (C) 2018-2023, Digi International Inc. - -require u-boot-dey.inc - -SRCBRANCH = "v2017.03/master" -SRCREV = "${AUTOREV}" - -# Disable support to initial environment for U-Boot -UBOOT_INITIAL_ENV = "" - -COMPATIBLE_MACHINE = "(ccimx6$)" diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2023.10.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2023.10.bb index 32bd7b349..705c23b4c 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2023.10.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2023.10.bb @@ -13,6 +13,10 @@ SRC_URI += " \ ${@oe.utils.conditional('TRUSTFENCE_SIGN_FIT_STM', '1', 'file://fit_signature.cfg', '', d)} \ " +SRC_URI:append:ccmp25 = " \ + ${@oe.utils.conditional('TRUSTFENCE_ENABLED', '1' , 'file://0001-ARM-dts-ccmp25-add-signed-firmware-support-for-RPROC.patch', '', d)} \ +" + install_helper_files() { # Install dtbs from UBOOT_DEVICETREE to datadir, so that kernel # can use it for signing, and kernel will deploy after signs it. diff --git a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2024.04.bb b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2024.04.bb index 902616a60..0c45e416e 100644 --- a/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2024.04.bb +++ b/meta-digi-arm/recipes-bsp/u-boot/u-boot-dey_2024.04.bb @@ -9,4 +9,4 @@ DEPENDS += "flex-native bison-native" SRCBRANCH = "v2024.04/maint" SRCREV = "${AUTOREV}" -COMPATIBLE_MACHINE = "(ccimx6ul|ccimx8m|ccimx8x|ccimx9)" +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x|ccimx9)" diff --git a/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/iw612-sdk_git.bb b/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/iw612-sdk_git.bb index b4c02b7e7..4583ca437 100644 --- a/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/iw612-sdk_git.bb +++ b/meta-digi-arm/recipes-connectivity/nxp-wlan-sdk/iw612-sdk_git.bb @@ -18,4 +18,4 @@ do_install () { FILES:${PN} = "${datadir}/nxp_wireless" -COMPATIBLE_MACHINE = "(mx93-nxp-bsp)" +COMPATIBLE_MACHINE = "(mx9-nxp-bsp)" diff --git a/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-gen-pki-stm.sh b/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-gen-pki-stm.sh index 7dcccee17..e6c6e1d19 100755 --- a/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-gen-pki-stm.sh +++ b/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-gen-pki-stm.sh @@ -14,6 +14,12 @@ # Description: # Script for generating PKI tree using STM tools # +# The following environment variables define the script behaviour: +# CONFIG_SIGN_KEYS_PATH: (mandatory) Path to the folder to hold the generated PKI tree keys. +# CONFIG_FIP_ENCRYPT_KEYNAME: (optional) Encryption key filename for FIP +# CONFIG_FSBL_ENCRYPT_KEYNAME: (optional) Encryption key filename for FSBL +# CONFIG_RPROC_ENCRYPT_KEYNAME: (optional) Encryption key filename for RPROC +# #=============================================================================== # Avoid parallel execution of this script @@ -101,3 +107,72 @@ else exit 1 fi fi + +# Default values +RPROC_KEY_PASS_FILE="${CONFIG_SIGN_KEYS_PATH}/rproc-keys/key_pass.txt" + +# Generate random keys for Cortex-M coprocessor if they don't exist +if [ "${PLATFORM}" = "ccmp25" ]; then + N_PUBK="$(ls -l ${CONFIG_SIGN_KEYS_PATH}/rproc-keys/publicKey*.pem 2>/dev/null | wc -l)" + N_PRVK="$(ls -l ${CONFIG_SIGN_KEYS_PATH}/rproc-keys/privateKey*.pem 2>/dev/null | wc -l)" + N_DERK="$(ls -l ${CONFIG_SIGN_KEYS_PATH}/rproc-keys/publicKey*.der 2>/dev/null | wc -l)" + install -d "${CONFIG_SIGN_KEYS_PATH}/rproc-keys/" + if [ "${N_PUBK}" = "1" ] && [ "${N_PRVK}" = "1" ] && [ "${N_DERK}" = "1" ] && [ -f "${RPROC_KEY_PASS_FILE}" ]; then + # PKI tree already exists. + echo "Using existing PKI tree for Cortex-M coprocessor" + elif [ "${N_PUBK}" != "1" ] && [ "${N_PRVK}" != 1 ] && [ "${N_DERK}" != "1" ] && [ ! -f "${RPROC_KEY_PASS_FILE}" ]; then + # Random password + password="$(openssl rand -base64 32)" + echo "Generating random key" + if ! STM32MP_KeyGen_CLI -abs "${CONFIG_SIGN_KEYS_PATH}/rproc-keys/" -pwd ${password}; then + echo "[ERROR] Could not generate PKI tree for Cortex-M coprocessor" + exit 1 + fi + echo "${password}" > "${RPROC_KEY_PASS_FILE}" + chmod 400 "${RPROC_KEY_PASS_FILE}" + # Generate DER version of public key + if ! openssl ec -pubin -in ${CONFIG_SIGN_KEYS_PATH}/rproc-keys/publicKey.pem \ + -outform DER -pubout \ + -out ${CONFIG_SIGN_KEYS_PATH}/rproc-keys/publicKey.der; then + echo "[ERROR] Could not generate DER public key for Cortex-M coprocessor" + exit 1 + fi + else + echo "[ERROR] Could not generate PKI tree for Cortex-M coprocessor. An incomplete PKI tree may already exist." + exit 1 + fi +fi + +if [ -n "${CONFIG_FSBL_ENCRYPT_KEYNAME}" ] && [ -n "${CONFIG_FIP_ENCRYPT_KEYNAME}" ] && [ -n "${CONFIG_RPROC_ENCRYPT_KEYNAME}" ]; then + + # Generate random keys if they don't exist + if [ "${PLATFORM}" = "ccmp25" ]; then + if [ ! -f "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FSBL_ENCRYPT_KEYNAME}" ]; then + echo "Generating random encryption key for FSBL" + if ! STM32MP_KeyGen_CLI -rand 16 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FSBL_ENCRYPT_KEYNAME}"; then + echo "[ERROR] Failed to generate 16-byte FSBL encryption key" + exit 1 + fi + chmod 444 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FSBL_ENCRYPT_KEYNAME}" + fi + if [ ! -f "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FIP_ENCRYPT_KEYNAME}" ]; then + echo "Generating random encryption key for FIP" + if ! STM32MP_KeyGen_CLI -rand 32 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FIP_ENCRYPT_KEYNAME}"; then + echo "[ERROR] Failed to generate 32-byte FIP encryption key" + exit 1 + fi + chmod 444 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_FIP_ENCRYPT_KEYNAME}" + fi + if [ ! -f "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_RPROC_ENCRYPT_KEYNAME}" ]; then + echo "Generating random encryption keys for Cortex-M coprocessor" + if ! STM32MP_KeyGen_CLI -rand 32 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_RPROC_ENCRYPT_KEYNAME}"; then + echo "[ERROR] Failed to generate 32-byte Cortex-M encryption key" + exit 1 + fi + chmod 444 "${CONFIG_SIGN_KEYS_PATH}/${CONFIG_RPROC_ENCRYPT_KEYNAME}" + fi + else + echo "[ERROR] Could not generate encryption keys. Platform not supported." + exit 1 + fi +fi diff --git a/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-sign-artifact-stm.sh b/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-sign-artifact-stm.sh index 4868cb7bd..73c1a04f0 100755 --- a/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-sign-artifact-stm.sh +++ b/meta-digi-arm/recipes-digi/trustfence/trustfence-sign-tools/trustfence-sign-artifact-stm.sh @@ -15,6 +15,8 @@ # Script for building signed and encrypted artifacts using STM sign tools. # # The following environment variables define the script behaviour: +# CONFIG_SIGN_KEYS_PATH: (mandatory) Path to the folder with the PKI tree keys generated. +# CONFIG_KEY_INDEX: (optional) key index to use for signing. Default is 0. # #=============================================================================== diff --git a/meta-digi-arm/recipes-kernel/dtc/dtc.inc b/meta-digi-arm/recipes-kernel/dtc/dtc.inc deleted file mode 100644 index 5269f94a3..000000000 --- a/meta-digi-arm/recipes-kernel/dtc/dtc.inc +++ /dev/null @@ -1,25 +0,0 @@ -SUMMARY = "Device Tree Compiler" -HOMEPAGE = "https://devicetree.org/" -DESCRIPTION = "The Device Tree Compiler is a tool used to manipulate the Open-Firmware-like device tree used by PowerPC kernels." -SECTION = "bootloader" -LICENSE = "GPL-2.0-only | BSD-2-Clause" -DEPENDS = "flex-native bison-native" - -SRC_URI = "git://git.kernel.org/pub/scm/utils/dtc/dtc.git;branch=master \ - file://make_install.patch \ - file://0001-checks-Use-proper-format-modifier-for-size_t.patch \ - " -UPSTREAM_CHECK_GITTAGREGEX = "v(?P\d+(\.\d+)+)" - -EXTRA_OEMAKE='NO_PYTHON=1 PREFIX="${prefix}" LIBDIR="${libdir}" DESTDIR="${D}"' - -S = "${WORKDIR}/git" - -do_install () { - oe_runmake install -} - -PACKAGES =+ "${PN}-misc" -FILES:${PN}-misc = "${bindir}/convert-dtsv0 ${bindir}/ftdump ${bindir}/dtdiff" - -RDEPENDS:${PN}-misc += "bash diffutils" diff --git a/meta-digi-arm/recipes-kernel/dtc/dtc/0001-Remove-redundant-YYLOC-global-declaration.patch b/meta-digi-arm/recipes-kernel/dtc/dtc/0001-Remove-redundant-YYLOC-global-declaration.patch deleted file mode 100644 index 2c5e9ba0c..000000000 --- a/meta-digi-arm/recipes-kernel/dtc/dtc/0001-Remove-redundant-YYLOC-global-declaration.patch +++ /dev/null @@ -1,51 +0,0 @@ -From: Dirk Mueller -Date: Tue, 14 Jan 2020 18:53:41 +0100 -Subject: [PATCH] Remove redundant YYLOC global declaration - -gcc 10 will default to -fno-common, which causes this error at link -time: - - (.text+0x0): multiple definition of `yylloc'; dtc-lexer.lex.o (symbol from plugin):(.text+0x0): first defined here - -This is because both dtc-lexer as well as dtc-parser define the same -global symbol yyloc. Before with -fcommon those were merged into one -defintion. The proper solution would be to to mark this as "extern", -however that leads to: - - dtc-lexer.l:26:16: error: redundant redeclaration of 'yylloc' [-Werror=redundant-decls] - 26 | extern YYLTYPE yylloc; - | ^~~~~~ -In file included from dtc-lexer.l:24: -dtc-parser.tab.h:127:16: note: previous declaration of 'yylloc' was here - 127 | extern YYLTYPE yylloc; - | ^~~~~~ -cc1: all warnings being treated as errors - -which means the declaration is completely redundant and can just be -dropped. - -Upstream-Status: Inappropriate [DEY specific] - -Signed-off-by: Dirk Mueller -Message-Id: <20200114175341.2994-1-dmueller@suse.com> -Signed-off-by: David Gibson ---- - dtc-lexer.l | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/dtc-lexer.l b/dtc-lexer.l -index 5c6c3fd..b3b7270 100644 ---- a/dtc-lexer.l -+++ b/dtc-lexer.l -@@ -21,11 +21,10 @@ LINECOMMENT "//".*\n - %{ - #include "dtc.h" - #include "srcpos.h" - #include "dtc-parser.tab.h" - --YYLTYPE yylloc; - extern bool treesource_error; - - /* CAUTION: this will stop working if we ever use yyless() or yyunput() */ - #define YY_USER_ACTION \ - { \ diff --git a/meta-digi-arm/recipes-kernel/dtc/dtc/0001-checks-Use-proper-format-modifier-for-size_t.patch b/meta-digi-arm/recipes-kernel/dtc/dtc/0001-checks-Use-proper-format-modifier-for-size_t.patch deleted file mode 100644 index cab384dd9..000000000 --- a/meta-digi-arm/recipes-kernel/dtc/dtc/0001-checks-Use-proper-format-modifier-for-size_t.patch +++ /dev/null @@ -1,43 +0,0 @@ -From c7a4c3817796107bb824a1f173faf90fae45396b Mon Sep 17 00:00:00 2001 -From: Thierry Reding -Date: Wed, 27 Sep 2017 15:04:09 +0200 -Subject: [PATCH] checks: Use proper format modifier for size_t - -The size of size_t can vary between architectures, so using %ld isn't -going to work on 32-bit builds. Use the %zu modifier to make sure it is -always correct. - -Upstream-Status: Backport -Signed-off-by: Thierry Reding -Acked-by: Rob Herring -Signed-off-by: David Gibson -Signed-off-by: Alexander Kanavin ---- - checks.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/checks.c b/checks.c -index 902f2e3..08a3a29 100644 ---- a/checks.c -+++ b/checks.c -@@ -972,7 +972,7 @@ static void check_property_phandle_args(struct check *c, - int cell, cellsize = 0; - - if (prop->val.len % sizeof(cell_t)) { -- FAIL(c, dti, "property '%s' size (%d) is invalid, expected multiple of %ld in node %s", -+ FAIL(c, dti, "property '%s' size (%d) is invalid, expected multiple of %zu in node %s", - prop->name, prop->val.len, sizeof(cell_t), node->fullpath); - return; - } -@@ -1163,7 +1163,7 @@ static void check_interrupts_property(struct check *c, - return; - - if (irq_prop->val.len % sizeof(cell_t)) -- FAIL(c, dti, "property '%s' size (%d) is invalid, expected multiple of %ld in node %s", -+ FAIL(c, dti, "property '%s' size (%d) is invalid, expected multiple of %zu in node %s", - irq_prop->name, irq_prop->val.len, sizeof(cell_t), - node->fullpath); - --- -2.15.0 - diff --git a/meta-digi-arm/recipes-kernel/dtc/dtc/0001-fdtdump-Fix-gcc11-warning.patch b/meta-digi-arm/recipes-kernel/dtc/dtc/0001-fdtdump-Fix-gcc11-warning.patch deleted file mode 100644 index 8a5e50b8f..000000000 --- a/meta-digi-arm/recipes-kernel/dtc/dtc/0001-fdtdump-Fix-gcc11-warning.patch +++ /dev/null @@ -1,55 +0,0 @@ -From: David Gibson -Date: Wed, 6 Jan 2021 14:52:26 +1100 -Subject: [PATCH] fdtdump: Fix gcc11 warning - -In one place, fdtdump abuses fdt_set_magic(), passing it just a small char -array instead of the full fdt header it expects. That's relying on the -fact that in fact fdt_set_magic() will only actually access the first 4 -bytes of the buffer. - -This trips a new warning in GCC 11 - and it's entirely possible it was -always UB. So, don't do that. - -Upstream-Status: Inappropriate [DEY specific] - -Signed-off-by: David Gibson -(cherry picked from commit ca16a723fa9dde9c5da80dba567f48715000e77c) ---- - fdtdump.c | 2 +- - libfdt/libfdt.h | 10 ++++++++++ - 2 files changed, 11 insertions(+), 1 deletion(-) - -diff --git a/fdtdump.c b/fdtdump.c -index fa3b561..072c0af 100644 ---- a/fdtdump.c -+++ b/fdtdump.c -@@ -214,7 +214,7 @@ int main(int argc, char *argv[]) - char *p = buf; - char *endp = buf + len; - -- fdt_set_magic(smagic, FDT_MAGIC); -+ fdt32_st(smagic, FDT_MAGIC); - - /* poor man's memmem */ - while ((endp - p) >= FDT_MAGIC_SIZE) { -diff --git a/libfdt/libfdt.h b/libfdt/libfdt.h -index 313c72a..8795f10 100644 ---- a/libfdt/libfdt.h -+++ b/libfdt/libfdt.h -@@ -153,6 +153,16 @@ static inline void *fdt_offset_ptr_w(void *fdt, int offset, int checklen) - - uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset); - -+static inline void fdt32_st(void *property, uint32_t value) -+{ -+ uint8_t *bp = (uint8_t *)property; -+ -+ bp[0] = value >> 24; -+ bp[1] = (value >> 16) & 0xff; -+ bp[2] = (value >> 8) & 0xff; -+ bp[3] = value & 0xff; -+} -+ - /**********************************************************************/ - /* Traversal functions */ - /**********************************************************************/ diff --git a/meta-digi-arm/recipes-kernel/dtc/dtc/make_install.patch b/meta-digi-arm/recipes-kernel/dtc/dtc/make_install.patch deleted file mode 100644 index ccf17b38f..000000000 --- a/meta-digi-arm/recipes-kernel/dtc/dtc/make_install.patch +++ /dev/null @@ -1,17 +0,0 @@ -Upstream-Status: Inappropriate [configuration] - -Index: git/Makefile -=================================================================== ---- git.orig/Makefile -+++ git/Makefile -@@ -168,8 +168,8 @@ install-bin: all $(SCRIPTS) - install-lib: all - @$(VECHO) INSTALL-LIB - $(INSTALL) -d $(DESTDIR)$(LIBDIR) -- $(INSTALL) $(LIBFDT_lib) $(DESTDIR)$(LIBDIR) -- ln -sf $(notdir $(LIBFDT_lib)) $(DESTDIR)$(LIBDIR)/$(LIBFDT_soname) -+ $(INSTALL) $(LIBFDT_lib) $(DESTDIR)$(LIBDIR)/$(LIBFDT_soname) -+ ln -sf $(LIBFDT_soname) $(DESTDIR)$(LIBDIR)/$(notdir $(LIBFDT_lib)) - ln -sf $(LIBFDT_soname) $(DESTDIR)$(LIBDIR)/libfdt.$(SHAREDLIB_EXT) - $(INSTALL) -m 644 $(LIBFDT_archive) $(DESTDIR)$(LIBDIR) - diff --git a/meta-digi-arm/recipes-kernel/dtc/dtc_1.4.5.bb b/meta-digi-arm/recipes-kernel/dtc/dtc_1.4.5.bb deleted file mode 100644 index 7c6400c5f..000000000 --- a/meta-digi-arm/recipes-kernel/dtc/dtc_1.4.5.bb +++ /dev/null @@ -1,17 +0,0 @@ -require dtc.inc - -FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" - -LIC_FILES_CHKSUM = "file://GPL;md5=94d55d512a9ba36caa9b7df079bae19f \ - file://libfdt/libfdt.h;beginline=3;endline=52;md5=fb360963151f8ec2d6c06b055bcbb68c" - -SRCREV = "22a65c5331c22979d416738eb756b9541672e00d" - -SRC_URI:append = " \ - file://0001-Remove-redundant-YYLOC-global-declaration.patch \ - file://0001-fdtdump-Fix-gcc11-warning.patch \ -" - -S = "${WORKDIR}/git" - -BBCLASSEXTEND = "native nativesdk" diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey/ccmp2/0001-ARM64-dts-ccmp25-add-signed-firmware-support-for-RPR.patch b/meta-digi-arm/recipes-kernel/linux/linux-dey/ccmp2/0001-ARM64-dts-ccmp25-add-signed-firmware-support-for-RPR.patch new file mode 100644 index 000000000..33862daaa --- /dev/null +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey/ccmp2/0001-ARM64-dts-ccmp25-add-signed-firmware-support-for-RPR.patch @@ -0,0 +1,32 @@ +From: Arturo Buzarra +Date: Thu, 30 Oct 2025 14:15:14 +0100 +Subject: [PATCH] ARM64: dts: ccmp25: add signed firmware support for RPROC + +Declare only the shared memory used for inter-processor communication +(including the resource table) to allow remoteproc to load/authenticate signed +Cortex-M33 firmware. + +https://onedigi.atlassian.net/browse/DEL-9813 + +Signed-off-by: Arturo Buzarra +--- + arch/arm64/boot/dts/digi/ccmp25.dtsi | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/arch/arm64/boot/dts/digi/ccmp25.dtsi b/arch/arm64/boot/dts/digi/ccmp25.dtsi +index 153726203533..89f5bf75fd9f 100644 +--- a/arch/arm64/boot/dts/digi/ccmp25.dtsi ++++ b/arch/arm64/boot/dts/digi/ccmp25.dtsi +@@ -346,11 +346,8 @@ &m0_rproc { + &m33_rproc { + mboxes = <&ipcc1 0x100>, <&ipcc1 0x101>, <&ipcc1 2>; + mbox-names = "vq0", "vq1", "shutdown"; +- memory-region = <&cm33_cube_fw>, <&cm33_cube_data>, +- <&ipc_shmem_1>, <&vdev0vring0>, +- <&vdev0vring1>, <&vdev0buffer>, +- <&cm33_sram2>; +- st,syscfg-nsvtor = <&a35ss_syscfg 0xa8 0xffffff80>; ++ compatible = "st,stm32mp2-m33-tee"; ++ memory-region = <&vdev0vring0>, <&vdev0vring1>, <&vdev0buffer>, <&ipc_shmem_1>; + status = "okay"; + }; diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey/docker_conf.cfg b/meta-digi-arm/recipes-kernel/linux/linux-dey/docker_conf.cfg index 686f2a30f..008a84266 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey/docker_conf.cfg +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey/docker_conf.cfg @@ -64,3 +64,4 @@ CONFIG_BTRFS_FS=y CONFIG_BTRFS_FS_POSIX_ACL=y CONFIG_BPF_SYSCALL=y CONFIG_CGROUP_BPF=y +CONFIG_CFS_BANDWIDTH=y diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey/imx-nxp-bsp/0001-add-RT-support-based-on-latest-linux_6.6.36.patch b/meta-digi-arm/recipes-kernel/linux/linux-dey/imx-nxp-bsp/0001-add-RT-support-based-on-latest-linux_6.6.36.patch index 3c3588f19..31cb5086e 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey/imx-nxp-bsp/0001-add-RT-support-based-on-latest-linux_6.6.36.patch +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey/imx-nxp-bsp/0001-add-RT-support-based-on-latest-linux_6.6.36.patch @@ -43642,6 +43642,7 @@ index 000000000000..13c003e2ba45 +#include +#include +#include ++#include +#include +#include +#include @@ -43815,8 +43816,11 @@ index 000000000000..13c003e2ba45 + } + + spin_lock(&vt->txvq_lock); -+ virttrans_queue_txbuf(vt, &vt->tx_sgl[idx % vt->tx_vring_size], -+ buf, vt->pkt_size); ++ u64 tmp_idx = idx; ++ u32 tmp_rem; ++ div_u64_rem(tmp_idx, vt->tx_vring_size, &tmp_rem); ++ virttrans_queue_txbuf(vt, &vt->tx_sgl[tmp_rem], ++ buf, vt->pkt_size); + idx++; + spin_unlock(&vt->txvq_lock); + @@ -43952,8 +43956,11 @@ index 000000000000..13c003e2ba45 + } + + spin_lock(&vt->rxvq_lock); -+ virttrans_queue_rxbuf(vt, &vt->rx_sgl[idx % vt->rx_vring_size], -+ buf, vt->pkt_size); ++ u64 tmp_idx = idx; ++ u32 tmp_rem; ++ div_u64_rem(tmp_idx, vt->rx_vring_size, &tmp_rem); ++ virttrans_queue_rxbuf(vt, &vt->rx_sgl[tmp_rem], ++ buf, vt->pkt_size); + idx++; + spin_unlock(&vt->rxvq_lock); + diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey/imx-nxp-bsp/fragment-nxp-rt.config b/meta-digi-arm/recipes-kernel/linux/linux-dey/imx-nxp-bsp/fragment-nxp-rt.config index 53f9881e7..0b608beaa 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey/imx-nxp-bsp/fragment-nxp-rt.config +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey/imx-nxp-bsp/fragment-nxp-rt.config @@ -12,6 +12,7 @@ CONFIG_NET_EMATCH_STACK=32 CONFIG_NET_EMATCH_U32=y CONFIG_NET_EMATCH_META=y CONFIG_NET_PKTGEN=y +CONFIG_MAILBOX=y CONFIG_VIRTIO_NET=m CONFIG_NET_DSA_NETC=m CONFIG_NET_DSA_NETC_PTP=y @@ -21,7 +22,7 @@ CONFIG_EXPERT=y CONFIG_PREEMPT_RT=y CONFIG_RPMSG_TTY=m CONFIG_GENERIC_SOFTWARE_MAILBOX=y -CONFIG_VIRTIO_TRANS=m +CONFIG_VIRTIO_TRANS=y CONFIG_ACPI_CONTAINER=y CONFIG_THERMAL=y CONFIG_CLK_QORIQ=y diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0010-Rebase-on-v6.6.48-rt40.patch b/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0010-Rebase-on-v6.6.78-rt51.patch similarity index 83% rename from meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0010-Rebase-on-v6.6.48-rt40.patch rename to meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0010-Rebase-on-v6.6.78-rt51.patch index 622eac0f4..d0ce62e1e 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0010-Rebase-on-v6.6.48-rt40.patch +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0010-Rebase-on-v6.6.78-rt51.patch @@ -1,9 +1,11 @@ -From 853262b793afb5b3b26b0fd0ed6467475328ee2c Mon Sep 17 00:00:00 2001 -From: Lionel VITTE -Date: Tue, 3 Dec 2024 14:40:54 +0100 -Subject: [PATCH 10/11] Rebase on v6.6.48-rt40 +From 1ffab13b34f094b8a6283ccaaa5f9c659e3a2b4f Mon Sep 17 00:00:00 2001 +From: Christophe Priouzeau +Date: Tue, 22 Apr 2025 10:43:43 +0200 +Subject: Rebase-on-v6.6.78-rt51 --- +Upstream-Status: Backport + arch/arm/Kconfig | 6 +- arch/arm/mm/fault.c | 6 + arch/arm/vfp/vfpmodule.c | 74 +- @@ -32,7 +34,6 @@ Subject: [PATCH 10/11] Rebase on v6.6.48-rt40 drivers/gpu/drm/i915/Kconfig | 1 - drivers/gpu/drm/i915/display/intel_crtc.c | 15 +- drivers/gpu/drm/i915/display/intel_vblank.c | 6 +- - drivers/gpu/drm/i915/gt/intel_breadcrumbs.c | 7 +- .../drm/i915/gt/intel_execlists_submission.c | 17 +- drivers/gpu/drm/i915/gt/intel_reset.c | 12 +- drivers/gpu/drm/i915/gt/uc/intel_guc.h | 2 +- @@ -50,11 +51,11 @@ Subject: [PATCH 10/11] Rebase on v6.6.48-rt40 drivers/tty/serial/8250/8250_mtk.c | 8 +- drivers/tty/serial/8250/8250_omap.c | 52 +- drivers/tty/serial/8250/8250_pci1xxxx.c | 8 +- - drivers/tty/serial/8250/8250_port.c | 259 ++- + drivers/tty/serial/8250/8250_port.c | 259 +- drivers/tty/serial/altera_jtaguart.c | 28 +- drivers/tty/serial/altera_uart.c | 20 +- drivers/tty/serial/amba-pl010.c | 20 +- - drivers/tty/serial/amba-pl011.c | 78 +- + drivers/tty/serial/amba-pl011.c | 12 +- drivers/tty/serial/apbuart.c | 8 +- drivers/tty/serial/ar933x_uart.c | 26 +- drivers/tty/serial/arc_uart.c | 16 +- @@ -93,17 +94,16 @@ Subject: [PATCH 10/11] Rebase on v6.6.48-rt40 drivers/tty/serial/sa1100.c | 20 +- drivers/tty/serial/samsung_tty.c | 50 +- drivers/tty/serial/sb1250-duart.c | 12 +- - drivers/tty/serial/sc16is7xx.c | 5 + drivers/tty/serial/serial-tegra.c | 32 +- drivers/tty/serial/serial_core.c | 92 +- drivers/tty/serial/serial_mctrl_gpio.c | 4 +- drivers/tty/serial/serial_port.c | 4 +- drivers/tty/serial/serial_txx9.c | 26 +- drivers/tty/serial/sh-sci.c | 68 +- - drivers/tty/serial/sifive.c | 16 +- + drivers/tty/serial/sifive.c | 25 +- drivers/tty/serial/sprd_serial.c | 30 +- drivers/tty/serial/st-asc.c | 18 +- - drivers/tty/serial/stm32-usart.c | 38 +- + drivers/tty/serial/stm32-usart.c | 58 +- drivers/tty/serial/sunhv.c | 28 +- drivers/tty/serial/sunplus-uart.c | 26 +- drivers/tty/serial/sunsab.c | 34 +- @@ -113,11 +113,12 @@ Subject: [PATCH 10/11] Rebase on v6.6.48-rt40 drivers/tty/serial/uartlite.c | 18 +- drivers/tty/serial/ucc_uart.c | 4 +- drivers/tty/serial/vt8500_serial.c | 8 +- - drivers/tty/serial/xilinx_uartps.c | 56 +- + drivers/tty/serial/xilinx_uartps.c | 52 +- drivers/tty/tty_io.c | 11 +- fs/proc/consoles.c | 14 +- + git.info | 10 + include/linux/bottom_half.h | 2 + - include/linux/console.h | 150 ++ + include/linux/console.h | 150 + include/linux/entry-common.h | 2 +- include/linux/entry-kvm.h | 2 +- include/linux/interrupt.h | 29 + @@ -144,10 +145,10 @@ Subject: [PATCH 10/11] Rebase on v6.6.48-rt40 kernel/locking/ww_rt_mutex.c | 2 +- kernel/panic.c | 9 + kernel/printk/Makefile | 2 +- - kernel/printk/internal.h | 121 ++ - kernel/printk/nbcon.c | 1665 +++++++++++++++++ - kernel/printk/printk.c | 750 ++++++-- - kernel/printk/printk_ringbuffer.c | 360 +++- + kernel/printk/internal.h | 121 + + kernel/printk/nbcon.c | 1659 +++++++++ + kernel/printk/printk.c | 750 ++-- + kernel/printk/printk_ringbuffer.c | 360 +- kernel/printk/printk_ringbuffer.h | 54 +- kernel/printk/printk_safe.c | 12 + kernel/rcu/rcutorture.c | 6 + @@ -158,6 +159,7 @@ Subject: [PATCH 10/11] Rebase on v6.6.48-rt40 kernel/sched/features.h | 2 + kernel/sched/idle.c | 3 +- kernel/sched/rt.c | 5 +- + kernel/sched/rt.c.orig | 3083 +++++++++++++++++ kernel/sched/sched.h | 1 + kernel/signal.c | 30 +- kernel/softirq.c | 95 +- @@ -169,8 +171,10 @@ Subject: [PATCH 10/11] Rebase on v6.6.48-rt40 localversion-rt | 1 + net/core/dev.c | 39 +- net/core/skbuff.c | 7 +- - 165 files changed, 5048 insertions(+), 1538 deletions(-) + 165 files changed, 8115 insertions(+), 1505 deletions(-) + create mode 100644 git.info create mode 100644 kernel/printk/nbcon.c + create mode 100644 kernel/sched/rt.c.orig create mode 100644 localversion-rt diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig @@ -435,7 +439,7 @@ index 7e8773a2d..9fde36fcb 100644 EXPORT_SYMBOL(kernel_neon_end); diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig -index 9e0c1ac3d..6f7960fad 100644 +index 658c6a61a..f5d5c265f 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -97,6 +97,7 @@ config ARM64 @@ -447,7 +451,7 @@ index 9e0c1ac3d..6f7960fad 100644 select ARCH_WANT_COMPAT_IPC_PARSE_VERSION if COMPAT select ARCH_WANT_DEFAULT_BPF_JIT diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig -index 2fe51e0ad..116444551 100644 +index 6baa8b856..cca3f7ca6 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -166,6 +166,7 @@ config PPC @@ -628,10 +632,10 @@ index b1e6d275c..9a8d3970d 100644 } diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig -index c785a0200..e05c17078 100644 +index 130499223..391adf8ff 100644 --- a/arch/riscv/Kconfig +++ b/arch/riscv/Kconfig -@@ -48,6 +48,7 @@ config RISCV +@@ -49,6 +49,7 @@ config RISCV select ARCH_SUPPORTS_HUGETLBFS if MMU select ARCH_SUPPORTS_PAGE_TABLE_CHECK if MMU select ARCH_SUPPORTS_PER_VMA_LOCK if MMU @@ -639,7 +643,7 @@ index c785a0200..e05c17078 100644 select ARCH_USE_MEMTEST select ARCH_USE_QUEUED_RWLOCKS select ARCH_USES_CFI_TRAPS if CFI_CLANG -@@ -135,6 +136,7 @@ config RISCV +@@ -136,6 +137,7 @@ config RISCV select HAVE_PERF_USER_STACK_DUMP select HAVE_POSIX_CPU_TIMERS_TASK_WORK select HAVE_PREEMPT_DYNAMIC_KEY if !XIP_KERNEL @@ -659,10 +663,10 @@ index d0345bd65..23fed53b8 100644 - #endif diff --git a/arch/riscv/include/asm/thread_info.h b/arch/riscv/include/asm/thread_info.h -index d18ce0113..e18710fe5 100644 +index 8c72d1bcd..c59ad9b7a 100644 --- a/arch/riscv/include/asm/thread_info.h +++ b/arch/riscv/include/asm/thread_info.h -@@ -82,6 +82,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); +@@ -86,6 +86,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); * - pending work-to-be-done flags are in lowest half-word * - other flags in upper half-word(s) */ @@ -670,7 +674,7 @@ index d18ce0113..e18710fe5 100644 #define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ #define TIF_SIGPENDING 2 /* signal pending */ #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ -@@ -96,6 +97,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); +@@ -100,6 +101,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) #define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL) #define _TIF_UPROBE (1 << TIF_UPROBE) @@ -679,7 +683,7 @@ index d18ce0113..e18710fe5 100644 #define _TIF_WORK_MASK \ (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | _TIF_NEED_RESCHED | \ diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c -index e39a905ac..347cdf56f 100644 +index bb5fb2b82..3f2767c9b 100644 --- a/arch/riscv/kernel/cpufeature.c +++ b/arch/riscv/kernel/cpufeature.c @@ -8,6 +8,7 @@ @@ -698,7 +702,7 @@ index e39a905ac..347cdf56f 100644 #define MISALIGNED_COPY_SIZE ((MISALIGNED_BUFFER_SIZE / 2) - 0x80) unsigned long elf_hwcap __read_mostly; -@@ -571,27 +573,22 @@ unsigned long riscv_get_elf_hwcap(void) +@@ -575,27 +577,22 @@ unsigned long riscv_get_elf_hwcap(void) return hwcap; } @@ -730,7 +734,7 @@ index e39a905ac..347cdf56f 100644 /* Make an unaligned destination buffer. */ dst = (void *)((unsigned long)page_address(page) | 0x1); -@@ -645,7 +642,7 @@ void check_unaligned_access(int cpu) +@@ -649,7 +646,7 @@ void check_unaligned_access(int cpu) pr_warn("cpu%d: rdtime lacks granularity needed to measure unaligned access speed\n", cpu); @@ -739,7 +743,7 @@ index e39a905ac..347cdf56f 100644 } if (word_cycles < byte_cycles) -@@ -659,18 +656,83 @@ void check_unaligned_access(int cpu) +@@ -663,18 +660,83 @@ void check_unaligned_access(int cpu) (speed == RISCV_HWPROBE_MISALIGNED_FAST) ? "fast" : "slow"); per_cpu(misaligned_access_speed, cpu) = speed; @@ -841,7 +845,7 @@ index 1b8da4e40..2cb5e6514 100644 if (has_vector()) { if (riscv_v_setup_vsize()) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig -index 82d12c93f..7bbf835fe 100644 +index 05c82fd5d..a29075276 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -118,6 +118,7 @@ config X86 @@ -898,7 +902,7 @@ index 831fa4a12..5af3ebec0 100644 raw_local_irq_disable(); } diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c -index 06673c6ca..a5d0f7c06 100644 +index b73038ad8..9705d2065 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -57,6 +57,41 @@ static void zram_free_page(struct zram *zram, size_t index); @@ -951,7 +955,7 @@ index 06673c6ca..a5d0f7c06 100644 static inline bool init_done(struct zram *zram) { -@@ -1245,6 +1281,7 @@ static bool zram_meta_alloc(struct zram *zram, u64 disksize) +@@ -1268,6 +1304,7 @@ static bool zram_meta_alloc(struct zram *zram, u64 disksize) if (!huge_class_size) huge_class_size = zs_huge_class_size(zram->mem_pool); @@ -960,7 +964,7 @@ index 06673c6ca..a5d0f7c06 100644 } diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h -index ca7a15bd4..e64eb607e 100644 +index 35e322144..4e0c7c6d4 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -69,6 +69,9 @@ struct zram_table_entry { @@ -970,7 +974,7 @@ index ca7a15bd4..e64eb607e 100644 +#ifdef CONFIG_PREEMPT_RT + spinlock_t lock; +#endif - #ifdef CONFIG_ZRAM_MEMORY_TRACKING + #ifdef CONFIG_ZRAM_TRACK_ENTRY_ACTIME ktime_t ac_time; #endif diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.c @@ -1099,7 +1103,7 @@ index d587f807d..5036a3e60 100644 } diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c -index d1a25fe6c..5674c3450 100644 +index 8dffa5b64..2cd1742c6 100644 --- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c +++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c @@ -953,9 +953,17 @@ static bool dcn21_validate_bandwidth(struct dc *dc, struct dc_state *context, @@ -1327,24 +1331,6 @@ index f5659ebd0..5b6d2f555 100644 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); -diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c -index f2973cd1a..aa77f8601 100644 ---- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c -+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c -@@ -315,7 +315,12 @@ void __intel_breadcrumbs_park(struct intel_breadcrumbs *b) - return; - - /* Kick the work once more to drain the signalers, and disarm the irq */ -- irq_work_queue(&b->irq_work); -+ irq_work_sync(&b->irq_work); -+ while (READ_ONCE(b->irq_armed) && !atomic_read(&b->active)) { -+ irq_work_queue(&b->irq_work); -+ cond_resched(); -+ irq_work_sync(&b->irq_work); -+ } - } - - void intel_breadcrumbs_free(struct kref *kref) diff --git a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c b/drivers/gpu/drm/i915/gt/intel_execlists_submission.c index 2065be5a1..73d815fc5 100644 --- a/drivers/gpu/drm/i915/gt/intel_execlists_submission.c @@ -1715,7 +1701,7 @@ index 9afd5979c..db23b3a02 100644 return 0; diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c -index 3449f8790..30434718f 100644 +index c536028e9..efb6f1c19 100644 --- a/drivers/tty/serial/8250/8250_core.c +++ b/drivers/tty/serial/8250/8250_core.c @@ -259,7 +259,7 @@ static void serial8250_backup_timeout(struct timer_list *t) @@ -1818,7 +1804,7 @@ index 3449f8790..30434718f 100644 } /** -@@ -1194,9 +1234,9 @@ void serial8250_unregister_port(int line) +@@ -1197,9 +1237,9 @@ void serial8250_unregister_port(int line) if (uart->em485) { unsigned long flags; @@ -1871,7 +1857,7 @@ index 7fa665017..8b30ca8fd 100644 int serial8250_tx_dma(struct uart_8250_port *p) diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c -index 8aed33be2..5367bcc62 100644 +index eaf4a9073..d12f230f1 100644 --- a/drivers/tty/serial/8250/8250_dw.c +++ b/drivers/tty/serial/8250/8250_dw.c @@ -290,20 +290,20 @@ static int dw8250_handle_irq(struct uart_port *p) @@ -1983,7 +1969,7 @@ index 28f9a2679..33699e86e 100644 if (tty_termios_baud_rate(termios)) tty_termios_encode_baud_rate(termios, baud, baud); diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c -index 8f472a208..78fc1f17d 100644 +index 9ed62bc7c..e687cd0da 100644 --- a/drivers/tty/serial/8250/8250_omap.c +++ b/drivers/tty/serial/8250/8250_omap.c @@ -405,7 +405,7 @@ static void omap_8250_set_termios(struct uart_port *port, @@ -2213,7 +2199,7 @@ index a3b25779d..53e238c8c 100644 mutex_unlock(&tport->mutex); } diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c -index a17803da8..2d4e775cd 100644 +index 2b1b2928e..441f66ba3 100644 --- a/drivers/tty/serial/8250/8250_port.c +++ b/drivers/tty/serial/8250/8250_port.c @@ -557,6 +557,11 @@ static int serial8250_em485_init(struct uart_8250_port *p) @@ -2455,7 +2441,7 @@ index a17803da8..2d4e775cd 100644 serial8250_rpm_put(up); } -@@ -2205,7 +2222,7 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2206,7 +2223,7 @@ int serial8250_do_startup(struct uart_port *port) * * Synchronize UART_IER access against the console. */ @@ -2464,7 +2450,7 @@ index a17803da8..2d4e775cd 100644 up->acr = 0; serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B); serial_port_out(port, UART_EFR, UART_EFR_ECB); -@@ -2215,7 +2232,7 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2216,7 +2233,7 @@ int serial8250_do_startup(struct uart_port *port) serial_port_out(port, UART_LCR, UART_LCR_CONF_MODE_B); serial_port_out(port, UART_EFR, UART_EFR_ECB); serial_port_out(port, UART_LCR, 0); @@ -2473,7 +2459,7 @@ index a17803da8..2d4e775cd 100644 } if (port->type == PORT_DA830) { -@@ -2224,10 +2241,10 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2225,10 +2242,10 @@ int serial8250_do_startup(struct uart_port *port) * * Synchronize UART_IER access against the console. */ @@ -2486,7 +2472,7 @@ index a17803da8..2d4e775cd 100644 mdelay(10); /* Enable Tx, Rx and free run mode */ -@@ -2341,7 +2358,7 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2342,7 +2359,7 @@ int serial8250_do_startup(struct uart_port *port) * * Synchronize UART_IER access against the console. */ @@ -2495,7 +2481,7 @@ index a17803da8..2d4e775cd 100644 wait_for_xmitr(up, UART_LSR_THRE); serial_port_out_sync(port, UART_IER, UART_IER_THRI); -@@ -2353,7 +2370,7 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2354,7 +2371,7 @@ int serial8250_do_startup(struct uart_port *port) iir = serial_port_in(port, UART_IIR); serial_port_out(port, UART_IER, 0); @@ -2504,7 +2490,7 @@ index a17803da8..2d4e775cd 100644 if (port->irqflags & IRQF_SHARED) enable_irq(port->irq); -@@ -2376,7 +2393,7 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2377,7 +2394,7 @@ int serial8250_do_startup(struct uart_port *port) */ serial_port_out(port, UART_LCR, UART_LCR_WLEN8); @@ -2513,7 +2499,7 @@ index a17803da8..2d4e775cd 100644 if (up->port.flags & UPF_FOURPORT) { if (!up->port.irq) up->port.mctrl |= TIOCM_OUT1; -@@ -2422,7 +2439,7 @@ int serial8250_do_startup(struct uart_port *port) +@@ -2423,7 +2440,7 @@ int serial8250_do_startup(struct uart_port *port) } dont_test_tx_en: @@ -2522,7 +2508,7 @@ index a17803da8..2d4e775cd 100644 /* * Clear the interrupt registers again for luck, and clear the -@@ -2493,17 +2510,17 @@ void serial8250_do_shutdown(struct uart_port *port) +@@ -2494,17 +2511,17 @@ void serial8250_do_shutdown(struct uart_port *port) * * Synchronize UART_IER access against the console. */ @@ -2543,7 +2529,7 @@ index a17803da8..2d4e775cd 100644 if (port->flags & UPF_FOURPORT) { /* reset interrupts on the AST Fourport board */ inb((port->iobase & 0xfe0) | 0x1f); -@@ -2512,7 +2529,7 @@ void serial8250_do_shutdown(struct uart_port *port) +@@ -2513,7 +2530,7 @@ void serial8250_do_shutdown(struct uart_port *port) port->mctrl &= ~TIOCM_OUT2; serial8250_set_mctrl(port, port->mctrl); @@ -2552,7 +2538,7 @@ index a17803da8..2d4e775cd 100644 /* * Disable break condition and FIFOs -@@ -2748,14 +2765,14 @@ void serial8250_update_uartclk(struct uart_port *port, unsigned int uartclk) +@@ -2749,14 +2766,14 @@ void serial8250_update_uartclk(struct uart_port *port, unsigned int uartclk) quot = serial8250_get_divisor(port, baud, &frac); serial8250_rpm_get(up); @@ -2569,7 +2555,7 @@ index a17803da8..2d4e775cd 100644 serial8250_rpm_put(up); out_unlock: -@@ -2792,7 +2809,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -2793,7 +2810,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, * Synchronize UART_IER access against the console. */ serial8250_rpm_get(up); @@ -2578,7 +2564,7 @@ index a17803da8..2d4e775cd 100644 up->lcr = cval; /* Save computed LCR */ -@@ -2895,7 +2912,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -2896,7 +2913,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios, serial_port_out(port, UART_FCR, up->fcr); /* set fcr */ } serial8250_set_mctrl(port, port->mctrl); @@ -2587,7 +2573,7 @@ index a17803da8..2d4e775cd 100644 serial8250_rpm_put(up); /* Don't rewrite B0 */ -@@ -2918,15 +2935,15 @@ void serial8250_do_set_ldisc(struct uart_port *port, struct ktermios *termios) +@@ -2919,15 +2936,15 @@ void serial8250_do_set_ldisc(struct uart_port *port, struct ktermios *termios) { if (termios->c_line == N_PPS) { port->flags |= UPF_HARDPPS_CD; @@ -2607,7 +2593,7 @@ index a17803da8..2d4e775cd 100644 } } } -@@ -3322,6 +3339,11 @@ static void serial8250_console_putchar(struct uart_port *port, unsigned char ch) +@@ -3323,6 +3340,11 @@ static void serial8250_console_putchar(struct uart_port *port, unsigned char ch) wait_for_xmitr(up, UART_LSR_THRE); serial_port_out(port, UART_TX, ch); @@ -2619,15 +2605,15 @@ index a17803da8..2d4e775cd 100644 } /* -@@ -3350,6 +3372,7 @@ static void serial8250_console_restore(struct uart_8250_port *up) +@@ -3351,6 +3373,7 @@ static void serial8250_console_restore(struct uart_8250_port *up) serial8250_out_MCR(up, up->mcr | UART_MCR_DTR | UART_MCR_RTS); } +#ifdef CONFIG_SERIAL_8250_LEGACY_CONSOLE - /* - * Print a string to the serial port using the device FIFO - * -@@ -3400,15 +3423,15 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, + static void fifo_wait_for_lsr(struct uart_8250_port *up, unsigned int count) + { + unsigned int i; +@@ -3420,15 +3443,15 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, touch_nmi_watchdog(); if (oops_in_progress) @@ -2646,7 +2632,7 @@ index a17803da8..2d4e775cd 100644 /* check scratch reg to see if port powered off during system sleep */ if (up->canary && (up->canary != serial_port_in(port, UART_SCR))) { -@@ -3472,8 +3495,137 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, +@@ -3492,8 +3515,137 @@ void serial8250_console_write(struct uart_8250_port *up, const char *s, serial8250_modem_status(up); if (locked) @@ -2785,7 +2771,7 @@ index a17803da8..2d4e775cd 100644 static unsigned int probe_baud(struct uart_port *port) { -@@ -3492,6 +3644,7 @@ static unsigned int probe_baud(struct uart_port *port) +@@ -3512,6 +3664,7 @@ static unsigned int probe_baud(struct uart_port *port) int serial8250_console_setup(struct uart_port *port, char *options, bool probe) { @@ -2793,7 +2779,7 @@ index a17803da8..2d4e775cd 100644 int baud = 9600; int bits = 8; int parity = 'n'; -@@ -3501,6 +3654,8 @@ int serial8250_console_setup(struct uart_port *port, char *options, bool probe) +@@ -3521,6 +3674,8 @@ int serial8250_console_setup(struct uart_port *port, char *options, bool probe) if (!port->iobase && !port->membase) return -ENODEV; @@ -3056,276 +3042,10 @@ index b5a7404cb..eabbf8afc 100644 } } diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c -index 362bbcdec..9cd660edb 100644 +index bb31ac9ca..8b7cf07e4 100644 --- a/drivers/tty/serial/amba-pl011.c +++ b/drivers/tty/serial/amba-pl011.c -@@ -347,9 +347,9 @@ static int pl011_fifo_to_tty(struct uart_amba_port *uap) - flag = TTY_FRAME; - } - -- spin_unlock(&uap->port.lock); -+ uart_port_unlock(&uap->port); - sysrq = uart_handle_sysrq_char(&uap->port, ch & 255); -- spin_lock(&uap->port.lock); -+ uart_port_lock(&uap->port); - - if (!sysrq) - uart_insert_char(&uap->port, ch, UART011_DR_OE, ch, flag); -@@ -544,7 +544,7 @@ static void pl011_dma_tx_callback(void *data) - unsigned long flags; - u16 dmacr; - -- spin_lock_irqsave(&uap->port.lock, flags); -+ uart_port_lock_irqsave(&uap->port, &flags); - if (uap->dmatx.queued) - dma_unmap_single(dmatx->chan->device->dev, dmatx->dma, - dmatx->len, DMA_TO_DEVICE); -@@ -565,7 +565,7 @@ static void pl011_dma_tx_callback(void *data) - if (!(dmacr & UART011_TXDMAE) || uart_tx_stopped(&uap->port) || - uart_circ_empty(&uap->port.state->xmit)) { - uap->dmatx.queued = false; -- spin_unlock_irqrestore(&uap->port.lock, flags); -+ uart_port_unlock_irqrestore(&uap->port, flags); - return; - } - -@@ -576,7 +576,7 @@ static void pl011_dma_tx_callback(void *data) - */ - pl011_start_tx_pio(uap); - -- spin_unlock_irqrestore(&uap->port.lock, flags); -+ uart_port_unlock_irqrestore(&uap->port, flags); - } - - /* -@@ -1004,7 +1004,7 @@ static void pl011_dma_rx_callback(void *data) - * routine to flush out the secondary DMA buffer while - * we immediately trigger the next DMA job. - */ -- spin_lock_irq(&uap->port.lock); -+ uart_port_lock_irq(&uap->port); - /* - * Rx data can be taken by the UART interrupts during - * the DMA irq handler. So we check the residue here. -@@ -1020,7 +1020,7 @@ static void pl011_dma_rx_callback(void *data) - ret = pl011_dma_rx_trigger_dma(uap); - - pl011_dma_rx_chars(uap, pending, lastbuf, false); -- spin_unlock_irq(&uap->port.lock); -+ uart_port_unlock_irq(&uap->port); - /* - * Do this check after we picked the DMA chars so we don't - * get some IRQ immediately from RX. -@@ -1086,11 +1086,11 @@ static void pl011_dma_rx_poll(struct timer_list *t) - if (jiffies_to_msecs(jiffies - dmarx->last_jiffies) - > uap->dmarx.poll_timeout) { - -- spin_lock_irqsave(&uap->port.lock, flags); -+ uart_port_lock_irqsave(&uap->port, &flags); - pl011_dma_rx_stop(uap); - uap->im |= UART011_RXIM; - pl011_write(uap->im, uap, REG_IMSC); -- spin_unlock_irqrestore(&uap->port.lock, flags); -+ uart_port_unlock_irqrestore(&uap->port, flags); - - uap->dmarx.running = false; - dmaengine_terminate_all(rxchan); -@@ -1186,10 +1186,10 @@ static void pl011_dma_shutdown(struct uart_amba_port *uap) - while (pl011_read(uap, REG_FR) & uap->vendor->fr_busy) - cpu_relax(); - -- spin_lock_irq(&uap->port.lock); -+ uart_port_lock_irq(&uap->port); - uap->dmacr &= ~(UART011_DMAONERR | UART011_RXDMAE | UART011_TXDMAE); - pl011_write(uap->dmacr, uap, REG_DMACR); -- spin_unlock_irq(&uap->port.lock); -+ uart_port_unlock_irq(&uap->port); - - if (uap->using_tx_dma) { - /* In theory, this should already be done by pl011_dma_flush_buffer */ -@@ -1400,9 +1400,9 @@ static void pl011_throttle_rx(struct uart_port *port) - { - unsigned long flags; - -- spin_lock_irqsave(&port->lock, flags); -+ uart_port_lock_irqsave(port, &flags); - pl011_stop_rx(port); -- spin_unlock_irqrestore(&port->lock, flags); -+ uart_port_unlock_irqrestore(port, flags); - } - - static void pl011_enable_ms(struct uart_port *port) -@@ -1420,7 +1420,7 @@ __acquires(&uap->port.lock) - { - pl011_fifo_to_tty(uap); - -- spin_unlock(&uap->port.lock); -+ uart_port_unlock(&uap->port); - tty_flip_buffer_push(&uap->port.state->port); - /* - * If we were temporarily out of DMA mode for a while, -@@ -1445,7 +1445,7 @@ __acquires(&uap->port.lock) - #endif - } - } -- spin_lock(&uap->port.lock); -+ uart_port_lock(&uap->port); - } - - static bool pl011_tx_char(struct uart_amba_port *uap, unsigned char c, -@@ -1551,7 +1551,7 @@ static irqreturn_t pl011_int(int irq, void *dev_id) - unsigned int status, pass_counter = AMBA_ISR_PASS_LIMIT; - int handled = 0; - -- spin_lock_irqsave(&uap->port.lock, flags); -+ uart_port_lock_irqsave(&uap->port, &flags); - status = pl011_read(uap, REG_RIS) & uap->im; - if (status) { - do { -@@ -1581,7 +1581,7 @@ static irqreturn_t pl011_int(int irq, void *dev_id) - handled = 1; - } - -- spin_unlock_irqrestore(&uap->port.lock, flags); -+ uart_port_unlock_irqrestore(&uap->port, flags); - - return IRQ_RETVAL(handled); - } -@@ -1653,14 +1653,14 @@ static void pl011_break_ctl(struct uart_port *port, int break_state) - unsigned long flags; - unsigned int lcr_h; - -- spin_lock_irqsave(&uap->port.lock, flags); -+ uart_port_lock_irqsave(&uap->port, &flags); - lcr_h = pl011_read(uap, REG_LCRH_TX); - if (break_state == -1) - lcr_h |= UART01x_LCRH_BRK; - else - lcr_h &= ~UART01x_LCRH_BRK; - pl011_write(lcr_h, uap, REG_LCRH_TX); -- spin_unlock_irqrestore(&uap->port.lock, flags); -+ uart_port_unlock_irqrestore(&uap->port, flags); - } - - #ifdef CONFIG_CONSOLE_POLL -@@ -1799,7 +1799,7 @@ static void pl011_enable_interrupts(struct uart_amba_port *uap) - unsigned long flags; - unsigned int i; - -- spin_lock_irqsave(&uap->port.lock, flags); -+ uart_port_lock_irqsave(&uap->port, &flags); - - /* Clear out any spuriously appearing RX interrupts */ - pl011_write(UART011_RTIS | UART011_RXIS, uap, REG_ICR); -@@ -1821,7 +1821,7 @@ static void pl011_enable_interrupts(struct uart_amba_port *uap) - if (!pl011_dma_rx_running(uap)) - uap->im |= UART011_RXIM; - pl011_write(uap->im, uap, REG_IMSC); -- spin_unlock_irqrestore(&uap->port.lock, flags); -+ uart_port_unlock_irqrestore(&uap->port, flags); - } - - static void pl011_unthrottle_rx(struct uart_port *port) -@@ -1829,7 +1829,7 @@ static void pl011_unthrottle_rx(struct uart_port *port) - struct uart_amba_port *uap = container_of(port, struct uart_amba_port, port); - unsigned long flags; - -- spin_lock_irqsave(&uap->port.lock, flags); -+ uart_port_lock_irqsave(&uap->port, &flags); - - uap->im = UART011_RTIM; - if (!pl011_dma_rx_running(uap)) -@@ -1837,7 +1837,7 @@ static void pl011_unthrottle_rx(struct uart_port *port) - - pl011_write(uap->im, uap, REG_IMSC); - -- spin_unlock_irqrestore(&uap->port.lock, flags); -+ uart_port_unlock_irqrestore(&uap->port, flags); - } - - static int pl011_startup(struct uart_port *port) -@@ -1857,7 +1857,7 @@ static int pl011_startup(struct uart_port *port) - - pl011_write(uap->vendor->ifls, uap, REG_IFLS); - -- spin_lock_irq(&uap->port.lock); -+ uart_port_lock_irq(&uap->port); - - cr = pl011_read(uap, REG_CR); - cr &= UART011_CR_RTS | UART011_CR_DTR; -@@ -1868,7 +1868,7 @@ static int pl011_startup(struct uart_port *port) - - pl011_write(cr, uap, REG_CR); - -- spin_unlock_irq(&uap->port.lock); -+ uart_port_unlock_irq(&uap->port); - - /* - * initialise the old status of the modem signals -@@ -1929,12 +1929,12 @@ static void pl011_disable_uart(struct uart_amba_port *uap) - unsigned int cr; - - uap->port.status &= ~(UPSTAT_AUTOCTS | UPSTAT_AUTORTS); -- spin_lock_irq(&uap->port.lock); -+ uart_port_lock_irq(&uap->port); - cr = pl011_read(uap, REG_CR); - cr &= UART011_CR_RTS | UART011_CR_DTR; - cr |= UART01x_CR_UARTEN | UART011_CR_TXE; - pl011_write(cr, uap, REG_CR); -- spin_unlock_irq(&uap->port.lock); -+ uart_port_unlock_irq(&uap->port); - - /* - * disable break condition and fifos -@@ -1946,14 +1946,14 @@ static void pl011_disable_uart(struct uart_amba_port *uap) - - static void pl011_disable_interrupts(struct uart_amba_port *uap) - { -- spin_lock_irq(&uap->port.lock); -+ uart_port_lock_irq(&uap->port); - - /* mask all interrupts and clear all pending ones */ - uap->im = 0; - pl011_write(uap->im, uap, REG_IMSC); - pl011_write(0xffff, uap, REG_ICR); - -- spin_unlock_irq(&uap->port.lock); -+ uart_port_unlock_irq(&uap->port); - } - - static void pl011_shutdown(struct uart_port *port) -@@ -2098,7 +2098,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios, - - bits = tty_get_frame_size(termios->c_cflag); - -- spin_lock_irqsave(&port->lock, flags); -+ uart_port_lock_irqsave(port, &flags); - - /* - * Update the per-port timeout. -@@ -2172,7 +2172,7 @@ pl011_set_termios(struct uart_port *port, struct ktermios *termios, - old_cr |= UART011_CR_RXE; - pl011_write(old_cr, uap, REG_CR); - -- spin_unlock_irqrestore(&port->lock, flags); -+ uart_port_unlock_irqrestore(port, flags); - } - - static void -@@ -2190,10 +2190,10 @@ sbsa_uart_set_termios(struct uart_port *port, struct ktermios *termios, - termios->c_cflag &= ~(CMSPAR | CRTSCTS); - termios->c_cflag |= CS8 | CLOCAL; - -- spin_lock_irqsave(&port->lock, flags); -+ uart_port_lock_irqsave(port, &flags); - uart_update_timeout(port, CS8, uap->fixed_baud); - pl011_setup_status_masks(port, termios); -- spin_unlock_irqrestore(&port->lock, flags); -+ uart_port_unlock_irqrestore(port, flags); - } - - static const char *pl011_type(struct uart_port *port) -@@ -2328,13 +2328,10 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) +@@ -2335,13 +2335,10 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) clk_enable(uap->clk); @@ -3333,20 +3053,20 @@ index 362bbcdec..9cd660edb 100644 - if (uap->port.sysrq) - locked = 0; - else if (oops_in_progress) -- locked = spin_trylock(&uap->port.lock); +- locked = uart_port_trylock(&uap->port); + if (uap->port.sysrq || oops_in_progress) + locked = uart_port_trylock_irqsave(&uap->port, &flags); else -- spin_lock(&uap->port.lock); +- uart_port_lock(&uap->port); + uart_port_lock_irqsave(&uap->port, &flags); /* * First save the CR then disable the interrupts -@@ -2360,8 +2357,7 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) +@@ -2367,8 +2364,7 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) pl011_write(old_cr, uap, REG_CR); if (locked) -- spin_unlock(&uap->port.lock); +- uart_port_unlock(&uap->port); - local_irq_restore(flags); + uart_port_unlock_irqrestore(&uap->port, flags); @@ -4546,7 +4266,7 @@ index 819f957b6..a75eafbcb 100644 static const char *icom_type(struct uart_port *port) diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c -index a5d0df2ba..267c9af4b 100644 +index 349d4849b..3934ab8fe 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c @@ -586,7 +586,7 @@ static void imx_uart_dma_tx_callback(void *data) @@ -4567,7 +4287,7 @@ index a5d0df2ba..267c9af4b 100644 } /* called with port.lock taken and irqs off */ -@@ -782,11 +782,11 @@ static irqreturn_t imx_uart_rtsint(int irq, void *dev_id) +@@ -797,11 +797,11 @@ static irqreturn_t imx_uart_rtsint(int irq, void *dev_id) struct imx_port *sport = dev_id; irqreturn_t ret; @@ -4581,7 +4301,7 @@ index a5d0df2ba..267c9af4b 100644 return ret; } -@@ -795,9 +795,9 @@ static irqreturn_t imx_uart_txint(int irq, void *dev_id) +@@ -810,9 +810,9 @@ static irqreturn_t imx_uart_txint(int irq, void *dev_id) { struct imx_port *sport = dev_id; @@ -4593,7 +4313,7 @@ index a5d0df2ba..267c9af4b 100644 return IRQ_HANDLED; } -@@ -911,11 +911,11 @@ static irqreturn_t imx_uart_rxint(int irq, void *dev_id) +@@ -926,11 +926,11 @@ static irqreturn_t imx_uart_rxint(int irq, void *dev_id) struct imx_port *sport = dev_id; irqreturn_t ret; @@ -4607,7 +4327,7 @@ index a5d0df2ba..267c9af4b 100644 return ret; } -@@ -978,7 +978,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id) +@@ -993,7 +993,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id) unsigned int usr1, usr2, ucr1, ucr2, ucr3, ucr4; irqreturn_t ret = IRQ_NONE; @@ -4616,7 +4336,7 @@ index a5d0df2ba..267c9af4b 100644 usr1 = imx_uart_readl(sport, USR1); usr2 = imx_uart_readl(sport, USR2); -@@ -1048,7 +1048,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id) +@@ -1063,7 +1063,7 @@ static irqreturn_t imx_uart_int(int irq, void *dev_id) ret = IRQ_HANDLED; } @@ -4625,7 +4345,7 @@ index a5d0df2ba..267c9af4b 100644 return ret; } -@@ -1131,7 +1131,7 @@ static void imx_uart_break_ctl(struct uart_port *port, int break_state) +@@ -1146,7 +1146,7 @@ static void imx_uart_break_ctl(struct uart_port *port, int break_state) unsigned long flags; u32 ucr1; @@ -4634,7 +4354,7 @@ index a5d0df2ba..267c9af4b 100644 ucr1 = imx_uart_readl(sport, UCR1) & ~UCR1_SNDBRK; -@@ -1140,7 +1140,7 @@ static void imx_uart_break_ctl(struct uart_port *port, int break_state) +@@ -1155,7 +1155,7 @@ static void imx_uart_break_ctl(struct uart_port *port, int break_state) imx_uart_writel(sport, ucr1, UCR1); @@ -4643,7 +4363,7 @@ index a5d0df2ba..267c9af4b 100644 } /* -@@ -1153,9 +1153,9 @@ static void imx_uart_timeout(struct timer_list *t) +@@ -1168,9 +1168,9 @@ static void imx_uart_timeout(struct timer_list *t) unsigned long flags; if (sport->port.state) { @@ -4655,7 +4375,7 @@ index a5d0df2ba..267c9af4b 100644 mod_timer(&sport->timer, jiffies + MCTRL_TIMEOUT); } -@@ -1185,9 +1185,9 @@ static void imx_uart_dma_rx_callback(void *data) +@@ -1200,9 +1200,9 @@ static void imx_uart_dma_rx_callback(void *data) status = dmaengine_tx_status(chan, sport->rx_cookie, &state); if (status == DMA_ERROR) { @@ -4667,7 +4387,7 @@ index a5d0df2ba..267c9af4b 100644 return; } -@@ -1216,9 +1216,9 @@ static void imx_uart_dma_rx_callback(void *data) +@@ -1231,9 +1231,9 @@ static void imx_uart_dma_rx_callback(void *data) r_bytes = rx_ring->head - rx_ring->tail; /* If we received something, check for 0xff flood */ @@ -4679,7 +4399,7 @@ index a5d0df2ba..267c9af4b 100644 if (!(sport->port.ignore_status_mask & URXD_DUMMY_READ)) { -@@ -1476,7 +1476,7 @@ static int imx_uart_startup(struct uart_port *port) +@@ -1491,7 +1491,7 @@ static int imx_uart_startup(struct uart_port *port) if (!uart_console(port) && imx_uart_dma_init(sport) == 0) dma_is_inited = 1; @@ -4688,7 +4408,7 @@ index a5d0df2ba..267c9af4b 100644 /* Reset fifo's and state machines */ imx_uart_soft_reset(sport); -@@ -1549,7 +1549,7 @@ static int imx_uart_startup(struct uart_port *port) +@@ -1564,7 +1564,7 @@ static int imx_uart_startup(struct uart_port *port) imx_uart_disable_loopback_rs485(sport); @@ -4697,7 +4417,7 @@ index a5d0df2ba..267c9af4b 100644 return 0; } -@@ -1574,21 +1574,21 @@ static void imx_uart_shutdown(struct uart_port *port) +@@ -1589,21 +1589,21 @@ static void imx_uart_shutdown(struct uart_port *port) sport->dma_is_rxing = 0; } @@ -4723,7 +4443,7 @@ index a5d0df2ba..267c9af4b 100644 /* * Stop our timer. -@@ -1599,7 +1599,7 @@ static void imx_uart_shutdown(struct uart_port *port) +@@ -1614,7 +1614,7 @@ static void imx_uart_shutdown(struct uart_port *port) * Disable all interrupts, port and break condition. */ @@ -4732,7 +4452,7 @@ index a5d0df2ba..267c9af4b 100644 ucr1 = imx_uart_readl(sport, UCR1); ucr1 &= ~(UCR1_TRDYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_RXDMAEN | -@@ -1621,7 +1621,7 @@ static void imx_uart_shutdown(struct uart_port *port) +@@ -1636,7 +1636,7 @@ static void imx_uart_shutdown(struct uart_port *port) ucr4 &= ~UCR4_TCEN; imx_uart_writel(sport, ucr4, UCR4); @@ -4741,7 +4461,7 @@ index a5d0df2ba..267c9af4b 100644 clk_disable_unprepare(sport->clk_per); clk_disable_unprepare(sport->clk_ipg); -@@ -1684,7 +1684,7 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -1699,7 +1699,7 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios, baud = uart_get_baud_rate(port, termios, old, 50, port->uartclk / 16); quot = uart_get_divisor(port, baud); @@ -4750,7 +4470,7 @@ index a5d0df2ba..267c9af4b 100644 /* * Read current UCR2 and save it for future use, then clear all the bits -@@ -1812,7 +1812,7 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -1827,7 +1827,7 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios, if (UART_ENABLE_MS(&sport->port, termios->c_cflag)) imx_uart_enable_ms(&sport->port); @@ -4759,7 +4479,7 @@ index a5d0df2ba..267c9af4b 100644 } static const char *imx_uart_type(struct uart_port *port) -@@ -1874,7 +1874,7 @@ static int imx_uart_poll_init(struct uart_port *port) +@@ -1889,7 +1889,7 @@ static int imx_uart_poll_init(struct uart_port *port) imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT); @@ -4768,7 +4488,7 @@ index a5d0df2ba..267c9af4b 100644 /* * Be careful about the order of enabling bits here. First enable the -@@ -1902,7 +1902,7 @@ static int imx_uart_poll_init(struct uart_port *port) +@@ -1917,7 +1917,7 @@ static int imx_uart_poll_init(struct uart_port *port) imx_uart_writel(sport, ucr1 | UCR1_RRDYEN, UCR1); imx_uart_writel(sport, ucr2 | UCR2_ATEN, UCR2); @@ -4777,7 +4497,7 @@ index a5d0df2ba..267c9af4b 100644 return 0; } -@@ -2022,9 +2022,9 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count) +@@ -2037,9 +2037,9 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count) if (sport->port.sysrq) locked = 0; else if (oops_in_progress) @@ -4789,7 +4509,7 @@ index a5d0df2ba..267c9af4b 100644 /* * First, save UCR1/2/3 and then disable interrupts -@@ -2052,7 +2052,7 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count) +@@ -2067,7 +2067,7 @@ imx_uart_console_write(struct console *co, const char *s, unsigned int count) imx_uart_ucrs_restore(sport, &old_ucr); if (locked) @@ -4798,7 +4518,7 @@ index a5d0df2ba..267c9af4b 100644 } /* -@@ -2210,10 +2210,10 @@ static enum hrtimer_restart imx_trigger_start_tx(struct hrtimer *t) +@@ -2225,10 +2225,10 @@ static enum hrtimer_restart imx_trigger_start_tx(struct hrtimer *t) struct imx_port *sport = container_of(t, struct imx_port, trigger_start_tx); unsigned long flags; @@ -4811,7 +4531,7 @@ index a5d0df2ba..267c9af4b 100644 return HRTIMER_NORESTART; } -@@ -2223,10 +2223,10 @@ static enum hrtimer_restart imx_trigger_stop_tx(struct hrtimer *t) +@@ -2238,10 +2238,10 @@ static enum hrtimer_restart imx_trigger_stop_tx(struct hrtimer *t) struct imx_port *sport = container_of(t, struct imx_port, trigger_stop_tx); unsigned long flags; @@ -4824,7 +4544,7 @@ index a5d0df2ba..267c9af4b 100644 return HRTIMER_NORESTART; } -@@ -2493,9 +2493,9 @@ static void imx_uart_restore_context(struct imx_port *sport) +@@ -2508,9 +2508,9 @@ static void imx_uart_restore_context(struct imx_port *sport) { unsigned long flags; @@ -4836,7 +4556,7 @@ index a5d0df2ba..267c9af4b 100644 return; } -@@ -2510,7 +2510,7 @@ static void imx_uart_restore_context(struct imx_port *sport) +@@ -2525,7 +2525,7 @@ static void imx_uart_restore_context(struct imx_port *sport) imx_uart_writel(sport, sport->saved_reg[2], UCR3); imx_uart_writel(sport, sport->saved_reg[3], UCR4); sport->context_saved = false; @@ -4845,7 +4565,7 @@ index a5d0df2ba..267c9af4b 100644 } static void imx_uart_save_context(struct imx_port *sport) -@@ -2518,7 +2518,7 @@ static void imx_uart_save_context(struct imx_port *sport) +@@ -2533,7 +2533,7 @@ static void imx_uart_save_context(struct imx_port *sport) unsigned long flags; /* Save necessary regs */ @@ -4854,7 +4574,7 @@ index a5d0df2ba..267c9af4b 100644 sport->saved_reg[0] = imx_uart_readl(sport, UCR1); sport->saved_reg[1] = imx_uart_readl(sport, UCR2); sport->saved_reg[2] = imx_uart_readl(sport, UCR3); -@@ -2530,7 +2530,7 @@ static void imx_uart_save_context(struct imx_port *sport) +@@ -2545,7 +2545,7 @@ static void imx_uart_save_context(struct imx_port *sport) sport->saved_reg[8] = imx_uart_readl(sport, UBMR); sport->saved_reg[9] = imx_uart_readl(sport, IMX21_UTS); sport->context_saved = true; @@ -6732,10 +6452,10 @@ index 73c60f5ea..46e70e155 100644 clk_disable(up->clk); diff --git a/drivers/tty/serial/qcom_geni_serial.c b/drivers/tty/serial/qcom_geni_serial.c -index 2e1b1c827..549909644 100644 +index f820a09cb..a7db08431 100644 --- a/drivers/tty/serial/qcom_geni_serial.c +++ b/drivers/tty/serial/qcom_geni_serial.c -@@ -482,9 +482,9 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s, +@@ -492,9 +492,9 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s, uport = &port->uport; if (oops_in_progress) @@ -6747,7 +6467,7 @@ index 2e1b1c827..549909644 100644 geni_status = readl(uport->membase + SE_GENI_STATUS); -@@ -520,7 +520,7 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s, +@@ -530,7 +530,7 @@ static void qcom_geni_serial_console_write(struct console *co, const char *s, qcom_geni_serial_setup_tx(uport, port->tx_remaining); if (locked) @@ -6756,7 +6476,7 @@ index 2e1b1c827..549909644 100644 } static void handle_rx_console(struct uart_port *uport, u32 bytes, bool drop) -@@ -972,7 +972,7 @@ static irqreturn_t qcom_geni_serial_isr(int isr, void *dev) +@@ -992,7 +992,7 @@ static irqreturn_t qcom_geni_serial_isr(int isr, void *dev) if (uport->suspended) return IRQ_NONE; @@ -6907,7 +6627,7 @@ index be5c842b5..d824c8318 100644 local_irq_restore(flags); } diff --git a/drivers/tty/serial/rp2.c b/drivers/tty/serial/rp2.c -index de220ac8c..d46a81cdd 100644 +index 5a1de6044..45be2b881 100644 --- a/drivers/tty/serial/rp2.c +++ b/drivers/tty/serial/rp2.c @@ -276,9 +276,9 @@ static unsigned int rp2_uart_tx_empty(struct uart_port *port) @@ -7323,29 +7043,6 @@ index f3cd69346..dbec29d9a 100644 } static int __init sbd_console_setup(struct console *co, char *options) -diff --git a/drivers/tty/serial/sc16is7xx.c b/drivers/tty/serial/sc16is7xx.c -index 7a9924d9b..be9ae5cdd 100644 ---- a/drivers/tty/serial/sc16is7xx.c -+++ b/drivers/tty/serial/sc16is7xx.c -@@ -817,6 +817,7 @@ static void sc16is7xx_tx_proc(struct kthread_work *ws) - { - struct uart_port *port = &(to_sc16is7xx_one(ws, tx_work)->port); - struct sc16is7xx_one *one = to_sc16is7xx_one(port, port); -+ unsigned long flags; - - if ((port->rs485.flags & SER_RS485_ENABLED) && - (port->rs485.delay_rts_before_send > 0)) -@@ -825,6 +826,10 @@ static void sc16is7xx_tx_proc(struct kthread_work *ws) - mutex_lock(&one->efr_lock); - sc16is7xx_handle_tx(port); - mutex_unlock(&one->efr_lock); -+ -+ uart_port_lock_irqsave(port, &flags); -+ sc16is7xx_ier_set(port, SC16IS7XX_IER_THRI_BIT); -+ uart_port_unlock_irqrestore(port, flags); - } - - static void sc16is7xx_reconf_rs485(struct uart_port *port) diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c index d4ec943cb..6d4006b41 100644 --- a/drivers/tty/serial/serial-tegra.c @@ -7487,7 +7184,7 @@ index d4ec943cb..6d4006b41 100644 static const char *tegra_uart_type(struct uart_port *u) diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c -index ed8798fdf..f0cd976e2 100644 +index 8ff0efac6..398104760 100644 --- a/drivers/tty/serial/serial_core.c +++ b/drivers/tty/serial/serial_core.c @@ -79,7 +79,7 @@ static inline void uart_port_deref(struct uart_port *uport) @@ -7541,7 +7238,7 @@ index ed8798fdf..f0cd976e2 100644 } /* -@@ -715,11 +715,11 @@ static void uart_send_xchar(struct tty_struct *tty, char ch) +@@ -717,11 +717,11 @@ static void uart_send_xchar(struct tty_struct *tty, char ch) if (port->ops->send_xchar) port->ops->send_xchar(port, ch); else { @@ -7555,7 +7252,7 @@ index ed8798fdf..f0cd976e2 100644 } uart_port_deref(port); } -@@ -1106,9 +1106,9 @@ static int uart_tiocmget(struct tty_struct *tty) +@@ -1108,9 +1108,9 @@ static int uart_tiocmget(struct tty_struct *tty) if (!tty_io_error(tty)) { result = uport->mctrl; @@ -7567,7 +7264,7 @@ index ed8798fdf..f0cd976e2 100644 } out: mutex_unlock(&port->mutex); -@@ -1244,16 +1244,16 @@ static int uart_wait_modem_status(struct uart_state *state, unsigned long arg) +@@ -1246,16 +1246,16 @@ static int uart_wait_modem_status(struct uart_state *state, unsigned long arg) uport = uart_port_ref(state); if (!uport) return -EIO; @@ -7588,7 +7285,7 @@ index ed8798fdf..f0cd976e2 100644 set_current_state(TASK_INTERRUPTIBLE); -@@ -1298,9 +1298,9 @@ static int uart_get_icount(struct tty_struct *tty, +@@ -1300,9 +1300,9 @@ static int uart_get_icount(struct tty_struct *tty, uport = uart_port_ref(state); if (!uport) return -EIO; @@ -7600,7 +7297,7 @@ index ed8798fdf..f0cd976e2 100644 uart_port_deref(uport); icount->cts = cnow.cts; -@@ -1453,9 +1453,9 @@ static int uart_rs485_config(struct uart_port *port) +@@ -1455,9 +1455,9 @@ static int uart_rs485_config(struct uart_port *port) uart_set_rs485_termination(port, rs485); uart_set_rs485_rx_during_tx(port, rs485); @@ -7612,7 +7309,7 @@ index ed8798fdf..f0cd976e2 100644 if (ret) { memset(rs485, 0, sizeof(*rs485)); /* unset GPIOs */ -@@ -1472,9 +1472,9 @@ static int uart_get_rs485_config(struct uart_port *port, +@@ -1474,9 +1474,9 @@ static int uart_get_rs485_config(struct uart_port *port, unsigned long flags; struct serial_rs485 aux; @@ -7624,7 +7321,7 @@ index ed8798fdf..f0cd976e2 100644 if (copy_to_user(rs485, &aux, sizeof(aux))) return -EFAULT; -@@ -1502,7 +1502,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, +@@ -1504,7 +1504,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, uart_set_rs485_termination(port, &rs485); uart_set_rs485_rx_during_tx(port, &rs485); @@ -7633,7 +7330,7 @@ index ed8798fdf..f0cd976e2 100644 ret = port->rs485_config(port, &tty->termios, &rs485); if (!ret) { port->rs485 = rs485; -@@ -1511,7 +1511,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, +@@ -1513,7 +1513,7 @@ static int uart_set_rs485_config(struct tty_struct *tty, struct uart_port *port, if (!(rs485.flags & SER_RS485_ENABLED)) port->ops->set_mctrl(port, port->mctrl); } @@ -7642,7 +7339,7 @@ index ed8798fdf..f0cd976e2 100644 if (ret) { /* restore old GPIO settings */ gpiod_set_value_cansleep(port->rs485_term_gpio, -@@ -1536,9 +1536,9 @@ static int uart_get_iso7816_config(struct uart_port *port, +@@ -1538,9 +1538,9 @@ static int uart_get_iso7816_config(struct uart_port *port, if (!port->iso7816_config) return -ENOTTY; @@ -7654,7 +7351,7 @@ index ed8798fdf..f0cd976e2 100644 if (copy_to_user(iso7816, &aux, sizeof(aux))) return -EFAULT; -@@ -1567,9 +1567,9 @@ static int uart_set_iso7816_config(struct uart_port *port, +@@ -1569,9 +1569,9 @@ static int uart_set_iso7816_config(struct uart_port *port, if (iso7816.reserved[i]) return -EINVAL; @@ -7666,7 +7363,7 @@ index ed8798fdf..f0cd976e2 100644 if (ret) return ret; -@@ -1786,9 +1786,9 @@ static void uart_tty_port_shutdown(struct tty_port *port) +@@ -1788,9 +1788,9 @@ static void uart_tty_port_shutdown(struct tty_port *port) if (WARN(!uport, "detached port still initialized!\n")) return; @@ -7678,7 +7375,7 @@ index ed8798fdf..f0cd976e2 100644 serial_base_port_shutdown(uport); uart_port_shutdown(port); -@@ -1803,11 +1803,11 @@ static void uart_tty_port_shutdown(struct tty_port *port) +@@ -1805,11 +1805,11 @@ static void uart_tty_port_shutdown(struct tty_port *port) /* * Free the transmit buffer. */ @@ -7692,7 +7389,7 @@ index ed8798fdf..f0cd976e2 100644 free_page((unsigned long)buf); -@@ -1950,10 +1950,10 @@ static bool uart_carrier_raised(struct tty_port *port) +@@ -1952,10 +1952,10 @@ static bool uart_carrier_raised(struct tty_port *port) */ if (WARN_ON(!uport)) return true; @@ -7705,7 +7402,7 @@ index ed8798fdf..f0cd976e2 100644 uart_port_deref(uport); return mctrl & TIOCM_CAR; -@@ -2070,9 +2070,9 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i) +@@ -2072,9 +2072,9 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i) pm_state = state->pm_state; if (pm_state != UART_PM_STATE_ON) uart_change_pm(state, UART_PM_STATE_ON); @@ -7717,7 +7414,7 @@ index ed8798fdf..f0cd976e2 100644 if (pm_state != UART_PM_STATE_ON) uart_change_pm(state, pm_state); -@@ -2411,9 +2411,9 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2413,9 +2413,9 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) */ if (!console_suspend_enabled && uart_console(uport)) { if (uport->ops->start_rx) { @@ -7729,7 +7426,7 @@ index ed8798fdf..f0cd976e2 100644 } goto unlock; } -@@ -2428,7 +2428,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2430,7 +2430,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) tty_port_set_suspended(port, true); tty_port_set_initialized(port, false); @@ -7738,7 +7435,7 @@ index ed8798fdf..f0cd976e2 100644 ops->stop_tx(uport); if (!(uport->rs485.flags & SER_RS485_ENABLED)) ops->set_mctrl(uport, 0); -@@ -2436,7 +2436,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2438,7 +2438,7 @@ int uart_suspend_port(struct uart_driver *drv, struct uart_port *uport) mctrl = uport->mctrl; uport->mctrl = 0; ops->stop_rx(uport); @@ -7747,7 +7444,7 @@ index ed8798fdf..f0cd976e2 100644 /* * Wait for the transmitter to empty. -@@ -2508,9 +2508,9 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2510,9 +2510,9 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) uart_change_pm(state, UART_PM_STATE_ON); uport->ops->set_termios(uport, &termios, NULL); if (!console_suspend_enabled && uport->ops->start_rx) { @@ -7759,7 +7456,7 @@ index ed8798fdf..f0cd976e2 100644 } if (console_suspend_enabled) console_start(uport->cons); -@@ -2521,10 +2521,10 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2523,10 +2523,10 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) int ret; uart_change_pm(state, UART_PM_STATE_ON); @@ -7772,7 +7469,7 @@ index ed8798fdf..f0cd976e2 100644 if (console_suspend_enabled || !uart_console(uport)) { /* Protected by port mutex for now */ struct tty_struct *tty = port->tty; -@@ -2534,11 +2534,11 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) +@@ -2536,11 +2536,11 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport) if (tty) uart_change_line_settings(tty, state, NULL); uart_rs485_config(uport); @@ -7786,7 +7483,7 @@ index ed8798fdf..f0cd976e2 100644 tty_port_set_initialized(port, true); } else { /* -@@ -2650,11 +2650,11 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state, +@@ -2652,11 +2652,11 @@ uart_configure_port(struct uart_driver *drv, struct uart_state *state, * keep the DTR setting that is set in uart_set_options() * We probably don't need a spinlock around this, but */ @@ -7942,10 +7639,10 @@ index be08fb6f7..eaa980722 100644 static void diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c -index f793624fd..2559c9781 100644 +index 4350a69d9..9f8e224e1 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c -@@ -1205,7 +1205,7 @@ static void sci_dma_tx_complete(void *arg) +@@ -1206,7 +1206,7 @@ static void sci_dma_tx_complete(void *arg) dev_dbg(port->dev, "%s(%d)\n", __func__, port->line); @@ -7954,7 +7651,7 @@ index f793624fd..2559c9781 100644 uart_xmit_advance(port, s->tx_dma_len); -@@ -1229,7 +1229,7 @@ static void sci_dma_tx_complete(void *arg) +@@ -1230,7 +1230,7 @@ static void sci_dma_tx_complete(void *arg) } } @@ -7963,7 +7660,7 @@ index f793624fd..2559c9781 100644 } /* Locking: called with port lock held */ -@@ -1325,7 +1325,7 @@ static void sci_dma_rx_complete(void *arg) +@@ -1326,7 +1326,7 @@ static void sci_dma_rx_complete(void *arg) dev_dbg(port->dev, "%s(%d) active cookie %d\n", __func__, port->line, s->active_rx); @@ -7972,7 +7669,7 @@ index f793624fd..2559c9781 100644 active = sci_dma_rx_find_active(s); if (active >= 0) -@@ -1352,20 +1352,20 @@ static void sci_dma_rx_complete(void *arg) +@@ -1353,20 +1353,20 @@ static void sci_dma_rx_complete(void *arg) dma_async_issue_pending(chan); @@ -7997,7 +7694,7 @@ index f793624fd..2559c9781 100644 } static void sci_dma_tx_release(struct sci_port *s) -@@ -1414,13 +1414,13 @@ static int sci_dma_rx_submit(struct sci_port *s, bool port_lock_held) +@@ -1415,13 +1415,13 @@ static int sci_dma_rx_submit(struct sci_port *s, bool port_lock_held) fail: /* Switch to PIO */ if (!port_lock_held) @@ -8013,7 +7710,7 @@ index f793624fd..2559c9781 100644 return -EAGAIN; } -@@ -1442,14 +1442,14 @@ static void sci_dma_tx_work_fn(struct work_struct *work) +@@ -1443,14 +1443,14 @@ static void sci_dma_tx_work_fn(struct work_struct *work) * transmit till the end, and then the rest. Take the port lock to get a * consistent xmit buffer state. */ @@ -8030,7 +7727,7 @@ index f793624fd..2559c9781 100644 return; } -@@ -1457,7 +1457,7 @@ static void sci_dma_tx_work_fn(struct work_struct *work) +@@ -1458,7 +1458,7 @@ static void sci_dma_tx_work_fn(struct work_struct *work) DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!desc) { @@ -8039,7 +7736,7 @@ index f793624fd..2559c9781 100644 dev_warn(port->dev, "Failed preparing Tx DMA descriptor\n"); goto switch_to_pio; } -@@ -1469,12 +1469,12 @@ static void sci_dma_tx_work_fn(struct work_struct *work) +@@ -1470,12 +1470,12 @@ static void sci_dma_tx_work_fn(struct work_struct *work) desc->callback_param = s; s->cookie_tx = dmaengine_submit(desc); if (dma_submit_error(s->cookie_tx)) { @@ -8054,7 +7751,7 @@ index f793624fd..2559c9781 100644 dev_dbg(port->dev, "%s: %p: %d...%d, cookie %d\n", __func__, xmit->buf, tail, head, s->cookie_tx); -@@ -1482,10 +1482,10 @@ static void sci_dma_tx_work_fn(struct work_struct *work) +@@ -1483,10 +1483,10 @@ static void sci_dma_tx_work_fn(struct work_struct *work) return; switch_to_pio: @@ -8067,7 +7764,7 @@ index f793624fd..2559c9781 100644 return; } -@@ -1502,17 +1502,17 @@ static enum hrtimer_restart sci_dma_rx_timer_fn(struct hrtimer *t) +@@ -1503,17 +1503,17 @@ static enum hrtimer_restart sci_dma_rx_timer_fn(struct hrtimer *t) dev_dbg(port->dev, "DMA Rx timed out\n"); @@ -8088,7 +7785,7 @@ index f793624fd..2559c9781 100644 dev_dbg(port->dev, "Cookie %d #%d has already completed\n", s->active_rx, active); -@@ -1530,7 +1530,7 @@ static enum hrtimer_restart sci_dma_rx_timer_fn(struct hrtimer *t) +@@ -1531,7 +1531,7 @@ static enum hrtimer_restart sci_dma_rx_timer_fn(struct hrtimer *t) */ status = dmaengine_tx_status(s->chan_rx, s->active_rx, &state); if (status == DMA_COMPLETE) { @@ -8097,7 +7794,7 @@ index f793624fd..2559c9781 100644 dev_dbg(port->dev, "Transaction complete after DMA engine was stopped"); return HRTIMER_NORESTART; } -@@ -1551,7 +1551,7 @@ static enum hrtimer_restart sci_dma_rx_timer_fn(struct hrtimer *t) +@@ -1552,7 +1552,7 @@ static enum hrtimer_restart sci_dma_rx_timer_fn(struct hrtimer *t) sci_dma_rx_reenable_irq(s); @@ -8106,7 +7803,7 @@ index f793624fd..2559c9781 100644 return HRTIMER_NORESTART; } -@@ -1775,9 +1775,9 @@ static irqreturn_t sci_tx_interrupt(int irq, void *ptr) +@@ -1776,9 +1776,9 @@ static irqreturn_t sci_tx_interrupt(int irq, void *ptr) struct uart_port *port = ptr; unsigned long flags; @@ -8118,7 +7815,7 @@ index f793624fd..2559c9781 100644 return IRQ_HANDLED; } -@@ -1791,11 +1791,11 @@ static irqreturn_t sci_tx_end_interrupt(int irq, void *ptr) +@@ -1792,11 +1792,11 @@ static irqreturn_t sci_tx_end_interrupt(int irq, void *ptr) if (port->type != PORT_SCI) return sci_tx_interrupt(irq, ptr); @@ -8132,7 +7829,7 @@ index f793624fd..2559c9781 100644 return IRQ_HANDLED; } -@@ -2192,7 +2192,7 @@ static void sci_break_ctl(struct uart_port *port, int break_state) +@@ -2193,7 +2193,7 @@ static void sci_break_ctl(struct uart_port *port, int break_state) return; } @@ -8141,7 +7838,7 @@ index f793624fd..2559c9781 100644 scsptr = serial_port_in(port, SCSPTR); scscr = serial_port_in(port, SCSCR); -@@ -2206,7 +2206,7 @@ static void sci_break_ctl(struct uart_port *port, int break_state) +@@ -2207,7 +2207,7 @@ static void sci_break_ctl(struct uart_port *port, int break_state) serial_port_out(port, SCSPTR, scsptr); serial_port_out(port, SCSCR, scscr); @@ -8150,7 +7847,7 @@ index f793624fd..2559c9781 100644 } static int sci_startup(struct uart_port *port) -@@ -2238,7 +2238,7 @@ static void sci_shutdown(struct uart_port *port) +@@ -2239,7 +2239,7 @@ static void sci_shutdown(struct uart_port *port) s->autorts = false; mctrl_gpio_disable_ms(to_sci_port(port)->gpios); @@ -8159,7 +7856,7 @@ index f793624fd..2559c9781 100644 sci_stop_rx(port); sci_stop_tx(port); /* -@@ -2248,7 +2248,7 @@ static void sci_shutdown(struct uart_port *port) +@@ -2249,7 +2249,7 @@ static void sci_shutdown(struct uart_port *port) scr = serial_port_in(port, SCSCR); serial_port_out(port, SCSCR, scr & (SCSCR_CKE1 | SCSCR_CKE0 | s->hscif_tot)); @@ -8168,7 +7865,7 @@ index f793624fd..2559c9781 100644 #ifdef CONFIG_SERIAL_SH_SCI_DMA if (s->chan_rx_saved) { -@@ -2550,7 +2550,7 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -2551,7 +2551,7 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios, serial_port_out(port, SCCKS, sccks); } @@ -8177,7 +7874,7 @@ index f793624fd..2559c9781 100644 sci_reset(port); -@@ -2672,7 +2672,7 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios, +@@ -2673,7 +2673,7 @@ static void sci_set_termios(struct uart_port *port, struct ktermios *termios, if ((termios->c_cflag & CREAD) != 0) sci_start_rx(port); @@ -8186,7 +7883,7 @@ index f793624fd..2559c9781 100644 sci_port_disable(s); -@@ -3057,9 +3057,9 @@ static void serial_console_write(struct console *co, const char *s, +@@ -3058,9 +3058,9 @@ static void serial_console_write(struct console *co, const char *s, if (port->sysrq) locked = 0; else if (oops_in_progress) @@ -8198,7 +7895,7 @@ index f793624fd..2559c9781 100644 /* first save SCSCR then disable interrupts, keep clock source */ ctrl = serial_port_in(port, SCSCR); -@@ -3079,7 +3079,7 @@ static void serial_console_write(struct console *co, const char *s, +@@ -3080,7 +3080,7 @@ static void serial_console_write(struct console *co, const char *s, serial_port_out(port, SCSCR, ctrl); if (locked) @@ -8208,10 +7905,20 @@ index f793624fd..2559c9781 100644 static int serial_console_setup(struct console *co, char *options) diff --git a/drivers/tty/serial/sifive.c b/drivers/tty/serial/sifive.c -index d195c5de5..b296e57a9 100644 +index d195c5de5..d420bed4a 100644 --- a/drivers/tty/serial/sifive.c +++ b/drivers/tty/serial/sifive.c -@@ -521,11 +521,11 @@ static irqreturn_t sifive_serial_irq(int irq, void *dev_id) +@@ -412,7 +412,8 @@ static void __ssp_receive_chars(struct sifive_serial_port *ssp) + break; + + ssp->port.icount.rx++; +- uart_insert_char(&ssp->port, 0, 0, ch, TTY_NORMAL); ++ if (!uart_prepare_sysrq_char(&ssp->port, ch)) ++ uart_insert_char(&ssp->port, 0, 0, ch, TTY_NORMAL); + } + + tty_flip_buffer_push(&ssp->port.state->port); +@@ -521,11 +522,11 @@ static irqreturn_t sifive_serial_irq(int irq, void *dev_id) struct sifive_serial_port *ssp = dev_id; u32 ip; @@ -8225,16 +7932,16 @@ index d195c5de5..b296e57a9 100644 return IRQ_NONE; } -@@ -534,7 +534,7 @@ static irqreturn_t sifive_serial_irq(int irq, void *dev_id) +@@ -534,7 +535,7 @@ static irqreturn_t sifive_serial_irq(int irq, void *dev_id) if (ip & SIFIVE_SERIAL_IP_TXWM_MASK) __ssp_transmit_chars(ssp); - spin_unlock(&ssp->port.lock); -+ uart_port_unlock(&ssp->port); ++ uart_unlock_and_check_sysrq(&ssp->port); return IRQ_HANDLED; } -@@ -653,7 +653,7 @@ static void sifive_serial_set_termios(struct uart_port *port, +@@ -653,7 +654,7 @@ static void sifive_serial_set_termios(struct uart_port *port, ssp->port.uartclk / 16); __ssp_update_baud_rate(ssp, rate); @@ -8243,7 +7950,7 @@ index d195c5de5..b296e57a9 100644 /* Update the per-port timeout */ uart_update_timeout(port, termios->c_cflag, rate); -@@ -670,7 +670,7 @@ static void sifive_serial_set_termios(struct uart_port *port, +@@ -670,7 +671,7 @@ static void sifive_serial_set_termios(struct uart_port *port, if (v != old_v) __ssp_writel(v, SIFIVE_SERIAL_RXCTRL_OFFS, ssp); @@ -8252,27 +7959,33 @@ index d195c5de5..b296e57a9 100644 } static void sifive_serial_release_port(struct uart_port *port) -@@ -795,9 +795,9 @@ static void sifive_serial_console_write(struct console *co, const char *s, - if (ssp->port.sysrq) - locked = 0; - else if (oops_in_progress) +@@ -791,13 +792,10 @@ static void sifive_serial_console_write(struct console *co, const char *s, + if (!ssp) + return; + +- local_irq_save(flags); +- if (ssp->port.sysrq) +- locked = 0; +- else if (oops_in_progress) - locked = spin_trylock(&ssp->port.lock); -+ locked = uart_port_trylock(&ssp->port); ++ if (oops_in_progress) ++ locked = uart_port_trylock_irqsave(&ssp->port, &flags); else - spin_lock(&ssp->port.lock); -+ uart_port_lock(&ssp->port); ++ uart_port_lock_irqsave(&ssp->port, &flags); ier = __ssp_readl(ssp, SIFIVE_SERIAL_IE_OFFS); __ssp_writel(0, SIFIVE_SERIAL_IE_OFFS, ssp); -@@ -807,7 +807,7 @@ static void sifive_serial_console_write(struct console *co, const char *s, +@@ -807,8 +805,7 @@ static void sifive_serial_console_write(struct console *co, const char *s, __ssp_writel(ier, SIFIVE_SERIAL_IE_OFFS, ssp); if (locked) - spin_unlock(&ssp->port.lock); -+ uart_port_unlock(&ssp->port); - local_irq_restore(flags); +- local_irq_restore(flags); ++ uart_port_unlock_irqrestore(&ssp->port, flags); } + static int sifive_serial_console_setup(struct console *co, char *options) diff --git a/drivers/tty/serial/sprd_serial.c b/drivers/tty/serial/sprd_serial.c index f328fa572..f257525f9 100644 --- a/drivers/tty/serial/sprd_serial.c @@ -8474,68 +8187,91 @@ index 92b9f6894..a821f5d76 100644 static int asc_console_setup(struct console *co, char *options) diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c -index 48cd2d8d6..96daedd8d 100644 +index 5f51d9397..1c949774f 100644 --- a/drivers/tty/serial/stm32-usart.c +++ b/drivers/tty/serial/stm32-usart.c -@@ -693,7 +693,7 @@ static void stm32_usart_rx_dma_complete(void *arg) - unsigned int size; - unsigned long flags; +@@ -58,6 +58,7 @@ static struct stm32_usart_info __maybe_unused stm32f4_info = { + .cfg = { + .uart_enable_bit = 13, + .has_7bits_data = false, ++ .fifosize = 1, + } + }; + +@@ -81,6 +82,7 @@ static struct stm32_usart_info __maybe_unused stm32f7_info = { + .uart_enable_bit = 0, + .has_7bits_data = true, + .has_swap = true, ++ .fifosize = 1, + } + }; + +@@ -107,6 +109,7 @@ static struct stm32_usart_info __maybe_unused stm32h7_info = { + .has_swap = true, + .has_wakeup = true, + .has_fifo = true, ++ .fifosize = 16, + } + }; + +@@ -189,6 +192,7 @@ static void stm32_usart_config_reg_rs485(u32 *cr1, u32 *cr3, u32 delay_ADE, + u32 delay_DDE, u32 baud) + { + u32 rs485_deat_dedt; ++ u32 rs485_deat_dedt_max = (USART_CR1_DEAT_MASK >> USART_CR1_DEAT_SHIFT); + bool over8; + + *cr3 |= USART_CR3_DEM; +@@ -201,18 +205,24 @@ static void stm32_usart_config_reg_rs485(u32 *cr1, u32 *cr3, u32 delay_ADE, + else + rs485_deat_dedt = delay_ADE * baud * 16; + +- rs485_deat_dedt = DIV_ROUND_UP(rs485_deat_dedt, 1000); +- rs485_deat_dedt = min_t(u32, rs485_deat_dedt, FIELD_MAX(USART_CR1_DEAT_MASK)); +- *cr1 |= FIELD_PREP(USART_CR1_DEAT_MASK, rs485_deat_dedt); ++ rs485_deat_dedt = DIV_ROUND_CLOSEST(rs485_deat_dedt, 1000); ++ rs485_deat_dedt = rs485_deat_dedt > rs485_deat_dedt_max ? ++ rs485_deat_dedt_max : rs485_deat_dedt; ++ rs485_deat_dedt = (rs485_deat_dedt << USART_CR1_DEAT_SHIFT) & ++ USART_CR1_DEAT_MASK; ++ *cr1 |= rs485_deat_dedt; + + if (over8) + rs485_deat_dedt = delay_DDE * baud * 8; + else + rs485_deat_dedt = delay_DDE * baud * 16; + +- rs485_deat_dedt = DIV_ROUND_UP(rs485_deat_dedt, 1000); +- rs485_deat_dedt = min_t(u32, rs485_deat_dedt, FIELD_MAX(USART_CR1_DEDT_MASK)); +- *cr1 |= FIELD_PREP(USART_CR1_DEDT_MASK, rs485_deat_dedt); ++ rs485_deat_dedt = DIV_ROUND_CLOSEST(rs485_deat_dedt, 1000); ++ rs485_deat_dedt = rs485_deat_dedt > rs485_deat_dedt_max ? ++ rs485_deat_dedt_max : rs485_deat_dedt; ++ rs485_deat_dedt = (rs485_deat_dedt << USART_CR1_DEDT_SHIFT) & ++ USART_CR1_DEDT_MASK; ++ *cr1 |= rs485_deat_dedt; + } + + static int stm32_usart_config_rs485(struct uart_port *port, struct ktermios *termios, +@@ -711,7 +721,7 @@ static void stm32_usart_rx_dma_complete(void *arg) + + pm_runtime_get(port->dev); - spin_lock_irqsave(&port->lock, flags); + uart_port_lock_irqsave(port, &flags); size = stm32_usart_receive_chars(port, false); uart_unlock_and_check_sysrq_irqrestore(port, flags); if (size) -@@ -813,9 +813,9 @@ static void stm32_usart_tx_dma_complete(void *arg) - stm32_usart_tx_dma_terminate(stm32port); - - /* Let's see if we have pending data to send */ -- spin_lock_irqsave(&port->lock, flags); -+ uart_port_lock_irqsave(port, &flags); - stm32_usart_transmit_chars(port); -- spin_unlock_irqrestore(&port->lock, flags); -+ uart_port_unlock_irqrestore(port, flags); - } - - static void stm32_usart_tx_interrupt_enable(struct uart_port *port) -@@ -1095,7 +1095,7 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) - if (!stm32_port->throttled) { - if (((sr & USART_SR_RXNE) && !stm32_usart_rx_dma_started(stm32_port)) || - ((sr & USART_SR_ERR_MASK) && stm32_usart_rx_dma_started(stm32_port))) { -- spin_lock(&port->lock); -+ uart_port_lock(port); - size = stm32_usart_receive_chars(port, false); - uart_unlock_and_check_sysrq(port); - if (size) -@@ -1106,15 +1106,15 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) - } - - if ((sr & USART_SR_TXE) && !(stm32_port->tx_ch)) { -- spin_lock(&port->lock); -+ uart_port_lock(port); - stm32_usart_transmit_chars(port); -- spin_unlock(&port->lock); -+ uart_port_unlock(port); - ret = IRQ_HANDLED; - } - - /* Receiver timeout irq for DMA RX */ - if (stm32_usart_rx_dma_started(stm32_port) && !stm32_port->throttled) { -- spin_lock(&port->lock); -+ uart_port_lock(port); - size = stm32_usart_receive_chars(port, false); - uart_unlock_and_check_sysrq(port); - if (size) -@@ -1203,7 +1203,7 @@ static void stm32_usart_throttle(struct uart_port *port) - const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; - unsigned long flags; +@@ -1272,7 +1282,7 @@ static void stm32_usart_throttle(struct uart_port *port) + */ + pm_runtime_get(port->dev); - spin_lock_irqsave(&port->lock, flags); + uart_port_lock_irqsave(port, &flags); /* * Pause DMA transfer, so the RX data gets queued into the FIFO. -@@ -1216,7 +1216,7 @@ static void stm32_usart_throttle(struct uart_port *port) +@@ -1285,7 +1295,7 @@ static void stm32_usart_throttle(struct uart_port *port) stm32_usart_clr_bits(port, ofs->cr3, stm32_port->cr3_irq); stm32_port->throttled = true; @@ -8544,7 +8280,7 @@ index 48cd2d8d6..96daedd8d 100644 } /* Unthrottle the remote, the input buffer can now accept data. */ -@@ -1226,7 +1226,7 @@ static void stm32_usart_unthrottle(struct uart_port *port) +@@ -1295,7 +1305,7 @@ static void stm32_usart_unthrottle(struct uart_port *port) const struct stm32_usart_offsets *ofs = &stm32_port->info->ofs; unsigned long flags; @@ -8553,16 +8289,15 @@ index 48cd2d8d6..96daedd8d 100644 stm32_usart_set_bits(port, ofs->cr1, stm32_port->cr1_irq); if (stm32_port->cr3_irq) stm32_usart_set_bits(port, ofs->cr3, stm32_port->cr3_irq); -@@ -1240,7 +1240,7 @@ static void stm32_usart_unthrottle(struct uart_port *port) - if (stm32_port->rx_ch) - stm32_usart_rx_dma_start_or_resume(port); - -- spin_unlock_irqrestore(&port->lock, flags); -+ uart_port_unlock_irqrestore(port, flags); +@@ -1335,6 +1345,7 @@ static void stm32_usart_stop_rx(struct uart_port *port) + pm_runtime_put_autosuspend(port->dev); } - /* Receive stop */ -@@ -1379,7 +1379,7 @@ static void stm32_usart_set_termios(struct uart_port *port, ++/* Handle breaks - ignored by us */ + static void stm32_usart_break_ctl(struct uart_port *port, int break_state) + { + struct stm32_port *stm32_port = to_stm32_port(port); +@@ -1475,7 +1486,7 @@ static void stm32_usart_set_termios(struct uart_port *port, uart_clk = clk_get_rate(stm32_port->clk); @@ -8571,7 +8306,18 @@ index 48cd2d8d6..96daedd8d 100644 ret = readl_relaxed_poll_timeout_atomic(port->membase + ofs->isr, isr, -@@ -1599,7 +1599,7 @@ static void stm32_usart_set_termios(struct uart_port *port, +@@ -1690,12 +1701,18 @@ static void stm32_usart_set_termios(struct uart_port *port, + cr1 &= ~(USART_CR1_DEDT_MASK | USART_CR1_DEAT_MASK); + } + ++ /* Configure wake up from low power on start bit detection */ ++ if (stm32_port->wakeup_src) { ++ cr3 &= ~USART_CR3_WUS_MASK; ++ cr3 |= USART_CR3_WUS_START_BIT; ++ } ++ + writel_relaxed(cr3, port->membase + ofs->cr3); + writel_relaxed(cr2, port->membase + ofs->cr2); writel_relaxed(cr1, port->membase + ofs->cr1); stm32_usart_set_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit)); @@ -8580,19 +8326,30 @@ index 48cd2d8d6..96daedd8d 100644 /* Handle modem control interrupts */ if (UART_ENABLE_MS(port, termios->c_cflag)) -@@ -1649,9 +1649,9 @@ static void stm32_usart_pm(struct uart_port *port, unsigned int state, - pm_runtime_get_sync(port->dev); - break; - case UART_PM_STATE_OFF: -- spin_lock_irqsave(&port->lock, flags); -+ uart_port_lock_irqsave(port, &flags); - stm32_usart_clr_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit)); -- spin_unlock_irqrestore(&port->lock, flags); -+ uart_port_unlock_irqrestore(port, flags); - pm_runtime_put_sync(port->dev); - break; - } -@@ -2204,9 +2204,9 @@ static void stm32_usart_console_write(struct console *co, const char *s, +@@ -1893,6 +1910,7 @@ static int stm32_usart_init_port(struct stm32_port *stm32port, + port->flags = UPF_BOOT_AUTOCONF; + port->ops = &stm32_uart_ops; + port->dev = &pdev->dev; ++ port->fifosize = stm32port->info->cfg.fifosize; + port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_STM32_CONSOLE); + port->irq = irq; + port->rs485_config = stm32_usart_config_rs485; +@@ -1910,6 +1928,14 @@ static int stm32_usart_init_port(struct stm32_port *stm32port, + stm32port->swap = stm32port->info->cfg.has_swap && + of_property_read_bool(pdev->dev.of_node, "rx-tx-swap"); + ++ stm32port->fifoen = stm32port->info->cfg.has_fifo; ++ if (stm32port->fifoen) { ++ stm32_usart_get_ftcfg(pdev, "rx-threshold", ++ &stm32port->rxftcfg); ++ stm32_usart_get_ftcfg(pdev, "tx-threshold", ++ &stm32port->txftcfg); ++ } ++ + port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(port->membase)) + return PTR_ERR(port->membase); +@@ -2301,9 +2327,9 @@ static void stm32_usart_console_write(struct console *co, const char *s, int locked = 1; if (oops_in_progress) @@ -8602,10 +8359,10 @@ index 48cd2d8d6..96daedd8d 100644 - spin_lock_irqsave(&port->lock, flags); + uart_port_lock_irqsave(port, &flags); - /* Save and disable interrupts, enable the transmitter */ - old_cr1 = readl_relaxed(port->membase + ofs->cr1); -@@ -2220,7 +2220,7 @@ static void stm32_usart_console_write(struct console *co, const char *s, - writel_relaxed(old_cr1, port->membase + ofs->cr1); + pm_runtime_get(port->dev); + +@@ -2322,7 +2348,7 @@ static void stm32_usart_console_write(struct console *co, const char *s, + pm_runtime_put_autosuspend(port->dev); if (locked) - spin_unlock_irqrestore(&port->lock, flags); @@ -8613,7 +8370,7 @@ index 48cd2d8d6..96daedd8d 100644 } static int stm32_usart_console_setup(struct console *co, char *options) -@@ -2357,7 +2357,7 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port, +@@ -2459,7 +2485,7 @@ static int __maybe_unused stm32_usart_serial_en_wakeup(struct uart_port *port, * low-power mode. */ if (stm32_port->rx_ch) { @@ -9510,7 +9267,7 @@ index c5d5c2765..78a1c1eea 100644 static const char *vt8500_type(struct uart_port *port) diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c -index 2e5e86a00..9c13dac1d 100644 +index 7f83d2780..84652f530 100644 --- a/drivers/tty/serial/xilinx_uartps.c +++ b/drivers/tty/serial/xilinx_uartps.c @@ -346,7 +346,7 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id) @@ -9522,15 +9279,6 @@ index 2e5e86a00..9c13dac1d 100644 /* Read the interrupt status register to determine which * interrupt(s) is/are active and clear them. -@@ -369,7 +369,7 @@ static irqreturn_t cdns_uart_isr(int irq, void *dev_id) - !(readl(port->membase + CDNS_UART_CR) & CDNS_UART_CR_RX_DIS)) - cdns_uart_handle_rx(dev_id, isrstatus); - -- spin_unlock(&port->lock); -+ uart_port_unlock(port); - return IRQ_HANDLED; - } - @@ -506,14 +506,14 @@ static int cdns_uart_clk_notifier_cb(struct notifier_block *nb, return NOTIFY_BAD; } @@ -9683,19 +9431,16 @@ index 2e5e86a00..9c13dac1d 100644 } #endif -@@ -1232,9 +1232,9 @@ static void cdns_uart_console_write(struct console *co, const char *s, - if (port->sysrq) - locked = 0; - else if (oops_in_progress) -- locked = spin_trylock_irqsave(&port->lock, flags); -+ locked = uart_port_trylock_irqsave(port, &flags); +@@ -1232,7 +1232,7 @@ static void cdns_uart_console_write(struct console *co, const char *s, + if (oops_in_progress) + locked = uart_port_trylock_irqsave(port, &flags); else - spin_lock_irqsave(&port->lock, flags); + uart_port_lock_irqsave(port, &flags); /* save and disable interrupt */ imr = readl(port->membase + CDNS_UART_IMR); -@@ -1257,7 +1257,7 @@ static void cdns_uart_console_write(struct console *co, const char *s, +@@ -1255,7 +1255,7 @@ static void cdns_uart_console_write(struct console *co, const char *s, writel(imr, port->membase + CDNS_UART_IER); if (locked) @@ -9704,7 +9449,7 @@ index 2e5e86a00..9c13dac1d 100644 } /** -@@ -1325,7 +1325,7 @@ static int cdns_uart_suspend(struct device *device) +@@ -1323,7 +1323,7 @@ static int cdns_uart_suspend(struct device *device) if (console_suspend_enabled && uart_console(port) && may_wake) { unsigned long flags; @@ -9713,7 +9458,7 @@ index 2e5e86a00..9c13dac1d 100644 /* Empty the receive FIFO 1st before making changes */ while (!(readl(port->membase + CDNS_UART_SR) & CDNS_UART_SR_RXEMPTY)) -@@ -1334,7 +1334,7 @@ static int cdns_uart_suspend(struct device *device) +@@ -1332,7 +1332,7 @@ static int cdns_uart_suspend(struct device *device) writel(1, port->membase + CDNS_UART_RXWM); /* disable RX timeout interrups */ writel(CDNS_UART_IXR_TOUT, port->membase + CDNS_UART_IDR); @@ -9722,7 +9467,7 @@ index 2e5e86a00..9c13dac1d 100644 } /* -@@ -1372,7 +1372,7 @@ static int cdns_uart_resume(struct device *device) +@@ -1370,7 +1370,7 @@ static int cdns_uart_resume(struct device *device) return ret; } @@ -9731,7 +9476,7 @@ index 2e5e86a00..9c13dac1d 100644 /* Set TX/RX Reset */ ctrl_reg = readl(port->membase + CDNS_UART_CR); -@@ -1392,14 +1392,14 @@ static int cdns_uart_resume(struct device *device) +@@ -1390,14 +1390,14 @@ static int cdns_uart_resume(struct device *device) clk_disable(cdns_uart->uartclk); clk_disable(cdns_uart->pclk); @@ -9750,7 +9495,7 @@ index 2e5e86a00..9c13dac1d 100644 return uart_resume_port(cdns_uart->cdns_uart_driver, port); diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c -index 493fc4742..afa52883c 100644 +index 117abcf36..03e2eaf24 100644 --- a/drivers/tty/tty_io.c +++ b/drivers/tty/tty_io.c @@ -3543,8 +3543,15 @@ static ssize_t show_cons_active(struct device *dev, @@ -9809,6 +9554,22 @@ index e0758fe79..270367654 100644 if (dev) seq_printf(m, " %4d:%d", MAJOR(dev), MINOR(dev)); +diff --git a/git.info b/git.info +new file mode 100644 +index 000000000..b8640a182 +--- /dev/null ++++ b/git.info +@@ -0,0 +1,10 @@ ++devel-rt https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git (fetch) ++devel-rt https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git (push) ++origin https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git (fetch) ++origin https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git (push) ++rt https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git (fetch) ++rt https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git (push) ++stable https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git (fetch) ++stable https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git (push) ++stm32 https://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32.git (fetch) ++stm32 https://git.kernel.org/pub/scm/linux/kernel/git/atorgue/stm32.git (push) diff --git a/include/linux/bottom_half.h b/include/linux/bottom_half.h index fc53e0ad5..448bbef47 100644 --- a/include/linux/bottom_half.h @@ -10088,7 +9849,7 @@ index 4a1dc88dd..a5091ac97 100644 static inline struct task_struct *this_cpu_ksoftirqd(void) diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index b8e60a204..ffa5248a9 100644 +index 8b5121eb8..45521298a 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3258,7 +3258,11 @@ struct softnet_data { @@ -10171,10 +9932,10 @@ index e4878bb58..ebebc32e7 100644 #ifdef CONFIG_SMP diff --git a/include/linux/sched.h b/include/linux/sched.h -index 77f01ac38..c02fd12b4 100644 +index 2af0a8859..06d4393e2 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h -@@ -911,6 +911,9 @@ struct task_struct { +@@ -917,6 +917,9 @@ struct task_struct { * ->sched_remote_wakeup gets used, so it can be in this word. */ unsigned sched_remote_wakeup:1; @@ -10184,7 +9945,7 @@ index 77f01ac38..c02fd12b4 100644 /* Bit to tell LSMs we're in execve(): */ unsigned in_execve:1; -@@ -1902,6 +1905,7 @@ static inline int dl_task_check_affinity(struct task_struct *p, const struct cpu +@@ -1909,6 +1912,7 @@ static inline int dl_task_check_affinity(struct task_struct *p, const struct cpu } #endif @@ -10192,7 +9953,7 @@ index 77f01ac38..c02fd12b4 100644 extern int yield_to(struct task_struct *p, bool preempt); extern void set_user_nice(struct task_struct *p, long nice); extern int task_prio(const struct task_struct *p); -@@ -2046,17 +2050,17 @@ static inline void update_tsk_thread_flag(struct task_struct *tsk, int flag, +@@ -2053,17 +2057,17 @@ static inline void update_tsk_thread_flag(struct task_struct *tsk, int flag, update_ti_thread_flag(task_thread_info(tsk), flag, value); } @@ -10213,7 +9974,7 @@ index 77f01ac38..c02fd12b4 100644 { return test_ti_thread_flag(task_thread_info(tsk), flag); } -@@ -2069,9 +2073,11 @@ static inline void set_tsk_need_resched(struct task_struct *tsk) +@@ -2076,9 +2080,11 @@ static inline void set_tsk_need_resched(struct task_struct *tsk) static inline void clear_tsk_need_resched(struct task_struct *tsk) { clear_tsk_thread_flag(tsk,TIF_NEED_RESCHED); @@ -10226,7 +9987,7 @@ index 77f01ac38..c02fd12b4 100644 { return unlikely(test_tsk_thread_flag(tsk,TIF_NEED_RESCHED)); } -@@ -2252,7 +2258,7 @@ static inline int rwlock_needbreak(rwlock_t *lock) +@@ -2259,7 +2265,7 @@ static inline int rwlock_needbreak(rwlock_t *lock) static __always_inline bool need_resched(void) { @@ -10507,7 +10268,7 @@ index 9ea0b2806..5ded1450a 100644 #ifndef CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h -index cb8bd759e..ce1fefc37 100644 +index aa1bc4172..689c7b0ae 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -178,8 +178,8 @@ unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status); @@ -10603,7 +10364,7 @@ index 5ff4f1cd3..fd42f0b17 100644 } } diff --git a/kernel/entry/kvm.c b/kernel/entry/kvm.c -index 2e0f75bcb..d952fa5ee 100644 +index 2e0f75bcb..5253d3d2d 100644 --- a/kernel/entry/kvm.c +++ b/kernel/entry/kvm.c @@ -13,7 +13,7 @@ static int xfer_to_guest_mode_work(struct kvm_vcpu *vcpu, unsigned long ti_work) @@ -10611,7 +10372,7 @@ index 2e0f75bcb..d952fa5ee 100644 } - if (ti_work & _TIF_NEED_RESCHED) -+ if (ti_work & (_TIF_NEED_RESCHED | TIF_NEED_RESCHED_LAZY)) ++ if (ti_work & (_TIF_NEED_RESCHED | _TIF_NEED_RESCHED_LAZY)) schedule(); if (ti_work & _TIF_NOTIFY_RESUME) @@ -10830,7 +10591,7 @@ index 1d4bc493b..486c68c11 100644 NULL }; diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c -index 151bd3de5..5c21ba41e 100644 +index 3468d8230..6eef8527e 100644 --- a/kernel/locking/lockdep.c +++ b/kernel/locking/lockdep.c @@ -56,6 +56,7 @@ @@ -10860,7 +10621,7 @@ index 151bd3de5..5c21ba41e 100644 /* diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c -index 21db0df0e..4a10e8c16 100644 +index bf3a28ee7..99129c891 100644 --- a/kernel/locking/rtmutex.c +++ b/kernel/locking/rtmutex.c @@ -218,6 +218,11 @@ static __always_inline bool rt_mutex_cmpxchg_acquire(struct rt_mutex_base *lock, @@ -10905,8 +10666,8 @@ index 21db0df0e..4a10e8c16 100644 raw_spin_lock_irq(&lock->wait_lock); set_current_state(state); -@@ -1642,7 +1661,7 @@ static void __sched rt_mutex_handle_deadlock(int res, int detect_deadlock, - WARN(1, "rtmutex deadlock detected\n"); +@@ -1643,7 +1662,7 @@ static void __sched rt_mutex_handle_deadlock(int res, int detect_deadlock, + while (1) { set_current_state(TASK_INTERRUPTIBLE); - schedule(); @@ -10914,7 +10675,7 @@ index 21db0df0e..4a10e8c16 100644 } } -@@ -1737,6 +1756,15 @@ static int __sched rt_mutex_slowlock(struct rt_mutex_base *lock, +@@ -1738,6 +1757,15 @@ static int __sched rt_mutex_slowlock(struct rt_mutex_base *lock, unsigned long flags; int ret; @@ -10930,7 +10691,7 @@ index 21db0df0e..4a10e8c16 100644 /* * Technically we could use raw_spin_[un]lock_irq() here, but this can * be called in early boot if the cmpxchg() fast path is disabled -@@ -1748,6 +1776,7 @@ static int __sched rt_mutex_slowlock(struct rt_mutex_base *lock, +@@ -1749,6 +1777,7 @@ static int __sched rt_mutex_slowlock(struct rt_mutex_base *lock, raw_spin_lock_irqsave(&lock->wait_lock, flags); ret = __rt_mutex_slowlock_locked(lock, ww_ctx, state); raw_spin_unlock_irqrestore(&lock->wait_lock, flags); @@ -10938,7 +10699,7 @@ index 21db0df0e..4a10e8c16 100644 return ret; } -@@ -1755,7 +1784,9 @@ static int __sched rt_mutex_slowlock(struct rt_mutex_base *lock, +@@ -1756,7 +1785,9 @@ static int __sched rt_mutex_slowlock(struct rt_mutex_base *lock, static __always_inline int __rt_mutex_lock(struct rt_mutex_base *lock, unsigned int state) { @@ -11303,10 +11064,10 @@ index 7d4979d5c..7db6992c5 100644 +#endif diff --git a/kernel/printk/nbcon.c b/kernel/printk/nbcon.c new file mode 100644 -index 000000000..b941039ee +index 000000000..b4278854e --- /dev/null +++ b/kernel/printk/nbcon.c -@@ -0,0 +1,1665 @@ +@@ -0,0 +1,1659 @@ +// SPDX-License-Identifier: GPL-2.0-only +// Copyright (C) 2022 Linutronix GmbH, John Ogness +// Copyright (C) 2022 Intel, Thomas Gleixner @@ -12410,9 +12171,6 @@ index 000000000..b941039ee + +static inline bool rcuwait_has_sleeper(struct rcuwait *w) +{ -+ bool has_sleeper; -+ -+ rcu_read_lock(); + /* + * Guarantee any new records can be seen by tasks preparing to wait + * before this context checks if the rcuwait is empty. @@ -12425,10 +12183,7 @@ index 000000000..b941039ee + * This pairs with nbcon_kthread_func:A. + */ + smp_mb(); /* LMM(rcuwait_has_sleeper:A) */ -+ has_sleeper = !!rcu_dereference(w->task); -+ rcu_read_unlock(); -+ -+ return has_sleeper; ++ return rcuwait_active(w); +} + +/** @@ -12973,7 +12728,7 @@ index 000000000..b941039ee +} +device_initcall(printk_init_ops); diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c -index 0fca282c0..249576a8c 100644 +index dcdf44961..80ccfbb6b 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -102,12 +102,6 @@ DEFINE_STATIC_SRCU(console_srcu); @@ -14810,10 +14565,10 @@ index 11a1fac3a..6f085a159 100644 static void print_cpu_stall(unsigned long gps) diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 97571d390..1a6f2a90e 100644 +index c686d826a..8024e0b05 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c -@@ -897,14 +897,15 @@ static inline void hrtick_rq_init(struct rq *rq) +@@ -899,14 +899,15 @@ static inline void hrtick_rq_init(struct rq *rq) #if defined(CONFIG_SMP) && defined(TIF_POLLING_NRFLAG) /* @@ -14832,7 +14587,7 @@ index 97571d390..1a6f2a90e 100644 } /* -@@ -921,7 +922,7 @@ static bool set_nr_if_polling(struct task_struct *p) +@@ -923,7 +924,7 @@ static bool set_nr_if_polling(struct task_struct *p) for (;;) { if (!(val & _TIF_POLLING_NRFLAG)) return false; @@ -14841,7 +14596,7 @@ index 97571d390..1a6f2a90e 100644 return true; if (try_cmpxchg(&ti->flags, &val, val | _TIF_NEED_RESCHED)) break; -@@ -930,9 +931,9 @@ static bool set_nr_if_polling(struct task_struct *p) +@@ -932,9 +933,9 @@ static bool set_nr_if_polling(struct task_struct *p) } #else @@ -14853,7 +14608,7 @@ index 97571d390..1a6f2a90e 100644 return true; } -@@ -1037,28 +1038,47 @@ void wake_up_q(struct wake_q_head *head) +@@ -1039,28 +1040,47 @@ void wake_up_q(struct wake_q_head *head) * might also involve a cross-CPU call to trigger the scheduler on * the target CPU. */ @@ -14909,7 +14664,7 @@ index 97571d390..1a6f2a90e 100644 } void resched_cpu(int cpu) -@@ -1131,7 +1151,7 @@ static void wake_up_idle_cpu(int cpu) +@@ -1133,7 +1153,7 @@ static void wake_up_idle_cpu(int cpu) if (cpu == smp_processor_id()) return; @@ -14918,7 +14673,7 @@ index 97571d390..1a6f2a90e 100644 smp_send_reschedule(cpu); else trace_sched_wake_idle_without_ipi(cpu); -@@ -6721,10 +6741,14 @@ void __noreturn do_task_dead(void) +@@ -6722,10 +6742,14 @@ void __noreturn do_task_dead(void) static inline void sched_submit_work(struct task_struct *tsk) { @@ -14935,7 +14690,7 @@ index 97571d390..1a6f2a90e 100644 task_flags = tsk->flags; /* -@@ -6750,6 +6774,8 @@ static inline void sched_submit_work(struct task_struct *tsk) +@@ -6751,6 +6775,8 @@ static inline void sched_submit_work(struct task_struct *tsk) * make sure to submit it to avoid deadlocks. */ blk_flush_plug(tsk->plug, true); @@ -14944,7 +14699,7 @@ index 97571d390..1a6f2a90e 100644 } static void sched_update_worker(struct task_struct *tsk) -@@ -6762,16 +6788,26 @@ static void sched_update_worker(struct task_struct *tsk) +@@ -6763,16 +6789,26 @@ static void sched_update_worker(struct task_struct *tsk) } } @@ -14976,7 +14731,7 @@ index 97571d390..1a6f2a90e 100644 sched_update_worker(tsk); } EXPORT_SYMBOL(schedule); -@@ -6835,11 +6871,7 @@ void __sched schedule_preempt_disabled(void) +@@ -6836,11 +6872,7 @@ void __sched schedule_preempt_disabled(void) #ifdef CONFIG_PREEMPT_RT void __sched notrace schedule_rtlock(void) { @@ -14989,7 +14744,7 @@ index 97571d390..1a6f2a90e 100644 } NOKPROBE_SYMBOL(schedule_rtlock); #endif -@@ -7035,6 +7067,32 @@ static void __setscheduler_prio(struct task_struct *p, int prio) +@@ -7036,6 +7068,32 @@ static void __setscheduler_prio(struct task_struct *p, int prio) #ifdef CONFIG_RT_MUTEXES @@ -15022,7 +14777,7 @@ index 97571d390..1a6f2a90e 100644 static inline int __rt_effective_prio(struct task_struct *pi_task, int prio) { if (pi_task) -@@ -8885,6 +8943,21 @@ static inline void preempt_dynamic_init(void) { } +@@ -8886,6 +8944,21 @@ static inline void preempt_dynamic_init(void) { } #endif /* #ifdef CONFIG_PREEMPT_DYNAMIC */ @@ -15082,7 +14837,7 @@ index 4c3d0d9f3..63e19b89c 100644 } late_initcall(sched_init_debug); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c -index b2e1009e5..e7e5569fd 100644 +index 726fa69c4..e12a1c66c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -1022,8 +1022,10 @@ static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se); @@ -15120,7 +14875,7 @@ index b2e1009e5..e7e5569fd 100644 } #include "pelt.h" -@@ -1153,7 +1164,7 @@ static void update_tg_load_avg(struct cfs_rq *cfs_rq) +@@ -1198,7 +1209,7 @@ s64 update_curr_common(struct rq *rq) /* * Update the current task's runtime statistics. */ @@ -15128,17 +14883,17 @@ index b2e1009e5..e7e5569fd 100644 +static void __update_curr(struct cfs_rq *cfs_rq, bool tick) { struct sched_entity *curr = cfs_rq->curr; - u64 now = rq_clock_task(rq_of(cfs_rq)); -@@ -1180,7 +1191,7 @@ static void update_curr(struct cfs_rq *cfs_rq) - schedstat_add(cfs_rq->exec_clock, delta_exec); + s64 delta_exec; +@@ -1211,7 +1222,7 @@ static void update_curr(struct cfs_rq *cfs_rq) + return; curr->vruntime += calc_delta_fair(delta_exec, curr); - update_deadline(cfs_rq, curr); + update_deadline(cfs_rq, curr, tick); update_min_vruntime(cfs_rq); - if (entity_is_task(curr)) { -@@ -1194,6 +1205,11 @@ static void update_curr(struct cfs_rq *cfs_rq) + if (entity_is_task(curr)) +@@ -1220,6 +1231,11 @@ static void update_curr(struct cfs_rq *cfs_rq) account_cfs_rq_runtime(cfs_rq, delta_exec); } @@ -15150,7 +14905,7 @@ index b2e1009e5..e7e5569fd 100644 static void update_curr_fair(struct rq *rq) { update_curr(cfs_rq_of(&rq->curr->se)); -@@ -5403,7 +5419,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued) +@@ -5513,7 +5529,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued) /* * Update run-time statistics of the 'current'. */ @@ -15159,7 +14914,7 @@ index b2e1009e5..e7e5569fd 100644 /* * Ensure that runnable average is periodically updated. -@@ -5417,7 +5433,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued) +@@ -5527,7 +5543,7 @@ entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr, int queued) * validating it and just reschedule. */ if (queued) { @@ -15168,7 +14923,7 @@ index b2e1009e5..e7e5569fd 100644 return; } /* -@@ -5563,7 +5579,7 @@ static void __account_cfs_rq_runtime(struct cfs_rq *cfs_rq, u64 delta_exec) +@@ -5673,7 +5689,7 @@ static void __account_cfs_rq_runtime(struct cfs_rq *cfs_rq, u64 delta_exec) * hierarchy can be throttled */ if (!assign_cfs_rq_runtime(cfs_rq) && likely(cfs_rq->curr)) @@ -15177,7 +14932,7 @@ index b2e1009e5..e7e5569fd 100644 } static __always_inline -@@ -5823,7 +5839,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) +@@ -5933,7 +5949,7 @@ void unthrottle_cfs_rq(struct cfs_rq *cfs_rq) /* Determine whether we need to wake up potentially idle CPU: */ if (rq->curr == rq->idle && rq->cfs.nr_running) @@ -15186,7 +14941,7 @@ index b2e1009e5..e7e5569fd 100644 } #ifdef CONFIG_SMP -@@ -6528,7 +6544,7 @@ static void hrtick_start_fair(struct rq *rq, struct task_struct *p) +@@ -6638,7 +6654,7 @@ static void hrtick_start_fair(struct rq *rq, struct task_struct *p) if (delta < 0) { if (task_current(rq, p)) @@ -15195,7 +14950,7 @@ index b2e1009e5..e7e5569fd 100644 return; } hrtick_start(rq, delta); -@@ -8206,7 +8222,7 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_ +@@ -8316,7 +8332,7 @@ static void check_preempt_wakeup_fair(struct rq *rq, struct task_struct *p, int * prevents us from potentially nominating it as a false LAST_BUDDY * below. */ @@ -15203,8 +14958,8 @@ index b2e1009e5..e7e5569fd 100644 + if (need_resched()) return; - /* Idle tasks are by definition preempted by non-idle tasks. */ -@@ -8248,7 +8264,7 @@ static void check_preempt_wakeup(struct rq *rq, struct task_struct *p, int wake_ + if (!sched_feat(WAKEUP_PREEMPTION)) +@@ -8354,7 +8370,7 @@ static void check_preempt_wakeup_fair(struct rq *rq, struct task_struct *p, int return; preempt: @@ -15213,7 +14968,7 @@ index b2e1009e5..e7e5569fd 100644 } #ifdef CONFIG_SMP -@@ -12394,7 +12410,7 @@ static inline void task_tick_core(struct rq *rq, struct task_struct *curr) +@@ -12509,7 +12525,7 @@ static inline void task_tick_core(struct rq *rq, struct task_struct *curr) */ if (rq->core->core_forceidle_count && rq->cfs.nr_running == 1 && __entity_slice_used(&curr->se, MIN_NR_TASKS_DURING_FORCEIDLE)) @@ -15222,14 +14977,14 @@ index b2e1009e5..e7e5569fd 100644 } /* -@@ -12559,7 +12575,7 @@ prio_changed_fair(struct rq *rq, struct task_struct *p, int oldprio) +@@ -12674,7 +12690,7 @@ prio_changed_fair(struct rq *rq, struct task_struct *p, int oldprio) */ if (task_current(rq, p)) { if (p->prio > oldprio) - resched_curr(rq); + resched_curr_lazy(rq); } else - check_preempt_curr(rq, p, 0); + wakeup_preempt(rq, p, 0); } diff --git a/kernel/sched/features.h b/kernel/sched/features.h index f77016823..dd8b35f67 100644 @@ -15242,7 +14997,7 @@ index f77016823..dd8b35f67 100644 + +SCHED_FEAT(FORCE_NEED_RESCHED, false) diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c -index 5007b25c5..95e1b3df1 100644 +index 565f8374d..22d70000a 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -57,8 +57,7 @@ static noinline int __cpuidle cpu_idle_poll(void) @@ -15256,10 +15011,10 @@ index 5007b25c5..95e1b3df1 100644 raw_local_irq_disable(); diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c -index 4ac36eb4c..acd1510e8 100644 +index ccf1a4433..68e9b04f9 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c -@@ -2253,8 +2253,11 @@ static int rto_next_cpu(struct root_domain *rd) +@@ -2245,8 +2245,11 @@ static int rto_next_cpu(struct root_domain *rd) rd->rto_cpu = cpu; @@ -15272,11 +15027,3100 @@ index 4ac36eb4c..acd1510e8 100644 rd->rto_cpu = -1; +diff --git a/kernel/sched/rt.c.orig b/kernel/sched/rt.c.orig +new file mode 100644 +index 000000000..ccf1a4433 +--- /dev/null ++++ b/kernel/sched/rt.c.orig +@@ -0,0 +1,3083 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Real-Time Scheduling Class (mapped to the SCHED_FIFO and SCHED_RR ++ * policies) ++ */ ++ ++int sched_rr_timeslice = RR_TIMESLICE; ++/* More than 4 hours if BW_SHIFT equals 20. */ ++static const u64 max_rt_runtime = MAX_BW; ++ ++static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun); ++ ++struct rt_bandwidth def_rt_bandwidth; ++ ++/* ++ * period over which we measure -rt task CPU usage in us. ++ * default: 1s ++ */ ++unsigned int sysctl_sched_rt_period = 1000000; ++ ++/* ++ * part of the period that we allow rt tasks to run in us. ++ * default: 0.95s ++ */ ++int sysctl_sched_rt_runtime = 950000; ++ ++#ifdef CONFIG_SYSCTL ++static int sysctl_sched_rr_timeslice = (MSEC_PER_SEC * RR_TIMESLICE) / HZ; ++static int sched_rt_handler(struct ctl_table *table, int write, void *buffer, ++ size_t *lenp, loff_t *ppos); ++static int sched_rr_handler(struct ctl_table *table, int write, void *buffer, ++ size_t *lenp, loff_t *ppos); ++static struct ctl_table sched_rt_sysctls[] = { ++ { ++ .procname = "sched_rt_period_us", ++ .data = &sysctl_sched_rt_period, ++ .maxlen = sizeof(unsigned int), ++ .mode = 0644, ++ .proc_handler = sched_rt_handler, ++ .extra1 = SYSCTL_ONE, ++ .extra2 = SYSCTL_INT_MAX, ++ }, ++ { ++ .procname = "sched_rt_runtime_us", ++ .data = &sysctl_sched_rt_runtime, ++ .maxlen = sizeof(int), ++ .mode = 0644, ++ .proc_handler = sched_rt_handler, ++ .extra1 = SYSCTL_NEG_ONE, ++ .extra2 = SYSCTL_INT_MAX, ++ }, ++ { ++ .procname = "sched_rr_timeslice_ms", ++ .data = &sysctl_sched_rr_timeslice, ++ .maxlen = sizeof(int), ++ .mode = 0644, ++ .proc_handler = sched_rr_handler, ++ }, ++ {} ++}; ++ ++static int __init sched_rt_sysctl_init(void) ++{ ++ register_sysctl_init("kernel", sched_rt_sysctls); ++ return 0; ++} ++late_initcall(sched_rt_sysctl_init); ++#endif ++ ++static enum hrtimer_restart sched_rt_period_timer(struct hrtimer *timer) ++{ ++ struct rt_bandwidth *rt_b = ++ container_of(timer, struct rt_bandwidth, rt_period_timer); ++ int idle = 0; ++ int overrun; ++ ++ raw_spin_lock(&rt_b->rt_runtime_lock); ++ for (;;) { ++ overrun = hrtimer_forward_now(timer, rt_b->rt_period); ++ if (!overrun) ++ break; ++ ++ raw_spin_unlock(&rt_b->rt_runtime_lock); ++ idle = do_sched_rt_period_timer(rt_b, overrun); ++ raw_spin_lock(&rt_b->rt_runtime_lock); ++ } ++ if (idle) ++ rt_b->rt_period_active = 0; ++ raw_spin_unlock(&rt_b->rt_runtime_lock); ++ ++ return idle ? HRTIMER_NORESTART : HRTIMER_RESTART; ++} ++ ++void init_rt_bandwidth(struct rt_bandwidth *rt_b, u64 period, u64 runtime) ++{ ++ rt_b->rt_period = ns_to_ktime(period); ++ rt_b->rt_runtime = runtime; ++ ++ raw_spin_lock_init(&rt_b->rt_runtime_lock); ++ ++ hrtimer_init(&rt_b->rt_period_timer, CLOCK_MONOTONIC, ++ HRTIMER_MODE_REL_HARD); ++ rt_b->rt_period_timer.function = sched_rt_period_timer; ++} ++ ++static inline void do_start_rt_bandwidth(struct rt_bandwidth *rt_b) ++{ ++ raw_spin_lock(&rt_b->rt_runtime_lock); ++ if (!rt_b->rt_period_active) { ++ rt_b->rt_period_active = 1; ++ /* ++ * SCHED_DEADLINE updates the bandwidth, as a run away ++ * RT task with a DL task could hog a CPU. But DL does ++ * not reset the period. If a deadline task was running ++ * without an RT task running, it can cause RT tasks to ++ * throttle when they start up. Kick the timer right away ++ * to update the period. ++ */ ++ hrtimer_forward_now(&rt_b->rt_period_timer, ns_to_ktime(0)); ++ hrtimer_start_expires(&rt_b->rt_period_timer, ++ HRTIMER_MODE_ABS_PINNED_HARD); ++ } ++ raw_spin_unlock(&rt_b->rt_runtime_lock); ++} ++ ++static void start_rt_bandwidth(struct rt_bandwidth *rt_b) ++{ ++ if (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF) ++ return; ++ ++ do_start_rt_bandwidth(rt_b); ++} ++ ++void init_rt_rq(struct rt_rq *rt_rq) ++{ ++ struct rt_prio_array *array; ++ int i; ++ ++ array = &rt_rq->active; ++ for (i = 0; i < MAX_RT_PRIO; i++) { ++ INIT_LIST_HEAD(array->queue + i); ++ __clear_bit(i, array->bitmap); ++ } ++ /* delimiter for bitsearch: */ ++ __set_bit(MAX_RT_PRIO, array->bitmap); ++ ++#if defined CONFIG_SMP ++ rt_rq->highest_prio.curr = MAX_RT_PRIO-1; ++ rt_rq->highest_prio.next = MAX_RT_PRIO-1; ++ rt_rq->rt_nr_migratory = 0; ++ rt_rq->overloaded = 0; ++ plist_head_init(&rt_rq->pushable_tasks); ++#endif /* CONFIG_SMP */ ++ /* We start is dequeued state, because no RT tasks are queued */ ++ rt_rq->rt_queued = 0; ++ ++ rt_rq->rt_time = 0; ++ rt_rq->rt_throttled = 0; ++ rt_rq->rt_runtime = 0; ++ raw_spin_lock_init(&rt_rq->rt_runtime_lock); ++} ++ ++#ifdef CONFIG_RT_GROUP_SCHED ++static void destroy_rt_bandwidth(struct rt_bandwidth *rt_b) ++{ ++ hrtimer_cancel(&rt_b->rt_period_timer); ++} ++ ++#define rt_entity_is_task(rt_se) (!(rt_se)->my_q) ++ ++static inline struct task_struct *rt_task_of(struct sched_rt_entity *rt_se) ++{ ++#ifdef CONFIG_SCHED_DEBUG ++ WARN_ON_ONCE(!rt_entity_is_task(rt_se)); ++#endif ++ return container_of(rt_se, struct task_struct, rt); ++} ++ ++static inline struct rq *rq_of_rt_rq(struct rt_rq *rt_rq) ++{ ++ return rt_rq->rq; ++} ++ ++static inline struct rt_rq *rt_rq_of_se(struct sched_rt_entity *rt_se) ++{ ++ return rt_se->rt_rq; ++} ++ ++static inline struct rq *rq_of_rt_se(struct sched_rt_entity *rt_se) ++{ ++ struct rt_rq *rt_rq = rt_se->rt_rq; ++ ++ return rt_rq->rq; ++} ++ ++void unregister_rt_sched_group(struct task_group *tg) ++{ ++ if (tg->rt_se) ++ destroy_rt_bandwidth(&tg->rt_bandwidth); ++ ++} ++ ++void free_rt_sched_group(struct task_group *tg) ++{ ++ int i; ++ ++ for_each_possible_cpu(i) { ++ if (tg->rt_rq) ++ kfree(tg->rt_rq[i]); ++ if (tg->rt_se) ++ kfree(tg->rt_se[i]); ++ } ++ ++ kfree(tg->rt_rq); ++ kfree(tg->rt_se); ++} ++ ++void init_tg_rt_entry(struct task_group *tg, struct rt_rq *rt_rq, ++ struct sched_rt_entity *rt_se, int cpu, ++ struct sched_rt_entity *parent) ++{ ++ struct rq *rq = cpu_rq(cpu); ++ ++ rt_rq->highest_prio.curr = MAX_RT_PRIO-1; ++ rt_rq->rt_nr_boosted = 0; ++ rt_rq->rq = rq; ++ rt_rq->tg = tg; ++ ++ tg->rt_rq[cpu] = rt_rq; ++ tg->rt_se[cpu] = rt_se; ++ ++ if (!rt_se) ++ return; ++ ++ if (!parent) ++ rt_se->rt_rq = &rq->rt; ++ else ++ rt_se->rt_rq = parent->my_q; ++ ++ rt_se->my_q = rt_rq; ++ rt_se->parent = parent; ++ INIT_LIST_HEAD(&rt_se->run_list); ++} ++ ++int alloc_rt_sched_group(struct task_group *tg, struct task_group *parent) ++{ ++ struct rt_rq *rt_rq; ++ struct sched_rt_entity *rt_se; ++ int i; ++ ++ tg->rt_rq = kcalloc(nr_cpu_ids, sizeof(rt_rq), GFP_KERNEL); ++ if (!tg->rt_rq) ++ goto err; ++ tg->rt_se = kcalloc(nr_cpu_ids, sizeof(rt_se), GFP_KERNEL); ++ if (!tg->rt_se) ++ goto err; ++ ++ init_rt_bandwidth(&tg->rt_bandwidth, ++ ktime_to_ns(def_rt_bandwidth.rt_period), 0); ++ ++ for_each_possible_cpu(i) { ++ rt_rq = kzalloc_node(sizeof(struct rt_rq), ++ GFP_KERNEL, cpu_to_node(i)); ++ if (!rt_rq) ++ goto err; ++ ++ rt_se = kzalloc_node(sizeof(struct sched_rt_entity), ++ GFP_KERNEL, cpu_to_node(i)); ++ if (!rt_se) ++ goto err_free_rq; ++ ++ init_rt_rq(rt_rq); ++ rt_rq->rt_runtime = tg->rt_bandwidth.rt_runtime; ++ init_tg_rt_entry(tg, rt_rq, rt_se, i, parent->rt_se[i]); ++ } ++ ++ return 1; ++ ++err_free_rq: ++ kfree(rt_rq); ++err: ++ return 0; ++} ++ ++#else /* CONFIG_RT_GROUP_SCHED */ ++ ++#define rt_entity_is_task(rt_se) (1) ++ ++static inline struct task_struct *rt_task_of(struct sched_rt_entity *rt_se) ++{ ++ return container_of(rt_se, struct task_struct, rt); ++} ++ ++static inline struct rq *rq_of_rt_rq(struct rt_rq *rt_rq) ++{ ++ return container_of(rt_rq, struct rq, rt); ++} ++ ++static inline struct rq *rq_of_rt_se(struct sched_rt_entity *rt_se) ++{ ++ struct task_struct *p = rt_task_of(rt_se); ++ ++ return task_rq(p); ++} ++ ++static inline struct rt_rq *rt_rq_of_se(struct sched_rt_entity *rt_se) ++{ ++ struct rq *rq = rq_of_rt_se(rt_se); ++ ++ return &rq->rt; ++} ++ ++void unregister_rt_sched_group(struct task_group *tg) { } ++ ++void free_rt_sched_group(struct task_group *tg) { } ++ ++int alloc_rt_sched_group(struct task_group *tg, struct task_group *parent) ++{ ++ return 1; ++} ++#endif /* CONFIG_RT_GROUP_SCHED */ ++ ++#ifdef CONFIG_SMP ++ ++static inline bool need_pull_rt_task(struct rq *rq, struct task_struct *prev) ++{ ++ /* Try to pull RT tasks here if we lower this rq's prio */ ++ return rq->online && rq->rt.highest_prio.curr > prev->prio; ++} ++ ++static inline int rt_overloaded(struct rq *rq) ++{ ++ return atomic_read(&rq->rd->rto_count); ++} ++ ++static inline void rt_set_overload(struct rq *rq) ++{ ++ if (!rq->online) ++ return; ++ ++ cpumask_set_cpu(rq->cpu, rq->rd->rto_mask); ++ /* ++ * Make sure the mask is visible before we set ++ * the overload count. That is checked to determine ++ * if we should look at the mask. It would be a shame ++ * if we looked at the mask, but the mask was not ++ * updated yet. ++ * ++ * Matched by the barrier in pull_rt_task(). ++ */ ++ smp_wmb(); ++ atomic_inc(&rq->rd->rto_count); ++} ++ ++static inline void rt_clear_overload(struct rq *rq) ++{ ++ if (!rq->online) ++ return; ++ ++ /* the order here really doesn't matter */ ++ atomic_dec(&rq->rd->rto_count); ++ cpumask_clear_cpu(rq->cpu, rq->rd->rto_mask); ++} ++ ++static void update_rt_migration(struct rt_rq *rt_rq) ++{ ++ if (rt_rq->rt_nr_migratory && rt_rq->rt_nr_total > 1) { ++ if (!rt_rq->overloaded) { ++ rt_set_overload(rq_of_rt_rq(rt_rq)); ++ rt_rq->overloaded = 1; ++ } ++ } else if (rt_rq->overloaded) { ++ rt_clear_overload(rq_of_rt_rq(rt_rq)); ++ rt_rq->overloaded = 0; ++ } ++} ++ ++static void inc_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) ++{ ++ struct task_struct *p; ++ ++ if (!rt_entity_is_task(rt_se)) ++ return; ++ ++ p = rt_task_of(rt_se); ++ rt_rq = &rq_of_rt_rq(rt_rq)->rt; ++ ++ rt_rq->rt_nr_total++; ++ if (p->nr_cpus_allowed > 1) ++ rt_rq->rt_nr_migratory++; ++ ++ update_rt_migration(rt_rq); ++} ++ ++static void dec_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) ++{ ++ struct task_struct *p; ++ ++ if (!rt_entity_is_task(rt_se)) ++ return; ++ ++ p = rt_task_of(rt_se); ++ rt_rq = &rq_of_rt_rq(rt_rq)->rt; ++ ++ rt_rq->rt_nr_total--; ++ if (p->nr_cpus_allowed > 1) ++ rt_rq->rt_nr_migratory--; ++ ++ update_rt_migration(rt_rq); ++} ++ ++static inline int has_pushable_tasks(struct rq *rq) ++{ ++ return !plist_head_empty(&rq->rt.pushable_tasks); ++} ++ ++static DEFINE_PER_CPU(struct balance_callback, rt_push_head); ++static DEFINE_PER_CPU(struct balance_callback, rt_pull_head); ++ ++static void push_rt_tasks(struct rq *); ++static void pull_rt_task(struct rq *); ++ ++static inline void rt_queue_push_tasks(struct rq *rq) ++{ ++ if (!has_pushable_tasks(rq)) ++ return; ++ ++ queue_balance_callback(rq, &per_cpu(rt_push_head, rq->cpu), push_rt_tasks); ++} ++ ++static inline void rt_queue_pull_task(struct rq *rq) ++{ ++ queue_balance_callback(rq, &per_cpu(rt_pull_head, rq->cpu), pull_rt_task); ++} ++ ++static void enqueue_pushable_task(struct rq *rq, struct task_struct *p) ++{ ++ plist_del(&p->pushable_tasks, &rq->rt.pushable_tasks); ++ plist_node_init(&p->pushable_tasks, p->prio); ++ plist_add(&p->pushable_tasks, &rq->rt.pushable_tasks); ++ ++ /* Update the highest prio pushable task */ ++ if (p->prio < rq->rt.highest_prio.next) ++ rq->rt.highest_prio.next = p->prio; ++} ++ ++static void dequeue_pushable_task(struct rq *rq, struct task_struct *p) ++{ ++ plist_del(&p->pushable_tasks, &rq->rt.pushable_tasks); ++ ++ /* Update the new highest prio pushable task */ ++ if (has_pushable_tasks(rq)) { ++ p = plist_first_entry(&rq->rt.pushable_tasks, ++ struct task_struct, pushable_tasks); ++ rq->rt.highest_prio.next = p->prio; ++ } else { ++ rq->rt.highest_prio.next = MAX_RT_PRIO-1; ++ } ++} ++ ++#else ++ ++static inline void enqueue_pushable_task(struct rq *rq, struct task_struct *p) ++{ ++} ++ ++static inline void dequeue_pushable_task(struct rq *rq, struct task_struct *p) ++{ ++} ++ ++static inline ++void inc_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) ++{ ++} ++ ++static inline ++void dec_rt_migration(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) ++{ ++} ++ ++static inline void rt_queue_push_tasks(struct rq *rq) ++{ ++} ++#endif /* CONFIG_SMP */ ++ ++static void enqueue_top_rt_rq(struct rt_rq *rt_rq); ++static void dequeue_top_rt_rq(struct rt_rq *rt_rq, unsigned int count); ++ ++static inline int on_rt_rq(struct sched_rt_entity *rt_se) ++{ ++ return rt_se->on_rq; ++} ++ ++#ifdef CONFIG_UCLAMP_TASK ++/* ++ * Verify the fitness of task @p to run on @cpu taking into account the uclamp ++ * settings. ++ * ++ * This check is only important for heterogeneous systems where uclamp_min value ++ * is higher than the capacity of a @cpu. For non-heterogeneous system this ++ * function will always return true. ++ * ++ * The function will return true if the capacity of the @cpu is >= the ++ * uclamp_min and false otherwise. ++ * ++ * Note that uclamp_min will be clamped to uclamp_max if uclamp_min ++ * > uclamp_max. ++ */ ++static inline bool rt_task_fits_capacity(struct task_struct *p, int cpu) ++{ ++ unsigned int min_cap; ++ unsigned int max_cap; ++ unsigned int cpu_cap; ++ ++ /* Only heterogeneous systems can benefit from this check */ ++ if (!sched_asym_cpucap_active()) ++ return true; ++ ++ min_cap = uclamp_eff_value(p, UCLAMP_MIN); ++ max_cap = uclamp_eff_value(p, UCLAMP_MAX); ++ ++ cpu_cap = capacity_orig_of(cpu); ++ ++ return cpu_cap >= min(min_cap, max_cap); ++} ++#else ++static inline bool rt_task_fits_capacity(struct task_struct *p, int cpu) ++{ ++ return true; ++} ++#endif ++ ++#ifdef CONFIG_RT_GROUP_SCHED ++ ++static inline u64 sched_rt_runtime(struct rt_rq *rt_rq) ++{ ++ if (!rt_rq->tg) ++ return RUNTIME_INF; ++ ++ return rt_rq->rt_runtime; ++} ++ ++static inline u64 sched_rt_period(struct rt_rq *rt_rq) ++{ ++ return ktime_to_ns(rt_rq->tg->rt_bandwidth.rt_period); ++} ++ ++typedef struct task_group *rt_rq_iter_t; ++ ++static inline struct task_group *next_task_group(struct task_group *tg) ++{ ++ do { ++ tg = list_entry_rcu(tg->list.next, ++ typeof(struct task_group), list); ++ } while (&tg->list != &task_groups && task_group_is_autogroup(tg)); ++ ++ if (&tg->list == &task_groups) ++ tg = NULL; ++ ++ return tg; ++} ++ ++#define for_each_rt_rq(rt_rq, iter, rq) \ ++ for (iter = container_of(&task_groups, typeof(*iter), list); \ ++ (iter = next_task_group(iter)) && \ ++ (rt_rq = iter->rt_rq[cpu_of(rq)]);) ++ ++#define for_each_sched_rt_entity(rt_se) \ ++ for (; rt_se; rt_se = rt_se->parent) ++ ++static inline struct rt_rq *group_rt_rq(struct sched_rt_entity *rt_se) ++{ ++ return rt_se->my_q; ++} ++ ++static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags); ++static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags); ++ ++static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) ++{ ++ struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr; ++ struct rq *rq = rq_of_rt_rq(rt_rq); ++ struct sched_rt_entity *rt_se; ++ ++ int cpu = cpu_of(rq); ++ ++ rt_se = rt_rq->tg->rt_se[cpu]; ++ ++ if (rt_rq->rt_nr_running) { ++ if (!rt_se) ++ enqueue_top_rt_rq(rt_rq); ++ else if (!on_rt_rq(rt_se)) ++ enqueue_rt_entity(rt_se, 0); ++ ++ if (rt_rq->highest_prio.curr < curr->prio) ++ resched_curr(rq); ++ } ++} ++ ++static void sched_rt_rq_dequeue(struct rt_rq *rt_rq) ++{ ++ struct sched_rt_entity *rt_se; ++ int cpu = cpu_of(rq_of_rt_rq(rt_rq)); ++ ++ rt_se = rt_rq->tg->rt_se[cpu]; ++ ++ if (!rt_se) { ++ dequeue_top_rt_rq(rt_rq, rt_rq->rt_nr_running); ++ /* Kick cpufreq (see the comment in kernel/sched/sched.h). */ ++ cpufreq_update_util(rq_of_rt_rq(rt_rq), 0); ++ } ++ else if (on_rt_rq(rt_se)) ++ dequeue_rt_entity(rt_se, 0); ++} ++ ++static inline int rt_rq_throttled(struct rt_rq *rt_rq) ++{ ++ return rt_rq->rt_throttled && !rt_rq->rt_nr_boosted; ++} ++ ++static int rt_se_boosted(struct sched_rt_entity *rt_se) ++{ ++ struct rt_rq *rt_rq = group_rt_rq(rt_se); ++ struct task_struct *p; ++ ++ if (rt_rq) ++ return !!rt_rq->rt_nr_boosted; ++ ++ p = rt_task_of(rt_se); ++ return p->prio != p->normal_prio; ++} ++ ++#ifdef CONFIG_SMP ++static inline const struct cpumask *sched_rt_period_mask(void) ++{ ++ return this_rq()->rd->span; ++} ++#else ++static inline const struct cpumask *sched_rt_period_mask(void) ++{ ++ return cpu_online_mask; ++} ++#endif ++ ++static inline ++struct rt_rq *sched_rt_period_rt_rq(struct rt_bandwidth *rt_b, int cpu) ++{ ++ return container_of(rt_b, struct task_group, rt_bandwidth)->rt_rq[cpu]; ++} ++ ++static inline struct rt_bandwidth *sched_rt_bandwidth(struct rt_rq *rt_rq) ++{ ++ return &rt_rq->tg->rt_bandwidth; ++} ++ ++#else /* !CONFIG_RT_GROUP_SCHED */ ++ ++static inline u64 sched_rt_runtime(struct rt_rq *rt_rq) ++{ ++ return rt_rq->rt_runtime; ++} ++ ++static inline u64 sched_rt_period(struct rt_rq *rt_rq) ++{ ++ return ktime_to_ns(def_rt_bandwidth.rt_period); ++} ++ ++typedef struct rt_rq *rt_rq_iter_t; ++ ++#define for_each_rt_rq(rt_rq, iter, rq) \ ++ for ((void) iter, rt_rq = &rq->rt; rt_rq; rt_rq = NULL) ++ ++#define for_each_sched_rt_entity(rt_se) \ ++ for (; rt_se; rt_se = NULL) ++ ++static inline struct rt_rq *group_rt_rq(struct sched_rt_entity *rt_se) ++{ ++ return NULL; ++} ++ ++static inline void sched_rt_rq_enqueue(struct rt_rq *rt_rq) ++{ ++ struct rq *rq = rq_of_rt_rq(rt_rq); ++ ++ if (!rt_rq->rt_nr_running) ++ return; ++ ++ enqueue_top_rt_rq(rt_rq); ++ resched_curr(rq); ++} ++ ++static inline void sched_rt_rq_dequeue(struct rt_rq *rt_rq) ++{ ++ dequeue_top_rt_rq(rt_rq, rt_rq->rt_nr_running); ++} ++ ++static inline int rt_rq_throttled(struct rt_rq *rt_rq) ++{ ++ return rt_rq->rt_throttled; ++} ++ ++static inline const struct cpumask *sched_rt_period_mask(void) ++{ ++ return cpu_online_mask; ++} ++ ++static inline ++struct rt_rq *sched_rt_period_rt_rq(struct rt_bandwidth *rt_b, int cpu) ++{ ++ return &cpu_rq(cpu)->rt; ++} ++ ++static inline struct rt_bandwidth *sched_rt_bandwidth(struct rt_rq *rt_rq) ++{ ++ return &def_rt_bandwidth; ++} ++ ++#endif /* CONFIG_RT_GROUP_SCHED */ ++ ++bool sched_rt_bandwidth_account(struct rt_rq *rt_rq) ++{ ++ struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq); ++ ++ return (hrtimer_active(&rt_b->rt_period_timer) || ++ rt_rq->rt_time < rt_b->rt_runtime); ++} ++ ++#ifdef CONFIG_SMP ++/* ++ * We ran out of runtime, see if we can borrow some from our neighbours. ++ */ ++static void do_balance_runtime(struct rt_rq *rt_rq) ++{ ++ struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq); ++ struct root_domain *rd = rq_of_rt_rq(rt_rq)->rd; ++ int i, weight; ++ u64 rt_period; ++ ++ weight = cpumask_weight(rd->span); ++ ++ raw_spin_lock(&rt_b->rt_runtime_lock); ++ rt_period = ktime_to_ns(rt_b->rt_period); ++ for_each_cpu(i, rd->span) { ++ struct rt_rq *iter = sched_rt_period_rt_rq(rt_b, i); ++ s64 diff; ++ ++ if (iter == rt_rq) ++ continue; ++ ++ raw_spin_lock(&iter->rt_runtime_lock); ++ /* ++ * Either all rqs have inf runtime and there's nothing to steal ++ * or __disable_runtime() below sets a specific rq to inf to ++ * indicate its been disabled and disallow stealing. ++ */ ++ if (iter->rt_runtime == RUNTIME_INF) ++ goto next; ++ ++ /* ++ * From runqueues with spare time, take 1/n part of their ++ * spare time, but no more than our period. ++ */ ++ diff = iter->rt_runtime - iter->rt_time; ++ if (diff > 0) { ++ diff = div_u64((u64)diff, weight); ++ if (rt_rq->rt_runtime + diff > rt_period) ++ diff = rt_period - rt_rq->rt_runtime; ++ iter->rt_runtime -= diff; ++ rt_rq->rt_runtime += diff; ++ if (rt_rq->rt_runtime == rt_period) { ++ raw_spin_unlock(&iter->rt_runtime_lock); ++ break; ++ } ++ } ++next: ++ raw_spin_unlock(&iter->rt_runtime_lock); ++ } ++ raw_spin_unlock(&rt_b->rt_runtime_lock); ++} ++ ++/* ++ * Ensure this RQ takes back all the runtime it lend to its neighbours. ++ */ ++static void __disable_runtime(struct rq *rq) ++{ ++ struct root_domain *rd = rq->rd; ++ rt_rq_iter_t iter; ++ struct rt_rq *rt_rq; ++ ++ if (unlikely(!scheduler_running)) ++ return; ++ ++ for_each_rt_rq(rt_rq, iter, rq) { ++ struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq); ++ s64 want; ++ int i; ++ ++ raw_spin_lock(&rt_b->rt_runtime_lock); ++ raw_spin_lock(&rt_rq->rt_runtime_lock); ++ /* ++ * Either we're all inf and nobody needs to borrow, or we're ++ * already disabled and thus have nothing to do, or we have ++ * exactly the right amount of runtime to take out. ++ */ ++ if (rt_rq->rt_runtime == RUNTIME_INF || ++ rt_rq->rt_runtime == rt_b->rt_runtime) ++ goto balanced; ++ raw_spin_unlock(&rt_rq->rt_runtime_lock); ++ ++ /* ++ * Calculate the difference between what we started out with ++ * and what we current have, that's the amount of runtime ++ * we lend and now have to reclaim. ++ */ ++ want = rt_b->rt_runtime - rt_rq->rt_runtime; ++ ++ /* ++ * Greedy reclaim, take back as much as we can. ++ */ ++ for_each_cpu(i, rd->span) { ++ struct rt_rq *iter = sched_rt_period_rt_rq(rt_b, i); ++ s64 diff; ++ ++ /* ++ * Can't reclaim from ourselves or disabled runqueues. ++ */ ++ if (iter == rt_rq || iter->rt_runtime == RUNTIME_INF) ++ continue; ++ ++ raw_spin_lock(&iter->rt_runtime_lock); ++ if (want > 0) { ++ diff = min_t(s64, iter->rt_runtime, want); ++ iter->rt_runtime -= diff; ++ want -= diff; ++ } else { ++ iter->rt_runtime -= want; ++ want -= want; ++ } ++ raw_spin_unlock(&iter->rt_runtime_lock); ++ ++ if (!want) ++ break; ++ } ++ ++ raw_spin_lock(&rt_rq->rt_runtime_lock); ++ /* ++ * We cannot be left wanting - that would mean some runtime ++ * leaked out of the system. ++ */ ++ WARN_ON_ONCE(want); ++balanced: ++ /* ++ * Disable all the borrow logic by pretending we have inf ++ * runtime - in which case borrowing doesn't make sense. ++ */ ++ rt_rq->rt_runtime = RUNTIME_INF; ++ rt_rq->rt_throttled = 0; ++ raw_spin_unlock(&rt_rq->rt_runtime_lock); ++ raw_spin_unlock(&rt_b->rt_runtime_lock); ++ ++ /* Make rt_rq available for pick_next_task() */ ++ sched_rt_rq_enqueue(rt_rq); ++ } ++} ++ ++static void __enable_runtime(struct rq *rq) ++{ ++ rt_rq_iter_t iter; ++ struct rt_rq *rt_rq; ++ ++ if (unlikely(!scheduler_running)) ++ return; ++ ++ /* ++ * Reset each runqueue's bandwidth settings ++ */ ++ for_each_rt_rq(rt_rq, iter, rq) { ++ struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq); ++ ++ raw_spin_lock(&rt_b->rt_runtime_lock); ++ raw_spin_lock(&rt_rq->rt_runtime_lock); ++ rt_rq->rt_runtime = rt_b->rt_runtime; ++ rt_rq->rt_time = 0; ++ rt_rq->rt_throttled = 0; ++ raw_spin_unlock(&rt_rq->rt_runtime_lock); ++ raw_spin_unlock(&rt_b->rt_runtime_lock); ++ } ++} ++ ++static void balance_runtime(struct rt_rq *rt_rq) ++{ ++ if (!sched_feat(RT_RUNTIME_SHARE)) ++ return; ++ ++ if (rt_rq->rt_time > rt_rq->rt_runtime) { ++ raw_spin_unlock(&rt_rq->rt_runtime_lock); ++ do_balance_runtime(rt_rq); ++ raw_spin_lock(&rt_rq->rt_runtime_lock); ++ } ++} ++#else /* !CONFIG_SMP */ ++static inline void balance_runtime(struct rt_rq *rt_rq) {} ++#endif /* CONFIG_SMP */ ++ ++static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun) ++{ ++ int i, idle = 1, throttled = 0; ++ const struct cpumask *span; ++ ++ span = sched_rt_period_mask(); ++#ifdef CONFIG_RT_GROUP_SCHED ++ /* ++ * FIXME: isolated CPUs should really leave the root task group, ++ * whether they are isolcpus or were isolated via cpusets, lest ++ * the timer run on a CPU which does not service all runqueues, ++ * potentially leaving other CPUs indefinitely throttled. If ++ * isolation is really required, the user will turn the throttle ++ * off to kill the perturbations it causes anyway. Meanwhile, ++ * this maintains functionality for boot and/or troubleshooting. ++ */ ++ if (rt_b == &root_task_group.rt_bandwidth) ++ span = cpu_online_mask; ++#endif ++ for_each_cpu(i, span) { ++ int enqueue = 0; ++ struct rt_rq *rt_rq = sched_rt_period_rt_rq(rt_b, i); ++ struct rq *rq = rq_of_rt_rq(rt_rq); ++ struct rq_flags rf; ++ int skip; ++ ++ /* ++ * When span == cpu_online_mask, taking each rq->lock ++ * can be time-consuming. Try to avoid it when possible. ++ */ ++ raw_spin_lock(&rt_rq->rt_runtime_lock); ++ if (!sched_feat(RT_RUNTIME_SHARE) && rt_rq->rt_runtime != RUNTIME_INF) ++ rt_rq->rt_runtime = rt_b->rt_runtime; ++ skip = !rt_rq->rt_time && !rt_rq->rt_nr_running; ++ raw_spin_unlock(&rt_rq->rt_runtime_lock); ++ if (skip) ++ continue; ++ ++ rq_lock(rq, &rf); ++ update_rq_clock(rq); ++ ++ if (rt_rq->rt_time) { ++ u64 runtime; ++ ++ raw_spin_lock(&rt_rq->rt_runtime_lock); ++ if (rt_rq->rt_throttled) ++ balance_runtime(rt_rq); ++ runtime = rt_rq->rt_runtime; ++ rt_rq->rt_time -= min(rt_rq->rt_time, overrun*runtime); ++ if (rt_rq->rt_throttled && rt_rq->rt_time < runtime) { ++ rt_rq->rt_throttled = 0; ++ enqueue = 1; ++ ++ /* ++ * When we're idle and a woken (rt) task is ++ * throttled wakeup_preempt() will set ++ * skip_update and the time between the wakeup ++ * and this unthrottle will get accounted as ++ * 'runtime'. ++ */ ++ if (rt_rq->rt_nr_running && rq->curr == rq->idle) ++ rq_clock_cancel_skipupdate(rq); ++ } ++ if (rt_rq->rt_time || rt_rq->rt_nr_running) ++ idle = 0; ++ raw_spin_unlock(&rt_rq->rt_runtime_lock); ++ } else if (rt_rq->rt_nr_running) { ++ idle = 0; ++ if (!rt_rq_throttled(rt_rq)) ++ enqueue = 1; ++ } ++ if (rt_rq->rt_throttled) ++ throttled = 1; ++ ++ if (enqueue) ++ sched_rt_rq_enqueue(rt_rq); ++ rq_unlock(rq, &rf); ++ } ++ ++ if (!throttled && (!rt_bandwidth_enabled() || rt_b->rt_runtime == RUNTIME_INF)) ++ return 1; ++ ++ return idle; ++} ++ ++static inline int rt_se_prio(struct sched_rt_entity *rt_se) ++{ ++#ifdef CONFIG_RT_GROUP_SCHED ++ struct rt_rq *rt_rq = group_rt_rq(rt_se); ++ ++ if (rt_rq) ++ return rt_rq->highest_prio.curr; ++#endif ++ ++ return rt_task_of(rt_se)->prio; ++} ++ ++static int sched_rt_runtime_exceeded(struct rt_rq *rt_rq, struct task_struct *curr) ++{ ++ u64 runtime = sched_rt_runtime(rt_rq); ++ ++ if (rt_rq->rt_throttled) ++ return rt_rq_throttled(rt_rq); ++ ++ if (runtime >= sched_rt_period(rt_rq)) ++ return 0; ++ ++ balance_runtime(rt_rq); ++ runtime = sched_rt_runtime(rt_rq); ++ if (runtime == RUNTIME_INF) ++ return 0; ++ ++ if (rt_rq->rt_time > runtime) { ++ struct rt_bandwidth *rt_b = sched_rt_bandwidth(rt_rq); ++ ++ /* ++ * Don't actually throttle groups that have no runtime assigned ++ * but accrue some time due to boosting. ++ */ ++ if (likely(rt_b->rt_runtime)) { ++ rt_rq->rt_throttled = 1; ++ printk_deferred_once("sched: RT throttling activated (pid %d, comm %s)\n", ++ curr->pid, curr->comm); ++ } else { ++ /* ++ * In case we did anyway, make it go away, ++ * replenishment is a joke, since it will replenish us ++ * with exactly 0 ns. ++ */ ++ rt_rq->rt_time = 0; ++ } ++ ++ if (rt_rq_throttled(rt_rq)) { ++ sched_rt_rq_dequeue(rt_rq); ++ return 1; ++ } ++ } ++ ++ return 0; ++} ++ ++/* ++ * Update the current task's runtime statistics. Skip current tasks that ++ * are not in our scheduling class. ++ */ ++static void update_curr_rt(struct rq *rq) ++{ ++ struct task_struct *curr = rq->curr; ++ struct sched_rt_entity *rt_se = &curr->rt; ++ s64 delta_exec; ++ ++ if (curr->sched_class != &rt_sched_class) ++ return; ++ ++ delta_exec = update_curr_common(rq); ++ if (unlikely(delta_exec <= 0)) ++ return; ++ ++ if (!rt_bandwidth_enabled()) ++ return; ++ ++ for_each_sched_rt_entity(rt_se) { ++ struct rt_rq *rt_rq = rt_rq_of_se(rt_se); ++ int exceeded; ++ ++ if (sched_rt_runtime(rt_rq) != RUNTIME_INF) { ++ raw_spin_lock(&rt_rq->rt_runtime_lock); ++ rt_rq->rt_time += delta_exec; ++ exceeded = sched_rt_runtime_exceeded(rt_rq, curr); ++ if (exceeded) ++ resched_curr(rq); ++ raw_spin_unlock(&rt_rq->rt_runtime_lock); ++ if (exceeded) ++ do_start_rt_bandwidth(sched_rt_bandwidth(rt_rq)); ++ } ++ } ++} ++ ++static void ++dequeue_top_rt_rq(struct rt_rq *rt_rq, unsigned int count) ++{ ++ struct rq *rq = rq_of_rt_rq(rt_rq); ++ ++ BUG_ON(&rq->rt != rt_rq); ++ ++ if (!rt_rq->rt_queued) ++ return; ++ ++ BUG_ON(!rq->nr_running); ++ ++ sub_nr_running(rq, count); ++ rt_rq->rt_queued = 0; ++ ++} ++ ++static void ++enqueue_top_rt_rq(struct rt_rq *rt_rq) ++{ ++ struct rq *rq = rq_of_rt_rq(rt_rq); ++ ++ BUG_ON(&rq->rt != rt_rq); ++ ++ if (rt_rq->rt_queued) ++ return; ++ ++ if (rt_rq_throttled(rt_rq)) ++ return; ++ ++ if (rt_rq->rt_nr_running) { ++ add_nr_running(rq, rt_rq->rt_nr_running); ++ rt_rq->rt_queued = 1; ++ } ++ ++ /* Kick cpufreq (see the comment in kernel/sched/sched.h). */ ++ cpufreq_update_util(rq, 0); ++} ++ ++#if defined CONFIG_SMP ++ ++static void ++inc_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio) ++{ ++ struct rq *rq = rq_of_rt_rq(rt_rq); ++ ++#ifdef CONFIG_RT_GROUP_SCHED ++ /* ++ * Change rq's cpupri only if rt_rq is the top queue. ++ */ ++ if (&rq->rt != rt_rq) ++ return; ++#endif ++ if (rq->online && prio < prev_prio) ++ cpupri_set(&rq->rd->cpupri, rq->cpu, prio); ++} ++ ++static void ++dec_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio) ++{ ++ struct rq *rq = rq_of_rt_rq(rt_rq); ++ ++#ifdef CONFIG_RT_GROUP_SCHED ++ /* ++ * Change rq's cpupri only if rt_rq is the top queue. ++ */ ++ if (&rq->rt != rt_rq) ++ return; ++#endif ++ if (rq->online && rt_rq->highest_prio.curr != prev_prio) ++ cpupri_set(&rq->rd->cpupri, rq->cpu, rt_rq->highest_prio.curr); ++} ++ ++#else /* CONFIG_SMP */ ++ ++static inline ++void inc_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio) {} ++static inline ++void dec_rt_prio_smp(struct rt_rq *rt_rq, int prio, int prev_prio) {} ++ ++#endif /* CONFIG_SMP */ ++ ++#if defined CONFIG_SMP || defined CONFIG_RT_GROUP_SCHED ++static void ++inc_rt_prio(struct rt_rq *rt_rq, int prio) ++{ ++ int prev_prio = rt_rq->highest_prio.curr; ++ ++ if (prio < prev_prio) ++ rt_rq->highest_prio.curr = prio; ++ ++ inc_rt_prio_smp(rt_rq, prio, prev_prio); ++} ++ ++static void ++dec_rt_prio(struct rt_rq *rt_rq, int prio) ++{ ++ int prev_prio = rt_rq->highest_prio.curr; ++ ++ if (rt_rq->rt_nr_running) { ++ ++ WARN_ON(prio < prev_prio); ++ ++ /* ++ * This may have been our highest task, and therefore ++ * we may have some recomputation to do ++ */ ++ if (prio == prev_prio) { ++ struct rt_prio_array *array = &rt_rq->active; ++ ++ rt_rq->highest_prio.curr = ++ sched_find_first_bit(array->bitmap); ++ } ++ ++ } else { ++ rt_rq->highest_prio.curr = MAX_RT_PRIO-1; ++ } ++ ++ dec_rt_prio_smp(rt_rq, prio, prev_prio); ++} ++ ++#else ++ ++static inline void inc_rt_prio(struct rt_rq *rt_rq, int prio) {} ++static inline void dec_rt_prio(struct rt_rq *rt_rq, int prio) {} ++ ++#endif /* CONFIG_SMP || CONFIG_RT_GROUP_SCHED */ ++ ++#ifdef CONFIG_RT_GROUP_SCHED ++ ++static void ++inc_rt_group(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) ++{ ++ if (rt_se_boosted(rt_se)) ++ rt_rq->rt_nr_boosted++; ++ ++ if (rt_rq->tg) ++ start_rt_bandwidth(&rt_rq->tg->rt_bandwidth); ++} ++ ++static void ++dec_rt_group(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) ++{ ++ if (rt_se_boosted(rt_se)) ++ rt_rq->rt_nr_boosted--; ++ ++ WARN_ON(!rt_rq->rt_nr_running && rt_rq->rt_nr_boosted); ++} ++ ++#else /* CONFIG_RT_GROUP_SCHED */ ++ ++static void ++inc_rt_group(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) ++{ ++ start_rt_bandwidth(&def_rt_bandwidth); ++} ++ ++static inline ++void dec_rt_group(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) {} ++ ++#endif /* CONFIG_RT_GROUP_SCHED */ ++ ++static inline ++unsigned int rt_se_nr_running(struct sched_rt_entity *rt_se) ++{ ++ struct rt_rq *group_rq = group_rt_rq(rt_se); ++ ++ if (group_rq) ++ return group_rq->rt_nr_running; ++ else ++ return 1; ++} ++ ++static inline ++unsigned int rt_se_rr_nr_running(struct sched_rt_entity *rt_se) ++{ ++ struct rt_rq *group_rq = group_rt_rq(rt_se); ++ struct task_struct *tsk; ++ ++ if (group_rq) ++ return group_rq->rr_nr_running; ++ ++ tsk = rt_task_of(rt_se); ++ ++ return (tsk->policy == SCHED_RR) ? 1 : 0; ++} ++ ++static inline ++void inc_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) ++{ ++ int prio = rt_se_prio(rt_se); ++ ++ WARN_ON(!rt_prio(prio)); ++ rt_rq->rt_nr_running += rt_se_nr_running(rt_se); ++ rt_rq->rr_nr_running += rt_se_rr_nr_running(rt_se); ++ ++ inc_rt_prio(rt_rq, prio); ++ inc_rt_migration(rt_se, rt_rq); ++ inc_rt_group(rt_se, rt_rq); ++} ++ ++static inline ++void dec_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) ++{ ++ WARN_ON(!rt_prio(rt_se_prio(rt_se))); ++ WARN_ON(!rt_rq->rt_nr_running); ++ rt_rq->rt_nr_running -= rt_se_nr_running(rt_se); ++ rt_rq->rr_nr_running -= rt_se_rr_nr_running(rt_se); ++ ++ dec_rt_prio(rt_rq, rt_se_prio(rt_se)); ++ dec_rt_migration(rt_se, rt_rq); ++ dec_rt_group(rt_se, rt_rq); ++} ++ ++/* ++ * Change rt_se->run_list location unless SAVE && !MOVE ++ * ++ * assumes ENQUEUE/DEQUEUE flags match ++ */ ++static inline bool move_entity(unsigned int flags) ++{ ++ if ((flags & (DEQUEUE_SAVE | DEQUEUE_MOVE)) == DEQUEUE_SAVE) ++ return false; ++ ++ return true; ++} ++ ++static void __delist_rt_entity(struct sched_rt_entity *rt_se, struct rt_prio_array *array) ++{ ++ list_del_init(&rt_se->run_list); ++ ++ if (list_empty(array->queue + rt_se_prio(rt_se))) ++ __clear_bit(rt_se_prio(rt_se), array->bitmap); ++ ++ rt_se->on_list = 0; ++} ++ ++static inline struct sched_statistics * ++__schedstats_from_rt_se(struct sched_rt_entity *rt_se) ++{ ++#ifdef CONFIG_RT_GROUP_SCHED ++ /* schedstats is not supported for rt group. */ ++ if (!rt_entity_is_task(rt_se)) ++ return NULL; ++#endif ++ ++ return &rt_task_of(rt_se)->stats; ++} ++ ++static inline void ++update_stats_wait_start_rt(struct rt_rq *rt_rq, struct sched_rt_entity *rt_se) ++{ ++ struct sched_statistics *stats; ++ struct task_struct *p = NULL; ++ ++ if (!schedstat_enabled()) ++ return; ++ ++ if (rt_entity_is_task(rt_se)) ++ p = rt_task_of(rt_se); ++ ++ stats = __schedstats_from_rt_se(rt_se); ++ if (!stats) ++ return; ++ ++ __update_stats_wait_start(rq_of_rt_rq(rt_rq), p, stats); ++} ++ ++static inline void ++update_stats_enqueue_sleeper_rt(struct rt_rq *rt_rq, struct sched_rt_entity *rt_se) ++{ ++ struct sched_statistics *stats; ++ struct task_struct *p = NULL; ++ ++ if (!schedstat_enabled()) ++ return; ++ ++ if (rt_entity_is_task(rt_se)) ++ p = rt_task_of(rt_se); ++ ++ stats = __schedstats_from_rt_se(rt_se); ++ if (!stats) ++ return; ++ ++ __update_stats_enqueue_sleeper(rq_of_rt_rq(rt_rq), p, stats); ++} ++ ++static inline void ++update_stats_enqueue_rt(struct rt_rq *rt_rq, struct sched_rt_entity *rt_se, ++ int flags) ++{ ++ if (!schedstat_enabled()) ++ return; ++ ++ if (flags & ENQUEUE_WAKEUP) ++ update_stats_enqueue_sleeper_rt(rt_rq, rt_se); ++} ++ ++static inline void ++update_stats_wait_end_rt(struct rt_rq *rt_rq, struct sched_rt_entity *rt_se) ++{ ++ struct sched_statistics *stats; ++ struct task_struct *p = NULL; ++ ++ if (!schedstat_enabled()) ++ return; ++ ++ if (rt_entity_is_task(rt_se)) ++ p = rt_task_of(rt_se); ++ ++ stats = __schedstats_from_rt_se(rt_se); ++ if (!stats) ++ return; ++ ++ __update_stats_wait_end(rq_of_rt_rq(rt_rq), p, stats); ++} ++ ++static inline void ++update_stats_dequeue_rt(struct rt_rq *rt_rq, struct sched_rt_entity *rt_se, ++ int flags) ++{ ++ struct task_struct *p = NULL; ++ ++ if (!schedstat_enabled()) ++ return; ++ ++ if (rt_entity_is_task(rt_se)) ++ p = rt_task_of(rt_se); ++ ++ if ((flags & DEQUEUE_SLEEP) && p) { ++ unsigned int state; ++ ++ state = READ_ONCE(p->__state); ++ if (state & TASK_INTERRUPTIBLE) ++ __schedstat_set(p->stats.sleep_start, ++ rq_clock(rq_of_rt_rq(rt_rq))); ++ ++ if (state & TASK_UNINTERRUPTIBLE) ++ __schedstat_set(p->stats.block_start, ++ rq_clock(rq_of_rt_rq(rt_rq))); ++ } ++} ++ ++static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) ++{ ++ struct rt_rq *rt_rq = rt_rq_of_se(rt_se); ++ struct rt_prio_array *array = &rt_rq->active; ++ struct rt_rq *group_rq = group_rt_rq(rt_se); ++ struct list_head *queue = array->queue + rt_se_prio(rt_se); ++ ++ /* ++ * Don't enqueue the group if its throttled, or when empty. ++ * The latter is a consequence of the former when a child group ++ * get throttled and the current group doesn't have any other ++ * active members. ++ */ ++ if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) { ++ if (rt_se->on_list) ++ __delist_rt_entity(rt_se, array); ++ return; ++ } ++ ++ if (move_entity(flags)) { ++ WARN_ON_ONCE(rt_se->on_list); ++ if (flags & ENQUEUE_HEAD) ++ list_add(&rt_se->run_list, queue); ++ else ++ list_add_tail(&rt_se->run_list, queue); ++ ++ __set_bit(rt_se_prio(rt_se), array->bitmap); ++ rt_se->on_list = 1; ++ } ++ rt_se->on_rq = 1; ++ ++ inc_rt_tasks(rt_se, rt_rq); ++} ++ ++static void __dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) ++{ ++ struct rt_rq *rt_rq = rt_rq_of_se(rt_se); ++ struct rt_prio_array *array = &rt_rq->active; ++ ++ if (move_entity(flags)) { ++ WARN_ON_ONCE(!rt_se->on_list); ++ __delist_rt_entity(rt_se, array); ++ } ++ rt_se->on_rq = 0; ++ ++ dec_rt_tasks(rt_se, rt_rq); ++} ++ ++/* ++ * Because the prio of an upper entry depends on the lower ++ * entries, we must remove entries top - down. ++ */ ++static void dequeue_rt_stack(struct sched_rt_entity *rt_se, unsigned int flags) ++{ ++ struct sched_rt_entity *back = NULL; ++ unsigned int rt_nr_running; ++ ++ for_each_sched_rt_entity(rt_se) { ++ rt_se->back = back; ++ back = rt_se; ++ } ++ ++ rt_nr_running = rt_rq_of_se(back)->rt_nr_running; ++ ++ for (rt_se = back; rt_se; rt_se = rt_se->back) { ++ if (on_rt_rq(rt_se)) ++ __dequeue_rt_entity(rt_se, flags); ++ } ++ ++ dequeue_top_rt_rq(rt_rq_of_se(back), rt_nr_running); ++} ++ ++static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) ++{ ++ struct rq *rq = rq_of_rt_se(rt_se); ++ ++ update_stats_enqueue_rt(rt_rq_of_se(rt_se), rt_se, flags); ++ ++ dequeue_rt_stack(rt_se, flags); ++ for_each_sched_rt_entity(rt_se) ++ __enqueue_rt_entity(rt_se, flags); ++ enqueue_top_rt_rq(&rq->rt); ++} ++ ++static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) ++{ ++ struct rq *rq = rq_of_rt_se(rt_se); ++ ++ update_stats_dequeue_rt(rt_rq_of_se(rt_se), rt_se, flags); ++ ++ dequeue_rt_stack(rt_se, flags); ++ ++ for_each_sched_rt_entity(rt_se) { ++ struct rt_rq *rt_rq = group_rt_rq(rt_se); ++ ++ if (rt_rq && rt_rq->rt_nr_running) ++ __enqueue_rt_entity(rt_se, flags); ++ } ++ enqueue_top_rt_rq(&rq->rt); ++} ++ ++/* ++ * Adding/removing a task to/from a priority array: ++ */ ++static void ++enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags) ++{ ++ struct sched_rt_entity *rt_se = &p->rt; ++ ++ if (flags & ENQUEUE_WAKEUP) ++ rt_se->timeout = 0; ++ ++ check_schedstat_required(); ++ update_stats_wait_start_rt(rt_rq_of_se(rt_se), rt_se); ++ ++ enqueue_rt_entity(rt_se, flags); ++ ++ if (!task_current(rq, p) && p->nr_cpus_allowed > 1) ++ enqueue_pushable_task(rq, p); ++} ++ ++static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags) ++{ ++ struct sched_rt_entity *rt_se = &p->rt; ++ ++ update_curr_rt(rq); ++ dequeue_rt_entity(rt_se, flags); ++ ++ dequeue_pushable_task(rq, p); ++} ++ ++/* ++ * Put task to the head or the end of the run list without the overhead of ++ * dequeue followed by enqueue. ++ */ ++static void ++requeue_rt_entity(struct rt_rq *rt_rq, struct sched_rt_entity *rt_se, int head) ++{ ++ if (on_rt_rq(rt_se)) { ++ struct rt_prio_array *array = &rt_rq->active; ++ struct list_head *queue = array->queue + rt_se_prio(rt_se); ++ ++ if (head) ++ list_move(&rt_se->run_list, queue); ++ else ++ list_move_tail(&rt_se->run_list, queue); ++ } ++} ++ ++static void requeue_task_rt(struct rq *rq, struct task_struct *p, int head) ++{ ++ struct sched_rt_entity *rt_se = &p->rt; ++ struct rt_rq *rt_rq; ++ ++ for_each_sched_rt_entity(rt_se) { ++ rt_rq = rt_rq_of_se(rt_se); ++ requeue_rt_entity(rt_rq, rt_se, head); ++ } ++} ++ ++static void yield_task_rt(struct rq *rq) ++{ ++ requeue_task_rt(rq, rq->curr, 0); ++} ++ ++#ifdef CONFIG_SMP ++static int find_lowest_rq(struct task_struct *task); ++ ++static int ++select_task_rq_rt(struct task_struct *p, int cpu, int flags) ++{ ++ struct task_struct *curr; ++ struct rq *rq; ++ bool test; ++ ++ /* For anything but wake ups, just return the task_cpu */ ++ if (!(flags & (WF_TTWU | WF_FORK))) ++ goto out; ++ ++ rq = cpu_rq(cpu); ++ ++ rcu_read_lock(); ++ curr = READ_ONCE(rq->curr); /* unlocked access */ ++ ++ /* ++ * If the current task on @p's runqueue is an RT task, then ++ * try to see if we can wake this RT task up on another ++ * runqueue. Otherwise simply start this RT task ++ * on its current runqueue. ++ * ++ * We want to avoid overloading runqueues. If the woken ++ * task is a higher priority, then it will stay on this CPU ++ * and the lower prio task should be moved to another CPU. ++ * Even though this will probably make the lower prio task ++ * lose its cache, we do not want to bounce a higher task ++ * around just because it gave up its CPU, perhaps for a ++ * lock? ++ * ++ * For equal prio tasks, we just let the scheduler sort it out. ++ * ++ * Otherwise, just let it ride on the affined RQ and the ++ * post-schedule router will push the preempted task away ++ * ++ * This test is optimistic, if we get it wrong the load-balancer ++ * will have to sort it out. ++ * ++ * We take into account the capacity of the CPU to ensure it fits the ++ * requirement of the task - which is only important on heterogeneous ++ * systems like big.LITTLE. ++ */ ++ test = curr && ++ unlikely(rt_task(curr)) && ++ (curr->nr_cpus_allowed < 2 || curr->prio <= p->prio); ++ ++ if (test || !rt_task_fits_capacity(p, cpu)) { ++ int target = find_lowest_rq(p); ++ ++ /* ++ * Bail out if we were forcing a migration to find a better ++ * fitting CPU but our search failed. ++ */ ++ if (!test && target != -1 && !rt_task_fits_capacity(p, target)) ++ goto out_unlock; ++ ++ /* ++ * Don't bother moving it if the destination CPU is ++ * not running a lower priority task. ++ */ ++ if (target != -1 && ++ p->prio < cpu_rq(target)->rt.highest_prio.curr) ++ cpu = target; ++ } ++ ++out_unlock: ++ rcu_read_unlock(); ++ ++out: ++ return cpu; ++} ++ ++static void check_preempt_equal_prio(struct rq *rq, struct task_struct *p) ++{ ++ /* ++ * Current can't be migrated, useless to reschedule, ++ * let's hope p can move out. ++ */ ++ if (rq->curr->nr_cpus_allowed == 1 || ++ !cpupri_find(&rq->rd->cpupri, rq->curr, NULL)) ++ return; ++ ++ /* ++ * p is migratable, so let's not schedule it and ++ * see if it is pushed or pulled somewhere else. ++ */ ++ if (p->nr_cpus_allowed != 1 && ++ cpupri_find(&rq->rd->cpupri, p, NULL)) ++ return; ++ ++ /* ++ * There appear to be other CPUs that can accept ++ * the current task but none can run 'p', so lets reschedule ++ * to try and push the current task away: ++ */ ++ requeue_task_rt(rq, p, 1); ++ resched_curr(rq); ++} ++ ++static int balance_rt(struct rq *rq, struct task_struct *p, struct rq_flags *rf) ++{ ++ if (!on_rt_rq(&p->rt) && need_pull_rt_task(rq, p)) { ++ /* ++ * This is OK, because current is on_cpu, which avoids it being ++ * picked for load-balance and preemption/IRQs are still ++ * disabled avoiding further scheduler activity on it and we've ++ * not yet started the picking loop. ++ */ ++ rq_unpin_lock(rq, rf); ++ pull_rt_task(rq); ++ rq_repin_lock(rq, rf); ++ } ++ ++ return sched_stop_runnable(rq) || sched_dl_runnable(rq) || sched_rt_runnable(rq); ++} ++#endif /* CONFIG_SMP */ ++ ++/* ++ * Preempt the current task with a newly woken task if needed: ++ */ ++static void wakeup_preempt_rt(struct rq *rq, struct task_struct *p, int flags) ++{ ++ if (p->prio < rq->curr->prio) { ++ resched_curr(rq); ++ return; ++ } ++ ++#ifdef CONFIG_SMP ++ /* ++ * If: ++ * ++ * - the newly woken task is of equal priority to the current task ++ * - the newly woken task is non-migratable while current is migratable ++ * - current will be preempted on the next reschedule ++ * ++ * we should check to see if current can readily move to a different ++ * cpu. If so, we will reschedule to allow the push logic to try ++ * to move current somewhere else, making room for our non-migratable ++ * task. ++ */ ++ if (p->prio == rq->curr->prio && !test_tsk_need_resched(rq->curr)) ++ check_preempt_equal_prio(rq, p); ++#endif ++} ++ ++static inline void set_next_task_rt(struct rq *rq, struct task_struct *p, bool first) ++{ ++ struct sched_rt_entity *rt_se = &p->rt; ++ struct rt_rq *rt_rq = &rq->rt; ++ ++ p->se.exec_start = rq_clock_task(rq); ++ if (on_rt_rq(&p->rt)) ++ update_stats_wait_end_rt(rt_rq, rt_se); ++ ++ /* The running task is never eligible for pushing */ ++ dequeue_pushable_task(rq, p); ++ ++ if (!first) ++ return; ++ ++ /* ++ * If prev task was rt, put_prev_task() has already updated the ++ * utilization. We only care of the case where we start to schedule a ++ * rt task ++ */ ++ if (rq->curr->sched_class != &rt_sched_class) ++ update_rt_rq_load_avg(rq_clock_pelt(rq), rq, 0); ++ ++ rt_queue_push_tasks(rq); ++} ++ ++static struct sched_rt_entity *pick_next_rt_entity(struct rt_rq *rt_rq) ++{ ++ struct rt_prio_array *array = &rt_rq->active; ++ struct sched_rt_entity *next = NULL; ++ struct list_head *queue; ++ int idx; ++ ++ idx = sched_find_first_bit(array->bitmap); ++ BUG_ON(idx >= MAX_RT_PRIO); ++ ++ queue = array->queue + idx; ++ if (SCHED_WARN_ON(list_empty(queue))) ++ return NULL; ++ next = list_entry(queue->next, struct sched_rt_entity, run_list); ++ ++ return next; ++} ++ ++static struct task_struct *_pick_next_task_rt(struct rq *rq) ++{ ++ struct sched_rt_entity *rt_se; ++ struct rt_rq *rt_rq = &rq->rt; ++ ++ do { ++ rt_se = pick_next_rt_entity(rt_rq); ++ if (unlikely(!rt_se)) ++ return NULL; ++ rt_rq = group_rt_rq(rt_se); ++ } while (rt_rq); ++ ++ return rt_task_of(rt_se); ++} ++ ++static struct task_struct *pick_task_rt(struct rq *rq) ++{ ++ struct task_struct *p; ++ ++ if (!sched_rt_runnable(rq)) ++ return NULL; ++ ++ p = _pick_next_task_rt(rq); ++ ++ return p; ++} ++ ++static struct task_struct *pick_next_task_rt(struct rq *rq) ++{ ++ struct task_struct *p = pick_task_rt(rq); ++ ++ if (p) ++ set_next_task_rt(rq, p, true); ++ ++ return p; ++} ++ ++static void put_prev_task_rt(struct rq *rq, struct task_struct *p) ++{ ++ struct sched_rt_entity *rt_se = &p->rt; ++ struct rt_rq *rt_rq = &rq->rt; ++ ++ if (on_rt_rq(&p->rt)) ++ update_stats_wait_start_rt(rt_rq, rt_se); ++ ++ update_curr_rt(rq); ++ ++ update_rt_rq_load_avg(rq_clock_pelt(rq), rq, 1); ++ ++ /* ++ * The previous task needs to be made eligible for pushing ++ * if it is still active ++ */ ++ if (on_rt_rq(&p->rt) && p->nr_cpus_allowed > 1) ++ enqueue_pushable_task(rq, p); ++} ++ ++#ifdef CONFIG_SMP ++ ++/* Only try algorithms three times */ ++#define RT_MAX_TRIES 3 ++ ++static int pick_rt_task(struct rq *rq, struct task_struct *p, int cpu) ++{ ++ if (!task_on_cpu(rq, p) && ++ cpumask_test_cpu(cpu, &p->cpus_mask)) ++ return 1; ++ ++ return 0; ++} ++ ++/* ++ * Return the highest pushable rq's task, which is suitable to be executed ++ * on the CPU, NULL otherwise ++ */ ++static struct task_struct *pick_highest_pushable_task(struct rq *rq, int cpu) ++{ ++ struct plist_head *head = &rq->rt.pushable_tasks; ++ struct task_struct *p; ++ ++ if (!has_pushable_tasks(rq)) ++ return NULL; ++ ++ plist_for_each_entry(p, head, pushable_tasks) { ++ if (pick_rt_task(rq, p, cpu)) ++ return p; ++ } ++ ++ return NULL; ++} ++ ++static DEFINE_PER_CPU(cpumask_var_t, local_cpu_mask); ++ ++static int find_lowest_rq(struct task_struct *task) ++{ ++ struct sched_domain *sd; ++ struct cpumask *lowest_mask = this_cpu_cpumask_var_ptr(local_cpu_mask); ++ int this_cpu = smp_processor_id(); ++ int cpu = task_cpu(task); ++ int ret; ++ ++ /* Make sure the mask is initialized first */ ++ if (unlikely(!lowest_mask)) ++ return -1; ++ ++ if (task->nr_cpus_allowed == 1) ++ return -1; /* No other targets possible */ ++ ++ /* ++ * If we're on asym system ensure we consider the different capacities ++ * of the CPUs when searching for the lowest_mask. ++ */ ++ if (sched_asym_cpucap_active()) { ++ ++ ret = cpupri_find_fitness(&task_rq(task)->rd->cpupri, ++ task, lowest_mask, ++ rt_task_fits_capacity); ++ } else { ++ ++ ret = cpupri_find(&task_rq(task)->rd->cpupri, ++ task, lowest_mask); ++ } ++ ++ if (!ret) ++ return -1; /* No targets found */ ++ ++ /* ++ * At this point we have built a mask of CPUs representing the ++ * lowest priority tasks in the system. Now we want to elect ++ * the best one based on our affinity and topology. ++ * ++ * We prioritize the last CPU that the task executed on since ++ * it is most likely cache-hot in that location. ++ */ ++ if (cpumask_test_cpu(cpu, lowest_mask)) ++ return cpu; ++ ++ /* ++ * Otherwise, we consult the sched_domains span maps to figure ++ * out which CPU is logically closest to our hot cache data. ++ */ ++ if (!cpumask_test_cpu(this_cpu, lowest_mask)) ++ this_cpu = -1; /* Skip this_cpu opt if not among lowest */ ++ ++ rcu_read_lock(); ++ for_each_domain(cpu, sd) { ++ if (sd->flags & SD_WAKE_AFFINE) { ++ int best_cpu; ++ ++ /* ++ * "this_cpu" is cheaper to preempt than a ++ * remote processor. ++ */ ++ if (this_cpu != -1 && ++ cpumask_test_cpu(this_cpu, sched_domain_span(sd))) { ++ rcu_read_unlock(); ++ return this_cpu; ++ } ++ ++ best_cpu = cpumask_any_and_distribute(lowest_mask, ++ sched_domain_span(sd)); ++ if (best_cpu < nr_cpu_ids) { ++ rcu_read_unlock(); ++ return best_cpu; ++ } ++ } ++ } ++ rcu_read_unlock(); ++ ++ /* ++ * And finally, if there were no matches within the domains ++ * just give the caller *something* to work with from the compatible ++ * locations. ++ */ ++ if (this_cpu != -1) ++ return this_cpu; ++ ++ cpu = cpumask_any_distribute(lowest_mask); ++ if (cpu < nr_cpu_ids) ++ return cpu; ++ ++ return -1; ++} ++ ++/* Will lock the rq it finds */ ++static struct rq *find_lock_lowest_rq(struct task_struct *task, struct rq *rq) ++{ ++ struct rq *lowest_rq = NULL; ++ int tries; ++ int cpu; ++ ++ for (tries = 0; tries < RT_MAX_TRIES; tries++) { ++ cpu = find_lowest_rq(task); ++ ++ if ((cpu == -1) || (cpu == rq->cpu)) ++ break; ++ ++ lowest_rq = cpu_rq(cpu); ++ ++ if (lowest_rq->rt.highest_prio.curr <= task->prio) { ++ /* ++ * Target rq has tasks of equal or higher priority, ++ * retrying does not release any lock and is unlikely ++ * to yield a different result. ++ */ ++ lowest_rq = NULL; ++ break; ++ } ++ ++ /* if the prio of this runqueue changed, try again */ ++ if (double_lock_balance(rq, lowest_rq)) { ++ /* ++ * We had to unlock the run queue. In ++ * the mean time, task could have ++ * migrated already or had its affinity changed. ++ * Also make sure that it wasn't scheduled on its rq. ++ * It is possible the task was scheduled, set ++ * "migrate_disabled" and then got preempted, so we must ++ * check the task migration disable flag here too. ++ */ ++ if (unlikely(task_rq(task) != rq || ++ !cpumask_test_cpu(lowest_rq->cpu, &task->cpus_mask) || ++ task_on_cpu(rq, task) || ++ !rt_task(task) || ++ is_migration_disabled(task) || ++ !task_on_rq_queued(task))) { ++ ++ double_unlock_balance(rq, lowest_rq); ++ lowest_rq = NULL; ++ break; ++ } ++ } ++ ++ /* If this rq is still suitable use it. */ ++ if (lowest_rq->rt.highest_prio.curr > task->prio) ++ break; ++ ++ /* try again */ ++ double_unlock_balance(rq, lowest_rq); ++ lowest_rq = NULL; ++ } ++ ++ return lowest_rq; ++} ++ ++static struct task_struct *pick_next_pushable_task(struct rq *rq) ++{ ++ struct task_struct *p; ++ ++ if (!has_pushable_tasks(rq)) ++ return NULL; ++ ++ p = plist_first_entry(&rq->rt.pushable_tasks, ++ struct task_struct, pushable_tasks); ++ ++ BUG_ON(rq->cpu != task_cpu(p)); ++ BUG_ON(task_current(rq, p)); ++ BUG_ON(p->nr_cpus_allowed <= 1); ++ ++ BUG_ON(!task_on_rq_queued(p)); ++ BUG_ON(!rt_task(p)); ++ ++ return p; ++} ++ ++/* ++ * If the current CPU has more than one RT task, see if the non ++ * running task can migrate over to a CPU that is running a task ++ * of lesser priority. ++ */ ++static int push_rt_task(struct rq *rq, bool pull) ++{ ++ struct task_struct *next_task; ++ struct rq *lowest_rq; ++ int ret = 0; ++ ++ if (!rq->rt.overloaded) ++ return 0; ++ ++ next_task = pick_next_pushable_task(rq); ++ if (!next_task) ++ return 0; ++ ++retry: ++ /* ++ * It's possible that the next_task slipped in of ++ * higher priority than current. If that's the case ++ * just reschedule current. ++ */ ++ if (unlikely(next_task->prio < rq->curr->prio)) { ++ resched_curr(rq); ++ return 0; ++ } ++ ++ if (is_migration_disabled(next_task)) { ++ struct task_struct *push_task = NULL; ++ int cpu; ++ ++ if (!pull || rq->push_busy) ++ return 0; ++ ++ /* ++ * Invoking find_lowest_rq() on anything but an RT task doesn't ++ * make sense. Per the above priority check, curr has to ++ * be of higher priority than next_task, so no need to ++ * reschedule when bailing out. ++ * ++ * Note that the stoppers are masqueraded as SCHED_FIFO ++ * (cf. sched_set_stop_task()), so we can't rely on rt_task(). ++ */ ++ if (rq->curr->sched_class != &rt_sched_class) ++ return 0; ++ ++ cpu = find_lowest_rq(rq->curr); ++ if (cpu == -1 || cpu == rq->cpu) ++ return 0; ++ ++ /* ++ * Given we found a CPU with lower priority than @next_task, ++ * therefore it should be running. However we cannot migrate it ++ * to this other CPU, instead attempt to push the current ++ * running task on this CPU away. ++ */ ++ push_task = get_push_task(rq); ++ if (push_task) { ++ preempt_disable(); ++ raw_spin_rq_unlock(rq); ++ stop_one_cpu_nowait(rq->cpu, push_cpu_stop, ++ push_task, &rq->push_work); ++ preempt_enable(); ++ raw_spin_rq_lock(rq); ++ } ++ ++ return 0; ++ } ++ ++ if (WARN_ON(next_task == rq->curr)) ++ return 0; ++ ++ /* We might release rq lock */ ++ get_task_struct(next_task); ++ ++ /* find_lock_lowest_rq locks the rq if found */ ++ lowest_rq = find_lock_lowest_rq(next_task, rq); ++ if (!lowest_rq) { ++ struct task_struct *task; ++ /* ++ * find_lock_lowest_rq releases rq->lock ++ * so it is possible that next_task has migrated. ++ * ++ * We need to make sure that the task is still on the same ++ * run-queue and is also still the next task eligible for ++ * pushing. ++ */ ++ task = pick_next_pushable_task(rq); ++ if (task == next_task) { ++ /* ++ * The task hasn't migrated, and is still the next ++ * eligible task, but we failed to find a run-queue ++ * to push it to. Do not retry in this case, since ++ * other CPUs will pull from us when ready. ++ */ ++ goto out; ++ } ++ ++ if (!task) ++ /* No more tasks, just exit */ ++ goto out; ++ ++ /* ++ * Something has shifted, try again. ++ */ ++ put_task_struct(next_task); ++ next_task = task; ++ goto retry; ++ } ++ ++ deactivate_task(rq, next_task, 0); ++ set_task_cpu(next_task, lowest_rq->cpu); ++ activate_task(lowest_rq, next_task, 0); ++ resched_curr(lowest_rq); ++ ret = 1; ++ ++ double_unlock_balance(rq, lowest_rq); ++out: ++ put_task_struct(next_task); ++ ++ return ret; ++} ++ ++static void push_rt_tasks(struct rq *rq) ++{ ++ /* push_rt_task will return true if it moved an RT */ ++ while (push_rt_task(rq, false)) ++ ; ++} ++ ++#ifdef HAVE_RT_PUSH_IPI ++ ++/* ++ * When a high priority task schedules out from a CPU and a lower priority ++ * task is scheduled in, a check is made to see if there's any RT tasks ++ * on other CPUs that are waiting to run because a higher priority RT task ++ * is currently running on its CPU. In this case, the CPU with multiple RT ++ * tasks queued on it (overloaded) needs to be notified that a CPU has opened ++ * up that may be able to run one of its non-running queued RT tasks. ++ * ++ * All CPUs with overloaded RT tasks need to be notified as there is currently ++ * no way to know which of these CPUs have the highest priority task waiting ++ * to run. Instead of trying to take a spinlock on each of these CPUs, ++ * which has shown to cause large latency when done on machines with many ++ * CPUs, sending an IPI to the CPUs to have them push off the overloaded ++ * RT tasks waiting to run. ++ * ++ * Just sending an IPI to each of the CPUs is also an issue, as on large ++ * count CPU machines, this can cause an IPI storm on a CPU, especially ++ * if its the only CPU with multiple RT tasks queued, and a large number ++ * of CPUs scheduling a lower priority task at the same time. ++ * ++ * Each root domain has its own irq work function that can iterate over ++ * all CPUs with RT overloaded tasks. Since all CPUs with overloaded RT ++ * task must be checked if there's one or many CPUs that are lowering ++ * their priority, there's a single irq work iterator that will try to ++ * push off RT tasks that are waiting to run. ++ * ++ * When a CPU schedules a lower priority task, it will kick off the ++ * irq work iterator that will jump to each CPU with overloaded RT tasks. ++ * As it only takes the first CPU that schedules a lower priority task ++ * to start the process, the rto_start variable is incremented and if ++ * the atomic result is one, then that CPU will try to take the rto_lock. ++ * This prevents high contention on the lock as the process handles all ++ * CPUs scheduling lower priority tasks. ++ * ++ * All CPUs that are scheduling a lower priority task will increment the ++ * rt_loop_next variable. This will make sure that the irq work iterator ++ * checks all RT overloaded CPUs whenever a CPU schedules a new lower ++ * priority task, even if the iterator is in the middle of a scan. Incrementing ++ * the rt_loop_next will cause the iterator to perform another scan. ++ * ++ */ ++static int rto_next_cpu(struct root_domain *rd) ++{ ++ int next; ++ int cpu; ++ ++ /* ++ * When starting the IPI RT pushing, the rto_cpu is set to -1, ++ * rt_next_cpu() will simply return the first CPU found in ++ * the rto_mask. ++ * ++ * If rto_next_cpu() is called with rto_cpu is a valid CPU, it ++ * will return the next CPU found in the rto_mask. ++ * ++ * If there are no more CPUs left in the rto_mask, then a check is made ++ * against rto_loop and rto_loop_next. rto_loop is only updated with ++ * the rto_lock held, but any CPU may increment the rto_loop_next ++ * without any locking. ++ */ ++ for (;;) { ++ ++ /* When rto_cpu is -1 this acts like cpumask_first() */ ++ cpu = cpumask_next(rd->rto_cpu, rd->rto_mask); ++ ++ rd->rto_cpu = cpu; ++ ++ if (cpu < nr_cpu_ids) ++ return cpu; ++ ++ rd->rto_cpu = -1; ++ ++ /* ++ * ACQUIRE ensures we see the @rto_mask changes ++ * made prior to the @next value observed. ++ * ++ * Matches WMB in rt_set_overload(). ++ */ ++ next = atomic_read_acquire(&rd->rto_loop_next); ++ ++ if (rd->rto_loop == next) ++ break; ++ ++ rd->rto_loop = next; ++ } ++ ++ return -1; ++} ++ ++static inline bool rto_start_trylock(atomic_t *v) ++{ ++ return !atomic_cmpxchg_acquire(v, 0, 1); ++} ++ ++static inline void rto_start_unlock(atomic_t *v) ++{ ++ atomic_set_release(v, 0); ++} ++ ++static void tell_cpu_to_push(struct rq *rq) ++{ ++ int cpu = -1; ++ ++ /* Keep the loop going if the IPI is currently active */ ++ atomic_inc(&rq->rd->rto_loop_next); ++ ++ /* Only one CPU can initiate a loop at a time */ ++ if (!rto_start_trylock(&rq->rd->rto_loop_start)) ++ return; ++ ++ raw_spin_lock(&rq->rd->rto_lock); ++ ++ /* ++ * The rto_cpu is updated under the lock, if it has a valid CPU ++ * then the IPI is still running and will continue due to the ++ * update to loop_next, and nothing needs to be done here. ++ * Otherwise it is finishing up and an ipi needs to be sent. ++ */ ++ if (rq->rd->rto_cpu < 0) ++ cpu = rto_next_cpu(rq->rd); ++ ++ raw_spin_unlock(&rq->rd->rto_lock); ++ ++ rto_start_unlock(&rq->rd->rto_loop_start); ++ ++ if (cpu >= 0) { ++ /* Make sure the rd does not get freed while pushing */ ++ sched_get_rd(rq->rd); ++ irq_work_queue_on(&rq->rd->rto_push_work, cpu); ++ } ++} ++ ++/* Called from hardirq context */ ++void rto_push_irq_work_func(struct irq_work *work) ++{ ++ struct root_domain *rd = ++ container_of(work, struct root_domain, rto_push_work); ++ struct rq *rq; ++ int cpu; ++ ++ rq = this_rq(); ++ ++ /* ++ * We do not need to grab the lock to check for has_pushable_tasks. ++ * When it gets updated, a check is made if a push is possible. ++ */ ++ if (has_pushable_tasks(rq)) { ++ raw_spin_rq_lock(rq); ++ while (push_rt_task(rq, true)) ++ ; ++ raw_spin_rq_unlock(rq); ++ } ++ ++ raw_spin_lock(&rd->rto_lock); ++ ++ /* Pass the IPI to the next rt overloaded queue */ ++ cpu = rto_next_cpu(rd); ++ ++ raw_spin_unlock(&rd->rto_lock); ++ ++ if (cpu < 0) { ++ sched_put_rd(rd); ++ return; ++ } ++ ++ /* Try the next RT overloaded CPU */ ++ irq_work_queue_on(&rd->rto_push_work, cpu); ++} ++#endif /* HAVE_RT_PUSH_IPI */ ++ ++static void pull_rt_task(struct rq *this_rq) ++{ ++ int this_cpu = this_rq->cpu, cpu; ++ bool resched = false; ++ struct task_struct *p, *push_task; ++ struct rq *src_rq; ++ int rt_overload_count = rt_overloaded(this_rq); ++ ++ if (likely(!rt_overload_count)) ++ return; ++ ++ /* ++ * Match the barrier from rt_set_overloaded; this guarantees that if we ++ * see overloaded we must also see the rto_mask bit. ++ */ ++ smp_rmb(); ++ ++ /* If we are the only overloaded CPU do nothing */ ++ if (rt_overload_count == 1 && ++ cpumask_test_cpu(this_rq->cpu, this_rq->rd->rto_mask)) ++ return; ++ ++#ifdef HAVE_RT_PUSH_IPI ++ if (sched_feat(RT_PUSH_IPI)) { ++ tell_cpu_to_push(this_rq); ++ return; ++ } ++#endif ++ ++ for_each_cpu(cpu, this_rq->rd->rto_mask) { ++ if (this_cpu == cpu) ++ continue; ++ ++ src_rq = cpu_rq(cpu); ++ ++ /* ++ * Don't bother taking the src_rq->lock if the next highest ++ * task is known to be lower-priority than our current task. ++ * This may look racy, but if this value is about to go ++ * logically higher, the src_rq will push this task away. ++ * And if its going logically lower, we do not care ++ */ ++ if (src_rq->rt.highest_prio.next >= ++ this_rq->rt.highest_prio.curr) ++ continue; ++ ++ /* ++ * We can potentially drop this_rq's lock in ++ * double_lock_balance, and another CPU could ++ * alter this_rq ++ */ ++ push_task = NULL; ++ double_lock_balance(this_rq, src_rq); ++ ++ /* ++ * We can pull only a task, which is pushable ++ * on its rq, and no others. ++ */ ++ p = pick_highest_pushable_task(src_rq, this_cpu); ++ ++ /* ++ * Do we have an RT task that preempts ++ * the to-be-scheduled task? ++ */ ++ if (p && (p->prio < this_rq->rt.highest_prio.curr)) { ++ WARN_ON(p == src_rq->curr); ++ WARN_ON(!task_on_rq_queued(p)); ++ ++ /* ++ * There's a chance that p is higher in priority ++ * than what's currently running on its CPU. ++ * This is just that p is waking up and hasn't ++ * had a chance to schedule. We only pull ++ * p if it is lower in priority than the ++ * current task on the run queue ++ */ ++ if (p->prio < src_rq->curr->prio) ++ goto skip; ++ ++ if (is_migration_disabled(p)) { ++ push_task = get_push_task(src_rq); ++ } else { ++ deactivate_task(src_rq, p, 0); ++ set_task_cpu(p, this_cpu); ++ activate_task(this_rq, p, 0); ++ resched = true; ++ } ++ /* ++ * We continue with the search, just in ++ * case there's an even higher prio task ++ * in another runqueue. (low likelihood ++ * but possible) ++ */ ++ } ++skip: ++ double_unlock_balance(this_rq, src_rq); ++ ++ if (push_task) { ++ preempt_disable(); ++ raw_spin_rq_unlock(this_rq); ++ stop_one_cpu_nowait(src_rq->cpu, push_cpu_stop, ++ push_task, &src_rq->push_work); ++ preempt_enable(); ++ raw_spin_rq_lock(this_rq); ++ } ++ } ++ ++ if (resched) ++ resched_curr(this_rq); ++} ++ ++/* ++ * If we are not running and we are not going to reschedule soon, we should ++ * try to push tasks away now ++ */ ++static void task_woken_rt(struct rq *rq, struct task_struct *p) ++{ ++ bool need_to_push = !task_on_cpu(rq, p) && ++ !test_tsk_need_resched(rq->curr) && ++ p->nr_cpus_allowed > 1 && ++ (dl_task(rq->curr) || rt_task(rq->curr)) && ++ (rq->curr->nr_cpus_allowed < 2 || ++ rq->curr->prio <= p->prio); ++ ++ if (need_to_push) ++ push_rt_tasks(rq); ++} ++ ++/* Assumes rq->lock is held */ ++static void rq_online_rt(struct rq *rq) ++{ ++ if (rq->rt.overloaded) ++ rt_set_overload(rq); ++ ++ __enable_runtime(rq); ++ ++ cpupri_set(&rq->rd->cpupri, rq->cpu, rq->rt.highest_prio.curr); ++} ++ ++/* Assumes rq->lock is held */ ++static void rq_offline_rt(struct rq *rq) ++{ ++ if (rq->rt.overloaded) ++ rt_clear_overload(rq); ++ ++ __disable_runtime(rq); ++ ++ cpupri_set(&rq->rd->cpupri, rq->cpu, CPUPRI_INVALID); ++} ++ ++/* ++ * When switch from the rt queue, we bring ourselves to a position ++ * that we might want to pull RT tasks from other runqueues. ++ */ ++static void switched_from_rt(struct rq *rq, struct task_struct *p) ++{ ++ /* ++ * If there are other RT tasks then we will reschedule ++ * and the scheduling of the other RT tasks will handle ++ * the balancing. But if we are the last RT task ++ * we may need to handle the pulling of RT tasks ++ * now. ++ */ ++ if (!task_on_rq_queued(p) || rq->rt.rt_nr_running) ++ return; ++ ++ rt_queue_pull_task(rq); ++} ++ ++void __init init_sched_rt_class(void) ++{ ++ unsigned int i; ++ ++ for_each_possible_cpu(i) { ++ zalloc_cpumask_var_node(&per_cpu(local_cpu_mask, i), ++ GFP_KERNEL, cpu_to_node(i)); ++ } ++} ++#endif /* CONFIG_SMP */ ++ ++/* ++ * When switching a task to RT, we may overload the runqueue ++ * with RT tasks. In this case we try to push them off to ++ * other runqueues. ++ */ ++static void switched_to_rt(struct rq *rq, struct task_struct *p) ++{ ++ /* ++ * If we are running, update the avg_rt tracking, as the running time ++ * will now on be accounted into the latter. ++ */ ++ if (task_current(rq, p)) { ++ update_rt_rq_load_avg(rq_clock_pelt(rq), rq, 0); ++ return; ++ } ++ ++ /* ++ * If we are not running we may need to preempt the current ++ * running task. If that current running task is also an RT task ++ * then see if we can move to another run queue. ++ */ ++ if (task_on_rq_queued(p)) { ++#ifdef CONFIG_SMP ++ if (p->nr_cpus_allowed > 1 && rq->rt.overloaded) ++ rt_queue_push_tasks(rq); ++#endif /* CONFIG_SMP */ ++ if (p->prio < rq->curr->prio && cpu_online(cpu_of(rq))) ++ resched_curr(rq); ++ } ++} ++ ++/* ++ * Priority of the task has changed. This may cause ++ * us to initiate a push or pull. ++ */ ++static void ++prio_changed_rt(struct rq *rq, struct task_struct *p, int oldprio) ++{ ++ if (!task_on_rq_queued(p)) ++ return; ++ ++ if (task_current(rq, p)) { ++#ifdef CONFIG_SMP ++ /* ++ * If our priority decreases while running, we ++ * may need to pull tasks to this runqueue. ++ */ ++ if (oldprio < p->prio) ++ rt_queue_pull_task(rq); ++ ++ /* ++ * If there's a higher priority task waiting to run ++ * then reschedule. ++ */ ++ if (p->prio > rq->rt.highest_prio.curr) ++ resched_curr(rq); ++#else ++ /* For UP simply resched on drop of prio */ ++ if (oldprio < p->prio) ++ resched_curr(rq); ++#endif /* CONFIG_SMP */ ++ } else { ++ /* ++ * This task is not running, but if it is ++ * greater than the current running task ++ * then reschedule. ++ */ ++ if (p->prio < rq->curr->prio) ++ resched_curr(rq); ++ } ++} ++ ++#ifdef CONFIG_POSIX_TIMERS ++static void watchdog(struct rq *rq, struct task_struct *p) ++{ ++ unsigned long soft, hard; ++ ++ /* max may change after cur was read, this will be fixed next tick */ ++ soft = task_rlimit(p, RLIMIT_RTTIME); ++ hard = task_rlimit_max(p, RLIMIT_RTTIME); ++ ++ if (soft != RLIM_INFINITY) { ++ unsigned long next; ++ ++ if (p->rt.watchdog_stamp != jiffies) { ++ p->rt.timeout++; ++ p->rt.watchdog_stamp = jiffies; ++ } ++ ++ next = DIV_ROUND_UP(min(soft, hard), USEC_PER_SEC/HZ); ++ if (p->rt.timeout > next) { ++ posix_cputimers_rt_watchdog(&p->posix_cputimers, ++ p->se.sum_exec_runtime); ++ } ++ } ++} ++#else ++static inline void watchdog(struct rq *rq, struct task_struct *p) { } ++#endif ++ ++/* ++ * scheduler tick hitting a task of our scheduling class. ++ * ++ * NOTE: This function can be called remotely by the tick offload that ++ * goes along full dynticks. Therefore no local assumption can be made ++ * and everything must be accessed through the @rq and @curr passed in ++ * parameters. ++ */ ++static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued) ++{ ++ struct sched_rt_entity *rt_se = &p->rt; ++ ++ update_curr_rt(rq); ++ update_rt_rq_load_avg(rq_clock_pelt(rq), rq, 1); ++ ++ watchdog(rq, p); ++ ++ /* ++ * RR tasks need a special form of timeslice management. ++ * FIFO tasks have no timeslices. ++ */ ++ if (p->policy != SCHED_RR) ++ return; ++ ++ if (--p->rt.time_slice) ++ return; ++ ++ p->rt.time_slice = sched_rr_timeslice; ++ ++ /* ++ * Requeue to the end of queue if we (and all of our ancestors) are not ++ * the only element on the queue ++ */ ++ for_each_sched_rt_entity(rt_se) { ++ if (rt_se->run_list.prev != rt_se->run_list.next) { ++ requeue_task_rt(rq, p, 0); ++ resched_curr(rq); ++ return; ++ } ++ } ++} ++ ++static unsigned int get_rr_interval_rt(struct rq *rq, struct task_struct *task) ++{ ++ /* ++ * Time slice is 0 for SCHED_FIFO tasks ++ */ ++ if (task->policy == SCHED_RR) ++ return sched_rr_timeslice; ++ else ++ return 0; ++} ++ ++#ifdef CONFIG_SCHED_CORE ++static int task_is_throttled_rt(struct task_struct *p, int cpu) ++{ ++ struct rt_rq *rt_rq; ++ ++#ifdef CONFIG_RT_GROUP_SCHED ++ rt_rq = task_group(p)->rt_rq[cpu]; ++#else ++ rt_rq = &cpu_rq(cpu)->rt; ++#endif ++ ++ return rt_rq_throttled(rt_rq); ++} ++#endif ++ ++DEFINE_SCHED_CLASS(rt) = { ++ ++ .enqueue_task = enqueue_task_rt, ++ .dequeue_task = dequeue_task_rt, ++ .yield_task = yield_task_rt, ++ ++ .wakeup_preempt = wakeup_preempt_rt, ++ ++ .pick_next_task = pick_next_task_rt, ++ .put_prev_task = put_prev_task_rt, ++ .set_next_task = set_next_task_rt, ++ ++#ifdef CONFIG_SMP ++ .balance = balance_rt, ++ .pick_task = pick_task_rt, ++ .select_task_rq = select_task_rq_rt, ++ .set_cpus_allowed = set_cpus_allowed_common, ++ .rq_online = rq_online_rt, ++ .rq_offline = rq_offline_rt, ++ .task_woken = task_woken_rt, ++ .switched_from = switched_from_rt, ++ .find_lock_rq = find_lock_lowest_rq, ++#endif ++ ++ .task_tick = task_tick_rt, ++ ++ .get_rr_interval = get_rr_interval_rt, ++ ++ .prio_changed = prio_changed_rt, ++ .switched_to = switched_to_rt, ++ ++ .update_curr = update_curr_rt, ++ ++#ifdef CONFIG_SCHED_CORE ++ .task_is_throttled = task_is_throttled_rt, ++#endif ++ ++#ifdef CONFIG_UCLAMP_TASK ++ .uclamp_enabled = 1, ++#endif ++}; ++ ++#ifdef CONFIG_RT_GROUP_SCHED ++/* ++ * Ensure that the real time constraints are schedulable. ++ */ ++static DEFINE_MUTEX(rt_constraints_mutex); ++ ++static inline int tg_has_rt_tasks(struct task_group *tg) ++{ ++ struct task_struct *task; ++ struct css_task_iter it; ++ int ret = 0; ++ ++ /* ++ * Autogroups do not have RT tasks; see autogroup_create(). ++ */ ++ if (task_group_is_autogroup(tg)) ++ return 0; ++ ++ css_task_iter_start(&tg->css, 0, &it); ++ while (!ret && (task = css_task_iter_next(&it))) ++ ret |= rt_task(task); ++ css_task_iter_end(&it); ++ ++ return ret; ++} ++ ++struct rt_schedulable_data { ++ struct task_group *tg; ++ u64 rt_period; ++ u64 rt_runtime; ++}; ++ ++static int tg_rt_schedulable(struct task_group *tg, void *data) ++{ ++ struct rt_schedulable_data *d = data; ++ struct task_group *child; ++ unsigned long total, sum = 0; ++ u64 period, runtime; ++ ++ period = ktime_to_ns(tg->rt_bandwidth.rt_period); ++ runtime = tg->rt_bandwidth.rt_runtime; ++ ++ if (tg == d->tg) { ++ period = d->rt_period; ++ runtime = d->rt_runtime; ++ } ++ ++ /* ++ * Cannot have more runtime than the period. ++ */ ++ if (runtime > period && runtime != RUNTIME_INF) ++ return -EINVAL; ++ ++ /* ++ * Ensure we don't starve existing RT tasks if runtime turns zero. ++ */ ++ if (rt_bandwidth_enabled() && !runtime && ++ tg->rt_bandwidth.rt_runtime && tg_has_rt_tasks(tg)) ++ return -EBUSY; ++ ++ total = to_ratio(period, runtime); ++ ++ /* ++ * Nobody can have more than the global setting allows. ++ */ ++ if (total > to_ratio(global_rt_period(), global_rt_runtime())) ++ return -EINVAL; ++ ++ /* ++ * The sum of our children's runtime should not exceed our own. ++ */ ++ list_for_each_entry_rcu(child, &tg->children, siblings) { ++ period = ktime_to_ns(child->rt_bandwidth.rt_period); ++ runtime = child->rt_bandwidth.rt_runtime; ++ ++ if (child == d->tg) { ++ period = d->rt_period; ++ runtime = d->rt_runtime; ++ } ++ ++ sum += to_ratio(period, runtime); ++ } ++ ++ if (sum > total) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int __rt_schedulable(struct task_group *tg, u64 period, u64 runtime) ++{ ++ int ret; ++ ++ struct rt_schedulable_data data = { ++ .tg = tg, ++ .rt_period = period, ++ .rt_runtime = runtime, ++ }; ++ ++ rcu_read_lock(); ++ ret = walk_tg_tree(tg_rt_schedulable, tg_nop, &data); ++ rcu_read_unlock(); ++ ++ return ret; ++} ++ ++static int tg_set_rt_bandwidth(struct task_group *tg, ++ u64 rt_period, u64 rt_runtime) ++{ ++ int i, err = 0; ++ ++ /* ++ * Disallowing the root group RT runtime is BAD, it would disallow the ++ * kernel creating (and or operating) RT threads. ++ */ ++ if (tg == &root_task_group && rt_runtime == 0) ++ return -EINVAL; ++ ++ /* No period doesn't make any sense. */ ++ if (rt_period == 0) ++ return -EINVAL; ++ ++ /* ++ * Bound quota to defend quota against overflow during bandwidth shift. ++ */ ++ if (rt_runtime != RUNTIME_INF && rt_runtime > max_rt_runtime) ++ return -EINVAL; ++ ++ mutex_lock(&rt_constraints_mutex); ++ err = __rt_schedulable(tg, rt_period, rt_runtime); ++ if (err) ++ goto unlock; ++ ++ raw_spin_lock_irq(&tg->rt_bandwidth.rt_runtime_lock); ++ tg->rt_bandwidth.rt_period = ns_to_ktime(rt_period); ++ tg->rt_bandwidth.rt_runtime = rt_runtime; ++ ++ for_each_possible_cpu(i) { ++ struct rt_rq *rt_rq = tg->rt_rq[i]; ++ ++ raw_spin_lock(&rt_rq->rt_runtime_lock); ++ rt_rq->rt_runtime = rt_runtime; ++ raw_spin_unlock(&rt_rq->rt_runtime_lock); ++ } ++ raw_spin_unlock_irq(&tg->rt_bandwidth.rt_runtime_lock); ++unlock: ++ mutex_unlock(&rt_constraints_mutex); ++ ++ return err; ++} ++ ++int sched_group_set_rt_runtime(struct task_group *tg, long rt_runtime_us) ++{ ++ u64 rt_runtime, rt_period; ++ ++ rt_period = ktime_to_ns(tg->rt_bandwidth.rt_period); ++ rt_runtime = (u64)rt_runtime_us * NSEC_PER_USEC; ++ if (rt_runtime_us < 0) ++ rt_runtime = RUNTIME_INF; ++ else if ((u64)rt_runtime_us > U64_MAX / NSEC_PER_USEC) ++ return -EINVAL; ++ ++ return tg_set_rt_bandwidth(tg, rt_period, rt_runtime); ++} ++ ++long sched_group_rt_runtime(struct task_group *tg) ++{ ++ u64 rt_runtime_us; ++ ++ if (tg->rt_bandwidth.rt_runtime == RUNTIME_INF) ++ return -1; ++ ++ rt_runtime_us = tg->rt_bandwidth.rt_runtime; ++ do_div(rt_runtime_us, NSEC_PER_USEC); ++ return rt_runtime_us; ++} ++ ++int sched_group_set_rt_period(struct task_group *tg, u64 rt_period_us) ++{ ++ u64 rt_runtime, rt_period; ++ ++ if (rt_period_us > U64_MAX / NSEC_PER_USEC) ++ return -EINVAL; ++ ++ rt_period = rt_period_us * NSEC_PER_USEC; ++ rt_runtime = tg->rt_bandwidth.rt_runtime; ++ ++ return tg_set_rt_bandwidth(tg, rt_period, rt_runtime); ++} ++ ++long sched_group_rt_period(struct task_group *tg) ++{ ++ u64 rt_period_us; ++ ++ rt_period_us = ktime_to_ns(tg->rt_bandwidth.rt_period); ++ do_div(rt_period_us, NSEC_PER_USEC); ++ return rt_period_us; ++} ++ ++#ifdef CONFIG_SYSCTL ++static int sched_rt_global_constraints(void) ++{ ++ int ret = 0; ++ ++ mutex_lock(&rt_constraints_mutex); ++ ret = __rt_schedulable(NULL, 0, 0); ++ mutex_unlock(&rt_constraints_mutex); ++ ++ return ret; ++} ++#endif /* CONFIG_SYSCTL */ ++ ++int sched_rt_can_attach(struct task_group *tg, struct task_struct *tsk) ++{ ++ /* Don't accept realtime tasks when there is no way for them to run */ ++ if (rt_task(tsk) && tg->rt_bandwidth.rt_runtime == 0) ++ return 0; ++ ++ return 1; ++} ++ ++#else /* !CONFIG_RT_GROUP_SCHED */ ++ ++#ifdef CONFIG_SYSCTL ++static int sched_rt_global_constraints(void) ++{ ++ unsigned long flags; ++ int i; ++ ++ raw_spin_lock_irqsave(&def_rt_bandwidth.rt_runtime_lock, flags); ++ for_each_possible_cpu(i) { ++ struct rt_rq *rt_rq = &cpu_rq(i)->rt; ++ ++ raw_spin_lock(&rt_rq->rt_runtime_lock); ++ rt_rq->rt_runtime = global_rt_runtime(); ++ raw_spin_unlock(&rt_rq->rt_runtime_lock); ++ } ++ raw_spin_unlock_irqrestore(&def_rt_bandwidth.rt_runtime_lock, flags); ++ ++ return 0; ++} ++#endif /* CONFIG_SYSCTL */ ++#endif /* CONFIG_RT_GROUP_SCHED */ ++ ++#ifdef CONFIG_SYSCTL ++static int sched_rt_global_validate(void) ++{ ++ if ((sysctl_sched_rt_runtime != RUNTIME_INF) && ++ ((sysctl_sched_rt_runtime > sysctl_sched_rt_period) || ++ ((u64)sysctl_sched_rt_runtime * ++ NSEC_PER_USEC > max_rt_runtime))) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static void sched_rt_do_global(void) ++{ ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&def_rt_bandwidth.rt_runtime_lock, flags); ++ def_rt_bandwidth.rt_runtime = global_rt_runtime(); ++ def_rt_bandwidth.rt_period = ns_to_ktime(global_rt_period()); ++ raw_spin_unlock_irqrestore(&def_rt_bandwidth.rt_runtime_lock, flags); ++} ++ ++static int sched_rt_handler(struct ctl_table *table, int write, void *buffer, ++ size_t *lenp, loff_t *ppos) ++{ ++ int old_period, old_runtime; ++ static DEFINE_MUTEX(mutex); ++ int ret; ++ ++ mutex_lock(&mutex); ++ old_period = sysctl_sched_rt_period; ++ old_runtime = sysctl_sched_rt_runtime; ++ ++ ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); ++ ++ if (!ret && write) { ++ ret = sched_rt_global_validate(); ++ if (ret) ++ goto undo; ++ ++ ret = sched_dl_global_validate(); ++ if (ret) ++ goto undo; ++ ++ ret = sched_rt_global_constraints(); ++ if (ret) ++ goto undo; ++ ++ sched_rt_do_global(); ++ sched_dl_do_global(); ++ } ++ if (0) { ++undo: ++ sysctl_sched_rt_period = old_period; ++ sysctl_sched_rt_runtime = old_runtime; ++ } ++ mutex_unlock(&mutex); ++ ++ return ret; ++} ++ ++static int sched_rr_handler(struct ctl_table *table, int write, void *buffer, ++ size_t *lenp, loff_t *ppos) ++{ ++ int ret; ++ static DEFINE_MUTEX(mutex); ++ ++ mutex_lock(&mutex); ++ ret = proc_dointvec(table, write, buffer, lenp, ppos); ++ /* ++ * Make sure that internally we keep jiffies. ++ * Also, writing zero resets the timeslice to default: ++ */ ++ if (!ret && write) { ++ sched_rr_timeslice = ++ sysctl_sched_rr_timeslice <= 0 ? RR_TIMESLICE : ++ msecs_to_jiffies(sysctl_sched_rr_timeslice); ++ ++ if (sysctl_sched_rr_timeslice <= 0) ++ sysctl_sched_rr_timeslice = jiffies_to_msecs(RR_TIMESLICE); ++ } ++ mutex_unlock(&mutex); ++ ++ return ret; ++} ++#endif /* CONFIG_SYSCTL */ ++ ++#ifdef CONFIG_SCHED_DEBUG ++void print_rt_stats(struct seq_file *m, int cpu) ++{ ++ rt_rq_iter_t iter; ++ struct rt_rq *rt_rq; ++ ++ rcu_read_lock(); ++ for_each_rt_rq(rt_rq, iter, cpu_rq(cpu)) ++ print_rt_rq(m, cpu, rt_rq); ++ rcu_read_unlock(); ++} ++#endif /* CONFIG_SCHED_DEBUG */ diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h -index 8cbbbea7f..00cdf0db8 100644 +index d48c6a292..0bdd8f7b6 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h -@@ -2438,6 +2438,7 @@ extern void init_sched_fair_class(void); +@@ -2444,6 +2444,7 @@ extern void init_sched_fair_class(void); extern void reweight_task(struct task_struct *p, const struct load_weight *lw); extern void resched_curr(struct rq *rq); @@ -15285,10 +18129,10 @@ index 8cbbbea7f..00cdf0db8 100644 extern struct rt_bandwidth def_rt_bandwidth; diff --git a/kernel/signal.c b/kernel/signal.c -index 21903f524..9f240d9cb 100644 +index 49c8c24b4..107953e8a 100644 --- a/kernel/signal.c +++ b/kernel/signal.c -@@ -2329,15 +2329,35 @@ static int ptrace_stop(int exit_code, int why, unsigned long message, +@@ -2331,15 +2331,35 @@ static int ptrace_stop(int exit_code, int why, unsigned long message, do_notify_parent_cldstop(current, false, why); /* @@ -15330,7 +18174,7 @@ index 21903f524..9f240d9cb 100644 cgroup_leave_frozen(true); diff --git a/kernel/softirq.c b/kernel/softirq.c -index bd9716d7b..2fde8af88 100644 +index f24d80cf2..e3b9ffd7f 100644 --- a/kernel/softirq.c +++ b/kernel/softirq.c @@ -247,6 +247,19 @@ void __local_bh_enable_ip(unsigned long ip, unsigned int cnt) @@ -15353,7 +18197,7 @@ index bd9716d7b..2fde8af88 100644 /* * Invoked from ksoftirqd_run() outside of the interrupt disabled section * to acquire the per CPU local lock for reentrancy protection. -@@ -623,6 +636,24 @@ static inline void tick_irq_exit(void) +@@ -630,6 +643,24 @@ static inline void tick_irq_exit(void) #endif } @@ -15378,7 +18222,7 @@ index bd9716d7b..2fde8af88 100644 static inline void __irq_exit_rcu(void) { #ifndef __ARCH_IRQ_EXIT_IRQS_DISABLED -@@ -635,6 +666,10 @@ static inline void __irq_exit_rcu(void) +@@ -642,6 +673,10 @@ static inline void __irq_exit_rcu(void) if (!in_interrupt() && local_softirq_pending()) invoke_softirq(); @@ -15389,7 +18233,7 @@ index bd9716d7b..2fde8af88 100644 tick_irq_exit(); } -@@ -967,12 +1002,70 @@ static struct smp_hotplug_thread softirq_threads = { +@@ -974,12 +1009,70 @@ static struct smp_hotplug_thread softirq_threads = { .thread_comm = "ksoftirqd/%u", }; @@ -15462,7 +18306,7 @@ index bd9716d7b..2fde8af88 100644 } early_initcall(spawn_ksoftirqd); diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index 57e5cb36f..c4ae45701 100644 +index e99b1305e..c4ce69da0 100644 --- a/kernel/time/hrtimer.c +++ b/kernel/time/hrtimer.c @@ -1812,7 +1812,7 @@ void hrtimer_interrupt(struct clock_event_device *dev) @@ -15528,10 +18372,10 @@ index 63a8ce717..b3fbe97d1 100644 /* diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c -index fd398af79..03653fcb3 100644 +index 9d9af60b2..47fa2b613 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c -@@ -2708,6 +2708,8 @@ unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status) +@@ -2706,6 +2706,8 @@ unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status) if (tif_need_resched()) trace_flags |= TRACE_FLAG_NEED_RESCHED; @@ -15541,10 +18385,10 @@ index fd398af79..03653fcb3 100644 trace_flags |= TRACE_FLAG_PREEMPT_RESCHED; return (trace_flags << 16) | (min_t(unsigned int, pc & 0xff, 0xf)) | diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c -index 3b7d3e9eb..5a4fefbc0 100644 +index 2b948d35f..959f09ab8 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c -@@ -460,17 +460,29 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) +@@ -464,17 +464,29 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) (entry->flags & TRACE_FLAG_IRQS_OFF && bh_off) ? 'D' : (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' : bh_off ? 'b' : @@ -15578,16 +18422,16 @@ index 3b7d3e9eb..5a4fefbc0 100644 break; diff --git a/localversion-rt b/localversion-rt new file mode 100644 -index 000000000..2af6c89ae +index 000000000..75493460c --- /dev/null +++ b/localversion-rt @@ -0,0 +1 @@ -+-rt40 ++-rt51 diff --git a/net/core/dev.c b/net/core/dev.c -index 5a5bd339f..8f193d7b8 100644 +index 479a3892f..d33ca4a3b 100644 --- a/net/core/dev.c +++ b/net/core/dev.c -@@ -4705,15 +4705,6 @@ static void rps_trigger_softirq(void *data) +@@ -4715,15 +4715,6 @@ static void rps_trigger_softirq(void *data) #endif /* CONFIG_RPS */ @@ -15603,7 +18447,7 @@ index 5a5bd339f..8f193d7b8 100644 /* * After we queued a packet into sd->input_pkt_queue, * we need to make sure this queue is serviced soon. -@@ -6682,6 +6673,32 @@ static void skb_defer_free_flush(struct softnet_data *sd) +@@ -6692,6 +6683,32 @@ static void skb_defer_free_flush(struct softnet_data *sd) } } @@ -15636,7 +18480,7 @@ index 5a5bd339f..8f193d7b8 100644 static int napi_threaded_poll(void *data) { struct napi_struct *napi = data; -@@ -11619,7 +11636,11 @@ static int __init net_dev_init(void) +@@ -11633,7 +11650,11 @@ static int __init net_dev_init(void) INIT_CSD(&sd->csd, rps_trigger_softirq, sd); sd->cpu = i; #endif @@ -15668,5 +18512,5 @@ index f0a9ef1ae..682175af4 100644 static void skb_splice_csum_page(struct sk_buff *skb, struct page *page, -- -2.25.1 +2.43.0 diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0011-v6.6-stm32mp-rt-r1.patch b/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0011-v6.6-stm32mp-rt-r1.patch deleted file mode 100644 index 490e43afc..000000000 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0011-v6.6-stm32mp-rt-r1.patch +++ /dev/null @@ -1,386 +0,0 @@ -From b3f06e85218243adf893ea11fa8010aff110dbe4 Mon Sep 17 00:00:00 2001 -From: Lionel VITTE -Date: Tue, 3 Dec 2024 14:44:47 +0100 -Subject: [PATCH] v6.6-stm32mp-rt-r1 - ---- - .../configs/fragment-07-rt-sysvinit.config | 12 ++++ - arch/arm/configs/fragment-07-rt.config | 32 ++++++++++ - .../configs/fragment-07-rt-sysvinit.config | 12 ++++ - arch/arm64/configs/fragment-07-rt.config | 33 ++++++++++ - drivers/hwtracing/coresight/coresight-cti.h | 10 +++ - drivers/mfd/stm32-lptimer.c | 55 ++++++++++++++++ - drivers/mfd/syscon.c | 3 + - drivers/soc/st/Kconfig | 6 ++ - drivers/soc/st/Makefile | 1 + - drivers/soc/st/stm32_hog.c | 64 +++++++++++++++++++ - drivers/watchdog/stm32_iwdg.c | 2 +- - 11 files changed, 229 insertions(+), 1 deletion(-) - create mode 100644 arch/arm/configs/fragment-07-rt-sysvinit.config - create mode 100644 arch/arm/configs/fragment-07-rt.config - create mode 100644 arch/arm64/configs/fragment-07-rt-sysvinit.config - create mode 100644 arch/arm64/configs/fragment-07-rt.config - create mode 100644 drivers/soc/st/stm32_hog.c - -diff --git a/arch/arm/configs/fragment-07-rt-sysvinit.config b/arch/arm/configs/fragment-07-rt-sysvinit.config -new file mode 100644 -index 000000000..49a4baf60 ---- /dev/null -+++ b/arch/arm/configs/fragment-07-rt-sysvinit.config -@@ -0,0 +1,12 @@ -+CONFIG_CGROUPS=y -+# CONFIG_CGROUP_SCHED is not set -+# CONFIG_CGROUP_PIDS is not set -+# CONFIG_CGROUP_RDMA is not set -+# CONFIG_CGROUP_FREEZER is not set -+# CONFIG_CGROUP_DEVICE is not set -+# CONFIG_CGROUP_CPUACCT is not set -+# CONFIG_CGROUP_PERF is not set -+# CONFIG_CGROUP_DEBUG is not set -+# CONFIG_CGROUP_NET_PRIO is not set -+# CONFIG_CGROUP_NET_CLASSID is not set -+ -diff --git a/arch/arm/configs/fragment-07-rt.config b/arch/arm/configs/fragment-07-rt.config -new file mode 100644 -index 000000000..98bb8735f ---- /dev/null -+++ b/arch/arm/configs/fragment-07-rt.config -@@ -0,0 +1,32 @@ -+CONFIG_PREEMPT_RT=y -+ -+# disable SCHED_MC -+# CONFIG_MCPM is not set -+ -+# Disable CPUFREQ and CPUIDLE -+# CONFIG_CPU_FREQ is not set -+# CONFIG_CPU_IDLE is not set -+ -+# Force to have HIGH_RES_TIMERS -+CONFIG_HIGH_RES_TIMERS=y -+ -+# force do not go to sleep -+# For multiple core, you should set the specific boot options -+# for isolate the core and render it tickless: "isolcpus=2,3 nohz_full=2,3" -+# Warning: to active only if SMP are present -+# CONFIG_HZ_PERIODIC=y -+ -+# to Enable ftrace, you need to enable the following configuraiton: -+# CONFIG_FTRACE=y -+# CONFIG_IRQSOFF_TRACER=y -+# CONFIG_PREEMPT_TRACER=y -+# CONFIG_SCHED_TRACER=y -+# CONFIG_FUNCTION_TRACER=y -+# By default, the ftrace for RT kernel are disabled -+# CONFIG_FTRACE is not set -+# CONFIG_IRQSOFF_TRACER is not set -+# CONFIG_PREEMPT_TRACER is not set -+# CONFIG_SCHED_TRACER is not set -+# CONFIG_FUNCTION_TRACER is not set -+ -+ -diff --git a/arch/arm64/configs/fragment-07-rt-sysvinit.config b/arch/arm64/configs/fragment-07-rt-sysvinit.config -new file mode 100644 -index 000000000..49a4baf60 ---- /dev/null -+++ b/arch/arm64/configs/fragment-07-rt-sysvinit.config -@@ -0,0 +1,12 @@ -+CONFIG_CGROUPS=y -+# CONFIG_CGROUP_SCHED is not set -+# CONFIG_CGROUP_PIDS is not set -+# CONFIG_CGROUP_RDMA is not set -+# CONFIG_CGROUP_FREEZER is not set -+# CONFIG_CGROUP_DEVICE is not set -+# CONFIG_CGROUP_CPUACCT is not set -+# CONFIG_CGROUP_PERF is not set -+# CONFIG_CGROUP_DEBUG is not set -+# CONFIG_CGROUP_NET_PRIO is not set -+# CONFIG_CGROUP_NET_CLASSID is not set -+ -diff --git a/arch/arm64/configs/fragment-07-rt.config b/arch/arm64/configs/fragment-07-rt.config -new file mode 100644 -index 000000000..8451ff348 ---- /dev/null -+++ b/arch/arm64/configs/fragment-07-rt.config -@@ -0,0 +1,33 @@ -+CONFIG_EXPERT=y -+CONFIG_PREEMPT_RT=y -+ -+# disable SCHED_MC -+# CONFIG_MCPM is not set -+ -+# Disable CPUFREQ and CPUIDLE -+# CONFIG_CPU_FREQ is not set -+# CONFIG_CPU_IDLE is not set -+ -+# Force to have HIGH_RES_TIMERS -+CONFIG_HIGH_RES_TIMERS=y -+ -+# force do not go to sleep -+# For multiple core, you should set the specific boot options -+# for isolate the core and render it tickless: "isolcpus=2,3 nohz_full=2,3" -+# Warning: to active only if SMP are present -+# CONFIG_HZ_PERIODIC=y -+ -+# to Enable ftrace, you need to enable the following configuraiton: -+# CONFIG_FTRACE=y -+# CONFIG_IRQSOFF_TRACER=y -+# CONFIG_PREEMPT_TRACER=y -+# CONFIG_SCHED_TRACER=y -+# CONFIG_FUNCTION_TRACER=y -+# By default, the ftrace for RT kernel are disabled -+# CONFIG_FTRACE is not set -+# CONFIG_IRQSOFF_TRACER is not set -+# CONFIG_PREEMPT_TRACER is not set -+# CONFIG_SCHED_TRACER is not set -+# CONFIG_FUNCTION_TRACER is not set -+ -+ -diff --git a/drivers/hwtracing/coresight/coresight-cti.h b/drivers/hwtracing/coresight/coresight-cti.h -index cb9ee616d..9f9eaaf29 100644 ---- a/drivers/hwtracing/coresight/coresight-cti.h -+++ b/drivers/hwtracing/coresight/coresight-cti.h -@@ -17,6 +17,16 @@ - - #include "coresight-priv.h" - -+#ifdef CONFIG_PREEMPT_RT -+#undef spin_lock_init -+#define spin_lock_init raw_spin_lock_init -+#define spin_lock raw_spin_lock -+#define spin_unlock raw_spin_unlock -+#undef spin_lock_irqsave -+#define spin_lock_irqsave raw_spin_lock_irqsave -+#define spin_unlock_irqrestore raw_spin_unlock_irqrestore -+#define spinlock_t raw_spinlock_t -+#endif - /* - * Device registers - * 0x000 - 0x144: CTI programming and status -diff --git a/drivers/mfd/stm32-lptimer.c b/drivers/mfd/stm32-lptimer.c -index 9fc94122f..8df3b70f1 100644 ---- a/drivers/mfd/stm32-lptimer.c -+++ b/drivers/mfd/stm32-lptimer.c -@@ -21,6 +21,9 @@ static const struct regmap_config stm32_lptimer_regmap_cfg = { - .reg_stride = sizeof(u32), - .max_register = STM32_LPTIM_MAX_REGISTER, - .fast_io = true, -+#ifdef CONFIG_PREEMPT_RT -+ .use_raw_spinlock = true, -+#endif - }; - - static int stm32_lptimer_detect_encoder(struct stm32_lptimer *ddata) -@@ -85,6 +88,13 @@ static int stm32_lptimer_detect_hwcfgr(struct device *dev, struct stm32_lptimer - return 0; - } - -+#ifdef CONFIG_PREEMPT_RT -+static void stm32_lptimer_clk_disable_unprepare(void *data) -+{ -+ clk_disable_unprepare(data); -+} -+#endif -+ - static int stm32_lptimer_probe(struct platform_device *pdev) - { - struct device *dev = &pdev->dev; -@@ -100,8 +110,13 @@ static int stm32_lptimer_probe(struct platform_device *pdev) - if (IS_ERR(mmio)) - return PTR_ERR(mmio); - -+#ifdef CONFIG_PREEMPT_RT -+ ddata->regmap = devm_regmap_init_mmio(dev, mmio, -+ &stm32_lptimer_regmap_cfg); -+#else - ddata->regmap = devm_regmap_init_mmio_clk(dev, "mux", mmio, - &stm32_lptimer_regmap_cfg); -+#endif - if (IS_ERR(ddata->regmap)) - return PTR_ERR(ddata->regmap); - -@@ -109,6 +124,16 @@ static int stm32_lptimer_probe(struct platform_device *pdev) - if (IS_ERR(ddata->clk)) - return PTR_ERR(ddata->clk); - -+#ifdef CONFIG_PREEMPT_RT -+ ret = clk_prepare_enable(ddata->clk); -+ if (ret) -+ return ret; -+ -+ ret = devm_add_action_or_reset(dev, stm32_lptimer_clk_disable_unprepare, ddata->clk); -+ if (ret) -+ return ret; -+#endif -+ - ret = stm32_lptimer_detect_hwcfgr(dev, ddata); - if (ret) - return ret; -@@ -122,6 +147,33 @@ static int stm32_lptimer_probe(struct platform_device *pdev) - return devm_of_platform_populate(&pdev->dev); - } - -+#ifdef CONFIG_PREEMPT_RT -+static int stm32_lptimer_suspend(struct device *dev) -+{ -+ struct stm32_lptimer *priv = dev_get_drvdata(dev); -+ -+ clk_disable(priv->clk); -+ -+ return 0; -+} -+ -+static int stm32_lptimer_resume(struct device *dev) -+{ -+ struct stm32_lptimer *priv = dev_get_drvdata(dev); -+ int ret; -+ -+ ret = clk_enable(priv->clk); -+ if (ret) -+ dev_err(dev, "failed to enable clock. Error [%d]\n", ret); -+ -+ return ret; -+} -+ -+static const struct dev_pm_ops stm32_lptim_pm_ops = { -+ SYSTEM_SLEEP_PM_OPS(stm32_lptimer_suspend, stm32_lptimer_resume) -+}; -+#endif -+ - static const struct of_device_id stm32_lptimer_of_match[] = { - { .compatible = "st,stm32-lptimer", }, - { .compatible = "st,stm32mp21-lptimer", }, -@@ -135,6 +187,9 @@ static struct platform_driver stm32_lptimer_driver = { - .driver = { - .name = "stm32-lptimer", - .of_match_table = stm32_lptimer_of_match, -+#ifdef CONFIG_PREEMPT_RT -+ .pm = pm_ptr(&stm32_lptim_pm_ops), -+#endif - }, - }; - module_platform_driver(stm32_lptimer_driver); -diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c -index 7d0e91164..a5746d117 100644 ---- a/drivers/mfd/syscon.c -+++ b/drivers/mfd/syscon.c -@@ -40,6 +40,9 @@ static const struct regmap_config syscon_regmap_config = { - .reg_bits = 32, - .val_bits = 32, - .reg_stride = 4, -+#ifdef CONFIG_PREEMPT_RT -+ .use_raw_spinlock = true, -+#endif - }; - - static struct syscon *of_syscon_register(struct device_node *np, bool check_res) -diff --git a/drivers/soc/st/Kconfig b/drivers/soc/st/Kconfig -index 1bde2c16c..704a19692 100644 ---- a/drivers/soc/st/Kconfig -+++ b/drivers/soc/st/Kconfig -@@ -1,5 +1,11 @@ - if ARCH_STM32 - -+config STM32_HOG -+ tristate "STM32 hog" -+ default y -+ help -+ Say y to enable clock(s) at the start of the Kernel. -+ - config STM32_PM_DOMAINS - bool "STM32 PM domains" - depends on MACH_STM32MP157 -diff --git a/drivers/soc/st/Makefile b/drivers/soc/st/Makefile -index 6c71607f6..11f056bfc 100644 ---- a/drivers/soc/st/Makefile -+++ b/drivers/soc/st/Makefile -@@ -1,3 +1,4 @@ -+obj-$(CONFIG_STM32_HOG) += stm32_hog.o - obj-$(CONFIG_STM32_PM_DOMAINS) += stm32_pm_domain.o - obj-$(CONFIG_STM32_RISAB) += stm32_risab.o - obj-$(CONFIG_STM32_RISAF) += stm32_risaf.o -diff --git a/drivers/soc/st/stm32_hog.c b/drivers/soc/st/stm32_hog.c -new file mode 100644 -index 000000000..c8fbf8d5e ---- /dev/null -+++ b/drivers/soc/st/stm32_hog.c -@@ -0,0 +1,64 @@ -+// SPDX-License-Identifier: GPL-2.0-only -+/* -+ * Copyright (C) 2024, STMicroelectronics - All Rights Reserved -+ */ -+ -+#include -+#include "linux/device.h" -+#include -+#include -+ -+struct stm32_hog_pdata { -+ struct clk_bulk_data *clks; -+ int num_clks; -+}; -+ -+static void stm32_hog_remove(struct platform_device *pdev) -+{ -+ struct stm32_hog_pdata *priv = platform_get_drvdata(pdev); -+ -+ clk_bulk_disable_unprepare(priv->num_clks, priv->clks); -+} -+ -+static int stm32_hog_probe(struct platform_device *pdev) -+{ -+ struct device *dev = &pdev->dev; -+ struct stm32_hog_pdata *priv; -+ int ret; -+ -+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); -+ if (!priv) -+ return -ENOMEM; -+ -+ priv->num_clks = devm_clk_bulk_get_all(dev, &priv->clks); -+ if (priv->num_clks < 1) -+ return -ENODEV; -+ -+ ret = clk_bulk_prepare_enable(priv->num_clks, priv->clks); -+ if (ret) { -+ dev_err(dev, "failed to enable bulk clks %d\n", ret); -+ return ret; -+ } -+ -+ platform_set_drvdata(pdev, priv); -+ -+ return 0; -+} -+ -+static const struct of_device_id stm32_hog_match[] = { -+ { .compatible = "st,stm32-hog", }, -+ {} -+}; -+MODULE_DEVICE_TABLE(of, stm32_hog_match); -+ -+static struct platform_driver stm32_hog_driver = { -+ .probe = stm32_hog_probe, -+ .remove_new = stm32_hog_remove, -+ .driver = { -+ .name = "stm32-hog", -+ .of_match_table = stm32_hog_match, -+ }, -+}; -+module_platform_driver(stm32_hog_driver); -+MODULE_AUTHOR("Gabriel Fernandez "); -+MODULE_LICENSE("GPL"); -diff --git a/drivers/watchdog/stm32_iwdg.c b/drivers/watchdog/stm32_iwdg.c -index d7dfab2d3..d6a7b74db 100644 ---- a/drivers/watchdog/stm32_iwdg.c -+++ b/drivers/watchdog/stm32_iwdg.c -@@ -320,7 +320,7 @@ static int stm32_iwdg_irq_init(struct platform_device *pdev, - if (!wdt->data->has_early_wakeup) - return 0; - -- irq = platform_get_irq(pdev, 0); -+ irq = platform_get_irq_optional(pdev, 0); - if (irq <= 0) - return 0; - --- -2.34.1 - diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0011-v6.6-stm32mp-rt-r2.patch b/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0011-v6.6-stm32mp-rt-r2.patch new file mode 100644 index 000000000..9e703edf1 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/0011-v6.6-stm32mp-rt-r2.patch @@ -0,0 +1,515 @@ +From 57e65e96ba3f5350f7ec305a8ea4318b2c6d88b9 Mon Sep 17 00:00:00 2001 +From: Christophe Priouzeau +Date: Thu, 5 Jun 2025 11:10:31 +0200 +Subject: [PATCH] v6.6-stm32mp-rt-r2 + +--- +Upstream-Status: Pending [specific to ST boards] + + .../configs/fragment-07-rt-sysvinit.config | 12 ++++ + arch/arm/configs/fragment-07-rt.config | 9 +++ + arch/arm/configs/fragment-10-rt-perf.config | 40 +++++++++++++ + .../configs/fragment-07-rt-sysvinit.config | 12 ++++ + arch/arm64/configs/fragment-07-rt.config | 9 +++ + arch/arm64/configs/fragment-10-rt-perf.config | 40 +++++++++++++ + drivers/clocksource/timer-stm32-lp.c | 36 +++++++++++- + drivers/hwtracing/coresight/coresight-cti.h | 10 ++++ + drivers/input/keyboard/gpio_keys.c | 7 ++- + drivers/mfd/syscon.c | 3 + + drivers/tty/serial/stm32-usart.c | 56 +++++-------------- + 11 files changed, 188 insertions(+), 46 deletions(-) + create mode 100644 arch/arm/configs/fragment-07-rt-sysvinit.config + create mode 100644 arch/arm/configs/fragment-07-rt.config + create mode 100644 arch/arm/configs/fragment-10-rt-perf.config + create mode 100644 arch/arm64/configs/fragment-07-rt-sysvinit.config + create mode 100644 arch/arm64/configs/fragment-07-rt.config + create mode 100644 arch/arm64/configs/fragment-10-rt-perf.config + +diff --git a/arch/arm/configs/fragment-07-rt-sysvinit.config b/arch/arm/configs/fragment-07-rt-sysvinit.config +new file mode 100644 +index 000000000..49a4baf60 +--- /dev/null ++++ b/arch/arm/configs/fragment-07-rt-sysvinit.config +@@ -0,0 +1,12 @@ ++CONFIG_CGROUPS=y ++# CONFIG_CGROUP_SCHED is not set ++# CONFIG_CGROUP_PIDS is not set ++# CONFIG_CGROUP_RDMA is not set ++# CONFIG_CGROUP_FREEZER is not set ++# CONFIG_CGROUP_DEVICE is not set ++# CONFIG_CGROUP_CPUACCT is not set ++# CONFIG_CGROUP_PERF is not set ++# CONFIG_CGROUP_DEBUG is not set ++# CONFIG_CGROUP_NET_PRIO is not set ++# CONFIG_CGROUP_NET_CLASSID is not set ++ +diff --git a/arch/arm/configs/fragment-07-rt.config b/arch/arm/configs/fragment-07-rt.config +new file mode 100644 +index 000000000..aba9d8c25 +--- /dev/null ++++ b/arch/arm/configs/fragment-07-rt.config +@@ -0,0 +1,9 @@ ++CONFIG_EXPERT=y ++CONFIG_PREEMPT_RT=y ++ ++# Force to have HIGH_RES_TIMERS ++CONFIG_HIGH_RES_TIMERS=y ++ ++# Disable CPUFREQ and CPUIDLE ++# CONFIG_CPU_FREQ is not set ++# CONFIG_CPU_IDLE is not set +diff --git a/arch/arm/configs/fragment-10-rt-perf.config b/arch/arm/configs/fragment-10-rt-perf.config +new file mode 100644 +index 000000000..46e67dba9 +--- /dev/null ++++ b/arch/arm/configs/fragment-10-rt-perf.config +@@ -0,0 +1,40 @@ ++# avoid degrading from-idle transition latencies, disable dyntick ++CONFIG_HZ_PERIODIC=y ++ ++# Disable OPTEE RNG over PTA support ++# CONFIG_HW_RANDOM_OPTEE is not set ++ ++# Remove power domains management ++# CONFIG_SUSPEND_FREEZER is not set ++# CONFIG_HIBERNATE_CALLBACKS is not set ++# CONFIG_PM_SLEEP is not set ++# CONFIG_PM_TRACE_RTC is not set ++# CONFIG_PM_GENERIC_DOMAINS is not set ++ ++#Debugging features ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_PROFILING is not set ++# CONFIG_PSI is not set ++# to Enable ftrace, you need to enable the following configuration: ++# CONFIG_TRACING is not set ++# CONFIG_FTRACE is not set ++# CONFIG_IRQSOFF_TRACER is not set ++# CONFIG_PREEMPT_TRACER is not set ++# CONFIG_SCHED_TRACER is not set ++# CONFIG_FUNCTION_TRACER is not set ++# CONFIG_FTRACE_SYSCALLS is not set ++# CONFIG_STACK_TRACER is not set ++# CONFIG_FUNCTION_PROFILER is not set ++# CONFIG_TIMERLAT_TRACER is not set ++ ++#Lockdep activation ++# CONFIG_DEBUG_ATOMIC_SLEEP is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_LOCKDEP is not set ++# CONFIG_LOCKUP_DETECTOR is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++ ++# CONFIG_ARM_SMC_WATCHDOG is not set +diff --git a/arch/arm64/configs/fragment-07-rt-sysvinit.config b/arch/arm64/configs/fragment-07-rt-sysvinit.config +new file mode 100644 +index 000000000..49a4baf60 +--- /dev/null ++++ b/arch/arm64/configs/fragment-07-rt-sysvinit.config +@@ -0,0 +1,12 @@ ++CONFIG_CGROUPS=y ++# CONFIG_CGROUP_SCHED is not set ++# CONFIG_CGROUP_PIDS is not set ++# CONFIG_CGROUP_RDMA is not set ++# CONFIG_CGROUP_FREEZER is not set ++# CONFIG_CGROUP_DEVICE is not set ++# CONFIG_CGROUP_CPUACCT is not set ++# CONFIG_CGROUP_PERF is not set ++# CONFIG_CGROUP_DEBUG is not set ++# CONFIG_CGROUP_NET_PRIO is not set ++# CONFIG_CGROUP_NET_CLASSID is not set ++ +diff --git a/arch/arm64/configs/fragment-07-rt.config b/arch/arm64/configs/fragment-07-rt.config +new file mode 100644 +index 000000000..aba9d8c25 +--- /dev/null ++++ b/arch/arm64/configs/fragment-07-rt.config +@@ -0,0 +1,9 @@ ++CONFIG_EXPERT=y ++CONFIG_PREEMPT_RT=y ++ ++# Force to have HIGH_RES_TIMERS ++CONFIG_HIGH_RES_TIMERS=y ++ ++# Disable CPUFREQ and CPUIDLE ++# CONFIG_CPU_FREQ is not set ++# CONFIG_CPU_IDLE is not set +diff --git a/arch/arm64/configs/fragment-10-rt-perf.config b/arch/arm64/configs/fragment-10-rt-perf.config +new file mode 100644 +index 000000000..46e67dba9 +--- /dev/null ++++ b/arch/arm64/configs/fragment-10-rt-perf.config +@@ -0,0 +1,40 @@ ++# avoid degrading from-idle transition latencies, disable dyntick ++CONFIG_HZ_PERIODIC=y ++ ++# Disable OPTEE RNG over PTA support ++# CONFIG_HW_RANDOM_OPTEE is not set ++ ++# Remove power domains management ++# CONFIG_SUSPEND_FREEZER is not set ++# CONFIG_HIBERNATE_CALLBACKS is not set ++# CONFIG_PM_SLEEP is not set ++# CONFIG_PM_TRACE_RTC is not set ++# CONFIG_PM_GENERIC_DOMAINS is not set ++ ++#Debugging features ++CONFIG_DEBUG_KERNEL=y ++# CONFIG_PROFILING is not set ++# CONFIG_PSI is not set ++# to Enable ftrace, you need to enable the following configuration: ++# CONFIG_TRACING is not set ++# CONFIG_FTRACE is not set ++# CONFIG_IRQSOFF_TRACER is not set ++# CONFIG_PREEMPT_TRACER is not set ++# CONFIG_SCHED_TRACER is not set ++# CONFIG_FUNCTION_TRACER is not set ++# CONFIG_FTRACE_SYSCALLS is not set ++# CONFIG_STACK_TRACER is not set ++# CONFIG_FUNCTION_PROFILER is not set ++# CONFIG_TIMERLAT_TRACER is not set ++ ++#Lockdep activation ++# CONFIG_DEBUG_ATOMIC_SLEEP is not set ++# CONFIG_DEBUG_LOCK_ALLOC is not set ++# CONFIG_DEBUG_MUTEXES is not set ++# CONFIG_DEBUG_SPINLOCK is not set ++# CONFIG_LOCKDEP is not set ++# CONFIG_LOCKUP_DETECTOR is not set ++# CONFIG_PROVE_LOCKING is not set ++# CONFIG_SLUB_DEBUG_ON is not set ++ ++# CONFIG_ARM_SMC_WATCHDOG is not set +diff --git a/drivers/clocksource/timer-stm32-lp.c b/drivers/clocksource/timer-stm32-lp.c +index 815abee7c..4191d38c3 100644 +--- a/drivers/clocksource/timer-stm32-lp.c ++++ b/drivers/clocksource/timer-stm32-lp.c +@@ -43,7 +43,8 @@ static int stm32_clkevent_lp_shutdown(struct clock_event_device *clkevt) + struct stm32_lp_private *priv = to_priv(clkevt); + int ret; + +- if (clockevent_state_oneshot(clkevt) || clockevent_state_periodic(clkevt)) { ++ if (!IS_ENABLED(CONFIG_PREEMPT_RT) && ++ (clockevent_state_oneshot(clkevt) || clockevent_state_periodic(clkevt))) { + ret = pm_runtime_put(priv->dev); + if (ret < 0) { + dev_err(priv->dev, "pm runtime get returned %d\n", ret); +@@ -147,6 +148,13 @@ static int stm32_clkevent_lp_pm_runtime_get(struct clock_event_device *clkevt) + struct stm32_lp_private *priv = to_priv(clkevt); + int ret; + ++ /* ++ * When in PREEMPT_RT, pm_runtime acquires a spinlock, that's not allowed in ++ * atomic context. Workaround it by enabling runtime PM upon probe. ++ */ ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ return 0; ++ + /* Rely on old clockevent state, to balance pm_runtime_get() / pm_runtime_put() calls */ + if (clockevent_state_detached(clkevt) || clockevent_state_shutdown(clkevt)) { + ret = pm_runtime_get(priv->dev); +@@ -160,6 +168,17 @@ static int stm32_clkevent_lp_pm_runtime_get(struct clock_event_device *clkevt) + return 0; + } + ++static void stm32_clkevent_lp_pm_runtime_err(struct clock_event_device *clkevt) ++{ ++ struct stm32_lp_private *priv = to_priv(clkevt); ++ ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) ++ return; ++ ++ if (clockevent_state_detached(clkevt) || clockevent_state_shutdown(clkevt)) ++ pm_runtime_put(priv->dev); ++} ++ + static int stm32_clkevent_lp_set_periodic(struct clock_event_device *clkevt) + { + struct stm32_lp_private *priv = to_priv(clkevt); +@@ -171,7 +190,7 @@ static int stm32_clkevent_lp_set_periodic(struct clock_event_device *clkevt) + + ret = stm32_clkevent_lp_set_timer(priv->period, clkevt, true); + if (ret < 0) +- pm_runtime_put(priv->dev); ++ stm32_clkevent_lp_pm_runtime_err(clkevt); + + return ret; + } +@@ -187,7 +206,7 @@ static int stm32_clkevent_lp_set_oneshot(struct clock_event_device *clkevt) + + ret = stm32_clkevent_lp_set_timer(priv->period, clkevt, false); + if (ret < 0) +- pm_runtime_put(priv->dev); ++ stm32_clkevent_lp_pm_runtime_err(clkevt); + + return ret; + } +@@ -311,6 +330,17 @@ static int stm32_clkevent_lp_probe(struct platform_device *pdev) + if (ret) + return ret; + ++ /* ++ * When in PREEMPT_RT, pm_runtime acquires a spinlock, that's not allowed in atomic ++ * context. Runtime PM is used to acquire the parent's PM domain, when there's one. ++ * That's not necessarily the case on all instances, so it seems an acceptable trade-off. ++ */ ++ if (IS_ENABLED(CONFIG_PREEMPT_RT)) { ++ ret = pm_runtime_resume_and_get(&pdev->dev); ++ if (ret) ++ return ret; ++ } ++ + priv->dev = &pdev->dev; + + stm32_clkevent_lp_init(priv, pdev->dev.parent->of_node, rate); +diff --git a/drivers/hwtracing/coresight/coresight-cti.h b/drivers/hwtracing/coresight/coresight-cti.h +index cb9ee616d..9f9eaaf29 100644 +--- a/drivers/hwtracing/coresight/coresight-cti.h ++++ b/drivers/hwtracing/coresight/coresight-cti.h +@@ -17,6 +17,16 @@ + + #include "coresight-priv.h" + ++#ifdef CONFIG_PREEMPT_RT ++#undef spin_lock_init ++#define spin_lock_init raw_spin_lock_init ++#define spin_lock raw_spin_lock ++#define spin_unlock raw_spin_unlock ++#undef spin_lock_irqsave ++#define spin_lock_irqsave raw_spin_lock_irqsave ++#define spin_unlock_irqrestore raw_spin_unlock_irqrestore ++#define spinlock_t raw_spinlock_t ++#endif + /* + * Device registers + * 0x000 - 0x144: CTI programming and status +diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c +index 2e7c2c046..b96a85460 100644 +--- a/drivers/input/keyboard/gpio_keys.c ++++ b/drivers/input/keyboard/gpio_keys.c +@@ -454,12 +454,15 @@ static enum hrtimer_restart gpio_keys_irq_timer(struct hrtimer *t) + struct gpio_button_data, + release_timer); + struct input_dev *input = bdata->input; ++ unsigned long flags; + ++ spin_lock_irqsave(&bdata->lock, flags); + if (bdata->key_pressed) { + input_report_key(input, *bdata->code, 0); + input_sync(input); + bdata->key_pressed = false; + } ++ spin_unlock_irqrestore(&bdata->lock, flags); + + return HRTIMER_NORESTART; + } +@@ -493,7 +496,7 @@ static irqreturn_t gpio_keys_irq_isr(int irq, void *dev_id) + if (bdata->release_delay) + hrtimer_start(&bdata->release_timer, + ms_to_ktime(bdata->release_delay), +- HRTIMER_MODE_REL_HARD); ++ HRTIMER_MODE_REL); + out: + spin_unlock_irqrestore(&bdata->lock, flags); + return IRQ_HANDLED; +@@ -630,7 +633,7 @@ static int gpio_keys_setup_key(struct platform_device *pdev, + + bdata->release_delay = button->debounce_interval; + hrtimer_init(&bdata->release_timer, +- CLOCK_REALTIME, HRTIMER_MODE_REL_HARD); ++ CLOCK_REALTIME, HRTIMER_MODE_REL); + bdata->release_timer.function = gpio_keys_irq_timer; + + isr = gpio_keys_irq_isr; +diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c +index 729e79e1b..233712c70 100644 +--- a/drivers/mfd/syscon.c ++++ b/drivers/mfd/syscon.c +@@ -42,6 +42,9 @@ static const struct regmap_config syscon_regmap_config = { + .reg_bits = 32, + .val_bits = 32, + .reg_stride = 4, ++#ifdef CONFIG_PREEMPT_RT ++ .use_raw_spinlock = true, ++#endif + }; + + static struct syscon *of_syscon_register(struct device_node *np, bool check_res) +diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c +index 1c949774f..b56d3b77c 100644 +--- a/drivers/tty/serial/stm32-usart.c ++++ b/drivers/tty/serial/stm32-usart.c +@@ -58,7 +58,6 @@ static struct stm32_usart_info __maybe_unused stm32f4_info = { + .cfg = { + .uart_enable_bit = 13, + .has_7bits_data = false, +- .fifosize = 1, + } + }; + +@@ -82,7 +81,6 @@ static struct stm32_usart_info __maybe_unused stm32f7_info = { + .uart_enable_bit = 0, + .has_7bits_data = true, + .has_swap = true, +- .fifosize = 1, + } + }; + +@@ -109,7 +107,6 @@ static struct stm32_usart_info __maybe_unused stm32h7_info = { + .has_swap = true, + .has_wakeup = true, + .has_fifo = true, +- .fifosize = 16, + } + }; + +@@ -192,7 +189,6 @@ static void stm32_usart_config_reg_rs485(u32 *cr1, u32 *cr3, u32 delay_ADE, + u32 delay_DDE, u32 baud) + { + u32 rs485_deat_dedt; +- u32 rs485_deat_dedt_max = (USART_CR1_DEAT_MASK >> USART_CR1_DEAT_SHIFT); + bool over8; + + *cr3 |= USART_CR3_DEM; +@@ -205,24 +201,18 @@ static void stm32_usart_config_reg_rs485(u32 *cr1, u32 *cr3, u32 delay_ADE, + else + rs485_deat_dedt = delay_ADE * baud * 16; + +- rs485_deat_dedt = DIV_ROUND_CLOSEST(rs485_deat_dedt, 1000); +- rs485_deat_dedt = rs485_deat_dedt > rs485_deat_dedt_max ? +- rs485_deat_dedt_max : rs485_deat_dedt; +- rs485_deat_dedt = (rs485_deat_dedt << USART_CR1_DEAT_SHIFT) & +- USART_CR1_DEAT_MASK; +- *cr1 |= rs485_deat_dedt; ++ rs485_deat_dedt = DIV_ROUND_UP(rs485_deat_dedt, 1000); ++ rs485_deat_dedt = min_t(u32, rs485_deat_dedt, FIELD_MAX(USART_CR1_DEAT_MASK)); ++ *cr1 |= FIELD_PREP(USART_CR1_DEAT_MASK, rs485_deat_dedt); + + if (over8) + rs485_deat_dedt = delay_DDE * baud * 8; + else + rs485_deat_dedt = delay_DDE * baud * 16; + +- rs485_deat_dedt = DIV_ROUND_CLOSEST(rs485_deat_dedt, 1000); +- rs485_deat_dedt = rs485_deat_dedt > rs485_deat_dedt_max ? +- rs485_deat_dedt_max : rs485_deat_dedt; +- rs485_deat_dedt = (rs485_deat_dedt << USART_CR1_DEDT_SHIFT) & +- USART_CR1_DEDT_MASK; +- *cr1 |= rs485_deat_dedt; ++ rs485_deat_dedt = DIV_ROUND_UP(rs485_deat_dedt, 1000); ++ rs485_deat_dedt = min_t(u32, rs485_deat_dedt, FIELD_MAX(USART_CR1_DEDT_MASK)); ++ *cr1 |= FIELD_PREP(USART_CR1_DEDT_MASK, rs485_deat_dedt); + } + + static int stm32_usart_config_rs485(struct uart_port *port, struct ktermios *termios, +@@ -850,9 +840,9 @@ static void stm32_usart_tx_dma_complete(void *arg) + pm_runtime_get(port->dev); + + /* Let's see if we have pending data to send */ +- spin_lock_irqsave(&port->lock, flags); ++ uart_port_lock_irqsave(port, &flags); + stm32_usart_transmit_chars(port); +- spin_unlock_irqrestore(&port->lock, flags); ++ uart_port_unlock_irqrestore(port, flags); + + pm_runtime_mark_last_busy(port->dev); + pm_runtime_put_autosuspend(port->dev); +@@ -1142,7 +1132,7 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) + if (!stm32_port->throttled) { + if (((sr & USART_SR_RXNE) && !stm32_usart_rx_dma_started(stm32_port)) || + ((sr & USART_SR_ERR_MASK) && stm32_usart_rx_dma_started(stm32_port))) { +- spin_lock(&port->lock); ++ uart_port_lock(port); + size = stm32_usart_receive_chars(port, false); + uart_unlock_and_check_sysrq(port); + if (size) +@@ -1153,15 +1143,15 @@ static irqreturn_t stm32_usart_interrupt(int irq, void *ptr) + } + + if ((sr & USART_SR_TXE) && !(stm32_port->tx_ch)) { +- spin_lock(&port->lock); ++ uart_port_lock(port); + stm32_usart_transmit_chars(port); +- spin_unlock(&port->lock); ++ uart_port_unlock(port); + ret = IRQ_HANDLED; + } + + /* Receiver timeout irq for DMA RX */ + if (stm32_usart_rx_dma_started(stm32_port) && !stm32_port->throttled) { +- spin_lock(&port->lock); ++ uart_port_lock(port); + size = stm32_usart_receive_chars(port, (sr & USART_SR_RTOF)); + uart_unlock_and_check_sysrq(port); + if (size) +@@ -1319,7 +1309,7 @@ static void stm32_usart_unthrottle(struct uart_port *port) + if (stm32_port->rx_ch) + stm32_usart_rx_dma_start_or_resume(port); + +- spin_unlock_irqrestore(&port->lock, flags); ++ uart_port_unlock_irqrestore(port, flags); + + /* Port is unthrottled, balance pm_runtime */ + pm_runtime_mark_last_busy(port->dev); +@@ -1345,7 +1335,6 @@ static void stm32_usart_stop_rx(struct uart_port *port) + pm_runtime_put_autosuspend(port->dev); + } + +-/* Handle breaks - ignored by us */ + static void stm32_usart_break_ctl(struct uart_port *port, int break_state) + { + struct stm32_port *stm32_port = to_stm32_port(port); +@@ -1701,12 +1690,6 @@ static void stm32_usart_set_termios(struct uart_port *port, + cr1 &= ~(USART_CR1_DEDT_MASK | USART_CR1_DEAT_MASK); + } + +- /* Configure wake up from low power on start bit detection */ +- if (stm32_port->wakeup_src) { +- cr3 &= ~USART_CR3_WUS_MASK; +- cr3 |= USART_CR3_WUS_START_BIT; +- } +- + writel_relaxed(cr3, port->membase + ofs->cr3); + writel_relaxed(cr2, port->membase + ofs->cr2); + writel_relaxed(cr1, port->membase + ofs->cr1); +@@ -1765,9 +1748,9 @@ static void stm32_usart_pm(struct uart_port *port, unsigned int state, + clk_prepare_enable(stm32port->clk); + break; + case UART_PM_STATE_OFF: +- spin_lock_irqsave(&port->lock, flags); ++ uart_port_lock_irqsave(port, &flags); + stm32_usart_clr_bits(port, ofs->cr1, BIT(cfg->uart_enable_bit)); +- spin_unlock_irqrestore(&port->lock, flags); ++ uart_port_unlock_irqrestore(port, flags); + + clk_disable_unprepare(stm32port->clk); + break; +@@ -1910,7 +1893,6 @@ static int stm32_usart_init_port(struct stm32_port *stm32port, + port->flags = UPF_BOOT_AUTOCONF; + port->ops = &stm32_uart_ops; + port->dev = &pdev->dev; +- port->fifosize = stm32port->info->cfg.fifosize; + port->has_sysrq = IS_ENABLED(CONFIG_SERIAL_STM32_CONSOLE); + port->irq = irq; + port->rs485_config = stm32_usart_config_rs485; +@@ -1928,14 +1910,6 @@ static int stm32_usart_init_port(struct stm32_port *stm32port, + stm32port->swap = stm32port->info->cfg.has_swap && + of_property_read_bool(pdev->dev.of_node, "rx-tx-swap"); + +- stm32port->fifoen = stm32port->info->cfg.has_fifo; +- if (stm32port->fifoen) { +- stm32_usart_get_ftcfg(pdev, "rx-threshold", +- &stm32port->rxftcfg); +- stm32_usart_get_ftcfg(pdev, "tx-threshold", +- &stm32port->txftcfg); +- } +- + port->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(port->membase)) + return PTR_ERR(port->membase); +-- +2.43.0 + diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/fragment-10-network-improvment.config b/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/fragment-10-network-improvment.config new file mode 100644 index 000000000..25d21cf02 --- /dev/null +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey/stm32mpcommon/fragment-10-network-improvment.config @@ -0,0 +1,3 @@ +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MEDIATEK is not set +# CONFIG_PAGE_POOL_STATS is not set diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb deleted file mode 100644 index 2902ed23c..000000000 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey_5.15.bb +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (C) 2022-2025, Digi International Inc. - -require recipes-kernel/linux/linux-dey.inc - -SRCBRANCH = "v5.15.71/nxp/master" -SRCBRANCH:stm32mpcommon = "v5.15.118/stm/master" -SRCREV = "${AUTOREV}" -SRCREV:stm32mpcommon = "${AUTOREV}" - -STM_RT_PATCHES = " \ - file://patch-5.15.119-rt65.patch \ - file://0023-5.15-stm32mp-rt-49-r1-CLOCK.patch \ - file://0024-5.15-stm32mp-rt-49-r1-DMA.patch \ - file://0025-5.15-stm32mp-rt-49-r1-MFD.patch \ - file://0026-5.15-stm32mp-rt-49-r1-NET-TTY.patch \ - file://0027-5.15-stm32mp-rt-49-r1-DEVICETREE.patch \ - file://0028-5.15-stm32mp-rt-49-r1-CONFIG.patch \ -" - -SRC_URI:append:stm32mpcommon = " \ - ${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${STM_RT_PATCHES}', '', d)} \ -" - -KERNEL_CONFIG_FRAGMENTS:append:stm32mpcommon = " ${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${S}/arch/arm/configs/fragment-07-rt.config', '', d)}" -KERNEL_CONFIG_FRAGMENTS:append:stm32mpcommon = " ${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${S}/arch/arm/configs/fragment-07-rt-sysvinit.config', '', d)}" -KERNEL_CONFIG_FRAGMENTS:append:ccmp13 = " ${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${S}/arch/arm/configs/fragment-08-rt-mp13.config', '', d)}" - -do_assemble_fitimage:append:ccmp1() { - # - # Step 9: Add public keys to the different U-Boot dtb files - # - if [ "${UBOOT_SIGN_ENABLE}" = "1" ] && [ -n "${UBOOT_DEVICETREE}" ]; then - for devicetree in ${UBOOT_DEVICETREE}; do - if [ -f "${STAGING_DATADIR}/${devicetree}.dtb" ]; then - cp -P "${STAGING_DATADIR}/${devicetree}.dtb" ${B} - - # Add image public key in U-Boot dtb file - fdt_add_pubkey -a "${FIT_HASH_ALG},${FIT_SIGN_ALG}" \ - -k "${UBOOT_SIGN_KEYDIR}" \ - -n "${UBOOT_SIGN_IMG_KEYNAME}" \ - -r "image" \ - "${B}/${devicetree}.dtb" - - # Add configuration public key in U-Boot dtb file - fdt_add_pubkey -a "${FIT_HASH_ALG},${FIT_SIGN_ALG}" \ - -k "${UBOOT_SIGN_KEYDIR}" \ - -n "${UBOOT_SIGN_KEYNAME}" \ - -r "conf" \ - "${B}/${devicetree}.dtb" - fi - done - fi -} - -kernel_do_deploy:append:ccmp1() { - if [ "${UBOOT_SIGN_ENABLE}" = "1" ] && \ - [ -n "${UBOOT_DTB_BINARY}" ] ; then - # Install device tree files with signature - if [ -n "${UBOOT_DEVICETREE}" ]; then - for devicetree in ${UBOOT_DEVICETREE}; do - if [ -f "${B}/${devicetree}.dtb" ]; then - install -m 0644 ${B}/${devicetree}.dtb "${DEPLOYDIR}/${FIP_UBOOT_DTB}-${devicetree}-with-signature.dtb" - fi - done - fi - fi -} - -COMPATIBLE_MACHINE = "(ccimx6$)" diff --git a/meta-digi-arm/recipes-kernel/linux/linux-dey_6.6.bb b/meta-digi-arm/recipes-kernel/linux/linux-dey_6.6.bb index b8d792fc2..cb3491fe0 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-dey_6.6.bb +++ b/meta-digi-arm/recipes-kernel/linux/linux-dey_6.6.bb @@ -13,20 +13,26 @@ RT_FILES:use-nxp-bsp = " \ file://fragment-nxp-rt.config \ " RT_FILES:stm32mpcommon = " \ - file://0010-Rebase-on-v6.6.48-rt40.patch \ - file://0011-v6.6-stm32mp-rt-r1.patch \ + file://0010-Rebase-on-v6.6.78-rt51.patch \ + file://0011-v6.6-stm32mp-rt-r2.patch \ file://fragment-08-deactivate-rng.config \ + file://fragment-10-network-improvment.config \ " SRC_URI:append = " \ ${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${RT_FILES}', '', d)} \ " +SRC_URI:append:ccmp25 = " \ + ${@oe.utils.conditional('TRUSTFENCE_ENABLED', '1' , 'file://0001-ARM64-dts-ccmp25-add-signed-firmware-support-for-RPR.patch', '', d)} \ +" + # Define RT config fragments per machine RT_CONFIG_FRAGS:use-nxp-bsp = " ${WORKDIR}/fragment-nxp-rt.config" RT_CONFIG_FRAGS:stm32mpcommon = " \ ${S}/arch/arm64/configs/fragment-07-rt.config \ ${S}/arch/arm64/configs/fragment-07-rt-sysvinit.config \ ${WORKDIR}/fragment-08-deactivate-rng.config \ + ${WORKDIR}/fragment-10-network-improvment.config \ " KERNEL_CONFIG_FRAGMENTS:append = " \ ${@bb.utils.contains('DISTRO_FEATURES', 'rt', '${RT_CONFIG_FRAGS}', '', d)} \ @@ -60,4 +66,4 @@ do_install:append:stm32mpcommon() { FILES:${KERNEL_PACKAGE_NAME}-modules:stm32mpcommon += "${sysconfdir}/modprobe.d" -COMPATIBLE_MACHINE = "(ccimx6ul|ccimx8m|ccimx8x|ccimx9|ccmp2|ccmp1)" +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x|ccimx9|ccmp2|ccmp1)" diff --git a/meta-digi-arm/recipes-kernel/linux/linux-trustfence.inc b/meta-digi-arm/recipes-kernel/linux/linux-trustfence.inc index 556024e3c..7eeeb838b 100644 --- a/meta-digi-arm/recipes-kernel/linux/linux-trustfence.inc +++ b/meta-digi-arm/recipes-kernel/linux/linux-trustfence.inc @@ -5,10 +5,10 @@ DEPENDS += "${@oe.utils.vartrue('TRUSTFENCE_SIGN_ARTIFACTS', 'trustfence-sign-to do_deploy[postfuncs] += "${@oe.utils.vartrue('TRUSTFENCE_SIGN_ARTIFACTS', 'trustfence_sign', '', d)}" trustfence_sign() { # Set environment variables for trustfence configuration - export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" + export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_KEYS_PATH}" [ -n "${TRUSTFENCE_KEY_INDEX}" ] && export CONFIG_KEY_INDEX="${TRUSTFENCE_KEY_INDEX}" [ -n "${TRUSTFENCE_SRK_REVOKE_MASK}" ] && export SRK_REVOKE_MASK="${TRUSTFENCE_SRK_REVOKE_MASK}" - [ -n "${TRUSTFENCE_DEK_PATH}" ] && [ "${TRUSTFENCE_DEK_PATH}" != "0" ] && export CONFIG_DEK_PATH="${TRUSTFENCE_DEK_PATH}" + [ "${TRUSTFENCE_ENCRYPT}" = "1" ] && export CONFIG_DEK_PATH="${TRUSTFENCE_KEYS_PATH}/${TRUSTFENCE_DEK_ENCRYPT_KEYNAME}" # Sign/encrypt the kernel images for type in ${KERNEL_IMAGETYPES}; do @@ -52,5 +52,5 @@ trustfence_sign() { } trustfence_sign[dirs] = "${DEPLOYDIR}" -do_deploy[vardeps] += "TRUSTFENCE_SIGN_KEYS_PATH TRUSTFENCE_KEY_INDEX TRUSTFENCE_DEK_PATH" +do_deploy[vardeps] += "TRUSTFENCE_KEYS_PATH TRUSTFENCE_KEY_INDEX" diff --git a/meta-digi-arm/recipes-kernel/perf/perf.bbappend b/meta-digi-arm/recipes-kernel/perf/perf.bbappend deleted file mode 100644 index edc6ce10e..000000000 --- a/meta-digi-arm/recipes-kernel/perf/perf.bbappend +++ /dev/null @@ -1,13 +0,0 @@ -# Drop the poky hardknott commit 6bb1621815f41fd09c971a0e26fb4bcd0963ab8a -# As the script cannot handle the element MetricName - -base_do_configure:prepend () { - # Drop the feature for sort pmu-event - if [ -e "${S}/tools/perf/pmu-events/Build" ]; then - replacement1='$(srctree)/sort-pmuevents.py $(OUTPUT)pmu-events/pmu-events.c $(OUTPUT)pmu-events/pmu-events.c.new' - replacement2='cp $(OUTPUT)pmu-events/pmu-events.c.new $(OUTPUT)pmu-events/pmu-events.c' - sed -i -e "s,$replacement1,,g" "${S}/tools/perf/pmu-events/Build" - sed -i -e "s,$replacement2,,g" "${S}/tools/perf/pmu-events/Build" - fi - # End of drop the feature for sort pmu-event -} diff --git a/meta-digi-dey/classes/dey-image-installer.bbclass b/meta-digi-dey/classes/dey-image-installer.bbclass index 191a0b05a..e7f1defdd 100644 --- a/meta-digi-dey/classes/dey-image-installer.bbclass +++ b/meta-digi-dey/classes/dey-image-installer.bbclass @@ -41,7 +41,7 @@ curate_bootloader_artifacts() { if [ "${DEY_SOC_VENDOR}" = "NXP" ] && echo "${artifact}" | grep -q -e "##SIGNED##"; then if [ "${TRUSTFENCE_SIGN}" = "1" ]; then if [ "${DIGI_SOM}" = "ccimx6ul" ]; then - if [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then # Encrypted bootloader curated_artifact=$(echo "${artifact}" | sed "s,##SIGNED##,${BOOTLOADER_ENCRYPTED_STRING},") CURATED_BOOTABLE_ARTIFACTS="${CURATED_BOOTABLE_ARTIFACTS} ${curated_artifact}" @@ -54,7 +54,7 @@ curate_bootloader_artifacts() { curated_artifact=$(echo "${artifact}" | sed "s,##SIGNED##,${BOOTLOADER_SIGNED_USB_STRING},") CURATED_BOOTABLE_ARTIFACTS="${CURATED_BOOTABLE_ARTIFACTS} ${curated_artifact}" else - if [ "${TRUSTFENCE_DEK_PATH}" != "0" ]; then + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then # Encrypted bootloader curated_artifact=$(echo "${artifact}" | sed "s,##SIGNED##,${BOOTLOADER_ENCRYPTED_STRING},") CURATED_BOOTABLE_ARTIFACTS="${CURATED_BOOTABLE_ARTIFACTS} ${curated_artifact}" diff --git a/meta-digi-dey/classes/dey-swupdate-common.bbclass b/meta-digi-dey/classes/dey-swupdate-common.bbclass index 671900fbd..32b7531f3 100644 --- a/meta-digi-dey/classes/dey-swupdate-common.bbclass +++ b/meta-digi-dey/classes/dey-swupdate-common.bbclass @@ -100,7 +100,7 @@ SWUPDATE_UBOOT_SCRIPT_NAME = "${@os.path.basename(d.getVar('SWUPDATE_UBOOT_SCRIP def get_uboot_prefix(d): prefix = d.getVar('UBOOT_PREFIX') if d.getVar('DEY_SOC_VENDOR') == "NXP" and d.getVar('TRUSTFENCE_ENABLED') == "1": - if d.getVar('TRUSTFENCE_DEK_PATH') and d.getVar('TRUSTFENCE_DEK_PATH') != "0": + if d.getVar('TRUSTFENCE_ENCRYPT') == "1": prefix = f"{prefix}-encrypted" else: prefix = f"{prefix}-signed" @@ -124,7 +124,7 @@ SWUPDATE_UBOOT_OFFSET ?= "${BOOTLOADER_SEEK_BOOTPART}" # Retrieve the correct encryption type. def get_swupdate_uboot_enc(d): - if d.getVar('TRUSTFENCE_DEK_PATH') and d.getVar('TRUSTFENCE_DEK_PATH') != "0" : + if d.getVar('TRUSTFENCE_ENCRYPT') == "1" : return "enc" return "normal" diff --git a/meta-digi-dey/classes/dey-swupdate.bbclass b/meta-digi-dey/classes/dey-swupdate.bbclass index 984ecee46..58004bbac 100644 --- a/meta-digi-dey/classes/dey-swupdate.bbclass +++ b/meta-digi-dey/classes/dey-swupdate.bbclass @@ -2,7 +2,7 @@ # # Generates a 'tar.gz' file with the files and folders to be included in the update package # as part of discrete files SWUpdate installation process. -# +# # Usage: # # In your "local.conf" file, fill the "SWUPDATE_FILES_LIST" variable with the list of diff --git a/meta-digi-dey/classes/trustfence.bbclass b/meta-digi-dey/classes/trustfence.bbclass index b0761d066..a86228ac3 100644 --- a/meta-digi-dey/classes/trustfence.bbclass +++ b/meta-digi-dey/classes/trustfence.bbclass @@ -16,8 +16,15 @@ TRUSTFENCE_CONSOLE_DISABLE ?= "0" # Default secure boot configuration TRUSTFENCE_SIGN ?= "1" -TRUSTFENCE_SIGN_KEYS_PATH ?= "default" -TRUSTFENCE_DEK_PATH ?= "${TF_DEK_PATH}" +TRUSTFENCE_ENCRYPT ?= "${TF_ENCRYPT}" +TRUSTFENCE_KEYS_PATH ?= "${TOPDIR}/trustfence" +# NXP keys +TRUSTFENCE_DEK_ENCRYPT_KEYNAME ?= "dek.bin" +# STM keys +TRUSTFENCE_FIP_ENCRYPT_KEYNAME ?= "encryption_key_fip.bin" +TRUSTFENCE_FSBL_ENCRYPT_KEYNAME ?= "encryption_key_fsbl.bin" +TRUSTFENCE_RPROC_ENCRYPT_KEYNAME ?= "encryption_key_rproc.bin" + TRUSTFENCE_ENCRYPT_ENVIRONMENT ?= "1" TRUSTFENCE_SRK_REVOKE_MASK ?= "0x0" TRUSTFENCE_KEY_INDEX ?= "0" @@ -46,10 +53,9 @@ TRUSTFENCE_READ_ONLY_ROOTFS ?= "${@bb.utils.contains("IMAGE_FEATURES", "read-onl # # Platform specific defaults -TF_DEK_PATH = "default" -TF_DEK_PATH:ccimx9 = "0" -TF_DEK_PATH:ccmp1 = "0" -TF_DEK_PATH:ccmp2 = "0" +TF_ENCRYPT = "1" +TF_ENCRYPT:ccimx9 = "0" +TF_ENCRYPT:ccmp1 = "0" TF_FILE_BASED_ENCRYPT = "0" TF_FILE_BASED_ENCRYPT:ccimx9 = "1" TF_FILE_BASED_ENCRYPT:ccmp1 = "1" @@ -71,13 +77,18 @@ TRUSTFENCE_FIT_CFG_SIGN_KEYNAME ?= "fitcfg" TRUSTFENCE_FIT_IMG_SIGN_KEYNAME ?= "fitimg" # Function to generate a PKI tree (with lock dir protection) -GENPKI_LOCK_DIR = "${TRUSTFENCE_SIGN_KEYS_PATH}/.genpki.lock" +GENPKI_LOCK_DIR = "${TRUSTFENCE_KEYS_PATH}/.genpki.lock" gen_pki_tree() { if mkdir -p ${GENPKI_LOCK_DIR}; then if [ "${DEY_SOC_VENDOR}" = "NXP" ]; then - trustfence-gen-pki.sh ${TRUSTFENCE_SIGN_KEYS_PATH} + trustfence-gen-pki.sh ${TRUSTFENCE_KEYS_PATH} elif [ "${DEY_SOC_VENDOR}" = "STM" ]; then - export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_SIGN_KEYS_PATH}" + export CONFIG_SIGN_KEYS_PATH="${TRUSTFENCE_KEYS_PATH}" + if [ "${TRUSTFENCE_ENCRYPT}" = "1" ]; then + export CONFIG_FIP_ENCRYPT_KEYNAME="${TRUSTFENCE_FIP_ENCRYPT_KEYNAME}" + export CONFIG_FSBL_ENCRYPT_KEYNAME="${TRUSTFENCE_FSBL_ENCRYPT_KEYNAME}" + export CONFIG_RPROC_ENCRYPT_KEYNAME="${TRUSTFENCE_RPROC_ENCRYPT_KEYNAME}" + fi trustfence-gen-pki.sh -p ${DIGI_SOM} fi rm -rf ${GENPKI_LOCK_DIR} @@ -89,7 +100,7 @@ gen_pki_tree() { # Function that generates a PKI tree if there isn't one check_gen_pki_tree() { if [ "${DEY_SOC_VENDOR}" = "NXP" ]; then - SRK_KEYS="$(echo ${TRUSTFENCE_SIGN_KEYS_PATH}/crts/SRK*crt.pem | sed s/\ /\,/g)" + SRK_KEYS="$(echo ${TRUSTFENCE_KEYS_PATH}/crts/SRK*crt.pem | sed s/\ /\,/g)" n_commas="$(echo ${SRK_KEYS} | grep -o "," | wc -l)" if [ "${n_commas}" -eq 0 ]; then gen_pki_tree @@ -110,7 +121,7 @@ copy_public_key() { if [ "${DEY_SOC_VENDOR}" = "NXP" ]; then KEY_INDEX="$(expr ${TRUSTFENCE_KEY_INDEX} + 1)" - PUBLIC_KEY="${TRUSTFENCE_SIGN_KEYS_PATH}/crts/key${KEY_INDEX}.pub" + PUBLIC_KEY="${TRUSTFENCE_KEYS_PATH}/crts/key${KEY_INDEX}.pub" # The new hab/ahab_pki_tree.sh script extracts the public keys after the PKI # generation and leaves them in the crts/ folder. However, the PKI tree may # already exist, the PKI generation script not called, and then the public @@ -118,9 +129,9 @@ copy_public_key() { # selected public key. if [ ! -f "${PUBLIC_KEY}" ]; then if [ "${TRUSTFENCE_SIGN_MODE}" = "HAB" ]; then - CERT_IMG="$(echo ${TRUSTFENCE_SIGN_KEYS_PATH}/crts/IMG${KEY_INDEX}*crt.pem)" + CERT_IMG="$(echo ${TRUSTFENCE_KEYS_PATH}/crts/IMG${KEY_INDEX}*crt.pem)" elif [ "${TRUSTFENCE_SIGN_MODE}" = "AHAB" ]; then - CERT_IMG="$(echo ${TRUSTFENCE_SIGN_KEYS_PATH}/crts/SRK${KEY_INDEX}*crt.pem)" + CERT_IMG="$(echo ${TRUSTFENCE_KEYS_PATH}/crts/SRK${KEY_INDEX}*crt.pem)" else bberror "Unknown TRUSTFENCE_SIGN_MODE value" exit 1 @@ -130,9 +141,9 @@ copy_public_key() { fi elif [ "${DEY_SOC_VENDOR}" = "STM" ]; then if [ "${DIGI_SOM}" = "ccmp15" ]; then - PUBLIC_KEY="${TRUSTFENCE_SIGN_KEYS_PATH}/keys/publicKey.pem" + PUBLIC_KEY="${TRUSTFENCE_KEYS_PATH}/keys/publicKey.pem" else - PUBLIC_KEY="${TRUSTFENCE_SIGN_KEYS_PATH}/keys/publicKey0${TRUSTFENCE_KEY_INDEX}.pem" + PUBLIC_KEY="${TRUSTFENCE_KEYS_PATH}/keys/publicKey0${TRUSTFENCE_KEY_INDEX}.pem" fi else echo "ERROR: Cannot determine the public key" @@ -150,6 +161,14 @@ python () { import hashlib import os + # Check backwards compatibility + if d.getVar("TRUSTFENCE_SIGN_KEYS_PATH"): + d.setVar("TRUSTFENCE_KEYS_PATH", d.getVar("TRUSTFENCE_SIGN_KEYS_PATH")) + if d.getVar("TRUSTFENCE_DEK_PATH"): + DEK_PATH = os.path.dirname(d.getVar("TRUSTFENCE_DEK_PATH")) + if (d.getVar("TRUSTFENCE_KEYS_PATH") != DEK_PATH): + bb.fatal('[trustfence] TRUSTFENCE_DEK_PATH is deprecated; Set new variable TRUSTFENCE_KEYS_PATH to the directory containing both your sign and encryption keys.') + # Secure console configuration if (d.getVar("TRUSTFENCE_CONSOLE_DISABLE") == "1"): d.appendVar("UBOOT_TF_CONF", "CONFIG_CONSOLE_DISABLE=y ") @@ -168,13 +187,6 @@ python () { d.appendVar("UBOOT_TF_CONF", '"# CONFIG_CONSOLE_ENABLE_GPIO_ACTIVE_LOW is not set" ') # Secure boot configuration - if (d.getVar("TRUSTFENCE_SIGN_KEYS_PATH") == "default"): - d.setVar("TRUSTFENCE_SIGN_KEYS_PATH", d.getVar("TOPDIR") + "/trustfence"); - - if (d.getVar("DEY_SOC_VENDOR") == "NXP"): - 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") == "1"): # Set STM-specific variables for signing images if (d.getVar("DEY_SOC_VENDOR") == "STM"): @@ -182,11 +194,18 @@ python () { d.setVar("EXTERNAL_KEY_CONF", "1") d.setVar("SIGN_TOOL", "STM32MP_SigningTool_CLI") if (d.getVar("DIGI_SOM") == "ccmp15" ): - d.setVar("SIGN_KEY", d.getVar("TRUSTFENCE_SIGN_KEYS_PATH") + "/keys/privateKey.pem"); - d.setVar("TRUSTFENCE_PASSWORD_FILE", d.getVar("TRUSTFENCE_SIGN_KEYS_PATH") + "/keys/key_pass.txt") + d.setVar("SIGN_KEY", d.getVar("TRUSTFENCE_KEYS_PATH") + "/keys/privateKey.pem"); + d.setVar("TRUSTFENCE_PASSWORD_FILE", d.getVar("TRUSTFENCE_KEYS_PATH") + "/keys/key_pass.txt") else: - d.setVar("SIGN_KEY", d.getVar("TRUSTFENCE_SIGN_KEYS_PATH") + "/keys/privateKey0%s.pem" % d.getVar("TRUSTFENCE_KEY_INDEX")); - d.setVar("TRUSTFENCE_PASSWORD_FILE", d.getVar("TRUSTFENCE_SIGN_KEYS_PATH") + "/keys/key_pass0%s.txt" % d.getVar("TRUSTFENCE_KEY_INDEX")) + d.setVar("SIGN_KEY", d.getVar("TRUSTFENCE_KEYS_PATH") + "/keys/privateKey0%s.pem" % d.getVar("TRUSTFENCE_KEY_INDEX")); + d.setVar("TRUSTFENCE_PASSWORD_FILE", d.getVar("TRUSTFENCE_KEYS_PATH") + "/keys/key_pass0%s.txt" % d.getVar("TRUSTFENCE_KEY_INDEX")) + if (d.getVar("SIGN_COPRO_ENABLE") == "1" ): + d.setVar("SIGN_COPRO_ECC_PRIVKEY", d.getVar("TRUSTFENCE_KEYS_PATH") + "/rproc-keys/privateKey.pem") + d.setVar("SIGN_COPRO_ECC_PRIVKEY_%s" % (d.getVar("STM32MP_SOC_NAME").strip()), d.getVar("SIGN_COPRO_ECC_PRIVKEY")) + d.setVar("SIGN_COPRO_ECC_INFOKEY", d.getVar("TRUSTFENCE_KEYS_PATH") + "/rproc-keys/publicKey.der") + d.setVar("SIGN_COPRO_ECC_INFOKEY_%s" % (d.getVar("STM32MP_SOC_NAME").strip()), d.getVar("SIGN_COPRO_ECC_INFOKEY")) + d.setVar("TRUSTFENCE_COPRO_PASSWORD_FILE", d.getVar("TRUSTFENCE_KEYS_PATH") + "rproc-keys/key_pass.txt") + d.setVar("SIGN_COPRO_ECC_PASS_%s" % (d.getVar("STM32MP_SOC_NAME").strip()), "UNDEFINED"); d.setVar("SIGN_KEY_%s" % (d.getVar("STM32MP_SOC_NAME").strip()), d.getVar("SIGN_KEY")); d.appendVar("UBOOT_TF_CONF", "CONFIG_SIGN_IMAGE=y ") @@ -197,18 +216,27 @@ python () { d.appendVar("UBOOT_TF_CONF", '"# CONFIG_LEGACY_IMAGE_FORMAT is not set" ') if (d.getVar("TRUSTFENCE_READ_ONLY_ROOTFS") == "1"): d.appendVar("UBOOT_TF_CONF", "CONFIG_AUTHENTICATE_SQUASHFS_ROOTFS=y ") - if d.getVar("TRUSTFENCE_SIGN_KEYS_PATH"): - d.appendVar("UBOOT_TF_CONF", 'CONFIG_SIGN_KEYS_PATH="%s" ' % d.getVar("TRUSTFENCE_SIGN_KEYS_PATH")) + if d.getVar("TRUSTFENCE_KEYS_PATH"): + d.appendVar("UBOOT_TF_CONF", 'CONFIG_SIGN_KEYS_PATH="%s" ' % d.getVar("TRUSTFENCE_KEYS_PATH")) if (d.getVar("TRUSTFENCE_UNLOCK_KEY_REVOCATION") == "1"): d.appendVar("UBOOT_TF_CONF", "CONFIG_UNLOCK_SRK_REVOKE=y ") if d.getVar("TRUSTFENCE_KEY_INDEX"): d.appendVar("UBOOT_TF_CONF", "CONFIG_KEY_INDEX=%s " % d.getVar("TRUSTFENCE_KEY_INDEX")) if (d.getVar("DEY_SOC_VENDOR") == "NXP"): - if (d.getVar("TRUSTFENCE_DEK_PATH") not in [None, "0"]): - d.appendVar("UBOOT_TF_CONF", 'CONFIG_DEK_PATH="%s" ' % d.getVar("TRUSTFENCE_DEK_PATH")) + if (d.getVar("TRUSTFENCE_ENCRYPT") == "1"): + d.appendVar("UBOOT_TF_CONF", 'CONFIG_DEK_PATH="%s/%s" ' % (d.getVar("TRUSTFENCE_KEYS_PATH"), d.getVar("TRUSTFENCE_DEK_ENCRYPT_KEYNAME"))) if d.getVar("TRUSTFENCE_SIGN_MODE"): d.appendVar("UBOOT_TF_CONF", 'CONFIG_SIGN_MODE="%s" ' % d.getVar("TRUSTFENCE_SIGN_MODE")) - + elif (d.getVar("DEY_SOC_VENDOR") == "STM"): + if (d.getVar("TRUSTFENCE_ENCRYPT") == "1"): + d.setVar("ENCRYPT_ENABLE", "1") + d.setVar("ENCRYPT_FSBL_KEY", '%s/%s' % (d.getVar("TRUSTFENCE_KEYS_PATH"), d.getVar("TRUSTFENCE_FSBL_ENCRYPT_KEYNAME"))) + d.setVar("ENCRYPT_FSBL_KEY_%s" % (d.getVar("STM32MP_SOC_NAME").strip()), d.getVar("ENCRYPT_FSBL_KEY")) + d.setVar("ENCRYPT_FIP_KEY", '%s/%s' % (d.getVar("TRUSTFENCE_KEYS_PATH"), d.getVar("TRUSTFENCE_FIP_ENCRYPT_KEYNAME"))) + d.setVar("ENCRYPT_FIP_KEY_%s" % (d.getVar("STM32MP_SOC_NAME").strip()), d.getVar("ENCRYPT_FIP_KEY")) + if (d.getVar("ENCRYPT_COPRO_ENABLE") == "1"): + d.setVar("ENCRYPT_COPRO_KEY", '%s/%s' % (d.getVar("TRUSTFENCE_KEYS_PATH"), d.getVar("TRUSTFENCE_RPROC_ENCRYPT_KEYNAME"))) + d.setVar("ENCRYPT_COPRO_KEY_%s" % (d.getVar("STM32MP_SOC_NAME").strip()), d.getVar("ENCRYPT_COPRO_KEY")) if (d.getVar("TRUSTFENCE_SIGN_FIT_STM") == "1"): # FIT-related variables @@ -223,7 +251,7 @@ python () { # Enable FIT signing support d.setVar("UBOOT_SIGN_ENABLE", d.getVar("TRUSTFENCE_SIGN")) # Set path to FIT signing keys - d.setVar("UBOOT_SIGN_KEYDIR", "%s/fit" % d.getVar("TRUSTFENCE_SIGN_KEYS_PATH")) + d.setVar("UBOOT_SIGN_KEYDIR", "%s/fit" % d.getVar("TRUSTFENCE_KEYS_PATH")) else: # Disable signing artifacts if TRUSTFENCE_SIGN != 1 @@ -241,7 +269,7 @@ python () { d.setVar("SWUPDATE_SIGNING", "RSA") # Retrieve the keys path to use. - keys_path = d.getVar("TRUSTFENCE_SIGN_KEYS_PATH") + keys_path = d.getVar("TRUSTFENCE_KEYS_PATH") # Retrieve the key index to use. key_index = 0 diff --git a/meta-digi-dey/conf/distro/dey.conf b/meta-digi-dey/conf/distro/dey.conf index 53a6fb3cc..403207b6a 100644 --- a/meta-digi-dey/conf/distro/dey.conf +++ b/meta-digi-dey/conf/distro/dey.conf @@ -3,8 +3,8 @@ require conf/distro/poky.conf # Discrete version values. YOCTO_MAJOR = "5" YOCTO_MINOR = "0" -DEY_RELEASE = "2" -DEY_BUILD = "2" +DEY_RELEASE = "3" +DEY_BUILD = "1" # Firmware version of the system. DEY_FIRMWARE_VERSION ?= "${YOCTO_MAJOR}.${YOCTO_MINOR}.${DEY_RELEASE}.${DEY_BUILD}" @@ -43,6 +43,7 @@ INITRAMFS_IMAGE = '${@bb.utils.contains("KERNEL_IMAGETYPE", "fitImage", "${RECOV # DEY image features (alphabetical order) FEATURE_PACKAGES_dey-audio = "packagegroup-dey-audio" FEATURE_PACKAGES_dey-bluetooth = "packagegroup-dey-bluetooth" +FEATURE_PACKAGES_dey-chromium = "packagegroup-dey-chromium" FEATURE_PACKAGES_dey-debug = "packagegroup-dey-debug" FEATURE_PACKAGES_dey-examples = "packagegroup-dey-examples" FEATURE_PACKAGES_dey-flutter = "packagegroup-dey-flutter" @@ -63,16 +64,6 @@ PREFERRED_VERSION_bluez5 ?= "5.72" # porting, use version 1.6.x (still provided by meta-openembedded) PREFERRED_VERSION_libgpiod ?= "1.6.%" -# Starting in wpewebkit 2.46.1, our ConnectCore demo is broken due to clicks -# not being registered in the demo's main area. This doesn't happen in 2.44.4, -# so use that version while we look for a fix in the newer version. -PREFERRED_VERSION_wpewebkit ?= "2.44.4" - -# There's a generic opencl-headers recipe in the thud branch of -# meta-openembedded, but we should use the package provided by the imx-gpu-viv -# recipe in case there are NXP-specific changes in it -PREFERRED_PROVIDER_opencl-headers ?= "imx-gpu-viv" - # Use the FDO backend for WPE WebKit PREFERRED_PROVIDER_virtual/wpebackend = "wpebackend-fdo" diff --git a/meta-digi-dey/conf/layer.conf b/meta-digi-dey/conf/layer.conf index 24bfa794e..efea6a2c0 100644 --- a/meta-digi-dey/conf/layer.conf +++ b/meta-digi-dey/conf/layer.conf @@ -6,6 +6,8 @@ BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \ ${LAYERDIR}/recipes-*/*/*.bbappend" BBFILES_DYNAMIC += " \ + chromium-browser-layer:${LAYERDIR}/dynamic-layers/chromium-browser-layer/*/*/*.bb \ + chromium-browser-layer:${LAYERDIR}/dynamic-layers/chromium-browser-layer/*/*/*.bbappend \ webkit:${LAYERDIR}/dynamic-layers/webkit/*/*/*.bb \ webkit:${LAYERDIR}/dynamic-layers/webkit/*/*/*.bbappend \ selinux:${LAYERDIR}/dynamic-layers/selinux/*/*/*.bb \ diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0001-Fixed-chromium-flicker-with-g2d-renderer.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0001-Fixed-chromium-flicker-with-g2d-renderer.patch new file mode 100644 index 000000000..956bdd3d5 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0001-Fixed-chromium-flicker-with-g2d-renderer.patch @@ -0,0 +1,34 @@ +From 48becd0d71aa2fb1ca5b31c77b66997fe1f77737 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Wed, 1 Nov 2023 18:19:23 +0800 +Subject: [PATCH 1/7] Fixed chromium flicker with g2d-renderer + +chromium V89 reland linux_explicit_synchronization_protocol for +in-fence feature caused the flicker. +The rootcasue is that weston can not acquire fence fd. +A workaround no checking supports_acquire_fence supported. + +Upstream-Status: Inappropriate [i.MX specific] + +Signed-off-by: Wujian Sun +--- + ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc +index acb4a60ba01ea..e93533cecaeb7 100644 +--- a/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc ++++ b/ui/ozone/platform/wayland/gpu/gbm_surfaceless_wayland.cc +@@ -208,8 +208,7 @@ void GbmSurfacelessWayland::Present(SwapCompletionCallback completion_callback, + unsubmitted_frames_.back()->configs.reserve(frame->configs.size()); + // If Wayland server supports linux_explicit_synchronization_protocol, fences + // should be shipped with buffers. Otherwise, we will wait for fences. +- if (buffer_manager_->supports_acquire_fence() || !use_egl_fence_sync_ || +- !frame->schedule_planes_succeeded) { ++ if (!use_egl_fence_sync_ || !frame->schedule_planes_succeeded) { + frame->ready = true; + MaybeSubmitFrames(); + return; +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0002-Disable-dri-for-imx-gpu.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0002-Disable-dri-for-imx-gpu.patch new file mode 100644 index 000000000..c106b4fde --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0002-Disable-dri-for-imx-gpu.patch @@ -0,0 +1,40 @@ +From 18bda704c4e54bd947746729a0ddde672376c081 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Mon, 23 Oct 2023 15:21:53 +0800 +Subject: [PATCH 2/7] Disable dri for imx gpu + +Upstream-Status: Inappropriate [i.MX-specific] + +Signed-off-by: Wujian Sun +--- + content/gpu/BUILD.gn | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/content/gpu/BUILD.gn b/content/gpu/BUILD.gn +index 098082510efab..9befdb8c01499 100644 +--- a/content/gpu/BUILD.gn ++++ b/content/gpu/BUILD.gn +@@ -8,6 +8,11 @@ import("//build/config/ui.gni") + import("//gpu/vulkan/features.gni") + import("//media/media_options.gni") + ++declare_args() { ++ # Checks if i.MX GPU is being used ++ use_imxgpu = false ++} ++ + # See //content/BUILD.gn for how this works. + group("gpu") { + visibility = [ "//content/*" ] # This is an internal content API. +@@ -128,7 +133,7 @@ target(link_target_type, "gpu_sources") { + + # Use DRI on desktop Linux builds. + if (current_cpu != "s390x" && current_cpu != "ppc64" && is_linux && +- !is_castos) { ++ !is_castos && !use_imxgpu) { + configs += [ "//build/config/linux/dri" ] + } + } +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0002-chromium-met-EGL-API-GetProcAddress-failures.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0002-chromium-met-EGL-API-GetProcAddress-failures.patch new file mode 100644 index 000000000..b85e3cfd9 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0002-chromium-met-EGL-API-GetProcAddress-failures.patch @@ -0,0 +1,34 @@ +From fc83501ff2105f99183b3f6ea240d6baacf3ea05 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Wed, 10 Nov 2021 17:28:22 +0800 +Subject: [PATCH] chromium met EGL API GetProcAddress failures + +Wayland not use SwANGLE as below commit, so no need +build SwANGLE on wayland platform. + +commit 97f919dd8b544b583b772664f0d7b8e6b6d8da2e +Reland "Use SwANGLE on all Ozone platforms, except Wayland" + +Upstream-Status: Inappropriate [i.MX-specific] + +Signed-off-by: Wujian Sun +--- + ui/gl/BUILD.gn | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn +index bb7d843c1f363..4b4b360758e1d 100644 +--- a/ui/gl/BUILD.gn ++++ b/ui/gl/BUILD.gn +@@ -252,7 +252,7 @@ component("gl") { + + if (use_ozone) { + deps += [ "//ui/ozone:buildflags" ] +- if (use_egl && !is_fuchsia) { ++ if (use_egl && !is_fuchsia && !ozone_platform_wayland) { + data_deps += [ + "//third_party/angle:libEGL", + "//third_party/angle:libGLESv2", +-- +2.17.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0003-Fix-chromium-build-failure.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0003-Fix-chromium-build-failure.patch new file mode 100644 index 000000000..52d776a73 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0003-Fix-chromium-build-failure.patch @@ -0,0 +1,46 @@ +From 2f284f6819dbd7c37d90ebb2e4076f55745be8b7 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Wed, 18 Oct 2023 15:56:59 +0800 +Subject: [PATCH 3/7] Fix chromium build failure + +| aarch64-poky-linux-ld.lld: error: undefined symbol: +gl::NativeViewGLSurfaceEGL::NativeViewGLSurfaceEGL(gl::GLDisplayEGL*, +void*, std::__1::unique_ptr) +| >>> referenced by gl_surface_wayland.cc:35 +(./../../ui/ozone/platform/wayland/gpu/gl_surface_wayland.cc:35) +| >>> +thinlto-cache/Thin-7f2605.tmp.o:(ui::GLSurfaceWayland::GLSurfaceWayland(gl::GLDisplayEGL*, +std::__1::unique_ptr, +ui::WaylandWindow*)) + +Upstream-Status: Inappropriate [i.MX-specific] + +Signed-off-by: Wujian Sun +--- + ui/gl/BUILD.gn | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn +index 89d11ec9754bb..af207a4dbaea3 100644 +--- a/ui/gl/BUILD.gn ++++ b/ui/gl/BUILD.gn +@@ -196,6 +196,15 @@ component("gl") { + data_deps += [ "//third_party/vulkan-loader/src:libvulkan" ] + } + } ++ if(ozone_platform_wayland) { ++ defines += [ "WAYLAND_GBM" ] ++ ++ deps += [ ++ "//third_party/minigbm", ++ "//ui/gfx:memory_buffer", ++ "//ui/gfx/linux:gbm", ++ ] ++ } + } + + if (ozone_platform_x11) { +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0004-Fixed-chromium-crash-after-upgrading.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0004-Fixed-chromium-crash-after-upgrading.patch new file mode 100644 index 000000000..927e6badd --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0004-Fixed-chromium-crash-after-upgrading.patch @@ -0,0 +1,82 @@ +From 7104f3eb76e3efa58764a53fe125583dc228a806 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Wed, 22 Nov 2023 16:52:59 +0800 +Subject: [PATCH 4/7] Fixed chromium crash after upgrading + +Native display fail to get GBM platform, +add EGL_PLATFORM_GBM_KHR for WAYLAND_GBM. + +Upstream-Status: Inappropriate [i.MX-specific] + +Signed-off-by: Xianzhong Li +--- + ui/gfx/linux/gbm_device.h | 2 ++ + ui/gfx/linux/gbm_wrapper.cc | 2 ++ + .../platform/wayland/gpu/wayland_buffer_manager_gpu.cc | 2 -- + .../platform/wayland/gpu/wayland_surface_factory.cc | 10 ++++++++++ + 4 files changed, 14 insertions(+), 2 deletions(-) + +diff --git a/ui/gfx/linux/gbm_device.h b/ui/gfx/linux/gbm_device.h +index 8fd34e8c7d434..fa5e6a58544bc 100644 +--- a/ui/gfx/linux/gbm_device.h ++++ b/ui/gfx/linux/gbm_device.h +@@ -34,6 +34,8 @@ class GbmDevice { + gfx::NativePixmapHandle handle) = 0; + + virtual bool CanCreateBufferForFormat(uint32_t format) = 0; ++ ++ virtual gbm_device* get() = 0; + }; + + } // namespace ui +diff --git a/ui/gfx/linux/gbm_wrapper.cc b/ui/gfx/linux/gbm_wrapper.cc +index 7a1ae26444f36..415640e5825e3 100644 +--- a/ui/gfx/linux/gbm_wrapper.cc ++++ b/ui/gfx/linux/gbm_wrapper.cc +@@ -467,6 +467,8 @@ class Device final : public ui::GbmDevice { + } + #endif + ++ gbm_device* get() {return device_.get();} ++ + private: + std::vector GetFilteredModifiers( + uint32_t format, +diff --git a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc +index 4e725c5814969..0258548fd80b2 100644 +--- a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc ++++ b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc +@@ -363,8 +363,6 @@ GbmDevice* WaylandBufferManagerGpu::GetGbmDevice() { + if (!supports_dmabuf_ || (!gl::GLSurfaceEGL::GetGLDisplayEGL() + ->ext->b_EGL_EXT_image_dma_buf_import && + !use_fake_gbm_device_for_test_)) { +- supports_dmabuf_ = false; +- return nullptr; + } + + if (gbm_device_ || use_fake_gbm_device_for_test_) +diff --git a/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc b/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc +index bab048c4afac1..d9fe372879061 100644 +--- a/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc ++++ b/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc +@@ -172,6 +172,16 @@ scoped_refptr GLOzoneEGLWayland::CreateOffscreenGLSurface( + } + + gl::EGLDisplayPlatform GLOzoneEGLWayland::GetNativeDisplay() { ++#if defined(WAYLAND_GBM) ++ GbmDevice* const device = buffer_manager_->GetGbmDevice(); ++ if (device != nullptr) { ++ gbm_device* gbm = device->get(); ++ if (gbm) { ++ return gl::EGLDisplayPlatform( ++ reinterpret_cast(gbm), EGL_PLATFORM_GBM_KHR); ++ } ++ } ++#endif + if (connection_) { + return connection_->GetNativeDisplay(); + } +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0005-MGS-7765-Blacklist-MSAA-for-GPU-Raster-on-Vivante-GP.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0005-MGS-7765-Blacklist-MSAA-for-GPU-Raster-on-Vivante-GP.patch new file mode 100644 index 000000000..ac5920dc6 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0005-MGS-7765-Blacklist-MSAA-for-GPU-Raster-on-Vivante-GP.patch @@ -0,0 +1,43 @@ +From 2822bbb8da30ab6f8415db4c98014418519f6b42 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Wed, 26 Jun 2024 15:33:23 +0800 +Subject: [PATCH 5/7] MGS-7765: Blacklist MSAA for GPU Raster on Vivante GPUs + +Vivante had poor performance when enbale MSAA, disable MSAA +for Vivante GPU. + +The same workaround as other GPU vendor having the same issue. +https://codereview.chromium.org/1374043005 + +Upstream-Status: Pending + +Signed-off-by: Wujian Sun +--- + gpu/config/gpu_driver_bug_list.json | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json +index 27fc6e04be012..86ce0297db4f4 100644 +--- a/gpu/config/gpu_driver_bug_list.json ++++ b/gpu/config/gpu_driver_bug_list.json +@@ -3399,6 +3399,17 @@ + "features": [ + "disable_accelerated_h264_encode" + ] ++ }, ++ { ++ "id": 436, ++ "description": "On Vivante GPUs MSAA performance is not acceptable for GPU rasterization", ++ "os": { ++ "type": "linux" ++ }, ++ "gl_vendor": "Vivante Corporation", ++ "features": [ ++ "msaa_is_slow" ++ ] + } + ] + } +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0006-LF-12406-Fixed-webgl-test-fail-for-GL_MAX_SAMPLES-ch.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0006-LF-12406-Fixed-webgl-test-fail-for-GL_MAX_SAMPLES-ch.patch new file mode 100644 index 000000000..31e66400b --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0006-LF-12406-Fixed-webgl-test-fail-for-GL_MAX_SAMPLES-ch.patch @@ -0,0 +1,45 @@ +From dd7196aac0a632cf11bfe37be6832b6f11026aac Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Thu, 27 Jun 2024 14:43:08 +0800 +Subject: [PATCH 6/7] LF-12406: Fixed webgl test fail for GL_MAX_SAMPLES + checking + +Differences Between WebGL and OpenGL ES 3.0 about GL_MAX_SAMPLES. + +https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glGetInternalformativ.xhtml + +So disable the GL_MAX_SAMPLES checking for webgl context. + +Upstream-Status: Inappropriate [i.MX specific] + +Signed-off-by: Wujian Sun +--- + gpu/command_buffer/service/gles2_cmd_decoder.cc | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc +index 895524c824bdb..0132e2c712183 100644 +--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc ++++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc +@@ -8209,11 +8209,13 @@ bool GLES2DecoderImpl::ValidateRenderbufferStorageMultisample( + } + } + +- if (samples > renderbuffer_manager()->max_samples()) { +- LOCAL_SET_GL_ERROR( +- GL_INVALID_VALUE, +- "glRenderbufferStorageMultisample", "samples too large"); +- return false; ++ if (!feature_info_->IsWebGLContext()) { ++ if (samples > renderbuffer_manager()->max_samples()) { ++ LOCAL_SET_GL_ERROR( ++ GL_INVALID_VALUE, ++ "glRenderbufferStorageMultisample", "samples too large"); ++ return false; ++ } + } + + if (width > renderbuffer_manager()->max_renderbuffer_size() || +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0007-Enable-native-GLES2-for-Ozone-wayland.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0007-Enable-native-GLES2-for-Ozone-wayland.patch new file mode 100644 index 000000000..ffe576d5f --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0007-Enable-native-GLES2-for-Ozone-wayland.patch @@ -0,0 +1,33 @@ +From 5dfac9d33977e7db161c04d8e701fb255f9a5710 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Fri, 6 Sep 2024 14:04:35 +0800 +Subject: [PATCH 7/7] Enable native GLES2 for Ozone wayland + +Our GPU not support ANGLE extension + +Revert "Remove native GLES2 implementation from Ozone." + +This reverts commit e10fc690c15674d0434e94a959e99ef510e4ceb0. + +Upstream-Status: Inappropriate [i.MX specific] + +Signed-off-by: Wujian Sun +--- + ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc b/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc +index d9fe372879061..20ca068659d6b 100644 +--- a/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc ++++ b/ui/ozone/platform/wayland/gpu/wayland_surface_factory.cc +@@ -225,6 +225,7 @@ WaylandSurfaceFactory::GetAllowedGLImplementations() { + impls.emplace_back(gl::ANGLEImplementation::kOpenGLES); + impls.emplace_back(gl::ANGLEImplementation::kSwiftShader); + impls.emplace_back(gl::ANGLEImplementation::kVulkan); ++ impls.emplace_back(gl::kGLImplementationEGLGLES2); + } + return impls; + } +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0008-Fix-build-fail-after-clang-llvm-upgrade.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0008-Fix-build-fail-after-clang-llvm-upgrade.patch new file mode 100644 index 000000000..a405aec6d --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0008-Fix-build-fail-after-clang-llvm-upgrade.patch @@ -0,0 +1,38 @@ +From 7299ca8b360cd3596c7fbc5f31fae48ce1060e24 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Thu, 7 Nov 2024 10:34:46 +0800 +Subject: [PATCH] Fix build fail after clang/llvm upgrade + +Disable thinlto cache for need large memory. + +| terminate called after throwing an instance of 'std::bad_alloc' +| what(): std::bad_alloc +| terminate called recursively +| aarch64-poky-linux-clang++: error: unable to execute command: Aborted +(core dumped) +| aarch64-poky-linux-clang++: error: linker command failed due to signal +(use -v to see invocation) + +Upstream-Status: Inappropriate [i.MX specific] + +Signed-off-by: Wujian Sun +--- + build/config/compiler/BUILD.gn | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn +index 45086d6838cac..8a148e4f53e0b 100644 +--- a/build/config/compiler/BUILD.gn ++++ b/build/config/compiler/BUILD.gn +@@ -131,7 +131,7 @@ declare_args() { + # Whether to enable thin lto incremental builds. + # See: https://clang.llvm.org/docs/ThinLTO.html#incremental + # The cache can lead to non-determinism: https://crbug.com/1486045 +- thin_lto_enable_cache = true ++ thin_lto_enable_cache = false + + # Initialize all local variables with a pattern. This flag will fill + # uninitialized floating-point types (and 32-bit pointers) with 0xFF and the +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0009-Fix-chromium-crash-when-run-webgl-2.0.0-cts.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0009-Fix-chromium-crash-when-run-webgl-2.0.0-cts.patch new file mode 100644 index 000000000..9c342721a --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0009-Fix-chromium-crash-when-run-webgl-2.0.0-cts.patch @@ -0,0 +1,36 @@ +From 4850cb4d7eb2d81beb7e4d2311b225b7b1c0bc25 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Tue, 19 Nov 2024 14:11:21 +0800 +Subject: [PATCH] Fix chromium crash when run webgl 2.0.0 cts + +Most display not support YUV format SCANOUT usage, +don't create YUV format GBM bo for SCANOUT. + +webgl 2.0.0 fail cases: +all/conformance2/textures/video + +Upstream-Status: Inappropriate [i.MX specific] + +Signed-off-by: Wujian Sun +--- + ui/gfx/linux/gbm_wrapper.cc | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/ui/gfx/linux/gbm_wrapper.cc b/ui/gfx/linux/gbm_wrapper.cc +index 415640e5825e3..ae99206f28f6a 100644 +--- a/ui/gfx/linux/gbm_wrapper.cc ++++ b/ui/gfx/linux/gbm_wrapper.cc +@@ -313,6 +313,10 @@ class Device final : public ui::GbmDevice { + return CreateBuffer(format, requested_size, flags); + } + ++ //Most display not support YUV format SCANOUT usage ++ if (format == GBM_FORMAT_NV12 && (flags & GBM_BO_USE_SCANOUT)) ++ return nullptr; ++ + // Buggy drivers prevent us from getting plane FDs from a BO which had its + // previously imported BO destroyed. E.g: Nvidia. Thus, on Linux Desktop, we + // do the create/import modifiers validation loop below using a separate set +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0010-Fix-canvas-test-fail-for-webgl.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0010-Fix-canvas-test-fail-for-webgl.patch new file mode 100644 index 000000000..10f4dd313 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0010-Fix-canvas-test-fail-for-webgl.patch @@ -0,0 +1,34 @@ +From d4edb5af2a09a891e02a22514703860c911664a0 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Tue, 10 Dec 2024 14:40:49 +0800 +Subject: [PATCH] Fix canvas test fail for webgl + +canvas fallback from GPU to CPU meet issue with WillReadFrequently. +Set it false as default to avoid the failures. + +conformance/canvas/draw-webgl-to-canvas-test.html +conformance/canvas/draw-static-webgl-to-multiple-canvas-test.html + +Upstream-Status: Inappropriate [i.MX specific] + +Signed-off-by: Wujian Sun +--- + .../htmlcanvas/canvas_context_creation_attributes_helpers.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_helpers.cc b/third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_helpers.cc +index 8938e79c1cbd0..b699d89763ad9 100644 +--- a/third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_helpers.cc ++++ b/third_party/blink/renderer/modules/canvas/htmlcanvas/canvas_context_creation_attributes_helpers.cc +@@ -53,7 +53,7 @@ bool ToCanvasContextCreationAttributes( + break; + default: + result.will_read_frequently = +- CanvasContextCreationAttributesCore::WillReadFrequently::kUndefined; ++ CanvasContextCreationAttributesCore::WillReadFrequently::kFalse; + } + result.xr_compatible = attrs->xrCompatible(); + return true; +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0011-LF-12406-1-Blacklist-disable-program_caching_for_tra.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0011-LF-12406-1-Blacklist-disable-program_caching_for_tra.patch new file mode 100644 index 000000000..0ef6aeebd --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0011-LF-12406-1-Blacklist-disable-program_caching_for_tra.patch @@ -0,0 +1,48 @@ +From c0b01bd497e34bc9d8f0fcb72cd3d5ec36a72f75 Mon Sep 17 00:00:00 2001 +From: Wujian Sun +Date: Fri, 3 Jan 2025 14:23:43 +0800 +Subject: [PATCH] LF-12406-1: Blacklist disable + program_caching_for_transform_feedback on Mali GPUs + +Mali GPU can't pass webgl cts case transform_feedback. +conformance2/transform_feedback/transform_feedback.html + +Seems a bug where program binaries don't cache transform feedback +varyings. + +The same workaround as other GPU vendor having the same issue. +https://codereview.chromium.org/2615573002 + +Upstream-Status: Pending + +Signed-off-by: Wujian Sun +--- + gpu/config/gpu_driver_bug_list.json | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/gpu/config/gpu_driver_bug_list.json b/gpu/config/gpu_driver_bug_list.json +index 86ce0297db4f4..332a5c15768be 100644 +--- a/gpu/config/gpu_driver_bug_list.json ++++ b/gpu/config/gpu_driver_bug_list.json +@@ -3410,6 +3410,18 @@ + "features": [ + "msaa_is_slow" + ] ++ }, ++ { ++ "id": 437, ++ "description": "Program binaries don't contain transform feedback varyings on Mali GPUs", ++ "os": { ++ "type": "linux" ++ }, ++ "gl_vendor": "ARM.*", ++ "gl_renderer": "Mali.*", ++ "features": [ ++ "disable_program_caching_for_transform_feedback" ++ ] + } + ] + } +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0101-V4L2Device-Correct-v4l2-codec-device-path.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0101-V4L2Device-Correct-v4l2-codec-device-path.patch new file mode 100644 index 000000000..9a33bc79b --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0101-V4L2Device-Correct-v4l2-codec-device-path.patch @@ -0,0 +1,31 @@ +From fb1763465e8720cd090a9787ef52376611064337 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 22:18:54 +0900 +Subject: [PATCH 01/19] V4L2Device: Correct v4l2 codec device path + +Change codec device pattern to /dev/video, and select one +correct device path /dev/videox where x is an integer. + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/v4l2_device.cc | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/media/gpu/v4l2/v4l2_device.cc b/media/gpu/v4l2/v4l2_device.cc +index 39c16611c76f3..ebbf240a3c5e7 100644 +--- a/media/gpu/v4l2/v4l2_device.cc ++++ b/media/gpu/v4l2/v4l2_device.cc +@@ -852,8 +852,8 @@ void V4L2Device::CloseDevice() { + } + + void V4L2Device::EnumerateDevicesForType(Type type) { +- static const std::string kDecoderDevicePattern = "/dev/video-dec"; +- static const std::string kEncoderDevicePattern = "/dev/video-enc"; ++ static const std::string kDecoderDevicePattern = "/dev/video"; ++ static const std::string kEncoderDevicePattern = "/dev/video"; + static const std::string kImageProcessorDevicePattern = "/dev/image-proc"; + static const std::string kJpegDecoderDevicePattern = "/dev/jpeg-dec"; + static const std::string kJpegEncoderDevicePattern = "/dev/jpeg-enc"; +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0102-V4L2VideoDecoder-Add-macro-use_linux_v4l2.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0102-V4L2VideoDecoder-Add-macro-use_linux_v4l2.patch new file mode 100644 index 000000000..0bac1743a --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0102-V4L2VideoDecoder-Add-macro-use_linux_v4l2.patch @@ -0,0 +1,213 @@ +From 6d4413788f248814f498981d97d78d92e0dc85f3 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 22:31:51 +0900 +Subject: [PATCH 02/19] V4L2VideoDecoder: Add macro use_linux_v4l2 + +Upstream-Status: Inappropriate [NXP specific] +--- + .../gpu_mjpeg_decode_accelerator_factory.cc | 3 +- + media/gpu/BUILD.gn | 1 + + media/gpu/args.gni | 4 +++ + media/gpu/v4l2/BUILD.gn | 15 ++++++---- + media/gpu/v4l2/v4l2_utils.cc | 30 ++++++++++++++++++- + media/gpu/v4l2/v4l2_video_decoder.cc | 8 +++++ + 6 files changed, 54 insertions(+), 7 deletions(-) + +diff --git a/components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.cc b/components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.cc +index 8e8ad4a84875c..156b6bd25674e 100644 +--- a/components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.cc ++++ b/components/chromeos_camera/gpu_mjpeg_decode_accelerator_factory.cc +@@ -14,7 +14,8 @@ + #include "media/base/media_switches.h" + #include "media/gpu/buildflags.h" + +-#if BUILDFLAG(USE_V4L2_CODEC) && defined(ARCH_CPU_ARM_FAMILY) ++#if BUILDFLAG(USE_V4L2_CODEC) && defined(ARCH_CPU_ARM_FAMILY) && \ ++ !BUILDFLAG(USE_LINUX_V4L2) + #define USE_V4L2_MJPEG_DECODE_ACCELERATOR + #endif + +diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn +index 727cbedee37a3..4843c717966b9 100644 +--- a/media/gpu/BUILD.gn ++++ b/media/gpu/BUILD.gn +@@ -22,6 +22,7 @@ buildflag_header("buildflags") { + "USE_VAAPI_IMAGE_CODECS=$use_vaapi_image_codecs", + "USE_V4L2_CODEC=$use_v4l2_codec", + "USE_LIBV4L2=$use_v4lplugin", ++ "USE_LINUX_V4L2=$use_linux_v4l2_only", + ] + } + +diff --git a/media/gpu/args.gni b/media/gpu/args.gni +index 37751112e34a7..49939b896e699 100644 +--- a/media/gpu/args.gni ++++ b/media/gpu/args.gni +@@ -14,6 +14,10 @@ declare_args() { + use_v4l2_codec = + is_chromeos_lacros && (target_cpu == "arm" || target_cpu == "arm64") + ++ # Indicates that only definitions available in the mainline linux kernel ++ # will be used. ++ use_linux_v4l2_only = false ++ + # Indicates if VA-API-based hardware acceleration is to be used. This + # is typically the case on x86-based ChromeOS devices. + # VA-API should also be compiled by default on x11/wayland linux devices +diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn +index bd5d25000cfcb..0aa466ba9cec5 100644 +--- a/media/gpu/v4l2/BUILD.gn ++++ b/media/gpu/v4l2/BUILD.gn +@@ -20,9 +20,6 @@ source_set("v4l2") { + "legacy/v4l2_video_decode_accelerator.h", + "legacy/v4l2_video_decoder_backend_stateful.cc", + "legacy/v4l2_video_decoder_backend_stateful.h", +- "v4l2_decode_surface.cc", +- "v4l2_decode_surface.h", +- "v4l2_decode_surface_handler.h", + "v4l2_device.cc", + "v4l2_device.h", + "v4l2_device_poller.cc", +@@ -43,6 +40,15 @@ source_set("v4l2") { + "v4l2_video_decoder.h", + "v4l2_video_decoder_backend.cc", + "v4l2_video_decoder_backend.h", ++ "v4l2_vp9_helpers.cc", ++ "v4l2_vp9_helpers.h", ++ ] ++ ++ if (!use_linux_v4l2_only) { ++ sources += [ ++ "v4l2_decode_surface.cc", ++ "v4l2_decode_surface.h", ++ "v4l2_decode_surface_handler.h", + "v4l2_video_decoder_backend_stateless.cc", + "v4l2_video_decoder_backend_stateless.h", + "v4l2_video_decoder_delegate_h264.cc", +@@ -51,9 +57,8 @@ source_set("v4l2") { + "v4l2_video_decoder_delegate_vp8.h", + "v4l2_video_decoder_delegate_vp9.cc", + "v4l2_video_decoder_delegate_vp9.h", +- "v4l2_vp9_helpers.cc", +- "v4l2_vp9_helpers.h", + ] ++ } + + if (enable_hevc_parser_and_hw_decoder) { + sources += [ +diff --git a/media/gpu/v4l2/v4l2_utils.cc b/media/gpu/v4l2/v4l2_utils.cc +index 1455996823334..bb3ffb4f4642b 100644 +--- a/media/gpu/v4l2/v4l2_utils.cc ++++ b/media/gpu/v4l2/v4l2_utils.cc +@@ -317,15 +317,23 @@ using v4l2_enum_type = decltype(V4L2_PIX_FMT_H264); + static const std::map + kV4L2CodecPixFmtToProfileCID = { + {V4L2_PIX_FMT_H264, V4L2_CID_MPEG_VIDEO_H264_PROFILE}, ++#if !BUILDFLAG(USE_LINUX_V4L2) + {V4L2_PIX_FMT_H264_SLICE, V4L2_CID_MPEG_VIDEO_H264_PROFILE}, ++#endif + #if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) + {V4L2_PIX_FMT_HEVC, V4L2_CID_MPEG_VIDEO_HEVC_PROFILE}, ++#if !BUILDFLAG(USE_LINUX_V4L2) + {V4L2_PIX_FMT_HEVC_SLICE, V4L2_CID_MPEG_VIDEO_HEVC_PROFILE}, ++#endif + #endif // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) + {V4L2_PIX_FMT_VP8, V4L2_CID_MPEG_VIDEO_VP8_PROFILE}, ++#if !BUILDFLAG(USE_LINUX_V4L2) + {V4L2_PIX_FMT_VP8_FRAME, V4L2_CID_MPEG_VIDEO_VP8_PROFILE}, ++#endif + {V4L2_PIX_FMT_VP9, V4L2_CID_MPEG_VIDEO_VP9_PROFILE}, ++#if !BUILDFLAG(USE_LINUX_V4L2) + {V4L2_PIX_FMT_VP9_FRAME, V4L2_CID_MPEG_VIDEO_VP9_PROFILE}, ++#endif + #if BUILDFLAG(IS_CHROMEOS) + {V4L2_PIX_FMT_AV1, V4L2_CID_MPEG_VIDEO_AV1_PROFILE}, + {V4L2_PIX_FMT_AV1_FRAME, V4L2_CID_MPEG_VIDEO_AV1_PROFILE}, +@@ -537,7 +545,27 @@ uint32_t VideoCodecProfileToV4L2PixFmt(VideoCodecProfile profile, + << "Unsupported profile: " << GetProfileName(profile); + + const auto& v4l2_pix_fmt = kVideoCodecProfileToV4L2CodecPixFmt.at(profile); +- return slice_based ? v4l2_pix_fmt.first : v4l2_pix_fmt.second; ++#if BUILDFLAG(USE_LINUX_V4L2) ++ if (slice_based) { ++ LOG(ERROR) << "Unsupported slice"; ++ return 0; ++ } ++ ++ if (profile >= H264PROFILE_MIN && profile <= H264PROFILE_MAX) { ++ return V4L2_PIX_FMT_H264; ++ } else if (profile >= VP8PROFILE_MIN && profile <= VP8PROFILE_MAX) { ++ return V4L2_PIX_FMT_VP8; ++ } else if (profile >= VP9PROFILE_MIN && profile <= VP9PROFILE_MAX) { ++ return V4L2_PIX_FMT_VP9; ++ } else if (profile == HEVCPROFILE_MAIN) { ++ return V4L2_PIX_FMT_HEVC; ++ } else { ++ DVLOGF(1) << "Unsupported profile: " << GetProfileName(profile); ++ return 0; ++ } ++#else ++ return slice_based ? v4l2_pix_fmt.first : v4l2_pix_fmt.second; ++#endif + } + + base::TimeDelta TimeValToTimeDelta(const struct timeval& timeval) { +diff --git a/media/gpu/v4l2/v4l2_video_decoder.cc b/media/gpu/v4l2/v4l2_video_decoder.cc +index 601f57fe0e6d0..5765761592344 100644 +--- a/media/gpu/v4l2/v4l2_video_decoder.cc ++++ b/media/gpu/v4l2/v4l2_video_decoder.cc +@@ -32,7 +32,9 @@ + #include "media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.h" + #include "media/gpu/v4l2/v4l2_status.h" + #include "media/gpu/v4l2/v4l2_utils.h" ++#if !BUILDFLAG(USE_LINUX_V4L2) + #include "media/gpu/v4l2/v4l2_video_decoder_backend_stateless.h" ++#endif + #include "mojo/public/cpp/bindings/callback_helpers.h" + + #if BUILDFLAG(IS_CHROMEOS_ASH) +@@ -68,6 +70,7 @@ constexpr size_t kInputBufferMaxSizeFor4k = 2 * kInputBufferMaxSizeFor1080p; + // Input format V4L2 fourccs this class supports. + const std::vector kSupportedInputFourccs = { + // V4L2 stateless formats ++#if !BUILDFLAG(USE_LINUX_V4L2) + V4L2_PIX_FMT_H264_SLICE, + #if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) + V4L2_PIX_FMT_HEVC_SLICE, +@@ -75,6 +78,7 @@ const std::vector kSupportedInputFourccs = { + V4L2_PIX_FMT_VP8_FRAME, + V4L2_PIX_FMT_VP9_FRAME, + V4L2_PIX_FMT_AV1_FRAME, ++#endif + // V4L2 stateful formats + V4L2_PIX_FMT_H264, + #if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) +@@ -82,7 +86,9 @@ const std::vector kSupportedInputFourccs = { + #endif // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) + V4L2_PIX_FMT_VP8, + V4L2_PIX_FMT_VP9, ++#if !BUILDFLAG(USE_LINUX_V4L2) + V4L2_PIX_FMT_AV1, ++#endif + }; + + // These values are logged to UMA. Entries should not be renumbered and numeric +@@ -471,6 +477,7 @@ V4L2Status V4L2VideoDecoder::InitializeBackend() { + << " and fourcc: " << FourccToString(input_format_fourcc_); + backend_ = std::make_unique( + this, device_, profile_, color_space_, decoder_task_runner_); ++#if !BUILDFLAG(USE_LINUX_V4L2) + } else { + DCHECK_EQ(preferred_api_and_format.first, kStateless); + VLOGF(1) << "Using a stateless API for profile: " +@@ -479,6 +486,7 @@ V4L2Status V4L2VideoDecoder::InitializeBackend() { + backend_ = std::make_unique( + this, device_, profile_, color_space_, decoder_task_runner_, + cdm_context_ref_ ? cdm_context_ref_->GetCdmContext() : nullptr); ++#endif + } + + if (!backend_->Initialize()) { +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0103-V4L2VideoDecoder-Create-single-multi-plane-queues.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0103-V4L2VideoDecoder-Create-single-multi-plane-queues.patch new file mode 100644 index 000000000..40c2912ba --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0103-V4L2VideoDecoder-Create-single-multi-plane-queues.patch @@ -0,0 +1,142 @@ +From c175fe907f93f5db9327ca1030820cdba8df137c Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 22:36:04 +0900 +Subject: [PATCH 03/19] V4L2VideoDecoder: Create single/multi plane queues + +Decide to create single-plane queue or multi-plane queue according to +the capabilities returned by VIDIOC_QUERYCAP. + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/v4l2_device.cc | 29 ++++++++++++++++++++-------- + media/gpu/v4l2/v4l2_video_decoder.cc | 27 ++++++++++++++++++-------- + 2 files changed, 40 insertions(+), 16 deletions(-) + +diff --git a/media/gpu/v4l2/v4l2_device.cc b/media/gpu/v4l2/v4l2_device.cc +index ebbf240a3c5e7..c04873fe2ae84 100644 +--- a/media/gpu/v4l2/v4l2_device.cc ++++ b/media/gpu/v4l2/v4l2_device.cc +@@ -92,6 +92,8 @@ scoped_refptr V4L2Device::GetQueue(enum v4l2_buf_type type) { + // Supported queue types. + case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: + case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: ++ case V4L2_BUF_TYPE_VIDEO_OUTPUT: ++ case V4L2_BUF_TYPE_VIDEO_CAPTURE: + break; + default: + VLOGF(1) << "Unsupported V4L2 queue type: " << type; +@@ -538,9 +540,17 @@ V4L2Device::EnumerateSupportedDecodeProfiles( + const std::vector& pixelformats) { + VideoDecodeAccelerator::SupportedProfiles profiles; + +- const auto v4l2_codecs_as_pix_fmts = ++ std::vector enumerated_pixelformats; ++ enumerated_pixelformats = + EnumerateSupportedPixFmts(base::BindRepeating(&V4L2Device::Ioctl, this), +- V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); ++ V4L2_BUF_TYPE_VIDEO_OUTPUT); ++ if (enumerated_pixelformats.empty()) { ++ VLOG(1) << "empty.... Try Multi-plane"; ++ enumerated_pixelformats = ++ EnumerateSupportedPixFmts(base::BindRepeating(&V4L2Device::Ioctl, this), ++ V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); ++ } ++ const auto v4l2_codecs_as_pix_fmts = enumerated_pixelformats; + + for (uint32_t pixelformat : v4l2_codecs_as_pix_fmts) { + if (!base::Contains(pixelformats, pixelformat)) { +@@ -859,27 +869,28 @@ void V4L2Device::EnumerateDevicesForType(Type type) { + static const std::string kJpegEncoderDevicePattern = "/dev/jpeg-enc"; + + std::string device_pattern; +- v4l2_buf_type buf_type; ++ std::vector candidate_buf_types; + switch (type) { + case Type::kDecoder: + device_pattern = kDecoderDevicePattern; +- buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; ++ candidate_buf_types.push_back(V4L2_BUF_TYPE_VIDEO_OUTPUT); ++ candidate_buf_types.push_back(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); + break; + case Type::kEncoder: + device_pattern = kEncoderDevicePattern; +- buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; ++ candidate_buf_types.push_back(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); + break; + case Type::kImageProcessor: + device_pattern = kImageProcessorDevicePattern; +- buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; ++ candidate_buf_types.push_back(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); + break; + case Type::kJpegDecoder: + device_pattern = kJpegDecoderDevicePattern; +- buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; ++ candidate_buf_types.push_back(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); + break; + case Type::kJpegEncoder: + device_pattern = kJpegEncoderDevicePattern; +- buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; ++ candidate_buf_types.push_back(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); + break; + } + +@@ -899,6 +910,7 @@ void V4L2Device::EnumerateDevicesForType(Type type) { + + Devices devices; + for (const auto& path : candidate_paths) { ++ for (const auto& buf_type : candidate_buf_types){ + if (!OpenDevicePath(path)) { + continue; + } +@@ -912,6 +924,7 @@ void V4L2Device::EnumerateDevicesForType(Type type) { + + CloseDevice(); + } ++ } + + DCHECK_EQ(devices_by_type_.count(type), 0u); + devices_by_type_[type] = devices; +diff --git a/media/gpu/v4l2/v4l2_video_decoder.cc b/media/gpu/v4l2/v4l2_video_decoder.cc +index 5765761592344..857576ae56d6a 100644 +--- a/media/gpu/v4l2/v4l2_video_decoder.cc ++++ b/media/gpu/v4l2/v4l2_video_decoder.cc +@@ -454,17 +454,28 @@ V4L2Status V4L2VideoDecoder::InitializeBackend() { + #endif // BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) + + struct v4l2_capability caps; +- const __u32 kCapsRequired = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING; +- if (device_->Ioctl(VIDIOC_QUERYCAP, &caps) || +- (caps.capabilities & kCapsRequired) != kCapsRequired) { +- VLOGF(1) << "ioctl() failed: VIDIOC_QUERYCAP, " +- << "caps check failed: 0x" << std::hex << caps.capabilities; ++ unsigned int device_caps; ++ enum v4l2_buf_type input_type, output_type; ++ if (device_->Ioctl(VIDIOC_QUERYCAP, &caps) != 0) + return V4L2Status::Codes::kFailedFileCapabilitiesCheck; +- } ++ ++ if (caps.capabilities & V4L2_CAP_DEVICE_CAPS) ++ device_caps = caps.device_caps; ++ else ++ device_caps = caps.capabilities; ++ ++ if (device_caps & (V4L2_CAP_VIDEO_OUTPUT_MPLANE | V4L2_CAP_VIDEO_M2M_MPLANE)) ++ input_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; ++ else ++ input_type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ++ if (device_caps & (V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_VIDEO_M2M_MPLANE)) ++ output_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; ++ else ++ output_type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + + // Create Input/Output V4L2Queue +- input_queue_ = device_->GetQueue(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); +- output_queue_ = device_->GetQueue(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); ++ input_queue_ = device_->GetQueue(input_type); ++ output_queue_ = device_->GetQueue(output_type); + if (!input_queue_ || !output_queue_) { + VLOGF(1) << "Failed to create V4L2 queue."; + return V4L2Status::Codes::kFailedResourceAllocation; +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0104-V4L2Buffer-Allocate-correct-v4l2-buffers-for-queues.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0104-V4L2Buffer-Allocate-correct-v4l2-buffers-for-queues.patch new file mode 100644 index 000000000..6e18e8269 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0104-V4L2Buffer-Allocate-correct-v4l2-buffers-for-queues.patch @@ -0,0 +1,97 @@ +From 1dec452c446aaa8ab37c75bf0bcae9f8ea8b3fea Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 22:39:10 +0900 +Subject: [PATCH 04/19] V4L2Buffer: Allocate correct v4l2 buffers for queues + +For single plane queue, need to fill v4l2_planes_[0] with +correct size quried from v4l2 driver. + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/v4l2_queue.cc | 39 +++++++++++++++++++++++++----------- + 1 file changed, 27 insertions(+), 12 deletions(-) + +diff --git a/media/gpu/v4l2/v4l2_queue.cc b/media/gpu/v4l2/v4l2_queue.cc +index 4851e5b5255c0..8bcf8101f3a20 100644 +--- a/media/gpu/v4l2/v4l2_queue.cc ++++ b/media/gpu/v4l2/v4l2_queue.cc +@@ -237,24 +237,28 @@ V4L2Buffer::V4L2Buffer(const IoctlAsCallback& ioctl_cb, + DCHECK(V4L2_TYPE_IS_MULTIPLANAR(type)); + DCHECK_LE(format.fmt.pix_mp.num_planes, std::size(v4l2_planes_)); + +- memset(&v4l2_buffer_, 0, sizeof(v4l2_buffer_)); +- memset(v4l2_planes_, 0, sizeof(v4l2_planes_)); +- v4l2_buffer_.m.planes = v4l2_planes_; +- // Just in case we got more planes than we want. +- v4l2_buffer_.length = +- std::min(static_cast(format.fmt.pix_mp.num_planes), +- std::size(v4l2_planes_)); ++ if (V4L2_TYPE_IS_MULTIPLANAR(type)) { ++ memset(&v4l2_buffer_, 0, sizeof(v4l2_buffer_)); ++ memset(v4l2_planes_, 0, sizeof(v4l2_planes_)); ++ v4l2_buffer_.m.planes = v4l2_planes_; ++ // Just in case we got more planes than we want. ++ v4l2_buffer_.length = ++ std::min(static_cast(format.fmt.pix_mp.num_planes), ++ std::size(v4l2_planes_)); ++ } + v4l2_buffer_.index = buffer_id; + v4l2_buffer_.type = type; + v4l2_buffer_.memory = memory; +- plane_mappings_.resize(v4l2_buffer_.length); ++ plane_mappings_.resize(V4L2_TYPE_IS_MULTIPLANAR(type) ? v4l2_buffer_.length : 1); + } + + V4L2Buffer::~V4L2Buffer() { + if (v4l2_buffer_.memory == V4L2_MEMORY_MMAP) { + for (size_t i = 0; i < plane_mappings_.size(); i++) { + if (plane_mappings_[i] != nullptr) { +- munmap(plane_mappings_[i], v4l2_buffer_.m.planes[i].length); ++ unsigned int length = V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer_.type) ? ++ v4l2_buffer_.m.planes[i].length : v4l2_buffer_.length; ++ munmap(plane_mappings_[i], length); + } + } + } +@@ -268,6 +272,13 @@ bool V4L2Buffer::Query() { + return false; + } + ++ if (!V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer_.type)) { ++ v4l2_planes_[0].bytesused = v4l2_buffer_.bytesused; ++ v4l2_planes_[0].length = v4l2_buffer_.length; ++ v4l2_planes_[0].data_offset = 0; ++ memcpy (&v4l2_planes_[0].m, &v4l2_buffer_.m, sizeof (v4l2_buffer_.m)); ++ } ++ + DCHECK(plane_mappings_.size() == v4l2_buffer_.length); + + return true; +@@ -291,9 +302,13 @@ void* V4L2Buffer::GetPlaneMapping(const size_t plane) { + return nullptr; + } + +- p = mmap_cb_.Run(nullptr, v4l2_buffer_.m.planes[plane].length, ++ unsigned int length = V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer_.type) ? ++ v4l2_buffer_.m.planes[plane].length : v4l2_planes_[plane].length; ++ unsigned int mem_offset = V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer_.type) ? ++ v4l2_buffer_.m.planes[plane].m.mem_offset : v4l2_planes_[plane].m.mem_offset; ++ p = mmap_cb_.Run(nullptr, length, + PROT_READ | PROT_WRITE, MAP_SHARED, +- v4l2_buffer_.m.planes[plane].m.mem_offset); ++ mem_offset); + if (p == MAP_FAILED) { + VPLOGF(1) << "mmap() failed: "; + return nullptr; +@@ -1177,7 +1192,7 @@ size_t V4L2Queue::AllocateBuffers(size_t count, + VQLOGF(1) << "Cannot get format."; + return 0; + } +- planes_count_ = format->fmt.pix_mp.num_planes; ++ planes_count_ = V4L2_TYPE_IS_MULTIPLANAR(format->type) ? format->fmt.pix_mp.num_planes : 1; + DCHECK_LE(planes_count_, static_cast(VIDEO_MAX_PLANES)); + + __u8 flags = incoherent ? V4L2_MEMORY_FLAG_NON_COHERENT : 0; +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0105-V4L2VideoDecoder-Create-videoframe-according-to-v4l2.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0105-V4L2VideoDecoder-Create-videoframe-according-to-v4l2.patch new file mode 100644 index 000000000..589a239d4 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0105-V4L2VideoDecoder-Create-videoframe-according-to-v4l2.patch @@ -0,0 +1,156 @@ +From 41cb3357eeace1686fa453ec3c18c01c879f58c9 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 22:43:15 +0900 +Subject: [PATCH 05/19] V4L2VideoDecoder: Create videoframe according to + v4l2buffer + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/v4l2_queue.cc | 7 ++-- + media/gpu/v4l2/v4l2_utils.cc | 63 ++++++++++++++++++++++++------------ + 2 files changed, 48 insertions(+), 22 deletions(-) + +diff --git a/media/gpu/v4l2/v4l2_queue.cc b/media/gpu/v4l2/v4l2_queue.cc +index 8bcf8101f3a20..ffa94c3d2c9f8 100644 +--- a/media/gpu/v4l2/v4l2_queue.cc ++++ b/media/gpu/v4l2/v4l2_queue.cc +@@ -334,7 +334,7 @@ scoped_refptr V4L2Buffer::CreateFrame() { + } + + std::vector dmabuf_fds = GetDmabufsForV4L2Buffer( +- ioctl_cb_, v4l2_buffer_.index, v4l2_buffer_.length, ++ ioctl_cb_, v4l2_buffer_.index, V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer_.type) ? v4l2_buffer_.length : 1, + static_cast(v4l2_buffer_.type)); + if (dmabuf_fds.empty()) { + VLOGF(1) << "Failed to get DMABUFs of V4L2 buffer"; +@@ -361,7 +361,10 @@ scoped_refptr V4L2Buffer::CreateFrame() { + dmabuf_fds.emplace_back(duped_fd); + } + +- gfx::Size size(format_.fmt.pix_mp.width, format_.fmt.pix_mp.height); ++ if (V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer_.type)) ++ gfx::Size size(format_.fmt.pix_mp.width, format_.fmt.pix_mp.height); ++ else ++ gfx::Size size(format_.fmt.pix.width, format_.fmt.pix.height); + + return NativePixmapFrameResource::Create( + *layout, gfx::Rect(size), size, std::move(dmabuf_fds), base::TimeDelta()); +diff --git a/media/gpu/v4l2/v4l2_utils.cc b/media/gpu/v4l2/v4l2_utils.cc +index bb3ffb4f4642b..06b4329764b3f 100644 +--- a/media/gpu/v4l2/v4l2_utils.cc ++++ b/media/gpu/v4l2/v4l2_utils.cc +@@ -219,13 +219,9 @@ size_t GetNumPlanesOfV4L2PixFmt(uint32_t pix_fmt) { + + std::optional V4L2FormatToVideoFrameLayout( + const struct v4l2_format& format) { +- if (!V4L2_TYPE_IS_MULTIPLANAR(format.type)) { +- VLOGF(1) << "v4l2_buf_type is not multiplanar: " << std::hex << "0x" +- << format.type; +- return std::nullopt; +- } + const v4l2_pix_format_mplane& pix_mp = format.fmt.pix_mp; +- const uint32_t& pix_fmt = pix_mp.pixelformat; ++ const v4l2_pix_format& pix = format.fmt.pix; ++ const uint32_t& pix_fmt = V4L2_TYPE_IS_MULTIPLANAR(format.type) ? pix_mp.pixelformat : pix.pixelformat; + const auto video_fourcc = Fourcc::FromV4L2PixFmt(pix_fmt); + if (!video_fourcc) { + VLOGF(1) << "Failed to convert pixel format to VideoPixelFormat: " +@@ -233,7 +229,7 @@ std::optional V4L2FormatToVideoFrameLayout( + return std::nullopt; + } + const VideoPixelFormat video_format = video_fourcc->ToVideoPixelFormat(); +- const size_t num_buffers = pix_mp.num_planes; ++ const size_t num_buffers = V4L2_TYPE_IS_MULTIPLANAR(format.type) ? format.fmt.pix_mp.num_planes : 1; + const size_t num_color_planes = VideoFrame::NumPlanes(video_format); + if (num_color_planes == 0) { + VLOGF(1) << "Unsupported video format for NumPlanes(): " +@@ -251,9 +247,17 @@ std::optional V4L2FormatToVideoFrameLayout( + std::vector planes; + planes.reserve(num_color_planes); + for (size_t i = 0; i < num_buffers; ++i) { +- const v4l2_plane_pix_format& plane_format = pix_mp.plane_fmt[i]; +- planes.emplace_back(static_cast(plane_format.bytesperline), 0u, +- plane_format.sizeimage); ++ if (V4L2_TYPE_IS_MULTIPLANAR(format.type)) { ++ if(i==0) ++ planes.emplace_back(static_cast(pix_mp.width), 0u, ++ pix_mp.width*pix_mp.height); ++ else ++ planes.emplace_back(static_cast(pix_mp.width), 0u, ++ pix_mp.width*pix_mp.height/2); ++ } else { ++ planes.emplace_back(static_cast(pix.bytesperline), 0u, ++ pix.sizeimage); ++ } + } + // For the case that #color planes > #buffers, it fills stride of color + // plane which does not map to buffer. +@@ -267,8 +271,12 @@ std::optional V4L2FormatToVideoFrameLayout( + case V4L2_PIX_FMT_NV12: + // The stride of UV is the same as Y in NV12. + // The height is half of Y plane. +- planes.emplace_back(y_stride, y_stride_abs * pix_mp.height, +- y_stride_abs * pix_mp.height / 2); ++ if (V4L2_TYPE_IS_MULTIPLANAR(format.type)) ++ planes.emplace_back(y_stride, y_stride_abs * pix_mp.height, ++ y_stride_abs * pix_mp.height / 2); ++ else ++ planes.emplace_back(y_stride, y_stride_abs * pix.height, ++ y_stride_abs * pix.height / 2); + DCHECK_EQ(2u, planes.size()); + break; + case V4L2_PIX_FMT_YUV420: +@@ -276,13 +284,18 @@ std::optional V4L2FormatToVideoFrameLayout( + // The spec claims that two Cx rows (including padding) is exactly as + // long as one Y row (including padding). So stride of Y must be even + // number. +- if (y_stride % 2 != 0 || pix_mp.height % 2 != 0) { ++ if (V4L2_TYPE_IS_MULTIPLANAR(format.type) && (y_stride % 2 != 0 || pix_mp.height % 2 != 0)) { + VLOGF(1) << "Plane-Y stride and height should be even; stride: " + << y_stride << ", height: " << pix_mp.height; + return std::nullopt; + } ++ else if (!V4L2_TYPE_IS_MULTIPLANAR(format.type) && (y_stride % 2 != 0 || pix.height % 2 != 0)){ ++ VLOGF(1) << "Plane-Y stride and height should be even; stride: " ++ << y_stride << ", height: " << pix.height; ++ return std::nullopt; ++ } + const int32_t half_stride = y_stride / 2; +- const size_t plane_0_area = y_stride_abs * pix_mp.height; ++ const size_t plane_0_area = y_stride_abs * (V4L2_TYPE_IS_MULTIPLANAR(format.type) ? pix_mp.height : pix.height); + const size_t plane_1_area = plane_0_area / 4; + planes.emplace_back(half_stride, plane_0_area, plane_1_area); + planes.emplace_back(half_stride, plane_0_area + plane_1_area, +@@ -301,13 +314,23 @@ std::optional V4L2FormatToVideoFrameLayout( + // such devices individually, so set this as a video frame layout property. + constexpr size_t buffer_alignment = 0x1000; + if (num_buffers == 1) { +- return VideoFrameLayout::CreateWithPlanes( +- video_format, gfx::Size(pix_mp.width, pix_mp.height), std::move(planes), +- buffer_alignment); ++ if (V4L2_TYPE_IS_MULTIPLANAR(format.type)) ++ return VideoFrameLayout::CreateWithPlanes( ++ video_format, gfx::Size(pix_mp.width, pix_mp.height), std::move(planes), ++ buffer_alignment); ++ else ++ return VideoFrameLayout::CreateWithPlanes( ++ video_format, gfx::Size(pix.width, pix.height), std::move(planes), ++ buffer_alignment); + } else { +- return VideoFrameLayout::CreateMultiPlanar( +- video_format, gfx::Size(pix_mp.width, pix_mp.height), std::move(planes), +- buffer_alignment); ++ if (V4L2_TYPE_IS_MULTIPLANAR(format.type)) ++ return VideoFrameLayout::CreateMultiPlanar( ++ video_format, gfx::Size(pix_mp.width, pix_mp.height), std::move(planes), ++ buffer_alignment); ++ else ++ return VideoFrameLayout::CreateMultiPlanar( ++ video_format, gfx::Size(pix.width, pix.height), std::move(planes), ++ buffer_alignment); + } + } + +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0106-V4L2VideoDecoder-Add-function-IsMultiQueue-for-S_FMT.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0106-V4L2VideoDecoder-Add-function-IsMultiQueue-for-S_FMT.patch new file mode 100644 index 000000000..5740f09e7 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0106-V4L2VideoDecoder-Add-function-IsMultiQueue-for-S_FMT.patch @@ -0,0 +1,114 @@ +From 7efe2eff075518ed1c7342ab35ea084fb8754b54 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 22:46:22 +0900 +Subject: [PATCH 06/19] V4L2VideoDecoder: Add function IsMultiQueue for S_FMT + and G_FMT + +Function IsMultiQueue() is used to set correct fotmat type for +8M and 8Q. + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/v4l2_queue.cc | 36 +++++++++++++++++++++------- + media/gpu/v4l2/v4l2_queue.h | 1 + + media/gpu/v4l2/v4l2_video_decoder.cc | 4 ++-- + 3 files changed, 31 insertions(+), 10 deletions(-) + +diff --git a/media/gpu/v4l2/v4l2_queue.cc b/media/gpu/v4l2/v4l2_queue.cc +index ffa94c3d2c9f8..5eae387499eec 100644 +--- a/media/gpu/v4l2/v4l2_queue.cc ++++ b/media/gpu/v4l2/v4l2_queue.cc +@@ -41,11 +41,18 @@ struct v4l2_format BuildV4L2Format(const enum v4l2_buf_type type, + struct v4l2_format format; + memset(&format, 0, sizeof(format)); + format.type = type; +- format.fmt.pix_mp.pixelformat = fourcc; +- format.fmt.pix_mp.width = size.width(); +- format.fmt.pix_mp.height = size.height(); +- format.fmt.pix_mp.num_planes = GetNumPlanesOfV4L2PixFmt(fourcc); +- format.fmt.pix_mp.plane_fmt[0].sizeimage = buffer_size; ++ if (V4L2_TYPE_IS_MULTIPLANAR(type)) { ++ format.fmt.pix_mp.pixelformat = fourcc; ++ format.fmt.pix_mp.width = size.width(); ++ format.fmt.pix_mp.height = size.height(); ++ format.fmt.pix_mp.num_planes = GetNumPlanesOfV4L2PixFmt(fourcc); ++ format.fmt.pix_mp.plane_fmt[0].sizeimage = buffer_size; ++ } else { ++ format.fmt.pix.pixelformat = fourcc; ++ format.fmt.pix.width = size.width(); ++ format.fmt.pix.height = size.height(); ++ format.fmt.pix.sizeimage = buffer_size; ++ } + + return format; + } +@@ -506,9 +513,13 @@ V4L2BufferRefBase::V4L2BufferRefBase(const struct v4l2_buffer& v4l2_buffer, + DCHECK(return_to_); + + memcpy(&v4l2_buffer_, &v4l2_buffer, sizeof(v4l2_buffer_)); +- memcpy(v4l2_planes_, v4l2_buffer.m.planes, +- sizeof(struct v4l2_plane) * v4l2_buffer.length); +- v4l2_buffer_.m.planes = v4l2_planes_; ++ if (V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer.type)) { ++ memcpy(v4l2_planes_, v4l2_buffer.m.planes, ++ sizeof(struct v4l2_plane) * v4l2_buffer.length); ++ v4l2_buffer_.m.planes = v4l2_planes_; ++ } else { ++ memcpy(&v4l2_planes_[0].m, &v4l2_buffer.m, sizeof(v4l2_buffer.m)); ++ } + } + + V4L2BufferRefBase::~V4L2BufferRefBase() { +@@ -1566,6 +1577,15 @@ bool V4L2Queue::Streamoff() { + return true; + } + ++bool V4L2Queue::IsMultiQueue() { ++ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); ++ ++ if (type_ == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE || type_ == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) ++ return true; ++ else ++ return false; ++} ++ + size_t V4L2Queue::AllocatedBuffersCount() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + +diff --git a/media/gpu/v4l2/v4l2_queue.h b/media/gpu/v4l2/v4l2_queue.h +index 4713ea3eebcfd..85c7920417935 100644 +--- a/media/gpu/v4l2/v4l2_queue.h ++++ b/media/gpu/v4l2/v4l2_queue.h +@@ -534,6 +534,7 @@ class MEDIA_GPU_EXPORT V4L2Queue + // still be using them. + [[nodiscard]] bool Streamoff(); + ++ [[nodiscard]] bool IsMultiQueue(); + // Returns the number of buffers currently allocated for this queue. + [[nodiscard]] size_t AllocatedBuffersCount() const; + // Returns the number of currently free buffers on this queue. +diff --git a/media/gpu/v4l2/v4l2_video_decoder.cc b/media/gpu/v4l2/v4l2_video_decoder.cc +index 857576ae56d6a..4a2591f092f42 100644 +--- a/media/gpu/v4l2/v4l2_video_decoder.cc ++++ b/media/gpu/v4l2/v4l2_video_decoder.cc +@@ -608,7 +608,7 @@ bool V4L2VideoDecoder::SetupInputFormat() { + // Check if the format is supported. + const auto v4l2_codecs_as_pix_fmts = EnumerateSupportedPixFmts( + base::BindRepeating(&V4L2Device::Ioctl, device_), +- V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); ++ input_queue_->IsMultiQueue() ? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE : V4L2_BUF_TYPE_VIDEO_OUTPUT); + if (!base::Contains(v4l2_codecs_as_pix_fmts, input_format_fourcc_)) { + DVLOGF(1) << FourccToString(input_format_fourcc_) + << " not recognised, skipping..."; +@@ -677,7 +677,7 @@ CroStatus V4L2VideoDecoder::SetupOutputFormat(const gfx::Size& size, + + const auto v4l2_pix_fmts = EnumerateSupportedPixFmts( + base::BindRepeating(&V4L2Device::Ioctl, device_), +- V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); ++ output_queue_->IsMultiQueue() ? V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE : V4L2_BUF_TYPE_VIDEO_CAPTURE); + + std::vector candidates; + for (const uint32_t& pixfmt : v4l2_pix_fmts) { +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0107-V4L2VideoDecoder-Use-correct-plane-size-and-bytesuse.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0107-V4L2VideoDecoder-Use-correct-plane-size-and-bytesuse.patch new file mode 100644 index 000000000..bd8f69df2 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0107-V4L2VideoDecoder-Use-correct-plane-size-and-bytesuse.patch @@ -0,0 +1,65 @@ +From 90edd752075e29ac990da5ac52ccd5721c15853a Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 22:48:10 +0900 +Subject: [PATCH 07/19] V4L2VideoDecoder: Use correct plane size and bytesused + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/v4l2_queue.cc | 20 ++++++++++++++++---- + 1 file changed, 16 insertions(+), 4 deletions(-) + +diff --git a/media/gpu/v4l2/v4l2_queue.cc b/media/gpu/v4l2/v4l2_queue.cc +index 5eae387499eec..afa5d91ddb4b4 100644 +--- a/media/gpu/v4l2/v4l2_queue.cc ++++ b/media/gpu/v4l2/v4l2_queue.cc +@@ -851,7 +851,10 @@ size_t V4L2WritableBufferRef::GetPlaneSize(const size_t plane) const { + return 0; + } + +- return buffer_data_->v4l2_buffer_.m.planes[plane].length; ++ if (V4L2_TYPE_IS_MULTIPLANAR(buffer_data_->v4l2_buffer_.type)) ++ return buffer_data_->v4l2_buffer_.m.planes[plane].length; ++ else ++ return buffer_data_->v4l2_buffer_.length; + } + + void V4L2WritableBufferRef::SetPlaneSize(const size_t plane, +@@ -911,7 +914,10 @@ void V4L2WritableBufferRef::SetPlaneBytesUsed(const size_t plane, + return; + } + +- buffer_data_->v4l2_buffer_.m.planes[plane].bytesused = bytes_used; ++ if (V4L2_TYPE_IS_MULTIPLANAR(buffer_data_->v4l2_buffer_.type)) ++ buffer_data_->v4l2_buffer_.m.planes[plane].bytesused = bytes_used; ++ else ++ buffer_data_->v4l2_buffer_.bytesused = bytes_used; + } + + size_t V4L2WritableBufferRef::GetPlaneBytesUsed(const size_t plane) const { +@@ -923,7 +929,10 @@ size_t V4L2WritableBufferRef::GetPlaneBytesUsed(const size_t plane) const { + return 0; + } + +- return buffer_data_->v4l2_buffer_.m.planes[plane].bytesused; ++ if (V4L2_TYPE_IS_MULTIPLANAR(buffer_data_->v4l2_buffer_.type)) ++ return buffer_data_->v4l2_buffer_.m.planes[plane].bytesused; ++ else ++ return buffer_data_->v4l2_buffer_.bytesused; + } + + void V4L2WritableBufferRef::SetPlaneDataOffset(const size_t plane, +@@ -1029,7 +1038,10 @@ size_t V4L2ReadableBuffer::GetPlaneBytesUsed(const size_t plane) const { + return 0; + } + +- return buffer_data_->v4l2_planes_[plane].bytesused; ++ if (V4L2_TYPE_IS_MULTIPLANAR(buffer_data_->v4l2_buffer_.type)) ++ return buffer_data_->v4l2_planes_[plane].bytesused; ++ else ++ return buffer_data_->v4l2_buffer_.bytesused; + } + + size_t V4L2ReadableBuffer::GetPlaneDataOffset(const size_t plane) const { +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0108-V4L2VideoDecoder-Add-hevc-format-support.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0108-V4L2VideoDecoder-Add-hevc-format-support.patch new file mode 100644 index 000000000..f5420f963 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0108-V4L2VideoDecoder-Add-hevc-format-support.patch @@ -0,0 +1,63 @@ +From d297967d980eb8fa6f67ee723a625f35cec403ee Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 22:50:43 +0900 +Subject: [PATCH 08/19] V4L2VideoDecoder: Add hevc format support + +Upstream-Status: Inappropriate [NXP specific] +--- + media/base/supported_types.cc | 2 +- + media/gpu/v4l2/v4l2_utils.cc | 4 +++- + media/media_options.gni | 2 +- + 3 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/media/base/supported_types.cc b/media/base/supported_types.cc +index de9d4be3b92e8..11ef3357e2376 100644 +--- a/media/base/supported_types.cc ++++ b/media/base/supported_types.cc +@@ -387,7 +387,7 @@ bool IsDefaultSupportedVideoType(const VideoType& type) { + case VideoCodec::kVP9: + return IsVp9ProfileSupported(type); + case VideoCodec::kHEVC: +- return IsHevcProfileSupported(type); ++ return true; + case VideoCodec::kDolbyVision: + return IsDolbyVisionProfileSupported(type); + case VideoCodec::kUnknown: +diff --git a/media/gpu/v4l2/v4l2_utils.cc b/media/gpu/v4l2/v4l2_utils.cc +index 06b4329764b3f..8fbd4cfa10561 100644 +--- a/media/gpu/v4l2/v4l2_utils.cc ++++ b/media/gpu/v4l2/v4l2_utils.cc +@@ -537,7 +537,7 @@ void GetSupportedResolution(const IoctlAsCallback& ioctl_cb, + uint32_t pixelformat, + gfx::Size* min_resolution, + gfx::Size* max_resolution) { +- constexpr gfx::Size kDefaultMaxCodedSize(1920, 1088); ++ constexpr gfx::Size kDefaultMaxCodedSize(4096, 4096); + *max_resolution = kDefaultMaxCodedSize; + constexpr gfx::Size kDefaultMinCodedSize(16, 16); + *min_resolution = kDefaultMinCodedSize; +@@ -580,6 +580,8 @@ uint32_t VideoCodecProfileToV4L2PixFmt(VideoCodecProfile profile, + return V4L2_PIX_FMT_VP8; + } else if (profile >= VP9PROFILE_MIN && profile <= VP9PROFILE_MAX) { + return V4L2_PIX_FMT_VP9; ++ } else if (profile >= HEVCPROFILE_MIN && profile <= HEVCPROFILE_MAX) { ++ return V4L2_PIX_FMT_HEVC; + } else if (profile == HEVCPROFILE_MAIN) { + return V4L2_PIX_FMT_HEVC; + } else { +diff --git a/media/media_options.gni b/media/media_options.gni +index 1924017f9e7dd..0f1be96bf308e 100644 +--- a/media/media_options.gni ++++ b/media/media_options.gni +@@ -138,7 +138,7 @@ declare_args() { + # applies to video-capable devices. + enable_platform_hevc = + proprietary_codecs && (enable_hevc_parser_and_hw_decoder || +- is_cast_media_device || is_chromeos_lacros) ++ is_cast_media_device || is_chromeos_lacros || use_v4l2_codec) + + enable_mse_mpeg2ts_stream_parser = + proprietary_codecs && +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0109-display-Add-fps-in-SkiaOutputSurfaceImplOnGpu-by-VLO.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0109-display-Add-fps-in-SkiaOutputSurfaceImplOnGpu-by-VLO.patch new file mode 100644 index 000000000..f47d8d149 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0109-display-Add-fps-in-SkiaOutputSurfaceImplOnGpu-by-VLO.patch @@ -0,0 +1,85 @@ +From ac51e4353acbe44ec8beef3f36715faa9568231c Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 11 Oct 2024 18:16:14 +0900 +Subject: [PATCH 09/19] display: Add fps in SkiaOutputSurfaceImplOnGpu by + VLOG(1) + +Upstream-Status: Inappropriate [NXP specific] +--- + .../skia_output_surface_impl_on_gpu.cc | 18 ++++++++++++++++++ + .../skia_output_surface_impl_on_gpu.h | 1 + + 2 files changed, 19 insertions(+) + +diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc +index 1ad55916b42a5..227173cd9bc76 100644 +--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc ++++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + + #include "base/debug/crash_logging.h" + #include "base/debug/dump_without_crashing.h" +@@ -138,6 +139,15 @@ + #include "components/viz/service/display_embedder/output_presenter_fuchsia.h" + #endif + ++static uint64_t start_time = 0; ++static uint64_t stop_time = 0; ++ ++uint64_t NowMicros() { ++ struct timeval tv; ++ gettimeofday(&tv, nullptr); ++ return static_cast(tv.tv_sec) * 1e6 + tv.tv_usec; ++} ++ + namespace viz { + + namespace { +@@ -341,6 +351,7 @@ SkiaOutputSurfaceImplOnGpu::SkiaOutputSurfaceImplOnGpu( + async_read_result_lock_(base::MakeRefCounted()) { + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + ++ swap_buffers_number_ = 0; + weak_ptr_ = weak_ptr_factory_.GetWeakPtr(); + buffer_presented_callback_ = CreateSafeRepeatingCallback( + weak_ptr_, std::move(buffer_presented_callback)); +@@ -595,7 +606,13 @@ void SkiaOutputSurfaceImplOnGpu::SwapBuffers(OutputSurfaceFrame frame) { + TRACE_EVENT0("viz", "SkiaOutputSurfaceImplOnGpu::SwapBuffers"); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + ++ if ( swap_buffers_number_ == 0) ++ start_time = NowMicros(); ++ ++ swap_buffers_number_++; ++ stop_time = NowMicros(); + SwapBuffersInternal(std::move(frame)); ++ VLOG(1) << "total showed " << swap_buffers_number_ << " frames, total time " << (stop_time - start_time) << " ms, fps is " << swap_buffers_number_*1e6/(stop_time - start_time) << std::endl; + } + + void SkiaOutputSurfaceImplOnGpu::SetDependenciesResolvedTimings( +@@ -1938,6 +1955,7 @@ bool SkiaOutputSurfaceImplOnGpu::Initialize() { + // allow neither to be set in the offscreen case. + DCHECK(!(gl_surface_ != nullptr && presenter_ != nullptr)); + ++ start_time = NowMicros(); + return true; + } + +diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h +index b82de4041e78a..532866bc30297 100644 +--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h ++++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h +@@ -498,6 +498,7 @@ class SkiaOutputSurfaceImplOnGpu + ScheduleGpuTaskCallback schedule_gpu_task_; + AddChildWindowToBrowserCallback add_child_window_to_browser_callback_; + SkiaOutputDevice::ReleaseOverlaysCallback release_overlays_callback_; ++ size_t swap_buffers_number_; + + // ImplOnGpu::CopyOutput can create SharedImages via ImplOnGpu's + // SharedImageFactory. Clients can use these images via CopyOutputResult and +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0110-V4L2VideoDecoder-Comment-some-unused-ioctl.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0110-V4L2VideoDecoder-Comment-some-unused-ioctl.patch new file mode 100644 index 000000000..5aea26dd9 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0110-V4L2VideoDecoder-Comment-some-unused-ioctl.patch @@ -0,0 +1,113 @@ +From 8eb371e7afe04e86469ac605afbc5b8069bd8811 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 22:57:00 +0900 +Subject: [PATCH 10/19] V4L2VideoDecoder: Comment some unused ioctl + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/v4l2_queue.cc | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +diff --git a/media/gpu/v4l2/v4l2_queue.cc b/media/gpu/v4l2/v4l2_queue.cc +index afa5d91ddb4b4..de74d0da308c3 100644 +--- a/media/gpu/v4l2/v4l2_queue.cc ++++ b/media/gpu/v4l2/v4l2_queue.cc +@@ -1101,10 +1101,12 @@ V4L2Queue::V4L2Queue(const IoctlAsCallback& ioctl_cb, + weak_this_factory_(this) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + ++#if !BUILDFLAG(USE_LINUX_V4L2) + struct v4l2_requestbuffers reqbufs = { + .count = 0, .type = type_, .memory = V4L2_MEMORY_MMAP}; + supports_requests_ = (ioctl_cb_.Run(VIDIOC_REQBUFS, &reqbufs) == kIoctlOk) && + (reqbufs.capabilities & V4L2_BUF_CAP_SUPPORTS_REQUESTS); ++#endif + + // Stateful backends for example do not support requests. + VPLOG_IF(4, supports_requests_) +@@ -1754,10 +1756,14 @@ bool V4L2Request::ApplyCtrls(struct v4l2_ext_controls* ctrls) { + return false; + } + ++#if !BUILDFLAG(USE_LINUX_V4L2) + ctrls->which = V4L2_CTRL_WHICH_REQUEST_VAL; + ctrls->request_fd = request_fd_.get(); + + return true; ++#else ++ return false; ++#endif + } + + bool V4L2Request::ApplyQueueBuffer(struct v4l2_buffer* buffer) { +@@ -1769,10 +1775,14 @@ bool V4L2Request::ApplyQueueBuffer(struct v4l2_buffer* buffer) { + return false; + } + ++#if !BUILDFLAG(USE_LINUX_V4L2) + buffer->flags |= V4L2_BUF_FLAG_REQUEST_FD; + buffer->request_fd = request_fd_.get(); + + return true; ++#else ++ return false; ++#endif + } + + bool V4L2Request::Submit() { +@@ -1783,12 +1793,16 @@ bool V4L2Request::Submit() { + return false; + } + ++#if !BUILDFLAG(USE_LINUX_V4L2) + if (HANDLE_EINTR(ioctl(request_fd_.get(), MEDIA_REQUEST_IOC_QUEUE)) != 0) { + RecordMediaIoctlUMA(MediaIoctlRequests::kMediaRequestIocQueue); + return false; + } + + return true; ++#else ++ return false; ++#endif + } + + bool V4L2Request::IsCompleted() { +@@ -1830,6 +1844,7 @@ bool V4L2Request::Reset() { + return false; + } + ++#if !BUILDFLAG(USE_LINUX_V4L2) + // Reinit the request to make sure we can use it for a new submission. + if (HANDLE_EINTR(ioctl(request_fd_.get(), MEDIA_REQUEST_IOC_REINIT)) < 0) { + RecordMediaIoctlUMA(MediaIoctlRequests::kMediaRequestIocReinit); +@@ -1838,6 +1853,9 @@ bool V4L2Request::Reset() { + } + + return true; ++#else ++ return false; ++#endif + } + + V4L2RequestRefBase::V4L2RequestRefBase(V4L2RequestRefBase&& req_base) { +@@ -1914,6 +1932,7 @@ V4L2RequestsQueue::~V4L2RequestsQueue() { + std::optional V4L2RequestsQueue::CreateRequestFD() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + ++#if !BUILDFLAG(USE_LINUX_V4L2) + int request_fd; + int ret = HANDLE_EINTR( + ioctl(media_fd_.get(), MEDIA_IOC_REQUEST_ALLOC, &request_fd)); +@@ -1924,6 +1943,9 @@ std::optional V4L2RequestsQueue::CreateRequestFD() { + } + + return base::ScopedFD(request_fd); ++#else ++ return std::nullopt; ++#endif + } + + std::optional V4L2RequestsQueue::GetFreeRequest() { +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0111-V4L2VideoDecoder-Add-V4L2_PIX_FMT_NV12M_8L128-format.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0111-V4L2VideoDecoder-Add-V4L2_PIX_FMT_NV12M_8L128-format.patch new file mode 100644 index 000000000..f98489867 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0111-V4L2VideoDecoder-Add-V4L2_PIX_FMT_NV12M_8L128-format.patch @@ -0,0 +1,81 @@ +From fe9d852a4f33d4efdcbf52e761a9c32c76970517 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 22:59:46 +0900 +Subject: [PATCH 11/19] V4L2VideoDecoder: Add V4L2_PIX_FMT_NV12M_8L128 format + for amphion + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/chromeos/fourcc.cc | 2 ++ + media/gpu/chromeos/fourcc.h | 4 ++++ + media/gpu/v4l2/v4l2_device.cc | 1 + + media/gpu/v4l2/v4l2_device.h | 6 ++++++ + 4 files changed, 13 insertions(+) + +diff --git a/media/gpu/chromeos/fourcc.cc b/media/gpu/chromeos/fourcc.cc +index 5b7444a7b6319..6236034447322 100644 +--- a/media/gpu/chromeos/fourcc.cc ++++ b/media/gpu/chromeos/fourcc.cc +@@ -24,6 +24,7 @@ std::optional Fourcc::FromUint32(uint32_t fourcc) { + case YM12: + case YM21: + case YUYV: ++ case NA12: + case NV12: + case NV21: + case NM12: +@@ -172,6 +173,7 @@ VideoPixelFormat Fourcc::ToVideoPixelFormat() const { + return PIXEL_FORMAT_YUY2; + case NV12: + case NM12: ++ case NA12: + return PIXEL_FORMAT_NV12; + case NV21: + case NM21: +diff --git a/media/gpu/chromeos/fourcc.h b/media/gpu/chromeos/fourcc.h +index 6f08dba1de919..12b71cbb8f394 100644 +--- a/media/gpu/chromeos/fourcc.h ++++ b/media/gpu/chromeos/fourcc.h +@@ -69,6 +69,10 @@ class MEDIA_GPU_EXPORT Fourcc { + // Maps to PIXEL_FORMAT_NV21, V4L2_PIX_FMT_NV21M. + NM21 = ComposeFourcc('N', 'M', '2', '1'), + ++ // Tiled YUV formats, non contiguous planes. ++ // Maps to V4L2_PIX_FMT_NV12M_8L128. ++ NA12 = ComposeFourcc('N', 'A', '1', '2'), ++ + // YUV422 single-planar format. + // https://linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/v4l/pixfmt-yuv422p.html + // Maps to PIXEL_FORMAT_I422, V4L2_PIX_FMT_YUV422P. +diff --git a/media/gpu/v4l2/v4l2_device.cc b/media/gpu/v4l2/v4l2_device.cc +index c04873fe2ae84..08a3fe203cb81 100644 +--- a/media/gpu/v4l2/v4l2_device.cc ++++ b/media/gpu/v4l2/v4l2_device.cc +@@ -42,6 +42,7 @@ uint32_t V4L2PixFmtToDrmFormat(uint32_t format) { + switch (format) { + case V4L2_PIX_FMT_NV12: + case V4L2_PIX_FMT_NV12M: ++ case V4L2_PIX_FMT_NV12M_8L128: + return DRM_FORMAT_NV12; + + case V4L2_PIX_FMT_YUV420: +diff --git a/media/gpu/v4l2/v4l2_device.h b/media/gpu/v4l2/v4l2_device.h +index 2d2800f3925f5..34e1b4d9380b2 100644 +--- a/media/gpu/v4l2/v4l2_device.h ++++ b/media/gpu/v4l2/v4l2_device.h +@@ -63,6 +63,12 @@ + v4l2_fourcc('Q', '1', '0', 'C') /* Qualcomm 10-bit compressed */ + #endif + ++/* Tiled YUV formats, non contiguous planes */ ++#ifndef V4L2_PIX_FMT_NV12M_8L128 ++#define V4L2_PIX_FMT_NV12M_8L128 \ ++ v4l2_fourcc('N', 'A', '1', '2') /* Y/CbCr 4:2:0 8x128 tiles */ ++#endif ++ + #define V4L2_PIX_FMT_INVALID v4l2_fourcc('0', '0', '0', '0') + + namespace media { +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0112-V4L2VideoDecoder-Support-tile-to-linear-transform-fo.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0112-V4L2VideoDecoder-Support-tile-to-linear-transform-fo.patch new file mode 100644 index 000000000..4d275e022 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0112-V4L2VideoDecoder-Support-tile-to-linear-transform-fo.patch @@ -0,0 +1,328 @@ +From 591913ea8a59426be9902599cec129445804c8d7 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 23:09:35 +0900 +Subject: [PATCH 12/19] V4L2VideoDecoder: Support tile to linear transform for + amphion + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/BUILD.gn | 1 + + media/gpu/v4l2/v4l2_queue.cc | 211 ++++++++++++++++++++++++++++++++++- + media/gpu/v4l2/v4l2_queue.h | 1 + + 3 files changed, 209 insertions(+), 4 deletions(-) + +diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn +index 0aa466ba9cec5..836ee0bc7504c 100644 +--- a/media/gpu/v4l2/BUILD.gn ++++ b/media/gpu/v4l2/BUILD.gn +@@ -92,6 +92,7 @@ source_set("v4l2") { + "EGL", + "GLESv2", + ] ++ libs += [ "g2d" ] + + configs += [ "//third_party/libyuv:libyuv_config" ] + +diff --git a/media/gpu/v4l2/v4l2_queue.cc b/media/gpu/v4l2/v4l2_queue.cc +index de74d0da308c3..945e7a7df9b93 100644 +--- a/media/gpu/v4l2/v4l2_queue.cc ++++ b/media/gpu/v4l2/v4l2_queue.cc +@@ -20,6 +20,11 @@ + #include "media/gpu/chromeos/platform_video_frame_utils.h" + #include "media/gpu/macros.h" + ++#include "g2d.h" ++#include "g2dExt.h" ++#include ++#include ++ + namespace media { + + namespace { +@@ -189,6 +194,11 @@ class V4L2Buffer { + size_t GetMemoryUsage() const; + const struct v4l2_buffer& v4l2_buffer() const { return v4l2_buffer_; } + const scoped_refptr& GetFrameResource(); ++ std::pair GetSavedmafd(); ++ std::pair GetSavedphys(); ++ std::pair Getg2dbufphys(); ++ std::pair Getg2dbufvirs(); ++ const struct v4l2_format& GetFmt() const {return format_;} + + private: + V4L2Buffer(const IoctlAsCallback& ioctl_cb, +@@ -203,6 +213,13 @@ class V4L2Buffer { + const IoctlAsCallback ioctl_cb_; + const MmapAsCallback mmap_cb_; + std::vector plane_mappings_; ++ int dmafd0; ++ int dmafd1; ++ unsigned long phys_0; ++ unsigned long phys_1; ++ struct g2d_buf *g2dbuf_p0; ++ struct g2d_buf *g2dbuf_p1; ++ std::vector g2dbufs_fds; + + // V4L2 data as queried by QUERYBUF. + struct v4l2_buffer v4l2_buffer_; +@@ -257,6 +274,90 @@ V4L2Buffer::V4L2Buffer(const IoctlAsCallback& ioctl_cb, + v4l2_buffer_.type = type; + v4l2_buffer_.memory = memory; + plane_mappings_.resize(V4L2_TYPE_IS_MULTIPLANAR(type) ? v4l2_buffer_.length : 1); ++ dmafd0 = dmafd1 = -1; ++ phys_0 = phys_1 = 0; ++ g2dbuf_p0 = g2dbuf_p1 = NULL; ++ ++ if (V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer_.type) && ++ format_.fmt.pix_mp.pixelformat == V4L2_PIX_FMT_NV12M_8L128) { ++ VLOGF(3) << "Map physical address"; ++ ++ std::vector dmabuf_fds = GetDmabufsForV4L2Buffer( ++ ioctl_cb_, v4l2_buffer_.index, V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer_.type) ? v4l2_buffer_.length : 1, ++ static_cast(v4l2_buffer_.type)); ++ if (dmabuf_fds.empty()) { ++ LOG(ERROR) << "Failed to get DMABUFs of V4L2 buffer"; ++ return; ++ } ++ ++ // DMA buffer fds should not be invalid ++ for (const auto& dmabuf_fd : dmabuf_fds) { ++ if (!dmabuf_fd.is_valid()) { ++ LOG(ERROR) << "Fail to get DMABUFs of V4L2 buffer - invalid fd"; ++ return; ++ } ++ if(dmafd0 == -1) ++ dmafd0 = dmabuf_fd.get(); ++ else ++ dmafd1 = dmabuf_fd.get(); ++ } ++ ++ struct dma_buf_phys{ ++ unsigned long phys; ++ }; ++ #define DMA_BUF_IOCTL_PHYS _IOW(DMA_BUF_BASE, 10, struct dma_buf_phys) ++ struct dma_buf_phys query0, query1; ++ int ret = ioctl(dmafd0, DMA_BUF_IOCTL_PHYS, &query0); ++ if(ret != 0) { ++ LOG(ERROR)<< "DMA_BUF_IOCTL_PHYS failed at dmafd" << dmafd0; ++ return; ++ } ++ else { ++ phys_0 = query0.phys; ++ } ++ ++ ret = ioctl(dmafd1, DMA_BUF_IOCTL_PHYS, &query1); ++ if(ret != 0) { ++ LOG(ERROR)<< "DMA_BUF_IOCTL_PHYS failed at dmafd" << dmafd1; ++ return; ++ } ++ else { ++ phys_1 = query1.phys; ++ } ++ ++ if (g2d_alloc) { ++ g2dbuf_p0 = g2d_alloc(format_.fmt.pix_mp.width * format_.fmt.pix_mp.height, 0); ++ g2dbuf_p1 = g2d_alloc(format_.fmt.pix_mp.width * format_.fmt.pix_mp.height / 2, 0); ++ } ++ if((!g2dbuf_p0) || (!g2dbuf_p1)){ ++ LOG(ERROR)<<"g2d buf alloc failed"; ++ return; ++ } ++ ++ int tmpfd = -1; ++ if (g2d_buf_export_fd) ++ tmpfd = g2d_buf_export_fd(g2dbuf_p0); ++ tmpfd = dup(tmpfd); ++ if(tmpfd > 0) ++ g2dbufs_fds.push_back(base::ScopedFD(tmpfd)); ++ else if(tmpfd == -1) ++ { ++ LOG(ERROR) << "Failed duplicating g2d fd"; ++ return; ++ } ++ ++ if (g2d_buf_export_fd) ++ tmpfd = g2d_buf_export_fd(g2dbuf_p1); ++ tmpfd = dup(tmpfd); ++ if(tmpfd>0) ++ g2dbufs_fds.push_back(base::ScopedFD(tmpfd)); ++ else if(tmpfd == -1) ++ { ++ LOG(ERROR) << "Failed duplicating g2d fd"; ++ return; ++ } ++ ++ } + } + + V4L2Buffer::~V4L2Buffer() { +@@ -269,6 +370,32 @@ V4L2Buffer::~V4L2Buffer() { + } + } + } ++ if(g2d_free && g2dbuf_p0 && g2dbuf_p1) { ++ g2d_free(g2dbuf_p0); ++ g2d_free(g2dbuf_p1); ++ } ++} ++ ++std::pair V4L2Buffer::GetSavedmafd() { ++ return std::make_pair(dmafd0, dmafd1); ++} ++ ++std::pair V4L2Buffer::GetSavedphys() { ++ return std::make_pair(phys_0, phys_1); ++} ++ ++std::pair V4L2Buffer::Getg2dbufphys() { ++ if(g2dbuf_p0 && g2dbuf_p1) ++ return std::make_pair(g2dbuf_p0->buf_paddr, g2dbuf_p1->buf_paddr); ++ else ++ return std::make_pair(-1, -1); ++} ++ ++std::pair V4L2Buffer::Getg2dbufvirs() { ++ if(g2dbuf_p0 && g2dbuf_p1) ++ return std::make_pair(g2dbuf_p0->buf_vaddr, g2dbuf_p1->buf_vaddr); ++ else ++ return std::make_pair(nullptr, nullptr); + } + + bool V4L2Buffer::Query() { +@@ -368,13 +495,18 @@ scoped_refptr V4L2Buffer::CreateFrame() { + dmabuf_fds.emplace_back(duped_fd); + } + +- if (V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer_.type)) ++ if (V4L2_TYPE_IS_MULTIPLANAR(v4l2_buffer_.type) && ++ format_.fmt.pix_mp.pixelformat == V4L2_PIX_FMT_NV12M_8L128) { + gfx::Size size(format_.fmt.pix_mp.width, format_.fmt.pix_mp.height); +- else ++ return NativePixmapFrameResource::Create( ++ *layout, gfx::Rect(size), size, std::move(g2dbufs_fds), base::TimeDelta()); ++ } ++ else { + gfx::Size size(format_.fmt.pix.width, format_.fmt.pix.height); + +- return NativePixmapFrameResource::Create( +- *layout, gfx::Rect(size), size, std::move(dmabuf_fds), base::TimeDelta()); ++ return NativePixmapFrameResource::Create( ++ *layout, gfx::Rect(size), size, std::move(dmabuf_fds), base::TimeDelta()); ++ } + } + + const scoped_refptr& V4L2Buffer::GetFrameResource() { +@@ -1112,6 +1244,10 @@ V4L2Queue::V4L2Queue(const IoctlAsCallback& ioctl_cb, + VPLOG_IF(4, supports_requests_) + << "This queue does " << (supports_requests_ ? "" : "not") + << " support requests."; ++ ++ g2d_handle = NULL; ++ if(g2d_open && g2d_open(&g2d_handle)) ++ VLOGF(1) << "g2d_open fail"; + } + + V4L2Queue::~V4L2Queue() { +@@ -1127,6 +1263,9 @@ V4L2Queue::~V4L2Queue() { + VQLOGF(1) << "Failed to deallocate queue buffers"; + } + ++ if(g2d_close && g2d_handle) ++ g2d_close(g2d_handle); ++ + std::move(destroy_cb_).Run(); + } + +@@ -1170,6 +1309,8 @@ std::pair, int> V4L2Queue::GetFormat() { + VPQLOGF(2) << "Failed to get format"; + return std::make_pair(std::nullopt, errno); + } ++ if (type_ == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) ++ format.fmt.pix_mp.width = format.fmt.pix_mp.plane_fmt[0].bytesperline; + + return std::make_pair(format, 0); + } +@@ -1529,6 +1670,68 @@ std::pair V4L2Queue::DequeueBuffer() { + } + + DCHECK(free_buffers_); ++ ++ if(type_ == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE && ++ buffers_[v4l2_buffer.index]->GetFmt().fmt.pix_mp.pixelformat == V4L2_PIX_FMT_NV12M_8L128) ++ { ++ std::pair v4l_phys = buffers_[v4l2_buffer.index]->GetSavedphys(); ++ int width = buffers_[v4l2_buffer.index]->GetFmt().fmt.pix_mp.width; ++ int height = buffers_[v4l2_buffer.index]->GetFmt().fmt.pix_mp.height; ++ int stride = buffers_[v4l2_buffer.index]->GetFmt().fmt.pix_mp.plane_fmt[0].bytesperline; ++ bool interlaced = false; ++ switch (buffers_[v4l2_buffer.index]->GetFmt().fmt.pix_mp.field) { ++ case V4L2_FIELD_INTERLACED: ++ case V4L2_FIELD_INTERLACED_TB: ++ case V4L2_FIELD_INTERLACED_BT: ++ case V4L2_FIELD_SEQ_TB: ++ interlaced = true; ++ break; ++ default: ++ break; ++ }; ++ struct g2d_surfaceEx srcEx, dstEx; ++ struct g2d_surface *src = &srcEx.base; ++ struct g2d_surface *dst = &dstEx.base; ++ ++ dst->format = G2D_NV12; ++ dst->planes[0] = buffers_[v4l2_buffer.index]->Getg2dbufphys().first; ++ dst->planes[1] = buffers_[v4l2_buffer.index]->Getg2dbufphys().second; ++ dstEx.tiling = G2D_LINEAR; ++ dst->left = 0; ++ dst->top = 0; ++ dst->right = dst->left + width; ++ dst->bottom = dst->top + height; ++ dst->stride= width; ++ dst->width = width; ++ dst->height = height; ++ dst->rot = G2D_ROTATION_0; ++ dst->global_alpha = 0xff; ++ dst->blendfunc = G2D_ONE_MINUS_SRC_ALPHA; ++ dst->clrcolor = 0; ++ ++ src->format = G2D_NV12; ++ src->planes[0] = v4l_phys.first; ++ src->planes[1] = v4l_phys.second; ++ srcEx.tiling = G2D_AMPHION_TILED; ++ if (interlaced) { ++ srcEx.tiling = static_cast(0x18); //G2D_AMPHION_TILED | G2D_AMPHION_INTERLACED; ++ DVLOGF(4)<<"interlaced video convert"; ++ } ++ src->left = 0; ++ src->top = 0; ++ src->right = src->left + width; ++ src->bottom = src->top + height; ++ src->stride= stride; ++ src->width = width; ++ src->height = height; ++ src->rot = G2D_ROTATION_0; ++ src->global_alpha = 0xff; ++ src->blendfunc = G2D_ONE; ++ ++ if (g2d_blitEx) ++ g2d_blitEx(g2d_handle, &srcEx, &dstEx); ++ } ++ + return std::make_pair(true, V4L2BufferRefFactory::CreateReadableRef( + v4l2_buffer, weak_this_factory_.GetWeakPtr(), + std::move(queued_frame))); +diff --git a/media/gpu/v4l2/v4l2_queue.h b/media/gpu/v4l2/v4l2_queue.h +index 85c7920417935..1cc22fff58277 100644 +--- a/media/gpu/v4l2/v4l2_queue.h ++++ b/media/gpu/v4l2/v4l2_queue.h +@@ -584,6 +584,7 @@ class MEDIA_GPU_EXPORT V4L2Queue + std::optional current_format_; + + std::vector> buffers_; ++ void* g2d_handle; + + // Buffers that are available for client to get and submit. + // Buffers in this list are not referenced by anyone else than ourselves. +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0113-V4L2VideoDecoder-Use-dlopen-to-dynamically-use-g2d-a.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0113-V4L2VideoDecoder-Use-dlopen-to-dynamically-use-g2d-a.patch new file mode 100644 index 000000000..dde3cfe12 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0113-V4L2VideoDecoder-Use-dlopen-to-dynamically-use-g2d-a.patch @@ -0,0 +1,236 @@ +From 44d6b2c7ec8fc21cb3151688008384bf5fad39dc Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 23:13:36 +0900 +Subject: [PATCH 13/19] V4L2VideoDecoder: Use dlopen to dynamically use g2d api + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/BUILD.gn | 1 - + media/gpu/v4l2/v4l2_queue.cc | 183 ++++++++++++++++++++++++++++++++++- + 2 files changed, 181 insertions(+), 3 deletions(-) + +diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn +index 836ee0bc7504c..0aa466ba9cec5 100644 +--- a/media/gpu/v4l2/BUILD.gn ++++ b/media/gpu/v4l2/BUILD.gn +@@ -92,7 +92,6 @@ source_set("v4l2") { + "EGL", + "GLESv2", + ] +- libs += [ "g2d" ] + + configs += [ "//third_party/libyuv:libyuv_config" ] + +diff --git a/media/gpu/v4l2/v4l2_queue.cc b/media/gpu/v4l2/v4l2_queue.cc +index 945e7a7df9b93..9fc55cfd59459 100644 +--- a/media/gpu/v4l2/v4l2_queue.cc ++++ b/media/gpu/v4l2/v4l2_queue.cc +@@ -20,10 +20,11 @@ + #include "media/gpu/chromeos/platform_video_frame_utils.h" + #include "media/gpu/macros.h" + +-#include "g2d.h" +-#include "g2dExt.h" ++// #include "g2d.h" ++// #include "g2dExt.h" + #include + #include ++#include + + namespace media { + +@@ -160,6 +161,159 @@ std::vector GetDmabufsForV4L2Buffer( + + } // namespace + ++/* g2d.h g2dExt.h */ ++enum g2d_format ++{ ++//rgb formats ++ G2D_RGB565 = 0, /* [0:4] Blue; [5:10] Green; [11:15] Red */ ++ G2D_RGBA8888 = 1, /* [0:7] Red; [8:15] Green; [16:23] Blue; [23:31] Alpha */ ++ G2D_RGBX8888 = 2, /* [0:7] Red; [8:15] Green; [16:23] Blue; [23:31] don't care */ ++ G2D_BGRA8888 = 3, /* [0:7] Blue; [8:15] Green; [16:23] Red; [23:31] Alpha */ ++ G2D_BGRX8888 = 4, /* [0:7] Blue; [8:15] Green; [16:23] Red; [23:31] don't care */ ++ G2D_BGR565 = 5, /* [0:4] Red; [5:10] Green; [11:15] Blue */ ++ ++ G2D_ARGB8888 = 6, /* [0:7] Alpha; [8:15] Red; [16:23] Green; [23:31] Blue */ ++ G2D_ABGR8888 = 7, /* [0:7] Alpha; [8:15] Blue; [16:23] Green; [23:31] Red */ ++ G2D_XRGB8888 = 8, /* [0:7] don't care; [8:15] Red; [16:23] Green; [23:31] Blue */ ++ G2D_XBGR8888 = 9, /* [0:7] don't care; [8:15] Blue; [16:23] Green; [23:31] Red */ ++ G2D_RGB888 = 10, /* [0:7] Red; [8:15] Green; [16:23] Blue */ ++ G2D_BGR888 = 11, /* [0:7] Blue; [8:15] Green; [16:23] Red */ ++ ++ G2D_RGBA5551 = 12, /* [0:4] Red; [5:9] Green; [10:14] Blue; [15] Alpha */ ++ G2D_RGBX5551 = 13, /* [0:4] Red; [5:9] Green; [10:14] Blue; [15] don't care */ ++ G2D_BGRA5551 = 14, /* [0:4] Blue; [5:9] Green; [10:14] Red; [15] Alpha */ ++ G2D_BGRX5551 = 15, /* [0:4] Blue; [5:9] Green; [10:14] Red; [15] don't care */ ++ ++//yuv formats ++ G2D_NV12 = 20, /* 2 plane 420 format; plane 1: [0:7] Y ; plane 2: [0:7] U; [8:15] V */ ++ G2D_I420 = 21, /* 3 plane 420 format; plane 1: [0:7] Y ; plane 2: [0:7] U; plane 3: [0:7] V */ ++ G2D_YV12 = 22, /* 3 plane 420 format; plane 1: [0:7] Y ; plane 2: [0:7] V; plane 3: [0:7] U */ ++ G2D_NV21 = 23, /* 2 plane 420 format; plane 1: [0:7] Y ; plane 2: [0:7] V; [8:15] U */ ++ G2D_YUYV = 24, /* 1 plane 422 format; [0:7] Y; [8:15; U; [16:23] Y; [24:31] V */ ++ G2D_YVYU = 25, /* 1 plane 422 format; [0:7] Y; [8:15; V; [16:23] Y; [24:31] U */ ++ G2D_UYVY = 26, /* 1 plane 422 format; [0:7] U; [8:15; Y; [16:23] V; [24:31] Y */ ++ G2D_VYUY = 27, /* 1 plane 422 format; [0:7] V; [8:15; Y; [16:23] U; [24:31] Y */ ++ G2D_NV16 = 28, /* 2 plane 422 format; plane 1: [0:7] Y ; plane 2: [0:7] U; [8:15] V */ ++ G2D_NV61 = 29, /* 2 plane 422 format; plane 1: [0:7] Y ; plane 2: [0:7] V; [8:15] U */ ++}; ++ ++enum g2d_tiling ++{ ++ G2D_LINEAR = 0x1, ++ G2D_TILED = 0x2, ++ G2D_SUPERTILED = 0x4, ++ G2D_AMPHION_TILED = 0x8, ++ G2D_AMPHION_INTERLACED = 0x10, ++ G2D_TILED_STATUS = 0x20, ++ G2D_AMPHION_TILED_10BIT = 0x40, ++}; ++ ++struct g2d_tile_status ++{ ++ unsigned int ts_addr; ++ ++ unsigned int fc_enabled; ++ unsigned int fc_value; ++ unsigned int fc_value_upper; ++}; ++ ++struct g2d_buf ++{ ++ void *buf_handle; ++ void *buf_vaddr; ++ int buf_paddr; ++ int buf_size; ++}; ++ ++enum g2d_blend_func ++{ ++//basic blend ++ G2D_ZERO = 0, ++ G2D_ONE = 1, ++ G2D_SRC_ALPHA = 2, ++ G2D_ONE_MINUS_SRC_ALPHA = 3, ++ G2D_DST_ALPHA = 4, ++ G2D_ONE_MINUS_DST_ALPHA = 5, ++ ++// extensive blend is set with basic blend together, ++// such as, G2D_ONE | G2D_PRE_MULTIPLIED_ALPHA ++ G2D_PRE_MULTIPLIED_ALPHA = 0x10, ++ G2D_DEMULTIPLY_OUT_ALPHA = 0x20, ++}; ++ ++enum g2d_rotation ++{ ++ G2D_ROTATION_0 = 0, ++ G2D_ROTATION_90 = 1, ++ G2D_ROTATION_180 = 2, ++ G2D_ROTATION_270 = 3, ++ G2D_FLIP_H = 4, ++ G2D_FLIP_V = 5, ++}; ++ ++struct g2d_surface ++{ ++ enum g2d_format format; ++ ++ int planes[3];//surface buffer addresses are set in physical planes separately ++ //RGB: planes[0] - RGB565/RGBA8888/RGBX8888/BGRA8888/BRGX8888 ++ //NV12: planes[0] - Y, planes[1] - packed UV ++ //I420: planes[0] - Y, planes[1] - U, planes[2] - V ++ //YV12: planes[0] - Y, planes[1] - V, planes[2] - U ++ //NV21: planes[0] - Y, planes[1] - packed VU ++ //YUYV: planes[0] - packed YUYV ++ //YVYU: planes[0] - packed YVYU ++ //UYVY: planes[0] - packed UYVY ++ //VYUY: planes[0] - packed VYUY ++ //NV16: planes[0] - Y, planes[1] - packed UV ++ //NV61: planes[0] - Y, planes[1] - packed VU ++ ++ //blit rectangle in surface ++ int left; ++ int top; ++ int right; ++ int bottom; ++ int stride; ///< buffer stride, in Pixels ++ int width; ///< surface width, in Pixels ++ int height; ///< surface height, in Pixels ++ enum g2d_blend_func blendfunc; ///< alpha blending parameters ++ int global_alpha; ///< value is 0 ~ 255 ++ //clrcolor format is RGBA8888, used as dst for clear, as src for blend dim ++ int clrcolor; ++ ++ //rotation degree ++ enum g2d_rotation rot; ++}; ++ ++struct g2d_surfaceEx ++{ ++ struct g2d_surface base; ++ enum g2d_tiling tiling; ++ ++ struct g2d_tile_status ts; ++ int reserved[8]; ++}; ++ ++void *dl_handle = NULL; ++ ++typedef int (*g2d_api_open)(void **handle); ++typedef int (*g2d_api_close)(void *handle); ++typedef int (*g2d_api_free)(struct g2d_buf *buf); ++typedef struct g2d_buf* (*g2d_api_alloc)(int size, int cacheable); ++typedef int (*g2d_api_buf_export_fd)(struct g2d_buf *); ++typedef int (*g2d_api_blitEx)(void *handle, struct g2d_surfaceEx *srcEx, struct g2d_surfaceEx *dstEx); ++ ++#define G2D_LIB_NAME "/usr/lib/libg2d.so.2" ++#define G2D_API_SYM(name) g2d_api_##name g2d_##name = nullptr ++G2D_API_SYM(open); ++G2D_API_SYM(close); ++G2D_API_SYM(free); ++G2D_API_SYM(alloc); ++G2D_API_SYM(buf_export_fd); ++G2D_API_SYM(blitEx); ++#undef G2D_API_SYM ++/* g2d.h g2dExt.h */ ++ + V4L2ExtCtrl::V4L2ExtCtrl(uint32_t id) { + memset(&ctrl, 0, sizeof(ctrl)); + ctrl.id = id; +@@ -1245,6 +1399,31 @@ V4L2Queue::V4L2Queue(const IoctlAsCallback& ioctl_cb, + << "This queue does " << (supports_requests_ ? "" : "not") + << " support requests."; + ++ if (dl_handle == NULL) { ++ dl_handle = dlopen(G2D_LIB_NAME, ++ RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE | RTLD_LAZY); ++ if (!dl_handle) { ++ VLOGF(1) << "Failed to dlopen " << G2D_LIB_NAME; ++ return; ++ } ++ ++#define G2D_API_DLSYM(lib, name) \ ++ do { \ ++ g2d_##name = reinterpret_cast(dlsym(lib, "g2d_" #name)); \ ++ if (!(g2d_##name)) \ ++ VLOGF(1) << "Failed to dlsym g2d_" #name; \ ++ } while (0) ++ ++ G2D_API_DLSYM(dl_handle, open); ++ G2D_API_DLSYM(dl_handle, close); ++ G2D_API_DLSYM(dl_handle, free); ++ G2D_API_DLSYM(dl_handle, alloc); ++ G2D_API_DLSYM(dl_handle, buf_export_fd); ++ G2D_API_DLSYM(dl_handle, blitEx); ++ ++ dlclose(dl_handle); ++ } ++ + g2d_handle = NULL; + if(g2d_open && g2d_open(&g2d_handle)) + VLOGF(1) << "g2d_open fail"; +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0114-V4L2VideoDecoderBackend-Create-queue-according-to-qu.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0114-V4L2VideoDecoderBackend-Create-queue-according-to-qu.patch new file mode 100644 index 000000000..ffe8221fd --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0114-V4L2VideoDecoderBackend-Create-queue-according-to-qu.patch @@ -0,0 +1,51 @@ +From c8b82b832fc6c34ff27f73739c60472c15ca7380 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 23:15:59 +0900 +Subject: [PATCH 14/19] V4L2VideoDecoderBackend: Create queue according to + queried caps capabilities + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/v4l2_video_decoder_backend.cc | 26 ++++++++++++++++++-- + 1 file changed, 24 insertions(+), 2 deletions(-) + +diff --git a/media/gpu/v4l2/v4l2_video_decoder_backend.cc b/media/gpu/v4l2/v4l2_video_decoder_backend.cc +index ff08c18100e0c..0e5747a5a83e7 100644 +--- a/media/gpu/v4l2/v4l2_video_decoder_backend.cc ++++ b/media/gpu/v4l2/v4l2_video_decoder_backend.cc +@@ -14,8 +14,30 @@ V4L2VideoDecoderBackend::V4L2VideoDecoderBackend( + Client* const client, + scoped_refptr device) + : client_(client), device_(std::move(device)) { +- input_queue_ = device_->GetQueue(V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE); +- output_queue_ = device_->GetQueue(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); ++ struct v4l2_capability caps; ++ unsigned int device_caps; ++ enum v4l2_buf_type input_type, output_type; ++ if (device_->Ioctl(VIDIOC_QUERYCAP, &caps) != 0) { ++ LOG(ERROR) << "QUERYCAP failed"; ++ } ++ ++ if (caps.capabilities & V4L2_CAP_DEVICE_CAPS) ++ device_caps = caps.device_caps; ++ else ++ device_caps = caps.capabilities; ++ ++ if (device_caps & (V4L2_CAP_VIDEO_OUTPUT_MPLANE | V4L2_CAP_VIDEO_M2M_MPLANE)) ++ input_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; ++ else ++ input_type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ++ if (device_caps & (V4L2_CAP_VIDEO_CAPTURE_MPLANE | V4L2_CAP_VIDEO_M2M_MPLANE)) ++ output_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; ++ else ++ output_type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ++ ++ input_queue_ = device_->GetQueue(input_type); ++ output_queue_ = device_->GetQueue(output_type); ++ + if (!input_queue_ || !output_queue_) { + VLOGF(1) << "Failed to get V4L2 queue. This should not happen since the " + << "queues are supposed to be initialized when we are called."; +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0115-V4L2VideoDecoder-support-gpu-import-NV12-format.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0115-V4L2VideoDecoder-support-gpu-import-NV12-format.patch new file mode 100644 index 000000000..7d925e2bc --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0115-V4L2VideoDecoder-support-gpu-import-NV12-format.patch @@ -0,0 +1,52 @@ +From f68295ed3d0a313948d8693e169933e3450156fb Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 23:19:48 +0900 +Subject: [PATCH 15/19] V4L2VideoDecoder: support gpu import NV12 format + +Upstream-Status: Inappropriate [NXP specific] +--- + media/mojo/services/gpu_mojo_media_client_linux.cc | 6 ++++++ + ui/gfx/linux/gbm_wrapper.cc | 3 ++- + 2 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/media/mojo/services/gpu_mojo_media_client_linux.cc b/media/mojo/services/gpu_mojo_media_client_linux.cc +index 6c8dcffca0505..f0be46c786975 100644 +--- a/media/mojo/services/gpu_mojo_media_client_linux.cc ++++ b/media/mojo/services/gpu_mojo_media_client_linux.cc +@@ -58,6 +58,12 @@ std::vector GetPreferredRenderableFourccs( + } + #endif // BUILDFLAG(ENABLE_VULKAN) + ++ // HACK: Support for zero-copy NV12 textures preferentially. ++ if (gpu_preferences.gr_context_type == gpu::GrContextType::kGL) { ++ renderable_fourccs.emplace_back(Fourcc::NV12); ++ renderable_fourccs.emplace_back(Fourcc::NA12); ++ } ++ + // Support 1-copy argb textures. + renderable_fourccs.emplace_back(Fourcc::AR24); + +diff --git a/ui/gfx/linux/gbm_wrapper.cc b/ui/gfx/linux/gbm_wrapper.cc +index 7a1ae26444f36..b5a1f5776b90a 100644 +--- a/ui/gfx/linux/gbm_wrapper.cc ++++ b/ui/gfx/linux/gbm_wrapper.cc +@@ -32,6 +32,7 @@ + #include + #include + #include ++#include + + #include "base/strings/stringize_macros.h" + #endif +@@ -414,7 +415,7 @@ class Device final : public ui::GbmDevice { + fd_data.height = size.height(); + fd_data.format = format; + fd_data.num_fds = handle.planes.size(); +- fd_data.modifier = handle.modifier; ++ fd_data.modifier = DRM_FORMAT_MOD_LINEAR; + + // One specific situation where we expect 4 planes is for Intel media + // compressed buffers: the number of planes for such buffers and format +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0116-VideoDecoderPipeline-Add-resolution-change-support.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0116-VideoDecoderPipeline-Add-resolution-change-support.patch new file mode 100644 index 000000000..edf0c4616 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0116-VideoDecoderPipeline-Add-resolution-change-support.patch @@ -0,0 +1,55 @@ +From ce372a56ed44ddd6cda68080e9594e6d02d2279a Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 23:21:51 +0900 +Subject: [PATCH 16/19] VideoDecoderPipeline: Add resolution change support + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/chromeos/video_decoder_pipeline.cc | 31 ++++++++++---------- + 1 file changed, 16 insertions(+), 15 deletions(-) + +diff --git a/media/gpu/chromeos/video_decoder_pipeline.cc b/media/gpu/chromeos/video_decoder_pipeline.cc +index a92b0a297e22d..7cf16cc9faa77 100644 +--- a/media/gpu/chromeos/video_decoder_pipeline.cc ++++ b/media/gpu/chromeos/video_decoder_pipeline.cc +@@ -647,21 +647,22 @@ void VideoDecoderPipeline::InitializeTask(const VideoDecoderConfig& config, + &OOPVideoDecoder::GetOriginalFrame, + base::Unretained(static_cast(decoder_.get()))); + } else { +- CHECK(main_frame_pool_); +- PlatformVideoFramePool* platform_video_frame_pool = +- main_frame_pool_->AsPlatformVideoFramePool(); +- // The only |frame_converter_| that needs the GetOriginalFrameCB callback +- // is the MailboxVideoFrameConverter. When it is used, the +- // |main_frame_pool_| should always be a PlatformVideoFramePool. +- CHECK(platform_video_frame_pool); +- +- // Note: base::Unretained() is safe because either a) the +- // |main_frame_pool_| outlives |frame_converter_| or b) we call +- // |frame_converter_|->set_get_original_frame_cb() with a null +- // GetOriginalFrameCB before destroying |main_frame_pool_|. +- get_original_frame_cb = +- base::BindRepeating(&PlatformVideoFramePool::GetOriginalFrame, +- base::Unretained(platform_video_frame_pool)); ++ if (main_frame_pool_) { ++ PlatformVideoFramePool* platform_video_frame_pool = ++ main_frame_pool_->AsPlatformVideoFramePool(); ++ // The only |frame_converter_| that needs the GetOriginalFrameCB callback ++ // is the MailboxVideoFrameConverter. When it is used, the ++ // |main_frame_pool_| should always be a PlatformVideoFramePool. ++ CHECK(platform_video_frame_pool); ++ ++ // Note: base::Unretained() is safe because either a) the ++ // |main_frame_pool_| outlives |frame_converter_| or b) we call ++ // |frame_converter_|->set_get_original_frame_cb() with a null ++ // GetOriginalFrameCB before destroying |main_frame_pool_|. ++ get_original_frame_cb = ++ base::BindRepeating(&PlatformVideoFramePool::GetOriginalFrame, ++ base::Unretained(platform_video_frame_pool)); ++ } + } + + frame_converter_->set_get_original_frame_cb( +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0117-V4L2StatefulVideoDecoderBackend-Enlarge-input-buffer.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0117-V4L2StatefulVideoDecoderBackend-Enlarge-input-buffer.patch new file mode 100644 index 000000000..04fa62ecc --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0117-V4L2StatefulVideoDecoderBackend-Enlarge-input-buffer.patch @@ -0,0 +1,27 @@ +From 074a419931f1691e312cde9da3beeb454d31ee36 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 23:22:56 +0900 +Subject: [PATCH 17/19] V4L2StatefulVideoDecoderBackend: Enlarge input buffer + number to 16 + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.cc b/media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.cc +index 8929feb42d89c..7d35c58d4cae8 100644 +--- a/media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.cc ++++ b/media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.cc +@@ -778,7 +778,7 @@ bool V4L2StatefulVideoDecoderBackend::StopInputQueueOnResChange() const { + size_t V4L2StatefulVideoDecoderBackend::GetNumOUTPUTQueueBuffers( + bool secure_mode) const { + CHECK(!secure_mode); +- constexpr size_t kNumInputBuffers = 8; ++ constexpr size_t kNumInputBuffers = 16; + return kNumInputBuffers; + } + +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0118-V4L2VideoDecoder-Fix-amphion-report-size-mismatch.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0118-V4L2VideoDecoder-Fix-amphion-report-size-mismatch.patch new file mode 100644 index 000000000..7f2169d81 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0118-V4L2VideoDecoder-Fix-amphion-report-size-mismatch.patch @@ -0,0 +1,27 @@ +From 4ca9aa503552e9b052b85512e3d1fe24998de195 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Fri, 13 Sep 2024 23:23:56 +0900 +Subject: [PATCH 18/19] V4L2VideoDecoder: Fix amphion report size mismatch + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/v4l2_video_decoder.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/media/gpu/v4l2/v4l2_video_decoder.cc b/media/gpu/v4l2/v4l2_video_decoder.cc +index 4a2591f092f42..4c33ed4fea41f 100644 +--- a/media/gpu/v4l2/v4l2_video_decoder.cc ++++ b/media/gpu/v4l2/v4l2_video_decoder.cc +@@ -736,7 +736,8 @@ CroStatus V4L2VideoDecoder::SetupOutputFormat(const gfx::Size& size, + output_queue_->SetFormat(fourcc.ToV4L2PixFmt(), picked_size, 0); + DCHECK(format); + gfx::Size adjusted_size(format->fmt.pix_mp.width, format->fmt.pix_mp.height); +- if (!gfx::Rect(adjusted_size).Contains(gfx::Rect(picked_size))) { ++ if (fourcc != std::optional(Fourcc(Fourcc::NA12)) && ++ !gfx::Rect(adjusted_size).Contains(gfx::Rect(picked_size))) { + VLOGF(1) << "The adjusted coded size (" << adjusted_size.ToString() + << ") should contains the original coded size(" + << picked_size.ToString() << ")."; +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0119-VideoDecoderPipeline-Get-V4L2VideoDecoder-supported-.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0119-VideoDecoderPipeline-Get-V4L2VideoDecoder-supported-.patch new file mode 100644 index 000000000..7de5732eb --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0119-VideoDecoderPipeline-Get-V4L2VideoDecoder-supported-.patch @@ -0,0 +1,27 @@ +From 5bfdec4c48af188f30534914fbd9c3aa9d140503 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Thu, 19 Sep 2024 15:12:47 +0900 +Subject: [PATCH 19/19] VideoDecoderPipeline: Get V4L2VideoDecoder supported + configs + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/chromeos/video_decoder_pipeline.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/media/gpu/chromeos/video_decoder_pipeline.cc b/media/gpu/chromeos/video_decoder_pipeline.cc +index 7cf16cc9faa77..7bffad93cfd5e 100644 +--- a/media/gpu/chromeos/video_decoder_pipeline.cc ++++ b/media/gpu/chromeos/video_decoder_pipeline.cc +@@ -356,7 +356,7 @@ VideoDecoderPipeline::GetSupportedConfigs( + break; + #elif BUILDFLAG(USE_V4L2_CODEC) + case VideoDecoderType::kV4L2: +- configs = GetSupportedV4L2DecoderConfigs(); ++ configs = V4L2VideoDecoder::GetSupportedConfigs(); + break; + #endif + default: +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0120-V4L2VideoDecoder-Fix-amphion-cannot-streamoff-after-.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0120-V4L2VideoDecoder-Fix-amphion-cannot-streamoff-after-.patch new file mode 100644 index 000000000..9ec985045 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0120-V4L2VideoDecoder-Fix-amphion-cannot-streamoff-after-.patch @@ -0,0 +1,61 @@ +From 2cf45a6abd796448126d1c1cc6f13e5e347d8c05 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Wed, 23 Oct 2024 19:08:46 +0900 +Subject: [PATCH] V4L2VideoDecoder: Fix amphion cannot streamoff after eos + +Amphion vpu driver directly return EPIPE without dequeuing extra +empty buffer when eos. Need to streamoff correctly for this case. + +Upstream-Status: Inappropriate [NXP specific] +--- + .../gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.cc | 6 ++++-- + media/gpu/v4l2/v4l2_video_decoder.cc | 2 +- + 2 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.cc b/media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.cc +index 7d35c58d4cae8..4bd6ac7fe1fcf 100644 +--- a/media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.cc ++++ b/media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.cc +@@ -4,6 +4,7 @@ + + #include "media/gpu/v4l2/legacy/v4l2_video_decoder_backend_stateful.h" + ++#include + #include + #include + #include +@@ -438,7 +439,7 @@ void V4L2StatefulVideoDecoderBackend::OnOutputBufferDequeued( + DVLOGF(3); + + // Zero-bytes buffers are returned as part of a flush and can be dismissed. +- if (buffer->GetPlaneBytesUsed(0) > 0) { ++ if (buffer && buffer->GetPlaneBytesUsed(0) > 0) { + // TODO(mcasas): Consider using TimeValToTimeDelta(). + const struct timeval timeval = buffer->GetTimeStamp(); + const struct timespec timespec = { +@@ -489,7 +490,8 @@ void V4L2StatefulVideoDecoderBackend::OnOutputBufferDequeued( + // The order here is important! A flush event may come after a resolution + // change event (but not the opposite), so we must make sure both events + // are processed in the correct order. +- if (buffer->IsLast()){ ++ if (errno == EPIPE || buffer->IsLast()){ ++ VLOGF(3) << "Got buffer with last flag or got EPIPE"; + // Check that we don't have a resolution change event pending. If we do + // then this LAST buffer was related to it. + ProcessEventQueue(); +diff --git a/media/gpu/v4l2/v4l2_video_decoder.cc b/media/gpu/v4l2/v4l2_video_decoder.cc +index 4c33ed4fea41f..d0f35414c69c9 100644 +--- a/media/gpu/v4l2/v4l2_video_decoder.cc ++++ b/media/gpu/v4l2/v4l2_video_decoder.cc +@@ -1282,7 +1282,7 @@ void V4L2VideoDecoder::ServiceDeviceTask(bool event) { + SetState(State::kError); + return; + } +- if (!dequeued_buffer) ++ if (!dequeued_buffer && errno != EPIPE) + break; + + if (backend_) +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0121-V4L2VideoDecoder-Set-OUTPUT-format-with-parsed-resol.patch b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0121-V4L2VideoDecoder-Set-OUTPUT-format-with-parsed-resol.patch new file mode 100644 index 000000000..51285dee3 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland/0121-V4L2VideoDecoder-Set-OUTPUT-format-with-parsed-resol.patch @@ -0,0 +1,37 @@ +From 13e0146475ec26b59c706249c7a61c7d9ee2d360 Mon Sep 17 00:00:00 2001 +From: Hou Qi +Date: Mon, 18 Nov 2024 14:59:51 +0900 +Subject: [PATCH] V4L2VideoDecoder: Set OUTPUT format with parsed resolution + +For VP8, VC1l, rv, amphion needs to set correct resolution for OUTPUT +queue as it will be added to amphion customized header. + +Upstream-Status: Inappropriate [NXP specific] +--- + media/gpu/v4l2/v4l2_video_decoder.cc | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/media/gpu/v4l2/v4l2_video_decoder.cc b/media/gpu/v4l2/v4l2_video_decoder.cc +index d0f35414c69c9..05c8d61f5f9fb 100644 +--- a/media/gpu/v4l2/v4l2_video_decoder.cc ++++ b/media/gpu/v4l2/v4l2_video_decoder.cc +@@ -328,6 +328,7 @@ void V4L2VideoDecoder::Initialize(const VideoDecoderConfig& config, + aspect_ratio_ = config.aspect_ratio(); + color_space_ = config.color_space_info(); + current_resolution_ = config.visible_rect().size(); ++ VLOGF(3) << "resolution is " << current_resolution_.width() << "x" << current_resolution_.height(); + + if (profile_ == VIDEO_CODEC_PROFILE_UNKNOWN) { + VLOGF(1) << "Unknown profile."; +@@ -632,7 +633,7 @@ bool V4L2VideoDecoder::SetupInputFormat() { + + // Setup the input format. + auto format = +- input_queue_->SetFormat(input_format_fourcc_, gfx::Size(), input_size); ++ input_queue_->SetFormat(input_format_fourcc_, current_resolution_, input_size); + if (!format) { + VPLOGF(1) << "Failed to call IOCTL to set input format."; + return false; +-- +2.34.1 + diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland_%.bbappend b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland_%.bbappend new file mode 100644 index 000000000..ab1185dbb --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-browser/chromium/chromium-ozone-wayland_%.bbappend @@ -0,0 +1,108 @@ +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" + +SRC_URI:append:imx-nxp-bsp = " \ + file://0001-Fixed-chromium-flicker-with-g2d-renderer.patch \ + file://0002-Disable-dri-for-imx-gpu.patch \ + file://0003-Fix-chromium-build-failure.patch \ + file://0004-Fixed-chromium-crash-after-upgrading.patch \ + file://0005-MGS-7765-Blacklist-MSAA-for-GPU-Raster-on-Vivante-GP.patch \ + file://0006-LF-12406-Fixed-webgl-test-fail-for-GL_MAX_SAMPLES-ch.patch \ + file://0007-Enable-native-GLES2-for-Ozone-wayland.patch \ + file://0008-Fix-build-fail-after-clang-llvm-upgrade.patch \ + file://0009-Fix-chromium-crash-when-run-webgl-2.0.0-cts.patch \ + file://0010-Fix-canvas-test-fail-for-webgl.patch \ + file://0011-LF-12406-1-Blacklist-disable-program_caching_for_tra.patch \ +" +VDA_PATCH_SET = " \ + file://0101-V4L2Device-Correct-v4l2-codec-device-path.patch \ + file://0102-V4L2VideoDecoder-Add-macro-use_linux_v4l2.patch \ + file://0103-V4L2VideoDecoder-Create-single-multi-plane-queues.patch \ + file://0104-V4L2Buffer-Allocate-correct-v4l2-buffers-for-queues.patch \ + file://0105-V4L2VideoDecoder-Create-videoframe-according-to-v4l2.patch \ + file://0106-V4L2VideoDecoder-Add-function-IsMultiQueue-for-S_FMT.patch \ + file://0107-V4L2VideoDecoder-Use-correct-plane-size-and-bytesuse.patch \ + file://0108-V4L2VideoDecoder-Add-hevc-format-support.patch \ + file://0109-display-Add-fps-in-SkiaOutputSurfaceImplOnGpu-by-VLO.patch \ + file://0110-V4L2VideoDecoder-Comment-some-unused-ioctl.patch \ + file://0111-V4L2VideoDecoder-Add-V4L2_PIX_FMT_NV12M_8L128-format.patch \ + file://0112-V4L2VideoDecoder-Support-tile-to-linear-transform-fo.patch \ + file://0113-V4L2VideoDecoder-Use-dlopen-to-dynamically-use-g2d-a.patch \ + file://0114-V4L2VideoDecoderBackend-Create-queue-according-to-qu.patch \ + file://0115-V4L2VideoDecoder-support-gpu-import-NV12-format.patch \ + file://0116-VideoDecoderPipeline-Add-resolution-change-support.patch \ + file://0117-V4L2StatefulVideoDecoderBackend-Enlarge-input-buffer.patch \ + file://0118-V4L2VideoDecoder-Fix-amphion-report-size-mismatch.patch \ + file://0119-VideoDecoderPipeline-Get-V4L2VideoDecoder-supported-.patch \ + file://0120-V4L2VideoDecoder-Fix-amphion-cannot-streamoff-after-.patch \ + file://0121-V4L2VideoDecoder-Set-OUTPUT-format-with-parsed-resol.patch \ +" +SRC_URI:append:mx8-nxp-bsp = " ${VDA_PATCH_SET}" +SRC_URI:append:mx95-nxp-bsp = " ${VDA_PATCH_SET}" + +GN_ARGS_DISABLE_GBM = "" +GN_ARGS_DISABLE_GBM:mx6-nxp-bsp = "use_system_minigbm=false use_wayland_gbm=false" +GN_ARGS_DISABLE_GBM:mx7-nxp-bsp = "${GN_ARGS_DISABLE_GBM:mx6-nxp-bsp}" +GN_ARGS_USE_IMXGPU = "use_imxgpu=false" +GN_ARGS_USE_IMXGPU:imxgpu = "use_imxgpu=true" +GN_ARGS_ENABLE_PROPRIETARY_CODECS = "" +GN_ARGS_ENABLE_PROPRIETARY_CODECS:mx8-nxp-bsp = "proprietary_codecs=true" +GN_ARGS_ENABLE_PROPRIETARY_CODECS:mx95-nxp-bsp = "proprietary_codecs=true" +GN_ARGS_FFMPEG_BRANDING = "" +GN_ARGS_FFMPEG_BRANDING:mx8-nxp-bsp = "ffmpeg_branding="Chrome"" +GN_ARGS_FFMPEG_BRANDING:mx95-nxp-bsp = "ffmpeg_branding="Chrome"" +GN_ARGS_USE_V4L2_CODEC = "" +GN_ARGS_USE_V4L2_CODEC:mx8-nxp-bsp = "use_v4l2_codec=true" +GN_ARGS_USE_V4L2_CODEC:mx95-nxp-bsp = "use_v4l2_codec=true" +GN_ARGS_USE_LINUX_V4L2_ONLY = "" +GN_ARGS_USE_LINUX_V4L2_ONLY:mx8-nxp-bsp = "use_linux_v4l2_only=true" +GN_ARGS_USE_LINUX_V4L2_ONLY:mx95-nxp-bsp = "use_linux_v4l2_only=true" + +GN_ARGS:append:imx-nxp-bsp = " \ + ${GN_ARGS_DISABLE_GBM} \ + ${GN_ARGS_USE_IMXGPU} \ + ${GN_ARGS_ENABLE_PROPRIETARY_CODECS} \ + ${GN_ARGS_FFMPEG_BRANDING} \ + ${GN_ARGS_USE_V4L2_CODEC} \ + ${GN_ARGS_USE_LINUX_V4L2_ONLY} \ + use_pulseaudio=true \ +" +DEPENDS:append = " pulseaudio" + +CHROMIUM_EXTRA_ARGS_ENABLE_ANGLE = "" +CHROMIUM_EXTRA_ARGS_ENABLE_ANGLE:mx93-nxp-bsp = "--use-gl=angle --use-angle=gles-egl" +CHROMIUM_EXTRA_ARGS_ENABLE_ANGLE:mx943-nxp-bsp = "--use-gl=angle --use-angle=gles-egl" + +CHROMIUM_EXTRA_ARGS:remove:mx93-nxp-bsp = "--use-gl=egl" +CHROMIUM_EXTRA_ARGS:remove:mx943-nxp-bsp = "--use-gl=egl" + +CHROMIUM_EXTRA_ARGS:append = " \ + --disable-features=VizDisplayCompositor \ + --in-process-gpu \ + --disable-gpu-rasterization \ + ${CHROMIUM_EXTRA_ARGS_ENABLE_ANGLE} \ +" + +#Remove installed ANGLE libraries +do_install:append:mx6-nxp-bsp() { + rm -rf ${D}${libdir}/chromium/libEGL.so + rm -rf ${D}${libdir}/chromium/libGLESv2.so + rm -rf ${D}${libdir}/chromium/libvulkan.so.1 +} + +do_install:append:mx7-nxp-bsp() { + rm -rf ${D}${libdir}/chromium/libEGL.so + rm -rf ${D}${libdir}/chromium/libGLESv2.so + rm -rf ${D}${libdir}/chromium/libvulkan.so.1 +} + +do_install:append:mx8-nxp-bsp() { + rm -rf ${D}${libdir}/chromium/libEGL.so + rm -rf ${D}${libdir}/chromium/libGLESv2.so + rm -rf ${D}${libdir}/chromium/libvulkan.so.1 +} + +do_install:append:mx95-nxp-bsp() { + rm -rf ${D}${libdir}/chromium/libEGL.so + rm -rf ${D}${libdir}/chromium/libGLESv2.so + rm -rf ${D}${libdir}/chromium/libvulkan.so.1 +} diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-digi/dey-examples/connectcore-demo-example.bbappend b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-digi/dey-examples/connectcore-demo-example.bbappend new file mode 100644 index 000000000..6f5b7042f --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-digi/dey-examples/connectcore-demo-example.bbappend @@ -0,0 +1,20 @@ +# Copyright (C) 2025, Digi International Inc. + +FILESEXTRAPATHS:prepend := "${THISDIR}/connectcore-demo-example:" + +SRC_URI += "file://connectcore-demo-example-chromium.service" + +do_install:append() { + # Install the chromium systemd unit + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -d ${D}${systemd_system_unitdir} + install -m 0644 ${WORKDIR}/connectcore-demo-example-chromium.service ${D}${systemd_system_unitdir}/ + fi +} + +PACKAGES =+ "${PN}-chromium" +FILES:${PN}-chromium += "${systemd_system_unitdir}/connectcore-demo-example-chromium.service" +RDEPENDS:${PN}-chromium = "${PN}-multimedia" + +SYSTEMD_PACKAGES += "${PN}-chromium" +SYSTEMD_SERVICE:${PN}-chromium = "connectcore-demo-example-chromium.service" diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-digi/dey-examples/connectcore-demo-example/connectcore-demo-example-chromium.service b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-digi/dey-examples/connectcore-demo-example/connectcore-demo-example-chromium.service new file mode 100644 index 000000000..4b55dc6ab --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-digi/dey-examples/connectcore-demo-example/connectcore-demo-example-chromium.service @@ -0,0 +1,26 @@ +[Unit] +Description=ConnectCore demo example running on Chromium +After=weston.service graphical.target +Requires=weston.service +ConditionPathExists=/run/wayland-0 + +[Service] +Type=simple +Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/dbus/system_bus_socket +Environment=WAYLAND_DISPLAY=wayland-0 +Environment=XDG_RUNTIME_DIR=/run +ExecStart=/usr/bin/chromium \ + --allow-file-access-from-files \ + --enable-features=UseOzonePlatform \ + --in-process-gpu \ + --incognito \ + --kiosk \ + --no-sandbox \ + --ozone-platform=wayland \ + file:///srv/www/index.html + +Restart=on-failure +RestartSec=30s + +[Install] +WantedBy=graphical.target diff --git a/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-digi/packagegroups/packagegroup-dey-chromium.bb b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-digi/packagegroups/packagegroup-dey-chromium.bb new file mode 100644 index 000000000..fc2031991 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/chromium-browser-layer/recipes-digi/packagegroups/packagegroup-dey-chromium.bb @@ -0,0 +1,11 @@ +# Copyright (C) 2025, Digi International Inc. + +SUMMARY = "Chromium packagegroup for DEY" +DESCRIPTION = "Packages required to run the Digi Getting Started demo application on Chromium Wayland browser" + +inherit packagegroup + +RDEPENDS:${PN} += "\ + chromium-ozone-wayland \ + connectcore-demo-example-chromium \ +" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv-6-overrides.inc b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv-6-overrides.inc deleted file mode 100644 index 07f05eb77..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv-6-overrides.inc +++ /dev/null @@ -1,27 +0,0 @@ -require recipes-graphics/imx-gpu-viv/imx-gpu-viv-6.inc - -### Section 1: Changes to be upstreamed ### - -LIBVULKAN_API_VERSION = "1.3.204" - -# FIXME: Update tensorflow-lite so it doesn't depend on this -RPROVIDES:${PN}:append = " ${RPROVIDES_OPENCL}" -RPROVIDES_OPENCL = "opencl-icd-loader-dev" -RPROVIDES_OPENCL:mx7-nxp-bsp = "" -RPROVIDES_OPENCL:mx8mm-nxp-bsp = "" - -### Section 2: Changes to be kept in meta-imx ### - -PACKAGECONFIG ?= "valgrind" - -RDEPENDS:libopenvg-imx += "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'systemd-gpuconfig', '', d)}" - -# FIXME: Don't add .so to main package -FILES:libvulkan-imx += "${libdir}/libvulkan_VSI${SOLIBS}" -INSANE_SKIP:libvulkan-imx += "dev-so" -FILES:libopenvx-imx += "${libdir}/libOpenVX${SOLIBS}" -INSANE_SKIP:libopenvx-imx += "dev-so dev-deps" -FILES:libopencl-imx += "${libdir}/libOpenCL${SOLIBS}" -INSANE_SKIP:libopencl-imx += "dev-so dev-deps" -FILES:libvdk-imx += "${libdir}/libVDK*${SOLIBS}" -INSANE_SKIP:libvdk-imx += "dev-so" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.10-aarch32.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.10-aarch32.bb deleted file mode 100644 index d10655049..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.10-aarch32.bb +++ /dev/null @@ -1,9 +0,0 @@ -require imx-gpu-viv-6-overrides.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=ca53281cc0caa7e320d4945a896fb837" - -IMX_SRCREV_ABBREV = "accdd64" - -SRC_URI[sha256sum] = "2242c7cbf1a2b07d40eefe5d1507747e477c54912f179ee0585a5d7965074ce0" - -COMPATIBLE_MACHINE = "(mx6q-nxp-bsp|mx6dl-nxp-bsp|mx6sx-nxp-bsp|mx6sl-nxp-bsp|mx7ulp-nxp-bsp)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.10-aarch64.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.10-aarch64.bb deleted file mode 100644 index 2469362be..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.10-aarch64.bb +++ /dev/null @@ -1,9 +0,0 @@ -require imx-gpu-viv-6-overrides.inc - -LIC_FILES_CHKSUM = "file://COPYING;md5=ca53281cc0caa7e320d4945a896fb837" - -IMX_SRCREV_ABBREV = "accdd64" - -SRC_URI[sha256sum] = "8108fd146de6986486f34860227511a5101b31072b99cd78ae38afba8939fd4e" - -COMPATIBLE_MACHINE = "(mx8-nxp-bsp)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.10-aarch32.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.12-aarch32.bbappend similarity index 100% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.10-aarch32.bbappend rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.12-aarch32.bbappend diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.10-aarch64.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.12-aarch64.bbappend similarity index 100% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.10-aarch64.bbappend rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/imx-gpu-viv/imx-gpu-viv_6.4.11.p2.12-aarch64.bbappend diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/gputop_git.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/gputop_git.bb index 8bdcf8078..17281b09c 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/gputop_git.bb +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/gputop_git.bb @@ -1,4 +1,4 @@ -# Copyright 2017-2024 NXP +# Copyright 2017-2025 NXP DESCRIPTION = "Sample program to monitor i.MX GPU performance data" LICENSE = "MIT" @@ -9,7 +9,7 @@ DEPENDS = "libgpuperfcnt" GPUTOP_SRC ?= "git://github.com/nxp-imx/imx-gputop.git;protocol=https" SRCBRANCH = "release" SRC_URI = "${GPUTOP_SRC};branch=${SRCBRANCH} " -SRCREV = "627e8823e1ba17c6d12b408835029a1c065bea84" +SRCREV = "10a5ca8f383ac1df9e4cd87c979d7e1db531acf2" S = "${WORKDIR}/git" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/libgpuperfcnt_6.4.11.p2.12.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/libgpuperfcnt_6.4.11.p2.12.bb new file mode 100644 index 000000000..b0ae0610d --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/libgpuperfcnt_6.4.11.p2.12.bb @@ -0,0 +1,17 @@ +DESCRIPTION = "A library to retrieve i.MX GPU performance data" +LICENSE = "Proprietary" +LIC_FILES_CHKSUM = "file://COPYING;md5=bc649096ad3928ec06a8713b8d787eac" +DEPENDS = "imx-gpu-viv" + +IMX_SRCREV_ABBREV = "e0a132a" + +SRC_URI[arm-fb.sha256sum] = "a4282e0380ec0edfec5ba58c22eac68efdbd8b4247ff5c0eef8ee92039872e91" +SRC_URI[arm-wayland.sha256sum] = "5ce4f8a288e2c38611c6e2b61ffba5305afb172a3b7e03f54d10aff81a6dfe92" +SRC_URI[aarch64-wayland.sha256sum] = "18f86b3cd487abd93c90d6b789fe0d3500b8e958962d21df6f4a329d726b8a4d" + +inherit fsl-eula-unpack2 fsl-eula-graphics fsl-eula-recent + +PACKAGE_ARCH = "${MACHINE_SOCARCH}" + +COMPATIBLE_MACHINE = "(imxgpu)" +COMPATIBLE_MACHINE:mx95-generic-bsp = "(^$)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/libgpuperfcnt_git.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/libgpuperfcnt_git.bb deleted file mode 100644 index 98c8cf861..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/libgpuperfcnt_git.bb +++ /dev/null @@ -1,24 +0,0 @@ -DESCRIPTION = "A library to retrieve i.MX GPU performance data" -LICENSE = "Proprietary" -LIC_FILES_CHKSUM = "file://COPYING;md5=ca53281cc0caa7e320d4945a896fb837" - -IMX_SRCREV_ABBREV = "99ab423" - -SRC_URI[arm-fb.sha256sum] = "be907da4aa533e1c325002dee93364965553a1f971442b1c3661bc8a3c9b6212" -SRC_URI[arm-wayland.sha256sum] = "07334d80e692b6c228437d037ec97ca5d59af9f9b3ddf12a8503defc9bd7e1be" -SRC_URI[aarch64-wayland.sha256sum] = "1f24a74fae88814eae2d3ca35addddace7889438500105a137265c961d1bacdd" -SRC_URI[aarch64-wayland-mali.sha256sum] = "a0dff721ac7ff6a89862f85bf5a49f60df571dbab8676babbf702feb8e4d5da5" - -inherit fsl-eula-unpack2 fsl-eula-graphics fsl-eula-recent - -PACKAGECONFIG ??= "vivante" -PACKAGECONFIG:mx95-nxp-bsp = "mali" - -PACKAGECONFIG[mali] = ",,,mali-imx,,vivante" -PACKAGECONFIG[vivante] = ",,,imx-gpu-viv,,mali" - -PACKAGE_ARCH = "${MACHINE_SOCARCH}" - -# Compatible only with i.MX with GPU -COMPATIBLE_MACHINE = "(^$)" -COMPATIBLE_MACHINE:imxgpu = "${MACHINE}" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/libgpuperfcnt_r50.4.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/libgpuperfcnt_r50.4.bb new file mode 100644 index 000000000..72b2629d5 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/libgpuperfcnt/libgpuperfcnt_r50.4.bb @@ -0,0 +1,14 @@ +DESCRIPTION = "A library to retrieve i.MX GPU performance data" +LICENSE = "Proprietary" +LIC_FILES_CHKSUM = "file://COPYING;md5=bc649096ad3928ec06a8713b8d787eac" +DEPENDS = "mali-imx" + +IMX_SRCREV_ABBREV = "e0a132a" + +SRC_URI[aarch64-wayland-mali.sha256sum] = "81559f5390706f3b5dd2ae224aa266e55dd74437080ff4c065557b9906140a41" + +inherit fsl-eula-unpack2 fsl-eula-graphics fsl-eula-recent + +PACKAGE_ARCH = "${MACHINE_SOCARCH}" + +COMPATIBLE_MACHINE = "(mx95-generic-bsp)" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.4.imx/0001-Restore-wl_shell-to-weston-12.patch b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.4.imx/0001-Restore-wl_shell-to-weston-12.patch deleted file mode 100644 index 8301a5cbe..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.4.imx/0001-Restore-wl_shell-to-weston-12.patch +++ /dev/null @@ -1,935 +0,0 @@ -From: Gabriel Valcazar -Date: Fri, 19 Jan 2024 09:45:19 +0100 -Subject: [PATCH] Restore wl_shell to weston 12 - -This shell was deprecated some time ago and removed in weston 12, but it's the -default shell used by LVGL's wayland backend. Until we migrate said backend to -use xdg_shell, restore wl_shell in weston 12. - -This reverts the following commits: - - * d40cedc8af9a42e1f6746fb58f4556080c6ff133 - * 7cae2a1fb0aeec24ca33ac4c7cbb268f77095cb5 - * e6b8f5a5e40cd6c0b934e8ae079c86d5193efa96 - -Upstream-Status: Inappropriate [DEY specific] - -Signed-off-by: Gabriel Valcazar ---- - desktop-shell/shell.c | 26 +- - libweston/backend-wayland/wayland.c | 87 ++++- - libweston/desktop/internal.h | 4 + - libweston/desktop/libweston-desktop.c | 19 + - libweston/desktop/meson.build | 1 + - libweston/desktop/wl-shell.c | 497 ++++++++++++++++++++++++++ - meson.build | 6 + - meson_options.txt | 7 + - 8 files changed, 630 insertions(+), 17 deletions(-) - create mode 100644 libweston/desktop/wl-shell.c - -diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c -index 99ad3dfb..51097b72 100644 ---- a/desktop-shell/shell.c -+++ b/desktop-shell/shell.c -@@ -1367,16 +1367,16 @@ resize_grab_motion(struct weston_pointer_grab *grab, - to_y = wl_fixed_from_double(tmp_s.c.y); - - width = resize->width; -- if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_LEFT) { -+ if (resize->edges & WL_SHELL_SURFACE_RESIZE_LEFT) { - width += wl_fixed_to_int(from_x - to_x); -- } else if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_RIGHT) { -+ } else if (resize->edges & WL_SHELL_SURFACE_RESIZE_RIGHT) { - width += wl_fixed_to_int(to_x - from_x); - } - - height = resize->height; -- if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_TOP) { -+ if (resize->edges & WL_SHELL_SURFACE_RESIZE_TOP) { - height += wl_fixed_to_int(from_y - to_y); -- } else if (resize->edges & WESTON_DESKTOP_SURFACE_EDGE_BOTTOM) { -+ } else if (resize->edges & WL_SHELL_SURFACE_RESIZE_BOTTOM) { - height += wl_fixed_to_int(to_y - from_y); - } - -@@ -1454,9 +1454,9 @@ surface_resize(struct shell_surface *shsurf, - { - struct weston_resize_grab *resize; - const unsigned resize_topbottom = -- WESTON_DESKTOP_SURFACE_EDGE_TOP | WESTON_DESKTOP_SURFACE_EDGE_BOTTOM; -+ WL_SHELL_SURFACE_RESIZE_TOP | WL_SHELL_SURFACE_RESIZE_BOTTOM; - const unsigned resize_leftright = -- WESTON_DESKTOP_SURFACE_EDGE_LEFT | WESTON_DESKTOP_SURFACE_EDGE_RIGHT; -+ WL_SHELL_SURFACE_RESIZE_LEFT | WL_SHELL_SURFACE_RESIZE_RIGHT; - const unsigned resize_any = resize_topbottom | resize_leftright; - struct weston_geometry geometry; - -@@ -1466,7 +1466,7 @@ surface_resize(struct shell_surface *shsurf, - return 0; - - /* Check for invalid edge combinations. */ -- if (edges == WESTON_DESKTOP_SURFACE_EDGE_NONE || edges > resize_any || -+ if (edges == WL_SHELL_SURFACE_RESIZE_NONE || edges > resize_any || - (edges & resize_topbottom) == resize_topbottom || - (edges & resize_leftright) == resize_leftright) - return 0; -@@ -2469,9 +2469,9 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface, - sy = 0; - } - -- if (shsurf->resize_edges & WESTON_DESKTOP_SURFACE_EDGE_LEFT) -+ if (shsurf->resize_edges & WL_SHELL_SURFACE_RESIZE_LEFT) - sx = shsurf->last_width - surface->width; -- if (shsurf->resize_edges & WESTON_DESKTOP_SURFACE_EDGE_TOP) -+ if (shsurf->resize_edges & WL_SHELL_SURFACE_RESIZE_TOP) - sy = shsurf->last_height - surface->height; - - to_s = weston_coord_surface(sx, sy, view->surface); -@@ -3450,18 +3450,18 @@ resize_binding(struct weston_pointer *pointer, const struct timespec *time, - y = surf_pos.c.y; - - if (x < surface->width / 3) -- edges |= WESTON_DESKTOP_SURFACE_EDGE_LEFT; -+ edges |= WL_SHELL_SURFACE_RESIZE_LEFT; - else if (x < 2 * surface->width / 3) - edges |= 0; - else -- edges |= WESTON_DESKTOP_SURFACE_EDGE_RIGHT; -+ edges |= WL_SHELL_SURFACE_RESIZE_RIGHT; - - if (y < surface->height / 3) -- edges |= WESTON_DESKTOP_SURFACE_EDGE_TOP; -+ edges |= WL_SHELL_SURFACE_RESIZE_TOP; - else if (y < 2 * surface->height / 3) - edges |= 0; - else -- edges |= WESTON_DESKTOP_SURFACE_EDGE_BOTTOM; -+ edges |= WL_SHELL_SURFACE_RESIZE_BOTTOM; - - surface_resize(shsurf, pointer, edges); - } -diff --git a/libweston/backend-wayland/wayland.c b/libweston/backend-wayland/wayland.c -index 48c21b99..7a82b1a6 100644 ---- a/libweston/backend-wayland/wayland.c -+++ b/libweston/backend-wayland/wayland.c -@@ -85,6 +85,7 @@ struct wayland_backend { - struct wl_display *wl_display; - struct wl_registry *registry; - struct wl_compositor *compositor; -+ struct wl_shell *shell; - struct xdg_wm_base *xdg_wm_base; - struct zwp_fullscreen_shell_v1 *fshell; - struct wl_shm *shm; -@@ -123,6 +124,7 @@ struct wayland_output { - struct wl_output *output; - uint32_t global_id; - -+ struct wl_shell_surface *shell_surface; - struct xdg_surface *xdg_surface; - struct xdg_toplevel *xdg_toplevel; - int configure_width, configure_height; -@@ -665,6 +667,11 @@ wayland_backend_destroy_output_surface(struct wayland_output *output) - output->parent.xdg_surface = NULL; - } - -+ if (output->parent.shell_surface) { -+ wl_shell_surface_destroy(output->parent.shell_surface); -+ output->parent.shell_surface = NULL; -+ } -+ - wl_surface_destroy(output->parent.surface); - output->parent.surface = NULL; - } -@@ -737,6 +744,8 @@ wayland_output_destroy(struct weston_output *base) - free(output); - } - -+static const struct wl_shell_surface_listener shell_surface_listener; -+ - #ifdef ENABLE_EGL - static int - wayland_output_init_gl_renderer(struct wayland_output *output) -@@ -899,6 +908,8 @@ wayland_output_set_windowed(struct wayland_output *output) - - if (output->parent.xdg_toplevel) { - xdg_toplevel_unset_fullscreen(output->parent.xdg_toplevel); -+ } else if (output->parent.shell_surface) { -+ wl_shell_surface_set_toplevel(output->parent.shell_surface); - } else { - abort(); - } -@@ -908,6 +919,7 @@ wayland_output_set_windowed(struct wayland_output *output) - - static void - wayland_output_set_fullscreen(struct wayland_output *output, -+ enum wl_shell_surface_fullscreen_method method, - uint32_t framerate, struct wl_output *target) - { - if (output->frame) { -@@ -919,6 +931,9 @@ wayland_output_set_fullscreen(struct wayland_output *output, - - if (output->parent.xdg_toplevel) { - xdg_toplevel_set_fullscreen(output->parent.xdg_toplevel, target); -+ } else if (output->parent.shell_surface) { -+ wl_shell_surface_set_fullscreen(output->parent.shell_surface, -+ method, framerate, target); - } else { - abort(); - } -@@ -1139,7 +1154,7 @@ wayland_output_switch_mode(struct weston_output *output_base, - - if (output->parent.xdg_surface) - return wayland_output_switch_mode_xdg(output, mode); -- if (output->backend->parent.fshell) -+ if (output->backend->parent.fshell || output->parent.shell_surface) - return wayland_output_switch_mode_fshell(output, mode); - - return -1; -@@ -1245,6 +1260,20 @@ wayland_backend_create_output_surface(struct wayland_output *output) - - weston_log("wayland-backend: Using xdg_wm_base\n"); - } -+ else if (b->parent.shell) { -+ output->parent.shell_surface = -+ wl_shell_get_shell_surface(b->parent.shell, -+ output->parent.surface); -+ if (!output->parent.shell_surface) { -+ wl_surface_destroy(output->parent.surface); -+ return -1; -+ } -+ -+ wl_shell_surface_add_listener(output->parent.shell_surface, -+ &shell_surface_listener, output); -+ -+ weston_log("wayland-backend: Using wl_shell\n"); -+ } - - return 0; - } -@@ -1309,9 +1338,13 @@ wayland_output_enable(struct weston_output *base) - - output->parent.draw_initial_frame = true; - } -+ } else { -+ wayland_output_set_fullscreen(output, -+ WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER, -+ output->mode.refresh, output->parent.output); - } - } else if (b->fullscreen) { -- wayland_output_set_fullscreen(output, 0, NULL); -+ wayland_output_set_fullscreen(output, 0, 0, NULL); - } else { - wayland_output_set_windowed(output); - } -@@ -1600,10 +1633,13 @@ wayland_output_setup_fullscreen(struct wayland_output *output, - return -1; - - /* What should size be set if conditional is false? */ -- if (b->parent.xdg_wm_base) { -+ if (b->parent.xdg_wm_base || b->parent.shell) { - if (output->parent.xdg_toplevel) - xdg_toplevel_set_fullscreen(output->parent.xdg_toplevel, - output->parent.output); -+ else if (output->parent.shell_surface) -+ wl_shell_surface_set_fullscreen(output->parent.shell_surface, -+ 0, 0, NULL); - - wl_display_roundtrip(b->parent.wl_display); - -@@ -1627,6 +1663,36 @@ err_set_size: - return -1; - } - -+static void -+shell_surface_ping(void *data, struct wl_shell_surface *shell_surface, -+ uint32_t serial) -+{ -+ wl_shell_surface_pong(shell_surface, serial); -+} -+ -+static void -+shell_surface_configure(void *data, struct wl_shell_surface *shell_surface, -+ uint32_t edges, int32_t width, int32_t height) -+{ -+ struct wayland_output *output = data; -+ -+ output->parent.configure_width = width; -+ output->parent.configure_height = height; -+ -+ /* FIXME: implement resizing */ -+} -+ -+static void -+shell_surface_popup_done(void *data, struct wl_shell_surface *shell_surface) -+{ -+} -+ -+static const struct wl_shell_surface_listener shell_surface_listener = { -+ shell_surface_ping, -+ shell_surface_configure, -+ shell_surface_popup_done -+}; -+ - /* Events received from the wayland-server this compositor is client of: */ - - /* parent input interface */ -@@ -1808,6 +1874,9 @@ input_handle_button(void *data, struct wl_pointer *pointer, - if (input->output->parent.xdg_toplevel) - xdg_toplevel_move(input->output->parent.xdg_toplevel, - input->parent.seat, serial); -+ else if (input->output->parent.shell_surface) -+ wl_shell_surface_move(input->output->parent.shell_surface, -+ input->parent.seat, serial); - frame_status_clear(input->output->frame, - FRAME_STATUS_MOVE); - return; -@@ -2169,6 +2238,9 @@ input_handle_touch_down(void *data, struct wl_touch *wl_touch, - if (output->parent.xdg_toplevel) - xdg_toplevel_move(output->parent.xdg_toplevel, - input->parent.seat, serial); -+ else if (output->parent.shell_surface) -+ wl_shell_surface_move(output->parent.shell_surface, -+ input->parent.seat, serial); - frame_status_clear(output->frame, - FRAME_STATUS_MOVE); - return; -@@ -2683,6 +2755,10 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t name, - &xdg_wm_base_interface, 1); - xdg_wm_base_add_listener(b->parent.xdg_wm_base, - &wm_base_listener, b); -+ } else if (strcmp(interface, "wl_shell") == 0) { -+ b->parent.shell = -+ wl_registry_bind(registry, name, -+ &wl_shell_interface, 1); - } else if (strcmp(interface, "zwp_fullscreen_shell_v1") == 0) { - b->parent.fshell = - wl_registry_bind(registry, name, -@@ -2778,6 +2854,9 @@ wayland_destroy(struct weston_backend *backend) - if (b->parent.xdg_wm_base) - xdg_wm_base_destroy(b->parent.xdg_wm_base); - -+ if (b->parent.shell) -+ wl_shell_destroy(b->parent.shell); -+ - if (b->parent.fshell) - zwp_fullscreen_shell_v1_release(b->parent.fshell); - -@@ -2847,7 +2926,7 @@ fullscreen_binding(struct weston_keyboard *keyboard, - return; - - if (input->output->frame) -- wayland_output_set_fullscreen(input->output, 0, NULL); -+ wayland_output_set_fullscreen(input->output, 0, 0, NULL); - else - wayland_output_set_windowed(input->output); - -diff --git a/libweston/desktop/internal.h b/libweston/desktop/internal.h -index c8d09272..41e81b13 100644 ---- a/libweston/desktop/internal.h -+++ b/libweston/desktop/internal.h -@@ -249,6 +249,10 @@ weston_desktop_xdg_wm_base_create(struct weston_desktop *desktop, - struct wl_global * - weston_desktop_xdg_shell_v6_create(struct weston_desktop *desktop, - struct wl_display *display); -+struct wl_global * -+weston_desktop_wl_shell_create(struct weston_desktop *desktop, -+ struct wl_display *display); -+ - void - weston_desktop_xwayland_init(struct weston_desktop *desktop); - void -diff --git a/libweston/desktop/libweston-desktop.c b/libweston/desktop/libweston-desktop.c -index 05240cfb..b74ee09f 100644 ---- a/libweston/desktop/libweston-desktop.c -+++ b/libweston/desktop/libweston-desktop.c -@@ -42,6 +42,7 @@ struct weston_desktop { - void *user_data; - struct wl_global *xdg_wm_base; /* Stable protocol xdg_shell replaces xdg_shell_unstable_v6 */ - struct wl_global *xdg_shell_v6; /* Unstable xdg_shell_unstable_v6 protocol. */ -+ struct wl_global *wl_shell; - }; - - void -@@ -76,6 +77,22 @@ weston_desktop_create(struct weston_compositor *compositor, - return NULL; - } - -+#ifdef HAVE_DEPRECATED_WL_SHELL -+ weston_log("Warning: support for deprecated wl_shell interface is " -+ "enabled. Please migrate legacy clients to xdg-shell.\n"); -+ desktop->wl_shell = -+ weston_desktop_wl_shell_create(desktop, display); -+ if (desktop->wl_shell == NULL) { -+ weston_desktop_destroy(desktop); -+ return NULL; -+ } -+#else -+ weston_log("Note: support for the deprecated wl_shell interface is " -+ "disabled. If a legacy client still needs it, it can be " -+ "re-enabled by passing -Ddeprecated-wl-shell=true to Meson " -+ "when building Weston.\n"); -+#endif -+ - weston_desktop_xwayland_init(desktop); - - return desktop; -@@ -89,6 +106,8 @@ weston_desktop_destroy(struct weston_desktop *desktop) - - weston_desktop_xwayland_fini(desktop); - -+ if (desktop->wl_shell != NULL) -+ wl_global_destroy(desktop->wl_shell); - if (desktop->xdg_shell_v6 != NULL) - wl_global_destroy(desktop->xdg_shell_v6); - if (desktop->xdg_wm_base != NULL) -diff --git a/libweston/desktop/meson.build b/libweston/desktop/meson.build -index 4588ad10..d8e1a709 100644 ---- a/libweston/desktop/meson.build -+++ b/libweston/desktop/meson.build -@@ -4,6 +4,7 @@ srcs_libweston += files([ - 'seat.c', - 'surface.c', - 'xwayland.c', -+ 'wl-shell.c', - 'xdg-shell.c', - 'xdg-shell-v6.c', - ]) -diff --git a/libweston/desktop/wl-shell.c b/libweston/desktop/wl-shell.c -new file mode 100644 -index 00000000..26360de9 ---- /dev/null -+++ b/libweston/desktop/wl-shell.c -@@ -0,0 +1,497 @@ -+/* -+ * Copyright © 2010-2012 Intel Corporation -+ * Copyright © 2011-2012 Collabora, Ltd. -+ * Copyright © 2013 Raspberry Pi Foundation -+ * Copyright © 2016 Quentin "Sardem FF7" Glidic -+ * -+ * Permission is hereby granted, free of charge, to any person obtaining a -+ * copy of this software and associated documentation files (the "Software"), -+ * to deal in the Software without restriction, including without limitation -+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, -+ * and/or sell copies of the Software, and to permit persons to whom the -+ * Software is furnished to do so, subject to the following conditions: -+ * -+ * The above copyright notice and this permission notice (including the next -+ * paragraph) shall be included in all copies or substantial portions of the -+ * Software. -+ * -+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ * DEALINGS IN THE SOFTWARE. -+ */ -+ -+#include "config.h" -+ -+#include -+ -+#include -+ -+#include -+#include -+ -+#include -+#include "internal.h" -+ -+#define WD_WL_SHELL_PROTOCOL_VERSION 1 -+ -+enum weston_desktop_wl_shell_surface_state { -+ NONE, -+ TOPLEVEL, -+ MAXIMIZED, -+ FULLSCREEN, -+ TRANSIENT, -+ POPUP, -+}; -+ -+struct weston_desktop_wl_shell_surface { -+ struct wl_resource *resource; -+ struct weston_desktop *desktop; -+ struct wl_display *display; -+ struct weston_desktop_surface *surface; -+ struct weston_desktop_surface *parent; -+ bool added; -+ struct weston_desktop_seat *popup_seat; -+ enum weston_desktop_wl_shell_surface_state state; -+ struct wl_listener wl_surface_resource_destroy_listener; -+}; -+ -+static void -+weston_desktop_wl_shell_surface_set_size(struct weston_desktop_surface *dsurface, -+ void *user_data, -+ int32_t width, int32_t height) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ struct weston_surface *wsurface = -+ weston_desktop_surface_get_surface(surface->surface); -+ -+ if ((wsurface->width == width && wsurface->height == height) || -+ (width == 0 && height == 0)) -+ return; -+ -+ wl_shell_surface_send_configure(surface->resource, -+ WL_SHELL_SURFACE_RESIZE_NONE, -+ width, height); -+} -+ -+static void -+weston_desktop_wl_shell_surface_maybe_ungrab(struct weston_desktop_wl_shell_surface *surface) -+{ -+ if (surface->state != POPUP || -+ !weston_desktop_surface_get_grab(surface->surface)) -+ return; -+ -+ weston_desktop_surface_popup_ungrab(surface->surface, -+ surface->popup_seat); -+ surface->popup_seat = NULL; -+} -+ -+static void -+weston_desktop_wl_shell_surface_committed(struct weston_desktop_surface *dsurface, -+ void *user_data, -+ int32_t sx, int32_t sy) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ struct weston_surface *wsurface = -+ weston_desktop_surface_get_surface(dsurface); -+ -+ if (wsurface->buffer_ref.buffer == NULL) -+ weston_desktop_wl_shell_surface_maybe_ungrab(surface); -+ -+ if (surface->added) -+ weston_desktop_api_committed(surface->desktop, surface->surface, -+ sx, sy); -+} -+ -+static void -+weston_desktop_wl_shell_surface_ping(struct weston_desktop_surface *dsurface, -+ uint32_t serial, void *user_data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ -+ wl_shell_surface_send_ping(surface->resource, serial); -+} -+ -+static void -+weston_desktop_wl_shell_surface_close(struct weston_desktop_surface *dsurface, -+ void *user_data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ -+ if (surface->state == POPUP) -+ wl_shell_surface_send_popup_done(surface->resource); -+} -+ -+static bool -+weston_desktop_wl_shell_surface_get_maximized(struct weston_desktop_surface *dsurface, -+ void *user_data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ -+ return surface->state == MAXIMIZED; -+} -+ -+static bool -+weston_desktop_wl_shell_surface_get_fullscreen(struct weston_desktop_surface *dsurface, -+ void *user_data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ -+ return surface->state == FULLSCREEN; -+} -+ -+static void -+weston_desktop_wl_shell_change_state(struct weston_desktop_wl_shell_surface *surface, -+ enum weston_desktop_wl_shell_surface_state state, -+ struct weston_desktop_surface *parent, -+ int32_t x, int32_t y) -+{ -+ bool to_add = (parent == NULL); -+ -+ assert(state != NONE); -+ -+ if (to_add && surface->added) { -+ surface->state = state; -+ return; -+ } -+ -+ if (surface->state != state) { -+ if (surface->state == POPUP) -+ weston_desktop_wl_shell_surface_maybe_ungrab(surface); -+ -+ if (to_add) { -+ weston_desktop_surface_unset_relative_to(surface->surface); -+ weston_desktop_api_surface_added(surface->desktop, -+ surface->surface); -+ } else if (surface->added) { -+ weston_desktop_api_surface_removed(surface->desktop, -+ surface->surface); -+ } -+ -+ surface->state = state; -+ surface->added = to_add; -+ } -+ -+ if (parent != NULL) -+ weston_desktop_surface_set_relative_to(surface->surface, parent, -+ x, y, false); -+} -+ -+static void -+weston_desktop_wl_shell_surface_destroy(struct weston_desktop_surface *dsurface, -+ void *user_data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = user_data; -+ -+ wl_list_remove(&surface->wl_surface_resource_destroy_listener.link); -+ -+ weston_desktop_wl_shell_surface_maybe_ungrab(surface); -+ weston_desktop_surface_unset_relative_to(surface->surface); -+ if (surface->added) -+ weston_desktop_api_surface_removed(surface->desktop, -+ surface->surface); -+ -+ free(surface); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_pong(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ uint32_t serial) -+{ -+ struct weston_desktop_surface *surface = wl_resource_get_user_data(resource); -+ -+ weston_desktop_client_pong(weston_desktop_surface_get_client(surface), serial); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_move(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ struct wl_resource *seat_resource, -+ uint32_t serial) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_seat *seat = -+ wl_resource_get_user_data(seat_resource); -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ -+ if (seat == NULL) -+ return; -+ -+ weston_desktop_api_move(surface->desktop, dsurface, seat, serial); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_resize(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ struct wl_resource *seat_resource, -+ uint32_t serial, -+ enum wl_shell_surface_resize edges) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_seat *seat = wl_resource_get_user_data(seat_resource); -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ enum weston_desktop_surface_edge surf_edges = -+ (enum weston_desktop_surface_edge) edges; -+ -+ if (seat == NULL) -+ return; -+ -+ weston_desktop_api_resize(surface->desktop, dsurface, seat, serial, surf_edges); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_toplevel(struct wl_client *wl_client, -+ struct wl_resource *resource) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ -+ weston_desktop_wl_shell_change_state(surface, TOPLEVEL, NULL, 0, 0); -+ if (surface->parent == NULL) -+ return; -+ surface->parent = NULL; -+ weston_desktop_api_set_parent(surface->desktop, surface->surface, NULL); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_transient(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ struct wl_resource *parent_resource, -+ int32_t x, int32_t y, -+ enum wl_shell_surface_transient flags) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_surface *wparent = -+ wl_resource_get_user_data(parent_resource); -+ struct weston_desktop_surface *parent; -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ -+ if (!weston_surface_is_desktop_surface(wparent)) -+ return; -+ -+ parent = weston_surface_get_desktop_surface(wparent); -+ if (flags & WL_SHELL_SURFACE_TRANSIENT_INACTIVE) { -+ weston_desktop_wl_shell_change_state(surface, TRANSIENT, parent, -+ x, y); -+ } else { -+ weston_desktop_wl_shell_change_state(surface, TOPLEVEL, NULL, -+ 0, 0); -+ surface->parent = parent; -+ weston_desktop_api_set_parent(surface->desktop, -+ surface->surface, parent); -+ } -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_fullscreen(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ enum wl_shell_surface_fullscreen_method method, -+ uint32_t framerate, -+ struct wl_resource *output_resource) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ struct weston_output *output = NULL; -+ -+ if (output_resource != NULL) -+ output = weston_head_from_resource(output_resource)->output; -+ -+ weston_desktop_wl_shell_change_state(surface, FULLSCREEN, NULL, 0, 0); -+ weston_desktop_api_fullscreen_requested(surface->desktop, dsurface, -+ true, output); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_popup(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ struct wl_resource *seat_resource, -+ uint32_t serial, -+ struct wl_resource *parent_resource, -+ int32_t x, int32_t y, -+ enum wl_shell_surface_transient flags) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_seat *wseat = wl_resource_get_user_data(seat_resource); -+ struct weston_desktop_seat *seat = weston_desktop_seat_from_seat(wseat); -+ struct weston_surface *parent = -+ wl_resource_get_user_data(parent_resource); -+ struct weston_desktop_surface *parent_surface; -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ -+ /* Check that if we have a valid wseat we also got a valid desktop seat */ -+ if (wseat != NULL && seat == NULL) { -+ wl_client_post_no_memory(wl_client); -+ return; -+ } -+ -+ if (!weston_surface_is_desktop_surface(parent)) -+ return; -+ -+ parent_surface = weston_surface_get_desktop_surface(parent); -+ -+ weston_desktop_wl_shell_change_state(surface, POPUP, -+ parent_surface, x, y); -+ weston_desktop_surface_popup_grab(surface->surface, parent_surface, seat, serial); -+ surface->popup_seat = seat; -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_maximized(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ struct wl_resource *output_resource) -+{ -+ struct weston_desktop_surface *dsurface = -+ wl_resource_get_user_data(resource); -+ struct weston_desktop_wl_shell_surface *surface = -+ weston_desktop_surface_get_implementation_data(dsurface); -+ -+ weston_desktop_wl_shell_change_state(surface, MAXIMIZED, NULL, 0, 0); -+ weston_desktop_api_maximized_requested(surface->desktop, dsurface, true); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_title(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ const char *title) -+{ -+ struct weston_desktop_surface *surface = -+ wl_resource_get_user_data(resource); -+ -+ weston_desktop_surface_set_title(surface, title); -+} -+ -+static void -+weston_desktop_wl_shell_surface_protocol_set_class(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ const char *class_) -+{ -+ struct weston_desktop_surface *surface = -+ wl_resource_get_user_data(resource); -+ -+ weston_desktop_surface_set_app_id(surface, class_); -+} -+ -+ -+static const struct wl_shell_surface_interface weston_desktop_wl_shell_surface_implementation = { -+ .pong = weston_desktop_wl_shell_surface_protocol_pong, -+ .move = weston_desktop_wl_shell_surface_protocol_move, -+ .resize = weston_desktop_wl_shell_surface_protocol_resize, -+ .set_toplevel = weston_desktop_wl_shell_surface_protocol_set_toplevel, -+ .set_transient = weston_desktop_wl_shell_surface_protocol_set_transient, -+ .set_fullscreen = weston_desktop_wl_shell_surface_protocol_set_fullscreen, -+ .set_popup = weston_desktop_wl_shell_surface_protocol_set_popup, -+ .set_maximized = weston_desktop_wl_shell_surface_protocol_set_maximized, -+ .set_title = weston_desktop_wl_shell_surface_protocol_set_title, -+ .set_class = weston_desktop_wl_shell_surface_protocol_set_class, -+}; -+ -+static const struct weston_desktop_surface_implementation weston_desktop_wl_shell_surface_internal_implementation = { -+ .set_size = weston_desktop_wl_shell_surface_set_size, -+ .committed = weston_desktop_wl_shell_surface_committed, -+ .ping = weston_desktop_wl_shell_surface_ping, -+ .close = weston_desktop_wl_shell_surface_close, -+ -+ .get_maximized = weston_desktop_wl_shell_surface_get_maximized, -+ .get_fullscreen = weston_desktop_wl_shell_surface_get_fullscreen, -+ -+ .destroy = weston_desktop_wl_shell_surface_destroy, -+}; -+ -+static void -+wl_surface_resource_destroyed(struct wl_listener *listener, -+ void *data) -+{ -+ struct weston_desktop_wl_shell_surface *surface = -+ wl_container_of(listener, surface, -+ wl_surface_resource_destroy_listener); -+ -+ /* the wl_shell_surface spec says that wl_shell_surfaces are to be -+ * destroyed automatically when the wl_surface is destroyed. */ -+ weston_desktop_surface_destroy(surface->surface); -+} -+ -+static void -+weston_desktop_wl_shell_protocol_get_shell_surface(struct wl_client *wl_client, -+ struct wl_resource *resource, -+ uint32_t id, -+ struct wl_resource *surface_resource) -+{ -+ struct weston_desktop_client *client = wl_resource_get_user_data(resource); -+ struct weston_surface *wsurface = wl_resource_get_user_data(surface_resource); -+ struct weston_desktop_wl_shell_surface *surface; -+ -+ -+ if (weston_surface_set_role(wsurface, "wl_shell_surface", resource, WL_SHELL_ERROR_ROLE) < 0) -+ return; -+ -+ surface = zalloc(sizeof(struct weston_desktop_wl_shell_surface)); -+ if (surface == NULL) { -+ wl_client_post_no_memory(wl_client); -+ return; -+ } -+ -+ surface->desktop = weston_desktop_client_get_desktop(client); -+ surface->display = weston_desktop_get_display(surface->desktop); -+ -+ surface->surface = -+ weston_desktop_surface_create(surface->desktop, client, wsurface, -+ &weston_desktop_wl_shell_surface_internal_implementation, -+ surface); -+ if (surface->surface == NULL) { -+ free(surface); -+ return; -+ } -+ -+ surface->wl_surface_resource_destroy_listener.notify = -+ wl_surface_resource_destroyed; -+ wl_resource_add_destroy_listener(wsurface->resource, -+ &surface->wl_surface_resource_destroy_listener); -+ -+ surface->resource = -+ weston_desktop_surface_add_resource(surface->surface, -+ &wl_shell_surface_interface, -+ &weston_desktop_wl_shell_surface_implementation, -+ id, NULL); -+} -+ -+ -+static const struct wl_shell_interface weston_desktop_wl_shell_implementation = { -+ .get_shell_surface = weston_desktop_wl_shell_protocol_get_shell_surface, -+}; -+ -+static void -+weston_desktop_wl_shell_bind(struct wl_client *client, void *data, -+ uint32_t version, uint32_t id) -+{ -+ struct weston_desktop *desktop = data; -+ -+ weston_desktop_client_create(desktop, client, NULL, &wl_shell_interface, -+ &weston_desktop_wl_shell_implementation, -+ version, id); -+} -+ -+struct wl_global * -+weston_desktop_wl_shell_create(struct weston_desktop *desktop, -+ struct wl_display *display) -+{ -+ return wl_global_create(display, -+ &wl_shell_interface, -+ WD_WL_SHELL_PROTOCOL_VERSION, desktop, -+ weston_desktop_wl_shell_bind); -+} -diff --git a/meson.build b/meson.build -index 53dd670b..a6b2cb61 100644 ---- a/meson.build -+++ b/meson.build -@@ -137,6 +137,12 @@ if dep_xkbcommon.version().version_compare('>= 0.5.0') - config_h.set('HAVE_XKBCOMMON_COMPOSE', '1') - endif - -+if get_option('deprecated-wl-shell') -+ warning('Support for the deprecated wl_shell interface is enabled.') -+ warning('This feature will be removed in a future version.') -+ config_h.set('HAVE_DEPRECATED_WL_SHELL', '1') -+endif -+ - dep_wayland_server = dependency('wayland-server', version: '>= 1.20.0') - dep_wayland_client = dependency('wayland-client', version: '>= 1.20.0') - dep_pixman = dependency('pixman-1', version: '>= 0.25.2') -diff --git a/meson_options.txt b/meson_options.txt -index 643c6d61..cb833c2d 100644 ---- a/meson_options.txt -+++ b/meson_options.txt -@@ -144,6 +144,13 @@ option( - description: 'Weston desktop shell: default helper client selection' - ) - -+option( -+ 'deprecated-wl-shell', -+ type: 'boolean', -+ value: false, -+ description: 'Enable the deprecated wl_shell protocol' -+) -+ - option( - 'color-management-lcms', - type: 'boolean', - diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.4.imx/0002-Revert-libweston-libinput-device-Enable-Set-pointer-.patch b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.4.imx/0002-Revert-libweston-libinput-device-Enable-Set-pointer-.patch deleted file mode 100644 index fc3292e43..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.4.imx/0002-Revert-libweston-libinput-device-Enable-Set-pointer-.patch +++ /dev/null @@ -1,92 +0,0 @@ -From: Haihua Hu -Date: Wed, 3 Aug 2022 16:34:47 +0800 -Subject: [PATCH] Revert "libweston/libinput-device: Enable/Set pointer - capabilities only on pointer movement" - -This reverts commit e825fe389ebd63470028abd828019840c1170a03. - -This commit will cause waylandsink cannot register pointer seat. -As a result, mouse cannot move waylandsink window - -Upstream-Status: Inappropriate [DEY specific] - -(cherry picked from commit 3f8f336b5d2cf7ea7aa4e047d669d093fc46dfe6) ---- - libweston/libinput-device.c | 29 +++++------------------------ - 1 file changed, 5 insertions(+), 24 deletions(-) - -diff --git a/libweston/libinput-device.c b/libweston/libinput-device.c -index 31b88ac4..207d0075 100644 ---- a/libweston/libinput-device.c -+++ b/libweston/libinput-device.c -@@ -67,21 +67,6 @@ evdev_led_update(struct evdev_device *device, enum weston_led weston_leds) - libinput_device_led_update(device->device, leds); - } - --static void --ensure_pointer_capability(struct libinput_device *libinput_device) --{ -- struct evdev_device *device = libinput_device_get_user_data(libinput_device); -- struct weston_seat *seat = device->seat; -- -- if (!libinput_device_has_capability(libinput_device, LIBINPUT_DEVICE_CAP_POINTER)) -- return; -- -- if (!(device->seat_caps & EVDEV_SEAT_POINTER)) { -- weston_seat_init_pointer(seat); -- device->seat_caps |= EVDEV_SEAT_POINTER; -- } --} -- - static void - handle_keyboard_key(struct libinput_device *libinput_device, - struct libinput_event_keyboard *keyboard_event) -@@ -119,8 +104,6 @@ handle_pointer_motion(struct libinput_device *libinput_device, - struct timespec time; - double dx_unaccel, dy_unaccel; - -- ensure_pointer_capability(libinput_device); -- - timespec_from_usec(&time, - libinput_event_pointer_get_time_usec(pointer_event)); - dx_unaccel = libinput_event_pointer_get_dx_unaccelerated(pointer_event); -@@ -152,8 +135,6 @@ handle_pointer_motion_absolute( - double x, y; - uint32_t width, height; - -- ensure_pointer_capability(libinput_device); -- - if (!output) - return false; - -@@ -184,8 +165,6 @@ handle_pointer_button(struct libinput_device *libinput_device, - libinput_event_pointer_get_seat_button_count(pointer_event); - struct timespec time; - -- ensure_pointer_capability(libinput_device); -- - /* Ignore button events that are not seat wide state changes. */ - if ((button_state == LIBINPUT_BUTTON_STATE_PRESSED && - seat_button_count != 1) || -@@ -264,8 +243,6 @@ handle_pointer_axis(struct libinput_device *libinput_device, - bool has_vert, has_horiz; - struct timespec time; - -- ensure_pointer_capability(libinput_device); -- - has_vert = libinput_event_pointer_has_axis(pointer_event, - LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL); - has_horiz = libinput_event_pointer_has_axis(pointer_event, -@@ -1025,7 +1002,11 @@ evdev_device_create(struct libinput_device *libinput_device, - - device->seat_caps |= EVDEV_SEAT_KEYBOARD; - } -- -+ if (libinput_device_has_capability(libinput_device, -+ LIBINPUT_DEVICE_CAP_POINTER)) { -+ weston_seat_init_pointer(seat); -+ device->seat_caps |= EVDEV_SEAT_POINTER; -+ } - if (libinput_device_has_capability(libinput_device, - LIBINPUT_DEVICE_CAP_TOUCH)) { - if (weston_seat_init_touch(seat) < 0) { diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.4.imx/0003-Revert-g2d-renderer-Support-solid-colour-weston_buff.patch b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.5.imx/0003-Revert-g2d-renderer-Support-solid-colour-weston_buff.patch similarity index 99% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.4.imx/0003-Revert-g2d-renderer-Support-solid-colour-weston_buff.patch rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.5.imx/0003-Revert-g2d-renderer-Support-solid-colour-weston_buff.patch index 20cd57306..67f821943 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.4.imx/0003-Revert-g2d-renderer-Support-solid-colour-weston_buff.patch +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston-12.0.5.imx/0003-Revert-g2d-renderer-Support-solid-colour-weston_buff.patch @@ -20,7 +20,7 @@ Signed-off-by: Isaac Hermida 1 file changed, 3 insertions(+), 55 deletions(-) diff --git a/libweston/renderer-g2d/g2d-renderer.c b/libweston/renderer-g2d/g2d-renderer.c -index ef3aab5df7f6..2e9deda7b821 100644 +index 8442fc5304ac..458912357e7e 100644 --- a/libweston/renderer-g2d/g2d-renderer.c +++ b/libweston/renderer-g2d/g2d-renderer.c @@ -124,8 +124,6 @@ struct g2d_output_state { diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_12.0.4.imx.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_12.0.5.imx.bbappend similarity index 73% rename from meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_12.0.4.imx.bbappend rename to meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_12.0.5.imx.bbappend index d900420a1..89dca484d 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_12.0.4.imx.bbappend +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-graphics/wayland/weston_12.0.5.imx.bbappend @@ -2,13 +2,9 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${BP}:" SRC_URI += " \ - file://0001-Restore-wl_shell-to-weston-12.patch \ - file://0002-Revert-libweston-libinput-device-Enable-Set-pointer-.patch \ file://0003-Revert-g2d-renderer-Support-solid-colour-weston_buff.patch \ " -EXTRA_OEMESON += "-Ddeprecated-wl-shell=true" - # This package is already in RRECOMMENDS, but it doesn't get included in the # SDK due to it being a soft dependency from a complementary package. Make it a # hard dependency so it gets included. diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch deleted file mode 100644 index 029b80e17..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 3bc5d48257032b6bbee532aad15062fbbcc43bfe Mon Sep 17 00:00:00 2001 -From: Andrey Zhizhikin -Date: Mon, 27 Jan 2020 10:22:35 +0000 -Subject: [PATCH] opencv: resolve missing opencv data dir in yocto build - -When Yocto build is performed, opencv searches for data dir using simple -'test' command, this fails because pkg-config provides an absolute -path on the target which needs to be prepended by PKG_CONFIG_SYSROOT_DIR -in order for the 'test' utility to pick up the absolute path. - -Upstream-Status: Inappropriate [OE-specific] - -Signed-off-by: Andrey Zhizhikin -Signed-off-by: Jose Quaresma - ---- - ext/opencv/meson.build | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/ext/opencv/meson.build b/ext/opencv/meson.build -index 1d86b90..b5c8b95 100644 ---- a/ext/opencv/meson.build -+++ b/ext/opencv/meson.build -@@ -87,6 +87,9 @@ if opencv_found - opencv_prefix = opencv_dep.get_variable('prefix') - gstopencv_cargs += ['-DOPENCV_PREFIX="' + opencv_prefix + '"'] - -+ pkgconf_sysroot = run_command(python3, '-c', 'import os; print(os.environ.get("PKG_CONFIG_SYSROOT_DIR"))').stdout().strip() -+ opencv_prefix = pkgconf_sysroot + opencv_prefix -+ - # Check the data dir used by opencv for its xml data files - # Use prefix from pkg-config to be compatible with cross-compilation - r = run_command('test', '-d', opencv_prefix + '/share/opencv', check: false) diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.24.7.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.24.7.imx.bb deleted file mode 100644 index cbf2101c7..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.24.7.imx.bb +++ /dev/null @@ -1,224 +0,0 @@ -# This recipe is for the i.MX fork of gstreamer1.0-plugins-bad. For ease of -# maintenance, the top section is a verbatim copy of an OE-core -# recipe. The second section customizes the recipe for i.MX. - -########### OE-core copy ################## -# Upstream hash: 937817e5164f8af8452aec03ae3c45cb23d63df9 - -require recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc -require recipes-multimedia/gstreamer/gstreamer1.0-plugins-license.inc - -SUMMARY = "'Bad' GStreamer plugins and helper libraries " -HOMEPAGE = "https://gstreamer.freedesktop.org/" -BUGTRACKER = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues" - -SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-${PV}.tar.xz \ - file://0001-fix-maybe-uninitialized-warnings-when-compiling-with.patch \ - file://0002-avoid-including-sys-poll.h-directly.patch \ - file://0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch \ - " -SRC_URI[sha256sum] = "e64e75cdafd7ff2fc7fc34e855b06b1e3ed227cc06fa378d17bbcd76780c338c" - -S = "${WORKDIR}/gst-plugins-bad-${PV}" - -LICENSE = "LGPL-2.1-or-later & GPL-2.0-or-later" -LIC_FILES_CHKSUM = "file://COPYING;md5=4fbd65380cdd255951079008b364516c" - -DEPENDS += "gstreamer1.0-plugins-base" - -inherit gobject-introspection - -PACKAGECONFIG ??= " \ - ${GSTREAMER_ORC} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} \ - ${@bb.utils.filter('DISTRO_FEATURES', 'directfb vulkan x11', d)} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '', d)} \ - ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gl', '', d)} \ - bz2 closedcaption curl dash dtls hls openssl sbc smoothstreaming \ - sndfile ttml uvch264 webp \ - ${@bb.utils.contains('TUNE_FEATURES', 'mx32', '', 'rsvg', d)} \ -" - -PACKAGECONFIG[aom] = "-Daom=enabled,-Daom=disabled,aom" -PACKAGECONFIG[assrender] = "-Dassrender=enabled,-Dassrender=disabled,libass" -PACKAGECONFIG[avtp] = "-Davtp=enabled,-Davtp=disabled,libavtp" -PACKAGECONFIG[bluez] = "-Dbluez=enabled,-Dbluez=disabled,bluez5" -PACKAGECONFIG[bz2] = "-Dbz2=enabled,-Dbz2=disabled,bzip2" -PACKAGECONFIG[closedcaption] = "-Dclosedcaption=enabled,-Dclosedcaption=disabled,pango cairo" -PACKAGECONFIG[curl] = "-Dcurl=enabled,-Dcurl=disabled,curl" -PACKAGECONFIG[dash] = "-Ddash=enabled,-Ddash=disabled,libxml2" -PACKAGECONFIG[dc1394] = "-Ddc1394=enabled,-Ddc1394=disabled,libdc1394" -PACKAGECONFIG[directfb] = "-Ddirectfb=enabled,-Ddirectfb=disabled,directfb" -PACKAGECONFIG[dtls] = "-Ddtls=enabled,-Ddtls=disabled,openssl" -PACKAGECONFIG[faac] = "-Dfaac=enabled,-Dfaac=disabled,faac" -PACKAGECONFIG[faad] = "-Dfaad=enabled,-Dfaad=disabled,faad2" -PACKAGECONFIG[fluidsynth] = "-Dfluidsynth=enabled,-Dfluidsynth=disabled,fluidsynth" -PACKAGECONFIG[hls] = "-Dhls=enabled,-Dhls=disabled," -# Pick atleast one crypto backend below when enabling hls -PACKAGECONFIG[nettle] = "-Dhls-crypto=nettle,,nettle" -PACKAGECONFIG[openssl] = "-Dhls-crypto=openssl,,openssl" -PACKAGECONFIG[gcrypt] = "-Dhls-crypto=libgcrypt,,libgcrypt" -# the gl packageconfig enables OpenGL elements that haven't been ported -# to -base yet. They depend on the gstgl library in -base, so we do -# not add GL dependencies here, since these are taken care of in -base. -PACKAGECONFIG[gl] = "-Dgl=enabled,-Dgl=disabled," -PACKAGECONFIG[kms] = "-Dkms=enabled,-Dkms=disabled,libdrm" -PACKAGECONFIG[libde265] = "-Dlibde265=enabled,-Dlibde265=disabled,libde265" -PACKAGECONFIG[libssh2] = "-Dcurl-ssh2=enabled,-Dcurl-ssh2=disabled,libssh2" -PACKAGECONFIG[lcms2] = "-Dcolormanagement=enabled,-Dcolormanagement=disabled,lcms" -PACKAGECONFIG[modplug] = "-Dmodplug=enabled,-Dmodplug=disabled,libmodplug" -PACKAGECONFIG[msdk] = "-Dmsdk=enabled -Dmfx_api=oneVPL,-Dmsdk=disabled,onevpl-intel-gpu" -PACKAGECONFIG[neon] = "-Dneon=enabled,-Dneon=disabled,neon" -PACKAGECONFIG[openal] = "-Dopenal=enabled,-Dopenal=disabled,openal-soft" -PACKAGECONFIG[opencv] = "-Dopencv=enabled,-Dopencv=disabled,opencv" -PACKAGECONFIG[openh264] = "-Dopenh264=enabled,-Dopenh264=disabled,openh264" -PACKAGECONFIG[openjpeg] = "-Dopenjpeg=enabled,-Dopenjpeg=disabled,openjpeg" -PACKAGECONFIG[openmpt] = "-Dopenmpt=enabled,-Dopenmpt=disabled,libopenmpt" -# the opus encoder/decoder elements are now in the -base package, -# but the opus parser remains in -bad -PACKAGECONFIG[opusparse] = "-Dopus=enabled,-Dopus=disabled,libopus" -PACKAGECONFIG[resindvd] = "-Dresindvd=enabled,-Dresindvd=disabled,libdvdread libdvdnav" -PACKAGECONFIG[rsvg] = "-Drsvg=enabled,-Drsvg=disabled,librsvg" -PACKAGECONFIG[rtmp] = "-Drtmp=enabled,-Drtmp=disabled,rtmpdump" -PACKAGECONFIG[sbc] = "-Dsbc=enabled,-Dsbc=disabled,sbc" -PACKAGECONFIG[sctp] = "-Dsctp=enabled,-Dsctp=disabled" -PACKAGECONFIG[smoothstreaming] = "-Dsmoothstreaming=enabled,-Dsmoothstreaming=disabled,libxml2" -PACKAGECONFIG[sndfile] = "-Dsndfile=enabled,-Dsndfile=disabled,libsndfile1" -PACKAGECONFIG[srt] = "-Dsrt=enabled,-Dsrt=disabled,srt" -PACKAGECONFIG[srtp] = "-Dsrtp=enabled,-Dsrtp=disabled,libsrtp" -PACKAGECONFIG[tinyalsa] = "-Dtinyalsa=enabled,-Dtinyalsa=disabled,tinyalsa" -PACKAGECONFIG[ttml] = "-Dttml=enabled,-Dttml=disabled,libxml2 pango cairo" -PACKAGECONFIG[uvch264] = "-Duvch264=enabled,-Duvch264=disabled,libusb1 libgudev" -# this enables support for stateless V4L2 mem2mem codecs, which is a newer form of -# V4L2 codec; the V4L2 code in -base supports the older stateful V4L2 mem2mem codecs -PACKAGECONFIG[v4l2codecs] = "-Dv4l2codecs=enabled,-Dv4l2codecs=disabled,libgudev" -PACKAGECONFIG[va] = "-Dva=enabled,-Dva=disabled,libva" -PACKAGECONFIG[voaacenc] = "-Dvoaacenc=enabled,-Dvoaacenc=disabled,vo-aacenc" -PACKAGECONFIG[voamrwbenc] = "-Dvoamrwbenc=enabled,-Dvoamrwbenc=disabled,vo-amrwbenc" -PACKAGECONFIG[vulkan] = "-Dvulkan=enabled,-Dvulkan=disabled,vulkan-loader shaderc-native" -PACKAGECONFIG[wayland] = "-Dwayland=enabled,-Dwayland=disabled,wayland-native wayland wayland-protocols libdrm" -PACKAGECONFIG[webp] = "-Dwebp=enabled,-Dwebp=disabled,libwebp" -PACKAGECONFIG[webrtc] = "-Dwebrtc=enabled,-Dwebrtc=disabled,libnice" -PACKAGECONFIG[webrtcdsp] = "-Dwebrtcdsp=enabled,-Dwebrtcdsp=disabled,webrtc-audio-processing" -PACKAGECONFIG[zbar] = "-Dzbar=enabled,-Dzbar=disabled,zbar" -PACKAGECONFIG[x11] = "-Dx11=enabled,-Dx11=disabled,libxcb libxkbcommon" -PACKAGECONFIG[x265] = "-Dx265=enabled,-Dx265=disabled,x265" - -GSTREAMER_GPL = "${@bb.utils.filter('PACKAGECONFIG', 'faad resindvd x265', d)}" - -EXTRA_OEMESON += " \ - -Ddoc=disabled \ - -Daes=enabled \ - -Dcodecalpha=enabled \ - -Ddecklink=enabled \ - -Ddvb=enabled \ - -Dfbdev=enabled \ - -Dipcpipeline=enabled \ - -Dshm=enabled \ - -Dtranscode=enabled \ - -Dandroidmedia=disabled \ - -Dapplemedia=disabled \ - -Dasio=disabled \ - -Dbs2b=disabled \ - -Dchromaprint=disabled \ - -Dd3dvideosink=disabled \ - -Dd3d11=disabled \ - -Ddirectsound=disabled \ - -Ddts=disabled \ - -Dfdkaac=disabled \ - -Dflite=disabled \ - -Dgme=disabled \ - -Dgs=disabled \ - -Dgsm=disabled \ - -Diqa=disabled \ - -Dkate=disabled \ - -Dladspa=disabled \ - -Dldac=disabled \ - -Dlv2=disabled \ - -Dmagicleap=disabled \ - -Dmediafoundation=disabled \ - -Dmicrodns=disabled \ - -Dmpeg2enc=disabled \ - -Dmplex=disabled \ - -Dmusepack=disabled \ - -Dnvcodec=disabled \ - -Dopenexr=disabled \ - -Dopenni2=disabled \ - -Dopenaptx=disabled \ - -Dopensles=disabled \ - -Donnx=disabled \ - -Dqroverlay=disabled \ - -Dsoundtouch=disabled \ - -Dspandsp=disabled \ - -Dsvthevcenc=disabled \ - -Dteletext=disabled \ - -Dwasapi=disabled \ - -Dwasapi2=disabled \ - -Dwildmidi=disabled \ - -Dwinks=disabled \ - -Dwinscreencap=disabled \ - -Dwpe=disabled \ - -Dzxing=disabled \ -" - -export OPENCV_PREFIX = "${STAGING_DIR_TARGET}${prefix}" - -ARM_INSTRUCTION_SET:armv4 = "arm" -ARM_INSTRUCTION_SET:armv5 = "arm" - -FILES:${PN}-freeverb += "${datadir}/gstreamer-1.0/presets/GstFreeverb.prs" -FILES:${PN}-opencv += "${datadir}/gst-plugins-bad/1.0/opencv*" -FILES:${PN}-transcode += "${datadir}/gstreamer-1.0/encoding-profiles" -FILES:${PN}-voamrwbenc += "${datadir}/gstreamer-1.0/presets/GstVoAmrwbEnc.prs" - - -########### End of OE-core copy ########### - -########### i.MX overrides ################ - -DEFAULT_PREFERENCE = "-1" - -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=69333daa044cb77e486cc36129f7a770" - -SRC_URI:remove = "https://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-${PV}.tar.xz \ - file://0001-fix-maybe-uninitialized-warnings-when-compiling-with.patch \ - file://0002-avoid-including-sys-poll.h-directly.patch \ - file://0004-opencv-resolve-missing-opencv-data-dir-in-yocto-buil.patch \ - " -SRC_URI:prepend = "${GST1.0-PLUGINS-BAD_SRC};branch=${SRCBRANCH} " -GST1.0-PLUGINS-BAD_SRC ?= "gitsm://github.com/nxp-imx/gst-plugins-bad.git;protocol=https" -SRCBRANCH = "MM_04.09.02_2410_L6.6.y" -SRCREV = "bba296b75dfb3e7ae4c836255edbd2b3c085c269" - -S = "${WORKDIR}/git" - -inherit use-imx-headers - -PACKAGE_ARCH:imxpxp = "${MACHINE_SOCARCH}" -PACKAGE_ARCH:mx8-nxp-bsp = "${MACHINE_SOCARCH}" - -PACKAGECONFIG_REMOVE ?= " \ - dtls vulkan \ - ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', '', 'gl', d)} \ -" -PACKAGECONFIG:remove = "${PACKAGECONFIG_REMOVE}" -PACKAGECONFIG:append:mx8-nxp-bsp = " kms tinycompress" - -PACKAGECONFIG:append = " ${PACKAGECONFIG_G2D}" -PACKAGECONFIG_G2D ??= "" -PACKAGECONFIG_G2D:imxgpu2d ??= "g2d" - -PACKAGECONFIG[g2d] = ",,virtual/libg2d" -PACKAGECONFIG[tinycompress] = "-Dtinycompress=enabled,-Dtinycompress=disabled,tinycompress" - -EXTRA_OEMESON += " \ - -Dc_args="${CFLAGS} -I${STAGING_INCDIR_IMX}" \ -" - -EXTRA_OEMESON:remove = " \ - -Dkate=disabled \ -" - -COMPATIBLE_MACHINE = "(imx-nxp-bsp)" - -########### End of i.MX overrides ######### diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.24.7.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.24.7.imx.bb deleted file mode 100644 index f1f69c173..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.24.7.imx.bb +++ /dev/null @@ -1,146 +0,0 @@ -# This recipe is for the i.MX fork of gstreamer1.0-plugins-base. For ease of -# maintenance, the top section is a verbatim copy of an OE-core -# recipe. The second section customizes the recipe for i.MX. - -########### OE-core copy ################## -# Upstream hash: 937817e5164f8af8452aec03ae3c45cb23d63df9 - -require recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc - -SUMMARY = "'Base' GStreamer plugins and helper libraries" -HOMEPAGE = "https://gstreamer.freedesktop.org/" -BUGTRACKER = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/issues" -LICENSE = "LGPL-2.1-or-later" -LIC_FILES_CHKSUM = "file://COPYING;md5=69333daa044cb77e486cc36129f7a770" - -SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-${PV}.tar.xz \ - file://0001-ENGR00312515-get-caps-from-src-pad-when-query-caps.patch \ - file://0003-viv-fb-Make-sure-config.h-is-included.patch \ - file://0002-ssaparse-enhance-SSA-text-lines-parsing.patch \ - " -SRC_URI[sha256sum] = "edd4338b45c26a9af28c0d35aab964a024c3884ba6f520d8428df04212c8c93a" - -S = "${WORKDIR}/gst-plugins-base-${PV}" - -DEPENDS += "iso-codes util-linux zlib" - -inherit gobject-introspection - -# opengl packageconfig factored out to make it easy for distros -# and BSP layers to choose OpenGL APIs/platforms/window systems -PACKAGECONFIG_X11 = "${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'opengl glx', '', d)}" -PACKAGECONFIG_GL ?= "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl ${PACKAGECONFIG_X11}', '', d)}" - -PACKAGECONFIG ??= " \ - ${GSTREAMER_ORC} \ - ${PACKAGECONFIG_GL} \ - ${@bb.utils.filter('DISTRO_FEATURES', 'alsa x11', d)} \ - jpeg ogg pango png theora vorbis \ - ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland egl', '', d)} \ -" - -OPENGL_APIS = 'opengl gles2' -OPENGL_PLATFORMS = 'egl glx' - -X11DEPENDS = "virtual/libx11 libsm libxrender libxv" -X11ENABLEOPTS = "-Dx11=enabled -Dxvideo=enabled -Dxshm=enabled" -X11DISABLEOPTS = "-Dx11=disabled -Dxvideo=disabled -Dxshm=disabled" - -PACKAGECONFIG[alsa] = "-Dalsa=enabled,-Dalsa=disabled,alsa-lib" -PACKAGECONFIG[cdparanoia] = "-Dcdparanoia=enabled,-Dcdparanoia=disabled,cdparanoia" -PACKAGECONFIG[graphene] = "-Dgl-graphene=enabled,-Dgl-graphene=disabled,graphene" -PACKAGECONFIG[jpeg] = "-Dgl-jpeg=enabled,-Dgl-jpeg=disabled,jpeg" -PACKAGECONFIG[ogg] = "-Dogg=enabled,-Dogg=disabled,libogg" -PACKAGECONFIG[opus] = "-Dopus=enabled,-Dopus=disabled,libopus" -PACKAGECONFIG[pango] = "-Dpango=enabled,-Dpango=disabled,pango" -PACKAGECONFIG[png] = "-Dgl-png=enabled,-Dgl-png=disabled,libpng" -# This enables Qt5 QML examples in -base. The Qt5 GStreamer -# qmlglsink and qmlglsrc plugins still exist in -good. -PACKAGECONFIG[qt5] = "-Dqt5=enabled,-Dqt5=disabled,qtbase qtdeclarative qtbase-native" -PACKAGECONFIG[theora] = "-Dtheora=enabled,-Dtheora=disabled,libtheora" -PACKAGECONFIG[tremor] = "-Dtremor=enabled,-Dtremor=disabled,tremor" -PACKAGECONFIG[visual] = "-Dlibvisual=enabled,-Dlibvisual=disabled,libvisual" -PACKAGECONFIG[vorbis] = "-Dvorbis=enabled,-Dvorbis=disabled,libvorbis" -PACKAGECONFIG[x11] = "${X11ENABLEOPTS},${X11DISABLEOPTS},${X11DEPENDS}" - -# OpenGL API packageconfigs -PACKAGECONFIG[opengl] = ",,virtual/libgl libglu" -PACKAGECONFIG[gles2] = ",,virtual/libgles2" - -# OpenGL platform packageconfigs -PACKAGECONFIG[egl] = ",,virtual/egl" -PACKAGECONFIG[glx] = ",,virtual/libgl" - -# OpenGL window systems (except for X11) -PACKAGECONFIG[gbm] = ",,virtual/libgbm libgudev libdrm" -PACKAGECONFIG[wayland] = ",,wayland-native wayland wayland-protocols libdrm" -PACKAGECONFIG[dispmanx] = ",,virtual/libomxil" -PACKAGECONFIG[viv-fb] = ",,virtual/libgles2 virtual/libg2d" - -OPENGL_WINSYS = "${@bb.utils.filter('PACKAGECONFIG', 'x11 gbm wayland dispmanx egl viv-fb', d)}" - -EXTRA_OEMESON += " \ - -Ddoc=disabled \ - ${@get_opengl_cmdline_list('gl_api', d.getVar('OPENGL_APIS'), d)} \ - ${@get_opengl_cmdline_list('gl_platform', d.getVar('OPENGL_PLATFORMS'), d)} \ - ${@get_opengl_cmdline_list('gl_winsys', d.getVar('OPENGL_WINSYS'), d)} \ -" - -FILES:${PN}-dev += "${libdir}/gstreamer-1.0/include/gst/gl/gstglconfig.h" -FILES:${MLPREFIX}libgsttag-1.0 += "${datadir}/gst-plugins-base/1.0/license-translations.dict" - -def get_opengl_cmdline_list(switch_name, options, d): - selected_options = [] - if bb.utils.contains('DISTRO_FEATURES', 'opengl', True, False, d): - for option in options.split(): - if bb.utils.contains('PACKAGECONFIG', option, True, False, d): - selected_options += [option] - if selected_options: - return '-D' + switch_name + '=' + ','.join(selected_options) - else: - return '' - -CVE_PRODUCT += "gst-plugins-base" - -########### End of OE-core copy ########### - -########### i.MX overrides ################ - -DEFAULT_PREFERENCE = "-1" - -LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=69333daa044cb77e486cc36129f7a770" - -SRC_URI:remove = " \ - https://gstreamer.freedesktop.org/src/gst-plugins-base/gst-plugins-base-${PV}.tar.xz \ - file://0001-ENGR00312515-get-caps-from-src-pad-when-query-caps.patch \ - file://0003-viv-fb-Make-sure-config.h-is-included.patch \ - file://0002-ssaparse-enhance-SSA-text-lines-parsing.patch" -SRC_URI:prepend = "${GST1.0-PLUGINS-BASE_SRC};branch=${SRCBRANCH} " - -GST1.0-PLUGINS-BASE_SRC ?= "gitsm://github.com/nxp-imx/gst-plugins-base.git;protocol=https" -SRCBRANCH = "MM_04.09.02_2410_L6.6.y" -SRCREV = "031d262e65333e58b2ce01aaf47ab1012f93b21e" - -S = "${WORKDIR}/git" - -inherit use-imx-headers - -PACKAGECONFIG:remove = "${PACKAGECONFIG_REMOVE}" -PACKAGECONFIG_REMOVE ?= "jpeg" - -PACKAGECONFIG:append = " ${PACKAGECONFIG_G2D}" -PACKAGECONFIG_G2D ??= "" -PACKAGECONFIG_G2D:imxgpu2d ??= "g2d" - -PACKAGECONFIG[g2d] = ",,virtual/libg2d" -PACKAGECONFIG[viv-fb] = ",,virtual/libgles2" - -EXTRA_OEMESON += "-Dc_args="${CFLAGS} -I${STAGING_INCDIR_IMX}"" - -# links with imx-gpu libs which are pre-built for glibc -# gcompat will address it during runtime -LDFLAGS:append:imxgpu:libc-musl = " -Wl,--allow-shlib-undefined" - -COMPATIBLE_MACHINE = "(imx-nxp-bsp)" - -########### End of i.MX overrides ######### diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.24.7.imx.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.24.7.imx.bbappend deleted file mode 100644 index 528d7e1a3..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base_1.24.7.imx.bbappend +++ /dev/null @@ -1,17 +0,0 @@ -PACKAGECONFIG_GL:imxgpu2d = \ - "${@bb.utils.contains('DISTRO_FEATURES', 'opengl x11', 'opengl', '', d)}" -PACKAGECONFIG_GL:imxgpu3d = \ - "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl', '', d)}" -PACKAGECONFIG_GL:use-mainline-bsp = \ - "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'gles2 egl gbm', '', d)}" - -# The i.MX8 uses KMS instead of the Vivante specific framebuffer API. -# The i.MX7 does not have a GPU, except for ULP. -# This leaves the i.MX6 - with the vendor BSP - as the remaining use case for viv-fb. -# -# (Note that viv-fb is about the _windowing system_. Vivante direct texture support -# does not depend on the viv-fb feature. It used to, but that was actually a bug -# which was fixed in GStreamer 1.22.5. Since then, the direct texture support is -# detected by Meson by checking for direct texture symbols like "glTexDirectVIV".) -PACKAGECONFIG_GL:imxgpu2d:append:mx6-nxp-bsp = " viv-fb" -PACKAGECONFIG_GL:imxgpu2d:append:mx7-nxp-bsp = " viv-fb" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_%.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_%.bbappend index 1de57bfd2..e2f98dbe5 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_%.bbappend +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_%.bbappend @@ -1,3 +1,7 @@ -# Copyright (C) 2021, Digi International Inc. +# Copyright (C) 2021-2025, Digi International Inc. + +# override meta-freescale/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.24.7.imx.bb +GLIBC_64BIT_TIME_FLAGS:arm:imx-nxp-bsp = " -D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64" +INSANE_SKIP:remove:imx-nxp-bsp = "32bit-time" PACKAGECONFIG:append:ccimx6ul = " vpx" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.24.7.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.24.7.imx.bb deleted file mode 100644 index 1147c563a..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good_1.24.7.imx.bb +++ /dev/null @@ -1,121 +0,0 @@ -# This recipe is for the i.MX fork of gstreamer1.0-plugins-good. For ease of -# maintenance, the top section is a verbatim copy of an OE-core -# recipe. The second section customizes the recipe for i.MX. - -########### OE-core copy ################## -# Upstream hash: 937817e5164f8af8452aec03ae3c45cb23d63df9 - -require recipes-multimedia/gstreamer/gstreamer1.0-plugins-common.inc - -SUMMARY = "'Good' GStreamer plugins" -HOMEPAGE = "https://gstreamer.freedesktop.org/" -BUGTRACKER = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/issues" - -SRC_URI = "https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-${PV}.tar.xz \ - file://0001-qt-include-ext-qt-gstqtgl.h-instead-of-gst-gl-gstglf.patch \ - file://0001-v4l2-Define-ioctl_req_t-for-posix-linux-case.patch" - -SRC_URI[sha256sum] = "b67b31313a54c6929b82969d41d3cfdf2f58db573fb5f491e6bba5d84aea0778" - -S = "${WORKDIR}/gst-plugins-good-${PV}" - -LICENSE = "LGPL-2.1-or-later" -LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \ - file://gst/replaygain/rganalysis.c;beginline=1;endline=23;md5=b60ebefd5b2f5a8e0cab6bfee391a5fe" - -DEPENDS += "gstreamer1.0-plugins-base libcap zlib" -RPROVIDES:${PN}-pulseaudio += "${PN}-pulse" -RPROVIDES:${PN}-soup += "${PN}-souphttpsrc" -RDEPENDS:${PN}-soup += "${MLPREFIX}${@bb.utils.contains('PACKAGECONFIG', 'soup2', 'libsoup-2.4', 'libsoup', d)}" - -PACKAGECONFIG_SOUP ?= "soup3" - -PACKAGECONFIG ??= " \ - ${GSTREAMER_ORC} \ - ${PACKAGECONFIG_SOUP} \ - ${@bb.utils.filter('DISTRO_FEATURES', 'pulseaudio x11', d)} \ - ${@bb.utils.contains('TUNE_FEATURES', 'm64', 'asm', '', d)} \ - bz2 cairo flac gdk-pixbuf gudev jpeg lame libpng mpg123 speex taglib v4l2 \ -" - -X11DEPENDS = "virtual/libx11 libsm libxrender libxfixes libxdamage" -X11ENABLEOPTS = "-Dximagesrc=enabled -Dximagesrc-xshm=enabled -Dximagesrc-xfixes=enabled -Dximagesrc-xdamage=enabled" -X11DISABLEOPTS = "-Dximagesrc=disabled -Dximagesrc-xshm=disabled -Dximagesrc-xfixes=disabled -Dximagesrc-xdamage=disabled" - -QT5WAYLANDDEPENDS = "${@bb.utils.contains("DISTRO_FEATURES", "wayland", "qtwayland", "", d)}" - -PACKAGECONFIG[asm] = "-Dasm=enabled,-Dasm=disabled,nasm-native" -PACKAGECONFIG[bz2] = "-Dbz2=enabled,-Dbz2=disabled,bzip2" -PACKAGECONFIG[cairo] = "-Dcairo=enabled,-Dcairo=disabled,cairo" -PACKAGECONFIG[dv1394] = "-Ddv1394=enabled,-Ddv1394=disabled,libiec61883 libavc1394 libraw1394" -PACKAGECONFIG[flac] = "-Dflac=enabled,-Dflac=disabled,flac" -PACKAGECONFIG[gdk-pixbuf] = "-Dgdk-pixbuf=enabled,-Dgdk-pixbuf=disabled,gdk-pixbuf" -PACKAGECONFIG[gtk] = "-Dgtk3=enabled,-Dgtk3=disabled,gtk+3" -PACKAGECONFIG[gudev] = "-Dv4l2-gudev=enabled,-Dv4l2-gudev=disabled,libgudev" -PACKAGECONFIG[jack] = "-Djack=enabled,-Djack=disabled,jack" -PACKAGECONFIG[jpeg] = "-Djpeg=enabled,-Djpeg=disabled,jpeg" -PACKAGECONFIG[lame] = "-Dlame=enabled,-Dlame=disabled,lame" -PACKAGECONFIG[libpng] = "-Dpng=enabled,-Dpng=disabled,libpng" -PACKAGECONFIG[libv4l2] = "-Dv4l2-libv4l2=enabled,-Dv4l2-libv4l2=disabled,v4l-utils" -PACKAGECONFIG[mpg123] = "-Dmpg123=enabled,-Dmpg123=disabled,mpg123" -PACKAGECONFIG[pulseaudio] = "-Dpulse=enabled,-Dpulse=disabled,pulseaudio" -PACKAGECONFIG[qt5] = "-Dqt5=enabled,-Dqt5=disabled,qtbase qtdeclarative qtbase-native ${QT5WAYLANDDEPENDS}" -PACKAGECONFIG[soup2] = "-Dsoup=enabled,,libsoup-2.4,,,soup3" -PACKAGECONFIG[soup3] = "-Dsoup=enabled,,libsoup,,,soup2" -PACKAGECONFIG[speex] = "-Dspeex=enabled,-Dspeex=disabled,speex" -PACKAGECONFIG[rpi] = "-Drpicamsrc=enabled,-Drpicamsrc=disabled,userland" -PACKAGECONFIG[taglib] = "-Dtaglib=enabled,-Dtaglib=disabled,taglib" -PACKAGECONFIG[v4l2] = "-Dv4l2=enabled -Dv4l2-probe=true,-Dv4l2=disabled -Dv4l2-probe=false" -PACKAGECONFIG[vpx] = "-Dvpx=enabled,-Dvpx=disabled,libvpx" -PACKAGECONFIG[wavpack] = "-Dwavpack=enabled,-Dwavpack=disabled,wavpack" -PACKAGECONFIG[x11] = "${X11ENABLEOPTS},${X11DISABLEOPTS},${X11DEPENDS}" - -EXTRA_OEMESON += " \ - -Ddoc=disabled \ - -Daalib=disabled \ - -Ddirectsound=disabled \ - -Ddv=disabled \ - -Dlibcaca=disabled \ - -Doss=enabled \ - -Doss4=disabled \ - -Dosxaudio=disabled \ - -Dosxvideo=disabled \ - -Dshout2=disabled \ - -Dtwolame=disabled \ - -Dwaveform=disabled \ -" - -FILES:${PN}-equalizer += "${datadir}/gstreamer-1.0/presets/*.prs" - -########### End of OE-core copy ########### - -########### i.MX overrides ################ - -DEFAULT_PREFERENCE = "-1" - -LIC_FILES_CHKSUM = " \ - file://LICENSE.txt;md5=69333daa044cb77e486cc36129f7a770 \ - file://gst/replaygain/rganalysis.c;beginline=1;endline=23;md5=b60ebefd5b2f5a8e0cab6bfee391a5fe \ -" -# Enable pulsesink in gstreamer -PACKAGECONFIG:append = " pulseaudio" - -# fb implementation of v4l2 uses libdrm -DEPENDS += "${@bb.utils.contains('PACKAGECONFIG', 'v4l2', '${DEPENDS_V4L2}', '', d)}" -DEPENDS_V4L2 = "${@bb.utils.contains_any('DISTRO_FEATURES', 'wayland x11', '', 'libdrm', d)}" - -SRC_URI:remove = "https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-${PV}.tar.xz \ - file://0001-qt-include-ext-qt-gstqtgl.h-instead-of-gst-gl-gstglf.patch \ - file://0001-v4l2-Define-ioctl_req_t-for-posix-linux-case.patch \ -" - -SRC_URI:prepend = "${GST1.0-PLUGINS-GOOD_SRC};branch=${SRCBRANCH} " -GST1.0-PLUGINS-GOOD_SRC ?= "gitsm://github.com/nxp-imx/gst-plugins-good.git;protocol=https" -SRCBRANCH = "MM_04.09.02_2410_L6.6.y" -SRCREV = "33b2732b873758a302064818b35dcad41b5bbc14" - -S = "${WORKDIR}/git" - -COMPATIBLE_MACHINE = "(imx-nxp-bsp)" - -########### End of i.MX overrides ######### diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0/run-ptest b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0/run-ptest deleted file mode 100755 index 0cfa955f0..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0/run-ptest +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env sh -gnome-desktop-testing-runner gstreamer diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.24.7.imx.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.24.7.imx.bb deleted file mode 100644 index a17c20f42..000000000 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/gstreamer1.0_1.24.7.imx.bb +++ /dev/null @@ -1,112 +0,0 @@ -# This recipe is for the i.MX fork of gstreamer1.0. For ease of -# maintenance, the top section is a verbatim copy of an OE-core -# recipe. The second section customizes the recipe for i.MX. - -########### OE-core copy ################## -# Upstream hash: 937817e5164f8af8452aec03ae3c45cb23d63df9 - -SUMMARY = "GStreamer 1.0 multimedia framework" -DESCRIPTION = "GStreamer is a multimedia framework for encoding and decoding video and sound. \ -It supports a wide range of formats including mp3, ogg, avi, mpeg and quicktime." -HOMEPAGE = "http://gstreamer.freedesktop.org/" -BUGTRACKER = "https://bugzilla.gnome.org/enter_bug.cgi?product=Gstreamer" -SECTION = "multimedia" -LICENSE = "LGPL-2.1-or-later" - -DEPENDS = "glib-2.0 glib-2.0-native libxml2 bison-native flex-native" - -inherit meson pkgconfig gettext upstream-version-is-even gobject-introspection ptest-gnome - -LIC_FILES_CHKSUM = "file://COPYING;md5=69333daa044cb77e486cc36129f7a770 \ - file://gst/gst.h;beginline=1;endline=21;md5=e059138481205ee2c6fc1c079c016d0d" - -S = "${WORKDIR}/gstreamer-${PV}" - -SRC_URI = "https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-${PV}.tar.xz \ - file://run-ptest \ - file://0001-tests-respect-the-idententaion-used-in-meson.patch \ - file://0002-tests-add-support-for-install-the-tests.patch \ - file://0003-tests-use-a-dictionaries-for-environment.patch;striplevel=3 \ - file://0004-tests-add-helper-script-to-run-the-installed_tests.patch;striplevel=3 \ - " -SRC_URI[sha256sum] = "4408d7930f381809e85917acc19712f173261ba85bdf20c5567b2a21b1193b61" - -PACKAGECONFIG ??= "${@bb.utils.contains('PTEST_ENABLED', '1', 'tests', '', d)} \ - check \ - debug \ - tools" - -PACKAGECONFIG[debug] = "-Dgst_debug=true,-Dgst_debug=false" -PACKAGECONFIG[tracer-hooks] = "-Dtracer_hooks=true,-Dtracer_hooks=false" -PACKAGECONFIG[coretracers] = "-Dcoretracers=enabled,-Dcoretracers=disabled" -PACKAGECONFIG[check] = "-Dcheck=enabled,-Dcheck=disabled" -PACKAGECONFIG[tests] = "-Dtests=enabled -Dinstalled_tests=true,-Dtests=disabled -Dinstalled_tests=false" -PACKAGECONFIG[unwind] = "-Dlibunwind=enabled,-Dlibunwind=disabled,libunwind" -PACKAGECONFIG[dw] = "-Dlibdw=enabled,-Dlibdw=disabled,elfutils" -PACKAGECONFIG[bash-completion] = "-Dbash-completion=enabled,-Dbash-completion=disabled,bash-completion" -PACKAGECONFIG[tools] = "-Dtools=enabled,-Dtools=disabled" -PACKAGECONFIG[setcap] = "-Dptp-helper-permissions=capabilities,,libcap libcap-native" - -# TODO: put this in a gettext.bbclass patch -def gettext_oemeson(d): - if d.getVar('USE_NLS') == 'no': - return '-Dnls=disabled' - # Remove the NLS bits if USE_NLS is no or INHIBIT_DEFAULT_DEPS is set - if d.getVar('INHIBIT_DEFAULT_DEPS') and not oe.utils.inherits(d, 'cross-canadian'): - return '-Dnls=disabled' - return '-Dnls=enabled' - -EXTRA_OEMESON += " \ - -Ddoc=disabled \ - -Dexamples=disabled \ - -Ddbghelp=disabled \ - ${@gettext_oemeson(d)} \ -" - -GIR_MESON_ENABLE_FLAG = "enabled" -GIR_MESON_DISABLE_FLAG = "disabled" - -PACKAGES += "${PN}-bash-completion" - -# Add the core element plugins to the main package -FILES:${PN} += "${libdir}/gstreamer-1.0/*.so" -FILES:${PN}-dev += "${libdir}/gstreamer-1.0/*.a ${libdir}/gstreamer-1.0/include" -FILES:${PN}-bash-completion += "${datadir}/bash-completion/completions/ ${datadir}/bash-completion/helpers/gst*" -FILES:${PN}-dbg += "${datadir}/gdb ${datadir}/gstreamer-1.0/gdb" - -RDEPENDS:${PN}-ptest:append:libc-glibc = " glibc-gconv-iso8859-5" - -CVE_PRODUCT = "gstreamer" - -PTEST_BUILD_HOST_FILES = "" - -########### End of OE-core copy ########### - -########### i.MX overrides ################ - -DEFAULT_PREFERENCE = "-1" - -LIC_FILES_CHKSUM = " \ - file://LICENSE.txt;md5=69333daa044cb77e486cc36129f7a770 \ - file://gst/gst.h;beginline=1;endline=21;md5=e059138481205ee2c6fc1c079c016d0d \ -" - -# Use i.MX fork of GST for customizations -SRC_URI:remove = "https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-${PV}.tar.xz \ - file://0001-tests-respect-the-idententaion-used-in-meson.patch \ - file://0002-tests-add-support-for-install-the-tests.patch \ - file://0003-tests-use-a-dictionaries-for-environment.patch;striplevel=3 \ - file://0004-tests-add-helper-script-to-run-the-installed_tests.patch;striplevel=3 \ -" -SRC_URI:prepend = "${GST1.0_SRC};branch=${SRCBRANCH} " -GST1.0_SRC ?= "gitsm://github.com/nxp-imx/gstreamer.git;protocol=https" -SRCBRANCH = "MM_04.09.02_2410_L6.6.y" -SRCREV = "1a8f23da16cd224574ab2386803149c76f2cb628" - -S = "${WORKDIR}/git" - -PACKAGECONFIG[tests] = "-Dtests=enabled,-Dtests=disabled" - -COMPATIBLE_MACHINE = "(imx-nxp-bsp)" - -########### End of i.MX overrides ######### diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend index f972f8e44..12b157e4d 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/gstreamer/imx-gst1.0-plugin_%.bbappend @@ -2,13 +2,8 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" -PV = "4.9.2+git${SRCPV}" - SRC_URI:append:ccimx6ul = " \ file://0001-gstimxv4l2-map-dev-video1-to-dev-fb0.patch \ " -SRCBRANCH = "MM_04.09.02_2410_L6.6.y" -SRCREV = "ef9c1a080e739e6f0be878148d9f4a050dc83bec" - INSANE_SKIP:append:mx6-nxp-bsp = " 32bit-time" diff --git a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe_git.bb b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe_git.bb index f13074469..bd4d2e4f9 100644 --- a/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe_git.bb +++ b/meta-digi-dey/dynamic-layers/freescale-layer/recipes-multimedia/nxp-afe/nxp-afe_git.bb @@ -4,7 +4,7 @@ DESCRIPTION = "NXP Audio Front End (AFE) for incorporating Voice Assistants" LICENSE = "BSD-3-Clause" LIC_FILES_CHKSUM = "file://LICENSE;md5=7bdef19938f3503cfc4c586461f99012" -PV = "1.0+git${SRCPV}" +PV = "1.0+git${SRCPV}" SRCBRANCH = "MM_04.09.02_2410_L6.6.y" NXPAFE_SRC ?= "git://github.com/nxp-imx/nxp-afe.git;protocol=https" diff --git a/meta-digi-dey/dynamic-layers/qt6-layer/NXP/recipes-qt/qt6/qtbase_%.bbappend b/meta-digi-dey/dynamic-layers/qt6-layer/NXP/recipes-qt/qt6/qtbase_%.bbappend index f0732e361..409f64ed5 100644 --- a/meta-digi-dey/dynamic-layers/qt6-layer/NXP/recipes-qt/qt6/qtbase_%.bbappend +++ b/meta-digi-dey/dynamic-layers/qt6-layer/NXP/recipes-qt/qt6/qtbase_%.bbappend @@ -20,6 +20,8 @@ PACKAGECONFIG_PLATFORM_EGLFS:mx9-nxp-bsp = " \ PACKAGECONFIG_VULKAN_IMX_GPU:mx8mm-nxp-bsp = "vulkan" PACKAGECONFIG_VULKAN_IMX_GPU:mx9-nxp-bsp = "vulkan" +PACKAGECONFIG_DEFAULT:remove:ccimx6ul = "icu" + do_install:append () { install -d ${D}${sysconfdir}/profile.d/ install -m 0755 ${WORKDIR}/qt-${IMX_BACKEND}.sh ${D}${sysconfdir}/profile.d/qt.sh diff --git a/meta-digi-dey/dynamic-layers/qt6-layer/recipes-qt/packagegroups/packagegroup-qt6-dey.bb b/meta-digi-dey/dynamic-layers/qt6-layer/recipes-qt/packagegroups/packagegroup-qt6-dey.bb index dae243a25..fa1923bec 100644 --- a/meta-digi-dey/dynamic-layers/qt6-layer/recipes-qt/packagegroups/packagegroup-qt6-dey.bb +++ b/meta-digi-dey/dynamic-layers/qt6-layer/recipes-qt/packagegroups/packagegroup-qt6-dey.bb @@ -1,5 +1,6 @@ # Copyright 2019-20 NXP # Released under the MIT license (see COPYING.MIT for the terms) +# Copyright (C) 2025, Digi International Inc. DESCRIPTION = "Package group for i.MX Qt6" LICENSE = "MIT" @@ -29,11 +30,13 @@ QT6_IMAGE_INSTALL_CINEMATICEXPERIENCE:ccmp25 = "cinematicexperience-rhi cinemati QT6_IMAGE_INSTALL_EXAMPLES = "qtbase-examples qtdeclarative-examples" # Make room in ccmp15-dvk Qt6 images by removing examples QT6_IMAGE_INSTALL_EXAMPLES:ccmp15 = "" +QT6_IMAGE_INSTALL_EXAMPLES:ccimx6ul = "qtbase-examples" QT6_IMAGE_INSTALL_FONTS = "ttf-dejavu-common ttf-dejavu-sans ttf-dejavu-sans-mono ttf-dejavu-serif " QT6_IMAGE_INSTALL_QUICK3D = "qtquick3d qtquick3d-examples" # Quick3d does not work on systems without a proper GPU QT6_IMAGE_INSTALL_QUICK3D:ccimx93 = "" +QT6_IMAGE_INSTALL_QUICK3D:ccimx6ul = "" # Make room in ccmp15-dvk Qt6 images by removing examples QT6_IMAGE_INSTALL_QUICK3D:ccmp15 = "qtquick3d" diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-browser/packagegroups/packagegroup-dey-webkit.bb b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/packagegroups/packagegroup-dey-webkit.bb index 016eb39b1..322ac545f 100644 --- a/meta-digi-dey/dynamic-layers/webkit/recipes-browser/packagegroups/packagegroup-dey-webkit.bb +++ b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/packagegroups/packagegroup-dey-webkit.bb @@ -1,12 +1,12 @@ # -# Copyright (C) 2020-2023, Digi International Inc. +# Copyright (C) 2020-2025, Digi International Inc. # SUMMARY = "WebKit packagegroup for DEY image" PACKAGE_ARCH = "${MACHINE_ARCH}" inherit packagegroup -CC_DEMO_PACKAGE ?= "connectcore-demo-example-webkit-multimedia" +CC_DEMO_PACKAGE ?= "connectcore-demo-example-multimedia connectcore-demo-example-webkit" CC_DEMO_PACKAGE:ccmp1 ?= "connectcore-demo-example-webkit" # Include WPE WebKit, launcher (cog) and examples diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit/0001-Build-fix-when-LAYER_BASED_SVG_ENGINE-is-off.patch b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit-2.44.4/0001-Build-fix-when-LAYER_BASED_SVG_ENGINE-is-off.patch similarity index 100% rename from meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit/0001-Build-fix-when-LAYER_BASED_SVG_ENGINE-is-off.patch rename to meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit-2.44.4/0001-Build-fix-when-LAYER_BASED_SVG_ENGINE-is-off.patch diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit/0001-DMABufVideoSinkGStreamer-disable-sink-unconditionall.patch b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit-2.44.4/0001-DMABufVideoSinkGStreamer-disable-sink-unconditionall.patch similarity index 100% rename from meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit/0001-DMABufVideoSinkGStreamer-disable-sink-unconditionall.patch rename to meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit-2.44.4/0001-DMABufVideoSinkGStreamer-disable-sink-unconditionall.patch diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit/0002-UIProcess-WebProcessPool-always-swap-process-when-us.patch b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit-2.44.4/0002-UIProcess-WebProcessPool-always-swap-process-when-us.patch similarity index 100% rename from meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit/0002-UIProcess-WebProcessPool-always-swap-process-when-us.patch rename to meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit-2.44.4/0002-UIProcess-WebProcessPool-always-swap-process-when-us.patch diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit-2.46.7/0001-UIProcess-WebProcessPool-always-swap-process-when-us.patch b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit-2.46.7/0001-UIProcess-WebProcessPool-always-swap-process-when-us.patch new file mode 100644 index 000000000..7fa2316ad --- /dev/null +++ b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit-2.46.7/0001-UIProcess-WebProcessPool-always-swap-process-when-us.patch @@ -0,0 +1,68 @@ +From: Gabriel Valcazar +Date: Mon, 10 Nov 2025 13:53:41 +0100 +Subject: [PATCH] UIProcess: WebProcessPool: always swap process when using + non-HTTP(S) protocols + +When browsing through a local web application via the file:// protocol, the +same WPEWebProcess is re-used for all pages. Browsing through several memory +intensive pages in a row (especially multimedia) causes the web process to hog +lots of memory, which can cause issues on systems with small RAM sizes. For +example, on ConnectCore platforms with 1 GiB of RAM, opening a WebGL sample +followed by playing a video sometimes causes a kernel panic due to extremely +low CMA memory, which is needed for the video decoding process. + +To avoid this, make sure a new WPEWebProcess is generated each time a page is +opened on non-HTTP(S) protocols such as file://. This adds some loading time +overhead, but it assures that each page's memory is freed when exiting it, +drastically reducing the chances of unexpected behavior. To accomplish this: + + * Set m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol to "true" + to ensure the web process isn't re-used when navigating with a + non-HTTP(S) protocol. The WPE version of WebKit doesn't expose the API + that can change this value at runtime, so simply change the default value + * Skip the same-site navigation check when non-HTTP(S) process swap is + enabled and the protocol is non-HTTP(S). Otherwise, the same web process + will get re-used even if non-HTTP(S) process swap is enabled. + +Signed-off-by: Gabriel Valcazar +--- + .../UIProcess/API/APIProcessPoolConfiguration.h | 2 +- + Source/WebKit/UIProcess/WebProcessPool.cpp | 12 +++++++----- + 2 files changed, 8 insertions(+), 6 deletions(-) + +diff --git a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h +index 1ad5ef05e3a2..f4c7c443a8fe 100644 +--- a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h ++++ b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h +@@ -183,7 +183,7 @@ private: + std::optional m_processSwapsOnNavigationFromClient; + bool m_processSwapsOnNavigationFromExperimentalFeatures { false }; + bool m_alwaysKeepAndReuseSwappedProcesses { false }; +- bool m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol { false }; ++ bool m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol { true }; + std::optional m_isAutomaticProcessWarmingEnabledByClient; + bool m_usesWebProcessCache { false }; + bool m_usesBackForwardCache { true }; +diff --git a/Source/WebKit/UIProcess/WebProcessPool.cpp b/Source/WebKit/UIProcess/WebProcessPool.cpp +index 5bff0cd202db..a5641d0329b3 100644 +--- a/Source/WebKit/UIProcess/WebProcessPool.cpp ++++ b/Source/WebKit/UIProcess/WebProcessPool.cpp +@@ -2122,11 +2122,13 @@ std::tuple, SuspendedPageProxy*, ASCIILiteral> WebProcessPo + if (!m_configuration->processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol() && !sourceURL.protocolIsInHTTPFamily() && sourceURL.protocol() == targetURL.protocol() && !siteIsolationEnabled) + return { WTFMove(sourceProcess), nullptr, "Navigation within the same non-HTTP(s) protocol"_s }; + +- if (!sourceURL.isValid() +- || !targetURL.isValid() +- || sourceURL.isEmpty() +- || (siteIsolationEnabled ? targetSite.matches(sourceURL) : targetSite.domain().matches(sourceURL))) +- return { WTFMove(sourceProcess), nullptr, "Navigation is same-site"_s }; ++ if (sourceURL.protocolIsInHTTPFamily() && sourceURL.protocol() == targetURL.protocol()) { ++ if (!sourceURL.isValid() ++ || !targetURL.isValid() ++ || sourceURL.isEmpty() ++ || (siteIsolationEnabled ? targetSite.matches(sourceURL) : targetSite.domain().matches(sourceURL))) ++ return { WTFMove(sourceProcess), nullptr, "Navigation is same-site"_s }; ++ } + + if (sourceURL.protocolIsAbout()) { + if (sourceProcess->registrableDomain().matches(targetURL)) diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit_2.44.4.bbappend b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit_2.44.4.bbappend index 02094e80c..47370c738 100644 --- a/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit_2.44.4.bbappend +++ b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit_2.44.4.bbappend @@ -1,5 +1,5 @@ # Copyright (C) 2025, Digi International Inc. -FILESEXTRAPATHS:prepend := "${THISDIR}/${BPN}:" +FILESEXTRAPATHS:prepend := "${THISDIR}/${BP}:" # Backport patch to fix build with "lbse" disabled SRC_URI:append = " \ diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit_2.46.7.bbappend b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit_2.46.7.bbappend new file mode 100644 index 000000000..c3a6401c6 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/webkit/recipes-browser/wpewebkit/wpewebkit_2.46.7.bbappend @@ -0,0 +1,6 @@ +# Copyright (C) 2025, Digi International Inc. +FILESEXTRAPATHS:prepend := "${THISDIR}/${BP}:" + +SRC_URI:append = " \ + file://0001-UIProcess-WebProcessPool-always-swap-process-when-us.patch \ +" diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit.bb b/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit.bb deleted file mode 100644 index 89cc68506..000000000 --- a/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit.bb +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (C) 2022-2024, Digi International Inc. - -require recipes-digi/dey-examples/connectcore-demo-example.inc - -WESTON_SERVICE ?= "weston.service" -WESTON_SERVICE:ccmp15 ?= "weston-launch.service" -WESTON_SERVICE:ccmp25 ?= "weston-launch.service" - -CC_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=\$\{DEMO_DISPLAY\}" -CC_DEMO_ENV:ccimx6ul ?= "" - -FILESEXTRAPATHS:prepend := "${THISDIR}/../../../../recipes-digi/dey-examples/connectcore-demo-example:" - -SRC_URI += " \ - file://connectcore-demo-example-init \ - file://connectcore-demo-example.service \ -" - -do_install:append() { - # Install systemd service - if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then - # Install systemd unit files - install -d ${D}${systemd_unitdir}/system - install -m 0644 ${WORKDIR}/connectcore-demo-example.service ${D}${systemd_unitdir}/system/ - sed -i -e "s,##WESTON_SERVICE##,${WESTON_SERVICE},g" \ - "${D}${systemd_unitdir}/system/connectcore-demo-example.service" - fi - - # Install connectcore-demo-example-init - install -d ${D}${sysconfdir}/init.d/ - install -m 755 ${WORKDIR}/connectcore-demo-example-init ${D}${sysconfdir}/connectcore-demo-example - sed -i -e "s@##CC_DEMO_ENV##@${CC_DEMO_ENV}@g" \ - -e "s@##CC_DEMO_DISPLAY##@${WAYLAND_DISPLAY}@g" \ - "${D}${sysconfdir}/connectcore-demo-example" - ln -sf ${sysconfdir}/connectcore-demo-example ${D}${sysconfdir}/init.d/connectcore-demo-example -} - -FILES:${PN}:append = " \ - ${systemd_unitdir}/system/connectcore-demo-example.service \ - ${sysconfdir}/connectcore-demo-example \ - ${sysconfdir}/init.d/connectcore-demo-example \ -" - -RDEPENDS:${PN} += "cog" - -# 'connectcore-demo-example-init' script uses '/etc/init.d/functions' -RDEPENDS:${PN} += "initscripts-functions" - -INITSCRIPT_PACKAGES += "${PN}" -INITSCRIPT_NAME:${PN} = "connectcore-demo-example" -INITSCRIPT_PARAMS:${PN} = "start 19 2 3 4 5 . stop 21 0 1 6 ." - -SYSTEMD_PACKAGES += "${PN}" -SYSTEMD_SERVICE:${PN} = "connectcore-demo-example.service" - -RREPLACES:${PN} = "connectcore-demo-example" -RCONFLICTS:${PN} = "connectcore-demo-example" - -RDEPENDS:${PN}-multimedia += " \ - video-examples \ - webglsamples \ -" diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-digi/dey-examples/connectcore-demo-example.bbappend b/meta-digi-dey/dynamic-layers/webkit/recipes-digi/dey-examples/connectcore-demo-example.bbappend new file mode 100644 index 000000000..c9da326a6 --- /dev/null +++ b/meta-digi-dey/dynamic-layers/webkit/recipes-digi/dey-examples/connectcore-demo-example.bbappend @@ -0,0 +1,50 @@ +# Copyright 2025, Digi International Inc. + +FILESEXTRAPATHS:prepend := "${THISDIR}/connectcore-demo-example:" + +SRC_URI += "\ + file://connectcore-demo-example-webkit-init \ + file://connectcore-demo-example-webkit.service \ +" + +CC_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=\$\{DEMO_DISPLAY\}" +CC_DEMO_ENV:ccimx6ul ?= "" + +WESTON_SERVICE ?= "weston.service" +WESTON_SERVICE:ccmp15 ?= "weston-launch.service" +WESTON_SERVICE:ccmp25 ?= "weston-launch.service" + +do_install:append() { + # Install the webkit systemd unit + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/connectcore-demo-example-webkit.service ${D}${systemd_unitdir}/system/ + sed -i -e "s,##WESTON_SERVICE##,${WESTON_SERVICE},g" \ + ${D}${systemd_unitdir}/system/connectcore-demo-example-webkit.service + fi + + # Install the init script + install -d ${D}${sysconfdir}/init.d/ + install -m 755 ${WORKDIR}/connectcore-demo-example-webkit-init ${D}${sysconfdir}/connectcore-demo-example-webkit + sed -i -e "s@##CC_DEMO_ENV##@${CC_DEMO_ENV}@g" \ + -e "s@##CC_DEMO_DISPLAY##@${WAYLAND_DISPLAY}@g" \ + ${D}${sysconfdir}/connectcore-demo-example-webkit + ln -sf ../connectcore-demo-example-webkit ${D}${sysconfdir}/init.d/ +} + +PACKAGES =+ "${PN}-webkit" + +FILES:${PN}-webkit += "\ + ${systemd_unitdir}/system/connectcore-demo-example-webkit.service \ + ${sysconfdir}/connectcore-demo-example-webkit \ + ${sysconfdir}/init.d/connectcore-demo-example-webkit \ +" + +RDEPENDS:${PN}-webkit = "initscripts-functions" + +INITSCRIPT_PACKAGES += "${PN}-webkit" +INITSCRIPT_NAME:${PN}-webkit = "connectcore-demo-example-webkit" +INITSCRIPT_PARAMS:${PN}-webkit = "start 19 2 3 4 5 . stop 21 0 1 6 ." + +SYSTEMD_PACKAGES += "${PN}-webkit" +SYSTEMD_SERVICE:${PN}-webkit = "connectcore-demo-example-webkit.service" diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit/connectcore-demo-example-init b/meta-digi-dey/dynamic-layers/webkit/recipes-digi/dey-examples/connectcore-demo-example/connectcore-demo-example-webkit-init similarity index 100% rename from meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit/connectcore-demo-example-init rename to meta-digi-dey/dynamic-layers/webkit/recipes-digi/dey-examples/connectcore-demo-example/connectcore-demo-example-webkit-init diff --git a/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit/connectcore-demo-example.service b/meta-digi-dey/dynamic-layers/webkit/recipes-digi/dey-examples/connectcore-demo-example/connectcore-demo-example-webkit.service similarity index 73% rename from meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit/connectcore-demo-example.service rename to meta-digi-dey/dynamic-layers/webkit/recipes-digi/dey-examples/connectcore-demo-example/connectcore-demo-example-webkit.service index bbe9fe677..6ff70d61c 100644 --- a/meta-digi-dey/dynamic-layers/webkit/recipes-digi/connectcore-demo-example-webkit/connectcore-demo-example-webkit/connectcore-demo-example.service +++ b/meta-digi-dey/dynamic-layers/webkit/recipes-digi/dey-examples/connectcore-demo-example/connectcore-demo-example-webkit.service @@ -8,8 +8,8 @@ Requires=##WESTON_SERVICE## [Service] Type=forking -ExecStart=/etc/connectcore-demo-example start -ExecStop=/etc/connectcore-demo-example stop +ExecStart=/etc/connectcore-demo-example-webkit start +ExecStop=/etc/connectcore-demo-example-webkit stop [Install] WantedBy=multi-user.target diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-frameworks/stai-mpu/stai-mpu_6.0.1.bbappend b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-frameworks/stai-mpu/stai-mpu_6.1.%.bbappend similarity index 100% rename from meta-digi-dey/dynamic-layers/x-linux-ai/recipes-frameworks/stai-mpu/stai-mpu_6.0.1.bbappend rename to meta-digi-dey/dynamic-layers/x-linux-ai/recipes-frameworks/stai-mpu/stai-mpu_6.1.%.bbappend diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.12.bbappend b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.12.bbappend new file mode 100644 index 000000000..deece9afc --- /dev/null +++ b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.22.12.bbappend @@ -0,0 +1,5 @@ +# Copyright (C) 2025, Digi International Inc. + +# The "uvcsink" PACKAGECONFIG introduced by meta-st-x-linux-ai is lost due to +# the strict PACKAGECONFIG assignment above, so re-incorporate it here +PACKAGECONFIG:append = "uvcsink" diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/dcmipp-isp-ctrl/dcmipp-isp-ctrl_git.bb b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/dcmipp-isp-ctrl/dcmipp-isp-ctrl_git.bb index fb53f1cab..d393a3f6f 100644 --- a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/dcmipp-isp-ctrl/dcmipp-isp-ctrl_git.bb +++ b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/dcmipp-isp-ctrl/dcmipp-isp-ctrl_git.bb @@ -5,8 +5,8 @@ LIC_FILES_CHKSUM = "file://dcmipp-isp-ctrl/COPYING;md5=f8001cce2bab8ab39ddcb1268 SRC_URI = "git://github.com/STMicroelectronics/st-openstlinux-application.git;protocol=https;branch=main" # Modify these as desired -PV = "5.1+git${SRCPV}" -SRCREV = "a7f953caba8823e601eb85c5e6052b1e81188cd7" +PV = "6.1+git-${@d.getVar("SRCREV")[0:8]}" +SRCREV = "1ab21d8400036235771d70becdcf6f92b665025d" S = "${WORKDIR}/git" diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/image-classification/files/patches/0001-image-classification-remove-weston-user-check-from-l.patch b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/image-classification/files/patches/0001-image-classification-remove-weston-user-check-from-l.patch index 07953017a..2cf572fd1 100644 --- a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/image-classification/files/patches/0001-image-classification-remove-weston-user-check-from-l.patch +++ b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/image-classification/files/patches/0001-image-classification-remove-weston-user-check-from-l.patch @@ -10,7 +10,7 @@ Signed-off-by: David Escalona 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/stai-mpu/launch_python_image_classification.sh b/stai-mpu/launch_python_image_classification.sh -index 3cb5259..afbedf8 100755 +index efd5b19..f3e25aa 100755 --- a/stai-mpu/launch_python_image_classification.sh +++ b/stai-mpu/launch_python_image_classification.sh @@ -5,18 +5,12 @@ @@ -24,7 +24,7 @@ index 3cb5259..afbedf8 100755 echo "stai wrapper used : "$FRAMEWORK CONFIG=$(find /usr/local/x-linux-ai -name "config_board_*.sh") source $CONFIG - cmd="python3 /usr/local/x-linux-ai/image-classification/stai_mpu_image_classification.py -m /usr/local/x-linux-ai/image-classification/models/$IMAGE_CLASSIFICATION_MODEL -l /usr/local/x-linux-ai/image-classification/models/$IMAGE_CLASSIFICATION_LABEL.txt --framerate $DFPS --frame_width $DWIDTH --frame_height $DHEIGHT $OPTIONS" + cmd="python3 /usr/local/x-linux-ai/image-classification/stai_mpu_image_classification.py -m /usr/local/x-linux-ai/image-classification/models/$IMAGE_CLASSIFICATION_MODEL -l /usr/local/x-linux-ai/image-classification/models/$IMAGE_CLASSIFICATION_LABEL.txt --framerate $DFPS --frame_width $DWIDTH --frame_height $DHEIGHT --camera_src $CAMERA_SRC" -if [ "$weston_user" != "root" ]; then - echo "user : "$weston_user diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/object-detection/files/patches/0001-object-detection-remove-weston-user-check-from-launc.patch b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/object-detection/files/patches/0001-object-detection-remove-weston-user-check-from-launc.patch index aa3a07f8f..df7d164cb 100644 --- a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/object-detection/files/patches/0001-object-detection-remove-weston-user-check-from-launc.patch +++ b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/object-detection/files/patches/0001-object-detection-remove-weston-user-check-from-launc.patch @@ -9,7 +9,7 @@ Signed-off-by: David Escalona 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/stai-mpu/launch_python_object_detection.sh b/stai-mpu/launch_python_object_detection.sh -index e460fb3..b595f7f 100755 +index aad8d53..046fb01 100755 --- a/stai-mpu/launch_python_object_detection.sh +++ b/stai-mpu/launch_python_object_detection.sh @@ -5,18 +5,12 @@ @@ -23,7 +23,7 @@ index e460fb3..b595f7f 100755 echo "stai_mpu wrapper used : "$FRAMEWORK CONFIG=$(find /usr/local/x-linux-ai -name "config_board_*.sh") source $CONFIG - cmd="/usr/local/x-linux-ai/object-detection/stai_mpu_object_detection.py -m /usr/local/x-linux-ai/object-detection/models/$OBJ_DETEC_MODEL -l /usr/local/x-linux-ai/object-detection/models/$OBJ_DETEC_MODEL_LABEL.txt --framerate $DFPS --frame_width $DWIDTH --frame_height $DHEIGHT $OPTIONS" + cmd="/usr/local/x-linux-ai/object-detection/stai_mpu_object_detection.py -m /usr/local/x-linux-ai/object-detection/models/$OBJ_DETEC_MODEL -l /usr/local/x-linux-ai/object-detection/models/$OBJ_DETEC_MODEL_LABEL.txt --framerate $DFPS --frame_width $DWIDTH --frame_height $DHEIGHT --camera_src $CAMERA_SRC" -if [ "$weston_user" != "root" ]; then - echo "user : "$weston_user diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/pose-estimation/files/patches/0001-pose-estimation-remove-weston-user-check-from-launch.patch b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/pose-estimation/files/patches/0001-pose-estimation-remove-weston-user-check-from-launch.patch index 27b56f469..2df5aeae8 100644 --- a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/pose-estimation/files/patches/0001-pose-estimation-remove-weston-user-check-from-launch.patch +++ b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/pose-estimation/files/patches/0001-pose-estimation-remove-weston-user-check-from-launch.patch @@ -9,7 +9,7 @@ Signed-off-by: David Escalona 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/stai-mpu/launch_python_pose_estimation.sh b/stai-mpu/launch_python_pose_estimation.sh -index 61952cf..6c8b5b8 100644 +index c1cefd4..43e7892 100644 --- a/stai-mpu/launch_python_pose_estimation.sh +++ b/stai-mpu/launch_python_pose_estimation.sh @@ -5,17 +5,11 @@ @@ -22,7 +22,7 @@ index 61952cf..6c8b5b8 100644 FRAMEWORK=$1 echo "stai wrapper used : "$FRAMEWORK source /usr/local/x-linux-ai/resources/config_board_npu.sh - cmd="python3 /usr/local/x-linux-ai/pose-estimation/stai_mpu_pose_estimation.py -m /usr/local/x-linux-ai/pose-estimation/models/$POSE_ESTIMATION_MODEL --framerate $DFPS --frame_width $DWIDTH --frame_height $DHEIGHT $OPTIONS" + cmd="python3 /usr/local/x-linux-ai/pose-estimation/stai_mpu_pose_estimation.py -m /usr/local/x-linux-ai/pose-estimation/models/$POSE_ESTIMATION_MODEL --framerate $DFPS --frame_width $DWIDTH --frame_height $DHEIGHT --camera_src $CAMERA_SRC" -if [ "$weston_user" != "root" ]; then - echo "user : "$weston_user diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/resources/application-resources.bbappend b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/resources/application-resources.bbappend deleted file mode 100644 index 0b3f5d21e..000000000 --- a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/resources/application-resources.bbappend +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (C) 2024,2025, Digi International Inc. - -FILESEXTRAPATHS:prepend := "${THISDIR}/files:" - -SRC_URI += " \ - file://patches/0002-setup_camera_main_isp-fix-support-for-web-camera.patch \ - file://patches/0003-setup_camera_main_isp-fix-support-for-CSI-DCMIPP-cam.patch \ -" diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/resources/files/patches/0002-setup_camera_main_isp-fix-support-for-web-camera.patch b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/resources/files/patches/0002-setup_camera_main_isp-fix-support-for-web-camera.patch deleted file mode 100644 index 22a2f96dd..000000000 --- a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/resources/files/patches/0002-setup_camera_main_isp-fix-support-for-web-camera.patch +++ /dev/null @@ -1,39 +0,0 @@ -From: Arturo Buzarra -Date: Tue, 21 Jan 2025 12:08:51 +0100 -Subject: [PATCH] setup_camera_main_isp: fix support for web camera - -This commit fixes the logic for detecting internal DCMIPP camera devices and -disables any image post-processing when using USB cameras. - -Signed-off-by: Arturo Buzarra ---- - .../resources/files/resources-files/setup_camera_main_isp.sh | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/resources-files/setup_camera_main_isp.sh b/resources-files/setup_camera_main_isp.sh -index b52ffa2..444bf37 100644 ---- a/resources-files/setup_camera_main_isp.sh -+++ b/resources-files/setup_camera_main_isp.sh -@@ -56,11 +56,11 @@ function is_dcmipp_present() { - - function get_webcam_device() { - found="NOTFOUND" - for video in $(find /sys/class/video4linux -name "video*" -type l | sort); - do -- if [ "$(cat $video/name)" = "dcmipp_main_capture" ] || [ "$(cat $video/name)" = "st,stm32mp25-vdec-dec" ] || [ "$(cat $video/name)" = "st,stm32mp25-venc-enc" ] || [ "$(cat $video/name)" = "dcmipp_dump_capture" ] || [ "$(cat $video/name)" = "dcmipp_aux_capture" ] || [ "$(cat $video/name)" = "dcmipp_main_isp_stat_capture" ] ; then -+ if [ "$(cat $video/name)" = "dcmipp_main_capture" ] || [ "$(cat $video/name)" = "st,stm32mp25-vdec-dec" ] || [ "$(cat $video/name)" = "st,stm32mp25-venc-enc" ] || [ "$(cat $video/name)" = "dcmipp_dump_capture" ] || [ "$(cat $video/name)" = "dcmipp_aux_capture" ] || [ "$(cat $video/name)" = "dcmipp_main_isp_stat_capture" ] || [ "$(cat $video/name)" = "dcmipp_main_isp_params_output" ] ; then - found="FOUND" - else - V4L_DEVICE="$(basename $video)" - break; - fi -@@ -220,6 +220,7 @@ else - V4L2_CAPS="video/x-raw, width=$WIDTH, height=$HEIGHT" - V4L_OPT="io-mode=4" - v4l2-ctl --set-parm=20 - echo "V4L_DEVICE_PREV="$V4L_DEVICE - echo "V4L2_CAPS_PREV="$V4L2_CAPS -+ echo "MAIN_POSTPROC= " - fi --- -2.34.1 diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/resources/files/patches/0003-setup_camera_main_isp-fix-support-for-CSI-DCMIPP-cam.patch b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/resources/files/patches/0003-setup_camera_main_isp-fix-support-for-CSI-DCMIPP-cam.patch deleted file mode 100644 index 64b04d795..000000000 --- a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/resources/files/patches/0003-setup_camera_main_isp-fix-support-for-CSI-DCMIPP-cam.patch +++ /dev/null @@ -1,177 +0,0 @@ -From f15237c3b2eaf73cdf1c1103c32f2373c003e7bb Mon Sep 17 00:00:00 2001 -From: Arturo Buzarra -Date: Mon, 3 Feb 2025 11:53:24 +0100 -Subject: [PATCH] setup_camera_main_isp: fix support for CSI DCMIPP cameras - -This commit fixes the configuration stream for CSI cameras connected to the -internal DCMIPP peripheral, including the following changes: - -- Since the /dev/media* indexes are not guaranteed by the Linux kernel and can - cause errors, this commit hardcodes the DCMIPP node to be used with the - media-ctl command - -- Keep the dynamic check to find the preferred resolution and format for the - IMX335 camera sensor. However, use hardcoded values for the OV5640 sensor, as - it occasionally reports incorrect values, causing capture failures. - -- Add support for applying horizontal mirror (flip) mode to the camera video - image. - -- Print configuration commands to display to the user the settings applied by - the script. - -https://onedigi.atlassian.net/browse/DEL-9486 - -Signed-off-by: Arturo Buzarra ---- - .../resources-files/setup_camera_main_isp.sh | 46 +++++++++++-------- - 1 file changed, 27 insertions(+), 19 deletions(-) - -diff --git a/resources-files/setup_camera_main_isp.sh b/resources-files/setup_camera_main_isp.sh -index 444bf37..466b9b3 100644 ---- a/resources-files/setup_camera_main_isp.sh -+++ b/resources-files/setup_camera_main_isp.sh -@@ -17,13 +17,15 @@ FMTdisplay=RGB16 - FMTnn=RGB - CAMERA_WIDTH=640 - CAMERA_HEIGHT=480 - displaybuscode=RGB565_2X8_LE - nnbuscode=RGB888_1X24 -+MEDIA_DCMIPP="platform:48030000.dcmipp" - - function cmd() { - cmd=$1 -+ echo "${cmd}" - eval $cmd > /dev/null 2>&1 - } - - function is_dcmipp_present() { - DCMIPP_SENSOR="NOTFOUND" -@@ -33,19 +35,18 @@ function is_dcmipp_present() { - if [ "$(cat $video/name)" = "dcmipp_aux_capture" ]; then - V4L_DEVICE_PREV="$(basename $video)" - echo "V4L_DEVICE_PREV="$V4L_DEVICE_PREV - fi - if [ "$(cat $video/name)" = "dcmipp_main_capture" ]; then -- cd $video/device/ -- mediadev=/dev/$(ls -d media*) -- cd - -+ mediadev=${MEDIA_DCMIPP} - for sub in $(find /sys/class/video4linux -name "v4l-subdev*" -type l); - do - subdev_name=$(tr -d '\0' < $sub/name | awk '{print $1}') - if [ "$subdev_name" = "ov5640" ] || [ "$subdev_name" = "imx335" ]; then - DCMIPP_SENSOR=$subdev_name - V4L_DEVICE="$(basename $video)" -+ sensorsubdevnode="$(basename $sub)" - sensorsubdev="$(tr -d '\0' < $sub/name)" - sensordev=$(media-ctl -d $mediadev -p -e "$sensorsubdev" | grep "node name" | awk -F\name '{print $2}') - #interface is connected to input of isp (":1 [ENABLED" with media-ctl -p) - interfacesubdev=$(media-ctl -d $mediadev -p -e "dcmipp_input" | grep ":1 \[ENABLED" | awk -F\" '{print $2}') - fi -@@ -90,20 +91,19 @@ if [ "$DEVICE" != "" ]; then - V4L_DEVICE_PREV="$(basename $video)" - echo "V4L_DEVICE_PREV="$V4L_DEVICE_PREV - fi - done - if [ "$(cat /sys/class/video4linux/$DEVICE/name)" = "dcmipp_dump_capture" ] || [ "$(cat /sys/class/video4linux/$DEVICE/name)" = "dcmipp_main_capture" ] ; then -- cd /sys/class/video4linux/$DEVICE/device/ -- mediadev=/dev/$(ls -d media*) -- cd - -+ mediadev=${MEDIA_DCMIPP} - for sub in $(find /sys/class/video4linux -name "v4l-subdev*" -type l); - do - subdev_name=$(tr -d '\0' < $sub/name | awk '{print $1}') - if [ "$subdev_name" = "imx335" ] || [ "$subdev_name" = "ov5640" ]; then - DCMIPP_SENSOR=$subdev_name - echo "DCMIPP_SENSOR="$DCMIPP_SENSOR - V4L_DEVICE="$(basename $DEVICE)" -+ sensorsubdevnode="$(basename $sub)" - sensorsubdev="$(tr -d '\0' < $sub/name)" - sensordev=$(media-ctl -d $mediadev -p -e "$sensorsubdev" | grep "node name" | awk -F\name '{print $2}') - #interface is connected to input of isp (":1 [ENABLED" with media-ctl -p) - interfacesubdev=$(media-ctl -d $mediadev -p -e "dcmipp_input" | grep ":1 \[ENABLED" | awk -F\" '{print $2}') - fi -@@ -126,12 +126,12 @@ if [ "$DCMIPP_SENSOR" != "NOTFOUND" ]; then - #Use sensor in raw-bayer format - sensorbuscode=`v4l2-ctl --list-subdev-mbus-codes -d $sensordev | grep SRGGB | awk -FMEDIA_BUS_FMT_ '{print $2}'` - - if [ "$DCMIPP_SENSOR" = "ov5640" ]; then - #OV5640 only support 720p with raw-bayer format -- CAMERA_WIDTH=1280 -- CAMERA_HEIGHT=720 -+ SENSORWIDTH=1280 -+ SENSORHEIGHT=720 - #OV5640 claims to support all raw bayer combinations but always output SBGGR8_1X8... - sensorbuscode=SBGGR8_1X8 - elif [ "$DCMIPP_SENSOR" = "imx335" ]; then - if [ $dual_pipe -eq 1 ]; then - aux_postproc=`media-ctl -d $mediadev -e dcmipp_aux_postproc` -@@ -139,21 +139,21 @@ if [ "$DCMIPP_SENSOR" != "NOTFOUND" ]; then - else - main_postproc=`media-ctl -d $mediadev -e dcmipp_main_postproc` - echo "main_postproc="$main_postproc - fi - sensorbuscode=SRGGB10_1X10 -- fi - -- #Let sensor return its prefered resolution & format -- media-ctl -d $mediadev --set-v4l2 "'$sensorsubdev':0[fmt:$sensorbuscode/${SENSORWIDTH}x${SENSORHEIGHT}@1/${FPS} field:none]" > /dev/null 2>&1 -- sensorfmt=`media-ctl -d $mediadev --get-v4l2 "'$sensorsubdev':0" | awk -F"fmt:" '{print $2}' | awk -F" " '{print $1}'` -- SENSORWIDTH=`echo $sensorfmt | awk -F"/" '{print $2}' | awk -F"x" '{print $1}'` -- SENSORHEIGHT=`echo $sensorfmt | awk -F"/" '{print $2}' | awk -F"x" '{print $2}' | awk -F" " '{print $1}' | awk -F"@" '{print $1}'` -+ #Let sensor return its prefered resolution & format -+ sensorfmt=`media-ctl -d $mediadev --get-v4l2 "'$sensorsubdev':0" | awk -F"fmt:" '{print $2}' | awk -F" " '{print $1}'` -+ SENSORWIDTH=`echo $sensorfmt | awk -F"/" '{print $2}' | awk -F"x" '{print $1}'` -+ SENSORHEIGHT=`echo $sensorfmt | awk -F"/" '{print $2}' | awk -F"x" '{print $2}' | awk -F" " '{print $1}' | awk -F"@" '{print $1}'` -+ fi - -- # echo "sensorsubdev="$sensorsubdev -- # echo "interfacesubdev="$interfacesubdev -- # echo "sensorbuscode="$sensorbuscode -+ echo "sensorsubdevnode="$sensorsubdevnode -+ echo "sensorsubdev="$sensorsubdev -+ echo "interfacesubdev="$interfacesubdev -+ echo "sensorbuscode="$sensorbuscode - - if [ $dual_pipe -eq 1 ]; then - #Use main pipe for debayering, scaling and color conversion - echo "Mediacontroller graph:" - -@@ -180,11 +180,15 @@ if [ "$DCMIPP_SENSOR" != "NOTFOUND" ]; then - # Configure Pipe2 PostProcessing to the display resolution - cmd " media-ctl -d $mediadev --set-v4l2 \"'dcmipp_aux_postproc':0[compose:(0,0)/${WIDTH}x${HEIGHT}]\"" - cmd " media-ctl -d $mediadev --set-v4l2 \"'dcmipp_aux_postproc':1[fmt:$displaybuscode/${WIDTH}x${HEIGHT}]\" -v" - echo "" - -- #v4l2-ctl -d /dev/v4l-subdev6 --set-ctrl=horizontal_flip=1 -+ echo "Video4linux driver:" -+ # Use to mirror(flip) the camera video image horizontally -+ cmd " v4l2-ctl -d /dev/$sensorsubdevnode --set-ctrl=horizontal_flip=1" -+ echo "" -+ - V4L2_CAPS_PREV="video/x-raw, format=$FMTdisplay, width=$WIDTH, height=$HEIGHT, framerate=$FPS/1" - V4L2_CAPS_NN="video/x-raw, format=$FMTnn, width=$RQ_NN_WIDTH, height=$RQ_NN_HEIGHT, framerate=$FPS/1" - V4L_OPT="" - echo "V4L_DEVICE_PREV="$V4L_DEVICE_PREV - echo "V4L_DEVICE_NN="$V4L_DEVICE -@@ -201,11 +205,15 @@ if [ "$DCMIPP_SENSOR" != "NOTFOUND" ]; then - cmd " media-ctl -d $mediadev --set-v4l2 \"'dcmipp_main_isp':1[fmt:RGB888_1X24/${SENSORWIDTH}x${SENSORHEIGHT} field:none]\"" - cmd " media-ctl -d $mediadev --set-v4l2 \"'dcmipp_main_postproc':0[compose:(0,0)/${WIDTH}x${HEIGHT}]\"" - cmd " media-ctl -d $mediadev --set-v4l2 \"'dcmipp_main_postproc':1[fmt:$displaybuscode/${WIDTH}x${HEIGHT}]\"" - echo "" - -- #v4l2-ctl -d /dev/v4l-subdev6 --set-ctrl=horizontal_flip=1 -+ echo "Video4linux driver:" -+ # Use to mirror(flip) the camera video image horizontally -+ cmd " v4l2-ctl -d /dev/$sensorsubdevnode --set-ctrl=horizontal_flip=1" -+ echo "" -+ - V4L2_CAPS="video/x-raw, format=$FMTdisplay, width=$WIDTH, height=$HEIGHT" - V4L_OPT="" - echo "V4L_DEVICE_PREV="$V4L_DEVICE - echo "V4L2_CAPS_PREV="$V4L2_CAPS - echo "DCMIPP_SENSOR="$DCMIPP_SENSOR --- -2.34.1 - diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/semantic-segmentation/files/patches/0001-semantic-segmentation-remove-weston-user-check-from-.patch b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/semantic-segmentation/files/patches/0001-semantic-segmentation-remove-weston-user-check-from-.patch index 8910c2339..dea854aa8 100644 --- a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/semantic-segmentation/files/patches/0001-semantic-segmentation-remove-weston-user-check-from-.patch +++ b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/semantic-segmentation/files/patches/0001-semantic-segmentation-remove-weston-user-check-from-.patch @@ -10,10 +10,10 @@ Signed-off-by: David Escalona 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/stai-mpu/launch_python_semantic_segmentation.sh b/stai-mpu/launch_python_semantic_segmentation.sh -index a1c2479..94cd540 100755 +index e5bcb26..dee9b2c 100755 --- a/stai-mpu/launch_python_semantic_segmentation.sh +++ b/stai-mpu/launch_python_semantic_segmentation.sh -@@ -5,17 +5,11 @@ +@@ -5,18 +5,12 @@ # # This software is licensed under terms that can be found in the LICENSE file # in the root directory of this software component. @@ -22,8 +22,9 @@ index a1c2479..94cd540 100755 -weston_user=$(ps aux | grep '/usr/bin/weston '|grep -v 'grep'|awk '{print $1}') FRAMEWORK=$1 echo "stai-mpu wrapper used : "$FRAMEWORK + source /usr/local/x-linux-ai/resources/config_board_npu.sh - cmd="python3 /usr/local/x-linux-ai/semantic-segmentation/stai_mpu_semantic_segmentation.py -m /usr/local/x-linux-ai/semantic-segmentation/models/$SEMANTIC_SEGMENTATION_MODEL -l /usr/local/x-linux-ai/semantic-segmentation/models/$SEMANTIC_SEGMENTATION_LABEL.txt --framerate $DFPS --frame_width $DWIDTH --frame_height $DHEIGHT $OPTIONS" + cmd="python3 /usr/local/x-linux-ai/semantic-segmentation/stai_mpu_semantic_segmentation.py -m /usr/local/x-linux-ai/semantic-segmentation/models/$SEMANTIC_SEGMENTATION_MODEL -l /usr/local/x-linux-ai/semantic-segmentation/models/$SEMANTIC_SEGMENTATION_LABEL.txt --framerate $DFPS --frame_width $DWIDTH --frame_height $DHEIGHT --camera_src $CAMERA_SRC" -if [ "$weston_user" != "root" ]; then - echo "user : "$weston_user diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/semantic-segmentation/files/patches/0002-semantic-segmentation-reduce-font-size-for-big-scree.patch b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/semantic-segmentation/files/patches/0002-semantic-segmentation-reduce-font-size-for-big-scree.patch index faca2235b..f22187d21 100644 --- a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/semantic-segmentation/files/patches/0002-semantic-segmentation-reduce-font-size-for-big-scree.patch +++ b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-samples/semantic-segmentation/files/patches/0002-semantic-segmentation-reduce-font-size-for-big-scree.patch @@ -8,10 +8,12 @@ Signed-off-by: David Escalona 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/stai-mpu/stai_mpu_semantic_segmentation.py b/stai-mpu/stai_mpu_semantic_segmentation.py -index 0c0f242..35b8bea 100644 +index 8252e1c..d0ee636 100644 --- a/stai-mpu/stai_mpu_semantic_segmentation.py +++ b/stai-mpu/stai_mpu_semantic_segmentation.py -@@ -475,8 +475,8 @@ class MainWindow(Gtk.Window): +@@ -347,12 +347,12 @@ class MainWindow(Gtk.Window): + self.ui_icon_exit_size = '50' + self.ui_icon_st_size = '160' self.ui_icon_label_size = '64' elif window_constraint <= 1080: #Display 1920x1080 @@ -22,7 +24,11 @@ index 0c0f242..35b8bea 100644 self.ui_icon_exit_size = '50' self.ui_icon_st_size = '160' self.ui_icon_label_size = '64' -@@ -711,8 +711,8 @@ class OverlayWindow(Gtk.Window): + + def main_ui_creation(self,args): +@@ -583,12 +583,12 @@ class OverlayWindow(Gtk.Window): + self.ui_icon_exit_size = '50' + self.ui_icon_st_size = '160' self.ui_icon_label_size = '64' elif window_constraint <= 1080: #Display 1920x1080 @@ -33,3 +39,5 @@ index 0c0f242..35b8bea 100644 self.ui_icon_exit_size = '50' self.ui_icon_st_size = '160' self.ui_icon_label_size = '64' + + def overlay_ui_creation(self,args): diff --git a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-st/packagegroups/packagegroup-dey-x-linux-ai.bb b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-st/packagegroups/packagegroup-dey-x-linux-ai.bb index a7ce9a6d4..bb5aa4bfd 100644 --- a/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-st/packagegroups/packagegroup-dey-x-linux-ai.bb +++ b/meta-digi-dey/dynamic-layers/x-linux-ai/recipes-st/packagegroups/packagegroup-dey-x-linux-ai.bb @@ -8,6 +8,8 @@ inherit packagegroup python3-dir COMMON_PACKAGES = " \ stai-mpu-tools \ tim-vx-tools \ + libcamera-stm32mp \ + libcamera-stm32mp-gst \ " TFLITE_PACKAGES = " \ diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-init/ccmp1/bluetooth-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-init/ccmp1/bluetooth-init index 1971a47c4..2f9c940e4 100644 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-init/ccmp1/bluetooth-init +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-init/ccmp1/bluetooth-init @@ -40,6 +40,16 @@ bt_power() { gpioset "${GPIO_CHIP}" "${GPIO_NUMBER}"="${1}" } +set_btaddr() { + hciconfig hci0 up + sleep 0.2 + bt_addr=$(echo "$(fw_printenv -n btaddr)" | awk -F ":" '{ for(i=NF;i>=1;i--) printf "0x%s ", $i }') + hcitool -i hci0 cmd 0x3f 0x0001 ${bt_addr} + hciconfig hci0 down + sleep 0.2 + hciconfig hci0 up +} + is_kernel_module_loaded() { lsmod | grep -qs -w "^${MODULE_NAME}" } @@ -57,7 +67,8 @@ bt_init() { # Load manually the kernel module modprobe "${MODULE_NAME}" sleep 1 - is_kernel_module_loaded && log info "Bluetooth activated" && return 0 + # Reconfigure the HCI interface with the expected MAC address + is_kernel_module_loaded && set_btaddr && log info "Bluetooth activated" && return 0 log err "Cannot initialize Bluetooth, retrying..." done diff --git a/meta-digi-dey/recipes-connectivity/bluez/bluez5-init/ccmp2/bluetooth-init b/meta-digi-dey/recipes-connectivity/bluez/bluez5-init/ccmp2/bluetooth-init index 2df3373a1..0a9eaeefa 100644 --- a/meta-digi-dey/recipes-connectivity/bluez/bluez5-init/ccmp2/bluetooth-init +++ b/meta-digi-dey/recipes-connectivity/bluez/bluez5-init/ccmp2/bluetooth-init @@ -29,6 +29,16 @@ bt_power() { gpioset gpiochip11 5="${1}" } +set_btaddr() { + hciconfig hci0 up + sleep 0.2 + bt_addr=$(echo "$(fw_printenv -n btaddr)" | awk -F ":" '{ for(i=NF;i>=1;i--) printf "0x%s ", $i }') + hcitool -i hci0 cmd 0x3f 0x0001 ${bt_addr} + hciconfig hci0 down + sleep 0.2 + hciconfig hci0 up +} + bt_init() { for i in $(seq ${RETRIES}); do # Perform a power cycle @@ -42,8 +52,8 @@ bt_init() { btattach -B /dev/ttySTM1 -P bcm -S 921600 & sleep 2 - # Up the interface to be able to send hci commands - hciconfig hci0 up && log info "OK" && return 0 + # Reconfigure the HCI interface with the expected MAC address + set_btaddr && log info "OK" && return 0 fi log err "FAILED to bring hci0 up, retrying..." killall btattach 2> /dev/null diff --git a/meta-digi-dey/recipes-connectivity/modemmanager/modemmanager/ccimx91/80-mm-net-device-blacklist.rules b/meta-digi-dey/recipes-connectivity/modemmanager/modemmanager/ccimx9/80-mm-net-device-blacklist.rules similarity index 100% rename from meta-digi-dey/recipes-connectivity/modemmanager/modemmanager/ccimx91/80-mm-net-device-blacklist.rules rename to meta-digi-dey/recipes-connectivity/modemmanager/modemmanager/ccimx9/80-mm-net-device-blacklist.rules diff --git a/meta-digi-dey/recipes-connectivity/modemmanager/modemmanager/ccimx93/80-mm-net-device-blacklist.rules b/meta-digi-dey/recipes-connectivity/modemmanager/modemmanager/ccimx93/80-mm-net-device-blacklist.rules deleted file mode 100644 index b5f43b430..000000000 --- a/meta-digi-dey/recipes-connectivity/modemmanager/modemmanager/ccimx93/80-mm-net-device-blacklist.rules +++ /dev/null @@ -1,18 +0,0 @@ -ACTION!="add|change|move|bind", GOTO="mm_net_device_blacklist_end" - -# ModemManager documentation states that the best practice is to use the DEVPATH -# this way rather than other rules such as KERNEL, so be careful when modifying - -# Remove Ethernet interfaces from ModemManager probing -SUBSYSTEM=="net", DEVPATH=="/devices/platform/30be0000.ethernet*", ENV{ID_MM_CANDIDATE}="0", ENV{ID_MM_DEVICE_IGNORE}="1" - -# Remove SPI-to-CAN interface from ModemManager probing -SUBSYSTEM=="net", DEVPATH=="/devices/platform/30840000.ecspi*", ENV{ID_MM_CANDIDATE}="0", ENV{ID_MM_DEVICE_IGNORE}="1" - -# Remove MMC interfaces from ModemManager probing -SUBSYSTEM=="net", DEVPATH=="/devices/platform/30b40000.mmc*", ENV{ID_MM_CANDIDATE}="0", ENV{ID_MM_DEVICE_IGNORE}="1" - -# Remove PCIe interfaces from ModemManager probing -SUBSYSTEM=="net", DEVPATH=="/devices/platform/33800000.pcie*", ENV{ID_MM_CANDIDATE}="0", ENV{ID_MM_DEVICE_IGNORE}="1" - -LABEL="mm_net_device_blacklist_end" diff --git a/meta-digi-dey/recipes-core/images/dey-image-chromium.bb b/meta-digi-dey/recipes-core/images/dey-image-chromium.bb new file mode 100644 index 000000000..6daab2892 --- /dev/null +++ b/meta-digi-dey/recipes-core/images/dey-image-chromium.bb @@ -0,0 +1,9 @@ +# Copyright (C) 2025, Digi International Inc. + +require recipes-core/images/dey-image-graphical.inc + +DESCRIPTION = "DEY image with chromium browser" + +GRAPHICAL_CORE = "chromium" + +COMPATIBLE_MACHINE = "(ccimx95)" diff --git a/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb b/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb index 86b4c9501..7f680feaa 100644 --- a/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb +++ b/meta-digi-dey/recipes-core/images/dey-image-lvgl.bb @@ -1,5 +1,5 @@ # -# Copyright (C) 2023,2024, Digi International Inc. +# Copyright (C) 2023-2025, Digi International Inc. # require dey-image-graphical.inc @@ -10,6 +10,7 @@ GRAPHICAL_CORE = "lvgl" # On the ccimx6ul, the only supported LVGL backend is fbdev, so there is no # need for a X11 desktop environment. IMAGE_FEATURES:remove:ccimx6ul = " x11-base x11-sato " +IMAGE_FEATURES:remove = " weston " # Remove GRAPHICAL_BACKEND suffix (-x11) from ccimx6ul image names DEFAULT_IMAGE_BASENAME:ccimx6ul = "dey-image-${GRAPHICAL_CORE}" 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 e20b04601..d423d45b8 100644 --- a/meta-digi-dey/recipes-core/packagegroups/packagegroup-dey-core.bb +++ b/meta-digi-dey/recipes-core/packagegroups/packagegroup-dey-core.bb @@ -67,15 +67,12 @@ RDEPENDS:${PN} = "\ ${VIRTUAL-RUNTIME_update-alternatives} \ ${MACHINE_ESSENTIAL_EXTRA_RDEPENDS} \ ${MACHINE_EXTRA_RDEPENDS} \ + ${MULTIMEDIA_PKGS} \ " -RDEPENDS:${PN}:append:ccmp15 = " \ - v4l-utils \ -" - -RDEPENDS:${PN}:append:ccmp2 = " \ - v4l-utils \ -" +MULTIMEDIA_PKGS = "v4l-utils" +MULTIMEDIA_PKGS:ccimx91 = "" +MULTIMEDIA_PKGS:ccmp13 = "" # The rootfs in the CC6UL is not big enough for graphic images (QT) and the # connectcore demo, so we restrict the demo only for the 'core-image-base' diff --git a/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/bootcount.c b/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/bootcount.c index ae3c92511..bf3d3800d 100644 --- a/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/bootcount.c +++ b/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/bootcount.c @@ -62,6 +62,7 @@ struct platform_functions platforms_functions[] = { [PLATFORM_CC8X] = {read_bootcount_nvmem, write_bootcount_nvmem}, [PLATFORM_CC91] = {read_bootcount_nvmem, write_bootcount_nvmem}, [PLATFORM_CC93] = {read_bootcount_nvmem, write_bootcount_nvmem}, + [PLATFORM_CC95] = {read_bootcount_nvmem, write_bootcount_nvmem}, [PLATFORM_CCMP13] = {read_bootcount_nvmem, write_bootcount_nvmem}, [PLATFORM_CCMP15] = {read_bootcount_nvmem, write_bootcount_nvmem}, [PLATFORM_CCMP25] = {read_bootcount_nvmem, write_bootcount_nvmem}, diff --git a/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/bootcount_nvmem.c b/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/bootcount_nvmem.c index fa4d7568e..70e57365b 100644 --- a/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/bootcount_nvmem.c +++ b/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/bootcount_nvmem.c @@ -39,6 +39,7 @@ struct platform_nvmem platforms_nvmem[] = { [PLATFORM_CC8X] = {"/sys/bus/i2c/devices/0-0063/nvram", 0, 1}, [PLATFORM_CC91] = {"/sys/bus/i2c/devices/2-0052/rv3028_nvram0/nvmem", 0, 1}, [PLATFORM_CC93] = {"/sys/bus/i2c/devices/2-0052/rv3028_nvram0/nvmem", 0, 1}, + [PLATFORM_CC95] = {"/sys/bus/i2c/devices/2-0052/rv3028_nvram0/nvmem", 0, 1}, [PLATFORM_CCMP13] = {"/sys/bus/i2c/devices/2-0052/rv3028_nvram0/nvmem", 0, 1}, [PLATFORM_CCMP15] = {"/sys/bus/i2c/devices/6-0052/rv3028_nvram0/nvmem", 0, 1}, [PLATFORM_CCMP25] = {"/sys/bus/i2c/devices/0-0052/rv3028_nvram0/nvmem", 0, 1}, diff --git a/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/include/platform_utils.h b/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/include/platform_utils.h index b4e453f51..eb859dc07 100644 --- a/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/include/platform_utils.h +++ b/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/include/platform_utils.h @@ -29,6 +29,7 @@ typedef enum { PLATFORM_CC8X, PLATFORM_CC91, PLATFORM_CC93, + PLATFORM_CC95, PLATFORM_CCMP13, PLATFORM_CCMP15, PLATFORM_CCMP25, diff --git a/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/platform_utils.c b/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/platform_utils.c index eafcc1e54..9af689f4f 100644 --- a/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/platform_utils.c +++ b/meta-digi-dey/recipes-digi/bootcount/bootcount/bootcount-bin/platform_utils.c @@ -31,6 +31,7 @@ char* platform_names[] = { [PLATFORM_CC8X] = "ccimx8x", [PLATFORM_CC91] = "ccimx91", [PLATFORM_CC93] = "ccimx93", + [PLATFORM_CC95] = "ccimx95", [PLATFORM_CCMP13] = "ccmp13", [PLATFORM_CCMP15] = "ccmp15", [PLATFORM_CCMP25] = "ccmp25", diff --git a/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.bb b/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.bb index a3a6045c8..148cd9494 100644 --- a/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.bb +++ b/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.bb @@ -1,3 +1,100 @@ -# Copyright (C) 2022, Digi International Inc. +# Copyright (C) 2022-2025, Digi International Inc. -require connectcore-demo-example.inc +require dey-examples-src.inc + +SUMMARY = "Connectcore demo" +DESCRIPTION = "Connectcore demo" +HOMEPAGE = "https://github.com/digi-embedded/dey-examples" +SECTION = "examples" +LICENSE = "GPL-2.0-only" +LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" + +SRC_URI += "\ + file://connectcore-demo-server-init \ + file://connectcore-demo-server.service \ + file://suspendtarget-connectcore-demo-server.service \ +" +S = "${WORKDIR}/git/connectcore-demo-example" + +do_configure[noexec] = "1" +do_compile[noexec] = "1" + +inherit systemd update-rc.d + +BOARD_IMAGE_FILE ?= "${MACHINE}_board.png" +BOARD_IMAGE_FILE:ccimx6qpsbc ?= "ccimx6sbc_board.png" +BOARD_IMAGE_FILE:ccimx91-dvk ?= "ccimx93-dvk_board.png" + +do_install() { + install -d ${D}${servicedir}/www + \cp --remove-destination -r * ${D}${servicedir}/www/ + + # Remove unused images + find ${D}${servicedir}/www/static/images/ -type f -name '*_board.png' -not -name '${BOARD_IMAGE_FILE}' -delete + + # Install systemd service + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + # Install systemd unit files + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/connectcore-demo-server.service ${D}${systemd_unitdir}/system/ + install -m 0644 ${WORKDIR}/suspendtarget-connectcore-demo-server.service ${D}${systemd_unitdir}/system/ + fi + + # Install connectcore-demo-server-init + install -d ${D}${sysconfdir}/init.d/ + install -m 755 ${WORKDIR}/connectcore-demo-server-init ${D}${sysconfdir}/connectcore-demo-server + ln -sf ${sysconfdir}/connectcore-demo-server ${D}${sysconfdir}/init.d/connectcore-demo-server +} + +PACKAGE_ARCH = "${MACHINE_ARCH}" +PACKAGES =+ "${PN}-server ${PN}-multimedia" + +FILES:${PN} += "\ + ${servicedir}/www/* \ +" + +FILES:${PN}-multimedia += "\ + ${servicedir}/www/multimedia* \ + ${servicedir}/www/static/images/aquarium.jpg \ + ${servicedir}/www/static/images/big_buck_bunny.jpg \ + ${servicedir}/www/static/images/blob.jpg \ + ${servicedir}/www/static/images/cpu.png \ + ${servicedir}/www/static/images/electricflower.jpg \ + ${servicedir}/www/static/images/multiple-views.jpg \ + ${servicedir}/www/static/images/ram.png \ + ${servicedir}/www/static/images/spacerocks.jpg \ + ${servicedir}/www/static/images/toon-shading.jpg \ + ${servicedir}/www/static/js/multimedia.js \ +" + +FILES:${PN}-server += "\ + ${servicedir}/www/demoserver.py \ + ${systemd_unitdir}/system/connectcore-demo-server.service \ + ${systemd_unitdir}/system/suspendtarget-connectcore-demo-server.service \ + ${sysconfdir}/connectcore-demo-server \ + ${sysconfdir}/init.d/connectcore-demo-server \ +" + +RDEPENDS:${PN} = "${PN}-server" +RDEPENDS:${PN}-multimedia = "${PN} video-examples webglsamples" +RDEPENDS:${PN}-server = " \ + busybox-httpd \ + libdigiapix-python3 \ + mpg123 \ + python3-connectcore-ble \ + python3-core \ + python3-httplib2 \ + python3-json \ + python3-logging \ + python3-netserver \ +" + +INITSCRIPT_PACKAGES = "${PN}-server" +INITSCRIPT_NAME:${PN}-server = "connectcore-demo-server" +INITSCRIPT_PARAMS:${PN}-server = "start 20 2 3 4 5 . stop 21 0 1 6 ." + +SYSTEMD_PACKAGES = "${PN}-server" +SYSTEMD_SERVICE:${PN}-server = " \ + connectcore-demo-server.service \ + suspendtarget-connectcore-demo-server.service \ +" diff --git a/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.inc b/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.inc deleted file mode 100644 index 2925c1604..000000000 --- a/meta-digi-dey/recipes-digi/dey-examples/connectcore-demo-example.inc +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright (C) 2022-2024, Digi International Inc. - -require dey-examples-src.inc - -SUMMARY = "Connectcore demo" -DESCRIPTION = "Connectcore demo" -SECTION = "examples" -LICENSE = "GPL-2.0-only" -LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6" - -SRC_URI += " \ - file://connectcore-demo-server-init \ - file://connectcore-demo-server.service \ - file://suspendtarget-connectcore-demo-server.service \ -" - -RDEPENDS:${PN}-server = " \ - busybox-httpd \ - libdigiapix-python3 \ - mpg123 \ - python3-connectcore-ble \ - python3-core \ - python3-httplib2 \ - python3-json \ - python3-logging \ - python3-netserver \ -" - -S = "${WORKDIR}/connectcore-demo-example" - -inherit systemd update-rc.d - -BOARD_IMAGE_FILE ?= "${MACHINE}_board.png" - -# Some boards re-use other boards' images -BOARD_IMAGE_FILE:ccimx6qpsbc = "ccimx6sbc_board.png" -BOARD_IMAGE_FILE:ccimx91-dvk = "ccimx93-dvk_board.png" - -do_install() { - install -d ${D}/srv/www - cp -r ${WORKDIR}/git/connectcore-demo-example/* ${D}/srv/www/ - - # Remove unused images - find ${D}/srv/www/static/images/ -type f -name '*_board.png' -not -name '${BOARD_IMAGE_FILE}' -delete - - # Install systemd service - if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then - # Install systemd unit files - install -d ${D}${systemd_unitdir}/system - install -m 0644 ${WORKDIR}/connectcore-demo-server.service ${D}${systemd_unitdir}/system/ - install -m 0644 ${WORKDIR}/suspendtarget-connectcore-demo-server.service ${D}${systemd_unitdir}/system/ - fi - - # Install connectcore-demo-server-init - install -d ${D}${sysconfdir}/init.d/ - install -m 755 ${WORKDIR}/connectcore-demo-server-init ${D}${sysconfdir}/connectcore-demo-server - ln -sf ${sysconfdir}/connectcore-demo-server ${D}${sysconfdir}/init.d/connectcore-demo-server -} - -PACKAGES =+ "${PN}-server ${PN}-multimedia" - -FILES:${PN} += " \ - /srv/www/* \ -" - -FILES:${PN}-multimedia += " \ - /srv/www/multimedia* \ - /srv/www/static/images/aquarium.jpg \ - /srv/www/static/images/big_buck_bunny.jpg \ - /srv/www/static/images/blob.jpg \ - /srv/www/static/images/cpu.png \ - /srv/www/static/images/electricflower.jpg \ - /srv/www/static/images/multiple-views.jpg \ - /srv/www/static/images/ram.png \ - /srv/www/static/images/spacerocks.jpg \ - /srv/www/static/images/toon-shading.jpg \ - /srv/www/static/js/multimedia.js \ -" - -FILES:${PN}-server = " \ - /srv/www/demoserver.py \ - ${systemd_unitdir}/system/connectcore-demo-server.service \ - ${systemd_unitdir}/system/suspendtarget-connectcore-demo-server.service \ - ${sysconfdir}/connectcore-demo-server \ - ${sysconfdir}/init.d/connectcore-demo-server \ -" - -RDEPENDS:${PN} = "${PN}-server" -RDEPENDS:${PN}-multimedia = "${PN}" - -INITSCRIPT_PACKAGES = "${PN}-server" -INITSCRIPT_NAME:${PN}-server = "connectcore-demo-server" -INITSCRIPT_PARAMS:${PN}-server = "start 20 2 3 4 5 . stop 21 0 1 6 ." - -SYSTEMD_PACKAGES = "${PN}-server" -SYSTEMD_SERVICE:${PN}-server = " \ - connectcore-demo-server.service \ - suspendtarget-connectcore-demo-server.service \ -" - -PACKAGE_ARCH = "${MACHINE_ARCH}" diff --git a/meta-digi-dey/recipes-digi/libdigiapix/libdigiapix-git/ccimx95/libdigiapix.conf b/meta-digi-dey/recipes-digi/libdigiapix/libdigiapix-git/ccimx95/libdigiapix.conf new file mode 100644 index 000000000..85a568c15 --- /dev/null +++ b/meta-digi-dey/recipes-digi/libdigiapix/libdigiapix-git/ccimx95/libdigiapix.conf @@ -0,0 +1,38 @@ +[board] +model = Digi International ConnectCore 95 DVK. + +[GPIO] + +# USER LED1 +USER_LED1 = 43850000.gpio,12 + +# USER_LED2 +USER_LED = 43840000.gpio,23 +USER_LED2 = 43840000.gpio,23 + +# USER BUTTON1 +USER_BUTTON = 43850000.gpio,12 +USER_BUTTON1 = 43850000.gpio,12 + +# USER BUTTON2 +USER_BUTTON2 = 43840000.gpio,23 + +[I2C] + +# I2C-3 on MikroBus connector. +DEFAULT_I2C_BUS = 2 + +[SPI] + +# LPSPI-8 on MikroBus connector J39. +DEFAULT_SPI = 0,0 + +[PWM] + +# PWM0 channel 1 - LVDS backlight. +DEFAULT_PWM = 0,1 + +[ADC] + +# ADC channel 0 - Pin J48-1. +DEFAULT_ADC = 0,0 diff --git a/meta-digi-dey/recipes-digi/swu-images/dey-image-chromium-swu.bb b/meta-digi-dey/recipes-digi/swu-images/dey-image-chromium-swu.bb new file mode 100644 index 000000000..c08c15244 --- /dev/null +++ b/meta-digi-dey/recipes-digi/swu-images/dey-image-chromium-swu.bb @@ -0,0 +1,5 @@ +# Copyright (C) 2025, Digi International Inc. + +require swu.inc + +IMG_NAME = "${@get_baseimg_pn(d)}-${GRAPHICAL_BACKEND}" diff --git a/meta-digi-dey/recipes-digi/swu-images/files/update_rdiff.sh b/meta-digi-dey/recipes-digi/swu-images/files/update_rdiff.sh index c65f630c4..f2733519a 100755 --- a/meta-digi-dey/recipes-digi/swu-images/files/update_rdiff.sh +++ b/meta-digi-dey/recipes-digi/swu-images/files/update_rdiff.sh @@ -170,8 +170,8 @@ validate_base_image() { fs_size=$(( (fs_size + 0xfff) & 0xfffff000 )) local n_blocks=$(( fs_size/BLOCK_SIZE )) local checksum="$(dd if="${ROOTFS_SOURCE_ENDPOINT}" bs="${BLOCK_SIZE}" count="${n_blocks}" 2> /dev/null | sha256sum | cut -d " " -f1)" - - if [ "${checksum}" != "${1}" ]; then + + if [ "${checksum}" != "${1}" ]; then echo "[ERROR] Base image is not the expected one or has been modified. Aborting update..." exit 1 fi diff --git a/meta-digi-dey/recipes-graphics/lvgl/files/0001-lvgl-demo-remove-demo-slideshow.patch b/meta-digi-dey/recipes-graphics/lvgl/files/0001-lvgl-demo-remove-demo-slideshow.patch new file mode 100644 index 000000000..cd1cb4036 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/files/0001-lvgl-demo-remove-demo-slideshow.patch @@ -0,0 +1,29 @@ +From 1ffdfa2d0d36c566006b5b1f24d2a9e68888a5c1 Mon Sep 17 00:00:00 2001 +From: Mike Engel +Date: Tue, 2 Sep 2025 10:21:07 +0200 +Subject: [PATCH] lvgl-demo: remove demo slideshow + +This commit removes the demo slideshow function to +avoid the application changes automatically between +the different taps. + +Signed-off-by: Mike Engel +--- + main.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/main.c b/main.c +index e02cef9..7ec513c 100644 +--- a/main.c ++++ b/main.c +@@ -48,7 +48,6 @@ int main(void) + + /*Create a Demo*/ + lv_demo_widgets(); +- lv_demo_widgets_start_slideshow(); + + /*Handle LVGL tasks*/ + while(1) { +-- +2.51.0 + diff --git a/meta-digi-dey/recipes-graphics/lvgl/files/0003-CMakefile-remove-libdrm-dependency-when-building-fbd.patch b/meta-digi-dey/recipes-graphics/lvgl/files/0003-CMakefile-remove-libdrm-dependency-when-building-fbd.patch new file mode 100644 index 000000000..e1f2bc469 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/files/0003-CMakefile-remove-libdrm-dependency-when-building-fbd.patch @@ -0,0 +1,27 @@ +From 49f99a403e36bb3bb54943d7a351d4aadffe3447 Mon Sep 17 00:00:00 2001 +From: Mike Engel +Date: Wed, 6 Aug 2025 16:59:28 +0200 +Subject: [PATCH] CMakefile: remove libdrm dependency when building fbdev demo + +Signed-off-by: Mike Engel +--- + CMakeLists.txt | 3 --- + 1 file changed, 3 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 658193f..c6a2b85 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -12,9 +12,6 @@ target_include_directories(lvgl PUBLIC ${PROJECT_SOURCE_DIR}) + + add_executable(main main.c mouse_cursor_icon.c) + +-include(${CMAKE_CURRENT_LIST_DIR}/lvgl/tests/FindLibDRM.cmake) +-include_directories(${Libdrm_INCLUDE_DIRS}) +- + find_package(SDL2) + find_package(SDL2_image) + include_directories(${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS}) +-- +2.34.1 + diff --git a/meta-digi-dey/recipes-graphics/lvgl/files/0004-lvgl-demo-add-input-device-discovery-support-to-LVGL.patch b/meta-digi-dey/recipes-graphics/lvgl/files/0004-lvgl-demo-add-input-device-discovery-support-to-LVGL.patch new file mode 100644 index 000000000..1fcfa2d77 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/files/0004-lvgl-demo-add-input-device-discovery-support-to-LVGL.patch @@ -0,0 +1,76 @@ +From d7696f869a014d6fa15e25cf7818e43f3c110acb Mon Sep 17 00:00:00 2001 +From: Mike Engel +Date: Tue, 2 Sep 2025 11:49:32 +0200 +Subject: [PATCH] lvgl-demo: add input device discovery support to LVGL-demo + +This commit adds input device discovery support to the demo. +When input device is a mouse it will create the cursor. + +Signed-off-by: Mike Engel +--- + main.c | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +diff --git a/main.c b/main.c +index ba03f23..f821936 100644 +--- a/main.c ++++ b/main.c +@@ -1,5 +1,6 @@ + #include "lvgl/lvgl.h" + #include "lvgl/demos/lv_demos.h" ++#include "lvgl/src/core/lv_global.h" + #include + #include + #include +@@ -11,6 +12,30 @@ static const char *getenv_default(const char *name, const char *dflt) + return getenv(name) ? : dflt; + } + ++static void indev_deleted_cb(lv_event_t * e) ++{ ++ if(LV_GLOBAL_DEFAULT()->deinit_in_progress) ++ return; ++ lv_obj_t * cursor_obj = lv_event_get_user_data(e); ++ lv_obj_delete(cursor_obj); ++} ++ ++static void discovery_cb(lv_indev_t * indev, lv_evdev_type_t type, void * user_data) ++{ ++ LV_LOG_USER("new '%s' device discovered", type == LV_EVDEV_TYPE_REL ? "REL" : ++ type == LV_EVDEV_TYPE_ABS ? "ABS" : ++ type == LV_EVDEV_TYPE_KEY ? "KEY" : ++ "unknown"); ++ /* if input device is mouse add cursor */ ++ if(type == LV_EVDEV_TYPE_REL) { ++ LV_IMAGE_DECLARE(mouse_cursor_icon); ++ lv_obj_t * cursor_obj = lv_image_create(lv_screen_active()); ++ lv_image_set_src(cursor_obj, &mouse_cursor_icon); ++ lv_indev_set_cursor(indev, cursor_obj); ++ lv_indev_add_event_cb(indev, indev_deleted_cb, LV_EVENT_DELETE, cursor_obj); ++ } ++} ++ + #if LV_USE_LINUX_FBDEV + static void lv_linux_disp_init(void) + { +@@ -18,6 +43,8 @@ static void lv_linux_disp_init(void) + lv_display_t * disp = lv_linux_fbdev_create(); + + lv_linux_fbdev_set_file(disp, device); ++ /* search for input devices */ ++ lv_evdev_discovery_start(discovery_cb, NULL); + } + #elif LV_USE_LINUX_DRM + static void lv_linux_disp_init(void) +@@ -26,6 +53,8 @@ static void lv_linux_disp_init(void) + lv_display_t * disp = lv_linux_drm_create(); + + lv_linux_drm_set_file(disp, device, -1); ++ /* search for input devices */ ++ lv_evdev_discovery_start(discovery_cb, NULL); + } + #elif LV_USE_SDL + static void lv_linux_disp_init(void) +-- +2.51.0 + diff --git a/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init b/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init index f0b3f5b41..e1ac75dd8 100644 --- a/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init +++ b/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init @@ -13,7 +13,7 @@ # #=============================================================================== -readonly DEMO_NAME="lvgl_demo" +readonly DEMO_NAME="lvgl-demo" readonly DEMO_PATH="/usr/bin/${DEMO_NAME}" readonly DEMO_TITLE="LVGL Demo Application" readonly DEMO_DISPLAY="##LVGL_DEMO_DISPLAY##" @@ -109,11 +109,15 @@ start() { case "$1" in start) echo -n "Starting ${DEMO_TITLE}: " + export LV_LINUX_DRM_CARD="##LVGL_CONFIG_DRM_CARD##" + export LV_LINUX_FBDEV_DEVICE="##LVGL_CONFIG_FBDEV_DEVICE##" start echo "done." ;; stop) stop + unset LV_LINUX_DRM_CARD="##LVGL_CONFIG_DRM_CARD##" + unset LV_LINUX_FBDEV_DEVICE="##LVGL_CONFIG_FBDEV_DEVICE##" echo -n "Stopping ${DEMO_TITLE}: " if [ -n "`/bin/pidof ${DEMO_PATH}`" ] ; then echo "FAIL" diff --git a/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init.service b/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init.service index cdf5369d8..6692495db 100644 --- a/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init.service +++ b/meta-digi-dey/recipes-graphics/lvgl/files/lvgl-demo-init.service @@ -1,13 +1,9 @@ [Unit] Description=LVGL Demo Application -# Make sure we are started after graphic service is available -After=##WESTON_SERVICE## -Requires=##WESTON_SERVICE## - [Service] Type=forking -PIDFile=/run/lvgl_demo.pid +PIDFile=/run/lvgl-demo.pid ExecStart=/etc/lvgl-demo-init start ExecStop=/etc/lvgl-demo-init stop diff --git a/meta-digi-dey/recipes-graphics/lvgl/lv-conf.inc b/meta-digi-dey/recipes-graphics/lvgl/lv-conf.inc new file mode 100644 index 000000000..3bc1db338 --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/lv-conf.inc @@ -0,0 +1,105 @@ +# By default, use drm backend if possible. +# If unavailable, fall back to a secondary backend +PACKAGECONFIG ?= "drm" +PACKAGECONFIG:ccimx6ul = "fbdev" +PACKAGECONFIG:ccimx6 = "fbdev" + +PACKAGECONFIG[drm] = ",,libdrm" +PACKAGECONFIG[fbdev] = ",," +PACKAGECONFIG[gridnav] = ",," +PACKAGECONFIG[thorvg] = ",," +PACKAGECONFIG[sdl] = ",,virtual/libsdl2 libsdl2-image" + +# Add libdrm include if drm is selected in PACKAGECONFIG +TARGET_CFLAGS += "${@bb.utils.contains('PACKAGECONFIG', 'drm', '-I${STAGING_INCDIR}/libdrm', '', d)}" + +LVGL_CONFIG_USE_DRM = "${@bb.utils.contains('PACKAGECONFIG', 'drm', '1', '0', d)}" + +LVGL_CONFIG_USE_EVDEV = "${@bb.utils.contains_any('PACKAGECONFIG', 'drm fbdev', '1', '0', d)}" + +LVGL_CONFIG_USE_FBDEV = "${@bb.utils.contains('PACKAGECONFIG', 'fbdev', '1', '0', d)}" + +LVGL_CONFIG_USE_SDL = "${@bb.utils.contains('PACKAGECONFIG', 'sdl', '1', '0', d)}" + +LVGL_CONFIG_SDL_FULLSCREEN ?= "0" + +LVGL_CONFIG_LV_MEM_CUSTOM ?= "0" +LVGL_CONFIG_LV_MEM_SIZE ?= "(64 * 1024U)" +LVGL_CONFIG_LV_COLOR_DEPTH ?= "32" + +LVGL_CONFIG_LV_USE_LOG ?= "0" +LVGL_CONFIG_LV_LOG_LEVEL ?= "LV_LOG_LEVEL_WARN" +LVGL_CONFIG_LV_LOG_PRINTF ?= "0" + +LVGL_CONFIG_LV_USE_FONT_COMPRESSED ?= "0" + +LVGL_CONFIG_LV_USE_GRIDNAV = "${@bb.utils.contains('PACKAGECONFIG', 'gridnav', '1', '0', d)}" + +LVGL_CONFIG_LV_THEME_DEFAULT_DARK ?= "0" + +LVGL_CONFIG_USE_LOTTIE = "${@bb.utils.contains('PACKAGECONFIG', 'thorvg', '1', '0', d)}" + +LVGL_CONFIG_USE_VECTOR_GRAPHICS = "${@bb.utils.contains('PACKAGECONFIG', 'thorvg', '1', '0', d)}" + +LVGL_CONFIG_USE_THORVG_INTERNAL = "${@bb.utils.contains('PACKAGECONFIG', 'thorvg', '1', '0', d)}" + +LVGL_CONFIG_USE_MATRIX = "${@bb.utils.contains('PACKAGECONFIG', 'thorvg', '1', '0', d)}" + +LVGL_CONFIG_USE_FLOAT = "${@bb.utils.contains('PACKAGECONFIG', 'thorvg', '1', '0', d)}" + +DEBUG_BUILD ??= "0" + +ALLOW_EMPTY:${PN} = "1" + +EXTRA_OECMAKE += "-Dinstall:BOOL=ON -DLIB_INSTALL_DIR=${baselib}" + +do_configure:append() { + # If there is a configuration template, start from that + [ -r "${S}/lv_conf_template.h" ] && cp -Lv "${S}/lv_conf_template.h" "${S}/lv_conf.h" + + sed -r -e "s|#if 0 .*Set it to \"1\" to enable content.*|#if 1 // Enabled by ${PN}|" \ + \ + -e "s|^([[:space:]]*#define LV_USE_LINUX_DRM[[:space:]]).*|\1${LVGL_CONFIG_USE_DRM}|" \ + \ + -e "s|^([[:space:]]*#define LV_USE_LINUX_FBDEV[[:space:]]).*|\1${LVGL_CONFIG_USE_FBDEV}|" \ + \ + -e "s|^([[:space:]]*#define LV_USE_SDL[[:space:]]).*|\1${LVGL_CONFIG_USE_SDL}|" \ + -e "s|^([[:space:]]*#define LV_USE_DRAW_SDL[[:space:]]).*|\1${LVGL_CONFIG_USE_SDL}|" \ + -e "s|^([[:space:]]*#define LV_SDL_BUF_COUNT[[:space:]]).*|\1 2|" \ + -e "s|^([[:space:]]*#define LV_SDL_FULLSCREEN[[:space:]]).*|\1${LVGL_CONFIG_SDL_FULLSCREEN}|" \ + \ + -e "s|^([[:space:]]*#define LV_COLOR_DEPTH[[:space:]]).*|\1${LVGL_CONFIG_LV_COLOR_DEPTH}|" \ + -e "s|^([[:space:]]*#define LV_MEM_CUSTOM[[:space:]]).*|\1${LVGL_CONFIG_LV_MEM_CUSTOM}|" \ + -e "s|^([[:space:]]*#define LV_MEM_SIZE[[:space:]]).*|\1${LVGL_CONFIG_LV_MEM_SIZE}|" \ + \ + -e "s|^([[:space:]]*#define LV_TICK_CUSTOM[[:space:]]).*|\1 1|" \ + -e "s|^([[:space:]]*#define LV_TICK_CUSTOM_INCLUDE[[:space:]]).*|\1 |" \ + -e "s|^([[:space:]]*#define LV_TICK_CUSTOM_SYS_TIME_EXPR[[:space:]]).*|extern uint32_t custom_tick_get(void);\n\1 (custom_tick_get())|" \ + \ + -e "s|^([[:space:]]*#define LV_USE_EVDEV[[:space:]]).*|\1${LVGL_CONFIG_USE_EVDEV}|" \ + \ + -e "s|^([[:space:]]*#define LV_USE_ASSERT_NULL[[:space:]]).*|\1${DEBUG_BUILD}|" \ + -e "s|^([[:space:]]*#define LV_USE_ASSERT_MALLOC[[:space:]]).*|\1${DEBUG_BUILD}|" \ + -e "s|^([[:space:]]*#define LV_USE_ASSERT_STYLE[[:space:]]).*|\1${DEBUG_BUILD}|" \ + -e "s|^([[:space:]]*#define LV_USE_ASSERT_MEM_INTEGRITY[[:space:]]).*|\1${DEBUG_BUILD}|" \ + -e "s|^([[:space:]]*#define LV_USE_ASSERT_OBJ[[:space:]]).*|\1${DEBUG_BUILD}|" \ + \ + -e "s|^([[:space:]]*#define LV_USE_LOG[[:space:]]).*|\1${LVGL_CONFIG_LV_USE_LOG}|" \ + -e "s|^([[:space:]]*#define LV_LOG_LEVEL[[:space:]]).*|\1${LVGL_CONFIG_LV_LOG_LEVEL}|" \ + -e "s|^([[:space:]]*#define LV_LOG_PRINTF[[:space:]]).*|\1${LVGL_CONFIG_LV_LOG_PRINTF}|" \ + \ + -e "s|^([[:space:]]*#define LV_USE_FONT_COMPRESSED[[:space:]]).*|\1${LVGL_CONFIG_LV_USE_FONT_COMPRESSED}|" \ + -e "s|^([[:space:]]*#define LV_USE_GRIDNAV[[:space:]]).*|\1${LVGL_CONFIG_LV_USE_GRIDNAV}|" \ + -e "s|^([[:space:]]*#define LV_THEME_DEFAULT_DARK[[:space:]]).*|\1${LVGL_CONFIG_LV_THEME_DEFAULT_DARK}|" \ + \ + -e "s|^([[:space:]]*#define LV_USE_VECTOR_GRAPHIC[[:space:]]).*|\1${LVGL_CONFIG_USE_VECTOR_GRAPHICS}|" \ + -e "s|^([[:space:]]*#define LV_USE_THORVG_INTERNAL[[:space:]]).*|\1${LVGL_CONFIG_USE_THORVG_INTERNAL}|" \ + -e "s|^([[:space:]]*#define LV_USE_MATRIX[[:space:]]).*|\1${LVGL_CONFIG_USE_MATRIX}|" \ + -e "s|^([[:space:]]*#define LV_USE_FLOAT[[:space:]]).*|\1${LVGL_CONFIG_USE_FLOAT}|" \ + \ + -e "s|^([[:space:]]*#define LV_USE_LOTTIE[[:space:]]).*|\1${LVGL_CONFIG_USE_LOTTIE}|" \ + -i "${S}/lv_conf.h" + sed -i -e 's,##LVGL_CONFIG_DRM_CARD##,${LVGL_CONFIG_DRM_CARD},g' \ + -i -e 's,##LVGL_CONFIG_FBDEV_DEVICE##,${LVGL_CONFIG_FBDEV_DEVICE},g' \ + -i ${WORKDIR}/lvgl-demo-init +} diff --git a/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc b/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc deleted file mode 100644 index a66614d60..000000000 --- a/meta-digi-dey/recipes-graphics/lvgl/lv-drivers.inc +++ /dev/null @@ -1,43 +0,0 @@ -PACKAGECONFIG[drm] = ",,libdrm" -PACKAGECONFIG[fbdev] = ",," -PACKAGECONFIG[sdl] = ",,virtual/libsdl2" -PACKAGECONFIG[wayland] = ",,libxkbcommon wayland" - -LVGL_CONFIG_USE_DRM = "${@bb.utils.contains('PACKAGECONFIG', 'drm', '1', '0', d)}" -LVGL_CONFIG_DRM_CARD ?= "/dev/dri/card0" - -LVGL_CONFIG_USE_EVDEV = "${@bb.utils.contains_any('PACKAGECONFIG', 'drm fbdev', '1', '0', d)}" -LVGL_CONFIG_EVDEV_INPUT ?= "/dev/input/mouse0" -LVGL_CONFIG_EVDEV_INPUT:ccimx6ul ?= "/dev/input/touchscreen0" - -LVGL_CONFIG_USE_FBDEV = "${@bb.utils.contains('PACKAGECONFIG', 'fbdev', '1', '0', d)}" - -LVGL_CONFIG_USE_SDL = "${@bb.utils.contains('PACKAGECONFIG', 'sdl', '1', '0', d)}" - -LVGL_CONFIG_USE_WAYLAND = "${@bb.utils.contains('PACKAGECONFIG', 'wayland', '1', '0', d)}" - -ALLOW_EMPTY:${PN} = "1" - -EXTRA_OECMAKE += "-Dinstall:BOOL=ON -DLIB_INSTALL_DIR=${baselib}" - -do_configure:append() { - # If there is a configuration template, start from that - [ -r "${S}/lv_drv_conf_template.h" ] && cp -Lv "${S}/lv_drv_conf_template.h" "${S}/lv_drv_conf.h" - - # Configure the software using sed - sed -e "s|#if 0 .*Set it to \"1\" to enable the content.*|#if 1 // Enabled by ${PN}|g" \ - \ - -e "s|\(^# define USE_DRM \).*|# define USE_DRM ${LVGL_CONFIG_USE_DRM}|g" \ - -e "s|\(^# define DRM_CARD \).*|# define DRM_CARD \"${LVGL_CONFIG_DRM_CARD}\"|g" \ - \ - -e "s|\(^# define USE_EVDEV \).*|# define USE_EVDEV ${LVGL_CONFIG_USE_EVDEV}|g" \ - -e "s|\(^# define EVDEV_NAME \).*|# define EVDEV_NAME \"${LVGL_CONFIG_EVDEV_INPUT}\"|g" \ - \ - -e "s|\(^# define USE_FBDEV \).*|# define USE_FBDEV ${LVGL_CONFIG_USE_FBDEV}|g" \ - \ - -e "s|\(^# define USE_SDL \).*|# define USE_SDL ${LVGL_CONFIG_USE_SDL}|g" \ - \ - -e "s|\(^# define USE_WAYLAND \).*|# define USE_WAYLAND ${LVGL_CONFIG_USE_WAYLAND}|g" \ - \ - -i "${S}/lv_drv_conf.h" -} diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb deleted file mode 100644 index 5af0f2010..000000000 --- a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_8.3.0.bb +++ /dev/null @@ -1,108 +0,0 @@ -SUMMARY = "LVGL Demo Application" -HOMEPAGE = "https://github.com/digi-embedded/lv_port_linux_frame_buffer" -LICENSE = "MIT" -LIC_FILES_CHKSUM = "file://LICENSE;md5=802d3d83ae80ef5f343050bf96cce3a4 \ - file://lv_drivers/LICENSE;md5=d6fc0df890c5270ef045981b516bb8f2 \ - file://lvgl/LICENCE.txt;md5=bf1198c89ae87f043108cea62460b03a" - -SRCBRANCH ?= "dey/master" - -SRC_URI = " \ - gitsm://github.com/digi-embedded/lv_port_linux_frame_buffer.git;branch=${SRCBRANCH};protocol=https \ - file://lvgl-demo-init \ - file://lvgl-demo-init.service \ -" -SRCREV = "0a799d22a5aaf9de18aca428579945a0a9c2c270" - -EXTRA_OEMAKE = "DESTDIR=${D}" - -# By default, use wayland backend if possible. -# If unavailable, fall back to a secondary backend -MINIMAL_BACKEND ?= "fbdev" -MINIMAL_BACKEND:imxdrm = "drm" -MINIMAL_BACKEND:ccmp15 = "sdl" -PACKAGECONFIG = "${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '${MINIMAL_BACKEND}', d)}" - -require lv-drivers.inc - -inherit cmake systemd update-rc.d - -S = "${WORKDIR}/git" - -TARGET_CFLAGS += "-I${STAGING_INCDIR}/libdrm" - -# Change DRM card used for i.MX8-based platforms -LVGL_CONFIG_DRM_CARD:mx8-generic-bsp = "/dev/dri/card1" - -LVGL_CONFIG_HOR_RES ?= "800" -LVGL_CONFIG_VER_RES ?= "480" -LVGL_CONFIG_HOR_RES:ccimx6ul ?= "1280" -LVGL_CONFIG_VER_RES:ccimx6ul ?= "800" - -do_configure:prepend() { - if [ "${LVGL_CONFIG_USE_DRM}" -eq 1 ] ; then - # Add libdrm build dependency - sed -i '/^target_link_libraries/ s@lvgl::drivers@& drm@' "${S}/CMakeLists.txt" - fi - - if [ "${LVGL_CONFIG_USE_SDL}" -eq 1 ] ; then - # Add libsdl build dependency - sed -i '/^target_link_libraries/ s@lvgl::drivers@& SDL2@' "${S}/CMakeLists.txt" - fi - - if [ "${LVGL_CONFIG_USE_WAYLAND}" -eq 1 ] ; then - # Add wayland build dependencies - sed -i '/^target_link_libraries/ s@lvgl::drivers@& wayland-client wayland-cursor xkbcommon@' "${S}/CMakeLists.txt" - fi - - # Configure the app's dimensions - sed -e "s|\(^#define *LV_DRV_DISP_HOR_RES *\).*|\1${LVGL_CONFIG_HOR_RES}|g" \ - -e "s|\(^#define *LV_DRV_DISP_VER_RES *\).*|\1${LVGL_CONFIG_VER_RES}|g" \ - \ - -i "${S}/lv_drv_conf.h" -} - -WESTON_SERVICE ?= "weston.service" -WESTON_SERVICE:ccmp15 ?= "weston-launch.service" -WESTON_SERVICE:ccmp2 ?= "weston-launch.service" - -LVGL_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=\$\{DEMO_DISPLAY\}" -LVGL_DEMO_ENV:ccimx6ul ?= "" - -do_install:append() { - install -d ${D}${bindir} - install -m 0755 ${B}/lvgl_fb ${D}${bindir}/lvgl_demo - - # Install systemd service - if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then - # Install systemd unit files - install -d ${D}${systemd_unitdir}/system - install -m 0644 ${WORKDIR}/lvgl-demo-init.service ${D}${systemd_unitdir}/system/ - sed -i -e "s,##WESTON_SERVICE##,${WESTON_SERVICE},g" \ - "${D}${systemd_unitdir}/system/lvgl-demo-init.service" - fi - - # Install wrapper bootscript to launch LVGL demo on boot - install -d ${D}${sysconfdir}/init.d - install -m 0755 ${WORKDIR}/lvgl-demo-init ${D}${sysconfdir}/lvgl-demo-init - sed -i -e "s@##LVGL_DEMO_DISPLAY##@${WAYLAND_DISPLAY}@g" \ - -e "s@##LVGL_DEMO_ENV##@${LVGL_DEMO_ENV}@g" \ - "${D}${sysconfdir}/lvgl-demo-init" - ln -sf ${sysconfdir}/lvgl-demo-init ${D}${sysconfdir}/init.d/lvgl-demo-init -} - -PACKAGES =+ "${PN}-init" -FILES:${PN}-init = " \ - ${sysconfdir}/lvgl-demo-init \ - ${sysconfdir}/init.d/lvgl-demo-init \ - ${systemd_unitdir}/system/lvgl-demo-init.service \ -" - -INITSCRIPT_PACKAGES += "${PN}-init" -INITSCRIPT_NAME:${PN}-init = "lvgl-demo-init" -INITSCRIPT_PARAMS:${PN}-init = "start 99 3 5 . stop 20 0 1 2 6 ." - -SYSTEMD_PACKAGES = "${PN}-init" -SYSTEMD_SERVICE:${PN}-init = "lvgl-demo-init.service" - -COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x|ccimx93|ccmp15|ccmp2)" diff --git a/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_9.3.0.bb b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_9.3.0.bb new file mode 100644 index 000000000..347bb929a --- /dev/null +++ b/meta-digi-dey/recipes-graphics/lvgl/lvgl-demo_9.3.0.bb @@ -0,0 +1,89 @@ +SUMMARY = "LVGL Demo Application for Framebuffer" +HOMEPAGE = "https://github.com/lvgl/lv_port_linux_frame_buffer" +LICENSE = "MIT" +LIC_FILES_CHKSUM = "file://LICENSE;md5=802d3d83ae80ef5f343050bf96cce3a4 \ + file://lvgl/LICENCE.txt;md5=4570b6241b4fced1d1d18eb691a0e083" + +SRC_URI = "\ + git://github.com/lvgl/lv_port_linux_frame_buffer.git;protocol=https;branch=release/v9.3;name=demo \ + git://github.com/lvgl/lvgl;protocol=https;branch=release/v9.3;name=lvgl;subdir=git/lvgl \ + file://0001-lvgl-demo-remove-demo-slideshow.patch \ + file://0004-lvgl-demo-add-input-device-discovery-support-to-LVGL.patch \ + file://lvgl-demo-init \ + file://lvgl-demo-init.service \ +" + +SRC_URI:append:ccimx6ul = "\ + file://0003-CMakefile-remove-libdrm-dependency-when-building-fbd.patch \ +" + +SRC_URI:append:ccimx6 = "\ + file://0003-CMakefile-remove-libdrm-dependency-when-building-fbd.patch \ +" + +SRCREV_demo = "d07de027a8eb220f4e20f0e1b8be28729332e9ea" +SRCREV_lvgl = "c033a98afddd65aaafeebea625382a94020fe4a7" +SRCREV_FORMAT = "demo_lvgl" + +EXTRA_OEMAKE = "DESTDIR=${D}" + +LVGL_CONFIG_DRM_CARD ?= "/dev/dri/card0" +LVGL_CONFIG_FBDEV_DEVICE ?= "/dev/fb0" +# Change DRM card used for i.MX8-based platforms +LVGL_CONFIG_DRM_CARD:mx8-generic-bsp = "/dev/dri/card1" +LVGL_CONFIG_LV_USE_LOG = "1" +LVGL_CONFIG_LV_LOG_PRINTF = "1" +LVGL_CONFIG_LV_MEM_SIZE = "(256 * 1024U)" +LVGL_CONFIG_LV_USE_FONT_COMPRESSED = "1" + +require lv-conf.inc + +inherit cmake systemd update-rc.d + +S = "${WORKDIR}/git" + +LVGL_DEMO_ENV ?= "DISPLAY=:0.0 XDG_RUNTIME_DIR=/run/user/0 WAYLAND_DISPLAY=\$\{DEMO_DISPLAY\}" +LVGL_DEMO_ENV:ccimx6ul ?= "" + +do_configure:prepend() { + if [ "${LVGL_CONFIG_USE_SDL}" -eq 1 ] ; then + # Add libsdl build dependency, SDL2_image has no cmake file + sed -i '/^target_link_libraries/ s@pthread@& SDL2_image@' "${S}/CMakeLists.txt" + fi +} + +do_install:append() { + install -d ${D}${bindir} + install -m 0755 ${S}/bin/main ${D}${bindir}/lvgl-demo + + # Install systemd service + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + # Install systemd unit files + install -d ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/lvgl-demo-init.service ${D}${systemd_unitdir}/system/ + fi + + # Install wrapper bootscript to launch LVGL demo on boot + install -d ${D}${sysconfdir}/init.d + install -m 0755 ${WORKDIR}/lvgl-demo-init ${D}${sysconfdir}/lvgl-demo-init + sed -i -e "s@##LVGL_DEMO_DISPLAY##@${WAYLAND_DISPLAY}@g" \ + -e "s@##LVGL_DEMO_ENV##@${LVGL_DEMO_ENV}@g" \ + "${D}${sysconfdir}/lvgl-demo-init" + ln -sf ${sysconfdir}/lvgl-demo-init ${D}${sysconfdir}/init.d/lvgl-demo-init +} + +PACKAGES =+ "${PN}-init" +FILES:${PN}-init = " \ + ${sysconfdir}/lvgl-demo-init \ + ${sysconfdir}/init.d/lvgl-demo-init \ + ${systemd_unitdir}/system/lvgl-demo-init.service \ +" + +INITSCRIPT_PACKAGES += "${PN}-init" +INITSCRIPT_NAME:${PN}-init = "lvgl-demo-init" +INITSCRIPT_PARAMS:${PN}-init = "start 99 3 5 . stop 20 0 1 2 6 ." + +SYSTEMD_PACKAGES = "${PN}-init" +SYSTEMD_SERVICE:${PN}-init = "lvgl-demo-init.service" + +COMPATIBLE_MACHINE = "(ccimx6$|ccimx6ul|ccimx8m|ccimx8x|ccimx93|ccimx95|ccmp15|ccmp2)" diff --git a/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-flutter.bb b/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-flutter.bb index 8b0204cf5..45d3c754a 100644 --- a/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-flutter.bb +++ b/meta-digi-dey/recipes-graphics/packagegroups/packagegroup-dey-flutter.bb @@ -13,5 +13,5 @@ RDEPENDS:${PN} += " \ " RDEPENDS:${PN}:append:imxgpu = " \ - imx-gpu-viv \ + ${IMXGPU_GRAPHICS_PROVIDER} \ " diff --git a/meta-digi-dey/recipes-graphics/xorg-xserver/xserver-xf86-config_%.bbappend b/meta-digi-dey/recipes-graphics/xorg-xserver/xserver-xf86-config_%.bbappend index 3fe677b34..4029ee84b 100644 --- a/meta-digi-dey/recipes-graphics/xorg-xserver/xserver-xf86-config_%.bbappend +++ b/meta-digi-dey/recipes-graphics/xorg-xserver/xserver-xf86-config_%.bbappend @@ -1,2 +1,2 @@ -# Append path for freescale layer to include bsp xorg.conf +# Append path for freescale layer to include bsp xorg.conf FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:" diff --git a/sdk/build-github.sh b/sdk/build-github.sh index ea8bb116a..61242c0a7 100755 --- a/sdk/build-github.sh +++ b/sdk/build-github.sh @@ -32,15 +32,11 @@ INHERIT += \"rm_work\" RM_WORK_EXCLUDE += \"dey-image-qt dey-image-webkit linux-dey qtbase u-boot-dey\" " -ZIP_INSTALLER_CFG=" -DEY_IMAGE_INSTALLER = \"1\" -" - SDCARD_FSTYPE=" -IMAGE_FSTYPES:append:ccimx6 = \" sdcard.gz\" -IMAGE_FSTYPES:append:ccimx8x = \" sdcard.gz\" -IMAGE_FSTYPES:append:ccimx8m = \" sdcard.gz\" -IMAGE_FSTYPES:append:ccimx9 = \" sdcard.gz\" +IMAGE_FSTYPES:append:ccimx6 = \" wic.bmap wic.gz\" +IMAGE_FSTYPES:append:ccimx8x = \" wic.bmap wic.gz\" +IMAGE_FSTYPES:append:ccimx8m = \" wic.bmap wic.gz\" +IMAGE_FSTYPES:append:ccimx9 = \" wic.bmap wic.gz\" " SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:-$(date +%s)}" @@ -99,31 +95,6 @@ fetch_all() { rm -f "${FETCH_LOG}" } -# -# In the buildserver we share the state-cache for all the different platforms -# we build in a jenkins job. This may cause problems with some packages that -# have different runtime dependences depending on the platform. -# -# Purge then the state cache of those problematic packages between platform -# builds. -# -purge_sstate() { - local PURGE_PKGS=" \ - packagegroup-dey-audio \ - packagegroup-dey-bluetooth \ - packagegroup-dey-core \ - packagegroup-dey-debug \ - packagegroup-dey-examples \ - packagegroup-dey-gstreamer \ - packagegroup-dey-lvgl \ - packagegroup-dey-network \ - packagegroup-dey-qt \ - packagegroup-dey-webkit \ - packagegroup-dey-wireless \ - " - bitbake -k -c cleansstate "${PURGE_PKGS}" >/dev/null 2>&1 || true -} - # # For a given image recipe print the SWU recipe (if it exists) # @@ -164,6 +135,7 @@ done<<-_EOF_ ccmp25-dvk dey-image-webkit ccimx91-dvk core-image-base ccimx93-dvk dey-image-qt + ccimx95-dvk dey-image-qt _EOF_ # Set default values if not provided by Jenkins @@ -203,9 +175,9 @@ if pushd "${YOCTO_INST_DIR}"; then fi # shellcheck disable=SC2086 yes "" 2>/dev/null | ${REPO} init --no-repo-verify -u ${MANIFEST_URL} ${repo_revision} - ${REPO} --no-pager forall -j4 -p -c 'git clean -fdx' + ${REPO} --no-pager forall --ignore-missing -j4 -p -c 'git clean -fdx' # shellcheck disable=SC2016 - ${REPO} --no-pager forall -j4 -p -c 'git remote prune $(git remote)' || true + ${REPO} --no-pager forall --ignore-missing -j4 -p -c 'git remote prune $(git remote)' || true # shellcheck disable=SC2086 time ${REPO} sync -d ${MAKE_JOBS} popd @@ -241,7 +213,6 @@ for platform in ${DY_PLATFORMS}; do conf/local.conf { printf "%s" "${RM_WORK_CFG}" - printf "%s" "${ZIP_INSTALLER_CFG}" printf "%s" "${SDCARD_FSTYPE}" printf "%s" "${BUILD_TIMESTAMP}" } >> conf/local.conf @@ -256,7 +227,6 @@ for platform in ${DY_PLATFORMS}; do printf "\n[INFO] Building the toolchain for %s.\n" "${platform}" time bitbake -c populate_sdk dey-toolchain fi - purge_sstate ) copy_images "${_this_img_dir}" popd diff --git a/sdk/build.sh b/sdk/build.sh index 73407d508..b34dff420 100755 --- a/sdk/build.sh +++ b/sdk/build.sh @@ -3,7 +3,7 @@ # # build.sh # -# Copyright (C) 2013-2024 by Digi International Inc. +# Copyright (C) 2013-2025 by Digi International Inc. # All rights reserved. # # This program is free software; you can redistribute it and/or modify it @@ -54,15 +54,11 @@ VIGILES_SUBFOLDER_NAME = \"${DY_REVISION}\" INHERIT += \"##VIGILES_BBCLASS##\" " -ZIP_INSTALLER_CFG=" -DEY_IMAGE_INSTALLER = \"1\" -" - SDCARD_FSTYPE=" -IMAGE_FSTYPES:append:ccimx6 = \" sdcard.gz\" -IMAGE_FSTYPES:append:ccimx8x = \" sdcard.gz\" -IMAGE_FSTYPES:append:ccimx8m = \" sdcard.gz\" -IMAGE_FSTYPES:append:ccimx9 = \" sdcard.gz\" +IMAGE_FSTYPES:append:ccimx6 = \" wic.bmap wic.gz\" +IMAGE_FSTYPES:append:ccimx8x = \" wic.bmap wic.gz\" +IMAGE_FSTYPES:append:ccimx8m = \" wic.bmap wic.gz\" +IMAGE_FSTYPES:append:ccimx9 = \" wic.bmap wic.gz\" " SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:-$(date +%s)}" @@ -109,31 +105,6 @@ copy_images() { find "${1}" -type f -not -name MD5SUMS -print0 | xargs -r -0 md5sum | sed -e "s,${1}/,,g" | sort -k2,2 > "${1}"/MD5SUMS } -# -# In the buildserver we share the state-cache for all the different platforms -# we build in a jenkins job. This may cause problems with some packages that -# have different runtime dependences depending on the platform. -# -# Purge then the state cache of those problematic packages between platform -# builds. -# -purge_sstate() { - local PURGE_PKGS=" \ - packagegroup-dey-audio \ - packagegroup-dey-bluetooth \ - packagegroup-dey-core \ - packagegroup-dey-debug \ - packagegroup-dey-examples \ - packagegroup-dey-gstreamer \ - packagegroup-dey-lvgl \ - packagegroup-dey-network \ - packagegroup-dey-qt \ - packagegroup-dey-webkit \ - packagegroup-dey-wireless \ - " - bitbake -k -c cleansstate "${PURGE_PKGS}" >/dev/null 2>&1 || true -} - # # For a given image recipe print the SWU recipe (if it exists) # @@ -194,6 +165,7 @@ done<<-_EOF_ ccmp25-dvk dey-image-qt,dey-image-webkit,dey-image-lvgl,dey-image-flutter ccimx91-dvk core-image-base ccimx93-dvk dey-image-qt,dey-image-lvgl + ccimx95-dvk dey-image-qt,dey-image-chromium,dey-image-lvgl,dey-image-flutter _EOF_ # Set default values if not provided by Jenkins @@ -203,6 +175,7 @@ YOCTO_IMGS_DIR="${WORKSPACE}/images" YOCTO_INST_DIR="${WORKSPACE}/digi-yocto-sdk.$(echo "${DY_REVISION}" | tr '/' '_')" YOCTO_DOWNLOAD_DIR="${DY_DOWNLOADS:-${WORKSPACE}}/downloads" YOCTO_PROJ_DIR="${WORKSPACE}/projects" +YOCTO_SSTATE_DIR="${DY_SSTATE:-${YOCTO_PROJ_DIR}/sstate-cache}" # If CPUS is unset, set it with the machine cpus if [ -z "${CPUS}" ]; then @@ -233,9 +206,9 @@ if pushd "${YOCTO_INST_DIR}"; then fi # shellcheck disable=SC2086 yes "" 2>/dev/null | ${REPO} init --depth=1 --no-repo-verify -u ${MANIFEST_URL} ${repo_revision} ${DY_MANIFEST:+-m ${DY_MANIFEST}} - ${REPO} --no-pager forall -j4 -p -c 'git clean -fdx' + ${REPO} --no-pager forall --ignore-missing -j4 -p -c 'git clean -fdx' # shellcheck disable=SC2016 - ${REPO} --no-pager forall -j4 -p -c 'git remote prune $(git remote)' || true + ${REPO} --no-pager forall --ignore-missing -j4 -p -c 'git remote prune $(git remote)' || true # shellcheck disable=SC2086 time ${REPO} sync -d ${MAKE_JOBS} popd @@ -267,7 +240,7 @@ for platform in ${DY_PLATFORMS}; do MKP_PAGER="" . ${YOCTO_INST_DIR}/mkproject.sh -p "${platform}" ${DY_MACHINES_LAYER:+-m ${DY_MACHINES_LAYER}} <<< "y" # Set a common DL_DIR and SSTATE_DIR for all platforms sed -i -e "/^#DL_DIR ?=/cDL_DIR ?= \"${YOCTO_DOWNLOAD_DIR}\"" \ - -e "/^#SSTATE_DIR ?=/cSSTATE_DIR ?= \"${YOCTO_PROJ_DIR}/sstate-cache\"" \ + -e "/^#SSTATE_DIR ?=/cSSTATE_DIR ?= \"${YOCTO_SSTATE_DIR}\"" \ conf/local.conf # Set the DISTRO and remove 'meta-digi-dey' layer if distro is not DEY based sed -i -e "/^DISTRO ?=/cDISTRO ?= \"${DY_DISTRO}\"" conf/local.conf @@ -281,7 +254,6 @@ for platform in ${DY_PLATFORMS}; do if [ "${DY_RM_WORK}" = "true" ]; then printf "%s" "${RM_WORK_CFG}" >> conf/local.conf fi - printf "%s" "${ZIP_INSTALLER_CFG}" >> conf/local.conf printf "%s" "${SDCARD_FSTYPE}" >> conf/local.conf # Append extra configuration macros if provided from build environment if [ -n "${DY_EXTRA_LOCAL_CONF}" ]; then @@ -296,7 +268,7 @@ for platform in ${DY_PLATFORMS}; do sed -i -e "/meta-digi-dey/a\ ${YOCTO_INST_DIR}/sources/meta-digi-mfg \\\\" conf/bblayers.conf fi # Apply CVE layer if needed (do so before potentially inheriting "digi_ccss" to avoid errors) - [ "${DY_USE_CVE_LAYER}" = "true" ] && bitbake-layers add-layer ${YOCTO_INST_DIR}/sources/meta-digi-security + [ "${DY_USE_CVE_LAYER}" = "true" ] && bitbake-layers add-layer "${YOCTO_INST_DIR}"/sources/meta-digi-security # If we want to generate a CVE report, update conf/local.conf if [ "${DY_CVE_REPORT}" = "true" ]; then # Build Vigiles config path using platform and patch status @@ -321,7 +293,6 @@ for platform in ${DY_PLATFORMS}; do printf "\n[INFO] Building the toolchain for %s.\n" "${platform}" time bitbake -c populate_sdk dey-toolchain fi - purge_sstate ) copy_images "${_this_img_dir}" popd diff --git a/sdk/mkproject.sh b/sdk/mkproject.sh index 31a5460a9..12da23843 100755 --- a/sdk/mkproject.sh +++ b/sdk/mkproject.sh @@ -3,7 +3,7 @@ # # mkproject.sh # -# Copyright (C) 2013-2024 by Digi International Inc. +# Copyright (C) 2013-2025 by Digi International Inc. # All rights reserved. # # This program is free software; you can redistribute it and/or modify it @@ -28,7 +28,7 @@ MKP_NONE="\033[0m" MKP_CONFIGPATH="${MKP_SCRIPTPATH}/sources/meta-digi/meta-digi-arm/conf/templates" # Blacklist platforms (not officially supported in a DEY release) -MKP_BLACKLIST_PLATFORMS="ccimx6qpsbc ccimx6sbc ccimx8x-sbc-express" +MKP_BLACKLIST_PLATFORMS="ccimx8x-sbc-express" MKP_SETUP_ENVIRONMENT='#!/bin/bash