根据LED驱动框架写的3颗LED的驱动代码完整版

代码:

#include
#include
#include
#include
#include
#include

#define GPJ0CON S5PV210_GPJ0CON
#define GPJ0DAT S5PV210_GPJ0DAT

static struct led_classdev led_cdev1;
static struct led_classdev led_cdev2;
static struct led_classdev led_cdev3;

static void s5pv210_led_set1(struct led_classdev *led_cdev,
enum led_brightness brightness)
{
int temp = 0;
printk(KERN_INFO “s5pv210_led_set1\n”);
if (LED_OFF == brightness)
{
printk(KERN_INFO “off\n”);
iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);

	temp = ioread32(GPJ0DAT);
	temp |= (1<<3);
	iowrite32(temp, GPJ0DAT);	
}
else
{
	printk(KERN_INFO "on\n");
	iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);
	
	temp = ioread32(GPJ0DAT);
	temp &= ~(1<<3);
	iowrite32(temp , GPJ0DAT);
}

}

static void s5pv210_led_set2(struct led_classdev *led_cdev,
enum led_brightness brightness)
{
int temp = 0;
printk(KERN_INFO “s5pv210_led_set2\n”);
if (LED_OFF == brightness)
{
printk(KERN_INFO “off\n”);
iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);

	temp = ioread32(GPJ0DAT);
	temp |= (1<<4);
	iowrite32(temp, GPJ0DAT);		
}
else
{
	printk(KERN_INFO "on\n");
	iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);
	
	temp = ioread32(GPJ0DAT);
	temp &= ~(1<<4);
	iowrite32(temp , GPJ0DAT);
}

}

static void s5pv210_led_set3(struct led_classdev *led_cdev,
enum led_brightness brightness)
{
int temp = 0;
printk(KERN_INFO “s5pv210_led_set3\n”);
if (LED_OFF == brightness)
{
printk(KERN_INFO “off\n”);
iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);

	temp = ioread32(GPJ0DAT);
	temp |= (1<<5);
	iowrite32(temp, GPJ0DAT);	
}
else
{
	printk(KERN_INFO "on\n");
	iowrite32(((1<<12) | (1<<16) | (1<<20)), GPJ0CON);

	temp = ioread32(GPJ0DAT);
	temp &= ~(1<<5);
	iowrite32(temp , GPJ0DAT);
}

}

static int __init s5pv210_led_init(void)
{
int ret = -1;
led_cdev1.name = “led1”;
led_cdev1.brightness = 0;
led_cdev1.max_brightness = 1;
led_cdev1.brightness_set = s5pv210_led_set1;
ret = led_classdev_register(NULL, &led_cdev1);
if (ret)
{
printk(KERN_INFO “led_classdev_register fail\n”);
}
printk(KERN_INFO “led_classdev_register ok\n”);

//led2
led_cdev2.name = "led2";
led_cdev2.brightness = 0;
led_cdev2.max_brightness = 1;
led_cdev2.brightness_set = s5pv210_led_set2;
ret = led_classdev_register(NULL, &led_cdev2);
if (ret)
{
	printk(KERN_INFO "led_classdev_register fail\n");
}
printk(KERN_INFO "led_classdev_register ok\n");

//led3
led_cdev3.name = "led3";
led_cdev3.brightness = 0;
led_cdev3.max_brightness = 1;
led_cdev3.brightness_set = s5pv210_led_set3;
ret = led_classdev_register(NULL, &led_cdev3);
if (ret)
{
	printk(KERN_INFO "led_classdev_register fail\n");
}
printk(KERN_INFO "led_classdev_register ok\n");
return 0;

}

static void __exit s5pv210_led_exit(void)
{
led_classdev_unregister(&led_cdev1);
led_classdev_unregister(&led_cdev2);
led_classdev_unregister(&led_cdev3);
}

module_init(s5pv210_led_init);
module_exit(s5pv210_led_exit);

// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE(“GPL”); // 描述模块的许可证
MODULE_AUTHOR(“Mark [email protected]”); // 描述模块的作者
MODULE_DESCRIPTION(“s5pv210 led driver”); // 描述模块的介绍信息
MODULE_ALIAS(“s5pv210_led”); // 描述模块的别名信息

你可能感兴趣的:(linux驱动)