mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 09:32:34 +00:00
Compare commits
95 Commits
staging-WI
...
release/v4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a15703c413 | ||
|
|
d218ba64e3 | ||
|
|
dab5ebd31f | ||
|
|
f4d2d3d12a | ||
|
|
adac3818a4 | ||
|
|
a516b035ab | ||
|
|
29b088ef21 | ||
|
|
10b875d42c | ||
|
|
1f0a24a941 | ||
|
|
ea3afcda56 | ||
|
|
b5987cc2a7 | ||
|
|
fc700364d1 | ||
|
|
f2fec9dd87 | ||
|
|
2de57bf167 | ||
|
|
7d31bebdb0 | ||
|
|
fcb5a972cf | ||
|
|
082d04025c | ||
|
|
9ef7d2c227 | ||
|
|
e0d61cb0fb | ||
|
|
ed2795b30b | ||
|
|
4c9b22f999 | ||
|
|
4b31e481ec | ||
|
|
ba10a88ab3 | ||
|
|
b85bc5db9c | ||
|
|
e998711444 | ||
|
|
2d6bea18df | ||
|
|
1bf9e40987 | ||
|
|
a20b96eb31 | ||
|
|
c83ac67492 | ||
|
|
2b0c600fb3 | ||
|
|
c5793bae3a | ||
|
|
6afbb92dec | ||
|
|
89cb9d63bd | ||
|
|
16963c997f | ||
|
|
f7a9ad770d | ||
|
|
dcdccc7ba0 | ||
|
|
b67f97f213 | ||
|
|
e9dcf3d953 | ||
|
|
cc5edd4446 | ||
|
|
79adece623 | ||
|
|
49b64ec93f | ||
|
|
b1e3686124 | ||
|
|
e5bcda17e7 | ||
|
|
7c04ed76bd | ||
|
|
04a5cc67e0 | ||
|
|
80b2c6d080 | ||
|
|
c683f19b7c | ||
|
|
1b10507cf1 | ||
|
|
50abd015b3 | ||
|
|
5dd212829f | ||
|
|
3abc947f8f | ||
|
|
5f42e9db58 | ||
|
|
b181add059 | ||
|
|
7eae0397f1 | ||
|
|
1033a63140 | ||
|
|
954108d742 | ||
|
|
caee55a61f | ||
|
|
502727ad6d | ||
|
|
1868e369d3 | ||
|
|
5a597c912d | ||
|
|
82ae3766fa | ||
|
|
d250f91bb3 | ||
|
|
76d112144f | ||
|
|
d218c15419 | ||
|
|
2bf2093305 | ||
|
|
c548edfe89 | ||
|
|
82a6e24e91 | ||
|
|
c0e6b523c4 | ||
|
|
195fc01d06 | ||
|
|
19959d016b | ||
|
|
03b34b062e | ||
|
|
076bc0712e | ||
|
|
486cc7983a | ||
|
|
80343e9dad | ||
|
|
dd14c1c6d1 | ||
|
|
71748f4cd4 | ||
|
|
49c51594a3 | ||
|
|
739b6b29b2 | ||
|
|
7e393c4831 | ||
|
|
1149cd41aa | ||
|
|
18bb47be4d | ||
|
|
7847e1778e | ||
|
|
57735bcd18 | ||
|
|
376072ad97 | ||
|
|
afa7e2bbb3 | ||
|
|
52f2e31892 | ||
|
|
b791a723ca | ||
|
|
a9e0e16a80 | ||
|
|
4d55d427d7 | ||
|
|
53ff49eb6f | ||
|
|
1a3c87cf35 | ||
|
|
75df7bb794 | ||
|
|
b61850ff18 | ||
|
|
3738f5b884 | ||
|
|
708895e7ae |
2
.github/workflows/build-dev.yml
vendored
2
.github/workflows/build-dev.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf196', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'cybertan_rap630w-312g', 'cybertan_rap63xc-211g', 'sonicfi_rap630c-311g', 'sonicfi_rap630w-311g', 'sonicfi_rap630w-211g', 'sonicfi_rap7110c-341x', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap105', 'edgecore_eap111', 'edgecore_eap112', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4x_3', 'hfcl_ion4xi_w', 'hfcl_ion4x_w', 'indio_um-305ax', 'senao_iap4300m', 'senao_jeap6500', 'sercomm_ap72tip', 'udaya_a6-id2', 'udaya_a6-od2', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655' ]
|
||||
target: [ 'cig_wf186h', 'cig_wf186w', 'cig_wf188n', 'cig_wf189', 'cig_wf196', 'cig_wf196', 'cybertan_eww631-a1', 'cybertan_eww631-b1', 'sonicfi_rap630w-312g', 'sonicfi_rap63xc-211g', 'sonicfi_rap630c-311g', 'sonicfi_rap630w-311g', 'sonicfi_rap630w-211g', 'sonicfi_rap650c', 'sonicfi_rap7110c-341x', 'sonicfi_rap750w-311a', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'edgecore_eap105', 'edgecore_eap111', 'edgecore_eap112', 'edgecore_oap101', 'edgecore_oap101-6e', 'edgecore_oap101e', 'edgecore_oap101e-6e', 'edgecore_oap103', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'hfcl_ion4x_3', 'hfcl_ion4xi_w', 'hfcl_ion4x_w', 'indio_um-305ax', 'senao_iap4300m', 'senao_iap2300m', 'senao_jeap6500', 'udaya_a6-id2', 'udaya_a6-od2', 'yuncore_ax820', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650', 'yuncore_fap655' ]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
|
||||
@@ -6,7 +6,8 @@ boot() {
|
||||
. /lib/functions/system.sh
|
||||
case $(board_name) in
|
||||
edgecore,eap102|\
|
||||
edgecore,oap102)
|
||||
edgecore,oap102|\
|
||||
edgecore,oap103)
|
||||
echo 54 > /sys/class/gpio/export
|
||||
echo out > /sys/class/gpio/gpio54/direction
|
||||
echo 0 > /sys/class/gpio/gpio54/value
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
Index: hostapd-2023-09-08-e5ccbfc6/src/ap/wpa_auth_ft.c
|
||||
===================================================================
|
||||
--- hostapd-2023-09-08-e5ccbfc6.orig/src/ap/wpa_auth_ft.c
|
||||
+++ hostapd-2023-09-08-e5ccbfc6/src/ap/wpa_auth_ft.c
|
||||
@@ -3293,6 +3297,8 @@ static int wpa_ft_process_auth_req(struc
|
||||
size_t identity_len = 0, radius_cui_len = 0;
|
||||
size_t pmk_r1_len, kdk_len, len;
|
||||
int retval = WLAN_STATUS_UNSPECIFIED_FAILURE;
|
||||
+ struct os_reltime now;
|
||||
+ struct rsn_ftie *ftie;
|
||||
|
||||
*resp_ies = NULL;
|
||||
*resp_ies_len = 0;
|
||||
@@ -3324,6 +3330,9 @@ static int wpa_ft_process_auth_req(struc
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ ftie = (struct rsn_ftie *) parse.ftie;
|
||||
+ os_memcpy(sm->SNonce, ftie->snonce, WPA_NONCE_LEN);
|
||||
+
|
||||
if (parse.r0kh_id == NULL) {
|
||||
wpa_printf(MSG_DEBUG, "FT: Invalid FTIE - no R0KH-ID");
|
||||
retval = WLAN_STATUS_INVALID_FTIE;
|
||||
@@ -3424,10 +3433,18 @@ pmk_r1_derived:
|
||||
os_memcpy(sm->pmk_r1, pmk_r1, pmk_r1_len);
|
||||
sm->pmk_r1_len = pmk_r1_len;
|
||||
|
||||
- if (random_get_bytes(sm->ANonce, WPA_NONCE_LEN)) {
|
||||
- wpa_printf(MSG_DEBUG, "FT: Failed to get random data for "
|
||||
- "ANonce");
|
||||
- goto out;
|
||||
+ if (os_get_reltime(&now) < 0 ||
|
||||
+ os_reltime_expired(&now, &sm->ANonce_time, 1)) {
|
||||
+ if (random_get_bytes(sm->ANonce, WPA_NONCE_LEN)) {
|
||||
+ wpa_printf(MSG_DEBUG, "FT: Failed to get random data for "
|
||||
+ "ANonce");
|
||||
+ return WLAN_STATUS_UNSPECIFIED_FAILURE;
|
||||
+ }
|
||||
+ sm->ANonce_time.sec = now.sec;
|
||||
+ sm->ANonce_time.usec = now.usec;
|
||||
+ wpa_printf(MSG_INFO, "FT: ANonce was randomized");
|
||||
+ } else {
|
||||
+ wpa_printf(MSG_INFO, "FT: ANonce has not expired");
|
||||
}
|
||||
|
||||
/* Now that we know the correct PMK-R1 length and as such, the length
|
||||
@@ -32,7 +32,6 @@ ALLWIFIBOARDS:= \
|
||||
cybertan-eww622-a1 \
|
||||
cybertan-eww631-a1 \
|
||||
cybertan-eww631-b1 \
|
||||
cybertan-rap630w-312g \
|
||||
edgecore-eap101 \
|
||||
gl-ax1800 \
|
||||
gl-axt1800 \
|
||||
@@ -40,6 +39,7 @@ ALLWIFIBOARDS:= \
|
||||
sercomm-wallaby \
|
||||
edgecore-eap102 \
|
||||
edgecore-oap102 \
|
||||
edgecore-oap103 \
|
||||
edgecore-eap104 \
|
||||
liteon-wpx8324 \
|
||||
indio-um-310ax-v1 \
|
||||
@@ -52,6 +52,8 @@ ALLWIFIBOARDS:= \
|
||||
wallys-dr6018-v4 \
|
||||
sonicfi-rap630c-311g \
|
||||
sonicfi-rap630w-311g \
|
||||
sonicfi-rap630w-312g \
|
||||
sonicfi-rap650c \
|
||||
tplink-ex227 \
|
||||
tplink-ex447 \
|
||||
yuncore-ax840 \
|
||||
@@ -394,13 +396,13 @@ $(eval $(call generate-ath11k-wifi-package,cig-wf194c4,Cigtech WF194c4))
|
||||
$(eval $(call generate-ath11k-wifi-package,cybertan-eww622-a1,CyberTan EWW622 A1))
|
||||
$(eval $(call generate-ath11k-wifi-package,cybertan-eww631-a1,CyberTan EWW631 A1))
|
||||
$(eval $(call generate-ath11k-wifi-package,cybertan-eww631-b1,CyberTan EWW631 B1))
|
||||
$(eval $(call generate-ath11k-wifi-package,cybertan-rap630w-312g,CyberTan RAP630W 312G))
|
||||
$(eval $(call generate-ath11k-wifi-package,sercomm-wallaby,Sercomm Kiwi))
|
||||
$(eval $(call generate-ath11k-wifi-package,wallys-dr6018,Wallys DR6018))
|
||||
$(eval $(call generate-ath11k-wifi-package,wallys-dr6018-v4,Wallys DR6018 V4))
|
||||
$(eval $(call generate-ath11k-wifi-package,edgecore-eap101,EdgeCore EAP101))
|
||||
$(eval $(call generate-ath11k-wifi-package,edgecore-eap102,Edgecore EAP102))
|
||||
$(eval $(call generate-ath11k-wifi-package,edgecore-oap102,Edgecore OAP102))
|
||||
$(eval $(call generate-ath11k-wifi-package,edgecore-oap103,Edgecore OAP103))
|
||||
$(eval $(call generate-ath11k-wifi-package,edgecore-eap104,Edgecore EAP104))
|
||||
$(eval $(call generate-ath11k-wifi-package,liteon-wpx8324,Liteon WPX8324))
|
||||
$(eval $(call generate-ath11k-wifi-package,indio-um-310ax-v1,Indio UM-310AX V1))
|
||||
@@ -408,6 +410,8 @@ $(eval $(call generate-ath11k-wifi-package,indio-um-510axp-v1,Indio UM-510AXP V1
|
||||
$(eval $(call generate-ath11k-wifi-package,indio-um-510axm-v1,Indio UM-510AXM V1))
|
||||
$(eval $(call generate-ath11k-wifi-package,sonicfi-rap630c-311g,Sonicfi RAP630C 311G))
|
||||
$(eval $(call generate-ath11k-wifi-package,sonicfi-rap630w-311g,Sonicfi RAP630W 311G))
|
||||
$(eval $(call generate-ath11k-wifi-package,sonicfi-rap630w-312g,Sonicfi RAP630W 312G))
|
||||
$(eval $(call generate-ath11k-wifi-package,sonicfi-rap650c,SonicFi RAP650C))
|
||||
$(eval $(call generate-ath11k-wifi-package,tplink-ex227,TP-Link EX227))
|
||||
$(eval $(call generate-ath11k-wifi-package,tplink-ex447,TP-Link EX447))
|
||||
$(eval $(call generate-ath11k-wifi-package,yuncore-ax840,YunCore AX840))
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
feeds/ipq807x_v5.4/ath11k-wifi/board-edgecore-oap103.bin.IPQ8074
Normal file
BIN
feeds/ipq807x_v5.4/ath11k-wifi/board-edgecore-oap103.bin.IPQ8074
Normal file
Binary file not shown.
BIN
feeds/ipq807x_v5.4/ath11k-wifi/board-sonicfi-rap650c.bin.IPQ8074
Normal file
BIN
feeds/ipq807x_v5.4/ath11k-wifi/board-sonicfi-rap650c.bin.IPQ8074
Normal file
Binary file not shown.
@@ -340,6 +340,7 @@ hostapd_common_add_bss_config() {
|
||||
wpa_group_rekey wpa_pair_rekey wpa_master_rekey
|
||||
config_add_boolean wpa_strict_rekey
|
||||
config_add_boolean wpa_disable_eapol_key_retries
|
||||
config_add_boolean multi_psk
|
||||
|
||||
config_add_boolean tdls_prohibit
|
||||
|
||||
@@ -724,7 +725,7 @@ hostapd_set_bss_options() {
|
||||
airtime_bss_weight airtime_bss_limit airtime_sta_weight \
|
||||
multicast_to_unicast_all proxy_arp per_sta_vif \
|
||||
eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id \
|
||||
vendor_elements fils uci_section dynamic_probe_resp
|
||||
vendor_elements fils uci_section dynamic_probe_resp multi_psk
|
||||
|
||||
set_default fils 0
|
||||
set_default isolate 0
|
||||
@@ -737,6 +738,7 @@ hostapd_set_bss_options() {
|
||||
set_default wmm 1
|
||||
set_default uapsd 1
|
||||
set_default wpa_disable_eapol_key_retries 0
|
||||
set_default multi_psk $multi_psk
|
||||
set_default tdls_prohibit 0
|
||||
set_default eapol_version $((wpa & 1))
|
||||
set_default acct_port 1813
|
||||
|
||||
@@ -26,11 +26,12 @@ function event_cb_6g(req) {
|
||||
return 0;
|
||||
|
||||
let ssid = iface.ssid;
|
||||
if (!ssid || !length(ssids[ssid].keys))
|
||||
|
||||
if (!ssid || !ssids[ssid].mpsk)
|
||||
return 0;
|
||||
|
||||
let ssid_cache = cache[ssid];
|
||||
if (ssid_cache && ssid_cache[addr])
|
||||
if (ssid_cache && addr in ssid_cache)
|
||||
return 0;
|
||||
|
||||
if (req.type == 'probe') {
|
||||
@@ -53,15 +54,15 @@ function event_cb(req) {
|
||||
return 0;
|
||||
|
||||
let ssid = iface.ssid;
|
||||
if (!ssid || !length(ssids[ssid].keys))
|
||||
if (!ssid || !ssids[ssid].mpsk)
|
||||
return 0;
|
||||
|
||||
let ssid_cache = cache[ssid];
|
||||
if (ssid_cache && ssid_cache[addr])
|
||||
if (ssid_cache && addr in ssid_cache)
|
||||
return 0;
|
||||
|
||||
printf(`reply to ${req.type} on ${req.data.ifname} from ${addr} without 6G RNR\n`);
|
||||
return 2;
|
||||
return 2;
|
||||
}
|
||||
|
||||
function create_6g_subscriber() {
|
||||
@@ -143,6 +144,7 @@ function netifd_reload() {
|
||||
|
||||
push(ssid.interfaces, iface.ifname);
|
||||
ssid.bands[band] = iface.ifname;
|
||||
ssid.mpsk = config.multi_psk;
|
||||
for (let sta in iface.stations) {
|
||||
let stacfg = sta.config;
|
||||
|
||||
@@ -174,6 +176,20 @@ function iface_ssid(ifname) {
|
||||
return iface.ssid;
|
||||
}
|
||||
|
||||
function is_ssid_mpsk(ifname) {
|
||||
let ssid = iface_ssid(ifname);
|
||||
if (!ssid)
|
||||
return false;
|
||||
|
||||
if (!ssids[ssid])
|
||||
return false;
|
||||
|
||||
if (!ssids[ssid]?.mpsk)
|
||||
return false;
|
||||
|
||||
return ssids[ssid].mpsk;
|
||||
}
|
||||
|
||||
function sta_cache_entry_get(ssid, addr) {
|
||||
let ssid_cache = cache[ssid] ?? {};
|
||||
|
||||
@@ -292,6 +308,9 @@ function sta_auth_cache(ifname, addr, idx, phrase) {
|
||||
function auth_cb(msg) {
|
||||
let data = msg.data;
|
||||
|
||||
if (!is_ssid_mpsk(data.iface))
|
||||
return;
|
||||
|
||||
printf(`Event ${msg.type}: ${msg.data}\n`);
|
||||
switch (msg.type) {
|
||||
case 'sta_auth':
|
||||
|
||||
@@ -606,12 +606,13 @@
|
||||
for (pw = hapd->conf->sae_passwords; pw; pw = pw->next) {
|
||||
if (!is_broadcast_ether_addr(pw->peer_addr) &&
|
||||
os_memcmp(pw->peer_addr, sta->addr, ETH_ALEN) != 0)
|
||||
@@ -519,6 +525,31 @@ static const char * sae_get_password(str
|
||||
@@ -519,6 +525,33 @@ static const char * sae_get_password(str
|
||||
pt = hapd->conf->ssid.pt;
|
||||
}
|
||||
|
||||
+use_sta_psk:
|
||||
+ if (!password && sta) {
|
||||
+ sta->psk_idx = 0;
|
||||
+ for (psk = sta->psk; psk; psk = psk->next) {
|
||||
+ if (!psk->is_passphrase)
|
||||
+ continue;
|
||||
@@ -620,6 +621,7 @@
|
||||
+ if (!sta->use_sta_psk)
|
||||
+ break;
|
||||
+
|
||||
+ sta->psk_idx = 1;
|
||||
+ if (sta->sae_pt) {
|
||||
+ pt = sta->sae_pt;
|
||||
+ break;
|
||||
@@ -638,7 +640,7 @@
|
||||
if (pw_entry)
|
||||
*pw_entry = pw;
|
||||
if (s_pt)
|
||||
@@ -3698,6 +3729,12 @@ static void handle_auth(struct hostapd_d
|
||||
@@ -3698,6 +3731,12 @@ static void handle_auth(struct hostapd_d
|
||||
goto fail;
|
||||
}
|
||||
|
||||
@@ -686,15 +688,15 @@
|
||||
char *radius_cui; /* Chargeable-User-Identity from RADIUS */
|
||||
--- a/src/ap/wpa_auth_glue.c
|
||||
+++ b/src/ap/wpa_auth_glue.c
|
||||
@@ -337,6 +337,7 @@ static const u8 * hostapd_wpa_auth_get_p
|
||||
struct sta_info *sta = ap_get_sta(hapd, addr);
|
||||
const u8 *psk;
|
||||
@@ -355,6 +355,7 @@ static const u8 * hostapd_wpa_auth_get_p
|
||||
}
|
||||
#endif /* CONFIG_SAE */
|
||||
|
||||
+ sta->psk_idx = 0;
|
||||
if (vlan_id)
|
||||
*vlan_id = 0;
|
||||
if (psk_len)
|
||||
@@ -381,13 +382,18 @@ static const u8 * hostapd_wpa_auth_get_p
|
||||
#ifdef CONFIG_OWE
|
||||
if ((hapd->conf->wpa_key_mgmt & WPA_KEY_MGMT_OWE) &&
|
||||
sta && sta->owe_pmk) {
|
||||
@@ -381,12 +382,17 @@ static const u8 * hostapd_wpa_auth_get_p
|
||||
* returned psk which should not be returned again.
|
||||
* logic list (all hostapd_get_psk; all sta->psk)
|
||||
*/
|
||||
@@ -702,28 +704,26 @@
|
||||
+ psk = NULL;
|
||||
if (sta && sta->psk && !psk) {
|
||||
struct hostapd_sta_wpa_psk_short *pos;
|
||||
+ int psk_idx;
|
||||
+ int psk_idx = 1;
|
||||
|
||||
if (vlan_id)
|
||||
*vlan_id = 0;
|
||||
psk = sta->psk->psk;
|
||||
+ sta->psk_idx = psk_idx = 1;
|
||||
+ if (vlan_id)
|
||||
+ sta->psk_idx = psk_idx;
|
||||
for (pos = sta->psk; pos; pos = pos->next) {
|
||||
+ psk_idx++;
|
||||
if (pos->is_passphrase) {
|
||||
pbkdf2_sha1(pos->passphrase,
|
||||
hapd->conf->ssid.ssid,
|
||||
@@ -396,10 +402,14 @@ static const u8 * hostapd_wpa_auth_get_p
|
||||
pos->is_passphrase = 0;
|
||||
@@ -397,9 +403,13 @@ static const u8 * hostapd_wpa_auth_get_p
|
||||
}
|
||||
if (pos->psk == prev_psk) {
|
||||
+ sta->psk_idx = psk_idx;
|
||||
psk = pos->next ? pos->next->psk : NULL;
|
||||
+ if (vlan_id)
|
||||
+ sta->psk_idx = psk_idx + 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if (!psk)
|
||||
+ if (vlan_id && !psk)
|
||||
+ sta->psk_idx = 0;
|
||||
}
|
||||
return psk;
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
--- a/src/ap/hostapd.c
|
||||
+++ b/src/ap/hostapd.c
|
||||
@@ -1527,19 +1527,15 @@ int hostapd_setup_bss(struct hostapd_dat
|
||||
if (x_snoop_init(hapd)) {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"Generic snooping infrastructure initialization failed");
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (dhcp_snoop_init(hapd)) {
|
||||
+ conf->proxy_arp = 0;
|
||||
+ } else if (dhcp_snoop_init(hapd)) {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"DHCP snooping initialization failed");
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (ndisc_snoop_init(hapd)) {
|
||||
+ conf->proxy_arp = 0;
|
||||
+ } else if (ndisc_snoop_init(hapd)) {
|
||||
wpa_printf(MSG_ERROR,
|
||||
"Neighbor Discovery snooping initialization failed");
|
||||
- return -1;
|
||||
+ conf->proxy_arp = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,411 @@
|
||||
From: Jouni Malinen <quic_jouni@quicinc.com>
|
||||
Date: Tue, 14 Feb 2023 11:29:30 +0200
|
||||
Subject: [PATCH] FT: Store PMK-R0/PMK-R1 after EAPOL-Key msg 2/4 MIC
|
||||
validation
|
||||
|
||||
hostapd was previously storing the derived PMK-R0 and PMK-R1 as soon as
|
||||
these keys were derived. While that is fine for most purposes, it is
|
||||
unnecessary to do that so quickly and if anything were to fail before
|
||||
the supplicant is able to return a valid EAPOL-Key msg 2/4, there would
|
||||
not really be any real use for the derived keys.
|
||||
|
||||
For the special case of FT-PSK and VLAN determination based on the
|
||||
wpa_psk file, the VLAN information is set in the per-STA data structures
|
||||
only after the EAPOL-Key msg 2/4 MIC has been verified. This ended up
|
||||
storing the PMK-R0/PMK-R1 entries without correct VLAN assignment and as
|
||||
such, any use of the FT protocol would not be able to transfer the VLAN
|
||||
information through RRB.
|
||||
|
||||
Split local storing of the FT key hierarchy for the cases using the FT
|
||||
4-way handshake so that PMK-R0 and PMK-R1 are first derived and then
|
||||
stored as a separate step after having verified the MIC in the EAPOL-Key
|
||||
msg 2/4 (i.e., after having confirmed the per-STA passphrase/PSK was
|
||||
selected) and VLAN update. This fixes VLAN information for the
|
||||
wpa_psk_file cases with FT-PSK.
|
||||
|
||||
Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
|
||||
---
|
||||
|
||||
--- a/src/ap/wpa_auth.c
|
||||
+++ b/src/ap/wpa_auth.c
|
||||
@@ -58,7 +58,9 @@ static int wpa_group_config_group_keys(s
|
||||
struct wpa_group *group);
|
||||
static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *snonce,
|
||||
const u8 *pmk, unsigned int pmk_len,
|
||||
- struct wpa_ptk *ptk, int force_sha256);
|
||||
+ struct wpa_ptk *ptk, int force_sha256,
|
||||
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
|
||||
+ size_t *key_len);
|
||||
static void wpa_group_free(struct wpa_authenticator *wpa_auth,
|
||||
struct wpa_group *group);
|
||||
static void wpa_group_get(struct wpa_authenticator *wpa_auth,
|
||||
@@ -940,6 +942,10 @@ static int wpa_try_alt_snonce(struct wpa
|
||||
const u8 *pmk = NULL;
|
||||
size_t pmk_len;
|
||||
int vlan_id = 0;
|
||||
+ u8 pmk_r0[PMK_LEN_MAX], pmk_r0_name[WPA_PMK_NAME_LEN];
|
||||
+ u8 pmk_r1[PMK_LEN_MAX];
|
||||
+ size_t key_len;
|
||||
+ int ret = -1;
|
||||
|
||||
os_memset(&PTK, 0, sizeof(PTK));
|
||||
for (;;) {
|
||||
@@ -961,8 +967,8 @@ static int wpa_try_alt_snonce(struct wpa
|
||||
pmk_len = sm->pmk_len;
|
||||
}
|
||||
|
||||
- if (wpa_derive_ptk(sm, sm->alt_SNonce, pmk, pmk_len, &PTK, 0) <
|
||||
- 0)
|
||||
+ if (wpa_derive_ptk(sm, sm->alt_SNonce, pmk, pmk_len, &PTK, 0,
|
||||
+ pmk_r0, pmk_r1, pmk_r0_name, &key_len) < 0)
|
||||
break;
|
||||
|
||||
if (wpa_verify_key_mic(sm->wpa_key_mgmt, pmk_len, &PTK,
|
||||
@@ -983,7 +989,7 @@ static int wpa_try_alt_snonce(struct wpa
|
||||
if (!ok) {
|
||||
wpa_printf(MSG_DEBUG,
|
||||
"WPA: Earlier SNonce did not result in matching MIC");
|
||||
- return -1;
|
||||
+ goto fail;
|
||||
}
|
||||
|
||||
wpa_printf(MSG_DEBUG,
|
||||
@@ -992,14 +998,26 @@ static int wpa_try_alt_snonce(struct wpa
|
||||
|
||||
if (vlan_id && wpa_key_mgmt_wpa_psk(sm->wpa_key_mgmt) &&
|
||||
wpa_auth_update_vlan(sm->wpa_auth, sm->addr, vlan_id) < 0)
|
||||
- return -1;
|
||||
+ goto fail;
|
||||
+
|
||||
+#ifdef CONFIG_IEEE80211R_AP
|
||||
+ if (wpa_key_mgmt_ft(sm->wpa_key_mgmt) && !sm->ft_completed) {
|
||||
+ wpa_printf(MSG_DEBUG, "FT: Store PMK-R0/PMK-R1");
|
||||
+ wpa_auth_ft_store_keys(sm, pmk_r0, pmk_r1, pmk_r0_name,
|
||||
+ key_len);
|
||||
+ }
|
||||
+#endif /* CONFIG_IEEE80211R_AP */
|
||||
|
||||
os_memcpy(sm->SNonce, sm->alt_SNonce, WPA_NONCE_LEN);
|
||||
os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
|
||||
forced_memzero(&PTK, sizeof(PTK));
|
||||
sm->PTK_valid = true;
|
||||
|
||||
- return 0;
|
||||
+ ret = 0;
|
||||
+fail:
|
||||
+ forced_memzero(pmk_r0, sizeof(pmk_r0));
|
||||
+ forced_memzero(pmk_r1, sizeof(pmk_r1));
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -2283,7 +2301,9 @@ SM_STATE(WPA_PTK, PTKSTART)
|
||||
|
||||
static int wpa_derive_ptk(struct wpa_state_machine *sm, const u8 *snonce,
|
||||
const u8 *pmk, unsigned int pmk_len,
|
||||
- struct wpa_ptk *ptk, int force_sha256)
|
||||
+ struct wpa_ptk *ptk, int force_sha256,
|
||||
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
|
||||
+ size_t *key_len)
|
||||
{
|
||||
const u8 *z = NULL;
|
||||
size_t z_len = 0, kdk_len;
|
||||
@@ -2311,7 +2331,8 @@ static int wpa_derive_ptk(struct wpa_sta
|
||||
sm->pairwise,
|
||||
kdk_len);
|
||||
}
|
||||
- return wpa_auth_derive_ptk_ft(sm, ptk);
|
||||
+ return wpa_auth_derive_ptk_ft(sm, ptk, pmk_r0, pmk_r1,
|
||||
+ pmk_r0_name, key_len);
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211R_AP */
|
||||
|
||||
@@ -2934,6 +2955,9 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
struct wpa_eapol_ie_parse kde;
|
||||
int vlan_id = 0;
|
||||
int owe_ptk_workaround = !!wpa_auth->conf.owe_ptk_workaround;
|
||||
+ u8 pmk_r0[PMK_LEN_MAX], pmk_r0_name[WPA_PMK_NAME_LEN];
|
||||
+ u8 pmk_r1[PMK_LEN_MAX];
|
||||
+ size_t key_len;
|
||||
|
||||
SM_ENTRY_MA(WPA_PTK, PTKCALCNEGOTIATING, wpa_ptk);
|
||||
sm->EAPOLKeyReceived = false;
|
||||
@@ -2972,7 +2996,8 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
}
|
||||
|
||||
if (wpa_derive_ptk(sm, sm->SNonce, pmk, pmk_len, &PTK,
|
||||
- owe_ptk_workaround == 2) < 0)
|
||||
+ owe_ptk_workaround == 2, pmk_r0, pmk_r1,
|
||||
+ pmk_r0_name, &key_len) < 0)
|
||||
break;
|
||||
|
||||
if (mic_len &&
|
||||
@@ -3021,7 +3046,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
sm->last_rx_eapol_key,
|
||||
sm->last_rx_eapol_key_len);
|
||||
sm->waiting_radius_psk = 1;
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
if (!ok) {
|
||||
@@ -3029,7 +3054,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
"invalid MIC in msg 2/4 of 4-Way Handshake");
|
||||
if (psk_found)
|
||||
wpa_auth_psk_failure_report(sm->wpa_auth, sm->addr);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3043,12 +3068,12 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
key_data_length = WPA_GET_BE16(mic + mic_len);
|
||||
if (key_data_length > sm->last_rx_eapol_key_len - sizeof(*hdr) -
|
||||
sizeof(*key) - mic_len - 2)
|
||||
- return;
|
||||
+ goto out;
|
||||
|
||||
if (wpa_parse_kde_ies(key_data, key_data_length, &kde) < 0) {
|
||||
wpa_auth_vlogger(wpa_auth, sm->addr, LOGGER_INFO,
|
||||
"received EAPOL-Key msg 2/4 with invalid Key Data contents");
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
if (kde.rsn_ie) {
|
||||
eapol_key_ie = kde.rsn_ie;
|
||||
@@ -3075,7 +3100,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
/* MLME-DEAUTHENTICATE.request */
|
||||
wpa_sta_disconnect(wpa_auth, sm->addr,
|
||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
if ((!sm->rsnxe && kde.rsnxe) ||
|
||||
(sm->rsnxe && !kde.rsnxe) ||
|
||||
@@ -3091,7 +3116,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
/* MLME-DEAUTHENTICATE.request */
|
||||
wpa_sta_disconnect(wpa_auth, sm->addr,
|
||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
#ifdef CONFIG_OCV
|
||||
if (wpa_auth_uses_ocv(sm)) {
|
||||
@@ -3103,14 +3128,14 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
if (wpa_channel_info(wpa_auth, &ci) != 0) {
|
||||
wpa_auth_logger(wpa_auth, sm->addr, LOGGER_INFO,
|
||||
"Failed to get channel info to validate received OCI in EAPOL-Key 2/4");
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
if (get_sta_tx_parameters(sm,
|
||||
channel_width_to_int(ci.chanwidth),
|
||||
ci.seg1_idx, &tx_chanwidth,
|
||||
&tx_seg1_idx) < 0)
|
||||
- return;
|
||||
+ goto out;
|
||||
|
||||
res = ocv_verify_tx_params(kde.oci, kde.oci_len, &ci,
|
||||
tx_chanwidth, tx_seg1_idx);
|
||||
@@ -3127,7 +3152,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
OCV_FAILURE "addr=" MACSTR
|
||||
" frame=eapol-key-m2 error=%s",
|
||||
MAC2STR(sm->addr), ocv_errorstr);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_OCV */
|
||||
@@ -3135,7 +3160,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
if (ft && ft_check_msg_2_of_4(wpa_auth, sm, &kde) < 0) {
|
||||
wpa_sta_disconnect(wpa_auth, sm->addr,
|
||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211R_AP */
|
||||
#ifdef CONFIG_P2P
|
||||
@@ -3171,7 +3196,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
"DPP: Peer indicated it supports PFS and local configuration allows this, but PFS was not negotiated for the association");
|
||||
wpa_sta_disconnect(wpa_auth, sm->addr,
|
||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_DPP2 */
|
||||
@@ -3191,7 +3216,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
sm->sup_pmk_r1_name, WPA_PMK_NAME_LEN);
|
||||
wpa_hexdump(MSG_DEBUG, "FT: Derived PMKR1Name",
|
||||
sm->pmk_r1_name, WPA_PMK_NAME_LEN);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_IEEE80211R_AP */
|
||||
@@ -3200,7 +3225,7 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
wpa_auth_update_vlan(wpa_auth, sm->addr, vlan_id) < 0) {
|
||||
wpa_sta_disconnect(wpa_auth, sm->addr,
|
||||
WLAN_REASON_PREV_AUTH_NOT_VALID);
|
||||
- return;
|
||||
+ goto out;
|
||||
}
|
||||
|
||||
sm->pending_1_of_4_timeout = 0;
|
||||
@@ -3216,9 +3241,20 @@ SM_STATE(WPA_PTK, PTKCALCNEGOTIATING)
|
||||
|
||||
sm->MICVerified = true;
|
||||
|
||||
+#ifdef CONFIG_IEEE80211R_AP
|
||||
+ if (wpa_key_mgmt_ft(sm->wpa_key_mgmt) && !sm->ft_completed) {
|
||||
+ wpa_printf(MSG_DEBUG, "FT: Store PMK-R0/PMK-R1");
|
||||
+ wpa_auth_ft_store_keys(sm, pmk_r0, pmk_r1, pmk_r0_name,
|
||||
+ key_len);
|
||||
+ }
|
||||
+#endif /* CONFIG_IEEE80211R_AP */
|
||||
+
|
||||
os_memcpy(&sm->PTK, &PTK, sizeof(PTK));
|
||||
forced_memzero(&PTK, sizeof(PTK));
|
||||
sm->PTK_valid = true;
|
||||
+out:
|
||||
+ forced_memzero(pmk_r0, sizeof(pmk_r0));
|
||||
+ forced_memzero(pmk_r1, sizeof(pmk_r1));
|
||||
}
|
||||
|
||||
|
||||
--- a/src/ap/wpa_auth_ft.c
|
||||
+++ b/src/ap/wpa_auth_ft.c
|
||||
@@ -2175,13 +2175,13 @@ int wpa_ft_store_pmk_fils(struct wpa_sta
|
||||
}
|
||||
|
||||
|
||||
-int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk)
|
||||
+int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk,
|
||||
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
|
||||
+ size_t *key_len)
|
||||
{
|
||||
- u8 pmk_r0[PMK_LEN_MAX], pmk_r0_name[WPA_PMK_NAME_LEN];
|
||||
size_t pmk_r0_len = wpa_key_mgmt_sha384(sm->wpa_key_mgmt) ?
|
||||
SHA384_MAC_LEN : PMK_LEN;
|
||||
size_t pmk_r1_len = pmk_r0_len;
|
||||
- u8 pmk_r1[PMK_LEN_MAX];
|
||||
u8 ptk_name[WPA_PMK_NAME_LEN];
|
||||
const u8 *mdid = sm->wpa_auth->conf.mobility_domain;
|
||||
const u8 *r0kh = sm->wpa_auth->conf.r0_key_holder;
|
||||
@@ -2189,13 +2189,6 @@ int wpa_auth_derive_ptk_ft(struct wpa_st
|
||||
const u8 *r1kh = sm->wpa_auth->conf.r1_key_holder;
|
||||
const u8 *ssid = sm->wpa_auth->conf.ssid;
|
||||
size_t ssid_len = sm->wpa_auth->conf.ssid_len;
|
||||
- int psk_local = sm->wpa_auth->conf.ft_psk_generate_local;
|
||||
- int expires_in = sm->wpa_auth->conf.r0_key_lifetime;
|
||||
- struct vlan_description vlan;
|
||||
- struct rate_description rate;
|
||||
- const u8 *identity, *radius_cui;
|
||||
- size_t identity_len, radius_cui_len;
|
||||
- int session_timeout;
|
||||
const u8 *mpmk;
|
||||
size_t mpmk_len;
|
||||
|
||||
@@ -2211,10 +2204,41 @@ int wpa_auth_derive_ptk_ft(struct wpa_st
|
||||
return -1;
|
||||
}
|
||||
|
||||
+ *key_len = pmk_r0_len;
|
||||
+ if (wpa_derive_pmk_r0(mpmk, mpmk_len, ssid, ssid_len, mdid,
|
||||
+ r0kh, r0kh_len, sm->addr,
|
||||
+ pmk_r0, pmk_r0_name,
|
||||
+ pmk_r0_len == SHA384_MAC_LEN) < 0 ||
|
||||
+ wpa_derive_pmk_r1(pmk_r0, pmk_r0_len, pmk_r0_name, r1kh, sm->addr,
|
||||
+ pmk_r1, sm->pmk_r1_name) < 0)
|
||||
+ return -1;
|
||||
+
|
||||
+ return wpa_pmk_r1_to_ptk(pmk_r1, pmk_r1_len, sm->SNonce, sm->ANonce,
|
||||
+ sm->addr, sm->wpa_auth->addr, sm->pmk_r1_name,
|
||||
+ ptk, ptk_name, sm->wpa_key_mgmt, sm->pairwise,
|
||||
+ 0);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+void wpa_auth_ft_store_keys(struct wpa_state_machine *sm, const u8 *pmk_r0,
|
||||
+ const u8 *pmk_r1, const u8 *pmk_r0_name,
|
||||
+ size_t key_len)
|
||||
+{
|
||||
+ int psk_local = sm->wpa_auth->conf.ft_psk_generate_local;
|
||||
+ int expires_in = sm->wpa_auth->conf.r0_key_lifetime;
|
||||
+ struct vlan_description vlan;
|
||||
+ struct rate_description rate;
|
||||
+ const u8 *identity, *radius_cui;
|
||||
+ size_t identity_len, radius_cui_len;
|
||||
+ int session_timeout;
|
||||
+
|
||||
+ if (psk_local && wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
|
||||
+ return;
|
||||
+
|
||||
if (wpa_ft_get_vlan(sm->wpa_auth, sm->addr, &vlan) < 0) {
|
||||
wpa_printf(MSG_DEBUG, "FT: vlan not available for STA " MACSTR,
|
||||
MAC2STR(sm->addr));
|
||||
- return -1;
|
||||
+ return;
|
||||
}
|
||||
|
||||
wpa_ft_get_rate_limit(sm->wpa_auth, sm->addr, &rate);
|
||||
@@ -2224,32 +2248,16 @@ int wpa_auth_derive_ptk_ft(struct wpa_st
|
||||
&radius_cui);
|
||||
session_timeout = wpa_ft_get_session_timeout(sm->wpa_auth, sm->addr);
|
||||
|
||||
- if (wpa_derive_pmk_r0(mpmk, mpmk_len, ssid, ssid_len, mdid,
|
||||
- r0kh, r0kh_len, sm->addr,
|
||||
- pmk_r0, pmk_r0_name,
|
||||
- wpa_key_mgmt_sha384(sm->wpa_key_mgmt)) < 0)
|
||||
- return -1;
|
||||
- if (!psk_local || !wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
|
||||
- wpa_ft_store_pmk_r0(sm->wpa_auth, sm->addr, pmk_r0, pmk_r0_len,
|
||||
- pmk_r0_name,
|
||||
- sm->pairwise, &vlan, expires_in,
|
||||
- session_timeout, identity, identity_len,
|
||||
- radius_cui, radius_cui_len, &rate);
|
||||
-
|
||||
- if (wpa_derive_pmk_r1(pmk_r0, pmk_r0_len, pmk_r0_name, r1kh, sm->addr,
|
||||
- pmk_r1, sm->pmk_r1_name) < 0)
|
||||
- return -1;
|
||||
- if (!psk_local || !wpa_key_mgmt_ft_psk(sm->wpa_key_mgmt))
|
||||
- wpa_ft_store_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1, pmk_r1_len,
|
||||
- sm->pmk_r1_name, sm->pairwise, &vlan,
|
||||
- expires_in, session_timeout, identity,
|
||||
- identity_len, radius_cui, radius_cui_len,
|
||||
- &rate);
|
||||
-
|
||||
- return wpa_pmk_r1_to_ptk(pmk_r1, pmk_r1_len, sm->SNonce, sm->ANonce,
|
||||
- sm->addr, sm->wpa_auth->addr, sm->pmk_r1_name,
|
||||
- ptk, ptk_name, sm->wpa_key_mgmt, sm->pairwise,
|
||||
- 0);
|
||||
+ wpa_ft_store_pmk_r0(sm->wpa_auth, sm->addr, pmk_r0, key_len,
|
||||
+ pmk_r0_name,
|
||||
+ sm->pairwise, &vlan, expires_in,
|
||||
+ session_timeout, identity, identity_len,
|
||||
+ radius_cui, radius_cui_len, &rate);
|
||||
+
|
||||
+ wpa_ft_store_pmk_r1(sm->wpa_auth, sm->addr, pmk_r1, key_len,
|
||||
+ sm->pmk_r1_name, sm->pairwise, &vlan,
|
||||
+ expires_in, session_timeout, identity,
|
||||
+ identity_len, radius_cui, radius_cui_len, &rate);
|
||||
}
|
||||
|
||||
|
||||
--- a/src/ap/wpa_auth_i.h
|
||||
+++ b/src/ap/wpa_auth_i.h
|
||||
@@ -302,7 +302,12 @@ int wpa_write_ftie(struct wpa_auth_confi
|
||||
const u8 *anonce, const u8 *snonce,
|
||||
u8 *buf, size_t len, const u8 *subelem,
|
||||
size_t subelem_len, int rsnxe_used);
|
||||
-int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk);
|
||||
+int wpa_auth_derive_ptk_ft(struct wpa_state_machine *sm, struct wpa_ptk *ptk,
|
||||
+ u8 *pmk_r0, u8 *pmk_r1, u8 *pmk_r0_name,
|
||||
+ size_t *key_len);
|
||||
+void wpa_auth_ft_store_keys(struct wpa_state_machine *sm, const u8 *pmk_r0,
|
||||
+ const u8 *pmk_r1, const u8 *pmk_r0_name,
|
||||
+ size_t key_len);
|
||||
struct wpa_ft_pmk_cache * wpa_ft_pmk_cache_init(void);
|
||||
void wpa_ft_pmk_cache_deinit(struct wpa_ft_pmk_cache *cache);
|
||||
void wpa_ft_install_ptk(struct wpa_state_machine *sm, int retry);
|
||||
@@ -24,7 +24,7 @@ cybertan,eww631-a1|\
|
||||
cybertan,eww631-b1)
|
||||
ucidef_set_led_default "power" "POWER" "sys:blue" "on"
|
||||
;;
|
||||
cybertan,rap630w-312g)
|
||||
sonicfi,rap630w-312g)
|
||||
ucidef_set_led_default "power" "POWER" "red:power" "on"
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy0tpt"
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy1tpt"
|
||||
|
||||
@@ -13,10 +13,10 @@ qcom_setup_interfaces()
|
||||
|
||||
case $board in
|
||||
cig,wf186w)
|
||||
ucidef_add_switch "switch0" "4:wan" "0:lan" "1:lan" "2:lan" "3:lan" "6@eth0"
|
||||
ucidef_add_switch "switch0" "4:wan" "0:lan" "1:lan" "2:lan" "3:lan" "6u@eth0"
|
||||
;;
|
||||
cig,wf186h)
|
||||
ucidef_add_switch "switch0" "4:wan" "1:lan" "2:lan" "6@eth0"
|
||||
ucidef_add_switch "switch0" "4:wan" "1:lan" "2:lan" "6u@eth0"
|
||||
;;
|
||||
sonicfi,rap630c-311g|\
|
||||
cybertan,eww631-a1)
|
||||
@@ -25,7 +25,7 @@ qcom_setup_interfaces()
|
||||
;;
|
||||
sonicfi,rap630w-311g|\
|
||||
cybertan,eww631-b1)
|
||||
ucidef_add_switch "switch1" "5:wan" "2:lan" "3:lan" "4:lan" "6@eth0"
|
||||
ucidef_add_switch "switch1" "5:wan" "2:lan" "3:lan" "4:lan" "6u@eth0"
|
||||
;;
|
||||
udaya,a6-id2)
|
||||
ucidef_set_interface_wan "eth1"
|
||||
@@ -46,7 +46,7 @@ qcom_setup_interfaces()
|
||||
edgecore,eap104)
|
||||
ucidef_set_interface_wan "eth0"
|
||||
ucidef_add_switch "switch1" \
|
||||
"6@eth1" "1:lan" "2:lan" "3:lan" "4:lan"
|
||||
"6u@eth1" "1:lan" "2:lan" "3:lan" "4:lan"
|
||||
;;
|
||||
hfcl,ion4x_w|\
|
||||
hfcl,ion4xi_w)
|
||||
@@ -59,13 +59,13 @@ qcom_setup_interfaces()
|
||||
ucidef_set_interface_wan "eth0"
|
||||
ucidef_set_interface_lan "eth1"
|
||||
;;
|
||||
cybertan,rap630w-312g|\
|
||||
sonicfi,rap630w-312g|\
|
||||
yuncore,fap655)
|
||||
ucidef_add_switch "switch1" \
|
||||
"6@eth0" "1:lan" "2:lan" "3:lan" "4:lan" "5:wan"
|
||||
"6u@eth0" "1:lan" "2:lan" "3:lan" "4:lan" "5:wan"
|
||||
;;
|
||||
glinet,b3000)
|
||||
ucidef_add_switch "switch1" "6@eth1" "1:wan" "2:lan" "3:lan"
|
||||
ucidef_add_switch "switch1" "6u@eth1" "1:wan" "2:lan" "3:lan"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -121,9 +121,9 @@ ath11k/IPQ5018/hw1.0/caldata.bin)
|
||||
cig,wf186h|\
|
||||
sonicfi,rap630c-311g|\
|
||||
sonicfi,rap630w-311g|\
|
||||
sonicfi,rap630w-312g|\
|
||||
cybertan,eww631-a1|\
|
||||
cybertan,eww631-b1|\
|
||||
cybertan,rap630w-312g|\
|
||||
edgecore,eap104|\
|
||||
edgecore,oap101|\
|
||||
edgecore,oap101-6e|\
|
||||
@@ -150,9 +150,9 @@ ath11k/qcn6122/hw1.0/caldata_1.bin)
|
||||
cig,wf186h|\
|
||||
sonicfi,rap630c-311g|\
|
||||
sonicfi,rap630w-311g|\
|
||||
sonicfi,rap630w-312g|\
|
||||
cybertan,eww631-a1|\
|
||||
cybertan,eww631-b1|\
|
||||
cybertan,rap630w-312g|\
|
||||
edgecore,oap101|\
|
||||
edgecore,oap101-6e|\
|
||||
edgecore,oap101e|\
|
||||
@@ -219,7 +219,7 @@ ath11k-macs)
|
||||
optimcloud,d60-5g|\
|
||||
optimcloud,d50|\
|
||||
optimcloud,d50-5g|\
|
||||
cybertan,rap630w-312g|\
|
||||
sonicfi,rap630w-312g|\
|
||||
yuncore,fap655)
|
||||
ath11k_generate_macs
|
||||
;;
|
||||
|
||||
@@ -6,26 +6,27 @@ board=$(board_name)
|
||||
|
||||
case "$board" in
|
||||
"edgecore,eap101")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
;;
|
||||
"edgecore,eap102")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
"edgecore,eap102"|\
|
||||
"edgecore,oap103")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
;;
|
||||
"edgecore,oap101e-6e"|\
|
||||
"edgecore,oap101-6e")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy6g
|
||||
;;
|
||||
"edgecore,oap101e"|\
|
||||
"edgecore,oap101")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
;;
|
||||
"edgecore,eap104")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -72,9 +72,9 @@ platform_check_image() {
|
||||
cig,wf186h|\
|
||||
sonicfi,rap630c-311g|\
|
||||
sonicfi,rap630w-311g|\
|
||||
sonicfi,rap630w-312g|\
|
||||
cybertan,eww631-a1|\
|
||||
cybertan,eww631-b1|\
|
||||
cybertan,rap630w-312g|\
|
||||
edgecore,eap104|\
|
||||
wallys,dr5018|\
|
||||
hfcl,ion4x_w|\
|
||||
@@ -143,11 +143,11 @@ platform_do_upgrade() {
|
||||
}
|
||||
nand_upgrade_tar "$1"
|
||||
;;
|
||||
sonicfi,rap630c-311g|\
|
||||
sonicfi,rap630w-311g|\
|
||||
cybertan,eww631-a1|\
|
||||
cybertan,eww631-b1|\
|
||||
cybertan,rap630w-312g)
|
||||
sonicfi,rap630c-311g|\
|
||||
sonicfi,rap630w-311g|\
|
||||
sonicfi,rap630w-312g)
|
||||
boot_part=$(fw_printenv bootfrom | cut -d = -f2)
|
||||
echo "Current bootfrom is $boot_part"
|
||||
if [[ $boot_part == 1 ]]; then
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
/ {
|
||||
#address-cells = <0x2>;
|
||||
#size-cells = <0x2>;
|
||||
model = "Cybertan RAP630W-312G";
|
||||
compatible = "cybertan,rap630w-312g", "qcom,ipq5018-mp03.3", "qcom,ipq5018";
|
||||
model = "Sonicfi RAP630W-312G";
|
||||
compatible = "sonicfi,rap630w-312g", "qcom,ipq5018-mp03.3", "qcom,ipq5018";
|
||||
interrupt-parent = <&intc>;
|
||||
|
||||
aliases {
|
||||
|
||||
@@ -40,16 +40,16 @@ define Device/cybertan_eww631_b1
|
||||
endef
|
||||
TARGET_DEVICES += cybertan_eww631_b1
|
||||
|
||||
define Device/cybertan_rap630w_312g
|
||||
DEVICE_TITLE := CyberTan RAP630W-312G
|
||||
define Device/sonicfi_rap630w_312g
|
||||
DEVICE_TITLE := Sonicfi RAP630W-312G
|
||||
DEVICE_DTS := qcom-ipq5018-rap630w-312g
|
||||
SUPPORTED_DEVICES := cybertan,rap630w-312g
|
||||
DEVICE_PACKAGES := ath11k-wifi-cybertan-rap630w-312g ath11k-firmware-ipq50xx-map-spruce \
|
||||
SUPPORTED_DEVICES := sonicfi,rap630w-312g
|
||||
DEVICE_PACKAGES := ath11k-wifi-sonicfi-rap630w-312g ath11k-firmware-ipq50xx-map-spruce \
|
||||
-kmod-usb-dwc3-of-simple kmod-usb-dwc3-qcom kmod-usb3 \
|
||||
kmod-usb-uas kmod-fs-msdos kmod-fs-ntfs
|
||||
DEVICE_DTS_CONFIG := config@mp03.3
|
||||
endef
|
||||
TARGET_DEVICES += cybertan_rap630w_312g
|
||||
TARGET_DEVICES += sonicfi_rap630w_312g
|
||||
|
||||
define Device/sonicfi_rap630c_311g
|
||||
DEVICE_TITLE := Sonicfi RAP630C-311G
|
||||
|
||||
@@ -6,26 +6,27 @@ board=$(board_name)
|
||||
|
||||
case "$board" in
|
||||
"edgecore,eap101")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
;;
|
||||
"edgecore,eap102")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
"edgecore,eap102"|\
|
||||
"edgecore,oap103")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
;;
|
||||
"edgecore,oap101e-6e"|\
|
||||
"edgecore,oap101-6e")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy6g
|
||||
;;
|
||||
"edgecore,oap101e"|\
|
||||
"edgecore,oap101")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
;;
|
||||
"edgecore,eap104")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -7,10 +7,11 @@ boot() {
|
||||
hfcl,ion4xe|\
|
||||
hfcl,ion4xi)
|
||||
fw_setenv boot_count 0
|
||||
;;
|
||||
;;
|
||||
edgecore,eap101|\
|
||||
edgecore,eap102|\
|
||||
edgecore,oap102|\
|
||||
edgecore,oap103|\
|
||||
edgecore,eap104)
|
||||
avail=$(fw_printenv -n upgrade_available)
|
||||
[ ${avail} -eq 0 ] && fw_setenv upgrade_available 1
|
||||
|
||||
@@ -13,13 +13,15 @@ cig,wf194c4)
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt"
|
||||
;;
|
||||
edgecore,eap102|\
|
||||
edgecore,oap102)
|
||||
edgecore,oap102|\
|
||||
edgecore,oap103)
|
||||
ucidef_set_led_netdev "poe" "poe" "green:wan" "eth0"
|
||||
ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wifi5" "phy0tpt"
|
||||
ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wifi2" "phy1tpt"
|
||||
ucidef_set_led_wlan "power" "POWER" "green:power" "default-on"
|
||||
;;
|
||||
sonicfi,rap630w-311g|\
|
||||
sonicfi,rap650c|\
|
||||
cybertan,eww631-b1)
|
||||
ucidef_set_led_default "power" "POWER" "sys:blue" "on"
|
||||
;;
|
||||
|
||||
@@ -23,6 +23,8 @@ qcom_setup_interfaces()
|
||||
;;
|
||||
edgecore,eap102|\
|
||||
edgecore,oap102|\
|
||||
edgecore,oap103|\
|
||||
sonicfi,rap650c|\
|
||||
cig,wf196)
|
||||
ucidef_set_interface_lan "eth1"
|
||||
ucidef_set_interface_wan "eth0"
|
||||
@@ -49,6 +51,16 @@ qcom_setup_macs()
|
||||
ip link set eth1 address $lan_mac
|
||||
ucidef_set_label_macaddr $wan_mac
|
||||
;;
|
||||
sonicfi,rap650c)
|
||||
mac=$(fw_printenv -n BaseMacAddress)
|
||||
[ -z "$mac" ] && return;
|
||||
wan_mac=$(macaddr_canonicalize $mac)
|
||||
lan_mac=$(macaddr_add "$wan_mac" 1)
|
||||
ucidef_set_network_device_mac eth0 $wan_mac
|
||||
ucidef_set_network_device_mac eth1 $lan_mac
|
||||
ip link set eth0 address $wan_mac
|
||||
ip link set eth1 address $lan_mac
|
||||
;;
|
||||
*)
|
||||
wan_mac=$(cat /sys/class/net/eth0/address)
|
||||
lan_mac=$(macaddr_add "$wan_mac" 1)
|
||||
|
||||
@@ -16,6 +16,20 @@ ath11k_generate_macs() {
|
||||
echo -ne \\x${mac3//:/\\x} >> /lib/firmware/ath11k-macs
|
||||
}
|
||||
|
||||
ath11k_generate_macs_sonicfi() {
|
||||
mac=$(fw_printenv -n BaseMacAddress)
|
||||
[ -z "$mac" ] && return;
|
||||
|
||||
touch /lib/firmware/ath11k-macs
|
||||
eth=$(macaddr_canonicalize $mac)
|
||||
mac1=$(macaddr_add $eth 2)
|
||||
mac2=$(macaddr_add $eth 3)
|
||||
mac3=$(macaddr_add $eth 4)
|
||||
echo -ne \\x${mac1//:/\\x} >> /lib/firmware/ath11k-macs
|
||||
echo -ne \\x${mac2//:/\\x} >> /lib/firmware/ath11k-macs
|
||||
echo -ne \\x${mac3//:/\\x} >> /lib/firmware/ath11k-macs
|
||||
}
|
||||
|
||||
ath11k_generate_macs_wf196() {
|
||||
touch /lib/firmware/ath11k-macs
|
||||
mac=$(grep BaseMacAddress= /dev/mtd18 | cut -dx -f2)
|
||||
@@ -56,12 +70,14 @@ case "$FIRMWARE" in
|
||||
cig,wf196|\
|
||||
edgecore,eap102 |\
|
||||
edgecore,oap102 |\
|
||||
edgecore,oap103 |\
|
||||
edgecore,eap106 |\
|
||||
qcom,ipq807x-hk01|\
|
||||
qcom,ipq807x-hk14|\
|
||||
tplink,ex227|\
|
||||
tplink,ex447|\
|
||||
yuncore,ax840|\
|
||||
sonicfi,rap650c|\
|
||||
sercomm,wallaby)
|
||||
caldata_extract "0:ART" 0x1000 0x20000
|
||||
;;
|
||||
@@ -89,12 +105,16 @@ ath11k-macs)
|
||||
case "$board" in
|
||||
edgecore,eap102|\
|
||||
edgecore,oap102|\
|
||||
edgecore,oap103|\
|
||||
edgecore,eap106)
|
||||
ath11k_generate_macs
|
||||
;;
|
||||
cig,wf196)
|
||||
ath11k_generate_macs_wf196
|
||||
;;
|
||||
sonicfi*)
|
||||
ath11k_generate_macs_sonicfi
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
ath11k/IPQ8074/hw2.0/board.bin)
|
||||
|
||||
@@ -6,26 +6,28 @@ board=$(board_name)
|
||||
|
||||
case "$board" in
|
||||
"edgecore,eap101")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
ln -s /sys/kernel/debug/ath11k/ipq6018\ hw1.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
;;
|
||||
"edgecore,eap102")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
"edgecore,eap102"|\
|
||||
"edgecore,oap103"|\
|
||||
"sonicfi,rap650c")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
ln -s /sys/kernel/debug/ath11k/ipq8074\ hw2.0/mac1/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
;;
|
||||
"edgecore,oap101e-6e"|\
|
||||
"edgecore,oap101-6e")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy6g
|
||||
;;
|
||||
"edgecore,oap101e"|\
|
||||
"edgecore,oap101")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_1/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
;;
|
||||
"edgecore,eap104")
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy0
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy1
|
||||
ln -s /sys/kernel/debug/ath11k/ipq5018\ hw1.0/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy2g
|
||||
ln -s /sys/kernel/debug/ath11k/qcn6122_2/mac0/fw_stats/pdev_stats /tmp/pdev_stats_phy5g
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -11,6 +11,7 @@ boot() {
|
||||
edgecore,eap101|\
|
||||
edgecore,eap102|\
|
||||
edgecore,oap102|\
|
||||
edgecore,oap103|\
|
||||
edgecore,eap104)
|
||||
avail=$(fw_printenv -n upgrade_available)
|
||||
[ ${avail} -eq 0 ] && fw_setenv upgrade_available 1
|
||||
|
||||
@@ -27,7 +27,9 @@ platform_check_image() {
|
||||
cig,wf196|\
|
||||
edgecore,eap102|\
|
||||
edgecore,oap102|\
|
||||
edgecore,oap103|\
|
||||
edgecore,eap106|\
|
||||
sonicfi,rap650c|\
|
||||
tplink,ex227|\
|
||||
tplink,ex447)
|
||||
[ "$magic_long" = "73797375" ] && return 0
|
||||
@@ -63,7 +65,8 @@ platform_do_upgrade() {
|
||||
nand_upgrade_tar "$1"
|
||||
;;
|
||||
edgecore,eap102|\
|
||||
edgecore,oap102)
|
||||
edgecore,oap102|\
|
||||
edgecore,oap103)
|
||||
if [ "$(find_mtd_chardev rootfs)" ]; then
|
||||
CI_UBIPART="rootfs"
|
||||
else
|
||||
@@ -81,5 +84,17 @@ platform_do_upgrade() {
|
||||
fi
|
||||
nand_upgrade_tar "$1"
|
||||
;;
|
||||
sonicfi,rap650c)
|
||||
boot_part=$(fw_printenv -n bootfrom)
|
||||
[ ${#boot_part} -eq 0 ] && boot_part=0
|
||||
echo "Current bootfrom is $boot_part"
|
||||
if [[ $boot_part == 1 ]]; then
|
||||
CI_UBIPART="rootfs"
|
||||
CI_FWSETENV="bootfrom 0"
|
||||
elif [[ $boot_part == 0 ]]; then
|
||||
CI_UBIPART="rootfs_1"
|
||||
CI_FWSETENV="bootfrom 1"
|
||||
fi
|
||||
nand_upgrade_tar "$1"
|
||||
esac
|
||||
}
|
||||
|
||||
@@ -0,0 +1,736 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/dts-v1/;
|
||||
/* Copyright (c) 2020 The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
#include "ipq8074.dtsi"
|
||||
#include "ipq8074-ac-cpu.dtsi"
|
||||
|
||||
/ {
|
||||
#address-cells = <0x2>;
|
||||
#size-cells = <0x2>;
|
||||
model = "Edgecore OAP103";
|
||||
compatible = "edgecore,oap103", "qcom,ipq807x-ac02", "qcom,ipq807x";
|
||||
qcom,msm-id = <0x178 0x0>;
|
||||
interrupt-parent = <&intc>;
|
||||
|
||||
aliases {
|
||||
serial0 = &blsp1_uart5;
|
||||
/* Aliases as required by u-boot to patch MAC addresses */
|
||||
ethernet1 = "/soc/dp5";
|
||||
ethernet0 = "/soc/dp6";
|
||||
|
||||
led-boot = &led_power;
|
||||
led-failsafe = &led_power;
|
||||
led-running = &led_power;
|
||||
led-upgrade = &led_power;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0";
|
||||
};
|
||||
|
||||
gpio-export {
|
||||
compatible = "gpio-export";
|
||||
#size-cells = <0>;
|
||||
|
||||
mcu-enable {
|
||||
gpio-export,name = "mcu-enable";
|
||||
gpio-export,output = <0>;
|
||||
gpios = <&tlmm 54 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
usb-hub-enable {
|
||||
gpio-export,name = "usb-hub-enable";
|
||||
gpio-export,output = <1>;
|
||||
gpios = <&tlmm 55 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
usb-rear-power {
|
||||
gpio-export,name = "usb-rear-power";
|
||||
gpio-export,output = <1>;
|
||||
gpios = <&tlmm 29 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
|
||||
usb-side-power {
|
||||
gpio-export,name = "usb-side-power";
|
||||
gpio-export,output = <1>;
|
||||
gpios = <&tlmm 30 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
pinctrl@1000000 {
|
||||
pinctrl-0 = <&mcu_rst &mcu_rsv &usb_rear_pwr &usb_side_pwr &usb_hub_rst>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
mcu_rst: mcu_rst_pins {
|
||||
pins = "gpio54";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-disable;
|
||||
output-low;
|
||||
};
|
||||
|
||||
mcu_rsv: mcu_rsv_pins {
|
||||
pins = "gpio56";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-disable;
|
||||
};
|
||||
|
||||
usb_rear_pwr: usb_rear_pwr_pins {
|
||||
pins = "gpio29";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-disable;
|
||||
output-high;
|
||||
};
|
||||
|
||||
usb_side_pwr: usb_side_pwr_pins {
|
||||
pins = "gpio30";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-disable;
|
||||
output-high;
|
||||
};
|
||||
|
||||
usb_hub_rst: usb_hub_rst_pins {
|
||||
pins = "gpio55";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-disable;
|
||||
output-high;
|
||||
};
|
||||
|
||||
button_pins: button_pins {
|
||||
reset_button {
|
||||
pins = "gpio66";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
|
||||
mdio_pins: mdio_pinmux {
|
||||
mux_0 {
|
||||
pins = "gpio68";
|
||||
function = "mdc";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
mux_1 {
|
||||
pins = "gpio69";
|
||||
function = "mdio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
mux_2 {
|
||||
pins = "gpio33";
|
||||
function = "gpio";
|
||||
bias-pull-up;
|
||||
};
|
||||
mux_3 {
|
||||
pins = "gpio44";
|
||||
function = "gpio";
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
led_pins: led_pins {
|
||||
led_2g {
|
||||
pins = "gpio42";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
|
||||
led_5g {
|
||||
pins = "gpio43";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
serial@78b3000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
spi@78b5000 {
|
||||
status = "ok";
|
||||
pinctrl-0 = <&spi_0_pins>;
|
||||
pinctrl-names = "default";
|
||||
cs-select = <0>;
|
||||
|
||||
m25p80@0 {
|
||||
compatible = "n25q128a11";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
};
|
||||
};
|
||||
|
||||
dma@7984000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
nand@79b0000 {
|
||||
status = "ok";
|
||||
|
||||
nand@0 {
|
||||
reg = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
nand-ecc-strength = <4>;
|
||||
nand-ecc-step-size = <512>;
|
||||
nand-bus-width = <8>;
|
||||
};
|
||||
};
|
||||
|
||||
qusb@79000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
ssphy@78000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
usb3@8A00000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
usb3@8C00000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
qusb@59000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
ssphy@58000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
usb3@8C00000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
gpio_keys {
|
||||
compatible = "gpio-keys";
|
||||
pinctrl-0 = <&button_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "ok";
|
||||
|
||||
button@1 {
|
||||
label = "reset";
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&tlmm 66 GPIO_ACTIVE_LOW>;
|
||||
linux,input-type = <1>;
|
||||
debounce-interval = <60>;
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio@90000 {
|
||||
pinctrl-0 = <&mdio_pins>;
|
||||
pinctrl-names = "default";
|
||||
phy-reset-gpio = <&tlmm 37 0 &tlmm 25 1 &tlmm 44 1>;
|
||||
phy0: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
};
|
||||
phy1: ethernet-phy@1 {
|
||||
reg = <1>;
|
||||
};
|
||||
phy2: ethernet-phy@2 {
|
||||
reg = <2>;
|
||||
};
|
||||
phy3: ethernet-phy@3 {
|
||||
reg = <3>;
|
||||
};
|
||||
phy4: ethernet-phy@4 {
|
||||
reg = <24>;
|
||||
};
|
||||
phy5: ethernet-phy@5 {
|
||||
reg = <28>;
|
||||
};
|
||||
};
|
||||
|
||||
ess-switch@3a000000 {
|
||||
switch_cpu_bmp = <0x1>; /* cpu port bitmap */
|
||||
switch_lan_bmp = <0x3e>; /* lan port bitmap */
|
||||
switch_wan_bmp = <0x40>; /* wan port bitmap */
|
||||
switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/
|
||||
switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/
|
||||
switch_mac_mode2 = <0xf>; /* mac mode for uniphy instance2*/
|
||||
bm_tick_mode = <0>; /* bm tick mode */
|
||||
tm_tick_mode = <0>; /* tm tick mode */
|
||||
qcom,port_phyinfo {
|
||||
port@0 {
|
||||
port_id = <1>;
|
||||
phy_address = <0>;
|
||||
};
|
||||
port@1 {
|
||||
port_id = <2>;
|
||||
phy_address = <1>;
|
||||
};
|
||||
port@2 {
|
||||
port_id = <3>;
|
||||
phy_address = <2>;
|
||||
};
|
||||
port@3 {
|
||||
port_id = <4>;
|
||||
phy_address = <3>;
|
||||
};
|
||||
port@4 {
|
||||
port_id = <5>;
|
||||
phy_address = <24>;
|
||||
port_mac_sel = "QGMAC_PORT";
|
||||
};
|
||||
port@5 {
|
||||
port_id = <6>;
|
||||
phy_address = <28>;
|
||||
port_mac_sel = "QGMAC_PORT";
|
||||
};
|
||||
};
|
||||
port_scheduler_resource {
|
||||
port@0 {
|
||||
port_id = <0>;
|
||||
ucast_queue = <0 143>;
|
||||
mcast_queue = <256 271>;
|
||||
l0sp = <0 35>;
|
||||
l0cdrr = <0 47>;
|
||||
l0edrr = <0 47>;
|
||||
l1cdrr = <0 7>;
|
||||
l1edrr = <0 7>;
|
||||
};
|
||||
port@1 {
|
||||
port_id = <1>;
|
||||
ucast_queue = <144 159>;
|
||||
mcast_queue = <272 275>;
|
||||
l0sp = <36 39>;
|
||||
l0cdrr = <48 63>;
|
||||
l0edrr = <48 63>;
|
||||
l1cdrr = <8 11>;
|
||||
l1edrr = <8 11>;
|
||||
};
|
||||
port@2 {
|
||||
port_id = <2>;
|
||||
ucast_queue = <160 175>;
|
||||
mcast_queue = <276 279>;
|
||||
l0sp = <40 43>;
|
||||
l0cdrr = <64 79>;
|
||||
l0edrr = <64 79>;
|
||||
l1cdrr = <12 15>;
|
||||
l1edrr = <12 15>;
|
||||
};
|
||||
port@3 {
|
||||
port_id = <3>;
|
||||
ucast_queue = <176 191>;
|
||||
mcast_queue = <280 283>;
|
||||
l0sp = <44 47>;
|
||||
l0cdrr = <80 95>;
|
||||
l0edrr = <80 95>;
|
||||
l1cdrr = <16 19>;
|
||||
l1edrr = <16 19>;
|
||||
};
|
||||
port@4 {
|
||||
port_id = <4>;
|
||||
ucast_queue = <192 207>;
|
||||
mcast_queue = <284 287>;
|
||||
l0sp = <48 51>;
|
||||
l0cdrr = <96 111>;
|
||||
l0edrr = <96 111>;
|
||||
l1cdrr = <20 23>;
|
||||
l1edrr = <20 23>;
|
||||
};
|
||||
port@5 {
|
||||
port_id = <5>;
|
||||
ucast_queue = <208 223>;
|
||||
mcast_queue = <288 291>;
|
||||
l0sp = <52 55>;
|
||||
l0cdrr = <112 127>;
|
||||
l0edrr = <112 127>;
|
||||
l1cdrr = <24 27>;
|
||||
l1edrr = <24 27>;
|
||||
};
|
||||
port@6 {
|
||||
port_id = <6>;
|
||||
ucast_queue = <224 239>;
|
||||
mcast_queue = <292 295>;
|
||||
l0sp = <56 59>;
|
||||
l0cdrr = <128 143>;
|
||||
l0edrr = <128 143>;
|
||||
l1cdrr = <28 31>;
|
||||
l1edrr = <28 31>;
|
||||
};
|
||||
port@7 {
|
||||
port_id = <7>;
|
||||
ucast_queue = <240 255>;
|
||||
mcast_queue = <296 299>;
|
||||
l0sp = <60 63>;
|
||||
l0cdrr = <144 159>;
|
||||
l0edrr = <144 159>;
|
||||
l1cdrr = <32 35>;
|
||||
l1edrr = <32 35>;
|
||||
};
|
||||
};
|
||||
port_scheduler_config {
|
||||
port@0 {
|
||||
port_id = <0>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <0 1>; /*L0 SPs*/
|
||||
/*cpri cdrr epri edrr*/
|
||||
cfg = <0 0 0 0>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
/*unicast queues*/
|
||||
ucast_queue = <0 4 8>;
|
||||
/*multicast queues*/
|
||||
mcast_queue = <256 260>;
|
||||
/*sp cpri cdrr epri edrr*/
|
||||
cfg = <0 0 0 0 0>;
|
||||
};
|
||||
group@1 {
|
||||
ucast_queue = <1 5 9>;
|
||||
mcast_queue = <257 261>;
|
||||
cfg = <0 1 1 1 1>;
|
||||
};
|
||||
group@2 {
|
||||
ucast_queue = <2 6 10>;
|
||||
mcast_queue = <258 262>;
|
||||
cfg = <0 2 2 2 2>;
|
||||
};
|
||||
group@3 {
|
||||
ucast_queue = <3 7 11>;
|
||||
mcast_queue = <259 263>;
|
||||
cfg = <0 3 3 3 3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@1 {
|
||||
port_id = <1>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <36>;
|
||||
cfg = <0 8 0 8>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <37>;
|
||||
cfg = <1 9 1 9>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <144>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <272>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <36 0 48 0 48>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@2 {
|
||||
port_id = <2>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <40>;
|
||||
cfg = <0 12 0 12>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <41>;
|
||||
cfg = <1 13 1 13>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <160>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <276>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <40 0 64 0 64>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@3 {
|
||||
port_id = <3>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <44>;
|
||||
cfg = <0 16 0 16>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <45>;
|
||||
cfg = <1 17 1 17>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <176>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <280>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <44 0 80 0 80>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@4 {
|
||||
port_id = <4>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <48>;
|
||||
cfg = <0 20 0 20>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <49>;
|
||||
cfg = <1 21 1 21>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <192>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <284>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <48 0 96 0 96>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@5 {
|
||||
port_id = <5>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <52>;
|
||||
cfg = <0 24 0 24>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <53>;
|
||||
cfg = <1 25 1 25>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <208>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <288>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <52 0 112 0 112>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@6 {
|
||||
port_id = <6>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <56>;
|
||||
cfg = <0 28 0 28>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <57>;
|
||||
cfg = <1 29 1 29>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <224>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <292>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <56 0 128 0 128>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@7 {
|
||||
port_id = <7>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <60>;
|
||||
cfg = <0 32 0 32>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <61>;
|
||||
cfg = <1 33 1 33>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <240>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <296>;
|
||||
cfg = <60 0 144 0 144>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
dp6 {
|
||||
device_type = "network";
|
||||
compatible = "qcom,nss-dp";
|
||||
qcom,id = <6>;
|
||||
reg = <0x3a001800 0x200>;
|
||||
qcom,mactype = <0>;
|
||||
local-mac-address = [000000000000];
|
||||
qcom,link-poll = <1>;
|
||||
qcom,phy-mdio-addr = <28>;
|
||||
phy-mode = "sgmii";
|
||||
};
|
||||
|
||||
dp5 {
|
||||
device_type = "network";
|
||||
compatible = "qcom,nss-dp";
|
||||
qcom,id = <5>;
|
||||
reg = <0x3a001a00 0x200>;
|
||||
qcom,mactype = <0>;
|
||||
local-mac-address = [000000000000];
|
||||
qcom,link-poll = <1>;
|
||||
qcom,phy-mdio-addr = <24>;
|
||||
phy-mode = "sgmii";
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
pinctrl-0 = <&led_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
led_pwr {
|
||||
label = "green:wan";
|
||||
gpios = <&tlmm 46 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
linux,default-trigger = "led_pwr";
|
||||
};
|
||||
|
||||
led_2g {
|
||||
label = "green:wifi2";
|
||||
gpio = <&tlmm 47 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
};
|
||||
|
||||
led_5g {
|
||||
label = "green:wifi5";
|
||||
gpio = <&tlmm 48 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
};
|
||||
|
||||
led_power: led_bt {
|
||||
gpios = <&tlmm 50 GPIO_ACTIVE_HIGH>;
|
||||
label = "green:power";
|
||||
default-state = "on";
|
||||
linux,default-trigger = "led_bt";
|
||||
};
|
||||
};
|
||||
nss-macsec0 {
|
||||
compatible = "qcom,nss-macsec";
|
||||
phy_addr = <0x18>;
|
||||
mdiobus = <&mdio>;
|
||||
};
|
||||
nss-macsec1 {
|
||||
compatible = "qcom,nss-macsec";
|
||||
phy_addr = <0x1c>;
|
||||
mdiobus = <&mdio>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&apc_cpr {
|
||||
/* Same CPR configuration as OAK */
|
||||
compatible = "qcom,cpr4-ipq817x-apss-regulator";
|
||||
|
||||
thread@0 {
|
||||
apc_vreg: regulator {
|
||||
regulator-min-microvolt = <1>;
|
||||
regulator-max-microvolt = <2>;
|
||||
qcom,cpr-fuse-corners = <2>;
|
||||
qcom,cpr-corners = <3>;
|
||||
qcom,cpr-speed-bin-corners = <3>;
|
||||
qcom,cpr-corner-fmax-map = <1 3>;
|
||||
|
||||
qcom,cpr-voltage-ceiling =
|
||||
<840000 904000 944000>;
|
||||
qcom,cpr-voltage-floor =
|
||||
<592000 648000 712000>;
|
||||
qcom,corner-frequencies =
|
||||
<1017600000 1382400000 1382400000>;
|
||||
|
||||
qcom,cpr-open-loop-voltage-fuse-adjustment-0 =
|
||||
/* Speed bin 0; CPR rev 0..7 */
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>;
|
||||
|
||||
qcom,cpr-open-loop-voltage-fuse-adjustment-1 =
|
||||
/* Speed bin 0; CPR rev 0..7 */
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 20000 26000>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>;
|
||||
|
||||
qcom,cpr-open-loop-voltage-fuse-adjustment-v2-0 =
|
||||
/* Speed bin 0; CPR rev 0..7 */
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>;
|
||||
|
||||
qcom,cpr-open-loop-voltage-fuse-adjustment-v2-1 =
|
||||
/* Speed bin 0; CPR rev 0..7 */
|
||||
< 0 0>,
|
||||
< 0 7000>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>,
|
||||
< 0 0>;
|
||||
|
||||
qcom,cpr-floor-to-ceiling-max-range =
|
||||
< 40000 40000 40000>,
|
||||
< 40000 40000 40000>,
|
||||
< 40000 40000 40000>,
|
||||
< 40000 40000 40000>,
|
||||
< 40000 40000 40000>,
|
||||
< 40000 40000 40000>,
|
||||
< 40000 40000 40000>,
|
||||
< 40000 40000 40000>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&npu_cpr {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
&nss0 {
|
||||
qcom,low-frequency = <187200000>;
|
||||
qcom,mid-frequency = <748800000>;
|
||||
qcom,max-frequency = <1497600000>;
|
||||
};
|
||||
|
||||
&nss0 {
|
||||
npu-supply = <&dummy_reg>;
|
||||
mx-supply = <&dummy_reg>;
|
||||
};
|
||||
|
||||
&wifi0 {
|
||||
qcom,board_id = <0x92>;
|
||||
};
|
||||
|
||||
&wifi1 {
|
||||
qcom,board_id = <0x292>;
|
||||
};
|
||||
@@ -0,0 +1,650 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/dts-v1/;
|
||||
/* Copyright (c) 2020 The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
#include "ipq8074.dtsi"
|
||||
#include "ipq8074-hk-cpu.dtsi"
|
||||
|
||||
/ {
|
||||
#address-cells = <0x2>;
|
||||
#size-cells = <0x2>;
|
||||
model = "SonicFi RAP650C";
|
||||
compatible = "sonicfi,rap650c", "qcom,ipq8074-ap-hk09", "qcom,ipq8074";
|
||||
qcom,msm-id = <0x157 0x0>, <0x187 0x0>;
|
||||
interrupt-parent = <&intc>;
|
||||
|
||||
aliases {
|
||||
serial0 = &blsp1_uart5;
|
||||
/* Aliases as required by u-boot to patch MAC addresses */
|
||||
ethernet0 = "/soc/dp1";
|
||||
ethernet1 = "/soc/dp2";
|
||||
|
||||
led-boot = &led_power;
|
||||
led-failsafe = &led_power;
|
||||
led-running = &led_power;
|
||||
led-upgrade = &led_power;
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0";
|
||||
};
|
||||
|
||||
soc {
|
||||
pinctrl@1000000 {
|
||||
button_pins: button_pins {
|
||||
reset_button {
|
||||
pins = "gpio57";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
|
||||
usb_mux_sel_pins: usb_mux_pins {
|
||||
mux {
|
||||
pins = "gpio27";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
pcie0_pins: pcie_pins {
|
||||
pcie0_rst {
|
||||
pins = "gpio58";
|
||||
function = "pcie0_rst";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
pcie0_wake {
|
||||
pins = "gpio59";
|
||||
function = "pcie0_wake";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
mdio_pins: mdio_pinmux {
|
||||
mux_0 {
|
||||
pins = "gpio68";
|
||||
function = "mdc";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
mux_1 {
|
||||
pins = "gpio69";
|
||||
function = "mdio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-up;
|
||||
};
|
||||
mux_2 {
|
||||
pins = "gpio25";
|
||||
function = "gpio";
|
||||
bias-pull-up;
|
||||
};
|
||||
mux_3 {
|
||||
pins = "gpio44";
|
||||
function = "gpio";
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
|
||||
led_pins: led_pins {
|
||||
red {
|
||||
pins = "gpio0";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
|
||||
green {
|
||||
pins = "gpio2";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
|
||||
blue {
|
||||
pins = "gpio9";
|
||||
function = "gpio";
|
||||
drive-strength = <8>;
|
||||
bias-pull-down;
|
||||
};
|
||||
};
|
||||
|
||||
spi_3_pins: spi_3_pins {
|
||||
mux {
|
||||
pins = "gpio50", "gpio52", "gpio53";
|
||||
function = "blsp3_spi";
|
||||
drive-strength = <8>;
|
||||
bias-disable;
|
||||
};
|
||||
spi_cs {
|
||||
pins = "gpio22";
|
||||
function = "blsp3_spi2";
|
||||
drive-strength = <8>;
|
||||
bias-disable;
|
||||
};
|
||||
quartz_interrupt {
|
||||
pins = "gpio47";
|
||||
function = "gpio";
|
||||
input;
|
||||
bias-disable;
|
||||
};
|
||||
quartz_reset {
|
||||
pins = "gpio21";
|
||||
function = "gpio";
|
||||
output-low;
|
||||
bias-disable;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
serial@78b3000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
dp1 {
|
||||
device_type = "network";
|
||||
compatible = "qcom,nss-dp";
|
||||
qcom,id = <5>;
|
||||
reg = <0x3a001800 0x200>;
|
||||
qcom,mactype = <0>;
|
||||
local-mac-address = [000000000000];
|
||||
qcom,link-poll = <1>;
|
||||
qcom,phy-mdio-addr = <24>;
|
||||
phy-mode = "sgmii";
|
||||
};
|
||||
|
||||
dp2 {
|
||||
device_type = "network";
|
||||
compatible = "qcom,nss-dp";
|
||||
qcom,id = <6>;
|
||||
reg = <0x3a001a00 0x200>;
|
||||
qcom,mactype = <0>;
|
||||
local-mac-address = [000000000000];
|
||||
qcom,link-poll = <1>;
|
||||
qcom,phy-mdio-addr = <28>;
|
||||
phy-mode = "sgmii";
|
||||
};
|
||||
|
||||
spi@78b5000 {
|
||||
status = "ok";
|
||||
pinctrl-0 = <&spi_0_pins>;
|
||||
pinctrl-names = "default";
|
||||
cs-select = <0>;
|
||||
|
||||
m25p80@0 {
|
||||
compatible = "n25q128a11";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
reg = <0>;
|
||||
spi-max-frequency = <50000000>;
|
||||
};
|
||||
};
|
||||
|
||||
spi@78b8000 {
|
||||
status = "ok";
|
||||
pinctrl-0 = <&spi_3_pins>;
|
||||
pinctrl-names = "default";
|
||||
cs-select = <2>;
|
||||
quartz-reset-gpio = <&tlmm 21 1>;
|
||||
|
||||
spidev3: spi@3 {
|
||||
compatible = "qti,spidev";
|
||||
reg = <0>;
|
||||
spi-max-frequency = <24000000>;
|
||||
};
|
||||
};
|
||||
|
||||
dma@7984000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
nand@79b0000 {
|
||||
status = "ok";
|
||||
|
||||
nand@0 {
|
||||
reg = <0>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
nand-ecc-strength = <4>;
|
||||
nand-ecc-step-size = <512>;
|
||||
nand-bus-width = <8>;
|
||||
};
|
||||
};
|
||||
|
||||
qusb@79000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
ssphy@78000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
usb3@8A00000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
qusb@59000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
ssphy@58000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
usb3@8C00000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
phy@84000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
phy@86000 {
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
pci@20000000 {
|
||||
perst-gpio = <&tlmm 58 1>;
|
||||
status = "ok";
|
||||
};
|
||||
|
||||
gpio_keys {
|
||||
compatible = "gpio-keys";
|
||||
pinctrl-0 = <&button_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "ok";
|
||||
|
||||
button@1 {
|
||||
label = "reset";
|
||||
linux,code = <KEY_RESTART>;
|
||||
gpios = <&tlmm 57 GPIO_ACTIVE_LOW>;
|
||||
linux,input-type = <1>;
|
||||
debounce-interval = <60>;
|
||||
};
|
||||
};
|
||||
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
pinctrl-0 = <&led_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
red {
|
||||
label = "sys:red";
|
||||
gpio = <&tlmm 0 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
};
|
||||
|
||||
green {
|
||||
label = "sys:green";
|
||||
gpio = <&tlmm 2 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
};
|
||||
|
||||
led_power: blue {
|
||||
label = "sys:blue";
|
||||
gpio = <&tlmm 9 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
};
|
||||
};
|
||||
|
||||
mdio: mdio@90000 {
|
||||
pinctrl-0 = <&mdio_pins>;
|
||||
pinctrl-names = "default";
|
||||
phy-reset-gpio = <&tlmm 37 0 &tlmm 25 0 &tlmm 44 0>;
|
||||
phy0: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
};
|
||||
phy1: ethernet-phy@1 {
|
||||
reg = <1>;
|
||||
};
|
||||
phy2: ethernet-phy@2 {
|
||||
reg = <2>;
|
||||
};
|
||||
phy3: ethernet-phy@3 {
|
||||
reg = <3>;
|
||||
};
|
||||
phy4: ethernet-phy@4 {
|
||||
reg = <24>;
|
||||
};
|
||||
phy5: ethernet-phy@5 {
|
||||
reg = <28>;
|
||||
};
|
||||
};
|
||||
|
||||
ess-switch@3a000000 {
|
||||
switch_cpu_bmp = <0x1>; /* cpu port bitmap */
|
||||
switch_lan_bmp = <0x3e>; /* lan port bitmap */
|
||||
switch_wan_bmp = <0x40>; /* wan port bitmap */
|
||||
switch_mac_mode = <0x0>; /* mac mode for uniphy instance0*/
|
||||
switch_mac_mode1 = <0xf>; /* mac mode for uniphy instance1*/
|
||||
switch_mac_mode2 = <0xf>; /* mac mode for uniphy instance2*/
|
||||
bm_tick_mode = <0>; /* bm tick mode */
|
||||
tm_tick_mode = <0>; /* tm tick mode */
|
||||
qcom,port_phyinfo {
|
||||
port@0 {
|
||||
port_id = <1>;
|
||||
phy_address = <0>;
|
||||
};
|
||||
port@1 {
|
||||
port_id = <2>;
|
||||
phy_address = <1>;
|
||||
};
|
||||
port@2 {
|
||||
port_id = <3>;
|
||||
phy_address = <2>;
|
||||
};
|
||||
port@3 {
|
||||
port_id = <4>;
|
||||
phy_address = <3>;
|
||||
};
|
||||
port@4 {
|
||||
port_id = <5>;
|
||||
phy_address = <24>;
|
||||
port_mac_sel = "QGMAC_PORT";
|
||||
};
|
||||
port@5 {
|
||||
port_id = <6>;
|
||||
phy_address = <28>;
|
||||
port_mac_sel = "QGMAC_PORT";
|
||||
};
|
||||
};
|
||||
port_scheduler_resource {
|
||||
port@0 {
|
||||
port_id = <0>;
|
||||
ucast_queue = <0 143>;
|
||||
mcast_queue = <256 271>;
|
||||
l0sp = <0 35>;
|
||||
l0cdrr = <0 47>;
|
||||
l0edrr = <0 47>;
|
||||
l1cdrr = <0 7>;
|
||||
l1edrr = <0 7>;
|
||||
};
|
||||
port@1 {
|
||||
port_id = <1>;
|
||||
ucast_queue = <144 159>;
|
||||
mcast_queue = <272 275>;
|
||||
l0sp = <36 39>;
|
||||
l0cdrr = <48 63>;
|
||||
l0edrr = <48 63>;
|
||||
l1cdrr = <8 11>;
|
||||
l1edrr = <8 11>;
|
||||
};
|
||||
port@2 {
|
||||
port_id = <2>;
|
||||
ucast_queue = <160 175>;
|
||||
mcast_queue = <276 279>;
|
||||
l0sp = <40 43>;
|
||||
l0cdrr = <64 79>;
|
||||
l0edrr = <64 79>;
|
||||
l1cdrr = <12 15>;
|
||||
l1edrr = <12 15>;
|
||||
};
|
||||
port@3 {
|
||||
port_id = <3>;
|
||||
ucast_queue = <176 191>;
|
||||
mcast_queue = <280 283>;
|
||||
l0sp = <44 47>;
|
||||
l0cdrr = <80 95>;
|
||||
l0edrr = <80 95>;
|
||||
l1cdrr = <16 19>;
|
||||
l1edrr = <16 19>;
|
||||
};
|
||||
port@4 {
|
||||
port_id = <4>;
|
||||
ucast_queue = <192 207>;
|
||||
mcast_queue = <284 287>;
|
||||
l0sp = <48 51>;
|
||||
l0cdrr = <96 111>;
|
||||
l0edrr = <96 111>;
|
||||
l1cdrr = <20 23>;
|
||||
l1edrr = <20 23>;
|
||||
};
|
||||
port@5 {
|
||||
port_id = <5>;
|
||||
ucast_queue = <208 223>;
|
||||
mcast_queue = <288 291>;
|
||||
l0sp = <52 55>;
|
||||
l0cdrr = <112 127>;
|
||||
l0edrr = <112 127>;
|
||||
l1cdrr = <24 27>;
|
||||
l1edrr = <24 27>;
|
||||
};
|
||||
port@6 {
|
||||
port_id = <6>;
|
||||
ucast_queue = <224 239>;
|
||||
mcast_queue = <292 295>;
|
||||
l0sp = <56 59>;
|
||||
l0cdrr = <128 143>;
|
||||
l0edrr = <128 143>;
|
||||
l1cdrr = <28 31>;
|
||||
l1edrr = <28 31>;
|
||||
};
|
||||
port@7 {
|
||||
port_id = <7>;
|
||||
ucast_queue = <240 255>;
|
||||
mcast_queue = <296 299>;
|
||||
l0sp = <60 63>;
|
||||
l0cdrr = <144 159>;
|
||||
l0edrr = <144 159>;
|
||||
l1cdrr = <32 35>;
|
||||
l1edrr = <32 35>;
|
||||
};
|
||||
};
|
||||
port_scheduler_config {
|
||||
port@0 {
|
||||
port_id = <0>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <0 1>; /*L0 SPs*/
|
||||
/*cpri cdrr epri edrr*/
|
||||
cfg = <0 0 0 0>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
/*unicast queues*/
|
||||
ucast_queue = <0 4 8>;
|
||||
/*multicast queues*/
|
||||
mcast_queue = <256 260>;
|
||||
/*sp cpri cdrr epri edrr*/
|
||||
cfg = <0 0 0 0 0>;
|
||||
};
|
||||
group@1 {
|
||||
ucast_queue = <1 5 9>;
|
||||
mcast_queue = <257 261>;
|
||||
cfg = <0 1 1 1 1>;
|
||||
};
|
||||
group@2 {
|
||||
ucast_queue = <2 6 10>;
|
||||
mcast_queue = <258 262>;
|
||||
cfg = <0 2 2 2 2>;
|
||||
};
|
||||
group@3 {
|
||||
ucast_queue = <3 7 11>;
|
||||
mcast_queue = <259 263>;
|
||||
cfg = <0 3 3 3 3>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@1 {
|
||||
port_id = <1>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <36>;
|
||||
cfg = <0 8 0 8>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <37>;
|
||||
cfg = <1 9 1 9>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <144>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <272>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <36 0 48 0 48>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@2 {
|
||||
port_id = <2>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <40>;
|
||||
cfg = <0 12 0 12>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <41>;
|
||||
cfg = <1 13 1 13>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <160>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <276>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <40 0 64 0 64>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@3 {
|
||||
port_id = <3>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <44>;
|
||||
cfg = <0 16 0 16>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <45>;
|
||||
cfg = <1 17 1 17>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <176>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <280>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <44 0 80 0 80>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@4 {
|
||||
port_id = <4>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <48>;
|
||||
cfg = <0 20 0 20>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <49>;
|
||||
cfg = <1 21 1 21>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <192>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <284>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <48 0 96 0 96>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@5 {
|
||||
port_id = <5>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <52>;
|
||||
cfg = <0 24 0 24>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <53>;
|
||||
cfg = <1 25 1 25>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <208>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <288>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <52 0 112 0 112>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@6 {
|
||||
port_id = <6>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <56>;
|
||||
cfg = <0 28 0 28>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <57>;
|
||||
cfg = <1 29 1 29>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <224>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <292>;
|
||||
mcast_loop_pri = <4>;
|
||||
cfg = <56 0 128 0 128>;
|
||||
};
|
||||
};
|
||||
};
|
||||
port@7 {
|
||||
port_id = <7>;
|
||||
l1scheduler {
|
||||
group@0 {
|
||||
sp = <60>;
|
||||
cfg = <0 32 0 32>;
|
||||
};
|
||||
group@1 {
|
||||
sp = <61>;
|
||||
cfg = <1 33 1 33>;
|
||||
};
|
||||
};
|
||||
l0scheduler {
|
||||
group@0 {
|
||||
ucast_queue = <240>;
|
||||
ucast_loop_pri = <16>;
|
||||
mcast_queue = <296>;
|
||||
cfg = <60 0 144 0 144>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
nss-macsec0 {
|
||||
compatible = "qcom,nss-macsec";
|
||||
phy_addr = <0x18>;
|
||||
phy_access_mode = <0>;
|
||||
mdiobus = <&mdio>;
|
||||
};
|
||||
nss-macsec1 {
|
||||
compatible = "qcom,nss-macsec";
|
||||
phy_addr = <0x1c>;
|
||||
phy_access_mode = <0>;
|
||||
mdiobus = <&mdio>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&wifi0 {
|
||||
qcom,board_id = <0x90>;
|
||||
};
|
||||
|
||||
&wifi1 {
|
||||
qcom,board_id = <0x290>;
|
||||
};
|
||||
@@ -39,6 +39,15 @@ define Device/edgecore_oap102
|
||||
endef
|
||||
TARGET_DEVICES += edgecore_oap102
|
||||
|
||||
define Device/edgecore_oap103
|
||||
DEVICE_TITLE := Edgecore OAP103
|
||||
DEVICE_DTS := qcom-ipq807x-oap103
|
||||
DEVICE_DTS_CONFIG=config@ac02
|
||||
SUPPORTED_DEVICES := edgecore,oap103
|
||||
DEVICE_PACKAGES := ath11k-wifi-edgecore-oap103 kmod-usb2 kmod-usb3 uboot-envtools
|
||||
endef
|
||||
TARGET_DEVICES += edgecore_oap103
|
||||
|
||||
define Device/edgecore_eap106
|
||||
DEVICE_TITLE := Edgecore EAP106
|
||||
DEVICE_DTS := qcom-ipq807x-eap106
|
||||
@@ -48,6 +57,17 @@ define Device/edgecore_eap106
|
||||
endef
|
||||
#TARGET_DEVICES += edgecore_eap106
|
||||
|
||||
define Device/sonicfi_rap650c
|
||||
DEVICE_TITLE := SonicFi RAP650C
|
||||
DEVICE_DTS := qcom-ipq807x-rap650c
|
||||
DEVICE_DTS_CONFIG=config@hk09
|
||||
SUPPORTED_DEVICES := sonicfi,rap650c
|
||||
DEVICE_PACKAGES := ath11k-wifi-sonicfi-rap650c uboot-envtools
|
||||
IMAGES := sysupgrade.tar nand-factory.bin nand-factory.ubi
|
||||
IMAGE/nand-factory.ubi := append-ubi
|
||||
endef
|
||||
TARGET_DEVICES += sonicfi_rap650c
|
||||
|
||||
define Device/tplink_ex227
|
||||
DEVICE_TITLE := TP-Link EX227
|
||||
DEVICE_DTS := qcom-ipq807x-ex227
|
||||
|
||||
@@ -1,48 +1,113 @@
|
||||
--- a/drivers/net/wireless/ath/ath11k/peer.c
|
||||
+++ b/drivers/net/wireless/ath/ath11k/peer.c
|
||||
@@ -93,6 +93,25 @@ struct ath11k_peer *ath11k_peer_find_by_
|
||||
return NULL;
|
||||
}
|
||||
Index: backports-20210222_001-5.4.164-b157d2276/drivers/net/wireless/ath/ath11k/peer.c
|
||||
===================================================================
|
||||
--- backports-20210222_001-5.4.164-b157d2276.orig/drivers/net/wireless/ath/ath11k/peer.c
|
||||
+++ backports-20210222_001-5.4.164-b157d2276/drivers/net/wireless/ath/ath11k/peer.c
|
||||
@@ -789,8 +789,6 @@ int ath11k_peer_delete(struct ath11k *ar
|
||||
#endif
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
||||
+struct ath11k_peer *ath11k_peer_find_by_pdev_idx(struct ath11k_base *ab,
|
||||
+ u8 pdev_idx, const u8 *addr)
|
||||
+{
|
||||
+ struct ath11k_peer *peer;
|
||||
- reinit_completion(&ar->peer_delete_done);
|
||||
-
|
||||
ath11k_nss_peer_delete(ar->ab, vdev_id, addr);
|
||||
#ifdef CCPTCFG_ATH11K_NSS_SUPPORTPTCFG_ATH11K_NSS_SUPPORT
|
||||
mutex_lock(&ar->ab->base_ast_lock);
|
||||
@@ -799,33 +797,60 @@ int ath11k_peer_delete(struct ath11k *ar
|
||||
spin_lock_bh(&ar->ab->base_lock);
|
||||
|
||||
peer = ath11k_peer_find_by_addr(ar->ab, addr);
|
||||
- if (peer) {
|
||||
+ /* Check if the found peer is what we want to remove.
|
||||
+ * While the sta is transitioning to another band we may
|
||||
+ * have 2 peer with the same addr assigned to different
|
||||
+ * vdev_id. Make sure we are deleting the correct peer.
|
||||
+ */
|
||||
+ if (peer && peer->vdev_id == vdev_id)
|
||||
+ ath11k_peer_rhash_delete(ar->ab, peer);
|
||||
+
|
||||
+ lockdep_assert_held(&ab->base_lock);
|
||||
+ /* Fallback to peer list search if the correct peer can't be found.
|
||||
+ * Skip the deletion of the peer from the rhash since it has already
|
||||
+ * been deleted in peer add.
|
||||
+ */
|
||||
+ if (!peer)
|
||||
+ peer = ath11k_peer_find(ar->ab, vdev_id, addr);
|
||||
+
|
||||
+ list_for_each_entry(peer, &ab->peers, list) {
|
||||
+ if (peer->pdev_idx != pdev_idx)
|
||||
+ continue;
|
||||
+ if (!ether_addr_equal(peer->addr, addr))
|
||||
+ continue;
|
||||
+
|
||||
+ return peer;
|
||||
+ if (!peer) {
|
||||
+ spin_unlock_bh(&ar->ab->base_lock);
|
||||
+ mutex_unlock(&ar->ab->tbl_mtx_lock);
|
||||
#ifdef CPTCFG_ATH11K_NSS_SUPPORT
|
||||
- peer->delete_in_progress = true;
|
||||
- if (peer->self_ast_entry) {
|
||||
- ath11k_peer_del_ast(ar, peer->self_ast_entry);
|
||||
- peer->self_ast_entry = NULL;
|
||||
- }
|
||||
+ mutex_unlock(&ar->ab->base_ast_lock);
|
||||
+#endif
|
||||
+ ath11k_warn(ar->ab,
|
||||
+ "failed to find peer vdev_id %d addr %pM in delete\n",
|
||||
+ vdev_id, addr);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+#ifdef CPTCFG_ATH11K_NSS_SUPPORT
|
||||
+ peer->delete_in_progress = true;
|
||||
+ if (peer->self_ast_entry) {
|
||||
+ ath11k_peer_del_ast(ar, peer->self_ast_entry);
|
||||
+ peer->self_ast_entry = NULL;
|
||||
+ }
|
||||
|
||||
- list_for_each_entry_safe(ast_entry, tmp_ast,
|
||||
- &peer->ast_entry_list, ase_list)
|
||||
- if ((ast_entry->type == ATH11K_AST_TYPE_WDS) ||
|
||||
- (ast_entry->type == ATH11K_AST_TYPE_MEC)) {
|
||||
- if (!list_empty(&ast_entry->wmi_list)) {
|
||||
- ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
|
||||
- "%s deleting unprocessed ast entry %pM of peer %pM from wmi list\n",
|
||||
- __func__, ast_entry->addr, addr);
|
||||
- list_del_init(&ast_entry->wmi_list);
|
||||
- }
|
||||
+ list_for_each_entry_safe(ast_entry, tmp_ast,
|
||||
+ &peer->ast_entry_list, ase_list)
|
||||
+ if ((ast_entry->type == ATH11K_AST_TYPE_WDS) ||
|
||||
+ (ast_entry->type == ATH11K_AST_TYPE_MEC)) {
|
||||
+ if (!list_empty(&ast_entry->wmi_list)) {
|
||||
+ ath11k_dbg(ar->ab, ATH11K_DBG_MAC,
|
||||
+ "%s deleting unprocessed ast entry %pM of peer %pM from wmi list\n",
|
||||
+ __func__, ast_entry->addr, addr);
|
||||
+ list_del_init(&ast_entry->wmi_list);
|
||||
}
|
||||
+ }
|
||||
#endif
|
||||
- ath11k_peer_rhash_delete(ar->ab, peer);
|
||||
- }
|
||||
spin_unlock_bh(&ar->ab->base_lock);
|
||||
mutex_unlock(&ar->ab->tbl_mtx_lock);
|
||||
#ifdef CPTCFG_ATH11K_NSS_SUPPORT
|
||||
mutex_unlock(&ar->ab->base_ast_lock);
|
||||
#endif
|
||||
+ reinit_completion(&ar->peer_delete_done);
|
||||
+
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
struct ath11k_peer *ath11k_peer_find_by_ast(struct ath11k_base *ab,
|
||||
int ast_hash)
|
||||
{
|
||||
@@ -867,13 +886,21 @@ int ath11k_peer_create(struct ath11k *ar
|
||||
ret = ath11k_wmi_send_peer_delete_cmd(ar, addr, vdev_id);
|
||||
if (ret) {
|
||||
ath11k_warn(ar->ab,
|
||||
@@ -866,14 +891,20 @@ int ath11k_peer_create(struct ath11k *ar
|
||||
"failed to create peer due to insufficient peer entry resource in firmware\n");
|
||||
return -ENOBUFS;
|
||||
}
|
||||
|
||||
-
|
||||
+ mutex_lock(&ar->ab->tbl_mtx_lock);
|
||||
spin_lock_bh(&ar->ab->base_lock);
|
||||
- peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr);
|
||||
+ peer = ath11k_peer_find_by_pdev_idx(ar->ab, ar->pdev_idx, param->peer_addr);
|
||||
peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr);
|
||||
if (peer) {
|
||||
spin_unlock_bh(&ar->ab->base_lock);
|
||||
+ mutex_unlock(&ar->ab->tbl_mtx_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
+
|
||||
+ peer = ath11k_peer_find_by_addr(ar->ab, param->peer_addr);
|
||||
+ if (peer)
|
||||
- spin_unlock_bh(&ar->ab->base_lock);
|
||||
- return -EINVAL;
|
||||
+ if (peer->vdev_id == param->vdev_id) {
|
||||
+ spin_unlock_bh(&ar->ab->base_lock);
|
||||
+ mutex_unlock(&ar->ab->tbl_mtx_lock);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ ath11k_peer_rhash_delete(ar->ab, peer);
|
||||
}
|
||||
+
|
||||
spin_unlock_bh(&ar->ab->base_lock);
|
||||
+ mutex_unlock(&ar->ab->tbl_mtx_lock);
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
From 93d02017c444d9bcb5e319ba6d9dac5794529cdd Mon Sep 17 00:00:00 2001
|
||||
From: Venkat Chimata <venkata@shasta.cloud>
|
||||
Date: Fri, 19 Jul 2024 18:43:19 +0530
|
||||
Subject: [PATCH] mac80211: workaround: Send multicast frames as multiple
|
||||
unicast frames in DVLAN mode
|
||||
|
||||
Broadcast / Multciast transmission is not working in DVLAN mode in the driver.
|
||||
If we send the frames as unicast frames, it works. This is a workaround for now.
|
||||
Need to rollback once we add a clean fix.
|
||||
|
||||
Signed-off-by: Venkat Chimata <venkata@shasta.cloud>
|
||||
---
|
||||
net/mac80211/tx.c | 7 ++-----
|
||||
1 file changed, 2 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
|
||||
index 9e978f9..6ebf9c2 100644
|
||||
--- a/net/mac80211/tx.c
|
||||
+++ b/net/mac80211/tx.c
|
||||
@@ -4197,11 +4197,8 @@ static bool ieee80211_multicast_to_unicast(struct sk_buff *skb,
|
||||
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_AP_VLAN:
|
||||
- if (sdata->u.vlan.sta)
|
||||
- return false;
|
||||
- if (sdata->wdev.use_4addr)
|
||||
- return false;
|
||||
- fallthrough;
|
||||
+ // For now always enable multicast_to_unicast in DVLAN
|
||||
+ return true;
|
||||
case NL80211_IFTYPE_AP:
|
||||
/* check runtime toggle for this bss */
|
||||
if (!sdata->bss->multicast_to_unicast)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
--- a/include/net/cfg80211.h
|
||||
+++ b/include/net/cfg80211.h
|
||||
@@ -543,6 +543,9 @@ ieee80211_get_sband_iftype_data(const st
|
||||
if (WARN_ON(iftype >= NL80211_IFTYPE_MAX))
|
||||
return NULL;
|
||||
|
||||
+ if (iftype == NL80211_IFTYPE_AP_VLAN)
|
||||
+ iftype = NL80211_IFTYPE_AP;
|
||||
+
|
||||
for (i = 0; i < sband->n_iftype_data; i++) {
|
||||
const struct ieee80211_sband_iftype_data *data =
|
||||
&sband->iftype_data[i];
|
||||
@@ -1,37 +0,0 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ath11k-firmware
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_BRANCH:=main
|
||||
PKG_SOURCE_URL:=https://github.com/quic/upstream-wifi-fw.git
|
||||
PKG_MIRROR_HASH:=557505744764b0442c887be3f5bb0ce924323d785b6d207899f19fad992a6020
|
||||
PKG_SOURCE_VERSION:=3417bb86645c5ff4c58258db7cc33e43260b4222
|
||||
|
||||
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/ath11k-firmware-default
|
||||
SECTION:=firmware
|
||||
CATEGORY:=Firmware
|
||||
URL:=$(PKG_SOURCE_URL)
|
||||
DEPENDS:=
|
||||
endef
|
||||
|
||||
define Package/ath11k-firmware-ipq95xx
|
||||
$(Package/ath11k-firmware-default)
|
||||
TITLE:=ath11k firmware for IPQ95xx devices
|
||||
DEPENDS:=@TARGET_ipq95xx
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
|
||||
endef
|
||||
|
||||
define Package/ath11k-firmware-ipq95xx/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/IPQ9574/
|
||||
$(INSTALL_DATA) $(PKG_BUILD_DIR)/ath11k-firmware/IPQ9574/hw1.0/2.9.0.1/WLAN.HK.2.9.0.1-01890-QCAHKSWPL_SILICONZ-1/* \
|
||||
$(1)/lib/firmware/IPQ9574/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,ath11k-firmware-ipq95xx))
|
||||
@@ -1,36 +0,0 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/version.mk
|
||||
|
||||
PKG_NAME:=ath11k-wifi
|
||||
PKG_RELEASE:=1
|
||||
PKG_FLAGS:=nonshared
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Build/Prepare
|
||||
mkdir -p $(PKG_BUILD_DIR)
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
|
||||
endef
|
||||
|
||||
define Package/ath11k-wifi-default
|
||||
SUBMENU:=ath11k Board-Specific Overrides
|
||||
SECTION:=firmware
|
||||
CATEGORY:=Firmware
|
||||
DEPENDS:=@TARGET_ipq95xx
|
||||
TITLE:=Custom Board
|
||||
endef
|
||||
|
||||
define Package/ath11k-wifi-qcom-ipq95xx
|
||||
$(call Package/ath11k-wifi-default)
|
||||
TITLE:=board-2.bin for QCOM IPQ9574 eval kits
|
||||
endef
|
||||
|
||||
define Package/ath11k-wifi-qcom-ipq95xx/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath11k/IPQ9574/hw1.0/
|
||||
$(INSTALL_DATA) ./board-2.bin.IPQ9574 $(1)/lib/firmware/ath11k/IPQ9574/hw1.0/board-2.bin
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,ath11k-wifi-qcom-ipq95xx))
|
||||
Binary file not shown.
@@ -1,76 +0,0 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=ath12k-firmware
|
||||
PKG_MIRROR_HASH:=a325f86b1d613f713d2e015abca4a9ff86c8448d4cd540fa022866da2c5aa042
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_BRANCH:=main
|
||||
PKG_SOURCE_URL:=https://github.com/quic/upstream-wifi-fw.git
|
||||
PKG_SOURCE_VERSION:=e90d32aaa149800ea79760639cb5ac9ddcfc8281
|
||||
|
||||
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/ath12k-firmware-default
|
||||
SECTION:=firmware
|
||||
CATEGORY:=Firmware
|
||||
URL:=$(PKG_SOURCE_URL)
|
||||
DEPENDS:=
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-qcn92xx-split-phy
|
||||
$(Package/ath12k-firmware-default)
|
||||
TITLE:=ath12k firmware for qcn92xx split phy devices
|
||||
DEPENDS:=@(TARGET_ipq95xx||TARGET_ipq53xx)
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-qcn92xx
|
||||
$(Package/ath12k-firmware-default)
|
||||
TITLE:=ath12k firmware for qcn92xx devices
|
||||
DEPENDS:=@(TARGET_ipq95xx||TARGET_ipq53xx)
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-ipq53xx
|
||||
$(Package/ath12k-firmware-default)
|
||||
TITLE:=ath12k firmware for ipq53xx devices
|
||||
DEPENDS:=@TARGET_ipq53xx
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-ipq53xx-wk-wk
|
||||
$(Package/ath12k-firmware-default)
|
||||
TITLE:=ath12k firmware for ipq53xx + wk + wk devices
|
||||
DEPENDS:=@TARGET_ipq53xx
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-qcn92xx-split-phy/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0
|
||||
$(CP) $(PKG_BUILD_DIR)/ath12k-firmware/QCN9274/hw2.0_split_phy/1.2.1/WLAN.WBE.1.2.1-00148-QCAHKSWPL_SILICONZ-1/* \
|
||||
$(1)/lib/firmware/ath12k/QCN92XX/hw1.0
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-qcn92xx/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0
|
||||
$(CP) $(PKG_BUILD_DIR)/ath12k-firmware/QCN9274/hw2.0/1.2.1/WLAN.WBE.1.2.1-00201-QCAHKSWPL_SILICONZ-1/* \
|
||||
$(1)/lib/firmware/ath12k/QCN92XX/hw1.0
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-ipq53xx/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/IPQ5332/
|
||||
$(CP) $(PKG_BUILD_DIR)/ath12k-firmware//IPQ5322/hw1.0/1.2.1/WLAN.WBE.1.2.1-00201-QCAHKSWPL_SILICONZ-1/* \
|
||||
$(1)/lib/firmware/IPQ5332/
|
||||
endef
|
||||
|
||||
define Package/ath12k-firmware-ipq53xx-wk-wk/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/IPQ5332/
|
||||
$(CP) $(PKG_BUILD_DIR)/ath12k-firmware/IPQ5322_QCN6432_QCN6432/hw1.0/testing/1.3/WLAN.WBE.1.3-02907-QCAHKSWPL_SILICONZ-1/* \
|
||||
$(1)/lib/firmware/IPQ5332/
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,ath12k-firmware-qcn92xx))
|
||||
$(eval $(call BuildPackage,ath12k-firmware-qcn92xx-split-phy))
|
||||
$(eval $(call BuildPackage,ath12k-firmware-ipq53xx))
|
||||
$(eval $(call BuildPackage,ath12k-firmware-ipq53xx-wk-wk))
|
||||
@@ -1,78 +0,0 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
include $(INCLUDE_DIR)/version.mk
|
||||
|
||||
PKG_NAME:=ath12k-wifi
|
||||
PKG_RELEASE:=1
|
||||
PKG_FLAGS:=nonshared
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Build/Prepare
|
||||
mkdir -p $(PKG_BUILD_DIR)
|
||||
endef
|
||||
|
||||
define Build/Compile
|
||||
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-default
|
||||
SUBMENU:=ath12k Board-Specific Overrides
|
||||
SECTION:=firmware
|
||||
CATEGORY:=Firmware
|
||||
DEPENDS:=@(TARGET_qcn9274||TARGET_ipq53xx)
|
||||
TITLE:=Custom Board
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-qcom-qcn9274
|
||||
$(call Package/ath12k-wifi-default)
|
||||
TITLE:=board-2.bin for QCOM QCN9274 eval kits
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-qcom-qcn9274/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN9274/hw1.0/
|
||||
$(INSTALL_DATA) ./board-2.bin.QCN9274 $(1)/lib/firmware/ath12k/QCN9274/hw1.0/board-2.bin
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-cig-wf189
|
||||
$(call Package/ath12k-wifi-default)
|
||||
TITLE:=board.bin for CIG WF189
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-edgecore-eap105
|
||||
$(call Package/ath12k-wifi-default)
|
||||
TITLE:=board.bin for Edgecore EAP105
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-sercomm-ap72tip
|
||||
$(call Package/ath12k-wifi-default)
|
||||
TITLE:=board.bin for Sercomm WIFI-7
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-cig-wf189/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0
|
||||
$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/
|
||||
$(INSTALL_DATA) ./board-cig-wf189.bin.qcn9224 $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/board.bin
|
||||
$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
|
||||
$(INSTALL_DATA) ./board-cig-wf189.bin.ipq53xx $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board.bin
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-edgecore-eap105/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0
|
||||
$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/
|
||||
$(INSTALL_DATA) ./board-edgecore-eap105.bin.qcn9224 $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/board.bin
|
||||
$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
|
||||
$(INSTALL_DATA) ./board-edgecore-eap105.bin.ipq53xx $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board.bin
|
||||
endef
|
||||
|
||||
define Package/ath12k-wifi-sercomm-ap72tip/install
|
||||
$(INSTALL_DIR) $(1)/lib/firmware/ath12k/QCN92XX/hw1.0 $(1)/lib/firmware/ath12k/IPQ5332/hw1.0
|
||||
$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/
|
||||
$(INSTALL_DATA) ./board-sercomm-ap72tip.bin.qcn9224 $(1)/lib/firmware/ath12k/QCN92XX/hw1.0/board.bin
|
||||
$(INSTALL_DATA) ./regdb.bin $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/
|
||||
$(INSTALL_DATA) ./board-sercomm-ap72tip.bin.ipq53xx $(1)/lib/firmware/ath12k/IPQ5332/hw1.0/board.bin
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,ath12k-wifi-qcom-qcn9274))
|
||||
$(eval $(call BuildPackage,ath12k-wifi-cig-wf189))
|
||||
$(eval $(call BuildPackage,ath12k-wifi-edgecore-eap105))
|
||||
$(eval $(call BuildPackage,ath12k-wifi-sercomm-ap72tip))
|
||||
Binary file not shown.
@@ -1,88 +0,0 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Copyright (C) 2007-2019 B.A.T.M.A.N. contributors:
|
||||
#
|
||||
# Marek Lindner, Simon Wunderlich
|
||||
|
||||
#
|
||||
# B.A.T.M.A.N meshing protocol
|
||||
#
|
||||
|
||||
config BATMAN_ADV_BATMAN_V
|
||||
bool "B.A.T.M.A.N. V protocol"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
help
|
||||
This option enables the B.A.T.M.A.N. V protocol, the successor
|
||||
of the currently used B.A.T.M.A.N. IV protocol. The main
|
||||
changes include splitting of the OGM protocol into a neighbor
|
||||
discovery protocol (Echo Location Protocol, ELP) and a new OGM
|
||||
Protocol OGMv2 for flooding protocol information through the
|
||||
network, as well as a throughput based metric.
|
||||
B.A.T.M.A.N. V is currently considered experimental and not
|
||||
compatible to B.A.T.M.A.N. IV networks.
|
||||
|
||||
config BATMAN_ADV_BLA
|
||||
bool "Bridge Loop Avoidance"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
select PACKAGE_kmod-lib-crc16
|
||||
default y
|
||||
help
|
||||
This option enables BLA (Bridge Loop Avoidance), a mechanism
|
||||
to avoid Ethernet frames looping when mesh nodes are connected
|
||||
to both the same LAN and the same mesh. If you will never use
|
||||
more than one mesh node in the same LAN, you can safely remove
|
||||
this feature and save some space.
|
||||
|
||||
config BATMAN_ADV_DAT
|
||||
bool "Distributed ARP Table"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
help
|
||||
This option enables DAT (Distributed ARP Table), a DHT based
|
||||
mechanism that increases ARP reliability on sparse wireless
|
||||
mesh networks. If you think that your network does not need
|
||||
this option you can safely remove it and save some space.
|
||||
|
||||
config BATMAN_ADV_NC
|
||||
bool "Network Coding"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
help
|
||||
This option enables network coding, a mechanism that aims to
|
||||
increase the overall network throughput by fusing multiple
|
||||
packets in one transmission.
|
||||
Note that interfaces controlled by batman-adv must be manually
|
||||
configured to have promiscuous mode enabled in order to make
|
||||
network coding work.
|
||||
If you think that your network does not need this feature you
|
||||
can safely disable it and save some space.
|
||||
|
||||
config BATMAN_ADV_MCAST
|
||||
bool "Multicast optimisation"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
default y
|
||||
help
|
||||
This option enables the multicast optimisation which aims to
|
||||
reduce the air overhead while improving the reliability of
|
||||
multicast messages.
|
||||
|
||||
config BATMAN_ADV_DEBUG
|
||||
bool "B.A.T.M.A.N. debugging"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
help
|
||||
This is an option for use by developers; most people should
|
||||
say N here. This enables compilation of support for
|
||||
outputting debugging information to the debugfs log or tracing
|
||||
buffer. The output is controlled via the batadv netdev specific
|
||||
log_level setting.
|
||||
|
||||
config BATMAN_ADV_TRACING
|
||||
bool "B.A.T.M.A.N. tracing support"
|
||||
depends on PACKAGE_kmod-batman-adv
|
||||
select KERNEL_FTRACE
|
||||
select KERNEL_ENABLE_DEFAULT_TRACERS
|
||||
help
|
||||
This is an option for use by developers; most people should
|
||||
say N here. Select this option to gather traces like the debug
|
||||
messages using the generic tracing infrastructure of the kernel.
|
||||
BATMAN_ADV_DEBUG must also be selected to get trace events for
|
||||
batadv_dbg.
|
||||
@@ -1,101 +0,0 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=batman-adv
|
||||
PKG_VERSION:=2022.0
|
||||
PKG_RELEASE:=$(AUTORELEASE)
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://downloads.open-mesh.org/batman/releases/batman-adv-$(PKG_VERSION)
|
||||
PKG_HASH:=49338705bc207709ac84d766688e702571009c827c0a320788ea51fb887714aa
|
||||
PKG_EXTMOD_SUBDIRS:=net/batman-adv
|
||||
|
||||
PKG_MAINTAINER:=Simon Wunderlich <sw@simonwunderlich.de>
|
||||
PKG_LICENSE:=GPL-2.0-only MIT
|
||||
PKG_LICENSE_FILES:=LICENSES/preferred/GPL-2.0 LICENSES/preferred/MIT
|
||||
|
||||
PKG_BUILD_PARALLEL:=1
|
||||
|
||||
STAMP_CONFIGURED_DEPENDS := $(STAGING_DIR)/usr/include/mac80211-backport/backport/autoconf.h
|
||||
|
||||
PKG_CONFIG_DEPENDS += \
|
||||
CONFIG_BATMAN_ADV_BATMAN_V \
|
||||
CONFIG_BATMAN_ADV_BLA \
|
||||
CONFIG_BATMAN_ADV_DAT \
|
||||
CONFIG_BATMAN_ADV_NC \
|
||||
CONFIG_BATMAN_ADV_MCAST \
|
||||
CONFIG_BATMAN_ADV_DEBUG \
|
||||
CONFIG_BATMAN_ADV_TRACING
|
||||
|
||||
include $(INCLUDE_DIR)/kernel.mk
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define KernelPackage/batman-adv
|
||||
SUBMENU:=Network Support
|
||||
TITLE:=B.A.T.M.A.N. Adv
|
||||
URL:=https://www.open-mesh.org/
|
||||
DEPENDS:=+BATMAN_ADV_BLA:kmod-lib-crc16 +kmod-lib-crc32c +kmod-cfg80211 +batctl
|
||||
FILES:=$(PKG_BUILD_DIR)/net/batman-adv/batman-adv.$(LINUX_KMOD_SUFFIX)
|
||||
AUTOLOAD:=$(call AutoProbe,batman-adv)
|
||||
endef
|
||||
|
||||
define KernelPackage/batman-adv/description
|
||||
B.A.T.M.A.N. (better approach to mobile ad-hoc networking) is
|
||||
a routing protocol for multi-hop ad-hoc mesh networks. The
|
||||
networks may be wired or wireless. See
|
||||
https://www.open-mesh.org/ for more information and user space
|
||||
tools. This package builds version $(PKG_VERSION) of the kernel
|
||||
module.
|
||||
endef
|
||||
|
||||
define KernelPackage/batman-adv/config
|
||||
source "$(SOURCE)/Config.in"
|
||||
endef
|
||||
|
||||
define Package/kmod-batman-adv/conffiles
|
||||
/etc/config/batman-adv
|
||||
endef
|
||||
|
||||
PKG_EXTRA_KCONFIG:= \
|
||||
CONFIG_BATMAN_ADV=m \
|
||||
CONFIG_BATMAN_ADV_DEBUG=$(if $(CONFIG_BATMAN_ADV_DEBUG),y,n) \
|
||||
CONFIG_BATMAN_ADV_BLA=$(if $(CONFIG_BATMAN_ADV_BLA),y,n) \
|
||||
CONFIG_BATMAN_ADV_DAT=$(if $(CONFIG_BATMAN_ADV_DAT),y,n) \
|
||||
CONFIG_BATMAN_ADV_MCAST=$(if $(CONFIG_BATMAN_ADV_MCAST),y,n) \
|
||||
CONFIG_BATMAN_ADV_NC=$(if $(CONFIG_BATMAN_ADV_NC),y,n) \
|
||||
CONFIG_BATMAN_ADV_BATMAN_V=$(if $(CONFIG_BATMAN_ADV_BATMAN_V),y,n) \
|
||||
CONFIG_BATMAN_ADV_TRACING=$(if $(CONFIG_BATMAN_ADV_TRACING),y,n) \
|
||||
|
||||
PKG_EXTRA_CFLAGS:= \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(PKG_EXTRA_KCONFIG)))) \
|
||||
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(PKG_EXTRA_KCONFIG)))) \
|
||||
|
||||
NOSTDINC_FLAGS = \
|
||||
$(KERNEL_NOSTDINC_FLAGS) \
|
||||
-I$(PKG_BUILD_DIR)/net/batman-adv \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211-backport \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211-backport/uapi \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211 \
|
||||
-I$(STAGING_DIR)/usr/include/mac80211/uapi \
|
||||
-I$(PKG_BUILD_DIR)/include/ \
|
||||
-include backport/autoconf.h \
|
||||
-include backport/backport.h \
|
||||
-include $(PKG_BUILD_DIR)/compat-hacks.h \
|
||||
-DBATADV_SOURCE_VERSION=\\\"$(PKG_VERSION)-openwrt-$(PKG_RELEASE)\\\"
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) $(PKG_JOBS) -C "$(LINUX_DIR)" \
|
||||
$(KERNEL_MAKE_FLAGS) \
|
||||
M="$(PKG_BUILD_DIR)/net/batman-adv" \
|
||||
$(PKG_EXTRA_KCONFIG) \
|
||||
EXTRA_CFLAGS="$(PKG_EXTRA_CFLAGS)" \
|
||||
NOSTDINC_FLAGS="$(NOSTDINC_FLAGS)" \
|
||||
modules
|
||||
endef
|
||||
|
||||
define KernelPackage/batman-adv/install
|
||||
$(CP) ./files/. $(1)/
|
||||
endef
|
||||
|
||||
$(eval $(call KernelPackage,batman-adv))
|
||||
@@ -1,97 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This UCI-Defaults script will split the batadv proto network interfaces
|
||||
# in batadv_hardif and batadv proto. The configuration options from
|
||||
# /etc/config/batman-adv will be moved to the latter.
|
||||
|
||||
. /lib/functions.sh
|
||||
|
||||
proto_batadv_to_batadv_hardif() {
|
||||
local section="$1"
|
||||
local proto
|
||||
local mesh
|
||||
local routing_algo
|
||||
|
||||
config_get proto "${section}" proto
|
||||
config_get mesh "${section}" mesh
|
||||
config_get routing_algo "${section}" routing_algo
|
||||
|
||||
if [ -z "$mesh" -o "${proto}" != "batadv" ]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
uci set network."${section}".proto="batadv_hardif"
|
||||
uci rename network."${section}".mesh="master"
|
||||
uci delete network."${section}".routing_algo
|
||||
|
||||
# create new section or adjust existing one
|
||||
uci set network."${mesh}"=interface
|
||||
uci set network."${mesh}".proto=batadv
|
||||
[ -n "${routing_algo}" ] && uci set network."${mesh}".routing_algo="${routing_algo}"
|
||||
}
|
||||
|
||||
mv_batadv_config_section() {
|
||||
local section="$1"
|
||||
local aggregated_ogms
|
||||
local ap_isolation
|
||||
local bonding
|
||||
local bridge_loop_avoidance
|
||||
local distributed_arp_table
|
||||
local fragmentation
|
||||
local gw_bandwidth
|
||||
local gw_mode
|
||||
local gw_sel_class
|
||||
local hop_penalty
|
||||
local isolation_mark
|
||||
local log_level
|
||||
local multicast_mode
|
||||
local network_coding
|
||||
local orig_interval
|
||||
|
||||
config_get aggregated_ogms "${section}" aggregated_ogms
|
||||
config_get ap_isolation "${section}" ap_isolation
|
||||
config_get bonding "${section}" bonding
|
||||
config_get bridge_loop_avoidance "${section}" bridge_loop_avoidance
|
||||
config_get distributed_arp_table "${section}" distributed_arp_table
|
||||
config_get fragmentation "${section}" fragmentation
|
||||
config_get gw_bandwidth "${section}" gw_bandwidth
|
||||
config_get gw_mode "${section}" gw_mode
|
||||
config_get gw_sel_class "${section}" gw_sel_class
|
||||
config_get hop_penalty "${section}" hop_penalty
|
||||
config_get isolation_mark "${section}" isolation_mark
|
||||
config_get log_level "${section}" log_level
|
||||
config_get multicast_mode "${section}" multicast_mode
|
||||
config_get network_coding "${section}" network_coding
|
||||
config_get orig_interval "${section}" orig_interval
|
||||
|
||||
# update section in case it exists
|
||||
[ -n "${aggregated_ogms}" ] && uci set network."${section}".aggregated_ogms="${aggregated_ogms}"
|
||||
[ -n "${ap_isolation}" ] && uci set network."${section}".ap_isolation="${ap_isolation}"
|
||||
[ -n "${bonding}" ] && uci set network."${section}".bonding="${bonding}"
|
||||
[ -n "${bridge_loop_avoidance}" ] && uci set network."${section}".bridge_loop_avoidance="${bridge_loop_avoidance}"
|
||||
[ -n "${distributed_arp_table}" ] && uci set network."${section}".distributed_arp_table="${distributed_arp_table}"
|
||||
[ -n "${fragmentation}" ] && uci set network."${section}".fragmentation="${fragmentation}"
|
||||
[ -n "${gw_bandwidth}" ] && uci set network."${section}".gw_bandwidth="${gw_bandwidth}"
|
||||
[ -n "${gw_mode}" ] && uci set network."${section}".gw_mode="${gw_mode}"
|
||||
[ -n "${gw_sel_class}" ] && uci set network."${section}".gw_sel_class="${gw_sel_class}"
|
||||
[ -n "${hop_penalty}" ] && uci set network."${section}".hop_penalty="${hop_penalty}"
|
||||
[ -n "${isolation_mark}" ] && uci set network."${section}".isolation_mark="${isolation_mark}"
|
||||
[ -n "${log_level}" ] && uci set network."${section}".log_level="${log_level}"
|
||||
[ -n "${multicast_mode}" ] && uci set network."${section}".multicast_mode="${multicast_mode}"
|
||||
[ -n "${network_coding}" ] && uci set network."${section}".network_coding="${network_coding}"
|
||||
[ -n "${orig_interval}" ] && uci set network."${section}".orig_interval="${orig_interval}"
|
||||
}
|
||||
|
||||
if [ -f /etc/config/batman-adv ]; then
|
||||
config_load network
|
||||
config_foreach proto_batadv_to_batadv_hardif 'interface'
|
||||
uci commit network
|
||||
|
||||
config_load batman-adv
|
||||
config_foreach mv_batadv_config_section 'mesh'
|
||||
uci commit network
|
||||
|
||||
rm -f /etc/config/batman-adv
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -1,123 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ -n "$INCLUDE_ONLY" ] || {
|
||||
. /lib/functions.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
}
|
||||
|
||||
proto_batadv_init_config() {
|
||||
no_device=1
|
||||
available=1
|
||||
|
||||
proto_config_add_boolean 'aggregated_ogms:bool'
|
||||
proto_config_add_boolean 'ap_isolation:bool'
|
||||
proto_config_add_boolean 'bonding:bool'
|
||||
proto_config_add_boolean 'bridge_loop_avoidance:bool'
|
||||
proto_config_add_boolean 'distributed_arp_table:bool'
|
||||
proto_config_add_boolean 'fragmentation:bool'
|
||||
proto_config_add_string 'gw_bandwidth'
|
||||
proto_config_add_string 'gw_mode'
|
||||
proto_config_add_int 'gw_sel_class'
|
||||
proto_config_add_int 'hop_penalty'
|
||||
proto_config_add_string 'isolation_mark'
|
||||
proto_config_add_string 'log_level'
|
||||
proto_config_add_int 'multicast_fanout'
|
||||
proto_config_add_boolean 'multicast_mode:bool'
|
||||
proto_config_add_boolean 'network_coding:bool'
|
||||
proto_config_add_int 'orig_interval'
|
||||
proto_config_add_string 'routing_algo'
|
||||
}
|
||||
|
||||
proto_batadv_setup() {
|
||||
local config="$1"
|
||||
local iface="$config"
|
||||
|
||||
local aggregated_ogms
|
||||
local ap_isolation
|
||||
local bonding
|
||||
local bridge_loop_avoidance
|
||||
local distributed_arp_table
|
||||
local fragmentation
|
||||
local gw_bandwidth
|
||||
local gw_mode
|
||||
local gw_sel_class
|
||||
local hop_penalty
|
||||
local isolation_mark
|
||||
local log_level
|
||||
local multicast_fanout
|
||||
local multicast_mode
|
||||
local network_coding
|
||||
local orig_interval
|
||||
local routing_algo
|
||||
|
||||
json_get_vars aggregated_ogms
|
||||
json_get_vars ap_isolation
|
||||
json_get_vars bonding
|
||||
json_get_vars bridge_loop_avoidance
|
||||
json_get_vars distributed_arp_table
|
||||
json_get_vars fragmentation
|
||||
json_get_vars gw_bandwidth
|
||||
json_get_vars gw_mode
|
||||
json_get_vars gw_sel_class
|
||||
json_get_vars hop_penalty
|
||||
json_get_vars isolation_mark
|
||||
json_get_vars log_level
|
||||
json_get_vars multicast_fanout
|
||||
json_get_vars multicast_mode
|
||||
json_get_vars network_coding
|
||||
json_get_vars orig_interval
|
||||
json_get_vars routing_algo
|
||||
|
||||
set_default routing_algo 'BATMAN_IV'
|
||||
|
||||
batctl routing_algo "$routing_algo"
|
||||
batctl meshif "$iface" interface create
|
||||
|
||||
[ -n "$aggregated_ogms" ] && batctl meshif "$iface" aggregation "$aggregated_ogms"
|
||||
[ -n "$ap_isolation" ] && batctl meshif "$iface" ap_isolation "$ap_isolation"
|
||||
[ -n "$bonding" ] && batctl meshif "$iface" bonding "$bonding"
|
||||
[ -n "$bridge_loop_avoidance" ] && batctl meshif "$iface" bridge_loop_avoidance "$bridge_loop_avoidance" 2>&-
|
||||
[ -n "$distributed_arp_table" ] && batctl meshif "$iface" distributed_arp_table "$distributed_arp_table" 2>&-
|
||||
[ -n "$fragmentation" ] && batctl meshif "$iface" fragmentation "$fragmentation"
|
||||
|
||||
case "$gw_mode" in
|
||||
server)
|
||||
if [ -n "$gw_bandwidth" ]; then
|
||||
batctl meshif "$iface" gw_mode "server" "$gw_bandwidth"
|
||||
else
|
||||
batctl meshif "$iface" gw_mode "server"
|
||||
fi
|
||||
;;
|
||||
client)
|
||||
if [ -n "$gw_sel_class" ]; then
|
||||
batctl meshif "$iface" gw_mode "client" "$gw_sel_class"
|
||||
else
|
||||
batctl meshif "$iface" gw_mode "client"
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
batctl meshif "$iface" gw_mode "off"
|
||||
;;
|
||||
esac
|
||||
|
||||
[ -n "$hop_penalty" ] && batctl meshif "$iface" hop_penalty "$hop_penalty"
|
||||
[ -n "$isolation_mark" ] && batctl meshif "$iface" isolation_mark "$isolation_mark"
|
||||
[ -n "$multicast_fanout" ] && batctl meshif "$iface" multicast_fanout "$multicast_fanout"
|
||||
[ -n "$multicast_mode" ] && batctl meshif "$iface" multicast_mode "$multicast_mode" 2>&-
|
||||
[ -n "$network_coding" ] && batctl meshif "$iface" network_coding "$network_coding" 2>&-
|
||||
[ -n "$log_level" ] && batctl meshif "$iface" loglevel "$log_level" 2>&-
|
||||
[ -n "$orig_interval" ] && batctl meshif "$iface" orig_interval "$orig_interval"
|
||||
|
||||
proto_init_update "$iface" 1
|
||||
proto_send_update "$config"
|
||||
}
|
||||
|
||||
proto_batadv_teardown() {
|
||||
local config="$1"
|
||||
local iface="$config"
|
||||
|
||||
batctl meshif "$iface" interface destroy
|
||||
}
|
||||
|
||||
add_protocol batadv
|
||||
@@ -1,53 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ -n "$INCLUDE_ONLY" ] || {
|
||||
. /lib/functions.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
}
|
||||
|
||||
proto_batadv_hardif_init_config() {
|
||||
proto_config_add_int 'elp_interval'
|
||||
proto_config_add_int 'hop_penalty'
|
||||
proto_config_add_string "master"
|
||||
proto_config_add_string 'throughput_override'
|
||||
}
|
||||
|
||||
proto_batadv_hardif_setup() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
|
||||
local elp_interval
|
||||
local hop_penalty
|
||||
local master
|
||||
local throughput_override
|
||||
|
||||
json_get_vars elp_interval
|
||||
json_get_vars hop_penalty
|
||||
json_get_vars master
|
||||
json_get_vars throughput_override
|
||||
|
||||
( proto_add_host_dependency "$config" '' "$master" )
|
||||
|
||||
batctl meshif "$master" interface -M add "$iface"
|
||||
|
||||
[ -n "$elp_interval" ] && batctl hardif "$iface" elp_interval "$elp_interval"
|
||||
[ -n "$hop_penalty" ] && batctl hardif "$iface" hop_penalty "$hop_penalty"
|
||||
[ -n "$throughput_override" ] && batctl hardif "$iface" throughput_override "$throughput_override"
|
||||
|
||||
proto_init_update "$iface" 1
|
||||
proto_send_update "$config"
|
||||
}
|
||||
|
||||
proto_batadv_hardif_teardown() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
|
||||
local master
|
||||
|
||||
json_get_vars master
|
||||
|
||||
batctl meshif "$master" interface -M del "$iface" || true
|
||||
}
|
||||
|
||||
add_protocol batadv_hardif
|
||||
@@ -1,25 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
. /lib/functions.sh
|
||||
. ../netifd-proto.sh
|
||||
init_proto "$@"
|
||||
|
||||
proto_batadv_vlan_init_config() {
|
||||
proto_config_add_boolean 'ap_isolation:bool'
|
||||
}
|
||||
|
||||
proto_batadv_vlan_setup() {
|
||||
local config="$1"
|
||||
local iface="$2"
|
||||
|
||||
# batadv_vlan options
|
||||
local ap_isolation
|
||||
|
||||
json_get_vars ap_isolation
|
||||
|
||||
[ -n "$ap_isolation" ] && batctl vlan "$iface" ap_isolation "$ap_isolation"
|
||||
proto_init_update "$iface" 1
|
||||
proto_send_update "$config"
|
||||
}
|
||||
|
||||
add_protocol batadv_vlan
|
||||
@@ -1,128 +0,0 @@
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 24 Oct 2020 22:51:23 +0200
|
||||
Subject: Revert "batman-adv: genetlink: move to smaller ops wherever possible"
|
||||
|
||||
The netlink genl_ops interface was splitted into two parts for Linux 5.10.
|
||||
The batman-adv code changed to the new one because it doesn't use the more
|
||||
complex policy handling of genl_ops. But the backports-5.8-1 version in
|
||||
OpenWrt doesn't yet support the new genl_small_ops.
|
||||
|
||||
This patch must be dropped directly when OpenWrt switches to backports-5.10
|
||||
or newer - otherwise it will not work as expected.
|
||||
|
||||
This reverts commit 725b4ef5be840cfcd0ca33b9393c14dee40c10f7.
|
||||
|
||||
--- a/compat-include/net/genetlink.h
|
||||
+++ b/compat-include/net/genetlink.h
|
||||
@@ -31,17 +31,15 @@ void batadv_genl_dump_check_consistent(s
|
||||
#endif /* LINUX_VERSION_IS_LESS(4, 15, 0) */
|
||||
|
||||
|
||||
-#if LINUX_VERSION_IS_LESS(5, 10, 0)
|
||||
-
|
||||
#if LINUX_VERSION_IS_LESS(5, 2, 0)
|
||||
+
|
||||
enum genl_validate_flags {
|
||||
GENL_DONT_VALIDATE_STRICT = BIT(0),
|
||||
GENL_DONT_VALIDATE_DUMP = BIT(1),
|
||||
GENL_DONT_VALIDATE_DUMP_STRICT = BIT(2),
|
||||
};
|
||||
-#endif /* LINUX_VERSION_IS_LESS(5, 2, 0) */
|
||||
|
||||
-struct batadv_genl_small_ops {
|
||||
+struct batadv_genl_ops {
|
||||
int (*doit)(struct sk_buff *skb,
|
||||
struct genl_info *info);
|
||||
int (*dumpit)(struct sk_buff *skb,
|
||||
@@ -70,9 +68,9 @@ struct batadv_genl_family {
|
||||
struct genl_info *info);
|
||||
void (*post_doit)(const struct genl_ops *ops, struct sk_buff *skb,
|
||||
struct genl_info *info);
|
||||
- const struct batadv_genl_small_ops *small_ops;
|
||||
+ const struct batadv_genl_ops *ops;
|
||||
const struct genl_multicast_group *mcgrps;
|
||||
- unsigned int n_small_ops;
|
||||
+ unsigned int n_ops;
|
||||
unsigned int n_mcgrps;
|
||||
struct module *module;
|
||||
|
||||
@@ -96,32 +94,24 @@ static inline int batadv_genl_register_f
|
||||
family->family.pre_doit = family->pre_doit;
|
||||
family->family.post_doit = family->post_doit;
|
||||
family->family.mcgrps = family->mcgrps;
|
||||
- family->family.n_ops = family->n_small_ops;
|
||||
+ family->family.n_ops = family->n_ops;
|
||||
family->family.n_mcgrps = family->n_mcgrps;
|
||||
family->family.module = family->module;
|
||||
|
||||
- ops = kzalloc(sizeof(*ops) * family->n_small_ops, GFP_KERNEL);
|
||||
+ ops = kzalloc(sizeof(*ops) * family->n_ops, GFP_KERNEL);
|
||||
if (!ops)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < family->family.n_ops; i++) {
|
||||
- ops[i].doit = family->small_ops[i].doit;
|
||||
- ops[i].dumpit = family->small_ops[i].dumpit;
|
||||
- ops[i].done = family->small_ops[i].done;
|
||||
- ops[i].cmd = family->small_ops[i].cmd;
|
||||
- ops[i].internal_flags = family->small_ops[i].internal_flags;
|
||||
- ops[i].flags = family->small_ops[i].flags;
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 2, 0)
|
||||
- ops[i].validate = family->small_ops[i].validate;
|
||||
-#else
|
||||
+ ops[i].doit = family->ops[i].doit;
|
||||
+ ops[i].dumpit = family->ops[i].dumpit;
|
||||
+ ops[i].done = family->ops[i].done;
|
||||
+ ops[i].cmd = family->ops[i].cmd;
|
||||
+ ops[i].internal_flags = family->ops[i].internal_flags;
|
||||
+ ops[i].flags = family->ops[i].flags;
|
||||
ops[i].policy = family->policy;
|
||||
-#endif
|
||||
}
|
||||
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 2, 0)
|
||||
- family->family.policy = family->policy;
|
||||
-#endif
|
||||
-
|
||||
family->family.ops = ops;
|
||||
family->copy_ops = ops;
|
||||
|
||||
@@ -136,7 +126,7 @@ typedef struct genl_ops batadv_genl_ops_
|
||||
#define batadv_post_doit(__x, __y, __z) \
|
||||
batadv_post_doit(const batadv_genl_ops_old *ops, __y, __z)
|
||||
|
||||
-#define genl_small_ops batadv_genl_small_ops
|
||||
+#define genl_ops batadv_genl_ops
|
||||
#define genl_family batadv_genl_family
|
||||
|
||||
#define genl_register_family(family) \
|
||||
@@ -160,6 +150,6 @@ batadv_genl_unregister_family(struct bat
|
||||
genlmsg_multicast_netns(&(_family)->family, _net, _skb, _portid, \
|
||||
_group, _flags)
|
||||
|
||||
-#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */
|
||||
+#endif /* LINUX_VERSION_IS_LESS(5, 2, 0) */
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_COMPAT_NET_GENETLINK_H_ */
|
||||
--- a/net/batman-adv/netlink.c
|
||||
+++ b/net/batman-adv/netlink.c
|
||||
@@ -1357,7 +1357,7 @@ static void batadv_post_doit(const struc
|
||||
}
|
||||
}
|
||||
|
||||
-static const struct genl_small_ops batadv_netlink_ops[] = {
|
||||
+static const struct genl_ops batadv_netlink_ops[] = {
|
||||
{
|
||||
.cmd = BATADV_CMD_GET_MESH,
|
||||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
@@ -1491,8 +1491,8 @@ struct genl_family batadv_netlink_family
|
||||
.pre_doit = batadv_pre_doit,
|
||||
.post_doit = batadv_post_doit,
|
||||
.module = THIS_MODULE,
|
||||
- .small_ops = batadv_netlink_ops,
|
||||
- .n_small_ops = ARRAY_SIZE(batadv_netlink_ops),
|
||||
+ .ops = batadv_netlink_ops,
|
||||
+ .n_ops = ARRAY_SIZE(batadv_netlink_ops),
|
||||
.mcgrps = batadv_netlink_mcgrps,
|
||||
.n_mcgrps = ARRAY_SIZE(batadv_netlink_mcgrps),
|
||||
};
|
||||
@@ -1,116 +0,0 @@
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Thu, 28 Jan 2021 21:06:51 +0100
|
||||
Subject: Revert "batman-adv: Add new include for min/max helpers"
|
||||
|
||||
The OpenWrt kernel sources and backports sources are currently missing this
|
||||
header.
|
||||
|
||||
This reverts commit 1810de05310d5c5e9140f870ac21052f38bc06b8.
|
||||
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
--- a/compat-include/linux/minmax.h
|
||||
+++ /dev/null
|
||||
@@ -1,20 +0,0 @@
|
||||
-/* SPDX-License-Identifier: GPL-2.0 */
|
||||
-/* Copyright (C) B.A.T.M.A.N. contributors:
|
||||
- *
|
||||
- * Marek Lindner, Simon Wunderlich
|
||||
- *
|
||||
- * This file contains macros for maintaining compatibility with older versions
|
||||
- * of the Linux kernel.
|
||||
- */
|
||||
-
|
||||
-#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_
|
||||
-#define _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_
|
||||
-
|
||||
-#include <linux/version.h>
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 10, 0)
|
||||
-#include_next <linux/minmax.h>
|
||||
-#else
|
||||
-#include <linux/kernel.h>
|
||||
-#endif
|
||||
-
|
||||
-#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_ */
|
||||
--- a/net/batman-adv/bat_v.c
|
||||
+++ b/net/batman-adv/bat_v.c
|
||||
@@ -15,7 +15,6 @@
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rculist.h>
|
||||
--- a/net/batman-adv/bat_v_elp.c
|
||||
+++ b/net/batman-adv/bat_v_elp.c
|
||||
@@ -18,7 +18,6 @@
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kref.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/nl80211.h>
|
||||
#include <linux/prandom.h>
|
||||
--- a/net/batman-adv/bat_v_ogm.c
|
||||
+++ b/net/batman-adv/bat_v_ogm.c
|
||||
@@ -18,7 +18,6 @@
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/lockdep.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/prandom.h>
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -14,8 +14,8 @@
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/jiffies.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/lockdep.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -17,7 +17,6 @@
|
||||
#include <linux/kref.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/printk.h>
|
||||
--- a/net/batman-adv/main.c
|
||||
+++ b/net/batman-adv/main.c
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <linux/kobject.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/list.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/printk.h>
|
||||
--- a/net/batman-adv/netlink.c
|
||||
+++ b/net/batman-adv/netlink.c
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/printk.h>
|
||||
--- a/net/batman-adv/tp_meter.c
|
||||
+++ b/net/batman-adv/tp_meter.c
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
-#include <linux/minmax.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/param.h>
|
||||
#include <linux/printk.h>
|
||||
@@ -1,34 +0,0 @@
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 14 May 2021 19:34:35 +0200
|
||||
Subject: batman-adv: Fix build of multicast code against Linux < 5.13
|
||||
|
||||
Fixes: 007b4c4b031f ("batman-adv: convert ifmcaddr6 to RCU")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -422,9 +422,14 @@ batadv_mcast_mla_softif_get_ipv6(struct
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#if LINUX_VERSION_IS_LESS(5, 13, 0)
|
||||
+ read_lock_bh(&in6_dev->lock);
|
||||
+ for (pmc6 = in6_dev->mc_list; pmc6; pmc6 = pmc6->next) {
|
||||
+#else
|
||||
for (pmc6 = rcu_dereference(in6_dev->mc_list);
|
||||
pmc6;
|
||||
pmc6 = rcu_dereference(pmc6->next)) {
|
||||
+#endif
|
||||
if (IPV6_ADDR_MC_SCOPE(&pmc6->mca_addr) <
|
||||
IPV6_ADDR_SCOPE_LINKLOCAL)
|
||||
continue;
|
||||
@@ -453,6 +458,9 @@ batadv_mcast_mla_softif_get_ipv6(struct
|
||||
hlist_add_head(&new->list, mcast_list);
|
||||
ret++;
|
||||
}
|
||||
+#if LINUX_VERSION_IS_LESS(5, 13, 0)
|
||||
+ read_unlock_bh(&in6_dev->lock);
|
||||
+#endif
|
||||
rcu_read_unlock();
|
||||
|
||||
return ret;
|
||||
@@ -1,19 +0,0 @@
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Tue, 14 Sep 2021 21:02:10 +0200
|
||||
Subject: Revert "batman-adv: Switch to kstrtox.h for kstrtou64"
|
||||
|
||||
This header is only available after Linux 5.14
|
||||
|
||||
This reverts commit c9a69cb4048ebef3a4d91835669011a26d9b7dab.
|
||||
|
||||
--- a/net/batman-adv/gateway_common.c
|
||||
+++ b/net/batman-adv/gateway_common.c
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/errno.h>
|
||||
-#include <linux/kstrtox.h>
|
||||
+#include <linux/kernel.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/math64.h>
|
||||
#include <linux/netdevice.h>
|
||||
@@ -1,19 +0,0 @@
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Tue, 14 Sep 2021 21:07:34 +0200
|
||||
Subject: Revert "batman-adv: use Linux's stdarg.h"
|
||||
|
||||
This header is only available since Linux 5.15
|
||||
|
||||
This reverts commit 36d059797a14f0e373fdc3c79df7b467435925ad.
|
||||
|
||||
--- a/net/batman-adv/log.c
|
||||
+++ b/net/batman-adv/log.c
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "log.h"
|
||||
#include "main.h"
|
||||
|
||||
-#include <linux/stdarg.h>
|
||||
+#include <stdarg.h>
|
||||
|
||||
#include "trace.h"
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
From: Eric Dumazet <edumazet@google.com>
|
||||
Date: Wed, 2 Mar 2022 20:05:13 +0100
|
||||
Subject: batman-adv: make mc_forwarding atomic
|
||||
|
||||
This fixes minor data-races in ip6_mc_input() and
|
||||
batadv_mcast_mla_rtr_flags_softif_get_ipv6()
|
||||
|
||||
Signed-off-by: Eric Dumazet <edumazet@google.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
[sven@narfation.org: Add ugly hack to get it building with old kernels]
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/56db7c0540e733a1f063ccd6bab1b537a80857eb
|
||||
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -134,7 +134,11 @@ static u8 batadv_mcast_mla_rtr_flags_sof
|
||||
{
|
||||
struct inet6_dev *in6_dev = __in6_dev_get(dev);
|
||||
|
||||
+#if LINUX_VERSION_IS_GEQ(5, 18, 0) // UGLY_HACK_NEW
|
||||
+ if (in6_dev && atomic_read(&in6_dev->cnf.mc_forwarding))
|
||||
+#else // UGLY_HACK_OLD
|
||||
if (in6_dev && in6_dev->cnf.mc_forwarding)
|
||||
+#endif // UGLY_HACK_STOP
|
||||
return BATADV_NO_FLAGS;
|
||||
else
|
||||
return BATADV_MCAST_WANT_NO_RTR6;
|
||||
@@ -1,23 +0,0 @@
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Fri, 15 Apr 2022 15:12:45 +0200
|
||||
Subject: batman-adv: compat: Add atomic mc_fowarding support for stable kernels
|
||||
|
||||
Fixes: 56db7c0540e7 ("batman-adv: make mc_forwarding atomic")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/350adcaec82fbaa358a2406343b6130ac8dad126
|
||||
|
||||
--- a/net/batman-adv/multicast.c
|
||||
+++ b/net/batman-adv/multicast.c
|
||||
@@ -134,7 +134,11 @@ static u8 batadv_mcast_mla_rtr_flags_sof
|
||||
{
|
||||
struct inet6_dev *in6_dev = __in6_dev_get(dev);
|
||||
|
||||
-#if LINUX_VERSION_IS_GEQ(5, 18, 0) // UGLY_HACK_NEW
|
||||
+#if (LINUX_VERSION_IS_GEQ(5, 4, 189) && LINUX_VERSION_IS_LESS(5, 5, 0)) || /* UGLY_HACK */ \
|
||||
+ (LINUX_VERSION_IS_GEQ(5, 10, 111) && LINUX_VERSION_IS_LESS(5, 11, 0)) || /* UGLY_HACK */ \
|
||||
+ (LINUX_VERSION_IS_GEQ(5, 15, 34) && LINUX_VERSION_IS_LESS(5, 16, 0)) || /* UGLY_HACK */ \
|
||||
+ (LINUX_VERSION_IS_GEQ(5, 16, 20) && LINUX_VERSION_IS_LESS(5, 17, 0)) || /* UGLY_HACK */ \
|
||||
+ LINUX_VERSION_IS_GEQ(5, 17, 3) // UGLY_HACK_NEW
|
||||
if (in6_dev && atomic_read(&in6_dev->cnf.mc_forwarding))
|
||||
#else // UGLY_HACK_OLD
|
||||
if (in6_dev && in6_dev->cnf.mc_forwarding)
|
||||
@@ -1,44 +0,0 @@
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 2 Mar 2022 19:49:44 +0100
|
||||
Subject: batman-adv: Request iflink once in batadv-on-batadv check
|
||||
|
||||
There is no need to call dev_get_iflink multiple times for the same
|
||||
net_device in batadv_is_on_batman_iface. And since some of the
|
||||
.ndo_get_iflink callbacks are dynamic (for example via RCUs like in
|
||||
vxcan_get_iflink), it could easily happen that the returned values are not
|
||||
stable. The pre-checks before __dev_get_by_index are then of course bogus.
|
||||
|
||||
Fixes: 3d48811b27f5 ("batman-adv: prevent using any virtual device created on batman-adv as hard-interface")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/f6c0c45356fe3ab9c5e01b81d060f8a436658037
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -148,22 +148,23 @@ static bool batadv_is_on_batman_iface(co
|
||||
struct net *net = dev_net(net_dev);
|
||||
struct net_device *parent_dev;
|
||||
struct net *parent_net;
|
||||
+ int iflink;
|
||||
bool ret;
|
||||
|
||||
/* check if this is a batman-adv mesh interface */
|
||||
if (batadv_softif_is_valid(net_dev))
|
||||
return true;
|
||||
|
||||
+ iflink = dev_get_iflink(net_dev);
|
||||
+
|
||||
/* no more parents..stop recursion */
|
||||
- if (dev_get_iflink(net_dev) == 0 ||
|
||||
- dev_get_iflink(net_dev) == net_dev->ifindex)
|
||||
+ if (iflink == 0 || iflink == net_dev->ifindex)
|
||||
return false;
|
||||
|
||||
parent_net = batadv_getlink_net(net_dev, net);
|
||||
|
||||
/* recurse over the parent device */
|
||||
- parent_dev = __dev_get_by_index((struct net *)parent_net,
|
||||
- dev_get_iflink(net_dev));
|
||||
+ parent_dev = __dev_get_by_index((struct net *)parent_net, iflink);
|
||||
/* if we got a NULL parent_dev there is something broken.. */
|
||||
if (!parent_dev) {
|
||||
pr_err("Cannot find parent device\n");
|
||||
@@ -1,46 +0,0 @@
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 2 Mar 2022 19:49:45 +0100
|
||||
Subject: batman-adv: Request iflink once in batadv_get_real_netdevice
|
||||
|
||||
There is no need to call dev_get_iflink multiple times for the same
|
||||
net_device in batadv_get_real_netdevice. And since some of the
|
||||
ndo_get_iflink callbacks are dynamic (for example via RCUs like in
|
||||
vxcan_get_iflink), it could easily happen that the returned values are not
|
||||
stable. The pre-checks before __dev_get_by_index are then of course bogus.
|
||||
|
||||
Fixes: 2b45bb6c3aad ("batman-adv: additional checks for virtual interfaces on top of WiFi")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/445f477ec3e805425186f5fbe8ed0fe89cc226b6
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -214,14 +214,16 @@ static struct net_device *batadv_get_rea
|
||||
struct net_device *real_netdev = NULL;
|
||||
struct net *real_net;
|
||||
struct net *net;
|
||||
- int ifindex;
|
||||
+ int iflink;
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (!netdev)
|
||||
return NULL;
|
||||
|
||||
- if (netdev->ifindex == dev_get_iflink(netdev)) {
|
||||
+ iflink = dev_get_iflink(netdev);
|
||||
+
|
||||
+ if (netdev->ifindex == iflink) {
|
||||
dev_hold(netdev);
|
||||
return netdev;
|
||||
}
|
||||
@@ -231,9 +233,8 @@ static struct net_device *batadv_get_rea
|
||||
goto out;
|
||||
|
||||
net = dev_net(hard_iface->soft_iface);
|
||||
- ifindex = dev_get_iflink(netdev);
|
||||
real_net = batadv_getlink_net(netdev, net);
|
||||
- real_netdev = dev_get_by_index(real_net, ifindex);
|
||||
+ real_netdev = dev_get_by_index(real_net, iflink);
|
||||
|
||||
out:
|
||||
batadv_hardif_put(hard_iface);
|
||||
@@ -1,86 +0,0 @@
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Wed, 2 Mar 2022 19:49:46 +0100
|
||||
Subject: batman-adv: Don't expect inter-netns unique iflink indices
|
||||
|
||||
The ifindex doesn't have to be unique for multiple network namespaces on
|
||||
the same machine.
|
||||
|
||||
$ ip netns add test1
|
||||
$ ip -net test1 link add dummy1 type dummy
|
||||
$ ip netns add test2
|
||||
$ ip -net test2 link add dummy2 type dummy
|
||||
|
||||
$ ip -net test1 link show dev dummy1
|
||||
6: dummy1: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
|
||||
link/ether 96:81:55:1e:dd:85 brd ff:ff:ff:ff:ff:ff
|
||||
$ ip -net test2 link show dev dummy2
|
||||
6: dummy2: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
|
||||
link/ether 5a:3c:af:35:07:c3 brd ff:ff:ff:ff:ff:ff
|
||||
|
||||
But the batman-adv code to walk through the various layers of virtual
|
||||
interfaces uses this assumption because dev_get_iflink handles it
|
||||
internally and doesn't return the actual netns of the iflink. And
|
||||
dev_get_iflink only documents the situation where ifindex == iflink for
|
||||
physical devices.
|
||||
|
||||
But only checking for dev->netdev_ops->ndo_get_iflink is also not an option
|
||||
because ipoib_get_iflink implements it even when it sometimes returns an
|
||||
iflink != ifindex and sometimes iflink == ifindex. The caller must
|
||||
therefore make sure itself to check both netns and iflink + ifindex for
|
||||
equality. Only when they are equal, a "physical" interface was detected
|
||||
which should stop the traversal. On the other hand, vxcan_get_iflink can
|
||||
also return 0 in case there was currently no valid peer. In this case, it
|
||||
is still necessary to stop.
|
||||
|
||||
Fixes: 3d48811b27f5 ("batman-adv: prevent using any virtual device created on batman-adv as hard-interface")
|
||||
Fixes: 2b45bb6c3aad ("batman-adv: additional checks for virtual interfaces on top of WiFi")
|
||||
Reported-by: Sabrina Dubroca <sd@queasysnail.net>
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/0aac7a9fbbbeec25f2f54a9e6d53ea91217ba720
|
||||
|
||||
--- a/net/batman-adv/hard-interface.c
|
||||
+++ b/net/batman-adv/hard-interface.c
|
||||
@@ -156,13 +156,15 @@ static bool batadv_is_on_batman_iface(co
|
||||
return true;
|
||||
|
||||
iflink = dev_get_iflink(net_dev);
|
||||
-
|
||||
- /* no more parents..stop recursion */
|
||||
- if (iflink == 0 || iflink == net_dev->ifindex)
|
||||
+ if (iflink == 0)
|
||||
return false;
|
||||
|
||||
parent_net = batadv_getlink_net(net_dev, net);
|
||||
|
||||
+ /* iflink to itself, most likely physical device */
|
||||
+ if (net == parent_net && iflink == net_dev->ifindex)
|
||||
+ return false;
|
||||
+
|
||||
/* recurse over the parent device */
|
||||
parent_dev = __dev_get_by_index((struct net *)parent_net, iflink);
|
||||
/* if we got a NULL parent_dev there is something broken.. */
|
||||
@@ -222,8 +224,7 @@ static struct net_device *batadv_get_rea
|
||||
return NULL;
|
||||
|
||||
iflink = dev_get_iflink(netdev);
|
||||
-
|
||||
- if (netdev->ifindex == iflink) {
|
||||
+ if (iflink == 0) {
|
||||
dev_hold(netdev);
|
||||
return netdev;
|
||||
}
|
||||
@@ -234,6 +235,14 @@ static struct net_device *batadv_get_rea
|
||||
|
||||
net = dev_net(hard_iface->soft_iface);
|
||||
real_net = batadv_getlink_net(netdev, net);
|
||||
+
|
||||
+ /* iflink to itself, most likely physical device */
|
||||
+ if (net == real_net && netdev->ifindex == iflink) {
|
||||
+ real_netdev = netdev;
|
||||
+ dev_hold(real_netdev);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
real_netdev = dev_get_by_index(real_net, iflink);
|
||||
|
||||
out:
|
||||
@@ -1,46 +0,0 @@
|
||||
From: Sven Eckelmann <sven@narfation.org>
|
||||
Date: Sat, 16 Apr 2022 14:24:34 +0200
|
||||
Subject: batman-adv: Don't skb_split skbuffs with frag_list
|
||||
|
||||
The receiving interface might have used GRO to receive more fragments than
|
||||
MAX_SKB_FRAGS fragments. In this case, these will not be stored in
|
||||
skb_shinfo(skb)->frags but merged into the frag list.
|
||||
|
||||
batman-adv relies on the function skb_split to split packets up into
|
||||
multiple smaller packets which are not larger than the MTU on the outgoing
|
||||
interface. But this function cannot handle frag_list entries and is only
|
||||
operating on skb_shinfo(skb)->frags. If it is still trying to split such an
|
||||
skb and xmit'ing it on an interface without support for NETIF_F_FRAGLIST,
|
||||
then validate_xmit_skb() will try to linearize it. But this fails due to
|
||||
inconsistent information. And __pskb_pull_tail will trigger a BUG_ON after
|
||||
skb_copy_bits() returns an error.
|
||||
|
||||
In case of entries in frag_list, just linearize the skb before operating on
|
||||
it with skb_split().
|
||||
|
||||
Reported-by: Felix Kaechele <felix@kaechele.ca>
|
||||
Tested-by: Felix Kaechele <felix@kaechele.ca>
|
||||
Fixes: 9de347143505 ("batman-adv: layer2 unicast packet fragmentation")
|
||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d467720acaf1b22b0cee58144eeaf9ef6c5e285c
|
||||
|
||||
--- a/net/batman-adv/fragmentation.c
|
||||
+++ b/net/batman-adv/fragmentation.c
|
||||
@@ -475,6 +475,17 @@ int batadv_frag_send_packet(struct sk_bu
|
||||
goto free_skb;
|
||||
}
|
||||
|
||||
+ /* GRO might have added fragments to the fragment list instead of
|
||||
+ * frags[]. But this is not handled by skb_split and must be
|
||||
+ * linearized to avoid incorrect length information after all
|
||||
+ * batman-adv fragments were created and submitted to the
|
||||
+ * hard-interface
|
||||
+ */
|
||||
+ if (skb_has_frag_list(skb) && __skb_linearize(skb)) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto free_skb;
|
||||
+ }
|
||||
+
|
||||
/* Create one header to be copied to all fragments */
|
||||
frag_header.packet_type = BATADV_UNICAST_FRAG;
|
||||
frag_header.version = BATADV_COMPAT_VERSION;
|
||||
@@ -1,179 +0,0 @@
|
||||
/* Please avoid adding hacks here - instead add it to mac80211/backports.git */
|
||||
|
||||
#undef CONFIG_MODULE_STRIPPED
|
||||
|
||||
#include <linux/version.h> /* LINUX_VERSION_CODE */
|
||||
#include <linux/types.h>
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(5, 10, 0)
|
||||
|
||||
#include <linux/if_bridge.h>
|
||||
|
||||
struct batadv_br_ip {
|
||||
union {
|
||||
__be32 ip4;
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
struct in6_addr ip6;
|
||||
#endif
|
||||
} dst;
|
||||
__be16 proto;
|
||||
__u16 vid;
|
||||
};
|
||||
|
||||
struct batadv_br_ip_list {
|
||||
struct list_head list;
|
||||
struct batadv_br_ip addr;
|
||||
};
|
||||
|
||||
#if 0
|
||||
/* "static" dropped to force compiler to evaluate it as part of multicast.c
|
||||
* might need to be added again and then called in some kind of dummy
|
||||
* compat.c in case this header is included in multiple files.
|
||||
*/
|
||||
inline void __batadv_br_ip_list_check(void)
|
||||
{
|
||||
BUILD_BUG_ON(sizeof(struct batadv_br_ip_list) != sizeof(struct br_ip_list));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip_list, list) != offsetof(struct br_ip_list, list));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip_list, addr) != offsetof(struct br_ip_list, addr));
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct batadv_br_ip) != sizeof(struct br_ip));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip, dst.ip4) != offsetof(struct br_ip, u.ip4));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip, dst.ip6) != offsetof(struct br_ip, u.ip6));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip, proto) != offsetof(struct br_ip, proto));
|
||||
BUILD_BUG_ON(offsetof(struct batadv_br_ip, vid) != offsetof(struct br_ip, vid));
|
||||
}
|
||||
#endif
|
||||
|
||||
#define br_ip batadv_br_ip
|
||||
#define br_ip_list batadv_br_ip_list
|
||||
|
||||
#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(5, 14, 0)
|
||||
|
||||
#include <linux/if_bridge.h>
|
||||
#include <net/addrconf.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
static inline bool
|
||||
br_multicast_has_router_adjacent(struct net_device *dev, int proto)
|
||||
{
|
||||
struct list_head bridge_mcast_list = LIST_HEAD_INIT(bridge_mcast_list);
|
||||
struct br_ip_list *br_ip_entry, *tmp;
|
||||
int ret;
|
||||
|
||||
if (proto != ETH_P_IPV6)
|
||||
return true;
|
||||
|
||||
ret = br_multicast_list_adjacent(dev, &bridge_mcast_list);
|
||||
if (ret < 0)
|
||||
return true;
|
||||
|
||||
ret = false;
|
||||
|
||||
list_for_each_entry_safe(br_ip_entry, tmp, &bridge_mcast_list, list) {
|
||||
if (br_ip_entry->addr.proto == htons(ETH_P_IPV6) &&
|
||||
ipv6_addr_is_ll_all_routers(&br_ip_entry->addr.dst.ip6))
|
||||
ret = true;
|
||||
|
||||
list_del(&br_ip_entry->list);
|
||||
kfree(br_ip_entry);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
static inline bool
|
||||
br_multicast_has_router_adjacent(struct net_device *dev, int proto)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* LINUX_VERSION_IS_LESS(5, 14, 0) */
|
||||
|
||||
#if LINUX_VERSION_IS_LESS(5, 15, 0)
|
||||
|
||||
static inline void batadv_eth_hw_addr_set(struct net_device *dev,
|
||||
const u8 *addr)
|
||||
{
|
||||
ether_addr_copy(dev->dev_addr, addr);
|
||||
}
|
||||
#define eth_hw_addr_set batadv_eth_hw_addr_set
|
||||
|
||||
#endif /* LINUX_VERSION_IS_LESS(5, 15, 0) */
|
||||
|
||||
/* <DECLARE_EWMA> */
|
||||
|
||||
#include <linux/version.h>
|
||||
#include_next <linux/average.h>
|
||||
|
||||
#include <linux/bug.h>
|
||||
|
||||
#ifdef DECLARE_EWMA
|
||||
#undef DECLARE_EWMA
|
||||
#endif /* DECLARE_EWMA */
|
||||
|
||||
/*
|
||||
* Exponentially weighted moving average (EWMA)
|
||||
*
|
||||
* This implements a fixed-precision EWMA algorithm, with both the
|
||||
* precision and fall-off coefficient determined at compile-time
|
||||
* and built into the generated helper funtions.
|
||||
*
|
||||
* The first argument to the macro is the name that will be used
|
||||
* for the struct and helper functions.
|
||||
*
|
||||
* The second argument, the precision, expresses how many bits are
|
||||
* used for the fractional part of the fixed-precision values.
|
||||
*
|
||||
* The third argument, the weight reciprocal, determines how the
|
||||
* new values will be weighed vs. the old state, new values will
|
||||
* get weight 1/weight_rcp and old values 1-1/weight_rcp. Note
|
||||
* that this parameter must be a power of two for efficiency.
|
||||
*/
|
||||
|
||||
#define DECLARE_EWMA(name, _precision, _weight_rcp) \
|
||||
struct ewma_##name { \
|
||||
unsigned long internal; \
|
||||
}; \
|
||||
static inline void ewma_##name##_init(struct ewma_##name *e) \
|
||||
{ \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
|
||||
/* \
|
||||
* Even if you want to feed it just 0/1 you should have \
|
||||
* some bits for the non-fractional part... \
|
||||
*/ \
|
||||
BUILD_BUG_ON((_precision) > 30); \
|
||||
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
|
||||
e->internal = 0; \
|
||||
} \
|
||||
static inline unsigned long \
|
||||
ewma_##name##_read(struct ewma_##name *e) \
|
||||
{ \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
|
||||
BUILD_BUG_ON((_precision) > 30); \
|
||||
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
|
||||
return e->internal >> (_precision); \
|
||||
} \
|
||||
static inline void ewma_##name##_add(struct ewma_##name *e, \
|
||||
unsigned long val) \
|
||||
{ \
|
||||
unsigned long internal = READ_ONCE(e->internal); \
|
||||
unsigned long weight_rcp = ilog2(_weight_rcp); \
|
||||
unsigned long precision = _precision; \
|
||||
\
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_precision)); \
|
||||
BUILD_BUG_ON(!__builtin_constant_p(_weight_rcp)); \
|
||||
BUILD_BUG_ON((_precision) > 30); \
|
||||
BUILD_BUG_ON_NOT_POWER_OF_2(_weight_rcp); \
|
||||
\
|
||||
WRITE_ONCE(e->internal, internal ? \
|
||||
(((internal << weight_rcp) - internal) + \
|
||||
(val << precision)) >> weight_rcp : \
|
||||
(val << precision)); \
|
||||
}
|
||||
|
||||
/* </DECLARE_EWMA> */
|
||||
@@ -1,82 +0,0 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG:=ftm
|
||||
PKG_NAME:=$(PKG)
|
||||
PKG_RELEASE:=1
|
||||
|
||||
LOCAL_SRC:=$(TOPDIR)/qca/src/common-tools/ftm
|
||||
|
||||
PKG_VERSION:=12.3
|
||||
|
||||
#PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG)
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
define Package/$(PKG_NAME)
|
||||
SECTION:=QCA
|
||||
CATEGORY:=QTI software
|
||||
URL:=http://www.qca.qualcomm.com
|
||||
MAINTAINER:=Qualcomm Atheros
|
||||
TITLE:= QCA ftm utils
|
||||
DEPENDS:= @TARGET_ipq_ipq807x||TARGET_ipq_ipq807x_64||TARGET_ipq_ipq60xx||TARGET_ipq_ipq60xx_64||TARGET_ipq_ipq50xx||TARGET_ipq_ipq50xx_64||TARGET_ipq807x||TARGET_ipq50xx||TARGET_ipq60xx||TARGET_ipq95xx||TARGET_ipq53xx +libnl +libtcmd +qca-diag +librt +kmod-diag-char
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/description/Default
|
||||
FTM Package Support for QCA WIFI 11 drivers
|
||||
endef
|
||||
|
||||
TARGET_CFLAGS += -DCONFIG_FTM_WLAN -DDEBUG -DFTM_DEBUG -DWIN_AP_HOST
|
||||
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/qca-diag
|
||||
TARGET_CFLAGS += -MMD -O2 -Wall -g
|
||||
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include
|
||||
TARGET_CFLAGS += -fpie
|
||||
TARGET_LDFLAGS += -ldiag -lnl-3 -lnl-genl-3 -lrt -ltcmd
|
||||
TARGET_CSRCS := ftm_main.c ftm_wlan.c ftm_write_to_flash.c
|
||||
TARGET_LDFLAGS += -pie
|
||||
|
||||
ifeq ($(CONFIG_FEATURE_IPQ_PROVISION_SUPPORT),y)
|
||||
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/qti-mfg-provision
|
||||
TARGET_CFLAGS += -DWIN_AP_AFC
|
||||
TARGET_LDFLAGS += -lprovision
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_PACKAGE_kmod-mac80211),)
|
||||
TARGET_CFLAGS+=-DWIN_AP_HOST_OPEN=1
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_FEATURE_QCA_IOT),y)
|
||||
TARGET_CFLAGS += -DIPQ_AP_HOST_IOT -DIPQ_AP_HOST_IOT_QCA402X -ggdb3 -DCONFIG_DAEMON_MODE
|
||||
TARGET_CSRCS += ftm_iot.c
|
||||
TARGET_LDFLAGS += -lpthread
|
||||
TARGET_CFLAGS += -I$(STAGING_DIR)/usr/include/qca-iot
|
||||
TARGET_LDFLAGS += -ldiag_demo
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_FEATURE_IPQ_IOT_SUPPORT),y)
|
||||
TARGET_CFLAGS += -DIPQ_AP_HOST_IOT -DIPQ_AP_HOST_IOT_IPQ -ggdb3 -I$(STAGING_DIR)/usr/include/btdaemon
|
||||
TARGET_CSRCS += ftm_iot.c
|
||||
TARGET_LDFLAGS += -lpthread -lbtdaemon
|
||||
endif
|
||||
|
||||
define Build/Compile
|
||||
$(MAKE) -C $(PKG_BUILD_DIR) \
|
||||
CC="$(TARGET_CC)" \
|
||||
CFLAGS="$(TARGET_CFLAGS)" \
|
||||
LDFLAGS="$(TARGET_LDFLAGS)" \
|
||||
CSRCS="$(TARGET_CSRCS)"
|
||||
endef
|
||||
|
||||
define Package/$(PKG_NAME)/install
|
||||
$(INSTALL_DIR) $(1)/usr/sbin
|
||||
$(INSTALL_DIR) $(1)/etc/init.d
|
||||
$(INSTALL_BIN) $(PKG_BUILD_DIR)/ftm $(1)/usr/sbin/
|
||||
$(INSTALL_BIN) ./files/ftm.init $(1)/etc/init.d/ftm
|
||||
$(INSTALL_DIR) $(1)/lib/wifi
|
||||
$(INSTALL_BIN) ./files/compress_vart.sh $(1)/lib/compress_vart.sh
|
||||
ifneq (, $(findstring ipq95xx, $(CONFIG_TARGET_BOARD)))
|
||||
$(INSTALL_DIR) $(1)/sbin
|
||||
$(INSTALL_BIN) ./files/ftm_qcc710_start.sh $(1)/sbin/ftm_qcc710_start
|
||||
endif
|
||||
endef
|
||||
|
||||
$(eval $(call BuildPackage,ftm))
|
||||
@@ -1,75 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2020 Qualcomm Technologies, Inc.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
# Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
#
|
||||
#
|
||||
|
||||
[ -e /lib/functions.sh ] && . /lib/functions.sh
|
||||
[ -e /lib/ipq806x.sh ] && . /lib/ipq806x.sh
|
||||
[ -e /lib/functions/boot.sh ] && . /lib/functions/boot.sh
|
||||
|
||||
low_mem_compress_art()
|
||||
{
|
||||
local mtdblock=$(find_mtd_part 0:ART)
|
||||
|
||||
if [ -z "$mtdblock" ]; then
|
||||
# read from mmc
|
||||
mtdblock=$(find_mmc_part 0:ART)
|
||||
fi
|
||||
|
||||
[ -n "$mtdblock" ] || return
|
||||
|
||||
local apmp="/tmp"
|
||||
|
||||
lzma -zvfk -4 ${apmp}/virtual_art.bin 2> /dev/null || {
|
||||
echo "Error Compressing Virtual ART" > /dev/console
|
||||
return
|
||||
}
|
||||
|
||||
dd if=${apmp}/virtual_art.bin.lzma of=${mtdblock}
|
||||
echo "Success compressing Virtual ART(${mtdblock})" > /dev/console
|
||||
return
|
||||
}
|
||||
|
||||
normal_art()
|
||||
{
|
||||
local mtdblock=$(find_mtd_part 0:ART)
|
||||
|
||||
if [ -z "$mtdblock" ]; then
|
||||
# read from mmc
|
||||
mtdblock=$(find_mmc_part 0:ART)
|
||||
fi
|
||||
|
||||
[ -n "$mtdblock" ] || return
|
||||
|
||||
local apmp="/tmp"
|
||||
|
||||
dd if=${apmp}/virtual_art.bin of=${mtdblock}
|
||||
echo "Success writing to ART(${mtdblock})" > /dev/console
|
||||
return
|
||||
}
|
||||
|
||||
write_caldata()
|
||||
{
|
||||
local board
|
||||
[ -f /tmp/sysinfo/board_name ] && {
|
||||
board=ap$(cat /tmp/sysinfo/board_name | awk -F 'ap' '{print$2}')
|
||||
}
|
||||
|
||||
if [ -e /sys/firmware/devicetree/base/compressed_art ]
|
||||
then
|
||||
echo "Compressed ART Supported Platform $board " > /dev/console
|
||||
low_mem_compress_art
|
||||
else
|
||||
echo "Non Compressed ART Platform $board " > /dev/console
|
||||
normal_art
|
||||
fi
|
||||
}
|
||||
|
||||
if [ "$1" = "write_caldata" ]
|
||||
then
|
||||
write_caldata
|
||||
fi
|
||||
@@ -1,99 +0,0 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
#
|
||||
# Copyright (c) 2013, 2017, 2020 Qualcomm Technologies, Inc.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
# Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
#
|
||||
# 2013 Qualcomm Atheros, Inc.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
# Qualcomm Atheros Confidential and Proprietary
|
||||
#
|
||||
|
||||
[ -e /lib/functions.sh ] && . /lib/functions.sh
|
||||
[ -e /lib/ipq806x.sh ] && . /lib/ipq806x.sh
|
||||
[ -e /lib/functions/boot.sh ] && . /lib/functions/boot.sh
|
||||
|
||||
START=97
|
||||
SERVICE_DAEMONIZE=1
|
||||
SERVICE_WRITE_PID=1
|
||||
|
||||
MTD_ART_PART_NAME="art"
|
||||
|
||||
compressed_art_read() {
|
||||
local mtdblock=$(find_mtd_part 0:ART)
|
||||
|
||||
if [ -z "$mtdblock" ]; then
|
||||
#read from mmc
|
||||
mtdblock=$(find_mmc_part 0:ART)
|
||||
fi
|
||||
|
||||
[ -n "$mtdblock" ] || return
|
||||
|
||||
local apmp="/tmp"
|
||||
|
||||
dd if=${mtdblock} of=${apmp}/virtual_art.bin.lzma
|
||||
lzma -fdv --single-stream ${apmp}/virtual_art.bin.lzma || {
|
||||
# Create dummy virtual_art.bin file of size 512K
|
||||
dd if=/dev/zero of=${apmp}/virtual_art.bin bs=1024 count=512
|
||||
}
|
||||
echo "Uncompressed and Copied ART content from ${mtdblock} to /tmp/virtual_art.bin" > /dev/console
|
||||
}
|
||||
|
||||
raw_art_read() {
|
||||
local mtdblock=$(find_mtd_part 0:ART)
|
||||
|
||||
if [ -z "$mtdblock" ]; then
|
||||
#read from mmc
|
||||
mtdblock=$(find_mmc_part 0:ART)
|
||||
fi
|
||||
|
||||
[ -n "$mtdblock" ] || return
|
||||
|
||||
local apmp="/tmp"
|
||||
|
||||
dd if=${mtdblock} of=${apmp}/virtual_art.bin
|
||||
echo "Copy ART caldata from ${mtdblock} to /tmp/virtual_art.bin" > /dev/console
|
||||
}
|
||||
|
||||
retrieve_caldata() {
|
||||
local board
|
||||
[ -f /tmp/sysinfo/board_name ] && {
|
||||
board=ap$(cat /tmp/sysinfo/board_name | awk -F 'ap' '{print$2}')
|
||||
}
|
||||
echo "**** Platform Name: $board *****" > /dev/console
|
||||
|
||||
if [ -e /sys/firmware/devicetree/base/compressed_art ]
|
||||
then
|
||||
compressed_art_read
|
||||
else
|
||||
raw_art_read
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
start() {
|
||||
local emmc_flash=""
|
||||
local nor_flash=""
|
||||
|
||||
emmc_flash=$(find_mmc_part 0:ART 2> /dev/null)
|
||||
mtd_name=$(grep -i -w ${MTD_ART_PART_NAME} /proc/mtd | cut -f1 -d:)
|
||||
nor_flash=`find /sys/bus/spi/devices/*/mtd -name ${mtd_name} 2> /dev/null`
|
||||
|
||||
if [ -n "$emmc_flash" ]; then
|
||||
[ -L /dev/caldata ] || \
|
||||
ln -s $emmc_flash /dev/caldata
|
||||
elif [ -n "$nor_flash" ]; then
|
||||
[ -L /dev/caldata ] || \
|
||||
ln -s /dev/${mtd_name//mtd/mtdblock} /dev/caldata
|
||||
elif [ -n "$mtd_name" ]; then
|
||||
[ -L /dev/caldata ] || \
|
||||
ln -s /dev/${mtd_name//mtd/mtdblock} /dev/caldata
|
||||
fi
|
||||
retrieve_caldata
|
||||
}
|
||||
|
||||
stop() {
|
||||
[ -L /dev/caldata ] && rm /dev/caldata
|
||||
}
|
||||
@@ -1,86 +0,0 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2021 Qualcomm Technologies, Inc.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
# Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
#
|
||||
#
|
||||
|
||||
# QCC710 v1.0 reset for BT bringup
|
||||
qcc710_reset() {
|
||||
reset_gpio_pin=$(cat /proc/device-tree/soc/pinctrl@1000000/QCC710_pins/QCC710_reset/pins | sed s/"gpio"//)
|
||||
[[ -z $reset_gpio_pin ]] && return
|
||||
gpio_base=$(cat /sys/class/gpio/gpiochip*/base | head -n1)
|
||||
gpio_reset=$(( gpio_base + reset_gpio_pin ))
|
||||
if [[ ! -e /sys/class/gpio/gpio$gpio_reset ]]; then
|
||||
[ -z ${SLEEP} ] && echo -e "Enter sleep value for reset. Options:\n10 \n1" && read -p "Enter : " SLEEP
|
||||
[ -z ${SLEEP} ] && SLEEP=10
|
||||
echo $gpio_reset > /sys/class/gpio/export
|
||||
echo out > /sys/class/gpio/gpio$gpio_reset/direction
|
||||
echo "Performing QCC710 reset ...." > /dev/console
|
||||
{ echo 1 > /sys/class/gpio/gpio$gpio_reset/value ; \
|
||||
sleep $SLEEP; \
|
||||
echo 0 > /sys/class/gpio/gpio$gpio_reset/value; \
|
||||
echo "QCC710 reset complete ...." > /dev/console; }
|
||||
fi
|
||||
}
|
||||
|
||||
while [ -n "$1" ]; do
|
||||
case "$1" in
|
||||
-h|--help) HELP=1; break;;
|
||||
-a|--ipaddr) SERVERIP="$2";shift;;
|
||||
-s|--sleep) SLEEP="$2";shift;;
|
||||
-r|--baud-rate) BAUDRATE="$2";shift;;
|
||||
-*)
|
||||
echo "Invalid option: $1"
|
||||
ERROR=1;
|
||||
break
|
||||
;;
|
||||
*)break;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
[ -n "$HELP" -o -n "$ERROR" ] && {
|
||||
cat <<EOF
|
||||
Usage: $0 [-h] [-a SERVERIP] [-r baud-rate] [-s sleep]
|
||||
ftm_qcc710_start options:
|
||||
-h print this help
|
||||
-a ipaddr of the server for diag connection
|
||||
-r baudrate
|
||||
-s sleep
|
||||
|
||||
Example:
|
||||
ftm_qcc710_start -a <serverip> -r <baud-rate> -s <sleep>
|
||||
|
||||
version 1 : ./sbin/ftm_qcc710_start -a 192.168.1.121 -r 2000000 -s 10
|
||||
version 2 : ./sbin/ftm_qcc710_start -a 192.168.1.121 -r 115200 -s 1
|
||||
EOF
|
||||
# If we requested the help flag, then exit normally.
|
||||
# Else, it's probably an error so report it as such.
|
||||
[ -n "$HELP" ] && exit 0
|
||||
exit 1
|
||||
}
|
||||
|
||||
[ -z ${SERVERIP} ] && SERVERIP=$(grep -oh "serverip.*#" /proc/cmdline | awk -F '#' '{print $2}')
|
||||
[ -z ${SERVERIP} ] && read -p "No serverip in cmdline, please enter the serverip : " SERVERIP
|
||||
[ -z ${BAUDRATE} ] && echo -e "Enter baudrate for stack bringup. Options:\n2000000\n115200" && read -p "Enter : " BAUDRATE
|
||||
[ -z ${BAUDRATE} ] && BAUDRATE=2000000
|
||||
qcc710_reset
|
||||
DIAG_PID=$(ps | grep diag_socket_app | grep -v grep | awk '{print $1}')
|
||||
while [ -n "$DIAG_PID" ]
|
||||
do
|
||||
kill -s SIGTERM $DIAG_PID
|
||||
DIAG_PID=$(ps | grep diag_socket_app | grep -v grep | awk '{print $1}')
|
||||
done
|
||||
echo "Stopped previous instances of diag_socket_app process"
|
||||
[ -z "$DIAG_PID" ] && /usr/sbin/diag_socket_app -a $SERVERIP -p 2500 &
|
||||
|
||||
FTM_PID=$(ps | grep "ftm " | grep -v grep | awk '{print $1}')
|
||||
while [ -n "$FTM_PID" ]
|
||||
do
|
||||
kill -s SIGTERM $FTM_PID
|
||||
FTM_PID=$(ps | grep "ftm " | grep -v grep | awk '{print $1}')
|
||||
done
|
||||
echo "Stopped previous instances ftm process"
|
||||
[ -z "$FTM_PID" ] && /usr/sbin/ftm -n -dd -r $BAUDRATE
|
||||
@@ -1,133 +0,0 @@
|
||||
ifeq ($(call is-vendor-board-platform,QCOM),true)
|
||||
|
||||
# Build only if board has BT/FM/WLAN
|
||||
ifeq ($(findstring true, $(BOARD_HAVE_QCOM_FM) $(BOARD_HAVE_BLUETOOTH) $(BOARD_HAS_ATH_WLAN_AR6320)),true)
|
||||
|
||||
LOCAL_PATH:= $(call my-dir)
|
||||
|
||||
BDROID_DIR:= system/bt
|
||||
ifeq ($(TARGET_SUPPORTS_WEARABLES),true)
|
||||
QTI_DIR := hardware/qcom/bt/msm8909/libbt-vendor
|
||||
else
|
||||
QTI_DIR := hardware/qcom/bt/libbt-vendor
|
||||
endif
|
||||
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_C_INCLUDES := $(TARGET_OUT_HEADERS)/diag/include \
|
||||
LOCAL_C_INCLUDES += vendor/qcom/proprietary/diag/src \
|
||||
LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/common/inc \
|
||||
LOCAL_C_INCLUDES += vendor/qcom/proprietary/bt/hci_qcomm_init \
|
||||
LOCAL_C_INCLUDES += vendor/qcom/opensource/fm/helium \
|
||||
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include \
|
||||
LOCAL_C_INCLUDES += $(BDROID_DIR)/hci/include \
|
||||
LOCAL_C_INCLUDES += $(QTI_DIR)/include
|
||||
ifeq ($(TARGET_SUPPORTS_WEARABLES),true)
|
||||
LOCAL_C_INCLUDES += device/qcom/msm8909w/opensource/bluetooth/tools/hidl_client/inc
|
||||
else
|
||||
LOCAL_C_INCLUDES += vendor/qcom/opensource/bluetooth/tools/hidl_client/inc
|
||||
endif
|
||||
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
|
||||
|
||||
LOCAL_CFLAGS:= \
|
||||
-DANDROID \
|
||||
-DDEBUG
|
||||
|
||||
#LOCAL_CFLAGS += -include bionic/libc/include/sys/socket.h
|
||||
#LOCAL_CFLAGS += -include bionic/libc/include/netinet/in.h
|
||||
|
||||
ifneq ($(DISABLE_BT_FTM),true)
|
||||
LOCAL_CFLAGS += -DCONFIG_FTM_BT
|
||||
endif
|
||||
|
||||
ifeq ($(BOARD_HAVE_QCOM_FM),true)
|
||||
LOCAL_CFLAGS += -DCONFIG_FTM_FM
|
||||
endif
|
||||
|
||||
ifeq ($(BOARD_HAS_QCA_FM_SOC), "cherokee")
|
||||
LOCAL_CFLAGS += -DFM_SOC_TYPE_CHEROKEE
|
||||
endif
|
||||
|
||||
ifneq ($(BOARD_ANT_WIRELESS_DEVICE), )
|
||||
LOCAL_CFLAGS += -DCONFIG_FTM_ANT
|
||||
endif
|
||||
LOCAL_CFLAGS += -DCONFIG_FTM_NFC
|
||||
|
||||
ifeq ($(BOARD_HAVE_BLUETOOTH_BLUEZ), true)
|
||||
LOCAL_CFLAGS += -DHAS_BLUEZ_BUILDCFG
|
||||
endif # BOARD_HAVE_BLUETOOTH_BLUEZ
|
||||
|
||||
LOCAL_SRC_FILES:= \
|
||||
ftm_main.c \
|
||||
ftm_nfc.c \
|
||||
ftm_nfcnq.c \
|
||||
ftm_nfcqti.c \
|
||||
ftm_nfcnq_fwdl.c \
|
||||
ftm_nfcnq_test.c
|
||||
|
||||
ifneq ($(DISABLE_BT_FTM),true)
|
||||
LOCAL_SRC_FILES += \
|
||||
ftm_bt.c \
|
||||
ftm_bt_power_pfal_linux.c \
|
||||
ftm_bt_hci_pfal_linux.c \
|
||||
ftm_bt_persist.cpp
|
||||
endif
|
||||
|
||||
ifeq ($(call is-platform-sdk-version-at-least,23),true)
|
||||
LOCAL_CFLAGS += -DANDROID_M
|
||||
endif
|
||||
|
||||
ifeq ($(BOARD_HAVE_QCOM_FM),true)
|
||||
ifeq ($(BOARD_HAS_QCA_FM_SOC), "cherokee")
|
||||
LOCAL_SRC_FILES += ftm_fm.c ftm_fm_pfal_linux_3990.c
|
||||
else
|
||||
LOCAL_SRC_FILES += ftm_fm.c ftm_fm_pfal_linux.c
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(BOARD_ANT_WIRELESS_DEVICE), )
|
||||
LOCAL_SRC_FILES += ftm_ant.c
|
||||
endif
|
||||
|
||||
ifeq ($(findstring true, $(BOARD_HAS_ATH_WLAN) $(BOARD_HAS_ATH_WLAN_AR6320)),true)
|
||||
LOCAL_CFLAGS += -DBOARD_HAS_ATH_WLAN_AR6320
|
||||
LOCAL_CFLAGS += -DCONFIG_FTM_WLAN
|
||||
LOCAL_CFLAGS += -DCONFIG_FTM_WLAN_AUTOLOAD
|
||||
LOCAL_STATIC_LIBRARIES += libtcmd
|
||||
LOCAL_SHARED_LIBRARIES += libnl
|
||||
LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/libtcmd
|
||||
LOCAL_SRC_FILES += ftm_wlan.c
|
||||
endif
|
||||
|
||||
LOCAL_SHARED_LIBRARIES += libdl
|
||||
|
||||
ifneq ($(DISABLE_BT_FTM),true)
|
||||
LOCAL_SHARED_LIBRARIES += libbt-hidlclient
|
||||
endif
|
||||
|
||||
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES)
|
||||
LOCAL_MODULE:= ftmdaemon
|
||||
LOCAL_CLANG := true
|
||||
ifeq ($(PRODUCT_VENDOR_MOVE_ENABLED),true)
|
||||
LOCAL_PROPRIETARY_MODULE := true
|
||||
endif
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_SHARED_LIBRARIES += libdiag
|
||||
LOCAL_SHARED_LIBRARIES += libcutils liblog libhardware
|
||||
|
||||
ifneq ($(DISABLE_BT_FTM),true)
|
||||
LOCAL_SHARED_LIBRARIES += libbtnv
|
||||
endif
|
||||
|
||||
# By default NV persist gets used
|
||||
LOCAL_CFLAGS += -DBT_NV_SUPPORT
|
||||
|
||||
LDFLAGS += -ldl
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
include $(call all-makefiles-under,$(LOCAL_PATH))
|
||||
|
||||
endif # filter
|
||||
endif # is-vendor-board-platform
|
||||
@@ -1,181 +0,0 @@
|
||||
This text file is provided to comply with the attribution requirements of
|
||||
the licenses herein, but see NOTICE for license terms of this software.
|
||||
The Apache 2.0 license can be found at
|
||||
http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
@@ -1,12 +0,0 @@
|
||||
#CC := $(ATH_CROSS_COMPILE_TYPE)gcc
|
||||
TARGET_TYPE ?= AR9888
|
||||
TARGET_VERS ?= v2
|
||||
|
||||
#Sources to compile
|
||||
CSRCS := ftm_main.c ftm_wlan.c ftm_write_to_flash.c
|
||||
|
||||
all:
|
||||
$(CC) $(CFLAGS) $(LDFLAGS) -g3 -Wall \
|
||||
$(CSRCS) -o ftm
|
||||
clean:
|
||||
rm -f ftm
|
||||
@@ -1,86 +0,0 @@
|
||||
AM_CFLAGS = -Wall \
|
||||
-g -O0 \
|
||||
$(DIAG_CFLAGS)
|
||||
|
||||
AM_CPPFLAGS = -Wall \
|
||||
-g -O0 \
|
||||
$(DIAG_CFLAGS)
|
||||
|
||||
AM_CFLAGS += -I${WORKSPACE}/system/bt/hci/include
|
||||
AM_CFLAGS += -I${WORKSPACE}/vendor/qcom/proprietary/bt/hci_qcomm_init/
|
||||
|
||||
AM_CPPFLAGS += -I${WORKSPACE}/system/bt/hci/include
|
||||
AM_CPPFLAGS += -I${WORKSPACE}/vendor/qcom/proprietary/bt/hci_qcomm_init/
|
||||
|
||||
if DEBUG
|
||||
AM_CFLAGS += -DDEBUG
|
||||
AM_CPPFLAGS += -DDEBUG
|
||||
endif
|
||||
|
||||
requiredlibs = -lrt $(DIAG_LIBS)
|
||||
|
||||
if USE_GLIB
|
||||
AM_CFLAGS += -DUSE_GLIB $(GLIB_CFLAGS)
|
||||
AM_CPPFLAGS += -DUSE_GLIB $(GLIB_CFLAGS)
|
||||
requiredlibs += $(GLIB_LIBS)
|
||||
endif
|
||||
|
||||
#By default build for MDM_LE
|
||||
AM_CFLAGS += -DMDM_LE
|
||||
AM_CPPFLAGS += -DMDM_LE
|
||||
|
||||
if MDM_ROME
|
||||
AM_CFLAGS += -DBT_SOC_TYPE_ROME
|
||||
AM_CPPFLAGS += -DBT_SOC_TYPE_ROME
|
||||
else
|
||||
if MDM_PRONTO
|
||||
AM_CFLAGS += -DHCI_USE_MCT
|
||||
AM_CPPFLAGS += -DHCI_USE_MCT
|
||||
endif
|
||||
endif
|
||||
|
||||
c_sources = ftm_main.c
|
||||
|
||||
if CONFIG_FTM_BT
|
||||
AM_CFLAGS += -DCONFIG_FTM_BT -DBT_NV_SUPPORT
|
||||
AM_CPPFLAGS += -DCONFIG_FTM_BT -DBT_NV_SUPPORT
|
||||
c_sources += ftm_bt.c
|
||||
c_sources += ftm_bt_power_pfal_linux.c
|
||||
c_sources += ftm_bt_hci_pfal_linux.c
|
||||
c_sources += ftm_bt_persist.cpp
|
||||
endif
|
||||
|
||||
if CONFIG_FTM_FM
|
||||
AM_CFLAGS += -DCONFIG_FTM_FM
|
||||
c_sources += ftm_fm.c
|
||||
c_sources += ftm_fm_pfal_linux.c
|
||||
endif
|
||||
|
||||
if CONFIG_FTM_ANT
|
||||
AM_CFLAGS += -DCONFIG_FTM_ANT
|
||||
c_sources += ftm_ant.c
|
||||
endif
|
||||
|
||||
if CONFIG_FTM_NFC
|
||||
AM_CFLAGS += -DCONFIG_FTM_NFC
|
||||
c_sources += ftm_nfc.c
|
||||
c_sources += ftm_nfcnq.c
|
||||
c_sources += ftm_nfcqti.c
|
||||
c_sources += ftm_nfcnq_fwdl.c
|
||||
c_sources += ftm_nfcnq_test.c
|
||||
endif
|
||||
|
||||
if CONFIG_FTM_WLAN
|
||||
|
||||
AM_CFLAGS += -DCONFIG_FTM_WLAN -DCONFIG_FTM_WLAN_AUTOLOAD
|
||||
AM_CFLAGS += $(LIBNL_CFLAGS) $(ATH6KL_UTILS_CFLAGS)
|
||||
AM_CPPFLAGS += $(LIBNL_CFLAGS) $(ATH6KL_UTILS_CFLAGS)
|
||||
|
||||
requiredlibs += $(ATH6KL_UTILS_LIBS) $(LIBNL_LIBS)
|
||||
|
||||
c_sources += ftm_wlan.c
|
||||
endif
|
||||
|
||||
ftmdaemon_SOURCES = $(c_sources)
|
||||
ftmdaemon_LDADD = -ldl $(requiredlibs) -lbtnv
|
||||
bin_PROGRAMS = ftmdaemon
|
||||
@@ -1,72 +0,0 @@
|
||||
This NOTICE file contains certain notices of software components included
|
||||
with the software that Qualcomm Technologies, Inc. ("Qualcomm Technologies")
|
||||
is required to provide you. Notwithstanding anything in the notices in this
|
||||
file, your use of these software components together with the
|
||||
Qualcomm Technologies software (Qualcomm Technologies software hereinafter
|
||||
referred to as "Software") is subject to the terms of your license from
|
||||
Qualcomm Technologies. Compliance with all copyright laws and software
|
||||
license agreements included in the notice section of this file are the
|
||||
responsibility of the user. Except as may be granted by separate express
|
||||
written agreement, this file provides no license to any patents,
|
||||
trademarks, copyrights, or other intellectual property.
|
||||
|
||||
Copyright (c) 2016 Qualcomm Technologies, Inc.
|
||||
All rights reserved.
|
||||
Qualcomm is a registered trademark and registered service mark of
|
||||
QUALCOMM Incorporated. All other trademarks and service marks are the
|
||||
property of their respective owners.
|
||||
________________________________________
|
||||
NOTICES
|
||||
________________________________________
|
||||
|
||||
Copyright (C) 2010 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
________________________________________
|
||||
|
||||
Copyright (C) 2015 NXP Semiconductors
|
||||
The original Work has been changed by NXP Semiconductors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
________________________________________
|
||||
|
||||
Copyright (C) 2015 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
________________________________________
|
||||
|
||||
Note: Any files for which the above Apache License notices are required
|
||||
to be provided are not contributions.
|
||||
|
||||
A copy of the Apache 2.0 license is included in the file LICENSE
|
||||
for attribution purposes only.
|
||||
@@ -1,149 +0,0 @@
|
||||
# -*- Autoconf -*-
|
||||
|
||||
# configure.ac -- Autoconf script for ftm.
|
||||
#
|
||||
|
||||
# Process this file with autoconf to produce a configure script
|
||||
|
||||
# Requires autoconf tool later than 2.61
|
||||
AC_PREREQ(2.61)
|
||||
# Initialize the ftm package version 1.0.0
|
||||
AC_INIT([ftm],1.0.0)
|
||||
# Does not strictly follow GNU Coding standards
|
||||
AM_INIT_AUTOMAKE([foreign])
|
||||
# Disables auto rebuilding of configure, Makefile.ins
|
||||
AM_MAINTAINER_MODE
|
||||
# defines some macros variable to be included by source
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CC
|
||||
AC_PROG_CXX
|
||||
AM_PROG_CC_C_O
|
||||
AC_PROG_LIBTOOL
|
||||
AC_PROG_AWK
|
||||
AC_PROG_CPP
|
||||
AC_PROG_INSTALL
|
||||
AC_PROG_LN_S
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
# Checks for libraries.
|
||||
PKG_CHECK_MODULES([DIAG], [diag])
|
||||
AC_SUBST([DIAG_CFLAGS])
|
||||
AC_SUBST([DIAG_LIBS])
|
||||
|
||||
has_libnl_ver=0
|
||||
# libnl-2 provides only libnl-2.0.pc file, so we check for separate libnl-genl-3.0.pc
|
||||
# pkg-config file just for libnl-3.0 case.
|
||||
#
|
||||
PKG_CHECK_MODULES([LIBNL], [libnl-3.0 >= 3.0 libnl-genl-3.0 >= 3.0], [has_libnl_ver=3], [
|
||||
PKG_CHECK_MODULES([LIBNL], [libnl-2.0 >= 2.0], [has_libnl_ver=2], [
|
||||
PKG_CHECK_MODULES([LIBNL], [libnl-1], [has_libnl_ver=1], [has_libnl_ver=0])])])
|
||||
|
||||
if (test "$has_libnl_ver" -eq 0); then
|
||||
AC_MSG_ERROR(libnl and libnl-genl are required but were not found)
|
||||
fi
|
||||
|
||||
if (test "$has_libnl_ver" -gt 1); then
|
||||
AC_DEFINE([HAVE_LIBNL20], [1], [Define if you have libnl-2.0 or higher])
|
||||
fi
|
||||
|
||||
AC_SUBST([LIBNL_CFLAGS])
|
||||
AC_SUBST([LIBNL_LIBS])
|
||||
|
||||
PKG_CHECK_MODULES([ATH6KL_UTILS], [ath6kl-utils])
|
||||
AC_SUBST([ATH6KL_UTILS_CFLAGS])
|
||||
AC_SUBST([ATH6KL_UTILS_LIBS])
|
||||
|
||||
AC_ARG_WITH([glib],
|
||||
AC_HELP_STRING([--with-glib],
|
||||
[enable glib, building FTM Daemon which use glib]))
|
||||
|
||||
if (test "x${with_glib}" = "xyes"); then
|
||||
PKG_CHECK_MODULES(GTHREAD, gthread-2.0 >= 2.16, dummy=yes,
|
||||
AC_MSG_ERROR(GThread >= 2.16 is required))
|
||||
PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.16, dummy=yes,
|
||||
AC_MSG_ERROR(GLib >= 2.16 is required))
|
||||
GLIB_CFLAGS="$GLIB_CFLAGS $GTHREAD_CFLAGS"
|
||||
GLIB_LIBS="$GLIB_LIBS $GTHREAD_LIBS"
|
||||
|
||||
AC_SUBST(GLIB_CFLAGS)
|
||||
AC_SUBST(GLIB_LIBS)
|
||||
fi
|
||||
AM_CONDITIONAL(USE_GLIB, test "x${with_glib}" = "xyes")
|
||||
|
||||
AC_ARG_ENABLE([debug],
|
||||
[ --enable-debug Turn on debugging],
|
||||
[case "${enableval}" in
|
||||
yes) debug=true ;;
|
||||
no) debug=false ;;
|
||||
*) AC_MSG_ERROR([bad value ${enableval} for --enable-debug]) ;;
|
||||
esac],[debug=false])
|
||||
|
||||
AM_CONDITIONAL([DEBUG], [test x$debug = xtrue])
|
||||
|
||||
AC_ARG_ENABLE([all],
|
||||
[ --enable-all Enable all FTM functionality],
|
||||
[case "${enableval}" in
|
||||
yes) all=true ;;
|
||||
no) all=false ;;
|
||||
*) AC_MSG_ERROR([bad value ${enableval} for --enable-all]) ;;
|
||||
esac],[all=false])
|
||||
|
||||
AM_CONDITIONAL([CONFIG_FTM_BT], [test x$all = xtrue])
|
||||
AM_CONDITIONAL([CONFIG_FTM_FM], [test x$all = xtrue])
|
||||
AM_CONDITIONAL([CONFIG_FTM_ANT], [test x$all = xtrue])
|
||||
AM_CONDITIONAL([CONFIG_FTM_NFC], [test x$all = xtrue])
|
||||
|
||||
AC_ARG_ENABLE([wlan],
|
||||
[ --enable-wlan Enable WLAN FTM functionality],
|
||||
[case "${enableval}" in
|
||||
yes) wlan=true ;;
|
||||
no) wlan=false ;;
|
||||
*) AC_MSG_ERROR([bad value ${enableval} for --enable-wlan]) ;;
|
||||
esac],[wlan=false])
|
||||
|
||||
AM_CONDITIONAL([CONFIG_FTM_WLAN], [test x$wlan = xtrue -o x$all = xtrue])
|
||||
|
||||
AC_ARG_ENABLE([bt],
|
||||
[ --enable-bt Enable BT FTM functionality],
|
||||
[case "${enableval}" in
|
||||
yes) bt=true ;;
|
||||
no) bt=false ;;
|
||||
*) AC_MSG_ERROR([bad value ${enableval} for --enable-bt]) ;;
|
||||
esac],[bt=false])
|
||||
|
||||
AM_CONDITIONAL([CONFIG_FTM_BT], [test x$bt = xtrue -o x$all = xtrue])
|
||||
|
||||
|
||||
AC_ARG_ENABLE(target,
|
||||
[AS_HELP_STRING([--enable-target=TARGET], [Specify the target product to build])],
|
||||
[TARGET=$enableval],
|
||||
[TARGET=none]
|
||||
)
|
||||
AM_CONDITIONAL([MDM_ROME], [test "x$TARGET" = "xmdm9607" -o "x$TARGET" = "xmdm9635" -o "x$TARGET" = "xmdm9640" -o "x$TARGET" = "xmdmcalifornium"])
|
||||
AM_CONDITIONAL([MDM_PRONTO], [test "x$TARGET" = "xapq8009" -o "x$TARGET" = "xapq8017" -o "x$TARGET" = "xapq8053"])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_HEADER_STDBOOL
|
||||
AC_HEADER_STDC
|
||||
AC_C_INLINE
|
||||
AC_TYPE_INT64_T
|
||||
AC_TYPE_PID_T
|
||||
AC_TYPE_SIZE_T
|
||||
AC_TYPE_SSIZE_T
|
||||
AC_TYPE_UINT16_T
|
||||
AC_TYPE_UINT32_T
|
||||
AC_TYPE_UINT8_T
|
||||
|
||||
# Checks for library functions.
|
||||
AC_FUNC_ERROR_AT_LINE
|
||||
AC_FUNC_FORK
|
||||
AC_FUNC_MALLOC
|
||||
|
||||
AC_CONFIG_FILES([ \
|
||||
Makefile \
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
||||
@@ -1,585 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM ANT Source File
|
||||
|
||||
Description
|
||||
FTM platform independent processing of packet data
|
||||
|
||||
# Copyright (c) 2010-2012 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
05/16/12 ankurn Adding support for ANT commands
|
||||
11/28/12 c_ssugas implements efficent method for Ant cmd transfer
|
||||
and implements Rx thread for event handling.
|
||||
===========================================================================*/
|
||||
#include "event.h"
|
||||
#include "msg.h"
|
||||
#include "log.h"
|
||||
|
||||
#include "diag_lsm.h"
|
||||
#include "diagpkt.h"
|
||||
#include "diagcmd.h"
|
||||
#include "diag.h"
|
||||
#include "termios.h"
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <dlfcn.h>
|
||||
#include "bt_vendor_qcom.h"
|
||||
#include "ftm_ant_common.h"
|
||||
#include "ftm_bt.h"
|
||||
#include <string.h>
|
||||
#include "hidl_client.h"
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <cutils/properties.h>
|
||||
#endif
|
||||
|
||||
#ifdef ANDROID
|
||||
extern int soc_type;
|
||||
#endif
|
||||
|
||||
#define ANT_CTRL_PACKET_TYPE 0x0c
|
||||
#define ANT_DATA_PACKET_TYPE 0x0e
|
||||
|
||||
#define UNUSED(x) (void)(x)
|
||||
|
||||
int init_transport_ant(int on);
|
||||
// The following functions are dummy implementations of the callbacks required by libbt-vendor.
|
||||
static void vendor_fwcfg_cb(bt_vendor_op_result_t result) {
|
||||
UNUSED(result);
|
||||
}
|
||||
static void vendor_scocfg_cb(bt_vendor_op_result_t result) {
|
||||
UNUSED(result);
|
||||
}
|
||||
static void vendor_lpm_vnd_cb(bt_vendor_op_result_t result) {
|
||||
UNUSED(result);
|
||||
}
|
||||
static void vendor_audio_state_cb(bt_vendor_op_result_t result) {
|
||||
UNUSED(result);
|
||||
}
|
||||
static void* vendor_alloc(int size) {
|
||||
UNUSED(size);
|
||||
return NULL;
|
||||
}
|
||||
static void vendor_dealloc(void *p_buf) {
|
||||
UNUSED(p_buf);
|
||||
}
|
||||
static uint8_t vendor_xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback) {
|
||||
UNUSED(opcode);
|
||||
UNUSED(p_buf);
|
||||
UNUSED(p_cback);
|
||||
return 0;
|
||||
}
|
||||
static void vendor_epilog_cb(bt_vendor_op_result_t result) {
|
||||
UNUSED(result);
|
||||
}
|
||||
static void vendor_a2dp_offload_cb(bt_vendor_op_result_t result, bt_vendor_opcode_t op, unsigned char handle) {
|
||||
UNUSED(result);
|
||||
UNUSED(op);
|
||||
UNUSED(handle);
|
||||
}
|
||||
|
||||
// This struct is used to regsiter the dummy callbacks with libbt-vendor
|
||||
static bt_vendor_interface_t *vendor_interface=NULL;
|
||||
static const bt_vendor_callbacks_t vendor_callbacks = {
|
||||
sizeof(bt_vendor_callbacks_t),
|
||||
vendor_fwcfg_cb,
|
||||
vendor_scocfg_cb,
|
||||
vendor_lpm_vnd_cb,
|
||||
vendor_audio_state_cb,
|
||||
vendor_alloc,
|
||||
vendor_dealloc,
|
||||
vendor_xmit_cb,
|
||||
vendor_epilog_cb,
|
||||
vendor_a2dp_offload_cb
|
||||
};
|
||||
|
||||
/* Transport file descriptor */
|
||||
int fd_transport_ant_cmd;
|
||||
extern int first_ant_command;
|
||||
/* Reader thread handle */
|
||||
pthread_t ant_cmd_thread_hdl;
|
||||
/* Pipe file descriptors for cancelling read operation */
|
||||
int ant_pipefd[2];
|
||||
|
||||
/* Enable FTM_DEBUG to turn on Debug messages */
|
||||
//#define FTM_DEBUG
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_ant_readerthread
|
||||
|
||||
DESCRIPTION
|
||||
Thread Routine to perfom asynchrounous handling of events coming on Smd
|
||||
descriptor. It invokes a callback to the FTM ANT layer to intiate a request
|
||||
to read event bytes.
|
||||
|
||||
DEPENDENCIES
|
||||
The LifeTime of ReaderThraad is dependent on the status returned by the
|
||||
call to ftm_ant_qcomm_handle_event
|
||||
|
||||
RETURN VALUE
|
||||
RETURN NULL
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
void *ftm_ant_readerthread(void *ptr)
|
||||
{
|
||||
boolean status = FALSE;
|
||||
int retval;
|
||||
fd_set readfds;
|
||||
int buf;
|
||||
|
||||
UNUSED(ptr);
|
||||
#ifdef FTM_DEBUG
|
||||
printf("ftm_ant_readerthread --> \n");
|
||||
#endif
|
||||
do
|
||||
{
|
||||
FD_ZERO(&readfds);
|
||||
FD_SET(fd_transport_ant_cmd, &readfds);
|
||||
FD_SET(ant_pipefd[0],&readfds);
|
||||
retval = select((fd_transport_ant_cmd>ant_pipefd[0]?fd_transport_ant_cmd
|
||||
:ant_pipefd[0]) + 1, &readfds, NULL, NULL, NULL);
|
||||
if(retval == -1)
|
||||
{
|
||||
printf("select failed\n");
|
||||
break;
|
||||
}
|
||||
if(FD_ISSET(ant_pipefd[0],&readfds))
|
||||
{
|
||||
#ifdef FTM_DEBUG
|
||||
printf("Pipe descriptor set\n");
|
||||
#endif
|
||||
read(ant_pipefd[0],&buf,1);
|
||||
if(buf == 1)
|
||||
break;
|
||||
}
|
||||
if(FD_ISSET(fd_transport_ant_cmd,&readfds))
|
||||
{
|
||||
#ifdef FTM_DEBUG
|
||||
printf("Read descriptor set\n");
|
||||
#endif
|
||||
status = ftm_ant_qcomm_handle_event();
|
||||
if(TRUE != status)
|
||||
break;
|
||||
}
|
||||
}
|
||||
while(1);
|
||||
#ifdef FTM_DEBUG
|
||||
printf("\nReader thread exited\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_ant_open_channel
|
||||
|
||||
DESCRIPTION
|
||||
Open the SMD transport associated with ANT
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
int value indicating success or failure
|
||||
|
||||
SIDE EFFECTS
|
||||
NONE
|
||||
|
||||
===========================================================================*/
|
||||
static bool ftm_ant_open_channel()
|
||||
{
|
||||
struct termios term_port;
|
||||
int opts;
|
||||
|
||||
printf("%s: \n",__func__ );
|
||||
switch (soc_type)
|
||||
{
|
||||
case BT_SOC_ROME:
|
||||
case BT_SOC_CHEROKEE:
|
||||
case BT_SOC_NAPIER:
|
||||
//Use hidl_client_initialize for chip initialization
|
||||
if (hidl_client_initialize(MODE_ANT,&fd_transport_ant_cmd) == false) {
|
||||
printf("%s: HIDL client initialization failed, opening port with init_transpor_ant\n", __func__);
|
||||
//Use libbt-vendor for chip initialization
|
||||
fd_transport_ant_cmd = init_transport_ant(TRUE);
|
||||
if (fd_transport_ant_cmd == -1) {
|
||||
printf("%s: ANT Device open Failed, fd:%d: \n", __func__, fd_transport_ant_cmd);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case BT_SOC_AR3K:
|
||||
case BT_SOC_SMD:
|
||||
#ifdef FTM_DEBUG
|
||||
printf("ftm_ant_open_channel --> \n");
|
||||
#endif
|
||||
|
||||
fd_transport_ant_cmd = open(APPS_RIVA_ANT_CMD_CH, (O_RDWR));
|
||||
if (fd_transport_ant_cmd == -1) {
|
||||
printf("Ant Device open Failed= %d\n ", fd_transport_ant_cmd);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Blocking Read
|
||||
opts = fcntl(fd_transport_ant_cmd, F_GETFL);
|
||||
if (opts < 0) {
|
||||
perror("fcntl(F_GETFL)");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
opts = opts & (~O_NONBLOCK);
|
||||
if (fcntl(fd_transport_ant_cmd, F_SETFL, opts) < 0) {
|
||||
perror("fcntl(F_SETFL)");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (tcgetattr(fd_transport_ant_cmd, &term_port) < 0)
|
||||
close(fd_transport_ant_cmd);
|
||||
cfmakeraw(&term_port);
|
||||
if (tcsetattr(fd_transport_ant_cmd, TCSANOW, &term_port) < 0) {
|
||||
printf("\n Error while setting attributes\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
tcflush(fd_transport_ant_cmd, TCIFLUSH);
|
||||
#ifdef FTM_DEBUG
|
||||
printf("ftm_ant_open_channel success \n");
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
ALOGE("%s:Unknown soc type.",__func__);
|
||||
return false;
|
||||
}
|
||||
if (pipe(ant_pipefd) == -1)
|
||||
{
|
||||
printf("pipe create error");
|
||||
return STATUS_FAIL;
|
||||
}
|
||||
/* Creating read thread which listens for various masks & pkt requests */
|
||||
pthread_create( &ant_cmd_thread_hdl, NULL, ftm_ant_readerthread, NULL);
|
||||
return true;
|
||||
}
|
||||
|
||||
int init_transport_ant(int on) {
|
||||
|
||||
void *so_handle;
|
||||
unsigned char bdaddr[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
|
||||
int fd[CH_MAX], powerstate, ret = -1;
|
||||
char ref_count[PROPERTY_VALUE_MAX];
|
||||
int value;
|
||||
|
||||
if (on) {
|
||||
so_handle = dlopen("libbt-vendor.so", RTLD_NOW);
|
||||
if (!so_handle)
|
||||
{
|
||||
ALOGE("Failed to load vendor component");
|
||||
return -1;
|
||||
}
|
||||
|
||||
vendor_interface = (bt_vendor_interface_t *) dlsym(so_handle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
|
||||
if (!vendor_interface)
|
||||
{
|
||||
ALOGE("Failed to accesst bt vendor interface");
|
||||
return -1;
|
||||
}
|
||||
|
||||
vendor_interface->init(&vendor_callbacks, bdaddr);
|
||||
|
||||
ALOGI("Turn On BT power");
|
||||
powerstate = BT_VND_PWR_ON;
|
||||
ret = vendor_interface->op(BT_VND_OP_POWER_CTRL, &powerstate);
|
||||
if (ret < 0)
|
||||
{
|
||||
ALOGE("Failed to turn on power from bt vendor interface");
|
||||
return -1;
|
||||
}
|
||||
for (int i = 0; i < CH_MAX; i++)
|
||||
fd[i] = -1;
|
||||
|
||||
#ifdef ANDROID
|
||||
if (soc_type == BT_SOC_ROME || soc_type == BT_SOC_CHEROKEE || soc_type == BT_SOC_NAPIER) {
|
||||
/*call ANT_USERIAL_OPEN to get ANT handle*/
|
||||
ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_OPEN, fd);
|
||||
}
|
||||
#else
|
||||
#ifdef BT_SOC_TYPE_ROME
|
||||
/*call ANT_USERIAL_OPEN to get ANT handle*/
|
||||
ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_OPEN, fd);
|
||||
#endif
|
||||
#endif
|
||||
ALOGE("ret value: %d", ret);
|
||||
if (ret != 1)
|
||||
{
|
||||
ALOGE("Failed to get fd from bt vendor interface");
|
||||
return -1;
|
||||
} else {
|
||||
ALOGE("FD: %x", fd[0]);
|
||||
return fd[0];
|
||||
}
|
||||
} else {
|
||||
if (vendor_interface) {
|
||||
ALOGE("Close and cleanup the interfaces");
|
||||
|
||||
#ifdef ANDROID
|
||||
if (soc_type == BT_SOC_ROME || soc_type == BT_SOC_CHEROKEE || soc_type == BT_SOC_NAPIER) {
|
||||
int ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_CLOSE, NULL);
|
||||
}
|
||||
#else
|
||||
#ifdef BT_SOC_TYPE_ROME
|
||||
int ret = vendor_interface->op((bt_vendor_opcode_t)BT_VND_OP_ANT_USERIAL_CLOSE, NULL);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
ALOGE("ret value: %d", ret);
|
||||
ALOGI("Turn off BT power");
|
||||
powerstate = BT_VND_PWR_OFF;
|
||||
ret = vendor_interface->op(BT_VND_OP_POWER_CTRL, &powerstate);
|
||||
if (ret < 0)
|
||||
{
|
||||
ALOGE("Failed to turn off power from bt vendor interface");
|
||||
return -1;
|
||||
}
|
||||
vendor_interface->cleanup();
|
||||
vendor_interface = NULL;
|
||||
return 0;
|
||||
} else {
|
||||
|
||||
ALOGE("Not able to find vendor interface handle");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_log_send_msg
|
||||
|
||||
DESCRIPTION
|
||||
Processes the buffer sent and sends it to the libdiag for sending the Cmd
|
||||
response
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
NIL
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
void ftm_ant_log_send_msg(const uint8 *pEventBuf,int event_bytes)
|
||||
{
|
||||
int result = log_status(LOG_FTM_VER_2_C);
|
||||
ftm_ant_log_pkt_type* ftm_ant_log_pkt_ptr = NULL;
|
||||
|
||||
if((pEventBuf == NULL) || (event_bytes == 0))
|
||||
return;
|
||||
#ifdef FTM_DEBUG
|
||||
printf("ftm_ant_log_send_msg --> \n");
|
||||
#endif
|
||||
if(result == 1)
|
||||
{
|
||||
ftm_ant_log_pkt_ptr = (ftm_ant_log_pkt_type *)log_alloc(LOG_FTM_VER_2_C,
|
||||
FTM_ANT_LOG_HEADER_SIZE + (event_bytes-1));
|
||||
if(ftm_ant_log_pkt_ptr != NULL)
|
||||
{
|
||||
/* FTM ANT Log PacketID */
|
||||
ftm_ant_log_pkt_ptr->ftm_log_id = FTM_ANT_LOG_PKT_ID;
|
||||
memcpy((void *)ftm_ant_log_pkt_ptr->data,(void *)pEventBuf,event_bytes);
|
||||
log_commit( ftm_ant_log_pkt_ptr );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_ant_dispatch
|
||||
|
||||
DESCRIPTION
|
||||
Dispatch routine for the various FM Rx/Tx commands. Copies the data into
|
||||
a global union data structure before calling the processing routine
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
A Packed structre pointer including the response to the FTM FM packet
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
void * ftm_ant_dispatch(ftm_ant_pkt_type *ant_ftm_pkt, uint16 pkt_len)
|
||||
{
|
||||
ftm_ant_generic_sudo_res *rsp;
|
||||
int err = 0, i;
|
||||
int data_len = ant_ftm_pkt->cmd_data_len;
|
||||
bool resp = false;
|
||||
unsigned char *pdata = NULL, *ptemp;
|
||||
#ifdef FTM_DEBUG
|
||||
printf("ftm_ant_dispatch --> \n");
|
||||
#endif
|
||||
|
||||
UNUSED(pkt_len);
|
||||
|
||||
if (first_ant_command == 0) {
|
||||
first_ant_command = 1;
|
||||
ftm_ant_open_channel();
|
||||
}
|
||||
|
||||
rsp = (ftm_ant_generic_sudo_res*)diagpkt_subsys_alloc( DIAG_SUBSYS_FTM
|
||||
, FTM_ANT_CMD_CODE
|
||||
, sizeof(ftm_ant_generic_sudo_res)
|
||||
);
|
||||
if(rsp == NULL)
|
||||
{
|
||||
printf("%s Failed to allocate resource",__func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch (soc_type) {
|
||||
//Rome shares the same UART transport for ANT and BT. Hence, to differenciate the
|
||||
//packets by controller, adding one extra byte for ANT data and control packets
|
||||
case BT_SOC_ROME:
|
||||
case BT_SOC_CHEROKEE:
|
||||
case BT_SOC_NAPIER:
|
||||
data_len = data_len + 1;
|
||||
pdata = (unsigned char *) malloc(data_len);
|
||||
if (pdata == NULL) {
|
||||
ALOGE("Failed to allocate the memory for ANT command packet");
|
||||
rsp->result = FTM_ANT_FAIL;
|
||||
return (void *) rsp;
|
||||
}
|
||||
//To be compatible with Legacy, SMD based PLs, send all the packets
|
||||
//with cmd opcode 0x0c
|
||||
pdata[0] = 0x0c;
|
||||
memcpy(pdata+1, ant_ftm_pkt->data, data_len-1);
|
||||
err = write(fd_transport_ant_cmd, pdata, data_len);
|
||||
ptemp = pdata;
|
||||
break;
|
||||
case BT_SOC_AR3K:
|
||||
case BT_SOC_SMD:
|
||||
/* Send the packet to controller and send a dummy response back to host*/
|
||||
err = write(fd_transport_ant_cmd, ant_ftm_pkt->data, data_len);
|
||||
ptemp = ant_ftm_pkt->data;
|
||||
break;
|
||||
default:
|
||||
ALOGE("%s:Unknown soc type", __func__);
|
||||
break;
|
||||
}
|
||||
if (err == data_len) {
|
||||
rsp->result = FTM_ANT_SUCCESS;
|
||||
printf("ANT CMD: ");
|
||||
for (i = 1; i<data_len; i++) {
|
||||
printf("%02X ", ptemp[i]);
|
||||
}
|
||||
printf("\n");
|
||||
} else {
|
||||
rsp->result = FTM_ANT_FAIL;
|
||||
printf("FTM ANT write fail len: %d\n", err);
|
||||
}
|
||||
if (pdata)
|
||||
free(pdata);
|
||||
return (void *)rsp;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_qcomm_handle_event
|
||||
|
||||
DESCRIPTION
|
||||
Routine called by the HAL layer reader thread to process the HCI events
|
||||
The post conditions of each event is covered in a state machine pattern
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
FALSE = failure, else TRUE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
boolean ftm_ant_qcomm_handle_event ()
|
||||
{
|
||||
boolean status = TRUE;
|
||||
int nbytes,i,len =0;
|
||||
int event_type;
|
||||
ftm_ant_generic_res *res = (ftm_ant_generic_res *)diagpkt_subsys_alloc(
|
||||
DIAG_SUBSYS_FTM
|
||||
, FTM_ANT_CMD_CODE
|
||||
, sizeof(ftm_ant_generic_res)
|
||||
);
|
||||
if(res == NULL)
|
||||
{
|
||||
printf("%s Failed to allocate res",__func__);
|
||||
tcflush(fd_transport_ant_cmd, TCIFLUSH);
|
||||
return FALSE;
|
||||
}
|
||||
#ifdef FTM_DEBUG
|
||||
printf("ftm_ant_hci_qcomm_handle_event --> \n");
|
||||
#endif
|
||||
|
||||
/* Read length and event type of Ant Resp event*/
|
||||
nbytes = read(fd_transport_ant_cmd, (void *)res->evt, 2);
|
||||
if(nbytes <= 0) {
|
||||
status = FALSE;
|
||||
printf("ftm_ant_qcomm_handle_event read fail len=%d\n", nbytes);
|
||||
return status;
|
||||
}
|
||||
event_type = res->evt[0];
|
||||
len = res->evt[1];
|
||||
#ifdef FTM_DEBUG
|
||||
printf(" event type =%d\n",event_type);
|
||||
printf("length of event =%d\n",len);
|
||||
#endif
|
||||
/* Read out the Ant Resp event*/
|
||||
if (len <= (int)sizeof(res->evt))
|
||||
{
|
||||
nbytes = read(fd_transport_ant_cmd, (void *)res->evt, len);
|
||||
if (nbytes != len) {
|
||||
res->result = FTM_ANT_FAIL;
|
||||
status = FALSE;
|
||||
printf("ftm_ant_qcomm_handle_event read fail len=%d\n", nbytes);
|
||||
}
|
||||
else {
|
||||
res->result = FTM_ANT_SUCCESS;
|
||||
printf("ANT EVT: ");
|
||||
for (i=0; i<nbytes; i++) {
|
||||
printf("%02X ", res->evt[i]);
|
||||
}
|
||||
printf("\n");
|
||||
ftm_ant_log_send_msg(res->evt, nbytes);
|
||||
tcflush(fd_transport_ant_cmd, TCIOFLUSH);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
res->result = FTM_ANT_FAIL;
|
||||
status = FALSE;
|
||||
printf("ftm_ant_qcomm_handle_event read fail len=%d is more than sizeof(res->evt)=%d\n", len, (int)sizeof(res->evt));
|
||||
}
|
||||
return status;
|
||||
}
|
||||
@@ -1,124 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM FM Common Header File
|
||||
|
||||
Description
|
||||
Global Data declarations of the ftm ant component.
|
||||
|
||||
# Copyright (c) 2012,2014 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
05/16/2012 ankurn Adding support for ANT+
|
||||
11/28/12 c_ssugas Adds data structures and macro for ant log event support.
|
||||
===========================================================================*/
|
||||
|
||||
#ifdef CONFIG_FTM_ANT
|
||||
|
||||
#include "diagpkt.h"
|
||||
#include "log.h"
|
||||
#include "ftm_bt_common.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#define APPS_RIVA_ANT_CMD_CH "/dev/smd5"
|
||||
#define APPS_RIVA_ANT_DATA_CH "/dev/smd6"
|
||||
|
||||
#define FTM_ANT_CMD_CODE 94
|
||||
#define OPCODE_OFFSET 5
|
||||
|
||||
#define FTM_ANT_LOG_HEADER_SIZE (sizeof(ftm_ant_log_pkt_type) - 1)
|
||||
#define FTM_ANT_LOG_PKT_ID 0x0D
|
||||
|
||||
/* FTM Log Packet - Used to send back the event of a ANT Command */
|
||||
typedef PACKED struct
|
||||
{
|
||||
log_hdr_type hdr;
|
||||
word ftm_log_id; /* FTM log id */
|
||||
byte data[1]; /* Variable length payload,
|
||||
look at FTM log id for contents */
|
||||
} ftm_ant_log_pkt_type;
|
||||
|
||||
/* Generic result, used for any command that only returns an error code */
|
||||
typedef enum {
|
||||
FTM_ANT_FAIL,
|
||||
FTM_ANT_SUCCESS,
|
||||
} ftm_ant_api_result_type;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ;
|
||||
char result ;
|
||||
} ftm_ant_generic_sudo_res;
|
||||
|
||||
|
||||
/* Generic Response */
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header; /*Diag header*/
|
||||
uint8 evt[18]; /*allocates memory to hold longest valid event */
|
||||
char result; /* result */
|
||||
}__attribute__((packed)) ftm_ant_generic_res;
|
||||
|
||||
/* FTM ANT request type */
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_cmd_code_type cmd_code;
|
||||
diagpkt_subsys_id_type subsys_id;
|
||||
diagpkt_subsys_cmd_code_type subsys_cmd_code;
|
||||
uint8 cmd_id; /* command id (required) */
|
||||
uint8 cmd_data_len;
|
||||
byte data[1];
|
||||
}__attribute__((packed))ftm_ant_pkt_type;
|
||||
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_ant_dispatch
|
||||
|
||||
DESCRIPTION
|
||||
Dispatch routine for the various ANT commands. Copies the data into
|
||||
a global union data structure before calling the processing routine
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
A Packed structre pointer including the response to the FTM ANT packet
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
void * ftm_ant_dispatch(ftm_ant_pkt_type *ftm_ant_pkt, uint16 length );
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_ant_qcomm_handle_event
|
||||
|
||||
DESCRIPTION
|
||||
Handler for the various ANT Events received. Sends data as log packets
|
||||
using diag to upper layers.
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
Status value TRUE if event received successfuly
|
||||
otherwise returns status value FALSE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
boolean ftm_ant_qcomm_handle_event ();
|
||||
|
||||
#endif /* CONFIG_FTM_ANT */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,289 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM BT Task Header File
|
||||
|
||||
Description
|
||||
Global Data declarations of the ftm bt component.
|
||||
|
||||
# Copyright (c) 2010-2011, 2013-2014 by Qualcomm Technologies, Inc.
|
||||
# All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
09/28/11 rrr Moved peristent NV item related APIs to CPP,
|
||||
for having BD address being programmed twice if previous
|
||||
BD address was random generated.
|
||||
09/03/11 agaja Added support for NV_READ and NV_WRITE Commands to write
|
||||
onto Persist File system
|
||||
02/08/11 braghave Changes to read the HCI commands from a binary file for
|
||||
non-Android case
|
||||
06/18/10 rakeshk Created a header file to hold the definitons for ftm bt
|
||||
task
|
||||
===========================================================================*/
|
||||
|
||||
#ifdef CONFIG_FTM_BT
|
||||
|
||||
#include "diagpkt.h"
|
||||
#include <sys/types.h>
|
||||
#ifdef USE_LIBSOCCFG
|
||||
#include "btqsocnvm.h"
|
||||
#include "btqsocnvmutils.h"
|
||||
#endif
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
** Definitions and Declarations
|
||||
** ------------------------------------------------------------------------- */
|
||||
|
||||
#define FTM_BT_CMD_CODE 4 /* BT FTM Command code */
|
||||
#define FTM_FM_CMD_CODE 28 /* FM FTM Command code */
|
||||
#define HCI_EVT_HDR_SIZE 3
|
||||
#define HCI_ACL_HDR_SIZE 5
|
||||
#define PROTOCOL_BYTE_SIZE 1
|
||||
#define HC_VS_MAX_CMD_EVENT 260
|
||||
#define HC_VS_MAX_ACL 1200
|
||||
#define FTM_BT_HCI_USER_CMD 0
|
||||
#define BT_FTM_CMD_RSP_LEN 1100
|
||||
#define FTM_BT_DRV_START_TEST 0xA
|
||||
|
||||
/* MACROS for pin connectivty test*/
|
||||
#define BT_CMD_SLIM_TEST 0xBFAC
|
||||
#define LOOP_BACK_EVT_OGF 0x02
|
||||
#define LOOP_BACK_EVT_OCF 0x18
|
||||
#define LOOP_BACK_EVT_STATUS 0x00
|
||||
#define LOOP_BACK_EVT_OGF_BIT 0x04
|
||||
#define LOOP_BACK_EVT_OCF_BIT 0x05
|
||||
#define LOOP_BACK_EVT_STATUS_BIT 0x06
|
||||
|
||||
|
||||
#define FTM_BT_LOG_HEADER_SIZE (sizeof(ftm_bt_log_pkt_type) - 1)
|
||||
|
||||
|
||||
/* Vendor Specific command codes */
|
||||
#define BT_QSOC_EDL_CMD_OPCODE (0xFC00)
|
||||
#define BT_QSOC_NVM_ACCESS_OPCODE (0xFC0B)
|
||||
|
||||
#define BT_QSOC_EDL_CMD_CODE (0x00)
|
||||
#define BT_QSOC_NVM_ACCESS_CODE (0x0B)
|
||||
#define BT_QSOC_VS_EDL_APPVER_RESP (0x02)
|
||||
|
||||
#ifndef HC_VS_MAX_CMD_EVENT
|
||||
#define HC_VS_MAX_CMD_EVENT 260
|
||||
#endif /* HC_VS_MAX_CMD_EVENT */
|
||||
|
||||
#define BT_QSOC_MAX_NVM_CMD_SIZE 0x64 /* Maximum size config (NVM) cmd */
|
||||
#define BT_QSOC_MAX_BD_ADDRESS_SIZE 0x06 /**< Length of BT Address */
|
||||
|
||||
#ifndef HCI_CMD_HDR_SIZE
|
||||
#define HCI_CMD_HDR_SIZE 4
|
||||
#endif /* HCI_CMD_HDR_SIZE */
|
||||
|
||||
#ifndef HCI_EVT_HDR_SIZE
|
||||
#define HCI_EVT_HDR_SIZE 3
|
||||
#endif /* HCI_EVT_HDR_SIZE */
|
||||
|
||||
#define FTM_BT_LOG_PKT_ID 0x01
|
||||
|
||||
|
||||
#define BT_HCI_CMD_PKT 0x01
|
||||
#define BT_HCI_ACL_PKT 0x02
|
||||
#define BT_HCI_EVT_PKT 0x04
|
||||
|
||||
#define BT_HCI_CMD_CMPLT_EVT 0x0E
|
||||
#define FM_HCI_EVT_PKT 0x14
|
||||
#define FM_HCI_CMD_PKT 0x11
|
||||
|
||||
extern int boardtype;
|
||||
|
||||
/* VS command structure */
|
||||
typedef struct
|
||||
{
|
||||
uint8 vs_cmd_len;
|
||||
uint8 vs_cmd_data[BT_QSOC_MAX_NVM_CMD_SIZE];
|
||||
} bt_qsoc_cfg_tbl_struct_type;
|
||||
|
||||
/* First Commamd structure - Used to store the First command for later
|
||||
* processing
|
||||
*/
|
||||
struct first_cmd
|
||||
{
|
||||
uint8 *cmd_buf;
|
||||
int cmd_len;
|
||||
};
|
||||
|
||||
/* FTM Global State - Enum defines the various states of the FTM
|
||||
* module
|
||||
*/
|
||||
typedef enum ftm_state
|
||||
{
|
||||
FTM_SOC_NOT_INITIALISED,
|
||||
FTM_SOC_READ_APP_VER,
|
||||
FTM_SOC_READ_HW_VER,
|
||||
FTM_SOC_POKE8_TBL_INIT,
|
||||
FTM_SOC_DOWNLOAD_NVM,
|
||||
FTM_SOC_DOWNLOAD_NVM_EFS,
|
||||
FTM_SOC_SLEEP_DISABLE,
|
||||
FTM_SOC_RESET,
|
||||
FTM_SOC_INITIALISED
|
||||
}ftm_state;
|
||||
/* FTM CMD status */
|
||||
typedef enum ftm_log_packet_type
|
||||
{
|
||||
FTM_USER_CMD_PASS,
|
||||
FTM_USER_CMD_FAIL,
|
||||
FTM_HCI_EVENT
|
||||
}ftm_log_packet_type;
|
||||
|
||||
/* FTM Log Packet - Used to send back the event of a HCI Command */
|
||||
typedef PACKED struct
|
||||
{
|
||||
log_hdr_type hdr;
|
||||
byte data[1]; /* Variable length payload,
|
||||
look at FTM log id for contents */
|
||||
} ftm_bt_log_pkt_type;
|
||||
|
||||
|
||||
/* FTM (BT) PKT Header */
|
||||
typedef PACKED struct
|
||||
{
|
||||
word cmd_id; /* command id (required) */
|
||||
word cmd_data_len; /* request pkt data length, excluding the diag and ftm headers
|
||||
(optional, set to 0 if not used)*/
|
||||
word cmd_rsp_pkt_size; /* rsp pkt size, size of response pkt if different then req pkt
|
||||
(optional, set to 0 if not used)*/
|
||||
} ftm_bt_cmd_header_type;
|
||||
|
||||
/* Bluetooth FTM packet */
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type diag_hdr;
|
||||
ftm_bt_cmd_header_type ftm_hdr;
|
||||
byte data[1];
|
||||
} ftm_bt_pkt_type;
|
||||
|
||||
/* SoC Cfg open Struct*/
|
||||
#ifdef USE_LIBSOCCFG
|
||||
typedef struct
|
||||
{
|
||||
bt_qsoc_config_params_struct_type run_time_params;
|
||||
bt_qsoc_enum_nvm_mode nvm_mode;
|
||||
bt_qsoc_enum_type soc_type;
|
||||
}ftm_bt_soc_runtime_cfg_type;
|
||||
#endif
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_err_timedout
|
||||
|
||||
DESCRIPTION
|
||||
This routine triggers the shutdown of the HCI and Power resources in case
|
||||
a HCI command previously sent times out.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN NIL
|
||||
|
||||
SIDE EFFECTS
|
||||
NONE
|
||||
|
||||
===========================================================================*/
|
||||
void ftm_bt_err_timedout();
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_dispatch
|
||||
|
||||
DESCRIPTION
|
||||
Processes the BT FTM packet and dispatches the command to FTM HCI driver
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
NIL,The error in the Command Processing is sent to the DIAG App on PC via
|
||||
log packets
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
void ftm_bt_dispatch(void *ftm_bt_pkt ,int cmd_len );
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION bt_hci_send_ftm_cmd
|
||||
|
||||
DESCRIPTION
|
||||
Helper Routine to process the HCI cmd and invokes the sub routines to intialise
|
||||
the SoC if needed based on the state of the FTM module
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
FALSE = failure, else TRUE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
boolean ftm_bt_hci_send_cmd
|
||||
(
|
||||
uint8 * cmd_buf, /* pointer to Cmd */
|
||||
uint16 cmd_len /* Cmd length */
|
||||
);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION bt_hci_hal_vs_sendcmd
|
||||
|
||||
DESCRIPTION
|
||||
Helper Routine to process the VS HCI cmd and constucts the HCI packet before
|
||||
calling bt_hci_send_ftm_cmd routine
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
FALSE = failure, else TRUE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_hci_hal_vs_sendcmd
|
||||
(
|
||||
uint16 opcode, /* Opcode */
|
||||
uint8 *pCmdBuffer, /* Pointer to Payload*/
|
||||
uint8 nSize /* Cmd Size */
|
||||
);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION isLatestTarget
|
||||
|
||||
DESCRIPTION
|
||||
For all the target/solution which has Bluedroid as stack and libbt-vendor as
|
||||
vendor initialization component considered as latest target
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
FALSE = failure, else TRUE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean isLatestTarget();
|
||||
char *get_current_time(void);
|
||||
#endif /* CONFIG_FTM_BT */
|
||||
@@ -1,115 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM BT Commom Header File
|
||||
|
||||
Description
|
||||
The header file includes helper enums for request_status and bt_power_state.
|
||||
|
||||
# Copyright (c) 2010-2011, 2014 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
09/28/11 rrr Common utility API abstracted,
|
||||
06/18/10 rakeshk Created a header file to hold the helper enums for
|
||||
request_status and bt_power_state
|
||||
========================================================================*/
|
||||
|
||||
#ifdef CONFIG_FTM_BT
|
||||
|
||||
#include "event.h"
|
||||
#include "msg.h"
|
||||
#include "log.h"
|
||||
|
||||
#include "diag_lsm.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifndef __FTM_BT_COMMON_H__
|
||||
|
||||
#define __FTM_BT_COMMON_H__
|
||||
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
|
||||
/* request_status - enum to encapuslate the status of a HAL request*/
|
||||
typedef enum request_status
|
||||
{
|
||||
STATUS_SUCCESS,
|
||||
STATUS_FAIL,
|
||||
STATUS_NO_RESOURCES,
|
||||
STATUS_SHORT_WRITE,
|
||||
STATUS_SHORT_READ
|
||||
}request_status;
|
||||
|
||||
/* request_status - enum to encapuslate the possible statea of BT power*/
|
||||
typedef enum bt_power_state
|
||||
{
|
||||
BT_OFF = 0x30, /* Its the value 0 to be input to rfkill driver */
|
||||
BT_ON = 0x31 /* ASCII value for '1'*/
|
||||
}bt_power_state;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FTM_BT_DRV_NO_ERR = 0,
|
||||
FTM_BT_DRV_CONN_TEST_FAILS,
|
||||
FTM_BT_DRV_QSOC_POWERUP_FAILS,
|
||||
FTM_BT_DRV_RX_PKT_TYPE_NOT_SUPPORTED,
|
||||
FTM_BT_DRV_SIO_OPEN_FAILS,
|
||||
FTM_BT_DRV_NO_SOC_RSP_TOUT,
|
||||
FTM_BT_DRV_BAD_NVM,
|
||||
#ifdef BT_NV_SUPPORT
|
||||
FTM_BT_NV_READ_FAIL,
|
||||
FTM_BT_NV_WRITE_FAIL,
|
||||
#endif
|
||||
FTM_BT_DRV_UNKNOWN_ERR
|
||||
} ftm_bt_drv_err_state_type;
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_qcomm_handle_event
|
||||
|
||||
DESCRIPTION
|
||||
Routine called by the HAL layer reader thread to process the HCI events
|
||||
The post conditions of each event is covered in a state machine pattern
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
FALSE = failure, else TRUE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_hci_qcomm_handle_event();
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_log_send_msg
|
||||
|
||||
DESCRIPTION
|
||||
Processes the buffer sent and sends it to the libdiag for sending the Cmd
|
||||
response
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
NIL
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
|
||||
void ftm_log_send_msg(const uint8 *pEventBuf,int event_bytes);
|
||||
#endif //__FTM_BT_COMMON_H__
|
||||
#endif /* CONFIG_FTM_BT */
|
||||
@@ -1,161 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM BT HCI PFAL Header File
|
||||
|
||||
Description
|
||||
Warpper API definitions of the ftm bt hci hal component.
|
||||
|
||||
# Copyright (c) 2010 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
06/18/10 rakeshk Created a header file to hold the wrapper HAL
|
||||
definitions for HCI UART control
|
||||
===========================================================================*/
|
||||
|
||||
#include "ftm_bt_common.h"
|
||||
#include "ftm_bt_hci_pfal.h"
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_hal_set_transport
|
||||
|
||||
DESCRIPTION
|
||||
sets the type of transport based on the msm type
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
returns the type of transport
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_hci_hal_set_transport()
|
||||
{
|
||||
return ftm_bt_hci_pfal_set_transport();
|
||||
}
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_hal_deinit_transport
|
||||
|
||||
DESCRIPTION
|
||||
Platform independent wrapper API which intiatea a De-intialise of UART/SMD
|
||||
resources with PFAL layer and returns the status of the PFAL operation
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_hal_deinit_transport()
|
||||
{
|
||||
return ftm_bt_hci_pfal_deinit_transport();
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_hal_init_transport
|
||||
|
||||
DESCRIPTION
|
||||
Platform independent wrapper API which intiatea a intialise of UART/SMD
|
||||
resources with PFAL layer and returns the status of the PFAL operation
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_hal_init_transport (int mode)
|
||||
{
|
||||
return ftm_bt_hci_pfal_init_transport(mode);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_hal_nwrite
|
||||
|
||||
DESCRIPTION
|
||||
Platform independent wrapper API which intiates a write operation
|
||||
with the PFAL layer and returns the status of the PFAL operation.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_hal_nwrite(uint8 *buf, int size)
|
||||
{
|
||||
return ftm_bt_hci_pfal_nwrite(buf,size);
|
||||
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_hal_nread
|
||||
|
||||
DESCRIPTION
|
||||
Platform independent wrapper API which intiates a read operation
|
||||
with the PFAL layer and returns the status of the PFAL operation.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_hal_nread(uint8 *buf, int size)
|
||||
{
|
||||
return ftm_bt_hci_pfal_nread(buf,size);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_hal_changebaudrate
|
||||
|
||||
DESCRIPTION
|
||||
Platform independent wrapper API which intiatea a UART baud rate change
|
||||
with the PFAL layer and returns the status of the PFAL request.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
TRUE if SUCCESS, else FAIL
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_hci_hal_changebaudrate (uint32 new_baud)
|
||||
{
|
||||
return ftm_bt_hci_pfal_changebaudrate(new_baud);
|
||||
}
|
||||
|
||||
@@ -1,177 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM BT HCI PFAL Header File
|
||||
|
||||
Description
|
||||
PFAL API declarations of the ftm bt hci pfal component.
|
||||
|
||||
# Copyright (c) 2010 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
06/18/10 rakeshk Created a header file to hold the PFAL declarations for
|
||||
HCI UART programming
|
||||
===========================================================================*/
|
||||
#include "ftm_bt_common.h"
|
||||
|
||||
#ifndef __FTM_BT_HCI_PFAL_H__
|
||||
#define __FTM_BT_HCI_PFAL_H__
|
||||
|
||||
#define PIN_CON_CMD_OGF 0xFC
|
||||
#define PIN_CON_CMD_OCF 0x0C
|
||||
#define PIN_CON_CMD_SUB_OP 0x38
|
||||
#define PIN_CON_INTERFACE_ID 0x01
|
||||
#define PIN_CON_EVENT_LEN 0x06
|
||||
#define EXT_PIN_CON_LEN 0x02
|
||||
|
||||
#define PIN_CON_CMD_OCF_BIT 0x01
|
||||
#define PIN_CON_CMD_OGF_BIT 0x02
|
||||
#define PIN_CON_CMD_SUBOP_BIT 0x04
|
||||
#define PIN_CON_CMD_INTER_BIT 0x05
|
||||
|
||||
#define PIN_CON_EVT_OGF_BIT 0x05
|
||||
#define PIN_CON_EVT_OCF_BIT 0x04
|
||||
#define PIN_CON_EVT_SUB_OP_BIT 0x07
|
||||
#define PIN_CON_INTERFACE_ID_EVT_BIT 0x08
|
||||
#define PIN_CON_EVENT_LEN_BIT 0x02
|
||||
#define PIN_CON_EVT_STATUS_BIT 0x06
|
||||
|
||||
#define LOG_TAG "ftmdaemon"
|
||||
|
||||
#define PRI_INFO " I"
|
||||
#define PRI_WARN " W"
|
||||
#define PRI_ERROR " E"
|
||||
#define PRI_DEBUG " D"
|
||||
#define PRI_VERB " V"
|
||||
|
||||
#define ALOG(pri, tag, fmt, arg...) fprintf(stderr, tag pri ": " fmt"\n", ##arg)
|
||||
#define ALOGV(fmt, arg...) ALOG(PRI_VERB, LOG_TAG, fmt, ##arg)
|
||||
#define ALOGD(fmt, arg...) ALOG(PRI_DEBUG, LOG_TAG, fmt, ##arg)
|
||||
#define ALOGI(fmt, arg...) ALOG(PRI_INFO, LOG_TAG, fmt, ##arg)
|
||||
#define ALOGW(fmt, arg...) ALOG(PRI_WARN, LOG_TAG, fmt, ##arg)
|
||||
#define ALOGE(fmt, arg...) ALOG(PRI_ERROR, LOG_TAG, fmt, ##arg)
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_set_transport
|
||||
|
||||
DESCRIPTION
|
||||
sets the type of transport based on the msm type
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
returns the type of transport
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_hci_pfal_set_transport(void);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_deinit_transport
|
||||
|
||||
DESCRIPTION
|
||||
Platform specific routine to de-intialise the UART/SMD resource.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_pfal_deinit_transport();
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_init_transport
|
||||
|
||||
DESCRIPTION
|
||||
Platform specific routine to intialise the UART/SMD resources.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_pfal_init_transport ();
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_nwrite
|
||||
|
||||
DESCRIPTION
|
||||
Platform specific routine to write the data in the argument to the UART/SMD
|
||||
port intialised.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_pfal_nwrite(uint8 *buf, int size);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_nread
|
||||
|
||||
DESCRIPTION
|
||||
Platform specific routine to read data from the UART/SMD port intialised into
|
||||
the buffer passed in argument.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_pfal_nread(uint8 *buf, int size);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_changebaudrate
|
||||
|
||||
DESCRIPTION
|
||||
Platform specific routine to intiate a change in baud rate
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
TRUE if SUCCESS, else FALSE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_hci_pfal_changebaudrate (uint32 new_baud);
|
||||
|
||||
#endif //__FTM_BT_HCI_PFAL_H__
|
||||
@@ -1,674 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM Platform specfic HCI UART/SMD File
|
||||
|
||||
Description
|
||||
Platform specific routines to program the UART/SMD descriptors
|
||||
|
||||
# Copyright (c) 2010-2011, 2013 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
06/07/11 bneti Add support smd support for msm8960
|
||||
06/18/10 rakeshk Created a source file to implement platform specific
|
||||
routines for UART
|
||||
07/07/10 rakeshk Removed the conversion of 3.2 Mbps baud rate
|
||||
01/07/10 rakeshk Added support for verbose logging of Cmd and events
|
||||
===========================================================================*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/select.h>
|
||||
#include <termios.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <dlfcn.h>
|
||||
#include "bt_vendor_lib.h"
|
||||
#include "ftm_bt_hci_pfal.h"
|
||||
#include "ftm_common.h"
|
||||
#include <string.h>
|
||||
#include "log.h"
|
||||
#include <cutils/properties.h>
|
||||
#include "hidl_client.h"
|
||||
|
||||
#ifdef ANDROID
|
||||
#define VENDOR_LIB "libbt-vendor.so"
|
||||
#else
|
||||
#define VENDOR_LIB "libbt-vendor.so.0"
|
||||
#endif
|
||||
|
||||
uint8_t is_slim_bus_test = 0;
|
||||
#define UNUSED(x) (void)(x)
|
||||
|
||||
/*identify the transport type*/
|
||||
static char *transport_dev;
|
||||
|
||||
typedef enum {
|
||||
BT_SOC_DEFAULT = 0,
|
||||
BT_SOC_SMD = BT_SOC_DEFAULT,
|
||||
BT_SOC_AR3K,
|
||||
BT_SOC_ROME,
|
||||
BT_SOC_CHEROKEE,
|
||||
BT_SOC_NAPIER,
|
||||
/* Add chipset type here */
|
||||
BT_SOC_RESERVED
|
||||
} bt_soc_type;
|
||||
|
||||
static void vendor_fwcfg_cb(bt_vendor_op_result_t result) {
|
||||
UNUSED(result);
|
||||
}
|
||||
static void vendor_scocfg_cb(bt_vendor_op_result_t result) {
|
||||
UNUSED(result);
|
||||
}
|
||||
static void vendor_lpm_vnd_cb(bt_vendor_op_result_t result) {
|
||||
UNUSED(result);
|
||||
}
|
||||
static void vendor_audio_state_cb(bt_vendor_op_result_t result) {
|
||||
UNUSED(result);
|
||||
}
|
||||
static void* vendor_alloc(int size) {
|
||||
UNUSED(size);
|
||||
return NULL;
|
||||
}
|
||||
static void vendor_dealloc(void *p_buf) {
|
||||
UNUSED(p_buf);
|
||||
}
|
||||
static uint8_t vendor_xmit_cb(uint16_t opcode, void *p_buf, tINT_CMD_CBACK p_cback) {
|
||||
UNUSED(opcode);
|
||||
UNUSED(p_buf);
|
||||
UNUSED(p_cback);
|
||||
return 0;
|
||||
}
|
||||
static void vendor_epilog_cb(bt_vendor_op_result_t result) {
|
||||
UNUSED(result);
|
||||
}
|
||||
static void vendor_a2dp_offload_cb(bt_vendor_op_result_t result, bt_vendor_opcode_t op, unsigned char handle) {
|
||||
UNUSED(result);
|
||||
UNUSED(op);
|
||||
UNUSED(handle);
|
||||
}
|
||||
|
||||
|
||||
bt_vendor_interface_t *vendor_interface=NULL;
|
||||
static const bt_vendor_callbacks_t vendor_callbacks = {
|
||||
sizeof(bt_vendor_callbacks_t),
|
||||
vendor_fwcfg_cb,
|
||||
vendor_scocfg_cb,
|
||||
vendor_lpm_vnd_cb,
|
||||
vendor_audio_state_cb,
|
||||
vendor_alloc,
|
||||
vendor_dealloc,
|
||||
vendor_xmit_cb,
|
||||
vendor_epilog_cb,
|
||||
vendor_a2dp_offload_cb
|
||||
};
|
||||
|
||||
|
||||
/*BT HS UART TTY DEVICE */
|
||||
#define BT_HS_UART_DEVICE "/dev/ttyHS0"
|
||||
|
||||
/*BT RIVA-SMD CHANNELS */
|
||||
#define APPS_RIVA_BT_ACL_CH "/dev/smd2"
|
||||
#define APPS_RIVA_BT_CMD_CH "/dev/smd3"
|
||||
|
||||
/* Variables to identify the platform */
|
||||
char transport_type[PROPERTY_VALUE_MAX];
|
||||
static boolean is_transportSMD;
|
||||
|
||||
extern int soc_type;
|
||||
|
||||
/* Reader thread handle */
|
||||
pthread_t hci_cmd_thread_hdl;
|
||||
/* Pipe file descriptors for cancelling read operation */
|
||||
int pipefd[2];
|
||||
/* Transport file descriptor */
|
||||
int fd_transport;
|
||||
/* Starting baud rate to init the tty device */
|
||||
int starting_baud = 115200;
|
||||
/* Verbose output monitoring variable */
|
||||
int verbose = 1;
|
||||
/* Defintion to convert integer baud rate to the
|
||||
* Data type understood by tty device
|
||||
*/
|
||||
#define BAUDCLAUS(i) case (i): return ( B##i )
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION convert_baud
|
||||
|
||||
DESCRIPTION
|
||||
Routine to convert the integer baud rate to type speed_t
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
Converted Baud rate, else default 0
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
static speed_t convert_baud(uint32 baud_rate)
|
||||
{
|
||||
switch (baud_rate)
|
||||
{
|
||||
BAUDCLAUS(50);
|
||||
BAUDCLAUS(75);
|
||||
BAUDCLAUS(110);
|
||||
BAUDCLAUS(134);
|
||||
BAUDCLAUS(150);
|
||||
BAUDCLAUS(200);
|
||||
BAUDCLAUS(300);
|
||||
BAUDCLAUS(600);
|
||||
BAUDCLAUS(1200);
|
||||
BAUDCLAUS(1800);
|
||||
BAUDCLAUS(2400);
|
||||
BAUDCLAUS(4800);
|
||||
BAUDCLAUS(9600);
|
||||
BAUDCLAUS(19200);
|
||||
BAUDCLAUS(38400);
|
||||
BAUDCLAUS(57600);
|
||||
BAUDCLAUS(115200);
|
||||
BAUDCLAUS(230400);
|
||||
BAUDCLAUS(460800);
|
||||
BAUDCLAUS(500000);
|
||||
BAUDCLAUS(576000);
|
||||
BAUDCLAUS(921600);
|
||||
BAUDCLAUS(1000000);
|
||||
BAUDCLAUS(1152000);
|
||||
BAUDCLAUS(1500000);
|
||||
BAUDCLAUS(2000000);
|
||||
BAUDCLAUS(2500000);
|
||||
BAUDCLAUS(3000000);
|
||||
BAUDCLAUS(3500000);
|
||||
BAUDCLAUS(4000000);
|
||||
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_readerthread
|
||||
|
||||
DESCRIPTION
|
||||
Thread Routine to perfom asynchrounous handling of events coming on Uart/Smd
|
||||
descriptor. It invokes a callback to the FTM BT layer to intiate a request
|
||||
to read event bytes.
|
||||
|
||||
DEPENDENCIES
|
||||
The LifeTime of ReaderThraad is dependent on the status returned by the
|
||||
call to ftm_bt_hci_qcomm_handle_event
|
||||
|
||||
RETURN VALUE
|
||||
RETURN NIL
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
void *ftm_readerthread(void *ptr)
|
||||
{
|
||||
UNUSED(ptr);
|
||||
boolean status = FALSE;
|
||||
int retval;
|
||||
fd_set readfds;
|
||||
int buf;
|
||||
|
||||
do
|
||||
{
|
||||
FD_ZERO(&readfds);
|
||||
FD_SET(fd_transport, &readfds);
|
||||
FD_SET(pipefd[0],&readfds);
|
||||
retval = select((pipefd[0] > fd_transport? pipefd[0] : fd_transport) + 1,
|
||||
&readfds, NULL, NULL, NULL);
|
||||
if(retval == -1)
|
||||
{
|
||||
printf("select failed\n");
|
||||
break;
|
||||
}
|
||||
if(FD_ISSET(pipefd[0],&readfds))
|
||||
{
|
||||
#ifdef FTM_DEBUG
|
||||
printf("Pipe descriptor set\n");
|
||||
#endif
|
||||
read(pipefd[0],&buf,1);
|
||||
if(buf == 1)
|
||||
break;
|
||||
}
|
||||
if(FD_ISSET(fd_transport,&readfds))
|
||||
{
|
||||
#ifdef FTM_DEBUG
|
||||
printf("Read descriptor set\n");
|
||||
#endif
|
||||
status = ftm_bt_hci_qcomm_handle_event();
|
||||
if(TRUE != status)
|
||||
break;
|
||||
}
|
||||
}
|
||||
while(1);
|
||||
#ifdef FTM_DEBUG
|
||||
printf("\nReader thread exited\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_pfal_set_transport
|
||||
|
||||
DESCRIPTION
|
||||
sets the type of transport based on the msm type
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
returns the type of transport
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_hci_pfal_set_transport(void)
|
||||
{
|
||||
if (soc_type == BT_SOC_ROME || soc_type == BT_SOC_CHEROKEE || soc_type == BT_SOC_NAPIER) {
|
||||
strlcpy(transport_type, "uart", sizeof(transport_type));
|
||||
printf("[%s]: Transport type is: %s\n", __FUNCTION__, transport_type);
|
||||
is_transportSMD = 0;
|
||||
transport_dev = BT_HS_UART_DEVICE;
|
||||
} else {
|
||||
strlcpy(transport_type, "smd", sizeof(transport_type));
|
||||
printf("[%s]: Transport type is: %s\n", __FUNCTION__, transport_type);
|
||||
is_transportSMD = 1;
|
||||
transport_dev = APPS_RIVA_BT_CMD_CH;
|
||||
}
|
||||
return is_transportSMD;
|
||||
}
|
||||
|
||||
|
||||
int init_transport_bdroid(boolean on) {
|
||||
|
||||
void *so_handle;
|
||||
unsigned char bdaddr[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
|
||||
request_status st;
|
||||
int fd[CH_MAX], powerstate, ret;
|
||||
|
||||
if (on) {
|
||||
so_handle = dlopen(VENDOR_LIB, RTLD_NOW);
|
||||
if (!so_handle)
|
||||
{
|
||||
ALOGE("Failed to load vendor component %s", dlerror());
|
||||
return -1;
|
||||
}
|
||||
|
||||
vendor_interface = (bt_vendor_interface_t *) dlsym(so_handle, "BLUETOOTH_VENDOR_LIB_INTERFACE");
|
||||
if (!vendor_interface)
|
||||
{
|
||||
ALOGE("Failed to accesst bt vendor interface");
|
||||
return -1;
|
||||
}
|
||||
|
||||
vendor_interface->init(&vendor_callbacks, bdaddr);
|
||||
|
||||
ALOGI("Turn On BT power");
|
||||
powerstate = BT_VND_PWR_ON;
|
||||
ret = vendor_interface->op(BT_VND_OP_POWER_CTRL, &powerstate);
|
||||
if (ret < 0)
|
||||
{
|
||||
ALOGE("Failed to turn on power from bt vendor interface");
|
||||
return -1;
|
||||
}
|
||||
ret = vendor_interface->op(BT_VND_OP_USERIAL_OPEN, fd);
|
||||
ALOGE("ret value: %d", ret);
|
||||
/* This is just a hack; needs to be removed */
|
||||
ret = 1;
|
||||
ALOGE("setting ret value to 1 manually");
|
||||
if (ret != 1)
|
||||
{
|
||||
ALOGE("Failed to get fd from bt vendor interface");
|
||||
return -1;
|
||||
} else {
|
||||
ALOGE("FD: %x", fd[0]);
|
||||
return fd[0];
|
||||
}
|
||||
} else {
|
||||
if (vendor_interface) {
|
||||
ALOGE("Close and cleanup the interfaces");
|
||||
int ret = vendor_interface->op(BT_VND_OP_USERIAL_CLOSE, NULL);
|
||||
|
||||
ALOGE("ret value: %d", ret);
|
||||
vendor_interface->cleanup();
|
||||
return 0;
|
||||
} else {
|
||||
|
||||
ALOGE("Not able to find vendor interface handle");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_deinit_transport
|
||||
|
||||
DESCRIPTION
|
||||
Platform specific routine to de-intialise the UART/SMD resource.
|
||||
|
||||
PLATFORM SPECIFIC DESCRIPTION
|
||||
Closes the TTY/SMD file descriptor and sets the descriptor value to -1
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
The Close of the descriptor will trigger a failure in the Reader Thread
|
||||
and hence cause a Deinit of the ReaderThread
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_pfal_deinit_transport()
|
||||
{
|
||||
int buf = 1;
|
||||
write(pipefd[1],&buf,1);
|
||||
if(!isLatestTarget())
|
||||
{
|
||||
close(fd_transport);
|
||||
fd_transport = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Use libbt-vendor for chip de-initialization
|
||||
init_transport_bdroid(FALSE);
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_init_uart
|
||||
|
||||
DESCRIPTION
|
||||
Platform specific routine to intialise the UART/SMD resources.
|
||||
|
||||
PLATFORM SPECIFIC DESCRIPTION
|
||||
Opens the TTY/SMD device file descriptor, congiures the TTY/SMD device for CTS/RTS
|
||||
flow control,sets 115200 for TTY as the default baudrate and starts the Reader
|
||||
Thread
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_pfal_init_transport(int mode)
|
||||
{
|
||||
struct termios term;
|
||||
if(isLatestTarget())
|
||||
{
|
||||
printf("%s: ",__func__ );
|
||||
//Use hidl_client_initialize for chip initialization
|
||||
if (hidl_client_initialize(mode, &fd_transport) == false) {
|
||||
printf("%s: HIDL client initialization failed \n", __func__);
|
||||
return STATUS_NO_RESOURCES;
|
||||
}
|
||||
printf("%s: , fd:%d: ", __func__, fd_transport);
|
||||
}
|
||||
else
|
||||
{
|
||||
fd_transport = open(transport_dev, (O_RDWR | O_NOCTTY));
|
||||
|
||||
if (-1 == fd_transport)
|
||||
{
|
||||
return STATUS_NO_RESOURCES;
|
||||
}
|
||||
|
||||
if (tcflush(fd_transport, TCIOFLUSH) < 0)
|
||||
{
|
||||
close(fd_transport);
|
||||
return STATUS_FAIL;
|
||||
}
|
||||
|
||||
if (tcgetattr(fd_transport, &term) < 0)
|
||||
{
|
||||
close(fd_transport);
|
||||
return STATUS_FAIL;
|
||||
}
|
||||
|
||||
cfmakeraw(&term);
|
||||
/* Set RTS/CTS HW Flow Control*/
|
||||
term.c_cflag |= (CRTSCTS | CLOCAL);
|
||||
|
||||
if (tcsetattr(fd_transport, TCSANOW, &term) < 0)
|
||||
{
|
||||
close(fd_transport);
|
||||
return STATUS_FAIL;
|
||||
}
|
||||
|
||||
/* Configure the /dev/ttyHS0 device to operate at 115200.
|
||||
no need for msm8960 as it is using smd as transport
|
||||
*/
|
||||
if (!is_transportSMD)
|
||||
if (ftm_bt_hci_pfal_changebaudrate(starting_baud) == FALSE)
|
||||
{
|
||||
close(fd_transport);
|
||||
return STATUS_FAIL;
|
||||
}
|
||||
}
|
||||
if (pipe(pipefd) == -1)
|
||||
{
|
||||
printf("pipe create error");
|
||||
return STATUS_FAIL;
|
||||
}
|
||||
if(mode != MODE_FM) {
|
||||
/* Creating read thread which listens for various masks & pkt requests */
|
||||
pthread_create( &hci_cmd_thread_hdl, NULL, ftm_readerthread, NULL);
|
||||
}
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_nwrite
|
||||
|
||||
DESCRIPTION
|
||||
Platform specific routine to write the data in the argument to the UART/SMD
|
||||
port intialised.
|
||||
|
||||
PLATFORM SPECIFIC DESCRIPTION
|
||||
Write the buffer to the tty device and ensure it is completely written
|
||||
In case of short write report error to the BT FTM layer.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_pfal_nwrite(uint8 *buf, int size)
|
||||
{
|
||||
int tx_bytes = 0, nwrite;
|
||||
int i = 0, buf_size = size;
|
||||
uint8 loop_back_cmd[6] = {0x1, 0x02, 0x18, 0x01, 0x01};
|
||||
/*hci packet is not required to carry the Packet indicator (for UART interfaces) for msm8960
|
||||
as it is using share memory interface */
|
||||
int hci_uart_pkt_ind = 0;
|
||||
|
||||
if(fd_transport < 0)
|
||||
return STATUS_NO_RESOURCES;
|
||||
if ( buf[PIN_CON_CMD_OGF_BIT] == PIN_CON_CMD_OGF &&
|
||||
buf[PIN_CON_CMD_OCF_BIT] == PIN_CON_CMD_OCF &&
|
||||
(size > PIN_CON_CMD_SUBOP_BIT) &&
|
||||
buf[PIN_CON_CMD_SUBOP_BIT] == PIN_CON_CMD_SUB_OP &&
|
||||
(size > PIN_CON_CMD_INTER_BIT) &&
|
||||
buf[PIN_CON_CMD_INTER_BIT] == PIN_CON_INTERFACE_ID)
|
||||
{
|
||||
is_slim_bus_test = 1;
|
||||
printf("\nPinConnectivityTest: Sending loopback command to SOC before initiasing slimbus\n");
|
||||
strlcpy(buf, loop_back_cmd, size);
|
||||
}
|
||||
do
|
||||
{
|
||||
nwrite = write(fd_transport, (buf + hci_uart_pkt_ind + tx_bytes), (size - hci_uart_pkt_ind - tx_bytes));
|
||||
|
||||
if (nwrite < 0)
|
||||
{
|
||||
printf("Error while writing ->\n");
|
||||
return STATUS_SHORT_WRITE;
|
||||
}
|
||||
if (nwrite == 0)
|
||||
{
|
||||
printf("ftm_bt_hci_pfal_nwrite: zero-length write\n");
|
||||
return STATUS_SHORT_WRITE;
|
||||
}
|
||||
|
||||
tx_bytes += nwrite;
|
||||
size -= nwrite;
|
||||
} while (tx_bytes < size - hci_uart_pkt_ind);
|
||||
|
||||
if (verbose == 1)
|
||||
{
|
||||
printf("[%s] %s: CMD:", get_current_time(), __FUNCTION__);
|
||||
for (i = 0; i < buf_size; i++)
|
||||
{
|
||||
printf(" %02X", buf[i]);
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_nread
|
||||
|
||||
DESCRIPTION
|
||||
Platform specific routine to read data from the UART/SMD port intialised into
|
||||
the buffer passed in argument.
|
||||
|
||||
PLATFORM SPECIFIC DESCRIPTION
|
||||
Read from the tty device into the buffer and ensure the read request is
|
||||
completed, in case of short read report error to the BT FTM layer.
|
||||
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_hci_pfal_nread(uint8 *buf, int size)
|
||||
{
|
||||
int rx_bytes = 0, nread;
|
||||
|
||||
if(fd_transport < 0)
|
||||
return STATUS_NO_RESOURCES;
|
||||
|
||||
do
|
||||
{
|
||||
nread = read(fd_transport, (buf + rx_bytes), (size - rx_bytes));
|
||||
if (nread < 0)
|
||||
{
|
||||
printf("Error while reading ->\n");
|
||||
return STATUS_SHORT_READ;
|
||||
}
|
||||
|
||||
rx_bytes += nread;
|
||||
|
||||
} while (rx_bytes < size);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_hci_pfal_changebaudrate
|
||||
|
||||
DESCRIPTION
|
||||
Platform specific routine to intiate a change in baud rate
|
||||
|
||||
PLATFORM SPECIFIC DESCRIPTION
|
||||
Convert the Baud rate passed to the speed_t type and program the
|
||||
Baud rate change after ensuring all transmit is drained at the
|
||||
current baud rate
|
||||
|
||||
DEPENDENCIES
|
||||
It is expected that the Upper layer will intiate a Flow Off to the
|
||||
BT SoC, to signal the stop of receive if the baud rate change is
|
||||
initiated while SoC init is in progress
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
TRUE if SUCCESS, else FALSE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_hci_pfal_changebaudrate (uint32 new_baud)
|
||||
{
|
||||
struct termios term;
|
||||
boolean status = TRUE;
|
||||
speed_t baud_code;
|
||||
speed_t actual_baud_code;
|
||||
|
||||
if (tcgetattr(fd_transport, &term) < 0)
|
||||
{
|
||||
printf("Can't get port settings\n");
|
||||
status = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
baud_code = convert_baud(new_baud);
|
||||
(void) cfsetospeed(&term, baud_code);
|
||||
if (tcsetattr(fd_transport, TCSADRAIN, &term) < 0) /* don't change speed until last write done */
|
||||
{
|
||||
printf("bt_hci_qcomm_pfal_changebaudrate: tcsetattr:\n");
|
||||
status = FALSE;
|
||||
}
|
||||
/* make sure that we reportedly got the speed we tried to set */
|
||||
if (1 < verbose)
|
||||
{
|
||||
if (tcgetattr(fd_transport, &term) < 0)
|
||||
{
|
||||
printf("bt_hci_qcomm_pfal_changebaudrate: tcgetattr:\n");
|
||||
status = FALSE;
|
||||
}
|
||||
if (baud_code != (actual_baud_code = cfgetospeed(&term)))
|
||||
{
|
||||
printf("bt_hci_qcomm_pfal_changebaudrate: new baud %u FAILED, got 0x%x\n", new_baud, actual_baud_code);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("bt_hci_qcomm_pfal_changebaudrate: new baud %u SUCCESS, got 0x%x\n", new_baud, actual_baud_code);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -1,278 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
BT persist NV items access source file
|
||||
|
||||
Description
|
||||
Read/Write APIs for retreiving NV items from persist memory.
|
||||
|
||||
# Copyright (c) 2011-12 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
05/25/12 jav Added FTM log that will display bt address while testing.
|
||||
09/27/11 rrr Moved persist related API for c/c++ compatibility, needed
|
||||
for random BD address to be persistent across target
|
||||
reboots.
|
||||
==========================================================================*/
|
||||
|
||||
#include "ftm_bt_persist.h"
|
||||
#include <semaphore.h>
|
||||
|
||||
#ifdef BT_NV_SUPPORT
|
||||
#include "bt_nv.h"
|
||||
|
||||
/* Semaphore shared by the Event handler and main thread */
|
||||
extern sem_t semaphore_cmd_complete;
|
||||
/*Flag to manage the verbose output */
|
||||
extern int verbose;
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_send_nv_read_cmd
|
||||
|
||||
DESCRIPTION
|
||||
Helper Routine to process the nv read command
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
FALSE = failure, else TRUE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_send_nv_read_cmd
|
||||
(
|
||||
uint8 * cmd_buf, /* pointer to Cmd */
|
||||
uint16 cmd_len /* Cmd length */
|
||||
)
|
||||
{
|
||||
nv_persist_item_type my_nv_item;
|
||||
nv_persist_stat_enum_type cmd_result;
|
||||
boolean result = TRUE;
|
||||
|
||||
if(cmd_len >1)
|
||||
{
|
||||
switch(*(cmd_buf+1))
|
||||
{
|
||||
case NV_BD_ADDR_I:
|
||||
cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_READ_F, NV_BD_ADDR_I, &my_nv_item);
|
||||
if (NV_SUCCESS != cmd_result)
|
||||
{
|
||||
if (verbose > 0)
|
||||
{
|
||||
fprintf (stderr, "nv_cmd_remote failed to get BD_ADDR from NV, code %d\n", cmd_result);
|
||||
}
|
||||
/* Send fail response */
|
||||
result = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* copy bytes */
|
||||
event_buf_nv_read_response[0] = FTM_BT_CMD_NV_READ;
|
||||
event_buf_nv_read_response[1] = NV_BD_ADDR_I;
|
||||
event_buf_nv_read_response[7] = my_nv_item.bd_addr[5];
|
||||
event_buf_nv_read_response[6] = my_nv_item.bd_addr[4];
|
||||
event_buf_nv_read_response[5] = my_nv_item.bd_addr[3];
|
||||
event_buf_nv_read_response[4] = my_nv_item.bd_addr[2];
|
||||
event_buf_nv_read_response[3] = my_nv_item.bd_addr[1];
|
||||
event_buf_nv_read_response[2] = my_nv_item.bd_addr[0];
|
||||
/* send BD_ADDR in the response */
|
||||
fprintf (stderr, "nv_cmd_remote got NV_BD_ADDR_I from NV: %x:%x:%x:%x:%x:%x\n",
|
||||
(unsigned int) my_nv_item.bd_addr[5], (unsigned int) my_nv_item.bd_addr[4],
|
||||
(unsigned int) my_nv_item.bd_addr[3], (unsigned int) my_nv_item.bd_addr[2],
|
||||
(unsigned int) my_nv_item.bd_addr[1], (unsigned int) my_nv_item.bd_addr[0]);
|
||||
|
||||
ftm_log_send_msg((const uint8 *)event_buf_nv_read_response,nv_read_response_size);
|
||||
result = TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
case NV_BT_SOC_REFCLOCK_TYPE_I:
|
||||
cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_READ_F, NV_BT_SOC_REFCLOCK_TYPE_I, &my_nv_item);
|
||||
if (NV_SUCCESS != cmd_result)
|
||||
{
|
||||
if (verbose > 0)
|
||||
{
|
||||
fprintf (stderr, "nv_cmd_remote failed to get BD_ADDR from NV, code %d\n", cmd_result);
|
||||
}
|
||||
/* Send fail response */
|
||||
result = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
event_buf_nv_read_response[0] = FTM_BT_CMD_NV_READ;
|
||||
event_buf_nv_read_response[1] = NV_BT_SOC_REFCLOCK_TYPE_I;
|
||||
event_buf_nv_read_response[2] = (uint8) my_nv_item.bt_soc_refclock_type ;
|
||||
event_buf_nv_read_response[7] = 0x0;
|
||||
event_buf_nv_read_response[6] = 0x0;
|
||||
event_buf_nv_read_response[5] = 0x0;
|
||||
event_buf_nv_read_response[4] = 0x0;
|
||||
event_buf_nv_read_response[3] = 0x0;
|
||||
fprintf (stderr, "nv_cmd_remote got NV_BT_SOC_REFCLOCK_TYPE_I from NV: 0x%x\n",
|
||||
(unsigned int) my_nv_item.bt_soc_refclock_type);
|
||||
ftm_log_send_msg((const uint8 *)event_buf_nv_read_response,nv_read_response_size);
|
||||
result = TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
case NV_BT_SOC_CLK_SHARING_TYPE_I:
|
||||
cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_READ_F, NV_BT_SOC_CLK_SHARING_TYPE_I, &my_nv_item);
|
||||
if (NV_SUCCESS != cmd_result)
|
||||
{
|
||||
if (verbose > 0)
|
||||
{
|
||||
fprintf (stderr, "nv_cmd_remote failed to get CLK_SHARING from NV, code %d\n", cmd_result);
|
||||
}
|
||||
/* Send fail response */
|
||||
result = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
event_buf_nv_read_response[0] = FTM_BT_CMD_NV_READ;
|
||||
event_buf_nv_read_response[1] = NV_BT_SOC_CLK_SHARING_TYPE_I;
|
||||
event_buf_nv_read_response[2] = (uint8) my_nv_item.bt_soc_clk_sharing_type ;
|
||||
event_buf_nv_read_response[7] = 0x0;
|
||||
event_buf_nv_read_response[6] = 0x0;
|
||||
event_buf_nv_read_response[5] = 0x0;
|
||||
event_buf_nv_read_response[4] = 0x0;
|
||||
event_buf_nv_read_response[3] = 0x0;
|
||||
fprintf (stderr, "nv_cmd_remote got NV_BT_SOC_CLK_SHARING_TYPE_I from NV: 0x%x\n",
|
||||
(unsigned int) my_nv_item.bt_soc_refclock_type);
|
||||
ftm_log_send_msg((const uint8 *)event_buf_nv_read_response,nv_read_response_size);
|
||||
result = TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(result == FALSE)
|
||||
ftm_log_send_msg(event_buf_nv_read_response_fail,nv_read_response_size_fail);
|
||||
|
||||
sem_post(&semaphore_cmd_complete);
|
||||
return result;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_send_nv_write_cmd
|
||||
|
||||
DESCRIPTION
|
||||
Helper Routine to process the nv write command
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
FALSE = failure, else TRUE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_send_nv_write_cmd
|
||||
(
|
||||
uint8 * cmd_buf, /* pointer to Cmd */
|
||||
uint16 cmd_len /* Cmd length */
|
||||
)
|
||||
{
|
||||
nv_persist_item_type my_nv_item;
|
||||
nv_persist_stat_enum_type cmd_result;
|
||||
boolean result = TRUE;
|
||||
if(cmd_len >1)
|
||||
{
|
||||
switch(*(cmd_buf+1))
|
||||
{
|
||||
case NV_BD_ADDR_I:
|
||||
memcpy(&my_nv_item.bd_addr, (cmd_buf+2), NV_BD_ADDR_SIZE);
|
||||
cmd_result = (nv_persist_stat_enum_type)bt_nv_cmd(NV_WRITE_F, NV_BD_ADDR_I, &my_nv_item);
|
||||
if (NV_SUCCESS != cmd_result)
|
||||
{
|
||||
if (verbose > 0)
|
||||
{
|
||||
fprintf (stderr, "nv_cmd_remote failed to get BD_ADDR from NV, code %d\n", cmd_result);
|
||||
}
|
||||
/* Send fail response */
|
||||
result = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = TRUE;
|
||||
}
|
||||
break;
|
||||
|
||||
case NV_BT_SOC_REFCLOCK_TYPE_I:
|
||||
switch (*(cmd_buf+2))
|
||||
{
|
||||
case NV_PS_BT_SOC_REFCLOCK_32MHZ:
|
||||
case NV_PS_BT_SOC_REFCLOCK_19P2MHZ:
|
||||
my_nv_item.bt_soc_refclock_type = (nv_ps_bt_soc_refclock_enum_type)(*(cmd_buf+2)) ;
|
||||
break;
|
||||
default:
|
||||
fprintf (stderr, "Invalid Ref Clock option\n");
|
||||
result = FALSE;
|
||||
}
|
||||
if (result != FALSE)
|
||||
{
|
||||
cmd_result= (nv_persist_stat_enum_type)bt_nv_cmd(NV_WRITE_F, NV_BT_SOC_REFCLOCK_TYPE_I, &my_nv_item);
|
||||
if (NV_SUCCESS != cmd_result)
|
||||
{
|
||||
fprintf (stderr, "nv_cmd_remote failed to write SOC_REFCLOCK_TYPE to NV, code %d\n", cmd_result);
|
||||
result = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NV_BT_SOC_CLK_SHARING_TYPE_I:
|
||||
switch (*(cmd_buf+2))
|
||||
{
|
||||
case NV_PS_BT_SOC_CLOCK_SHARING_ENABLED:
|
||||
case NV_PS_BT_SOC_CLOCK_SHARING_DISABLED:
|
||||
my_nv_item.bt_soc_clk_sharing_type = (nv_ps_bt_soc_clock_sharing_enum_type)(*(cmd_buf+2)) ;
|
||||
break;
|
||||
default:
|
||||
fprintf (stderr, "Invalid Clock Sharing option\n");
|
||||
result = FALSE;
|
||||
}
|
||||
if (result != FALSE)
|
||||
{
|
||||
cmd_result= (nv_persist_stat_enum_type)bt_nv_cmd(NV_WRITE_F, NV_BT_SOC_CLK_SHARING_TYPE_I, &my_nv_item);
|
||||
if (NV_SUCCESS != cmd_result)
|
||||
{
|
||||
fprintf (stderr, "nv_cmd_remote failed to write SOC_CLK_SHARING_TYPE to NV, code %d\n", cmd_result);
|
||||
result = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = TRUE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(result == FALSE)
|
||||
{
|
||||
ftm_log_send_msg(event_buf_bt_nv_write_fail,nv_write_response_size);
|
||||
sem_post(&semaphore_cmd_complete);
|
||||
}
|
||||
else
|
||||
{
|
||||
ftm_log_send_msg((const uint8 *)event_buf_bt_nv_write_pass,nv_write_response_size);
|
||||
sem_post(&semaphore_cmd_complete);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* End of BT_NV_SUPPORT */
|
||||
@@ -1,113 +0,0 @@
|
||||
#ifndef _FTM_BT_PERSIST_H_
|
||||
#define _FTM_BT_PERSIST_H_
|
||||
|
||||
/*==========================================================================
|
||||
|
||||
BT persist NV items access source file
|
||||
|
||||
Description
|
||||
Read/Write APIs for retreiving NV items from persist memory.
|
||||
|
||||
# Copyright (c) 2011 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
09/27/11 rrr Moved persist related API for c/c++ compatibility, needed
|
||||
for random BD address to be persistent across target
|
||||
reboots.
|
||||
==========================================================================*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "ftm_bt_common.h"
|
||||
#include <string.h>
|
||||
|
||||
|
||||
#ifdef BT_NV_SUPPORT
|
||||
|
||||
#define FTM_BT_CMD_NV_READ 0xB
|
||||
#define FTM_BT_CMD_NV_WRITE 0xC
|
||||
|
||||
const uint8 nv_read_response_size = 8;
|
||||
const uint8 nv_read_response_size_fail = 2;
|
||||
const uint8 nv_write_response_size = 2;
|
||||
|
||||
/* NV Write Responses */
|
||||
const uint8 event_buf_bt_nv_write_pass[2] = { FTM_BT_CMD_NV_WRITE, FTM_BT_DRV_NO_ERR};
|
||||
const uint8 event_buf_bt_nv_write_fail[2] = { FTM_BT_CMD_NV_WRITE, FTM_BT_NV_WRITE_FAIL};
|
||||
|
||||
/* NV Read Responses */
|
||||
const uint8 event_buf_nv_read_response_fail[8] =
|
||||
{
|
||||
FTM_BT_CMD_NV_READ, FTM_BT_NV_READ_FAIL, 0x0, 0x0,0x0,0x0,0x0,0x0
|
||||
};
|
||||
|
||||
uint8 event_buf_nv_read_response[8];
|
||||
#endif /* BT_NV_SUPPORT */
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_send_nv_read_cmd
|
||||
|
||||
DESCRIPTION
|
||||
Helper Routine to process the nv read command
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
FALSE = failure, else TRUE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_send_nv_read_cmd
|
||||
(
|
||||
uint8 * cmd_buf, /* pointer to Cmd */
|
||||
uint16 cmd_len /* Cmd length */
|
||||
);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_send_nv_write_cmd
|
||||
|
||||
DESCRIPTION
|
||||
Helper Routine to process the nv write command
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
FALSE = failure, else TRUE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean ftm_bt_send_nv_write_cmd
|
||||
(
|
||||
uint8 * cmd_buf, /* pointer to Cmd */
|
||||
uint16 cmd_len /* Cmd length */
|
||||
);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _FTM_BT_PERSIST_H_ */
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM BT POWER HAL Header File
|
||||
|
||||
Description
|
||||
Wrapper API definitions of the ftm bt power hal component.
|
||||
|
||||
# Copyright (c) 2010 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
06/18/10 rakeshk Created a header file to include the wrapper API
|
||||
definitions for BT power control
|
||||
07/07/10 rakeshk Modified the function name of BT power set HAL routine
|
||||
===========================================================================*/
|
||||
#include "ftm_bt_common.h"
|
||||
#include "ftm_bt_power_pfal.h"
|
||||
|
||||
|
||||
#ifndef __FTM_BT_POWER_HAL_H__
|
||||
#define __FTM_BT_POWER_HAL_H__
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_power_hal_set
|
||||
|
||||
DESCRIPTION
|
||||
Platform independent wrapper API which sets a BT power from PFAL
|
||||
layer and returns the status of the PFAL operation.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_power_hal_set(bt_power_state state)
|
||||
{
|
||||
return ftm_bt_power_pfal_set(state);
|
||||
}
|
||||
/*===========================================================================
|
||||
FtUNCTION ftm_bt_power_hal_check
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
Platform independent wrapper API which gets the BT power from PFAL
|
||||
layer and returns the current state of the BT HW.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
Current BT power state
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
bt_power_state ftm_bt_power_hal_check()
|
||||
{
|
||||
return ftm_bt_power_pfal_check();
|
||||
}
|
||||
|
||||
#endif //__FTM_BT_POWER_HAL_H__
|
||||
@@ -1,71 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM BT POWER PFAL Header File
|
||||
|
||||
Description
|
||||
PFAL API declarations of the ftm bt power pfal component.
|
||||
|
||||
# Copyright (c) 2010 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
06/18/10 rakeshk Created a header file to hold the PFAL declarations for
|
||||
BT power programming
|
||||
07/07/10 rakeshk Modified the function name of BT power set PFAL routine
|
||||
===========================================================================*/
|
||||
#include "ftm_bt_common.h"
|
||||
|
||||
#ifndef __FTM_BT_POWER_PFAL_H__
|
||||
#define __FTM_BT_POWER_PFAL_H__
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_power_pfal_set
|
||||
|
||||
DESCRIPTION
|
||||
Platform dependent interface API which sets the BT power
|
||||
and returns the status of the toggle operation.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_power_pfal_set(bt_power_state state);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_power_pfal_check
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
Platform dependent interface API which intiates a BT power read/check
|
||||
and returns the current state of the BT HW.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
Current BT power state
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
bt_power_state ftm_bt_power_pfal_check();
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,197 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM Platform specfic BT power File
|
||||
|
||||
Description
|
||||
Platform specific routines to toggle/read the BT power state
|
||||
|
||||
# Copyright (c) 2010-2011 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
06/18/10 rakeshk Created a source file to implement platform specific
|
||||
routines for BT power.
|
||||
07/07/10 rakeshk Added routine to find the sysfs entry for bluetooth in
|
||||
runtime
|
||||
07/07/10 rakeshk Added call to init the rfkill state path in case of first
|
||||
read
|
||||
===========================================================================*/
|
||||
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "ftm_bt_power_pfal.h"
|
||||
#include <string.h>
|
||||
|
||||
/* Bluetooth Rfkill Entry for Android */
|
||||
static char *rfkill_state_path = NULL;
|
||||
/*===========================================================================
|
||||
FUNCTION init_rfkill_path
|
||||
|
||||
DESCRIPTION
|
||||
Opens the sysfs entry for different types of rfkill and finds the one
|
||||
which matches Bluetooth by iterating through the rfkill entries
|
||||
and checking for bluetooth
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
TRUE if SUCCESS, else FALSE
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
boolean init_rfkill_path()
|
||||
{
|
||||
int fd;
|
||||
int readsize;
|
||||
int rfkillid;
|
||||
char rfkill_path[64];
|
||||
char buf[16];
|
||||
|
||||
for (rfkillid = 0; ; rfkillid++)
|
||||
{
|
||||
/* Open the different rfkill type entries and check if type macthes bluetooth */
|
||||
snprintf(rfkill_path, sizeof(rfkill_path), "/sys/class/rfkill/rfkill%d/type", rfkillid);
|
||||
fd = open(rfkill_path, O_RDONLY);
|
||||
if (fd < 0)
|
||||
{
|
||||
printf("open(%s) failed: \n", rfkill_path);
|
||||
return FALSE;
|
||||
}
|
||||
readsize = read(fd, &buf, sizeof(buf));
|
||||
close(fd);
|
||||
|
||||
if (memcmp(buf, "bluetooth", 9) == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
asprintf(&rfkill_state_path, "/sys/class/rfkill/rfkill%d/state", rfkillid);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_power_pfal_set
|
||||
|
||||
DESCRIPTION
|
||||
Platform dependent interface API which sets the BT power state
|
||||
and returns the status of the toggle operation.
|
||||
|
||||
PLATFORM SPECIFIC DESCRIPTION
|
||||
Opens the rfkill entry for Bleutooth and initiates a write of the value
|
||||
passed as argument.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
STATUS_SUCCESS if SUCCESS, else other reasons
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
request_status ftm_bt_power_pfal_set(bt_power_state state)
|
||||
{
|
||||
int sz;
|
||||
int fd = -1;
|
||||
request_status ret = STATUS_FAIL;
|
||||
const char buffer = state;
|
||||
if(rfkill_state_path == NULL)
|
||||
{
|
||||
if(init_rfkill_path() != TRUE)
|
||||
goto out;
|
||||
}
|
||||
|
||||
fd = open(rfkill_state_path, O_WRONLY);
|
||||
if (fd < 0)
|
||||
{
|
||||
ret = STATUS_NO_RESOURCES;
|
||||
goto out;
|
||||
}
|
||||
sz = write(fd, &buffer, 1);
|
||||
if (sz < 0)
|
||||
{
|
||||
goto out;
|
||||
}
|
||||
ret = STATUS_SUCCESS;
|
||||
|
||||
out:
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_bt_power_pfal_check
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
Platform dependent interface API which intiates a BT power read/check
|
||||
and returns the current state of the BT HW.
|
||||
|
||||
PLATFORM SPECIFIC DESCRIPTION
|
||||
Opens the rfkill entry for Bleutooth and initiates a read on the rfkill
|
||||
descriptor.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN VALUE
|
||||
Current BT power state
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
bt_power_state ftm_bt_power_pfal_check()
|
||||
{
|
||||
int sz;
|
||||
bt_power_state state= BT_OFF;
|
||||
int fd = -1;
|
||||
char buffer = '0';
|
||||
|
||||
if(rfkill_state_path == NULL)
|
||||
{
|
||||
if(init_rfkill_path() != TRUE)
|
||||
goto out;
|
||||
}
|
||||
fd = open(rfkill_state_path, O_RDONLY);
|
||||
if (fd < 0)
|
||||
{
|
||||
goto out;
|
||||
}
|
||||
sz = read(fd, &buffer, 1);
|
||||
if (sz < 0)
|
||||
{
|
||||
goto out;
|
||||
}
|
||||
|
||||
out:
|
||||
if (fd >= 0)
|
||||
close(fd);
|
||||
state = (bt_power_state)buffer;
|
||||
return state;
|
||||
}
|
||||
|
||||
@@ -1,141 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM BT HCI PFAL Header File
|
||||
|
||||
Description
|
||||
Queue insert/delete routines and data structures
|
||||
|
||||
# Copyright (c) 2010-2011, 2014 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
06/18/10 rakeshk Created
|
||||
11/09/10 rakeshk Added two APIs to perform read/write of BT Top level
|
||||
I2C registers
|
||||
===========================================================================*/
|
||||
|
||||
#if defined(CONFIG_FTM_BT) || defined(CONFIG_FTM_FM)
|
||||
#include <ftm_bt_common.h>
|
||||
#include "ftm_bt.h"
|
||||
#include <semaphore.h>
|
||||
#include <pthread.h>
|
||||
/* Semaphore shared by the Event handler and main thread */
|
||||
extern sem_t semaphore_cmd_complete;
|
||||
/* Structure used by the FTM BT/FM component to
|
||||
* queue the FTM packet contents
|
||||
*/
|
||||
|
||||
pthread_mutex_t fm_event_lock;
|
||||
pthread_cond_t fm_event_cond;
|
||||
extern int fm_passthrough;
|
||||
|
||||
typedef struct cmdQ
|
||||
{
|
||||
int command_id;/*Command id */
|
||||
void *data; /* Command data */
|
||||
boolean bt_command; /* whether BT or FM command */
|
||||
int cmd_len; /* Command length */
|
||||
struct cmdQ *next; /* pointer to next CmdQ item */
|
||||
}cmdQ;
|
||||
|
||||
/* Callback declaration for BT FTM packet processing */
|
||||
void *bt_ftm_diag_dispatch(void *req_pkt, uint16 pkt_len);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION qinsert_cmd
|
||||
|
||||
DESCRIPTION
|
||||
Command Queue insert routine. Add the FTM BT packet to the Queue
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURNS FALSE without adding queue entry in failure
|
||||
to allocate a new Queue item
|
||||
else returns TRUE
|
||||
|
||||
SIDE EFFECTS
|
||||
increments the number of commands queued
|
||||
|
||||
===========================================================================*/
|
||||
boolean qinsert_cmd(ftm_bt_pkt_type *ftm_bt_pkt);
|
||||
/*===========================================================================
|
||||
FUNCTION dequeue_send
|
||||
|
||||
DESCRIPTION
|
||||
Command Queue delete and calls HCI send routine. Dequeues the HCI data from
|
||||
the queue and sends it to HCI HAL layer.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
RETURN NIL
|
||||
|
||||
SIDE EFFECTS
|
||||
decrements the number of command queued
|
||||
|
||||
===========================================================================*/
|
||||
void dequeue_send();
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION i2c_write
|
||||
|
||||
DESCRIPTION
|
||||
Helper function to construct the I@C request to be sent to the FM I2C
|
||||
driver
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
-1 in failure,positive or zero in success
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
int i2c_write
|
||||
(
|
||||
int fd,
|
||||
unsigned char offset,
|
||||
const unsigned char* buf,
|
||||
unsigned char len,
|
||||
unsigned int slave_addr
|
||||
);
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION i2c_read
|
||||
|
||||
DESCRIPTION
|
||||
Helper function to construct the I2C request to read data from the FM I2C
|
||||
driver
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
-1 in failure,positive or zero in success
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
int i2c_read
|
||||
(
|
||||
int fd,
|
||||
unsigned char offset,
|
||||
const unsigned char* buf,
|
||||
unsigned char len,
|
||||
unsigned int slave_addr
|
||||
);
|
||||
#endif
|
||||
@@ -1,43 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM WLAN Source File
|
||||
|
||||
# Copyright (c) 2013-2014 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
#ifndef _FTM_DBG_H_
|
||||
#define _FTM_DBG_H_
|
||||
#include <stdint.h>
|
||||
|
||||
#define FTM_DBG_ERROR 0x00000001
|
||||
#define FTM_DBG_INFO 0x00000002
|
||||
#define FTM_DBG_TRACE 0x00000004
|
||||
|
||||
#define FTM_DBG_DEFAULT (FTM_DBG_ERROR)
|
||||
|
||||
extern unsigned int g_dbg_level;
|
||||
|
||||
struct ftm_config
|
||||
{
|
||||
int total_num_slots;
|
||||
uint32_t slot_id[4];
|
||||
uint32_t slot_size[4];
|
||||
};
|
||||
extern struct ftm_config ftm_cfg;
|
||||
|
||||
#ifdef DEBUG
|
||||
void current_time();
|
||||
#define DPRINTF(_level, _x...)\
|
||||
do {\
|
||||
if (g_dbg_level & (_level))\
|
||||
{\
|
||||
fprintf(stderr, _x);\
|
||||
}\
|
||||
} while (0);
|
||||
|
||||
#else
|
||||
#define DPRINTF(_level, x...) do { } while (0);
|
||||
#endif
|
||||
|
||||
#endif /* _FTM_DBG_H_ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,993 +0,0 @@
|
||||
/*==========================================================================
|
||||
|
||||
FTM FM Common Header File
|
||||
|
||||
Description
|
||||
Global Data declarations of the ftm fm component.
|
||||
|
||||
# Copyright (c) 2010-2012, 2014 by Qualcomm Technologies, Inc. All Rights Reserved.
|
||||
# Qualcomm Technologies Proprietary and Confidential.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
Edit History
|
||||
|
||||
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
08/03/2011 uppalas Adding support for new ftm commands
|
||||
06/18/10 rakeshk Created a header file to hold the definitons for ftm fm
|
||||
task
|
||||
07/06/10 rakeshk Clean roomed the data structures and defined data
|
||||
structures to be passed to the PFAL layers
|
||||
01/11/11 rakeshk Added support for new FTM APIS
|
||||
02/09/11 rakeshk Added support for BLER FTM APIs
|
||||
04/03/11 ananthk Added support for FM FTM Transmit APIs
|
||||
===========================================================================*/
|
||||
#ifdef CONFIG_FTM_FM
|
||||
|
||||
#include "diagpkt.h"
|
||||
#include "log.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#define FTM_FM_LOG_PKT_ID 65
|
||||
#define FTM_FM_CMD_CODE 28
|
||||
#define LOG_FTM_FM_C ((uint16) 0x14CC)
|
||||
#define FEATURE_FTM_FM_DEBUG
|
||||
#define DEFAULT_DATA_SIZE 249
|
||||
|
||||
/* FM6500 A0 chip version.
|
||||
**/
|
||||
#define FM6500_A0_VERSION (0x01010013)
|
||||
/**
|
||||
* * FM6500 2.0 chip version.
|
||||
**/
|
||||
#define FMQSOCCOM_FM6500_20_VERSION (0x01010010)
|
||||
/**
|
||||
* * FM6500 2.1 chip version.
|
||||
**/
|
||||
#define FMQSOCCOM_FM6500_21_VERSION (0x02010204)
|
||||
/**
|
||||
* WCN 2243 1.0's FM chip version.
|
||||
*/
|
||||
#define FMQSOCCOM_FM6500_WCN2243_10_VERSION (0x0302010A)
|
||||
/**
|
||||
* WCN 2243 2.0's FM chip version.
|
||||
*/
|
||||
#define FMQSOCCOM_FM6500_WCN2243_20_VERSION (0x04020205)
|
||||
|
||||
extern int chipVersion;
|
||||
|
||||
/* RDS Group processing parameters */
|
||||
#define FM_RX_RDS_GRP_RT_EBL 1
|
||||
#define FM_RX_RDS_GRP_PS_EBL 2
|
||||
#define FM_RX_RDS_GRP_AF_EBL 4
|
||||
#ifdef FM_SOC_TYPE_CHEROKEE
|
||||
#define FM_RX_RDS_GRP_PS_SIMPLE_EBL 8
|
||||
#define FM_RX_RDS_GRP_ECC_EBL 32
|
||||
#define FM_RX_RDS_GRP_PTYN_EBL 64
|
||||
#define FM_RX_RDS_GRP_RT_PLUS_EBL 128
|
||||
#else
|
||||
#define FM_RX_RDS_GRP_PS_SIMPLE_EBL 16
|
||||
#endif
|
||||
|
||||
|
||||
/* lower and upper band limits of regions */
|
||||
#define REGION_US_EU_BAND_LOW 87500
|
||||
#define REGION_US_EU_BAND_HIGH 107900
|
||||
#define REGION_JAPAN_STANDARD_BAND_LOW 76000
|
||||
#define REGION_JAPAN_STANDARD_BAND_HIGH 90000
|
||||
#define REGION_JAPAN_WIDE_BAND_LOW 90000
|
||||
#define REGION_JAPAN_WIDE_BAND_HIGH 108000
|
||||
#define V4L2_CID_PRIVATE_BASE 0x08000000
|
||||
#define MAX_RDS_PS_LENGTH 108
|
||||
#define MAX_RDS_RT_LENGTH 64
|
||||
#define V4L2_CID_PRIVATE_IRIS_RDS_GRP_COUNTERS_EXT 0x08000042
|
||||
|
||||
typedef enum {
|
||||
V4L2_CID_PRIVATE_IRIS_HLSI = (V4L2_CID_PRIVATE_BASE + 0x1d),
|
||||
V4L2_CID_PRIVATE_IRIS_SOFT_MUTE,
|
||||
V4L2_CID_PRIVATE_IRIS_RIVA_ACCS_ADDR,
|
||||
V4L2_CID_PRIVATE_IRIS_RIVA_ACCS_LEN,
|
||||
V4L2_CID_PRIVATE_IRIS_RIVA_PEEK,
|
||||
V4L2_CID_PRIVATE_IRIS_RIVA_POKE,
|
||||
V4L2_CID_PRIVATE_IRIS_SSBI_ACCS_ADDR,
|
||||
V4L2_CID_PRIVATE_IRIS_SSBI_PEEK,
|
||||
V4L2_CID_PRIVATE_IRIS_SSBI_POKE,
|
||||
V4L2_CID_PRIVATE_IRIS_TX_TONE,
|
||||
V4L2_CID_PRIVATE_IRIS_RDS_GRP_COUNTERS,
|
||||
V4L2_CID_PRIVATE_IRIS_SET_NOTCH_FILTER,
|
||||
V4L2_CID_PRIVATE_IRIS_AGC_CTRL = 0x08000043,
|
||||
V4L2_CID_PRIVATE_IRIS_AGC_STATE,
|
||||
V4L2_CID_PRIVATE_IRIS_READ_DEFAULT = 0x00980928,//using private CIDs under userclass
|
||||
V4L2_CID_PRIVATE_IRIS_WRITE_DEFAULT,
|
||||
}v4l2_cid_private_iris_t_copy;
|
||||
typedef enum
|
||||
{
|
||||
/* Total no. of PS names that can be transmitted : 12
|
||||
Width of each transmitted PS name is : 8
|
||||
Total no. of PS characters that can be transmitted : (12*8 = 96)
|
||||
*/
|
||||
MAX_TX_PS_LEN = 96,
|
||||
MAX_TX_PS_RPT_CNT = 15,
|
||||
}FmTxPSFeatures;
|
||||
|
||||
/* FTM FM command IDs */
|
||||
typedef enum
|
||||
{
|
||||
#ifdef FEATURE_FTM_FM_DEBUG
|
||||
FTM_FM_RX_SET_POWER_MODE = 13,
|
||||
FTM_FM_RX_SET_SIGNAL_THRESHOLD = 14,
|
||||
FTM_FM_RX_GET_RSSI_LIMIT = 16,
|
||||
FTM_FM_RX_GET_PS_INFO = 17,
|
||||
FTM_FM_RX_GET_RT_INFO = 18,
|
||||
FTM_FM_RX_GET_AF_INFO = 19,
|
||||
FTM_FM_RX_SEARCH_STATIONS = 20,
|
||||
FTM_FM_RX_SEARCH_RDS_STATIONS = 21,
|
||||
FTM_FM_RX_SEARCH_STATIONS_LIST = 22,
|
||||
FTM_FM_RX_CANCEL_SEARCH = 23,
|
||||
FTM_FM_RX_RDS_GROUP_PROC_OPTIONS = 25,
|
||||
FTM_FM_RX_RDS_PI_MATCH_OPTIONS = 26,
|
||||
FTM_FM_TX_GET_PS_FEATURES = 36,
|
||||
FTM_FM_TX_TX_PS_INFO = 38,
|
||||
FTM_FM_TX_STOP_PS_INFO_TX = 39,
|
||||
FTM_FM_TX_TX_RT_INFO = 40,
|
||||
FTM_FM_TX_STOP_RT_INFO_TX = 41,
|
||||
FTM_FM_RX_GET_SIGNAL_THRESHOLD = 46,
|
||||
FTM_FM_FMWAN_REG_RD = 51,
|
||||
FTM_FM_RX_GET_DEFAULTS = 62,
|
||||
FTM_FM_RX_SET_DEFAULTS = 63,
|
||||
FTM_FM_RX_GET_SINR_SAMPLES = 64,
|
||||
FTM_FM_RX_SET_SINR_SAMPLES = 65,
|
||||
FTM_FM_RX_GET_SINR_THRESHOLD = 66,
|
||||
FTM_FM_RX_SET_SINR_THRESHOLD = 67,
|
||||
FTM_FM_RX_GET_ONCHANNEL_TH = 68,
|
||||
FTM_FM_RX_SET_ONCHANNEL_TH = 69,
|
||||
FTM_FM_RX_GET_OFFCHANNEL_TH = 70,
|
||||
FTM_FM_RX_SET_OFFCHANNEL_TH = 71,
|
||||
FTM_FM_TX_PWR_LVL_CFG = 72,
|
||||
#endif /* FEATURE_FTM_FM_DEBUG */
|
||||
|
||||
FTM_FM_RX_ENABLE_RECEIVER = 7,
|
||||
FTM_FM_RX_DISABLE_RECEIVER = 8,
|
||||
FTM_FM_RX_CONFIGURE_RECEIVER = 9,
|
||||
FTM_FM_RX_SET_MUTE_MODE = 10,
|
||||
FTM_FM_RX_SET_STEREO_MODE = 11,
|
||||
FTM_FM_RX_SET_STATION = 12,
|
||||
FTM_FM_RX_GET_STATION_PARAMETERS = 15,
|
||||
FTM_FM_RX_RDS_GROUP_OPTIONS = 24,
|
||||
FTM_FM_TX_ENABLE_TRANSMITTER = 33,
|
||||
FTM_FM_TX_DISABLE_TRANSMITTER = 34,
|
||||
FTM_FM_TX_CONFIGURE_TRANSMITTER = 35,
|
||||
FTM_FM_TX_SET_STATION = 37,
|
||||
FTM_FM_TX_TX_RDS_GROUPS = 42,
|
||||
FTM_FM_TX_TX_CONT_RDS_GROUPS = 43,
|
||||
FTM_FM_TX_TX_RDS_CTRL = 44,
|
||||
FTM_FM_TX_GET_RDS_GROUP_BUF_SIZE = 45,
|
||||
FTM_FM_BUS_WRITE = 47,
|
||||
FTM_FM_BUS_READ = 48,
|
||||
FTM_FM_NOTIFY_WAN = 49,
|
||||
FTM_FM_NOTIFY_FM = 50,
|
||||
FTM_FM_ROUTE_AUDIO = 52,
|
||||
FTM_FM_RX_SET_AF_THRESHOLD = 53,
|
||||
FTM_FM_RX_SET_RSSI_CHECK_TIMER = 54,
|
||||
FTM_FM_RX_SET_RDS_PI_TIMER = 55,
|
||||
FTM_FM_RX_GET_AF_THRESHOLD = 56,
|
||||
FTM_FM_RX_GET_RSSI_CHECK_TIMER = 57,
|
||||
FTM_FM_RX_GET_RDS_PI_TIMER = 58,
|
||||
FTM_FM_RX_GET_RDS_ERR_COUNT = 59,
|
||||
FTM_FM_RX_RESET_RDS_ERR_COUNT = 60,
|
||||
FTM_FM_TX_SEARCH_STATIONS = 61,
|
||||
FTM_FM_SET_HLSI = 100,
|
||||
FTM_FM_SET_SOFT_MUTE = 101,
|
||||
FTM_FM_SET_ANTENNA = 102,
|
||||
FTM_FM_SET_NOTCH_FILTER = 103,
|
||||
FTM_FM_READ_RDS_GRP_CNTRS = 104,
|
||||
FTM_FM_SET_TONE_GENERATION = 105,
|
||||
FTM_FM_PEEK_SSBI = 106,
|
||||
FTM_FM_POKE_SSBI = 107,
|
||||
FTM_FM_PEEK_RIVA_WORD = 108,
|
||||
FTM_FM_POKE_RIVA_WORD = 109,
|
||||
FTM_FM_ENABLE_AUDIO = 111,
|
||||
FTM_FM_DISABLE_AUDIO = 112,
|
||||
FTM_FM_VOLUME_SETTING = 113,
|
||||
FTM_FM_READ_RDS_GRP_CNTRS_EXT = 114,
|
||||
FTM_FM_SET_GET_RESET_AGC = 115,
|
||||
FTM_FM_MAX
|
||||
} ftm_fm_sub_cmd_type;
|
||||
|
||||
#define XFR_CTRL_OFFSET 0x1F
|
||||
/* Wait time for ensuring XFR is generated */
|
||||
#define WAIT_ON_ISR_DELAY 15000 //15 ms
|
||||
#define AFTH_OFFSET 0x2E
|
||||
#define CHCOND_OFFSET 0x22
|
||||
#define RDSTIMEOUT_OFFSET 0x25
|
||||
#define FM_SLAVE_ADDR 0x2A
|
||||
#define RDSERR_OFFSET 0x24
|
||||
#define RDSRESET_OFFSET 0x20
|
||||
#define BLOCKS_PER_GROUP 0x04
|
||||
#define FTM_FM_RDS_COUNT 0x11
|
||||
|
||||
|
||||
#define MAX_RIVA_DATA_LEN 245
|
||||
#define MAX_RIVA_PEEK_RSP_SIZE 251
|
||||
#define SSBI_PEEK_DATA_SIZE 1
|
||||
|
||||
#define IRIS_BUF_PEEK 6
|
||||
#define IRIS_BUF_SSBI_PEEK IRIS_BUF_PEEK+1
|
||||
#define IRIS_BUF_RDS_CNTRS IRIS_BUF_SSBI_PEEK+1
|
||||
#define IRIS_BUF_RD_DEFAULT IRIS_BUF_RDS_CNTRS+1
|
||||
#ifdef FM_SOC_TYPE_CHEROKEE
|
||||
#define RDS_GRP_CNTRS_SIZE 48
|
||||
#else
|
||||
#define RDS_GRP_CNTRS_SIZE 36
|
||||
#endif
|
||||
/* Generic result, used for any command that only returns an error code */
|
||||
typedef enum
|
||||
{
|
||||
FTM_FM_SUCCESS,
|
||||
FTM_FAIL,
|
||||
FTM_FILE_DOES_NOT_EXIST,
|
||||
FTM_MMC_ERROR,
|
||||
FTM_FM_UNRECOGNIZED_CMD,
|
||||
FTM_NO_RESOURCES,
|
||||
FTM_FM_PENDING,
|
||||
FTM_INVALID_PARAM,
|
||||
FTM_FM_DISALLOWED,
|
||||
FTM_TEST_NOT_IMPLEMENTED,
|
||||
FTM_CUST_HW_ID_UNKNOWN,
|
||||
FTM_FM_BUS_WRITE_ERROR,
|
||||
FTM_FM_BUS_READ_ERROR,
|
||||
FTM_FM_CLIENT_MAX,
|
||||
|
||||
} ftm_fm_api_result_type;
|
||||
|
||||
/* FM power state enum */
|
||||
typedef enum
|
||||
{
|
||||
FM_POWER_OFF,
|
||||
FM_POWER_TRANSITION,
|
||||
FM_RX_ON,
|
||||
FM_TX_ON
|
||||
}fm_power_state;
|
||||
|
||||
/* FM command status enum */
|
||||
typedef enum
|
||||
{
|
||||
FM_CMD_SUCCESS,
|
||||
FM_CMD_PENDING,
|
||||
FM_CMD_NO_RESOURCES,
|
||||
FM_CMD_INVALID_PARAM,
|
||||
FM_CMD_DISALLOWED,
|
||||
FM_CMD_UNRECOGNIZED_CMD,
|
||||
FM_CMD_FAILURE
|
||||
}fm_cmd_status_type;
|
||||
|
||||
/**
|
||||
* FM event result.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
FM_EV_SUCCESS = 0,
|
||||
/**< Event indicates success. */
|
||||
|
||||
FM_EV_FAILURE = 1,
|
||||
/**< Event is a response to a command that failed */
|
||||
|
||||
FM_EV_CMD_DISALLOWED = 2,
|
||||
/**< Event is a response to a command that was disallowed. */
|
||||
|
||||
FM_EV_CMD_INVALID_PARAM = 3
|
||||
/**< Event is a response to a command that contained an invalid parameter. */
|
||||
|
||||
} FmEvResultType;
|
||||
|
||||
/**
|
||||
* FM Receiver event names.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
/* -----------------------------------------------
|
||||
1 -> FM Receiver initialization events
|
||||
----------------------------------------------- */
|
||||
|
||||
FM_RX_EV_ENABLE_RECEIVER = 0,
|
||||
|
||||
FM_RX_EV_DISABLE_RECEIVER,
|
||||
|
||||
FM_RX_EV_CFG_RECEIVER,
|
||||
|
||||
/* -----------------------------------------------
|
||||
2 -> FM receiver control events
|
||||
----------------------------------------------- */
|
||||
|
||||
FM_RX_EV_MUTE_MODE_SET,
|
||||
|
||||
FM_RX_EV_STEREO_MODE_SET,
|
||||
|
||||
FM_RX_EV_RADIO_STATION_SET,
|
||||
|
||||
FM_RX_EV_PWR_MODE_SET,
|
||||
|
||||
FM_RX_EV_SET_SIGNAL_THRESHOLD,
|
||||
|
||||
/* -----------------------------------------------
|
||||
3 -> FM receiver status events
|
||||
----------------------------------------------- */
|
||||
|
||||
FM_RX_EV_RADIO_TUNE_STATUS,
|
||||
|
||||
FM_RX_EV_STATION_PARAMETERS,
|
||||
|
||||
FM_RX_EV_RDS_LOCK_STATUS,
|
||||
|
||||
FM_RX_EV_STEREO_STATUS,
|
||||
|
||||
FM_RX_EV_SERVICE_AVAILABLE,
|
||||
|
||||
FM_RX_EV_GET_SIGNAL_THRESHOLD,
|
||||
|
||||
/* -----------------------------------------------
|
||||
4 -> FM search status events
|
||||
----------------------------------------------- */
|
||||
|
||||
FM_RX_EV_SEARCH_IN_PROGRESS,
|
||||
|
||||
FM_RX_EV_SEARCH_RDS_IN_PROGRESS,
|
||||
|
||||
FM_RX_EV_SEARCH_LIST_IN_PROGRESS,
|
||||
|
||||
FM_RX_EV_SEARCH_COMPLETE,
|
||||
|
||||
FM_RX_EV_SEARCH_RDS_COMPLETE,
|
||||
|
||||
FM_RX_EV_SEARCH_LIST_COMPLETE,
|
||||
|
||||
FM_RX_EV_SEARCH_CANCELLED,
|
||||
|
||||
/* -----------------------------------------------
|
||||
5 -> FM RDS status events
|
||||
----------------------------------------------- */
|
||||
|
||||
FM_RX_EV_RDS_GROUP_DATA,
|
||||
|
||||
FM_RX_EV_RDS_PS_INFO,
|
||||
|
||||
FM_RX_EV_RDS_RT_INFO,
|
||||
|
||||
FM_RX_EV_RDS_AF_INFO,
|
||||
|
||||
FM_RX_EV_RDS_PI_MATCH_AVAILABLE,
|
||||
|
||||
/* -----------------------------------------------
|
||||
6 -> FM RDS control events
|
||||
----------------------------------------------- */
|
||||
|
||||
FM_RX_EV_RDS_GROUP_OPTIONS_SET,
|
||||
|
||||
FM_RX_EV_RDS_PROC_REG_DONE,
|
||||
|
||||
FM_RX_EV_RDS_PI_MATCH_REG_DONE,
|
||||
|
||||
FM_RX_EV_MAX_EVENT
|
||||
|
||||
} FmRxEventType;
|
||||
|
||||
typedef enum radio_band_type
|
||||
{
|
||||
FM_US_EU = 0x0,
|
||||
FM_JAPAN_STANDARD = 0x1,
|
||||
FM_JAPAN_WIDE = 0x2,
|
||||
FM_USER_DEFINED = 0x4
|
||||
}radio_band_type;
|
||||
|
||||
typedef enum emphasis_type
|
||||
{
|
||||
FM_RX_EMP75 = 0x0,
|
||||
FM_RX_EMP50 = 0x1
|
||||
}emphasis_type;
|
||||
|
||||
typedef enum channel_space_type
|
||||
{
|
||||
FM_RX_SPACE_200KHZ = 0x0,
|
||||
FM_RX_SPACE_100KHZ = 0x1,
|
||||
FM_RX_SPACE_50KHZ = 0x2
|
||||
}channel_space_type;
|
||||
|
||||
typedef enum rds_system_type
|
||||
{
|
||||
FM_RX_RDBS_SYSTEM = 0x0,
|
||||
FM_RX_RDS_SYSTEM = 0x1,
|
||||
FM_RX_NO_RDS_SYSTEM = 0x2
|
||||
}rds_sytem_type;
|
||||
|
||||
typedef struct band_limit_freq
|
||||
{
|
||||
uint32 lower_limit;
|
||||
uint32 upper_limit;
|
||||
}band_limit_freq;
|
||||
|
||||
|
||||
typedef enum rds_sync_type
|
||||
{
|
||||
FM_RDS_NOT_SYNCED = 0x0,
|
||||
FM_RDS_SYNCED = 0x1
|
||||
}rds_sync_type;
|
||||
|
||||
typedef enum stereo_type
|
||||
{
|
||||
FM_RX_MONO = 0x0,
|
||||
FM_RX_STEREO = 0x1
|
||||
}stereo_type;
|
||||
|
||||
typedef enum fm_service_available
|
||||
{
|
||||
FM_SERVICE_NOT_AVAILABLE = 0x0,
|
||||
FM_SERVICE_AVAILABLE = 0x1
|
||||
}fm_service_available;
|
||||
|
||||
typedef enum mute_type
|
||||
{
|
||||
FM_RX_NO_MUTE = 0x00,
|
||||
FM_RX_MUTE_RIGHT = 0x01,
|
||||
FM_RX_MUTE_LEFT = 0x02,
|
||||
FM_RX_MUTE_BOTH = 0x03
|
||||
}mute_type;
|
||||
|
||||
typedef enum antenna_type
|
||||
{
|
||||
WIRED_HS,
|
||||
PWB_ANT
|
||||
}antenna_type;
|
||||
|
||||
typedef enum audio_output
|
||||
{
|
||||
HEADSET,
|
||||
SPEAKER,
|
||||
} audio_output;
|
||||
/**
|
||||
* RDS/RBDS Program Type type.
|
||||
*/
|
||||
typedef uint8 fm_prgm_type;
|
||||
|
||||
/**
|
||||
* RDS/RBDS Program Identification type.
|
||||
*/
|
||||
typedef uint16 fm_prgmid_type;
|
||||
/**
|
||||
* RDS/RBDS Program Services type.
|
||||
*/
|
||||
typedef char fm_prm_services;
|
||||
/**
|
||||
* RDS/RBDS Radio Text type.
|
||||
*/
|
||||
/*
|
||||
* FM RX RIVA peek request
|
||||
*/
|
||||
typedef struct fm_riva_peek_word
|
||||
{
|
||||
uint8 subOpcode;
|
||||
uint32 startaddress;
|
||||
uint8 payload_length;/*In Bytes*/
|
||||
uint8 data[MAX_RIVA_DATA_LEN];
|
||||
}__attribute__((packed))fm_riva_peek_word;
|
||||
|
||||
/*
|
||||
* FM RX RIVA poke request
|
||||
*/
|
||||
typedef struct fm_riva_poke_word
|
||||
{
|
||||
uint8 subOpcode;
|
||||
uint32 startaddress;
|
||||
uint8 payload_length;/*In Bytes*/
|
||||
uint8 data[MAX_RIVA_DATA_LEN];
|
||||
}__attribute__((packed))fm_riva_poke_word ;
|
||||
|
||||
|
||||
/*
|
||||
* FM RX SSBI peek/poke request
|
||||
*/
|
||||
typedef struct fm_ssbi_poke_reg
|
||||
{
|
||||
uint16 startaddress;
|
||||
uint8 data;
|
||||
}__attribute__((packed))fm_ssbi_poke_reg;
|
||||
|
||||
/*
|
||||
* fm Set Get Reset AGC request
|
||||
*/
|
||||
typedef struct fm_set_get_reset_agc_req
|
||||
{
|
||||
uint8 ucCtrl;
|
||||
uint8 ucGainState;
|
||||
}__attribute__((packed))fm_set_get_reset_agc_req;
|
||||
|
||||
typedef struct fm_set_get_reset_agc_params
|
||||
{
|
||||
uint8 ucCurrentGainState;
|
||||
uint8 ucGainStateChange1;
|
||||
uint8 ucGainStateChange2;
|
||||
uint8 ucGainStateChange3;
|
||||
}__attribute__((packed))fm_set_get_reset_agc_params;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
uint8 status ;
|
||||
uint8 data_length ;
|
||||
uint8 data[DEFAULT_DATA_SIZE];
|
||||
}__attribute__((packed)) readDefaults_data;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
uint8 status ;
|
||||
uint8 data_length ;
|
||||
uint8 data[DEFAULT_DATA_SIZE];
|
||||
}__attribute__((packed)) default_read_rsp;
|
||||
|
||||
/*RDS Group counters*/
|
||||
typedef struct fm_rds_grp_cntrsparams
|
||||
{
|
||||
uint32 totalRdsSBlockErrors;
|
||||
uint32 totalRdsGroups;
|
||||
uint32 totalRdsGroup0;
|
||||
uint32 totalRdsGroup2;
|
||||
uint32 totalRdsBlockB;
|
||||
uint32 totalRdsProcessedGroup0;
|
||||
uint32 totalRdsProcessedGroup2;
|
||||
uint32 totalRdsGroupFiltered;
|
||||
uint32 totalRdsChangeFiltered;
|
||||
}__attribute__((packed)) fm_rds_grp_cntrsparams;
|
||||
|
||||
/*RDS Group counters extended */
|
||||
typedef struct fm_rds_grpcntrs_extendedparams
|
||||
{
|
||||
uint32 totalRdsSyncLoss;
|
||||
uint32 totalRdsNotSync;
|
||||
uint32 totalRdsSyncInt;
|
||||
}__attribute__((packed)) fm_rds_grpcntrs_extendedparams;
|
||||
|
||||
typedef char fm_radiotext_info;
|
||||
/**
|
||||
* FM Global Paramaters struct.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
uint32 current_station_freq;/*a frequency in kHz the band range*/
|
||||
uint8 service_available;
|
||||
uint8 rssi; /* rssi range from 0-100*/
|
||||
uint8 stype;
|
||||
uint8 rds_sync_status;
|
||||
uint8 mute_status;
|
||||
uint8 ssbi_peek_data;
|
||||
fm_prgmid_type pgm_id; /* Program Id */
|
||||
fm_prgm_type pgm_type; /* Program type */
|
||||
fm_prm_services pgm_services[MAX_RDS_PS_LENGTH];
|
||||
fm_radiotext_info radio_text[MAX_RDS_RT_LENGTH];/* RT maximum is 64 bytes */
|
||||
fm_riva_poke_word riva_data_access_params;
|
||||
fm_set_get_reset_agc_params set_get_reset_agc_params;
|
||||
fm_rds_grp_cntrsparams rds_group_counters;
|
||||
fm_rds_grpcntrs_extendedparams rds_group_counters_extended;
|
||||
readDefaults_data default_read_data;
|
||||
uint8 fm_ps_length;
|
||||
uint8 fm_rt_length;
|
||||
uint8 sinr_samples;
|
||||
char sinr_threshold;
|
||||
uint8 On_channel_threshold;
|
||||
uint8 Off_channel_threshold;
|
||||
}fm_station_params_available;
|
||||
/**
|
||||
* FM Config Request structure.
|
||||
*/
|
||||
typedef struct fm_config_data
|
||||
{
|
||||
uint8 band;
|
||||
uint8 emphasis;
|
||||
uint8 spacing;
|
||||
uint8 rds_system;
|
||||
band_limit_freq bandlimits;
|
||||
uint8 is_fm_tx_on;
|
||||
}fm_config_data;
|
||||
|
||||
/*
|
||||
* FM RDS Options Config Request
|
||||
*/
|
||||
typedef struct fm_rds_options
|
||||
{
|
||||
uint32 rds_group_mask;
|
||||
uint32 rds_group_buffer_size;
|
||||
uint8 rds_change_filter;
|
||||
}fm_rds_options;
|
||||
/*
|
||||
* FM RX Search stations request
|
||||
*/
|
||||
typedef struct fm_search_stations
|
||||
{
|
||||
uint8 search_mode;
|
||||
uint8 dwell_period;
|
||||
uint8 search_dir;
|
||||
}fm_search_stations;
|
||||
|
||||
/*
|
||||
* FM RX Search DDS stations request
|
||||
*/
|
||||
typedef struct fm_search_rds_stations
|
||||
{
|
||||
uint8 search_mode;
|
||||
uint8 dwell_period;
|
||||
uint8 search_dir;
|
||||
uint8 program_type;
|
||||
uint16 program_id;
|
||||
}fm_search_rds_stations;
|
||||
|
||||
/*
|
||||
* FM RX Search station lists request
|
||||
*/
|
||||
typedef struct fm_search_list_stations
|
||||
{
|
||||
uint8 search_mode;
|
||||
uint8 search_dir;
|
||||
uint32 srch_list_max;
|
||||
/**< Maximum number of stations that can be returned from a search. */
|
||||
uint8 program_type;
|
||||
}fm_search_list_stations;
|
||||
|
||||
/*
|
||||
* FM RX I2C request
|
||||
*/
|
||||
typedef struct fm_i2c_params
|
||||
{
|
||||
uint8 slaveaddress;
|
||||
uint8 offset;
|
||||
uint8 payload_length;
|
||||
uint8 data[64];
|
||||
}fm_i2c_params;
|
||||
|
||||
/* Structure containing the RDS PS Info to be transmitted */
|
||||
typedef struct _tsFtmFmRdsTxPsType
|
||||
{
|
||||
uint32 ulPSStrLen;
|
||||
/**< The size of the cTxPSStrPtr buffer.
|
||||
*/
|
||||
|
||||
uint32 ucTxPSRptCnt;
|
||||
/**< The number of times each 8 character string is repeated before the next
|
||||
string is transmitted.
|
||||
*/
|
||||
|
||||
uint16 tusTxPi;
|
||||
/**< RDS/RBDS Program Identification to use for Program Service transmissions.
|
||||
*/
|
||||
|
||||
uint8 tucTxPSPty;
|
||||
/**< The RDS/RBDS Program Type to transmit.
|
||||
*/
|
||||
|
||||
const char cTxPSStrPtr[108];
|
||||
/**< A pointer to a buffer containing the Program Service string to transmit
|
||||
(must be null terminated).
|
||||
*/
|
||||
|
||||
} tsFtmFmRdsTxPsType;
|
||||
|
||||
typedef struct _tsFtmFmRdsTxRtType
|
||||
{
|
||||
uint32 ulRTStrLen;
|
||||
/**< The size of the cTxRTStrPtr buffer.
|
||||
*/
|
||||
|
||||
uint16 tusTxPi;
|
||||
/**< RDS/RBDS Program Identification to use for RadioText transmissions.
|
||||
*/
|
||||
|
||||
uint8 tucTxRTPty;
|
||||
/**< The RDS/RBDS Program Type to transmit.
|
||||
*/
|
||||
|
||||
const char cTxRTStrPtr[65];
|
||||
/**< A pointer to a buffer containing the RadioText string to transmit
|
||||
(must be null terminated).
|
||||
*/
|
||||
|
||||
} tsFtmFmRdsTxRtType;
|
||||
|
||||
typedef struct _ftm_def_data_rd_req
|
||||
{
|
||||
uint8 mode;
|
||||
uint8 length;
|
||||
uint8 param_len;
|
||||
uint8 param;
|
||||
} __attribute__((packed))ftm_fm_def_data_rd_req;
|
||||
|
||||
typedef struct _ftm_def_data_wr_req
|
||||
{
|
||||
uint8 mode;
|
||||
uint8 length;
|
||||
uint8 data[DEFAULT_DATA_SIZE];
|
||||
} __attribute__((packed))ftm_fm_def_data_wr_req;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
uint8 length; /*RDS PS string length*/
|
||||
uint8 string[MAX_RDS_PS_LENGTH]; /* RDS string */
|
||||
}__attribute__((packed)) fmrdsps_response;
|
||||
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
uint8 length; /*RDS PS string length*/
|
||||
uint8 string[MAX_RDS_RT_LENGTH]; /* RDS string */
|
||||
}__attribute__((packed)) fmrdsrt_response;
|
||||
|
||||
|
||||
/**
|
||||
* FM All Request Union type.
|
||||
*/
|
||||
typedef union fm_cfg_request
|
||||
{
|
||||
fm_config_data cfg_param;
|
||||
uint8 mute_param;
|
||||
uint8 stereo_param;
|
||||
uint32 freq;
|
||||
fm_rds_options rds_options;
|
||||
uint8 power_mode;
|
||||
uint8 signal_threshold;
|
||||
fm_search_stations search_stations_options;
|
||||
fm_search_rds_stations search_rds_stations_options;
|
||||
fm_search_list_stations search_list_stations_options;
|
||||
fm_i2c_params i2c_params;
|
||||
uint32 rds_group_options;
|
||||
uint16 rx_af_threshold;
|
||||
uint8 rx_rssi_checktimer;
|
||||
uint rx_rds_pi_timer;
|
||||
tsFtmFmRdsTxPsType tuFmPSParams;
|
||||
tsFtmFmRdsTxRtType tuFmRTParams;
|
||||
uint8 soft_mute_param;
|
||||
uint8 antenna_type;
|
||||
uint8 tx_tone_param;
|
||||
uint8 rds_grp_counters;
|
||||
uint8 rds_grp_counters_ext;
|
||||
uint8 hlsi;
|
||||
uint8 sinr_samples;
|
||||
char sinr_threshold;
|
||||
uint8 On_channel_threshold;
|
||||
uint8 Off_channel_threshold;
|
||||
uint8 notch;
|
||||
fm_riva_peek_word riva_peek_params;
|
||||
fm_riva_poke_word riva_data_access_params;
|
||||
fm_ssbi_poke_reg ssbi_access_params;
|
||||
fm_set_get_reset_agc_req set_get_agc_req_parameters;
|
||||
ftm_fm_def_data_rd_req rd_default;
|
||||
ftm_fm_def_data_wr_req wr_default;
|
||||
uint8 tx_pwr_cfg;
|
||||
uint8 audio_output;
|
||||
uint8 audio_vlm;
|
||||
}fm_cfg_request;
|
||||
|
||||
/* FTM FM request type */
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_cmd_code_type cmd_code;
|
||||
diagpkt_subsys_id_type subsys_id;
|
||||
diagpkt_subsys_cmd_code_type subsys_cmd_code;
|
||||
uint16 cmd_id; /* command id (required) */
|
||||
uint16 cmd_data_len;
|
||||
uint16 cmd_rsp_pkt_size;
|
||||
byte data[1];
|
||||
}__attribute__((packed))ftm_fm_pkt_type;
|
||||
|
||||
/* Set MuteMode Response */
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
uint8 mutemode;
|
||||
}__attribute__((packed)) mutemode_response;
|
||||
|
||||
/* Set StereoMode Response */
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
uint8 stereomode;
|
||||
}__attribute__((packed)) stereomode_response;
|
||||
|
||||
/* I2C Response */
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
uint32 length; /*length of data read */
|
||||
uint8 data[64]; /* I2C read dat buffer */
|
||||
}__attribute__((packed)) fmbusread_response;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
uint8 sub_opcode;
|
||||
uint32 start_address;
|
||||
uint8 length; /*length of data read */
|
||||
uint8 data[MAX_RIVA_DATA_LEN]; /* read dat buffer */
|
||||
}__attribute__((packed)) rivaData_response;
|
||||
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
uint8 data;
|
||||
}__attribute__((packed)) ssbiPeek_response;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
uint8 uccurrentgainstate;
|
||||
uint8 ucgainstatechange1;
|
||||
uint8 ucgainstatechange2;
|
||||
uint8 ucgainstatechange3;
|
||||
}__attribute__((packed)) set_get_reset_agc_response;
|
||||
|
||||
/*Read RDS Group counters responce*/
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
fm_rds_grp_cntrsparams read_rds_cntrs;
|
||||
}__attribute__((packed)) ReadRDSCntrs_responce;
|
||||
|
||||
/*Read RDS Group counters response*/
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
fm_rds_grpcntrs_extendedparams read_rds_cntrs_ext;
|
||||
}__attribute__((packed)) ReadRDSCntrs_ext_response;
|
||||
|
||||
|
||||
/* Generic Response */
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
}__attribute__((packed)) generic_response;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ;
|
||||
char result ;
|
||||
uint16 afthreshold;
|
||||
} fmrxsetafthreshold_response;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ;
|
||||
char result ;
|
||||
uint8 sinr_sample;
|
||||
} getsinrsamples_response;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ;
|
||||
char result ;
|
||||
char sinr_threshold;
|
||||
} getsinrthreshold_response;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ;
|
||||
char result ;
|
||||
uint8 sinr_on_th;
|
||||
} getonchannelthreshold_response;
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ;
|
||||
char result ;
|
||||
uint8 sinr_off_th;
|
||||
} getoffchannelthreshold_response;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ;
|
||||
char result ;
|
||||
uint8 rssitimer;
|
||||
} fmrxsetrssichecktimer_response;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ;
|
||||
char result ;
|
||||
uint8 rdspitimer;
|
||||
} fmrxsetrdspitimer_response;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ;
|
||||
char result ;
|
||||
uint8 threshold;
|
||||
} threshold_response;
|
||||
|
||||
typedef PACKED struct
|
||||
{
|
||||
diagpkt_subsys_header_type header ;
|
||||
char result ;
|
||||
uint32 rdserrcount;
|
||||
uint32 numofblocks;
|
||||
} rds_err_count_response;
|
||||
|
||||
/* Custom response for Get station parameters request */
|
||||
struct fm_rx_get_station_parameters_response_t
|
||||
{
|
||||
diagpkt_subsys_header_type header ; /*Diag header*/
|
||||
char result ;/* result */
|
||||
uint32 stationFreq;
|
||||
/* The currently tuned frequency in kHz (Example: 96500 -> 96.5Mhz)*/
|
||||
uint8 servAvble;
|
||||
/* The current service available indicator for the current station */
|
||||
uint8 rssi;
|
||||
/* The current signal strength level (0-100 range). */
|
||||
uint8 stereoProgram;
|
||||
/* The current mono/stereo indicator for this station */
|
||||
uint8 rdsSyncStatus;
|
||||
/* The current RDS/RBDS synchronization status */
|
||||
uint8 muteMode;
|
||||
/* The current FM mute mode */
|
||||
}__attribute__((packed));
|
||||
|
||||
/* FTM Log Packet - Used to send back the event of a HCI Command */
|
||||
typedef PACKED struct
|
||||
{
|
||||
log_hdr_type hdr;
|
||||
byte EvName;
|
||||
/* Event ID indicates which event is being returned. */
|
||||
byte EvResult;
|
||||
byte data[1]; /* Variable length payload,
|
||||
look at FTM log id for contents */
|
||||
} ftm_fm_log_pkt_type;
|
||||
#define FTM_FM_LOG_HEADER_SIZE (sizeof (ftm_fm_log_pkt_type) - 1)
|
||||
|
||||
typedef struct fm_rx_get_station_parameters_response_t fm_rx_get_station_parameters_response;
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_fm_dispatch
|
||||
|
||||
DESCRIPTION
|
||||
Dispatch routine for the various FM Rx/Tx commands. Copies the data into
|
||||
a global union data structure before calling the processing routine
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
A Packed structre pointer including the response to the FTM FM packet
|
||||
|
||||
SIDE EFFECTS
|
||||
None
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
void * ftm_fm_dispatch(ftm_fm_pkt_type *ftm_fm_pkt, uint16 length );
|
||||
|
||||
|
||||
/*===========================================================================
|
||||
|
||||
FUNCTION ftm_fm_enable_audio
|
||||
|
||||
DESCRIPTION
|
||||
This function is used to take the audio output mode from QRCT.
|
||||
|
||||
DEPENDENCIES
|
||||
none
|
||||
|
||||
===========================================================================*/
|
||||
PACKED void* ftm_fm_enable_audio( void );
|
||||
PACKED void* ftm_fm_disable_audio( void );
|
||||
PACKED void* ftm_fm_setting_volume(void);
|
||||
|
||||
#endif /* CONFIG_FTM_FM */
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,549 +0,0 @@
|
||||
/*
|
||||
*Copyright (c) 2018-2020, 2022 Qualcomm Technologies, Inc.
|
||||
*
|
||||
*All Rights Reserved.
|
||||
*Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
*/
|
||||
|
||||
/* IPQ-QCA402X specific file */
|
||||
|
||||
#ifdef IPQ_AP_HOST_IOT
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <mtd/mtd-user.h>
|
||||
#include "comdef.h"
|
||||
#include "diagcmd.h"
|
||||
#include "ftm_wlan.h"
|
||||
#include "ftm_dbg.h"
|
||||
#include "ftm_iot.h"
|
||||
#ifdef IPQ_AP_HOST_IOT_QCA402X
|
||||
#include "diag_api.h"
|
||||
#endif /* IPQ_AP_HOST_IOT_QCA402X */
|
||||
#ifdef IPQ_AP_HOST_IOT_IPQ
|
||||
#include "btdaemon.h"
|
||||
#endif /* IPQ50XX, IPQ95XX */
|
||||
|
||||
#define NHDLC_TERM 126
|
||||
#define NHDLC_VERSION 1
|
||||
#define NHDLC_TERM_SIZE 1
|
||||
#define FLASH_CMD_ID_POS 1
|
||||
#define MAX_BUF_SIZE 2048
|
||||
#define WAIT_TIME_MS 100
|
||||
#define SUBSYS_CMD_ID_POS 2
|
||||
#define RESERVED_CMD_ID 0
|
||||
#define DUT_INTERFACE_SELECT 1
|
||||
#define DUT_INTERFACE_ID_POS 4
|
||||
#define DUT_INTERFACE_SELECT_POS 10
|
||||
#define DIAG_HDR_LEN (sizeof(diag_nonhdlc_hdr_t) + NHDLC_TERM_SIZE)
|
||||
#define FTM_IOT_LOG_HEADER_SIZE sizeof(ftm_iot_log_pkt_type)
|
||||
|
||||
#define MEMSET_RESET_VALUE 0
|
||||
#define DIAG_HEADER_SIZE 12
|
||||
|
||||
extern void diagpkt_free(void *pkt);
|
||||
|
||||
void print_array(uint8_t *addr, int len)
|
||||
{
|
||||
int i;
|
||||
int line = 1;
|
||||
for (i = 0; i < len; i++) {
|
||||
if (i == (line * 80)) {
|
||||
DPRINTF(FTM_DBG_TRACE, "\n");
|
||||
line++;
|
||||
}
|
||||
DPRINTF(FTM_DBG_TRACE, "%02X ", addr[i]);
|
||||
}
|
||||
DPRINTF(FTM_DBG_TRACE, "\n");
|
||||
}
|
||||
#ifdef IPQ_AP_HOST_IOT_QCA402X
|
||||
/*===========================================================================
|
||||
FUNCTION iot_thr_func_qca402x
|
||||
|
||||
DESCRIPTION
|
||||
Continously polls QCA402X for asynchronous data responses and
|
||||
logs receievd asynchronous data responses to Diag module using
|
||||
log-submit()
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
Returns NULL on failure. Function also exits with NULL return value
|
||||
when main indicates that this thread should be stopped
|
||||
|
||||
SIDE EFFECTS
|
||||
NONE
|
||||
|
||||
===========================================================================*/
|
||||
void *iot_thr_func_qca402x(void *hdl)
|
||||
{
|
||||
int bytes = 0;
|
||||
void *rsp2 = NULL;
|
||||
int diag_hdr_len = DIAG_HDR_LEN ;
|
||||
void *new_iot_ftm_rsp2_pkt = NULL;
|
||||
|
||||
if (!hdl) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Invalid iotd handle\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
new_iot_ftm_rsp2_pkt = malloc(MAX_BUF_SIZE);
|
||||
if (!new_iot_ftm_rsp2_pkt) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not allocate response packet \n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while(1) {
|
||||
|
||||
if (thread_stop == 1) {
|
||||
DPRINTF(FTM_DBG_TRACE, "FTMd: Exiting thread.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
memset(new_iot_ftm_rsp2_pkt, MEMSET_RESET_VALUE, MAX_BUF_SIZE);
|
||||
sem_wait(&iot_sem);
|
||||
|
||||
/*If we recieve a response from QCA402X, allocate a buffer using diag alloc with correct
|
||||
subsystem code and length */
|
||||
while ((bytes = diag_recv(hdl, (uint8_t *)new_iot_ftm_rsp2_pkt,
|
||||
MAX_BUF_SIZE,
|
||||
WAIT_TIME_MS)) >= 0) {
|
||||
if (bytes > MAX_BUF_SIZE || bytes <= diag_hdr_len) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not allocate async log response packet\n");
|
||||
free (new_iot_ftm_rsp2_pkt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rsp2 = diagpkt_subsys_alloc(DIAG_SUBSYS_FTM, ftm_iot_cmd_code, (bytes - diag_hdr_len));
|
||||
if (!rsp2) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not allocate async log response packet\n");
|
||||
free (new_iot_ftm_rsp2_pkt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Remove NHDLC header from recieved packet and store contents in
|
||||
buffer allocated above */
|
||||
memcpy(rsp2, (new_iot_ftm_rsp2_pkt + diag_hdr_len - NHDLC_TERM_SIZE),
|
||||
(bytes - diag_hdr_len));
|
||||
|
||||
DPRINTF(FTM_DBG_TRACE, "FTMd: Asynchronous Data response has been sent.\n");
|
||||
print_array((uint8_t *)rsp2, (bytes - diag_hdr_len) );
|
||||
|
||||
/*Remove an additional 4 bytes of header and log packet to diag module
|
||||
asynchronously for further processing*/
|
||||
log_submit(rsp2 + diag_hdr_len - NHDLC_TERM_SIZE);
|
||||
diagpkt_free (rsp2);
|
||||
memset(new_iot_ftm_rsp2_pkt, MEMSET_RESET_VALUE, MAX_BUF_SIZE);
|
||||
}
|
||||
|
||||
sem_post(&iot_sem_async);
|
||||
}
|
||||
|
||||
free (new_iot_ftm_rsp2_pkt);
|
||||
diagpkt_free (rsp2);
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_iot_dispatch_qca402x
|
||||
|
||||
DESCRIPTION
|
||||
Function processes WIN IOT specific requests and relays to
|
||||
QCA402x FTM layer for further processing. Recieves response
|
||||
buffer from QCA402x and returns buffer meant for diag call back
|
||||
|
||||
This function handles NHDLC to HDLC translation and vice-versa
|
||||
before sending and receivng buffers to QCA402X FTM layer
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
Returns back buffer that is meant for diag callback
|
||||
|
||||
SIDE EFFECTS
|
||||
NONE
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
void *ftm_iot_dispatch_qca402x(void *iot_ftm_pkt, int pkt_len, void *hdl)
|
||||
{
|
||||
int diag_hdr_len = DIAG_HDR_LEN;
|
||||
int ret = 0;
|
||||
byte *payload_ptr = NULL;
|
||||
void *rsp1 = NULL;
|
||||
ftm_iot_req_pkt_type *new_iot_ftm_pkt = NULL;
|
||||
void *new_iot_ftm_rsp_pkt = NULL;
|
||||
char command[50] = {'\0'};
|
||||
uint16_t *ftm_iot_flash_ptr = NULL;
|
||||
uint16 ftm_iot_flash_cmd_code = 0;
|
||||
/* The new packet length will be length of original request packet
|
||||
+ size of NHDLC header + 1 byte of termination character */
|
||||
int new_pkt_len = pkt_len + diag_hdr_len;
|
||||
|
||||
if (!iot_ftm_pkt || !pkt_len || !hdl) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Invalid ftm iot request packet or iotd handle\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
new_iot_ftm_pkt = malloc(sizeof(ftm_iot_req_pkt_type) + pkt_len + NHDLC_TERM_SIZE);
|
||||
if (!new_iot_ftm_pkt) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not create new ftm iot request packet\n");
|
||||
return NULL;
|
||||
}
|
||||
memset(new_iot_ftm_pkt, MEMSET_RESET_VALUE, (sizeof(ftm_iot_req_pkt_type) + pkt_len + NHDLC_TERM_SIZE));
|
||||
|
||||
new_iot_ftm_rsp_pkt = malloc(MAX_BUF_SIZE);
|
||||
if (!new_iot_ftm_rsp_pkt) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not create new ftm iot response packet\n");
|
||||
free (new_iot_ftm_pkt);
|
||||
return NULL;
|
||||
}
|
||||
memset(new_iot_ftm_rsp_pkt, MEMSET_RESET_VALUE, MAX_BUF_SIZE);
|
||||
|
||||
/* Add Non-HDLC header to request packet
|
||||
and populate NHDLC header*/
|
||||
new_iot_ftm_pkt->hdr.start = NHDLC_TERM;
|
||||
new_iot_ftm_pkt->hdr.version = NHDLC_VERSION;
|
||||
new_iot_ftm_pkt->hdr.length = pkt_len;
|
||||
memcpy(&(new_iot_ftm_pkt->payload), iot_ftm_pkt, pkt_len);
|
||||
payload_ptr = (byte *) &(new_iot_ftm_pkt->payload);
|
||||
*( payload_ptr + pkt_len) = NHDLC_TERM;
|
||||
ftm_iot_cmd_code = *(payload_ptr + SUBSYS_CMD_ID_POS);
|
||||
ftm_iot_dut_interface_code = *(payload_ptr + DUT_INTERFACE_ID_POS);
|
||||
ftm_iot_reserved_code = *(payload_ptr + SUBSYS_CMD_ID_POS + 1);
|
||||
ftm_iot_flash_ptr = (uint16_t *) &(new_iot_ftm_pkt->payload);
|
||||
ftm_iot_flash_cmd_code = *(ftm_iot_flash_ptr + FLASH_CMD_ID_POS);
|
||||
/*Print packet after adding headers */
|
||||
DPRINTF(FTM_DBG_TRACE, "FTMd: Request Packet of size %d bytes sent:\n", new_pkt_len);
|
||||
print_array((uint8_t *)new_iot_ftm_pkt, new_pkt_len);
|
||||
|
||||
/*If the request packet it a DUT interface selection command,
|
||||
update interface number and return a response packet that
|
||||
is an encho of the request packet. ( In the case of multiple
|
||||
QCA402x DUT attaches on IPQ platforms) */
|
||||
if (((ftm_iot_cmd_code == MFG_CMD_ID_BLE_HCI) || (ftm_iot_cmd_code == MFG_CMD_ID_I15P4_HMI))
|
||||
&& (ftm_iot_dut_interface_code == DUT_INTERFACE_SELECT)
|
||||
&& (ftm_iot_reserved_code == RESERVED_CMD_ID)){
|
||||
interface = *(payload_ptr + DUT_INTERFACE_SELECT_POS) - 1;
|
||||
if (interface < 0) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Invalid DUT interface selection command\n");
|
||||
free (new_iot_ftm_pkt);
|
||||
free (new_iot_ftm_rsp_pkt);
|
||||
return NULL;
|
||||
}
|
||||
rsp1 = diagpkt_subsys_alloc(DIAG_SUBSYS_FTM, ftm_iot_cmd_code, pkt_len);
|
||||
if (!rsp1){
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not allocate response packet for interface selection\n");
|
||||
free (new_iot_ftm_pkt);
|
||||
free (new_iot_ftm_rsp_pkt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(rsp1, iot_ftm_pkt, pkt_len);
|
||||
|
||||
DPRINTF(FTM_DBG_TRACE, "FTMd: The DUT interface selected is %d \n",interface);
|
||||
DPRINTF(FTM_DBG_TRACE, "FTMd: DUT interface resp packet of size %d bytes sent:\n",pkt_len);
|
||||
print_array((uint8_t *)rsp1, pkt_len);
|
||||
|
||||
free (new_iot_ftm_pkt);
|
||||
free (new_iot_ftm_rsp_pkt);
|
||||
|
||||
/*This resp pointer will be freed by diag later*/
|
||||
return rsp1;
|
||||
}
|
||||
|
||||
/*If the request packet is a MFG PROG command,
|
||||
launch flash script and return a response packet that indicates
|
||||
flashing mode of QCA402x is enabled or disabled */
|
||||
if ((ftm_iot_flash_cmd_code == MFG_CMD_ID_MISC_PROG_MODE)){
|
||||
|
||||
if (ftm_iot_dut_interface_code == MFG_FLASH_ON){
|
||||
strlcpy(command, "/usr/bin/qca402x_flash.sh flash on", sizeof(command));
|
||||
}
|
||||
|
||||
if (ftm_iot_dut_interface_code == MFG_FLASH_OFF){
|
||||
strlcpy(command, "/usr/bin/qca402x_flash.sh flash off", sizeof(command));
|
||||
}
|
||||
|
||||
if (ftm_iot_dut_interface_code == MFG_USB_OFF){
|
||||
strlcpy(command, "/usr/bin/qca402x_flash.sh usb-select off", sizeof(command));
|
||||
}
|
||||
|
||||
if (ftm_iot_dut_interface_code == MFG_USB_ON){
|
||||
strlcpy(command, "/usr/bin/qca402x_flash.sh usb-select on", sizeof(command));
|
||||
}
|
||||
|
||||
if (ftm_iot_dut_interface_code == MFG_EDL_OFF){
|
||||
strlcpy(command, "/usr/bin/qca402x_flash.sh edl off", sizeof(command));
|
||||
}
|
||||
|
||||
if (ftm_iot_dut_interface_code == MFG_EDL_ON){
|
||||
strlcpy(command, "/usr/bin/qca402x_flash.sh edl on", sizeof(command));
|
||||
}
|
||||
|
||||
/*Return with NULL if string is empty or packet length is less than
|
||||
10 for a DUT interface selection command to make sure there will be
|
||||
no out of bound access */
|
||||
if ( (command[0] == '\0') || (pkt_len <= DUT_INTERFACE_ID_POS) ) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Error: Invalid MFG Program command\n");
|
||||
free (new_iot_ftm_pkt);
|
||||
free (new_iot_ftm_rsp_pkt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
system(command);
|
||||
DPRINTF(FTM_DBG_TRACE, "\n FTMd: Sent system command: %s \n", command);
|
||||
|
||||
/* Check of size for packet pointed to by payload_ptr has been done above
|
||||
using pkt_len to make sure there is no out of bound access */
|
||||
|
||||
*(payload_ptr + DUT_INTERFACE_ID_POS) = MFG_PROG_RESP;
|
||||
|
||||
rsp1 = diagpkt_subsys_alloc(DIAG_SUBSYS_FTM, ftm_iot_cmd_code, pkt_len);
|
||||
if (!rsp1){
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not allocate response packet for MFG flash commands\n");
|
||||
free (new_iot_ftm_pkt);
|
||||
free (new_iot_ftm_rsp_pkt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(rsp1, payload_ptr, pkt_len);
|
||||
|
||||
DPRINTF(FTM_DBG_TRACE, "FTMd: MFG Flash resp packet of size %d bytes sent:\n",pkt_len);
|
||||
print_array((uint8_t *)rsp1, pkt_len);
|
||||
|
||||
free (new_iot_ftm_pkt);
|
||||
free (new_iot_ftm_rsp_pkt);
|
||||
|
||||
/*This resp pointer will be freed by diag later*/
|
||||
return rsp1;
|
||||
}
|
||||
|
||||
sem_wait(&iot_sem_async);
|
||||
/* Call IPQ-QCA402x diag APIs */
|
||||
ret = diag_send(hdl, interface, (uint8_t *)new_iot_ftm_pkt, new_pkt_len);
|
||||
if ((ret < 0) || (ret > MAX_BUF_SIZE)) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not send the request packet to QCA402x \n");
|
||||
free (new_iot_ftm_pkt);
|
||||
free (new_iot_ftm_rsp_pkt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = diag_recv(hdl, (uint8_t *)new_iot_ftm_rsp_pkt, MAX_BUF_SIZE, WAIT_TIME_MS);
|
||||
if ((ret < 0) || (ret > MAX_BUF_SIZE) || (ret <= diag_hdr_len)) {
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not recieve packet from QCA402x\n");
|
||||
free (new_iot_ftm_pkt);
|
||||
free (new_iot_ftm_rsp_pkt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
DPRINTF(FTM_DBG_TRACE,"Received Command Response of %d bytes\n",ret);
|
||||
print_array((uint8_t *)new_iot_ftm_rsp_pkt, ret);
|
||||
|
||||
rsp1 = diagpkt_subsys_alloc(DIAG_SUBSYS_FTM, ftm_iot_cmd_code, (ret - diag_hdr_len));
|
||||
if (!rsp1){
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not allocate response packet\n");
|
||||
free (new_iot_ftm_pkt);
|
||||
free (new_iot_ftm_rsp_pkt);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(rsp1, (new_iot_ftm_rsp_pkt + diag_hdr_len - NHDLC_TERM_SIZE), (ret - diag_hdr_len));
|
||||
|
||||
free (new_iot_ftm_pkt);
|
||||
free (new_iot_ftm_rsp_pkt);
|
||||
sem_post(&iot_sem);
|
||||
|
||||
/*This resp pointer will be freed by diag module later*/
|
||||
return (void *)rsp1;
|
||||
}
|
||||
#endif /* IPQ_AP_HOST_IOT_QCA402X */
|
||||
|
||||
#ifdef IPQ_AP_HOST_IOT_IPQ
|
||||
/*===========================================================================
|
||||
FUNCTION iot_thr_func_ipq
|
||||
|
||||
DESCRIPTION
|
||||
Continously polls IPQ BTSS for asynchronous data responses and
|
||||
logs received asynchronous data responses to Diag module using
|
||||
log-submit()
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
Returns NULL on failure. Function also exits with NULL return value
|
||||
when main indicates that this thread should be stopped
|
||||
|
||||
SIDE EFFECTS
|
||||
NONE
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
void *iot_thr_func_ipq(void *hdl)
|
||||
{
|
||||
int bytes_read = 0, handle = 0;
|
||||
void *buffer = NULL;
|
||||
void *rsp = NULL;
|
||||
struct timespec ts;
|
||||
ftm_bt_rsp_pkt_type *ftm_async_pkt;
|
||||
|
||||
buffer = malloc(MAX_BUF_SIZE);
|
||||
if (!buffer)
|
||||
{
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not allocate memory to the buffer \n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memset(buffer, MEMSET_RESET_VALUE, MAX_BUF_SIZE);
|
||||
|
||||
if(hdl == NULL || *((int*)hdl) < 0)
|
||||
{
|
||||
DPRINTF(FTM_DBG_ERROR, "\n Invalid Handle received from BTSS \n");
|
||||
free(buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
handle = *((int*)hdl);
|
||||
while(1)
|
||||
{
|
||||
if (thread_stop == 1) {
|
||||
DPRINTF(FTM_DBG_TRACE, "FTMd: Exiting thread.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
|
||||
{
|
||||
DPRINTF(FTM_DBG_ERROR, "clock_gettime");
|
||||
free(buffer);
|
||||
return NULL;
|
||||
}
|
||||
ts.tv_sec += user_sem_wait_timeout;
|
||||
sem_timedwait(&iot_sem, &ts);
|
||||
while((bytes_read = bt_daemon_receive(handle, &buffer)) > 0)
|
||||
{
|
||||
/*
|
||||
* Checking for log status on the packets received
|
||||
* ignore the received packets incase of disabled logging
|
||||
*/
|
||||
if(log_status(LOG_BT_HCI_EV_C))
|
||||
{
|
||||
rsp = log_alloc(LOG_BT_HCI_EV_C, (DIAG_HEADER_SIZE + bytes_read));
|
||||
if (!rsp)
|
||||
{
|
||||
DPRINTF(FTM_DBG_ERROR, "Could not allocate rsp packet \n");
|
||||
free(buffer);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ftm_async_pkt = (ftm_bt_rsp_pkt_type*)rsp;
|
||||
memcpy(ftm_async_pkt->buf, buffer, bytes_read);
|
||||
DPRINTF(FTM_DBG_TRACE, "\n Printing the Async Packet sent to QDART\n");
|
||||
print_array((uint8_t *)rsp, (DIAG_HEADER_SIZE + bytes_read));
|
||||
|
||||
log_submit(rsp);
|
||||
log_free(rsp);
|
||||
memset(buffer, MEMSET_RESET_VALUE, MAX_BUF_SIZE);
|
||||
}
|
||||
}
|
||||
sem_post(&iot_sem_async);
|
||||
}
|
||||
free(buffer);
|
||||
pthread_exit(NULL);
|
||||
}
|
||||
/*===========================================================================
|
||||
FUNCTION ftm_iot_dispatch_ipq
|
||||
|
||||
DESCRIPTION
|
||||
Function processes WIN IOT specific requests and relays to
|
||||
BTSS for further processing. Constructs response packet
|
||||
and returns buffer meant for callback.
|
||||
|
||||
DEPENDENCIES
|
||||
NIL
|
||||
|
||||
RETURN VALUE
|
||||
Returns back buffer that is meant for diag callback
|
||||
|
||||
SIDE EFFECTS
|
||||
NONE
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
void *ftm_iot_dispatch_ipq(void *iot_ftm_pkt, int pkt_len, int *hdl)
|
||||
{
|
||||
void *rsp = NULL;
|
||||
struct timespec ts;
|
||||
int bytes_sent = -1;
|
||||
|
||||
if(hdl == NULL || *hdl < 0)
|
||||
{
|
||||
DPRINTF(FTM_DBG_ERROR, "\n Invalid Handle received from BTSS \n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!iot_ftm_pkt)
|
||||
{
|
||||
DPRINTF(FTM_DBG_ERROR, "Invalid iot_ftm_pkt received \n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
|
||||
{
|
||||
perror("clock_gettime");
|
||||
return NULL;
|
||||
}
|
||||
ts.tv_sec += user_sem_wait_timeout;
|
||||
sem_timedwait(&iot_sem_async, &ts);
|
||||
|
||||
DPRINTF(FTM_DBG_TRACE, "\n Request Packet received for IPQ BT\n");
|
||||
print_array((uint8_t *)iot_ftm_pkt, pkt_len);
|
||||
|
||||
bytes_sent = bt_daemon_send(*hdl, iot_ftm_pkt);
|
||||
if(bytes_sent < 0)
|
||||
{
|
||||
perror("Unable to send Request Packet to IPQ BT");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Constructing ACK Packet */
|
||||
rsp = diagpkt_subsys_alloc(DIAG_SUBSYS_FTM, ftm_iot_cmd_code, pkt_len);
|
||||
if (!rsp)
|
||||
{
|
||||
DPRINTF(FTM_DBG_ERROR, "\n Unable to allocate diag response packet \n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(rsp, iot_ftm_pkt, pkt_len);
|
||||
|
||||
DPRINTF(FTM_DBG_TRACE, "\n ACK Packet constructed in FTM layer\n");
|
||||
print_array((uint8_t *)rsp, pkt_len);
|
||||
|
||||
sem_post(&iot_sem);
|
||||
|
||||
/*This rsp pointer will be freed by diag later */
|
||||
return rsp;
|
||||
}
|
||||
#endif /* IPQ50XX, IPQ95XX */
|
||||
|
||||
void *ftm_iot_dispatch(void *iot_ftm_pkt, int pkt_len, void *hdl)
|
||||
{
|
||||
void* retValue = NULL;
|
||||
#ifdef IPQ_AP_HOST_IOT_QCA402X
|
||||
retValue = ftm_iot_dispatch_qca402x(iot_ftm_pkt, pkt_len ,hdl);
|
||||
#endif
|
||||
#ifdef IPQ_AP_HOST_IOT_IPQ
|
||||
retValue = ftm_iot_dispatch_ipq(iot_ftm_pkt, pkt_len ,(int *)hdl);
|
||||
#endif /* IPQ50XX, IPQ95XX */
|
||||
return retValue;
|
||||
}
|
||||
|
||||
#endif /*ifdef IPQ_AP_HOST_IOT*/
|
||||
@@ -1,132 +0,0 @@
|
||||
/*
|
||||
*Copyright (c) 2018-2020, 2022 Qualcomm Technologies, Inc.
|
||||
*
|
||||
*All Rights Reserved.
|
||||
*Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
*/
|
||||
|
||||
/* IPQ-QCA402X specific file */
|
||||
#ifdef IPQ_AP_HOST_IOT
|
||||
|
||||
#include <semaphore.h>
|
||||
#include <time.h>
|
||||
#include "diagpkt.h"
|
||||
#include "log.h"
|
||||
|
||||
#define MFG_CMD_ID_BLE_HCI 4
|
||||
#define MFG_CMD_ID_I15P4_HMI 5
|
||||
#define MFG_CMD_ID_OTP_INVALID 256
|
||||
#define MFG_CMD_ID_OTP_SET_BITS 257
|
||||
#define MFG_CMD_ID_OTP_WRITE_BYTE 258
|
||||
#define MFG_CMD_ID_OTP_READ_BYTE 259
|
||||
#define MFG_CMD_ID_OTP_TLV_INIT 260
|
||||
#define MFG_CMD_ID_OTP_TLV_READ 261
|
||||
#define MFG_CMD_ID_OTP_TLV_WRITE 262
|
||||
#define MFG_CMD_ID_OTP_TLV_STATUS 263
|
||||
#define MFG_CMD_ID_OTP_TLV_DELETE 264
|
||||
|
||||
#define MFG_CMD_ID_RAWFLASH_INVALID 288
|
||||
#define MFG_CMD_ID_RAWFLASH_CLEAR_BITS 289
|
||||
#define MFG_CMD_ID_RAWFLASH_WRITE 290
|
||||
#define MFG_CMD_ID_RAWFLASH_READ 291
|
||||
#define MFG_CMD_ID_RAWFLASH_ERASE 292
|
||||
#define MFG_CMD_ID_RAWFLASH_DISABLE_MFG 293
|
||||
|
||||
#define MFG_CMD_ID_FS_INVALID 304
|
||||
#define MFG_CMD_ID_FS_READ 305
|
||||
#define MFG_CMD_ID_FS_WRITE 306
|
||||
#define MFG_CMD_ID_FS_DELETE 307
|
||||
#define MFG_CMD_ID_FS_LIST_SETUP 308
|
||||
#define MFG_CMD_ID_FS_LIST_NEXT 309
|
||||
#define MFG_CMD_ID_FS_MOUNT 310
|
||||
#define MFG_CMD_ID_FS_UNMOUNT 311
|
||||
|
||||
/* Add more MFG tool commands for QCA402x. These
|
||||
command are interpreted internally within QCA402x */
|
||||
#define MFG_CMD_ID_MISC_REBOOT 352
|
||||
#define MFG_CMD_ID_MISC_ADDR_READ 353
|
||||
#define MFG_CMD_ID_MISC_ADDR_WRITE 354
|
||||
#define MFG_CMD_ID_MISC_HWSS_DONE 355
|
||||
#define MFG_CMD_ID_MISC_XTAL_CAP_SET 356
|
||||
#define MFG_CMD_ID_MISC_PART_SZ_GET 357
|
||||
|
||||
/* Add MFG tool command to enable flashing of QCA402x
|
||||
by putting QCA402x in EDL mode and selecting USB mux
|
||||
select option to tie USB port 81 on IPQ402x to QCA402x */
|
||||
#define MFG_CMD_ID_MISC_PROG_MODE 358
|
||||
|
||||
/*Command to invalidate specified QCA402x Imageset */
|
||||
#define MFG_CMD_ID_MISC_FWUP 359
|
||||
/* Add MFG tool PROG_MODE subcommands to enable flashing
|
||||
of QCA402x on IPQ807x. Interpretation of sub-commands is as
|
||||
follows:
|
||||
|
||||
MFG_FLASH_ON - Put QCA402x into reset state, Put QCA402x in
|
||||
EDL mode and enable USB port to be tied to QCA402x
|
||||
|
||||
MFG_FLASH_OFF - Pull QCA402x out of EDL mode and Pull QCA402x
|
||||
out of reset
|
||||
|
||||
MFG_EDL_ON - Put QCA402x in EDL mode
|
||||
|
||||
MFG_FLASH_OFF - Pull QCA402x out of EDL mode
|
||||
|
||||
MFG_USB_ON - Enable USB port to be tied to QCA402x
|
||||
|
||||
MFG_USB_OFF - Enable USB port to be tied to IPQ807x
|
||||
|
||||
MFG_PROG_RESP - Expected response field
|
||||
*/
|
||||
|
||||
enum flash_state {
|
||||
MFG_PROG_RESP,
|
||||
MFG_FLASH_ON,
|
||||
MFG_FLASH_OFF,
|
||||
MFG_EDL_ON,
|
||||
MFG_EDL_OFF,
|
||||
MFG_USB_ON,
|
||||
MFG_USB_OFF
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8 start;
|
||||
uint8 version;
|
||||
uint16 length;
|
||||
} PACKED_STRUCT diag_nonhdlc_hdr_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
diag_nonhdlc_hdr_t hdr;
|
||||
byte payload[0];
|
||||
} PACKED_STRUCT ftm_iot_req_pkt_type;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
log_hdr_type hdr;
|
||||
byte buf[1];
|
||||
} PACKED_STRUCT ftm_bt_rsp_pkt_type;
|
||||
|
||||
/* Two semaphores are used to handle sequencing of requests, ack responses
|
||||
and multiple asynchronous data responses from QCA402x */
|
||||
|
||||
sem_t iot_sem;
|
||||
sem_t iot_sem_async;
|
||||
|
||||
int ftm_iot_cmd_code;
|
||||
int ftm_iot_dut_interface_code;
|
||||
int ftm_iot_reserved_code;
|
||||
int interface;
|
||||
int thread_stop;
|
||||
extern int user_sem_wait_timeout;
|
||||
|
||||
void *ftm_iot_dispatch(void *iot_ftm_pkt, int pkt_len, void *hdl);
|
||||
#ifdef IPQ_AP_HOST_IOT_QCA402X
|
||||
void *ftm_iot_dispatch_qca402x(void *iot_ftm_pkt, int pkt_len, void *hdl);
|
||||
void *iot_thr_func_qca402x(void *hdl);
|
||||
#endif
|
||||
#ifdef IPQ_AP_HOST_IOT_IPQ
|
||||
void *ftm_iot_dispatch_ipq(void *iot_ftm_pkt, int pkt_len, int *hdl);
|
||||
void *iot_thr_func_ipq(void *hdl);
|
||||
#endif /* IPQ50XX, IPQ95XX */
|
||||
#endif /*ifdef IPQ_AP_HOST_IOT*/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,108 +0,0 @@
|
||||
/*=========================================================================
|
||||
NFC FTM C File
|
||||
Description
|
||||
This file contains the definitions of the function used to check
|
||||
which chip is present on the device.
|
||||
|
||||
Copyright (c) 2013-2015 Qualcomm Technologies, Inc.
|
||||
All Rights Reserved.
|
||||
Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
|
||||
===========================================================================*/
|
||||
/*===========================================================================
|
||||
Edit History
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
===========================================================================*/
|
||||
|
||||
#include "ftm_nfc.h"
|
||||
|
||||
CHIP_TYPE chipType = UNDEFINED_CHIP_TYPE;
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION checkChip
|
||||
|
||||
DESCRIPTION
|
||||
Checks whether it can open the NQ Kernel, if not, it means
|
||||
the device has a QTI chip.
|
||||
|
||||
PARAMETERS
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
===========================================================================*/
|
||||
void checkChip( void )
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ret = ftm_nq_nfc_open( ); // can you open the NQ Kernel?
|
||||
|
||||
if( ret > 0 ) // yes
|
||||
{
|
||||
printf( "%s: NQ CHIP \n", __func__ );
|
||||
chipType = NQ_CHIP; // so it's an NQ Chip
|
||||
|
||||
ret = ftm_nq_nfc_close( ); // close the handle
|
||||
if( ret != 0 ) // not successful?
|
||||
{
|
||||
printf( "%s: Could not close the File Handle for NQ Chip \n", __func__ );
|
||||
chipType = CHIP_ERROR; // something is wrong
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf( "%s: QTI CHIP \n", __func__ );
|
||||
chipType = QTI_CHIP;
|
||||
}
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION ftm_nfc_dispatch
|
||||
|
||||
DESCRIPTION
|
||||
Dispatches QRCT commands and Chip Replies/Notifications/Data
|
||||
to the required FTM NFC Chip Handler
|
||||
|
||||
PARAMETERS
|
||||
ftm_nfc_pkt_type *nfc_ftm_pkt - FTM Packet
|
||||
uint16 pkt_len - FTM Packet Length
|
||||
|
||||
RETURN VALUE
|
||||
void *
|
||||
|
||||
===========================================================================*/
|
||||
void* ftm_nfc_dispatch( ftm_nfc_pkt_type *nfc_ftm_pkt, uint16 pkt_len )
|
||||
{
|
||||
ftm_nfc_pkt_type *reply = NULL;
|
||||
|
||||
if( UNDEFINED_CHIP_TYPE == chipType )
|
||||
{
|
||||
printf( "%s: Checking Chip Type \n", __func__ );
|
||||
checkChip( );
|
||||
}
|
||||
|
||||
switch( chipType )
|
||||
{
|
||||
case NQ_CHIP:
|
||||
if( nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id == FTM_NFC_REQ_CHIP_TYPE )
|
||||
reply = PrepareRsp( nfc_ftm_pkt );
|
||||
else
|
||||
reply = ftm_nfc_dispatch_nq( nfc_ftm_pkt, pkt_len );
|
||||
break;
|
||||
|
||||
case QTI_CHIP:
|
||||
if( nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id == FTM_NFC_REQ_CHIP_TYPE )
|
||||
reply = PrepareRsp( nfc_ftm_pkt );
|
||||
else
|
||||
reply = ftm_nfc_dispatch_qti( nfc_ftm_pkt, pkt_len );
|
||||
break;
|
||||
|
||||
default:
|
||||
printf( "%s: ERROR - THIS SHOULD HAVE NEVER BEEN REACHED, CHIP TYPE %d", __func__, chipType );
|
||||
break;
|
||||
}
|
||||
|
||||
return reply;
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
/*=========================================================================
|
||||
NFC FTM HEADER File
|
||||
Description
|
||||
This file contains the definitions of the function used to check
|
||||
which chip is present on the device.
|
||||
|
||||
Copyright (c) 2013-2016 Qualcomm Technologies, Inc.
|
||||
All Rights Reserved.
|
||||
Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
|
||||
===========================================================================*/
|
||||
|
||||
#ifndef _FTM_NFC
|
||||
#define _FTM_NFC
|
||||
|
||||
#include "ftm_nfcnq.h"
|
||||
|
||||
#define NFC_QCA1990 // Defnition to enable the NFC FTM inclusion
|
||||
|
||||
typedef enum _CHIP_TYPE{
|
||||
UNDEFINED_CHIP_TYPE = 0,
|
||||
QTI_CHIP = 1,
|
||||
NQ_CHIP = 2,
|
||||
CHIP_ERROR = 3,
|
||||
MAXIMUM_CHIP_TYPE = 4,
|
||||
} CHIP_TYPE;
|
||||
|
||||
extern CHIP_TYPE chipType;
|
||||
|
||||
void* ftm_nfc_dispatch(ftm_nfc_pkt_type *ftm_nfc_pkt, uint16 pkt_len);
|
||||
|
||||
void* ftm_nfc_dispatch_qti(ftm_nfc_pkt_type *ftm_nfc_pkt, uint16 pkt_len);
|
||||
|
||||
void ftm_nfc_dispatch_nq_fwdl();
|
||||
|
||||
void ftm_nfc_dispatch_nq_test(int argc, char **argv);
|
||||
#endif // _FTM_NFC
|
||||
@@ -1,807 +0,0 @@
|
||||
/*=========================================================================
|
||||
NQ NFC FTM C File
|
||||
Description
|
||||
This file contains the definitions of the functions
|
||||
used to communicate with the NQ Chip.
|
||||
|
||||
Copyright (c) 2015-2016 Qualcomm Technologies, Inc.
|
||||
All Rights Reserved.
|
||||
Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
|
||||
===========================================================================*/
|
||||
/*===========================================================================
|
||||
Edit History
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
===========================================================================*/
|
||||
|
||||
#include "ftm_nfcnq.h"
|
||||
#include "ftm_nfc.h"
|
||||
#include "ftm_nfcnq_fwdl.h"
|
||||
|
||||
/* Global variables */
|
||||
pthread_t clientThread;
|
||||
PNCI_MESSAGE pNCIMessage;
|
||||
sem_t sRspReady;
|
||||
int fdNfc = 0;
|
||||
uint8_t nciReplyMessage[ 255 ] = { 0 };
|
||||
NQ_CHIP_TYPE whatNQChip = UNKNOWN_NQ_CHIP_TYPE;
|
||||
uint8_t RFdeactivateCmd[ ] = { 0x21, 0x06, 0x01, 0x03};
|
||||
uint8_t EseDataRsp[ ] = { 0x03, 0x00, 0x21, 0x99, 0x50, 0xFE};
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION ftm_nq_nfc_close
|
||||
|
||||
DESCRIPTION
|
||||
Close the kernel driver for the NQ Chip
|
||||
|
||||
PARAMETERS
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
int
|
||||
|
||||
===========================================================================*/
|
||||
int ftm_nq_nfc_close( void )
|
||||
{
|
||||
fdNfc = close( fdNfc ); // close the file descriptor
|
||||
|
||||
LOG_MESSAGE( "%s : Exit with fdNfc = %d \n", __func__, fdNfc );
|
||||
|
||||
return fdNfc; // return the result
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION ftm_nq_nfc_open
|
||||
|
||||
DESCRIPTION
|
||||
Open the kernel driver for the NQ Chip
|
||||
|
||||
PARAMETERS
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
int
|
||||
|
||||
===========================================================================*/
|
||||
int ftm_nq_nfc_open( void )
|
||||
{
|
||||
fdNfc = open( "/dev/nq-nci", // try to open /dev/nq-nci
|
||||
O_RDWR );
|
||||
|
||||
LOG_MESSAGE( "%s : Exit with fdNfc = %d \n", __func__, fdNfc );
|
||||
|
||||
return fdNfc; // return the result
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION ftm_nfc_hw_reset
|
||||
|
||||
DESCRIPTION
|
||||
Resets the NQ Chip
|
||||
|
||||
PARAMETERS
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
int
|
||||
|
||||
===========================================================================*/
|
||||
int ftm_nfc_hw_reset( void )
|
||||
{
|
||||
|
||||
int ret = -1; // return value
|
||||
|
||||
do
|
||||
{
|
||||
if( fdNfc < 0 ) // fdNfc valid?
|
||||
break;
|
||||
|
||||
ret = ioctl( fdNfc, NFC_SET_PWR, POWER_ON ); // turn the chip on
|
||||
if( ret != 0 ) // successful?
|
||||
{
|
||||
LOG_ERROR( "%s ioctl( fdNfc, NFC_SET_PWR, POWER_ON ) returned %d", __func__, ret );
|
||||
ret = -2;
|
||||
break;
|
||||
}
|
||||
usleep( 1000 ); // wait
|
||||
|
||||
ret = ioctl( fdNfc, NFC_SET_PWR, POWER_OFF ); // turn the chip off
|
||||
if( ret != 0 ) // successful?
|
||||
{
|
||||
LOG_ERROR( "%s ioctl( fdNfc, NFC_SET_PWR, POWER_OFF ) returned %d", __func__, ret );
|
||||
ret = -3;
|
||||
break;
|
||||
}
|
||||
usleep( 1000 ); // wait
|
||||
|
||||
ret = ioctl( fdNfc, NFC_SET_PWR, POWER_ON ); // turn the chip back on
|
||||
if( ret != 0 ) // successful?
|
||||
{
|
||||
LOG_ERROR( "%s ioctl( fdNfc, NFC_SET_PWR, POWER_ON ) returned %d", __func__, ret );
|
||||
ret = -4;
|
||||
break;
|
||||
}
|
||||
|
||||
}while( 0 );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION PrintBytes
|
||||
|
||||
DESCRIPTION
|
||||
Print bytes from an array
|
||||
|
||||
PARAMETERS
|
||||
uint8_t *buf - Byte array to print
|
||||
uint8_t len - Length of the array
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
===========================================================================*/
|
||||
void PrintBytes( uint8_t *buf, uint8_t len)
|
||||
{
|
||||
#ifdef NFC_FTM_DEBUG
|
||||
int idx;
|
||||
|
||||
LOG_INFORMATION( "%s: Length: %d bytes \n", __func__, len ); // print the number of bytes
|
||||
for( idx = 0; idx < len; idx++ ) // print every byte
|
||||
{
|
||||
LOG_INFORMATION( "%02x ", buf[idx] );
|
||||
}
|
||||
LOG_INFORMATION( "\n" );
|
||||
#else
|
||||
UNUSED_PARAMETER( buf );
|
||||
UNUSED_PARAMETER( len );
|
||||
#endif
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION ftm_nfc_send
|
||||
|
||||
DESCRIPTION
|
||||
Sends a message to the chip
|
||||
|
||||
PARAMETERS
|
||||
uint8_t *buf - buffer to be sent
|
||||
int len - the length of the buffer
|
||||
|
||||
RETURN VALUE
|
||||
int ret - Status
|
||||
|
||||
===========================================================================*/
|
||||
int ftm_nfc_send( uint8_t* buf )
|
||||
{
|
||||
int ret = -1; // return value
|
||||
int retries = 15; // number of retries
|
||||
int i;
|
||||
uint16_t nciSendMessageLength;
|
||||
PNCI_MESSAGE pMessageToSend = ( PNCI_MESSAGE ) buf;
|
||||
pfirmware_download_packet_t pFirmwarePacketsToSend =
|
||||
( pfirmware_download_packet_t ) buf;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
if( fdNfc < 0 ) // fdNfc valid?
|
||||
break;
|
||||
|
||||
if( NULL == buf ) // is the buffer valid?
|
||||
{
|
||||
ret = -2;
|
||||
LOG_ERROR( "%s: buf == NULL Invalid Buffer", __func__ );
|
||||
break;
|
||||
}
|
||||
|
||||
if( ( pFirmwarePacketsToSend->fFragmentedPacket == FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_NONE ) ||
|
||||
( pFirmwarePacketsToSend->fFragmentedPacket == FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_SET ) )
|
||||
nciSendMessageLength = pFirmwarePacketsToSend->payloadLen +
|
||||
FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN +
|
||||
FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN;
|
||||
else
|
||||
nciSendMessageLength = pMessageToSend->len + offsetof( NCI_MESSAGE, buf );
|
||||
|
||||
PrintBytes( buf, nciSendMessageLength );
|
||||
|
||||
do
|
||||
{
|
||||
retries--; // retries left
|
||||
ret = write( fdNfc,
|
||||
buf,
|
||||
nciSendMessageLength ); // try to write
|
||||
|
||||
if( ret < nciSendMessageLength ) // did you write the length?
|
||||
{
|
||||
LOG_MESSAGE( "%s: %d = write( fdNfc, buf, nciSendMessageLength ), errno = %d, tries left = %d \n", __func__, ret, errno, retries );
|
||||
continue; // try again
|
||||
}
|
||||
else
|
||||
break; // done
|
||||
|
||||
} while( retries > 0 );
|
||||
} while( 0 );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION ProcessCommand
|
||||
|
||||
DESCRIPTION
|
||||
Processes a Command for the NQ Chip
|
||||
|
||||
PARAMETERS
|
||||
uint8_t *nci_data - NCI Data to send
|
||||
|
||||
RETURN VALUE
|
||||
int ret - 0 if successfully received a reply
|
||||
|
||||
===========================================================================*/
|
||||
int ProcessCommand( uint8_t *nci_data )
|
||||
{
|
||||
int ret = -1; // return value
|
||||
struct timespec time_sec;
|
||||
|
||||
do
|
||||
{
|
||||
LOG_MESSAGE( "%s: FTM_NFC_SEND_DATA \n", __func__ );
|
||||
|
||||
ret = ftm_nfc_send( nci_data ); // send the message
|
||||
|
||||
LOG_MESSAGE( "%s: Wait for response \n", __func__ );
|
||||
|
||||
ret = clock_gettime( CLOCK_REALTIME, &time_sec );
|
||||
|
||||
if( ret == -1 )
|
||||
{ // didn't get the time?
|
||||
LOG_ERROR( "%s: clock_gettime for nci_data error \n", __func__ );
|
||||
break;
|
||||
}
|
||||
|
||||
time_sec.tv_sec += FTM_NFC_CMD_CMPL_TIMEOUT; // maximum wait
|
||||
ret = sem_timedwait( &sRspReady, // start waiting
|
||||
&time_sec );
|
||||
|
||||
if( ret == -1 ) // wait finished, not signalled?
|
||||
{
|
||||
if(!ese_dwp_test)
|
||||
LOG_ERROR( "%s: nfc ftm command timed out \n", __func__ );
|
||||
break;
|
||||
}
|
||||
} while( 0 );
|
||||
|
||||
return ret;
|
||||
}
|
||||
/*=========================================================================
|
||||
FUNCTION ftm_nfc_read
|
||||
|
||||
DESCRIPTION
|
||||
Reads a message from the chip
|
||||
|
||||
PARAMETERS
|
||||
int len - the length of the buffer
|
||||
|
||||
RETURN VALUE
|
||||
int ret - Number of bytes read
|
||||
|
||||
===========================================================================*/
|
||||
int ftm_nfc_read( uint8_t* buf, int len )
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
do
|
||||
{
|
||||
if( fdNfc < 0 ) // fdNfc valid?
|
||||
break;
|
||||
|
||||
ret = read( fdNfc, buf, len ); // try to read
|
||||
|
||||
} while( 0 );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*==========================================================================
|
||||
FUNCTION
|
||||
CommitLog
|
||||
|
||||
DESCRIPTION
|
||||
This commits the log to Diag
|
||||
|
||||
PARAMETERS
|
||||
NCI_MESSAGE pReadNCIMessage - Pointer to the read NCI Message
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
==========================================================================*/
|
||||
void CommitLog( PNCI_MESSAGE pReadNCIMessage )
|
||||
{
|
||||
pftm_nfc_log_pkt_type pLogBuff;
|
||||
|
||||
do
|
||||
{
|
||||
pLogBuff = ( ftm_nfc_log_pkt_type * ) log_alloc( LOG_NFC_FTM, // allocate a buffer for the log
|
||||
pReadNCIMessage->len + offsetof( NCI_MESSAGE, buf ) + LOG_HEADER_LENGTH );
|
||||
if( NULL == pLogBuff )
|
||||
{
|
||||
LOG_ERROR( "%s: log_alloc returned NULL \n", __func__ );
|
||||
break;
|
||||
}
|
||||
|
||||
memcpy( pLogBuff->data, // fill the buffer
|
||||
pReadNCIMessage,
|
||||
pReadNCIMessage->len + offsetof( NCI_MESSAGE, buf ) );
|
||||
|
||||
log_commit( pLogBuff ); // commit the log
|
||||
} while ( 0 );
|
||||
|
||||
}
|
||||
|
||||
/*=============================================================================
|
||||
FUNCTION
|
||||
ProcessReturnedMessage
|
||||
|
||||
DESCRIPTION
|
||||
Routine that processes an NCI Message that was returned and
|
||||
will decide if the message is a notification or a response.
|
||||
|
||||
PARAMETERS
|
||||
PNCI_MESSAGE pReadNCIMessage - Pointer to the read message
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
==============================================================================*/
|
||||
void ProcessReturnedMessage( PNCI_MESSAGE pReadNCIMessage )
|
||||
{
|
||||
|
||||
switch( pReadNCIMessage->gid & NCIMT_NTF ) // check the first byte
|
||||
{
|
||||
case NCIMT_RSP: // reply?
|
||||
sem_post( &sRspReady ); // notify the dispatch function
|
||||
break;
|
||||
|
||||
case NCIMT_NTF: // notification?
|
||||
if (pReadNCIMessage->oid == 0x05)
|
||||
{
|
||||
LOG_INFORMATION("\n << ...TAG DETECTED... >> \n");
|
||||
printTecnologyDetails(pReadNCIMessage->buf[3],pReadNCIMessage->buf[2]);
|
||||
sem_post( &sRfNtf );
|
||||
ProcessCommand( RFdeactivateCmd );
|
||||
}
|
||||
case NCIMT_DATA: // data?
|
||||
if (ese_dwp_test)
|
||||
{
|
||||
if( memcmp( EseDataRsp, nciReplyMessage, sizeof( EseDataRsp ) ) == 0 )
|
||||
{
|
||||
LOG_INFORMATION("\n << ESE detected over DWP >> \n\n");
|
||||
}
|
||||
}
|
||||
if( log_status( LOG_NFC_FTM ) ) // logging enabled?
|
||||
{
|
||||
CommitLog( pReadNCIMessage );
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
LOG_ERROR( "%s: ERROR - SHOULD NOT HAVE REACHED THIS POINT", __func__ );
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION nfc_read_thread
|
||||
|
||||
DESCRIPTION
|
||||
Thread that constantly looks for messages from the chip
|
||||
|
||||
PARAMETERS
|
||||
void
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
===========================================================================*/
|
||||
void *nfc_read_thread( void *arg )
|
||||
{
|
||||
uint8_t readLength = 0;
|
||||
int i;
|
||||
uint8_t readNCIUpToLength = offsetof( NCI_MESSAGE, buf );
|
||||
|
||||
UNUSED_PARAMETER( arg );
|
||||
|
||||
for( ; ; ) // keep reading
|
||||
{
|
||||
readLength = ftm_nfc_read( nciReplyMessage, readNCIUpToLength ); // read the first 3 bytes
|
||||
|
||||
if( readLength == readNCIUpToLength ) // read the message up to NCI Len?
|
||||
{
|
||||
readLength = ftm_nfc_read( pNCIMessage->buf, // go and get the rest
|
||||
pNCIMessage->len );
|
||||
|
||||
if( readLength == pNCIMessage->len ) // successful?
|
||||
{
|
||||
PrintBytes( nciReplyMessage, pNCIMessage->len + readNCIUpToLength );
|
||||
|
||||
ProcessReturnedMessage( pNCIMessage ); // Process the read message
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*==========================================================================
|
||||
FUNCTION PrepareRsp
|
||||
|
||||
DESCRIPTION
|
||||
Routine to prepare a response for diag.
|
||||
|
||||
PARAMETERS
|
||||
ftm_nfc_pkt_type *nfc_ftm_pkt - FTM Packet
|
||||
|
||||
RETURN VALUE
|
||||
void *
|
||||
==========================================================================*/
|
||||
void *PrepareRsp( ftm_nfc_pkt_type *nfc_ftm_pkt )
|
||||
{
|
||||
void *response = NULL;
|
||||
switch( nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id )
|
||||
{
|
||||
case FTM_NFC_NFCC_COMMAND:
|
||||
{
|
||||
ftm_nfc_pkt_type *nfc_nci_rsp = ( ftm_nfc_pkt_type* ) diagpkt_subsys_alloc( DIAG_SUBSYS_FTM,
|
||||
FTM_NFC_CMD_CODE,
|
||||
sizeof( ftm_nfc_pkt_type ) ); // get a Response Buffer for NFCC Command
|
||||
|
||||
if( NULL == nfc_nci_rsp )
|
||||
{
|
||||
LOG_ERROR( "%s: diagpkt_subsys_alloc( DIAG_SUBSYS_FTM, FTM_NFC_CMD_CODE, sizeof( ftm_nfc_pkt_type ) ) returned NULL \n", __func__ );
|
||||
}
|
||||
else
|
||||
{
|
||||
nfc_nci_rsp->ftm_nfc_hdr.nfc_cmd_id = FTM_NFC_NFCC_COMMAND;
|
||||
nfc_nci_rsp->ftm_nfc_hdr.nfc_cmd_len = offsetof( ftm_nfc_cmd_header, nfc_cmd_len ) + offsetof( NCI_MESSAGE, buf ) + pNCIMessage->len ;
|
||||
nfc_nci_rsp->nfc_nci_pkt_len = offsetof( NCI_MESSAGE, buf ) + pNCIMessage->len;
|
||||
|
||||
memcpy( nfc_nci_rsp->nci_data,
|
||||
pNCIMessage,
|
||||
nfc_nci_rsp->nfc_nci_pkt_len );
|
||||
|
||||
response = ( void* ) nfc_nci_rsp;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case FTM_NFC_REQ_CHIP_TYPE:
|
||||
{
|
||||
// change from a NCI packet type to a request chip type packet type
|
||||
ftm_nfc_chip_type_pkt_type *nfc_chip_type_rsp = ( ftm_nfc_chip_type_pkt_type* ) diagpkt_subsys_alloc( DIAG_SUBSYS_FTM,
|
||||
FTM_NFC_CMD_CODE,
|
||||
sizeof( ftm_nfc_chip_type_pkt_type ) ); // get a Response Buffer for Request Chip Type Command
|
||||
if( NULL == nfc_chip_type_rsp )
|
||||
{
|
||||
LOG_ERROR( "%s: diagpkt_subsys_alloc( DIAG_SUBSYS_FTM, FTM_NFC_CMD_CODE, sizeof( ftm_nfc_chip_type_pkt_type ) ) returned NULL \n", __func__ );
|
||||
}
|
||||
else
|
||||
{
|
||||
nfc_chip_type_rsp->nfc_chip_type_cmd_id = FTM_NFC_REQ_CHIP_TYPE;
|
||||
nfc_chip_type_rsp->nfc_chip_type_pkt_len = 1; // only 1 byte for response packet data
|
||||
if( chipType == 1 ) // 1 for QTI, 2 for NQ
|
||||
nfc_chip_type_rsp->nfc_chip_type_pkt_data = FTM_NFC_QTI_CHIP;
|
||||
else
|
||||
nfc_chip_type_rsp->nfc_chip_type_pkt_data = FTM_NFC_NQ_CHIP;
|
||||
|
||||
response = ( void* ) nfc_chip_type_rsp;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case FTM_NFC_FWPIN_CTRL:
|
||||
{
|
||||
// change from a NCI packet type to a firmware download packet type
|
||||
ftm_nfc_fwdl_pkt_type *nfc_fwdl_rsp = ( ftm_nfc_fwdl_pkt_type* ) diagpkt_subsys_alloc( DIAG_SUBSYS_FTM,
|
||||
FTM_NFC_CMD_CODE,
|
||||
sizeof( ftm_nfc_fwdl_pkt_type ) ); // get a Response Buffer for Firmware Download Pin Command
|
||||
if( NULL == nfc_fwdl_rsp )
|
||||
{
|
||||
LOG_ERROR( "%s: diagpkt_subsys_alloc( DIAG_SUBSYS_FTM, FTM_NFC_CMD_CODE, sizeof( ftm_nfc_fwdl_pkt_type ) ) returned NULL \n", __func__ );
|
||||
}
|
||||
else
|
||||
{
|
||||
nfc_fwdl_rsp->nfc_fwdl_cmd_id = FTM_NFC_FWPIN_CTRL;
|
||||
nfc_fwdl_rsp->nfc_fwdl_pkt_len = 1; // only 1 byte for response packet data
|
||||
nfc_fwdl_rsp->nfc_fwdl_pkt_data = FTM_NFC_FWDL_SUCCESS; // 0 for fail, 1 for success
|
||||
|
||||
response = ( void* ) nfc_fwdl_rsp;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default :
|
||||
|
||||
LOG_ERROR( "%s: ERROR - SHOULD NOT HAVE ENDED UP HERE: default case \n", __func__ );
|
||||
break;
|
||||
}
|
||||
|
||||
return response;
|
||||
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION ftm_nfc_nq_vs_nxp
|
||||
|
||||
DESCRIPTION
|
||||
Check whether the chip is an NQ Chip
|
||||
|
||||
PARAMETERS
|
||||
None
|
||||
|
||||
RETURN VALUE
|
||||
int
|
||||
|
||||
===========================================================================*/
|
||||
int ftm_nfc_nq_vs_nxp( void )
|
||||
{
|
||||
int ret = 0;
|
||||
uint8_t coreResetCmd[ ] = { 0x20, 0x00, 0x01, 0x00 };
|
||||
uint8_t coreResetRsp[ ] = { 0x40, 0x00, 0x03, 0x00, 0x11, 0x00 };
|
||||
uint8_t coreInitCmd[ ] = { 0x20, 0x01, 0x00 };
|
||||
|
||||
do
|
||||
{
|
||||
ret = ProcessCommand( coreResetCmd ); // send a Core Reset CMD
|
||||
|
||||
if( ret == -1 ) // wait finished, not signalled?
|
||||
{
|
||||
LOG_ERROR( "%s: ProcessCommand( coreResetCmd ) error %d \n", __func__, ret );
|
||||
break;
|
||||
}
|
||||
|
||||
if( memcmp( coreResetRsp, nciReplyMessage, sizeof( coreResetRsp ) ) )
|
||||
{ // not a good reply?
|
||||
coreResetRsp[4] = 0x10;
|
||||
if( memcmp( coreResetRsp, nciReplyMessage, sizeof( coreResetRsp ) ) )
|
||||
{ // check if NCI version is 1.0
|
||||
ret = -1;
|
||||
LOG_ERROR( "%s: bad reply for coreResetRsp", __func__ );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ret = ProcessCommand( coreInitCmd ); // send the message
|
||||
|
||||
if( ret == -1 ) // wait finished, not signalled?
|
||||
{
|
||||
LOG_ERROR( "%s: ProcessCommand( coreInitCmd ) error %d \n", __func__, ret );
|
||||
break;
|
||||
}
|
||||
|
||||
switch( nciReplyMessage[ CHIP_ID ] ) // what type of chip is it?
|
||||
{
|
||||
case 0x48:
|
||||
whatNQChip = NQ_210;
|
||||
LOG_INFORMATION( "Connected to NQ210 \n" );
|
||||
break;
|
||||
|
||||
case 0x58:
|
||||
whatNQChip = NQ_220;
|
||||
LOG_INFORMATION( "Connected to NQ220 \n" );
|
||||
break;
|
||||
|
||||
case 0x40:
|
||||
case 0x41:
|
||||
whatNQChip = NQ_310;
|
||||
LOG_INFORMATION( "Connected to NQ310 \n" );
|
||||
break;
|
||||
|
||||
case 0x50:
|
||||
case 0x51:
|
||||
whatNQChip = NQ_330;
|
||||
LOG_INFORMATION( "Connected to NQ330 \n" );
|
||||
break;
|
||||
|
||||
default:
|
||||
whatNQChip = UNKNOWN_NQ_CHIP_TYPE;
|
||||
ret = -1;
|
||||
LOG_INFORMATION( "ERROR Connected to an unknown NQ Chip \n" );
|
||||
break;
|
||||
}
|
||||
}while( 0 );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION ftm_nfc_set_fwdl_pin
|
||||
|
||||
DESCRIPTION
|
||||
Sets or resets the firmware download pin high or low
|
||||
|
||||
PARAMETERS
|
||||
ftm_nfc_pkt_type *nfc_ftm_pkt - FTM Packet
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
===========================================================================*/
|
||||
void ftm_nfc_set_fwdl_pin( ftm_nfc_pkt_type *nfc_ftm_pkt )
|
||||
{
|
||||
int ret = 0;
|
||||
// change from a NCI packet type to a firmware download packet type
|
||||
pftm_nfc_fwdl_pkt_type pnfc_fwdl_pkt = ( pftm_nfc_fwdl_pkt_type ) nfc_ftm_pkt;
|
||||
|
||||
switch ( pnfc_fwdl_pkt->nfc_fwdl_pkt_data )
|
||||
{
|
||||
case 0:
|
||||
|
||||
ret = ftm_nfc_hw_reset( ); // Can you reset the hardware?
|
||||
if( ret < 0 ) // successful?
|
||||
{
|
||||
LOG_ERROR( "%s: ftm_nfc_hw_reset() failed with ret = %d \n", __func__, ret );
|
||||
break;
|
||||
}
|
||||
|
||||
LOG_MESSAGE( "%s: Firmware download pin set LOW\n", __func__ );
|
||||
break;
|
||||
|
||||
|
||||
case 1:
|
||||
|
||||
ret = ioctl( fdNfc, NFC_SET_PWR, FIRMWARE_MODE );
|
||||
if( ret != 0 ) // successful?
|
||||
{
|
||||
LOG_ERROR( "%s ioctl( fdNfc, NFC_SET_PWR, FIRMWARE_MODE ) returned %d", __func__, ret );
|
||||
break;
|
||||
}
|
||||
|
||||
LOG_MESSAGE( "%s: Firmware download pin set HIGH\n", __func__ );
|
||||
break;
|
||||
|
||||
default :
|
||||
|
||||
LOG_ERROR( "%s: ERROR - SHOULD NOT HAVE ENDED UP HERE: default case \n", __func__ );
|
||||
break;
|
||||
}
|
||||
|
||||
ret = ftm_nq_nfc_close( ); // close the handle
|
||||
if( ret != 0 ) // not successful?
|
||||
{
|
||||
LOG_ERROR( "\n\t %s: ftm_nq_nfc_close() failed with ret = %d \n", __func__, ret );
|
||||
}
|
||||
|
||||
ret = ftm_nq_nfc_open( ); // open the kernel driver
|
||||
if( ret < 0 ) // successful?
|
||||
{
|
||||
LOG_ERROR( "\n\t %s: ftm_nq_nfc_open() failed with ret = %d \n", __func__, ret );
|
||||
}
|
||||
}
|
||||
|
||||
/*=========================================================================
|
||||
FUNCTION ftm_nfc_dispatch_nq
|
||||
|
||||
DESCRIPTION
|
||||
Dispatches QRCT commands and Chip Replies/Notifications/Data
|
||||
|
||||
PARAMETERS
|
||||
ftm_nfc_pkt_type *nfc_ftm_pkt - FTM Packet
|
||||
uint16 pkt_len - FTM Packet Length
|
||||
|
||||
RETURN VALUE
|
||||
void *
|
||||
|
||||
===========================================================================*/
|
||||
void* ftm_nfc_dispatch_nq( ftm_nfc_pkt_type *nfc_ftm_pkt, uint16 pkt_len )
|
||||
{
|
||||
int ret = 0;
|
||||
int len = 0;
|
||||
struct timespec time_sec;
|
||||
char *SkipNQHardwareCheck = NULL;
|
||||
|
||||
void *rsp = NULL;
|
||||
UNUSED_PARAMETER( pkt_len );
|
||||
|
||||
do
|
||||
{
|
||||
if( !fdNfc ) // Already initialized?
|
||||
{
|
||||
ret = ftm_nq_nfc_open( ); // open the kernel driver
|
||||
if( ret < 0 ) // successful?
|
||||
{
|
||||
LOG_ERROR( "\n\t %s: ftm_nq_nfc_open() failed with ret = %d \n", __func__, ret );
|
||||
break;
|
||||
}
|
||||
|
||||
ret = ftm_nfc_hw_reset( ); // Can you reset the hardware?
|
||||
if( ret < 0 ) // successful?
|
||||
{
|
||||
LOG_ERROR( "%s: ftm_nfc_hw_reset() failed with ret = %d \n", __func__, ret );
|
||||
break;
|
||||
}
|
||||
|
||||
pNCIMessage = ( PNCI_MESSAGE ) nciReplyMessage;
|
||||
|
||||
ret = pthread_create( &clientThread, // Start the Read Thread
|
||||
NULL,
|
||||
&nfc_read_thread,
|
||||
NULL );
|
||||
if( ret != 0 ) // successful?
|
||||
{
|
||||
LOG_MESSAGE( "%s: pthread_create( nfc_read_thread ) failed with ret = %d \n", __func__, ret );
|
||||
break;
|
||||
}
|
||||
|
||||
SkipNQHardwareCheck = getenv( SKIP_NQ_HARDWARE_CHECK );
|
||||
LOG_MESSAGE( "%s: SkipNQHardwareCheck = %s \n", __func__, SkipNQHardwareCheck );
|
||||
|
||||
if( NULL == SkipNQHardwareCheck ) // no value so check for NQ Chip?
|
||||
{
|
||||
ret = ftm_nfc_nq_vs_nxp( );
|
||||
if( ret < 0 ) // Not an NQ Chip?
|
||||
{
|
||||
LOG_ERROR( "ERROR NOT A KNOWN NQ Chip \n" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_INFORMATION( " Skipping NQ Chip Check \n" );
|
||||
whatNQChip = SKIP_CHIP_CHECK;
|
||||
}
|
||||
|
||||
LOG_INFORMATION( "FTM for NFC SUCCESSFULLY STARTED \n" );
|
||||
}
|
||||
|
||||
if( UNKNOWN_NQ_CHIP_TYPE == whatNQChip )
|
||||
{
|
||||
LOG_ERROR( "ERROR This version of the chip is not accepted" );
|
||||
break;
|
||||
}
|
||||
|
||||
if( NULL == nfc_ftm_pkt ) // valid packet?
|
||||
{
|
||||
LOG_ERROR( "%s: Error : nfc_ftm_pkt is NULL \n", __func__ );
|
||||
break;
|
||||
}
|
||||
|
||||
if( offsetof( ftm_nfc_pkt_type, ftm_nfc_hdr ) < MIN_CMD_PKT_LEN )
|
||||
{ // packet contains anything?
|
||||
LOG_ERROR( "%s: Error : Invalid FTM Packet \n", __func__ );
|
||||
break;
|
||||
}
|
||||
|
||||
switch( nfc_ftm_pkt->ftm_nfc_hdr.nfc_cmd_id ) // what type of packet is it?
|
||||
{
|
||||
|
||||
case FTM_NFC_NFCC_COMMAND: // NFC Command?
|
||||
case FTM_NFC_SEND_DATA: // NFC Data?
|
||||
|
||||
ret = ProcessCommand( nfc_ftm_pkt->nci_data );
|
||||
if( ret == -1 ) // wait finished, not signalled?
|
||||
{
|
||||
LOG_ERROR( "%s: ProcessCommand( nfc_ftm_pkt->nci_data ) error %d \n", __func__, ret );
|
||||
break;
|
||||
}
|
||||
rsp = PrepareRsp( nfc_ftm_pkt ); // Prepare the response for Diag
|
||||
|
||||
break;
|
||||
|
||||
case FTM_NFC_REQ_CHIP_TYPE:
|
||||
case FTM_NFC_FWPIN_CTRL:
|
||||
|
||||
ftm_nfc_set_fwdl_pin( nfc_ftm_pkt );
|
||||
|
||||
rsp = PrepareRsp( nfc_ftm_pkt ); // Prepare the response for Diag
|
||||
break;
|
||||
|
||||
default :
|
||||
LOG_ERROR( "%s: ERROR - SHOULD NOT HAVE ENDED UP HERE: default case \n", __func__ );
|
||||
break;
|
||||
|
||||
}
|
||||
} while( 0 );
|
||||
|
||||
return rsp;
|
||||
}
|
||||
@@ -1,168 +0,0 @@
|
||||
/*=========================================================================
|
||||
NQ NFC FTM Header File
|
||||
Description
|
||||
This file contains the declarations of the functions
|
||||
used to communicate with the NQ Chip and various definitions.
|
||||
|
||||
Copyright (c) 2015-2017 Qualcomm Technologies, Inc.
|
||||
All Rights Reserved.
|
||||
Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
|
||||
===========================================================================*/
|
||||
/*===========================================================================
|
||||
Edit History
|
||||
when who what, where, why
|
||||
-------- --- ----------------------------------------------------------
|
||||
===========================================================================*/
|
||||
|
||||
#ifndef _FTM_NFCNQ
|
||||
#define _FTM_NFCNQ
|
||||
|
||||
#include "msg.h"
|
||||
#include "diagpkt.h"
|
||||
#include "diagcmd.h"
|
||||
#include "errno.h"
|
||||
#include <linux/ioctl.h>
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "log.h"
|
||||
|
||||
#define LOG_ERROR( ... ) printf( __VA_ARGS__ )
|
||||
#define LOG_INFORMATION( ... ) printf( __VA_ARGS__ )
|
||||
|
||||
#ifdef NFC_FTM_DEBUG
|
||||
#define LOG_MESSAGE( ... ) printf( __VA_ARGS__ )
|
||||
#else
|
||||
#define LOG_MESSAGE( ... ) do{ } while ( FALSE )
|
||||
#endif
|
||||
|
||||
typedef PACKED struct _ftm_nfc_cmd_header{
|
||||
uint16 nfc_cmd_id;
|
||||
uint16 nfc_cmd_len;
|
||||
} ftm_nfc_cmd_header, *pftm_nfc_cmd_header;
|
||||
|
||||
typedef PACKED struct{
|
||||
diagpkt_subsys_header_type diag_hdr;
|
||||
ftm_nfc_cmd_header ftm_nfc_hdr;
|
||||
uint16 nfc_nci_pkt_len;
|
||||
byte nci_data[258];
|
||||
}ftm_nfc_pkt_type, *pftm_nfc_pkt_type;
|
||||
|
||||
typedef PACKED struct{
|
||||
diagpkt_subsys_header_type diag_hdr;
|
||||
uint16 nfc_fwdl_cmd_id;
|
||||
byte nfc_fwdl_pkt_len;
|
||||
byte nfc_fwdl_pkt_data;
|
||||
}ftm_nfc_fwdl_pkt_type, *pftm_nfc_fwdl_pkt_type;
|
||||
|
||||
typedef PACKED struct{
|
||||
diagpkt_subsys_header_type diag_hdr;
|
||||
uint16 nfc_chip_type_cmd_id;
|
||||
byte nfc_chip_type_pkt_len;
|
||||
byte nfc_chip_type_pkt_data;
|
||||
}ftm_nfc_chip_type_pkt_type, *pftm_nfc_chip_type_pkt_type;
|
||||
|
||||
typedef PACKED struct{
|
||||
log_hdr_type hdr;
|
||||
byte data[1];
|
||||
} ftm_nfc_log_pkt_type, *pftm_nfc_log_pkt_type;
|
||||
|
||||
typedef PACKED struct _NCI_MESSAGE
|
||||
{
|
||||
byte gid; // Group ID
|
||||
byte oid; // Operation ID
|
||||
byte len; // payload length in bytes
|
||||
byte buf[ 252 ]; // Payload Buffer
|
||||
} NCI_MESSAGE, *PNCI_MESSAGE;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
NCIMT_DATA = 0x00, /**< DATA packet. */
|
||||
NCIMT_CMD = 0x20, /**< Control packet - Command. */
|
||||
NCIMT_RSP = 0x40, /**< Control packet - Response. */
|
||||
NCIMT_NTF = 0x60, /**< Control packet - Notification. */
|
||||
|
||||
NCIMT_INVALID_VALUE = 0xFF, /**< Invalid packet type. */
|
||||
|
||||
NCIMT_BITMASK = 0xE0, /**< Most significant three bits. */
|
||||
NCIMT_BITSHIFT = 5
|
||||
|
||||
} NCIMT;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
UNKNOWN_NQ_CHIP_TYPE = 0,
|
||||
SKIP_CHIP_CHECK = 1,
|
||||
NQ_110 = 11,
|
||||
NQ_120 = 12,
|
||||
NQ_210 = 21,
|
||||
NQ_220 = 22,
|
||||
NQ_310 = 31,
|
||||
NQ_330 = 33,
|
||||
MAXIMUM_NQ_CHIP_TYPE
|
||||
} NQ_CHIP_TYPE;
|
||||
|
||||
struct nqx_devinfo
|
||||
{
|
||||
unsigned char chip_type;
|
||||
unsigned char rom_version;
|
||||
unsigned char fw_major;
|
||||
unsigned char fw_minor;
|
||||
};
|
||||
|
||||
union nqx_uinfo
|
||||
{
|
||||
unsigned int i;
|
||||
struct nqx_devinfo info;
|
||||
};
|
||||
|
||||
int ftm_nq_nfc_open( void );
|
||||
int ftm_nq_nfc_close( void );
|
||||
int ftm_nfc_hw_reset( void );
|
||||
int ProcessCommand( uint8_t *nci_data );
|
||||
void *PrepareRsp( ftm_nfc_pkt_type *nfc_ftm_pkt );
|
||||
void *ftm_nfc_dispatch_nq( ftm_nfc_pkt_type *nfc_ftm_pkt, uint16 pkt_len);
|
||||
void *nfc_read_thread( void *arg );
|
||||
extern sem_t sRfNtf;
|
||||
extern int ese_dwp_test;
|
||||
extern void printTecnologyDetails(char technology, char protocol);
|
||||
|
||||
#define FTM_NFC_CMD_CODE 55
|
||||
#define FTM_NFC_NFCC_COMMAND 0x02
|
||||
#define FTM_NFC_SEND_DATA 0x03
|
||||
#define FTM_NFC_REQ_CHIP_TYPE 0x04
|
||||
#define FTM_NFC_FWPIN_CTRL 0x05
|
||||
#define FTM_NFC_CMD_CMPL_TIMEOUT 3
|
||||
|
||||
#define FTM_NFC_QTI_CHIP 0x00
|
||||
#define FTM_NFC_NQ_CHIP 0x01
|
||||
#define FTM_NFC_FWDL_SUCCESS 0x01
|
||||
|
||||
#define MIN_CMD_PKT_LEN 4 // Minimum length for a valid FTM packet, 2 bytes for Diag header, 2 bytes for command ID
|
||||
|
||||
#define LOG_NFC_FTM 0x1802
|
||||
#define LOG_HEADER_LENGTH 12
|
||||
|
||||
#define NFC_SET_PWR _IOW(0xE9, 0x01, unsigned int)
|
||||
#define NFCC_GET_INFO _IOW(0xE9, 0x09, unsigned int)
|
||||
#define POWER_OFF 0
|
||||
#define POWER_ON 1
|
||||
#define FIRMWARE_MODE 2
|
||||
|
||||
#define EXPECTED_CORE_INIT_RSP_LEN 29
|
||||
#define CHIP_ID 24
|
||||
|
||||
#define SKIP_NQ_HARDWARE_CHECK "SkipNQHardwareCheck"
|
||||
#define HARDWARE_TYPE_TIMEOUT 2
|
||||
|
||||
#define UNUSED_PARAMETER( x ) ( void )( x )
|
||||
|
||||
#endif // _FTM_NFCNQ
|
||||
@@ -1,664 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
|
||||
* All Rights Reserved.
|
||||
* Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
*
|
||||
* Not a Contribution.
|
||||
* Apache license notifications and license are retained
|
||||
* for attribution purposes only.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2015 NXP Semiconductors
|
||||
* The original Work has been changed by NXP Semiconductors.
|
||||
*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*=========================================================================
|
||||
FTM NFC NQ Firmware Download Source File
|
||||
Description
|
||||
This file contains the definitions of the functions
|
||||
used to download firmware onto the NQ Chip.
|
||||
===========================================================================*/
|
||||
|
||||
#include "ftm_nfcnq_fwdl.h"
|
||||
#include "ftm_nfcnq.h"
|
||||
|
||||
unsigned int chip_version = 0x00;
|
||||
|
||||
/* lookup table for CRC-16-CCITT calculation */
|
||||
static uint16_t const crcTable[ 256 ] =
|
||||
{ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad,
|
||||
0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,
|
||||
0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
|
||||
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7,
|
||||
0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5,
|
||||
0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a,
|
||||
0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e,
|
||||
0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae,
|
||||
0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32,
|
||||
0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca,
|
||||
0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
|
||||
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235,
|
||||
0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3,
|
||||
0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d,
|
||||
0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f,
|
||||
0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d,
|
||||
0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0,
|
||||
0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64,
|
||||
0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
|
||||
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 };
|
||||
|
||||
|
||||
/*==========================================================================================================
|
||||
FUNCTION
|
||||
load_firmware_from_library
|
||||
|
||||
DESCRIPTION
|
||||
gets a pointer to the firmware image and the length of the image
|
||||
|
||||
PARAMETERS
|
||||
const char *pathToLib - path to the firmware image library
|
||||
uint8_t **ppFirmwareImage - pointer to the pointer to the firmware image
|
||||
uint16_t *pFirmwareImageLen - pointer to the firmware image length
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
==========================================================================================================*/
|
||||
static void load_firmware_from_library( const char *pathToLib, uint8_t **ppFirmwareImage,
|
||||
uint16_t *pFirmwareImageLen )
|
||||
{
|
||||
void *pFirmwareLibHandle = NULL;
|
||||
void *pTempFirmwareImage = NULL;
|
||||
void *pTempFirmwareImageLen = NULL;
|
||||
int status = -1;
|
||||
|
||||
do
|
||||
{
|
||||
if( NULL == pathToLib )
|
||||
{
|
||||
if(chip_version == 0x51 || chip_version == 0x50 || chip_version == 0x41 || chip_version == 0x40 )
|
||||
pathToLib = "/system/vendor/firmware/libpn553_fw.so"; // set the path to pn553 firmware library
|
||||
else
|
||||
pathToLib = "/system/vendor/firmware/libpn548ad_fw.so"; // set the default path to pn548ad firmware library
|
||||
}
|
||||
|
||||
if( NULL != pFirmwareLibHandle )
|
||||
{
|
||||
status = dlclose( pFirmwareLibHandle ); // if the firmware library handle is not NULL, release the handle
|
||||
pFirmwareLibHandle = NULL;
|
||||
|
||||
dlerror( ); // clear existing errors
|
||||
if( 0 != status )
|
||||
{
|
||||
LOG_ERROR( "%s: dlclose() failed with status = %d \n", __FUNCTION__, status );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pFirmwareLibHandle = dlopen( pathToLib, RTLD_LAZY ); // get a handle to firmware library
|
||||
LOG_MESSAGE( "Opening library handle from %s\n", pathToLib );
|
||||
|
||||
if( NULL == pFirmwareLibHandle )
|
||||
{
|
||||
LOG_ERROR( "%s: dlopen() failed \n", __FUNCTION__ );
|
||||
break;
|
||||
}
|
||||
dlerror( ); // clear existing errors
|
||||
|
||||
pTempFirmwareImage = ( void * )dlsym( pFirmwareLibHandle, "gphDnldNfc_DlSeq" ); // get a pointer to the firmware library
|
||||
|
||||
if( dlerror( ) || ( NULL == pTempFirmwareImage ) )
|
||||
{
|
||||
LOG_ERROR( "%s: dlsym() failed, failed to load gphDnldNfc_DlSeq symbol \n", __FUNCTION__ );
|
||||
break;
|
||||
}
|
||||
*ppFirmwareImage = *( uint8_t ** )pTempFirmwareImage; // the returned pointer is a pointer to an uint8_t array
|
||||
|
||||
pTempFirmwareImageLen = ( void * ) dlsym( pFirmwareLibHandle, "gphDnldNfc_DlSeqSz" ); // get a pointer to the firmware library length
|
||||
|
||||
if( dlerror( ) || ( NULL == pTempFirmwareImageLen ) )
|
||||
{
|
||||
LOG_ERROR( "%s: dlsym() failed, failed to load gphDnldNfc_DlSeqSz symbol \n", __FUNCTION__ );
|
||||
break;
|
||||
}
|
||||
*pFirmwareImageLen = ( uint16_t )( *( ( uint16_t * )pTempFirmwareImageLen ) ); // the returned pointer is a pointer to the length of the image
|
||||
|
||||
} while( FALSE );
|
||||
}
|
||||
|
||||
/*==========================================================================================================
|
||||
FUNCTION
|
||||
send_packet_packet_to_chip
|
||||
|
||||
DESCRIPTION
|
||||
sends the constructed packets to the NFC chip by calling ProcessCommand() from ftm_nfcnq.c
|
||||
|
||||
PARAMETERS
|
||||
pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
|
||||
information required
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
==========================================================================================================*/
|
||||
static void send_packet_packet_to_chip( pfirmware_download_context_t pDownloadContext )
|
||||
{
|
||||
int status = -1;
|
||||
|
||||
status = ProcessCommand( &pDownloadContext->packetToSend ); // call ProcessCommand() from ftm_nfcnq.c
|
||||
if( 0 != status )
|
||||
{
|
||||
LOG_ERROR( "%s: ProcessCommand() failed with status = %d \n", __FUNCTION__, status );
|
||||
}
|
||||
}
|
||||
|
||||
/*==========================================================================================================
|
||||
FUNCTION
|
||||
calculate_crc16
|
||||
|
||||
DESCRIPTION
|
||||
calculates CRC-16-CCITT of a given buffer with a given length with seed value of 0xffff(Hex)
|
||||
|
||||
PARAMETERS
|
||||
uint8_t *pBuff - buffer for CRC-16-CCITT calculation
|
||||
uint16_t buffLen - length of buffer for CRC-16-CCITT calculation
|
||||
|
||||
RETURN VALUE
|
||||
uint16_t - calculated CRC-16-CCITT value of buffer
|
||||
|
||||
==========================================================================================================*/
|
||||
static uint16_t calculate_crc16( uint8_t *pBuff, uint16_t buffLen )
|
||||
{
|
||||
uint16_t temp = 0;
|
||||
uint16_t value = 0;
|
||||
uint16_t crc = 0xffff; // seed value
|
||||
uint32_t i = 0;
|
||||
|
||||
if ( ( NULL == pBuff ) || ( 0 == buffLen ) )
|
||||
{
|
||||
LOG_ERROR( "%s: Invalid parameters \n", __FUNCTION__ );
|
||||
}
|
||||
else
|
||||
{
|
||||
for( i = 0; i < buffLen; i++ )
|
||||
{
|
||||
value = 0x00ffU & ( uint16_t )pBuff[ i ];
|
||||
temp = ( crc >> 8U ) ^ value;
|
||||
crc = ( crc << 8U ) ^ crcTable[ temp ];
|
||||
}
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
/*==========================================================================================================
|
||||
FUNCTION
|
||||
insert_crc16
|
||||
|
||||
DESCRIPTION
|
||||
inserts the calculated CRC-16-CCITT value into the end of the buffer
|
||||
|
||||
PARAMETERS
|
||||
pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
|
||||
information required
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
==========================================================================================================*/
|
||||
static void insert_crc16( pfirmware_download_context_t pDownloadContext )
|
||||
{
|
||||
uint16_t crcValueToWrite = 0;
|
||||
uint8_t *crcValueInBytes = NULL;
|
||||
|
||||
/* get CRC-16-CCITT value of packet and convert it into 2 bytes */
|
||||
crcValueToWrite = calculate_crc16( &pDownloadContext->packetToSend,
|
||||
pDownloadContext->headerPlusPayloadLen );
|
||||
crcValueInBytes = ( uint8_t * )&crcValueToWrite;
|
||||
|
||||
/* insert crc value into last 2 bytes of the packet */
|
||||
if( pDownloadContext->packetToSend.payloadLen < ( FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN + FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN - 1 ))
|
||||
{
|
||||
pDownloadContext->packetToSend.payloadBuff[ pDownloadContext->packetToSend.payloadLen ] = crcValueInBytes[ 1 ];
|
||||
pDownloadContext->packetToSend.payloadBuff[ pDownloadContext->packetToSend.payloadLen + 1 ] = crcValueInBytes[ 0 ];
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_ERROR( "%s: Packet to send payloadLen more than maximum payloadBuff size \n", __FUNCTION__ );
|
||||
}
|
||||
}
|
||||
|
||||
/*==========================================================================================================
|
||||
FUNCTION
|
||||
read_response_from_chip
|
||||
|
||||
DESCRIPTION
|
||||
reader thread that constantly checks for responses from NFC chip, checks the integrity of the
|
||||
response packets by matching the CRC-16-CCITT values and signals the semaphore held by
|
||||
the call to ProcessCommand()
|
||||
|
||||
PARAMETERS
|
||||
pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
|
||||
information required
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
==========================================================================================================*/
|
||||
static void read_response_from_chip( pfirmware_download_context_t pDownloadContext )
|
||||
{
|
||||
uint8_t lenRead = 0;
|
||||
uint8_t *pPacketReceived = NULL;
|
||||
uint16_t calculatedCrcValue = 0;
|
||||
uint16_t crcValueFromResponse = 0;
|
||||
|
||||
do
|
||||
{
|
||||
if( fdNfc < 0 )
|
||||
{
|
||||
LOG_ERROR( "%s: Invalid handle \n", __FUNCTION__ );
|
||||
break;
|
||||
}
|
||||
|
||||
lenRead = read( fdNfc, &pDownloadContext->packetReceived, // get the response packet header
|
||||
FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN );
|
||||
|
||||
if( 0 == lenRead )
|
||||
{
|
||||
LOG_ERROR( "%s: Error reading response packet header \n", __FUNCTION__ );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
pDownloadContext->totalPacketLen = lenRead;
|
||||
}
|
||||
|
||||
lenRead = read( fdNfc, &pDownloadContext->packetReceived.payloadBuff, // get the rest fo the response packet
|
||||
( pDownloadContext->packetReceived.payloadLen +
|
||||
FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN ) );
|
||||
|
||||
if( 0 == lenRead )
|
||||
{
|
||||
LOG_ERROR( "%s: Error reading response packet payload \n", __FUNCTION__ );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
pDownloadContext->totalPacketLen += lenRead; // update the total length of the received packet
|
||||
}
|
||||
|
||||
calculatedCrcValue = calculate_crc16( &pDownloadContext->packetReceived, // calculate the CRC-16-CCITT value of the received packet
|
||||
( pDownloadContext->packetReceived.payloadLen +
|
||||
FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN ) );
|
||||
|
||||
/* convert crc value from the response packet to an uint16_t */
|
||||
if( pDownloadContext->packetReceived.payloadLen < ( FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN + FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN - 1 ))
|
||||
{
|
||||
crcValueFromResponse = pDownloadContext->packetReceived.payloadBuff[ pDownloadContext->packetReceived.payloadLen ];
|
||||
crcValueFromResponse <<= 8;
|
||||
crcValueFromResponse |= pDownloadContext->packetReceived.payloadBuff[ pDownloadContext->packetReceived.payloadLen + 1 ];
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_ERROR( "%s: Packet received payloadLen more than maximum payloadBuff size \n", __FUNCTION__ );
|
||||
}
|
||||
|
||||
if( calculatedCrcValue != crcValueFromResponse ) // compare the CRC-16-CCITT values
|
||||
{
|
||||
LOG_ERROR( "%s: CRC-16-CCITT values do not match, discarding packet \n", __FUNCTION__ );
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
sem_post( &sRspReady ); // signal the semaphore for subsequent packets to be sent
|
||||
}
|
||||
|
||||
} while( FALSE == pDownloadContext->fExitReadThread ); // exit only when the flag is set
|
||||
}
|
||||
|
||||
/*==========================================================================================================
|
||||
FUNCTION
|
||||
get_device_firmware_version
|
||||
|
||||
DESCRIPTION
|
||||
sends the get-firmware-version command (0xF1) to the device and outputs the firmware version of
|
||||
the device
|
||||
|
||||
PARAMETERS
|
||||
pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
|
||||
information required
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
==========================================================================================================*/
|
||||
static void get_device_firmware_version( pfirmware_download_context_t pDownloadContext )
|
||||
{
|
||||
uint8_t getFirmwareVersionCommand[ ] = { 0x00, 0x04, 0xF1, 0x00, 0x00, 0x00 }; // command to get firmware version on device
|
||||
uint8_t firmwareMajorVersion = 0;
|
||||
uint8_t firmwareMinorVersion = 0;
|
||||
|
||||
pDownloadContext->headerPlusPayloadLen =
|
||||
sizeof( getFirmwareVersionCommand ) / sizeof( getFirmwareVersionCommand[ 0 ] );
|
||||
|
||||
memcpy( &pDownloadContext->packetToSend, &getFirmwareVersionCommand, // construct the command packet
|
||||
( pDownloadContext->headerPlusPayloadLen ) );
|
||||
|
||||
insert_crc16( pDownloadContext ); // insert the CRC-16-CCITT value
|
||||
|
||||
send_packet_packet_to_chip( pDownloadContext ); // send the command packet to NFC chip
|
||||
|
||||
/* continues from here once the reader thread reads the response and flags the semaphore,
|
||||
the last 2 bytes of the get version response payload contains the firmware version currently on the device */
|
||||
firmwareMajorVersion = pDownloadContext->packetReceived.payloadBuff[ pDownloadContext->packetReceived.payloadLen - 1 ];
|
||||
firmwareMinorVersion = pDownloadContext->packetReceived.payloadBuff[ pDownloadContext->packetReceived.payloadLen - 2 ];
|
||||
|
||||
if(chip_version == 0x51 || chip_version == 0x50 || chip_version == 0x41 || chip_version == 0x40 )
|
||||
LOG_INFORMATION( "Firmware version: 11.%02X.%02X\n", firmwareMajorVersion, firmwareMinorVersion );
|
||||
else
|
||||
LOG_INFORMATION( "Firmware version: 10.%02X.%02X\n", firmwareMajorVersion, firmwareMinorVersion );
|
||||
}
|
||||
|
||||
/*==========================================================================================================
|
||||
FUNCTION
|
||||
build_first_packet
|
||||
|
||||
DESCRIPTION
|
||||
constructs the first packet to be sent to the NFC chip
|
||||
|
||||
PARAMETERS
|
||||
pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
|
||||
information required
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
==========================================================================================================*/
|
||||
static void build_first_packet( pfirmware_download_context_t pDownloadContext )
|
||||
{
|
||||
memset( pDownloadContext->packetToSend.payloadBuff, 0, // initialise the payload buffer to zero
|
||||
FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN );
|
||||
|
||||
memcpy( &pDownloadContext->packetToSend, // copy the first chunk from the firmware library to the packet
|
||||
pDownloadContext->pFirmwareImage,
|
||||
pDownloadContext->headerPlusPayloadLen );
|
||||
|
||||
insert_crc16( pDownloadContext ); // insert the CRC-16-CCITT value
|
||||
}
|
||||
|
||||
/*==========================================================================================================
|
||||
FUNCTION
|
||||
build_next_packet
|
||||
|
||||
DESCRIPTION
|
||||
constructs subsequent packets required to be sent to the NFC chip
|
||||
|
||||
PARAMETERS
|
||||
pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
|
||||
information required
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
==========================================================================================================*/
|
||||
static void build_next_packet( pfirmware_download_context_t pDownloadContext )
|
||||
{
|
||||
/* for chunks from library that are larger than 256 bytes, the packets have to be fragmented */
|
||||
if( pDownloadContext->bytesLeftToSend > FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN )
|
||||
{
|
||||
pDownloadContext->headerPlusPayloadLen = FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN + // length of header plus the payload for CRC-16-CCITT calculation
|
||||
FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN;
|
||||
|
||||
pDownloadContext->totalPacketLen = FIRMWARE_DOWNLOAD_MAX_PACKET_LEN; // length of the entire packet to be sent
|
||||
|
||||
pDownloadContext->packetToSend.fFragmentedPacket = FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_SET; // set the fragment flag as the first byte
|
||||
|
||||
pDownloadContext->packetToSend.payloadLen = FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN; // insert the payload length in the second byte
|
||||
|
||||
memcpy( ( &pDownloadContext->packetToSend.payloadBuff ), // copy payload from firmware library
|
||||
&pDownloadContext->pFirmwareImage[ pDownloadContext->readIndexFromLib ],
|
||||
FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN );
|
||||
|
||||
pDownloadContext->readIndexFromLib += FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN; // update the buffer index used to read from firmware library
|
||||
|
||||
pDownloadContext->bytesLeftToSend -= FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN; // update the number of bytes left to send from the chunk
|
||||
}
|
||||
|
||||
/* for chunks from library that are smaller than 256 bytes, no fragmentation needed */
|
||||
else
|
||||
{
|
||||
pDownloadContext->headerPlusPayloadLen = pDownloadContext->bytesLeftToSend + // length of header plus the payload for CRC-16-CCITT calculation
|
||||
FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN;
|
||||
|
||||
pDownloadContext->totalPacketLen = pDownloadContext->bytesLeftToSend + // length of the entire packet to be sent
|
||||
FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN +
|
||||
FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN;
|
||||
|
||||
pDownloadContext->packetToSend.fFragmentedPacket = FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_NONE; // set the fragment flag to none as the first byte
|
||||
|
||||
pDownloadContext->packetToSend.payloadLen = pDownloadContext->bytesLeftToSend; // insert the payload length in the second byte
|
||||
|
||||
memcpy( ( &pDownloadContext->packetToSend.payloadBuff ), // copy payload from firmware library
|
||||
&pDownloadContext->pFirmwareImage[ pDownloadContext->readIndexFromLib ],
|
||||
pDownloadContext->bytesLeftToSend );
|
||||
|
||||
pDownloadContext->readIndexFromLib += pDownloadContext->bytesLeftToSend; // update the buffer index used to read from firmware library
|
||||
|
||||
pDownloadContext->bytesLeftToSend = 0; // most likely the last fragment from the chunk
|
||||
}
|
||||
|
||||
insert_crc16( pDownloadContext );
|
||||
}
|
||||
|
||||
/*==========================================================================================================
|
||||
FUNCTION
|
||||
process_packets_to_send
|
||||
|
||||
DESCRIPTION
|
||||
determines if the incoming packet is the first one or any subsequent ones and process them
|
||||
accordingly
|
||||
|
||||
PARAMETERS
|
||||
pfirmware_download_context_t pDownloadContext - pointer to structure containing all the
|
||||
information required
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
==========================================================================================================*/
|
||||
static void process_packets_to_send( pfirmware_download_context_t pDownloadContext )
|
||||
{
|
||||
uint8_t firstChunkLenFromLib = 0;
|
||||
uint16_t nextChunkLenFromLib = 0;
|
||||
uint16_t buffIndex = pDownloadContext->readIndexFromLib;
|
||||
|
||||
if( TRUE == pDownloadContext->fFirstPacket )
|
||||
{
|
||||
pDownloadContext->fFirstPacket = FALSE; // indicates that the first packet has been processed
|
||||
|
||||
firstChunkLenFromLib = pDownloadContext->pFirmwareImage[ 1 ] + // length of the first chunk read from firmware library
|
||||
FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN;
|
||||
|
||||
pDownloadContext->totalPacketLen = firstChunkLenFromLib + // length of the entire packet to send
|
||||
FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN;
|
||||
|
||||
pDownloadContext->readIndexFromLib += firstChunkLenFromLib; // update the buffer index used to read from firmware library
|
||||
|
||||
pDownloadContext->headerPlusPayloadLen = firstChunkLenFromLib; // length of header plus the payload for CRC-16-CCITT calculation
|
||||
|
||||
build_first_packet( pDownloadContext ); // build the first packet
|
||||
|
||||
send_packet_packet_to_chip( pDownloadContext ); // send the packet to the NFC chip
|
||||
}
|
||||
else if( FALSE == pDownloadContext->fFirstPacket )
|
||||
{
|
||||
nextChunkLenFromLib = pDownloadContext->pFirmwareImage[ buffIndex ]; // length of next chunk read from the firmware library
|
||||
|
||||
/* length of next chunk is stored in 2 bytes in the firmware library */
|
||||
nextChunkLenFromLib <<= 8;
|
||||
nextChunkLenFromLib |= pDownloadContext->pFirmwareImage[ buffIndex + 1 ];
|
||||
|
||||
buffIndex += 2; // add 2 bytes to the buffer index after length of next chunk is read
|
||||
|
||||
pDownloadContext->readIndexFromLib = buffIndex; // update the buffer index used to read from firmware library
|
||||
|
||||
pDownloadContext->bytesLeftToSend = nextChunkLenFromLib; // number of bytes left on the chunk to be sent to the chip
|
||||
|
||||
while( pDownloadContext->bytesLeftToSend > 0 ) // constructs and sends packets as long as there are bytes left in the chunk
|
||||
{
|
||||
build_next_packet( pDownloadContext );
|
||||
send_packet_packet_to_chip( pDownloadContext );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_ERROR( "%s: Should not reach this point \n", __FUNCTION__ );
|
||||
}
|
||||
}
|
||||
|
||||
/*==========================================================================================================
|
||||
FUNCTION
|
||||
ftm_nfc_dispatch_nq_fwdl
|
||||
|
||||
DESCRIPTION
|
||||
called by main() in ftm_main.c to start the firmware download routine
|
||||
|
||||
PARAMETERS
|
||||
none
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
==========================================================================================================*/
|
||||
void ftm_nfc_dispatch_nq_fwdl( void )
|
||||
{
|
||||
int status = 0;
|
||||
|
||||
char *pathToLib = NULL;
|
||||
uint8_t *pFirmwareImage = NULL;
|
||||
uint16_t firmwareImageLen = 0;
|
||||
|
||||
uint8_t *pNextChunkFromLib = NULL;
|
||||
uint16_t nextChunkLenFromLib = 0;
|
||||
uint16_t totalBytesReadFromLib = 0;
|
||||
uint16_t readIndexFromLib = 0;
|
||||
union nqx_uinfo nqx_info;
|
||||
pthread_t readerThread;
|
||||
|
||||
firmware_download_context_t downloadContext = { 0 };
|
||||
pfirmware_download_context_t pDownloadContext = &downloadContext;
|
||||
pDownloadContext->fFirstPacket = TRUE;
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
if( !fdNfc )
|
||||
{
|
||||
status = ftm_nq_nfc_open( ); // get a handle to the kernel driver
|
||||
if( status < 0 )
|
||||
{
|
||||
LOG_ERROR( "\n%s: ftm_nq_nfc_open() failed with status = %d \n", __FUNCTION__, status );
|
||||
break;
|
||||
}
|
||||
|
||||
status = ftm_nfc_hw_reset( ); // reset NFC hardware
|
||||
if( status < 0 )
|
||||
{
|
||||
LOG_ERROR( "%s: ftm_nq_nfc_reset() failed with status = %d \n", __FUNCTION__, status );
|
||||
break;
|
||||
}
|
||||
|
||||
nqx_info.i = ioctl( fdNfc, NFCC_GET_INFO, 0 );
|
||||
if( nqx_info.i < 0 )
|
||||
{
|
||||
LOG_ERROR( "%s: nqnfcinfo not enabled, info = %d \n", __FUNCTION__, nqx_info.i );
|
||||
}
|
||||
chip_version = nqx_info.info.chip_type;
|
||||
LOG_INFORMATION( "\n NQ Chip ID : %x\n", chip_version);
|
||||
}
|
||||
|
||||
status = pthread_create( &readerThread, NULL, // create a reader thread
|
||||
&read_response_from_chip, pDownloadContext );
|
||||
if( 0 != status )
|
||||
{
|
||||
LOG_ERROR( "%s: pthread_create() failed with status = %d \n", __FUNCTION__, status );
|
||||
break;
|
||||
}
|
||||
|
||||
load_firmware_from_library( pathToLib, &pFirmwareImage, &firmwareImageLen ); // get a pointer to firmware library image and get its length
|
||||
if( ( NULL == pFirmwareImage ) || ( 0 == firmwareImageLen ) )
|
||||
{
|
||||
LOG_ERROR( "%s: Firmware library image extraction failed\n", __FUNCTION__ );
|
||||
break;
|
||||
}
|
||||
|
||||
LOG_MESSAGE( "Firmware major version number: %02X\n", pFirmwareImage[ 5 ] );
|
||||
LOG_MESSAGE( "Firmware minor version number: %02X\n", pFirmwareImage[ 4 ] );
|
||||
LOG_MESSAGE( "Firmware library image length: %d\n", firmwareImageLen );
|
||||
LOG_MESSAGE( "Firmware library image pointer: %X\n", ( uintptr_t )pFirmwareImage );
|
||||
|
||||
pDownloadContext->pFirmwareImage = pFirmwareImage;
|
||||
pDownloadContext->firmwareImageLen = firmwareImageLen;
|
||||
|
||||
status = ioctl( fdNfc, NFC_SET_PWR, FIRMWARE_MODE ); // set NFCC to firmware download mode
|
||||
if( 0 != status )
|
||||
{
|
||||
LOG_ERROR( "%s: Failed to set firmware pin high.\n", __FUNCTION__ );
|
||||
break;
|
||||
}
|
||||
|
||||
LOG_INFORMATION( "\nBefore firmware update...\n" );
|
||||
get_device_firmware_version( pDownloadContext ); // get device version before loading firmware
|
||||
|
||||
LOG_INFORMATION( "\nSending firmware packets... Please wait\n" );
|
||||
while( pDownloadContext->readIndexFromLib < pDownloadContext->firmwareImageLen )
|
||||
{
|
||||
process_packets_to_send( pDownloadContext ); // build and send download packets with payload from the firmware library image
|
||||
}
|
||||
|
||||
LOG_INFORMATION( "All packets sent!\n\n" );
|
||||
|
||||
pDownloadContext->fExitReadThread = TRUE; // set flag to indicate that reader thread is safe to exit
|
||||
|
||||
LOG_INFORMATION( "After firmware update...\n" );
|
||||
get_device_firmware_version( pDownloadContext ); // get device version number after loading firmware
|
||||
|
||||
LOG_MESSAGE( "Waiting for reader thread to terminate...\n" );
|
||||
pthread_join( readerThread, NULL ); // wait for reader thread to terminate
|
||||
LOG_MESSAGE( "Reader thread terminated!\n" );
|
||||
|
||||
LOG_MESSAGE( "Resetting NFCC...\n" );
|
||||
|
||||
status = ftm_nfc_hw_reset( ); // reset the NFC hardware which resets the firmware pin as well
|
||||
if( status < 0 )
|
||||
{
|
||||
LOG_ERROR( "%s: ftm_nfc_hw_reset() failed with status = %d \n", __FUNCTION__, status );
|
||||
break;
|
||||
}
|
||||
|
||||
status = ftm_nq_nfc_close( ); // release the handle to the kernel driver
|
||||
if( 0 != status )
|
||||
{
|
||||
LOG_ERROR( "%s: ftm_nq_nfc_close() failed with status = %d \n", __FUNCTION__, status );
|
||||
}
|
||||
|
||||
LOG_INFORMATION( "All done!\n\n" );
|
||||
|
||||
} while( FALSE );
|
||||
|
||||
}
|
||||
@@ -1,111 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2016 Qualcomm Technologies, Inc.
|
||||
* All Rights Reserved.
|
||||
* Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
*
|
||||
* Not a Contribution.
|
||||
* Apache license notifications and license are retained
|
||||
* for attribution purposes only.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2015 NXP Semiconductors
|
||||
* The original Work has been changed by NXP Semiconductors.
|
||||
*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/*=========================================================================
|
||||
FTM NFC NQ Firmware Download Header File
|
||||
Description
|
||||
This file contains the declarations of the functions and various
|
||||
definitions used to download firmware onto the NQ Chip.
|
||||
===========================================================================*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <dlfcn.h>
|
||||
#include <semaphore.h>
|
||||
#include <pthread.h>
|
||||
|
||||
#define FALSE ( 0 )
|
||||
#define TRUE ( !FALSE )
|
||||
|
||||
#define FIRMWARE_DOWNLOAD_MAX_PACKET_LEN ( 0x100U ) // maximum length for a download packet
|
||||
#define FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN ( 0x02U ) // length of the header
|
||||
#define FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN ( 0x02U ) // length of CRC-16-CCITT value
|
||||
#define FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN FIRMWARE_DOWNLOAD_MAX_PACKET_LEN - \
|
||||
FIRMWARE_DOWNLOAD_PACKET_HEADER_LEN - \
|
||||
FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN
|
||||
|
||||
/* Values for the first byte of each packet, indicates if the packet is fragmented */
|
||||
#define FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_NONE ( 0x00U ) // not fragmented
|
||||
#define FIRMWARE_DOWNLOAD_PACKET_FRAG_FLAG_SET ( 0x04U ) // fragmented packet, next packet is a part of this one
|
||||
|
||||
extern sem_t sRspReady; // semaphore used by reader thread
|
||||
extern int fdNfc; // a handle to the kernel driver
|
||||
|
||||
typedef uint8_t bool_t;
|
||||
|
||||
/* structure of the packet to be sent or received */
|
||||
typedef struct firmware_download_packet
|
||||
{
|
||||
uint8_t fFragmentedPacket; // flag to indicate if the packet is fragmented
|
||||
uint8_t payloadLen; // length of payload
|
||||
uint8_t payloadBuff[ FIRMWARE_DOWNLOAD_PACKET_MAX_PAYLOAD_LEN +
|
||||
FIRMWARE_DOWNLOAD_PACKET_CRC16_LEN ]; // buffer containing the payload and CRC-16-CCITT value
|
||||
} firmware_download_packet_t, *pfirmware_download_packet_t;
|
||||
|
||||
/* structure that contains all the other information about the packets */
|
||||
typedef struct firmware_download_context
|
||||
{
|
||||
const uint8_t *pFirmwareImage; // pointer to the firmware image library
|
||||
uint16_t firmwareImageLen; // length of the firmware image
|
||||
|
||||
uint8_t headerPlusPayloadLen; // header and payload length of a packet for CRC calculation
|
||||
uint16_t readIndexFromLib; // index used to read from the firmware library
|
||||
uint16_t bytesLeftToSend; // number of bytes left to send when the chunk read is fragmented
|
||||
uint16_t totalPacketLen; // total length of packet to be sent or received
|
||||
bool_t fFirstPacket; // flag to indicate if it is the first packet
|
||||
bool_t fExitReadThread; // flag to indicate if reader thread is safe to exit
|
||||
firmware_download_packet_t packetToSend; // contains information about packet to be sent
|
||||
firmware_download_packet_t packetReceived; // contains information about packet from response received
|
||||
} firmware_download_context_t, *pfirmware_download_context_t;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Firmware download packet format
|
||||
|
||||
-----------------------------------------------------------------------------------------------------
|
||||
| Header | Payload | CRC-16-CCITT value |
|
||||
-----------------------------------------------------------------------------------------------------
|
||||
| Fragment flag | Payload length | Command/Response | Data | CRC-16-CCITT value |
|
||||
-----------------------------------------------------------------------------------------------------
|
||||
| 1 byte | 1 byte | 1 byte | n bytes | 2 bytes |
|
||||
-----------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
Firmware library image format
|
||||
|
||||
--------------------------------------------------------------------------------- ----------------------------------
|
||||
| 0x00 | First chunk length | First chunk | Next chunk length | Next chunk | ... | Last chunk length | Last chunk |
|
||||
--------------------------------------------------------------------------------- ----------------------------------
|
||||
| 1 byte | 1 byte | n bytes | 2 bytes | n bytes | ... | 2 bytes | n bytes |
|
||||
--------------------------------------------------------------------------------- ----------------------------------
|
||||
|
||||
*/
|
||||
@@ -1,461 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2017 Qualcomm Technologies, Inc.
|
||||
* All Rights Reserved.
|
||||
* Confidential and Proprietary - Qualcomm Technologies, Inc.
|
||||
*/
|
||||
|
||||
#include <libgen.h>
|
||||
#include "ftm_nfcnq.h"
|
||||
#include "ftm_nfcnq_test.h"
|
||||
|
||||
/* Global variables */
|
||||
pthread_t clientThread;
|
||||
PNCI_MESSAGE pNCIMessage;
|
||||
char *progname;
|
||||
|
||||
/*==============================================================================
|
||||
FUNCTION
|
||||
eseSpiTest
|
||||
|
||||
DESCRIPTION
|
||||
Send APDU for eSE SPI HLOS test
|
||||
|
||||
PARAMETERS
|
||||
int argc - argument count
|
||||
char **argv - argument vector
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
=============================================================================*/
|
||||
void eseSpiTest(int argc, char **argv )
|
||||
{
|
||||
int ret = 0;
|
||||
int test_mode = 0;
|
||||
unsigned char i = 0;
|
||||
int fp = 0;
|
||||
int choice = 0;
|
||||
unsigned char send_APDU[] = {0x5A,0x00,0x05,0x00,0xA4,0x04,0x00,0x00,0xA5};
|
||||
int size_APDU = 0;
|
||||
unsigned char recv_response[259] = {0};
|
||||
progname = basename(argv[2]);
|
||||
test_mode = getopt(argc, argv, "01");
|
||||
size_APDU = sizeof(send_APDU);
|
||||
|
||||
LOG_INFORMATION("\n### eSE SPI test ###\n");
|
||||
|
||||
if(test_mode == '0')
|
||||
{
|
||||
choice = 0;
|
||||
LOG_INFORMATION("\nInterrupt Mode test\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
choice = 1;
|
||||
LOG_INFORMATION("\nPoll Mode test(default)\n");
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
//open module
|
||||
if ((ret = (fp = open("/dev/ese", O_RDWR))) < 0)
|
||||
{
|
||||
LOG_INFORMATION("eSE open error retcode = %d, errno = %d\n", ret, errno);
|
||||
LOG_INFORMATION("\n... eSE SPI Test requires modified boot and TZ image ...");
|
||||
break;
|
||||
}
|
||||
LOG_INFORMATION("eSE open : Ret = %2d\n", ret);
|
||||
|
||||
//enable the logs
|
||||
ioctl(fp, ESE_SET_DBG, 1);
|
||||
//hardware reset
|
||||
ioctl(fp, ESE_SET_PWR, 1);
|
||||
|
||||
ioctl(fp, ESE_SET_MODE, choice);
|
||||
|
||||
//write one APDU
|
||||
ret = write(fp, send_APDU, sizeof(send_APDU));
|
||||
if (ret < 0)
|
||||
{
|
||||
LOG_INFORMATION("ese write error retcode = %d, errno = %d\n", ret, errno);
|
||||
break;
|
||||
}
|
||||
LOG_INFORMATION("ese Write : Ret = %.2X \n", ret);
|
||||
LOG_INFORMATION("APDU sent to eSE: ");
|
||||
for (i=0; i<size_APDU; i++)
|
||||
{
|
||||
LOG_INFORMATION("%.2X ", send_APDU[i]);
|
||||
}
|
||||
sleep(1);
|
||||
|
||||
if ((ret = (read(fp, &recv_response[0], READ_SAMPLE_SIZE)), 0) < 0)
|
||||
{
|
||||
LOG_INFORMATION("\neSE read error retcode = %d, errno = %d", ret, errno);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_INFORMATION("\nResponse from eSE: ");
|
||||
for (i=0;i<(recv_response[2]+1);i++)
|
||||
{
|
||||
LOG_INFORMATION("%.2X ", recv_response[i]);
|
||||
}
|
||||
LOG_INFORMATION("\n");
|
||||
}
|
||||
} while(0);
|
||||
|
||||
close(fp);
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
FUNCTION
|
||||
eseDwpTest
|
||||
|
||||
DESCRIPTION
|
||||
Send NCI commands to NFCC for eSE DWP detection
|
||||
|
||||
PARAMETERS
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
=============================================================================*/
|
||||
void eseDwpTest()
|
||||
{
|
||||
int cmds;
|
||||
cmds = sizeof(NQ330_ESE_DWP) / sizeof(NQ330_ESE_DWP[0]);
|
||||
LOG_INFORMATION( "\n### ese DWP Test ###\n" );
|
||||
if(whatNQChip == NQ_220 || whatNQChip == NQ_330)
|
||||
sendcmds(NQ330_ESE_DWP, cmds);
|
||||
else
|
||||
LOG_INFORMATION( "\nNQ Chipset in use doesn't support eSE\n" );
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
FUNCTION
|
||||
printTecnologyDetails
|
||||
|
||||
DESCRIPTION
|
||||
Print the technology supported and protocols details
|
||||
|
||||
PARAMETERS
|
||||
char technology - technology supported identifier
|
||||
char protocol - protocol identifier
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
=============================================================================*/
|
||||
void printTecnologyDetails(char technology, char protocol)
|
||||
{
|
||||
switch (protocol)
|
||||
{
|
||||
case NFC_PROTOCOL_ISO_DEP:
|
||||
LOG_INFORMATION( "ISO-DEP Protocol");
|
||||
break;
|
||||
|
||||
case NFC_PROTOCOL_NFC_DEP:
|
||||
LOG_INFORMATION( "NFC-DEP Protocol");
|
||||
break;
|
||||
|
||||
case NFC_PROTOCOL_T1T:
|
||||
LOG_INFORMATION( "T1T Protocol");
|
||||
break;
|
||||
|
||||
case NFC_PROTOCOL_T2T:
|
||||
LOG_INFORMATION( "T2T Protocol");
|
||||
break;
|
||||
|
||||
case NFC_PROTOCOL_T3T:
|
||||
LOG_INFORMATION( "T3T Protocol");
|
||||
break;
|
||||
|
||||
case NFC_PROTOCOL_UNKNOWN:
|
||||
LOG_INFORMATION( "unknown Protocol");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (technology)
|
||||
{
|
||||
case NFC_NFCA_Poll:
|
||||
LOG_INFORMATION("\nNFC A POLL MODE TECHNOLOGY\n");
|
||||
break;
|
||||
case NFC_NFCB_Poll:
|
||||
LOG_INFORMATION("\nNFC B POLL MODE TECHNOLOGY\n");
|
||||
break;
|
||||
case NFC_NFCF_Poll:
|
||||
LOG_INFORMATION("\nNFC F POLL MODE TECHNOLOGY\n");
|
||||
break;
|
||||
case NFC_NFCA_Listen:
|
||||
LOG_INFORMATION("\nNFC A LISTEN MODE TECHNOLOGY\n");
|
||||
break;
|
||||
case NFC_NFCB_Listen:
|
||||
LOG_INFORMATION("\nNFC B LISTEN MODE TECHNOLOGY\n");
|
||||
break;
|
||||
case NFC_NFCF_Listen:
|
||||
LOG_INFORMATION("\nNFC F LISTEN MODE TECHNOLOGY\n");
|
||||
break;
|
||||
case NFC_NFCISO15693_Poll:
|
||||
LOG_INFORMATION("\nNFC ISO15693 POLL MODE TECHNOLOGY\n");
|
||||
break;
|
||||
default:
|
||||
LOG_INFORMATION("\nother TECHNOLOGY\n");
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
FUNCTION
|
||||
sendcmds
|
||||
|
||||
DESCRIPTION
|
||||
Send sequence of commands to NFCC
|
||||
|
||||
PARAMETERS
|
||||
uint8_t buffer[] - Command buffer array
|
||||
int no_of_cmds - Number of commands to be sent
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
=============================================================================*/
|
||||
void sendcmds(uint8_t buffer[][MAX_CMD_LEN], int no_of_cmds)
|
||||
{
|
||||
int rows=0,payloadlen=0;
|
||||
int ret = 0;
|
||||
ftm_nfc_pkt_type *nfc_pkt = (ftm_nfc_pkt_type *)malloc(no_of_cmds*255);
|
||||
|
||||
LOG_INFORMATION("\nTotal cmds to be sent = %d\n",no_of_cmds);
|
||||
LOG_INFORMATION("Wait for Commands to be sent... \n\n");
|
||||
|
||||
for(rows = 0; rows < no_of_cmds; rows++)
|
||||
{
|
||||
#ifdef NFC_FTM_DEBUG
|
||||
LOG_INFORMATION ("Number of cmds sent = %d \n",rows+1);
|
||||
#endif
|
||||
payloadlen = 0;
|
||||
payloadlen = 3 + buffer[rows][2];
|
||||
memset(nfc_pkt->nci_data, -1, MAX_CMD_LEN);
|
||||
memcpy(nfc_pkt->nci_data, &buffer[rows], payloadlen);
|
||||
ret = ProcessCommand( nfc_pkt->nci_data );
|
||||
if( ret == -1 ) // wait finished, not signalled?
|
||||
{
|
||||
LOG_ERROR( "Waited for NCI NTF/DATA timeout\n" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
FUNCTION
|
||||
usage
|
||||
|
||||
DESCRIPTION
|
||||
Print usage information for test
|
||||
|
||||
PARAMETERS
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
=============================================================================*/
|
||||
void usage()
|
||||
{
|
||||
LOG_INFORMATION("\nUsage:");
|
||||
LOG_INFORMATION(" %s [-n] [-e] [-d] [h] \n", progname);
|
||||
LOG_INFORMATION(" %s -n ..for NFC test only\n", progname);
|
||||
LOG_INFORMATION(" %s -e ..for eSE SPI test only\n \t-0 ..Interrupt Mode\n \t-1 ..Poll Mode\n", progname);
|
||||
LOG_INFORMATION(" %s -d ..for eSE DWP test only\n", progname);
|
||||
LOG_INFORMATION(" %s -h HELP\n", progname);
|
||||
LOG_INFORMATION(" %s default NFC test only\n", progname);
|
||||
}
|
||||
|
||||
/*==============================================================================
|
||||
FUNCTION
|
||||
nfc_ese_pwr
|
||||
|
||||
DESCRIPTION
|
||||
Set ESE power using NFC driver
|
||||
|
||||
PARAMETERS
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
=============================================================================*/
|
||||
void nfc_ese_pwr()
|
||||
{
|
||||
int ret;
|
||||
ret = ioctl( fdNfc, NFC_ESE_SET_PWR, POWER_ON ); // turn the chip on
|
||||
if( ret != 0 )
|
||||
{
|
||||
LOG_INFORMATION("Can't find ESE GPIO in NFC driver: ");
|
||||
LOG_INFORMATION("ret=%d\n",ret);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*==============================================================================
|
||||
FUNCTION
|
||||
ftm_nfc_dispatch_nq_test
|
||||
|
||||
DESCRIPTION
|
||||
called by main() in ftm_main.c to start the nfc test routine
|
||||
|
||||
PARAMETERS
|
||||
int argc - argument count
|
||||
char **argv - argument vector
|
||||
|
||||
RETURN VALUE
|
||||
void
|
||||
|
||||
=============================================================================*/
|
||||
void ftm_nfc_dispatch_nq_test( int argc, char **argv )
|
||||
{
|
||||
int cmds = 0;
|
||||
unsigned int chip_version = 0x00;
|
||||
unsigned int major_version = 0x00;
|
||||
unsigned int minor_version = 0x00;
|
||||
unsigned int rom_version = 0x00;
|
||||
char firmware_version[10];
|
||||
struct timespec time_sec;
|
||||
int type_of_test = 0;
|
||||
int default_test = 0;
|
||||
int status = 0;
|
||||
|
||||
union nqx_uinfo nqx_info;
|
||||
pthread_t readerThread;
|
||||
|
||||
do
|
||||
{
|
||||
if( !fdNfc )
|
||||
{
|
||||
status = ftm_nq_nfc_open( ); // get a handle to the kernel driver
|
||||
if( status < 0 )
|
||||
{
|
||||
LOG_ERROR( "\n%s: ftm_nq_nfc_open() failed with status = %d \n", __FUNCTION__, status );
|
||||
break;
|
||||
}
|
||||
|
||||
status = ftm_nfc_hw_reset( ); // reset NFC hardware
|
||||
if( status < 0 )
|
||||
{
|
||||
LOG_ERROR( "%s: ftm_nq_nfc_reset() failed with status = %d \n", __FUNCTION__, status );
|
||||
break;
|
||||
}
|
||||
|
||||
nqx_info.i = ioctl( fdNfc, NFCC_GET_INFO, 0 );
|
||||
if( nqx_info.i < 0 )
|
||||
{
|
||||
LOG_ERROR( "%s: nqnfcinfo not enabled, info = %d \n", __FUNCTION__, nqx_info.i );
|
||||
}
|
||||
|
||||
chip_version = nqx_info.info.chip_type;
|
||||
rom_version = nqx_info.info.rom_version;
|
||||
major_version = nqx_info.info.fw_major;
|
||||
minor_version = nqx_info.info.fw_minor;
|
||||
|
||||
LOG_INFORMATION( "\n NQ Chip ID : %x\n", chip_version);
|
||||
snprintf(firmware_version, 10, "%02x.%02x.%02x", rom_version, major_version, minor_version);
|
||||
LOG_INFORMATION(" Firmware version : %s\n\n", firmware_version);
|
||||
|
||||
|
||||
if(sem_init(&sRspReady, 0, 0) != 0)
|
||||
{
|
||||
LOG_ERROR("NFC FTM :semaphore_halcmd_complete creation failed \n");
|
||||
break;
|
||||
}
|
||||
if(sem_init(&sRfNtf, 0, 0) != 0)
|
||||
{
|
||||
LOG_ERROR("NFC FTM :semaphore_halcmd_complete creation failed \n");
|
||||
break;
|
||||
}
|
||||
|
||||
pNCIMessage = ( PNCI_MESSAGE ) nciReplyMessage;
|
||||
status = pthread_create( &clientThread, NULL, &nfc_read_thread, NULL ); // Start the Read Thread
|
||||
|
||||
if( status != 0 ) // successful?
|
||||
{
|
||||
LOG_ERROR("nqnfc %s: pthread_create( nfc_read_thread ) failed with ret = %d \n", __func__, status );
|
||||
break;
|
||||
}
|
||||
|
||||
status = ftm_nfc_nq_vs_nxp( );
|
||||
if( status < 0 ) // Not an NQ Chip?
|
||||
{
|
||||
LOG_ERROR("ERROR NOT A KNOWN NQ Chip \n" );
|
||||
}
|
||||
}
|
||||
|
||||
progname = basename(argv[1]);
|
||||
type_of_test = getopt(argc, argv, "nedhf");
|
||||
|
||||
switch (type_of_test) {
|
||||
case 'n':
|
||||
LOG_INFORMATION("NFC test only\n");
|
||||
break;
|
||||
case 'e':
|
||||
LOG_INFORMATION("eSE SPI test only\n");
|
||||
nfc_ese_pwr();
|
||||
ese_spi_test = 1;
|
||||
eseSpiTest(argc, argv);
|
||||
break;
|
||||
case 'd':
|
||||
LOG_INFORMATION("eSE DWP test only\n");
|
||||
ese_dwp_test = 1;
|
||||
eseDwpTest();
|
||||
break;
|
||||
case 'h':
|
||||
usage();
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
default_test = 1;
|
||||
LOG_INFORMATION("\nDefault NFC test only\n");
|
||||
}
|
||||
|
||||
if(ese_dwp_test || ese_spi_test)
|
||||
break;
|
||||
|
||||
if(type_of_test == 'n' || default_test)
|
||||
{
|
||||
switch(whatNQChip)
|
||||
{
|
||||
case NQ_210:
|
||||
case NQ_220:
|
||||
cmds = sizeof(NQ220_cmds) / sizeof(NQ220_cmds[0]);
|
||||
sendcmds(NQ220_cmds, cmds);
|
||||
break;
|
||||
case NQ_310:
|
||||
case NQ_330:
|
||||
cmds = sizeof(NQ330_cmds) / sizeof(NQ330_cmds[0]);
|
||||
sendcmds(NQ330_cmds, cmds);
|
||||
break;
|
||||
default:
|
||||
LOG_INFORMATION( "Chip not supported, taking NQ330 as default\n ");
|
||||
cmds = sizeof(NQ330_cmds) / sizeof(NQ330_cmds[0]);
|
||||
sendcmds(NQ330_cmds, cmds);
|
||||
break;
|
||||
}
|
||||
|
||||
LOG_INFORMATION("\n<<>> Waiting for TAG detect or 20sec timeout <<>> ...\n");
|
||||
status = clock_gettime( CLOCK_REALTIME, &time_sec );
|
||||
time_sec.tv_sec += NFC_NTF_TIMEOUT;
|
||||
status = sem_timedwait( &sRfNtf, &time_sec ); //start waiting
|
||||
if (status <0) {
|
||||
LOG_INFORMATION("\n No NFC Tag detected, continue ...\n");
|
||||
}
|
||||
}
|
||||
|
||||
status = ftm_nq_nfc_close( ); // release the handle to the kernel driver
|
||||
if( 0 != status )
|
||||
{
|
||||
LOG_ERROR( "%s: ftm_nq_nfc_close() failed with status = %d \n", __FUNCTION__, status );
|
||||
}
|
||||
|
||||
} while( FALSE );
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user