嵌入式Linux驱动——SPI子系统解读(三)

时间:2021-01-17 18:57:54

   第一部分,将对SPI子系统整体进行描述,同时给出SPI的相关数据结构,最后描述SPI总线的注册。

   第二部分,该文将对SPI的主控制器(master)驱动进行描述。

   第三部分,即本篇文章,该文将对SPI设备驱动,也称protocol 驱动,进行讲解。

   第四部分,通过SPI设备驱动留给用户层的API,我们将从上到下描述数据是如何通过SPI的protocol 驱动,由bitbang中转,最后由master驱动将数据传输出去。 

本文属于第三部分。

5. SPI设备驱动

    在主控制器驱动中,spi_device已经注册了,在设备驱动中,首先要做的就是注册spi_driver,并提供用户层相应的API。

         5.1 SPI设备驱动的注册

         SPI设备驱动的定义、注册、以及卸载,所在位置/kernel3.0/driver/spi/spidev.c

该函数中,创建了一个字符设备以提供API给用户层,同时创建了一个spidev类,最后注册spi_driver到内核中。

在这里我们看到了SPI设备驱动是如何提供API给用户层的,那就是通过再熟悉不过的字符设备。通过字符设备,给用户层提供了5个API:open,release,write,read和ioctl。本文在后面将介绍open和close,剩余3个将在本系列的第四篇文章中介绍。

         1、spi_register_driver函数, 该函数位于/kernel3.0/drivers/spi/spidev.c。

         2、driver_register函数,该函数位于/kernel3.0/drivers/base/driver.c。

         3、bus_add_driver函数,该函数位于/kernel3.0/drivers/base/bus.c。

         4、driver_attech函数,该函数位于/kernel3.0/drivers/base/dd.c。  vi者相等 在该系列函数中,SPI设备驱动注册后,在driver_match_device函数中进行了SPI设备和SPI设备驱动的匹配,最后在really_probe函数中调用了spidev_probe函数。

5.2 SPI驱动函数分析

        1、spidev_probe函数,该函数位于/kernel3.0/drivers/spi/spidev.c。

此外,将spidev添加到device_list中,这样做就方便查找该spidev。
        2、spidev_remove函数,该函数位于/kernel3.0/drivers/spi/spidev.c。

        3、spidev_open函数,该函数位于 /kernel3.0/drivers/spi/spidev.c。

在这里,以device_list为链表头,遍历所有的spidev_data结构,通过设备节点的设备号和spidev_data中保存的设备号进行匹配,来找到属于该设备节点的spi设备。随后,分配了spi设备驱动层所使用的缓冲区,最后增加打开计数。

        4、spidev_release函数,该函数位于/kernel3.0/drivers/spi/spidev.c。

 至此,对于protocol驱动层的框架进行了简单的分析,在下一篇将对该驱动层很多未分析的函数进行一一讲解。