硬件设备(外设)如何实现RO/WO寄存器?

问题描述 投票:0回答:1

硬件设备使用MMIO将其寄存器暴露给CPU端。并且有很多类型的寄存器(在一些硬件手册/设备驱动程序中编写),用于不同的用途。这些硬件设备如何检查寄存器访问权限?

我使用

busybox devmem
在开发板上进行了测试,有一些MMIO寄存器(
DEVICE_ID
DEVICE_FEATURE
等)无法从CPU端写入。我想知道硬件如何实现该寄存器的只读/只写权限?

arm embedded hardware memory-mapping mali
1个回答
0
投票

以计时器为例,假设我将其设计为用于读取当前计数的寄存器是只读的(操纵开始或翻转计数等,我已经通过其他寄存器/机制实现了)。

我有一个控制寄存器,可以启用或禁用计数器。

0x00   bit[0] = 0 for disable 1 for enable
0x04   read only current count

一些寄存器采用伪语言

reg timer_count[7:0]
reg enable[1]

...

for each clock cycle

if(enable) timer_count = timer_count + 1

//assume processor side bus decodes the full address and aims it ultimately
//at this peripheral through other buses
if(bus_enable)
{
  if(bus_cycle_write)
  {
   if(address == 0x00)
     enable = bus_write_data[0]
  }
  else //read
  {
    if(address = 0x00)
       bus_read_data = {7b0,enable}
    if(address = 0x04)
       bus_read_data = timer_count
  }
}

但使用真实 HDL 的真实语法。 没有魔法,没有神秘。 我可以完成你的整个问题并制作一份 WO 和一份 RO

if(bus_enable)
{
  if(bus_cycle_write)
  {
   if(address == 0x00)
     enable = bus_write_data[0]
  }
  else //read
  {
    if(address = 0x04)
       bus_read_data = timer_count
  }
}

控制寄存器只能写入,定时器计数寄存器只能读取。 没有到控制寄存器的读取路径,也没有到定时器计数寄存器的写入路径。

© www.soinside.com 2019 - 2024. All rights reserved.