#include #include #include #include static void GetBusName(const char *path, char *bus_name) { uint8 i = 0; for (; i < strlen(path); i++) { if (path[i] == '_') { bus_name[i] = '\0'; break; } bus_name[i] = path[i]; } } static void GetDrvName(char *bus_name, char *drv_name) { snprintf(drv_name, strlen(bus_name) + 5, "%s_drv", bus_name); } static int DevicefileOpen(struct FileDescriptor *fdp, const char *path) { int ret; BusType bus_id; char bus_name[NAME_NUM_MAX], drv_name[NAME_NUM_MAX]; GetBusName(path, bus_name); GetDrvName(bus_name, drv_name); bus_id = BusFind(bus_name); if (bus_id == NULL) return -ENODEV; bus_id->owner_driver = BusFindDriver(bus_id, drv_name); bus_id->owner_haldev = BusFindDevice(bus_id, path); bus_id->match(bus_id->owner_driver, bus_id->owner_haldev); fdp->data = bus_id; ret = BusDevOpen(bus_id->owner_haldev); if (ret < 0) { fdp->data = NULL; return -EIO; } return 0; } static int DevicefileClose(struct FileDescriptor *fdp) { int ret; BusType bus_id; NULL_PARAM_CHECK(fdp); NULL_PARAM_CHECK(fdp->data); bus_id = (BusType)fdp->data; ret = BusDevClose(bus_id->owner_haldev); if (ret == 0) { fdp->data = NULL; return 0; } return -EIO; } static ssize_t DevicefileRead(struct FileDescriptor *fdp, void *dst, size_t len) { int ret; BusType bus_id; NULL_PARAM_CHECK(fdp); NULL_PARAM_CHECK(fdp->data); bus_id = (BusType)fdp->data; struct BusBlockReadParam param; memset(¶m, 0, sizeof(struct BusBlockReadParam)); param.size = len; param.buffer = dst; param.pos = fdp->pos; ret = BusDevReadData(bus_id->owner_haldev, ¶m); fdp->pos += param.read_length; return param.read_length; } static ssize_t DevicefileWrite(struct FileDescriptor *fdp, const void *src, size_t len) { int ret; BusType bus_id; NULL_PARAM_CHECK(fdp); NULL_PARAM_CHECK(fdp->data); bus_id = (BusType)fdp->data; struct BusBlockWriteParam param; memset(¶m, 0, sizeof(struct BusBlockWriteParam)); param.size = len; param.buffer = src; param.pos = fdp->pos; ret = BusDevWriteData(bus_id->owner_haldev, ¶m); fdp->pos += ret; return ret; } static int DevicefileIoctl(struct FileDescriptor *fdp, int cmd, void *args) { int ret; BusType bus_id; NULL_PARAM_CHECK(fdp); NULL_PARAM_CHECK(fdp->data); bus_id = (BusType)fdp->data; struct BusConfigureInfo param; param.configure_cmd = cmd; param.private_data = args; ret = BusDrvConfigure(bus_id->owner_driver, ¶m); return ret; } static int DevicefileMount(struct MountPoint *mp) { return 0; } static struct Filesystem devicefile_fs = { .open = DevicefileOpen, .close = DevicefileClose, .read = DevicefileRead, .write = DevicefileWrite, .ioctl = DevicefileIoctl, .mount = DevicefileMount, }; int DevicefileInit() { RegisterFilesystem(FSTYPE_IOTDEVICEFILE, &devicefile_fs); return 0; }