mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-11-04 04:18:07 +00:00 
			
		
		
		
	Compare commits
	
		
			74 Commits
		
	
	
		
			v3.0.1
			...
			v3.0.2-rc3
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					192261318c | ||
| 
						 | 
					ffb843b486 | ||
| 
						 | 
					741f7a299a | ||
| 
						 | 
					dcff5c6932 | ||
| 
						 | 
					5c37272cd6 | ||
| 
						 | 
					4b5eeb48cc | ||
| 
						 | 
					1ca8f18b9d | ||
| 
						 | 
					856ac16e86 | ||
| 
						 | 
					cc3906e550 | ||
| 
						 | 
					6b3eb3ef99 | ||
| 
						 | 
					bc6da62f1b | ||
| 
						 | 
					0eeb14d4d1 | ||
| 
						 | 
					8a43d39572 | ||
| 
						 | 
					9a80d8b1de | ||
| 
						 | 
					ca1eabfbd5 | ||
| 
						 | 
					c22767540e | ||
| 
						 | 
					dff6a6e3d8 | ||
| 
						 | 
					a7c9a5f780 | ||
| 
						 | 
					f8eca25f7e | ||
| 
						 | 
					be59b10acc | ||
| 
						 | 
					1ec29f6705 | ||
| 
						 | 
					3ae0a1f1d5 | ||
| 
						 | 
					f362b7139e | ||
| 
						 | 
					bdd2074d78 | ||
| 
						 | 
					98ef44fc34 | ||
| 
						 | 
					9bb982460a | ||
| 
						 | 
					22126a3410 | ||
| 
						 | 
					f0035a9908 | ||
| 
						 | 
					0412bf03eb | ||
| 
						 | 
					afcffbc418 | ||
| 
						 | 
					c29c179b9e | ||
| 
						 | 
					36c4008c68 | ||
| 
						 | 
					07f5deefce | ||
| 
						 | 
					0d21a66d0a | ||
| 
						 | 
					206b4348fc | ||
| 
						 | 
					f0c34c39da | ||
| 
						 | 
					b85b388eb5 | ||
| 
						 | 
					556f8880bc | ||
| 
						 | 
					bf2ca9a9e4 | ||
| 
						 | 
					b24846cce3 | ||
| 
						 | 
					4bcc60934e | ||
| 
						 | 
					2b4fd7911a | ||
| 
						 | 
					7b0f05d11b | ||
| 
						 | 
					af4c7e4ce5 | ||
| 
						 | 
					bfeea74870 | ||
| 
						 | 
					3b5f90b339 | ||
| 
						 | 
					8870e802a7 | ||
| 
						 | 
					775af3700f | ||
| 
						 | 
					c95b91c399 | ||
| 
						 | 
					460050a114 | ||
| 
						 | 
					01adebbd6f | ||
| 
						 | 
					dcdbb4f091 | ||
| 
						 | 
					144c5d00f4 | ||
| 
						 | 
					2826c6d487 | ||
| 
						 | 
					367415663f | ||
| 
						 | 
					3ce4088499 | ||
| 
						 | 
					37f1ef534e | ||
| 
						 | 
					1142deb3d0 | ||
| 
						 | 
					922067a652 | ||
| 
						 | 
					62b9c6e257 | ||
| 
						 | 
					63dd51cbc4 | ||
| 
						 | 
					80c55c2d82 | ||
| 
						 | 
					4e2b42e95a | ||
| 
						 | 
					1949f602bf | ||
| 
						 | 
					84f86bfc98 | ||
| 
						 | 
					ed9d29fb03 | ||
| 
						 | 
					c587a12ee5 | ||
| 
						 | 
					2197badcde | ||
| 
						 | 
					84c8eb5ccf | ||
| 
						 | 
					16ebb7cec3 | ||
| 
						 | 
					75a51e3cd9 | ||
| 
						 | 
					832fbb8898 | ||
| 
						 | 
					4d2603b4ce | ||
| 
						 | 
					6fc396682c | 
							
								
								
									
										2
									
								
								.github/workflows/build-dev.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build-dev.yml
									
									
									
									
										vendored
									
									
								
							@@ -21,7 +21,7 @@ jobs:
 | 
				
			|||||||
    strategy:
 | 
					    strategy:
 | 
				
			||||||
      fail-fast: false
 | 
					      fail-fast: false
 | 
				
			||||||
      matrix:
 | 
					      matrix:
 | 
				
			||||||
        target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf196', 'cig_wf660a', 'cybertan_eww622-a1', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap111', 'edgecore_ecw5211', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'edgecore_oap102', 'hfcl_ion4','hfcl_ion4xi_wp', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4xi_w', 'hfcl_ion4xi_HMR', 'hfcl_ion4x_w', 'indio_um-305ax', 'indio_um-325ac', 'indio_um-510ac-v3', 'indio_um-550ac', 'indio_um-310ax-v1', 'indio_um-510axp-v1', 'indio_um-510axm-v1', 'udaya_a5-id2', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018_v4', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655' ]
 | 
					        target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf196', 'cig_wf189', 'cig_wf660a', 'cybertan_eww622-a1', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap111', 'edgecore_ecw5211', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'edgecore_oap102', 'hfcl_ion4','hfcl_ion4xi_wp', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4xi_w', 'hfcl_ion4xi_HMR', 'hfcl_ion4x_w', 'indio_um-305ax', 'indio_um-325ac', 'indio_um-510ac-v3', 'indio_um-550ac', 'indio_um-310ax-v1', 'indio_um-510axp-v1', 'indio_um-510axm-v1', 'sercomm_ap72tip', 'udaya_a5-id2', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018-v4', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655' ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - uses: actions/checkout@v3
 | 
					    - uses: actions/checkout@v3
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										28
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								LICENSE
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					BSD 3-Clause License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2024, Telecom Infra Project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Redistributions of source code must retain the above copyright notice, this
 | 
				
			||||||
 | 
					   list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. 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.
 | 
				
			||||||
@@ -83,12 +83,12 @@ platform_do_upgrade() {
 | 
				
			|||||||
		part="$(awk -F 'ubi.mtd=' '{printf $2}' /proc/cmdline | cut -d " " -f 1)"
 | 
							part="$(awk -F 'ubi.mtd=' '{printf $2}' /proc/cmdline | cut -d " " -f 1)"
 | 
				
			||||||
		case "$part" in
 | 
							case "$part" in
 | 
				
			||||||
		rootfs1)
 | 
							rootfs1)
 | 
				
			||||||
			fw_setenv active 2 || exit 1
 | 
					 | 
				
			||||||
			CI_UBIPART="rootfs2"
 | 
								CI_UBIPART="rootfs2"
 | 
				
			||||||
 | 
								CI_FWSETENV="active 2"
 | 
				
			||||||
			;;
 | 
								;;
 | 
				
			||||||
		rootfs2)
 | 
							rootfs2)
 | 
				
			||||||
			fw_setenv active 1 || exit 1
 | 
					 | 
				
			||||||
			CI_UBIPART="rootfs1"
 | 
								CI_UBIPART="rootfs1"
 | 
				
			||||||
 | 
								CI_FWSETENV="active 1"
 | 
				
			||||||
			;;
 | 
								;;
 | 
				
			||||||
		*)
 | 
							*)
 | 
				
			||||||
			# legacy bootloader
 | 
								# legacy bootloader
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,8 @@ boot() {
 | 
				
			|||||||
		;;		
 | 
							;;		
 | 
				
			||||||
	edgecore,eap101|\
 | 
						edgecore,eap101|\
 | 
				
			||||||
	edgecore,eap102|\
 | 
						edgecore,eap102|\
 | 
				
			||||||
	edgecore,oap102)
 | 
						edgecore,oap102|\
 | 
				
			||||||
 | 
						edgecore.eap104)
 | 
				
			||||||
		avail=$(fw_printenv -n upgrade_available)
 | 
							avail=$(fw_printenv -n upgrade_available)
 | 
				
			||||||
		[ "${avail}" -eq 1 ] || fw_setenv upgrade_available 1
 | 
							[ "${avail}" -eq 1 ] || fw_setenv upgrade_available 1
 | 
				
			||||||
		fw_setenv bootcount 0
 | 
							fw_setenv bootcount 0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -247,8 +247,8 @@ nand_do_upgrade_success() {
 | 
				
			|||||||
	local conf_tar="/tmp/sysupgrade.tgz"
 | 
						local conf_tar="/tmp/sysupgrade.tgz"
 | 
				
			||||||
	sync
 | 
						sync
 | 
				
			||||||
	[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
 | 
						[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
 | 
				
			||||||
 | 
						[ -f "$conf_tar" ] && nand_restore_config "$conf_tar" && sync
 | 
				
			||||||
	[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
 | 
						[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
 | 
				
			||||||
	[ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
 | 
					 | 
				
			||||||
	echo "sysupgrade successful"
 | 
						echo "sysupgrade successful"
 | 
				
			||||||
	umount -a
 | 
						umount -a
 | 
				
			||||||
	reboot -f
 | 
						reboot -f
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -194,8 +194,6 @@ platform_do_upgrade() {
 | 
				
			|||||||
	cig,wf194c4|\
 | 
						cig,wf194c4|\
 | 
				
			||||||
	cig,wf196|\
 | 
						cig,wf196|\
 | 
				
			||||||
	cybertan,eww622-a1|\
 | 
						cybertan,eww622-a1|\
 | 
				
			||||||
	cybertan,eww631-a1|\
 | 
					 | 
				
			||||||
	cybertan,eww631-b1|\
 | 
					 | 
				
			||||||
	glinet,ax1800|\
 | 
						glinet,ax1800|\
 | 
				
			||||||
	glinet,axt1800|\
 | 
						glinet,axt1800|\
 | 
				
			||||||
	indio,um-310ax-v1|\
 | 
						indio,um-310ax-v1|\
 | 
				
			||||||
@@ -262,8 +260,8 @@ platform_do_upgrade() {
 | 
				
			|||||||
		else
 | 
							else
 | 
				
			||||||
			if [ -e /tmp/downgrade ]; then
 | 
								if [ -e /tmp/downgrade ]; then
 | 
				
			||||||
				CI_UBIPART="rootfs1"
 | 
									CI_UBIPART="rootfs1"
 | 
				
			||||||
				fw_setenv active 1 || exit 1
 | 
									{ echo 'active 1'; echo 'upgrade_available 0'; } > /tmp/fw_setenv.txt || exit 1
 | 
				
			||||||
				fw_setenv upgrade_available 0 || exit 1
 | 
									CI_FWSETENV="-s /tmp/fw_setenv.txt"
 | 
				
			||||||
			elif grep -q rootfs1 /proc/cmdline; then
 | 
								elif grep -q rootfs1 /proc/cmdline; then
 | 
				
			||||||
				CI_UBIPART="rootfs2"
 | 
									CI_UBIPART="rootfs2"
 | 
				
			||||||
				CI_FWSETENV="active 2"
 | 
									CI_FWSETENV="active 2"
 | 
				
			||||||
@@ -289,5 +287,18 @@ platform_do_upgrade() {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		nand_upgrade_tar "$1"
 | 
							nand_upgrade_tar "$1"
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						cybertan,eww631-a1|\
 | 
				
			||||||
 | 
						cybertan,eww631-b1)
 | 
				
			||||||
 | 
							boot_part=$(fw_printenv bootfrom | cut  -d = -f2)
 | 
				
			||||||
 | 
							echo "Current bootfrom is $boot_part"
 | 
				
			||||||
 | 
							if [[ $boot_part == 1 ]]; then
 | 
				
			||||||
 | 
								CI_UBIPART="rootfs"
 | 
				
			||||||
 | 
								CI_FWSETENV="bootfrom 0"
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								CI_UBIPART="rootfs_1"
 | 
				
			||||||
 | 
								CI_FWSETENV="bootfrom 1"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							nand_upgrade_tar "$1"
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,9 +29,9 @@ ALLWIFIBOARDS:= \
 | 
				
			|||||||
	cig-wf660a \
 | 
						cig-wf660a \
 | 
				
			||||||
	cig-wf194c \
 | 
						cig-wf194c \
 | 
				
			||||||
	cig-wf194c4 \
 | 
						cig-wf194c4 \
 | 
				
			||||||
	cig-wf196-ca \
 | 
					 | 
				
			||||||
	cig-wf196-us \
 | 
					 | 
				
			||||||
	cybertan-eww622-a1 \
 | 
						cybertan-eww622-a1 \
 | 
				
			||||||
 | 
						cybertan-eww631-a1 \
 | 
				
			||||||
 | 
						cybertan-eww631-b1 \
 | 
				
			||||||
	edgecore-eap101 \
 | 
						edgecore-eap101 \
 | 
				
			||||||
	gl-ax1800 \
 | 
						gl-ax1800 \
 | 
				
			||||||
	gl-axt1800 \
 | 
						gl-axt1800 \
 | 
				
			||||||
@@ -89,14 +89,9 @@ $(call Package/ath11k-wifi-default)
 | 
				
			|||||||
    TITLE:=board-2.bin for QCOM IPQ6122 eval kits
 | 
					    TITLE:=board-2.bin for QCOM IPQ6122 eval kits
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/ath11k-wifi-cig-wf196_6g-ca
 | 
					define Package/ath11k-wifi-cig-wf196
 | 
				
			||||||
$(call Package/ath11k-wifi-default)
 | 
					$(call Package/ath11k-wifi-default)
 | 
				
			||||||
    TITLE:=cig-wf196 6G bdf CA
 | 
					    TITLE:=cig-wf196 bdf
 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
define Package/ath11k-wifi-cig-wf196_6g-us
 | 
					 | 
				
			||||||
$(call Package/ath11k-wifi-default)
 | 
					 | 
				
			||||||
    TITLE:=cig-wf196 6G bdf US
 | 
					 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/ath11k-wifi-gl-ax1800
 | 
					define Package/ath11k-wifi-gl-ax1800
 | 
				
			||||||
@@ -175,14 +170,9 @@ $(call Package/ath11k-wifi-default)
 | 
				
			|||||||
    TITLE:=edgecore-oap101e bdf
 | 
					    TITLE:=edgecore-oap101e bdf
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/ath11k-wifi-cig-wf188n-ca
 | 
					define Package/ath11k-wifi-cig-wf188n
 | 
				
			||||||
$(call Package/ath11k-wifi-default)
 | 
					$(call Package/ath11k-wifi-default)
 | 
				
			||||||
    TITLE:=cig-wf188n bdf CA
 | 
					    TITLE:=cig-wf188n bdf
 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
define Package/ath11k-wifi-cig-wf188n-us
 | 
					 | 
				
			||||||
$(call Package/ath11k-wifi-default)
 | 
					 | 
				
			||||||
    TITLE:=cig-wf188n bdf US
 | 
					 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define ath11k-wifi-install-one-to
 | 
					define ath11k-wifi-install-one-to
 | 
				
			||||||
@@ -262,16 +252,12 @@ define Package/ath11k-wifi-qcom-qcn9000/install
 | 
				
			|||||||
	$(INSTALL_DATA) ./board-2.bin.QCN9000 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board-2.bin
 | 
						$(INSTALL_DATA) ./board-2.bin.QCN9000 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board-2.bin
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/ath11k-wifi-cig-wf196_6g-ca/install
 | 
					define Package/ath11k-wifi-cig-wf196/install
 | 
				
			||||||
	$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN9074/hw1.0/
 | 
						$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN9074/hw1.0/ $(1)/lib/firmware/ath11k/IPQ8074/hw2.0/
 | 
				
			||||||
	$(INSTALL_DATA) ./board-cig-wf196_6g-ca.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin
 | 
						$(INSTALL_DATA) ./board-cig-wf196_6g-ca.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin.CA
 | 
				
			||||||
	echo -n 'CA' > $(1)/lib/firmware/country
 | 
						$(INSTALL_DATA) ./board-cig-wf196_6g-us.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin.US
 | 
				
			||||||
endef
 | 
						$(INSTALL_DATA) ./board-cig-wf196-ca.bin.IPQ8074 $(1)/lib/firmware/ath11k/IPQ8074/hw2.0/board.bin.CA
 | 
				
			||||||
 | 
						$(INSTALL_DATA) ./board-cig-wf196-us.bin.IPQ8074 $(1)/lib/firmware/ath11k/IPQ8074/hw2.0/board.bin.US
 | 
				
			||||||
define Package/ath11k-wifi-cig-wf196_6g-us/install
 | 
					 | 
				
			||||||
	$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN9074/hw1.0/
 | 
					 | 
				
			||||||
	$(INSTALL_DATA) ./board-cig-wf196_6g-us.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin
 | 
					 | 
				
			||||||
	echo -n 'US' > $(1)/lib/firmware/country
 | 
					 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/ath11k-wifi-optimcloud-d50/install
 | 
					define Package/ath11k-wifi-optimcloud-d50/install
 | 
				
			||||||
@@ -365,16 +351,10 @@ define Package/ath11k-wifi-edgecore-oap101e/install
 | 
				
			|||||||
	$(INSTALL_DATA) ./board-2-edgecore-oap101e.bin.QCN6122 $(1)/lib/firmware/ath11k/qcn6122/hw1.0/board-2.bin
 | 
						$(INSTALL_DATA) ./board-2-edgecore-oap101e.bin.QCN6122 $(1)/lib/firmware/ath11k/qcn6122/hw1.0/board-2.bin
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/ath11k-wifi-cig-wf188n-ca/install
 | 
					define Package/ath11k-wifi-cig-wf188n/install
 | 
				
			||||||
	$(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/
 | 
						$(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/
 | 
				
			||||||
	$(INSTALL_DATA) ./board-cig-wf188n-ca.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board.bin
 | 
						$(INSTALL_DATA) ./board-cig-wf188n-ca.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board.bin.CA
 | 
				
			||||||
	echo -n 'CA MY DE' > $(1)/lib/firmware/country
 | 
						$(INSTALL_DATA) ./board-cig-wf188n-us.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board.bin.US
 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
define Package/ath11k-wifi-cig-wf188n-us/install
 | 
					 | 
				
			||||||
	$(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/
 | 
					 | 
				
			||||||
	$(INSTALL_DATA) ./board-cig-wf188n-us.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board.bin
 | 
					 | 
				
			||||||
	echo -n 'US MY DE' > $(1)/lib/firmware/country
 | 
					 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(eval $(call generate-ath11k-wifi-package,cig-wf186w,Cigtech WF186w))
 | 
					$(eval $(call generate-ath11k-wifi-package,cig-wf186w,Cigtech WF186w))
 | 
				
			||||||
@@ -382,9 +362,9 @@ $(eval $(call generate-ath11k-wifi-package,cig-wf186h,Cigtech WF186h))
 | 
				
			|||||||
$(eval $(call generate-ath11k-wifi-package,cig-wf660a,Cigtech WF660a))
 | 
					$(eval $(call generate-ath11k-wifi-package,cig-wf660a,Cigtech WF660a))
 | 
				
			||||||
$(eval $(call generate-ath11k-wifi-package,cig-wf194c,Cigtech WF194c))
 | 
					$(eval $(call generate-ath11k-wifi-package,cig-wf194c,Cigtech WF194c))
 | 
				
			||||||
$(eval $(call generate-ath11k-wifi-package,cig-wf194c4,Cigtech WF194c4))
 | 
					$(eval $(call generate-ath11k-wifi-package,cig-wf194c4,Cigtech WF194c4))
 | 
				
			||||||
$(eval $(call generate-ath11k-wifi-package,cig-wf196-ca,Cigtech WF196 CA))
 | 
					 | 
				
			||||||
$(eval $(call generate-ath11k-wifi-package,cig-wf196-us,Cigtech WF196 US))
 | 
					 | 
				
			||||||
$(eval $(call generate-ath11k-wifi-package,cybertan-eww622-a1,CyberTan EWW622 A1))
 | 
					$(eval $(call generate-ath11k-wifi-package,cybertan-eww622-a1,CyberTan EWW622 A1))
 | 
				
			||||||
 | 
					$(eval $(call generate-ath11k-wifi-package,cybertan-eww631-a1,CyberTan EWW631 A1))
 | 
				
			||||||
 | 
					$(eval $(call generate-ath11k-wifi-package,cybertan-eww631-b1,CyberTan EWW631 B1))
 | 
				
			||||||
$(eval $(call generate-ath11k-wifi-package,sercomm-wallaby,Sercomm Kiwi))
 | 
					$(eval $(call generate-ath11k-wifi-package,sercomm-wallaby,Sercomm Kiwi))
 | 
				
			||||||
$(eval $(call generate-ath11k-wifi-package,wallys-dr6018,Wallys DR6018))
 | 
					$(eval $(call generate-ath11k-wifi-package,wallys-dr6018,Wallys DR6018))
 | 
				
			||||||
$(eval $(call generate-ath11k-wifi-package,wallys-dr6018-v4,Wallys DR6018 V4))
 | 
					$(eval $(call generate-ath11k-wifi-package,wallys-dr6018-v4,Wallys DR6018 V4))
 | 
				
			||||||
@@ -410,8 +390,7 @@ $(eval $(call BuildPackage,ath11k-wifi-qcom-ipq6122))
 | 
				
			|||||||
$(eval $(call BuildPackage,ath11k-wifi-qcom-ipq8074))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-qcom-ipq8074))
 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-qcom-ipq6018))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-qcom-ipq6018))
 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-qcom-qcn9000))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-qcom-qcn9000))
 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-cig-wf196_6g-ca))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-cig-wf196))
 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-cig-wf196_6g-us))
 | 
					 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-motorola-q14))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-motorola-q14))
 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-optimcloud-d50))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-optimcloud-d50))
 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-optimcloud-d60))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-optimcloud-d60))
 | 
				
			||||||
@@ -423,5 +402,4 @@ $(eval $(call BuildPackage,ath11k-wifi-hfcl-ion4x_w))
 | 
				
			|||||||
$(eval $(call BuildPackage,ath11k-wifi-hfcl-ion4xi_HMR))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-hfcl-ion4xi_HMR))
 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-edgecore-oap101))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-edgecore-oap101))
 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-edgecore-oap101e))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-edgecore-oap101e))
 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-cig-wf188n-ca))
 | 
					$(eval $(call BuildPackage,ath11k-wifi-cig-wf188n))
 | 
				
			||||||
$(eval $(call BuildPackage,ath11k-wifi-cig-wf188n-us))
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@@ -0,0 +1,459 @@
 | 
				
			|||||||
 | 
					From 1c3438fec4bad13a676617915ff56af54e7b4542 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					Date: Sat, 2 Apr 2022 13:12:43 +0300
 | 
				
			||||||
 | 
					Subject: [PATCH] RADIUS ACL/PSK check during 4-way handshake
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add an alternative sequence for performing the RADIUS ACL check and PSK
 | 
				
			||||||
 | 
					fetch. The previously used (macaddr_acl=2, wpa_psk_radius=2) combination
 | 
				
			||||||
 | 
					does this during IEEE 802.11 Authentication frame exchange while the new
 | 
				
			||||||
 | 
					option (wpa_psk_radius=3) does this during the 4-way handshake. This
 | 
				
			||||||
 | 
					allows some more information to be provided to the RADIUS authentication
 | 
				
			||||||
 | 
					server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 hostapd/config_file.c    |  3 +-
 | 
				
			||||||
 | 
					 hostapd/hostapd.conf     |  5 ++-
 | 
				
			||||||
 | 
					 src/ap/ap_config.c       |  4 ++-
 | 
				
			||||||
 | 
					 src/ap/ap_config.h       |  5 +--
 | 
				
			||||||
 | 
					 src/ap/ieee802_11.c      |  5 ++-
 | 
				
			||||||
 | 
					 src/ap/ieee802_11.h      |  2 ++
 | 
				
			||||||
 | 
					 src/ap/ieee802_11_auth.c | 76 ++++++++++++++++++++++++++++++++++++----
 | 
				
			||||||
 | 
					 src/ap/ieee802_11_auth.h |  5 ++-
 | 
				
			||||||
 | 
					 src/ap/wpa_auth.c        | 51 ++++++++++++++++++++++++++-
 | 
				
			||||||
 | 
					 src/ap/wpa_auth.h        |  9 ++++-
 | 
				
			||||||
 | 
					 src/ap/wpa_auth_glue.c   | 25 ++++++++++++-
 | 
				
			||||||
 | 
					 src/ap/wpa_auth_i.h      |  1 +
 | 
				
			||||||
 | 
					 12 files changed, 172 insertions(+), 19 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--- a/hostapd/config_file.c
 | 
				
			||||||
 | 
					+++ b/hostapd/config_file.c
 | 
				
			||||||
 | 
					@@ -2858,7 +2858,8 @@ static int hostapd_config_fill(struct ho
 | 
				
			||||||
 | 
					 		bss->wpa_psk_radius = atoi(pos);
 | 
				
			||||||
 | 
					 		if (bss->wpa_psk_radius != PSK_RADIUS_IGNORED &&
 | 
				
			||||||
 | 
					 		    bss->wpa_psk_radius != PSK_RADIUS_ACCEPTED &&
 | 
				
			||||||
 | 
					-		    bss->wpa_psk_radius != PSK_RADIUS_REQUIRED) {
 | 
				
			||||||
 | 
					+		    bss->wpa_psk_radius != PSK_RADIUS_REQUIRED &&
 | 
				
			||||||
 | 
					+		    bss->wpa_psk_radius != PSK_RADIUS_DURING_4WAY_HS) {
 | 
				
			||||||
 | 
					 			wpa_printf(MSG_ERROR,
 | 
				
			||||||
 | 
					 				   "Line %d: unknown wpa_psk_radius %d",
 | 
				
			||||||
 | 
					 				   line, bss->wpa_psk_radius);
 | 
				
			||||||
 | 
					--- a/hostapd/hostapd.conf
 | 
				
			||||||
 | 
					+++ b/hostapd/hostapd.conf
 | 
				
			||||||
 | 
					@@ -1635,12 +1635,15 @@ own_ip_addr=127.0.0.1
 | 
				
			||||||
 | 
					 #wpa_psk_file=/etc/hostapd.wpa_psk
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 # Optionally, WPA passphrase can be received from RADIUS authentication server
 | 
				
			||||||
 | 
					-# This requires macaddr_acl to be set to 2 (RADIUS)
 | 
				
			||||||
 | 
					+# This requires macaddr_acl to be set to 2 (RADIUS) for wpa_psk_radius values
 | 
				
			||||||
 | 
					+# 1 and 2.
 | 
				
			||||||
 | 
					 # 0 = disabled (default)
 | 
				
			||||||
 | 
					 # 1 = optional; use default passphrase/psk if RADIUS server does not include
 | 
				
			||||||
 | 
					 #	Tunnel-Password
 | 
				
			||||||
 | 
					 # 2 = required; reject authentication if RADIUS server does not include
 | 
				
			||||||
 | 
					 #	Tunnel-Password
 | 
				
			||||||
 | 
					+# 3 = ask RADIUS server during 4-way handshake if there is no locally
 | 
				
			||||||
 | 
					+#	configured PSK/passphrase for the STA
 | 
				
			||||||
 | 
					 #wpa_psk_radius=0
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 # Set of accepted key management algorithms (WPA-PSK, WPA-EAP, or both). The
 | 
				
			||||||
 | 
					--- a/src/ap/ap_config.c
 | 
				
			||||||
 | 
					+++ b/src/ap/ap_config.c
 | 
				
			||||||
 | 
					@@ -1,6 +1,6 @@
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * hostapd / Configuration helper functions
 | 
				
			||||||
 | 
					- * Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					+ * Copyright (c) 2003-2022, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  * This software may be distributed under the terms of the BSD license.
 | 
				
			||||||
 | 
					  * See README for more details.
 | 
				
			||||||
 | 
					@@ -1245,6 +1245,7 @@ static int hostapd_config_check_bss(stru
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (full_config && bss->wpa &&
 | 
				
			||||||
 | 
					 	    bss->wpa_psk_radius != PSK_RADIUS_IGNORED &&
 | 
				
			||||||
 | 
					+	    bss->wpa_psk_radius != PSK_RADIUS_DURING_4WAY_HS &&
 | 
				
			||||||
 | 
					 	    bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) {
 | 
				
			||||||
 | 
					 		wpa_printf(MSG_ERROR, "WPA-PSK using RADIUS enabled, but no "
 | 
				
			||||||
 | 
					 			   "RADIUS checking (macaddr_acl=2) enabled.");
 | 
				
			||||||
 | 
					@@ -1254,6 +1255,7 @@ static int hostapd_config_check_bss(stru
 | 
				
			||||||
 | 
					 	if (full_config && bss->wpa && (bss->wpa_key_mgmt & WPA_KEY_MGMT_PSK) &&
 | 
				
			||||||
 | 
					 	    bss->ssid.wpa_psk == NULL && bss->ssid.wpa_passphrase == NULL &&
 | 
				
			||||||
 | 
					 	    bss->ssid.wpa_psk_file == NULL &&
 | 
				
			||||||
 | 
					+	    bss->wpa_psk_radius != PSK_RADIUS_DURING_4WAY_HS &&
 | 
				
			||||||
 | 
					 	    (bss->wpa_psk_radius != PSK_RADIUS_REQUIRED ||
 | 
				
			||||||
 | 
					 	     bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH)) {
 | 
				
			||||||
 | 
					 		wpa_printf(MSG_ERROR, "WPA-PSK enabled, but PSK or passphrase "
 | 
				
			||||||
 | 
					--- a/src/ap/ap_config.h
 | 
				
			||||||
 | 
					+++ b/src/ap/ap_config.h
 | 
				
			||||||
 | 
					@@ -1,6 +1,6 @@
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * hostapd / Configuration definitions and helpers functions
 | 
				
			||||||
 | 
					- * Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					+ * Copyright (c) 2003-2022, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  * This software may be distributed under the terms of the BSD license.
 | 
				
			||||||
 | 
					  * See README for more details.
 | 
				
			||||||
 | 
					@@ -367,7 +367,8 @@ struct hostapd_bss_config {
 | 
				
			||||||
 | 
					 	enum {
 | 
				
			||||||
 | 
					 		PSK_RADIUS_IGNORED = 0,
 | 
				
			||||||
 | 
					 		PSK_RADIUS_ACCEPTED = 1,
 | 
				
			||||||
 | 
					-		PSK_RADIUS_REQUIRED = 2
 | 
				
			||||||
 | 
					+		PSK_RADIUS_REQUIRED = 2,
 | 
				
			||||||
 | 
					+		PSK_RADIUS_DURING_4WAY_HS = 3,
 | 
				
			||||||
 | 
					 	} wpa_psk_radius;
 | 
				
			||||||
 | 
					 	int wpa_pairwise;
 | 
				
			||||||
 | 
					 	int group_cipher; /* wpa_group value override from configuation */
 | 
				
			||||||
 | 
					--- a/src/ap/ieee802_11.c
 | 
				
			||||||
 | 
					+++ b/src/ap/ieee802_11.c
 | 
				
			||||||
 | 
					@@ -2348,9 +2348,8 @@ static int ieee802_11_allowed_address(st
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-static int
 | 
				
			||||||
 | 
					-ieee802_11_set_radius_info(struct hostapd_data *hapd, struct sta_info *sta,
 | 
				
			||||||
 | 
					-			   int res, struct radius_sta *info)
 | 
				
			||||||
 | 
					+int ieee802_11_set_radius_info(struct hostapd_data *hapd, struct sta_info *sta,
 | 
				
			||||||
 | 
					+			       int res, struct radius_sta *info)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	u32 session_timeout = info->session_timeout;
 | 
				
			||||||
 | 
					 	u32 acct_interim_interval = info->acct_interim_interval;
 | 
				
			||||||
 | 
					--- a/src/ap/ieee802_11.h
 | 
				
			||||||
 | 
					+++ b/src/ap/ieee802_11.h
 | 
				
			||||||
 | 
					@@ -220,4 +220,6 @@ void auth_sae_process_commit(void *eloop
 | 
				
			||||||
 | 
					 u8 * hostapd_eid_rsnxe(struct hostapd_data *hapd, u8 *eid, size_t len);
 | 
				
			||||||
 | 
					 u8 * hostapd_get_rsne(struct hostapd_data *hapd, u8 *pos, size_t len);
 | 
				
			||||||
 | 
					 u8 * hostapd_get_rsnxe(struct hostapd_data *hapd, u8 *pos, size_t len);
 | 
				
			||||||
 | 
					+int ieee802_11_set_radius_info(struct hostapd_data *hapd, struct sta_info *sta,
 | 
				
			||||||
 | 
					+		                              int res, struct radius_sta *info);
 | 
				
			||||||
 | 
					 #endif /* IEEE802_11_H */
 | 
				
			||||||
 | 
					--- a/src/ap/ieee802_11_auth.c
 | 
				
			||||||
 | 
					+++ b/src/ap/ieee802_11_auth.c
 | 
				
			||||||
 | 
					@@ -1,6 +1,6 @@
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * hostapd / IEEE 802.11 authentication (ACL)
 | 
				
			||||||
 | 
					- * Copyright (c) 2003-2012, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					+ * Copyright (c) 2003-2022, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  * This software may be distributed under the terms of the BSD license.
 | 
				
			||||||
 | 
					  * See README for more details.
 | 
				
			||||||
 | 
					@@ -20,6 +20,8 @@
 | 
				
			||||||
 | 
					 #include "hostapd.h"
 | 
				
			||||||
 | 
					 #include "ap_config.h"
 | 
				
			||||||
 | 
					 #include "ap_drv_ops.h"
 | 
				
			||||||
 | 
					+#include "sta_info.h"
 | 
				
			||||||
 | 
					+#include "wpa_auth.h"
 | 
				
			||||||
 | 
					 #include "ieee802_11.h"
 | 
				
			||||||
 | 
					 #include "ieee802_1x.h"
 | 
				
			||||||
 | 
					 #include "ieee802_11_auth.h"
 | 
				
			||||||
 | 
					@@ -43,6 +45,8 @@ struct hostapd_acl_query_data {
 | 
				
			||||||
 | 
					 	u8 *auth_msg; /* IEEE 802.11 authentication frame from station */
 | 
				
			||||||
 | 
					 	size_t auth_msg_len;
 | 
				
			||||||
 | 
					 	struct hostapd_acl_query_data *next;
 | 
				
			||||||
 | 
					+	bool radius_psk;
 | 
				
			||||||
 | 
					+	int akm;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -153,6 +157,13 @@ static int hostapd_radius_acl_query(stru
 | 
				
			||||||
 | 
					 		goto fail;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (query->akm &&
 | 
				
			||||||
 | 
					+	    !radius_msg_add_attr_int32(msg, RADIUS_ATTR_WLAN_AKM_SUITE,
 | 
				
			||||||
 | 
					+				       wpa_akm_to_suite(query->akm))) {
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_DEBUG, "Could not add WLAN-AKM-Suite");
 | 
				
			||||||
 | 
					+		goto fail;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if (radius_client_send(hapd->radius, msg, RADIUS_AUTH, addr) < 0)
 | 
				
			||||||
 | 
					 		goto fail;
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					@@ -566,17 +577,40 @@ hostapd_acl_recv_radius(struct radius_ms
 | 
				
			||||||
 | 
					 	cache->next = hapd->acl_cache;
 | 
				
			||||||
 | 
					 	hapd->acl_cache = cache;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (query->radius_psk) {
 | 
				
			||||||
 | 
					+		struct sta_info *sta;
 | 
				
			||||||
 | 
					+		bool success = cache->accepted == HOSTAPD_ACL_ACCEPT;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		sta = ap_get_sta(hapd, query->addr);
 | 
				
			||||||
 | 
					+		if (!sta || !sta->wpa_sm) {
 | 
				
			||||||
 | 
					+			wpa_printf(MSG_DEBUG,
 | 
				
			||||||
 | 
					+				   "No STA/SM entry found for the RADIUS PSK response");
 | 
				
			||||||
 | 
					+			goto done;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+#ifdef NEED_AP_MLME
 | 
				
			||||||
 | 
					+		if (success &&
 | 
				
			||||||
 | 
					+		    (ieee802_11_set_radius_info(hapd, sta, cache->accepted,
 | 
				
			||||||
 | 
					+						info) < 0 ||
 | 
				
			||||||
 | 
					+		     ap_sta_bind_vlan(hapd, sta) < 0))
 | 
				
			||||||
 | 
					+			success = false;
 | 
				
			||||||
 | 
					+#endif /* NEED_AP_MLME */
 | 
				
			||||||
 | 
					+		wpa_auth_sta_radius_psk_resp(sta->wpa_sm, success);
 | 
				
			||||||
 | 
					+	} else {
 | 
				
			||||||
 | 
					 #ifdef CONFIG_DRIVER_RADIUS_ACL
 | 
				
			||||||
 | 
					-	hostapd_drv_set_radius_acl_auth(hapd, query->addr, cache->accepted,
 | 
				
			||||||
 | 
					-					info->session_timeout);
 | 
				
			||||||
 | 
					+		hostapd_drv_set_radius_acl_auth(hapd, query->addr,
 | 
				
			||||||
 | 
					+						cache->accepted,
 | 
				
			||||||
 | 
					+						info->session_timeout);
 | 
				
			||||||
 | 
					 #else /* CONFIG_DRIVER_RADIUS_ACL */
 | 
				
			||||||
 | 
					 #ifdef NEED_AP_MLME
 | 
				
			||||||
 | 
					-	/* Re-send original authentication frame for 802.11 processing */
 | 
				
			||||||
 | 
					-	wpa_printf(MSG_DEBUG, "Re-sending authentication frame after "
 | 
				
			||||||
 | 
					-		   "successful RADIUS ACL query");
 | 
				
			||||||
 | 
					-	ieee802_11_mgmt(hapd, query->auth_msg, query->auth_msg_len, NULL);
 | 
				
			||||||
 | 
					+		/* Re-send original authentication frame for 802.11 processing
 | 
				
			||||||
 | 
					+		 */
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_DEBUG,
 | 
				
			||||||
 | 
					+			   "Re-sending authentication frame after successful RADIUS ACL query");
 | 
				
			||||||
 | 
					+		ieee802_11_mgmt(hapd, query->auth_msg, query->auth_msg_len,
 | 
				
			||||||
 | 
					+				NULL);
 | 
				
			||||||
 | 
					 #endif /* NEED_AP_MLME */
 | 
				
			||||||
 | 
					 #endif /* CONFIG_DRIVER_RADIUS_ACL */
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					  done:
 | 
				
			||||||
 | 
					 	if (prev == NULL)
 | 
				
			||||||
 | 
					@@ -658,3 +692,31 @@ void hostapd_free_psk_list(struct hostap
 | 
				
			||||||
 | 
					 		os_free(prev);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+#ifndef CONFIG_NO_RADIUS
 | 
				
			||||||
 | 
					+void hostapd_acl_req_radius_psk(struct hostapd_data *hapd, const u8 *addr,
 | 
				
			||||||
 | 
					+				int key_mgmt, const u8 *anonce,
 | 
				
			||||||
 | 
					+				const u8 *eapol, size_t eapol_len)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct hostapd_acl_query_data *query;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	query = os_zalloc(sizeof(*query));
 | 
				
			||||||
 | 
					+	if (!query)
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	query->radius_psk = true;
 | 
				
			||||||
 | 
					+	query->akm = key_mgmt;
 | 
				
			||||||
 | 
					+	os_get_reltime(&query->timestamp);
 | 
				
			||||||
 | 
					+	os_memcpy(query->addr, addr, ETH_ALEN);
 | 
				
			||||||
 | 
					+	if (hostapd_radius_acl_query(hapd, addr, query)) {
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_DEBUG,
 | 
				
			||||||
 | 
					+			   "Failed to send Access-Request for RADIUS PSK/ACL query");
 | 
				
			||||||
 | 
					+		hostapd_acl_query_free(query);
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	query->next = hapd->acl_queries;
 | 
				
			||||||
 | 
					+	hapd->acl_queries = query;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#endif /* CONFIG_NO_RADIUS */
 | 
				
			||||||
 | 
					--- a/src/ap/ieee802_11_auth.h
 | 
				
			||||||
 | 
					+++ b/src/ap/ieee802_11_auth.h
 | 
				
			||||||
 | 
					@@ -1,6 +1,6 @@
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * hostapd / IEEE 802.11 authentication (ACL)
 | 
				
			||||||
 | 
					- * Copyright (c) 2003-2005, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					+ * Copyright (c) 2003-2022, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  * This software may be distributed under the terms of the BSD license.
 | 
				
			||||||
 | 
					  * See README for more details.
 | 
				
			||||||
 | 
					@@ -36,5 +36,8 @@ void hostapd_free_psk_list(struct hostap
 | 
				
			||||||
 | 
					 void hostapd_acl_expire(struct hostapd_data *hapd);
 | 
				
			||||||
 | 
					 void hostapd_copy_psk_list(struct hostapd_sta_wpa_psk_short **psk,
 | 
				
			||||||
 | 
					 			   struct hostapd_sta_wpa_psk_short *src);
 | 
				
			||||||
 | 
					+void hostapd_acl_req_radius_psk(struct hostapd_data *hapd, const u8 *addr,
 | 
				
			||||||
 | 
					+				int key_mgmt, const u8 *anonce,
 | 
				
			||||||
 | 
					+				const u8 *eapol, size_t eapol_len);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #endif /* IEEE802_11_AUTH_H */
 | 
				
			||||||
 | 
					--- a/src/ap/wpa_auth.c
 | 
				
			||||||
 | 
					+++ b/src/ap/wpa_auth.c
 | 
				
			||||||
 | 
					@@ -1,6 +1,6 @@
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * IEEE 802.11 RSN / WPA Authenticator
 | 
				
			||||||
 | 
					- * Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					+ * Copyright (c) 2004-2022, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  * This software may be distributed under the terms of the BSD license.
 | 
				
			||||||
 | 
					  * See README for more details.
 | 
				
			||||||
 | 
					@@ -1465,6 +1465,12 @@ static void wpa_send_eapol_timeout(void
 | 
				
			||||||
 | 
					 	struct wpa_authenticator *wpa_auth = eloop_ctx;
 | 
				
			||||||
 | 
					 	struct wpa_state_machine *sm = timeout_ctx;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (sm->waiting_radius_psk) {
 | 
				
			||||||
 | 
					+		wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
 | 
				
			||||||
 | 
					+				"Ignore EAPOL-Key timeout while waiting for RADIUS PSK");
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	sm->pending_1_of_4_timeout = 0;
 | 
				
			||||||
 | 
					 	wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, "EAPOL-Key timeout");
 | 
				
			||||||
 | 
					 	sm->TimeoutEvt = true;
 | 
				
			||||||
 | 
					@@ -3003,6 +3009,19 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
 | 
				
			||||||
 | 
					 			break;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (!ok && wpa_key_mgmt_wpa_psk_no_sae(sm->wpa_key_mgmt) &&
 | 
				
			||||||
 | 
					+	    wpa_auth->conf.radius_psk && wpa_auth->cb->request_radius_psk &&
 | 
				
			||||||
 | 
					+	    !sm->waiting_radius_psk) {
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_DEBUG, "No PSK available - ask RADIUS server");
 | 
				
			||||||
 | 
					+		wpa_auth->cb->request_radius_psk(wpa_auth->cb_ctx, sm->addr,
 | 
				
			||||||
 | 
					+						 sm->wpa_key_mgmt,
 | 
				
			||||||
 | 
					+						 sm->ANonce,
 | 
				
			||||||
 | 
					+						 sm->last_rx_eapol_key,
 | 
				
			||||||
 | 
					+						 sm->last_rx_eapol_key_len);
 | 
				
			||||||
 | 
					+		sm->waiting_radius_psk = 1;
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if (!ok) {
 | 
				
			||||||
 | 
					 		wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
 | 
				
			||||||
 | 
					 				"invalid MIC in msg 2/4 of 4-Way Handshake");
 | 
				
			||||||
 | 
					@@ -3758,6 +3777,11 @@ SM_STEP(WPA_PTK)
 | 
				
			||||||
 | 
					 		} else if (wpa_auth_uses_sae(sm) && sm->pmksa) {
 | 
				
			||||||
 | 
					 			SM_ENTER(WPA_PTK, PTKSTART);
 | 
				
			||||||
 | 
					 #endif /* CONFIG_SAE */
 | 
				
			||||||
 | 
					+		} else if (wpa_key_mgmt_wpa_psk_no_sae(sm->wpa_key_mgmt) &&
 | 
				
			||||||
 | 
					+			   wpa_auth->conf.radius_psk) {
 | 
				
			||||||
 | 
					+			wpa_printf(MSG_DEBUG,
 | 
				
			||||||
 | 
					+				   "INITPSK: No PSK yet available for STA - use RADIUS later");
 | 
				
			||||||
 | 
					+			SM_ENTER(WPA_PTK, PTKSTART);
 | 
				
			||||||
 | 
					 		} else {
 | 
				
			||||||
 | 
					 			wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
 | 
				
			||||||
 | 
					 					"no PSK configured for the STA");
 | 
				
			||||||
 | 
					@@ -5661,3 +5685,28 @@ void wpa_auth_set_ocv_override_freq(stru
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #endif /* CONFIG_TESTING_OPTIONS */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+void wpa_auth_sta_radius_psk_resp(struct wpa_state_machine *sm, bool success)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	if (!sm->waiting_radius_psk) {
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_DEBUG,
 | 
				
			||||||
 | 
					+			   "Ignore RADIUS PSK response for " MACSTR
 | 
				
			||||||
 | 
					+			   " that did not wait one",
 | 
				
			||||||
 | 
					+			   MAC2STR(sm->addr));
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	wpa_printf(MSG_DEBUG, "RADIUS PSK response for " MACSTR " (%s)",
 | 
				
			||||||
 | 
					+		   MAC2STR(sm->addr), success ? "success" : "fail");
 | 
				
			||||||
 | 
					+	sm->waiting_radius_psk = 0;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (success) {
 | 
				
			||||||
 | 
					+		/* Try to process the EAPOL-Key msg 2/4 again */
 | 
				
			||||||
 | 
					+		sm->EAPOLKeyReceived = true;
 | 
				
			||||||
 | 
					+	} else {
 | 
				
			||||||
 | 
					+		sm->Disconnect = true;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	eloop_register_timeout(0, 0, wpa_sm_call_step, sm, NULL);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					--- a/src/ap/wpa_auth.h
 | 
				
			||||||
 | 
					+++ b/src/ap/wpa_auth.h
 | 
				
			||||||
 | 
					@@ -1,6 +1,6 @@
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * hostapd - IEEE 802.11i-2004 / WPA Authenticator
 | 
				
			||||||
 | 
					- * Copyright (c) 2004-2017, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					+ * Copyright (c) 2004-2022, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  * This software may be distributed under the terms of the BSD license.
 | 
				
			||||||
 | 
					  * See README for more details.
 | 
				
			||||||
 | 
					@@ -273,6 +273,8 @@ struct wpa_auth_config {
 | 
				
			||||||
 | 
					 	 * PTK derivation regardless of advertised capabilities.
 | 
				
			||||||
 | 
					 	 */
 | 
				
			||||||
 | 
					 	bool force_kdk_derivation;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	bool radius_psk;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 typedef enum {
 | 
				
			||||||
 | 
					@@ -320,6 +322,9 @@ struct wpa_auth_callbacks {
 | 
				
			||||||
 | 
					 	void (*store_ptksa)(void *ctx, const u8 *addr, int cipher,
 | 
				
			||||||
 | 
					 			    u32 life_time, const struct wpa_ptk *ptk);
 | 
				
			||||||
 | 
					 	void (*clear_ptksa)(void *ctx, const u8 *addr, int cipher);
 | 
				
			||||||
 | 
					+	void (*request_radius_psk)(void *ctx, const u8 *addr, int key_mgmt,
 | 
				
			||||||
 | 
					+				   const u8 *anonce,
 | 
				
			||||||
 | 
					+				   const u8 *eapol, size_t eapol_len);
 | 
				
			||||||
 | 
					 #ifdef CONFIG_IEEE80211R_AP
 | 
				
			||||||
 | 
					 	struct wpa_state_machine * (*add_sta)(void *ctx, const u8 *sta_addr);
 | 
				
			||||||
 | 
					 	int (*add_sta_ft)(void *ctx, const u8 *sta_addr);
 | 
				
			||||||
 | 
					@@ -567,4 +572,6 @@ void wpa_auth_set_ocv_override_freq(stru
 | 
				
			||||||
 | 
					 				    enum wpa_auth_ocv_override_frame frame,
 | 
				
			||||||
 | 
					 				    unsigned int freq);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+void wpa_auth_sta_radius_psk_resp(struct wpa_state_machine *sm, bool success);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 #endif /* WPA_AUTH_H */
 | 
				
			||||||
 | 
					--- a/src/ap/wpa_auth_glue.c
 | 
				
			||||||
 | 
					+++ b/src/ap/wpa_auth_glue.c
 | 
				
			||||||
 | 
					@@ -1,6 +1,6 @@
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * hostapd / WPA authenticator glue code
 | 
				
			||||||
 | 
					- * Copyright (c) 2002-2012, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					+ * Copyright (c) 2002-2022, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  * This software may be distributed under the terms of the BSD license.
 | 
				
			||||||
 | 
					  * See README for more details.
 | 
				
			||||||
 | 
					@@ -29,6 +29,7 @@
 | 
				
			||||||
 | 
					 #include "ap_drv_ops.h"
 | 
				
			||||||
 | 
					 #include "ap_config.h"
 | 
				
			||||||
 | 
					 #include "ieee802_11.h"
 | 
				
			||||||
 | 
					+#include "ieee802_11_auth.h"
 | 
				
			||||||
 | 
					 #include "pmksa_cache_auth.h"
 | 
				
			||||||
 | 
					 #include "wpa_auth.h"
 | 
				
			||||||
 | 
					 #include "wpa_auth_glue.h"
 | 
				
			||||||
 | 
					@@ -214,6 +215,8 @@ static void hostapd_wpa_auth_conf(struct
 | 
				
			||||||
 | 
					 	wconf->force_kdk_derivation = conf->force_kdk_derivation;
 | 
				
			||||||
 | 
					 #endif /* CONFIG_TESTING_OPTIONS */
 | 
				
			||||||
 | 
					 #endif /* CONFIG_PASN */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	wconf->radius_psk = conf->wpa_psk_radius == PSK_RADIUS_DURING_4WAY_HS;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -1435,6 +1438,23 @@ static void hostapd_wpa_unregister_ft_ou
 | 
				
			||||||
 | 
					 #endif /* CONFIG_IEEE80211R_AP */
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+#ifndef CONFIG_NO_RADIUS
 | 
				
			||||||
 | 
					+static void hostapd_request_radius_psk(void *ctx, const u8 *addr, int key_mgmt,
 | 
				
			||||||
 | 
					+				       const u8 *anonce,
 | 
				
			||||||
 | 
					+				       const u8 *eapol, size_t eapol_len)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct hostapd_data *hapd = ctx;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	wpa_printf(MSG_DEBUG, "RADIUS PSK request for " MACSTR " key_mgmt=0x%x",
 | 
				
			||||||
 | 
					+		   MAC2STR(addr), key_mgmt);
 | 
				
			||||||
 | 
					+	wpa_hexdump(MSG_DEBUG, "ANonce", anonce, WPA_NONCE_LEN);
 | 
				
			||||||
 | 
					+	wpa_hexdump(MSG_DEBUG, "EAPOL", eapol, eapol_len);
 | 
				
			||||||
 | 
					+	hostapd_acl_req_radius_psk(hapd, addr, key_mgmt, anonce, eapol,
 | 
				
			||||||
 | 
					+				   eapol_len);
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+#endif /* CONFIG_NO_RADIUS */
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 int hostapd_setup_wpa(struct hostapd_data *hapd)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	struct wpa_auth_config _conf;
 | 
				
			||||||
 | 
					@@ -1478,6 +1498,9 @@ int hostapd_setup_wpa(struct hostapd_dat
 | 
				
			||||||
 | 
					 		.set_session_timeout = hostapd_wpa_auth_set_session_timeout,
 | 
				
			||||||
 | 
					 		.get_session_timeout = hostapd_wpa_auth_get_session_timeout,
 | 
				
			||||||
 | 
					 #endif /* CONFIG_IEEE80211R_AP */
 | 
				
			||||||
 | 
					+#ifndef CONFIG_NO_RADIUS
 | 
				
			||||||
 | 
					+		.request_radius_psk = hostapd_request_radius_psk,
 | 
				
			||||||
 | 
					+#endif /* CONFIG_NO_RADIUS */
 | 
				
			||||||
 | 
					 	};
 | 
				
			||||||
 | 
					 	const u8 *wpa_ie;
 | 
				
			||||||
 | 
					 	size_t wpa_ie_len;
 | 
				
			||||||
 | 
					--- a/src/ap/wpa_auth_i.h
 | 
				
			||||||
 | 
					+++ b/src/ap/wpa_auth_i.h
 | 
				
			||||||
 | 
					@@ -89,6 +89,7 @@ struct wpa_state_machine {
 | 
				
			||||||
 | 
					 	unsigned int rx_eapol_key_secure:1;
 | 
				
			||||||
 | 
					 	unsigned int update_snonce:1;
 | 
				
			||||||
 | 
					 	unsigned int alt_snonce_valid:1;
 | 
				
			||||||
 | 
					+	unsigned int waiting_radius_psk:1;
 | 
				
			||||||
 | 
					 #ifdef CONFIG_IEEE80211R_AP
 | 
				
			||||||
 | 
					 	unsigned int ft_completed:1;
 | 
				
			||||||
 | 
					 	unsigned int pmk_r1_name_valid:1;
 | 
				
			||||||
@@ -0,0 +1,350 @@
 | 
				
			|||||||
 | 
					From 24763e3cd0a564eb71f3c501bbb4fbb0d7070762 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					Date: Fri, 15 Apr 2022 17:31:48 +0300
 | 
				
			||||||
 | 
					Subject: [PATCH] RADIUS: Attributes with Extended Types (RFC 6929)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Supported extended types for RADIUS attributes for the cases defined in
 | 
				
			||||||
 | 
					RFC 6929.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 src/radius/radius.c | 195 ++++++++++++++++++++++++++++++++++++++------
 | 
				
			||||||
 | 
					 src/radius/radius.h |  26 +++++-
 | 
				
			||||||
 | 
					 2 files changed, 193 insertions(+), 28 deletions(-)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diff --git a/src/radius/radius.c b/src/radius/radius.c
 | 
				
			||||||
 | 
					index be16e27b9..a64228067 100644
 | 
				
			||||||
 | 
					--- a/src/radius/radius.c
 | 
				
			||||||
 | 
					+++ b/src/radius/radius.c
 | 
				
			||||||
 | 
					@@ -1,6 +1,6 @@
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * RADIUS message processing
 | 
				
			||||||
 | 
					- * Copyright (c) 2002-2009, 2011-2015, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					+ * Copyright (c) 2002-2009, 2011-2022, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  * This software may be distributed under the terms of the BSD license.
 | 
				
			||||||
 | 
					  * See README for more details.
 | 
				
			||||||
 | 
					@@ -159,7 +159,8 @@ static const char *radius_code_string(u8 code)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 struct radius_attr_type {
 | 
				
			||||||
 | 
					-	u8 type;
 | 
				
			||||||
 | 
					+	u16 type; /* 0..255 for basic types;
 | 
				
			||||||
 | 
					+		   * (241 << 8) | <ext-type> for extended types */
 | 
				
			||||||
 | 
					 	char *name;
 | 
				
			||||||
 | 
					 	enum {
 | 
				
			||||||
 | 
					 		RADIUS_ATTR_UNDIST, RADIUS_ATTR_TEXT, RADIUS_ATTR_IP,
 | 
				
			||||||
 | 
					@@ -260,11 +261,31 @@ static const struct radius_attr_type radius_attrs[] =
 | 
				
			||||||
 | 
					 	  RADIUS_ATTR_HEXDUMP },
 | 
				
			||||||
 | 
					 	{ RADIUS_ATTR_WLAN_GROUP_MGMT_CIPHER, "WLAN-Group-Mgmt-Pairwise-Cipher",
 | 
				
			||||||
 | 
					 	  RADIUS_ATTR_HEXDUMP },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_EXT_TYPE_1, "Extended-Type-1", RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_EXT_TYPE_2, "Extended-Type-2", RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_EXT_TYPE_3, "Extended-Type-3", RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_EXT_TYPE_4, "Extended-Type-4", RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_LONG_EXT_TYPE_1, "Long-Extended-Type-1",
 | 
				
			||||||
 | 
					+	  RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_LONG_EXT_TYPE_2, "Long-Extended-Type-2",
 | 
				
			||||||
 | 
					+	  RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_1, "Extended-Vendor-Specific-1",
 | 
				
			||||||
 | 
					+	  RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_2, "Extended-Vendor-Specific-2",
 | 
				
			||||||
 | 
					+	  RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_3, "Extended-Vendor-Specific-3",
 | 
				
			||||||
 | 
					+	  RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_4, "Extended-Vendor-Specific-4",
 | 
				
			||||||
 | 
					+	  RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_5, "Extended-Vendor-Specific-5",
 | 
				
			||||||
 | 
					+	  RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					+	{ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_6, "Extended-Vendor-Specific-6",
 | 
				
			||||||
 | 
					+	  RADIUS_ATTR_UNDIST },
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 #define RADIUS_ATTRS ARRAY_SIZE(radius_attrs)
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-static const struct radius_attr_type *radius_get_attr_type(u8 type)
 | 
				
			||||||
 | 
					+static const struct radius_attr_type * radius_get_attr_type(u16 type)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					 	size_t i;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -277,23 +298,60 @@ static const struct radius_attr_type *radius_get_attr_type(u8 type)
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+static bool radius_is_long_ext_type(u8 type)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return type == RADIUS_ATTR_LONG_EXT_TYPE_1 ||
 | 
				
			||||||
 | 
					+		type == RADIUS_ATTR_LONG_EXT_TYPE_2;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+static bool radius_is_ext_type(u8 type)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	return type >= RADIUS_ATTR_EXT_TYPE_1 &&
 | 
				
			||||||
 | 
					+		type <= RADIUS_ATTR_LONG_EXT_TYPE_2;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 static void radius_msg_dump_attr(struct radius_attr_hdr *hdr)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					+	struct radius_attr_hdr_ext *ext = NULL;
 | 
				
			||||||
 | 
					 	const struct radius_attr_type *attr;
 | 
				
			||||||
 | 
					 	int len;
 | 
				
			||||||
 | 
					 	unsigned char *pos;
 | 
				
			||||||
 | 
					 	char buf[1000];
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	attr = radius_get_attr_type(hdr->type);
 | 
				
			||||||
 | 
					+	if (hdr->length < sizeof(struct radius_attr_hdr))
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	wpa_printf(MSG_INFO, "   Attribute %d (%s) length=%d",
 | 
				
			||||||
 | 
					-		   hdr->type, attr ? attr->name : "?Unknown?", hdr->length);
 | 
				
			||||||
 | 
					+	if (radius_is_ext_type(hdr->type)) {
 | 
				
			||||||
 | 
					+		if (hdr->length < 4) {
 | 
				
			||||||
 | 
					+			wpa_printf(MSG_INFO,
 | 
				
			||||||
 | 
					+				   "   Invalid attribute %d (too short for extended type)",
 | 
				
			||||||
 | 
					+				hdr->type);
 | 
				
			||||||
 | 
					+			return;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (attr == NULL || hdr->length < sizeof(struct radius_attr_hdr))
 | 
				
			||||||
 | 
					-		return;
 | 
				
			||||||
 | 
					+		ext = (struct radius_attr_hdr_ext *) hdr;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (ext) {
 | 
				
			||||||
 | 
					+		attr = radius_get_attr_type((ext->type << 8) | ext->ext_type);
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_INFO, "   Attribute %d.%d (%s) length=%d",
 | 
				
			||||||
 | 
					+			   ext->type, ext->ext_type,
 | 
				
			||||||
 | 
					+			   attr ? attr->name : "?Unknown?", ext->length);
 | 
				
			||||||
 | 
					+		pos = (unsigned char *) (ext + 1);
 | 
				
			||||||
 | 
					+		len = ext->length - sizeof(struct radius_attr_hdr_ext);
 | 
				
			||||||
 | 
					+	} else {
 | 
				
			||||||
 | 
					+		attr = radius_get_attr_type(hdr->type);
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_INFO, "   Attribute %d (%s) length=%d",
 | 
				
			||||||
 | 
					+			   hdr->type, attr ? attr->name : "?Unknown?",
 | 
				
			||||||
 | 
					+			   hdr->length);
 | 
				
			||||||
 | 
					+		pos = (unsigned char *) (hdr + 1);
 | 
				
			||||||
 | 
					+		len = hdr->length - sizeof(struct radius_attr_hdr);
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	len = hdr->length - sizeof(struct radius_attr_hdr);
 | 
				
			||||||
 | 
					-	pos = (unsigned char *) (hdr + 1);
 | 
				
			||||||
 | 
					+	if (!attr)
 | 
				
			||||||
 | 
					+		return;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	switch (attr->data_type) {
 | 
				
			||||||
 | 
					 	case RADIUS_ATTR_TEXT:
 | 
				
			||||||
 | 
					@@ -627,22 +685,54 @@ static int radius_msg_add_attr_to_array(struct radius_msg *msg,
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-struct radius_attr_hdr *radius_msg_add_attr(struct radius_msg *msg, u8 type,
 | 
				
			||||||
 | 
					-					    const u8 *data, size_t data_len)
 | 
				
			||||||
 | 
					+struct radius_attr_hdr * radius_msg_add_attr(struct radius_msg *msg, u16 type,
 | 
				
			||||||
 | 
					+					     const u8 *data, size_t data_len)
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					-	size_t buf_needed;
 | 
				
			||||||
 | 
					-	struct radius_attr_hdr *attr;
 | 
				
			||||||
 | 
					+	size_t buf_needed, max_len;
 | 
				
			||||||
 | 
					+	struct radius_attr_hdr *attr = NULL;
 | 
				
			||||||
 | 
					+	struct radius_attr_hdr_ext *ext;
 | 
				
			||||||
 | 
					+	u8 ext_type = 0;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (TEST_FAIL())
 | 
				
			||||||
 | 
					 		return NULL;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	if (data_len > RADIUS_MAX_ATTR_LEN) {
 | 
				
			||||||
 | 
					-		wpa_printf(MSG_ERROR, "radius_msg_add_attr: too long attribute (%lu bytes)",
 | 
				
			||||||
 | 
					-		       (unsigned long) data_len);
 | 
				
			||||||
 | 
					-		return NULL;
 | 
				
			||||||
 | 
					+	if (type > 255) {
 | 
				
			||||||
 | 
					+		if (!radius_is_ext_type(type >> 8)) {
 | 
				
			||||||
 | 
					+			wpa_printf(MSG_ERROR,
 | 
				
			||||||
 | 
					+				   "%s: Undefined extended type %d.%d",
 | 
				
			||||||
 | 
					+				   __func__, type >> 8, type & 0xff);
 | 
				
			||||||
 | 
					+			return NULL;
 | 
				
			||||||
 | 
					+		}
 | 
				
			||||||
 | 
					+		ext_type = type & 0xff;
 | 
				
			||||||
 | 
					+		type >>= 8;
 | 
				
			||||||
 | 
					+	} else if (radius_is_ext_type(type)) {
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_ERROR, "%s: Unexpected extended type use for %d",
 | 
				
			||||||
 | 
					+			   __func__, type);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	buf_needed = sizeof(*attr) + data_len;
 | 
				
			||||||
 | 
					+	if (radius_is_long_ext_type(type)) {
 | 
				
			||||||
 | 
					+		size_t hdr_len = sizeof(struct radius_attr_hdr_ext) + 1;
 | 
				
			||||||
 | 
					+		size_t plen = 255 - hdr_len;
 | 
				
			||||||
 | 
					+		size_t num;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		max_len = 4096;
 | 
				
			||||||
 | 
					+		num = (data_len + plen - 1) / plen;
 | 
				
			||||||
 | 
					+		if (num == 0)
 | 
				
			||||||
 | 
					+			num = 1;
 | 
				
			||||||
 | 
					+		buf_needed = num * hdr_len + data_len;
 | 
				
			||||||
 | 
					+	} else if (radius_is_ext_type(type)) {
 | 
				
			||||||
 | 
					+		max_len = RADIUS_MAX_EXT_ATTR_LEN;
 | 
				
			||||||
 | 
					+		buf_needed = sizeof(struct radius_attr_hdr_ext) + data_len;
 | 
				
			||||||
 | 
					+	} else {
 | 
				
			||||||
 | 
					+		max_len = RADIUS_MAX_ATTR_LEN;
 | 
				
			||||||
 | 
					+		buf_needed = sizeof(*attr) + data_len;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+	if (data_len > max_len) {
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_ERROR,
 | 
				
			||||||
 | 
					+			   "%s: too long attribute (%zu > %zu bytes)",
 | 
				
			||||||
 | 
					+			   __func__, data_len, max_len);
 | 
				
			||||||
 | 
					+		return NULL;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (wpabuf_tailroom(msg->buf) < buf_needed) {
 | 
				
			||||||
 | 
					 		/* allocate more space for message buffer */
 | 
				
			||||||
 | 
					@@ -651,13 +741,44 @@ struct radius_attr_hdr *radius_msg_add_attr(struct radius_msg *msg, u8 type,
 | 
				
			||||||
 | 
					 		msg->hdr = wpabuf_mhead(msg->buf);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	attr = wpabuf_put(msg->buf, sizeof(struct radius_attr_hdr));
 | 
				
			||||||
 | 
					-	attr->type = type;
 | 
				
			||||||
 | 
					-	attr->length = sizeof(*attr) + data_len;
 | 
				
			||||||
 | 
					-	wpabuf_put_data(msg->buf, data, data_len);
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					-	if (radius_msg_add_attr_to_array(msg, attr))
 | 
				
			||||||
 | 
					-		return NULL;
 | 
				
			||||||
 | 
					+	if (radius_is_long_ext_type(type)) {
 | 
				
			||||||
 | 
					+		size_t plen = 255 - sizeof(struct radius_attr_hdr_ext) - 1;
 | 
				
			||||||
 | 
					+		size_t alen;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+		do {
 | 
				
			||||||
 | 
					+			alen = data_len > plen ? plen : data_len;
 | 
				
			||||||
 | 
					+			ext = wpabuf_put(msg->buf,
 | 
				
			||||||
 | 
					+					 sizeof(struct radius_attr_hdr_ext));
 | 
				
			||||||
 | 
					+			if (!attr)
 | 
				
			||||||
 | 
					+				attr = (struct radius_attr_hdr *) ext;
 | 
				
			||||||
 | 
					+			ext->type = type;
 | 
				
			||||||
 | 
					+			ext->length = sizeof(*ext) + 1 + alen;
 | 
				
			||||||
 | 
					+			ext->ext_type = ext_type;
 | 
				
			||||||
 | 
					+			wpabuf_put_u8(msg->buf, data_len > alen ? 0x80 : 0);
 | 
				
			||||||
 | 
					+			wpabuf_put_data(msg->buf, data, data_len);
 | 
				
			||||||
 | 
					+			data += alen;
 | 
				
			||||||
 | 
					+			data_len -= alen;
 | 
				
			||||||
 | 
					+			if (radius_msg_add_attr_to_array(
 | 
				
			||||||
 | 
					+				    msg, (struct radius_attr_hdr *) ext))
 | 
				
			||||||
 | 
					+				return NULL;
 | 
				
			||||||
 | 
					+		} while (data_len > 0);
 | 
				
			||||||
 | 
					+	} else if (radius_is_ext_type(type)) {
 | 
				
			||||||
 | 
					+		ext = wpabuf_put(msg->buf, sizeof(struct radius_attr_hdr_ext));
 | 
				
			||||||
 | 
					+		attr = (struct radius_attr_hdr *) ext;
 | 
				
			||||||
 | 
					+		ext->type = type;
 | 
				
			||||||
 | 
					+		ext->length = sizeof(*ext) + data_len;
 | 
				
			||||||
 | 
					+		ext->ext_type = ext_type;
 | 
				
			||||||
 | 
					+		wpabuf_put_data(msg->buf, data, data_len);
 | 
				
			||||||
 | 
					+		if (radius_msg_add_attr_to_array(msg, attr))
 | 
				
			||||||
 | 
					+			return NULL;
 | 
				
			||||||
 | 
					+	} else {
 | 
				
			||||||
 | 
					+		attr = wpabuf_put(msg->buf, sizeof(struct radius_attr_hdr));
 | 
				
			||||||
 | 
					+		attr->type = type;
 | 
				
			||||||
 | 
					+		attr->length = sizeof(*attr) + data_len;
 | 
				
			||||||
 | 
					+		wpabuf_put_data(msg->buf, data, data_len);
 | 
				
			||||||
 | 
					+		if (radius_msg_add_attr_to_array(msg, attr))
 | 
				
			||||||
 | 
					+			return NULL;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	return attr;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					@@ -1285,6 +1406,28 @@ int radius_msg_add_wfa(struct radius_msg *msg, u8 subtype, const u8 *data,
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+int radius_msg_add_ext_vs(struct radius_msg *msg, u16 type, u32 vendor_id,
 | 
				
			||||||
 | 
					+			  u8 vendor_type, const u8 *data, size_t len)
 | 
				
			||||||
 | 
					+{
 | 
				
			||||||
 | 
					+	struct radius_attr_hdr *attr;
 | 
				
			||||||
 | 
					+	u8 *buf, *pos;
 | 
				
			||||||
 | 
					+	size_t alen;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	alen = 4 + 1 + len;
 | 
				
			||||||
 | 
					+	buf = os_malloc(alen);
 | 
				
			||||||
 | 
					+	if (!buf)
 | 
				
			||||||
 | 
					+		return 0;
 | 
				
			||||||
 | 
					+	pos = buf;
 | 
				
			||||||
 | 
					+	WPA_PUT_BE32(pos, vendor_id);
 | 
				
			||||||
 | 
					+	pos += 4;
 | 
				
			||||||
 | 
					+	*pos++ = vendor_type;
 | 
				
			||||||
 | 
					+	os_memcpy(pos, data, len);
 | 
				
			||||||
 | 
					+	attr = radius_msg_add_attr(msg, type, buf, alen);
 | 
				
			||||||
 | 
					+	os_free(buf);
 | 
				
			||||||
 | 
					+	return attr != NULL;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 int radius_user_password_hide(struct radius_msg *msg,
 | 
				
			||||||
 | 
					 			      const u8 *data, size_t data_len,
 | 
				
			||||||
 | 
					 			      const u8 *secret, size_t secret_len,
 | 
				
			||||||
 | 
					diff --git a/src/radius/radius.h b/src/radius/radius.h
 | 
				
			||||||
 | 
					index fb8148180..490c8d1f6 100644
 | 
				
			||||||
 | 
					--- a/src/radius/radius.h
 | 
				
			||||||
 | 
					+++ b/src/radius/radius.h
 | 
				
			||||||
 | 
					@@ -1,6 +1,6 @@
 | 
				
			||||||
 | 
					 /*
 | 
				
			||||||
 | 
					  * RADIUS message processing
 | 
				
			||||||
 | 
					- * Copyright (c) 2002-2009, 2012, 2014-2015, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					+ * Copyright (c) 2002-2009, 2012, 2014-2022, Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					  *
 | 
				
			||||||
 | 
					  * This software may be distributed under the terms of the BSD license.
 | 
				
			||||||
 | 
					  * See README for more details.
 | 
				
			||||||
 | 
					@@ -46,7 +46,15 @@ struct radius_attr_hdr {
 | 
				
			||||||
 | 
					 	/* followed by length-2 octets of attribute value */
 | 
				
			||||||
 | 
					 } STRUCT_PACKED;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+struct radius_attr_hdr_ext {
 | 
				
			||||||
 | 
					+	u8 type;
 | 
				
			||||||
 | 
					+	u8 length; /* including this header */
 | 
				
			||||||
 | 
					+	u8 ext_type;
 | 
				
			||||||
 | 
					+	/* followed by length-3 octets of attribute value */
 | 
				
			||||||
 | 
					+} STRUCT_PACKED;
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 #define RADIUS_MAX_ATTR_LEN (255 - sizeof(struct radius_attr_hdr))
 | 
				
			||||||
 | 
					+#define RADIUS_MAX_EXT_ATTR_LEN (255 - sizeof(struct radius_attr_hdr_ext))
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 enum { RADIUS_ATTR_USER_NAME = 1,
 | 
				
			||||||
 | 
					        RADIUS_ATTR_USER_PASSWORD = 2,
 | 
				
			||||||
 | 
					@@ -113,6 +121,18 @@ enum { RADIUS_ATTR_USER_NAME = 1,
 | 
				
			||||||
 | 
					        RADIUS_ATTR_WLAN_GROUP_CIPHER = 187,
 | 
				
			||||||
 | 
					        RADIUS_ATTR_WLAN_AKM_SUITE = 188,
 | 
				
			||||||
 | 
					        RADIUS_ATTR_WLAN_GROUP_MGMT_CIPHER = 189,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_EXT_TYPE_1 = 241,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_EXT_TYPE_2 = 242,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_EXT_TYPE_3 = 243,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_EXT_TYPE_4 = 244,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_LONG_EXT_TYPE_1 = 245,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_LONG_EXT_TYPE_2 = 246,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_EXT_VENDOR_SPECIFIC_1 = (241 << 8) | 26,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_EXT_VENDOR_SPECIFIC_2 = (242 << 8) | 26,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_EXT_VENDOR_SPECIFIC_3 = (243 << 8) | 26,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_EXT_VENDOR_SPECIFIC_4 = (244 << 8) | 26,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_EXT_VENDOR_SPECIFIC_5 = (245 << 8) | 26,
 | 
				
			||||||
 | 
					+       RADIUS_ATTR_EXT_VENDOR_SPECIFIC_6 = (246 << 8) | 26,
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -257,7 +277,7 @@ int radius_msg_verify_acct_req(struct radius_msg *msg, const u8 *secret,
 | 
				
			||||||
 | 
					 int radius_msg_verify_das_req(struct radius_msg *msg, const u8 *secret,
 | 
				
			||||||
 | 
					 			      size_t secret_len,
 | 
				
			||||||
 | 
					 			      int require_message_authenticator);
 | 
				
			||||||
 | 
					-struct radius_attr_hdr * radius_msg_add_attr(struct radius_msg *msg, u8 type,
 | 
				
			||||||
 | 
					+struct radius_attr_hdr * radius_msg_add_attr(struct radius_msg *msg, u16 type,
 | 
				
			||||||
 | 
					 					     const u8 *data, size_t data_len);
 | 
				
			||||||
 | 
					 struct radius_msg * radius_msg_parse(const u8 *data, size_t len);
 | 
				
			||||||
 | 
					 int radius_msg_add_eap(struct radius_msg *msg, const u8 *data,
 | 
				
			||||||
 | 
					@@ -284,6 +304,8 @@ int radius_msg_add_mppe_keys(struct radius_msg *msg,
 | 
				
			||||||
 | 
					 			     const u8 *recv_key, size_t recv_key_len);
 | 
				
			||||||
 | 
					 int radius_msg_add_wfa(struct radius_msg *msg, u8 subtype, const u8 *data,
 | 
				
			||||||
 | 
					 		       size_t len);
 | 
				
			||||||
 | 
					+int radius_msg_add_ext_vs(struct radius_msg *msg, u16 type, u32 vendor_id,
 | 
				
			||||||
 | 
					+			  u8 vendor_type, const u8 *data, size_t len);
 | 
				
			||||||
 | 
					 int radius_user_password_hide(struct radius_msg *msg,
 | 
				
			||||||
 | 
					 			      const u8 *data, size_t data_len,
 | 
				
			||||||
 | 
					 			      const u8 *secret, size_t secret_len,
 | 
				
			||||||
 | 
					-- 
 | 
				
			||||||
 | 
					2.25.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -0,0 +1,102 @@
 | 
				
			|||||||
 | 
					From b94371af8402f60218716552e571ca72cff4e3c0 Mon Sep 17 00:00:00 2001
 | 
				
			||||||
 | 
					From: Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					Date: Fri, 15 Apr 2022 17:36:25 +0300
 | 
				
			||||||
 | 
					Subject: [PATCH] RADIUS attributes for EAPOL-Key message details
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Use vendor specific RADIUS attributes for sending ANonce and EAPOL-Key
 | 
				
			||||||
 | 
					msg 2/4 for the wpa_psk_radius=3 case. The vendor specific attributes
 | 
				
			||||||
 | 
					for this are defined in FreeRADIUS as follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BEGIN-VENDOR    FreeRADIUS      format=Extended-Vendor-Specific-5
 | 
				
			||||||
 | 
					ATTRIBUTE       FreeRADIUS-802.1X-Anonce        1       octets[32]
 | 
				
			||||||
 | 
					ATTRIBUTE       FreeRADIUS-802.1X-EAPoL-Key-Msg 2       octets
 | 
				
			||||||
 | 
					END-VENDOR      FreeRADIUS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Signed-off-by: Jouni Malinen <j@w1.fi>
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					 src/ap/ieee802_11_auth.c | 29 +++++++++++++++++++++++++++++
 | 
				
			||||||
 | 
					 src/radius/radius.h      |  7 +++++++
 | 
				
			||||||
 | 
					 2 files changed, 36 insertions(+)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					diff --git a/src/ap/ieee802_11_auth.c b/src/ap/ieee802_11_auth.c
 | 
				
			||||||
 | 
					index a54d7616e..4277d82cb 100644
 | 
				
			||||||
 | 
					--- a/src/ap/ieee802_11_auth.c
 | 
				
			||||||
 | 
					+++ b/src/ap/ieee802_11_auth.c
 | 
				
			||||||
 | 
					@@ -47,6 +47,9 @@ struct hostapd_acl_query_data {
 | 
				
			||||||
 | 
					 	struct hostapd_acl_query_data *next;
 | 
				
			||||||
 | 
					 	bool radius_psk;
 | 
				
			||||||
 | 
					 	int akm;
 | 
				
			||||||
 | 
					+	u8 *anonce;
 | 
				
			||||||
 | 
					+	u8 *eapol;
 | 
				
			||||||
 | 
					+	size_t eapol_len;
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -102,6 +105,8 @@ static void hostapd_acl_query_free(struct hostapd_acl_query_data *query)
 | 
				
			||||||
 | 
					 	if (!query)
 | 
				
			||||||
 | 
					 		return;
 | 
				
			||||||
 | 
					 	os_free(query->auth_msg);
 | 
				
			||||||
 | 
					+	os_free(query->anonce);
 | 
				
			||||||
 | 
					+	os_free(query->eapol);
 | 
				
			||||||
 | 
					 	os_free(query);
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -164,6 +169,24 @@ static int hostapd_radius_acl_query(struct hostapd_data *hapd, const u8 *addr,
 | 
				
			||||||
 | 
					 		goto fail;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	if (query->anonce &&
 | 
				
			||||||
 | 
					+	    !radius_msg_add_ext_vs(msg, RADIUS_ATTR_EXT_VENDOR_SPECIFIC_5,
 | 
				
			||||||
 | 
					+				   RADIUS_VENDOR_ID_FREERADIUS,
 | 
				
			||||||
 | 
					+				   RADIUS_VENDOR_ATTR_FREERADIUS_802_1X_ANONCE,
 | 
				
			||||||
 | 
					+				   query->anonce, WPA_NONCE_LEN)) {
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_DEBUG, "Could not add FreeRADIUS-802.1X-Anonce");
 | 
				
			||||||
 | 
					+		goto fail;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	if (query->eapol &&
 | 
				
			||||||
 | 
					+	    !radius_msg_add_ext_vs(msg, RADIUS_ATTR_EXT_VENDOR_SPECIFIC_5,
 | 
				
			||||||
 | 
					+				   RADIUS_VENDOR_ID_FREERADIUS,
 | 
				
			||||||
 | 
					+				   RADIUS_VENDOR_ATTR_FREERADIUS_802_1X_EAPOL_KEY_MSG,
 | 
				
			||||||
 | 
					+				   query->eapol, query->eapol_len)) {
 | 
				
			||||||
 | 
					+		wpa_printf(MSG_DEBUG, "Could not add FreeRADIUS-802.1X-EAPoL-Key-Msg");
 | 
				
			||||||
 | 
					+		goto fail;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	if (radius_client_send(hapd->radius, msg, RADIUS_AUTH, addr) < 0)
 | 
				
			||||||
 | 
					 		goto fail;
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					@@ -703,6 +726,12 @@ void hostapd_acl_req_radius_psk(struct hostapd_data *hapd, const u8 *addr,
 | 
				
			||||||
 | 
					 	query->akm = key_mgmt;
 | 
				
			||||||
 | 
					 	os_get_reltime(&query->timestamp);
 | 
				
			||||||
 | 
					 	os_memcpy(query->addr, addr, ETH_ALEN);
 | 
				
			||||||
 | 
					+	if (anonce)
 | 
				
			||||||
 | 
					+		query->anonce = os_memdup(anonce, WPA_NONCE_LEN);
 | 
				
			||||||
 | 
					+	if (eapol) {
 | 
				
			||||||
 | 
					+		query->eapol = os_memdup(eapol, eapol_len);
 | 
				
			||||||
 | 
					+		query->eapol_len = eapol_len;
 | 
				
			||||||
 | 
					+	}
 | 
				
			||||||
 | 
					 	if (hostapd_radius_acl_query(hapd, addr, query)) {
 | 
				
			||||||
 | 
					 		wpa_printf(MSG_DEBUG,
 | 
				
			||||||
 | 
					 			   "Failed to send Access-Request for RADIUS PSK/ACL query");
 | 
				
			||||||
 | 
					diff --git a/src/radius/radius.h b/src/radius/radius.h
 | 
				
			||||||
 | 
					index 490c8d1f6..177c64a66 100644
 | 
				
			||||||
 | 
					--- a/src/radius/radius.h
 | 
				
			||||||
 | 
					+++ b/src/radius/radius.h
 | 
				
			||||||
 | 
					@@ -208,6 +208,13 @@ enum { RADIUS_VENDOR_ATTR_MS_MPPE_SEND_KEY = 16,
 | 
				
			||||||
 | 
					        RADIUS_VENDOR_ATTR_MS_MPPE_RECV_KEY = 17
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+/* FreeRADIUS vendor-specific attributes */
 | 
				
			||||||
 | 
					+#define RADIUS_VENDOR_ID_FREERADIUS 11344
 | 
				
			||||||
 | 
					+/* Extended-Vendor-Specific-5 (245.26; long extended header) */
 | 
				
			||||||
 | 
					+enum {
 | 
				
			||||||
 | 
					+	RADIUS_VENDOR_ATTR_FREERADIUS_802_1X_ANONCE = 1,
 | 
				
			||||||
 | 
					+	RADIUS_VENDOR_ATTR_FREERADIUS_802_1X_EAPOL_KEY_MSG = 2,
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* Hotspot 2.0 - WFA Vendor-specific RADIUS Attributes */
 | 
				
			||||||
 | 
					 #define RADIUS_VENDOR_ID_WFA 40808
 | 
				
			||||||
 | 
					-- 
 | 
				
			||||||
 | 
					2.25.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					--- a/src/ap/ieee802_11_auth.c
 | 
				
			||||||
 | 
					+++ b/src/ap/ieee802_11_auth.c
 | 
				
			||||||
 | 
					@@ -578,6 +578,8 @@ hostapd_acl_recv_radius(struct radius_ms
 | 
				
			||||||
 | 
					 				os_memcpy(info->radius_cui, buf, len);
 | 
				
			||||||
 | 
					 		}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+		radius_msg_get_wispr(msg, info->bandwidth);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 		if (hapd->conf->wpa_psk_radius == PSK_RADIUS_REQUIRED &&
 | 
				
			||||||
 | 
					 		    !info->psk)
 | 
				
			||||||
 | 
					 			cache->accepted = HOSTAPD_ACL_REJECT;
 | 
				
			||||||
 | 
					--- a/src/ap/ieee802_11_auth.h
 | 
				
			||||||
 | 
					+++ b/src/ap/ieee802_11_auth.h
 | 
				
			||||||
 | 
					@@ -23,6 +23,7 @@ struct radius_sta {
 | 
				
			||||||
 | 
					 	struct hostapd_sta_wpa_psk_short *psk;
 | 
				
			||||||
 | 
					 	char *identity;
 | 
				
			||||||
 | 
					 	char *radius_cui;
 | 
				
			||||||
 | 
					+	u32 bandwidth[2];
 | 
				
			||||||
 | 
					 };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 int hostapd_check_acl(struct hostapd_data *hapd, const u8 *addr,
 | 
				
			||||||
 | 
					--- a/src/ap/ieee802_11.c
 | 
				
			||||||
 | 
					+++ b/src/ap/ieee802_11.c
 | 
				
			||||||
 | 
					@@ -2406,6 +2406,8 @@ int ieee802_11_set_radius_info(struct ho
 | 
				
			||||||
 | 
					 		ap_sta_no_session_timeout(hapd, sta);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+	os_memcpy(sta->bandwidth, info->bandwidth, sizeof(sta->bandwidth));
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -18,6 +18,13 @@ qcom_setup_interfaces()
 | 
				
			|||||||
	cig,wf186h)
 | 
						cig,wf186h)
 | 
				
			||||||
		ucidef_add_switch "switch0" "4:wan" "1:lan" "2:lan" "6@eth0"
 | 
							ucidef_add_switch "switch0" "4:wan" "1:lan" "2:lan" "6@eth0"
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						cybertan,eww631-a1)
 | 
				
			||||||
 | 
							ucidef_set_interface_wan "eth0"
 | 
				
			||||||
 | 
							ucidef_set_interface_lan ""
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
 | 
						cybertan,eww631-b1)
 | 
				
			||||||
 | 
							ucidef_add_switch "switch1" "5:wan" "2:lan" "3:lan" "4:lan" "6@eth0"
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	edgecore,oap101|\
 | 
						edgecore,oap101|\
 | 
				
			||||||
 	edgecore,oap101-6e|\
 | 
					 	edgecore,oap101-6e|\
 | 
				
			||||||
	edgecore,oap101e|\
 | 
						edgecore,oap101e|\
 | 
				
			||||||
@@ -63,6 +70,18 @@ qcom_setup_macs()
 | 
				
			|||||||
		ucidef_set_network_device_mac eth0 $wan_mac
 | 
							ucidef_set_network_device_mac eth0 $wan_mac
 | 
				
			||||||
		ip link set eth0 address $wan_mac
 | 
							ip link set eth0 address $wan_mac
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						cybertan,eww631-a1|\
 | 
				
			||||||
 | 
						cybertan,eww631-b1)
 | 
				
			||||||
 | 
							mtd=$(find_mtd_chardev "0:APPSBLENV")
 | 
				
			||||||
 | 
							[ -z "$mtd" ] && return;
 | 
				
			||||||
 | 
							mac=$(grep BaseMacAddress= $mtd | cut -d '=' -f2)
 | 
				
			||||||
 | 
							[ -z "$mac" ] && return;
 | 
				
			||||||
 | 
							wan_mac=$(macaddr_canonicalize $mac)
 | 
				
			||||||
 | 
							lan_mac=$(macaddr_add "$wan_mac" 1)
 | 
				
			||||||
 | 
							ucidef_set_network_device_mac eth0 $wan_mac
 | 
				
			||||||
 | 
							ip link set eth0 address $wan_mac
 | 
				
			||||||
 | 
							ucidef_set_label_macaddr $wan_mac
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	*)
 | 
						*)
 | 
				
			||||||
		wan_mac=$(cat /sys/class/net/eth0/address)
 | 
							wan_mac=$(cat /sys/class/net/eth0/address)
 | 
				
			||||||
		lan_mac=$(macaddr_add "$wan_mac" 1)
 | 
							lan_mac=$(macaddr_add "$wan_mac" 1)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,6 +39,28 @@ ath11k_generate_macs_ion4x() {
 | 
				
			|||||||
	echo -ne \\x${wifimac2//:/\\x} >> /lib/firmware/ath11k-macs
 | 
						echo -ne \\x${wifimac2//:/\\x} >> /lib/firmware/ath11k-macs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ath11k_generate_macs_eww631_a1() {
 | 
				
			||||||
 | 
						touch /lib/firmware/ath11k-macs
 | 
				
			||||||
 | 
						local dev=$(find_mtd_chardev "0:APPSBLENV")
 | 
				
			||||||
 | 
						mac=$(grep BaseMacAddress= $dev | cut -d '=' -f2)
 | 
				
			||||||
 | 
						eth=$(macaddr_canonicalize $mac)
 | 
				
			||||||
 | 
						mac1=$(macaddr_add $eth 1)
 | 
				
			||||||
 | 
						mac2=$(macaddr_add $eth 2)
 | 
				
			||||||
 | 
						echo -ne \\x${mac1//:/\\x} >> /lib/firmware/ath11k-macs
 | 
				
			||||||
 | 
						echo -ne \\x${mac2//:/\\x} >> /lib/firmware/ath11k-macs
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ath11k_generate_macs_eww631_b1() {
 | 
				
			||||||
 | 
						touch /lib/firmware/ath11k-macs
 | 
				
			||||||
 | 
						local dev=$(find_mtd_chardev "0:APPSBLENV")
 | 
				
			||||||
 | 
						mac=$(grep BaseMacAddress= $dev | cut -d '=' -f2)
 | 
				
			||||||
 | 
						eth=$(macaddr_canonicalize $mac)
 | 
				
			||||||
 | 
						mac1=$(macaddr_add $eth 2)
 | 
				
			||||||
 | 
						mac2=$(macaddr_add $eth 3)
 | 
				
			||||||
 | 
						echo -ne \\x${mac1//:/\\x} >> /lib/firmware/ath11k-macs
 | 
				
			||||||
 | 
						echo -ne \\x${mac2//:/\\x} >> /lib/firmware/ath11k-macs
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
caldata_die() {
 | 
					caldata_die() {
 | 
				
			||||||
	echo "caldata: " "$*"
 | 
						echo "caldata: " "$*"
 | 
				
			||||||
	exit 1
 | 
						exit 1
 | 
				
			||||||
@@ -64,6 +86,8 @@ ath11k/IPQ5018/hw1.0/caldata.bin)
 | 
				
			|||||||
	case "$board" in
 | 
						case "$board" in
 | 
				
			||||||
	cig,wf186w|\
 | 
						cig,wf186w|\
 | 
				
			||||||
	cig,wf186h|\
 | 
						cig,wf186h|\
 | 
				
			||||||
 | 
						cybertan,eww631-a1|\
 | 
				
			||||||
 | 
						cybertan,eww631-b1|\
 | 
				
			||||||
	edgecore,eap104|\
 | 
						edgecore,eap104|\
 | 
				
			||||||
	edgecore,oap101|\
 | 
						edgecore,oap101|\
 | 
				
			||||||
	edgecore,oap101-6e|\
 | 
						edgecore,oap101-6e|\
 | 
				
			||||||
@@ -84,6 +108,8 @@ ath11k/qcn6122/hw1.0/caldata_1.bin)
 | 
				
			|||||||
	case "$board" in
 | 
						case "$board" in
 | 
				
			||||||
	cig,wf186w|\
 | 
						cig,wf186w|\
 | 
				
			||||||
	cig,wf186h|\
 | 
						cig,wf186h|\
 | 
				
			||||||
 | 
						cybertan,eww631-a1|\
 | 
				
			||||||
 | 
						cybertan,eww631-b1|\
 | 
				
			||||||
	edgecore,oap101|\
 | 
						edgecore,oap101|\
 | 
				
			||||||
	edgecore,oap101-6e|\
 | 
						edgecore,oap101-6e|\
 | 
				
			||||||
	edgecore,oap101e|\
 | 
						edgecore,oap101e|\
 | 
				
			||||||
@@ -101,6 +127,10 @@ ath11k/qcn6122/hw1.0/caldata_2.bin)
 | 
				
			|||||||
	edgecore,oap101e-6e)
 | 
						edgecore,oap101e-6e)
 | 
				
			||||||
		caldata_extract "0:ART" 0x4c000 0x20000  
 | 
							caldata_extract "0:ART" 0x4c000 0x20000  
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						cybertan,eww631-a1|\
 | 
				
			||||||
 | 
						cybertan,eww631-b1)
 | 
				
			||||||
 | 
							caldata_extract "0:ART" 0x26800 0x20000
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
ath11k/QCN9074/hw1.0/caldata_1.bin)
 | 
					ath11k/QCN9074/hw1.0/caldata_1.bin)
 | 
				
			||||||
@@ -119,7 +149,15 @@ ath11k-macs)
 | 
				
			|||||||
	cig,wf186h)
 | 
						cig,wf186h)
 | 
				
			||||||
		ath11k_generate_macs_wf186w
 | 
							ath11k_generate_macs_wf186w
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						cybertan,eww631-a1)
 | 
				
			||||||
 | 
							ath11k_generate_macs_eww631_a1
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
 | 
						cybertan,eww631-b1)
 | 
				
			||||||
 | 
							ath11k_generate_macs_eww631_b1
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	edgecore,eap104|\
 | 
						edgecore,eap104|\
 | 
				
			||||||
 | 
						edgecore,oap101-6e|\
 | 
				
			||||||
 | 
						edgecore,oap101e-6e|\
 | 
				
			||||||
	optimcloud,d60|\
 | 
						optimcloud,d60|\
 | 
				
			||||||
	optimcloud,d60-5g|\
 | 
						optimcloud,d60-5g|\
 | 
				
			||||||
	optimcloud,d50|\
 | 
						optimcloud,d50|\
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -247,8 +247,8 @@ nand_do_upgrade_success() {
 | 
				
			|||||||
	local conf_tar="/tmp/sysupgrade.tgz"
 | 
						local conf_tar="/tmp/sysupgrade.tgz"
 | 
				
			||||||
	sync
 | 
						sync
 | 
				
			||||||
	[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
 | 
						[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
 | 
				
			||||||
 | 
						[ -f "$conf_tar" ] && nand_restore_config "$conf_tar" && sync
 | 
				
			||||||
	[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
 | 
						[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
 | 
				
			||||||
	[ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
 | 
					 | 
				
			||||||
	echo "sysupgrade successful"
 | 
						echo "sysupgrade successful"
 | 
				
			||||||
	umount -a
 | 
						umount -a
 | 
				
			||||||
	reboot -f
 | 
						reboot -f
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,6 +70,8 @@ platform_check_image() {
 | 
				
			|||||||
	case $board in
 | 
						case $board in
 | 
				
			||||||
	cig,wf186w|\
 | 
						cig,wf186w|\
 | 
				
			||||||
	cig,wf186h|\
 | 
						cig,wf186h|\
 | 
				
			||||||
 | 
						cybertan,eww631-a1|\
 | 
				
			||||||
 | 
						cybertan,eww631-b1|\
 | 
				
			||||||
	edgecore,eap104|\
 | 
						edgecore,eap104|\
 | 
				
			||||||
	hfcl,ion4x_w|\
 | 
						hfcl,ion4x_w|\
 | 
				
			||||||
	hfcl,ion4xi_w|\
 | 
						hfcl,ion4xi_w|\
 | 
				
			||||||
@@ -130,5 +132,18 @@ platform_do_upgrade() {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		nand_upgrade_tar "$1"
 | 
							nand_upgrade_tar "$1"
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
 | 
						cybertan,eww631-a1|\
 | 
				
			||||||
 | 
						cybertan,eww631-b1)
 | 
				
			||||||
 | 
							boot_part=$(fw_printenv bootfrom | cut  -d = -f2)
 | 
				
			||||||
 | 
							echo "Current bootfrom is $boot_part"
 | 
				
			||||||
 | 
							if [[ $boot_part == 1 ]]; then
 | 
				
			||||||
 | 
								CI_UBIPART="rootfs"
 | 
				
			||||||
 | 
								CI_FWSETENV="bootfrom 0"
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								CI_UBIPART="rootfs_1"
 | 
				
			||||||
 | 
								CI_FWSETENV="bootfrom 1"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							nand_upgrade_tar "$1"
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,915 @@
 | 
				
			|||||||
 | 
					/dts-v1/;
 | 
				
			||||||
 | 
					/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission to use, copy, modify, and/or distribute this software for any
 | 
				
			||||||
 | 
					 * purpose with or without fee is hereby granted, provided that the above
 | 
				
			||||||
 | 
					 * copyright notice and this permission notice appear in all copies.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
				
			||||||
 | 
					 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
				
			||||||
 | 
					 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
				
			||||||
 | 
					 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
				
			||||||
 | 
					 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | 
				
			||||||
 | 
					 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 | 
				
			||||||
 | 
					 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "ipq5018.dtsi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/ {
 | 
				
			||||||
 | 
						#address-cells = <0x2>;
 | 
				
			||||||
 | 
						#size-cells = <0x2>;
 | 
				
			||||||
 | 
						model = "CyberTan EWW631-A1";
 | 
				
			||||||
 | 
						compatible = "cybertan,eww631-a1", "qcom,ipq5018-mp03.5", "qcom,ipq5018";
 | 
				
			||||||
 | 
						interrupt-parent = <&intc>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						aliases {
 | 
				
			||||||
 | 
							sdhc1 = &sdhc_1; /* SDC1 eMMC slot */
 | 
				
			||||||
 | 
							serial0 = &blsp1_uart1;
 | 
				
			||||||
 | 
							serial1 = &blsp1_uart2;
 | 
				
			||||||
 | 
							ethernet0 = "/soc/dp1";
 | 
				
			||||||
 | 
							ethernet1 = "/soc/dp2";
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						chosen {
 | 
				
			||||||
 | 
							bootargs = "console=ttyMSM0,115200,n8 rw init=/init";
 | 
				
			||||||
 | 
							bootargs-append = " swiotlb=1 coherent_pool=2M";
 | 
				
			||||||
 | 
							stdout-path = "serial0";
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reserved-memory {
 | 
				
			||||||
 | 
						#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
						/*                   256 MB Profile
 | 
				
			||||||
 | 
						 * +==========+==============+=========================+
 | 
				
			||||||
 | 
						 * |          |              |                         |
 | 
				
			||||||
 | 
						 * |  Region  | Start Offset |          Size           |
 | 
				
			||||||
 | 
						 * |          |              |                         |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    NSS   |  0x40000000  |           8MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   Linux  |  0x40800000  | Depends on total memory |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   uboot  |  0x4A600000  |           4MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    SBL   |  0x4AA00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   smem   |  0x4AB00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    TZ    |  0x4AC00000  |           4MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    Q6    |              |                         |
 | 
				
			||||||
 | 
						 * |   code/  |  0x4B000000  |          20MB           |
 | 
				
			||||||
 | 
						 * |   data   |              |                         |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4C400000  |          13MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4D100000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4D200000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4D300000  |          13MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4E000000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4E100000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4E200000  |          13MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4EF00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4F000000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |                                                   |
 | 
				
			||||||
 | 
						 * |            Rest of the memory for Linux           |
 | 
				
			||||||
 | 
						 * |                                                   |
 | 
				
			||||||
 | 
						 * +===================================================+
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
							q6_mem_regions: q6_mem_regions@4B000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4B000000 0x0 0x4100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_code_data: q6_code_data@4B000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4B000000 0x0 0x1400000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_ipq5018_data: q6_ipq5018_data@4C400000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4C400000 0x0 0xD00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump: m3_dump@4D100000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D100000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_etr_region: q6_etr_dump@4D200000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D200000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_data1: q6_qcn6122_data1@4D300000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D300000 0x0 0xD00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E000000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E100000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E100000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_data2: q6_qcn6122_data2@4E200000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E200000 0x0 0xD00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump_qcn6122_2: m3_dump_qcn6122_2@4EF00000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4EF00000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4F000000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
						/*                 512MB/1GB Profiles
 | 
				
			||||||
 | 
						 * +==========+==============+=========================+
 | 
				
			||||||
 | 
						 * |          |              |                         |
 | 
				
			||||||
 | 
						 * |  Region  | Start Offset |          Size           |
 | 
				
			||||||
 | 
						 * |          |              |                         |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    NSS   |  0x40000000  |          16MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   Linux  |  0x41000000  | Depends on total memory |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   uboot  |  0x4A600000  |           4MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    SBL   |  0x4AA00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   smem   |  0x4AB00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    TZ    |  0x4AC00000  |           4MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    Q6    |              |                         |
 | 
				
			||||||
 | 
						 * |   code/  |  0x4B000000  |          20MB           |
 | 
				
			||||||
 | 
						 * |   data   |              |                         |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4C400000  |          13MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4D100000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4D200000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |  Caldb   |  0x4D300000  |           2MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4D500000  |          13MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4E200000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4E300000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |  Caldb   |  0x4E400000  |           5MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4E900000  |          13MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4F600000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4F700000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |  Caldb   |  0x4F800000  |           5MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |                                                   |
 | 
				
			||||||
 | 
						 * |            Rest of the memory for Linux           |
 | 
				
			||||||
 | 
						 * |                                                   |
 | 
				
			||||||
 | 
						 * +===================================================+
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
							q6_mem_regions: q6_mem_regions@4B000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4B000000 0x0 0x4D00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_code_data: q6_code_data@4B000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4B000000 0x0 01400000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_ipq5018_data: q6_ipq5018_data@4C400000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4C400000 0x0 0xD00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump: m3_dump@4D100000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D100000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_etr_region: q6_etr_dump@4D200000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D200000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_caldb_region: q6_caldb_region@4D300000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D300000 0x0 0x200000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_data1: q6_qcn6122_data1@4D500000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D500000 0x0 0xD00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E200000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E200000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E300000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E300000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E400000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E400000 0x0 0x500000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_data2: q6_qcn6122_data2@4E900000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E900000 0x0 0xD00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump_qcn6122_2: m3_dump_qcn6122_2@4F600000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4F600000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F700000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4F700000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_caldb_2: q6_qcn6122_caldb_2@4F800000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4F800000 0x0 0x500000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						soc {
 | 
				
			||||||
 | 
							serial@78af000 {
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							blsp1_uart2: serial@78b0000 {
 | 
				
			||||||
 | 
								pinctrl-0 = <&blsp1_uart_pins>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qpic_bam: dma@7984000{
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							nand: qpic-nand@79b0000 {
 | 
				
			||||||
 | 
								pinctrl-0 = <&qspi_nand_pins>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							spi_0: spi@78b5000 { /* BLSP1 QUP0 */
 | 
				
			||||||
 | 
								pinctrl-0 = <&blsp0_spi_pins>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
								cs-select = <0>;
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								m25p80@0 {
 | 
				
			||||||
 | 
									#address-cells = <1>;
 | 
				
			||||||
 | 
									#size-cells = <1>;
 | 
				
			||||||
 | 
									reg = <0>;
 | 
				
			||||||
 | 
									compatible = "n25q128a11";
 | 
				
			||||||
 | 
									linux,modalias = "m25p80", "n25q128a11";
 | 
				
			||||||
 | 
									spi-max-frequency = <50000000>;
 | 
				
			||||||
 | 
									use-default-sizes;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mdio0: mdio@88000 {
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ethernet-phy@0 {
 | 
				
			||||||
 | 
									reg = <7>;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mdio1: mdio@90000 {
 | 
				
			||||||
 | 
								status = "disabled";
 | 
				
			||||||
 | 
								pinctrl-0 = <&mdio1_pins>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
								phy-reset-gpio = <&tlmm 39 0>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ethernet-phy@0 {
 | 
				
			||||||
 | 
									reg = <28>;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ess-instance {
 | 
				
			||||||
 | 
								num_devices = <0x1>;
 | 
				
			||||||
 | 
								ess-switch@0x39c00000 {
 | 
				
			||||||
 | 
									switch_mac_mode = <0xf>; /* mac mode for uniphy instance*/
 | 
				
			||||||
 | 
									cmnblk_clk = "internal_96MHz"; /* cmnblk clk*/
 | 
				
			||||||
 | 
									qcom,port_phyinfo {
 | 
				
			||||||
 | 
										port@0 {
 | 
				
			||||||
 | 
											port_id = <1>;
 | 
				
			||||||
 | 
											phy_address = <7>;
 | 
				
			||||||
 | 
											mdiobus = <&mdio0>;
 | 
				
			||||||
 | 
										};
 | 
				
			||||||
 | 
										/*
 | 
				
			||||||
 | 
										port@1 {
 | 
				
			||||||
 | 
											port_id = <2>;
 | 
				
			||||||
 | 
											phy_address = <0x1c>;
 | 
				
			||||||
 | 
											mdiobus = <&mdio1>;
 | 
				
			||||||
 | 
											port_mac_sel = "QGMAC_PORT";
 | 
				
			||||||
 | 
										};
 | 
				
			||||||
 | 
										*/
 | 
				
			||||||
 | 
									};
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
									led_source@0 {
 | 
				
			||||||
 | 
										source = <0>;
 | 
				
			||||||
 | 
										mode = "normal";
 | 
				
			||||||
 | 
										speed = "all";
 | 
				
			||||||
 | 
										blink_en = "enable";
 | 
				
			||||||
 | 
										active = "high";
 | 
				
			||||||
 | 
									};
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							dp1 {
 | 
				
			||||||
 | 
								device_type = "network";
 | 
				
			||||||
 | 
								compatible = "qcom,nss-dp";
 | 
				
			||||||
 | 
								clocks = <&gcc GCC_SNOC_GMAC0_AXI_CLK>;
 | 
				
			||||||
 | 
								clock-names = "nss-snoc-gmac-axi-clk";
 | 
				
			||||||
 | 
								qcom,id = <1>;
 | 
				
			||||||
 | 
								reg = <0x39C00000 0x10000>;
 | 
				
			||||||
 | 
								interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
 | 
				
			||||||
 | 
								qcom,mactype = <2>;
 | 
				
			||||||
 | 
								qcom,link-poll = <1>;
 | 
				
			||||||
 | 
								qcom,phy-mdio-addr = <7>;
 | 
				
			||||||
 | 
								mdio-bus = <&mdio0>;
 | 
				
			||||||
 | 
								local-mac-address = [000000000000];
 | 
				
			||||||
 | 
								phy-mode = "sgmii";
 | 
				
			||||||
 | 
								qcom,rx-page-mode = <0>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							dp2 {
 | 
				
			||||||
 | 
								device_type = "network";
 | 
				
			||||||
 | 
								compatible = "qcom,nss-dp";
 | 
				
			||||||
 | 
								clocks = <&gcc GCC_SNOC_GMAC1_AXI_CLK>;
 | 
				
			||||||
 | 
								clock-names = "nss-snoc-gmac-axi-clk";
 | 
				
			||||||
 | 
								qcom,id = <2>;
 | 
				
			||||||
 | 
								reg = <0x39D00000 0x10000>;
 | 
				
			||||||
 | 
								interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
 | 
				
			||||||
 | 
								qcom,mactype = <2>;
 | 
				
			||||||
 | 
								qcom,link-poll = <1>;
 | 
				
			||||||
 | 
								qcom,phy-mdio-addr = <28>;
 | 
				
			||||||
 | 
								mdio-bus = <&mdio1>;
 | 
				
			||||||
 | 
								local-mac-address = [000000000000];
 | 
				
			||||||
 | 
								phy-mode = "sgmii";
 | 
				
			||||||
 | 
								qcom,rx-page-mode = <0>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							nss-macsec1 {
 | 
				
			||||||
 | 
								compatible = "qcom,nss-macsec";
 | 
				
			||||||
 | 
								phy_addr = <0x1c>;
 | 
				
			||||||
 | 
								mdiobus = <&mdio1>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						qcom,test@0 {
 | 
				
			||||||
 | 
							status = "ok";
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						thermal-zones {
 | 
				
			||||||
 | 
							status = "ok";
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&tlmm {
 | 
				
			||||||
 | 
						pinctrl-0 = <&blsp0_uart_pins &phy_led_pins>;
 | 
				
			||||||
 | 
						pinctrl-names = "default";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						blsp0_uart_pins: blsp0_uart_pins {
 | 
				
			||||||
 | 
							blsp0_uart_rx_tx {
 | 
				
			||||||
 | 
								pins = "gpio20", "gpio21";
 | 
				
			||||||
 | 
								function = "blsp0_uart0";
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						blsp1_uart_pins: blsp1_uart_pins {
 | 
				
			||||||
 | 
							blsp1_uart_rx_tx {
 | 
				
			||||||
 | 
								pins = "gpio23", "gpio25", "gpio24", "gpio26";
 | 
				
			||||||
 | 
								function = "blsp1_uart2";
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						blsp0_spi_pins: blsp0_spi_pins {
 | 
				
			||||||
 | 
							mux {
 | 
				
			||||||
 | 
								pins = "gpio10", "gpio11", "gpio12", "gpio13";
 | 
				
			||||||
 | 
								function = "blsp0_spi";
 | 
				
			||||||
 | 
								drive-strength = <2>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						qspi_nand_pins: qspi_nand_pins {
 | 
				
			||||||
 | 
							qspi_clock {
 | 
				
			||||||
 | 
								pins = "gpio9";
 | 
				
			||||||
 | 
								function = "qspi_clk";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qspi_cs {
 | 
				
			||||||
 | 
								pins = "gpio8";
 | 
				
			||||||
 | 
								function = "qspi_cs";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qspi_data {
 | 
				
			||||||
 | 
								pins = "gpio4", "gpio5", "gpio6", "gpio7";
 | 
				
			||||||
 | 
								function = "qspi_data";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mdio1_pins: mdio_pinmux {
 | 
				
			||||||
 | 
							mux_0 {
 | 
				
			||||||
 | 
								pins = "gpio36";
 | 
				
			||||||
 | 
								function = "mdc";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-up;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_1 {
 | 
				
			||||||
 | 
								pins = "gpio37";
 | 
				
			||||||
 | 
								function = "mdio";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-up;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						phy_led_pins: phy_led_pins {
 | 
				
			||||||
 | 
							gephy_led_pin {
 | 
				
			||||||
 | 
								pins = "gpio46";
 | 
				
			||||||
 | 
								function = "led0";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i2c_pins: i2c_pins {
 | 
				
			||||||
 | 
							i2c_scl {
 | 
				
			||||||
 | 
								pins = "gpio25";
 | 
				
			||||||
 | 
								function = "blsp2_i2c1";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							i2c_sda {
 | 
				
			||||||
 | 
								pins = "gpio26";
 | 
				
			||||||
 | 
								function = "blsp2_i2c1";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						button_pins: button_pins {
 | 
				
			||||||
 | 
							reset_button {
 | 
				
			||||||
 | 
								pins = "gpio28";
 | 
				
			||||||
 | 
								function = "gpio";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-up;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						audio_pins: audio_pinmux {
 | 
				
			||||||
 | 
							mux_1 {
 | 
				
			||||||
 | 
								pins = "gpio24";
 | 
				
			||||||
 | 
								function = "audio_rxbclk";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_2 {
 | 
				
			||||||
 | 
								pins = "gpio25";
 | 
				
			||||||
 | 
								function = "audio_rxfsync";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_3 {
 | 
				
			||||||
 | 
								pins = "gpio26";
 | 
				
			||||||
 | 
								function = "audio_rxd";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_4 {
 | 
				
			||||||
 | 
								pins = "gpio27";
 | 
				
			||||||
 | 
								function = "audio_txmclk";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_5 {
 | 
				
			||||||
 | 
								pins = "gpio28";
 | 
				
			||||||
 | 
								function = "audio_txbclk";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_6 {
 | 
				
			||||||
 | 
								pins = "gpio29";
 | 
				
			||||||
 | 
								function = "audio_txfsync";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_7 {
 | 
				
			||||||
 | 
								pins = "gpio30";
 | 
				
			||||||
 | 
								function = "audio_txd";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						leds_pins: leds_pinmux {
 | 
				
			||||||
 | 
							sys_blue {
 | 
				
			||||||
 | 
								pins = "gpio30";
 | 
				
			||||||
 | 
								function = "gpio";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-up;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							sys_red {
 | 
				
			||||||
 | 
								pins = "gpio36";
 | 
				
			||||||
 | 
								function = "gpio";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							sys_green {
 | 
				
			||||||
 | 
								pins = "gpio37";
 | 
				
			||||||
 | 
								function = "gpio";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&soc {
 | 
				
			||||||
 | 
						gpio_keys {
 | 
				
			||||||
 | 
							compatible = "gpio-keys";
 | 
				
			||||||
 | 
							pinctrl-0 = <&button_pins>;
 | 
				
			||||||
 | 
							pinctrl-names = "default";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							button@1 {
 | 
				
			||||||
 | 
								label = "reset";
 | 
				
			||||||
 | 
								linux,code = <KEY_RESTART>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 28 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
 | 
								linux,input-type = <1>;
 | 
				
			||||||
 | 
								debounce-interval = <60>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
						gpio_leds {
 | 
				
			||||||
 | 
							compatible = "gpio-leds";
 | 
				
			||||||
 | 
							pinctrl-0 = <&leds_pins>;
 | 
				
			||||||
 | 
							pinctrl-names = "default";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							led@30 {
 | 
				
			||||||
 | 
								label = "sys:blue";
 | 
				
			||||||
 | 
								gpios = <&tlmm 30 GPIO_ACTIVE_HIGH>;  /* GPIO_30 */
 | 
				
			||||||
 | 
								default-state="on";
 | 
				
			||||||
 | 
							/*	linux,default-trigger = "timer";
 | 
				
			||||||
 | 
								active-delay = <700>;
 | 
				
			||||||
 | 
								inactive-delay = <700>;
 | 
				
			||||||
 | 
								default-state="on";		*/
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							led@36 {
 | 
				
			||||||
 | 
								label = "sys:red";
 | 
				
			||||||
 | 
								gpios = <&tlmm 36 GPIO_ACTIVE_HIGH>;  /* GPIO_36 */
 | 
				
			||||||
 | 
								default-state="off";
 | 
				
			||||||
 | 
							/*	linux,default-trigger = "timer";
 | 
				
			||||||
 | 
								active-delay = <700>;
 | 
				
			||||||
 | 
								inactive-delay = <700>;
 | 
				
			||||||
 | 
								default-state="on";		*/
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							led@37 {
 | 
				
			||||||
 | 
								label = "sys:green";
 | 
				
			||||||
 | 
								gpios = <&tlmm 37 GPIO_ACTIVE_HIGH>;  /* GPIO_37 */
 | 
				
			||||||
 | 
								default-state="off";
 | 
				
			||||||
 | 
							/*	linux,default-trigger = "timer";
 | 
				
			||||||
 | 
								active-delay = <700>;
 | 
				
			||||||
 | 
								inactive-delay = <700>;
 | 
				
			||||||
 | 
								default-state="on";		*/
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&q6v5_wcss {
 | 
				
			||||||
 | 
						compatible = "qcom,ipq5018-q6-mpd";
 | 
				
			||||||
 | 
						#address-cells = <1>;
 | 
				
			||||||
 | 
						#size-cells = <1>;
 | 
				
			||||||
 | 
						ranges;
 | 
				
			||||||
 | 
						firmware = "IPQ5018/q6_fw.mdt";
 | 
				
			||||||
 | 
						reg = <0x0cd00000 0x4040>,
 | 
				
			||||||
 | 
							<0x1938000 0x8>,
 | 
				
			||||||
 | 
							<0x193d204 0x4>;
 | 
				
			||||||
 | 
						reg-names = "qdsp6",
 | 
				
			||||||
 | 
								"tcsr-msip",
 | 
				
			||||||
 | 
								"tcsr-q6";
 | 
				
			||||||
 | 
						resets = <&gcc GCC_WCSSAON_RESET>,
 | 
				
			||||||
 | 
								<&gcc GCC_WCSS_Q6_BCR>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reset-names = "wcss_aon_reset",
 | 
				
			||||||
 | 
								"wcss_q6_reset";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clocks = <&gcc GCC_Q6_AXIS_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_WCSS_ECAHB_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_Q6_AXIM_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_Q6_AXIM2_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_Q6_AHB_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_Q6_AHB_S_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_WCSS_AXI_S_CLK>;
 | 
				
			||||||
 | 
						clock-names = "gcc_q6_axis_clk",
 | 
				
			||||||
 | 
							"gcc_wcss_ecahb_clk",
 | 
				
			||||||
 | 
							"gcc_q6_axim_clk",
 | 
				
			||||||
 | 
							"gcc_q6_axim2_clk",
 | 
				
			||||||
 | 
							"gcc_q6_ahb_clk",
 | 
				
			||||||
 | 
							"gcc_q6_ahb_s_clk",
 | 
				
			||||||
 | 
							"gcc_wcss_axi_s_clk";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
							memory-region = <&q6_mem_regions>, <&q6_etr_region>;
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							memory-region = <&q6_mem_regions>, <&q6_etr_region>,
 | 
				
			||||||
 | 
									<&q6_caldb_region>;
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						qcom,rproc = <&q6v5_wcss>;
 | 
				
			||||||
 | 
						qcom,bootargs_smem = <507>;
 | 
				
			||||||
 | 
						boot-args = <0x1 0x4 0x3 0x0F 0x0 0x0>,
 | 
				
			||||||
 | 
								<0x2 0x4 0x2 0x12 0x0 0x0>;
 | 
				
			||||||
 | 
						status = "ok";
 | 
				
			||||||
 | 
						q6_wcss_pd1: remoteproc_pd1@4ab000 {
 | 
				
			||||||
 | 
							compatible = "qcom,ipq5018-wcss-ahb-mpd";
 | 
				
			||||||
 | 
							reg = <0x4ab000 0x20>;
 | 
				
			||||||
 | 
							reg-names = "rmb";
 | 
				
			||||||
 | 
							firmware = "IPQ5018/q6_fw.mdt";
 | 
				
			||||||
 | 
							m3_firmware = "IPQ5018/m3_fw.mdt";
 | 
				
			||||||
 | 
							interrupts-extended = <&wcss_smp2p_in 8 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 9 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 12 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 11 0>;
 | 
				
			||||||
 | 
							interrupt-names = "fatal",
 | 
				
			||||||
 | 
										"ready",
 | 
				
			||||||
 | 
										"spawn-ack",
 | 
				
			||||||
 | 
										"stop-ack";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							resets = <&gcc GCC_WCSSAON_RESET>,
 | 
				
			||||||
 | 
									<&gcc GCC_WCSS_BCR>,
 | 
				
			||||||
 | 
									<&gcc GCC_CE_BCR>;
 | 
				
			||||||
 | 
							reset-names = "wcss_aon_reset",
 | 
				
			||||||
 | 
									"wcss_reset",
 | 
				
			||||||
 | 
									"ce_reset";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							clocks = <&gcc GCC_WCSS_AHB_S_CLK>,
 | 
				
			||||||
 | 
									<&gcc GCC_WCSS_ACMT_CLK>,
 | 
				
			||||||
 | 
									<&gcc GCC_WCSS_AXI_M_CLK>;
 | 
				
			||||||
 | 
							clock-names = "gcc_wcss_ahb_s_clk",
 | 
				
			||||||
 | 
										"gcc_wcss_acmt_clk",
 | 
				
			||||||
 | 
										"gcc_wcss_axi_m_clk";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qcom,halt-regs = <&tcsr_q6_block 0xa000 0xd000 0x0>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qcom,smem-states = <&wcss_smp2p_out 8>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 9>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 10>;
 | 
				
			||||||
 | 
							qcom,smem-state-names = "shutdown",
 | 
				
			||||||
 | 
										"stop",
 | 
				
			||||||
 | 
										"spawn";
 | 
				
			||||||
 | 
						#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
							memory-region = <&q6_ipq5018_data>, <&m3_dump>,
 | 
				
			||||||
 | 
									<&q6_etr_region>;
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							memory-region = <&q6_ipq5018_data>, <&m3_dump>,
 | 
				
			||||||
 | 
									<&q6_etr_region>, <&q6_caldb_region>;
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						q6_wcss_pd2: remoteproc_pd2 {
 | 
				
			||||||
 | 
							compatible = "qcom,ipq5018-wcss-pcie-mpd";
 | 
				
			||||||
 | 
							firmware = "IPQ5018/q6_fw.mdt";
 | 
				
			||||||
 | 
							m3_firmware = "qcn6122/m3_fw.mdt";
 | 
				
			||||||
 | 
							interrupts-extended = <&wcss_smp2p_in 16 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 17 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 20 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 19 0>;
 | 
				
			||||||
 | 
							interrupt-names = "fatal",
 | 
				
			||||||
 | 
										"ready",
 | 
				
			||||||
 | 
										"spawn-ack",
 | 
				
			||||||
 | 
										"stop-ack";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qcom,smem-states = <&wcss_smp2p_out 16>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 17>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 18>;
 | 
				
			||||||
 | 
							qcom,smem-state-names = "shutdown",
 | 
				
			||||||
 | 
										"stop",
 | 
				
			||||||
 | 
										"spawn";
 | 
				
			||||||
 | 
						#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
							memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>,
 | 
				
			||||||
 | 
									<&q6_qcn6122_etr_1>;
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>,
 | 
				
			||||||
 | 
									<&q6_qcn6122_etr_1>, <&q6_qcn6122_caldb_1>;
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						q6_wcss_pd3: remoteproc_pd3 {
 | 
				
			||||||
 | 
							compatible = "qcom,ipq5018-wcss-pcie-mpd";
 | 
				
			||||||
 | 
							firmware = "IPQ5018/q6_fw.mdt";
 | 
				
			||||||
 | 
							interrupts-extended = <&wcss_smp2p_in 24 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 25 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 28 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 27 0>;
 | 
				
			||||||
 | 
							interrupt-names = "fatal",
 | 
				
			||||||
 | 
										"ready",
 | 
				
			||||||
 | 
										"spawn-ack",
 | 
				
			||||||
 | 
										"stop-ack";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qcom,smem-states = <&wcss_smp2p_out 24>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 25>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 26>;
 | 
				
			||||||
 | 
							qcom,smem-state-names = "shutdown",
 | 
				
			||||||
 | 
										"stop",
 | 
				
			||||||
 | 
										"spawn";
 | 
				
			||||||
 | 
						#ifdef	__IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
							memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>,
 | 
				
			||||||
 | 
									<&q6_qcn6122_etr_2>;
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>,
 | 
				
			||||||
 | 
									<&q6_qcn6122_etr_2>, <&q6_qcn6122_caldb_2>;
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&i2c_0 {
 | 
				
			||||||
 | 
						pinctrl-0 = <&i2c_pins>;
 | 
				
			||||||
 | 
						pinctrl-names = "default";
 | 
				
			||||||
 | 
						status = "disabled";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&wifi0 {
 | 
				
			||||||
 | 
						/* IPQ5018 */
 | 
				
			||||||
 | 
						qcom,multipd_arch;
 | 
				
			||||||
 | 
						qcom,rproc = <&q6_wcss_pd1>;
 | 
				
			||||||
 | 
						qcom,userpd-subsys-name = "q6v5_wcss_userpd1";
 | 
				
			||||||
 | 
					#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <2>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <1>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						qcom,board_id = <0x24>;
 | 
				
			||||||
 | 
					#ifdef __CNSS2__
 | 
				
			||||||
 | 
						qcom,bdf-addr = <0x4C400000 0x4C400000 0x4C400000 0x0 0x0>;
 | 
				
			||||||
 | 
						qcom,caldb-addr = <0x4D300000 0x4D300000 0 0 0 0>;
 | 
				
			||||||
 | 
						qcom,caldb-size = <0x200000>;
 | 
				
			||||||
 | 
						mem-region = <&q6_ipq5018_data>;
 | 
				
			||||||
 | 
					1235
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						memory-region = <&q6_ipq5018_data>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						status = "ok";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&wifi1 {
 | 
				
			||||||
 | 
						/* QCN6122 5G */
 | 
				
			||||||
 | 
						qcom,multipd_arch;
 | 
				
			||||||
 | 
						qcom,userpd-subsys-name = "q6v5_wcss_userpd3";
 | 
				
			||||||
 | 
						qcom,rproc = <&q6_wcss_pd3>;
 | 
				
			||||||
 | 
					#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <2>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <1>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						qcom,board_id = <0x60>;
 | 
				
			||||||
 | 
					#ifdef __CNSS2__
 | 
				
			||||||
 | 
						qcom,bdf-addr = <0x4E900000 0x4E900000 0x4E200000 0x0 0x0>;
 | 
				
			||||||
 | 
						qcom,caldb-addr = <0x4F800000 0x4F800000 0 0 0>;
 | 
				
			||||||
 | 
						qcom,caldb-size = <0x500000>;
 | 
				
			||||||
 | 
						mem-region = <&q6_qcn6122_data2>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						memory-region = <&q6_qcn6122_data2>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						status = "ok";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&wifi2 {
 | 
				
			||||||
 | 
						/* QCN6122 6G */
 | 
				
			||||||
 | 
						qcom,multipd_arch;
 | 
				
			||||||
 | 
						qcom,userpd-subsys-name = "q6v5_wcss_userpd3";
 | 
				
			||||||
 | 
					#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <2>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <1>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						qcom,board_id = <0xb0>;
 | 
				
			||||||
 | 
						qcom,bdf-addr = <0x4ED00000 0x4ED00000 0x4E400000 0x0 0x0>;
 | 
				
			||||||
 | 
					#ifdef __CNSS2__
 | 
				
			||||||
 | 
						qcom,caldb-addr = <0x4FF00000 0x4FF00000 0 0 0>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						qcom,caldb-addr = <0x4FF00000>;
 | 
				
			||||||
 | 
						m3-dump-addr = <0x4FD00000>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						qcom,caldb-size = <0x500000>;
 | 
				
			||||||
 | 
						status = "disabled";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&usb3 {
 | 
				
			||||||
 | 
					       status = "ok";
 | 
				
			||||||
 | 
					       device-power-gpio = <&tlmm 24 1>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&dwc_0 {
 | 
				
			||||||
 | 
					       /delete-property/ #phy-cells;
 | 
				
			||||||
 | 
					       /delete-property/ phys;
 | 
				
			||||||
 | 
					       /delete-property/ phy-names;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&hs_m31phy_0 {
 | 
				
			||||||
 | 
					       status = "ok";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&eud {
 | 
				
			||||||
 | 
						status = "ok";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&pcie_x1 {
 | 
				
			||||||
 | 
						perst-gpio = <&tlmm 18 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&pcie_x2 {
 | 
				
			||||||
 | 
						perst-gpio = <&tlmm 15 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&pcie_x1_rp {
 | 
				
			||||||
 | 
						status = "disabled";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mhi_0: qcom,mhi@0 {
 | 
				
			||||||
 | 
							reg = <0 0 0 0 0 >;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&pcie_x2_rp {
 | 
				
			||||||
 | 
						status = "disabled";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mhi_1: qcom,mhi@1 {
 | 
				
			||||||
 | 
							reg = <0 0 0 0 0 >;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -0,0 +1,981 @@
 | 
				
			|||||||
 | 
					/dts-v1/;
 | 
				
			||||||
 | 
					/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Permission to use, copy, modify, and/or distribute this software for any
 | 
				
			||||||
 | 
					 * purpose with or without fee is hereby granted, provided that the above
 | 
				
			||||||
 | 
					 * copyright notice and this permission notice appear in all copies.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
				
			||||||
 | 
					 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
				
			||||||
 | 
					 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
				
			||||||
 | 
					 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
				
			||||||
 | 
					 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 | 
				
			||||||
 | 
					 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 | 
				
			||||||
 | 
					 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "ipq5018.dtsi"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/ {
 | 
				
			||||||
 | 
						#address-cells = <0x2>;
 | 
				
			||||||
 | 
						#size-cells = <0x2>;
 | 
				
			||||||
 | 
						model = "CyberTan EWW631-B1";
 | 
				
			||||||
 | 
						compatible = "cybertan,eww631-b1", "qcom,ipq5018-mp03.5", "qcom,ipq5018";
 | 
				
			||||||
 | 
						interrupt-parent = <&intc>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						aliases {
 | 
				
			||||||
 | 
							sdhc1 = &sdhc_1; /* SDC1 eMMC slot */
 | 
				
			||||||
 | 
							serial0 = &blsp1_uart1;
 | 
				
			||||||
 | 
							serial1 = &blsp1_uart2;
 | 
				
			||||||
 | 
							ethernet0 = "/soc/dp1";
 | 
				
			||||||
 | 
							ethernet1 = "/soc/dp2";
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						chosen {
 | 
				
			||||||
 | 
							bootargs = "console=ttyMSM0,115200,n8 rw init=/init";
 | 
				
			||||||
 | 
							bootargs-append = " swiotlb=1 coherent_pool=2M";
 | 
				
			||||||
 | 
							stdout-path = "serial0";
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reserved-memory {
 | 
				
			||||||
 | 
						#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
						/*                   256 MB Profile
 | 
				
			||||||
 | 
						 * +==========+==============+=========================+
 | 
				
			||||||
 | 
						 * |          |              |                         |
 | 
				
			||||||
 | 
						 * |  Region  | Start Offset |          Size           |
 | 
				
			||||||
 | 
						 * |          |              |                         |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    NSS   |  0x40000000  |           8MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   Linux  |  0x40800000  | Depends on total memory |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   uboot  |  0x4A600000  |           4MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    SBL   |  0x4AA00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   smem   |  0x4AB00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    TZ    |  0x4AC00000  |           4MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    Q6    |              |                         |
 | 
				
			||||||
 | 
						 * |   code/  |  0x4B000000  |          20MB           |
 | 
				
			||||||
 | 
						 * |   data   |              |                         |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4C400000  |          13MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4D100000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4D200000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4D300000  |          13MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4E000000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4E100000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4E200000  |          13MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4EF00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4F000000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |                                                   |
 | 
				
			||||||
 | 
						 * |            Rest of the memory for Linux           |
 | 
				
			||||||
 | 
						 * |                                                   |
 | 
				
			||||||
 | 
						 * +===================================================+
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
							q6_mem_regions: q6_mem_regions@4B000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4B000000 0x0 0x4100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_code_data: q6_code_data@4B000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4B000000 0x0 0x1400000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_ipq5018_data: q6_ipq5018_data@4C400000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4C400000 0x0 0xD00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump: m3_dump@4D100000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D100000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_etr_region: q6_etr_dump@4D200000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D200000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_data1: q6_qcn6122_data1@4D300000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D300000 0x0 0xD00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E000000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E100000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E100000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_data2: q6_qcn6122_data2@4E200000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E200000 0x0 0xD00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump_qcn6122_2: m3_dump_qcn6122_2@4EF00000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4EF00000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4F000000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
						/*                 512MB/1GB Profiles
 | 
				
			||||||
 | 
						 * +==========+==============+=========================+
 | 
				
			||||||
 | 
						 * |          |              |                         |
 | 
				
			||||||
 | 
						 * |  Region  | Start Offset |          Size           |
 | 
				
			||||||
 | 
						 * |          |              |                         |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    NSS   |  0x40000000  |          16MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   Linux  |  0x41000000  | Depends on total memory |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   uboot  |  0x4A600000  |           4MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    SBL   |  0x4AA00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |   smem   |  0x4AB00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    TZ    |  0x4AC00000  |           4MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |    Q6    |              |                         |
 | 
				
			||||||
 | 
						 * |   code/  |  0x4B000000  |          20MB           |
 | 
				
			||||||
 | 
						 * |   data   |              |                         |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4C400000  |          14MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4D200000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4D300000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |  IPQ5018 |              |                         |
 | 
				
			||||||
 | 
						 * |  Caldb   |  0x4D400000  |           2MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4D600000  |          16MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4E600000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4E700000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_1|              |                         |
 | 
				
			||||||
 | 
						 * |  Caldb   |  0x4E800000  |           5MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |   data   |  0x4ED00000  |          16MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |  M3 Dump |  0x4FD00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |   QDSS   |  0x4FE00000  |           1MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * | QCN6122_2|              |                         |
 | 
				
			||||||
 | 
						 * |  Caldb   |  0x4FF00000  |           5MB           |
 | 
				
			||||||
 | 
						 * +----------+--------------+-------------------------+
 | 
				
			||||||
 | 
						 * |                                                   |
 | 
				
			||||||
 | 
						 * |            Rest of the memory for Linux           |
 | 
				
			||||||
 | 
						 * |                                                   |
 | 
				
			||||||
 | 
						 * +===================================================+
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
							q6_mem_regions: q6_mem_regions@4B000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4B000000 0x0 0x5400000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_code_data: q6_code_data@4B000000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4B000000 0x0 01400000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_ipq5018_data: q6_ipq5018_data@4C400000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4C400000 0x0 0xE00000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump: m3_dump@4D200000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D200000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_etr_region: q6_etr_dump@4D300000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D300000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_caldb_region: q6_caldb_region@4D400000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D400000 0x0 0x200000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_data1: q6_qcn6122_data1@4D600000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4D600000 0x0 0x1000000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E600000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E600000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E700000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E700000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E800000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4E800000 0x0 0x500000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_data2: q6_qcn6122_data2@4E900000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4ED00000 0x0 0x1000000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							m3_dump_qcn6122_2: m3_dump_qcn6122_2@4FD00000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4FD00000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_etr_2: q6_qcn6122_etr_2@4FE00000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4FE00000 0x0 0x100000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							q6_qcn6122_caldb_2: q6_qcn6122_caldb_2@4FF00000 {
 | 
				
			||||||
 | 
								no-map;
 | 
				
			||||||
 | 
								reg = <0x0 0x4FF00000 0x0 0x500000>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						soc {
 | 
				
			||||||
 | 
							serial@78af000 {
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
							blsp1_uart2: serial@78b0000 {
 | 
				
			||||||
 | 
								pinctrl-0 = <&blsp1_uart_pins>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
							qpic_bam: dma@7984000{
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							nand: qpic-nand@79b0000 {
 | 
				
			||||||
 | 
								pinctrl-0 = <&qspi_nand_pins>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							spi_0: spi@78b5000 { /* BLSP1 QUP0 */
 | 
				
			||||||
 | 
								pinctrl-0 = <&blsp0_spi_pins>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
								cs-select = <0>;
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								m25p80@0 {
 | 
				
			||||||
 | 
									#address-cells = <1>;
 | 
				
			||||||
 | 
									#size-cells = <1>;
 | 
				
			||||||
 | 
									reg = <0>;
 | 
				
			||||||
 | 
									compatible = "n25q128a11";
 | 
				
			||||||
 | 
									linux,modalias = "m25p80", "n25q128a11";
 | 
				
			||||||
 | 
									spi-max-frequency = <50000000>;
 | 
				
			||||||
 | 
									use-default-sizes;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mdio0: mdio@88000 {
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ethernet-phy@0 {
 | 
				
			||||||
 | 
									reg = <7>;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mdio1: mdio@90000 {
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
								pinctrl-0 = <&mdio1_pins>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
								phy-reset-gpio = <&tlmm 38 0>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ethernet-phy@0 {
 | 
				
			||||||
 | 
									reg = <0>;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ethernet-phy@1 {
 | 
				
			||||||
 | 
									reg = <1>;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ethernet-phy@2 {
 | 
				
			||||||
 | 
									reg = <2>;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ethernet-phy@3 {
 | 
				
			||||||
 | 
									reg = <3>;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ethernet-phy@4 {
 | 
				
			||||||
 | 
									reg = <4>;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ess-instance {
 | 
				
			||||||
 | 
								num_devices = <0x2>;
 | 
				
			||||||
 | 
								ess-switch@0x39c00000 {
 | 
				
			||||||
 | 
									compatible = "qcom,ess-switch-ipq50xx";
 | 
				
			||||||
 | 
									device_id = <0>;
 | 
				
			||||||
 | 
									switch_mac_mode = <0xf>; /* mac mode for uniphy instance*/
 | 
				
			||||||
 | 
									cmnblk_clk = "internal_96MHz"; /* cmnblk clk*/
 | 
				
			||||||
 | 
									qcom,port_phyinfo {
 | 
				
			||||||
 | 
										port@0 {
 | 
				
			||||||
 | 
											port_id = <1>;
 | 
				
			||||||
 | 
											phy_address = <7>;
 | 
				
			||||||
 | 
										};
 | 
				
			||||||
 | 
										port@1 {
 | 
				
			||||||
 | 
											port_id = <2>;
 | 
				
			||||||
 | 
											forced-speed = <1000>;
 | 
				
			||||||
 | 
											forced-duplex = <1>;
 | 
				
			||||||
 | 
										};
 | 
				
			||||||
 | 
									};
 | 
				
			||||||
 | 
									led_source@0 {
 | 
				
			||||||
 | 
										source = <0>;
 | 
				
			||||||
 | 
										mode = "normal";
 | 
				
			||||||
 | 
										speed = "all";
 | 
				
			||||||
 | 
										blink_en = "enable";
 | 
				
			||||||
 | 
										active = "high";
 | 
				
			||||||
 | 
									};
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
								ess-switch1@1 {
 | 
				
			||||||
 | 
									compatible = "qcom,ess-switch-qca83xx";
 | 
				
			||||||
 | 
									device_id = <1>;
 | 
				
			||||||
 | 
									switch_access_mode = "mdio";
 | 
				
			||||||
 | 
									mdio-bus = <&mdio1>;
 | 
				
			||||||
 | 
									reset_gpio = <&tlmm 0x26 0>;
 | 
				
			||||||
 | 
									switch_cpu_bmp = <0x40>;  /* cpu port bitmap (Port 6 GMAC) */
 | 
				
			||||||
 | 
									switch_lan_bmp = <0x3c>; /* lan port bitmap */
 | 
				
			||||||
 | 
									switch_wan_bmp = <0x0>;  /* wan port bitmap */
 | 
				
			||||||
 | 
									qca,ar8327-initvals = <
 | 
				
			||||||
 | 
											0x00004 0x7600000   /* PAD0_MODE */
 | 
				
			||||||
 | 
											0x00008 0x1000000   /* PAD5_MODE */
 | 
				
			||||||
 | 
											0x0000c 0x80        /* PAD6_MODE */
 | 
				
			||||||
 | 
											0x00010 0x2613a0    /* PORT6 FORCE MODE*/
 | 
				
			||||||
 | 
											0x000e4 0xaa545     /* MAC_POWER_SEL */
 | 
				
			||||||
 | 
											0x000e0 0xc74164de  /* SGMII_CTRL */
 | 
				
			||||||
 | 
											0x0007c 0x4e        /* PORT0_STATUS */
 | 
				
			||||||
 | 
											0x00094 0x4e        /* PORT6_STATUS */
 | 
				
			||||||
 | 
									>;
 | 
				
			||||||
 | 
									qcom,port_phyinfo {
 | 
				
			||||||
 | 
										port@0 {
 | 
				
			||||||
 | 
											port_id = <1>;
 | 
				
			||||||
 | 
											phy_address = <0>;
 | 
				
			||||||
 | 
										};
 | 
				
			||||||
 | 
										port@1 {
 | 
				
			||||||
 | 
											port_id = <2>;
 | 
				
			||||||
 | 
											phy_address = <1>;
 | 
				
			||||||
 | 
										};
 | 
				
			||||||
 | 
										port@2 {
 | 
				
			||||||
 | 
											port_id = <3>;
 | 
				
			||||||
 | 
											phy_address = <2>;
 | 
				
			||||||
 | 
										};
 | 
				
			||||||
 | 
										port@3 {
 | 
				
			||||||
 | 
											port_id = <4>;
 | 
				
			||||||
 | 
											phy_address = <3>;
 | 
				
			||||||
 | 
										};
 | 
				
			||||||
 | 
										port@4 {
 | 
				
			||||||
 | 
											port_id = <5>;
 | 
				
			||||||
 | 
											phy_address = <4>;
 | 
				
			||||||
 | 
										};
 | 
				
			||||||
 | 
									};
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							dp1 {
 | 
				
			||||||
 | 
								device_type = "network";
 | 
				
			||||||
 | 
								compatible = "qcom,nss-dp";
 | 
				
			||||||
 | 
								clocks = <&gcc GCC_SNOC_GMAC1_AXI_CLK>;
 | 
				
			||||||
 | 
								clock-names = "nss-snoc-gmac-axi-clk";
 | 
				
			||||||
 | 
								qcom,id = <2>;
 | 
				
			||||||
 | 
								reg = <0x39D00000 0x10000>;
 | 
				
			||||||
 | 
								interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
 | 
				
			||||||
 | 
								qcom,mactype = <2>;
 | 
				
			||||||
 | 
								local-mac-address = [000000000000];
 | 
				
			||||||
 | 
								phy-mode = "sgmii";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							dp2 {
 | 
				
			||||||
 | 
								device_type = "network";
 | 
				
			||||||
 | 
								compatible = "qcom,nss-dp";
 | 
				
			||||||
 | 
								clocks = <&gcc GCC_SNOC_GMAC0_AXI_CLK>;
 | 
				
			||||||
 | 
								clock-names = "nss-snoc-gmac-axi-clk";
 | 
				
			||||||
 | 
								qcom,id = <1>;
 | 
				
			||||||
 | 
								reg = <0x39C00000 0x10000>;
 | 
				
			||||||
 | 
								interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
 | 
				
			||||||
 | 
								qcom,mactype = <2>;
 | 
				
			||||||
 | 
								qcom,link-poll = <1>;
 | 
				
			||||||
 | 
								qcom,phy-mdio-addr = <7>;
 | 
				
			||||||
 | 
								mdio-bus = <&mdio0>;
 | 
				
			||||||
 | 
								local-mac-address = [000000000000];
 | 
				
			||||||
 | 
								phy-mode = "sgmii";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qcom,test@0 {
 | 
				
			||||||
 | 
								status = "ok";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
							lpass: lpass@0xA000000{
 | 
				
			||||||
 | 
								status = "disabled";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							pcm: pcm@0xA3C0000{
 | 
				
			||||||
 | 
								pinctrl-0 = <&audio_pins>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
								status = "disabled";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							pcm_lb: pcm_lb@0 {
 | 
				
			||||||
 | 
								status = "disabled";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						thermal-zones {
 | 
				
			||||||
 | 
							status = "ok";
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&tlmm {
 | 
				
			||||||
 | 
						pinctrl-0 = <&blsp0_uart_pins>; //<&blsp0_uart_pins &phy_led_pins>;
 | 
				
			||||||
 | 
						pinctrl-names = "default";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						blsp0_uart_pins: blsp0_uart_pins {
 | 
				
			||||||
 | 
							blsp0_uart_rx_tx {
 | 
				
			||||||
 | 
								pins = "gpio20", "gpio21";
 | 
				
			||||||
 | 
								function = "blsp0_uart0";
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						blsp1_uart_pins: blsp1_uart_pins {
 | 
				
			||||||
 | 
							blsp1_uart_rx_tx {
 | 
				
			||||||
 | 
								pins = "gpio23", "gpio25", "gpio24", "gpio26";
 | 
				
			||||||
 | 
								function = "blsp1_uart2";
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
						blsp0_spi_pins: blsp0_spi_pins {
 | 
				
			||||||
 | 
							mux {
 | 
				
			||||||
 | 
								pins = "gpio10", "gpio11", "gpio12", "gpio13";
 | 
				
			||||||
 | 
								function = "blsp0_spi";
 | 
				
			||||||
 | 
								drive-strength = <2>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						qspi_nand_pins: qspi_nand_pins {
 | 
				
			||||||
 | 
							qspi_clock {
 | 
				
			||||||
 | 
								pins = "gpio9";
 | 
				
			||||||
 | 
								function = "qspi_clk";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qspi_cs {
 | 
				
			||||||
 | 
								pins = "gpio8";
 | 
				
			||||||
 | 
								function = "qspi_cs";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qspi_data {
 | 
				
			||||||
 | 
								pins = "gpio4", "gpio5", "gpio6", "gpio7";
 | 
				
			||||||
 | 
								function = "qspi_data";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mdio1_pins: mdio_pinmux {
 | 
				
			||||||
 | 
							mux_0 {
 | 
				
			||||||
 | 
								pins = "gpio36";
 | 
				
			||||||
 | 
								function = "mdc";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-up;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_1 {
 | 
				
			||||||
 | 
								pins = "gpio37";
 | 
				
			||||||
 | 
								function = "mdio";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-up;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						phy_led_pins: phy_led_pins {
 | 
				
			||||||
 | 
							gephy_led_pin {
 | 
				
			||||||
 | 
								pins = "gpio46";
 | 
				
			||||||
 | 
								function = "led0";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
						i2c_pins: i2c_pins {
 | 
				
			||||||
 | 
							i2c_scl {
 | 
				
			||||||
 | 
								pins = "gpio25";
 | 
				
			||||||
 | 
								function = "blsp2_i2c1";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							i2c_sda {
 | 
				
			||||||
 | 
								pins = "gpio26";
 | 
				
			||||||
 | 
								function = "blsp2_i2c1";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						button_pins: button_pins {
 | 
				
			||||||
 | 
							reset_button {
 | 
				
			||||||
 | 
								pins = "gpio28";
 | 
				
			||||||
 | 
								function = "gpio";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-up;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
						audio_pins: audio_pinmux {
 | 
				
			||||||
 | 
							mux_1 {
 | 
				
			||||||
 | 
								pins = "gpio24";
 | 
				
			||||||
 | 
								function = "audio_rxbclk";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_2 {
 | 
				
			||||||
 | 
								pins = "gpio25";
 | 
				
			||||||
 | 
								function = "audio_rxfsync";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_3 {
 | 
				
			||||||
 | 
								pins = "gpio26";
 | 
				
			||||||
 | 
								function = "audio_rxd";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_4 {
 | 
				
			||||||
 | 
								pins = "gpio27";
 | 
				
			||||||
 | 
								function = "audio_txmclk";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_5 {
 | 
				
			||||||
 | 
								pins = "gpio28";
 | 
				
			||||||
 | 
								function = "audio_txbclk";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_6 {
 | 
				
			||||||
 | 
								pins = "gpio29";
 | 
				
			||||||
 | 
								function = "audio_txfsync";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_7 {
 | 
				
			||||||
 | 
								pins = "gpio30";
 | 
				
			||||||
 | 
								function = "audio_txd";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-down;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
						poe_pins: poe_pinmux {
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
								LAN port PoE output enable
 | 
				
			||||||
 | 
								H --> enable; L --> disable (Default setting to H)
 | 
				
			||||||
 | 
							*/
 | 
				
			||||||
 | 
							mux_0 { /* PoE_OUT_EN */
 | 
				
			||||||
 | 
								pins = "gpio24";
 | 
				
			||||||
 | 
								function = "gpio";
 | 
				
			||||||
 | 
								drive-strength = <2>;
 | 
				
			||||||
 | 
								bias-pull-up;
 | 
				
			||||||
 | 
								output-high;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mux_1 { /* PSE_INT_N */
 | 
				
			||||||
 | 
								pins = "gpio27";
 | 
				
			||||||
 | 
								function = "gpio";
 | 
				
			||||||
 | 
								bias-pull-up;
 | 
				
			||||||
 | 
								input;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						leds_pins: leds_pinmux {
 | 
				
			||||||
 | 
							sys_green {
 | 
				
			||||||
 | 
								pins = "gpio1";
 | 
				
			||||||
 | 
								function = "gpio";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							sys_blue {
 | 
				
			||||||
 | 
								pins = "gpio30";
 | 
				
			||||||
 | 
								function = "gpio";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-pull-up;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							sys_red {
 | 
				
			||||||
 | 
								pins = "gpio46";
 | 
				
			||||||
 | 
								function = "gpio";
 | 
				
			||||||
 | 
								drive-strength = <8>;
 | 
				
			||||||
 | 
								bias-disable;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&soc {
 | 
				
			||||||
 | 
						gpio_keys {
 | 
				
			||||||
 | 
							compatible = "gpio-keys";
 | 
				
			||||||
 | 
							pinctrl-0 = <&button_pins>;
 | 
				
			||||||
 | 
							pinctrl-names = "default";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							button@1 {
 | 
				
			||||||
 | 
								label = "reset";
 | 
				
			||||||
 | 
								linux,code = <KEY_RESTART>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 28 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
 | 
								linux,input-type = <1>;
 | 
				
			||||||
 | 
								debounce-interval = <60>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						gpio_leds {
 | 
				
			||||||
 | 
							compatible = "gpio-leds";
 | 
				
			||||||
 | 
							pinctrl-0 = <&leds_pins>;
 | 
				
			||||||
 | 
							pinctrl-names = "default";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							led@1 {
 | 
				
			||||||
 | 
								label = "sys:green";
 | 
				
			||||||
 | 
								gpios = <&tlmm 1 GPIO_ACTIVE_HIGH>;  /* GPIO_1/ATST_QP0 */
 | 
				
			||||||
 | 
								default-state="off";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							led@30 {
 | 
				
			||||||
 | 
								label = "sys:blue";
 | 
				
			||||||
 | 
								gpios = <&tlmm 30 GPIO_ACTIVE_HIGH>;  /* GPIO_30 */
 | 
				
			||||||
 | 
								default-state="on";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
							led@46 {
 | 
				
			||||||
 | 
								label = "sys:red";
 | 
				
			||||||
 | 
								gpios = <&tlmm 46 GPIO_ACTIVE_HIGH>;  /* GPIO_46 */
 | 
				
			||||||
 | 
								default-state="off";
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&q6v5_wcss {
 | 
				
			||||||
 | 
						compatible = "qcom,ipq5018-q6-mpd";
 | 
				
			||||||
 | 
						#address-cells = <1>;
 | 
				
			||||||
 | 
						#size-cells = <1>;
 | 
				
			||||||
 | 
						ranges;
 | 
				
			||||||
 | 
						firmware = "IPQ5018/q6_fw.mdt";
 | 
				
			||||||
 | 
						reg = <0x0cd00000 0x4040>,
 | 
				
			||||||
 | 
							<0x1938000 0x8>,
 | 
				
			||||||
 | 
							<0x193d204 0x4>;
 | 
				
			||||||
 | 
						reg-names = "qdsp6",
 | 
				
			||||||
 | 
								"tcsr-msip",
 | 
				
			||||||
 | 
								"tcsr-q6";
 | 
				
			||||||
 | 
						resets = <&gcc GCC_WCSSAON_RESET>,
 | 
				
			||||||
 | 
								<&gcc GCC_WCSS_Q6_BCR>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						reset-names = "wcss_aon_reset",
 | 
				
			||||||
 | 
								"wcss_q6_reset";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clocks = <&gcc GCC_Q6_AXIS_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_WCSS_ECAHB_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_Q6_AXIM_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_Q6_AXIM2_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_Q6_AHB_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_Q6_AHB_S_CLK>,
 | 
				
			||||||
 | 
							<&gcc GCC_WCSS_AXI_S_CLK>;
 | 
				
			||||||
 | 
						clock-names = "gcc_q6_axis_clk",
 | 
				
			||||||
 | 
							"gcc_wcss_ecahb_clk",
 | 
				
			||||||
 | 
							"gcc_q6_axim_clk",
 | 
				
			||||||
 | 
							"gcc_q6_axim2_clk",
 | 
				
			||||||
 | 
							"gcc_q6_ahb_clk",
 | 
				
			||||||
 | 
							"gcc_q6_ahb_s_clk",
 | 
				
			||||||
 | 
							"gcc_wcss_axi_s_clk";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
							memory-region = <&q6_mem_regions>, <&q6_etr_region>;
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							memory-region = <&q6_mem_regions>, <&q6_etr_region>,
 | 
				
			||||||
 | 
									<&q6_caldb_region>;
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						qcom,rproc = <&q6v5_wcss>;
 | 
				
			||||||
 | 
						qcom,bootargs_smem = <507>;
 | 
				
			||||||
 | 
						boot-args = <0x1 0x4 0x3 0x0F 0x0 0x0>,
 | 
				
			||||||
 | 
								<0x2 0x4 0x2 0x12 0x0 0x0>;
 | 
				
			||||||
 | 
						status = "ok";
 | 
				
			||||||
 | 
						q6_wcss_pd1: remoteproc_pd1@4ab000 {
 | 
				
			||||||
 | 
							compatible = "qcom,ipq5018-wcss-ahb-mpd";
 | 
				
			||||||
 | 
							reg = <0x4ab000 0x20>;
 | 
				
			||||||
 | 
							reg-names = "rmb";
 | 
				
			||||||
 | 
							firmware = "IPQ5018/q6_fw.mdt";
 | 
				
			||||||
 | 
							m3_firmware = "IPQ5018/m3_fw.mdt";
 | 
				
			||||||
 | 
							interrupts-extended = <&wcss_smp2p_in 8 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 9 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 12 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 11 0>;
 | 
				
			||||||
 | 
							interrupt-names = "fatal",
 | 
				
			||||||
 | 
										"ready",
 | 
				
			||||||
 | 
										"spawn-ack",
 | 
				
			||||||
 | 
										"stop-ack";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							resets = <&gcc GCC_WCSSAON_RESET>,
 | 
				
			||||||
 | 
									<&gcc GCC_WCSS_BCR>,
 | 
				
			||||||
 | 
									<&gcc GCC_CE_BCR>;
 | 
				
			||||||
 | 
							reset-names = "wcss_aon_reset",
 | 
				
			||||||
 | 
									"wcss_reset",
 | 
				
			||||||
 | 
									"ce_reset";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							clocks = <&gcc GCC_WCSS_AHB_S_CLK>,
 | 
				
			||||||
 | 
									<&gcc GCC_WCSS_ACMT_CLK>,
 | 
				
			||||||
 | 
									<&gcc GCC_WCSS_AXI_M_CLK>;
 | 
				
			||||||
 | 
							clock-names = "gcc_wcss_ahb_s_clk",
 | 
				
			||||||
 | 
										"gcc_wcss_acmt_clk",
 | 
				
			||||||
 | 
										"gcc_wcss_axi_m_clk";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qcom,halt-regs = <&tcsr_q6_block 0xa000 0xd000 0x0>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qcom,smem-states = <&wcss_smp2p_out 8>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 9>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 10>;
 | 
				
			||||||
 | 
							qcom,smem-state-names = "shutdown",
 | 
				
			||||||
 | 
										"stop",
 | 
				
			||||||
 | 
										"spawn";
 | 
				
			||||||
 | 
						#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
							memory-region = <&q6_ipq5018_data>, <&m3_dump>,
 | 
				
			||||||
 | 
									<&q6_etr_region>;
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							memory-region = <&q6_ipq5018_data>, <&m3_dump>,
 | 
				
			||||||
 | 
									<&q6_etr_region>, <&q6_caldb_region>;
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						q6_wcss_pd2: remoteproc_pd2 {
 | 
				
			||||||
 | 
							compatible = "qcom,ipq5018-wcss-pcie-mpd";
 | 
				
			||||||
 | 
							firmware = "IPQ5018/q6_fw.mdt";
 | 
				
			||||||
 | 
							m3_firmware = "qcn6122/m3_fw.mdt";
 | 
				
			||||||
 | 
							interrupts-extended = <&wcss_smp2p_in 16 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 17 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 20 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 19 0>;
 | 
				
			||||||
 | 
							interrupt-names = "fatal",
 | 
				
			||||||
 | 
										"ready",
 | 
				
			||||||
 | 
										"spawn-ack",
 | 
				
			||||||
 | 
										"stop-ack";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qcom,smem-states = <&wcss_smp2p_out 16>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 17>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 18>;
 | 
				
			||||||
 | 
							qcom,smem-state-names = "shutdown",
 | 
				
			||||||
 | 
										"stop",
 | 
				
			||||||
 | 
										"spawn";
 | 
				
			||||||
 | 
						#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
							memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>,
 | 
				
			||||||
 | 
									<&q6_qcn6122_etr_1>;
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>,
 | 
				
			||||||
 | 
									<&q6_qcn6122_etr_1>, <&q6_qcn6122_caldb_1>;
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						q6_wcss_pd3: remoteproc_pd3 {
 | 
				
			||||||
 | 
							compatible = "qcom,ipq5018-wcss-pcie-mpd";
 | 
				
			||||||
 | 
							firmware = "IPQ5018/q6_fw.mdt";
 | 
				
			||||||
 | 
							interrupts-extended = <&wcss_smp2p_in 24 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 25 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 28 0>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_in 27 0>;
 | 
				
			||||||
 | 
							interrupt-names = "fatal",
 | 
				
			||||||
 | 
										"ready",
 | 
				
			||||||
 | 
										"spawn-ack",
 | 
				
			||||||
 | 
										"stop-ack";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							qcom,smem-states = <&wcss_smp2p_out 24>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 25>,
 | 
				
			||||||
 | 
										<&wcss_smp2p_out 26>;
 | 
				
			||||||
 | 
							qcom,smem-state-names = "shutdown",
 | 
				
			||||||
 | 
										"stop",
 | 
				
			||||||
 | 
										"spawn";
 | 
				
			||||||
 | 
						#ifdef	__IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
							memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>,
 | 
				
			||||||
 | 
									<&q6_qcn6122_etr_2>;
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>,
 | 
				
			||||||
 | 
									<&q6_qcn6122_etr_2>, <&q6_qcn6122_caldb_2>;
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&i2c_0 {
 | 
				
			||||||
 | 
						pinctrl-0 = <&i2c_pins>;
 | 
				
			||||||
 | 
						pinctrl-names = "default";
 | 
				
			||||||
 | 
						status = "ok";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&wifi0 {
 | 
				
			||||||
 | 
						/* IPQ5018 */
 | 
				
			||||||
 | 
						qcom,multipd_arch;
 | 
				
			||||||
 | 
						qcom,rproc = <&q6_wcss_pd1>;
 | 
				
			||||||
 | 
						qcom,userpd-subsys-name = "q6v5_wcss_userpd1";
 | 
				
			||||||
 | 
					#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <2>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <1>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						qcom,board_id = <0x24>;
 | 
				
			||||||
 | 
					#ifdef __CNSS2__
 | 
				
			||||||
 | 
						qcom,bdf-addr = <0x4C400000 0x4C400000 0x4C400000 0x0 0x0 0x0>;
 | 
				
			||||||
 | 
						qcom,caldb-addr = <0x4D300000 0x4D300000 0 0 0 0>;
 | 
				
			||||||
 | 
						qcom,caldb-size = <0x200000>;
 | 
				
			||||||
 | 
						mem-region = <&q6_ipq5018_data>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						memory-region = <&q6_ipq5018_data>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						status = "ok";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&wifi1 {
 | 
				
			||||||
 | 
						/* QCN6122 5G */
 | 
				
			||||||
 | 
						qcom,multipd_arch;
 | 
				
			||||||
 | 
						qcom,userpd-subsys-name = "q6v5_wcss_userpd3";
 | 
				
			||||||
 | 
						qcom,rproc = <&q6_wcss_pd3>;
 | 
				
			||||||
 | 
					#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <2>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <1>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						qcom,board_id = <0x60>;
 | 
				
			||||||
 | 
					#ifdef __CNSS2__
 | 
				
			||||||
 | 
						qcom,bdf-addr = <0x4E900000 0x4E900000 0x4E200000 0x0 0x0>;
 | 
				
			||||||
 | 
						qcom,caldb-addr = <0x4F800000 0x4F800000 0 0 0>;
 | 
				
			||||||
 | 
						qcom,caldb-size = <0x500000>;
 | 
				
			||||||
 | 
						mem-region = <&q6_qcn6122_data2>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						memory-region = <&q6_qcn6122_data2>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						status = "ok";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&wifi2 {
 | 
				
			||||||
 | 
						/* QCN6122 6G */
 | 
				
			||||||
 | 
						qcom,multipd_arch;
 | 
				
			||||||
 | 
						qcom,userpd-subsys-name = "q6v5_wcss_userpd3";
 | 
				
			||||||
 | 
					#ifdef __IPQ_MEM_PROFILE_256_MB__
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <2>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						qcom,tgt-mem-mode = <1>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						qcom,board_id = <0xb0>;
 | 
				
			||||||
 | 
						qcom,bdf-addr = <0x4ED00000 0x4ED00000 0x4E400000 0x0 0x0>;
 | 
				
			||||||
 | 
					#ifdef __CNSS2__
 | 
				
			||||||
 | 
						qcom,caldb-addr = <0x4FF00000 0x4FF00000 0 0 0>;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						qcom,caldb-addr = <0x4FF00000>;
 | 
				
			||||||
 | 
						m3-dump-addr = <0x4FD00000>;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						qcom,caldb-size = <0x500000>;
 | 
				
			||||||
 | 
						status = "disabled";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&usb3 {
 | 
				
			||||||
 | 
					       status = "ok";
 | 
				
			||||||
 | 
					       device-power-gpio = <&tlmm 24 1>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&dwc_0 {
 | 
				
			||||||
 | 
					       /delete-property/ #phy-cells;
 | 
				
			||||||
 | 
					       /delete-property/ phys;
 | 
				
			||||||
 | 
					       /delete-property/ phy-names;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&hs_m31phy_0 {
 | 
				
			||||||
 | 
					       status = "ok";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&eud {
 | 
				
			||||||
 | 
						status = "ok";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&pcie_x1 {
 | 
				
			||||||
 | 
						perst-gpio = <&tlmm 18 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&pcie_x2 {
 | 
				
			||||||
 | 
						perst-gpio = <&tlmm 15 GPIO_ACTIVE_LOW>;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&pcie_x1_rp {
 | 
				
			||||||
 | 
						status = "disabled";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mhi_0: qcom,mhi@0 {
 | 
				
			||||||
 | 
							reg = <0 0 0 0 0 >;
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&pcie_x2_rp {
 | 
				
			||||||
 | 
						status = "disabled";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						mhi_1: qcom,mhi@1 {
 | 
				
			||||||
 | 
							reg = <0 0 0 0 0 >;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -18,6 +18,28 @@ define Device/cig_wf186w
 | 
				
			|||||||
endef
 | 
					endef
 | 
				
			||||||
TARGET_DEVICES += cig_wf186w
 | 
					TARGET_DEVICES += cig_wf186w
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Device/cybertan_eww631_a1
 | 
				
			||||||
 | 
					  DEVICE_TITLE := CyberTan EWW631-A1
 | 
				
			||||||
 | 
					  DEVICE_DTS := qcom-ipq5018-eww631-a1
 | 
				
			||||||
 | 
					  SUPPORTED_DEVICES := cybertan,eww631-a1
 | 
				
			||||||
 | 
					  DEVICE_PACKAGES := ath11k-wifi-cybertan-eww631-a1 ath11k-firmware-ipq50xx-spruce ath11k-firmware-qcn6122
 | 
				
			||||||
 | 
					  DEVICE_DTS_CONFIG := config@mp03.5-c1
 | 
				
			||||||
 | 
					  IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi
 | 
				
			||||||
 | 
					  IMAGE/nand-factory.ubi := append-ubi
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					TARGET_DEVICES += cybertan_eww631_a1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Device/cybertan_eww631_b1
 | 
				
			||||||
 | 
					  DEVICE_TITLE := CyberTan EWW631-B1
 | 
				
			||||||
 | 
					  DEVICE_DTS := qcom-ipq5018-eww631-b1
 | 
				
			||||||
 | 
					  SUPPORTED_DEVICES := cybertan,eww631-b1
 | 
				
			||||||
 | 
					  DEVICE_PACKAGES := ath11k-wifi-cybertan-eww631-b1 ath11k-firmware-ipq50xx-spruce ath11k-firmware-qcn6122
 | 
				
			||||||
 | 
					  DEVICE_DTS_CONFIG := config@mp03.5-c1
 | 
				
			||||||
 | 
					  IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi
 | 
				
			||||||
 | 
					  IMAGE/nand-factory.ubi := append-ubi
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					TARGET_DEVICES += cybertan_eww631_b1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Device/edgecore_eap104
 | 
					define Device/edgecore_eap104
 | 
				
			||||||
  DEVICE_TITLE := EdgeCore EAP104
 | 
					  DEVICE_TITLE := EdgeCore EAP104
 | 
				
			||||||
  DEVICE_DTS := qcom-ipq5018-eap104
 | 
					  DEVICE_DTS := qcom-ipq5018-eap104
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										54
									
								
								feeds/ipq807x_v5.4/ipq50xx/patches/301-diag_char.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								feeds/ipq807x_v5.4/ipq50xx/patches/301-diag_char.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
 | 
				
			||||||
 | 
					===================================================================
 | 
				
			||||||
 | 
					--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/char/diag/diagchar_core.c
 | 
				
			||||||
 | 
					+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
 | 
				
			||||||
 | 
					@@ -763,11 +763,6 @@ static void diag_cmd_invalidate_polling(
 | 
				
			||||||
 | 
					 	driver->polling_reg_flag = 0;
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			return;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		polling = diag_cmd_chk_polling(&item->entry);
 | 
				
			||||||
 | 
					 		if (polling == DIAG_CMD_POLLING) {
 | 
				
			||||||
 | 
					 			driver->polling_reg_flag = 1;
 | 
				
			||||||
 | 
					@@ -829,11 +824,6 @@ struct diag_cmd_reg_entry_t *diag_cmd_se
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			return NULL;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		temp_entry = &item->entry;
 | 
				
			||||||
 | 
					 		if (temp_entry->cmd_code == entry->cmd_code &&
 | 
				
			||||||
 | 
					 		    temp_entry->subsys_id == entry->subsys_id &&
 | 
				
			||||||
 | 
					@@ -907,12 +897,6 @@ void diag_cmd_remove_reg_by_pid(int pid)
 | 
				
			||||||
 | 
					 	mutex_lock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			mutex_unlock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					-			return;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		if (item->pid == pid) {
 | 
				
			||||||
 | 
					 			list_del(&item->link);
 | 
				
			||||||
 | 
					 			kfree(item);
 | 
				
			||||||
 | 
					@@ -931,12 +915,6 @@ void diag_cmd_remove_reg_by_proc(int pro
 | 
				
			||||||
 | 
					 	mutex_lock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			mutex_unlock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					-			return;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		if (item->proc == proc) {
 | 
				
			||||||
 | 
					 			list_del(&item->link);
 | 
				
			||||||
 | 
					 			kfree(item);
 | 
				
			||||||
@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/mtd/nand/raw/nand_ids.c
 | 
				
			||||||
 | 
					===================================================================
 | 
				
			||||||
 | 
					--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/mtd/nand/raw/nand_ids.c
 | 
				
			||||||
 | 
					+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/mtd/nand/raw/nand_ids.c
 | 
				
			||||||
 | 
					@@ -79,9 +79,9 @@
 | 
				
			||||||
 | 
					 		{ .id = {0xc2, 0xb7} },
 | 
				
			||||||
 | 
					 		SZ_4K, SZ_512, SZ_256K, 0, 2, 256, NAND_ECC_INFO(8, SZ_512), 0},
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-	{"MX35UF2GE4AD-Z4I SPI NAND 2G 1.8V",
 | 
				
			||||||
 | 
					+	{"MX35UF2GE4AD-Z4I SPI NAND 2G 1.8V 8-bit",
 | 
				
			||||||
 | 
					 		{ .id = {0xc2, 0xa6} },
 | 
				
			||||||
 | 
					-		SZ_2K, SZ_128, SZ_128K, 0, 2, 160, NAND_ECC_INFO(4, SZ_512), 0 },
 | 
				
			||||||
 | 
					+		SZ_2K, SZ_256, SZ_128K, 0, 2, 128, NAND_ECC_INFO(8, SZ_512), 0 },
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	{"GD5F1GQ5REYIH SPI NAND 1G 1.8V",
 | 
				
			||||||
 | 
					 		{ .id = {0xc8, 0x21} },
 | 
				
			||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
#!/bin/sh
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					 | 
				
			||||||
[ -e /lib/firmware/$FIRMWARE ] && exit 0
 | 
					[ -e /lib/firmware/$FIRMWARE ] && exit 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
. /lib/functions.sh
 | 
					. /lib/functions.sh
 | 
				
			||||||
@@ -98,6 +97,18 @@ ath11k-macs)
 | 
				
			|||||||
		;;
 | 
							;;
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
 | 
					ath11k/IPQ6018/hw1.0/board.bin)
 | 
				
			||||||
 | 
						case "$board" in
 | 
				
			||||||
 | 
						cig,wf188n)
 | 
				
			||||||
 | 
							country=`cat /etc/ucentral/country`
 | 
				
			||||||
 | 
							if [ "$country" == "CA" ]; then
 | 
				
			||||||
 | 
								ln -s /lib/firmware/ath11k/IPQ6018/hw1.0/board.bin.CA /lib/firmware/ath11k/IPQ6018/hw1.0/board.bin
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								ln -s /lib/firmware/ath11k/IPQ6018/hw1.0/board.bin.US /lib/firmware/ath11k/IPQ6018/hw1.0/board.bin
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
*)
 | 
					*)
 | 
				
			||||||
	exit 1
 | 
						exit 1
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,8 @@ boot() {
 | 
				
			|||||||
		;;		
 | 
							;;		
 | 
				
			||||||
	edgecore,eap101|\
 | 
						edgecore,eap101|\
 | 
				
			||||||
	edgecore,eap102|\
 | 
						edgecore,eap102|\
 | 
				
			||||||
	edgecore,oap102)
 | 
						edgecore,oap102|\
 | 
				
			||||||
 | 
						edgecore.eap104)
 | 
				
			||||||
		avail=$(fw_printenv -n upgrade_available)
 | 
							avail=$(fw_printenv -n upgrade_available)
 | 
				
			||||||
		[ ${avail} -eq 0 ] && fw_setenv upgrade_available 1
 | 
							[ ${avail} -eq 0 ] && fw_setenv upgrade_available 1
 | 
				
			||||||
		fw_setenv bootcount 0
 | 
							fw_setenv bootcount 0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -247,8 +247,8 @@ nand_do_upgrade_success() {
 | 
				
			|||||||
	local conf_tar="/tmp/sysupgrade.tgz"
 | 
						local conf_tar="/tmp/sysupgrade.tgz"
 | 
				
			||||||
	sync
 | 
						sync
 | 
				
			||||||
	[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
 | 
						[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
 | 
				
			||||||
 | 
						[ -f "$conf_tar" ] && nand_restore_config "$conf_tar" && sync
 | 
				
			||||||
	[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
 | 
						[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
 | 
				
			||||||
	[ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
 | 
					 | 
				
			||||||
	echo "sysupgrade successful"
 | 
						echo "sysupgrade successful"
 | 
				
			||||||
	umount -a
 | 
						umount -a
 | 
				
			||||||
	reboot -f
 | 
						reboot -f
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -122,10 +122,10 @@ platform_do_upgrade() {
 | 
				
			|||||||
		else
 | 
							else
 | 
				
			||||||
			if grep -q rootfs1 /proc/cmdline; then
 | 
								if grep -q rootfs1 /proc/cmdline; then
 | 
				
			||||||
				CI_UBIPART="rootfs2"
 | 
									CI_UBIPART="rootfs2"
 | 
				
			||||||
				fw_setenv active 2 || exit 1
 | 
									CI_FWSETENV="active 2"
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				CI_UBIPART="rootfs1"
 | 
									CI_UBIPART="rootfs1"
 | 
				
			||||||
				fw_setenv active 1 || exit 1
 | 
									CI_FWSETENV="active 1"
 | 
				
			||||||
			fi
 | 
								fi
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
		nand_upgrade_tar "$1"
 | 
							nand_upgrade_tar "$1"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,23 +2,14 @@ KERNEL_LOADADDR := 0x41080000
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
DEVICE_VARS += CE_TYPE
 | 
					DEVICE_VARS += CE_TYPE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Device/cig_wf188n-ca
 | 
					define Device/cig_wf188n
 | 
				
			||||||
  DEVICE_TITLE := Cigtech WF-188n
 | 
					  DEVICE_TITLE := Cigtech WF-188n
 | 
				
			||||||
  DEVICE_DTS := qcom-ipq6018-cig-wf188n
 | 
					  DEVICE_DTS := qcom-ipq6018-cig-wf188n
 | 
				
			||||||
  DEVICE_DTS_CONFIG := config@cp03-c1
 | 
					  DEVICE_DTS_CONFIG := config@cp03-c1
 | 
				
			||||||
  SUPPORTED_DEVICES := cig,wf188n
 | 
					  SUPPORTED_DEVICES := cig,wf188n
 | 
				
			||||||
  DEVICE_PACKAGES := ath11k-wifi-cig-wf188n-ca uboot-env
 | 
					  DEVICE_PACKAGES := ath11k-wifi-cig-wf188n uboot-env
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
TARGET_DEVICES += cig_wf188n-ca
 | 
					TARGET_DEVICES += cig_wf188n
 | 
				
			||||||
 | 
					 | 
				
			||||||
define Device/cig_wf188n-us
 | 
					 | 
				
			||||||
  DEVICE_TITLE := Cigtech WF-188n
 | 
					 | 
				
			||||||
  DEVICE_DTS := qcom-ipq6018-cig-wf188n
 | 
					 | 
				
			||||||
  DEVICE_DTS_CONFIG := config@cp03-c1
 | 
					 | 
				
			||||||
  SUPPORTED_DEVICES := cig,wf188n
 | 
					 | 
				
			||||||
  DEVICE_PACKAGES := ath11k-wifi-cig-wf188n-us uboot-env
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
TARGET_DEVICES += cig_wf188n-us
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Device/hfcl_ion4xe
 | 
					define Device/hfcl_ion4xe
 | 
				
			||||||
  DEVICE_TITLE := HFCL ION4Xe
 | 
					  DEVICE_TITLE := HFCL ION4Xe
 | 
				
			||||||
@@ -101,14 +92,14 @@ define Device/wallys_dr6018
 | 
				
			|||||||
endef
 | 
					endef
 | 
				
			||||||
TARGET_DEVICES += wallys_dr6018
 | 
					TARGET_DEVICES += wallys_dr6018
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Device/wallys_dr6018_v4
 | 
					define Device/wallys_dr6018-v4
 | 
				
			||||||
  DEVICE_TITLE := Wallys DR6018 V4
 | 
					  DEVICE_TITLE := Wallys DR6018 V4
 | 
				
			||||||
  DEVICE_DTS := qcom-ipq6018-wallys-dr6018-v4
 | 
					  DEVICE_DTS := qcom-ipq6018-wallys-dr6018-v4
 | 
				
			||||||
  DEVICE_DTS_CONFIG := config@cp01-c4
 | 
					  DEVICE_DTS_CONFIG := config@cp01-c4
 | 
				
			||||||
  SUPPORTED_DEVICES := wallys,dr6018-v4
 | 
					  SUPPORTED_DEVICES := wallys,dr6018-v4
 | 
				
			||||||
  DEVICE_PACKAGES := ath11k-wifi-wallys-dr6018-v4 uboot-envtools ath11k-firmware-qcn9000
 | 
					  DEVICE_PACKAGES := ath11k-wifi-wallys-dr6018-v4 uboot-envtools ath11k-firmware-qcn9000
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
TARGET_DEVICES += wallys_dr6018_v4
 | 
					TARGET_DEVICES += wallys_dr6018-v4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Device/glinet_ax1800
 | 
					define Device/glinet_ax1800
 | 
				
			||||||
  DEVICE_TITLE := GL-iNet AX1800
 | 
					  DEVICE_TITLE := GL-iNet AX1800
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										54
									
								
								feeds/ipq807x_v5.4/ipq60xx/patches/301-diag_char.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								feeds/ipq807x_v5.4/ipq60xx/patches/301-diag_char.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
 | 
				
			||||||
 | 
					===================================================================
 | 
				
			||||||
 | 
					--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/char/diag/diagchar_core.c
 | 
				
			||||||
 | 
					+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
 | 
				
			||||||
 | 
					@@ -763,11 +763,6 @@ static void diag_cmd_invalidate_polling(
 | 
				
			||||||
 | 
					 	driver->polling_reg_flag = 0;
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			return;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		polling = diag_cmd_chk_polling(&item->entry);
 | 
				
			||||||
 | 
					 		if (polling == DIAG_CMD_POLLING) {
 | 
				
			||||||
 | 
					 			driver->polling_reg_flag = 1;
 | 
				
			||||||
 | 
					@@ -829,11 +824,6 @@ struct diag_cmd_reg_entry_t *diag_cmd_se
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			return NULL;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		temp_entry = &item->entry;
 | 
				
			||||||
 | 
					 		if (temp_entry->cmd_code == entry->cmd_code &&
 | 
				
			||||||
 | 
					 		    temp_entry->subsys_id == entry->subsys_id &&
 | 
				
			||||||
 | 
					@@ -907,12 +897,6 @@ void diag_cmd_remove_reg_by_pid(int pid)
 | 
				
			||||||
 | 
					 	mutex_lock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			mutex_unlock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					-			return;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		if (item->pid == pid) {
 | 
				
			||||||
 | 
					 			list_del(&item->link);
 | 
				
			||||||
 | 
					 			kfree(item);
 | 
				
			||||||
 | 
					@@ -931,12 +915,6 @@ void diag_cmd_remove_reg_by_proc(int pro
 | 
				
			||||||
 | 
					 	mutex_lock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			mutex_unlock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					-			return;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		if (item->proc == proc) {
 | 
				
			||||||
 | 
					 			list_del(&item->link);
 | 
				
			||||||
 | 
					 			kfree(item);
 | 
				
			||||||
@@ -18,6 +18,9 @@ edgecore,oap102)
 | 
				
			|||||||
        ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt"
 | 
					        ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt"
 | 
				
			||||||
        ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt"
 | 
					        ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt"
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
 | 
					cybertan,eww631-b1)
 | 
				
			||||||
 | 
						ucidef_set_led_default "power" "POWER" "sys:blue" "on"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
esac
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
board_config_flush
 | 
					board_config_flush
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,8 +43,10 @@ qcom_setup_macs()
 | 
				
			|||||||
		[ -z "$mac" ] && return;
 | 
							[ -z "$mac" ] && return;
 | 
				
			||||||
		wan_mac=$(macaddr_canonicalize $mac)
 | 
							wan_mac=$(macaddr_canonicalize $mac)
 | 
				
			||||||
		lan_mac=$(macaddr_add "$wan_mac" 1)
 | 
							lan_mac=$(macaddr_add "$wan_mac" 1)
 | 
				
			||||||
		ucidef_set_network_device_mac eth0 $lan_mac
 | 
							ucidef_set_network_device_mac eth0 $wan_mac
 | 
				
			||||||
		ucidef_set_network_device_mac eth1 $wan_mac
 | 
							ucidef_set_network_device_mac eth1 $lan_mac
 | 
				
			||||||
 | 
							ip link set eth0 address $wan_mac
 | 
				
			||||||
 | 
							ip link set eth1 address $lan_mac
 | 
				
			||||||
		ucidef_set_label_macaddr $wan_mac
 | 
							ucidef_set_label_macaddr $wan_mac
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
	*)
 | 
						*)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,9 +16,9 @@ ath11k_generate_macs() {
 | 
				
			|||||||
	echo -ne \\x${mac3//:/\\x} >> /lib/firmware/ath11k-macs
 | 
						echo -ne \\x${mac3//:/\\x} >> /lib/firmware/ath11k-macs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ath11k_generate_macs_wf194() {
 | 
					ath11k_generate_macs_wf196() {
 | 
				
			||||||
	touch /lib/firmware/ath11k-macs
 | 
						touch /lib/firmware/ath11k-macs
 | 
				
			||||||
	mac=$(grep BaseMacAddress= /dev/mtd14 | cut -dx -f2)
 | 
						mac=$(grep BaseMacAddress= /dev/mtd18 | cut -dx -f2)
 | 
				
			||||||
	eth=$(macaddr_canonicalize $mac)
 | 
						eth=$(macaddr_canonicalize $mac)
 | 
				
			||||||
	mac1=$(macaddr_add $eth 2)
 | 
						mac1=$(macaddr_add $eth 2)
 | 
				
			||||||
	mac2=$(macaddr_add $eth 3)
 | 
						mac2=$(macaddr_add $eth 3)
 | 
				
			||||||
@@ -92,8 +92,32 @@ ath11k-macs)
 | 
				
			|||||||
	edgecore,eap106)
 | 
						edgecore,eap106)
 | 
				
			||||||
		ath11k_generate_macs
 | 
							ath11k_generate_macs
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
	cig,wf194c)
 | 
						cig,wf196)
 | 
				
			||||||
		ath11k_generate_macs_wf194
 | 
							ath11k_generate_macs_wf196
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					ath11k/IPQ8074/hw2.0/board.bin)
 | 
				
			||||||
 | 
						case "$board" in
 | 
				
			||||||
 | 
						cig,wf196)
 | 
				
			||||||
 | 
							country=`cat /etc/ucentral/country`
 | 
				
			||||||
 | 
							if [ "$country" == "CA" ]; then
 | 
				
			||||||
 | 
								ln -s /lib/firmware/ath11k/IPQ8074/hw2.0/board.bin.CA /lib/firmware/ath11k/IPQ8074/hw2.0/board.bin
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								ln -s /lib/firmware/ath11k/IPQ8074/hw2.0/board.bin.US /lib/firmware/ath11k/IPQ8074/hw2.0/board.bin
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					ath11k/QCN9074/hw1.0/board.bin)
 | 
				
			||||||
 | 
						case "$board" in
 | 
				
			||||||
 | 
						cig,wf196)
 | 
				
			||||||
 | 
							country=`cat /etc/ucentral/country`
 | 
				
			||||||
 | 
							if [ "$country" == "CA" ]; then
 | 
				
			||||||
 | 
								ln -s /lib/firmware/ath11k/QCN9074/hw1.0/board.bin.CA /lib/firmware/ath11k/QCN9074/hw1.0/board.bin
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								ln -s /lib/firmware/ath11k/QCN9074/hw1.0/board.bin.US /lib/firmware/ath11k/QCN9074/hw1.0/board.bin
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
		;;
 | 
							;;
 | 
				
			||||||
	esac
 | 
						esac
 | 
				
			||||||
	;;
 | 
						;;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,8 @@ boot() {
 | 
				
			|||||||
		;;		
 | 
							;;		
 | 
				
			||||||
	edgecore,eap101|\
 | 
						edgecore,eap101|\
 | 
				
			||||||
	edgecore,eap102|\
 | 
						edgecore,eap102|\
 | 
				
			||||||
	edgecore,oap102)
 | 
						edgecore,oap102|\
 | 
				
			||||||
 | 
						edgecore.eap104)
 | 
				
			||||||
		avail=$(fw_printenv -n upgrade_available)
 | 
							avail=$(fw_printenv -n upgrade_available)
 | 
				
			||||||
		[ ${avail} -eq 0 ] && fw_setenv upgrade_available 1
 | 
							[ ${avail} -eq 0 ] && fw_setenv upgrade_available 1
 | 
				
			||||||
		fw_setenv bootcount 0
 | 
							fw_setenv bootcount 0
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -247,8 +247,8 @@ nand_do_upgrade_success() {
 | 
				
			|||||||
	local conf_tar="/tmp/sysupgrade.tgz"
 | 
						local conf_tar="/tmp/sysupgrade.tgz"
 | 
				
			||||||
	sync
 | 
						sync
 | 
				
			||||||
	[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
 | 
						[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
 | 
				
			||||||
 | 
						[ -f "$conf_tar" ] && nand_restore_config "$conf_tar" && sync
 | 
				
			||||||
	[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
 | 
						[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
 | 
				
			||||||
	[ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
 | 
					 | 
				
			||||||
	echo "sysupgrade successful"
 | 
						echo "sysupgrade successful"
 | 
				
			||||||
	umount -a
 | 
						umount -a
 | 
				
			||||||
	reboot -f
 | 
						reboot -f
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -61,12 +61,16 @@ platform_do_upgrade() {
 | 
				
			|||||||
		if [ "$(find_mtd_chardev rootfs)" ]; then
 | 
							if [ "$(find_mtd_chardev rootfs)" ]; then
 | 
				
			||||||
			CI_UBIPART="rootfs"
 | 
								CI_UBIPART="rootfs"
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			if grep -q rootfs1 /proc/cmdline; then
 | 
								if [ -e /tmp/downgrade ]; then
 | 
				
			||||||
 | 
									CI_UBIPART="rootfs1"
 | 
				
			||||||
 | 
									{ echo 'active 1'; echo 'upgrade_available 0'; } > /tmp/fw_setenv.txt || exit 1
 | 
				
			||||||
 | 
									CI_FWSETENV="-s /tmp/fw_setenv.txt"
 | 
				
			||||||
 | 
								elif grep -q rootfs1 /proc/cmdline; then
 | 
				
			||||||
				CI_UBIPART="rootfs2"
 | 
									CI_UBIPART="rootfs2"
 | 
				
			||||||
				fw_setenv active 2 || exit 1
 | 
									CI_FWSETENV="active 2"
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				CI_UBIPART="rootfs1"
 | 
									CI_UBIPART="rootfs1"
 | 
				
			||||||
				fw_setenv active 1 || exit 1
 | 
									CI_FWSETENV="active 1"
 | 
				
			||||||
			fi
 | 
								fi
 | 
				
			||||||
		fi
 | 
							fi
 | 
				
			||||||
		nand_upgrade_tar "$1"
 | 
							nand_upgrade_tar "$1"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,8 +29,79 @@
 | 
				
			|||||||
		stdout-path = "serial0";
 | 
							stdout-path = "serial0";
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						gpio-export {
 | 
				
			||||||
 | 
							compatible = "gpio-export";
 | 
				
			||||||
 | 
							#size-cells = <0>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mcu-enable {
 | 
				
			||||||
 | 
								gpio-export,name = "mcu-enable";
 | 
				
			||||||
 | 
								gpio-export,output = <0>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							usb-hub-enable {
 | 
				
			||||||
 | 
								gpio-export,name = "usb-hub-enable";
 | 
				
			||||||
 | 
								gpio-export,output = <1>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 55 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							usb-rear-power {
 | 
				
			||||||
 | 
								gpio-export,name = "usb-rear-power";
 | 
				
			||||||
 | 
								gpio-export,output = <1>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 29 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							usb-side-power {
 | 
				
			||||||
 | 
								gpio-export,name = "usb-side-power";
 | 
				
			||||||
 | 
								gpio-export,output = <1>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 30 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	soc {
 | 
						soc {
 | 
				
			||||||
		pinctrl@1000000 {
 | 
							pinctrl@1000000 {
 | 
				
			||||||
 | 
								pinctrl-0 = <&mcu_rst &mcu_rsv &usb_rear_pwr &usb_side_pwr &usb_hub_rst>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mcu_rst: mcu_rst_pins {
 | 
				
			||||||
 | 
									pins = "gpio54";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
									output-low;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mcu_rsv: mcu_rsv_pins {
 | 
				
			||||||
 | 
									pins = "gpio56";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								usb_rear_pwr: usb_rear_pwr_pins {
 | 
				
			||||||
 | 
									pins = "gpio29";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
									output-high;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								usb_side_pwr: usb_side_pwr_pins {
 | 
				
			||||||
 | 
									pins = "gpio30";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
									output-high;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								usb_hub_rst: usb_hub_rst_pins {
 | 
				
			||||||
 | 
									pins = "gpio55";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
									output-high;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			button_pins: button_pins {
 | 
								button_pins: button_pins {
 | 
				
			||||||
				reset_button {
 | 
									reset_button {
 | 
				
			||||||
					pins = "gpio66";
 | 
										pins = "gpio66";
 | 
				
			||||||
@@ -40,30 +111,6 @@
 | 
				
			|||||||
				};
 | 
									};
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			usb_mux_sel_pins: usb_mux_pins {
 | 
					 | 
				
			||||||
				mux {
 | 
					 | 
				
			||||||
					pins = "gpio27";
 | 
					 | 
				
			||||||
					function = "gpio";
 | 
					 | 
				
			||||||
					drive-strength = <8>;
 | 
					 | 
				
			||||||
					bias-pull-down;
 | 
					 | 
				
			||||||
				};
 | 
					 | 
				
			||||||
			};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			pcie0_pins: pcie_pins {
 | 
					 | 
				
			||||||
				pcie0_rst {
 | 
					 | 
				
			||||||
					pins = "gpio58";
 | 
					 | 
				
			||||||
					function = "pcie0_rst";
 | 
					 | 
				
			||||||
					drive-strength = <8>;
 | 
					 | 
				
			||||||
					bias-pull-down;
 | 
					 | 
				
			||||||
				};
 | 
					 | 
				
			||||||
				pcie0_wake {
 | 
					 | 
				
			||||||
					pins = "gpio59";
 | 
					 | 
				
			||||||
					function = "pcie0_wake";
 | 
					 | 
				
			||||||
					drive-strength = <8>;
 | 
					 | 
				
			||||||
					bias-pull-down;
 | 
					 | 
				
			||||||
				};
 | 
					 | 
				
			||||||
			};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			mdio_pins: mdio_pinmux {
 | 
								mdio_pins: mdio_pinmux {
 | 
				
			||||||
				mux_0 {
 | 
									mux_0 {
 | 
				
			||||||
					pins = "gpio68";
 | 
										pins = "gpio68";
 | 
				
			||||||
@@ -170,19 +217,6 @@
 | 
				
			|||||||
			status = "ok";
 | 
								status = "ok";
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		phy@84000 {
 | 
					 | 
				
			||||||
			status = "ok";
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		phy@86000 {
 | 
					 | 
				
			||||||
			status = "ok";
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		pci@20000000 {
 | 
					 | 
				
			||||||
			perst-gpio = <&tlmm 58 1>;
 | 
					 | 
				
			||||||
			status = "ok";
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		gpio_keys {
 | 
							gpio_keys {
 | 
				
			||||||
			compatible = "gpio-keys";
 | 
								compatible = "gpio-keys";
 | 
				
			||||||
			pinctrl-0 = <&button_pins>;
 | 
								pinctrl-0 = <&button_pins>;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,8 +29,79 @@
 | 
				
			|||||||
		stdout-path = "serial0";
 | 
							stdout-path = "serial0";
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						gpio-export {
 | 
				
			||||||
 | 
							compatible = "gpio-export";
 | 
				
			||||||
 | 
							#size-cells = <0>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mcu-enable {
 | 
				
			||||||
 | 
								gpio-export,name = "mcu-enable";
 | 
				
			||||||
 | 
								gpio-export,output = <0>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							usb-hub-enable {
 | 
				
			||||||
 | 
								gpio-export,name = "usb-hub-enable";
 | 
				
			||||||
 | 
								gpio-export,output = <1>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 55 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							usb-rear-power {
 | 
				
			||||||
 | 
								gpio-export,name = "usb-rear-power";
 | 
				
			||||||
 | 
								gpio-export,output = <1>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 29 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							usb-side-power {
 | 
				
			||||||
 | 
								gpio-export,name = "usb-side-power";
 | 
				
			||||||
 | 
								gpio-export,output = <1>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 30 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	soc {
 | 
						soc {
 | 
				
			||||||
		pinctrl@1000000 {
 | 
							pinctrl@1000000 {
 | 
				
			||||||
 | 
								pinctrl-0 = <&mcu_rst &mcu_rsv &usb_rear_pwr &usb_side_pwr &usb_hub_rst>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mcu_rst: mcu_rst_pins {
 | 
				
			||||||
 | 
									pins = "gpio54";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
									output-low;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mcu_rsv: mcu_rsv_pins {
 | 
				
			||||||
 | 
									pins = "gpio56";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								usb_rear_pwr: usb_rear_pwr_pins {
 | 
				
			||||||
 | 
									pins = "gpio29";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
									output-high;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								usb_side_pwr: usb_side_pwr_pins {
 | 
				
			||||||
 | 
									pins = "gpio30";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
									output-high;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								usb_hub_rst: usb_hub_rst_pins {
 | 
				
			||||||
 | 
									pins = "gpio55";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
									output-high;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			button_pins: button_pins {
 | 
								button_pins: button_pins {
 | 
				
			||||||
				reset_button {
 | 
									reset_button {
 | 
				
			||||||
					pins = "gpio66";
 | 
										pins = "gpio66";
 | 
				
			||||||
@@ -40,30 +111,6 @@
 | 
				
			|||||||
				};
 | 
									};
 | 
				
			||||||
			};
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			usb_mux_sel_pins: usb_mux_pins {
 | 
					 | 
				
			||||||
				mux {
 | 
					 | 
				
			||||||
					pins = "gpio27";
 | 
					 | 
				
			||||||
					function = "gpio";
 | 
					 | 
				
			||||||
					drive-strength = <8>;
 | 
					 | 
				
			||||||
					bias-pull-down;
 | 
					 | 
				
			||||||
				};
 | 
					 | 
				
			||||||
			};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			pcie0_pins: pcie_pins {
 | 
					 | 
				
			||||||
				pcie0_rst {
 | 
					 | 
				
			||||||
					pins = "gpio58";
 | 
					 | 
				
			||||||
					function = "pcie0_rst";
 | 
					 | 
				
			||||||
					drive-strength = <8>;
 | 
					 | 
				
			||||||
					bias-pull-down;
 | 
					 | 
				
			||||||
				};
 | 
					 | 
				
			||||||
				pcie0_wake {
 | 
					 | 
				
			||||||
					pins = "gpio59";
 | 
					 | 
				
			||||||
					function = "pcie0_wake";
 | 
					 | 
				
			||||||
					drive-strength = <8>;
 | 
					 | 
				
			||||||
					bias-pull-down;
 | 
					 | 
				
			||||||
				};
 | 
					 | 
				
			||||||
			};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			mdio_pins: mdio_pinmux {
 | 
								mdio_pins: mdio_pinmux {
 | 
				
			||||||
				mux_0 {
 | 
									mux_0 {
 | 
				
			||||||
					pins = "gpio68";
 | 
										pins = "gpio68";
 | 
				
			||||||
@@ -170,19 +217,6 @@
 | 
				
			|||||||
			status = "ok";
 | 
								status = "ok";
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		phy@84000 {
 | 
					 | 
				
			||||||
			status = "ok";
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		phy@86000 {
 | 
					 | 
				
			||||||
			status = "ok";
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		pci@20000000 {
 | 
					 | 
				
			||||||
			perst-gpio = <&tlmm 58 1>;
 | 
					 | 
				
			||||||
			status = "ok";
 | 
					 | 
				
			||||||
		};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		gpio_keys {
 | 
							gpio_keys {
 | 
				
			||||||
			compatible = "gpio-keys";
 | 
								compatible = "gpio-keys";
 | 
				
			||||||
			pinctrl-0 = <&button_pins>;
 | 
								pinctrl-0 = <&button_pins>;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	aliases {
 | 
						aliases {
 | 
				
			||||||
		serial0 = &blsp1_uart5;
 | 
							serial0 = &blsp1_uart5;
 | 
				
			||||||
 | 
							serial1 = &blsp1_uart3;
 | 
				
			||||||
		/* Aliases as required by u-boot to patch MAC addresses */
 | 
							/* Aliases as required by u-boot to patch MAC addresses */
 | 
				
			||||||
		ethernet0 = "/soc/dp1";
 | 
							ethernet0 = "/soc/dp1";
 | 
				
			||||||
		ethernet1 = "/soc/dp2";
 | 
							ethernet1 = "/soc/dp2";
 | 
				
			||||||
@@ -29,6 +30,17 @@
 | 
				
			|||||||
		stdout-path = "serial0";
 | 
							stdout-path = "serial0";
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						gpio-export {
 | 
				
			||||||
 | 
							compatible = "gpio-export";
 | 
				
			||||||
 | 
							#size-cells = <0>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							mcu-enable {
 | 
				
			||||||
 | 
								gpio-export,name = "mcu-enable";
 | 
				
			||||||
 | 
								gpio-export,output = <0>;
 | 
				
			||||||
 | 
								gpios = <&tlmm 34 GPIO_ACTIVE_HIGH>;
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	reserved-memory {
 | 
						reserved-memory {
 | 
				
			||||||
/* No Pine attach in 256M profile */
 | 
					/* No Pine attach in 256M profile */
 | 
				
			||||||
#if !defined(__IPQ_MEM_PROFILE_256_MB__)
 | 
					#if !defined(__IPQ_MEM_PROFILE_256_MB__)
 | 
				
			||||||
@@ -130,6 +142,26 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	soc {
 | 
						soc {
 | 
				
			||||||
		pinctrl@1000000 {
 | 
							pinctrl@1000000 {
 | 
				
			||||||
 | 
								pinctrl-0 = <&mcu_rst>;
 | 
				
			||||||
 | 
								pinctrl-names = "default";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mcu_rst: mcu_rst_pins {
 | 
				
			||||||
 | 
									pins = "gpio34";
 | 
				
			||||||
 | 
									function = "gpio";
 | 
				
			||||||
 | 
									drive-strength = <8>;
 | 
				
			||||||
 | 
									bias-disable;
 | 
				
			||||||
 | 
									output-low;
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								mcu_uart: mcu_uart_pins {
 | 
				
			||||||
 | 
									mux {
 | 
				
			||||||
 | 
										pins = "gpio48", "gpio49";
 | 
				
			||||||
 | 
										function = "blsp2_uart";
 | 
				
			||||||
 | 
										drive-strength = <8>;
 | 
				
			||||||
 | 
										bias-disable;
 | 
				
			||||||
 | 
									};
 | 
				
			||||||
 | 
								};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			button_pins: button_pins {
 | 
								button_pins: button_pins {
 | 
				
			||||||
				wps_button {
 | 
									wps_button {
 | 
				
			||||||
					pins = "gpio67";
 | 
										pins = "gpio67";
 | 
				
			||||||
@@ -688,6 +720,12 @@
 | 
				
			|||||||
	};
 | 
						};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&blsp1_uart3 {
 | 
				
			||||||
 | 
						pinctrl-0 = <&mcu_uart>;
 | 
				
			||||||
 | 
						pinctrl-names = "default";
 | 
				
			||||||
 | 
						status = "ok";
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
&npu_cpr {
 | 
					&npu_cpr {
 | 
				
			||||||
	status = "disabled";
 | 
						status = "disabled";
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,29 +9,17 @@ define Device/cig_wf194c4
 | 
				
			|||||||
endef
 | 
					endef
 | 
				
			||||||
TARGET_DEVICES += cig_wf194c4
 | 
					TARGET_DEVICES += cig_wf194c4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Device/cig_wf196_us
 | 
					define Device/cig_wf196
 | 
				
			||||||
  DEVICE_TITLE := CIG WF196
 | 
					  DEVICE_TITLE := CIG WF196
 | 
				
			||||||
  DEVICE_DTS := qcom-ipq807x-wf196
 | 
					  DEVICE_DTS := qcom-ipq807x-wf196
 | 
				
			||||||
  DEVICE_DTS_CONFIG=config@hk14
 | 
					  DEVICE_DTS_CONFIG=config@hk14
 | 
				
			||||||
  SUPPORTED_DEVICES := cig,wf196
 | 
					  SUPPORTED_DEVICES := cig,wf196
 | 
				
			||||||
  BLOCKSIZE := 256k
 | 
					  BLOCKSIZE := 256k
 | 
				
			||||||
  PAGESIZE := 4096
 | 
					  PAGESIZE := 4096
 | 
				
			||||||
  DEVICE_PACKAGES := ath11k-wifi-cig-wf196-us aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 \
 | 
					  DEVICE_PACKAGES := ath11k-wifi-cig-wf196 aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 \
 | 
				
			||||||
  	ath11k-firmware-qcn9000 ath11k-wifi-cig-wf196_6g-us
 | 
					  	ath11k-firmware-qcn9000
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
TARGET_DEVICES += cig_wf196_us
 | 
					TARGET_DEVICES += cig_wf196
 | 
				
			||||||
 | 
					 | 
				
			||||||
define Device/cig_wf196_ca
 | 
					 | 
				
			||||||
  DEVICE_TITLE := CIG WF196
 | 
					 | 
				
			||||||
  DEVICE_DTS := qcom-ipq807x-wf196
 | 
					 | 
				
			||||||
  DEVICE_DTS_CONFIG=config@hk14
 | 
					 | 
				
			||||||
  SUPPORTED_DEVICES := cig,wf196
 | 
					 | 
				
			||||||
  BLOCKSIZE := 256k
 | 
					 | 
				
			||||||
  PAGESIZE := 4096
 | 
					 | 
				
			||||||
  DEVICE_PACKAGES := ath11k-wifi-cig-wf196-ca aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 \
 | 
					 | 
				
			||||||
  	ath11k-firmware-qcn9000 ath11k-wifi-cig-wf196_6g-ca
 | 
					 | 
				
			||||||
endef
 | 
					 | 
				
			||||||
TARGET_DEVICES += cig_wf196_ca
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Device/edgecore_eap102
 | 
					define Device/edgecore_eap102
 | 
				
			||||||
  DEVICE_TITLE := Edgecore EAP102
 | 
					  DEVICE_TITLE := Edgecore EAP102
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										54
									
								
								feeds/ipq807x_v5.4/ipq807x/patches/301-diag_char.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								feeds/ipq807x_v5.4/ipq807x/patches/301-diag_char.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
				
			|||||||
 | 
					Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
 | 
				
			||||||
 | 
					===================================================================
 | 
				
			||||||
 | 
					--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/char/diag/diagchar_core.c
 | 
				
			||||||
 | 
					+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
 | 
				
			||||||
 | 
					@@ -763,11 +763,6 @@ static void diag_cmd_invalidate_polling(
 | 
				
			||||||
 | 
					 	driver->polling_reg_flag = 0;
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			return;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		polling = diag_cmd_chk_polling(&item->entry);
 | 
				
			||||||
 | 
					 		if (polling == DIAG_CMD_POLLING) {
 | 
				
			||||||
 | 
					 			driver->polling_reg_flag = 1;
 | 
				
			||||||
 | 
					@@ -829,11 +824,6 @@ struct diag_cmd_reg_entry_t *diag_cmd_se
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			return NULL;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		temp_entry = &item->entry;
 | 
				
			||||||
 | 
					 		if (temp_entry->cmd_code == entry->cmd_code &&
 | 
				
			||||||
 | 
					 		    temp_entry->subsys_id == entry->subsys_id &&
 | 
				
			||||||
 | 
					@@ -907,12 +897,6 @@ void diag_cmd_remove_reg_by_pid(int pid)
 | 
				
			||||||
 | 
					 	mutex_lock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			mutex_unlock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					-			return;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		if (item->pid == pid) {
 | 
				
			||||||
 | 
					 			list_del(&item->link);
 | 
				
			||||||
 | 
					 			kfree(item);
 | 
				
			||||||
 | 
					@@ -931,12 +915,6 @@ void diag_cmd_remove_reg_by_proc(int pro
 | 
				
			||||||
 | 
					 	mutex_lock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					 	list_for_each_safe(start, temp, &driver->cmd_reg_list) {
 | 
				
			||||||
 | 
					 		item = list_entry(start, struct diag_cmd_reg_t, link);
 | 
				
			||||||
 | 
					-		if (&item->entry == NULL) {
 | 
				
			||||||
 | 
					-			pr_err("diag: In %s, unable to search command\n",
 | 
				
			||||||
 | 
					-			       __func__);
 | 
				
			||||||
 | 
					-			mutex_unlock(&driver->cmd_reg_mutex);
 | 
				
			||||||
 | 
					-			return;
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					 		if (item->proc == proc) {
 | 
				
			||||||
 | 
					 			list_del(&item->link);
 | 
				
			||||||
 | 
					 			kfree(item);
 | 
				
			||||||
							
								
								
									
										27
									
								
								feeds/ipq807x_v5.4/libtcmd/patches/100-compile.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								feeds/ipq807x_v5.4/libtcmd/patches/100-compile.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					Index: libtcmd-11.5/libtcmd.h
 | 
				
			||||||
 | 
					===================================================================
 | 
				
			||||||
 | 
					--- libtcmd-11.5.orig/libtcmd.h
 | 
				
			||||||
 | 
					+++ libtcmd-11.5/libtcmd.h
 | 
				
			||||||
 | 
					@@ -71,7 +71,9 @@ struct tcmd_cfg {
 | 
				
			||||||
 | 
					 	struct sigevent sev;
 | 
				
			||||||
 | 
					 	timer_t timer;
 | 
				
			||||||
 | 
					 	bool timeout;
 | 
				
			||||||
 | 
					-} tcmd_cfg;
 | 
				
			||||||
 | 
					+};
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+extern struct tcmd_cfg tcmd_cfg;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 /* WLAN API */
 | 
				
			||||||
 | 
					 #ifdef WLAN_API_NL80211
 | 
				
			||||||
 | 
					Index: libtcmd-11.5/nl80211.c
 | 
				
			||||||
 | 
					===================================================================
 | 
				
			||||||
 | 
					--- libtcmd-11.5.orig/nl80211.c
 | 
				
			||||||
 | 
					+++ libtcmd-11.5/nl80211.c
 | 
				
			||||||
 | 
					@@ -23,6 +23,7 @@
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 int cb_ret;
 | 
				
			||||||
 | 
					+struct tcmd_cfg tcmd_cfg;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 #ifdef LIBNL_2
 | 
				
			||||||
 | 
					 static inline struct nl_sock *nl_handle_alloc(void)
 | 
				
			||||||
@@ -0,0 +1,58 @@
 | 
				
			|||||||
 | 
					--- a/drivers/net/wireless/ath/ath11k/core.h
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ath/ath11k/core.h
 | 
				
			||||||
 | 
					@@ -786,6 +786,7 @@ struct ath11k {
 | 
				
			||||||
 | 
					 	u32 max_tx_power;
 | 
				
			||||||
 | 
					 	u32 txpower_limit_2g;
 | 
				
			||||||
 | 
					 	u32 txpower_limit_5g;
 | 
				
			||||||
 | 
					+	u32 txpower_limit_6g;
 | 
				
			||||||
 | 
					 	u32 txpower_scale;
 | 
				
			||||||
 | 
					 	u32 power_scale;
 | 
				
			||||||
 | 
					 	u32 chan_tx_pwr;
 | 
				
			||||||
 | 
					--- a/drivers/net/wireless/ath/ath11k/mac.c
 | 
				
			||||||
 | 
					+++ b/drivers/net/wireless/ath/ath11k/mac.c
 | 
				
			||||||
 | 
					@@ -633,6 +633,7 @@ static void ath11k_pdev_caps_update(stru
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	ar->txpower_limit_2g = ar->max_tx_power;
 | 
				
			||||||
 | 
					 	ar->txpower_limit_5g = ar->max_tx_power;
 | 
				
			||||||
 | 
					+	ar->txpower_limit_6g = ar->max_tx_power;
 | 
				
			||||||
 | 
					 	ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
 | 
				
			||||||
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -803,6 +804,16 @@ static int ath11k_mac_txpower_recalc(str
 | 
				
			||||||
 | 
					 		ar->txpower_limit_5g = txpower;
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					+        if ((ar->hw->wiphy->bands[NL80211_BAND_6GHZ]) &&
 | 
				
			||||||
 | 
					+            ar->txpower_limit_6g != txpower) {
 | 
				
			||||||
 | 
					+                param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
 | 
				
			||||||
 | 
					+                ret = ath11k_wmi_pdev_set_param(ar, param,
 | 
				
			||||||
 | 
					+                                                txpower, ar->pdev->pdev_id);
 | 
				
			||||||
 | 
					+                if (ret)
 | 
				
			||||||
 | 
					+                        goto fail;
 | 
				
			||||||
 | 
					+                ar->txpower_limit_6g = txpower;
 | 
				
			||||||
 | 
					+        }
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					 	return 0;
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 fail:
 | 
				
			||||||
 | 
					@@ -3542,18 +3553,8 @@ static void ath11k_mac_op_bss_info_chang
 | 
				
			||||||
 | 
					 		ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev_id %i txpower %d\n",
 | 
				
			||||||
 | 
					 			   arvif->vdev_id, info->txpower);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					-		if (ar->supports_6ghz && info->chandef.chan &&
 | 
				
			||||||
 | 
					-		    info->chandef.chan->band == NL80211_BAND_6GHZ &&
 | 
				
			||||||
 | 
					-		    (arvif->vdev_type == WMI_VDEV_TYPE_STA ||
 | 
				
			||||||
 | 
					-		     arvif->vdev_type == WMI_VDEV_TYPE_AP) &&
 | 
				
			||||||
 | 
					-		    test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT,
 | 
				
			||||||
 | 
					-			     ar->ab->wmi_ab.svc_map)) {
 | 
				
			||||||
 | 
					-			ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
 | 
				
			||||||
 | 
					-				   "discard tx power, change to set TPC power\n");
 | 
				
			||||||
 | 
					-		} else {
 | 
				
			||||||
 | 
					-			arvif->txpower = info->txpower;
 | 
				
			||||||
 | 
					-			ath11k_mac_txpower_recalc(ar);
 | 
				
			||||||
 | 
					-		}
 | 
				
			||||||
 | 
					+		arvif->txpower = info->txpower;
 | 
				
			||||||
 | 
					+		ath11k_mac_txpower_recalc(ar);
 | 
				
			||||||
 | 
					 	}
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					 	if (changed & BSS_CHANGED_MCAST_RATE &&
 | 
				
			||||||
@@ -29,7 +29,6 @@ define Package/qca-diag/Description
 | 
				
			|||||||
  stack.
 | 
					  stack.
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
QCASSDK_CONFIG_OPTS+= TOOL_PATH=$(TOOLCHAIN_DIR)/bin/ \
 | 
					QCASSDK_CONFIG_OPTS+= TOOL_PATH=$(TOOLCHAIN_DIR)/bin/ \
 | 
				
			||||||
                SYS_PATH=$(LINUX_DIR) \
 | 
					                SYS_PATH=$(LINUX_DIR) \
 | 
				
			||||||
                TOOLPREFIX=$(TARGET_CROSS) \
 | 
					                TOOLPREFIX=$(TARGET_CROSS) \
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@ INCLUDE_DIR +=  include -I src
 | 
				
			|||||||
LIB	:= -lpthread -shared
 | 
					LIB	:= -lpthread -shared
 | 
				
			||||||
LDFLAGS +=  -Llib/ -ldiag -lpthread -pie
 | 
					LDFLAGS +=  -Llib/ -ldiag -lpthread -pie
 | 
				
			||||||
FLAGS = -fPIC -g -DUSE_MUSL
 | 
					FLAGS = -fPIC -g -DUSE_MUSL
 | 
				
			||||||
EXTRA_CFLAGS = $(TARGET_CFLAGS) $(TARGET_LDFLAGS) $(TARGET_CPPFLAGS) -fstack-protector-all -znow -zrelro -Werror -Wno-error=attributes
 | 
					EXTRA_CFLAGS = $(TARGET_CFLAGS) $(TARGET_LDFLAGS) $(TARGET_CPPFLAGS) -fstack-protector-all -znow -zrelro -Werror -Wno-error=address-of-packed-member -Wl,--allow-multiple-definition -Wno-error=attributes 
 | 
				
			||||||
sample_cliobj	:= dci_client/diag_dci_sample.c
 | 
					sample_cliobj	:= dci_client/diag_dci_sample.c
 | 
				
			||||||
klogobj		:= klog/diag_klog.c
 | 
					klogobj		:= klog/diag_klog.c
 | 
				
			||||||
mdobj		:= mdlog/diag_mdlog.c
 | 
					mdobj		:= mdlog/diag_mdlog.c
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -123,17 +123,23 @@ when       who     what, where, why
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define GUID_LEN 16
 | 
					#define GUID_LEN 16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef ANDROID
 | 
					#if defined (ANDROID) || defined (USE_ANDROID_LOGGING)
 | 
				
			||||||
	#define LOG_TAG "Diag_Lib"
 | 
						#define LOG_TAG "Diag_Lib"
 | 
				
			||||||
	#define DIAG_LOGE(...)  { \
 | 
						#define DIAG_LOGE(...)  { \
 | 
				
			||||||
		ALOGE(__VA_ARGS__); \
 | 
							ALOGE(__VA_ARGS__); \
 | 
				
			||||||
		if (!diag_disable_console) \
 | 
							if (!diag_disable_console) \
 | 
				
			||||||
			printf(__VA_ARGS__); \
 | 
								printf(__VA_ARGS__); \
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	#include <cutils/log.h>
 | 
						#define DIAG_LOGD(...)  { \
 | 
				
			||||||
 | 
							ALOGE(__VA_ARGS__); \
 | 
				
			||||||
 | 
							if (!diag_disable_console) \
 | 
				
			||||||
 | 
								printf(__VA_ARGS__); \
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						#include <log/log.h>
 | 
				
			||||||
    #include "common_log.h"
 | 
					    #include "common_log.h"
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	#define DIAG_LOGE(...) printf (__VA_ARGS__)
 | 
						#define DIAG_LOGE(...) printf (__VA_ARGS__)
 | 
				
			||||||
 | 
						#define DIAG_LOGD(...) printf (__VA_ARGS__)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#include <pthread.h>
 | 
					#include <pthread.h>
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
@@ -167,6 +173,12 @@ typedef enum {
 | 
				
			|||||||
	DB_PARSER_STATE_CLOSE,
 | 
						DB_PARSER_STATE_CLOSE,
 | 
				
			||||||
} qsr4_db_file_parser_state;
 | 
					} qsr4_db_file_parser_state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* enum to handle packet processing status */
 | 
				
			||||||
 | 
					enum pkt_status{
 | 
				
			||||||
 | 
						PKT_PROCESS_ONGOING,
 | 
				
			||||||
 | 
						PKT_PROCESS_DONE
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Structure to keep track of diag callback interface clients. Please note that
 | 
					 * Structure to keep track of diag callback interface clients. Please note that
 | 
				
			||||||
 * there can be only client communicating with an ASIC at a given time.
 | 
					 * there can be only client communicating with an ASIC at a given time.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -64,7 +64,7 @@ when       who    what, where, why
 | 
				
			|||||||
#define PID_DIR "/root/diag_logs"
 | 
					#define PID_DIR "/root/diag_logs"
 | 
				
			||||||
#define MAX_CHAN	4
 | 
					#define MAX_CHAN	4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static unsigned char read_buf[4096];
 | 
					static unsigned char read_buf[MAX_CHAN][4096];
 | 
				
			||||||
static char ip_addr_name[FILE_NAME_LEN] = "192.168.0.10";
 | 
					static char ip_addr_name[FILE_NAME_LEN] = "192.168.0.10";
 | 
				
			||||||
static char port_number_string[FILE_NAME_LEN] = "2500";
 | 
					static char port_number_string[FILE_NAME_LEN] = "2500";
 | 
				
			||||||
static int port_number = 2500;
 | 
					static int port_number = 2500;
 | 
				
			||||||
@@ -397,13 +397,22 @@ int open_connection(struct diag_socket *sock)
 | 
				
			|||||||
int read_socket(struct diag_socket *socket)
 | 
					int read_socket(struct diag_socket *socket)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int num_read;
 | 
						int num_read;
 | 
				
			||||||
 | 
						int status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					repeat:
 | 
				
			||||||
	/* Read from the socket */
 | 
						/* Read from the socket */
 | 
				
			||||||
	memset(read_buf, 0, 4096);
 | 
						memset(read_buf[socket->id], 0, 4096);
 | 
				
			||||||
	num_read = recv(socket->fd, (unsigned char *)read_buf, 4096, 0);
 | 
						num_read = recv(socket->fd, (unsigned char *)read_buf[socket->id], 4096, 0);
 | 
				
			||||||
	if (num_read > 0) {
 | 
						if (num_read > 0) {
 | 
				
			||||||
		/* Send the data read off of the socket to the kernel via the library */
 | 
							/*
 | 
				
			||||||
		diag_send_socket_data(socket->id, read_buf, num_read);
 | 
							 * Process socket data to make sure full command is received before send it
 | 
				
			||||||
 | 
							 * to the diag core via the library. If return value is not PKT_PROCESS_DONE
 | 
				
			||||||
 | 
							 * then this is the case of partial packet and wait for pending bytes to
 | 
				
			||||||
 | 
							 * get full diag command.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							status = diag_send_socket_data(socket->id, read_buf[socket->id], num_read);
 | 
				
			||||||
 | 
							if (status != PKT_PROCESS_DONE)
 | 
				
			||||||
 | 
								goto repeat;
 | 
				
			||||||
	} else if (num_read == -1) {
 | 
						} else if (num_read == -1) {
 | 
				
			||||||
		DIAG_LOGE("diag_socket_log: Read socket error: %s, errno: %d\n",
 | 
							DIAG_LOGE("diag_socket_log: Read socket error: %s, errno: %d\n",
 | 
				
			||||||
				strerror(errno), errno);
 | 
									strerror(errno), errno);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -89,6 +89,9 @@ when       who    what, where, why
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define MAX_CHANNELS 4
 | 
					#define MAX_CHANNELS 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_USER_PKT_SIZE		16384
 | 
				
			||||||
 | 
					#define USER_SPACE_DATA_TYPE_SIZE	4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DCI_HEADER_LENGTH	sizeof(int)
 | 
					#define DCI_HEADER_LENGTH	sizeof(int)
 | 
				
			||||||
#define DCI_LEN_FIELD_LENGTH	sizeof(int)
 | 
					#define DCI_LEN_FIELD_LENGTH	sizeof(int)
 | 
				
			||||||
#define DCI_EVENT_OFFSET	sizeof(uint16)
 | 
					#define DCI_EVENT_OFFSET	sizeof(uint16)
 | 
				
			||||||
@@ -134,6 +137,13 @@ when       who    what, where, why
 | 
				
			|||||||
	char dir_name[FILE_NAME_LEN];
 | 
						char dir_name[FILE_NAME_LEN];
 | 
				
			||||||
	char peripheral_name[FILE_NAME_LEN];
 | 
						char peripheral_name[FILE_NAME_LEN];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* enum defined to handle full/partial packet case */
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
						PKT_START,
 | 
				
			||||||
 | 
						PKT_HEADER,
 | 
				
			||||||
 | 
						PKT_PAYLOAD
 | 
				
			||||||
 | 
					} diag_pkt_states;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct diag_callback_tbl_t cb_clients[NUM_PROC];
 | 
					static struct diag_callback_tbl_t cb_clients[NUM_PROC];
 | 
				
			||||||
static int socket_inited = 0;
 | 
					static int socket_inited = 0;
 | 
				
			||||||
static int (*socket_cb_ptr)(void *socket_cb_data_ptr, int socket_id);
 | 
					static int (*socket_cb_ptr)(void *socket_cb_data_ptr, int socket_id);
 | 
				
			||||||
@@ -619,46 +629,246 @@ SIDE EFFECTS
 | 
				
			|||||||
===========================================================================*/
 | 
					===========================================================================*/
 | 
				
			||||||
int diag_send_socket_data(int id, unsigned char buf[], int num_bytes)
 | 
					int diag_send_socket_data(int id, unsigned char buf[], int num_bytes)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned char send_buf[4100];
 | 
						static unsigned char send_buf[MAX_CHANNELS][MAX_USER_PKT_SIZE];
 | 
				
			||||||
	unsigned char offset = 4;
 | 
						static unsigned char extra_header = USER_SPACE_DATA_TYPE_SIZE;
 | 
				
			||||||
	int i;
 | 
						static unsigned char tmp_header[DIAG_NON_HDLC_HEADER_SIZE];
 | 
				
			||||||
	int start = 0;
 | 
						static diag_pkt_states pkt_state = PKT_START;
 | 
				
			||||||
	int end = 0;
 | 
						static int hdlc_pkt_pending = FALSE;
 | 
				
			||||||
	int copy_bytes;
 | 
						static uint32_t total_pkt_size = 0;
 | 
				
			||||||
	int success;
 | 
						static uint32_t bytes_required = 0;
 | 
				
			||||||
 | 
						static int s_char = 0, e_char = 0;
 | 
				
			||||||
 | 
						static uint32_t pkt_start_off = 0;
 | 
				
			||||||
 | 
						static uint32_t saved_bytes = 0;
 | 
				
			||||||
 | 
						int status = PKT_PROCESS_DONE;
 | 
				
			||||||
 | 
						int packet_len_index = 0;
 | 
				
			||||||
 | 
						uint16_t packet_len = 0;
 | 
				
			||||||
 | 
						int i = 0, j = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((id >= 0) && (id < MAX_CHANNELS)) {
 | 
						if ((id < 0) || id >= MAX_CHANNELS) {
 | 
				
			||||||
		*(int *)send_buf = USER_SPACE_DATA_TYPE;
 | 
							DIAG_LOGE("diag_socket_log: %s: Error sending socket data. socket id: %d, num_bytes: %d\n",
 | 
				
			||||||
		if (socket_token[id] != 0 ) {
 | 
								__func__, id, num_bytes);
 | 
				
			||||||
			*(int *)(send_buf + offset) = socket_token[id];
 | 
							return PKT_PROCESS_DONE;
 | 
				
			||||||
			offset += 4;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < num_bytes; i++) {
 | 
						for (i = 0; i < num_bytes; i++) {
 | 
				
			||||||
			if (hdlc_disabled) {
 | 
							status = PKT_PROCESS_ONGOING;
 | 
				
			||||||
				if (buf[i] == CONTROL_CHAR && i == 0) {
 | 
							switch (pkt_state)
 | 
				
			||||||
					end = end + 1;
 | 
							{
 | 
				
			||||||
					continue;
 | 
							case PKT_START:
 | 
				
			||||||
 | 
								if (buf[i] == CONTROL_CHAR && !hdlc_pkt_pending) {
 | 
				
			||||||
 | 
									s_char = buf[i];
 | 
				
			||||||
 | 
									pkt_start_off = i;
 | 
				
			||||||
 | 
									/* probably it is non-HDLC packet */
 | 
				
			||||||
 | 
									if (num_bytes >= (pkt_start_off + DIAG_NON_HDLC_HEADER_SIZE)) {
 | 
				
			||||||
 | 
										/* received full header */
 | 
				
			||||||
 | 
										packet_len_index = pkt_start_off + 2;
 | 
				
			||||||
 | 
										packet_len = (uint16_t)(*(uint16_t *)(buf + packet_len_index));
 | 
				
			||||||
 | 
										total_pkt_size = DIAG_NON_HDLC_HEADER_SIZE + packet_len + 1;
 | 
				
			||||||
 | 
										if (total_pkt_size <= (num_bytes - pkt_start_off)) {
 | 
				
			||||||
 | 
											e_char = buf[total_pkt_size-1];
 | 
				
			||||||
 | 
											if (s_char == e_char) {
 | 
				
			||||||
 | 
												/* full non-HDLC packet received */
 | 
				
			||||||
 | 
												memset(send_buf[id], 0, MAX_USER_PKT_SIZE);
 | 
				
			||||||
 | 
												*(int *)send_buf[id] = USER_SPACE_DATA_TYPE;
 | 
				
			||||||
 | 
												if (socket_token[id] != 0) {
 | 
				
			||||||
 | 
													*(int *)(send_buf[id] + extra_header) = socket_token[id];
 | 
				
			||||||
 | 
													extra_header += sizeof(int);
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
 | 
												memcpy(send_buf[id] + extra_header, buf, total_pkt_size);
 | 
				
			||||||
 | 
												/* send it diag core */
 | 
				
			||||||
 | 
												diag_send_data(send_buf[id], total_pkt_size + extra_header);
 | 
				
			||||||
 | 
												i += total_pkt_size - 1;
 | 
				
			||||||
 | 
												s_char = 0;
 | 
				
			||||||
 | 
												e_char = 0;
 | 
				
			||||||
 | 
												total_pkt_size = 0;
 | 
				
			||||||
 | 
												extra_header = USER_SPACE_DATA_TYPE_SIZE;
 | 
				
			||||||
 | 
												status = PKT_PROCESS_DONE;
 | 
				
			||||||
						}
 | 
											}
 | 
				
			||||||
			if (buf[i] == CONTROL_CHAR) {
 | 
					 | 
				
			||||||
				copy_bytes = end-start+1;
 | 
					 | 
				
			||||||
				memcpy(send_buf+offset, buf+start, copy_bytes);
 | 
					 | 
				
			||||||
				diag_send_data(send_buf, copy_bytes+offset);
 | 
					 | 
				
			||||||
				start = i+1;
 | 
					 | 
				
			||||||
				end = i+1;
 | 
					 | 
				
			||||||
				continue;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			end = end+1;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		success = 1;
 | 
					 | 
				
			||||||
					} else {
 | 
										} else {
 | 
				
			||||||
		DIAG_LOGE("diag: In %s, Error sending socket data. Invalid socket id: %d\n",
 | 
											/* full header + partial packet received */
 | 
				
			||||||
			__func__, id);
 | 
											pkt_state = PKT_PAYLOAD;
 | 
				
			||||||
		success = 0;
 | 
											memset(send_buf[id], 0, MAX_USER_PKT_SIZE);
 | 
				
			||||||
 | 
											*(int *)send_buf[id] = USER_SPACE_DATA_TYPE;
 | 
				
			||||||
 | 
											if (socket_token[id] != 0) {
 | 
				
			||||||
 | 
												*(int *)(send_buf[id] + extra_header) = socket_token[id];
 | 
				
			||||||
 | 
												extra_header += sizeof(int);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											memcpy(send_buf[id] + extra_header, (buf + pkt_start_off), (num_bytes - pkt_start_off));
 | 
				
			||||||
 | 
											saved_bytes = (num_bytes - pkt_start_off + extra_header);
 | 
				
			||||||
 | 
											bytes_required = total_pkt_size - (saved_bytes - extra_header);
 | 
				
			||||||
 | 
											i += num_bytes - 1;
 | 
				
			||||||
 | 
											DIAG_LOGD("%s:PKT_START: full header + partial pkt received, total_pkt_size %d recvd %d pending %d\n",
 | 
				
			||||||
 | 
												__func__, total_pkt_size, (saved_bytes - extra_header), bytes_required);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										/* partial header received */
 | 
				
			||||||
 | 
										memcpy(tmp_header, (buf + pkt_start_off), (num_bytes - pkt_start_off));
 | 
				
			||||||
 | 
										saved_bytes = (num_bytes - pkt_start_off);
 | 
				
			||||||
 | 
										bytes_required = DIAG_NON_HDLC_HEADER_SIZE - saved_bytes;
 | 
				
			||||||
 | 
										i += num_bytes - 1;
 | 
				
			||||||
 | 
										pkt_state = PKT_HEADER;
 | 
				
			||||||
 | 
										DIAG_LOGD("%s:PKT_START: partial header received, recvd %d pending %d\n",
 | 
				
			||||||
 | 
											__func__, saved_bytes, bytes_required);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									/* HDLC packet will enter here */
 | 
				
			||||||
 | 
									if (!hdlc_pkt_pending) {
 | 
				
			||||||
 | 
										hdlc_pkt_pending = TRUE;
 | 
				
			||||||
 | 
										memset(send_buf[id], 0, MAX_USER_PKT_SIZE);
 | 
				
			||||||
 | 
										*(int *)send_buf[id] = USER_SPACE_DATA_TYPE;
 | 
				
			||||||
 | 
										if (socket_token[id] != 0) {
 | 
				
			||||||
 | 
											*(int *)(send_buf[id] + extra_header) = socket_token[id];
 | 
				
			||||||
 | 
											extra_header += sizeof(int);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										saved_bytes = extra_header;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									/* iterate through the packet to find the delimiter */
 | 
				
			||||||
 | 
									for (j = 0; j < num_bytes; j++) {
 | 
				
			||||||
 | 
										if (buf[j] == CONTROL_CHAR) {
 | 
				
			||||||
 | 
											if (j == (num_bytes - 1)) {
 | 
				
			||||||
 | 
												/* delimiter found at the end of current packet
 | 
				
			||||||
 | 
												 * probably this is end of HDLC packet
 | 
				
			||||||
 | 
												 */
 | 
				
			||||||
 | 
												if (saved_bytes + num_bytes >= MAX_USER_PKT_SIZE) {
 | 
				
			||||||
 | 
													DIAG_LOGE("%s:hdlc: command too large, dropping pkt\n", __func__);
 | 
				
			||||||
 | 
													hdlc_pkt_pending = FALSE;
 | 
				
			||||||
 | 
													saved_bytes = 0;
 | 
				
			||||||
 | 
													i += num_bytes - 1;
 | 
				
			||||||
 | 
													break;
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
												memcpy(send_buf[id] + saved_bytes, buf, num_bytes);
 | 
				
			||||||
 | 
												/* send it to diag core */
 | 
				
			||||||
 | 
												diag_send_data(send_buf[id], saved_bytes + num_bytes);
 | 
				
			||||||
 | 
												hdlc_pkt_pending = FALSE;
 | 
				
			||||||
 | 
												i += num_bytes - 1;
 | 
				
			||||||
 | 
												saved_bytes = 0;
 | 
				
			||||||
 | 
												extra_header = USER_SPACE_DATA_TYPE_SIZE;
 | 
				
			||||||
 | 
												status = PKT_PROCESS_DONE;
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												/* delimiter character may come at the middle of packet
 | 
				
			||||||
 | 
												 * just ignore as we cant handle this case
 | 
				
			||||||
 | 
												 */
 | 
				
			||||||
 | 
												DIAG_LOGD("%s:hdlc: Delimiter found at the middle index %d\n", __func__, j);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									/* full HDLC packet has not received */
 | 
				
			||||||
 | 
									if (hdlc_pkt_pending) {
 | 
				
			||||||
 | 
										if (saved_bytes + num_bytes >= MAX_USER_PKT_SIZE) {
 | 
				
			||||||
 | 
											DIAG_LOGE("%s:hdlc: command too large, dropping pkt\n", __func__);
 | 
				
			||||||
 | 
											hdlc_pkt_pending = FALSE;
 | 
				
			||||||
 | 
											saved_bytes = 0;
 | 
				
			||||||
 | 
											i += num_bytes - 1;
 | 
				
			||||||
 | 
											break;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										memcpy(send_buf[id] + saved_bytes, buf, num_bytes);
 | 
				
			||||||
 | 
										saved_bytes += num_bytes;
 | 
				
			||||||
 | 
										i += num_bytes - 1;
 | 
				
			||||||
 | 
										DIAG_LOGD("%s:hdlc: Partial Packet received, recvd %d\n", __func__,
 | 
				
			||||||
 | 
											(saved_bytes - extra_header));
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case PKT_HEADER:
 | 
				
			||||||
 | 
								if(num_bytes >= bytes_required){
 | 
				
			||||||
 | 
									/* we have full header now */
 | 
				
			||||||
 | 
									memcpy(tmp_header+saved_bytes, buf, bytes_required);
 | 
				
			||||||
 | 
									packet_len = (uint16_t)(*(uint16_t *)(tmp_header + 2));
 | 
				
			||||||
 | 
									total_pkt_size = DIAG_NON_HDLC_HEADER_SIZE + packet_len + 1;
 | 
				
			||||||
 | 
									if (total_pkt_size <= (num_bytes + saved_bytes)) {
 | 
				
			||||||
 | 
										/* might received full packet */
 | 
				
			||||||
 | 
										e_char = buf[total_pkt_size - saved_bytes - 1];
 | 
				
			||||||
 | 
										if (s_char == e_char) {
 | 
				
			||||||
 | 
											/* full non-HDLC packet received */
 | 
				
			||||||
 | 
											memset(send_buf[id], 0, MAX_USER_PKT_SIZE);
 | 
				
			||||||
 | 
											*(int *)send_buf[id] = USER_SPACE_DATA_TYPE;
 | 
				
			||||||
 | 
											if (socket_token[id] != 0) {
 | 
				
			||||||
 | 
												*(int *)(send_buf[id] + extra_header) = socket_token[id];
 | 
				
			||||||
 | 
												extra_header += sizeof(int);
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
											memcpy(send_buf[id] + extra_header, tmp_header, saved_bytes);
 | 
				
			||||||
 | 
											memcpy(send_buf[id] + extra_header + saved_bytes, buf,
 | 
				
			||||||
 | 
													total_pkt_size - saved_bytes);
 | 
				
			||||||
 | 
											/* send it to diag core */
 | 
				
			||||||
 | 
											diag_send_data(send_buf[id], total_pkt_size + extra_header);
 | 
				
			||||||
 | 
											i += total_pkt_size - saved_bytes - 1;
 | 
				
			||||||
 | 
											s_char = 0;
 | 
				
			||||||
 | 
											e_char = 0;
 | 
				
			||||||
 | 
											total_pkt_size = 0;
 | 
				
			||||||
 | 
											bytes_required = 0;
 | 
				
			||||||
 | 
											saved_bytes = 0;
 | 
				
			||||||
 | 
											extra_header = USER_SPACE_DATA_TYPE_SIZE;
 | 
				
			||||||
 | 
											pkt_state = PKT_START;
 | 
				
			||||||
 | 
											status = PKT_PROCESS_DONE;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										/* full header + partial packet received */
 | 
				
			||||||
 | 
										pkt_state = PKT_PAYLOAD;
 | 
				
			||||||
 | 
										memset(send_buf[id], 0, MAX_USER_PKT_SIZE);
 | 
				
			||||||
 | 
										*(int *)send_buf[id] = USER_SPACE_DATA_TYPE;
 | 
				
			||||||
 | 
										if (socket_token[id] != 0) {
 | 
				
			||||||
 | 
											*(int *)(send_buf[id] + extra_header) = socket_token[id];
 | 
				
			||||||
 | 
											extra_header += sizeof(int);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										/* copy partial header received */
 | 
				
			||||||
 | 
										memcpy(send_buf[id] + extra_header, tmp_header, saved_bytes);
 | 
				
			||||||
 | 
										memcpy(send_buf[id] + extra_header + saved_bytes, buf, num_bytes);
 | 
				
			||||||
 | 
										bytes_required = total_pkt_size - saved_bytes - num_bytes;
 | 
				
			||||||
 | 
										i += num_bytes - 1;
 | 
				
			||||||
 | 
										saved_bytes += num_bytes + extra_header;
 | 
				
			||||||
 | 
										DIAG_LOGD("%s:PKT_HEADER: full header + partial pkt received, total_pkt_size %d recvd %d pending %d\n",
 | 
				
			||||||
 | 
											__func__, total_pkt_size, (saved_bytes - extra_header), bytes_required);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									/* still full header not yet received */
 | 
				
			||||||
 | 
									memcpy(tmp_header + saved_bytes, buf, num_bytes);
 | 
				
			||||||
 | 
									saved_bytes += num_bytes;
 | 
				
			||||||
 | 
									bytes_required = DIAG_NON_HDLC_HEADER_SIZE - saved_bytes;
 | 
				
			||||||
 | 
									i += num_bytes - 1;
 | 
				
			||||||
 | 
									DIAG_LOGD("%s:PKT_HEADER: still partial header received, recvd %d pending %d\n",
 | 
				
			||||||
 | 
										__func__, saved_bytes, bytes_required);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case PKT_PAYLOAD:
 | 
				
			||||||
 | 
								if(num_bytes >= bytes_required){
 | 
				
			||||||
 | 
									/* received pending bytes */
 | 
				
			||||||
 | 
									e_char = buf[bytes_required - 1];
 | 
				
			||||||
 | 
									if (s_char == e_char) {
 | 
				
			||||||
 | 
										/* full non-HDLC packet received */
 | 
				
			||||||
 | 
										memcpy(send_buf[id] + saved_bytes, buf, bytes_required);
 | 
				
			||||||
 | 
										/* send it to diag core */
 | 
				
			||||||
 | 
										diag_send_data(send_buf[id], total_pkt_size + extra_header);
 | 
				
			||||||
 | 
										i += bytes_required - 1;
 | 
				
			||||||
 | 
										s_char = 0;
 | 
				
			||||||
 | 
										e_char = 0;
 | 
				
			||||||
 | 
										total_pkt_size = 0;
 | 
				
			||||||
 | 
										bytes_required = 0;
 | 
				
			||||||
 | 
										saved_bytes = 0;
 | 
				
			||||||
 | 
										extra_header = USER_SPACE_DATA_TYPE_SIZE;
 | 
				
			||||||
 | 
										pkt_state = PKT_START;
 | 
				
			||||||
 | 
										status = PKT_PROCESS_DONE;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									/* still not yet received the full packet */
 | 
				
			||||||
 | 
									memcpy(send_buf[id] + saved_bytes, buf, num_bytes);
 | 
				
			||||||
 | 
									bytes_required = total_pkt_size - (saved_bytes -
 | 
				
			||||||
 | 
													extra_header) - num_bytes;
 | 
				
			||||||
 | 
									i += num_bytes - 1;
 | 
				
			||||||
 | 
									saved_bytes += num_bytes;
 | 
				
			||||||
 | 
									DIAG_LOGD("%s:PKT_PAYLOAD: Still waiting for full packet,saved %d pending %d\n",
 | 
				
			||||||
 | 
												__func__, (saved_bytes - extra_header), bytes_required);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								DIAG_LOGD("%s:default: Unexpected packet state\n",
 | 
				
			||||||
 | 
											__func__);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return success;
 | 
						return status;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*==========================================================================
 | 
					/*==========================================================================
 | 
				
			||||||
@@ -2300,6 +2510,7 @@ int diag_read_mask_file(void)
 | 
				
			|||||||
		if (!found_cmd) {
 | 
							if (!found_cmd) {
 | 
				
			||||||
			DIAG_LOGE("Sorry, could not find valid commands in the mask file,"
 | 
								DIAG_LOGE("Sorry, could not find valid commands in the mask file,"
 | 
				
			||||||
					"please check the mask file again\n");
 | 
										"please check the mask file again\n");
 | 
				
			||||||
 | 
								fclose(read_mask_fp);
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
@@ -2321,6 +2532,7 @@ int diag_read_mask_file(void)
 | 
				
			|||||||
			if (mask_buf[count_mask_bytes] != CONTROL_CHAR && i == 0) {
 | 
								if (mask_buf[count_mask_bytes] != CONTROL_CHAR && i == 0) {
 | 
				
			||||||
				DIAG_LOGE("Sorry, the mask file doesn't adhere to framing definition,"
 | 
									DIAG_LOGE("Sorry, the mask file doesn't adhere to framing definition,"
 | 
				
			||||||
					"please check the mask file again\n");
 | 
										"please check the mask file again\n");
 | 
				
			||||||
 | 
									fclose(read_mask_fp);
 | 
				
			||||||
				return -1;
 | 
									return -1;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (count_mask_bytes > payload && mask_buf[count_mask_bytes] == CONTROL_CHAR && i != 0) {
 | 
								if (count_mask_bytes > payload && mask_buf[count_mask_bytes] == CONTROL_CHAR && i != 0) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -34,6 +34,14 @@ when       who     what, where, why
 | 
				
			|||||||
#define DIAG_MDLOG_PID_FILE_SZ  100
 | 
					#define DIAG_MDLOG_PID_FILE_SZ  100
 | 
				
			||||||
#define NUM_PROC 10
 | 
					#define NUM_PROC 10
 | 
				
			||||||
#define HDLC_DISABLE	1
 | 
					#define HDLC_DISABLE	1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Non-HDLC Header:
 | 
				
			||||||
 | 
					 * 1 byte - Control char
 | 
				
			||||||
 | 
					 * 1 byte - Version
 | 
				
			||||||
 | 
					 * 2 bytes - Packet length
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define DIAG_NON_HDLC_HEADER_SIZE       4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int diag_fd;
 | 
					extern int diag_fd;
 | 
				
			||||||
extern int fd_md[NUM_PROC];
 | 
					extern int fd_md[NUM_PROC];
 | 
				
			||||||
extern int gdwClientID;
 | 
					extern int gdwClientID;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -249,6 +249,8 @@ static int diag_qsr4_db_file_mem_init(qsr4_db_file_list** file_entry)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	if (entry->head == NULL)
 | 
						if (entry->head == NULL)
 | 
				
			||||||
		entry->head = file_block_offset;
 | 
							entry->head = file_block_offset;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							free(file_block_offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return TRUE;
 | 
						return TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,11 @@
 | 
				
			|||||||
include $(TOPDIR)/rules.mk
 | 
					include $(TOPDIR)/rules.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_NAME:=ath12k-firmware
 | 
					PKG_NAME:=ath12k-firmware
 | 
				
			||||||
 | 
					PKG_MIRROR_HASH:=a325f86b1d613f713d2e015abca4a9ff86c8448d4cd540fa022866da2c5aa042
 | 
				
			||||||
PKG_SOURCE_PROTO:=git
 | 
					PKG_SOURCE_PROTO:=git
 | 
				
			||||||
PKG_BRANCH:=main
 | 
					PKG_BRANCH:=main
 | 
				
			||||||
PKG_SOURCE_URL:=https://github.com/quic/upstream-wifi-fw.git
 | 
					PKG_SOURCE_URL:=https://github.com/quic/upstream-wifi-fw.git
 | 
				
			||||||
PKG_MIRROR_HASH:=ade4287ff2935ad1d54e5dabb8e6de28f648d0974fa76238fcc1616235e6773e
 | 
					PKG_SOURCE_VERSION:=e90d32aaa149800ea79760639cb5ac9ddcfc8281
 | 
				
			||||||
PKG_SOURCE_VERSION:=3417bb86645c5ff4c58258db7cc33e43260b4222
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
 | 
					PKG_MAINTAINER:=John Crispin <john@phrozen.org>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -18,20 +18,59 @@ define Package/ath12k-firmware-default
 | 
				
			|||||||
  DEPENDS:=
 | 
					  DEPENDS:=
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/ath12k-firmware-qcn92xx-split-phy
 | 
				
			||||||
 | 
					  $(Package/ath12k-firmware-default)
 | 
				
			||||||
 | 
					  TITLE:=ath12k firmware for qcn92xx split phy devices
 | 
				
			||||||
 | 
					  DEPENDS:=@(TARGET_ipq95xx||TARGET_ipq53xx)
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/ath12k-firmware-qcn92xx
 | 
					define Package/ath12k-firmware-qcn92xx
 | 
				
			||||||
  $(Package/ath12k-firmware-default)
 | 
					  $(Package/ath12k-firmware-default)
 | 
				
			||||||
  TITLE:=ath12k firmware for qcn92xx devices
 | 
					  TITLE:=ath12k firmware for qcn92xx devices
 | 
				
			||||||
  DEPENDS:=@TARGET_ipq95xx
 | 
					  DEPENDS:=@(TARGET_ipq95xx||TARGET_ipq53xx)
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/ath12k-firmware-ipq53xx
 | 
				
			||||||
 | 
					  $(Package/ath12k-firmware-default)
 | 
				
			||||||
 | 
					  TITLE:=ath12k firmware for ipq53xx devices
 | 
				
			||||||
 | 
					  DEPENDS:=@TARGET_ipq53xx
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/ath12k-firmware-ipq53xx-wk-wk
 | 
				
			||||||
 | 
					  $(Package/ath12k-firmware-default)
 | 
				
			||||||
 | 
					  TITLE:=ath12k firmware for ipq53xx + wk + wk devices
 | 
				
			||||||
 | 
					  DEPENDS:=@TARGET_ipq53xx
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Build/Compile
 | 
					define Build/Compile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/ath12k-firmware-qcn92xx-split-phy/install
 | 
				
			||||||
 | 
						$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0
 | 
				
			||||||
 | 
						$(CP) $(PKG_BUILD_DIR)/ath12k-firmware/QCN9274/hw2.0_split_phy/1.2.1/WLAN.WBE.1.2.1-00148-QCAHKSWPL_SILICONZ-1/* \
 | 
				
			||||||
 | 
							$(1)/lib/firmware/ath12k/QCN92XX/hw1.0
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define Package/ath12k-firmware-qcn92xx/install
 | 
					define Package/ath12k-firmware-qcn92xx/install
 | 
				
			||||||
	$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw2.0
 | 
						$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0
 | 
				
			||||||
	$(INSTALL_DATA) $(PKG_BUILD_DIR)/ath12k-firmware/QCN9274/hw2.0/1.1.1/WLAN.WBE.1.1.1-00126-QCAHKSWPL_SILICONZ-1/* \
 | 
						$(CP) $(PKG_BUILD_DIR)/ath12k-firmware/QCN9274/hw2.0/1.2.1/WLAN.WBE.1.2.1-00201-QCAHKSWPL_SILICONZ-1/* \
 | 
				
			||||||
		$(1)/lib/firmware/ath12k/QCN92XX/hw2.0
 | 
							$(1)/lib/firmware/ath12k/QCN92XX/hw1.0
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/ath12k-firmware-ipq53xx/install
 | 
				
			||||||
 | 
						$(INSTALL_DIR) $(1)/lib/firmware/IPQ5332/
 | 
				
			||||||
 | 
						$(CP) $(PKG_BUILD_DIR)/ath12k-firmware//IPQ5322/hw1.0/1.2.1/WLAN.WBE.1.2.1-00201-QCAHKSWPL_SILICONZ-1/* \
 | 
				
			||||||
 | 
							$(1)/lib/firmware/IPQ5332/
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/ath12k-firmware-ipq53xx-wk-wk/install
 | 
				
			||||||
 | 
						$(INSTALL_DIR) $(1)/lib/firmware/IPQ5332/
 | 
				
			||||||
 | 
						$(CP) $(PKG_BUILD_DIR)/ath12k-firmware/IPQ5322_QCN6432_QCN6432/hw1.0/testing/1.3/WLAN.WBE.1.3-02907-QCAHKSWPL_SILICONZ-1/* \
 | 
				
			||||||
 | 
							$(1)/lib/firmware/IPQ5332/
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(eval $(call BuildPackage,ath12k-firmware-qcn92xx))
 | 
					$(eval $(call BuildPackage,ath12k-firmware-qcn92xx))
 | 
				
			||||||
 | 
					$(eval $(call BuildPackage,ath12k-firmware-qcn92xx-split-phy))
 | 
				
			||||||
 | 
					$(eval $(call BuildPackage,ath12k-firmware-ipq53xx))
 | 
				
			||||||
 | 
					$(eval $(call BuildPackage,ath12k-firmware-ipq53xx-wk-wk))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,7 @@ define Package/ath12k-wifi-default
 | 
				
			|||||||
  SUBMENU:=ath12k Board-Specific Overrides
 | 
					  SUBMENU:=ath12k Board-Specific Overrides
 | 
				
			||||||
  SECTION:=firmware
 | 
					  SECTION:=firmware
 | 
				
			||||||
  CATEGORY:=Firmware
 | 
					  CATEGORY:=Firmware
 | 
				
			||||||
  DEPENDS:=@TARGET_qcn9274
 | 
					  DEPENDS:=@(TARGET_qcn9274||TARGET_ipq53xx)
 | 
				
			||||||
  TITLE:=Custom Board
 | 
					  TITLE:=Custom Board
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -33,4 +33,32 @@ define Package/ath12k-wifi-qcom-qcn9274/install
 | 
				
			|||||||
	$(INSTALL_DATA) ./board-2.bin.QCN9274 $(1)/lib/firmware/ath12k/QCN9274/hw1.0/board-2.bin
 | 
						$(INSTALL_DATA) ./board-2.bin.QCN9274 $(1)/lib/firmware/ath12k/QCN9274/hw1.0/board-2.bin
 | 
				
			||||||
endef
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/ath12k-wifi-cig-wf189
 | 
				
			||||||
 | 
					$(call Package/ath12k-wifi-default)
 | 
				
			||||||
 | 
					    TITLE:=board.bin for CIG WF189
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/ath12k-wifi-sercomm-ap72tip
 | 
				
			||||||
 | 
					$(call Package/ath12k-wifi-default)
 | 
				
			||||||
 | 
					    TITLE:=board.bin for Sercomm WIFI-7
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/ath12k-wifi-cig-wf189/install
 | 
				
			||||||
 | 
						$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0
 | 
				
			||||||
 | 
						$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/
 | 
				
			||||||
 | 
						$(INSTALL_DATA) ./board-cig-wf189.bin.qcn9224 $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/board.bin
 | 
				
			||||||
 | 
						$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
 | 
				
			||||||
 | 
						$(INSTALL_DATA) ./board-cig-wf189.bin.ipq53xx $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board.bin
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/ath12k-wifi-sercomm-ap72tip/install
 | 
				
			||||||
 | 
						$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0
 | 
				
			||||||
 | 
						$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/
 | 
				
			||||||
 | 
						$(INSTALL_DATA) ./board-sercomm-ap72tip.bin.qcn9224 $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/board.bin
 | 
				
			||||||
 | 
						$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
 | 
				
			||||||
 | 
						$(INSTALL_DATA) ./board-sercomm-ap72tip.bin.ipq53xx $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board.bin
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$(eval $(call BuildPackage,ath12k-wifi-qcom-qcn9274))
 | 
					$(eval $(call BuildPackage,ath12k-wifi-qcom-qcn9274))
 | 
				
			||||||
 | 
					$(eval $(call BuildPackage,ath12k-wifi-cig-wf189))
 | 
				
			||||||
 | 
					$(eval $(call BuildPackage,ath12k-wifi-sercomm-ap72tip))
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										
											BIN
										
									
								
								feeds/ipq95xx/ath12k-wifi/board-cig-wf189.bin.ipq53xx
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								feeds/ipq95xx/ath12k-wifi/board-cig-wf189.bin.ipq53xx
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								feeds/ipq95xx/ath12k-wifi/board-cig-wf189.bin.qcn9224
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								feeds/ipq95xx/ath12k-wifi/board-cig-wf189.bin.qcn9224
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								feeds/ipq95xx/ath12k-wifi/board-sercomm-ap72tip.bin.ipq53xx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								feeds/ipq95xx/ath12k-wifi/board-sercomm-ap72tip.bin.ipq53xx
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								feeds/ipq95xx/ath12k-wifi/board-sercomm-ap72tip.bin.qcn9224
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								feeds/ipq95xx/ath12k-wifi/board-sercomm-ap72tip.bin.qcn9224
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								feeds/ipq95xx/ath12k-wifi/regdb.bin
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								feeds/ipq95xx/ath12k-wifi/regdb.bin
									
									
									
									
									
										Executable file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										82
									
								
								feeds/ipq95xx/ftm/Makefile
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										82
									
								
								feeds/ipq95xx/ftm/Makefile
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,82 @@
 | 
				
			|||||||
 | 
					include $(TOPDIR)/rules.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PKG:=ftm
 | 
				
			||||||
 | 
					PKG_NAME:=$(PKG)
 | 
				
			||||||
 | 
					PKG_RELEASE:=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCAL_SRC:=$(TOPDIR)/qca/src/common-tools/ftm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PKG_VERSION:=12.3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(INCLUDE_DIR)/package.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/$(PKG_NAME)
 | 
				
			||||||
 | 
					  SECTION:=QCA
 | 
				
			||||||
 | 
					  CATEGORY:=QTI software
 | 
				
			||||||
 | 
					  URL:=http://www.qca.qualcomm.com
 | 
				
			||||||
 | 
					  MAINTAINER:=Qualcomm Atheros
 | 
				
			||||||
 | 
					  TITLE:= QCA ftm utils
 | 
				
			||||||
 | 
					  DEPENDS:= @TARGET_ipq_ipq807x||TARGET_ipq_ipq807x_64||TARGET_ipq_ipq60xx||TARGET_ipq_ipq60xx_64||TARGET_ipq_ipq50xx||TARGET_ipq_ipq50xx_64||TARGET_ipq807x||TARGET_ipq50xx||TARGET_ipq60xx||TARGET_ipq95xx||TARGET_ipq53xx +libnl +libtcmd +qca-diag +librt +kmod-diag-char
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/$(PKG_NAME)/description/Default
 | 
				
			||||||
 | 
						FTM Package Support for QCA WIFI 11 drivers
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TARGET_CFLAGS += -DCONFIG_FTM_WLAN -DDEBUG -DFTM_DEBUG -DWIN_AP_HOST
 | 
				
			||||||
 | 
					TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/qca-diag
 | 
				
			||||||
 | 
					TARGET_CFLAGS += -MMD -O2 -Wall -g
 | 
				
			||||||
 | 
					TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include
 | 
				
			||||||
 | 
					TARGET_CFLAGS += -fpie
 | 
				
			||||||
 | 
					TARGET_LDFLAGS += -ldiag -lnl-3 -lnl-genl-3 -lrt -ltcmd
 | 
				
			||||||
 | 
					TARGET_CSRCS := ftm_main.c ftm_wlan.c ftm_write_to_flash.c
 | 
				
			||||||
 | 
					TARGET_LDFLAGS += -pie
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(CONFIG_FEATURE_IPQ_PROVISION_SUPPORT),y)
 | 
				
			||||||
 | 
					        TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/qti-mfg-provision
 | 
				
			||||||
 | 
					        TARGET_CFLAGS += -DWIN_AP_AFC
 | 
				
			||||||
 | 
					        TARGET_LDFLAGS += -lprovision
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifneq ($(CONFIG_PACKAGE_kmod-mac80211),)
 | 
				
			||||||
 | 
					        TARGET_CFLAGS+=-DWIN_AP_HOST_OPEN=1
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(CONFIG_FEATURE_QCA_IOT),y)
 | 
				
			||||||
 | 
					TARGET_CFLAGS += -DIPQ_AP_HOST_IOT -DIPQ_AP_HOST_IOT_QCA402X -ggdb3 -DCONFIG_DAEMON_MODE
 | 
				
			||||||
 | 
					TARGET_CSRCS += ftm_iot.c
 | 
				
			||||||
 | 
					TARGET_LDFLAGS += -lpthread
 | 
				
			||||||
 | 
					TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/qca-iot
 | 
				
			||||||
 | 
					TARGET_LDFLAGS += -ldiag_demo
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(CONFIG_FEATURE_IPQ_IOT_SUPPORT),y)
 | 
				
			||||||
 | 
					TARGET_CFLAGS += -DIPQ_AP_HOST_IOT -DIPQ_AP_HOST_IOT_IPQ -ggdb3 -I$(STAGING_DIR)/usr/include/btdaemon
 | 
				
			||||||
 | 
					TARGET_CSRCS += ftm_iot.c
 | 
				
			||||||
 | 
					TARGET_LDFLAGS += -lpthread -lbtdaemon
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Build/Compile
 | 
				
			||||||
 | 
					$(MAKE) -C $(PKG_BUILD_DIR) \
 | 
				
			||||||
 | 
						CC="$(TARGET_CC)" \
 | 
				
			||||||
 | 
						CFLAGS="$(TARGET_CFLAGS)" \
 | 
				
			||||||
 | 
						LDFLAGS="$(TARGET_LDFLAGS)" \
 | 
				
			||||||
 | 
						CSRCS="$(TARGET_CSRCS)"
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					define Package/$(PKG_NAME)/install
 | 
				
			||||||
 | 
						$(INSTALL_DIR) $(1)/usr/sbin
 | 
				
			||||||
 | 
						$(INSTALL_DIR) $(1)/etc/init.d
 | 
				
			||||||
 | 
						$(INSTALL_BIN) $(PKG_BUILD_DIR)/ftm $(1)/usr/sbin/
 | 
				
			||||||
 | 
						$(INSTALL_BIN) ./files/ftm.init $(1)/etc/init.d/ftm
 | 
				
			||||||
 | 
						$(INSTALL_DIR) $(1)/lib/wifi
 | 
				
			||||||
 | 
						$(INSTALL_BIN) ./files/compress_vart.sh $(1)/lib/compress_vart.sh
 | 
				
			||||||
 | 
					ifneq (, $(findstring ipq95xx, $(CONFIG_TARGET_BOARD)))
 | 
				
			||||||
 | 
						$(INSTALL_DIR) $(1)/sbin
 | 
				
			||||||
 | 
						$(INSTALL_BIN) ./files/ftm_qcc710_start.sh $(1)/sbin/ftm_qcc710_start
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					endef
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$(eval $(call BuildPackage,ftm))
 | 
				
			||||||
							
								
								
									
										75
									
								
								feeds/ipq95xx/ftm/files/compress_vart.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										75
									
								
								feeds/ipq95xx/ftm/files/compress_vart.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,75 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright (c) 2020 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#  All Rights Reserved.
 | 
				
			||||||
 | 
					# Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ -e /lib/functions.sh ] && . /lib/functions.sh
 | 
				
			||||||
 | 
					[ -e /lib/ipq806x.sh ] && . /lib/ipq806x.sh
 | 
				
			||||||
 | 
					[ -e /lib/functions/boot.sh ] && . /lib/functions/boot.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					low_mem_compress_art()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local mtdblock=$(find_mtd_part 0:ART)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -z "$mtdblock" ]; then
 | 
				
			||||||
 | 
						    # read from mmc
 | 
				
			||||||
 | 
						    mtdblock=$(find_mmc_part 0:ART)
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ -n "$mtdblock" ] || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        local apmp="/tmp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        lzma -zvfk -4 ${apmp}/virtual_art.bin 2> /dev/null || {
 | 
				
			||||||
 | 
					                echo "Error Compressing Virtual ART" > /dev/console
 | 
				
			||||||
 | 
					                return
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dd if=${apmp}/virtual_art.bin.lzma of=${mtdblock}
 | 
				
			||||||
 | 
					        echo "Success compressing Virtual ART(${mtdblock})" > /dev/console
 | 
				
			||||||
 | 
					        return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					normal_art()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local mtdblock=$(find_mtd_part 0:ART)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -z "$mtdblock" ]; then
 | 
				
			||||||
 | 
						    # read from mmc
 | 
				
			||||||
 | 
						    mtdblock=$(find_mmc_part 0:ART)
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ -n "$mtdblock" ] || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local apmp="/tmp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dd if=${apmp}/virtual_art.bin of=${mtdblock}
 | 
				
			||||||
 | 
						echo "Success writing to ART(${mtdblock})" > /dev/console
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					write_caldata()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						local board
 | 
				
			||||||
 | 
						[ -f /tmp/sysinfo/board_name ] && {
 | 
				
			||||||
 | 
							board=ap$(cat /tmp/sysinfo/board_name | awk -F 'ap' '{print$2}')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -e /sys/firmware/devicetree/base/compressed_art ]
 | 
				
			||||||
 | 
						then
 | 
				
			||||||
 | 
							echo "Compressed ART Supported Platform $board " > /dev/console
 | 
				
			||||||
 | 
							low_mem_compress_art
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							echo "Non Compressed ART Platform $board " > /dev/console
 | 
				
			||||||
 | 
							normal_art
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ "$1" = "write_caldata" ]
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					        write_caldata
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
							
								
								
									
										99
									
								
								feeds/ipq95xx/ftm/files/ftm.init
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										99
									
								
								feeds/ipq95xx/ftm/files/ftm.init
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,99 @@
 | 
				
			|||||||
 | 
					#!/bin/sh /etc/rc.common
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright (c) 2013, 2017, 2020 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# All Rights Reserved.
 | 
				
			||||||
 | 
					# Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# 2013 Qualcomm Atheros, Inc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Atheros Confidential and Proprietary
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ -e /lib/functions.sh ] && . /lib/functions.sh
 | 
				
			||||||
 | 
					[ -e /lib/ipq806x.sh ] && . /lib/ipq806x.sh
 | 
				
			||||||
 | 
					[ -e /lib/functions/boot.sh ] && . /lib/functions/boot.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					START=97
 | 
				
			||||||
 | 
					SERVICE_DAEMONIZE=1
 | 
				
			||||||
 | 
					SERVICE_WRITE_PID=1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MTD_ART_PART_NAME="art"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					compressed_art_read() {
 | 
				
			||||||
 | 
						local mtdblock=$(find_mtd_part 0:ART)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -z "$mtdblock" ]; then
 | 
				
			||||||
 | 
							#read from mmc
 | 
				
			||||||
 | 
							mtdblock=$(find_mmc_part 0:ART)
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ -n "$mtdblock" ] || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local apmp="/tmp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dd if=${mtdblock} of=${apmp}/virtual_art.bin.lzma
 | 
				
			||||||
 | 
						lzma -fdv --single-stream ${apmp}/virtual_art.bin.lzma || {
 | 
				
			||||||
 | 
						# Create dummy virtual_art.bin file of size 512K
 | 
				
			||||||
 | 
						dd if=/dev/zero of=${apmp}/virtual_art.bin bs=1024 count=512
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						echo "Uncompressed and Copied ART content from ${mtdblock} to /tmp/virtual_art.bin" > /dev/console
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					raw_art_read() {
 | 
				
			||||||
 | 
						local mtdblock=$(find_mtd_part 0:ART)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -z "$mtdblock" ]; then
 | 
				
			||||||
 | 
							#read from mmc
 | 
				
			||||||
 | 
							mtdblock=$(find_mmc_part 0:ART)
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ -n "$mtdblock" ] || return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local apmp="/tmp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dd if=${mtdblock} of=${apmp}/virtual_art.bin
 | 
				
			||||||
 | 
						echo "Copy ART caldata from ${mtdblock} to /tmp/virtual_art.bin" > /dev/console
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					retrieve_caldata() {
 | 
				
			||||||
 | 
						local board
 | 
				
			||||||
 | 
						[ -f /tmp/sysinfo/board_name ] && {
 | 
				
			||||||
 | 
							board=ap$(cat /tmp/sysinfo/board_name | awk -F 'ap' '{print$2}')
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						echo "**** Platform Name: $board *****" > /dev/console
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -e /sys/firmware/devicetree/base/compressed_art ]
 | 
				
			||||||
 | 
						then
 | 
				
			||||||
 | 
							compressed_art_read
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							raw_art_read
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					start() {
 | 
				
			||||||
 | 
						local emmc_flash=""
 | 
				
			||||||
 | 
						local nor_flash=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						emmc_flash=$(find_mmc_part 0:ART 2> /dev/null)
 | 
				
			||||||
 | 
						mtd_name=$(grep -i -w ${MTD_ART_PART_NAME} /proc/mtd | cut -f1 -d:)
 | 
				
			||||||
 | 
						nor_flash=`find /sys/bus/spi/devices/*/mtd -name ${mtd_name} 2> /dev/null`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ -n "$emmc_flash" ]; then
 | 
				
			||||||
 | 
							[ -L /dev/caldata ] || \
 | 
				
			||||||
 | 
								ln -s $emmc_flash /dev/caldata
 | 
				
			||||||
 | 
						elif [ -n "$nor_flash" ]; then
 | 
				
			||||||
 | 
							[ -L /dev/caldata ] || \
 | 
				
			||||||
 | 
								ln -s /dev/${mtd_name//mtd/mtdblock} /dev/caldata
 | 
				
			||||||
 | 
						elif [ -n "$mtd_name" ]; then
 | 
				
			||||||
 | 
							[ -L /dev/caldata ] || \
 | 
				
			||||||
 | 
								ln -s /dev/${mtd_name//mtd/mtdblock} /dev/caldata
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						retrieve_caldata
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stop() {
 | 
				
			||||||
 | 
						[ -L /dev/caldata ] && rm /dev/caldata
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										86
									
								
								feeds/ipq95xx/ftm/files/ftm_qcc710_start.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										86
									
								
								feeds/ipq95xx/ftm/files/ftm_qcc710_start.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,86 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright (c) 2021 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# All Rights Reserved.
 | 
				
			||||||
 | 
					# Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# QCC710 v1.0 reset for BT bringup
 | 
				
			||||||
 | 
					qcc710_reset() {
 | 
				
			||||||
 | 
						reset_gpio_pin=$(cat /proc/device-tree/soc/pinctrl@1000000/QCC710_pins/QCC710_reset/pins | sed s/"gpio"//)
 | 
				
			||||||
 | 
						[[ -z $reset_gpio_pin ]] && return
 | 
				
			||||||
 | 
						gpio_base=$(cat /sys/class/gpio/gpiochip*/base | head -n1)
 | 
				
			||||||
 | 
						gpio_reset=$(( gpio_base + reset_gpio_pin ))
 | 
				
			||||||
 | 
						if [[ ! -e /sys/class/gpio/gpio$gpio_reset ]]; then
 | 
				
			||||||
 | 
							[ -z ${SLEEP} ] && echo -e "Enter sleep value for reset. Options:\n10 \n1" && read -p "Enter : "  SLEEP
 | 
				
			||||||
 | 
							[ -z ${SLEEP} ] && SLEEP=10
 | 
				
			||||||
 | 
							echo $gpio_reset > /sys/class/gpio/export
 | 
				
			||||||
 | 
							echo out > /sys/class/gpio/gpio$gpio_reset/direction
 | 
				
			||||||
 | 
							echo "Performing QCC710 reset ...." > /dev/console
 | 
				
			||||||
 | 
							{ echo 1 > /sys/class/gpio/gpio$gpio_reset/value ; \
 | 
				
			||||||
 | 
								sleep $SLEEP; \
 | 
				
			||||||
 | 
								echo 0 > /sys/class/gpio/gpio$gpio_reset/value; \
 | 
				
			||||||
 | 
								echo "QCC710 reset complete ...." > /dev/console; }
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while [ -n "$1" ]; do
 | 
				
			||||||
 | 
						case "$1" in
 | 
				
			||||||
 | 
							-h|--help) HELP=1; break;;
 | 
				
			||||||
 | 
							-a|--ipaddr) SERVERIP="$2";shift;;
 | 
				
			||||||
 | 
							-s|--sleep) SLEEP="$2";shift;;
 | 
				
			||||||
 | 
							-r|--baud-rate) BAUDRATE="$2";shift;;
 | 
				
			||||||
 | 
							-*)
 | 
				
			||||||
 | 
								echo "Invalid option: $1"
 | 
				
			||||||
 | 
								ERROR=1;
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
 | 
							*)break;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
						shift
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					[ -n "$HELP" -o -n "$ERROR" ] && {
 | 
				
			||||||
 | 
						        cat <<EOF
 | 
				
			||||||
 | 
					Usage: $0 [-h] [-a SERVERIP] [-r baud-rate] [-s sleep]
 | 
				
			||||||
 | 
					ftm_qcc710_start options:
 | 
				
			||||||
 | 
						-h	print this help
 | 
				
			||||||
 | 
						-a	ipaddr of the server for diag connection
 | 
				
			||||||
 | 
						-r	baudrate
 | 
				
			||||||
 | 
						-s	sleep
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Example:
 | 
				
			||||||
 | 
					ftm_qcc710_start -a <serverip> -r <baud-rate> -s <sleep>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					version 1 : ./sbin/ftm_qcc710_start -a 192.168.1.121 -r 2000000 -s 10
 | 
				
			||||||
 | 
					version 2 : ./sbin/ftm_qcc710_start -a 192.168.1.121 -r 115200 -s 1
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
						# If we requested the help flag, then exit normally.
 | 
				
			||||||
 | 
						# Else, it's probably an error so report it as such.
 | 
				
			||||||
 | 
						[ -n "$HELP" ] && exit 0
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[ -z ${SERVERIP} ] && SERVERIP=$(grep -oh "serverip.*#"  /proc/cmdline  | awk -F '#' '{print $2}')
 | 
				
			||||||
 | 
					[ -z ${SERVERIP} ] && read -p "No serverip in cmdline, please enter the serverip : "  SERVERIP
 | 
				
			||||||
 | 
					[ -z ${BAUDRATE} ] && echo -e "Enter baudrate for stack bringup. Options:\n2000000\n115200" && read -p "Enter : "  BAUDRATE
 | 
				
			||||||
 | 
					[ -z ${BAUDRATE} ] && BAUDRATE=2000000
 | 
				
			||||||
 | 
					qcc710_reset
 | 
				
			||||||
 | 
					DIAG_PID=$(ps | grep diag_socket_app | grep -v grep | awk '{print $1}')
 | 
				
			||||||
 | 
					while [ -n "$DIAG_PID" ]
 | 
				
			||||||
 | 
					do
 | 
				
			||||||
 | 
					    kill -s SIGTERM $DIAG_PID
 | 
				
			||||||
 | 
					    DIAG_PID=$(ps | grep diag_socket_app | grep -v grep | awk '{print $1}')
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					echo "Stopped previous instances of diag_socket_app process"
 | 
				
			||||||
 | 
					[ -z "$DIAG_PID" ] && /usr/sbin/diag_socket_app -a $SERVERIP -p 2500 &
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FTM_PID=$(ps | grep "ftm " | grep -v grep | awk '{print $1}')
 | 
				
			||||||
 | 
					while [ -n "$FTM_PID" ]
 | 
				
			||||||
 | 
					do
 | 
				
			||||||
 | 
					    kill -s SIGTERM $FTM_PID
 | 
				
			||||||
 | 
					    FTM_PID=$(ps | grep "ftm " | grep -v grep | awk '{print $1}')
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					echo "Stopped previous instances ftm process"
 | 
				
			||||||
 | 
					[ -z "$FTM_PID" ] && /usr/sbin/ftm -n -dd -r $BAUDRATE
 | 
				
			||||||
							
								
								
									
										133
									
								
								feeds/ipq95xx/ftm/src/Android.mk
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										133
									
								
								feeds/ipq95xx/ftm/src/Android.mk
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,133 @@
 | 
				
			|||||||
 | 
					ifeq ($(call is-vendor-board-platform,QCOM),true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Build only if board has BT/FM/WLAN
 | 
				
			||||||
 | 
					ifeq ($(findstring true, $(BOARD_HAVE_QCOM_FM) $(BOARD_HAVE_BLUETOOTH) $(BOARD_HAS_ATH_WLAN_AR6320)),true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCAL_PATH:= $(call my-dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					BDROID_DIR:= system/bt
 | 
				
			||||||
 | 
					ifeq ($(TARGET_SUPPORTS_WEARABLES),true)
 | 
				
			||||||
 | 
					QTI_DIR  := hardware/qcom/bt/msm8909/libbt-vendor
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					QTI_DIR  := hardware/qcom/bt/libbt-vendor
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(CLEAR_VARS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES := $(TARGET_OUT_HEADERS)/diag/include \
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES += vendor/qcom/proprietary/diag/src \
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/common/inc \
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES += vendor/qcom/proprietary/bt/hci_qcomm_init \
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES += vendor/qcom/opensource/fm/helium \
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include \
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES += $(BDROID_DIR)/hci/include \
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES += $(QTI_DIR)/include
 | 
				
			||||||
 | 
					ifeq ($(TARGET_SUPPORTS_WEARABLES),true)
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES += device/qcom/msm8909w/opensource/bluetooth/tools/hidl_client/inc
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES += vendor/qcom/opensource/bluetooth/tools/hidl_client/inc
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCAL_CFLAGS:= \
 | 
				
			||||||
 | 
					              -DANDROID \
 | 
				
			||||||
 | 
					              -DDEBUG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#LOCAL_CFLAGS += -include bionic/libc/include/sys/socket.h
 | 
				
			||||||
 | 
					#LOCAL_CFLAGS += -include bionic/libc/include/netinet/in.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifneq ($(DISABLE_BT_FTM),true)
 | 
				
			||||||
 | 
					LOCAL_CFLAGS +=  -DCONFIG_FTM_BT
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(BOARD_HAVE_QCOM_FM),true)
 | 
				
			||||||
 | 
					LOCAL_CFLAGS +=  -DCONFIG_FTM_FM
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(BOARD_HAS_QCA_FM_SOC), "cherokee")
 | 
				
			||||||
 | 
					LOCAL_CFLAGS += -DFM_SOC_TYPE_CHEROKEE
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifneq ($(BOARD_ANT_WIRELESS_DEVICE), )
 | 
				
			||||||
 | 
					LOCAL_CFLAGS +=  -DCONFIG_FTM_ANT
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					LOCAL_CFLAGS +=  -DCONFIG_FTM_NFC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(BOARD_HAVE_BLUETOOTH_BLUEZ), true)
 | 
				
			||||||
 | 
					    LOCAL_CFLAGS += -DHAS_BLUEZ_BUILDCFG
 | 
				
			||||||
 | 
					endif # BOARD_HAVE_BLUETOOTH_BLUEZ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCAL_SRC_FILES:= \
 | 
				
			||||||
 | 
					    ftm_main.c \
 | 
				
			||||||
 | 
					    ftm_nfc.c \
 | 
				
			||||||
 | 
					    ftm_nfcnq.c \
 | 
				
			||||||
 | 
					    ftm_nfcqti.c \
 | 
				
			||||||
 | 
					    ftm_nfcnq_fwdl.c \
 | 
				
			||||||
 | 
					    ftm_nfcnq_test.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifneq ($(DISABLE_BT_FTM),true)
 | 
				
			||||||
 | 
					LOCAL_SRC_FILES += \
 | 
				
			||||||
 | 
					    ftm_bt.c \
 | 
				
			||||||
 | 
					    ftm_bt_power_pfal_linux.c \
 | 
				
			||||||
 | 
					    ftm_bt_hci_pfal_linux.c \
 | 
				
			||||||
 | 
					    ftm_bt_persist.cpp
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(call is-platform-sdk-version-at-least,23),true)
 | 
				
			||||||
 | 
					LOCAL_CFLAGS += -DANDROID_M
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(BOARD_HAVE_QCOM_FM),true)
 | 
				
			||||||
 | 
					ifeq ($(BOARD_HAS_QCA_FM_SOC), "cherokee")
 | 
				
			||||||
 | 
					LOCAL_SRC_FILES += ftm_fm.c ftm_fm_pfal_linux_3990.c
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					LOCAL_SRC_FILES += ftm_fm.c ftm_fm_pfal_linux.c
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifneq ($(BOARD_ANT_WIRELESS_DEVICE), )
 | 
				
			||||||
 | 
					LOCAL_SRC_FILES += ftm_ant.c
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(findstring true, $(BOARD_HAS_ATH_WLAN) $(BOARD_HAS_ATH_WLAN_AR6320)),true)
 | 
				
			||||||
 | 
					LOCAL_CFLAGS += -DBOARD_HAS_ATH_WLAN_AR6320
 | 
				
			||||||
 | 
					LOCAL_CFLAGS +=  -DCONFIG_FTM_WLAN
 | 
				
			||||||
 | 
					LOCAL_CFLAGS +=  -DCONFIG_FTM_WLAN_AUTOLOAD
 | 
				
			||||||
 | 
					LOCAL_STATIC_LIBRARIES += libtcmd
 | 
				
			||||||
 | 
					LOCAL_SHARED_LIBRARIES += libnl
 | 
				
			||||||
 | 
					LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/libtcmd
 | 
				
			||||||
 | 
					LOCAL_SRC_FILES  += ftm_wlan.c
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCAL_SHARED_LIBRARIES += libdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifneq ($(DISABLE_BT_FTM),true)
 | 
				
			||||||
 | 
					LOCAL_SHARED_LIBRARIES += libbt-hidlclient
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES)
 | 
				
			||||||
 | 
					LOCAL_MODULE:= ftmdaemon
 | 
				
			||||||
 | 
					LOCAL_CLANG := true
 | 
				
			||||||
 | 
					ifeq ($(PRODUCT_VENDOR_MOVE_ENABLED),true)
 | 
				
			||||||
 | 
					LOCAL_PROPRIETARY_MODULE := true
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					LOCAL_MODULE_TAGS := optional
 | 
				
			||||||
 | 
					LOCAL_SHARED_LIBRARIES  += libdiag
 | 
				
			||||||
 | 
					LOCAL_SHARED_LIBRARIES  += libcutils liblog libhardware
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifneq ($(DISABLE_BT_FTM),true)
 | 
				
			||||||
 | 
					LOCAL_SHARED_LIBRARIES  += libbtnv
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# By default NV persist gets used
 | 
				
			||||||
 | 
					LOCAL_CFLAGS += -DBT_NV_SUPPORT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LDFLAGS += -ldl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include $(BUILD_EXECUTABLE)
 | 
				
			||||||
 | 
					include $(call all-makefiles-under,$(LOCAL_PATH))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endif # filter
 | 
				
			||||||
 | 
					endif # is-vendor-board-platform
 | 
				
			||||||
							
								
								
									
										181
									
								
								feeds/ipq95xx/ftm/src/LICENSE
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										181
									
								
								feeds/ipq95xx/ftm/src/LICENSE
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,181 @@
 | 
				
			|||||||
 | 
					This text file is provided to comply with the attribution requirements of
 | 
				
			||||||
 | 
					the licenses herein, but see NOTICE for license terms of this software.
 | 
				
			||||||
 | 
					The Apache 2.0 license can be found at
 | 
				
			||||||
 | 
					http://www.apache.org/licenses/LICENSE-2.0.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                 Apache License
 | 
				
			||||||
 | 
					                           Version 2.0, January 2004
 | 
				
			||||||
 | 
					                        http://www.apache.org/licenses/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   1. Definitions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "License" shall mean the terms and conditions for use, reproduction,
 | 
				
			||||||
 | 
					      and distribution as defined by Sections 1 through 9 of this document.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Licensor" shall mean the copyright owner or entity authorized by
 | 
				
			||||||
 | 
					      the copyright owner that is granting the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Legal Entity" shall mean the union of the acting entity and all
 | 
				
			||||||
 | 
					      other entities that control, are controlled by, or are under common
 | 
				
			||||||
 | 
					      control with that entity. For the purposes of this definition,
 | 
				
			||||||
 | 
					      "control" means (i) the power, direct or indirect, to cause the
 | 
				
			||||||
 | 
					      direction or management of such entity, whether by contract or
 | 
				
			||||||
 | 
					      otherwise, or (ii) ownership of fifty percent (50%) or more of the
 | 
				
			||||||
 | 
					      outstanding shares, or (iii) beneficial ownership of such entity.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "You" (or "Your") shall mean an individual or Legal Entity
 | 
				
			||||||
 | 
					      exercising permissions granted by this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Source" form shall mean the preferred form for making modifications,
 | 
				
			||||||
 | 
					      including but not limited to software source code, documentation
 | 
				
			||||||
 | 
					      source, and configuration files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Object" form shall mean any form resulting from mechanical
 | 
				
			||||||
 | 
					      transformation or translation of a Source form, including but
 | 
				
			||||||
 | 
					      not limited to compiled object code, generated documentation,
 | 
				
			||||||
 | 
					      and conversions to other media types.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Work" shall mean the work of authorship, whether in Source or
 | 
				
			||||||
 | 
					      Object form, made available under the License, as indicated by a
 | 
				
			||||||
 | 
					      copyright notice that is included in or attached to the work
 | 
				
			||||||
 | 
					      (an example is provided in the Appendix below).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Derivative Works" shall mean any work, whether in Source or Object
 | 
				
			||||||
 | 
					      form, that is based on (or derived from) the Work and for which the
 | 
				
			||||||
 | 
					      editorial revisions, annotations, elaborations, or other modifications
 | 
				
			||||||
 | 
					      represent, as a whole, an original work of authorship. For the purposes
 | 
				
			||||||
 | 
					      of this License, Derivative Works shall not include works that remain
 | 
				
			||||||
 | 
					      separable from, or merely link (or bind by name) to the interfaces of,
 | 
				
			||||||
 | 
					      the Work and Derivative Works thereof.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Contribution" shall mean any work of authorship, including
 | 
				
			||||||
 | 
					      the original version of the Work and any modifications or additions
 | 
				
			||||||
 | 
					      to that Work or Derivative Works thereof, that is intentionally
 | 
				
			||||||
 | 
					      submitted to Licensor for inclusion in the Work by the copyright owner
 | 
				
			||||||
 | 
					      or by an individual or Legal Entity authorized to submit on behalf of
 | 
				
			||||||
 | 
					      the copyright owner. For the purposes of this definition, "submitted"
 | 
				
			||||||
 | 
					      means any form of electronic, verbal, or written communication sent
 | 
				
			||||||
 | 
					      to the Licensor or its representatives, including but not limited to
 | 
				
			||||||
 | 
					      communication on electronic mailing lists, source code control systems,
 | 
				
			||||||
 | 
					      and issue tracking systems that are managed by, or on behalf of, the
 | 
				
			||||||
 | 
					      Licensor for the purpose of discussing and improving the Work, but
 | 
				
			||||||
 | 
					      excluding communication that is conspicuously marked or otherwise
 | 
				
			||||||
 | 
					      designated in writing by the copyright owner as "Not a Contribution."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      "Contributor" shall mean Licensor and any individual or Legal Entity
 | 
				
			||||||
 | 
					      on behalf of whom a Contribution has been received by Licensor and
 | 
				
			||||||
 | 
					      subsequently incorporated within the Work.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   2. Grant of Copyright License. Subject to the terms and conditions of
 | 
				
			||||||
 | 
					      this License, each Contributor hereby grants to You a perpetual,
 | 
				
			||||||
 | 
					      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
				
			||||||
 | 
					      copyright license to reproduce, prepare Derivative Works of,
 | 
				
			||||||
 | 
					      publicly display, publicly perform, sublicense, and distribute the
 | 
				
			||||||
 | 
					      Work and such Derivative Works in Source or Object form.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   3. Grant of Patent License. Subject to the terms and conditions of
 | 
				
			||||||
 | 
					      this License, each Contributor hereby grants to You a perpetual,
 | 
				
			||||||
 | 
					      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
 | 
				
			||||||
 | 
					      (except as stated in this section) patent license to make, have made,
 | 
				
			||||||
 | 
					      use, offer to sell, sell, import, and otherwise transfer the Work,
 | 
				
			||||||
 | 
					      where such license applies only to those patent claims licensable
 | 
				
			||||||
 | 
					      by such Contributor that are necessarily infringed by their
 | 
				
			||||||
 | 
					      Contribution(s) alone or by combination of their Contribution(s)
 | 
				
			||||||
 | 
					      with the Work to which such Contribution(s) was submitted. If You
 | 
				
			||||||
 | 
					      institute patent litigation against any entity (including a
 | 
				
			||||||
 | 
					      cross-claim or counterclaim in a lawsuit) alleging that the Work
 | 
				
			||||||
 | 
					      or a Contribution incorporated within the Work constitutes direct
 | 
				
			||||||
 | 
					      or contributory patent infringement, then any patent licenses
 | 
				
			||||||
 | 
					      granted to You under this License for that Work shall terminate
 | 
				
			||||||
 | 
					      as of the date such litigation is filed.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   4. Redistribution. You may reproduce and distribute copies of the
 | 
				
			||||||
 | 
					      Work or Derivative Works thereof in any medium, with or without
 | 
				
			||||||
 | 
					      modifications, and in Source or Object form, provided that You
 | 
				
			||||||
 | 
					      meet the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (a) You must give any other recipients of the Work or
 | 
				
			||||||
 | 
					          Derivative Works a copy of this License; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (b) You must cause any modified files to carry prominent notices
 | 
				
			||||||
 | 
					          stating that You changed the files; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (c) You must retain, in the Source form of any Derivative Works
 | 
				
			||||||
 | 
					          that You distribute, all copyright, patent, trademark, and
 | 
				
			||||||
 | 
					          attribution notices from the Source form of the Work,
 | 
				
			||||||
 | 
					          excluding those notices that do not pertain to any part of
 | 
				
			||||||
 | 
					          the Derivative Works; and
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      (d) If the Work includes a "NOTICE" text file as part of its
 | 
				
			||||||
 | 
					          distribution, then any Derivative Works that You distribute must
 | 
				
			||||||
 | 
					          include a readable copy of the attribution notices contained
 | 
				
			||||||
 | 
					          within such NOTICE file, excluding those notices that do not
 | 
				
			||||||
 | 
					          pertain to any part of the Derivative Works, in at least one
 | 
				
			||||||
 | 
					          of the following places: within a NOTICE text file distributed
 | 
				
			||||||
 | 
					          as part of the Derivative Works; within the Source form or
 | 
				
			||||||
 | 
					          documentation, if provided along with the Derivative Works; or,
 | 
				
			||||||
 | 
					          within a display generated by the Derivative Works, if and
 | 
				
			||||||
 | 
					          wherever such third-party notices normally appear. The contents
 | 
				
			||||||
 | 
					          of the NOTICE file are for informational purposes only and
 | 
				
			||||||
 | 
					          do not modify the License. You may add Your own attribution
 | 
				
			||||||
 | 
					          notices within Derivative Works that You distribute, alongside
 | 
				
			||||||
 | 
					          or as an addendum to the NOTICE text from the Work, provided
 | 
				
			||||||
 | 
					          that such additional attribution notices cannot be construed
 | 
				
			||||||
 | 
					          as modifying the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      You may add Your own copyright statement to Your modifications and
 | 
				
			||||||
 | 
					      may provide additional or different license terms and conditions
 | 
				
			||||||
 | 
					      for use, reproduction, or distribution of Your modifications, or
 | 
				
			||||||
 | 
					      for any such Derivative Works as a whole, provided Your use,
 | 
				
			||||||
 | 
					      reproduction, and distribution of the Work otherwise complies with
 | 
				
			||||||
 | 
					      the conditions stated in this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   5. Submission of Contributions. Unless You explicitly state otherwise,
 | 
				
			||||||
 | 
					      any Contribution intentionally submitted for inclusion in the Work
 | 
				
			||||||
 | 
					      by You to the Licensor shall be under the terms and conditions of
 | 
				
			||||||
 | 
					      this License, without any additional terms or conditions.
 | 
				
			||||||
 | 
					      Notwithstanding the above, nothing herein shall supersede or modify
 | 
				
			||||||
 | 
					      the terms of any separate license agreement you may have executed
 | 
				
			||||||
 | 
					      with Licensor regarding such Contributions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   6. Trademarks. This License does not grant permission to use the trade
 | 
				
			||||||
 | 
					      names, trademarks, service marks, or product names of the Licensor,
 | 
				
			||||||
 | 
					      except as required for reasonable and customary use in describing the
 | 
				
			||||||
 | 
					      origin of the Work and reproducing the content of the NOTICE file.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   7. Disclaimer of Warranty. Unless required by applicable law or
 | 
				
			||||||
 | 
					      agreed to in writing, Licensor provides the Work (and each
 | 
				
			||||||
 | 
					      Contributor provides its Contributions) on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
 | 
				
			||||||
 | 
					      implied, including, without limitation, any warranties or conditions
 | 
				
			||||||
 | 
					      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
 | 
				
			||||||
 | 
					      PARTICULAR PURPOSE. You are solely responsible for determining the
 | 
				
			||||||
 | 
					      appropriateness of using or redistributing the Work and assume any
 | 
				
			||||||
 | 
					      risks associated with Your exercise of permissions under this License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   8. Limitation of Liability. In no event and under no legal theory,
 | 
				
			||||||
 | 
					      whether in tort (including negligence), contract, or otherwise,
 | 
				
			||||||
 | 
					      unless required by applicable law (such as deliberate and grossly
 | 
				
			||||||
 | 
					      negligent acts) or agreed to in writing, shall any Contributor be
 | 
				
			||||||
 | 
					      liable to You for damages, including any direct, indirect, special,
 | 
				
			||||||
 | 
					      incidental, or consequential damages of any character arising as a
 | 
				
			||||||
 | 
					      result of this License or out of the use or inability to use the
 | 
				
			||||||
 | 
					      Work (including but not limited to damages for loss of goodwill,
 | 
				
			||||||
 | 
					      work stoppage, computer failure or malfunction, or any and all
 | 
				
			||||||
 | 
					      other commercial damages or losses), even if such Contributor
 | 
				
			||||||
 | 
					      has been advised of the possibility of such damages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   9. Accepting Warranty or Additional Liability. While redistributing
 | 
				
			||||||
 | 
					      the Work or Derivative Works thereof, You may choose to offer,
 | 
				
			||||||
 | 
					      and charge a fee for, acceptance of support, warranty, indemnity,
 | 
				
			||||||
 | 
					      or other liability obligations and/or rights consistent with this
 | 
				
			||||||
 | 
					      License. However, in accepting such obligations, You may act only
 | 
				
			||||||
 | 
					      on Your own behalf and on Your sole responsibility, not on behalf
 | 
				
			||||||
 | 
					      of any other Contributor, and only if You agree to indemnify,
 | 
				
			||||||
 | 
					      defend, and hold each Contributor harmless for any liability
 | 
				
			||||||
 | 
					      incurred by, or claims asserted against, such Contributor by reason
 | 
				
			||||||
 | 
					      of your accepting any such warranty or additional liability.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   END OF TERMS AND CONDITIONS
 | 
				
			||||||
							
								
								
									
										12
									
								
								feeds/ipq95xx/ftm/src/Makefile
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										12
									
								
								feeds/ipq95xx/ftm/src/Makefile
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					#CC := $(ATH_CROSS_COMPILE_TYPE)gcc
 | 
				
			||||||
 | 
					TARGET_TYPE ?= AR9888
 | 
				
			||||||
 | 
					TARGET_VERS ?= v2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#Sources to compile
 | 
				
			||||||
 | 
					CSRCS := ftm_main.c ftm_wlan.c ftm_write_to_flash.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					all:
 | 
				
			||||||
 | 
						$(CC) $(CFLAGS) $(LDFLAGS) -g3 -Wall  \
 | 
				
			||||||
 | 
							$(CSRCS) -o ftm
 | 
				
			||||||
 | 
					clean:
 | 
				
			||||||
 | 
						rm -f ftm
 | 
				
			||||||
							
								
								
									
										86
									
								
								feeds/ipq95xx/ftm/src/Makefile.am
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										86
									
								
								feeds/ipq95xx/ftm/src/Makefile.am
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,86 @@
 | 
				
			|||||||
 | 
					AM_CFLAGS = -Wall \
 | 
				
			||||||
 | 
					            -g -O0 \
 | 
				
			||||||
 | 
					            $(DIAG_CFLAGS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_CPPFLAGS = -Wall \
 | 
				
			||||||
 | 
					            -g -O0 \
 | 
				
			||||||
 | 
					            $(DIAG_CFLAGS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_CFLAGS += -I${WORKSPACE}/system/bt/hci/include
 | 
				
			||||||
 | 
					AM_CFLAGS += -I${WORKSPACE}/vendor/qcom/proprietary/bt/hci_qcomm_init/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_CPPFLAGS += -I${WORKSPACE}/system/bt/hci/include
 | 
				
			||||||
 | 
					AM_CPPFLAGS += -I${WORKSPACE}/vendor/qcom/proprietary/bt/hci_qcomm_init/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if DEBUG
 | 
				
			||||||
 | 
					AM_CFLAGS += -DDEBUG
 | 
				
			||||||
 | 
					AM_CPPFLAGS += -DDEBUG
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					requiredlibs = -lrt $(DIAG_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if USE_GLIB
 | 
				
			||||||
 | 
					AM_CFLAGS += -DUSE_GLIB $(GLIB_CFLAGS)
 | 
				
			||||||
 | 
					AM_CPPFLAGS += -DUSE_GLIB $(GLIB_CFLAGS)
 | 
				
			||||||
 | 
					requiredlibs += $(GLIB_LIBS)
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#By default build for MDM_LE
 | 
				
			||||||
 | 
					AM_CFLAGS += -DMDM_LE
 | 
				
			||||||
 | 
					AM_CPPFLAGS += -DMDM_LE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if MDM_ROME
 | 
				
			||||||
 | 
					AM_CFLAGS += -DBT_SOC_TYPE_ROME
 | 
				
			||||||
 | 
					AM_CPPFLAGS += -DBT_SOC_TYPE_ROME
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					if MDM_PRONTO
 | 
				
			||||||
 | 
					AM_CFLAGS += -DHCI_USE_MCT
 | 
				
			||||||
 | 
					AM_CPPFLAGS += -DHCI_USE_MCT
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					c_sources = ftm_main.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if CONFIG_FTM_BT
 | 
				
			||||||
 | 
					AM_CFLAGS += -DCONFIG_FTM_BT -DBT_NV_SUPPORT
 | 
				
			||||||
 | 
					AM_CPPFLAGS += -DCONFIG_FTM_BT -DBT_NV_SUPPORT
 | 
				
			||||||
 | 
					c_sources += ftm_bt.c
 | 
				
			||||||
 | 
					c_sources += ftm_bt_power_pfal_linux.c
 | 
				
			||||||
 | 
					c_sources += ftm_bt_hci_pfal_linux.c
 | 
				
			||||||
 | 
					c_sources += ftm_bt_persist.cpp
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if CONFIG_FTM_FM
 | 
				
			||||||
 | 
					AM_CFLAGS += -DCONFIG_FTM_FM
 | 
				
			||||||
 | 
					c_sources += ftm_fm.c
 | 
				
			||||||
 | 
					c_sources += ftm_fm_pfal_linux.c
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if CONFIG_FTM_ANT
 | 
				
			||||||
 | 
					AM_CFLAGS += -DCONFIG_FTM_ANT
 | 
				
			||||||
 | 
					c_sources += ftm_ant.c
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if CONFIG_FTM_NFC
 | 
				
			||||||
 | 
					AM_CFLAGS += -DCONFIG_FTM_NFC
 | 
				
			||||||
 | 
					c_sources += ftm_nfc.c
 | 
				
			||||||
 | 
					c_sources += ftm_nfcnq.c
 | 
				
			||||||
 | 
					c_sources += ftm_nfcqti.c
 | 
				
			||||||
 | 
					c_sources += ftm_nfcnq_fwdl.c
 | 
				
			||||||
 | 
					c_sources += ftm_nfcnq_test.c
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if CONFIG_FTM_WLAN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_CFLAGS += -DCONFIG_FTM_WLAN -DCONFIG_FTM_WLAN_AUTOLOAD
 | 
				
			||||||
 | 
					AM_CFLAGS += $(LIBNL_CFLAGS) $(ATH6KL_UTILS_CFLAGS)
 | 
				
			||||||
 | 
					AM_CPPFLAGS += $(LIBNL_CFLAGS) $(ATH6KL_UTILS_CFLAGS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					requiredlibs += $(ATH6KL_UTILS_LIBS) $(LIBNL_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					c_sources += ftm_wlan.c
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ftmdaemon_SOURCES = $(c_sources)
 | 
				
			||||||
 | 
					ftmdaemon_LDADD = -ldl $(requiredlibs) -lbtnv
 | 
				
			||||||
 | 
					bin_PROGRAMS = ftmdaemon
 | 
				
			||||||
							
								
								
									
										72
									
								
								feeds/ipq95xx/ftm/src/NOTICE
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										72
									
								
								feeds/ipq95xx/ftm/src/NOTICE
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,72 @@
 | 
				
			|||||||
 | 
					This NOTICE file contains certain notices of software components included
 | 
				
			||||||
 | 
					with the software that Qualcomm Technologies, Inc. ("Qualcomm Technologies")
 | 
				
			||||||
 | 
					is required to provide you. Notwithstanding anything in the notices in this
 | 
				
			||||||
 | 
					file, your use of these software components together with the
 | 
				
			||||||
 | 
					Qualcomm Technologies software (Qualcomm Technologies software hereinafter
 | 
				
			||||||
 | 
					referred to as "Software") is subject to the terms of your license from
 | 
				
			||||||
 | 
					Qualcomm Technologies. Compliance with all copyright laws and software
 | 
				
			||||||
 | 
					license agreements included in the notice section of this file are the
 | 
				
			||||||
 | 
					responsibility of the user. Except as may be granted by separate express
 | 
				
			||||||
 | 
					written agreement, this file provides no license to any patents,
 | 
				
			||||||
 | 
					trademarks, copyrights, or other intellectual property.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2016 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					All rights reserved.
 | 
				
			||||||
 | 
					Qualcomm is a registered trademark and registered service mark of
 | 
				
			||||||
 | 
					QUALCOMM Incorporated. All other trademarks and service marks are the
 | 
				
			||||||
 | 
					property of their respective owners.
 | 
				
			||||||
 | 
					________________________________________
 | 
				
			||||||
 | 
					NOTICES
 | 
				
			||||||
 | 
					________________________________________
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (C) 2010 The Android Open Source Project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					________________________________________
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (C) 2015 NXP Semiconductors
 | 
				
			||||||
 | 
					The original Work has been changed by NXP Semiconductors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					________________________________________
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (C) 2015 The Android Open Source Project
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					________________________________________
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note: Any files for which the above Apache License notices are required
 | 
				
			||||||
 | 
					to be provided are not contributions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A copy of the Apache 2.0 license is included in the file LICENSE
 | 
				
			||||||
 | 
					for attribution purposes only.
 | 
				
			||||||
							
								
								
									
										149
									
								
								feeds/ipq95xx/ftm/src/configure.ac
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										149
									
								
								feeds/ipq95xx/ftm/src/configure.ac
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,149 @@
 | 
				
			|||||||
 | 
					#                                               -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# configure.ac -- Autoconf script for ftm.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Process this file with autoconf to produce a configure script
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Requires autoconf tool later than 2.61
 | 
				
			||||||
 | 
					AC_PREREQ(2.61)
 | 
				
			||||||
 | 
					# Initialize the ftm package version 1.0.0
 | 
				
			||||||
 | 
					AC_INIT([ftm],1.0.0)
 | 
				
			||||||
 | 
					# Does not strictly follow GNU Coding standards
 | 
				
			||||||
 | 
					AM_INIT_AUTOMAKE([foreign])
 | 
				
			||||||
 | 
					# Disables auto rebuilding of configure, Makefile.ins
 | 
				
			||||||
 | 
					AM_MAINTAINER_MODE
 | 
				
			||||||
 | 
					# defines some macros variable to be included by source
 | 
				
			||||||
 | 
					AC_CONFIG_HEADERS([config.h])
 | 
				
			||||||
 | 
					AC_CONFIG_MACRO_DIR([m4])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Checks for programs.
 | 
				
			||||||
 | 
					AC_PROG_CC
 | 
				
			||||||
 | 
					AC_PROG_CXX
 | 
				
			||||||
 | 
					AM_PROG_CC_C_O
 | 
				
			||||||
 | 
					AC_PROG_LIBTOOL
 | 
				
			||||||
 | 
					AC_PROG_AWK
 | 
				
			||||||
 | 
					AC_PROG_CPP
 | 
				
			||||||
 | 
					AC_PROG_INSTALL
 | 
				
			||||||
 | 
					AC_PROG_LN_S
 | 
				
			||||||
 | 
					AC_PROG_MAKE_SET
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Checks for libraries.
 | 
				
			||||||
 | 
					PKG_CHECK_MODULES([DIAG], [diag])
 | 
				
			||||||
 | 
					AC_SUBST([DIAG_CFLAGS])
 | 
				
			||||||
 | 
					AC_SUBST([DIAG_LIBS])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					has_libnl_ver=0
 | 
				
			||||||
 | 
					# libnl-2 provides only libnl-2.0.pc file, so we check for separate libnl-genl-3.0.pc
 | 
				
			||||||
 | 
					# pkg-config file just for libnl-3.0 case.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					PKG_CHECK_MODULES([LIBNL], [libnl-3.0 >= 3.0 libnl-genl-3.0 >= 3.0], [has_libnl_ver=3], [
 | 
				
			||||||
 | 
					   PKG_CHECK_MODULES([LIBNL], [libnl-2.0 >= 2.0], [has_libnl_ver=2], [
 | 
				
			||||||
 | 
					           PKG_CHECK_MODULES([LIBNL], [libnl-1], [has_libnl_ver=1], [has_libnl_ver=0])])])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (test "$has_libnl_ver" -eq 0); then
 | 
				
			||||||
 | 
					        AC_MSG_ERROR(libnl and libnl-genl are required but were not found)
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (test "$has_libnl_ver" -gt 1); then
 | 
				
			||||||
 | 
					        AC_DEFINE([HAVE_LIBNL20], [1], [Define if you have libnl-2.0 or higher])
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_SUBST([LIBNL_CFLAGS])
 | 
				
			||||||
 | 
					AC_SUBST([LIBNL_LIBS])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PKG_CHECK_MODULES([ATH6KL_UTILS], [ath6kl-utils])
 | 
				
			||||||
 | 
					AC_SUBST([ATH6KL_UTILS_CFLAGS])
 | 
				
			||||||
 | 
					AC_SUBST([ATH6KL_UTILS_LIBS])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_ARG_WITH([glib],
 | 
				
			||||||
 | 
					      AC_HELP_STRING([--with-glib],
 | 
				
			||||||
 | 
					         [enable glib, building FTM Daemon which use glib]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (test "x${with_glib}" = "xyes"); then
 | 
				
			||||||
 | 
					        PKG_CHECK_MODULES(GTHREAD, gthread-2.0 >= 2.16, dummy=yes,
 | 
				
			||||||
 | 
					                                AC_MSG_ERROR(GThread >= 2.16 is required))
 | 
				
			||||||
 | 
					        PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.16, dummy=yes,
 | 
				
			||||||
 | 
					                                AC_MSG_ERROR(GLib >= 2.16 is required))
 | 
				
			||||||
 | 
					        GLIB_CFLAGS="$GLIB_CFLAGS $GTHREAD_CFLAGS"
 | 
				
			||||||
 | 
					        GLIB_LIBS="$GLIB_LIBS $GTHREAD_LIBS"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        AC_SUBST(GLIB_CFLAGS)
 | 
				
			||||||
 | 
					        AC_SUBST(GLIB_LIBS)
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					AM_CONDITIONAL(USE_GLIB, test "x${with_glib}" = "xyes")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_ARG_ENABLE([debug],
 | 
				
			||||||
 | 
					        [  --enable-debug    Turn on debugging],
 | 
				
			||||||
 | 
					        [case "${enableval}" in
 | 
				
			||||||
 | 
					            yes) debug=true ;;
 | 
				
			||||||
 | 
					            no)  debug=false ;;
 | 
				
			||||||
 | 
					            *) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
 | 
				
			||||||
 | 
					        esac],[debug=false])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_CONDITIONAL([DEBUG], [test x$debug = xtrue])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_ARG_ENABLE([all],
 | 
				
			||||||
 | 
					        [  --enable-all Enable all FTM functionality],
 | 
				
			||||||
 | 
					        [case "${enableval}" in
 | 
				
			||||||
 | 
					            yes) all=true ;;
 | 
				
			||||||
 | 
					            no)  all=false ;;
 | 
				
			||||||
 | 
					            *) AC_MSG_ERROR([bad value ${enableval} for --enable-all]) ;;
 | 
				
			||||||
 | 
					        esac],[all=false])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_CONDITIONAL([CONFIG_FTM_BT], [test x$all = xtrue])
 | 
				
			||||||
 | 
					AM_CONDITIONAL([CONFIG_FTM_FM], [test x$all = xtrue])
 | 
				
			||||||
 | 
					AM_CONDITIONAL([CONFIG_FTM_ANT], [test x$all = xtrue])
 | 
				
			||||||
 | 
					AM_CONDITIONAL([CONFIG_FTM_NFC], [test x$all = xtrue])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_ARG_ENABLE([wlan],
 | 
				
			||||||
 | 
					        [  --enable-wlan Enable WLAN FTM functionality],
 | 
				
			||||||
 | 
					        [case "${enableval}" in
 | 
				
			||||||
 | 
					            yes) wlan=true ;;
 | 
				
			||||||
 | 
					            no)  wlan=false ;;
 | 
				
			||||||
 | 
					            *) AC_MSG_ERROR([bad value ${enableval} for --enable-wlan]) ;;
 | 
				
			||||||
 | 
					        esac],[wlan=false])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_CONDITIONAL([CONFIG_FTM_WLAN], [test x$wlan = xtrue -o x$all = xtrue])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_ARG_ENABLE([bt],
 | 
				
			||||||
 | 
					        [  --enable-bt Enable BT FTM functionality],
 | 
				
			||||||
 | 
					        [case "${enableval}" in
 | 
				
			||||||
 | 
					           yes) bt=true ;;
 | 
				
			||||||
 | 
					           no)  bt=false ;;
 | 
				
			||||||
 | 
					        *) AC_MSG_ERROR([bad value ${enableval} for --enable-bt]) ;;
 | 
				
			||||||
 | 
					         esac],[bt=false])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AM_CONDITIONAL([CONFIG_FTM_BT], [test x$bt = xtrue -o x$all = xtrue])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_ARG_ENABLE(target,
 | 
				
			||||||
 | 
					  [AS_HELP_STRING([--enable-target=TARGET], [Specify the target product to build])],
 | 
				
			||||||
 | 
					  [TARGET=$enableval],
 | 
				
			||||||
 | 
					  [TARGET=none]
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					AM_CONDITIONAL([MDM_ROME], [test "x$TARGET" = "xmdm9607" -o "x$TARGET" = "xmdm9635" -o "x$TARGET" = "xmdm9640" -o "x$TARGET" = "xmdmcalifornium"])
 | 
				
			||||||
 | 
					AM_CONDITIONAL([MDM_PRONTO], [test "x$TARGET" = "xapq8009" -o "x$TARGET" = "xapq8017" -o "x$TARGET" = "xapq8053"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Checks for typedefs, structures, and compiler characteristics.
 | 
				
			||||||
 | 
					AC_HEADER_STDBOOL
 | 
				
			||||||
 | 
					AC_HEADER_STDC
 | 
				
			||||||
 | 
					AC_C_INLINE
 | 
				
			||||||
 | 
					AC_TYPE_INT64_T
 | 
				
			||||||
 | 
					AC_TYPE_PID_T
 | 
				
			||||||
 | 
					AC_TYPE_SIZE_T
 | 
				
			||||||
 | 
					AC_TYPE_SSIZE_T
 | 
				
			||||||
 | 
					AC_TYPE_UINT16_T
 | 
				
			||||||
 | 
					AC_TYPE_UINT32_T
 | 
				
			||||||
 | 
					AC_TYPE_UINT8_T
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Checks for library functions.
 | 
				
			||||||
 | 
					AC_FUNC_ERROR_AT_LINE
 | 
				
			||||||
 | 
					AC_FUNC_FORK
 | 
				
			||||||
 | 
					AC_FUNC_MALLOC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AC_CONFIG_FILES([ \
 | 
				
			||||||
 | 
					        Makefile \
 | 
				
			||||||
 | 
					        ])
 | 
				
			||||||
 | 
					AC_OUTPUT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										585
									
								
								feeds/ipq95xx/ftm/src/ftm_ant.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										585
									
								
								feeds/ipq95xx/ftm/src/ftm_ant.c
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,585 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         FTM ANT Source File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					  FTM platform independent processing of packet data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010-2012 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who      what, where, why
 | 
				
			||||||
 | 
					--------   ---      ----------------------------------------------------------
 | 
				
			||||||
 | 
					05/16/12  ankurn    Adding support for ANT commands
 | 
				
			||||||
 | 
					11/28/12  c_ssugas  implements efficent method for Ant cmd transfer
 | 
				
			||||||
 | 
					                     and implements Rx thread for event handling.
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					#include "event.h"
 | 
				
			||||||
 | 
					#include "msg.h"
 | 
				
			||||||
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "diag_lsm.h"
 | 
				
			||||||
 | 
					#include "diagpkt.h"
 | 
				
			||||||
 | 
					#include "diagcmd.h"
 | 
				
			||||||
 | 
					#include "diag.h"
 | 
				
			||||||
 | 
					#include "termios.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <pthread.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					#include <dlfcn.h>
 | 
				
			||||||
 | 
					#include "bt_vendor_qcom.h"
 | 
				
			||||||
 | 
					#include "ftm_ant_common.h"
 | 
				
			||||||
 | 
					#include "ftm_bt.h"
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include "hidl_client.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef ANDROID
 | 
				
			||||||
 | 
					#include <cutils/properties.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef ANDROID
 | 
				
			||||||
 | 
					extern int soc_type;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ANT_CTRL_PACKET_TYPE    0x0c
 | 
				
			||||||
 | 
					#define ANT_DATA_PACKET_TYPE    0x0e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define UNUSED(x) (void)(x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int init_transport_ant(int on);
 | 
				
			||||||
 | 
					// The following functions are dummy implementations of the callbacks required by libbt-vendor.
 | 
				
			||||||
 | 
					static void vendor_fwcfg_cb(bt_vendor_op_result_t result) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_scocfg_cb(bt_vendor_op_result_t result) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_lpm_vnd_cb(bt_vendor_op_result_t result) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_audio_state_cb(bt_vendor_op_result_t result) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void* vendor_alloc(int size) {
 | 
				
			||||||
 | 
					    UNUSED(size);
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_dealloc(void *p_buf) {
 | 
				
			||||||
 | 
					    UNUSED(p_buf);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static uint8_t vendor_xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback) {
 | 
				
			||||||
 | 
					    UNUSED(opcode);
 | 
				
			||||||
 | 
					    UNUSED(p_buf);
 | 
				
			||||||
 | 
					    UNUSED(p_cback);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_epilog_cb(bt_vendor_op_result_t result) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_a2dp_offload_cb(bt_vendor_op_result_t result, bt_vendor_opcode_t op, unsigned char handle) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					    UNUSED(op);
 | 
				
			||||||
 | 
					    UNUSED(handle);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This struct is used to regsiter the dummy callbacks with libbt-vendor
 | 
				
			||||||
 | 
					static bt_vendor_interface_t *vendor_interface=NULL;
 | 
				
			||||||
 | 
					static const bt_vendor_callbacks_t vendor_callbacks = {
 | 
				
			||||||
 | 
					  sizeof(bt_vendor_callbacks_t),
 | 
				
			||||||
 | 
					    vendor_fwcfg_cb,
 | 
				
			||||||
 | 
					    vendor_scocfg_cb,
 | 
				
			||||||
 | 
					    vendor_lpm_vnd_cb,
 | 
				
			||||||
 | 
					    vendor_audio_state_cb,
 | 
				
			||||||
 | 
					    vendor_alloc,
 | 
				
			||||||
 | 
					    vendor_dealloc,
 | 
				
			||||||
 | 
					    vendor_xmit_cb,
 | 
				
			||||||
 | 
					    vendor_epilog_cb,
 | 
				
			||||||
 | 
					    vendor_a2dp_offload_cb
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Transport file descriptor */
 | 
				
			||||||
 | 
					int fd_transport_ant_cmd;
 | 
				
			||||||
 | 
					extern int first_ant_command;
 | 
				
			||||||
 | 
					/* Reader thread handle */
 | 
				
			||||||
 | 
					pthread_t ant_cmd_thread_hdl;
 | 
				
			||||||
 | 
					/* Pipe file descriptors for cancelling read operation */
 | 
				
			||||||
 | 
					int ant_pipefd[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Enable FTM_DEBUG to turn on Debug messages  */
 | 
				
			||||||
 | 
					//#define FTM_DEBUG
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_ant_readerthread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Thread Routine to perfom asynchrounous handling of events coming on Smd
 | 
				
			||||||
 | 
					  descriptor. It invokes a callback to the FTM ANT layer to intiate a request
 | 
				
			||||||
 | 
					  to read event bytes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  The LifeTime of ReaderThraad is dependent on the status returned by the
 | 
				
			||||||
 | 
					  call to ftm_ant_qcomm_handle_event
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN NULL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void *ftm_ant_readerthread(void *ptr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   boolean status = FALSE;
 | 
				
			||||||
 | 
					   int retval;
 | 
				
			||||||
 | 
					   fd_set readfds;
 | 
				
			||||||
 | 
					   int buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   UNUSED(ptr);
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					   printf("ftm_ant_readerthread --> \n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					   do
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      FD_ZERO(&readfds);
 | 
				
			||||||
 | 
					      FD_SET(fd_transport_ant_cmd, &readfds);
 | 
				
			||||||
 | 
					      FD_SET(ant_pipefd[0],&readfds);
 | 
				
			||||||
 | 
					      retval = select((fd_transport_ant_cmd>ant_pipefd[0]?fd_transport_ant_cmd
 | 
				
			||||||
 | 
					                  :ant_pipefd[0]) + 1, &readfds, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					      if(retval == -1)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         printf("select failed\n");
 | 
				
			||||||
 | 
					         break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if(FD_ISSET(ant_pipefd[0],&readfds))
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					         printf("Pipe descriptor set\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					         read(ant_pipefd[0],&buf,1);
 | 
				
			||||||
 | 
					         if(buf == 1)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if(FD_ISSET(fd_transport_ant_cmd,&readfds))
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					         printf("Read descriptor set\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					         status = ftm_ant_qcomm_handle_event();
 | 
				
			||||||
 | 
					         if(TRUE != status)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   while(1);
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					   printf("\nReader thread exited\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					   return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_ant_open_channel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					   Open the SMD transport associated with ANT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  int value indicating success or failure
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					static bool ftm_ant_open_channel()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   struct termios term_port;
 | 
				
			||||||
 | 
					   int opts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   printf("%s: \n",__func__ );
 | 
				
			||||||
 | 
					   switch (soc_type)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					       case BT_SOC_ROME:
 | 
				
			||||||
 | 
					       case BT_SOC_CHEROKEE:
 | 
				
			||||||
 | 
					       case BT_SOC_NAPIER:
 | 
				
			||||||
 | 
					           //Use hidl_client_initialize for chip initialization
 | 
				
			||||||
 | 
					           if (hidl_client_initialize(MODE_ANT,&fd_transport_ant_cmd) == false) {
 | 
				
			||||||
 | 
					               printf("%s: HIDL client initialization failed, opening port with init_transpor_ant\n", __func__);
 | 
				
			||||||
 | 
					               //Use libbt-vendor for chip initialization
 | 
				
			||||||
 | 
					               fd_transport_ant_cmd = init_transport_ant(TRUE);
 | 
				
			||||||
 | 
					               if (fd_transport_ant_cmd == -1) {
 | 
				
			||||||
 | 
					                   printf("%s: ANT Device open Failed, fd:%d: \n", __func__, fd_transport_ant_cmd);
 | 
				
			||||||
 | 
					                   return false;
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					           break;
 | 
				
			||||||
 | 
					       case BT_SOC_AR3K:
 | 
				
			||||||
 | 
					       case BT_SOC_SMD:
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					           printf("ftm_ant_open_channel --> \n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					           fd_transport_ant_cmd = open(APPS_RIVA_ANT_CMD_CH, (O_RDWR));
 | 
				
			||||||
 | 
					           if (fd_transport_ant_cmd == -1) {
 | 
				
			||||||
 | 
					               printf("Ant Device open Failed= %d\n ", fd_transport_ant_cmd);
 | 
				
			||||||
 | 
					               return false;
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					           // Blocking Read
 | 
				
			||||||
 | 
					           opts = fcntl(fd_transport_ant_cmd, F_GETFL);
 | 
				
			||||||
 | 
					           if (opts < 0) {
 | 
				
			||||||
 | 
					               perror("fcntl(F_GETFL)");
 | 
				
			||||||
 | 
					               exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					           opts = opts & (~O_NONBLOCK);
 | 
				
			||||||
 | 
					           if (fcntl(fd_transport_ant_cmd, F_SETFL, opts) < 0) {
 | 
				
			||||||
 | 
					               perror("fcntl(F_SETFL)");
 | 
				
			||||||
 | 
					               exit(EXIT_FAILURE);
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					           if (tcgetattr(fd_transport_ant_cmd, &term_port) < 0)
 | 
				
			||||||
 | 
					               close(fd_transport_ant_cmd);
 | 
				
			||||||
 | 
					           cfmakeraw(&term_port);
 | 
				
			||||||
 | 
					           if (tcsetattr(fd_transport_ant_cmd, TCSANOW, &term_port) < 0) {
 | 
				
			||||||
 | 
					               printf("\n Error while setting attributes\n");
 | 
				
			||||||
 | 
					               return false;
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					           tcflush(fd_transport_ant_cmd, TCIFLUSH);
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					           printf("ftm_ant_open_channel success \n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					           break;
 | 
				
			||||||
 | 
					       default:
 | 
				
			||||||
 | 
					           ALOGE("%s:Unknown soc type.",__func__);
 | 
				
			||||||
 | 
					           return false;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   if (pipe(ant_pipefd) == -1)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					       printf("pipe create error");
 | 
				
			||||||
 | 
					       return STATUS_FAIL;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   /* Creating read thread which listens for various masks & pkt requests */
 | 
				
			||||||
 | 
					   pthread_create( &ant_cmd_thread_hdl, NULL, ftm_ant_readerthread, NULL);
 | 
				
			||||||
 | 
					   return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int init_transport_ant(int on) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void *so_handle;
 | 
				
			||||||
 | 
					    unsigned char bdaddr[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
 | 
				
			||||||
 | 
					    int  fd[CH_MAX], powerstate, ret = -1;
 | 
				
			||||||
 | 
					    char ref_count[PROPERTY_VALUE_MAX];
 | 
				
			||||||
 | 
					    int value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (on) {
 | 
				
			||||||
 | 
					        so_handle = dlopen("libbt-vendor.so", RTLD_NOW);
 | 
				
			||||||
 | 
					        if (!so_handle)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					           ALOGE("Failed to load vendor component");
 | 
				
			||||||
 | 
					           return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        vendor_interface = (bt_vendor_interface_t *) dlsym(so_handle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
 | 
				
			||||||
 | 
					        if (!vendor_interface)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ALOGE("Failed to accesst bt vendor interface");
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        vendor_interface->init(&vendor_callbacks, bdaddr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ALOGI("Turn On BT power");
 | 
				
			||||||
 | 
					        powerstate = BT_VND_PWR_ON;
 | 
				
			||||||
 | 
					        ret = vendor_interface->op(BT_VND_OP_POWER_CTRL, &powerstate);
 | 
				
			||||||
 | 
					        if (ret < 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ALOGE("Failed to turn on power from  bt vendor interface");
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        for (int i = 0; i < CH_MAX; i++)
 | 
				
			||||||
 | 
					            fd[i] = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef ANDROID
 | 
				
			||||||
 | 
					        if (soc_type == BT_SOC_ROME || soc_type == BT_SOC_CHEROKEE || soc_type == BT_SOC_NAPIER) {
 | 
				
			||||||
 | 
					            /*call ANT_USERIAL_OPEN to get ANT handle*/
 | 
				
			||||||
 | 
					            ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_OPEN, fd);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#ifdef BT_SOC_TYPE_ROME
 | 
				
			||||||
 | 
					        /*call ANT_USERIAL_OPEN to get ANT handle*/
 | 
				
			||||||
 | 
					        ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_OPEN, fd);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        ALOGE("ret value: %d", ret);
 | 
				
			||||||
 | 
					        if (ret != 1)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ALOGE("Failed to get fd from  bt vendor interface");
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            ALOGE("FD: %x", fd[0]);
 | 
				
			||||||
 | 
					            return fd[0];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        if (vendor_interface) {
 | 
				
			||||||
 | 
					            ALOGE("Close and cleanup the interfaces");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef ANDROID
 | 
				
			||||||
 | 
					            if (soc_type == BT_SOC_ROME || soc_type == BT_SOC_CHEROKEE || soc_type == BT_SOC_NAPIER) {
 | 
				
			||||||
 | 
					                int ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_CLOSE, NULL);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#ifdef BT_SOC_TYPE_ROME
 | 
				
			||||||
 | 
					            int ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_CLOSE, NULL);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ALOGE("ret value: %d", ret);
 | 
				
			||||||
 | 
					            ALOGI("Turn off BT power");
 | 
				
			||||||
 | 
					            powerstate = BT_VND_PWR_OFF;
 | 
				
			||||||
 | 
					            ret = vendor_interface->op(BT_VND_OP_POWER_CTRL, &powerstate);
 | 
				
			||||||
 | 
					            if (ret < 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                ALOGE("Failed to turn off power from  bt vendor interface");
 | 
				
			||||||
 | 
					                return -1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            vendor_interface->cleanup();
 | 
				
			||||||
 | 
					            vendor_interface = NULL;
 | 
				
			||||||
 | 
					            return 0;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ALOGE("Not able to find vendor interface handle");
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_log_send_msg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Processes the buffer sent and sends it to the libdiag for sending the Cmd
 | 
				
			||||||
 | 
					  response
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void ftm_ant_log_send_msg(const uint8 *pEventBuf,int event_bytes)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   int result = log_status(LOG_FTM_VER_2_C);
 | 
				
			||||||
 | 
					   ftm_ant_log_pkt_type*  ftm_ant_log_pkt_ptr = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if((pEventBuf == NULL) || (event_bytes == 0))
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					   printf("ftm_ant_log_send_msg --> \n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					   if(result == 1)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      ftm_ant_log_pkt_ptr = (ftm_ant_log_pkt_type *)log_alloc(LOG_FTM_VER_2_C,
 | 
				
			||||||
 | 
					      FTM_ANT_LOG_HEADER_SIZE + (event_bytes-1));
 | 
				
			||||||
 | 
					      if(ftm_ant_log_pkt_ptr != NULL)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         /* FTM ANT Log PacketID */
 | 
				
			||||||
 | 
					         ftm_ant_log_pkt_ptr->ftm_log_id = FTM_ANT_LOG_PKT_ID;
 | 
				
			||||||
 | 
					         memcpy((void *)ftm_ant_log_pkt_ptr->data,(void *)pEventBuf,event_bytes);
 | 
				
			||||||
 | 
					         log_commit( ftm_ant_log_pkt_ptr );
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_ant_dispatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Dispatch routine for the various FM Rx/Tx commands. Copies the data into
 | 
				
			||||||
 | 
					  a global union data structure before calling the processing routine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  A Packed structre pointer including the response to the FTM FM packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void * ftm_ant_dispatch(ftm_ant_pkt_type *ant_ftm_pkt, uint16 pkt_len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   ftm_ant_generic_sudo_res *rsp;
 | 
				
			||||||
 | 
					   int err = 0, i;
 | 
				
			||||||
 | 
					   int data_len = ant_ftm_pkt->cmd_data_len;
 | 
				
			||||||
 | 
					   bool resp = false;
 | 
				
			||||||
 | 
					   unsigned char *pdata = NULL, *ptemp;
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					   printf("ftm_ant_dispatch --> \n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   UNUSED(pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   if (first_ant_command == 0) {
 | 
				
			||||||
 | 
					       first_ant_command = 1;
 | 
				
			||||||
 | 
					       ftm_ant_open_channel();
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   rsp = (ftm_ant_generic_sudo_res*)diagpkt_subsys_alloc( DIAG_SUBSYS_FTM
 | 
				
			||||||
 | 
					                                                , FTM_ANT_CMD_CODE
 | 
				
			||||||
 | 
					                                                , sizeof(ftm_ant_generic_sudo_res)
 | 
				
			||||||
 | 
					                                                );
 | 
				
			||||||
 | 
					   if(rsp ==  NULL)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					       printf("%s Failed to allocate resource",__func__);
 | 
				
			||||||
 | 
					       return NULL;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   switch (soc_type) {
 | 
				
			||||||
 | 
					      //Rome shares the same UART transport for ANT and BT. Hence, to differenciate the
 | 
				
			||||||
 | 
					      //packets by controller, adding one extra byte for ANT data and control packets
 | 
				
			||||||
 | 
					       case BT_SOC_ROME:
 | 
				
			||||||
 | 
					       case BT_SOC_CHEROKEE:
 | 
				
			||||||
 | 
					       case BT_SOC_NAPIER:
 | 
				
			||||||
 | 
					           data_len = data_len + 1;
 | 
				
			||||||
 | 
					           pdata = (unsigned char *) malloc(data_len);
 | 
				
			||||||
 | 
					           if (pdata == NULL) {
 | 
				
			||||||
 | 
					               ALOGE("Failed to allocate the memory for ANT command packet");
 | 
				
			||||||
 | 
					               rsp->result = FTM_ANT_FAIL;
 | 
				
			||||||
 | 
					               return (void *) rsp;
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					           //To be compatible with Legacy, SMD based PLs, send all the packets
 | 
				
			||||||
 | 
					           //with cmd opcode 0x0c
 | 
				
			||||||
 | 
					           pdata[0] = 0x0c;
 | 
				
			||||||
 | 
					           memcpy(pdata+1, ant_ftm_pkt->data, data_len-1);
 | 
				
			||||||
 | 
					           err = write(fd_transport_ant_cmd, pdata, data_len);
 | 
				
			||||||
 | 
					           ptemp = pdata;
 | 
				
			||||||
 | 
					           break;
 | 
				
			||||||
 | 
					       case BT_SOC_AR3K:
 | 
				
			||||||
 | 
					       case BT_SOC_SMD:
 | 
				
			||||||
 | 
					           /* Send the packet to controller and send a dummy response back to host*/
 | 
				
			||||||
 | 
					           err = write(fd_transport_ant_cmd, ant_ftm_pkt->data, data_len);
 | 
				
			||||||
 | 
					           ptemp = ant_ftm_pkt->data;
 | 
				
			||||||
 | 
					           break;
 | 
				
			||||||
 | 
					       default:
 | 
				
			||||||
 | 
					           ALOGE("%s:Unknown soc type", __func__);
 | 
				
			||||||
 | 
					           break;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   if (err == data_len) {
 | 
				
			||||||
 | 
					       rsp->result = FTM_ANT_SUCCESS;
 | 
				
			||||||
 | 
					       printf("ANT CMD: ");
 | 
				
			||||||
 | 
					       for (i = 1; i<data_len; i++) {
 | 
				
			||||||
 | 
					           printf("%02X ", ptemp[i]);
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					       printf("\n");
 | 
				
			||||||
 | 
					   } else {
 | 
				
			||||||
 | 
					       rsp->result = FTM_ANT_FAIL;
 | 
				
			||||||
 | 
					       printf("FTM ANT write fail len: %d\n", err);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   if (pdata)
 | 
				
			||||||
 | 
					     free(pdata);
 | 
				
			||||||
 | 
					   return (void *)rsp;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_qcomm_handle_event
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					 Routine called by the HAL layer reader thread to process the HCI events
 | 
				
			||||||
 | 
					 The post conditions of each event is covered in a state machine pattern
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  FALSE = failure, else TRUE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					boolean ftm_ant_qcomm_handle_event ()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   boolean status = TRUE;
 | 
				
			||||||
 | 
					   int nbytes,i,len =0;
 | 
				
			||||||
 | 
					   int event_type;
 | 
				
			||||||
 | 
					   ftm_ant_generic_res *res = (ftm_ant_generic_res *)diagpkt_subsys_alloc(
 | 
				
			||||||
 | 
					                                   DIAG_SUBSYS_FTM
 | 
				
			||||||
 | 
					                                   , FTM_ANT_CMD_CODE
 | 
				
			||||||
 | 
					                                   , sizeof(ftm_ant_generic_res)
 | 
				
			||||||
 | 
					                               );
 | 
				
			||||||
 | 
					   if(res ==  NULL)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					       printf("%s Failed to allocate res",__func__);
 | 
				
			||||||
 | 
					       tcflush(fd_transport_ant_cmd, TCIFLUSH);
 | 
				
			||||||
 | 
					       return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					   printf("ftm_ant_hci_qcomm_handle_event --> \n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* Read length and event type  of Ant Resp event*/
 | 
				
			||||||
 | 
					   nbytes = read(fd_transport_ant_cmd, (void *)res->evt, 2);
 | 
				
			||||||
 | 
					   if(nbytes <= 0) {
 | 
				
			||||||
 | 
					      status = FALSE;
 | 
				
			||||||
 | 
					      printf("ftm_ant_qcomm_handle_event read fail len=%d\n", nbytes);
 | 
				
			||||||
 | 
					      return status;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   event_type = res->evt[0];
 | 
				
			||||||
 | 
					   len = res->evt[1];
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					   printf(" event type  =%d\n",event_type);
 | 
				
			||||||
 | 
					   printf("length of event =%d\n",len);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					   /* Read out the Ant Resp event*/
 | 
				
			||||||
 | 
					   if (len <= (int)sizeof(res->evt))
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      nbytes = read(fd_transport_ant_cmd, (void *)res->evt, len);
 | 
				
			||||||
 | 
					      if (nbytes != len) {
 | 
				
			||||||
 | 
					          res->result = FTM_ANT_FAIL;
 | 
				
			||||||
 | 
					          status = FALSE;
 | 
				
			||||||
 | 
					          printf("ftm_ant_qcomm_handle_event read fail len=%d\n", nbytes);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else  {
 | 
				
			||||||
 | 
					          res->result = FTM_ANT_SUCCESS;
 | 
				
			||||||
 | 
					          printf("ANT EVT: ");
 | 
				
			||||||
 | 
					          for (i=0; i<nbytes; i++) {
 | 
				
			||||||
 | 
					            printf("%02X ", res->evt[i]);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          printf("\n");
 | 
				
			||||||
 | 
					          ftm_ant_log_send_msg(res->evt, nbytes);
 | 
				
			||||||
 | 
					          tcflush(fd_transport_ant_cmd, TCIOFLUSH);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   else
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					       res->result = FTM_ANT_FAIL;
 | 
				
			||||||
 | 
					       status = FALSE;
 | 
				
			||||||
 | 
					       printf("ftm_ant_qcomm_handle_event read fail len=%d is more than sizeof(res->evt)=%d\n", len, (int)sizeof(res->evt));
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   return status;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										124
									
								
								feeds/ipq95xx/ftm/src/ftm_ant_common.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										124
									
								
								feeds/ipq95xx/ftm/src/ftm_ant_common.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,124 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM FM Common Header File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					  Global Data declarations of the ftm ant component.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2012,2014 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who      what, where, why
 | 
				
			||||||
 | 
					--------   ---      ----------------------------------------------------------
 | 
				
			||||||
 | 
					05/16/2012 ankurn   Adding support for ANT+
 | 
				
			||||||
 | 
					11/28/12  c_ssugas  Adds data structures and macro for ant log event support.
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_FTM_ANT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "diagpkt.h"
 | 
				
			||||||
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					#include "ftm_bt_common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define APPS_RIVA_ANT_CMD_CH            "/dev/smd5"
 | 
				
			||||||
 | 
					#define APPS_RIVA_ANT_DATA_CH           "/dev/smd6"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_ANT_CMD_CODE                94
 | 
				
			||||||
 | 
					#define OPCODE_OFFSET                   5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_ANT_LOG_HEADER_SIZE (sizeof(ftm_ant_log_pkt_type) - 1)
 | 
				
			||||||
 | 
					#define FTM_ANT_LOG_PKT_ID 0x0D
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FTM Log Packet - Used to send back the event of a ANT Command */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   log_hdr_type hdr;
 | 
				
			||||||
 | 
					   word         ftm_log_id;     /* FTM log id */
 | 
				
			||||||
 | 
					   byte         data[1];        /* Variable length payload,
 | 
				
			||||||
 | 
					                                 look at FTM log id for contents */
 | 
				
			||||||
 | 
					} ftm_ant_log_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Generic result, used for any command that only returns an error code */
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					     FTM_ANT_FAIL,
 | 
				
			||||||
 | 
					     FTM_ANT_SUCCESS,
 | 
				
			||||||
 | 
					} ftm_ant_api_result_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    diagpkt_subsys_header_type  header ;
 | 
				
			||||||
 | 
					    char    result ;
 | 
				
			||||||
 | 
					} ftm_ant_generic_sudo_res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Generic Response */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header; /*Diag header*/
 | 
				
			||||||
 | 
					  uint8     evt[18];  /*allocates memory to hold longest valid event */
 | 
				
			||||||
 | 
					  char      result; /* result */
 | 
				
			||||||
 | 
					}__attribute__((packed)) ftm_ant_generic_res;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FTM ANT request type */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_cmd_code_type              cmd_code;
 | 
				
			||||||
 | 
					  diagpkt_subsys_id_type             subsys_id;
 | 
				
			||||||
 | 
					  diagpkt_subsys_cmd_code_type       subsys_cmd_code;
 | 
				
			||||||
 | 
					  uint8                              cmd_id; /* command id (required) */
 | 
				
			||||||
 | 
					  uint8                              cmd_data_len;
 | 
				
			||||||
 | 
					  byte                               data[1];
 | 
				
			||||||
 | 
					}__attribute__((packed))ftm_ant_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_ant_dispatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Dispatch routine for the various ANT commands. Copies the data into
 | 
				
			||||||
 | 
					  a global union data structure before calling the processing routine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  A Packed structre pointer including the response to the FTM ANT packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void * ftm_ant_dispatch(ftm_ant_pkt_type *ftm_ant_pkt, uint16 length );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_ant_qcomm_handle_event
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Handler for the various ANT Events received. Sends data as log packets
 | 
				
			||||||
 | 
					  using diag to upper layers.
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  Status value TRUE if event received successfuly
 | 
				
			||||||
 | 
					  otherwise returns status value FALSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					boolean ftm_ant_qcomm_handle_event ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* CONFIG_FTM_ANT */
 | 
				
			||||||
							
								
								
									
										2013
									
								
								feeds/ipq95xx/ftm/src/ftm_bt.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2013
									
								
								feeds/ipq95xx/ftm/src/ftm_bt.c
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										289
									
								
								feeds/ipq95xx/ftm/src/ftm_bt.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										289
									
								
								feeds/ipq95xx/ftm/src/ftm_bt.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,289 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM BT Task Header File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					  Global Data declarations of the ftm bt component.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010-2011, 2013-2014 by Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					# All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					09/28/11   rrr      Moved peristent NV item related APIs to CPP,
 | 
				
			||||||
 | 
					                    for having BD address being programmed twice if previous
 | 
				
			||||||
 | 
					                    BD address was random generated.
 | 
				
			||||||
 | 
					09/03/11   agaja    Added support for NV_READ and NV_WRITE Commands to write
 | 
				
			||||||
 | 
					                    onto Persist File system
 | 
				
			||||||
 | 
					02/08/11   braghave Changes to read the HCI commands from a binary file for
 | 
				
			||||||
 | 
							    non-Android case
 | 
				
			||||||
 | 
					06/18/10   rakeshk  Created a header file to hold the definitons for ftm bt
 | 
				
			||||||
 | 
					                    task
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef  CONFIG_FTM_BT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "diagpkt.h"
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#ifdef USE_LIBSOCCFG
 | 
				
			||||||
 | 
					#include "btqsocnvm.h"
 | 
				
			||||||
 | 
					#include "btqsocnvmutils.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -------------------------------------------------------------------------
 | 
				
			||||||
 | 
					** Definitions and Declarations
 | 
				
			||||||
 | 
					** ------------------------------------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_BT_CMD_CODE 4          /* BT FTM Command code */
 | 
				
			||||||
 | 
					#define FTM_FM_CMD_CODE 28         /* FM FTM Command code */
 | 
				
			||||||
 | 
					#define HCI_EVT_HDR_SIZE  3
 | 
				
			||||||
 | 
					#define HCI_ACL_HDR_SIZE  5
 | 
				
			||||||
 | 
					#define PROTOCOL_BYTE_SIZE 1
 | 
				
			||||||
 | 
					#define HC_VS_MAX_CMD_EVENT  260
 | 
				
			||||||
 | 
					#define HC_VS_MAX_ACL  1200
 | 
				
			||||||
 | 
					#define FTM_BT_HCI_USER_CMD 0
 | 
				
			||||||
 | 
					#define BT_FTM_CMD_RSP_LEN 1100
 | 
				
			||||||
 | 
					#define FTM_BT_DRV_START_TEST 0xA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* MACROS for pin connectivty test*/
 | 
				
			||||||
 | 
					#define BT_CMD_SLIM_TEST          0xBFAC
 | 
				
			||||||
 | 
					#define LOOP_BACK_EVT_OGF         0x02
 | 
				
			||||||
 | 
					#define LOOP_BACK_EVT_OCF         0x18
 | 
				
			||||||
 | 
					#define LOOP_BACK_EVT_STATUS      0x00
 | 
				
			||||||
 | 
					#define LOOP_BACK_EVT_OGF_BIT     0x04
 | 
				
			||||||
 | 
					#define LOOP_BACK_EVT_OCF_BIT     0x05
 | 
				
			||||||
 | 
					#define LOOP_BACK_EVT_STATUS_BIT  0x06
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_BT_LOG_HEADER_SIZE (sizeof(ftm_bt_log_pkt_type) - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Vendor Specific command codes */
 | 
				
			||||||
 | 
					#define BT_QSOC_EDL_CMD_OPCODE             (0xFC00)
 | 
				
			||||||
 | 
					#define BT_QSOC_NVM_ACCESS_OPCODE          (0xFC0B)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BT_QSOC_EDL_CMD_CODE             (0x00)
 | 
				
			||||||
 | 
					#define BT_QSOC_NVM_ACCESS_CODE          (0x0B)
 | 
				
			||||||
 | 
					#define BT_QSOC_VS_EDL_APPVER_RESP   	(0x02)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef HC_VS_MAX_CMD_EVENT
 | 
				
			||||||
 | 
					#define HC_VS_MAX_CMD_EVENT  260
 | 
				
			||||||
 | 
					#endif /* HC_VS_MAX_CMD_EVENT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BT_QSOC_MAX_NVM_CMD_SIZE     0x64  /* Maximum size config (NVM) cmd  */
 | 
				
			||||||
 | 
					#define BT_QSOC_MAX_BD_ADDRESS_SIZE  0x06  /**< Length of BT Address */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef HCI_CMD_HDR_SIZE
 | 
				
			||||||
 | 
					#define HCI_CMD_HDR_SIZE  4
 | 
				
			||||||
 | 
					#endif /* HCI_CMD_HDR_SIZE */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef HCI_EVT_HDR_SIZE
 | 
				
			||||||
 | 
					#define HCI_EVT_HDR_SIZE  3
 | 
				
			||||||
 | 
					#endif /* HCI_EVT_HDR_SIZE */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_BT_LOG_PKT_ID 0x01
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BT_HCI_CMD_PKT 0x01
 | 
				
			||||||
 | 
					#define BT_HCI_ACL_PKT 0x02
 | 
				
			||||||
 | 
					#define BT_HCI_EVT_PKT 0x04
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define BT_HCI_CMD_CMPLT_EVT 0x0E
 | 
				
			||||||
 | 
					#define FM_HCI_EVT_PKT 0x14
 | 
				
			||||||
 | 
					#define FM_HCI_CMD_PKT 0x11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int boardtype;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* VS command structure */
 | 
				
			||||||
 | 
					typedef struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8  vs_cmd_len;
 | 
				
			||||||
 | 
					  uint8  vs_cmd_data[BT_QSOC_MAX_NVM_CMD_SIZE];
 | 
				
			||||||
 | 
					} bt_qsoc_cfg_tbl_struct_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* First Commamd structure - Used to store the First command for later
 | 
				
			||||||
 | 
					*  processing
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					struct first_cmd
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8 *cmd_buf;
 | 
				
			||||||
 | 
					  int cmd_len;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FTM Global State - Enum defines the various states of the FTM
 | 
				
			||||||
 | 
					* module
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef enum ftm_state
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FTM_SOC_NOT_INITIALISED,
 | 
				
			||||||
 | 
					  FTM_SOC_READ_APP_VER,
 | 
				
			||||||
 | 
					  FTM_SOC_READ_HW_VER,
 | 
				
			||||||
 | 
					  FTM_SOC_POKE8_TBL_INIT,
 | 
				
			||||||
 | 
					  FTM_SOC_DOWNLOAD_NVM,
 | 
				
			||||||
 | 
					  FTM_SOC_DOWNLOAD_NVM_EFS,
 | 
				
			||||||
 | 
					  FTM_SOC_SLEEP_DISABLE,
 | 
				
			||||||
 | 
					  FTM_SOC_RESET,
 | 
				
			||||||
 | 
					  FTM_SOC_INITIALISED
 | 
				
			||||||
 | 
					}ftm_state;
 | 
				
			||||||
 | 
					/* FTM CMD status */
 | 
				
			||||||
 | 
					typedef enum ftm_log_packet_type
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FTM_USER_CMD_PASS,
 | 
				
			||||||
 | 
					  FTM_USER_CMD_FAIL,
 | 
				
			||||||
 | 
					  FTM_HCI_EVENT
 | 
				
			||||||
 | 
					}ftm_log_packet_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FTM Log Packet - Used to send back the event of a HCI Command */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  log_hdr_type hdr;
 | 
				
			||||||
 | 
					  byte         data[1];         /* Variable length payload,
 | 
				
			||||||
 | 
					                                   look at FTM log id for contents */
 | 
				
			||||||
 | 
					} ftm_bt_log_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FTM (BT) PKT Header */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  word cmd_id;            /* command id (required) */
 | 
				
			||||||
 | 
					  word cmd_data_len;      /* request pkt data length, excluding the diag and ftm headers
 | 
				
			||||||
 | 
					                             (optional, set to 0 if not used)*/
 | 
				
			||||||
 | 
					  word cmd_rsp_pkt_size;  /* rsp pkt size, size of response pkt if different then req pkt
 | 
				
			||||||
 | 
					                             (optional, set to 0 if not used)*/
 | 
				
			||||||
 | 
					} ftm_bt_cmd_header_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Bluetooth FTM packet */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type diag_hdr;
 | 
				
			||||||
 | 
					  ftm_bt_cmd_header_type     ftm_hdr;
 | 
				
			||||||
 | 
					  byte                       data[1];
 | 
				
			||||||
 | 
					} ftm_bt_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* SoC Cfg open Struct*/
 | 
				
			||||||
 | 
					#ifdef USE_LIBSOCCFG
 | 
				
			||||||
 | 
					typedef struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   bt_qsoc_config_params_struct_type run_time_params;
 | 
				
			||||||
 | 
					   bt_qsoc_enum_nvm_mode nvm_mode;
 | 
				
			||||||
 | 
					   bt_qsoc_enum_type soc_type;
 | 
				
			||||||
 | 
					}ftm_bt_soc_runtime_cfg_type;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_err_timedout
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  This routine triggers the shutdown of the HCI and Power resources in case
 | 
				
			||||||
 | 
					  a HCI command previously sent times out.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void ftm_bt_err_timedout();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_dispatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Processes the BT FTM packet and dispatches the command to FTM HCI driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  NIL,The error in the Command Processing is sent to the DIAG App on PC via
 | 
				
			||||||
 | 
					  log packets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void ftm_bt_dispatch(void *ftm_bt_pkt ,int cmd_len );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   bt_hci_send_ftm_cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					 Helper Routine to process the HCI cmd and invokes the sub routines to intialise
 | 
				
			||||||
 | 
					 the SoC if needed based on the state of the FTM module
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  FALSE = failure, else TRUE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					boolean ftm_bt_hci_send_cmd
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					  uint8 * cmd_buf,   /* pointer to Cmd */
 | 
				
			||||||
 | 
					  uint16 cmd_len     /* Cmd length */
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   bt_hci_hal_vs_sendcmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					 Helper Routine to process the VS HCI cmd and constucts the HCI packet before
 | 
				
			||||||
 | 
					 calling bt_hci_send_ftm_cmd routine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  FALSE = failure, else TRUE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_hci_hal_vs_sendcmd
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					uint16 opcode,       /* Opcode */
 | 
				
			||||||
 | 
					uint8  *pCmdBuffer,  /* Pointer to Payload*/
 | 
				
			||||||
 | 
					uint8  nSize         /* Cmd Size */
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   isLatestTarget
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					For all the target/solution which has Bluedroid as stack and libbt-vendor as
 | 
				
			||||||
 | 
					vendor initialization component considered as latest target
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  FALSE = failure, else TRUE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean isLatestTarget();
 | 
				
			||||||
 | 
					char *get_current_time(void);
 | 
				
			||||||
 | 
					#endif /* CONFIG_FTM_BT */
 | 
				
			||||||
							
								
								
									
										115
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_common.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										115
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_common.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,115 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM BT Commom Header File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					  The header file includes helper enums for request_status and bt_power_state.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010-2011, 2014 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					09/28/11   rrr      Common utility API abstracted,
 | 
				
			||||||
 | 
					06/18/10   rakeshk  Created a header file to hold the  helper enums for
 | 
				
			||||||
 | 
					                    request_status and bt_power_state
 | 
				
			||||||
 | 
					========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef  CONFIG_FTM_BT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "event.h"
 | 
				
			||||||
 | 
					#include "msg.h"
 | 
				
			||||||
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "diag_lsm.h"
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __FTM_BT_COMMON_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define __FTM_BT_COMMON_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TRUE 1
 | 
				
			||||||
 | 
					#define FALSE 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* request_status - enum to encapuslate the status of a HAL request*/
 | 
				
			||||||
 | 
					typedef enum request_status
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  STATUS_SUCCESS,
 | 
				
			||||||
 | 
					  STATUS_FAIL,
 | 
				
			||||||
 | 
					  STATUS_NO_RESOURCES,
 | 
				
			||||||
 | 
					  STATUS_SHORT_WRITE,
 | 
				
			||||||
 | 
					  STATUS_SHORT_READ
 | 
				
			||||||
 | 
					}request_status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* request_status - enum to encapuslate the possible statea of BT power*/
 | 
				
			||||||
 | 
					typedef enum bt_power_state
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  BT_OFF = 0x30, /* Its the value 0 to be input to rfkill driver */
 | 
				
			||||||
 | 
					  BT_ON = 0x31 /* ASCII value for '1'*/
 | 
				
			||||||
 | 
					}bt_power_state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FTM_BT_DRV_NO_ERR = 0,
 | 
				
			||||||
 | 
					  FTM_BT_DRV_CONN_TEST_FAILS,
 | 
				
			||||||
 | 
					  FTM_BT_DRV_QSOC_POWERUP_FAILS,
 | 
				
			||||||
 | 
					  FTM_BT_DRV_RX_PKT_TYPE_NOT_SUPPORTED,
 | 
				
			||||||
 | 
					  FTM_BT_DRV_SIO_OPEN_FAILS,
 | 
				
			||||||
 | 
					  FTM_BT_DRV_NO_SOC_RSP_TOUT,
 | 
				
			||||||
 | 
					  FTM_BT_DRV_BAD_NVM,
 | 
				
			||||||
 | 
					#ifdef BT_NV_SUPPORT
 | 
				
			||||||
 | 
					  FTM_BT_NV_READ_FAIL,
 | 
				
			||||||
 | 
					  FTM_BT_NV_WRITE_FAIL,
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  FTM_BT_DRV_UNKNOWN_ERR
 | 
				
			||||||
 | 
					} ftm_bt_drv_err_state_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_qcomm_handle_event
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Routine called by the HAL layer reader thread to process the HCI events
 | 
				
			||||||
 | 
					  The post conditions of each event is covered in a state machine pattern
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  FALSE = failure, else TRUE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_hci_qcomm_handle_event();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_log_send_msg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Processes the buffer sent and sends it to the libdiag for sending the Cmd
 | 
				
			||||||
 | 
					  response
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ftm_log_send_msg(const uint8 *pEventBuf,int event_bytes);
 | 
				
			||||||
 | 
					#endif //__FTM_BT_COMMON_H__
 | 
				
			||||||
 | 
					#endif /* CONFIG_FTM_BT */
 | 
				
			||||||
							
								
								
									
										161
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_hci_hal.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										161
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_hci_hal.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,161 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM BT HCI PFAL Header File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   Warpper API definitions of the ftm bt hci hal component.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					06/18/10   rakeshk  Created a header file to hold the wrapper HAL
 | 
				
			||||||
 | 
					                    definitions for HCI UART control
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "ftm_bt_common.h"
 | 
				
			||||||
 | 
					#include "ftm_bt_hci_pfal.h"
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_hal_set_transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  sets the type of transport based on the msm type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					returns the type of transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_hci_hal_set_transport()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   return ftm_bt_hci_pfal_set_transport();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_hal_deinit_transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform independent wrapper API which intiatea a De-intialise of UART/SMD
 | 
				
			||||||
 | 
					  resources with PFAL layer and returns the status of the PFAL operation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_hal_deinit_transport()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return ftm_bt_hci_pfal_deinit_transport();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_hal_init_transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform independent wrapper API which intiatea a intialise of UART/SMD
 | 
				
			||||||
 | 
					  resources with PFAL layer and returns the status of the PFAL operation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_hal_init_transport (int mode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return ftm_bt_hci_pfal_init_transport(mode);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_hal_nwrite
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform independent wrapper API which intiates a write operation
 | 
				
			||||||
 | 
					  with the PFAL layer and returns the status of the PFAL operation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_hal_nwrite(uint8 *buf, int size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return ftm_bt_hci_pfal_nwrite(buf,size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_hal_nread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform independent wrapper API which intiates a read operation
 | 
				
			||||||
 | 
					  with the PFAL layer and returns the status of the PFAL operation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_hal_nread(uint8 *buf, int size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return ftm_bt_hci_pfal_nread(buf,size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_hal_changebaudrate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform independent wrapper API which intiatea a UART baud rate change
 | 
				
			||||||
 | 
					  with the PFAL layer and returns the status of the PFAL request.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  TRUE if SUCCESS, else FAIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_hci_hal_changebaudrate (uint32 new_baud)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return ftm_bt_hci_pfal_changebaudrate(new_baud);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										177
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_hci_pfal.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										177
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_hci_pfal.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,177 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM BT HCI PFAL Header File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   PFAL API declarations of the ftm bt hci pfal component.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					06/18/10   rakeshk  Created a header file to hold the PFAL declarations for
 | 
				
			||||||
 | 
					                    HCI UART programming
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					#include "ftm_bt_common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __FTM_BT_HCI_PFAL_H__
 | 
				
			||||||
 | 
					#define __FTM_BT_HCI_PFAL_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PIN_CON_CMD_OGF               0xFC
 | 
				
			||||||
 | 
					#define PIN_CON_CMD_OCF               0x0C
 | 
				
			||||||
 | 
					#define PIN_CON_CMD_SUB_OP            0x38
 | 
				
			||||||
 | 
					#define PIN_CON_INTERFACE_ID          0x01
 | 
				
			||||||
 | 
					#define PIN_CON_EVENT_LEN             0x06
 | 
				
			||||||
 | 
					#define EXT_PIN_CON_LEN               0x02
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PIN_CON_CMD_OCF_BIT           0x01
 | 
				
			||||||
 | 
					#define PIN_CON_CMD_OGF_BIT           0x02
 | 
				
			||||||
 | 
					#define PIN_CON_CMD_SUBOP_BIT         0x04
 | 
				
			||||||
 | 
					#define PIN_CON_CMD_INTER_BIT         0x05
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PIN_CON_EVT_OGF_BIT           0x05
 | 
				
			||||||
 | 
					#define PIN_CON_EVT_OCF_BIT           0x04
 | 
				
			||||||
 | 
					#define PIN_CON_EVT_SUB_OP_BIT        0x07
 | 
				
			||||||
 | 
					#define PIN_CON_INTERFACE_ID_EVT_BIT  0x08
 | 
				
			||||||
 | 
					#define PIN_CON_EVENT_LEN_BIT         0x02
 | 
				
			||||||
 | 
					#define PIN_CON_EVT_STATUS_BIT        0x06
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LOG_TAG "ftmdaemon"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PRI_INFO " I"
 | 
				
			||||||
 | 
					#define PRI_WARN " W"
 | 
				
			||||||
 | 
					#define PRI_ERROR " E"
 | 
				
			||||||
 | 
					#define PRI_DEBUG " D"
 | 
				
			||||||
 | 
					#define PRI_VERB " V"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ALOG(pri, tag, fmt, arg...) fprintf(stderr, tag pri ": " fmt"\n", ##arg)
 | 
				
			||||||
 | 
					#define ALOGV(fmt, arg...) ALOG(PRI_VERB, LOG_TAG, fmt, ##arg)
 | 
				
			||||||
 | 
					#define ALOGD(fmt, arg...) ALOG(PRI_DEBUG, LOG_TAG, fmt, ##arg)
 | 
				
			||||||
 | 
					#define ALOGI(fmt, arg...) ALOG(PRI_INFO, LOG_TAG, fmt, ##arg)
 | 
				
			||||||
 | 
					#define ALOGW(fmt, arg...) ALOG(PRI_WARN, LOG_TAG, fmt, ##arg)
 | 
				
			||||||
 | 
					#define ALOGE(fmt, arg...) ALOG(PRI_ERROR, LOG_TAG, fmt, ##arg)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_set_transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					 sets the type of transport based on the msm type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					returns the type of transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_hci_pfal_set_transport(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_deinit_transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform specific routine to de-intialise the UART/SMD resource.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_pfal_deinit_transport();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_init_transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform specific routine to intialise the UART/SMD resources.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_pfal_init_transport ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_nwrite
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform specific routine to write the data in the argument to the UART/SMD
 | 
				
			||||||
 | 
					  port intialised.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_pfal_nwrite(uint8 *buf, int size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_nread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform specific routine to read data from the UART/SMD port intialised into
 | 
				
			||||||
 | 
					  the buffer passed in argument.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_pfal_nread(uint8 *buf, int size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_changebaudrate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform specific routine to intiate a change in baud rate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  TRUE if SUCCESS, else FALSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_hci_pfal_changebaudrate (uint32 new_baud);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif //__FTM_BT_HCI_PFAL_H__
 | 
				
			||||||
							
								
								
									
										674
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_hci_pfal_linux.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										674
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_hci_pfal_linux.c
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,674 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM Platform specfic HCI UART/SMD File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					  Platform specific routines to program the UART/SMD descriptors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010-2011, 2013 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					06/07/11   bneti       Add support smd support for msm8960
 | 
				
			||||||
 | 
					06/18/10   rakeshk  Created a source file to implement platform specific
 | 
				
			||||||
 | 
					                    routines for UART
 | 
				
			||||||
 | 
					07/07/10   rakeshk  Removed the conversion of 3.2 Mbps baud rate
 | 
				
			||||||
 | 
					01/07/10   rakeshk  Added support for verbose logging of Cmd and events
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <sys/select.h>
 | 
				
			||||||
 | 
					#include <termios.h>
 | 
				
			||||||
 | 
					#include <pthread.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <dlfcn.h>
 | 
				
			||||||
 | 
					#include "bt_vendor_lib.h"
 | 
				
			||||||
 | 
					#include "ftm_bt_hci_pfal.h"
 | 
				
			||||||
 | 
					#include "ftm_common.h"
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					#include <cutils/properties.h>
 | 
				
			||||||
 | 
					#include "hidl_client.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef ANDROID
 | 
				
			||||||
 | 
					#define VENDOR_LIB "libbt-vendor.so"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define VENDOR_LIB "libbt-vendor.so.0"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint8_t is_slim_bus_test = 0;
 | 
				
			||||||
 | 
					#define UNUSED(x) (void)(x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*identify the transport type*/
 | 
				
			||||||
 | 
					static char *transport_dev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    BT_SOC_DEFAULT = 0,
 | 
				
			||||||
 | 
					    BT_SOC_SMD = BT_SOC_DEFAULT,
 | 
				
			||||||
 | 
					    BT_SOC_AR3K,
 | 
				
			||||||
 | 
					    BT_SOC_ROME,
 | 
				
			||||||
 | 
					    BT_SOC_CHEROKEE,
 | 
				
			||||||
 | 
					    BT_SOC_NAPIER,
 | 
				
			||||||
 | 
					    /* Add chipset type here */
 | 
				
			||||||
 | 
					    BT_SOC_RESERVED
 | 
				
			||||||
 | 
					} bt_soc_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void vendor_fwcfg_cb(bt_vendor_op_result_t result) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_scocfg_cb(bt_vendor_op_result_t result) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_lpm_vnd_cb(bt_vendor_op_result_t result) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_audio_state_cb(bt_vendor_op_result_t result) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void* vendor_alloc(int size) {
 | 
				
			||||||
 | 
					    UNUSED(size);
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_dealloc(void *p_buf) {
 | 
				
			||||||
 | 
					    UNUSED(p_buf);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static uint8_t vendor_xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback) {
 | 
				
			||||||
 | 
					    UNUSED(opcode);
 | 
				
			||||||
 | 
					    UNUSED(p_buf);
 | 
				
			||||||
 | 
					    UNUSED(p_cback);
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_epilog_cb(bt_vendor_op_result_t result) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static void vendor_a2dp_offload_cb(bt_vendor_op_result_t result, bt_vendor_opcode_t op, unsigned char handle) {
 | 
				
			||||||
 | 
					    UNUSED(result);
 | 
				
			||||||
 | 
					    UNUSED(op);
 | 
				
			||||||
 | 
					    UNUSED(handle);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bt_vendor_interface_t *vendor_interface=NULL;
 | 
				
			||||||
 | 
					static const bt_vendor_callbacks_t vendor_callbacks = {
 | 
				
			||||||
 | 
					  sizeof(bt_vendor_callbacks_t),
 | 
				
			||||||
 | 
					    vendor_fwcfg_cb,
 | 
				
			||||||
 | 
					    vendor_scocfg_cb,
 | 
				
			||||||
 | 
					    vendor_lpm_vnd_cb,
 | 
				
			||||||
 | 
					    vendor_audio_state_cb,
 | 
				
			||||||
 | 
					    vendor_alloc,
 | 
				
			||||||
 | 
					    vendor_dealloc,
 | 
				
			||||||
 | 
					    vendor_xmit_cb,
 | 
				
			||||||
 | 
					    vendor_epilog_cb,
 | 
				
			||||||
 | 
					    vendor_a2dp_offload_cb
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*BT HS UART TTY DEVICE */
 | 
				
			||||||
 | 
					#define BT_HS_UART_DEVICE "/dev/ttyHS0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*BT RIVA-SMD CHANNELS */
 | 
				
			||||||
 | 
					#define APPS_RIVA_BT_ACL_CH  "/dev/smd2"
 | 
				
			||||||
 | 
					#define APPS_RIVA_BT_CMD_CH  "/dev/smd3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Variables to identify the platform */
 | 
				
			||||||
 | 
					char transport_type[PROPERTY_VALUE_MAX];
 | 
				
			||||||
 | 
					static boolean is_transportSMD;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int soc_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Reader thread handle */
 | 
				
			||||||
 | 
					pthread_t hci_cmd_thread_hdl;
 | 
				
			||||||
 | 
					/* Pipe file descriptors for cancelling read operation */
 | 
				
			||||||
 | 
					int pipefd[2];
 | 
				
			||||||
 | 
					/* Transport file descriptor */
 | 
				
			||||||
 | 
					int fd_transport;
 | 
				
			||||||
 | 
					/* Starting baud rate to init the tty device */
 | 
				
			||||||
 | 
					int starting_baud = 115200;
 | 
				
			||||||
 | 
					/* Verbose output monitoring variable */
 | 
				
			||||||
 | 
					int verbose = 1;
 | 
				
			||||||
 | 
					/* Defintion to convert integer baud rate to the
 | 
				
			||||||
 | 
					 * Data type understood by tty device
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define BAUDCLAUS(i) case (i): return ( B##i )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   convert_baud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Routine to convert the integer baud rate to type speed_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  Converted Baud rate, else default 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					static speed_t convert_baud(uint32 baud_rate)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  switch (baud_rate)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    BAUDCLAUS(50);
 | 
				
			||||||
 | 
					    BAUDCLAUS(75);
 | 
				
			||||||
 | 
					    BAUDCLAUS(110);
 | 
				
			||||||
 | 
					    BAUDCLAUS(134);
 | 
				
			||||||
 | 
					    BAUDCLAUS(150);
 | 
				
			||||||
 | 
					    BAUDCLAUS(200);
 | 
				
			||||||
 | 
					    BAUDCLAUS(300);
 | 
				
			||||||
 | 
					    BAUDCLAUS(600);
 | 
				
			||||||
 | 
					    BAUDCLAUS(1200);
 | 
				
			||||||
 | 
					    BAUDCLAUS(1800);
 | 
				
			||||||
 | 
					    BAUDCLAUS(2400);
 | 
				
			||||||
 | 
					    BAUDCLAUS(4800);
 | 
				
			||||||
 | 
					    BAUDCLAUS(9600);
 | 
				
			||||||
 | 
					    BAUDCLAUS(19200);
 | 
				
			||||||
 | 
					    BAUDCLAUS(38400);
 | 
				
			||||||
 | 
					    BAUDCLAUS(57600);
 | 
				
			||||||
 | 
					    BAUDCLAUS(115200);
 | 
				
			||||||
 | 
					    BAUDCLAUS(230400);
 | 
				
			||||||
 | 
					    BAUDCLAUS(460800);
 | 
				
			||||||
 | 
					    BAUDCLAUS(500000);
 | 
				
			||||||
 | 
					    BAUDCLAUS(576000);
 | 
				
			||||||
 | 
					    BAUDCLAUS(921600);
 | 
				
			||||||
 | 
					    BAUDCLAUS(1000000);
 | 
				
			||||||
 | 
					    BAUDCLAUS(1152000);
 | 
				
			||||||
 | 
					    BAUDCLAUS(1500000);
 | 
				
			||||||
 | 
					    BAUDCLAUS(2000000);
 | 
				
			||||||
 | 
					    BAUDCLAUS(2500000);
 | 
				
			||||||
 | 
					    BAUDCLAUS(3000000);
 | 
				
			||||||
 | 
					    BAUDCLAUS(3500000);
 | 
				
			||||||
 | 
					    BAUDCLAUS(4000000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default: return 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_readerthread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Thread Routine to perfom asynchrounous handling of events coming on Uart/Smd
 | 
				
			||||||
 | 
					  descriptor. It invokes a callback to the FTM BT layer to intiate a request
 | 
				
			||||||
 | 
					  to read event bytes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  The LifeTime of ReaderThraad is dependent on the status returned by the
 | 
				
			||||||
 | 
					  call to ftm_bt_hci_qcomm_handle_event
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void *ftm_readerthread(void *ptr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  UNUSED(ptr);
 | 
				
			||||||
 | 
					  boolean status = FALSE;
 | 
				
			||||||
 | 
					  int retval;
 | 
				
			||||||
 | 
					  fd_set readfds;
 | 
				
			||||||
 | 
					  int buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  do
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    FD_ZERO(&readfds);
 | 
				
			||||||
 | 
					    FD_SET(fd_transport, &readfds);
 | 
				
			||||||
 | 
					    FD_SET(pipefd[0],&readfds);
 | 
				
			||||||
 | 
					    retval = select((pipefd[0] > fd_transport? pipefd[0] : fd_transport) + 1,
 | 
				
			||||||
 | 
					                   &readfds, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					    if(retval == -1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      printf("select failed\n");
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if(FD_ISSET(pipefd[0],&readfds))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					       printf("Pipe descriptor set\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					       read(pipefd[0],&buf,1);
 | 
				
			||||||
 | 
					       if(buf == 1)
 | 
				
			||||||
 | 
					         break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if(FD_ISSET(fd_transport,&readfds))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					      printf("Read descriptor set\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      status = ftm_bt_hci_qcomm_handle_event();
 | 
				
			||||||
 | 
					      if(TRUE != status)
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  while(1);
 | 
				
			||||||
 | 
					#ifdef FTM_DEBUG
 | 
				
			||||||
 | 
					  printf("\nReader thread exited\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_pfal_set_transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					 sets the type of transport based on the msm type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					returns the type of transport
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_hci_pfal_set_transport(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (soc_type == BT_SOC_ROME || soc_type == BT_SOC_CHEROKEE || soc_type == BT_SOC_NAPIER) {
 | 
				
			||||||
 | 
					        strlcpy(transport_type, "uart", sizeof(transport_type));
 | 
				
			||||||
 | 
					        printf("[%s]: Transport type is: %s\n", __FUNCTION__, transport_type);
 | 
				
			||||||
 | 
					        is_transportSMD = 0;
 | 
				
			||||||
 | 
					        transport_dev = BT_HS_UART_DEVICE;
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        strlcpy(transport_type, "smd", sizeof(transport_type));
 | 
				
			||||||
 | 
					        printf("[%s]: Transport type is: %s\n", __FUNCTION__, transport_type);
 | 
				
			||||||
 | 
					        is_transportSMD = 1;
 | 
				
			||||||
 | 
					        transport_dev = APPS_RIVA_BT_CMD_CH;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return is_transportSMD;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int init_transport_bdroid(boolean on) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void *so_handle;
 | 
				
			||||||
 | 
					    unsigned char bdaddr[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
 | 
				
			||||||
 | 
					    request_status st;
 | 
				
			||||||
 | 
					    int  fd[CH_MAX], powerstate, ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (on) {
 | 
				
			||||||
 | 
					        so_handle = dlopen(VENDOR_LIB, RTLD_NOW);
 | 
				
			||||||
 | 
					        if (!so_handle)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					           ALOGE("Failed to load vendor component %s", dlerror());
 | 
				
			||||||
 | 
					           return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        vendor_interface = (bt_vendor_interface_t *) dlsym(so_handle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
 | 
				
			||||||
 | 
					        if (!vendor_interface)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ALOGE("Failed to accesst bt vendor interface");
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        vendor_interface->init(&vendor_callbacks, bdaddr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ALOGI("Turn On BT power");
 | 
				
			||||||
 | 
					        powerstate = BT_VND_PWR_ON;
 | 
				
			||||||
 | 
					        ret = vendor_interface->op(BT_VND_OP_POWER_CTRL, &powerstate);
 | 
				
			||||||
 | 
					        if (ret < 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ALOGE("Failed to turn on power from  bt vendor interface");
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        ret = vendor_interface->op(BT_VND_OP_USERIAL_OPEN, fd);
 | 
				
			||||||
 | 
					        ALOGE("ret value: %d", ret);
 | 
				
			||||||
 | 
					        /* This is just a hack; needs to be removed */
 | 
				
			||||||
 | 
					        ret = 1;
 | 
				
			||||||
 | 
					        ALOGE("setting ret value to 1 manually");
 | 
				
			||||||
 | 
					        if (ret != 1)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ALOGE("Failed to get fd from  bt vendor interface");
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            ALOGE("FD: %x", fd[0]);
 | 
				
			||||||
 | 
					            return fd[0];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        if (vendor_interface) {
 | 
				
			||||||
 | 
					            ALOGE("Close and cleanup the interfaces");
 | 
				
			||||||
 | 
					            int ret = vendor_interface->op(BT_VND_OP_USERIAL_CLOSE, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ALOGE("ret value: %d", ret);
 | 
				
			||||||
 | 
					            vendor_interface->cleanup();
 | 
				
			||||||
 | 
					            return 0;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ALOGE("Not able to find vendor interface handle");
 | 
				
			||||||
 | 
					            return -1;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_deinit_transport
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform specific routine to de-intialise the UART/SMD resource.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PLATFORM SPECIFIC DESCRIPTION
 | 
				
			||||||
 | 
					  Closes the TTY/SMD file descriptor and sets the descriptor value to -1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  The Close of the descriptor will trigger a failure in the Reader Thread
 | 
				
			||||||
 | 
					  and hence cause a Deinit of the ReaderThread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_pfal_deinit_transport()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int buf = 1;
 | 
				
			||||||
 | 
					  write(pipefd[1],&buf,1);
 | 
				
			||||||
 | 
					  if(!isLatestTarget())
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    close(fd_transport);
 | 
				
			||||||
 | 
					    fd_transport = -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    //Use libbt-vendor for chip de-initialization
 | 
				
			||||||
 | 
					    init_transport_bdroid(FALSE);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return STATUS_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_init_uart
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform specific routine to intialise the UART/SMD resources.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PLATFORM SPECIFIC DESCRIPTION
 | 
				
			||||||
 | 
					  Opens the TTY/SMD device file descriptor, congiures the TTY/SMD device for CTS/RTS
 | 
				
			||||||
 | 
					  flow control,sets 115200 for TTY as the default baudrate and starts the Reader
 | 
				
			||||||
 | 
					  Thread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_pfal_init_transport(int mode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  struct termios   term;
 | 
				
			||||||
 | 
					  if(isLatestTarget())
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    printf("%s: ",__func__ );
 | 
				
			||||||
 | 
					    //Use hidl_client_initialize for chip initialization
 | 
				
			||||||
 | 
					    if (hidl_client_initialize(mode, &fd_transport) == false) {
 | 
				
			||||||
 | 
					        printf("%s: HIDL client initialization failed \n", __func__);
 | 
				
			||||||
 | 
					        return STATUS_NO_RESOURCES;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    printf("%s: , fd:%d: ", __func__, fd_transport);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    fd_transport = open(transport_dev, (O_RDWR | O_NOCTTY));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (-1 == fd_transport)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      return STATUS_NO_RESOURCES;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (tcflush(fd_transport, TCIOFLUSH) < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      close(fd_transport);
 | 
				
			||||||
 | 
					      return STATUS_FAIL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (tcgetattr(fd_transport, &term) < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      close(fd_transport);
 | 
				
			||||||
 | 
					      return STATUS_FAIL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cfmakeraw(&term);
 | 
				
			||||||
 | 
					    /* Set RTS/CTS HW Flow Control*/
 | 
				
			||||||
 | 
					    term.c_cflag |= (CRTSCTS | CLOCAL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (tcsetattr(fd_transport, TCSANOW, &term) < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      close(fd_transport);
 | 
				
			||||||
 | 
					      return STATUS_FAIL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Configure the /dev/ttyHS0 device to operate at 115200.
 | 
				
			||||||
 | 
					     no need for msm8960 as it is using smd as transport
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    if (!is_transportSMD)
 | 
				
			||||||
 | 
					       if (ftm_bt_hci_pfal_changebaudrate(starting_baud) == FALSE)
 | 
				
			||||||
 | 
					       {
 | 
				
			||||||
 | 
					          close(fd_transport);
 | 
				
			||||||
 | 
					          return STATUS_FAIL;
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (pipe(pipefd) == -1)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    printf("pipe create error");
 | 
				
			||||||
 | 
					    return STATUS_FAIL;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if(mode != MODE_FM) {
 | 
				
			||||||
 | 
					  /* Creating read thread which listens for various masks & pkt requests */
 | 
				
			||||||
 | 
					  pthread_create( &hci_cmd_thread_hdl, NULL, ftm_readerthread, NULL);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return STATUS_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_nwrite
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform specific routine to write the data in the argument to the UART/SMD
 | 
				
			||||||
 | 
					  port intialised.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PLATFORM SPECIFIC DESCRIPTION
 | 
				
			||||||
 | 
					  Write the buffer to the tty device and ensure it is completely written
 | 
				
			||||||
 | 
					  In case of short write report error to the BT FTM layer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_pfal_nwrite(uint8 *buf, int size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int tx_bytes = 0, nwrite;
 | 
				
			||||||
 | 
					  int i = 0, buf_size = size;
 | 
				
			||||||
 | 
					  uint8 loop_back_cmd[6] = {0x1, 0x02, 0x18, 0x01, 0x01};
 | 
				
			||||||
 | 
					  /*hci packet is not required to carry the Packet indicator (for UART interfaces) for msm8960
 | 
				
			||||||
 | 
					     as it is using share memory interface */
 | 
				
			||||||
 | 
					  int hci_uart_pkt_ind = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(fd_transport < 0)
 | 
				
			||||||
 | 
					    return STATUS_NO_RESOURCES;
 | 
				
			||||||
 | 
					  if ( buf[PIN_CON_CMD_OGF_BIT] == PIN_CON_CMD_OGF &&
 | 
				
			||||||
 | 
					       buf[PIN_CON_CMD_OCF_BIT] == PIN_CON_CMD_OCF &&
 | 
				
			||||||
 | 
					      (size > PIN_CON_CMD_SUBOP_BIT) &&
 | 
				
			||||||
 | 
					       buf[PIN_CON_CMD_SUBOP_BIT] == PIN_CON_CMD_SUB_OP &&
 | 
				
			||||||
 | 
					      (size > PIN_CON_CMD_INTER_BIT) &&
 | 
				
			||||||
 | 
					       buf[PIN_CON_CMD_INTER_BIT] == PIN_CON_INTERFACE_ID)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					     is_slim_bus_test = 1;
 | 
				
			||||||
 | 
					     printf("\nPinConnectivityTest: Sending loopback command to SOC before initiasing slimbus\n");
 | 
				
			||||||
 | 
					     strlcpy(buf, loop_back_cmd, size);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  do
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    nwrite = write(fd_transport, (buf + hci_uart_pkt_ind + tx_bytes), (size - hci_uart_pkt_ind - tx_bytes));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (nwrite < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      printf("Error while writing ->\n");
 | 
				
			||||||
 | 
					      return STATUS_SHORT_WRITE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (nwrite == 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      printf("ftm_bt_hci_pfal_nwrite: zero-length write\n");
 | 
				
			||||||
 | 
					      return STATUS_SHORT_WRITE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    tx_bytes += nwrite;
 | 
				
			||||||
 | 
					    size     -= nwrite;
 | 
				
			||||||
 | 
					  } while (tx_bytes < size - hci_uart_pkt_ind);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (verbose == 1)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    printf("[%s] %s: CMD:", get_current_time(), __FUNCTION__);
 | 
				
			||||||
 | 
					    for (i = 0; i < buf_size; i++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      printf(" %02X", buf[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    printf("\n");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return STATUS_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_nread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform specific routine to read data from the UART/SMD port intialised into
 | 
				
			||||||
 | 
					  the buffer passed in argument.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PLATFORM SPECIFIC DESCRIPTION
 | 
				
			||||||
 | 
					  Read from the tty device into the buffer and ensure  the read request is
 | 
				
			||||||
 | 
					  completed, in case of short read report error to the BT FTM layer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_hci_pfal_nread(uint8 *buf, int size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int rx_bytes = 0, nread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(fd_transport < 0)
 | 
				
			||||||
 | 
					    return STATUS_NO_RESOURCES;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  do
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    nread = read(fd_transport, (buf + rx_bytes), (size - rx_bytes));
 | 
				
			||||||
 | 
					    if (nread < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      printf("Error while reading ->\n");
 | 
				
			||||||
 | 
					      return STATUS_SHORT_READ;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rx_bytes += nread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  } while (rx_bytes < size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return STATUS_SUCCESS;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_hci_pfal_changebaudrate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform specific routine to intiate a change in baud rate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PLATFORM SPECIFIC DESCRIPTION
 | 
				
			||||||
 | 
					  Convert the Baud rate passed to the speed_t type and program the
 | 
				
			||||||
 | 
					  Baud rate change after ensuring all transmit is drained at the
 | 
				
			||||||
 | 
					  current baud rate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  It is expected that the Upper layer will intiate a Flow Off to the
 | 
				
			||||||
 | 
					  BT SoC, to signal the stop of receive if the baud rate change is
 | 
				
			||||||
 | 
					  initiated while SoC init is in progress
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  TRUE if SUCCESS, else FALSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_hci_pfal_changebaudrate (uint32 new_baud)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  struct termios term;
 | 
				
			||||||
 | 
					  boolean status = TRUE;
 | 
				
			||||||
 | 
					  speed_t baud_code;
 | 
				
			||||||
 | 
					  speed_t actual_baud_code;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (tcgetattr(fd_transport, &term) < 0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    printf("Can't get port settings\n");
 | 
				
			||||||
 | 
					    status = FALSE;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    baud_code = convert_baud(new_baud);
 | 
				
			||||||
 | 
					    (void) cfsetospeed(&term, baud_code);
 | 
				
			||||||
 | 
					    if (tcsetattr(fd_transport, TCSADRAIN, &term) < 0) /* don't change speed until last write done */
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      printf("bt_hci_qcomm_pfal_changebaudrate: tcsetattr:\n");
 | 
				
			||||||
 | 
					      status = FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* make sure that we reportedly got the speed we tried to set */
 | 
				
			||||||
 | 
					    if (1 < verbose)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      if (tcgetattr(fd_transport, &term) < 0)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        printf("bt_hci_qcomm_pfal_changebaudrate: tcgetattr:\n");
 | 
				
			||||||
 | 
					        status = FALSE;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      if (baud_code != (actual_baud_code = cfgetospeed(&term)))
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        printf("bt_hci_qcomm_pfal_changebaudrate: new baud %u FAILED, got 0x%x\n", new_baud, actual_baud_code);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      else
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        printf("bt_hci_qcomm_pfal_changebaudrate: new baud %u SUCCESS, got 0x%x\n", new_baud, actual_baud_code);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return status;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										278
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_persist.cpp
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										278
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_persist.cpp
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,278 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     BT persist NV items access source file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					  Read/Write APIs for retreiving NV items from persist memory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2011-12 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					05/25/12   jav    Added FTM log that will display bt address while testing.
 | 
				
			||||||
 | 
					09/27/11   rrr     Moved persist related API for c/c++ compatibility, needed
 | 
				
			||||||
 | 
					                   for random BD address to be persistent across target
 | 
				
			||||||
 | 
					                   reboots.
 | 
				
			||||||
 | 
					==========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "ftm_bt_persist.h"
 | 
				
			||||||
 | 
					#include <semaphore.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BT_NV_SUPPORT
 | 
				
			||||||
 | 
					#include "bt_nv.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Semaphore shared by the Event handler and main thread */
 | 
				
			||||||
 | 
					extern sem_t semaphore_cmd_complete;
 | 
				
			||||||
 | 
					/*Flag to manage the verbose output */
 | 
				
			||||||
 | 
					extern int verbose;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_send_nv_read_cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					 Helper Routine to process the nv read command
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  FALSE = failure, else TRUE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_send_nv_read_cmd
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					  uint8 * cmd_buf,   /* pointer to Cmd */
 | 
				
			||||||
 | 
					  uint16 cmd_len     /* Cmd length */
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  nv_persist_item_type my_nv_item;
 | 
				
			||||||
 | 
					  nv_persist_stat_enum_type cmd_result;
 | 
				
			||||||
 | 
					  boolean result = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(cmd_len >1)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    switch(*(cmd_buf+1))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      case NV_BD_ADDR_I:
 | 
				
			||||||
 | 
					        cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_READ_F,  NV_BD_ADDR_I, &my_nv_item);
 | 
				
			||||||
 | 
					        if (NV_SUCCESS != cmd_result)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          if (verbose > 0)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            fprintf (stderr, "nv_cmd_remote failed to get BD_ADDR from NV, code %d\n", cmd_result);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          /* Send fail response */
 | 
				
			||||||
 | 
					          result = FALSE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          /* copy bytes */
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[0] = FTM_BT_CMD_NV_READ;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[1] = NV_BD_ADDR_I;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[7] = my_nv_item.bd_addr[5];
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[6] = my_nv_item.bd_addr[4];
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[5] = my_nv_item.bd_addr[3];
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[4] = my_nv_item.bd_addr[2];
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[3] = my_nv_item.bd_addr[1];
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[2] = my_nv_item.bd_addr[0];
 | 
				
			||||||
 | 
					          /* send BD_ADDR in the response */
 | 
				
			||||||
 | 
					          fprintf (stderr, "nv_cmd_remote got NV_BD_ADDR_I from NV: %x:%x:%x:%x:%x:%x\n",
 | 
				
			||||||
 | 
					                           (unsigned int) my_nv_item.bd_addr[5], (unsigned int) my_nv_item.bd_addr[4],
 | 
				
			||||||
 | 
					                           (unsigned int) my_nv_item.bd_addr[3], (unsigned int) my_nv_item.bd_addr[2],
 | 
				
			||||||
 | 
					                           (unsigned int) my_nv_item.bd_addr[1], (unsigned int) my_nv_item.bd_addr[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          ftm_log_send_msg((const uint8 *)event_buf_nv_read_response,nv_read_response_size);
 | 
				
			||||||
 | 
					          result = TRUE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case NV_BT_SOC_REFCLOCK_TYPE_I:
 | 
				
			||||||
 | 
					        cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_READ_F,  NV_BT_SOC_REFCLOCK_TYPE_I, &my_nv_item);
 | 
				
			||||||
 | 
					        if (NV_SUCCESS != cmd_result)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          if (verbose > 0)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            fprintf (stderr, "nv_cmd_remote failed to get BD_ADDR from NV, code %d\n", cmd_result);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          /* Send fail response */
 | 
				
			||||||
 | 
					          result = FALSE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[0] = FTM_BT_CMD_NV_READ;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[1] = NV_BT_SOC_REFCLOCK_TYPE_I;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[2] = (uint8) my_nv_item.bt_soc_refclock_type ;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[7] = 0x0;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[6] = 0x0;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[5] = 0x0;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[4] = 0x0;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[3] = 0x0;
 | 
				
			||||||
 | 
					          fprintf (stderr, "nv_cmd_remote got NV_BT_SOC_REFCLOCK_TYPE_I from NV: 0x%x\n",
 | 
				
			||||||
 | 
					                           (unsigned int) my_nv_item.bt_soc_refclock_type);
 | 
				
			||||||
 | 
					          ftm_log_send_msg((const uint8 *)event_buf_nv_read_response,nv_read_response_size);
 | 
				
			||||||
 | 
					          result = TRUE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case NV_BT_SOC_CLK_SHARING_TYPE_I:
 | 
				
			||||||
 | 
					        cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_READ_F,  NV_BT_SOC_CLK_SHARING_TYPE_I, &my_nv_item);
 | 
				
			||||||
 | 
					        if (NV_SUCCESS != cmd_result)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          if (verbose > 0)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            fprintf (stderr, "nv_cmd_remote failed to get CLK_SHARING from NV, code %d\n", cmd_result);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          /* Send fail response */
 | 
				
			||||||
 | 
					          result = FALSE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[0] = FTM_BT_CMD_NV_READ;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[1] = NV_BT_SOC_CLK_SHARING_TYPE_I;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[2] = (uint8) my_nv_item.bt_soc_clk_sharing_type ;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[7] = 0x0;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[6] = 0x0;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[5] = 0x0;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[4] = 0x0;
 | 
				
			||||||
 | 
					          event_buf_nv_read_response[3] = 0x0;
 | 
				
			||||||
 | 
					          fprintf (stderr, "nv_cmd_remote got NV_BT_SOC_CLK_SHARING_TYPE_I from NV: 0x%x\n",
 | 
				
			||||||
 | 
					                        (unsigned int) my_nv_item.bt_soc_refclock_type);
 | 
				
			||||||
 | 
					          ftm_log_send_msg((const uint8 *)event_buf_nv_read_response,nv_read_response_size);
 | 
				
			||||||
 | 
					          result = TRUE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if(result == FALSE)
 | 
				
			||||||
 | 
					      ftm_log_send_msg(event_buf_nv_read_response_fail,nv_read_response_size_fail);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sem_post(&semaphore_cmd_complete);
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_send_nv_write_cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					 Helper Routine to process the nv write command
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  FALSE = failure, else TRUE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_send_nv_write_cmd
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					  uint8 * cmd_buf,   /* pointer to Cmd */
 | 
				
			||||||
 | 
					  uint16 cmd_len     /* Cmd length */
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  nv_persist_item_type my_nv_item;
 | 
				
			||||||
 | 
					  nv_persist_stat_enum_type cmd_result;
 | 
				
			||||||
 | 
					  boolean result = TRUE;
 | 
				
			||||||
 | 
					  if(cmd_len >1)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    switch(*(cmd_buf+1))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      case NV_BD_ADDR_I:
 | 
				
			||||||
 | 
					        memcpy(&my_nv_item.bd_addr, (cmd_buf+2), NV_BD_ADDR_SIZE);
 | 
				
			||||||
 | 
					        cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_WRITE_F,  NV_BD_ADDR_I, &my_nv_item);
 | 
				
			||||||
 | 
					        if (NV_SUCCESS != cmd_result)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          if (verbose > 0)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            fprintf (stderr, "nv_cmd_remote failed to get BD_ADDR from NV, code %d\n", cmd_result);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          /* Send fail response */
 | 
				
			||||||
 | 
					          result = FALSE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          result = TRUE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case NV_BT_SOC_REFCLOCK_TYPE_I:
 | 
				
			||||||
 | 
					        switch (*(cmd_buf+2))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          case NV_PS_BT_SOC_REFCLOCK_32MHZ:
 | 
				
			||||||
 | 
					          case NV_PS_BT_SOC_REFCLOCK_19P2MHZ:
 | 
				
			||||||
 | 
					            my_nv_item.bt_soc_refclock_type = (nv_ps_bt_soc_refclock_enum_type)(*(cmd_buf+2)) ;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					          default:
 | 
				
			||||||
 | 
					          fprintf (stderr, "Invalid Ref Clock option\n");
 | 
				
			||||||
 | 
					          result = FALSE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (result != FALSE)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          cmd_result= (nv_persist_stat_enum_type)bt_nv_cmd(NV_WRITE_F,  NV_BT_SOC_REFCLOCK_TYPE_I, &my_nv_item);
 | 
				
			||||||
 | 
					          if (NV_SUCCESS != cmd_result)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            fprintf (stderr, "nv_cmd_remote failed to write SOC_REFCLOCK_TYPE to NV, code %d\n", cmd_result);
 | 
				
			||||||
 | 
					            result = FALSE;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            result = TRUE;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      case NV_BT_SOC_CLK_SHARING_TYPE_I:
 | 
				
			||||||
 | 
					        switch (*(cmd_buf+2))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          case NV_PS_BT_SOC_CLOCK_SHARING_ENABLED:
 | 
				
			||||||
 | 
					          case NV_PS_BT_SOC_CLOCK_SHARING_DISABLED:
 | 
				
			||||||
 | 
					            my_nv_item.bt_soc_clk_sharing_type = (nv_ps_bt_soc_clock_sharing_enum_type)(*(cmd_buf+2)) ;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					          default:
 | 
				
			||||||
 | 
					          fprintf (stderr, "Invalid Clock Sharing option\n");
 | 
				
			||||||
 | 
					          result = FALSE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (result != FALSE)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          cmd_result= (nv_persist_stat_enum_type)bt_nv_cmd(NV_WRITE_F, NV_BT_SOC_CLK_SHARING_TYPE_I, &my_nv_item);
 | 
				
			||||||
 | 
					          if (NV_SUCCESS != cmd_result)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            fprintf (stderr, "nv_cmd_remote failed to write SOC_CLK_SHARING_TYPE to NV, code %d\n", cmd_result);
 | 
				
			||||||
 | 
					            result = FALSE;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            result = TRUE;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if(result == FALSE)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      ftm_log_send_msg(event_buf_bt_nv_write_fail,nv_write_response_size);
 | 
				
			||||||
 | 
					      sem_post(&semaphore_cmd_complete);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      ftm_log_send_msg((const uint8 *)event_buf_bt_nv_write_pass,nv_write_response_size);
 | 
				
			||||||
 | 
					      sem_post(&semaphore_cmd_complete);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return result;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* End of BT_NV_SUPPORT */
 | 
				
			||||||
							
								
								
									
										113
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_persist.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										113
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_persist.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,113 @@
 | 
				
			|||||||
 | 
					#ifndef _FTM_BT_PERSIST_H_
 | 
				
			||||||
 | 
					#define _FTM_BT_PERSIST_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     BT persist NV items access source file
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					  Read/Write APIs for retreiving NV items from persist memory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2011 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					09/27/11   rrr     Moved persist related API for c/c++ compatibility, needed
 | 
				
			||||||
 | 
					                   for random BD address to be persistent across target
 | 
				
			||||||
 | 
					                   reboots.
 | 
				
			||||||
 | 
					==========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					extern "C"
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "ftm_bt_common.h"
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef BT_NV_SUPPORT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_BT_CMD_NV_READ 0xB
 | 
				
			||||||
 | 
					#define FTM_BT_CMD_NV_WRITE 0xC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const uint8 nv_read_response_size = 8;
 | 
				
			||||||
 | 
					const uint8 nv_read_response_size_fail = 2;
 | 
				
			||||||
 | 
					const uint8 nv_write_response_size = 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* NV Write Responses */
 | 
				
			||||||
 | 
					const uint8 event_buf_bt_nv_write_pass[2] = { FTM_BT_CMD_NV_WRITE, FTM_BT_DRV_NO_ERR};
 | 
				
			||||||
 | 
					const uint8 event_buf_bt_nv_write_fail[2] = { FTM_BT_CMD_NV_WRITE, FTM_BT_NV_WRITE_FAIL};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* NV Read Responses */
 | 
				
			||||||
 | 
					const uint8 event_buf_nv_read_response_fail[8] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FTM_BT_CMD_NV_READ, FTM_BT_NV_READ_FAIL, 0x0, 0x0,0x0,0x0,0x0,0x0
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint8 event_buf_nv_read_response[8];
 | 
				
			||||||
 | 
					#endif /* BT_NV_SUPPORT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_send_nv_read_cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					 Helper Routine to process the nv read command
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  FALSE = failure, else TRUE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_send_nv_read_cmd
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					  uint8 * cmd_buf,   /* pointer to Cmd */
 | 
				
			||||||
 | 
					  uint16 cmd_len     /* Cmd length */
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_send_nv_write_cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					 Helper Routine to process the nv write command
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  FALSE = failure, else TRUE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean ftm_bt_send_nv_write_cmd
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					  uint8 * cmd_buf,   /* pointer to Cmd */
 | 
				
			||||||
 | 
					  uint16 cmd_len     /* Cmd length */
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cplusplus
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* _FTM_BT_PERSIST_H_ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										76
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_power_hal.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										76
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_power_hal.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,76 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM BT POWER HAL Header File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   Wrapper API definitions of the ftm bt power hal component.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					06/18/10   rakeshk  Created a header file to include the wrapper API
 | 
				
			||||||
 | 
					                    definitions for BT power control
 | 
				
			||||||
 | 
					07/07/10   rakeshk  Modified the function name of BT power set HAL routine
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					#include "ftm_bt_common.h"
 | 
				
			||||||
 | 
					#include "ftm_bt_power_pfal.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __FTM_BT_POWER_HAL_H__
 | 
				
			||||||
 | 
					#define __FTM_BT_POWER_HAL_H__
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_power_hal_set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform independent wrapper API which sets a BT power  from PFAL
 | 
				
			||||||
 | 
					  layer and returns the status of the PFAL operation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_power_hal_set(bt_power_state state)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return ftm_bt_power_pfal_set(state);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FtUNCTION    ftm_bt_power_hal_check
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Platform independent wrapper API which gets the BT power from PFAL
 | 
				
			||||||
 | 
					  layer and returns the current state of the BT HW.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  Current BT power state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					bt_power_state ftm_bt_power_hal_check()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return ftm_bt_power_pfal_check();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif //__FTM_BT_POWER_HAL_H__
 | 
				
			||||||
							
								
								
									
										71
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_power_pfal.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										71
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_power_pfal.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM BT POWER PFAL Header File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   PFAL API declarations of the ftm bt power pfal component.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					06/18/10   rakeshk  Created a header file to hold the PFAL declarations for
 | 
				
			||||||
 | 
					                    BT power programming
 | 
				
			||||||
 | 
					07/07/10   rakeshk  Modified the function name of BT power set PFAL routine
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					#include "ftm_bt_common.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __FTM_BT_POWER_PFAL_H__
 | 
				
			||||||
 | 
					#define __FTM_BT_POWER_PFAL_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_power_pfal_set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform dependent interface API which sets the BT power
 | 
				
			||||||
 | 
					  and returns the status of the toggle operation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_power_pfal_set(bt_power_state state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_power_pfal_check
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Platform dependent interface API which intiates a BT power read/check
 | 
				
			||||||
 | 
					  and returns the current state of the BT HW.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  Current BT power state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					bt_power_state ftm_bt_power_pfal_check();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										197
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_power_pfal_linux.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										197
									
								
								feeds/ipq95xx/ftm/src/ftm_bt_power_pfal_linux.c
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,197 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM Platform specfic BT power File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					  Platform specific routines to toggle/read the BT power state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010-2011 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					06/18/10   rakeshk  Created a source file to implement platform specific
 | 
				
			||||||
 | 
					                    routines for BT power.
 | 
				
			||||||
 | 
					07/07/10   rakeshk  Added routine to find the sysfs entry for bluetooth in
 | 
				
			||||||
 | 
					                    runtime
 | 
				
			||||||
 | 
					07/07/10   rakeshk  Added call to init the rfkill state path in case of first
 | 
				
			||||||
 | 
					                    read
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include "ftm_bt_power_pfal.h"
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Bluetooth Rfkill Entry for Android */
 | 
				
			||||||
 | 
					static char *rfkill_state_path = NULL;
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   init_rfkill_path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Opens the sysfs entry for different types of rfkill and finds the one
 | 
				
			||||||
 | 
					  which matches Bluetooth by iterating through the rfkill entries
 | 
				
			||||||
 | 
					  and checking for bluetooth
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  TRUE if SUCCESS, else FALSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean init_rfkill_path()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int fd;
 | 
				
			||||||
 | 
					  int readsize;
 | 
				
			||||||
 | 
					  int rfkillid;
 | 
				
			||||||
 | 
					  char rfkill_path[64];
 | 
				
			||||||
 | 
					  char buf[16];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for (rfkillid = 0; ; rfkillid++)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    /* Open the different rfkill type entries and check if type macthes bluetooth */
 | 
				
			||||||
 | 
					    snprintf(rfkill_path, sizeof(rfkill_path), "/sys/class/rfkill/rfkill%d/type", rfkillid);
 | 
				
			||||||
 | 
					    fd = open(rfkill_path, O_RDONLY);
 | 
				
			||||||
 | 
					    if (fd < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      printf("open(%s) failed: \n", rfkill_path);
 | 
				
			||||||
 | 
					      return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    readsize = read(fd, &buf, sizeof(buf));
 | 
				
			||||||
 | 
					    close(fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (memcmp(buf, "bluetooth", 9) == 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  asprintf(&rfkill_state_path, "/sys/class/rfkill/rfkill%d/state", rfkillid);
 | 
				
			||||||
 | 
					  return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_power_pfal_set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Platform dependent interface API which sets the BT power state
 | 
				
			||||||
 | 
					  and returns the status of the toggle operation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PLATFORM SPECIFIC DESCRIPTION
 | 
				
			||||||
 | 
					  Opens the rfkill entry for Bleutooth and initiates a write of the value
 | 
				
			||||||
 | 
					  passed as argument.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  STATUS_SUCCESS if SUCCESS, else other reasons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					request_status ftm_bt_power_pfal_set(bt_power_state state)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int sz;
 | 
				
			||||||
 | 
					  int fd = -1;
 | 
				
			||||||
 | 
					  request_status ret = STATUS_FAIL;
 | 
				
			||||||
 | 
					  const char buffer = state;
 | 
				
			||||||
 | 
					  if(rfkill_state_path == NULL)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if(init_rfkill_path() != TRUE)
 | 
				
			||||||
 | 
					      goto out;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fd = open(rfkill_state_path, O_WRONLY);
 | 
				
			||||||
 | 
					  if (fd < 0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    ret = STATUS_NO_RESOURCES;
 | 
				
			||||||
 | 
					    goto out;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  sz = write(fd, &buffer, 1);
 | 
				
			||||||
 | 
					  if (sz < 0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    goto out;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  ret = STATUS_SUCCESS;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out:
 | 
				
			||||||
 | 
					  if (fd >= 0)
 | 
				
			||||||
 | 
					    close(fd);
 | 
				
			||||||
 | 
					  return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_bt_power_pfal_check
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Platform dependent interface API which intiates a BT power read/check
 | 
				
			||||||
 | 
					  and returns the current state of the BT HW.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PLATFORM SPECIFIC DESCRIPTION
 | 
				
			||||||
 | 
					  Opens the rfkill entry for Bleutooth and initiates a read on the rfkill
 | 
				
			||||||
 | 
					  descriptor.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  Current BT power state
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					bt_power_state ftm_bt_power_pfal_check()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int sz;
 | 
				
			||||||
 | 
					  bt_power_state state= BT_OFF;
 | 
				
			||||||
 | 
					  int fd = -1;
 | 
				
			||||||
 | 
					  char buffer = '0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(rfkill_state_path == NULL)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    if(init_rfkill_path() != TRUE)
 | 
				
			||||||
 | 
					      goto out;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  fd = open(rfkill_state_path, O_RDONLY);
 | 
				
			||||||
 | 
					  if (fd < 0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    goto out;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  sz = read(fd, &buffer, 1);
 | 
				
			||||||
 | 
					  if (sz < 0)
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    goto out;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out:
 | 
				
			||||||
 | 
					  if (fd >= 0)
 | 
				
			||||||
 | 
					    close(fd);
 | 
				
			||||||
 | 
					  state = (bt_power_state)buffer;
 | 
				
			||||||
 | 
					  return state;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										141
									
								
								feeds/ipq95xx/ftm/src/ftm_common.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										141
									
								
								feeds/ipq95xx/ftm/src/ftm_common.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,141 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM BT HCI PFAL Header File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   Queue insert/delete routines and data structures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010-2011, 2014 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					06/18/10   rakeshk  Created
 | 
				
			||||||
 | 
					11/09/10   rakeshk  Added two APIs to perform read/write of BT Top level
 | 
				
			||||||
 | 
					                    I2C registers
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(CONFIG_FTM_BT) || defined(CONFIG_FTM_FM)
 | 
				
			||||||
 | 
					#include <ftm_bt_common.h>
 | 
				
			||||||
 | 
					#include "ftm_bt.h"
 | 
				
			||||||
 | 
					#include <semaphore.h>
 | 
				
			||||||
 | 
					#include <pthread.h>
 | 
				
			||||||
 | 
					/* Semaphore shared by the Event handler and main thread */
 | 
				
			||||||
 | 
					extern sem_t semaphore_cmd_complete;
 | 
				
			||||||
 | 
					/* Structure used by the FTM BT/FM component to
 | 
				
			||||||
 | 
					 * queue the FTM packet contents
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pthread_mutex_t fm_event_lock;
 | 
				
			||||||
 | 
					pthread_cond_t fm_event_cond;
 | 
				
			||||||
 | 
					extern int fm_passthrough;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct cmdQ
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int command_id;/*Command id */
 | 
				
			||||||
 | 
					  void *data; /* Command data */
 | 
				
			||||||
 | 
					  boolean bt_command; /* whether BT or FM command */
 | 
				
			||||||
 | 
					  int cmd_len; /* Command length */
 | 
				
			||||||
 | 
					  struct cmdQ *next; /* pointer to next CmdQ item */
 | 
				
			||||||
 | 
					}cmdQ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Callback declaration for BT FTM packet processing */
 | 
				
			||||||
 | 
					void *bt_ftm_diag_dispatch(void *req_pkt, uint16 pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   qinsert_cmd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Command Queue insert routine. Add the FTM BT packet to the Queue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURNS FALSE without adding queue entry in failure
 | 
				
			||||||
 | 
					  to allocate a new Queue item
 | 
				
			||||||
 | 
					  else returns TRUE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  increments the number of commands queued
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					boolean qinsert_cmd(ftm_bt_pkt_type *ftm_bt_pkt);
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   dequeue_send
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Command Queue delete and calls HCI send routine. Dequeues the HCI data from
 | 
				
			||||||
 | 
					  the queue and sends it to HCI HAL layer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  decrements the number of command queued
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void dequeue_send();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION  i2c_write
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Helper function to construct the I@C request to be sent to the FM I2C
 | 
				
			||||||
 | 
					  driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  -1 in failure,positive or zero in success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					int i2c_write
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					int fd,
 | 
				
			||||||
 | 
					unsigned char offset,
 | 
				
			||||||
 | 
					const unsigned char* buf,
 | 
				
			||||||
 | 
					unsigned char len,
 | 
				
			||||||
 | 
					unsigned int slave_addr
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION  i2c_read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Helper function to construct the I2C request to read data from the FM I2C
 | 
				
			||||||
 | 
					  driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  -1 in failure,positive or zero in success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					int i2c_read
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
					int fd,
 | 
				
			||||||
 | 
					unsigned char offset,
 | 
				
			||||||
 | 
					const unsigned char* buf,
 | 
				
			||||||
 | 
					unsigned char len,
 | 
				
			||||||
 | 
					unsigned int slave_addr
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										43
									
								
								feeds/ipq95xx/ftm/src/ftm_dbg.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										43
									
								
								feeds/ipq95xx/ftm/src/ftm_dbg.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM WLAN Source File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2013-2014 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					#ifndef _FTM_DBG_H_
 | 
				
			||||||
 | 
					#define _FTM_DBG_H_
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_DBG_ERROR   0x00000001
 | 
				
			||||||
 | 
					#define FTM_DBG_INFO    0x00000002
 | 
				
			||||||
 | 
					#define FTM_DBG_TRACE   0x00000004
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_DBG_DEFAULT (FTM_DBG_ERROR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern unsigned int g_dbg_level;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ftm_config
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int total_num_slots;
 | 
				
			||||||
 | 
					    uint32_t slot_id[4];
 | 
				
			||||||
 | 
					    uint32_t slot_size[4];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					extern struct ftm_config ftm_cfg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
					void current_time();
 | 
				
			||||||
 | 
					#define DPRINTF(_level, _x...)\
 | 
				
			||||||
 | 
					    do {\
 | 
				
			||||||
 | 
					        if (g_dbg_level & (_level))\
 | 
				
			||||||
 | 
					        {\
 | 
				
			||||||
 | 
					            fprintf(stderr, _x);\
 | 
				
			||||||
 | 
					        }\
 | 
				
			||||||
 | 
					    } while (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define DPRINTF(_level, x...)  do { } while (0);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* _FTM_DBG_H_ */
 | 
				
			||||||
							
								
								
									
										3804
									
								
								feeds/ipq95xx/ftm/src/ftm_fm.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3804
									
								
								feeds/ipq95xx/ftm/src/ftm_fm.c
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										993
									
								
								feeds/ipq95xx/ftm/src/ftm_fm_common.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										993
									
								
								feeds/ipq95xx/ftm/src/ftm_fm_common.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,993 @@
 | 
				
			|||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     FTM FM Common Header File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					  Global Data declarations of the ftm fm component.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright (c) 2010-2012, 2014 by Qualcomm Technologies, Inc.  All Rights Reserved.
 | 
				
			||||||
 | 
					# Qualcomm Technologies Proprietary and Confidential.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when       who     what, where, why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					08/03/2011 uppalas  Adding support for new ftm commands
 | 
				
			||||||
 | 
					06/18/10   rakeshk  Created a header file to hold the definitons for ftm fm
 | 
				
			||||||
 | 
					                    task
 | 
				
			||||||
 | 
					07/06/10   rakeshk  Clean roomed the data structures and defined data
 | 
				
			||||||
 | 
					                    structures to be passed to the PFAL layers
 | 
				
			||||||
 | 
					01/11/11   rakeshk  Added support for new FTM APIS
 | 
				
			||||||
 | 
					02/09/11   rakeshk  Added support for BLER FTM APIs
 | 
				
			||||||
 | 
					04/03/11   ananthk  Added support for FM FTM Transmit APIs
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					#ifdef CONFIG_FTM_FM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "diagpkt.h"
 | 
				
			||||||
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_FM_LOG_PKT_ID 65
 | 
				
			||||||
 | 
					#define FTM_FM_CMD_CODE 28
 | 
				
			||||||
 | 
					#define LOG_FTM_FM_C  ((uint16) 0x14CC)
 | 
				
			||||||
 | 
					#define FEATURE_FTM_FM_DEBUG
 | 
				
			||||||
 | 
					#define DEFAULT_DATA_SIZE 249
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FM6500 A0 chip version.
 | 
				
			||||||
 | 
					 **/
 | 
				
			||||||
 | 
					#define FM6500_A0_VERSION                     (0x01010013)
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 *  * FM6500 2.0 chip version.
 | 
				
			||||||
 | 
					 **/
 | 
				
			||||||
 | 
					#define FMQSOCCOM_FM6500_20_VERSION           (0x01010010)
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 *  * FM6500 2.1 chip version.
 | 
				
			||||||
 | 
					 **/
 | 
				
			||||||
 | 
					#define FMQSOCCOM_FM6500_21_VERSION           (0x02010204)
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 *  WCN 2243 1.0's FM chip version.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define FMQSOCCOM_FM6500_WCN2243_10_VERSION   (0x0302010A)
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 *  WCN 2243 2.0's FM chip version.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define FMQSOCCOM_FM6500_WCN2243_20_VERSION   (0x04020205)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int chipVersion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* RDS Group processing parameters */
 | 
				
			||||||
 | 
					#define FM_RX_RDS_GRP_RT_EBL         1
 | 
				
			||||||
 | 
					#define FM_RX_RDS_GRP_PS_EBL         2
 | 
				
			||||||
 | 
					#define FM_RX_RDS_GRP_AF_EBL         4
 | 
				
			||||||
 | 
					#ifdef FM_SOC_TYPE_CHEROKEE
 | 
				
			||||||
 | 
					#define FM_RX_RDS_GRP_PS_SIMPLE_EBL  8
 | 
				
			||||||
 | 
					#define FM_RX_RDS_GRP_ECC_EBL        32
 | 
				
			||||||
 | 
					#define FM_RX_RDS_GRP_PTYN_EBL       64
 | 
				
			||||||
 | 
					#define FM_RX_RDS_GRP_RT_PLUS_EBL    128
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define FM_RX_RDS_GRP_PS_SIMPLE_EBL  16
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* lower and upper band limits of regions */
 | 
				
			||||||
 | 
					#define REGION_US_EU_BAND_LOW              87500
 | 
				
			||||||
 | 
					#define REGION_US_EU_BAND_HIGH             107900
 | 
				
			||||||
 | 
					#define REGION_JAPAN_STANDARD_BAND_LOW     76000
 | 
				
			||||||
 | 
					#define REGION_JAPAN_STANDARD_BAND_HIGH    90000
 | 
				
			||||||
 | 
					#define REGION_JAPAN_WIDE_BAND_LOW         90000
 | 
				
			||||||
 | 
					#define REGION_JAPAN_WIDE_BAND_HIGH        108000
 | 
				
			||||||
 | 
					#define V4L2_CID_PRIVATE_BASE 0x08000000
 | 
				
			||||||
 | 
					#define MAX_RDS_PS_LENGTH 108
 | 
				
			||||||
 | 
					#define MAX_RDS_RT_LENGTH  64
 | 
				
			||||||
 | 
					#define V4L2_CID_PRIVATE_IRIS_RDS_GRP_COUNTERS_EXT    0x08000042
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum  {
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_HLSI = (V4L2_CID_PRIVATE_BASE + 0x1d),
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_SOFT_MUTE,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_RIVA_ACCS_ADDR,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_RIVA_ACCS_LEN,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_RIVA_PEEK,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_RIVA_POKE,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_SSBI_ACCS_ADDR,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_SSBI_PEEK,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_SSBI_POKE,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_TX_TONE,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_RDS_GRP_COUNTERS,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_SET_NOTCH_FILTER,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_AGC_CTRL = 0x08000043,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_AGC_STATE,
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_READ_DEFAULT = 0x00980928,//using private CIDs under userclass
 | 
				
			||||||
 | 
					V4L2_CID_PRIVATE_IRIS_WRITE_DEFAULT,
 | 
				
			||||||
 | 
					}v4l2_cid_private_iris_t_copy;
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  /* Total no. of PS names that can be transmitted       : 12
 | 
				
			||||||
 | 
					     Width of each transmitted PS name is                : 8
 | 
				
			||||||
 | 
					     Total no. of PS characters  that can be transmitted : (12*8 = 96)
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					  MAX_TX_PS_LEN         = 96,
 | 
				
			||||||
 | 
					  MAX_TX_PS_RPT_CNT     = 15,
 | 
				
			||||||
 | 
					}FmTxPSFeatures;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FTM FM command IDs */
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef FEATURE_FTM_FM_DEBUG
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_POWER_MODE         = 13,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_SIGNAL_THRESHOLD   = 14,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_RSSI_LIMIT         = 16,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_PS_INFO            = 17,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_RT_INFO            = 18,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_AF_INFO            = 19,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SEARCH_STATIONS        = 20,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SEARCH_RDS_STATIONS    = 21,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SEARCH_STATIONS_LIST   = 22,
 | 
				
			||||||
 | 
					  FTM_FM_RX_CANCEL_SEARCH          = 23,
 | 
				
			||||||
 | 
					  FTM_FM_RX_RDS_GROUP_PROC_OPTIONS = 25,
 | 
				
			||||||
 | 
					  FTM_FM_RX_RDS_PI_MATCH_OPTIONS   = 26,
 | 
				
			||||||
 | 
					  FTM_FM_TX_GET_PS_FEATURES        = 36,
 | 
				
			||||||
 | 
					  FTM_FM_TX_TX_PS_INFO             = 38,
 | 
				
			||||||
 | 
					  FTM_FM_TX_STOP_PS_INFO_TX        = 39,
 | 
				
			||||||
 | 
					  FTM_FM_TX_TX_RT_INFO             = 40,
 | 
				
			||||||
 | 
					  FTM_FM_TX_STOP_RT_INFO_TX        = 41,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_SIGNAL_THRESHOLD   = 46,
 | 
				
			||||||
 | 
					  FTM_FM_FMWAN_REG_RD              = 51,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_DEFAULTS           = 62,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_DEFAULTS           = 63,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_SINR_SAMPLES       = 64,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_SINR_SAMPLES       = 65,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_SINR_THRESHOLD     = 66,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_SINR_THRESHOLD     = 67,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_ONCHANNEL_TH       = 68,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_ONCHANNEL_TH       = 69,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_OFFCHANNEL_TH      = 70,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_OFFCHANNEL_TH      = 71,
 | 
				
			||||||
 | 
					  FTM_FM_TX_PWR_LVL_CFG            = 72,
 | 
				
			||||||
 | 
					#endif /* FEATURE_FTM_FM_DEBUG */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  FTM_FM_RX_ENABLE_RECEIVER        = 7,
 | 
				
			||||||
 | 
					  FTM_FM_RX_DISABLE_RECEIVER       = 8,
 | 
				
			||||||
 | 
					  FTM_FM_RX_CONFIGURE_RECEIVER     = 9,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_MUTE_MODE          = 10,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_STEREO_MODE        = 11,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_STATION            = 12,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_STATION_PARAMETERS = 15,
 | 
				
			||||||
 | 
					  FTM_FM_RX_RDS_GROUP_OPTIONS      = 24,
 | 
				
			||||||
 | 
					  FTM_FM_TX_ENABLE_TRANSMITTER     = 33,
 | 
				
			||||||
 | 
					  FTM_FM_TX_DISABLE_TRANSMITTER    = 34,
 | 
				
			||||||
 | 
					  FTM_FM_TX_CONFIGURE_TRANSMITTER  = 35,
 | 
				
			||||||
 | 
					  FTM_FM_TX_SET_STATION            = 37,
 | 
				
			||||||
 | 
					  FTM_FM_TX_TX_RDS_GROUPS          = 42,
 | 
				
			||||||
 | 
					  FTM_FM_TX_TX_CONT_RDS_GROUPS     = 43,
 | 
				
			||||||
 | 
					  FTM_FM_TX_TX_RDS_CTRL            = 44,
 | 
				
			||||||
 | 
					  FTM_FM_TX_GET_RDS_GROUP_BUF_SIZE = 45,
 | 
				
			||||||
 | 
					  FTM_FM_BUS_WRITE                 = 47,
 | 
				
			||||||
 | 
					  FTM_FM_BUS_READ                  = 48,
 | 
				
			||||||
 | 
					  FTM_FM_NOTIFY_WAN                = 49,
 | 
				
			||||||
 | 
					  FTM_FM_NOTIFY_FM                 = 50,
 | 
				
			||||||
 | 
					  FTM_FM_ROUTE_AUDIO               = 52,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_AF_THRESHOLD       = 53,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_RSSI_CHECK_TIMER   = 54,
 | 
				
			||||||
 | 
					  FTM_FM_RX_SET_RDS_PI_TIMER       = 55,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_AF_THRESHOLD       = 56,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_RSSI_CHECK_TIMER   = 57,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_RDS_PI_TIMER       = 58,
 | 
				
			||||||
 | 
					  FTM_FM_RX_GET_RDS_ERR_COUNT      = 59,
 | 
				
			||||||
 | 
					  FTM_FM_RX_RESET_RDS_ERR_COUNT    = 60,
 | 
				
			||||||
 | 
					  FTM_FM_TX_SEARCH_STATIONS        = 61,
 | 
				
			||||||
 | 
					  FTM_FM_SET_HLSI                  = 100,
 | 
				
			||||||
 | 
					  FTM_FM_SET_SOFT_MUTE             = 101,
 | 
				
			||||||
 | 
					  FTM_FM_SET_ANTENNA               = 102,
 | 
				
			||||||
 | 
					  FTM_FM_SET_NOTCH_FILTER          = 103,
 | 
				
			||||||
 | 
					  FTM_FM_READ_RDS_GRP_CNTRS        = 104,
 | 
				
			||||||
 | 
					  FTM_FM_SET_TONE_GENERATION       = 105,
 | 
				
			||||||
 | 
					  FTM_FM_PEEK_SSBI                 = 106,
 | 
				
			||||||
 | 
					  FTM_FM_POKE_SSBI                 = 107,
 | 
				
			||||||
 | 
					  FTM_FM_PEEK_RIVA_WORD            = 108,
 | 
				
			||||||
 | 
					  FTM_FM_POKE_RIVA_WORD            = 109,
 | 
				
			||||||
 | 
					  FTM_FM_ENABLE_AUDIO              = 111,
 | 
				
			||||||
 | 
					  FTM_FM_DISABLE_AUDIO             = 112,
 | 
				
			||||||
 | 
					  FTM_FM_VOLUME_SETTING            = 113,
 | 
				
			||||||
 | 
					  FTM_FM_READ_RDS_GRP_CNTRS_EXT    = 114,
 | 
				
			||||||
 | 
					  FTM_FM_SET_GET_RESET_AGC         = 115,
 | 
				
			||||||
 | 
					  FTM_FM_MAX
 | 
				
			||||||
 | 
					} ftm_fm_sub_cmd_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define XFR_CTRL_OFFSET 0x1F
 | 
				
			||||||
 | 
					/* Wait time for ensuring XFR is generated */
 | 
				
			||||||
 | 
					#define WAIT_ON_ISR_DELAY 15000 //15 ms
 | 
				
			||||||
 | 
					#define AFTH_OFFSET 0x2E
 | 
				
			||||||
 | 
					#define CHCOND_OFFSET 0x22
 | 
				
			||||||
 | 
					#define RDSTIMEOUT_OFFSET 0x25
 | 
				
			||||||
 | 
					#define FM_SLAVE_ADDR 0x2A
 | 
				
			||||||
 | 
					#define RDSERR_OFFSET 0x24
 | 
				
			||||||
 | 
					#define RDSRESET_OFFSET 0x20
 | 
				
			||||||
 | 
					#define BLOCKS_PER_GROUP 0x04
 | 
				
			||||||
 | 
					#define FTM_FM_RDS_COUNT 0x11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_RIVA_DATA_LEN  245
 | 
				
			||||||
 | 
					#define MAX_RIVA_PEEK_RSP_SIZE 251
 | 
				
			||||||
 | 
					#define SSBI_PEEK_DATA_SIZE 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define IRIS_BUF_PEEK  6
 | 
				
			||||||
 | 
					#define IRIS_BUF_SSBI_PEEK IRIS_BUF_PEEK+1
 | 
				
			||||||
 | 
					#define IRIS_BUF_RDS_CNTRS  IRIS_BUF_SSBI_PEEK+1
 | 
				
			||||||
 | 
					#define IRIS_BUF_RD_DEFAULT IRIS_BUF_RDS_CNTRS+1
 | 
				
			||||||
 | 
					#ifdef FM_SOC_TYPE_CHEROKEE
 | 
				
			||||||
 | 
					#define RDS_GRP_CNTRS_SIZE 48
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define RDS_GRP_CNTRS_SIZE 36
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					/* Generic result, used for any command that only returns an error code */
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FTM_FM_SUCCESS,
 | 
				
			||||||
 | 
					  FTM_FAIL,
 | 
				
			||||||
 | 
					  FTM_FILE_DOES_NOT_EXIST,
 | 
				
			||||||
 | 
					  FTM_MMC_ERROR,
 | 
				
			||||||
 | 
					  FTM_FM_UNRECOGNIZED_CMD,
 | 
				
			||||||
 | 
					  FTM_NO_RESOURCES,
 | 
				
			||||||
 | 
					  FTM_FM_PENDING,
 | 
				
			||||||
 | 
					  FTM_INVALID_PARAM,
 | 
				
			||||||
 | 
					  FTM_FM_DISALLOWED,
 | 
				
			||||||
 | 
					  FTM_TEST_NOT_IMPLEMENTED,
 | 
				
			||||||
 | 
					  FTM_CUST_HW_ID_UNKNOWN,
 | 
				
			||||||
 | 
					  FTM_FM_BUS_WRITE_ERROR,
 | 
				
			||||||
 | 
					  FTM_FM_BUS_READ_ERROR,
 | 
				
			||||||
 | 
					  FTM_FM_CLIENT_MAX,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} ftm_fm_api_result_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FM power state enum */
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FM_POWER_OFF,
 | 
				
			||||||
 | 
					  FM_POWER_TRANSITION,
 | 
				
			||||||
 | 
					  FM_RX_ON,
 | 
				
			||||||
 | 
					  FM_TX_ON
 | 
				
			||||||
 | 
					}fm_power_state;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FM command status enum */
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FM_CMD_SUCCESS,
 | 
				
			||||||
 | 
					  FM_CMD_PENDING,
 | 
				
			||||||
 | 
					  FM_CMD_NO_RESOURCES,
 | 
				
			||||||
 | 
					  FM_CMD_INVALID_PARAM,
 | 
				
			||||||
 | 
					  FM_CMD_DISALLOWED,
 | 
				
			||||||
 | 
					  FM_CMD_UNRECOGNIZED_CMD,
 | 
				
			||||||
 | 
					  FM_CMD_FAILURE
 | 
				
			||||||
 | 
					}fm_cmd_status_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					*  FM event result.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   FM_EV_SUCCESS  = 0,
 | 
				
			||||||
 | 
					   /**<  Event indicates success. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_EV_FAILURE  = 1,
 | 
				
			||||||
 | 
					   /**<  Event is a response to a command that failed */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_EV_CMD_DISALLOWED = 2,
 | 
				
			||||||
 | 
					   /**<  Event is a response to a command that was disallowed. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_EV_CMD_INVALID_PARAM = 3
 | 
				
			||||||
 | 
					   /**<  Event is a response to a command that contained an invalid parameter. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} FmEvResultType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					*  FM Receiver event names.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   /* -----------------------------------------------
 | 
				
			||||||
 | 
					         1 -> FM Receiver initialization events
 | 
				
			||||||
 | 
					      ----------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_ENABLE_RECEIVER = 0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_DISABLE_RECEIVER,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_CFG_RECEIVER,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* -----------------------------------------------
 | 
				
			||||||
 | 
					         2 ->       FM receiver control events
 | 
				
			||||||
 | 
					      ----------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_MUTE_MODE_SET,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_STEREO_MODE_SET,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RADIO_STATION_SET,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_PWR_MODE_SET,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_SET_SIGNAL_THRESHOLD,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* -----------------------------------------------
 | 
				
			||||||
 | 
					         3 ->       FM receiver status events
 | 
				
			||||||
 | 
					      ----------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RADIO_TUNE_STATUS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_STATION_PARAMETERS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RDS_LOCK_STATUS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_STEREO_STATUS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_SERVICE_AVAILABLE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_GET_SIGNAL_THRESHOLD,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* -----------------------------------------------
 | 
				
			||||||
 | 
					         4 ->       FM search status events
 | 
				
			||||||
 | 
					      ----------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_SEARCH_IN_PROGRESS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_SEARCH_RDS_IN_PROGRESS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_SEARCH_LIST_IN_PROGRESS,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_SEARCH_COMPLETE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_SEARCH_RDS_COMPLETE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_SEARCH_LIST_COMPLETE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_SEARCH_CANCELLED,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* -----------------------------------------------
 | 
				
			||||||
 | 
					         5 ->       FM RDS status events
 | 
				
			||||||
 | 
					      ----------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RDS_GROUP_DATA,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RDS_PS_INFO,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RDS_RT_INFO,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RDS_AF_INFO,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RDS_PI_MATCH_AVAILABLE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* -----------------------------------------------
 | 
				
			||||||
 | 
					         6 ->   FM RDS control events
 | 
				
			||||||
 | 
					      ----------------------------------------------- */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RDS_GROUP_OPTIONS_SET,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RDS_PROC_REG_DONE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_RDS_PI_MATCH_REG_DONE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   FM_RX_EV_MAX_EVENT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} FmRxEventType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum radio_band_type
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FM_US_EU = 0x0,
 | 
				
			||||||
 | 
					  FM_JAPAN_STANDARD = 0x1,
 | 
				
			||||||
 | 
					  FM_JAPAN_WIDE = 0x2,
 | 
				
			||||||
 | 
					  FM_USER_DEFINED = 0x4
 | 
				
			||||||
 | 
					}radio_band_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum emphasis_type
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FM_RX_EMP75 = 0x0,
 | 
				
			||||||
 | 
					  FM_RX_EMP50 = 0x1
 | 
				
			||||||
 | 
					}emphasis_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum channel_space_type
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FM_RX_SPACE_200KHZ = 0x0,
 | 
				
			||||||
 | 
					  FM_RX_SPACE_100KHZ = 0x1,
 | 
				
			||||||
 | 
					  FM_RX_SPACE_50KHZ = 0x2
 | 
				
			||||||
 | 
					}channel_space_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum rds_system_type
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 FM_RX_RDBS_SYSTEM = 0x0,
 | 
				
			||||||
 | 
					 FM_RX_RDS_SYSTEM = 0x1,
 | 
				
			||||||
 | 
					 FM_RX_NO_RDS_SYSTEM = 0x2
 | 
				
			||||||
 | 
					}rds_sytem_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct band_limit_freq
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint32 lower_limit;
 | 
				
			||||||
 | 
					  uint32 upper_limit;
 | 
				
			||||||
 | 
					}band_limit_freq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum rds_sync_type
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 FM_RDS_NOT_SYNCED = 0x0,
 | 
				
			||||||
 | 
					 FM_RDS_SYNCED = 0x1
 | 
				
			||||||
 | 
					}rds_sync_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum stereo_type
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 FM_RX_MONO = 0x0,
 | 
				
			||||||
 | 
					 FM_RX_STEREO = 0x1
 | 
				
			||||||
 | 
					}stereo_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum fm_service_available
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FM_SERVICE_NOT_AVAILABLE = 0x0,
 | 
				
			||||||
 | 
					  FM_SERVICE_AVAILABLE = 0x1
 | 
				
			||||||
 | 
					}fm_service_available;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum mute_type
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  FM_RX_NO_MUTE = 0x00,
 | 
				
			||||||
 | 
					  FM_RX_MUTE_RIGHT = 0x01,
 | 
				
			||||||
 | 
					  FM_RX_MUTE_LEFT = 0x02,
 | 
				
			||||||
 | 
					  FM_RX_MUTE_BOTH = 0x03
 | 
				
			||||||
 | 
					}mute_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum antenna_type
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  WIRED_HS,
 | 
				
			||||||
 | 
					  PWB_ANT
 | 
				
			||||||
 | 
					}antenna_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum audio_output
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  HEADSET,
 | 
				
			||||||
 | 
					  SPEAKER,
 | 
				
			||||||
 | 
					} audio_output;
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					*  RDS/RBDS Program Type type.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef uint8  fm_prgm_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					*   RDS/RBDS Program Identification type.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef uint16 fm_prgmid_type;
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					*  RDS/RBDS Program Services type.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef char fm_prm_services;
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					*  RDS/RBDS Radio Text type.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* FM RX RIVA peek request
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef  struct fm_riva_peek_word
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8   subOpcode;
 | 
				
			||||||
 | 
					  uint32 startaddress;
 | 
				
			||||||
 | 
					  uint8 payload_length;/*In Bytes*/
 | 
				
			||||||
 | 
					  uint8 data[MAX_RIVA_DATA_LEN];
 | 
				
			||||||
 | 
					}__attribute__((packed))fm_riva_peek_word;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* FM RX RIVA poke request
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef struct fm_riva_poke_word
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 uint8   subOpcode;
 | 
				
			||||||
 | 
					 uint32 startaddress;
 | 
				
			||||||
 | 
					 uint8 payload_length;/*In Bytes*/
 | 
				
			||||||
 | 
					 uint8 data[MAX_RIVA_DATA_LEN];
 | 
				
			||||||
 | 
					}__attribute__((packed))fm_riva_poke_word ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* FM RX SSBI peek/poke request
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef struct fm_ssbi_poke_reg
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint16 startaddress;
 | 
				
			||||||
 | 
					  uint8 data;
 | 
				
			||||||
 | 
					}__attribute__((packed))fm_ssbi_poke_reg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* fm Set Get Reset AGC request
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef struct fm_set_get_reset_agc_req
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8 ucCtrl;
 | 
				
			||||||
 | 
					  uint8 ucGainState;
 | 
				
			||||||
 | 
					}__attribute__((packed))fm_set_get_reset_agc_req;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_set_get_reset_agc_params
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8 ucCurrentGainState;
 | 
				
			||||||
 | 
					  uint8 ucGainStateChange1;
 | 
				
			||||||
 | 
					  uint8 ucGainStateChange2;
 | 
				
			||||||
 | 
					  uint8 ucGainStateChange3;
 | 
				
			||||||
 | 
					}__attribute__((packed))fm_set_get_reset_agc_params;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8  status ;
 | 
				
			||||||
 | 
					  uint8  data_length ;
 | 
				
			||||||
 | 
					  uint8  data[DEFAULT_DATA_SIZE];
 | 
				
			||||||
 | 
					}__attribute__((packed)) readDefaults_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  uint8  status ;
 | 
				
			||||||
 | 
					  uint8  data_length ;
 | 
				
			||||||
 | 
					  uint8  data[DEFAULT_DATA_SIZE];
 | 
				
			||||||
 | 
					}__attribute__((packed)) default_read_rsp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*RDS Group counters*/
 | 
				
			||||||
 | 
					typedef  struct fm_rds_grp_cntrsparams
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint32 totalRdsSBlockErrors;
 | 
				
			||||||
 | 
					  uint32 totalRdsGroups;
 | 
				
			||||||
 | 
					  uint32 totalRdsGroup0;
 | 
				
			||||||
 | 
					  uint32 totalRdsGroup2;
 | 
				
			||||||
 | 
					  uint32 totalRdsBlockB;
 | 
				
			||||||
 | 
					  uint32 totalRdsProcessedGroup0;
 | 
				
			||||||
 | 
					  uint32 totalRdsProcessedGroup2;
 | 
				
			||||||
 | 
					  uint32 totalRdsGroupFiltered;
 | 
				
			||||||
 | 
					  uint32 totalRdsChangeFiltered;
 | 
				
			||||||
 | 
					}__attribute__((packed)) fm_rds_grp_cntrsparams;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*RDS Group counters extended */
 | 
				
			||||||
 | 
					typedef  struct fm_rds_grpcntrs_extendedparams
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint32 totalRdsSyncLoss;
 | 
				
			||||||
 | 
					  uint32 totalRdsNotSync;
 | 
				
			||||||
 | 
					  uint32 totalRdsSyncInt;
 | 
				
			||||||
 | 
					}__attribute__((packed)) fm_rds_grpcntrs_extendedparams;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef char fm_radiotext_info;
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					*  FM Global Paramaters struct.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint32  current_station_freq;/*a frequency in kHz the band range*/
 | 
				
			||||||
 | 
					  uint8 service_available;
 | 
				
			||||||
 | 
					  uint8 rssi; /* rssi range from 0-100*/
 | 
				
			||||||
 | 
					  uint8 stype;
 | 
				
			||||||
 | 
					  uint8 rds_sync_status;
 | 
				
			||||||
 | 
					  uint8 mute_status;
 | 
				
			||||||
 | 
					  uint8 ssbi_peek_data;
 | 
				
			||||||
 | 
					  fm_prgmid_type pgm_id; /* Program Id */
 | 
				
			||||||
 | 
					  fm_prgm_type pgm_type; /* Program type */
 | 
				
			||||||
 | 
					  fm_prm_services  pgm_services[MAX_RDS_PS_LENGTH];
 | 
				
			||||||
 | 
					  fm_radiotext_info  radio_text[MAX_RDS_RT_LENGTH];/* RT maximum is 64 bytes */
 | 
				
			||||||
 | 
					  fm_riva_poke_word  riva_data_access_params;
 | 
				
			||||||
 | 
					  fm_set_get_reset_agc_params set_get_reset_agc_params;
 | 
				
			||||||
 | 
					  fm_rds_grp_cntrsparams rds_group_counters;
 | 
				
			||||||
 | 
					  fm_rds_grpcntrs_extendedparams rds_group_counters_extended;
 | 
				
			||||||
 | 
					  readDefaults_data  default_read_data;
 | 
				
			||||||
 | 
					  uint8 fm_ps_length;
 | 
				
			||||||
 | 
					  uint8 fm_rt_length;
 | 
				
			||||||
 | 
					  uint8 sinr_samples;
 | 
				
			||||||
 | 
					  char sinr_threshold;
 | 
				
			||||||
 | 
					  uint8 On_channel_threshold;
 | 
				
			||||||
 | 
					  uint8 Off_channel_threshold;
 | 
				
			||||||
 | 
					}fm_station_params_available;
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					*  FM Config Request structure.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef struct fm_config_data
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8 band;
 | 
				
			||||||
 | 
					  uint8 emphasis;
 | 
				
			||||||
 | 
					  uint8 spacing;
 | 
				
			||||||
 | 
					  uint8 rds_system;
 | 
				
			||||||
 | 
					  band_limit_freq bandlimits;
 | 
				
			||||||
 | 
					  uint8 is_fm_tx_on;
 | 
				
			||||||
 | 
					}fm_config_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* FM RDS Options Config Request
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef struct fm_rds_options
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint32 rds_group_mask;
 | 
				
			||||||
 | 
					  uint32 rds_group_buffer_size;
 | 
				
			||||||
 | 
					  uint8 rds_change_filter;
 | 
				
			||||||
 | 
					}fm_rds_options;
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* FM RX Search stations request
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef struct fm_search_stations
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8 search_mode;
 | 
				
			||||||
 | 
					  uint8 dwell_period;
 | 
				
			||||||
 | 
					  uint8 search_dir;
 | 
				
			||||||
 | 
					}fm_search_stations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* FM RX Search DDS stations request
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef struct fm_search_rds_stations
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8 search_mode;
 | 
				
			||||||
 | 
					  uint8 dwell_period;
 | 
				
			||||||
 | 
					  uint8 search_dir;
 | 
				
			||||||
 | 
					  uint8 program_type;
 | 
				
			||||||
 | 
					  uint16 program_id;
 | 
				
			||||||
 | 
					}fm_search_rds_stations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* FM RX Search station lists request
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef struct fm_search_list_stations
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8 search_mode;
 | 
				
			||||||
 | 
					  uint8 search_dir;
 | 
				
			||||||
 | 
					  uint32 srch_list_max;
 | 
				
			||||||
 | 
					  /**< Maximum number of stations that can be returned from a search. */
 | 
				
			||||||
 | 
					  uint8 program_type;
 | 
				
			||||||
 | 
					}fm_search_list_stations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					* FM RX I2C request
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef struct fm_i2c_params
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8 slaveaddress;
 | 
				
			||||||
 | 
					  uint8 offset;
 | 
				
			||||||
 | 
					  uint8 payload_length;
 | 
				
			||||||
 | 
					  uint8 data[64];
 | 
				
			||||||
 | 
					}fm_i2c_params;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Structure containing the RDS PS Info to be transmitted */
 | 
				
			||||||
 | 
					typedef struct _tsFtmFmRdsTxPsType
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint32                ulPSStrLen;
 | 
				
			||||||
 | 
					  /**< The size of the cTxPSStrPtr buffer.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint32                ucTxPSRptCnt;
 | 
				
			||||||
 | 
					  /**< The number of times each 8 character string is repeated before the next
 | 
				
			||||||
 | 
					       string is transmitted.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint16                tusTxPi;
 | 
				
			||||||
 | 
					  /**< RDS/RBDS Program Identification to use for Program Service transmissions.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint8                 tucTxPSPty;
 | 
				
			||||||
 | 
					  /**< The RDS/RBDS Program Type to transmit.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const char            cTxPSStrPtr[108];
 | 
				
			||||||
 | 
					  /**< A pointer to a buffer containing the Program Service string to transmit
 | 
				
			||||||
 | 
					       (must be null terminated).
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} tsFtmFmRdsTxPsType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _tsFtmFmRdsTxRtType
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint32                ulRTStrLen;
 | 
				
			||||||
 | 
					  /**< The size of the cTxRTStrPtr buffer.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint16                tusTxPi;
 | 
				
			||||||
 | 
					  /**< RDS/RBDS Program Identification to use for RadioText transmissions.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  uint8                 tucTxRTPty;
 | 
				
			||||||
 | 
					  /**< The RDS/RBDS Program Type to transmit.
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const char            cTxRTStrPtr[65];
 | 
				
			||||||
 | 
					  /**< A pointer to a buffer containing the RadioText string to transmit
 | 
				
			||||||
 | 
					       (must be null terminated).
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} tsFtmFmRdsTxRtType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _ftm_def_data_rd_req
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8    mode;
 | 
				
			||||||
 | 
					  uint8    length;
 | 
				
			||||||
 | 
					  uint8    param_len;
 | 
				
			||||||
 | 
					  uint8    param;
 | 
				
			||||||
 | 
					} __attribute__((packed))ftm_fm_def_data_rd_req;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct _ftm_def_data_wr_req
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  uint8    mode;
 | 
				
			||||||
 | 
					  uint8    length;
 | 
				
			||||||
 | 
					  uint8    data[DEFAULT_DATA_SIZE];
 | 
				
			||||||
 | 
					} __attribute__((packed))ftm_fm_def_data_wr_req;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  uint8                       length; /*RDS PS string length*/
 | 
				
			||||||
 | 
					  uint8                       string[MAX_RDS_PS_LENGTH]; /* RDS string */
 | 
				
			||||||
 | 
					}__attribute__((packed)) fmrdsps_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  uint8                       length; /*RDS PS string length*/
 | 
				
			||||||
 | 
					  uint8                       string[MAX_RDS_RT_LENGTH]; /* RDS string */
 | 
				
			||||||
 | 
					}__attribute__((packed)) fmrdsrt_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					*  FM All Request Union type.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					typedef union fm_cfg_request
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  fm_config_data cfg_param;
 | 
				
			||||||
 | 
					  uint8 mute_param;
 | 
				
			||||||
 | 
					  uint8 stereo_param;
 | 
				
			||||||
 | 
					  uint32 freq;
 | 
				
			||||||
 | 
					  fm_rds_options rds_options;
 | 
				
			||||||
 | 
					  uint8 power_mode;
 | 
				
			||||||
 | 
					  uint8 signal_threshold;
 | 
				
			||||||
 | 
					  fm_search_stations search_stations_options;
 | 
				
			||||||
 | 
					  fm_search_rds_stations search_rds_stations_options;
 | 
				
			||||||
 | 
					  fm_search_list_stations search_list_stations_options;
 | 
				
			||||||
 | 
					  fm_i2c_params i2c_params;
 | 
				
			||||||
 | 
					  uint32 rds_group_options;
 | 
				
			||||||
 | 
					  uint16 rx_af_threshold;
 | 
				
			||||||
 | 
					  uint8 rx_rssi_checktimer;
 | 
				
			||||||
 | 
					  uint rx_rds_pi_timer;
 | 
				
			||||||
 | 
					  tsFtmFmRdsTxPsType tuFmPSParams;
 | 
				
			||||||
 | 
					  tsFtmFmRdsTxRtType tuFmRTParams;
 | 
				
			||||||
 | 
					  uint8 soft_mute_param;
 | 
				
			||||||
 | 
					  uint8 antenna_type;
 | 
				
			||||||
 | 
					  uint8 tx_tone_param;
 | 
				
			||||||
 | 
					  uint8 rds_grp_counters;
 | 
				
			||||||
 | 
					  uint8 rds_grp_counters_ext;
 | 
				
			||||||
 | 
					  uint8 hlsi;
 | 
				
			||||||
 | 
					  uint8 sinr_samples;
 | 
				
			||||||
 | 
					  char sinr_threshold;
 | 
				
			||||||
 | 
					  uint8 On_channel_threshold;
 | 
				
			||||||
 | 
					  uint8 Off_channel_threshold;
 | 
				
			||||||
 | 
					  uint8 notch;
 | 
				
			||||||
 | 
					  fm_riva_peek_word riva_peek_params;
 | 
				
			||||||
 | 
					  fm_riva_poke_word riva_data_access_params;
 | 
				
			||||||
 | 
					  fm_ssbi_poke_reg ssbi_access_params;
 | 
				
			||||||
 | 
					  fm_set_get_reset_agc_req set_get_agc_req_parameters;
 | 
				
			||||||
 | 
					  ftm_fm_def_data_rd_req rd_default;
 | 
				
			||||||
 | 
					  ftm_fm_def_data_wr_req wr_default;
 | 
				
			||||||
 | 
					  uint8 tx_pwr_cfg;
 | 
				
			||||||
 | 
					  uint8 audio_output;
 | 
				
			||||||
 | 
					  uint8 audio_vlm;
 | 
				
			||||||
 | 
					}fm_cfg_request;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FTM FM request type */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_cmd_code_type              cmd_code;
 | 
				
			||||||
 | 
					  diagpkt_subsys_id_type             subsys_id;
 | 
				
			||||||
 | 
					  diagpkt_subsys_cmd_code_type       subsys_cmd_code;
 | 
				
			||||||
 | 
					  uint16                             cmd_id; /* command id (required) */
 | 
				
			||||||
 | 
					  uint16                             cmd_data_len;
 | 
				
			||||||
 | 
					  uint16                             cmd_rsp_pkt_size;
 | 
				
			||||||
 | 
					  byte                               data[1];
 | 
				
			||||||
 | 
					}__attribute__((packed))ftm_fm_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Set MuteMode Response */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  uint8                       mutemode;
 | 
				
			||||||
 | 
					}__attribute__((packed)) mutemode_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Set StereoMode Response */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  uint8                       stereomode;
 | 
				
			||||||
 | 
					}__attribute__((packed)) stereomode_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* I2C Response */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  uint32                      length; /*length of data read */
 | 
				
			||||||
 | 
					  uint8                       data[64]; /* I2C read dat buffer */
 | 
				
			||||||
 | 
					}__attribute__((packed)) fmbusread_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  uint8                       sub_opcode;
 | 
				
			||||||
 | 
					  uint32                      start_address;
 | 
				
			||||||
 | 
					  uint8                       length; /*length of data read */
 | 
				
			||||||
 | 
					  uint8                       data[MAX_RIVA_DATA_LEN]; /* read dat buffer */
 | 
				
			||||||
 | 
					}__attribute__((packed)) rivaData_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  uint8                       data;
 | 
				
			||||||
 | 
					}__attribute__((packed)) ssbiPeek_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  uint8                       uccurrentgainstate;
 | 
				
			||||||
 | 
					  uint8                       ucgainstatechange1;
 | 
				
			||||||
 | 
					  uint8                       ucgainstatechange2;
 | 
				
			||||||
 | 
					  uint8                       ucgainstatechange3;
 | 
				
			||||||
 | 
					}__attribute__((packed)) set_get_reset_agc_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Read RDS Group counters responce*/
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  fm_rds_grp_cntrsparams  read_rds_cntrs;
 | 
				
			||||||
 | 
					}__attribute__((packed)) ReadRDSCntrs_responce;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Read RDS Group counters response*/
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  fm_rds_grpcntrs_extendedparams  read_rds_cntrs_ext;
 | 
				
			||||||
 | 
					}__attribute__((packed)) ReadRDSCntrs_ext_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Generic Response */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					}__attribute__((packed)) generic_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ;
 | 
				
			||||||
 | 
					  char	                      result ;
 | 
				
			||||||
 | 
					  uint16                      afthreshold;
 | 
				
			||||||
 | 
					}  fmrxsetafthreshold_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ;
 | 
				
			||||||
 | 
					  char                        result ;
 | 
				
			||||||
 | 
					  uint8                       sinr_sample;
 | 
				
			||||||
 | 
					}  getsinrsamples_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ;
 | 
				
			||||||
 | 
					  char                        result ;
 | 
				
			||||||
 | 
					  char                        sinr_threshold;
 | 
				
			||||||
 | 
					}  getsinrthreshold_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ;
 | 
				
			||||||
 | 
					  char                        result ;
 | 
				
			||||||
 | 
					  uint8                       sinr_on_th;
 | 
				
			||||||
 | 
					}  getonchannelthreshold_response;
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ;
 | 
				
			||||||
 | 
					  char                        result ;
 | 
				
			||||||
 | 
					  uint8                       sinr_off_th;
 | 
				
			||||||
 | 
					}  getoffchannelthreshold_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ;
 | 
				
			||||||
 | 
					  char                        result ;
 | 
				
			||||||
 | 
					  uint8                       rssitimer;
 | 
				
			||||||
 | 
					}  fmrxsetrssichecktimer_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ;
 | 
				
			||||||
 | 
					  char                        result ;
 | 
				
			||||||
 | 
					  uint8                       rdspitimer;
 | 
				
			||||||
 | 
					}  fmrxsetrdspitimer_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ;
 | 
				
			||||||
 | 
					  char                        result ;
 | 
				
			||||||
 | 
					  uint8                       threshold;
 | 
				
			||||||
 | 
					}  threshold_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ;
 | 
				
			||||||
 | 
					  char                        result ;
 | 
				
			||||||
 | 
					  uint32                      rdserrcount;
 | 
				
			||||||
 | 
					  uint32                      numofblocks;
 | 
				
			||||||
 | 
					}  rds_err_count_response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Custom response for Get station parameters request */
 | 
				
			||||||
 | 
					struct fm_rx_get_station_parameters_response_t
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  diagpkt_subsys_header_type  header ; /*Diag header*/
 | 
				
			||||||
 | 
					  char                        result ;/* result */
 | 
				
			||||||
 | 
					  uint32                      stationFreq;
 | 
				
			||||||
 | 
					  /* The currently tuned frequency in kHz (Example: 96500 -> 96.5Mhz)*/
 | 
				
			||||||
 | 
					  uint8                       servAvble;
 | 
				
			||||||
 | 
					  /* The current service available indicator for the current station */
 | 
				
			||||||
 | 
					  uint8                       rssi;
 | 
				
			||||||
 | 
					  /* The current signal strength level (0-100 range). */
 | 
				
			||||||
 | 
					  uint8                       stereoProgram;
 | 
				
			||||||
 | 
					  /* The current mono/stereo indicator for this station */
 | 
				
			||||||
 | 
					  uint8                       rdsSyncStatus;
 | 
				
			||||||
 | 
					  /* The current RDS/RBDS synchronization status */
 | 
				
			||||||
 | 
					  uint8                       muteMode;
 | 
				
			||||||
 | 
					  /* The current FM mute mode */
 | 
				
			||||||
 | 
					}__attribute__((packed));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* FTM Log Packet - Used to send back the event of a HCI Command */
 | 
				
			||||||
 | 
					typedef PACKED struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  log_hdr_type hdr;
 | 
				
			||||||
 | 
					  byte         EvName;
 | 
				
			||||||
 | 
					   /* Event ID indicates which event is being returned. */
 | 
				
			||||||
 | 
					  byte         EvResult;
 | 
				
			||||||
 | 
					  byte         data[1];         /* Variable length payload,
 | 
				
			||||||
 | 
					                                  look at FTM log id for contents */
 | 
				
			||||||
 | 
					} ftm_fm_log_pkt_type;
 | 
				
			||||||
 | 
					#define FTM_FM_LOG_HEADER_SIZE (sizeof (ftm_fm_log_pkt_type) - 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_rx_get_station_parameters_response_t fm_rx_get_station_parameters_response;
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_fm_dispatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Dispatch routine for the various FM Rx/Tx commands. Copies the data into
 | 
				
			||||||
 | 
					  a global union data structure before calling the processing routine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  A Packed structre pointer including the response to the FTM FM packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void * ftm_fm_dispatch(ftm_fm_pkt_type *ftm_fm_pkt, uint16 length );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					FUNCTION      ftm_fm_enable_audio
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  This function is used to take the audio output mode from QRCT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  none
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					PACKED void* ftm_fm_enable_audio( void );
 | 
				
			||||||
 | 
					PACKED void* ftm_fm_disable_audio( void );
 | 
				
			||||||
 | 
					PACKED void* ftm_fm_setting_volume(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* CONFIG_FTM_FM */
 | 
				
			||||||
							
								
								
									
										1178
									
								
								feeds/ipq95xx/ftm/src/ftm_fm_pfal.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1178
									
								
								feeds/ipq95xx/ftm/src/ftm_fm_pfal.h
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3668
									
								
								feeds/ipq95xx/ftm/src/ftm_fm_pfal_linux.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3668
									
								
								feeds/ipq95xx/ftm/src/ftm_fm_pfal_linux.c
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3338
									
								
								feeds/ipq95xx/ftm/src/ftm_fm_pfal_linux_3990.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3338
									
								
								feeds/ipq95xx/ftm/src/ftm_fm_pfal_linux_3990.c
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										549
									
								
								feeds/ipq95xx/ftm/src/ftm_iot.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										549
									
								
								feeds/ipq95xx/ftm/src/ftm_iot.c
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,549 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					*Copyright (c) 2018-2020, 2022 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					*All Rights Reserved.
 | 
				
			||||||
 | 
					*Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* IPQ-QCA402X specific file */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IPQ_AP_HOST_IOT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					#include <mtd/mtd-user.h>
 | 
				
			||||||
 | 
					#include "comdef.h"
 | 
				
			||||||
 | 
					#include "diagcmd.h"
 | 
				
			||||||
 | 
					#include "ftm_wlan.h"
 | 
				
			||||||
 | 
					#include "ftm_dbg.h"
 | 
				
			||||||
 | 
					#include "ftm_iot.h"
 | 
				
			||||||
 | 
					#ifdef IPQ_AP_HOST_IOT_QCA402X
 | 
				
			||||||
 | 
					#include "diag_api.h"
 | 
				
			||||||
 | 
					#endif /* IPQ_AP_HOST_IOT_QCA402X */
 | 
				
			||||||
 | 
					#ifdef IPQ_AP_HOST_IOT_IPQ
 | 
				
			||||||
 | 
					#include "btdaemon.h"
 | 
				
			||||||
 | 
					#endif /* IPQ50XX, IPQ95XX */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NHDLC_TERM 126
 | 
				
			||||||
 | 
					#define NHDLC_VERSION 1
 | 
				
			||||||
 | 
					#define NHDLC_TERM_SIZE 1
 | 
				
			||||||
 | 
					#define FLASH_CMD_ID_POS 1
 | 
				
			||||||
 | 
					#define MAX_BUF_SIZE 2048
 | 
				
			||||||
 | 
					#define WAIT_TIME_MS 100
 | 
				
			||||||
 | 
					#define SUBSYS_CMD_ID_POS 2
 | 
				
			||||||
 | 
					#define RESERVED_CMD_ID 0
 | 
				
			||||||
 | 
					#define DUT_INTERFACE_SELECT 1
 | 
				
			||||||
 | 
					#define DUT_INTERFACE_ID_POS 4
 | 
				
			||||||
 | 
					#define DUT_INTERFACE_SELECT_POS 10
 | 
				
			||||||
 | 
					#define DIAG_HDR_LEN (sizeof(diag_nonhdlc_hdr_t) + NHDLC_TERM_SIZE)
 | 
				
			||||||
 | 
					#define FTM_IOT_LOG_HEADER_SIZE  sizeof(ftm_iot_log_pkt_type)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MEMSET_RESET_VALUE 0
 | 
				
			||||||
 | 
					#define DIAG_HEADER_SIZE 12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void diagpkt_free(void *pkt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void print_array(uint8_t *addr, int len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					    int line = 1;
 | 
				
			||||||
 | 
					    for (i = 0; i < len; i++) {
 | 
				
			||||||
 | 
					        if (i == (line * 80)) {
 | 
				
			||||||
 | 
					           DPRINTF(FTM_DBG_TRACE, "\n");
 | 
				
			||||||
 | 
					           line++;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_TRACE, "%02X ", addr[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    DPRINTF(FTM_DBG_TRACE, "\n");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#ifdef IPQ_AP_HOST_IOT_QCA402X
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					  FUNCTION iot_thr_func_qca402x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  DESCRIPTION
 | 
				
			||||||
 | 
					  Continously polls QCA402X for asynchronous data responses and
 | 
				
			||||||
 | 
					  logs receievd asynchronous data responses to Diag module using
 | 
				
			||||||
 | 
					  log-submit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  Returns NULL on failure. Function also exits with NULL return value
 | 
				
			||||||
 | 
					  when main indicates that this thread should be stopped
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SIDE EFFECTS
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ===========================================================================*/
 | 
				
			||||||
 | 
					void *iot_thr_func_qca402x(void *hdl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int bytes = 0;
 | 
				
			||||||
 | 
					    void *rsp2 = NULL;
 | 
				
			||||||
 | 
					    int diag_hdr_len = DIAG_HDR_LEN ;
 | 
				
			||||||
 | 
					    void *new_iot_ftm_rsp2_pkt = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!hdl) {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "Invalid iotd handle\n");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    new_iot_ftm_rsp2_pkt = malloc(MAX_BUF_SIZE);
 | 
				
			||||||
 | 
					    if (!new_iot_ftm_rsp2_pkt) {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "Could not allocate response packet \n");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while(1) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (thread_stop == 1) {
 | 
				
			||||||
 | 
					            DPRINTF(FTM_DBG_TRACE, "FTMd: Exiting thread.\n");
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        memset(new_iot_ftm_rsp2_pkt, MEMSET_RESET_VALUE, MAX_BUF_SIZE);
 | 
				
			||||||
 | 
					        sem_wait(&iot_sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /*If we recieve a response from QCA402X, allocate a buffer using diag alloc with correct
 | 
				
			||||||
 | 
					          subsystem code and length */
 | 
				
			||||||
 | 
					        while ((bytes = diag_recv(hdl, (uint8_t *)new_iot_ftm_rsp2_pkt,
 | 
				
			||||||
 | 
					                                                      MAX_BUF_SIZE,
 | 
				
			||||||
 | 
					                                                      WAIT_TIME_MS)) >= 0) {
 | 
				
			||||||
 | 
					            if (bytes > MAX_BUF_SIZE || bytes <= diag_hdr_len) {
 | 
				
			||||||
 | 
					                DPRINTF(FTM_DBG_ERROR, "Could not allocate async log response packet\n");
 | 
				
			||||||
 | 
					                free (new_iot_ftm_rsp2_pkt);
 | 
				
			||||||
 | 
					                return NULL;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            rsp2 = diagpkt_subsys_alloc(DIAG_SUBSYS_FTM, ftm_iot_cmd_code, (bytes - diag_hdr_len));
 | 
				
			||||||
 | 
					            if (!rsp2) {
 | 
				
			||||||
 | 
					                DPRINTF(FTM_DBG_ERROR, "Could not allocate async log response packet\n");
 | 
				
			||||||
 | 
					                free (new_iot_ftm_rsp2_pkt);
 | 
				
			||||||
 | 
					                return NULL;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /* Remove NHDLC header from recieved packet and store contents in
 | 
				
			||||||
 | 
					               buffer allocated above */
 | 
				
			||||||
 | 
					            memcpy(rsp2, (new_iot_ftm_rsp2_pkt + diag_hdr_len - NHDLC_TERM_SIZE),
 | 
				
			||||||
 | 
					                                                         (bytes - diag_hdr_len));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            DPRINTF(FTM_DBG_TRACE, "FTMd: Asynchronous Data response has been sent.\n");
 | 
				
			||||||
 | 
					            print_array((uint8_t *)rsp2, (bytes - diag_hdr_len) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            /*Remove an additional 4 bytes of header and log packet to diag module
 | 
				
			||||||
 | 
					              asynchronously for further processing*/
 | 
				
			||||||
 | 
					            log_submit(rsp2 + diag_hdr_len - NHDLC_TERM_SIZE);
 | 
				
			||||||
 | 
					            diagpkt_free (rsp2);
 | 
				
			||||||
 | 
					            memset(new_iot_ftm_rsp2_pkt, MEMSET_RESET_VALUE, MAX_BUF_SIZE);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sem_post(&iot_sem_async);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    free (new_iot_ftm_rsp2_pkt);
 | 
				
			||||||
 | 
					    diagpkt_free (rsp2);
 | 
				
			||||||
 | 
					    pthread_exit(NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					  FUNCTION ftm_iot_dispatch_qca402x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  DESCRIPTION
 | 
				
			||||||
 | 
					  Function processes WIN IOT specific requests and relays to
 | 
				
			||||||
 | 
					  QCA402x FTM layer for further processing. Recieves response
 | 
				
			||||||
 | 
					  buffer from QCA402x and returns buffer meant for diag call back
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  This function handles NHDLC to HDLC translation and vice-versa
 | 
				
			||||||
 | 
					  before sending and receivng buffers to QCA402X FTM layer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  Returns back buffer that is meant for diag callback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SIDE EFFECTS
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *ftm_iot_dispatch_qca402x(void *iot_ftm_pkt, int pkt_len, void *hdl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int diag_hdr_len = DIAG_HDR_LEN;
 | 
				
			||||||
 | 
					    int ret = 0;
 | 
				
			||||||
 | 
					    byte *payload_ptr = NULL;
 | 
				
			||||||
 | 
					    void *rsp1 = NULL;
 | 
				
			||||||
 | 
					    ftm_iot_req_pkt_type *new_iot_ftm_pkt = NULL;
 | 
				
			||||||
 | 
					    void *new_iot_ftm_rsp_pkt = NULL;
 | 
				
			||||||
 | 
					    char command[50] = {'\0'};
 | 
				
			||||||
 | 
					    uint16_t *ftm_iot_flash_ptr = NULL;
 | 
				
			||||||
 | 
					    uint16 ftm_iot_flash_cmd_code = 0;
 | 
				
			||||||
 | 
					    /* The new packet length will be length of original request packet
 | 
				
			||||||
 | 
					       + size of NHDLC header + 1 byte of termination character */
 | 
				
			||||||
 | 
					    int new_pkt_len = pkt_len + diag_hdr_len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!iot_ftm_pkt || !pkt_len || !hdl) {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "Invalid ftm iot request packet or iotd handle\n");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    new_iot_ftm_pkt = malloc(sizeof(ftm_iot_req_pkt_type) + pkt_len + NHDLC_TERM_SIZE);
 | 
				
			||||||
 | 
					    if (!new_iot_ftm_pkt) {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "Could not create new ftm iot request packet\n");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    memset(new_iot_ftm_pkt, MEMSET_RESET_VALUE, (sizeof(ftm_iot_req_pkt_type) + pkt_len + NHDLC_TERM_SIZE));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    new_iot_ftm_rsp_pkt = malloc(MAX_BUF_SIZE);
 | 
				
			||||||
 | 
					    if (!new_iot_ftm_rsp_pkt) {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "Could not create new ftm iot response packet\n");
 | 
				
			||||||
 | 
					        free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    memset(new_iot_ftm_rsp_pkt, MEMSET_RESET_VALUE, MAX_BUF_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Add Non-HDLC header to request packet
 | 
				
			||||||
 | 
					       and populate NHDLC header*/
 | 
				
			||||||
 | 
					    new_iot_ftm_pkt->hdr.start = NHDLC_TERM;
 | 
				
			||||||
 | 
					    new_iot_ftm_pkt->hdr.version = NHDLC_VERSION;
 | 
				
			||||||
 | 
					    new_iot_ftm_pkt->hdr.length = pkt_len;
 | 
				
			||||||
 | 
					    memcpy(&(new_iot_ftm_pkt->payload), iot_ftm_pkt, pkt_len);
 | 
				
			||||||
 | 
					    payload_ptr = (byte *) &(new_iot_ftm_pkt->payload);
 | 
				
			||||||
 | 
					    *( payload_ptr + pkt_len) = NHDLC_TERM;
 | 
				
			||||||
 | 
					    ftm_iot_cmd_code = *(payload_ptr + SUBSYS_CMD_ID_POS);
 | 
				
			||||||
 | 
					    ftm_iot_dut_interface_code = *(payload_ptr + DUT_INTERFACE_ID_POS);
 | 
				
			||||||
 | 
					    ftm_iot_reserved_code = *(payload_ptr + SUBSYS_CMD_ID_POS + 1);
 | 
				
			||||||
 | 
					    ftm_iot_flash_ptr = (uint16_t *) &(new_iot_ftm_pkt->payload);
 | 
				
			||||||
 | 
					    ftm_iot_flash_cmd_code = *(ftm_iot_flash_ptr + FLASH_CMD_ID_POS);
 | 
				
			||||||
 | 
					    /*Print packet after adding headers */
 | 
				
			||||||
 | 
					    DPRINTF(FTM_DBG_TRACE, "FTMd: Request Packet of size %d bytes sent:\n", new_pkt_len);
 | 
				
			||||||
 | 
					    print_array((uint8_t *)new_iot_ftm_pkt, new_pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*If the request packet it a DUT interface selection command,
 | 
				
			||||||
 | 
					      update interface number and return a response packet that
 | 
				
			||||||
 | 
					      is an encho of the request packet. ( In the case of multiple
 | 
				
			||||||
 | 
					      QCA402x DUT attaches on IPQ platforms) */
 | 
				
			||||||
 | 
					    if (((ftm_iot_cmd_code == MFG_CMD_ID_BLE_HCI) || (ftm_iot_cmd_code == MFG_CMD_ID_I15P4_HMI))
 | 
				
			||||||
 | 
					                                          && (ftm_iot_dut_interface_code == DUT_INTERFACE_SELECT)
 | 
				
			||||||
 | 
					                                          && (ftm_iot_reserved_code == RESERVED_CMD_ID)){
 | 
				
			||||||
 | 
					        interface = *(payload_ptr + DUT_INTERFACE_SELECT_POS) - 1;
 | 
				
			||||||
 | 
					        if (interface < 0) {
 | 
				
			||||||
 | 
					            DPRINTF(FTM_DBG_ERROR, "Invalid DUT interface selection command\n");
 | 
				
			||||||
 | 
					            free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					            free (new_iot_ftm_rsp_pkt);
 | 
				
			||||||
 | 
					            return NULL;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					        rsp1 = diagpkt_subsys_alloc(DIAG_SUBSYS_FTM, ftm_iot_cmd_code, pkt_len);
 | 
				
			||||||
 | 
					        if (!rsp1){
 | 
				
			||||||
 | 
					            DPRINTF(FTM_DBG_ERROR, "Could not allocate response packet for interface selection\n");
 | 
				
			||||||
 | 
					            free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					            free (new_iot_ftm_rsp_pkt);
 | 
				
			||||||
 | 
					            return NULL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        memcpy(rsp1, iot_ftm_pkt, pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_TRACE, "FTMd: The DUT interface selected is %d \n",interface);
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_TRACE, "FTMd: DUT interface resp packet of size %d bytes sent:\n",pkt_len);
 | 
				
			||||||
 | 
					        print_array((uint8_t *)rsp1, pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					        free (new_iot_ftm_rsp_pkt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /*This resp pointer will be freed by diag later*/
 | 
				
			||||||
 | 
					        return rsp1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*If the request packet is a MFG PROG command,
 | 
				
			||||||
 | 
					      launch flash script and return a response packet that indicates
 | 
				
			||||||
 | 
					      flashing mode of QCA402x is enabled or disabled */
 | 
				
			||||||
 | 
					    if ((ftm_iot_flash_cmd_code == MFG_CMD_ID_MISC_PROG_MODE)){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (ftm_iot_dut_interface_code == MFG_FLASH_ON){
 | 
				
			||||||
 | 
					            strlcpy(command, "/usr/bin/qca402x_flash.sh flash on", sizeof(command));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (ftm_iot_dut_interface_code == MFG_FLASH_OFF){
 | 
				
			||||||
 | 
					            strlcpy(command, "/usr/bin/qca402x_flash.sh flash off", sizeof(command));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (ftm_iot_dut_interface_code == MFG_USB_OFF){
 | 
				
			||||||
 | 
					            strlcpy(command, "/usr/bin/qca402x_flash.sh usb-select off", sizeof(command));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (ftm_iot_dut_interface_code == MFG_USB_ON){
 | 
				
			||||||
 | 
					           strlcpy(command, "/usr/bin/qca402x_flash.sh usb-select on", sizeof(command));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (ftm_iot_dut_interface_code == MFG_EDL_OFF){
 | 
				
			||||||
 | 
					           strlcpy(command, "/usr/bin/qca402x_flash.sh edl off", sizeof(command));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (ftm_iot_dut_interface_code == MFG_EDL_ON){
 | 
				
			||||||
 | 
					           strlcpy(command, "/usr/bin/qca402x_flash.sh edl on", sizeof(command));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /*Return with NULL if string is empty or packet length is less than
 | 
				
			||||||
 | 
					          10 for a DUT interface selection command to make sure there will be
 | 
				
			||||||
 | 
					          no out of bound access */
 | 
				
			||||||
 | 
					        if ( (command[0] == '\0') || (pkt_len <= DUT_INTERFACE_ID_POS) ) {
 | 
				
			||||||
 | 
					            DPRINTF(FTM_DBG_ERROR, "Error: Invalid MFG Program command\n");
 | 
				
			||||||
 | 
					            free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					            free (new_iot_ftm_rsp_pkt);
 | 
				
			||||||
 | 
					            return NULL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        system(command);
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_TRACE, "\n FTMd: Sent system command: %s \n", command);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* Check of size for packet pointed to by payload_ptr has been done above
 | 
				
			||||||
 | 
					           using pkt_len to make sure there is no out of bound access */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        *(payload_ptr + DUT_INTERFACE_ID_POS) = MFG_PROG_RESP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        rsp1 = diagpkt_subsys_alloc(DIAG_SUBSYS_FTM, ftm_iot_cmd_code, pkt_len);
 | 
				
			||||||
 | 
					        if (!rsp1){
 | 
				
			||||||
 | 
					            DPRINTF(FTM_DBG_ERROR, "Could not allocate response packet for MFG flash commands\n");
 | 
				
			||||||
 | 
					            free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					            free (new_iot_ftm_rsp_pkt);
 | 
				
			||||||
 | 
					            return NULL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        memcpy(rsp1, payload_ptr, pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_TRACE, "FTMd: MFG Flash resp packet of size %d bytes sent:\n",pkt_len);
 | 
				
			||||||
 | 
					        print_array((uint8_t *)rsp1, pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					        free (new_iot_ftm_rsp_pkt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /*This resp pointer will be freed by diag later*/
 | 
				
			||||||
 | 
					        return rsp1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sem_wait(&iot_sem_async);
 | 
				
			||||||
 | 
					    /* Call IPQ-QCA402x diag APIs */
 | 
				
			||||||
 | 
					    ret = diag_send(hdl, interface, (uint8_t *)new_iot_ftm_pkt, new_pkt_len);
 | 
				
			||||||
 | 
					    if ((ret < 0) || (ret > MAX_BUF_SIZE)) {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "Could not send the request packet to QCA402x \n");
 | 
				
			||||||
 | 
					        free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					        free (new_iot_ftm_rsp_pkt);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = diag_recv(hdl, (uint8_t *)new_iot_ftm_rsp_pkt, MAX_BUF_SIZE, WAIT_TIME_MS);
 | 
				
			||||||
 | 
					    if ((ret < 0) || (ret > MAX_BUF_SIZE) || (ret <= diag_hdr_len)) {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "Could not recieve packet from QCA402x\n");
 | 
				
			||||||
 | 
					        free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					        free (new_iot_ftm_rsp_pkt);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DPRINTF(FTM_DBG_TRACE,"Received Command Response of %d bytes\n",ret);
 | 
				
			||||||
 | 
					    print_array((uint8_t *)new_iot_ftm_rsp_pkt, ret);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    rsp1 = diagpkt_subsys_alloc(DIAG_SUBSYS_FTM, ftm_iot_cmd_code, (ret - diag_hdr_len));
 | 
				
			||||||
 | 
					    if (!rsp1){
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "Could not allocate response packet\n");
 | 
				
			||||||
 | 
					        free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					        free (new_iot_ftm_rsp_pkt);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy(rsp1, (new_iot_ftm_rsp_pkt + diag_hdr_len - NHDLC_TERM_SIZE), (ret - diag_hdr_len));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    free (new_iot_ftm_pkt);
 | 
				
			||||||
 | 
					    free (new_iot_ftm_rsp_pkt);
 | 
				
			||||||
 | 
					    sem_post(&iot_sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*This resp pointer will be freed by diag module later*/
 | 
				
			||||||
 | 
					    return (void *)rsp1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* IPQ_AP_HOST_IOT_QCA402X */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef IPQ_AP_HOST_IOT_IPQ
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					 FUNCTION iot_thr_func_ipq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 DESCRIPTION
 | 
				
			||||||
 | 
					 Continously polls IPQ BTSS for asynchronous data responses and
 | 
				
			||||||
 | 
					 logs received asynchronous data responses to Diag module using
 | 
				
			||||||
 | 
					 log-submit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 DEPENDENCIES
 | 
				
			||||||
 | 
					 NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 RETURN VALUE
 | 
				
			||||||
 | 
					 Returns NULL on failure. Function also exits with NULL return value
 | 
				
			||||||
 | 
					 when main indicates that this thread should be stopped
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 SIDE EFFECTS
 | 
				
			||||||
 | 
					 NONE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *iot_thr_func_ipq(void *hdl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int bytes_read = 0, handle = 0;
 | 
				
			||||||
 | 
					    void *buffer = NULL;
 | 
				
			||||||
 | 
					    void *rsp = NULL;
 | 
				
			||||||
 | 
					    struct timespec ts;
 | 
				
			||||||
 | 
					    ftm_bt_rsp_pkt_type *ftm_async_pkt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    buffer = malloc(MAX_BUF_SIZE);
 | 
				
			||||||
 | 
					    if (!buffer)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "Could not allocate memory to the buffer \n");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(buffer, MEMSET_RESET_VALUE, MAX_BUF_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(hdl == NULL || *((int*)hdl) < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "\n Invalid Handle received from BTSS \n");
 | 
				
			||||||
 | 
					        free(buffer);
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    handle = *((int*)hdl);
 | 
				
			||||||
 | 
					    while(1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if (thread_stop == 1) {
 | 
				
			||||||
 | 
					            DPRINTF(FTM_DBG_TRACE, "FTMd: Exiting thread.\n");
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            DPRINTF(FTM_DBG_ERROR, "clock_gettime");
 | 
				
			||||||
 | 
					            free(buffer);
 | 
				
			||||||
 | 
					            return NULL;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        ts.tv_sec += user_sem_wait_timeout;
 | 
				
			||||||
 | 
					        sem_timedwait(&iot_sem, &ts);
 | 
				
			||||||
 | 
					        while((bytes_read = bt_daemon_receive(handle, &buffer)) > 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            /*
 | 
				
			||||||
 | 
					             * Checking for log status on the packets received
 | 
				
			||||||
 | 
					             * ignore the received packets incase of disabled logging
 | 
				
			||||||
 | 
					             */
 | 
				
			||||||
 | 
					            if(log_status(LOG_BT_HCI_EV_C))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                rsp = log_alloc(LOG_BT_HCI_EV_C, (DIAG_HEADER_SIZE + bytes_read));
 | 
				
			||||||
 | 
					                if (!rsp)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    DPRINTF(FTM_DBG_ERROR, "Could not allocate rsp packet \n");
 | 
				
			||||||
 | 
					                    free(buffer);
 | 
				
			||||||
 | 
					                    return NULL;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                ftm_async_pkt = (ftm_bt_rsp_pkt_type*)rsp;
 | 
				
			||||||
 | 
					                memcpy(ftm_async_pkt->buf, buffer, bytes_read);
 | 
				
			||||||
 | 
					                DPRINTF(FTM_DBG_TRACE, "\n Printing the Async Packet sent to QDART\n");
 | 
				
			||||||
 | 
					                print_array((uint8_t *)rsp, (DIAG_HEADER_SIZE + bytes_read));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                log_submit(rsp);
 | 
				
			||||||
 | 
					                log_free(rsp);
 | 
				
			||||||
 | 
					                memset(buffer, MEMSET_RESET_VALUE, MAX_BUF_SIZE);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        sem_post(&iot_sem_async);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    free(buffer);
 | 
				
			||||||
 | 
					    pthread_exit(NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					  FUNCTION ftm_iot_dispatch_ipq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  DESCRIPTION
 | 
				
			||||||
 | 
					  Function processes WIN IOT specific requests and relays to
 | 
				
			||||||
 | 
					  BTSS for further processing. Constructs response packet
 | 
				
			||||||
 | 
					  and returns buffer meant for callback.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  RETURN VALUE
 | 
				
			||||||
 | 
					  Returns back buffer that is meant for diag callback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  SIDE EFFECTS
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *ftm_iot_dispatch_ipq(void *iot_ftm_pkt, int pkt_len, int *hdl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    void *rsp = NULL;
 | 
				
			||||||
 | 
					    struct timespec ts;
 | 
				
			||||||
 | 
					    int bytes_sent = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(hdl == NULL || *hdl < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "\n Invalid Handle received from BTSS \n");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!iot_ftm_pkt)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "Invalid iot_ftm_pkt received \n");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        perror("clock_gettime");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    ts.tv_sec += user_sem_wait_timeout;
 | 
				
			||||||
 | 
					    sem_timedwait(&iot_sem_async, &ts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DPRINTF(FTM_DBG_TRACE, "\n Request Packet received for IPQ BT\n");
 | 
				
			||||||
 | 
					    print_array((uint8_t *)iot_ftm_pkt, pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bytes_sent = bt_daemon_send(*hdl, iot_ftm_pkt);
 | 
				
			||||||
 | 
					    if(bytes_sent < 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        perror("Unable to send Request Packet to IPQ BT");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Constructing ACK Packet */
 | 
				
			||||||
 | 
					    rsp = diagpkt_subsys_alloc(DIAG_SUBSYS_FTM, ftm_iot_cmd_code, pkt_len);
 | 
				
			||||||
 | 
					    if (!rsp)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        DPRINTF(FTM_DBG_ERROR, "\n Unable to allocate diag response packet \n");
 | 
				
			||||||
 | 
					        return NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy(rsp, iot_ftm_pkt, pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    DPRINTF(FTM_DBG_TRACE, "\n ACK Packet constructed in FTM layer\n");
 | 
				
			||||||
 | 
					    print_array((uint8_t *)rsp, pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    sem_post(&iot_sem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*This rsp pointer will be freed by diag later */
 | 
				
			||||||
 | 
					    return rsp;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif /* IPQ50XX, IPQ95XX */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *ftm_iot_dispatch(void *iot_ftm_pkt, int pkt_len, void *hdl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    void* retValue = NULL;
 | 
				
			||||||
 | 
					#ifdef IPQ_AP_HOST_IOT_QCA402X
 | 
				
			||||||
 | 
					    retValue = ftm_iot_dispatch_qca402x(iot_ftm_pkt, pkt_len ,hdl);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IPQ_AP_HOST_IOT_IPQ
 | 
				
			||||||
 | 
					    retValue = ftm_iot_dispatch_ipq(iot_ftm_pkt, pkt_len ,(int *)hdl);
 | 
				
			||||||
 | 
					#endif /* IPQ50XX, IPQ95XX */
 | 
				
			||||||
 | 
					    return retValue;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /*ifdef IPQ_AP_HOST_IOT*/
 | 
				
			||||||
							
								
								
									
										132
									
								
								feeds/ipq95xx/ftm/src/ftm_iot.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										132
									
								
								feeds/ipq95xx/ftm/src/ftm_iot.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,132 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 *Copyright (c) 2018-2020, 2022 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *All Rights Reserved.
 | 
				
			||||||
 | 
					 *Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* IPQ-QCA402X specific file */
 | 
				
			||||||
 | 
					#ifdef IPQ_AP_HOST_IOT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <semaphore.h>
 | 
				
			||||||
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					#include "diagpkt.h"
 | 
				
			||||||
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_BLE_HCI 4
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_I15P4_HMI 5
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_OTP_INVALID 256
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_OTP_SET_BITS 257
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_OTP_WRITE_BYTE 258
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_OTP_READ_BYTE 259
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_OTP_TLV_INIT 260
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_OTP_TLV_READ 261
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_OTP_TLV_WRITE 262
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_OTP_TLV_STATUS 263
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_OTP_TLV_DELETE 264
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_RAWFLASH_INVALID 288
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_RAWFLASH_CLEAR_BITS 289
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_RAWFLASH_WRITE 290
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_RAWFLASH_READ  291
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_RAWFLASH_ERASE 292
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_RAWFLASH_DISABLE_MFG 293
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_FS_INVALID 304
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_FS_READ 305
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_FS_WRITE 306
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_FS_DELETE 307
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_FS_LIST_SETUP 308
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_FS_LIST_NEXT 309
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_FS_MOUNT 310
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_FS_UNMOUNT 311
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Add more MFG tool commands for QCA402x. These
 | 
				
			||||||
 | 
					command are interpreted internally within QCA402x */
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_MISC_REBOOT 352
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_MISC_ADDR_READ 353
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_MISC_ADDR_WRITE 354
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_MISC_HWSS_DONE 355
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_MISC_XTAL_CAP_SET 356
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_MISC_PART_SZ_GET 357
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Add MFG tool command to enable flashing of QCA402x
 | 
				
			||||||
 | 
					by putting QCA402x in EDL mode and selecting USB mux
 | 
				
			||||||
 | 
					select option to tie USB port 81 on IPQ402x to QCA402x */
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_MISC_PROG_MODE 358
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Command to invalidate specified QCA402x Imageset */
 | 
				
			||||||
 | 
					#define MFG_CMD_ID_MISC_FWUP 359
 | 
				
			||||||
 | 
					/* Add MFG tool PROG_MODE subcommands to enable flashing
 | 
				
			||||||
 | 
					of QCA402x on IPQ807x. Interpretation of sub-commands is as
 | 
				
			||||||
 | 
					follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MFG_FLASH_ON - Put QCA402x into reset state, Put QCA402x in
 | 
				
			||||||
 | 
					EDL mode and enable USB port to be tied to QCA402x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MFG_FLASH_OFF - Pull QCA402x out of EDL mode and Pull QCA402x
 | 
				
			||||||
 | 
					out of reset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MFG_EDL_ON - Put QCA402x in EDL mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MFG_FLASH_OFF - Pull QCA402x out of EDL mode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MFG_USB_ON - Enable USB port to be tied to QCA402x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MFG_USB_OFF - Enable USB port to be tied to IPQ807x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MFG_PROG_RESP - Expected response field
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum flash_state {
 | 
				
			||||||
 | 
					    MFG_PROG_RESP,
 | 
				
			||||||
 | 
					    MFG_FLASH_ON,
 | 
				
			||||||
 | 
					    MFG_FLASH_OFF,
 | 
				
			||||||
 | 
					    MFG_EDL_ON,
 | 
				
			||||||
 | 
					    MFG_EDL_OFF,
 | 
				
			||||||
 | 
					    MFG_USB_ON,
 | 
				
			||||||
 | 
					    MFG_USB_OFF
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8 start;
 | 
				
			||||||
 | 
					    uint8 version;
 | 
				
			||||||
 | 
					    uint16 length;
 | 
				
			||||||
 | 
					} PACKED_STRUCT diag_nonhdlc_hdr_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    diag_nonhdlc_hdr_t hdr;
 | 
				
			||||||
 | 
					    byte payload[0];
 | 
				
			||||||
 | 
					} PACKED_STRUCT ftm_iot_req_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    log_hdr_type hdr;
 | 
				
			||||||
 | 
					    byte buf[1];
 | 
				
			||||||
 | 
					} PACKED_STRUCT ftm_bt_rsp_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Two semaphores are used to handle sequencing of requests, ack responses
 | 
				
			||||||
 | 
					and multiple asynchronous data responses from QCA402x */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sem_t iot_sem;
 | 
				
			||||||
 | 
					sem_t iot_sem_async;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ftm_iot_cmd_code;
 | 
				
			||||||
 | 
					int ftm_iot_dut_interface_code;
 | 
				
			||||||
 | 
					int ftm_iot_reserved_code;
 | 
				
			||||||
 | 
					int interface;
 | 
				
			||||||
 | 
					int thread_stop;
 | 
				
			||||||
 | 
					extern int user_sem_wait_timeout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *ftm_iot_dispatch(void *iot_ftm_pkt, int pkt_len, void *hdl);
 | 
				
			||||||
 | 
					#ifdef IPQ_AP_HOST_IOT_QCA402X
 | 
				
			||||||
 | 
					void *ftm_iot_dispatch_qca402x(void *iot_ftm_pkt, int pkt_len, void *hdl);
 | 
				
			||||||
 | 
					void *iot_thr_func_qca402x(void *hdl);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef IPQ_AP_HOST_IOT_IPQ
 | 
				
			||||||
 | 
					void *ftm_iot_dispatch_ipq(void *iot_ftm_pkt, int pkt_len, int *hdl);
 | 
				
			||||||
 | 
					void *iot_thr_func_ipq(void *hdl);
 | 
				
			||||||
 | 
					#endif /* IPQ50XX, IPQ95XX */
 | 
				
			||||||
 | 
					#endif /*ifdef IPQ_AP_HOST_IOT*/
 | 
				
			||||||
							
								
								
									
										1060
									
								
								feeds/ipq95xx/ftm/src/ftm_main.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1060
									
								
								feeds/ipq95xx/ftm/src/ftm_main.c
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										108
									
								
								feeds/ipq95xx/ftm/src/ftm_nfc.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										108
									
								
								feeds/ipq95xx/ftm/src/ftm_nfc.c
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,108 @@
 | 
				
			|||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					                       NFC FTM C File
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   This file contains the definitions of the function used to check
 | 
				
			||||||
 | 
					   which chip is present on the device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2013-2015 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					All Rights Reserved.
 | 
				
			||||||
 | 
					Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					when        who              what,              where,     why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "ftm_nfc.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CHIP_TYPE chipType = UNDEFINED_CHIP_TYPE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   checkChip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Checks whether it can open the NQ Kernel, if not, it means
 | 
				
			||||||
 | 
					  the device has a QTI chip.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void checkChip( void )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = ftm_nq_nfc_open( );                   // can you open the NQ Kernel?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if( ret > 0 )                               // yes
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf( "%s: NQ CHIP \n", __func__ );
 | 
				
			||||||
 | 
					        chipType = NQ_CHIP;                     // so it's an NQ Chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ret = ftm_nq_nfc_close( );              // close the handle
 | 
				
			||||||
 | 
					        if( ret != 0 )                          // not successful?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            printf( "%s: Could not close the File Handle for NQ Chip \n", __func__ );
 | 
				
			||||||
 | 
					            chipType = CHIP_ERROR;              // something is wrong
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf( "%s: QTI CHIP \n", __func__ );
 | 
				
			||||||
 | 
					        chipType = QTI_CHIP;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nfc_dispatch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Dispatches QRCT commands and Chip Replies/Notifications/Data
 | 
				
			||||||
 | 
					  to the required FTM NFC Chip Handler
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  ftm_nfc_pkt_type *nfc_ftm_pkt - FTM Packet
 | 
				
			||||||
 | 
					  uint16            pkt_len     - FTM Packet Length
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  void *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void* ftm_nfc_dispatch( ftm_nfc_pkt_type *nfc_ftm_pkt, uint16 pkt_len )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ftm_nfc_pkt_type *reply = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if( UNDEFINED_CHIP_TYPE == chipType )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf( "%s: Checking Chip Type \n", __func__ );
 | 
				
			||||||
 | 
					        checkChip( );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch( chipType )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case NQ_CHIP:
 | 
				
			||||||
 | 
					            if( nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id == FTM_NFC_REQ_CHIP_TYPE )
 | 
				
			||||||
 | 
					                reply = PrepareRsp( nfc_ftm_pkt );
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                reply = ftm_nfc_dispatch_nq( nfc_ftm_pkt, pkt_len );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case QTI_CHIP:
 | 
				
			||||||
 | 
					            if( nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id == FTM_NFC_REQ_CHIP_TYPE )
 | 
				
			||||||
 | 
					                reply = PrepareRsp( nfc_ftm_pkt );
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                reply = ftm_nfc_dispatch_qti( nfc_ftm_pkt, pkt_len );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            printf( "%s: ERROR - THIS SHOULD HAVE NEVER BEEN REACHED, CHIP TYPE %d", __func__, chipType );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return reply;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										37
									
								
								feeds/ipq95xx/ftm/src/ftm_nfc.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										37
									
								
								feeds/ipq95xx/ftm/src/ftm_nfc.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,37 @@
 | 
				
			|||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					                       NFC FTM HEADER File
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   This file contains the definitions of the function used to check
 | 
				
			||||||
 | 
					   which chip is present on the device.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2013-2016 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					All Rights Reserved.
 | 
				
			||||||
 | 
					Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _FTM_NFC
 | 
				
			||||||
 | 
					#define _FTM_NFC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "ftm_nfcnq.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NFC_QCA1990                 // Defnition to enable the NFC FTM inclusion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum _CHIP_TYPE{
 | 
				
			||||||
 | 
					    UNDEFINED_CHIP_TYPE     = 0,
 | 
				
			||||||
 | 
					    QTI_CHIP                = 1,
 | 
				
			||||||
 | 
					    NQ_CHIP                 = 2,
 | 
				
			||||||
 | 
					    CHIP_ERROR              = 3,
 | 
				
			||||||
 | 
					    MAXIMUM_CHIP_TYPE       = 4,
 | 
				
			||||||
 | 
					} CHIP_TYPE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern CHIP_TYPE chipType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void* ftm_nfc_dispatch(ftm_nfc_pkt_type *ftm_nfc_pkt, uint16 pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void* ftm_nfc_dispatch_qti(ftm_nfc_pkt_type *ftm_nfc_pkt, uint16 pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ftm_nfc_dispatch_nq_fwdl();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ftm_nfc_dispatch_nq_test(int argc, char **argv);
 | 
				
			||||||
 | 
					#endif // _FTM_NFC
 | 
				
			||||||
							
								
								
									
										807
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										807
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq.c
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,807 @@
 | 
				
			|||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					                       NQ NFC FTM C File
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   This file contains the definitions of the functions
 | 
				
			||||||
 | 
					   used to communicate with the NQ Chip.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2015-2016 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					All Rights Reserved.
 | 
				
			||||||
 | 
					Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					when        who              what,              where,     why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "ftm_nfcnq.h"
 | 
				
			||||||
 | 
					#include "ftm_nfc.h"
 | 
				
			||||||
 | 
					#include "ftm_nfcnq_fwdl.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Global variables */
 | 
				
			||||||
 | 
					pthread_t           clientThread;
 | 
				
			||||||
 | 
					PNCI_MESSAGE        pNCIMessage;
 | 
				
			||||||
 | 
					sem_t               sRspReady;
 | 
				
			||||||
 | 
					int                 fdNfc                   = 0;
 | 
				
			||||||
 | 
					uint8_t             nciReplyMessage[ 255 ]  = { 0 };
 | 
				
			||||||
 | 
					NQ_CHIP_TYPE        whatNQChip              = UNKNOWN_NQ_CHIP_TYPE;
 | 
				
			||||||
 | 
					uint8_t RFdeactivateCmd[ ] = { 0x21, 0x06, 0x01, 0x03};
 | 
				
			||||||
 | 
					uint8_t EseDataRsp[ ] = { 0x03, 0x00, 0x21, 0x99, 0x50, 0xFE};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nq_nfc_close
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Close the kernel driver for the NQ Chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					int ftm_nq_nfc_close( void )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    fdNfc = close( fdNfc );                         // close the file descriptor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LOG_MESSAGE( "%s : Exit with fdNfc = %d \n", __func__, fdNfc );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return fdNfc;                                   // return the result
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nq_nfc_open
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Open the kernel driver for the NQ Chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					int ftm_nq_nfc_open( void )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    fdNfc = open( "/dev/nq-nci",                    // try to open /dev/nq-nci
 | 
				
			||||||
 | 
					               O_RDWR );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LOG_MESSAGE( "%s : Exit with fdNfc = %d \n", __func__, fdNfc );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return fdNfc;                                   // return the result
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nfc_hw_reset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Resets the NQ Chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					int ftm_nfc_hw_reset( void )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int ret = -1;                                                   // return value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if( fdNfc < 0 )                                             // fdNfc valid?
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ret = ioctl( fdNfc, NFC_SET_PWR, POWER_ON );                // turn the chip on
 | 
				
			||||||
 | 
					        if( ret != 0 )                                              // successful?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s ioctl( fdNfc, NFC_SET_PWR, POWER_ON ) returned %d", __func__, ret );
 | 
				
			||||||
 | 
					            ret = -2;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        usleep( 1000 );                                             // wait
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ret = ioctl( fdNfc, NFC_SET_PWR, POWER_OFF );               // turn the chip off
 | 
				
			||||||
 | 
					        if( ret != 0 )                                              // successful?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s ioctl( fdNfc, NFC_SET_PWR, POWER_OFF ) returned %d", __func__, ret );
 | 
				
			||||||
 | 
					            ret = -3;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        usleep( 1000 );                                             // wait
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ret = ioctl( fdNfc, NFC_SET_PWR, POWER_ON );                // turn the chip back on
 | 
				
			||||||
 | 
					        if( ret != 0 )                                              // successful?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s ioctl( fdNfc, NFC_SET_PWR, POWER_ON ) returned %d", __func__, ret );
 | 
				
			||||||
 | 
					            ret = -4;
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }while( 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   PrintBytes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Print bytes from an array
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  uint8_t *buf - Byte array to print
 | 
				
			||||||
 | 
					  uint8_t  len - Length of the array
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void PrintBytes( uint8_t *buf, uint8_t len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef NFC_FTM_DEBUG
 | 
				
			||||||
 | 
					    int idx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LOG_INFORMATION( "%s: Length: %d bytes \n", __func__, len );    // print the number of bytes
 | 
				
			||||||
 | 
					    for( idx = 0; idx < len; idx++ )                            // print every byte
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOG_INFORMATION( "%02x ", buf[idx] );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    LOG_INFORMATION( "\n" );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    UNUSED_PARAMETER( buf );
 | 
				
			||||||
 | 
					    UNUSED_PARAMETER( len );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nfc_send
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Sends a message to the chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  uint8_t *buf - buffer to be sent
 | 
				
			||||||
 | 
					  int      len - the length of the buffer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  int      ret - Status
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					int ftm_nfc_send( uint8_t* buf )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int             ret     = -1;                   // return value
 | 
				
			||||||
 | 
					    int             retries = 15;                   // number of retries
 | 
				
			||||||
 | 
					    int             i;
 | 
				
			||||||
 | 
					    uint16_t        nciSendMessageLength;
 | 
				
			||||||
 | 
					    PNCI_MESSAGE    pMessageToSend = ( PNCI_MESSAGE ) buf;
 | 
				
			||||||
 | 
					    pfirmware_download_packet_t pFirmwarePacketsToSend =
 | 
				
			||||||
 | 
					                                ( pfirmware_download_packet_t ) buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if( fdNfc < 0 )                             // fdNfc valid?
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( NULL == buf )                           // is the buffer valid?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ret = -2;
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: buf == NULL Invalid Buffer", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( ( pFirmwarePacketsToSend->fFragmentedPacket == FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_NONE ) ||
 | 
				
			||||||
 | 
					            ( pFirmwarePacketsToSend->fFragmentedPacket == FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_SET ) )
 | 
				
			||||||
 | 
					            nciSendMessageLength = pFirmwarePacketsToSend->payloadLen +
 | 
				
			||||||
 | 
					                                   FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN +
 | 
				
			||||||
 | 
					                                   FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN;
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            nciSendMessageLength = pMessageToSend->len + offsetof( NCI_MESSAGE, buf );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PrintBytes( buf, nciSendMessageLength );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        do
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            retries--;                              // retries left
 | 
				
			||||||
 | 
					            ret = write( fdNfc,
 | 
				
			||||||
 | 
					                         buf,
 | 
				
			||||||
 | 
					                         nciSendMessageLength );    // try to write
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if( ret < nciSendMessageLength )        // did you write the length?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_MESSAGE( "%s: %d = write( fdNfc, buf, nciSendMessageLength ), errno = %d, tries left = %d \n", __func__, ret, errno, retries );
 | 
				
			||||||
 | 
					                continue;                           // try again
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                break;                              // done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } while( retries > 0 );
 | 
				
			||||||
 | 
					    } while( 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return  ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ProcessCommand
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Processes a Command for the NQ Chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  uint8_t *nci_data - NCI Data to send
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  int ret - 0 if successfully received a reply
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					int ProcessCommand( uint8_t *nci_data )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int              ret = -1;                              // return value
 | 
				
			||||||
 | 
					    struct timespec  time_sec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOG_MESSAGE( "%s: FTM_NFC_SEND_DATA \n", __func__ );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ret = ftm_nfc_send( nci_data );                     // send the message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LOG_MESSAGE( "%s: Wait for response \n", __func__ );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ret = clock_gettime( CLOCK_REALTIME, &time_sec );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( ret == -1 )
 | 
				
			||||||
 | 
					        {                                                   // didn't get the time?
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: clock_gettime for nci_data error \n", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        time_sec.tv_sec += FTM_NFC_CMD_CMPL_TIMEOUT;        // maximum wait
 | 
				
			||||||
 | 
					        ret = sem_timedwait( &sRspReady,                    // start waiting
 | 
				
			||||||
 | 
					                             &time_sec );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( ret == -1 )                                     // wait finished, not signalled?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if(!ese_dwp_test)
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: nfc ftm command timed out \n", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } while( 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nfc_read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Reads a message from the chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  int      len - the length of the buffer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  int      ret - Number of bytes read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					int ftm_nfc_read( uint8_t* buf, int len )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int ret = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if( fdNfc < 0 )                                // fdNfc valid?
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ret = read( fdNfc, buf, len );                 // try to read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } while( 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					  CommitLog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  This commits the log to Diag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  NCI_MESSAGE pReadNCIMessage - Pointer to the read NCI Message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  void
 | 
				
			||||||
 | 
					==========================================================================*/
 | 
				
			||||||
 | 
					void CommitLog( PNCI_MESSAGE pReadNCIMessage )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    pftm_nfc_log_pkt_type         pLogBuff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        pLogBuff = ( ftm_nfc_log_pkt_type * ) log_alloc( LOG_NFC_FTM,        // allocate a buffer for the log
 | 
				
			||||||
 | 
					                                                         pReadNCIMessage->len + offsetof( NCI_MESSAGE, buf ) + LOG_HEADER_LENGTH );
 | 
				
			||||||
 | 
					        if( NULL == pLogBuff )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: log_alloc returned NULL \n", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        memcpy( pLogBuff->data,                                             // fill the buffer
 | 
				
			||||||
 | 
					                pReadNCIMessage,
 | 
				
			||||||
 | 
					                pReadNCIMessage->len + offsetof( NCI_MESSAGE, buf ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        log_commit( pLogBuff );                                             // commit the log
 | 
				
			||||||
 | 
					    } while ( 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=============================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					  ProcessReturnedMessage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Routine that processes an NCI Message that was returned and
 | 
				
			||||||
 | 
					  will decide if the message is a notification or a response.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  PNCI_MESSAGE pReadNCIMessage - Pointer to the read message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  void
 | 
				
			||||||
 | 
					==============================================================================*/
 | 
				
			||||||
 | 
					void ProcessReturnedMessage( PNCI_MESSAGE pReadNCIMessage )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch( pReadNCIMessage->gid & NCIMT_NTF )      // check the first byte
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					    case NCIMT_RSP:                                 // reply?
 | 
				
			||||||
 | 
					        sem_post( &sRspReady );                     // notify the dispatch function
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case NCIMT_NTF:                                 // notification?
 | 
				
			||||||
 | 
					        if (pReadNCIMessage->oid == 0x05)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_INFORMATION("\n << ...TAG DETECTED... >> \n");
 | 
				
			||||||
 | 
					            printTecnologyDetails(pReadNCIMessage->buf[3],pReadNCIMessage->buf[2]);
 | 
				
			||||||
 | 
					            sem_post( &sRfNtf );
 | 
				
			||||||
 | 
					            ProcessCommand( RFdeactivateCmd );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    case NCIMT_DATA:                                // data?
 | 
				
			||||||
 | 
					        if (ese_dwp_test)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if( memcmp( EseDataRsp, nciReplyMessage, sizeof( EseDataRsp ) ) == 0 )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_INFORMATION("\n << ESE detected over DWP >> \n\n");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if( log_status( LOG_NFC_FTM ) )             // logging enabled?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            CommitLog( pReadNCIMessage );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					        LOG_ERROR( "%s: ERROR - SHOULD NOT HAVE REACHED THIS POINT", __func__ );
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   nfc_read_thread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Thread that constantly looks for messages from the chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void *nfc_read_thread( void *arg )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t  readLength = 0;
 | 
				
			||||||
 | 
					    int      i;
 | 
				
			||||||
 | 
					    uint8_t  readNCIUpToLength = offsetof( NCI_MESSAGE, buf );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    UNUSED_PARAMETER( arg );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for( ; ; )                                                                          // keep reading
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        readLength = ftm_nfc_read( nciReplyMessage, readNCIUpToLength );                // read the first 3 bytes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( readLength == readNCIUpToLength )                                           // read the message up to NCI Len?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            readLength = ftm_nfc_read( pNCIMessage->buf,                                // go and get the rest
 | 
				
			||||||
 | 
					                                       pNCIMessage->len  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if( readLength == pNCIMessage->len )                                        // successful?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                PrintBytes( nciReplyMessage, pNCIMessage->len + readNCIUpToLength );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                ProcessReturnedMessage( pNCIMessage );                                  // Process the read message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					FUNCTION    PrepareRsp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Routine to prepare a response for diag.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  ftm_nfc_pkt_type *nfc_ftm_pkt - FTM Packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  void *
 | 
				
			||||||
 | 
					==========================================================================*/
 | 
				
			||||||
 | 
					void *PrepareRsp( ftm_nfc_pkt_type *nfc_ftm_pkt )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    void *response = NULL;
 | 
				
			||||||
 | 
					    switch( nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case FTM_NFC_NFCC_COMMAND:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ftm_nfc_pkt_type *nfc_nci_rsp = ( ftm_nfc_pkt_type* ) diagpkt_subsys_alloc( DIAG_SUBSYS_FTM,
 | 
				
			||||||
 | 
					                                                      FTM_NFC_CMD_CODE,
 | 
				
			||||||
 | 
					                                              sizeof( ftm_nfc_pkt_type ) );                                 // get a Response Buffer for NFCC Command
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if( NULL == nfc_nci_rsp )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: diagpkt_subsys_alloc( DIAG_SUBSYS_FTM, FTM_NFC_CMD_CODE, sizeof( ftm_nfc_pkt_type ) ) returned NULL \n", __func__ );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                nfc_nci_rsp->ftm_nfc_hdr.nfc_cmd_id  = FTM_NFC_NFCC_COMMAND;
 | 
				
			||||||
 | 
					                nfc_nci_rsp->ftm_nfc_hdr.nfc_cmd_len = offsetof( ftm_nfc_cmd_header, nfc_cmd_len ) + offsetof( NCI_MESSAGE, buf ) + pNCIMessage->len ;
 | 
				
			||||||
 | 
					                nfc_nci_rsp->nfc_nci_pkt_len         = offsetof( NCI_MESSAGE, buf ) + pNCIMessage->len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                memcpy( nfc_nci_rsp->nci_data,
 | 
				
			||||||
 | 
					                        pNCIMessage,
 | 
				
			||||||
 | 
					                        nfc_nci_rsp->nfc_nci_pkt_len );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                response = ( void* ) nfc_nci_rsp;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case FTM_NFC_REQ_CHIP_TYPE:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // change from a NCI packet type to a request chip type packet type
 | 
				
			||||||
 | 
					            ftm_nfc_chip_type_pkt_type  *nfc_chip_type_rsp = ( ftm_nfc_chip_type_pkt_type* ) diagpkt_subsys_alloc( DIAG_SUBSYS_FTM,
 | 
				
			||||||
 | 
					                                                                        FTM_NFC_CMD_CODE,
 | 
				
			||||||
 | 
					                                                                sizeof( ftm_nfc_chip_type_pkt_type ) );     // get a Response Buffer for Request Chip Type Command
 | 
				
			||||||
 | 
					            if( NULL == nfc_chip_type_rsp )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: diagpkt_subsys_alloc( DIAG_SUBSYS_FTM, FTM_NFC_CMD_CODE, sizeof( ftm_nfc_chip_type_pkt_type ) ) returned NULL \n", __func__ );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                nfc_chip_type_rsp->nfc_chip_type_cmd_id = FTM_NFC_REQ_CHIP_TYPE;
 | 
				
			||||||
 | 
					                nfc_chip_type_rsp->nfc_chip_type_pkt_len = 1;                           // only 1 byte for response packet data
 | 
				
			||||||
 | 
					                if( chipType == 1 )                                                     // 1 for QTI, 2 for NQ
 | 
				
			||||||
 | 
					                    nfc_chip_type_rsp->nfc_chip_type_pkt_data = FTM_NFC_QTI_CHIP;
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    nfc_chip_type_rsp->nfc_chip_type_pkt_data = FTM_NFC_NQ_CHIP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                response = ( void* ) nfc_chip_type_rsp;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case FTM_NFC_FWPIN_CTRL:
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            // change from a NCI packet type to a firmware download packet type
 | 
				
			||||||
 | 
					            ftm_nfc_fwdl_pkt_type       *nfc_fwdl_rsp = ( ftm_nfc_fwdl_pkt_type* ) diagpkt_subsys_alloc( DIAG_SUBSYS_FTM,
 | 
				
			||||||
 | 
					                                                          FTM_NFC_CMD_CODE,
 | 
				
			||||||
 | 
					                                                  sizeof( ftm_nfc_fwdl_pkt_type ) );                        // get a Response Buffer for Firmware Download Pin Command
 | 
				
			||||||
 | 
					            if( NULL == nfc_fwdl_rsp )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: diagpkt_subsys_alloc( DIAG_SUBSYS_FTM, FTM_NFC_CMD_CODE, sizeof( ftm_nfc_fwdl_pkt_type ) ) returned NULL \n", __func__ );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                nfc_fwdl_rsp->nfc_fwdl_cmd_id = FTM_NFC_FWPIN_CTRL;
 | 
				
			||||||
 | 
					                nfc_fwdl_rsp->nfc_fwdl_pkt_len = 1;                                     // only 1 byte for response packet data
 | 
				
			||||||
 | 
					                nfc_fwdl_rsp->nfc_fwdl_pkt_data = FTM_NFC_FWDL_SUCCESS;                 // 0 for fail, 1 for success
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                response = ( void* ) nfc_fwdl_rsp;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        default :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: ERROR - SHOULD NOT HAVE ENDED UP HERE: default case \n", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nfc_nq_vs_nxp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Check whether the chip is an NQ Chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					int ftm_nfc_nq_vs_nxp( void )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int         ret = 0;
 | 
				
			||||||
 | 
					    uint8_t     coreResetCmd[ ] = { 0x20, 0x00, 0x01, 0x00 };
 | 
				
			||||||
 | 
					    uint8_t     coreResetRsp[ ] = { 0x40, 0x00, 0x03, 0x00, 0x11, 0x00 };
 | 
				
			||||||
 | 
					    uint8_t     coreInitCmd[  ] = { 0x20, 0x01, 0x00 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ret = ProcessCommand( coreResetCmd );           // send a Core Reset CMD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( ret == -1 )                                 // wait finished, not signalled?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: ProcessCommand( coreResetCmd ) error %d \n", __func__, ret );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( memcmp( coreResetRsp, nciReplyMessage, sizeof( coreResetRsp ) ) )
 | 
				
			||||||
 | 
					        {                                                // not a good reply?
 | 
				
			||||||
 | 
					            coreResetRsp[4] = 0x10;
 | 
				
			||||||
 | 
					            if( memcmp( coreResetRsp, nciReplyMessage, sizeof( coreResetRsp ) ) )
 | 
				
			||||||
 | 
					            {                                            // check if NCI version is 1.0
 | 
				
			||||||
 | 
					                ret = -1;
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: bad reply for coreResetRsp", __func__ );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ret = ProcessCommand( coreInitCmd );             // send the message
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( ret == -1 )                                  // wait finished, not signalled?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: ProcessCommand( coreInitCmd ) error %d \n", __func__, ret );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch( nciReplyMessage[ CHIP_ID ] )             // what type of chip is it?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        case 0x48:
 | 
				
			||||||
 | 
					            whatNQChip = NQ_210;
 | 
				
			||||||
 | 
					            LOG_INFORMATION( "Connected to NQ210 \n" );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case 0x58:
 | 
				
			||||||
 | 
					            whatNQChip = NQ_220;
 | 
				
			||||||
 | 
					            LOG_INFORMATION( "Connected to NQ220 \n" );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case 0x40:
 | 
				
			||||||
 | 
					        case 0x41:
 | 
				
			||||||
 | 
					            whatNQChip = NQ_310;
 | 
				
			||||||
 | 
					            LOG_INFORMATION( "Connected to NQ310 \n" );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case 0x50:
 | 
				
			||||||
 | 
					        case 0x51:
 | 
				
			||||||
 | 
					            whatNQChip = NQ_330;
 | 
				
			||||||
 | 
					            LOG_INFORMATION( "Connected to NQ330 \n" );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            whatNQChip = UNKNOWN_NQ_CHIP_TYPE;
 | 
				
			||||||
 | 
					            ret     = -1;
 | 
				
			||||||
 | 
					            LOG_INFORMATION( "ERROR Connected to an unknown NQ Chip \n" );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }while( 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nfc_set_fwdl_pin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Sets or resets the firmware download pin high or low
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  ftm_nfc_pkt_type *nfc_ftm_pkt - FTM Packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void ftm_nfc_set_fwdl_pin( ftm_nfc_pkt_type *nfc_ftm_pkt )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int                         ret = 0;
 | 
				
			||||||
 | 
					    // change from a NCI packet type to a firmware download packet type
 | 
				
			||||||
 | 
					    pftm_nfc_fwdl_pkt_type      pnfc_fwdl_pkt = ( pftm_nfc_fwdl_pkt_type ) nfc_ftm_pkt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch ( pnfc_fwdl_pkt->nfc_fwdl_pkt_data )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case 0:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ret = ftm_nfc_hw_reset( );                          // Can you reset the hardware?
 | 
				
			||||||
 | 
					            if( ret < 0 )                                       // successful?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: ftm_nfc_hw_reset() failed with ret = %d \n", __func__, ret );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            LOG_MESSAGE( "%s: Firmware download pin set LOW\n", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case 1:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ret = ioctl( fdNfc, NFC_SET_PWR, FIRMWARE_MODE );
 | 
				
			||||||
 | 
					            if( ret != 0 )                                      // successful?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s ioctl( fdNfc, NFC_SET_PWR, FIRMWARE_MODE ) returned %d", __func__, ret );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            LOG_MESSAGE( "%s: Firmware download pin set HIGH\n", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        default :
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: ERROR - SHOULD NOT HAVE ENDED UP HERE: default case \n", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = ftm_nq_nfc_close( );                                  // close the handle
 | 
				
			||||||
 | 
					    if( ret != 0 )                                              // not successful?
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOG_ERROR( "\n\t %s: ftm_nq_nfc_close() failed with ret = %d \n", __func__, ret );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = ftm_nq_nfc_open( );                                   // open the kernel driver
 | 
				
			||||||
 | 
					    if( ret < 0 )                                               // successful?
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOG_ERROR( "\n\t %s: ftm_nq_nfc_open() failed with ret = %d \n", __func__, ret );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nfc_dispatch_nq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Dispatches QRCT commands and Chip Replies/Notifications/Data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					  ftm_nfc_pkt_type *nfc_ftm_pkt - FTM Packet
 | 
				
			||||||
 | 
					  uint16            pkt_len     - FTM Packet Length
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  void *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void* ftm_nfc_dispatch_nq( ftm_nfc_pkt_type *nfc_ftm_pkt, uint16 pkt_len )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int                 ret = 0;
 | 
				
			||||||
 | 
					    int                 len = 0;
 | 
				
			||||||
 | 
					    struct timespec     time_sec;
 | 
				
			||||||
 | 
					    char               *SkipNQHardwareCheck = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void *rsp             = NULL;
 | 
				
			||||||
 | 
					    UNUSED_PARAMETER( pkt_len );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if( !fdNfc )                                               // Already initialized?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ret = ftm_nq_nfc_open( );                           // open the kernel driver
 | 
				
			||||||
 | 
					            if( ret < 0 )                                       // successful?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "\n\t %s: ftm_nq_nfc_open() failed with ret = %d \n", __func__, ret );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ret = ftm_nfc_hw_reset( );                          // Can you reset the hardware?
 | 
				
			||||||
 | 
					            if( ret < 0 )                                       // successful?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: ftm_nfc_hw_reset() failed with ret = %d \n", __func__, ret );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            pNCIMessage     = ( PNCI_MESSAGE ) nciReplyMessage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ret = pthread_create( &clientThread,                // Start the Read Thread
 | 
				
			||||||
 | 
					                                   NULL,
 | 
				
			||||||
 | 
					                                  &nfc_read_thread,
 | 
				
			||||||
 | 
					                                   NULL );
 | 
				
			||||||
 | 
					            if( ret != 0 )                                      // successful?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_MESSAGE( "%s: pthread_create( nfc_read_thread ) failed with ret = %d \n", __func__, ret );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            SkipNQHardwareCheck = getenv( SKIP_NQ_HARDWARE_CHECK );
 | 
				
			||||||
 | 
					            LOG_MESSAGE( "%s: SkipNQHardwareCheck = %s \n", __func__, SkipNQHardwareCheck );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(  NULL == SkipNQHardwareCheck )                  // no value so check for NQ Chip?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                ret = ftm_nfc_nq_vs_nxp( );
 | 
				
			||||||
 | 
					                if( ret < 0 )                                   // Not an NQ Chip?
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    LOG_ERROR( "ERROR NOT A KNOWN NQ Chip \n" );
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_INFORMATION( " Skipping NQ Chip Check \n" );
 | 
				
			||||||
 | 
					                whatNQChip = SKIP_CHIP_CHECK;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            LOG_INFORMATION( "FTM for NFC SUCCESSFULLY STARTED \n" );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( UNKNOWN_NQ_CHIP_TYPE == whatNQChip )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "ERROR This version of the chip is not accepted" );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( NULL == nfc_ftm_pkt )                               // valid packet?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: Error : nfc_ftm_pkt is NULL \n", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( offsetof( ftm_nfc_pkt_type, ftm_nfc_hdr ) < MIN_CMD_PKT_LEN )
 | 
				
			||||||
 | 
					        {                                                       // packet contains anything?
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: Error : Invalid FTM Packet \n", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch( nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id )           // what type of packet is it?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case FTM_NFC_NFCC_COMMAND:                              // NFC Command?
 | 
				
			||||||
 | 
					        case FTM_NFC_SEND_DATA:                                 // NFC Data?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ret = ProcessCommand( nfc_ftm_pkt->nci_data );
 | 
				
			||||||
 | 
					            if( ret == -1 )                                     // wait finished, not signalled?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: ProcessCommand( nfc_ftm_pkt->nci_data ) error %d \n", __func__, ret );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            rsp = PrepareRsp( nfc_ftm_pkt );                    // Prepare the response for Diag
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case FTM_NFC_REQ_CHIP_TYPE:
 | 
				
			||||||
 | 
					        case FTM_NFC_FWPIN_CTRL:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            ftm_nfc_set_fwdl_pin( nfc_ftm_pkt );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            rsp = PrepareRsp( nfc_ftm_pkt );                    // Prepare the response for Diag
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        default :
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: ERROR - SHOULD NOT HAVE ENDED UP HERE: default case \n", __func__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } while( 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return rsp;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										168
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										168
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,168 @@
 | 
				
			|||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					                       NQ NFC FTM Header File
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   This file contains the declarations of the functions
 | 
				
			||||||
 | 
					   used to communicate with the NQ Chip and various definitions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2015-2017 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					All Rights Reserved.
 | 
				
			||||||
 | 
					Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					when        who              what,              where,     why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _FTM_NFCNQ
 | 
				
			||||||
 | 
					#define _FTM_NFCNQ
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "msg.h"
 | 
				
			||||||
 | 
					#include "diagpkt.h"
 | 
				
			||||||
 | 
					#include "diagcmd.h"
 | 
				
			||||||
 | 
					#include "errno.h"
 | 
				
			||||||
 | 
					#include <linux/ioctl.h>
 | 
				
			||||||
 | 
					#include <pthread.h>
 | 
				
			||||||
 | 
					#include <semaphore.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LOG_ERROR( ... )             printf( __VA_ARGS__ )
 | 
				
			||||||
 | 
					#define LOG_INFORMATION( ... )       printf( __VA_ARGS__ )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef NFC_FTM_DEBUG
 | 
				
			||||||
 | 
					#define LOG_MESSAGE( ... )           printf( __VA_ARGS__ )
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define LOG_MESSAGE( ... )           do{ } while ( FALSE )
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct _ftm_nfc_cmd_header{
 | 
				
			||||||
 | 
					    uint16                          nfc_cmd_id;
 | 
				
			||||||
 | 
					    uint16                          nfc_cmd_len;
 | 
				
			||||||
 | 
					} ftm_nfc_cmd_header, *pftm_nfc_cmd_header;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct{
 | 
				
			||||||
 | 
					    diagpkt_subsys_header_type      diag_hdr;
 | 
				
			||||||
 | 
					    ftm_nfc_cmd_header              ftm_nfc_hdr;
 | 
				
			||||||
 | 
					    uint16                          nfc_nci_pkt_len;
 | 
				
			||||||
 | 
					    byte                            nci_data[258];
 | 
				
			||||||
 | 
					}ftm_nfc_pkt_type, *pftm_nfc_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct{
 | 
				
			||||||
 | 
					    diagpkt_subsys_header_type      diag_hdr;
 | 
				
			||||||
 | 
					    uint16                          nfc_fwdl_cmd_id;
 | 
				
			||||||
 | 
					    byte                            nfc_fwdl_pkt_len;
 | 
				
			||||||
 | 
					    byte                            nfc_fwdl_pkt_data;
 | 
				
			||||||
 | 
					}ftm_nfc_fwdl_pkt_type, *pftm_nfc_fwdl_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct{
 | 
				
			||||||
 | 
					    diagpkt_subsys_header_type      diag_hdr;
 | 
				
			||||||
 | 
					    uint16                          nfc_chip_type_cmd_id;
 | 
				
			||||||
 | 
					    byte                            nfc_chip_type_pkt_len;
 | 
				
			||||||
 | 
					    byte                            nfc_chip_type_pkt_data;
 | 
				
			||||||
 | 
					}ftm_nfc_chip_type_pkt_type, *pftm_nfc_chip_type_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct{
 | 
				
			||||||
 | 
					    log_hdr_type                    hdr;
 | 
				
			||||||
 | 
					    byte                            data[1];
 | 
				
			||||||
 | 
					} ftm_nfc_log_pkt_type, *pftm_nfc_log_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct _NCI_MESSAGE
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					            byte                    gid;            // Group ID
 | 
				
			||||||
 | 
					            byte                    oid;            // Operation ID
 | 
				
			||||||
 | 
					            byte                    len;            // payload length in bytes
 | 
				
			||||||
 | 
					            byte                    buf[ 252 ];     // Payload Buffer
 | 
				
			||||||
 | 
					} NCI_MESSAGE, *PNCI_MESSAGE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  NCIMT_DATA                      = 0x00, /**< DATA packet. */
 | 
				
			||||||
 | 
					  NCIMT_CMD                       = 0x20, /**< Control packet - Command. */
 | 
				
			||||||
 | 
					  NCIMT_RSP                       = 0x40, /**< Control packet - Response. */
 | 
				
			||||||
 | 
					  NCIMT_NTF                       = 0x60, /**< Control packet - Notification. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  NCIMT_INVALID_VALUE             = 0xFF, /**< Invalid packet type. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  NCIMT_BITMASK                   = 0xE0, /**< Most significant three bits. */
 | 
				
			||||||
 | 
					  NCIMT_BITSHIFT                  = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} NCIMT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    UNKNOWN_NQ_CHIP_TYPE =  0,
 | 
				
			||||||
 | 
					    SKIP_CHIP_CHECK      =  1,
 | 
				
			||||||
 | 
					    NQ_110               = 11,
 | 
				
			||||||
 | 
					    NQ_120               = 12,
 | 
				
			||||||
 | 
					    NQ_210               = 21,
 | 
				
			||||||
 | 
					    NQ_220               = 22,
 | 
				
			||||||
 | 
					    NQ_310               = 31,
 | 
				
			||||||
 | 
					    NQ_330               = 33,
 | 
				
			||||||
 | 
					    MAXIMUM_NQ_CHIP_TYPE
 | 
				
			||||||
 | 
					} NQ_CHIP_TYPE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct nqx_devinfo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned char chip_type;
 | 
				
			||||||
 | 
					    unsigned char rom_version;
 | 
				
			||||||
 | 
					    unsigned char fw_major;
 | 
				
			||||||
 | 
					    unsigned char fw_minor;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union nqx_uinfo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned int i;
 | 
				
			||||||
 | 
					    struct nqx_devinfo info;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int     ftm_nq_nfc_open( void );
 | 
				
			||||||
 | 
					int     ftm_nq_nfc_close( void );
 | 
				
			||||||
 | 
					int     ftm_nfc_hw_reset( void );
 | 
				
			||||||
 | 
					int     ProcessCommand( uint8_t *nci_data );
 | 
				
			||||||
 | 
					void   *PrepareRsp( ftm_nfc_pkt_type *nfc_ftm_pkt );
 | 
				
			||||||
 | 
					void   *ftm_nfc_dispatch_nq( ftm_nfc_pkt_type *nfc_ftm_pkt, uint16 pkt_len);
 | 
				
			||||||
 | 
					void   *nfc_read_thread( void *arg );
 | 
				
			||||||
 | 
					extern sem_t               sRfNtf;
 | 
				
			||||||
 | 
					extern int          ese_dwp_test;
 | 
				
			||||||
 | 
					extern void printTecnologyDetails(char technology, char protocol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_NFC_CMD_CODE                            55
 | 
				
			||||||
 | 
					#define FTM_NFC_NFCC_COMMAND                        0x02
 | 
				
			||||||
 | 
					#define FTM_NFC_SEND_DATA                           0x03
 | 
				
			||||||
 | 
					#define FTM_NFC_REQ_CHIP_TYPE                       0x04
 | 
				
			||||||
 | 
					#define FTM_NFC_FWPIN_CTRL                          0x05
 | 
				
			||||||
 | 
					#define FTM_NFC_CMD_CMPL_TIMEOUT                    3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_NFC_QTI_CHIP                            0x00
 | 
				
			||||||
 | 
					#define FTM_NFC_NQ_CHIP                             0x01
 | 
				
			||||||
 | 
					#define FTM_NFC_FWDL_SUCCESS                        0x01
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MIN_CMD_PKT_LEN                             4           // Minimum length for a valid FTM packet, 2 bytes for Diag header, 2 bytes for command ID
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LOG_NFC_FTM                                 0x1802
 | 
				
			||||||
 | 
					#define LOG_HEADER_LENGTH                           12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NFC_SET_PWR                                _IOW(0xE9, 0x01, unsigned int)
 | 
				
			||||||
 | 
					#define NFCC_GET_INFO                              _IOW(0xE9, 0x09, unsigned int)
 | 
				
			||||||
 | 
					#define POWER_OFF                                    0
 | 
				
			||||||
 | 
					#define POWER_ON                                     1
 | 
				
			||||||
 | 
					#define FIRMWARE_MODE                                2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define EXPECTED_CORE_INIT_RSP_LEN                  29
 | 
				
			||||||
 | 
					#define CHIP_ID                                     24
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SKIP_NQ_HARDWARE_CHECK                      "SkipNQHardwareCheck"
 | 
				
			||||||
 | 
					#define HARDWARE_TYPE_TIMEOUT                        2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define UNUSED_PARAMETER( x )      ( void )( x )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // _FTM_NFCNQ
 | 
				
			||||||
							
								
								
									
										664
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq_fwdl.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										664
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq_fwdl.c
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,664 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					 * All Rights Reserved.
 | 
				
			||||||
 | 
					 * Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Not a Contribution.
 | 
				
			||||||
 | 
					 * Apache license notifications and license are retained
 | 
				
			||||||
 | 
					 * for attribution purposes only.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2015 NXP Semiconductors
 | 
				
			||||||
 | 
					 * The original Work has been changed by NXP Semiconductors.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (C) 2010 The Android Open Source Project
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					  FTM NFC NQ Firmware Download Source File
 | 
				
			||||||
 | 
					  Description
 | 
				
			||||||
 | 
					  This file contains the definitions of the functions
 | 
				
			||||||
 | 
					  used to download firmware onto the NQ Chip.
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "ftm_nfcnq_fwdl.h"
 | 
				
			||||||
 | 
					#include "ftm_nfcnq.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned int chip_version           = 0x00;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* lookup table for CRC-16-CCITT calculation */
 | 
				
			||||||
 | 
					static uint16_t const crcTable[ 256 ] =
 | 
				
			||||||
 | 
					    { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad,
 | 
				
			||||||
 | 
					    0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,
 | 
				
			||||||
 | 
					    0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
 | 
				
			||||||
 | 
					    0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7,
 | 
				
			||||||
 | 
					    0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,
 | 
				
			||||||
 | 
					    0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a,
 | 
				
			||||||
 | 
					    0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e,
 | 
				
			||||||
 | 
					    0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae,
 | 
				
			||||||
 | 
					    0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32,
 | 
				
			||||||
 | 
					    0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca,
 | 
				
			||||||
 | 
					    0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
 | 
				
			||||||
 | 
					    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235,
 | 
				
			||||||
 | 
					    0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3,
 | 
				
			||||||
 | 
					    0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d,
 | 
				
			||||||
 | 
					    0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f,
 | 
				
			||||||
 | 
					    0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d,
 | 
				
			||||||
 | 
					    0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,
 | 
				
			||||||
 | 
					    0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64,
 | 
				
			||||||
 | 
					    0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
 | 
				
			||||||
 | 
					    0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    load_firmware_from_library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    gets a pointer to the firmware image and the length of the image
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    const char      *pathToLib          - path to the firmware image library
 | 
				
			||||||
 | 
					    uint8_t        **ppFirmwareImage    - pointer to the pointer to the firmware image
 | 
				
			||||||
 | 
					    uint16_t        *pFirmwareImageLen  - pointer to the firmware image length
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==========================================================================================================*/
 | 
				
			||||||
 | 
					static void load_firmware_from_library( const char *pathToLib, uint8_t **ppFirmwareImage,
 | 
				
			||||||
 | 
					                                        uint16_t   *pFirmwareImageLen )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    void    *pFirmwareLibHandle     = NULL;
 | 
				
			||||||
 | 
					    void    *pTempFirmwareImage     = NULL;
 | 
				
			||||||
 | 
					    void    *pTempFirmwareImageLen  = NULL;
 | 
				
			||||||
 | 
					    int      status                 = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if( NULL == pathToLib )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if(chip_version == 0x51 || chip_version == 0x50 || chip_version == 0x41 || chip_version == 0x40 )
 | 
				
			||||||
 | 
					                pathToLib = "/system/vendor/firmware/libpn553_fw.so";                               // set the path to pn553 firmware library
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                pathToLib = "/system/vendor/firmware/libpn548ad_fw.so";                             // set the default path to pn548ad firmware library
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( NULL != pFirmwareLibHandle )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            status = dlclose( pFirmwareLibHandle );                                                 // if the firmware library handle is not NULL, release the handle
 | 
				
			||||||
 | 
					            pFirmwareLibHandle = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            dlerror( );                                                                             // clear existing errors
 | 
				
			||||||
 | 
					            if( 0 != status )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: dlclose() failed with status = %d \n", __FUNCTION__, status );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pFirmwareLibHandle = dlopen( pathToLib, RTLD_LAZY );                                        // get a handle to firmware library
 | 
				
			||||||
 | 
					        LOG_MESSAGE( "Opening library handle from %s\n", pathToLib );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( NULL == pFirmwareLibHandle )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: dlopen() failed  \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        dlerror( );                                                                                 // clear existing errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pTempFirmwareImage = ( void * )dlsym( pFirmwareLibHandle, "gphDnldNfc_DlSeq" );             // get a pointer to the firmware library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( dlerror( ) || ( NULL == pTempFirmwareImage ) )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: dlsym() failed, failed to load gphDnldNfc_DlSeq symbol \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        *ppFirmwareImage = *( uint8_t ** )pTempFirmwareImage;                                       // the returned pointer is a pointer to an uint8_t array
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pTempFirmwareImageLen = ( void * ) dlsym( pFirmwareLibHandle, "gphDnldNfc_DlSeqSz" );       // get a pointer to the firmware library length
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( dlerror( ) || ( NULL == pTempFirmwareImageLen ) )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: dlsym() failed, failed to load gphDnldNfc_DlSeqSz symbol \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        *pFirmwareImageLen = ( uint16_t )( *( ( uint16_t * )pTempFirmwareImageLen ) );              // the returned pointer is a pointer to the length of the image
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } while( FALSE );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    send_packet_packet_to_chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    sends the constructed packets to the NFC chip by calling ProcessCommand() from ftm_nfcnq.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
 | 
				
			||||||
 | 
					                                                    information required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==========================================================================================================*/
 | 
				
			||||||
 | 
					static void send_packet_packet_to_chip( pfirmware_download_context_t pDownloadContext )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int status = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    status = ProcessCommand( &pDownloadContext->packetToSend );                                     // call ProcessCommand() from ftm_nfcnq.c
 | 
				
			||||||
 | 
					    if( 0 != status )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOG_ERROR( "%s: ProcessCommand() failed with status = %d \n", __FUNCTION__, status );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    calculate_crc16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    calculates CRC-16-CCITT of a given buffer with a given length with seed value of 0xffff(Hex)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    uint8_t *pBuff      - buffer for CRC-16-CCITT calculation
 | 
				
			||||||
 | 
					    uint16_t buffLen    - length of buffer for CRC-16-CCITT calculation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    uint16_t            - calculated CRC-16-CCITT value of buffer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==========================================================================================================*/
 | 
				
			||||||
 | 
					static uint16_t calculate_crc16( uint8_t *pBuff, uint16_t buffLen )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16_t temp   = 0;
 | 
				
			||||||
 | 
					    uint16_t value  = 0;
 | 
				
			||||||
 | 
					    uint16_t crc    = 0xffff;                                                                       // seed value
 | 
				
			||||||
 | 
					    uint32_t i      = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ( ( NULL == pBuff ) || ( 0 == buffLen ) )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOG_ERROR( "%s: Invalid parameters \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        for( i = 0; i < buffLen; i++ )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            value   = 0x00ffU & ( uint16_t )pBuff[ i ];
 | 
				
			||||||
 | 
					            temp    = ( crc >> 8U ) ^ value;
 | 
				
			||||||
 | 
					            crc     = ( crc << 8U ) ^ crcTable[ temp ];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return crc;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    insert_crc16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    inserts the calculated CRC-16-CCITT value into the end of the buffer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
 | 
				
			||||||
 | 
					                                                    information required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==========================================================================================================*/
 | 
				
			||||||
 | 
					static void insert_crc16( pfirmware_download_context_t pDownloadContext )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16_t    crcValueToWrite = 0;
 | 
				
			||||||
 | 
					    uint8_t    *crcValueInBytes = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* get CRC-16-CCITT value of packet and convert it into 2 bytes */
 | 
				
			||||||
 | 
					    crcValueToWrite = calculate_crc16( &pDownloadContext->packetToSend,
 | 
				
			||||||
 | 
					                                        pDownloadContext->headerPlusPayloadLen );
 | 
				
			||||||
 | 
					    crcValueInBytes = ( uint8_t * )&crcValueToWrite;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* insert crc value into last 2 bytes of the packet */
 | 
				
			||||||
 | 
					    if( pDownloadContext->packetToSend.payloadLen < ( FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN + FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN - 1 ))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        pDownloadContext->packetToSend.payloadBuff[ pDownloadContext->packetToSend.payloadLen ]     = crcValueInBytes[ 1 ];
 | 
				
			||||||
 | 
					        pDownloadContext->packetToSend.payloadBuff[ pDownloadContext->packetToSend.payloadLen + 1 ] = crcValueInBytes[ 0 ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOG_ERROR( "%s: Packet to send payloadLen more than maximum payloadBuff size \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    read_response_from_chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    reader thread that constantly checks for responses from NFC chip, checks the integrity of the
 | 
				
			||||||
 | 
					    response packets by matching the CRC-16-CCITT values and signals the semaphore held by
 | 
				
			||||||
 | 
					    the call to ProcessCommand()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
 | 
				
			||||||
 | 
					                                                    information required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==========================================================================================================*/
 | 
				
			||||||
 | 
					static void read_response_from_chip( pfirmware_download_context_t pDownloadContext )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t     lenRead                 = 0;
 | 
				
			||||||
 | 
					    uint8_t    *pPacketReceived         = NULL;
 | 
				
			||||||
 | 
					    uint16_t    calculatedCrcValue      = 0;
 | 
				
			||||||
 | 
					    uint16_t    crcValueFromResponse    = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if( fdNfc < 0 )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: Invalid handle \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        lenRead = read( fdNfc, &pDownloadContext->packetReceived,                               // get the response packet header
 | 
				
			||||||
 | 
					                        FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( 0 == lenRead )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: Error reading response packet header \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            pDownloadContext->totalPacketLen = lenRead;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        lenRead = read( fdNfc, &pDownloadContext->packetReceived.payloadBuff,                   // get the rest fo the response packet
 | 
				
			||||||
 | 
					                      ( pDownloadContext->packetReceived.payloadLen +
 | 
				
			||||||
 | 
					                        FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( 0 == lenRead )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: Error reading response packet payload \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            pDownloadContext->totalPacketLen += lenRead;                                        // update the total length of the received packet
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        calculatedCrcValue = calculate_crc16( &pDownloadContext->packetReceived,                // calculate the CRC-16-CCITT value of the received packet
 | 
				
			||||||
 | 
					                                             ( pDownloadContext->packetReceived.payloadLen +
 | 
				
			||||||
 | 
					                                               FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* convert crc value from the response packet to an uint16_t */
 | 
				
			||||||
 | 
					        if( pDownloadContext->packetReceived.payloadLen < ( FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN + FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN - 1 ))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            crcValueFromResponse   = pDownloadContext->packetReceived.payloadBuff[ pDownloadContext->packetReceived.payloadLen ];
 | 
				
			||||||
 | 
					            crcValueFromResponse <<= 8;
 | 
				
			||||||
 | 
					            crcValueFromResponse  |= pDownloadContext->packetReceived.payloadBuff[ pDownloadContext->packetReceived.payloadLen + 1 ];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: Packet received payloadLen more than maximum payloadBuff size \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if( calculatedCrcValue != crcValueFromResponse )                                        // compare the CRC-16-CCITT values
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: CRC-16-CCITT values do not match, discarding packet \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            sem_post( &sRspReady );                                                             // signal the semaphore for subsequent packets to be sent
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } while( FALSE == pDownloadContext->fExitReadThread );                                      // exit only when the flag is set
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    get_device_firmware_version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    sends the get-firmware-version command (0xF1) to the device and outputs the firmware version of
 | 
				
			||||||
 | 
					    the device
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
 | 
				
			||||||
 | 
					                                                    information required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==========================================================================================================*/
 | 
				
			||||||
 | 
					static void get_device_firmware_version( pfirmware_download_context_t pDownloadContext )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t getFirmwareVersionCommand[ ]    = { 0x00, 0x04, 0xF1, 0x00, 0x00, 0x00 };           // command to get firmware version on device
 | 
				
			||||||
 | 
					    uint8_t firmwareMajorVersion            = 0;
 | 
				
			||||||
 | 
					    uint8_t firmwareMinorVersion            = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pDownloadContext->headerPlusPayloadLen =
 | 
				
			||||||
 | 
					              sizeof( getFirmwareVersionCommand ) / sizeof( getFirmwareVersionCommand[ 0 ] );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy( &pDownloadContext->packetToSend, &getFirmwareVersionCommand,                        // construct the command packet
 | 
				
			||||||
 | 
					           ( pDownloadContext->headerPlusPayloadLen ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    insert_crc16( pDownloadContext );                                                           // insert the CRC-16-CCITT value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    send_packet_packet_to_chip( pDownloadContext );                                             // send the command packet to NFC chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* continues from here once the reader thread reads the response and flags the semaphore,
 | 
				
			||||||
 | 
					       the last 2 bytes of the get version response payload contains the firmware version currently on the device */
 | 
				
			||||||
 | 
					    firmwareMajorVersion = pDownloadContext->packetReceived.payloadBuff[ pDownloadContext->packetReceived.payloadLen - 1 ];
 | 
				
			||||||
 | 
					    firmwareMinorVersion = pDownloadContext->packetReceived.payloadBuff[ pDownloadContext->packetReceived.payloadLen - 2 ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(chip_version == 0x51 || chip_version == 0x50 || chip_version == 0x41 || chip_version == 0x40 )
 | 
				
			||||||
 | 
					        LOG_INFORMATION( "Firmware version: 11.%02X.%02X\n", firmwareMajorVersion, firmwareMinorVersion );
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        LOG_INFORMATION( "Firmware version: 10.%02X.%02X\n", firmwareMajorVersion, firmwareMinorVersion );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    build_first_packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    constructs the first packet to be sent to the NFC chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
 | 
				
			||||||
 | 
					                                                    information required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==========================================================================================================*/
 | 
				
			||||||
 | 
					static void build_first_packet( pfirmware_download_context_t pDownloadContext )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    memset( pDownloadContext->packetToSend.payloadBuff, 0,                                      // initialise the payload buffer to zero
 | 
				
			||||||
 | 
					            FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy( &pDownloadContext->packetToSend,                                                    // copy the first chunk from the firmware library to the packet
 | 
				
			||||||
 | 
					             pDownloadContext->pFirmwareImage,
 | 
				
			||||||
 | 
					             pDownloadContext->headerPlusPayloadLen );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    insert_crc16( pDownloadContext );                                                           // insert the CRC-16-CCITT value
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    build_next_packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    constructs subsequent packets required to be sent to the NFC chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
 | 
				
			||||||
 | 
					                                                    information required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==========================================================================================================*/
 | 
				
			||||||
 | 
					static void build_next_packet( pfirmware_download_context_t pDownloadContext )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /* for chunks from library that are larger than 256 bytes, the packets have to be fragmented */
 | 
				
			||||||
 | 
					    if( pDownloadContext->bytesLeftToSend > FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        pDownloadContext->headerPlusPayloadLen = FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN +         // length of header plus the payload for CRC-16-CCITT calculation
 | 
				
			||||||
 | 
					                                                 FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->totalPacketLen = FIRMWARE_DOWNLOAD_MAX_PACKET_LEN;                        // length of the entire packet to be sent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->packetToSend.fFragmentedPacket = FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_SET;  // set the fragment flag as the first byte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->packetToSend.payloadLen = FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN;       // insert the payload length in the second byte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        memcpy( ( &pDownloadContext->packetToSend.payloadBuff ),                                    // copy payload from firmware library
 | 
				
			||||||
 | 
					                  &pDownloadContext->pFirmwareImage[ pDownloadContext->readIndexFromLib ],
 | 
				
			||||||
 | 
					                   FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->readIndexFromLib += FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN;             // update the buffer index used to read from firmware library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->bytesLeftToSend -= FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN;              // update the number of bytes left to send from the chunk
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* for chunks from library that are smaller than 256 bytes, no fragmentation needed */
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        pDownloadContext->headerPlusPayloadLen = pDownloadContext->bytesLeftToSend +                // length of header plus the payload for CRC-16-CCITT calculation
 | 
				
			||||||
 | 
					                                                 FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->totalPacketLen = pDownloadContext->bytesLeftToSend +                      // length of the entire packet to be sent
 | 
				
			||||||
 | 
					                                           FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN +
 | 
				
			||||||
 | 
					                                           FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->packetToSend.fFragmentedPacket = FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_NONE; // set the fragment flag to none as the first byte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->packetToSend.payloadLen = pDownloadContext->bytesLeftToSend;              // insert the payload length in the second byte
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        memcpy( ( &pDownloadContext->packetToSend.payloadBuff ),                                    // copy payload from firmware library
 | 
				
			||||||
 | 
					                  &pDownloadContext->pFirmwareImage[ pDownloadContext->readIndexFromLib ],
 | 
				
			||||||
 | 
					                   pDownloadContext->bytesLeftToSend );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->readIndexFromLib += pDownloadContext->bytesLeftToSend;                    // update the buffer index used to read from firmware library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->bytesLeftToSend = 0;                                                      // most likely the last fragment from the chunk
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    insert_crc16( pDownloadContext );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    process_packets_to_send
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    determines if the incoming packet is the first one or any subsequent ones and process them
 | 
				
			||||||
 | 
					    accordingly
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
 | 
				
			||||||
 | 
					                                                    information required
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==========================================================================================================*/
 | 
				
			||||||
 | 
					static void process_packets_to_send( pfirmware_download_context_t pDownloadContext )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t     firstChunkLenFromLib    = 0;
 | 
				
			||||||
 | 
					    uint16_t    nextChunkLenFromLib     = 0;
 | 
				
			||||||
 | 
					    uint16_t    buffIndex               = pDownloadContext->readIndexFromLib;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if( TRUE == pDownloadContext->fFirstPacket )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        pDownloadContext->fFirstPacket = FALSE;                                         // indicates that the first packet has been processed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        firstChunkLenFromLib = pDownloadContext->pFirmwareImage[ 1 ] +                  // length of the first chunk read from firmware library
 | 
				
			||||||
 | 
					                               FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->totalPacketLen = firstChunkLenFromLib +                       // length of the entire packet to send
 | 
				
			||||||
 | 
					                                           FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->readIndexFromLib += firstChunkLenFromLib;                     // update the buffer index used to read from firmware library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->headerPlusPayloadLen = firstChunkLenFromLib;                  // length of header plus the payload for CRC-16-CCITT calculation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        build_first_packet( pDownloadContext );                                         // build the first packet
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        send_packet_packet_to_chip( pDownloadContext );                                 // send the packet to the NFC chip
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if( FALSE == pDownloadContext->fFirstPacket )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        nextChunkLenFromLib = pDownloadContext->pFirmwareImage[ buffIndex ];            // length of next chunk read from the firmware library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /* length of next chunk is stored in 2 bytes in the firmware library */
 | 
				
			||||||
 | 
					        nextChunkLenFromLib <<= 8;
 | 
				
			||||||
 | 
					        nextChunkLenFromLib  |= pDownloadContext->pFirmwareImage[ buffIndex + 1 ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        buffIndex += 2;                                                                 // add 2 bytes to the buffer index after length of next chunk is read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->readIndexFromLib = buffIndex;                                 // update the buffer index used to read from firmware library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->bytesLeftToSend = nextChunkLenFromLib;                        // number of bytes left on the chunk to be sent to the chip
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while( pDownloadContext->bytesLeftToSend > 0 )                                  // constructs and sends packets as long as there are bytes left in the chunk
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            build_next_packet( pDownloadContext );
 | 
				
			||||||
 | 
					            send_packet_packet_to_chip( pDownloadContext );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOG_ERROR( "%s: Should not reach this point \n", __FUNCTION__ );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    ftm_nfc_dispatch_nq_fwdl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    called by main() in ftm_main.c to start the firmware download routine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    none
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					==========================================================================================================*/
 | 
				
			||||||
 | 
					void ftm_nfc_dispatch_nq_fwdl( void )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int          status                 = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    char        *pathToLib              = NULL;
 | 
				
			||||||
 | 
					    uint8_t     *pFirmwareImage         = NULL;
 | 
				
			||||||
 | 
					    uint16_t     firmwareImageLen       = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t     *pNextChunkFromLib      = NULL;
 | 
				
			||||||
 | 
					    uint16_t     nextChunkLenFromLib    = 0;
 | 
				
			||||||
 | 
					    uint16_t     totalBytesReadFromLib  = 0;
 | 
				
			||||||
 | 
					    uint16_t     readIndexFromLib       = 0;
 | 
				
			||||||
 | 
					    union        nqx_uinfo           nqx_info;
 | 
				
			||||||
 | 
					    pthread_t                       readerThread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    firmware_download_context_t     downloadContext     = { 0 };
 | 
				
			||||||
 | 
					    pfirmware_download_context_t    pDownloadContext    = &downloadContext;
 | 
				
			||||||
 | 
					    pDownloadContext->fFirstPacket                      = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if( !fdNfc )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            status = ftm_nq_nfc_open( );                                                // get a handle to the kernel driver
 | 
				
			||||||
 | 
					            if( status < 0 )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "\n%s: ftm_nq_nfc_open() failed with status = %d \n", __FUNCTION__, status );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            status = ftm_nfc_hw_reset( );                                               // reset NFC hardware
 | 
				
			||||||
 | 
					            if( status < 0 )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: ftm_nq_nfc_reset() failed with status = %d \n", __FUNCTION__, status );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            nqx_info.i = ioctl( fdNfc, NFCC_GET_INFO, 0 );
 | 
				
			||||||
 | 
					            if( nqx_info.i < 0 )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: nqnfcinfo not enabled, info  = %d \n", __FUNCTION__, nqx_info.i );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            chip_version = nqx_info.info.chip_type;
 | 
				
			||||||
 | 
					            LOG_INFORMATION( "\n NQ Chip ID : %x\n", chip_version);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        status = pthread_create( &readerThread, NULL,                                   // create a reader thread
 | 
				
			||||||
 | 
					                                 &read_response_from_chip, pDownloadContext );
 | 
				
			||||||
 | 
					        if( 0 != status )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: pthread_create() failed with status = %d \n", __FUNCTION__, status );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        load_firmware_from_library( pathToLib, &pFirmwareImage, &firmwareImageLen );    // get a pointer to firmware library image and get its length
 | 
				
			||||||
 | 
					        if( ( NULL == pFirmwareImage ) || ( 0 == firmwareImageLen ) )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: Firmware library image extraction failed\n", __FUNCTION__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LOG_MESSAGE( "Firmware major version number: %02X\n",   pFirmwareImage[ 5 ] );
 | 
				
			||||||
 | 
					        LOG_MESSAGE( "Firmware minor version number: %02X\n",   pFirmwareImage[ 4 ] );
 | 
				
			||||||
 | 
					        LOG_MESSAGE( "Firmware library image length: %d\n",     firmwareImageLen );
 | 
				
			||||||
 | 
					        LOG_MESSAGE( "Firmware library image pointer: %X\n",  ( uintptr_t )pFirmwareImage );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->pFirmwareImage     = pFirmwareImage;
 | 
				
			||||||
 | 
					        pDownloadContext->firmwareImageLen   = firmwareImageLen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        status = ioctl( fdNfc, NFC_SET_PWR, FIRMWARE_MODE );                            // set NFCC to firmware download mode
 | 
				
			||||||
 | 
					        if( 0 != status )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: Failed to set firmware pin high.\n", __FUNCTION__ );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LOG_INFORMATION( "\nBefore firmware update...\n" );
 | 
				
			||||||
 | 
					        get_device_firmware_version( pDownloadContext );                                // get device version before loading firmware
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LOG_INFORMATION( "\nSending firmware packets... Please wait\n" );
 | 
				
			||||||
 | 
					        while( pDownloadContext->readIndexFromLib < pDownloadContext->firmwareImageLen )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            process_packets_to_send( pDownloadContext );                                // build and send download packets with payload from the firmware library image
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LOG_INFORMATION( "All packets sent!\n\n" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pDownloadContext->fExitReadThread = TRUE;                                       // set flag to indicate that reader thread is safe to exit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LOG_INFORMATION( "After firmware update...\n" );
 | 
				
			||||||
 | 
					        get_device_firmware_version( pDownloadContext );                                // get device version number after loading firmware
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LOG_MESSAGE( "Waiting for reader thread to terminate...\n" );
 | 
				
			||||||
 | 
					        pthread_join( readerThread, NULL );                                             // wait for reader thread to terminate
 | 
				
			||||||
 | 
					        LOG_MESSAGE( "Reader thread terminated!\n" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LOG_MESSAGE( "Resetting NFCC...\n" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        status = ftm_nfc_hw_reset( );                                                   // reset the NFC hardware which resets the firmware pin as well
 | 
				
			||||||
 | 
					        if( status < 0 )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: ftm_nfc_hw_reset() failed with status = %d \n", __FUNCTION__, status );
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        status = ftm_nq_nfc_close( );                                                   // release the handle to the kernel driver
 | 
				
			||||||
 | 
					        if( 0 != status )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: ftm_nq_nfc_close() failed with status = %d \n", __FUNCTION__, status );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LOG_INFORMATION( "All done!\n\n" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } while( FALSE );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										111
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq_fwdl.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										111
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq_fwdl.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,111 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2016 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					 * All Rights Reserved.
 | 
				
			||||||
 | 
					 * Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Not a Contribution.
 | 
				
			||||||
 | 
					 * Apache license notifications and license are retained
 | 
				
			||||||
 | 
					 * for attribution purposes only.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2015 NXP Semiconductors
 | 
				
			||||||
 | 
					 * The original Work has been changed by NXP Semiconductors.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (C) 2010 The Android Open Source Project
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					  FTM NFC NQ Firmware Download Header File
 | 
				
			||||||
 | 
					  Description
 | 
				
			||||||
 | 
					  This file contains the declarations of the functions and various
 | 
				
			||||||
 | 
					  definitions used to download firmware onto the NQ Chip.
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <dlfcn.h>
 | 
				
			||||||
 | 
					#include <semaphore.h>
 | 
				
			||||||
 | 
					#include <pthread.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FALSE   ( 0 )
 | 
				
			||||||
 | 
					#define TRUE    ( !FALSE )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FIRMWARE_DOWNLOAD_MAX_PACKET_LEN            ( 0x100U )      // maximum length for a download packet
 | 
				
			||||||
 | 
					#define FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN         ( 0x02U )       // length of the header
 | 
				
			||||||
 | 
					#define FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN          ( 0x02U )       // length of CRC-16-CCITT value
 | 
				
			||||||
 | 
					#define FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN     FIRMWARE_DOWNLOAD_MAX_PACKET_LEN - \
 | 
				
			||||||
 | 
					                                                     FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN - \
 | 
				
			||||||
 | 
					                                                     FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*  Values for the first byte of each packet, indicates if the packet is fragmented */
 | 
				
			||||||
 | 
					#define FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_NONE     ( 0x00U )       // not fragmented
 | 
				
			||||||
 | 
					#define FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_SET      ( 0x04U )       // fragmented packet, next packet is a part of this one
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern sem_t        sRspReady;                                      // semaphore used by reader thread
 | 
				
			||||||
 | 
					extern int          fdNfc;                                          // a handle to the kernel driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef uint8_t     bool_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* structure of the packet to be sent or received */
 | 
				
			||||||
 | 
					typedef struct firmware_download_packet
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8_t     fFragmentedPacket;                                          // flag to indicate if the packet is fragmented
 | 
				
			||||||
 | 
					    uint8_t     payloadLen;                                                 // length of payload
 | 
				
			||||||
 | 
					    uint8_t     payloadBuff[ FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN +
 | 
				
			||||||
 | 
					                             FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN ];          // buffer containing the payload and CRC-16-CCITT value
 | 
				
			||||||
 | 
					} firmware_download_packet_t, *pfirmware_download_packet_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* structure that contains all the other information about the packets */
 | 
				
			||||||
 | 
					typedef struct firmware_download_context
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    const uint8_t              *pFirmwareImage;                     // pointer to the firmware image library
 | 
				
			||||||
 | 
					    uint16_t                    firmwareImageLen;                   // length of the firmware image
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uint8_t                     headerPlusPayloadLen;               // header and payload length of a packet for CRC calculation
 | 
				
			||||||
 | 
					    uint16_t                    readIndexFromLib;                   // index used to read from the firmware library
 | 
				
			||||||
 | 
					    uint16_t                    bytesLeftToSend;                    // number of bytes left to send when the chunk read is fragmented
 | 
				
			||||||
 | 
					    uint16_t                    totalPacketLen;                     // total length of packet to be sent or received
 | 
				
			||||||
 | 
					    bool_t                      fFirstPacket;                       // flag to indicate if it is the first packet
 | 
				
			||||||
 | 
					    bool_t                      fExitReadThread;                    // flag to indicate if reader thread is safe to exit
 | 
				
			||||||
 | 
					    firmware_download_packet_t  packetToSend;                       // contains information about packet to be sent
 | 
				
			||||||
 | 
					    firmware_download_packet_t  packetReceived;                     // contains information about packet from response received
 | 
				
			||||||
 | 
					} firmware_download_context_t, *pfirmware_download_context_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Firmware download packet format
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    |               Header                  |           Payload                 |   CRC-16-CCITT value  |
 | 
				
			||||||
 | 
					    -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    |   Fragment flag   |   Payload length  |   Command/Response    |   Data    |   CRC-16-CCITT value  |
 | 
				
			||||||
 | 
					    -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    |       1 byte      |       1 byte      |         1 byte        |  n bytes  |         2 bytes       |
 | 
				
			||||||
 | 
					    -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Firmware library image format
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ---------------------------------------------------------------------------------          ----------------------------------
 | 
				
			||||||
 | 
					    |   0x00    | First chunk length | First chunk | Next chunk length | Next chunk |    ...   | Last chunk length | Last chunk |
 | 
				
			||||||
 | 
					    ---------------------------------------------------------------------------------          ----------------------------------
 | 
				
			||||||
 | 
					    |  1 byte   |      1 byte        |   n bytes   |      2 bytes      |   n bytes  |    ...   |      2 bytes      |   n bytes  |
 | 
				
			||||||
 | 
					    ---------------------------------------------------------------------------------          ----------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
							
								
								
									
										461
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq_test.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										461
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq_test.c
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,461 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2017 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					 * All Rights Reserved.
 | 
				
			||||||
 | 
					 * Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <libgen.h>
 | 
				
			||||||
 | 
					#include "ftm_nfcnq.h"
 | 
				
			||||||
 | 
					#include "ftm_nfcnq_test.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Global variables */
 | 
				
			||||||
 | 
					pthread_t           clientThread;
 | 
				
			||||||
 | 
					PNCI_MESSAGE        pNCIMessage;
 | 
				
			||||||
 | 
					char                *progname;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    eseSpiTest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    Send APDU for eSE SPI HLOS test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    int argc - argument count
 | 
				
			||||||
 | 
					    char **argv - argument vector
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=============================================================================*/
 | 
				
			||||||
 | 
					void eseSpiTest(int argc, char **argv )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int ret = 0;
 | 
				
			||||||
 | 
					    int test_mode = 0;
 | 
				
			||||||
 | 
					    unsigned char i = 0;
 | 
				
			||||||
 | 
					    int fp = 0;
 | 
				
			||||||
 | 
					    int choice = 0;
 | 
				
			||||||
 | 
					    unsigned char send_APDU[] = {0x5A,0x00,0x05,0x00,0xA4,0x04,0x00,0x00,0xA5};
 | 
				
			||||||
 | 
					    int size_APDU = 0;
 | 
				
			||||||
 | 
					    unsigned char recv_response[259] = {0};
 | 
				
			||||||
 | 
					    progname = basename(argv[2]);
 | 
				
			||||||
 | 
					    test_mode = getopt(argc, argv, "01");
 | 
				
			||||||
 | 
					    size_APDU = sizeof(send_APDU);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LOG_INFORMATION("\n### eSE SPI test ###\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(test_mode == '0')
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        choice = 0;
 | 
				
			||||||
 | 
					        LOG_INFORMATION("\nInterrupt Mode test\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        choice = 1;
 | 
				
			||||||
 | 
					        LOG_INFORMATION("\nPoll Mode test(default)\n");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        //open module
 | 
				
			||||||
 | 
					        if ((ret = (fp = open("/dev/ese", O_RDWR))) < 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_INFORMATION("eSE open error retcode = %d, errno = %d\n", ret, errno);
 | 
				
			||||||
 | 
					            LOG_INFORMATION("\n... eSE SPI Test requires modified boot and TZ image ...");
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        LOG_INFORMATION("eSE open : Ret = %2d\n", ret);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //enable the logs
 | 
				
			||||||
 | 
					        ioctl(fp, ESE_SET_DBG, 1);
 | 
				
			||||||
 | 
					        //hardware reset
 | 
				
			||||||
 | 
					        ioctl(fp, ESE_SET_PWR, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ioctl(fp, ESE_SET_MODE, choice);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        //write one APDU
 | 
				
			||||||
 | 
					        ret = write(fp, send_APDU, sizeof(send_APDU));
 | 
				
			||||||
 | 
					        if (ret < 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_INFORMATION("ese write error retcode = %d, errno = %d\n", ret, errno);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        LOG_INFORMATION("ese Write : Ret = %.2X \n", ret);
 | 
				
			||||||
 | 
					        LOG_INFORMATION("APDU sent to eSE: ");
 | 
				
			||||||
 | 
					        for (i=0; i<size_APDU; i++)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_INFORMATION("%.2X ", send_APDU[i]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        sleep(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if ((ret = (read(fp, &recv_response[0], READ_SAMPLE_SIZE)), 0) < 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_INFORMATION("\neSE read error retcode = %d, errno = %d", ret, errno);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_INFORMATION("\nResponse from eSE: ");
 | 
				
			||||||
 | 
					            for (i=0;i<(recv_response[2]+1);i++)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              LOG_INFORMATION("%.2X ", recv_response[i]);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            LOG_INFORMATION("\n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    } while(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    close(fp);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    eseDwpTest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    Send NCI commands to NFCC for eSE DWP detection
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=============================================================================*/
 | 
				
			||||||
 | 
					void eseDwpTest()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int cmds;
 | 
				
			||||||
 | 
					    cmds = sizeof(NQ330_ESE_DWP) / sizeof(NQ330_ESE_DWP[0]);
 | 
				
			||||||
 | 
					    LOG_INFORMATION( "\n### ese DWP Test ###\n" );
 | 
				
			||||||
 | 
					    if(whatNQChip == NQ_220 || whatNQChip == NQ_330)
 | 
				
			||||||
 | 
					        sendcmds(NQ330_ESE_DWP, cmds);
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        LOG_INFORMATION( "\nNQ Chipset in use doesn't support eSE\n" );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    printTecnologyDetails
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    Print the technology supported and protocols details
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    char technology - technology supported identifier
 | 
				
			||||||
 | 
					    char protocol - protocol identifier
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=============================================================================*/
 | 
				
			||||||
 | 
					void printTecnologyDetails(char technology, char protocol)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    switch (protocol)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      case NFC_PROTOCOL_ISO_DEP:
 | 
				
			||||||
 | 
					          LOG_INFORMATION( "ISO-DEP Protocol");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case NFC_PROTOCOL_NFC_DEP:
 | 
				
			||||||
 | 
					          LOG_INFORMATION( "NFC-DEP Protocol");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case NFC_PROTOCOL_T1T:
 | 
				
			||||||
 | 
					          LOG_INFORMATION( "T1T Protocol");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case NFC_PROTOCOL_T2T:
 | 
				
			||||||
 | 
					          LOG_INFORMATION( "T2T Protocol");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case NFC_PROTOCOL_T3T:
 | 
				
			||||||
 | 
					          LOG_INFORMATION( "T3T Protocol");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case NFC_PROTOCOL_UNKNOWN:
 | 
				
			||||||
 | 
					          LOG_INFORMATION( "unknown Protocol");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (technology)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      case NFC_NFCA_Poll:
 | 
				
			||||||
 | 
					          LOG_INFORMATION("\nNFC A POLL MODE TECHNOLOGY\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					      case NFC_NFCB_Poll:
 | 
				
			||||||
 | 
					          LOG_INFORMATION("\nNFC B POLL MODE TECHNOLOGY\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					      case NFC_NFCF_Poll:
 | 
				
			||||||
 | 
					          LOG_INFORMATION("\nNFC F POLL MODE TECHNOLOGY\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					      case NFC_NFCA_Listen:
 | 
				
			||||||
 | 
					          LOG_INFORMATION("\nNFC A LISTEN MODE TECHNOLOGY\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					      case NFC_NFCB_Listen:
 | 
				
			||||||
 | 
					          LOG_INFORMATION("\nNFC B LISTEN MODE TECHNOLOGY\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					      case NFC_NFCF_Listen:
 | 
				
			||||||
 | 
					          LOG_INFORMATION("\nNFC F LISTEN MODE TECHNOLOGY\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					      case NFC_NFCISO15693_Poll:
 | 
				
			||||||
 | 
					          LOG_INFORMATION("\nNFC ISO15693 POLL MODE TECHNOLOGY\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					      default:
 | 
				
			||||||
 | 
					          LOG_INFORMATION("\nother TECHNOLOGY\n");
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    sendcmds
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    Send sequence of commands to NFCC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    uint8_t buffer[] - Command buffer array
 | 
				
			||||||
 | 
					    int no_of_cmds - Number of commands to be sent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=============================================================================*/
 | 
				
			||||||
 | 
					void sendcmds(uint8_t buffer[][MAX_CMD_LEN], int no_of_cmds)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int rows=0,payloadlen=0;
 | 
				
			||||||
 | 
					    int ret = 0;
 | 
				
			||||||
 | 
					    ftm_nfc_pkt_type *nfc_pkt  = (ftm_nfc_pkt_type *)malloc(no_of_cmds*255);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    LOG_INFORMATION("\nTotal cmds to be sent = %d\n",no_of_cmds);
 | 
				
			||||||
 | 
					    LOG_INFORMATION("Wait for Commands to be sent... \n\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for(rows = 0; rows < no_of_cmds; rows++)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					#ifdef NFC_FTM_DEBUG
 | 
				
			||||||
 | 
					        LOG_INFORMATION ("Number of cmds sent = %d \n",rows+1);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					        payloadlen = 0;
 | 
				
			||||||
 | 
					        payloadlen = 3 + buffer[rows][2];
 | 
				
			||||||
 | 
					        memset(nfc_pkt->nci_data, -1, MAX_CMD_LEN);
 | 
				
			||||||
 | 
					        memcpy(nfc_pkt->nci_data, &buffer[rows], payloadlen);
 | 
				
			||||||
 | 
					        ret = ProcessCommand( nfc_pkt->nci_data );
 | 
				
			||||||
 | 
					        if( ret == -1 )                                  // wait finished, not signalled?
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "Waited for NCI NTF/DATA timeout\n" );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    usage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    Print usage information for test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=============================================================================*/
 | 
				
			||||||
 | 
					void usage()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    LOG_INFORMATION("\nUsage:");
 | 
				
			||||||
 | 
					    LOG_INFORMATION(" %s [-n] [-e] [-d] [h] \n", progname);
 | 
				
			||||||
 | 
					    LOG_INFORMATION(" %s -n ..for NFC test only\n", progname);
 | 
				
			||||||
 | 
					    LOG_INFORMATION(" %s -e ..for eSE SPI test only\n \t-0 ..Interrupt Mode\n \t-1 ..Poll Mode\n", progname);
 | 
				
			||||||
 | 
					    LOG_INFORMATION(" %s -d ..for eSE DWP test only\n", progname);
 | 
				
			||||||
 | 
					    LOG_INFORMATION(" %s -h HELP\n", progname);
 | 
				
			||||||
 | 
					    LOG_INFORMATION(" %s default NFC test only\n", progname);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    nfc_ese_pwr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    Set ESE power using NFC driver
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=============================================================================*/
 | 
				
			||||||
 | 
					void nfc_ese_pwr()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int ret;
 | 
				
			||||||
 | 
					    ret = ioctl( fdNfc, NFC_ESE_SET_PWR, POWER_ON );                // turn the chip on
 | 
				
			||||||
 | 
					    if( ret != 0 )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        LOG_INFORMATION("Can't find ESE GPIO in NFC driver: ");
 | 
				
			||||||
 | 
					        LOG_INFORMATION("ret=%d\n",ret);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==============================================================================
 | 
				
			||||||
 | 
					FUNCTION
 | 
				
			||||||
 | 
					    ftm_nfc_dispatch_nq_test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					    called by main() in ftm_main.c to start the nfc test routine
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PARAMETERS
 | 
				
			||||||
 | 
					    int argc - argument count
 | 
				
			||||||
 | 
					    char **argv - argument vector
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					    void
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					=============================================================================*/
 | 
				
			||||||
 | 
					void ftm_nfc_dispatch_nq_test( int argc, char **argv )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int cmds = 0;
 | 
				
			||||||
 | 
					    unsigned int chip_version = 0x00;
 | 
				
			||||||
 | 
					    unsigned int major_version = 0x00;
 | 
				
			||||||
 | 
					    unsigned int minor_version = 0x00;
 | 
				
			||||||
 | 
					    unsigned int rom_version = 0x00;
 | 
				
			||||||
 | 
					    char firmware_version[10];
 | 
				
			||||||
 | 
					    struct timespec  time_sec;
 | 
				
			||||||
 | 
					    int type_of_test = 0;
 | 
				
			||||||
 | 
					    int default_test = 0;
 | 
				
			||||||
 | 
					    int          status                 = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    union        nqx_uinfo           nqx_info;
 | 
				
			||||||
 | 
					    pthread_t                       readerThread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    do
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if( !fdNfc )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            status = ftm_nq_nfc_open( );                                                // get a handle to the kernel driver
 | 
				
			||||||
 | 
					            if( status < 0 )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "\n%s: ftm_nq_nfc_open() failed with status = %d \n", __FUNCTION__, status );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            status = ftm_nfc_hw_reset( );                                               // reset NFC hardware
 | 
				
			||||||
 | 
					            if( status < 0 )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: ftm_nq_nfc_reset() failed with status = %d \n", __FUNCTION__, status );
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            nqx_info.i = ioctl( fdNfc, NFCC_GET_INFO, 0 );
 | 
				
			||||||
 | 
					            if( nqx_info.i < 0 )
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR( "%s: nqnfcinfo not enabled, info  = %d \n", __FUNCTION__, nqx_info.i );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            chip_version = nqx_info.info.chip_type;
 | 
				
			||||||
 | 
					            rom_version = nqx_info.info.rom_version;
 | 
				
			||||||
 | 
					            major_version = nqx_info.info.fw_major;
 | 
				
			||||||
 | 
					            minor_version = nqx_info.info.fw_minor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            LOG_INFORMATION( "\n NQ Chip ID : %x\n", chip_version);
 | 
				
			||||||
 | 
					            snprintf(firmware_version, 10, "%02x.%02x.%02x", rom_version, major_version, minor_version);
 | 
				
			||||||
 | 
					            LOG_INFORMATION(" Firmware version : %s\n\n", firmware_version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(sem_init(&sRspReady, 0, 0) != 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                    LOG_ERROR("NFC FTM :semaphore_halcmd_complete creation failed \n");
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if(sem_init(&sRfNtf, 0, 0) != 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                    LOG_ERROR("NFC FTM :semaphore_halcmd_complete creation failed \n");
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            pNCIMessage     = ( PNCI_MESSAGE ) nciReplyMessage;
 | 
				
			||||||
 | 
					            status = pthread_create( &clientThread, NULL, &nfc_read_thread, NULL );            // Start the Read Thread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if( status != 0 )                                      // successful?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                 LOG_ERROR("nqnfc %s: pthread_create( nfc_read_thread ) failed with ret = %d \n", __func__, status );
 | 
				
			||||||
 | 
					                 break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            status = ftm_nfc_nq_vs_nxp( );
 | 
				
			||||||
 | 
					            if( status < 0 )                                   // Not an NQ Chip?
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                LOG_ERROR("ERROR NOT A KNOWN NQ Chip \n"  );
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        progname = basename(argv[1]);
 | 
				
			||||||
 | 
					        type_of_test = getopt(argc, argv, "nedhf");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (type_of_test) {
 | 
				
			||||||
 | 
					        case 'n':
 | 
				
			||||||
 | 
					            LOG_INFORMATION("NFC test only\n");
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 'e':
 | 
				
			||||||
 | 
					            LOG_INFORMATION("eSE SPI test only\n");
 | 
				
			||||||
 | 
					            nfc_ese_pwr();
 | 
				
			||||||
 | 
					            ese_spi_test = 1;
 | 
				
			||||||
 | 
					            eseSpiTest(argc, argv);
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 'd':
 | 
				
			||||||
 | 
					            LOG_INFORMATION("eSE DWP test only\n");
 | 
				
			||||||
 | 
					            ese_dwp_test = 1;
 | 
				
			||||||
 | 
					            eseDwpTest();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        case 'h':
 | 
				
			||||||
 | 
					            usage();
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					            usage();
 | 
				
			||||||
 | 
					            default_test = 1;
 | 
				
			||||||
 | 
					            LOG_INFORMATION("\nDefault NFC test only\n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(ese_dwp_test || ese_spi_test)
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(type_of_test == 'n' || default_test)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            switch(whatNQChip)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case NQ_210:
 | 
				
			||||||
 | 
					                case NQ_220:
 | 
				
			||||||
 | 
					                    cmds = sizeof(NQ220_cmds) / sizeof(NQ220_cmds[0]);
 | 
				
			||||||
 | 
					                    sendcmds(NQ220_cmds, cmds);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case NQ_310:
 | 
				
			||||||
 | 
					                case NQ_330:
 | 
				
			||||||
 | 
					                    cmds = sizeof(NQ330_cmds) / sizeof(NQ330_cmds[0]);
 | 
				
			||||||
 | 
					                    sendcmds(NQ330_cmds, cmds);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                default:
 | 
				
			||||||
 | 
					                    LOG_INFORMATION( "Chip not supported, taking NQ330 as default\n ");
 | 
				
			||||||
 | 
					                    cmds = sizeof(NQ330_cmds) / sizeof(NQ330_cmds[0]);
 | 
				
			||||||
 | 
					                    sendcmds(NQ330_cmds, cmds);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            LOG_INFORMATION("\n<<>> Waiting for TAG detect or 20sec timeout <<>> ...\n");
 | 
				
			||||||
 | 
					            status = clock_gettime( CLOCK_REALTIME, &time_sec );
 | 
				
			||||||
 | 
					            time_sec.tv_sec += NFC_NTF_TIMEOUT;
 | 
				
			||||||
 | 
					            status = sem_timedwait( &sRfNtf, &time_sec );  //start waiting
 | 
				
			||||||
 | 
					            if (status <0) {
 | 
				
			||||||
 | 
					                   LOG_INFORMATION("\n No NFC Tag detected, continue ...\n");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        status = ftm_nq_nfc_close( );                                                   // release the handle to the kernel driver
 | 
				
			||||||
 | 
					        if( 0 != status )
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            LOG_ERROR( "%s: ftm_nq_nfc_close() failed with status = %d \n", __FUNCTION__, status );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } while( FALSE );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										202
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq_test.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										202
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcnq_test.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,202 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2017 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					 * All Rights Reserved.
 | 
				
			||||||
 | 
					 * Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Not a Contribution.
 | 
				
			||||||
 | 
					 * Apache license notifications and license are retained
 | 
				
			||||||
 | 
					 * for attribution purposes only.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright (C) 2015 The Android Open Source Project
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *      http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define ESE_MAGIC 0xEA
 | 
				
			||||||
 | 
					#define ESE_SET_PWR                         _IOW(ESE_MAGIC, 0x01, unsigned int)
 | 
				
			||||||
 | 
					#define ESE_SET_DBG                         _IOW(ESE_MAGIC, 0x02, unsigned int)
 | 
				
			||||||
 | 
					#define ESE_SET_MODE                        _IOW(ESE_MAGIC, 0x03, unsigned int)
 | 
				
			||||||
 | 
					#define NFC_ESE_SET_PWR                     _IOW(0xE9, 0x02, unsigned int)
 | 
				
			||||||
 | 
					#define NFC_ESE_GET_PWR                     _IOR(0xE9, 0x03, unsigned int)
 | 
				
			||||||
 | 
					#define NFC_NTF_TIMEOUT                     20
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Supported Protocols */
 | 
				
			||||||
 | 
					#define NFC_PROTOCOL_UNKNOWN    0x00 /* Unknown */
 | 
				
			||||||
 | 
					#define NFC_PROTOCOL_T1T        0x01 /* Type1Tag    - NFC-A            */
 | 
				
			||||||
 | 
					#define NFC_PROTOCOL_T2T        0x02 /* Type2Tag    - NFC-A            */
 | 
				
			||||||
 | 
					#define NFC_PROTOCOL_T3T        0x03 /* Type3Tag    - NFC-F            */
 | 
				
			||||||
 | 
					#define NFC_PROTOCOL_ISO_DEP    0x04 /* Type 4A,4B  - NFC-A or NFC-B   */
 | 
				
			||||||
 | 
					#define NFC_PROTOCOL_NFC_DEP    0x05 /* NFCDEP/LLCP - NFC-A or NFC-F       */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define MAX_CMD_LEN             255
 | 
				
			||||||
 | 
					#define READ_SAMPLE_SIZE        258
 | 
				
			||||||
 | 
					extern int                      fdNfc;           // a handle to the kernel driver
 | 
				
			||||||
 | 
					extern uint8_t                  nciReplyMessage[ 255 ];
 | 
				
			||||||
 | 
					extern NQ_CHIP_TYPE             whatNQChip;
 | 
				
			||||||
 | 
					extern sem_t                    sRspReady;
 | 
				
			||||||
 | 
					extern int ftm_nfc_nq_vs_nxp( void );
 | 
				
			||||||
 | 
					int ese_dwp_test = 0;
 | 
				
			||||||
 | 
					int ese_spi_test = 0;
 | 
				
			||||||
 | 
					void sendcmds(uint8_t buffer[][255], int no_of_cmds);
 | 
				
			||||||
 | 
					void printTecnologyDetails(char technology, char protocol);
 | 
				
			||||||
 | 
					sem_t               sRfNtf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ese_spi_platform_data
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned int use_pwr_req;
 | 
				
			||||||
 | 
					    unsigned int pwr_req;
 | 
				
			||||||
 | 
					    unsigned int ese_intr;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Enum definition contains RF technology modes supported.
 | 
				
			||||||
 | 
					 * This information is a part of RF_DISCOVER_NTF or RF_INTF_ACTIVATED_NTF.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					typedef enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    NFC_NFCA_Poll                 = 0x00, /* Nfc A Technology in Poll Mode */
 | 
				
			||||||
 | 
					    NFC_NFCB_Poll                 = 0x01, /* Nfc B Technology in Poll Mode */
 | 
				
			||||||
 | 
					    NFC_NFCF_Poll                 = 0x02, /* Nfc F Technology in Poll Mode */
 | 
				
			||||||
 | 
					    NFC_NFCA_Active_Poll          = 0x03, /* Nfc A Technology in Active Poll Mode */
 | 
				
			||||||
 | 
					    NFC_NFCF_Active_Poll          = 0x05, /* Nfc F Technology in Active Poll Mode */
 | 
				
			||||||
 | 
					    NFC_NFCISO15693_Poll          = 0x06, /* Nfc ISO15693 Technology in Poll Mode */
 | 
				
			||||||
 | 
					    NFC_NxpProp_NFCHID_Poll       = 0x70, /* Nfc Hid Technology in Poll Mode */
 | 
				
			||||||
 | 
					    NFC_NxpProp_NFCEPFGEN2_Poll   = 0x71, /* Nfc EpcGen2 Technology in Poll Mode */
 | 
				
			||||||
 | 
					    NFC_NxpProp_NFCKOVIO_Poll     = 0x72, /* Nfc Kovio Technology in Poll Mode */
 | 
				
			||||||
 | 
					    NFC_NFCA_Listen               = 0x80, /* Nfc A Technology in Listen Mode */
 | 
				
			||||||
 | 
					    NFC_NFCB_Listen               = 0x81, /* Nfc B Technology in Listen Mode */
 | 
				
			||||||
 | 
					    NFC_NFCF_Listen               = 0x82, /* Nfc F Technology in Listen Mode */
 | 
				
			||||||
 | 
					    NFC_NFCA_Active_Listen        = 0x83, /* Nfc A Technology in Active Listen Mode */
 | 
				
			||||||
 | 
					    NFC_NFCF_Active_Listen        = 0x85, /* Nfc F Technology in Active Listen Mode */
 | 
				
			||||||
 | 
					    NFC_NFCISO15693_Active_Listen = 0x86  /* Nfc ISO15693 Technology in Listen Mode */
 | 
				
			||||||
 | 
					} NFC_RfTechMode_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint8_t NQ330_cmds[][255] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					{ 0x20,0x00,0x01,0x00 },
 | 
				
			||||||
 | 
					{ 0x20,0x01,0x00},
 | 
				
			||||||
 | 
					{ 0x2F,0x02,0x00 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0x0F },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0xFC },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0xF2 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0xD7 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x07,0x03,0xA0,0x02,0xA0,0x03,0xA0,0x04 },
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x09,0x02,0xA0,0x03,0x01,0x01,0xA0,0x04,0x01,0x06 },
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x0F,0x01,0xA0,0x0E,0x0B,0x11,0x01,0xC2,0xB2,0x00,0xB2,0x1E,0x1F,0x00,0xD0,0x0C },
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x05,0x01,0xA0,0xF2,0x01,0x01 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0xEC },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0xD4 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0x14 },
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x2E,0x0E,0x28,0x01,0x00,0x21,0x01,0x00,0x30,0x01,0x08,0x31,0x01,0x03,0x32,0x01,0x60,0x38,0x01,0x01,0x33,0x04,0x01,0x02,0x03,0x04,0x54,0x01,0x06,0x50,0x01,0x02,0x5B,0x01,0x00,0x80,0x01,0x01,0x81,0x01,0x01,0x82,0x01,0x0E,0x18,0x01,0x01 },
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x05,0x01,0xA0,0x62,0x01,0x01 },
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x06,0x01,0xA0,0xF3,0x02,0x10,0x27 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0x85 },
 | 
				
			||||||
 | 
					{ 0x21,0x01,0x07,0x00,0x01,0x01,0x03,0x00,0x01,0x05 },
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x05,0x01,0xA0,0xF1,0x01,0x00 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0x0F },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0xEB },
 | 
				
			||||||
 | 
					{ 0x20,0x00,0x01,0x00 },
 | 
				
			||||||
 | 
					{ 0x20,0x01,0x00},
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x02,0x01,0x00 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x02,0x01,0x29 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x02,0x01,0x61 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x02,0x01,0x60 },
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x0F,0x01,0xA0,0x0E,0x0B,0x11,0x01,0xC2,0xB2,0x00,0xB2,0x1E,0x1F,0x00,0xD0,0x0C },
 | 
				
			||||||
 | 
					{ 0x21,0x00,0x0D,0x04,0x04,0x03,0x02,0x05,0x03,0x03,0x03,0x02,0x01,0x80,0x01,0x80 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x07,0x03,0xA0,0xEC,0xA0,0xED,0xA0,0xD4 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0xEB },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0xF0 },
 | 
				
			||||||
 | 
					{ 0x22,0x01,0x02,0xC0,0x01 },
 | 
				
			||||||
 | 
					{ 0x22,0x03,0x02,0xC0,0x00 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0x14 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0xEB },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x03,0x01,0xA0,0x07 },
 | 
				
			||||||
 | 
					{ 0x20,0x03,0x02,0x01,0x52 },
 | 
				
			||||||
 | 
					{ 0x2F,0x15,0x01,0x02 },
 | 
				
			||||||
 | 
					{ 0x21,0x03,0x07,0x03,0x80,0x01,0x81,0x01,0x82,0x01 },
 | 
				
			||||||
 | 
					{ 0x21,0x06,0x01,0x00 },
 | 
				
			||||||
 | 
					{ 0x2F,0x15,0x01,0x00 },
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x07,0x02,0x32,0x01,0x60,0x38,0x01,0x01 },
 | 
				
			||||||
 | 
					{ 0x21,0x01,0x1B,0x00,0x05,0x01,0x03,0x00,0x01,0x03,0x01,0x03,0x00,0x41,0x04,0x01,0x03,0x00,0x41,0xA0,0x01,0x03,0x00,0x01,0x05,0x00,0x03,0xC0,0xC3,0x02 },
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x07,0x02,0x32,0x01,0x60,0x38,0x01,0x01},
 | 
				
			||||||
 | 
					{ 0x21,0x03,0x19,0x0C,0x00,0x01,0x01,0x01,0x02,0x01,0x03,0x01,0x05,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83,0x01,0x85,0x01,0x06,0x01,0x70,0x01}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint8_t NQ330_ESE_DWP[][255] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					{ 0x20,0x00,0x01,0x00 },
 | 
				
			||||||
 | 
					{ 0x20,0x01,0x00},
 | 
				
			||||||
 | 
					{ 0x20,0x02,0x05,0x01,0xA0,0xF2,0x01,0x01 },
 | 
				
			||||||
 | 
					{ 0x22,0x00,0x01,0x01 },
 | 
				
			||||||
 | 
					{ 0x22,0x01,0x2,0x01,0x01 },
 | 
				
			||||||
 | 
					{ 0x20,0x04,0x06,0x03,0x01,0x01,0x02,0x01,0x01 },
 | 
				
			||||||
 | 
					{ 0x03,0x00,0x03,0x81,0x02,0x01 },
 | 
				
			||||||
 | 
					{ 0x03,0x00,0x03,0x81,0x02,0x04 },
 | 
				
			||||||
 | 
					{ 0x03,0x00,0x03,0x81,0x02,0x07 },
 | 
				
			||||||
 | 
					{ 0x21,0x01,0x1B,0x00,0x05,0x01,0x03,0x00,0x01,0x03,0x01,0x03,0x00,0x41,0x04,0x01,0x03,0x00,0x41,0xA0,0x01,0x03,0x00,0x01,0x05,0x00,0x03,0xC0,0xC3,0x02 },
 | 
				
			||||||
 | 
					{ 0x21,0x03,0x19,0x0C,0x00,0x01,0x01,0x01,0x02,0x01,0x03,0x01,0x05,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83,0x01,0x85,0x01,0x06,0x01,0x70,0x01},
 | 
				
			||||||
 | 
					{ 0x03,0x00,0x07,0x99,0x50,0x00,0x70,0x00,0x00,0x01},
 | 
				
			||||||
 | 
					{ 0x03,0x00,0x09,0x99,0x50,0x80,0xCA,0x00,0xFE,0x02,0xDF,0x21  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint8_t NQ220_cmds[][255] =
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					 { 0x20,0x00,0x01,0x00 },
 | 
				
			||||||
 | 
					 { 0x20,0x01,0x00 },
 | 
				
			||||||
 | 
					 { 0x2F,0x02,0x00 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0x0F },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x07,0x03,0xA0,0x02,0xA0,0x03,0xA0,0x04 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x05,0x01,0xA0,0x44,0x01,0x00 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x0B,0x02,0xA0,0x66,0x01,0x00,0xA0,0x0E,0x03,0x02,0x09,0x00 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x26,0x09,0xA0,0xEC,0x01,0x01,0xA0,0xED,0x01,0x03,0xA0,0x5E,0x01,0x01,0xA0,0x12,0x01,0x02,0xA0,0x40,0x01,0x01,0xA0,0xDD,0x01,0x2D,0xA0,0xF2,0x01,0x01,0xA0,0x96,0x01,0x01,0xA0,0x9F,0x02,0x08,0x08 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0xEC },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0x14 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x2E,0x0E,0x28,0x01,0x00,0x21,0x01,0x00,0x30,0x01,0x08,0x31,0x01,0x03,0x32,0x01,0x60,0x38,0x01,0x01,0x33,0x04,0x01,0x02,0x03,0x04,0x54,0x01,0x06,0x50,0x01,0x02,0x5B,0x01,0x00,0x80,0x01,0x01,0x81,0x01,0x01,0x82,0x01,0x0E,0x18,0x01,0x01 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x05,0x01,0xA0,0x62,0x01,0x01 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x06,0x01,0xA0,0xF3,0x02,0x10,0x27 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0x85 },
 | 
				
			||||||
 | 
					 { 0x21,0x01,0x07,0x00,0x01,0x01,0x03,0x00,0x01,0x05 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x05,0x01,0xA0,0xF1,0x01,0x00 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x05,0x01,0xA0,0x91,0x01,0x01 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0x0F },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0xEB },
 | 
				
			||||||
 | 
					 { 0x20,0x00,0x01,0x00 },
 | 
				
			||||||
 | 
					 { 0x20,0x01,0x00 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x02,0x01,0x00 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x02,0x01,0x29 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x02,0x01,0x61 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x02,0x01,0x60 },
 | 
				
			||||||
 | 
					 { 0x21,0x00,0x0D,0x04,0x04,0x03,0x02,0x05,0x03,0x03,0x03,0x02,0x01,0x80,0x01,0x80 },
 | 
				
			||||||
 | 
					 { 0x22,0x00,0x01,0x01 },
 | 
				
			||||||
 | 
					 { 0x20,0x04,0x06,0x03,0x01,0x01,0x02,0x01,0x01 },
 | 
				
			||||||
 | 
					 { 0x03,0x00,0x05,0x81,0x01,0x03,0x02,0xC0 },
 | 
				
			||||||
 | 
					 { 0x03,0x00,0x05,0x81,0x01,0x06,0x01,0x00 },
 | 
				
			||||||
 | 
					 { 0x03,0x00,0x03,0x81,0x02,0x01 },
 | 
				
			||||||
 | 
					 { 0x03,0x00,0x03,0x81,0x02,0x04 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x05,0x02,0xA0,0xEC,0xA0,0xED },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0xEB },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0xF0 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x05,0x02,0xA0,0xEC,0xA0,0xED },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0x14 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0xEB },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x03,0x01,0xA0,0x07 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x05,0x01,0xA0,0x07,0x01,0x03 },
 | 
				
			||||||
 | 
					 { 0x20,0x03,0x02,0x01,0x52 },
 | 
				
			||||||
 | 
					 { 0x21,0x01,0x16,0x00,0x04,0x01,0x03,0x00,0x01,0x03,0x01,0x03,0x00,0x41,0x04,0x01,0x03,0x00,0x41,0xA0,0x01,0x03,0x00,0x01,0x05 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x0A,0x03,0x32,0x01,0x20,0x38,0x01,0x01,0x50,0x01,0x00 },
 | 
				
			||||||
 | 
					 { 0x21,0x03,0x07,0x03,0x80,0x01,0x81,0x01,0x82,0x01 },
 | 
				
			||||||
 | 
					 { 0x21,0x06,0x01,0x00 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x17,0x01,0x61,0x14,0x46,0x66,0x6D,0x01,0x01,0x12,0x02,0x02,0x07,0xFF,0x03,0x02,0x00,0x13,0x04,0x01,0x64,0x07,0x01,0x03 },
 | 
				
			||||||
 | 
					 { 0x20,0x02,0x0A,0x03,0x32,0x01,0x60,0x38,0x01,0x01,0x50,0x01,0x02 },
 | 
				
			||||||
 | 
					 { 0x21,0x03,0x19,0x0C,0x00,0x01,0x01,0x01,0x02,0x01,0x03,0x01,0x05,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83,0x01,0x85,0x01,0x06,0x01,0x70,0x01 }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										724
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcqti.c
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										724
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcqti.c
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,724 @@
 | 
				
			|||||||
 | 
					/*=========================================================================
 | 
				
			||||||
 | 
					                        NFC FTM Source File
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   This file contains the routines to communicate with the NFCC in FTM mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2015 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					All Rights Reserved.
 | 
				
			||||||
 | 
					Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					when        who              what,              where,     why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					/*==========================================================================*
 | 
				
			||||||
 | 
					*                             INCLUDE FILES                                *
 | 
				
			||||||
 | 
					*==========================================================================*/
 | 
				
			||||||
 | 
					#include "ftm_nfcqti.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define UNUSED(x) (void)(x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*=========================================================================*
 | 
				
			||||||
 | 
					*                            file scope local defnitions                   *
 | 
				
			||||||
 | 
					*==========================================================================*/
 | 
				
			||||||
 | 
					const hw_module_t* hw_module = NULL;
 | 
				
			||||||
 | 
					nfc_nci_device_t* dev = NULL;
 | 
				
			||||||
 | 
					uint8 hal_state = NCI_HAL_INIT, nfc_ftmthread = FALSE;
 | 
				
			||||||
 | 
					uint8 *nfc_cmd_buff = NULL, len = 0;
 | 
				
			||||||
 | 
					uint16 res_len = 0, async_msg_cnt = 0;
 | 
				
			||||||
 | 
					uint8  *response_buff = NULL;
 | 
				
			||||||
 | 
					static uint8 hal_opened = FALSE, wait_rsp = FALSE;
 | 
				
			||||||
 | 
					static uint8 async_msg_available = FALSE, ftm_data_rsp_pending = FALSE;
 | 
				
			||||||
 | 
					asyncdata *buff = NULL;
 | 
				
			||||||
 | 
					asyncdata *start = NULL;
 | 
				
			||||||
 | 
					/*I2C read/write*/
 | 
				
			||||||
 | 
					static uint8 i2c_cmd_cnt = 0;
 | 
				
			||||||
 | 
					uint8 i2c_status=0,i2c_req_write = FALSE, i2c_req_read = FALSE;
 | 
				
			||||||
 | 
					uint8 i2c_num_of_reg_to_read = 0, i2c_reg_read_data[40]={0}, ii = 0;
 | 
				
			||||||
 | 
					pthread_mutex_t nfcftm_mutex = PTHREAD_MUTEX_INITIALIZER;
 | 
				
			||||||
 | 
					/*===================================================================================*
 | 
				
			||||||
 | 
					*                             Function Defnitions                                    *
 | 
				
			||||||
 | 
					*===================================================================================*/
 | 
				
			||||||
 | 
					/*====================================================================================
 | 
				
			||||||
 | 
					FUNCTION   nfc_ftm_hal_cback
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  This is the call back function which will indicate if the nfc hal open is successful
 | 
				
			||||||
 | 
					  or failed.
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					none
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					=====================================================================================*/
 | 
				
			||||||
 | 
					static void nfc_ftm_cback(uint8 event, uint8 status)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    switch(event)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case HAL_NFC_OPEN_CPLT_EVT:
 | 
				
			||||||
 | 
					             if(status == HAL_NFC_STATUS_OK)
 | 
				
			||||||
 | 
					             {
 | 
				
			||||||
 | 
					                 /* Release semaphore to indicate that hal open is done
 | 
				
			||||||
 | 
					                 and change the state to write.*/
 | 
				
			||||||
 | 
					                 hal_state = NCI_HAL_WRITE;
 | 
				
			||||||
 | 
					                 hal_opened = TRUE;
 | 
				
			||||||
 | 
					                 printf("HAL Open Success..state changed to Write  \n");
 | 
				
			||||||
 | 
					             }
 | 
				
			||||||
 | 
					             else
 | 
				
			||||||
 | 
					             {
 | 
				
			||||||
 | 
					                 printf("HAL Open Failed \n");
 | 
				
			||||||
 | 
					                 hal_state = NCI_HAL_ERROR;
 | 
				
			||||||
 | 
					                 hal_opened = FALSE;
 | 
				
			||||||
 | 
					             }
 | 
				
			||||||
 | 
					             sem_post(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					        case HAL_NFC_CLOSE_CPLT_EVT:
 | 
				
			||||||
 | 
					             printf("HAL_NFC_CLOSE_CPLT_EVT recieved..\n");
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					             printf ("nfc_ftm_hal_cback unhandled event %x \n", event);
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*==========================================================================================
 | 
				
			||||||
 | 
					FUNCTION   fill_async_data
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					This function will store all the incoming async msgs( like ntfs and data from QCA1990)
 | 
				
			||||||
 | 
					in to a list to be committed further.
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					==============================================================================================*/
 | 
				
			||||||
 | 
					void fill_async_data(uint16 data_len, uint8 *p_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16 i = 0;
 | 
				
			||||||
 | 
					    asyncdata *next_node = NULL;
 | 
				
			||||||
 | 
					    printf("fill_async_data() function \n");
 | 
				
			||||||
 | 
					    /* Initialize a list which will store all async message untill they are sent*/
 | 
				
			||||||
 | 
					    if(buff == NULL)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /* first node creation*/
 | 
				
			||||||
 | 
					        buff = (asyncdata*)malloc(sizeof(asyncdata));
 | 
				
			||||||
 | 
					        if(buff)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            start = buff;
 | 
				
			||||||
 | 
					            buff->response_buff = (uint8*)malloc(data_len);
 | 
				
			||||||
 | 
					            if(buff->response_buff)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                memcpy(buff->response_buff, p_data, data_len);
 | 
				
			||||||
 | 
					                buff->async_datalen = data_len;
 | 
				
			||||||
 | 
					                buff->next = NULL;
 | 
				
			||||||
 | 
					                async_msg_cnt = 0;
 | 
				
			||||||
 | 
					                async_msg_cnt++;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					              printf("mem allocation failed while storing asysnc msg \n");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            printf("mem allocation failed while trying to make the async list \n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /* this is the case when some data is already present in the list which has not been sent yet*/
 | 
				
			||||||
 | 
					        next_node = (asyncdata*)malloc(sizeof(asyncdata));
 | 
				
			||||||
 | 
					        if(next_node)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            next_node->response_buff = (uint8*)malloc(data_len);
 | 
				
			||||||
 | 
					            if(next_node->response_buff)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                memcpy(next_node->response_buff, p_data,data_len);
 | 
				
			||||||
 | 
					                next_node->async_datalen = data_len;
 | 
				
			||||||
 | 
					                next_node->next = NULL;
 | 
				
			||||||
 | 
					                async_msg_cnt++;
 | 
				
			||||||
 | 
					                while(buff->next != NULL)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                   buff = buff->next;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                buff->next = next_node;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                printf("mem allocation failed while storing asysnc msg \n");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					           printf("mem allocation failed while trying to make the async list \n");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*======================================================================================================
 | 
				
			||||||
 | 
					FUNCTION   nfc_ftm_data_cback
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  This is the call back function which will provide back incoming data from the QCA1990
 | 
				
			||||||
 | 
					  to nfc ftm.
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					========================================================================================================*/
 | 
				
			||||||
 | 
					static void nfc_ftm_data_cback(uint16 data_len, uint8 *p_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8 i = 0;
 | 
				
			||||||
 | 
					    if(hal_opened == FALSE)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /* Reject data call backs untill HAL in initialized */
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if((data_len == 0x00) || (p_data == NULL))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf("Error case : wrong data lentgh or buffer revcieved \n");
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if((i2c_req_write == TRUE) || (i2c_req_read == TRUE))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if(i2c_req_write)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            /*check the incoming status*/
 | 
				
			||||||
 | 
					            if(p_data[0] != 0x00) /* 0x00 = Command executed successfully*/
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                /* some error has occured in I2C write.Send the status code back now to pc app*/
 | 
				
			||||||
 | 
					                i2c_status = p_data[0];
 | 
				
			||||||
 | 
					                printf("Error occured in I2C write .. reporting to application..Error Code = %X \n", i2c_status);
 | 
				
			||||||
 | 
					                hal_state = NCI_HAL_READ;
 | 
				
			||||||
 | 
					                sem_post(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                /*status is fine. Complete further requests as ftmdaemon is writing one by one*/
 | 
				
			||||||
 | 
					                if(len)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    /*send further addr and value pair*/
 | 
				
			||||||
 | 
					                    printf("I2C write status correct..sending next..\n");
 | 
				
			||||||
 | 
					                    hal_state = NCI_HAL_WRITE;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    /*All I2C write completed .Send final status to app*/
 | 
				
			||||||
 | 
					                     i2c_status = p_data[0];
 | 
				
			||||||
 | 
					                     printf(" All I2C write completed i2c_status = %X \n", i2c_status);
 | 
				
			||||||
 | 
					                     hal_state = NCI_HAL_READ;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                sem_post(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            /*I2C read rsp arrived . fill it in buffer if correct or report error if wrong*/
 | 
				
			||||||
 | 
					            if(p_data[0] != 0x00)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                /* some error has occured in I2C read.Send the status code to app*/
 | 
				
			||||||
 | 
					                i2c_status = p_data[0];
 | 
				
			||||||
 | 
					                printf("Error occured in I2C read .. reporting to application..Error Code = %X \n", i2c_status);
 | 
				
			||||||
 | 
					                hal_state = NCI_HAL_READ;
 | 
				
			||||||
 | 
					                memset(nfc_cmd_buff, 0, len);
 | 
				
			||||||
 | 
					                sem_post(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if(len)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    /*send further addr to read*/
 | 
				
			||||||
 | 
					                    i2c_status = p_data[0];
 | 
				
			||||||
 | 
					                    i2c_reg_read_data[ii++] = p_data[1];
 | 
				
			||||||
 | 
					                    hal_state = NCI_HAL_WRITE;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    /*All I2C read completed .Send the read data back to pc app*/
 | 
				
			||||||
 | 
					                    i2c_status = p_data[0];
 | 
				
			||||||
 | 
					                    i2c_reg_read_data[ii++] = p_data[1];
 | 
				
			||||||
 | 
					                    hal_state = NCI_HAL_READ;
 | 
				
			||||||
 | 
					                    ii = 0;
 | 
				
			||||||
 | 
					                 }
 | 
				
			||||||
 | 
					                 sem_post(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					             }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if(((p_data[0] & 0xF0) == 0x60 /*ntf packets*/) || ((p_data[0] & 0xF0) == 0x00)/*data packet rsps*/)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            async_msg_available = TRUE;
 | 
				
			||||||
 | 
					            pthread_mutex_lock(&nfcftm_mutex);
 | 
				
			||||||
 | 
					            fill_async_data(data_len, p_data);
 | 
				
			||||||
 | 
					            pthread_mutex_unlock(&nfcftm_mutex);
 | 
				
			||||||
 | 
					            if(ftm_data_rsp_pending == TRUE)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                printf("Sending data rsp \n");
 | 
				
			||||||
 | 
					                hal_state = NCI_HAL_READ;
 | 
				
			||||||
 | 
					                sem_post(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					                ftm_data_rsp_pending = FALSE;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if((wait_rsp == FALSE) || ((p_data[0] == 0x60) && (p_data[1] == 0x00)))
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    /*This is the case when ntf receieved after rsp is logged to pc app*/
 | 
				
			||||||
 | 
					                    printf("Sending async msg to logging subsystem \n");
 | 
				
			||||||
 | 
					                    hal_state = NCI_HAL_ASYNC_LOG;
 | 
				
			||||||
 | 
					                    sem_post(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if(response_buff || res_len)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                printf("nfc_ftm_data_cback : response_buff = %p, res_len = %d", response_buff, res_len);
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            response_buff = (uint8*)malloc(data_len);
 | 
				
			||||||
 | 
					            if(response_buff)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                memcpy(response_buff, p_data, data_len);
 | 
				
			||||||
 | 
					                res_len = data_len;
 | 
				
			||||||
 | 
					                printf("nfc_ftm_data_cback: res_len=%d data_len=%d  response_buff= %X %X %X %X %X %X  \n", res_len,data_len, \
 | 
				
			||||||
 | 
					                         response_buff[0],response_buff[1],response_buff[2],response_buff[3],response_buff[4],response_buff[5]);
 | 
				
			||||||
 | 
					                hal_state = NCI_HAL_READ;
 | 
				
			||||||
 | 
					                sem_post(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                printf("Mem allocation failed in nfc_ftm_data_cback \n");
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nfc_hal_open
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					   This function will open the nfc hal for ftm nfc command processing.
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					  NIL
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  void
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  NONE
 | 
				
			||||||
 | 
					===============================================================================*/
 | 
				
			||||||
 | 
					uint8 ftm_nfc_hal_open(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8 ret = 0;
 | 
				
			||||||
 | 
					    ret = hw_get_module(NFC_NCI_HARDWARE_MODULE, &hw_module);
 | 
				
			||||||
 | 
					    if(ret == 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        dev = (nfc_nci_device_t*)malloc(sizeof(nfc_nci_device_t));
 | 
				
			||||||
 | 
					        if(!dev)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            printf("NFC FTM : mem allocation failed \n");
 | 
				
			||||||
 | 
					            return FALSE;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            ret = nfc_nci_open (hw_module, &dev);
 | 
				
			||||||
 | 
					            if(ret != 0)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                printf("NFC FTM : nfc_nci_open fail \n");
 | 
				
			||||||
 | 
					                free(dev);
 | 
				
			||||||
 | 
					                return FALSE;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                printf("NFC FTM : opening NCI HAL \n");
 | 
				
			||||||
 | 
					                dev->common.reserved[0] = FTM_MODE;
 | 
				
			||||||
 | 
					                dev->open (dev, nfc_ftm_cback, nfc_ftm_data_cback);
 | 
				
			||||||
 | 
					                sem_wait(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					       printf("NFC FTM : hw_get_module() call failed \n");
 | 
				
			||||||
 | 
					       return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*=================================================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nfc_log_send_msg
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					This function will log the asynchronous messages(NTFs and data packets) to the logging subsystem
 | 
				
			||||||
 | 
					 of DIAG.
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					TRUE if data logged successfully and FALSE if failed.
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					==================================================================================================*/
 | 
				
			||||||
 | 
					int ftm_nfc_log_send_msg(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint16 i = 0;
 | 
				
			||||||
 | 
					    ftm_nfc_log_pkt_type* ftm_nfc_log_pkt_ptr = NULL;
 | 
				
			||||||
 | 
					    asyncdata* node = NULL;
 | 
				
			||||||
 | 
					    uint8 arr[1]= {'\n'};
 | 
				
			||||||
 | 
					    if(log_status(LOG_NFC_FTM))
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        buff = start;
 | 
				
			||||||
 | 
					        if(buff != NULL)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            do{
 | 
				
			||||||
 | 
					                  printf("buff->async_datalen : %d \n", buff->async_datalen);
 | 
				
			||||||
 | 
					                  ftm_nfc_log_pkt_ptr = (ftm_nfc_log_pkt_type *)log_alloc(LOG_NFC_FTM, (FTM_NFC_LOG_HEADER_SIZE + (buff->async_datalen)));
 | 
				
			||||||
 | 
					                  if(ftm_nfc_log_pkt_ptr)
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                      memcpy((void *)ftm_nfc_log_pkt_ptr->data, (void *)buff->response_buff, buff->async_datalen);
 | 
				
			||||||
 | 
					                      printf("Async msg is = ");
 | 
				
			||||||
 | 
					                      for(i=0; i<buff->async_datalen; i++)
 | 
				
			||||||
 | 
					                      {
 | 
				
			||||||
 | 
					                          printf("%X ", ftm_nfc_log_pkt_ptr->data[i]);
 | 
				
			||||||
 | 
					                      }
 | 
				
			||||||
 | 
					                      printf("%c",arr[0]);
 | 
				
			||||||
 | 
					                      node = buff;
 | 
				
			||||||
 | 
					                      buff = buff->next;
 | 
				
			||||||
 | 
					                      free(node);
 | 
				
			||||||
 | 
					                      printf("Commiting the log message(async msg) \n");
 | 
				
			||||||
 | 
					                      log_commit(ftm_nfc_log_pkt_ptr);
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                  else
 | 
				
			||||||
 | 
					                  {
 | 
				
			||||||
 | 
					                      printf("\nmem alloc failed in log_alloc \n");
 | 
				
			||||||
 | 
					                      return FALSE;
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					              }while(buff != NULL);
 | 
				
			||||||
 | 
					              printf("all msgs committed \n");
 | 
				
			||||||
 | 
					              async_msg_available = FALSE;
 | 
				
			||||||
 | 
					              return TRUE;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					              printf("No async message left to be logged \n");
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					     else
 | 
				
			||||||
 | 
					     {
 | 
				
			||||||
 | 
					         printf("LOG_NFC_FTM code is not enabled in logging subsystem \n");
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					     return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   nfc_ftm_readerthread
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					  Thread Routine to perfom asynchrounous handling of events coming from
 | 
				
			||||||
 | 
					  NFCC. It will perform read and write for all type of commands/data.
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN NIL
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void* nfc_ftm_thread(void *ptr)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    uint8 i2c_buff[3] = {0};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    UNUSED(ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while(1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					       printf("Waiting for Cmd/Rsp \n");
 | 
				
			||||||
 | 
					       sem_wait (&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					       switch(hal_state)
 | 
				
			||||||
 | 
					       {
 | 
				
			||||||
 | 
					           case NCI_HAL_INIT:
 | 
				
			||||||
 | 
					                printf("NFC FTM : HAL Open request recieved..\n");
 | 
				
			||||||
 | 
					                if(ftm_nfc_hal_open() == FALSE)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    hal_state = NCI_HAL_ERROR;
 | 
				
			||||||
 | 
					                    hal_opened = FALSE;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					           case NCI_HAL_ERROR:
 | 
				
			||||||
 | 
					                /* HAL open failed.Post sem and handle error case*/
 | 
				
			||||||
 | 
					                sem_post(&semaphore_nfcftmcmd_complete);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					           case NCI_HAL_WRITE:
 | 
				
			||||||
 | 
					                if(dev != NULL)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    printf("NFC FTM : Cmd recieved for nfc ftm..sending.\n");
 | 
				
			||||||
 | 
					                    if((!i2c_req_write) && (!i2c_req_read))
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        /* send data to the NFCC*/
 | 
				
			||||||
 | 
					                        if(nfc_cmd_buff[0] == 0x00 /*data req*/)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            printf("Data send request arrived \n");
 | 
				
			||||||
 | 
					                            ftm_data_rsp_pending = TRUE;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            printf("cmd request arrived \n");
 | 
				
			||||||
 | 
					                            wait_rsp = TRUE;
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        dev->write(dev, len, nfc_cmd_buff);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        if(i2c_req_write)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            i2c_buff[0] = 0xFF;
 | 
				
			||||||
 | 
					                            i2c_buff[1] = nfc_cmd_buff[i2c_cmd_cnt++]; /* addr*/
 | 
				
			||||||
 | 
					                            i2c_buff[2] = nfc_cmd_buff[i2c_cmd_cnt++]; /*value*/
 | 
				
			||||||
 | 
					                            len -=2;
 | 
				
			||||||
 | 
					                            dev->write(dev, 3, i2c_buff);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        else
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            /* I2c Read req*/
 | 
				
			||||||
 | 
					                            i2c_buff[0] = 0xFF;
 | 
				
			||||||
 | 
					                            i2c_buff[1] = nfc_cmd_buff[i2c_cmd_cnt++]; /* I2C addr to read*/
 | 
				
			||||||
 | 
					                            i2c_reg_read_data[ii++] = i2c_buff[1]; /* store address to send in response.*/
 | 
				
			||||||
 | 
					                            len -= 1;
 | 
				
			||||||
 | 
					                            dev->write(dev, 2, i2c_buff);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    printf("dev is null \n");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					           case NCI_HAL_READ:
 | 
				
			||||||
 | 
					                /* indicate to ftm that response is avilable now*/
 | 
				
			||||||
 | 
					                sem_post(&semaphore_nfcftmcmd_complete);
 | 
				
			||||||
 | 
					                 printf("NFC FTM : State changed to READ  i2c_req_read: %d\n",i2c_req_read);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					           case NCI_HAL_ASYNC_LOG:
 | 
				
			||||||
 | 
					                /* indicate to ftm that response is avilable now*/
 | 
				
			||||||
 | 
					                printf("NFC FTM : State changed to NCI_HAL_ASYNC_LOG.Logging aysnc message \n");
 | 
				
			||||||
 | 
					                pthread_mutex_lock(&nfcftm_mutex);
 | 
				
			||||||
 | 
					                if(ftm_nfc_log_send_msg())
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    printf("async msgs commited to the log system..changing HAL state to write \n");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                   printf("async msgs commit failed..changing HAL state to write \n");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                hal_state = NCI_HAL_WRITE;
 | 
				
			||||||
 | 
					                pthread_mutex_unlock(&nfcftm_mutex);
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					           default:
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					FUNCTION   ftm_nfc_dispatch
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					This is the function which will be called by the NFC FTM layer callback function
 | 
				
			||||||
 | 
					registered with the DIAG service./
 | 
				
			||||||
 | 
					DEPENDENCIES
 | 
				
			||||||
 | 
					RETURN VALUE
 | 
				
			||||||
 | 
					  RETURN rsp pointer(containing the NFCC rsp packets) to the callback function
 | 
				
			||||||
 | 
					  (subsequently for DIAG service)
 | 
				
			||||||
 | 
					SIDE EFFECTS
 | 
				
			||||||
 | 
					  None
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					void* ftm_nfc_dispatch_qti(ftm_nfc_pkt_type *nfc_ftm_pkt, uint16 pkt_len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ftm_nfc_i2c_write_rsp_pkt_type *i2c_write_rsp = NULL;
 | 
				
			||||||
 | 
					    ftm_nfc_i2c_read_rsp_pkt_type *i2c_read_rsp = NULL;
 | 
				
			||||||
 | 
					    ftm_nfc_pkt_type *rsp = NULL;
 | 
				
			||||||
 | 
					    ftm_nfc_data_rsp_pkt_type *nfc_data_rsp = NULL;
 | 
				
			||||||
 | 
					    struct timespec time_sec;
 | 
				
			||||||
 | 
					    int sem_status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    UNUSED(pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    printf("NFC FTM : nfc ftm mode requested \n");
 | 
				
			||||||
 | 
					    if(nfc_ftm_pkt == NULL)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf("Error : NULL packet recieved from DIAG \n");
 | 
				
			||||||
 | 
					        goto error_case;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* Start nfc_ftm_thread which will process all requests as per
 | 
				
			||||||
 | 
					       state machine flow. By Default First state will be NCI_HAL_INIT*/
 | 
				
			||||||
 | 
					    if(!nfc_ftmthread)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if(sem_init(&semaphore_halcmd_complete, 0, 1) != 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            printf("NFC FTM :semaphore_halcmd_complete creation failed \n");
 | 
				
			||||||
 | 
					            goto error_case;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if(sem_init(&semaphore_nfcftmcmd_complete, 0, 0) != 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            printf("NFC FTM :semaphore_nfcftmcmd_complete creation failed \n");
 | 
				
			||||||
 | 
					            goto error_case;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        printf("NFC FTM : nfc ftm thread is being started \n");
 | 
				
			||||||
 | 
					        pthread_create(&nfc_thread_handle, NULL, nfc_ftm_thread, NULL);
 | 
				
			||||||
 | 
					        nfc_ftmthread = TRUE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /* parse the diag packet to identify the NFC FTM command which needs to be sent
 | 
				
			||||||
 | 
					       to QCA 1990*/
 | 
				
			||||||
 | 
					    if(nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_len > 2)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        len = nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_len-2;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /*Wrong nfc ftm packet*/
 | 
				
			||||||
 | 
					        goto error_case;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    switch(nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case FTM_NFC_I2C_SLAVE_WRITE:
 | 
				
			||||||
 | 
					             i2c_req_write = TRUE;
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					        case FTM_NFC_I2C_SLAVE_READ:
 | 
				
			||||||
 | 
					             i2c_num_of_reg_to_read = len;
 | 
				
			||||||
 | 
					             i2c_req_read = TRUE;
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					        case FTM_NFC_NFCC_COMMAND:
 | 
				
			||||||
 | 
					        case FTM_NFC_SEND_DATA:
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					        default :
 | 
				
			||||||
 | 
					             goto error_case;
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*copy command to send it further to QCA1990*/
 | 
				
			||||||
 | 
					    nfc_cmd_buff = (uint8 *)malloc(len+1);
 | 
				
			||||||
 | 
					    if(nfc_cmd_buff)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        memcpy(nfc_cmd_buff, nfc_ftm_pkt->nci_data, len);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf("Mem allocation failed for cmd storage");
 | 
				
			||||||
 | 
					        goto error_case;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /*send the command */
 | 
				
			||||||
 | 
					    sem_post(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					    printf("\nwaiting for nfc ftm response \n");
 | 
				
			||||||
 | 
					    if (clock_gettime(CLOCK_REALTIME, &time_sec) == -1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf("get clock_gettime error");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    time_sec.tv_sec += FTM_NFC_CMD_CMPL_TIMEOUT;
 | 
				
			||||||
 | 
					    sem_status = sem_timedwait(&semaphore_nfcftmcmd_complete,&time_sec);
 | 
				
			||||||
 | 
					    if(sem_status == -1)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf("nfc ftm command timed out\n");
 | 
				
			||||||
 | 
					        goto error_case;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if(!hal_opened)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /*Hal open is failed */
 | 
				
			||||||
 | 
					        free(nfc_cmd_buff);
 | 
				
			||||||
 | 
					        hal_state = NCI_HAL_INIT;
 | 
				
			||||||
 | 
					        goto error_case;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    printf("\n\n *****Framing the response to send back to Diag service******** \n\n");
 | 
				
			||||||
 | 
					    /* Frame the response as per the cmd request*/
 | 
				
			||||||
 | 
					    switch(nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        case FTM_NFC_I2C_SLAVE_WRITE:
 | 
				
			||||||
 | 
					             printf("Framing the response for FTM_NFC_I2C_SLAVE_WRITE cmd \n");
 | 
				
			||||||
 | 
					             i2c_write_rsp = (ftm_nfc_i2c_write_rsp_pkt_type*)diagpkt_subsys_alloc(DIAG_SUBSYS_FTM,
 | 
				
			||||||
 | 
					                                                                                   FTM_NFC_CMD_CODE,
 | 
				
			||||||
 | 
					                                                                                   sizeof(ftm_nfc_i2c_write_rsp_pkt_type));
 | 
				
			||||||
 | 
					             if(i2c_write_rsp)
 | 
				
			||||||
 | 
					             {
 | 
				
			||||||
 | 
					                 i2c_write_rsp->nfc_i2c_slave_status = i2c_status;
 | 
				
			||||||
 | 
					                 i2c_status = 0;
 | 
				
			||||||
 | 
					                 i2c_cmd_cnt = 0;
 | 
				
			||||||
 | 
					                 i2c_req_write = FALSE;
 | 
				
			||||||
 | 
					             }
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					       case  FTM_NFC_I2C_SLAVE_READ:
 | 
				
			||||||
 | 
					             printf("Framing the response for FTM_NFC_I2C_SLAVE_READ cmd \n");
 | 
				
			||||||
 | 
					             i2c_read_rsp = (ftm_nfc_i2c_read_rsp_pkt_type*)diagpkt_subsys_alloc(DIAG_SUBSYS_FTM,
 | 
				
			||||||
 | 
					                                                                                 FTM_NFC_CMD_CODE,
 | 
				
			||||||
 | 
					                                                                                 sizeof(ftm_nfc_i2c_read_rsp_pkt_type));
 | 
				
			||||||
 | 
					             if(i2c_read_rsp)
 | 
				
			||||||
 | 
					             {
 | 
				
			||||||
 | 
					                 i2c_read_rsp->ftm_nfc_hdr.nfc_cmd_id = FTM_NFC_I2C_SLAVE_READ;
 | 
				
			||||||
 | 
					                 i2c_read_rsp->ftm_nfc_hdr.nfc_cmd_len = 2+(2*i2c_num_of_reg_to_read);
 | 
				
			||||||
 | 
					                 i2c_read_rsp->nfc_i2c_slave_status = i2c_status;
 | 
				
			||||||
 | 
					                 if(i2c_status == 0x00)
 | 
				
			||||||
 | 
					                 {
 | 
				
			||||||
 | 
					                     i2c_read_rsp->nfc_nb_reg_reads = i2c_num_of_reg_to_read;
 | 
				
			||||||
 | 
					                 }
 | 
				
			||||||
 | 
					                 else
 | 
				
			||||||
 | 
					                 {
 | 
				
			||||||
 | 
					                     i2c_read_rsp->nfc_nb_reg_reads = 0x00; // error case so return num of read as 0x00.
 | 
				
			||||||
 | 
					                 }
 | 
				
			||||||
 | 
					                 memcpy(i2c_read_rsp->i2c_reg_read_rsp, i2c_reg_read_data, (i2c_num_of_reg_to_read*2));
 | 
				
			||||||
 | 
					                 i2c_cmd_cnt = 0;
 | 
				
			||||||
 | 
					             }
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					        case FTM_NFC_NFCC_COMMAND:
 | 
				
			||||||
 | 
					             printf("Framing the response for FTM_NFC_NFCC_COMMAND cmd \n");
 | 
				
			||||||
 | 
					             if(response_buff && res_len)
 | 
				
			||||||
 | 
					             {
 | 
				
			||||||
 | 
					                 rsp = (ftm_nfc_pkt_type*)diagpkt_subsys_alloc(DIAG_SUBSYS_FTM,
 | 
				
			||||||
 | 
					                                                               FTM_NFC_CMD_CODE,
 | 
				
			||||||
 | 
					                                                               sizeof(ftm_nfc_pkt_type));
 | 
				
			||||||
 | 
					                 if(rsp)
 | 
				
			||||||
 | 
					                 {
 | 
				
			||||||
 | 
					                     rsp->ftm_nfc_hdr.nfc_cmd_id = FTM_NFC_NFCC_COMMAND;
 | 
				
			||||||
 | 
					                     rsp->ftm_nfc_hdr.nfc_cmd_len = 2+res_len;
 | 
				
			||||||
 | 
					                     rsp->nfc_nci_pkt_len = res_len;
 | 
				
			||||||
 | 
					                     memcpy(rsp->nci_data, response_buff, res_len);
 | 
				
			||||||
 | 
					                     free(response_buff);
 | 
				
			||||||
 | 
					                     response_buff = 0;
 | 
				
			||||||
 | 
					                     res_len = 0;
 | 
				
			||||||
 | 
					                 }
 | 
				
			||||||
 | 
					             }
 | 
				
			||||||
 | 
					             else
 | 
				
			||||||
 | 
					                 printf("ftm_nfc_dispatch : response_buff = %p, res_len = %d", response_buff, res_len);
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					        case FTM_NFC_SEND_DATA:
 | 
				
			||||||
 | 
					             printf("Framing the response for FTM_NFC_SEND_DATA cmd \n");
 | 
				
			||||||
 | 
					             nfc_data_rsp = (ftm_nfc_data_rsp_pkt_type*)diagpkt_subsys_alloc(DIAG_SUBSYS_FTM,
 | 
				
			||||||
 | 
					                                                                             FTM_NFC_CMD_CODE,
 | 
				
			||||||
 | 
					                                                                             sizeof(ftm_nfc_data_rsp_pkt_type));
 | 
				
			||||||
 | 
					             if(nfc_data_rsp)
 | 
				
			||||||
 | 
					             {
 | 
				
			||||||
 | 
					                 nfc_data_rsp->ftm_nfc_hdr.nfc_cmd_id = FTM_NFC_SEND_DATA;
 | 
				
			||||||
 | 
					                 nfc_data_rsp->ftm_nfc_hdr.nfc_cmd_len = 0;/*Rsp as per the NFC FTM data rsp req*/
 | 
				
			||||||
 | 
					             }
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					        default:
 | 
				
			||||||
 | 
					             goto error_case;
 | 
				
			||||||
 | 
					             break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    free(nfc_cmd_buff);
 | 
				
			||||||
 | 
					    hal_state = NCI_HAL_WRITE;
 | 
				
			||||||
 | 
					    if(async_msg_available)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        printf(" Some async message available.. committing now.\n");
 | 
				
			||||||
 | 
					        hal_state = NCI_HAL_ASYNC_LOG;
 | 
				
			||||||
 | 
					        sem_post(&semaphore_halcmd_complete);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    wait_rsp = FALSE;
 | 
				
			||||||
 | 
					    if(nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id == FTM_NFC_I2C_SLAVE_WRITE)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return(void*)i2c_write_rsp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if(nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id == FTM_NFC_I2C_SLAVE_READ)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        i2c_req_read = FALSE;
 | 
				
			||||||
 | 
					        return(void*)i2c_read_rsp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if(nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id == FTM_NFC_NFCC_COMMAND)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return(void*)rsp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return(void*)nfc_data_rsp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					error_case:
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										141
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcqti.h
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										141
									
								
								feeds/ipq95xx/ftm/src/ftm_nfcqti.h
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,141 @@
 | 
				
			|||||||
 | 
					#ifndef FTM_NFCQTI_H_
 | 
				
			||||||
 | 
					#define FTM_NFCQTI_H_
 | 
				
			||||||
 | 
					/*==========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                     nfc FTM header File
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Description
 | 
				
			||||||
 | 
					   This file contains the decalarations used by ftm_nfc.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2015 Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					All Rights Reserved.
 | 
				
			||||||
 | 
					Confidential and Proprietary - Qualcomm Technologies, Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*===========================================================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                         Edit History
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when        who              what,              where,     why
 | 
				
			||||||
 | 
					--------   ---     ----------------------------------------------------------
 | 
				
			||||||
 | 
					08/06/13                     NFC FTM layer
 | 
				
			||||||
 | 
					===========================================================================*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_FTM_NFC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "stdio.h"
 | 
				
			||||||
 | 
					#include <pthread.h>
 | 
				
			||||||
 | 
					#include <semaphore.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <hardware/nfc.h>
 | 
				
			||||||
 | 
					#include <hardware/hardware.h>
 | 
				
			||||||
 | 
					#include <malloc.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include "msg.h"
 | 
				
			||||||
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "diag_lsm.h"
 | 
				
			||||||
 | 
					#include "diagpkt.h"
 | 
				
			||||||
 | 
					#include "diagcmd.h"
 | 
				
			||||||
 | 
					#include "diag.h"
 | 
				
			||||||
 | 
					#include "termios.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*==========================================================================*
 | 
				
			||||||
 | 
					*                             Defnitions                                  *
 | 
				
			||||||
 | 
					*==========================================================================*/
 | 
				
			||||||
 | 
					#define FTM_MODE 1
 | 
				
			||||||
 | 
					#define TRUE                      1
 | 
				
			||||||
 | 
					#define FALSE                     0
 | 
				
			||||||
 | 
					#define FTM_MODE                  1
 | 
				
			||||||
 | 
					#define FTM_NFC_CMD_CODE          55
 | 
				
			||||||
 | 
					#define LOG_NFC_FTM               0x1802
 | 
				
			||||||
 | 
					#define FTM_NFC_LOG_HEADER_SIZE   12
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_NFC_I2C_SLAVE_WRITE   0x00
 | 
				
			||||||
 | 
					#define FTM_NFC_I2C_SLAVE_READ    0x01
 | 
				
			||||||
 | 
					#define FTM_NFC_NFCC_COMMAND      0x02
 | 
				
			||||||
 | 
					#define FTM_NFC_SEND_DATA         0x03
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define FTM_NFC_CMD_CMPL_TIMEOUT  15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef  ANDROID_M
 | 
				
			||||||
 | 
					#define NFC_NCI_HARDWARE_MODULE "nfc_nci.qc199x"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define NFC_NCI_HARDWARE_MODULE "nfc_nci"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    NCI_HAL_INIT,
 | 
				
			||||||
 | 
					    NCI_HAL_WRITE,
 | 
				
			||||||
 | 
					    NCI_HAL_READ,
 | 
				
			||||||
 | 
					    NCI_HAL_DEINIT,
 | 
				
			||||||
 | 
					    NCI_HAL_ASYNC_LOG,
 | 
				
			||||||
 | 
					    NCI_HAL_ERROR
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					/*==========================================================================*
 | 
				
			||||||
 | 
					*                             Declarations                                  *
 | 
				
			||||||
 | 
					*==========================================================================*/
 | 
				
			||||||
 | 
					/* Reader thread handle */
 | 
				
			||||||
 | 
					pthread_t nfc_thread_handle;
 | 
				
			||||||
 | 
					sem_t semaphore_halcmd_complete;
 | 
				
			||||||
 | 
					sem_t semaphore_nfcftmcmd_complete;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* structure that contains nfc cmd id and len
 | 
				
			||||||
 | 
					   part of the packet recieved from DIAG*/
 | 
				
			||||||
 | 
					PACKED struct ftm_nfc_cmd_header_type{
 | 
				
			||||||
 | 
					    uint16 nfc_cmd_id;
 | 
				
			||||||
 | 
					    uint16 nfc_cmd_len;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* nfc FTM packet(for NCI cmd/rsp messages)*/
 | 
				
			||||||
 | 
					typedef PACKED struct{
 | 
				
			||||||
 | 
					    diagpkt_subsys_header_type diag_hdr;
 | 
				
			||||||
 | 
					    struct ftm_nfc_cmd_header_type ftm_nfc_hdr;
 | 
				
			||||||
 | 
					    uint16 nfc_nci_pkt_len;
 | 
				
			||||||
 | 
					    byte nci_data[258];
 | 
				
			||||||
 | 
					}ftm_nfc_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* nfc FTM packet (for I2C write messgaes)*/
 | 
				
			||||||
 | 
					typedef PACKED struct{
 | 
				
			||||||
 | 
					    diagpkt_subsys_header_type diag_hdr;
 | 
				
			||||||
 | 
					    uint8 nfc_i2c_slave_status;
 | 
				
			||||||
 | 
					}ftm_nfc_i2c_write_rsp_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* nfc FTM packet (for I2C read messgaes)*/
 | 
				
			||||||
 | 
					typedef PACKED struct{
 | 
				
			||||||
 | 
					    diagpkt_subsys_header_type diag_hdr;
 | 
				
			||||||
 | 
					    struct ftm_nfc_cmd_header_type ftm_nfc_hdr;
 | 
				
			||||||
 | 
					    uint8 nfc_i2c_slave_status;
 | 
				
			||||||
 | 
					    uint8 nfc_nb_reg_reads;
 | 
				
			||||||
 | 
					    byte i2c_reg_read_rsp[30];
 | 
				
			||||||
 | 
					}ftm_nfc_i2c_read_rsp_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct{
 | 
				
			||||||
 | 
					    diagpkt_subsys_header_type diag_hdr;
 | 
				
			||||||
 | 
					    struct ftm_nfc_cmd_header_type ftm_nfc_hdr;
 | 
				
			||||||
 | 
					}ftm_nfc_data_rsp_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef PACKED struct{
 | 
				
			||||||
 | 
					    log_hdr_type hdr;
 | 
				
			||||||
 | 
					    byte data[1];
 | 
				
			||||||
 | 
					}ftm_nfc_log_pkt_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*Data buffer linked list*/
 | 
				
			||||||
 | 
					typedef struct asyncdata {
 | 
				
			||||||
 | 
					    uint8 *response_buff;
 | 
				
			||||||
 | 
					    uint8 async_datalen;
 | 
				
			||||||
 | 
					    struct asyncdata *next;
 | 
				
			||||||
 | 
					}asyncdata;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef void (tHAL_NFC_CBACK) (uint8 event, uint8 status);
 | 
				
			||||||
 | 
					typedef void (tHAL_NFC_DATA_CBACK) (uint16 data_len, uint8 *p_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void* ftm_nfc_dispatch_qti(ftm_nfc_pkt_type *ftm_nfc_pkt, uint16 pkt_len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* CONFIG_FTM_NFC */
 | 
				
			||||||
 | 
					#endif /* FTM_NFCQTI_H_ */
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user