On Wednesday, November 13, 2013 1:31:49 PM UTC-5, krishna...@gmail.com wrote:
> Hello,
> 
> I am trying to build a structure to be passed down to an I2C device driver. 
> The driver expects a struct that has a data array of size 512 bytes among 
> other things. This is my code -
> 
>     rd_wr       = 0x0   # Read operation
>     i2c_addr    = addr
>     mux         = mux_sel
>     multi_len   = count
>     cmd         = 0x0 
>     i2c_inst_type = CHEL_I2C_AUTO_RD_TYPE_5
>     flag        = CHEL_I2C_AUTO_VALID
>     status      = 0x0 
>     data        = array.array('B', (0 for x in range(0,512)))
> 
>     os_inst_bytes     = (struct.pack('B', rd_wr)          +
>                          struct.pack('B', i2c_addr)       +
>                          struct.pack('B', mux)            +
>                          struct.pack('B', multi_len)      +   
>                          struct.pack('B', cmd)            +
>                          struct.pack('B', i2c_inst_type)  +
>                          struct.pack('B', flag)           +
>                          struct.pack('I', status)         +   
>                          struct.pack('512B', data))
> 
>     #Convert to byte array
>     os_inst = bytearray(os_inst_bytes)
> 
>     ret = fcntl.ioctl(self._dev_fd,
>                           self.__IOWR(FXCB_FPGAIO_I2C_AUTO_OS_INST),
>                           os_inst, 1)
> 
> I get an error like this -
> 
> 591                              struct.pack('B', flag)           +
> 592                              struct.pack('I', status)         +
> 
> --> 593 struct.pack('512B', data))
> 
> error: pack requires exactly 512 arguments
> 
> In [1]:
> 
> Even though data is a 512 element array, it is not treat as such in this 
> struct.pack. The data field is used to return data from the driver. I should 
> be able to unpack the struct os_inst and read the data buffer after the IOCTL 
> call. How can I achieve this ?
> 
> Thanks in advance!

To make a 512-byte field in struct, use '512s' with a data value of ''.  It 
will zero-pad the result and give you 512 zero bytes.  Also, you can use 
multiple format specifiers in one struct.pack call:

os_inst_bytes = struct.pack('7BI512s', rd_wr, i2c_addr, muc, multi_len, cmd, 
i2c_inst_type, flag, status, '')

Lastly, I suspect the value returned from struct.pack is byte-string enough for 
the ioctl call, no need to use bytearray.

--Ned.
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to