Hi Peter > > >>>>> +static int ucsi_ccg_send_data(struct ucsi_ccg *uc) { > > >>>>> + unsigned char buf1[USBC_MSG_OUT_SIZE]; > > >>>>> + unsigned char buf2[USBC_CONTROL_SIZE]; > > >>>>> + int status; > > >>>>> + u16 rab; > > >>>>> + > > >>>>> + memcpy(buf1, (u8 *)(uc->ppm.data) + > USBC_MSG_OUT_OFFSET, > > >>>> sizeof(buf1)); > > >>>>> + memcpy(buf2, (u8 *)(uc->ppm.data) + > USBC_CONTROL_OFFSET, > > >>>>> +sizeof(buf2)); > > >>>> > > >>>> Hmm, now that I see what this function does, instead of just > > >>>> seeing a bunch of magic numbers, I wonder why you make copies > > >>>> instead of feeding the correct section of the ppm.data buffer > > >>>> directly to ccg_write, like you do below for recv? > > >>> Ok, will fix. > > >> > > >> Hmm, now that I see this again, it makes me wonder why you > > >> complained about copying the buffer to fix the misunderstanding of > > >> the i2c_transfer interface, when you already copy the buffer in the first > place? > > > Copy is indeed not needed. I will fix it in next version. > > > We will have to do copy in ccg_write()if we try to combine two write > > > i2c_msg into one and I want to rather stay with two i2c_msg to avoid > copy. > > > Also master_xfer() will become tricky since rab write for read alsp > > > has to go > > first. > > > > You are stuck with the construction of the extended buffer. See my > > mail in the > > 1/2 thread. > > > > >>>>> + rab = > CCGX_I2C_RAB_UCSI_DATA_BLOCK(USBC_VERSION_OFFSET); > > >>>>> + status = ccg_read(uc, rab, (u8 *)(uc->ppm.data) + > > >>>> USBC_VERSION_OFFSET, > > >>>>> + USBC_VERSION_SIZE); > > >>>> > > >>>> E.g. > > >>>> rab = CCGX_I2C_RAB_UCSI_DATA_BLOCK(offsetof(struct ucsi_data, > > >>>> version)); > > >>>> status = ccg_read(uc, rab, (u8 *)&uc->ppm.data->version, > > >>>> sizeof(uc->ppm.data->version)); > > >>>> > > >>>> Hmm, but this highlights that you are not doing any endian > > >>>> conversion of the fields in that struct as you read/write it. > > >>> > > >>>> Do you need to in case you have an endian mismatch? > > >>> Looks like don't need it. I have tested it and it works as is. > > >> > > >> Yeah, but have you tested the driver on a machine with the other byte- > sex? > > > No, I think better to convert to desired endian. > > > > The device has a specific endianess. The host cpu has a specific endianess. > > You transfer data byte-by-byte to/from a struct that appears to have > > multi- byte integers, e.g. the 16-bit version. You do not do any > > conversion that I see and you report that it works. So, there are two > > cases. Either > > > > 1. your host cpu and the device has the same endianess, and it all just > > works by accident > > > > or > > > > 2. whatever is consuming the ppm data does the endian conversion for you > > on "the other side", and it all just works by design. > > > > I have no idea which it is since I know nothing about whatever handles > > the ppm data on the other side of that ucsi_register_ppm call. So, I asked. > UCSI specification requires the ppm data to be in little-endian format. > > Below is from the UCSI specification. > "All multiple byte fields in this specification are interpreted as and moved > over the bus in little-endian order, i.e., LSB to MSB unless otherwise > specified"
Do we still need any conversion here? The ppm data is now directly fed for read and write both and rab should be in little endian as per macro. #define CCGX_RAB_UCSI_DATA_BLOCK(offset) (0xf000 | ((offset) & 0xff)) Thanks Ajay -- nvpublic -- > > > > Cheers, > > Peter