⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ioctl_functions.html

📁 ADI 公司blackfin系列的用户使用文挡。
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<p>The header file is set up first </p><pre class="code c">  <span class="coMULTI">/* file name samp.h for both user and kernel space */</span>                      <span class="co2">#include &lt;asm/ioctl.h&gt;                                                   </span>                                                                             <span class="coMULTI">/* magic number for SCMD IOCTL operations */</span>                               <span class="co2">#define SCMD_MAGIC 's'                                                   </span>                                                                             <span class="co2">#define SCMD_IOCGETD  _IOR(SCMD_MAGIC, 1 , char *) //get driver data     </span>  <span class="co2">#define SCMD_IOCSETD  _IOW(SCMD_MAGIC, 2 , char *) //set driver data     </span>  <span class="co2">#define SCMD_IOCXCHD  _IOWR(SCMD_MAGIC,3 , char *) //exchange driver data</span></pre></div><!-- SECTION [2477-3515] --><h3><a name="ioctl_addition_to_driver" id="ioctl_addition_to_driver">IOCTL Addition to Driver</a></h3><div class="level3"><p> Next a section of the driver is added. </p><pre class="code c">&nbsp;  <span class="kw4">int</span> scmd_ioctl<span class="br0">&#40;</span><span class="kw4">struct</span> inode* inode , <span class="kw4">struct</span> file* filp ,                                                   <span class="kw4">unsigned</span> <span class="kw4">int</span> cmd , <span class="kw4">unsigned</span> <span class="kw4">long</span>  arg <span class="br0">&#41;</span> <span class="br0">&#123;</span>     <span class="kw4">int</span> ret;                                                                   <span class="kw4">int</span> count;                                                                 <span class="kw4">char</span> temp<span class="br0">&#91;</span>SCMD_SIZE<span class="br0">&#93;</span>;                                                      scmd_dev_t * dev;                                                                                                                                     count = SCMD_SIZE;                                                         dev = <span class="br0">&#40;</span>scmd_dev_t *<span class="br0">&#41;</span> filp-&gt;private_data;                                                                                                              <span class="kw1">switch</span> <span class="br0">&#40;</span>cmd<span class="br0">&#41;</span> <span class="br0">&#123;</span>                                                                <span class="kw1">case</span> SCMD_IOCGETD:                                                            <span class="kw1">if</span><span class="br0">&#40;</span>copy_to_user<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">&#41;</span>arg, dev-&gt;data, count<span class="br0">&#41;</span><span class="br0">&#41;</span>                       <span class="kw1">return</span> -EFAULT;                                                        <span class="kw1">return</span> <span class="nu0">0</span>;                                                                                                                                          <span class="kw1">case</span> SCMD_IOCSETD:                                                            <span class="kw1">if</span> <span class="br0">&#40;</span>copy_from_user<span class="br0">&#40;</span>dev-&gt;data, <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">&#41;</span>arg, count<span class="br0">&#41;</span><span class="br0">&#41;</span>                    <span class="kw1">return</span> -EFAULT;                                                        <span class="kw1">return</span> <span class="nu0">0</span>;                                                                                                                                          <span class="kw1">case</span> SCMD_IOCXCHD:                                                            memcopy<span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">&#41;</span>&amp;temp,                                                        <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">&#41;</span>dev-&gt;data, count<span class="br0">&#41;</span>;                                                                                                      <span class="kw1">if</span> <span class="br0">&#40;</span>copy_from_user<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">&#41;</span>dev-&gt;data,                                                <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">&#41;</span>arg, count<span class="br0">&#41;</span><span class="br0">&#41;</span>                               <span class="kw1">return</span> -EFAULT;                                                                                                                                   <span class="kw1">if</span> <span class="br0">&#40;</span>copy_to_user<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">&#41;</span>arg,                                                        <span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">&#41;</span>&amp;temp, count<span class="br0">&#41;</span><span class="br0">&#41;</span>                             <span class="kw1">return</span> -EFAULT;                                                                                                                                   <span class="kw1">return</span> <span class="nu0">0</span>;                                                                                                                                          <span class="kw1">default</span>:                                                                      <span class="kw1">return</span> -ENOTTY;                                                   <span class="coMULTI">/*         return -EINVAL; another return option */</span>                           <span class="br0">&#125;</span>                                                                       <span class="br0">&#125;</span>       &nbsp;&nbsp;</pre></div><!-- SECTION [3516-6583] --><h3><a name="ioctl_fops_table" id="ioctl_fops_table">IOCTL Fops Table</a></h3><div class="level3"><p> The fops table needs to be set up in the driver init function </p><pre class="code c">&nbsp;    scmd_driver_fops.<span class="me1">write</span> = scmd_write;                   <span class="co1">// set up the ioctl function                       </span>    scmd_driver_fops.<span class="me1">ioctl</span> = scmd_ioctl;                                                                          printk<span class="br0">&#40;</span><span class="st0">" scmd_ioctl module set up ret = %d<span class="es0">\n</span>"</span>,ret<span class="br0">&#41;</span>;</pre></div><!-- SECTION [6584-7026] --><h3><a name="user_code" id="user_code">User code</a></h3><div class="level3"><p> A typical user code file</p><pre class="code c">  <span class="co1">// test_ioctl.c simple test for ioctl             </span>  <span class="co1">// cc -O2 -o test_ioctl test_ioctl.c              </span>  <span class="co2">#include &lt;stdio.h&gt;                                </span>  <span class="co2">#include &lt;fcntl.h&gt;                                </span>  <span class="co2">#include &lt;unistd.h&gt;                               </span>  <span class="co2">#include &quot;scmd_ioctl.h&quot;                           </span>  <span class="co2">#define SCMD_DEVICE &quot;/dev/scmd&quot;                   </span>                                                      <span class="kw4">int</span> main <span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>                                         <span class="kw4">int</span> fd;                                             <span class="kw4">int</span> ret;                                            <span class="kw4">int</span> i;                                              <span class="kw4">char</span> scmd_data<span class="br0">&#91;</span>SCMD_SIZE<span class="br0">&#93;</span>;                                                                              fd = open<span class="br0">&#40;</span>SCMD_DEVICE,O_RDWR<span class="br0">&#41;</span>;                      <span class="kw1">if</span> <span class="br0">&#40;</span> fd &lt; <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>                                       <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">" failed to open %s <span class="es0">\n</span>"</span>,SCMD_DEVICE<span class="br0">&#41;</span>;        exit <span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;                                         <span class="br0">&#125;</span>                                                   ret = ioctl<span class="br0">&#40;</span>fd,SCMD_IOCGETD,&amp;scmd_data<span class="br0">&#41;</span>;            <span class="kw1">if</span> <span class="br0">&#40;</span> ret &lt; <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>                                      <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">" failed to GETD on %s<span class="es0">\n</span>"</span>,SCMD_DEVICE<span class="br0">&#41;</span>;      exit<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span>;                                          <span class="br0">&#125;</span>                                                   <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">"initial data ...<span class="es0">\n</span>"</span><span class="br0">&#41;</span>;                       <span class="kw1">for</span> <span class="br0">&#40;</span>i = <span class="nu0">0</span> ; i &lt; <span class="nu0">8</span> ; i++ <span class="br0">&#41;</span> <span class="br0">&#123;</span>                          <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">&#40;</span><span class="st0">"data[%d] %x     data[%d] %x<span class="es0">\n</span>"</span>,                    i,scmd_data<span class="br0">&#91;</span>i<span class="br0">&#93;</span>,                                     i<span class="nu0">+8</span>,scmd_data<span class="br0">&#91;</span>i<span class="nu0">+8</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;                       <span class="br0">&#125;</span>                                                   close<span class="br0">&#40;</span>fd<span class="br0">&#41;</span>;                                          <span class="kw1">return</span> <span class="nu0">0</span>;                                         <span class="br0">&#125;</span>                                                                                                     &nbsp;</pre></div><!-- SECTION [7027-] --></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -