代码:
#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”); // 描述模块的别名信息