@@ -29,7 +29,7 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi
2929 bt_host_wake_name (bt_host_wake_name),
3030 bt_device_wake_name (bt_device_wake_name),
3131 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 ),
3333 host_wake_irq_event (host_wake_irq),
3434 dev_wake_irq_event (dev_wake_irq)
3535{
@@ -61,9 +61,10 @@ CyH4TransportDriver::~CyH4TransportDriver()
6161
6262void CyH4TransportDriver::bt_host_wake_irq_handler (void )
6363{
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+ );
6768}
6869
6970void CyH4TransportDriver::initialize ()
@@ -72,6 +73,8 @@ void CyH4TransportDriver::initialize()
7273 InterruptIn *host_wake_pin;
7374#endif
7475
76+ sleep_manager_lock_deep_sleep ();
77+
7578 uart.format (
7679 /* bits */ 8 ,
7780 /* parity */ SerialBase::None,
@@ -90,12 +93,14 @@ void CyH4TransportDriver::initialize()
9093 );
9194
9295#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+ }
99104 }
100105
101106#endif
@@ -106,6 +111,7 @@ void CyH4TransportDriver::initialize()
106111 if (bt_device_wake_name != NC)
107112 bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
108113 }
114+ sleep_manager_unlock_deep_sleep ();
109115 rtos::ThisThread::sleep_for (500 );
110116}
111117
@@ -115,6 +121,7 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData)
115121{
116122 uint16_t i = 0 ;
117123
124+ sleep_manager_lock_deep_sleep ();
118125 assert_bt_dev_wake ();
119126
120127 while (i < len + 1 ) {
@@ -125,44 +132,67 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData)
125132 }
126133
127134 deassert_bt_dev_wake ();
135+ sleep_manager_unlock_deep_sleep ();
128136 return len;
129137}
130138
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+
131148void CyH4TransportDriver::on_controller_irq ()
132149{
133- assert_bt_dev_wake ();
150+ sleep_manager_lock_deep_sleep ();
151+ assert_bt_dev_wake ();
134152
135- while (uart.readable ()) {
153+ while (uart.readable ()) {
136154 uint8_t char_received = uart.getc ();
137155 on_data_received (&char_received, 1 );
138156 }
139157
140- deassert_bt_dev_wake ();
158+ deassert_bt_dev_wake ();
159+ sleep_manager_unlock_deep_sleep ();
141160}
142161
143162void CyH4TransportDriver::assert_bt_dev_wake ()
144163{
145164#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+ }
150171 }
151172#endif
152173}
153174
154175void CyH4TransportDriver::deassert_bt_dev_wake ()
155176{
156177#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+ }
162186 }
163187#endif
164188}
165189
190+
191+ void CyH4TransportDriver::update_uart_baud_rate (int baud)
192+ {
193+ uart.baud (baud);
194+ }
195+
166196bool CyH4TransportDriver::get_enabled_powersave ()
167197{
168198 return (enabled_powersave);
0 commit comments