Compare commits

...

116 Commits

Author SHA1 Message Date
Tanya Singh
bb35ca56aa mediatek: Enable dualboot for EAP111 and EAP112 by default
Fixes: WIFI-14579

Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-06-03 16:03:21 +08:00
Ken
6add44ae27 qca-wifi-7: fix invalid port mapping due to syntax error in 02_network
issue was introduced by edfd2883f5

Fixes: WIFI-14650
Signed-off-by: Ken <xshi@actiontec.com>
2025-05-30 07:24:33 +02:00
John Crispin
14a0c2d272 qca-wifi-7: add missing Kbuild symbols
Signed-off-by: John Crispin <john@phrozen.org>
2025-05-27 13:48:08 +02:00
John Crispin
9e769c85cb .github/workflows/: add more boards
Signed-off-by: John Crispin <john@phrozen.org>
2025-05-27 10:39:57 +02:00
mike_ding
d6e1008c7a Support dual image and fix reset button does not work issue
Signed-off-by: mike_ding <mike_ding@sdc.sercomm.com>
2025-05-27 10:39:57 +02:00
John Crispin
0a4c10d6cc ucentral-schema: update to latest HEAD
b4cfdc6 cmd_upgrade: implement secure download

Signed-off-by: John Crispin <john@phrozen.org>
2025-05-26 16:23:17 +02:00
jackcybertan
edfd2883f5 qca-wifi-7: Support for CyberTAN RAP750E-S AP
Signed-off-by: jackcybertan <jack.tsai@cybertan.com.tw>
2025-05-26 16:23:17 +02:00
Tanya Singh
f6ac6f791e mediatek: Fix typo in the name of the /etc/init.d/bootcount script
Fixes: WIFI-14579
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-05-26 16:23:17 +02:00
Tanya Singh
88fe15a985 mediatek: include patched hostapd for EAP112
Fixes: WIFI-14645
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-05-26 16:23:17 +02:00
Justin.Guo
a9f47c9e1e qca-wifi-7: CIG WiFi7 WF-672A bring up
* bring up wf672a
* add drivers lsm303agr rtl8221d ilps22qs
* add cig-wifi-mode-sw for switching radio to 2 bands or 3 bands

Fixes: WIFI-14509
Signed-off-by: Justin.Guo <guoxijun@actiontec.com>
2025-05-26 16:23:17 +02:00
Marek Kwaczynski
f17314a2d3 qca-wifi-7: hostapd: fix missing PSK assignment for EMPSK
When using psk2-radius in combination with enhanced MPSK,
the passphrase was not properly propagated to user scripts
via the ucode interface, because the PSK field was not set
in the connected station context.

This patch fixes that by copying the passphrase into the
psk field.

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-05-26 16:23:17 +02:00
Marek Kwaczynski
29739ebd13 qca-wifi-7: EAP-105: Derive WLAN MAC addresses from WAN MAC
For the Edgecore EAP-105 platform, configure the 2.4GHz, 5GHz,
and 6GHz WLAN interfaces to use MAC addresses derived
from the base WAN MAC address.

Fixes: WIFI-14624

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-05-26 16:23:17 +02:00
Sundareswar
3caba52dba EAP105: Roaming failed, if MPSK (AAA server) is configured (#515)
* While Roaming the AP couldn't find the wildcard R0KH and R1KH ids,
which are required by Fast transistion.
* Issue caused by the placement of conf parser in the invalid location.

Fixes: WIFI-14544

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-05-26 16:23:17 +02:00
Ken
44bcc50815 qcom-wifi-7: Default TC fq_codel queue on GRE cause low GRE RX throughput
Fixes: WIFI-14603
Signed-off-by: Ken <xshi@actiontec.com>
2025-05-26 16:23:17 +02:00
Ken
942d7c15b4 ipq807x: WF188n/WF196 lost the certificates files after upgrade
Fixes: WIFI-14623
Signed-off-by: Ken <xshi@actiontec.com>
2025-05-26 16:23:17 +02:00
John Crispin
25be7aef1a ucentral-schema: update to latest HEAD
b4635dc add 138 to default requested DHCP options

Signed-off-by: John Crispin <john@phrozen.org>
2025-05-26 16:23:17 +02:00
800246@emplustech.com
a2e1ffe089 mediatek: Swiitch LAN and WAN port for EMPLUS WAP588M
Signed-off-by: 800246@emplustech.com <cp.chang@emplustech.com>
2025-05-19 06:11:46 +02:00
polun
911f8eaa4c qca-wifi-7: Add Zyxel NWA130BE model
Signed-off-by: YenLin Pan <YenLin.Pan@zyxel.com.tw>
2025-05-19 06:11:20 +02:00
Tanya Singh
590ee6d514 mediatek: Update ethernet driver to support PHY AN8801 on Edgecore EAP111
Fixes: WIFI-14576
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-05-19 06:10:35 +02:00
Ken
5054a71062 qca-wifi-7: WF189 Save crash log into pstore
Fixes: WIFI-14582
Signed-off-by: Ken <xshi@actiontec.com>
2025-05-19 06:09:53 +02:00
John Crispin
d69c1c3176 ucentral-schema: update to latest HEAD
9710867 (HEAD -> main, origin/main, origin/HEAD) make the MTU configurable on GRE tunnels
4dd0904 SSH IdleTimeout can be configured from JSON config
6faaa1f HaLow: Extend ucentral schema & state for HaLow

Signed-off-by: John Crispin <john@phrozen.org>
2025-05-19 06:09:01 +02:00
John Crispin
8d0da5a086 ucentral-schema: update to latest HEAD
6faaa1f HaLow: Extend ucentral schema & state for HaLow
aa9cac5 dhcp_inject: Use same keyword "dhcp-inject" in config file

Signed-off-by: John Crispin <john@phrozen.org>
2025-05-12 10:45:38 +02:00
Wingate Chi
eb66feb5c5 qca-wifi-7: Support Sonicfi RAP750E-H
Fixes: WIFI-14563
Signed-off-by: Wingate Chi <wingate.chi@cybertan.com.tw>
2025-05-12 10:45:38 +02:00
800246@emplustech.com
89b6ebd518 mediatek: Add EMPLUS WAP588M model
Specifications:
SoC: MediaTek MT7981B
RF Chipset: MT7976C @2.4GHz 2T2R
MT7976C @5ghz 2T2R
RAM: 512MB DDR4 RAM
Flash: SPI-NAND 128 MiB
Ethernet: 2 x 1GbE PHY
Reset Button: 1
Power on/off switch dip: 1
Power Source: Standard PoE 802.3af/at
LED Indicator: 5x Single-color LED indicator (GPIO Control)

Signed-off-by: 800246@emplustech.com <cp.chang@emplustech.com>
2025-05-12 10:45:38 +02:00
Tanya Singh
e3dfe5ea74 rrmd: RRM with Channel Utilization - update radio status check
Fixes: WIFI-14575
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-05-12 10:45:38 +02:00
ian77_chen
f39339564a mediatek-sdk: Support HaLow on EAP112
1. porting MorseMicro HaLow driver to support HaLow on EAP112
2. Only support FCC regulation because of hardware limitation
3. Add /etc/init.d/halow-gpio-reset to initialize HaLow chip in early stage
4. Add /etc/uci-defaults/aaa-fix-phy0-to-morse to correct the default uci for HaLow radio.

Signed-off-by: Ian Chen <ian77_chen@accton.com>
2025-05-12 10:45:38 +02:00
John Crispin
adac3818a4 ucentral-schema: update to latest HEAD
52afdf8 fix wifi-scan on wifi-7 devices

Fixes: WIFI-14541
Fixes: WIFI-14537
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-30 08:03:26 +02:00
Ken
a516b035ab qca-wifi-7: WF189 10G PHY code optimization
* add "limit_rtlphy_10g_ablity" in DTS , no side effect on other product.
* disable 10G capability if DTS defined limit_rtlphy_10g_ablity , no side effect on other product.
* revert the last 0006-qca-ssdk-Fix-10G-rtl-phy-driver-for-c45-mdio-read-wr.patch and based on 0005 patch.

Fixes: WIFI-14567
Signed-off-by: Ken Shi <xshi@actiontec.com>
2025-04-29 08:25:22 +02:00
Ken
29b088ef21 qca-wifi-7: fix WF189 WAN port link issues
Fixes: WIFI-14546
Signed-off-by: Ken <xshi@actiontec.com>
2025-04-28 17:06:48 +02:00
John Crispin
10b875d42c ucentral-schema: update to latest HEAD
3b88fc1 dhcp_inject: Multiple ssids sometime didn't display dhcp option 82 rules

Fixes: WIFI-14564
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-28 12:35:34 +02:00
alex18_huang
1f0a24a941 udhcpinject: Multiple ssids sometime didn't display dhcp option 82 rules
Added check when parsing ssid info retrieved from iwinfo.
Program will exit if expected interface count and iwinfo entry count mismatch.

Fixes: WIFI-14564
Signed-off-by: alex18_huang <alex18_huang@accton.com>
2025-04-28 12:33:00 +02:00
Marek Kwaczynski
ea3afcda56 qca-wifi-7: hostapd.sh: add missed functionality from ipq807x_v5.4
The main reason was adding missed functionality for Radius
configuration which caused rejecting WiFi clients on
authentication level.

Still some changes not included:
* AFC,
* hs20_release,
* multiple_bssid,
* he_co_locate

Fixes: WIFI-14459
Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-04-25 08:16:02 +02:00
mike_ding
b5987cc2a7 qca-wifi-7: Support for AP72TIP and AP72TIP-v4 on APNOS v4.x
Signed-off-by: mike_ding <mike_ding@sdc.sercomm.com>
2025-04-25 08:15:00 +02:00
jackcybertan
fc700364d1 ipq807x: add sonicfi rap650c
Fixes: WIFI-14494
Signed-off-by: jackcybertan <jack.tsai@cybertan.com.tw>
2025-04-25 08:14:14 +02:00
Tanya Singh
f2fec9dd87 rrmd : Update file names from /tmp dir in rrmd init script that need to be removed when rrmd (re)starts
Fixes: WIFI-14560
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-04-25 08:13:22 +02:00
Ken
2de57bf167 qca-wifi-7: WF189 Reset button does not work
Fixes: WIFI-14538
Signed-off-by: Ken <xshi@actiontec.com>
2025-04-22 06:30:39 +02:00
John Crispin
7d31bebdb0 ucentral-schema: update to latest HEAD
048a53d state.uc: Fix the calculation of Channel Utilization (chanUtil) in statistics

Fixes: WIFI-14531
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-18 07:56:34 +02:00
Tanya Singh
fcb5a972cf rrmd: Update Channel Utilization Calculation in RRM
- avoid calculated Channel Utilization value to be 'infinity' from cycle_count_delta being '0'

Fixes: WIFI-14536
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-04-18 07:52:11 +02:00
Wingate Chi
082d04025c qca-wifi-7: change RAP750W-311A LED to PWM mode
Fixes: WIFI-14530
Signed-off-by: Wingate Chi <wingate.chi@cybertan.com.tw>
2025-04-17 13:33:56 +02:00
alex18_huang
9ef7d2c227 udhcpinjecti: missing from the package list in ucentral-ap.yml
Add package udhcpinject into profiles/ucentral-ap.yml

Fixes: WIFI-14529
Signed-off-by: Alex Huang <alex18_huang@accton.com>
2025-04-17 13:32:37 +02:00
Ken
e0d61cb0fb qca-wifi-7: WF189/W/H Add 189H support
Fixes: WIFI-14524
Signed-off-by: Ken Shi <xshi@actiontec.com>
2025-04-17 13:31:56 +02:00
Ken
ed2795b30b qca-wifi-7: CIG smp affinity for supporting 53XX platform with wikiki and pebble
Fixes: WIFI-14526
Signed-off-by: Ken Shi <xshi@actiontec.com>
2025-04-17 13:30:45 +02:00
alex18_huang
4b31e481ec udhcpinject: qdisk didn't create successfully for some interfaces while using dhcpinject
Program sometimes did not setup tc qdisc on some interfaces when creating SSID with dhcpinject enabled initially.

Added delayed startup.

Fixes: WIFI-14522
Signed-off-by: alex18_huang <alex18_huang@accton.com>
2025-04-10 16:17:34 +02:00
John Crispin
ba10a88ab3 ucentral-schema: update to latest HEAD
5a6d23b fix/improve swconfig detection

Fixes: WIFI-14525
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-10 16:13:58 +02:00
John Crispin
b85bc5db9c ipq50xx: fix swconfig setup to align with latest schema changes
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-10 16:13:26 +02:00
John Crispin
e998711444 ipq807x/hostapd: backport FT VLAN fix
The bug was in the upstream hostapd codebase, backport/rebase the fix

--> ba150059d1ec964add8f29eb2c92dd6dfde97308

Fixes: WIFI-14508
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-10 14:26:04 +02:00
John Crispin
2d6bea18df Revert "ipq53xx: add smp-affinity for wifi IRQs"
This reverts commit e5bcda17e7.

The patch was causing crashes

Fixes: WIFI-14523
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-10 13:06:05 +02:00
John Crispin
1bf9e40987 ucentral-schema: update to latest HEAD
43c7375 default max-inactivity to 300

Fixes: WIFI-14520
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-10 09:46:30 +02:00
John Crispin
a20b96eb31 ucentral-schema: update to latest HEAD
7624d43 set generate_local_psk to false if roaming and multi_psk are enabled

Fixes: WIFI-14484
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-10 09:10:45 +02:00
John Crispin
c83ac67492 cloud_discovery: make use of the new TIP cloud discovery server
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-10 08:30:15 +02:00
John Crispin
2b0c600fb3 ucentral-schema: update to latest HEAD
246873b add max-inactivity to ssid config
3b5a5c4 Allow option 82 DHCP fields to be transparently injected into client DHCP requests

Signed-off-by: John Crispin <john@phrozen.org>
2025-04-10 08:25:21 +02:00
alex18_huang
c5793bae3a udhcpinject: Allow option 82 DHCP fields to be transparently injected into client DHCP requests
1. Added userspace application udhcpinject to inject DHCP option 82 transparently
2. Added README.md for example usage

Fixes: WIFI-14018
Signed-off-by: alex18_huang <alex18_huang@accton.com>
2025-04-10 07:56:13 +02:00
Marek Kwaczynski
6afbb92dec qca-wifi-7: hostapd.sh: add psk2-radius encryption
Fixes: WIFI-14459
Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-04-10 07:55:37 +02:00
John Crispin
89cb9d63bd ucentral-schema: update to latest HEAD
10b5c36 extend swconfig support for dual cpu port swconfig switches

Signed-off-by: John Crispin <john@phrozen.org>
2025-04-09 09:36:43 +02:00
Ken Shi
16963c997f qca-ssdk: increase number of vlans on qca8337
Signed-off-by: Ken Shi <xshi@actiontec.com>
2025-04-09 09:22:41 +02:00
Ken Shi
f7a9ad770d ipq533x: add CIG WF189W support
Signed-off-by: Ken Shi <xshi@actiontec.com>
2025-04-09 09:14:50 +02:00
Ken Shi
dcdccc7ba0 ath12k-firmware: add miami pebble pebble firmware
Signed-off-by: Ken <xshi@actiontec.com>
2025-04-09 09:07:51 +02:00
Rick Sommerville
b67f97f213 hostapd: proxy arp: fail gracefully
Disable proxy arp and continue if snoop interface setup fail.

Fixes: WIFI-14507
Signed-off-by: Rick Sommerville <rick.sommerville@netexperience.com>
2025-04-09 08:53:01 +02:00
jackcybertan
e9dcf3d953 mediatek: RAP630W-211G change ethernet label and led behavior
Fixes: WIFI-14519
Signed-off-by: Jack Tsai <jack.tsai@cybertan.com.tw>
2025-04-08 14:26:19 +02:00
John Crispin
cc5edd4446 ucentral-schema: update to latest HEAD
0683d04 Add pdev_stats and channel utilization for each radio in the statistics

Fixes: WIFI-14460
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-08 07:25:33 +02:00
Marek Kwaczynski
79adece623 mediatek/hostap: fix roaming ASSOC REJECT
During roaming validation, an issue was detected with
the ASSOC-REJECT event, which had a status code of 55.

To resolve this, the SNonce from the Auth Request Frame
was copied, and the random ANonce is now used
only when expired.

Fixes: WIFI-14326

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-04-08 06:55:15 +02:00
John Crispin
49b64ec93f feed.conf.default: use the github.com based trees
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-07 18:10:23 +02:00
Marek Kwaczynski
b1e3686124 ipq807x_v5.4/mac80211: ath11k: fix peer addition/deletion error on sta band migration
Fix removing rhash when station is roaming between radios and
apply logic from opensource driver during adding/removing
peer.

Fixes: 7374c39d ("ath11k: fix STA roaming between radios")
Fixes: WIFI-14457

Signed-off-by: Arif Alam <arif.alam@netexperience.com>
Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-04-07 16:32:04 +02:00
John Crispin
e5bcda17e7 ipq53xx: add smp-affinity for wifi IRQs
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-07 13:32:14 +02:00
Ken Shi
7c04ed76bd ipq53xx: fix CIF WF189 MDIO clock speed
Fixes: WIFI-14510
Signed-off-by: Ken Shi <xshi@actiontec.com>
2025-04-07 12:46:06 +02:00
John Crispin
04a5cc67e0 ipq53xx: fix rap750w-311a calibration data and memory profile
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-07 11:42:53 +02:00
Wingate Chi
80b2c6d080 WIFI-14511 support Sonicfi RAP750W-311A
Signed-off-by: Wingate Chi <wingate.chi@cybertan.com.tw>
2025-04-07 10:47:47 +02:00
Ken
c683f19b7c ipq60xx: WF188n update the BDF to support FCC/CE/MY/AU/ES/SE/FR
Fixes: WIFI-14512
Signed-off-by: Ken Shi <xshi@actiontec.com>
2025-04-07 10:07:14 +02:00
John Crispin
1b10507cf1 busybox: the DHCP client would sometimes send a superflous port unreachable frame
Fixes: WIFI-14149
Signed-off-by: John Crispin <john@phrozen.org>
2025-04-01 13:26:24 +02:00
John Crispin
50abd015b3 ucentral-schema: update to latest HEAD
a2133a8 always regenerate the default /e/c/wireless config
505e1a1 ssh: add IdleTimeout=60

Fixes: WIFI-14473
Fixes: WIFI-14470
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-28 09:44:37 +01:00
Tanya Singh
5dd212829f WIFI-14502: Add wlan-ucentral-schema revision hash to /etc/openwrt_release
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-03-28 08:06:00 +01:00
Sebastian Huang
3abc947f8f WIFI-14503: Update BDF (EEPROM file) for Edgecore EAP112
Signed-off-by: Sebastian Huang <sebastian_huang@accton.com>
2025-03-28 08:05:38 +01:00
John Crispin
5f42e9db58 mac80211: AP VLAN interfaces did not inheret the HE capabilities correctly
Fixes: WIFI-14491
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-28 08:04:28 +01:00
Ken
b181add059 WIFI-14490 WF189 eth1 and eth0 swapped on 12.5
Signed-off-by: Ken <xshi@actiontec.com>
2025-03-26 14:56:43 +01:00
Tanya Singh
7eae0397f1 WIFI-14500: Fixes for Edgecore OAP103 1. Support bluetooth 2. Allow certificate loading on dual boot 3. Support RRM with Channel Utilization 4. Remove EAP102 from supported devices
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-03-26 14:56:31 +01:00
Tanya Singh
1033a63140 WIFI-14180: Update BDF for Edgecore EAP111
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-03-26 14:56:21 +01:00
Tanya Singh
954108d742 WIFI-14460: Update RRM using Channel Utilization script - Improve policy_chanutil.uc script - Improve scripts reading pdev_stats - Support 6G radio AP - Support WiFi7 AP
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2025-03-26 07:42:03 +01:00
John Crispin
caee55a61f hostapd: correctly set the sta->psk_id on 6G band
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-26 07:40:55 +01:00
John Crispin
502727ad6d qca-wifi7: add DVLAN multicast too unicast workaround
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-24 11:56:50 +01:00
Venkat Chimata
1868e369d3 WIFI-14489: Adding Edgecore OAP103 to the list of supported APs
1. Integrated WiFi boarddata
2. Integrated LEDs
3. sysupgrade changes are integrated
4. Network ports are enumerated
5. A new profile is added under profiles

Signed-off-by: Venkat Chimata <venkata@shasta.cloud>
2025-03-24 11:56:34 +01:00
John Crispin
5a597c912d ipq807x/hostapd: merge missing e-mspk sta/psk index patch
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-24 10:47:05 +01:00
John Crispin
82ae3766fa ucentral-schema: update to latest HEAD
d183922 WIFI-14477: Get switch carrier, speed & duplex info from swconfig command

Signed-off-by: John Crispin <john@phrozen.org>
2025-03-24 10:08:24 +01:00
John Crispin
d250f91bb3 ipq95xx: drop ATH12.3 support
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-24 08:11:43 +01:00
John Crispin
76d112144f ucentral-client: update version.json to 4.0.0
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-24 08:11:14 +01:00
John Crispin
d218c15419 ucentral-schema: update to latest HEAD
c2338ad snmp: fix schema/yaml syntax
50c4ead set schema version to 4.0.0
d8260f8 add property that allows disabling MPSK

Signed-off-by: John Crispin <john@phrozen.org>
2025-03-24 08:09:40 +01:00
John Crispin
2bf2093305 github/workflow: re-enable CIG WF189
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-24 08:05:59 +01:00
John Crispin
c548edfe89 qca-wifi-7: update CIG WF189 BDF files
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-24 07:37:39 +01:00
John Crispin
82a6e24e91 qca-wifi-7: add RTK phy fixes from CIG
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-24 07:36:09 +01:00
Wingate Chi
c0e6b523c4 WIFI-14488 RAP7110C-341X enable PWM LED config.
Signed-off-by: Wingate Chi <wingate.chi@cybertan.com.tw>
2025-03-24 07:30:25 +01:00
steven.lin
195fc01d06 mediatek: Add SENAO IAP2300M model
Signed-off-by: steven.lin <steven.lin@senao.com>
2025-03-24 07:29:55 +01:00
John Crispin
19959d016b ucentral-schema: update to latest HEAD
5a39d23 remove beacon-interval option

Signed-off-by: John Crispin <john@phrozen.org>
2025-03-24 07:28:40 +01:00
John Crispin
03b34b062e ucentral-schema: update to latest HEAD
1c11c1b WIFI-14284: Use swconfig to get the correct port to VLAN ID mapping for statistics

Fixes: WIFI-14284
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-17 12:09:37 +01:00
Wingate Chi
076bc0712e ipq807x_v5.4: change RAP630W-312G and RAP63XC vendor name
Fixes: WIFI-14471
Signed-off-by: Wingate Chi <wingate.chi@cybertan.com.tw>
2025-03-14 10:55:22 +01:00
John Crispin
486cc7983a qca-wifi-7: re-enable CIG wf189 support
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-14 08:41:43 +01:00
John Crispin
80343e9dad dropbear: update to upstream version
Fixes: WIFI-14466
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-14 08:40:51 +01:00
steven.lin
dd14c1c6d1 mediatek: Add SENAO models into mount_certs scripts
Signed-off-by: steven.lin <steven.lin@senao.com>
2025-03-14 08:06:21 +01:00
John Crispin
71748f4cd4 ucentral-schema: update to latest HEAD
481fd77 WIFI-14472: JSON config should allow to set channels above 196 to support channels in 6G band

Signed-off-by: John Crispin <john@phrozen.org>
2025-03-14 07:40:01 +01:00
Wingate Chi
49c51594a3 WIFI-14452 Fix Crash Observed on Cybertan rap7110c-341x with TIP dbdc168 image
Signed-off-by: Wingate Chi <wingate.chi@cybertan.com.tw>
2025-03-14 07:35:49 +01:00
John Crispin
739b6b29b2 ucentral-schema: update to latest HEAD
d2ff805 Change realtime events type from enum to string
a518b02 schema, ssid: add mpsk-radius encryption

Signed-off-by: John Crispin <john@phrozen.org>
2025-03-11 10:27:27 +01:00
John Crispin
7e393c4831 qca-wifi-7: add preliminary support for rap750w_311a
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-11 10:26:33 +01:00
Marek Kwaczynski
1149cd41aa ucentral: Add example for mpsk-radius config
Create example how to configure EMPSK with AAA using
new crypto method: mpsk-radius.

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-03-11 10:09:12 +01:00
Marek Kwaczynski
18bb47be4d hostapd: mpskd: use mpsk from wireless config
In MPSK AAA need to use mpsk info to block scans
becasue keys are not configured.

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-03-11 10:09:12 +01:00
Marek Kwaczynski
7847e1778e netifd: hostapd.sh add multi_psk param
Notification about enabling multi_psk for specific
wireless network.

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-03-11 10:09:12 +01:00
Marek Kwaczynski
57735bcd18 hostapd: mpskd: fix checking addr in ssid_cache
Fix ucode syntax.

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-03-11 10:09:12 +01:00
Marek Kwaczynski
376072ad97 hostapd: mpskd: minor: remove white spaces end of the line
Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-03-11 10:09:12 +01:00
Marek Kwaczynski
afa7e2bbb3 rrmd: scan: fix setting center_freq1 in params
Add casting center frequency to int, previosly was used
string.

{
	"dev": "wlan1",
	"wiphy_freq": "5180",
	"measurement_duration": "70",
	"center_freq1": "518030",
	"scan_ssids": [
		""
	],
	"scan_flags": 4
}

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-03-11 10:08:45 +01:00
Marek Kwaczynski
52f2e31892 rrmd: Update scanning for WiFi 7 devices
Update scan module to support WiFi 7 devices
which have virtual phys defined. Scanning on
the different virtual phys but on the same physical
phy isn't allowed.
Add NL CBs to notify about scanning progress.

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-03-11 10:08:45 +01:00
Marek Kwaczynski
b791a723ca qca-wifi-7/mac80211: Add tip patch to fix scanning on WiFi 7 devices
Need to unblock chandef as scanning definitions which
is used by TIP modules for scanning trigger.

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-03-11 10:08:45 +01:00
Marek Kwaczynski
a9e0e16a80 rrmd: phy: Use wiphy_name if exists
When wiphy_name is defined should be used instead of
creating name using wiphy index.

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-03-11 10:08:45 +01:00
Marek Kwaczynski
4d55d427d7 ucentral-event: fix null pointers checking in channel switch
Invalid logical operator was used for checking null
pointers in channel_switch function: AND instead OR

Fixes: 7477963b ("ucentral-event: add channel switch handler")

Signed-off-by: Marek Kwaczynski <marek@shasta.cloud>
2025-03-11 10:08:44 +01:00
John Crispin
53ff49eb6f Revert "ath11k: fix STA roaming between radios"
This reverts commit 7374c39dea.

Signed-off-by: John Crispin <john@phrozen.org>
2025-03-07 09:38:38 +01:00
John Crispin
1a3c87cf35 .github/workflows: remove aercom ap72 from CI
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-07 09:38:07 +01:00
John Crispin
75df7bb794 ath12k-wifi: use SDK BDF for rap7110c_341x
Use the SDK BDF for now until the ODM provides a fixed version.

Signed-off-by: John Crispin <john@phrozen.org>
2025-03-07 09:36:52 +01:00
Tanya Singh
b61850ff18 WIFI-14462: hostapd_cli command missing from Wifi7 AP
Signed-off-by: Tanya Singh <tanya.singh@4ipnet.com>
2025-03-07 09:35:54 +01:00
Venkat Chimata
3738f5b884 mac80211: workaround: Send multicast frames as multiple unicast frames in DVLAN mode
Broadcast / Multciast transmission is not working in DVLAN mode in the driver.
If we send the frames as unicast frames, it works. This is a workaround for now.
Need to rollback once we add a clean fix.

Fixes: WIFI-14441
Signed-off-by: Venkat Chimata <venkata@shasta.cloud>
2025-03-04 06:51:45 +01:00
John Crispin
708895e7ae ucentral-schema: update to latest HEAD
39e380e enforce PMF for sae-mixed mode

Fixes: WIFI-14450
Signed-off-by: John Crispin <john@phrozen.org>
2025-03-03 15:40:27 +01:00
2009 changed files with 82087 additions and 450594 deletions

View File

@@ -21,7 +21,7 @@ jobs:
strategy:
fail-fast: false
matrix:
target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf196', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'cybertan_rap630w-312g', 'cybertan_rap63xc-211g', 'sonicfi_rap630c-311g', 'sonicfi_rap630w-311g', 'sonicfi_rap630w-211g', 'sonicfi_rap7110c-341x', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap105', 'edgecore_eap111', 'edgecore_eap112', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4x_3', 'hfcl_ion4xi_w', 'hfcl_ion4x_w', 'indio_um-305ax', 'senao_iap4300m', 'senao_jeap6500', 'sercomm_ap72tip', 'udaya_a6-id2', 'udaya_a6-od2', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655' ]
target: [ 'cig_wf189h', 'cig_wf189w', 'cig_wf672', 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf189', 'cig_wf196', 'cig_wf196', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'sonicfi_rap630w-312g', 'sonicfi_rap63xc-211g', 'sonicfi_rap630c-311g', 'sonicfi_rap630w-311g', 'sonicfi_rap630w-211g', 'sonicfi_rap650c', 'sonicfi_rap7110c-341x', 'sonicfi_rap750e-h', 'sonicfi_rap750e-s', 'sonicfi_rap750w-311a', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap105', 'edgecore_eap111', 'edgecore_eap112', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'edgecore_oap103', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4x_3', 'hfcl_ion4xi_w', 'hfcl_ion4x_w', 'indio_um-305ax', 'senao_iap4300m', 'senao_iap2300m', 'senao_jeap6500', 'udaya_a6-id2', 'udaya_a6-od2', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655', 'emplus_wap588m', 'zyxel_nwa130be', 'sercomm_ap72tip-v4' ]
steps:
- uses: actions/checkout@v3

