簡體   English   中英

如何為devmem2 / mmap計算MMIO GPIO地址

[英]How to calculate MMIO GPIO addresses for devmem2/mmap

我正在嘗試訪問一些MMIO GPIO地址以進行LED控制和電池監視。 但是我不確定如何計算正確的地址。

該文檔指出以下內容:

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程序來進行計算:

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

任何幫助將不勝感激。

我不明白他們是怎么得到0xD0C506A0 ,但僅在某種程度上我不明白為什么它在以0xD0000000開頭的地址中。

您在計算其他所有內容時都有錯誤。 <<運算符具有比+更高的優先級,因此該方程式應加括號為COMMUNITY_BASE + (PORT ID << 16) + 0x500 為所討論的端口計算PORT_ID << 16將產生COMMUNITY_BASE + 0xC50000 + 0x500 = COMMUNITY_BASE + 0xC50500 為此,添加紅色用戶1 LED偏移量0x1A0以獲得COMMUNITY_BASE + 0xC506A0

我主要在此級別上進行ARM體系結構,因此我不了解設備0x0D信息如何變成COMMUNITY_BASE0xD0000000 ,但是您已經掌握了它。

如果您查看文檔,還將看到該地址是只寫的(“輸出”),這說明了為什么您無法從示例地址中進行讀取。 如果您不熟悉只寫GPIO寄存器,那么它們並不罕見。 通常的方法是要么不讀取它們,要么維護您認為它們應該在內存中的副本,然后抽象該對象,以便您從寄存器的私有值中“讀取”並“寫入”到寄存器中。實際的GPIO引腳並更新您的私有值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM