zynq MIO驱动

给了原理图,该怎么把MIO管脚配置成gpio模式?怎么做输入输出?做输出怎么发拉高拉低呢?

比如下图原理图,你怎么把ps的MIO20和MIO21配置起来呢?

1.首先你通过ug585 datasheet 要找到MIO20和MIO21所对应的寄存器。

zynq MIO驱动_第1张图片

找了寄存器,那么开始查看内容,把他配置成gpio模式:

zynq MIO驱动_第2张图片

三态(高阻态得关闭了),开始这个没配置,一直无法output高电平。

zynq MIO驱动_第3张图片

2.设置对应寄存器为输出管脚。

zynq MIO驱动_第4张图片

3.输出高电平还是低电平

zynq MIO驱动_第5张图片

一个gpio的硬件操作就完成了。下面开始软件配置

4.dts配置

gpio0: gpio@e000a000 {
	compatible = "xlnx,zynq-gpio-1.0"; //名字和platform_driver匹配
	#gpio-cells = <2>; //2个32位表示
	clocks = <&clkc 42>;
	gpio-controller; 
	interrupt-controller;
	#interrupt-cells = <2>;
	interrupt-parent = <&intc>;
	interrupts = <0 20 4>;
	reg = <0xe000a000 0x1000>; //寄存器地址
};
gpio_pa1 = <&gpio0 21 0>; //配置gpio MIO21
gpio_pa2 = <&gpio0 20 0>;
//gpio bank 0 要有默认值
&gpio0 { 
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_gpio0_default>;
};

//pin初始化用
pinctrl_gpio0_default: gpio0-default {
                           mux {
                               function = "gpio0";
                               groups = " "gpio0_20_grp", "gpio0_21_grp";
                           };

                           conf {
                               groups = ""gpio0_20_grp", "gpio0_21_grp";
                               slew-rate = <0>;
                               io-standard = <1>;
			       bias-disable; //关了高阻态
                           };

                           conf-pull-none {
                               pins = "MIO7", "MIO8";
                               bias-disable;
                           };
                 };

5.驱动配置

void pa_init(struct device_node *np)
{
	int ret;
	gpio_pa1 = of_get_named_gpio(np, "gpio_pa1", 0);
	if (gpio_is_valid(gpio_pa1)) {
		ret = gpio_request_one(gpio_pa1,
			    (GPIOF_EXPORT | GPIOF_INIT_HIGH | GPIOF_DIR_OUT | GPIOF_EXPORT_CHANGEABLE),
			    "gpio_pa1");
		if (ret) {
			pr_err("request gpio_pa1 failed\n");
			gpio_pa1 = ERR_PTR(-ENODEV);
		} else {
			pr_err("gpio_pa1 init ok\n");
		}
	}
	gpio_pa2 = of_get_named_gpio(np, "gpio_pa2", 0);
	if (gpio_is_valid(gpio_pa2)) {
		ret = gpio_request_one(gpio_pa2,
			    (GPIOF_EXPORT | GPIOF_INIT_HIGH | GPIOF_DIR_OUT | GPIOF_EXPORT_CHANGEABLE),
			    "gpio_pa2");
		if (ret) {
			pr_err("request gpio_pa2 failed\n");
			gpio_pa2 = ERR_PTR(-ENODEV);
		} else {
			pr_err("gpio_pa2 init ok\n");
		}
	}
}
void pa_power_on(void)
{

	if (gpio_is_valid(gpio_pa1)) {
		gpio_direction_output(gpio_pa1, 1);
		DBGPRINT(DEBUG_TRACE ,"%s,gpio_pa1=1\n", __func__);
	}
	if (gpio_is_valid(gpio_pa2)) {
		gpio_direction_output(gpio_pa2, 1);
		DBGPRINT(DEBUG_TRACE ,"%s,gpio_pa2=1\n", __func__);
	}
}

 

你可能感兴趣的:(linux驱动)