📄 adcdri.c
字号:
#ifdef MODULE
#include <linux/module.h>
#include <linux/version.h>
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <linux/errno.h>
#include<asm/uaccess.h>
#include <asm/io.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include "adcioctl.h"
#define DEVICE_NAME "adc"
#define adc_MAJOR 69
#define DEV_MAJOR adc_MAJOR
#define BUTT_DEBUG
int ret,ADCRESULT,i;
static int adc_open(struct inode *inode , struct file *filp)
{
MOD_INC_USE_COUNT;
outl(0x7ff8, S3C44B0X_CLKCON); //配置时钟控制寄存器,全能MCLK作为ADC的时钟源
outl(0x20, S3C44B0X_ADCPSR); //设置时钟预分频值
return 0;
}
static ssize_t adc_read(struct file *filp,char *buf,size_t count,loff_t *ppos)
{
return 0;
}
static int adc_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
if(_IOC_TYPE(cmd) != adc_MAGIC)
{
return -ENOTTY;
}
if(_IOC_NR(cmd) >=adc_IOCTL_MAXNR)
{
return -ENOTTY;
}
switch(cmd) //设置采样通道
{
case READ_RESULT : //通道0
outl((arg<<2),S3C44B0X_ADCCON);
for(i=0;i<150;i++); outl((0x01|(arg<<2)),S3C44B0X_ADCCON);
for(i=0;i<150;i++);//这条语句必须要有,否则不能正常运行,配置寄存器需要时间,所以时隙上要注意
break;
case DEFAULT :
printk( KERN_ERR "nothing is done! \n");
break;
}
ret = (inl(S3C44B0X_ADCCON)) & 0x40; //判断是否转换完毕 ret=1:转换结束 ret=0:正在转换
while(!ret);
ADCRESULT=inl(S3C44B0X_ADCDAT); //读取AD转换结果
return ADCRESULT;
}
static int adc_release(struct inode *inode , struct file *filp)
{
MOD_DEC_USE_COUNT;
return 0;
}
static struct file_operations button_fops =
{
open : adc_open,
read : adc_read,
ioctl : adc_ioctl,
release : adc_release,
};
/*********************************************************************
*函数名 :adc_init
*传入参数 :
*传出参数 : 0 --->正常 -1 ---> 错误
*作用 : 按键的初始化函数,用来初始化EXTINT4567,以及timer
*********************************************************************/
static int __init adc_init(void)
{
if((register_chrdev(DEV_MAJOR, DEVICE_NAME , &button_fops)) < 0)
{
printk( KERN_ERR DEVICE_NAME":Unable to get major %d\n", DEV_MAJOR);
return -1;
}
else { printk( "register dev is success!\n"); }
#ifdef BUTT_DEBUG
printk( KERN_ERR "adc0 initial ok!\n");
#endif
return 0;
}
static int __exit adc_clearup(void)
{
unregister_chrdev(DEV_MAJOR ,DEVICE_NAME);
printk( KERN_ERR "Button has already exit! \n");
return 0;
}
#ifdef MODULE
module_init(adc_init);
module_exit(adc_clearup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("mengzhiyi<zhc_mengzhiyi@yahoo.com.cn>");
MODULE_DESCRIPTION("button driver for S3C44B0");
#else
__initcall(adc_init);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -