首先在設(shè)備樹里定義一個(gè)節(jié)點(diǎn),例如:
uart0:serial@10010000{
compatible="sifive,uart0";
reg=<0x0?0x10010000?0x0?0x1000>;
status="okay";
}
@
符號(hào)后面是寄存器的基地址,然后填寫compatible
和reg
屬性,status
屬性設(shè)置為okay
。
reg屬性中,第二參數(shù)為寄存器基址,與@符號(hào)后面的地址對(duì)應(yīng),第四個(gè)參數(shù)是映射的大小。
驅(qū)動(dòng)中操作:
#defineOFFSET0x60//某個(gè)寄存器的偏移地址
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
映射這個(gè)資源,就能得到一個(gè)虛擬地址。后續(xù)對(duì)該虛擬地址的操作,就等同于對(duì)寄存器物理地址的操作。
讀寫寄存器,可以調(diào)用readl
、writel
函數(shù)。先讀取寄存器的值放到臨時(shí)變量中,賦值后,再一次性寫入。
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120261 -
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1839瀏覽量
85270 -
Linux
+關(guān)注
關(guān)注
87文章
11296瀏覽量
209364
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論