linux驱动学习(六)之GPIO

需要板子一起学习的可以这里购买(含资料):点击跳转

一、GPIO

GPIO是嵌入式平台中典型硬件模块,并且是通用和独立的模块,所以在linux内核中对GPIO进行封装,提供一套标准的GPIO接口函数来使用——API接口。该标准接口函数无硬件平台无关,例如:A8,A9,A53,都可以使用一套标准的API接口,linux内核源码不需要准备三套接口。

二、GPIO函数

#include <linux/gpio.h>

//申请GPIO

#include <linux/gpio.h>
1、申请GPIO
//申请
int gpio_request(unsigned gpio, const char *label);
参数说明:unsigned gpio  --- GPIO口
	     const char *label ---- GPIO口的名字

//释放
void gpio_free(unsigned gpio);

2、设置为输入或者输出
//设置GPIO为输入
int gpio_direction_input(unsigned gpio);

//设置GPIO为输出,value是输出的默认值
int gpio_direction_output(unsigned gpio, int value);

3、给GPIO设置值或者读值
//得到GPIO的值
int gpio_get_value(unsigned gpio);

//给GPIO设置值
void gpio_set_value(unsigned gpio, int value);

三、配置

GPIO口跟硬件平台有关,跟linux内核无关,所以在实现平台框架代码时,要进行配置。

kernel\arch\arm\plat-s5p6818\common\cfg_type.h

 /*  gpio group pad start num. */
enum {
    PAD_GPIO_A      = (0 * 32), //PAD_GPIO_A ---->  GPIOA0
    PAD_GPIO_B      = (1 * 32),
    PAD_GPIO_C      = (2 * 32),
    PAD_GPIO_D      = (3 * 32),
    PAD_GPIO_E      = (4 * 32),
    PAD_GPIO_ALV    = (5 * 32),
};

四、编程

//以D7-GPIOE13为例
//定义Led的结构体,包括管脚和名字
struct gec6818_gpio {
	int gpio;  //GPIO口引脚的编号
	char *name;	  //GPIO口名字
};

//定义Led的管脚和名字  
struct led_gpio d7_gpio;
d7_gpio.gpio = PAD_GPIO_E + 13;
d7_gpio.label = "GPIOE13";

...

//申请GPIO
ret = gpio_request(d7_gpio.gpio,d7_gpio.name);
if(ret < 0)
{
    printk("request  %s error\n",d7_gpio.name);
	ret = -EBUSY;
	goto gpio_request_error;			  
}

//设置GPIO为输出模式
gpio_direction_output(d7_gpio.gpio, 0);

//设置输出值
gpio_set_value(d7_gpio.gpio, 0);

关于GPIO申请出错:

[root@GEC6818 /6818_driver]#insmod led_drv.ko 
[ 1161.387000] gec6818_led_init
[ 1161.389000] request  GPIOE13 error
    insmod: can't insert 'led_drv.ko': Device or resource busy
查看系统现有的驱动---module
[root@GEC6818 /6818_driver]#lsmod ---> 占用该GPIOE13的驱动,并不是以modlue的形式存在,编译进内核(built-in)
[root@GEC6818 /6818_driver]#

解决办法一:粗暴解决办法:在驱动程序申请GPIO口之前,把该GPIO口释放

gpio_free(led_gpios[i].gpio);
ret = gpio_request(led_gpios[i].gpio,led_gpios[i].name);

解决办法二:重新配置内核

1)查看当前的临时配置文件.config
	     CONFIG_LEDS_GPIO=y
2)执行make menuconfig,在弹出的菜单框中,查找LEDS_GPIO
按"/",可以查找配置的信息
│ Symbol: LEDS_GPIO [=y]                                                                                                                                                        │  
│ Type  : tristate                                                                                                                                                              │  
│ Prompt: LED Support for GPIO connected LEDs                                                                                                                                   │  
│   Defined at drivers/leds/Kconfig:149                                                                                                                                         │  
│   Depends on: NEW_LEDS [=y] && LEDS_CLASS [=y] && GENERIC_GPIO [=y]                                                                                                           │  
│   Location:                                                                                                                                                                   │  
│     -> Device Drivers                                                                                                                                                         │  
│       -> LED Support (NEW_LEDS [=y])                                                                                                                                          │  
│         
3)拷贝临时配置文件到具体平台的配置文件
gec@ubuntu:~/6818GEC/kernel$ cp .config arch/arm/configs/GEC6818_defconfig 
4)编译内核
gec@ubuntu:~/6818GEC$ ./mk -k
5)烧写内核镜像到开发板

觉得有帮助的话,打赏一下呗。。

           

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值