【背景】
新增加的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设备。