📄 wtddrv.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 + -