<br><br><div class="gmail_quote">On Sat, Jun 2, 2012 at 5:45 PM, KARTHIK SEKURU <span dir="ltr">&lt;<a href="mailto:karthik.sekuru@gmail.com" target="_blank">karthik.sekuru@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi,<div>I am new to kernel device drivers.</div><div><br></div><div>I wrote a simple character driver built statically having the fops as shown:</div><div><br></div><div><div><b>static const struct file_operations mfcfpga65_usb_fops = {</b></div>

<div><b><span style="white-space:pre-wrap">        </span>.owner<span style="white-space:pre-wrap">                </span>= THIS_MODULE,</b></div><div><b><span style="white-space:pre-wrap">        </span>.open<span style="white-space:pre-wrap">                </span>= mfcfpga65_usb_open,</b></div>

<div><b><span style="white-space:pre-wrap">        </span>.read<span style="white-space:pre-wrap">                </span>= mfcfpga65_usb_read,</b></div><div><b><span style="white-space:pre-wrap">        </span>.unlocked_ioctl<span style="white-space:pre-wrap">        </span>= mfcfpga65_usb_ioctl,</b></div>

<div><b><span style="white-space:pre-wrap">        </span>.release<span style="white-space:pre-wrap">        </span>= mfcfpga65_usb_close,</b></div><div><b>};</b></div></div><div><br></div><div>All the driver registrations are done properly.</div>

<div><br></div><div>I wrote a sample application to test these drivers implementing open,read and ioctl calls.</div><div><br></div><div>open and read are working fine whereas ioctl is not behaving as expected.</div><div>
<br>
</div><div>The application code is as shown:</div><div><br></div><div><div><b>int main()</b></div><div><b>{</b></div><div><b><span style="white-space:pre-wrap">        </span>printf(&quot;Enterred main function : \n&quot;);</b></div>

<div><b><span style="white-space:pre-wrap">        </span>int fd=0,ret=0;</b></div><div><b><span style="white-space:pre-wrap">        </span>char buff[80]=&quot;&quot;;</b></div><div><span style="white-space:pre-wrap"><b>        </b></span></div>

<div><b><span style="white-space:pre-wrap">        </span>fd=open(&quot;/dev/usbmod&quot;,O_RDONLY);</b></div><div><b><span style="white-space:pre-wrap">        </span>if(fd&lt;0)<span style="white-space:pre-wrap">        </span></b></div>
<div><b><span style="white-space:pre-wrap">        </span>{</b></div><div><b><span style="white-space:pre-wrap">        </span> printf(&quot;fd value is less than 0\n&quot;);</b></div><div><b><span style="white-space:pre-wrap">        </span>}</b></div>

<div><span style="white-space:pre-wrap"><b>        </b></span></div><div><b><span style="white-space:pre-wrap">        </span>printf(&quot;fd :%d\n&quot;,fd);</b></div><div><span style="white-space:pre-wrap"><b>        </b></span></div>
<div><b><span style="white-space:pre-wrap">        </span>ret=read(fd,buff,10);</b></div><div><b><span style="white-space:pre-wrap">        </span>buff[ret]=&#39;\0&#39;;</b></div><div><b><br></b></div>
<div><b>        printf(&quot;The commands passed are %d and  %d\n&quot;,IOCTL_USB_READ,IOCTL_USB_OPEN );</b></div><div><b><span style="white-space:pre-wrap">        </span>ret = ioctl(fd,IOCTL_USB_READ);</b></div>
<div><b><span style="white-space:pre-wrap">        </span>ret = ioctl(fd,IOCTL_USB_OPEN);<span style="white-space:pre-wrap">        </span></b></div><div><span style="white-space:pre-wrap"><b><br></b></span></div>
<div><b><span style="white-space:pre-wrap">        </span>close(fd);</b></div><div><b>}</b></div></div><div><br></div><div>The cmds in ioctl are defined in seperate header file which is included in driver as well as in the applicatin.That definations are as shown</div>

<div><br></div><div><div><b>#define MFCFPGA65_NUM 254</b></div><div><b><br></b></div><div><b>#define IOCTL_USB_OPEN           _IO(MFCFPGA65_NUM,0)</b></div><div><b>#define IOCTL_USB_READ           _IO(MFCFPGA65_NUM,1)</b></div>

<div><b>#define IOCTL_USB_WRITE          _IO(MFCFPGA65_NUM,2)</b></div></div><div><br></div><div><br></div><div>The IOCTL call in driver does nothing except printk in each switch case showing to which case statement it entered .This ioctls implementation in driver  is as shown below:</div>

