Skip to content

Commit d9a141e

Browse files
authored
Merge pull request #11518 from MukundGitHub/origin
Cypress Cordio Driver Update
2 parents c3aedbf + 57d4103 commit d9a141e

File tree

3 files changed

+175
-30
lines changed

3 files changed

+175
-30
lines changed

features/FEATURE_BLE/targets/TARGET_Cypress/TARGET_CYW43XXX/CyH4TransportDriver.cpp

Lines changed: 52 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

6262
void 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

6970
void 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+
131148
void 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

143162
void 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

154175
void 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+
166196
bool CyH4TransportDriver::get_enabled_powersave()
167197
{
168198
return (enabled_powersave);

features/FEATURE_BLE/targets/TARGET_Cypress/TARGET_CYW43XXX/CyH4TransportDriver.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ class CyH4TransportDriver : public cordio::CordioHCITransportDriver {
6666

6767
void bt_host_wake_irq_handler();
6868

69+
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
70+
void on_host_stack_inactivity();
71+
#endif
72+
73+
void update_uart_baud_rate(int baud);
74+
6975
bool get_enabled_powersave();
7076
uint8_t get_host_wake_irq_event();
7177
uint8_t get_dev_wake_irq_event();
@@ -101,10 +107,15 @@ class CyH4TransportDriver : public cordio::CordioHCITransportDriver {
101107
} // namespace ble
102108

103109
#define DEF_BT_BAUD_RATE (115200)
110+
#define DEF_BT_3M_BAUD_RATE (3000000) /* Both Host and BT device have to be adapt to this */
104111

105112
#define WAKE_EVENT_ACTIVE_HIGH ( 1 ) /* Interrupt Rising Edge */
106113
#define WAKE_EVENT_ACTIVE_LOW ( 0 ) /* Interrupt Falling Edge */
107114

115+
#if (defined(TARGET_CY8CPROTO_062_4343W))
116+
#define BT_UART_NO_3M_SUPPORT ( 1 )
117+
#endif
118+
108119
ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_default_h4_transport_driver();
109120
ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_h4_transport_driver();
110121
#endif

0 commit comments

Comments
 (0)