Linux GPIO 使用说明


一、GPIO是什么?

GPIO 是 General-purpose input/output 的简写,意为通用的IO口,使用方法主要如下,一般情况下包含有如下的功能:

1. 电平输出功能,可以输出高电平和低电平。
2. 输入功能,可以作为输入口,用来检测外部电平。
3. 中断功能,可以作为中断口,配置后用来响应外部输入的中断的信号,用来触发对应的中断服务,一般包括:电平中断、边沿触发等。
4. 其他可复用的功能。

二、Linux 系统的GPIO控制代码在哪里?

标准头文件

<linux/gpio.h> <asm-generic/gpio.h>

实现文件为

<driver/gpio/gpiolib.c>

三、如何使用GPIO口?

1. GPIO的定义和获取GPIO号

1) GPIO的定义都是在dts文件中,类似以下的方式定义

    gpio_sensor_ctl {
        compatible = "sensor_ctl";
        sensor_ctl_io = <&gpio1 GPIO_B2 GPIO_ACTIVE_HIGH>;
        status = "okay";
    };
    

其中 sensor_ctl_io = <&gpio1 GPIO_B2 GPIO_ACTIVE_HIGH>; 行,为GPIO的定义。

2) 代码内获取GPIO口,代码如下:

   unsigned sensor_ctl_io;
   struct device_node *sensor_np = pdev->dev.of_node;
   unsigned long irq_flags;
   sensor_ctl_io = of_get_named_gpio_flags(sensor_np, "sensor_ctl_io", 0, &irq_flags);
   

其中sensor_ctl_io即获取到GPIO号,函数原型为:

   int of_get_named_gpio_flags(struct device_node *np, const char *propname,
                               int index, enum of_gpio_flags *flags);   
   

注意:要根据名字获取对应的GPIO号,还有匹配驱动的compatible值,此部分本文略过不说,下次说明。

2. 申请,释放GPIO,配置GPIO方向和电压

1) 申请GPIO

gpio_request(gpio_num, "xx gpio");  //申请GPIO, 返回0为申请成功,否则失败。

2) 配置GPIO方向

int gpio_direction_input(unsigned gpio);//设置为输入
   int gpio_direction_output(unsigned gpio, int value);//设置为输出,并初始化值为value.
   

3) 输入时,获取GPIO的值

int gpio_get_value(unsigned gpio);//返回value
   int gpio_get_value_cansleep(unsigned gpio);//输入端口:返回零或非零,可能睡眠
   

4) 输出时,配置输出值。

gpio_set_value(unsigned gpio, int value);//设置值
   void gpio_set_value_cansleep(unsigned gpio, int value);//输出端口设置值:可能睡眠
   

5) 释放GPIO

 void gpio_free(unsigned gpio);
   

6) 检查GPIO口是否有效

 int gpio_is_valid(int number);//检测此gpio口是否有效
   

7) GPIO作为中断使用,只有做为输入脚的GPIO才能做为中断脚,将GPIO配置成中断按照如下方式:

 gpio_to_irq(unsigned gpio);

uboot 编译出现 Error: You must add new CONFIG options using Kconfig 解决方法



[现象]

UBoot 编译时出现:

Error: You must add new CONFIG options using Kconfig The following new ad-hoc CONFIG options were detected:

[方法] 修改其中一个即可

1. 增加对应的值到

u-boot\scripts\config_whitelist.txt

2. 注释掉顶层 Makefile 中下面几句:

quiet_cmd_cfgcheck = CFGCHK  $2
cmd_cfgcheck = $(srctree)/scripts/check-config.sh $2 \
		$(srctree)/scripts/config_whitelist.txt $(srctree)

改成:

#quiet_cmd_cfgcheck = CFGCHK  $2
#cmd_cfgcheck = $(srctree)/scripts/check-config.sh $2 \
#		$(srctree)/scripts/config_whitelist.txt $(srctree)

3. 修改 Error 为 Warning 防止编译中断

diff --git a/scripts/check-config.sh b/scripts/check-config.sh
index 6618dfb..9d2cfc6 100755
--- a/scripts/check-config.sh
+++ b/scripts/check-config.sh
@@ -37,14 +37,13 @@  cat `find ${srctree} -name "Kconfig*"` |sed -n \
 	-e 's/^menuconfig \([A-Za-z0-9_]*\).*$/CONFIG_\1/p' |sort |uniq > ${ok}
 comm -23 ${suspects} ${ok} >${new_adhoc}
 if [ -s ${new_adhoc} ]; then
-	echo "Error: You must add new CONFIG options using Kconfig"
+	echo "Warning: You must add new CONFIG options using Kconfig"
 	echo "The following new ad-hoc CONFIG options were detected:"
 	cat ${new_adhoc}
 	echo
 	echo "Please add these via Kconfig instead. Find a suitable Kconfig"
 	echo "file and add a 'config' or 'menuconfig' option."
 	# Don't delete the temporary files in case they are useful
-	exit 1
 else
 	rm ${suspects} ${ok} ${new_adhoc}
 fi

格科微[GalaxyCore]摄像头成像方向调节方法


GalaxyCore 系列摄像头采用逐行扫描的方式将阵列产生的信号依次输入到模拟信号处理模块中。最开始的行为 0 行。在默认寄存器设置下,Sensor 的阵列数据输出顺序为从下到上,从左到右。GalaxyCore 系列摄像头可通过寄存器控制扫描顺序,实现镜像/垂直翻转。
继续阅读“格科微[GalaxyCore]摄像头成像方向调节方法”

MTK摄像头Android驱动新版本升级指南


MTK摄像头的驱动包含有kernel部分和hal层2个部分,在Android版本升级之后,内核版本也进行了升级,在旧版本往新版本移植的过程中,要注意以下几个部分:

继续阅读“MTK摄像头Android驱动新版本升级指南”

MTK 平台如何在 user 版本打开串口打印信息



串口打印作为常用的调试方法,在解决系统死机和各种设备问题时十分有效,通常是在eng版本的时候才有完整的打印信息,若是在量产阶段或者 user 版本时没有串口通常无法有效分析问题。
因此,在user版本中打开打印,作为分析问题的方法十分有效,下面记录一下 MTK 平台在 user 版本打开串口打印信息的2种方法:
继续阅读“MTK 平台如何在 user 版本打开串口打印信息”