[問題] Memory mapping I/O

看板C_and_CPP作者 (卡多)時間15年前 (2010/06/24 15:44), 編輯推噓3(309)
留言12則, 4人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 小弟有個問題想請問有寫過類似這種Code經驗的人,我已知IO base address(例如:Codec) 這部分已經可以抓到正確base address,而這base address對應到記憶體的某位址, 我必須對這個記憶體的位址裡面register進行存取行為 在網路上找了許多資訊確還是沒有結果請問有這種function可以用的嗎?? 希望得到的正確結果: 存取memory中的register 程式跑出來的錯誤結果:開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) DJGPP(Compiler) + RHIDE(IDE) +純DOS 有問題的code: (請善用置底文標色功能) #include <stdio.h> #include <stdlib.h> #include <pc.h> //include outportb and inportb function #include <dpmi.h> #define Func_num 0x00 //Define function number #define Dev_num 0x1B //Define device number #define Bus_num 0x00 //Define bus number #define Reg_num 0x10 //Define Register number unsigned int selector; int main(void) { unsigned int SMbus_Address, offset, vrb_data, flag; //define smbus base address __dpmi_meminfo mi; offset = (Func_num<<8)+(Dev_num<<11)+(Bus_num<<16)+Reg_num; //offset value SMbus_Address = 0x80000000 + offset; //bit 31 must be 1 outportl(0xcf8,SMbus_Address); //write value to CONFIG_ADDRESS SMbus_Address = inportl(0xcfc) & 0xFFFFFFF0; //find SMbus base address printf("SMbus base address=%x\n",SMbus_Address); ----------------------------------------------------------------------------- 下面部分參考DJGPP LIB ONLINE 有人知道這用意是甚麼嗎? P.S:我大概了解要做甚麼 但有那種似懂非懂感覺 不知是否有板友能夠解釋 ----------------------------------------------------------------------------- mi.address = SMbus_Address; //base address mi.size = 0x10000; __dpmi_physical_address_mapping(&mi); selector = __dpmi_allocate_ldt_descriptors(1); //define a selector __dpmi_set_segment_base_address(selector, mi.address); __dpmi_set_segment_limit(selector, mi.size-1); -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.85.31.55 ※ 編輯: lordking 來自: 219.85.31.55 (06/24 23:46) ※ 編輯: lordking 來自: 219.85.31.55 (06/24 23:48)

06/24 23:50, , 1F
在玩PCI config space的東西嗎?? 講存取mem中的reg怪怪
06/24 23:50, 1F

06/24 23:50, , 2F
window platform or linux?
06/24 23:50, 2F

06/24 23:50, , 3F
的. 小弟的了解是, MMIO是把某HW的reg存取, map到某一段
06/24 23:50, 3F

06/24 23:52, , 4F
mem addr space上, 如此存取該addr(Ex:0xF8000000)就相
06/24 23:52, 4F

06/24 23:52, , 5F
V大沒錯 是我表述錯誤
06/24 23:52, 5F

06/24 23:52, , 6F
當於存取HW的某個功能的reg. 要能存取想要的reg, 你就要
06/24 23:52, 6F

06/24 23:53, , 7F
找到base與該reg的offset, 然後....就讀寫下去了說@_@"
06/24 23:53, 7F
V大說的流程我都知道 我只是想了解是否有提共 MMIO function 妳說的應該是 直接對IO去access 這部分我OK ^^ ※ 編輯: lordking 來自: 219.85.31.55 (06/24 23:55)

06/24 23:54, , 8F
通常要注意的是MMIO addr的變數要宣告成volatile就是@@"
06/24 23:54, 8F
※ 編輯: lordking 來自: 219.85.31.55 (06/24 23:57) ※ 編輯: lordking 來自: 219.85.31.55 (06/24 23:58)

06/25 00:05, , 9F
你找到 BAR 就直接用 offset 存取各種 reg 即可
06/25 00:05, 9F

06/25 00:05, , 10F
在 DOS 下你要先進 flat mode
06/25 00:05, 10F

06/25 00:07, , 11F
純DOS算是最簡單寫的了
06/25 00:07, 11F

06/25 00:14, , 12F
小弟的認知也是查spec看要的reg的offset在哪, 就r/w了@@
06/25 00:14, 12F
文章代碼(AID): #1C8trb6m (C_and_CPP)