fuzidage
专注嵌入式、linux驱动 、arm裸机研究

导航

 

1.内存接口概念

S3C2440是个片上系统,有GPIO控制器(接有GPIO管脚(GPA-GPH)),有串口控制器 (接有TXD RXD引脚),有memory controller内存控制器,有Nand控制器等...

1.不同类型的控制器:

(1)GPIO控制器属于门电路,不涉及到时序,相对简单。
(2)串口控制器属于协议类接口,类似的协议类接口还有iic、iis、spi等。 
(3)前面的GPIO/门电路接口、协议类接口,都不会把地址输出到外部设备,仅仅只是将地址写入到相应的控制器。
接下来的内存类接口,会把地址输出到外部,cpu将地址写入内存控制器,内存控制器还需访问外部设备,比如NorFlash、网卡、SDRAM。

2.CPU是如何访问各个不同的寄存器的呢?

GPIO/门电路接口、协议类接口、内存类接口都属于CPU的统一编址。但对于Nand Flash,它没有独立的地址线和cpu的地址总线相连接,因此它不参与CPU的统一编址。

(1)对于门电路接口、协议类接口,直接访问寄存器即可。

(2)对于内存类接口,交给内存控制器去处理。下面详细分析:
CPU只管发出一个地址,内存控制器根据该地址范围选择不同的模块,然后从模块中得到数据或者发送数据到模块中。

如下图,SDRAM、DM9000网卡、Nor Flash都接在JZ2440的数据总线和地址总线上,CPU把数据和地址发送出去,然后内存控制器根据地址范围确定要拉低选中哪个片选信号(nCS),再根据片选信号(nCS)选择相应的设备,进行收发地址和数据,互不干扰。


(1)当CPU发出的指令的地址范围处于0x00000000 - 0x08000000,
内存控制器就会使nGCS0处于低电平(片选引脚被选中),NorFlash被选中。(NorFlash启动时才行,nand启动时nGCS0这块对应SRAM)

(2)当CPU发出的指令的地址范围处于0x20000000 - 0x28000000,
内存控制器就会使nGCS4处于低电平(片选引脚被选中),网卡DM9000被选中。

(3)当CPU发出的指令的地址范围处于0x30000000 - 0x38000000,
内存控制器就会使nGCS6处于低电平(片选引脚被选中),SDRAM被选中。

内存控制器根据不同的地址地址范围,发出不同的片选引脚,只有被片选引脚选中的芯片才能正常工作,不被选中的芯片就像不存在一样,不工作。

从2440 datasheet中我们得知内存控制器可访问的地址范围有1G(0x0000,0000-0x4000,0000),8个bank,每个bank_size为128M。理论上需要2^30(30条地址线)来确定是哪个bank,哪个地址。但是实际上只用到了27条,那么是怎么确定是哪个bank被选中了呢?

cpu每次发给内存控制器的地址都是Addr[31:0],但是内存控制器发给外设(sdram,nor,dm9000)却只用到了A[26:0]。第[29:27]被用来确定要拉低哪个nGCS,即要选中哪个bank。

bit[29:27]		bit[26:0]
0b000		->    0x000,0000-0x7ff,ffff  (bank0被选中 (128M))
0b001		->    0x800,0000-0xfff,ffff  (bank1被选中 (128M))
...				...
0b110		->    0x000,0000-0x7ff,ffff  (bank6被选中 (128M))
0b111		->    0x800,0000-0xfff,ffff  (bank7被选中 (128M))

那么对于大容量的nandflash,理论上需要更多的地址线来确认访问地址,那既然没有地址线,cpu是如何访问nand的呢?当然是通过nand控制器,nand是地址、命令、数据都共用数据总线。这里只是引入一个话题,具体内容后面讲。

posted on 2019-12-09 13:13  fuzidage  阅读(1044)  评论(0编辑  收藏  举报