首先在設備樹里定義一個節點,例如:
uart0:serial@10010000{
compatible="sifive,uart0";
reg=<0x0?0x10010000?0x0?0x1000>;
status="okay";
}
@
符號后面是寄存器的基地址,然后填寫compatible
和reg
屬性,status
屬性設置為okay
。
reg屬性中,第二參數為寄存器基址,與@符號后面的地址對應,第四個參數是映射的大小。
驅動中操作:
#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;
}
先調用platform_get_resource
獲取IORESOURCE_MEM
資源,就是獲取了設備樹中的reg
屬性,返回的resource
結構體中包含了起始地址和結束地址。然后調用devm_ioremap_resource
映射這個資源,就能得到一個虛擬地址。后續對該虛擬地址的操作,就等同于對寄存器物理地址的操作。
讀寫寄存器,可以調用readl
、writel
函數。先讀取寄存器的值放到臨時變量中,賦值后,再一次性寫入。
-
寄存器
+關注
關注
31文章
5343瀏覽量
120448 -
驅動
+關注
關注
12文章
1840瀏覽量
85312 -
Linux
+關注
關注
87文章
11310瀏覽量
209620
發布評論請先 登錄
相關推薦
評論