Linux kernel 在beaglebone black上的内核模块运行时更改pin模式

Linux kernel 在beaglebone black上的内核模块运行时更改pin模式,linux-kernel,kernel-module,beagleboneblack,Linux Kernel,Kernel Module,Beagleboneblack,我正在尝试编写一个内核模块,该模块在运行时控制UART1RX&TX引脚,将其模式更改为GPIO,发送一些命令(使用位串),并将其模式更改回UART 现在,有没有办法在beaglebone black上的内核模块运行时更改pin模式?我尝试直接访问控制模块,但没有返回错误,但是,似乎没有写入任何内容 #define CONTROL_MODULE_START 0x44E10000 // CONTROL_MODULE starting address in memory #define

我正在尝试编写一个内核模块,该模块在运行时控制UART1RX&TX引脚,将其模式更改为GPIO,发送一些命令(使用位串),并将其模式更改回UART

现在,有没有办法在beaglebone black上的内核模块运行时更改pin模式?我尝试直接访问控制模块,但没有返回错误,但是,似乎没有写入任何内容

#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子系统(请参阅),但我不知道如何与之交互

关于如何在运行时更改骨骼上的pin模式或获得对控制模块的写入权限,有何想法

编辑:我正在使用稍微调整过的(更好的rt性能)4.1.15-bone-rt-r17内核和BeagleBoard.org Debian Image 2015-03-01

您可以使用“linux/gpio.h”头文件。Derek Molloy的一个示例代码是。此代码很简单,
gpio\U请求
gpio\U方向
输入或
gpio\U方向
命令可根据需要执行,您可以更改引脚方向,而无需直接更改控制模块寄存器

关于

您可以使用“linux/gpio.h”头文件。Derek Molloy的一个示例代码是。此代码很简单,
gpio\U请求
gpio\U方向
输入或
gpio\U方向
命令可根据需要执行,您可以更改引脚方向,而无需直接更改控制模块寄存器

在debugfs(/sys/kernel/debug)中,有用的pinctrl有一个特殊的(不稳定的)接口。因此,我建议使用它。有用的pinctrl在debugfs(/sys/kernel/debug)中有一个特殊的(不稳定的)接口。因此,我建议使用它。