2021-07-10 rv1126 DTS 添加ADC 驱动检测蓄电池电压

1/修改设备树,添加adc接口定义(也可以直接修改dtb文件开启接口并屏掉复用即可)

 文件路径  boot dtsi
 saradc: saradc@ff5e0000
 
adc_vo{
            status = "okay";
            compatible = "adc_vota";
            io-channels = <&saradc 3>;//通道
    };


&adc {
    status = "okay";

    light_sensor0: light_sensor {
        compatible = "rockchip,light_sensor";
        io-channels = <&adc 0>;
    };

    battery_value {
            compatible = "rockchip,rv1108_battery";
            io-channels = <&adc 2>;
            battery-levels = <
                    3400 3408 3416 3424 3432 3440 3448 3456 3464 3472
                    3480 3488 3496 3504 3512 3520 3528 3536 3544 3562
                    3570 3578 3586 3594 3602 3610 3618 3626 3634 3642
                    3650 3658 3666 3674 3682 3690 3698 3706 3714 3722
                    3730 3738 3746 3754 3762 3770 3778 3786 3794 3802
                    3810 3818 3826 3834 3842 3850 3858 3866 3874 3882
                    3890 3898 3906 3914 3922 3930 3938 3946 3954 3962
                    3970 3978 3986 3994 4002 4010 4018 4026 4034 4042
                    4050 4058 4066 4074 4082 4090 4098 4106 4114 4122
                    4130 4138 4146 4154 4162 4170 4178 4186 4192 4200>;
    };

};

/线程定时读取蓄电池电压

 #include <stdio.h>
#include <pthread.h>

void thread(void)
{

//tv 延时

         //获取电压
}

  int main(void)
{
   pthread_t id;

int i,ret;
  ret=pthread_create(&id,NULL,(void *) thread,NULL); // 成功返回0,错误返回错误编号
  if(ret!=0) {
    printf (“Create pthread error!\n”);
    exit (1);
  }
  
  pthread_join(id,NULL);
  return (0);
}

2/添加c内核驱动
源码原连接:https://blog.csdn.net/qq_33166886/article/details/83826077

#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>

#define GPIO_LOW 0
#define GPIO_HIGH 1

int major;
int count;

static struct class *cls;
static int arg1=0;
module_param(arg1,int,S_IRUSR);
struct iio_channel *chan;

static int adc_open(struct inode *inode, struct file *file)
{
printk(KERN_EMERG "%s-%d: enter\n",__FUNCTION__,__LINE__);
return 0;	
}

static struct file_operations adc_fops = {
.owner  =   THIS_MODULE,   
.open   =   adc_open,     	   
};

 static int adc_probe(struct platform_device *pdev)
{
int i=0;
int ret,raw;
int result = -1;

printk(KERN_EMERG "%s-%d: enter\n",__FUNCTION__,__LINE__);

major = register_chrdev(0, "adc", &adc_fops);
cls = class_create(THIS_MODULE, "adc");
device_create(cls, NULL, MKDEV(major, 0), NULL, "adc_test"); 
chan = iio_channel_get(&(pdev->dev), NULL);

if (IS_ERR(chan))
{
	  	chan = NULL;
		printk("%s() have not set adc chan\n",   __FUNCTION__);
        return -1;
}
while(i<arg1)
{
	ret = iio_read_channel_raw(chan, &raw); 
	if (ret < 0) {
		printk("read hook adc channel() error: %d\n", ret);
		return -1;
	    }

	result = (1800*raw)/1023;
	printk(KERN_INFO "i = %d raw= %d Voltage=%dmV\n",i,raw,result);
	i++;
	mdelay(500);
}

printk(KERN_INFO "%s-%d: exit\n",__FUNCTION__,__LINE__);
return 0;  
 }

static int adc_remove(struct platform_device *pdev)
{ 
printk(KERN_INFO "Enter %s\n", __FUNCTION__);
iio_channel_release(chan);
device_destroy(cls, MKDEV(major, 0));
class_destroy(cls);
unregister_chrdev(major, "adc");
return 0;
}

static const struct of_device_id of_adc_match[] = {
{ .compatible = "adc_vota" },
{ /* Sentinel */ }
};

static struct platform_driver adc_driver = {
.probe		= adc_probe,
.remove		= adc_remove,
.driver		= {
	.name	= "adc",
	.owner	= THIS_MODULE,
	.of_match_table	= of_adc_match,
},

};

static int __init adc_init(void)
 {
printk(KERN_INFO "Enter %s\n", __FUNCTION__);
return platform_driver_register(&adc_driver);
return 0;
}

static void __exit adc_exit(void)
{
platform_driver_unregister(&adc_driver);
printk(KERN_INFO "Exit Hello world\n");
}
module_init(adc_init);
module_exit(adc_exit);
MODULE_LICENSE("GPL");

3/应用层 c 执行 cat iio 设备目录 获取 adc 检测到数值并转换成实际电压(标准接口可以用fd open 驱动设备接口)

cat /sys/bus/iio/devices/iio\:device1/in_voltage*_raw   

4/获取adc 编码器脉冲信号并转换成速度数值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值