<?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 MPU read problem in iMX28 in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/MPU-read-problem-in-iMX28/m-p/249759#M22527</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi, All&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In my driver of LCDIF as MPU read/write bus in imx28, the read operation with following implement can correctly run 8 times, then no read bus cycle anymore.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static unsigned int mpu_data_read(struct em9287_isa_dev *devp)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned int i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; u32 value;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* wait until RUN bit =&amp;gt; 0 if necessary */&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (readl(devp-&amp;gt;base + LCDC_CTRL) &amp;amp; CTRL_RUN)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; while (readl(devp-&amp;gt;base + LCDC_CTRL) &amp;amp; CTRL_RUN) ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // disable master mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_MASTER, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // set READ_WRITEB bit -&amp;gt; read mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_READ_WRITEB, devp-&amp;gt;base + LCDC_CTRL + REG_SET);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // setup transfer count&lt;/P&gt;&lt;P&gt;&amp;nbsp; value = (1 &amp;lt;&amp;lt; 16) | devp-&amp;gt;dat_len;&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(value, devp-&amp;gt;base + LCDC_TRANSFER_COUNT);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* setup physical address */&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(devp-&amp;gt;read_dma_addr, devp-&amp;gt;base + LCDC_CUR_BUF);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* set RUN bit */&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_RUN, devp-&amp;gt;base + LCDC_CTRL + REG_SET);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;&amp;nbsp; i = devp-&amp;gt;dat_len;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; devp-&amp;gt;dat_len = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return i;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Please let me know how to setup a right procedure to read if anybody has similar experience. Thanks!&lt;/P&gt;&lt;P&gt;BTW, the following is write operation which is always right.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static void mpu_data_write(struct em9287_isa_dev *devp)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; u32 value;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* wait until RUN bit =&amp;gt; 0 if necessary */&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (readl(devp-&amp;gt;base + LCDC_CTRL) &amp;amp; CTRL_RUN)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; while (readl(devp-&amp;gt;base + LCDC_CTRL) &amp;amp; CTRL_RUN) ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // enable master mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_MASTER, devp-&amp;gt;base + LCDC_CTRL + REG_SET);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // clear READ_WRITEB bit -&amp;gt; write mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_READ_WRITEB, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // setup transfer count&lt;/P&gt;&lt;P&gt;&amp;nbsp; value = (1 &amp;lt;&amp;lt; 16) | devp-&amp;gt;dat_len;&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(value, devp-&amp;gt;base + LCDC_TRANSFER_COUNT);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* setup physical address */&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(devp-&amp;gt;write_dma_addr, devp-&amp;gt;base + LCDC_CUR_BUF);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* set RUN bit */&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_RUN, devp-&amp;gt;base + LCDC_CTRL + REG_SET);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // wait until RUN =&amp;gt; 0&lt;/P&gt;&lt;P&gt;&amp;nbsp; while (readl(devp-&amp;gt;base + LCDC_CTRL) &amp;amp; CTRL_RUN) ;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;init LCDIF:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static int lcdif_mpu_init(struct em9287_isa_dev *devp)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned int clock_rate, clock_period;&lt;/P&gt;&lt;P&gt;&amp;nbsp; u32 value;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; clk_prepare_enable(devp-&amp;gt;clk);&lt;/P&gt;&lt;P&gt;&amp;nbsp; clk_set_rate(devp-&amp;gt;clk, ISA_BUS_CLOCK);&lt;/P&gt;&lt;P&gt;&amp;nbsp; clock_rate = clk_get_rate(devp-&amp;gt;clk);&lt;/P&gt;&lt;P&gt;&amp;nbsp; clock_period = DIV_NUM(1000000000U, clock_rate);&lt;/P&gt;&lt;P&gt;&amp;nbsp; pr_info("%s: lcdif clock = %d Hz -&amp;gt; %d ns\n", __func__, clock_rate, clock_period);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* reset LCDIF controller */&lt;/P&gt;&lt;P&gt;&amp;nbsp; mxs_reset_block(devp-&amp;gt;base);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* dump version number */&lt;/P&gt;&lt;P&gt;&amp;nbsp; value = readl(devp-&amp;gt;base + LCDC_VERSION);&lt;/P&gt;&lt;P&gt;&amp;nbsp; pr_info("LCDIF version %d.%d.%d\n", (value &amp;gt;&amp;gt; 24) &amp;amp; 0xff, (value &amp;gt;&amp;gt; 16) &amp;amp; 0xff, value &amp;amp; 0xffff);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // stop running&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_RUN, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // select 8080 mode: Pins LCD_WR_RWn and LCD_RD_E function as active low WR and active low RD signals respectively.&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL1_MODE86, devp-&amp;gt;base + LCDC_CTRL1 + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // busy disabled: The busy signal from the LCD controller will be ignored.&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL1_BUSY_ENABLE, devp-&amp;gt;base + LCDC_CTRL1 + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // setup data format&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL2_READ_MODE_NUM_PACKED_SUBWORDS(2), devp-&amp;gt;base + LCDC_CTRL2); /* 2 for 16-bit databus */&lt;/P&gt;&lt;P&gt;&amp;nbsp; value = CTRL_WORD_LENGTH(WORD_LENGTH_16_BIT)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; | CTRL_BUS_WIDTH(LCD_DATABUS_WIDTH_16_BIT)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; | CTRL_CSC_DATA_SWIZZLE(CSC_DATA_SWIZZLE_NO_SWAP)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; | CTRL_INPUT_DATA_SWIZZLE(INPUT_DATA_SWIZZLE_NO_SWAP)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; | CTRL_SHIFT_NUM_BITS(0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(value, devp-&amp;gt;base + LCDC_CTRL);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // setup bus timing&lt;/P&gt;&lt;P&gt;&amp;nbsp; value = (DIV_NUM(ISA_RW_STROBE, clock_period) &amp;amp; 0xFF) /* -&amp;gt; DATA_SETUP */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | ((DIV_NUM(ISA_DATA_HOLD, clock_period) &amp;amp; 0xFF) &amp;lt;&amp;lt; 8) /* -&amp;gt; DATA_HOLD */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | ((DIV_NUM(ISA_CS_SETUP, clock_period) &amp;amp; 0xFF) &amp;lt;&amp;lt; 16) /* -&amp;gt; CMD_SETUP */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | ((DIV_NUM(ISA_BUS_HOLD, clock_period) &amp;amp; 0xFF) &amp;lt;&amp;lt; 24); /* -&amp;gt; CMD_HOLD */&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(value, devp-&amp;gt;base + LCDC_TIMING);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; // enable master mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_MASTER, devp-&amp;gt;base + LCDC_CTRL + REG_SET);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //only use 2 low bytes&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL1_BYTE_PACKAGING(0x3), devp-&amp;gt;base + LCDC_CTRL1);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // disable DVI mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_DVI_MODE, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_BYPASS_COUNT, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // disable dotclock mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_DOTCLK_MODE, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // disable vsync mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_VSYNC_MODE, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // now, we are in MPU mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; devp-&amp;gt;enabled = 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //pr_info("%s: LCDIF_CTRL = 0x%08x\n", __func__, readl(devp-&amp;gt;base + LCDC_CTRL));&lt;/P&gt;&lt;P&gt;&amp;nbsp; //pr_info("%s: LCDIF_CTRL1 = 0x%08x\n", __func__, readl(devp-&amp;gt;base + LCDC_CTRL1));&lt;/P&gt;&lt;P&gt;&amp;nbsp; //pr_info("%s: LCDIF_CTRL2 = 0x%08x\n", __func__, readl(devp-&amp;gt;base + LCDC_CTRL2));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return 0;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 25 Sep 2013 09:11:23 GMT</pubDate>
    <dc:creator>x10</dc:creator>
    <dc:date>2013-09-25T09:11:23Z</dc:date>
    <item>
      <title>MPU read problem in iMX28</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/MPU-read-problem-in-iMX28/m-p/249759#M22527</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi, All&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In my driver of LCDIF as MPU read/write bus in imx28, the read operation with following implement can correctly run 8 times, then no read bus cycle anymore.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static unsigned int mpu_data_read(struct em9287_isa_dev *devp)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned int i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; u32 value;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* wait until RUN bit =&amp;gt; 0 if necessary */&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (readl(devp-&amp;gt;base + LCDC_CTRL) &amp;amp; CTRL_RUN)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; while (readl(devp-&amp;gt;base + LCDC_CTRL) &amp;amp; CTRL_RUN) ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // disable master mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_MASTER, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // set READ_WRITEB bit -&amp;gt; read mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_READ_WRITEB, devp-&amp;gt;base + LCDC_CTRL + REG_SET);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // setup transfer count&lt;/P&gt;&lt;P&gt;&amp;nbsp; value = (1 &amp;lt;&amp;lt; 16) | devp-&amp;gt;dat_len;&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(value, devp-&amp;gt;base + LCDC_TRANSFER_COUNT);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* setup physical address */&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(devp-&amp;gt;read_dma_addr, devp-&amp;gt;base + LCDC_CUR_BUF);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* set RUN bit */&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_RUN, devp-&amp;gt;base + LCDC_CTRL + REG_SET);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-size: 10pt; line-height: 1.5em;"&gt;&amp;nbsp; i = devp-&amp;gt;dat_len;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; devp-&amp;gt;dat_len = 0;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return i;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Please let me know how to setup a right procedure to read if anybody has similar experience. Thanks!&lt;/P&gt;&lt;P&gt;BTW, the following is write operation which is always right.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static void mpu_data_write(struct em9287_isa_dev *devp)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; u32 value;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* wait until RUN bit =&amp;gt; 0 if necessary */&lt;/P&gt;&lt;P&gt;&amp;nbsp; if (readl(devp-&amp;gt;base + LCDC_CTRL) &amp;amp; CTRL_RUN)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; while (readl(devp-&amp;gt;base + LCDC_CTRL) &amp;amp; CTRL_RUN) ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // enable master mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_MASTER, devp-&amp;gt;base + LCDC_CTRL + REG_SET);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // clear READ_WRITEB bit -&amp;gt; write mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_READ_WRITEB, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // setup transfer count&lt;/P&gt;&lt;P&gt;&amp;nbsp; value = (1 &amp;lt;&amp;lt; 16) | devp-&amp;gt;dat_len;&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(value, devp-&amp;gt;base + LCDC_TRANSFER_COUNT);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* setup physical address */&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(devp-&amp;gt;write_dma_addr, devp-&amp;gt;base + LCDC_CUR_BUF);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* set RUN bit */&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_RUN, devp-&amp;gt;base + LCDC_CTRL + REG_SET);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // wait until RUN =&amp;gt; 0&lt;/P&gt;&lt;P&gt;&amp;nbsp; while (readl(devp-&amp;gt;base + LCDC_CTRL) &amp;amp; CTRL_RUN) ;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;init LCDIF:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;static int lcdif_mpu_init(struct em9287_isa_dev *devp)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; unsigned int clock_rate, clock_period;&lt;/P&gt;&lt;P&gt;&amp;nbsp; u32 value;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; clk_prepare_enable(devp-&amp;gt;clk);&lt;/P&gt;&lt;P&gt;&amp;nbsp; clk_set_rate(devp-&amp;gt;clk, ISA_BUS_CLOCK);&lt;/P&gt;&lt;P&gt;&amp;nbsp; clock_rate = clk_get_rate(devp-&amp;gt;clk);&lt;/P&gt;&lt;P&gt;&amp;nbsp; clock_period = DIV_NUM(1000000000U, clock_rate);&lt;/P&gt;&lt;P&gt;&amp;nbsp; pr_info("%s: lcdif clock = %d Hz -&amp;gt; %d ns\n", __func__, clock_rate, clock_period);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* reset LCDIF controller */&lt;/P&gt;&lt;P&gt;&amp;nbsp; mxs_reset_block(devp-&amp;gt;base);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* dump version number */&lt;/P&gt;&lt;P&gt;&amp;nbsp; value = readl(devp-&amp;gt;base + LCDC_VERSION);&lt;/P&gt;&lt;P&gt;&amp;nbsp; pr_info("LCDIF version %d.%d.%d\n", (value &amp;gt;&amp;gt; 24) &amp;amp; 0xff, (value &amp;gt;&amp;gt; 16) &amp;amp; 0xff, value &amp;amp; 0xffff);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // stop running&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_RUN, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // select 8080 mode: Pins LCD_WR_RWn and LCD_RD_E function as active low WR and active low RD signals respectively.&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL1_MODE86, devp-&amp;gt;base + LCDC_CTRL1 + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // busy disabled: The busy signal from the LCD controller will be ignored.&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL1_BUSY_ENABLE, devp-&amp;gt;base + LCDC_CTRL1 + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // setup data format&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL2_READ_MODE_NUM_PACKED_SUBWORDS(2), devp-&amp;gt;base + LCDC_CTRL2); /* 2 for 16-bit databus */&lt;/P&gt;&lt;P&gt;&amp;nbsp; value = CTRL_WORD_LENGTH(WORD_LENGTH_16_BIT)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; | CTRL_BUS_WIDTH(LCD_DATABUS_WIDTH_16_BIT)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; | CTRL_CSC_DATA_SWIZZLE(CSC_DATA_SWIZZLE_NO_SWAP)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; | CTRL_INPUT_DATA_SWIZZLE(INPUT_DATA_SWIZZLE_NO_SWAP)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; | CTRL_SHIFT_NUM_BITS(0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(value, devp-&amp;gt;base + LCDC_CTRL);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // setup bus timing&lt;/P&gt;&lt;P&gt;&amp;nbsp; value = (DIV_NUM(ISA_RW_STROBE, clock_period) &amp;amp; 0xFF) /* -&amp;gt; DATA_SETUP */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | ((DIV_NUM(ISA_DATA_HOLD, clock_period) &amp;amp; 0xFF) &amp;lt;&amp;lt; 8) /* -&amp;gt; DATA_HOLD */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | ((DIV_NUM(ISA_CS_SETUP, clock_period) &amp;amp; 0xFF) &amp;lt;&amp;lt; 16) /* -&amp;gt; CMD_SETUP */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | ((DIV_NUM(ISA_BUS_HOLD, clock_period) &amp;amp; 0xFF) &amp;lt;&amp;lt; 24); /* -&amp;gt; CMD_HOLD */&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(value, devp-&amp;gt;base + LCDC_TIMING);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; // enable master mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_MASTER, devp-&amp;gt;base + LCDC_CTRL + REG_SET);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //only use 2 low bytes&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL1_BYTE_PACKAGING(0x3), devp-&amp;gt;base + LCDC_CTRL1);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // disable DVI mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_DVI_MODE, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_BYPASS_COUNT, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // disable dotclock mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_DOTCLK_MODE, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // disable vsync mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; writel(CTRL_VSYNC_MODE, devp-&amp;gt;base + LCDC_CTRL + REG_CLR);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; // now, we are in MPU mode&lt;/P&gt;&lt;P&gt;&amp;nbsp; devp-&amp;gt;enabled = 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp; //pr_info("%s: LCDIF_CTRL = 0x%08x\n", __func__, readl(devp-&amp;gt;base + LCDC_CTRL));&lt;/P&gt;&lt;P&gt;&amp;nbsp; //pr_info("%s: LCDIF_CTRL1 = 0x%08x\n", __func__, readl(devp-&amp;gt;base + LCDC_CTRL1));&lt;/P&gt;&lt;P&gt;&amp;nbsp; //pr_info("%s: LCDIF_CTRL2 = 0x%08x\n", __func__, readl(devp-&amp;gt;base + LCDC_CTRL2));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; return 0;&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 25 Sep 2013 09:11:23 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/MPU-read-problem-in-iMX28/m-p/249759#M22527</guid>
      <dc:creator>x10</dc:creator>
      <dc:date>2013-09-25T09:11:23Z</dc:date>
    </item>
    <item>
      <title>Re: MPU read problem in iMX28</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/MPU-read-problem-in-iMX28/m-p/249760#M22528</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I think I got confused by AXI Master which can only be used for outputing data from frame buffer to LCD. As my understanding, data can be read from register HW_LCDIF_DATA in either DMA or CPU, but how to start a MPU read bus cycle shown in Figure 33-12 before reading the data register. Another question is about the definition of HW_LCDIF_STAT, no information about RXFIFO contains in this register. As I guess, both LFIFO_FULL and LFIFO_EMPTY refers RXFIFO instead of latency FIFO in write datapath, is that right?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It's appreciated for any comments, thanks!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;BR&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Cheng Shi&lt;/P&gt;&lt;P&gt;emtronix&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 26 Sep 2013 03:04:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/MPU-read-problem-in-iMX28/m-p/249760#M22528</guid>
      <dc:creator>x10</dc:creator>
      <dc:date>2013-09-26T03:04:10Z</dc:date>
    </item>
    <item>
      <title>Re: MPU read problem in iMX28</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/MPU-read-problem-in-iMX28/m-p/249761#M22529</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;LCDIF is work as MPU interface, both read and write. :-)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Cheng Shi&lt;/P&gt;&lt;P&gt;emtronix&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 31 Oct 2013 03:23:24 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/MPU-read-problem-in-iMX28/m-p/249761#M22529</guid>
      <dc:creator>x10</dc:creator>
      <dc:date>2013-10-31T03:23:24Z</dc:date>
    </item>
  </channel>
</rss>

