This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM335X GPMC 編程問題

Expert 2272 points


請問

我依照下列流程在驅動源程序 config GPMC ,並透過應用程序控制

但寫資料時,實際量測波形,gpmc_ad0,ad1...動作都正確

但gpmc_csn1 卻無反應

請問是遺漏了什麼???

=================================== board-am335xevm.c

/*pin mux for FIFO writing*/
static struct pinmux_config fifo_pin_mux[] =
{
{"gpmc_ad0.gpmc_ad0", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad1.gpmc_ad1", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad2.gpmc_ad2", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad3.gpmc_ad3", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad4.gpmc_ad4", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad5.gpmc_ad5", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad6.gpmc_ad6", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad7.gpmc_ad7", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad8.gpmc_ad8", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad9.gpmc_ad9", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad10.gpmc_ad10", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad11.gpmc_ad11", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad12.gpmc_ad12", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad13.gpmc_ad13", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad14.gpmc_ad14", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
{"gpmc_ad15.gpmc_ad15", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},

{"gpmc_csn1.gpio1_30", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
{"gpmc_csn2.gpio1_31", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
{"gpmc_csn3.gpio2_0", OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
{"gpmc_clk.gpio2_1", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
{"lcd_vsync.gpio2_22", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
{"lcd_pclk.gpio2_24", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
{"gpmc_wen.gpmc_wen", OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
{"gpmc_ben1.gpmc_dir", OMAP_MUX_MODE4 | AM33XX_PULL_DISA},

{NULL, 0},
};

...

===================================  gpmc driver

#define GPMC_CS 1

...


//配置GPMC 寄存器
val = gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG7);
val &= ~GPMC_CONFIG7_CSVALID; /*disable chip-select*/
gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7, val);

gpmc_cs_configure(GPMC_CS, GPMC_SET_IRQ_STATUS, 0); /*set irq status*/
gpmc_cs_configure(GPMC_CS, GPMC_ENABLE_IRQ, 0); /*disable irqs*/

gpmc_cs_write_reg(GPMC_CS,GPMC_CS_CONFIG1, GPMC_CONFIG1_READTYPE_ASYNC | /*set read type Asynchronous*/
GPMC_CONFIG1_WRITETYPE_ASYNC | /*set write type Asynchronous*/
GPMC_CONFIG1_DEVICESIZE_16 | /*set device size 16bit*/
GPMC_CONFIG1_DEVICETYPE_NOR | /*set device type NOR*/
GPMC_CONFIG1_FCLK_DIV3); /*GPMC_CLK frequency=GPMC_FCLK frequency/3*/
val = gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG1);
val &= NONE_MUXADDATA; /*Non-multiplexed attached device*/
gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG1, val);

ret = gpmc_cs_set_timings(GPMC_CS, &fifo_timings); /*set timing parameters*/


// 申請gpmc 片選空間並用ioremap 函數映射為內核虛擬地址
/*********** 為FIFO 申請GPMC chip-select 空間**********/
if (gpmc_cs_request(GPMC_CS, FIFO_SIZE, &mem_base)<0)
{
printk(KERN_ERR "gpmc_cs_request failed.\n");
return -1;
}
/*********** 為FIFO 申請虛擬內存空間**********/
if (!request_mem_region(mem_base, FIFO_SIZE, GPMC_DRIVER_NAME))
{
printk(KERN_ERR "request_mem_region failed.\n");
return -1;
}
/****** 物理地址映射為虛擬地址*****/
fifo_base = ioremap (mem_base, FIFO_SIZE);

  • val = gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG7);
    val &= ~GPMC_CONFIG7_CSVALID; /*disable chip-select*/
    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7, val);

  • Dear Leo

    TRM有提到

    在設定 GPMC相關Reg時,須將Chip select 關閉

    Chip-select configuration (base and mask address or any protocol and timing settings) must be performed
    while the associated chip-select is disabled through the GPMC_CONFIG7_i[6] CSVALID bit. In addition, a
    chip-select configuration can only be disabled if there is no ongoing access to that chip-select. This
    requires activity monitoring of the prefetch or write-posting engine if the engine is active on the chip-select.
    Also, the write buffer state must be monitored to wait for any posted write completion to the chip-select.

    我也有試過後完成設定 GPMC相關Reg後將Chip select打開

    val = gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG7);
    val |= GPMC_CONFIG7_CSVALID; /*disable chip-select*/
    gpmc_cs_write_reg(GPMC_CS, GPMC_CS_CONFIG7, val);

    但是insmod時卻產生一堆錯誤!!

    請問正確流程是要在何時將cs打開呢?

    感謝...

  • 把配置GPMC_CS_CONFIG7去掉试试

    这个好像在gpmc_cs_request中使能的

  • 我也遇到同样的问题了,CS没有反映,我注意到GPMC_CONFIG7_i Field Descriptions有这么一说,当片选为0到3时,片选的精度为16M,是不是说这个3个片选的首地址要从16M处开始,而我的外设不需要那么宽,是不是应该选择其他片选(CS > 3)。所以虽然地址有动作,但是并不在片选的范围内,所以CS没有动作。

    5-0            BASEADDRESS             0-3Fh        Chip-select base address.     CSi base address where i = 0 to 3 (16 Mbytes minimum granularity). Bits [5-0] corresponds  to A29, A28, A27, A26, A25, and A24.

    但是我把gpmc_cs_request(3,SZ_16M,(unsigned long *)&phy_base),改为 gpmc_cs_request(6,SZ_16M,(unsigned long *)&phy_base)得到phy_base一样都是0x1000000。

  • Dear Leo

    去掉後,CS 一樣無法出來

    另外再請教

    我使用BB Black測試

    我GPMC時序設定如下,除GPMC外其餘都未修改

    static struct gpmc_timings fifo_timings =
    {
    /*GPMC timing configurations*/
    .sync_clk = 0,

    .cs_on = 0, /* Assertion time */
    .cs_rd_off = 82, /* Read deassertion time */
    .cs_wr_off = 82, /* Write deassertion time */

    .we_on = 40, /* WE assertion time */
    .we_off = 40, /* WE deassertion time */

    .oe_on = 40, /* OE assertion time */
    .oe_off = 40, /* OE deassertion time */
    .access = 50, /* Start-cycle to first data valid delay */
    .rd_cycle = 82, /* Total read cycle time */
    .wr_cycle = 82, /* Total write cycle time */
    };

    為什麼出來的gpmc_wen 訊號 low    |_|   寬度為52ns????

  • 片选跟你读写的地址有关系,你应该看下你片选的mem_base物理地址是好多,还有片选大小,也就是config7,你可以打印出来看下这个值是多少,然后对照读写的地址看是否在这个区间。

    http://blog.csdn.net/qq405180763/article/details/7616941 我的不知道为什么申请的片选基地址都是从0x1000000开始,于是我把GPMC_A8复用为GPMC_A24,然后我在驱动中循环对一个地址写操作,用示波器就能看到CS动作了。

  • 經由您的提醒,我後發現是我pinmux_config弄錯了

    修改後就可以送出gpmc_times結構所定義的時序了(但cs有點誤差)

  • 解决了没?

  • Dear Leo

    解決了~~~^^

  • 我调用gpmc_cs_request(GPMC_CS, SZ_4M, (unsigned long *)&mem_base命令,得到基地址为0x1000000大小为16M。之前我没有设置过GPMC_CONFIG1_7,是SDK的默认配置吗,在哪里可以修改,求详解。

  • GPMC_A8复用为GPMC_A24


    请问一下,这个复用的时候,寄存器的值是如何设置的呢?

  • 请问一下,是哪个管脚的复用出问题了?正确的配置应该是怎么样的呢?

  • 类似于这样的设置,自己找一些呗

    {"gpmc_ad6.gpmc_ad6", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},

  • 请问下你的这个配置是用来和FPGA通信吗?如果是,我想请教下你,你的硬件上怎么和FPGA连接的?