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

📄 proc_file_system.html

📁 ADI 公司blackfin系列的用户使用文挡。
💻 HTML
📖 第 1 页 / 共 2 页
字号:
</p></div><h4><a name="a_proc_read_function" id="a_proc_read_function">A Proc Read function</a></h4><div class="level4"><p> The core of the <strong>proc</strong> file system is a <strong>proc_read</strong> function. </p><p>This function provides the data shown when a proc file is opened and read for example with <strong>cat</strong>.</p><p>An example of the code for generating the data seen in a proc file read is shown here:</p><pre class="code c">&nbsp;  <span class="co2">#include &lt;linux/proc_fs.h&gt;                                                </span>                                                                              <span class="kw4">int</span> scmd_proc_read<span class="br0">&#40;</span><span class="kw4">char</span> *buf,     <span class="coMULTI">/* this is the buffer we write to       */</span>                                                                                             <span class="kw4">char</span> **start,  <span class="coMULTI">/* this is used for larger data access  */</span>                                                                                             off_t offset,  <span class="coMULTI">/* same as above                        */</span>                                                                                             <span class="kw4">int</span> count,     <span class="coMULTI">/* this is the expected number of bytes */</span>                                                                                             <span class="kw4">int</span> *eof,      <span class="coMULTI">/* set this to 1 to indicate end if file*/</span>                                                                                             <span class="kw4">void</span> * data    <span class="coMULTI">/* optional user data                   */</span>                                                                                             <span class="br0">&#41;</span>                                                        <span class="br0">&#123;</span>                                                                               <span class="kw4">int</span> i;                                                                                                                                                  scmd_dev * dev;                                                             <span class="kw4">int</span> len = <span class="nu0">0</span>;                                                          &nbsp;      <span class="coMULTI">/* get the data structure for unit 0 ( fixed later )*/</span>                      dev = &amp;scmd<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>;                                                             <span class="coMULTI">/* write up to 4096 bytes to buf                                               return bytes written in len */</span>                                           <span class="coMULTI">/* only write when offset == 1 */</span>                                                                                  <span class="coMULTI">/* print a header */</span>                                                        <span class="kw1">if</span> <span class="br0">&#40;</span> offset == <span class="nu0">1</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>                                                           len += sprintf <span class="br0">&#40;</span>&amp;buf<span class="br0">&#91;</span>len<span class="br0">&#93;</span>, <span class="st0">"Scmd proc %d<span class="es0">\n</span>"</span>, len<span class="br0">&#41;</span>;                                                                                                      <span class="coMULTI">/* print some data */</span>                                                       <span class="kw1">for</span> <span class="br0">&#40;</span> i = <span class="nu0">0</span>; i &lt; <span class="nu0">16</span> i++ <span class="br0">&#41;</span> <span class="br0">&#123;</span>                                                    len += sprintf <span class="br0">&#40;</span>&amp;buf<span class="br0">&#91;</span>len<span class="br0">&#93;</span>,                                                      <span class="st0">"Index %d:, data = %d , <span class="es0">\n</span>"</span>,                                                i,dev-&gt;data<span class="br0">&#91;</span>i<span class="br0">&#93;</span>                                                               <span class="br0">&#41;</span>;                                                                  <span class="br0">&#125;</span>                                                                        <span class="br0">&#125;</span>                                                                           *eof = <span class="nu0">1</span>;                                                                   <span class="kw1">return</span> len;                                                             <span class="br0">&#125;</span></pre><p>Note that the <strong>scmd_proc_read</strong> function is given a buffer <strong>buf</strong> to place its data in. The max size of this buffer is normally one page, 4096 bytes. The data pointer can be used to point to our private data structure which is set up when the read function is setup.</p></div><!-- SECTION [842-8252] --><h2><a name="creating_a_proc_directory_entry" id="creating_a_proc_directory_entry">Creating a Proc Directory Entry</a></h2><div class="level2"><p>You can create directory entries as well as regular file in a proc file system.</p><p>These are the code fragments required to create a directory entry in the proc file system:</p><pre class="code c">                                                                                                                          <span class="co2">#include &lt;linux/proc_fs.h&gt;                          </span>                                                                                                                         <span class="kw4">struct</span> proc_dir_entry *scmd_proc_dir = <span class="kw2">NULL</span>;                                                                        <span class="coMULTI">/* add this in module_init */</span>                          <span class="kw4">struct</span> proc_dir_entry *ptr =                                                                                        create_proc_entry<span class="br0">&#40;</span><span class="st0">"scmd"</span>,S_IFREG | S_IRUGO, <span class="kw2">NULL</span><span class="br0">&#41;</span>;                                                                  ptr-&gt;read_proc = scmd_proc_read ;                                                                                                                                             <span class="coMULTI">/****** add this in module_exit */</span>                          remove_proc_entry<span class="br0">&#40;</span><span class="st0">"scmd"</span>, &amp;proc_root<span class="br0">&#41;</span>;                                                                              <span class="coMULTI">/* ********** do this for a dir entry                      create_proc_entry(&quot;scmd&quot;,S_IFDIR | S_IWUGO, NULL);      ******** */</span>                                          &nbsp;</pre></div><!-- SECTION [8253-9781] --><h3><a name="multiple_entries" id="multiple_entries">Multiple Entries</a></h3><div class="level3"><p>The simple driver you are using, however, may have multiple minor numbers associated with the device. This will require a special directory to be generated and a sub directory for each minor device.</p><p>Consider the revised code: </p><pre class="code c">&nbsp;      <span class="kw4">struct</span> proc_dir_entry *scmd_proc_dir;                                 <span class="coMULTI">/* add to module_init */</span>                                                scmd_proc_dir = create_proc_entry<span class="br0">&#40;</span><span class="st0">"scmd"</span>, S_IFDIR, <span class="nu0">0</span><span class="br0">&#41;</span>;                <span class="kw1">for</span> <span class="br0">&#40;</span>i = <span class="nu0">0</span> ; i &lt; SCMD_MAX_MINOR ; i++ <span class="br0">&#41;</span> <span class="br0">&#123;</span>                                 sprintf<span class="br0">&#40;</span>sbuff,<span class="st0">"scmd/%d"</span>,i<span class="br0">&#41;</span>;                                           create_proc_read_entry<span class="br0">&#40;</span>sbuff, <span class="nu0">0</span>,                                                scmd_proc_dir, scmd_read_proc, &amp;scmd<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#41;</span>;      <span class="br0">&#125;</span>                                                                                                                                     &nbsp;  <span class="coMULTI">/* proc file system deletion is then performed in this manner */</span>          <span class="coMULTI">/* add to module_exit */</span>                                                                                                                      <span class="kw1">for</span> <span class="br0">&#40;</span>i = <span class="nu0">0</span> ; i &lt; SCMD_MAX_MINOR ; i++ <span class="br0">&#41;</span> <span class="br0">&#123;</span>                                 sprintf<span class="br0">&#40;</span>sbuff,<span class="st0">"scmd/%d"</span>,i<span class="br0">&#41;</span>;                                           remove_proc_entry<span class="br0">&#40;</span>sbuff, &amp;proc_root<span class="br0">&#41;</span>;                             <span class="br0">&#125;</span>                                                                     remove_proc_entry<span class="br0">&#40;</span><span class="st0">"scmd"</span>, &amp;proc_root<span class="br0">&#41;</span>;</pre><pre class="code">                                                                    |</pre><p>The proc_read function will be recoded to use the data parameter to point to the correct device buffer for the device node minor number.</p><pre class="code c">  <span class="kw4">int</span> scmd_proc_read<span class="br0">&#40;</span><span class="kw4">char</span> *buf, <span class="kw4">char</span> **start, off_t offset, <span class="kw4">int</span> count,                     <span class="kw4">int</span> *eof, <span class="kw4">void</span> * data <span class="br0">&#41;</span> <span class="br0">&#123;</span>                              <span class="kw4">int</span> i;    <span class="kw4">char</span> * sp;                                                  scmd_dev * dev;                                                       <span class="kw4">int</span> len;                                                              <span class="co1">//dev = &amp;scmd[0];                                               </span>      dev = data;                                                           len = <span class="nu0">0</span>;                                                        &nbsp;</pre></div><!-- SECTION [9782-12130] --><h3><a name="a_proc_write_function" id="a_proc_write_function">A Proc Write function</a></h3><div class="level3"><p> The proc write function is very similar to a normal device driver write function.</p><p>The user can &ldquo;write&rdquo; data to the device using the user mode echo command or from within some user code.</p><p>An example of the code for handling a proc write is shown here: </p><pre class="code c">  <span class="co2">#include &lt;linux/proc_fs.h&gt;                                       </span>  <span class="kw4">static</span> <span class="kw4">int</span> scmd_proc_write<span class="br0">&#40;</span><span class="kw4">struct</span> file *file, <span class="kw4">const</span> <span class="kw4">char</span> *buffer,                             <span class="kw4">unsigned</span> <span class="kw4">long</span> count, <span class="kw4">void</span> *data<span class="br0">&#41;</span> <span class="br0">&#123;</span>          scmd_dev * dev;                                                    <span class="kw4">int</span> num;                                                           dev = data;                                                                                                                           num = count;                                                       <span class="kw1">if</span> <span class="br0">&#40;</span>count &gt; SCMD_SIZE <span class="br0">&#41;</span> num = SCMD_SIZE;                           <span class="kw1">if</span> <span class="br0">&#40;</span>copy_from_user<span class="br0">&#40;</span>dev-&gt;data,buffer,num<span class="br0">&#41;</span><span class="br0">&#41;</span>                             <span class="kw1">return</span> -EINVAL;                                                 printk<span class="br0">&#40;</span><span class="st0">" copied %d bytes <span class="es0">\n</span>"</span>, num <span class="br0">&#41;</span>;                               <span class="kw1">return</span> count;                                                  <span class="br0">&#125;</span></pre><p>The write function is set up as the proc dir is created.</p><pre class="code c">&nbsp;      sptr= create_proc_read_entry<span class="br0">&#40;</span>sbuff, S_IFREG | S_IWUGO, scmd_proc_dir,                                     scmd_proc_read, &amp;scmd<span class="br0">&#91;</span>j<span class="br0">&#93;</span> <span class="br0">&#41;</span>;                 sptr-&gt;write_proc = scmd_proc_write;                                  &nbsp;</pre></div><!-- SECTION [12131-] --></body></html>

⌨️ 快捷键说明

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