Select Git revision
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,