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 "drivers/InterruptIn.h"
27 #include "cyhal_uart.h"
28 
29 namespace ble {
30 namespace vendor {
31 namespace cypress_ble {
32 
33 using namespace ble::vendor;
34 
35 /**
36  * Implementation of the H4 driver over Cypress based chips.
37  */
39 public:
40  /**
41  * Initialize the transport driver.
42  *
43  */
44  CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud, PinName bt_host_wake_name, PinName bt_device_wake_name,
45  uint8_t host_wake_irq = 0, uint8_t dev_wake_irq = 0);
46  CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud);
47 
48  /**
49  * Destructor
50  */
51  virtual ~CyH4TransportDriver();
52 
53  /**
54  * @see CordioHCITransportDriver::initialize
55  */
56  virtual void initialize();
57 
58  /**
59  * @see CordioHCITransportDriver::terminate
60  */
61  virtual void terminate();
62 
63  /**
64  * @see CordioHCITransportDriver::write
65  */
66  virtual uint16_t write(uint8_t type, uint16_t len, uint8_t *pData);
67 
68  void bt_host_wake_rise_irq_handler();
69  void bt_host_wake_fall_irq_handler();
70 
71 #if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
72  void on_host_stack_inactivity();
73 #endif
74 
75  void update_uart_baud_rate(int baud);
76 
77  bool get_enabled_powersave();
78  uint8_t get_host_wake_irq_event();
79  uint8_t get_dev_wake_irq_event();
80 
81 private:
82  void assert_bt_dev_wake();
83  void deassert_bt_dev_wake();
84 
85  // Use HAL serial because Cypress UART is buffered.
86  // The PUTC function does not actually blocks until data is fully transmitted,
87  // it only blocks until data gets into HW buffer.
88  // The UART APIs prevents sleep while there are data in the HW buffer.
89  // However UART APIs does not prevent the BT radio from going to sleep.
90  // Use the HAL APIs to prevent the radio from going to sleep until UART transmition is complete.
91  // Mbed layer has no API that distinguish between data in HW buffer v.s. data already transmitted.
92 
93  cyhal_uart_t uart;
94  PinName cts;
95  PinName rts;
96  PinName tx;
97  PinName rx;
98  PinName bt_host_wake_name;
99  PinName bt_device_wake_name;
100 
101  mbed::DigitalInOut bt_power;
102  mbed::DigitalInOut bt_host_wake;
103  mbed::DigitalInOut bt_device_wake;
104 
105  bool bt_host_wake_active;
106 
107 #if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
108  mbed::InterruptIn *host_wake_pin;
109 #endif
110 
111  bool enabled_powersave;
112  uint8_t host_wake_irq_event;
113  uint8_t dev_wake_irq_event;
114 
115  bool holding_deep_sleep_lock;
116 };
117 
118 } // namespace cypress
119 } // namespace vendor
120 } // namespace ble
121 
122 #define DEF_BT_BAUD_RATE (115200)
123 #define DEF_BT_3M_BAUD_RATE (3000000) /* Both Host and BT device have to be adapt to this */
124 
125 #define WAKE_EVENT_ACTIVE_HIGH ( 1 ) /* Interrupt Rising Edge */
126 #define WAKE_EVENT_ACTIVE_LOW ( 0 ) /* Interrupt Falling Edge */
127 
128 ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_default_h4_transport_driver();
129 ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_h4_transport_driver();
130 #endif
131 #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
A digital interrupt input, used to call a function on a rising or falling edge.
Definition: InterruptIn.h:65
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.