#include
#include
#include
#include/*创建设备节点*/
#include
#include/*延时函数*/
#include
#include
#includeadc.h>
#include
#defineADC_MAJOR102
#defineADC_NAME"my_adc"
#defineSUCCESS0
staticintadc_open(structinode*,structfile*);
staticintadc_release(structinode*,structfile*);
staticint__initadc_init(void);
staticint__exitadc_exit(void);
staticssize_tadc_read(structfile*,char*,size_t,loff_t*);
volatileunsignedlongadc_con;
unsignedlongadc_dat0;
//#defineadc_con(unsignedlong)ioremap(0x58000000,4)
//#defineadc_dat0(volatileunsignedlong)ioremap(0x5800000c,4)
structclk*adc_clk;
structfile_operationsadc_ops=
{
.owner=THIS_MODULE,
.read=adc_read,
.open=adc_open,
.release=adc_release,
};
staticint__initadc_init(void)
{
intret;
adc_clk=clk_get(NULL,"adc");//获取时钟
clk_enable(adc_clk);//使能时钟
ret=register_chrdev(ADC_MAJOR,ADC_NAME,&adc_ops);//注册设备
if(ret<0)
{
printk("registerdevicefail/n");
returnret;
}
adc_con=(unsignedlong)ioremap(0x58000000,4);
adc_dat0=(volatileunsignedlong)ioremap(0x58000000+S3C2410_ADCDAT0,4);
if(adc_con&adc_dat0==0)
{
printk("Failedtoioremap/n");
gotohandle;
}
printk("Initialized.../n");
returnSUCCESS;
handle:
unregister_chrdev(ADC_MAJOR,ADC_NAME);
return-1;
}
staticintadc_open(structinode*inode,structfile*file)//打开设备函数
{
returnSUCCESS;
}
staticintadc_release(structinode*inode,structfile*file)//关闭设备函数
{
returnSUCCESS;
}
staticssize_tadc_read(structfile*file,
char*buffer,
size_tlength,
loff_t*offset)//设备读取函数
{
unsignedintbuf;
inttmp;
inti;
writew((1<<14)|(0x31<<6),adc_con);//设置ADCCON
writew((readw(adc_con)|0x1),adc_con);//启动AD转换
while(readw(adc_con)&0x1);//启动转换后,等待启动位清零
while(!(readw(adc_con)&0x8000));//等待转换是否完毕
//for(i=0;i<200000;i++);
mdelay(100);
buf=(readw(adc_dat0)&0x3ff);//取出转换后得到的有效数据
copy_to_user(buffer,(char*)&buf,sizeof(buf));
//printk("Thevalueis%x/n",buf);
return2;
}
staticint__exitadc_exit(void)//驱动卸载函数
{
iounmap(adc_con);
iounmap(adc_dat0);
unregister_chrdev(ADC_MAJOR,ADC_NAME);
clk_disable(adc_clk);
clk_put(adc_clk);
printk("Theadcisunintialized/n");
returnSUCCESS;
}
module_init(adc_init);
module_exit(adc_exit);
MODULE_LICENSE("GPL");