![设置 GPIO Bank 复用模式](https://linux22.com/image/112628/%E8%AE%BE%E7%BD%AE%20GPIO%20Bank%20%E5%A4%8D%E7%94%A8%E6%A8%A1%E5%BC%8F.png)
我正在使用一台 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 组的多路复用模式?