fs2410除錯筆記

2021-06-18 05:22:24 字數 3723 閱讀 5888

在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...