查看: 1749|回复: 2

MY-I.MX6 评估板 开发指导(GPIO)

[复制链接]
  • TA的每日心情
    奋斗
    2021-12-3 10:17
  • 签到天数: 64 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2019-1-28 14:22:42 | 显示全部楼层 |阅读模式
    分享到:
    GPIO输出和输入
    GPIO输入输出以SD1_CLK管脚为例。
    修改.h文件
    1)检查头文件中对SD1_CLK的配置
    示例如下:
    $ sed -n "/PAD_SD1_CLK/p" arch/arm/mach-mx6/board-mx6q_sabresd.h

    2)注释头文件中对SD1_CLK的配置
    示例如下:
    $ sed -i "s/MX6Q_PAD_SD1_CLK/\/\/ &/g" arch/arm/mach-mx6/board-mx6q_sabresd.h

    3)在mx6q_sabresd_pads中添加对SD1_CLK的配置
    配置SD1_CLK功能为MX6Q_PAD_SD1_CLK__GPIO_1_20
    示例如下:
    $ sed -i "/mx6q_sabresd_pads/a\\\t MX6Q_PAD_SD1_CLK__GPIO_1_20," \
    arch/arm/mach-mx6/board-mx6q_sabresd.h

    4)查看修改结果
    示例如下:
    $ sed -n "/PAD_SD1_CLK/p" arch/arm/mach-mx6/board-mx6q_sabresd.h

    配置内核
    • 菜单定位
    Device Drivers ---> -*- GPIO Support --->
  • /sys/class/gpio/... (sysfs interface)


  • 编译
    make uImage
    重新烧写系统并启动设备操作查看gpio目录
    在/sys/class/gpio/目录下可以看到已经导出的GPIO
    $ ls /sys/class/gpio/

      

    向系统注册GPIO
      使用echo注册GPIO_1_20到系统,即可看到gpio目录下多出一个gpio20目录。
      提示:I.MX6 GPIO的值计算方法是(所在的组 - 1) * 32 + 序号,所以GPIO_1_20的管脚值为 (1 – 1) * 32 + 20 = 20。
    $ echo 20 > /sys/class/gpio/export

      

    GPIO输出控制
    • 设置管脚为输出状态
    $ echo out > /sys/class/gpio/gpio20/direction
    • 设置管脚为输出为高电平
    echo 1 > /sys/class/gpio/gpio20/value
    • 设置管脚为输出为低电平
    echo 0 > /sys/class/gpio/gpio20/value
    GPIO输入设置
    • 设置管脚为输入状态
    echo in > /sys/class/gpio/gpio20/direction
    • 获取输入值
    cat /sys/class/gpio/gpio20/value
    注销GPIO接口
    • 注销GPIO_1_20
    echo 20 > /sys/class/gpio/unexport
    GPIO LED
    说明:GPIO LED以PAD NANDF_CS0为例。
    进入内核目录
    $ cd ~/MY-I.MX6/linux-3.0.35/

    添加代码修改.h文件
    1)查找头文件中对NANDF_CS0的配置
    示例如下:
    $ sed -n "/PAD_NANDF_CS0/p" arch/arm/mach-mx6/board-mx6q_sabresd.h

    2)注释头文件中对NANDF_CS0的配置
    示例如下:
    $ sed -i "s/MX6Q_PAD_NANDF_CS0/\/\/ &/g" arch/arm/mach-mx6/board-mx6q_sabresd.h

    3)在mx6q_sabresd_pads中添加对NANDF_CS0的配置
    配置NANDF_CS0功能为MX6Q_PAD_NANDF_CS0__GPIO_6_11
    示例如下:
    $ sed -i "/mx6q_sabresd_pads/a\\\tMX6Q_PAD_NANDF_CS0__GPIO_6_11," arch/arm/mach-mx6/board-mx6q_sabresd.h

    4)查看修改结果
    示例如下:
    $ sed -n "/PAD_NANDF_CS0/p" arch/arm/mach-mx6/board-mx6q_sabresd.h

    修改.c文件
    1)检查.c文件中GPIO是否被重复使用
    示例如下:
    $ sed -n '/IMX_GPIO_NR(6,.11)/p' arch/arm/mach-mx6/board-mx6q_sabresd.c

    2)在.c文件中增加GPIO的宏定义
    增加#define SABRESD_USER_LED IMX_GPIO_NR(6, 11)
    示例如下:
    $ GPIO_DEFINE="#define SABRESD_USER_LED\tIMX_GPIO_NR(6, 11)"
    $ sed -i "1,/#define/{/#define/s/#define/${GPIO_DEFINE}\n&/}" arch/arm/mach-mx6/board-mx6q_sabresd.c

    2)检查gpio_led类型的数据定义
    示例如下:
    $ sed -n '/struct gpio_led /,/\}/p' arch/arm/mach-mx6/board-mx6q_sabresd.c

    3)增加user_led的数据定义
    static struct gpio_led imx6q_gpio_leds[] = {
        GPIO_LED(SABRESD_USER_LED, "user_led", 0, 1,
            "charger"),
    };
    内核配置
    • 菜单定位
    Device Drivers --->
  • LED Support ---> <*> LED Support for GPIO connected LEDs

  • 编译
    make uImage
    重新烧写系统并启动GPIO_LED操作设备文件目录
    启动系统后即存在/sys/class/leds/user_led目录,使用ls即可看到
    $ ls /sys/class/leds/user_led

      

    操作示例
    1)置NANDF_CS0为1
    $ echo 1 > /sys/class/leds/user_led/brightness
    2)置NANDF_CS0为0
    $ echo 0 > /sys/class/leds/user_led/brightness
    GPIO按键
    GPIO按键以GPIO_4、EIM_BCLK、CSI0_DATA_EN为例,分别是原理图的按键SW2,SW3和SW4。
    修改.h文件
    1)查找头文件中对PAD的配置
    示例如下:
    $ sed -n "/PAD_GPIO_4/p" arch/arm/mach-mx6/board-mx6q_sabresd.h
    $ sed -n "/PAD_EIM_BCLK/p" arch/arm/mach-mx6/board-mx6q_sabresd.h
    $ sed -n "/PAD_CSI0_DATA_EN/p" arch/arm/mach-mx6/board-mx6q_sabresd.h

    2)注释头文件中对PAD的配置
    示例如下:
    $ sed -i "s/MX6Q_PAD_GPIO_4/\/\/ &/g" arch/arm/mach-mx6/board-mx6q_sabresd.h
    $ sed -i "s/MX6Q_PAD_EIM_BCLK/\/\/ &/g" arch/arm/mach-mx6/board-mx6q_sabresd.h
    $ sed -i "s/MX6Q_PAD_CSI0_DATA_EN/\/\/ &/g" arch/arm/mach-mx6/board-mx6q_sabresd.h

    3)在mx6q_sabresd_pads中添加对PAD的配置
    配置GPIO_4功能为MX6Q_PAD_GPIO_4__GPIO_1_4
    示例如下:
    $ sed -i "/mx6q_sabresd_pads/a\\\tMX6Q_PAD_GPIO_4__GPIO_1_4," arch/arm/mach-mx6/board-mx6q_sabresd.h
    配置EIM_BCLK功能为MX6Q_PAD_EIM_BCLK__GPIO_6_31
    示例如下:
    $ sed -i "/mx6q_sabresd_pads/a\\\tMX6Q_PAD_EIM_BCLK__GPIO_6_31," arch/arm/mach-mx6/board-mx6q_sabresd.h
    配置CSI0_DATA_EN的PAD功能为MX6Q_PAD_CSI0_DATA_EN__GPIO_5_20
    示例如下:
    $ sed -i "/mx6q_sabresd_pads/a\\\tMX6Q_PAD_CSI0_DATA_EN__GPIO_5_20," arch/arm/mach-mx6/board-mx6q_sabresd.h

    4)查看修改结果
    示例如下:
    $ sed -n "/PAD_GPIO_4/p" arch/arm/mach-mx6/board-mx6q_sabresd.h
    $ sed -n "/PAD_EIM_BCLK/p" arch/arm/mach-mx6/board-mx6q_sabresd.h
    $ sed -n "/PAD_CSI0_DATA_EN/p" arch/arm/mach-mx6/board-mx6q_sabresd.h
    修改.c文件
    1)检查.c文件中GPIO是否被重复使用
    示例如下:
    $ sed -n '/IMX_GPIO_NR(1,.4)/p' arch/arm/mach-mx6/board-mx6q_sabresd.c
    $ sed -n '/IMX_GPIO_NR(6,.31)/p' arch/arm/mach-mx6/board-mx6q_sabresd.c
    $ sed -n '/IMX_GPIO_NR(5,.20)/p' arch/arm/mach-mx6/board-mx6q_sabresd.c

    2)在.c文件中增加GPIO的宏定义
    • MX6Q_PAD_GPIO_4__GPIO_1_4
    在.c文件中添加#define SABRESD_POWER_OFF IMX_GPIO_NR(1, 4)
    示例如下:
    $ GPIO_DEFINE="#define SABRESD_POWER_OFF\tIMX_GPIO_NR(1, 4)"
    $ sed -i "1,/#define/{/#define/s/#define/${GPIO_DEFINE}\n&/}" arch/arm/mach-mx6/board-mx6q_sabresd.c
    • MX6Q_PAD_CSI0_DATA_EN__GPIO_5_20
    在.c文件中添加#define SABRESD_VOLUME_UP IMX_GPIO_NR(6, 31)
    示例如下:
    $ GPIO_DEFINE="#define SABRESD_VOLUME_UP\tIMX_GPIO_NR(6, 31)"
    $ sed -i "1,/#define/{/#define/s/#define/${GPIO_DEFINE}\n&/}" arch/arm/mach-mx6/board-mx6q_sabresd.c
    • MX6Q_PAD_CSI0_DATA_EN__GPIO_5_20
    在.c文件中添加#define SABRESD_VOLUME_DN IMX_GPIO_NR(5, 20)
    示例如下:
    $ GPIO_DEFINE="#define SABRESD_VOLUME_DN\tIMX_GPIO_NR(5, 20)"
    $ sed -i "1,/#define/{/#define/s/#define/${GPIO_DEFINE}\n&/}" arch/arm/mach-mx6/board-mx6q_sabresd.c

    3)检查gpio_keys_button类型的数据定义
    示例如下:
    $ sed -n '/gpio_keys_button/,/\}/p' arch/arm/mach-mx6/board-mx6q_sabresd.c

    4)增加volume-up、volume-down、power的数据定义
    static struct gpio_keys_button imx6q_buttons[] = {
    GPIO_BUTTON(SABRESD_VOLUME_UP, KEY_VOLUMEUP, 1, "volume-up", 0, 1),
    GPIO_BUTTON(SABRESD_VOLUME_DN, KEY_VOLUMEDOWN, 1, "volume-down", 0, 1),
    GPIO_BUTTON(SABRESD_POWER_OFF, KEY_POWER, 1, "power", 1, 1),
    };
    内核配置
    • 菜单定位:
    Device Drivers ---> Input device support --->
  • Keyboards ---> <*> GPIO Buttons

  • 编译
    make uImage
    重新烧写系统并启动GPIO按键操作GPIO_KEYS设备
    启动系统后即存在/sys/devices/platform/gpio-keys目录,使用ls即可看到

      

    $ ls /sys/devices/platform/gpio-keys
    查看设备信息
    在proc文件系统下可以看到相关信息
    $ cat /proc/bus/input/devices

      

    设备文件
    event0即对应gpio按键对应的设备文件,使用ls可以查看:

      

    $ ls /dev/input/event0 –la
    操作示例
    见Linux测试手册

    回复

    使用道具 举报

  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2019-1-28 16:34:25 | 显示全部楼层
    308.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-12-3 10:17
  • 签到天数: 64 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2019-1-30 10:19:59 | 显示全部楼层

    更多资料请查阅:wiki.myzr.com.cn
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 05:28 , Processed in 0.123935 second(s), 20 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.