驱动内核里面已经提供了,这里只是设备端的描述即可。
led-heartbeat.c
/*
* linux-3.10.27
* arm-linux-gcc-4.5.1
*
* @ leds driver (heartbeat)
*/
#include <linux/module.h>
#include <linux/init.h> /* module_init, ... */
#include <linux/kernel.h> /* everything */
#include <linux/cdev.h> /* cdev_init, ... */
#include <linux/fs.h> /* file_operations, */
#include <linux/device.h> /* class_create,... */
#include <linux/platform_device.h>
#include <linux/slab.h> /* kmalloc, ... */
#include <asm/io.h> /* ioremap,... */
#include <linux/uaccess.h> /* copy_from_user, ... */
#include <linux/gpio.h>
#include <linux/leds.h>
static struct gpio_led leds[] =
{
[0] = {
.name = "led0",
.default_trigger = "heartbeat",
.gpio = S5PV210_GPJ2(0),
.active_low = 1,
.default_state = LEDS_GPIO_DEFSTATE_OFF,
},
};
static struct gpio_led_platform_data leds_data = {
.num_leds = ARRAY_SIZE(leds),
.leds = leds,
};
static void led_heartbeat_release(struct device *dev)
{
pr_info("%s called.\n", __func__);
}
static struct platform_device led_heartbeat =
{
.name = "leds-gpio",
.dev = {
.platform_data = &leds_data,
.release = led_heartbeat_release,
},
.id = -1,
};
static int led_heartbeat_init(void)
{
pr_info("%s called.\n", __func__);
platform_device_register(&led_heartbeat);
return 0;
}
static void led_heartbeat_exit(void)
{
pr_info("%s called.\n", __func__);
platform_device_unregister(&led_heartbeat);
}
module_init(led_heartbeat_init);
module_exit(led_heartbeat_exit);
MODULE_LICENSE("GPL");