vinit dhatrak wrote, Tuesday 22 September 2009:
> You may want to take a look at this page,
> http://www.scs.ch/~frey/linux/memorymap.html
Already did. In fact my code was pretty similar, I took this example:
http://www.captain.at/howto-linux-device-driver-mmap.php
that refers to your link.
> If you could share exact code, that would be easy to debug the problem
> you are facing.
Right, attaching both device and test code.
( that's the version with __get_free_pages(), but it shouldn't change
anything... )
Thanks.
--
-gaspa-
-----------------------------------------------
-------- https://launchpad.net/~gaspa ---------
------ HomePage: iogaspa.altervista.org -------
-Il lunedi'dell'arrampicatore: www.lunedi.org -
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 1024
int main(void){
int fd=0,i;
unsigned char* mmapped_ptr=NULL;
fd = open("/dev/skeleton",O_RDWR | O_SYNC);
printf("opened fd: %d\n",fd);
mmapped_ptr = mmap(NULL,SIZE,PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED ,fd,0);
if( mmapped_ptr == MAP_FAILED )
perror("BOH");
printf("file mmap'd at %p \n",mmapped_ptr);
for( i=0; i < SIZE; i++){
printf(" i=%d, mmap[%d]=%d\n",i,i,mmapped_ptr[i]);
}
printf("all done\n");
}
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/vmalloc.h>
#include <linux/mman.h>
#include <linux/slab.h>
#define DEVICEMAJOR 240
#define DEVICENAME "mmaptest"
static unsigned long pages_area = NULL;
#define LEN (64*1024)
static int mmaptest_open (struct inode *inode, struct file *file) {
printk("mmaptest_open\n");
return 0;
}
static int mmaptest_release (struct inode *inode, struct file *file) {
printk("mmaptest_release\n");
return 0;
}
static int mmaptest_mmap(struct file * filp, struct vm_area_struct * vma) {
int ret;
ret = remap_pfn_range(vma, vma->vm_start,
virt_to_phys((void*)pages_area) >> PAGE_SHIFT,
vma->vm_end-vma->vm_start, vma->vm_page_prot);
if(ret != 0) {
return -EAGAIN;
}
return 0;
}
struct file_operations mmaptest_fops = {
.owner = THIS_MODULE,
.mmap = mmaptest_mmap,
.open = mmaptest_open,
.release = mmaptest_release,
};
// initialize module
static int __init mmaptest_init_module (void) {
int i;
printk("initializing module\n");
i = register_chrdev (DEVICE_MAJOR, DEVICE_NAME, &mmaptest_fops);
if (i != 0) return - EIO;
pages_area = __get_free_pages( GFP_KERNEL | GFP_DMA, get_order(LEN) );
if (pages_area){
printk("Get_free_pages successfull: %p - %d pages.\n",pages_area,get_order(LEN));
printk(" virt to phys addr. -> %p \n", virt_to_phys(pages_area) );
}
else{
unregister_chrdev (DEVICE_MAJOR, DEVICE_NAME);
printk("ERROR on getting pages\n");
return -ENOMEM;
}
// fill allocated memory with chars
for( i = 0; i < LEN; i++) {
((unsigned char*)pages_area)[i] = (unsigned char)i;
}
printk("TEST: ");
for( i = 0; i < 20; i++) {
printk(" %d ",( (unsigned char*)pages_area)[i]);
}
printk("\n");
return 0;
}
// close and cleanup module
static void __exit mmaptest_cleanup_module (void) {
printk("cleaning up module\n");
__free_pages(pages_area,get_order(LEN));
unregister_chrdev (DEVICE_MAJOR, DEVICE_NAME);
}
module_init(mmaptest_init_module);
module_exit(mmaptest_cleanup_module);
MODULE_AUTHOR("Gaspa");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("MMap test");