X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/7515e526342f6ee07cbe92f5a458f1c2c4a1fcaf..bf870a1dde437a48ae40d092a14e164c861ea102:/lunaix-os/kernel/device.c diff --git a/lunaix-os/kernel/device.c b/lunaix-os/kernel/device.c index 9cb2fa1..017f3b3 100644 --- a/lunaix-os/kernel/device.c +++ b/lunaix-os/kernel/device.c @@ -8,27 +8,28 @@ struct llist_header dev_list; static struct twifs_node* dev_root; int -__dev_read(struct v_file* file, void* buffer, size_t len); +__dev_read(struct v_inode* inode, void* buffer, size_t len, size_t fpos); int -__dev_write(struct v_file* file, void* buffer, size_t len); +__dev_write(struct v_inode* inode, void* buffer, size_t len, size_t fpos); void device_init() { - dev_root = twifs_toplevel_node("dev", 3); + dev_root = twifs_toplevel_node("dev", 3, 0); llist_init_head(&dev_list); } struct device* -device_add(struct device* parent, void* underlay, char* name_fmt, ...) +__device_add(struct device* parent, + void* underlay, + char* name_fmt, + uint32_t type, + va_list args) { struct device* dev = vzalloc(sizeof(struct device)); - va_list args; - va_start(args, name_fmt); - size_t strlen = __sprintf_internal(dev->name_val, name_fmt, DEVICE_NAME_SIZE, args); @@ -40,39 +41,64 @@ device_add(struct device* parent, void* underlay, char* name_fmt, ...) llist_append(&dev_list, &dev->dev_list); struct twifs_node* dev_node = - twifs_file_node(dev_root, dev->name_val, strlen); + twifs_file_node(dev_root, dev->name_val, strlen, type); dev_node->data = dev; - dev_node->fops.read = __dev_read; - dev_node->fops.write = __dev_write; + dev_node->ops.read = __dev_read; + dev_node->ops.write = __dev_write; dev->fs_node = dev_node; + return dev; +} + +struct device* +device_addseq(struct device* parent, void* underlay, char* name_fmt, ...) +{ + va_list args; + va_start(args, name_fmt); + + struct device* dev = + __device_add(parent, underlay, name_fmt, VFS_IFSEQDEV, args); + + va_end(args); + return dev; +} + +struct device* +device_addvol(struct device* parent, void* underlay, char* name_fmt, ...) +{ + va_list args; + va_start(args, name_fmt); + + struct device* dev = + __device_add(parent, underlay, name_fmt, VFS_IFVOLDEV, args); + va_end(args); return dev; } int -__dev_read(struct v_file* file, void* buffer, size_t len) +__dev_read(struct v_inode* inode, void* buffer, size_t len, size_t fpos) { - struct twifs_node* dev_node = (struct twifs_node*)file->inode->data; + struct twifs_node* dev_node = (struct twifs_node*)inode->data; struct device* dev = (struct device*)dev_node->data; if (!dev->read) { return ENOTSUP; } - return dev->read(dev, buffer, file->f_pos, len); + return dev->read(dev, buffer, fpos, len); } int -__dev_write(struct v_file* file, void* buffer, size_t len) +__dev_write(struct v_inode* inode, void* buffer, size_t len, size_t fpos) { - struct twifs_node* dev_node = (struct twifs_node*)file->inode->data; + struct twifs_node* dev_node = (struct twifs_node*)inode->data; struct device* dev = (struct device*)dev_node->data; if (!dev->write) { return ENOTSUP; } - return dev->write(dev, buffer, file->f_pos, len); + return dev->write(dev, buffer, fpos, len); } void