|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請(qǐng)教最簡(jiǎn)單的在用戶空間對(duì)物理地址進(jìn)行讀寫的方法 |
| 作者:忘情天書 欄目:ARM技術(shù) |
我的硬件平臺(tái)是AT91RM9200,跑著linux-2.4.27.我把AT91RM9200的ncs2 ,a2...a9,d0..d15都引到一個(gè)fpga的i/o上.現(xiàn)在需要和fga通信,就是需要對(duì)ncs2片選控制的物理地址進(jìn)行讀寫. 我想能不能寫個(gè)簡(jiǎn)單的程序,里面對(duì)上述要求初始化后,然后調(diào)用系統(tǒng)調(diào)用mmap,對(duì)地址進(jìn)行重影射后,就可以在用戶空間直接對(duì)地址為0x30000000的內(nèi)存進(jìn)行操作. 高手請(qǐng)說說這能不能實(shí)現(xiàn),如果能,能否指點(diǎn)一下流程和要點(diǎn),或者有更簡(jiǎn)單的辦法. 如果不能,應(yīng)該怎么辦? |
| 2樓: | >>參與討論 |
| 作者: centimetre 于 2006/9/28 14:13:00 發(fā)布:
可以 |
|
| 3樓: | >>參與討論 |
| 作者: wangkj 于 2006/9/28 14:23:00 發(fā)布:
就是你說的這種方法,完全沒問題。 |
|
| 4樓: | >>參與討論 |
| 作者: 忘情天書 于 2006/9/29 15:15:00 發(fā)布:
謝謝兩位,但是實(shí)際上 謝謝兩位。不好意思,我現(xiàn)在遇到實(shí)際問題,我不想用驅(qū)動(dòng)的方式去實(shí)現(xiàn),只想在應(yīng)用程序中映射。但是,我沒有在/kernel/sys.c上找到sys_mmap()系統(tǒng)調(diào)用,可在/include/asm-arm/unistd.h確實(shí)有sys_mmap()的定義。我是linux菜鳥,連sys_mmap()源碼都找不到,那根本不會(huì)調(diào)用它。而且我在網(wǎng)上又查到說要用ioremap()系統(tǒng)調(diào)用來實(shí)現(xiàn),都暈了! 不過在/arch/parisc/kernel/sys_parisc.c里找到了asmlinkage unsigned LONG sys_mmap( unsigned LONG addr, unsigned LONG len,unsigned LONG prot, unsigned LONG flags,unsigned LONG fd,unsigned LONG offset) {} 頭大啊,這些參數(shù)我的設(shè)想一點(diǎn)不粘邊。倒是/kernel/mm/memory.c里定義remap_page_range( unsigned LONG virt_add, unsigned LONG phys_add, unsigned LONG size, pgprot_t prot) {} 這個(gè)函數(shù)和我的要求還相近。virt_add重映射起始的用戶虛禮地址,phys_add虛擬地址所映射的物理地址,size被重映射的區(qū)域大小,prot新VMA的保證標(biāo)志。我是不是可以這樣填充參數(shù):virt_add=0x00000000; phys_add=0x30000000 ,size=0x20000 ,但是prot是什么意思啊?但是/arch/parisc/kernel/sys_parisc.c里的asmlinkage unsigned LONG sys_mmap不調(diào)用這個(gè)函數(shù)? 急!。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。! |
|
| 5樓: | >>參與討論 |
| 作者: wangkj 于 2006/9/29 16:07:00 發(fā)布:
給你幾個(gè)關(guān)鍵語句 example 1: void *map_base; //phy 0xffff f000 virtual address map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, AT91_SYS);//AT91_SYS = 0xffff f000 ch1=*(unsigned int*)(map_base + ((PIOB_OFFSET + AT91_PIO_PDSR )));//PA0...PA5 ch2=*(unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_PDSR )));//PC14,PC15 example 2: volatile unsigned int *map_base_KEYLE; //(0x60000000 virtual address (*map_base_KEYLE)=(~(0x1<<i))&(~(0x1<<i+16)); (*map_base_KEYLE)=0x0; |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |