Skip to content

Cypress Cordio Driver Update #11518

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Sep 30, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi
bt_host_wake_name(bt_host_wake_name),
bt_device_wake_name(bt_device_wake_name),
bt_host_wake(bt_host_wake_name, PIN_INPUT, PullNone, 0),
bt_device_wake(bt_device_wake_name, PIN_OUTPUT, PullDefault, 1),
bt_device_wake(bt_device_wake_name, PIN_OUTPUT, PullNone, 1),
host_wake_irq_event(host_wake_irq),
dev_wake_irq_event(dev_wake_irq)
{
Expand Down Expand Up @@ -61,9 +61,10 @@ CyH4TransportDriver::~CyH4TransportDriver()

void CyH4TransportDriver::bt_host_wake_irq_handler(void)
{
sleep_manager_lock_deep_sleep();
CyH4TransportDriver::on_controller_irq();
sleep_manager_unlock_deep_sleep();
uart.attach(
callback(this, &CyH4TransportDriver::on_controller_irq),
SerialBase::RxIrq
);
}

void CyH4TransportDriver::initialize()
Expand All @@ -72,6 +73,8 @@ void CyH4TransportDriver::initialize()
InterruptIn *host_wake_pin;
#endif

sleep_manager_lock_deep_sleep();

uart.format(
/* bits */ 8,
/* parity */ SerialBase::None,
Expand All @@ -90,12 +93,14 @@ void CyH4TransportDriver::initialize()
);

#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
//Register IRQ for Host WAKE
host_wake_pin = new InterruptIn(bt_host_wake_name);
if (host_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
host_wake_pin->fall(callback(this, &CyH4TransportDriver::bt_host_wake_irq_handler));
} else {
host_wake_pin->rise(callback(this, &CyH4TransportDriver::bt_host_wake_irq_handler));
if (bt_host_wake_name != NC) {
//Register IRQ for Host WAKE
host_wake_pin = new InterruptIn(bt_host_wake_name);
if (host_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
host_wake_pin->fall(callback(this, &CyH4TransportDriver::bt_host_wake_irq_handler));
} else {
host_wake_pin->rise(callback(this, &CyH4TransportDriver::bt_host_wake_irq_handler));
}
}

#endif
Expand All @@ -106,6 +111,7 @@ void CyH4TransportDriver::initialize()
if (bt_device_wake_name != NC)
bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
}
sleep_manager_unlock_deep_sleep();
rtos::ThisThread::sleep_for(500);
}

Expand All @@ -115,6 +121,7 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData)
{
uint16_t i = 0;

sleep_manager_lock_deep_sleep();
assert_bt_dev_wake();

while (i < len + 1) {
Expand All @@ -125,44 +132,67 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData)
}

deassert_bt_dev_wake();
sleep_manager_unlock_deep_sleep();
return len;
}

#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
void CyH4TransportDriver::on_host_stack_inactivity()
{
if (enabled_powersave) {
uart.attach(NULL, SerialBase::RxIrq);
}
}
#endif

void CyH4TransportDriver::on_controller_irq()
{
assert_bt_dev_wake();
sleep_manager_lock_deep_sleep();
assert_bt_dev_wake();

while (uart.readable()) {
while (uart.readable()) {
uint8_t char_received = uart.getc();
on_data_received(&char_received, 1);
}

deassert_bt_dev_wake();
deassert_bt_dev_wake();
sleep_manager_unlock_deep_sleep();
}

void CyH4TransportDriver::assert_bt_dev_wake()
{
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
bt_device_wake = WAKE_EVENT_ACTIVE_LOW;
} else {
bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
if (enabled_powersave) {
if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
bt_device_wake = WAKE_EVENT_ACTIVE_LOW;
} else {
bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
}
}
#endif
}

void CyH4TransportDriver::deassert_bt_dev_wake()
{
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
//De-assert bt_device_wake
if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
} else {
bt_device_wake = WAKE_EVENT_ACTIVE_LOW;
if (enabled_powersave) {
wait_us(5000); /* remove and replace when uart tx transmit complete api is available */
//De-assert bt_device_wake
if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
} else {
bt_device_wake = WAKE_EVENT_ACTIVE_LOW;
}
}
#endif
}


void CyH4TransportDriver::update_uart_baud_rate(int baud)
{
uart.baud(baud);
}

bool CyH4TransportDriver::get_enabled_powersave()
{
return (enabled_powersave);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,12 @@ class CyH4TransportDriver : public cordio::CordioHCITransportDriver {

void bt_host_wake_irq_handler();

#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
void on_host_stack_inactivity();
#endif

void update_uart_baud_rate(int baud);

bool get_enabled_powersave();
uint8_t get_host_wake_irq_event();
uint8_t get_dev_wake_irq_event();
Expand Down Expand Up @@ -101,10 +107,15 @@ class CyH4TransportDriver : public cordio::CordioHCITransportDriver {
} // namespace ble

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

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

#if (defined(TARGET_CY8CPROTO_062_4343W))
#define BT_UART_NO_3M_SUPPORT ( 1 )
#endif

ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_default_h4_transport_driver();
ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_h4_transport_driver();
#endif
Expand Down
Loading