<p><br>Hi All,</p>
<p>I m using the Linux 2.6(2.6.23-rc2) from Grants for ML-403 and I tried to add a new driver for a hardware based stream. When I created the device node and executed the application, I could see that the printk&#39;s in the driver are getting executed for open, release and ioctl. For read, the function doesnt seem calling the drivers read routine and exits with -1. However the same is called when I do a cat &lt; /dev/devnode. Am I missing something ? 
</p>
<p>--------------------------------------------------------------------------------------------------------------<br>&lt;Code Snip - Driver&gt;</p>
<p>static struct file_operations co_stream_fops = {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .owner = THIS_MODULE,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .open = co_stream_open,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .read = co_stream_read,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .write = co_stream_write,<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .ioctl = co_stream_ioctl,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .release = co_stream_release<br>};</p>
<p>static int __init co_stream_init(void)<br>{<br>&nbsp;&nbsp;&nbsp; unsigned int *tmp;<br>&nbsp;&nbsp;&nbsp; int i=0;<br>&nbsp;&nbsp;&nbsp; dbprintk(&quot;Welcome !!!\n&quot;);</p>
<p>&nbsp;&nbsp;&nbsp; if (!request_mem_region(STREAM_PHY_ADDR, STREAM_PHY_SIZE, DRIVER_NAME) )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printk(&quot;Failed to lock the memory...\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto out;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if (!(remapped_address = ioremap(STREAM_PHY_ADDR, STREAM_PHY_SIZE)) )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printk(&quot;Failed to remap...\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto out;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; printk(&quot;Address remapped to 0x%08X.\n&quot;, remapped_address);</p>
<p>&nbsp;&nbsp;&nbsp; Major = register_chrdev( 0, DEVICE_NAME, &amp;co_stream_fops);&nbsp;&nbsp;&nbsp;&nbsp;&lt;========= Registered fops</p>
<p>&nbsp;&nbsp;&nbsp; if (Major &lt; 0)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printk(&quot;Registration of the device failed.\n\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto out;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p><br>static ssize_t co_stream_read(struct file *filp, char __user *buf, size_t size, loff_t *l)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printk(&quot;\n co_stream_read() is called.\n&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int data,status;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Wait while empty. */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (((status=readl( ((volatile unsigned char*) remapped_address) + 8)&amp;3))==0)<br>...<br>--------------------------------------------------------------------------------------------------------------
<br>&lt;Code Snip - Application&gt;</p>
<p><br>&nbsp;&nbsp;&nbsp; printf(&quot;CPU listening for hello...\n\r&quot;);<br>&nbsp;&nbsp;&nbsp; for ( i = 0; i &lt; 10; i++ ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cstream_read(hello_in, &amp;hi, sizeof(int));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;FPGA hardware says: %d\n\r&quot;, hi);
<br>&nbsp;&nbsp;&nbsp; }</p>
<p>int cstream_read(cstream stream, void *buffer, int size)</p>
<p>{<br>&nbsp; int nbytes;<br>&nbsp; /* TO ADD : Error handing calls here */</p>
<p>&nbsp; printf(&quot;Value of stream = 0x%08X, stream-&gt;fd = %d. \n&quot;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stream, stream-&gt;fd);</p>
<p>&nbsp; printf(&quot;Value of buffer = 0x%08X, size = %d. \n&quot;, buffer, size );</p>
<p>&nbsp; if (stream) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nbytes = read(stream-&gt;fd, buffer, size);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;read bytes from hardware = %d.\n&quot;, nbytes);<br>&nbsp; }<br>&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;stream is NULL here.\n&quot;);</p>
<p>&nbsp; return(0);<br>}</p>
<p>--------------------------------------------------------------------------------------------------------------<br>&lt;From System.map&gt;</p>
<p>c00de4d0 t sysrq_handle_reboot<br>c00de4fc T handle_sysrq<br>c00de524 t co_stream_write<br>c00de550 t co_stream_release<br>c00de598 t co_stream_open<br>c00de624 t co_stream_read<br>c00de760 t __uart_start</p>
<p>----------------------------------------<br>&lt;From console output fops dump&gt;</p>
<p>[&nbsp;&nbsp;&nbsp; 0.383898] Welcome !!!<br>[&nbsp;&nbsp;&nbsp; 0.384445] Address remapped to 0xC5000000.<br>[&nbsp;&nbsp;&nbsp; 0.384628]<br>[&nbsp;&nbsp;&nbsp; 0.384653]<br>[&nbsp;&nbsp;&nbsp; 0.384675]&nbsp; Impulse Costream assigned with Major = 254.<br>[&nbsp;&nbsp;&nbsp; 0.384743] Memory dump of fops structure.
<br>[&nbsp;&nbsp;&nbsp; 0.384803] Address : 0xC01CA350, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.384867] Address : 0xC01CA354, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.384932] Address : 0xC01CA358, 0xC00DE624.<br>[&nbsp;&nbsp;&nbsp; 0.384996] Address : 0xC01CA35C, 0xC00DE524.<br>[&nbsp;&nbsp;&nbsp; 0.385060
] Address : 0xC01CA360, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.385122] Address : 0xC01CA364, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.385185] Address : 0xC01CA368, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.385248] Address : 0xC01CA36C, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.385311] Address : 0xC01CA370, 0x00000000.
<br>[&nbsp;&nbsp;&nbsp; 0.385374] Address : 0xC01CA374, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.385437] Address : 0xC01CA378, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.385499] Address : 0xC01CA37C, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.385565] Address : 0xC01CA380, 0xC00DE598.<br>[&nbsp;&nbsp;&nbsp; 0.385627
] Address : 0xC01CA384, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.385693] Address : 0xC01CA388, 0xC00DE550.<br>[&nbsp;&nbsp;&nbsp; 0.385756] Address : 0xC01CA38C, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.385818] Address : 0xC01CA390, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.385881] Address : 0xC01CA394, 0x00000000.
<br>[&nbsp;&nbsp;&nbsp; 0.385944] Address : 0xC01CA398, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.386007] Address : 0xC01CA39C, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.386070] Address : 0xC01CA3A0, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.386133] Address : 0xC01CA3A4, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.386196
] Address : 0xC01CA3A8, 0x00000000.<br>[&nbsp;&nbsp;&nbsp; 0.386259] Address : 0xC01CA3AC, 0x00000000.</p>
<div>Any help or pointers would be helpful. </div>
<div><br>Thanks and Regards,<br>Ramkumar.</div>
<p><br>&nbsp;</p>