“ADC Linux driver”的版本间的差异

来自百问网嵌入式Linux wiki
 
(未显示同一用户的7个中间版本)
第13行: 第13行:
 
== Configuration ==
 
== Configuration ==
 
=== Kernel configuration ===
 
=== Kernel configuration ===
Activate the ADC<ref name="ADC internal peripheral"/> Linux<sup>&reg;</sup> driver in the kernel configuration using the Linux Menuconfig tool: [[Menuconfig or how to configure kernel]] (enable both CONFIG_STM32_ADC_CORE and CONFIG_STM32_ADC).
+
使用Linux Menuconfig工具在内核配置中激活ADC <ref name="ADC internal peripheral"/> Linux<sup>&reg;</sup> 驱动程序: [[Menuconfig or how to configure kernel]] (同时启用CONFIG_STM32_ADC_CORE和CONFIG_STM32_ADC).
 
<pre>
 
<pre>
 
Device Drivers  --->
 
Device Drivers  --->
第23行: 第23行:
  
 
=== Device tree ===
 
=== Device tree ===
Refer to the [[ADC device tree configuration]] article when configuring the ADC Linux kernel driver.
+
在配置ADC Linux内核驱动程序时,请参考[[ADC device tree configuration]] 文章。
  
 
== How to use ==
 
