2015-04-24 99 views
2

我想从Beaglebone Black中获取唯一的序列号。 AM335X参考手册9.3.1.25告诉我,我应该能够从mac_id0_lo和mac_id0_hi寄存器中获得唯一的序列号。这些寄存器的偏移量为630h和634h。如何读取AM335X上的特定寄存器值

如何读取这些寄存器的值?我在stackoverflow上找到this post,但它不是很有帮助。

UPDATE

我终于得到了一个Python代码的工作来读取beaglebone黑色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() 
+0

@AlexZielenski这不是那种注册OP是要求baout。 –

+0

什么操作系统,如果你有使用? – doron

+0

@doron,我使用的是debian wheezy。 – DXM

回答

3

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

从TRM:从控制模块(基地址0x44E1_0000) MAC_ID0_LO寄存器(偏移0x630),MAC_ID0_HI寄存器读

的值(偏移 0x634),MAC_ID1_LO寄存器(偏移0x638)和MAC_ID1_HI寄存器 (偏移0x63C)表示分配给每个AM335x设备的唯一MAC地址。这些寄存器中的值由TI编程到每个AM335x 器件中,并且不能更改。

可能是你可以使用devmem2devmem2 0x44e10630但是可能依赖于没有CONFIG_STRICT_DEVMEM Linux操作系统。更糟的是,您可能需要编写一个小内核驱动程序来访问这些内存区域。

+0

您可以尝试使用像这个项目一样的专用系统:https://github.com/kaiwan/device-memory-readwrite – kaiwan

0

正如auselen所提到的那样,我只是尝试通过执行devmem2 0xfed000f0来读取高精度定时器芯片的主计数器寄存器中的值,并且尽管设置了CONFIG_STRICT_DEVMEM,但由于它是非RAM并因此可读/用户空间可写。