(5条消息) mailbox的controller

tiantao20122017-09-19 14:41:44 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
版权
mailbox是kernel提供的一种板子上的硬件和soc通过messages queue,interrupt 进行通讯的一个架构。正式版的英文翻译如下:menuconfig MAILBOXbool "Mailbox Hardware Support"help  Mailbox is a framework to control hardware communication between  on-chip processors through queued messages and interrupt driven  signals. Say Y if your platform supports hardware mailboxes.mailbox的实现分为contoller和client。简单的说就是clinet 可以通过controller提供的channle发送信息给conroller因此在drivers/mailbox下实现的都是controller的源码具体到某个厂商的硬件,则描述如下:config ARM_MHU    tristate "ARM MHU Mailbox"    depends on ARM_AMBA    help      Say Y here if you want to build the ARM MHU controller driver.      The controller has 3 mailbox channels, the last of which can be      used in Secure mode only.通过makefile我们知道要实现mailbox的源文件其实只有两个obj-$(CONFIG_MAILBOX)+= mailbox.oobj-$(CONFIG_ARM_MHU)+= arm_mhu.o其中mailbox.c 是kernel提供的framework,arm_mhu.c 则是具体厂商的实现这里直接看arm_mhu.c的probe函数static int mhu_probe(struct amba_device *adev, const struct amba_id *id){int i, err;struct arm_mhu *mhu;struct device *dev = &adev->dev;int mhu_reg[MHU_CHANS] = {MHU_LP_OFFSET, MHU_HP_OFFSET, MHU_SEC_OFFSET};/* Allocate memory for device */mhu = devm_kzalloc(dev, sizeof(*mhu), GFP_KERNEL);if (!mhu)return -ENOMEM;mhu->base = devm_ioremap_resource(dev, &adev->res);if (IS_ERR(mhu->base)) {dev_err(dev, "ioremap failed\n");return PTR_ERR(mhu->base);}//mailbox的channel 表示可以发送信息的寄存器for (i = 0; i < MHU_CHANS; i++) {mhu->chan[i].con_priv = &mhu->mlink[i];mhu->mlink[i].irq = adev->irq[i];mhu->mlink[i].rx_reg = mhu->base + mhu_reg[i];mhu->mlink[i].tx_reg = mhu->mlink[i].rx_reg + TX_REG_OFFSET;}//初始化mbox的结构体mhu->mbox.dev = dev;mhu->mbox.chans = &mhu->chan[0];mhu->mbox.num_chans = MHU_CHANS;//mbox.ops 表示mailbox这个硬件具体的操作,例如发送数据,初始化等mhu->mbox.ops = &mhu_ops;//发送数据采用poll的方式mhu->mbox.txdone_irq = false;mhu->mbox.txdone_poll = true;mhu->mbox.txpoll_period = 1;amba_set_drvdata(adev, mhu);//所有的controller 最终都要通过mbox_controller_register 来注册自己err = mbox_controller_register(&mhu->mbox);if (err) {dev_err(dev, "Failed to register mailboxes %d\n", err);return err;}dev_info(dev, "ARM MHU Mailbox registered\n");return 0;}int mbox_controller_register(struct mbox_controller *mbox){int i, txdone;//下面这四个任何一个为null,就退出注册/* Sanity check */if (!mbox || !mbox->dev || !mbox->ops || !mbox->num_chans)return -EINVAL;//client发送数据是通过poll的方式还是irq的方式,后面针对两种方式有不同的处理方式if (mbox->txdone_irq)txdone = TXDONE_BY_IRQ;else if (mbox->txdone_poll)txdone = TXDONE_BY_POLL;else /* It has to be ACK then */txdone = TXDONE_BY_ACK;//如果是poll的方式,则注册一个timer,定时查询if (txdone == TXDONE_BY_POLL) {if (!mbox->ops->last_tx_done) {dev_err(mbox->dev, "last_tx_done method is absent\n");return -EINVAL;}hrtimer_init(&mbox->poll_hrt, CLOCK_MONOTONIC,     HRTIMER_MODE_REL);mbox->poll_hrt.function = txdone_hrtimer;}//初始化controller的channel,表示contoller 同时能尽量几路信息的传递for (i = 0; i < mbox->num_chans; i++) {struct mbox_chan *chan = &mbox->chans[i];chan->cl = NULL;chan->mbox = mbox;chan->txdone_method = txdone;spin_lock_init(&chan->lock);}if (!mbox->of_xlate)mbox->of_xlate = of_mbox_index_xlate;//所有的mailbox最终都会添加到mbox_cons 这个list中mutex_lock(&con_mutex);list_add_tail(&mbox->node, &mbox_cons);mutex_unlock(&con_mutex);return 0;}
(0)

相关推荐

  • 深入Istio:Pilot配置规则ConfigController

    Config Controller用于管理各种配置数据,包括用户创建的流量管理规则和策略.Istio目前支持三种类型的Config Controller: MCP:是一种网络配置协议,用于隔离Pilo ...

  • 高通camera结构(摄像头基础介绍)

    拍摄景物通过镜头,将生成的光学图像投射到传感器上,然后光学图像被转换成电信号,电信号再经过模数转换变为数字信号,数字信号经过DSP加工处理,再被送到电脑中进行处理,最终转换成手机屏幕上能够看到的图像. ...

  • (5条消息) mailbox数据发送和接收的过程

    tiantao20122017-09-19 15:29:19 18485 收藏 7 分类专栏:Linux 源码分析 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  • (7条消息) C++中位运算的使用方法

    一:简介1 位逻辑运算符:& (位   "与")  and^  (位   "异或")|   (位    "或")   or~  (位 ...

  • (35条消息) 中国城域网路由情况介绍

    中国的城域网,大概有三张比较典型的,一个是中国移动的CMnet,一个是中国电信IP城域网,还有一个是中国网通IP城域网.作为接入最后的阵地,城域网的业务是最复杂的.含盖了IPTV,语音,Interne ...

  • (35条消息) 家用宽带网络与服务器使用的网络有什么不同?

    很多人都知道,服务器的网络跟家用网络有很多区别.其中有很多技术大牛,都是使用家里的宽带做很多别人使用公网服务器才能完成的服务. 但是对于普通人来讲,似乎都觉得没什么区别,本文就此简单做一下区分: 固定 ...

  • 怎么设置微信公众号添加关注后自动回复多条消息

    怎么设置微信公众号添加关注后自动回复多条消息

  • (40条消息) 5G网络(接入网+承载网+核心网)

    前一段时间自己一直在做某市的5G试点项目,对5G的无线接入网相关技术有了更深入的认识.因此,希望通过无线接入网为线索(行话叫锚点),帮大家梳理一下无线侧接入网+承载网+核心网的架构,这里以接入网为主, ...

  • (7条消息) 国家信息化体系六要素

    历史的温度:寻找历史背面的故事.热血和真性情作者:张玮出版社:中信出版集团股份有限公司好评:100% 销售量:0 ¥34.3 历史的温度2:细节里的故事.彷徨和信念作者:张玮出版社:中信出版集团股份有 ...

  • (7条消息) QStringLiteral

    QStringLieral是Qt5中新引入的一个用来从"字符串常量"创建QString对象的宏(字符串常量指在源码中由双引号包含的字符串).在这篇博客我讲解释它的的内部实现和工作原 ...

  • (40条消息) Fastly释Lucet原生WebAssembly编译程序和Runtime

    云端服务供货商Fastly释出Lucet开源项目,这是原生的WebAssembly编译程序和Runtime,目的是要将WebAssembly带出浏览器,在开发者的应用程序中,安全地执行不受信任的Web ...