Hi all,
Now I working on i2c driver for i.mx53 platform. In i2c_session interface I using Rpc_in_buf for transfer data between driver and client:
enum { MAX_BUFFER_SIZE = 256 }; typedef Genode::Rpc_in_buffer<MAX_BUFFER_SIZE> Byte_array;
virtual bool read(Genode::uint8_t address, Genode::uint8_t register, Byte_array &out) = 0;
virtual bool write(Genode::uint8_t address, Genode::uint8_t register, Byte_array const &in) = 0;
GENODE_RPC(Rpc_read, bool, read, Genode::uint8_t, Genode::uint8_t, Byte_array &); GENODE_RPC(Rpc_write, bool, write, Genode::uint8_t, Genode::uint8_t, Byte_array const &);
Write function transfer data to driver normally, but after read rpc call on client side the buffer content does not change.
Hello Nikolay,
you ran into the same issue as Pruthivi Raj
http://sourceforge.net/mailarchive/message.php?msg_id=28616670
twelve month ago.
On Wed, Dec 19, 2012 at 02:50:50PM +0400, Nikolay Golikov wrote:
enum { MAX_BUFFER_SIZE = 256 }; typedef Genode::Rpc_in_buffer<MAX_BUFFER_SIZE> Byte_array;
Rpc_in_buffer can only be used for _input_ parameters of RPC functions.
virtual bool read(Genode::uint8_t address, Genode::uint8_t register, Byte_array &out) = 0;
You may use a fixed-size struct for the out parameter here
struct Byte_array { char v[256]; };
which unfortunately leaves you sending all 256 bytes - significant or not - on reply to the RPC.
A good option for bulk-data interfaces like yours is synchronized usage of shared memory:
* Put input parameters into shared memory * Call RPC * Read output parameters from shared memory
A good example for this approach can be found in os/include/terminal_session/client.h etc.
Regards