通过嵌入式板上的驱动器控制USART RTS引脚

时间:2019-07-09 09:41:25

标签: linux-device-driver uart

我正在移植lirc_serial kernel module以便在我们的嵌入式板上工作。我们只需要实现红外发射器功能。

仅对于发送器,定制驱动程序仅需要从模块内部控制/dev/ttyS0上Rem引脚。

在标准硬件上,驱动程序加载:

00:05: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A

新方法

我还没有弄清楚如何停用当前的串行端口驱动程序,因此,除了创建新的驱动程序之外,您将如何使用当前的 8250-dw 驱动程序来更改RTS引脚。代表我的内核模块?像这样吗?

Driver stack

根据这篇关于滑动驱动程序的文章使用行规看起来很有希望,只需使用 slip.c 并删除代码的网络端。但是它需要一个用户空间程序(slattachdip)来打开 / dev / ttyS0 并激活线路规程。

在内核模块中是否可行(或好主意)?

From https://www.linux.it/~rubini/docs/serial/serial.html

在这个类似的问题中,How do I open/write/read a uart device from a kernel module?Ian Abbott建议将serdev向后移植到内核4.9。

有点麻烦,我们已经落后于计划了。有没有更简单的方法?

原始问题

但是,嵌入式板(基于BayTrail Atom E3845)在内存映射的I / O中具有串行端口控制器:

80860F0A:00: ttyS0 at MMIO 0x90a0c000 (irq = 39, base_baud = 2764800) is a 16550A
80860F0A:01: ttyS1 at MMIO 0x90a0e000 (irq = 40, base_baud = 2764800) is a 16550A

我是驱动程序开发的新手。我猜0x90a0c000是控制器的物理地址吗?

要探测模块,我首先使用0x90a0c000ioremap_nocache映射到虚拟地址,然后尝试使用request_mem_region保留内存。失败了。

ioVirtBase = ioremap_nocache(iommap, 8);

TQTRACE("ecp_serial_probe: devm_ioremap for MMIO 0x%X returned 0x%X\n", (uint32_t)iommap, (uint32_t)ioVirtBase);
if (ioVirtBase != NULL)
{
    tqDumpBuffer(ioVirtBase, 8);
}

tqRes = request_mem_region((uint32_t)ioVirtBase, 8, ECP_DRIVER_NAME);
TQTRACE("ecp_serial_probe: request_mem_region for 0x%X returned 0x%X\n", (uint32_t)ioVirtBase, (uint32_t)tqRes);
if (!tqRes)
{
    TQTRACE("ecp_serial_probe: Cannot request memory at 0x%X\n", (uint32_t)iommap);
    return -ENXIO;
}

这是功能的正确顺序吗?

此外,似乎request_mem_region失败,因为设备受80860F0A的控制? lsmod中没有这样的条目,但是/sys/devices中有一个条目。

我需要卸载该驱动程序来控制USART吗?怎么样?

# ls -l  /sys/devices/platform/80860F0A\:00
lrwxrwxrwx 1 root root    0 Jul  8 23:30 driver -> ../../../bus/platform/drivers/dw-apb-uart
-rw-r--r-- 1 root root 4096 Jul  9 17:02 driver_override
lrwxrwxrwx 1 root root    0 Jul  9 17:14 firmware_node -> ../../LNXSYSTM:00/LNXSYBUS:00/80860F0A:00
-r--r--r-- 1 root root 4096 Jul  9 17:02 modalias
drwxr-xr-x 2 root root    0 Jul  9 17:02 power
lrwxrwxrwx 1 root root    0 Jul  8 23:30 subsystem -> ../../../bus/platform
drwxr-xr-x 3 root root    0 Jul  8 23:30 tty
-rw-r--r-- 1 root root 4096 Jul  9 17:02 uevent
drwxr-xr-x 3 root root    0 Jul  8 23:30 VCOM0001:00

dmesg输出如下。在重新映射的虚拟地址上转储数据不一致。有时全为0xFF,其他时间为00 00 00 00 41 02 1C 48。我也不明白...

MARK Tue Jul 9 17:45:35 SGT 2019
ecp_serial: ecp_serial_exit_module()
Spectre V2 : System may be vulnerable to spectre v2
ecp_serial: loading module not compiled with retpoline compiler.
ecp_serial: ecp_serial_init_module()
ecp_serial: ecp_serial_init()
ecp_serial: ecp_serial_probe() iommap=0x90A0C000
ecp_serial: ecp_serial_probe: devm_ioremap for MMIO 0x90A0C000 returned 0xE3296000
ecp_serial: Dump address 0xE3296000:
      00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 
0000  FF FF FF FF FF FF FF FF 
ecp_serial: ecp_serial_probe: request_mem_region for 0xE3296000 returned 0x0
ecp_serial: ecp_serial_probe: Cannot request memory at 0x90A0C000
platform ecp_serial.0: lirc_dev: driver ecp_serial registered at minor = 0

MARK Tue Jul 9 17:46:08 SGT 2019
ecp_serial: ecp_serial_exit_module()
Spectre V2 : System may be vulnerable to spectre v2
ecp_serial: loading module not compiled with retpoline compiler.
ecp_serial: ecp_serial_init_module()
ecp_serial: ecp_serial_init()
ecp_serial: ecp_serial_probe() iommap=0x90A0C000
ecp_serial: ecp_serial_probe: devm_ioremap for MMIO 0x90A0C000 returned 0xE32A2000
ecp_serial: Dump address 0xE32A2000:
      00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 
0000  00 00 00 00 41 02 1C 48 
ecp_serial: ecp_serial_probe: request_mem_region for 0xE32A2000 returned 0x0
ecp_serial: ecp_serial_probe: Cannot request memory at 0x90A0C000
platform ecp_serial.0: lirc_dev: driver ecp_serial registered at minor = 0

proc / iomem怎么说

90a0c000-90a0cfff : 80860F0A:00
90a0e000-90a0efff : 80860F0A:01

所以确实,该内存在另一个驱动程序的控制下...但是如果lsmod中未列出该内存,如何卸载呢?

# rmmod 80860F0A:00
ERROR: Module 80860F0A:00 does not exist in /proc/modules
# rmmod 80860F0A
ERROR: Module 80860F0A does not exist in /proc/modules

操作系统信息

# uname -a
Linux ecp 4.4.127-1.el6.elrepo.i686 #1 SMP Sun Apr 8 09:44:43 EDT 2018 i686 i686 i386 GNU/Linux
# cat /etc/centos-release
CentOS release 6.6 (Final)

0 个答案:

没有答案