Linux Audio

Check our new training course

Embedded Linux Audio

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

Bootlin logo

Elixir Cross Referencer

Loading...
/*
 * Copyright (c) 2021 BrainCo Inc.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <device.h>
#include <drivers/ipm.h>
#include <drivers/gpio.h>
#include <sys/printk.h>

#define SLEEP_TIME_MS   1000

#define IPM  DT_LABEL(DT_NODELABEL(mailbox))

struct ipm_data {
	const struct gpio_dt_spec *led;
	bool led_is_on;
};

static struct ipm_data data;

static const struct gpio_dt_spec led0 =
	GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios);

void new_message_callback(const struct device *dev, void *user_data,
						uint32_t id, volatile void *data)
{
	struct ipm_data *ipm_data = (struct ipm_data *)user_data;

	gpio_pin_set(ipm_data->led->port, ipm_data->led->pin, (int)ipm_data->led_is_on);

	ipm_data->led_is_on = !ipm_data->led_is_on;
}

void main(void)
{
	const struct device *ipm;

	printk("STM32 h7_dual_core application\n");

	ipm = device_get_binding(IPM);
	if (!device_is_ready(ipm)) {
		printk("ipm device not ready\n");
		return;
	}

	if (!device_is_ready(led0.port)) {
		printk("led0 device not ready\n");
		return;
	}

	gpio_pin_configure_dt(&led0, GPIO_OUTPUT_INACTIVE);

	data.led = &led0;
	data.led_is_on = false;

	ipm_register_callback(ipm, new_message_callback, &data);

	ipm_set_enabled(ipm, 1);

	while (1) {
		ipm_send(ipm, 0, 0, NULL, 0);
		k_msleep(SLEEP_TIME_MS);
	}
}