linux设备平台驱动之SPI驱动
协议和硬件特点
编写SPI客户端驱动程序需要的主体步骤
- 1.声明驱动程序支持的ID,可以用
spi_device_id
- 如果支持DT,可以使用
of_device_id
- 可以只用DT
- 如果支持DT,可以使用
- 2.调用
MODULE_DEVICE_TABLE(spi, my_id_table)
,向SPI内核注册设备列表- 如果支持DT,则必须调动
MODULE_DEVICE_TABLE(of, your_of_match_table)
,向OF核心注册设备列表
- 如果支持DT,则必须调动
- 3.根据需要编写
probe/remove
probe
:识别设备,配置设备,定义设备专用数据,spi_setup
配置总线(如需要),向相应的内核框架注册remove
:删除在probe
函数中的操作
- 4.声明并且填充
sruct spi_driver
- 将已经创建的ID数组设置
id_table
- 支持TD则使用
of_device_id
数组设置.of_match_table
字段
- 将已经创建的ID数组设置
- 5.使用
module_spi_driver(my_spi_driver)
,向内核注册函数static const struct spi_device_id myspi_spi_id[] = { {"myspi", 0}, {} }; MODULE_DEVICE_TABLE(spi, myspi_spi_id); static const struct of_device_id of_myspi_spi_match[] = { { .compatible = "xxxxxx,myspi", }, {} }; MODULE_DEVICE_TABLE(of, of_myspi_spi_match); static struct spi_driver myspi_spi_driver = { .driver = { .owner = THIS_MODULE, .name = "myspi_spi", .of_match_table = of_match_ptr(of_myspi_spi_match), }, .probe = myspi_probe, .remove = myspi_remove, .id_table = myspi_spi_id, }; module_spi_driver(myspi_spi_driver); MODULE_LICENSE("GPL v2");
读写接口实现
- 核心函数:
spi_write_then_read
int spi_write_then_read(struct spi_device *spi, const u8 *txbuf, unsigned n_tx, u8 *rxbuf, unsigned n_rx);