作者:水煮鱼
时间: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


评论

该日志第一篇评论

发表评论

评论也有版权!