STM32MP157A-DK1测评+IIO与ADC (6)
<div class='showpostmsg'><p>在嵌入式linux系统中会使用大量的专用“工业设备”。如:数/模转换器、模/数转换器、惯性陀螺仪、磁力计、加速度计、压力传感器等等。linux为了管理这些“工业设备”特别的制定了一套“规范”。这就是:iiO子系统,全称是 Industrial I/O subsystem(工业 I/O 子系统)。规范的目的是用于填补那些分类时处在hwmon(硬件监视器)和输入子系统之间的设备类型。这一规定简化了应用系统的开发。同时也促进了厂家驱动程序的规范化,简化应用开发。</p><p>linux内核和应用的交互是"异步的",数据和信号触发的管理非常复杂。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的&adc配置项</p>
<pre>
<code class="language-cpp">&adc {
pinctrl-names = "default";
pinctrl-0 = <&adc12_ain_pins_a>, <&adc12_usb_pwr_pins_a>;
vdd-supply = <&vdd>;
vdda-supply = <&vdd>;
vref-supply = <&vrefbuf>;
status = "okay";
adc1: adc@0 {
/*
* Type-C USB_PWR_CC1 & USB_PWR_CC2 on in18 & in19.
* Use at least 5 * RC time, e.g. 5 * (Rp + Rd) * C:
* 5 * (56 + 47kOhms) * 5pF => 2.5us.
* Use arbitrary margin here (e.g. 5µs).
*/
st,min-sample-time-nsecs = <5000>;
/* AIN connector, USB Type-C CC1 & CC2 */
st,adc-channels = <0 1 6 13 18 19>;
status = "okay";
};
adc2: adc@100 {
/* AIN connector, temp sensor, USB Type-C CC1 & CC2 */
st,adc-channels = <0 1 2 6 12 18 19>;
/* temperature sensor min sample time */
st,min-sample-time-nsecs = <10000>;
status = "okay";
};
adc_temp: temp {
status = "okay";
};
};
</code></pre>
<p>默认状态status = "disable"; 修改为"okay";<br />
编译DTS系统, make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040 O="$PWD/../build"<br />
我是将内核一起编译的,按理说DTS是可以单独编译的。是不是只拷贝DTS文件就可以打开驱动呢。所以我直接将DTS的编译文件 stm32mp157a-dk1.dtb拷贝到板子的/boot/目录下,不拷贝内核文件。发现也是可以打开驱动设备。板子重启以后,可以看到设备文件 /dev/iio:device0、/dev/iio:device1、/dev/iio:device2三个文件了。这说明驱动已加载成功。</p>
<p>测试ADC的工具我使用了ST提供的IIO工具。可惜这些工具默认系统中是没有的。需要自行编译的。<br />
工具的源码在<Linux_kernel_source_path>/tools下。<br />
PC $> cd <Linux_kernel_source_path>/tools<br />
PC $> make <tool> <br />
我要编译iio工具,命令如下:<br />
make ARCH=arm iio O="$PWD/../../build"<br />
编译完成后就可以在"$PWD/../../build"目录的iio下找lsiio、iio_event_monitor、iio_generic_buffer三个文件了。<br />
iio系统是“子文件系统”,那么设备/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 &</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> </p>
<p><b><font color="#5e7384">此内容由EEWORLD论坛网友<font size="3">bigbat</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b></p>
<p> </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> <p>其实linux系统更加偏向软件,外设接口的操作需要和内核交互这需要频繁的切换模式。效率并不是很高。</p>
页:
[1]