18
18
#if DEVICE_SERIAL && DEVICE_SERIAL_FC
19
19
20
20
#include " CyH4TransportDriver.h"
21
- #include " cycfg_pins.h"
22
21
23
22
namespace ble {
24
23
namespace vendor {
25
24
namespace cypress_ble {
26
25
27
- CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, int baud, PinName bt_host_wake_name, PinName bt_device_wake_name) :
26
+
27
+ CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, int baud, PinName bt_host_wake_name, PinName bt_device_wake_name, uint8_t host_wake_irq, uint8_t dev_wake_irq) :
28
28
uart (tx, rx, baud), cts(cts), rts(rts),
29
29
bt_host_wake_name (bt_host_wake_name),
30
30
bt_device_wake_name (bt_device_wake_name),
31
31
bt_host_wake (bt_host_wake_name, PIN_INPUT, PullNone, 0 ),
32
- bt_device_wake (bt_device_wake_name, PIN_OUTPUT, PullDefault, 1 )
32
+ bt_device_wake (bt_device_wake_name, PIN_OUTPUT, PullDefault, 1 ),
33
+ host_wake_irq_event (host_wake_irq),
34
+ dev_wake_irq_event (dev_wake_irq)
33
35
{
36
+ enabled_powersave = true ;
37
+ }
38
+
39
+ CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, int baud) :
40
+ uart (tx, rx, baud),
41
+ cts (cts),
42
+ rts (rts),
43
+ bt_host_wake_name (NC),
44
+ bt_device_wake_name (NC),
45
+ bt_host_wake (bt_host_wake_name),
46
+ bt_device_wake (bt_device_wake_name)
47
+ {
48
+ enabled_powersave = false ;
49
+ sleep_manager_lock_deep_sleep ();
50
+ holding_deep_sleep_lock = true ;
51
+ }
52
+
53
+ CyH4TransportDriver::~CyH4TransportDriver ()
54
+ {
55
+ if (holding_deep_sleep_lock)
56
+ {
57
+ sleep_manager_unlock_deep_sleep ();
58
+ holding_deep_sleep_lock = false ;
59
+ }
34
60
}
35
61
36
62
void CyH4TransportDriver::bt_host_wake_irq_handler (void )
37
63
{
38
- sleep_manager_lock_deep_sleep ();
39
- CyH4TransportDriver::on_controller_irq ();
40
- sleep_manager_unlock_deep_sleep ();
64
+ sleep_manager_lock_deep_sleep ();
65
+ CyH4TransportDriver::on_controller_irq ();
66
+ sleep_manager_unlock_deep_sleep ();
41
67
}
42
68
43
69
void CyH4TransportDriver::initialize ()
44
70
{
71
+ #if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
45
72
InterruptIn *host_wake_pin;
73
+ #endif
46
74
47
75
uart.format (
48
76
/* bits */ 8 ,
@@ -64,10 +92,20 @@ void CyH4TransportDriver::initialize()
64
92
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
65
93
// Register IRQ for Host WAKE
66
94
host_wake_pin = new InterruptIn (bt_host_wake_name);
67
- host_wake_pin->fall (callback (this , &CyH4TransportDriver::bt_host_wake_irq_handler));
95
+ if (host_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
96
+ host_wake_pin->fall (callback (this , &CyH4TransportDriver::bt_host_wake_irq_handler));
97
+ } else {
98
+ host_wake_pin->rise (callback (this , &CyH4TransportDriver::bt_host_wake_irq_handler));
99
+ }
68
100
69
101
#endif
70
- bt_device_wake = 0 ;
102
+ if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
103
+ if (bt_device_wake_name != NC)
104
+ bt_device_wake = WAKE_EVENT_ACTIVE_LOW;
105
+ } else {
106
+ if (bt_device_wake_name != NC)
107
+ bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
108
+ }
71
109
wait_ms (500 );
72
110
}
73
111
@@ -105,20 +143,67 @@ void CyH4TransportDriver::on_controller_irq()
105
143
void CyH4TransportDriver::assert_bt_dev_wake ()
106
144
{
107
145
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
108
- bt_device_wake = 0 ;
146
+ if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
147
+ bt_device_wake = WAKE_EVENT_ACTIVE_LOW;
148
+ } else {
149
+ bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
150
+ }
109
151
#endif
110
152
}
111
153
112
154
void CyH4TransportDriver::deassert_bt_dev_wake ()
113
155
{
114
156
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
115
157
// De-assert bt_device_wake
116
- bt_device_wake = 1 ;
158
+ if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
159
+ bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
160
+ } else {
161
+ bt_device_wake = WAKE_EVENT_ACTIVE_LOW;
162
+ }
117
163
#endif
118
164
}
119
165
166
+ bool CyH4TransportDriver::get_enabled_powersave ()
167
+ {
168
+ return (enabled_powersave);
169
+ }
170
+
171
+ uint8_t CyH4TransportDriver::get_host_wake_irq_event ()
172
+ {
173
+ return (host_wake_irq_event);
174
+ }
175
+
176
+ uint8_t CyH4TransportDriver::get_dev_wake_irq_event ()
177
+ {
178
+ return (dev_wake_irq_event);
179
+ }
180
+
181
+
120
182
} // namespace cypress_ble
121
183
} // namespace vendor
122
184
} // namespace ble
123
185
186
+ ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_default_h4_transport_driver ()
187
+ {
188
+ #if (defined(CYBSP_BT_HOST_WAKE) && defined(CYBSP_BT_DEVICE_WAKE))
189
+ static ble::vendor::cypress_ble::CyH4TransportDriver s_transport_driver (
190
+ /* TX */ CYBSP_BT_UART_TX, /* RX */ CYBSP_BT_UART_RX,
191
+ /* cts */ CYBSP_BT_UART_CTS, /* rts */ CYBSP_BT_UART_RTS, DEF_BT_BAUD_RATE,
192
+ CYBSP_BT_HOST_WAKE, CYBSP_BT_DEVICE_WAKE
193
+ );
194
+
195
+ #else
196
+ static ble::vendor::cypress_ble::CyH4TransportDriver s_transport_driver (
197
+ /* TX */ CYBSP_BT_UART_TX, /* RX */ CYBSP_BT_UART_RX,
198
+ /* cts */ CYBSP_BT_UART_CTS, /* rts */ CYBSP_BT_UART_RTS, DEF_BT_BAUD_RATE);
199
+ #endif
200
+ return s_transport_driver;
201
+ }
202
+
203
+ MBED_WEAK
204
+ ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_h4_transport_driver ()
205
+ {
206
+ return (ble_cordio_get_default_h4_transport_driver ());
207
+ }
208
+
124
209
#endif
0 commit comments