summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLevi Oliver <levio@google.com>2016-08-09 14:55:41 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-08-11 14:46:32 -0700
commitbf302b55e9973a5c6e3e59722a9d3062e7936832 (patch)
treed3de6d5c8f90bbaffded93a3747d078fbde83b25
parentef6e93dc1bbf92821c9d3ff149f691fbdad1c015 (diff)
downloadchrome-ec-bf302b55e9973a5c6e3e59722a9d3062e7936832.tar.gz
btle: Add framework for parsing data packets
Re-wrote ble_radio_init to work with both data and advertising packets. Updated all calls to refactored function. RADIO_PCNF0_ADV renamed because it applies to advertisement and data packet formats. Updated all references to this value. TEST=make BOARD=hadoken BUG=None BRANCH=None Change-Id: I0fdbe0eb146ce5cbc40e3ac67bf4d0e5465dcc2f Signed-off-by: Levi Oliver <levio@google.com> Reviewed-on: https://chromium-review.googlesource.com/367732 Commit-Ready: Myles Watson <mylesgw@chromium.org> Reviewed-by: Aseda Aboagye <aaboagye@chromium.org> Reviewed-by: Myles Watson <mylesgw@chromium.org>
-rw-r--r--chip/nrf51/bluetooth_le.c22
-rw-r--r--chip/nrf51/bluetooth_le.h21
-rw-r--r--chip/nrf51/radio_test.h2
-rw-r--r--common/bluetooth_le.c7
-rw-r--r--common/btle_ll.c4
-rw-r--r--include/bluetooth_le.h3
6 files changed, 34 insertions, 25 deletions
diff --git a/chip/nrf51/bluetooth_le.c b/chip/nrf51/bluetooth_le.c
index 077f3317f3..08a4a26b5f 100644
--- a/chip/nrf51/bluetooth_le.c
+++ b/chip/nrf51/bluetooth_le.c
@@ -74,33 +74,31 @@ struct nrf51_ble_packet_t on_air_packet;
struct ble_pdu rcv_packet;
-int ble_radio_init(void)
+int ble_radio_init(uint32_t access_address, uint32_t crc_init_val)
{
int rv = radio_init(BLE_1MBIT);
if (rv)
return rv;
-
NRF51_RADIO_CRCCNF = 3 | NRF51_RADIO_CRCCNF_SKIP_ADDR; /* 3-byte CRC */
/* x^24 + x^10 + x^9 + x^6 + x^4 + x^3 + x + 1 */
/* 0x1_0000_0000_0000_0110_0101_1011 */
NRF51_RADIO_CRCPOLY = 0x100065B;
- NRF51_RADIO_CRCINIT = 0x555555;
- NRF51_RADIO_TXPOWER = NRF51_RADIO_TXPOWER_0_DBM;
+ NRF51_RADIO_CRCINIT = crc_init_val;
- NRF51_RADIO_BASE0 = BLE_ADV_ACCESS_ADDRESS << 8;
+ NRF51_RADIO_TXPOWER = NRF51_RADIO_TXPOWER_0_DBM;
- NRF51_RADIO_PREFIX0 = BLE_ADV_ACCESS_ADDRESS >> 24;
+ NRF51_RADIO_BASE0 = access_address << 8;
+ NRF51_RADIO_PREFIX0 = access_address >> 24;
NRF51_RADIO_TXADDRESS = 0;
NRF51_RADIO_RXADDRESSES = 1;
-
- NRF51_RADIO_PCNF0 = NRF51_RADIO_PCNF0_ADV;
-
- NRF51_RADIO_PCNF1 = NRF51_RADIO_PCNF1_ADV;
+ NRF51_RADIO_PCNF0 = NRF51_RADIO_PCNF0_ADV_DATA;
+ NRF51_RADIO_PCNF1 = NRF51_RADIO_PCNF0_ADV_DATA;
return rv;
+
}
static struct nrf51_ble_packet_t tx_packet;
@@ -380,7 +378,7 @@ static int command_ble_adv(int argc, char **argv)
CPRINTS("type DIRECT needs to have a length of 12");
}
- rv = ble_radio_init();
+ rv = ble_radio_init(BLE_ADV_ACCESS_ADDRESS, BLE_ADV_CRCINIT);
CPRINTS("ADV @%p", &adv_packet);
@@ -436,7 +434,7 @@ static int command_ble_adv_scan(int argc, char **argv)
addr_lsbyte = -1;
}
- rv = ble_radio_init();
+ rv = ble_radio_init(BLE_ADV_ACCESS_ADDRESS, BLE_ADV_CRCINIT);
/* Change channel */
NRF51_RADIO_FREQUENCY = NRF51_RADIO_FREQUENCY_VAL(chan2freq(chan));
diff --git a/chip/nrf51/bluetooth_le.h b/chip/nrf51/bluetooth_le.h
index 8a746f39d7..d438259aac 100644
--- a/chip/nrf51/bluetooth_le.h
+++ b/chip/nrf51/bluetooth_le.h
@@ -13,20 +13,21 @@
#define NRF51_BLE_S0_BYTES 1
#define NRF51_BLE_S1_BITS 0 /* no s1 field */
-#define NRF51_RADIO_PCNF0_ADV NRF51_RADIO_PCNF0_VAL(NRF51_BLE_LENGTH_BITS, \
- NRF51_BLE_S0_BYTES, \
- NRF51_BLE_S1_BITS)
-
#define BLE_ACCESS_ADDRESS_BYTES 4
#define EXTRA_RECEIVE_BYTES 0
#define BLE_ADV_WHITEN 1
-#define NRF51_RADIO_PCNF1_ADV \
- NRF51_RADIO_PCNF1_VAL(BLE_MAX_ADV_PAYLOAD_OCTETS, \
- EXTRA_RECEIVE_BYTES, \
- BLE_ACCESS_ADDRESS_BYTES - 1, \
- BLE_ADV_WHITEN)
+/* Data and Advertisements have the same PCNF values */
+#define NRF51_RADIO_PCNF0_ADV_DATA \
+ NRF51_RADIO_PCNF0_VAL(NRF51_BLE_LENGTH_BITS, \
+ NRF51_BLE_S0_BYTES, \
+ NRF51_BLE_S1_BITS)
+#define NRF51_RADIO_PCNF1_ADV_DATA \
+ NRF51_RADIO_PCNF1_VAL(BLE_MAX_ADV_PAYLOAD_OCTETS, \
+ EXTRA_RECEIVE_BYTES, \
+ BLE_ACCESS_ADDRESS_BYTES - 1, \
+ BLE_ADV_WHITEN)
struct nrf51_ble_packet_t {
uint8_t s0; /* First byte */
@@ -41,7 +42,7 @@ struct nrf51_ble_config_t {
};
/* Initialize the nRF51 radio for BLE */
-int ble_radio_init(void);
+int ble_radio_init(uint32_t access_address, uint32_t crc_init_val);
/* Transmit pdu on the radio */
void ble_tx(struct ble_pdu *pdu);
diff --git a/chip/nrf51/radio_test.h b/chip/nrf51/radio_test.h
index b70a22d69a..591b78a78c 100644
--- a/chip/nrf51/radio_test.h
+++ b/chip/nrf51/radio_test.h
@@ -17,7 +17,7 @@
#define BLE_MAX_TEST_CHANNEL 39
#define BLE_MIN_TEST_CHANNEL 0
-#define NRF51_RADIO_PCNF0_TEST NRF51_RADIO_PCNF0_ADV
+#define NRF51_RADIO_PCNF0_TEST NRF51_RADIO_PCNF0_ADV_DATA
#define BLE_TEST_WHITEN 0
diff --git a/common/bluetooth_le.c b/common/bluetooth_le.c
index 78b2d934bd..5627a8de74 100644
--- a/common/bluetooth_le.c
+++ b/common/bluetooth_le.c
@@ -187,6 +187,13 @@ void dump_ble_packet(struct ble_pdu *ble_p)
else
mem_dump(ble_p->payload + curr_offs,
ble_p->header.adv.length - curr_offs);
+ } else { /* Data PDUs */
+ CPRINTF("BLE data packet @%p: LLID %d,"
+ " nesn %d, sn %d, md %d, length %d\n",
+ ble_p, ble_p->header.data.llid, ble_p->header.data.nesn,
+ ble_p->header.data.sn, ble_p->header.data.md,
+ ble_p->header.data.length);
+ mem_dump(ble_p->payload, ble_p->header.data.length);
}
}
diff --git a/common/btle_ll.c b/common/btle_ll.c
index d1c888038f..28e2c44ac3 100644
--- a/common/btle_ll.c
+++ b/common/btle_ll.c
@@ -147,7 +147,8 @@ static uint8_t ll_state_change_request(enum ll_state_t next_state)
{
/* Initialize the radio if it hasn't been initialized */
if (ll_state == UNINITIALIZED) {
- if (ble_radio_init() != EC_SUCCESS)
+ if (ble_radio_init(BLE_ADV_ACCESS_ADDRESS, BLE_ADV_CRCINIT)
+ != EC_SUCCESS)
return HCI_ERR_Hardware_Failure;
ll_state = STANDBY;
}
@@ -410,6 +411,7 @@ struct ble_pdu ll_rcv_packet;
int ble_ll_adv(int chan)
{
int rv;
+
/* Change channel */
NRF51_RADIO_FREQUENCY = NRF51_RADIO_FREQUENCY_VAL(chan2freq(chan));
NRF51_RADIO_DATAWHITEIV = chan;
diff --git a/include/bluetooth_le.h b/include/bluetooth_le.h
index 814e3673fc..46c17ac0bc 100644
--- a/include/bluetooth_le.h
+++ b/include/bluetooth_le.h
@@ -133,6 +133,7 @@ struct ble_adv_header {
#define BLE_RANDOM_ADDR_MSBS_STATIC 0xC0
#define BLE_ADV_ACCESS_ADDRESS 0x8E89BED6
+#define BLE_ADV_CRCINIT 0x555555
#define BLE_MAX_ADV_PAYLOAD_OCTETS 37
@@ -366,7 +367,7 @@ void ble_tx(struct ble_pdu *pdu);
int ble_rx(struct ble_pdu *pdu, int timeout, int adv);
-int ble_radio_init(void);
+int ble_radio_init(uint32_t access_address, uint32_t crc_init_val);
/* BLE 4.1 Vol 6 4.5.8 */
int select_data_channel(struct remapping_table *rt);