I am not sure how familiar you are with IIC. The address in the send/receive is not the register address you are trying to write/read. It is the peripheral address, each IIC peripheral has one.
Then in the data argument you will add both the register and data you want to write.
You can check a discussion here
And an example of send here
What board are you targeting? As an alternative, you could use device tree overlays to insert the driver of the AXI IIC IP in Linux and then you should be able to open the i2c device and even use python-periphery
If you decide to go this route, I can give you more pointers.
Do you have a work around for IIC addresses larger than 8 bit as imx219 (RPI Cam V2) needs to be configured using 16bit addresses.
I believe there is confusion in your understanding of how to use an i2c device with internal registers.
IMX219 uses 16 bits addresses for accessing it’s internal memory. However, it’s i2c address is still 8 bits.
Accessing a memory on i2c is done as such (pseudo-code):
Writing a register: I2C_write(device_address, [reg_addr_high, reg_addr_low, data0, data1, ...]);
Reading a register: I2C_write(device_address, [reg_addr_high, reg_addr_low]); I2C_read(device_address);