首页 > 其他分享 >RV1126 —— 配置adc并读取adc通道上传感器数值

RV1126 —— 配置adc并读取adc通道上传感器数值

时间:2023-07-05 18:00:12浏览次数:42  
标签:读取 light RV1126 adc iio include sensor channel

1.adc设备树配置

  一般来说,rk中已经封装好了标准adc的dts参数属性,我们要做的就是添加自己的adc通道,并引用标准接口即可,不同平台,标准dts中的adc节点名有所不同,其配置属性基本一样。

  例如:
   1)adc: adc@ff100000 {
        compatible = "rockchip,saradc";
        ......
        };
   2)saradc: saradc@ff100000 {
        compatible = "rockchip,saradc";
        ......
        };

  添加自己的dts通道:(在系统对应的dts中添加)

adc_name{                                     //自定义节点名
      compatible = "adc_name";            //匹配驱动的属性字符串,可以与节点名不同
      io-channels = <&saradc(&adc) 2>;   //设定我们需要读取的adc通道,参考硬件原理图,其中&表示应用系统封装的标准dts配置,需要系统标准的adc节点名,保证与本系统的一致,这里我们设定的为adc通道2
      io-channel-names = "adc2"           //自己取的名字,后续iio_channel_get的第二个参数会使用到这个参数
      status = "okay";                    //设备节点状态
      };

  

  由于我使用的是RV1109板卡,使用的是rv1126.dtsi。

《RV1126 —— 配置adc并读取adc通道上传感器数值》第1张

   可以看到已经配置好了。

《RV1126 —— 配置adc并读取adc通道上传感器数值》第2张

  再rv1126-evb-v10.dtsi中使能saradc,并配置基准电压(这个根据自身硬件决定)。

 2.adc内核配置

  直接在kernel中make ARCH=arm menuconfig,查找saradc。

《RV1126 —— 配置adc并读取adc通道上传感器数值》第3张

  然后编译下载到板卡上。

《RV1126 —— 配置adc并读取adc通道上传感器数值》第4张

3.编写光敏驱动

3.1 查看光敏在adc的通道几

《RV1126 —— 配置adc并读取adc通道上传感器数值》第5张

   可以看到lightsensor是在通道2。

3.2 配置设备树

《RV1126 —— 配置adc并读取adc通道上传感器数值》第6张

 3.3 编写light sensor驱动

  其中主要注意iio_channel_get(&(pdev->dev), "adc2")和iio_read_channel_raw(chan, &raw),作用分别是获取adc通道以及获取adc原始数据。

#include <linux/kernel.h>
#include <linux/gpio.h>
#include <linux/moduleparam.h>
#include <linux/stat.h>
 
#include <linux/init.h>
#include <linux/module.h> 
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/of_platform.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>
#include <linux/adc.h>
 
#include <linux/version.h>
 
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/pm.h>
#include <linux/sysctl.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>
 
#include <linux/iio/iio.h>
#include <linux/iio/machine.h>
#include <linux/iio/driver.h>
#include <linux/iio/consumer.h>

#include <linux/uaccess.h>

#define GPIO_LOW 0
#define GPIO_HIGH 1
int major;
int count;
 
static struct class *cls;
struct iio_channel *chan;

