@@ -29,7 +29,7 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi
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, PullNone , 1 ),
33
33
host_wake_irq_event (host_wake_irq),
34
34
dev_wake_irq_event (dev_wake_irq)
35
35
{
@@ -61,9 +61,10 @@ CyH4TransportDriver::~CyH4TransportDriver()
61
61
62
62
void CyH4TransportDriver::bt_host_wake_irq_handler (void )
63
63
{
64
- sleep_manager_lock_deep_sleep ();
65
- CyH4TransportDriver::on_controller_irq ();
66
- sleep_manager_unlock_deep_sleep ();
64
+ uart.attach (
65
+ callback (this , &CyH4TransportDriver::on_controller_irq),
66
+ SerialBase::RxIrq
67
+ );
67
68
}
68
69
69
70
void CyH4TransportDriver::initialize ()
@@ -72,6 +73,8 @@ void CyH4TransportDriver::initialize()
72
73
InterruptIn *host_wake_pin;
73
74
#endif
74
75
76
+ sleep_manager_lock_deep_sleep ();
77
+
75
78
uart.format (
76
79
/* bits */ 8 ,
77
80
/* parity */ SerialBase::None,
@@ -90,12 +93,14 @@ void CyH4TransportDriver::initialize()
90
93
);
91
94
92
95
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
93
- // Register IRQ for Host WAKE
94
- host_wake_pin = new InterruptIn (bt_host_wake_name);
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));
96
+ if (bt_host_wake_name != NC) {
97
+ // Register IRQ for Host WAKE
98
+ host_wake_pin = new InterruptIn (bt_host_wake_name);
99
+ if (host_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
100
+ host_wake_pin->fall (callback (this , &CyH4TransportDriver::bt_host_wake_irq_handler));
101
+ } else {
102
+ host_wake_pin->rise (callback (this , &CyH4TransportDriver::bt_host_wake_irq_handler));
103
+ }
99
104
}
100
105
101
106
#endif
@@ -106,6 +111,7 @@ void CyH4TransportDriver::initialize()
106
111
if (bt_device_wake_name != NC)
107
112
bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
108
113
}
114
+ sleep_manager_unlock_deep_sleep ();
109
115
rtos::ThisThread::sleep_for (500 );
110
116
}
111
117
@@ -115,6 +121,7 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData)
115
121
{
116
122
uint16_t i = 0 ;
117
123
124
+ sleep_manager_lock_deep_sleep ();
118
125
assert_bt_dev_wake ();
119
126
120
127
while (i < len + 1 ) {
@@ -125,44 +132,67 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData)
125
132
}
126
133
127
134
deassert_bt_dev_wake ();
135
+ sleep_manager_unlock_deep_sleep ();
128
136
return len;
129
137
}
130
138
139
+ #if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
140
+ void CyH4TransportDriver::on_host_stack_inactivity ()
141
+ {
142
+ if (enabled_powersave) {
143
+ uart.attach (NULL , SerialBase::RxIrq);
144
+ }
145
+ }
146
+ #endif
147
+
131
148
void CyH4TransportDriver::on_controller_irq ()
132
149
{
133
- assert_bt_dev_wake ();
150
+ sleep_manager_lock_deep_sleep ();
151
+ assert_bt_dev_wake ();
134
152
135
- while (uart.readable ()) {
153
+ while (uart.readable ()) {
136
154
uint8_t char_received = uart.getc ();
137
155
on_data_received (&char_received, 1 );
138
156
}
139
157
140
- deassert_bt_dev_wake ();
158
+ deassert_bt_dev_wake ();
159
+ sleep_manager_unlock_deep_sleep ();
141
160
}
142
161
143
162
void CyH4TransportDriver::assert_bt_dev_wake ()
144
163
{
145
164
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
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;
165
+ if (enabled_powersave) {
166
+ if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
167
+ bt_device_wake = WAKE_EVENT_ACTIVE_LOW;
168
+ } else {
169
+ bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
170
+ }
150
171
}
151
172
#endif
152
173
}
153
174
154
175
void CyH4TransportDriver::deassert_bt_dev_wake ()
155
176
{
156
177
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
157
- // De-assert bt_device_wake
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;
178
+ if (enabled_powersave) {
179
+ wait_us (5000 ); /* remove and replace when uart tx transmit complete api is available */
180
+ // De-assert bt_device_wake
181
+ if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
182
+ bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
183
+ } else {
184
+ bt_device_wake = WAKE_EVENT_ACTIVE_LOW;
185
+ }
162
186
}
163
187
#endif
164
188
}
165
189
190
+
191
+ void CyH4TransportDriver::update_uart_baud_rate (int baud)
192
+ {
193
+ uart.baud (baud);
194
+ }
195
+
166
196
bool CyH4TransportDriver::get_enabled_powersave ()
167
197
{
168
198
return (enabled_powersave);
0 commit comments