== How to use ==
In "'''IIO direct mode'''", the conversion result can be read directly from '''sysfs''' (refer to
+
在“'''IIO直接模式'''”中,可以直接从'''sysfs'''读取转换结果 (请参阅
 
[[How to use the IIO user space interface#How to do a simple ADC conversion using the sysfs interface|How to do a simple ADC conversion using the sysfs interface]]).
 
[[How to use the IIO user space interface#How to do a simple ADC conversion using the sysfs interface|How to do a simple ADC conversion using the sysfs interface]]).
  
In "'''IIO triggered buffer mode'''", the configuration must be performed using '''sysfs''' first. Then, '''character device''' (/dev/iio:deviceX) is used to read data (refer to [[How to use the IIO user space interface#Convert one or more channels using triggered buffer mode|Convert one or more channels using triggered buffer mode]]).
+
在“'''IIO触发缓冲区模式'''”中,必须先使用'''sysfs'''执行配置。 然后,使用“字符设备”(/ dev / iio:deviceX)读取数据 (请参阅[[How to use the IIO user space interface#Convert one or more channels using triggered buffer mode|Convert one or more channels using triggered buffer mode]]).
  
 
== How to trace and debug ==
 
== How to trace and debug ==
Refer to [[IIO_overview#How_to_trace_with_dynamic_debug|How to trace with dynamic debug]] for how to '''enable the debug logs''' in the driver and in the framework.
+
请参阅[[IIO_overview#How_to_trace_with_dynamic_debug|How to trace with dynamic debug]] ,以了解如何在驱动程序和框架中“启用调试日志”。
 +
请参阅 [[IIO_overview#How_to_debug_with_debugfs|How to debug with debugfs]],以了解如何“''访问ADC寄存器”。
  
Refer to [[IIO_overview#How_to_debug_with_debugfs|How to debug with debugfs]] for how to '''access the ADC registers'''.
+
ADC对其他关键资源具有系统范围的依赖性:
 
+
* 可以禁用'''运行时电源管理''',例如,可以通过“ power / control” sysfs条目将其强制为'''on'''
The ADC has system wide dependencies towards other key resources:
 
* '''runtime power management''' can be disabled, for example it may be forced '''on''' via ''power/control'' sysfs entry:
 
 
  {{Board$}} cd /sys/devices/platform/soc/48003000.adc/48003000.adc:adc@0
 
  {{Board$}} cd /sys/devices/platform/soc/48003000.adc/48003000.adc:adc@0
 
  {{Board$}} cat power/autosuspend_delay_ms
 
  {{Board$}} cat power/autosuspend_delay_ms
第44行: 第43行:
 
  auto                                    # kernel is allowed to automatically suspend the ADC device after autosuspend_delay_ms
 
  auto                                    # kernel is allowed to automatically suspend the ADC device after autosuspend_delay_ms
 
  {{Board$}} {{highlight|echo on > power/control}}        # force the kernel to resume the ADC device (e.g. keep clocks and regulators enabled)
 
  {{Board$}} {{highlight|echo on > power/control}}        # force the kernel to resume the ADC device (e.g. keep clocks and regulators enabled)
{{Info| It might be useful to disable runtime power management, in order to dump registers by any means or to check clock and regulator usage (see example below).}}
+
{{Info| 禁用运行时电源管理可能很有用,以便通过任何方式转储寄存器或检查时钟和调节器的使用情况(请参见下面的示例)。}}
  
* '''clock'''<ref name="Clock overview">[[Clock overview]]</ref> usage can be verified by reading ''clk_summary'':
+
* 可以通过阅读“ clk_summary”来验证'''clock'''<ref name="Clock overview">[[Clock overview]]</ref> 的使用情况:
 
  {{Board$}} {{highlight|cat /sys/kernel/debug/clk/clk_summary}} | grep adc
 
  {{Board$}} {{highlight|cat /sys/kernel/debug/clk/clk_summary}} | grep adc
 
           adc12_k                    1        1        0    24000000          0 0
 
           adc12_k                    1        1        0    24000000          0 0
 
                   adc12              1        1        0  196607910          0 0
 
                   adc12              1        1        0  196607910          0 0
  
* '''regulator'''<ref name="Regulator overview">[[Regulator overview]]</ref> tree and usage can be verified (e.g. use count, open count or regulator reference voltage) as follows:
+
* '''regulator'''<ref name="Regulator overview">[[Regulator overview]]</ref> 树和用法可以通过以下方式进行验证(例如,使用计数,开路计数或调节器参考电压):
 
  {{Board$}} {{highlight|cat /sys/kernel/debug/regulator/regulator_summary}}
 
  {{Board$}} {{highlight|cat /sys/kernel/debug/regulator/regulator_summary}}
 
   regulator                      use open bypass voltage current    min    max
 
   regulator                      use open bypass voltage current    min    max
第60行: 第59行:
 
           48003000.adc                                              0mV    0mV
 
           48003000.adc                                              0mV    0mV
  
* '''pinctrl'''<ref name="Pinctrl_overview">[[Pinctrl overview]]</ref> usage can be verified by reading ''pinmux-pins'':
+
* '''pinctrl'''<ref name="Pinctrl_overview">[[Pinctrl overview]]</ref> 可以通过阅读“ pinmux-pins”来验证用法:
 
  {{Board$}} cd /sys/kernel/debug/pinctrl/soc\:pin-controller@50002000/
 
  {{Board$}} cd /sys/kernel/debug/pinctrl/soc\:pin-controller@50002000/
 
  {{Board$}} {{highlight|cat pinmux-pins}} | grep adc
 
  {{Board$}} {{highlight|cat pinmux-pins}} | grep adc
 
  pin 92 (PF12): device 48003000.adc function {{highlight|analog}} group PF12  # check pin is assigned to ADC and is configured as "analog"
 
  pin 92 (PF12): device 48003000.adc function {{highlight|analog}} group PF12  # check pin is assigned to ADC and is configured as "analog"
  
* '''interrupts''' can be verified by reading "interrupts":
+
* 可以通过阅读'''interrupts'''来验证“ interrupts”:
 
  {{Board$}} {{highlight|cat /proc/interrupts}}
 
  {{Board$}} {{highlight|cat /proc/interrupts}}
 
             CPU0      CPU1
 
             CPU0      CPU1
第71行: 第70行:
  
 
== Source code location ==
 
== Source code location ==
The ADC source code is composed of:
+
ADC源代码包括:
* {{CodeSource | Linux kernel | drivers/iio/adc/stm32-adc-core.c | stm32-adc-core driver}} to handle common resources such as clock (selection, prescaler), [[Regulator overview|regulator]] used as reference voltage, interrupt and common registers.
+
* {{CodeSource | Linux kernel | drivers/iio/adc/stm32-adc-core.c | stm32-adc-core driver}}来处理诸如时钟(选择,预分频器),用作参考电压的[[Regulator overview|regulator]] 等通用资源,中断和通用寄存器。
* {{CodeSource | Linux kernel | drivers/iio/adc/stm32-adc.c | stm32-adc driver}} to handle the resources available for each ADC such as  channel configuration and buffer handling.
+
* {{CodeSource | Linux kernel | drivers/iio/adc/stm32-adc.c | stm32-adc driver}} 来处理每个ADC可用的资源,例如通道配置和缓冲区处理。
  
 
==References==
 
==References==
 
<references />
 
<references />
 
<noinclude>
 
[[Category:IIO]]
 
{{PublicationRequestId | 9337 | 2018-10-23 | AnneJ}}
 
{{ArticleBasedOnModel | Linux driver article model}}
 
</noinclude>
 

2020年11月9日 (一) 11:28的最新版本

Article purpose

本文介绍了用于ADC [1]内部外围设备的Linux®驱动程序:

  • 驱动程序支持哪些ADC功能
  • 如何配置,使用和调试驱动程序
  • 驱动程序的结构是什么,以及在哪里可以找到源代码。

Short description

ADC Linux®驱动程序(内核空间)基于 IIO 框架。 它支持两种模式:

  1. IIO直接模式:在通道上单次捕获(使用中断)
  2. IIO触发缓冲模式:在一个或多个通道上捕获(最好使用DMA)。
    它使用IIO中提供的硬件触发器。 请参阅TIM Linux driver and LPTIM Linux driver.

Configuration

Kernel configuration

使用Linux Menuconfig工具在内核配置中激活ADC [1] Linux® 驱动程序: Menuconfig or how to configure kernel (同时启用CONFIG_STM32_ADC_CORE和CONFIG_STM32_ADC).

Device Drivers  --->
   <*> Industrial I/O support  --->
      Analog to digital converters  --->
         <*> STMicroelectronics STM32 adc core
         <*>   STMicroelectronics STM32 adc

Device tree

在配置ADC Linux内核驱动程序时,请参考ADC device tree configuration 文章。

How to use

在“IIO直接模式”中,可以直接从sysfs读取转换结果 (请参阅 How to do a simple ADC conversion using the sysfs interface).

在“IIO触发缓冲区模式”中,必须先使用sysfs执行配置。 然后,使用“字符设备”(/ dev / iio:deviceX)读取数据 (请参阅Convert one or more channels using triggered buffer mode).

How to trace and debug

请参阅How to trace with dynamic debug ,以了解如何在驱动程序和框架中“启用调试日志”。 请参阅 How to debug with debugfs,以了解如何“访问ADC寄存器”。

ADC对其他关键资源具有系统范围的依赖性:

  • 可以禁用运行时电源管理,例如,可以通过“ power / control” sysfs条目将其强制为on
Board $> cd /sys/devices/platform/soc/48003000.adc/48003000.adc:adc@0
Board $> cat power/autosuspend_delay_ms
2000
Board $> cat power/control
auto                                     # kernel is allowed to automatically suspend the ADC device after autosuspend_delay_ms
Board $> echo on > power/control         # force the kernel to resume the ADC device (e.g. keep clocks and regulators enabled)
Info.png 禁用运行时电源管理可能很有用,以便通过任何方式转储寄存器或检查时钟和调节器的使用情况(请参见下面的示例)。
  • 可以通过阅读“ clk_summary”来验证clock[2] 的使用情况:
Board $> cat /sys/kernel/debug/clk/clk_summary | grep adc
         adc12_k                     1        1        0    24000000          0 0
                  adc12              1        1        0   196607910          0 0
  • regulator[3] 树和用法可以通过以下方式进行验证(例如,使用计数,开路计数或调节器参考电压):
Board $> cat /sys/kernel/debug/regulator/regulator_summary
 regulator                      use open bypass voltage current     min     max
-------------------------------------------------------------------------------
    v3v3                          4    5      0  3300mV     0mA  3300mV  3300mV
       vdda                       1    2      0  2900mV     0mA  2900mV  2900mV 
          40017000.dac                                              0mV     0mV
          48003000.adc                                              0mV     0mV
  • pinctrl[4] 可以通过阅读“ pinmux-pins”来验证用法:
Board $> cd /sys/kernel/debug/pinctrl/soc\:pin-controller@50002000/
Board $> cat pinmux-pins | grep adc
pin 92 (PF12): device 48003000.adc function analog group PF12   # check pin is assigned to ADC and is configured as "analog"
  • 可以通过阅读interrupts来验证“ interrupts”:
Board $> cat /proc/interrupts
           CPU0       CPU1
 56:          2          0     dummy   0 Edge      48003000.adc:adc@0

Source code location

ADC源代码包括: