看板 LinuxDev 關於我們 聯絡資訊
我希望能在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