Mistake on this page?
Report an issue in GitHub or email us
CyH4TransportDriver.h
1 /* mbed Microcontroller Library
2  * Copyright (c) 2017-2017 ARM Limited
3  * SPDX-License-Identifier: Apache-2.0
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 #ifndef CY_H4TRANSPORT_DRIVER_H_
19 #define CY_H4TRANSPORT_DRIVER_H_
20 
21 #if (DEVICE_SERIAL && DEVICE_SERIAL_FC) || defined(DOXYGEN_ONLY)
22 
23 #include <stdint.h>
24 #include "ble/driver/CordioHCITransportDriver.h"
25 #include "drivers/DigitalInOut.h"
26 #include "cyhal_uart.h"
27 
28 namespace ble {
29 namespace vendor {
30 namespace cypress_ble {
31 
32 using namespace ble::vendor;
33 
34 /**
35  * Implementation of the H4 driver over Cypress based chips.
36  */
38 public:
39  /**
40  * Initialize the transport driver.
41  *
42  */
43  CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, int baud, PinName bt_host_wake_name, PinName bt_device_wake_name,
44  uint8_t host_wake_irq = 0, uint8_t dev_wake_irq = 0);
45  CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, int baud);
46 
47  /**
48  * Destructor
49  */
50  virtual ~CyH4TransportDriver();
51 
52  /**
53  * @see CordioHCITransportDriver::initialize
54  */
55  virtual void initialize();
56 
57  /**
58  * @see CordioHCITransportDriver::terminate
59  */
60  virtual void terminate();
61 
62  /**
63  * @see CordioHCITransportDriver::write
64  */
65  virtual uint16_t write(uint8_t type, uint16_t len, uint8_t *pData);
66 
67  void bt_host_wake_rise_irq_handler();
68  void bt_host_wake_fall_irq_handler();
69 
70 #if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
71  void on_host_stack_inactivity();
72 #endif
73 
74  void update_uart_baud_rate(int baud);
75 
76  bool get_enabled_powersave();
77  uint8_t get_host_wake_irq_event();
78  uint8_t get_dev_wake_irq_event();
79 
80 private:
81  void assert_bt_dev_wake();
82  void deassert_bt_dev_wake();
83 
84  // Use HAL serial because Cypress UART is buffered.
85  // The PUTC function does not actually blocks until data is fully transmitted,
86  // it only blocks until data gets into HW buffer.
87  // The UART APIs prevents sleep while there are data in the HW buffer.
88  // However UART APIs does not prevent the BT radio from going to sleep.
89  // Use the HAL APIs to prevent the radio from going to sleep until UART transmition is complete.
90  // Mbed layer has no API that distinguish between data in HW buffer v.s. data already transmitted.
91 
92  cyhal_uart_t uart;
93  PinName cts;
94  PinName rts;
95  PinName bt_host_wake_name;
96  PinName bt_device_wake_name;
97 
98  mbed::DigitalInOut bt_host_wake;
99  mbed::DigitalInOut bt_device_wake;
100  bool bt_host_wake_active;
101 
102  bool enabled_powersave;
103  uint8_t host_wake_irq_event;
104  uint8_t dev_wake_irq_event;
105 
106  bool holding_deep_sleep_lock;
107 
108 };
109 
110 } // namespace cypress
111 } // namespace vendor
112 } // namespace ble
113 
114 #define DEF_BT_BAUD_RATE (115200)
115 #define DEF_BT_3M_BAUD_RATE (3000000) /* Both Host and BT device have to be adapt to this */
116 
117 #define WAKE_EVENT_ACTIVE_HIGH ( 1 ) /* Interrupt Rising Edge */
118 #define WAKE_EVENT_ACTIVE_LOW ( 0 ) /* Interrupt Falling Edge */
119 
120 ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_default_h4_transport_driver();
121 ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_h4_transport_driver();
122 #endif
123 #endif /* CY_H4TRANSPORT_DRIVER_H_ */
Base class of the HCI transport driver.
Implementation of the H4 driver over Cypress based chips.
A digital input/output, used for setting or reading a bi-directional pin.
Definition: DigitalInOut.h:35
Entry namespace for all BLE API definitions.
Important Information for this Arm website

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.