Skip to content
Snippets Groups Projects
Select Git revision
  • 06766f7532d2a4e2287a752ba4d3902c0b09a737
  • master default protected
2 results

led_dev.c

Blame
  • led_dev.c 2.17 KiB
    #include <linux/init.h>
    #include <linux/kernel.h>
    #include <linux/module.h>
    #include <linux/fs.h>
    #include <linux/uaccess.h>
    #include <linux/slab.h>
    #include <linux/ktime.h>
    #include <linux/timer.h>
    #include <linux/delay.h>
    
    #include <asm/mach/map.h>
    #include <asm/io.h>
    #include <asm/uaccess.h>
    
    
    #define LED_MAJOR_NUMBER 504
    #define LED_MINOR_NUMBER 104
    #define LED_DEV_NAME "led"
    
    #define GPIO_BASE_ADDR 0x3F200000
    #define GPFSEL0 0x04
    #define GPSET0 0x1C
    #define GPCLR0 0x28
    #define GPLEV0 0x34
    
    static void __iomem *gpio_base;
    volatile unsigned int *gpsel1;
    volatile unsigned int *gpset1;
    volatile unsigned int *gpclr1;
    volatile unsigned int *gplev1;
    
    int led_open(struct inode *inode, struct file *filp){
       printk(KERN_ALERT "led driver open!!\n");
       
       gpio_base = ioremap(GPIO_BASE_ADDR, 0x60);
       gpsel1 = (volatile unsigned int *)(gpio_base + GPFSEL0);
       gpset1 = (volatile unsigned int *)(gpio_base + GPSET0);
       gpclr1 = (volatile unsigned int *)(gpio_base + GPCLR0);
       gplev1 = (volatile unsigned int *)(gpio_base + GPLEV0);
       
       *gpsel1 |= (1<<6);
       return 0;
    }
    
    int led_release(struct inode *inode, struct file *filp){
       printk(KERN_ALERT "led driver closed!!\n");
       iounmap((void *)gpio_base);
       return 0;
    }
    
    ssize_t led_write(struct file *filp, const char *buf, size_t size, loff_t *f_pos){
       int led_onoff = 0;
    	
       copy_from_user(&led_onoff, buf, 4);
    	
       if(led_onoff == 1){
          printk(KERN_ALERT "LED On!!\n");
          *gpset1 |= (1<<12);
       }
       else{
          printk(KERN_ALERT "LED Off!!\n");
          *gpclr1 |= (1<<12);
       }
       
       return size;
    }
    
    static struct file_operations led_fops={
       .owner = THIS_MODULE,
       .write = led_write,