static int light_sensor_open(struct inode *inode, struct file *file)
{
	printk(KERN_EMERG "%s-%d: enter
",__FUNCTION__,__LINE__);
	return 0;	
}
 
static ssize_t light_sensor_read(struct file *filp,char *buf,size_t len,loff_t *off)
{
	int raw;
	int ret = -1;
	int result = 20;

	ret = iio_read_channel_raw(chan, &raw); 
	if (ret < 0) 
	{
		printk("read hook adc channel() error: %d
", ret);
		return 0;
	}

	result = (1800*raw)/1023;
	ret = copy_to_user(buf, &result, len);	
	
	return 1;
}

static struct file_operations adc_fops = {
    .owner  =   THIS_MODULE,   
    .open   =   light_sensor_open,  
	.read   =  light_sensor_read,   	   
};
 
static int adc_probe(struct platform_device *pdev)
{
	printk(KERN_EMERG "%s-%d: enter
",__FUNCTION__,__LINE__);
	
    major = register_chrdev(0, "light_sensor", &adc_fops);
	cls = class_create(THIS_MODULE, "light_sensor");
	device_create(cls, NULL, MKDEV(major, 0), NULL, "light_sensor"); 
	chan = iio_channel_get(&(pdev->dev), "adc2");
	if (IS_ERR(chan))
 	{
		chan = NULL;
		return -1;
	}
	return 0;  
}
 
 
static int adc_remove(struct platform_device *pdev)
{ 
	printk(KERN_INFO "Enter %s
", __FUNCTION__);
	iio_channel_release(chan);
	device_destroy(cls, MKDEV(major, 0));
	class_destroy(cls);
	unregister_chrdev(major, "light_sensor");
    return 0;
}
static const struct of_device_id of_adc_match[] = {
	{ .compatible = "light_sensor" },
	{ /* Sentinel */ }
};
static struct platform_driver adc_driver = {
	.probe		= adc_probe,
	.remove		= adc_remove,
	.driver		= {
		.name	= "light_sensor",
		.owner	= THIS_MODULE,
		.of_match_table	= of_adc_match,
	},
};
 
static int __init adc_init(void)
{
	printk("init light_sensor driver");
    return platform_driver_register(&adc_driver);
    return 0;
}
 
static void __exit adc_exit(void)
{
	platform_driver_unregister(&adc_driver);
    printk(KERN_INFO "Exit light sensor driver
");
}
module_init(adc_init);
module_exit(adc_exit);
MODULE_LICENSE("GPL");

  将以上源码保存为 drivers/iio/adc/light_sensor.c ,并在 drivers/iio/adc/Makefile 后加入

obj-$(CONFIG_LIGHT_SENSOR) += light_sensor.o

  在drivers/iio/adc/Kconfig中添加:

config LIGHT_SENSOR
        tristate "light sensor config"

  最后在make ARCH=arm menuconfig配置选择LIGHT_SENSOR。编译下载到板卡。

《RV1126 —— 配置adc并读取adc通道上传感器数值》第7张

   可以到对应的设备节点。

4.获取光敏的数值

通过用户态接口获取adc值,其中*表示adc第多少通道:

cat /sys/bus/iio/devices/iio:device0/in_voltage*_raw

  由于我们是使用的通道2

《RV1126 —— 配置adc并读取adc通道上传感器数值》第8张

  其中数值就改变了。

5.adc相关api

struct iio_channel *iio_channel_get(struct device *dev, const char *consumer_channel);
  • 功能:获取 iio 通道描述

  • 参数:

    • dev: 使用该通道的设备描述指针

    • consumer_channel: 通道名称

void iio_channel_release(struct iio_channel *chan);
  • 功能:释放 iio_channel_get 函数获取到的通道

  • 参数:

    • chan:要被释放的通道描述指针

int iio_read_channel_raw(struct iio_channel *chan, int *val);
  • 功能:读取 chan 通道 AD 采集的原始数据。

  • 参数:

    • chan:要读取的采集通道指针

    • val:存放读取结果的指针

6.计算采集到的电压

使用标准电压将 AD 转换的值转换为用户所需要的电压值。其计算公式如下:

Vref / (2^n-1) = Vresult / raw

注: Vref 为标准电压 n 为 AD 转换的位数 Vresult 为用户所需要的采集电压 raw 为 AD 采集的原始数据 例如,标准电压为 1.8V,AD 采集位数为 10 位,AD 采集到的原始数据为 568,则:

Vresult = (1800mv * 568) / 1023;

标签:读取,light,RV1126,adc,iio,include,sensor,channel
From: https://www.cnblogs.com/kn-zheng/p/17529459.html

相关文章

  • RV1126调试-修改默认调试串口
    背景RK系列的SDK给的默认的调试串口都是uart2/1500000波特率,本次调试设备已经把console调试口改为了uart0,所以需要修改下uboot和内核,然后把波特率设为常用的115200。注:本次调试的SDK版本为原厂的V2.2版本1.uboot修改1)修改rv1126-evb.dts和rv1126-u-boot.dtsi把uart2改成uart......
  • RV1126按键中断驱动和应用调试
     本人使用的调试平台是荣品的rv1126开发板,最近在调试按键中断。经过查看原理图,发现竟然没有一个空闲的IO,所以使用UART1的RX作为按键中断引脚。    驱动部分:     因为UART1原先已经在设备树中已经有了定义,需要将kernel/arch/arm/boot/dts/rongpin/rv1126_11......
  • Python中对open读取文件内容时的mode模式解析
    1.Python可以使用open函数来实现文件的打开,关闭,读写操作;Python3中的open函数定义为:open(file,mode='r',buffering=None,encoding=None,errors=None,newline=None,closefd=True)其中mode列表为:'r'#openforreading(default)'w'#openforwriting,truncatin......
  • java工具类static静态方法读取yml配置
    当我们需要在工具类中获取yml配置的时候,由于变量是staic导致获取不到yml配置因为spring加载静态方法比IOC早,所以不能直接使用@Value注解读取yml配置,读取结果是null。@ComponentpublicclassTestUtil{//使用@Value注解读取yml配置的数据@Value("${test.url}")......
  • efficienthrnet读取H-2yaml文件
    代码读取配置文件创建的网络['features.0.1.weight:torch.Size([24,3,3,3])','features.0.2.weight:torch.Size([24])','features.0.2.bias:torch.Size([24])','features.1.conv.0.1.weight:torch.Size([24,1,3,3])','features.1.......
  • 读取efficienthrnetH-2预训练模型的网络结构
    ['features.0.1.weight:torch.Size([24,3,3,3])','features.0.2.weight:torch.Size([24])','features.0.2.bias:torch.Size([24])','features.0.2.running_mean:torch.Size([24])','features.0.2.running_var:torch.Size......
  • python如何操作读取excel表格数据之xlrd模块
    xlrd模块支持读取xlsx和xls两种格式的excel表格数据,使用之前需要先安装(可以通过pip安装) importxlrd#读取excel文件路径readfile=xlrd.work_bork(r'excel文件所在路径') #获取sheetsheet=readfile.sheet_names()obj_sheet=readfile.sheet_by_name('sheet1') #......
  • 如何通过Java读取到Windows系统日志evtx文件
    近日公司有个需求,需要调研如何使用Java来读取Windows日志文件(类型:应用程序,安全,Setup,系统)一番调研以后,在仅使用java的基础上系统日志文件似乎不太可能(就个人调研结果来看),再通过多渠道查询(百度、chargpt),找到2个可能的实现的方案:1、使用Java来调用C++方法JNA(JavaNativeAccess)......
  • .net core读取配置文件
    先添加这两个开发包: 这是配置文件; {"Logging":{"LogLevel":{"Default":"Information","Microsoft.AspNetCore":"Warning"}},"AllowedHosts":"*","......
  • PyTorch项目实战09——CIFAR10数据的读取和展示
    1CIFAR10cifar10的官方网址:<http://www.cs.toronto.edu/~kriz/cifar.html>是由32\*32像素的60000张图片组成的数据集,50000张图片用于训练,10000张图片用于测试,其中有10个类别,每个类别有6000张图片,分类之间彼此独立,不会重叠,因此是一个单标签多分类的问题。2读取CIFAR10数据首先在......