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

📄 leddrv.c

📁 一个linux环境下的LED的驱动和应用程序
💻 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 <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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -