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

【背景】

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

【目的】

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

【排查】

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

              

        上图中为一个完整的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()

       

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

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

           

【效果】

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值