我们知道在client 在通过mbox_send_message给controller发送数据的时候必须指定channel。例如下面的codedc_sync->mbox =
(&dc_sync->cl, 0);/* Populate data packet *//* sp.abc = 123; etc *//* Send message to remote in blocking mode */mbox_send_message(dc_sync->mbox, &sp);/* At this point 'sp' has been sent */
目前kernel提供了两种方法得到mailbox的channel
struct mbox_chan *mbox_request_channel_byname(struct mbox_client *cl,const char *name);
struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index);
使用完成后调用mbox_free_channel 释放channel,这样别人就可以继续使用这个channel
void mbox_free_channel(struct mbox_chan *chan); /* may sleep */
其中mbox_request_channel_byname是mbox_request_channel的一个包装。所以这里直接看看mbox_request_channel
struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index)
{struct device *dev = cl->dev;struct mbox_controller *mbox;struct of_phandle_args spec;struct mbox_chan *chan;unsigned long flags;int ret;spin_lock_irqsave(&chan->lock, flags);chan->msg_free = 0;chan->msg_count = 0;chan->active_req = NULL;chan->cl = cl;init_completion(&chan->tx_complete);//初始化chan,并最终startupret = chan->mbox->ops->startup(chan);if (ret) {dev_err(dev, "Unable to startup the chan (%d)\n", ret);mbox_free_channel(chan);chan = ERR_PTR(ret);}
}
以之前的arm_mhu.c 中定义的mbox_chan_ops为例
static const struct mbox_chan_ops mhu_ops = {.send_data = mhu_send_data,.startup = mhu_startup,.shutdown = mhu_shutdown,.last_tx_done = mhu_last_tx_done,
};static int mhu_startup(struct mbox_chan *chan)
{struct mhu_link *mlink = chan->con_priv;u32 val;int ret;val = readl_relaxed(mlink->tx_reg + INTR_STAT_OFS);writel_relaxed(val, mlink->tx_reg + INTR_CLR_OFS);
原来就是注册了一个中断,其回调函数是mhu_rx_interruptret = request_irq(mlink->irq, mhu_rx_interrupt,IRQF_SHARED, "mhu_link", chan);if (ret) {dev_err(chan->mbox->dev,"Unable to acquire IRQ %d\n", mlink->irq);return ret;}return 0;
}
这个中断函数如下:
当client 给controller 通过mbox_send_message发送数据后,arm_mhu 会产生一个中断给cotroller。
static irqreturn_t mhu_rx_interrupt(int irq, void *p)
{struct mbox_chan *chan = p;struct mhu_link *mlink = chan->con_priv;u32 val;val = readl_relaxed(mlink->rx_reg + INTR_STAT_OFS);if (!val)return IRQ_NONE;
controller调用mbox_chan_received_data 就可以得到client发送来的数据mbox_chan_received_data(chan, (void *)&val);writel_relaxed(val, mlink->rx_reg + INTR_CLR_OFS);return IRQ_HANDLED;
}
void mbox_chan_received_data(struct mbox_chan *chan, void *mssg)
{读去数据后,调用client的rx_callback 通知client/* No buffering the received data */if (chan->cl->rx_callback)chan->cl->rx_callback(chan->cl, mssg);
}controller接收数据的flow 清楚了,再看看client是如何调用mbox_send_message 发送数据的
mbox_send_message->msg_submitif (chan->cl->tx_prepare)chan->cl->tx_prepare(chan->cl, data);/* Try to submit a message to the MBOX controller */err = chan->mbox->ops->send_data(chan, data);if (!err) {chan->active_req = data;chan->msg_count--;}
最终还是调用controll而的send_data 发送数据,本例controller的send_data函数为mhu_send_data
static int mhu_send_data(struct mbox_chan *chan, void *data)
{struct mhu_link *mlink = chan->con_priv;u32 *arg = data;
就是写controller的一个寄存器就行了,client写了之后后触发中断,controller会在中断中读到数据,并通过mbox_chan_received_data 通知client已经读取数据了writel_relaxed(*arg, mlink->tx_reg + INTR_SET_OFS);return 0;
}

