leddrv.c

来自「一个linux环境下的LED的驱动和应用程序」· C语言 代码 · 共 95 行

C
95
字号

//#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 <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");

⌨️ 快捷键说明

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