目录
- 1.pwm设备基类
- 2.pwm设备基类的子类
- 3.初始化/构造流程
- 3.1设备驱动层
- 3.2 设备驱动框架层
- 3.3 设备io管理层
- 4.总结
- 5.使用
1.pwm设备基类
此层处于设备驱动框架层。也是抽象类。
在/ components / drivers / include / drivers 下的rt_drv_pwm.h定义了如下pwm设备基类
struct rt_device_pwm
{
struct rt_device parent;
const struct rt_pwm_ops *ops;
};
pwm设备基类的方法定义如下
struct rt_pwm_ops
{
rt_err_t (*control)(struct rt_device_pwm *device, int cmd, void *arg);
};
control配置进行pwm配置,抽象出来成为pwm设备基类的方法。
2.pwm设备基类的子类
各个看pwm设备基类的子类已经是在bsp的驱动层来实现了,例如
/ bsp / stm32 / libraries / HAL_Drivers / drivers 下的drv_pwm.c定义的stm32 pwm类,这些都是可以实例化的终类。其他芯片厂家如此这般一样。
3.初始化/构造流程
以stm32为例,从设备驱动层、设备驱动框架层到设备io管理层从下到上的构造/初始化流程如下
3.1设备驱动层
此层是bsp层,可以实例化的终类地。
c文件:
/ bsp / stm32 / libraries / HAL_Drivers / drivers 下的drv_pwm.c。
定义了stm32的dac类
struct stm32_pwm
{
struct rt_device_pwm pwm_device; TIM_HandleTypeDef tim_handle;
rt_uint8_t channel;
char *name;
};
实例化了stm32的pwm设备:
static struct stm32_pwm stm32_pwm_obj[] ;
重写了pwm设备基类的方法:
static struct rt_pwm_ops drv_ops =
{
drv_pwm_control
};
stm32_pwm_init中开启stm32的pwm设备的初始化:
调用/ components / drivers / misc /rt_drv_pwm.c的rt_device_pwm_register函数来初始化pwm设备基类对象: rt_device_pwm_register(&stm32_pwm_obj[i].pwm_device, stm32_pwm_obj[i].name, &drv_ops, &stm32_pwm_obj[i].tim_handle) == RT_EOK)
注意把重写的pwm设备基类方法传递进去了。
3.2 设备驱动框架层
rt_device_pwm_register是pwm设备驱动框架层的入口,开启pwm设备基类的构造/初始化流程。
其主要是重写设备基类对象的方法,如下
/ components / drivers / misc 下的rt_drv_pwm.c实现了设备驱动框架层接口。
重写pwm设备基类的父类设备基类的方法如下
#ifdef RT_USING_DEVICE_OPS
device->parent.ops = &pwm_device_ops;
#else
device->parent.init = RT_NULL;
device->parent.open = RT_NULL;
device->parent.close = RT_NULL;
device->parent.read = _pwm_read;
device->parent.write = _pwm_write;
device->parent.control = _pwm_control;
#endif /* RT_USING_DEVICE_OPS */
同时,重写pwm设备基类的方法。
device->ops = ops;
并最终调用设备基类的初始化/构造函数rt_device_register。
3.3 设备io管理层
rt_device_register是io管理层的入口。从框架章节可以知道所有设备类都继承自设备基类rt_device,自然都要实现设备基类rt_device的约束方法,上面已经重写。
在/ components / drivers / core 下的device.c中实现了rt_device_register,由它将pin设备放到容器里管理。
4.总结
整个设备对象的构造/初始化流程其实是对具体设备对象也就是结构体进行初始化赋值,按照先调用子类构造/初始化函数,再调用父类的构造/初始化函数方式——其实也是子类构造/初始化函数调用父类构造/初始化函数的流程,来完成设备对象的初始化/构造。最终放到对象容器里来管理。