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 值
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。
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) )。
在代码中调用:
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 工具,如下图:
步骤 步骤 2 :加载对应的配置文件后如图
步骤 步骤 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:上拉/下拉设置