diff options
author | Levi Oliver <levio@google.com> | 2016-08-09 14:55:41 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-08-11 14:46:32 -0700 |
commit | bf302b55e9973a5c6e3e59722a9d3062e7936832 (patch) | |
tree | d3de6d5c8f90bbaffded93a3747d078fbde83b25 | |
parent | ef6e93dc1bbf92821c9d3ff149f691fbdad1c015 (diff) | |
download | chrome-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.c | 22 | ||||
-rw-r--r-- | chip/nrf51/bluetooth_le.h | 21 | ||||
-rw-r--r-- | chip/nrf51/radio_test.h | 2 | ||||
-rw-r--r-- | common/bluetooth_le.c | 7 | ||||
-rw-r--r-- | common/btle_ll.c | 4 | ||||
-rw-r--r-- | include/bluetooth_le.h | 3 |
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); |