Heim > Artikel > System-Tutorial > Linux-Gerätetreibermodell
Inhaltsverzeichnis
Eine Linux-Umgebungsvariable, Gerätetreibermodell 1. Der Ursprung des Linux-Gerätetreibermodells
Sehen Sie sich zunächst den üblichen Prozess der Gerätetreiberkompilierung an
【1】Implementieren Sie die Einstiegsfunktion module_init() und die Modul-Entladefunktion module_exit();
【2】Bewerben Sie sich für die Gerätenummer, register_chrdev();-----> (bezogen auf den Kernel)
【3】Verwenden Sie den udev/mdev-Mechanismus, um Gerätedateiknoten class_create(), device_create();------>(bezogen auf den Kernel) zu erstellen
【4】Hardware-Initialisierung: 1.io-Ressourcenzuordnung ioremap(), der Kernel stellt GPIO-Bibliotheksfunktionen bereit 2. Register-Interrupt; ------->(Hardwarebezogen)
【5】Konstruieren Sie die file_operation-Struktur -------- (bezogen auf den Kernel)
[6] Implementieren Sie Methoden zum Betreiben der Hardware xxx_open(), xxx_write()...
Schlussfolgerung: Nicht nur der vierte Teil des gesamten Prozesses bezieht sich auf die Hardware, sondern der Rest sind ähnliche Vorgänge. Um Gerätetreiber bequem zu kompilieren (ohne das Rad neu zu erfinden) und Arbeitskräfte zu sparen, wird das Gerätetreibermodell zur Vereinfachung des Geräts vorgeschlagen Treiberkompilierungsprozess.
2. Gerätetreibermodell-Framework
Sie können das Busobjekt über das virtuelle Dateisystem sysfs anzeigen (am Beispiel von USB)
二Linux-Treiberprogrammierung, BUS-Busmodellprogrammierung
Konzeptkarte
1.Busobjekt
【1】structbus_type: Busobjekt einer Linux-Schulungseinrichtung, beschreibt einen Bus, verwaltet Geräte und TreiberLinux-Treiberprogrammierung, perfekt aufeinander abgestimmt.
<span class="token keyword">struct</span> bus_type <span class="token punctuation">{</span><span class="token comment">//只列举重要成员</span> <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>name<span class="token punctuation">;</span> <span class="token comment">//总线名字</span> <span class="token keyword">int</span> <span class="token punctuation">(</span><span class="token operator">*</span>match<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">struct</span> device <span class="token operator">*</span>dev<span class="token punctuation">,</span> <span class="token keyword">struct</span> device_driver <span class="token operator">*</span>drv<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//匹配方法</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
【2】Bus registrieren und abmelden
<span class="token keyword">int</span> <span class="token function">bus_register</span><span class="token punctuation">(</span><span class="token keyword">struct</span> bus_type <span class="token operator">*</span>bus<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">bus_unregister</span><span class="token punctuation">(</span><span class="token keyword">struct</span> bus_type <span class="token operator">*</span>bus<span class="token punctuation">)</span><span class="token punctuation">;</span>
【3】Baue einen Bus
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"></span></span> <span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"></span></span> <span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"></span></span> <span class="token comment">//实例化一个bus对象</span> <span class="token keyword">struct</span> bus_type mybus <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"mybus"</span><span class="token punctuation">,</span> <span class="token punctuation">.</span>match <span class="token operator">=</span> mybus_match<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token function">EXPORT_SYMBOL</span><span class="token punctuation">(</span>mybus<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//导出总线对象,让device对象和driver对象使用</span> <span class="token keyword">static</span> <span class="token keyword">int</span> __init <span class="token function">mybus_init</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"------%s---------n"</span><span class="token punctuation">,</span>__FUNCTION__<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> ret<span class="token punctuation">;</span> <span class="token comment">//构建一个总线结果:/sys/bus/mybus</span> ret <span class="token operator">=</span> <span class="token function">bus_register</span><span class="token punctuation">(</span><span class="token operator">&</span>mybus<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>ret <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"bus_register errorn"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> ret<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token keyword">void</span> __exit <span class="token function">mybus_exit</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"------%s---------n"</span><span class="token punctuation">,</span>__FUNCTION__<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">bus_unregister</span><span class="token punctuation">(</span><span class="token operator">&</span>mybus<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">module_init</span><span class="token punctuation">(</span>mybus_init<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">module_exit</span><span class="token punctuation">(</span>mybus_exit<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">MODULE_LICENSE</span><span class="token punctuation">(</span><span class="token string">"GPL"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
2.Geräteobjekt
【1】Geräteobjekt: Geräteobjekt, das Geräteinformationen beschreibt, einschließlich Adresse, Interrupt und andere Daten
<span class="token keyword">struct</span> device <span class="token punctuation">{</span><span class="token comment">//只列举重要成员</span> <span class="token keyword">struct</span> kobject kobj<span class="token punctuation">;</span> <span class="token comment">//所有对象的父类</span> <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>init_name<span class="token punctuation">;</span><span class="token comment">//在/sys/bus/mybus/device的名字,用于在总线中匹配</span> <span class="token keyword">struct</span> bus_type <span class="token operator">*</span>bus<span class="token punctuation">;</span> <span class="token comment">//指向该device对象依附的总线对象</span> <span class="token keyword">void</span> <span class="token operator">*</span>platform_data<span class="token punctuation">;</span> <span class="token comment">//自定义的数据,指向任何类型的数据</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
【2】Bus registrieren und abmelden
<span class="token keyword">int</span> <span class="token function">device_register</span><span class="token punctuation">(</span><span class="token keyword">struct</span> device <span class="token operator">*</span>dev<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">device_unregister</span><span class="token punctuation">(</span><span class="token keyword">struct</span> device <span class="token operator">*</span>dev<span class="token punctuation">)</span><span class="token punctuation">;</span>
【3】Geräteobjekt schreiben
定义一个描述设备的信息的结构体,匹配成功以后让driver对象在总线中领到device对象的信息,实现分离。
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"></span></span> <span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"></span></span> <span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"></span></span> <span class="token keyword">extern</span> <span class="token keyword">struct</span> bus_type mybus<span class="token punctuation">;</span> <span class="token keyword">struct</span> mydev_desc<span class="token punctuation">{</span> <span class="token keyword">char</span><span class="token operator">*</span> name<span class="token punctuation">;</span> <span class="token keyword">int</span> irqno<span class="token punctuation">;</span> <span class="token keyword">unsigned</span> <span class="token keyword">long</span> addr<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">struct</span> mydev_desc deviofo <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"hqs"</span><span class="token punctuation">,</span> <span class="token punctuation">.</span>irqno <span class="token operator">=</span> <span class="token number">8877</span><span class="token punctuation">,</span> <span class="token punctuation">.</span>addr <span class="token operator">=</span> <span class="token number">0x12345678</span><span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">mydev_release</span><span class="token punctuation">(</span><span class="token keyword">struct</span> device<span class="token operator">*</span> dev<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"------%s---------n"</span><span class="token punctuation">,</span>__FUNCTION__<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//构建一个device对象</span> <span class="token keyword">struct</span> device mydev <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span>init_name <span class="token operator">=</span> <span class="token string">"fsdev_drv"</span><span class="token punctuation">,</span> <span class="token punctuation">.</span>bus <span class="token operator">=</span> <span class="token operator">&</span>mybus<span class="token punctuation">,</span> <span class="token punctuation">.</span>release <span class="token operator">=</span> mydev_release<span class="token punctuation">,</span> <span class="token punctuation">.</span>platform_data <span class="token operator">=</span> <span class="token operator">&</span>deviofo<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">static</span> <span class="token keyword">int</span> __init <span class="token function">mydev_init</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"------%s---------n"</span><span class="token punctuation">,</span>__FUNCTION__<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> ret<span class="token punctuation">;</span> <span class="token comment">//将device注册到总线中</span> ret <span class="token operator">=</span> <span class="token function">device_register</span><span class="token punctuation">(</span><span class="token operator">&</span>mydev<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>ret <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"device_register errorn"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> ret<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token keyword">void</span> __exit <span class="token function">mydev_exit</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"------%s---------n"</span><span class="token punctuation">,</span>__FUNCTION__<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">device_unregister</span><span class="token punctuation">(</span><span class="token operator">&</span>mydev<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">module_init</span><span class="token punctuation">(</span>mydev_init<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">module_exit</span><span class="token punctuation">(</span>mydev_exit<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">MODULE_LICENSE</span><span class="token punctuation">(</span><span class="token string">"GPL"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
3.driver对象
【1】driver对象:描述设备驱动发的方式
<span class="token keyword">struct</span> device_driver <span class="token punctuation">{</span><span class="token comment">//只列举重要成员</span> <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>name<span class="token punctuation">;</span><span class="token comment">//在/sys/bus/mybus/driver的名字,用于在总线中匹配</span> <span class="token keyword">struct</span> bus_type <span class="token operator">*</span>bus<span class="token punctuation">;</span><span class="token comment">//指向该device对象依附的总线对象</span> <span class="token keyword">int</span> <span class="token punctuation">(</span><span class="token operator">*</span>probe<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token keyword">struct</span> device <span class="token operator">*</span>dev<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//device和driver匹配之后要做的事情</span> <span class="token keyword">int</span> <span class="token punctuation">(</span><span class="token operator">*</span>remove<span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token keyword">struct</span> device <span class="token operator">*</span>dev<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//device和driver分离之后要做的事情</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
【2】注册和注销总线
<span class="token keyword">int</span> <span class="token function">driver_register</span><span class="token punctuation">(</span><span class="token keyword">struct</span> device_driver <span class="token operator">*</span>drv<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">driver_unregister</span><span class="token punctuation">(</span><span class="token keyword">struct</span> device_driver <span class="token operator">*</span>drv<span class="token punctuation">)</span><span class="token punctuation">;</span>
【3】编写driver对象
匹配成功以后可以在总线中领到device对象的数据,具体实现在probe函数里。
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"></span></span> <span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"></span></span> <span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"></span></span> <span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string"></span></span> <span class="token keyword">extern</span> <span class="token keyword">struct</span> bus_type mybus<span class="token punctuation">;</span> <span class="token keyword">struct</span> mydev_desc<span class="token punctuation">{</span> <span class="token keyword">char</span><span class="token operator">*</span> name<span class="token punctuation">;</span> <span class="token keyword">int</span> irqno<span class="token punctuation">;</span> <span class="token keyword">unsigned</span> <span class="token keyword">long</span> addr<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">struct</span> mydev_desc<span class="token operator">*</span> pdesc<span class="token punctuation">;</span> <span class="token keyword">int</span> <span class="token function">mydrv_probe</span><span class="token punctuation">(</span><span class="token keyword">struct</span> device <span class="token operator">*</span>dev<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"------%s---------n"</span><span class="token punctuation">,</span>__FUNCTION__<span class="token punctuation">)</span><span class="token punctuation">;</span> pdesc <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">struct</span> mydev_desc<span class="token operator">*</span><span class="token punctuation">)</span>dev<span class="token operator">-></span>platform_data<span class="token punctuation">;</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"name =%sn"</span><span class="token punctuation">,</span>pdesc<span class="token operator">-></span>name<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"irqno = %dn"</span><span class="token punctuation">,</span>pdesc<span class="token operator">-></span>irqno<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">unsigned</span> <span class="token keyword">long</span> <span class="token operator">*</span> paddr <span class="token operator">=</span> <span class="token function">ioremap</span><span class="token punctuation">(</span>pdesc<span class="token operator">-></span>addr<span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">int</span> mydrv_remove <span class="token punctuation">(</span><span class="token keyword">struct</span> device <span class="token operator">*</span>dev<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"------%s---------n"</span><span class="token punctuation">,</span>__FUNCTION__<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//构建一个driver对象</span> <span class="token keyword">struct</span> device_driver mydrv <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"fsdev_drv"</span><span class="token punctuation">,</span> <span class="token punctuation">.</span>bus <span class="token operator">=</span> <span class="token operator">&</span>mybus<span class="token punctuation">,</span> <span class="token punctuation">.</span>probe <span class="token operator">=</span> mydrv_probe<span class="token punctuation">,</span> <span class="token punctuation">.</span>remove <span class="token operator">=</span> mydrv_remove<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">static</span> <span class="token keyword">int</span> __init <span class="token function">mydrv_init</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"------%s---------n"</span><span class="token punctuation">,</span>__FUNCTION__<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> ret<span class="token punctuation">;</span> <span class="token comment">//将device注册到总线中</span> ret <span class="token operator">=</span> <span class="token function">driver_register</span><span class="token punctuation">(</span><span class="token operator">&</span>mydrv<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span><span class="token punctuation">(</span>ret <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"driver_register errorn"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> ret<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">static</span> <span class="token keyword">void</span> __exit <span class="token function">mydrv_exit</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"------%s---------n"</span><span class="token punctuation">,</span>__FUNCTION__<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">driver_unregister</span><span class="token punctuation">(</span><span class="token operator">&</span>mydrv<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">module_init</span><span class="token punctuation">(</span>mydrv_init<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">module_exit</span><span class="token punctuation">(</span>mydrv_exit<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">MODULE_LICENSE</span><span class="token punctuation">(</span><span class="token string">"GPL"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
4.device对象和driver对象匹配
【1】实现BUS对象中的match方式(按device对象的名子和driver对象中的名子相匹配)
要注意的是不能直接用device对象中的init_name,而要用device对象中继承的structkobjectkobj;上面的成员name不然会报错
<span class="token keyword">int</span> <span class="token function">mybus_match</span><span class="token punctuation">(</span><span class="token keyword">struct</span> device <span class="token operator">*</span>dev<span class="token punctuation">,</span> <span class="token keyword">struct</span> device_driver <span class="token operator">*</span>drv<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//如果匹配成功,match方法一定要返回一个1,失败返回0</span> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span> <span class="token function">strncmp</span><span class="token punctuation">(</span>drv<span class="token operator">-></span>name<span class="token punctuation">,</span>dev<span class="token operator">-></span>kobj<span class="token punctuation">.</span>name<span class="token punctuation">,</span><span class="token function">strlen</span><span class="token punctuation">(</span>drv<span class="token operator">-></span>name<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"match okn"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">printk</span><span class="token punctuation">(</span><span class="token string">"match failedn"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">//实例化一个bus对象</span> <span class="token keyword">struct</span> bus_type mybus <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"mybus"</span><span class="token punctuation">,</span> <span class="token punctuation">.</span>match <span class="token operator">=</span> mybus_match<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
【2】保证device对象和driver对象的名子一样:例如这儿都使用"fsdev_drv"才能保证能匹配成功
<span class="token comment">//构建一个device对象</span> <span class="token keyword">struct</span> device mydev <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span>init_name <span class="token operator">=</span> <span class="token string">"fsdev_drv"</span><span class="token punctuation">,</span> <span class="token punctuation">.</span>bus <span class="token operator">=</span> <span class="token operator">&</span>mybus<span class="token punctuation">,</span> <span class="token punctuation">.</span>release <span class="token operator">=</span> mydev_release<span class="token punctuation">,</span> <span class="token punctuation">.</span>platform_data <span class="token operator">=</span> <span class="token operator">&</span>deviofo<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment">//构建一个driver对象</span> <span class="token keyword">struct</span> device_driver mydrv <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span>name <span class="token operator">=</span> <span class="token string">"fsdev_drv"</span><span class="token punctuation">,</span> <span class="token punctuation">.</span>bus <span class="token operator">=</span> <span class="token operator">&</span>mybus<span class="token punctuation">,</span> <span class="token punctuation">.</span>probe <span class="token operator">=</span> mydrv_probe<span class="token punctuation">,</span> <span class="token punctuation">.</span>remove <span class="token operator">=</span> mydrv_remove<span class="token punctuation">,</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
Das obige ist der detaillierte Inhalt vonLinux-Gerätetreibermodell. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!