Boot Linux faster!

Check our new training course

Boot Linux faster!

Check our new training course
and Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

/*
 * Copyright (c) 2019 Nordic Semiconductor ASA.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <drivers/gpio.h>
#include <drivers/uart.h>
#include <device.h>

#define RESET_PIN CONFIG_BOARD_NRF52840_GPIO_RESET_PIN

/* Must be a pin from 17 to 23.
 * Only those can be connected to the nRF52840.
 */
BUILD_ASSERT_MSG(RESET_PIN > 16 && RESET_PIN < 24,
		 "Selected pin is not connected to nRF52840");

int bt_hci_transport_setup(struct device *h4)
{
	int err;
	char c;
	struct device *port;

	port = device_get_binding(DT_GPIO_P0_DEV_NAME);
	if (!port) {
		return -EIO;
	}

	/* Pull the pin low before configuring it as output, to ensure that
	 * it is driven to the correct level as soon as it is configured.
	 */
	err = gpio_pin_write(port, RESET_PIN, 0);
	if (err) {
		return err;
	}

	err = gpio_pin_configure(port, RESET_PIN, GPIO_DIR_OUT);
	if (err) {
		return err;
	}

	/* Reset the nRF52840 and let it wait until the pin is
	 * pulled low again before running to main to ensure
	 * that it won't send any data until the H4 device
	 * is setup and ready to receive.
	 */
	err = gpio_pin_write(port, RESET_PIN, 1);
	if (err) {
		return err;
	}

	/* Wait for the nRF52840 peripheral to stop sending data.
	 *
	 * It is critical (!) to wait here, so that all bytes
	 * on the lines are received and drained correctly.
	 */
	k_sleep(K_MSEC(10));

	/* Drain bytes */
	while (uart_fifo_read(h4, &c, 1)) {
		continue;
	}

	/* We are ready, let the nRF52840 run to main */
	err = gpio_pin_write(port, RESET_PIN, 0);
	if (err) {
		return err;
	}

	return 0;
}