需要板子一起学习的可以这里购买(含资料):点击跳转
一、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)烧写内核镜像到开发板
觉得有帮助的话,打赏一下呗。。