EDA365电子论坛网

标题: 《Linux总线、设备与驱动》ldd3中demo分析 [打印本页]

作者: pulbieup    时间: 2021-8-2 13:54
标题: 《Linux总线、设备与驱动》ldd3中demo分析
. Y% F2 Y" t+ B" \
一、古老方式(不支持热插拔)
) K0 F( q0 A3 u
/ t% M* ^+ W* G- T1.开机前硬件设备已经插入总线;0 F( N1 B8 W- G8 U3 E; {, Y

% O- a! w5 ~# a/ `+ {# m6 E2.操作系统加载总线驱动,开始扫描设备、并为其申请struct device结构,最后挂入总线驱动devices链表;
% g: k: `; K8 v5 _3 V3 w5 h
# \; S! E3 I* b6 G& c& l: a9 `3.操作系统加载设备驱动,注册struct device_driver结构,然后去总线驱动的devices链表中遍历没有绑定driver的设备(即struct device中struct device_driver为空的设备),如果匹配、就device_bind_driver。
# e5 r/ q9 M% m
+ e- k. o& c' A, j  g
- T; i  \" h$ k二、现在方式(支持热插拔)
6 ]+ r) L! }1 O. ~3 X6 [( H9 D/ q. i' s
1.操作系统加载总线驱动;6 E& E- r: z( f( G% Q

% U. T3 H! F4 A- T2.当有硬件插入时;总线驱动扫描到设备、并为其申请struct device,然后去总线驱动的drivers链表去遍历设备驱动;
: ]0 n+ ~! E" X7 o$ i  }/ J* H
1 {2 C! f+ o6 Z1 ?3.反之,当有设备驱动加载时;总线为其申请struct device_driver,然后去总线驱动的devices链表遍历设备。
0 w- |# w; c) M$ v2 Z! j2 b- S9 y4 M9 P5 p. k  u/ O
总结:由以上可以看出;总线驱动是核心,联系这设备和设备驱动。   m! d. u6 u' C- O5 Q
# M) q( L, }% ~; u
三、深入讲解
, A- \2 M$ i# ]; {1 e
% T% `6 D/ B% x6 @1.数据结构kernel/include/linux/device.h1 V3 z( W' }2 D# G( x# ?- o2 g# G
+ Y  g( t3 h9 v
总线:struct bus_type;' w$ e5 g3 ?- X0 ^# t

" D; i; w% d  @$ A) ~! `设备:struct device;7 P3 p( k" `$ i  p0 L
0 D, O5 Q1 @5 `3 `, j! G. V9 v
驱动:struct device_driver;3 M$ x# \9 n% k
' p% F5 p( w/ |
2.关系
  Q5 @, L! ]! A# n0 c
# O0 s: d+ y' S( h* p总线驱动总会主动去扫描并为其上的设备分配struct device并添加到devices链表中;
9 _) v- c' a( ]4 t, u3 W6 f2 J1 d$ m: u/ V' m
反之,总线驱动是被动的接受设备驱动的struct device_driver并添加到drivers链表中。& C8 g4 b2 @" [

  V3 E' U, b2 e" F. r
2 D) I7 }; y, h6 D9 n四、实例-ldd3里边的例子+ m6 t/ r; g- h8 E; C3 _0 S
; E6 d8 W% i% _- n! g# w( a! B9 e
1.总线驱动的注册与注销
+ e, \9 K2 i/ `3 n- D% B: ?1 l  [( E+ K0 T: m, s3 X2 b9 Q
! E9 s3 U& J& c

) B$ N2 N) }1 x  {2.总线驱动提供的设备驱动接口
+ C; S( d6 l) p0 _  U. r/ w1 `$ r" Y- j( c
% Q% L7 K# c- ?& C# W% I1 @

$ q( b0 {  {1 M+ K$ }' G7 R3.总线在扫描到设备后的注册接口/ Y% }# x4 d4 h# ~- B
8 L( s4 Y2 `& q, P3 x  H

- r+ k& r" v8 Q% D2 k6 ?! x& ]+ k" ]7 h+ D$ U5 p
五、以下贴上ldd3总线、设备、驱动demo
, Z; p9 C4 D  J9 v9 k; p
* O& h: ?6 p! ~$ w. c; ]
7 z; J9 n1 _/ l$ M注意:, S$ I. ^/ t) [. {7 E: [+ L, V

* [8 J* e4 F' n% P% A2 i) F1 q0 j因为是模拟事件发生,因此、驱动程序module_init时有设备的注册过程,实际驱动中不需要这部分、是总线轮询或中断导致设备的注册(注意总线注册的设备不会进入设备文件系统下创建设备节点、它只是加入总线的设备链表并在匹配设备驱动时使用;设备文件系统下设备节点的创建,是在设备驱动的探测probe函数中完成)。) T2 O/ _1 |4 c8 K5 o4 G: A4 @

% O8 C! o& I( H! s* _1.总线+ ?; d6 j  A: ~- e, {  }
* f: y* a4 {' z8 P- q# s
testbus.c! A* n# T: y4 ?6 x$ D6 B

# K8 ?; ~* L& R4 O6 h# K- P1 X* e, C" w' }+ [& n' a" z8 f, z
6 x  ?8 ]/ ?! G7 q& `1 a
lddbus.h
6 p, f4 g0 J* l1 z5 z8 m4 f; M5 ^1 A
                                             * f5 x+ d6 Y1 e5 l. Z5 W5 g4 m4 L

; c2 ?' S% }5 e3 H! A2.设备与设备驱动
/ j, b+ f+ F3 C% p& d3 u( M
& `& }2 M" \8 `& f! Ytestmini.c8 g9 i7 d7 P& c+ y+ z7 R: Q  V+ V

4 \# H. s; _6 T/ E# [* [3 o5 ]                              - B* R/ ^  z% @" X$ N; \6 j

* h# Q+ ]+ s) @& R1 B0 DMakefile
1 f% `+ o* N7 t3 W  O- {% r
3 C% ?. \- f( l  O2 C% C8 ~5 E4 r& y7 A5 d0 N7 X

! u: R9 X1 Q1 t- t& P
作者: Heaven_1    时间: 2021-8-2 20:38
驱动数据结构,提供了探测、移除、挂起、回复和关闭的
作者: regngfpcb    时间: 2021-8-4 09:40
操作系统加载总线驱动,开始扫描设备、并为其申请struct device结构,最后挂入总线驱动devices链表
作者: yin123    时间: 2021-8-4 09:41
数据结构kernel/include/linux/device.h
作者: domenica    时间: 2021-8-4 09:41
支持热插拔




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2