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