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

📄 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_GPG5
#define Red   S3C2410_GPG8
#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_GPG5, S3C2410_GPG5_OUTP);
        s3c2410_gpio_cfgpin(S3C2410_GPG8, S3C2410_GPG8_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_GPG5);
        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 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 + -