linux/samples/rpmsg/rpmsg_client_sample.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Remote processor messaging - sample client driver
   4 *
   5 * Copyright (C) 2011 Texas Instruments, Inc.
   6 * Copyright (C) 2011 Google, Inc.
   7 *
   8 * Ohad Ben-Cohen <ohad@wizery.com>
   9 * Brian Swetland <swetland@google.com>
  10 */
  11
  12#include <linux/kernel.h>
  13#include <linux/module.h>
  14#include <linux/rpmsg.h>
  15
  16#define MSG             "hello world!"
  17
  18static int count = 100;
  19module_param(count, int, 0644);
  20
  21struct instance_data {
  22        int rx_count;
  23};
  24
  25static int rpmsg_sample_cb(struct rpmsg_device *rpdev, void *data, int len,
  26                                                void *priv, u32 src)
  27{
  28        int ret;
  29        struct instance_data *idata = dev_get_drvdata(&rpdev->dev);
  30
  31        dev_info(&rpdev->dev, "incoming msg %d (src: 0x%x)\n",
  32                 ++idata->rx_count, src);
  33
  34        print_hex_dump_debug(__func__, DUMP_PREFIX_NONE, 16, 1, data, len,
  35                             true);
  36
  37        /* samples should not live forever */
  38        if (idata->rx_count >= count) {
  39                dev_info(&rpdev->dev, "goodbye!\n");
  40                return 0;
  41        }
  42
  43        /* send a new message now */
  44        ret = rpmsg_send(rpdev->ept, MSG, strlen(MSG));
  45        if (ret)
  46                dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret);
  47
  48        return 0;
  49}
  50
  51static int rpmsg_sample_probe(struct rpmsg_device *rpdev)
  52{
  53        int ret;
  54        struct instance_data *idata;
  55
  56        dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n",
  57                                        rpdev->src, rpdev->dst);
  58
  59        idata = devm_kzalloc(&rpdev->dev, sizeof(*idata), GFP_KERNEL);
  60        if (!idata)
  61                return -ENOMEM;
  62
  63        dev_set_drvdata(&rpdev->dev, idata);
  64
  65        /* send a message to our remote processor */
  66        ret = rpmsg_send(rpdev->ept, MSG, strlen(MSG));
  67        if (ret) {
  68                dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret);
  69                return ret;
  70        }
  71
  72        return 0;
  73}
  74
  75static void rpmsg_sample_remove(struct rpmsg_device *rpdev)
  76{
  77        dev_info(&rpdev->dev, "rpmsg sample client driver is removed\n");
  78}
  79
  80static struct rpmsg_device_id rpmsg_driver_sample_id_table[] = {
  81        { .name = "rpmsg-client-sample" },
  82        { },
  83};
  84MODULE_DEVICE_TABLE(rpmsg, rpmsg_driver_sample_id_table);
  85
  86static struct rpmsg_driver rpmsg_sample_client = {
  87        .drv.name       = KBUILD_MODNAME,
  88        .id_table       = rpmsg_driver_sample_id_table,
  89        .probe          = rpmsg_sample_probe,
  90        .callback       = rpmsg_sample_cb,
  91        .remove         = rpmsg_sample_remove,
  92};
  93module_rpmsg_driver(rpmsg_sample_client);
  94
  95MODULE_DESCRIPTION("Remote processor messaging sample client driver");
  96MODULE_LICENSE("GPL v2");
  97