第四期 第二十三讲 Linux SPI驱动实验

第二十三讲 Linux SPI驱动实验

一、SPI驱动框架

1.1 裸机下的SPI驱动框架

首先编写SPI控制器驱动,bsp_spi.c和bsp_spi.h。最终提供SPI读写函数:spich0_readwrite_byte

spi具体芯片驱动:ICM20608

1.2、Linux下的SPI驱动框架

主机控制器驱动:SOC的SPI外设驱动,此驱动是半导体原厂编写好的,为spi-imx.c,当spi控制器的设备和驱动匹配以后,spi_imx_probe函数就会执行,完善I.MX6ULL的SPI控制器驱动。

SPI控制器驱动核心就是spi_master的构建,spi_master里面就有如何通过SPI控制器与SPI外设进行通信的函数,此函数是原厂编写的。

spi_master->transfer

spi_master-> transfer_one_message 6ULL主机控制器使用此函数,

设备驱动:具体的SPI芯片驱动

1.3、SPI主机驱动

1、spi_master

struct spi_master {

struct device dev;

struct list_head list;

/* other than negative (== assign one dynamically), bus_num is fully

* board-specific. usually that simplifies to being SOC-specific.

* example: one SOC has three SPI controllers, numbered 0..2,

* and one board's schematics might show it using SPI-2. software

* would normally use bus_num=2 for that controller.

*/

s16 bus_num;

/* chipselects will be integral to many controllers; some others

* might use board-specific GPIOs.

*/

u16 num_chipselect;

/* some SPI controllers pose alignment requirements on DMAable

* buffers; let protocol drivers know about these requirements.

*/

u16 dma_alignment;

/* spi_device.mode flags understood by this controller driver */

u16 mode_bits;

/* bitmask of supported bits_per_word for transfers */

u32 bits_per_word_mask;

#define SPI_BPW_MASK(bits) BIT((bits) - 1)

#define SPI_BIT_MASK(bits) (((bits) == 32) ? ~0U : (BIT(bits) - 1))

#define SPI_BPW_RANGE_MASK(min, max) (SPI_BIT_MASK(max) - SPI_BIT_MASK(min - 1))

/* limits on transfer speed */

u32 min_speed_hz;

u32 max_speed_hz;

/* other constraints relevant to this driver */

u16 flags;

#define SPI_MASTER_HALF_DUPLEX BIT(0) /* can't do full duplex */

#define SPI_MASTER_NO_RX BIT(1) /* can't do buffer read */

#define SPI_MASTER_NO_TX

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值