本次开发ADC没有使用iio子系统,也没有用hwmon子系统的方式开发,而是使用字符设备开发的,原因是友善之臂官方提供了一个线程的ADC驱动,是基于杂项设备写的,为了降低难度,这里也是这样写,等到后边比较深入之后,再用相关子系统的方式做规范开发.
在看本文之前可以先看<<S3C2410驱动分析之ADC通用驱动>>先了解一下三星平台ADC使用的大致情况.本例程ADC相关操作使用的是三星远程提供的\linux-3.5\arch\arm\plat-samsung\adc.c里的一些函数.具体看代码即可知道.
首先是驱动代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>
#include <asm/uaccess.h>
#include <plat/adc.h>
#define ADC_SET_CHANNEL _IOW('L', 0x1234, int)
#define ADC_SET_ADCTSC _IOW('L', 0x1235, int)
struct ADC_OBJ{
struct mutex mutex_lock;
struct s3c_adc_client *client;
int channel;
};
struct ADC_OBJ *exynos4412_adcdev = NULL;
static inline