大多數的核心裡面都有會對gpio的操作,而且核心裡面對gpio進行配置也很方便,要什麼功能就配置成什麼就可以了。
還有一些暫存器是核心沒有配置到的,但是我們要操作怎麼辦,核心裡面也定義了相關的介面函式。
在u-boot中操作某個暫存器:
這裡的ioremap是將實體地址iomuxc_base_addr轉換得到對應的虛擬位址,4表示4個位元組,即32位的位址。reg = readl(iomuxc_base_addr + iomuxc_reg_gpr1);
#define writel(v,a)__arch_putl(v,a)reg &= ~iomuxc_reg_gpr1_actcs0_mask;
writel(reg, iomuxc_base_addr + iomuxc_reg_gpr1);
#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));
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...