核心執行之前訪問IO

2021-09-08 03:19:32 字數 1490 閱讀 6393

如果要在核心執行之前訪問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 和靜態...