首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算devmem2 2/mmap的MMIO GPIO地址

如何计算devmem2 2/mmap的MMIO GPIO地址
EN

Stack Overflow用户
提问于 2019-08-24 06:31:34
回答 1查看 357关注 0票数 0

我试图访问一些用于LED控制和电池监控的MMIO GPIO地址。但我不知道如何计算正确的地址。

这些文件规定如下:

代码语言:javascript
复制
COMMUINTY_BASE = Bus 0 Device 0x0d Function 0 Reg. 0x10
GPIO North Community PORT ID = 0xC5
GPIO North West Community PORT ID = 0xC4
GPIO_PADBAR = COMMUNITY_BASE + PORT ID << 16 + 0x500
GPO Reg = GPIO_PADBAR + GPIO_Offset Bit [0] (LEDs)
GPI Reg = GPIO_PADBAR + GPIO_Offset Bit [1] (Battery)

Example: Reg LED_USER1_RD_N_P1V8A = 0xD0C506A0

文档

我在这里的问题是,北方和西北社区的港口ID有什么区别?我什么时候需要用哪一种?我也没有给出示例地址时,按照文档的公式。

我编写了以下c程序来处理计算:

代码语言:javascript
复制
int main(void) {
    u_int32_t COMMUINTY_BASE = 0x10;
    u_int32_t GPIO_NORTH_PORT = 0xC5;
    u_int32_t GPIO_WEST_PORT = 0xC4;

    u_int32_t GPIO_PADBAR =  (COMMUINTY_BASE + GPIO_NORTH_PORT) << 16 + 0x500;
    u_int32_t GPIO_REG = GPIO_PADBAR + 0x01;

    printf("0x%04x\n", GPIO_REG);
}

但是输出是0xd50001而不是0xD0C506A0

如果我尝试使用devmem2读取示例地址,它将返回寄存器,并将所有位设置为1。

sudo devmem2 0xD0C506A0结果读:0xFFFFFFFF

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-01 15:10:46

我不明白他们是如何准确地得到0xD0C506A0的,但我不明白为什么它在以0xD0000000开头的地址中。

你计算其他一切的方法都有错误。<<运算符具有比+更高的优先级,因此应该将该方程括号为COMMUNITY_BASE + (PORT ID << 16) + 0x500。计算所述端口的PORT_ID << 16将产生COMMUNITY_BASE + 0xC50000 + 0x500 = COMMUNITY_BASE + 0xC50500。为此,您可以添加红色用户1 0x1A0偏移量以获得COMMUNITY_BASE + 0xC506A0

我主要是在这个级别上做ARM架构,所以我不明白设备0x0D信息是如何转化为COMMUNITY_BASE0xD0000000,但是这里有它。

如果您查看文档,您还会发现地址是只写的(“输出”),这解释了为什么无法从示例地址读取地址。如果您不熟悉使用只写的GPIO寄存器,它们并不少见。通常的方法是要么不读取它们,要么在内存中保存您认为它们应该是的副本,然后抽象对象,以便从寄存器的私有值中“读取”,然后“写”到实际的GPIO引脚,并更新您的私有值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57635659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档