Hi,

It's different from user space drivers.
I will give my algorithm bit.
Then you will get the point.

user write funcion
--------------------------------------------------------------
usr_write_dma( char *buf, int len )
{
   while( len > 0 ){
       if( len > DMA_BUF_MAX )
           ln = DMA_BUF_MAX
       else
           ln = len
       set data to struct dma_struct
       ioctl( fd, IOCTL_DMA, dma_struct )
       while(shared_variabl == 0);
       len -= ln;
       buf += DMA_BUF_MAX
   }
}
--------------------------------------------------------------

kernel space ioctl function
--------------------------------------------------------------
kern_ioctl()
{
   1.copy user data to dma buffer
   2. set pci registers( address, length etc. )
   3. start dma transfer
   return
}
--------------------------------------------------------------

interrupt routine
--------------------------------------------------------------
pci_interrupt()
{
   if( dma interrupt ){
       1. set length of data transferred to shared variable
       2. clear interrupt
       return
   }
}
--------------------------------------------------------------

This method works well.
but looping in the user function is not effective.
So I want to use wait/wakeup method there.
The way I suggest is as belows.

in user write function.
--------------------------------------------------------------
usr_write_dma( char *buf, int len )
{
   while( len > 0 ){
       if( len > DMA_BUF_MAX )
           ln = DMA_BUF_MAX
       else
           ln = len
       set data to struct dma_struct

        ***** clear wake up count here *****

       ioctl( fd, IOCTL_DMA, dma_struct )

        ***** sleep here *****

       len -= ln;
       buf += DMA_BUF_MAX
   }
}
--------------------------------------------------------------

in interrupt routine
****** wake up the above process ****

Is it possible to this method or could anyone please suggest
a method to do this?

I went through chapter 6 in ldd_3.
But it's all about kernel space blocking as I understood.

Thans.

Sumudu


Hi,

Are user space device drivers what you're looking for?

http://lwn.net/Articles/232575/
http://lwn.net/Articles/127698/
http://lwn.net/Articles/198202/
http://lwn.net/Articles/66829/

Thanks,

Rajat

Reply via email to