首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用GPIO驱动程序控制来自不同设备的驱动程序的引脚?

如何使用GPIO驱动程序控制来自不同设备的驱动程序的引脚?
EN

Stack Overflow用户
提问于 2020-08-12 13:52:22
回答 1查看 581关注 0票数 1

我正在试验linux设备驱动程序。我正试图为我的笔记本电脑开发一个OV2680驱动程序,联想Miix510。在该平台上,传感器位于INT3472芯片后面,访问驱动程序需要控制INT3472的GPIO引脚。INT3472有司机,还有一个相应的MFD驱动器,它没有开箱即用,但我已经修改好了(我的笔记本电脑的ACPI表没有为INT3472定义I2cSerialBus2,所以我只需要添加一个ic2_device_id表,用echo INT3472 0x48 | sudo tee /sys/bus/i2c/devices/i2c-7/new_device创建i2c设备--这就创建了一个gpiochip1,它在GPIO驱动程序中定义了10个GPIO通道,所以它似乎正在工作。)

我可以使用libgpiod提供的工具在终端中设置和获取这些引脚的值。例如,sudo gpioset gpiochip1 1 1将1号车道设置得很高。

我的问题是:在我的相机驱动程序中,控制INT3472提供的10个GPIO引脚的正确方法是什么?我需要,例如,能够拉一个引脚低/高触发相机的软件待机。我想很明显的答案是“使用libgpiod",但是如果是这样的话,我如何识别/dev中正确的”/dev“文件来打开,因为我的笔记本中有两个in 3470加上主gpiochip0。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-17 21:21:03

我想我找到了正确的方法,这里。简而言之,您可以在相机驱动程序中将GPIO引脚映射到设备上(作为.probe函数的一部分):

代码语言:javascript
复制
    static struct gpiod_lookup_table ov2680_gpios = {
        .dev_id = "i2c-OVTI2680:00",
        .table = {
            GPIO_LOOKUP_IDX("tps68470-gpio", 7, "s_enable", 0, GPIO_ACTIVE_HIGH),
            GPIO_LOOKUP_IDX("tps68470-gpio", 8, "s_idle", 0, GPIO_ACTIVE_HIGH),
            GPIO_LOOKUP_IDX("tps68470-gpio", 9, "s_resetn", 0, GPIO_ACTIVE_HIGH),
            { },
        },
    };

    gpiod_add_lookup_table(&ov2680_gpios);

.dev_id成员与设备名称匹配。GPIO_LOOKUP_IDX是一个宏,它接受GPIO芯片的标签(tps6847-GPIO),芯片中引脚的索引(由PMIC的GPIO驱动程序这里提供),加上函数名、函数中的索引和一些标志。一旦建立了查找表,就可以在gpiod_add_lookup_table()中注册。一旦完成,您可以使用gpiod_get...获取引脚

代码语言:javascript
复制
/* ov2680 is a struct ov2680_device containing, amongst other things... */
struct ov2680_device {
    gpio_desc            *s_enable;
    struct i2c_device    *client;
}; 

ov2680->s_idle = gpiod_get_index(&ov2680->client->dev, "s_idle", 0, GPIOD_OUT_HIGH);

我认为这是正确的,但我将把这个开放一段时间,以防出现更好的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63378019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档