<?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>i.MX ProcessorsのトピックRe: SPI error</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/SPI-error/m-p/268003#M28294</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;You use spi_async(), yet your xfer_message variable is allocated on stack. spi_async() will return immediatelly and once you leave this function ... puff ... your xfer_message is gone as well. Thus the crash I suspect. Use spi_sync() instead.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sun, 02 Feb 2014 17:12:32 GMT</pubDate>
    <dc:creator>MarekVasut</dc:creator>
    <dc:date>2014-02-02T17:12:32Z</dc:date>
    <item>
      <title>SPI error</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/SPI-error/m-p/268002#M28293</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;I'm developping a driver for iMX28 to communicate with an external peripheral.&lt;/P&gt;&lt;P&gt;I use :&lt;/P&gt;&lt;P&gt;- iMX283&lt;/P&gt;&lt;P&gt;- Linux 2.6.35.3 with freescale patch&lt;/P&gt;&lt;P&gt;- bus SPI between the 2 devices.&lt;/P&gt;&lt;P&gt;The external peripheral is xr20m1280 &lt;A href="http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts/xr20m1280" title="http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts/xr20m1280"&gt;http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts/xr20m1280&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;the xr20m1280 have an internal fifo of 128bytes and I try to read this fifo. I write a driver with a read function :&lt;/P&gt;&lt;BLOCKQUOTE&gt;
