Arm 如何读取AM335X上的特定寄存器值

Arm 如何读取AM335X上的特定寄存器值,arm,beagleboneblack,Arm,Beagleboneblack,我想从Beaglebone Black获得唯一的序列号。AM335X参考手册9.3.1.25告诉我,我应该能够从mac_id0_lo和mac_id0_hi寄存器获取唯一的串行id。这些寄存器的偏移量为630h和634h 如何读取这些寄存器的值?我在stackoverflow上找到了它,但它没有多大帮助 更新 我终于得到了一个python代码,可以从beaglebone black读取mac_id0和mac_id1 from mmap import mmap import struct CONT

我想从Beaglebone Black获得唯一的序列号。AM335X参考手册9.3.1.25告诉我,我应该能够从mac_id0_lo和mac_id0_hi寄存器获取唯一的串行id。这些寄存器的偏移量为630h和634h

如何读取这些寄存器的值?我在stackoverflow上找到了它,但它没有多大帮助

更新

我终于得到了一个python代码,可以从beaglebone black读取mac_id0和mac_id1

from mmap import mmap
import struct

CONTROL_MODULE_OFFSET = 0x44E10000
CONTROL_MODULE_SIZE = 0x44E11FFF-CONTROL_MODULE_OFFSET
MAC_ID0_LO_OFFSET = 0x630
MAC_ID0_HI_OFFSET = 0x634
MAC_ID1_LO_OFFSET = 0x638
MAC_ID1_HI_OFFSET = 0x63C

def print_mac():
    file_handler = open("/dev/mem", "r+b")
    mem = mmap(file_handler.fileno(), CONTROL_MODULE_SIZE, offset=CONTROL_MODULE_OFFSET)

    mac_id0_lo_packed_reg = mem[MAC_ID0_LO_OFFSET:MAC_ID0_LO_OFFSET+4]
    mac_id0_hi_packed_reg = mem[MAC_ID0_HI_OFFSET:MAC_ID0_HI_OFFSET+4]

    mac_id1_lo_packed_reg = mem[MAC_ID1_LO_OFFSET:MAC_ID1_LO_OFFSET+4]
    mac_id1_hi_packed_reg = mem[MAC_ID1_HI_OFFSET:MAC_ID1_HI_OFFSET+4]

    mac_id0_lo = struct.unpack('<L', mac_id0_lo_packed_reg)[0]
    mac_id0_hi = struct.unpack('<L', mac_id0_hi_packed_reg)[0]
    mac_id0_bytes = [None]*6
    mac_id0_bytes[0] = (mac_id0_lo & 0xff00) >> 8 #byte 0
    mac_id0_bytes[1] = (mac_id0_lo & 0x00ff) #byte 1
    mac_id0_bytes[2] = (mac_id0_hi & 0xff000000) >> 24 #byte 2
    mac_id0_bytes[3] = (mac_id0_hi & 0x00ff0000) >> 16 #byte 3
    mac_id0_bytes[4] = (mac_id0_hi & 0x0000ff00) >> 8 #byte 4
    mac_id0_bytes[5] = (mac_id0_hi & 0x000000ff) #byte 4
    mac_address_id0 = 0
    for i, byte in enumerate(mac_id0_bytes):
        mac_address_id0 |= ((byte & 0xff) << (i*8))

    mac_id1_lo = struct.unpack('<L', mac_id1_lo_packed_reg)[0]
    mac_id1_hi = struct.unpack('<L', mac_id1_hi_packed_reg)[0]
    mac_id1_bytes = [None]*6
    mac_id1_bytes[0] = (mac_id1_lo & 0xff00) >> 8 #byte 0
    mac_id1_bytes[1] = (mac_id1_lo & 0x00ff) #byte 1
    mac_id1_bytes[2] = (mac_id1_hi & 0xff000000) >> 24 #byte 2
    mac_id1_bytes[3] = (mac_id1_hi & 0x00ff0000) >> 16 #byte 3
    mac_id1_bytes[4] = (mac_id1_hi & 0x0000ff00) >> 8 #byte 4
    mac_id1_bytes[5] = (mac_id1_hi & 0x000000ff) #byte 4
    mac_address_id1 = 0
    for i, byte in enumerate(mac_id1_bytes):
        mac_address_id1 |= ((byte & 0xff) << (i*8))

    print 'mac id0'
    print format(mac_address_id0, '08x')

    print 'mac id1'
    print format(mac_address_id1, '08x')

    if not file_handler.closed:
        file_handler.close()
    mem.close()
print_mac()
从mmap导入mmap
导入结构
控制模块偏移量=0x44E10000
控制模块大小=0x44E11FF-控制模块偏移量
MAC\U ID0\U LO\U偏移量=0x630
MAC_ID0_高_偏移量=0x634
MAC_ID1_LO_偏移量=0x638
MAC_ID1_高_偏移量=0x63C
def print_mac():
file_handler=open(“/dev/mem”,“r+b”)
mem=mmap(file\u handler.fileno(),CONTROL\u MODULE\u SIZE,offset=CONTROL\u MODULE\u offset)
mac_id0_lou packed_reg=mem[mac_id0_lou OFFSET:mac_id0_lou OFFSET+4]
mac_id0_hi_packed_reg=mem[mac_id0_hi_偏移量:mac_id0_hi_偏移量+4]
mac_id1_lou packeted_reg=mem[mac_id1_lou OFFSET:mac_id1_lou OFFSET+4]
mac_id1_hi_packed_reg=mem[mac_id1_hi_偏移量:mac_id1_hi_偏移量+4]

mac_id0_lo=struct.unpack(“这些寄存器必须是内存映射的,所以问题是如何找出完整的物理地址并找到访问该物理地址的方法

从TRM:

从控制模块读取的值(基址0x44E1_0000) MAC_ID0_LO寄存器(偏移量0x630),MAC_ID0_HI寄存器(偏移量0x630 0x634)、MAC_ID1_LO寄存器(偏移量0x638)和MAC_ID1_HI寄存器 (偏移量0x63C)表示分配给每个AM335x的唯一MAC地址 这些寄存器中的值被编程到每个AM335x中 设备由TI提供,不能更改


可能您可以使用像
devmem2 0x44e10630
,但是这可能取决于Linux没有
CONFIG\u STRICT\u DEVMEM
。更糟糕的是,您可能需要编写一个小的内核驱动程序来访问这些内存区域。

正如auselen提到的那样,我只是试图通过doin读取高精度定时器芯片的主计数器寄存器中的值g
devmem2 0xfed000f0
尽管设置了
CONFIG\u STRICT\u DEVMEM
,但它仍然有效,因为它是非RAM的,因此在用户空间中可读写。

@AlexZielenski这不是寄存器OP询问baout的类型。如果你使用的是什么操作系统?@doron,我使用的是debian Wheeezy。你可以尝试使用现成的专用系统像这个项目: