【驱动】02.GPIO子系统
【嵌入式八股】一、语言篇https://www.nowcoder.com/creation/manager/columnDetail/mwQPeM
【嵌入式八股】二、计算机基础篇https://www.nowcoder.com/creation/manager/columnDetail/Mg5Lym
【嵌入式八股】三、硬件篇https://www.nowcoder.com/creation/manager/columnDetail/MRVDlM
【嵌入式八股】四、嵌入式Linux篇(本专栏)https://www.nowcoder.com/creation/manager/columnDetail/MQ2bb0
GPIO子系统
硬件原理
GPIO名为"General Purpose Input/Output",通用目的输入/输出,就是常用的引脚。
芯片内部有很多引脚,这些引脚可以接到GPIO模块,也可以接到I2C等模块。
通过Pinctrl子系统来选择引脚的功能(mux function)、配置引脚:
当一个引脚被复用为GPIO功能时,我们可以去设置它的方向、设置/读取它的值。
一般的寄存器有pin模式选择
使能、时钟
方向,输入输出
电平高低
设置、清除寄存器
应用编程
导出/设置方向/读写值
在sysfs中访问GPIO,实际上用的就是引脚号,老的方法。
a. 先确定某个GPIO Controller的基准引脚号(base number),再计算出某个引脚的号码。
方法如下:
① 先在开发板的/sys/class/gpio目录下,找到各个gpiochipXXX目录:
② 然后进入某个gpiochip目录,查看文件label的内容
③ 根据label的内容对比设备树
label内容来自设备树,比如它的寄存器基地址。用来跟设备树(dtsi文件)比较,就可以知道这对应哪一个GPIO Controller。
内核驱动
具体应用时的驱动
a. 引脚配置为GPIO功能,使用Pinctrl子系统
b. 在设备树里指定GPIO引脚(某一组GPIO 哪一个引脚 属性) gpios=<&gpio1 2 GPIO_ACTIVE_LOW>
c. 在驱动代码中:驱动代码中要注册一个platform_driver,在probe函数中:获得引脚、注册file_operations。
在file_operations中:使用GPIO子系统的标准函数获得GPIO、设置GPIO方向、读取/设置GPIO值。
获得GPIO | |
gpiod_get | gpio_request |
gpiod_get_index | |
gpiod_get_arra |
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
查阅整理上千份嵌入式面经,将相关资料汇集于此,主要包括: 0.简历面试 1.语言篇 2.计算机基础 3.硬件篇 4.嵌入式Linux【本专栏】 (建议PC端查看)