Hi all ...
 
I am uploading the source code which is doing the following :-

1. mapping cpld register using ioremap coping the data to circular buffer
and remapping it to user space .

2. It can also map kernel virtual dma memory to user space if compiled
conditionally .

following is the problem which i am facing ...

1. It is somitimes giving following kernel panic ....

nable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c0004000
[00000000] *pgd=00000000
Internal error: Oops: 17 [#1]
Modules linked in: fluke_driver tstamp sig_router mvci_spi mvci_sf_pcd
mvci_sci_unidir_s1 mvci_sci_diff mvci_sci_bidir_s
1 mvci_rtmd_s1 mvci_kwiso_s1 mvci_kw1281_s1 mvci_kh_s1 mvci_j1850
mvci_gm_sbc mvci_diagh_s1 g_ether mvci_dcl mvci_can1 f
pga_conf arcotg_udc adc_dac keypad(F) splc501_lcd(F) cpld
CPU: 0
PC is at cascade+0x64/0x8c
LR is at __init_begin+0x3fff8000/0x30
pc : [<c00484ac>]    lr : [<00000000>]    Tainted: GF
sp : c0293ea8  ip : 0040b000  fp : c0293ecc
r10: 8001d9f0  r9 : c0292000  r8 : 00000001
r7 : c0292000  r6 : 0000000c  r5 : c02fa048  r4 : 00000000
r3 : c02fa2f8  r2 : 0000261a  r1 : bf01ab70  r0 : c02fa2f8
Flags: Nzcv  IRQs off  FIQs on  Mode SVC_32  Segment kernel
Control: C5387F
Table: 8698C000  DAC: 00000017
Process swapper (pid: 0, stack limit = 0xc0292250)
Stack: (0xc0293ea8 to 0xc0294000)
3ea0:                   bf01ab70 c02fb440 0000000a 00000000 c02fa048
0000000a
3ec0: c0293efc c0293ed0 c0048810 c0048454 c0293eec c0293ee0 c002a30c
00000001
3ee0: c02f9e44 0000000a 00000002 00000001 c0293f1c c0293f00 c00442a0
c0048794
3f00: c0293f2c 0000001d c0294740 00000000 c0293f2c c0293f20 c00446d4
c0044254
3f20: c0293f4c c0293f30 c00217b0 c0044698 c0293f5c ffffffff 0000ffff
00000001
3f40: c0293fa4 c0293f50 c00209e4 c0021770 00000001 00000001 c0292000
00000000
3f60: c0022068 c0292000 c0298c44 c03121c0 8001da24 4107b364 8001d9f0
c0293fa4
3f80: c0293fa8 c0293f98 c0021d48 c002209c 60000013 ffffffff c0293fbc
c0293fa8
3fa0: c0021d48 c0022074 c02faae0 c02f292c c0293fcc c0293fc0 c00202e0
c0021d24
3fc0: c0293ff4 c0293fd0 c0008848 c00202b4 c00083c4 00000000 00000000
c02f29a8
3fe0: 00000000 00c5387d 00000000 c0293ff8 80008030 c00086e0 00000000
00000000
Backtrace:
[<c0048448>] (cascade+0x0/0x8c) from [<c0048810>]
(run_timer_softirq+0x88/0x1e8)
 r6 = 0000000A  r5 = C02FA048  r4 = 00000000
[<c0048788>] (run_timer_softirq+0x0/0x1e8) from [<c00442a0>]
(__do_softirq+0x58/0xc8)
 r8 = 00000001  r7 = 00000002  r6 = 0000000A  r5 = C02F9E44
 r4 = 00000001
[<c0044248>] (__do_softirq+0x0/0xc8) from [<c00446d4>] (irq_exit+0x48/0x5c)
 r6 = 00000000  r5 = C0294740  r4 = 0000001D
[<c004468c>] (irq_exit+0x0/0x5c) from [<c00217b0>] (asm_do_IRQ+0x4c/0x64)
[<c0021764>] (asm_do_IRQ+0x0/0x64) from [<c00209e4>] (__irq_svc+0x44/0x80)
 r6 = 00000001  r5 = 0000FFFF  r4 = FFFFFFFF
[<c0022068>] (default_idle+0x0/0x3c) from [<c0021d48>] (cpu_idle+0x30/0x5c)
[<c0021d18>] (cpu_idle+0x0/0x5c) from [<c00202e0>] (rest_init+0x38/0x40)
 r5 = C02F292C  r4 = C02FAAE0
[<c00202a8>] (rest_init+0x0/0x40) from [<c0008848>]
(start_kernel+0x174/0x1c0)
[<c00086d4>] (start_kernel+0x0/0x1c0) from [<80008030>] (0x80008030)
Code: e1530005 15822000 ebffffb6 e1a0e004 (e5944000)
 <0>Kernel panic - not syncing: Aiee, killing interrupt handler!


also when i run it on X86 PC i am able to get the data and no panic where in
on the board it is giving the above error ....

2. I can raed the data using the user application when i run it on X86 PC
where in i cant able to read the data when i run it on the board the data i
was getting was always '/0' filled buffer .


Here is the compilete code .............


/******************************************************************************
* McBSP_Driver.c
*
* Fluke Driver
*
* Description:
*
* Libraries Used:
*
*
* Unit Test Drivers (Binary):
*
*               <fix me >
*
*
* Special Compile Flags
*               Nil
*
* Revision History:
*       (17/July/2008) Misbah
*               Created the file
*
* Copyright (C)
*
******************************************************************************/

/******************************************************************************
*                                               Include Files
*****************************************************************************/

/* Standard linux files includes */
#include<linux/kernel.h>
//#include<linux/config.h>
#include<linux/ioctl.h>
#include<linux/types.h>
#include<linux/module.h>
#include<linux/fs.h>
#include<linux/delay.h>
#include<linux/init.h>
#include<linux/interrupt.h>
#include<linux/version.h>
#include<linux/wait.h>
#include<linux/poll.h>
#include<linux/timer.h>
#include<linux/irq.h>
#include<asm/uaccess.h>
#include<linux/time.h>
#include<asm/io.h>
#include<asm/bitops.h>
#include<linux/mm.h>
//#include<asm/mmzone.h>
#include<linux/bootmem.h>
#include <linux/dma-mapping.h>
#include <linux/vmalloc.h>
#include <asm/pgtable.h>
#include<asm/io.h>
#include<asm/bitops.h>
#include"fluke_driver.h"

static int McBSP_DriverOpen(struct inode *inode,struct file *file);
static int McBSP_DriverInit(void);
static int McBSP_DriverIoctl(struct inode *inode, struct file *file,\
                                        unsigned int cmd, unsigned long param);
static ssize_t McBSP_DriverWrite(struct file *file,
                        const char __user *buf, size_t len,loff_t *offset);
static ssize_t McBSP_DriverRead(struct file *file,char __user *buf,size_t
len,
                        loff_t *offset);
static int McBSP_DriverMmap(struct file *file,struct  vm_area_struct *vma);
static void MmapOpen(struct vm_area_struct *vma);
static void MmapClose(struct vm_area_struct *vma);
static void McBSP_DriverExit(void);
static int McBSP_DriverClose(struct inode *inode,struct file *file);
static int WriteBuf(void);
void timer_func(void);

static struct timer_list                fluke_timer;
static dma_addr_t                               dma_addr;
static char                                             *buf_ptr;

static struct file_operations fluke_fops =
{
        .owner          = THIS_MODULE,
        .open           = McBSP_DriverOpen,
//      .read           = McBSP_DriverRead,
        .ioctl          = McBSP_DriverIoctl,
        .mmap           = McBSP_DriverMmap,
//      .write          = McBSP_DriverWrite,
        .release        = McBSP_DriverClose,
};

/* File operation structure for mmap system call */
static struct vm_operations_struct mmap_op=
{
        .open           =       MmapOpen,
        .close          =       MmapClose,
};

static circularbuffer_S *buf_area = NULL;
static circularbuffer_index_S buf_index_area;
static int device_open_count      = 0;
static int data_present_status    = 0;

void *ioremap_ptr;
static int phy_addr ;

/* static declaration of wait queue  */
static DECLARE_WAIT_QUEUE_HEAD(wait_queue);

static DECLARE_MUTEX(mutex);

module_init(McBSP_DriverInit);
module_exit(McBSP_DriverExit);

MODULE_AUTHOR("Misbah U K");
MODULE_LICENSE ("GPL");

#define SIMULATION
/****************************************************************************
*
* Description: This function will open fluke device
*
* Input:        File structure pointer and Inode structure pointer.
*                       ( passed by the kernel )
*
* output:       Returns 0 on Success.
*
***************************************************************************/
static int McBSP_DriverOpen(struct inode *inode,struct file *file)
{
        /* Reintialize file operation structure */
        file->f_op=&fluke_fops;

        printk(KERN_DEBUG" fluke driver open success \n");

        if (device_open_count == 0)
        {
                device_open_count = 1;

                /* Reset the read and write index*/
                buf_index_area.write_index=0;
                buf_index_area.read_index=-1;
                buf_index_area.count_index=0;

                #ifdef SIMULATION
                /* Initialize the Timer */
                init_timer(&fluke_timer);
                fluke_timer.expires = jiffies + (HZ*10);//Timer will Expire 
after 60 sec
                fluke_timer.data = 0;
                fluke_timer.function = (void *)timer_func;
                add_timer(&fluke_timer);
                #endif
        }

        return 0;
}

/******************************************************************************
 *
 * Description : Interrupt handler function.
 *
 * Input:                NONE
 *
 * Output:               NONE
 *

*****************************************************************************/
irqreturn_t DataAcqIntHandler(int irq,void *dev_id, struct pt_regs *regs)
{
        printk(KERN_ALERT" In Interrupt Handler\n");
        /* Data present status is set to wake up the read call */
        data_present_status=1;

        /* Wake up the blocked Select call */
        wake_up_interruptible(&wait_queue);

        #ifndef SIMULATION
        /* Clear the interrupt in the interrupt pending registor */
        cpi->ic_scprrh |=DATA_ACQ_INT_CLEAR;
        #endif

        return IRQ_HANDLED;

}/* End of PpsIntrHandler() */

#ifdef SIMULATION
void timer_func(void)
{

        printk(KERN_ALERT" In the timer function \n");
        /* Data present status is set to wake up the read call */
        data_present_status=1;

        /* Wake up the blocked Read call */
        wake_up_interruptible(&wait_queue);

}

#endif

/***************************************************************************
*
* Description: Register the device and perform Initialization.
*
* Input:                NIL
*
* Output:               Returns 0 on Success and -1 on failure
*
**************************************************************************/
static int __init McBSP_DriverInit(void)
{
        unsigned int virt_addr = 0;
        int mem = 0;

        //buf_area = vmalloc(sizeof(circularbuffer_S));
        //if(!buf_area)
        //{
        //      printk(KERN_ALERT"vmalloc failed \n");
        //      return -1;
        //}

#if 0
        /*
        * Allocate memory for the circular buffer in the DMA coherent area
        * and algin it in the Cache
        */
        mem = L1_CACHE_ALIGN(sizeof(circularbuffer_S));

        buf_ptr = (char *)dma_alloc_coherent(NULL, mem, &dma_addr,GFP_KERNEL);
        printk(KERN_INFO" buf_ptr = 0x%x \n",(int )buf_ptr);
        if(NULL == buf_ptr )
        {
                printk(KERN_ALERT" Allocation of Memory failure ");
                return -1;
        }

        buf_area = (circularbuffer_S *)(((unsigned int )buf_ptr + PAGE_SIZE - 
1) \
                        & PAGE_MASK);

        printk(KERN_INFO" buf_area = 0x%x \n",(int )buf_area);

        if(NULL == buf_area)
        {
                printk(KERN_ALERT" Circular buffer memory not allocated \n");
                return -1;
        }

        /* Marking the Pages as reserved */
        for (virt_addr = (unsigned int)buf_area; \
        virt_addr < (unsigned int )buf_area + sizeof(circularbuffer_S);\
        virt_addr += PAGE_SIZE)
        {
                /* Set the pages as reserved */
                SetPageReserved(virt_to_page(virt_addr));
                //mem_map_reserve(virt_to_page(virt_addr));
        }

        phy_addr = virt_to_phys(buf_ptr);
        printk(KERN_INFO"Allocated Memory for Circular Buffer at physical
0x0%x\n",phy_addr);

#else

        buf_area = ioremap(0xB2000000,0x4000); //(0xB2000000,0x4000);
//(7700000,900000);
        if(!buf_area)
        {
                printk(KERN_ALERT"ioremap failed \n");
                return -1;
        }

        printk(" Ioremap mapped to virtual 0x0%x \n",buf_area);
        *((unsigned int *)buf_area) = 0xa5a5a5a5;
        printk(" Ioremap data  0x0%x \n",*((unsigned int *)buf_area + 0));

#endif

        /* Device major number is registered to set the driver entry point */
        if(register_chrdev(MAJOR_NO,MODULE_NAME, &fluke_fops)==0)
        {
                printk(KERN_DEBUG" Fluke driver registeration success \n");

        }
        else
        {
                printk(KERN_ALERT" Fluke driver registeration failed \n");
                return -1;
        }

        /*
         * Register Data Acq interrupt request with specified irq and install 
the
         * handler
         */
         if(request_irq(DATA_ACQ_INT,(void *)DataAcqIntHandler, SA_INTERRUPT,
                                                        MODULE_NAME, NULL)==0)
        {
                printk(KERN_DEBUG" Data Acq interrupt request returns success 
\n");
        }
        else
        {
                printk(KERN_DEBUG" Data Acq interrupt request failed \n");
                unregister_chrdev(MAJOR_NO,MODULE_NAME);
                return -1;

        }

        /* Reset the read and write index*/
        buf_index_area.write_index=0;
        buf_index_area.read_index=0;
        buf_index_area.count_index=0;

        return 0;

}

/***************************************************************************
*
* Description: Input/Output entry point for driver.
*
* Input:                Inode pointer, File pointer, command and parameter.
*
* Output:               Returns 0 on success and -1 on failure.
*
**************************************************************************/

static int McBSP_DriverIoctl(struct inode *inode, struct file *file,\
                                                                        
unsigned int cmd, unsigned long param)
{
        int i;
        daq_t daq_param;

        printk(KERN_DEBUG"In ioctl command \n");

        switch(cmd)
        {
                case START_ACQ_DATA:

                        if(copy_from_user(&daq_param,(void 
*)param,sizeof(daq_param)))
                        {

                                return -1;
                        }

                        /* For Simulation we are writing the data */
                        if(WriteBuf() < 0)
                        {
                                printk(" Writing to the memory failure \n");
                                return -1;
                        }

                        /* Wait for the Interrupt to occur */
                        wait_event_interruptible( wait_queue, 
data_present_status !=0);

                        printk("Read Index before read 
%d\n",buf_index_area.read_index);
                        data_present_status=0;

                        buf_index_area.read_index++;
                        buf_index_area.read_index%=NO_FRAMES;

                        if(buf_index_area.read_index 
==((buf_index_area.write_index +1) %
NO_FRAMES))
                        //if(buf_index_area.read_index == 
buf_index_area.write_index )
                        {
                                printk("Read failure because read and write 
index are same\n");
                                return -1;
                        }

                        /* Decrement the count index to indicate the data 
availibility */
                        down(&mutex);
                        buf_index_area.count_index--;
                        up(&mutex);

                        /* copy the circular buffer read index */
                        daq_param.circular_index = buf_index_area.read_index;

                        /*for(i = 0;i < SIZE_FRAME; i++)
                        {
                                
printk("%c",buf_area->fluke[buf_index_area.read_index].buffer[i]);
                        }
                        */
                        /* Configure ADC unit for No of samples and period */
                        /* < To Dod > */
                        #ifdef SIMULATION
                        /* Reinitialize the timer and run it again */
                        init_timer(&fluke_timer);
                        fluke_timer.function=(void *)timer_func;
                        fluke_timer.data=0;
                        fluke_timer.expires=jiffies + (HZ*10);
                        del_timer(&fluke_timer);
                        printk(KERN_DEBUG"Timer reinitialize in ioctl \n");
                        add_timer(&fluke_timer);

                        #endif
                        printk("Read Index after read 
%d\n",buf_index_area.read_index);
                        if(copy_to_user((void 
*)param,&daq_param,sizeof(daq_param)))
                        {

                                return -1;
                        }

                        break;
                default:
                        return(0);
        }
        return (0);
}

/******************************************************************************
* Description: This function writes data to the device.
*
* Inputs:  NONE
*
* Outputs: Returns No of bytes copied or -1 on failure.
******************************************************************************/
static ssize_t McBSP_DriverWrite(struct file *file,
                        const char __user *buf, size_t len,loff_t *offset)
{

        int i,write_index;
        write_index = buf_index_area.write_index;
        if(buf_index_area.read_index ==((buf_index_area.write_index +1) %
NO_FRAMES))
        //if(buf_index_area.read_index == buf_index_area.write_index )
        {
                printk(KERN_ALERT"Not able to write\n");
                return -1;
        }
        printk(KERN_INFO" Before Write index = 
%d\n",buf_index_area.write_index);
        for(i=0;i<len;i++)
        {
                buf_area->fluke[write_index].buffer[i]=buf[i];
                //memset(buf_area->fluke[write_index].buffer,'A',SIZE_FRAME);
                //for(i = 0;i < SIZE_FRAME; i++)
                //{
                //      printk("%c",buf_area->fluke[write_index].buffer[i]);
                //}
                //printk(" %c",buf_area->fluke[write_index].buffer[i]);
        }
        for(i = 0;i < SIZE_FRAME; i++)
        {
                printk("%c",buf_area->fluke[write_index].buffer[i]);
        }
        //len = copy_from_user(buf_area->fluke[write_index].buffer,buf,len);

        //memcpy_fromio(ioremap_ptr,buf_area->fluke[write_index].buffer,4);

        buf_index_area.count_index++;
        buf_index_area.write_index++;
        buf_index_area.write_index%=3;

        printk(KERN_INFO" After Write index = %d\n",buf_index_area.write_index);

        return len;

}

/******************************************************************************
* Description: This function writes data to the circular buffer.
*
* Inputs:  NONE
*
* Outputs: Returns No of bytes copied or -1 on failure.
******************************************************************************/
static int WriteBuf(void)
{
        int i;

        printk(" write Index is %d \n",buf_index_area.write_index);
        if(buf_index_area.read_index ==((buf_index_area.write_index +1) %
NO_FRAMES))
        //if(buf_index_area.read_index == buf_index_area.write_index )
        {
                printk(KERN_ALERT"Not able to write\n");
                return -1;
        }

        
memset(buf_area->fluke[buf_index_area.write_index].buffer,'A',SIZE_FRAME);

        /*for(i = 0;i < SIZE_FRAME; i++)
        {
                
printk("%c",buf_index_area.fluke[buf_index_area.write_index].buffer[i]);
        }
        */
        buf_index_area.count_index++;
        buf_index_area.write_index++;
        buf_index_area.write_index%=3;
        printk(" write Index incremented to %d \n",buf_index_area.write_index);

        return 0;
}


/******************************************************************************
* Description: This function reads data from the shared mmap area.
*
* Inputs:  file structuer,data buffer pointer and length of data.
*
* Outputs: Return no of bytes read or -1 on failure.
*
******************************************************************************/
static ssize_t McBSP_DriverRead(struct file *file,char __user *buf,size_t
len,
                        loff_t *offset)
{

        int temp_read_index,i;
        printk(KERN_INFO"Entering %s\n",__FUNCTION__);

        /* Wait till timer Expires */
        wait_event_interruptible( wait_queue, data_present_status !=0);

        data_present_status=0;

        buf_index_area.read_index++;
        buf_index_area.read_index%=NO_FRAMES;

        /* Decrement the count index to indicate the data availibility */
        down(&mutex);
        buf_index_area.count_index--;
        up(&mutex);

        temp_read_index = buf_index_area.read_index;

        printk(KERN_INFO"Exting %s\n",__FUNCTION__);

        printk(KERN_INFO"count_index=%d\n",buf_index_area.count_index);
        printk(KERN_INFO"read_index=%d\n",buf_index_area.read_index);
        /*for(i = 0 ;i < SIZE_FRAME ; i++)
        {
                printk("%c",buf_area->fluke[temp_read_index].buffer[i]);
        }
        */
        return((temp_read_index));
}

/*****************************************************************************
* Description:This function is used to map the memory area to user
application.
*                               There is a circular buffer which is created in 
the driver.
*                          This region is mmaped to the user application by 
this function.
*                          This fuction sets the permissions for that area 
accordingly.
*
* Inputs:file pointer, virtual memory area structure.
*
* Outputs: Returns 0 on success or -1 on failure.
*******************************************************************************/
static int McBSP_DriverMmap(struct file *file,struct  vm_area_struct *vma)
{

        unsigned long start = vma->vm_start;
        unsigned long size = vma->vm_end - vma->vm_start; //0x900000;
        unsigned long phy_add = virt_to_phys(buf_ptr); //0x7700000;
        int ret = 0;

        /* Make the mmaped area noncacheable */
        vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

        /* Set the Flags to give permissions to Mmaped area */
        vma->vm_flags |=VM_RESERVED;
        vma->vm_flags |=VM_READ;
        vma->vm_flags |=VM_WRITE;
        vma->vm_flags |=VM_IO;
        //vma->vm_flags |=VM_SHARED;
        //vma->vm_flags |=VM_LOCKED;

        printk(KERN_DEBUG"In mmap function\n");

        /* Mmap the kernel buffer to user space */
        if(remap_pfn_range(vma,start,(phy_add >>
PAGE_SHIFT),size,vma->vm_page_prot))
        //if(remap_pfn_range(vma,start,vma->vm_pgoff,size,vma->vm_page_prot))
        {
                printk(KERN_ALERT"remap_pfn_range failed\n");
                goto mmap_exit;

        }

        printk(KERN_ALERT"phy addr 0x%08X mmapped to virt addr 0x%08X, size =
0x%08X\n",
                (unsigned int)phy_add, (unsigned int)start, (unsigned int)size);

        /* Initialize the file operation structure of Mmaped area */
        vma->vm_ops=&mmap_op;

        /* Open the Mmaped area */
        MmapOpen(vma);

        mmap_exit:
                return ret;
}

/******************************************************************************
* Description: This function opens mmaped area for the device.
*
* Inputs:  Virtual memory area structure.
*
* Outputs: none
******************************************************************************/
static void MmapOpen(struct vm_area_struct *vma)
{
        printk("Mmaped are is opened \n");

        printk("Virtual= %lx, Physical=%lx \n",vma->vm_start,
                (vma->vm_pgoff << PAGE_SHIFT));
        return;
}

/******************************************************************************
* Description: This function closes mmaped area for the device
*
* Inputs: Virtual Memory structure.
*
* Outputs: Return CASHEL_SUCCESS after closing the device.
******************************************************************************/
static void MmapClose(struct vm_area_struct *vma)
{
        printk(KERN_DEBUG"Mmaped are is closed\n ");
        return;
}

/******************************************************************************
*
* Description   : Unregisters the driver and makes the resources free.
*
* Input         : NIL
*
* Output                : NIL
*
*****************************************************************************/
static void __exit McBSP_DriverExit(void)
{
        unsigned int virt_addr;

#if 0
        /* Clear or Free the pages which are reserverd */
        for (virt_addr=(unsigned int)buf_area; virt_addr < (unsigned 
int)buf_area
                                                                                
+ sizeof(circularbuffer_S);
        virt_addr += PAGE_SIZE)
        {
                // clear all pages
                ClearPageReserved(virt_to_page(virt_addr));
        }

        /* Free the mmaped buffer area */
        dma_free_coherent(NULL,L1_CACHE_ALIGN(sizeof(circularbuffer_S)),
                                                                                
                buf_ptr,dma_addr);
#else

        iounmap(buf_area);

#endif

        /* Unregister the device */
        if(unregister_chrdev(MAJOR_NO , MODULE_NAME)==0)
                printk(KERN_DEBUG" device cleanup success\n");
        else
                printk(KERN_ALERT" device cleanup failed \n");

        /* Free IRQ */
        free_irq(DATA_ACQ_INT,NULL);

        //if(buf_area)
        //      vfree(buf_area);

}

/******************************************************************************
* Description: This function closes the device
*
* Inputs:  Inode structure pointer, File structure pointer
*
* Outputs: Return 0 on success and -1 on failure.
******************************************************************************/
static int McBSP_DriverClose(struct inode *inode,struct file *file)
{
        device_open_count--;
        if(device_open_count == 0)
        {
                /* Delete the timer */
                del_timer(&fluke_timer);
        }

        printk(KERN_INFO" device closed %d\n",device_open_count);
        return 0;
}

/******************************************************************************
 *                                               File Ends

*****************************************************************************/

#define MODULE_NAME                                             "fluke_driver"
#define MAJOR_NO                                                         333
#define NO_FRAMES                                                        3
#define SIZE_FRAME                                                       
1024*5//(1024*1024*1)/* 3MB */
#define DATA_ACQ_INT                                             23 /* To Do 
<for testing only > */
#define DATA_ACQ_INT_CLEAR                                       1 /* To Do 
<for testing only > */

#define MAGIC_NUM                       'D'

#define START_ACQ_DATA                  _IOWR(MAGIC_NUM, 0,unsigned long)

/* Frame */
typedef struct
{
        char buffer[SIZE_FRAME];

}frame_S;

/* Circular Buffer Structured */
/* Mmaped area Structure */
typedef struct
{

        frame_S  fluke[NO_FRAMES];

}circularbuffer_S;

typedef struct
{
        unsigned int count_index;
        unsigned int read_index;
        unsigned int write_index;
}circularbuffer_index_S;

typedef struct
{
        int test_period_ms;             /*????? send to driver*/
        int req_no_sample;              /*send to driver*/
        int acq_no_of_sample;  /* return by driver*/
        int circular_index;    /* return by driver*/
        int sampling_rate_hz;  /*send to driver*/

}daq_t;


/******************************************************************************
 *                                               File Ends

*****************************************************************************/

/******************************************************************************
* McBSP_appl.c
*
* Fluke Driver
*
* Description:
*
* Libraries Used:
*
*
* Unit Test Drivers (Binary):
*
*               <fix me >
*
*
* Special Compile Flags
*               Nil
*
* Revision History:
*       (17/July/2008) Misbah
*               Created the file
*
* Copyright (C)
*
******************************************************************************/

/******************************************************************************
*                                               Include Files
*****************************************************************************/
/* Standard linux files includes */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include "fluke_driver.h"

#define FLUKE_DRIVER            "/dev/fluke"

int main (int argc ,char *argv[])
{
        circularbuffer_S *mmap_ptr;
        int fd = -1,i;
        int size_mmap = sizeof(circularbuffer_S);
        int read_index = -1,ret = -1 ;
        FILE *fp1,*fp2,*fp3;
        char buf[1024];
        char *mmap_data;
        daq_t daq_param;

        /* Initialize the config param */
        daq_param.test_period_ms = 60*1000 ;
        daq_param.acq_no_of_sample = 0;
        daq_param.req_no_sample =0;
        daq_param.sampling_rate_hz = 0;

        mmap_data = (char *)malloc(sizeof(circularbuffer_S));

        /* creat files for frames */
        fp1 = fopen("frame1.txt","w");
        fp2 = fopen("frame2.txt","w");
        fp3 = fopen("frame3.txt","w");

        /* Open the device file */
        fd = open(FLUKE_DRIVER , O_RDWR);
        if (fd == -1)
        {
                printf(" Error in opening fluke device \n");
                return -1;
        }

        /* map the kernel memory to user space */
        mmap_ptr = mmap(NULL,size_mmap,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
        printf(" Virtual addr of the pointer is 0x%x \n",(unsigned 
int)mmap_ptr);

        if(mmap_ptr == NULL )
        {
                printf(" mapped ptr returns NULL from driver n");
                return -1;
        }

        while(1)
        {
                /* Write to driver for testing only */
                memset(buf,'Z',sizeof(buf));
                printf(" Writing to driver \n");
                //write(fd,buf,sizeof(buf));

                /* Block on read to get the circular buffer read index */
                //read_index = read(fd, buf , 1024);
                //printf(" Here is the read for you %s\n",buf);
                if (ioctl(fd , START_ACQ_DATA ,&daq_param) < 0)
                {
                        printf(" ioctl failed \n");
                        return -1 ;
                }

                read_index = daq_param.circular_index;

                printf(" read index from application %d \n",read_index);

                /* Print the data read */
                //for(i = 0;i <= 1024 ; i++)
                        printf(" %s \n",mmap_ptr->fluke[read_index].buffer);

                /* Write the data read fron the driver to the file */
                if(read_index >= 0)
                {
                        ret = (SIZE_FRAME) ;

                        memcpy(mmap_data, \
                                mmap_ptr->fluke[read_index].buffer,SIZE_FRAME);

                        if(read_index == 0)
                                fwrite(mmap_ptr->fluke[read_index].buffer 
,SIZE_FRAME , 1 ,fp1);
                        else if(read_index == 1)
                                fwrite(mmap_ptr->fluke[read_index].buffer 
,SIZE_FRAME , 1 ,fp2);
                        else if(read_index == 2)
                                fwrite(mmap_ptr->fluke[read_index].buffer 
,SIZE_FRAME , 1 ,fp3);
                        else
                        {
                                printf("Not able to write to file as read_index 
returns %d
\n",read_index );
                                return -1;
                        }

                }

        }

        if(mmap_data)
                free(mmap_data);
        fclose(fp1);
        fclose(fp2);
        fclose(fp3);

        return 0;
}


/******************************************************************************
 *                                               File Ends

*****************************************************************************/



please help me to resolve this issue .......


Thanks in advance ...

---- Misbah <><

Misbah khan wrote:
> 
> 
> If you SDRAM is you main memory, you need vmalloc and remap_vmalloc_range.
> If the SDRAM is not your main memory but some I/O attached buffer, you
> need
> ioremap/of_iomap and remap_pfn_range.
> 
> My SDRAM is the main memory of which 9MB i have to allocate in the driver. 
> 
> If i allocate 9BM using vmalloc and remap to user space how should it
> address to the 9MB 
> SDRAM contigues address which i need to map for user access ? 
> 
> 
> Arnd Bergmann wrote:
>> 
>> On Tuesday 22 July 2008, Misbah khan wrote:
>>> First of all let me thank you for your valuable suggessions ...
>>> 
>>> 1. I wanted to allocate 9MB in kernel and wanted that memory to be
>>> mapped to
>>> the physically continews SDRAM memory. but till now i could not found a
>>> way
>>> to do so ???
>>> 
>>> 2. So i thought to use ioremap to map SDRAM and make it accessible to
>>> user
>>> using mmap technique but there is only one doubt and that is will it be
>>> secure and stable and whether it is a right way of doing ???
>> 
>> As I have told you a few times now, you *either* allocate the memory *or*
>> ioremap it, NOT BOTH!!!
>> 
>> If you SDRAM is you main memory, you need vmalloc and
>> remap_vmalloc_range.
>> If the SDRAM is not your main memory but some I/O attached buffer, you
>> need
>> ioremap/of_iomap and remap_pfn_range.
>> 
>>      Arnd <><
>> _______________________________________________
>> Linuxppc-embedded mailing list
>> Linuxppc-embedded@ozlabs.org
>> https://ozlabs.org/mailman/listinfo/linuxppc-embedded
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/how-to-allocate-9MB-of-memory-in-kernel---tp18503022p18627544.html
Sent from the linuxppc-embedded mailing list archive at Nabble.com.

_______________________________________________
Linuxppc-embedded mailing list
Linuxppc-embedded@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-embedded

Reply via email to