View File

@@ -6,7 +6,8 @@ boot() {
. /lib/functions/system.sh
case $(board_name) in
edgecore,eap102|\
edgecore,oap102)
edgecore,oap102|\
edgecore,oap103)
echo 54 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio54/direction
echo 0 > /sys/class/gpio/gpio54/value

View File

@@ -0,0 +1,46 @@
Index: hostapd-2023-09-08-e5ccbfc6/src/ap/wpa_auth_ft.c
===================================================================
--- hostapd-2023-09-08-e5ccbfc6.orig/src/ap/wpa_auth_ft.c
+++ hostapd-2023-09-08-e5ccbfc6/src/ap/wpa_auth_ft.c
@@ -3293,6 +3297,8 @@ static int wpa_ft_process_auth_req(struc
size_t identity_len = 0, radius_cui_len = 0;
size_t pmk_r1_len, kdk_len, len;
int retval = WLAN_STATUS_UNSPECIFIED_FAILURE;
+ struct os_reltime now;
+ struct rsn_ftie *ftie;
*resp_ies = NULL;
*resp_ies_len = 0;
@@ -3324,6 +3330,9 @@ static int wpa_ft_process_auth_req(struc
goto out;
}
+ ftie = (struct rsn_ftie *) parse.ftie;
+ os_memcpy(sm->SNonce, ftie->snonce, WPA_NONCE_LEN);
+
if (parse.r0kh_id == NULL) {
wpa_printf(MSG_DEBUG, "FT: Invalid FTIE - no R0KH-ID");
retval = WLAN_STATUS_INVALID_FTIE;
@@ -3424,10 +3433,18 @@ pmk_r1_derived:
os_memcpy(sm->pmk_r1, pmk_r1, pmk_r1_len);
sm->pmk_r1_len = pmk_r1_len;
- if (random_get_bytes(sm->ANonce, WPA_NONCE_LEN)) {
- wpa_printf(MSG_DEBUG, "FT: Failed to get random data for "
- "ANonce");
- goto out;
+ if (os_get_reltime(&now) < 0 ||
+ os_reltime_expired(&now, &sm->ANonce_time, 1)) {
+ if (random_get_bytes(sm->ANonce, WPA_NONCE_LEN)) {
+ wpa_printf(MSG_DEBUG, "FT: Failed to get random data for "
+ "ANonce");
+ return WLAN_STATUS_UNSPECIFIED_FAILURE;
+ }
+ sm->ANonce_time.sec = now.sec;
+ sm->ANonce_time.usec = now.usec;
+ wpa_printf(MSG_INFO, "FT: ANonce was randomized");
+ } else {
+ wpa_printf(MSG_INFO, "FT: ANonce has not expired");
}
/* Now that we know the correct PMK-R1 length and as such, the length

View File

@@ -32,7 +32,6 @@ ALLWIFIBOARDS:= \
cybertan-eww622-a1 \
cybertan-eww631-a1 \
cybertan-eww631-b1 \
cybertan-rap630w-312g \
edgecore-eap101 \
gl-ax1800 \
gl-axt1800 \
@@ -40,6 +39,7 @@ ALLWIFIBOARDS:= \
sercomm-wallaby \
edgecore-eap102 \
edgecore-oap102 \
edgecore-oap103 \
edgecore-eap104 \
liteon-wpx8324 \
indio-um-310ax-v1 \
@@ -52,6 +52,8 @@ ALLWIFIBOARDS:= \
wallys-dr6018-v4 \
sonicfi-rap630c-311g \
sonicfi-rap630w-311g \
sonicfi-rap630w-312g \
sonicfi-rap650c \
tplink-ex227 \
tplink-ex447 \
yuncore-ax840 \
@@ -394,13 +396,13 @@ $(eval $(call generate-ath11k-wifi-package,cig-wf194c4,Cigtech WF194c4))
$(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,cybertan-rap630w-312g,CyberTan RAP630W 312G))
$(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-v4,Wallys DR6018 V4))
$(eval $(call generate-ath11k-wifi-package,edgecore-eap101,EdgeCore EAP101))
$(eval $(call generate-ath11k-wifi-package,edgecore-eap102,Edgecore EAP102))
$(eval $(call generate-ath11k-wifi-package,edgecore-oap102,Edgecore OAP102))
$(eval $(call generate-ath11k-wifi-package,edgecore-oap103,Edgecore OAP103))
$(eval $(call generate-ath11k-wifi-package,edgecore-eap104,Edgecore EAP104))
$(eval $(call generate-ath11k-wifi-package,liteon-wpx8324,Liteon WPX8324))
$(eval $(call generate-ath11k-wifi-package,indio-um-310ax-v1,Indio UM-310AX V1))
@@ -408,6 +410,8 @@ $(eval $(call generate-ath11k-wifi-package,indio-um-510axp-v1,Indio UM-510AXP V1
$(eval $(call generate-ath11k-wifi-package,indio-um-510axm-v1,Indio UM-510AXM V1))
$(eval $(call generate-ath11k-wifi-package,sonicfi-rap630c-311g,Sonicfi RAP630C 311G))
$(eval $(call generate-ath11k-wifi-package,sonicfi-rap630w-311g,Sonicfi RAP630W 311G))
$(eval $(call generate-ath11k-wifi-package,sonicfi-rap630w-312g,Sonicfi RAP630W 312G))
$(eval $(call generate-ath11k-wifi-package,sonicfi-rap650c,SonicFi RAP650C))
$(eval $(call generate-ath11k-wifi-package,tplink-ex227,TP-Link EX227))
$(eval $(call generate-ath11k-wifi-package,tplink-ex447,TP-Link EX447))
$(eval $(call generate-ath11k-wifi-package,yuncore-ax840,YunCore AX840))

View File

@@ -340,6 +340,7 @@ hostapd_common_add_bss_config() {
wpa_group_rekey wpa_pair_rekey wpa_master_rekey
config_add_boolean wpa_strict_rekey
config_add_boolean wpa_disable_eapol_key_retries
config_add_boolean multi_psk
config_add_boolean tdls_prohibit
@@ -724,7 +725,7 @@ hostapd_set_bss_options() {
airtime_bss_weight airtime_bss_limit airtime_sta_weight \
multicast_to_unicast_all proxy_arp per_sta_vif \
eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id \
vendor_elements fils uci_section dynamic_probe_resp
vendor_elements fils uci_section dynamic_probe_resp multi_psk
set_default fils 0
set_default isolate 0
@@ -737,6 +738,7 @@ hostapd_set_bss_options() {
set_default wmm 1
set_default uapsd 1
set_default wpa_disable_eapol_key_retries 0
set_default multi_psk $multi_psk
set_default tdls_prohibit 0
set_default eapol_version $((wpa & 1))
set_default acct_port 1813

View File

@@ -26,11 +26,12 @@ function event_cb_6g(req) {
return 0;
let ssid = iface.ssid;
if (!ssid || !length(ssids[ssid].keys))
if (!ssid || !ssids[ssid].mpsk)
return 0;
let ssid_cache = cache[ssid];
if (ssid_cache && ssid_cache[addr])
if (ssid_cache && addr in ssid_cache)
return 0;
if (req.type == 'probe') {
@@ -53,15 +54,15 @@ function event_cb(req) {
return 0;
let ssid = iface.ssid;
if (!ssid || !length(ssids[ssid].keys))
if (!ssid || !ssids[ssid].mpsk)
return 0;
let ssid_cache = cache[ssid];
if (ssid_cache && ssid_cache[addr])
if (ssid_cache && addr in ssid_cache)
return 0;
printf(`reply to ${req.type} on ${req.data.ifname} from ${addr} without 6G RNR\n`);
return 2;
return 2;
}
function create_6g_subscriber() {
@@ -143,6 +144,7 @@ function netifd_reload() {
push(ssid.interfaces, iface.ifname);
ssid.bands[band] = iface.ifname;
ssid.mpsk = config.multi_psk;
for (let sta in iface.stations) {
let stacfg = sta.config;
@@ -174,6 +176,20 @@ function iface_ssid(ifname) {
return iface.ssid;
}
function is_ssid_mpsk(ifname) {
let ssid = iface_ssid(ifname);
if (!ssid)
return false;
if (!ssids[ssid])
return false;
if (!ssids[ssid]?.mpsk)
return false;
return ssids[ssid].mpsk;
}
function sta_cache_entry_get(ssid, addr) {
let ssid_cache = cache[ssid] ?? {};
@@ -292,6 +308,9 @@ function sta_auth_cache(ifname, addr, idx, phrase) {
function auth_cb(msg) {
let data = msg.data;
if (!is_ssid_mpsk(data.iface))
return;
printf(`Event ${msg.type}: ${msg.data}\n`);
switch (msg.type) {
case 'sta_auth':

View File

@@ -606,12 +606,13 @@
for (pw = hapd->conf->sae_passwords; pw; pw = pw->next) {
if (!is_broadcast_ether_addr(pw->peer_addr) &&
os_memcmp(pw->peer_addr, sta->addr, ETH_ALEN) != 0)
@@ -519,6 +525,31 @@ static const char * sae_get_password(str
@@ -519,6 +525,33 @@ static const char * sae_get_password(str
pt = hapd->conf->ssid.pt;
}
+use_sta_psk:
+ if (!password && sta) {
+ sta->psk_idx = 0;
+ for (psk = sta->psk; psk; psk = psk->next) {
+ if (!psk->is_passphrase)
+ continue;
@@ -620,6 +621,7 @@
+ if (!sta->use_sta_psk)
+ break;
+
+ sta->psk_idx = 1;
+ if (sta->sae_pt) {
+ pt = sta->sae_pt;
+ break;
@@ -638,7 +640,7 @@
if (pw_entry)
*pw_entry = pw;
if (s_pt)
@@ -3698,6 +3729,12 @@ static void handle_auth(struct hostapd_d
@@ -3698,6 +3731,12 @@ static void handle_auth(struct hostapd_d
goto fail;
}
@@ -686,15 +688,15 @@
char *radius_cui; /* Chargeable-User-Identity from RADIUS */
--- a/src/ap/wpa_auth_glue.c
+++ b/src/ap/wpa_auth_glue.c
@@ -337,6 +337,7 @@ static const u8 * hostapd_wpa_auth_get_p
struct sta_info *sta = ap_get_sta(hapd, addr);
const u8 *psk;
@@ -355,6 +355,7 @@ static const u8 * hostapd_wpa_auth_get_p
}
#endif /* CONFIG_SAE */
+ sta->psk_idx = 0;
if (vlan_id)
*vlan_id = 0;
if (psk_len)
@@ -381,13 +382,18 @@ static const u8 * hostapd_wpa_auth_get_p
#ifdef CONFIG_OWE
if ((hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_OWE) &&
sta && sta->owe_pmk) {
@@ -381,12 +382,17 @@ static const u8 * hostapd_wpa_auth_get_p
* returned psk which should not be returned again.
* logic list (all hostapd_get_psk; all sta->psk)
*/
@@ -702,28 +704,26 @@
+ psk = NULL;
if (sta && sta->psk && !psk) {
struct hostapd_sta_wpa_psk_short *pos;
+ int psk_idx;
+ int psk_idx = 1;
if (vlan_id)
*vlan_id = 0;
psk = sta->psk->psk;
+ sta->psk_idx = psk_idx = 1;
+ if (vlan_id)
+ sta->psk_idx = psk_idx;
for (pos = sta->psk; pos; pos = pos->next) {
+ psk_idx++;
if (pos->is_passphrase) {
pbkdf2_sha1(pos->passphrase,
hapd->conf->ssid.ssid,
@@ -396,10 +402,14 @@ static const u8 * hostapd_wpa_auth_get_p
pos->is_passphrase = 0;
@@ -397,9 +403,13 @@ static const u8 * hostapd_wpa_auth_get_p
}
if (pos->psk == prev_psk) {
+ sta->psk_idx = psk_idx;
psk = pos->next ? pos->next->psk : NULL;
+ if (vlan_id)
+ sta->psk_idx = psk_idx + 1;
break;
}
}
+
+ if (!psk)
+ if (vlan_id && !psk)
+ sta->psk_idx = 0;
}
return psk;

View File

@@ -0,0 +1,27 @@
--- a/src/ap/hostapd.c
+++ b/src/ap/hostapd.c
@@ -1527,19 +1527,15 @@ int hostapd_setup_bss(struct hostapd_dat
if (x_snoop_init(hapd)) {
wpa_printf(MSG_ERROR,
"Generic snooping infrastructure initialization failed");
- return -1;
- }
-
- if (dhcp_snoop_init(hapd)) {
+ conf->proxy_arp = 0;
+ } else if (dhcp_snoop_init(hapd)) {
wpa_printf(MSG_ERROR,
"DHCP snooping initialization failed");
- return -1;
- }
-
- if (ndisc_snoop_init(hapd)) {
+ conf->proxy_arp = 0;
+ } else if (ndisc_snoop_init(hapd)) {
wpa_printf(MSG_ERROR,
"Neighbor Discovery snooping initialization failed");
- return -1;
+ conf->proxy_arp = 0;
}
}

View File

@@ -0,0 +1,411 @@
From: Jouni Malinen <quic_jouni@quicinc.com>
Date: Tue, 14 Feb 2023 11:29:30 +0200
Subject: [PATCH] FT: Store PMK-R0/PMK-R1 after EAPOL-Key msg 2/4 MIC
validation
hostapd was previously storing the derived PMK-R0 and PMK-R1 as soon as
these keys were derived. While that is fine for most purposes, it is
unnecessary to do that so quickly and if anything were to fail before
the supplicant is able to return a valid EAPOL-Key msg 2/4, there would
not really be any real use for the derived keys.
For the special case of FT-PSK and VLAN determination based on the
wpa_psk file, the VLAN information is set in the per-STA data structures
only after the EAPOL-Key msg 2/4 MIC has been verified. This ended up
storing the PMK-R0/PMK-R1 entries without correct VLAN assignment and as
such, any use of the FT protocol would not be able to transfer the VLAN
information through RRB.
Split local storing of the FT key hierarchy for the cases using the FT
4-way handshake so that PMK-R0 and PMK-R1 are first derived and then
stored as a separate step after having verified the MIC in the EAPOL-Key
msg 2/4 (i.e., after having confirmed the per-STA passphrase/PSK was
selected) and VLAN update. This fixes VLAN information for the
wpa_psk_file cases with FT-PSK.
Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
---
--- a/src/ap/wpa_auth.c
+++ b/src/ap/wpa_auth.c
@@ -58,7 +58,9 @@ static int wpa_group_config_group_keys(s
struct wpa_group *group);
static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *snonce,
const u8 *pmk, unsigned int pmk_len,
- struct wpa_ptk *ptk, int force_sha256);
+ struct wpa_ptk *ptk, int force_sha256,
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
+ size_t *key_len);
static void wpa_group_free(struct wpa_authenticator *wpa_auth,
struct wpa_group *group);
static void wpa_group_get(struct wpa_authenticator *wpa_auth,
@@ -940,6 +942,10 @@ static int wpa_try_alt_snonce(struct wpa
const u8 *pmk = NULL;
size_t pmk_len;
int vlan_id = 0;
+ u8 pmk_r0[PMK_LEN_MAX], pmk_r0_name[WPA_PMK_NAME_LEN];
+ u8 pmk_r1[PMK_LEN_MAX];
+ size_t key_len;
+ int ret = -1;
os_memset(&PTK, 0, sizeof(PTK));
for (;;) {
@@ -961,8 +967,8 @@ static int wpa_try_alt_snonce(struct wpa
pmk_len = sm->pmk_len;
}
- if (wpa_derive_ptk(sm, sm->alt_SNonce, pmk, pmk_len, &PTK, 0) <
- 0)
+ if (wpa_derive_ptk(sm, sm->alt_SNonce, pmk, pmk_len, &PTK, 0,
+ pmk_r0, pmk_r1, pmk_r0_name, &key_len) < 0)
break;
if (wpa_verify_key_mic(sm->wpa_key_mgmt, pmk_len, &PTK,
@@ -983,7 +989,7 @@ static int wpa_try_alt_snonce(struct wpa
if (!ok) {
wpa_printf(MSG_DEBUG,
"WPA: Earlier SNonce did not result in matching MIC");
- return -1;
+ goto fail;
}
wpa_printf(MSG_DEBUG,
@@ -992,14 +998,26 @@ static int wpa_try_alt_snonce(struct wpa
if (vlan_id && wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt) &&
wpa_auth_update_vlan(sm->wpa_auth, sm->addr, vlan_id) < 0)
- return -1;
+ goto fail;
+
+#ifdef CONFIG_IEEE80211R_AP
+ if (wpa_key_mgmt_ft(sm->wpa_key_mgmt) && !sm->ft_completed) {
+ wpa_printf(MSG_DEBUG, "FT: Store PMK-R0/PMK-R1");
+ wpa_auth_ft_store_keys(sm, pmk_r0, pmk_r1, pmk_r0_name,
+ key_len);
+ }
+#endif /* CONFIG_IEEE80211R_AP */
os_memcpy(sm->SNonce, sm->alt_SNonce, WPA_NONCE_LEN);
os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
forced_memzero(&PTK, sizeof(PTK));
sm->PTK_valid = true;
- return 0;
+ ret = 0;
+fail:
+ forced_memzero(pmk_r0, sizeof(pmk_r0));
+ forced_memzero(pmk_r1, sizeof(pmk_r1));
+ return ret;
}
@@ -2283,7 +2301,9 @@ SM_STATE(WPA_PTK, PTKSTART)
static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *snonce,
const u8 *pmk, unsigned int pmk_len,
- struct wpa_ptk *ptk, int force_sha256)
+ struct wpa_ptk *ptk, int force_sha256,
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
+ size_t *key_len)
{
const u8 *z = NULL;
size_t z_len = 0, kdk_len;
@@ -2311,7 +2331,8 @@ static int wpa_derive_ptk(struct wpa_sta
sm->pairwise,
kdk_len);
}
- return wpa_auth_derive_ptk_ft(sm, ptk);
+ return wpa_auth_derive_ptk_ft(sm, ptk, pmk_r0, pmk_r1,
+ pmk_r0_name, key_len);
}
#endif /* CONFIG_IEEE80211R_AP */
@@ -2934,6 +2955,9 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
struct wpa_eapol_ie_parse kde;
int vlan_id = 0;
int owe_ptk_workaround = !!wpa_auth->conf.owe_ptk_workaround;
+ u8 pmk_r0[PMK_LEN_MAX], pmk_r0_name[WPA_PMK_NAME_LEN];
+ u8 pmk_r1[PMK_LEN_MAX];
+ size_t key_len;
SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING, wpa_ptk);
sm->EAPOLKeyReceived = false;
@@ -2972,7 +2996,8 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
}
if (wpa_derive_ptk(sm, sm->SNonce, pmk, pmk_len, &PTK,
- owe_ptk_workaround == 2) < 0)
+ owe_ptk_workaround == 2, pmk_r0, pmk_r1,
+ pmk_r0_name, &key_len) < 0)
break;
if (mic_len &&
@@ -3021,7 +3046,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
sm->last_rx_eapol_key,
sm->last_rx_eapol_key_len);
sm->waiting_radius_psk = 1;
- return;
+ goto out;
}
if (!ok) {
@@ -3029,7 +3054,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
"invalid MIC in msg 2/4 of 4-Way Handshake");
if (psk_found)
wpa_auth_psk_failure_report(sm->wpa_auth, sm->addr);
- return;
+ goto out;
}
/*
@@ -3043,12 +3068,12 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
key_data_length = WPA_GET_BE16(mic + mic_len);
if (key_data_length > sm->last_rx_eapol_key_len - sizeof(*hdr) -
sizeof(*key) - mic_len - 2)
- return;
+ goto out;
if (wpa_parse_kde_ies(key_data, key_data_length, &kde) < 0) {
wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
"received EAPOL-Key msg 2/4 with invalid Key Data contents");
- return;
+ goto out;
}
if (kde.rsn_ie) {
eapol_key_ie = kde.rsn_ie;
@@ -3075,7 +3100,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
/* MLME-DEAUTHENTICATE.request */
wpa_sta_disconnect(wpa_auth, sm->addr,
WLAN_REASON_PREV_AUTH_NOT_VALID);
- return;
+ goto out;
}
if ((!sm->rsnxe && kde.rsnxe) ||
(sm->rsnxe && !kde.rsnxe) ||
@@ -3091,7 +3116,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
/* MLME-DEAUTHENTICATE.request */
wpa_sta_disconnect(wpa_auth, sm->addr,
WLAN_REASON_PREV_AUTH_NOT_VALID);
- return;
+ goto out;
}
#ifdef CONFIG_OCV
if (wpa_auth_uses_ocv(sm)) {
@@ -3103,14 +3128,14 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
if (wpa_channel_info(wpa_auth, &ci) != 0) {
wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
"Failed to get channel info to validate received OCI in EAPOL-Key 2/4");
- return;
+ goto out;
}
if (get_sta_tx_parameters(sm,
channel_width_to_int(ci.chanwidth),
ci.seg1_idx, &tx_chanwidth,
&tx_seg1_idx) < 0)
- return;
+ goto out;
res = ocv_verify_tx_params(kde.oci, kde.oci_len, &ci,
tx_chanwidth, tx_seg1_idx);
@@ -3127,7 +3152,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
OCV_FAILURE "addr=" MACSTR
" frame=eapol-key-m2 error=%s",
MAC2STR(sm->addr), ocv_errorstr);
- return;
+ goto out;
}
}
#endif /* CONFIG_OCV */
@@ -3135,7 +3160,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
if (ft && ft_check_msg_2_of_4(wpa_auth, sm, &kde) < 0) {
wpa_sta_disconnect(wpa_auth, sm->addr,
WLAN_REASON_PREV_AUTH_NOT_VALID);
- return;
+ goto out;
}
#endif /* CONFIG_IEEE80211R_AP */
#ifdef CONFIG_P2P
@@ -3171,7 +3196,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
"DPP: Peer indicated it supports PFS and local configuration allows this, but PFS was not negotiated for the association");
wpa_sta_disconnect(wpa_auth, sm->addr,
WLAN_REASON_PREV_AUTH_NOT_VALID);
- return;
+ goto out;
}
}
#endif /* CONFIG_DPP2 */
@@ -3191,7 +3216,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
sm->sup_pmk_r1_name, WPA_PMK_NAME_LEN);
wpa_hexdump(MSG_DEBUG, "FT: Derived PMKR1Name",
sm->pmk_r1_name, WPA_PMK_NAME_LEN);
- return;
+ goto out;
}
}
#endif /* CONFIG_IEEE80211R_AP */
@@ -3200,7 +3225,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
wpa_auth_update_vlan(wpa_auth, sm->addr, vlan_id) < 0) {
wpa_sta_disconnect(wpa_auth, sm->addr,
WLAN_REASON_PREV_AUTH_NOT_VALID);
- return;
+ goto out;
}
sm->pending_1_of_4_timeout = 0;
@@ -3216,9 +3241,20 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
sm->MICVerified = true;
+#ifdef CONFIG_IEEE80211R_AP
+ if (wpa_key_mgmt_ft(sm->wpa_key_mgmt) && !sm->ft_completed) {
+ wpa_printf(MSG_DEBUG, "FT: Store PMK-R0/PMK-R1");
+ wpa_auth_ft_store_keys(sm, pmk_r0, pmk_r1, pmk_r0_name,
+ key_len);
+ }
+#endif /* CONFIG_IEEE80211R_AP */
+
os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
forced_memzero(&PTK, sizeof(PTK));
sm->PTK_valid = true;
+out:
+ forced_memzero(pmk_r0, sizeof(pmk_r0));
+ forced_memzero(pmk_r1, sizeof(pmk_r1));
}
--- a/src/ap/wpa_auth_ft.c
+++ b/src/ap/wpa_auth_ft.c
@@ -2175,13 +2175,13 @@ int wpa_ft_store_pmk_fils(struct wpa_sta
}
-int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk)
+int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk,
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
+ size_t *key_len)
{
- u8 pmk_r0[PMK_LEN_MAX], pmk_r0_name[WPA_PMK_NAME_LEN];
size_t pmk_r0_len = wpa_key_mgmt_sha384(sm->wpa_key_mgmt) ?
SHA384_MAC_LEN : PMK_LEN;
size_t pmk_r1_len = pmk_r0_len;
- u8 pmk_r1[PMK_LEN_MAX];
u8 ptk_name[WPA_PMK_NAME_LEN];
const u8 *mdid = sm->wpa_auth->conf.mobility_domain;
const u8 *r0kh = sm->wpa_auth->conf.r0_key_holder;
@@ -2189,13 +2189,6 @@ int wpa_auth_derive_ptk_ft(struct wpa_st
const u8 *r1kh = sm->wpa_auth->conf.r1_key_holder;
const u8 *ssid = sm->wpa_auth->conf.ssid;
size_t ssid_len = sm->wpa_auth->conf.ssid_len;
- int psk_local = sm->wpa_auth->conf.ft_psk_generate_local;
- int expires_in = sm->wpa_auth->conf.r0_key_lifetime;
- struct vlan_description vlan;
- struct rate_description rate;
- const u8 *identity, *radius_cui;
- size_t identity_len, radius_cui_len;
- int session_timeout;
const u8 *mpmk;
size_t mpmk_len;
@@ -2211,10 +2204,41 @@ int wpa_auth_derive_ptk_ft(struct wpa_st
return -1;
}
+ *key_len = pmk_r0_len;
+ if (wpa_derive_pmk_r0(mpmk, mpmk_len, ssid, ssid_len, mdid,
+ r0kh, r0kh_len, sm->addr,
+ pmk_r0, pmk_r0_name,
+ pmk_r0_len == SHA384_MAC_LEN) < 0 ||
+ wpa_derive_pmk_r1(pmk_r0, pmk_r0_len, pmk_r0_name, r1kh, sm->addr,
+ pmk_r1, sm->pmk_r1_name) < 0)
+ return -1;
+
+ return wpa_pmk_r1_to_ptk(pmk_r1, pmk_r1_len, sm->SNonce, sm->ANonce,
+ sm->addr, sm->wpa_auth->addr, sm->pmk_r1_name,
+ ptk, ptk_name, sm->wpa_key_mgmt, sm->pairwise,
+ 0);
+}
+
+
+void wpa_auth_ft_store_keys(struct wpa_state_machine *sm, const u8 *pmk_r0,
+ const u8 *pmk_r1, const u8 *pmk_r0_name,
+ size_t key_len)
+{
+ int psk_local = sm->wpa_auth->conf.ft_psk_generate_local;
+ int expires_in = sm->wpa_auth->conf.r0_key_lifetime;
+ struct vlan_description vlan;
+ struct rate_description rate;
+ const u8 *identity, *radius_cui;
+ size_t identity_len, radius_cui_len;
+ int session_timeout;
+
+ if (psk_local && wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
+ return;
+
if (wpa_ft_get_vlan(sm->wpa_auth, sm->addr, &vlan) < 0) {
wpa_printf(MSG_DEBUG, "FT: vlan not available for STA " MACSTR,
MAC2STR(sm->addr));
- return -1;
+ return;
}
wpa_ft_get_rate_limit(sm->wpa_auth, sm->addr, &rate);
@@ -2224,32 +2248,16 @@ int wpa_auth_derive_ptk_ft(struct wpa_st
&radius_cui);
session_timeout = wpa_ft_get_session_timeout(sm->wpa_auth, sm->addr);
- if (wpa_derive_pmk_r0(mpmk, mpmk_len, ssid, ssid_len, mdid,
- r0kh, r0kh_len, sm->addr,
- pmk_r0, pmk_r0_name,
- wpa_key_mgmt_sha384(sm->wpa_key_mgmt)) < 0)
- return -1;
- if (!psk_local || !wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
- wpa_ft_store_pmk_r0(sm->wpa_auth, sm->addr, pmk_r0, pmk_r0_len,
- pmk_r0_name,
- sm->pairwise, &vlan, expires_in,
- session_timeout, identity, identity_len,
- radius_cui, radius_cui_len, &rate);
-
- if (wpa_derive_pmk_r1(pmk_r0, pmk_r0_len, pmk_r0_name, r1kh, sm->addr,
- pmk_r1, sm->pmk_r1_name) < 0)
- return -1;
- if (!psk_local || !wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
- wpa_ft_store_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1, pmk_r1_len,
- sm->pmk_r1_name, sm->pairwise, &vlan,
- expires_in, session_timeout, identity,
- identity_len, radius_cui, radius_cui_len,
- &rate);
-
- return wpa_pmk_r1_to_ptk(pmk_r1, pmk_r1_len, sm->SNonce, sm->ANonce,
- sm->addr, sm->wpa_auth->addr, sm->pmk_r1_name,
- ptk, ptk_name, sm->wpa_key_mgmt, sm->pairwise,
- 0);
+ wpa_ft_store_pmk_r0(sm->wpa_auth, sm->addr, pmk_r0, key_len,
+ pmk_r0_name,
+ sm->pairwise, &vlan, expires_in,
+ session_timeout, identity, identity_len,
+ radius_cui, radius_cui_len, &rate);
+
+ wpa_ft_store_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1, key_len,
+ sm->pmk_r1_name, sm->pairwise, &vlan,
+ expires_in, session_timeout, identity,
+ identity_len, radius_cui, radius_cui_len, &rate);
}
--- a/src/ap/wpa_auth_i.h
+++ b/src/ap/wpa_auth_i.h
@@ -302,7 +302,12 @@ int wpa_write_ftie(struct wpa_auth_confi
const u8 *anonce, const u8 *snonce,
u8 *buf, size_t len, const u8 *subelem,
size_t subelem_len, int rsnxe_used);
-int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk);
+int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk,
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
+ size_t *key_len);
+void wpa_auth_ft_store_keys(struct wpa_state_machine *sm, const u8 *pmk_r0,
+ const u8 *pmk_r1, const u8 *pmk_r0_name,
+ size_t key_len);
struct wpa_ft_pmk_cache * wpa_ft_pmk_cache_init(void);
void wpa_ft_pmk_cache_deinit(struct wpa_ft_pmk_cache *cache);
void wpa_ft_install_ptk(struct wpa_state_machine *sm, int retry);

