在nor flash的0x0000 0000已經有引導程式u-boot,所以採用它進行引導,超級終端通過串列埠輸出和控制,u-boot 啟動以後通過命令tftp將應用程式載入到0x3010 0000,然後使用命令go 0x3010 0000 啟動應用程式。應用程式也有一段自己的引導程式,以下是對引導程式的配置。
中斷向量對映有兩個位址0x0000 0000和0xffff 0000。由於以下引導程式被
resetentry
b resethandler
b handlerundef ;handler for undefined mode
b handlerswi ;handler for swi interrupt
b handlerpabort ;handler for pabort
b handlerdabort ;handler for dabort
b . ;reserved
b handlerirq ;handler for irq interrupt
b handlerfiq ;handler for fiq interrupt
載入到0x3010 0000,所以實際上resetentry是處在0x3010 0000,所以當中斷發生時,不管是0x0000 0000,還是0xffff 0000都無法跳轉到0x3010 0000; 所以採用mmu虛擬記憶體對映的方式,將位址0x0000 0000 -------0x00200000對映到0x3010 0000;當中斷發生時實際執行0x3010 0000向量處的**,實現跳轉。
area ramdata, data, readwrite
^ _isr_startaddress
handlereset # 4
handleundef # 4
handleswi # 4
handlepabort # 4
handledabort # 4
handlereserved # 4
handleirq # 4
handlefiq # 4
sdram_end equ 0x33000000
_isr_startaddress equ (sdram_end-0x1000)
pisr_reset equ (_isr_startaddress+0x0)
pisr_undef equ (_isr_startaddress+0x4)
pisr_swi equ (_isr_startaddress+0x8)
pisr_pabort equ (_isr_startaddress+0xc)
pisr_dabort equ (_isr_startaddress+0x10)
pisr_reserved equ (_isr_startaddress+0x14)
pisr_irq equ (_isr_startaddress+0x18)
pisr_fiq equ (_isr_startaddress+0x1c)
只要配置類似pisr_reset
pisr_irq的函式,即可實現中斷函式的安裝,
pisr_irq =(u32)haltirq;
2.1虛擬記憶體對映要解決的乙個問題時上文的中斷對映問題,剛開始考慮採用高階位址 0xffff 0000,設定協處理器
r1_v equ (1<<13)
;void mmu_enablehighinterrupt(void) ;
export mmu_enablehighinterrupt
mmu_enablehighinterrupt
mrc p15,0,r0,c1,c0,0
orr r0,r0,#r1_v
mcr p15,0,r0,c1,c0,0
mov_pc_lr
但是記憶體對映問題解決不了。最後採用對映低端位址。
sdram_end equ 0x33000000
#define _mmutt_startaddress (sdram_end-0x100000)
;void mmu_setttbase(int base)
export mmu_setttbase
mmu_setttbase
;ro=ttbase
mcr p15,0,r0,c2,c0,0
mov_pc_lr
void mmu_setmtt(int vaddrstart,int vaddrend,int paddrstart,int attr);
mmu_setmtt(0x00000000,0x07f00000,0x30100000,rw_ncnb); //bank0
mmu_setmtt(0x08000000,0x0ff00000,0x08000000,rw_ncnb); //bank1
mmu_setmtt(0x10000000,0x17f00000,0x10000000,rw_ncnb);//bank2
mmu_setmtt(0x18000000,0x1ff00000,0x18000000,rw_ncnb); //bank3
mmu_setmtt(0x20000000,0x27f00000,0x20000000,rw_ncnb);//bank4
mmu_setmtt(0x28000000,0x2ff00000,0x28000000,rw_ncnb); //bank5
mmu_setmtt(0x30000000,0x30100000,0x30000000,rw_cb); //bank6-1
mmu_setmtt(0x31000000,0x33e00000,0x31000000,rw_cb); //bank6-2 原來的
mmu_setmtt(0x33f00000,0x37f00000,0x33f00000,rw_cb); //bank6-3 原來的
mmu_setmtt(0x38000000,0x3ff00000,0x38000000,rw_ncnb); //bank7
mmu_setmtt(0x40000000,0x47f00000,0x40000000,rw_ncnb);//sfr
mmu_setmtt(0x48000000,0x5af00000,0x48000000,rw_ncnb);
mmu_setmtt(0x5b000000,0xfff00000,0x5b000000,rw_fault);//notused
voidmmu_setmtt(int vaddrstart,int vaddrend,int paddrstart,int attr)//page 1 m
u32 *ptt;
int i,nsec;
ptt=(u32*)_mmutt_startaddress+(vaddrstart>>20);
nsec=(vaddrend>>20)-(vaddrstart>>20);
for(i=0;i<=nsec;i++)*ptt++=attr|(((paddrstart>>20)+i)<<20);
出現的現象,超級終端亂碼,重啟超級終端;加入log後可以讀出正確的資料,加入適當的延遲解決資料讀出錯誤的問題。
3.1中斷方式;
3.2 輪詢方式;
字元裝置驅動之按鍵掃瞄 FS2410
一 開發環境 1 硬體平台 fs2410 2 主機 ubuntu 10.10 3 核心版本 linux 2.6.35 4 交叉編譯工具鏈 arm none linux gnueabi 二 詳細 button scan.c include include include include include...
ARM裸機 FS2410定時器操作蜂鳴器
一 開發環境 硬體平台 fs2410 主機 ubuntu 10.10 二 關於定時器的原理圖 三 pwm定時器暫存器的配置 1 定時器的輸入頻率的設定 2 設定定時器啟動燈 3 設定定時器初值 四 詳細 timer.c include s3c2410.h void delay long long m...
ARM裸機 FS2410串列埠通訊(UART)
一 開發環境 1 硬體平台 fs2410 2 主機 ubuntu 10.10 二 fs2410串列埠的原理圖 三 串列埠uart暫存器配置 1 配置txd0與rxd0 gph2 gph3 2 設定波特率 ubrdivn 3 設定傳輸格式 ulconn 4 選擇時鐘源與中斷方式 uconn 5 設定f...