树莓派3B——Mailbox
概述
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通信流程:
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相关推荐
- 64位树莓派运行linux,树莓派3B+安装64位debian GUN/Linux系统
经过前段时间的努力,已经成功的将debian的ARM64版本跑在了树莓派3B+上.独乐乐不如众乐乐,所以将自己努力的成果分享,并详细介绍安装教程,希望能为树莓派爱好者做出些许贡献. 我已经制作好了镜像 ...
- gpio引脚介绍 树莓派3b_如何让LabVIEW程序运行在树莓派3B(此处有坑)
上次转载了LabVIEW部署树莓派的文章后,很多小伙伴很兴趣,一个个都说要把压箱底的树莓派拿出来清下灰尘,也不知道到底拿出来没有. 放个之前文章链接如下: 零基础上手树莓派+免费正版LabVIEW C ...
- 树莓派3b+目标检测: tflite 运行 mobilenet ssd
1. 硬件环境:树莓派3b+和USB摄像头 2. 操作系统:2019-09-26-raspbian-buster.zip https://downloads.raspberrypi.org/raspb ...
- gpio引脚介绍 树莓派3b_使用微创联合M5S空气检测仪、树莓派3b+、prometheus、grafana实现空气质量持续监控告警WEB可视化...
1.简介 使用微创联合M5S空气检测仪.树莓派3b+.prometheus.grafana实现空气质量持续监控告警WEB可视化 grafana dashboard效果: 2.背景 2.1 需求: 1. ...
- 树莓派3b与散热风扇
准备好树莓派3b与散热风扇 2 首先将风扇与树莓派针脚相连接,红色线接树莓派4针脚,黑色线接树莓派6针脚,树莓派针脚请看下图 3 实物连接如图 4 上电,风扇成功运转. 5 安装完成,尽情玩转你的树莓 ...
- 树莓派3B用Ubuntu MATE安装ros
[组件] 树莓派操作系统:Ubuntu MATE 16.04 LTS ROS 版本:ROS Kinetic Kame 工作机操作系统: Windows 10 [系统安装] 1.下载 Ubuntu MA ...
- 树莓派3B+功耗测试、初体验、图形化配置树莓派3B+配置方法。Raspberry Pi 3B+测评...
靓照: 功耗测试 测试工具:USB数码管3位(4位)测试 树莓派3b+ 条件:送的充电器,初始桌面,没有连接wifi 电压:5.13v 电流:0.35A 条件:送的充电器,初始桌面,连接wifi,鼠标 ...
- 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测
[树莓派3B+测评]线程的挂起与恢复&CPU温度检测 [复制链接] 本帖最后由 donatello1996 于 2018-12-22 17:33 编辑 在TCP通信中,除了线程的创建和删除以外 ...
- 树莓派安装win10arm linux,在树莓派3B 上安装 Windows 10 ARM 版的方法
早先关注我们的朋友可能对<国外开发者尝试在树莓派3上运行Windows 10桌面版>有印象.本文转自 amatfan.com,文末视频来自 daveb778(感谢柠栀和刺分享),给出了如何 ...
最新文章
- java web 嵌套播放器_网页嵌套播放器
- iOS中autolaylout和sizeclass的理解
- XamarinEssentials教程移除键值首选项的键值
- 实验1 LINUX基本操作
- [转].NET 数据库连接池
- 广度优先搜索生成树怎么画_图的深度优先遍历与广度优先遍历以及最小生成树...
- 【详细解析】1080 MOOC期终成绩 (25分)_45行代码AC
- 华为u8825d解锁工具_黔隆科技刷机教程VIVOX20PLUSA忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
- 大数据工作流_大数据和人工智能时代下的数字化工作流
- 15个IT技术人员必须思考的问题
- 【动态规划】公共子串
- 威纶触摸屏使用说明书_「西门子1200PLC教程」20.PLC变量表的使用
- 每周一刷——从斐波那契数列到动态规划
- mysql分析语句方法_Mysql分析-常用分析语句总结
- 路畅畅云固件升级教程_【图】【折腾导航】路畅导航固件升级、刷机、实现一机多图教程!...
- 人工智能python编程训练营_贪心科技 人工智能 Python 编程特训营 第四个主题项目代码...
- Restarting ..Terminated
- html设置页面宽度高度,a4纸宽度_A4纸网页打印 html网页页面的宽度设置成多少 _a4纸宽度高度...
- Linux内核源码下载方式
- 惊闻母校徐兵老师英年早逝