<div><br></div><div><div><b>static long mfcfpga65_usb_ioctl(struct inode *inode, struct file *file, unsigned int iocmd,</b></div><div><b><span style="white-space:pre-wrap">                                                        </span>unsigned long ioarg)</b></div></div>
</blockquote><div><br></div><div>Syntax for unlocked ioctl is different then what you are using, there is no &#39;inode&#39; parameter in the new syntax.</div><div>Try with the below line, hopefully it will fix the error you are getting: </div>
<div><span class="pun" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline"><b>static long mfcfpga65_usb_ioctl </b>(</span><span class="kwd" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(0,0,139)">struct</span><span class="pln" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline"> file </span><span class="pun" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline">*</span><span class="pln" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline">file</span><span class="pun" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline">,</span><span class="pln" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline"> </span><span class="kwd" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(0,0,139)">unsigned</span><span class="pln" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline"> </span><span class="kwd" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(0,0,139)">int</span><span class="pln" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline"> cmd_in</span><span class="pun" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline">,</span><span class="pln" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline"> </span><span class="kwd" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(0,0,139)">unsigned</span><span class="pln" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline"> </span><span class="kwd" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(0,0,139)">long</span><span class="pln" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline"> arg</span><span class="pun" style="font-family:Consolas,Menlo,Monaco,&#39;Lucida Console&#39;,&#39;Liberation Mono&#39;,&#39;DejaVu Sans Mono&#39;,&#39;Bitstream Vera Sans Mono&#39;,&#39;Courier New&#39;,monospace,serif;font-size:14px;line-height:18px;text-align:left;margin:0px;padding:0px;border:0px;vertical-align:baseline">)</span> </div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>
<div><b>{</b></div><div><b>   </b></div><div><b><span style="white-space:pre-wrap">        </span>void __user *arg = (void __user *)ioarg;</b></div><div><b><span style="white-space:pre-wrap">        </span>unsigned int* stream;</b></div>

<div><b><span style="white-space:pre-wrap">        </span>unsigned int size;</b></div><div><span style="white-space:pre-wrap"><b>        </b></span></div><div><b><span style="white-space:pre-wrap">        </span>printk(KERN_INFO &quot;In IOCTL function of USB character driver with cmd as %d : \n&quot;,iocmd);</b></div>

<div><span style="white-space:pre-wrap"><b>        </b></span></div><div><b><span style="white-space:pre-wrap">        </span>printk(KERN_INFO &quot;The switch case cmds are %d %d %d\n&quot;,IOCTL_USB_OPEN,IOCTL_USB_READ,IOCTL_USB_WRITE);</b></div>

<div><b><br></b></div><div><b><span style="white-space:pre-wrap">        </span>switch (iocmd) {</b></div><div><b><br></b></div><div><b><span style="white-space:pre-wrap">                </span>case IOCTL_USB_OPEN:</b></div>
<div><span style="white-space:pre-wrap"><b>                        </b></span></div><div><b><span style="white-space:pre-wrap">                        </span>printk(KERN_INFO &quot;In IOCTL case1 of USB character driver: \n&quot;);</b></div>
<div><b><span style="white-space:pre-wrap">                        </span>return 0;</b></div><div><b><span style="white-space:pre-wrap">                </span>break;</b></div><div><span style="white-space:pre-wrap"><b>        </b></span></div>
<div><b><span style="white-space:pre-wrap">                </span>case IOCTL_USB_READ:</b></div><div><span style="white-space:pre-wrap"><b>                        </b></span></div><div><b><span style="white-space:pre-wrap">                        </span>printk(KERN_INFO &quot;In IOCTL case2 of USB character driver: \n&quot;);</b></div>

<div><b><span style="white-space:pre-wrap">                        </span>return 0;</b></div><div><b><span style="white-space:pre-wrap">                </span>        break;</b></div><div><span style="white-space:pre-wrap"><b>        </b></span></div>
<div><b><span style="white-space:pre-wrap">                </span>case IOCTL_USB_WRITE:</b></div><div><span style="white-space:pre-wrap"><b>                        </b></span></div><div><b><span style="white-space:pre-wrap">                        </span>printk(KERN_INFO &quot;In IOCTL case3 of USB character driver: \n&quot;);</b></div>

<div><b><span style="white-space:pre-wrap">                        </span>return 0;</b></div><div><b>           <span style="white-space:pre-wrap">                </span>break;</b></div><div><span style="white-space:pre-wrap"><b>                </b></span></div>
<div><b>    }</b></div><div><b>}</b></div></div><div><br></div><div>From application i made sure that i am passing proper cmd arguments.The control goes to the ioctl function call in driver but doesn&#39;t go to the proper switch cases.</div>

<div><br></div><div>This is because the iocmd argument received in the ioctl implementation is getting corrupted i.e eventhough from application i am passing <b>IOCTL_USB_READ , </b><b>IOCTL_USB_OPEN </b>parameters,when i check them in </div>

<div>ioctl function in drivers the values are changed and through printk in the ioctl i could see that the iocmd received in the function is 4096 value which doesn&#39;t match to IOCTL_USB_READ or </div><div>IOCTL_USB_OPEN.</div>

<div><br></div><div>Please let me know how can the command argument passes via ioctl call in application is modified/corrupted before it reaches the actual ioctl implementation in drivers.</div><div><br></div></blockquote>
<div><br></div><div>Thanks,</div><div>Chetan Nanda</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div></div><div>thanks,</div>
<div>Karthik.</div><div><br></div>
<br>_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org">Kernelnewbies@kernelnewbies.org</a><br>
<a href="http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" target="_blank">http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
<br></blockquote></div><br>