首先在設備樹里定義一個節點,例如:
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
發布評論請先 登錄
相關推薦
寄存器變量
ATMEL SAMC21的ADC驅動寄存器操作和寄存器程序合集免費下載
![ATMEL SAMC21的ADC<b class='flag-5'>驅動</b><b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>和<b class='flag-5'>寄存器</b>程序合集免費下載](https://file.elecfans.com/web1/M00/97/2B/o4YBAF0LLGmAC5t2AAC5tCSMj1k893.png)
ATMEL SAMC21的DAC驅動寄存器操作和寄存器代碼免費下載
![ATMEL SAMC21的DAC<b class='flag-5'>驅動</b><b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>和<b class='flag-5'>寄存器</b>代碼免費下載](https://file.elecfans.com/web1/M00/97/80/pIYBAF0LK4CATo_oAAEJ3nLOhMY791.png)
Atmel SAMC21的I2C驅動寄存器操作和寄存器代碼免費下載
使用寄存器的邏輯操作指令是什么?
STM32的寄存器操作
![STM32的<b class='flag-5'>寄存器</b><b class='flag-5'>操作</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
如何在shell中操作寄存器
Linux應用層操作寄存器
![<b class='flag-5'>Linux</b>應用層<b class='flag-5'>操作</b><b class='flag-5'>寄存器</b>](https://file1.elecfans.com/web2/M00/A8/FD/wKgZomUiVBiAEPKxAACBu39aqSE068.jpg)
評論