没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
linux 设备模型____I2C 具体实现
结合一个实际板子的 驱动,进一步加深对 设备模型的理解。此外, 子系统
本身也是 驱动部分的一个重点,本文也会描述。
这个板子是以一个 芯片为 的一个路由器, 已集成了硬件的 控制器。
对于 设备驱动部分,它的步骤基本如下:
、 将包括了 的 控制器参数内容的设备注册在 总线下; 控制器
参数包括物理寄存器地址及范围、中断号、频率、超时值等一些参数;
、 将相应的 的 控制器的驱动注册在 总线下;驱动的重要内容就
是其 函数,创建该驱动后会触发这个 函数,它将用第 步注册的设备
的 控制器参数进行物理地址内核虚拟地址映射、配置寄存器初始化、挂中
断等初始化操作,最后会在 总线下创建 适配器设备;
、 之后内核将创建字符设备,并创建一个叫 的类,然后在 总线下创建一
个驱动,该驱动会触发其 ! 成员函数,这个函数会使用第 步创建的
适配器的参数,在刚创建的 "" 下创建一个设备 ;
#、 至此, 驱动的创建部分全部完成,用户态可以通过访问$$ 的字符设备,
通过该字符设备的 %" 提供的 、"、、&!、! 方法,通过 的
驱动机制,再控制 适配器来间接地控制 硬件设备。
下面是具体步骤描述:
、 '"!()& *
这一步是 适配器的设备的注册,下面是全局变量 )& 的内容:
因 为要注册到
++
总 线下,所以
)&
++
是
++
型变量,它有
"+ +
++++
来承载+ +
++
+ +
++++
适配器的一些硬件参数,而有些硬件参数无法以+ +
++
"!!+"+ +
结构描述时,使用
"!!+
++
结构的
!
++
成员承载,这里也用到了这种
方法;
"!,+"!!+ +)& +-+.
+++$$宏 /01#222 345 67/89 为“1# :
+++++++;+++++++++++-+/01#222 345 67/8<
+++++++;+++++++++++++-+<
+++++++; ""++-+7557= >?8)& ""<
+++++++;"+++++++-+)& ""<
+++++++;++++++++++++-+.
+++++++++++++++; !+-+()& !<
+++++++@<
@*
可以用 "!!+" 结构描述的 适配器参数,包括寄存器地址及范围和中断;
"!,+"!!+"+)& ""AB+-
.
.
;+++-+C+"C<
;"!!++-+6385 58D> E7>8+F+/0 3G> >4708 58D> HII>83<
;++++-+6385 58D> E7>8+F+/0 3G> >4708 58D> HII>83+F++<
;J'"++-+H58>H58 /8/<
@<
.
;+++-+C+KC<
;"!!++-+3G> 5L 6/<
;++++-+3G> 5L 6/<
;J'"++-+H58>H58 5L<
@<
@*
无法用 "!!+" 结构描述的 适配器参数,需要借用 "!!+ 结构体的
! 成员;
"!,+"!!+1# !+)& !+-
.
+++++++;%K +++++++++-+M<+$N+"""+11+/OP+34Q+N$
+++++++;%K +++++++++-+<
+++++++;,!++++++++-+<+$N+R%!+,!+%++"+N$
@*
通过函数 '"! 把这个名字叫 1# ; 的设备因为 )&
的 成员值为 ,所以名字为 1# ;,详见 '"! 函数调
用的 函数的实现,只有在 成员值为 时才不改原名字注册
到 总 线 , 此 时 , 在 "S"%" 下 可 以 看 到 $"S"$"$$"$
1# ;$目录。
该设备在注册设备期间是找不到驱动的,即 " 将返回,这是因为
这时候还没有任何匹配的驱动注册在 总线下, 驱动作为 将在
之后才加载,而 )& 设备的加载是在内核初始化时完成。
、 '"!(1# *
这一步是 适配器的驱动的注册,但是现在必须说明的是,这个驱动并不是以后
内核态真正使用的
++
设备驱动,它只是执行硬件的初始化,然后利用
++
设备
模型的机制,把第
++
步的
++
适配器硬件参数信息转移到将要在第
、 #
++
步的内容
中;
'"!(1# *
通过把 适配器的驱动注册到 总线之后,会触发该驱动的 函数,
该驱动内容如下:
"!,+"!!+ +1# +-+.
; -+1# <
; -+ ! 1# <
; -+.
;& -+3O> /HR48<
$$宏 /01#222 345 67/89 为“1# :
; -+/01#222 345 67/8<
@<
@*
宏 /01#222 345 67/8 也是 9 为“1# :,即和第 步的设备名字
一样,这就会触发它的 函数执行,这个
++
函数不仅会从第
++
步注册的设
备获取到全部硬件参数,还最终会在
++
总线下建立一个适配器设备,这个是最关
键的地方;它的 函数是:
1# "!!+ +N
.
"!!+1# ! N !*
//由第 1 步注册的设备,获取到其 struct device 结构的 plaorm_data 参数
"!!+1# ! N!+-+; !*
! *
%++T-++UU+T!
!+86HR80*
!+-+)P"P%"!!+1# !<+DI Q85684*
%+T !
!+86H/8/*
//物理内容<--->内核虚拟地址
%+1# '"<+ !+.
+-+86HR80*
'!+! )%*
@
// 设 置 即 将 要 在 I2C 总 线 建 立 的 适 配 器 设 备 的 name 成 员 值 为 “ mv64xxx_i2c
adapter”,注意:这个名字不是要创建的设备的 kobject 的名字!这个 name 成员只是
它的一个属性
"!S !!;<+/01#222 345 67/8+C+!C<
"P% !!;*
! &!K ( !&!K*
" ) !( !)*
//配置获取到的 struct device 结构的 plaorm_data 参数
!%K +-+!%K *
!%K +-+!%K *
//由第 1 步注册的设备,获取到中断号
!K+-+ '! K<+*
%+ !K+++.
+-+862H*
'!+! '"*
@
//设置 I2C 适配器的设备的父亲为第 1 步创建的设备即/sys/plaorm/mv64xxx_i2c.0
!!;;!+-+(*
//设置 I2C 适配器的算法成员,这个是 linux 的 I2C 驱动的核心
!!;'+-+(1# '*
!!;&+-+3O> /HR48*
!!;""+-+ 47>> OG/H6+U+ 47>> >R*
!!;,!+-+"" ! VW"!,!*
//设置 I2C 适配器的次设备号成员,为 0
剩余10页未读,继续阅读
资源评论
- kate2013112013-08-02参考了,虽然不是很明白。
- u0102899312013-08-12最近看到IIC驱动的driver的probe了,看了你的文档,感觉没有大多的收获,我是近乎于代码走读的,现在卡在sysfs上,很痛苦啊!
- LyCmon2013-07-31之前也被I2C的驱动架构整的七荤八素的……
FSak47
- 粉丝: 236
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- NetOps-py通过sftp替换网络设备启动文件
- STM32单片机FPGA毕设电路原理论文报告任务驱动教学法在单片机课程教学中的应用
- STM32单片机FPGA毕设电路原理论文报告任务驱动法在单片机教学中的应用
- STM32单片机FPGA毕设电路原理论文报告人造金刚石压机智能化压力测控系统设计
- 以某列为依据匹配多项(Excel版)
- STM32单片机FPGA毕设电路原理论文报告人体短臂离心机实验台的显示控制系统
- STM32单片机FPGA毕设电路原理论文报告人工气候室监控系统的环境控制器研究
- STM32单片机FPGA毕设电路原理论文报告染整自动线张力控制系统的设计
- 数据挖掘与机器学习-实验
- 基于Linux系统Nginx的动态网站的LNMP环境源码包
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功