这里,其实困扰本人很久,以往的驱动程序,代码里都可以看到直接操作寄存器,按照datasheet的说明,实现指定的时序。
但Linux 不是这样,而是模仿imilate 硬件数据传输transfer 来实现的。比较精细,下面来具体分析,SPI-Nor Flash读取寄存器的代码。另:linux 内核源码开源,可直接百度(linux 内核源码)下载获取。
SPI-NOR 读取寄存器——spi_write_then_read()
m25p80_read_reg()——读取nor flash寄存器的值
int spi_write_then_read(struct spi_device *spi,
const void *txbuf, unsigned n_tx,
void *rxbuf, unsigned n_rx)
{
static DEFINE_MUTEX(lock);
int status;
struct spi_message message;//一次完整的数据传输,transfer集合
struct spi_transfer x[2];//数据传输数组,先写,后读。所以一共2次
u8 *local_buf;//? 干嘛用的?
/* Use preallocated DMA-safe buffer if we can. We can't avoid
* copying here, (as a pure convenience thing), but we can
* keep heap co