广东海外建设监理有限公司官方网站,搜索引擎优化自然排名的优点,有限公司和股份公司区别,有专门做网站的公司创建和注册I/O设备
驱动层负责创建设备实例#xff0c;并注册到I/O设备管理器中#xff0c;可以通过静态申明的方式创建设备实例#xff0c;也可以用下面的接口进行动态创建#xff1a;
rt_device_t rt_device_create(int type, int attach_size);type#xff1a;设备类…创建和注册I/O设备
驱动层负责创建设备实例并注册到I/O设备管理器中可以通过静态申明的方式创建设备实例也可以用下面的接口进行动态创建
rt_device_t rt_device_create(int type, int attach_size);type设备类型可取前面小节列出的设备类型值attach_size用户数据大小
调用该接口时系统会从动态内存堆中分配一个设备控制块大小为struct rt_device和attach_size的和设备的类型由参数type设定。 设备被创建后需要实现它访问硬件的操作方法。
struct rt_device_ops
{/* 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);
};
init初始化设备。设备初始化完成后设备控制块的flag会被置成已激活状态RT_DEVICE_FLAG_ACTIVATED。如果设备控制块中的flag标志已经设置成激活状态那么再运行初始化接口时会立刻返回而不会重新进行初始化。open打开设备。有些设备并不是系统一启动就已经打开开始运行或者设备需要进行数据收发但如果上层应用还未准备好设备也不应默认已经使能并开始接收数据。所以建议在写底层驱动程序时在调用open接口时才使能设备。关闭设备。在打开设备时设备控制块会维护一个打开计数在打开设备时进行1操作在关闭设备时进行-1操作当计数器变为0时才会进行真正的关闭操作。从设备读取数据。参数 pos 是读取数据的偏移量但是有些设备并不一定需要指定偏移量例如串口设备设备驱动应忽略这个参数。而对于块设备来说pos 以及 size 都是以块设备的数据块大小为单位的。例如块设备的数据块大小是 512而参数中 pos 10, size 2那么驱动应该返回设备中第 10 个块 从第 0 个块做为起始共计 2 个块的数据。这个接口返回的类型是 rt_size_t即读到的字节数或块数目。正常情况下应该会返回参数中 size 的数值如果返回零请设置对应的 errno 值。write向设备写入数据。参数 pos 是写入数据的偏移量。与读操作类似对于块设备来说pos 以及 size 都是以块设备的数据块大小为单位的。这个接口返回的类型是 rt_size_t即真实写入数据的字节数或块数目。正常情况下应该会返回参数中 size 的数值如果返回零请设置对应的 errno 值。