如果要在核心執行之前訪問cpu的某些io埠,直接使用指標方式定義暫存器進行操作即可。例如,在解壓核心的時候餵狗,通過操作io進行,可以這樣操作:
在arch/arm/boot/compressed/misc.c檔案:
307 arch_decomp_setup();
308309 makecrc();
310 *((volatile unsigned long *)0x40e00054) &= (~(3<<28)); //abing gpaf0_l
311 *((volatile unsigned long *)0x40e0001c) = (1<<14); //abing gpdr0
312 *((volatile unsigned long *)0x40e00024) = (1<<14); //abing gpcr0
313 putstr("uncompressing linux...");
314 *((volatile unsigned long *)0x40e00018) = (1<<14); //abing gpsr0
315 gunzip();
316 *((volatile unsigned long *)0x40e00024) = (1<<14); //abing gpcr0
317 putstr(" done, booting the kernel.\n");
318 return output_ptr;
12#define ffuart ((volatile unsigned long *)0x40100000)13#define btuart ((volatile unsigned long *)0x40200000)
14#define stuart ((volatile unsigned long *)0x40700000)
1516#define uart
ffuart
1718
19static __inline__ void putc(char c)
2024
25/*
27*/
28static void putstr(const char *s)
2936}
可以這樣定義:
#define __raw_readl(a) (*(volatile unsigned int *)(a))#define __raw_writel(v,a) (*(volatile unsigned int *)(a) = (v))
#define __raw_readw(a) (*(volatile unsigned short *)(a))
#define __raw_writew(v,a) (*(volatile unsigned short *)(a) = (v))
核心訪問外設I O資源方式
參考 很多預設的外設i o資源是不在linux核心空間中,如sram 硬體暫存器,如果要訪問這些資源,就必須將它位址對映到核心空間。linux核心空間訪問外設i o資源有兩種方式 動態對映 ioremap 和靜態對映 map desc 一 動態對映 動態對映方式接觸應該比較多,即通過核心提供的ior...
Linux 核心訪問外設IO資源的方式
首先介紹一下i o埠和i o記憶體。1.i o埠 當乙個暫存器或記憶體位於i o空間時,稱其為i o埠。2.i o記憶體 當乙個暫存器或記憶體位於記憶體空間時,稱其為i o記憶體。再來看一下i o暫存器和常規記憶體的區別 i o暫存器具有邊際效應 side effect 而記憶體操作則沒有,記憶體寫...
Linux核心訪問外設I O資源的方式
linux核心訪問外設i o資源的方式 我們知道缺省外設i o資源是不在linux核心空間中的 如sram或硬體介面暫存器等 若需要訪問該外設i o資源,必須先將其位址對映到核心空間中來,然後才能在核心空間中訪問它。linux核心訪問外設i o記憶體資源的方式有兩種 動態對映 ioremap 和靜態...