PowerPC852T的SMC初始化—串口通信

作者:水煮鱼
时间:2007-5-4 夜
版权申明:本文为水煮鱼为水煮鱼@Donews撰写,不得用于商业用途,如需摘用,请与水煮鱼联系。
1、背景介绍
在VxWorks 中,一般对于硬件的初始化是在函数sysHwInit中完成的,这其中包括了串口的初始化(串口的初始化是在sysHwInit函数中调用 sysSerialHwInit来实现),当安装了串口驱动后,才能通过串口打印信息,方便进行系统的调试。在从系统上电启动到串口初始化能打印信息中间有很长一段时间相当于处于了调试的盲区,尤其在rominit.s中进行的一些简单检测,都无法通过串口打印的信息,以及时有效而方便的发现硬件的故障。目前常常采用的方法是通过程序控制调试灯的闪动,以进行程序的调试。该种方法的不方便之处不言自明。一般对于在rominit.s中都会用汇编提供一些简单的串口的初始化和串口输出功能。我们这里讲的PowerPC的SMC的初始化也是基于这样一种目的。这仅仅是我在项目中一些经验的总结,不能算是独创。
2、PowerPC852T与其他系列的PowerPC的CPU之间的区别
PowerPC8** 系列的CPU在飞思卡尔的产品系统中属于PowerQUICC™系列,这一系列的CPU集成了桥片的功能,因此在使用中可以不用提供额外的桥片支持。在7 系列的PowerPPC中需要提供桥片,与之常搭配使用的是64360,64364,或者107.因此串口常常采用额外的串口芯片,常用的串口芯片:     由于在菲利浦的串口芯片中,对于发送,提供了THR(Transmit Hold Register),即如果要发送数据,可以是通过将内存中的数据读取到THR,然后芯片自动发送的,并且数据发送完后,会将其某Ready置0,表示数据发送完毕。数据接受类同。
PowerPC8**,以852T的CPU为例,其提供了SMC或者SCC以支持串口功能。SMC提供的功能比SCC 要简单一些,常常可以对SMC进行配置以支持一些调试。SMC没有通过BD的方式进行串口通信数据的管理。简而言之就是通过描述符的方式指明了发送数据缓冲区的地址,属性和一些状态标记。
因此初始化的时候,主要就是对BD进行初始化,在发送或者接收数据的时候,则是通过BD去控制或者获取数据。
3、PowerPC852T的SMC的初始化
主要的初始化步骤如下:
使能端口->设置波特率发生器->连接端口和波特率发生器->初始化BD->选择串口传输协议(一般采用UART)->使能发送和接收
4、串口数据输出流程
获取输出数据首地址->访问TxBD,获取发送缓冲地址->将数据写入发送缓冲->置BD中的R位为1,通知CPU数据准备好->查询BD的R位置是否被清零,如果清零说明发送完毕,取下一地址数据,否则等待。
5、在PPC汇编中的实现
说明:由于写该代码的时候,手上没有PPC汇编的资料,所以可能下述的一些指令有用错的地方。编程思想按照第三和第四节为准。如果需要和我交流,可以通过邮件与我联系。
SMC初始化:
.set r23 DataEnd
bl  COM_INIT
/*存储器地址定义*/
.long   ************************
/*寄存器的值*/
.long  ************************
……………..
.long DataEnd
/*串口初始化*/
COM_INIT:
         mfspr  r3,8     
COM_LOOP:     
         lwz      r4,0(r3)     /*r4保存寄存器地址*/  
         sync
         eieio
COM_CMP:
         cmp   0,0,r4,r23
         bnz     COM_END
         lwz      r5,4(r3)     /*r5保存寄存器的配置数据*/
         sync
         eieio
        stw      r4,r5
         sync
         eieio
        addi    r4,r4,4    /*取下一条*/
        b     COM_LOOP
COMEND:   
串口输出函数:(假设r9用于串口输出数据保存,r0保存0)
COM_OUTPUT:
          mfspr r3, 8
COM_OUT_LOOP:
          lbz   r9,r3
          li   r4, *******     /*保存BD的地址*/
          lwz  r5,(4)r4        /*取发送缓冲区地址*/
          lwz   r6,0(r4)      /*取状态字*/
         stb    r5,r9
         ori  r6,r60×8000    /*置位状态字中的R位*/
         stb    r6,0(r4)
COM_OUT_WAIT:
         lbz   r6,0(r4)
         andi  r6,r6,0×8000
          cmp 0,0,r6,r0
         bnz    COM_OUT_WAIT
         addi  r3,r3,1
         b   COM_OUT_LOOP

原文地址:https://www.cnblogs.com/shuizhuyu/p/1071451.html