diff --git a/documentation/linux_driver/platform_driver.rst b/documentation/linux_driver/platform_driver.rst index a5795d8..feacbc4 100644 --- a/documentation/linux_driver/platform_driver.rst +++ b/documentation/linux_driver/platform_driver.rst @@ -8,6 +8,7 @@ 在之前的字符设备程序中驱动程序,我们只要调用open()函数打开了相应的设备文件,就可以使用read()/write()函数, 通过file_operations这个文件操作接口来进行硬件的控制。这种驱动开发方式简单直观,但是从软件设计的角度看,却是一种十分糟糕的方式。 + 它有一个严重的问题,就是设备信息和驱动代码杂糅在一起,在我们驱动程序中各种硬件寄存器地址随处可见。 本质上,这种驱动开发方式与单片机的驱动开发并没有太大的区别,一旦硬件信息发生变化甚至设备已经不在了,就必须要修改驱动源码。 我们之前做的事情只不过是简单地给它套了一个文件操作接口的外壳。 @@ -17,7 +18,7 @@ Linux作为一个发展成熟、功能齐全、结构复杂的操作系统,它 给linux内核的迭代开发带来巨大的维护成本。 为了解决这种驱动代码和设备信息耦合的问题,linux提出了设备驱动模型。前面章节我们已经对设备驱动模型进行了深入剖析,在设备驱动模型中, -引入总线的概念可以对驱动代码和设备信息进行分离。但是驱动中总线的概念,与我们SOC中物理总线的概念并不严格相等。 +引入总线的概念可以对驱动代码和设备信息进行分离。但是驱动中总线的概念是软件层面的一种抽象,与我们SOC中物理总线的概念并不严格相等: - **物理总线**:芯片与各个功能外设之间传送信息的公共通信干线,其中又包括数据总线、地址总线和控制总线,以此来传输各种通信时序。 @@ -131,6 +132,7 @@ dev、driver分别作为platform_device、platform_driver的成员变量, 设备树是一种描述硬件的数据结构,它用一个非C语言的脚本来描述这些硬件设备的信息。驱动和设备之间的匹配时通过比较compatible的值。 acpi主要是用于电源管理,基本上用不到,这里就并不进行讲解了。关于设备树的匹配机制,会在设备树章节进行详细分析。 + id_table匹配方式 >>>>>>>>>>>>>>>> @@ -156,12 +158,12 @@ id_table匹配方式 return NULL; } + 大家可以看到这里的代码实现并不复杂,只是通过字符串进行配对。每当有新的驱动或者设备添加到总线时,总线便会调用match函数对新的设备或者驱动进行配对。 platform_match_id函数中第一个参数为驱动提供的id_table,第二个参数则是待匹配的平台设备。当待匹配的平台设备的name字段的值等于驱动提供的id_table中的值时, 会将当前匹配的项赋值给platform_device中的id_entry,返回一个非空指针。若没有成功匹配,则返回空指针。 - .. image:: ./media/id_table_match.jpg :align: center :alt: 驱动和设备匹配过程 @@ -217,7 +219,6 @@ platform_device结构体 对于硬件信息,使用结构体struct resource来保存设备所提供的资源,比如设备使用的中断编号,寄存器物理地址等,结构体原型如下: - .. code-block:: c :caption: resource结构体(内核源码/include/linux/ioport.h) :linenos: @@ -528,7 +529,7 @@ platform_get_resource()函数通常会在驱动的probe函数中执行,用于 实现probe函数,当平台总线成功匹配驱动和设备时,则会调用驱动的probe函数,在该函数中使用上述的函数接口来获取资源, 以初始化设备,最后填充结构体platform_driver,调用platform_driver_register进行注册。 -硬件设备说明 +平台设备实验说明 ~~~~~~~~~~~~~ 硬件介绍 @@ -996,7 +997,9 @@ makefile修改说明 :linenos: KERNEL_DIR = /home/embedfire/linux4.19 - + ARCH=arm + CROSS_COMPILE=arm-linux-gnueabihf- + export ARCH CROSS_COMPILE obj-m := led_pdev.o led_pdrv.o all:modules

AltStyle によって変換されたページ (->オリジナル) /