1、内核中的GPIO使用(Gpio API in kernel)

1)调用 of_get_named_gpio 从 DTS 节点中获取映射后的 gpio 号

2)调用 gpio_request 向 kernel 申请 gpio 使用。

3)调用 gpio_direction_output / gpio_direction_input 设置输出/输入方向

4)调用 gpio_set_value / gpio_get_value 设置/获取 gpio 值

android 9内核版本 安卓9内核_外部中断


2、Pinctrl API in kernel

1)在 DTS 中定义 pin 的功能

2)调用 devm_pinctrl_get 函数获取 pinctrl 节点。

3)调用 pinctrl_lookup_state 函数获取 pinctrl 节点中定义的 pin 状态 pinctrl_state

4)调用 pinctrl_select_state 函数设置 pin 的状态 pinctrl_state。

android 9内核版本 安卓9内核_android 9内核版本_02


android 9内核版本 安卓9内核_字段_03


3、内核中断管脚的使用(GPIO EINT API in kernel)

在 dts 中定义中断相关信息。

1)调用 of_property_read_u32_array 函数,获取 debounce(包含 gpio 号+debounce 时间(默认设

置为 0))。

2)调用 gpio_set_debounce 函数,设置获取到的 debounce

3)调用 irq_of_parse_and_map 函数,把 gpio 号映射为中断号

4) 调用 request_irq 函数,注册中断函数。

在 在 dts 里定义外部中断的传参表示如下:

interrupt = <0 IRQ_TYPE_EDGE_FALLING 0 0>;

第一个参数表示外部中断的中断号。 第一个参数表示外部中断的中断号。

第二个参数表示中断触发方式。 第二个参数表示中断触发方式。

第二个参数表示 第二个参数表示 GPIO 引脚号。

第四个参数表示管脚复用功能。(用作外部中断时,必须指定成 第四个参数表示管脚复用功能。(用作外部中断时,必须指定成 GPIO mode) )。

android 9内核版本 安卓9内核_外部中断_04


在代码中调用:

android 9内核版本 安卓9内核_上拉_05


4、GPIO在preloader/lk/arm2中使用(GPIO Interface in arm2/lk)

Lk 中可通过 dws 配置。另外,lk 与 arm2 可通过接口设置,如下:

1)将 gpio 配置为普通 gpio,并配置其输入/输出方向

mt_set_gpio_mode(pinnum,0); //将 pinmum 对应的 pin 配置为普通 GPIO.

mt_set_gpio_dir(pinnum,dir) //配置 pinnum 对应的 pin 输入/输出方向(dir :0(输入),1(输出))

2)若 gpio 为输入,获得其输入电平状态

mt_get_gpio_in(pinnum);//配置 pinnum 对应的的输出高电平或低电平。

3)若 gpio 为输出,配置其输出电平

mt_set_gpio_out(pinnum, output);//配置 pinnum 对应的的输出高电平或低电平。

4)配置 gpio 内部上拉、下拉

mt_set_gpio_pull_enable(pinnum,enable); //使能 pinnum 对应 Pin 的 pullup/pulldown

mt_set_gpio_pull_select(pinnum, select); //配置 pinnum 对应的 Pin 默认上拉/下拉

(0:pulldown,1:pullup)

5、使用 DWS 配置 GPIO

用户可以通过使用 DWS 工具配置 Preloader、LK 及 Kernel 的 GPIO 管脚默认功能:

DWS 工具所在目录:vendor\mediatek\proprietary\scripts\dct\DrvGen.exe

Preloader 配置文件所在路径:

vendor\mediatek\proprietary\bootloader\preloader\custom\ac8257_demo_1g_32\dct\dct

\codegen.dws

Kernel 配置文件所在路径(以 8257 demo 1g 32bit 平台为例):

kernel-4.9\drivers\misc\mediatek\dws\ac8257\ac8257_demo_1g_32.dws

LK 使用 Kernel 的 DTB 文件对 GPIO 进行初始化。

步骤 步骤 1 :打开 DrvGen.exe 工具,如下图:

android 9内核版本 安卓9内核_外部中断_06


步骤 步骤 2 :加载对应的配置文件后如图

android 9内核版本 安卓9内核_字段_07


步骤 步骤 3 :用户根据需要,配置对应 GPIO 后保存:各属性含义如下:

 ID: GPIO 编号。

 EintMode:是否用于外部中断。

 Def.Mode:下拉选项,默认 GPIO 管脚功能。

 InPull En: 输入上拉使能。

 InPull SelHigh: 勾选表示设置上拉。

 Def.Dir: 设置输入输出方向。

 OutHigh:设置输出值

 VarName1:一般不修改,使用默认。

 SMT#:施密特触发器设置值。

 SMT:施密特触发器使能。

 IES:输入使能。

步骤 步骤 4 :保存后关闭 DrvGen.exe,全编代码。

如何通过节点方式进行 如何通过节点方式进行 GPIO 相关设置/ 测试/
【 问题描述】
如何通过节点方式进行 GPIO 相关设置/测试/查看?
【 解决方案】
adb root
adb shell
cd /sys/devices/platform/1000b000.pinctrl
echo mode pinnum 0 > pin 设置 mode 为 0
echo dir pinnum 1 > pin 设置方向为输出
echo out pinnum 1 > pin 设置输出电平为高
字段 1:PIN:gpio 号
字段 2:DIN:输入值
字段 3:DOUT:输出值
字段 4:DIN:输入值
字段 5:DRIVE:驱动能力
字段 6:SMT:设置滤波,让其缓慢变高或变低
字段 7:IES:设置输入使能
字段 8:PULLEN:上/下拉使能
字段 9:PULL_SEL:上拉/下拉设置