<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic IMX6ULL I2C in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/IMX6ULL-I2C/m-p/1858603#M223249</link>
    <description>&lt;P&gt;hello：&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;When I was using imx6ull's I2C feature recently, I noticed a strange problem with I2C continuous writing: When IMX6ULL continuously writes data to the slave machine, IMX6ULL waits for more than 20 us after each byte is written, and then writes another byte. I recently in the use of imx6ull's I2C function, I found that I2C continuous write has a very strange problem: when IMX6ULL continuous to write data to the slave machine, IMX6ULL every write a byte will wait for more than 20 us, and then write a byte. My request is: is there a way to put this more than 20 us without waiting, have been continuously written. Is that OK? Wait, keep writing. Is that OK?&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Lizh_0-1714682035496.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/276953iAD51EF9B57564EF5/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Lizh_0-1714682035496.png" alt="Lizh_0-1714682035496.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 02 May 2024 20:34:08 GMT</pubDate>
    <dc:creator>Lizh</dc:creator>
    <dc:date>2024-05-02T20:34:08Z</dc:date>
    <item>
      <title>IMX6ULL I2C</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/IMX6ULL-I2C/m-p/1858603#M223249</link>
      <description>&lt;P&gt;hello：&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;When I was using imx6ull's I2C feature recently, I noticed a strange problem with I2C continuous writing: When IMX6ULL continuously writes data to the slave machine, IMX6ULL waits for more than 20 us after each byte is written, and then writes another byte. I recently in the use of imx6ull's I2C function, I found that I2C continuous write has a very strange problem: when IMX6ULL continuous to write data to the slave machine, IMX6ULL every write a byte will wait for more than 20 us, and then write a byte. My request is: is there a way to put this more than 20 us without waiting, have been continuously written. Is that OK? Wait, keep writing. Is that OK?&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Lizh_0-1714682035496.png" style="width: 400px;"&gt;&lt;img src="https://community.nxp.com/t5/image/serverpage/image-id/276953iAD51EF9B57564EF5/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Lizh_0-1714682035496.png" alt="Lizh_0-1714682035496.png" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 02 May 2024 20:34:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/IMX6ULL-I2C/m-p/1858603#M223249</guid>
      <dc:creator>Lizh</dc:creator>
      <dc:date>2024-05-02T20:34:08Z</dc:date>
    </item>
    <item>
      <title>Re: IMX6ULL I2C</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/IMX6ULL-I2C/m-p/1859003#M223282</link>
      <description>&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Hi &lt;a href="https://community.nxp.com/t5/user/viewprofilepage/user-id/233024"&gt;@Lizh&lt;/a&gt;!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Thank you for contacting NXP Support!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Maybe the problem is in your code.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;How&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-preserver-spaces="true"&gt;you are&lt;/SPAN&gt;&lt;SPAN data-preserver-spaces="true"&gt;&amp;nbsp;writing on the i2c bus?&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;I recommend trying with i2c-tools&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Best Regards!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-preserver-spaces="true"&gt;Chavira&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 03 May 2024 15:07:53 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/IMX6ULL-I2C/m-p/1859003#M223282</guid>
      <dc:creator>Chavira</dc:creator>
      <dc:date>2024-05-03T15:07:53Z</dc:date>
    </item>
    <item>
      <title>Re: IMX6ULL I2C</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/IMX6ULL-I2C/m-p/1864568#M223648</link>
      <description>&lt;DIV&gt;int cs_i2c_byte_read(struct haptic *cs_haptic, uint8_t reg_addr, uint8_t * buf, uint32_t len)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;int ret = -1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;int i = CS_RETRY_TIMES;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;struct i2c_msg msg[2];&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;struct i2c_adapter *adapter = cs_haptic-&amp;gt;i2c-&amp;gt;adapter;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (buf == NULL || len == 0) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;log_err(" input param is invalid");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return -1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/*send reg addr*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg[0].addr = cs_haptic-&amp;gt;i2c-&amp;gt;addr;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg[0].flags = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg[0].buf = &amp;amp;reg_addr;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg[0].len = 1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;/*read reg*/&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg[1].addr = cs_haptic-&amp;gt;i2c-&amp;gt;addr;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg[1].flags = I2C_M_RD;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg[1].buf = buf;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg[1].len = len;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;mutex_lock(&amp;amp;i2c_rw_lock);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;do {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;ret = i2c_transfer(adapter, msg, sizeof(msg) / sizeof(struct i2c_msg));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (ret &amp;lt; 0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;log_err("read failed: %d", ret);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;else&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;i--;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;} while (i &amp;gt; 0);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;mutex_unlock(&amp;amp;i2c_rw_lock);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return ret;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;int cs_i2c_byte_write(struct haptic *cs_haptic, uint8_t reg_addr, uint8_t * buf, uint32_t len)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;int32_t ret = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;uint8_t *data = NULL;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;int i = CS_RETRY_TIMES;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;struct i2c_msg msg;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;struct i2c_adapter *adapter = cs_haptic-&amp;gt;i2c-&amp;gt;adapter;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (buf == NULL || len == 0) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;log_err("input param is invalid");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return -1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;data = kmalloc(len + 1, GFP_KERNEL);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (data == NULL) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return -ENOMEM;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;data[0] = reg_addr;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;memcpy(&amp;amp;data[1], buf, len);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg.addr = cs_haptic-&amp;gt;i2c-&amp;gt;addr;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg.flags = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg.buf = data;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;msg.len = len + 1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;mutex_lock(&amp;amp;i2c_rw_lock);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;do {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;ret = i2c_transfer(adapter, &amp;amp;msg, 1);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (ret &amp;lt; 0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;log_err("write failed: %d", ret);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;else&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;break;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;i--;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;} while (i &amp;gt; 0);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;mutex_unlock(&amp;amp;i2c_rw_lock);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;kfree(data);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return ret;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;int cs_i2c_one_byte_write(struct haptic *cs_haptic, uint8_t reg_addr, uint8_t data)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;uint8_t temp = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;temp = data;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return cs_i2c_byte_write(cs_haptic,reg_addr, &amp;amp;temp, 0x01);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;int cs_write_sram(struct haptic *cs_haptic, uint8_t reg_addr, uint8_t *buf, uint32_t len){&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;uint8_t *data = NULL;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;int ret = -1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (buf == NULL || len == 0) {&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;log_err("input param is invalid");&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return -1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;data = kmalloc(len + 1, GFP_KERNEL);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;data[0] = reg_addr;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;memcpy(&amp;amp;data[1], buf, len);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;ret = i2c_master_send(cs_haptic-&amp;gt;i2c, data, len + 1);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;if (ret &amp;lt; 0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;log_err("i2c write sram err:%d",ret);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;kfree(data);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return ret;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;}&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/DIV&gt;&lt;DIV&gt;The i2c_transfer function is actually implemented by your I2C controller driver，It's not my code. I'm calling your underlying interface. The i2c_transfer function actually calls your driver function i2c_imx_xfer, so this should not be my code problem, please help to look at it, thank you.&lt;/DIV&gt;</description>
      <pubDate>Mon, 13 May 2024 15:03:12 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/IMX6ULL-I2C/m-p/1864568#M223648</guid>
      <dc:creator>Lizh</dc:creator>
      <dc:date>2024-05-13T15:03:12Z</dc:date>
    </item>
  </channel>
</rss>

