MTK平台设备和驱动的配置及使用--pmic驱动 pinctrl驱动

第一章 GPIO的设备配置和驱动使用

1、设备树配置

设置节点

robot_stepmotor {
		compatible = "robot,stepmotor";
		pinctrl-names = "step_dir_output0",
		"step_dir_output1",
		pinctrl-0 = <&step_dir_right_output0>;
		pinctrl-1 = <&step_dir_left_output1>;
};
&pio {
	step_dir_right_output0: dir_output0 {
		pins_cmd_dat {
			pinmux = <PINMUX_GPIO33__FUNC_GPIO33>;
			slew-rate = <1>;
			output-low;
		};
	};
	step_dir_left_output1: dir_output1 {
		pins_cmd_dat {
			pinmux = <PINMUX_GPIO33__FUNC_GPIO33>;
			slew-rate = <1>;
			output-high;
		};
	};
};

2、驱动中使用设备树的信息

int my_gpio_set(struct device *dev)
{
	struct pinctrl* step_pinctr;
	struct pinctrl_state *dir_output0, *dir_output1;
	step_pinctr = devm_pinctrl_get(dev);//通过节点找到所有gpio能够设置的状态
	dir_output0 = pinctrl_lookup_state(step_pinctr, "step_dir_output0");//查找节点中gpio名称“”step_dir_output0“”对应的状态
	if (IS_ERR(step_dir_output0)) {
		printk("err:step_dir_output0\n");
		return -1;
	}
	dir_output1 = pinctrl_lookup_state(step_pinctr, "step_dir_output1");
	if (IS_ERR(step_dir_output1)) {
		printk("err:step_dir_output1\n");
		return -1;
	}
	ret = pinctrl_select_state(step_pinctr, dir_output0);//将引脚设置成指定状态
	if(ret < 0){
		printk("error:%s\n",RIGHT_DIR);
		}
	return 0;
}

第二章 pmic的电压输出配置

1、设备树dts的配置

项目的dts配置($(project).dtsi):

	robot_stepmotor: robot_stepmotor_ctrl {
			compatible = "robot,stepmotor";
			vqmmc-supply = <&mt_pmic_vmc_ldo_reg>;//
			vmmc-supply = <&mt_pmic_vmch_ldo_reg>;
			};

pmic中的配置:

		&main_pmic {
				ldo_regulators {
						mt_pmic_vmc_ldo_reg: ldo_vmc {
							regulator-name = "vmc";
							regulator-min-microvolt = <1800000>;
							regulator-max-microvolt = <3300000>;
							regulator-enable-ramp-delay = <44>;
						};
						mt_pmic_vmch_ldo_reg: ldo_vmch {
							regulator-name = "vmch";
							regulator-min-microvolt = <2900000>;
							regulator-max-microvolt = <3300000>;
							regulator-enable-ramp-delay = <44>;
						};
				};
		};

主控芯片$(platform)中的声明:

	main_pmic: mt-pmic {
		compatible = "mediatek,mt_pmic";
		interrupt-controller;
	};

2、驱动获取dts并设置输出

struct regulator *step_reg=NULL;
struct regulator *pwr_reg=NULL;
int ret;
	step_reg = regulator_get(&pdev->dev,"vqmmc");//获取dts设备节点
	if(!step_reg){
		printk("regulator_get failed!\n");
	}
	pwr_reg = regulator_get(&pdev->dev,"vmmc");//获取dts设备节点
	if(!pwr_reg){
		printk("regulator_get failed!\n");
	}
	ret = regulator_set_voltage(step_reg,3300000,3300000);//设置输出电压
	if (ret<0) {
		printk("regulator_set_voltage(ret = %d) failed:3000000!\n", ret);
	}
	ret = regulator_set_voltage(pwr_reg,3300000,3300000);//设置输出电压
	if (ret<0) {
		printk("regulator_set_voltage(ret = %d) failed:3000000!\n", ret);
	}
	ret = regulator_enable(step_reg);//使能PMIC输出电压
	if(ret < 0){
		printk("-err:regulator_enable-----ret = %d-----\n",ret);
	}
	ret = regulator_disable(step_reg);//关闭PMIC的电压输出
	if(ret < 0){
		printk("-err:regulator_disable----ret = %d-----\n",ret);
		return -1;
	}
		

第三章 获取设备树属性

设备树节点:

stepmotor_ic_err: ic_inter {
			compatible = "robot,stepmotor_ic";
			mytest = "stepmotor ic err";
		};

驱动获取dts信息:

	const struct of_device_id mt_dts_of_match[] = {
			{ .compatible = "robot,stepmotor_ic", },
	};
	const char * my_string;
	struct device_node * my_node = NULL;
	//参数一:填NULL
	//参数二:const struct of_device_id和设备树匹配compatible
	//返回值:struct device_node 设备节点
	my_node= of_find_matching_node(Stepmotor_node, &mt_dts_of_match);
	ret = of_property_read_string(Stepmotor_node, "mytest", &my_node);
	if(ret<0){
		printk("----node = Stepmotor_node-----stepmotor  of_property_read_string failed--------\n");
	}
	printk("----mytest = %s------\n",my_node);
	

第四章 获取设备树的中断

1、设备树的配置

stepmotor_ic_err: ic_inter {
			compatible = "robot,stepmotor_ic";
			mytest = "stepmotor ic err";
		};
&stepmotor_ic_err {
	interrupt-parent = <&pio>;
	interrupts = <93 IRQ_TYPE_LEVEL_LOW 93 0>;
	status = "okay";
};

2、驱动获取设备树的配置并设置中断方式

const struct of_device_id mt_dts_of_match[] = {
			{ .compatible = "robot,stepmotor_ic", },
	};
	struct device_node * my_node = NULL;
	static unsigned int irq_no;
	//参数一:填NULL
	//参数二:const struct of_device_id和设备树匹配compatible
	//返回值:struct device_node 设备节点
	my_node= of_find_matching_node(Stepmotor_node, &mt_dts_of_match);
	//获取中断号
	irq_no= irq_of_parse_and_map(Stepmotor_node, 0);//获取中断号(返回值是中断号)
	if (!irq_no) {
		printk("--------\n");
		ret = -ENODEV;
	}

第五章 代码驱动例程

参考链接:https://blog.csdn.net/rj_ys/article/details/112827938

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值