bigbat 发表于 2020-4-14 17:30

STM32MP157A-DK1测评+IIO与ADC (6)

<div class='showpostmsg'><p>在嵌入式linux系统中会使用大量的专用&ldquo;工业设备&rdquo;。如:数/模转换器、模/数转换器、惯性陀螺仪、磁力计、加速度计、压力传感器等等。linux为了管理这些&ldquo;工业设备&rdquo;特别的制定了一套&ldquo;规范&rdquo;。这就是:iiO子系统,全称是 Industrial I/O subsystem(工业 I/O 子系统)。规范的目的是用于填补那些分类时处在hwmon(硬件监视器)和输入子系统之间的设备类型。这一规定简化了应用系统的开发。同时也促进了厂家驱动程序的规范化,简化应用开发。</p>

<p>linux内核和应用的交互是&quot;异步的&quot;,数据和信号触发的管理非常复杂。iio子系统驱动的功能就是完成这些棘手的管理。</p>

<p>iio子系统驱动的内容:<br />
(1)、设备注册和处理<br />
(2)、通过虚拟文件系统(VFS)轮训访问设备<br />
(3)、chrdevs事件<br />
chrdevs事件包括阈值检测器,自由下落检测器和更复杂的动作检测。chrdevs事件的输入,iio为底层硬件触发与用户空间通行提供了通道,chrdevs事件本身已经不仅仅是一个事件的代码和一个时间戳,与chrdevs事件相关联的任何数据必须通过轮询访问。<br />
(4)、硬件环缓冲支持<br />
现在很多传感器芯片上本身就包括 fifo / ring 缓冲,通过sensor自带 fifo / ring 缓冲,可以大大的减少主芯片处理器的负担。<br />
(6)、触发和软件缓冲区(kfifo)支持<br />
数据采集中,触发和软件缓冲区(kfifo)支持是非常有用的,能够更加高效的捕捉到外部信号和数据。触发机制是必须的。这些触发包括(数据准备信号、GPIO线连接到外部系统、处理器周期中断、用户空间访问sysfs中的特定文件等)。</p>

<p>ST公司的OpenSTLinux系统也是遵从IIO系统规范的。ADC设备就是这样的设备。为了简化测试流程,测试中使用了ST公司的IIO工具。</p>

<p>虽然ST公司提供了ADC驱动程序,但是却没有在默认设备中提供IIO设备的工具。工具的准备我会在下面叙述。ADC驱动也没有在默认系统中打开。测试首先就是配置DTS文件打开ADC设备配置</p>

<p>到linux源码目录找到文件arch/arm/boot/dts/stm32mp157a-dk1.dts的&amp;adc配置项</p>

<pre>
<code class="language-cpp">&amp;adc {
        pinctrl-names = "default";
        pinctrl-0 = &lt;&amp;adc12_ain_pins_a&gt;, &lt;&amp;adc12_usb_pwr_pins_a&gt;;
        vdd-supply = &lt;&amp;vdd&gt;;
        vdda-supply = &lt;&amp;vdd&gt;;
        vref-supply = &lt;&amp;vrefbuf&gt;;
        status = "okay";
        adc1: adc@0 {
                /*
               * Type-C USB_PWR_CC1 &amp; USB_PWR_CC2 on in18 &amp; in19.
               * Use at least 5 * RC time, e.g. 5 * (Rp + Rd) * C:
               * 5 * (56 + 47kOhms) * 5pF =&gt; 2.5us.
               * Use arbitrary margin here (e.g. 5&micro;s).
               */
                st,min-sample-time-nsecs = &lt;5000&gt;;
                /* AIN connector, USB Type-C CC1 &amp; CC2 */
                st,adc-channels = &lt;0 1 6 13 18 19&gt;;
                status = "okay";
        };
        adc2: adc@100 {
                /* AIN connector, temp sensor, USB Type-C CC1 &amp; CC2 */
                st,adc-channels = &lt;0 1 2 6 12 18 19&gt;;
                /* temperature sensor min sample time */
                st,min-sample-time-nsecs = &lt;10000&gt;;
                status = "okay";
        };
        adc_temp: temp {
                status = "okay";
        };
};
</code></pre>

<p>默认状态status = &quot;disable&quot;; 修改为&quot;okay&quot;;<br />
编译DTS系统, make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040 O=&quot;$PWD/../build&quot;<br />
我是将内核一起编译的,按理说DTS是可以单独编译的。是不是只拷贝DTS文件就可以打开驱动呢。所以我直接将DTS的编译文件 stm32mp157a-dk1.dtb拷贝到板子的/boot/目录下,不拷贝内核文件。发现也是可以打开驱动设备。板子重启以后,可以看到设备文件 /dev/iio:device0、/dev/iio:device1、/dev/iio:device2三个文件了。这说明驱动已加载成功。</p>

<p>测试ADC的工具我使用了ST提供的IIO工具。可惜这些工具默认系统中是没有的。需要自行编译的。<br />
工具的源码在&lt;Linux_kernel_source_path&gt;/tools下。<br />
PC $&gt; cd &lt;Linux_kernel_source_path&gt;/tools<br />
PC $&gt; make &lt;tool&gt; <br />
我要编译iio工具,命令如下:<br />
make ARCH=arm iio O=&quot;$PWD/../../build&quot;<br />
编译完成后就可以在&quot;$PWD/../../build&quot;目录的iio下找lsiio、iio_event_monitor、iio_generic_buffer三个文件了。<br />
iio系统是&ldquo;子文件系统&rdquo;,那么设备/dev/device0就是目录。<br />
cd /sys/bus/iio/devices/iio\:device0<br />
就可以进入目录。直接使用文件操作有点麻烦。我们还是使用工具吧。</p>

<p>lsiio 列出设备信息</p>

<p>可以看到是有的iio设备。</p>

<p>iio_event_monitor /dev/iio:device0 &amp;</p>

<p>程序输出的adc的值。<br />
如果编写程序可以参考iio_event_monitor.c文件。<br />
参考链接<br />
https://wiki.st.com/stm32mpu/wiki/How_to_use_the_IIO_user_space_interface#How_to_get_ADC_analog_watchdog_events</p>

<p>&nbsp;</p>

<p><b><font color="#5e7384">此内容由EEWORLD论坛网友<font size="3">bigbat</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b></p>

<p>&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

bigbat 发表于 2020-4-28 17:28

<p>其实linux系统更加偏向软件,外设接口的操作需要和内核交互这需要频繁的切换模式。效率并不是很高。</p>
页: [1]
查看完整版本: STM32MP157A-DK1测评+IIO与ADC (6)