JZ2440 選用的是 MX29LV160D T/B 的型號,它爲 2M x 8bit 或 1M x 16bit 的大小,即爲 2M/1M 空間大小。8/16 是位寬。
linux
Makefileshell
1 # 獲取當前工做目錄 2 CURRDIR = $(shell pwd) 3 4 # 頭文件所在目錄 5 INCDIR = $(CURRDIR) 6 7 # 交叉編譯工具鏈的絕對路徑 8 CROSS_COMPILE = ~/work/s3c2440/tools/gcc-3.4.5-glibc-2.3.6/bin/arm-linux- 9 10 # 編譯器工具 11 AS = $(CROSS_COMPILE)as 12 LD = $(CROSS_COMPILE)ld 13 CC = $(CROSS_COMPILE)gcc 14 CPP = $(CC) -E 15 AR = $(CROSS_COMPILE)ar 16 NM = $(CROSS_COMPILE)nm 17 STRIP = $(CROSS_COMPILE)strip 18 OBJCOPY = $(CROSS_COMPILE)objcopy 19 OBJDUMP = $(CROSS_COMPILE)objdump 20 21 # 編譯器標識位設置 22 CFLAGS := 23 AFLAGS := 24 LDFLAGS := 25 CFLAGS := 26 AFLAGSL := 27 28 # 目標文件設置 29 objs := startup.o sdram.o 30 31 all: clean s3c2440.bin 32 33 34 # 執行編譯的過程 35 s3c2440.bin: $(objs) 36 $(LD) -Ttext 0x00000000 -o s3c2440_elf $^ 37 $(OBJCOPY) -O binary -S s3c2440_elf $@ 38 $(OBJDUMP) -D -m arm s3c2440_elf > s3c2440.dis 39 40 41 %.o:%.c 42 $(CC) -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding -c -o $@ $< 43 44 %.o:%.S 45 $(CC) -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding -c -o $@ $< 46 47 clean: 48 rm -f *.bin *_elf *.dis *.o
startup.S編程
1 .equ MEM_CTL_BASE, 0x48000000 2 .equ SDRAM_BASE, 0x30000000 3 4 .text 5 .global _start 6 _start: 7 bl disable_watch_dog @ 關閉WATCHDOG,不然CPU會不斷重啓 8 bl memsetup @ 設置存儲控制器 9 bl copy_steppingstone_to_sdram @ 複製代碼到SDRAM中 10 ldr pc, =on_sdram @ 跳到SDRAM中繼續執行 11 12 @ 棧是先入後出,SDRAM 的地址爲 0x30000000,64M 大小的結束地址爲 0x34000000 13 on_sdram: 14 ldr sp, =0x34000000 @ 設置堆棧, 此時 pc 指向了棧頂 15 bl main 16 17 halt_loop: 18 b halt_loop 19 20 @ WTCON 寄存器容許用戶使能或禁止看門狗定時器、從 4 個不一樣源選擇時鐘信號、使能或禁止中斷和使能或禁止看門狗定時器輸出。 21 @ 看門狗定時器是用於恢復 S3C2440A 上電後如有故障重時新啓動;若是不但願控制器從新啓動,則應該禁止看門狗定時器。 22 @ 若是用戶但願使用看門狗定時器做爲普通定時器,則應使能中斷而且禁止看門狗定時器。 23 @ STR{條件} 源寄存器,<存儲器地址> 24 @ STR指令用於從源寄存器中將一個 32 位的字數據傳送到存儲器中。 25 disable_watch_dog: 26 @ 往 WATCHDOG 寄存器寫 0 便可,操做 WTCON 寄存器 27 mov r1, #0x53000000 28 mov r2, #0x0 29 str r2, [r1] 30 mov pc, lr @ 返回 31 32 @ S3C2440A 引導代碼能夠在外部 NAND Flash 存儲器上執行。 33 @ 爲了支持 NAND Flash 的 BootLoader,S3C2440A 配備了一個內置的 SRAM 緩衝器,叫作「Steppingstone」。 34 @ 引導啓動時,NAND Flash 存儲器的開始 4K 字節將被加載到 Steppingstone 中而且執行加載到 Steppingstone 的引導代碼。 35 copy_steppingstone_to_sdram: 36 @ 將Steppingstone 的 4K 數據所有複製到 SDRAM 中去 37 @ Steppingstone 起始地址爲 0x00000000,SDRAM 中起始地址爲 0x30000000 38 39 mov r1, #0 40 ldr r2, =SDRAM_BASE 41 mov r3, #4*1024 42 1: 43 ldr r4, [r1],#4 @ 從Steppingstone讀取4字節的數據,並讓源地址加4 44 str r4, [r2],#4 @ 將此4字節的數據複製到SDRAM中,並讓目地地址加4 45 cmp r1, r3 @ 判斷是否完成:源地址等於Steppingstone的未地址? 46 bne 1b @ 若沒有複製完,繼續 47 mov pc, lr @ 返回 48 49 @ 存儲控制器設置 50 memsetup: 51 @ 設置存儲控制器以便使用SDRAM等外設 52 53 mov r1, #MEM_CTL_BASE @ 存儲控制器的13個寄存器的開始地址 54 adrl r2, mem_cfg_val @ 這13個值的起始存儲地址 55 add r3, r1, #52 @ 13*4 = 54 56 1: 57 ldr r4, [r2], #4 @ 讀取設置值,並讓r2加4 58 str r4, [r1], #4 @ 將此值寫入寄存器,並讓r1加4 59 cmp r1, r3 @ 判斷是否設置完全部13個寄存器 60 bne 1b @ 若沒有寫成,繼續 61 mov pc, lr @ 返回 62 63 .align 4 64 mem_cfg_val: 65 @ 存儲控制器13個寄存器的設置值 66 @ BWSCON 總線寬度和等待控制寄存器 67 @ 0010 0010 0000 0001 0001 0001 0001 0000 68 .long 0x22011110 @ BWSCON 69 @ BANKCON0 Bank0 控制寄存器 70 @ 0000 0000 0000 0000 0000 0111 0000 0000 71 @ 設置了訪問週期爲 14 各時鐘 72 .long 0x00000700 @ BANKCON0 73 @ BANKCON1 Bank· 控制寄存器 74 .long 0x00000700 @ BANKCON1 75 @ BANKCON2 Bank2 控制寄存器 76 .long 0x00000700 @ BANKCON2 77 @ BANKCON3 Bank3 控制寄存器 78 .long 0x00000700 @ BANKCON3 79 @ BANKCON4 Bank4 控制寄存器 80 .long 0x00000700 @ BANKCON4 81 @ BANKCON5 Bank5 控制寄存器 82 .long 0x00000700 @ BANKCON5 83 @ BANKCON6 Bank6 控制寄存器 84 @ 0000 0000 0000 0001 1000 0000 0000 0101 85 @ 0 - 16 bit 有效: 86 @ [16:15] 11:即 MT 設置爲同步 DRAM 即 SDRAM 87 @ 存儲器類型 = ROM 或 SRAM [MT=00](15 位),下面的數據設置爲0,只有[3:0]有效 88 @ [14:13] 89 @ [12:11] 90 @ [10:8] 91 @ [7:6] 92 @ [5:4] 93 @ 存儲器類型 = SDRAM [MT=11](4 位)時候: 94 @ [3:2] 01:Trcd RAS 到 CAS 的延遲,設置爲 3 各時鐘(根據 SDRAM 的芯片手冊設置) 95 @ [1:0] 01:SCAN 列地址數,設置爲 9 列,一樣根據 SDRAM 手冊設置 96 .long 0x00018005 @ BANKCON6 97 @ BANKCON7 Bank7 控制寄存器 98 .long 0x00018005 @ BANKCON7 99 @ REFRESH SDRAM 刷新控制寄存器 [24: 0] 有效 100 @ 0000 0000 1000 1100 0000 0111 1010 0011 101 @ 具體看芯片手冊 102 .long 0x008C07A3 @ REFRESH 103 .long 0x000000B1 @ BANKSIZE 可變 Bank 大小寄存器 104 @ 當代碼在 SDRAM 中運行時必定不要改變 MRSR 寄存器 105 @ 睡眠模式中,SDRAM 必須使能 SDRAM 自刷新模式 106 .long 0x00000030 @ MRSRB6 模式寄存器組寄存器 Bank6 107 .long 0x00000030 @ MRSRB7
sdram.c多線程
1 /** 2 * 將0x56000050 強轉爲 unsigned long 型指針,並取這個地址的值 3 * volatile 關鍵字:防止編譯器優化,在應用層上多線程變量,在嵌入式中外設寄存器 4 */ 5 #define GPFCON (*(volatile unsigned long *)0x56000050) 6 #define GPFDAT (*(volatile unsigned long *)0x56000054) 7 #define GPFUP (*(volatile unsigned long *)0x56000058) 8 9 /** 設置 GPFCON 的 4 5 6 引腳爲輸出 */ 10 #define GPF4_OUT (1 << (4 * 2)) 11 #define GPF5_OUT (1 << (5 * 2)) 12 #define GPF6_OUT (1 << (6 * 2)) 13 14 static void delay_ms(unsigned long ms); 15 16 int main(void) 17 { 18 /** 將LED1-3對應的GPF4/5/6三個引腳設爲輸出 */ 19 GPFCON = GPF4_OUT | GPF5_OUT | GPF6_OUT; 20 21 unsigned long i = 0; 22 while(1){ 23 delay_ms(500); 24 GPFDAT = (~(i<<4)); // 根據i的值,點亮LED1,2,4 25 if(++i == 8) 26 i = 0; 27 } 28 } 29 30 static void delay_ms(unsigned long ms) 31 { 32 unsigned int i; 33 34 while(ms--) { 35 for(i = 0; i < 1200; i++); 36 } 37 }