pinctrl在运行中动态切换复用功能用法

工作中遇到以下这种情况,当屏幕休眠的时候,无法关闭背光,pwm虽然停了,但是直流电压还在,就造成屏幕虽然无显示了,但是还有背光亮着,这时候就需要在屏幕休眠的时候把pwm切换成gpio口,然后把背光是能关闭,等休眠恢复的时候把gpio切换成pwm,直接上代码。
在这里插入图片描述

Index: drivers/pwm/pwm-rockchip.c
===================================================================
--- drivers/pwm/pwm-rockchip.c	(revision 1877)
+++ drivers/pwm/pwm-rockchip.c	(working copy)
@@ -38,6 +38,7 @@
 	struct clk *pclk;
 	struct pinctrl *pinctrl;
 	struct pinctrl_state *active_state;
+	struct pinctrl_state *gpio_state;
 	const struct rockchip_pwm_data *data;
 	void __iomem *base;
 	bool vop_pwm_en; /* indicate voppwm mirror register state */
@@ -238,7 +239,6 @@
 	 * because of period/duty_cycle approximation.
 	 */
 	rockchip_pwm_get_state(chip, pwm, state);
-
 	if (state->enabled)
 		ret = pinctrl_select_state(pc->pinctrl, pc->active_state);
 out:
@@ -246,6 +246,33 @@
 
 	return ret;
 }
+int rockchip_pwm_chnange_gpio(struct pwm_chip *chip)
+{
+         
+		 struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
+         if(pc->gpio_state!=NULL){
+		 	clk_disable(pc->pclk);
+			
+			//clk_unprepare(pc->pclk);
+			//clk_unprepare(pc->clk);
+		 	pinctrl_select_state(pc->pinctrl, pc->gpio_state);
+			 printk("fan pwm0 rockchip_pwm_chnange_gpio\n");
+		 }
+		 return 0;
+}
+EXPORT_SYMBOL(rockchip_pwm_chnange_gpio);
+int rockchip_pwm_chnange_active(struct pwm_chip *chip)
+{
+         
+		 struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
+         if(pc->active_state!=NULL){
+		 	clk_enable(pc->clk); 
+		 	pinctrl_select_state(pc->pinctrl, pc->active_state);
+		 printk("fan pwm0 rockchip_pwm_chnange_active\n");
+         	}
+		 return 0;
+}
+EXPORT_SYMBOL(rockchip_pwm_chnange_active);
 
 static const struct pwm_ops rockchip_pwm_ops = {
 	.get_state = rockchip_pwm_get_state,
@@ -396,6 +423,13 @@
 		dev_err(&pdev->dev, "No active pinctrl state\n");
 		return PTR_ERR(pc->active_state);
 	}
+	pc->gpio_state = pinctrl_lookup_state(pc->pinctrl, "gpio");
+	if (IS_ERR(pc->gpio_state)) {
+		dev_err(&pdev->dev, "No gpio pinctrl state\n");
+		return PTR_ERR(pc->gpio_state);
+	}else{
+       printk("fan pwm0 get gpio pinctrl\n");
+	}
 
 	platform_set_drvdata(pdev, pc);
 Index: drivers/video/backlight/pwm_bl.c
===================================================================
--- drivers/video/backlight/pwm_bl.c	(revision 1877)
+++ drivers/video/backlight/pwm_bl.c	(working copy)

+extern int rockchip_pwm_chnange_gpio(struct pwm_chip *chip);
+extern int rockchip_pwm_chnange_active(struct pwm_chip *chip);
 static void pwm_backlight_power_on(struct pwm_bl_data *pb, int brightness)
 {
 	int err;
 
 	if (pb->enabled)
-		return;
-
+		return;
+    rockchip_pwm_chnange_active(pb->pwm->chip);
 	err = regulator_enable(pb->power_supply);
 	if (err < 0)
 		dev_err(pb->dev, "failed to enable power supply\n");
@@ -58,10 +61,11 @@
 
 	if (pb->enable_gpio)
 		gpiod_set_value(pb->enable_gpio, 1);
-
+	PowerLedSet(1);
 	pwm_enable(pb->pwm);
 	pb->enabled = true;
-	PowerLedSet(1);
+	
+	printk("fan pwm_backlight_power_on\n");
 }
 
 static void pwm_backlight_power_off(struct pwm_bl_data *pb)
@@ -78,6 +82,10 @@
 	regulator_disable(pb->power_supply);
 	pb->enabled = false;
 	PowerLedSet(0);
+    rockchip_pwm_chnange_gpio(pb->pwm->chip);
+	msleep(2000);msleep(2000);
+	gpio_direction_output(216,1);
+	printk("fan pwm_backlight_power_off\n");
 }


dts做如下修改
&pwm0{
		pinctrl-names = "active","gpio";
		pinctrl-0 = <&pwm0_pin>;
        pinctrl-1 = <&pwm_as_gpio>;
};
&pinctrl {

    mygpio {
	   pwm_as_gpio:mygpio{
			rockchip,pins = <7 0 RK_FUNC_GPIO &pcfg_pull_up>;
					
   };
	};
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
为了实现 Django 列表排序功能切换,你可以使用一个通用的函数来处理排序逻辑,并在不同的视图复用该函数。下面是一个示例: 首先,创建一个名为 `get_sorted_queryset()` 的函数来处理排序逻辑: ```python def get_sorted_queryset(queryset, sort_param): if sort_param == 'name': sorted_queryset = queryset.order_by('name') elif sort_param == 'date': sorted_queryset = queryset.order_by('date') else: sorted_queryset = queryset return sorted_queryset ``` 在上述代码,`queryset` 是你的查询集,`sort_param` 是排序参数。根据不同的排序参数,可以在函数添加相应的排序逻辑。如果没有传递排序参数,则返回原始的查询集。 接下来,在你的视图函数使用该函数来获取排序后的查询集: ```python def my_view(request): sort_param = request.GET.get('sort') queryset = YourModel.objects.all() sorted_queryset = get_sorted_queryset(queryset, sort_param) # 分页逻辑... context = { 'data_list': sorted_queryset, } return render(request, 'my_template.html', context) ``` 在上述代码,首先从 GET 请求参数获取排序参数 `sort`,然后根据该参数调用 `get_sorted_queryset()` 函数来获取排序后的查询集。最后将该查询集传递给模板进行渲染。 在模板,你可以按照之前的方式进行数据列表的渲染。 通过使用这个通用的排序函数,你可以在不同的视图轻松地实现列表排序功能切换,并且可以根据需要添加更多的排序选项。这样可以提高代码的复用性和可维护性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术求索者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值