C ++ конвертировать код в Python с помощью Ctypes и Mmap

Я пытаюсь преобразовать код 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) но это не работает, и я не мог найти что-либо в Интернете (возможно, я не искал это хорошо)
Можете ли вы помочь с этой проблемой или предложить мне несколько ссылок или учебных пособий?

0

Решение

Ты можешь использовать 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.

поддержка памяти нарезка так что вы можете просто написать:

mm[StartAddress:EndAddress] = BytesYouWantToWrite

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]