本文共 1471 字,大约阅读时间需要 4 分钟。
在 Linux 系统中,TTY(伪终端)与 UART(通用异步串接接口)之间存在着密切的关联。TTY 可以看作是一个虚拟设备,它为用户提供了类似于真实终端的功能,而 UART 则是实现实际数据传输的物理或逻辑设备。在 Eagle2/imx 平台中,我们定义了五个串口设备,分别对应设备 ID 0 到 4。
在 driver/tty/serial/imx.c 中,我们定义了 uart_driver,其名称为 ttymxc。通过调用 uart_driver_register 函数,我们可以注册一个 UART 驱动。由于 drv->nr 被定义为 8,因此我们分配了 8 个 uart_state 存储空间给 drv->state。接下来,我们对 uart_driver 中的 tty_driver 进行初始化,并调用 tty_register_driver 函数进行注册。
为了实现 UART 端口与驱动的绑定,我们调用 uart_add_one_port 函数。这个函数不仅完成了 UART 设备的添加,还通过 uart_state 将 UART 端口与驱动绑定。具体来说,我们利用设备 ID 作为 uart_state 数组的索引,分配存储空间给对应的 UART 端口。由于我们需要添加五个 UART 设备,该函数被调用五次,分别为设备 ID 0 到 4。
在 UART 设备中,以下三个数据结构是尤为重要的:
在 Eagle2/imx 系统中,我们通过 uart_add_one_port 函数创建了五个 UART 设备结点,分别对应设备号 0 到 4。这些设备结点的名称为 ttymxc0 到 ttymxc4,位于 /dev 目录下。
用户的数据首先经过系统调用到达内核。数据到达分配好的线路规程后,在 tty 线路规程中会经过格式化处理。我们通过 tty_struct 结构体将 tty_driver 与 tty_ldisc 联系起来。具体来说,tty_struct 中包含了 index 字段,用于索引对应的 uart_status。
在 tty_driver 中,我们需要实现 tty_open 和 tty_close 等接口函数,以控制设备的打开和关闭。tty_write 函数则负责将数据通过 uart_port 传输到硬件寄存器中。
为了支持不同的数据传输协议,我们需要注册线路规程。目前我们主要使用 N_TTY 线路规程,其索引号为 0。对于蓝牙协议,线路规程号为 N_HCI,索引号为 13。我们可以通过以下步骤注册蓝牙线路规程:
tty_register_ldisc(N_HCI, &tty_ldisc_N_HCI);
注册完成后,我们将线路规程分配给 tty_struct,以便与 uart_port 进行通信。
通过上述方法,我们可以在 Linux 系统中实现 UART 驱动的注册与使用。尽管目前我们主要使用 N_TTY 线路规程,但如果有机会,可以尝试将蓝牙协议移植到地层。尽管这项工作具有较高的复杂性,但它可以为我们的系统带来更多可能性。
转载地址:http://ehpfk.baihongyu.com/