本文介绍如何编写符合AliOS Things标准的teletype设备(一般用于实现UART或虚拟终端)驱动程序。
在程序中使用本文提及的功能应包含头文件 aos/tty_core.h 。
AliOS Things提供TTY设备的抽象基础结构:
采用结构体嵌套的方式从基础结构派生出具体的硬件结构。派生类型应包含具体硬件操作所需的各种变量。例如:
使用宏aos_container_of实现从基础结构指针到派生结构指针的转换。例如:
AliOS Things提供如下函数用于注册TTY设备:
调用注册函数之前,BSP开发者应自行分配一个aos_tty_t类型或其派生类型的变量并对包含的如下变量赋值:
dev.id:uint32_t类型,表示该设备的ID。不同TTY设备不能拥有相同的ID。ops:const aos_tty_ops_t *类型,指向一组面向硬件的回调函数: flags:uint32_t类型,可包含如下字段,各字段使用按位或运算连接:AOS_TTY_F_UNIQUE_REF:表示该设备只能同时被引用一次。调用注册函数之前,BSP开发者应初始化派生类型中的私有变量,并执行具体硬件相关的注册时初始化工作(例如映射寄存器地址等)。
AliOS Things提供如下函数用于注销TTY设备:
调用此函数之后,BSP开发者可回收相关联的aos_tty_t类型或其派生类型的变量。
驱动程序应实现aos_tty_ops_t定义的一组面向硬件的回调函数。
unregister回调函数在设备注销时被调用,可在该函数中执行具体硬件相关的注销时反初始化工作(例如解除寄存器地址映射等)。
startup回调函数在设备引用计数从0增加到1时被调用,可在该函数中执行具体硬件相关的运行时初始化工作。初始化成功时应返回0;失败时应返回errno(负值)。该函数不应使能硬件发送和接收功能。
startup回调函数可读取tty->termios.c_cflag变量获取设备初始属性并修改硬件状态;也可修改该变量使其反映硬件的实际状态。该变量是tcflag_t类型,可包含如下字段,各字段使用按位或运算连接:
CBAUD,取值必须为以下当中的一个:B50B75B110B134B150B200B300B600B1200B1800B2400B4800B9600B19200B38400B57600B115200B230400B460800B500000B576000B921600B1000000B1152000B1500000B2000000B2500000B3000000B3500000B4000000CSIZE,取值只能为以下当中的一个:CS5CS6CS7CS8CSTOPB:该标志有效时表示停止位为2位,否则为1位。PARENB:表示使能校验位。PARODD:PARENB有效时,若PARODD有效则校验方式为奇校验,否则为偶校验。 shutdown回调函数在设备引用计数从1减小到0时被调用,可在该函数中执行具体硬件相关的运行时反初始化工作。该函数被调用时,硬件发送和接收功能已被禁用。
set_attr回调函数在修改设备属性时被调用,驱动程序应在该函数中根据新属性(存放在tty->termios.c_cflag变量中)修改硬件状态。修改成功后返回0;失败时应返回errno(负值),且驱动程序应将硬件状态恢复到此函数被调用之前的状态。该函数被调用时,硬件发送和接收功能已被禁用。
enable_rx回调函数在使能接收功能时被调用,驱动程序应在该函数中使能硬件的接收功能。该函数无需等待有数据被接收到再返回,而是应该使能接收中断(本设备级别而非中断控制器级别)并立即返回,在硬件中断处理程序中处理后续接收工作。
在中断处理程序中使用aos_tty_rx_buffer_produce将硬件接收到的数据送入设备软件核心层。参数count为硬件接收到的字节数目。驱动程序应在调用该函数之前从FIFO或DMA获取数据并存放到buf指向的空间。返回值为实际送入设备软件核心层的字节数目,在设备软件接收缓冲区已满的情况下返回值会小于count。aos_tty_rx_buffer_produce应在关闭本地CPU中断且tty->lock加锁的环境下调用。例如:
enable_rx回调函数在禁用接收功能时被调用,驱动程序应在该函数中禁用硬件的接收功能。此时FIFO中已接收的数据或DMA正在接收的数据可直接丢弃。
start_tx回调函数在设备软件发送缓冲区由空变为非空时被调用,驱动程序应在该函数中将待发送数据送入FIFO或DMA。该函数无需等待数据全部被硬件发出再返回,而是应该使能发送中断(本设备级别而非中断控制器级别)并立即返回,在硬件中断处理程序中处理后续发送工作。注意start_tx回调函数在关闭本地CPU中断且tty->lock加锁的环境下被调用,请不要在该函数中进行任务调度或执行长耗时的工作。
在start_tx回调函数或中断处理程序中使用aos_tty_tx_buffer_consume从设备软件核心层获取待发送数据。参数count为硬件发送最大字节数,例如FIFO深度或DMA最大长度。待发送数据将被复制到buf指向的空间,驱动程序应将这些数据交给FIFO或DMA。返回值为实际从设备软件核心层获取的字节数目;返回0时说明设备软件发送缓冲区为空,驱动程序应禁用发送中断(本设备级别而非中断控制器级别)。aos_tty_tx_buffer_consume应在关闭本地CPU中断且tty->lock加锁的环境下调用。例如:
disable_tx回调函数在中止发送时被调用,驱动程序应在该函数中中止硬件的发送流程。若此时FIFO中有待发送的数据或DMA正在发送数据,应先等待这些数据发送完成。