Chinaunix首页 | 论坛 | 博客
  • 博客访问: 227701
  • 博文数量: 49
  • 博客积分: 2101
  • 博客等级: 大尉
  • 技术积分: 525
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-07 10:38
文章分类

全部博文(49)

文章存档

2010年(49)

我的朋友

分类: 嵌入式

2010-09-29 16:37:48

对嵌入式(计算机)系统IO体系结构的理解

 

1 前言

         最近一直在学习usb驱动,牵涉到了sysfs设备模型,基本上看了个大概也明白了。但是sysfs是对硬件系统的抽象,其中总线、设备、驱动三个概念理解一直不透;昨天翻看了《深入理解linux内核》第13章,才突然觉得原来是对IO体系结构理解不清,造成我学习驱动的速度慢了下来;又对照了《linux设备驱动》第9章,基本上算是把IO体系结构理解透彻了。

         不得不说,x86和其他体系结构的cpu真的有很多不同哦。

2 CPUIO控制器、IO设备

         CPU的主要职责是负责运算,而计算机是需要各种外设的,否则无法和人进行交互。我学过8051汇编,学过基于powerpcMPC8xx系统嵌入式CPU,也看过很多ARM的芯片资料,我发现CPU与外设的“沟通”有分两步在进化。

         早期x86体系的CPU,需要使用前端总线(fsb)和北桥芯片相连,北桥再和南桥相连。南北桥是一种架构的划分,设计者的原始图架构上,在上部的称为北桥,下部的成为南桥。

典型上,北桥的功能主体是AGP控制、内存控制,南桥包括IDEPCI、串并口多功能控制单元,集成网卡控制器、音效控制器就在南桥。而集成的图形控制单元,就是集成显卡核心了,就在北桥。 总之,CPU控制外部设备需要依赖于南北桥,而南北桥中就集中了各种外部设备的控制器。

        在我学习了MPC8XX系列嵌入式CPU时,发现很多IO设备控制器都是和CPU集中在同一芯片内的。当时我仅仅理解到这就是SOC的概念,我没理解到IO系统级别。嵌入式CPU基本上已经超过了原先CPU的概念:在计算核心的基础上,增加外设控制器。典型的MPC860系列,不但包括了powerpc核,还集成了siucpm两个部分。siu用于控制内存等,而cpm则负责控制串口、网口等等。我研究过micrel公司的ks8695px芯片,该芯片内部集成的是ARM926t核心,同时集成内存控制器、pci控制器等等。

        根据上面两点,我本来得出的结论是:通用计算机IO体系结构(x86)和嵌入式系统IO体系结构式不同的;但是第二天,我就推翻了自己的结论。

        现在的x86处理器已经不是早期那个样子了。最早,AMD做的x86处理器已经将内存控制器集成到了处理器内部了,因此弱化了北桥的功能。后来,英伟达公司为AMD的处理器开发的单芯片就集中了南北桥功能。intel现在的i5i7已经集成了内存控制器、PCI-E控制器等等。所以南北桥的IO控制器越来越多的放到了CPU内部。现在连显卡都要集成到处理器中。当然,在通用计算机中,慢速外设如串口等似乎没必要集成到cpu中。

        综上所述:CPU通过IO控制器控制外部设备;而IO控制器正越来越多的集成到CPU中去,CPU芯片的概念和功能已经超越了单纯的计算。

 

3 IO总线分类

         总线用于互联!只要搞明白总线连接的两端是什么,那一切问题都不是问题啦。

3.1   第一种总线:连接CPU计算核心和IO控制器的总线。

         早期IO控制器集成在北桥和南桥,CPU通过前端总线FSB和北桥直接相连,北桥通过DMI总线和南桥相连。后来,INETLCPU和北桥间的FSB总线换成了更高速的QPI总线,当然功能是一样的。再想想如果内存控制器、USB控制器、PCI-E控制器集成在CPU芯片内部时,CPU核和这些控制器是用什么总线相连呢?Intel的我不知道,但是我有MPC866ks8695px的手册呵呵,看一下子。在MPC866block diagram中,可以看到unifined buspowerpc核、SIUCPM三个模块互联起来;在ksz8695pxblock diagram中,可以看到使用了AMBAAPB两种总线高低搭配来互联所有的模块。

         我是做嵌入式驱动开发,这种级别的总线我应该是不需要驱动的啦,除非我去开发linux内核吧!看看下一种总线。

3.2 第二种总线:连接IO控制器和IO设备的总线

         这部分的总线种类可就多啦。不同的控制器为不同的目标而设计;同一目标因不同公司设计而不同。目前主流的总线如下表所示。

总线

备注

PCI/PCI-E

最主流的外设互联标准

USB

最火的高速串行总线

I2C

 

SPI

 

UART

最普通也最实用

SATA

现在流行串口硬盘

IDE

并行的硬盘控制器

         有一种设备比较特殊:网卡设备。在MPC8xxKSZ8695PX中,网络接口设备(主要指MAC设备)是集成在处理器芯片内部的;因此MAC也算是一种总线控制器吧。

         一般来说,做嵌入式驱动,都是在驱动这些总线控制器,使其和外设正常通信。想要驱动它们,就要熟悉这些总线的工作细节。说到总线就不得不提到接口。可以这么看,总线是逻辑标准,而接口是为了实现总线上设备互联而设计物理标准。比如UART总线,可以通过RS232/RS485等接口和外设相连。另外还要提到协议,总线上传输的数据是按照一定协议来组织格式的,但是总线不关心协议。

         目前我最熟悉的莫过于串口和网口控制器的驱动开发了;正在学习USB驱动开发,准备学习PCIIDE/SATA等驱动开发。

 

4 进一步考虑处理器核与IO控制器间的关系--控制

         在上面,仅仅是从总线连接的角度上来看处理器核与IO控制器之间的关系;同时在那时我也觉得:和我的驱动无关哦。但是再仔细想想,有个很重要的问题我没有阐述到。问题在于,我对总线控制器的控制是如何完成的呢?根据我开发MPC8XX的串口、网口的经验,我可以很明确的回答,我通过控制UARTFEC控制器的寄存器来完成的。再来一个问题:UARTFEC控制器获得外部输入,是如何送到内存的呢?答案是使用其自身的DMA控制器直接访问内存。上面这两个问题算是对总线功能的枚举吧。

         因此,编写驱动逃不脱处理器核与IO控制器间的总线功能控制功能。当然,我们只是去使用这个功能。下面就来看看这些控制手段都有哪些。

         刚才提到的MPC8XX中,CPU核可以直接通过unified bus访问IO控制器的寄存器,就像访问内存一样。因为这些寄存器和内存一样,都在4GB物理地址空间上占有一席之地。

         但是x86再次显现了其不同。根据《深入理解linux内核》第13章中的“I/O端口”段落,可以看到,CPU核和IO控制器间存在一个IO端口的概念。我理解IO端口是属于IO总线的,不知道对不对。而x86也为控制端口设有专门的指令,因此linux中也有控制端口的专门API接口。

         根据MPC8xxx86这两种例子,可以看到,CPU核对IO控制器的控制分为两种:I/O端口和I/O内存。这两个名词我是从《linux设备驱动》第九章抄来的。注意:第一,I/O内存是指I/O控制器中的寄存器或内存;第二,根据《深入理解linux内核》第13章中的描述“I/O端口还可以被映射到物理地址空间。因此,处理器核I/O设备之间的通信就可以使用对内存直接进行操作的汇编语言指令。”可知,x86I/O端口机制可以变为I/O内存。

 

阅读(1902) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~