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.

DM8127 有关SPI Flash当存储器的问题



板子现在是nand启动,然后所有的程序都在nand里面。现在想在板子上面加一块64M的SPI FLASH当存储器存储程序中重要的文件,其他什么boot啊内核啊文件系统保持不变,还是放在nand中。

我需要在uboot中或者内核中修改哪些东西可以达到我要的这个目的呢?谢谢!!!

  • 你好,

    uboot本身就支持对spi flash的读写,请参考下面的链接:

    http://processors.wiki.ti.com/index.php/TI81XX_PSP_UBOOT_User_Guide#Flashing_1st_stage_to_SPI_from_2nd_stage

    TI8148_EVM# sf probe 0:0

    TI8148_EVM# sf erase 0x0 0x20000

    TI8148_EVM# sf write 0x81000000 0x0 0x20000

  • 额~~~我描述的不够清楚,怎么没看懂您说的。u-boot本身支持?意思什么都不需要改只要把spi flash焊接上去就能用? 我用了一下sf probe 0这个命令 ,Failed to initialize SPI flash at 0:0。

    我现在不是用spi flash启动,而是程序启动之后用spi来存储文件。这个是不是需要修改kernel里面的驱动之类的....,是按照下面这个文档来吗?

    http://processors.wiki.ti.com/index.php?title=TI81XX_PSP_McSPI_Driver_User_Guide&redirect=no

  • 你好,

    请问你的spi flash的连接方式和TI EVM上一致么?如果不一致请根据你找到的链接来修改内核驱动。如果你需要在uboot下也访问spi flash,也要做类似修改。

    SPI flash的驱动请参考:http://processors.wiki.ti.com/index.php/TI81XX_PSP_McSPI_Driver_User_Guide。

  • u-boot不需要用到spi flash.

    现在我根据这个TI81XX_PSP_McSPI_Driver_User_Guide文档修改了跟spi flash相关的东西,但是系统没有看到spi flash

    现在有一个跟分区有关的疑惑,因为现在系统中已经有了nand的分区,cat /proc/mtd 可以看到nand的几个分区。如果根据TI81XX_PSP_McSPI_Driver_User_Guide这个文档中对spi flash的分区,岂不是和nand 分区一模一样了,也有u-boot、u-boot env 、kernel、filesystem等分区,这种分区不会和nand的分区冲突吗. cat /pro/mtd 时候,到底是nand 的还是spi 的.



  • u-boot不需要用到spi flash.

    现在我根据这个TI81XX_PSP_McSPI_Driver_User_Guide文档修改了跟spi flash相关的东西,但是系统没有看到spi flash

    现在有一个跟分区有关的疑惑,因为现在系统中已经有了nand的分区,cat /proc/mtd 可以看到nand的几个分区。如果根据TI81XX_PSP_McSPI_Driver_User_Guide这个文档中对spi flash的分区,岂不是和nand 分区一模一样了,也有u-boot、u-boot env 、kernel、filesystem等分区,这种分区不会和nand的分区冲突吗. cat /pro/mtd 时候,到底是nand 的还是spi 的.



  • 这个是nand的分区

    /* NAND flash information */
    static struct mtd_partition ti814x_nand_partitions[] = {
    /* All the partition sizes are listed in terms of NAND block size */
    {
    .name = "U-Boot-min",
    .offset = 0, /* Offset = 0x0 */
    .size = SZ_128K,
    },
    {
    .name = "U-Boot",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x0 + 128K */
    .size = 18 * SZ_128K,
    },
    {
    .name = "U-Boot Env",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
    .size = 1 * SZ_128K,
    },
    {
    .name = "Kernel",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
    .size = 34 * SZ_128K,
    },
    {
    .name = "File System",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x6C0000 */
    .size = 1063 * SZ_128K, //100M
    },
    {
    .name = "Data",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0x6AC0000 */
    .size = 287 * SZ_128K, //27M
    },
    {
    .name = "Reserved",
    .offset = MTDPART_OFS_APPEND, /* Offset = 0xB0C0000 */
    .size = MTDPART_SIZ_FULL,
    },
    };

    这个是spi 的 

    /* SPI fLash information */
    struct mtd_partition ti8148_spi_partitions[] = {
    /* All the partition sizes are listed in terms of erase size */
    {
    .name = "U-Boot-min",
    .offset = 0, /* Offset = 0x0 */
    .size = 32 * SZ_4K,
    //.mask_flags = MTD_WRITEABLE, /* force read-only */
    }
    #if 1
    ,
    {
    .name = "U-Boot",
    .offset = MTDPART_OFS_APPEND, /* 0x0 + (32*4K) */
    .size = 64 * SZ_4K,
    //.mask_flags = MTD_WRITEABLE, /* force read-only */
    },
    {
    .name = "U-Boot Env",
    .offset = MTDPART_OFS_APPEND, /* 0x40000 + (32*4K) */
    .size = 2 * SZ_4K,
    },
    {
    .name = "Kernel",
    .offset = MTDPART_OFS_APPEND, /* 0x42000 + (32*4K) */
    .size = 640 * SZ_4K,
    },
    {
    .name = "File System",
    .offset = MTDPART_OFS_APPEND, /* 0x2C2000 + (32*4K) */
    .size = MTDPART_SIZ_FULL, /* size ~= 1.1 MiB */
    }
    #endif
    };

  • 你好,

    请问在Linux启动过程中是否有spi flash相关打印?

    分区需要你修改spi相关分区,去掉不必要的部分,例如前面4个。Linux驱动理论上应该会把nand和spi的分区顺序排列,谁在前面要看驱动加载的先后顺序。

  • 现在比较奇怪的一点是内核在启动过程中无任何spi相关打印,只有nand的。但是内核配置中关于spi的选项我都勾选上了,难道我pin mux配置的不对?亦或者还有其他什么地方造成spi驱动没有加载的?

    您能帮我看看我的pin mux的配置吗?

    这是我配置的pin mux,在ti8148ipnc.c中的board_mux中。

    /* For SPI[0]_SCS[0]   */ 这个是低电平有效,不拉高是对的吗?
    {
    .reg_offset = TI814X_CONTROL_PADCONF_SPI0_CS0_OFFSET,
    .value = (0x01 ),
    },
    /* For SPI[0]_SCLK */  clck 拉高
    {
    .reg_offset = TI814X_CONTROL_PADCONF_SPI0_SCLK_OFFSET,
    .value = (0x01 ) | TI814X_PULL_UP,
    },
    /* For SPI[0]_D1 */  这个MISO,这样配置可对?
    {
    .reg_offset = TI814X_CONTROL_PADCONF_SPI0_D1_OFFSET,
    .value = (0x01 ) | TI814X_PULL_UP | TI814X_INPUT_EN,
    },
    /* For SPI[0]_D0 */  这个是MOSI
    {
    .reg_offset = TI814X_CONTROL_PADCONF_SPI0_D0_OFFSET,
    .value = (0x01 ) | TI814X_PULL_UP,
    },

  • 还有这个

    const struct flash_platform_data ti8148_spi_flash = {
    .type = "s25fl512s",
    .name = "spi_flash",
    .parts = ti8148_spi_partitions,
    .nr_parts = ARRAY_SIZE(ti8148_spi_partitions),
    };

    struct spi_board_info __initdata ti8148_spi_slave_info[] = {
    {
    .modalias = "m25p80",
    .platform_data = &ti8148_spi_flash,
    .irq = -1,
    .max_speed_hz = 75000000,
    .bus_num = 1,
    .chip_select = 0,
    },
    };

    m25p80.c下的

    { "s25fl512s", INFO(0x010220, 0,  256 * 1024, 256, 0) },

  • 你好,

    你能否打开.config文件看看你的spi驱动是否正确配置了?SPI的驱动你在kernel配置里面没有配置为module吧?如果配置为M,要手动加载的。

  • 配置是正确的,不是配置成module的   

  • 我刚才把spi驱动编译成模块,然后手动加载。

    insmod omap2_mcspi.ko时候,怎么什么打印都没有的
    insmod m25p80.ko 这个时候 打印了这个 successfully get the jedec id and it is 0xffffff,怎么感觉没找我的spi flash 一样
  • 我这个pin mux的配置不知道是否正确   在insmod m25p80.ko时候,怎么说jedec_id为0xffff,和我的spi flash的jedec_id对应不上。这是表明没有找到spi flash 吗

  • 你好,

    你能否在驱动里面加一下printk打印看看?

  • insmod omap2_mcspi.ko时候,用dmesg发现打印了如下消息。

    PM: Adding info for No Bus:spi1
    PM: Adding info for spi:spi1.0
    omap2_mcspi: probe of omap2_mcspi.2 failed with error -16
    omap2_mcspi: probe of omap2_mcspi.3 failed with error -16
    omap2_mcspi: probe of omap2_mcspi.4 failed with error -16

    这是什么意思?

  • 目前发现再m25p80.c中的jedec_probe()函数中找不到我所添加的spi flash信息,也就是找不到对应的_jedec_id。具体代码如下

    tmp = spi_write_then_read(spi, &code, 1, id, 5);
    if (tmp < 0) {
    DEBUG(MTD_DEBUG_LEVEL0, "%s: error %d reading JEDEC ID\n",
    dev_name(&spi->dev), tmp);
    return ERR_PTR(tmp);
    }
    jedec = id[0];
    jedec = jedec << 8;
    jedec |= id[1];
    jedec = jedec << 8;
    jedec |= id[2];

    printk(KERN_ALERT "successfully get the jedec id and it is 0x%x\n", jedec);

    这个打印出来的jedec_id为0xffffff,不是我的spi flash的。

    求解