tq2440 adc 驱动

转载 2016年05月30日 15:54:24
/*************************************************************
基于tq2440开发板,内核2.6.30

功能
用到的模拟量输入口是ain2.
成功实现了ad 转换,能连续采集
2012年7月11日16:33:29
**************************************************************/

#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <linux/poll.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/irq.h>
#include <linux/interrupt.h>


#include <mach/regs-gpio.h>
#include <mach/hardware.h>

#include <asm/irq.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>

#define DEVICE_NAME "driver_adc"


volatile unsigned long *adccon = NULL; //adc控制寄存器
volatile unsigned long *adctsc = NULL; //adc 触摸屏控制寄存器
volatile unsigned long *adcdly = NULL; //adc 起始延迟寄存器
volatile unsigned long *adcdat0 = NULL; //adc 转换数据寄存器
volatile unsigned long *adcdat1 = NULL; //adc 转换数据寄存器
volatile unsigned long *intmsk = NULL;
//*gpbdat &= ~((1<<5) );
//ain2

// ------------------- OPEN ------------------------
ssize_t drive_open (struct inode * inode ,struct file * file)
{
printk("-----------------drive open ok----------------\n");
return 0;
}


// ------------------- RELEASE/CLOSE ---------------
ssize_t drive_release (struct inode  * inode ,struct file * file)
{
printk("-----------------drive close ok----------------\n");
return 0;
}


// ------------------- READ ------------------------
ssize_t drive_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)
{
int val;
printk("-----------------drive read ok----------------\n");

*adccon |= (1<<14)|(0xff<<6)|(2<<3);//设置分频倍数0xff,设置输入通道为2
//*intmsk |= (1<<31)| (1<<5)|(1<<8);
*adccon |= 0X1; //开始转换

while( *adccon & 0x1)
;

while( !(*adccon & 0x8000) ) //等待转换结束
;
val=(*adcdat0&0x3ff);
//擦,这里竟然写错了,写成adccon了,纠结了半天
//*adccon =0x3fc4;这样写不行,貌似是ioremap  位数不够的缘故

*adccon &=~1; //关adc
printk("----------------drive -----val=%d \n",val);
copy_to_user( buf,&val,sizeof(val) );
printk("---------------drive-close-ok-------------\n",val);
return val;
}


// ------------------- WRITE -----------------------
ssize_t drive_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)
{
printk("-----------------drive write ok----------------\n");
return 0;
}

// ------------------- IOCTL -----------------------
ssize_t drive_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, unsigned long arg)
{
printk("-----------------drive ioctl ok----------------\n");
return 0;
}


// -------------------------------------------------

static struct file_operations drive_ops ={

.owner  = THIS_MODULE,
.open   = drive_open,
.read    = drive_read,
.write   = drive_write,
.ioctl    = drive_ioctl,
.release = drive_release,
};


static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &drive_ops,
};


static int __init init_drive(void)  
{
int ret;
ret = misc_register(&misc);

adccon = (volatile unsigned long *)ioremap(0x58000000, 16);
adctsc =  (volatile unsigned long *)ioremap(0x58000004, 8);
adcdly =  (volatile unsigned long *)ioremap(0x58000008, 16);
adcdat0= (volatile unsigned long *)ioremap(0x5800000c, 16);
adcdat1= (volatile unsigned long *)ioremap(0x58000010, 16);
intmsk  = (volatile unsigned long *)ioremap(0x4a000008, 32);
printk("-----------------drive button init ok----------------\n");
return 0;
}

static void __exit exit_drive(void)
{
misc_deregister(&misc);
printk("-----------------drive button exit ok----------------\n");
}



module_init(init_drive);
module_exit(exit_drive);
MODULE_LICENSE("GPL");




//--------------------------------------------测试应用程序--------------------------------------------------

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <fcntl.h>      // open() close()
#include <unistd.h>     // read() write()

#define DEVICE_NAME "/dev/driver_adc"

