dev/driver #4
							
								
								
									
										34
									
								
								include/driver.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								include/driver.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
#ifndef __DRIVER_H__
 | 
			
		||||
#define __DRIVER_H__
 | 
			
		||||
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
 | 
			
		||||
struct driver;
 | 
			
		||||
 | 
			
		||||
typedef int (*fp_open_t)(const struct driver *);
 | 
			
		||||
typedef int (*fp_close_t)(const struct driver *);
 | 
			
		||||
typedef int (*fp_read_t)(const struct driver *, char *, unsigned int);
 | 
			
		||||
typedef int (*fp_write_t)(const struct driver *, const char *, unsigned int);
 | 
			
		||||
typedef int (*fp_ioctl_t)(const struct driver *, unsigned int, unsigned int argc, va_list);
 | 
			
		||||
 | 
			
		||||
struct driver_fp {
 | 
			
		||||
    fp_open_t   open;
 | 
			
		||||
    fp_close_t  close;
 | 
			
		||||
    fp_read_t   read;
 | 
			
		||||
    fp_write_t  write;
 | 
			
		||||
    fp_ioctl_t  ioctl;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct driver {
 | 
			
		||||
    const char *name;
 | 
			
		||||
    const struct driver_fp *fp;
 | 
			
		||||
    const void *dev;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int drv_open(const struct driver *drv);
 | 
			
		||||
int drv_close(const struct driver *drv);
 | 
			
		||||
int drv_read(const struct driver *drv, char *buffer, unsigned int length);
 | 
			
		||||
int drv_write(const struct driver *drv, const char *buffer, unsigned int length);
 | 
			
		||||
int drv_ioctl(const struct driver *drv, unsigned int cmd, unsigned int argc, ...);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										67
									
								
								src/driver.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								src/driver.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include "driver.h"
 | 
			
		||||
 | 
			
		||||
int drv_open(const struct driver *drv)
 | 
			
		||||
{
 | 
			
		||||
    int res = -1;
 | 
			
		||||
    assert(drv != NULL);
 | 
			
		||||
 | 
			
		||||
    if(drv->fp->open) {
 | 
			
		||||
        res = drv->fp->open(drv);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int drv_close(const struct driver *drv)
 | 
			
		||||
{
 | 
			
		||||
    int res = -1;
 | 
			
		||||
    assert(drv != NULL);
 | 
			
		||||
 | 
			
		||||
    if(drv->fp->close) {
 | 
			
		||||
        res = drv->fp->close(drv);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int drv_read(const struct driver *drv, char *buffer, unsigned int length)
 | 
			
		||||
{
 | 
			
		||||
    int res = -1;
 | 
			
		||||
    assert(drv != NULL);
 | 
			
		||||
 | 
			
		||||
    if(drv->fp->read) {
 | 
			
		||||
        res =  drv->fp->read(drv, buffer, length);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int drv_write(const struct driver *drv, const char *buffer, unsigned int length)
 | 
			
		||||
{
 | 
			
		||||
    int res = -1;
 | 
			
		||||
    assert(drv != NULL);
 | 
			
		||||
 | 
			
		||||
    if(drv->fp->write) {
 | 
			
		||||
        res =  drv->fp->write(drv, buffer, length);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int drv_ioctl(const struct driver *drv, unsigned int cmd, unsigned int argc, ...)
 | 
			
		||||
{
 | 
			
		||||
    int res = -1;
 | 
			
		||||
    assert(drv != NULL);
 | 
			
		||||
 | 
			
		||||
    if(drv->fp->ioctl) {
 | 
			
		||||
        va_list args;
 | 
			
		||||
        va_start(args, argc);
 | 
			
		||||
        res = drv->fp->ioctl(drv, cmd, argc, args);
 | 
			
		||||
        va_end(args);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user