Compare commits

..

78 Commits

Author SHA1 Message Date
jaspreetsachdev
ca1eabfbd5 Merge pull request #648 from Telecominfraproject/main
merge for 3.0.2-RC2
2024-04-05 15:37:27 -04:00
John Crispin
c22767540e uspot: auto delete radius files from /tmp
Fixes: WIFI-13547
Signed-off-by: John Crispin <john@phrozen.org>
2024-04-05 16:42:55 +02:00
Arif Alam
dff6a6e3d8 ipq807x: oap101-6e: fix BSSIDs
Signed-off-by: Arif Alam <arif.alam@netexperience.com>
2024-04-04 11:18:30 +02:00
Arif Alam
a7c9a5f780 hostapd: WISPr bandwidth for psk2-radius
Get bandwidth limits from WISPr RADIUS AVPs for RADIUS ACL.

Signed-off-by: Arif Alam <arif.alam@netexperience.com>
2024-04-03 11:34:36 +02:00
Arif Alam
f8eca25f7e base-files/ipq807x: wf196: fixup eth0/eth1 mac
Fixes WIFI-13561

Signed-off-by: Arif Alam <arif.alam@netexperience.com>
2024-04-03 11:34:08 +02:00
Rick Sommerville
be59b10acc bridger: block forward to same ifindex/vlan
Fixes WIFI-13482

Signed-off-by: Rick Sommerville <rick.sommerville@netexperience.com>
2024-04-03 11:33:32 +02:00
Arif Alam
1ec29f6705 Fix psk2-radius feature
Add psk2-radius functionality in hostapd and fix config via netifd.

Fixes WIFI-13183
Signed-off-by: Arif Alam <arif.alam@netexperience.com>
2024-03-25 15:57:26 +01:00
John Crispin
3ae0a1f1d5 ipq95xx: add FTM support
Fixes: WIFI-13546
Signed-off-by: John Crispin <john@phrozen.org>
2024-03-25 15:56:50 +01:00
John Crispin
f362b7139e ucentral-schema: update to latest HEAD
cb1c18d add support for device fingerprinting

Fixes: WIFI-13429
Signed-off-by: John Crispin <john@phrozen.org>
2024-03-25 15:56:42 +01:00
John Crispin
bdd2074d78 ufp: fix package dependencies
Fixes: WIFI-13429
Signed-off-by: John Crispin <john@phrozen.org>
2024-03-25 15:56:16 +01:00
John Crispin
98ef44fc34 ucentral-client: update to latest HEAD
7628b5c add schema version to connect message

Fixes: WIFI-13548
Signed-off-by: John Crispin <john@phrozen.org>
2024-03-25 15:56:12 +01:00
Arif Alam
9bb982460a Add ufp
Signed-off-by: Arif Alam <arif.alam@netexperience.com>
2024-03-22 07:29:59 +01:00
Arif Alam
22126a3410 ratelimit: fix ratelimit with dynamic vlan
Fixes WIFI-13512

Signed-off-by: Arif Alam <arif.alam@netexperience.com>
2024-03-22 07:06:21 +01:00
jaspreetsachdev
f0035a9908 Merge pull request #640 from Telecominfraproject/main
Merge main for RC1 of 3.0.2 patch release
2024-03-21 12:53:43 -04:00
Tanya Singh
0412bf03eb treewide: Fix dual boot fw upgrade for Edgecore APs
Fixes: WIFI-13497
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2024-03-21 08:25:42 +01:00
John Crispin
afcffbc418 ucentral-schema: update to latest HEAD
da09093 fix bss color handling

Signed-off-by: John Crispin <john@phrozen.org>
2024-03-14 08:16:48 +01:00
John Crispin
c29c179b9e .github: fix CIG WF-189 CI build
Signed-off-by: John Crispin <john@phrozen.org>
2024-03-10 12:36:31 +01:00
wingate5678
36c4008c68 ipq8074: cybertan eww631 a1/b1 - support v5.4
Signed-off-by: wingate5678 <wingate.chi@cybertan.com.tw>
2024-03-10 08:26:46 +01:00
John Crispin
07f5deefce ipq53xx: rename wf198->wf189
Signed-off-by: John Crispin <john@phrozen.org>
2024-03-08 09:23:18 +01:00
John Crispin
0d21a66d0a ipq95xx: fix mac80211 loop dependency
This broke CI builds.

Signed-off-by: John Crispin <john@phrozen.org>
2024-03-06 14:13:08 +01:00
Arif Alam
206b4348fc ath11k: add support to set txpower for 6GHz via iw
Signed-off-by: Arif Alam <arif.alam@netexperience.com>
2024-03-05 07:30:11 +01:00
John Crispin
f0c34c39da .github/: add wifi-7 boards to CI
Signed-off-by: John Crispin <john@phrozen.org>
2024-03-04 15:08:17 +01:00
John Crispin
b85b388eb5 ipq95xx: make the ucentral-schema data model work
Signed-off-by: John Crispin <john@phrozen.org>
2024-03-04 14:57:58 +01:00
John Crispin
556f8880bc ipq95xx: fix kernel download hash
Signed-off-by: John Crispin <john@phrozen.org>
2024-03-01 09:54:12 +01:00
tip-admin
bf2ca9a9e4 Create LICENSE 2024-02-29 08:48:14 -08:00
Tanya Singh
b24846cce3 mediatek: Update edgecore eap111 dts file to fix eth0 and eth1 MAC addr assignment
Fixes: WIFI-13253
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2024-02-29 08:49:47 +01:00
John Crispin
4bcc60934e rrmd: fix CSA on 6G channels
Fixes: WIFI-13384
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-29 07:28:13 +01:00
John Crispin
2b4fd7911a ipq807x: cybertan_eww631-b1: Fix LED control
Define the blue sys LED from the device tree as the POWER LED for the
CyberTAN EWW631-B1 platform. This allows LED control through uCentral
Signed-off-by: Paul White <paul@shasta.cloud>

Fixes: WIFI-13435
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-29 07:28:13 +01:00
John Crispin
7b0f05d11b CI: add cig_wf198.yml
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-29 07:28:13 +01:00
John Crispin
af4c7e4ce5 ucentral-schema: update to latest HEAD
e3d9064 captive: fix custom webroot config

Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:22 +01:00
Tanya Singh
bfeea74870 WIFI-13437: Update edgecore eap111 dts file to fix the model name to "EdgeCore EAP111"
Signed-off-by: Tanya Singh <tanya_singh@accton.com>
2024-02-28 18:56:22 +01:00
HaiBac
3b5f90b339 ipq807x: v5.4: add Wallys DR6018-V4 support
Signed-off-by: HaiBac <mail@bacnh.com>
2024-02-28 18:56:21 +01:00
John Crispin
8870e802a7 ipq807x: add sercomm ap72tip profile
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00
John Crispin
775af3700f ipq95xx: more fixes
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00
John Crispin
c95b91c399 ipq95xx: various updates
* finalize CIG WF198 support
* add Sercomm AP72tip support
* update BDF files
* improve firmware package

Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00
John Crispin
460050a114 ipq50xx: add CIF WF-198 support
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00
John Crispin
01adebbd6f ipq9574: update kernel/drivers to ath12.3-cs
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00
John Crispin
dcdbb4f091 ipq95xx/hostapd: update to ath12.3-cs
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00
John Crispin
144c5d00f4 ipq95xx/mac80211: update to ATH12.3-CS
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00
John Crispin
2826c6d487 ipq807x: unify US/CA image for CIG WF196
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00
John Crispin
367415663f cfg80211: pass default country code to cfg80211 during module load
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00
John Crispin
3ce4088499 ipq60xx: unify wf188n profile
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-28 18:56:21 +01:00
John Crispin
37f1ef534e ipq807x: use v5.4 kernel on fap655
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-22 16:12:12 +01:00
John Crispin
1142deb3d0 ucentral-schema: update to latest HEAD
a3ea74a Provide Input Validation for Romaing Mobility Domain

Signed-off-by: John Crispin <john@phrozen.org>
2024-02-19 14:18:14 +01:00
Piotr Dymacz
922067a652 feeds: mcu: umcumgr: update to latest HEAD
6704b5b83e9d smp: fix minor spelling typos
a0c5a18fa2a5 zcbor: upgrade zcbor to 0.7.0
52aee9047ec2 zcbor/smp: replace auto-generated code with zcbor functions
09606bc8e449 smp: print {en,de}code error with 'zcbor_peek_error'
b91c19ef5106 umcumgr/smp: allow disabling 'confirm' and 'test' commands
5849f7a503cd smp: restore timeout value for select()
45d9523c0c13 umcumgr: use 'stderr' for 'usage' only if error occurred
28d0044ab5b3 umcumgr: introduce support for TI serial bootloader
db34a3645b21 umcumgr: add support for 'dump' in TI serial bootloader mode
df3f235bcb3c smp: fix images list print
bde8686bac61 zcbor: upgrade zcbor to 0.8.1
ed34b2816f2b smp: adapt to changes introduced in zcbor 0.8.0

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
2024-02-15 06:47:12 +01:00
Piotr Dymacz
62b9c6e257 ipq807x: v5.4: {e,o}ap102: export MCU and USB related pins
This exports MCU/USB related pins in sysfs using 'gpio-export' on the
EdgeCore {E,O}AP102 boards as:
- mcu-enable
- usb-rear-power
- usb-side-power
- usb-hub-enable

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
2024-02-15 06:46:55 +01:00
Piotr Dymacz
63dd51cbc4 ipq807x: v5.4: {e,o}ap102: add pin configs for USB and MCU
This adds configuration for pins connected with nRF52840 MCU (reset and
one apparently used by device vendor for DTM enable) and related to USB
(GL850G HUB reset and rear/side ports power) on the EdgeCore {E,O}AP102.

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
2024-02-15 06:46:42 +01:00
Piotr Dymacz
80c55c2d82 ipq807x: v5.4: tidy up EdgeCore {E,O}AP102 DTS files
This change focuses on the I/O related cleanups for EdgeCore {E,O}AP102
DTS files. List of changes:

1. Remove 'usb_mux_sel' pinctrl mux
   Defined label isn't used as reference in any other node and defined
   GPIO isn't used as well.

2. Remove 'pci@20000000', related PHY and pinctrl mux nodes
   {E,O}AP102 doesn't use of any of the IPQ8071A PCIe buses.

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
2024-02-15 06:46:32 +01:00
Piotr Dymacz
4e2b42e95a ipq807x: v5.4: wf196: export MCU reset pin
This exports MCU reset pin as 'mcu-enable' in sysfs with 'gpio-export'.

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
2024-02-15 06:46:21 +01:00
Piotr Dymacz
1949f602bf ipq807x: v5.4: wf196: add pin config for MCU reset
This adds config for nRF52833 MCU reset pin on the CIG WF196.

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
2024-02-15 06:46:11 +01:00
Piotr Dymacz
84f86bfc98 ipq807x: v5.4: wf196: enable and add pin config for MCU UART
This was lost during kernel v4.4 to v5.4 migration. Bring back correct
pin configuration (only 2-pin) and UART node used by the on-board MCU.

Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
2024-02-15 06:45:49 +01:00
John Crispin
ed9d29fb03 ucentral-schema: update to latest HEAD
fda6ded fix tracking of upstream swconfig vlans

Fixes: WIFI-13316
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-08 06:04:09 +01:00
John Crispin
c587a12ee5 ipq807x: fix typo when loading ath11k-macs
Fixes: WIFI-13368
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-08 06:03:33 +01:00
John Crispin
2197badcde ipq807x: make FTM work
Signed-off-by: John Crispin <john@phrozen.org>
2024-02-06 14:56:25 +01:00
Arif Alam
84c8eb5ccf base-files/ipq807x: wf196: fix BSSIDs
Use base MAC address to generate PHY BSSIDs.

Signed-off-by: Arif Alam <arif.alam@netexperience.com>
2024-02-06 10:27:44 +01:00
Paul White
16ebb7cec3 eap-104: fix dualboot: reset bootcount
The bootcount wasn't getting reset to 0 upon a successful boot,
resulting in falling back to the previous firmware version after three
reboots of the AP.

Fixes: WIFI-13359
Signed-off-by: Paul White <paul@shasta.cloud>
2024-02-06 10:26:52 +01:00
Paul White
75a51e3cd9 ucentral-event: fix 802.1x with dynamic VLAN
This adds a workaround to fix an issue with 802.1x + DVLANs on platforms
where LAN ports are through an integrated switch (swconfig).

Netifd is tracking the wired ports as part of a bridge-vlan: either a
static one, or 4090 for the default untagged bridge.  When hostapd
authorizes the wired port, netifd is automatically adding this bridge
vlan as PVID untagged to the port.  The vlan_add event then adds the
dynamic VLAN as untagged to the same port.  The result is that the
port is operating on the PVID bridge vlan, and not the dynamic VLAN.
Fixing this in netifd is going to be complex and take time, so this
change includes a workaround.   When a wired client is authorized
using a dynamic VLAN, ucentral-event takes the following actions:
   - Remove the bridge VLAN from the port
       bridge vlan del dev <port> vid <bridge-vlan>
   - Modify the dynamic VLAN to PVID
       bridge vlan add dev <port> vid <dynamic-vlan> pvid untagged

Fixes: WIFI-13358
Signed-off-by: Paul White <paul@shasta.cloud>
2024-02-06 10:25:02 +01:00
Paul White
832fbb8898 hostapd: include vlan_id in sta-authorized event
There are use cases where it's helpful to know the vlan_id assigned to a
client (dynamic VLAN) when consuming the sta-authorized ubus event

Signed-off-by: Paul White <paul@shasta.cloud>
2024-02-06 10:25:02 +01:00
Paul White
4d2603b4ce ucentral-event: Add DVLAN uplink to dhcpsnoop
When an uplink interface is created for a DVLAN due to swconfig support,
add this new interface to dhcpsnoop

Signed-off-by: Paul White <paul@shasta.cloud>
2024-02-06 10:24:21 +01:00
Paul White
6fc396682c udhcpsnoop: added ubus 'add_devices' command
Added the new ubus command 'add_devices' which takes the same devies
JSON schema data as the 'config' command does.   This is needed, for
example, to add dynamic VLAN uplink devices once they are created

Signed-off-by: Paul White <paul@shasta.cloud>
2024-02-06 10:24:21 +01:00
jaspreetsachdev
14aa04ad10 Merge pull request #620 from Telecominfraproject/v3.0.0-release
V3.0.1 release
2024-01-24 22:56:45 -05:00
Jaspreet Sachdev
589cdf6795 Merge branch 'main' into v3.0.0-release 2024-01-24 22:55:00 -05:00
John Crispin
d5ffdffd8c ucentral-state: with swconfig dvlan/local break-out mode
Fixes: WIFI-13316
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
John Crispin
a14df28bd6 rstrip.sh: do not strip FW binaries
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
Paul White
25bec55d4a cybertan_eww631-b1: Fix LAN port mappings
The LAN port mappings were reversed, causing the port with LAN1 label to
be reported as LAN3 in uCentral

Signed-off-by: Paul White <paul@shasta.cloud>
2024-01-23 17:27:49 +01:00
John Crispin
575686449a ucentral-schema: update to latest HEAD
3093a56 track upstream vlans created by swconfig
605ed2f bridge-vlan: add wan port only behind swconfig
bfd4a07 Fix state/interface.ssid.yml

Fixes: WIFI-13316
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
Kishan Shukla
a849ad6e39 ath11k-wifi: update HFCL ION4xe BDF file
Fixes: WIFI-13250
Signed-off-by: Kishan Shukla <kishan.shukla@hfcl.com>
2024-01-23 17:27:49 +01:00
John Crispin
de834a7d07 ramips: reduce yuncore ax820 SPI clock speed to 20MHz
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
John Crispin
d8fd2b8f39 rrmd: do not automatically trigger beacon reports when a station joins
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
John Crispin
e1745cae9b netifd: only reload swconfig if something changed
Fixes: WIFI-13251
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
John Crispin
bfa3b829ee ipq50xx: fix yuncore fap655 switch reset GPIO on v5.4 kernel
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
John Crispin
91dacf0e93 ucentral-state: minor rework of the offline_timer
Fixes: WIFI-12974
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
John Crispin
c0dcc4aea2 ucentral-schema: update to latest HEAD
ecc742a allow sending multiple DNS servers to dhcp clients
70bd716 move switch-vlan generation to brige-vlan

Fixes: WIFI-13278
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
John Crispin
c97ac2da72 ipq807x_v5.4: enable dual boot support
the V54. kernel port was missing the BOOTCONFIG module

Fixes: WIFI-13279
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
John Crispin
f21fa9ab80 hostapd: add missing NULL pointer check on radar notification
Fixes: WIFI-13266
Fixes: WIFI-13265
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
Felix Fietkau
9305bc609b ipq807x_v5.4: fix ath11k crash on invalid band with legacy rates
Signed-off-by: Felix Fietkau <nbd@nbd.name>
2024-01-23 17:27:49 +01:00
John Crispin
6d81e1e587 ucentral-client: update to latest HEAD
f19b1e8 add support for the "fixedconfig" command
ca090c4 add default settings section to connect message

Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
John Crispin
0c55b1f97a ucentral-schema: update to latest HEAD
c544ab0 state: ignore non connected thermal zones

Fixes: WIFI-13274
Signed-off-by: John Crispin <john@phrozen.org>
2024-01-23 17:27:49 +01:00
1524 changed files with 244499 additions and 55111 deletions

View File

@@ -21,7 +21,7 @@ jobs:
strategy:
fail-fast: false
matrix:
target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf196', 'cig_wf660a', 'cybertan_eww622-a1', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap111', 'edgecore_ecw5211', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'edgecore_oap102', 'hfcl_ion4','hfcl_ion4xi_wp', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4xi_w', 'hfcl_ion4xi_HMR', 'hfcl_ion4x_w', 'indio_um-305ax', 'indio_um-325ac', 'indio_um-510ac-v3', 'indio_um-550ac', 'indio_um-310ax-v1', 'indio_um-510axp-v1', 'indio_um-510axm-v1', 'udaya_a5-id2', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018_v4', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655' ]
target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf196', 'cig_wf189', 'cig_wf660a', 'cybertan_eww622-a1', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap111', 'edgecore_ecw5211', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'edgecore_oap102', 'hfcl_ion4','hfcl_ion4xi_wp', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4xi_w', 'hfcl_ion4xi_HMR', 'hfcl_ion4x_w', 'indio_um-305ax', 'indio_um-325ac', 'indio_um-510ac-v3', 'indio_um-550ac', 'indio_um-310ax-v1', 'indio_um-510axp-v1', 'indio_um-510axm-v1', 'sercomm_ap72tip', 'udaya_a5-id2', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018-v4', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655' ]
steps:
- uses: actions/checkout@v3

28
LICENSE Normal file
View File

@@ -0,0 +1,28 @@
BSD 3-Clause License
Copyright (c) 2024, Telecom Infra Project
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@@ -83,12 +83,12 @@ platform_do_upgrade() {
part="$(awk -F 'ubi.mtd=' '{printf $2}' /proc/cmdline | cut -d " " -f 1)"
case "$part" in
rootfs1)
fw_setenv active 2 || exit 1
CI_UBIPART="rootfs2"
CI_FWSETENV="active 2"
;;
rootfs2)
fw_setenv active 1 || exit 1
CI_UBIPART="rootfs1"
CI_FWSETENV="active 1"
;;
*)
# legacy bootloader

View File

@@ -133,7 +133,7 @@ qcom_setup_interfaces()
ucidef_set_interface_lan ""
;;
cybertan,eww631-b1)
ucidef_add_switch "switch1" "5:wan" "2:lan" "3:lan" "4:lan" "6@eth0"
ucidef_add_switch "switch1" "5:wan" "4:lan" "3:lan" "2:lan" "6@eth0"
;;
wallys,dr5018)
ucidef_set_interface_lan "eth0 eth1"

View File

@@ -16,7 +16,8 @@ boot() {
;;
edgecore,eap101|\
edgecore,eap102|\
edgecore,oap102)
edgecore,oap102|\
edgecore.eap104)
avail=$(fw_printenv -n upgrade_available)
[ "${avail}" -eq 1 ] || fw_setenv upgrade_available 1
fw_setenv bootcount 0

View File

