<?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>MQX Software SolutionsのトピックK70 SAI driver missing read and write functions</title>
    <link>https://community.nxp.com/t5/MQX-Software-Solutions/K70-SAI-driver-missing-read-and-write-functions/m-p/317738#M10129</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am trying to use the i2s_demo code on a K70 board and MQX 4.1.&amp;nbsp; It's all going well until the first write() to the sai1: device.&amp;nbsp; In the "play" shell command there is this loop:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_14025192277424143" jivemacro_uid="_14025192277424143"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Play a file */
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("&amp;nbsp; Playing a file...");

&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!feof(file_ptr))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; requested = fread(data, 1, block_size, file_ptr);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ferror(file_ptr) &amp;amp;&amp;amp; !(feof(file_ptr)))
&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; printf("\n&amp;nbsp; Error reading from a file %s.\n", argv[2]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&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; write(device_ptr, data, requested);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;

&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Line 13 above is going to end up calling _io_sai_int_write() below:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro _jivemacro_uid_14025192277175440 jive_macro_code" jivemacro_uid="_14025192277175440"&gt;
&lt;P&gt;_mqx_int _io_sai_int_write
(
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [IN] the handle returned from _fopen */
&amp;nbsp;&amp;nbsp;&amp;nbsp; MQX_FILE_PTR&amp;nbsp;&amp;nbsp;&amp;nbsp; fd_ptr,&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [IN] where the data are to be stored */
&amp;nbsp;&amp;nbsp;&amp;nbsp; char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *data_ptr,&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [IN] the number of bytes to read */
&amp;nbsp;&amp;nbsp;&amp;nbsp; _mqx_int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n
)
{&amp;nbsp; /* Body */
&amp;nbsp;&amp;nbsp;&amp;nbsp; IO_DEVICE_STRUCT_PTR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; io_dev_ptr;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IO_SAI_DEVICE_STRUCT_PTR io_sai_dev_ptr;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t result;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; io_dev_ptr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (IO_DEVICE_STRUCT_PTR)fd_ptr-&amp;gt;DEV_PTR;
&amp;nbsp;&amp;nbsp;&amp;nbsp; io_sai_dev_ptr = (void *)io_dev_ptr-&amp;gt;DRIVER_INIT_PTR;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; _lwsem_wait(&amp;amp;io_sai_dev_ptr-&amp;gt;LWSEM);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = (*io_sai_dev_ptr-&amp;gt;DEV_WRITE)(io_sai_dev_ptr, data_ptr, n);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; _lwsem_post(&amp;amp;io_sai_dev_ptr-&amp;gt;LWSEM);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&amp;nbsp; /* Endbody */&lt;/P&gt;

&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In line 22 in _io_sai_int_write() above, (*io_sai_dev_ptr-&amp;gt;DEV_WRITE) is &lt;SPAN style="color: #ff0000;"&gt;0x00000000&lt;/SPAN&gt; !!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;That's because in init_sai.c in the BSP the read and write function pointers are set to NULL:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="plain" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_14025192277088869" jivemacro_uid="_14025192277088869"&gt;
&lt;P&gt;const SAI_INIT_STRUCT _bsp_sai_init = 
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; "sai1:",
&amp;nbsp;&amp;nbsp;&amp;nbsp; _ksai_dma_init,
&amp;nbsp;&amp;nbsp;&amp;nbsp; _ksai_dma_deinit,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #ff0000;"&gt;NULL&lt;/SPAN&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #ff0000;"&gt;NU&lt;/SPAN&gt;&lt;SPAN style="color: #ff0000;"&gt;LL&lt;/SPAN&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp; _ksai_dma_ioctl,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;_bsp_ksai_init
};&lt;/P&gt;

&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What's going on with this demo?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Paul&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 11 Jun 2014 20:37:18 GMT</pubDate>
    <dc:creator>pbanta</dc:creator>
    <dc:date>2014-06-11T20:37:18Z</dc:date>
    <item>
      <title>K70 SAI driver missing read and write functions</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/K70-SAI-driver-missing-read-and-write-functions/m-p/317738#M10129</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am trying to use the i2s_demo code on a K70 board and MQX 4.1.&amp;nbsp; It's all going well until the first write() to the sai1: device.&amp;nbsp; In the "play" shell command there is this loop:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_14025192277424143" jivemacro_uid="_14025192277424143"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Play a file */
&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("&amp;nbsp; Playing a file...");

&amp;nbsp;&amp;nbsp;&amp;nbsp; while (!feof(file_ptr))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; requested = fread(data, 1, block_size, file_ptr);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ferror(file_ptr) &amp;amp;&amp;amp; !(feof(file_ptr)))
&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; printf("\n&amp;nbsp; Error reading from a file %s.\n", argv[2]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;
&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; write(device_ptr, data, requested);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;

&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Line 13 above is going to end up calling _io_sai_int_write() below:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro _jivemacro_uid_14025192277175440 jive_macro_code" jivemacro_uid="_14025192277175440"&gt;
&lt;P&gt;_mqx_int _io_sai_int_write
(
&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [IN] the handle returned from _fopen */
&amp;nbsp;&amp;nbsp;&amp;nbsp; MQX_FILE_PTR&amp;nbsp;&amp;nbsp;&amp;nbsp; fd_ptr,&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [IN] where the data are to be stored */
&amp;nbsp;&amp;nbsp;&amp;nbsp; char&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *data_ptr,&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* [IN] the number of bytes to read */
&amp;nbsp;&amp;nbsp;&amp;nbsp; _mqx_int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n
)
{&amp;nbsp; /* Body */
&amp;nbsp;&amp;nbsp;&amp;nbsp; IO_DEVICE_STRUCT_PTR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; io_dev_ptr;
&amp;nbsp;&amp;nbsp;&amp;nbsp; IO_SAI_DEVICE_STRUCT_PTR io_sai_dev_ptr;
&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t result;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; io_dev_ptr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (IO_DEVICE_STRUCT_PTR)fd_ptr-&amp;gt;DEV_PTR;
&amp;nbsp;&amp;nbsp;&amp;nbsp; io_sai_dev_ptr = (void *)io_dev_ptr-&amp;gt;DRIVER_INIT_PTR;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; _lwsem_wait(&amp;amp;io_sai_dev_ptr-&amp;gt;LWSEM);&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = (*io_sai_dev_ptr-&amp;gt;DEV_WRITE)(io_sai_dev_ptr, data_ptr, n);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; _lwsem_post(&amp;amp;io_sai_dev_ptr-&amp;gt;LWSEM);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; return result;&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;}&amp;nbsp; /* Endbody */&lt;/P&gt;

&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In line 22 in _io_sai_int_write() above, (*io_sai_dev_ptr-&amp;gt;DEV_WRITE) is &lt;SPAN style="color: #ff0000;"&gt;0x00000000&lt;/SPAN&gt; !!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;That's because in init_sai.c in the BSP the read and write function pointers are set to NULL:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="plain" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_14025192277088869" jivemacro_uid="_14025192277088869"&gt;
&lt;P&gt;const SAI_INIT_STRUCT _bsp_sai_init = 
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; "sai1:",
&amp;nbsp;&amp;nbsp;&amp;nbsp; _ksai_dma_init,
&amp;nbsp;&amp;nbsp;&amp;nbsp; _ksai_dma_deinit,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #ff0000;"&gt;NULL&lt;/SPAN&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #ff0000;"&gt;NU&lt;/SPAN&gt;&lt;SPAN style="color: #ff0000;"&gt;LL&lt;/SPAN&gt;,
&amp;nbsp;&amp;nbsp;&amp;nbsp; _ksai_dma_ioctl,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;_bsp_ksai_init
};&lt;/P&gt;

&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What's going on with this demo?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Paul&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 11 Jun 2014 20:37:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/K70-SAI-driver-missing-read-and-write-functions/m-p/317738#M10129</guid>
      <dc:creator>pbanta</dc:creator>
      <dc:date>2014-06-11T20:37:18Z</dc:date>
    </item>
    <item>
      <title>Re: K70 SAI driver missing read and write functions</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/K70-SAI-driver-missing-read-and-write-functions/m-p/317739#M10130</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Nevermind.&amp;nbsp; I made a mistake trying to use the I2S Demo code with the SAI DMA driver.&amp;nbsp; It's not meant to work together.&amp;nbsp; Use the sai_dma_demo, instead.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 05 Sep 2014 14:50:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/K70-SAI-driver-missing-read-and-write-functions/m-p/317739#M10130</guid>
      <dc:creator>pbanta</dc:creator>
      <dc:date>2014-09-05T14:50:51Z</dc:date>
    </item>
  </channel>
</rss>

