linux下操作cpu暫存器

2021-06-28 14:37:04 字數 2423 閱讀 1942

大多數的核心裡面都有會對gpio的操作,而且核心裡面對gpio進行配置也很方便,要什麼功能就配置成什麼就可以了。

還有一些暫存器是核心沒有配置到的,但是我們要操作怎麼辦,核心裡面也定義了相關的介面函式。

在u-boot中操作某個暫存器:

reg = readl(iomuxc_base_addr + iomuxc_reg_gpr1);

reg &= ~iomuxc_reg_gpr1_actcs0_mask;

writel(reg, iomuxc_base_addr + iomuxc_reg_gpr1);

#define writel(v,a)__arch_putl(v,a)

#define __arch_putl(v,a)(*(volatile unsigned int *)(a) = (v))

所以在uboot裡面配置寄存相當於是給實體地址直接賦值,volatile的意思是提醒編譯器需要儲存或讀取這個變數的時候,都會直接從變數位址中讀取資料

而在核心中,上面的寫法是無法執行的,會提示虛擬位址錯誤。在核心中通常是通過虛擬位址來給實體地址賦值,所以需要將實體地址轉換成虛擬位址

reg = __raw_readl(ioremap(iomuxc_base_addr + iomuxc_reg_gpr1,4));

reg &= ~iomuxc_reg_gpr1_actcs0_mask;

reg &= ~iomuxc_reg_gpr1_addrs0_mask;

reg |= ((cs0_norflash_size | iomuxc_reg_gpr1_actcs0));

__raw_writel(reg, ioremap(iomuxc_base_addr + iomuxc_reg_gpr1,4));

這裡的ioremap是將實體地址iomuxc_base_addr轉換得到對應的虛擬位址,4表示4個位元組,即32位的位址。

u-boot下讀寫gpio:

與讀寫暫存器類似,u-boot下讀寫gpio口是直接給gpio賦值:

mxc_request_iomux(mx53_pin_gpio_8, iomux_config_alt1);

mxc_iomux_set_pad(mx53_pin_gpio_8, 0x1e4);

reg = readl(gpio1_base_addr + 0x0);

reg |= 0x100;

writel(reg, gpio1_base_addr + 0x0);

// set pin direction as output

reg = readl(gpio1_base_addr + 0x4);

reg |= 0x100;

writel(reg, gpio1_base_addr + 0x4);

gpio_8 是gpio1_8,前面兩個配置gpio_8的功能。

檢視datasheet可以看到gpio1的位址配置

53f8_4000 gpio data register

(gpio-1_dr) 32 r/w 0000_0000h

53f8_4004 gpio

direction register

(gpio-1_gdir) 32 r/w 0000_0000h

53f8_4008 gpio

pad status register

(gpio-1_psr) 32 r 0000_0000h

53f8_400c gpio interrupt configuration register1 (gpio-1_icr1) 32 r/w 0000_0000h

53f8_4010 gpio interrupt configuration register2 (gpio-1_icr2) 32 r/w 0000_0000h

53f8_4014 gpio interrupt mask register (gpio-1_imr) 32 r/w 0000_0000h

53f8_4018 gpio interrupt status register (gpio-1_isr) 32 w1c 0000_0000h

53f8_401c gpio edge select register (gpio-1_edge_sel) 32 r/w 0000_0000h

可以看到它的資料暫存器的偏移位址是0x0,輸入輸出暫存器的偏移位址是0x4。而reg |= 0x100;是gpio_8的所在的偏移,即(0x1 << 8)。

讀取乙個gpio的值,只需要讀取它的狀態暫存器就可以了,

reg = readl( gpio1_base_addr + 0x08 );

if(reg & (0x1 << 8))

printf("it is high\n");

else

printf("it is low\n");

linux下操作gpio暫存器的方法

一 在驅動中 1.用的時候對映埠 ioremap define gpio oft x x 0x56000000 define gpfcon volatile unsigned long gpio va gpio oft 0x56000050 gpio va ioremap 0x56000000,0x...

linux下操作gpio暫存器的方法

一 在驅動中 1.用的時候對映埠 ioremap define gpio oft x x 0x56000000 define gpfcon volatile unsigned long gpio va gpio oft 0x56000050 gpio va ioremap 0x56000000,0x...

CPU暫存器操作方式

cpu暫存器的讀取方式,其實就是讀取某個位址中儲存的資料,只不過這個位址是晶元廠商規定好用於特定功能的。一般ide都會提供暫存器的標頭檔案,可以參考晶元的程式設計手冊,手冊中都有每個模組的暫存器定義,以及位址說明,如果你不想使用標頭檔案定義可以自己手動編寫,例如你想訪問乙個32位的暫存器位址為0xe...