我正在尝试编写一个内核模块,它将UART1 RX和TX引脚控制为运行时,将其模式更改为GPIO,发送一些命令(使用bitbanging)并将其模式更改回UART。
现在,有没有办法在运行时在beaglebone black上的内核模块中更改引脚模式?我尝试直接访问CONTROL_MODULE,但没有返回错误,但似乎没有写出任何内容。
#define CONTROL_MODULE_START 0x44E10000 // CONTROL_MODULE starting address in memory
#define CONTROL_MODULE_END 0x44E11FFF // CONTROL_MODULE end address in memory
#define CONTROL_MODULE_SIZE (CONTROL_MODULE_END - CONTROL_MODULE_START)
#define GPIO1_17_OFFSET 0x844 // control offset for GPIO1_17
#define GPIO3_19_OFFSET 0x9a4 // control offset for GPIO3_19
.
.
.
if (!(control_module = ioremap(CONTROL_MODULE_START, CONTROL_MODULE_SIZE))) {
printk(KERN_ERR "UARTbitbangModule: unable to map control module\n");
return -1;
}
// set both GPIOs to mode 7, input enabled
value = 0x7;
iowrite32(value, control_module + GPIO1_17_OFFSET);
iowrite32(value, control_module + GPIO3_19_OFFSET);
printk(KERN_INFO "UARTbitbangModule: mode GPIO1_17: %d\n", control_module[GPIO1_17_OFFSET]);
printk(KERN_INFO "UARTbitbangModule: mode GPIO3_19: %d\n", control_module[GPIO3_19_OFFSET]);
相应的dmesg输出如下所示:
[22637.953610] UARTbitbangModule: mode GPIO1_17: 0
[22637.960000] UARTbitbangModule: mode GPIO3_19: 0
我还考虑过直接使用pinctrl子系统(参见https://www.kernel.org/doc/Documentation/pinctrl.txt),但我无法理解如何与它进行交互。
有关如何在运行时更改骨骼上的引脚模式或获得对控制模块的写入权限的任何想法吗?
编辑:我正在使用稍微调整(更好的rt性能)4.1.15-bone-rt-r17内核和BeagleBoard.org Debian Image 2015-03-01
答案 0 :(得分:0)
你可以使用" linux / gpio.h"头文件。 Derek Molloy的示例代码是here。此代码很简单,gpio_request
和gpio_direction_input
或gpio_direction_output
命令可以满足您的需要,您可以更改引脚方向而无需直接更改CONTROL_MODULE寄存器。
此致