⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wtddrv.c

📁 也业是关于驱动开发的方面得到。像好好正席看看
💻 C
字号:
#define MODULE

//#define __KERNEL__
#ifdef MODULE
#include <linux/module.h>
#include <linux/version.h>
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif
//#define __KERNEL__

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/poll.h>
#include <linux/slab.h>
#include <linux/ioport.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/s3c2410.h>
#include <linux/fcntl.h>

//#define get_DAT 0x5000
#define put_wtd_data 0x5010
#define  uint unsigned short;
#define  uchar unsigned char;


static int wtd_read(struct file*, char *,size_t,loff_t *);
static int wtd_write(struct file *,char *,int,loff_t *);
static int wtd_ioctl(struct inode *s_node,struct file *s_file,unsigned int cmd,unsigned long int arg);
static int wtd_open(struct inode *, struct file *);
static int wtd_release(struct inode *, struct file *);

static int major=246;
static struct file_operations wtd_fops=
{
	read:wtd_read,
	write:wtd_write,
	ioctl:wtd_ioctl,
	open:wtd_open,
	release:wtd_release,
};
char wtd_name[]="2410wtd";

static int __init wtddrv_init_module(void)
{
	int i,retv;
	//unsigned int DATA16,CON;
	retv=register_chrdev(major,wtd_name,&wtd_fops);
	if(retv<0)
	{
	printk("<1>register fail!\n");
	return retv;
	}
	// printk("major=%d\n",major);
	if(major==0)
	major=retv;
	//printk("retv=%d\n",retv);
	printk("major=%d\n",major);
	return 0;
}
static void __exit wtddrv_cleanup(void)
{
   int retv;
   retv=unregister_chrdev(major,wtd_name);
   if(retv<0)
      {
         printk("<1>unreginster fail!\n");
         return;
      }
   printk("<1>wtddrv:good_bye!\n");
}

static int wtd_open(struct inode * inode, struct file * filp)
{
	MOD_INC_USE_COUNT;
	printk("MOD_IN_USE_COUNT=%x!\n",MOD_IN_USE);
	if(MOD_IN_USE>1)
	{
		MOD_DEC_USE_COUNT;
		return -EBUSY;
	}
	
	WTCNT=0x2000;  //4S
	WTCON=0xfffd;   //open wtd
	return 0;
}

static int wtd_release(struct inode *inode, struct file * filp)
{
	MOD_DEC_USE_COUNT;
	//WTCON=0x8000;   //open wtd
	return 0;
}

static int wtd_write(struct file *keybaord_file,char *buf,int len,loff_t *loff)
{
  return 0;
}

static int wtd_read(struct file *file, char *buf,size_t count,loff_t *loff)
{
   return 0;
}

static int wtd_ioctl(struct inode *s_node,struct file *s_file,unsigned int cmd,unsigned long int arg)
{
	int retv,i,ttp,realaddr;
	unsigned int writedata=0x2000;
	switch(cmd)
	{
		case put_wtd_data:
		//	printk("int cmd\n");
			retv=copy_from_user((unsigned int *)&writedata,(unsigned int *)arg,sizeof(int));
			if(retv<0)
			{
				return -1;
			//printk("fail-------------------------------------\n");
				
			}
			//printk("success-------------------------------------\n");*/
			WTCNT=writedata;
			break;
		default:
			break;
	}
   	return 0;
}
module_init(wtddrv_init_module);
module_exit(wtddrv_cleanup);



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -