1、设备驱动框架层定义的PIN设备如下:
struct rt_device_pin
{
struct rt_device parent;
const struct rt_pin_ops *ops;
};
2、设备驱动框架层定义的PIN设备操作方法如下:
struct rt_pin_ops
{
void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_uint8_t mode);
void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_uint8_t value);
rt_int8_t (*pin_read)(struct rt_device *device, rt_base_t pin);
rt_err_t (*pin_attach_irq)(struct rt_device *device, rt_base_t pin,
rt_uint8_t mode, void (*hdr)(void *args), void *args);
rt_err_t (*pin_detach_irq)(struct rt_device *device, rt_base_t pin);
rt_err_t (*pin_irq_enable)(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled);
rt_base_t (*pin_get)(const char *name);
};
2.1 pin_get接口
厂商对引脚的定义一般是PA0,PE15,P10,P415等。为了兼容各个硬件平台,设计pin_get函数,该函数的作用是给每个引脚用数字编号,从0开始。比如针对STM32,pin_get函数使PA0-PA15的值为0-15,PB0-PB15的值是16-31,这样各个引脚经过pin_get调用后都返回1个唯一的编号。类似编码的过程。
2.2 pin_mode
设置引脚接口。有个参数是pin,那么这个函数需要解码,假设pin=0,则需要解析出是对PA0进行操作。
3、注册PIN设备
对全局变量_hw_pin赋值,之后对所有PIN设备的操作都是通过调用_hw_pin。
int rt_device_pin_register(const char *name, const struct rt_pin_ops *ops, void *user_data)
{
_hw_pin.parent.type = RT_Device_Class_Miscellaneous;
_hw_pin.parent.rx_indicate = RT_NULL;
_hw_pin.parent.tx_complete = RT_NULL;
#ifdef RT_USING_DEVICE_OPS
_hw_pin.parent.ops = &pin_ops;
#else
_hw_pin.parent.init = RT_NULL;
_hw_pin.parent.open = RT_NULL;
_hw_pin.parent.close = RT_NULL;
_hw_pin.parent.read = _pin_read;
_hw_pin.parent.write = _pin_write;
_hw_pin.parent.control = _pin_control;
#endif
_hw_pin.ops = ops;
_hw_pin.parent.user_data = user_data;
/* register a character device */
rt_device_register(&_hw_pin.parent, name, RT_DEVICE_FLAG_RDWR);
return 0;
}
4、PIN设备驱动框架接口关系