On 6 August 2015 at 13:00, Lars-Peter Clausen <lars@xxxxxxxxxx> wrote: > On 08/06/2015 12:42 PM, Peter Meerwald wrote: >> Hello, >> >>> I am sure at least some of you were faced to split a u16 or u32 value >>> in u8 array without being affected by host endianness. My search >>> turned empty for a standardized function for this task, but this seems >>> quite improbable. My task is to send 16 bit LE data through i2c. >>> >>> I am looking for something like: >>> static void u16_to_u8_array(u16 value, u8 *array) >>> { >>> *array = cpu_to_le16(value) >> 8; >>> *(++array) = (u8) cpu_to_le16(value); >>> } >> >> how about >> >> static void u16_to_le16_array(u16 value, __le16 *array) >> { >> *array++ = cpu_to_le16(value); >> } >> >> and calling it with a cast if need be, such as >> >> char *u8array; >> u16_to_le16_array(123, (__le16 *) u8array) >> >> an issue could be alignment of the u8array > > There is put_unaligned_le16() and friends for this situation where the > target buffer is just a generic bytestream. This is architecture optimized, > so if the architecture supports unaligned access it will just do a store, if > it doesn't it will split the operation into multiple stores. > >> >> I'd try to avoid u8 altogether and work with le16 as a datatype > > That seems to be the best solution in this case. So i2c_master_send takes a char buf as input, and if I would send a le16 array[2] then the cast would nicely fit values it into that. Thanks for the put_unaligned_le16() hint - exactly what I wanted, but will investigate the best solution in this case as it seems to require a lot less lines. -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html