@@ -247,8 +247,8 @@ nand_do_upgrade_success() {
local conf_tar="/tmp/sysupgrade.tgz"
sync
[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
[ -f "$conf_tar" ] && nand_restore_config "$conf_tar" && sync
[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
[ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
echo "sysupgrade successful"
umount -a
reboot -f

View File

@@ -194,8 +194,6 @@ platform_do_upgrade() {
cig,wf194c4|\
cig,wf196|\
cybertan,eww622-a1|\
cybertan,eww631-a1|\
cybertan,eww631-b1|\
glinet,ax1800|\
glinet,axt1800|\
indio,um-310ax-v1|\
@@ -262,8 +260,8 @@ platform_do_upgrade() {
else
if [ -e /tmp/downgrade ]; then
CI_UBIPART="rootfs1"
fw_setenv active 1 || exit 1
fw_setenv upgrade_available 0 || exit 1
{ echo 'active 1'; echo 'upgrade_available 0'; } > /tmp/fw_setenv.txt || exit 1
CI_FWSETENV="-s /tmp/fw_setenv.txt"
elif grep -q rootfs1 /proc/cmdline; then
CI_UBIPART="rootfs2"
CI_FWSETENV="active 2"
@@ -289,5 +287,18 @@ platform_do_upgrade() {
}
nand_upgrade_tar "$1"
;;
cybertan,eww631-a1|\
cybertan,eww631-b1)
boot_part=$(fw_printenv bootfrom | cut -d = -f2)
echo "Current bootfrom is $boot_part"
if [[ $boot_part == 1 ]]; then
CI_UBIPART="rootfs"
CI_FWSETENV="bootfrom 0"
else
CI_UBIPART="rootfs_1"
CI_FWSETENV="bootfrom 1"
fi
nand_upgrade_tar "$1"
;;
esac
}

View File

@@ -29,9 +29,9 @@ ALLWIFIBOARDS:= \
cig-wf660a \
cig-wf194c \
cig-wf194c4 \
cig-wf196-ca \
cig-wf196-us \
cybertan-eww622-a1 \
cybertan-eww631-a1 \
cybertan-eww631-b1 \
edgecore-eap101 \
gl-ax1800 \
gl-axt1800 \
@@ -89,14 +89,9 @@ $(call Package/ath11k-wifi-default)
TITLE:=board-2.bin for QCOM IPQ6122 eval kits
endef
define Package/ath11k-wifi-cig-wf196_6g-ca
define Package/ath11k-wifi-cig-wf196
$(call Package/ath11k-wifi-default)
TITLE:=cig-wf196 6G bdf CA
endef
define Package/ath11k-wifi-cig-wf196_6g-us
$(call Package/ath11k-wifi-default)
TITLE:=cig-wf196 6G bdf US
TITLE:=cig-wf196 bdf
endef
define Package/ath11k-wifi-gl-ax1800
@@ -134,6 +129,11 @@ $(call Package/ath11k-wifi-default)
TITLE:=hfcl-ion4xi bdf
endef
define Package/ath11k-wifi-hfcl-ion4xe
$(call Package/ath11k-wifi-default)
TITLE:=hfcl-ion4xe bdf
endef
define Package/ath11k-wifi-hfcl-ion4xi_w
$(call Package/ath11k-wifi-default)
TITLE:=hfcl-ion4xi_w bdf
@@ -170,14 +170,9 @@ $(call Package/ath11k-wifi-default)
TITLE:=edgecore-oap101e bdf
endef
define Package/ath11k-wifi-cig-wf188n-ca
define Package/ath11k-wifi-cig-wf188n
$(call Package/ath11k-wifi-default)
TITLE:=cig-wf188n bdf CA
endef
define Package/ath11k-wifi-cig-wf188n-us
$(call Package/ath11k-wifi-default)
TITLE:=cig-wf188n bdf US
TITLE:=cig-wf188n bdf
endef
define ath11k-wifi-install-one-to
@@ -257,16 +252,12 @@ define Package/ath11k-wifi-qcom-qcn9000/install
$(INSTALL_DATA) ./board-2.bin.QCN9000 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board-2.bin
endef
define Package/ath11k-wifi-cig-wf196_6g-ca/install
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN9074/hw1.0/
$(INSTALL_DATA) ./board-cig-wf196_6g-ca.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin
echo -n 'CA' > $(1)/lib/firmware/country
endef
define Package/ath11k-wifi-cig-wf196_6g-us/install
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN9074/hw1.0/
$(INSTALL_DATA) ./board-cig-wf196_6g-us.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin
echo -n 'US' > $(1)/lib/firmware/country
define Package/ath11k-wifi-cig-wf196/install
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN9074/hw1.0/ $(1)/lib/firmware/ath11k/IPQ8074/hw2.0/
$(INSTALL_DATA) ./board-cig-wf196_6g-ca.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin.CA
$(INSTALL_DATA) ./board-cig-wf196_6g-us.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin.US
$(INSTALL_DATA) ./board-cig-wf196-ca.bin.IPQ8074 $(1)/lib/firmware/ath11k/IPQ8074/hw2.0/board.bin.CA
$(INSTALL_DATA) ./board-cig-wf196-us.bin.IPQ8074 $(1)/lib/firmware/ath11k/IPQ8074/hw2.0/board.bin.US
endef
define Package/ath11k-wifi-optimcloud-d50/install
@@ -315,6 +306,11 @@ define Package/ath11k-wifi-hfcl-ion4xi/install
$(INSTALL_DATA) ./board-hfcl-ion4xi.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board-2.bin
endef
define Package/ath11k-wifi-hfcl-ion4xe/install
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/
$(INSTALL_DATA) ./board-hfcl-ion4xe.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board-2.bin
endef
define Package/ath11k-wifi-hfcl-ion4xi_wp/install
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/
$(INSTALL_DATA) ./board-hfcl-ion4xi_wp.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board.bin
@@ -355,16 +351,10 @@ define Package/ath11k-wifi-edgecore-oap101e/install
$(INSTALL_DATA) ./board-2-edgecore-oap101e.bin.QCN6122 $(1)/lib/firmware/ath11k/qcn6122/hw1.0/board-2.bin
endef
define Package/ath11k-wifi-cig-wf188n-ca/install
define Package/ath11k-wifi-cig-wf188n/install
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/
$(INSTALL_DATA) ./board-cig-wf188n-ca.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board.bin
echo -n 'CA MY DE' > $(1)/lib/firmware/country
endef
define Package/ath11k-wifi-cig-wf188n-us/install
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/
$(INSTALL_DATA) ./board-cig-wf188n-us.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board.bin
echo -n 'US MY DE' > $(1)/lib/firmware/country
$(INSTALL_DATA) ./board-cig-wf188n-ca.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board.bin.CA
$(INSTALL_DATA) ./board-cig-wf188n-us.bin.IPQ6018 $(1)/lib/firmware/ath11k/IPQ6018/hw1.0/board.bin.US
endef
$(eval $(call generate-ath11k-wifi-package,cig-wf186w,Cigtech WF186w))
@@ -372,9 +362,9 @@ $(eval $(call generate-ath11k-wifi-package,cig-wf186h,Cigtech WF186h))
$(eval $(call generate-ath11k-wifi-package,cig-wf660a,Cigtech WF660a))
$(eval $(call generate-ath11k-wifi-package,cig-wf194c,Cigtech WF194c))
$(eval $(call generate-ath11k-wifi-package,cig-wf194c4,Cigtech WF194c4))
$(eval $(call generate-ath11k-wifi-package,cig-wf196-ca,Cigtech WF196 CA))
$(eval $(call generate-ath11k-wifi-package,cig-wf196-us,Cigtech WF196 US))
$(eval $(call generate-ath11k-wifi-package,cybertan-eww622-a1,CyberTan EWW622 A1))
$(eval $(call generate-ath11k-wifi-package,cybertan-eww631-a1,CyberTan EWW631 A1))
$(eval $(call generate-ath11k-wifi-package,cybertan-eww631-b1,CyberTan EWW631 B1))
$(eval $(call generate-ath11k-wifi-package,sercomm-wallaby,Sercomm Kiwi))
$(eval $(call generate-ath11k-wifi-package,wallys-dr6018,Wallys DR6018))
$(eval $(call generate-ath11k-wifi-package,wallys-dr6018-v4,Wallys DR6018 V4))
@@ -400,17 +390,16 @@ $(eval $(call BuildPackage,ath11k-wifi-qcom-ipq6122))
$(eval $(call BuildPackage,ath11k-wifi-qcom-ipq8074))
$(eval $(call BuildPackage,ath11k-wifi-qcom-ipq6018))
$(eval $(call BuildPackage,ath11k-wifi-qcom-qcn9000))
$(eval $(call BuildPackage,ath11k-wifi-cig-wf196_6g-ca))
$(eval $(call BuildPackage,ath11k-wifi-cig-wf196_6g-us))
$(eval $(call BuildPackage,ath11k-wifi-cig-wf196))
$(eval $(call BuildPackage,ath11k-wifi-motorola-q14))
$(eval $(call BuildPackage,ath11k-wifi-optimcloud-d50))
$(eval $(call BuildPackage,ath11k-wifi-optimcloud-d60))
$(eval $(call BuildPackage,ath11k-wifi-hfcl-ion4xi))
$(eval $(call BuildPackage,ath11k-wifi-hfcl-ion4xe))
$(eval $(call BuildPackage,ath11k-wifi-hfcl-ion4xi_wp))
$(eval $(call BuildPackage,ath11k-wifi-hfcl-ion4xi_w))
$(eval $(call BuildPackage,ath11k-wifi-hfcl-ion4x_w))
$(eval $(call BuildPackage,ath11k-wifi-hfcl-ion4xi_HMR))
$(eval $(call BuildPackage,ath11k-wifi-edgecore-oap101))
$(eval $(call BuildPackage,ath11k-wifi-edgecore-oap101e))
$(eval $(call BuildPackage,ath11k-wifi-cig-wf188n-ca))
$(eval $(call BuildPackage,ath11k-wifi-cig-wf188n-us))
$(eval $(call BuildPackage,ath11k-wifi-cig-wf188n))

View File

@@ -0,0 +1,459 @@
From 1c3438fec4bad13a676617915ff56af54e7b4542 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <j@w1.fi>
Date: Sat, 2 Apr 2022 13:12:43 +0300
Subject: [PATCH] RADIUS ACL/PSK check during 4-way handshake
Add an alternative sequence for performing the RADIUS ACL check and PSK
fetch. The previously used (macaddr_acl=2, wpa_psk_radius=2) combination
does this during IEEE 802.11 Authentication frame exchange while the new
option (wpa_psk_radius=3) does this during the 4-way handshake. This
allows some more information to be provided to the RADIUS authentication
server.
Signed-off-by: Jouni Malinen <j@w1.fi>
---
hostapd/config_file.c | 3 +-
hostapd/hostapd.conf | 5 ++-
src/ap/ap_config.c | 4 ++-
src/ap/ap_config.h | 5 +--
src/ap/ieee802_11.c | 5 ++-
src/ap/ieee802_11.h | 2 ++
src/ap/ieee802_11_auth.c | 76 ++++++++++++++++++++++++++++++++++++----
src/ap/ieee802_11_auth.h | 5 ++-
src/ap/wpa_auth.c | 51 ++++++++++++++++++++++++++-
src/ap/wpa_auth.h | 9 ++++-
src/ap/wpa_auth_glue.c | 25 ++++++++++++-
src/ap/wpa_auth_i.h | 1 +
12 files changed, 172 insertions(+), 19 deletions(-)
--- a/hostapd/config_file.c
+++ b/hostapd/config_file.c
@@ -2858,7 +2858,8 @@ static int hostapd_config_fill(struct ho
bss->wpa_psk_radius = atoi(pos);
if (bss->wpa_psk_radius != PSK_RADIUS_IGNORED &&
bss->wpa_psk_radius != PSK_RADIUS_ACCEPTED &&
- bss->wpa_psk_radius != PSK_RADIUS_REQUIRED) {
+ bss->wpa_psk_radius != PSK_RADIUS_REQUIRED &&
+ bss->wpa_psk_radius != PSK_RADIUS_DURING_4WAY_HS) {
wpa_printf(MSG_ERROR,
"Line %d: unknown wpa_psk_radius %d",
line, bss->wpa_psk_radius);
--- a/hostapd/hostapd.conf
+++ b/hostapd/hostapd.conf
@@ -1635,12 +1635,15 @@ own_ip_addr=127.0.0.1
#wpa_psk_file=/etc/hostapd.wpa_psk
# Optionally, WPA passphrase can be received from RADIUS authentication server
-# This requires macaddr_acl to be set to 2 (RADIUS)
+# This requires macaddr_acl to be set to 2 (RADIUS) for wpa_psk_radius values
+# 1 and 2.
# 0 = disabled (default)
# 1 = optional; use default passphrase/psk if RADIUS server does not include
# Tunnel-Password
# 2 = required; reject authentication if RADIUS server does not include
# Tunnel-Password
+# 3 = ask RADIUS server during 4-way handshake if there is no locally
+# configured PSK/passphrase for the STA
#wpa_psk_radius=0
# Set of accepted key management algorithms (WPA-PSK, WPA-EAP, or both). The
--- a/src/ap/ap_config.c
+++ b/src/ap/ap_config.c
@@ -1,6 +1,6 @@
/*
* hostapd / Configuration helper functions
- * Copyright (c) 2003-2014, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2003-2022, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
@@ -1245,6 +1245,7 @@ static int hostapd_config_check_bss(stru
if (full_config && bss->wpa &&
bss->wpa_psk_radius != PSK_RADIUS_IGNORED &&
+ bss->wpa_psk_radius != PSK_RADIUS_DURING_4WAY_HS &&
bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH) {
wpa_printf(MSG_ERROR, "WPA-PSK using RADIUS enabled, but no "
"RADIUS checking (macaddr_acl=2) enabled.");
@@ -1254,6 +1255,7 @@ static int hostapd_config_check_bss(stru
if (full_config && bss->wpa && (bss->wpa_key_mgmt & WPA_KEY_MGMT_PSK) &&
bss->ssid.wpa_psk == NULL && bss->ssid.wpa_passphrase == NULL &&
bss->ssid.wpa_psk_file == NULL &&
+ bss->wpa_psk_radius != PSK_RADIUS_DURING_4WAY_HS &&
(bss->wpa_psk_radius != PSK_RADIUS_REQUIRED ||
bss->macaddr_acl != USE_EXTERNAL_RADIUS_AUTH)) {
wpa_printf(MSG_ERROR, "WPA-PSK enabled, but PSK or passphrase "
--- a/src/ap/ap_config.h
+++ b/src/ap/ap_config.h
@@ -1,6 +1,6 @@
/*
* hostapd / Configuration definitions and helpers functions
- * Copyright (c) 2003-2015, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2003-2022, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
@@ -367,7 +367,8 @@ struct hostapd_bss_config {
enum {
PSK_RADIUS_IGNORED = 0,
PSK_RADIUS_ACCEPTED = 1,
- PSK_RADIUS_REQUIRED = 2
+ PSK_RADIUS_REQUIRED = 2,
+ PSK_RADIUS_DURING_4WAY_HS = 3,
} wpa_psk_radius;
int wpa_pairwise;
int group_cipher; /* wpa_group value override from configuation */
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
@@ -2348,9 +2348,8 @@ static int ieee802_11_allowed_address(st
}
-static int
-ieee802_11_set_radius_info(struct hostapd_data *hapd, struct sta_info *sta,
- int res, struct radius_sta *info)
+int ieee802_11_set_radius_info(struct hostapd_data *hapd, struct sta_info *sta,
+ int res, struct radius_sta *info)
{
u32 session_timeout = info->session_timeout;
u32 acct_interim_interval = info->acct_interim_interval;
--- a/src/ap/ieee802_11.h
+++ b/src/ap/ieee802_11.h
@@ -220,4 +220,6 @@ void auth_sae_process_commit(void *eloop
u8 * hostapd_eid_rsnxe(struct hostapd_data *hapd, u8 *eid, size_t len);
u8 * hostapd_get_rsne(struct hostapd_data *hapd, u8 *pos, size_t len);
u8 * hostapd_get_rsnxe(struct hostapd_data *hapd, u8 *pos, size_t len);
+int ieee802_11_set_radius_info(struct hostapd_data *hapd, struct sta_info *sta,
+ int res, struct radius_sta *info);
#endif /* IEEE802_11_H */
--- a/src/ap/ieee802_11_auth.c
+++ b/src/ap/ieee802_11_auth.c
@@ -1,6 +1,6 @@
/*
* hostapd / IEEE 802.11 authentication (ACL)
- * Copyright (c) 2003-2012, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2003-2022, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
@@ -20,6 +20,8 @@
#include "hostapd.h"
#include "ap_config.h"
#include "ap_drv_ops.h"
+#include "sta_info.h"
+#include "wpa_auth.h"
#include "ieee802_11.h"
#include "ieee802_1x.h"
#include "ieee802_11_auth.h"
@@ -43,6 +45,8 @@ struct hostapd_acl_query_data {
u8 *auth_msg; /* IEEE 802.11 authentication frame from station */
size_t auth_msg_len;
struct hostapd_acl_query_data *next;
+ bool radius_psk;
+ int akm;
};
@@ -153,6 +157,13 @@ static int hostapd_radius_acl_query(stru
goto fail;
}
+ if (query->akm &&
+ !radius_msg_add_attr_int32(msg, RADIUS_ATTR_WLAN_AKM_SUITE,
+ wpa_akm_to_suite(query->akm))) {
+ wpa_printf(MSG_DEBUG, "Could not add WLAN-AKM-Suite");
+ goto fail;
+ }
+
if (radius_client_send(hapd->radius, msg, RADIUS_AUTH, addr) < 0)
goto fail;
return 0;
@@ -566,17 +577,40 @@ hostapd_acl_recv_radius(struct radius_ms
cache->next = hapd->acl_cache;
hapd->acl_cache = cache;
+ if (query->radius_psk) {
+ struct sta_info *sta;
+ bool success = cache->accepted == HOSTAPD_ACL_ACCEPT;
+
+ sta = ap_get_sta(hapd, query->addr);
+ if (!sta || !sta->wpa_sm) {
+ wpa_printf(MSG_DEBUG,
+ "No STA/SM entry found for the RADIUS PSK response");
+ goto done;
+ }
+#ifdef NEED_AP_MLME
+ if (success &&
+ (ieee802_11_set_radius_info(hapd, sta, cache->accepted,
+ info) < 0 ||
+ ap_sta_bind_vlan(hapd, sta) < 0))
+ success = false;
+#endif /* NEED_AP_MLME */
+ wpa_auth_sta_radius_psk_resp(sta->wpa_sm, success);
+ } else {
#ifdef CONFIG_DRIVER_RADIUS_ACL
- hostapd_drv_set_radius_acl_auth(hapd, query->addr, cache->accepted,
- info->session_timeout);
+ hostapd_drv_set_radius_acl_auth(hapd, query->addr,
+ cache->accepted,
+ info->session_timeout);
#else /* CONFIG_DRIVER_RADIUS_ACL */
#ifdef NEED_AP_MLME
- /* Re-send original authentication frame for 802.11 processing */
- wpa_printf(MSG_DEBUG, "Re-sending authentication frame after "
- "successful RADIUS ACL query");
- ieee802_11_mgmt(hapd, query->auth_msg, query->auth_msg_len, NULL);
+ /* Re-send original authentication frame for 802.11 processing
+ */
+ wpa_printf(MSG_DEBUG,
+ "Re-sending authentication frame after successful RADIUS ACL query");
+ ieee802_11_mgmt(hapd, query->auth_msg, query->auth_msg_len,
+ NULL);
#endif /* NEED_AP_MLME */
#endif /* CONFIG_DRIVER_RADIUS_ACL */
+ }
done:
if (prev == NULL)
@@ -658,3 +692,31 @@ void hostapd_free_psk_list(struct hostap
os_free(prev);
}
}
+
+
+#ifndef CONFIG_NO_RADIUS
+void hostapd_acl_req_radius_psk(struct hostapd_data *hapd, const u8 *addr,
+ int key_mgmt, const u8 *anonce,
+ const u8 *eapol, size_t eapol_len)
+{
+ struct hostapd_acl_query_data *query;
+
+ query = os_zalloc(sizeof(*query));
+ if (!query)
+ return;
+
+ query->radius_psk = true;
+ query->akm = key_mgmt;
+ os_get_reltime(&query->timestamp);
+ os_memcpy(query->addr, addr, ETH_ALEN);
+ if (hostapd_radius_acl_query(hapd, addr, query)) {
+ wpa_printf(MSG_DEBUG,
+ "Failed to send Access-Request for RADIUS PSK/ACL query");
+ hostapd_acl_query_free(query);
+ return;
+ }
+
+ query->next = hapd->acl_queries;
+ hapd->acl_queries = query;
+}
+#endif /* CONFIG_NO_RADIUS */
--- a/src/ap/ieee802_11_auth.h
+++ b/src/ap/ieee802_11_auth.h
@@ -1,6 +1,6 @@
/*
* hostapd / IEEE 802.11 authentication (ACL)
- * Copyright (c) 2003-2005, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2003-2022, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
@@ -36,5 +36,8 @@ void hostapd_free_psk_list(struct hostap
void hostapd_acl_expire(struct hostapd_data *hapd);
void hostapd_copy_psk_list(struct hostapd_sta_wpa_psk_short **psk,
struct hostapd_sta_wpa_psk_short *src);
+void hostapd_acl_req_radius_psk(struct hostapd_data *hapd, const u8 *addr,
+ int key_mgmt, const u8 *anonce,
+ const u8 *eapol, size_t eapol_len);
#endif /* IEEE802_11_AUTH_H */
--- a/src/ap/wpa_auth.c
+++ b/src/ap/wpa_auth.c
@@ -1,6 +1,6 @@
/*
* IEEE 802.11 RSN / WPA Authenticator
- * Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2022, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
@@ -1465,6 +1465,12 @@ static void wpa_send_eapol_timeout(void
struct wpa_authenticator *wpa_auth = eloop_ctx;
struct wpa_state_machine *sm = timeout_ctx;
+ if (sm->waiting_radius_psk) {
+ wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG,
+ "Ignore EAPOL-Key timeout while waiting for RADIUS PSK");
+ return;
+ }
+
sm->pending_1_of_4_timeout = 0;
wpa_auth_logger(wpa_auth, sm->addr, LOGGER_DEBUG, "EAPOL-Key timeout");
sm->TimeoutEvt = true;
@@ -3003,6 +3009,19 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
break;
}
+ if (!ok && wpa_key_mgmt_wpa_psk_no_sae(sm->wpa_key_mgmt) &&
+ wpa_auth->conf.radius_psk && wpa_auth->cb->request_radius_psk &&
+ !sm->waiting_radius_psk) {
+ wpa_printf(MSG_DEBUG, "No PSK available - ask RADIUS server");
+ wpa_auth->cb->request_radius_psk(wpa_auth->cb_ctx, sm->addr,
+ sm->wpa_key_mgmt,
+ sm->ANonce,
+ sm->last_rx_eapol_key,
+ sm->last_rx_eapol_key_len);
+ sm->waiting_radius_psk = 1;
+ return;
+ }
+
if (!ok) {
wpa_auth_logger(sm->wpa_auth, sm->addr, LOGGER_DEBUG,
"invalid MIC in msg 2/4 of 4-Way Handshake");
@@ -3758,6 +3777,11 @@ SM_STEP(WPA_PTK)
} else if (wpa_auth_uses_sae(sm) && sm->pmksa) {
SM_ENTER(WPA_PTK, PTKSTART);
#endif /* CONFIG_SAE */
+ } else if (wpa_key_mgmt_wpa_psk_no_sae(sm->wpa_key_mgmt) &&
+ wpa_auth->conf.radius_psk) {
+ wpa_printf(MSG_DEBUG,
+ "INITPSK: No PSK yet available for STA - use RADIUS later");
+ SM_ENTER(WPA_PTK, PTKSTART);
} else {
wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
"no PSK configured for the STA");
@@ -5661,3 +5685,28 @@ void wpa_auth_set_ocv_override_freq(stru
}
#endif /* CONFIG_TESTING_OPTIONS */
+
+
+void wpa_auth_sta_radius_psk_resp(struct wpa_state_machine *sm, bool success)
+{
+ if (!sm->waiting_radius_psk) {
+ wpa_printf(MSG_DEBUG,
+ "Ignore RADIUS PSK response for " MACSTR
+ " that did not wait one",
+ MAC2STR(sm->addr));
+ return;
+ }
+
+ wpa_printf(MSG_DEBUG, "RADIUS PSK response for " MACSTR " (%s)",
+ MAC2STR(sm->addr), success ? "success" : "fail");
+ sm->waiting_radius_psk = 0;
+
+ if (success) {
+ /* Try to process the EAPOL-Key msg 2/4 again */
+ sm->EAPOLKeyReceived = true;
+ } else {
+ sm->Disconnect = true;
+ }
+
+ eloop_register_timeout(0, 0, wpa_sm_call_step, sm, NULL);
+}
--- a/src/ap/wpa_auth.h
+++ b/src/ap/wpa_auth.h
@@ -1,6 +1,6 @@
/*
* hostapd - IEEE 802.11i-2004 / WPA Authenticator
- * Copyright (c) 2004-2017, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2004-2022, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
@@ -273,6 +273,8 @@ struct wpa_auth_config {
* PTK derivation regardless of advertised capabilities.
*/
bool force_kdk_derivation;
+
+ bool radius_psk;
};
typedef enum {
@@ -320,6 +322,9 @@ struct wpa_auth_callbacks {
void (*store_ptksa)(void *ctx, const u8 *addr, int cipher,
u32 life_time, const struct wpa_ptk *ptk);
void (*clear_ptksa)(void *ctx, const u8 *addr, int cipher);
+ void (*request_radius_psk)(void *ctx, const u8 *addr, int key_mgmt,
+ const u8 *anonce,
+ const u8 *eapol, size_t eapol_len);
#ifdef CONFIG_IEEE80211R_AP
struct wpa_state_machine * (*add_sta)(void *ctx, const u8 *sta_addr);
int (*add_sta_ft)(void *ctx, const u8 *sta_addr);
@@ -567,4 +572,6 @@ void wpa_auth_set_ocv_override_freq(stru
enum wpa_auth_ocv_override_frame frame,
unsigned int freq);
+void wpa_auth_sta_radius_psk_resp(struct wpa_state_machine *sm, bool success);
+
#endif /* WPA_AUTH_H */
--- a/src/ap/wpa_auth_glue.c
+++ b/src/ap/wpa_auth_glue.c
@@ -1,6 +1,6 @@
/*
* hostapd / WPA authenticator glue code
- * Copyright (c) 2002-2012, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2022, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
@@ -29,6 +29,7 @@
#include "ap_drv_ops.h"
#include "ap_config.h"
#include "ieee802_11.h"
+#include "ieee802_11_auth.h"
#include "pmksa_cache_auth.h"
#include "wpa_auth.h"
#include "wpa_auth_glue.h"
@@ -214,6 +215,8 @@ static void hostapd_wpa_auth_conf(struct
wconf->force_kdk_derivation = conf->force_kdk_derivation;
#endif /* CONFIG_TESTING_OPTIONS */
#endif /* CONFIG_PASN */
+
+ wconf->radius_psk = conf->wpa_psk_radius == PSK_RADIUS_DURING_4WAY_HS;
}
@@ -1435,6 +1438,23 @@ static void hostapd_wpa_unregister_ft_ou
#endif /* CONFIG_IEEE80211R_AP */
+#ifndef CONFIG_NO_RADIUS
+static void hostapd_request_radius_psk(void *ctx, const u8 *addr, int key_mgmt,
+ const u8 *anonce,
+ const u8 *eapol, size_t eapol_len)
+{
+ struct hostapd_data *hapd = ctx;
+
+ wpa_printf(MSG_DEBUG, "RADIUS PSK request for " MACSTR " key_mgmt=0x%x",
+ MAC2STR(addr), key_mgmt);
+ wpa_hexdump(MSG_DEBUG, "ANonce", anonce, WPA_NONCE_LEN);
+ wpa_hexdump(MSG_DEBUG, "EAPOL", eapol, eapol_len);
+ hostapd_acl_req_radius_psk(hapd, addr, key_mgmt, anonce, eapol,
+ eapol_len);
+}
+#endif /* CONFIG_NO_RADIUS */
+
+
int hostapd_setup_wpa(struct hostapd_data *hapd)
{
struct wpa_auth_config _conf;
@@ -1478,6 +1498,9 @@ int hostapd_setup_wpa(struct hostapd_dat
.set_session_timeout = hostapd_wpa_auth_set_session_timeout,
.get_session_timeout = hostapd_wpa_auth_get_session_timeout,
#endif /* CONFIG_IEEE80211R_AP */
+#ifndef CONFIG_NO_RADIUS
+ .request_radius_psk = hostapd_request_radius_psk,
+#endif /* CONFIG_NO_RADIUS */
};
const u8 *wpa_ie;
size_t wpa_ie_len;
--- a/src/ap/wpa_auth_i.h
+++ b/src/ap/wpa_auth_i.h
@@ -89,6 +89,7 @@ struct wpa_state_machine {
unsigned int rx_eapol_key_secure:1;
unsigned int update_snonce:1;
unsigned int alt_snonce_valid:1;
+ unsigned int waiting_radius_psk:1;
#ifdef CONFIG_IEEE80211R_AP
unsigned int ft_completed:1;
unsigned int pmk_r1_name_valid:1;

View File

@@ -0,0 +1,350 @@
From 24763e3cd0a564eb71f3c501bbb4fbb0d7070762 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <j@w1.fi>
Date: Fri, 15 Apr 2022 17:31:48 +0300
Subject: [PATCH] RADIUS: Attributes with Extended Types (RFC 6929)
Supported extended types for RADIUS attributes for the cases defined in
RFC 6929.
Signed-off-by: Jouni Malinen <j@w1.fi>
---
src/radius/radius.c | 195 ++++++++++++++++++++++++++++++++++++++------
src/radius/radius.h | 26 +++++-
2 files changed, 193 insertions(+), 28 deletions(-)
diff --git a/src/radius/radius.c b/src/radius/radius.c
index be16e27b9..a64228067 100644
--- a/src/radius/radius.c
+++ b/src/radius/radius.c
@@ -1,6 +1,6 @@
/*
* RADIUS message processing
- * Copyright (c) 2002-2009, 2011-2015, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2009, 2011-2022, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
@@ -159,7 +159,8 @@ static const char *radius_code_string(u8 code)
struct radius_attr_type {
- u8 type;
+ u16 type; /* 0..255 for basic types;
+ * (241 << 8) | <ext-type> for extended types */
char *name;
enum {
RADIUS_ATTR_UNDIST, RADIUS_ATTR_TEXT, RADIUS_ATTR_IP,
@@ -260,11 +261,31 @@ static const struct radius_attr_type radius_attrs[] =
RADIUS_ATTR_HEXDUMP },
{ RADIUS_ATTR_WLAN_GROUP_MGMT_CIPHER, "WLAN-Group-Mgmt-Pairwise-Cipher",
RADIUS_ATTR_HEXDUMP },
+ { RADIUS_ATTR_EXT_TYPE_1, "Extended-Type-1", RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_EXT_TYPE_2, "Extended-Type-2", RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_EXT_TYPE_3, "Extended-Type-3", RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_EXT_TYPE_4, "Extended-Type-4", RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_LONG_EXT_TYPE_1, "Long-Extended-Type-1",
+ RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_LONG_EXT_TYPE_2, "Long-Extended-Type-2",
+ RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_EXT_VENDOR_SPECIFIC_1, "Extended-Vendor-Specific-1",
+ RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_EXT_VENDOR_SPECIFIC_2, "Extended-Vendor-Specific-2",
+ RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_EXT_VENDOR_SPECIFIC_3, "Extended-Vendor-Specific-3",
+ RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_EXT_VENDOR_SPECIFIC_4, "Extended-Vendor-Specific-4",
+ RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_EXT_VENDOR_SPECIFIC_5, "Extended-Vendor-Specific-5",
+ RADIUS_ATTR_UNDIST },
+ { RADIUS_ATTR_EXT_VENDOR_SPECIFIC_6, "Extended-Vendor-Specific-6",
+ RADIUS_ATTR_UNDIST },
};
#define RADIUS_ATTRS ARRAY_SIZE(radius_attrs)
-static const struct radius_attr_type *radius_get_attr_type(u8 type)
+static const struct radius_attr_type * radius_get_attr_type(u16 type)
{
size_t i;
@@ -277,23 +298,60 @@ static const struct radius_attr_type *radius_get_attr_type(u8 type)
}
+static bool radius_is_long_ext_type(u8 type)
+{
+ return type == RADIUS_ATTR_LONG_EXT_TYPE_1 ||
+ type == RADIUS_ATTR_LONG_EXT_TYPE_2;
+}
+
+
+static bool radius_is_ext_type(u8 type)
+{
+ return type >= RADIUS_ATTR_EXT_TYPE_1 &&
+ type <= RADIUS_ATTR_LONG_EXT_TYPE_2;
+}
+
+
static void radius_msg_dump_attr(struct radius_attr_hdr *hdr)
{
+ struct radius_attr_hdr_ext *ext = NULL;
const struct radius_attr_type *attr;
int len;
unsigned char *pos;
char buf[1000];
- attr = radius_get_attr_type(hdr->type);
+ if (hdr->length < sizeof(struct radius_attr_hdr))
+ return;
- wpa_printf(MSG_INFO, " Attribute %d (%s) length=%d",
- hdr->type, attr ? attr->name : "?Unknown?", hdr->length);
+ if (radius_is_ext_type(hdr->type)) {
+ if (hdr->length < 4) {
+ wpa_printf(MSG_INFO,
+ " Invalid attribute %d (too short for extended type)",
+ hdr->type);
+ return;
+ }
- if (attr == NULL || hdr->length < sizeof(struct radius_attr_hdr))
- return;
+ ext = (struct radius_attr_hdr_ext *) hdr;
+ }
+
+ if (ext) {
+ attr = radius_get_attr_type((ext->type << 8) | ext->ext_type);
+ wpa_printf(MSG_INFO, " Attribute %d.%d (%s) length=%d",
+ ext->type, ext->ext_type,
+ attr ? attr->name : "?Unknown?", ext->length);
+ pos = (unsigned char *) (ext + 1);
+ len = ext->length - sizeof(struct radius_attr_hdr_ext);
+ } else {
+ attr = radius_get_attr_type(hdr->type);
+ wpa_printf(MSG_INFO, " Attribute %d (%s) length=%d",
+ hdr->type, attr ? attr->name : "?Unknown?",
+ hdr->length);
+ pos = (unsigned char *) (hdr + 1);
+ len = hdr->length - sizeof(struct radius_attr_hdr);
+ }
- len = hdr->length - sizeof(struct radius_attr_hdr);
- pos = (unsigned char *) (hdr + 1);
+ if (!attr)
+ return;
switch (attr->data_type) {
case RADIUS_ATTR_TEXT:
@@ -627,22 +685,54 @@ static int radius_msg_add_attr_to_array(struct radius_msg *msg,
}
-struct radius_attr_hdr *radius_msg_add_attr(struct radius_msg *msg, u8 type,
- const u8 *data, size_t data_len)
+struct radius_attr_hdr * radius_msg_add_attr(struct radius_msg *msg, u16 type,
+ const u8 *data, size_t data_len)
{
- size_t buf_needed;
- struct radius_attr_hdr *attr;
+ size_t buf_needed, max_len;
+ struct radius_attr_hdr *attr = NULL;
+ struct radius_attr_hdr_ext *ext;
+ u8 ext_type = 0;
if (TEST_FAIL())
return NULL;
- if (data_len > RADIUS_MAX_ATTR_LEN) {
- wpa_printf(MSG_ERROR, "radius_msg_add_attr: too long attribute (%lu bytes)",
- (unsigned long) data_len);
- return NULL;
+ if (type > 255) {
+ if (!radius_is_ext_type(type >> 8)) {
+ wpa_printf(MSG_ERROR,
+ "%s: Undefined extended type %d.%d",
+ __func__, type >> 8, type & 0xff);
+ return NULL;
+ }
+ ext_type = type & 0xff;
+ type >>= 8;
+ } else if (radius_is_ext_type(type)) {
+ wpa_printf(MSG_ERROR, "%s: Unexpected extended type use for %d",
+ __func__, type);
}
- buf_needed = sizeof(*attr) + data_len;
+ if (radius_is_long_ext_type(type)) {
+ size_t hdr_len = sizeof(struct radius_attr_hdr_ext) + 1;
+ size_t plen = 255 - hdr_len;
+ size_t num;
+
+ max_len = 4096;
+ num = (data_len + plen - 1) / plen;
+ if (num == 0)
+ num = 1;
+ buf_needed = num * hdr_len + data_len;
+ } else if (radius_is_ext_type(type)) {
+ max_len = RADIUS_MAX_EXT_ATTR_LEN;
+ buf_needed = sizeof(struct radius_attr_hdr_ext) + data_len;
+ } else {
+ max_len = RADIUS_MAX_ATTR_LEN;
+ buf_needed = sizeof(*attr) + data_len;
+ }
+ if (data_len > max_len) {
+ wpa_printf(MSG_ERROR,
+ "%s: too long attribute (%zu > %zu bytes)",
+ __func__, data_len, max_len);
+ return NULL;
+ }
if (wpabuf_tailroom(msg->buf) < buf_needed) {
/* allocate more space for message buffer */
@@ -651,13 +741,44 @@ struct radius_attr_hdr *radius_msg_add_attr(struct radius_msg *msg, u8 type,
msg->hdr = wpabuf_mhead(msg->buf);
}
- attr = wpabuf_put(msg->buf, sizeof(struct radius_attr_hdr));
- attr->type = type;
- attr->length = sizeof(*attr) + data_len;
- wpabuf_put_data(msg->buf, data, data_len);
-
- if (radius_msg_add_attr_to_array(msg, attr))
- return NULL;
+ if (radius_is_long_ext_type(type)) {
+ size_t plen = 255 - sizeof(struct radius_attr_hdr_ext) - 1;
+ size_t alen;
+
+ do {
+ alen = data_len > plen ? plen : data_len;
+ ext = wpabuf_put(msg->buf,
+ sizeof(struct radius_attr_hdr_ext));
+ if (!attr)
+ attr = (struct radius_attr_hdr *) ext;
+ ext->type = type;
+ ext->length = sizeof(*ext) + 1 + alen;
+ ext->ext_type = ext_type;
+ wpabuf_put_u8(msg->buf, data_len > alen ? 0x80 : 0);
+ wpabuf_put_data(msg->buf, data, data_len);
+ data += alen;
+ data_len -= alen;
+ if (radius_msg_add_attr_to_array(
+ msg, (struct radius_attr_hdr *) ext))
+ return NULL;
+ } while (data_len > 0);
+ } else if (radius_is_ext_type(type)) {
+ ext = wpabuf_put(msg->buf, sizeof(struct radius_attr_hdr_ext));
+ attr = (struct radius_attr_hdr *) ext;
+ ext->type = type;
+ ext->length = sizeof(*ext) + data_len;
+ ext->ext_type = ext_type;
+ wpabuf_put_data(msg->buf, data, data_len);
+ if (radius_msg_add_attr_to_array(msg, attr))
+ return NULL;
+ } else {
+ attr = wpabuf_put(msg->buf, sizeof(struct radius_attr_hdr));
+ attr->type = type;
+ attr->length = sizeof(*attr) + data_len;
+ wpabuf_put_data(msg->buf, data, data_len);
+ if (radius_msg_add_attr_to_array(msg, attr))
+ return NULL;
+ }
return attr;
}
@@ -1285,6 +1406,28 @@ int radius_msg_add_wfa(struct radius_msg *msg, u8 subtype, const u8 *data,
}
+int radius_msg_add_ext_vs(struct radius_msg *msg, u16 type, u32 vendor_id,
+ u8 vendor_type, const u8 *data, size_t len)
+{
+ struct radius_attr_hdr *attr;
+ u8 *buf, *pos;
+ size_t alen;
+
+ alen = 4 + 1 + len;
+ buf = os_malloc(alen);
+ if (!buf)
+ return 0;
+ pos = buf;
+ WPA_PUT_BE32(pos, vendor_id);
+ pos += 4;
+ *pos++ = vendor_type;
+ os_memcpy(pos, data, len);
+ attr = radius_msg_add_attr(msg, type, buf, alen);
+ os_free(buf);
+ return attr != NULL;
+}
+
+
int radius_user_password_hide(struct radius_msg *msg,
const u8 *data, size_t data_len,
const u8 *secret, size_t secret_len,
diff --git a/src/radius/radius.h b/src/radius/radius.h
index fb8148180..490c8d1f6 100644
--- a/src/radius/radius.h
+++ b/src/radius/radius.h
@@ -1,6 +1,6 @@
/*
* RADIUS message processing
- * Copyright (c) 2002-2009, 2012, 2014-2015, Jouni Malinen <j@w1.fi>
+ * Copyright (c) 2002-2009, 2012, 2014-2022, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* See README for more details.
@@ -46,7 +46,15 @@ struct radius_attr_hdr {
/* followed by length-2 octets of attribute value */
} STRUCT_PACKED;
+struct radius_attr_hdr_ext {
+ u8 type;
+ u8 length; /* including this header */
+ u8 ext_type;
+ /* followed by length-3 octets of attribute value */
+} STRUCT_PACKED;
+
#define RADIUS_MAX_ATTR_LEN (255 - sizeof(struct radius_attr_hdr))
+#define RADIUS_MAX_EXT_ATTR_LEN (255 - sizeof(struct radius_attr_hdr_ext))
enum { RADIUS_ATTR_USER_NAME = 1,
RADIUS_ATTR_USER_PASSWORD = 2,
@@ -113,6 +121,18 @@ enum { RADIUS_ATTR_USER_NAME = 1,
RADIUS_ATTR_WLAN_GROUP_CIPHER = 187,
RADIUS_ATTR_WLAN_AKM_SUITE = 188,
RADIUS_ATTR_WLAN_GROUP_MGMT_CIPHER = 189,
+ RADIUS_ATTR_EXT_TYPE_1 = 241,
+ RADIUS_ATTR_EXT_TYPE_2 = 242,
+ RADIUS_ATTR_EXT_TYPE_3 = 243,
+ RADIUS_ATTR_EXT_TYPE_4 = 244,
+ RADIUS_ATTR_LONG_EXT_TYPE_1 = 245,
+ RADIUS_ATTR_LONG_EXT_TYPE_2 = 246,
+ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_1 = (241 << 8) | 26,
+ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_2 = (242 << 8) | 26,
+ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_3 = (243 << 8) | 26,
+ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_4 = (244 << 8) | 26,
+ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_5 = (245 << 8) | 26,
+ RADIUS_ATTR_EXT_VENDOR_SPECIFIC_6 = (246 << 8) | 26,
};
@@ -257,7 +277,7 @@ int radius_msg_verify_acct_req(struct radius_msg *msg, const u8 *secret,
int radius_msg_verify_das_req(struct radius_msg *msg, const u8 *secret,
size_t secret_len,
int require_message_authenticator);
-struct radius_attr_hdr * radius_msg_add_attr(struct radius_msg *msg, u8 type,
+struct radius_attr_hdr * radius_msg_add_attr(struct radius_msg *msg, u16 type,
const u8 *data, size_t data_len);
struct radius_msg * radius_msg_parse(const u8 *data, size_t len);
int radius_msg_add_eap(struct radius_msg *msg, const u8 *data,
@@ -284,6 +304,8 @@ int radius_msg_add_mppe_keys(struct radius_msg *msg,
const u8 *recv_key, size_t recv_key_len);
int radius_msg_add_wfa(struct radius_msg *msg, u8 subtype, const u8 *data,
size_t len);
+int radius_msg_add_ext_vs(struct radius_msg *msg, u16 type, u32 vendor_id,
+ u8 vendor_type, const u8 *data, size_t len);
int radius_user_password_hide(struct radius_msg *msg,
const u8 *data, size_t data_len,
const u8 *secret, size_t secret_len,
--
2.25.1

View File

@@ -0,0 +1,102 @@
From b94371af8402f60218716552e571ca72cff4e3c0 Mon Sep 17 00:00:00 2001
From: Jouni Malinen <j@w1.fi>
Date: Fri, 15 Apr 2022 17:36:25 +0300
Subject: [PATCH] RADIUS attributes for EAPOL-Key message details
Use vendor specific RADIUS attributes for sending ANonce and EAPOL-Key
msg 2/4 for the wpa_psk_radius=3 case. The vendor specific attributes
for this are defined in FreeRADIUS as follows:
BEGIN-VENDOR FreeRADIUS format=Extended-Vendor-Specific-5
ATTRIBUTE FreeRADIUS-802.1X-Anonce 1 octets[32]
ATTRIBUTE FreeRADIUS-802.1X-EAPoL-Key-Msg 2 octets
END-VENDOR FreeRADIUS
Signed-off-by: Jouni Malinen <j@w1.fi>
---
src/ap/ieee802_11_auth.c | 29 +++++++++++++++++++++++++++++
src/radius/radius.h | 7 +++++++
2 files changed, 36 insertions(+)
diff --git a/src/ap/ieee802_11_auth.c b/src/ap/ieee802_11_auth.c
index a54d7616e..4277d82cb 100644
--- a/src/ap/ieee802_11_auth.c
+++ b/src/ap/ieee802_11_auth.c
@@ -47,6 +47,9 @@ struct hostapd_acl_query_data {
struct hostapd_acl_query_data *next;
bool radius_psk;
int akm;
+ u8 *anonce;
+ u8 *eapol;
+ size_t eapol_len;
};
@@ -102,6 +105,8 @@ static void hostapd_acl_query_free(struct hostapd_acl_query_data *query)
if (!query)
return;
os_free(query->auth_msg);
+ os_free(query->anonce);
+ os_free(query->eapol);
os_free(query);
}
@@ -164,6 +169,24 @@ static int hostapd_radius_acl_query(struct hostapd_data *hapd, const u8 *addr,
goto fail;
}
+ if (query->anonce &&
+ !radius_msg_add_ext_vs(msg, RADIUS_ATTR_EXT_VENDOR_SPECIFIC_5,
+ RADIUS_VENDOR_ID_FREERADIUS,
+ RADIUS_VENDOR_ATTR_FREERADIUS_802_1X_ANONCE,
+ query->anonce, WPA_NONCE_LEN)) {
+ wpa_printf(MSG_DEBUG, "Could not add FreeRADIUS-802.1X-Anonce");
+ goto fail;
+ }
+
+ if (query->eapol &&
+ !radius_msg_add_ext_vs(msg, RADIUS_ATTR_EXT_VENDOR_SPECIFIC_5,
+ RADIUS_VENDOR_ID_FREERADIUS,
+ RADIUS_VENDOR_ATTR_FREERADIUS_802_1X_EAPOL_KEY_MSG,
+ query->eapol, query->eapol_len)) {
+ wpa_printf(MSG_DEBUG, "Could not add FreeRADIUS-802.1X-EAPoL-Key-Msg");
+ goto fail;
+ }
+
if (radius_client_send(hapd->radius, msg, RADIUS_AUTH, addr) < 0)
goto fail;
return 0;
@@ -703,6 +726,12 @@ void hostapd_acl_req_radius_psk(struct hostapd_data *hapd, const u8 *addr,
query->akm = key_mgmt;
os_get_reltime(&query->timestamp);
os_memcpy(query->addr, addr, ETH_ALEN);
+ if (anonce)
+ query->anonce = os_memdup(anonce, WPA_NONCE_LEN);
+ if (eapol) {
+ query->eapol = os_memdup(eapol, eapol_len);
+ query->eapol_len = eapol_len;
+ }
if (hostapd_radius_acl_query(hapd, addr, query)) {
wpa_printf(MSG_DEBUG,
"Failed to send Access-Request for RADIUS PSK/ACL query");
diff --git a/src/radius/radius.h b/src/radius/radius.h
index 490c8d1f6..177c64a66 100644
--- a/src/radius/radius.h
+++ b/src/radius/radius.h
@@ -208,6 +208,13 @@ enum { RADIUS_VENDOR_ATTR_MS_MPPE_SEND_KEY = 16,
RADIUS_VENDOR_ATTR_MS_MPPE_RECV_KEY = 17
};
+/* FreeRADIUS vendor-specific attributes */
+#define RADIUS_VENDOR_ID_FREERADIUS 11344
+/* Extended-Vendor-Specific-5 (245.26; long extended header) */
+enum {
+ RADIUS_VENDOR_ATTR_FREERADIUS_802_1X_ANONCE = 1,
+ RADIUS_VENDOR_ATTR_FREERADIUS_802_1X_EAPOL_KEY_MSG = 2,
+};
/* Hotspot 2.0 - WFA Vendor-specific RADIUS Attributes */
#define RADIUS_VENDOR_ID_WFA 40808
--
2.25.1

View File

@@ -0,0 +1,32 @@
--- a/src/ap/ieee802_11_auth.c
+++ b/src/ap/ieee802_11_auth.c
@@ -578,6 +578,8 @@ hostapd_acl_recv_radius(struct radius_ms
os_memcpy(info->radius_cui, buf, len);
}
+ radius_msg_get_wispr(msg, info->bandwidth);
+
if (hapd->conf->wpa_psk_radius == PSK_RADIUS_REQUIRED &&
!info->psk)
cache->accepted = HOSTAPD_ACL_REJECT;
--- a/src/ap/ieee802_11_auth.h
+++ b/src/ap/ieee802_11_auth.h
@@ -23,6 +23,7 @@ struct radius_sta {
struct hostapd_sta_wpa_psk_short *psk;
char *identity;
char *radius_cui;
+ u32 bandwidth[2];
};
int hostapd_check_acl(struct hostapd_data *hapd, const u8 *addr,
--- a/src/ap/ieee802_11.c
+++ b/src/ap/ieee802_11.c
@@ -2406,6 +2406,8 @@ int ieee802_11_set_radius_info(struct ho
ap_sta_no_session_timeout(hapd, sta);
}
+ os_memcpy(sta->bandwidth, info->bandwidth, sizeof(sta->bandwidth));
+
return 0;
}

View File

@@ -1958,6 +1958,9 @@ void hostapd_ubus_notify_radar_detected(struct hostapd_iface *iface, int frequen
struct hostapd_data *hapd;
int i;
if (!ctx)
return;
blob_buf_init(&b, 0);
blobmsg_add_u16(&b, "frequency", frequency);
blobmsg_add_u16(&b, "width", chan_width);

View File

@@ -20,7 +20,7 @@ DEFAULT_PACKAGES += kmod-qca-nss-dp kmod-qca-ssdk swconfig \
kmod-usb-phy-ipq5018 kmod-usb-dwc3-qcom-internal \
kmod-ath11k-ahb ath11k-firmware-ipq5018 \
kmod-gpio-button-hotplug iwinfo \
qca-ssdk-shell \
qca-ssdk-shell kmod-bootconfig \
uboot-envtools -procd-ujail
$(eval $(call BuildTarget))

View File

@@ -18,6 +18,13 @@ qcom_setup_interfaces()
cig,wf186h)
ucidef_add_switch "switch0" "4:wan" "1:lan" "2:lan" "6@eth0"
;;
cybertan,eww631-a1)
ucidef_set_interface_wan "eth0"
ucidef_set_interface_lan ""
;;
cybertan,eww631-b1)
ucidef_add_switch "switch1" "5:wan" "2:lan" "3:lan" "4:lan" "6@eth0"
;;
edgecore,oap101|\
edgecore,oap101-6e|\
edgecore,oap101e|\
@@ -63,6 +70,18 @@ qcom_setup_macs()
ucidef_set_network_device_mac eth0 $wan_mac
ip link set eth0 address $wan_mac
;;
cybertan,eww631-a1|\
cybertan,eww631-b1)
mtd=$(find_mtd_chardev "0:APPSBLENV")
[ -z "$mtd" ] && return;
mac=$(grep BaseMacAddress= $mtd | cut -d '=' -f2)
[ -z "$mac" ] && return;
wan_mac=$(macaddr_canonicalize $mac)
lan_mac=$(macaddr_add "$wan_mac" 1)
ucidef_set_network_device_mac eth0 $wan_mac
ip link set eth0 address $wan_mac
ucidef_set_label_macaddr $wan_mac
;;
*)
wan_mac=$(cat /sys/class/net/eth0/address)
lan_mac=$(macaddr_add "$wan_mac" 1)

View File

@@ -39,6 +39,28 @@ ath11k_generate_macs_ion4x() {
echo -ne \\x${wifimac2//:/\\x} >> /lib/firmware/ath11k-macs
}
ath11k_generate_macs_eww631_a1() {
touch /lib/firmware/ath11k-macs
local dev=$(find_mtd_chardev "0:APPSBLENV")
mac=$(grep BaseMacAddress= $dev | cut -d '=' -f2)
eth=$(macaddr_canonicalize $mac)
mac1=$(macaddr_add $eth 1)
mac2=$(macaddr_add $eth 2)
echo -ne \\x${mac1//:/\\x} >> /lib/firmware/ath11k-macs
echo -ne \\x${mac2//:/\\x} >> /lib/firmware/ath11k-macs
}
ath11k_generate_macs_eww631_b1() {
touch /lib/firmware/ath11k-macs
local dev=$(find_mtd_chardev "0:APPSBLENV")
mac=$(grep BaseMacAddress= $dev | cut -d '=' -f2)
eth=$(macaddr_canonicalize $mac)
mac1=$(macaddr_add $eth 2)
mac2=$(macaddr_add $eth 3)
echo -ne \\x${mac1//:/\\x} >> /lib/firmware/ath11k-macs
echo -ne \\x${mac2//:/\\x} >> /lib/firmware/ath11k-macs
}
caldata_die() {
echo "caldata: " "$*"
exit 1
@@ -64,6 +86,8 @@ ath11k/IPQ5018/hw1.0/caldata.bin)
case "$board" in
cig,wf186w|\
cig,wf186h|\
cybertan,eww631-a1|\
cybertan,eww631-b1|\
edgecore,eap104|\
edgecore,oap101|\
edgecore,oap101-6e|\
@@ -84,6 +108,8 @@ ath11k/qcn6122/hw1.0/caldata_1.bin)
case "$board" in
cig,wf186w|\
cig,wf186h|\
cybertan,eww631-a1|\
cybertan,eww631-b1|\
edgecore,oap101|\
edgecore,oap101-6e|\
edgecore,oap101e|\
@@ -101,6 +127,10 @@ ath11k/qcn6122/hw1.0/caldata_2.bin)
edgecore,oap101e-6e)
caldata_extract "0:ART" 0x4c000 0x20000
;;
cybertan,eww631-a1|\
cybertan,eww631-b1)
caldata_extract "0:ART" 0x26800 0x20000
;;
esac
;;
ath11k/QCN9074/hw1.0/caldata_1.bin)
@@ -119,7 +149,15 @@ ath11k-macs)
cig,wf186h)
ath11k_generate_macs_wf186w
;;
cybertan,eww631-a1)
ath11k_generate_macs_eww631_a1
;;
cybertan,eww631-b1)
ath11k_generate_macs_eww631_b1
;;
edgecore,eap104|\
edgecore,oap101-6e|\
edgecore,oap101e-6e|\
optimcloud,d60|\
optimcloud,d60-5g|\
optimcloud,d50|\

View File

@@ -247,8 +247,8 @@ nand_do_upgrade_success() {
local conf_tar="/tmp/sysupgrade.tgz"
sync
[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
[ -f "$conf_tar" ] && nand_restore_config "$conf_tar" && sync
[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
[ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
echo "sysupgrade successful"
umount -a
reboot -f

View File

@@ -70,6 +70,8 @@ platform_check_image() {
case $board in
cig,wf186w|\
cig,wf186h|\
cybertan,eww631-a1|\
cybertan,eww631-b1|\
edgecore,eap104|\
hfcl,ion4x_w|\
hfcl,ion4xi_w|\
@@ -130,5 +132,18 @@ platform_do_upgrade() {
}
nand_upgrade_tar "$1"
;;
cybertan,eww631-a1|\
cybertan,eww631-b1)
boot_part=$(fw_printenv bootfrom | cut -d = -f2)
echo "Current bootfrom is $boot_part"
if [[ $boot_part == 1 ]]; then
CI_UBIPART="rootfs"
CI_FWSETENV="bootfrom 0"
else
CI_UBIPART="rootfs_1"
CI_FWSETENV="bootfrom 1"
fi
nand_upgrade_tar "$1"
;;
esac
}

View File

@@ -0,0 +1,915 @@
/dts-v1/;
/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
*
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "ipq5018.dtsi"
/ {
#address-cells = <0x2>;
#size-cells = <0x2>;
model = "CyberTan EWW631-A1";
compatible = "cybertan,eww631-a1", "qcom,ipq5018-mp03.5", "qcom,ipq5018";
interrupt-parent = <&intc>;
aliases {
sdhc1 = &sdhc_1; /* SDC1 eMMC slot */
serial0 = &blsp1_uart1;
serial1 = &blsp1_uart2;
ethernet0 = "/soc/dp1";
ethernet1 = "/soc/dp2";
};
chosen {
bootargs = "console=ttyMSM0,115200,n8 rw init=/init";
bootargs-append = " swiotlb=1 coherent_pool=2M";
stdout-path = "serial0";
};
reserved-memory {
#ifdef __IPQ_MEM_PROFILE_256_MB__
/* 256 MB Profile
* +==========+==============+=========================+
* | | | |
* | Region | Start Offset | Size |
* | | | |
* +----------+--------------+-------------------------+
* | NSS | 0x40000000 | 8MB |
* +----------+--------------+-------------------------+
* | Linux | 0x40800000 | Depends on total memory |
* +----------+--------------+-------------------------+
* | uboot | 0x4A600000 | 4MB |
* +----------+--------------+-------------------------+
* | SBL | 0x4AA00000 | 1MB |
* +----------+--------------+-------------------------+
* | smem | 0x4AB00000 | 1MB |
* +----------+--------------+-------------------------+
* | TZ | 0x4AC00000 | 4MB |
* +----------+--------------+-------------------------+
* | Q6 | | |
* | code/ | 0x4B000000 | 20MB |
* | data | | |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | data | 0x4C400000 | 13MB |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | M3 Dump | 0x4D100000 | 1MB |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | QDSS | 0x4D200000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | data | 0x4D300000 | 13MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | M3 Dump | 0x4E000000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | QDSS | 0x4E100000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | data | 0x4E200000 | 13MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | M3 Dump | 0x4EF00000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | QDSS | 0x4F000000 | 1MB |
* +----------+--------------+-------------------------+
* | |
* | Rest of the memory for Linux |
* | |
* +===================================================+
*/
q6_mem_regions: q6_mem_regions@4B000000 {
no-map;
reg = <0x0 0x4B000000 0x0 0x4100000>;
};
q6_code_data: q6_code_data@4B000000 {
no-map;
reg = <0x0 0x4B000000 0x0 0x1400000>;
};
q6_ipq5018_data: q6_ipq5018_data@4C400000 {
no-map;
reg = <0x0 0x4C400000 0x0 0xD00000>;
};
m3_dump: m3_dump@4D100000 {
no-map;
reg = <0x0 0x4D100000 0x0 0x100000>;
};
q6_etr_region: q6_etr_dump@4D200000 {
no-map;
reg = <0x0 0x4D200000 0x0 0x100000>;
};
q6_qcn6122_data1: q6_qcn6122_data1@4D300000 {
no-map;
reg = <0x0 0x4D300000 0x0 0xD00000>;
};
m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E000000 {
no-map;
reg = <0x0 0x4E000000 0x0 0x100000>;
};
q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E100000 {
no-map;
reg = <0x0 0x4E100000 0x0 0x100000>;
};
q6_qcn6122_data2: q6_qcn6122_data2@4E200000 {
no-map;
reg = <0x0 0x4E200000 0x0 0xD00000>;
};
m3_dump_qcn6122_2: m3_dump_qcn6122_2@4EF00000 {
no-map;
reg = <0x0 0x4EF00000 0x0 0x100000>;
};
q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F000000 {
no-map;
reg = <0x0 0x4F000000 0x0 0x100000>;
};
#else
/* 512MB/1GB Profiles
* +==========+==============+=========================+
* | | | |
* | Region | Start Offset | Size |
* | | | |
* +----------+--------------+-------------------------+
* | NSS | 0x40000000 | 16MB |
* +----------+--------------+-------------------------+
* | Linux | 0x41000000 | Depends on total memory |
* +----------+--------------+-------------------------+
* | uboot | 0x4A600000 | 4MB |
* +----------+--------------+-------------------------+
* | SBL | 0x4AA00000 | 1MB |
* +----------+--------------+-------------------------+
* | smem | 0x4AB00000 | 1MB |
* +----------+--------------+-------------------------+
* | TZ | 0x4AC00000 | 4MB |
* +----------+--------------+-------------------------+
* | Q6 | | |
* | code/ | 0x4B000000 | 20MB |
* | data | | |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | data | 0x4C400000 | 13MB |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | M3 Dump | 0x4D100000 | 1MB |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | QDSS | 0x4D200000 | 1MB |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | Caldb | 0x4D300000 | 2MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | data | 0x4D500000 | 13MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | M3 Dump | 0x4E200000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | QDSS | 0x4E300000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | Caldb | 0x4E400000 | 5MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | data | 0x4E900000 | 13MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | M3 Dump | 0x4F600000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | QDSS | 0x4F700000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | Caldb | 0x4F800000 | 5MB |
* +----------+--------------+-------------------------+
* | |
* | Rest of the memory for Linux |
* | |
* +===================================================+
*/
q6_mem_regions: q6_mem_regions@4B000000 {
no-map;
reg = <0x0 0x4B000000 0x0 0x4D00000>;
};
q6_code_data: q6_code_data@4B000000 {
no-map;
reg = <0x0 0x4B000000 0x0 01400000>;
};
q6_ipq5018_data: q6_ipq5018_data@4C400000 {
no-map;
reg = <0x0 0x4C400000 0x0 0xD00000>;
};
m3_dump: m3_dump@4D100000 {
no-map;
reg = <0x0 0x4D100000 0x0 0x100000>;
};
q6_etr_region: q6_etr_dump@4D200000 {
no-map;
reg = <0x0 0x4D200000 0x0 0x100000>;
};
q6_caldb_region: q6_caldb_region@4D300000 {
no-map;
reg = <0x0 0x4D300000 0x0 0x200000>;
};
q6_qcn6122_data1: q6_qcn6122_data1@4D500000 {
no-map;
reg = <0x0 0x4D500000 0x0 0xD00000>;
};
m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E200000 {
no-map;
reg = <0x0 0x4E200000 0x0 0x100000>;
};
q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E300000 {
no-map;
reg = <0x0 0x4E300000 0x0 0x100000>;
};
q6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E400000 {
no-map;
reg = <0x0 0x4E400000 0x0 0x500000>;
};
q6_qcn6122_data2: q6_qcn6122_data2@4E900000 {
no-map;
reg = <0x0 0x4E900000 0x0 0xD00000>;
};
m3_dump_qcn6122_2: m3_dump_qcn6122_2@4F600000 {
no-map;
reg = <0x0 0x4F600000 0x0 0x100000>;
};
q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F700000 {
no-map;
reg = <0x0 0x4F700000 0x0 0x100000>;
};
q6_qcn6122_caldb_2: q6_qcn6122_caldb_2@4F800000 {
no-map;
reg = <0x0 0x4F800000 0x0 0x500000>;
};
#endif
};
soc {
serial@78af000 {
status = "ok";
};
blsp1_uart2: serial@78b0000 {
pinctrl-0 = <&blsp1_uart_pins>;
pinctrl-names = "default";
};
qpic_bam: dma@7984000{
status = "ok";
};
nand: qpic-nand@79b0000 {
pinctrl-0 = <&qspi_nand_pins>;
pinctrl-names = "default";
status = "ok";
};
spi_0: spi@78b5000 { /* BLSP1 QUP0 */
pinctrl-0 = <&blsp0_spi_pins>;
pinctrl-names = "default";
cs-select = <0>;
status = "ok";
m25p80@0 {
#address-cells = <1>;
#size-cells = <1>;
reg = <0>;
compatible = "n25q128a11";
linux,modalias = "m25p80", "n25q128a11";
spi-max-frequency = <50000000>;
use-default-sizes;
};
};
mdio0: mdio@88000 {
status = "ok";
ethernet-phy@0 {
reg = <7>;
};
};
mdio1: mdio@90000 {
status = "disabled";
pinctrl-0 = <&mdio1_pins>;
pinctrl-names = "default";
phy-reset-gpio = <&tlmm 39 0>;
ethernet-phy@0 {
reg = <28>;
};
};
ess-instance {
num_devices = <0x1>;
ess-switch@0x39c00000 {
switch_mac_mode = <0xf>; /* mac mode for uniphy instance*/
cmnblk_clk = "internal_96MHz"; /* cmnblk clk*/
qcom,port_phyinfo {
port@0 {
port_id = <1>;
phy_address = <7>;
mdiobus = <&mdio0>;
};
/*
port@1 {
port_id = <2>;
phy_address = <0x1c>;
mdiobus = <&mdio1>;
port_mac_sel = "QGMAC_PORT";
};
*/
};
led_source@0 {
source = <0>;
mode = "normal";
speed = "all";
blink_en = "enable";
active = "high";
};
};
};
dp1 {
device_type = "network";
compatible = "qcom,nss-dp";
clocks = <&gcc GCC_SNOC_GMAC0_AXI_CLK>;
clock-names = "nss-snoc-gmac-axi-clk";
qcom,id = <1>;
reg = <0x39C00000 0x10000>;
interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
qcom,mactype = <2>;
qcom,link-poll = <1>;
qcom,phy-mdio-addr = <7>;
mdio-bus = <&mdio0>;
local-mac-address = [000000000000];
phy-mode = "sgmii";
qcom,rx-page-mode = <0>;
};
/*
dp2 {
device_type = "network";
compatible = "qcom,nss-dp";
clocks = <&gcc GCC_SNOC_GMAC1_AXI_CLK>;
clock-names = "nss-snoc-gmac-axi-clk";
qcom,id = <2>;
reg = <0x39D00000 0x10000>;
interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
qcom,mactype = <2>;
qcom,link-poll = <1>;
qcom,phy-mdio-addr = <28>;
mdio-bus = <&mdio1>;
local-mac-address = [000000000000];
phy-mode = "sgmii";
qcom,rx-page-mode = <0>;
};
*/
nss-macsec1 {
compatible = "qcom,nss-macsec";
phy_addr = <0x1c>;
mdiobus = <&mdio1>;
};
};
qcom,test@0 {
status = "ok";
};
thermal-zones {
status = "ok";
};
};
&tlmm {
pinctrl-0 = <&blsp0_uart_pins &phy_led_pins>;
pinctrl-names = "default";
blsp0_uart_pins: blsp0_uart_pins {
blsp0_uart_rx_tx {
pins = "gpio20", "gpio21";
function = "blsp0_uart0";
bias-disable;
};
};
blsp1_uart_pins: blsp1_uart_pins {
blsp1_uart_rx_tx {
pins = "gpio23", "gpio25", "gpio24", "gpio26";
function = "blsp1_uart2";
bias-disable;
};
};
blsp0_spi_pins: blsp0_spi_pins {
mux {
pins = "gpio10", "gpio11", "gpio12", "gpio13";
function = "blsp0_spi";
drive-strength = <2>;
bias-disable;
};
};
qspi_nand_pins: qspi_nand_pins {
qspi_clock {
pins = "gpio9";
function = "qspi_clk";
drive-strength = <8>;
bias-disable;
};
qspi_cs {
pins = "gpio8";
function = "qspi_cs";
drive-strength = <8>;
bias-disable;
};
qspi_data {
pins = "gpio4", "gpio5", "gpio6", "gpio7";
function = "qspi_data";
drive-strength = <8>;
bias-disable;
};
};
mdio1_pins: mdio_pinmux {
mux_0 {
pins = "gpio36";
function = "mdc";
drive-strength = <8>;
bias-pull-up;
};
mux_1 {
pins = "gpio37";
function = "mdio";
drive-strength = <8>;
bias-pull-up;
};
};
phy_led_pins: phy_led_pins {
gephy_led_pin {
pins = "gpio46";
function = "led0";
drive-strength = <8>;
bias-pull-down;
};
};
i2c_pins: i2c_pins {
i2c_scl {
pins = "gpio25";
function = "blsp2_i2c1";
drive-strength = <8>;
bias-disable;
};
i2c_sda {
pins = "gpio26";
function = "blsp2_i2c1";
drive-strength = <8>;
bias-disable;
};
};
button_pins: button_pins {
reset_button {
pins = "gpio28";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
};
};
audio_pins: audio_pinmux {
mux_1 {
pins = "gpio24";
function = "audio_rxbclk";
drive-strength = <8>;
bias-pull-down;
};
mux_2 {
pins = "gpio25";
function = "audio_rxfsync";
drive-strength = <8>;
bias-pull-down;
};
mux_3 {
pins = "gpio26";
function = "audio_rxd";
drive-strength = <8>;
bias-pull-down;
};
mux_4 {
pins = "gpio27";
function = "audio_txmclk";
drive-strength = <8>;
bias-pull-down;
};
mux_5 {
pins = "gpio28";
function = "audio_txbclk";
drive-strength = <8>;
bias-pull-down;
};
mux_6 {
pins = "gpio29";
function = "audio_txfsync";
drive-strength = <8>;
bias-pull-down;
};
mux_7 {
pins = "gpio30";
function = "audio_txd";
drive-strength = <8>;
bias-pull-down;
};
};
leds_pins: leds_pinmux {
sys_blue {
pins = "gpio30";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
};
sys_red {
pins = "gpio36";
function = "gpio";
drive-strength = <8>;
bias-disable;
};
sys_green {
pins = "gpio37";
function = "gpio";
drive-strength = <8>;
bias-disable;
};
};
};
&soc {
gpio_keys {
compatible = "gpio-keys";
pinctrl-0 = <&button_pins>;
pinctrl-names = "default";
button@1 {
label = "reset";
linux,code = <KEY_RESTART>;
gpios = <&tlmm 28 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
debounce-interval = <60>;
};
};
gpio_leds {
compatible = "gpio-leds";
pinctrl-0 = <&leds_pins>;
pinctrl-names = "default";
led@30 {
label = "sys:blue";
gpios = <&tlmm 30 GPIO_ACTIVE_HIGH>; /* GPIO_30 */
default-state="on";
/* linux,default-trigger = "timer";
active-delay = <700>;
inactive-delay = <700>;
default-state="on"; */
};
led@36 {
label = "sys:red";
gpios = <&tlmm 36 GPIO_ACTIVE_HIGH>; /* GPIO_36 */
default-state="off";
/* linux,default-trigger = "timer";
active-delay = <700>;
inactive-delay = <700>;
default-state="on"; */
};
led@37 {
label = "sys:green";
gpios = <&tlmm 37 GPIO_ACTIVE_HIGH>; /* GPIO_37 */
default-state="off";
/* linux,default-trigger = "timer";
active-delay = <700>;
inactive-delay = <700>;
default-state="on"; */
};
};
};
&q6v5_wcss {
compatible = "qcom,ipq5018-q6-mpd";
#address-cells = <1>;
#size-cells = <1>;
ranges;
firmware = "IPQ5018/q6_fw.mdt";
reg = <0x0cd00000 0x4040>,
<0x1938000 0x8>,
<0x193d204 0x4>;
reg-names = "qdsp6",
"tcsr-msip",
"tcsr-q6";
resets = <&gcc GCC_WCSSAON_RESET>,
<&gcc GCC_WCSS_Q6_BCR>;
reset-names = "wcss_aon_reset",
"wcss_q6_reset";
clocks = <&gcc GCC_Q6_AXIS_CLK>,
<&gcc GCC_WCSS_ECAHB_CLK>,
<&gcc GCC_Q6_AXIM_CLK>,
<&gcc GCC_Q6_AXIM2_CLK>,
<&gcc GCC_Q6_AHB_CLK>,
<&gcc GCC_Q6_AHB_S_CLK>,
<&gcc GCC_WCSS_AXI_S_CLK>;
clock-names = "gcc_q6_axis_clk",
"gcc_wcss_ecahb_clk",
"gcc_q6_axim_clk",
"gcc_q6_axim2_clk",
"gcc_q6_ahb_clk",
"gcc_q6_ahb_s_clk",
"gcc_wcss_axi_s_clk";
#ifdef __IPQ_MEM_PROFILE_256_MB__
memory-region = <&q6_mem_regions>, <&q6_etr_region>;
#else
memory-region = <&q6_mem_regions>, <&q6_etr_region>,
<&q6_caldb_region>;
#endif
qcom,rproc = <&q6v5_wcss>;
qcom,bootargs_smem = <507>;
boot-args = <0x1 0x4 0x3 0x0F 0x0 0x0>,
<0x2 0x4 0x2 0x12 0x0 0x0>;
status = "ok";
q6_wcss_pd1: remoteproc_pd1@4ab000 {
compatible = "qcom,ipq5018-wcss-ahb-mpd";
reg = <0x4ab000 0x20>;
reg-names = "rmb";
firmware = "IPQ5018/q6_fw.mdt";
m3_firmware = "IPQ5018/m3_fw.mdt";
interrupts-extended = <&wcss_smp2p_in 8 0>,
<&wcss_smp2p_in 9 0>,
<&wcss_smp2p_in 12 0>,
<&wcss_smp2p_in 11 0>;
interrupt-names = "fatal",
"ready",
"spawn-ack",
"stop-ack";
resets = <&gcc GCC_WCSSAON_RESET>,
<&gcc GCC_WCSS_BCR>,
<&gcc GCC_CE_BCR>;
reset-names = "wcss_aon_reset",
"wcss_reset",
"ce_reset";
clocks = <&gcc GCC_WCSS_AHB_S_CLK>,
<&gcc GCC_WCSS_ACMT_CLK>,
<&gcc GCC_WCSS_AXI_M_CLK>;
clock-names = "gcc_wcss_ahb_s_clk",
"gcc_wcss_acmt_clk",
"gcc_wcss_axi_m_clk";
qcom,halt-regs = <&tcsr_q6_block 0xa000 0xd000 0x0>;
qcom,smem-states = <&wcss_smp2p_out 8>,
<&wcss_smp2p_out 9>,
<&wcss_smp2p_out 10>;
qcom,smem-state-names = "shutdown",
"stop",
"spawn";
#ifdef __IPQ_MEM_PROFILE_256_MB__
memory-region = <&q6_ipq5018_data>, <&m3_dump>,
<&q6_etr_region>;
#else
memory-region = <&q6_ipq5018_data>, <&m3_dump>,
<&q6_etr_region>, <&q6_caldb_region>;
#endif
};
q6_wcss_pd2: remoteproc_pd2 {
compatible = "qcom,ipq5018-wcss-pcie-mpd";
firmware = "IPQ5018/q6_fw.mdt";
m3_firmware = "qcn6122/m3_fw.mdt";
interrupts-extended = <&wcss_smp2p_in 16 0>,
<&wcss_smp2p_in 17 0>,
<&wcss_smp2p_in 20 0>,
<&wcss_smp2p_in 19 0>;
interrupt-names = "fatal",
"ready",
"spawn-ack",
"stop-ack";
qcom,smem-states = <&wcss_smp2p_out 16>,
<&wcss_smp2p_out 17>,
<&wcss_smp2p_out 18>;
qcom,smem-state-names = "shutdown",
"stop",
"spawn";
#ifdef __IPQ_MEM_PROFILE_256_MB__
memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>,
<&q6_qcn6122_etr_1>;
#else
memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>,
<&q6_qcn6122_etr_1>, <&q6_qcn6122_caldb_1>;
#endif
};
q6_wcss_pd3: remoteproc_pd3 {
compatible = "qcom,ipq5018-wcss-pcie-mpd";
firmware = "IPQ5018/q6_fw.mdt";
interrupts-extended = <&wcss_smp2p_in 24 0>,
<&wcss_smp2p_in 25 0>,
<&wcss_smp2p_in 28 0>,
<&wcss_smp2p_in 27 0>;
interrupt-names = "fatal",
"ready",
"spawn-ack",
"stop-ack";
qcom,smem-states = <&wcss_smp2p_out 24>,
<&wcss_smp2p_out 25>,
<&wcss_smp2p_out 26>;
qcom,smem-state-names = "shutdown",
"stop",
"spawn";
#ifdef __IPQ_MEM_PROFILE_256_MB__
memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>,
<&q6_qcn6122_etr_2>;
#else
memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>,
<&q6_qcn6122_etr_2>, <&q6_qcn6122_caldb_2>;
#endif
};
};
&i2c_0 {
pinctrl-0 = <&i2c_pins>;
pinctrl-names = "default";
status = "disabled";
};
&wifi0 {
/* IPQ5018 */
qcom,multipd_arch;
qcom,rproc = <&q6_wcss_pd1>;
qcom,userpd-subsys-name = "q6v5_wcss_userpd1";
#ifdef __IPQ_MEM_PROFILE_256_MB__
qcom,tgt-mem-mode = <2>;
#else
qcom,tgt-mem-mode = <1>;
#endif
qcom,board_id = <0x24>;
#ifdef __CNSS2__
qcom,bdf-addr = <0x4C400000 0x4C400000 0x4C400000 0x0 0x0>;
qcom,caldb-addr = <0x4D300000 0x4D300000 0 0 0 0>;
qcom,caldb-size = <0x200000>;
mem-region = <&q6_ipq5018_data>;
1235
#else
memory-region = <&q6_ipq5018_data>;
#endif
status = "ok";
};
&wifi1 {
/* QCN6122 5G */
qcom,multipd_arch;
qcom,userpd-subsys-name = "q6v5_wcss_userpd3";
qcom,rproc = <&q6_wcss_pd3>;
#ifdef __IPQ_MEM_PROFILE_256_MB__
qcom,tgt-mem-mode = <2>;
#else
qcom,tgt-mem-mode = <1>;
#endif
qcom,board_id = <0x60>;
#ifdef __CNSS2__
qcom,bdf-addr = <0x4E900000 0x4E900000 0x4E200000 0x0 0x0>;
qcom,caldb-addr = <0x4F800000 0x4F800000 0 0 0>;
qcom,caldb-size = <0x500000>;
mem-region = <&q6_qcn6122_data2>;
#else
memory-region = <&q6_qcn6122_data2>;
#endif
status = "ok";
};
&wifi2 {
/* QCN6122 6G */
qcom,multipd_arch;
qcom,userpd-subsys-name = "q6v5_wcss_userpd3";
#ifdef __IPQ_MEM_PROFILE_256_MB__
qcom,tgt-mem-mode = <2>;
#else
qcom,tgt-mem-mode = <1>;
#endif
qcom,board_id = <0xb0>;
qcom,bdf-addr = <0x4ED00000 0x4ED00000 0x4E400000 0x0 0x0>;
#ifdef __CNSS2__
qcom,caldb-addr = <0x4FF00000 0x4FF00000 0 0 0>;
#else
qcom,caldb-addr = <0x4FF00000>;
m3-dump-addr = <0x4FD00000>;
#endif
qcom,caldb-size = <0x500000>;
status = "disabled";
};
&usb3 {
status = "ok";
device-power-gpio = <&tlmm 24 1>;
};
&dwc_0 {
/delete-property/ #phy-cells;
/delete-property/ phys;
/delete-property/ phy-names;
};
&hs_m31phy_0 {
status = "ok";
};
&eud {
status = "ok";
};
&pcie_x1 {
perst-gpio = <&tlmm 18 GPIO_ACTIVE_LOW>;
};
&pcie_x2 {
perst-gpio = <&tlmm 15 GPIO_ACTIVE_LOW>;
};
&pcie_x1_rp {
status = "disabled";
mhi_0: qcom,mhi@0 {
reg = <0 0 0 0 0 >;
};
};
&pcie_x2_rp {
status = "disabled";
mhi_1: qcom,mhi@1 {
reg = <0 0 0 0 0 >;
};
};

View File

@@ -0,0 +1,981 @@
/dts-v1/;
/* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
*
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "ipq5018.dtsi"
/ {
#address-cells = <0x2>;
#size-cells = <0x2>;
model = "CyberTan EWW631-B1";
compatible = "cybertan,eww631-b1", "qcom,ipq5018-mp03.5", "qcom,ipq5018";
interrupt-parent = <&intc>;
aliases {
sdhc1 = &sdhc_1; /* SDC1 eMMC slot */
serial0 = &blsp1_uart1;
serial1 = &blsp1_uart2;
ethernet0 = "/soc/dp1";
ethernet1 = "/soc/dp2";
};
chosen {
bootargs = "console=ttyMSM0,115200,n8 rw init=/init";
bootargs-append = " swiotlb=1 coherent_pool=2M";
stdout-path = "serial0";
};
reserved-memory {
#ifdef __IPQ_MEM_PROFILE_256_MB__
/* 256 MB Profile
* +==========+==============+=========================+
* | | | |
* | Region | Start Offset | Size |
* | | | |
* +----------+--------------+-------------------------+
* | NSS | 0x40000000 | 8MB |
* +----------+--------------+-------------------------+
* | Linux | 0x40800000 | Depends on total memory |
* +----------+--------------+-------------------------+
* | uboot | 0x4A600000 | 4MB |
* +----------+--------------+-------------------------+
* | SBL | 0x4AA00000 | 1MB |
* +----------+--------------+-------------------------+
* | smem | 0x4AB00000 | 1MB |
* +----------+--------------+-------------------------+
* | TZ | 0x4AC00000 | 4MB |
* +----------+--------------+-------------------------+
* | Q6 | | |
* | code/ | 0x4B000000 | 20MB |
* | data | | |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | data | 0x4C400000 | 13MB |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | M3 Dump | 0x4D100000 | 1MB |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | QDSS | 0x4D200000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | data | 0x4D300000 | 13MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | M3 Dump | 0x4E000000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | QDSS | 0x4E100000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | data | 0x4E200000 | 13MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | M3 Dump | 0x4EF00000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | QDSS | 0x4F000000 | 1MB |
* +----------+--------------+-------------------------+
* | |
* | Rest of the memory for Linux |
* | |
* +===================================================+
*/
q6_mem_regions: q6_mem_regions@4B000000 {
no-map;
reg = <0x0 0x4B000000 0x0 0x4100000>;
};
q6_code_data: q6_code_data@4B000000 {
no-map;
reg = <0x0 0x4B000000 0x0 0x1400000>;
};
q6_ipq5018_data: q6_ipq5018_data@4C400000 {
no-map;
reg = <0x0 0x4C400000 0x0 0xD00000>;
};
m3_dump: m3_dump@4D100000 {
no-map;
reg = <0x0 0x4D100000 0x0 0x100000>;
};
q6_etr_region: q6_etr_dump@4D200000 {
no-map;
reg = <0x0 0x4D200000 0x0 0x100000>;
};
q6_qcn6122_data1: q6_qcn6122_data1@4D300000 {
no-map;
reg = <0x0 0x4D300000 0x0 0xD00000>;
};
m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E000000 {
no-map;
reg = <0x0 0x4E000000 0x0 0x100000>;
};
q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E100000 {
no-map;
reg = <0x0 0x4E100000 0x0 0x100000>;
};
q6_qcn6122_data2: q6_qcn6122_data2@4E200000 {
no-map;
reg = <0x0 0x4E200000 0x0 0xD00000>;
};
m3_dump_qcn6122_2: m3_dump_qcn6122_2@4EF00000 {
no-map;
reg = <0x0 0x4EF00000 0x0 0x100000>;
};
q6_qcn6122_etr_2: q6_qcn6122_etr_2@4F000000 {
no-map;
reg = <0x0 0x4F000000 0x0 0x100000>;
};
#else
/* 512MB/1GB Profiles
* +==========+==============+=========================+
* | | | |
* | Region | Start Offset | Size |
* | | | |
* +----------+--------------+-------------------------+
* | NSS | 0x40000000 | 16MB |
* +----------+--------------+-------------------------+
* | Linux | 0x41000000 | Depends on total memory |
* +----------+--------------+-------------------------+
* | uboot | 0x4A600000 | 4MB |
* +----------+--------------+-------------------------+
* | SBL | 0x4AA00000 | 1MB |
* +----------+--------------+-------------------------+
* | smem | 0x4AB00000 | 1MB |
* +----------+--------------+-------------------------+
* | TZ | 0x4AC00000 | 4MB |
* +----------+--------------+-------------------------+
* | Q6 | | |
* | code/ | 0x4B000000 | 20MB |
* | data | | |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | data | 0x4C400000 | 14MB |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | M3 Dump | 0x4D200000 | 1MB |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | QDSS | 0x4D300000 | 1MB |
* +----------+--------------+-------------------------+
* | IPQ5018 | | |
* | Caldb | 0x4D400000 | 2MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | data | 0x4D600000 | 16MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | M3 Dump | 0x4E600000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | QDSS | 0x4E700000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_1| | |
* | Caldb | 0x4E800000 | 5MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | data | 0x4ED00000 | 16MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | M3 Dump | 0x4FD00000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | QDSS | 0x4FE00000 | 1MB |
* +----------+--------------+-------------------------+
* | QCN6122_2| | |
* | Caldb | 0x4FF00000 | 5MB |
* +----------+--------------+-------------------------+
* | |
* | Rest of the memory for Linux |
* | |
* +===================================================+
*/
q6_mem_regions: q6_mem_regions@4B000000 {
no-map;
reg = <0x0 0x4B000000 0x0 0x5400000>;
};
q6_code_data: q6_code_data@4B000000 {
no-map;
reg = <0x0 0x4B000000 0x0 01400000>;
};
q6_ipq5018_data: q6_ipq5018_data@4C400000 {
no-map;
reg = <0x0 0x4C400000 0x0 0xE00000>;
};
m3_dump: m3_dump@4D200000 {
no-map;
reg = <0x0 0x4D200000 0x0 0x100000>;
};
q6_etr_region: q6_etr_dump@4D300000 {
no-map;
reg = <0x0 0x4D300000 0x0 0x100000>;
};
q6_caldb_region: q6_caldb_region@4D400000 {
no-map;
reg = <0x0 0x4D400000 0x0 0x200000>;
};
q6_qcn6122_data1: q6_qcn6122_data1@4D600000 {
no-map;
reg = <0x0 0x4D600000 0x0 0x1000000>;
};
m3_dump_qcn6122_1: m3_dump_qcn6122_1@4E600000 {
no-map;
reg = <0x0 0x4E600000 0x0 0x100000>;
};
q6_qcn6122_etr_1: q6_qcn6122_etr_1@4E700000 {
no-map;
reg = <0x0 0x4E700000 0x0 0x100000>;
};
q6_qcn6122_caldb_1: q6_qcn6122_caldb_1@4E800000 {
no-map;
reg = <0x0 0x4E800000 0x0 0x500000>;
};
q6_qcn6122_data2: q6_qcn6122_data2@4E900000 {
no-map;
reg = <0x0 0x4ED00000 0x0 0x1000000>;
};
m3_dump_qcn6122_2: m3_dump_qcn6122_2@4FD00000 {
no-map;
reg = <0x0 0x4FD00000 0x0 0x100000>;
};
q6_qcn6122_etr_2: q6_qcn6122_etr_2@4FE00000 {
no-map;
reg = <0x0 0x4FE00000 0x0 0x100000>;
};
q6_qcn6122_caldb_2: q6_qcn6122_caldb_2@4FF00000 {
no-map;
reg = <0x0 0x4FF00000 0x0 0x500000>;
};
#endif
};
soc {
serial@78af000 {
status = "ok";
};
/*
blsp1_uart2: serial@78b0000 {
pinctrl-0 = <&blsp1_uart_pins>;
pinctrl-names = "default";
};
*/
qpic_bam: dma@7984000{
status = "ok";
};
nand: qpic-nand@79b0000 {
pinctrl-0 = <&qspi_nand_pins>;
pinctrl-names = "default";
status = "ok";
};
spi_0: spi@78b5000 { /* BLSP1 QUP0 */
pinctrl-0 = <&blsp0_spi_pins>;
pinctrl-names = "default";
cs-select = <0>;
status = "ok";
m25p80@0 {
#address-cells = <1>;
#size-cells = <1>;
reg = <0>;
compatible = "n25q128a11";
linux,modalias = "m25p80", "n25q128a11";
spi-max-frequency = <50000000>;
use-default-sizes;
};
};
mdio0: mdio@88000 {
status = "ok";
ethernet-phy@0 {
reg = <7>;
};
};
mdio1: mdio@90000 {
status = "ok";
pinctrl-0 = <&mdio1_pins>;
pinctrl-names = "default";
phy-reset-gpio = <&tlmm 38 0>;
ethernet-phy@0 {
reg = <0>;
};
ethernet-phy@1 {
reg = <1>;
};
ethernet-phy@2 {
reg = <2>;
};
ethernet-phy@3 {
reg = <3>;
};
ethernet-phy@4 {
reg = <4>;
};
};
ess-instance {
num_devices = <0x2>;
ess-switch@0x39c00000 {
compatible = "qcom,ess-switch-ipq50xx";
device_id = <0>;
switch_mac_mode = <0xf>; /* mac mode for uniphy instance*/
cmnblk_clk = "internal_96MHz"; /* cmnblk clk*/
qcom,port_phyinfo {
port@0 {
port_id = <1>;
phy_address = <7>;
};
port@1 {
port_id = <2>;
forced-speed = <1000>;
forced-duplex = <1>;
};
};
led_source@0 {
source = <0>;
mode = "normal";
speed = "all";
blink_en = "enable";
active = "high";
};
};
ess-switch1@1 {
compatible = "qcom,ess-switch-qca83xx";
device_id = <1>;
switch_access_mode = "mdio";
mdio-bus = <&mdio1>;
reset_gpio = <&tlmm 0x26 0>;
switch_cpu_bmp = <0x40>; /* cpu port bitmap (Port 6 GMAC) */
switch_lan_bmp = <0x3c>; /* lan port bitmap */
switch_wan_bmp = <0x0>; /* wan port bitmap */
qca,ar8327-initvals = <
0x00004 0x7600000 /* PAD0_MODE */
0x00008 0x1000000 /* PAD5_MODE */
0x0000c 0x80 /* PAD6_MODE */
0x00010 0x2613a0 /* PORT6 FORCE MODE*/
0x000e4 0xaa545 /* MAC_POWER_SEL */
0x000e0 0xc74164de /* SGMII_CTRL */
0x0007c 0x4e /* PORT0_STATUS */
0x00094 0x4e /* PORT6_STATUS */
>;
qcom,port_phyinfo {
port@0 {
port_id = <1>;
phy_address = <0>;
};
port@1 {
port_id = <2>;
phy_address = <1>;
};
port@2 {
port_id = <3>;
phy_address = <2>;
};
port@3 {
port_id = <4>;
phy_address = <3>;
};
port@4 {
port_id = <5>;
phy_address = <4>;
};
};
};
};
dp1 {
device_type = "network";
compatible = "qcom,nss-dp";
clocks = <&gcc GCC_SNOC_GMAC1_AXI_CLK>;
clock-names = "nss-snoc-gmac-axi-clk";
qcom,id = <2>;
reg = <0x39D00000 0x10000>;
interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>;
qcom,mactype = <2>;
local-mac-address = [000000000000];
phy-mode = "sgmii";
};
dp2 {
device_type = "network";
compatible = "qcom,nss-dp";
clocks = <&gcc GCC_SNOC_GMAC0_AXI_CLK>;
clock-names = "nss-snoc-gmac-axi-clk";
qcom,id = <1>;
reg = <0x39C00000 0x10000>;
interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
qcom,mactype = <2>;
qcom,link-poll = <1>;
qcom,phy-mdio-addr = <7>;
mdio-bus = <&mdio0>;
local-mac-address = [000000000000];
phy-mode = "sgmii";
};
qcom,test@0 {
status = "ok";
};
/*
lpass: lpass@0xA000000{
status = "disabled";
};
pcm: pcm@0xA3C0000{
pinctrl-0 = <&audio_pins>;
pinctrl-names = "default";
status = "disabled";
};
pcm_lb: pcm_lb@0 {
status = "disabled";
};
*/
};
thermal-zones {
status = "ok";
};
};
&tlmm {
pinctrl-0 = <&blsp0_uart_pins>; //<&blsp0_uart_pins &phy_led_pins>;
pinctrl-names = "default";
blsp0_uart_pins: blsp0_uart_pins {
blsp0_uart_rx_tx {
pins = "gpio20", "gpio21";
function = "blsp0_uart0";
bias-disable;
};
};
/*
blsp1_uart_pins: blsp1_uart_pins {
blsp1_uart_rx_tx {
pins = "gpio23", "gpio25", "gpio24", "gpio26";
function = "blsp1_uart2";
bias-disable;
};
};
*/
blsp0_spi_pins: blsp0_spi_pins {
mux {
pins = "gpio10", "gpio11", "gpio12", "gpio13";
function = "blsp0_spi";
drive-strength = <2>;
bias-disable;
};
};
qspi_nand_pins: qspi_nand_pins {
qspi_clock {
pins = "gpio9";
function = "qspi_clk";
drive-strength = <8>;
bias-disable;
};
qspi_cs {
pins = "gpio8";
function = "qspi_cs";
drive-strength = <8>;
bias-disable;
};
qspi_data {
pins = "gpio4", "gpio5", "gpio6", "gpio7";
function = "qspi_data";
drive-strength = <8>;
bias-disable;
};
};
mdio1_pins: mdio_pinmux {
mux_0 {
pins = "gpio36";
function = "mdc";
drive-strength = <8>;
bias-pull-up;
};
mux_1 {
pins = "gpio37";
function = "mdio";
drive-strength = <8>;
bias-pull-up;
};
};
/*
phy_led_pins: phy_led_pins {
gephy_led_pin {
pins = "gpio46";
function = "led0";
drive-strength = <8>;
bias-pull-down;
};
};
*/
i2c_pins: i2c_pins {
i2c_scl {
pins = "gpio25";
function = "blsp2_i2c1";
drive-strength = <8>;
bias-disable;
};
i2c_sda {
pins = "gpio26";
function = "blsp2_i2c1";
drive-strength = <8>;
bias-disable;
};
};
button_pins: button_pins {
reset_button {
pins = "gpio28";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
};
};
/*
audio_pins: audio_pinmux {
mux_1 {
pins = "gpio24";
function = "audio_rxbclk";
drive-strength = <8>;
bias-pull-down;
};
mux_2 {
pins = "gpio25";
function = "audio_rxfsync";
drive-strength = <8>;
bias-pull-down;
};
mux_3 {
pins = "gpio26";
function = "audio_rxd";
drive-strength = <8>;
bias-pull-down;
};
mux_4 {
pins = "gpio27";
function = "audio_txmclk";
drive-strength = <8>;
bias-pull-down;
};
mux_5 {
pins = "gpio28";
function = "audio_txbclk";
drive-strength = <8>;
bias-pull-down;
};
mux_6 {
pins = "gpio29";
function = "audio_txfsync";
drive-strength = <8>;
bias-pull-down;
};
mux_7 {
pins = "gpio30";
function = "audio_txd";
drive-strength = <8>;
bias-pull-down;
};
};
*/
poe_pins: poe_pinmux {
/*
LAN port PoE output enable
H --> enable; L --> disable (Default setting to H)
*/
mux_0 { /* PoE_OUT_EN */
pins = "gpio24";
function = "gpio";
drive-strength = <2>;
bias-pull-up;
output-high;
};
mux_1 { /* PSE_INT_N */
pins = "gpio27";
function = "gpio";
bias-pull-up;
input;
};
};
leds_pins: leds_pinmux {
sys_green {
pins = "gpio1";
function = "gpio";
drive-strength = <8>;
bias-disable;
};
sys_blue {
pins = "gpio30";
function = "gpio";
drive-strength = <8>;
bias-pull-up;
};
sys_red {
pins = "gpio46";
function = "gpio";
drive-strength = <8>;
bias-disable;
};
};
};
&soc {
gpio_keys {
compatible = "gpio-keys";
pinctrl-0 = <&button_pins>;
pinctrl-names = "default";
button@1 {
label = "reset";
linux,code = <KEY_RESTART>;
gpios = <&tlmm 28 GPIO_ACTIVE_LOW>;
linux,input-type = <1>;
debounce-interval = <60>;
};
};
gpio_leds {
compatible = "gpio-leds";
pinctrl-0 = <&leds_pins>;
pinctrl-names = "default";
led@1 {
label = "sys:green";
gpios = <&tlmm 1 GPIO_ACTIVE_HIGH>; /* GPIO_1/ATST_QP0 */
default-state="off";
};
led@30 {
label = "sys:blue";
gpios = <&tlmm 30 GPIO_ACTIVE_HIGH>; /* GPIO_30 */
default-state="on";
};
led@46 {
label = "sys:red";
gpios = <&tlmm 46 GPIO_ACTIVE_HIGH>; /* GPIO_46 */
default-state="off";
};
};
};
&q6v5_wcss {
compatible = "qcom,ipq5018-q6-mpd";
#address-cells = <1>;
#size-cells = <1>;
ranges;
firmware = "IPQ5018/q6_fw.mdt";
reg = <0x0cd00000 0x4040>,
<0x1938000 0x8>,
<0x193d204 0x4>;
reg-names = "qdsp6",
"tcsr-msip",
"tcsr-q6";
resets = <&gcc GCC_WCSSAON_RESET>,
<&gcc GCC_WCSS_Q6_BCR>;
reset-names = "wcss_aon_reset",
"wcss_q6_reset";
clocks = <&gcc GCC_Q6_AXIS_CLK>,
<&gcc GCC_WCSS_ECAHB_CLK>,
<&gcc GCC_Q6_AXIM_CLK>,
<&gcc GCC_Q6_AXIM2_CLK>,
<&gcc GCC_Q6_AHB_CLK>,
<&gcc GCC_Q6_AHB_S_CLK>,
<&gcc GCC_WCSS_AXI_S_CLK>;
clock-names = "gcc_q6_axis_clk",
"gcc_wcss_ecahb_clk",
"gcc_q6_axim_clk",
"gcc_q6_axim2_clk",
"gcc_q6_ahb_clk",
"gcc_q6_ahb_s_clk",
"gcc_wcss_axi_s_clk";
#ifdef __IPQ_MEM_PROFILE_256_MB__
memory-region = <&q6_mem_regions>, <&q6_etr_region>;
#else
memory-region = <&q6_mem_regions>, <&q6_etr_region>,
<&q6_caldb_region>;
#endif
qcom,rproc = <&q6v5_wcss>;
qcom,bootargs_smem = <507>;
boot-args = <0x1 0x4 0x3 0x0F 0x0 0x0>,
<0x2 0x4 0x2 0x12 0x0 0x0>;
status = "ok";
q6_wcss_pd1: remoteproc_pd1@4ab000 {
compatible = "qcom,ipq5018-wcss-ahb-mpd";
reg = <0x4ab000 0x20>;
reg-names = "rmb";
firmware = "IPQ5018/q6_fw.mdt";
m3_firmware = "IPQ5018/m3_fw.mdt";
interrupts-extended = <&wcss_smp2p_in 8 0>,
<&wcss_smp2p_in 9 0>,
<&wcss_smp2p_in 12 0>,
<&wcss_smp2p_in 11 0>;
interrupt-names = "fatal",
"ready",
"spawn-ack",
"stop-ack";
resets = <&gcc GCC_WCSSAON_RESET>,
<&gcc GCC_WCSS_BCR>,
<&gcc GCC_CE_BCR>;
reset-names = "wcss_aon_reset",
"wcss_reset",
"ce_reset";
clocks = <&gcc GCC_WCSS_AHB_S_CLK>,
<&gcc GCC_WCSS_ACMT_CLK>,
<&gcc GCC_WCSS_AXI_M_CLK>;
clock-names = "gcc_wcss_ahb_s_clk",
"gcc_wcss_acmt_clk",
"gcc_wcss_axi_m_clk";
qcom,halt-regs = <&tcsr_q6_block 0xa000 0xd000 0x0>;
qcom,smem-states = <&wcss_smp2p_out 8>,
<&wcss_smp2p_out 9>,
<&wcss_smp2p_out 10>;
qcom,smem-state-names = "shutdown",
"stop",
"spawn";
#ifdef __IPQ_MEM_PROFILE_256_MB__
memory-region = <&q6_ipq5018_data>, <&m3_dump>,
<&q6_etr_region>;
#else
memory-region = <&q6_ipq5018_data>, <&m3_dump>,
<&q6_etr_region>, <&q6_caldb_region>;
#endif
};
q6_wcss_pd2: remoteproc_pd2 {
compatible = "qcom,ipq5018-wcss-pcie-mpd";
firmware = "IPQ5018/q6_fw.mdt";
m3_firmware = "qcn6122/m3_fw.mdt";
interrupts-extended = <&wcss_smp2p_in 16 0>,
<&wcss_smp2p_in 17 0>,
<&wcss_smp2p_in 20 0>,
<&wcss_smp2p_in 19 0>;
interrupt-names = "fatal",
"ready",
"spawn-ack",
"stop-ack";
qcom,smem-states = <&wcss_smp2p_out 16>,
<&wcss_smp2p_out 17>,
<&wcss_smp2p_out 18>;
qcom,smem-state-names = "shutdown",
"stop",
"spawn";
#ifdef __IPQ_MEM_PROFILE_256_MB__
memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>,
<&q6_qcn6122_etr_1>;
#else
memory-region = <&q6_qcn6122_data1>, <&m3_dump_qcn6122_1>,
<&q6_qcn6122_etr_1>, <&q6_qcn6122_caldb_1>;
#endif
};
q6_wcss_pd3: remoteproc_pd3 {
compatible = "qcom,ipq5018-wcss-pcie-mpd";
firmware = "IPQ5018/q6_fw.mdt";
interrupts-extended = <&wcss_smp2p_in 24 0>,
<&wcss_smp2p_in 25 0>,
<&wcss_smp2p_in 28 0>,
<&wcss_smp2p_in 27 0>;
interrupt-names = "fatal",
"ready",
"spawn-ack",
"stop-ack";
qcom,smem-states = <&wcss_smp2p_out 24>,
<&wcss_smp2p_out 25>,
<&wcss_smp2p_out 26>;
qcom,smem-state-names = "shutdown",
"stop",
"spawn";
#ifdef __IPQ_MEM_PROFILE_256_MB__
memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>,
<&q6_qcn6122_etr_2>;
#else
memory-region = <&q6_qcn6122_data2>, <&m3_dump_qcn6122_2>,
<&q6_qcn6122_etr_2>, <&q6_qcn6122_caldb_2>;
#endif
};
};
&i2c_0 {
pinctrl-0 = <&i2c_pins>;
pinctrl-names = "default";
status = "ok";
};
&wifi0 {
/* IPQ5018 */
qcom,multipd_arch;
qcom,rproc = <&q6_wcss_pd1>;
qcom,userpd-subsys-name = "q6v5_wcss_userpd1";
#ifdef __IPQ_MEM_PROFILE_256_MB__
qcom,tgt-mem-mode = <2>;
#else
qcom,tgt-mem-mode = <1>;
#endif
qcom,board_id = <0x24>;
#ifdef __CNSS2__
qcom,bdf-addr = <0x4C400000 0x4C400000 0x4C400000 0x0 0x0 0x0>;
qcom,caldb-addr = <0x4D300000 0x4D300000 0 0 0 0>;
qcom,caldb-size = <0x200000>;
mem-region = <&q6_ipq5018_data>;
#else
memory-region = <&q6_ipq5018_data>;
#endif
status = "ok";
};
&wifi1 {
/* QCN6122 5G */
qcom,multipd_arch;
qcom,userpd-subsys-name = "q6v5_wcss_userpd3";
qcom,rproc = <&q6_wcss_pd3>;
#ifdef __IPQ_MEM_PROFILE_256_MB__
qcom,tgt-mem-mode = <2>;
#else
qcom,tgt-mem-mode = <1>;
#endif
qcom,board_id = <0x60>;
#ifdef __CNSS2__
qcom,bdf-addr = <0x4E900000 0x4E900000 0x4E200000 0x0 0x0>;
qcom,caldb-addr = <0x4F800000 0x4F800000 0 0 0>;
qcom,caldb-size = <0x500000>;
mem-region = <&q6_qcn6122_data2>;
#else
memory-region = <&q6_qcn6122_data2>;
#endif
status = "ok";
};
&wifi2 {
/* QCN6122 6G */
qcom,multipd_arch;
qcom,userpd-subsys-name = "q6v5_wcss_userpd3";
#ifdef __IPQ_MEM_PROFILE_256_MB__
qcom,tgt-mem-mode = <2>;
#else
qcom,tgt-mem-mode = <1>;
#endif
qcom,board_id = <0xb0>;
qcom,bdf-addr = <0x4ED00000 0x4ED00000 0x4E400000 0x0 0x0>;
#ifdef __CNSS2__
qcom,caldb-addr = <0x4FF00000 0x4FF00000 0 0 0>;
#else
qcom,caldb-addr = <0x4FF00000>;
m3-dump-addr = <0x4FD00000>;
#endif
qcom,caldb-size = <0x500000>;
status = "disabled";
};
&usb3 {
status = "ok";
device-power-gpio = <&tlmm 24 1>;
};
&dwc_0 {
/delete-property/ #phy-cells;
/delete-property/ phys;
/delete-property/ phy-names;
};
&hs_m31phy_0 {
status = "ok";
};
&eud {
status = "ok";
};
&pcie_x1 {
perst-gpio = <&tlmm 18 GPIO_ACTIVE_LOW>;
};
&pcie_x2 {
perst-gpio = <&tlmm 15 GPIO_ACTIVE_LOW>;
};
&pcie_x1_rp {
status = "disabled";
mhi_0: qcom,mhi@0 {
reg = <0 0 0 0 0 >;
};
};
&pcie_x2_rp {
status = "disabled";
mhi_1: qcom,mhi@1 {
reg = <0 0 0 0 0 >;
};
};

View File

@@ -340,7 +340,7 @@
status = "ok";
pinctrl-0 = <&mdio1_pins>;
pinctrl-names = "default";
phy-reset-gpio = <&tlmm 39 0>;
phy-reset-gpio = <&tlmm 16 0>;
ethernet-phy@0 {
reg = <0x00>;

View File

@@ -18,6 +18,28 @@ define Device/cig_wf186w
endef
TARGET_DEVICES += cig_wf186w
define Device/cybertan_eww631_a1
DEVICE_TITLE := CyberTan EWW631-A1
DEVICE_DTS := qcom-ipq5018-eww631-a1
SUPPORTED_DEVICES := cybertan,eww631-a1
DEVICE_PACKAGES := ath11k-wifi-cybertan-eww631-a1 ath11k-firmware-ipq50xx-spruce ath11k-firmware-qcn6122
DEVICE_DTS_CONFIG := config@mp03.5-c1
IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi
IMAGE/nand-factory.ubi := append-ubi
endef
TARGET_DEVICES += cybertan_eww631_a1
define Device/cybertan_eww631_b1
DEVICE_TITLE := CyberTan EWW631-B1
DEVICE_DTS := qcom-ipq5018-eww631-b1
SUPPORTED_DEVICES := cybertan,eww631-b1
DEVICE_PACKAGES := ath11k-wifi-cybertan-eww631-b1 ath11k-firmware-ipq50xx-spruce ath11k-firmware-qcn6122
DEVICE_DTS_CONFIG := config@mp03.5-c1
IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi
IMAGE/nand-factory.ubi := append-ubi
endef
TARGET_DEVICES += cybertan_eww631_b1
define Device/edgecore_eap104
DEVICE_TITLE := EdgeCore EAP104
DEVICE_DTS := qcom-ipq5018-eap104

View File

@@ -51,3 +51,17 @@ define KernelPackage/tpm-tis-i2c/description
within Linux.
endef
$(eval $(call KernelPackage,tpm-tis-i2c))
define KernelPackage/bootconfig
SUBMENU:=Other modules
TITLE:=Bootconfig partition for failsafe
KCONFIG:=CONFIG_BOOTCONFIG_PARTITION
FILES:=$(LINUX_DIR)/drivers/platform/ipq/bootconfig.ko@ge4.4
AUTOLOAD:=$(call AutoLoad,56,bootconfig,1)
endef
define KernelPackage/bootconfig/description
Bootconfig partition for failsafe
endef
$(eval $(call KernelPackage,bootconfig))

View File

@@ -0,0 +1,13 @@
Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/platform/ipq/bootconfig.c
===================================================================
--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/platform/ipq/bootconfig.c
+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/platform/ipq/bootconfig.c
@@ -366,7 +366,7 @@ static int __init bootconfig_partition_i
continue;
partname_dir[i] = proc_mkdir(part_info[i].name, boot_info_dir);
- if (partname_dir != NULL) {
+ if (partname_dir[i] != NULL) {
proc_create_data("primaryboot", S_IRUGO,
partname_dir[i],
&primaryboot_ops,

View File

@@ -0,0 +1,54 @@
Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
===================================================================
--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/char/diag/diagchar_core.c
+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
@@ -763,11 +763,6 @@ static void diag_cmd_invalidate_polling(
driver->polling_reg_flag = 0;
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- return;
- }
polling = diag_cmd_chk_polling(&item->entry);
if (polling == DIAG_CMD_POLLING) {
driver->polling_reg_flag = 1;
@@ -829,11 +824,6 @@ struct diag_cmd_reg_entry_t *diag_cmd_se
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- return NULL;
- }
temp_entry = &item->entry;
if (temp_entry->cmd_code == entry->cmd_code &&
temp_entry->subsys_id == entry->subsys_id &&
@@ -907,12 +897,6 @@ void diag_cmd_remove_reg_by_pid(int pid)
mutex_lock(&driver->cmd_reg_mutex);
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- mutex_unlock(&driver->cmd_reg_mutex);
- return;
- }
if (item->pid == pid) {
list_del(&item->link);
kfree(item);
@@ -931,12 +915,6 @@ void diag_cmd_remove_reg_by_proc(int pro
mutex_lock(&driver->cmd_reg_mutex);
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- mutex_unlock(&driver->cmd_reg_mutex);
- return;
- }
if (item->proc == proc) {
list_del(&item->link);
kfree(item);

View File

@@ -0,0 +1,16 @@
Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/mtd/nand/raw/nand_ids.c
===================================================================
--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/mtd/nand/raw/nand_ids.c
+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/mtd/nand/raw/nand_ids.c
@@ -79,9 +79,9 @@
{ .id = {0xc2, 0xb7} },
SZ_4K, SZ_512, SZ_256K, 0, 2, 256, NAND_ECC_INFO(8, SZ_512), 0},
- {"MX35UF2GE4AD-Z4I SPI NAND 2G 1.8V",
+ {"MX35UF2GE4AD-Z4I SPI NAND 2G 1.8V 8-bit",
{ .id = {0xc2, 0xa6} },
- SZ_2K, SZ_128, SZ_128K, 0, 2, 160, NAND_ECC_INFO(4, SZ_512), 0 },
+ SZ_2K, SZ_256, SZ_128K, 0, 2, 128, NAND_ECC_INFO(8, SZ_512), 0 },
{"GD5F1GQ5REYIH SPI NAND 1G 1.8V",
{ .id = {0xc8, 0x21} },

View File

@@ -20,7 +20,7 @@ DEFAULT_PACKAGES += kmod-qca-nss-dp kmod-qca-ssdk swconfig \
kmod-usb-phy-ipq807x kmod-usb-dwc3-qcom-internal \
kmod-ath11k-ahb ath11k-firmware-ipq60xx \
kmod-gpio-button-hotplug iwinfo \
qca-ssdk-shell \
qca-ssdk-shell kmod-bootconfig \
uboot-envtools -procd-ujail
$(eval $(call BuildTarget))

View File

@@ -1,5 +1,4 @@
#!/bin/sh
[ -e /lib/firmware/$FIRMWARE ] && exit 0
. /lib/functions.sh
@@ -98,6 +97,18 @@ ath11k-macs)
;;
esac
;;
ath11k/IPQ6018/hw1.0/board.bin)
case "$board" in
cig,wf188n)
country=`cat /etc/ucentral/country`
if [ "$country" == "CA" ]; then
ln -s /lib/firmware/ath11k/IPQ6018/hw1.0/board.bin.CA /lib/firmware/ath11k/IPQ6018/hw1.0/board.bin
else
ln -s /lib/firmware/ath11k/IPQ6018/hw1.0/board.bin.US /lib/firmware/ath11k/IPQ6018/hw1.0/board.bin
fi
;;
esac
;;
*)
exit 1
;;

View File

@@ -10,7 +10,8 @@ boot() {
;;
edgecore,eap101|\
edgecore,eap102|\
edgecore,oap102)
edgecore,oap102|\
edgecore.eap104)
avail=$(fw_printenv -n upgrade_available)
[ ${avail} -eq 0 ] && fw_setenv upgrade_available 1
fw_setenv bootcount 0

View File

@@ -247,8 +247,8 @@ nand_do_upgrade_success() {
local conf_tar="/tmp/sysupgrade.tgz"
sync
[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
[ -f "$conf_tar" ] && nand_restore_config "$conf_tar" && sync
[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
[ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
echo "sysupgrade successful"
umount -a
reboot -f

View File

@@ -122,10 +122,10 @@ platform_do_upgrade() {
else
if grep -q rootfs1 /proc/cmdline; then
CI_UBIPART="rootfs2"
fw_setenv active 2 || exit 1
CI_FWSETENV="active 2"
else
CI_UBIPART="rootfs1"
fw_setenv active 1 || exit 1
CI_FWSETENV="active 1"
fi
fi
nand_upgrade_tar "$1"

View File

@@ -2,30 +2,21 @@ KERNEL_LOADADDR := 0x41080000
DEVICE_VARS += CE_TYPE
define Device/cig_wf188n-ca
define Device/cig_wf188n
DEVICE_TITLE := Cigtech WF-188n
DEVICE_DTS := qcom-ipq6018-cig-wf188n
DEVICE_DTS_CONFIG := config@cp03-c1
SUPPORTED_DEVICES := cig,wf188n
DEVICE_PACKAGES := ath11k-wifi-cig-wf188n-ca uboot-env
DEVICE_PACKAGES := ath11k-wifi-cig-wf188n uboot-env
endef
TARGET_DEVICES += cig_wf188n-ca
define Device/cig_wf188n-us
DEVICE_TITLE := Cigtech WF-188n
DEVICE_DTS := qcom-ipq6018-cig-wf188n
DEVICE_DTS_CONFIG := config@cp03-c1
SUPPORTED_DEVICES := cig,wf188n
DEVICE_PACKAGES := ath11k-wifi-cig-wf188n-us uboot-env
endef
TARGET_DEVICES += cig_wf188n-us
TARGET_DEVICES += cig_wf188n
define Device/hfcl_ion4xe
DEVICE_TITLE := HFCL ION4Xe
DEVICE_DTS := qcom-ipq6018-hfcl-ion4xe
DEVICE_DTS_CONFIG := config@cp01-c1
SUPPORTED_DEVICES := hfcl,ion4xe
DEVICE_PACKAGES := ath11k-wifi-qcom-ipq6018 uboot-envtools kmod-hwmon-lm75
DEVICE_PACKAGES := ath11k-wifi-hfcl-ion4xe uboot-envtools kmod-hwmon-lm75
endef
TARGET_DEVICES += hfcl_ion4xe
@@ -101,14 +92,14 @@ define Device/wallys_dr6018
endef
TARGET_DEVICES += wallys_dr6018
define Device/wallys_dr6018_v4
define Device/wallys_dr6018-v4
DEVICE_TITLE := Wallys DR6018 V4
DEVICE_DTS := qcom-ipq6018-wallys-dr6018-v4
DEVICE_DTS_CONFIG := config@cp01-c4
SUPPORTED_DEVICES := wallys,dr6018-v4
DEVICE_PACKAGES := ath11k-wifi-wallys-dr6018-v4 uboot-envtools ath11k-firmware-qcn9000
endef
TARGET_DEVICES += wallys_dr6018_v4
TARGET_DEVICES += wallys_dr6018-v4
define Device/glinet_ax1800
DEVICE_TITLE := GL-iNet AX1800

View File

@@ -76,3 +76,17 @@ define KernelPackage/usb-dwc3-qcom-internal/description
endef
$(eval $(call KernelPackage,usb-dwc3-qcom-internal))
define KernelPackage/bootconfig
SUBMENU:=Other modules
TITLE:=Bootconfig partition for failsafe
KCONFIG:=CONFIG_BOOTCONFIG_PARTITION
FILES:=$(LINUX_DIR)/drivers/platform/ipq/bootconfig.ko@ge4.4
AUTOLOAD:=$(call AutoLoad,56,bootconfig,1)
endef
define KernelPackage/bootconfig/description
Bootconfig partition for failsafe
endef
$(eval $(call KernelPackage,bootconfig))

View File

@@ -0,0 +1,13 @@
Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/platform/ipq/bootconfig.c
===================================================================
--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/platform/ipq/bootconfig.c
+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/platform/ipq/bootconfig.c
@@ -366,7 +366,7 @@ static int __init bootconfig_partition_i
continue;
partname_dir[i] = proc_mkdir(part_info[i].name, boot_info_dir);
- if (partname_dir != NULL) {
+ if (partname_dir[i] != NULL) {
proc_create_data("primaryboot", S_IRUGO,
partname_dir[i],
&primaryboot_ops,

View File

@@ -0,0 +1,54 @@
Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
===================================================================
--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/char/diag/diagchar_core.c
+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
@@ -763,11 +763,6 @@ static void diag_cmd_invalidate_polling(
driver->polling_reg_flag = 0;
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- return;
- }
polling = diag_cmd_chk_polling(&item->entry);
if (polling == DIAG_CMD_POLLING) {
driver->polling_reg_flag = 1;
@@ -829,11 +824,6 @@ struct diag_cmd_reg_entry_t *diag_cmd_se
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- return NULL;
- }
temp_entry = &item->entry;
if (temp_entry->cmd_code == entry->cmd_code &&
temp_entry->subsys_id == entry->subsys_id &&
@@ -907,12 +897,6 @@ void diag_cmd_remove_reg_by_pid(int pid)
mutex_lock(&driver->cmd_reg_mutex);
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- mutex_unlock(&driver->cmd_reg_mutex);
- return;
- }
if (item->pid == pid) {
list_del(&item->link);
kfree(item);
@@ -931,12 +915,6 @@ void diag_cmd_remove_reg_by_proc(int pro
mutex_lock(&driver->cmd_reg_mutex);
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- mutex_unlock(&driver->cmd_reg_mutex);
- return;
- }
if (item->proc == proc) {
list_del(&item->link);
kfree(item);

View File

@@ -20,7 +20,7 @@ DEFAULT_PACKAGES += kmod-qca-nss-dp kmod-qca-ssdk swconfig \
kmod-usb-phy-ipq807x kmod-usb-dwc3-qcom-internal \
kmod-ath11k-ahb ath11k-firmware-ipq807x \
kmod-gpio-button-hotplug iwinfo \
qca-ssdk-shell \
qca-ssdk-shell kmod-bootconfig \
uboot-envtools -procd-ujail
$(eval $(call BuildTarget))

View File

@@ -18,6 +18,9 @@ edgecore,oap102)
ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt"
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt"
;;
cybertan,eww631-b1)
ucidef_set_led_default "power" "POWER" "sys:blue" "on"
;;
esac
board_config_flush

View File

@@ -43,8 +43,10 @@ qcom_setup_macs()
[ -z "$mac" ] && return;
wan_mac=$(macaddr_canonicalize $mac)
lan_mac=$(macaddr_add "$wan_mac" 1)
ucidef_set_network_device_mac eth0 $lan_mac
ucidef_set_network_device_mac eth1 $wan_mac
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
ucidef_set_label_macaddr $wan_mac
;;
*)

View File

@@ -16,9 +16,9 @@ ath11k_generate_macs() {
echo -ne \\x${mac3//:/\\x} >> /lib/firmware/ath11k-macs
}
ath11k_generate_macs_wf194() {
ath11k_generate_macs_wf196() {
touch /lib/firmware/ath11k-macs
mac=$(grep BaseMacAddress= /dev/mtd14 | cut -dx -f2)
mac=$(grep BaseMacAddress= /dev/mtd18 | cut -dx -f2)
eth=$(macaddr_canonicalize $mac)
mac1=$(macaddr_add $eth 2)
mac2=$(macaddr_add $eth 3)
@@ -92,8 +92,32 @@ ath11k-macs)
edgecore,eap106)
ath11k_generate_macs
;;
cig,wf194c)
ath11k_generate_macs_wf194
cig,wf196)
ath11k_generate_macs_wf196
;;
esac
;;
ath11k/IPQ8074/hw2.0/board.bin)
case "$board" in
cig,wf196)
country=`cat /etc/ucentral/country`
if [ "$country" == "CA" ]; then
ln -s /lib/firmware/ath11k/IPQ8074/hw2.0/board.bin.CA /lib/firmware/ath11k/IPQ8074/hw2.0/board.bin
else
ln -s /lib/firmware/ath11k/IPQ8074/hw2.0/board.bin.US /lib/firmware/ath11k/IPQ8074/hw2.0/board.bin
fi
;;
esac
;;
ath11k/QCN9074/hw1.0/board.bin)
case "$board" in
cig,wf196)
country=`cat /etc/ucentral/country`
if [ "$country" == "CA" ]; then
ln -s /lib/firmware/ath11k/QCN9074/hw1.0/board.bin.CA /lib/firmware/ath11k/QCN9074/hw1.0/board.bin
else
ln -s /lib/firmware/ath11k/QCN9074/hw1.0/board.bin.US /lib/firmware/ath11k/QCN9074/hw1.0/board.bin
fi
;;
esac
;;

View File

@@ -10,7 +10,8 @@ boot() {
;;
edgecore,eap101|\
edgecore,eap102|\
edgecore,oap102)
edgecore,oap102|\
edgecore.eap104)
avail=$(fw_printenv -n upgrade_available)
[ ${avail} -eq 0 ] && fw_setenv upgrade_available 1
fw_setenv bootcount 0

View File

@@ -247,8 +247,8 @@ nand_do_upgrade_success() {
local conf_tar="/tmp/sysupgrade.tgz"
sync
[ "$CI_BOOTCFG" = 1 ] && nand_qca_update_bootconfig
[ -f "$conf_tar" ] && nand_restore_config "$conf_tar" && sync
[ -n "$CI_FWSETENV" ] && fw_setenv $CI_FWSETENV
[ -f "$conf_tar" ] && nand_restore_config "$conf_tar"
echo "sysupgrade successful"
umount -a
reboot -f

View File

@@ -61,12 +61,16 @@ platform_do_upgrade() {
if [ "$(find_mtd_chardev rootfs)" ]; then
CI_UBIPART="rootfs"
else
if grep -q rootfs1 /proc/cmdline; then
if [ -e /tmp/downgrade ]; then
CI_UBIPART="rootfs1"
{ echo 'active 1'; echo 'upgrade_available 0'; } > /tmp/fw_setenv.txt || exit 1
CI_FWSETENV="-s /tmp/fw_setenv.txt"
elif grep -q rootfs1 /proc/cmdline; then
CI_UBIPART="rootfs2"
fw_setenv active 2 || exit 1
CI_FWSETENV="active 2"
else
CI_UBIPART="rootfs1"
fw_setenv active 1 || exit 1
CI_FWSETENV="active 1"
fi
fi
nand_upgrade_tar "$1"

View File

@@ -29,8 +29,79 @@
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";
@@ -40,30 +111,6 @@
};
};
usb_mux_sel_pins: usb_mux_pins {
mux {
pins = "gpio27";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
};
pcie0_pins: pcie_pins {
pcie0_rst {
pins = "gpio58";
function = "pcie0_rst";
drive-strength = <8>;
bias-pull-down;
};
pcie0_wake {
pins = "gpio59";
function = "pcie0_wake";
drive-strength = <8>;
bias-pull-down;
};
};
mdio_pins: mdio_pinmux {
mux_0 {
pins = "gpio68";
@@ -170,19 +217,6 @@
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>;

View File

@@ -29,8 +29,79 @@
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";
@@ -40,30 +111,6 @@
};
};
usb_mux_sel_pins: usb_mux_pins {
mux {
pins = "gpio27";
function = "gpio";
drive-strength = <8>;
bias-pull-down;
};
};
pcie0_pins: pcie_pins {
pcie0_rst {
pins = "gpio58";
function = "pcie0_rst";
drive-strength = <8>;
bias-pull-down;
};
pcie0_wake {
pins = "gpio59";
function = "pcie0_wake";
drive-strength = <8>;
bias-pull-down;
};
};
mdio_pins: mdio_pinmux {
mux_0 {
pins = "gpio68";
@@ -170,19 +217,6 @@
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>;

View File

@@ -16,6 +16,7 @@
aliases {
serial0 = &blsp1_uart5;
serial1 = &blsp1_uart3;
/* Aliases as required by u-boot to patch MAC addresses */
ethernet0 = "/soc/dp1";
ethernet1 = "/soc/dp2";
@@ -29,6 +30,17 @@
stdout-path = "serial0";
};
gpio-export {
compatible = "gpio-export";
#size-cells = <0>;
mcu-enable {
gpio-export,name = "mcu-enable";
gpio-export,output = <0>;
gpios = <&tlmm 34 GPIO_ACTIVE_HIGH>;
};
};
reserved-memory {
/* No Pine attach in 256M profile */
#if !defined(__IPQ_MEM_PROFILE_256_MB__)
@@ -130,6 +142,26 @@
soc {
pinctrl@1000000 {
pinctrl-0 = <&mcu_rst>;
pinctrl-names = "default";
mcu_rst: mcu_rst_pins {
pins = "gpio34";
function = "gpio";
drive-strength = <8>;
bias-disable;
output-low;
};
mcu_uart: mcu_uart_pins {
mux {
pins = "gpio48", "gpio49";
function = "blsp2_uart";
drive-strength = <8>;
bias-disable;
};
};
button_pins: button_pins {
wps_button {
pins = "gpio67";
@@ -688,6 +720,12 @@
};
};
&blsp1_uart3 {
pinctrl-0 = <&mcu_uart>;
pinctrl-names = "default";
status = "ok";
};
&npu_cpr {
status = "disabled";
};

View File

@@ -9,29 +9,17 @@ define Device/cig_wf194c4
endef
TARGET_DEVICES += cig_wf194c4
define Device/cig_wf196_us
define Device/cig_wf196
DEVICE_TITLE := CIG WF196
DEVICE_DTS := qcom-ipq807x-wf196
DEVICE_DTS_CONFIG=config@hk14
SUPPORTED_DEVICES := cig,wf196
BLOCKSIZE := 256k
PAGESIZE := 4096
DEVICE_PACKAGES := ath11k-wifi-cig-wf196-us aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 \
ath11k-firmware-qcn9000 ath11k-wifi-cig-wf196_6g-us
DEVICE_PACKAGES := ath11k-wifi-cig-wf196 aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 \
ath11k-firmware-qcn9000
endef
TARGET_DEVICES += cig_wf196_us
define Device/cig_wf196_ca
DEVICE_TITLE := CIG WF196
DEVICE_DTS := qcom-ipq807x-wf196
DEVICE_DTS_CONFIG=config@hk14
SUPPORTED_DEVICES := cig,wf196
BLOCKSIZE := 256k
PAGESIZE := 4096
DEVICE_PACKAGES := ath11k-wifi-cig-wf196-ca aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 \
ath11k-firmware-qcn9000 ath11k-wifi-cig-wf196_6g-ca
endef
TARGET_DEVICES += cig_wf196_ca
TARGET_DEVICES += cig_wf196
define Device/edgecore_eap102
DEVICE_TITLE := Edgecore EAP102

View File

@@ -56,4 +56,16 @@ endef
$(eval $(call KernelPackage,diag-char))
define KernelPackage/bootconfig
SUBMENU:=Other modules
TITLE:=Bootconfig partition for failsafe
KCONFIG:=CONFIG_BOOTCONFIG_PARTITION
FILES:=$(LINUX_DIR)/drivers/platform/ipq/bootconfig.ko@ge4.4
AUTOLOAD:=$(call AutoLoad,56,bootconfig,1)
endef
define KernelPackage/bootconfig/description
Bootconfig partition for failsafe
endef
$(eval $(call KernelPackage,bootconfig))

View File

@@ -0,0 +1,13 @@
Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/platform/ipq/bootconfig.c
===================================================================
--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/platform/ipq/bootconfig.c
+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/platform/ipq/bootconfig.c
@@ -366,7 +366,7 @@ static int __init bootconfig_partition_i
continue;
partname_dir[i] = proc_mkdir(part_info[i].name, boot_info_dir);
- if (partname_dir != NULL) {
+ if (partname_dir[i] != NULL) {
proc_create_data("primaryboot", S_IRUGO,
partname_dir[i],
&primaryboot_ops,

View File

@@ -0,0 +1,54 @@
Index: linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
===================================================================
--- linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d.orig/drivers/char/diag/diagchar_core.c
+++ linux-5.4.164-qsdk-26349818b464f8c7b52d59ce73579d9f3dd6bd5d/drivers/char/diag/diagchar_core.c
@@ -763,11 +763,6 @@ static void diag_cmd_invalidate_polling(
driver->polling_reg_flag = 0;
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- return;
- }
polling = diag_cmd_chk_polling(&item->entry);
if (polling == DIAG_CMD_POLLING) {
driver->polling_reg_flag = 1;
@@ -829,11 +824,6 @@ struct diag_cmd_reg_entry_t *diag_cmd_se
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- return NULL;
- }
temp_entry = &item->entry;
if (temp_entry->cmd_code == entry->cmd_code &&
temp_entry->subsys_id == entry->subsys_id &&
@@ -907,12 +897,6 @@ void diag_cmd_remove_reg_by_pid(int pid)
mutex_lock(&driver->cmd_reg_mutex);
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- mutex_unlock(&driver->cmd_reg_mutex);
- return;
- }
if (item->pid == pid) {
list_del(&item->link);
kfree(item);
@@ -931,12 +915,6 @@ void diag_cmd_remove_reg_by_proc(int pro
mutex_lock(&driver->cmd_reg_mutex);
list_for_each_safe(start, temp, &driver->cmd_reg_list) {
item = list_entry(start, struct diag_cmd_reg_t, link);
- if (&item->entry == NULL) {
- pr_err("diag: In %s, unable to search command\n",
- __func__);
- mutex_unlock(&driver->cmd_reg_mutex);
- return;
- }
if (item->proc == proc) {
list_del(&item->link);
kfree(item);

View File

@@ -0,0 +1,27 @@
Index: libtcmd-11.5/libtcmd.h
===================================================================
--- libtcmd-11.5.orig/libtcmd.h
+++ libtcmd-11.5/libtcmd.h
@@ -71,7 +71,9 @@ struct tcmd_cfg {
struct sigevent sev;
timer_t timer;
bool timeout;
-} tcmd_cfg;
+};
+
+extern struct tcmd_cfg tcmd_cfg;
/* WLAN API */
#ifdef WLAN_API_NL80211
Index: libtcmd-11.5/nl80211.c
===================================================================
--- libtcmd-11.5.orig/nl80211.c
+++ libtcmd-11.5/nl80211.c
@@ -23,6 +23,7 @@
#endif
int cb_ret;
+struct tcmd_cfg tcmd_cfg;
#ifdef LIBNL_2
static inline struct nl_sock *nl_handle_alloc(void)

View File

@@ -0,0 +1,11 @@
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -2157,7 +2157,7 @@ static void sta_stats_decode_rate(struct
sband = local->hw.wiphy->bands[band];
- if (WARN_ON_ONCE(!sband->bitrates))
+ if (WARN_ON_ONCE(!sband || !sband->bitrates))
break;
brate = sband->bitrates[rate_idx].bitrate;

View File

@@ -0,0 +1,58 @@
--- a/drivers/net/wireless/ath/ath11k/core.h
+++ b/drivers/net/wireless/ath/ath11k/core.h
@@ -786,6 +786,7 @@ struct ath11k {
u32 max_tx_power;
u32 txpower_limit_2g;
u32 txpower_limit_5g;
+ u32 txpower_limit_6g;
u32 txpower_scale;
u32 power_scale;
u32 chan_tx_pwr;
--- a/drivers/net/wireless/ath/ath11k/mac.c
+++ b/drivers/net/wireless/ath/ath11k/mac.c
@@ -633,6 +633,7 @@ static void ath11k_pdev_caps_update(stru
ar->txpower_limit_2g = ar->max_tx_power;
ar->txpower_limit_5g = ar->max_tx_power;
+ ar->txpower_limit_6g = ar->max_tx_power;
ar->txpower_scale = WMI_HOST_TP_SCALE_MAX;
}
@@ -803,6 +804,16 @@ static int ath11k_mac_txpower_recalc(str
ar->txpower_limit_5g = txpower;
}
+ if ((ar->hw->wiphy->bands[NL80211_BAND_6GHZ]) &&
+ ar->txpower_limit_6g != txpower) {
+ param = WMI_PDEV_PARAM_TXPOWER_LIMIT5G;
+ ret = ath11k_wmi_pdev_set_param(ar, param,
+ txpower, ar->pdev->pdev_id);
+ if (ret)
+ goto fail;
+ ar->txpower_limit_6g = txpower;
+ }
+
return 0;
fail:
@@ -3542,18 +3553,8 @@ static void ath11k_mac_op_bss_info_chang
ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "mac vdev_id %i txpower %d\n",
arvif->vdev_id, info->txpower);
- if (ar->supports_6ghz && info->chandef.chan &&
- info->chandef.chan->band == NL80211_BAND_6GHZ &&
- (arvif->vdev_type == WMI_VDEV_TYPE_STA ||
- arvif->vdev_type == WMI_VDEV_TYPE_AP) &&
- test_bit(WMI_TLV_SERVICE_EXT_TPC_REG_SUPPORT,
- ar->ab->wmi_ab.svc_map)) {
- ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
- "discard tx power, change to set TPC power\n");
- } else {
- arvif->txpower = info->txpower;
- ath11k_mac_txpower_recalc(ar);
- }
+ arvif->txpower = info->txpower;
+ ath11k_mac_txpower_recalc(ar);
}
if (changed & BSS_CHANGED_MCAST_RATE &&

View File

@@ -29,7 +29,6 @@ define Package/qca-diag/Description
stack.
endef
QCASSDK_CONFIG_OPTS+= TOOL_PATH=$(TOOLCHAIN_DIR)/bin/ \
SYS_PATH=$(LINUX_DIR) \
TOOLPREFIX=$(TARGET_CROSS) \

View File

@@ -2,7 +2,7 @@ INCLUDE_DIR += include -I src
LIB := -lpthread -shared
LDFLAGS += -Llib/ -ldiag -lpthread -pie
FLAGS = -fPIC -g -DUSE_MUSL
EXTRA_CFLAGS = $(TARGET_CFLAGS) $(TARGET_LDFLAGS) $(TARGET_CPPFLAGS) -fstack-protector-all -znow -zrelro -Werror -Wno-error=attributes
EXTRA_CFLAGS = $(TARGET_CFLAGS) $(TARGET_LDFLAGS) $(TARGET_CPPFLAGS) -fstack-protector-all -znow -zrelro -Werror -Wno-error=address-of-packed-member -Wl,--allow-multiple-definition -Wno-error=attributes
sample_cliobj := dci_client/diag_dci_sample.c
klogobj := klog/diag_klog.c
mdobj := mdlog/diag_mdlog.c

View File

@@ -123,17 +123,23 @@ when who what, where, why
#define GUID_LEN 16
#ifdef ANDROID
#if defined (ANDROID) || defined (USE_ANDROID_LOGGING)
#define LOG_TAG "Diag_Lib"
#define DIAG_LOGE(...) { \
ALOGE(__VA_ARGS__); \
if (!diag_disable_console) \
printf(__VA_ARGS__); \
}
#include <cutils/log.h>
#include "common_log.h"
#define DIAG_LOGD(...) { \
ALOGE(__VA_ARGS__); \
if (!diag_disable_console) \
printf(__VA_ARGS__); \
}
#include <log/log.h>
#include "common_log.h"
#else
#define DIAG_LOGE(...) printf (__VA_ARGS__)
#define DIAG_LOGD(...) printf (__VA_ARGS__)
#endif
#include <pthread.h>
#include <stdio.h>
@@ -167,6 +173,12 @@ typedef enum {
DB_PARSER_STATE_CLOSE,
} qsr4_db_file_parser_state;
/* enum to handle packet processing status */
enum pkt_status{
PKT_PROCESS_ONGOING,
PKT_PROCESS_DONE
};
/*
* Structure to keep track of diag callback interface clients. Please note that
* there can be only client communicating with an ASIC at a given time.

View File

@@ -64,7 +64,7 @@ when who what, where, why
#define PID_DIR "/root/diag_logs"
#define MAX_CHAN 4
static unsigned char read_buf[4096];
static unsigned char read_buf[MAX_CHAN][4096];
static char ip_addr_name[FILE_NAME_LEN] = "192.168.0.10";
static char port_number_string[FILE_NAME_LEN] = "2500";
static int port_number = 2500;
@@ -397,13 +397,22 @@ int open_connection(struct diag_socket *sock)
int read_socket(struct diag_socket *socket)
{
int num_read;
int status;
repeat:
/* Read from the socket */
memset(read_buf, 0, 4096);
num_read = recv(socket->fd, (unsigned char *)read_buf, 4096, 0);
memset(read_buf[socket->id], 0, 4096);
num_read = recv(socket->fd, (unsigned char *)read_buf[socket->id], 4096, 0);
if (num_read > 0) {
/* Send the data read off of the socket to the kernel via the library */
diag_send_socket_data(socket->id, read_buf, num_read);
/*
* Process socket data to make sure full command is received before send it
* to the diag core via the library. If return value is not PKT_PROCESS_DONE
* then this is the case of partial packet and wait for pending bytes to
* get full diag command.
*/
status = diag_send_socket_data(socket->id, read_buf[socket->id], num_read);
if (status != PKT_PROCESS_DONE)
goto repeat;
} else if (num_read == -1) {
DIAG_LOGE("diag_socket_log: Read socket error: %s, errno: %d\n",
strerror(errno), errno);

View File

@@ -89,6 +89,9 @@ when who what, where, why
#define MAX_CHANNELS 4
#define MAX_USER_PKT_SIZE 16384
#define USER_SPACE_DATA_TYPE_SIZE 4
#define DCI_HEADER_LENGTH sizeof(int)
#define DCI_LEN_FIELD_LENGTH sizeof(int)
#define DCI_EVENT_OFFSET sizeof(uint16)
@@ -134,6 +137,13 @@ when who what, where, why
char dir_name[FILE_NAME_LEN];
char peripheral_name[FILE_NAME_LEN];
/* enum defined to handle full/partial packet case */
typedef enum {
PKT_START,
PKT_HEADER,
PKT_PAYLOAD
} diag_pkt_states;
static struct diag_callback_tbl_t cb_clients[NUM_PROC];
static int socket_inited = 0;
static int (*socket_cb_ptr)(void *socket_cb_data_ptr, int socket_id);
@@ -619,46 +629,246 @@ SIDE EFFECTS
===========================================================================*/
int diag_send_socket_data(int id, unsigned char buf[], int num_bytes)
{
unsigned char send_buf[4100];
unsigned char offset = 4;
int i;
int start = 0;
int end = 0;
int copy_bytes;
int success;
static unsigned char send_buf[MAX_CHANNELS][MAX_USER_PKT_SIZE];
static unsigned char extra_header = USER_SPACE_DATA_TYPE_SIZE;
static unsigned char tmp_header[DIAG_NON_HDLC_HEADER_SIZE];
static diag_pkt_states pkt_state = PKT_START;
static int hdlc_pkt_pending = FALSE;
static uint32_t total_pkt_size = 0;
static uint32_t bytes_required = 0;
static int s_char = 0, e_char = 0;
static uint32_t pkt_start_off = 0;
static uint32_t saved_bytes = 0;
int status = PKT_PROCESS_DONE;
int packet_len_index = 0;
uint16_t packet_len = 0;
int i = 0, j = 0;
if ((id >= 0) && (id < MAX_CHANNELS)) {
*(int *)send_buf = USER_SPACE_DATA_TYPE;
if (socket_token[id] != 0 ) {
*(int *)(send_buf + offset) = socket_token[id];
offset += 4;
}
for (i = 0; i < num_bytes; i++) {
if (hdlc_disabled) {
if (buf[i] == CONTROL_CHAR && i == 0) {
end = end + 1;
continue;
}
}
if (buf[i] == CONTROL_CHAR) {
copy_bytes = end-start+1;
memcpy(send_buf+offset, buf+start, copy_bytes);
diag_send_data(send_buf, copy_bytes+offset);
start = i+1;
end = i+1;
continue;
}
end = end+1;
}
success = 1;
} else {
DIAG_LOGE("diag: In %s, Error sending socket data. Invalid socket id: %d\n",
__func__, id);
success = 0;
if ((id < 0) || id >= MAX_CHANNELS) {
DIAG_LOGE("diag_socket_log: %s: Error sending socket data. socket id: %d, num_bytes: %d\n",
__func__, id, num_bytes);
return PKT_PROCESS_DONE;
}
return success;
for (i = 0; i < num_bytes; i++) {
status = PKT_PROCESS_ONGOING;
switch (pkt_state)
{
case PKT_START:
if (buf[i] == CONTROL_CHAR && !hdlc_pkt_pending) {
s_char = buf[i];
pkt_start_off = i;
/* probably it is non-HDLC packet */
if (num_bytes >= (pkt_start_off + DIAG_NON_HDLC_HEADER_SIZE)) {
/* received full header */
packet_len_index = pkt_start_off + 2;
packet_len = (uint16_t)(*(uint16_t *)(buf + packet_len_index));
total_pkt_size = DIAG_NON_HDLC_HEADER_SIZE + packet_len + 1;
if (total_pkt_size <= (num_bytes - pkt_start_off)) {
e_char = buf[total_pkt_size-1];
if (s_char == e_char) {
/* full non-HDLC packet received */
memset(send_buf[id], 0, MAX_USER_PKT_SIZE);
*(int *)send_buf[id] = USER_SPACE_DATA_TYPE;
if (socket_token[id] != 0) {
*(int *)(send_buf[id] + extra_header) = socket_token[id];
extra_header += sizeof(int);
}
memcpy(send_buf[id] + extra_header, buf, total_pkt_size);
/* send it diag core */
diag_send_data(send_buf[id], total_pkt_size + extra_header);
i += total_pkt_size - 1;
s_char = 0;
e_char = 0;
total_pkt_size = 0;
extra_header = USER_SPACE_DATA_TYPE_SIZE;
status = PKT_PROCESS_DONE;
}
} else {
/* full header + partial packet received */
pkt_state = PKT_PAYLOAD;
memset(send_buf[id], 0, MAX_USER_PKT_SIZE);
*(int *)send_buf[id] = USER_SPACE_DATA_TYPE;
if (socket_token[id] != 0) {
*(int *)(send_buf[id] + extra_header) = socket_token[id];
extra_header += sizeof(int);
}
memcpy(send_buf[id] + extra_header, (buf + pkt_start_off), (num_bytes - pkt_start_off));
saved_bytes = (num_bytes - pkt_start_off + extra_header);
bytes_required = total_pkt_size - (saved_bytes - extra_header);
i += num_bytes - 1;
DIAG_LOGD("%s:PKT_START: full header + partial pkt received, total_pkt_size %d recvd %d pending %d\n",
__func__, total_pkt_size, (saved_bytes - extra_header), bytes_required);
}
} else {
/* partial header received */
memcpy(tmp_header, (buf + pkt_start_off), (num_bytes - pkt_start_off));
saved_bytes = (num_bytes - pkt_start_off);
bytes_required = DIAG_NON_HDLC_HEADER_SIZE - saved_bytes;
i += num_bytes - 1;
pkt_state = PKT_HEADER;
DIAG_LOGD("%s:PKT_START: partial header received, recvd %d pending %d\n",
__func__, saved_bytes, bytes_required);
}
} else {
/* HDLC packet will enter here */
if (!hdlc_pkt_pending) {
hdlc_pkt_pending = TRUE;
memset(send_buf[id], 0, MAX_USER_PKT_SIZE);
*(int *)send_buf[id] = USER_SPACE_DATA_TYPE;
if (socket_token[id] != 0) {
*(int *)(send_buf[id] + extra_header) = socket_token[id];
extra_header += sizeof(int);
}
saved_bytes = extra_header;
}
/* iterate through the packet to find the delimiter */
for (j = 0; j < num_bytes; j++) {
if (buf[j] == CONTROL_CHAR) {
if (j == (num_bytes - 1)) {
/* delimiter found at the end of current packet
* probably this is end of HDLC packet
*/
if (saved_bytes + num_bytes >= MAX_USER_PKT_SIZE) {
DIAG_LOGE("%s:hdlc: command too large, dropping pkt\n", __func__);
hdlc_pkt_pending = FALSE;
saved_bytes = 0;
i += num_bytes - 1;
break;
}
memcpy(send_buf[id] + saved_bytes, buf, num_bytes);
/* send it to diag core */
diag_send_data(send_buf[id], saved_bytes + num_bytes);
hdlc_pkt_pending = FALSE;
i += num_bytes - 1;
saved_bytes = 0;
extra_header = USER_SPACE_DATA_TYPE_SIZE;
status = PKT_PROCESS_DONE;
} else {
/* delimiter character may come at the middle of packet
* just ignore as we cant handle this case
*/
DIAG_LOGD("%s:hdlc: Delimiter found at the middle index %d\n", __func__, j);
}
}
}
/* full HDLC packet has not received */
if (hdlc_pkt_pending) {
if (saved_bytes + num_bytes >= MAX_USER_PKT_SIZE) {
DIAG_LOGE("%s:hdlc: command too large, dropping pkt\n", __func__);
hdlc_pkt_pending = FALSE;
saved_bytes = 0;
i += num_bytes - 1;
break;
}
memcpy(send_buf[id] + saved_bytes, buf, num_bytes);
saved_bytes += num_bytes;
i += num_bytes - 1;
DIAG_LOGD("%s:hdlc: Partial Packet received, recvd %d\n", __func__,
(saved_bytes - extra_header));
}
}
break;
case PKT_HEADER:
if(num_bytes >= bytes_required){
/* we have full header now */
memcpy(tmp_header+saved_bytes, buf, bytes_required);
packet_len = (uint16_t)(*(uint16_t *)(tmp_header + 2));
total_pkt_size = DIAG_NON_HDLC_HEADER_SIZE + packet_len + 1;
if (total_pkt_size <= (num_bytes + saved_bytes)) {
/* might received full packet */
e_char = buf[total_pkt_size - saved_bytes - 1];
if (s_char == e_char) {
/* full non-HDLC packet received */
memset(send_buf[id], 0, MAX_USER_PKT_SIZE);
*(int *)send_buf[id] = USER_SPACE_DATA_TYPE;
if (socket_token[id] != 0) {
*(int *)(send_buf[id] + extra_header) = socket_token[id];
extra_header += sizeof(int);
}
memcpy(send_buf[id] + extra_header, tmp_header, saved_bytes);
memcpy(send_buf[id] + extra_header + saved_bytes, buf,
total_pkt_size - saved_bytes);
/* send it to diag core */
diag_send_data(send_buf[id], total_pkt_size + extra_header);
i += total_pkt_size - saved_bytes - 1;
s_char = 0;
e_char = 0;
total_pkt_size = 0;
bytes_required = 0;
saved_bytes = 0;
extra_header = USER_SPACE_DATA_TYPE_SIZE;
pkt_state = PKT_START;
status = PKT_PROCESS_DONE;
}
} else {
/* full header + partial packet received */
pkt_state = PKT_PAYLOAD;
memset(send_buf[id], 0, MAX_USER_PKT_SIZE);
*(int *)send_buf[id] = USER_SPACE_DATA_TYPE;
if (socket_token[id] != 0) {
*(int *)(send_buf[id] + extra_header) = socket_token[id];
extra_header += sizeof(int);
}
/* copy partial header received */
memcpy(send_buf[id] + extra_header, tmp_header, saved_bytes);
memcpy(send_buf[id] + extra_header + saved_bytes, buf, num_bytes);
bytes_required = total_pkt_size - saved_bytes - num_bytes;
i += num_bytes - 1;
saved_bytes += num_bytes + extra_header;
DIAG_LOGD("%s:PKT_HEADER: full header + partial pkt received, total_pkt_size %d recvd %d pending %d\n",
__func__, total_pkt_size, (saved_bytes - extra_header), bytes_required);
}
} else {
/* still full header not yet received */
memcpy(tmp_header + saved_bytes, buf, num_bytes);
saved_bytes += num_bytes;
bytes_required = DIAG_NON_HDLC_HEADER_SIZE - saved_bytes;
i += num_bytes - 1;
DIAG_LOGD("%s:PKT_HEADER: still partial header received, recvd %d pending %d\n",
__func__, saved_bytes, bytes_required);
}
break;
case PKT_PAYLOAD:
if(num_bytes >= bytes_required){
/* received pending bytes */
e_char = buf[bytes_required - 1];
if (s_char == e_char) {
/* full non-HDLC packet received */
memcpy(send_buf[id] + saved_bytes, buf, bytes_required);
/* send it to diag core */
diag_send_data(send_buf[id], total_pkt_size + extra_header);
i += bytes_required - 1;
s_char = 0;
e_char = 0;
total_pkt_size = 0;
bytes_required = 0;
saved_bytes = 0;
extra_header = USER_SPACE_DATA_TYPE_SIZE;
pkt_state = PKT_START;
status = PKT_PROCESS_DONE;
}
} else {
/* still not yet received the full packet */
memcpy(send_buf[id] + saved_bytes, buf, num_bytes);
bytes_required = total_pkt_size - (saved_bytes -
extra_header) - num_bytes;
i += num_bytes - 1;
saved_bytes += num_bytes;
DIAG_LOGD("%s:PKT_PAYLOAD: Still waiting for full packet,saved %d pending %d\n",
__func__, (saved_bytes - extra_header), bytes_required);
}
break;
default:
DIAG_LOGD("%s:default: Unexpected packet state\n",
__func__);
break;
}
}
return status;
}
/*==========================================================================
@@ -2300,6 +2510,7 @@ int diag_read_mask_file(void)
if (!found_cmd) {
DIAG_LOGE("Sorry, could not find valid commands in the mask file,"
"please check the mask file again\n");
fclose(read_mask_fp);
return -1;
}
} else {
@@ -2321,6 +2532,7 @@ int diag_read_mask_file(void)
if (mask_buf[count_mask_bytes] != CONTROL_CHAR && i == 0) {
DIAG_LOGE("Sorry, the mask file doesn't adhere to framing definition,"
"please check the mask file again\n");
fclose(read_mask_fp);
return -1;
}
if (count_mask_bytes > payload && mask_buf[count_mask_bytes] == CONTROL_CHAR && i != 0) {

View File

@@ -34,6 +34,14 @@ when who what, where, why
#define DIAG_MDLOG_PID_FILE_SZ 100
#define NUM_PROC 10
#define HDLC_DISABLE 1
/* Non-HDLC Header:
* 1 byte - Control char
* 1 byte - Version
* 2 bytes - Packet length
*/
#define DIAG_NON_HDLC_HEADER_SIZE 4
extern int diag_fd;
extern int fd_md[NUM_PROC];
extern int gdwClientID;

View File

@@ -249,6 +249,8 @@ static int diag_qsr4_db_file_mem_init(qsr4_db_file_list** file_entry)
}
if (entry->head == NULL)
entry->head = file_block_offset;
else
free(file_block_offset);
return TRUE;

View File

@@ -1,11 +1,11 @@
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_MIRROR_HASH:=ade4287ff2935ad1d54e5dabb8e6de28f648d0974fa76238fcc1616235e6773e
PKG_SOURCE_VERSION:=3417bb86645c5ff4c58258db7cc33e43260b4222
PKG_SOURCE_VERSION:=e90d32aaa149800ea79760639cb5ac9ddcfc8281
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
@@ -18,20 +18,59 @@ define Package/ath12k-firmware-default
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
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/hw2.0
$(INSTALL_DATA) $(PKG_BUILD_DIR)/ath12k-firmware/QCN9274/hw2.0/1.1.1/WLAN.WBE.1.1.1-00126-QCAHKSWPL_SILICONZ-1/* \
$(1)/lib/firmware/ath12k/QCN92XX/hw2.0
$(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

@@ -19,7 +19,7 @@ define Package/ath12k-wifi-default
SUBMENU:=ath12k Board-Specific Overrides
SECTION:=firmware
CATEGORY:=Firmware
DEPENDS:=@TARGET_qcn9274
DEPENDS:=@(TARGET_qcn9274||TARGET_ipq53xx)
TITLE:=Custom Board
endef
@@ -33,4 +33,32 @@ define Package/ath12k-wifi-qcom-qcn9274/install
$(INSTALL_DATA) ./board-2.bin.QCN9274 $(1)/lib/firmware/ath12k/QCN9274/hw1.0/board-2.bin
endef
define Package/ath12k-wifi-cig-wf189
$(call Package/ath12k-wifi-default)
TITLE:=board.bin for CIG WF189
endef
define Package/ath12k-wifi-sercomm-ap72tip
$(call Package/ath12k-wifi-default)
TITLE:=board.bin for Sercomm WIFI-7
endef
define Package/ath12k-wifi-cig-wf189/install
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0
$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/
$(INSTALL_DATA) ./board-cig-wf189.bin.qcn9224 $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/board.bin
$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
$(INSTALL_DATA) ./board-cig-wf189.bin.ipq53xx $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board.bin
endef
define Package/ath12k-wifi-sercomm-ap72tip/install
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0
$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/
$(INSTALL_DATA) ./board-sercomm-ap72tip.bin.qcn9224 $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/board.bin
$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
$(INSTALL_DATA) ./board-sercomm-ap72tip.bin.ipq53xx $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board.bin
endef
$(eval $(call BuildPackage,ath12k-wifi-qcom-qcn9274))
$(eval $(call BuildPackage,ath12k-wifi-cig-wf189))
$(eval $(call BuildPackage,ath12k-wifi-sercomm-ap72tip))

Binary file not shown.

Binary file not shown.

Binary file not shown.

82
feeds/ipq95xx/ftm/Makefile Executable file
View File

@@ -0,0 +1,82 @@
include $(TOPDIR)/rules.mk
PKG:=ftm
PKG_NAME:=$(PKG)
PKG_RELEASE:=1
LOCAL_SRC:=$(TOPDIR)/qca/src/common-tools/ftm
PKG_VERSION:=12.3
#PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG)
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=QCA
CATEGORY:=QTI software
URL:=http://www.qca.qualcomm.com
MAINTAINER:=Qualcomm Atheros
TITLE:= QCA ftm utils
DEPENDS:= @TARGET_ipq_ipq807x||TARGET_ipq_ipq807x_64||TARGET_ipq_ipq60xx||TARGET_ipq_ipq60xx_64||TARGET_ipq_ipq50xx||TARGET_ipq_ipq50xx_64||TARGET_ipq807x||TARGET_ipq50xx||TARGET_ipq60xx||TARGET_ipq95xx||TARGET_ipq53xx +libnl +libtcmd +qca-diag +librt +kmod-diag-char
endef
define Package/$(PKG_NAME)/description/Default
FTM Package Support for QCA WIFI 11 drivers
endef
TARGET_CFLAGS += -DCONFIG_FTM_WLAN -DDEBUG -DFTM_DEBUG -DWIN_AP_HOST
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/qca-diag
TARGET_CFLAGS += -MMD -O2 -Wall -g
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include
TARGET_CFLAGS += -fpie
TARGET_LDFLAGS += -ldiag -lnl-3 -lnl-genl-3 -lrt -ltcmd
TARGET_CSRCS := ftm_main.c ftm_wlan.c ftm_write_to_flash.c
TARGET_LDFLAGS += -pie
ifeq ($(CONFIG_FEATURE_IPQ_PROVISION_SUPPORT),y)
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/qti-mfg-provision
TARGET_CFLAGS += -DWIN_AP_AFC
TARGET_LDFLAGS += -lprovision
endif
ifneq ($(CONFIG_PACKAGE_kmod-mac80211),)
TARGET_CFLAGS+=-DWIN_AP_HOST_OPEN=1
endif
ifeq ($(CONFIG_FEATURE_QCA_IOT),y)
TARGET_CFLAGS += -DIPQ_AP_HOST_IOT -DIPQ_AP_HOST_IOT_QCA402X -ggdb3 -DCONFIG_DAEMON_MODE
TARGET_CSRCS += ftm_iot.c
TARGET_LDFLAGS += -lpthread
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/qca-iot
TARGET_LDFLAGS += -ldiag_demo
endif
ifeq ($(CONFIG_FEATURE_IPQ_IOT_SUPPORT),y)
TARGET_CFLAGS += -DIPQ_AP_HOST_IOT -DIPQ_AP_HOST_IOT_IPQ -ggdb3 -I$(STAGING_DIR)/usr/include/btdaemon
TARGET_CSRCS += ftm_iot.c
TARGET_LDFLAGS += -lpthread -lbtdaemon
endif
define Build/Compile
$(MAKE) -C $(PKG_BUILD_DIR) \
CC="$(TARGET_CC)" \
CFLAGS="$(TARGET_CFLAGS)" \
LDFLAGS="$(TARGET_LDFLAGS)" \
CSRCS="$(TARGET_CSRCS)"
endef
define Package/$(PKG_NAME)/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ftm $(1)/usr/sbin/
$(INSTALL_BIN) ./files/ftm.init $(1)/etc/init.d/ftm
$(INSTALL_DIR) $(1)/lib/wifi
$(INSTALL_BIN) ./files/compress_vart.sh $(1)/lib/compress_vart.sh
ifneq (, $(findstring ipq95xx, $(CONFIG_TARGET_BOARD)))
$(INSTALL_DIR) $(1)/sbin
$(INSTALL_BIN) ./files/ftm_qcc710_start.sh $(1)/sbin/ftm_qcc710_start
endif
endef
$(eval $(call BuildPackage,ftm))

View File

@@ -0,0 +1,75 @@
#!/bin/sh
#
# Copyright (c) 2020 Qualcomm Technologies, Inc.
#
# All Rights Reserved.
# Confidential and Proprietary - Qualcomm Technologies, Inc.
#
#
[ -e /lib/functions.sh ] && . /lib/functions.sh
[ -e /lib/ipq806x.sh ] && . /lib/ipq806x.sh
[ -e /lib/functions/boot.sh ] && . /lib/functions/boot.sh
low_mem_compress_art()
{
local mtdblock=$(find_mtd_part 0:ART)
if [ -z "$mtdblock" ]; then
# read from mmc
mtdblock=$(find_mmc_part 0:ART)
fi
[ -n "$mtdblock" ] || return
local apmp="/tmp"
lzma -zvfk -4 ${apmp}/virtual_art.bin 2> /dev/null || {
echo "Error Compressing Virtual ART" > /dev/console
return
}
dd if=${apmp}/virtual_art.bin.lzma of=${mtdblock}
echo "Success compressing Virtual ART(${mtdblock})" > /dev/console
return
}
normal_art()
{
local mtdblock=$(find_mtd_part 0:ART)
if [ -z "$mtdblock" ]; then
# read from mmc
mtdblock=$(find_mmc_part 0:ART)
fi
[ -n "$mtdblock" ] || return
local apmp="/tmp"
dd if=${apmp}/virtual_art.bin of=${mtdblock}
echo "Success writing to ART(${mtdblock})" > /dev/console
return
}
write_caldata()
{
local board
[ -f /tmp/sysinfo/board_name ] && {
board=ap$(cat /tmp/sysinfo/board_name | awk -F 'ap' '{print$2}')
}
if [ -e /sys/firmware/devicetree/base/compressed_art ]
then
echo "Compressed ART Supported Platform $board " > /dev/console
low_mem_compress_art
else
echo "Non Compressed ART Platform $board " > /dev/console
normal_art
fi
}
if [ "$1" = "write_caldata" ]
then
write_caldata
fi

View File

@@ -0,0 +1,99 @@
#!/bin/sh /etc/rc.common
#
# Copyright (c) 2013, 2017, 2020 Qualcomm Technologies, Inc.
#
# All Rights Reserved.
# Confidential and Proprietary - Qualcomm Technologies, Inc.
#
# 2013 Qualcomm Atheros, Inc.
#
# All Rights Reserved.
# Qualcomm Atheros Confidential and Proprietary
#
[ -e /lib/functions.sh ] && . /lib/functions.sh
[ -e /lib/ipq806x.sh ] && . /lib/ipq806x.sh
[ -e /lib/functions/boot.sh ] && . /lib/functions/boot.sh
START=97
SERVICE_DAEMONIZE=1
SERVICE_WRITE_PID=1
MTD_ART_PART_NAME="art"
compressed_art_read() {
local mtdblock=$(find_mtd_part 0:ART)
if [ -z "$mtdblock" ]; then
#read from mmc
mtdblock=$(find_mmc_part 0:ART)
fi
[ -n "$mtdblock" ] || return
local apmp="/tmp"
dd if=${mtdblock} of=${apmp}/virtual_art.bin.lzma
lzma -fdv --single-stream ${apmp}/virtual_art.bin.lzma || {
# Create dummy virtual_art.bin file of size 512K
dd if=/dev/zero of=${apmp}/virtual_art.bin bs=1024 count=512
}
echo "Uncompressed and Copied ART content from ${mtdblock} to /tmp/virtual_art.bin" > /dev/console
}
raw_art_read() {
local mtdblock=$(find_mtd_part 0:ART)
if [ -z "$mtdblock" ]; then
#read from mmc
mtdblock=$(find_mmc_part 0:ART)
fi
[ -n "$mtdblock" ] || return
local apmp="/tmp"
dd if=${mtdblock} of=${apmp}/virtual_art.bin
echo "Copy ART caldata from ${mtdblock} to /tmp/virtual_art.bin" > /dev/console
}
retrieve_caldata() {
local board
[ -f /tmp/sysinfo/board_name ] && {
board=ap$(cat /tmp/sysinfo/board_name | awk -F 'ap' '{print$2}')
}
echo "**** Platform Name: $board *****" > /dev/console
if [ -e /sys/firmware/devicetree/base/compressed_art ]
then
compressed_art_read
else
raw_art_read
fi
}
start() {
local emmc_flash=""
local nor_flash=""
emmc_flash=$(find_mmc_part 0:ART 2> /dev/null)
mtd_name=$(grep -i -w ${MTD_ART_PART_NAME} /proc/mtd | cut -f1 -d:)
nor_flash=`find /sys/bus/spi/devices/*/mtd -name ${mtd_name} 2> /dev/null`
if [ -n "$emmc_flash" ]; then
[ -L /dev/caldata ] || \
ln -s $emmc_flash /dev/caldata
elif [ -n "$nor_flash" ]; then
[ -L /dev/caldata ] || \
ln -s /dev/${mtd_name//mtd/mtdblock} /dev/caldata
elif [ -n "$mtd_name" ]; then
[ -L /dev/caldata ] || \
ln -s /dev/${mtd_name//mtd/mtdblock} /dev/caldata
fi
retrieve_caldata
}
stop() {
[ -L /dev/caldata ] && rm /dev/caldata
}

View File

@@ -0,0 +1,86 @@
#!/bin/sh
#
# Copyright (c) 2021 Qualcomm Technologies, Inc.
#
# All Rights Reserved.
# Confidential and Proprietary - Qualcomm Technologies, Inc.
#
#
# QCC710 v1.0 reset for BT bringup
qcc710_reset() {
reset_gpio_pin=$(cat /proc/device-tree/soc/pinctrl@1000000/QCC710_pins/QCC710_reset/pins | sed s/"gpio"//)
[[ -z $reset_gpio_pin ]] && return
gpio_base=$(cat /sys/class/gpio/gpiochip*/base | head -n1)
gpio_reset=$(( gpio_base + reset_gpio_pin ))
if [[ ! -e /sys/class/gpio/gpio$gpio_reset ]]; then
[ -z ${SLEEP} ] && echo -e "Enter sleep value for reset. Options:\n10 \n1" && read -p "Enter : " SLEEP
[ -z ${SLEEP} ] && SLEEP=10
echo $gpio_reset > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio$gpio_reset/direction
echo "Performing QCC710 reset ...." > /dev/console
{ echo 1 > /sys/class/gpio/gpio$gpio_reset/value ; \
sleep $SLEEP; \
echo 0 > /sys/class/gpio/gpio$gpio_reset/value; \
echo "QCC710 reset complete ...." > /dev/console; }
fi
}
while [ -n "$1" ]; do
case "$1" in
-h|--help) HELP=1; break;;
-a|--ipaddr) SERVERIP="$2";shift;;
-s|--sleep) SLEEP="$2";shift;;
-r|--baud-rate) BAUDRATE="$2";shift;;
-*)
echo "Invalid option: $1"
ERROR=1;
break
;;
*)break;;
esac
shift
done
[ -n "$HELP" -o -n "$ERROR" ] && {
cat <<EOF
Usage: $0 [-h] [-a SERVERIP] [-r baud-rate] [-s sleep]
ftm_qcc710_start options:
-h print this help
-a ipaddr of the server for diag connection
-r baudrate
-s sleep
Example:
ftm_qcc710_start -a <serverip> -r <baud-rate> -s <sleep>
version 1 : ./sbin/ftm_qcc710_start -a 192.168.1.121 -r 2000000 -s 10
version 2 : ./sbin/ftm_qcc710_start -a 192.168.1.121 -r 115200 -s 1
EOF
# If we requested the help flag, then exit normally.
# Else, it's probably an error so report it as such.
[ -n "$HELP" ] && exit 0
exit 1
}
[ -z ${SERVERIP} ] && SERVERIP=$(grep -oh "serverip.*#" /proc/cmdline | awk -F '#' '{print $2}')
[ -z ${SERVERIP} ] && read -p "No serverip in cmdline, please enter the serverip : " SERVERIP
[ -z ${BAUDRATE} ] && echo -e "Enter baudrate for stack bringup. Options:\n2000000\n115200" && read -p "Enter : " BAUDRATE
[ -z ${BAUDRATE} ] && BAUDRATE=2000000
qcc710_reset
DIAG_PID=$(ps | grep diag_socket_app | grep -v grep | awk '{print $1}')
while [ -n "$DIAG_PID" ]
do
kill -s SIGTERM $DIAG_PID
DIAG_PID=$(ps | grep diag_socket_app | grep -v grep | awk '{print $1}')
done
echo "Stopped previous instances of diag_socket_app process"
[ -z "$DIAG_PID" ] && /usr/sbin/diag_socket_app -a $SERVERIP -p 2500 &
FTM_PID=$(ps | grep "ftm " | grep -v grep | awk '{print $1}')
while [ -n "$FTM_PID" ]
do
kill -s SIGTERM $FTM_PID
FTM_PID=$(ps | grep "ftm " | grep -v grep | awk '{print $1}')
done
echo "Stopped previous instances ftm process"
[ -z "$FTM_PID" ] && /usr/sbin/ftm -n -dd -r $BAUDRATE

133
feeds/ipq95xx/ftm/src/Android.mk Executable file
View File

@@ -0,0 +1,133 @@
ifeq ($(call is-vendor-board-platform,QCOM),true)
# Build only if board has BT/FM/WLAN
ifeq ($(findstring true, $(BOARD_HAVE_QCOM_FM) $(BOARD_HAVE_BLUETOOTH) $(BOARD_HAS_ATH_WLAN_AR6320)),true)
LOCAL_PATH:= $(call my-dir)
BDROID_DIR:= system/bt
ifeq ($(TARGET_SUPPORTS_WEARABLES),true)
QTI_DIR := hardware/qcom/bt/msm8909/libbt-vendor
else
QTI_DIR := hardware/qcom/bt/libbt-vendor
endif
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(TARGET_OUT_HEADERS)/diag/include \
LOCAL_C_INCLUDES += vendor/qcom/proprietary/diag/src \
LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/common/inc \
LOCAL_C_INCLUDES += vendor/qcom/proprietary/bt/hci_qcomm_init \
LOCAL_C_INCLUDES += vendor/qcom/opensource/fm/helium \
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include \
LOCAL_C_INCLUDES += $(BDROID_DIR)/hci/include \
LOCAL_C_INCLUDES += $(QTI_DIR)/include
ifeq ($(TARGET_SUPPORTS_WEARABLES),true)
LOCAL_C_INCLUDES += device/qcom/msm8909w/opensource/bluetooth/tools/hidl_client/inc
else
LOCAL_C_INCLUDES += vendor/qcom/opensource/bluetooth/tools/hidl_client/inc
endif
LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
LOCAL_CFLAGS:= \
-DANDROID \
-DDEBUG
#LOCAL_CFLAGS += -include bionic/libc/include/sys/socket.h
#LOCAL_CFLAGS += -include bionic/libc/include/netinet/in.h
ifneq ($(DISABLE_BT_FTM),true)
LOCAL_CFLAGS += -DCONFIG_FTM_BT
endif
ifeq ($(BOARD_HAVE_QCOM_FM),true)
LOCAL_CFLAGS += -DCONFIG_FTM_FM
endif
ifeq ($(BOARD_HAS_QCA_FM_SOC), "cherokee")
LOCAL_CFLAGS += -DFM_SOC_TYPE_CHEROKEE
endif
ifneq ($(BOARD_ANT_WIRELESS_DEVICE), )
LOCAL_CFLAGS += -DCONFIG_FTM_ANT
endif
LOCAL_CFLAGS += -DCONFIG_FTM_NFC
ifeq ($(BOARD_HAVE_BLUETOOTH_BLUEZ), true)
LOCAL_CFLAGS += -DHAS_BLUEZ_BUILDCFG
endif # BOARD_HAVE_BLUETOOTH_BLUEZ
LOCAL_SRC_FILES:= \
ftm_main.c \
ftm_nfc.c \
ftm_nfcnq.c \
ftm_nfcqti.c \
ftm_nfcnq_fwdl.c \
ftm_nfcnq_test.c
ifneq ($(DISABLE_BT_FTM),true)
LOCAL_SRC_FILES += \
ftm_bt.c \
ftm_bt_power_pfal_linux.c \
ftm_bt_hci_pfal_linux.c \
ftm_bt_persist.cpp
endif
ifeq ($(call is-platform-sdk-version-at-least,23),true)
LOCAL_CFLAGS += -DANDROID_M
endif
ifeq ($(BOARD_HAVE_QCOM_FM),true)
ifeq ($(BOARD_HAS_QCA_FM_SOC), "cherokee")
LOCAL_SRC_FILES += ftm_fm.c ftm_fm_pfal_linux_3990.c
else
LOCAL_SRC_FILES += ftm_fm.c ftm_fm_pfal_linux.c
endif
endif
ifneq ($(BOARD_ANT_WIRELESS_DEVICE), )
LOCAL_SRC_FILES += ftm_ant.c
endif
ifeq ($(findstring true, $(BOARD_HAS_ATH_WLAN) $(BOARD_HAS_ATH_WLAN_AR6320)),true)
LOCAL_CFLAGS += -DBOARD_HAS_ATH_WLAN_AR6320
LOCAL_CFLAGS += -DCONFIG_FTM_WLAN
LOCAL_CFLAGS += -DCONFIG_FTM_WLAN_AUTOLOAD
LOCAL_STATIC_LIBRARIES += libtcmd
LOCAL_SHARED_LIBRARIES += libnl
LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/libtcmd
LOCAL_SRC_FILES += ftm_wlan.c
endif
LOCAL_SHARED_LIBRARIES += libdl
ifneq ($(DISABLE_BT_FTM),true)
LOCAL_SHARED_LIBRARIES += libbt-hidlclient
endif
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES)
LOCAL_MODULE:= ftmdaemon
LOCAL_CLANG := true
ifeq ($(PRODUCT_VENDOR_MOVE_ENABLED),true)
LOCAL_PROPRIETARY_MODULE := true
endif
LOCAL_MODULE_TAGS := optional
LOCAL_SHARED_LIBRARIES += libdiag
LOCAL_SHARED_LIBRARIES += libcutils liblog libhardware
ifneq ($(DISABLE_BT_FTM),true)
LOCAL_SHARED_LIBRARIES += libbtnv
endif
# By default NV persist gets used
LOCAL_CFLAGS += -DBT_NV_SUPPORT
LDFLAGS += -ldl
include $(BUILD_EXECUTABLE)
include $(call all-makefiles-under,$(LOCAL_PATH))
endif # filter
endif # is-vendor-board-platform

181
feeds/ipq95xx/ftm/src/LICENSE Executable file
View File

@@ -0,0 +1,181 @@
This text file is provided to comply with the attribution requirements of
the licenses herein, but see NOTICE for license terms of this software.
The Apache 2.0 license can be found at
http://www.apache.org/licenses/LICENSE-2.0.html
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS

12
feeds/ipq95xx/ftm/src/Makefile Executable file
View File

@@ -0,0 +1,12 @@
#CC := $(ATH_CROSS_COMPILE_TYPE)gcc
TARGET_TYPE ?= AR9888
TARGET_VERS ?= v2
#Sources to compile
CSRCS := ftm_main.c ftm_wlan.c ftm_write_to_flash.c
all:
$(CC) $(CFLAGS) $(LDFLAGS) -g3 -Wall \
$(CSRCS) -o ftm
clean:
rm -f ftm

View File

@@ -0,0 +1,86 @@
AM_CFLAGS = -Wall \
-g -O0 \
$(DIAG_CFLAGS)
AM_CPPFLAGS = -Wall \
-g -O0 \
$(DIAG_CFLAGS)
AM_CFLAGS += -I${WORKSPACE}/system/bt/hci/include
AM_CFLAGS += -I${WORKSPACE}/vendor/qcom/proprietary/bt/hci_qcomm_init/
AM_CPPFLAGS += -I${WORKSPACE}/system/bt/hci/include
AM_CPPFLAGS += -I${WORKSPACE}/vendor/qcom/proprietary/bt/hci_qcomm_init/
if DEBUG
AM_CFLAGS += -DDEBUG
AM_CPPFLAGS += -DDEBUG
endif
requiredlibs = -lrt $(DIAG_LIBS)
if USE_GLIB
AM_CFLAGS += -DUSE_GLIB $(GLIB_CFLAGS)
AM_CPPFLAGS += -DUSE_GLIB $(GLIB_CFLAGS)
requiredlibs += $(GLIB_LIBS)
endif
#By default build for MDM_LE
AM_CFLAGS += -DMDM_LE
AM_CPPFLAGS += -DMDM_LE
if MDM_ROME
AM_CFLAGS += -DBT_SOC_TYPE_ROME
AM_CPPFLAGS += -DBT_SOC_TYPE_ROME
else
if MDM_PRONTO
AM_CFLAGS += -DHCI_USE_MCT
AM_CPPFLAGS += -DHCI_USE_MCT
endif
endif
c_sources = ftm_main.c
if CONFIG_FTM_BT
AM_CFLAGS += -DCONFIG_FTM_BT -DBT_NV_SUPPORT
AM_CPPFLAGS += -DCONFIG_FTM_BT -DBT_NV_SUPPORT
c_sources += ftm_bt.c
c_sources += ftm_bt_power_pfal_linux.c
c_sources += ftm_bt_hci_pfal_linux.c
c_sources += ftm_bt_persist.cpp
endif
if CONFIG_FTM_FM
AM_CFLAGS += -DCONFIG_FTM_FM
c_sources += ftm_fm.c
c_sources += ftm_fm_pfal_linux.c
endif
if CONFIG_FTM_ANT
AM_CFLAGS += -DCONFIG_FTM_ANT
c_sources += ftm_ant.c
endif
if CONFIG_FTM_NFC
AM_CFLAGS += -DCONFIG_FTM_NFC
c_sources += ftm_nfc.c
c_sources += ftm_nfcnq.c
c_sources += ftm_nfcqti.c
c_sources += ftm_nfcnq_fwdl.c
c_sources += ftm_nfcnq_test.c
endif
if CONFIG_FTM_WLAN
AM_CFLAGS += -DCONFIG_FTM_WLAN -DCONFIG_FTM_WLAN_AUTOLOAD
AM_CFLAGS += $(LIBNL_CFLAGS) $(ATH6KL_UTILS_CFLAGS)
AM_CPPFLAGS += $(LIBNL_CFLAGS) $(ATH6KL_UTILS_CFLAGS)
requiredlibs += $(ATH6KL_UTILS_LIBS) $(LIBNL_LIBS)
c_sources += ftm_wlan.c
endif
ftmdaemon_SOURCES = $(c_sources)
ftmdaemon_LDADD = -ldl $(requiredlibs) -lbtnv
bin_PROGRAMS = ftmdaemon

72
feeds/ipq95xx/ftm/src/NOTICE Executable file
View File

@@ -0,0 +1,72 @@
This NOTICE file contains certain notices of software components included
with the software that Qualcomm Technologies, Inc. ("Qualcomm Technologies")
is required to provide you. Notwithstanding anything in the notices in this
file, your use of these software components together with the
Qualcomm Technologies software (Qualcomm Technologies software hereinafter
referred to as "Software") is subject to the terms of your license from
Qualcomm Technologies. Compliance with all copyright laws and software
license agreements included in the notice section of this file are the
responsibility of the user. Except as may be granted by separate express
written agreement, this file provides no license to any patents,
trademarks, copyrights, or other intellectual property.
Copyright (c) 2016 Qualcomm Technologies, Inc.
All rights reserved.
Qualcomm is a registered trademark and registered service mark of
QUALCOMM Incorporated. All other trademarks and service marks are the
property of their respective owners.
________________________________________
NOTICES
________________________________________
Copyright (C) 2010 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
________________________________________
Copyright (C) 2015 NXP Semiconductors
The original Work has been changed by NXP Semiconductors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
________________________________________
Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
________________________________________
Note: Any files for which the above Apache License notices are required
to be provided are not contributions.
A copy of the Apache 2.0 license is included in the file LICENSE
for attribution purposes only.

View File

@@ -0,0 +1,149 @@
# -*- Autoconf -*-
# configure.ac -- Autoconf script for ftm.
#
# Process this file with autoconf to produce a configure script
# Requires autoconf tool later than 2.61
AC_PREREQ(2.61)
# Initialize the ftm package version 1.0.0
AC_INIT([ftm],1.0.0)
# Does not strictly follow GNU Coding standards
AM_INIT_AUTOMAKE([foreign])
# Disables auto rebuilding of configure, Makefile.ins
AM_MAINTAINER_MODE
# defines some macros variable to be included by source
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
# Checks for programs.
AC_PROG_CC
AC_PROG_CXX
AM_PROG_CC_C_O
AC_PROG_LIBTOOL
AC_PROG_AWK
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
# Checks for libraries.
PKG_CHECK_MODULES([DIAG], [diag])
AC_SUBST([DIAG_CFLAGS])
AC_SUBST([DIAG_LIBS])
has_libnl_ver=0
# libnl-2 provides only libnl-2.0.pc file, so we check for separate libnl-genl-3.0.pc
# pkg-config file just for libnl-3.0 case.
#
PKG_CHECK_MODULES([LIBNL], [libnl-3.0 >= 3.0 libnl-genl-3.0 >= 3.0], [has_libnl_ver=3], [
PKG_CHECK_MODULES([LIBNL], [libnl-2.0 >= 2.0], [has_libnl_ver=2], [
PKG_CHECK_MODULES([LIBNL], [libnl-1], [has_libnl_ver=1], [has_libnl_ver=0])])])
if (test "$has_libnl_ver" -eq 0); then
AC_MSG_ERROR(libnl and libnl-genl are required but were not found)
fi
if (test "$has_libnl_ver" -gt 1); then
AC_DEFINE([HAVE_LIBNL20], [1], [Define if you have libnl-2.0 or higher])
fi
AC_SUBST([LIBNL_CFLAGS])
AC_SUBST([LIBNL_LIBS])
PKG_CHECK_MODULES([ATH6KL_UTILS], [ath6kl-utils])
AC_SUBST([ATH6KL_UTILS_CFLAGS])
AC_SUBST([ATH6KL_UTILS_LIBS])
AC_ARG_WITH([glib],
AC_HELP_STRING([--with-glib],
[enable glib, building FTM Daemon which use glib]))
if (test "x${with_glib}" = "xyes"); then
PKG_CHECK_MODULES(GTHREAD, gthread-2.0 >= 2.16, dummy=yes,
AC_MSG_ERROR(GThread >= 2.16 is required))
PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.16, dummy=yes,
AC_MSG_ERROR(GLib >= 2.16 is required))
GLIB_CFLAGS="$GLIB_CFLAGS $GTHREAD_CFLAGS"
GLIB_LIBS="$GLIB_LIBS $GTHREAD_LIBS"
AC_SUBST(GLIB_CFLAGS)
AC_SUBST(GLIB_LIBS)
fi
AM_CONDITIONAL(USE_GLIB, test "x${with_glib}" = "xyes")
AC_ARG_ENABLE([debug],
[ --enable-debug Turn on debugging],
[case "${enableval}" in
yes) debug=true ;;
no) debug=false ;;
*) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
esac],[debug=false])
AM_CONDITIONAL([DEBUG], [test x$debug = xtrue])
AC_ARG_ENABLE([all],
[ --enable-all Enable all FTM functionality],
[case "${enableval}" in
yes) all=true ;;
no) all=false ;;
*) AC_MSG_ERROR([bad value ${enableval} for --enable-all]) ;;
esac],[all=false])
AM_CONDITIONAL([CONFIG_FTM_BT], [test x$all = xtrue])
AM_CONDITIONAL([CONFIG_FTM_FM], [test x$all = xtrue])
AM_CONDITIONAL([CONFIG_FTM_ANT], [test x$all = xtrue])
AM_CONDITIONAL([CONFIG_FTM_NFC], [test x$all = xtrue])
AC_ARG_ENABLE([wlan],
[ --enable-wlan Enable WLAN FTM functionality],
[case "${enableval}" in
yes) wlan=true ;;
no) wlan=false ;;
*) AC_MSG_ERROR([bad value ${enableval} for --enable-wlan]) ;;
esac],[wlan=false])
AM_CONDITIONAL([CONFIG_FTM_WLAN], [test x$wlan = xtrue -o x$all = xtrue])
AC_ARG_ENABLE([bt],
[ --enable-bt Enable BT FTM functionality],
[case "${enableval}" in
yes) bt=true ;;
no) bt=false ;;
*) AC_MSG_ERROR([bad value ${enableval} for --enable-bt]) ;;
esac],[bt=false])
AM_CONDITIONAL([CONFIG_FTM_BT], [test x$bt = xtrue -o x$all = xtrue])
AC_ARG_ENABLE(target,
[AS_HELP_STRING([--enable-target=TARGET], [Specify the target product to build])],
[TARGET=$enableval],
[TARGET=none]
)
AM_CONDITIONAL([MDM_ROME], [test "x$TARGET" = "xmdm9607" -o "x$TARGET" = "xmdm9635" -o "x$TARGET" = "xmdm9640" -o "x$TARGET" = "xmdmcalifornium"])
AM_CONDITIONAL([MDM_PRONTO], [test "x$TARGET" = "xapq8009" -o "x$TARGET" = "xapq8017" -o "x$TARGET" = "xapq8053"])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_HEADER_STDC
AC_C_INLINE
AC_TYPE_INT64_T
AC_TYPE_PID_T
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT8_T
# Checks for library functions.
AC_FUNC_ERROR_AT_LINE
AC_FUNC_FORK
AC_FUNC_MALLOC
AC_CONFIG_FILES([ \
Makefile \
])
AC_OUTPUT

585
feeds/ipq95xx/ftm/src/ftm_ant.c Executable file
View File

@@ -0,0 +1,585 @@
/*==========================================================================
FTM ANT Source File
Description
FTM platform independent processing of packet data
# Copyright (c) 2010-2012 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
05/16/12 ankurn Adding support for ANT commands
11/28/12 c_ssugas implements efficent method for Ant cmd transfer
and implements Rx thread for event handling.
===========================================================================*/
#include "event.h"
#include "msg.h"
#include "log.h"
#include "diag_lsm.h"
#include "diagpkt.h"
#include "diagcmd.h"
#include "diag.h"
#include "termios.h"
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <stdbool.h>
#include <dlfcn.h>
#include "bt_vendor_qcom.h"
#include "ftm_ant_common.h"
#include "ftm_bt.h"
#include <string.h>
#include "hidl_client.h"
#ifdef ANDROID
#include <cutils/properties.h>
#endif
#ifdef ANDROID
extern int soc_type;
#endif
#define ANT_CTRL_PACKET_TYPE 0x0c
#define ANT_DATA_PACKET_TYPE 0x0e
#define UNUSED(x) (void)(x)
int init_transport_ant(int on);
// The following functions are dummy implementations of the callbacks required by libbt-vendor.
static void vendor_fwcfg_cb(bt_vendor_op_result_t result) {
UNUSED(result);
}
static void vendor_scocfg_cb(bt_vendor_op_result_t result) {
UNUSED(result);
}
static void vendor_lpm_vnd_cb(bt_vendor_op_result_t result) {
UNUSED(result);
}
static void vendor_audio_state_cb(bt_vendor_op_result_t result) {
UNUSED(result);
}
static void* vendor_alloc(int size) {
UNUSED(size);
return NULL;
}
static void vendor_dealloc(void *p_buf) {
UNUSED(p_buf);
}
static uint8_t vendor_xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback) {
UNUSED(opcode);
UNUSED(p_buf);
UNUSED(p_cback);
return 0;
}
static void vendor_epilog_cb(bt_vendor_op_result_t result) {
UNUSED(result);
}
static void vendor_a2dp_offload_cb(bt_vendor_op_result_t result, bt_vendor_opcode_t op, unsigned char handle) {
UNUSED(result);
UNUSED(op);
UNUSED(handle);
}
// This struct is used to regsiter the dummy callbacks with libbt-vendor
static bt_vendor_interface_t *vendor_interface=NULL;
static const bt_vendor_callbacks_t vendor_callbacks = {
sizeof(bt_vendor_callbacks_t),
vendor_fwcfg_cb,
vendor_scocfg_cb,
vendor_lpm_vnd_cb,
vendor_audio_state_cb,
vendor_alloc,
vendor_dealloc,
vendor_xmit_cb,
vendor_epilog_cb,
vendor_a2dp_offload_cb
};
/* Transport file descriptor */
int fd_transport_ant_cmd;
extern int first_ant_command;
/* Reader thread handle */
pthread_t ant_cmd_thread_hdl;
/* Pipe file descriptors for cancelling read operation */
int ant_pipefd[2];
/* Enable FTM_DEBUG to turn on Debug messages */
//#define FTM_DEBUG
/*===========================================================================
FUNCTION ftm_ant_readerthread
DESCRIPTION
Thread Routine to perfom asynchrounous handling of events coming on Smd
descriptor. It invokes a callback to the FTM ANT layer to intiate a request
to read event bytes.
DEPENDENCIES
The LifeTime of ReaderThraad is dependent on the status returned by the
call to ftm_ant_qcomm_handle_event
RETURN VALUE
RETURN NULL
SIDE EFFECTS
None
===========================================================================*/
void *ftm_ant_readerthread(void *ptr)
{
boolean status = FALSE;
int retval;
fd_set readfds;
int buf;
UNUSED(ptr);
#ifdef FTM_DEBUG
printf("ftm_ant_readerthread --> \n");
#endif
do
{
FD_ZERO(&readfds);
FD_SET(fd_transport_ant_cmd, &readfds);
FD_SET(ant_pipefd[0],&readfds);
retval = select((fd_transport_ant_cmd>ant_pipefd[0]?fd_transport_ant_cmd
:ant_pipefd[0]) + 1, &readfds, NULL, NULL, NULL);
if(retval == -1)
{
printf("select failed\n");
break;
}
if(FD_ISSET(ant_pipefd[0],&readfds))
{
#ifdef FTM_DEBUG
printf("Pipe descriptor set\n");
#endif
read(ant_pipefd[0],&buf,1);
if(buf == 1)
break;
}
if(FD_ISSET(fd_transport_ant_cmd,&readfds))
{
#ifdef FTM_DEBUG
printf("Read descriptor set\n");
#endif
status = ftm_ant_qcomm_handle_event();
if(TRUE != status)
break;
}
}
while(1);
#ifdef FTM_DEBUG
printf("\nReader thread exited\n");
#endif
return 0;
}
/*===========================================================================
FUNCTION ftm_ant_open_channel
DESCRIPTION
Open the SMD transport associated with ANT
DEPENDENCIES
NIL
RETURN VALUE
int value indicating success or failure
SIDE EFFECTS
NONE
===========================================================================*/
static bool ftm_ant_open_channel()
{
struct termios term_port;
int opts;
printf("%s: \n",__func__ );
switch (soc_type)
{
case BT_SOC_ROME:
case BT_SOC_CHEROKEE:
case BT_SOC_NAPIER:
//Use hidl_client_initialize for chip initialization
if (hidl_client_initialize(MODE_ANT,&fd_transport_ant_cmd) == false) {
printf("%s: HIDL client initialization failed, opening port with init_transpor_ant\n", __func__);
//Use libbt-vendor for chip initialization
fd_transport_ant_cmd = init_transport_ant(TRUE);
if (fd_transport_ant_cmd == -1) {
printf("%s: ANT Device open Failed, fd:%d: \n", __func__, fd_transport_ant_cmd);
return false;
}
}
break;
case BT_SOC_AR3K:
case BT_SOC_SMD:
#ifdef FTM_DEBUG
printf("ftm_ant_open_channel --> \n");
#endif
fd_transport_ant_cmd = open(APPS_RIVA_ANT_CMD_CH, (O_RDWR));
if (fd_transport_ant_cmd == -1) {
printf("Ant Device open Failed= %d\n ", fd_transport_ant_cmd);
return false;
}
// Blocking Read
opts = fcntl(fd_transport_ant_cmd, F_GETFL);
if (opts < 0) {
perror("fcntl(F_GETFL)");
exit(EXIT_FAILURE);
}
opts = opts & (~O_NONBLOCK);
if (fcntl(fd_transport_ant_cmd, F_SETFL, opts) < 0) {
perror("fcntl(F_SETFL)");
exit(EXIT_FAILURE);
}
if (tcgetattr(fd_transport_ant_cmd, &term_port) < 0)
close(fd_transport_ant_cmd);
cfmakeraw(&term_port);
if (tcsetattr(fd_transport_ant_cmd, TCSANOW, &term_port) < 0) {
printf("\n Error while setting attributes\n");
return false;
}
tcflush(fd_transport_ant_cmd, TCIFLUSH);
#ifdef FTM_DEBUG
printf("ftm_ant_open_channel success \n");
#endif
break;
default:
ALOGE("%s:Unknown soc type.",__func__);
return false;
}
if (pipe(ant_pipefd) == -1)
{
printf("pipe create error");
return STATUS_FAIL;
}
/* Creating read thread which listens for various masks & pkt requests */
pthread_create( &ant_cmd_thread_hdl, NULL, ftm_ant_readerthread, NULL);
return true;
}
int init_transport_ant(int on) {
void *so_handle;
unsigned char bdaddr[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
int fd[CH_MAX], powerstate, ret = -1;
char ref_count[PROPERTY_VALUE_MAX];
int value;
if (on) {
so_handle = dlopen("libbt-vendor.so", RTLD_NOW);
if (!so_handle)
{
ALOGE("Failed to load vendor component");
return -1;
}
vendor_interface = (bt_vendor_interface_t *) dlsym(so_handle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
if (!vendor_interface)
{
ALOGE("Failed to accesst bt vendor interface");
return -1;
}
vendor_interface->init(&vendor_callbacks, bdaddr);
ALOGI("Turn On BT power");
powerstate = BT_VND_PWR_ON;
ret = vendor_interface->op(BT_VND_OP_POWER_CTRL, &powerstate);
if (ret < 0)
{
ALOGE("Failed to turn on power from bt vendor interface");
return -1;
}
for (int i = 0; i < CH_MAX; i++)
fd[i] = -1;
#ifdef ANDROID
if (soc_type == BT_SOC_ROME || soc_type == BT_SOC_CHEROKEE || soc_type == BT_SOC_NAPIER) {
/*call ANT_USERIAL_OPEN to get ANT handle*/
ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_OPEN, fd);
}
#else
#ifdef BT_SOC_TYPE_ROME
/*call ANT_USERIAL_OPEN to get ANT handle*/
ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_OPEN, fd);
#endif
#endif
ALOGE("ret value: %d", ret);
if (ret != 1)
{
ALOGE("Failed to get fd from bt vendor interface");
return -1;
} else {
ALOGE("FD: %x", fd[0]);
return fd[0];
}
} else {
if (vendor_interface) {
ALOGE("Close and cleanup the interfaces");
#ifdef ANDROID
if (soc_type == BT_SOC_ROME || soc_type == BT_SOC_CHEROKEE || soc_type == BT_SOC_NAPIER) {
int ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_CLOSE, NULL);
}
#else
#ifdef BT_SOC_TYPE_ROME
int ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_CLOSE, NULL);
#endif
#endif
ALOGE("ret value: %d", ret);
ALOGI("Turn off BT power");
powerstate = BT_VND_PWR_OFF;
ret = vendor_interface->op(BT_VND_OP_POWER_CTRL, &powerstate);
if (ret < 0)
{
ALOGE("Failed to turn off power from bt vendor interface");
return -1;
}
vendor_interface->cleanup();
vendor_interface = NULL;
return 0;
} else {
ALOGE("Not able to find vendor interface handle");
return -1;
}
}
}
/*===========================================================================
FUNCTION ftm_log_send_msg
DESCRIPTION
Processes the buffer sent and sends it to the libdiag for sending the Cmd
response
DEPENDENCIES
NIL
RETURN VALUE
NIL
SIDE EFFECTS
None
===========================================================================*/
void ftm_ant_log_send_msg(const uint8 *pEventBuf,int event_bytes)
{
int result = log_status(LOG_FTM_VER_2_C);
ftm_ant_log_pkt_type* ftm_ant_log_pkt_ptr = NULL;
if((pEventBuf == NULL) || (event_bytes == 0))
return;
#ifdef FTM_DEBUG
printf("ftm_ant_log_send_msg --> \n");
#endif
if(result == 1)
{
ftm_ant_log_pkt_ptr = (ftm_ant_log_pkt_type *)log_alloc(LOG_FTM_VER_2_C,
FTM_ANT_LOG_HEADER_SIZE + (event_bytes-1));
if(ftm_ant_log_pkt_ptr != NULL)
{
/* FTM ANT Log PacketID */
ftm_ant_log_pkt_ptr->ftm_log_id = FTM_ANT_LOG_PKT_ID;
memcpy((void *)ftm_ant_log_pkt_ptr->data,(void *)pEventBuf,event_bytes);
log_commit( ftm_ant_log_pkt_ptr );
}
}
}
/*===========================================================================
FUNCTION ftm_ant_dispatch
DESCRIPTION
Dispatch routine for the various FM Rx/Tx commands. Copies the data into
a global union data structure before calling the processing routine
DEPENDENCIES
NIL
RETURN VALUE
A Packed structre pointer including the response to the FTM FM packet
SIDE EFFECTS
None
===========================================================================*/
void * ftm_ant_dispatch(ftm_ant_pkt_type *ant_ftm_pkt, uint16 pkt_len)
{
ftm_ant_generic_sudo_res *rsp;
int err = 0, i;
int data_len = ant_ftm_pkt->cmd_data_len;
bool resp = false;
unsigned char *pdata = NULL, *ptemp;
#ifdef FTM_DEBUG
printf("ftm_ant_dispatch --> \n");
#endif
UNUSED(pkt_len);
if (first_ant_command == 0) {
first_ant_command = 1;
ftm_ant_open_channel();
}
rsp = (ftm_ant_generic_sudo_res*)diagpkt_subsys_alloc( DIAG_SUBSYS_FTM
, FTM_ANT_CMD_CODE
, sizeof(ftm_ant_generic_sudo_res)
);
if(rsp == NULL)
{
printf("%s Failed to allocate resource",__func__);
return NULL;
}
switch (soc_type) {
//Rome shares the same UART transport for ANT and BT. Hence, to differenciate the
//packets by controller, adding one extra byte for ANT data and control packets
case BT_SOC_ROME:
case BT_SOC_CHEROKEE:
case BT_SOC_NAPIER:
data_len = data_len + 1;
pdata = (unsigned char *) malloc(data_len);
if (pdata == NULL) {
ALOGE("Failed to allocate the memory for ANT command packet");
rsp->result = FTM_ANT_FAIL;
return (void *) rsp;
}
//To be compatible with Legacy, SMD based PLs, send all the packets
//with cmd opcode 0x0c
pdata[0] = 0x0c;
memcpy(pdata+1, ant_ftm_pkt->data, data_len-1);
err = write(fd_transport_ant_cmd, pdata, data_len);
ptemp = pdata;
break;
case BT_SOC_AR3K:
case BT_SOC_SMD:
/* Send the packet to controller and send a dummy response back to host*/
err = write(fd_transport_ant_cmd, ant_ftm_pkt->data, data_len);
ptemp = ant_ftm_pkt->data;
break;
default:
ALOGE("%s:Unknown soc type", __func__);
break;
}
if (err == data_len) {
rsp->result = FTM_ANT_SUCCESS;
printf("ANT CMD: ");
for (i = 1; i<data_len; i++) {
printf("%02X ", ptemp[i]);
}
printf("\n");
} else {
rsp->result = FTM_ANT_FAIL;
printf("FTM ANT write fail len: %d\n", err);
}
if (pdata)
free(pdata);
return (void *)rsp;
}
/*===========================================================================
FUNCTION ftm_bt_hci_qcomm_handle_event
DESCRIPTION
Routine called by the HAL layer reader thread to process the HCI events
The post conditions of each event is covered in a state machine pattern
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
FALSE = failure, else TRUE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_ant_qcomm_handle_event ()
{
boolean status = TRUE;
int nbytes,i,len =0;
int event_type;
ftm_ant_generic_res *res = (ftm_ant_generic_res *)diagpkt_subsys_alloc(
DIAG_SUBSYS_FTM
, FTM_ANT_CMD_CODE
, sizeof(ftm_ant_generic_res)
);
if(res == NULL)
{
printf("%s Failed to allocate res",__func__);
tcflush(fd_transport_ant_cmd, TCIFLUSH);
return FALSE;
}
#ifdef FTM_DEBUG
printf("ftm_ant_hci_qcomm_handle_event --> \n");
#endif
/* Read length and event type of Ant Resp event*/
nbytes = read(fd_transport_ant_cmd, (void *)res->evt, 2);
if(nbytes <= 0) {
status = FALSE;
printf("ftm_ant_qcomm_handle_event read fail len=%d\n", nbytes);
return status;
}
event_type = res->evt[0];
len = res->evt[1];
#ifdef FTM_DEBUG
printf(" event type =%d\n",event_type);
printf("length of event =%d\n",len);
#endif
/* Read out the Ant Resp event*/
if (len <= (int)sizeof(res->evt))
{
nbytes = read(fd_transport_ant_cmd, (void *)res->evt, len);
if (nbytes != len) {
res->result = FTM_ANT_FAIL;
status = FALSE;
printf("ftm_ant_qcomm_handle_event read fail len=%d\n", nbytes);
}
else {
res->result = FTM_ANT_SUCCESS;
printf("ANT EVT: ");
for (i=0; i<nbytes; i++) {
printf("%02X ", res->evt[i]);
}
printf("\n");
ftm_ant_log_send_msg(res->evt, nbytes);
tcflush(fd_transport_ant_cmd, TCIOFLUSH);
}
}
else
{
res->result = FTM_ANT_FAIL;
status = FALSE;
printf("ftm_ant_qcomm_handle_event read fail len=%d is more than sizeof(res->evt)=%d\n", len, (int)sizeof(res->evt));
}
return status;
}

View File

@@ -0,0 +1,124 @@
/*==========================================================================
FTM FM Common Header File
Description
Global Data declarations of the ftm ant component.
# Copyright (c) 2012,2014 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
05/16/2012 ankurn Adding support for ANT+
11/28/12 c_ssugas Adds data structures and macro for ant log event support.
===========================================================================*/
#ifdef CONFIG_FTM_ANT
#include "diagpkt.h"
#include "log.h"
#include "ftm_bt_common.h"
#include <sys/types.h>
#define APPS_RIVA_ANT_CMD_CH "/dev/smd5"
#define APPS_RIVA_ANT_DATA_CH "/dev/smd6"
#define FTM_ANT_CMD_CODE 94
#define OPCODE_OFFSET 5
#define FTM_ANT_LOG_HEADER_SIZE (sizeof(ftm_ant_log_pkt_type) - 1)
#define FTM_ANT_LOG_PKT_ID 0x0D
/* FTM Log Packet - Used to send back the event of a ANT Command */
typedef PACKED struct
{
log_hdr_type hdr;
word ftm_log_id; /* FTM log id */
byte data[1]; /* Variable length payload,
look at FTM log id for contents */
} ftm_ant_log_pkt_type;
/* Generic result, used for any command that only returns an error code */
typedef enum {
FTM_ANT_FAIL,
FTM_ANT_SUCCESS,
} ftm_ant_api_result_type;
typedef PACKED struct
{
diagpkt_subsys_header_type header ;
char result ;
} ftm_ant_generic_sudo_res;
/* Generic Response */
typedef PACKED struct
{
diagpkt_subsys_header_type header; /*Diag header*/
uint8 evt[18]; /*allocates memory to hold longest valid event */
char result; /* result */
}__attribute__((packed)) ftm_ant_generic_res;
/* FTM ANT request type */
typedef PACKED struct
{
diagpkt_cmd_code_type cmd_code;
diagpkt_subsys_id_type subsys_id;
diagpkt_subsys_cmd_code_type subsys_cmd_code;
uint8 cmd_id; /* command id (required) */
uint8 cmd_data_len;
byte data[1];
}__attribute__((packed))ftm_ant_pkt_type;
/*===========================================================================
FUNCTION ftm_ant_dispatch
DESCRIPTION
Dispatch routine for the various ANT commands. Copies the data into
a global union data structure before calling the processing routine
DEPENDENCIES
NIL
RETURN VALUE
A Packed structre pointer including the response to the FTM ANT packet
SIDE EFFECTS
None
===========================================================================*/
void * ftm_ant_dispatch(ftm_ant_pkt_type *ftm_ant_pkt, uint16 length );
/*===========================================================================
FUNCTION ftm_ant_qcomm_handle_event
DESCRIPTION
Handler for the various ANT Events received. Sends data as log packets
using diag to upper layers.
DEPENDENCIES
NIL
RETURN VALUE
Status value TRUE if event received successfuly
otherwise returns status value FALSE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_ant_qcomm_handle_event ();
#endif /* CONFIG_FTM_ANT */

2013
feeds/ipq95xx/ftm/src/ftm_bt.c Executable file

File diff suppressed because it is too large Load Diff

289
feeds/ipq95xx/ftm/src/ftm_bt.h Executable file
View File

@@ -0,0 +1,289 @@
/*==========================================================================
FTM BT Task Header File
Description
Global Data declarations of the ftm bt component.
# Copyright (c) 2010-2011, 2013-2014 by Qualcomm Technologies, Inc.
# All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
09/28/11 rrr Moved peristent NV item related APIs to CPP,
for having BD address being programmed twice if previous
BD address was random generated.
09/03/11 agaja Added support for NV_READ and NV_WRITE Commands to write
onto Persist File system
02/08/11 braghave Changes to read the HCI commands from a binary file for
non-Android case
06/18/10 rakeshk Created a header file to hold the definitons for ftm bt
task
===========================================================================*/
#ifdef CONFIG_FTM_BT
#include "diagpkt.h"
#include <sys/types.h>
#ifdef USE_LIBSOCCFG
#include "btqsocnvm.h"
#include "btqsocnvmutils.h"
#endif
/* -------------------------------------------------------------------------
** Definitions and Declarations
** ------------------------------------------------------------------------- */
#define FTM_BT_CMD_CODE 4 /* BT FTM Command code */
#define FTM_FM_CMD_CODE 28 /* FM FTM Command code */
#define HCI_EVT_HDR_SIZE 3
#define HCI_ACL_HDR_SIZE 5
#define PROTOCOL_BYTE_SIZE 1
#define HC_VS_MAX_CMD_EVENT 260
#define HC_VS_MAX_ACL 1200
#define FTM_BT_HCI_USER_CMD 0
#define BT_FTM_CMD_RSP_LEN 1100
#define FTM_BT_DRV_START_TEST 0xA
/* MACROS for pin connectivty test*/
#define BT_CMD_SLIM_TEST 0xBFAC
#define LOOP_BACK_EVT_OGF 0x02
#define LOOP_BACK_EVT_OCF 0x18
#define LOOP_BACK_EVT_STATUS 0x00
#define LOOP_BACK_EVT_OGF_BIT 0x04
#define LOOP_BACK_EVT_OCF_BIT 0x05
#define LOOP_BACK_EVT_STATUS_BIT 0x06
#define FTM_BT_LOG_HEADER_SIZE (sizeof(ftm_bt_log_pkt_type) - 1)
/* Vendor Specific command codes */
#define BT_QSOC_EDL_CMD_OPCODE (0xFC00)
#define BT_QSOC_NVM_ACCESS_OPCODE (0xFC0B)
#define BT_QSOC_EDL_CMD_CODE (0x00)
#define BT_QSOC_NVM_ACCESS_CODE (0x0B)
#define BT_QSOC_VS_EDL_APPVER_RESP (0x02)
#ifndef HC_VS_MAX_CMD_EVENT
#define HC_VS_MAX_CMD_EVENT 260
#endif /* HC_VS_MAX_CMD_EVENT */
#define BT_QSOC_MAX_NVM_CMD_SIZE 0x64 /* Maximum size config (NVM) cmd */
#define BT_QSOC_MAX_BD_ADDRESS_SIZE 0x06 /**< Length of BT Address */
#ifndef HCI_CMD_HDR_SIZE
#define HCI_CMD_HDR_SIZE 4
#endif /* HCI_CMD_HDR_SIZE */
#ifndef HCI_EVT_HDR_SIZE
#define HCI_EVT_HDR_SIZE 3
#endif /* HCI_EVT_HDR_SIZE */
#define FTM_BT_LOG_PKT_ID 0x01
#define BT_HCI_CMD_PKT 0x01
#define BT_HCI_ACL_PKT 0x02
#define BT_HCI_EVT_PKT 0x04
#define BT_HCI_CMD_CMPLT_EVT 0x0E
#define FM_HCI_EVT_PKT 0x14
#define FM_HCI_CMD_PKT 0x11
extern int boardtype;
/* VS command structure */
typedef struct
{
uint8 vs_cmd_len;
uint8 vs_cmd_data[BT_QSOC_MAX_NVM_CMD_SIZE];
} bt_qsoc_cfg_tbl_struct_type;
/* First Commamd structure - Used to store the First command for later
* processing
*/
struct first_cmd
{
uint8 *cmd_buf;
int cmd_len;
};
/* FTM Global State - Enum defines the various states of the FTM
* module
*/
typedef enum ftm_state
{
FTM_SOC_NOT_INITIALISED,
FTM_SOC_READ_APP_VER,
FTM_SOC_READ_HW_VER,
FTM_SOC_POKE8_TBL_INIT,
FTM_SOC_DOWNLOAD_NVM,
FTM_SOC_DOWNLOAD_NVM_EFS,
FTM_SOC_SLEEP_DISABLE,
FTM_SOC_RESET,
FTM_SOC_INITIALISED
}ftm_state;
/* FTM CMD status */
typedef enum ftm_log_packet_type
{
FTM_USER_CMD_PASS,
FTM_USER_CMD_FAIL,
FTM_HCI_EVENT
}ftm_log_packet_type;
/* FTM Log Packet - Used to send back the event of a HCI Command */
typedef PACKED struct
{
log_hdr_type hdr;
byte data[1]; /* Variable length payload,
look at FTM log id for contents */
} ftm_bt_log_pkt_type;
/* FTM (BT) PKT Header */
typedef PACKED struct
{
word cmd_id; /* command id (required) */
word cmd_data_len; /* request pkt data length, excluding the diag and ftm headers
(optional, set to 0 if not used)*/
word cmd_rsp_pkt_size; /* rsp pkt size, size of response pkt if different then req pkt
(optional, set to 0 if not used)*/
} ftm_bt_cmd_header_type;
/* Bluetooth FTM packet */
typedef PACKED struct
{
diagpkt_subsys_header_type diag_hdr;
ftm_bt_cmd_header_type ftm_hdr;
byte data[1];
} ftm_bt_pkt_type;
/* SoC Cfg open Struct*/
#ifdef USE_LIBSOCCFG
typedef struct
{
bt_qsoc_config_params_struct_type run_time_params;
bt_qsoc_enum_nvm_mode nvm_mode;
bt_qsoc_enum_type soc_type;
}ftm_bt_soc_runtime_cfg_type;
#endif
/*===========================================================================
FUNCTION ftm_bt_err_timedout
DESCRIPTION
This routine triggers the shutdown of the HCI and Power resources in case
a HCI command previously sent times out.
DEPENDENCIES
NIL
RETURN VALUE
RETURN NIL
SIDE EFFECTS
NONE
===========================================================================*/
void ftm_bt_err_timedout();
/*===========================================================================
FUNCTION ftm_bt_dispatch
DESCRIPTION
Processes the BT FTM packet and dispatches the command to FTM HCI driver
DEPENDENCIES
NIL
RETURN VALUE
NIL,The error in the Command Processing is sent to the DIAG App on PC via
log packets
SIDE EFFECTS
None
===========================================================================*/
void ftm_bt_dispatch(void *ftm_bt_pkt ,int cmd_len );
/*===========================================================================
FUNCTION bt_hci_send_ftm_cmd
DESCRIPTION
Helper Routine to process the HCI cmd and invokes the sub routines to intialise
the SoC if needed based on the state of the FTM module
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
FALSE = failure, else TRUE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_hci_send_cmd
(
uint8 * cmd_buf, /* pointer to Cmd */
uint16 cmd_len /* Cmd length */
);
/*===========================================================================
FUNCTION bt_hci_hal_vs_sendcmd
DESCRIPTION
Helper Routine to process the VS HCI cmd and constucts the HCI packet before
calling bt_hci_send_ftm_cmd routine
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
FALSE = failure, else TRUE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_hci_hal_vs_sendcmd
(
uint16 opcode, /* Opcode */
uint8 *pCmdBuffer, /* Pointer to Payload*/
uint8 nSize /* Cmd Size */
);
/*===========================================================================
FUNCTION isLatestTarget
DESCRIPTION
For all the target/solution which has Bluedroid as stack and libbt-vendor as
vendor initialization component considered as latest target
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
FALSE = failure, else TRUE
SIDE EFFECTS
None
===========================================================================*/
boolean isLatestTarget();
char *get_current_time(void);
#endif /* CONFIG_FTM_BT */

View File

@@ -0,0 +1,115 @@
/*==========================================================================
FTM BT Commom Header File
Description
The header file includes helper enums for request_status and bt_power_state.
# Copyright (c) 2010-2011, 2014 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
09/28/11 rrr Common utility API abstracted,
06/18/10 rakeshk Created a header file to hold the helper enums for
request_status and bt_power_state
========================================================================*/
#ifdef CONFIG_FTM_BT
#include "event.h"
#include "msg.h"
#include "log.h"
#include "diag_lsm.h"
#include <sys/types.h>
#ifndef __FTM_BT_COMMON_H__
#define __FTM_BT_COMMON_H__
#define TRUE 1
#define FALSE 0
/* request_status - enum to encapuslate the status of a HAL request*/
typedef enum request_status
{
STATUS_SUCCESS,
STATUS_FAIL,
STATUS_NO_RESOURCES,
STATUS_SHORT_WRITE,
STATUS_SHORT_READ
}request_status;
/* request_status - enum to encapuslate the possible statea of BT power*/
typedef enum bt_power_state
{
BT_OFF = 0x30, /* Its the value 0 to be input to rfkill driver */
BT_ON = 0x31 /* ASCII value for '1'*/
}bt_power_state;
typedef enum
{
FTM_BT_DRV_NO_ERR = 0,
FTM_BT_DRV_CONN_TEST_FAILS,
FTM_BT_DRV_QSOC_POWERUP_FAILS,
FTM_BT_DRV_RX_PKT_TYPE_NOT_SUPPORTED,
FTM_BT_DRV_SIO_OPEN_FAILS,
FTM_BT_DRV_NO_SOC_RSP_TOUT,
FTM_BT_DRV_BAD_NVM,
#ifdef BT_NV_SUPPORT
FTM_BT_NV_READ_FAIL,
FTM_BT_NV_WRITE_FAIL,
#endif
FTM_BT_DRV_UNKNOWN_ERR
} ftm_bt_drv_err_state_type;
/*===========================================================================
FUNCTION ftm_bt_hci_qcomm_handle_event
DESCRIPTION
Routine called by the HAL layer reader thread to process the HCI events
The post conditions of each event is covered in a state machine pattern
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
FALSE = failure, else TRUE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_hci_qcomm_handle_event();
/*===========================================================================
FUNCTION ftm_log_send_msg
DESCRIPTION
Processes the buffer sent and sends it to the libdiag for sending the Cmd
response
DEPENDENCIES
NIL
RETURN VALUE
NIL
SIDE EFFECTS
None
===========================================================================*/
void ftm_log_send_msg(const uint8 *pEventBuf,int event_bytes);
#endif //__FTM_BT_COMMON_H__
#endif /* CONFIG_FTM_BT */

View File

@@ -0,0 +1,161 @@
/*==========================================================================
FTM BT HCI PFAL Header File
Description
Warpper API definitions of the ftm bt hci hal component.
# Copyright (c) 2010 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
06/18/10 rakeshk Created a header file to hold the wrapper HAL
definitions for HCI UART control
===========================================================================*/
#include "ftm_bt_common.h"
#include "ftm_bt_hci_pfal.h"
/*===========================================================================
FUNCTION ftm_bt_hci_hal_set_transport
DESCRIPTION
sets the type of transport based on the msm type
DEPENDENCIES
NIL
RETURN VALUE
returns the type of transport
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_hci_hal_set_transport()
{
return ftm_bt_hci_pfal_set_transport();
}
/*===========================================================================
FUNCTION ftm_bt_hci_hal_deinit_transport
DESCRIPTION
Platform independent wrapper API which intiatea a De-intialise of UART/SMD
resources with PFAL layer and returns the status of the PFAL operation
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_hal_deinit_transport()
{
return ftm_bt_hci_pfal_deinit_transport();
}
/*===========================================================================
FUNCTION ftm_bt_hci_hal_init_transport
DESCRIPTION
Platform independent wrapper API which intiatea a intialise of UART/SMD
resources with PFAL layer and returns the status of the PFAL operation
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_hal_init_transport (int mode)
{
return ftm_bt_hci_pfal_init_transport(mode);
}
/*===========================================================================
FUNCTION ftm_bt_hci_hal_nwrite
DESCRIPTION
Platform independent wrapper API which intiates a write operation
with the PFAL layer and returns the status of the PFAL operation.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_hal_nwrite(uint8 *buf, int size)
{
return ftm_bt_hci_pfal_nwrite(buf,size);
}
/*===========================================================================
FUNCTION ftm_bt_hci_hal_nread
DESCRIPTION
Platform independent wrapper API which intiates a read operation
with the PFAL layer and returns the status of the PFAL operation.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_hal_nread(uint8 *buf, int size)
{
return ftm_bt_hci_pfal_nread(buf,size);
}
/*===========================================================================
FUNCTION ftm_bt_hci_hal_changebaudrate
DESCRIPTION
Platform independent wrapper API which intiatea a UART baud rate change
with the PFAL layer and returns the status of the PFAL request.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
TRUE if SUCCESS, else FAIL
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_hci_hal_changebaudrate (uint32 new_baud)
{
return ftm_bt_hci_pfal_changebaudrate(new_baud);
}

View File

@@ -0,0 +1,177 @@
/*==========================================================================
FTM BT HCI PFAL Header File
Description
PFAL API declarations of the ftm bt hci pfal component.
# Copyright (c) 2010 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
06/18/10 rakeshk Created a header file to hold the PFAL declarations for
HCI UART programming
===========================================================================*/
#include "ftm_bt_common.h"
#ifndef __FTM_BT_HCI_PFAL_H__
#define __FTM_BT_HCI_PFAL_H__
#define PIN_CON_CMD_OGF 0xFC
#define PIN_CON_CMD_OCF 0x0C
#define PIN_CON_CMD_SUB_OP 0x38
#define PIN_CON_INTERFACE_ID 0x01
#define PIN_CON_EVENT_LEN 0x06
#define EXT_PIN_CON_LEN 0x02
#define PIN_CON_CMD_OCF_BIT 0x01
#define PIN_CON_CMD_OGF_BIT 0x02
#define PIN_CON_CMD_SUBOP_BIT 0x04
#define PIN_CON_CMD_INTER_BIT 0x05
#define PIN_CON_EVT_OGF_BIT 0x05
#define PIN_CON_EVT_OCF_BIT 0x04
#define PIN_CON_EVT_SUB_OP_BIT 0x07
#define PIN_CON_INTERFACE_ID_EVT_BIT 0x08
#define PIN_CON_EVENT_LEN_BIT 0x02
#define PIN_CON_EVT_STATUS_BIT 0x06
#define LOG_TAG "ftmdaemon"
#define PRI_INFO " I"
#define PRI_WARN " W"
#define PRI_ERROR " E"
#define PRI_DEBUG " D"
#define PRI_VERB " V"
#define ALOG(pri, tag, fmt, arg...) fprintf(stderr, tag pri ": " fmt"\n", ##arg)
#define ALOGV(fmt, arg...) ALOG(PRI_VERB, LOG_TAG, fmt, ##arg)
#define ALOGD(fmt, arg...) ALOG(PRI_DEBUG, LOG_TAG, fmt, ##arg)
#define ALOGI(fmt, arg...) ALOG(PRI_INFO, LOG_TAG, fmt, ##arg)
#define ALOGW(fmt, arg...) ALOG(PRI_WARN, LOG_TAG, fmt, ##arg)
#define ALOGE(fmt, arg...) ALOG(PRI_ERROR, LOG_TAG, fmt, ##arg)
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_set_transport
DESCRIPTION
sets the type of transport based on the msm type
DEPENDENCIES
NIL
RETURN VALUE
returns the type of transport
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_hci_pfal_set_transport(void);
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_deinit_transport
DESCRIPTION
Platform specific routine to de-intialise the UART/SMD resource.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_pfal_deinit_transport();
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_init_transport
DESCRIPTION
Platform specific routine to intialise the UART/SMD resources.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_pfal_init_transport ();
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_nwrite
DESCRIPTION
Platform specific routine to write the data in the argument to the UART/SMD
port intialised.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_pfal_nwrite(uint8 *buf, int size);
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_nread
DESCRIPTION
Platform specific routine to read data from the UART/SMD port intialised into
the buffer passed in argument.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_pfal_nread(uint8 *buf, int size);
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_changebaudrate
DESCRIPTION
Platform specific routine to intiate a change in baud rate
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
TRUE if SUCCESS, else FALSE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_hci_pfal_changebaudrate (uint32 new_baud);
#endif //__FTM_BT_HCI_PFAL_H__

View File

@@ -0,0 +1,674 @@
/*==========================================================================
FTM Platform specfic HCI UART/SMD File
Description
Platform specific routines to program the UART/SMD descriptors
# Copyright (c) 2010-2011, 2013 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
06/07/11 bneti Add support smd support for msm8960
06/18/10 rakeshk Created a source file to implement platform specific
routines for UART
07/07/10 rakeshk Removed the conversion of 3.2 Mbps baud rate
01/07/10 rakeshk Added support for verbose logging of Cmd and events
===========================================================================*/
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/select.h>
#include <termios.h>
#include <pthread.h>
#include <stdio.h>
#include <dlfcn.h>
#include "bt_vendor_lib.h"
#include "ftm_bt_hci_pfal.h"
#include "ftm_common.h"
#include <string.h>
#include "log.h"
#include <cutils/properties.h>
#include "hidl_client.h"
#ifdef ANDROID
#define VENDOR_LIB "libbt-vendor.so"
#else
#define VENDOR_LIB "libbt-vendor.so.0"
#endif
uint8_t is_slim_bus_test = 0;
#define UNUSED(x) (void)(x)
/*identify the transport type*/
static char *transport_dev;
typedef enum {
BT_SOC_DEFAULT = 0,
BT_SOC_SMD = BT_SOC_DEFAULT,
BT_SOC_AR3K,
BT_SOC_ROME,
BT_SOC_CHEROKEE,
BT_SOC_NAPIER,
/* Add chipset type here */
BT_SOC_RESERVED
} bt_soc_type;
static void vendor_fwcfg_cb(bt_vendor_op_result_t result) {
UNUSED(result);
}
static void vendor_scocfg_cb(bt_vendor_op_result_t result) {
UNUSED(result);
}
static void vendor_lpm_vnd_cb(bt_vendor_op_result_t result) {
UNUSED(result);
}
static void vendor_audio_state_cb(bt_vendor_op_result_t result) {
UNUSED(result);
}
static void* vendor_alloc(int size) {
UNUSED(size);
return NULL;
}
static void vendor_dealloc(void *p_buf) {
UNUSED(p_buf);
}
static uint8_t vendor_xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback) {
UNUSED(opcode);
UNUSED(p_buf);
UNUSED(p_cback);
return 0;
}
static void vendor_epilog_cb(bt_vendor_op_result_t result) {
UNUSED(result);
}
static void vendor_a2dp_offload_cb(bt_vendor_op_result_t result, bt_vendor_opcode_t op, unsigned char handle) {
UNUSED(result);
UNUSED(op);
UNUSED(handle);
}
bt_vendor_interface_t *vendor_interface=NULL;
static const bt_vendor_callbacks_t vendor_callbacks = {
sizeof(bt_vendor_callbacks_t),
vendor_fwcfg_cb,
vendor_scocfg_cb,
vendor_lpm_vnd_cb,
vendor_audio_state_cb,
vendor_alloc,
vendor_dealloc,
vendor_xmit_cb,
vendor_epilog_cb,
vendor_a2dp_offload_cb
};
/*BT HS UART TTY DEVICE */
#define BT_HS_UART_DEVICE "/dev/ttyHS0"
/*BT RIVA-SMD CHANNELS */
#define APPS_RIVA_BT_ACL_CH "/dev/smd2"
#define APPS_RIVA_BT_CMD_CH "/dev/smd3"
/* Variables to identify the platform */
char transport_type[PROPERTY_VALUE_MAX];
static boolean is_transportSMD;
extern int soc_type;
/* Reader thread handle */
pthread_t hci_cmd_thread_hdl;
/* Pipe file descriptors for cancelling read operation */
int pipefd[2];
/* Transport file descriptor */
int fd_transport;
/* Starting baud rate to init the tty device */
int starting_baud = 115200;
/* Verbose output monitoring variable */
int verbose = 1;
/* Defintion to convert integer baud rate to the
* Data type understood by tty device
*/
#define BAUDCLAUS(i) case (i): return ( B##i )
/*===========================================================================
FUNCTION convert_baud
DESCRIPTION
Routine to convert the integer baud rate to type speed_t
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
Converted Baud rate, else default 0
SIDE EFFECTS
None
===========================================================================*/
static speed_t convert_baud(uint32 baud_rate)
{
switch (baud_rate)
{
BAUDCLAUS(50);
BAUDCLAUS(75);
BAUDCLAUS(110);
BAUDCLAUS(134);
BAUDCLAUS(150);
BAUDCLAUS(200);
BAUDCLAUS(300);
BAUDCLAUS(600);
BAUDCLAUS(1200);
BAUDCLAUS(1800);
BAUDCLAUS(2400);
BAUDCLAUS(4800);
BAUDCLAUS(9600);
BAUDCLAUS(19200);
BAUDCLAUS(38400);
BAUDCLAUS(57600);
BAUDCLAUS(115200);
BAUDCLAUS(230400);
BAUDCLAUS(460800);
BAUDCLAUS(500000);
BAUDCLAUS(576000);
BAUDCLAUS(921600);
BAUDCLAUS(1000000);
BAUDCLAUS(1152000);
BAUDCLAUS(1500000);
BAUDCLAUS(2000000);
BAUDCLAUS(2500000);
BAUDCLAUS(3000000);
BAUDCLAUS(3500000);
BAUDCLAUS(4000000);
default: return 0;
}
}
/*===========================================================================
FUNCTION ftm_readerthread
DESCRIPTION
Thread Routine to perfom asynchrounous handling of events coming on Uart/Smd
descriptor. It invokes a callback to the FTM BT layer to intiate a request
to read event bytes.
DEPENDENCIES
The LifeTime of ReaderThraad is dependent on the status returned by the
call to ftm_bt_hci_qcomm_handle_event
RETURN VALUE
RETURN NIL
SIDE EFFECTS
None
===========================================================================*/
void *ftm_readerthread(void *ptr)
{
UNUSED(ptr);
boolean status = FALSE;
int retval;
fd_set readfds;
int buf;
do
{
FD_ZERO(&readfds);
FD_SET(fd_transport, &readfds);
FD_SET(pipefd[0],&readfds);
retval = select((pipefd[0] > fd_transport? pipefd[0] : fd_transport) + 1,
&readfds, NULL, NULL, NULL);
if(retval == -1)
{
printf("select failed\n");
break;
}
if(FD_ISSET(pipefd[0],&readfds))
{
#ifdef FTM_DEBUG
printf("Pipe descriptor set\n");
#endif
read(pipefd[0],&buf,1);
if(buf == 1)
break;
}
if(FD_ISSET(fd_transport,&readfds))
{
#ifdef FTM_DEBUG
printf("Read descriptor set\n");
#endif
status = ftm_bt_hci_qcomm_handle_event();
if(TRUE != status)
break;
}
}
while(1);
#ifdef FTM_DEBUG
printf("\nReader thread exited\n");
#endif
return 0;
}
/*===========================================================================
FUNCTION ftm_bt_pfal_set_transport
DESCRIPTION
sets the type of transport based on the msm type
DEPENDENCIES
NIL
RETURN VALUE
returns the type of transport
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_hci_pfal_set_transport(void)
{
if (soc_type == BT_SOC_ROME || soc_type == BT_SOC_CHEROKEE || soc_type == BT_SOC_NAPIER) {
strlcpy(transport_type, "uart", sizeof(transport_type));
printf("[%s]: Transport type is: %s\n", __FUNCTION__, transport_type);
is_transportSMD = 0;
transport_dev = BT_HS_UART_DEVICE;
} else {
strlcpy(transport_type, "smd", sizeof(transport_type));
printf("[%s]: Transport type is: %s\n", __FUNCTION__, transport_type);
is_transportSMD = 1;
transport_dev = APPS_RIVA_BT_CMD_CH;
}
return is_transportSMD;
}
int init_transport_bdroid(boolean on) {
void *so_handle;
unsigned char bdaddr[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
request_status st;
int fd[CH_MAX], powerstate, ret;
if (on) {
so_handle = dlopen(VENDOR_LIB, RTLD_NOW);
if (!so_handle)
{
ALOGE("Failed to load vendor component %s", dlerror());
return -1;
}
vendor_interface = (bt_vendor_interface_t *) dlsym(so_handle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
if (!vendor_interface)
{
ALOGE("Failed to accesst bt vendor interface");
return -1;
}
vendor_interface->init(&vendor_callbacks, bdaddr);
ALOGI("Turn On BT power");
powerstate = BT_VND_PWR_ON;
ret = vendor_interface->op(BT_VND_OP_POWER_CTRL, &powerstate);
if (ret < 0)
{
ALOGE("Failed to turn on power from bt vendor interface");
return -1;
}
ret = vendor_interface->op(BT_VND_OP_USERIAL_OPEN, fd);
ALOGE("ret value: %d", ret);
/* This is just a hack; needs to be removed */
ret = 1;
ALOGE("setting ret value to 1 manually");
if (ret != 1)
{
ALOGE("Failed to get fd from bt vendor interface");
return -1;
} else {
ALOGE("FD: %x", fd[0]);
return fd[0];
}
} else {
if (vendor_interface) {
ALOGE("Close and cleanup the interfaces");
int ret = vendor_interface->op(BT_VND_OP_USERIAL_CLOSE, NULL);
ALOGE("ret value: %d", ret);
vendor_interface->cleanup();
return 0;
} else {
ALOGE("Not able to find vendor interface handle");
return -1;
}
}
}
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_deinit_transport
DESCRIPTION
Platform specific routine to de-intialise the UART/SMD resource.
PLATFORM SPECIFIC DESCRIPTION
Closes the TTY/SMD file descriptor and sets the descriptor value to -1
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
The Close of the descriptor will trigger a failure in the Reader Thread
and hence cause a Deinit of the ReaderThread
===========================================================================*/
request_status ftm_bt_hci_pfal_deinit_transport()
{
int buf = 1;
write(pipefd[1],&buf,1);
if(!isLatestTarget())
{
close(fd_transport);
fd_transport = -1;
}
else
{
//Use libbt-vendor for chip de-initialization
init_transport_bdroid(FALSE);
}
return STATUS_SUCCESS;
}
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_init_uart
DESCRIPTION
Platform specific routine to intialise the UART/SMD resources.
PLATFORM SPECIFIC DESCRIPTION
Opens the TTY/SMD device file descriptor, congiures the TTY/SMD device for CTS/RTS
flow control,sets 115200 for TTY as the default baudrate and starts the Reader
Thread
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_pfal_init_transport(int mode)
{
struct termios term;
if(isLatestTarget())
{
printf("%s: ",__func__ );
//Use hidl_client_initialize for chip initialization
if (hidl_client_initialize(mode, &fd_transport) == false) {
printf("%s: HIDL client initialization failed \n", __func__);
return STATUS_NO_RESOURCES;
}
printf("%s: , fd:%d: ", __func__, fd_transport);
}
else
{
fd_transport = open(transport_dev, (O_RDWR | O_NOCTTY));
if (-1 == fd_transport)
{
return STATUS_NO_RESOURCES;
}
if (tcflush(fd_transport, TCIOFLUSH) < 0)
{
close(fd_transport);
return STATUS_FAIL;
}
if (tcgetattr(fd_transport, &term) < 0)
{
close(fd_transport);
return STATUS_FAIL;
}
cfmakeraw(&term);
/* Set RTS/CTS HW Flow Control*/
term.c_cflag |= (CRTSCTS | CLOCAL);
if (tcsetattr(fd_transport, TCSANOW, &term) < 0)
{
close(fd_transport);
return STATUS_FAIL;
}
/* Configure the /dev/ttyHS0 device to operate at 115200.
no need for msm8960 as it is using smd as transport
*/
if (!is_transportSMD)
if (ftm_bt_hci_pfal_changebaudrate(starting_baud) == FALSE)
{
close(fd_transport);
return STATUS_FAIL;
}
}
if (pipe(pipefd) == -1)
{
printf("pipe create error");
return STATUS_FAIL;
}
if(mode != MODE_FM) {
/* Creating read thread which listens for various masks & pkt requests */
pthread_create( &hci_cmd_thread_hdl, NULL, ftm_readerthread, NULL);
}
return STATUS_SUCCESS;
}
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_nwrite
DESCRIPTION
Platform specific routine to write the data in the argument to the UART/SMD
port intialised.
PLATFORM SPECIFIC DESCRIPTION
Write the buffer to the tty device and ensure it is completely written
In case of short write report error to the BT FTM layer.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_pfal_nwrite(uint8 *buf, int size)
{
int tx_bytes = 0, nwrite;
int i = 0, buf_size = size;
uint8 loop_back_cmd[6] = {0x1, 0x02, 0x18, 0x01, 0x01};
/*hci packet is not required to carry the Packet indicator (for UART interfaces) for msm8960
as it is using share memory interface */
int hci_uart_pkt_ind = 0;
if(fd_transport < 0)
return STATUS_NO_RESOURCES;
if ( buf[PIN_CON_CMD_OGF_BIT] == PIN_CON_CMD_OGF &&
buf[PIN_CON_CMD_OCF_BIT] == PIN_CON_CMD_OCF &&
(size > PIN_CON_CMD_SUBOP_BIT) &&
buf[PIN_CON_CMD_SUBOP_BIT] == PIN_CON_CMD_SUB_OP &&
(size > PIN_CON_CMD_INTER_BIT) &&
buf[PIN_CON_CMD_INTER_BIT] == PIN_CON_INTERFACE_ID)
{
is_slim_bus_test = 1;
printf("\nPinConnectivityTest: Sending loopback command to SOC before initiasing slimbus\n");
strlcpy(buf, loop_back_cmd, size);
}
do
{
nwrite = write(fd_transport, (buf + hci_uart_pkt_ind + tx_bytes), (size - hci_uart_pkt_ind - tx_bytes));
if (nwrite < 0)
{
printf("Error while writing ->\n");
return STATUS_SHORT_WRITE;
}
if (nwrite == 0)
{
printf("ftm_bt_hci_pfal_nwrite: zero-length write\n");
return STATUS_SHORT_WRITE;
}
tx_bytes += nwrite;
size -= nwrite;
} while (tx_bytes < size - hci_uart_pkt_ind);
if (verbose == 1)
{
printf("[%s] %s: CMD:", get_current_time(), __FUNCTION__);
for (i = 0; i < buf_size; i++)
{
printf(" %02X", buf[i]);
}
printf("\n");
}
return STATUS_SUCCESS;
}
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_nread
DESCRIPTION
Platform specific routine to read data from the UART/SMD port intialised into
the buffer passed in argument.
PLATFORM SPECIFIC DESCRIPTION
Read from the tty device into the buffer and ensure the read request is
completed, in case of short read report error to the BT FTM layer.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_hci_pfal_nread(uint8 *buf, int size)
{
int rx_bytes = 0, nread;
if(fd_transport < 0)
return STATUS_NO_RESOURCES;
do
{
nread = read(fd_transport, (buf + rx_bytes), (size - rx_bytes));
if (nread < 0)
{
printf("Error while reading ->\n");
return STATUS_SHORT_READ;
}
rx_bytes += nread;
} while (rx_bytes < size);
return STATUS_SUCCESS;
}
/*===========================================================================
FUNCTION ftm_bt_hci_pfal_changebaudrate
DESCRIPTION
Platform specific routine to intiate a change in baud rate
PLATFORM SPECIFIC DESCRIPTION
Convert the Baud rate passed to the speed_t type and program the
Baud rate change after ensuring all transmit is drained at the
current baud rate
DEPENDENCIES
It is expected that the Upper layer will intiate a Flow Off to the
BT SoC, to signal the stop of receive if the baud rate change is
initiated while SoC init is in progress
RETURN VALUE
RETURN VALUE
TRUE if SUCCESS, else FALSE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_hci_pfal_changebaudrate (uint32 new_baud)
{
struct termios term;
boolean status = TRUE;
speed_t baud_code;
speed_t actual_baud_code;
if (tcgetattr(fd_transport, &term) < 0)
{
printf("Can't get port settings\n");
status = FALSE;
}
else
{
baud_code = convert_baud(new_baud);
(void) cfsetospeed(&term, baud_code);
if (tcsetattr(fd_transport, TCSADRAIN, &term) < 0) /* don't change speed until last write done */
{
printf("bt_hci_qcomm_pfal_changebaudrate: tcsetattr:\n");
status = FALSE;
}
/* make sure that we reportedly got the speed we tried to set */
if (1 < verbose)
{
if (tcgetattr(fd_transport, &term) < 0)
{
printf("bt_hci_qcomm_pfal_changebaudrate: tcgetattr:\n");
status = FALSE;
}
if (baud_code != (actual_baud_code = cfgetospeed(&term)))
{
printf("bt_hci_qcomm_pfal_changebaudrate: new baud %u FAILED, got 0x%x\n", new_baud, actual_baud_code);
}
else
{
printf("bt_hci_qcomm_pfal_changebaudrate: new baud %u SUCCESS, got 0x%x\n", new_baud, actual_baud_code);
}
}
}
return status;
}

View File

@@ -0,0 +1,278 @@
/*==========================================================================
BT persist NV items access source file
Description
Read/Write APIs for retreiving NV items from persist memory.
# Copyright (c) 2011-12 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
05/25/12 jav Added FTM log that will display bt address while testing.
09/27/11 rrr Moved persist related API for c/c++ compatibility, needed
for random BD address to be persistent across target
reboots.
==========================================================================*/
#include "ftm_bt_persist.h"
#include <semaphore.h>
#ifdef BT_NV_SUPPORT
#include "bt_nv.h"
/* Semaphore shared by the Event handler and main thread */
extern sem_t semaphore_cmd_complete;
/*Flag to manage the verbose output */
extern int verbose;
/*===========================================================================
FUNCTION ftm_bt_send_nv_read_cmd
DESCRIPTION
Helper Routine to process the nv read command
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
FALSE = failure, else TRUE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_send_nv_read_cmd
(
uint8 * cmd_buf, /* pointer to Cmd */
uint16 cmd_len /* Cmd length */
)
{
nv_persist_item_type my_nv_item;
nv_persist_stat_enum_type cmd_result;
boolean result = TRUE;
if(cmd_len >1)
{
switch(*(cmd_buf+1))
{
case NV_BD_ADDR_I:
cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_READ_F, NV_BD_ADDR_I, &my_nv_item);
if (NV_SUCCESS != cmd_result)
{
if (verbose > 0)
{
fprintf (stderr, "nv_cmd_remote failed to get BD_ADDR from NV, code %d\n", cmd_result);
}
/* Send fail response */
result = FALSE;
}
else
{
/* copy bytes */
event_buf_nv_read_response[0] = FTM_BT_CMD_NV_READ;
event_buf_nv_read_response[1] = NV_BD_ADDR_I;
event_buf_nv_read_response[7] = my_nv_item.bd_addr[5];
event_buf_nv_read_response[6] = my_nv_item.bd_addr[4];
event_buf_nv_read_response[5] = my_nv_item.bd_addr[3];
event_buf_nv_read_response[4] = my_nv_item.bd_addr[2];
event_buf_nv_read_response[3] = my_nv_item.bd_addr[1];
event_buf_nv_read_response[2] = my_nv_item.bd_addr[0];
/* send BD_ADDR in the response */
fprintf (stderr, "nv_cmd_remote got NV_BD_ADDR_I from NV: %x:%x:%x:%x:%x:%x\n",
(unsigned int) my_nv_item.bd_addr[5], (unsigned int) my_nv_item.bd_addr[4],
(unsigned int) my_nv_item.bd_addr[3], (unsigned int) my_nv_item.bd_addr[2],
(unsigned int) my_nv_item.bd_addr[1], (unsigned int) my_nv_item.bd_addr[0]);
ftm_log_send_msg((const uint8 *)event_buf_nv_read_response,nv_read_response_size);
result = TRUE;
}
break;
case NV_BT_SOC_REFCLOCK_TYPE_I:
cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_READ_F, NV_BT_SOC_REFCLOCK_TYPE_I, &my_nv_item);
if (NV_SUCCESS != cmd_result)
{
if (verbose > 0)
{
fprintf (stderr, "nv_cmd_remote failed to get BD_ADDR from NV, code %d\n", cmd_result);
}
/* Send fail response */
result = FALSE;
}
else
{
event_buf_nv_read_response[0] = FTM_BT_CMD_NV_READ;
event_buf_nv_read_response[1] = NV_BT_SOC_REFCLOCK_TYPE_I;
event_buf_nv_read_response[2] = (uint8) my_nv_item.bt_soc_refclock_type ;
event_buf_nv_read_response[7] = 0x0;
event_buf_nv_read_response[6] = 0x0;
event_buf_nv_read_response[5] = 0x0;
event_buf_nv_read_response[4] = 0x0;
event_buf_nv_read_response[3] = 0x0;
fprintf (stderr, "nv_cmd_remote got NV_BT_SOC_REFCLOCK_TYPE_I from NV: 0x%x\n",
(unsigned int) my_nv_item.bt_soc_refclock_type);
ftm_log_send_msg((const uint8 *)event_buf_nv_read_response,nv_read_response_size);
result = TRUE;
}
break;
case NV_BT_SOC_CLK_SHARING_TYPE_I:
cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_READ_F, NV_BT_SOC_CLK_SHARING_TYPE_I, &my_nv_item);
if (NV_SUCCESS != cmd_result)
{
if (verbose > 0)
{
fprintf (stderr, "nv_cmd_remote failed to get CLK_SHARING from NV, code %d\n", cmd_result);
}
/* Send fail response */
result = FALSE;
}
else
{
event_buf_nv_read_response[0] = FTM_BT_CMD_NV_READ;
event_buf_nv_read_response[1] = NV_BT_SOC_CLK_SHARING_TYPE_I;
event_buf_nv_read_response[2] = (uint8) my_nv_item.bt_soc_clk_sharing_type ;
event_buf_nv_read_response[7] = 0x0;
event_buf_nv_read_response[6] = 0x0;
event_buf_nv_read_response[5] = 0x0;
event_buf_nv_read_response[4] = 0x0;
event_buf_nv_read_response[3] = 0x0;
fprintf (stderr, "nv_cmd_remote got NV_BT_SOC_CLK_SHARING_TYPE_I from NV: 0x%x\n",
(unsigned int) my_nv_item.bt_soc_refclock_type);
ftm_log_send_msg((const uint8 *)event_buf_nv_read_response,nv_read_response_size);
result = TRUE;
}
break;
}
if(result == FALSE)
ftm_log_send_msg(event_buf_nv_read_response_fail,nv_read_response_size_fail);
sem_post(&semaphore_cmd_complete);
return result;
}
return TRUE;
}
/*===========================================================================
FUNCTION ftm_bt_send_nv_write_cmd
DESCRIPTION
Helper Routine to process the nv write command
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
FALSE = failure, else TRUE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_send_nv_write_cmd
(
uint8 * cmd_buf, /* pointer to Cmd */
uint16 cmd_len /* Cmd length */
)
{
nv_persist_item_type my_nv_item;
nv_persist_stat_enum_type cmd_result;
boolean result = TRUE;
if(cmd_len >1)
{
switch(*(cmd_buf+1))
{
case NV_BD_ADDR_I:
memcpy(&my_nv_item.bd_addr, (cmd_buf+2), NV_BD_ADDR_SIZE);
cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_WRITE_F, NV_BD_ADDR_I, &my_nv_item);
if (NV_SUCCESS != cmd_result)
{
if (verbose > 0)
{
fprintf (stderr, "nv_cmd_remote failed to get BD_ADDR from NV, code %d\n", cmd_result);
}
/* Send fail response */
result = FALSE;
}
else
{
result = TRUE;
}
break;
case NV_BT_SOC_REFCLOCK_TYPE_I:
switch (*(cmd_buf+2))
{
case NV_PS_BT_SOC_REFCLOCK_32MHZ:
case NV_PS_BT_SOC_REFCLOCK_19P2MHZ:
my_nv_item.bt_soc_refclock_type = (nv_ps_bt_soc_refclock_enum_type)(*(cmd_buf+2)) ;
break;
default:
fprintf (stderr, "Invalid Ref Clock option\n");
result = FALSE;
}
if (result != FALSE)
{
cmd_result= (nv_persist_stat_enum_type)bt_nv_cmd(NV_WRITE_F, NV_BT_SOC_REFCLOCK_TYPE_I, &my_nv_item);
if (NV_SUCCESS != cmd_result)
{
fprintf (stderr, "nv_cmd_remote failed to write SOC_REFCLOCK_TYPE to NV, code %d\n", cmd_result);
result = FALSE;
}
else
{
result = TRUE;
}
break;
}
case NV_BT_SOC_CLK_SHARING_TYPE_I:
switch (*(cmd_buf+2))
{
case NV_PS_BT_SOC_CLOCK_SHARING_ENABLED:
case NV_PS_BT_SOC_CLOCK_SHARING_DISABLED:
my_nv_item.bt_soc_clk_sharing_type = (nv_ps_bt_soc_clock_sharing_enum_type)(*(cmd_buf+2)) ;
break;
default:
fprintf (stderr, "Invalid Clock Sharing option\n");
result = FALSE;
}
if (result != FALSE)
{
cmd_result= (nv_persist_stat_enum_type)bt_nv_cmd(NV_WRITE_F, NV_BT_SOC_CLK_SHARING_TYPE_I, &my_nv_item);
if (NV_SUCCESS != cmd_result)
{
fprintf (stderr, "nv_cmd_remote failed to write SOC_CLK_SHARING_TYPE to NV, code %d\n", cmd_result);
result = FALSE;
}
else
{
result = TRUE;
}
break;
}
}
if(result == FALSE)
{
ftm_log_send_msg(event_buf_bt_nv_write_fail,nv_write_response_size);
sem_post(&semaphore_cmd_complete);
}
else
{
ftm_log_send_msg((const uint8 *)event_buf_bt_nv_write_pass,nv_write_response_size);
sem_post(&semaphore_cmd_complete);
}
return result;
}
return TRUE;
}
#endif /* End of BT_NV_SUPPORT */

View File

@@ -0,0 +1,113 @@
#ifndef _FTM_BT_PERSIST_H_
#define _FTM_BT_PERSIST_H_
/*==========================================================================
BT persist NV items access source file
Description
Read/Write APIs for retreiving NV items from persist memory.
# Copyright (c) 2011 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
09/27/11 rrr Moved persist related API for c/c++ compatibility, needed
for random BD address to be persistent across target
reboots.
==========================================================================*/
#ifdef __cplusplus
extern "C"
{
#endif
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include "ftm_bt_common.h"
#include <string.h>
#ifdef BT_NV_SUPPORT
#define FTM_BT_CMD_NV_READ 0xB
#define FTM_BT_CMD_NV_WRITE 0xC
const uint8 nv_read_response_size = 8;
const uint8 nv_read_response_size_fail = 2;
const uint8 nv_write_response_size = 2;
/* NV Write Responses */
const uint8 event_buf_bt_nv_write_pass[2] = { FTM_BT_CMD_NV_WRITE, FTM_BT_DRV_NO_ERR};
const uint8 event_buf_bt_nv_write_fail[2] = { FTM_BT_CMD_NV_WRITE, FTM_BT_NV_WRITE_FAIL};
/* NV Read Responses */
const uint8 event_buf_nv_read_response_fail[8] =
{
FTM_BT_CMD_NV_READ, FTM_BT_NV_READ_FAIL, 0x0, 0x0,0x0,0x0,0x0,0x0
};
uint8 event_buf_nv_read_response[8];
#endif /* BT_NV_SUPPORT */
/*===========================================================================
FUNCTION ftm_bt_send_nv_read_cmd
DESCRIPTION
Helper Routine to process the nv read command
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
FALSE = failure, else TRUE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_send_nv_read_cmd
(
uint8 * cmd_buf, /* pointer to Cmd */
uint16 cmd_len /* Cmd length */
);
/*===========================================================================
FUNCTION ftm_bt_send_nv_write_cmd
DESCRIPTION
Helper Routine to process the nv write command
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
FALSE = failure, else TRUE
SIDE EFFECTS
None
===========================================================================*/
boolean ftm_bt_send_nv_write_cmd
(
uint8 * cmd_buf, /* pointer to Cmd */
uint16 cmd_len /* Cmd length */
);
#ifdef __cplusplus
}
#endif
#endif /* _FTM_BT_PERSIST_H_ */

View File

@@ -0,0 +1,76 @@
/*==========================================================================
FTM BT POWER HAL Header File
Description
Wrapper API definitions of the ftm bt power hal component.
# Copyright (c) 2010 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
06/18/10 rakeshk Created a header file to include the wrapper API
definitions for BT power control
07/07/10 rakeshk Modified the function name of BT power set HAL routine
===========================================================================*/
#include "ftm_bt_common.h"
#include "ftm_bt_power_pfal.h"
#ifndef __FTM_BT_POWER_HAL_H__
#define __FTM_BT_POWER_HAL_H__
/*===========================================================================
FUNCTION ftm_bt_power_hal_set
DESCRIPTION
Platform independent wrapper API which sets a BT power from PFAL
layer and returns the status of the PFAL operation.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_power_hal_set(bt_power_state state)
{
return ftm_bt_power_pfal_set(state);
}
/*===========================================================================
FtUNCTION ftm_bt_power_hal_check
DESCRIPTION
Platform independent wrapper API which gets the BT power from PFAL
layer and returns the current state of the BT HW.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
Current BT power state
SIDE EFFECTS
None
===========================================================================*/
bt_power_state ftm_bt_power_hal_check()
{
return ftm_bt_power_pfal_check();
}
#endif //__FTM_BT_POWER_HAL_H__

View File

@@ -0,0 +1,71 @@
/*==========================================================================
FTM BT POWER PFAL Header File
Description
PFAL API declarations of the ftm bt power pfal component.
# Copyright (c) 2010 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
06/18/10 rakeshk Created a header file to hold the PFAL declarations for
BT power programming
07/07/10 rakeshk Modified the function name of BT power set PFAL routine
===========================================================================*/
#include "ftm_bt_common.h"
#ifndef __FTM_BT_POWER_PFAL_H__
#define __FTM_BT_POWER_PFAL_H__
/*===========================================================================
FUNCTION ftm_bt_power_pfal_set
DESCRIPTION
Platform dependent interface API which sets the BT power
and returns the status of the toggle operation.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_power_pfal_set(bt_power_state state);
/*===========================================================================
FUNCTION ftm_bt_power_pfal_check
DESCRIPTION
Platform dependent interface API which intiates a BT power read/check
and returns the current state of the BT HW.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
Current BT power state
SIDE EFFECTS
None
===========================================================================*/
bt_power_state ftm_bt_power_pfal_check();
#endif

View File

@@ -0,0 +1,197 @@
/*==========================================================================
FTM Platform specfic BT power File
Description
Platform specific routines to toggle/read the BT power state
# Copyright (c) 2010-2011 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
06/18/10 rakeshk Created a source file to implement platform specific
routines for BT power.
07/07/10 rakeshk Added routine to find the sysfs entry for bluetooth in
runtime
07/07/10 rakeshk Added call to init the rfkill state path in case of first
read
===========================================================================*/
#include <errno.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include "ftm_bt_power_pfal.h"
#include <string.h>
/* Bluetooth Rfkill Entry for Android */
static char *rfkill_state_path = NULL;
/*===========================================================================
FUNCTION init_rfkill_path
DESCRIPTION
Opens the sysfs entry for different types of rfkill and finds the one
which matches Bluetooth by iterating through the rfkill entries
and checking for bluetooth
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
TRUE if SUCCESS, else FALSE
SIDE EFFECTS
None
===========================================================================*/
boolean init_rfkill_path()
{
int fd;
int readsize;
int rfkillid;
char rfkill_path[64];
char buf[16];
for (rfkillid = 0; ; rfkillid++)
{
/* Open the different rfkill type entries and check if type macthes bluetooth */
snprintf(rfkill_path, sizeof(rfkill_path), "/sys/class/rfkill/rfkill%d/type", rfkillid);
fd = open(rfkill_path, O_RDONLY);
if (fd < 0)
{
printf("open(%s) failed: \n", rfkill_path);
return FALSE;
}
readsize = read(fd, &buf, sizeof(buf));
close(fd);
if (memcmp(buf, "bluetooth", 9) == 0)
{
break;
}
}
asprintf(&rfkill_state_path, "/sys/class/rfkill/rfkill%d/state", rfkillid);
return TRUE;
}
/*===========================================================================
FUNCTION ftm_bt_power_pfal_set
DESCRIPTION
Platform dependent interface API which sets the BT power state
and returns the status of the toggle operation.
PLATFORM SPECIFIC DESCRIPTION
Opens the rfkill entry for Bleutooth and initiates a write of the value
passed as argument.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
STATUS_SUCCESS if SUCCESS, else other reasons
SIDE EFFECTS
None
===========================================================================*/
request_status ftm_bt_power_pfal_set(bt_power_state state)
{
int sz;
int fd = -1;
request_status ret = STATUS_FAIL;
const char buffer = state;
if(rfkill_state_path == NULL)
{
if(init_rfkill_path() != TRUE)
goto out;
}
fd = open(rfkill_state_path, O_WRONLY);
if (fd < 0)
{
ret = STATUS_NO_RESOURCES;
goto out;
}
sz = write(fd, &buffer, 1);
if (sz < 0)
{
goto out;
}
ret = STATUS_SUCCESS;
out:
if (fd >= 0)
close(fd);
return ret;
}
/*===========================================================================
FUNCTION ftm_bt_power_pfal_check
DESCRIPTION
Platform dependent interface API which intiates a BT power read/check
and returns the current state of the BT HW.
PLATFORM SPECIFIC DESCRIPTION
Opens the rfkill entry for Bleutooth and initiates a read on the rfkill
descriptor.
DEPENDENCIES
NIL
RETURN VALUE
RETURN VALUE
Current BT power state
SIDE EFFECTS
None
===========================================================================*/
bt_power_state ftm_bt_power_pfal_check()
{
int sz;
bt_power_state state= BT_OFF;
int fd = -1;
char buffer = '0';
if(rfkill_state_path == NULL)
{
if(init_rfkill_path() != TRUE)
goto out;
}
fd = open(rfkill_state_path, O_RDONLY);
if (fd < 0)
{
goto out;
}
sz = read(fd, &buffer, 1);
if (sz < 0)
{
goto out;
}
out:
if (fd >= 0)
close(fd);
state = (bt_power_state)buffer;
return state;
}

View File

@@ -0,0 +1,141 @@
/*==========================================================================
FTM BT HCI PFAL Header File
Description
Queue insert/delete routines and data structures
# Copyright (c) 2010-2011, 2014 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
06/18/10 rakeshk Created
11/09/10 rakeshk Added two APIs to perform read/write of BT Top level
I2C registers
===========================================================================*/
#if defined(CONFIG_FTM_BT) || defined(CONFIG_FTM_FM)
#include <ftm_bt_common.h>
#include "ftm_bt.h"
#include <semaphore.h>
#include <pthread.h>
/* Semaphore shared by the Event handler and main thread */
extern sem_t semaphore_cmd_complete;
/* Structure used by the FTM BT/FM component to
* queue the FTM packet contents
*/
pthread_mutex_t fm_event_lock;
pthread_cond_t fm_event_cond;
extern int fm_passthrough;
typedef struct cmdQ
{
int command_id;/*Command id */
void *data; /* Command data */
boolean bt_command; /* whether BT or FM command */
int cmd_len; /* Command length */
struct cmdQ *next; /* pointer to next CmdQ item */
}cmdQ;
/* Callback declaration for BT FTM packet processing */
void *bt_ftm_diag_dispatch(void *req_pkt, uint16 pkt_len);
/*===========================================================================
FUNCTION qinsert_cmd
DESCRIPTION
Command Queue insert routine. Add the FTM BT packet to the Queue
DEPENDENCIES
NIL
RETURN VALUE
RETURNS FALSE without adding queue entry in failure
to allocate a new Queue item
else returns TRUE
SIDE EFFECTS
increments the number of commands queued
===========================================================================*/
boolean qinsert_cmd(ftm_bt_pkt_type *ftm_bt_pkt);
/*===========================================================================
FUNCTION dequeue_send
DESCRIPTION
Command Queue delete and calls HCI send routine. Dequeues the HCI data from
the queue and sends it to HCI HAL layer.
DEPENDENCIES
NIL
RETURN VALUE
RETURN NIL
SIDE EFFECTS
decrements the number of command queued
===========================================================================*/
void dequeue_send();
/*===========================================================================
FUNCTION i2c_write
DESCRIPTION
Helper function to construct the I@C request to be sent to the FM I2C
driver
DEPENDENCIES
NIL
RETURN VALUE
-1 in failure,positive or zero in success
SIDE EFFECTS
None
===========================================================================*/
int i2c_write
(
int fd,
unsigned char offset,
const unsigned char* buf,
unsigned char len,
unsigned int slave_addr
);
/*===========================================================================
FUNCTION i2c_read
DESCRIPTION
Helper function to construct the I2C request to read data from the FM I2C
driver
DEPENDENCIES
NIL
RETURN VALUE
-1 in failure,positive or zero in success
SIDE EFFECTS
None
===========================================================================*/
int i2c_read
(
int fd,
unsigned char offset,
const unsigned char* buf,
unsigned char len,
unsigned int slave_addr
);
#endif

43
feeds/ipq95xx/ftm/src/ftm_dbg.h Executable file
View File

@@ -0,0 +1,43 @@
/*==========================================================================
FTM WLAN Source File
# Copyright (c) 2013-2014 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
#ifndef _FTM_DBG_H_
#define _FTM_DBG_H_
#include <stdint.h>
#define FTM_DBG_ERROR 0x00000001
#define FTM_DBG_INFO 0x00000002
#define FTM_DBG_TRACE 0x00000004
#define FTM_DBG_DEFAULT (FTM_DBG_ERROR)
extern unsigned int g_dbg_level;
struct ftm_config
{
int total_num_slots;
uint32_t slot_id[4];
uint32_t slot_size[4];
};
extern struct ftm_config ftm_cfg;
#ifdef DEBUG
void current_time();
#define DPRINTF(_level, _x...)\
do {\
if (g_dbg_level & (_level))\
{\
fprintf(stderr, _x);\
}\
} while (0);
#else
#define DPRINTF(_level, x...) do { } while (0);
#endif
#endif /* _FTM_DBG_H_ */

3804
feeds/ipq95xx/ftm/src/ftm_fm.c Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,993 @@
/*==========================================================================
FTM FM Common Header File
Description
Global Data declarations of the ftm fm component.
# Copyright (c) 2010-2012, 2014 by Qualcomm Technologies, Inc. All Rights Reserved.
# Qualcomm Technologies Proprietary and Confidential.
===========================================================================*/
/*===========================================================================
Edit History
when who what, where, why
-------- --- ----------------------------------------------------------
08/03/2011 uppalas Adding support for new ftm commands
06/18/10 rakeshk Created a header file to hold the definitons for ftm fm
task
07/06/10 rakeshk Clean roomed the data structures and defined data
structures to be passed to the PFAL layers
01/11/11 rakeshk Added support for new FTM APIS
02/09/11 rakeshk Added support for BLER FTM APIs
04/03/11 ananthk Added support for FM FTM Transmit APIs
===========================================================================*/
#ifdef CONFIG_FTM_FM
#include "diagpkt.h"
#include "log.h"
#include <sys/types.h>
#define FTM_FM_LOG_PKT_ID 65
#define FTM_FM_CMD_CODE 28
#define LOG_FTM_FM_C ((uint16) 0x14CC)
#define FEATURE_FTM_FM_DEBUG
#define DEFAULT_DATA_SIZE 249
/* FM6500 A0 chip version.
**/
#define FM6500_A0_VERSION (0x01010013)
/**
* * FM6500 2.0 chip version.
**/
#define FMQSOCCOM_FM6500_20_VERSION (0x01010010)
/**
* * FM6500 2.1 chip version.
**/
#define FMQSOCCOM_FM6500_21_VERSION (0x02010204)
/**
* WCN 2243 1.0's FM chip version.
*/
#define FMQSOCCOM_FM6500_WCN2243_10_VERSION (0x0302010A)
/**
* WCN 2243 2.0's FM chip version.
*/
#define FMQSOCCOM_FM6500_WCN2243_20_VERSION (0x04020205)
extern int chipVersion;
/* RDS Group processing parameters */
#define FM_RX_RDS_GRP_RT_EBL 1
#define FM_RX_RDS_GRP_PS_EBL 2
#define FM_RX_RDS_GRP_AF_EBL 4
#ifdef FM_SOC_TYPE_CHEROKEE
#define FM_RX_RDS_GRP_PS_SIMPLE_EBL 8
#define FM_RX_RDS_GRP_ECC_EBL 32
#define FM_RX_RDS_GRP_PTYN_EBL 64
#define FM_RX_RDS_GRP_RT_PLUS_EBL 128
#else
#define FM_RX_RDS_GRP_PS_SIMPLE_EBL 16
#endif
/* lower and upper band limits of regions */
#define REGION_US_EU_BAND_LOW 87500
#define REGION_US_EU_BAND_HIGH 107900
#define REGION_JAPAN_STANDARD_BAND_LOW 76000
#define REGION_JAPAN_STANDARD_BAND_HIGH 90000
#define REGION_JAPAN_WIDE_BAND_LOW 90000
#define REGION_JAPAN_WIDE_BAND_HIGH 108000
#define V4L2_CID_PRIVATE_BASE 0x08000000
#define MAX_RDS_PS_LENGTH 108
#define MAX_RDS_RT_LENGTH 64
#define V4L2_CID_PRIVATE_IRIS_RDS_GRP_COUNTERS_EXT 0x08000042
typedef enum {
V4L2_CID_PRIVATE_IRIS_HLSI = (V4L2_CID_PRIVATE_BASE + 0x1d),
V4L2_CID_PRIVATE_IRIS_SOFT_MUTE,
V4L2_CID_PRIVATE_IRIS_RIVA_ACCS_ADDR,
V4L2_CID_PRIVATE_IRIS_RIVA_ACCS_LEN,
V4L2_CID_PRIVATE_IRIS_RIVA_PEEK,
V4L2_CID_PRIVATE_IRIS_RIVA_POKE,
V4L2_CID_PRIVATE_IRIS_SSBI_ACCS_ADDR,
V4L2_CID_PRIVATE_IRIS_SSBI_PEEK,
V4L2_CID_PRIVATE_IRIS_SSBI_POKE,
V4L2_CID_PRIVATE_IRIS_TX_TONE,
V4L2_CID_PRIVATE_IRIS_RDS_GRP_COUNTERS,
V4L2_CID_PRIVATE_IRIS_SET_NOTCH_FILTER,
V4L2_CID_PRIVATE_IRIS_AGC_CTRL = 0x08000043,
V4L2_CID_PRIVATE_IRIS_AGC_STATE,
V4L2_CID_PRIVATE_IRIS_READ_DEFAULT = 0x00980928,//using private CIDs under userclass
V4L2_CID_PRIVATE_IRIS_WRITE_DEFAULT,
}v4l2_cid_private_iris_t_copy;
typedef enum
{
/* Total no. of PS names that can be transmitted : 12
Width of each transmitted PS name is : 8
Total no. of PS characters that can be transmitted : (12*8 = 96)
*/
MAX_TX_PS_LEN = 96,
MAX_TX_PS_RPT_CNT = 15,
}FmTxPSFeatures;
/* FTM FM command IDs */
typedef enum
{
#ifdef FEATURE_FTM_FM_DEBUG
FTM_FM_RX_SET_POWER_MODE = 13,
FTM_FM_RX_SET_SIGNAL_THRESHOLD = 14,
FTM_FM_RX_GET_RSSI_LIMIT = 16,
FTM_FM_RX_GET_PS_INFO = 17,
FTM_FM_RX_GET_RT_INFO = 18,
FTM_FM_RX_GET_AF_INFO = 19,
FTM_FM_RX_SEARCH_STATIONS = 20,
FTM_FM_RX_SEARCH_RDS_STATIONS = 21,
FTM_FM_RX_SEARCH_STATIONS_LIST = 22,
FTM_FM_RX_CANCEL_SEARCH = 23,
FTM_FM_RX_RDS_GROUP_PROC_OPTIONS = 25,
FTM_FM_RX_RDS_PI_MATCH_OPTIONS = 26,
FTM_FM_TX_GET_PS_FEATURES = 36,
FTM_FM_TX_TX_PS_INFO = 38,
FTM_FM_TX_STOP_PS_INFO_TX = 39,
FTM_FM_TX_TX_RT_INFO = 40,
FTM_FM_TX_STOP_RT_INFO_TX = 41,
FTM_FM_RX_GET_SIGNAL_THRESHOLD = 46,
FTM_FM_FMWAN_REG_RD = 51,
FTM_FM_RX_GET_DEFAULTS = 62,
FTM_FM_RX_SET_DEFAULTS = 63,
FTM_FM_RX_GET_SINR_SAMPLES = 64,
FTM_FM_RX_SET_SINR_SAMPLES = 65,
FTM_FM_RX_GET_SINR_THRESHOLD = 66,
FTM_FM_RX_SET_SINR_THRESHOLD = 67,
FTM_FM_RX_GET_ONCHANNEL_TH = 68,
FTM_FM_RX_SET_ONCHANNEL_TH = 69,
FTM_FM_RX_GET_OFFCHANNEL_TH = 70,
FTM_FM_RX_SET_OFFCHANNEL_TH = 71,
FTM_FM_TX_PWR_LVL_CFG = 72,
#endif /* FEATURE_FTM_FM_DEBUG */
FTM_FM_RX_ENABLE_RECEIVER = 7,
FTM_FM_RX_DISABLE_RECEIVER = 8,
FTM_FM_RX_CONFIGURE_RECEIVER = 9,
FTM_FM_RX_SET_MUTE_MODE = 10,
FTM_FM_RX_SET_STEREO_MODE = 11,
FTM_FM_RX_SET_STATION = 12,
FTM_FM_RX_GET_STATION_PARAMETERS = 15,
FTM_FM_RX_RDS_GROUP_OPTIONS = 24,
FTM_FM_TX_ENABLE_TRANSMITTER = 33,
FTM_FM_TX_DISABLE_TRANSMITTER = 34,
FTM_FM_TX_CONFIGURE_TRANSMITTER = 35,
FTM_FM_TX_SET_STATION = 37,
FTM_FM_TX_TX_RDS_GROUPS = 42,
FTM_FM_TX_TX_CONT_RDS_GROUPS = 43,
FTM_FM_TX_TX_RDS_CTRL = 44,
FTM_FM_TX_GET_RDS_GROUP_BUF_SIZE = 45,
FTM_FM_BUS_WRITE = 47,
FTM_FM_BUS_READ = 48,
FTM_FM_NOTIFY_WAN = 49,
FTM_FM_NOTIFY_FM = 50,
FTM_FM_ROUTE_AUDIO = 52,
FTM_FM_RX_SET_AF_THRESHOLD = 53,
FTM_FM_RX_SET_RSSI_CHECK_TIMER = 54,
FTM_FM_RX_SET_RDS_PI_TIMER = 55,
FTM_FM_RX_GET_AF_THRESHOLD = 56,
FTM_FM_RX_GET_RSSI_CHECK_TIMER = 57,
FTM_FM_RX_GET_RDS_PI_TIMER = 58,
FTM_FM_RX_GET_RDS_ERR_COUNT = 59,
FTM_FM_RX_RESET_RDS_ERR_COUNT = 60,
FTM_FM_TX_SEARCH_STATIONS = 61,
FTM_FM_SET_HLSI = 100,
FTM_FM_SET_SOFT_MUTE = 101,
FTM_FM_SET_ANTENNA = 102,
FTM_FM_SET_NOTCH_FILTER = 103,
FTM_FM_READ_RDS_GRP_CNTRS = 104,
FTM_FM_SET_TONE_GENERATION = 105,
FTM_FM_PEEK_SSBI = 106,
FTM_FM_POKE_SSBI = 107,
FTM_FM_PEEK_RIVA_WORD = 108,
FTM_FM_POKE_RIVA_WORD = 109,
FTM_FM_ENABLE_AUDIO = 111,
FTM_FM_DISABLE_AUDIO = 112,
FTM_FM_VOLUME_SETTING = 113,
FTM_FM_READ_RDS_GRP_CNTRS_EXT = 114,
FTM_FM_SET_GET_RESET_AGC = 115,
FTM_FM_MAX
} ftm_fm_sub_cmd_type;
#define XFR_CTRL_OFFSET 0x1F
/* Wait time for ensuring XFR is generated */
#define WAIT_ON_ISR_DELAY 15000 //15 ms
#define AFTH_OFFSET 0x2E
#define CHCOND_OFFSET 0x22
#define RDSTIMEOUT_OFFSET 0x25
#define FM_SLAVE_ADDR 0x2A
#define RDSERR_OFFSET 0x24
#define RDSRESET_OFFSET 0x20
#define BLOCKS_PER_GROUP 0x04
#define FTM_FM_RDS_COUNT 0x11
#define MAX_RIVA_DATA_LEN 245
#define MAX_RIVA_PEEK_RSP_SIZE 251
#define SSBI_PEEK_DATA_SIZE 1
#define IRIS_BUF_PEEK 6
#define IRIS_BUF_SSBI_PEEK IRIS_BUF_PEEK+1
#define IRIS_BUF_RDS_CNTRS IRIS_BUF_SSBI_PEEK+1
#define IRIS_BUF_RD_DEFAULT IRIS_BUF_RDS_CNTRS+1
#ifdef FM_SOC_TYPE_CHEROKEE
#define RDS_GRP_CNTRS_SIZE 48
#else
#define RDS_GRP_CNTRS_SIZE 36
#endif
/* Generic result, used for any command that only returns an error code */
typedef enum
{
FTM_FM_SUCCESS,
FTM_FAIL,
FTM_FILE_DOES_NOT_EXIST,
FTM_MMC_ERROR,
FTM_FM_UNRECOGNIZED_CMD,
FTM_NO_RESOURCES,
FTM_FM_PENDING,
FTM_INVALID_PARAM,
FTM_FM_DISALLOWED,
FTM_TEST_NOT_IMPLEMENTED,
FTM_CUST_HW_ID_UNKNOWN,
FTM_FM_BUS_WRITE_ERROR,
FTM_FM_BUS_READ_ERROR,
FTM_FM_CLIENT_MAX,
} ftm_fm_api_result_type;
/* FM power state enum */
typedef enum
{
FM_POWER_OFF,
FM_POWER_TRANSITION,
FM_RX_ON,
FM_TX_ON
}fm_power_state;
/* FM command status enum */
typedef enum
{
FM_CMD_SUCCESS,
FM_CMD_PENDING,
FM_CMD_NO_RESOURCES,
FM_CMD_INVALID_PARAM,
FM_CMD_DISALLOWED,
FM_CMD_UNRECOGNIZED_CMD,
FM_CMD_FAILURE
}fm_cmd_status_type;
/**
* FM event result.
*/
typedef enum
{
FM_EV_SUCCESS = 0,
/**< Event indicates success. */
FM_EV_FAILURE = 1,
/**< Event is a response to a command that failed */
FM_EV_CMD_DISALLOWED = 2,
/**< Event is a response to a command that was disallowed. */
FM_EV_CMD_INVALID_PARAM = 3
/**< Event is a response to a command that contained an invalid parameter. */
} FmEvResultType;
/**
* FM Receiver event names.
*/
typedef enum
{
/* -----------------------------------------------
1 -> FM Receiver initialization events
----------------------------------------------- */
FM_RX_EV_ENABLE_RECEIVER = 0,
FM_RX_EV_DISABLE_RECEIVER,
FM_RX_EV_CFG_RECEIVER,
/* -----------------------------------------------
2 -> FM receiver control events
----------------------------------------------- */
FM_RX_EV_MUTE_MODE_SET,
FM_RX_EV_STEREO_MODE_SET,
FM_RX_EV_RADIO_STATION_SET,
FM_RX_EV_PWR_MODE_SET,
FM_RX_EV_SET_SIGNAL_THRESHOLD,
/* -----------------------------------------------
3 -> FM receiver status events
----------------------------------------------- */
FM_RX_EV_RADIO_TUNE_STATUS,
FM_RX_EV_STATION_PARAMETERS,
FM_RX_EV_RDS_LOCK_STATUS,
FM_RX_EV_STEREO_STATUS,
FM_RX_EV_SERVICE_AVAILABLE,
FM_RX_EV_GET_SIGNAL_THRESHOLD,
/* -----------------------------------------------
4 -> FM search status events
----------------------------------------------- */
FM_RX_EV_SEARCH_IN_PROGRESS,
FM_RX_EV_SEARCH_RDS_IN_PROGRESS,
FM_RX_EV_SEARCH_LIST_IN_PROGRESS,
FM_RX_EV_SEARCH_COMPLETE,
FM_RX_EV_SEARCH_RDS_COMPLETE,
FM_RX_EV_SEARCH_LIST_COMPLETE,
FM_RX_EV_SEARCH_CANCELLED,
/* -----------------------------------------------
5 -> FM RDS status events
----------------------------------------------- */
FM_RX_EV_RDS_GROUP_DATA,
FM_RX_EV_RDS_PS_INFO,
FM_RX_EV_RDS_RT_INFO,
FM_RX_EV_RDS_AF_INFO,
FM_RX_EV_RDS_PI_MATCH_AVAILABLE,
/* -----------------------------------------------
6 -> FM RDS control events
----------------------------------------------- */
FM_RX_EV_RDS_GROUP_OPTIONS_SET,
FM_RX_EV_RDS_PROC_REG_DONE,
FM_RX_EV_RDS_PI_MATCH_REG_DONE,
FM_RX_EV_MAX_EVENT
} FmRxEventType;
typedef enum radio_band_type
{
FM_US_EU = 0x0,
FM_JAPAN_STANDARD = 0x1,
FM_JAPAN_WIDE = 0x2,
FM_USER_DEFINED = 0x4
}radio_band_type;
typedef enum emphasis_type
{
FM_RX_EMP75 = 0x0,
FM_RX_EMP50 = 0x1
}emphasis_type;
typedef enum channel_space_type
{
FM_RX_SPACE_200KHZ = 0x0,
FM_RX_SPACE_100KHZ = 0x1,
FM_RX_SPACE_50KHZ = 0x2
}channel_space_type;
typedef enum rds_system_type
{
FM_RX_RDBS_SYSTEM = 0x0,
FM_RX_RDS_SYSTEM = 0x1,
FM_RX_NO_RDS_SYSTEM = 0x2
}rds_sytem_type;
typedef struct band_limit_freq
{
uint32 lower_limit;
uint32 upper_limit;
}band_limit_freq;
typedef enum rds_sync_type
{
FM_RDS_NOT_SYNCED = 0x0,
FM_RDS_SYNCED = 0x1
}rds_sync_type;
typedef enum stereo_type
{
FM_RX_MONO = 0x0,
FM_RX_STEREO = 0x1
}stereo_type;
typedef enum fm_service_available
{
FM_SERVICE_NOT_AVAILABLE = 0x0,
FM_SERVICE_AVAILABLE = 0x1
}fm_service_available;
typedef enum mute_type
{
FM_RX_NO_MUTE = 0x00,
FM_RX_MUTE_RIGHT = 0x01,
FM_RX_MUTE_LEFT = 0x02,
FM_RX_MUTE_BOTH = 0x03
}mute_type;
typedef enum antenna_type
{
WIRED_HS,
PWB_ANT
}antenna_type;
typedef enum audio_output
{
HEADSET,
SPEAKER,
} audio_output;
/**
* RDS/RBDS Program Type type.
*/
typedef uint8 fm_prgm_type;
/**
* RDS/RBDS Program Identification type.
*/
typedef uint16 fm_prgmid_type;
/**
* RDS/RBDS Program Services type.
*/
typedef char fm_prm_services;
/**
* RDS/RBDS Radio Text type.
*/
/*
* FM RX RIVA peek request
*/
typedef struct fm_riva_peek_word
{
uint8 subOpcode;
uint32 startaddress;
uint8 payload_length;/*In Bytes*/
uint8 data[MAX_RIVA_DATA_LEN];
}__attribute__((packed))fm_riva_peek_word;
/*
* FM RX RIVA poke request
*/
typedef struct fm_riva_poke_word
{
uint8 subOpcode;
uint32 startaddress;
uint8 payload_length;/*In Bytes*/
uint8 data[MAX_RIVA_DATA_LEN];
}__attribute__((packed))fm_riva_poke_word ;
/*
* FM RX SSBI peek/poke request
*/
typedef struct fm_ssbi_poke_reg
{
uint16 startaddress;
uint8 data;
}__attribute__((packed))fm_ssbi_poke_reg;
/*
* fm Set Get Reset AGC request
*/
typedef struct fm_set_get_reset_agc_req
{
uint8 ucCtrl;
uint8 ucGainState;
}__attribute__((packed))fm_set_get_reset_agc_req;
typedef struct fm_set_get_reset_agc_params
{
uint8 ucCurrentGainState;
uint8 ucGainStateChange1;
uint8 ucGainStateChange2;
uint8 ucGainStateChange3;
}__attribute__((packed))fm_set_get_reset_agc_params;
typedef PACKED struct
{
uint8 status ;
uint8 data_length ;
uint8 data[DEFAULT_DATA_SIZE];
}__attribute__((packed)) readDefaults_data;
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
uint8 status ;
uint8 data_length ;
uint8 data[DEFAULT_DATA_SIZE];
}__attribute__((packed)) default_read_rsp;
/*RDS Group counters*/
typedef struct fm_rds_grp_cntrsparams
{
uint32 totalRdsSBlockErrors;
uint32 totalRdsGroups;
uint32 totalRdsGroup0;
uint32 totalRdsGroup2;
uint32 totalRdsBlockB;
uint32 totalRdsProcessedGroup0;
uint32 totalRdsProcessedGroup2;
uint32 totalRdsGroupFiltered;
uint32 totalRdsChangeFiltered;
}__attribute__((packed)) fm_rds_grp_cntrsparams;
/*RDS Group counters extended */
typedef struct fm_rds_grpcntrs_extendedparams
{
uint32 totalRdsSyncLoss;
uint32 totalRdsNotSync;
uint32 totalRdsSyncInt;
}__attribute__((packed)) fm_rds_grpcntrs_extendedparams;
typedef char fm_radiotext_info;
/**
* FM Global Paramaters struct.
*/
typedef struct
{
uint32 current_station_freq;/*a frequency in kHz the band range*/
uint8 service_available;
uint8 rssi; /* rssi range from 0-100*/
uint8 stype;
uint8 rds_sync_status;
uint8 mute_status;
uint8 ssbi_peek_data;
fm_prgmid_type pgm_id; /* Program Id */
fm_prgm_type pgm_type; /* Program type */
fm_prm_services pgm_services[MAX_RDS_PS_LENGTH];
fm_radiotext_info radio_text[MAX_RDS_RT_LENGTH];/* RT maximum is 64 bytes */
fm_riva_poke_word riva_data_access_params;
fm_set_get_reset_agc_params set_get_reset_agc_params;
fm_rds_grp_cntrsparams rds_group_counters;
fm_rds_grpcntrs_extendedparams rds_group_counters_extended;
readDefaults_data default_read_data;
uint8 fm_ps_length;
uint8 fm_rt_length;
uint8 sinr_samples;
char sinr_threshold;
uint8 On_channel_threshold;
uint8 Off_channel_threshold;
}fm_station_params_available;
/**
* FM Config Request structure.
*/
typedef struct fm_config_data
{
uint8 band;
uint8 emphasis;
uint8 spacing;
uint8 rds_system;
band_limit_freq bandlimits;
uint8 is_fm_tx_on;
}fm_config_data;
/*
* FM RDS Options Config Request
*/
typedef struct fm_rds_options
{
uint32 rds_group_mask;
uint32 rds_group_buffer_size;
uint8 rds_change_filter;
}fm_rds_options;
/*
* FM RX Search stations request
*/
typedef struct fm_search_stations
{
uint8 search_mode;
uint8 dwell_period;
uint8 search_dir;
}fm_search_stations;
/*
* FM RX Search DDS stations request
*/
typedef struct fm_search_rds_stations
{
uint8 search_mode;
uint8 dwell_period;
uint8 search_dir;
uint8 program_type;
uint16 program_id;
}fm_search_rds_stations;
/*
* FM RX Search station lists request
*/
typedef struct fm_search_list_stations
{
uint8 search_mode;
uint8 search_dir;
uint32 srch_list_max;
/**< Maximum number of stations that can be returned from a search. */
uint8 program_type;
}fm_search_list_stations;
/*
* FM RX I2C request
*/
typedef struct fm_i2c_params
{
uint8 slaveaddress;
uint8 offset;
uint8 payload_length;
uint8 data[64];
}fm_i2c_params;
/* Structure containing the RDS PS Info to be transmitted */
typedef struct _tsFtmFmRdsTxPsType
{
uint32 ulPSStrLen;
/**< The size of the cTxPSStrPtr buffer.
*/
uint32 ucTxPSRptCnt;
/**< The number of times each 8 character string is repeated before the next
string is transmitted.
*/
uint16 tusTxPi;
/**< RDS/RBDS Program Identification to use for Program Service transmissions.
*/
uint8 tucTxPSPty;
/**< The RDS/RBDS Program Type to transmit.
*/
const char cTxPSStrPtr[108];
/**< A pointer to a buffer containing the Program Service string to transmit
(must be null terminated).
*/
} tsFtmFmRdsTxPsType;
typedef struct _tsFtmFmRdsTxRtType
{
uint32 ulRTStrLen;
/**< The size of the cTxRTStrPtr buffer.
*/
uint16 tusTxPi;
/**< RDS/RBDS Program Identification to use for RadioText transmissions.
*/
uint8 tucTxRTPty;
/**< The RDS/RBDS Program Type to transmit.
*/
const char cTxRTStrPtr[65];
/**< A pointer to a buffer containing the RadioText string to transmit
(must be null terminated).
*/
} tsFtmFmRdsTxRtType;
typedef struct _ftm_def_data_rd_req
{
uint8 mode;
uint8 length;
uint8 param_len;
uint8 param;
} __attribute__((packed))ftm_fm_def_data_rd_req;
typedef struct _ftm_def_data_wr_req
{
uint8 mode;
uint8 length;
uint8 data[DEFAULT_DATA_SIZE];
} __attribute__((packed))ftm_fm_def_data_wr_req;
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
uint8 length; /*RDS PS string length*/
uint8 string[MAX_RDS_PS_LENGTH]; /* RDS string */
}__attribute__((packed)) fmrdsps_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
uint8 length; /*RDS PS string length*/
uint8 string[MAX_RDS_RT_LENGTH]; /* RDS string */
}__attribute__((packed)) fmrdsrt_response;
/**
* FM All Request Union type.
*/
typedef union fm_cfg_request
{
fm_config_data cfg_param;
uint8 mute_param;
uint8 stereo_param;
uint32 freq;
fm_rds_options rds_options;
uint8 power_mode;
uint8 signal_threshold;
fm_search_stations search_stations_options;
fm_search_rds_stations search_rds_stations_options;
fm_search_list_stations search_list_stations_options;
fm_i2c_params i2c_params;
uint32 rds_group_options;
uint16 rx_af_threshold;
uint8 rx_rssi_checktimer;
uint rx_rds_pi_timer;
tsFtmFmRdsTxPsType tuFmPSParams;
tsFtmFmRdsTxRtType tuFmRTParams;
uint8 soft_mute_param;
uint8 antenna_type;
uint8 tx_tone_param;
uint8 rds_grp_counters;
uint8 rds_grp_counters_ext;
uint8 hlsi;
uint8 sinr_samples;
char sinr_threshold;
uint8 On_channel_threshold;
uint8 Off_channel_threshold;
uint8 notch;
fm_riva_peek_word riva_peek_params;
fm_riva_poke_word riva_data_access_params;
fm_ssbi_poke_reg ssbi_access_params;
fm_set_get_reset_agc_req set_get_agc_req_parameters;
ftm_fm_def_data_rd_req rd_default;
ftm_fm_def_data_wr_req wr_default;
uint8 tx_pwr_cfg;
uint8 audio_output;
uint8 audio_vlm;
}fm_cfg_request;
/* FTM FM request type */
typedef PACKED struct
{
diagpkt_cmd_code_type cmd_code;
diagpkt_subsys_id_type subsys_id;
diagpkt_subsys_cmd_code_type subsys_cmd_code;
uint16 cmd_id; /* command id (required) */
uint16 cmd_data_len;
uint16 cmd_rsp_pkt_size;
byte data[1];
}__attribute__((packed))ftm_fm_pkt_type;
/* Set MuteMode Response */
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
uint8 mutemode;
}__attribute__((packed)) mutemode_response;
/* Set StereoMode Response */
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
uint8 stereomode;
}__attribute__((packed)) stereomode_response;
/* I2C Response */
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
uint32 length; /*length of data read */
uint8 data[64]; /* I2C read dat buffer */
}__attribute__((packed)) fmbusread_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
uint8 sub_opcode;
uint32 start_address;
uint8 length; /*length of data read */
uint8 data[MAX_RIVA_DATA_LEN]; /* read dat buffer */
}__attribute__((packed)) rivaData_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
uint8 data;
}__attribute__((packed)) ssbiPeek_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
uint8 uccurrentgainstate;
uint8 ucgainstatechange1;
uint8 ucgainstatechange2;
uint8 ucgainstatechange3;
}__attribute__((packed)) set_get_reset_agc_response;
/*Read RDS Group counters responce*/
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
fm_rds_grp_cntrsparams read_rds_cntrs;
}__attribute__((packed)) ReadRDSCntrs_responce;
/*Read RDS Group counters response*/
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
fm_rds_grpcntrs_extendedparams read_rds_cntrs_ext;
}__attribute__((packed)) ReadRDSCntrs_ext_response;
/* Generic Response */
typedef PACKED struct
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
}__attribute__((packed)) generic_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ;
char result ;
uint16 afthreshold;
} fmrxsetafthreshold_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ;
char result ;
uint8 sinr_sample;
} getsinrsamples_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ;
char result ;
char sinr_threshold;
} getsinrthreshold_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ;
char result ;
uint8 sinr_on_th;
} getonchannelthreshold_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ;
char result ;
uint8 sinr_off_th;
} getoffchannelthreshold_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ;
char result ;
uint8 rssitimer;
} fmrxsetrssichecktimer_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ;
char result ;
uint8 rdspitimer;
} fmrxsetrdspitimer_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ;
char result ;
uint8 threshold;
} threshold_response;
typedef PACKED struct
{
diagpkt_subsys_header_type header ;
char result ;
uint32 rdserrcount;
uint32 numofblocks;
} rds_err_count_response;
/* Custom response for Get station parameters request */
struct fm_rx_get_station_parameters_response_t
{
diagpkt_subsys_header_type header ; /*Diag header*/
char result ;/* result */
uint32 stationFreq;
/* The currently tuned frequency in kHz (Example: 96500 -> 96.5Mhz)*/
uint8 servAvble;
/* The current service available indicator for the current station */
uint8 rssi;
/* The current signal strength level (0-100 range). */
uint8 stereoProgram;
/* The current mono/stereo indicator for this station */
uint8 rdsSyncStatus;
/* The current RDS/RBDS synchronization status */
uint8 muteMode;
/* The current FM mute mode */
}__attribute__((packed));
/* FTM Log Packet - Used to send back the event of a HCI Command */
typedef PACKED struct
{
log_hdr_type hdr;
byte EvName;
/* Event ID indicates which event is being returned. */
byte EvResult;
byte data[1]; /* Variable length payload,
look at FTM log id for contents */
} ftm_fm_log_pkt_type;
#define FTM_FM_LOG_HEADER_SIZE (sizeof (ftm_fm_log_pkt_type) - 1)
typedef struct fm_rx_get_station_parameters_response_t fm_rx_get_station_parameters_response;
/*===========================================================================
FUNCTION ftm_fm_dispatch
DESCRIPTION
Dispatch routine for the various FM Rx/Tx commands. Copies the data into
a global union data structure before calling the processing routine
DEPENDENCIES
NIL
RETURN VALUE
A Packed structre pointer including the response to the FTM FM packet
SIDE EFFECTS
None
===========================================================================*/
void * ftm_fm_dispatch(ftm_fm_pkt_type *ftm_fm_pkt, uint16 length );
/*===========================================================================
FUNCTION ftm_fm_enable_audio
DESCRIPTION
This function is used to take the audio output mode from QRCT.
DEPENDENCIES
none
===========================================================================*/
PACKED void* ftm_fm_enable_audio( void );
PACKED void* ftm_fm_disable_audio( void );
PACKED void* ftm_fm_setting_volume(void);
#endif /* CONFIG_FTM_FM */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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