- 论坛徽章:
- 0
|
回复 2# xfortune
#include<mach/regs-gpio.h>
#include<mach/hardware.h>
#include<linux/sched.h>
#include<linux/interrupt.h>
#define ADS8556_MAJOR 251 //需修改?
#define DEVICE_NAME "ads8556_dev"
static DECLARE_WAIT_QUEUE_HEAD(wq);
//#define CLKCON 0x4C00000C
#define GPECON 0x56000040
#define GPEDAT 0x56000044
#define GPEUP 0x56000048
#define GPGCON 0x56000060
#define GPGDAT 0x56000064
#define GPGUP 0x56000068
#define SPCON0 0x59000000
#define SPSTA0 0x59000004
#define SPPIN0 0x59000008
#define SPIPRE0 0x5900000C
#define SPTDATE0 0x59000010
#define SPRDATE0 0x59000014
static int Device_Open=0;
int ADS8556_init(void);
void ADS8556_exit(void);
int spidev_init(void);
int gpio_init(void);
static int ADS8556_open(struct inode * inode,struct file * filp);
static int ADS8556_release(struct inode * inode,struct file * filp);
static ssize_t ADS8556_read(struct file * filp,char * buffer, size_t count, loff_t * ppos);
static void ADS8556_int_handler(int irq,void * dev_id);
static struct file_operations ADS8556_fops={
.owner=THIS_MODULE,
.read=ADS8556_read,
.open=ADS8556_open,
.release=ADS8556_release,
};
int spidev_init(void)
{
__raw_writeb(0x00,SPCON0);
__raw_writeb(0x01,SPSTA0);
__raw_writeb(0x00,SPPIN0);
__raw_writeb(0x00,SPIPRE0);
__raw_writeb(0x00,SPTDATE0);
__raw_writeb(0x00,SPRDATE0);
return 0;
}int spidev_mode(void)
{
__raw_writeb(0x3C,SPCON0);
return 0;
}
int gpio_init(void)
{
__raw_writel(0x0,GPECON);
__raw_writew(0x0000,GPEUP);
__raw_writel(0x0,GPGCON);
__raw_writew(0xfc00,GPGUP);
return 0;
}
int gpio_set(void)
{
//配置相关IO引脚
__raw_writel((1<<1)|(0x3<<2),GPGCON);
__raw_writel((0x2<<26)|(0x2<<22)|(1<<20)|(1<<1|(1<<16)|(1<<14),GPECON);
__raw_writew((1<<13)|(1<<11),GPEUP);
__raw_writew(0x1,GPGUP);
// __raw_writew(0x0000,&GPGDAT); //清零GPGDAT
return 0;
}
static int Major;
int __init ADS8556_init(void)
{
// __raw_writel((1<<13)|(1<<1,CLKCON);
spidev_init(); //spi初始化
gpio_init(); //io初始化
spidev_mode(); //spi工作方式设置 ,中断模式 ,主设备,低电平,格式化A
gpio_set(); //相关IO口功能设置
int ret;
// 注册中断
ret=request_irq(IRQ_EINT8,ADS8556_int_handler,IRQF_SHARED,DEVICE_NAME,NULL);
if (ret) {
return ret;
}
//注册ADS8556
Major=register_chrdev(ADS8556_MAJOR,DEVICE_NAME,&ADS8556_fops);
if(Major<0)
{
//主设备号小于0,则注册失败
printk ("ADS8556 init_module:failed with %d\n",Major);
return Major;
}
//设备权限设定,用哪个函数?
printk(DEVICE_NAME "initialized\n"
return 0;
}
module_init(ADS8556_init);
static int ADS8556_open(struct inode * inode,struct file * filp)
{
if (Device_Open)
{
return -EBUSY;
}
Device_Open++;
return 0;
}
static int ADS8556_release(struct inode * inode,struct file * filp)
{
Device_Open--;
return 0;
}
//驱动程序的读函数
static ssize_t ADS8556_read(struct file * filp,char * buffer, size_t count, loff_t * ppos)
{
unsigned long data0 ,data1,data;
// 启动AD转换
__raw_writew((1<<,GPEDAT);
wait_event_interruptible(wq,(GPGDAT&1==0));
__raw_writew(0x1,GPGDAT);
data0=SPRDATE0 & 0xff; //从SPRDATA0读数据
// interruptible_sleep_on(&readwait); //进入睡眠,等待中断
wait_event_interruptible(wq,(GPGDAT&1==0));
data1=SPRDATE0 & 0xff;
data=data1+(data0<<;
copy_to_user(buffer,(char *)&data,sizeof(data)); //复制数据到用户空间
return sizeof(data);
}
//中断处理函数
static void ADS8556_int_handler(int irq,void * dev_id)
{
__raw_writew(0x0,GPGDAT);
wake_up_interruptible(&wq);
}
//驱动卸载函数
void __exit ADS8556_exit(void)
{
unregister_chrdev(ADS8556_MAJOR,DEVICE_NAME); //注销ADS8556
free_irq(IRQ_EINT8,NULL); //释放中断
}
module_exit(ADS8556_exit);
MODULE_LICENSE("GPL"
因为刚入手写的比较乱。。大家帮忙看看吧。。 |
|