作者Trai (Trai)
看板LinuxDev
標題[問題] 使用mmap在arm linux上存取physical adderss的問題
時間Sat Dec 30 11:01:31 2006
我希望能在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)
推 fumin:問問題要學著提供足夠的資訊 12/30 11:15
※ 編輯: Trai 來自: 140.113.89.1 (12/30 11:43)
→ Trai:謝謝提醒^^ 12/30 11:43
推 tseng1129:請用ioremap來轉換實體與虛擬記憶體的對映 12/30 13:00
推 roylee17:printf("%x",*(volatile*)(mem+OFFSET)); 試試有用嗎? 12/30 13:38
推 fish39:新華那塊是直接用實體位址,不用再ioremap了 12/30 21:32
推 fumin:很可能是r兄說的volatile的問題 12/30 22:40
→ Trai:謝謝各位 我使用volatile 實驗之後 還是無法讀取到正確的值 12/31 10:39
→ Trai:*(volatile unsigned short *)(mem+offset) //程式改為這樣 12/31 10:40
→ Trai://讀出來仍然全都是0 12/31 10:42
→ Trai:不過我試著去讀取BASE = 0x10000000前面一點的位址 可以讀到ꨠ 12/31 10:42
→ Trai:非零值 我在想會不會是位址使用錯誤了 但這個位址是新華檔案 12/31 10:43
→ Trai:裡面定義的 他的程式單純在arm上面跑 的確使用此位址 12/31 10:43
※ 編輯: Trai 來自: 140.113.89.1 (12/31 10:45)
推 NcThoR:S3C2410齁... 01/02 02:42