&lt;P&gt;int xr20m1280_read (struct char_interface_data *data, size_t len)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct xr20m1280_data_t *private = container_of(data, &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct xr20m1280_data_t, char_interface_data);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct spi_device *spi = data-&amp;gt;spi;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char *p_buffer = data-&amp;gt;buffer;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char config_tab[] = {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XR20M1280_REG_LINE_CTRL, 0xBF,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XR20M1280_REG_FCTR, 0x70,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //XR20M1280_REG_TRIG,0x40,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XR20M1280_REG_TRIG,0x10,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XR20M1280_REG_LINE_CTRL, 0x03,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //XR20M1280_REG_EMSR, 0x05,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XR20M1280_REG_EMSR, 0x00,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XR20M1280_REG_IRQ_ENABLE, 0x01,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XR20M1280_REG_SPECIAL_FUNCT, 0x10,&lt;/P&gt;
&lt;P&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; XR20M1280_REG_FIFO_CTRL, 0x07, //pour le test, on fait un reset des fifo avant le debut des transfert&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; size_t remain_len;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned long irq_flags;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int ret, i, len_buf;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int read_time_out = 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char data_spi[128 + 1];&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /***************/&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned char reg_rhr = XR20M1280_SPI_WR_BYTE_2_RD(XR20M1280_REG_RHR);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct spi_transfer command_spi = {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .tx_buf = &amp;amp;reg_rhr,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .len = 1,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct spi_transfer data_xfer_spi_1 = {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .rx_buf = data_spi,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .len = 128,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct spi_message xfer_message;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /***************/&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gpio_direction_output(PINID_XR20M1280_FLOW_CTRL,1);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gpio_set_value(PINID_XR20M1280_TEST,1);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;sizeof(config_tab); i+=2)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; spi_write(spi, config_tab + i, 2);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gpio_set_value(PINID_XR20M1280_TEST,0);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private-&amp;gt;xfer_mode = XR20M1280_RX_MODE;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gpio_set_value(PINID_XR20M1280_TEST,1);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; read_time_out = 15000000;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret = gpio_get_value(PINID_XR20M1280_IRQ);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; read_time_out--;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; udelay(1);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!((0 == ret)||(read_time_out == 0)));&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (read_time_out == 0) {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk("time out (15s) !!!\n");&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spi_message_init(&amp;amp;xfer_message);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spi_message_add_tail(&amp;amp;command_spi, &amp;amp;xfer_message);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spi_message_add_tail(&amp;amp;data_xfer_spi_1, &amp;amp;xfer_message);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; spi_async(spi, &amp;amp;xfer_message);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; gpio_set_value(PINID_XR20M1280_TEST,0);&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;&lt;P&gt;When I try use the driver in user space, I have this error&lt;/P&gt;&lt;BLOCKQUOTE&gt;
&lt;P&gt;Internal error: Oops - undefined instruction: 0 [#1] PREEMPT&lt;BR /&gt;last sysfs file: /sys/devices/platform/mxs-spi.0/spi1.2/char_interface/char_interface1.2/v&lt;BR /&gt;Modules linked in:&lt;BR /&gt;CPU: 0&amp;nbsp;&amp;nbsp;&amp;nbsp; Not tainted&amp;nbsp; (2.6.35.3-g5577b2c-dirty #325)&lt;BR /&gt;PC is at 0xc3c64b94&lt;BR /&gt;LR is at mxs_spi_handle+0x288/0x310&lt;BR /&gt;pc : [&amp;lt;c3c64b94&amp;gt;]&amp;nbsp;&amp;nbsp;&amp;nbsp; lr : [&amp;lt;c0275878&amp;gt;]&amp;nbsp;&amp;nbsp;&amp;nbsp; psr: 80000013&lt;BR /&gt;sp : c3dd1f38&amp;nbsp; ip : c3dd1f08&amp;nbsp; fp : c3dd1f84&lt;BR /&gt;r10: 00000002&amp;nbsp; r9 : c3df7918&amp;nbsp; r8 : c3f7de78&lt;BR /&gt;r7 : c57fffff&amp;nbsp; r6 : c3f7de58&amp;nbsp; r5 : 00000000&amp;nbsp; r4 : c3f7de3c&lt;BR /&gt;r3 : c3c648d0&amp;nbsp; r2 : 00000003&amp;nbsp; r1 : 00000080&amp;nbsp; r0 : c3ce2e60&lt;BR /&gt;Flags: Nzcv&amp;nbsp; IRQs on&amp;nbsp; FIQs on&amp;nbsp; Mode SVC_32&amp;nbsp; ISA ARM&amp;nbsp; Segment kernel&lt;BR /&gt;Control: 0005317f&amp;nbsp; Table: 43f8c000&amp;nbsp; DAC: 00000017&lt;BR /&gt;Process mxs-spi.0 (pid: 958, stack limit = 0xc3dd0270)&lt;BR /&gt;Stack: (0xc3dd1f38 to 0xc3dd2000)&lt;BR /&gt;1f20:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 00000080 c3dd1f54&lt;BR /&gt;1f40: c3dd1f50 00000000 c3df7954 c0043c40 00000000 00000000 c0393b44 c3df7944&lt;BR /&gt;1f60: c3dd0000 c3df7940 c3dfbdc0 c02755f0 00000000 c3dfbdc8 c3dd1fc4 c3dd1f88&lt;BR /&gt;1f80: c005cd14 c0275600 c04c5f1c 00000000 c3c648a0 c00609fc c3dd1f98 c3dd1f98&lt;BR /&gt;1fa0: c3dd1fcc c3c23dc8 c3dfbdc0 c005cb80 00000000 00000000 c3dd1ff4 c3dd1fc8&lt;BR /&gt;1fc0: c006066c c005cb90 00000000 00000000 c3dd1fd0 c3dd1fd0 c3c23dc8 c00605e4&lt;BR /&gt;1fe0: c004c78c 00000013 00000000 c3dd1ff8 c004c78c c00605f4 00000000 00000000&lt;BR /&gt;Backtrace: &lt;BR /&gt;[&amp;lt;c02755f0&amp;gt;] (mxs_spi_handle+0x0/0x310) from [&amp;lt;c005cd14&amp;gt;] (worker_thread+0x194/0x25c)&lt;BR /&gt;[&amp;lt;c005cb80&amp;gt;] (worker_thread+0x0/0x25c) from [&amp;lt;c006066c&amp;gt;] (kthread+0x88/0x90)&lt;BR /&gt;[&amp;lt;c00605e4&amp;gt;] (kthread+0x0/0x90) from [&amp;lt;c004c78c&amp;gt;] (do_exit+0x0/0x6d8)&lt;BR /&gt; r7:00000013 r6:c004c78c r5:c00605e4 r4:c3c23dc8&lt;BR /&gt;Code: c3cae000 00000002 80208140 00000000 (ffffffff) &lt;BR /&gt;root@imx28evk:~# ---[ end trace be4809855772e467 ]---&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;&lt;P&gt;is there someone who know this problem ?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 30 Jan 2014 16:54:30 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/SPI-error/m-p/268002#M28293</guid>
      <dc:creator>victorien</dc:creator>
      <dc:date>2014-01-30T16:54:30Z</dc:date>
    </item>
    <item>
      <title>Re: SPI error</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/SPI-error/m-p/268003#M28294</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;You use spi_async(), yet your xfer_message variable is allocated on stack. spi_async() will return immediatelly and once you leave this function ... puff ... your xfer_message is gone as well. Thus the crash I suspect. Use spi_sync() instead.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sun, 02 Feb 2014 17:12:32 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/SPI-error/m-p/268003#M28294</guid>
      <dc:creator>MarekVasut</dc:creator>
      <dc:date>2014-02-02T17:12:32Z</dc:date>
    </item>
    <item>
      <title>Re: SPI error</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/SPI-error/m-p/268004#M28295</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks for your help.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;After my post I continued to search the solution ans I resolved the problem.&lt;/P&gt;&lt;P&gt;When you do a PSI transfer with spi_async, you need :&lt;/P&gt;&lt;P&gt;- create an handler function in your driver (for example &lt;EM&gt;xr20m1280_completion_handler&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;- &lt;/EM&gt;add this line after &lt;EM&gt;spi_message_init&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xfer_message.complete = xr20m1280_completion_handler;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xfer_message.context = NULL;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 03 Feb 2014 08:28:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/SPI-error/m-p/268004#M28295</guid>
      <dc:creator>victorien</dc:creator>
      <dc:date>2014-02-03T08:28:09Z</dc:date>
    </item>
  </channel>
</rss>

