s3c2440可以使用地址空間爲1GB(0x00000000到0x40000000)。數組
1G空間分爲8個BANK,每一個BANK爲128MB。函數
設27條地址線,和8個片選引腳(nGCS0-nGCS7)。內存
內存控制器根據地址所在的BANK,自動決定要使用的片選引腳,以使能相應的BANK所鏈接的設備。it
32位CPU不必定用32條地址線。軟件
CPU認爲一個地址對應一個字節(8bit)。CPU發出一個地址,要讀取內存一個字節的數據(內存在BANK6地址從0x30000000開始),內存控制器操做片選引腳和地址線訪問由兩個16位內存芯片組成的32位內存時,內存芯片會一次性返回32位數據(4個字節),內存控制器再從中挑出CPU指定的字節。因此這時地址線的[A1:A0]是不用接的。配置
存儲控制器有13個寄存器,地址從0x48000000開始,每一個32位(4字節):二進制
BWSCON:總線寬度和等待控制寄存器。[0]保留0值,[2:1]用於設置BANK0的數據寬度,01爲16位,10爲32位,在Nor起動時使用,由引腳鏈接狀態決定,是隻讀的,不能軟件設置。[3]閒置。數據
[31:4]共28位,每4位設置一個BANK的參數,好比:di
[5:4]設置BANK1的位寬,00表示8bit,01表示16bit,10表示32bit,11保留;ping
[6]設置BANK1等待使能狀態,0 WAIT disable,1WAIT enable;
[7]設置BANK1引腳是否使用UB/LB。
好比設置BWSCON=0x22011110,二進制爲0010 0010 0000 0001 0001 0001 0001 0000,這裏表示BANK6和BANK7都是32位數據寬度,其餘BANK1-BANK5都是16位數據寬度。
BANKCON0-BANKCON5:經過設置6個寄存器的[14:0],分別控制BANK0到BANK5 的時序,用默認值0x0700便可。
BANKCON6和BANKCON7:兩個BANK接到內存上,除[14:0]控制時序外,[16:15]用於設置內存類型。根據內存芯片的狀況,取值0x00018005。
REFRESH:設置內存刷新
BANKSIZE:設置BANK6/7的內存映射尺寸、電源關閉等,應按內存芯片手冊進行設置。
MRSRB6/MRSRB7:SDRAM模式設置寄存器,好比設置行地址、列地址、芯片內bank選擇等
設置存儲控制器代碼以下:
/*
* 設置存儲控制器以使用SDRAM
*/
void memsetup(void)
{
volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;
/* 這個函數之因此這樣賦值,而不是像前面的實驗(好比mmu實驗)那樣將配置值 * 寫在數組中,是由於要生成」位置無關的代碼」,使得這個函數能夠在被複制到 * SDRAM以前就能夠在steppingstone中運行 */ /* 存儲控制器13個寄存器的值 */ p[0] = 0x22011110; //BWSCON p[1] = 0x00000700; //BANKCON0 p[2] = 0x00000700; //BANKCON1 p[3] = 0x00000700; //BANKCON2 p[4] = 0x00000700; //BANKCON3 p[5] = 0x00000700; //BANKCON4 p[6] = 0x00000700; //BANKCON5 p[7] = 0x00018005; //BANKCON6 p[8] = 0x00018005; //BANKCON7 /* REFRESH, * HCLK=12MHz: 0x008C07A3, * HCLK=100MHz: 0x008C04F4 */ p[9] = 0x008C04F4; p[10] = 0x000000B1; //BANKSIZE p[11] = 0x00000030; //MRSRB6 p[12] = 0x00000030; //MRSRB7}