C ++ конвертировать код в Python с помощью Ctypes и Mmap - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь преобразовать код C ++ в Python.

int fd_vdma = open("/dev/mem", O_RDWR|O_SYNC);  // open uiox device for vdma access
    if (fd_vdma < 1) {
        printf("Invalid mem device file\n");
    }
    // mmap the vdma device for vdma access

    unsigned int *ptr_vdma;
    ptr_vdma = (unsigned int*)mmap(NULL, VDMA_MAP_SIZE,PROT_READ|PROT_WRITE, 
    MAP_SHARED, fd_vdma, VDMA_ADDR);
    printf("DMA 1 virtual address: 0x%08x \n",ptr_vdma);

    *(ptr_vdma+5) = FRBUF_ADDR_0;
    *(ptr_vdma+7) = 2;  // use internal fifos to trigger xfer
    *(ptr_vdma+8) = 20480;
    *(ptr_vdma+6) = (75 << 16) + (HORIZ_PIXELS_SMALL+75);
    *(ptr_vdma+0x0D) = 200;  // no. FIFO threshhold .. max.. 240

Я уже сделал,

# vdm memory check
try:
    fd_vdm_path = "/dev/mem"
    mode = "rb+"
    fd_vdm =  open(fd_vdm_path, mode)
    # print(fd_vdm.fileno())
    print("[INFO] " + fd_vdm_path + " checked")

except Exception as error:
    print("{}".format(error))

 # mmap the VDMA device for VDM access
vdma_buf = mmap.mmap(fd_vdm.fileno(), int(VDMA_MAP_SIZE), 
mmap.MAP_SHARED, mmap.PROT_READ|mmap.PROT_WRITE, 0)

ptr_vdm = ctypes.c_uint.from_buffer(vdma_buf)
print(type(ctypes.addressof(ptr_vdm)))
print("[INFO] " + fd_vdm_path + " has allocated virtual address : " + 
hex(ctypes.addressof(ptr_vdm)))

, но я застрял здесь, я не знаю, как выполнитьниже операций в Python.

*(ptr_vdma+5) = FRBUF_ADDR_0;
*(ptr_vdma+7) = 2;  // use internal fifos to trigger xfer
*(ptr_vdma+8) = 20480;
*(ptr_vdma+6) = (75 << 16) + (HORIZ_PIXELS_SMALL+75);
*(ptr_vdma+0x0D) = 200;  // no. FIFO threshhold .. max.. 240

Я пытался vdma_buf.write(FRBUF_ADDR_0), но это не работает, и я не мог найти что-либо в Интернете (возможно, я не искал это хорошо), можете ли вы помочь с этимпроблема или еще предложить мне какие-нибудь ссылки или учебники?

1 Ответ

0 голосов
/ 13 октября 2018

Вы можете использовать memoryview и struct.pack:

...
mm = memoryview(vdma_buf)

mm[5*4:6*4] = struct.pack("I", FRBUF_ADDR_0)
mm[7*4:8*4] = struct.pack("I", 2)
mm[8*4:9*4] = struct.pack("I", 20480)
mm[6*4:7*4] = struct.pack("I", (75 << 16) + (HORIZ_PIXELS_SMALL+75))
mm[0x0D*4:0x0E*4] = struct.pack("I", 200)

memoryview представляет последовательность байтов, и если вы хотите записать какой-либо другой тип в память, вы должны преобразовать его в байты, используя struct.pack.

Итак, допустим, вы хотите написать беззнаковое целое с индексом N .Сначала вы вызываете struct.pack("I", ...), чтобы получить представление байтов в int.Затем вы должны рассчитать адрес памяти назначения.Поскольку размер unsigned int составляет 4 байта, адрес равен N * 4 .

memoryview поддерживает нарезку , поэтому вы можете просто написать:

mm[StartAddress:EndAddress] = BytesYouWantToWrite

, где StartAddress равен N * 4, а EndAddress равен (N + 1) * 4

...