forked from xuos/xiuos
				
			
		
			
				
	
	
		
			149 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C
		
	
	
	
#include <xiuos.h>
 | 
						|
#include <device.h>
 | 
						|
#include <iot-vfs.h>
 | 
						|
#include <iot-vfs_posix.h>
 | 
						|
 | 
						|
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;
 | 
						|
}
 |