BCM5836 是Broadcom公司的一款32位MIPS嵌入式处理器,主要用于Broadcom生产的ROBO系列交换芯片的功能控制以及作为一些无线网络应用的处 理器。以下在这篇文章中涉及的内容限于作者曾经在一款switch的开发过程中积累的经验以及对项目的回顾,而并非完整的介绍这款处理器,但内容已基本可 以满足一般开发者的需求。内容基本按照BCM5836的每个core的顺序介绍,其中穿插了相关core之间的联系以及开发的注意事项和侧重点等,希望能 够对开发人员有所帮助。现在就开始我们的BCM5836(下称5836)之旅。
首先概要的介绍一下5836的基本特征和组成:
i.集成了用户可配置的400DMIPS/264MHz MIPS32 core(2-way set associative 16KB I-cache 和 16KB D-cache, MMU with a 32-entry TLB)
ii.2个 10/100 Ethernet MAC
iii.V.92 codec interface
iv.PCI2.3 host interface (允许3个外部PCI设备的PCI总线仲裁,更多的设备可以用外部仲裁)
v.External interface bus(可以为4个设备进行地直解析)
vi.USB1.1 host controller集成2-portUSB hub(在不作为controller的时候可以配置成为USB设备)
根据其组成以及处理器必要的功能划分出以下功能模块,5836多数称其为core,包括: USB core,10/100 Ethernet core, Codec core, IPSec core(BCM5836P), PCI core, Chipcommon core, MIPS Processor core 以及DMA Processor和Memory Controller。如下图所示为5836的框图:
5836的各个功能模块是通过系统背板(System Backplane)连接到一起的。他们之间通过OCP(Open Core Protocal)接口来进行通信。
顺便指出,5836是应用BCM这种OCP背板总线结构的系列处理器中的一款,这些处理器都有着一些相似的架构,例如:地址空间的划分(下面我们会详细讨论),中断和错误的处理机制和背板的寄存器定义等等。
5836系统背板的地址划分
在5836MIPS体系结构中,几乎所有的片上资源都集中在4GB地址空间的开头512MB范围内,这样用户软件就可以有很大的灵活性分别在MIPS地址空间4段地址的任意一段访问这些资源。
下面比较详细的说一下每个区域的作用:
0x0000_0000—0x07FF_FFFF:这128M是分配给SDRAM的区域,并且是non-swapped,即在访问的时候不对数据进行大小端转换(这里说的是硬件提供的转换功能)
0x0800_0000—0x0FFF_FFFF:这128M是进行PCI操作的窗口,后面讲到PCI core的时候会详细讨论这段地址的使用
0x1000_0000 —0x17FF_FFFF:这同样是分配给SDRAM的地址空间,并且和前面non-swapped映射同一片内存区域,只不过在访问这段地址空间时硬件 要对数据进行大小端的转换,这样的特点在进行某些DMA操作或者需要字节顺序转换的应用的时候是非常有帮助的
0x1800_0000—0x1800_8FFF:这段地址是5836为他的8个core分配的各自配置及控制寄存器的空间,5836称其为Enumeration Space。每个core占有4KB的地址段,每个地址段包含大量的配置信息和控制信息,在后面的部分会有针对性地详细介绍,这也是这篇文章的精华所在
0x1800_9000—0x19FF_FFFF:保留部分,BCM用来进行内部扩展
0x1A00_0000—0x1BFF_FFFF:
0x1C00_0000—0x1DFF_FFFF:32MB的flash地址空间
0x1FC0_0000—0x1FFF_FFFF:4MB flash地址空间,这段空间映射到前面32MB flash地址空间的最后4MB,用于bootrom的寻址,这是因为5836的reset向量的前缀是0xBFCx_xxxx亦即0x1FCx_xxxx而不是0x1Cxx_xxxx
0x4000_0000—0x7FFF_FFFF:更大范围的PCI地址空间,后面会详细介绍
0x8000_0000—0x9FFF_FFFF:更大范围的512MB SDRAM空间,当系统物理内存超过128MB的时候可以用这段空间进行扩展,原来那段non-swapped 128MB的地址空间实际上映射在这段空间的开始128MB
#关于5836背板(System Backplane)空间和PCI空间#
5836背 板空间是MIPS体系结构定义的MIPS CPU识别的地址空间,在MIPS作为一个PCI设备的同时在它之外还存在一个PCI空间。MIPS CPU就像一个盒子,在它内部各个core包括MIPS processor core只能看到背板空间的地址划分,即在BP(Backplane)上面传输的地址都应该是前面提到的地址划分的地址。但是当MIPS和外界“沟通”的 时候一,例如作为host对其他PCI设备进行配置或者访问他们的寄存器的时候,他的内部地址对于PCI设备来说是不被识别和承认的,这是由MIPS到外 部的过程;又例如当其他PCI设备要对系统主存进行访问的时候(DMA操作),PCI设备提供的地址又是MIPS所不识别的,这是由MIPS外部到内部的 过程。这样就要有一个沟通的窗口,它的作用就是实现内外“互通”,而对于PCI架构的系统来说,MIPS CPU的PCI core 实现了这个功能,这点我们会在后面详细讨论。
5836各个core的公共属性
前面提到,5836每个core在其背板空间的enumeration space都占有4KB内部寄存器空间,而这些寄存器保存了各个core的控制和状态信息,其中是有一些公共的部分称作Core Configuration Space Registers,是在每个core的enumeration space 中由固定offset 0xE00开始的256个bytes,这当中的寄存器有的用来识别每个core,有的用来控制clock和reset、建立仲裁机制、控制中断和错误信息。下面介绍一下这些寄存器当中比较重要的几个:
SBIPSFlag(0xF08):这是在开发过程中最重要的寄存器之一,在所有的core当中只有MIPS、PCI、PCMCIA core的这个寄存器有真正含义。对于PCMCIA core来说距离我们的实际开发比较远,所以不加讨论;对于PCI core来说,我们在后面会有更详细的讨论;跟我们关系最密切也是实际开发中一定要考虑到的就是该寄存器在MIPS core中的应用,这时它的作用是控制并决定可以把哪些core的中断提交给MIPS core(为什么要提交给MIPS core呢?因为在这里,只有MIPS core可以handle interrupt,或者说接收interrupt,这是通常大部分情况,但并不是说在所有情况下只能由MIPS core处理中断,其他core 在提交中断时只是把中断信号送到BP上,至于谁来接收由系统设计决定,而在这里就是MIPS core),并且以怎样的方式映射到MIPS interrupt 1-4(这里只能同时控制4路中断,分别对应MIPS 体系中的硬件中断1-4)。下面说一下该寄存器的设定:
SBTPSFlag(0xF18):这里面的0-5bit 指示了这个core对应的“号码”,这个号码对应前面说到的SBIPSFlag和后面要介绍的SBIntVec。号码表如下:
号码
0
1
2
3
4
5
6
7
SBIntVec(0xF94):前面提到了,SBIPSFlag只能同时处理4路中断,那么其他core的中断怎么处理呢。这个寄存器就是把其他不能放在SBIPSFlag的中断统一合并为一路中断送到MIPS硬件中端0(MIPS硬件中断有0-5六路中断)。该寄存器的0-7bit分别对应5836的8个core,设定的时候被set的bit所对应的core产生的中断会就被送往MIPS硬件中断0。
Bit
0
1
2
3
4
5
6
7
SBIDHigh(0xFFC):这个寄存器比较有特点,包含了一些有用的信息,例如:0-3bit包含了该core的revision NO. ;4-15bit指示了core的类型(PCI core、USB core、10/100Ethernet MAC等等);16-31bit是BCM的vendor ID 0x4243。
#关于5836的中断机制#
一般来说 5836的中断最终会统一交由MIPS Processor Core(下称MIPS core)来处理,其间经由几级中断,为什么这样说呢?我们以一个PCI设备产生一个中断的过程来说明(这样该是一个比较有代表性的过程):首先一级是 PCI设备本身,他会有一个IntMask,在对应中断使能的情况下并且设备中断产生时(可能不只一个中断,但是最终该设备只会有一个中断输出),该中断 会送至PCI总线的Host那里,在我们的系统中就是5836;然后是第二级,5836和PCI总线的窗口只有一个,那就是PCI core(或面会详细讨论这个至关重要的模块),PCI core向外部PCI设备提供了两个中断输入分别是PCI_INT_0和PCI_INT_1(至于两个输入怎么连接要看系统设计),与之对应的是PCI core enumeration space中的IntMask (0x024)由他来控制外部PCI中断是否可以进入PCI core,正常情况下这个Mask要打开以保证中断响应;下一级中断控制就是我们上面提到的有中断处理能力的core----MIPS core中的SBIPSFlag和SBIntVec,这两个寄存器控制5836各个core产生的中断是否可以提交到处理器进行处理以及如何与MIPS的 0-5六路硬件中断进行映射,这些前面已经介绍的比较详细,这里就不再赘述。要提到的是我们前面介绍的两级中断处理都是以PCI core为例,而到这一级中断处理8个core的关系是并列的;最后一级中断控制是MIPS CP0(协处理器0),在CP0的status寄存器中有控制,具体一点说是IM [0-7],即status寄存器的8-15位,其中10-15位对应硬件中断的0-5,8-9位对应两个软中断,这里说的硬件中断即对应前面提到 SBIPSFlag和SBIntVec涉及的硬件中断,今当这些中断使能的时候中断才会被提交到处理器。在CP0的status寄存器的第0位是CP0总 的中断使能位,前面的IM使能的时候只有这一位置1中断才可以正常相应并处理。(关于详细的CP0的设置是MIPS 4Kc比较共同的地方,可以参照MIPS user manual) 这里还有一个比较特殊的中断控制,在我们的开发过程中,或者说在我们目前的架构(5836作为PCI host的架构)中,他不作为一级中断控制,下面对其简要地说明一下,以免再实际开发中引起误会。BCM5836 的PCI core一般情况下会被看作多个funtion的集合,这一点和大部分PCI设备一样(可以参照PCI2.3标准),在这里PCI core有4个function,通常我们只会用到function0,同样是在PCI core的enumeration space中有function0的寄存器空间(0x400-0x4FF),其中有PCI IntMask寄存器,它控制PCI core是否可以响应中断,而中断源来自5836的所有8个core,默认reset情况下PCI core本身是被使能的,其他core在这时被禁止中断。作者理解这里的中断控制是当5836不作为PCI host的时候,他的所有core产生的中断就要经由PCI core送往PCI总线上真正有中断处理能力的部件进行处理,而不是再由5836自己来处理,这时的PCI core的function中的IntMask控制哪些中断可以由PCI core响应并输出。