第一章 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