设置 GPIO Bank 复用模式

设置 GPIO Bank 复用模式

我正在使用一台 ARM 机器,该机器在 GPIO 引脚 102 上连接了一个蜂鸣器。该机器运行的是 Linux 2.6,因此我们有一个连接到 /sys/class/gpio 中引脚的 sysfs 接口。当我第一次尝试让蜂鸣器工作时,我尝试了如下操作:

# cd /sys/class/gpio
# echo 102 > export
# cd gpio102
# echo out > direction
# echo 1 > value

令我沮丧的是,机器没有发出任何噪音。然而,在检查为 WinCE 编写的蜂鸣器驱动程序的源代码时,我注意到 GPIO 多路复用器应该设置为某种模式。我不太擅长软件领域之外的东西,所以我仍然不确定这意味着什么。然而,由于我获得了用于在机器上启动 Linux 的 U-Boot 版本的源代码,因此我可以通过将这行代码添加到板的头文件 ( u-boot/board/somecompany/someboard/someboard.h) 来编辑它以设置 GPIO 组模式:

MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));

我重新编译了引导加载程序,将其复制过来,重新启动机器,然后重新运行上面的测试,它成功了!我以为我已经完成了我的任务。然而,我被告知我的做法可能并不安全,因为 GPIO 库可能用于其他驱动程序。当我挂载 debugfs 并检查时/sys/kernel/debug/gpio,确实显示 GPIO 组中的其他 GPIO 引脚正在用于驱动程序。

然后我尝试了一种不同的方法 - 由于蜂鸣声在启动时最重要,我决定尝试向引导加载程序添加一些代码以发出蜂鸣声:

MUX_VAL(CP(CCDC_DATA3), (IDIS | PTD | DIS | M4));

if(!gpio_request(102, "buzzer")){
    gpio_direction_output(102, 1);
    udelay (500000);
    gpio_direction_output(102, 0);
}

MUX_VAL(CP(CCDC_DATA3), (IEN  | PTD | DIS | M0));

这是可行的,因为引导加载程序是单线程的,因此它不必争夺 GPIO 组。最后一行将 GPIO 组多路复用模式重置为之前在代码中设置的方式。

这确实在引导加载程序执行期间成功发出蜂鸣声,据我所知,它不会干扰任何驱动程序,因为 GPIO 组已恢复到所需的状态。但是,它并不像我想要的那么有用,因为引导加载程序序列期间的蜂鸣声并不一定表明完全引导成功。相反,如果我可以从 Linux 内部访问蜂鸣器,以指示成功启动或其他事件,那就更好了。但是,我没有找到有关在 Linux 中设置 GPIO 组复用器模式的文档。因此,我的问题如下:

有没有办法从内核空间设置 GPIO 组的多路复用模式?

相关内容