概述

Mailbox有助于ARM和VideoCore之间的通信。下面列出了可用Mailbox/channel。每个Mailbox都是一个8位深的32位字FIFO,可由ARM和VC读取/写入。只有Mailbox 0的状态可以触发ARM上的中断,因此Mailbox 0始终用于从VC到ARM的通信,Mailbox 1用于ARM到VC。ARM永远不应该写Mailbox 0或读Mailbox 1。
树莓派Mailbox0和Mailbox1通信流程:

Mailbox0
GPU
Cortex-a53
Mailbox1
Cortex-a53
GPU

Channel(通道)

下面列出了当前定义的Mailbox通道,其中包含指向描述消息格式的页面的链接。
邮箱0定义以下渠道:
0:电源管理
1:帧缓冲
2:虚拟UART
3:VCHIQ
4:LED
5:按钮
6:触摸屏
7:属性标签(ARM - > VC)
8:属性标签(VC - > ARM)

Mailbox寄存器

以下给出了Mailbox各个寄存器的地址偏移量,MailBox0的基地址是0x3F00B880,Mailbox使用和配置流程详见:
这里

#define VIDEOCORE_MBOX (0x3F00B880)
#define MAILBOX0_READ ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x00))
#define MAILBOX0_PEEK ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x10))
#define MAILBOX0_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x14))
#define MAILBOX0_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x18))
#define MAILBOX0_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x1C))
#define MAILBOX1_WRITE ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x20))
#define MAILBOX1_PEEK ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x30))
#define MAILBOX1_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x34))
#define MAILBOX1_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x38))
#define MAILBOX1_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x3C))
#define ARM_MS_FULL BIT(31)
#define ARM_MS_EMPTY BIT(30)
#define ARM_MC_IHAVEDATAIRQEN BIT(0)

树莓派Mailbox访问一般流程:

要从邮箱中读取:
1、读取状态寄存器,直到没有设置empty标志
2、从读寄存器读取数据
3、如果低4位与所需的通道编号不匹配,则从1开始重复
4、高28位是返回的数据
写入邮箱:
1、读取状态寄存器,直到未设置full标志
2、将数据(移入高28位)与通道(低4位)一起写入写寄存器
还有一些注意详见:这里
MailBox接口编码查询详见:这里

树莓派Mailbox数据包格式


  • U32: 整个数据包大小,单位字节(包括头,end标记和字节对齐填充)
  • U32: 请求/回复代码
    • 请求代码:

      • 0x00000000: process request
    • 回复代码:

      • 0x80000000: 请求成功
      • 0x80000001: error

tag有如下格式:

  • U32: tag identifier
  • U32: value buffer size, 单位字节
  • U32:
    • 请求代码:

      • b31: 0
      • b30-b0: reserved
    • 回复代码:
      • b31: 1
      • b30-b0: value length, 单位字节
  • U8…: value buffer
  • U8…: 整个tag以32字节对齐

  • U32: 0x0 (end tag)
  • U8…: padding

示例代码

#include "reg.h"
#include "uart.h"#define VIDEOCORE_MBOX (0x3F00B880)
#define MAILBOX0_READ   ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x00))
#define MAILBOX0_PEEK   ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x10))
#define MAILBOX0_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x14))
#define MAILBOX0_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x18))
#define MAILBOX0_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x1C))
#define MAILBOX1_WRITE  ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x20))
#define MAILBOX1_PEEK   ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x30))
#define MAILBOX1_SENDER ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x34))
#define MAILBOX1_STATUS ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x38))
#define MAILBOX1_CONFIG ((volatile unsigned int*)(VIDEOCORE_MBOX + 0x3C))
#define ARM_MS_FULL           BIT(31)
#define MBOX_RESPONSE         BIT(31)
#define ARM_MS_EMPTY          BIT(30)
#define ARM_MC_IHAVEDATAIRQEN BIT(0)#define MBOX_REQUEST    0/* channels */
#define MBOX_CH_POWER   0
#define MBOX_CH_FB      1
#define MBOX_CH_VUART   2
#define MBOX_CH_VCHIQ   3
#define MBOX_CH_LEDS    4
#define MBOX_CH_BTNS    5
#define MBOX_CH_TOUCH   6
#define MBOX_CH_COUNT   7
#define MBOX_CH_PROP    8/* tags */
#define MBOX_TAG_GETSERIAL      0x10004
#define MBOX_TAG_LAST           0#define ALIGN(n) __attribute__((aligned(n)))/* mailbox message buffer */
volatile unsigned int mbox_buffer[64] ALIGN(16);int mailbox_call(unsigned char channel)
{unsigned int address = (unsigned int)(((unsigned long)mbox_buffer & ~0xF) | (channel & 0xF));puts("mailbox_call check prewrite\n");while (*MAILBOX1_STATUS & ARM_MS_FULL);*MAILBOX1_WRITE = address;while (1) {puts("mailbox_call check preread\n");while (*MAILBOX0_STATUS & ARM_MS_EMPTY);puts("mailbox_call reading\n");if (address == *MAILBOX0_READ)return mbox_buffer[1] == MBOX_RESPONSE;}puts("mailbox_call error\n");return 0;
}void get_serial(void)
{mbox_buffer[0] = 8 * 4;mbox_buffer[1] = MBOX_REQUEST;mbox_buffer[2] = MBOX_TAG_GETSERIAL; // tag identifiermbox_buffer[3] = 8; // buffer sizembox_buffer[4] = 8; // buffer sizembox_buffer[5] = 0; // clear buffer datambox_buffer[6] = 0; // clear buffer datamailbox_call(MBOX_CH_PROP);puts("My serial number is\n");hex(mbox_buffer[6]);hex(mbox_buffer[5]);
}

