S3C2440裸板程式之MMU

2021-08-25 19:45:36 字數 2727 閱讀 5110

本例項將開啟mmu, 將虛擬位址0xa0000000~0xa00010000對映到 實體地址 0x56000000~0x56100000,這樣就可以通過操作位址0xa0000050,0xa0000054來控制3個led的亮滅。

head.s

.text

.global _start

_start:

ldr sp, =4096 @ 設定棧指標,呼叫c函式之前要設好棧

bl disable_watchdog @ 關watch dog ,否者cpu會不斷重啟

bl memsetup @ 設定儲存控制器以使用sdram

bl copy_2th_to_sdram @ 把第二部分code複製到sdram

bl create_page_table @ 設定頁表

bl mmu_init @ 啟動mmu

ldr sp, =0xb4000000 @ 重設棧指標,指向sdram頂端,這裡使用的是虛擬位址

ldr pc, =0xb0004000 @ 第二部分程式執行位址

halt_loop:

b halt_loop

init.c

#define wtcon	(*(volatile unsigned long *)0x53000000)  /*關門狗暫存器位址*/

#define mem_ctl_base 0x48000000 /*儲存控制器暫存器起始位址*/

void disable_watchdog(void)

void memsetup(void)

; int i = 0;

volatile unsigned long *p = (volatile unsigned long *)mem_ctl_base;

for(; i<13; i++)

p[i] = mem_cfg_val[i];

}void copy_2th_to_sdram(void)

}/*mmu define*/

#define mmu_full_access (3<<10) /*bit11:10 0b11 , 允許讀寫*/

#define mmu_domain (0<<5) /*bit8:5 0, 0 domain*/

#define mmu_special (1<<4) /*bit4 必須為1*/

#define mmu_cacheable (1<<3) /*bit3 cached*/

#define mmu_bufferable (1<<2) /*bit2 bufferd*/

#define mmu_section 2 /*1: 粗頁表 , 2:段頁表 ,3: 細頁表*/

#define mmu_secdesc (mmu_full_access | mmu_domain | mmu_special | mmu_section)

#define mmu_secdesc_wb (mmu_full_access | mmu_domain | mmu_special | mmu_section | mmu_cacheable | mmu_bufferable)

#define mmu_section_size 0x00100000

void create_page_table(void) }

void mmu_init(void)

led.c

/********************

@goal: sdram

@method:

@date: 2018/06/09

@auto:alon

*********************/

#define gpfcon (*(unsigned long *)0xa0000050) /*實體地址是 0x56000050*/

#define gpfdat (*(unsigned long *)0xa0000054) /*實體地址是 0x56000054*/

static inline void delay(unsigned int i)

int main()

return 0;

}

mmu.lds

sections 

second 0xb0004000 : at(2048)

}

2048是指程式的載入位址,即在stepping stone裡的儲存位置,從2048開始。

0xb0004000是指第二段程式的執行位址。

makefile

objs := head.o init.o led.o

mmu.bin: $(objs)

arm-linux-ld -tmmu.lds -o mmu_elf $^

arm-linux-objcopy -o binary -s mmu_elf $@

arm-linux-objdump -d -m arm mmu_elf > mmu.dis

%.o:%.c

arm-linux-gcc -wall -o2 -c -o $@ $<

%.o:%.s

arm-linux-gcc -wall -o2 -c -o $@ $<

clean:

rm -f mmu.bin mmu_elf mmu.dis *.o

OpenJTAG除錯S3C2440裸板程式

0x00 懵逼 當你寫好的初始化 head.s和鏈結指令碼uart.lds共同編譯出來的 bin,燒錄到nandflash中的時候,發現串列埠輸出一片空白,這時你的想法是什麼,砸電腦還是幹點其他有用的事?還是老實的搭建除錯環境吧,上篇講過如何除錯原始碼級的 但若是初始化 有問題,譬如sdram拷貝出...

S3C2440裸板程式之第乙個程式

一.編寫 實現點亮乙個led 1.匯程式設計序 led on.s 目標 點亮乙個led 功能 gpf4 輸出低電平 text global start start ldr r0,0x56000050 gpfcon 暫存器 mov r1,0x00000100 9 8 01 設定gpf4為輸出功能 st...

S3C2440彙編中斷程式

雖然現在c語言已經成為主流力量,但是我還是非常喜歡用彙編寫 的高效率,高速度是有天獨厚的,但我更喜歡他那種 指哪打哪 的高透明。265m的ram任你主宰,想把那句話放在哪,就放在哪。這種任性你懂嗎?學習中斷程式兩大感悟 自己卡住的地方 2,位址切記不要寫錯。我就是在這裡卡了將近一天時間。s3c244...