View File

@@ -24,7 +24,7 @@ cybertan,eww631-a1|\
cybertan,eww631-b1)
ucidef_set_led_default "power" "POWER" "sys:blue" "on"
;;
cybertan,rap630w-312g)
sonicfi,rap630w-312g)
ucidef_set_led_default "power" "POWER" "red:power" "on"
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy0tpt"
ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy1tpt"

View File

@@ -13,10 +13,10 @@ qcom_setup_interfaces()
case $board in
cig,wf186w)
ucidef_add_switch "switch0" "4:wan" "0:lan" "1:lan" "2:lan" "3:lan" "6@eth0"
ucidef_add_switch "switch0" "4:wan" "0:lan" "1:lan" "2:lan" "3:lan" "6u@eth0"
;;
cig,wf186h)
ucidef_add_switch "switch0" "4:wan" "1:lan" "2:lan" "6@eth0"
ucidef_add_switch "switch0" "4:wan" "1:lan" "2:lan" "6u@eth0"
;;
sonicfi,rap630c-311g|\
cybertan,eww631-a1)
@@ -25,7 +25,7 @@ qcom_setup_interfaces()
;;
sonicfi,rap630w-311g|\
cybertan,eww631-b1)
ucidef_add_switch "switch1" "5:wan" "2:lan" "3:lan" "4:lan" "6@eth0"
ucidef_add_switch "switch1" "5:wan" "2:lan" "3:lan" "4:lan" "6u@eth0"
;;
udaya,a6-id2)
ucidef_set_interface_wan "eth1"
@@ -46,7 +46,7 @@ qcom_setup_interfaces()
edgecore,eap104)
ucidef_set_interface_wan "eth0"
ucidef_add_switch "switch1" \
"6@eth1" "1:lan" "2:lan" "3:lan" "4:lan"
"6u@eth1" "1:lan" "2:lan" "3:lan" "4:lan"
;;
hfcl,ion4x_w|\
hfcl,ion4xi_w)
@@ -59,13 +59,13 @@ qcom_setup_interfaces()
ucidef_set_interface_wan "eth0"
ucidef_set_interface_lan "eth1"
;;
cybertan,rap630w-312g|\
sonicfi,rap630w-312g|\
yuncore,fap655)
ucidef_add_switch "switch1" \
"6@eth0" "1:lan" "2:lan" "3:lan" "4:lan" "5:wan"
"6u@eth0" "1:lan" "2:lan" "3:lan" "4:lan" "5:wan"
;;
glinet,b3000)
ucidef_add_switch "switch1" "6@eth1" "1:wan" "2:lan" "3:lan"
ucidef_add_switch "switch1" "6u@eth1" "1:wan" "2:lan" "3:lan"
;;
esac
}