//------------------------------------- main ---------------------------------------------
int main(int argc, char **argv)
{
int fd,ret;

int val;
       fd = open(DEVICE_NAME, O_RDWR);
 
if (fd == -1)
{
printf("can't open device mknod %s c zhu ci \n",DEVICE_NAME);
return 0;
}

while(1)
{
read(fd,&val,sizeof(val));
printf("------------------app--------------------\n");
printf("val=%d\n",val);
sleep(3);
}
        // close 
ret = close(fd);
if (ret == -1)
{
printf("app close error!!!!!!!!!!\n");
return 0;
}
        return 0;
}// end main

s3c2440 LCD驱动,USB驱动,触摸屏以及ADC驱动移植

这篇驱动移植文章,目的是实现相应的功能,并分享我在做移植过程中所碰到的一些问题及解决的方法。 贴上代码: --- mach-smdk2440_o.c 2015-04-24 11:39:20.492...
  • u010944778
  • u010944778
  • 2015年05月17日 16:58
  • 1201

linux 混杂设备驱动之adc驱动

linux2.6.30.4中,系统已经自带有了ADC通用驱动文件---arch/arm/plat-s3c24xx/adc.c,它是以平台驱动设备模型的架构来编写的,里面是一些比较通用稳定的代码,但是l...
  • lwj103862095
  • lwj103862095
  • 2014年01月18日 16:16
  • 8340

ADC驱动实例(简单)

ADC驱动(仅一路输入) /********s3c2410-adc.h********/#ifndef _S3C2410_ADC_H_#define _S3C2410_ADC_H_#define AD...
  • huang879135
  • huang879135
  • 2011年07月12日 21:46
  • 3550

TQ2440与PC串口通信_USB烧写

第一天学习总结(串口测试) 一 1、笔记本没有串口,所以设备管理器中没有(端口)项, 2、接好USB转串口,用驱动之家检测安装驱动。 二、安装SecureCRT(或超级终端),配置参数(ser...
  • shijianjinghun
  • shijianjinghun
  • 2015年04月03日 08:31
  • 665

LINUX下ADC按键驱动程序

ADC按键驱动 Adc键盘原理图如下,将串联电阻之间分别用按键引出来与地相连,当按键按下时端电压会发生改变。基本思想是在ADC驱动基础上,对采样电压进行判断,检测是哪一个按键按下。 1.   ...
  • feng85016578
  • feng85016578
  • 2016年09月27日 10:21
  • 1381

ADC_驱动

嵌入式 linux 驱动 ADC驱动 [ 2011-1-10 13:18:00 | By: Eddy ]     很懒,很...
  • linuxarmsummary
  • linuxarmsummary
  • 2012年06月04日 14:40
  • 1542

Exynos4412 ADC 设备驱动开发

具体ADC硬件知识及裸机驱动请看: Exynos4412裸机开发 —— A/D转换器 1、原理图如下: 2、相关寄存器信息 ADC_BASE      0x126C0000 ADCCON    ...
  • zqixiao_09
  • zqixiao_09
  • 2016年03月17日 20:35
  • 3689

LCD驱动程序移植

对LCD的操作可以像串口一样,通过终端设备层的封装(/dev/tty*设备)来输出内容,也可以通过frame buffer(/dev/fb*设备)直接在显存上“绘制”图像。 tty(终端设备)...
  • qlexcel
  • qlexcel
  • 2016年06月10日 14:38
  • 418

s3c2440 ADC驱动

S3C2440 ADC结构图    A/D转换时间 当GCLK频率为50MHz,预分频系数为49时,10位转换时间如下: A/D converter freq. = 50MHz/(49...
  • alada007
  • alada007
  • 2012年06月27日 16:34
  • 1818

亲测 S3C2440 dnw下载驱动 win7_x64

之前一直在纠结,win7 64位下的dnw下载驱动,这几天无意中找到了 郭天祥老师arm9的dnw下载软件,还带有驱动,果断就装上了,...
  • hailmy
  • hailmy
  • 2013年09月25日 14:30
  • 2811
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:tq2440 adc 驱动
举报原因:
原因补充:

(最多只允许输入30个字)