1
- use super :: { driver:: Driver , Device , DeviceError , DeviceState , IdTable } ;
1
+ use super :: {
2
+ device_register, device_unregister,
3
+ driver:: { driver_register, driver_unregister, Driver , DriverError } ,
4
+ Device , DeviceError , DeviceState , IdTable ,
5
+ } ;
2
6
use crate :: {
3
- filesystem:: sysfs:: { self , SYS_BUS_INODE } ,
4
- kdebug,
7
+ filesystem:: {
8
+ sysfs:: {
9
+ bus:: { sys_bus_init, sys_bus_register} ,
10
+ SYS_BUS_INODE ,
11
+ } ,
12
+ vfs:: IndexNode ,
13
+ } ,
5
14
libs:: spinlock:: SpinLock ,
6
15
} ;
7
16
use alloc:: { collections:: BTreeMap , sync:: Arc } ;
8
17
use core:: fmt:: Debug ;
9
18
use lazy_static:: lazy_static;
10
19
20
+ lazy_static ! {
21
+ pub static ref BUS_MANAGER : Arc <LockedBusManager > = Arc :: new( LockedBusManager :: new( ) ) ;
22
+ }
23
+
11
24
/// @brief: 总线状态
12
25
#[ derive( Debug , Copy , Clone ) ]
13
26
pub enum BusState {
@@ -58,52 +71,31 @@ pub trait BusDriver: Driver {
58
71
}
59
72
60
73
/// @brief: 总线设备trait,所有总线都应实现该trait
61
- pub trait Bus : Device {
62
- /// @brief: 注册bus,在sysfs中生成相应文件夹
63
- /// @parameter name: 文件夹名
64
- /// @return: 注册成功,返回(),注册失败,返回错误码
65
- fn register_bus ( & self , name : & str ) -> Result < ( ) , DeviceError > {
66
- match self . register_device ( name) {
67
- Ok ( _) => {
68
- let bus = sysfs:: bus:: bus_register ( name) . unwrap ( ) ;
69
- kdebug ! (
70
- "After register_bus: ls /sys/bus/: {:?}" ,
71
- SYS_BUS_INODE ( ) . list( )
72
- ) ;
73
- match sysfs:: bus:: bus_init ( & bus) {
74
- Ok ( _) => {
75
- kdebug ! ( "After register_bus: ls /sys/bus/{}: {:?}" , name, bus. list( ) ) ;
76
- return Ok ( ( ) ) ;
77
- }
78
- Err ( _) => Err ( DeviceError :: RegisterError ) ,
79
- }
80
- }
81
- Err ( err) => Err ( err) ,
82
- }
83
- }
84
- }
74
+ pub trait Bus : Device { }
85
75
86
76
/// @brief: 总线管理结构体
87
77
#[ derive( Debug , Clone ) ]
88
78
pub struct BusManager {
89
79
buses : BTreeMap < IdTable , Arc < dyn Bus > > , // 总线设备表
90
80
bus_drvs : BTreeMap < IdTable , Arc < dyn BusDriver > > , // 总线驱动表
81
+ sys_info : Option < Arc < dyn IndexNode > > , // 总线inode
91
82
}
92
83
93
- /// @brief: 总线管理结构体加锁
94
- pub struct BusManagerLock ( SpinLock < BusManager > ) ;
84
+ /// @brief: bus管理(锁)
85
+ pub struct LockedBusManager ( SpinLock < BusManager > ) ;
95
86
96
87
/// @brief: 总线管理方法集
97
- impl BusManagerLock {
88
+ impl LockedBusManager {
98
89
/// @brief: 创建总线管理实例
99
90
/// @parameter: None
100
91
/// @return: 总线管理实例
101
92
#[ inline]
102
93
#[ allow( dead_code) ]
103
94
pub fn new ( ) -> Self {
104
- BusManagerLock ( SpinLock :: new ( BusManager {
95
+ LockedBusManager ( SpinLock :: new ( BusManager {
105
96
buses : BTreeMap :: new ( ) ,
106
97
bus_drvs : BTreeMap :: new ( ) ,
98
+ sys_info : Some ( SYS_BUS_INODE ( ) ) ,
107
99
} ) )
108
100
}
109
101
@@ -124,7 +116,7 @@ impl BusManagerLock {
124
116
/// @return: None
125
117
#[ inline]
126
118
#[ allow( dead_code) ]
127
- pub fn add_bus_driver ( & self , id_table : IdTable , bus_drv : Arc < dyn BusDriver > ) {
119
+ pub fn add_driver ( & self , id_table : IdTable , bus_drv : Arc < dyn BusDriver > ) {
128
120
let mut bus_manager = self . 0 . lock ( ) ;
129
121
bus_manager. bus_drvs . insert ( id_table, bus_drv) ;
130
122
}
@@ -164,12 +156,57 @@ impl BusManagerLock {
164
156
/// @return: 总线驱动实例
165
157
#[ inline]
166
158
#[ allow( dead_code) ]
167
- pub fn get_bus_driver ( & self , id_table : & IdTable ) -> Option < Arc < dyn BusDriver > > {
159
+ pub fn get_driver ( & self , id_table : & IdTable ) -> Option < Arc < dyn BusDriver > > {
168
160
let bus_manager = self . 0 . lock ( ) ;
169
161
return bus_manager. bus_drvs . get ( id_table) . cloned ( ) ;
170
162
}
163
+
164
+ /// @brief: 获取总线管理器的sys information
165
+ /// @parameter None
166
+ /// @return: sys inode
167
+ #[ inline]
168
+ #[ allow( dead_code) ]
169
+ fn sys_info ( & self ) -> Option < Arc < dyn IndexNode > > {
170
+ return self . 0 . lock ( ) . sys_info . clone ( ) ;
171
+ }
171
172
}
172
173
173
- lazy_static ! {
174
- pub static ref BUS_MANAGER : Arc <BusManagerLock > = Arc :: new( BusManagerLock :: new( ) ) ;
174
+ /// @brief: 总线注册,将总线加入全局总线管理器中,并根据id table在sys/bus和sys/devices下生成文件夹
175
+ /// @parameter bus: Bus设备实体
176
+ /// @return: 成功:() 失败:DeviceError
177
+ pub fn bus_register < T : Bus > ( bus : Arc < T > ) -> Result < ( ) , DeviceError > {
178
+ BUS_MANAGER . add_bus ( bus. get_id_table ( ) , bus. clone ( ) ) ;
179
+ match sys_bus_register ( & bus. get_id_table ( ) . to_name ( ) ) {
180
+ Ok ( inode) => {
181
+ let _ = sys_bus_init ( & inode) ;
182
+ return device_register ( bus) ;
183
+ }
184
+ Err ( _) => Err ( DeviceError :: RegisterError ) ,
185
+ }
186
+ }
187
+
188
+ /// @brief: 总线注销,将总线从全局总线管理器中删除,并在sys/bus和sys/devices下删除文件夹
189
+ /// @parameter bus: Bus设备实体
190
+ /// @return: 成功:() 失败:DeviceError
191
+ #[ allow( dead_code) ]
192
+ pub fn bus_unregister < T : Bus > ( bus : Arc < T > ) -> Result < ( ) , DeviceError > {
193
+ BUS_MANAGER . add_bus ( bus. get_id_table ( ) , bus. clone ( ) ) ;
194
+ return device_unregister ( bus) ;
195
+ }
196
+
197
+ /// @brief: 总线驱动注册,将总线驱动加入全局总线管理器中
198
+ /// @parameter bus: Bus设备驱动实体
199
+ /// @return: 成功:() 失败:DeviceError
200
+ pub fn bus_driver_register < T : BusDriver > ( bus_driver : Arc < T > ) -> Result < ( ) , DriverError > {
201
+ BUS_MANAGER . add_driver ( bus_driver. get_id_table ( ) , bus_driver. clone ( ) ) ;
202
+ return driver_register ( bus_driver) ;
203
+ }
204
+
205
+ /// @brief: 总线驱动注销,将总线从全局总线管理器中删除
206
+ /// @parameter bus: Bus设备驱动实体
207
+ /// @return: 成功:() 失败:DeviceError
208
+ #[ allow( dead_code) ]
209
+ pub fn bus_driver_unregister < T : BusDriver > ( bus_driver : Arc < T > ) -> Result < ( ) , DriverError > {
210
+ BUS_MANAGER . add_driver ( bus_driver. get_id_table ( ) , bus_driver. clone ( ) ) ;
211
+ return driver_unregister ( bus_driver) ;
175
212
}
0 commit comments