<?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 Re: Need help on GPMI write page ( BCH ) in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/Need-help-on-GPMI-write-page-BCH/m-p/1685925#M209074</link>
    <description>&lt;P&gt;Hello,&lt;BR /&gt;&lt;BR /&gt;Could you share the i.MX device that you are using?&lt;BR /&gt;&lt;BR /&gt;Best regards,&lt;BR /&gt;Aldo.&lt;/P&gt;</description>
    <pubDate>Tue, 11 Jul 2023 17:15:28 GMT</pubDate>
    <dc:creator>AldoG</dc:creator>
    <dc:date>2023-07-11T17:15:28Z</dc:date>
    <item>
      <title>Need help on GPMI write page ( BCH )</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Need-help-on-GPMI-write-page-BCH/m-p/1685849#M209066</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;I'm currently developping a baremetal application using GPMI. The functions read_raw and write_raw, read_page and some others are working. Now I want to develop the write_page function but I doesn't work properly. I've ge GPMI bch interrupt rising but nothing appends on the data of the NAND. Can someone have a look to my function ? :&lt;/P&gt;&lt;DIV&gt;int8_t GPMI_WritePage(uint32_t p_PageNumber, uint8_t * p_Buffer)&lt;/DIV&gt;&lt;DIV&gt;{&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;dmaCmd_t l_DescCle1Address, l_DescCle2;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;dmaCmd_t l_DescWaitForReady1Wait, l_DescWaitForReady1Sense;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;dmaCmd_t l_DescWaitForReady2Wait, l_DescWaitForReady2Sense;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;dmaCmd_t l_DescTerminatorSuccess, l_DescTerminatorFail;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;dmaCmd_t l_DescCommandAddress, l_DescReadResult;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;dmaCmd_t l_DescWriteData;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;uint8_t l_cle1AddressBuffer[1+MAX_ROWS+MAX_COLUMNS] __attribute__((aligned(4)));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;uint8_t l_cle2Buffer __attribute__((aligned(4)));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;uint8_t l_commandAddressBuffer[2] __attribute__((aligned(4)));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;uint8_t l_StatusResult __attribute__((aligned(4)));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;uint8_t oob[64] = {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;portBaseType xWasRunningPrivileged;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;g_IsDmaInterruptNeeded = false;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_cle2Buffer = NandCommandCode_WritePage;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_cle1AddressBuffer[0] = NandCommandCode_SerialDataInput;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_cle1AddressBuffer[1] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_cle1AddressBuffer[2] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_cle1AddressBuffer[3] = p_PageNumber &amp;amp; 0xff;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_cle1AddressBuffer[4] = (p_PageNumber &amp;gt;&amp;gt; &lt;LI-EMOJI id="lia_smiling-face-with-sunglasses" title=":smiling_face_with_sunglasses:"&gt;&lt;/LI-EMOJI&gt; &amp;amp; 0xFF;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_cle1AddressBuffer[5] = (p_PageNumber &amp;gt;&amp;gt; 16) &amp;amp; 0xFF;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle1Address.data = (BF_APBH_CHn_CMD_XFER_COUNT(6)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_CMDWORDS(3)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_HALTONTERMINATE(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_WAIT4ENDCMD(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_SEMAPHORE(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_NANDLOCK(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_CHAIN(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(APBH_CHn_CMD, COMMAND, DMA_READ));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle1Address.address = (uint32_t)&amp;amp;l_cle1AddressBuffer;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Need to set CLE high, then send command, then clear CLE, set ALE high&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// send # address bytes (Column then row).&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Address increment is only enabled if there is at least one address byte.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle1Address.pio_words[0] = (BV_FLD(GPMI_CTRL0, COMMAND_MODE, WRITE)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_WORD_LENGTH(BV_GPMI_CTRL0_WORD_LENGTH__8_BIT)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_LOCK_CS(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_CS(NAND_CS)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(GPMI_CTRL0, ADDRESS, NAND_CLE)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_ADDRESS_INCREMENT(BV_GPMI_CTRL0_ADDRESS_INCREMENT__ENABLED)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_XFER_COUNT(6));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle1Address.pio_words[1] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle1Address.pio_words[2] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle1Address.next = &amp;amp;l_DescWriteData;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// nxt pointer is not set here&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWriteData.data = BV_FLD(APBH_CHn_CMD, COMMAND, NO_DMA_XFER) | BF_APBH_CHn_CMD_CHAIN(1) |&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;BF_APBH_CHn_CMD_WAIT4ENDCMD(1) | BF_APBH_CHn_CMD_SEMAPHORE(1) | BF_APBH_CHn_CMD_CMDWORDS(6);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWriteData.address = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWriteData.pio_words[0] =&amp;nbsp; (BV_FLD(GPMI_CTRL0, COMMAND_MODE, WRITE)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_WORD_LENGTH(BV_GPMI_CTRL0_WORD_LENGTH__8_BIT)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_CS(NAND_CS)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(GPMI_CTRL0, ADDRESS, NAND_DATA));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWriteData.pio_words[1] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWriteData.pio_words[2] = (BV_FLD(GPMI_ECCCTRL, ENABLE_ECC, ENABLE) |&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;BV_FLD(GPMI_ECCCTRL, ECC_CMD, ENCODE) |&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;BV_GPMI_ECCCTRL_BUFFER_MASK__BCH_PAGE);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWriteData.pio_words[3] = 2048 + 64 ;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWriteData.pio_words[4] = (uint32_t)p_Buffer;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWriteData.pio_words[5] = (uint32_t)oob;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWriteData.next = &amp;amp;l_DescCle2;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle2.address = (uint32_t)&amp;amp;l_cle2Buffer;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Need to set CLE high, then send command, then clear CLE, set ALE high&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// send # address bytes (Column then row).&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Address increment is only enabled if there is at least one address byte.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle2.pio_words[0] = (BV_FLD(GPMI_CTRL0, COMMAND_MODE, WRITE)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_WORD_LENGTH(BV_GPMI_CTRL0_WORD_LENGTH__8_BIT)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_LOCK_CS(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_CS(NAND_CS)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(GPMI_CTRL0, ADDRESS, NAND_CLE)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_ADDRESS_INCREMENT(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_XFER_COUNT(1));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle2.pio_words[1] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle2.pio_words[2] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCle2.next = &amp;amp;l_DescWaitForReady1Wait;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// First we want to wait for Ready. Set GPMI wait for ready.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady1Wait.next = &amp;amp;l_DescWaitForReady1Sense;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady1Wait.data = (BF_APBH_CHn_CMD_CMDWORDS(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_HALTONTERMINATE(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_WAIT4ENDCMD(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_NANDWAIT4READY(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_NANDLOCK(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_CHAIN(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(APBH_CHn_CMD, COMMAND, NO_DMA_XFER));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady1Wait.address = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady1Wait.pio_words[0] = (BV_FLD(GPMI_CTRL0, COMMAND_MODE, WAIT_FOR_READY)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_WORD_LENGTH(BV_GPMI_CTRL0_WORD_LENGTH__8_BIT)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(GPMI_CTRL0, ADDRESS, NAND_DATA)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_CS(NAND_CS));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady1Sense.data = (BF_APBH_CHn_CMD_CMDWORDS(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_HALTONTERMINATE(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_SEMAPHORE(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_NANDLOCK(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_CHAIN(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(APBH_CHn_CMD, COMMAND, DMA_SENSE));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady1Sense.address = (uint32_t)&amp;amp;l_DescTerminatorFail;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady1Sense.pio_words[0] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady1Sense.next = &amp;amp;l_DescTerminatorSuccess;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// No next descriptor in the chain.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorSuccess.next = &amp;amp;l_commandAddressBuffer;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorFail.next = NULL;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Decrement semaphore, set IRQ, no DMA transfer.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorSuccess.data = (BF_APBH_CHn_CMD_IRQONCMPLT(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_WAIT4ENDCMD(0) //1)&amp;nbsp; &amp;nbsp;XXX changed on MX6&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_SEMAPHORE(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(APBH_CHn_CMD, COMMAND, NO_DMA_XFER));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// The failure descriptor uses exactly the same DMA command as success.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorFail.data = l_DescTerminatorSuccess.data;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// The bar holds the result code, either success or an error code. It is up to&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// the DMA handling code to read the result code out of the APBH register.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorSuccess.address = (void *)SUCCESS;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorFail.address = (void *)FAIL;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_commandAddressBuffer[0] = NandCommandCode_ReadStatus;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_commandAddressBuffer[1] = 0x00;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady2Wait.next = &amp;amp;l_DescWaitForReady1Sense;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady2Wait.data = (BF_APBH_CHn_CMD_CMDWORDS(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_HALTONTERMINATE(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_WAIT4ENDCMD(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_NANDWAIT4READY(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_NANDLOCK(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_CHAIN(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(APBH_CHn_CMD, COMMAND, NO_DMA_XFER));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady2Wait.address = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady2Wait.pio_words[0] = (BV_FLD(GPMI_CTRL0, COMMAND_MODE, WAIT_FOR_READY)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_WORD_LENGTH(BV_GPMI_CTRL0_WORD_LENGTH__8_BIT)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(GPMI_CTRL0, ADDRESS, NAND_DATA)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_CS(NAND_CS));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady2Sense.data = (BF_APBH_CHn_CMD_CMDWORDS(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_HALTONTERMINATE(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_SEMAPHORE(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_NANDLOCK(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_CHAIN(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(APBH_CHn_CMD, COMMAND, DMA_SENSE));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady2Sense.address = (uint32_t)&amp;amp;l_DescTerminatorFail;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady2Sense.pio_words[0] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescWaitForReady2Sense.next = &amp;amp;l_DescCommandAddress;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;//&amp;nbsp; &amp;nbsp; tx_dma.nxt = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCommandAddress.data = (BF_APBH_CHn_CMD_XFER_COUNT(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_CMDWORDS(3)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_HALTONTERMINATE(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_WAIT4ENDCMD(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_SEMAPHORE(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_NANDLOCK(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_CHAIN(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(APBH_CHn_CMD, COMMAND, DMA_READ));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCommandAddress.address = (uint32_t)&amp;amp;l_commandAddressBuffer;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Need to set CLE high, then send command, then clear CLE, set ALE high&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// send # address bytes (Column then row).&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Address increment is only enabled if there is at least one address byte.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCommandAddress.pio_words[0] = (BV_FLD(GPMI_CTRL0, COMMAND_MODE, WRITE)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_WORD_LENGTH(BV_GPMI_CTRL0_WORD_LENGTH__8_BIT)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_LOCK_CS(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_CS(NAND_CS)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(GPMI_CTRL0, ADDRESS, NAND_CLE)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_ADDRESS_INCREMENT(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_XFER_COUNT(1));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCommandAddress.pio_words[1] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCommandAddress.pio_words[2] = 0;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescCommandAddress.next = &amp;amp;l_DescReadResult;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescReadResult.data = (BF_APBH_CHn_CMD_XFER_COUNT( NAND_READ_ID_RESULT_SIZE )&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_CMDWORDS(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_HALTONTERMINATE(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_WAIT4ENDCMD(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_SEMAPHORE(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_NANDLOCK(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_CHAIN(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(APBH_CHn_CMD, COMMAND, DMA_WRITE));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Save Data into buffer.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;assert((((uint32_t)l_StatusResult) &amp;amp; 0x3) == 0);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescReadResult.address = (uint32_t)&amp;amp;l_StatusResult;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Setup GPMI for 8-bit read.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescReadResult.pio_words[0] = (BV_FLD(GPMI_CTRL0, COMMAND_MODE, READ)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(GPMI_CTRL0, WORD_LENGTH, 8_BIT)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_CS(NAND_CS)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_LOCK_CS(0)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(GPMI_CTRL0, ADDRESS, NAND_DATA)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_GPMI_CTRL0_XFER_COUNT(NAND_READ_STATUS_RESULT_SIZE));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescReadResult.next = &amp;amp;l_DescTerminatorSuccess;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// No next descriptor in the chain.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorSuccess.next = NULL;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorFail.next = NULL;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// Decrement semaphore, set IRQ, no DMA transfer.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorSuccess.data = (BF_APBH_CHn_CMD_IRQONCMPLT(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_WAIT4ENDCMD(0) //1)&amp;nbsp; &amp;nbsp;XXX changed on MX6&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BF_APBH_CHn_CMD_SEMAPHORE(1)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;| BV_FLD(APBH_CHn_CMD, COMMAND, NO_DMA_XFER));&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// The failure descriptor uses exactly the same DMA command as success.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorFail.data = l_DescTerminatorSuccess.data;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// The bar holds the result code, either success or an error code. It is up to&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;// the DMA handling code to read the result code out of the APBH register.&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorSuccess.address = (void *)SUCCESS;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;l_DescTerminatorFail.address = (void *)FAIL;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;xWasRunningPrivileged = xPortRaisePrivilege();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;vMmuArmLevel1DataCacheCleanAndInvalidate();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;vMmuArmLevel2DataCacheCleanAndInvalidate();&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;portRESTORE_PRIVILEGE( xWasRunningPrivileged );&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;DMA_Run(&amp;amp;l_DescCle1Address);&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;return (l_StatusResult &amp;amp; 1) == 0 ? SUCCESS : -1;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;}&lt;/DIV&gt;&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV&gt;Best regards&lt;/DIV&gt;</description>
      <pubDate>Tue, 11 Jul 2023 14:21:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Need-help-on-GPMI-write-page-BCH/m-p/1685849#M209066</guid>
      <dc:creator>Babylone</dc:creator>
      <dc:date>2023-07-11T14:21:20Z</dc:date>
    </item>
    <item>
      <title>Re: Need help on GPMI write page ( BCH )</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Need-help-on-GPMI-write-page-BCH/m-p/1685925#M209074</link>
      <description>&lt;P&gt;Hello,&lt;BR /&gt;&lt;BR /&gt;Could you share the i.MX device that you are using?&lt;BR /&gt;&lt;BR /&gt;Best regards,&lt;BR /&gt;Aldo.&lt;/P&gt;</description>
      <pubDate>Tue, 11 Jul 2023 17:15:28 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Need-help-on-GPMI-write-page-BCH/m-p/1685925#M209074</guid>
      <dc:creator>AldoG</dc:creator>
      <dc:date>2023-07-11T17:15:28Z</dc:date>
    </item>
    <item>
      <title>Re: Need help on GPMI write page ( BCH )</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Need-help-on-GPMI-write-page-BCH/m-p/1685945#M209076</link>
      <description>Hello,&lt;BR /&gt;&lt;BR /&gt;I’m using IMX6 solo processor.&lt;BR /&gt;&lt;BR /&gt;Regards,</description>
      <pubDate>Tue, 11 Jul 2023 18:10:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Need-help-on-GPMI-write-page-BCH/m-p/1685945#M209076</guid>
      <dc:creator>Babylone</dc:creator>
      <dc:date>2023-07-11T18:10:10Z</dc:date>
    </item>
    <item>
      <title>Re: Need help on GPMI write page ( BCH )</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/Need-help-on-GPMI-write-page-BCH/m-p/1686935#M209172</link>
      <description>&lt;P&gt;Hello,&lt;BR /&gt;&lt;BR /&gt;Unfortunately we do not support bare metal code, but you may take as a reference our GPMI driver code for Linux, available here:&lt;BR /&gt;&lt;A href="https://github.com/nxp-imx/linux-imx/blob/lf-6.1.y/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c" target="_blank"&gt;https://github.com/nxp-imx/linux-imx/blob/lf-6.1.y/drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;Best regards,&lt;BR /&gt;Aldo.&lt;/P&gt;</description>
      <pubDate>Thu, 13 Jul 2023 00:22:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/Need-help-on-GPMI-write-page-BCH/m-p/1686935#M209172</guid>
      <dc:creator>AldoG</dc:creator>
      <dc:date>2023-07-13T00:22:18Z</dc:date>
    </item>
  </channel>
</rss>