View File

@@ -121,9 +121,9 @@ ath11k/IPQ5018/hw1.0/caldata.bin)
cig,wf186h|\
sonicfi,rap630c-311g|\
sonicfi,rap630w-311g|\
sonicfi,rap630w-312g|\
cybertan,eww631-a1|\
cybertan,eww631-b1|\
cybertan,rap630w-312g|\
edgecore,eap104|\
edgecore,oap101|\
edgecore,oap101-6e|\
@@ -150,9 +150,9 @@ ath11k/qcn6122/hw1.0/caldata_1.bin)
cig,wf186h|\
sonicfi,rap630c-311g|\
sonicfi,rap630w-311g|\
sonicfi,rap630w-312g|\
cybertan,eww631-a1|\
cybertan,eww631-b1|\
cybertan,rap630w-312g|\
edgecore,oap101|\
edgecore,oap101-6e|\
edgecore,oap101e|\
@@ -219,7 +219,7 @@ ath11k-macs)
optimcloud,d60-5g|\
optimcloud,d50|\
optimcloud,d50-5g|\
cybertan,rap630w-312g|\
sonicfi,rap630w-312g|\
yuncore,fap655)
ath11k_generate_macs
;;

View File

@@ -6,26 +6,27 @@ board=$(board_name)
case "$board" in
"edgecore,eap101")
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
;;
"edgecore,eap102")
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
"edgecore,eap102"|\
"edgecore,oap103")
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
;;
"edgecore,oap101e-6e"|\
"edgecore,oap101-6e")
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy6g
;;
"edgecore,oap101e"|\
"edgecore,oap101")
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
;;
"edgecore,eap104")
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
;;
esac

View File

@@ -72,9 +72,9 @@ platform_check_image() {
cig,wf186h|\
sonicfi,rap630c-311g|\
sonicfi,rap630w-311g|\
sonicfi,rap630w-312g|\
cybertan,eww631-a1|\
cybertan,eww631-b1|\
cybertan,rap630w-312g|\
edgecore,eap104|\
wallys,dr5018|\
hfcl,ion4x_w|\
@@ -143,11 +143,11 @@ platform_do_upgrade() {
}
nand_upgrade_tar "$1"
;;
sonicfi,rap630c-311g|\
sonicfi,rap630w-311g|\
cybertan,eww631-a1|\
cybertan,eww631-b1|\
cybertan,rap630w-312g)
sonicfi,rap630c-311g|\
sonicfi,rap630w-311g|\
sonicfi,rap630w-312g)
boot_part=$(fw_printenv bootfrom | cut -d = -f2)
echo "Current bootfrom is $boot_part"
if [[ $boot_part == 1 ]]; then

View File

@@ -22,8 +22,8 @@
/ {
#address-cells = <0x2>;
#size-cells = <0x2>;
model = "Cybertan RAP630W-312G";
compatible = "cybertan,rap630w-312g", "qcom,ipq5018-mp03.3", "qcom,ipq5018";
model = "Sonicfi RAP630W-312G";
compatible = "sonicfi,rap630w-312g", "qcom,ipq5018-mp03.3", "qcom,ipq5018";
interrupt-parent = <&intc>;
aliases {

View File

@@ -40,16 +40,16 @@ define Device/cybertan_eww631_b1
endef
TARGET_DEVICES += cybertan_eww631_b1
define Device/cybertan_rap630w_312g
DEVICE_TITLE := CyberTan RAP630W-312G
define Device/sonicfi_rap630w_312g
DEVICE_TITLE := Sonicfi RAP630W-312G
DEVICE_DTS := qcom-ipq5018-rap630w-312g
SUPPORTED_DEVICES := cybertan,rap630w-312g
DEVICE_PACKAGES := ath11k-wifi-cybertan-rap630w-312g ath11k-firmware-ipq50xx-map-spruce \
SUPPORTED_DEVICES := sonicfi,rap630w-312g
DEVICE_PACKAGES := ath11k-wifi-sonicfi-rap630w-312g ath11k-firmware-ipq50xx-map-spruce \
-kmod-usb-dwc3-of-simple kmod-usb-dwc3-qcom kmod-usb3 \
kmod-usb-uas kmod-fs-msdos kmod-fs-ntfs
DEVICE_DTS_CONFIG := config@mp03.3
endef
TARGET_DEVICES += cybertan_rap630w_312g
TARGET_DEVICES += sonicfi_rap630w_312g
define Device/sonicfi_rap630c_311g
DEVICE_TITLE := Sonicfi RAP630C-311G

View File

@@ -6,26 +6,27 @@ board=$(board_name)
case "$board" in
"edgecore,eap101")
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
;;
"edgecore,eap102")
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
"edgecore,eap102"|\
"edgecore,oap103")
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
;;
"edgecore,oap101e-6e"|\
"edgecore,oap101-6e")
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy6g
;;
"edgecore,oap101e"|\
"edgecore,oap101")
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
;;
"edgecore,eap104")
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
;;
esac

View File

@@ -7,10 +7,11 @@ boot() {
hfcl,ion4xe|\
hfcl,ion4xi)
fw_setenv boot_count 0
;;
;;
edgecore,eap101|\
edgecore,eap102|\
edgecore,oap102|\
edgecore,oap103|\
edgecore,eap104)
avail=$(fw_printenv -n upgrade_available)
[ ${avail} -eq 0 ] && fw_setenv upgrade_available 1

View File

@@ -13,13 +13,15 @@ cig,wf194c4)
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt"
;;
edgecore,eap102|\
edgecore,oap102)
edgecore,oap102|\
edgecore,oap103)
ucidef_set_led_netdev "poe" "poe" "green:wan" "eth0"
ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt"
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt"
ucidef_set_led_wlan "power" "POWER" "green:power" "default-on"
;;
sonicfi,rap630w-311g|\
sonicfi,rap650c|\
cybertan,eww631-b1)
ucidef_set_led_default "power" "POWER" "sys:blue" "on"
;;

View File

@@ -23,6 +23,8 @@ qcom_setup_interfaces()
;;
edgecore,eap102|\
edgecore,oap102|\
edgecore,oap103|\
sonicfi,rap650c|\
cig,wf196)
ucidef_set_interface_lan "eth1"
ucidef_set_interface_wan "eth0"
@@ -49,6 +51,16 @@ qcom_setup_macs()
ip link set eth1 address $lan_mac
ucidef_set_label_macaddr $wan_mac
;;
sonicfi,rap650c)
mac=$(fw_printenv -n BaseMacAddress)
[ -z "$mac" ] && return;
wan_mac=$(macaddr_canonicalize $mac)
lan_mac=$(macaddr_add "$wan_mac" 1)
ucidef_set_network_device_mac eth0 $wan_mac
ucidef_set_network_device_mac eth1 $lan_mac
ip link set eth0 address $wan_mac
ip link set eth1 address $lan_mac
;;
*)
wan_mac=$(cat /sys/class/net/eth0/address)
lan_mac=$(macaddr_add "$wan_mac" 1)

View File

@@ -16,6 +16,20 @@ ath11k_generate_macs() {
echo -ne \\x${mac3//:/\\x} >> /lib/firmware/ath11k-macs
}
ath11k_generate_macs_sonicfi() {
mac=$(fw_printenv -n BaseMacAddress)
[ -z "$mac" ] && return;
touch /lib/firmware/ath11k-macs
eth=$(macaddr_canonicalize $mac)
mac1=$(macaddr_add $eth 2)
mac2=$(macaddr_add $eth 3)
mac3=$(macaddr_add $eth 4)
echo -ne \\x${mac1//:/\\x} >> /lib/firmware/ath11k-macs
echo -ne \\x${mac2//:/\\x} >> /lib/firmware/ath11k-macs
echo -ne \\x${mac3//:/\\x} >> /lib/firmware/ath11k-macs
}
ath11k_generate_macs_wf196() {
touch /lib/firmware/ath11k-macs
mac=$(grep BaseMacAddress= /dev/mtd18 | cut -dx -f2)
@@ -56,12 +70,14 @@ case "$FIRMWARE" in
cig,wf196|\
edgecore,eap102 |\
edgecore,oap102 |\
edgecore,oap103 |\
edgecore,eap106 |\
qcom,ipq807x-hk01|\
qcom,ipq807x-hk14|\
tplink,ex227|\
tplink,ex447|\
yuncore,ax840|\
sonicfi,rap650c|\
sercomm,wallaby)
caldata_extract "0:ART" 0x1000 0x20000
;;
@@ -89,12 +105,16 @@ ath11k-macs)
case "$board" in
edgecore,eap102|\
edgecore,oap102|\
edgecore,oap103|\
edgecore,eap106)
ath11k_generate_macs
;;
cig,wf196)
ath11k_generate_macs_wf196
;;
sonicfi*)
ath11k_generate_macs_sonicfi
;;
esac
;;
ath11k/IPQ8074/hw2.0/board.bin)

View File

@@ -6,26 +6,28 @@ board=$(board_name)
case "$board" in
"edgecore,eap101")
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
;;
"edgecore,eap102")
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
"edgecore,eap102"|\
"edgecore,oap103"|\
"sonicfi,rap650c")
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
;;
"edgecore,oap101e-6e"|\
"edgecore,oap101-6e")
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy6g
;;
"edgecore,oap101e"|\
"edgecore,oap101")
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
;;
"edgecore,eap104")
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
;;
esac

View File

@@ -11,6 +11,7 @@ boot() {
edgecore,eap101|\
edgecore,eap102|\
edgecore,oap102|\
edgecore,oap103|\
edgecore,eap104)
avail=$(fw_printenv -n upgrade_available)
[ ${avail} -eq 0 ] && fw_setenv upgrade_available 1

View File

