linux gpio 子系统

1.gpio 子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数。

比如设置 GPIO为输入输出,读取 GPIO 的值等。

gpio 子系统的主要目的就是方便驱动开发者使用 gpio,驱动开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API函数来操作 GPIO。

2.使用 pinctrl 和 gpio 子系统来完成 LED 灯驱动

      1)添加pinctrl信息,在 iomuxc 节点。

pinctrl_led: ledgrp {
    fsl,pins = <
                 MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10B0 /* LED0 */
               >; 
};

       2)检查当前设备树中要使用的IO有没有被其他设备使用,如果有的话要处理。

       3)添加设备节点,在设备节点中创建一个属性,此属性描述所使用的gpio。

          在根节点“/”下创建 LED 灯节点
 

gpioled {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "atkalpha-gpioled";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_led>;
    led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
    status = "okay";
};

设备树编写完成以后使用“ make dtbs”命令重新编译设备树,然后使用新编译出来的imx6ull.dtb 文件启动 Linux 系统。
      

4)编写驱动,获取对应的gpio编号,并申请IO,成功以后即可使用此Io

驱动中对gpio的函数操作

 /* 1,获取设备节点 */
    gpioled.nd = of_find_node_by_path("/gpioled");
  
    /* 2, 获取LED所对应的GPIO */
    gpioled.led_gpio = of_get_named_gpio(gpioled.nd, "led-gpios", 0);

    /* 3,申请IO */
    ret = gpio_request(gpioled.led_gpio, "led-gpio");

    /* 4,使用IO,设置为输出 */
    ret = gpio_direction_output(gpioled.led_gpio, 1);

    /* 5,输出底电平,点亮LED灯*/
    gpio_set_value(gpioled.led_gpio, 0);

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