已经被舍弃的方法就不再写了(地址映射)
搭建好设备驱动框架之后,需要对led灯引脚进行初始化,不管什么外设驱动,GPIO驱动基本都是必须的,而pinctrl和gpio子系统又是GPIO驱动所必须的。
pinctrl 子系统主要工作内容如下:
- 获取设备树中 pin 信息。
-
根据获取到的 pin 信息来设置 pin 的复用功能
-
根据获取到的 pin 信息来设置 pin 的电气特性,比如上 / 下拉、速度、驱动能力等。
对于我们使用者来说,我们只需要在设备树里面设置好某个pin的相关属性即可,其他初始化工作均由pinctrl子系统完成,
pinctrl
子系统源码目录为
drivers/pinctrl
。
1、创建对应的节点
2、添加“fsl,pins”属性
3、在“
fsl,pins
”属性中添加
PIN
配置信息
gpio子系统:
只有复用为gpio的时候才可以使用gpio子系统。
cd
-
gpios
= <&
gpio1
19
GPIO_ACTIVE_LOW
>;
属性值一共有三个,“
&gpio1
”表示
CD
引脚所使用的
IO
属于
GPIO1 组,“
19”表示
GPIO1
组的第
19
号
IO,“
GPIO_ACTIVE_LOW
”表示低电平有效.
根据上面的子系统,我们就可以直接从设备树中获取设备的信息,从而实现led的初始化
1,获取设备节点
struct device_node *nd;
nd = of_find_node_by_path("/leds");
2,获取设备树中的gpio属性,并转化成gpio编号
int gpio;
gpip = of_get_named_gpio(nd,"led_gpio",设备树的第i个pin信息);
3,设置为输入或者输出模式
//1 默认为高电平
//输出
ret = gpio_direction_output(gpioled.led_gpio, 1);
//输入
ret = gpio_direction_input(gpioled.led_gpio, 1);
4,设置gpio引脚电平,或者获取引脚电平
gpio_set_value(dev->led_gpio, 0); /* 引脚设置为低电平 */
gpio_get_value(dev->led_gpio) /* 获取引脚的电平 */