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

📄 leddriver.c~

📁 嵌入式LINUX I/O口驱动,YC2410-SBC T2 平台
💻 C~
字号:
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
#include<linux/config.h>
#include<linux/kernel.h>
#include<asm/arch-s3c2410/regs-gpio.h>
#include<asm/arch/hardware.h>
#include<linux/fs.h>
#include <linux/cdev.h>
#include<linux/delay.h>
#include<asm/uaccess.h>
#define Green S3C2410_GPF5
#define Red   S3C2410_GPF4
#define Green1Red0 0xf021
#define Green0Red1 0xf022
#define Green0Red0 0xf023
#define Green1Red1 0xf024

# define DEVICE_NAME "LedDriver"
#define Led_MINOR 1
unsigned int Led_Major=0;
struct cdev led_dev;

extern void s3c2410_gpio_cfgpin(unsigned int pin,unsigned int function);
extern void s3c2410_gpio_setpin(unsigned int pin,unsigned int to);
extern unsigned int s3c2410_gpio_getpin(unsigned int pin);
extern void s3c2410_gpio_pullup(unsigned int pin,unsigned int to);

int gpio_ctl_ioctl(struct inode *inode, 
		  struct file *flip,
		  unsigned int command, 
		  unsigned long arg)
{
	int err = 0;
	switch (command) 
      {
	case Green1Red0:
		s3c2410_gpio_setpin(Green,1);
              s3c2410_gpio_setpin(Red,0);
		printk("Green=1,Red=0\n");
		return 0;
	case Green0Red1:
		s3c2410_gpio_setpin(Green,0);
                s3c2410_gpio_setpin(Red,1);
		printk("Green=0,Red=1\n");
		return 0;
       case Green0Red0:
		s3c2410_gpio_setpin(Green,0);
                s3c2410_gpio_setpin(Red,0);
		printk("Green=0,Red=0\n");
		return 0;
       case Green1Red1:
		s3c2410_gpio_setpin(Green,1);
                s3c2410_gpio_setpin(Red,1);
		printk("Green=1,Red=1\n");
		return 0;
	default:
		err = -EINVAL;
	}

	return err;
}
static int Led_open(struct inode *inode,struct file *filp)
{
        
        s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);
        s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);
        s3c2410_gpio_setpin(Green,1);
        s3c2410_gpio_setpin(Red,0);
	printk("open\n");
	return 0;
}

static int Led_release(struct inode *inode,struct file *filp)
{
	
	printk("releaes\n");
	return 0;
}
static int led_read(struct file * file, char * buffer, size_t count, loff_t *ppos)
{   
        unsigned int value;   
        value=s3c2410_gpio_getpin(S3C2410_GPG3);
        //s3c2410_gpio_pullup(S3C2410_GPE8,0);
        //s3c2410_gpio_cfgpin(S3C2410_GPE8,S3C2410_GPE8_SDDAT1);
        printk(KERN_INFO "read\n");
        if(value!=0) return 1;
        else return 0;
}
static int led_write(struct file * file, const char * buffer, size_t count, loff_t *ppos)
{   
         
         s3c2410_gpio_setpin(Green,0);
         
         printk(KERN_INFO "write\n");
         return 0;
}
static struct file_operations led_fops = {
        .owner     =       THIS_MODULE,
        .open      =       Led_open,
        .ioctl      =       gpio_ctl_ioctl,
        .read      =       led_read,
        .write     =       led_write,
        .release    =       Led_release,
};

#ifdef  CONFIG_DEVICES_FS
static devfs_handle_t devfs_Led_dir;
static devfs_handle_t devfs_Led_raw;
#endif
/*
static int __init Led_init(void)
{
   int ret;
   gpio_devfs_dir= devfs_register(NULL,"LedDriver",DEVFS_FL_DEFAULT,Led_Major,
                             0, S_IFCHR |S_IRUSR |S_IWUSR |S_IRGRP |S_IWGRP,
                             &led_fops, NULL);

  // ret=register_chrdev(0,DEVICE_NAME,&led_fops);
   //if(ret<0)
  // {
//	   printk(DEVICE_NAME"can't get major number\n");
//	   return ret;
  // }
  // Led_Major=ret;
   
//#ifdef  CONFIG_DEVFS_FS
  //    devfs_Led_dir=devfs_mk_dir(NULL,"led",NULL);
   //   devfs_Led_raw=devfs_register(devfs_Led_dir,"0",DEVFS_FL_DEFAULT,Led_Major,
		                            //Led_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,&led_fops,NULL);

//#endif
   //-------------------3--
    printk(DEVICE_NAME"---initialized\n");
    s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);
        s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);
        s3c2410_gpio_setpin(Green,0);
        s3c2410_gpio_setpin(Red,1);
	printk("Success\n");
        
	return 0;
}

static void __exit  Led_exit(void)
{
//#ifdef  CONFIG_DEVFS_FS
	       devfs_unregister(gpio_devfs_dir);
		//devfs_unregister(devfs_Led_dir);
//#endif
	//	s3c2410_gpio_setpin(Red,1);
             //   unregister_chrdev(Led_Major,DEVICE_NAME);
                printk("LedDriver Unstalled Ok\n");
}*/
static void __exit Led_exit(void)
{
        dev_t dev=MKDEV(Led_Major,0);
      
        cdev_del(&led_dev);
        unregister_chrdev_region(dev,1);
#ifdef CONFIG_DEVFS_FS
        devfs_remove(DEVICE_NAME);
#endif
        printk(KERN_INFO "unregistered the %s\n",DEVICE_NAME);
}
static int __init Led_init(void)
{
        int ret,devno;
        dev_t dev;
        ret = alloc_chrdev_region(&dev,0,1,DEVICE_NAME);
        Led_Major= MAJOR(dev);
	printk(KERN_INFO "Initial YC2410Led driver!\n");
        if (ret<0) {
                printk(KERN_WARNING "Led: can't get major number %d\n",Led_Major);
                return ret;
        }
       
        devno = MKDEV(Led_Major,0);
        cdev_init(&led_dev,&led_fops);
        led_dev.owner = THIS_MODULE;
        led_dev.ops   = &led_fops;

        ret = cdev_add(&led_dev,devno,1);
        if (ret) {
                
                unregister_chrdev_region(dev,1);
                printk(KERN_NOTICE "Error %d adding led device\n",ret);
                return ret;
        }

#ifdef CONFIG_DEVFS_FS
        devfs_mk_cdev(MKDEV(Led_Major,0), S_IFCHR | S_IRUSR | S_IWUSR,DEVICE_NAME);
        printk(KERN_INFO"/dev/%s has been added to your system.\n",DEVICE_NAME);
#else
        printk(DEVICE_NAME "Initialized\n");
        printk(KERN_INFO "You must create the dev file manually.\n");
        printk(KERN_INFO "Todo: mknod c /dev/%s %d 0\n",DEVICE_NAME,Led_Major);
#endif
        return 0;
}

module_init(Led_init);
module_exit(Led_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("threewater<threewater@up-tech.com>");
MODULE_DESCRIPTION("gpio(led) driver for s3c2410");


⌨️ 快捷键说明

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