一直习惯使用gpio_request来申请一个GPIO,然后用gpio_direction_input、gpio_direction_output等函数来配置对应的GPIO,用gpio_free来释放申请。后来看到别人也会用gpio_request_one来申请和配置一个GPIO,然后就去看看看这个接口的实现,发现这个函数就是对一个GPIO的申请和配置的组合而已。但是看到这个函数最终还会释放GPIO,就有点不解了。刚配置好怎么就释放了呢?那配置还怎么生效?
今天早上骑自行车从某条路经过,人行道上有个妹子,而我只是不经意瞥了一眼。艾玛,差点把我从自行车上震下来。穿裙子的妹子整个屁屁都走光了
。。。浑圆的两瓣沐浴在清晨的阳光下,伴随着高跟鞋的节奏从我眼前飘过。那一刻,时间仿佛停止,空气仿佛凝固。。。。。突然,我的脑子里出现了一个关键字:gpio_request_one
!!!
遥远的天边传来一个空洞却深邃的声音:。。。。这个函数的功能就是申请并配置GPIO一次,然后别人想复用用的时候还能重新申请。而为什么要释放的原因有两点:1.
释放了,别人才能复用啊!2.
释放一个GPIO并不会导致先前对这个GPIO的配置失效。也就是你先前配置为输出拉高,当你释放后它还是输出拉高的,除非别人重新申请并重新配置这个GPIO后,该GPIO的状态才会改变!。。。。。
当这个闪光结束后我回到现实一看,雪白的两瓣已经离我远去,只留下红色的背影映衬着若隐若现的一点白或者两点白。。。。。
我想,是否该追上妹子提醒一下:Hi,姐姐(这是个三十岁以上的妹子),你把裙子夹进内裤了!
* gpio_request_one -
request a single GPIO with initial configuration
* @gpio: the GPIO
number
* @flags: GPIO
configuration as specified by GPIOF_*
* @label: a literal
description string of this GPIO
int gpio_request_one(unsigned gpio, unsigned
long flags, const char *label)
{
struct gpio_desc *desc;
int err;
desc = gpio_to_desc(gpio);
err = gpiod_request(desc, label);
if (err)
return err;
if (flags & GPIOF_OPEN_DRAIN)
set_bit(FLAG_OPEN_DRAIN,
&desc->flags);
if (flags & GPIOF_OPEN_SOURCE)
set_bit(FLAG_OPEN_SOURCE,
&desc->flags);
if (flags & GPIOF_DIR_IN)
err = gpiod_direction_input(desc);
else
err = gpiod_direction_output(desc,
(flags & GPIOF_INIT_HIGH) ? 1 :
0);
if (err)
goto free_gpio;
if (flags & GPIOF_EXPORT) {
err = gpiod_export(desc, flags &
GPIOF_EXPORT_CHANGEABLE);
if (err)
goto free_gpio;
}
return 0;
free_gpio:
gpiod_free(desc);
return err;
}
EXPORT_SYMBOL_GPL(gpio_request_one);