[xhr4412][practice] pinctrl 流水灯


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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值