1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2023-04-12     ErikChan      the first version
9  */
10 
11 #ifndef __CORE_DRIVER_H__
12 #define __CORE_DRIVER_H__
13 
14 #include <rtdef.h>
15 
16 struct rt_driver
17 {
18     struct rt_object parent;
19     struct rt_bus *bus;
20     rt_list_t node;
21 
22     rt_uint32_t ref_count;
23 
24 #ifdef RT_USING_DEVICE_OPS
25     const struct rt_device_ops *dev_ops;
26 #else
27     /* common device interface */
28     rt_err_t  (*init)   (rt_device_t dev);
29     rt_err_t  (*open)   (rt_device_t dev, rt_uint16_t oflag);
30     rt_err_t  (*close)  (rt_device_t dev);
31     rt_ssize_t (*read)  (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
32     rt_ssize_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
33     rt_err_t  (*control)(rt_device_t dev, int cmd, void *args);
34 #endif
35 
36     const struct filesystem_ops *fops;
37 
38     int (*probe)(struct rt_device *dev);
39     int (*remove)(struct rt_device *dev);
40     int (*shutdown)(struct rt_device *dev);
41 };
42 
43 rt_err_t rt_driver_register(rt_driver_t drv);
44 rt_err_t rt_driver_unregister(rt_driver_t drv);
45 
46 #define RT_DRIVER_EXPORT(driver, bus_name, mode)    \
47 static int ___##driver##_register(void)             \
48 {                                                   \
49     rt_##bus_name##_driver_register(&driver);       \
50     return 0;                                       \
51 }                                                   \
52 INIT_DEVICE_EXPORT(___##driver##_register);         \
53 
54 #endif /* __DRIVER_H__ */
55