?? leddrv.c
字號(hào):
//#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/slab.h>
#include <linux/ioport.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/fcntl.h>
#define IOPDATA (*(volatile unsigned *)0x03FF5008)
#define IOMOD (*(volatile unsigned *)0x03FF5000)
#define GET_DATA 0x4800
static int led_write(struct file *,char *,int,loff_t *);
static int led_ioctl(struct inode *s_node,struct file *s_file,unsigned int cmd,unsigned int arg);
static int major=0;
static struct file_operations led_fops=
{
write:(void(*))led_write,
ioctl:(void(*))led_ioctl,
};
char led_name[]="leddrv";
static int __init leddrv_init_module(void)
{
int retv;
retv=register_chrdev(major,led_name,&led_fops);
if(retv<0)
{
printk("<1>register fail!\n");
return retv;
}
if(major==0)
major=retv;
return 0;
}
static void __exit leddrv_cleanup(void)
{
int retv;
retv=unregister_chrdev(major,led_name);
if(retv<0)
{
printk("<1>unreginster fail!\n");
return;
}
printk("<1>leddrv:good_bye!\n");
}
static int led_write(struct file *led_file,char *buf,int len,loff_t *loff)
{
unsigned long iopdata;
IOMOD=0xf0;
if(copy_from_user((char *)&iopdata,buf,len))
return -EFAULT;
IOPDATA=iopdata;
return len;
}
static int led_ioctl(struct inode *s_node,struct file *s_file,unsigned int cmd,unsigned int arg)
{
int retv;
switch(cmd)
{
case GET_DATA:
retv=copy_to_user((void *)arg,(char *)&IOMOD,sizeof(int));
if(retv<0)
return -1;
printk("<1>get timer0 flag ok\n");
break;
default:
break;
}
return 0;
}
module_init(leddrv_init_module);
module_exit(leddrv_cleanup);
MODULE_LICENSE("GPL");
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -