@@ -34,6 +34,7 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi
34
34
dev_wake_irq_event (dev_wake_irq)
35
35
{
36
36
enabled_powersave = true ;
37
+ bt_host_wake_active = false ;
37
38
}
38
39
39
40
CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, int baud) :
@@ -46,6 +47,7 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi
46
47
bt_device_wake (bt_device_wake_name)
47
48
{
48
49
enabled_powersave = false ;
50
+ bt_host_wake_active = false ;
49
51
sleep_manager_lock_deep_sleep ();
50
52
holding_deep_sleep_lock = true ;
51
53
}
@@ -59,12 +61,36 @@ CyH4TransportDriver::~CyH4TransportDriver()
59
61
}
60
62
}
61
63
62
- void CyH4TransportDriver::bt_host_wake_irq_handler (void )
64
+ void CyH4TransportDriver::bt_host_wake_rise_irq_handler (void )
63
65
{
64
- uart.attach (
65
- callback (this , &CyH4TransportDriver::on_controller_irq),
66
- SerialBase::RxIrq
67
- );
66
+ if (host_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
67
+ if (bt_host_wake_active == true )
68
+ {
69
+ /* lock PSoC 6 DeepSleep entry as long as host_wake is asserted */
70
+ sleep_manager_unlock_deep_sleep ();
71
+ bt_host_wake_active = false ;
72
+ }
73
+ } else {
74
+ /* lock PSoC 6 DeepSleep entry as long as host_wake is asserted */
75
+ sleep_manager_lock_deep_sleep ();
76
+ bt_host_wake_active = true ;
77
+ }
78
+ }
79
+
80
+ void CyH4TransportDriver::bt_host_wake_fall_irq_handler (void )
81
+ {
82
+ if (host_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
83
+ /* lock PSoC 6 DeepSleep entry as long as host_wake is asserted */
84
+ sleep_manager_lock_deep_sleep ();
85
+ bt_host_wake_active = true ;
86
+ } else {
87
+ if (bt_host_wake_active == true )
88
+ {
89
+ /* lock PSoC 6 DeepSleep entry as long as host_wake is asserted */
90
+ sleep_manager_unlock_deep_sleep ();
91
+ bt_host_wake_active = false ;
92
+ }
93
+ }
68
94
}
69
95
70
96
void CyH4TransportDriver::initialize ()
@@ -92,17 +118,15 @@ void CyH4TransportDriver::initialize()
92
118
SerialBase::RxIrq
93
119
);
94
120
121
+ sleep_manager_unlock_deep_sleep ();
122
+
95
123
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
96
124
if (bt_host_wake_name != NC) {
97
125
// Register IRQ for Host WAKE
98
126
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
- }
127
+ host_wake_pin->fall (callback (this , &CyH4TransportDriver::bt_host_wake_fall_irq_handler));
128
+ host_wake_pin->rise (callback (this , &CyH4TransportDriver::bt_host_wake_rise_irq_handler));
104
129
}
105
-
106
130
#endif
107
131
if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
108
132
if (bt_device_wake_name != NC)
@@ -136,26 +160,15 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData)
136
160
return len;
137
161
}
138
162
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
-
148
163
void CyH4TransportDriver::on_controller_irq ()
149
164
{
150
165
sleep_manager_lock_deep_sleep ();
151
- assert_bt_dev_wake ();
152
166
153
167
while (uart.readable ()) {
154
168
uint8_t char_received = uart.getc ();
155
169
on_data_received (&char_received, 1 );
156
170
}
157
171
158
- deassert_bt_dev_wake ();
159
172
sleep_manager_unlock_deep_sleep ();
160
173
}
161
174
0 commit comments