Linux SPI驱动学习——device、driver注册匹配
博客说明
撰写日期 | 2019.10.22 |
---|---|
完稿日期 | 2019.10.23 |
最近维护 | 暂无 |
本文作者 | multimicro |
联系方式 | multimicro@qq.com |
资料链接 | 本文无附件资料 |
GitHub | https://github.com/wifialan/drivers/ |
原文链接 | https://blog.csdn.net/multimicro/article/details/102685871 |
开发环境
环境说明 | 详细信息 | 备注信息 |
---|---|---|
操作系统 | Ubunut 18.04 | |
开发板 | JZ2440-V3 | |
Linux内核 | linux-3.4.2 |
1. Linux SPI概述
鄙人通过查看宋宝华《Linux设备驱动开发详解–基于最新的Linux 4.0内核》 第12章:Linux设备驱动的软件架构思想,初步了解了总线
、设备
和驱动
这三个名词:
总线:
比如4线SPI的总线是四条线,这四条线就构成了SPI总线,但不知道这样解释合不合适,保留疑问。
设备:
对应的是spi_device
——外设设备的抽象
驱动:
对应的是spi_drivce
——外设端驱动
以上解释暂保留疑问。
先知道有这三个名词吧。
下面的内容只是对SPI驱动的初步实现进行感性的认识,先实现,后谈理论分析。
1.1 SPI驱动框架
如下图所示
设备驱动
(外设端驱动)抽象出来一个spi_driver,用外设模块所规定的传输协议收发数据,具体实现就是调用主机端的spi收发函数进行排列组合实现外设协议所规定的波形。
控制器驱动
(主机端驱动)抽象出来一个spi_master,用于产生总线上的波形。比如调用spi_transfer函数发送一个16位的数据,那么在总线上就会生成一个16位的SPI波形,主机端只产生波形不干别的。
2. SPI 注册匹配
2.1 spi_drive注册
再看韦东山SPI视频时,他说参考内核中的其他代码进行编写,如sound/soc/codecs/ad1936.c
文件中第374-388c行:
static struct spi_driver ad1836_spi_driver = {
.driver = {
.name = "ad1836",
.owner = THIS_MODULE,
},
.probe = ad1836_spi_probe,
.remove = __devexit_p(ad1836_spi_remove),
.id_table = ad1836_ids,
};
static int __init ad1836_init(void)
{
return spi_register_driver(&ad1836_spi_driver);
}
module_init(ad1836_init);
Tips:在source inside中采用快捷键ctrl + ?
调出Lookup References
框框,然后输如spi_driver
,在生成的搜索结果里面第一项展开即可直接定位至文件中的spi_driver
所在行。
注册spi_driver的步骤为:
首先应在arch/arm/mach-s3c24xx/mach-smdk2440.c
第341的大概的位置增加:
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_ohci,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_spi0, //Add
&s3c_device_spi1, //Add
// &smdk2440_audio,
&samsung_asoc_dma,
&smdk2440_device_eth,
};
Step 1:
我仿照编写的spi_driver
程序为如下:
路径:drivers/char/w25q16_spi.c
static struct spi_driver w25q16_spi_driver =
{
.driver =
{
.name = "w25q16", /* spi_driver注册成功后,会在/sys/bus/spi/drivers/目录下面显示出该name字段的名字,见下图 */
.owner = THIS_MODULE,
},
.probe = w25q16_bus_spi_probe,
.remove = __devexit_p(w25q16_bus_spi_remove),
};
module_init(w25q16_driver_init);
该程序所在文件的位置为:drives/char/w25q16_spi.c
我把这个flash定为字符驱动进行编写了,所以该文件在char
这个文件夹里面。
按照驱动在内核模块中的加载方式,还需要同步修改Kconfig
和Makefile
Step 2:
在Kconfig
中增添信息
Step 3:
在Makefile
中增添信息