PIN 驱动分析
最后更新于
最后更新于
// rtdef.h
struct rt_object
{
char name [RT_NAME_MAX]; /* 内核对象名 */
rt_uint8_t type; /* 内核对象类型 */
rt_uint8_t flag; /**< flag of kernel object */
};typedef struct rt_device *rt_device_t;
struct rt_device
{
struct rt_object parent; /**< inherit from rt_object */
enum rt_device_class_type type; /**< 设备的类型 */
rt_uint16_t flag; /**< device flag */
rt_uint16_t open_flag; /**< device open flag */
rt_uint8_t ref_count; /**< 设备打开的次数 */
rt_uint8_t device_id; /**< 0 - 255 */
/* device call back */
rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);
rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);
/* common device interface */
rt_err_t (*init) (rt_device_t dev);
rt_err_t (*open) (rt_device_t dev, rt_uint16_t oflag);
rt_err_t (*close) (rt_device_t dev);
rt_size_t (*read) (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);
rt_size_t (*write) (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);
rt_err_t (*control)(rt_device_t dev, int cmd, void *args);
void *user_data; /**< device private data */
};// pin.h
struct rt_device_pin
{
struct rt_device parent;
const struct rt_pin_ops *ops;
};
struct rt_pin_ops
{
void (*pin_mode)(struct rt_device *device, rt_base_t pin, rt_base_t mode);
void (*pin_write)(struct rt_device *device, rt_base_t pin, rt_base_t value);
int (*pin_read)(struct rt_device *device, rt_base_t pin);
rt_base_t (*pin_get)(const char *name);
};int main(void)
{
struct rt_device_pin_status pin_control;
pin_control.pin = GET_PIN(F, 14);
struct rt_device_pin_mode pin_mode;
pin_mode.pin = GET_PIN(F, 14);
pin_mode.mode = PIN_MODE_OUTPUT;
rt_device_t pin_dev = rt_device_find("pin");
rt_device_control(pin_dev,RT_NULL, &pin_mode);
rt_device_open(pin_dev, RT_DEVICE_FLAG_RDWR);
while(1)
{
pin_control.status = PIN_LOW;
rt_device_write(pin_dev, 0, &pin_control, sizeof(struct rt_device_pin_status));
rt_thread_mdelay(200);
pin_control.status = PIN_HIGH;
rt_device_write(pin_dev, 0, &pin_control, sizeof(struct rt_device_pin_status));
rt_thread_mdelay(800);
}
}void rt_pin_mode(rt_base_t pin, rt_base_t mode)
{
_hw_pin.ops->pin_mode(&_hw_pin.parent, pin, mode);
}
void rt_pin_write(rt_base_t pin, rt_base_t value)
{
_hw_pin.ops->pin_write(&_hw_pin.parent, pin, value);
}
int rt_pin_read(rt_base_t pin)
{
return _hw_pin.ops->pin_read(&_hw_pin.parent, pin);
}