@@ -27,7 +27,9 @@ platform_check_image() {
cig,wf196|\
edgecore,eap102|\
edgecore,oap102|\
edgecore,oap103|\
edgecore,eap106|\
sonicfi,rap650c|\
tplink,ex227|\
tplink,ex447)
[ "$magic_long" = "73797375" ] && return 0
@@ -63,7 +65,8 @@ platform_do_upgrade() {
nand_upgrade_tar "$1"
;;
edgecore,eap102|\
edgecore,oap102)
edgecore,oap102|\
edgecore,oap103)
if [ "$(find_mtd_chardev rootfs)" ]; then
CI_UBIPART="rootfs"
else
@@ -81,5 +84,17 @@ platform_do_upgrade() {
fi
nand_upgrade_tar "$1"
;;
sonicfi,rap650c)
boot_part=$(fw_printenv -n bootfrom)
[ ${#boot_part} -eq 0 ] && boot_part=0
echo "Current bootfrom is $boot_part"
if [[ $boot_part == 1 ]]; then
CI_UBIPART="rootfs"
CI_FWSETENV="bootfrom 0"
elif [[ $boot_part == 0 ]]; then
CI_UBIPART="rootfs_1"
CI_FWSETENV="bootfrom 1"
fi
nand_upgrade_tar "$1"
esac
}

View File

@@ -0,0 +1,736 @@
// SPDX-License-Identifier: GPL-2.0-only
/dts-v1/;
/* Copyright (c) 2020 The Linux Foundation. All rights reserved.
*/
#include "ipq8074.dtsi"
#include "ipq8074-ac-cpu.dtsi"
/ {
#address-cells = <0x2>;
#size-cells = <0x2>;
model = "Edgecore OAP103";
compatible = "edgecore,oap103", "qcom,ipq807x-ac02", "qcom,ipq807x";
qcom,msm-id = <0x178 0x0>;
interrupt-parent = <&intc>;
aliases {
serial0 = &blsp1_uart5;
/* Aliases as required by u-boot to patch MAC addresses */
ethernet1 = "/soc/dp5";
ethernet0 = "/soc/dp6";
led-boot = &led_power;
led-failsafe = &led_power;
led-running = &led_power;
led-upgrade = &led_power;
};
chosen {
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 {
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 {
reset_button {
pins = "gpio66";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
};
};
mdio_pins: mdio_pinmux {
mux_0 {
pins = "gpio68";
function = "mdc";
drive-strength = <8>;
bias-pull-up;
};
mux_1 {
pins = "gpio69";
function = "mdio";
drive-strength = <8>;
bias-pull-up;
};
mux_2 {
pins = "gpio33";
function = "gpio";
bias-pull-up;
};
mux_3 {
pins = "gpio44";
function = "gpio";
bias-pull-up;
};
};
led_pins: led_pins {
led_2g {
pins = "gpio42";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
led_5g {
pins = "gpio43";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
};
};
serial@78b3000 {
status = "ok";
};
spi@78b5000 {
status = "ok";
pinctrl-0 = <&spi_0_pins>;
pinctrl-names = "default";
cs-select = <0>;
m25p80@0 {
compatible = "n25q128a11";
#address-cells = <1>;
#size-cells = <1>;
reg = <0>;
spi-max-frequency = <50000000>;
};
};
dma@7984000 {
status = "ok";
};
nand@79b0000 {
status = "ok";
nand@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <1>;
nand-ecc-strength = <4>;
nand-ecc-step-size = <512>;
nand-bus-width = <8>;
};
};
qusb@79000 {
status = "ok";
};
ssphy@78000 {
status = "ok";
};
usb3@8A00000 {
status = "ok";
};
usb3@8C00000 {
status = "ok";
};
qusb@59000 {
status = "ok";
};
ssphy@58000 {
status = "ok";
};
usb3@8C00000 {
status = "ok";
};
gpio_keys {
compatible = "gpio-keys";
pinctrl-0 = <&button_pins>;
pinctrl-names = "default";
status = "ok";
button@1 {
label = "reset";
linux,code = <KEY_RESTART>;
gpios = <&tlmm 66 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
debounce-interval = <60>;
};
};
mdio: mdio@90000 {
pinctrl-0 = <&mdio_pins>;
pinctrl-names = "default";
phy-reset-gpio = <&tlmm 37 0 &tlmm 25 1 &tlmm 44 1>;
phy0: ethernet-phy@0 {
reg = <0>;
};
phy1: ethernet-phy@1 {
reg = <1>;
};
phy2: ethernet-phy@2 {
reg = <2>;
};
phy3: ethernet-phy@3 {
reg = <3>;
};
phy4: ethernet-phy@4 {
reg = <24>;
};
phy5: ethernet-phy@5 {
reg = <28>;
};
};
ess-switch@3a000000 {
switch_cpu_bmp = <0x1>; /* cpu port bitmap */
switch_lan_bmp = <0x3e>; /* lan port bitmap */
switch_wan_bmp = <0x40>; /* wan port bitmap */
switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/
switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/
switch_mac_mode2 = <0xf>; /* mac mode for uniphy instance2*/
bm_tick_mode = <0>; /* bm tick mode */
tm_tick_mode = <0>; /* tm tick mode */
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 = <24>;
port_mac_sel = "QGMAC_PORT";
};
port@5 {
port_id = <6>;
phy_address = <28>;
port_mac_sel = "QGMAC_PORT";
};
};
port_scheduler_resource {
port@0 {
port_id = <0>;
ucast_queue = <0 143>;
mcast_queue = <256 271>;
l0sp = <0 35>;
l0cdrr = <0 47>;
l0edrr = <0 47>;
l1cdrr = <0 7>;
l1edrr = <0 7>;
};
port@1 {
port_id = <1>;
ucast_queue = <144 159>;
mcast_queue = <272 275>;
l0sp = <36 39>;
l0cdrr = <48 63>;
l0edrr = <48 63>;
l1cdrr = <8 11>;
l1edrr = <8 11>;
};
port@2 {
port_id = <2>;
ucast_queue = <160 175>;
mcast_queue = <276 279>;
l0sp = <40 43>;
l0cdrr = <64 79>;
l0edrr = <64 79>;
l1cdrr = <12 15>;
l1edrr = <12 15>;
};
port@3 {
port_id = <3>;
ucast_queue = <176 191>;
mcast_queue = <280 283>;
l0sp = <44 47>;
l0cdrr = <80 95>;
l0edrr = <80 95>;
l1cdrr = <16 19>;
l1edrr = <16 19>;
};
port@4 {
port_id = <4>;
ucast_queue = <192 207>;
mcast_queue = <284 287>;
l0sp = <48 51>;
l0cdrr = <96 111>;
l0edrr = <96 111>;
l1cdrr = <20 23>;
l1edrr = <20 23>;
};
port@5 {
port_id = <5>;
ucast_queue = <208 223>;
mcast_queue = <288 291>;
l0sp = <52 55>;
l0cdrr = <112 127>;
l0edrr = <112 127>;
l1cdrr = <24 27>;
l1edrr = <24 27>;
};
port@6 {
port_id = <6>;
ucast_queue = <224 239>;
mcast_queue = <292 295>;
l0sp = <56 59>;
l0cdrr = <128 143>;
l0edrr = <128 143>;
l1cdrr = <28 31>;
l1edrr = <28 31>;
};
port@7 {
port_id = <7>;
ucast_queue = <240 255>;
mcast_queue = <296 299>;
l0sp = <60 63>;
l0cdrr = <144 159>;
l0edrr = <144 159>;
l1cdrr = <32 35>;
l1edrr = <32 35>;
};
};
port_scheduler_config {
port@0 {
port_id = <0>;
l1scheduler {
group@0 {
sp = <0 1>; /*L0 SPs*/
/*cpri cdrr epri edrr*/
cfg = <0 0 0 0>;
};
};
l0scheduler {
group@0 {
/*unicast queues*/
ucast_queue = <0 4 8>;
/*multicast queues*/
mcast_queue = <256 260>;
/*sp cpri cdrr epri edrr*/
cfg = <0 0 0 0 0>;
};
group@1 {
ucast_queue = <1 5 9>;
mcast_queue = <257 261>;
cfg = <0 1 1 1 1>;
};
group@2 {
ucast_queue = <2 6 10>;
mcast_queue = <258 262>;
cfg = <0 2 2 2 2>;
};
group@3 {
ucast_queue = <3 7 11>;
mcast_queue = <259 263>;
cfg = <0 3 3 3 3>;
};
};
};
port@1 {
port_id = <1>;
l1scheduler {
group@0 {
sp = <36>;
cfg = <0 8 0 8>;
};
group@1 {
sp = <37>;
cfg = <1 9 1 9>;
};
};
l0scheduler {
group@0 {
ucast_queue = <144>;
ucast_loop_pri = <16>;
mcast_queue = <272>;
mcast_loop_pri = <4>;
cfg = <36 0 48 0 48>;
};
};
};
port@2 {
port_id = <2>;
l1scheduler {
group@0 {
sp = <40>;
cfg = <0 12 0 12>;
};
group@1 {
sp = <41>;
cfg = <1 13 1 13>;
};
};
l0scheduler {
group@0 {
ucast_queue = <160>;
ucast_loop_pri = <16>;
mcast_queue = <276>;
mcast_loop_pri = <4>;
cfg = <40 0 64 0 64>;
};
};
};
port@3 {
port_id = <3>;
l1scheduler {
group@0 {
sp = <44>;
cfg = <0 16 0 16>;
};
group@1 {
sp = <45>;
cfg = <1 17 1 17>;
};
};
l0scheduler {
group@0 {
ucast_queue = <176>;
ucast_loop_pri = <16>;
mcast_queue = <280>;
mcast_loop_pri = <4>;
cfg = <44 0 80 0 80>;
};
};
};
port@4 {
port_id = <4>;
l1scheduler {
group@0 {
sp = <48>;
cfg = <0 20 0 20>;
};
group@1 {
sp = <49>;
cfg = <1 21 1 21>;
};
};
l0scheduler {
group@0 {
ucast_queue = <192>;
ucast_loop_pri = <16>;
mcast_queue = <284>;
mcast_loop_pri = <4>;
cfg = <48 0 96 0 96>;
};
};
};
port@5 {
port_id = <5>;
l1scheduler {
group@0 {
sp = <52>;
cfg = <0 24 0 24>;
};
group@1 {
sp = <53>;
cfg = <1 25 1 25>;
};
};
l0scheduler {
group@0 {
ucast_queue = <208>;
ucast_loop_pri = <16>;
mcast_queue = <288>;
mcast_loop_pri = <4>;
cfg = <52 0 112 0 112>;
};
};
};
port@6 {
port_id = <6>;
l1scheduler {
group@0 {
sp = <56>;
cfg = <0 28 0 28>;
};
group@1 {
sp = <57>;
cfg = <1 29 1 29>;
};
};
l0scheduler {
group@0 {
ucast_queue = <224>;
ucast_loop_pri = <16>;
mcast_queue = <292>;
mcast_loop_pri = <4>;
cfg = <56 0 128 0 128>;
};
};
};
port@7 {
port_id = <7>;
l1scheduler {
group@0 {
sp = <60>;
cfg = <0 32 0 32>;
};
group@1 {
sp = <61>;
cfg = <1 33 1 33>;
};
};
l0scheduler {
group@0 {
ucast_queue = <240>;
ucast_loop_pri = <16>;
mcast_queue = <296>;
cfg = <60 0 144 0 144>;
};
};
};
};
};
dp6 {
device_type = "network";
compatible = "qcom,nss-dp";
qcom,id = <6>;
reg = <0x3a001800 0x200>;
qcom,mactype = <0>;
local-mac-address = [000000000000];
qcom,link-poll = <1>;
qcom,phy-mdio-addr = <28>;
phy-mode = "sgmii";
};
dp5 {
device_type = "network";
compatible = "qcom,nss-dp";
qcom,id = <5>;
reg = <0x3a001a00 0x200>;
qcom,mactype = <0>;
local-mac-address = [000000000000];
qcom,link-poll = <1>;
qcom,phy-mdio-addr = <24>;
phy-mode = "sgmii";
};
leds {
compatible = "gpio-leds";
pinctrl-0 = <&led_pins>;
pinctrl-names = "default";
led_pwr {
label = "green:wan";
gpios = <&tlmm 46 GPIO_ACTIVE_HIGH>;
default-state = "off";
linux,default-trigger = "led_pwr";
};
led_2g {
label = "green:wifi2";
gpio = <&tlmm 47 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led_5g {
label = "green:wifi5";
gpio = <&tlmm 48 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led_power: led_bt {
gpios = <&tlmm 50 GPIO_ACTIVE_HIGH>;
label = "green:power";
default-state = "on";
linux,default-trigger = "led_bt";
};
};
nss-macsec0 {
compatible = "qcom,nss-macsec";
phy_addr = <0x18>;
mdiobus = <&mdio>;
};
nss-macsec1 {
compatible = "qcom,nss-macsec";
phy_addr = <0x1c>;
mdiobus = <&mdio>;
};
};
};
&apc_cpr {
/* Same CPR configuration as OAK */
compatible = "qcom,cpr4-ipq817x-apss-regulator";
thread@0 {
apc_vreg: regulator {
regulator-min-microvolt = <1>;
regulator-max-microvolt = <2>;
qcom,cpr-fuse-corners = <2>;
qcom,cpr-corners = <3>;
qcom,cpr-speed-bin-corners = <3>;
qcom,cpr-corner-fmax-map = <1 3>;
qcom,cpr-voltage-ceiling =
<840000 904000 944000>;
qcom,cpr-voltage-floor =
<592000 648000 712000>;
qcom,corner-frequencies =
<1017600000 1382400000 1382400000>;
qcom,cpr-open-loop-voltage-fuse-adjustment-0 =
/* Speed bin 0; CPR rev 0..7 */
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>;
qcom,cpr-open-loop-voltage-fuse-adjustment-1 =
/* Speed bin 0; CPR rev 0..7 */
< 0 0>,
< 0 0>,
< 0 0>,
< 20000 26000>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>;
qcom,cpr-open-loop-voltage-fuse-adjustment-v2-0 =
/* Speed bin 0; CPR rev 0..7 */
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>;
qcom,cpr-open-loop-voltage-fuse-adjustment-v2-1 =
/* Speed bin 0; CPR rev 0..7 */
< 0 0>,
< 0 7000>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>,
< 0 0>;
qcom,cpr-floor-to-ceiling-max-range =
< 40000 40000 40000>,
< 40000 40000 40000>,
< 40000 40000 40000>,
< 40000 40000 40000>,
< 40000 40000 40000>,
< 40000 40000 40000>,
< 40000 40000 40000>,
< 40000 40000 40000>;
};
};
};
&npu_cpr {
status = "disabled";
};
&nss0 {
qcom,low-frequency = <187200000>;
qcom,mid-frequency = <748800000>;
qcom,max-frequency = <1497600000>;
};
&nss0 {
npu-supply = <&dummy_reg>;
mx-supply = <&dummy_reg>;
};
&wifi0 {
qcom,board_id = <0x92>;
};
&wifi1 {
qcom,board_id = <0x292>;
};

View File

@@ -0,0 +1,650 @@
// SPDX-License-Identifier: GPL-2.0-only
/dts-v1/;
/* Copyright (c) 2020 The Linux Foundation. All rights reserved.
*/
#include "ipq8074.dtsi"
#include "ipq8074-hk-cpu.dtsi"
/ {
#address-cells = <0x2>;
#size-cells = <0x2>;
model = "SonicFi RAP650C";
compatible = "sonicfi,rap650c", "qcom,ipq8074-ap-hk09", "qcom,ipq8074";
qcom,msm-id = <0x157 0x0>, <0x187 0x0>;
interrupt-parent = <&intc>;
aliases {
serial0 = &blsp1_uart5;
/* Aliases as required by u-boot to patch MAC addresses */
ethernet0 = "/soc/dp1";
ethernet1 = "/soc/dp2";
led-boot = &led_power;
led-failsafe = &led_power;
led-running = &led_power;
led-upgrade = &led_power;
};
chosen {
stdout-path = "serial0";
};
soc {
pinctrl@1000000 {
button_pins: button_pins {
reset_button {
pins = "gpio57";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
};
};
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 {
mux_0 {
pins = "gpio68";
function = "mdc";
drive-strength = <8>;
bias-pull-up;
};
mux_1 {
pins = "gpio69";
function = "mdio";
drive-strength = <8>;
bias-pull-up;
};
mux_2 {
pins = "gpio25";
function = "gpio";
bias-pull-up;
};
mux_3 {
pins = "gpio44";
function = "gpio";
bias-pull-up;
};
};
led_pins: led_pins {
red {
pins = "gpio0";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
green {
pins = "gpio2";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
blue {
pins = "gpio9";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
};
spi_3_pins: spi_3_pins {
mux {
pins = "gpio50", "gpio52", "gpio53";
function = "blsp3_spi";
drive-strength = <8>;
bias-disable;
};
spi_cs {
pins = "gpio22";
function = "blsp3_spi2";
drive-strength = <8>;
bias-disable;
};
quartz_interrupt {
pins = "gpio47";
function = "gpio";
input;
bias-disable;
};
quartz_reset {
pins = "gpio21";
function = "gpio";
output-low;
bias-disable;
};
};
};
serial@78b3000 {
status = "ok";
};
dp1 {
device_type = "network";
compatible = "qcom,nss-dp";
qcom,id = <5>;
reg = <0x3a001800 0x200>;
qcom,mactype = <0>;
local-mac-address = [000000000000];
qcom,link-poll = <1>;
qcom,phy-mdio-addr = <24>;
phy-mode = "sgmii";
};
dp2 {
device_type = "network";
compatible = "qcom,nss-dp";
qcom,id = <6>;
reg = <0x3a001a00 0x200>;
qcom,mactype = <0>;
local-mac-address = [000000000000];
qcom,link-poll = <1>;
qcom,phy-mdio-addr = <28>;
phy-mode = "sgmii";
};
spi@78b5000 {
status = "ok";
pinctrl-0 = <&spi_0_pins>;
pinctrl-names = "default";
cs-select = <0>;
m25p80@0 {
compatible = "n25q128a11";
#address-cells = <1>;
#size-cells = <1>;
reg = <0>;
spi-max-frequency = <50000000>;
};
};
spi@78b8000 {
status = "ok";
pinctrl-0 = <&spi_3_pins>;
pinctrl-names = "default";
cs-select = <2>;
quartz-reset-gpio = <&tlmm 21 1>;
spidev3: spi@3 {
compatible = "qti,spidev";
reg = <0>;
spi-max-frequency = <24000000>;
};
};
dma@7984000 {
status = "ok";
};
nand@79b0000 {
status = "ok";
nand@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <1>;
nand-ecc-strength = <4>;
nand-ecc-step-size = <512>;
nand-bus-width = <8>;
};
};
qusb@79000 {
status = "ok";
};
ssphy@78000 {
status = "ok";
};
usb3@8A00000 {
status = "ok";
};
qusb@59000 {
status = "ok";
};
ssphy@58000 {
status = "ok";
};
usb3@8C00000 {
status = "ok";
};
phy@84000 {
status = "ok";
};
phy@86000 {
status = "ok";
};
pci@20000000 {
perst-gpio = <&tlmm 58 1>;
status = "ok";
};
gpio_keys {
compatible = "gpio-keys";
pinctrl-0 = <&button_pins>;
pinctrl-names = "default";
status = "ok";
button@1 {
label = "reset";
linux,code = <KEY_RESTART>;
gpios = <&tlmm 57 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
debounce-interval = <60>;
};
};
leds {
compatible = "gpio-leds";
pinctrl-0 = <&led_pins>;
pinctrl-names = "default";
red {
label = "sys:red";
gpio = <&tlmm 0 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
green {
label = "sys:green";
gpio = <&tlmm 2 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led_power: blue {
label = "sys:blue";
gpio = <&tlmm 9 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
};
mdio: mdio@90000 {
pinctrl-0 = <&mdio_pins>;
pinctrl-names = "default";
phy-reset-gpio = <&tlmm 37 0 &tlmm 25 0 &tlmm 44 0>;
phy0: ethernet-phy@0 {
reg = <0>;
};
phy1: ethernet-phy@1 {
reg = <1>;
};
phy2: ethernet-phy@2 {
reg = <2>;
};
phy3: ethernet-phy@3 {
reg = <3>;
};
phy4: ethernet-phy@4 {
reg = <24>;
};
phy5: ethernet-phy@5 {
reg = <28>;
};
};
ess-switch@3a000000 {
switch_cpu_bmp = <0x1>; /* cpu port bitmap */
switch_lan_bmp = <0x3e>; /* lan port bitmap */
switch_wan_bmp = <0x40>; /* wan port bitmap */
switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/
switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/
switch_mac_mode2 = <0xf>; /* mac mode for uniphy instance2*/
bm_tick_mode = <0>; /* bm tick mode */
tm_tick_mode = <0>; /* tm tick mode */
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 = <24>;
port_mac_sel = "QGMAC_PORT";
};
port@5 {
port_id = <6>;
phy_address = <28>;
port_mac_sel = "QGMAC_PORT";
};
};
port_scheduler_resource {
port@0 {
port_id = <0>;
ucast_queue = <0 143>;
mcast_queue = <256 271>;
l0sp = <0 35>;
l0cdrr = <0 47>;
l0edrr = <0 47>;
l1cdrr = <0 7>;
l1edrr = <0 7>;
};
port@1 {
port_id = <1>;
ucast_queue = <144 159>;
mcast_queue = <272 275>;
l0sp = <36 39>;
l0cdrr = <48 63>;
l0edrr = <48 63>;
l1cdrr = <8 11>;
l1edrr = <8 11>;
};
port@2 {
port_id = <2>;
ucast_queue = <160 175>;
mcast_queue = <276 279>;
l0sp = <40 43>;
l0cdrr = <64 79>;
l0edrr = <64 79>;
l1cdrr = <12 15>;
l1edrr = <12 15>;
};
port@3 {
port_id = <3>;
ucast_queue = <176 191>;
mcast_queue = <280 283>;
l0sp = <44 47>;
l0cdrr = <80 95>;
l0edrr = <80 95>;
l1cdrr = <16 19>;
l1edrr = <16 19>;
};
port@4 {
port_id = <4>;
ucast_queue = <192 207>;
mcast_queue = <284 287>;
l0sp = <48 51>;
l0cdrr = <96 111>;
l0edrr = <96 111>;
l1cdrr = <20 23>;
l1edrr = <20 23>;
};
port@5 {
port_id = <5>;
ucast_queue = <208 223>;
mcast_queue = <288 291>;
l0sp = <52 55>;
l0cdrr = <112 127>;
l0edrr = <112 127>;
l1cdrr = <24 27>;
l1edrr = <24 27>;
};
port@6 {
port_id = <6>;
ucast_queue = <224 239>;
mcast_queue = <292 295>;
l0sp = <56 59>;
l0cdrr = <128 143>;
l0edrr = <128 143>;
l1cdrr = <28 31>;
l1edrr = <28 31>;
};
port@7 {
port_id = <7>;
ucast_queue = <240 255>;
mcast_queue = <296 299>;
l0sp = <60 63>;
l0cdrr = <144 159>;
l0edrr = <144 159>;
l1cdrr = <32 35>;
l1edrr = <32 35>;
};
};
port_scheduler_config {
port@0 {
port_id = <0>;
l1scheduler {
group@0 {
sp = <0 1>; /*L0 SPs*/
/*cpri cdrr epri edrr*/
cfg = <0 0 0 0>;
};
};
l0scheduler {
group@0 {
/*unicast queues*/
ucast_queue = <0 4 8>;
/*multicast queues*/
mcast_queue = <256 260>;
/*sp cpri cdrr epri edrr*/
cfg = <0 0 0 0 0>;
};
group@1 {
ucast_queue = <1 5 9>;
mcast_queue = <257 261>;
cfg = <0 1 1 1 1>;
};
group@2 {
ucast_queue = <2 6 10>;
mcast_queue = <258 262>;
cfg = <0 2 2 2 2>;
};
group@3 {
ucast_queue = <3 7 11>;
mcast_queue = <259 263>;
cfg = <0 3 3 3 3>;
};
};
};
port@1 {
port_id = <1>;
l1scheduler {
group@0 {
sp = <36>;
cfg = <0 8 0 8>;
};
group@1 {
sp = <37>;
cfg = <1 9 1 9>;
};
};
l0scheduler {
group@0 {
ucast_queue = <144>;
ucast_loop_pri = <16>;
mcast_queue = <272>;
mcast_loop_pri = <4>;
cfg = <36 0 48 0 48>;
};
};
};
port@2 {
port_id = <2>;
l1scheduler {
group@0 {
sp = <40>;
cfg = <0 12 0 12>;
};
group@1 {
sp = <41>;
cfg = <1 13 1 13>;
};
};
l0scheduler {
group@0 {
ucast_queue = <160>;
ucast_loop_pri = <16>;
mcast_queue = <276>;
mcast_loop_pri = <4>;
cfg = <40 0 64 0 64>;
};
};
};
port@3 {
port_id = <3>;
l1scheduler {
group@0 {
sp = <44>;
cfg = <0 16 0 16>;
};
group@1 {
sp = <45>;
cfg = <1 17 1 17>;
};
};
l0scheduler {
group@0 {
ucast_queue = <176>;
ucast_loop_pri = <16>;
mcast_queue = <280>;
mcast_loop_pri = <4>;
cfg = <44 0 80 0 80>;
};
};
};
port@4 {
port_id = <4>;
l1scheduler {
group@0 {
sp = <48>;
cfg = <0 20 0 20>;
};
group@1 {
sp = <49>;
cfg = <1 21 1 21>;
};
};
l0scheduler {
group@0 {
ucast_queue = <192>;
ucast_loop_pri = <16>;
mcast_queue = <284>;
mcast_loop_pri = <4>;
cfg = <48 0 96 0 96>;
};
};
};
port@5 {
port_id = <5>;
l1scheduler {
group@0 {
sp = <52>;
cfg = <0 24 0 24>;
};
group@1 {
sp = <53>;
cfg = <1 25 1 25>;
};
};
l0scheduler {
group@0 {
ucast_queue = <208>;
ucast_loop_pri = <16>;
mcast_queue = <288>;
mcast_loop_pri = <4>;
cfg = <52 0 112 0 112>;
};
};
};
port@6 {
port_id = <6>;
l1scheduler {
group@0 {
sp = <56>;
cfg = <0 28 0 28>;
};
group@1 {
sp = <57>;
cfg = <1 29 1 29>;
};
};
l0scheduler {
group@0 {
ucast_queue = <224>;
ucast_loop_pri = <16>;
mcast_queue = <292>;
mcast_loop_pri = <4>;
cfg = <56 0 128 0 128>;
};
};
};
port@7 {
port_id = <7>;
l1scheduler {
group@0 {
sp = <60>;
cfg = <0 32 0 32>;
};
group@1 {
sp = <61>;
cfg = <1 33 1 33>;
};
};
l0scheduler {
group@0 {
ucast_queue = <240>;
ucast_loop_pri = <16>;
mcast_queue = <296>;
cfg = <60 0 144 0 144>;
};
};
};
};
};
nss-macsec0 {
compatible = "qcom,nss-macsec";
phy_addr = <0x18>;
phy_access_mode = <0>;
mdiobus = <&mdio>;
};
nss-macsec1 {
compatible = "qcom,nss-macsec";
phy_addr = <0x1c>;
phy_access_mode = <0>;
mdiobus = <&mdio>;
};
};
};
&wifi0 {
qcom,board_id = <0x90>;
};
&wifi1 {
qcom,board_id = <0x290>;
};

View File

@@ -39,6 +39,15 @@ define Device/edgecore_oap102
endef
TARGET_DEVICES += edgecore_oap102
define Device/edgecore_oap103
DEVICE_TITLE := Edgecore OAP103
DEVICE_DTS := qcom-ipq807x-oap103
DEVICE_DTS_CONFIG=config@ac02
SUPPORTED_DEVICES := edgecore,oap103
DEVICE_PACKAGES := ath11k-wifi-edgecore-oap103 kmod-usb2 kmod-usb3 uboot-envtools
endef
TARGET_DEVICES += edgecore_oap103
define Device/edgecore_eap106
DEVICE_TITLE := Edgecore EAP106
DEVICE_DTS := qcom-ipq807x-eap106
@@ -48,6 +57,17 @@ define Device/edgecore_eap106
endef
#TARGET_DEVICES += edgecore_eap106
define Device/sonicfi_rap650c
DEVICE_TITLE := SonicFi RAP650C
DEVICE_DTS := qcom-ipq807x-rap650c
DEVICE_DTS_CONFIG=config@hk09
SUPPORTED_DEVICES := sonicfi,rap650c
DEVICE_PACKAGES := ath11k-wifi-sonicfi-rap650c uboot-envtools
IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi
IMAGE/nand-factory.ubi := append-ubi
endef
TARGET_DEVICES += sonicfi_rap650c
define Device/tplink_ex227
DEVICE_TITLE := TP-Link EX227
DEVICE_DTS := qcom-ipq807x-ex227

View File

@@ -1,48 +1,113 @@
--- a/drivers/net/wireless/ath/ath11k/peer.c
+++ b/drivers/net/wireless/ath/ath11k/peer.c
@@ -93,6 +93,25 @@ struct ath11k_peer *ath11k_peer_find_by_
return NULL;
}
Index: backports-20210222_001-5.4.164-b157d2276/drivers/net/wireless/ath/ath11k/peer.c
===================================================================
--- backports-20210222_001-5.4.164-b157d2276.orig/drivers/net/wireless/ath/ath11k/peer.c
+++ backports-20210222_001-5.4.164-b157d2276/drivers/net/wireless/ath/ath11k/peer.c
@@ -789,8 +789,6 @@ int ath11k_peer_delete(struct ath11k *ar
#endif
lockdep_assert_held(&ar->conf_mutex);
+struct ath11k_peer *ath11k_peer_find_by_pdev_idx(struct ath11k_base *ab,
+ u8 pdev_idx, const u8 *addr)
+{
+ struct ath11k_peer *peer;
- reinit_completion(&ar->peer_delete_done);
-
ath11k_nss_peer_delete(ar->ab, vdev_id, addr);
#ifdef CCPTCFG_ATH11K_NSS_SUPPORTPTCFG_ATH11K_NSS_SUPPORT
mutex_lock(&ar->ab->base_ast_lock);
@@ -799,33 +797,60 @@ int ath11k_peer_delete(struct ath11k *ar
spin_lock_bh(&ar->ab->base_lock);
peer = ath11k_peer_find_by_addr(ar->ab, addr);
- if (peer) {
+ /* Check if the found peer is what we want to remove.
+ * While the sta is transitioning to another band we may
+ * have 2 peer with the same addr assigned to different
+ * vdev_id. Make sure we are deleting the correct peer.
+ */
+ if (peer && peer->vdev_id == vdev_id)
+ ath11k_peer_rhash_delete(ar->ab, peer);
+
+ lockdep_assert_held(&ab->base_lock);
+ /* Fallback to peer list search if the correct peer can't be found.
+ * Skip the deletion of the peer from the rhash since it has already
+ * been deleted in peer add.
+ */
+ if (!peer)
+ peer = ath11k_peer_find(ar->ab, vdev_id, addr);
+
+ list_for_each_entry(peer, &ab->peers, list) {
+ if (peer->pdev_idx != pdev_idx)
+ continue;
+ if (!ether_addr_equal(peer->addr, addr))
+ continue;
+
+ return peer;
+ if (!peer) {
+ spin_unlock_bh(&ar->ab->base_lock);
+ mutex_unlock(&ar->ab->tbl_mtx_lock);
#ifdef CPTCFG_ATH11K_NSS_SUPPORT
- peer->delete_in_progress = true;
- if (peer->self_ast_entry) {
- ath11k_peer_del_ast(ar, peer->self_ast_entry);
- peer->self_ast_entry = NULL;
- }
+ mutex_unlock(&ar->ab->base_ast_lock);
+#endif
+ ath11k_warn(ar->ab,
+ "failed to find peer vdev_id %d addr %pM in delete\n",
+ vdev_id, addr);
+ return -EINVAL;
+ }
+
+#ifdef CPTCFG_ATH11K_NSS_SUPPORT
+ peer->delete_in_progress = true;
+ if (peer->self_ast_entry) {
+ ath11k_peer_del_ast(ar, peer->self_ast_entry);
+ peer->self_ast_entry = NULL;
+ }
- list_for_each_entry_safe(ast_entry, tmp_ast,
- &peer->ast_entry_list, ase_list)
- if ((ast_entry->type == ATH11K_AST_TYPE_WDS) ||
- (ast_entry->type == ATH11K_AST_TYPE_MEC)) {
- if (!list_empty(&ast_entry->wmi_list)) {
- ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
- "%s deleting unprocessed ast entry %pM of peer %pM from wmi list\n",
- __func__, ast_entry->addr, addr);
- list_del_init(&ast_entry->wmi_list);
- }
+ list_for_each_entry_safe(ast_entry, tmp_ast,
+ &peer->ast_entry_list, ase_list)
+ if ((ast_entry->type == ATH11K_AST_TYPE_WDS) ||
+ (ast_entry->type == ATH11K_AST_TYPE_MEC)) {
+ if (!list_empty(&ast_entry->wmi_list)) {
+ ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
+ "%s deleting unprocessed ast entry %pM of peer %pM from wmi list\n",
+ __func__, ast_entry->addr, addr);
+ list_del_init(&ast_entry->wmi_list);
}
+ }
#endif
- ath11k_peer_rhash_delete(ar->ab, peer);
- }
spin_unlock_bh(&ar->ab->base_lock);
mutex_unlock(&ar->ab->tbl_mtx_lock);
#ifdef CPTCFG_ATH11K_NSS_SUPPORT
mutex_unlock(&ar->ab->base_ast_lock);
#endif
+ reinit_completion(&ar->peer_delete_done);
+
+ return NULL;
+}
+
struct ath11k_peer *ath11k_peer_find_by_ast(struct ath11k_base *ab,
int ast_hash)
{
@@ -867,13 +886,21 @@ int ath11k_peer_create(struct ath11k *ar
ret = ath11k_wmi_send_peer_delete_cmd(ar, addr, vdev_id);
if (ret) {
ath11k_warn(ar->ab,
@@ -866,14 +891,20 @@ int ath11k_peer_create(struct ath11k *ar
"failed to create peer due to insufficient peer entry resource in firmware\n");
return -ENOBUFS;
}
-
+ mutex_lock(&ar->ab->tbl_mtx_lock);
spin_lock_bh(&ar->ab->base_lock);
- peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr);
+ peer = ath11k_peer_find_by_pdev_idx(ar->ab, ar->pdev_idx, param->peer_addr);
peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr);
if (peer) {
spin_unlock_bh(&ar->ab->base_lock);
+ mutex_unlock(&ar->ab->tbl_mtx_lock);
return -EINVAL;
}
+
+ peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr);
+ if (peer)
- spin_unlock_bh(&ar->ab->base_lock);
- return -EINVAL;
+ if (peer->vdev_id == param->vdev_id) {
+ spin_unlock_bh(&ar->ab->base_lock);
+ mutex_unlock(&ar->ab->tbl_mtx_lock);
+ return -EINVAL;
+ }
+ ath11k_peer_rhash_delete(ar->ab, peer);
}
+
spin_unlock_bh(&ar->ab->base_lock);
+ mutex_unlock(&ar->ab->tbl_mtx_lock);

View File

@@ -0,0 +1,36 @@
From 93d02017c444d9bcb5e319ba6d9dac5794529cdd Mon Sep 17 00:00:00 2001
From: Venkat Chimata <venkata@shasta.cloud>
Date: Fri, 19 Jul 2024 18:43:19 +0530
Subject: [PATCH] mac80211: workaround: Send multicast frames as multiple
unicast frames in DVLAN mode
Broadcast / Multciast transmission is not working in DVLAN mode in the driver.
If we send the frames as unicast frames, it works. This is a workaround for now.
Need to rollback once we add a clean fix.
Signed-off-by: Venkat Chimata <venkata@shasta.cloud>
---
net/mac80211/tx.c | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 9e978f9..6ebf9c2 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -4197,11 +4197,8 @@ static bool ieee80211_multicast_to_unicast(struct sk_buff *skb,
switch (sdata->vif.type) {
case NL80211_IFTYPE_AP_VLAN:
- if (sdata->u.vlan.sta)
- return false;
- if (sdata->wdev.use_4addr)
- return false;
- fallthrough;
+ // For now always enable multicast_to_unicast in DVLAN
+ return true;
case NL80211_IFTYPE_AP:
/* check runtime toggle for this bss */
if (!sdata->bss->multicast_to_unicast)
--
2.34.1

View File

@@ -0,0 +1,12 @@
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -543,6 +543,9 @@ ieee80211_get_sband_iftype_data(const st
if (WARN_ON(iftype >= NL80211_IFTYPE_MAX))
return NULL;
+ if (iftype == NL80211_IFTYPE_AP_VLAN)
+ iftype = NL80211_IFTYPE_AP;
+
for (i = 0; i < sband->n_iftype_data; i++) {
const struct ieee80211_sband_iftype_data *data =
&sband->iftype_data[i];

View File

@@ -1,37 +0,0 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=ath11k-firmware
PKG_SOURCE_PROTO:=git
PKG_BRANCH:=main
PKG_SOURCE_URL:=https://github.com/quic/upstream-wifi-fw.git
PKG_MIRROR_HASH:=557505744764b0442c887be3f5bb0ce924323d785b6d207899f19fad992a6020
PKG_SOURCE_VERSION:=3417bb86645c5ff4c58258db7cc33e43260b4222
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
include $(INCLUDE_DIR)/package.mk
define Package/ath11k-firmware-default
SECTION:=firmware
CATEGORY:=Firmware
URL:=$(PKG_SOURCE_URL)
DEPENDS:=
endef
define Package/ath11k-firmware-ipq95xx
$(Package/ath11k-firmware-default)
TITLE:=ath11k firmware for IPQ95xx devices
DEPENDS:=@TARGET_ipq95xx
endef
define Build/Compile
endef
define Package/ath11k-firmware-ipq95xx/install
$(INSTALL_DIR) $(1)/lib/firmware/IPQ9574/
$(INSTALL_DATA) $(PKG_BUILD_DIR)/ath11k-firmware/IPQ9574/hw1.0/2.9.0.1/WLAN.HK.2.9.0.1-01890-QCAHKSWPL_SILICONZ-1/* \
$(1)/lib/firmware/IPQ9574/
endef
$(eval $(call BuildPackage,ath11k-firmware-ipq95xx))

View File

@@ -1,36 +0,0 @@
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/version.mk
PKG_NAME:=ath11k-wifi
PKG_RELEASE:=1
PKG_FLAGS:=nonshared
include $(INCLUDE_DIR)/package.mk
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
endef
define Build/Compile
endef
define Package/ath11k-wifi-default
SUBMENU:=ath11k Board-Specific Overrides
SECTION:=firmware
CATEGORY:=Firmware
DEPENDS:=@TARGET_ipq95xx
TITLE:=Custom Board
endef
define Package/ath11k-wifi-qcom-ipq95xx
$(call Package/ath11k-wifi-default)
TITLE:=board-2.bin for QCOM IPQ9574 eval kits
endef
define Package/ath11k-wifi-qcom-ipq95xx/install
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ9574/hw1.0/
$(INSTALL_DATA) ./board-2.bin.IPQ9574 $(1)/lib/firmware/ath11k/IPQ9574/hw1.0/board-2.bin
endef
$(eval $(call BuildPackage,ath11k-wifi-qcom-ipq95xx))

View File

@@ -1,76 +0,0 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=ath12k-firmware
PKG_MIRROR_HASH:=a325f86b1d613f713d2e015abca4a9ff86c8448d4cd540fa022866da2c5aa042
PKG_SOURCE_PROTO:=git
PKG_BRANCH:=main
PKG_SOURCE_URL:=https://github.com/quic/upstream-wifi-fw.git
PKG_SOURCE_VERSION:=e90d32aaa149800ea79760639cb5ac9ddcfc8281
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
include $(INCLUDE_DIR)/package.mk
define Package/ath12k-firmware-default
SECTION:=firmware
CATEGORY:=Firmware
URL:=$(PKG_SOURCE_URL)
DEPENDS:=
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
$(Package/ath12k-firmware-default)
TITLE:=ath12k firmware for qcn92xx devices
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
define Build/Compile
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
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0
$(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/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
$(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))

View File

@@ -1,78 +0,0 @@
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/version.mk
PKG_NAME:=ath12k-wifi
PKG_RELEASE:=1
PKG_FLAGS:=nonshared
include $(INCLUDE_DIR)/package.mk
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
endef
define Build/Compile
endef
define Package/ath12k-wifi-default
SUBMENU:=ath12k Board-Specific Overrides
SECTION:=firmware
CATEGORY:=Firmware
DEPENDS:=@(TARGET_qcn9274||TARGET_ipq53xx)
TITLE:=Custom Board
endef
define Package/ath12k-wifi-qcom-qcn9274
$(call Package/ath12k-wifi-default)
TITLE:=board-2.bin for QCOM QCN9274 eval kits
endef
define Package/ath12k-wifi-qcom-qcn9274/install
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN9274/hw1.0/
$(INSTALL_DATA) ./board-2.bin.QCN9274 $(1)/lib/firmware/ath12k/QCN9274/hw1.0/board-2.bin
endef
define Package/ath12k-wifi-cig-wf189
$(call Package/ath12k-wifi-default)
TITLE:=board.bin for CIG WF189
endef
define Package/ath12k-wifi-edgecore-eap105
$(call Package/ath12k-wifi-default)
TITLE:=board.bin for Edgecore EAP105
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-edgecore-eap105/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-edgecore-eap105.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-edgecore-eap105.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-cig-wf189))
$(eval $(call BuildPackage,ath12k-wifi-edgecore-eap105))
$(eval $(call BuildPackage,ath12k-wifi-sercomm-ap72tip))

View File

@@ -1,88 +0,0 @@
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2007-2019 B.A.T.M.A.N. contributors:
#
# Marek Lindner, Simon Wunderlich
#
# B.A.T.M.A.N meshing protocol
#
config BATMAN_ADV_BATMAN_V
bool "B.A.T.M.A.N. V protocol"
depends on PACKAGE_kmod-batman-adv
default y
help
This option enables the B.A.T.M.A.N. V protocol, the successor
of the currently used B.A.T.M.A.N. IV protocol. The main
changes include splitting of the OGM protocol into a neighbor
discovery protocol (Echo Location Protocol, ELP) and a new OGM
Protocol OGMv2 for flooding protocol information through the
network, as well as a throughput based metric.
B.A.T.M.A.N. V is currently considered experimental and not
compatible to B.A.T.M.A.N. IV networks.
config BATMAN_ADV_BLA
bool "Bridge Loop Avoidance"
depends on PACKAGE_kmod-batman-adv
select PACKAGE_kmod-lib-crc16
default y
help
This option enables BLA (Bridge Loop Avoidance), a mechanism
to avoid Ethernet frames looping when mesh nodes are connected
to both the same LAN and the same mesh. If you will never use
more than one mesh node in the same LAN, you can safely remove
this feature and save some space.
config BATMAN_ADV_DAT
bool "Distributed ARP Table"
depends on PACKAGE_kmod-batman-adv
default y
help
This option enables DAT (Distributed ARP Table), a DHT based
mechanism that increases ARP reliability on sparse wireless
mesh networks. If you think that your network does not need
this option you can safely remove it and save some space.
config BATMAN_ADV_NC
bool "Network Coding"
depends on PACKAGE_kmod-batman-adv
help
This option enables network coding, a mechanism that aims to
increase the overall network throughput by fusing multiple
packets in one transmission.
Note that interfaces controlled by batman-adv must be manually
configured to have promiscuous mode enabled in order to make
network coding work.
If you think that your network does not need this feature you
can safely disable it and save some space.
config BATMAN_ADV_MCAST
bool "Multicast optimisation"
depends on PACKAGE_kmod-batman-adv
default y
help
This option enables the multicast optimisation which aims to
reduce the air overhead while improving the reliability of
multicast messages.
config BATMAN_ADV_DEBUG
bool "B.A.T.M.A.N. debugging"
depends on PACKAGE_kmod-batman-adv
help
This is an option for use by developers; most people should
say N here. This enables compilation of support for
outputting debugging information to the debugfs log or tracing
buffer. The output is controlled via the batadv netdev specific
log_level setting.
config BATMAN_ADV_TRACING
bool "B.A.T.M.A.N. tracing support"
depends on PACKAGE_kmod-batman-adv
select KERNEL_FTRACE
select KERNEL_ENABLE_DEFAULT_TRACERS
help
This is an option for use by developers; most people should
say N here. Select this option to gather traces like the debug
messages using the generic tracing infrastructure of the kernel.
BATMAN_ADV_DEBUG must also be selected to get trace events for
batadv_dbg.

View File

@@ -1,101 +0,0 @@
# SPDX-License-Identifier: GPL-2.0-only
include $(TOPDIR)/rules.mk
PKG_NAME:=batman-adv
PKG_VERSION:=2022.0
PKG_RELEASE:=$(AUTORELEASE)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
PKG_HASH:=49338705bc207709ac84d766688e702571009c827c0a320788ea51fb887714aa
PKG_EXTMOD_SUBDIRS:=net/batman-adv
PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
PKG_LICENSE:=GPL-2.0-only MIT
PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT
PKG_BUILD_PARALLEL:=1
STAMP_CONFIGURED_DEPENDS := $(STAGING_DIR)/usr/include/mac80211-backport/backport/autoconf.h
PKG_CONFIG_DEPENDS += \
CONFIG_BATMAN_ADV_BATMAN_V \
CONFIG_BATMAN_ADV_BLA \
CONFIG_BATMAN_ADV_DAT \
CONFIG_BATMAN_ADV_NC \
CONFIG_BATMAN_ADV_MCAST \
CONFIG_BATMAN_ADV_DEBUG \
CONFIG_BATMAN_ADV_TRACING
include $(INCLUDE_DIR)/kernel.mk
include $(INCLUDE_DIR)/package.mk
define KernelPackage/batman-adv
SUBMENU:=Network Support
TITLE:=B.A.T.M.A.N. Adv
URL:=https://www.open-mesh.org/
DEPENDS:=+BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-lib-crc32c +kmod-cfg80211 +batctl
FILES:=$(PKG_BUILD_DIR)/net/batman-adv/batman-adv.$(LINUX_KMOD_SUFFIX)
AUTOLOAD:=$(call AutoProbe,batman-adv)
endef
define KernelPackage/batman-adv/description
B.A.T.M.A.N. (better approach to mobile ad-hoc networking) is
a routing protocol for multi-hop ad-hoc mesh networks. The
networks may be wired or wireless. See
https://www.open-mesh.org/ for more information and user space
tools. This package builds version $(PKG_VERSION) of the kernel
module.
endef
define KernelPackage/batman-adv/config
source "$(SOURCE)/Config.in"
endef
define Package/kmod-batman-adv/conffiles
/etc/config/batman-adv
endef
PKG_EXTRA_KCONFIG:= \
CONFIG_BATMAN_ADV=m \
CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_BATMAN_ADV_DEBUG),y,n) \
CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_BATMAN_ADV_BLA),y,n) \
CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_BATMAN_ADV_DAT),y,n) \
CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_BATMAN_ADV_MCAST),y,n) \
CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_BATMAN_ADV_NC),y,n) \
CONFIG_BATMAN_ADV_BATMAN_V=$(if $(CONFIG_BATMAN_ADV_BATMAN_V),y,n) \
CONFIG_BATMAN_ADV_TRACING=$(if $(CONFIG_BATMAN_ADV_TRACING),y,n) \
PKG_EXTRA_CFLAGS:= \
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(PKG_EXTRA_KCONFIG)))) \
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(PKG_EXTRA_KCONFIG)))) \
NOSTDINC_FLAGS = \
$(KERNEL_NOSTDINC_FLAGS) \
-I$(PKG_BUILD_DIR)/net/batman-adv \
-I$(STAGING_DIR)/usr/include/mac80211-backport \
-I$(STAGING_DIR)/usr/include/mac80211-backport/uapi \
-I$(STAGING_DIR)/usr/include/mac80211 \
-I$(STAGING_DIR)/usr/include/mac80211/uapi \
-I$(PKG_BUILD_DIR)/include/ \
-include backport/autoconf.h \
-include backport/backport.h \
-include $(PKG_BUILD_DIR)/compat-hacks.h \
-DBATADV_SOURCE_VERSION=\\\"$(PKG_VERSION)-openwrt-$(PKG_RELEASE)\\\"
define Build/Compile
$(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" \
$(KERNEL_MAKE_FLAGS) \
M="$(PKG_BUILD_DIR)/net/batman-adv" \
$(PKG_EXTRA_KCONFIG) \
EXTRA_CFLAGS="$(PKG_EXTRA_CFLAGS)" \
NOSTDINC_FLAGS="$(NOSTDINC_FLAGS)" \
modules
endef
define KernelPackage/batman-adv/install
$(CP) ./files/. $(1)/
endef
$(eval $(call KernelPackage,batman-adv))

View File

@@ -1,97 +0,0 @@
#!/bin/sh
# This UCI-Defaults script will split the batadv proto network interfaces
# in batadv_hardif and batadv proto. The configuration options from
# /etc/config/batman-adv will be moved to the latter.
. /lib/functions.sh
proto_batadv_to_batadv_hardif() {
local section="$1"
local proto
local mesh
local routing_algo
config_get proto "${section}" proto
config_get mesh "${section}" mesh
config_get routing_algo "${section}" routing_algo
if [ -z "$mesh" -o "${proto}" != "batadv" ]; then
continue
fi
uci set network."${section}".proto="batadv_hardif"
uci rename network."${section}".mesh="master"
uci delete network."${section}".routing_algo
# create new section or adjust existing one
uci set network."${mesh}"=interface
uci set network."${mesh}".proto=batadv
[ -n "${routing_algo}" ] && uci set network."${mesh}".routing_algo="${routing_algo}"
}
mv_batadv_config_section() {
local section="$1"
local aggregated_ogms
local ap_isolation
local bonding
local bridge_loop_avoidance
local distributed_arp_table
local fragmentation
local gw_bandwidth
local gw_mode
local gw_sel_class
local hop_penalty
local isolation_mark
local log_level
local multicast_mode
local network_coding
local orig_interval
config_get aggregated_ogms "${section}" aggregated_ogms
config_get ap_isolation "${section}" ap_isolation
config_get bonding "${section}" bonding
config_get bridge_loop_avoidance "${section}" bridge_loop_avoidance
config_get distributed_arp_table "${section}" distributed_arp_table
config_get fragmentation "${section}" fragmentation
config_get gw_bandwidth "${section}" gw_bandwidth
config_get gw_mode "${section}" gw_mode
config_get gw_sel_class "${section}" gw_sel_class
config_get hop_penalty "${section}" hop_penalty
config_get isolation_mark "${section}" isolation_mark
config_get log_level "${section}" log_level
config_get multicast_mode "${section}" multicast_mode
config_get network_coding "${section}" network_coding
config_get orig_interval "${section}" orig_interval
# update section in case it exists
[ -n "${aggregated_ogms}" ] && uci set network."${section}".aggregated_ogms="${aggregated_ogms}"
[ -n "${ap_isolation}" ] && uci set network."${section}".ap_isolation="${ap_isolation}"
[ -n "${bonding}" ] && uci set network."${section}".bonding="${bonding}"
[ -n "${bridge_loop_avoidance}" ] && uci set network."${section}".bridge_loop_avoidance="${bridge_loop_avoidance}"
[ -n "${distributed_arp_table}" ] && uci set network."${section}".distributed_arp_table="${distributed_arp_table}"
[ -n "${fragmentation}" ] && uci set network."${section}".fragmentation="${fragmentation}"
[ -n "${gw_bandwidth}" ] && uci set network."${section}".gw_bandwidth="${gw_bandwidth}"
[ -n "${gw_mode}" ] && uci set network."${section}".gw_mode="${gw_mode}"
[ -n "${gw_sel_class}" ] && uci set network."${section}".gw_sel_class="${gw_sel_class}"
[ -n "${hop_penalty}" ] && uci set network."${section}".hop_penalty="${hop_penalty}"
[ -n "${isolation_mark}" ] && uci set network."${section}".isolation_mark="${isolation_mark}"
[ -n "${log_level}" ] && uci set network."${section}".log_level="${log_level}"
[ -n "${multicast_mode}" ] && uci set network."${section}".multicast_mode="${multicast_mode}"
[ -n "${network_coding}" ] && uci set network."${section}".network_coding="${network_coding}"
[ -n "${orig_interval}" ] && uci set network."${section}".orig_interval="${orig_interval}"
}
if [ -f /etc/config/batman-adv ]; then
config_load network
config_foreach proto_batadv_to_batadv_hardif 'interface'
uci commit network
config_load batman-adv
config_foreach mv_batadv_config_section 'mesh'
uci commit network
rm -f /etc/config/batman-adv
fi
exit 0

View File

@@ -1,123 +0,0 @@
#!/bin/sh
[ -n "$INCLUDE_ONLY" ] || {
. /lib/functions.sh
. ../netifd-proto.sh
init_proto "$@"
}
proto_batadv_init_config() {
no_device=1
available=1
proto_config_add_boolean 'aggregated_ogms:bool'
proto_config_add_boolean 'ap_isolation:bool'
proto_config_add_boolean 'bonding:bool'
proto_config_add_boolean 'bridge_loop_avoidance:bool'
proto_config_add_boolean 'distributed_arp_table:bool'
proto_config_add_boolean 'fragmentation:bool'
proto_config_add_string 'gw_bandwidth'
proto_config_add_string 'gw_mode'
proto_config_add_int 'gw_sel_class'
proto_config_add_int 'hop_penalty'
proto_config_add_string 'isolation_mark'
proto_config_add_string 'log_level'
proto_config_add_int 'multicast_fanout'
proto_config_add_boolean 'multicast_mode:bool'
proto_config_add_boolean 'network_coding:bool'
proto_config_add_int 'orig_interval'
proto_config_add_string 'routing_algo'
}
proto_batadv_setup() {
local config="$1"
local iface="$config"
local aggregated_ogms
local ap_isolation
local bonding
local bridge_loop_avoidance
local distributed_arp_table
local fragmentation
local gw_bandwidth
local gw_mode
local gw_sel_class
local hop_penalty
local isolation_mark
local log_level
local multicast_fanout
local multicast_mode
local network_coding
local orig_interval
local routing_algo
json_get_vars aggregated_ogms
json_get_vars ap_isolation
json_get_vars bonding
json_get_vars bridge_loop_avoidance
json_get_vars distributed_arp_table
json_get_vars fragmentation
json_get_vars gw_bandwidth
json_get_vars gw_mode
json_get_vars gw_sel_class
json_get_vars hop_penalty
json_get_vars isolation_mark
json_get_vars log_level
json_get_vars multicast_fanout
json_get_vars multicast_mode
json_get_vars network_coding
json_get_vars orig_interval
json_get_vars routing_algo
set_default routing_algo 'BATMAN_IV'
batctl routing_algo "$routing_algo"
batctl meshif "$iface" interface create
[ -n "$aggregated_ogms" ] && batctl meshif "$iface" aggregation "$aggregated_ogms"
[ -n "$ap_isolation" ] && batctl meshif "$iface" ap_isolation "$ap_isolation"
[ -n "$bonding" ] && batctl meshif "$iface" bonding "$bonding"
[ -n "$bridge_loop_avoidance" ] && batctl meshif "$iface" bridge_loop_avoidance "$bridge_loop_avoidance" 2>&-
[ -n "$distributed_arp_table" ] && batctl meshif "$iface" distributed_arp_table "$distributed_arp_table" 2>&-
[ -n "$fragmentation" ] && batctl meshif "$iface" fragmentation "$fragmentation"
case "$gw_mode" in
server)
if [ -n "$gw_bandwidth" ]; then
batctl meshif "$iface" gw_mode "server" "$gw_bandwidth"
else
batctl meshif "$iface" gw_mode "server"
fi
;;
client)
if [ -n "$gw_sel_class" ]; then
batctl meshif "$iface" gw_mode "client" "$gw_sel_class"
else
batctl meshif "$iface" gw_mode "client"
fi
;;
*)
batctl meshif "$iface" gw_mode "off"
;;
esac
[ -n "$hop_penalty" ] && batctl meshif "$iface" hop_penalty "$hop_penalty"
[ -n "$isolation_mark" ] && batctl meshif "$iface" isolation_mark "$isolation_mark"
[ -n "$multicast_fanout" ] && batctl meshif "$iface" multicast_fanout "$multicast_fanout"
[ -n "$multicast_mode" ] && batctl meshif "$iface" multicast_mode "$multicast_mode" 2>&-
[ -n "$network_coding" ] && batctl meshif "$iface" network_coding "$network_coding" 2>&-
[ -n "$log_level" ] && batctl meshif "$iface" loglevel "$log_level" 2>&-
[ -n "$orig_interval" ] && batctl meshif "$iface" orig_interval "$orig_interval"
proto_init_update "$iface" 1
proto_send_update "$config"
}
proto_batadv_teardown() {
local config="$1"
local iface="$config"
batctl meshif "$iface" interface destroy
}
add_protocol batadv

View File

@@ -1,53 +0,0 @@
#!/bin/sh
[ -n "$INCLUDE_ONLY" ] || {
. /lib/functions.sh
. ../netifd-proto.sh
init_proto "$@"
}
proto_batadv_hardif_init_config() {
proto_config_add_int 'elp_interval'
proto_config_add_int 'hop_penalty'
proto_config_add_string "master"
proto_config_add_string 'throughput_override'
}
proto_batadv_hardif_setup() {
local config="$1"
local iface="$2"
local elp_interval
local hop_penalty
local master
local throughput_override
json_get_vars elp_interval
json_get_vars hop_penalty
json_get_vars master
json_get_vars throughput_override
( proto_add_host_dependency "$config" '' "$master" )
batctl meshif "$master" interface -M add "$iface"
[ -n "$elp_interval" ] && batctl hardif "$iface" elp_interval "$elp_interval"
[ -n "$hop_penalty" ] && batctl hardif "$iface" hop_penalty "$hop_penalty"
[ -n "$throughput_override" ] && batctl hardif "$iface" throughput_override "$throughput_override"
proto_init_update "$iface" 1
proto_send_update "$config"
}
proto_batadv_hardif_teardown() {
local config="$1"
local iface="$2"
local master
json_get_vars master
batctl meshif "$master" interface -M del "$iface" || true
}
add_protocol batadv_hardif

View File

@@ -1,25 +0,0 @@
#!/bin/sh
. /lib/functions.sh
. ../netifd-proto.sh
init_proto "$@"
proto_batadv_vlan_init_config() {
proto_config_add_boolean 'ap_isolation:bool'
}
proto_batadv_vlan_setup() {
local config="$1"
local iface="$2"
# batadv_vlan options
local ap_isolation
json_get_vars ap_isolation
[ -n "$ap_isolation" ] && batctl vlan "$iface" ap_isolation "$ap_isolation"
proto_init_update "$iface" 1
proto_send_update "$config"
}
add_protocol batadv_vlan

View File

@@ -1,128 +0,0 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Sat, 24 Oct 2020 22:51:23 +0200
Subject: Revert "batman-adv: genetlink: move to smaller ops wherever possible"
The netlink genl_ops interface was splitted into two parts for Linux 5.10.
The batman-adv code changed to the new one because it doesn't use the more
complex policy handling of genl_ops. But the backports-5.8-1 version in
OpenWrt doesn't yet support the new genl_small_ops.
This patch must be dropped directly when OpenWrt switches to backports-5.10
or newer - otherwise it will not work as expected.
This reverts commit 725b4ef5be840cfcd0ca33b9393c14dee40c10f7.
--- a/compat-include/net/genetlink.h
+++ b/compat-include/net/genetlink.h
@@ -31,17 +31,15 @@ void batadv_genl_dump_check_consistent(s
#endif /* LINUX_VERSION_IS_LESS(4, 15, 0) */
-#if LINUX_VERSION_IS_LESS(5, 10, 0)
-
#if LINUX_VERSION_IS_LESS(5, 2, 0)
+
enum genl_validate_flags {
GENL_DONT_VALIDATE_STRICT = BIT(0),
GENL_DONT_VALIDATE_DUMP = BIT(1),
GENL_DONT_VALIDATE_DUMP_STRICT = BIT(2),
};
-#endif /* LINUX_VERSION_IS_LESS(5, 2, 0) */
-struct batadv_genl_small_ops {
+struct batadv_genl_ops {
int (*doit)(struct sk_buff *skb,
struct genl_info *info);
int (*dumpit)(struct sk_buff *skb,
@@ -70,9 +68,9 @@ struct batadv_genl_family {
struct genl_info *info);
void (*post_doit)(const struct genl_ops *ops, struct sk_buff *skb,
struct genl_info *info);
- const struct batadv_genl_small_ops *small_ops;
+ const struct batadv_genl_ops *ops;
const struct genl_multicast_group *mcgrps;
- unsigned int n_small_ops;
+ unsigned int n_ops;
unsigned int n_mcgrps;
struct module *module;
@@ -96,32 +94,24 @@ static inline int batadv_genl_register_f
family->family.pre_doit = family->pre_doit;
family->family.post_doit = family->post_doit;
family->family.mcgrps = family->mcgrps;
- family->family.n_ops = family->n_small_ops;
+ family->family.n_ops = family->n_ops;
family->family.n_mcgrps = family->n_mcgrps;
family->family.module = family->module;
- ops = kzalloc(sizeof(*ops) * family->n_small_ops, GFP_KERNEL);
+ ops = kzalloc(sizeof(*ops) * family->n_ops, GFP_KERNEL);
if (!ops)
return -ENOMEM;
for (i = 0; i < family->family.n_ops; i++) {
- ops[i].doit = family->small_ops[i].doit;
- ops[i].dumpit = family->small_ops[i].dumpit;
- ops[i].done = family->small_ops[i].done;
- ops[i].cmd = family->small_ops[i].cmd;
- ops[i].internal_flags = family->small_ops[i].internal_flags;
- ops[i].flags = family->small_ops[i].flags;
-#if LINUX_VERSION_IS_GEQ(5, 2, 0)
- ops[i].validate = family->small_ops[i].validate;
-#else
+ ops[i].doit = family->ops[i].doit;
+ ops[i].dumpit = family->ops[i].dumpit;
+ ops[i].done = family->ops[i].done;
+ ops[i].cmd = family->ops[i].cmd;
+ ops[i].internal_flags = family->ops[i].internal_flags;
+ ops[i].flags = family->ops[i].flags;
ops[i].policy = family->policy;
-#endif
}
-#if LINUX_VERSION_IS_GEQ(5, 2, 0)
- family->family.policy = family->policy;
-#endif
-
family->family.ops = ops;
family->copy_ops = ops;
@@ -136,7 +126,7 @@ typedef struct genl_ops batadv_genl_ops_
#define batadv_post_doit(__x, __y, __z) \
batadv_post_doit(const batadv_genl_ops_old *ops, __y, __z)
-#define genl_small_ops batadv_genl_small_ops
+#define genl_ops batadv_genl_ops
#define genl_family batadv_genl_family
#define genl_register_family(family) \
@@ -160,6 +150,6 @@ batadv_genl_unregister_family(struct bat
genlmsg_multicast_netns(&(_family)->family, _net, _skb, _portid, \
_group, _flags)
-#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */
+#endif /* LINUX_VERSION_IS_LESS(5, 2, 0) */
#endif /* _NET_BATMAN_ADV_COMPAT_NET_GENETLINK_H_ */
--- a/net/batman-adv/netlink.c
+++ b/net/batman-adv/netlink.c
@@ -1357,7 +1357,7 @@ static void batadv_post_doit(const struc
}
}
-static const struct genl_small_ops batadv_netlink_ops[] = {
+static const struct genl_ops batadv_netlink_ops[] = {
{
.cmd = BATADV_CMD_GET_MESH,
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
@@ -1491,8 +1491,8 @@ struct genl_family batadv_netlink_family
.pre_doit = batadv_pre_doit,
.post_doit = batadv_post_doit,
.module = THIS_MODULE,
- .small_ops = batadv_netlink_ops,
- .n_small_ops = ARRAY_SIZE(batadv_netlink_ops),
+ .ops = batadv_netlink_ops,
+ .n_ops = ARRAY_SIZE(batadv_netlink_ops),
.mcgrps = batadv_netlink_mcgrps,
.n_mcgrps = ARRAY_SIZE(batadv_netlink_mcgrps),
};

View File

@@ -1,116 +0,0 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Thu, 28 Jan 2021 21:06:51 +0100
Subject: Revert "batman-adv: Add new include for min/max helpers"
The OpenWrt kernel sources and backports sources are currently missing this
header.
This reverts commit 1810de05310d5c5e9140f870ac21052f38bc06b8.
Signed-off-by: Sven Eckelmann <sven@narfation.org>
--- a/compat-include/linux/minmax.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright (C) B.A.T.M.A.N. contributors:
- *
- * Marek Lindner, Simon Wunderlich
- *
- * This file contains macros for maintaining compatibility with older versions
- * of the Linux kernel.
- */
-
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_
-#define _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_
-
-#include <linux/version.h>
-#if LINUX_VERSION_IS_GEQ(5, 10, 0)
-#include_next <linux/minmax.h>
-#else
-#include <linux/kernel.h>
-#endif
-
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_ */
--- a/net/batman-adv/bat_v.c
+++ b/net/batman-adv/bat_v.c
@@ -15,7 +15,6 @@
#include <linux/jiffies.h>
#include <linux/kref.h>
#include <linux/list.h>
-#include <linux/minmax.h>
#include <linux/netdevice.h>
#include <linux/netlink.h>
#include <linux/rculist.h>
--- a/net/batman-adv/bat_v_elp.c
+++ b/net/batman-adv/bat_v_elp.c
@@ -18,7 +18,6 @@
#include <linux/jiffies.h>
#include <linux/kernel.h>
#include <linux/kref.h>
-#include <linux/minmax.h>
#include <linux/netdevice.h>
#include <linux/nl80211.h>
#include <linux/prandom.h>
--- a/net/batman-adv/bat_v_ogm.c
+++ b/net/batman-adv/bat_v_ogm.c
@@ -18,7 +18,6 @@
#include <linux/kref.h>
#include <linux/list.h>
#include <linux/lockdep.h>
-#include <linux/minmax.h>
#include <linux/mutex.h>
#include <linux/netdevice.h>
#include <linux/prandom.h>
--- a/net/batman-adv/fragmentation.c
+++ b/net/batman-adv/fragmentation.c
@@ -14,8 +14,8 @@
#include <linux/gfp.h>
#include <linux/if_ether.h>
#include <linux/jiffies.h>
+#include <linux/kernel.h>
#include <linux/lockdep.h>
-#include <linux/minmax.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
#include <linux/slab.h>
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -17,7 +17,6 @@
#include <linux/kref.h>
#include <linux/limits.h>
#include <linux/list.h>
-#include <linux/minmax.h>
#include <linux/mutex.h>
#include <linux/netdevice.h>
#include <linux/printk.h>
--- a/net/batman-adv/main.c
+++ b/net/batman-adv/main.c
@@ -23,7 +23,6 @@
#include <linux/kobject.h>
#include <linux/kref.h>
#include <linux/list.h>
-#include <linux/minmax.h>
#include <linux/module.h>
#include <linux/netdevice.h>
#include <linux/printk.h>
--- a/net/batman-adv/netlink.c
+++ b/net/batman-adv/netlink.c
@@ -23,7 +23,6 @@
#include <linux/kernel.h>
#include <linux/limits.h>
#include <linux/list.h>
-#include <linux/minmax.h>
#include <linux/netdevice.h>
#include <linux/netlink.h>
#include <linux/printk.h>
--- a/net/batman-adv/tp_meter.c
+++ b/net/batman-adv/tp_meter.c
@@ -23,7 +23,6 @@
#include <linux/kthread.h>
#include <linux/limits.h>
#include <linux/list.h>
-#include <linux/minmax.h>
#include <linux/netdevice.h>
#include <linux/param.h>
#include <linux/printk.h>

View File

@@ -1,34 +0,0 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Fri, 14 May 2021 19:34:35 +0200
Subject: batman-adv: Fix build of multicast code against Linux < 5.13
Fixes: 007b4c4b031f ("batman-adv: convert ifmcaddr6 to RCU")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
--- a/net/batman-adv/multicast.c
+++ b/net/batman-adv/multicast.c
@@ -422,9 +422,14 @@ batadv_mcast_mla_softif_get_ipv6(struct
return 0;
}
+#if LINUX_VERSION_IS_LESS(5, 13, 0)
+ read_lock_bh(&in6_dev->lock);
+ for (pmc6 = in6_dev->mc_list; pmc6; pmc6 = pmc6->next) {
+#else
for (pmc6 = rcu_dereference(in6_dev->mc_list);
pmc6;
pmc6 = rcu_dereference(pmc6->next)) {
+#endif
if (IPV6_ADDR_MC_SCOPE(&pmc6->mca_addr) <
IPV6_ADDR_SCOPE_LINKLOCAL)
continue;
@@ -453,6 +458,9 @@ batadv_mcast_mla_softif_get_ipv6(struct
hlist_add_head(&new->list, mcast_list);
ret++;
}
+#if LINUX_VERSION_IS_LESS(5, 13, 0)
+ read_unlock_bh(&in6_dev->lock);
+#endif
rcu_read_unlock();
return ret;

View File

@@ -1,19 +0,0 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Tue, 14 Sep 2021 21:02:10 +0200
Subject: Revert "batman-adv: Switch to kstrtox.h for kstrtou64"
This header is only available after Linux 5.14
This reverts commit c9a69cb4048ebef3a4d91835669011a26d9b7dab.
--- a/net/batman-adv/gateway_common.c
+++ b/net/batman-adv/gateway_common.c
@@ -10,7 +10,7 @@
#include <linux/atomic.h>
#include <linux/byteorder/generic.h>
#include <linux/errno.h>
-#include <linux/kstrtox.h>
+#include <linux/kernel.h>
#include <linux/limits.h>
#include <linux/math64.h>
#include <linux/netdevice.h>

View File

@@ -1,19 +0,0 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Tue, 14 Sep 2021 21:07:34 +0200
Subject: Revert "batman-adv: use Linux's stdarg.h"
This header is only available since Linux 5.15
This reverts commit 36d059797a14f0e373fdc3c79df7b467435925ad.
--- a/net/batman-adv/log.c
+++ b/net/batman-adv/log.c
@@ -7,7 +7,7 @@
#include "log.h"
#include "main.h"
-#include <linux/stdarg.h>
+#include <stdarg.h>
#include "trace.h"

View File

@@ -1,27 +0,0 @@
From: Eric Dumazet <edumazet@google.com>
Date: Wed, 2 Mar 2022 20:05:13 +0100
Subject: batman-adv: make mc_forwarding atomic
This fixes minor data-races in ip6_mc_input() and
batadv_mcast_mla_rtr_flags_softif_get_ipv6()
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
[sven@narfation.org: Add ugly hack to get it building with old kernels]
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/56db7c0540e733a1f063ccd6bab1b537a80857eb
--- a/net/batman-adv/multicast.c
+++ b/net/batman-adv/multicast.c
@@ -134,7 +134,11 @@ static u8 batadv_mcast_mla_rtr_flags_sof
{
struct inet6_dev *in6_dev = __in6_dev_get(dev);
+#if LINUX_VERSION_IS_GEQ(5, 18, 0) // UGLY_HACK_NEW
+ if (in6_dev && atomic_read(&in6_dev->cnf.mc_forwarding))
+#else // UGLY_HACK_OLD
if (in6_dev && in6_dev->cnf.mc_forwarding)
+#endif // UGLY_HACK_STOP
return BATADV_NO_FLAGS;
else
return BATADV_MCAST_WANT_NO_RTR6;

View File

@@ -1,23 +0,0 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Fri, 15 Apr 2022 15:12:45 +0200
Subject: batman-adv: compat: Add atomic mc_fowarding support for stable kernels
Fixes: 56db7c0540e7 ("batman-adv: make mc_forwarding atomic")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/350adcaec82fbaa358a2406343b6130ac8dad126
--- a/net/batman-adv/multicast.c
+++ b/net/batman-adv/multicast.c
@@ -134,7 +134,11 @@ static u8 batadv_mcast_mla_rtr_flags_sof
{
struct inet6_dev *in6_dev = __in6_dev_get(dev);
-#if LINUX_VERSION_IS_GEQ(5, 18, 0) // UGLY_HACK_NEW
+#if (LINUX_VERSION_IS_GEQ(5, 4, 189) && LINUX_VERSION_IS_LESS(5, 5, 0)) || /* UGLY_HACK */ \
+ (LINUX_VERSION_IS_GEQ(5, 10, 111) && LINUX_VERSION_IS_LESS(5, 11, 0)) || /* UGLY_HACK */ \
+ (LINUX_VERSION_IS_GEQ(5, 15, 34) && LINUX_VERSION_IS_LESS(5, 16, 0)) || /* UGLY_HACK */ \
+ (LINUX_VERSION_IS_GEQ(5, 16, 20) && LINUX_VERSION_IS_LESS(5, 17, 0)) || /* UGLY_HACK */ \
+ LINUX_VERSION_IS_GEQ(5, 17, 3) // UGLY_HACK_NEW
if (in6_dev && atomic_read(&in6_dev->cnf.mc_forwarding))
#else // UGLY_HACK_OLD
if (in6_dev && in6_dev->cnf.mc_forwarding)

View File

@@ -1,44 +0,0 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Wed, 2 Mar 2022 19:49:44 +0100
Subject: batman-adv: Request iflink once in batadv-on-batadv check
There is no need to call dev_get_iflink multiple times for the same
net_device in batadv_is_on_batman_iface. And since some of the
.ndo_get_iflink callbacks are dynamic (for example via RCUs like in
vxcan_get_iflink), it could easily happen that the returned values are not
stable. The pre-checks before __dev_get_by_index are then of course bogus.
Fixes: 3d48811b27f5 ("batman-adv: prevent using any virtual device created on batman-adv as hard-interface")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/f6c0c45356fe3ab9c5e01b81d060f8a436658037
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -148,22 +148,23 @@ static bool batadv_is_on_batman_iface(co
struct net *net = dev_net(net_dev);
struct net_device *parent_dev;
struct net *parent_net;
+ int iflink;
bool ret;
/* check if this is a batman-adv mesh interface */
if (batadv_softif_is_valid(net_dev))
return true;
+ iflink = dev_get_iflink(net_dev);
+
/* no more parents..stop recursion */
- if (dev_get_iflink(net_dev) == 0 ||
- dev_get_iflink(net_dev) == net_dev->ifindex)
+ if (iflink == 0 || iflink == net_dev->ifindex)
return false;
parent_net = batadv_getlink_net(net_dev, net);
/* recurse over the parent device */
- parent_dev = __dev_get_by_index((struct net *)parent_net,
- dev_get_iflink(net_dev));
+ parent_dev = __dev_get_by_index((struct net *)parent_net, iflink);
/* if we got a NULL parent_dev there is something broken.. */
if (!parent_dev) {
pr_err("Cannot find parent device\n");

View File

@@ -1,46 +0,0 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Wed, 2 Mar 2022 19:49:45 +0100
Subject: batman-adv: Request iflink once in batadv_get_real_netdevice
There is no need to call dev_get_iflink multiple times for the same
net_device in batadv_get_real_netdevice. And since some of the
ndo_get_iflink callbacks are dynamic (for example via RCUs like in
vxcan_get_iflink), it could easily happen that the returned values are not
stable. The pre-checks before __dev_get_by_index are then of course bogus.
Fixes: 2b45bb6c3aad ("batman-adv: additional checks for virtual interfaces on top of WiFi")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/445f477ec3e805425186f5fbe8ed0fe89cc226b6
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -214,14 +214,16 @@ static struct net_device *batadv_get_rea
struct net_device *real_netdev = NULL;
struct net *real_net;
struct net *net;
- int ifindex;
+ int iflink;
ASSERT_RTNL();
if (!netdev)
return NULL;
- if (netdev->ifindex == dev_get_iflink(netdev)) {
+ iflink = dev_get_iflink(netdev);
+
+ if (netdev->ifindex == iflink) {
dev_hold(netdev);
return netdev;
}
@@ -231,9 +233,8 @@ static struct net_device *batadv_get_rea
goto out;
net = dev_net(hard_iface->soft_iface);
- ifindex = dev_get_iflink(netdev);
real_net = batadv_getlink_net(netdev, net);
- real_netdev = dev_get_by_index(real_net, ifindex);
+ real_netdev = dev_get_by_index(real_net, iflink);
out:
batadv_hardif_put(hard_iface);

View File

@@ -1,86 +0,0 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Wed, 2 Mar 2022 19:49:46 +0100
Subject: batman-adv: Don't expect inter-netns unique iflink indices
The ifindex doesn't have to be unique for multiple network namespaces on
the same machine.
$ ip netns add test1
$ ip -net test1 link add dummy1 type dummy
$ ip netns add test2
$ ip -net test2 link add dummy2 type dummy
$ ip -net test1 link show dev dummy1
6: dummy1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 96:81:55:1e:dd:85 brd ff:ff:ff:ff:ff:ff
$ ip -net test2 link show dev dummy2
6: dummy2: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 5a:3c:af:35:07:c3 brd ff:ff:ff:ff:ff:ff
But the batman-adv code to walk through the various layers of virtual
interfaces uses this assumption because dev_get_iflink handles it
internally and doesn't return the actual netns of the iflink. And
dev_get_iflink only documents the situation where ifindex == iflink for
physical devices.
But only checking for dev->netdev_ops->ndo_get_iflink is also not an option
because ipoib_get_iflink implements it even when it sometimes returns an
iflink != ifindex and sometimes iflink == ifindex. The caller must
therefore make sure itself to check both netns and iflink + ifindex for
equality. Only when they are equal, a "physical" interface was detected
which should stop the traversal. On the other hand, vxcan_get_iflink can
also return 0 in case there was currently no valid peer. In this case, it
is still necessary to stop.
Fixes: 3d48811b27f5 ("batman-adv: prevent using any virtual device created on batman-adv as hard-interface")
Fixes: 2b45bb6c3aad ("batman-adv: additional checks for virtual interfaces on top of WiFi")
Reported-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/0aac7a9fbbbeec25f2f54a9e6d53ea91217ba720
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -156,13 +156,15 @@ static bool batadv_is_on_batman_iface(co
return true;
iflink = dev_get_iflink(net_dev);
-
- /* no more parents..stop recursion */
- if (iflink == 0 || iflink == net_dev->ifindex)
+ if (iflink == 0)
return false;
parent_net = batadv_getlink_net(net_dev, net);
+ /* iflink to itself, most likely physical device */
+ if (net == parent_net && iflink == net_dev->ifindex)
+ return false;
+
/* recurse over the parent device */
parent_dev = __dev_get_by_index((struct net *)parent_net, iflink);
/* if we got a NULL parent_dev there is something broken.. */
@@ -222,8 +224,7 @@ static struct net_device *batadv_get_rea
return NULL;
iflink = dev_get_iflink(netdev);
-
- if (netdev->ifindex == iflink) {
+ if (iflink == 0) {
dev_hold(netdev);
return netdev;
}
@@ -234,6 +235,14 @@ static struct net_device *batadv_get_rea
net = dev_net(hard_iface->soft_iface);
real_net = batadv_getlink_net(netdev, net);
+
+ /* iflink to itself, most likely physical device */
+ if (net == real_net && netdev->ifindex == iflink) {
+ real_netdev = netdev;
+ dev_hold(real_netdev);
+ goto out;
+ }
+
real_netdev = dev_get_by_index(real_net, iflink);
out:

View File

@@ -1,46 +0,0 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Sat, 16 Apr 2022 14:24:34 +0200
Subject: batman-adv: Don't skb_split skbuffs with frag_list
The receiving interface might have used GRO to receive more fragments than
MAX_SKB_FRAGS fragments. In this case, these will not be stored in
skb_shinfo(skb)->frags but merged into the frag list.
batman-adv relies on the function skb_split to split packets up into
multiple smaller packets which are not larger than the MTU on the outgoing
interface. But this function cannot handle frag_list entries and is only
operating on skb_shinfo(skb)->frags. If it is still trying to split such an
skb and xmit'ing it on an interface without support for NETIF_F_FRAGLIST,
then validate_xmit_skb() will try to linearize it. But this fails due to
inconsistent information. And __pskb_pull_tail will trigger a BUG_ON after
skb_copy_bits() returns an error.
In case of entries in frag_list, just linearize the skb before operating on
it with skb_split().
Reported-by: Felix Kaechele <felix@kaechele.ca>
Tested-by: Felix Kaechele <felix@kaechele.ca>
Fixes: 9de347143505 ("batman-adv: layer2 unicast packet fragmentation")
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d467720acaf1b22b0cee58144eeaf9ef6c5e285c
--- a/net/batman-adv/fragmentation.c
+++ b/net/batman-adv/fragmentation.c
@@ -475,6 +475,17 @@ int batadv_frag_send_packet(struct sk_bu
goto free_skb;
}
+ /* GRO might have added fragments to the fragment list instead of
+ * frags[]. But this is not handled by skb_split and must be
+ * linearized to avoid incorrect length information after all
+ * batman-adv fragments were created and submitted to the
+ * hard-interface
+ */
+ if (skb_has_frag_list(skb) && __skb_linearize(skb)) {
+ ret = -ENOMEM;
+ goto free_skb;
+ }
+
/* Create one header to be copied to all fragments */
frag_header.packet_type = BATADV_UNICAST_FRAG;
frag_header.version = BATADV_COMPAT_VERSION;

View File

@@ -1,179 +0,0 @@
/* Please avoid adding hacks here - instead add it to mac80211/backports.git */
#undef CONFIG_MODULE_STRIPPED
#include <linux/version.h> /* LINUX_VERSION_CODE */
#include <linux/types.h>
#if LINUX_VERSION_IS_LESS(5, 10, 0)
#include <linux/if_bridge.h>
struct batadv_br_ip {
union {
__be32 ip4;
#if IS_ENABLED(CONFIG_IPV6)
struct in6_addr ip6;
#endif
} dst;
__be16 proto;
__u16 vid;
};
struct batadv_br_ip_list {
struct list_head list;
struct batadv_br_ip addr;
};
#if 0
/* "static" dropped to force compiler to evaluate it as part of multicast.c
* might need to be added again and then called in some kind of dummy
* compat.c in case this header is included in multiple files.
*/
inline void __batadv_br_ip_list_check(void)
{
BUILD_BUG_ON(sizeof(struct batadv_br_ip_list) != sizeof(struct br_ip_list));
BUILD_BUG_ON(offsetof(struct batadv_br_ip_list, list) != offsetof(struct br_ip_list, list));
BUILD_BUG_ON(offsetof(struct batadv_br_ip_list, addr) != offsetof(struct br_ip_list, addr));
BUILD_BUG_ON(sizeof(struct batadv_br_ip) != sizeof(struct br_ip));
BUILD_BUG_ON(offsetof(struct batadv_br_ip, dst.ip4) != offsetof(struct br_ip, u.ip4));
BUILD_BUG_ON(offsetof(struct batadv_br_ip, dst.ip6) != offsetof(struct br_ip, u.ip6));
BUILD_BUG_ON(offsetof(struct batadv_br_ip, proto) != offsetof(struct br_ip, proto));
BUILD_BUG_ON(offsetof(struct batadv_br_ip, vid) != offsetof(struct br_ip, vid));
}
#endif
#define br_ip batadv_br_ip
#define br_ip_list batadv_br_ip_list
#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */
#if LINUX_VERSION_IS_LESS(5, 14, 0)
#include <linux/if_bridge.h>
#include <net/addrconf.h>
#if IS_ENABLED(CONFIG_IPV6)
static inline bool
br_multicast_has_router_adjacent(struct net_device *dev, int proto)
{
struct list_head bridge_mcast_list = LIST_HEAD_INIT(bridge_mcast_list);
struct br_ip_list *br_ip_entry, *tmp;
int ret;
if (proto != ETH_P_IPV6)
return true;
ret = br_multicast_list_adjacent(dev, &bridge_mcast_list);
if (ret < 0)
return true;
ret = false;
list_for_each_entry_safe(br_ip_entry, tmp, &bridge_mcast_list, list) {
if (br_ip_entry->addr.proto == htons(ETH_P_IPV6) &&
ipv6_addr_is_ll_all_routers(&br_ip_entry->addr.dst.ip6))
ret = true;
list_del(&br_ip_entry->list);
kfree(br_ip_entry);
}
return ret;
}
#else
static inline bool
br_multicast_has_router_adjacent(struct net_device *dev, int proto)
{
return true;
}
#endif
#endif /* LINUX_VERSION_IS_LESS(5, 14, 0) */
#if LINUX_VERSION_IS_LESS(5, 15, 0)
static inline void batadv_eth_hw_addr_set(struct net_device *dev,
const u8 *addr)
{
ether_addr_copy(dev->dev_addr, addr);
}
#define eth_hw_addr_set batadv_eth_hw_addr_set
#endif /* LINUX_VERSION_IS_LESS(5, 15, 0) */
/* <DECLARE_EWMA> */
#include <linux/version.h>
#include_next <linux/average.h>
#include <linux/bug.h>
#ifdef DECLARE_EWMA
#undef DECLARE_EWMA
#endif /* DECLARE_EWMA */
/*
* Exponentially weighted moving average (EWMA)
*
* This implements a fixed-precision EWMA algorithm, with both the
* precision and fall-off coefficient determined at compile-time
* and built into the generated helper funtions.
*
* The first argument to the macro is the name that will be used
* for the struct and helper functions.
*
* The second argument, the precision, expresses how many bits are
* used for the fractional part of the fixed-precision values.
*
* The third argument, the weight reciprocal, determines how the
* new values will be weighed vs. the old state, new values will
* get weight 1/weight_rcp and old values 1-1/weight_rcp. Note
* that this parameter must be a power of two for efficiency.
*/
#define DECLARE_EWMA(name, _precision, _weight_rcp) \
struct ewma_##name { \
unsigned long internal; \
}; \
static inline void ewma_##name##_init(struct ewma_##name *e) \
{ \
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
/* \
* Even if you want to feed it just 0/1 you should have \
* some bits for the non-fractional part... \
*/ \
BUILD_BUG_ON((_precision) > 30); \
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
e->internal = 0; \
} \
static inline unsigned long \
ewma_##name##_read(struct ewma_##name *e) \
{ \
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
BUILD_BUG_ON((_precision) > 30); \
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
return e->internal >> (_precision); \
} \
static inline void ewma_##name##_add(struct ewma_##name *e, \
unsigned long val) \
{ \
unsigned long internal = READ_ONCE(e->internal); \
unsigned long weight_rcp = ilog2(_weight_rcp); \
unsigned long precision = _precision; \
\
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
BUILD_BUG_ON((_precision) > 30); \
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
\
WRITE_ONCE(e->internal, internal ? \
(((internal << weight_rcp) - internal) + \
(val << precision)) >> weight_rcp : \
(val << precision)); \
}
/* </DECLARE_EWMA> */

View File

@@ -1,82 +0,0 @@
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))

View File

@@ -1,75 +0,0 @@
#!/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

View File

@@ -1,99 +0,0 @@
#!/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
}

View File

@@ -1,86 +0,0 @@
#!/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

View File

@@ -1,133 +0,0 @@
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

View File

@@ -1,181 +0,0 @@
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

View File

@@ -1,12 +0,0 @@
#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

View File

@@ -1,86 +0,0 @@
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

View File

@@ -1,72 +0,0 @@
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.

View File

@@ -1,149 +0,0 @@
# -*- 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

View File

@@ -1,585 +0,0 @@
/*==========================================================================
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;
}

View File

@@ -1,124 +0,0 @@
/*==========================================================================
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 */

File diff suppressed because it is too large Load Diff

View File

@@ -1,289 +0,0 @@
/*==========================================================================
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 */

View File

@@ -1,115 +0,0 @@
/*==========================================================================
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 */

View File

@@ -1,161 +0,0 @@
/*==========================================================================
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);
}

View File

@@ -1,177 +0,0 @@
/*==========================================================================
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__

View File

@@ -1,674 +0,0 @@
/*==========================================================================
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;
}

View File

@@ -1,278 +0,0 @@
/*==========================================================================
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 */

View File

@@ -1,113 +0,0 @@
#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_ */

View File

@@ -1,76 +0,0 @@
/*==========================================================================
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__

View File

@@ -1,71 +0,0 @@
/*==========================================================================
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

View File

@@ -1,197 +0,0 @@
/*==========================================================================
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;
}

View File

@@ -1,141 +0,0 @@
/*==========================================================================
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

View File

@@ -1,43 +0,0 @@
/*==========================================================================
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_ */

File diff suppressed because it is too large Load Diff

View File

@@ -1,993 +0,0 @@
/*==========================================================================
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 */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,549 +0,0 @@
/*
*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*/

View File

@@ -1,132 +0,0 @@
/*
*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*/

File diff suppressed because it is too large Load Diff

View File

@@ -1,108 +0,0 @@
/*=========================================================================
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;
}

View File

@@ -1,37 +0,0 @@
/*=========================================================================
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

View File

@@ -1,807 +0,0 @@
/*=========================================================================
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;
}

View File

@@ -1,168 +0,0 @@
/*=========================================================================
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

View File

@@ -1,664 +0,0 @@
/*
* 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 );
}

View File

@@ -1,111 +0,0 @@
/*
* 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 |
--------------------------------------------------------------------------------- ----------------------------------
*/

View File

@@ -1,461 +0,0 @@
/*
* 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 );
}

Some files were not shown because too many files have changed in this diff Show More