1、xhr4412.dts
/ {
led_test: led_test {
compatible = "led_test";
pinctrl-names = "led_s1", "led_s2";
pinctrl-0 = <&led_on_1 &led_off_2>;
pinctrl-1 = <&led_off_1 &led_on_2>;
};
};
&pinctrl_1 {
led_on_1: led_on_1 {
samsung,pins = "gpl2-0";
samsung,pin-function = <EXYNOS_PIN_FUNC_OUTPUT>;
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
samsung,pin-val = <1>;
};
led_off_1: led_off_1 {
samsung,pins = "gpl2-0";
samsung,pin-function = <EXYNOS_PIN_FUNC_OUTPUT>;
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
samsung,pin-val = <0>;
};
led_on_2: led_on_2 {
samsung,pins = "gpk1-1";
samsung,pin-function = <EXYNOS_PIN_FUNC_OUTPUT>;
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
samsung,pin-val = <1>;
};
led_off_2: led_off_2 {
samsung,pins = "gpk1-1";
samsung,pin-function = <EXYNOS_PIN_FUNC_OUTPUT>;
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
samsung,pin-val = <0>;
};
};
2、led_test.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/pinctrl/consumer.h>
static struct pinctrl_state *led_s1;
static struct pinctrl_state *led_s2;
static struct pinctrl *led_pin;
static struct task_struct *thr;
static int led_pin_set(int state)
{
int ret;
if (state & 1)
ret = pinctrl_select_state(led_pin, led_s1);
else
ret = pinctrl_select_state(led_pin, led_s2);
return ret;
}
static int led_thr(void *data)
{
static int i = 0;
while (!kthread_should_stop()) {
printk("%s [%d] ret=%d\n", __func__, i, led_pin_set(i));
msleep_interruptible(1000);
i++;
}
return 0;
}
static int led_test_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
printk("%s\n", __func__);
led_pin = devm_pinctrl_get(dev);
led_s1 = pinctrl_lookup_state(led_pin, "led_s1");
led_s2 = pinctrl_lookup_state(led_pin, "led_s2");
thr = kthread_run(led_thr, NULL, "kthread-demo");
if (!thr) {
printk("kthread_run fail\n");
return -EINVAL;
}
printk("%s %p %p\n", __func__, led_s1, led_s2);
return 0;
}
static int led_test_remove(struct platform_device *pdev)
{
kthread_stop(thr);
devm_pinctrl_put(led_pin);
printk("%s\n", __func__);
return 0;
}
static struct platform_driver led_test_plat_driver = {
.probe = led_test_probe,
.remove = led_test_remove,
.driver = {
.name = "led_test",
.owner = THIS_MODULE,
.pm = NULL,
},
};
module_platform_driver(led_test_plat_driver);
MODULE_AUTHOR("xhr <https://blog.csdn.net/u012849539>");
MODULE_LICENSE("GPL");
reference