首先在设备树里定义一个节点,例如:
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文章
5588浏览量
129033 -
驱动
+关注
关注
12文章
1927浏览量
88184 -
Linux
+关注
关注
88文章
11627浏览量
217888
发布评论请先 登录
寄存器变量
ATMEL SAMC21的ADC驱动寄存器操作和寄存器程序合集免费下载
ATMEL SAMC21的DAC驱动寄存器操作和寄存器代码免费下载
Atmel SAMC21的I2C驱动寄存器操作和寄存器代码免费下载
使用寄存器的逻辑操作指令是什么?
STM32的寄存器操作
如何在shell中操作寄存器
Linux应用层操作寄存器

Linux驱动操作寄存器
评论