树莓派3B——Mailbox相关推荐

  1. 64位树莓派运行linux,树莓派3B+安装64位debian GUN/Linux系统

    经过前段时间的努力,已经成功的将debian的ARM64版本跑在了树莓派3B+上.独乐乐不如众乐乐,所以将自己努力的成果分享,并详细介绍安装教程,希望能为树莓派爱好者做出些许贡献. 我已经制作好了镜像 ...

  2. gpio引脚介绍 树莓派3b_如何让LabVIEW程序运行在树莓派3B(此处有坑)

    上次转载了LabVIEW部署树莓派的文章后,很多小伙伴很兴趣,一个个都说要把压箱底的树莓派拿出来清下灰尘,也不知道到底拿出来没有. 放个之前文章链接如下: 零基础上手树莓派+免费正版LabVIEW C ...

  3. 树莓派3b+目标检测: tflite 运行 mobilenet ssd

    1. 硬件环境:树莓派3b+和USB摄像头 2. 操作系统:2019-09-26-raspbian-buster.zip https://downloads.raspberrypi.org/raspb ...

  4. gpio引脚介绍 树莓派3b_使用微创联合M5S空气检测仪、树莓派3b+、prometheus、grafana实现空气质量持续监控告警WEB可视化...

    1.简介 使用微创联合M5S空气检测仪.树莓派3b+.prometheus.grafana实现空气质量持续监控告警WEB可视化 grafana dashboard效果: 2.背景 2.1 需求: 1. ...

  5. 树莓派3b与散热风扇

    准备好树莓派3b与散热风扇 2 首先将风扇与树莓派针脚相连接,红色线接树莓派4针脚,黑色线接树莓派6针脚,树莓派针脚请看下图 3 实物连接如图 4 上电,风扇成功运转. 5 安装完成,尽情玩转你的树莓 ...

  6. 树莓派3B用Ubuntu MATE安装ros

    [组件] 树莓派操作系统:Ubuntu MATE 16.04 LTS ROS 版本:ROS Kinetic Kame 工作机操作系统: Windows 10 [系统安装] 1.下载 Ubuntu MA ...

  7. 树莓派3B+功耗测试、初体验、图形化配置树莓派3B+配置方法。Raspberry Pi 3B+测评...

    靓照: 功耗测试 测试工具:USB数码管3位(4位)测试 树莓派3b+ 条件:送的充电器,初始桌面,没有连接wifi 电压:5.13v 电流:0.35A 条件:送的充电器,初始桌面,连接wifi,鼠标 ...

  8. 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测

    [树莓派3B+测评]线程的挂起与恢复&CPU温度检测 [复制链接] 本帖最后由 donatello1996 于 2018-12-22 17:33 编辑 在TCP通信中,除了线程的创建和删除以外 ...

  9. 树莓派安装win10arm linux,在树莓派3B 上安装 Windows 10 ARM 版的方法

    早先关注我们的朋友可能对<国外开发者尝试在树莓派3上运行Windows 10桌面版>有印象.本文转自 amatfan.com,文末视频来自 daveb778(感谢柠栀和刺分享),给出了如何 ...

最新文章

  1. java web 嵌套播放器_网页嵌套播放器
  2. iOS中autolaylout和sizeclass的理解
  3. XamarinEssentials教程移除键值首选项的键值
  4. 实验1 LINUX基本操作
  5. [转].NET 数据库连接池
  6. 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...
  7. 【详细解析】1080 MOOC期终成绩 (25分)_45行代码AC
  8. 华为u8825d解锁工具_黔隆科技刷机教程VIVOX20PLUSA忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  9. 大数据工作流_大数据和人工智能时代下的数字化工作流
  10. 15个IT技术人员必须思考的问题
  11. 【动态规划】公共子串
  12. 威纶触摸屏使用说明书_「西门子1200PLC教程」20.PLC变量表的使用
  13. 每周一刷——从斐波那契数列到动态规划
  14. mysql分析语句方法_Mysql分析-常用分析语句总结
  15. 路畅畅云固件升级教程_【图】【折腾导航】路畅导航固件升级、刷机、实现一机多图教程!...
  16. 人工智能python编程训练营_贪心科技 人工智能 Python 编程特训营 第四个主题项目代码...
  17. Restarting ..Terminated
  18. html设置页面宽度高度,a4纸宽度_A4纸网页打印 html网页页面的宽度设置成多少 _a4纸宽度高度...
  19. Linux内核源码下载方式
  20. 惊闻母校徐兵老师英年早逝

热门文章

  1. 为什么说区块链是新的博弈竞技场
  2. String------字符串的字母大小写切换及获取
  3. 大连市金州区石河计算机学校,2021大连市金州区安全教育平台登录入口网址【最新】...
  4. 支付通道跳转H5 WAP快捷支付
  5. 含含乐-口含烟真的能戒烟替烟?
  6. 恒生电子实习记录-14
  7. 游戏服务器框架概括分析
  8. 华为android系统是什么意思,华为HarmonyOS与安卓系统有什么区别?一文了解
  9. Oracle EBS 模拟登陆
  10. 蓝牙基带分配编号(设备/服务类型)详解