对于hi3518e 主控芯片内部ADC采样的描述有位牛人描述的很到位。
https://blog.csdn.net/u013738338/article/details/78602986
那个大哥从datasheet出发深入浅出地将hi3518e ADC采样过程描述地很好。
接下来我要用改进过的hisi ADC源码来实现电源电压检测,这份代码读者直接获取、编译就可用。
首先介绍程序的架构。
1.hi_adc.ko提供ADC初始化、开始采样、结束采样、更改采样速度与周期、单次采样、连续采样、挂采样结束中断处理函数等相关函数。
2.power.ko中以定时器软中断的方式从hi_adc.ko提供的接口中定时获取 ADC采样值。
我们先看hi_adc.ko的源码(改进过的默认连续采样)
#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/timer.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/kthread.h>
#include <linux/string.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <mach/irqs.h>
#include <linux/wait.h>
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include "hi_adc.h"
/***************************Define Macro*************************/
#define SUPPORT_CHANNEL 0x4
#define SAR_ADC_BASE 0x200B0000
#define PERI_CRG32_BASE 0x2003007C
#define ADC_CTRL 0x00 //寄存器配置
#define ADC_GLITCH_SAMPEL 0x04 //滤波毛刺配置
#define ADC_TIME_SCAN 0x08
#define ADC_DATA_MASK 0x0c
#define ADC_INT_MASK 0x10 //int enable, 0:disable, 1:enable
#define ADC_INT_STATUS 0x14 //int state
#define ADC_INT_CLR 0x18 //int clr
#define ADC_START 0x1c //start auto scan
#define ADC_STOP 0x20 //stop
#define ADC_IRQ_ENABLE 0x01
#define ADC_IRQ_DISABLE 0x00
#define ADC_CLK_ENABLE (1<<2) //0为使能
#define ADC_POWER_ENABLE 0x00
#define TIME_OUT HZ * 5 // 队列等待时间
//ADC_CTRL
#define ADC_ACTIVE_BIT(x) (x << 24) //precision, 11111100(6 bits),11111000(5 bits)...
#define DATA_DELTA(x) (x << 20) //误差范围,连续扫描模式配置值>2,手册没有说明
#define DEGLITCH_BYPASS (1 << 17) //滤毛刺, 0:enable, 1:bypass
#define ADC_RESET (1 << 15) //reset, 0:quit, 1:enter reset
#def