失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > android gpio驱动实例 Android/Linux 驱动层对GPIO口的操作方法和相关代码

android gpio驱动实例 Android/Linux 驱动层对GPIO口的操作方法和相关代码

时间:2023-01-26 19:31:06

相关推荐

android gpio驱动实例 Android/Linux 驱动层对GPIO口的操作方法和相关代码

实例:

unsigned int otg_en_pin=952; ----->高通的gpio的基础值为902,这里我们时间的gpio为50,即这里定义值是要设置为952。

//young.yang add began

ret=gpio_request(otg_en_pin, "otg_en_pin"); ------>注册gpio,获得并占有gpio的使用权

if(ret){

printk("[young]:otg_en_pin request fail!!!!n");

}

gpio_direction_output(otg_en_pin, 1); ------>设置gpio的输入/输出状态,并指定初始输出值。

printk("[young]: otg_en_pin value = %dn",gpio_get_value(otg_en_pin));

//young.yang add end

查看gpio的工作状态:

在adb shell下查看如下目录

/sys/kernel/debug

cat gpio

下面为linux下gpio的常规操作函数:

Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现。

#include

int gpio_request(unsigned gpio, const char *label);

获得并占有 GPIO port 的使用权,由参数 gpio 指定具体 port。非空的label指针有助于诊断。主要告诉内核这块地址被占用了。当其他地方调用同一地址的gpio_request就会报告错误,该地址已经被申请。在/proc/mem有地址占用表描述。先申请在访问的好处是避免资源竞争。

void gpio_free(unsigned gpio);

释放 GPIO port 的使用权,由参数 gpio 指定具体 port。

int gpio_direction_input(unsigned gpio);

将 GPIO port(由参数 gpio 指定)设为输入。

int gpio_direction_output(unsigned gpio, int value);

将 GPIO port(由参数 gpio 指定)设为输出,并指定输出电平值(value)。

int gpio_get_value(unsigned gpio);

获得 GPIO port 上的电平值并返回。

void gpio_set_value(unsigned gpio, int value);

设置 GPIO port 上的电平。

int gpio_to_irq(unsigned gpio);

通过获得 gpio port 对应的 irq number。

int gpio_cansleep(unsigned gpio)

这个主要区分是挂载在外部总线上的GPIO控制器,还是内部的GPIO控制器。因为外部总线上的GPIO控制器可以休眠,所以用这个来区分是否是扩展的GPIO,返回1是扩展的GPIO,0的话就是内部的GPIO。

int gpio_get_value_cansleep(unsigned gpio);

void gpio_set_value_cansleep(unsigned gpio, int value);

这些都是对可以休眠扩展的gpio的操作

static inline int gpio_is_valid(int number) 判断GPIO是否有效,有效返回0

int gpio_export(unsigned gpio, booldirection_may_change);

void gpio_unexport();

//在 /sys/class/gpio/下面创建和取消对应的gpio号

int gpio_export_link(struct device *dev, const char *name, unsigned gpio)

//创建到导出GPIO的 sysfs link ,第一个参数是在哪个dev下创建,第二个是参数名字,第三个是gpio编号

Linux中的IO使用方法

应该是新版本内核才有的方法。

请参考:./Documentation/gpio.txt文件

提供的API:

驱动需要包含 #include

判断一个IO是否合法:int gpio_is_valid(int number);

设置GPIO的方向,如果是输出同时设置电平:

/* set as input or output, returning 0 or negative errno */

int gpio_direction_input(unsigned gpio);

int gpio_direction_output(unsigned gpio, int value);

获取输入引脚的电平:

/* GPIO INPUT: return zero or nonzero */

int gpio_get_value(unsigned gpio);

/* GPIO OUTPUT */

void gpio_set_value(unsigned gpio, int value);

int gpio_cansleep(unsigned gpio);

To access such GPIOs, a different set of accessors is defined:

/* GPIO INPUT: return zero or nonzero, might sleep */

int gpio_get_value_cansleep(unsigned gpio);

/* GPIO OUTPUT, might sleep */

void gpio_set_value_cansleep(unsigned gpio, int value);

获取一个GPIO并声明标签:

/* request GPIO, returning 0 or negative errno.

* non-null labels may be useful for diagnostics.

*/

int gpio_request(unsigned gpio, const char *label);

/* release previously-claimed GPIO */

void gpio_free(unsigned gpio);

将GPIO映射为IRQ中断:

/* map GPIO numbers to IRQ numbers */

int gpio_to_irq(unsigned gpio);

/* map IRQ numbers to GPIO numbers (avoid using this) */

int irq_to_gpio(unsigned irq);

设置GPIO IRQ中断类型:

if (!sw->both_edges) {

if (gpio_get_value(sw->gpio))

set_irq_type(gpio_to_irq(sw->gpio), IRQ_TYPE_EDGE_FALLING);

else

set_irq_type(gpio_to_irq(sw->gpio), IRQ_TYPE_EDGE_RISING);

在驱动中使用延时函数mdelay,需要包含文件。

如果觉得《android gpio驱动实例 Android/Linux 驱动层对GPIO口的操作方法和相关代码》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。