MPC860的HDLC通道驱动程序的设计与实现
时间:11-20
来源:互联网
点击:
3 驱动程序的设计思想及其实现
这里选择VxWorks作为本CPU板的操作系统。VxWorks是美国风河系统公司推出的一种高性能、可裁减的实时嵌入式操作系统,以其良好的可靠性和卓越的实时性被广泛应用于通信、军事、航天等领域。因此,程序的设计必须按照这个操作系统的结构来构建。本文的主要目的是将MPC860处理器的一个SCC通道配置成为HDLC模式,以支持VxWorks操作系统下的HDLC通信,所以程序的设计主要围绕这个目的进行,在此并没有按照传统驱动的模式构建驱动程序,而是直接对硬件进行操作。首先设置通道参数,将其配置成HDLC模式,然后设计基本功能函数。当驱动程序运行时,首先要进行SCC通道的初始化以及存储区的初始化,然后才开始执行收发功能,在这当中要加上中断控制。按照这个程序的基本流程,具体的实现分为下面几步(在本设计中将SCC2配置成HDLC模式)。
参数RAM主要包括通道参数RAM和通道协议参数RAM两部分,SCC通道的主要参数都在这个里面配置。它们包含CPM RISC用来正确操作SCC通道的特定协议所用的信息。
3.2 初始化SCC2
(1)将MPC860的PA12、PA13引脚作为SCC2的收发引脚。
(2)MPC860有四个BGR和八个外部时钟引脚,将SCC的收发时钟分别配置成内部时钟和外部时钟。
(3)将SCC2配置为NMSI模式。
(4)初始化SDCR寄存器,给予SDMA一个仲裁ID以提供U总线上的优先级。
(5)初始化SCC2的参数RAM(这步对所有的协议都是通用的):
①设置Rx/TxBD 表的基址相对于双端口RAM的偏移量;
②设置收发缓冲区描述符表基址相对于IMMR寄存器中值的偏移量;
③设置Rx/Tx 的函数代码;
④在MRBLR中设置接收缓存的最大空间。
(6)针对SCC2的HDLC模式进行初始化;
①通过C_MASK和C_PRES 设置CCITT-CRC;
②对CPM维护的五个计数器DISFC、CRCEC、 ABTSC、 NMARC和RETRC清零;
③在MFLR中定义最大帧长度,通常定义为0x0100,表示最大帧长度为256字节;
④在RFTHR中定义接收到多少个HDLC帧时产生一个中断申请,当将RFTHR置位0x0001时,表示每接收到一个帧产生一个中断申请;
⑤设置接收地址,hmask用来定义地址掩码,当hmsk=0x0000时,表示接收所有帧。
每个SCC有四个地址存储器HADDR1~HADDR4,所以每个SCC可识别四个地址,包括广播地址。接收时,通过与HDLC帧的目的地址进行比较,确定接收该帧还是丢弃。
3.3 初始化收发缓存区描述符
(1)在初始化缓存区描述符的过程中,收发都必须停止。通过将GSMR_L2的ENT和ENR置零,然后配置CPCR中的CP命令就可以禁止收发。
(2)配置收发缓存区描述符:
①配置当前接收缓存区描述符表的基地址,即IMMR的基地址再加上收发缓存区描述符表相对于IMMR的偏移地址。由于发送缓存区描述符表紧跟在接收缓存区描述符表的后面,因此发送缓存区描述符表的基地址为接收缓存区描述符表的基地址加上整个接收缓存区描述符表的长度。
②初始化发送缓存区描述符表和接收缓存区描述符表。如果收发缓存区都为空,分别将每一个发送缓存区描述符表和接收缓存区描述符表的状态模式参数中的状态位E置1、数据长度置0,
并将它们的地址设置成相应的值。如果收缓存区或发缓存区不为空,则应该先将这些缓存区清零。值得注意的是,最后一个收发缓存区描述符表的W位必须置1。
(3)初始化完成后,应该将ENT和ENR位置
3.4 收发功能的实现
3.4.1 接收函数
SMR_L2寄存器的ENR位置1的前提下,HDLC控制器进入接收允许状态。在正式读入数据前,必须先检测帧开始标志,并匹配地址,然后决定是否进入接收状态。进入接收状态后,首先提取RxBD的状态模式字节,若接收未准备好,则继续等待,若准备好了,则开始接收。由于一个数据包可以放置于多个缓存,所以检测RxBD状态模式字节的L位,以判断是否为本帧的最后一个缓存:如果不是,则关闭这个缓存,处理下一个缓存描述字;如果是,接收完最后一个缓存的数据后结束接收过程。对于最后一个buffer,需要检测是否有接收错误。
3.4.2 发送函数
发送函数流程图如图4所示。
在GSMR_L2寄存器的ENT位置1的前提下,HDLC控制器进入发送允许状态。首先提取TxBD的状态模式字节,若发送未准备好,则继续等待,若准备好了,则进入发送状态,在发送数据中间插入适当的标志位后就可以发送。由于一个发送数据包可以包含多个缓存,所以检测TxBD状态模式字节的L位,以判断是否为最后一个缓存:如果不是,则关闭这个缓存,处理下一个缓存描述字;如果是,控制器进入关闭发送状态。对于最后一个buffer,需要做两件事情:(1)检测是否有发送错误。(2)以剩下的实际数据长度作为发送帧中数据段的长度发送出去。
这里选择VxWorks作为本CPU板的操作系统。VxWorks是美国风河系统公司推出的一种高性能、可裁减的实时嵌入式操作系统,以其良好的可靠性和卓越的实时性被广泛应用于通信、军事、航天等领域。因此,程序的设计必须按照这个操作系统的结构来构建。本文的主要目的是将MPC860处理器的一个SCC通道配置成为HDLC模式,以支持VxWorks操作系统下的HDLC通信,所以程序的设计主要围绕这个目的进行,在此并没有按照传统驱动的模式构建驱动程序,而是直接对硬件进行操作。首先设置通道参数,将其配置成HDLC模式,然后设计基本功能函数。当驱动程序运行时,首先要进行SCC通道的初始化以及存储区的初始化,然后才开始执行收发功能,在这当中要加上中断控制。按照这个程序的基本流程,具体的实现分为下面几步(在本设计中将SCC2配置成HDLC模式)。
3.1 定义参数RAM
参数RAM主要包括通道参数RAM和通道协议参数RAM两部分,SCC通道的主要参数都在这个里面配置。它们包含CPM RISC用来正确操作SCC通道的特定协议所用的信息。
3.2 初始化SCC2
(1)将MPC860的PA12、PA13引脚作为SCC2的收发引脚。
(2)MPC860有四个BGR和八个外部时钟引脚,将SCC的收发时钟分别配置成内部时钟和外部时钟。
(3)将SCC2配置为NMSI模式。
(4)初始化SDCR寄存器,给予SDMA一个仲裁ID以提供U总线上的优先级。
(5)初始化SCC2的参数RAM(这步对所有的协议都是通用的):
①设置Rx/TxBD 表的基址相对于双端口RAM的偏移量;
②设置收发缓冲区描述符表基址相对于IMMR寄存器中值的偏移量;
③设置Rx/Tx 的函数代码;
④在MRBLR中设置接收缓存的最大空间。
(6)针对SCC2的HDLC模式进行初始化;
①通过C_MASK和C_PRES 设置CCITT-CRC;
②对CPM维护的五个计数器DISFC、CRCEC、 ABTSC、 NMARC和RETRC清零;
③在MFLR中定义最大帧长度,通常定义为0x0100,表示最大帧长度为256字节;
④在RFTHR中定义接收到多少个HDLC帧时产生一个中断申请,当将RFTHR置位0x0001时,表示每接收到一个帧产生一个中断申请;
⑤设置接收地址,hmask用来定义地址掩码,当hmsk=0x0000时,表示接收所有帧。
每个SCC有四个地址存储器HADDR1~HADDR4,所以每个SCC可识别四个地址,包括广播地址。接收时,通过与HDLC帧的目的地址进行比较,确定接收该帧还是丢弃。
3.3 初始化收发缓存区描述符
(1)在初始化缓存区描述符的过程中,收发都必须停止。通过将GSMR_L2的ENT和ENR置零,然后配置CPCR中的CP命令就可以禁止收发。
(2)配置收发缓存区描述符:
①配置当前接收缓存区描述符表的基地址,即IMMR的基地址再加上收发缓存区描述符表相对于IMMR的偏移地址。由于发送缓存区描述符表紧跟在接收缓存区描述符表的后面,因此发送缓存区描述符表的基地址为接收缓存区描述符表的基地址加上整个接收缓存区描述符表的长度。
②初始化发送缓存区描述符表和接收缓存区描述符表。如果收发缓存区都为空,分别将每一个发送缓存区描述符表和接收缓存区描述符表的状态模式参数中的状态位E置1、数据长度置0,
并将它们的地址设置成相应的值。如果收缓存区或发缓存区不为空,则应该先将这些缓存区清零。值得注意的是,最后一个收发缓存区描述符表的W位必须置1。
(3)初始化完成后,应该将ENT和ENR位置
3.4 收发功能的实现
3.4.1 接收函数
SMR_L2寄存器的ENR位置1的前提下,HDLC控制器进入接收允许状态。在正式读入数据前,必须先检测帧开始标志,并匹配地址,然后决定是否进入接收状态。进入接收状态后,首先提取RxBD的状态模式字节,若接收未准备好,则继续等待,若准备好了,则开始接收。由于一个数据包可以放置于多个缓存,所以检测RxBD状态模式字节的L位,以判断是否为本帧的最后一个缓存:如果不是,则关闭这个缓存,处理下一个缓存描述字;如果是,接收完最后一个缓存的数据后结束接收过程。对于最后一个buffer,需要检测是否有接收错误。
3.4.2 发送函数
发送函数流程图如图4所示。
在GSMR_L2寄存器的ENT位置1的前提下,HDLC控制器进入发送允许状态。首先提取TxBD的状态模式字节,若发送未准备好,则继续等待,若准备好了,则进入发送状态,在发送数据中间插入适当的标志位后就可以发送。由于一个发送数据包可以包含多个缓存,所以检测TxBD状态模式字节的L位,以判断是否为最后一个缓存:如果不是,则关闭这个缓存,处理下一个缓存描述字;如果是,控制器进入关闭发送状态。对于最后一个buffer,需要做两件事情:(1)检测是否有发送错误。(2)以剩下的实际数据长度作为发送帧中数据段的长度发送出去。
- 蓝牙无线电调制解调器Siw1701原理与应用(02-19)
- 嵌入式移动数据库的关键技术(03-20)
- 在嵌入式SQL中怎样使用游标(08-12)
- 嵌入式Linux系统软件开发学习思路详细介绍 (08-20)
- 基于AVR单片机的嵌入式“瘦服务器”系统设计思想(03-11)
- 嵌入式系统设计中的存储碎片收集策略(05-04)