mailbox数据发送和接收的过程相关推荐

  1. WebRTC 视频发送和接收处理过程

    这里看下视频发送和接收处理过程.分析所基于的应用程序,依然选择 WebRTC 的示例应用 peerconnection_client,代码版本 M96. 应用层创建 VideoTrackSource, ...

  2. WebRTC 音频发送和接收处理过程

    曾经整理过一个 WebRTC 音频发送和接收处理的关键过程,WebRTC Audio 接收和发送的关键过程 ,不过之前的分析是基于比较老的版本做的.分析所基于的应用程序,依然选择 WebRTC 的示例 ...

  3. 物联网LoRa系列-12:LoRa终端--数据发送和接收的整个过程

    在上文<全面拆解和构建5G物联网-11:LoRa终端--基于物理层协议的PingPong应用程序的软件架构>中,我们已经通过开发板提供商提供的软件工程文件,在两个LoRa节点之间进行了点对 ...

  4. as3 访问远程计算机,Flash AS3中数据发送与接收

    Flash AS3中数据发送与接收 互联网   发布时间:2008-10-06 01:24:53   作者:佚名   我要评论 先回顾一下as2中相关的解决办法 相信大部分人用的都是LoadVars类 ...

  5. iWatch 开发 4: 实现iWatch 与 iPhone 之间数据发送与接收

    上一代的iwatch 与iPhone 数据交互使用的是 openParentApplication 函数,在Watch OS2 中摒弃了这种方法,引入了WCSesison 来进行iwatch 与iPh ...

  6. Arduino开发实例-Lora 数据发送与接收

    Lora 数据发送与接收 预计到2025年,我们将有250亿台设备连接到互联网. 相当于今天的地球人口多三倍. 随着物联网和工业4.0的概念,互联车辆和智能城市的迅速普及,这种情况最有可能发生. 我们 ...

  7. L2CAP数据发送和接收

    ACL 链路在 Bluetooth 中非常重要,一些重要的应用如 A2DP, 基于 RFCOMM 的应用.BNEP等都要建立 ACL 链路,发送/接收ACL 包.跟大家一起来分析 ACL 包发送/接收 ...

  8. 计算机网络知识全面讲解:电子邮件发送和接收的过程

    免费教程推荐: python.C++.Java.JS.Rust.Go语言入门完全手册(6合1).zip-Python文档类资源-CSDN下载 一个电子邮件系统应具有图1-74所示的3个主要组成构件,即 ...

  9. TI AoA Master/PC 数据发送、接收流程梳理

    1.Master怎样发送.接收数据?Master发送数据:RTLSHost_sendMsg(RTLS_CMD_AOA_RESULT_ANGLE, HOST_ASYNC_RSP, (uint8_t *) ...

最新文章

  1. (原創) 將map輸出到cout,是否有更方便的方法? (C/C++) (STL)
  2. JS中自定义replace可替换特殊符号$等,但无法忽略大小写的函数
  3. mysql的in和not in的用法(特别注意not in结果集中不能有null)
  4. php微信小程序物流进度推送,微信小程序 消息推送php服务器验证实例详解
  5. 【HDU - 2444】The Accomodation of Students(二分图判断 + 匈牙利算法求最大匹配)
  6. opencvpython图像代码_PythonOpenCV各种图像库的图像读写 增强 方式的简单介绍(附代码)...
  7. php服务层设计与实现的,PHP中service层怎么设计兼顾优雅和方便?
  8. bz2解压命令_Linux下的tar压缩解压缩命令
  9. 计算直方图中面积最大的矩形
  10. 大屏一体机!奥可视新品A5亮点浅析
  11. java开发工具下载地址汇总
  12. word文档打破折号
  13. 低功耗蓝牙中的蓝牙地址和隐私
  14. 佛说,是我们自己苦了自己~
  15. 主机连wifi的情况下如何使虚拟机(Ubuntu)上网
  16. el-checkbox点击没反应
  17. 计算机应用基础考试试题及答案 在word中,用户建立的文件默认,2009年10月全国自考计算机应用基础历年真题...
  18. 【Android学习日记】
  19. 帝国cms如何导入php模板,帝国cms模板导入导出及模板组功能介绍
  20. CSS进阶-Less

热门文章

  1. Android Adb命令(1) - 查看所有的Apk包 / 安装install 和卸载uninstall
  2. Linux上的天翼云盘客户端,支持上传下载
  3. 电信2月国内市场份额52.22% 环比上月下降0.61%
  4. 深入理解JVM垃圾收集机制(JDK1.8)
  5. 给Flash元件加链接
  6. IT创业正当时——掘金App Store
  7. 天龙3d服务器维护,【公告】天龙八部手游03月24日维护更新公告
  8. Marven:使用Maven构建Java项目
  9. ChatGPT背后的标注人:在非洲只管「鉴黄」!时薪不到两美元...
  10. 百度 和 谷歌 的站内搜索引擎代码