首先在設(shè)備樹里定義一個節(jié)點,例如:
uart0:serial@10010000{
compatible="sifive,uart0";
reg=<0x0?0x10010000?0x0?0x1000>;
status="okay";
}
@
符號后面是寄存器的基地址,然后填寫compatible
和reg
屬性,status
屬性設(shè)置為okay
。
reg屬性中,第二參數(shù)為寄存器基址,與@符號后面的地址對應(yīng),第四個參數(shù)是映射的大小。
驅(qū)動中操作:
#defineOFFSET0x60//某個寄存器的偏移地址
staticintmy_probe(structplatform_device*pdev)
{
structresource*res;
void__iomem*base;
u32regval;
res=platform_get_resource(pdev,IORESOURCE_MEM,0);
base=devm_ioremap_resource(&pdev->dev,res);
//寄存器讀寫
regval=readl(base+OFFSET);//讀寄存器
regval|=(1<0);//賦值
writel(regval,base+OFFSET);//寫寄存器
return0;
}
先調(diào)用platform_get_resource
獲取IORESOURCE_MEM
資源,就是獲取了設(shè)備樹中的reg
屬性,返回的resource
結(jié)構(gòu)體中包含了起始地址和結(jié)束地址。然后調(diào)用devm_ioremap_resource
映射這個資源,就能得到一個虛擬地址。后續(xù)對該虛擬地址的操作,就等同于對寄存器物理地址的操作。
讀寫寄存器,可以調(diào)用readl
、writel
函數(shù)。先讀取寄存器的值放到臨時變量中,賦值后,再一次性寫入。
-
寄存器
+關(guān)注
關(guān)注
31文章
5432瀏覽量
124113 -
驅(qū)動
+關(guān)注
關(guān)注
12文章
1913瀏覽量
86783 -
Linux
+關(guān)注
關(guān)注
87文章
11506瀏覽量
213390
發(fā)布評論請先 登錄
寄存器是什么?怎么操作寄存器點亮LED燈?

寄存器操作方法_對寄存器操作的通用方法總結(jié)
寄存器變量
ATMEL SAMC21的ADC驅(qū)動寄存器操作和寄存器程序合集免費下載

ATMEL SAMC21的DAC驅(qū)動寄存器操作和寄存器代碼免費下載

Atmel SAMC21的I2C驅(qū)動寄存器操作和寄存器代碼免費下載
使用寄存器的邏輯操作指令是什么?
STM32的寄存器操作

Linux應(yīng)用層操作寄存器
如何在shell中操作寄存器
Linux應(yīng)用層操作寄存器

評論