📄 ioctl_functions.html
字号:
<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 <asm/ioctl.h> </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"> <span class="kw4">int</span> scmd_ioctl<span class="br0">(</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">)</span> <span class="br0">{</span> <span class="kw4">int</span> ret; <span class="kw4">int</span> count; <span class="kw4">char</span> temp<span class="br0">[</span>SCMD_SIZE<span class="br0">]</span>; scmd_dev_t * dev; count = SCMD_SIZE; dev = <span class="br0">(</span>scmd_dev_t *<span class="br0">)</span> filp->private_data; <span class="kw1">switch</span> <span class="br0">(</span>cmd<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">case</span> SCMD_IOCGETD: <span class="kw1">if</span><span class="br0">(</span>copy_to_user<span class="br0">(</span><span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">)</span>arg, dev->data, count<span class="br0">)</span><span class="br0">)</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">(</span>copy_from_user<span class="br0">(</span>dev->data, <span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">)</span>arg, count<span class="br0">)</span><span class="br0">)</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">(</span> <span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">)</span>&temp, <span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">)</span>dev->data, count<span class="br0">)</span>; <span class="kw1">if</span> <span class="br0">(</span>copy_from_user<span class="br0">(</span><span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">)</span>dev->data, <span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">)</span>arg, count<span class="br0">)</span><span class="br0">)</span> <span class="kw1">return</span> -EFAULT; <span class="kw1">if</span> <span class="br0">(</span>copy_to_user<span class="br0">(</span><span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">)</span>arg, <span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span> *<span class="br0">)</span>&temp, count<span class="br0">)</span><span class="br0">)</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">}</span> <span class="br0">}</span> </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"> 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">(</span><span class="st0">" scmd_ioctl module set up ret = %d<span class="es0">\n</span>"</span>,ret<span class="br0">)</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 <stdio.h> </span> <span class="co2">#include <fcntl.h> </span> <span class="co2">#include <unistd.h> </span> <span class="co2">#include "scmd_ioctl.h" </span> <span class="co2">#define SCMD_DEVICE "/dev/scmd" </span> <span class="kw4">int</span> main <span class="br0">(</span><span class="br0">)</span> <span class="br0">{</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">[</span>SCMD_SIZE<span class="br0">]</span>; fd = open<span class="br0">(</span>SCMD_DEVICE,O_RDWR<span class="br0">)</span>; <span class="kw1">if</span> <span class="br0">(</span> fd < <span class="nu0">0</span> <span class="br0">)</span> <span class="br0">{</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">(</span><span class="st0">" failed to open %s <span class="es0">\n</span>"</span>,SCMD_DEVICE<span class="br0">)</span>; exit <span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span>; <span class="br0">}</span> ret = ioctl<span class="br0">(</span>fd,SCMD_IOCGETD,&scmd_data<span class="br0">)</span>; <span class="kw1">if</span> <span class="br0">(</span> ret < <span class="nu0">0</span> <span class="br0">)</span> <span class="br0">{</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">(</span><span class="st0">" failed to GETD on %s<span class="es0">\n</span>"</span>,SCMD_DEVICE<span class="br0">)</span>; exit<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span>; <span class="br0">}</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">(</span><span class="st0">"initial data ...<span class="es0">\n</span>"</span><span class="br0">)</span>; <span class="kw1">for</span> <span class="br0">(</span>i = <span class="nu0">0</span> ; i < <span class="nu0">8</span> ; i++ <span class="br0">)</span> <span class="br0">{</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span class="kw3">printf</span></a><span class="br0">(</span><span class="st0">"data[%d] %x data[%d] %x<span class="es0">\n</span>"</span>, i,scmd_data<span class="br0">[</span>i<span class="br0">]</span>, i<span class="nu0">+8</span>,scmd_data<span class="br0">[</span>i<span class="nu0">+8</span><span class="br0">]</span><span class="br0">)</span>; <span class="br0">}</span> close<span class="br0">(</span>fd<span class="br0">)</span>; <span class="kw1">return</span> <span class="nu0">0</span>; <span class="br0">}</span> </pre></div><!-- SECTION [7027-] --></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -