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上接sram作为外部存储,软件需要做哪些设定?

Other Parts Discussed in Thread: AM3358

现在需要在BBB的基础上增加SRAM来存储一些重要的数据,想把SRAM接在GPMC上,datasheet说是可以接的,但是看u-boot的源代码,没有看到SRAM相关的部分。如果要支持SRAM,软件需要做哪些设定?另外SRAM会采用电池单独供电,是否可行?

  • GPMC本来就是可以连接SRAM的,如果要在U-boot下添加驱动,可以参考NAND部分的代码。

  • Dear Jian Zhou:

               谢谢你的comments。如果在GPMC接SRAM,是否只需要把IC的pinmux设置正确即可然后就可以通过片内地址0x0000000(看SPEC是0x0开始的5128M,不过,我们只需要用512K or 1M)来读写?因为没有找到参考代码,还需要帮忙指点。thanks

  •  SRAM 例子:https://e2e.ti.com/support/arm/sitara_arm/f/791/t/315716 希望可以帮到你!

  • pinmux只是引脚功能定义

    还需要配置gpmc的相关控制寄存器

  • Hi, leo.

    是否有GPMC相关控制器设定的参考代码?

    另外,am3358的datasheet讲GPMC支持的最小memory是16M,但是我们用sram会是512K。不知道是否有问题

  • 我这里有个关于地址区域划分的介绍:http://www.deyisupport.com/files/m/sitara_arm/11905.aspx

    对于时序配置,还是要根据你的sram的需求来。

    另外,针对于你说的这个问题,不会有影响。你只是需要低512K的数据空间,对应到自己的sram就可以了。

  • Steven:

    谢谢你的信息。还有2个问题请教一下

    1.对于每次一读写都需要2个片选的SRAM是否就没有办法支持?(比如 AS6C1616。 一个低,一个高)

    2.如果接16BIT不复用的SRAM (比如AS6C1616),是不是地址要从A1开始(AM335x ARM® Cortex™-A8 Microprocessors Reference_Manual_1.pdf 中讲A0 not use)?

  • https://e2e.ti.com/support/arm/sitara_arm/f/791/t/251339

    A0是被跳过了,在16 bit里

  • 一般带2个CS的SRAM,在Linux下可以映射成两个不同的设备。

  • 目前这颗SRAM我datasheet不能映射成2段来用,因为他每一次读写都需要用到2个CS,1高1低。

    另外请教下,需要从/proc/iomem中看到映射的部分,是不是只需要devicetree配置正确即可?无关hardware?

    因为我的板子sram还没有接线好,我想先在BBB上看看。目前我在u-boot和dts中都配置了pinmux和register,

    但是从/proc/iomem中只能看到gpmc@500000000,看不到我映射的sram 0x10000000的部分,cs选的0。

  • 从/proc/iomem中只能看到gpmc@500000000,看不到我映射的sram 0x10000000的部分,换成CSN1也还是看不到。请专家指点。

  • device tree只是板级接口部分,驱动也要实现正确映射才能在Proc里看到。

    另外如果要求2个CS一高一低,可以同过外部电路实现。

  • 是否有驱动部分的参考代码? 如果要通过/dev/mem来映射的话,是不是一定要在/proc/iomem中看到?

  • 在GPMC的driver中,对于每个片选,他只是request_resource,没有做devm_request_mem_region,是不是把这里改成request region就能在/proc/iomem中看到呢?

    static int gpmc_cs_insert_mem(int cs, unsigned long base, unsigned long size)
    {
    struct resource *res = &gpmc_cs_mem[cs];
    int r;

    size = gpmc_mem_align(size);
    spin_lock(&gpmc_mem_lock);
    res->start = base;
    res->end = base + size - 1;
    r = request_resource(&gpmc_mem_root, res);
    spin_unlock(&gpmc_mem_lock);

    return r;
    }

  • Dear TI members:

        我们基于BBB的板子已经生产出来了,配置如下

    1.sram是1024K x 16 bit, 地址线从a1接到a19.(只用了1M)

    2. gpmc映射的地址是0x10000000,大小是16M3.片选csn1

     

    在验证sram时发现2个问题

    1.从 /dev/mem映射出来的地址空间,可以访问到1M之外的区域,比如说1M+x,但是实际对应的SRAM空间和基地址+x一样.这样正常么?

    比如0地址和1M的地址一样.

    2.往sram byte0地址去写数据,但是读出来byte0、8的数据相同,同样,往byte8写数据,从byte0和byte8可以独到刚写入的数据,

    byte1-byte8....byte16-byte24都一样,也就是说,读写的时候0-7和8-15地址一一对应。16-23和24-31.....一路下去都重叠了....

    不知道这种现象是否是gpmc的设定错误所导致?

    比如我要从0地址一直写到15.当写完前8个byte时,如下:

    11 22 33 44 55 66 77 88 11 22 33 44 55 66 77 88

    写地9个byte时如下

    99 22 33 44 55 66 77 88 99 22 33 44 55 66 77 88

    写第10个byte

    99 aa 33 44 55 66 77 88 99 aa 33 44 55 66 77 88

    如果正常的话,期望的是

    11 22 33 44 55 66 77 88 99 aa ...............................

  • 补充GPMC settings

    gpmc_pinspinmux_gpmc_pins {
                    pinctrl-single,pins = <
                            AM33XX_IOPAD(0x8a4, PIN_OUTPUT | MUX_MODE1)       /* lcd_data1.gpmc_a1*/
                            AM33XX_IOPAD(0x8a8, PIN_OUTPUT | MUX_MODE1)       /* lcd_data2.gpmc_a2*/
                            AM33XX_IOPAD(0x8ac, PIN_OUTPUT | MUX_MODE1)       /* lcd_data3.gpmc_a3*/
                            AM33XX_IOPAD(0x8b0, PIN_OUTPUT | MUX_MODE1)       /* lcd_data4.gpmc_a4*/
                            AM33XX_IOPAD(0x8b4, PIN_OUTPUT | MUX_MODE1)       /* lcd_data5.gpmc_a5*/
                            AM33XX_IOPAD(0x8b8, PIN_OUTPUT | MUX_MODE1)       /* lcd_data6.gpmc_a6*/
                            AM33XX_IOPAD(0x8bc, PIN_OUTPUT | MUX_MODE1)       /* lcd_data7.gpmc_a7*/
                            AM33XX_IOPAD(0x8e0, PIN_OUTPUT | MUX_MODE1)       /* lcd_vsync.gpmc_a8*/
                            AM33XX_IOPAD(0x8e4, PIN_OUTPUT | MUX_MODE1)       /* lcd_hsync.gpmc_a9*/
                            AM33XX_IOPAD(0x8e8, PIN_OUTPUT | MUX_MODE1)       /* lcd_pclk.gpmc_a10*/
                            AM33XX_IOPAD(0x8ec, PIN_OUTPUT | MUX_MODE1)       /* lcd_ac_bias_en.gpmc_a11*/
                            AM33XX_IOPAD(0x8c0, PIN_OUTPUT | MUX_MODE1)       /* lcd_data8.gpmc_a12*/
                            AM33XX_IOPAD(0x8c4, PIN_OUTPUT | MUX_MODE1)       /* lcd_data9.gpmc_a13*/
                            AM33XX_IOPAD(0x8c8, PIN_OUTPUT | MUX_MODE1)       /* lcd_data10.gpmc_a14*/
                            AM33XX_IOPAD(0x8cc, PIN_OUTPUT | MUX_MODE1)       /* lcd_data11.gpmc_a15*/
                            AM33XX_IOPAD(0x8d0, PIN_OUTPUT | MUX_MODE1)       /* lcd_data12.gpmc_a16*/
                            AM33XX_IOPAD(0x8d4, PIN_OUTPUT | MUX_MODE1)       /* lcd_data13.gpmc_a17*/
                            AM33XX_IOPAD(0x8d8, PIN_OUTPUT | MUX_MODE1)       /* lcd_data14.gpmc_a18*/
                            AM33XX_IOPAD(0x8dc, PIN_OUTPUT | MUX_MODE1)       /* lcd_data15.gpmc_a19*/
     
                            AM33XX_IOPAD(0x800, PIN_INPUT | MUX_MODE0) /* gpmc_ad0.gpmc_ad0*/
                            AM33XX_IOPAD(0x804, PIN_INPUT | MUX_MODE0) /* gpmc_ad1.gpmc_ad1*/
                            AM33XX_IOPAD(0x808, PIN_INPUT | MUX_MODE0) /* gpmc_ad2.gpmc_ad2*/
                            AM33XX_IOPAD(0x80c, PIN_INPUT | MUX_MODE0) /* gpmc_ad3.gpmc_ad3*/
                            AM33XX_IOPAD(0x810, PIN_INPUT | MUX_MODE0) /* gpmc_ad4.gpmc_ad4*/
                            AM33XX_IOPAD(0x814, PIN_INPUT | MUX_MODE0) /* gpmc_ad5.gpmc_ad5*/
                            AM33XX_IOPAD(0x818, PIN_INPUT | MUX_MODE0) /* gpmc_ad6.gpmc_ad6*/
                            AM33XX_IOPAD(0x81c, PIN_INPUT | MUX_MODE0) /* gpmc_ad7.gpmc_ad7*/
                            AM33XX_IOPAD(0x820, PIN_INPUT | MUX_MODE0) /* gpmc_ad8.gpmc_ad8*/
                            AM33XX_IOPAD(0x824, PIN_INPUT | MUX_MODE0) /* gpmc_ad9.gpmc_ad9*/
                            AM33XX_IOPAD(0x828, PIN_INPUT | MUX_MODE0) /* gpmc_ad10.gpmc_ad10*/
                            AM33XX_IOPAD(0x82c, PIN_INPUT | MUX_MODE0) /* gpmc_ad11.gpmc_ad11*/
                            AM33XX_IOPAD(0x830, PIN_INPUT | MUX_MODE0) /* gpmc_ad12.gpmc_ad12*/
                            AM33XX_IOPAD(0x834, PIN_INPUT | MUX_MODE0) /* gpmc_ad13.gpmc_ad13*/
                            AM33XX_IOPAD(0x838, PIN_INPUT | MUX_MODE0) /* gpmc_ad14.gpmc_ad14*/
                            AM33XX_IOPAD(0x83c, PIN_INPUT | MUX_MODE0) /* gpmc_ad15.gpmc_ad15*/
     
                            AM33XX_IOPAD(0x880, PIN_OUTPUT_PULLUP | MUX_MODE0)/* gpmc_csn1.gpmc_csn1*/
                            AM33XX_IOPAD(0x898, PIN_OUTPUT_PULLUP | MUX_MODE0) /* gpmc_wen.gpmc_wen*/
                            AM33XX_IOPAD(0x884, PIN_OUTPUT_PULLUP | MUX_MODE1) /* gpmc_csn2.gpmc_be1n*/
                            AM33XX_IOPAD(0x894, PIN_OUTPUT_PULLUP | MUX_MODE0)/* gpmc_oen_ren.gpmc_oen_ren*/
                            AM33XX_IOPAD(0x89c, PIN_OUTPUT_PULLUP | MUX_MODE0)/* gpmc_be0n_cle.gpmc_be0n_cle*/
                    >;
     
    &gpmc {
            status = "okay";
            pinctrl-names = "default";
            pinctrl-0 = <&gpmc_pins>;
     
            /* chip select ranges */
            ranges = <1 0 0x10000000 0x01000000>;
     
            sram {
                    reg = <1 0 0x00100000>; /*CSn1*/
     
                    bank-width = <2>;
     
                    gpmc,cs-on-ns = <0>;
                    gpmc,cs-rd-off-ns = <50>;
                    gpmc,cs-wr-off-ns = <60>;
     
                    gpmc,we-on-ns = <0>;
                    gpmc,we-off-ns = <50>;
                    gpmc,oe-on-ns = <20>;
                    gpmc,oe-off-ns = <50>;
     
                    gpmc,access-ns = <50>;
                    gpmc,rd-cycle-ns = <80>;
                    gpmc,wr-cycle-ns = <60>;
     
                    gpmc,wr-access-ns = <50>;
            };
    };
  • 搞定了,硬件有些问题
  • 你好 我最近也在弄GPMC上挂载SDRAM的问题,我使用的是8位的,现在写数据,比如写 0,1,2,3,4,5,6,7,8,9    断电重启就会是,1,,3,4,5,6,,8,9   中间会丢失几个  感觉跟你的现象很像,是否可以请教下你怎么解决的?