龙芯2F便携机主板中断机制研究与实现
2015-11-25张建民张前峰
张建民张前峰
(1.深圳电器公司 技术中心,广东深圳 518000; 2.中国电信股份有限公司 泉州分公司,福建泉州 362000)
龙芯2F便携机主板中断机制研究与实现
张建民1张前峰2
(1.深圳电器公司 技术中心,广东深圳 518000; 2.中国电信股份有限公司 泉州分公司,福建泉州 362000)
龙芯2F处理器是面向桌面和高端嵌入式应用的64位高性能低功耗芯片,可应用于个人计算机、行业终端、工业控制、数据采集、网络安全等领域。通过研究龙芯2F处理器的中断机制,设计了龙芯2F便携机主板外部中断路由,在Linux2.6.36内核中实现了外部中断处理。大量测试表明:龙芯2F处理器能够准确及时地处理外部中断请求,达到了预期的设计目标。
龙芯2F;便携机主板;中断机制
龙芯系列处理器芯片是龙芯中科技术有限公司研发的具有自主知识产权的处理器芯片,产品线包括龙芯1号、龙芯2号和龙芯3号三个系列。龙芯1号系列为32位处理器,主要应用于云终端、工业控制、数据采集、手持终端、网络安全、消费电子等领域。龙芯2号系列是面向桌面和高端嵌入式应用的64位高性能低功耗处理器。龙芯3号系列是面向高性能计算机、服务器和高端桌面应用的64位多核处理器。龙芯系列处理器芯片填补了国产处理器的空白,并在国际处理器市场占有一席之地。
龙芯2F是龙芯2号处理器的第一款产品,采用90纳米CMOS工艺制造,主频可达800 MHz至1 GHz,具有64 KB一级指令缓存、64 KB一级数据缓存、512 KB二级缓存(数据/指令共享),兼容MIPS III指令集,集成了DDR2内存控制器和PCI等接口。龙芯2F在800 MHz主频下功耗小于5W,并且支持动态降频;龙芯2F可用于个人计算机、行业终端、工业控制、数据采集、网络安全等领域。从2008年开始经过多年的商业化推广,龙芯2F的稳定性已得到充分的验证。
本文通过对龙芯2F处理器的中断机制进行研究,提出了龙芯2F便携机主板外部中断路由的设计思路、外部中断处理的实现方法。
1 龙芯2F便携机主板架构
龙芯2F便携机主板采用龙芯2F处理器,搭配电源、复位、时钟电路以及DDR2、BIOS等模块。通过龙芯2F处理器集成的PCI接口,连接显示芯片SM712、南桥芯片AMD CS5536以及千兆以太网芯片RTL8110;通过南桥芯片AMD CS5536提供IDE、USB、音频、LPC等接口;通过LPC接口连接EC芯片WPCE775,用于便携机矩阵键盘及触摸板控制、LVDS背光亮度调节、音量控制、电池充放电、上电时序等控制。
龙芯2F便携机主板兼顾体积、接口等要求,满足了日益增长的低功耗、高性能的应用需求,主板架构如图1所示。
2 龙芯2F处理器的中断机制
计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回到现行程序的间断处,继续执行原程序,这就是“中断”[1]。最初,中断是处理器与外部设备交换信息的一种控制方式,也称为外部中断。随着计算机技术的发展,中断的范围也随之扩大,出现了内部软件中断的概念,它是为解决机器内部运行时出现的异常以及为编程方便而提出的。
在MIPS体系结构中,中断、自陷、系统调用以及其它打断程序正常执行的事件统称为异常,都采用同一种机制来处理[2]。龙芯2F处理器处理某个异常时,状态寄存器的EXL位被置为1,这意味着系统运行在内核模式。在保存了适当的现场状态之后,异常处理程序通常将状态寄存器的KSU字段设定为内核模式,同时将EXL位置回为0。当恢复现场状态并且重新执行时,处理程序则会把KSU字段恢复回上次的值,同时置EXL位为1。当计算机系统启动时(龙芯2F处理器状态寄存器的BEV位为1),异常向量地址位于既不通过Cache进行存取,也无需地址映射的地址空间。当计算机系统正常运行时(龙芯2F处理器状态寄存器的BEV位为0),向量地址位于需要通过Cache进行存取的地址空间。冷重启、热重启和非屏蔽中断的异常向量地址始终为0xFFFFFFFFBFC00000[3]。龙芯2F处理器的异常向量地址表如表1所示。
图1 龙芯2F便携机主板架构图
表1 龙芯2F处理器的异常向量地址表
当CPU内部异常或者外部中断发生时,龙芯2F处理器设置Cause寄存器的Excode域(Excode域用来描述通用异常,共5位,可描述32个异常类型)以及相应的IP位,然后就跳转到通用异常地址入口。在通用异常入口处,操作系统设置了一个通用异常处理程序,它会根据Cause寄存器的Excode域值来索引通用异常处理表,并跳转到异常处理表项对应的处理程序[4],龙芯2F处理器通用异常处理表如表2所示。
龙芯2F处理器支持12个外部中断、1个不可屏蔽中断和3个内部中断。12个外部中断包括4个可配置的GPIO中断信号(GPIO[0]至GPIO[3])、4个PCI中断信号(PCI-INTn[0]至PCI-INTn [3])和4个特殊中断信号(INTn[0]至INTn[3]);龙芯2F处理器的3个内部中断包括1个PCI总线奇偶错信号(PCI-SERR)、1个PCI总线系统错信号(PCI-PERR)和1个DDR2控制器中断信号(DDR2 Controller)。
表2 龙芯2F处理器通用异常处理表
龙芯2F处理器特殊中断信号INTn[0]对应Cause寄存器的IP2、INTn[1]对应Cause寄存器的IP3、INTn[2]对应Cause寄存器的IP4、INTn[3]对应Cause寄存器的IP5;龙芯2F处理器的3个内部中断信号、4个可配置的GPIO中断信号、4个PCI中断信号以及Performance Counter寄存器均对应Cause寄存器的IP6;Timer中断(当Count、Compare寄存器的内容相等时产生Timer中断)对应Cause寄存器的IP7;IP0、IP1保留给软件使用。龙芯2F处理器内部的中断路由如图2所示。
图2 龙芯2F处理器内部的中断路由图
龙芯2F处理器32位的可读写Cause寄存器描述了最近一个异常发生的原因。该寄存器各域如图3所示:
图3 龙芯2F处理器Cause寄存器
Cause寄存器各域的含义如表3所示:
表3 Cause寄存器各域的含义
龙芯2F处理器中断相关控制寄存器Intpol、Intedge、Inten、Intenset、Intenclr都是以位的形式对相应的中断线进行控制,中断控制位连接及属性配置见表4。中断的有效电平由Intpol寄存器设置。中断使能的配置有三个寄存器:Intenset、Intenclr和Inten。Intenset寄存器用于设置中断使能,该寄存器写1的位对应的中断被使能。Intenclr寄存器用于清除中断使能,该寄存器写1的位对应的中断被清除。Inten寄存器用于查看当前各中断使能的情况。脉冲形式的中断信号(如PCI-SERR)由Intedge寄存器来选择,写1表示脉冲触发,写0表示电平触发。中断处理程序可以通过设置Intenclr寄存器的相应位来清除脉冲记录。
表4 龙芯2F处理器中断控制寄存器
3 外部中断路由设计及中断处理实现
3.1 龙芯2F便携机主板外部中断路由设计
根据龙芯2F便携机主板架构,龙芯2F处理器与外设之间的外部中断路由设计为:千兆以太网芯片RTL8110使用PCI-INTn[0]中断信号;显示芯片SM712使用PCI-INTn[1]中断信号;二者均对应Cause寄存器的IP6。南桥芯片AMD CS5536使用INTn[0]中断信号,对应Cause寄存器的IP2;南桥内部集成了兼容Intel8259A的中断控制器,通过级联的方式将IDE、USB、音频、RTC等模块的中断信号、矩阵键盘、触摸板、EC芯片WPCE775的SCI中断信号,路由到龙芯2F处理器的INTn[0]。
3.2 外部中断处理流程
当有外部中断请求时,龙芯2F处理器采集中断信号,跳转至通用异常向地址0xFFFFFFFF 80000180处,通用异常处理程序根据Cause寄存器Excode域值为0来索引通用异常处理表,并跳转到异常处理表项对应的处理程序handle-int。龙芯2F处理器外部中断处理流程如图4所示。
龙芯2F便携机主板外部中断处理流程采用两级判定的方法来实现。第一级判定通过软件查询Cause寄存器的IP位来确定产生哪一类外部中断;判断依据为:IP7(MIPS内部时钟中断Timer);IP6 (北桥设备中断);IP2(南桥设备中断);IP0、IP1(保留给软件使用);其他IP未使用。第二级判定通过软件查询龙芯2F CPU和南桥芯片的中断状态寄存器的各位来确定产生外部中断的设备及其中断号。龙芯2F便携机主板各设备的中断号分配如表5所示。
3.3 外部中断处理的实现
根据上述外部中断处理流程,在Linux2.6.36内核中实现了外部中断处理,其步骤如下: Step1 初始化龙芯2F处理器和南桥芯片中断触发方式及相关的寄存器;
图4 龙芯2F便携机主板外部中断处理流程图
表5 龙芯2F便携机主板各设备中断号分配表
Step2 当有外部中断请求时,龙芯2F处理器采集中断信号,通过查询Cause寄存器的Excode域确定属于哪一类异常,然后跳转至相应的异常处理程序;
Step3 若Cause寄存器的Excode域值为0;则查询Cause寄存器的IP位来确定产生哪一类外部中断;
Step4 查询龙芯2F CPU和南桥芯片的中断状态寄存器的各位来确定产生中断的设备及其中断号;
Step5 调用具体设备的中断服务程序。
现以矩阵键盘中断的处理过程说明以上步骤:
1)用户按下某个键后,键盘控制器产生中断,通过南桥的中断控制器传至龙芯2F处理器的INTn [0]引脚,此引脚引发异常;
2)龙芯2F处理器自动设置Cause寄存器的Excode域值为0、IP2位为1,并跳转至通用异常向量地址0xFFFFFFFF 80000180处;
3)位于通用异常入口处的异常处理程序,会根据Cause寄存器的Excode域值来索引通用异常处理表,并跳转到0号异常处理程序handle-int;
4)0号异常处理程序handle-int根据Cause寄存器的IP位,跳转到南桥中断控制器的中断处理函数i8259-irqdispatch();
5)中断处理函数i8259-irqdispatch()通过读取南桥中断控制器的中断状态寄存器来确定产生外部中断的设备为矩阵键盘,其中断号为1,进而调用do-IRQ()函数进入矩阵键盘的中断处理程序。
4 试验分析
龙芯2F便携机主板调试完成后,对矩阵键盘、SCI、RTC、音频、USB、IDE、触摸板、内部时钟、以太网芯片产生的外部中断进行了大量测试。
测试过程中,在Debian6.0操作系统下(内核版本Linux2.6.36)打开“终端”软件,通过cat/ proc/interrupts命令可查看中断处理情况[5],当上述设备触发外部中断时,该设备对应的中断计数会增加;若中断处理错误,错误计数则增加。测试结果如表6所示。
表6 龙芯2F便携机主板中断处理测试表
以上测试结果表明:龙芯2F处理器能够准确及时地处理外部中断请求,无错误和误动作发生,达到了预期的设计目标。
5 结语
针对龙芯2F便携机主板的外部中断路由设计及其实现方法,结合该主板的架构,分析了龙芯2F处理器的中断机制,设计了该主板的外部中断路由;根据该主板外部中断的处理流程,在Linux2.6.36内核中实现了外部中断处理;通过对该主板的外部中断进行大量测试,表明了龙芯2F处理器能够准确及时地处理外部中断请求,达到了预期的设计目标。
[1] 唐朔飞.计算机组成原理[M].北京:高等教育出版社,2008.
[2] Dominic Sweet man.See MIPS Run[M].北京:机械工业出版社,2007.
[3] 刘佩林,谭志明,刘嘉龑.MIPS体系结构与编程[M].北京:科学出版社,2008.
[4] Heinrich,J.MIPS R4000 User’s Manual.Englewood Cliffs,NJ:Prentice Hall,1993.
[5] 王旭.Debian标准教程[M].北京:人民邮电出版社,2009.
The Research and Realization of the Interrupt Mechanism Based on the Loongson 2F Laptop Motherboard
ZHANG Jian-m in1ZHANG Qian-feng2
(1.Technology Center,Shenzhen Electric Appliance Company,Shenzhen Guangdong 518000,China; 2.China Telecom Corporation Limited Quanzhou Branch,Quanzhou Fujian 362000,China)
Loongson 2F processor is a 64 bit high performance and low power chips for desktop and high-end embedded applications,which can be applied to a personal computer,industry terminal,industrial control,data acquisition,network security and other fields.By studying the interrupt mechanism of loongson 2F processor,we design the loongson 2F laptop motherboard external interrupt routing,implementing the external interrupt handling in the Linux2.6.36 kernel.Tests show that the loongson 2F processor can accurately and timely process the external interrupt request for desired design goals.
loongson 2F;laptop motherboard;interrupt mechanism
TP338.1
A
1009-0312(2015)01-0013-06
2014-10-13
张建民(1975—),男,河南开封人,工程师,硕士,主要从事Linux内核及驱动开发研究。