[問題] 使用mmap在arm linux上存取physical adderss的問題

看板LinuxDev作者 (Trai)時間18年前 (2006/12/30 10:50), 編輯推噓6(607)
留言13則, 6人參與, 最新討論串1/1
我希望能在arm linux中直接存取soc版子以已經定義好的 memroy map I/O 像是led 7-setment等等,但是因為使用linux 所以程式無法直接去存取這些physical address。 找到的方法是利用/dev/mem來存取physical address,並使用mmap 來map到要存取的記憶體位置到user space,目前的結果是map的過程 沒有問題,成功傳回可用的指標,但是將其值讀出後發現似乎有點問題 所讀出的值都是0,這是蠻奇怪的結果,但是我不知道原因出在哪裡, 不知道是否有人有過類似的經驗能夠分享一下。我用的版子是新華的 preSoc Creator。 謝謝~~^^ ========================================================= 不好意思 我可能提供太少資訊了 多謝大大提醒 根據manual 上提供的資料 led 位在 0x30000000 offset 為 0x0c04 下面是程式片斷 僅把比較關鍵列出來,錯誤處理省略 #define BASE = 0x30000000 #define OFFSET = 0x0c04 int fd; unisgned char *mem; fd = open("/dev/mem", O_RDWR | O_SYNC); mem = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd,BASE); //到這裡都成功,判斷mem 值也非-1 我使用下面的敘述來查看記憶體的內容 printf("%x",*(mem+OFFSET)); 大致上是這樣 程序很簡單 這是我找到最容易達到目標的方式 但是卻不知道為何讀不到正確的physical address 謝謝^^ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.89.1 ※ 編輯: Trai 來自: 140.113.89.1 (12/30 11:05)

12/30 11:15, , 1F
問問題要學著提供足夠的資訊
12/30 11:15, 1F
※ 編輯: Trai 來自: 140.113.89.1 (12/30 11:43)

12/30 11:43, , 2F
謝謝提醒^^
12/30 11:43, 2F

12/30 13:00, , 3F
請用ioremap來轉換實體與虛擬記憶體的對映
12/30 13:00, 3F

12/30 13:38, , 4F
printf("%x",*(volatile*)(mem+OFFSET)); 試試有用嗎?
12/30 13:38, 4F

12/30 21:32, , 5F
新華那塊是直接用實體位址,不用再ioremap了
12/30 21:32, 5F

12/30 22:40, , 6F
很可能是r兄說的volatile的問題
12/30 22:40, 6F

12/31 10:39, , 7F
謝謝各位 我使用volatile 實驗之後 還是無法讀取到正確的值
12/31 10:39, 7F

12/31 10:40, , 8F
*(volatile unsigned short *)(mem+offset) //程式改為這樣
12/31 10:40, 8F

12/31 10:42, , 9F
//讀出來仍然全都是0
12/31 10:42, 9F

12/31 10:42, , 10F
不過我試著去讀取BASE = 0x10000000前面一點的位址 可以讀到ꨠ
12/31 10:42, 10F

12/31 10:43, , 11F
非零值 我在想會不會是位址使用錯誤了 但這個位址是新華檔案
12/31 10:43, 11F

12/31 10:43, , 12F
裡面定義的 他的程式單純在arm上面跑 的確使用此位址
12/31 10:43, 12F
※ 編輯: Trai 來自: 140.113.89.1 (12/31 10:45)

01/02 02:42, , 13F
S3C2410齁...
01/02 02:42, 13F
文章代碼(AID): #15bTFONb (LinuxDev)
文章代碼(AID): #15bTFONb (LinuxDev)