am335x嵌入式开发-GPIO操作

原文:  https://blog.csdn.net/juebanrui1988/article/details/50704570

 

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

官方文档

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

官方文档1

官方文档2

应用层使用

GPIO编号

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

pin_num=bank_num∗32+pin_bank_num

pin_num=GPIO编号

bank_num=GPIO块编号

pin_bank_num=GPIO在GPIO块中的子编号

AM335x系列SOC有4个bank,每个bank有32个GPIO,一共支持 32∗4=128 个GPIO,GPIO的bank表示方法为: bank0[0:31] bank1[0:31] bank2[0:31] bank3[0:31]。例如芯片上有一个pin为gpio2_3,

则这个pin的GPIO编号为:number=2∗32+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

设置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

读GPIO当前电平

# cat /sys/class/gpio/gpio67/value // read gpio value # 1

解除GPIO映射

# echo 67 /sys/class/gpio/unexport

1

内核配置

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

  • 进入内核配置

# make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm menuconfig

  • 1

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

# sudo apt-get install libncurses5  libncurses5-dev

  • 1
  • 使能内核的GPIO功能

选择设备驱动

这里写图片描述

这里写图片描述

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

驱动使用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资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值