Jelajahi Sumber

samples/rpmsg: add support for multiple instances

The current rpmsg_client_sample is a very simple example and
is not designed to handle multiple instances. Add support for
multiple instances, so that the same number of pings are sent
to each instance. The instances can be on one or multiple
remote processors.

Signed-off-by: Suman Anna <s-anna@ti.com>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Anna, Suman 9 tahun lalu
induk
melakukan
a138c88319
1 mengubah file dengan 15 tambahan dan 3 penghapusan
  1. 15 3
      samples/rpmsg/rpmsg_client_sample.c

+ 15 - 3
samples/rpmsg/rpmsg_client_sample.c

@@ -24,19 +24,24 @@
 #define MSG		"hello world!"
 #define MSG		"hello world!"
 #define MSG_LIMIT	100
 #define MSG_LIMIT	100
 
 
+struct instance_data {
+	int rx_count;
+};
+
 static void rpmsg_sample_cb(struct rpmsg_channel *rpdev, void *data, int len,
 static void rpmsg_sample_cb(struct rpmsg_channel *rpdev, void *data, int len,
 						void *priv, u32 src)
 						void *priv, u32 src)
 {
 {
 	int ret;
 	int ret;
-	static int rx_count;
+	struct instance_data *idata = dev_get_drvdata(&rpdev->dev);
 
 
-	dev_info(&rpdev->dev, "incoming msg %d (src: 0x%x)\n", ++rx_count, src);
+	dev_info(&rpdev->dev, "incoming msg %d (src: 0x%x)\n",
+		 ++idata->rx_count, src);
 
 
 	print_hex_dump(KERN_DEBUG, __func__, DUMP_PREFIX_NONE, 16, 1,
 	print_hex_dump(KERN_DEBUG, __func__, DUMP_PREFIX_NONE, 16, 1,
 		       data, len,  true);
 		       data, len,  true);
 
 
 	/* samples should not live forever */
 	/* samples should not live forever */
-	if (rx_count >= MSG_LIMIT) {
+	if (idata->rx_count >= MSG_LIMIT) {
 		dev_info(&rpdev->dev, "goodbye!\n");
 		dev_info(&rpdev->dev, "goodbye!\n");
 		return;
 		return;
 	}
 	}
@@ -50,10 +55,17 @@ static void rpmsg_sample_cb(struct rpmsg_channel *rpdev, void *data, int len,
 static int rpmsg_sample_probe(struct rpmsg_channel *rpdev)
 static int rpmsg_sample_probe(struct rpmsg_channel *rpdev)
 {
 {
 	int ret;
 	int ret;
+	struct instance_data *idata;
 
 
 	dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n",
 	dev_info(&rpdev->dev, "new channel: 0x%x -> 0x%x!\n",
 					rpdev->src, rpdev->dst);
 					rpdev->src, rpdev->dst);
 
 
+	idata = devm_kzalloc(&rpdev->dev, sizeof(*idata), GFP_KERNEL);
+	if (!idata)
+		return -ENOMEM;
+
+	dev_set_drvdata(&rpdev->dev, idata);
+
 	/* send a message to our remote processor */
 	/* send a message to our remote processor */
 	ret = rpmsg_send(rpdev, MSG, strlen(MSG));
 	ret = rpmsg_send(rpdev, MSG, strlen(MSG));
 	if (ret) {
 	if (ret) {