am335x嵌入式开发-GPIO操作

GPIO操作是嵌入式开发中最常见的操作,本文将从硬件、驱动层、应用层去剖析am335x soc 的GPIO操作。


官方文档


ti官方关于gpio的支持,点击以下链接进入

官方文档1
官方文档2


应用层使用


GPIO编号


  • GPIO的所有操作都是基于编号的,可以说编号是一个GPIO的ID,TI AM335x系列处理器GPIO的编号规则如下:

    pin_num=bank_num32+pin_bank_num
    pin_num=GPIO
    bank_num=GPIO
    pin_bank_num=GPIOGPIO

  • AM335x系列SOC有4个bank,每个bank有32个GPIO,一共支持 324=128 个GPIO,GPIO的bank表示方法为: bank0[0:31] bank1[0:31] bank2[0:31] bank3[0:31]。例如芯片上有一个pin为gpio2_3,
    则这个pin的GPIO编号为: number=232+3=67


GPIO操作实例


  • 将GPIO映射到sysfs文件系统:
# echo 67 > /sys/class/gpio/export
  • 设置GPIO模式(设置为IO口模式):
# echo "7" > /sys/class/gpio/gpio67/mode
  • 设置GPIO方向(输入或输出):
# echo "out" > /sys/class/gpio/gpio67/direction

or

# echo "in" > /sys/class/gpio/gpio67/direction
  • 操作GPIO

    1. 设置GPIO电平

      
      # echo 0 > /sys/class/gpio/gpio67/value // set gpio value to low
      
      
      # echo 1 > /sys/class/gpio/gpio67/value // set gpio value to high
      
    2. 读GPIO当前电平

# cat /sys/class/gpio/gpio67/value // read gpio value
# 1
  • 解除GPIO映射
# echo 67 /sys/class/gpio/unexport

内核配置


要使能linux下的GPIO功能,需要对内核进行配置,笔者使用的sdk是 sdk-am335x-evm-05.06.00.00 的官方发布包,主机系统为ubuntu-14.04。假设sdk的配置已经做过。

  • 进入内核配置
# make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm menuconfig

在执行过程中报错,显示很多调用找不到,这是因为ubuntu缺少一些库的支持,解决办法如下:

# sudo apt-get install libncurses5  libncurses5-dev
  • 使能内核的GPIO功能

选择设备驱动

这里写图片描述

am335x嵌入式开发-GPIO操作_第1张图片

  • 退出保存并重新编译内核

驱动使用GPIO


  • 驱动路径

    am335x gpio驱动包含两个文件:

    源码文件 说明
    drivers/gpio/omap-gpio.c 处理器 gpio驱动
    drivers/gpio/omap-gpiolib.c sysfs gpio驱动

  • 如何在kernel中使用GPIO

    API 实例 说明
    gpio_request() err = gpio_request(67, “sample_name”); 申请GPIO资源
    gpio_free() err = gpio_free(67); 释放GPIO资源
    gpio_direction_input() err = gpio_direction_input(67); 将GPIO设为输出
    gpio_direction_output() err = gpio_direction_output(67,1); 将GPIO设为输出并初始化高
    gpio_get_value() val = gpio_get_value(); 读取GPIO的当前电平

  • 如何在kernel中使用GPIO中断

    API 实例 说明
    gpio_to_irq() irq_num = gpio_to_irq(67); 获取GPIO中断号
    request_irq() request_irq(irq_num, handler, 0, “gpio_test”, NULL); 申请中断
    set_irq_type() set_irq_type(irq_num, IRQ_TYPE_EDGE_RISING); 设置中断类型
    free_irq() free_irq(irq_num, NULL); 释放中断


    注意:在使用gpio中断前要先申请对应的GPIO资源,在释放中断后要释放GPIO资源


芯片GPIO结构


你可能感兴趣的:(am335x)