目录

一linux环境变量,设备驱动模型1.Linux设备驱动模型的来历

首先回顾设备驱动编撰的通常流程

【1】实现入口函数module_init()和模块卸载函数module_exit();

【2】申请设备号,register_chrdev();—–>(与内核相关)

【3】利用udev/mdev机制创建设备文件结点class_create(),device_create();——>(与内核相关)

【4】硬件初始化:1.io资源映射ioremap(),内核提供gpio库函数;2.注册中断。——->(与硬件相关)

【5】构建file_operation结构体——–>(与内核相关)

【6】实现操作硬件的方式xxx_open(),xxx_write()…

linux驱动编程_编程驱动聚水潭_编程驱动光谱仪

推论:整个流程不仅第四部份与硬件有关,其他都是相像的操作方式,为了便捷的(不重复造轮子)编撰设备驱动,节约人力,所以提出了设备驱动模型,简化了设备驱动编撰的流程。

2.设备驱动模型框架

可以通过sysfs虚拟文件系统查看总线对象(以usb为例)

在这里插入图片描述

linux驱动编程,BUS总线模型编程

概念图

1.总线对象

【1】structbus_type:总线对象linux培训机构,描述一个总线,管理device和driverlinux驱动编程,完匹配。

 <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】注册和注销总线

<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】构建一个总线

 <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.device对象

【1】device对象:设备对象,描述设备信息,包括地址,中断等其他数据

<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】注册和注销总线

<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】编写设备对象

linux驱动编程_编程驱动聚水潭_编程驱动光谱仪

定义一个描述设备的信息的结构体,匹配成功以后让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>

登录后复制

以上就是Linux设备驱动模型的详细内容,更多请关注小闻网其它相关文章!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。