修改kernel的spi驱动,cmd+addr+data时序连续以支持spiFlash的mtd设备

【背景】

                新增加的spi-nvFram芯片mb85rs4mt,以支持mtd设备挂载,发现只修改jedec无法读取芯片id,以及mtd设备生成。

【目的】

                linux系统下支持spi-nvFram芯片。

【排查】

                结合datasheet的数据传输时序需求,用示波器查看,发现在一个完整的读、写时序中,cs片选存在invalid过程,即linux的驱动把一个完整的读、写时序分割为了2个spi时序.

              修改kernel的spi驱动,cmd+addr+data时序连续以支持spiFlash的mtd设备_第1张图片

        上图中为一个完整的read的spi时序,用示波器发现,实际的spi时序中,op-code+address后,cs变为高了,等待了一段时间,又发起了data的SOMI获取,导致驱动获取数据全部为0.查看linux的spi-mtd的驱动代码,发现对于read和write,不是一个完整的spi时序,需要手动修改,以满足该芯片的特殊的spi时序。

        涉及到的内核相关函数:

         m25p80_read();

   m25p80_write();

        spi_write_then_read();

【思路】

        kenel下的spi,都是以消息队列的形式,通过spi_message_add_tail(),将read、write、write_then_read添加到一个队列中,确保spi的时序完整性。

【修改】

                1、drivers/mtd/spi-nor/spi-nor.c中增加Jedec的支持:

                        { "mb85rs4mt", INFO(0x047f49, 0, 512 * 1024, 1, SPI_NOR_NO_ERASE |                 SPI_NOR_HAS_LOCK | SNOR_F_TR_SEQ) }

          其中SNOR_F_TR_SEQ为自定义的flags,表示需要连续的时序。

      2、drivers/spi/spi.c中修改spi_write_then_read()

       

修改kernel的spi驱动,cmd+addr+data时序连续以支持spiFlash的mtd设备_第2张图片

         将rx和tx,放到一个spi_message中。

                3、drivers/mtd/device/m25p80.c中修改m25p80_read()和m25p80_write()

修改kernel的spi驱动,cmd+addr+data时序连续以支持spiFlash的mtd设备_第3张图片

           

修改kernel的spi驱动,cmd+addr+data时序连续以支持spiFlash的mtd设备_第4张图片

【效果】

          符合datasheet的spi的时序,能够正常访问mtd设备。

你可能感兴趣的:(Linux系统,spiflash,m25p80)