Hi! I try to write small driver to make access to pci device resource from userland using mmap. Code below didnt work. :( >From I module in debug I make some testes - I can read from device registers but after mmap from userspace I reading just part of memory. :( Some cache? CPU - au1500 ..... static unsigned long *offset; static int mdrv_mmap(struct file * file, struct vm_area_struct *vma) { int ret; struct inode *inode; inode = file->f_dentry->d_inode; ret = -EINVAL; unsigned long start = vma->vm_start; unsigned long size = (vma->vm_end-vma->vm_start); offset = ioremap(0x40000000,0x40); printk("0x%p\n",__pa(offset)); printk("lb 0x%X\n",offset[ 0x3C>>2 ] ); vma->vm_flags |= VM_LOCKED; printk("+++++0x%X 0x%X\n",start,size); vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); ret = remap_page_range( start, 0x40000000, size, vma->vm_page_prot ); //0x40000000 is first iomem range of pci device return ret; } struct file_operations mdrv_fops = { .open = mdrv_open, .release = mdrv_close, .read = mdrv_read, .write = mdrv_write, .mmap = mdrv_mmap }; .... Here is userland #include "mdrv.h" #include <sys/mman.h> #include <stdio.h> #include <string.h> #include <fcntl.h> #include <linux/kernel.h> #include <string.h> int fd,fd2; int main () { fd = open("/dev/mboard0",O_RDWR); unsigned long *x; x = mmap(NULL,64,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); printf("mmap return: 0x%X",x); if(x == MAP_FAILED) { printf(" it is very bad! :(\n"); perror("mmap:"); return -1; } printf(" its ok!\n"); int i; for(i=0;i<16;i++) { printf(" %d = 0x%X\n",i,x[i]); } munmap(x,64); return 0; }