ESP32のBluetooth

ESP32のBluetoothについて調べてみました。

(使い方については調べていません。アーキテクチャについて知りたかったので調べました。)

プロトコルスタックにBluedroidを使っています。

Bluedroidは、Android 4.2 から Android 5.1で利用されていたBluetoothプロトコルスタックです。

# Bluetooth hardware

* ESP32 supports BR/BLE dual mode.
* ```RivieraWaves Bluetooth dual mode technology in its new ESP32 chip.```
* http://ceva-dsp.mediaroom.com/2016-10-26-Espressif-Licenses-and-Deploys-CEVA-Bluetooth-in-ESP32-IoT-Chip
* RivieraWaves's names are  "RW-BTDM-BB" and "RW-BTDM-RF".

# Bluetooth software

## VHCI
* send HCI coomand and recieve HCI response.
* https://github.com/espressif/esp-idf/blob/master/components/bt/include/bt.h

* API

```
/** @brief esp_vhci_host_send_packet
 * host send packet to controller
 * @param data the packet point
 *,@param len the packet length
 */
void esp_vhci_host_send_packet(uint8_t *data, uint16_t len);

int (*notify_host_recv)(uint8_t *data, uint16_t len);   /*!< callback used to notify that the controller has a packet to send to the host*/
```

```
static uint8_t hci_cmd_buf[128];

static uint16_t make_cmd_reset(uint8_t *buf) 
{
    UINT8_TO_STREAM (buf, H4_TYPE_COMMAND);
    UINT16_TO_STREAM (buf, HCI_RESET);
    UINT8_TO_STREAM (buf, 0);
    return HCI_H4_CMD_PREAMBLE_SIZE;
}

static void hci_cmd_send_reset(void)
{
    uint16_t sz = make_cmd_reset (hci_cmd_buf);
    esp_vhci_host_send_packet(hci_cmd_buf, sz);
}
```


## Bluedroid
* ESP32 use Bluedroid.
* BLE only, not support BR/EDR. 
* [component/bt: add bluedroid 1st version](https://github.com/espressif/esp-idf/commit/b80325604d578a1ea99ef34c0f64321a0f9b97ff)

```
1. add bluedroid 1st version
2. alarm adapter
3. task semaphore lock
4. other bugs resolved
```
* APIは、BluedroidのAPIをラッピングして提供しています。

* どのバージョンのBluedroidから派生しているか調べる。たぶん、Android 5.1のどこか。

* Tasks


| Task name | Priority | Stack size | Description | Code |
|:-:|:-:|:-:|:-:|:-:|
| Btc_task  | 20 | 2048 | Upper layer interface  |[btc_task.c](https://github.com/espressif/esp-idf/blob/master/components/bt/bluedroid/btc/core/btc_task.c)|
| btuT      | 21 | 1500 | BLE protocol  |[btu_task.c](https://github.com/espressif/esp-idf/blob/master/components/bt/bluedroid/stack/btu/btu_task.c)|
| hciHostT  | 23 | 1500 | HCI generate/analyze     |[hci_layer.c](https://github.com/espressif/esp-idf/blob/master/components/bt/bluedroid/hci/hci_layer.c)|
| hciH4T    | 22 | 1500 | HCI Tx/Rx         |[hci_hal_h4.c](https://github.com/espressif/esp-idf/blob/master/components/bt/bluedroid/hci/hci_hal_h4.c)|

* Memory allocation  
 * Original の Bluedroidでは、メモリプールを使っていたが、esp32では、osi_malloc()を使ってHEAPからdynamicに確保している。
 * Original の Bluedroidでは、各メモリプールのサイズと個数を管理していたが、esp32では管理していない。
 * なので、ある程度の時間が経過すると「HEAPのフラグメンテーションが発生して、メモリが確保できなくる」という問題が発生する可能性があります。

```
Bluetooth protocol stack uses GKI_getbuf() and GKI_getpoolbuf().

GKI_getbuf() -> osi_malloc() -> calloc()
GKI_getpoolbuf() -> GKI_betbuf() -> osi_malloc() -> calloc()
```


# Bluetooth qualification

* Chipはdual modeで認証、Host StackはBLEのみで認証。

## D032523 ESP32 Bluetooth Chip
* [D032523](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=32523) 
* [ICS](https://www.bluetooth.org/tpg/showCorePICS.cfm?3A000A5A005C5246545C5714403B0C0D0E2405022413010E57503F202A5A7A5B574C58)
* September/14/2016
* 4.2

```
Baseband	 
Radio	 
Link Manager	 
Host Controller Interface	 
RF PHY	 
Link Layer	 
4.0 Host Controller Interface
```

## D033986 ESP32 BLE Host Stack
* [D033986](https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=33986) 
* [ICS](https://www.bluetooth.org/tpg/showCorePICS.cfm?3A000A5A005C524758565214403B0C0D0E2405022413010E57503F202A5A7B5D584D58)
* January/13/2017
* 4.2

```
Logical Link Control and Adaptation Protocol	 
Generic Access Profile	 
Attribute Protocol
Security Manager Protocol	 
Device Information Service	 
Find Me Profile
Immediate Alert
Link Loss Service
Proximity Profile	
Tx Power Service
Battery Service
HID Service
HID over GATT
```

# Radio certification

* https://fccid.io/2AC7Z-ESPWROOM32
* http://akizukidenshi.com/download/ds/espressifsystems/Espressif_211-161007_MIC_Radio_Certificate.pdf