SMDKC110的GPIO引脚相对来说比较多,但是大部份引脚都具有多重复用功能,怎样在linux上用最简单的形式来控制GPIO这须要我们好好研究一下底层的代码了,虽然方式有好多种,鉴于在操作系统端控制GPIO并不像控制传统的单片机那样。
这儿我将提到一种方式来述说,这些方式也是我至今见到最简单的方式
首先我们打开linux-3.0.1archarmplat-samsungincludeplat下gpio-cfg.h这个头文件,仔细浏览后发觉,我们可以使用的函数:
1.设置单一io口
ints3c_gpio_cfgpin(unsignedintpin,unsignedintto);
上面有两个参数,第一个pin是选择那个引脚,第二个参数有三种定义
设置成输出模式#defineS3C_GPIO_INPUT(S3C_GPIO_SPECIAL(0))
设置成输入模式#defineS3C_GPIO_OUTPUT(S3C_GPIO_SPECIAL(1))
复用功能选择#defineS3C_GPIO_SFN(x)(S3C_GPIO_SPECIAL(x))
虽然按照我使用的情况来说第1,2两个定义根本就是鸡肋,只有第3个S3C_GPIO_SFN(x)才是最有用的,举个反例:
Ok6410的开发板的DS1818BB2020的插口,元件被接在GPE0上,而GPE有如下复用功能
其中的参数x就是对应上表的复用功能,当x=0时是输入功能,x=1时是输出功能......下边我想不用我说你们也明白了吧。
这个事例s3c_gpio_cfgpin(S3C64XX_GPE(0),S3C_GPIO_SFN(1));说明GPE0口配置为输出模式。
1.获取io口的配置
unsigneds3c_gpio_getcfg(unsignedintpin);这个函数跟前面提到的正好相反,是读取当前一个io口的配置,pin参数是要获得的引脚配置linux gpio,函数会返回一个相应的值
2.设置一组io
ints3c_gpio_cfgpin_range(unsignedintstart,unsignedintnr,unsignedintcfg);
第一个参数start是开始的引脚,第二个nr是从start开始到第一个,注意配置的io必须是同一组的io,第三个cfg是配置状态
3.设置单一io的上拉内阻
ints3c_gpio_setpull(unsignedintpin,s3c_gpio_pull_tpull);
设置单个io为不同的上拉模式,模式分别为
S3C_GPIO_PULL_NONE
S3C_GPIO_PULL_DOWN
S3C_GPIO_PULL_UP
5.获取io口的上拉内阻配置
s3c_gpio_pull_ts3c_gpio_getpull(unsignedintpin);
获取单个io的上拉配置状态,会返回一个配置模式
6.设置一组io(包括上拉内阻)
ints3c_gpio_cfgall_range(unsignedintstart,unsignedintnr,unsignedintcfg,s3c_gpio_pull_tpull);
讲了那么多看见最后一个函数不讲也应当能看出究竟是怎样配置了吧
讲了那么多io口的配置方式,来瞧瞧怎样来配置输出的电平状态。
打开linux-3.0.1includelinux下的gpio.h的头文件,发觉上面有很多的引脚函数其中最重要的也就如此几句
1.设置一个引脚的电平状态
staticinlinevoidgpio_set_value(unsignedgpio,intvalue)
第一个参数gpio为指定的引脚,第二个参数value为要设置的高低电平
2.获得一个引脚的电平状态
staticinlineintgpio_get_value(unsignedgpio)
第一个参数为gpio为指定的引脚,会返回一个电平状态
讲了前面那些我们基本能控制一个io了,如今我在介绍一种方式linux端口映射,这些方式只能进行输入和输出不能进行io的复用配置
1.io输出
staticinlineintgpio_direction_output(unsignedgpio,intvalue)
第一个参数gpio为指定的引脚linux服务器配置与管理,第二个参数为电平状态
2.io输入
staticinlineintgpio_direction_input(unsignedgpio)
第一个参数gpio为指定的引脚linux gpio,会返回一个电平状态
出了前面方式外我们还可以直接对gpio的地址访问,linux早已为我们打算了这样的插口函数
#define__raw_readl(a)(__chk_io_ptr(a),*(volatileunsignedint__force*)(a))
#define__raw_writel(v,a)(__chk_io_ptr(a),*(volatileunsignedint__force*)(a)=(v))
其中的a值为
S3C64XX_GPMCON
S3C64XX_GPMPUD
S3C64XX_GPMDAT
在reg-gpio.h中早已有了以上的定义
V为具体的数值。
文章评论