没有合适的资源?快使用搜索试试~ 我知道了~
本AD驱动程式是一个普遍应用于AD驱动的程序,对于开发者有很好的学习实例。
资源推荐
资源详情
资源评论
s3c2410-adc.c
*
* S3C2410 ADC
* exclusive with s3c2410-ts.c
*/
#include <linux/config.h>
//linux 的配置文件
#include <linux/module.h>
//模块化源文件必须带的头文件
#include <linux/kernel.h>
//包含printk函数
#include <linux/init.h>
//包含module_init(init_function)和module_exit(exit_function)
#include <linux/sched.h>
//包含驱动程序需要的大量API函数,包括睡眠函数以及各种变量声明
#include <linux/irq.h>
#include <linux/delay.h>
#include <asm/hardware.h>
#include <asm/semaphore.h>
//信号量
#include <asm/uaccess.h>
#include <asm/io.h>
#define CONFIG_DEVFS_FS 1 //可选项,要是不选insmod之前必须先mknod /dev/s3c2410 c 220 1
#define USE_IRQ_WAITQUEUE 0 //可选项,AD转换要一段时间,启动之后可以让进程休眠,让CPU去做其他事情
//我的板子不知道为什么申请不到这个中断号所以现不用这,反正是测试,对速度没要求)
#define DEVICE_NAME "s3c2410-adc"
#define ADCRAW_MINOR 1 //此设备号
#define ADC_WRITE(ch, prescale)((ch)<<16|(prescale)) //驱动里没用到,应用程序中,把ch,prescale合成一个数据传送到驱动程序
#define ADC_WRITE_GETCH(data)(((data)>>16)&0x7) //得到通道号
#define ADC_WRITE_GETPRE(data)((data)&0xff) //得到转换的比例因子
*
* S3C2410 ADC
* exclusive with s3c2410-ts.c
*/
#include <linux/config.h>
//linux 的配置文件
#include <linux/module.h>
//模块化源文件必须带的头文件
#include <linux/kernel.h>
//包含printk函数
#include <linux/init.h>
//包含module_init(init_function)和module_exit(exit_function)
#include <linux/sched.h>
//包含驱动程序需要的大量API函数,包括睡眠函数以及各种变量声明
#include <linux/irq.h>
#include <linux/delay.h>
#include <asm/hardware.h>
#include <asm/semaphore.h>
//信号量
#include <asm/uaccess.h>
#include <asm/io.h>
#define CONFIG_DEVFS_FS 1 //可选项,要是不选insmod之前必须先mknod /dev/s3c2410 c 220 1
#define USE_IRQ_WAITQUEUE 0 //可选项,AD转换要一段时间,启动之后可以让进程休眠,让CPU去做其他事情
//我的板子不知道为什么申请不到这个中断号所以现不用这,反正是测试,对速度没要求)
#define DEVICE_NAME "s3c2410-adc"
#define ADCRAW_MINOR 1 //此设备号
#define ADC_WRITE(ch, prescale)((ch)<<16|(prescale)) //驱动里没用到,应用程序中,把ch,prescale合成一个数据传送到驱动程序
#define ADC_WRITE_GETCH(data)(((data)>>16)&0x7) //得到通道号
#define ADC_WRITE_GETPRE(data)((data)&0xff) //得到转换的比例因子
static int adcMajor = 220; //主设备号
typedef struct {
struct semaphore lock; //互斥锁。 作用:一个应用程序A要用此驱动,先拿到锁,把驱动锁上,
// 另一个应用程序想用此驱动,先看是否被锁,锁了就等待或返回信息。
#ifdef USE_IRQ_WAITQUEUE
wait_queue_head_t wait; //等待队列的定义。驱动做某件事情需要些时间,但又不想while(finish)下去,
//因为驱动的while不能被进程调度,可能导致系统当掉
#endif
int channel; //通道号
int prescale; //比例因子
}ADC_DEV;
static ADC_DEV adcdev;
#define START_ADC_AIN(ch, prescale) \
do{ \
ADCCON = PRESCALE_EN | PRSCVL(prescale) | ADC_INPUT((ch)) ; \
ADCCON |= ADC_START; \
}while(0) //此函数就是向ADCCON里先写初始化位,再让其开始转换
#ifdef USE_IRQ_WAITQUEUE
static void adcdone_int_handler(int irq, void *dev_id, struct pt_regs *reg)
{
wake_up(&adcdev.wait); //AD转换完成产生的中断信号调用此函数,唤醒等待队列
}
#endif
static ssize_t s3c2410_adc_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)
剩余8页未读,继续阅读
资源评论
zhenyoucaia
- 粉丝: 0
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功