接下来就是接收函数了:
15. GetWaterMarkBit和GetWaterMark
WaterMark存储的实际上是接收中断模式,对应与UFCON的第4,5位:
这两个函数用了s_HighWaterPairs这样一个结构数组来保存对应关系:
GetWaterMarkBit用来获得s_HighWaterPairs的key值,也就是0,1,2,3中的一个,用m_dwWaterMark与这个数组成员的AssociatedValue的比较来获得.
GetWaterMark用来获得s_HighWaterPairs的AssociatedValue值,也就是0,4,8,16中的一个,m_dwWaterMark必须为这4个值中的一个,如不是则取最较小相近的.
16. InitReceive
InitReceive负责初始化串口的数据接收功能. 和InitXmit一样有bool型一个参数,表示初始化还是解除初始化串口接收.
如果为TRUE,则先reset RX FIFO,设置UFCON Tx Trigger Level,写uWarterMarkBit,使能RX FIFO,清除error status,最后使能RX Timeout Interrupt,中断触发方式为level,接收模式为中断请求或轮询.
17.ReceiveInterruptHandler
同XmitInterruptHandler一样还有个处理接收中断的ReceiveInterruptHandler
ReceiveInterruptHandler首先检查buffer的有效性,然后读取UFSTAT获得当前接收FIFO字节数,如满则设置dwNumRxInFifo为16字节,然后从URXH寄存器读取dwNumRxInFifo字节数的数据到接收buffer,在读数据的过程中会调用GetLineStatus获取线路状态,并调用DataReplaced进行判断如果无错误进读数据.
18.CancelReceive
CancelReceive供驱动程序取消串口的数据接收.通过调用InitReceive(TRUE)来重新重新初始化串口,reset FIFO等.
下面再来看看和MODEM相关的部分.
19. InitModem
InitModem初始化串口的MODEM功能.设置UMCON寄存器禁止AFC(Auto Flow Control)和使能RTS(Request To Send).
20. GetModemStatus
GetModemStatus供驱动程序获取串口的MODEM状态. 通过读取UMSTAT寄存器来获取MODEM状态,进行事件通知或报告状态.
21. SetRTS
设置RTS,根据输入参数来使能或禁止RTS.
下面是线路相关处理函数:
22. InitLine
InitLine初始化串口的数据收发属性.这里就是使能或禁止串口ERR中断.
23. GetLineStatus
GetLineStatus用来获取线路状态.读取UERSTAT寄存器来获得错误状态并返回或调用回调事件(Break Receive).
24. SetBreak
SetBreak用来向对端发出一个间断信号(指串口的发送数据引脚上持续一个数据帧事件的低电平).这里通过设置UCON的bit4.
25.SetBaudRate
SetBaudRate设置波特率,调用CReg2410Uart类对象的Write_BaudRate来实现.
26. SetByteSize
SetByteSize设置串口的数据帧中的数据位的位数,设置ULCON寄存器的0,1位来设置.
27. SetParity
SetParity设置传输数据的校验方式(奇偶).通过设置ULCON的3,4,5位来实现.
28.SetStopBits
SetStopBits用来设置停止位.通过设置ULCON的第2位来实现.
29.SetOutputMode
最后还有个IR处理函数SetOutputMode,这个函数有两个bool输入参数,UseIR表示是否启用红外输出模式,Use9Pin表示是否启用9针引脚工作模式.
SetOutputMode首先调用基类的SetOutputMode,然后根据UseIR来设置ULCON的第6位.
这里附上ULCON的具体位的含义:
更多对寄存器的操作请参考s3c2410A的datasheet.
CPdd2410Uart类基本介绍完了,这里介绍的都是需要实现的成员函数,还有些函数在基类CSerialPDD类中实现了,如SetReceiveError和GetReceiveError等.具体内容可以参考cserpdd.c中的CSerialPDD实现.