- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用一 block AT91SAM9G25 板,它有 4 个 PIO Controller ,管理多达 32 条可编程 I/O 线。每个引脚都可配置为通用 I/O 线仅或作为 I/O 线多路复用两个外围 I/O。因此,例如,根据文档(SAM9G25,第 14 页),信号 PC0 可以多路复用,例如通用 I/O 线或 VIDEO_ATMEL_ISI(图像传感器接口(interface)的 ISI)的 ISI_D0 线。
╔════════════╦════════════╦════════════╦════════════╦════════════╗
║ Primary ║ Alternates ║ PeripA ║ PeripB ║ PeripC ║
╠════════════╬════════════╬════════════╬════════════╬════════════╣
║ Signal/Dir ║ Signal/Dir ║ Signal/Dir ║ Signal/Dir ║ Signal/Dir ║
║ --------- ║ --------- ║ --------- ║ --------- ║ --------- ║
║ PC0 / I/O ║ ║ ║ ISI_D0 / I ║ ║
╚════════════╩════════════╩════════════╩════════════╩════════════╝
所有 GPIO 线的复位状态都是方向 IN 和 Pullup 使能。当我通过 sysfs 使用 GPIOLIB 时,由于上拉,我在几个 GPIO 中读取了一个“1”值作为输入。当多个板可以与其他外设复用时,这是否是 GPIO(带上拉电阻的输入)在复位时的正常安全状态?我不知道如何使用 GPIOLIB 通过用户空间禁用上拉。因此,例如,我看到当内核启动时,它会检查图像传感器外围设备是否在内核中启用或作为模块启用,如果是,它将 PC0 设置为外围设备 B。这在/arch/arm/mach 的内核源代码中-at91/at91sam9x5_devices.c
#if defined(CONFIG_VIDEO_ATMEL_ISI) || defined(CONFIG_VIDEO_ATMEL_ISI_MODULE)
....
at91_set_B_periph(AT91_PIN_PC0, 0); /* ISI_D0 */
...
#endif
然后,如果我不在内核中启用 ISI 支持,我可以将 PC0 信号用作 GPIO 线。这是/sys/kernel/debug/gpio:
# cat /sys/kernel/debug/gpio
GPIOs 32-63, A:
GPIOs 64-95, B:
[atmel_usba_udc] GPIOB16: [gpio] set
[d1] GPIOB18: [gpio] clear
GPIOs 96-127, C:
GPIOs 128-159, D:
[ohci_vbus] GPIOD19: [gpio] clear
[ohci_vbus] GPIOD20: [gpio] clear
[d2] GPIOD21: [gpio] set
这是/sys/kernel/debug/at91_gpio
# cat /sys/kernel/debug/at91_gpio
Pin PIOA PIOB PIOC PIOD
0: A A GPIO:1 A
1: A A GPIO:1 A
2: GPIO:1 A GPIO:1 A
3: GPIO:1 A GPIO:1 A
4: GPIO:1 A GPIO:1 GPIO:1
5: GPIO:1 A GPIO:1 GPIO:1
6: GPIO:1 A GPIO:1 A
7: B A GPIO:1 A
8: GPIO:1 GPIO:1 GPIO:1 A
9: A A GPIO:1 A
10: A A GPIO:1 A
11: A GPIO:1 GPIO:1 A
12: A GPIO:1 GPIO:1 A
13: A GPIO:1 GPIO:1 A
14: A GPIO:1 GPIO:1 GPIO:1
15: GPIO:1 GPIO:1 GPIO:1 A
16: GPIO:1 GPIO:1 GPIO:0 A
17: GPIO:1 GPIO:1 GPIO:1 A
18: GPIO:1 GPIO:1 GPIO:1 A
19: GPIO:1 A GPIO:1 GPIO:0
20: GPIO:1 A GPIO:0 GPIO:0
21: GPIO:1 A GPIO:0 GPIO:1
22: GPIO:1 A GPIO:1 A
23: GPIO:1 A GPIO:1 A
24: GPIO:1 A GPIO:1 A
25: GPIO:1 A GPIO:1 A
26: GPIO:1 A GPIO:1 A
27: GPIO:0 A GPIO:1 A
28: GPIO:1 A GPIO:0 A
29: GPIO:1 A GPIO:0 A
30: GPIO:1 A GPIO:1 A
31: GPIO:1 A GPIO:1 A
上面的输出显示 PIOA0 被多路复用到外设 A(TXD0 UART 线),例如 PIOC20 被清除,但是文档说所有处于复位状态的 GPIO 线都是带上拉的输入,我没有找到内核或你在哪里-boot 禁用此 GPIO 的上拉(如果没有触摸他的寄存器,GPIO 可能会保持其状态?)
但他的主要问题是,如何清除 GPIO 线的上拉寄存器?我在内核源代码中发现/arch/arm/mach-at91/at91sam9x5_devices.c 使用了在 linux-2.6.39/arch/arm/mach-at91/gpio.c 中实现的这个函数。
/*
* enable/disable the pull-down.
* If pull-up already enabled while calling the function, we disable it.
*/
int __init_or_module at91_set_pulldown(unsigned pin, int is_on)
{
void __iomem *pio = pin_to_controller(pin);
unsigned mask = pin_to_mask(pin);
if (!pio || !cpu_has_pio3())
return -EINVAL;
/* Disable pull-up anyway */
__raw_writel(mask, pio + PIO_PUDR);
__raw_writel(mask, pio + (is_on ? PIO_PPDER : PIO_PPDDR));
return 0;
}
EXPORT_SYMBOL(at91_set_pulldown);
头文件 arch/arm/mach-at91/include/mach/gpio.h
#ifndef __ASSEMBLY__
/* setup setup routines, called from board init or driver probe() */
.....
extern int __init_or_module at91_set_pulldown(unsigned pin, int is_on);
.....
#endif /* __ASSEMBLY__ */
如何在我的工具链中使用这个函数,或者我应该制作一个内核模块吗?
谢谢
PD:抱歉我的英语有任何错误,我知道我需要改进它。
最佳答案
也许你可以不用管上拉。我在 OMAP SoC 上使用过 GPIO,在最低级别有类似的引脚多路复用选项,但没有必要担心上拉。通常无论是什么驱动它都能吸收足够的电流(这是EE/电路的观点,如果你不熟悉也不用担心)。 float 输入可能是随机且麻烦的;拉高应该没问题。
我认为您不需要制作内核模块。我建议您尝试使用现有的用户模式界面。您的内核应该已经连接了低级驱动程序以提供通过 sysfs 的访问。引用sysfs , omap gpio .我认为我在 sysfs 中没有看到上拉选项。如果您得到了一些工作并且需要从 C 代码调用它,那么您可以寻找 API,或者只使用 system()。
关于linux - 启用上拉 GPIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411746/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
Linux 管道可以缓冲多少数据?这是可配置的吗? 如果管道的两端在同一个进程中,但线程不同,这会有什么不同吗? 请注意:这个“同一个进程,两个线程”的问题是理论上的边栏,真正的问题是关于缓冲的。 最
我找到了here [最后一页] 一种有趣的通过 Linux 启动 Linux 的方法。不幸的是,它只是被提及,我在网上找不到任何有用的链接。那么有人听说过一种避免引导加载程序而使用 Linux 的方法
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我试图了解 ld-linux.so 如何在 Linux 上解析对版本化符号的引用。我有以下文件: 测试.c: void f(); int main() { f(); } a.c 和 b.c:
与 RetroPie 的工作原理类似,我可以使用 Linux 应用程序作为我的桌面环境吗?我实际上并不需要像实际桌面和安装应用程序这样的东西。我只需要一种干净简单的方法来在 RaspberryPi 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
有什么方法可以覆盖现有的源代码,我应该用 PyQt、PyGTK、Java 等从头开始构建吗? 最佳答案 如果您指的是软件本身而不是它所连接的存储库,那么自定义应用程序的方法就是 fork 项目。据我所
我的情况是:我在一个磁盘上安装了两个 linux。我将第一个安装在/dev/sda1 中,然后在/dev/sda2 中安装第二个然后我运行第一个系统,我写了一个脚本来在第一个系统运行时更新它。
我在 i2c-0 总线上使用地址为 0x3f 的系统监视器设备。该设备在设备树中配置有 pmbus 驱动程序。 问题是,加载 linux 内核时,这个“Sysmon”设备没有供电。因此,当我在总线 0
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正试图在 linux 模块中分配一大块内存,而 kalloc 做不到。 我知道唯一的方法是使用 alloc_bootmem(unsigned long size) 但我只能从 linux 内核而不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有 .sh 文件来运行应用程序。在该文件中,我想动态设置服务器名称,而不是每次都配置。 我尝试了以下方法,它在 CentOS 中运行良好。 nohup /voip/java/jdk1.8.0_71/
我是在 Linux 上开发嵌入式 C++ 程序的新手。我有我的 Debian 操作系统,我在其中开发和编译了我的 C++ 项目(一个简单的控制台进程)。 我想将我的应用程序放到另一个 Debian 操
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我使用4.19.78版本的稳定内核,我想找到带有企鹅二进制数据的C数组。系统启动时显示。我需要在哪里搜索该内容? 我在 include/linux/linux_logo.h 文件中只找到了一些 Log
我知道可以使用 gdb 的服务器模式远程调试代码,我知道可以调试针对另一种架构交叉编译的代码,但是是否可以更进一步,从远程调试 Linux 应用程序OS X 使用 gdbserver? 最佳答案 当然
是否有任何可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的是在另一台机器上重建它,但假设我们唯一能得到的是一个二进制文件,那么这可能与否? (我知道这可能并不容易,但我只是
我是一名优秀的程序员,十分优秀!